diff --git a/.cargo/config.toml b/.cargo/config.toml index 19528f23..b554bdb3 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,5 +1,5 @@ [target.aarch64-apple-ios] -rustflags = ["-C", "link-arg=-target", "-C", "link-arg=arm64-apple-ios13.0"] +rustflags = ["-C", "link-arg=-mios-version-min=13.0", "-C", "link-arg=--target=arm64-apple-ios13.0.0"] [target.x86_64-apple-ios] rustflags = ["-C", "link-arg=-target", "-C", "link-arg=x86_64-apple-ios13.0"] diff --git a/.gitignore b/.gitignore index d1deeeb1..2d003808 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ /.idea/ *.iml /DashSharedCore +*.DS_Store \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 628ec507..74996b0c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,11 +23,36 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cipher", "cpufeatures", ] +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.15", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom 0.2.15", + "once_cell", + "serde", + "version_check", + "zerocopy 0.7.35", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -37,6 +62,27 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "ansi_term" version = "0.12.1" @@ -46,6 +92,77 @@ dependencies = [ "winapi", ] +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +dependencies = [ + "anstyle", + "once_cell", + "windows-sys 0.59.0", +] + +[[package]] +name = "anyhow" +version = "1.0.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" + +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + [[package]] name = "arrayref" version = "0.3.9" @@ -54,33 +171,112 @@ checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" -version = "0.5.2" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] -name = "arrayvec" -version = "0.7.6" +name = "async-stream" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] [[package]] -name = "atty" -version = "0.2.14" +name = "async-stream-impl" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core", + "bytes", + "futures-util", + "http 1.3.1", + "http-body", + "http-body-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower 0.5.2", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 1.3.1", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", +] + +[[package]] +name = "backon" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "970d91570c01a8a5959b36ad7dd1c30642df24b6b3068710066f6809f7033bb7" +dependencies = [ + "fastrand", + "tokio", +] + [[package]] name = "backtrace" version = "0.3.74" @@ -88,7 +284,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cfg-if 1.0.0", + "cfg-if", "libc", "miniz_oxide", "object", @@ -96,17 +292,44 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + [[package]] name = "base64" -version = "0.21.7" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64-compat" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "5a8d4d2746f89841e49230dd26917df1876050f95abafafbe34f47cb534b88d7" +dependencies = [ + "byteorder", +] [[package]] name = "base64ct" -version = "1.6.0" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" + +[[package]] +name = "bech32" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" [[package]] name = "bincode" @@ -124,7 +347,7 @@ version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e30759b3b99a1b802a7a3aa21c85c3ded5c28e1c83170d82d70f08bbf7f3e4c" dependencies = [ - "virtue", + "virtue 0.0.13", ] [[package]] @@ -146,40 +369,80 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.87", + "syn 2.0.100", "which", ] +[[package]] +name = "bip37-bloom-filter" +version = "0.1.0" +source = "git+https://github.com/dashpay/rs-bip37-bloom-filter?branch=develop#352fa2312fd6e0f47bf4cba3a67bfd78c3ba763b" +dependencies = [ + "bitvec", + "murmur3", + "thiserror 1.0.69", +] + [[package]] name = "bip38" version = "1.1.0" source = "git+https://github.com/pankcuf/bip38?rev=87abd21#87abd21718a114b1039470c6956c377d46323055" dependencies = [ "aes", - "bs58", + "bs58 0.4.0", "rand", "ripemd", "ripemd160", "scrypt", - "secp256k1", + "secp256k1 0.26.0", "sha2", "unicode-normalization", ] [[package]] -name = "bitcoin_hashes" -version = "0.11.0" +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec 0.6.3", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec 0.8.0", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitcoin-io" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" [[package]] -name = "bitcoinconsensus" -version = "0.19.0-3" +name = "bitcoin_hashes" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a8aa43b5cd02f856cb126a9af819e77b8910fdd74dd1407be649f2f5fe3a1b5" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" dependencies = [ - "cc", - "libc", + "bitcoin-io", + "hex-conservative", ] [[package]] @@ -190,36 +453,33 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] -name = "blake3" -version = "0.3.8" +name = "bitvec" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b64485778c4f16a6a5a9d335e80d449ac6c70cdd6a06d2af18a6f6f775a125b3" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "cc", - "cfg-if 0.1.10", - "constant_time_eq 0.1.5", - "crypto-mac", - "digest 0.9.0", + "funty", + "radium", + "tap", + "wyz", ] [[package]] name = "blake3" -version = "1.5.4" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" +checksum = "b17679a8d69b6d7fd9cd9801a536cec9fa5e5970b69f9d4747f70b39b031f5e7" dependencies = [ "arrayref", - "arrayvec 0.7.6", + "arrayvec", "cc", - "cfg-if 1.0.0", - "constant_time_eq 0.3.1", + "cfg-if", + "constant_time_eq", ] [[package]] @@ -228,13 +488,13 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] name = "bls-dash-sys" version = "1.2.5" -source = "git+https://github.com/dashpay/bls-signatures?rev=4e070243aed142bc458472f8807ab77527dd879a#4e070243aed142bc458472f8807ab77527dd879a" +source = "git+https://github.com/dashpay/bls-signatures?tag=1.3.5#0bb5c5b03249c463debb5cef5f7e52ee66f3aaab" dependencies = [ "bindgen", "cc", @@ -244,7 +504,7 @@ dependencies = [ [[package]] name = "bls-signatures" version = "1.2.5" -source = "git+https://github.com/dashpay/bls-signatures?rev=4e070243aed142bc458472f8807ab77527dd879a#4e070243aed142bc458472f8807ab77527dd879a" +source = "git+https://github.com/dashpay/bls-signatures?tag=1.3.5#0bb5c5b03249c463debb5cef5f7e52ee66f3aaab" dependencies = [ "bls-dash-sys", "hex", @@ -253,96 +513,247 @@ dependencies = [ ] [[package]] -name = "bs58" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" - -[[package]] -name = "bumpalo" -version = "3.16.0" +name = "blsful" +version = "3.0.0-pre8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "384e5e9866cb7f830f06a6633ba998697d5a826e99e8c78376deaadd33cda7be" +dependencies = [ + "anyhow", + "blstrs_plus", + "hex", + "hkdf", + "merlin", + "pairing", + "rand", + "rand_chacha", + "rand_core", + "serde", + "serde_bare", + "sha2", + "sha3", + "subtle", + "thiserror 2.0.12", + "uint-zigzag", + "vsss-rs", + "zeroize", +] [[package]] -name = "byte" -version = "0.2.7" +name = "blst" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21c7ab3e4ae80853c7f8dcdcd904dfa25c02cc373534b8d165194325a088a7cc" +checksum = "62dc83a094a71d43eeadd254b1ec2d24cb6a0bb6cadce00df51f0db594711a32" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] [[package]] -name = "byteorder" -version = "1.5.0" +name = "blstrs_plus" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "4a16dd4b0d6b4538e1fa0388843acb186363082713a8fc8416d802a04d013818" +dependencies = [ + "arrayref", + "blst", + "elliptic-curve", + "ff", + "group", + "pairing", + "rand_core", + "serde", + "subtle", + "zeroize", +] [[package]] -name = "bytes" -version = "1.8.0" +name = "borrow-or-share" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "3eeab4423108c5d7c744f4d234de88d18d636100093ae04caf4825134b9c3a32" [[package]] -name = "cbindgen" -version = "0.20.0" +name = "borsh" +version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e3973b165dc0f435831a9e426de67e894de532754ff7a3f307c03ee5dec7dc" +checksum = "b2b74d67a0fc0af8e9823b79fd1c43a0900e5a8f0e0f4cc9210796bf3a820126" dependencies = [ - "clap 2.34.0", - "heck 0.3.3", - "indexmap 1.9.3", - "log", - "proc-macro2", - "quote", - "serde", - "serde_json", - "syn 1.0.109", - "tempfile", - "toml", + "borsh-derive", + "cfg_aliases", ] [[package]] -name = "cbindgen" -version = "0.24.5" +name = "borsh-derive" +version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b922faaf31122819ec80c4047cc684c6979a087366c069611e33649bf98e18d" +checksum = "2d37ed1b2c9b78421218a0b4f6d8349132d6ec2cfeba1cfb0118b0a8e268df9e" dependencies = [ - "clap 3.2.25", - "heck 0.4.1", - "indexmap 1.9.3", - "log", + "once_cell", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "serde", - "serde_json", - "syn 1.0.109", - "tempfile", - "toml", + "syn 2.0.100", ] [[package]] -name = "cc" -version = "1.1.36" +name = "bs58" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baee610e9452a8f6f0a1b6194ec09ff9e2d85dea54432acdae41aa0761c95d70" -dependencies = [ - "shlex", -] +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" [[package]] -name = "cexpr" -version = "0.6.0" +name = "bs58" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ - "nom", + "tinyvec", ] [[package]] -name = "cfg-if" -version = "0.1.10" +name = "bumpalo" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "byte" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21c7ab3e4ae80853c7f8dcdcd904dfa25c02cc373534b8d165194325a088a7cc" + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bytecount" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +dependencies = [ + "serde", +] + +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "cbindgen" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fce8dd7fcfcbf3a0a87d8f515194b49d6135acab73e18bd380d1d93bb1a15eb" +dependencies = [ + "clap", + "heck 0.4.1", + "indexmap 2.8.0", + "log", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 2.0.100", + "tempfile", + "toml", +] + +[[package]] +name = "cbindgen" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadd868a2ce9ca38de7eeafdcec9c7065ef89b42b32f0839278d55f35c54d1ff" +dependencies = [ + "clap", + "heck 0.4.1", + "indexmap 2.8.0", + "log", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 2.0.100", + "tempfile", + "toml", +] + +[[package]] +name = "cc" +version = "1.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" +dependencies = [ + "shlex", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom 7.1.3", +] [[package]] name = "cfg-if" @@ -350,6 +761,54 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + [[package]] name = "cipher" version = "0.4.4" @@ -373,54 +832,42 @@ dependencies = [ [[package]] name = "clap" -version = "2.34.0" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +checksum = "6088f3ae8c3608d19260cd7445411865a485688711b78b5be70d78cd96136f83" dependencies = [ - "ansi_term", - "atty", - "bitflags 1.3.2", - "strsim 0.8.0", - "textwrap 0.11.0", - "unicode-width", - "vec_map", + "clap_builder", ] [[package]] -name = "clap" -version = "3.2.25" +name = "clap_builder" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +checksum = "22a7ef7f676155edfb82daa97f99441f3ebf4a58d5e32f295a56259f1b6facc8" dependencies = [ - "atty", - "bitflags 1.3.2", + "anstream", + "anstyle", "clap_lex", - "indexmap 1.9.3", - "strsim 0.10.0", - "termcolor", - "textwrap 0.16.1", + "strsim", ] [[package]] name = "clap_lex" -version = "0.2.4" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", -] +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] -name = "const-oid" -version = "0.9.6" +name = "colorchoice" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] -name = "constant_time_eq" -version = "0.1.5" +name = "const-oid" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "constant_time_eq" @@ -438,12 +885,31 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "core2" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "239fa3ae9b63c2dc74bd3fa852d4792b8b305ae64eeede946265b6af62f1fff3" +dependencies = [ + "memchr", +] + [[package]] name = "core2" version = "0.4.0" @@ -455,46 +921,64 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + [[package]] name = "crossbeam-channel" -version = "0.5.13" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] -name = "crypto-common" -version = "0.1.6" +name = "crunchy" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ - "generic-array", - "typenum", + "generic-array 0.14.7", + "rand_core", + "serdect", + "subtle", + "zeroize", ] [[package]] -name = "crypto-mac" -version = "0.8.0" +name = "crypto-common" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array", - "subtle", + "generic-array 0.14.7", + "typenum", ] [[package]] @@ -503,10 +987,10 @@ version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest 0.10.7", + "digest", "fiat-crypto", "rustc_version", "subtle", @@ -521,99 +1005,432 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", -] - -[[package]] -name = "dash-spv-coinjoin" -version = "0.5.0" -dependencies = [ - "byte", - "cbindgen 0.24.5", - "dash-spv-masternode-processor", - "logging", - "tracing", + "syn 2.0.100", ] [[package]] -name = "dash-spv-example-app" -version = "0.1.0" - -[[package]] -name = "dash-spv-masternode-processor" -version = "0.5.0" +name = "dapi-grpc" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" dependencies = [ - "base64", - "bincode", - "bip38", - "bitcoin_hashes", - "bitcoinconsensus", - "blake3 1.5.4", - "bls-signatures", - "byte", - "cbindgen 0.24.5", - "core2", - "dirs-next", - "ed25519-dalek", - "libc", - "logging", - "reqwest", - "rs-x11-hash", - "secp256k1", + "dapi-grpc-macros", + "futures-core", + "getrandom 0.2.15", + "platform-version", + "prost", "serde", + "serde_bytes", "serde_json", - "tracing", - "zeroize", + "tenderdash-proto", + "tonic", + "tonic-build", ] [[package]] -name = "dash_spv_apple_bindings" -version = "0.5.0" +name = "dapi-grpc-macros" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" dependencies = [ - "cbindgen 0.24.5", - "dash-spv-coinjoin", - "dash-spv-masternode-processor", - "logging", - "rs-merk-verify-c-binding", - "tracing", + "heck 0.5.0", + "quote", + "syn 2.0.100", ] [[package]] -name = "der" -version = "0.7.9" +name = "darling" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ - "const-oid", - "zeroize", + "darling_core", + "darling_macro", ] [[package]] -name = "deranged" -version = "0.3.11" +name = "darling_core" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ - "powerfmt", + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.100", ] [[package]] -name = "digest" -version = "0.9.0" +name = "darling_macro" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ - "generic-array", + "darling_core", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "dash-sdk" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" +dependencies = [ + "arc-swap", + "async-trait", + "backon", + "bip37-bloom-filter", + "chrono", + "ciborium", + "dapi-grpc", + "dapi-grpc-macros", + "dashcore-rpc", + "derive_more 1.0.0", + "dotenvy", + "dpp", + "drive", + "drive-proof-verifier", + "envy", + "ferment-macro", + "futures", + "hex", + "http 1.3.1", + "lru", + "platform-value", + "platform-version", + "rs-dapi-client", + "rustls-pemfile", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tokio-util", + "tracing", + "zeroize", ] [[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +name = "dash-spv-coinjoin" +version = "0.5.1" dependencies = [ - "block-buffer", - "crypto-common", + "cbindgen 0.28.0", + "dash-spv-crypto", + "dashcore", + "ferment-macro", + "logging", + "tracing", +] + +[[package]] +name = "dash-spv-crypto" +version = "0.5.1" +dependencies = [ + "bip38", + "bitflags 2.9.0", + "blake3", + "bls-signatures", + "byte", + "dash-spv-keychain", + "dashcore", + "ed25519-dalek", + "ferment", + "ferment-macro", + "indexmap 2.8.0", + "log", + "rs-x11-hash", + "serde", + "simplelog", + "zeroize", +] + +[[package]] +name = "dash-spv-event-bus" +version = "0.5.1" + +[[package]] +name = "dash-spv-example-app" +version = "0.1.0" + +[[package]] +name = "dash-spv-keychain" +version = "0.0.1" +dependencies = [ + "ferment-macro", +] + +[[package]] +name = "dash-spv-macro" +version = "0.1.0" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "dash-spv-masternode-processor" +version = "0.5.1" +dependencies = [ + "base64 0.22.1", + "bincode", + "blake3", + "dash-spv-crypto", + "dashcore", + "dirs-next", + "ferment", + "ferment-macro", + "reqwest", + "rs-x11-hash", + "serde", + "serde_json", + "simplelog", +] + +[[package]] +name = "dash-spv-platform" +version = "0.1.0" +dependencies = [ + "anyhow", + "dapi-grpc", + "dash-sdk", + "dash-spv-crypto", + "dash-spv-event-bus", + "dash-spv-macro", + "dashcore", + "data-contracts", + "dpp", + "drive", + "drive-proof-verifier", + "ferment", + "ferment-macro", + "http 0.2.12", + "indexmap 2.8.0", + "platform-value", + "platform-version", + "tokio", +] + +[[package]] +name = "dash_spv_apple_bindings" +version = "0.5.1" +dependencies = [ + "anyhow", + "bincode_derive", + "byte", + "cbindgen 0.28.0", + "dash-sdk", + "dash-spv-coinjoin", + "dash-spv-crypto", + "dash-spv-keychain", + "dash-spv-masternode-processor", + "dash-spv-platform", + "dashcore", + "data-contracts", + "dpp", + "drive", + "drive-proof-verifier", + "ferment", + "ferment-macro", + "ferment-sys", + "grovedb-version 2.2.1", + "indexmap 2.8.0", + "jsonschema 0.29.0", + "libc", + "logging", + "platform-value", + "platform-version", + "regex", + "reqwest", + "serde", + "serde_json", + "tokio", + "tracing", + "versioned-feature-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "dashcore" +version = "0.39.1" +source = "git+https://github.com/dashpay/rust-dashcore?branch=feat%2Fferment#3899a549abbdeac0674ce0c7a9ce56510d068085" +dependencies = [ + "anyhow", + "base64-compat", + "bech32", + "bincode", + "bitflags 2.9.0", + "blake3", + "bls-signatures", + "blsful", + "core2 0.3.3", + "dashcore-private", + "dashcore_hashes", + "ed25519-dalek", + "ferment", + "ferment-macro", + "hex", + "hex_lit", + "lazy_static", + "rustversion", + "secp256k1 0.30.0", + "serde", + "serde_repr", + "strum", + "thiserror 1.0.69", +] + +[[package]] +name = "dashcore-private" +version = "0.39.1" +source = "git+https://github.com/dashpay/rust-dashcore?branch=feat%2Fferment#3899a549abbdeac0674ce0c7a9ce56510d068085" + +[[package]] +name = "dashcore-rpc" +version = "0.39.1" +source = "git+https://github.com/dashpay/rust-dashcore?branch=feat%2Fferment#3899a549abbdeac0674ce0c7a9ce56510d068085" +dependencies = [ + "dashcore-rpc-json", + "hex", + "jsonrpc", + "log", + "serde", + "serde_json", +] + +[[package]] +name = "dashcore-rpc-json" +version = "0.39.1" +source = "git+https://github.com/dashpay/rust-dashcore?branch=feat%2Fferment#3899a549abbdeac0674ce0c7a9ce56510d068085" +dependencies = [ + "bincode", + "dashcore", + "hex", + "serde", + "serde_json", + "serde_repr", + "serde_with", +] + +[[package]] +name = "dashcore_hashes" +version = "0.39.1" +source = "git+https://github.com/dashpay/rust-dashcore?branch=feat%2Fferment#3899a549abbdeac0674ce0c7a9ce56510d068085" +dependencies = [ + "bincode", + "dashcore-private", + "secp256k1 0.30.0", + "serde", +] + +[[package]] +name = "dashpay-contract" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" +dependencies = [ + "platform-value", + "platform-version", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "data-contracts" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" +dependencies = [ + "dashpay-contract", + "dpns-contract", + "feature-flags-contract", + "ferment-macro", + "masternode-reward-shares-contract", + "platform-value", + "platform-version", + "serde_json", + "thiserror 1.0.69", + "token-history-contract", + "versioned-feature-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wallet-utils-contract", + "withdrawals-contract", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derive_arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl 2.0.1", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "unicode-xid", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", "subtle", ] @@ -632,7 +1449,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "dirs-sys-next", ] @@ -666,7 +1483,124 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.100", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "dpns-contract" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" +dependencies = [ + "platform-value", + "platform-version", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "dpp" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" +dependencies = [ + "anyhow", + "async-trait", + "base64 0.22.1", + "bincode", + "bincode_derive", + "bs58 0.5.1", + "byteorder", + "chrono", + "ciborium", + "dashcore", + "data-contracts", + "derive_more 1.0.0", + "env_logger", + "ferment", + "ferment-macro", + "getrandom 0.2.15", + "hex", + "indexmap 2.8.0", + "integer-encoding", + "itertools 0.13.0", + "json-schema-compatibility-validator", + "jsonschema 0.18.0", + "lazy_static", + "nohash-hasher", + "num_enum 0.7.3", + "once_cell", + "platform-serialization", + "platform-serialization-derive", + "platform-value", + "platform-version", + "platform-versioning", + "rand", + "regex", + "rust_decimal", + "rust_decimal_macros", + "serde", + "serde_json", + "serde_repr", + "sha2", + "strum", + "thiserror 1.0.69", + "versioned-feature-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "drive" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" +dependencies = [ + "bincode", + "byteorder", + "derive_more 1.0.0", + "dpp", + "grovedb", + "grovedb-costs", + "grovedb-epoch-based-storage-flags", + "grovedb-path", + "grovedb-version 3.0.0", + "hex", + "indexmap 2.8.0", + "integer-encoding", + "nohash-hasher", + "platform-value", + "platform-version", + "serde", + "sqlparser", + "thiserror 1.0.69", + "tracing", + "versioned-feature-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "drive-proof-verifier" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" +dependencies = [ + "bincode", + "dapi-grpc", + "derive_more 1.0.0", + "dpp", + "drive", + "ferment-macro", + "hex", + "indexmap 2.8.0", + "platform-serialization", + "platform-serialization-derive", + "platform-value", + "platform-version", + "serde", + "serde_json", + "tenderdash-abci", + "thiserror 1.0.69", + "tracing", ] [[package]] @@ -676,7 +1610,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9c8d6ea916fadcd87e3d1ff4802b696d717c83519b47e76f267ab77e536dd5a" dependencies = [ "ed-derive", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -708,6 +1642,7 @@ checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek", "ed25519", + "rand_core", "serde", "sha2", "subtle", @@ -716,75 +1651,249 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] -name = "encoding_rs" -version = "0.8.35" +name = "elliptic-curve" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ - "cfg-if 1.0.0", + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array 0.14.7", + "group", + "hkdf", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "tap", + "zeroize", ] [[package]] -name = "equivalent" -version = "1.0.1" +name = "elliptic-curve-tools" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "e48843edfbd0a370b3dd14cdbb4e446e9a8855311e6b2b57bf9a1fd1367bc317" +dependencies = [ + "elliptic-curve", + "heapless", + "hex", + "multiexp", + "serde", + "zeroize", +] [[package]] -name = "errno" -version = "0.3.9" +name = "email_address" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" dependencies = [ - "libc", - "windows-sys 0.52.0", + "serde", ] [[package]] -name = "failure" -version = "0.1.8" +name = "encoding_rs" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ - "backtrace", - "failure_derive", + "cfg-if", ] [[package]] -name = "failure_derive" -version = "0.1.8" +name = "env_filter" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "synstructure 0.12.6", + "log", + "regex", ] [[package]] -name = "fastrand" -version = "2.2.0" +name = "env_logger" +version = "0.11.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" - -[[package]] +checksum = "c3716d7a920fb4fac5d84e9d4bce8ceb321e9414b4409da61b07b75c1e3d0697" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] + +[[package]] +name = "envy" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f47e0157f2cb54f5ae1bd371b30a2ae4311e1c028f575cd4e81de7353215965" +dependencies = [ + "serde", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "fancy-regex" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2" +dependencies = [ + "bit-set 0.5.3", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "fancy-regex" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298" +dependencies = [ + "bit-set 0.8.0", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "feature-flags-contract" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" +dependencies = [ + "platform-value", + "platform-version", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "ferment" +version = "0.1.4" +source = "git+https://github.com/dashpay/ferment#482ce7145d70376c7ed88cc853cf8e6e4e00eed2" +dependencies = [ + "indexmap 2.8.0", + "serde_json", +] + +[[package]] +name = "ferment-macro" +version = "0.1.4" +source = "git+https://github.com/dashpay/ferment#482ce7145d70376c7ed88cc853cf8e6e4e00eed2" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ferment-sys" +version = "0.1.4" +source = "git+https://github.com/dashpay/ferment#482ce7145d70376c7ed88cc853cf8e6e4e00eed2" +dependencies = [ + "ansi_term", + "cargo_metadata", + "cbindgen 0.27.0", + "env_logger", + "ferment-macro", + "log", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "bitvec", + "rand_core", + "subtle", +] + +[[package]] name = "fiat-crypto" version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "flate2" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "flex-error" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c606d892c9de11507fa0dcffc116434f94e105d0bbdc4e405b61519464c49d7b" +dependencies = [ + "paste", +] + +[[package]] +name = "fluent-uri" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1918b65d96df47d3591bed19c5cca17e3fa5d0707318e4b5ef2eae01764df7e5" +dependencies = [ + "borrow-or-share", + "ref-cast", + "serde", +] + [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -809,6 +1918,43 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fraction" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f158e3ff0a1b334408dc9fb811cd99b446986f4d8b741bb08f9df1604085ae7" +dependencies = [ + "lazy_static", + "num", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.31" @@ -816,6 +1962,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -824,12 +1971,34 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + [[package]] name = "futures-io" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "futures-sink" version = "0.3.31" @@ -848,8 +2017,11 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures-channel", "futures-core", "futures-io", + "futures-macro", + "futures-sink", "futures-task", "memchr", "pin-project-lite", @@ -865,6 +2037,17 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", +] + +[[package]] +name = "generic-array" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c8444bc9d71b935156cc0ccab7f622180808af7867b1daae6547d773591703" +dependencies = [ + "serde", + "typenum", ] [[package]] @@ -873,9 +2056,23 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", "libc", - "wasi", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", ] [[package]] @@ -886,123 +2083,346 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] -name = "h2" -version = "0.3.26" +name = "gloo-timers" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" dependencies = [ - "bytes", - "fnv", + "futures-channel", "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 2.6.0", - "slab", - "tokio", - "tokio-util", - "tracing", + "js-sys", + "wasm-bindgen", ] [[package]] -name = "hashbrown" -version = "0.12.3" +name = "group" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand", + "rand_core", + "rand_xorshift", + "subtle", +] [[package]] -name = "hashbrown" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" +name = "grovedb" +version = "3.0.0" +source = "git+https://github.com/dashpay/grovedb?rev=f89e03e4e0ac12aa2feea5c94b38c09f4909facc#f89e03e4e0ac12aa2feea5c94b38c09f4909facc" +dependencies = [ + "bincode", + "blake3", + "grovedb-costs", + "grovedb-merk", + "grovedb-path", + "grovedb-version 3.0.0", + "hex", + "hex-literal", + "indexmap 2.8.0", + "integer-encoding", + "reqwest", + "sha2", + "thiserror 2.0.12", +] [[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +name = "grovedb-costs" +version = "3.0.0" +source = "git+https://github.com/dashpay/grovedb?rev=f89e03e4e0ac12aa2feea5c94b38c09f4909facc#f89e03e4e0ac12aa2feea5c94b38c09f4909facc" dependencies = [ - "unicode-segmentation", + "integer-encoding", + "intmap", + "thiserror 2.0.12", ] [[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +name = "grovedb-epoch-based-storage-flags" +version = "3.0.0" +source = "git+https://github.com/dashpay/grovedb?rev=f89e03e4e0ac12aa2feea5c94b38c09f4909facc#f89e03e4e0ac12aa2feea5c94b38c09f4909facc" +dependencies = [ + "grovedb-costs", + "hex", + "integer-encoding", + "intmap", + "thiserror 2.0.12", +] [[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +name = "grovedb-merk" +version = "3.0.0" +source = "git+https://github.com/dashpay/grovedb?rev=f89e03e4e0ac12aa2feea5c94b38c09f4909facc#f89e03e4e0ac12aa2feea5c94b38c09f4909facc" dependencies = [ - "libc", + "bincode", + "blake3", + "byteorder", + "ed", + "grovedb-costs", + "grovedb-path", + "grovedb-version 3.0.0", + "grovedb-visualize", + "hex", + "indexmap 2.8.0", + "integer-encoding", + "thiserror 2.0.12", ] [[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +name = "grovedb-path" +version = "3.0.0" +source = "git+https://github.com/dashpay/grovedb?rev=f89e03e4e0ac12aa2feea5c94b38c09f4909facc#f89e03e4e0ac12aa2feea5c94b38c09f4909facc" +dependencies = [ + "hex", +] [[package]] -name = "hex" -version = "0.4.3" +name = "grovedb-version" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +checksum = "a987e051c8c9cf8fa381b29b243d4951f8c1f24f9c90ceed52afca3ac460986c" +dependencies = [ + "thiserror 2.0.12", + "versioned-feature-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +name = "grovedb-version" +version = "3.0.0" +source = "git+https://github.com/dashpay/grovedb?rev=f89e03e4e0ac12aa2feea5c94b38c09f4909facc#f89e03e4e0ac12aa2feea5c94b38c09f4909facc" dependencies = [ - "digest 0.10.7", + "thiserror 2.0.12", + "versioned-feature-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +name = "grovedb-visualize" +version = "3.0.0" +source = "git+https://github.com/dashpay/grovedb?rev=f89e03e4e0ac12aa2feea5c94b38c09f4909facc#f89e03e4e0ac12aa2feea5c94b38c09f4909facc" dependencies = [ - "windows-sys 0.52.0", + "hex", + "itertools 0.14.0", ] [[package]] -name = "http" -version = "0.2.12" +name = "h2" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" dependencies = [ + "atomic-waker", "bytes", "fnv", - "itoa", + "futures-core", + "futures-sink", + "http 1.3.1", + "indexmap 2.8.0", + "slab", + "tokio", + "tokio-util", + "tracing", ] [[package]] -name = "http-body" -version = "0.4.6" +name = "half" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "7db2ff139bba50379da6aa0766b52fdcb62cb5b263009b09ed58ba604e14bbd1" dependencies = [ - "bytes", - "http", - "pin-project-lite", + "cfg-if", + "crunchy", ] [[package]] -name = "httparse" -version = "1.9.5" +name = "hash32" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" - +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash 0.8.11", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32", + "stable_deref_trait", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "hex-conservative" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hex_lit" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.3.1", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http 1.3.1", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "http-serde" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f056c8559e3757392c8d091e796416e4649d8e49e88b8d76df6c002f05027fd" +dependencies = [ + "http 1.3.1", + "serde", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + [[package]] name = "httpdate" version = "1.0.3" @@ -1011,39 +2431,112 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.31" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", - "futures-core", "futures-util", "h2", - "http", + "http 1.3.1", "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2", + "smallvec", "tokio", - "tower-service", - "tracing", "want", ] +[[package]] +name = "hyper-rustls" +version = "0.27.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +dependencies = [ + "futures-util", + "http 1.3.1", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + [[package]] name = "hyper-tls" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", + "http-body-util", "hyper", + "hyper-util", "native-tls", "tokio", "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.3.1", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2fd658b06e56721792c5df4475705b6cda790e9298d19d2f8af083457bcd127" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", ] [[package]] @@ -1161,9 +2654,15 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.100", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "1.0.3" @@ -1193,249 +2692,659 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", + "serde", ] [[package]] name = "indexmap" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" dependencies = [ "equivalent", - "hashbrown 0.15.1", + "hashbrown 0.15.2", + "serde", ] [[package]] name = "inout" -version = "0.1.3" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "integer-encoding" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d762194228a2f1c11063e46e32e5acb96e66e906382b9eb5441f2e0504bbd5a" + +[[package]] +name = "intmap" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "210870d5399600055a955c020cc97e462203c234dc2b103b5da5d80fdbd5eed5" dependencies = [ - "generic-array", + "serde", ] [[package]] name = "ipnet" -version = "2.10.1" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "iso8601" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5c177cff824ab21a6f41079a4c401241c4e8be14f316c4c6b07d5fca351c98d" +dependencies = [ + "nom 8.0.0", +] + +[[package]] +name = "itertools" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jiff" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c102670231191d07d37a35af3eb77f1f0dbf7a71be51a962dcd57ea607be7260" +dependencies = [ + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde", +] + +[[package]] +name = "jiff-static" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cdde31a9d349f1b1f51a0b3714a5940ac022976f4b49485fc04be052b183b4c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] -name = "lazy_static" -version = "1.5.0" +name = "json-patch" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec9ad60d674508f3ca8f380a928cfe7b096bc729c4e2dbfe3852bc45da3ab30b" +dependencies = [ + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "json-schema-compatibility-validator" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" +dependencies = [ + "json-patch", + "once_cell", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonrpc" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8128f36b47411cd3f044be8c1f5cc0c9e24d1d1bfdc45f0a57897b32513053f2" +dependencies = [ + "base64 0.13.1", + "serde", + "serde_json", +] + +[[package]] +name = "jsonschema" +version = "0.18.0" +source = "git+https://github.com/dashpay/jsonschema-rs?branch=configure_regexp#7b00a2442ce44772e278b468bc4c2adc5e252226" +dependencies = [ + "ahash 0.8.11", + "anyhow", + "base64 0.22.1", + "bytecount", + "fancy-regex 0.13.0", + "fraction", + "getrandom 0.2.15", + "iso8601", + "itoa", + "memchr", + "num-cmp", + "once_cell", + "parking_lot", + "percent-encoding", + "regex", + "serde", + "serde_json", + "time", + "url", + "uuid", +] + +[[package]] +name = "jsonschema" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c59cb1733c34377b6067a0419befd7f25073c5249ec3b0614a482bf499e1df5" +dependencies = [ + "ahash 0.8.11", + "base64 0.22.1", + "bytecount", + "email_address", + "fancy-regex 0.14.0", + "fraction", + "idna", + "itoa", + "num-cmp", + "once_cell", + "percent-encoding", + "referencing", + "regex-syntax 0.8.5", + "reqwest", + "serde", + "serde_json", + "uuid-simd", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "lhash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744a4c881f502e98c2241d2e5f50040ac73b30194d64452bb6260393b53f0dc9" + +[[package]] +name = "libc" +version = "0.2.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" + +[[package]] +name = "libloading" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.9.0", + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "lockfree-object-pool" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "logging" +version = "0.1.0" +dependencies = [ + "dirs", + "dirs-next", + "tracing", + "tracing-appender", + "tracing-subscriber", +] + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.2", +] + +[[package]] +name = "masternode-reward-shares-contract" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" +dependencies = [ + "platform-value", + "platform-version", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core", + "zeroize", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "multiexp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a383da1ae933078ddb1e4141f1dd617b512b4183779d6977e6451b0e644806" +dependencies = [ + "ff", + "group", + "rustversion", + "std-shims", + "zeroize", +] + +[[package]] +name = "multimap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" + +[[package]] +name = "murmur3" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252111cf132ba0929b6f8e030cac2a24b507f3a4d6db6fb2896f27b354c714b" + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework 2.11.1", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" [[package]] -name = "lazycell" -version = "1.3.0" +name = "nom" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] [[package]] -name = "libc" -version = "0.2.162" +name = "nom" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] [[package]] -name = "libloading" -version = "0.8.5" +name = "nu-ansi-term" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ - "cfg-if 1.0.0", - "windows-targets 0.52.6", + "overload", + "winapi", ] [[package]] -name = "libredox" -version = "0.1.3" +name = "num" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ - "bitflags 2.6.0", - "libc", + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", ] [[package]] -name = "linux-raw-sys" -version = "0.4.14" +name = "num-bigint" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", + "rand", + "serde", +] [[package]] -name = "litemap" -version = "0.7.3" +name = "num-cmp" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" +checksum = "63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa" [[package]] -name = "lock_api" -version = "0.4.12" +name = "num-complex" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ - "autocfg", - "scopeguard", + "num-traits", + "rand", + "serde", ] [[package]] -name = "log" -version = "0.4.22" +name = "num-conv" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] -name = "logging" -version = "0.1.0" +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ - "dirs", - "dirs-next", - "tracing", - "tracing-appender", - "tracing-subscriber", + "proc-macro2", + "quote", + "syn 2.0.100", ] [[package]] -name = "matchers" -version = "0.1.0" +name = "num-integer" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "regex-automata 0.1.10", + "num-traits", ] [[package]] -name = "memchr" -version = "2.7.4" +name = "num-iter" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "merk" -version = "1.0.0" -source = "git+https://github.com/dashevo/merk?branch=v0.1-dev-stable#8d818aff39afe4e2ba5e099be2f468e49fa08e8f" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ - "blake3 0.3.8", - "ed", - "failure", + "autocfg", + "num-integer", + "num-traits", ] [[package]] -name = "mime" -version = "0.3.17" +name = "num-rational" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", + "serde", +] [[package]] -name = "minimal-lexical" -version = "0.2.1" +name = "num-traits" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] [[package]] -name = "miniz_oxide" -version = "0.8.0" +name = "num_cpus" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "adler2", + "hermit-abi", + "libc", ] [[package]] -name = "mio" -version = "1.0.2" +name = "num_enum" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" dependencies = [ - "hermit-abi 0.3.9", - "libc", - "wasi", - "windows-sys 0.52.0", + "num_enum_derive 0.5.11", ] [[package]] -name = "native-tls" -version = "0.2.12" +name = "num_enum" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", + "num_enum_derive 0.7.3", ] [[package]] -name = "nom" -version = "7.1.3" +name = "num_enum_derive" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ - "memchr", - "minimal-lexical", + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "nu-ansi-term" -version = "0.46.0" +name = "num_enum_derive" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "overload", - "winapi", + "proc-macro-crate 3.3.0", + "proc-macro2", + "quote", + "syn 2.0.100", ] [[package]] -name = "num-conv" -version = "0.1.0" +name = "num_threads" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" [[package]] name = "openssl" -version = "0.10.68" +version = "0.10.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" dependencies = [ - "bitflags 2.6.0", - "cfg-if 1.0.0", + "bitflags 2.9.0", + "cfg-if", "foreign-types", "libc", "once_cell", @@ -1451,20 +3360,20 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.100", ] [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.104" +version = "0.9.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" dependencies = [ "cc", "libc", @@ -1473,10 +3382,10 @@ dependencies = [ ] [[package]] -name = "os_str_bytes" -version = "6.6.1" +name = "outref" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" +checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" [[package]] name = "overload" @@ -1484,6 +3393,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", +] + [[package]] name = "parking_lot" version = "0.12.3" @@ -1500,20 +3418,26 @@ version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "redox_syscall", "smallvec", "windows-targets 0.52.6", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "pbkdf2" version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "digest 0.10.7", + "digest", "hmac", ] @@ -1529,11 +3453,41 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "petgraph" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" +dependencies = [ + "fixedbitset", + "indexmap 2.8.0", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -1553,9 +3507,88 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "platform-serialization" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" +dependencies = [ + "bincode", + "platform-version", +] + +[[package]] +name = "platform-serialization-derive" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "virtue 0.0.17", +] + +[[package]] +name = "platform-value" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" +dependencies = [ + "base64 0.22.1", + "bincode", + "bs58 0.5.1", + "ciborium", + "ferment-macro", + "hex", + "indexmap 2.8.0", + "platform-serialization", + "platform-version", + "rand", + "serde", + "serde_json", + "thiserror 1.0.69", + "treediff", +] + +[[package]] +name = "platform-version" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" +dependencies = [ + "bincode", + "ferment-macro", + "grovedb-version 3.0.0", + "once_cell", + "thiserror 1.0.69", + "versioned-feature-core 1.0.0 (git+https://github.com/dashpay/versioned-feature-core)", +] + +[[package]] +name = "platform-versioning" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "portable-atomic" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] [[package]] name = "powerfmt" @@ -1564,42 +3597,145 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] -name = "ppv-lite86" -version = "0.2.20" +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy 0.8.24", +] + +[[package]] +name = "prettyplease" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5316f57387668042f561aae71480de936257848f9c43ce528e311d89a07cadeb" +dependencies = [ + "proc-macro2", + "syn 2.0.100", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit 0.22.24", +] + +[[package]] +name = "proc-macro2" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" +dependencies = [ + "heck 0.5.0", + "itertools 0.14.0", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.100", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "prost-types" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" dependencies = [ - "zerocopy", + "prost", ] [[package]] -name = "prettyplease" -version = "0.2.25" +name = "ptr_meta" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" dependencies = [ - "proc-macro2", - "syn 2.0.87", + "ptr_meta_derive", ] [[package]] -name = "proc-macro2" -version = "1.0.89" +name = "ptr_meta_derive" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ - "unicode-ident", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.8.5" @@ -1627,7 +3763,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", ] [[package]] @@ -1636,18 +3781,18 @@ version = "0.1.0" dependencies = [ "libc", "logging", - "system-configuration", + "system-configuration 0.5.1", "tokio", "tracing", ] [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", ] [[package]] @@ -1656,9 +3801,43 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom", + "getrandom 0.2.15", "libredox", - "thiserror", + "thiserror 1.0.69", +] + +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "referencing" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce52678d53e5ee37e4af0a9036ca834d0cd34b33c82457c6b06a24f8d783344" +dependencies = [ + "ahash 0.8.11", + "fluent-uri", + "once_cell", + "parking_lot", + "percent-encoding", + "serde_json", ] [[package]] @@ -1669,7 +3848,7 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -1684,9 +3863,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -1705,22 +3884,35 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + [[package]] name = "reqwest" -version = "0.11.27" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "encoding_rs", + "futures-channel", "futures-core", "futures-util", "h2", - "http", + "http 1.3.1", "http-body", + "http-body-util", "hyper", + "hyper-rustls", "hyper-tls", + "hyper-util", "ipnet", "js-sys", "log", @@ -1734,15 +3926,30 @@ dependencies = [ "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", + "system-configuration 0.6.1", "tokio", "tokio-native-tls", + "tower 0.5.2", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg", + "windows-registry", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.15", + "libc", + "untrusted", + "windows-sys 0.52.0", ] [[package]] @@ -1751,7 +3958,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -1761,12 +3968,58 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f923401a7e6614f2838037bd9bac86c003d1629446d2b5816d3159472071be4f" [[package]] -name = "rs-merk-verify-c-binding" -version = "0.1.3" -source = "git+https://github.com/dashpay/rs-merk-verify-c-binding?branch=for-use-in-main-crate#930aeb2a79a07d9e09d2eaf2b8bd7ce21a84aaec" +name = "rkyv" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" dependencies = [ - "cbindgen 0.20.0", - "merk", + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rs-dapi-client" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" +dependencies = [ + "backon", + "chrono", + "dapi-grpc", + "futures", + "getrandom 0.2.15", + "gloo-timers", + "hex", + "http 1.3.1", + "http-serde", + "lru", + "rand", + "serde", + "serde_json", + "sha2", + "thiserror 1.0.69", + "tokio", + "tonic-web-wasm-client", + "tracing", + "wasm-bindgen-futures", ] [[package]] @@ -1780,6 +4033,32 @@ dependencies = [ "libc", ] +[[package]] +name = "rust_decimal" +version = "1.37.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faa7de2ba56ac291bd90c6b9bece784a52ae1411f9506544b3eae36dd2356d50" +dependencies = [ + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand", + "rkyv", + "serde", + "serde_json", +] + +[[package]] +name = "rust_decimal_macros" +version = "1.37.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6268b74858287e1a062271b988a0c534bf85bbeb567fe09331bf40ed78113d5" +dependencies = [ + "quote", + "syn 2.0.100", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -1803,31 +4082,94 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.39" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375116bee2be9ed569afe2154ea6a99dfdffd257f533f187498c2a8f5feaf4ee" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "errno", "libc", - "linux-raw-sys", - "windows-sys 0.52.0", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys 0.9.3", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.23.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework 3.2.0", ] [[package]] name = "rustls-pemfile" -version = "1.0.4" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" + +[[package]] +name = "rustls-webpki" +version = "0.103.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +checksum = "0aa4eeac2588ffff23e9d7a7e9b3f971c5fb5b7ebc9452745e0c232c64f83b2f" dependencies = [ - "base64", + "ring", + "rustls-pki-types", + "untrusted", ] +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "salsa20" @@ -1838,11 +4180,20 @@ dependencies = [ "cipher", ] +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ "windows-sys 0.59.0", ] @@ -1864,15 +4215,45 @@ dependencies = [ "sha2", ] +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array 0.14.7", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "secp256k1" version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4124a35fe33ae14259c490fd70fa199a32b9ce9502f2ee6bc4f81ec06fa65894" +dependencies = [ + "secp256k1-sys 0.8.1", +] + +[[package]] +name = "secp256k1" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" dependencies = [ "bitcoin_hashes", "rand", - "secp256k1-sys", + "secp256k1-sys 0.10.1", + "serde", ] [[package]] @@ -1884,14 +4265,36 @@ dependencies = [ "cc", ] +[[package]] +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +dependencies = [ + "cc", +] + [[package]] name = "security-framework" version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", - "core-foundation", + "bitflags 2.9.0", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.9.0", + "core-foundation 0.10.0", "core-foundation-sys", "libc", "security-framework-sys", @@ -1899,9 +4302,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -1909,63 +4312,153 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] [[package]] name = "serde" -version = "1.0.214" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] -name = "serde_derive" -version = "1.0.214" +name = "serde_bare" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51c55386eed0f1ae957b091dc2ca8122f287b60c79c774cbe3d5f2b69fded660" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_bytes" +version = "0.11.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "indexmap 2.8.0", + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" +dependencies = [ + "base64 0.13.1", + "chrono", + "hex", + "indexmap 1.9.3", + "serde", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" dependencies = [ + "darling", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.100", ] [[package]] -name = "serde_json" -version = "1.0.132" +name = "serdect" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" dependencies = [ - "itoa", - "memchr", - "ryu", + "base16ct", "serde", ] [[package]] -name = "serde_urlencoded" -version = "0.7.1" +name = "sha2" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", + "cfg-if", + "cpufeatures", + "digest", ] [[package]] -name = "sha2" +name = "sha3" version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.10.7", + "digest", + "keccak", ] [[package]] @@ -2001,6 +4494,29 @@ dependencies = [ "rand_core", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "simplelog" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16257adbfaef1ee58b1363bdc0664c9b8e1e30aed86049635fb5f147d065a9c0" +dependencies = [ + "log", + "termcolor", + "time", +] + [[package]] name = "slab" version = "0.4.9" @@ -2012,20 +4528,29 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + [[package]] name = "spki" version = "0.7.3" @@ -2036,6 +4561,15 @@ dependencies = [ "der", ] +[[package]] +name = "sqlparser" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0272b7bb0a225320170c99901b4b5fb3a4384e255a7f2cc228f61e2ba3893e75" +dependencies = [ + "log", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -2043,16 +4577,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] -name = "strsim" -version = "0.8.0" +name = "std-shims" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" +checksum = "90e49360f31b0b75a6a82a5205c6103ea07a79a60808d44f5cc879d303337926" +dependencies = [ + "hashbrown 0.14.5", + "spin", +] [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.100", +] [[package]] name = "subtle" @@ -2060,6 +4620,15 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "subtle-encoding" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" +dependencies = [ + "zeroize", +] + [[package]] name = "syn" version = "1.0.109" @@ -2073,9 +4642,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.87" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -2084,20 +4653,11 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "synstructure" -version = "0.12.6" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "unicode-xid", + "futures-core", ] [[package]] @@ -2108,7 +4668,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.100", ] [[package]] @@ -2118,8 +4678,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", + "core-foundation 0.9.4", + "system-configuration-sys 0.5.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.9.0", + "core-foundation 0.9.4", + "system-configuration-sys 0.6.0", ] [[package]] @@ -2132,19 +4703,82 @@ dependencies = [ "libc", ] +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tempfile" -version = "3.14.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" dependencies = [ - "cfg-if 1.0.0", "fastrand", + "getrandom 0.3.2", "once_cell", - "rustix", + "rustix 1.0.3", "windows-sys 0.59.0", ] +[[package]] +name = "tenderdash-abci" +version = "1.3.0+1.3.0" +source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v1.3.0%2B1.3.0#cdd40c47ac2ed52a4fa0a72b2efb86af9b87a878" +dependencies = [ + "bytes", + "hex", + "lhash", + "semver", + "tenderdash-proto", + "thiserror 2.0.12", + "tracing", + "url", +] + +[[package]] +name = "tenderdash-proto" +version = "1.3.0+1.3.0" +source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v1.3.0%2B1.3.0#cdd40c47ac2ed52a4fa0a72b2efb86af9b87a878" +dependencies = [ + "bytes", + "chrono", + "derive_more 2.0.1", + "flex-error", + "num-derive", + "num-traits", + "prost", + "serde", + "subtle-encoding", + "tenderdash-proto-compiler", + "time", +] + +[[package]] +name = "tenderdash-proto-compiler" +version = "1.3.0+1.3.0" +source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v1.3.0%2B1.3.0#cdd40c47ac2ed52a4fa0a72b2efb86af9b87a878" +dependencies = [ + "fs_extra", + "prost-build", + "regex", + "tempfile", + "ureq", + "walkdir", + "zip", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -2155,38 +4789,43 @@ dependencies = [ ] [[package]] -name = "textwrap" -version = "0.11.0" +name = "thiserror" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "unicode-width", + "thiserror-impl 1.0.69", ] [[package]] -name = "textwrap" -version = "0.16.1" +name = "thiserror" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] [[package]] -name = "thiserror" -version = "1.0.68" +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "thiserror-impl", + "proc-macro2", + "quote", + "syn 2.0.100", ] [[package]] name = "thiserror-impl" -version = "1.0.68" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.100", ] [[package]] @@ -2195,19 +4834,30 @@ version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "once_cell", ] +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + [[package]] name = "time" -version = "0.3.37" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", + "libc", "num-conv", + "num_threads", "powerfmt", "serde", "time-core", @@ -2216,15 +4866,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.19" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ "num-conv", "time-core", @@ -2242,9 +4892,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -2255,11 +4905,22 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "token-history-contract" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" +dependencies = [ + "platform-value", + "platform-version", + "serde_json", + "thiserror 1.0.69", +] + [[package]] name = "tokio" -version = "1.41.1" +version = "1.44.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" +checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" dependencies = [ "backtrace", "bytes", @@ -2275,13 +4936,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.100", ] [[package]] @@ -2295,26 +4956,197 @@ dependencies = [ ] [[package]] -name = "tokio-util" -version = "0.7.12" +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.24", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.8.0", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +dependencies = [ + "indexmap 2.8.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.7.4", +] + +[[package]] +name = "tonic" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.22.1", + "bytes", + "h2", + "http 1.3.1", + "http-body", + "http-body-util", + "hyper", + "hyper-timeout", + "hyper-util", + "percent-encoding", + "pin-project", + "prost", + "rustls-native-certs", + "rustls-pemfile", + "socket2", + "tokio", + "tokio-rustls", + "tokio-stream", + "tower 0.4.13", + "tower-layer", + "tower-service", + "tracing", + "webpki-roots", +] + +[[package]] +name = "tonic-build" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11" +dependencies = [ + "prettyplease", + "proc-macro2", + "prost-build", + "prost-types", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "tonic-web-wasm-client" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8957be1a1c7aa12d4c9d67882060dd57aed816bbc553fa60949312e839f4a8ea" +dependencies = [ + "base64 0.22.1", + "byteorder", + "bytes", + "futures-util", + "http 1.3.1", + "http-body", + "http-body-util", + "httparse", + "js-sys", + "pin-project", + "thiserror 1.0.69", + "tonic", + "tower-service", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ - "bytes", "futures-core", - "futures-sink", + "futures-util", "pin-project-lite", + "sync_wrapper", "tokio", + "tower-layer", + "tower-service", ] [[package]] -name = "toml" -version = "0.5.11" +name = "tower-layer" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" @@ -2324,9 +5156,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "pin-project-lite", "tracing-attributes", @@ -2340,27 +5172,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" dependencies = [ "crossbeam-channel", - "thiserror", + "thiserror 1.0.69", "time", "tracing-subscriber", ] [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.100", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -2379,9 +5211,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", "nu-ansi-term", @@ -2395,6 +5227,12 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "treediff" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2ce481b2b7c2534fe7b5242cccebf37f9084392665c6a3783c414a1bada5432" + [[package]] name = "try-lock" version = "0.2.5" @@ -2403,15 +5241,24 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "uint-zigzag" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "abbf77aed65cb885a8ba07138c365879be3d9a93dce82bf6cc50feca9138ec15" +dependencies = [ + "core2 0.4.0", +] [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-normalization" @@ -2423,34 +5270,64 @@ dependencies = [ ] [[package]] -name = "unicode-segmentation" -version = "1.12.0" +name = "unicode-xid" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] -name = "unicode-width" -version = "0.1.14" +name = "untrusted" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] -name = "unicode-xid" -version = "0.2.6" +name = "ureq" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +checksum = "4b0351ca625c7b41a8e4f9bb6c5d9755f67f62c2187ebedecacd9974674b271d" +dependencies = [ + "base64 0.22.1", + "flate2", + "log", + "percent-encoding", + "rustls", + "rustls-pemfile", + "rustls-pki-types", + "ureq-proto", + "utf-8", + "webpki-roots", +] + +[[package]] +name = "ureq-proto" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae239d0a3341aebc94259414d1dc67cfce87d41cbebc816772c91b77902fafa4" +dependencies = [ + "base64 0.22.1", + "http 1.3.1", + "httparse", + "log", +] [[package]] name = "url" -version = "2.5.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "utf16_iter" version = "1.0.5" @@ -2463,11 +5340,34 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" + +[[package]] +name = "uuid-simd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b082222b4f6619906941c17eb2297fff4c2fb96cb60164170522942a200bd8" +dependencies = [ + "outref", + "uuid", + "vsimd", +] + [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "vcpkg" @@ -2475,24 +5375,81 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "versioned-feature-core" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "898c0ad500fdb1914df465a2c729fce33646ef65dfbbbd16a6d8050e0d2404df" + +[[package]] +name = "versioned-feature-core" +version = "1.0.0" +source = "git+https://github.com/dashpay/versioned-feature-core#560157096c8405a46ce0f21a2e7e1bd11d6625b4" + [[package]] name = "virtue" version = "0.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dcc60c0624df774c82a0ef104151231d37da4962957d691c011c852b2473314" +[[package]] +name = "virtue" +version = "0.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7302ac74a033bf17b6e609ceec0f891ca9200d502d31f02dc7908d3d98767c9d" + +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + +[[package]] +name = "vsss-rs" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fec4ebcc5594130c31b49594d55c0583fe80621f252f570b222ca4845cafd3cf" +dependencies = [ + "crypto-bigint", + "elliptic-curve", + "elliptic-curve-tools", + "generic-array 1.2.0", + "hex", + "num", + "rand_core", + "serde", + "sha3", + "subtle", + "zeroize", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wallet-utils-contract" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" +dependencies = [ + "platform-value", + "platform-version", + "serde_json", + "thiserror 1.0.69", +] + [[package]] name = "want" version = "0.3.1" @@ -2508,49 +5465,59 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.100", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2558,33 +5525,58 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.100", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "0.26.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "which" version = "4.4.2" @@ -2594,7 +5586,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix", + "rustix 0.38.44", ] [[package]] @@ -2629,12 +5621,47 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows-sys" -version = "0.48.0" +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.53.0", +] + +[[package]] +name = "windows-result" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" dependencies = [ - "windows-targets 0.48.5", + "windows-link", ] [[package]] @@ -2655,21 +5682,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - [[package]] name = "windows-targets" version = "0.52.6" @@ -2679,7 +5691,7 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", @@ -2687,10 +5699,20 @@ dependencies = [ ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" +name = "windows-targets" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] [[package]] name = "windows_aarch64_gnullvm" @@ -2699,10 +5721,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" +name = "windows_aarch64_gnullvm" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" [[package]] name = "windows_aarch64_msvc" @@ -2711,10 +5733,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] -name = "windows_i686_gnu" -version = "0.48.5" +name = "windows_aarch64_msvc" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" [[package]] name = "windows_i686_gnu" @@ -2722,6 +5744,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" @@ -2729,10 +5757,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] -name = "windows_i686_msvc" -version = "0.48.5" +name = "windows_i686_gnullvm" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" [[package]] name = "windows_i686_msvc" @@ -2741,10 +5769,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" +name = "windows_i686_msvc" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" [[package]] name = "windows_x86_64_gnu" @@ -2753,10 +5781,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" +name = "windows_x86_64_gnu" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" [[package]] name = "windows_x86_64_gnullvm" @@ -2765,10 +5793,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" +name = "windows_x86_64_gnullvm" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" [[package]] name = "windows_x86_64_msvc" @@ -2777,13 +5805,50 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "winreg" -version = "0.50.0" +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "withdrawals-contract" +version = "2.0.0-dev.1" +source = "git+https://github.com/dashpay/platform?branch=test%2Fferment#2f6eaecf3421abf4a9f5ab6ec4af5e3ed7038161" dependencies = [ - "cfg-if 1.0.0", - "windows-sys 0.48.0", + "num_enum 0.5.11", + "platform-value", + "platform-version", + "serde", + "serde_json", + "serde_repr", + "thiserror 1.0.69", ] [[package]] @@ -2798,11 +5863,20 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "yoke" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ "serde", "stable_deref_trait", @@ -2812,14 +5886,14 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", - "synstructure 0.13.1", + "syn 2.0.100", + "synstructure", ] [[package]] @@ -2828,8 +5902,16 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +dependencies = [ + "zerocopy-derive 0.8.24", ] [[package]] @@ -2840,28 +5922,39 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.100", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", ] [[package]] name = "zerofrom" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", - "synstructure 0.13.1", + "syn 2.0.100", + "synstructure", ] [[package]] @@ -2869,6 +5962,21 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "serde", + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] [[package]] name = "zerovec" @@ -2889,5 +5997,34 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.100", +] + +[[package]] +name = "zip" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27c03817464f64e23f6f37574b4fdc8cf65925b5bfd2b0f2aedf959791941f88" +dependencies = [ + "arbitrary", + "crc32fast", + "crossbeam-utils", + "flate2", + "indexmap 2.8.0", + "memchr", + "zopfli", +] + +[[package]] +name = "zopfli" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946" +dependencies = [ + "bumpalo", + "crc32fast", + "lockfree-object-pool", + "log", + "once_cell", + "simd-adler32", ] diff --git a/Cargo.toml b/Cargo.toml index 15d21312..19d106e2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,18 @@ [workspace] -resolver = "2" members = [ "dash-spv-apple-bindings", + "dash-spv-coinjoin", + "dash-spv-crypto", + "dash-spv-event-bus", "dash-spv-example-app", + "dash-spv-keychain", + "dash-spv-macro", "dash-spv-masternode-processor", + "dash-spv-platform", "logging", "reachability", ] +resolver = "2" [workspace.package] authors = ["Vladimir Pirogov "] @@ -16,7 +22,25 @@ homepage = "https://github.com/dashpay/dash-shared-core" license = "MIT" keywords = ["crypto", "dash", "spv"] +[workspace.dependencies] +dash-spv-coinjoin = { version = "0.5.1", path = "dash-spv-coinjoin" } +dash-spv-crypto = { version = "0.5.1", path = "dash-spv-crypto" } +dash-spv-event-bus = { version = "0.5.1", path = "dash-spv-event-bus" } +dash-spv-keychain = { version = "0.0.1", path = "dash-spv-keychain" } +dash-spv-macro = { version = "0.1.0", path = "dash-spv-macro" } +dash-spv-masternode-processor = { version = "0.5.1", path = "dash-spv-masternode-processor" } +dash-spv-platform = { version = "0.1.0", path = "dash-spv-platform" } +logging = { version = "0.1.0", path = "logging" } + +#[profile.test] +#default = ["use_serde", "test-helpers"] + +[profile.dev] +opt-level = 0 +debug = true # Generates DWARF debug symbols that LLDB can read +lto = false # Disables LTO to preserve function boundaries +incremental = true # Enable incremental builds for faster rebuilds + [profile.release] -lto = "thin" opt-level = 3 -#debug = true +lto = "thin" diff --git a/DashSharedCore.podspec b/DashSharedCore.podspec index b2fd71a8..3fa6789c 100644 --- a/DashSharedCore.podspec +++ b/DashSharedCore.podspec @@ -17,7 +17,7 @@ Pod::Spec.new do |s| ./build.sh CMD - s.source_files = 'dash-spv-apple-bindings/DashSharedCore/include/**/*.h' - s.ios.vendored_frameworks = 'dash-spv-apple-bindings/DashSharedCore/framework/DashSharedCore.xcframework' - s.osx.vendored_libraries = 'dash-spv-apple-bindings/DashSharedCore/lib/macos/**/*.a' + s.source_files = 'dash-spv-apple-bindings/target/include/**/*.h' + s.ios.vendored_frameworks = 'dash-spv-apple-bindings/target/framework/DashSharedCore.xcframework' + s.osx.vendored_libraries = 'dash-spv-apple-bindings/target/lib/macos/**/*.a' end diff --git a/dash-spv-apple-bindings/.gitignore b/dash-spv-apple-bindings/.gitignore index 0a7c1aab..94b225f7 100644 --- a/dash-spv-apple-bindings/.gitignore +++ b/dash-spv-apple-bindings/.gitignore @@ -4,12 +4,12 @@ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +./.cargo/ Cargo.lock DashSharedCore # These are backup files generated by rustfmt **/*.rs.bk - # Generated by Intellij Idea /.idea/ *.iml diff --git a/dash-spv-apple-bindings/Cargo.toml b/dash-spv-apple-bindings/Cargo.toml index 77eb1555..ddc5e593 100644 --- a/dash-spv-apple-bindings/Cargo.toml +++ b/dash-spv-apple-bindings/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dash_spv_apple_bindings" -version = "0.5.0" +version = "0.5.1" description = "C-bindings for using and interoperating with Dash SPV" readme = "README.md" edition = "2021" @@ -8,31 +8,96 @@ build = "build.rs" publish = true [dependencies] -logging = { path = "../logging" } -tracing = "0.1.40" +anyhow = { version = "1.0.75" } +bincode_derive = "=2.0.0-rc.3" -[dependencies.dash-spv-masternode-processor] -path = "../dash-spv-masternode-processor" -features = ["default", "generate-dashj-tests", "use_serde"] +byte = "0.2" +dash-spv-coinjoin = { workspace = true, features = [] } +dash-spv-keychain = { workspace = true } +dash-spv-crypto = { workspace = true, features = ["default"] } +dash-spv-masternode-processor = { workspace = true, features = ["default"] } +dash-spv-platform = { workspace = true } -[dependencies.dash-spv-coinjoin] -path = "../dash-spv-coinjoin" -features = [] +dashcore = { git = "https://github.com/dashpay/rust-dashcore", features = ["std", "secp-recovery", "rand", "signer", "serde", "apple", "message_verification", "quorum_validation"], default-features = false, branch = "feat/ferment" } +dash-sdk = { git = "https://github.com/dashpay/platform", branch = "test/ferment", package = "dash-sdk", features = ["apple"] } +data-contracts = { git = "https://github.com/dashpay/platform", branch = "test/ferment", package = "data-contracts", features = ["apple"] } +dpp = { git = "https://github.com/dashpay/platform", branch = "test/ferment", package = "dpp", default-features = false, features = ["dash-sdk-features", "apple"] } +drive = { git = "https://github.com/dashpay/platform", branch = "test/ferment", package = "drive", default-features = false, features = ["verify"] } +drive-proof-verifier = { git = "https://github.com/dashpay/platform", branch = "test/ferment", package = "drive-proof-verifier", default-features = false, features = ["apple"] } +platform-value = { git = "https://github.com/dashpay/platform", branch = "test/ferment", package = "platform-value", features = ["apple"] } +platform-version = { git = "https://github.com/dashpay/platform", branch = "test/ferment", package = "platform-version", features = ["apple"] } +grovedb-version = "2.2.1" +versioned-feature-core = "1.0.0" -[dependencies.rs-merk-verify-c-binding] -git = "https://github.com/dashpay/rs-merk-verify-c-binding" -branch = "for-use-in-main-crate" -version = "0.1.3" +ferment = { git = "https://github.com/dashpay/ferment", package = "ferment" } +ferment-macro = { git = "https://github.com/dashpay/ferment", package = "ferment-macro" } + +indexmap = { version = "2.0.2", features = ["serde"] } +jsonschema = "0.29.0" +logging = { path = "../logging" } +tracing = "0.1.40" +regex = { version = "1.10.4" } +serde = { version = "1.0.215", features = ["derive"], optional = true } +serde_json = { version = "1.0", features = ["preserve_order"] } +tokio = { version = "1.36.0", features = ["macros", "rt-multi-thread"] } + +[dev-dependencies] +libc = "0.2.146" +reqwest = { version = "0.12.5", features = ["blocking", "json"] } +dash-spv-masternode-processor = { workspace = true, features = ["default", "test-helpers"] } +serde = { version = "1.0.209", features = ["derive"] } [build-dependencies] -cbindgen = "0.24.3" +cbindgen = "0.28.0" +#ferment-sys = { git = "https://github.com/dashpay/ferment", package = "ferment-sys", features = ["cbindgen_only"] } +ferment-sys = { git = "https://github.com/dashpay/ferment", package = "ferment-sys" } +#ferment-sys = { git = "https://github.com/dashpay/ferment", branch = "feat/reorg", package = "ferment-sys", features = ["objc"] } +#ferment-sys = { path = "../../ferment/ferment-sys", features = ["objc"] } + +[features] +default = ["state-transitions", "std"] +bls-signatures = ["dpp/bls-signatures"] +blsful = ["dashcore/blsful"] +cbor = ["platform-value/cbor", "dpp/cbor", "dpp/ciborium"] +core2 = ["dashcore/core2"] +core-types = ["dpp/core-types"] +data-contract-cbor-conversion = ["dpp/data-contract-cbor-conversion"] +data-contract-json-conversion = ["dpp/data-contract-json-conversion"] +data-contract-value-conversion = ["dpp/data-contract-value-conversion"] +document-cbor-conversion = ["dpp/document-cbor-conversion"] +document-json-conversion = ["dpp/document-json-conversion"] +document-value-conversion = ["dpp/document-value-conversion"] +extended-document = ["dpp/extended-document"] +factories = ["dpp/factories"] +fee-distribution = ["dpp/fee-distribution"] +fixtures-and-mocks = ["dpp/fixtures-and-mocks"] +identity-cbor-conversion = ["dpp/identity-cbor-conversion"] +identity-json-conversion = ["dpp/identity-json-conversion"] +identity-value-conversion = ["dpp/identity-value-conversion"] +json = ["platform-value/serde_json"] +json-object = ["dpp/json-object"] +json-schema-validation = ["dpp/json-schema-validation"] +message-signing = ["dpp/message-signing"] +message_verification = ["dashcore/message_verification"] +mocks = ["dash-sdk/mocks"] +mock-versions = ["platform-version/mock-versions"] +objc = ["ferment-sys/objc"] +cbindgen_only = ["ferment-sys/cbindgen_only"] +platform-value = ["dpp/platform-value"] +state-transitions = ["dpp/state-transitions", "dash-spv-platform/state-transitions"] +state-transition-json-conversion = ["dpp/state-transition-json-conversion"] +state-transition-validation = ["dpp/state-transition-validation"] +state-transition-signing = ["dpp/state-transition-signing"] +std = ["platform-value/std", "dashcore/std", "dash-spv-masternode-processor/std"] +system_contracts = ["dpp/system_contracts"] +test-helpers = ["dash-spv-masternode-processor/test-helpers"] +use_serde = ["serde", "dash-spv-masternode-processor/use_serde", "dash-spv-crypto/use_serde"] +validation = ["dpp/validation"] [lib] name = "dash_spv_apple_bindings" crate-type = ["staticlib", "cdylib"] -#[profile.release] -#lto = "thin" -#opt-level = 3 -#debug = true +[package.metadata] +ios-deployment-target = "12.0" # Set to a common minimum target (e.g., 12.0) diff --git a/dash-spv-apple-bindings/README.md b/dash-spv-apple-bindings/README.md index 2571f235..b95b6029 100644 --- a/dash-spv-apple-bindings/README.md +++ b/dash-spv-apple-bindings/README.md @@ -6,3 +6,6 @@ To release it as cocoapod don't forget to - tag commit with version - and push it to spec repo: - pod trunk push DashSharedCore.podspec --allow-warnings + +- if the bls fails to compile, try to remove git cache (rm -rf /Users/$USER/.cargo/git/checkouts/bls-signatures-*) and try again +- To compile in debug mode with lldb support use `cd dash-spv-apple-bindings && ./build.sh debug` \ No newline at end of file diff --git a/dash-spv-apple-bindings/build.rs b/dash-spv-apple-bindings/build.rs index e5d8526e..a0454546 100644 --- a/dash-spv-apple-bindings/build.rs +++ b/dash-spv-apple-bindings/build.rs @@ -1,36 +1,44 @@ extern crate cbindgen; +extern crate ferment_sys; -use std::env; +use ferment_sys::Ferment; +// #[cfg(feature = "objc")] +// use ferment_sys::{Lang, ObjC, XCodeConfig}; fn main() { - let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); - // Here we write down crate names (!) where we want to retrieve C-bindings - let includes = vec![ - "dash-spv-masternode-processor".to_string(), - "dash-spv-coinjoin".to_string(), - "rs-merk-verify-c-binding".to_string() - ]; - let config = cbindgen::Config { - language: cbindgen::Language::C, - parse: cbindgen::ParseConfig { - parse_deps: true, - include: Some(includes.clone()), - extra_bindings: includes, - ..Default::default() - }, - enumeration: cbindgen::EnumConfig { - prefix_with_name: true, - ..Default::default() - }, - braces: cbindgen::Braces::SameLine, - line_length: 80, - tab_width: 4, - // cpp_compat: false, - documentation_style: cbindgen::DocumentationStyle::C, - include_guard: Some("dash_shared_core_h".to_string()), - ..Default::default() - }; - cbindgen::generate_with_config(&crate_dir, config) - .unwrap() - .write_to_file("../target/dash_shared_core.h"); + if let Ok(profile) = std::env::var("CARGO_PROFILE") { + if profile == "debug" { + println!("Skipping build.rs in debug mode"); + return; // Exit early in debug mode + } + } + + match Ferment::with_crate_name("dash_spv_apple_bindings") + .with_cbindgen_config_from_file("cbindgen.toml") + .with_default_mod_name() + .with_external_crates(vec![ + "dash-spv-coinjoin", + "dash-spv-crypto", + "dash-spv-keychain", + "dash-spv-masternode-processor", + "dash-spv-platform", + "dash-sdk", + "platform-value", + "platform-version", + "data-contracts", + "dpp", + "drive-proof-verifier", + "rs-dapi-client", + "dashcore", + "dashcore_hashes", + "versioned-feature-core", + ]) + // .with_languages(vec![ + // #[cfg(feature = "objc")] + // Lang::ObjC(ObjC::new(XCodeConfig::new("DS", "DashSharedCore", "dash_shared_core"))), + // ]) + .generate() { + Ok(_) => println!("[ferment] [ok]"), + Err(err) => panic!("[ferment] [err]: {}", err) + } } diff --git a/dash-spv-apple-bindings/build.sh b/dash-spv-apple-bindings/build.sh index a05425b1..07d4f786 100755 --- a/dash-spv-apple-bindings/build.sh +++ b/dash-spv-apple-bindings/build.sh @@ -1,15 +1,23 @@ #!/bin/bash set -ex - +BUILD_TYPE=${1:-release} # Default to "release", override with "debug" if passed +if [[ "$BUILD_TYPE" == "release" ]]; then + BUILD_FLAG="release" +else + BUILD_FLAG="" +fi +#FEATURES="objc" echo "Building Dash Shared Core..." pwd compare_version() { - if [[ $1 == $2 ]]; then + # shellcheck disable=SC2053 + if [[ $1 == $2 ]]; then return 1 fi local IFS=. + # shellcheck disable=SC2206 local i a=(${1%%[^0-9.]*}) b=(${2%%[^0-9.]*}) local arem=${1#${1%%[^0-9.]*}} brem=${2#${2%%[^0-9.]*}} for ((i=0; i<${#a[@]} || i<${#b[@]}; i++)); do @@ -26,56 +34,76 @@ compare_version() { fi return 1 } -#REQUIRED_VERSION=1.66.0 REQUIRED_VERSION=1.80.1 CURRENT_VERSION=$(rustc -V | awk '{sub(/-.*/,"");print $2}') +FRAMEWORK=DashSharedCore +LIB_NAME=dash_spv_apple_bindings +OBJC=false +WRAPPER=objc_wrapper + echo "rustc -V: current ${CURRENT_VERSION} vs. required ${REQUIRED_VERSION}" if compare_version "${REQUIRED_VERSION}" "${CURRENT_VERSION}"; then echo "ERROR: rustc version ${CURRENT_VERSION} not supported, please upgrade to at least ${REQUIRED_VERSION}" exit 1 fi +#cargo clean && cargo update cargo install cargo-lipo +for target in "x86_64-apple-darwin" "aarch64-apple-darwin" "x86_64-apple-ios" "aarch64-apple-ios" "aarch64-apple-ios-sim"; do + if ! rustup target list | grep -q "${target} (installed)"; then + rustup target add "$target" + fi +done -rm -rf DashSharedCore/include -rm -rf DashSharedCore/lib/macos -rm -rf DashSharedCore/framework -rm -rf DashSharedCore/lib/ios -rm -rf DashSharedCore/lib/ios-simulator - -rustup target add x86_64-apple-darwin -rustup target add aarch64-apple-darwin -rustup target add x86_64-apple-ios -rustup target add aarch64-apple-ios -rustup target add aarch64-apple-ios-sim +rm -rf target/{framework,include,lib} +cargo lipo --$BUILD_FLAG +build_targets=( + "x86_64-apple-ios" + "aarch64-apple-ios" + "aarch64-apple-ios-sim" + "x86_64-apple-darwin" + "aarch64-apple-darwin" -cargo lipo --release -cargo build --target=x86_64-apple-darwin --release -cargo build --target=aarch64-apple-darwin --release -cargo build --target=x86_64-apple-ios --release -cargo build --target=aarch64-apple-ios --release -cargo build --target=aarch64-apple-ios-sim --release +) +for target in "${build_targets[@]}"; do + if [ ! -f "../../target/$target/$BUILD_TYPE/lib${LIB_NAME}.a" ]; then + if $OBJC; then + cargo build --target="$target" --features=objc --"$BUILD_FLAG" & + else + cargo build --target="$target" --"$BUILD_FLAG" & + fi + fi +done +wait +mkdir -p target/{framework,include,lib/{ios,ios-simulator,macos}} -mkdir -p DashSharedCore/framework -mkdir -p DashSharedCore/include -mkdir -p DashSharedCore/lib/ios -mkdir -p DashSharedCore/lib/ios-simulator -mkdir -p DashSharedCore/lib/macos +lipo -create ../target/x86_64-apple-darwin/"$BUILD_TYPE"/lib${LIB_NAME}.a \ + ../target/aarch64-apple-darwin/"$BUILD_TYPE"/lib${LIB_NAME}.a \ + -output target/lib/macos/lib${LIB_NAME}_macos.a -lipo -create ../target/x86_64-apple-darwin/release/libdash_spv_apple_bindings.a \ - ../target/aarch64-apple-darwin/release/libdash_spv_apple_bindings.a \ - -output DashSharedCore/lib/macos/libdash_shared_core_macos.a +cp -r -p ../target/aarch64-apple-ios/"$BUILD_TYPE"/lib${LIB_NAME}.a target/lib/ios/lib${LIB_NAME}_ios.a & +lipo -create ../target/x86_64-apple-ios/"$BUILD_TYPE"/lib${LIB_NAME}.a \ + ../target/aarch64-apple-ios-sim/"$BUILD_TYPE"/lib${LIB_NAME}.a \ + -output target/lib/ios-simulator/lib${LIB_NAME}_ios.a & +wait +wait -cp -r -p ../target/dash_shared_core.h DashSharedCore/include -cp -r -p ../target/aarch64-apple-ios/release/libdash_spv_apple_bindings.a DashSharedCore/lib/ios/libdash_shared_core_ios.a +if $OBJC; then + if which clang-format >/dev/null; then + find target/include -name ${WRAPPER}.h -print0 | xargs -0 clang-format -i -style=file + else + echo "warning: clang-format not installed, install it by running $(brew install clang-format)" + fi +fi -lipo -create ../target/x86_64-apple-ios/release/libdash_spv_apple_bindings.a \ - ../target/aarch64-apple-ios-sim/release/libdash_spv_apple_bindings.a \ - -output DashSharedCore/lib/ios-simulator/libdash_shared_core_ios.a +sed -i '' '/#ifndef/ a\ +typedef struct Runtime Runtime; +' target/include/dash_spv_apple_bindings.h xcodebuild -create-xcframework \ - -library DashSharedCore/lib/ios/libdash_shared_core_ios.a -headers DashSharedCore/include \ - -library DashSharedCore/lib/ios-simulator/libdash_shared_core_ios.a -headers DashSharedCore/include \ - -output DashSharedCore/framework/DashSharedCore.xcframework + -library target/lib/ios/lib${LIB_NAME}_ios.a -headers target/include \ + -library target/lib/ios-simulator/lib${LIB_NAME}_ios.a -headers target/include \ + -output target/framework/${FRAMEWORK}.xcframework \ +# IPHONEOS_DEPLOYMENT_TARGET=15.6 echo "Done building Dash Shared Core" diff --git a/dash-spv-apple-bindings/cbindgen.toml b/dash-spv-apple-bindings/cbindgen.toml index 11d935b6..a4c71301 100644 --- a/dash-spv-apple-bindings/cbindgen.toml +++ b/dash-spv-apple-bindings/cbindgen.toml @@ -1,10 +1,137 @@ language = "C" autogen_warning = "/* This file is autogenerated by cbindgen. Don't modify this manually. */" -cpp_compat = true +#cpp_compat = true braces = "SameLine" line_length = 80 tab_width = 4 documentation_style = "c" -style = "tag" -swift_enum_macro = "CF_ENUM" -include_guard = "dash_shared_core_h" +#style = "tag" +#swift_enum_macro = "CF_ENUM" +include_guard = "dash_spv_apple_bindings_h" +#trailer = "typedef struct Runtime Runtime;" +[parse] +parse_deps = true +#expand = ["dash-spv-masternode-processor", ] +include = [ + "ferment", + "dash-spv-coinjoin", + "dash-spv-crypto", + "dash-spv-keychain", + "dash-spv-masternode-processor", + "dash-spv-platform", + "dash-sdk", + "data-contracts", + "platform-value", + "platform-version", + # TODO: cbindgen fails with this crate for some reason so it doesn't expose opaque types +# "dpp", + "drive-proof-verifier", + "rs-dapi-client", + "rs-merk-verify-c-binding", + "dashcore", + "dashcore_hashes", + "tokio", + "versioned-feature-core" +] +extra_bindings = [ + "ferment", + "dash-spv-coinjoin", + "dash-spv-crypto", + "dash-spv-keychain", + "dash-spv-masternode-processor", + "dash-spv-platform", + "dash-sdk", + "data-contracts", + "platform-value", + "platform-version", + "dpp", + "drive-proof-verifier", + "rs-dapi-client", + "rs-merk-verify-c-binding", + "dashcore", + "dashcore_hashes", + "tokio", + "versioned-feature-core" +] + +[enum] +prefix_with_name = true + +[defines] +"test" = "TEST" +"feature = bls-signatures" = "DPP_BLS_SIGNATURES" +"feature = cbor" = "CBOR_AND_CBORIUM" +"feature = core-types" = "DS_CORE_TYPES" +"feature = data-contract-cbor-conversion" = "DPP_DATA_CONTRACT_CBOR_CONVERSION" +"feature = data-contract-json-conversion" = "DPP_DATA_CONTRACT_JSON_CONVERSION" +"feature = data-contract-value-conversion" = "DPP_DATA_CONTRACT_VALUE_CONVERSION" +"feature = document-cbor-conversion" = "DPP_DOCUMENT_CBOR_CONVERSION" +"feature = document-json-conversion" = "DPP_DOCUMENT_JSON_CONVERSION" +"feature = document-value-conversion" = "DPP_DOCUMENT_VALUE_CONVERSION" +"feature = extended-document" = "DPP_EXTENDED_DOCUMENT" +"feature = factories" = "DPP_FACTORIES" +"feature = fee-distribution" = "DPP_FEE_DISTRIBUTION" +"feature = fixtures-and-mocks" = "DPP_FIXTURES_AND_MOCKS" +"feature = identity-cbor-conversion" = "DPP_IDENTITY_CBOR_CONVERSION" +"feature = identity-json-conversion" = "DPP_IDENTITY_JSON_CONVERSION" +"feature = identity-value-conversion" = "DPP_IDENTITY_VALUE_CONVERSION" +"feature = json" = "PLATFORM_VALUE_SERDE_JSON" +"feature = json-object" = "DPP_JSON_OBJECT" +"feature = json-schema-validation" = "DPP_JSON_SCHEMA_VALIDATION" +"feature = message_verification" = "DASHCORE_MESSAGE_VERIFICATION" +"feature = message-signing" = "DPP_MESSAGE_SIGNING" +"feature = mocks" = "DASH_SDK_MOCKS" +"feature = mock-versions" = "PLATFORM_VERSION_MOCK_VERSIONS" +"feature = platform-value" = "DPP_PLATFORM_VALUE" +"feature = state-transitions" = "DPP_STATE_TRANSITIONS" +"feature = state-transition-json-conversion" = "DPP_STATE_TRANSITION_JSON_CONVERSION" +"feature = state-transition-validation" = "DPP_STATE_TRANSITION_VALIDATION" +"feature = state-transition-signing" = "DPP_STATE_TRANSITION_SIGNING" +"feature = std" = "PLATFORM_VALUE_STD" +"feature = system_contracts" = "DPP_SYSTEM_CONTRACTS" +"feature = validation" = "DPP_VALIDATION" + +#rename_variants = "None" +## must_use = "MUST_USE_ENUM" +#add_sentinel = false +#derive_helper_methods = false +#derive_const_casts = false +#derive_mut_casts = false +## cast_assert_name = "ASSERT" +#derive_tagged_enum_destructor = false +#derive_tagged_enum_copy_constructor = false +#enum_class = true +#private_default_tagged_enum_constructor = false + + +#// Here we write down crate names (!) where we want to retrieve C-bindings +#let includes = vec![ +#"dash-spv-masternode-processor".to_string(), +#"rs-merk-verify-c-binding".to_string() +#]; +#let config = cbindgen::Config { +#language: cbindgen::Language::C, +#parse: cbindgen::ParseConfig { +#parse_deps: true, +#include: Some(includes.clone()), +#extra_bindings: includes.clone(), +#expand: cbindgen::ParseExpandConfig { +#crates: includes.clone(), +#..Default::default() +#}, +#..Default::default() +#}, +#enumeration: cbindgen::EnumConfig { +#prefix_with_name: true, +#..Default::default() +#}, +#braces: cbindgen::Braces::SameLine, +#line_length: 80, +#tab_width: 4, +#documentation_style: cbindgen::DocumentationStyle::C, +#include_guard: Some("dash_shared_core_h".to_string()), +#..Default::default() +#}; +#cbindgen::generate_with_config(&crate_dir, config) +#.unwrap() +#.write_to_file("../target/dash_shared_core.h"); diff --git a/dash-spv-masternode-processor/files/QRINFO_1_21976.dat b/dash-spv-apple-bindings/files/devnet-333/QRINFO_1_21976__70221.dat similarity index 100% rename from dash-spv-masternode-processor/files/QRINFO_1_21976.dat rename to dash-spv-apple-bindings/files/devnet-333/QRINFO_1_21976__70221.dat diff --git a/dash-spv-masternode-processor/files/QRINFO_1_8344.dat b/dash-spv-apple-bindings/files/devnet-333/QRINFO_1_8344.dat similarity index 100% rename from dash-spv-masternode-processor/files/QRINFO_1_8344.dat rename to dash-spv-apple-bindings/files/devnet-333/QRINFO_1_8344.dat diff --git a/dash-spv-masternode-processor/files/mnlistdiff--1-25480.dat b/dash-spv-apple-bindings/files/devnet-333/mnlistdiff--1-25480.dat similarity index 100% rename from dash-spv-masternode-processor/files/mnlistdiff--1-25480.dat rename to dash-spv-apple-bindings/files/devnet-333/mnlistdiff--1-25480.dat diff --git a/dash-spv-masternode-processor/files/qrinfo--1-24868.dat b/dash-spv-apple-bindings/files/devnet-333/qrinfo--1-24868.dat similarity index 100% rename from dash-spv-masternode-processor/files/qrinfo--1-24868.dat rename to dash-spv-apple-bindings/files/devnet-333/qrinfo--1-24868.dat diff --git a/dash-spv-masternode-processor/files/MNL_1_9247.dat b/dash-spv-apple-bindings/files/devnet-chacha/MNL_1_9247.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1_9247.dat rename to dash-spv-apple-bindings/files/devnet-chacha/MNL_1_9247.dat diff --git a/dash-spv-masternode-processor/files/QRINFO_1_107966.dat b/dash-spv-apple-bindings/files/devnet-jack-daniels/QRINFO_1_107966__70221.dat similarity index 100% rename from dash-spv-masternode-processor/files/QRINFO_1_107966.dat rename to dash-spv-apple-bindings/files/devnet-jack-daniels/QRINFO_1_107966__70221.dat diff --git a/dash-spv-masternode-processor/files/devnet-screwdriver/MNL_1_4968.dat b/dash-spv-apple-bindings/files/devnet-screwdriver/MNL_1_4968.dat similarity index 100% rename from dash-spv-masternode-processor/files/devnet-screwdriver/MNL_1_4968.dat rename to dash-spv-apple-bindings/files/devnet-screwdriver/MNL_1_4968.dat diff --git a/dash-spv-masternode-processor/files/devnet-screwdriver/MNL_1_5040.dat b/dash-spv-apple-bindings/files/devnet-screwdriver/MNL_1_5040.dat similarity index 100% rename from dash-spv-masternode-processor/files/devnet-screwdriver/MNL_1_5040.dat rename to dash-spv-apple-bindings/files/devnet-screwdriver/MNL_1_5040.dat diff --git a/dash-spv-masternode-processor/files/devnet-screwdriver/MNL_4968_4992.dat b/dash-spv-apple-bindings/files/devnet-screwdriver/MNL_4968_4992.dat similarity index 100% rename from dash-spv-masternode-processor/files/devnet-screwdriver/MNL_4968_4992.dat rename to dash-spv-apple-bindings/files/devnet-screwdriver/MNL_4968_4992.dat diff --git a/dash-spv-masternode-processor/files/devnet-screwdriver/MNL_4992_4993.dat b/dash-spv-apple-bindings/files/devnet-screwdriver/MNL_4992_4993.dat similarity index 100% rename from dash-spv-masternode-processor/files/devnet-screwdriver/MNL_4992_4993.dat rename to dash-spv-apple-bindings/files/devnet-screwdriver/MNL_4992_4993.dat diff --git a/dash-spv-masternode-processor/files/devnet-screwdriver/MNL_4993_4994.dat b/dash-spv-apple-bindings/files/devnet-screwdriver/MNL_4993_4994.dat similarity index 100% rename from dash-spv-masternode-processor/files/devnet-screwdriver/MNL_4993_4994.dat rename to dash-spv-apple-bindings/files/devnet-screwdriver/MNL_4993_4994.dat diff --git a/dash-spv-masternode-processor/files/devnet-screwdriver/MNL_4994_4995.dat b/dash-spv-apple-bindings/files/devnet-screwdriver/MNL_4994_4995.dat similarity index 100% rename from dash-spv-masternode-processor/files/devnet-screwdriver/MNL_4994_4995.dat rename to dash-spv-apple-bindings/files/devnet-screwdriver/MNL_4994_4995.dat diff --git a/dash-spv-masternode-processor/files/devnet-screwdriver/MNL_4995_4996.dat b/dash-spv-apple-bindings/files/devnet-screwdriver/MNL_4995_4996.dat similarity index 100% rename from dash-spv-masternode-processor/files/devnet-screwdriver/MNL_4995_4996.dat rename to dash-spv-apple-bindings/files/devnet-screwdriver/MNL_4995_4996.dat diff --git a/dash-spv-masternode-processor/files/devnet-screwdriver/MNL_4996_5016.dat b/dash-spv-apple-bindings/files/devnet-screwdriver/MNL_4996_5016.dat similarity index 100% rename from dash-spv-masternode-processor/files/devnet-screwdriver/MNL_4996_5016.dat rename to dash-spv-apple-bindings/files/devnet-screwdriver/MNL_4996_5016.dat diff --git a/dash-spv-masternode-processor/files/devnet-screwdriver/MNL_5016_5032.dat b/dash-spv-apple-bindings/files/devnet-screwdriver/MNL_5016_5032.dat similarity index 100% rename from dash-spv-masternode-processor/files/devnet-screwdriver/MNL_5016_5032.dat rename to dash-spv-apple-bindings/files/devnet-screwdriver/MNL_5016_5032.dat diff --git a/dash-spv-masternode-processor/files/devnet-screwdriver/MNL_5032_5040.dat b/dash-spv-apple-bindings/files/devnet-screwdriver/MNL_5032_5040.dat similarity index 100% rename from dash-spv-masternode-processor/files/devnet-screwdriver/MNL_5032_5040.dat rename to dash-spv-apple-bindings/files/devnet-screwdriver/MNL_5032_5040.dat diff --git a/dash-spv-masternode-processor/files/devnet-screwdriver/MNL_5040_5064.dat b/dash-spv-apple-bindings/files/devnet-screwdriver/MNL_5040_5064.dat similarity index 100% rename from dash-spv-masternode-processor/files/devnet-screwdriver/MNL_5040_5064.dat rename to dash-spv-apple-bindings/files/devnet-screwdriver/MNL_5040_5064.dat diff --git a/dash-spv-masternode-processor/files/devnet-screwdriver/MNL_5064_5088.dat b/dash-spv-apple-bindings/files/devnet-screwdriver/MNL_5064_5088.dat similarity index 100% rename from dash-spv-masternode-processor/files/devnet-screwdriver/MNL_5064_5088.dat rename to dash-spv-apple-bindings/files/devnet-screwdriver/MNL_5064_5088.dat diff --git a/dash-spv-masternode-processor/files/devnet-screwdriver/MNL_5088_5112.dat b/dash-spv-apple-bindings/files/devnet-screwdriver/MNL_5088_5112.dat similarity index 100% rename from dash-spv-masternode-processor/files/devnet-screwdriver/MNL_5088_5112.dat rename to dash-spv-apple-bindings/files/devnet-screwdriver/MNL_5088_5112.dat diff --git a/dash-spv-masternode-processor/files/devnet-screwdriver/MNL_5112_5140.dat b/dash-spv-apple-bindings/files/devnet-screwdriver/MNL_5112_5140.dat similarity index 100% rename from dash-spv-masternode-processor/files/devnet-screwdriver/MNL_5112_5140.dat rename to dash-spv-apple-bindings/files/devnet-screwdriver/MNL_5112_5140.dat diff --git a/dash-spv-masternode-processor/files/devnet-screwdriver/QRINFO_1_5140.dat b/dash-spv-apple-bindings/files/devnet-screwdriver/QRINFO_1_5140.dat similarity index 100% rename from dash-spv-masternode-processor/files/devnet-screwdriver/QRINFO_1_5140.dat rename to dash-spv-apple-bindings/files/devnet-screwdriver/QRINFO_1_5140.dat diff --git a/dash-spv-masternode-processor/files/devnet-screwdriver/QRINFO_5032_5140.dat b/dash-spv-apple-bindings/files/devnet-screwdriver/QRINFO_5032_5140.dat similarity index 100% rename from dash-spv-masternode-processor/files/devnet-screwdriver/QRINFO_5032_5140.dat rename to dash-spv-apple-bindings/files/devnet-screwdriver/QRINFO_5032_5140.dat diff --git a/dash-spv-masternode-processor/files/1738792.txt b/dash-spv-apple-bindings/files/mainnet/1738792.txt similarity index 100% rename from dash-spv-masternode-processor/files/1738792.txt rename to dash-spv-apple-bindings/files/mainnet/1738792.txt diff --git a/dash-spv-masternode-processor/files/1738792_diff.txt b/dash-spv-apple-bindings/files/mainnet/1738792_diff.txt similarity index 100% rename from dash-spv-masternode-processor/files/1738792_diff.txt rename to dash-spv-apple-bindings/files/mainnet/1738792_diff.txt diff --git a/dash-spv-masternode-processor/files/1738840.txt b/dash-spv-apple-bindings/files/mainnet/1738840.txt similarity index 100% rename from dash-spv-masternode-processor/files/1738840.txt rename to dash-spv-apple-bindings/files/mainnet/1738840.txt diff --git a/dash-spv-masternode-processor/files/1738840_diff.txt b/dash-spv-apple-bindings/files/mainnet/1738840_diff.txt similarity index 100% rename from dash-spv-masternode-processor/files/1738840_diff.txt rename to dash-spv-apple-bindings/files/mainnet/1738840_diff.txt diff --git a/dash-spv-masternode-processor/files/1738888.txt b/dash-spv-apple-bindings/files/mainnet/1738888.txt similarity index 100% rename from dash-spv-masternode-processor/files/1738888.txt rename to dash-spv-apple-bindings/files/mainnet/1738888.txt diff --git a/dash-spv-masternode-processor/files/1738888_diff.txt b/dash-spv-apple-bindings/files/mainnet/1738888_diff.txt similarity index 100% rename from dash-spv-masternode-processor/files/1738888_diff.txt rename to dash-spv-apple-bindings/files/mainnet/1738888_diff.txt diff --git a/dash-spv-masternode-processor/files/1738936.txt b/dash-spv-apple-bindings/files/mainnet/1738936.txt similarity index 100% rename from dash-spv-masternode-processor/files/1738936.txt rename to dash-spv-apple-bindings/files/mainnet/1738936.txt diff --git a/dash-spv-masternode-processor/files/ML1720000.dat b/dash-spv-apple-bindings/files/mainnet/ML1720000.dat similarity index 100% rename from dash-spv-masternode-processor/files/ML1720000.dat rename to dash-spv-apple-bindings/files/mainnet/ML1720000.dat diff --git a/dash-spv-masternode-processor/files/MNLIST_1761048_1666773093.153379_saveMasternodeList.json b/dash-spv-apple-bindings/files/mainnet/MNLIST_1761048_1666773093.153379_saveMasternodeList.json similarity index 100% rename from dash-spv-masternode-processor/files/MNLIST_1761048_1666773093.153379_saveMasternodeList.json rename to dash-spv-apple-bindings/files/mainnet/MNLIST_1761048_1666773093.153379_saveMasternodeList.json diff --git a/dash-spv-masternode-processor/files/MNLIST_1761054_1666771101.811508_saveMasternodeList.json b/dash-spv-apple-bindings/files/mainnet/MNLIST_1761054_1666771101.811508_saveMasternodeList.json similarity index 100% rename from dash-spv-masternode-processor/files/MNLIST_1761054_1666771101.811508_saveMasternodeList.json rename to dash-spv-apple-bindings/files/mainnet/MNLIST_1761054_1666771101.811508_saveMasternodeList.json diff --git a/dash-spv-masternode-processor/files/MNL_0_1090944.dat b/dash-spv-apple-bindings/files/mainnet/MNL_0_1090944.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_0_1090944.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_0_1090944.dat diff --git a/dash-spv-masternode-processor/files/MNL_0_1096704.dat b/dash-spv-apple-bindings/files/mainnet/MNL_0_1096704.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_0_1096704.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_0_1096704.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_0_1870840.dat b/dash-spv-apple-bindings/files/mainnet/MNL_0_1870840__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_0_1870840.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_0_1870840__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_0_1870848.dat b/dash-spv-apple-bindings/files/mainnet/MNL_0_1870848__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_0_1870848.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_0_1870848__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_1090944_1091520.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1090944_1091520.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1090944_1091520.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1090944_1091520.dat diff --git a/dash-spv-masternode-processor/files/MNL_1091520_1091808.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1091520_1091808.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1091520_1091808.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1091520_1091808.dat diff --git a/dash-spv-masternode-processor/files/MNL_1091808_1092096.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1091808_1092096.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1091808_1092096.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1091808_1092096.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092096_1092336.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092096_1092336.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092096_1092336.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092096_1092336.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092336_1092360.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092336_1092360.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092336_1092360.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092336_1092360.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092360_1092384.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092360_1092384.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092360_1092384.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092360_1092384.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092384_1092408.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092384_1092408.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092384_1092408.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092384_1092408.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092408_1092432.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092408_1092432.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092408_1092432.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092408_1092432.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092432_1092456.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092432_1092456.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092432_1092456.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092432_1092456.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092456_1092480.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092456_1092480.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092456_1092480.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092456_1092480.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092480_1092504.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092480_1092504.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092480_1092504.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092480_1092504.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092504_1092528.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092504_1092528.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092504_1092528.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092504_1092528.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092528_1092552.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092528_1092552.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092528_1092552.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092528_1092552.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092552_1092576.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092552_1092576.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092552_1092576.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092552_1092576.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092576_1092600.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092576_1092600.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092576_1092600.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092576_1092600.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092600_1092624.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092600_1092624.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092600_1092624.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092600_1092624.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092624_1092648.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092624_1092648.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092624_1092648.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092624_1092648.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092648_1092672.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092648_1092672.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092648_1092672.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092648_1092672.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092672_1092696.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092672_1092696.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092672_1092696.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092672_1092696.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092696_1092720.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092696_1092720.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092696_1092720.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092696_1092720.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092720_1092744.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092720_1092744.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092720_1092744.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092720_1092744.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092744_1092768.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092744_1092768.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092744_1092768.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092744_1092768.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092768_1092792.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092768_1092792.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092768_1092792.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092768_1092792.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092792_1092816.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092792_1092816.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092792_1092816.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092792_1092816.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092816_1092840.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092816_1092840.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092816_1092840.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092816_1092840.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092840_1092864.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092840_1092864.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092840_1092864.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092840_1092864.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092864_1092888.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092864_1092888.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092864_1092888.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092864_1092888.dat diff --git a/dash-spv-masternode-processor/files/MNL_1092888_1092916.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1092888_1092916.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1092888_1092916.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1092888_1092916.dat diff --git a/dash-spv-masternode-processor/files/MNL_1096704_1097280.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1096704_1097280.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1096704_1097280.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1096704_1097280.dat diff --git a/dash-spv-masternode-processor/files/MNL_1097280_1097856.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1097280_1097856.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1097280_1097856.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1097280_1097856.dat diff --git a/dash-spv-masternode-processor/files/MNL_1097856_1098144.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1097856_1098144.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1097856_1098144.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1097856_1098144.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098144_1098432.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098144_1098432.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098144_1098432.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098144_1098432.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098432_1098456.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098432_1098456.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098432_1098456.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098432_1098456.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098456_1098480.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098456_1098480.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098456_1098480.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098456_1098480.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098480_1098504.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098480_1098504.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098480_1098504.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098480_1098504.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098504_1098528.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098504_1098528.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098504_1098528.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098504_1098528.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098528_1098552.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098528_1098552.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098528_1098552.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098528_1098552.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098552_1098576.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098552_1098576.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098552_1098576.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098552_1098576.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098576_1098600.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098576_1098600.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098576_1098600.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098576_1098600.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098600_1098624.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098600_1098624.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098600_1098624.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098600_1098624.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098624_1098648.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098624_1098648.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098624_1098648.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098624_1098648.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098648_1098672.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098648_1098672.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098648_1098672.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098648_1098672.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098672_1098696.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098672_1098696.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098672_1098696.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098672_1098696.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098696_1098720.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098696_1098720.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098696_1098720.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098696_1098720.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098720_1098744.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098720_1098744.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098720_1098744.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098720_1098744.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098744_1098768.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098744_1098768.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098744_1098768.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098744_1098768.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098768_1098792.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098768_1098792.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098768_1098792.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098768_1098792.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098792_1098816.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098792_1098816.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098792_1098816.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098792_1098816.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098888_1098912.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098888_1098912.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098888_1098912.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098888_1098912.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098912_1098936.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098912_1098936.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098912_1098936.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098912_1098936.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098936_1098960.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098936_1098960.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098936_1098960.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098936_1098960.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098960_1098984.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098960_1098984.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098960_1098984.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098960_1098984.dat diff --git a/dash-spv-masternode-processor/files/MNL_1098984_1099008.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1098984_1099008.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1098984_1099008.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1098984_1099008.dat diff --git a/dash-spv-apple-bindings/files/mainnet/MNL_1720000_2187936__70235.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1720000_2187936__70235.dat new file mode 100644 index 00000000..dd8fb7f7 Binary files /dev/null and b/dash-spv-apple-bindings/files/mainnet/MNL_1720000_2187936__70235.dat differ diff --git a/dash-spv-apple-bindings/files/mainnet/MNL_1720000_2189098__70235.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1720000_2189098__70235.dat new file mode 100644 index 00000000..f9178ae7 Binary files /dev/null and b/dash-spv-apple-bindings/files/mainnet/MNL_1720000_2189098__70235.dat differ diff --git a/dash-spv-masternode-processor/files/MNL_1761054_1761100.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1761054_1761100.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_1761054_1761100.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1761054_1761100.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1870840_1871712.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1870840_1871712__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1870840_1871712.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1870840_1871712__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1870848_1871136.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1870848_1871136__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1870848_1871136.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1870848_1871136__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871136_1871184.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871136_1871184__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871136_1871184.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871136_1871184__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871184_1871208.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871184_1871208__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871184_1871208.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871184_1871208__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871208_1871232.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871208_1871232__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871208_1871232.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871208_1871232__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871232_1871256.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871232_1871256__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871232_1871256.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871232_1871256__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871256_1871280.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871256_1871280__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871256_1871280.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871256_1871280__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871280_1871304.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871280_1871304__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871280_1871304.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871280_1871304__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871304_1871328.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871304_1871328__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871304_1871328.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871304_1871328__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871328_1871352.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871328_1871352__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871328_1871352.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871328_1871352__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871352_1871376.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871352_1871376__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871352_1871376.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871352_1871376__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871376_1871400.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871376_1871400__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871376_1871400.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871376_1871400__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871400_1871424.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871400_1871424__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871400_1871424.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871400_1871424__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871424_1871448.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871424_1871448__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871424_1871448.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871424_1871448__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871448_1871472.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871448_1871472__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871448_1871472.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871448_1871472__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871472_1871496.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871472_1871496__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871472_1871496.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871472_1871496__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871496_1871520.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871496_1871520__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871496_1871520.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871496_1871520__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871520_1871544.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871520_1871544__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871520_1871544.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871520_1871544__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871544_1871568.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871544_1871568__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871544_1871568.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871544_1871568__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871568_1871592.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871568_1871592__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871568_1871592.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871568_1871592__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871592_1871616.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871592_1871616__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871592_1871616.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871592_1871616__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871616_1871640.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871616_1871640__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871616_1871640.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871616_1871640__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871640_1871664.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871640_1871664__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871640_1871664.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871640_1871664__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871664_1871688.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871664_1871688__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871664_1871688.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871664_1871688__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871688_1871712.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871688_1871712__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871688_1871712.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871688_1871712__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871712_1871722.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871712_1871722__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871712_1871722.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871712_1871722__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871712_1871736.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871712_1871736__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871712_1871736.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871712_1871736__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871722_1871724.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871722_1871724__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871722_1871724.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871722_1871724__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871724_1871726.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871724_1871726__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871724_1871726.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871724_1871726__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871726_1871727.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871726_1871727__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871726_1871727.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871726_1871727__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871727_1871730.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871727_1871730__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871727_1871730.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871727_1871730__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871730_1871733.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871730_1871733__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871730_1871733.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871730_1871733__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871733_1871734.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871733_1871734__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871733_1871734.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871733_1871734__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871734_1871738.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871734_1871738__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871734_1871738.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871734_1871738__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871736_1871755.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871736_1871755__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871736_1871755.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871736_1871755__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1871738_1872001.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1871738_1872001__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1871738_1872001.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1871738_1872001__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872001_1872002.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872001_1872002__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872001_1872002.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872001_1872002__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872002_1872003.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872002_1872003__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872002_1872003.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872002_1872003__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872003_1872004.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872003_1872004__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872003_1872004.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872003_1872004__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872004_1872005.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872004_1872005__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872004_1872005.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872004_1872005__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872005_1872006.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872005_1872006__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872005_1872006.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872005_1872006__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872006_1872007.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872006_1872007__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872006_1872007.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872006_1872007__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872007_1872008.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872007_1872008__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872007_1872008.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872007_1872008__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872008_1872009.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872008_1872009__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872008_1872009.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872008_1872009__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872009_1872011.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872009_1872011__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872009_1872011.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872009_1872011__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872011_1872013.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872011_1872013__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872011_1872013.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872011_1872013__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872013_1872016.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872013_1872016__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872013_1872016.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872013_1872016__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872016_1872017.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872016_1872017__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872016_1872017.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872016_1872017__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872017_1872019.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872017_1872019__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872017_1872019.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872017_1872019__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872019_1872020.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872019_1872020__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872019_1872020.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872019_1872020__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872020_1872023.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872020_1872023__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872020_1872023.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872020_1872023__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872023_1872024.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872023_1872024__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872023_1872024.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872023_1872024__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872024_1872025.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872024_1872025__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872024_1872025.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872024_1872025__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872025_1872027.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872025_1872027__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872025_1872027.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872025_1872027__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872027_1872028.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872027_1872028__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872027_1872028.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872027_1872028__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872028_1872029.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872028_1872029__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872028_1872029.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872028_1872029__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872029_1872030.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872029_1872030__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872029_1872030.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872029_1872030__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_1872030_1872031.dat b/dash-spv-apple-bindings/files/mainnet/MNL_1872030_1872031__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/MNL_1872030_1872031.dat rename to dash-spv-apple-bindings/files/mainnet/MNL_1872030_1872031__70227.dat diff --git a/dash-spv-apple-bindings/files/mainnet/MNL_2187936_2188224__70235.dat b/dash-spv-apple-bindings/files/mainnet/MNL_2187936_2188224__70235.dat new file mode 100644 index 00000000..8d586752 Binary files /dev/null and b/dash-spv-apple-bindings/files/mainnet/MNL_2187936_2188224__70235.dat differ diff --git a/dash-spv-apple-bindings/files/mainnet/MNL_2188224_2188512__70235.dat b/dash-spv-apple-bindings/files/mainnet/MNL_2188224_2188512__70235.dat new file mode 100644 index 00000000..72a51272 Binary files /dev/null and b/dash-spv-apple-bindings/files/mainnet/MNL_2188224_2188512__70235.dat differ diff --git a/dash-spv-apple-bindings/files/mainnet/MNL_2188512_2188536__70235.dat b/dash-spv-apple-bindings/files/mainnet/MNL_2188512_2188536__70235.dat new file mode 100644 index 00000000..a62d6ee7 Binary files /dev/null and b/dash-spv-apple-bindings/files/mainnet/MNL_2188512_2188536__70235.dat differ diff --git a/dash-spv-apple-bindings/files/mainnet/MNL_2188536_2188560__70235.dat b/dash-spv-apple-bindings/files/mainnet/MNL_2188536_2188560__70235.dat new file mode 100644 index 00000000..910deba1 Binary files /dev/null and b/dash-spv-apple-bindings/files/mainnet/MNL_2188536_2188560__70235.dat differ diff --git a/dash-spv-apple-bindings/files/mainnet/MNL_2188560_2188584__70235.dat b/dash-spv-apple-bindings/files/mainnet/MNL_2188560_2188584__70235.dat new file mode 100644 index 00000000..6061a135 Binary files /dev/null and b/dash-spv-apple-bindings/files/mainnet/MNL_2188560_2188584__70235.dat differ diff --git a/dash-spv-apple-bindings/files/mainnet/MNL_2188584_2188608__70235.dat b/dash-spv-apple-bindings/files/mainnet/MNL_2188584_2188608__70235.dat new file mode 100644 index 00000000..125e13cd Binary files /dev/null and b/dash-spv-apple-bindings/files/mainnet/MNL_2188584_2188608__70235.dat differ diff --git a/dash-spv-apple-bindings/files/mainnet/MNL_2188608_2188632__70235.dat b/dash-spv-apple-bindings/files/mainnet/MNL_2188608_2188632__70235.dat new file mode 100644 index 00000000..9eebf502 Binary files /dev/null and b/dash-spv-apple-bindings/files/mainnet/MNL_2188608_2188632__70235.dat differ diff --git a/dash-spv-apple-bindings/files/mainnet/MNL_2188632_2188656__70235.dat b/dash-spv-apple-bindings/files/mainnet/MNL_2188632_2188656__70235.dat new file mode 100644 index 00000000..6ddbf88e Binary files /dev/null and b/dash-spv-apple-bindings/files/mainnet/MNL_2188632_2188656__70235.dat differ diff --git a/dash-spv-apple-bindings/files/mainnet/MNL_2188656_2188680__70235.dat b/dash-spv-apple-bindings/files/mainnet/MNL_2188656_2188680__70235.dat new file mode 100644 index 00000000..c04816cc Binary files /dev/null and b/dash-spv-apple-bindings/files/mainnet/MNL_2188656_2188680__70235.dat differ diff --git a/dash-spv-apple-bindings/files/mainnet/MNL_2188680_2188704__70235.dat b/dash-spv-apple-bindings/files/mainnet/MNL_2188680_2188704__70235.dat new file mode 100644 index 00000000..37d3f53d Binary files /dev/null and b/dash-spv-apple-bindings/files/mainnet/MNL_2188680_2188704__70235.dat differ diff --git a/dash-spv-apple-bindings/files/mainnet/MNL_2188704_2188728__70235.dat b/dash-spv-apple-bindings/files/mainnet/MNL_2188704_2188728__70235.dat new file mode 100644 index 00000000..d17b8699 Binary files /dev/null and b/dash-spv-apple-bindings/files/mainnet/MNL_2188704_2188728__70235.dat differ diff --git a/dash-spv-apple-bindings/files/mainnet/MNL_2188728_2188752__70235.dat b/dash-spv-apple-bindings/files/mainnet/MNL_2188728_2188752__70235.dat new file mode 100644 index 00000000..2e189e39 Binary files /dev/null and b/dash-spv-apple-bindings/files/mainnet/MNL_2188728_2188752__70235.dat differ diff --git a/dash-spv-apple-bindings/files/mainnet/MNL_2188752_2188776__70235.dat b/dash-spv-apple-bindings/files/mainnet/MNL_2188752_2188776__70235.dat new file mode 100644 index 00000000..d0c3b2d0 Binary files /dev/null and b/dash-spv-apple-bindings/files/mainnet/MNL_2188752_2188776__70235.dat differ diff --git a/dash-spv-apple-bindings/files/mainnet/MNL_2188776_2188800__70235.dat b/dash-spv-apple-bindings/files/mainnet/MNL_2188776_2188800__70235.dat new file mode 100644 index 00000000..20a4c76b Binary files /dev/null and b/dash-spv-apple-bindings/files/mainnet/MNL_2188776_2188800__70235.dat differ diff --git a/dash-spv-apple-bindings/files/mainnet/MNL_2188800_2188824__70235.dat b/dash-spv-apple-bindings/files/mainnet/MNL_2188800_2188824__70235.dat new file mode 100644 index 00000000..d8e8532e Binary files /dev/null and b/dash-spv-apple-bindings/files/mainnet/MNL_2188800_2188824__70235.dat differ diff --git a/dash-spv-apple-bindings/files/mainnet/MNL_2188824_2188848__70235.dat b/dash-spv-apple-bindings/files/mainnet/MNL_2188824_2188848__70235.dat new file mode 100644 index 00000000..608f1722 Binary files /dev/null and b/dash-spv-apple-bindings/files/mainnet/MNL_2188824_2188848__70235.dat differ diff --git a/dash-spv-apple-bindings/files/mainnet/MNL_2188848_2188872__70235.dat b/dash-spv-apple-bindings/files/mainnet/MNL_2188848_2188872__70235.dat new file mode 100644 index 00000000..07538f3a Binary files /dev/null and b/dash-spv-apple-bindings/files/mainnet/MNL_2188848_2188872__70235.dat differ diff --git a/dash-spv-masternode-processor/files/QRINFO_0_1739226.dat b/dash-spv-apple-bindings/files/mainnet/QRINFO_0_1739226.dat similarity index 100% rename from dash-spv-masternode-processor/files/QRINFO_0_1739226.dat rename to dash-spv-apple-bindings/files/mainnet/QRINFO_0_1739226.dat diff --git a/dash-spv-masternode-processor/files/QRINFO_0_1740902.dat b/dash-spv-apple-bindings/files/mainnet/QRINFO_0_1740902.dat similarity index 100% rename from dash-spv-masternode-processor/files/QRINFO_0_1740902.dat rename to dash-spv-apple-bindings/files/mainnet/QRINFO_0_1740902.dat diff --git a/dash-spv-masternode-processor/files/QRINFO_0_1740910.dat b/dash-spv-apple-bindings/files/mainnet/QRINFO_0_1740910.dat similarity index 100% rename from dash-spv-masternode-processor/files/QRINFO_0_1740910.dat rename to dash-spv-apple-bindings/files/mainnet/QRINFO_0_1740910.dat diff --git a/dash-spv-masternode-processor/files/mainnet/QRINFO_0_1871755.dat b/dash-spv-apple-bindings/files/mainnet/QRINFO_0_1871755__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/QRINFO_0_1871755.dat rename to dash-spv-apple-bindings/files/mainnet/QRINFO_0_1871755__70227.dat diff --git a/dash-spv-masternode-processor/files/mainnet/QRINFO_0_1872425.dat b/dash-spv-apple-bindings/files/mainnet/QRINFO_0_1872425__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/mainnet/QRINFO_0_1872425.dat rename to dash-spv-apple-bindings/files/mainnet/QRINFO_0_1872425__70227.dat diff --git a/dash-spv-masternode-processor/files/ML_at_122088.dat b/dash-spv-apple-bindings/files/testnet/ML_at_122088__70221.dat similarity index 100% rename from dash-spv-masternode-processor/files/ML_at_122088.dat rename to dash-spv-apple-bindings/files/testnet/ML_at_122088__70221.dat diff --git a/dash-spv-masternode-processor/files/MNL_0_122064.dat b/dash-spv-apple-bindings/files/testnet/MNL_0_122064.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_0_122064.dat rename to dash-spv-apple-bindings/files/testnet/MNL_0_122064.dat diff --git a/dash-spv-masternode-processor/files/MNL_0_122928.dat b/dash-spv-apple-bindings/files/testnet/MNL_0_122928__70221.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_0_122928.dat rename to dash-spv-apple-bindings/files/testnet/MNL_0_122928__70221.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_0_530000_70228.dat b/dash-spv-apple-bindings/files/testnet/MNL_0_530000__70228.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_0_530000_70228.dat rename to dash-spv-apple-bindings/files/testnet/MNL_0_530000__70228.dat diff --git a/dash-spv-masternode-processor/files/MNL_0_868888.dat b/dash-spv-apple-bindings/files/testnet/MNL_0_868888__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_0_868888.dat rename to dash-spv-apple-bindings/files/testnet/MNL_0_868888__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_0_869464.dat b/dash-spv-apple-bindings/files/testnet/MNL_0_869464__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_0_869464.dat rename to dash-spv-apple-bindings/files/testnet/MNL_0_869464__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_0_869760.dat b/dash-spv-apple-bindings/files/testnet/MNL_0_869760__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_0_869760.dat rename to dash-spv-apple-bindings/files/testnet/MNL_0_869760__70227.dat diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1156656_1156680__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1156656_1156680__70233.dat new file mode 100644 index 00000000..62c6eaa0 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1156656_1156680__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1156680_1156704__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1156680_1156704__70233.dat new file mode 100644 index 00000000..6d45cc98 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1156680_1156704__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1156704_1156728__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1156704_1156728__70233.dat new file mode 100644 index 00000000..2d608175 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1156704_1156728__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1156728_1156752__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1156728_1156752__70233.dat new file mode 100644 index 00000000..f0f574d3 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1156728_1156752__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1156752_1156776__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1156752_1156776__70233.dat new file mode 100644 index 00000000..3dd575ac Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1156752_1156776__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1156776_1156800__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1156776_1156800__70233.dat new file mode 100644 index 00000000..5d99c1c2 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1156776_1156800__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1156800_1156824__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1156800_1156824__70233.dat new file mode 100644 index 00000000..e7e2e435 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1156800_1156824__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1156824_1156848__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1156824_1156848__70233.dat new file mode 100644 index 00000000..a7486a7c Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1156824_1156848__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1156848_1156872__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1156848_1156872__70233.dat new file mode 100644 index 00000000..18a6ca4c Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1156848_1156872__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1156872_1156896__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1156872_1156896__70233.dat new file mode 100644 index 00000000..364834ca Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1156872_1156896__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1156896_1156920__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1156896_1156920__70233.dat new file mode 100644 index 00000000..ba455ebd Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1156896_1156920__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1156920_1156944__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1156920_1156944__70233.dat new file mode 100644 index 00000000..16c1ae51 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1156920_1156944__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1156944_1156968__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1156944_1156968__70233.dat new file mode 100644 index 00000000..0ada250b Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1156944_1156968__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1156968_1156992__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1156968_1156992__70233.dat new file mode 100644 index 00000000..26a25b0a Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1156968_1156992__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1156992_1157016__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1156992_1157016__70233.dat new file mode 100644 index 00000000..0fd903a4 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1156992_1157016__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1157016_1157040__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1157016_1157040__70233.dat new file mode 100644 index 00000000..13a350a8 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1157016_1157040__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1157040_1157064__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1157040_1157064__70233.dat new file mode 100644 index 00000000..db69be09 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1157040_1157064__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1157064_1157088__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1157064_1157088__70233.dat new file mode 100644 index 00000000..4d65a760 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1157064_1157088__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1157088_1157112__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1157088_1157112__70233.dat new file mode 100644 index 00000000..b9c5af73 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1157088_1157112__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1157112_1157136__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1157112_1157136__70233.dat new file mode 100644 index 00000000..ae5487fb Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1157112_1157136__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1157136_1157160__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1157136_1157160__70233.dat new file mode 100644 index 00000000..af6d8105 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1157136_1157160__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1157160_1157184__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1157160_1157184__70233.dat new file mode 100644 index 00000000..95e0beeb Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1157160_1157184__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1157184_1157208__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1157184_1157208__70233.dat new file mode 100644 index 00000000..117fe993 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1157184_1157208__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1157208_1157239__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1157208_1157239__70233.dat new file mode 100644 index 00000000..12bafdf2 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1157208_1157239__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158552_1158576__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158552_1158576__70233.dat new file mode 100644 index 00000000..47705f5d Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158552_1158576__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158576_1158600__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158576_1158600__70233.dat new file mode 100644 index 00000000..b93c19f9 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158576_1158600__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158600_1158624__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158600_1158624__70233.dat new file mode 100644 index 00000000..3c18d9a6 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158600_1158624__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158624_1158648__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158624_1158648__70233.dat new file mode 100644 index 00000000..efca67a5 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158624_1158648__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158648_1158672__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158648_1158672__70233.dat new file mode 100644 index 00000000..9e2bad83 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158648_1158672__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158668_1158733__70235.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158668_1158733__70235.dat new file mode 100644 index 00000000..3e803276 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158668_1158733__70235.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158672_1158696__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158672_1158696__70233.dat new file mode 100644 index 00000000..a7705e35 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158672_1158696__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158696_1158720__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158696_1158720__70233.dat new file mode 100644 index 00000000..89176a8e Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158696_1158720__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158720_1158744__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158720_1158744__70233.dat new file mode 100644 index 00000000..b9e522ea Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158720_1158744__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158744_1158768__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158744_1158768__70233.dat new file mode 100644 index 00000000..e4f75b2b Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158744_1158768__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158768_1158792__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158768_1158792__70233.dat new file mode 100644 index 00000000..d1270141 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158768_1158792__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158792_1158816__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158792_1158816__70233.dat new file mode 100644 index 00000000..784b0608 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158792_1158816__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158816_1158840__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158816_1158840__70233.dat new file mode 100644 index 00000000..bf73ece4 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158816_1158840__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158840_1158864__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158840_1158864__70233.dat new file mode 100644 index 00000000..9b4e1161 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158840_1158864__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158864_1158888__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158864_1158888__70233.dat new file mode 100644 index 00000000..d5f4615b Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158864_1158888__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158888_1158912__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158888_1158912__70233.dat new file mode 100644 index 00000000..cc63e804 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158888_1158912__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158912_1158936__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158912_1158936__70233.dat new file mode 100644 index 00000000..62b1fdca Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158912_1158936__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158936_1158960__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158936_1158960__70233.dat new file mode 100644 index 00000000..dc8d0862 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158936_1158960__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158960_1158984__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158960_1158984__70233.dat new file mode 100644 index 00000000..9108687b Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158960_1158984__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1158984_1159008__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1158984_1159008__70233.dat new file mode 100644 index 00000000..ec0000e5 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1158984_1159008__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1159008_1159032__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1159008_1159032__70233.dat new file mode 100644 index 00000000..4b728b8f Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1159008_1159032__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1159032_1159056__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1159032_1159056__70233.dat new file mode 100644 index 00000000..00e1c77d Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1159032_1159056__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1159056_1159080__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1159056_1159080__70233.dat new file mode 100644 index 00000000..dbc9d0fc Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1159056_1159080__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1159080_1159104__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1159080_1159104__70233.dat new file mode 100644 index 00000000..cf1c113f Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1159080_1159104__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1159104_1159115__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_1159104_1159115__70233.dat new file mode 100644 index 00000000..2ef6c27d Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1159104_1159115__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1159115_1159116__70235.dat b/dash-spv-apple-bindings/files/testnet/MNL_1159115_1159116__70235.dat new file mode 100644 index 00000000..8680c1e0 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1159115_1159116__70235.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_1159116_1159117__70235.dat b/dash-spv-apple-bindings/files/testnet/MNL_1159116_1159117__70235.dat new file mode 100644 index 00000000..8b6194de Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_1159116_1159117__70235.dat differ diff --git a/dash-spv-masternode-processor/files/MNL_122064_122088.dat b/dash-spv-apple-bindings/files/testnet/MNL_122064_122088.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_122064_122088.dat rename to dash-spv-apple-bindings/files/testnet/MNL_122064_122088.dat diff --git a/dash-spv-masternode-processor/files/MNL_122928_123000.dat b/dash-spv-apple-bindings/files/testnet/MNL_122928_123000__70221.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_122928_123000.dat rename to dash-spv-apple-bindings/files/testnet/MNL_122928_123000__70221.dat diff --git a/dash-spv-apple-bindings/files/testnet/MNL_530000_1156656__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_530000_1156656__70233.dat new file mode 100644 index 00000000..5b663323 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_530000_1156656__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_530000_1157239__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_530000_1157239__70233.dat new file mode 100644 index 00000000..f931f612 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_530000_1157239__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/MNL_530000_1158552__70233.dat b/dash-spv-apple-bindings/files/testnet/MNL_530000_1158552__70233.dat new file mode 100644 index 00000000..fe75d7ef Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/MNL_530000_1158552__70233.dat differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_530000_852596.dat b/dash-spv-apple-bindings/files/testnet/MNL_530000_852596__70228.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_530000_852596.dat rename to dash-spv-apple-bindings/files/testnet/MNL_530000_852596__70228.dat diff --git a/dash-spv-masternode-processor/files/MNL_530000_867700.dat b/dash-spv-apple-bindings/files/testnet/MNL_530000_867700__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_530000_867700.dat rename to dash-spv-apple-bindings/files/testnet/MNL_530000_867700__70227.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_530000_868321.dat b/dash-spv-apple-bindings/files/testnet/MNL_530000_868321__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_530000_868321.dat rename to dash-spv-apple-bindings/files/testnet/MNL_530000_868321__70227.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_530000_904382__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_530000_904382__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_530000_904382__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_530000_904382__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_530000_904944__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_530000_904944__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_530000_904944__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_530000_904944__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_530000_905465__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_530000_905465__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_530000_905465__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_530000_905465__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_530000_905522__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_530000_905522__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_530000_905522__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_530000_905522__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_530000_907104__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_530000_907104__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_530000_907104__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_530000_907104__70230.dat diff --git a/dash-spv-masternode-processor/files/MNL_868888_869176.dat b/dash-spv-apple-bindings/files/testnet/MNL_868888_869176__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_868888_869176.dat rename to dash-spv-apple-bindings/files/testnet/MNL_868888_869176__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869176_869464.dat b/dash-spv-apple-bindings/files/testnet/MNL_869176_869464__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869176_869464.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869176_869464__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869464_869752.dat b/dash-spv-apple-bindings/files/testnet/MNL_869464_869752__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869464_869752.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869464_869752__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869752_869760.dat b/dash-spv-apple-bindings/files/testnet/MNL_869752_869760__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869752_869760.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869752_869760__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869760_869761.dat b/dash-spv-apple-bindings/files/testnet/MNL_869760_869761__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869760_869761.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869760_869761__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869761_869762.dat b/dash-spv-apple-bindings/files/testnet/MNL_869761_869762__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869761_869762.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869761_869762__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869762_869763.dat b/dash-spv-apple-bindings/files/testnet/MNL_869762_869763__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869762_869763.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869762_869763__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869763_869764.dat b/dash-spv-apple-bindings/files/testnet/MNL_869763_869764__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869763_869764.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869763_869764__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869764_869765.dat b/dash-spv-apple-bindings/files/testnet/MNL_869764_869765__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869764_869765.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869764_869765__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869765_869766.dat b/dash-spv-apple-bindings/files/testnet/MNL_869765_869766__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869765_869766.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869765_869766__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869766_869767.dat b/dash-spv-apple-bindings/files/testnet/MNL_869766_869767__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869766_869767.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869766_869767__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869767_869768.dat b/dash-spv-apple-bindings/files/testnet/MNL_869767_869768__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869767_869768.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869767_869768__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869768_869769.dat b/dash-spv-apple-bindings/files/testnet/MNL_869768_869769__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869768_869769.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869768_869769__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869769_869770.dat b/dash-spv-apple-bindings/files/testnet/MNL_869769_869770__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869769_869770.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869769_869770__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869770_869771.dat b/dash-spv-apple-bindings/files/testnet/MNL_869770_869771__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869770_869771.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869770_869771__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869771_869772.dat b/dash-spv-apple-bindings/files/testnet/MNL_869771_869772__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869771_869772.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869771_869772__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869772_869773.dat b/dash-spv-apple-bindings/files/testnet/MNL_869772_869773__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869772_869773.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869772_869773__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869773_869774.dat b/dash-spv-apple-bindings/files/testnet/MNL_869773_869774__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869773_869774.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869773_869774__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869774_869775.dat b/dash-spv-apple-bindings/files/testnet/MNL_869774_869775__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869774_869775.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869774_869775__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869775_869776.dat b/dash-spv-apple-bindings/files/testnet/MNL_869775_869776__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869775_869776.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869775_869776__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869776_869777.dat b/dash-spv-apple-bindings/files/testnet/MNL_869776_869777__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869776_869777.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869776_869777__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869777_869778.dat b/dash-spv-apple-bindings/files/testnet/MNL_869777_869778__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869777_869778.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869777_869778__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869778_869779.dat b/dash-spv-apple-bindings/files/testnet/MNL_869778_869779__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869778_869779.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869778_869779__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869779_869780.dat b/dash-spv-apple-bindings/files/testnet/MNL_869779_869780__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869779_869780.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869779_869780__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869780_869781.dat b/dash-spv-apple-bindings/files/testnet/MNL_869780_869781__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869780_869781.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869780_869781__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869781_869782.dat b/dash-spv-apple-bindings/files/testnet/MNL_869781_869782__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869781_869782.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869781_869782__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869782_869783.dat b/dash-spv-apple-bindings/files/testnet/MNL_869782_869783__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869782_869783.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869782_869783__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869783_869784.dat b/dash-spv-apple-bindings/files/testnet/MNL_869783_869784__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869783_869784.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869783_869784__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869784_869785.dat b/dash-spv-apple-bindings/files/testnet/MNL_869784_869785__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869784_869785.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869784_869785__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869785_869786.dat b/dash-spv-apple-bindings/files/testnet/MNL_869785_869786__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869785_869786.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869785_869786__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869786_869787.dat b/dash-spv-apple-bindings/files/testnet/MNL_869786_869787__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869786_869787.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869786_869787__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869787_869788.dat b/dash-spv-apple-bindings/files/testnet/MNL_869787_869788__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869787_869788.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869787_869788__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869788_869789.dat b/dash-spv-apple-bindings/files/testnet/MNL_869788_869789__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869788_869789.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869788_869789__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869789_869790.dat b/dash-spv-apple-bindings/files/testnet/MNL_869789_869790__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869789_869790.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869789_869790__70227.dat diff --git a/dash-spv-masternode-processor/files/MNL_869790_869791.dat b/dash-spv-apple-bindings/files/testnet/MNL_869790_869791__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNL_869790_869791.dat rename to dash-spv-apple-bindings/files/testnet/MNL_869790_869791__70227.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904944_904968__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_904944_904968__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_904944_904968__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_904944_904968__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904968_904992__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_904968_904992__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_904968_904992__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_904968_904992__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904992_905016__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_904992_905016__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_904992_905016__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_904992_905016__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905016_905040__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905016_905040__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905016_905040__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905016_905040__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905040_905064__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905040_905064__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905040_905064__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905040_905064__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905064_905088__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905064_905088__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905064_905088__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905064_905088__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905088_905112__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905088_905112__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905088_905112__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905088_905112__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905112_905136__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905112_905136__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905112_905136__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905112_905136__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905136_905160__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905136_905160__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905136_905160__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905136_905160__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905160_905184__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905160_905184__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905160_905184__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905160_905184__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905184_905208__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905184_905208__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905184_905208__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905184_905208__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905208_905232__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905208_905232__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905208_905232__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905208_905232__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905232_905256__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905232_905256__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905232_905256__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905232_905256__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905256_905280__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905256_905280__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905256_905280__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905256_905280__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905280_905304__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905280_905304__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905280_905304__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905280_905304__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905304_905328__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905304_905328__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905304_905328__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905304_905328__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905328_905352__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905328_905352__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905328_905352__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905328_905352__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905352_905376__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905352_905376__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905352_905376__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905352_905376__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905376_905400__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905376_905400__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905376_905400__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905376_905400__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905400_905424__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905400_905424__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905400_905424__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905400_905424__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905424_905448__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905424_905448__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905424_905448__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905424_905448__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905448_905472__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905448_905472__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905448_905472__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905448_905472__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905472_905496__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905472_905496__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905472_905496__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905472_905496__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905496_905522__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905496_905522__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905496_905522__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905496_905522__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905522_905523__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905522_905523__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905522_905523__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905522_905523__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905523_905524__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905523_905524__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905523_905524__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905523_905524__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905524_905525__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_905524_905525__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_905524_905525__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_905524_905525__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_907104_907128__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_907104_907128__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_907104_907128__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_907104_907128__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_907128_907152__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_907128_907152__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_907128_907152__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_907128_907152__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_907152_907176__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_907152_907176__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_907152_907176__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_907152_907176__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_907176_907200__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_907176_907200__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_907176_907200__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_907176_907200__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_907200_907224__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_907200_907224__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_907200_907224__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_907200_907224__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_907224_907248__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_907224_907248__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_907224_907248__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_907224_907248__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_907248_907272__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_907248_907272__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_907248_907272__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_907248_907272__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_907272_907296__70230.dat b/dash-spv-apple-bindings/files/testnet/MNL_907272_907296__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_907272_907296__70230.dat rename to dash-spv-apple-bindings/files/testnet/MNL_907272_907296__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNL_TESTNET_CORE_19.dat b/dash-spv-apple-bindings/files/testnet/MNL_TESTNET_CORE_19.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNL_TESTNET_CORE_19.dat rename to dash-spv-apple-bindings/files/testnet/MNL_TESTNET_CORE_19.dat diff --git a/dash-spv-masternode-processor/files/testnet/MNT530000.dat b/dash-spv-apple-bindings/files/testnet/MNT530000.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/MNT530000.dat rename to dash-spv-apple-bindings/files/testnet/MNT530000.dat diff --git a/dash-spv-masternode-processor/files/MNT_0_530000.dat b/dash-spv-apple-bindings/files/testnet/MNT_0_530000.dat similarity index 100% rename from dash-spv-masternode-processor/files/MNT_0_530000.dat rename to dash-spv-apple-bindings/files/testnet/MNT_0_530000.dat diff --git a/dash-spv-masternode-processor/files/QRINFO_0_870235.dat b/dash-spv-apple-bindings/files/testnet/QRINFO_0_870235__70227.dat similarity index 100% rename from dash-spv-masternode-processor/files/QRINFO_0_870235.dat rename to dash-spv-apple-bindings/files/testnet/QRINFO_0_870235__70227.dat diff --git a/dash-spv-apple-bindings/files/testnet/QRINFO_1159115_1159116__70235.dat b/dash-spv-apple-bindings/files/testnet/QRINFO_1159115_1159116__70235.dat new file mode 100644 index 00000000..6873afdd Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/QRINFO_1159115_1159116__70235.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/QRINFO_1194627_1194629__70235.dat b/dash-spv-apple-bindings/files/testnet/QRINFO_1194627_1194629__70235.dat new file mode 100644 index 00000000..6cb54fdf Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/QRINFO_1194627_1194629__70235.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/QRINFO_530000_1158666__70233.dat b/dash-spv-apple-bindings/files/testnet/QRINFO_530000_1158666__70233.dat new file mode 100644 index 00000000..af9327df Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/QRINFO_530000_1158666__70233.dat differ diff --git a/dash-spv-apple-bindings/files/testnet/QRINFO_530000_1159116__70233.dat b/dash-spv-apple-bindings/files/testnet/QRINFO_530000_1159116__70233.dat new file mode 100644 index 00000000..41a68869 Binary files /dev/null and b/dash-spv-apple-bindings/files/testnet/QRINFO_530000_1159116__70233.dat differ diff --git a/dash-spv-masternode-processor/files/testnet/QRINFO_LAST_X.dat b/dash-spv-apple-bindings/files/testnet/QRINFO_LAST_X__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/QRINFO_LAST_X.dat rename to dash-spv-apple-bindings/files/testnet/QRINFO_LAST_X__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/QRINFO_LAST.dat b/dash-spv-apple-bindings/files/testnet/QRINFO_LAST__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/QRINFO_LAST.dat rename to dash-spv-apple-bindings/files/testnet/QRINFO_LAST__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/QRINFO_x3_y3__70230.dat b/dash-spv-apple-bindings/files/testnet/QRINFO_x3_y3__70230.dat similarity index 100% rename from dash-spv-masternode-processor/files/testnet/QRINFO_x3_y3__70230.dat rename to dash-spv-apple-bindings/files/testnet/QRINFO_x3_y3__70230.dat diff --git a/dash-spv-masternode-processor/files/testnet/qrinfo_530000_904144__70230.json b/dash-spv-apple-bindings/files/testnet/qrinfo_530000_904144__70230.json similarity index 100% rename from dash-spv-masternode-processor/files/testnet/qrinfo_530000_904144__70230.json rename to dash-spv-apple-bindings/files/testnet/qrinfo_530000_904144__70230.json diff --git a/dash-spv-masternode-processor/files/snapshot_0000021715c8575620382ceee42cc7556bac5ed395eaf9c75e2119aa2876a1e0.json b/dash-spv-apple-bindings/files/testnet/snapshot_0000021715c8575620382ceee42cc7556bac5ed395eaf9c75e2119aa2876a1e0.json similarity index 100% rename from dash-spv-masternode-processor/files/snapshot_0000021715c8575620382ceee42cc7556bac5ed395eaf9c75e2119aa2876a1e0.json rename to dash-spv-apple-bindings/files/testnet/snapshot_0000021715c8575620382ceee42cc7556bac5ed395eaf9c75e2119aa2876a1e0.json diff --git a/dash-spv-apple-bindings/src/address.rs b/dash-spv-apple-bindings/src/address.rs new file mode 100644 index 00000000..937fa2ef --- /dev/null +++ b/dash-spv-apple-bindings/src/address.rs @@ -0,0 +1,32 @@ + +pub mod addresses { + use dash_spv_crypto::network::ChainType; + use dash_spv_crypto::util::address::address; + use dash_spv_crypto::util::data_append::DataAppend; + + #[ferment_macro::export] + pub fn address_from_hash160(hash: [u8; 20], chain_type: ChainType) -> String { + let script_map = chain_type.script_map(); + address::from_hash160_for_script_map(&hash, &script_map) + } + + #[ferment_macro::export] + pub fn address_with_script_pubkey(script: Vec, chain_type: ChainType) -> Option { + address::with_script_pub_key(&script, &chain_type.script_map()) + } + + #[ferment_macro::export] + pub fn address_with_script_sig(script: Vec, chain_type: ChainType) -> Option { + address::with_script_sig(&script, &chain_type.script_map()) + } + + #[ferment_macro::export] + pub fn script_pubkey_for_address(address: Option, chain_type: ChainType) -> Option> { + address.map(|address| DataAppend::script_pub_key_for_address(address.as_str(), &chain_type.script_map())) + } + + #[ferment_macro::export] + pub fn is_valid_dash_address_for_chain(address: Option, chain_type: ChainType) -> bool { + address.map_or(false, |address| address::is_valid_dash_address_for_script_map(address.as_str(), &chain_type.script_map())) + } +} diff --git a/dash-spv-apple-bindings/src/coinjoin.rs b/dash-spv-apple-bindings/src/coinjoin.rs index b8818024..5fa993f7 100644 --- a/dash-spv-apple-bindings/src/coinjoin.rs +++ b/dash-spv-apple-bindings/src/coinjoin.rs @@ -1,541 +1,541 @@ -use core::slice; -use std::cell::RefCell; -use std::ffi::{c_void, CStr}; -use std::io::Cursor; -use std::os::raw::c_char; -use std::rc::Rc; - -use dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager; -use dash_spv_coinjoin::coinjoin_client_queue_manager::CoinJoinClientQueueManager; - -use dash_spv_coinjoin::coinjoin::CoinJoin; -use dash_spv_coinjoin::ffi::callbacks::{AddPendingMasternode, AvailableCoins, CommitTransaction, DestroyCoinJoinKeys, DestroyGatheredOutputs, DestroyInputValue, DestroyMasternode, DestroyMasternodeList, DestroySelectedCoins, DestroyWalletTransaction, DisconnectMasternode, FreshCoinJoinAddress, GetCoinJoinKeys, GetInputValueByPrevoutHash, GetMasternodeList, GetWalletTransaction, HasChainLock, InputsWithAmount, IsBlockchainSynced, IsMasternodeOrDisconnectRequested, IsMineInput, IsWaitingForNewBlock, MasternodeByHash, MixingLivecycleListener, SelectCoinsGroupedByAddresses, SendMessage, SessionLifecycleListener, SignTransaction, StartManagerAsync, UpdateSuccessBlock, ValidMasternodeCount}; -use dash_spv_coinjoin::ffi::coinjoin_denominations::CoinJoinDenominations; -use dash_spv_coinjoin::ffi::coinjoin_keys::CoinJoinKeys; -use dash_spv_coinjoin::ffi::coinjoin_session_statuses::CoinJoinSessionStatuses; -use dash_spv_coinjoin::masternode_meta_data_manager::MasternodeMetadataManager; -use dash_spv_coinjoin::messages; -use dash_spv_coinjoin::messages::coinjoin_broadcast_tx::CoinJoinBroadcastTx; -use dash_spv_coinjoin::messages::coinjoin_message::CoinJoinMessage; -use dash_spv_coinjoin::models::coinjoin_tx_type::CoinJoinTransactionType; -use dash_spv_coinjoin::models::tx_outpoint::TxOutPoint; -use dash_spv_coinjoin::models::{Balance, CoinJoinClientOptions}; -use dash_spv_coinjoin::wallet_ex::WalletEx; -use dash_spv_masternode_processor::common::{self, SocketAddress}; -use dash_spv_masternode_processor::consensus::Decodable; -use dash_spv_masternode_processor::crypto::byte_util::ConstDecodable; -use dash_spv_masternode_processor::crypto::{UInt128, UInt256}; -use dash_spv_masternode_processor::ffi::boxer::boxed; -use dash_spv_masternode_processor::ffi::from::FromFFI; -use dash_spv_masternode_processor::ffi::unboxer::unbox_any; -use dash_spv_masternode_processor::ffi::ByteArray; -use dash_spv_masternode_processor::types; -use logging::*; -use tracing::*; - -#[no_mangle] -pub unsafe extern "C" fn register_client_manager( - context: *const c_void, - options_ptr: *mut CoinJoinClientOptions, - get_masternode_list: GetMasternodeList, - destroy_mn_list: DestroyMasternodeList, - get_input_value_by_prevout_hash: GetInputValueByPrevoutHash, - has_chain_lock: HasChainLock, - destroy_input_value: DestroyInputValue, - update_success_block: UpdateSuccessBlock, - is_waiting_for_new_block: IsWaitingForNewBlock, - get_wallet_transaction: GetWalletTransaction, - sign_transaction: SignTransaction, - destroy_transaction: DestroyWalletTransaction, - is_mine: IsMineInput, - commit_transaction: CommitTransaction, - is_synced: IsBlockchainSynced, - fresh_coinjoin_key: FreshCoinJoinAddress, - count_inputs_with_amount: InputsWithAmount, - available_coins: AvailableCoins, - destroy_gathered_outputs: DestroyGatheredOutputs, - selected_coins: SelectCoinsGroupedByAddresses, - destroy_selected_coins: DestroySelectedCoins, - is_masternode_or_disconnect_requested: IsMasternodeOrDisconnectRequested, - disconnect_masternode: DisconnectMasternode, - send_message: SendMessage, - add_pending_masternode: AddPendingMasternode, - start_manager_async: StartManagerAsync, - session_lifecycle_listener: SessionLifecycleListener, - mixing_lifecycle_listener: MixingLivecycleListener, - get_coinjoin_keys: GetCoinJoinKeys, - destroy_coinjoin_keys: DestroyCoinJoinKeys -) -> *mut CoinJoinClientManager { - logging::init_logging(); - let coinjoin = CoinJoin::new( - get_input_value_by_prevout_hash, - has_chain_lock, - destroy_input_value, - context - ); - - let options = Rc::new(RefCell::new(std::ptr::read(options_ptr))); - - let wallet_ex: WalletEx = WalletEx::new( - context, - options.clone(), - get_wallet_transaction, - sign_transaction, - destroy_transaction, - is_mine, - available_coins, - destroy_gathered_outputs, - selected_coins, - destroy_selected_coins, - count_inputs_with_amount, - fresh_coinjoin_key, - commit_transaction, - is_synced, - is_masternode_or_disconnect_requested, - disconnect_masternode, - send_message, - add_pending_masternode, - start_manager_async, - get_coinjoin_keys, - destroy_coinjoin_keys - ); - - let client_manager = CoinJoinClientManager::new( - Rc::new(RefCell::new(wallet_ex)), - Rc::new(RefCell::new(coinjoin)), - options, - get_masternode_list, - destroy_mn_list, - update_success_block, - is_waiting_for_new_block, - session_lifecycle_listener, - mixing_lifecycle_listener, - context - ); - log_info!(target: "CoinJoin", "register_client_manager"); - boxed(client_manager) -} - -#[no_mangle] -pub unsafe extern "C" fn add_client_queue_manager( - client_manager_ptr: *mut CoinJoinClientManager, - masternode_by_hash: MasternodeByHash, - destroy_masternode: DestroyMasternode, - valid_mns_count: ValidMasternodeCount, - context: *const c_void -) { - let client_queue_manager = CoinJoinClientQueueManager::new( - client_manager_ptr, - MasternodeMetadataManager::new(), - masternode_by_hash, - destroy_masternode, - valid_mns_count, - context - ); - - (*client_manager_ptr).set_client_queue_manager(Rc::new(RefCell::new(client_queue_manager))); - log_info!(target: "CoinJoin", "add_client_queue_manager"); -} - -#[no_mangle] -pub unsafe extern "C" fn start_mixing( - client_manager: *mut CoinJoinClientManager -) -> bool { - return (*client_manager).start_mixing(); -} - -#[no_mangle] -pub unsafe extern "C" fn set_stop_on_nothing_to_do( - client_manager: *mut CoinJoinClientManager, - stop_on_nothing_to_do: bool -) { - (*client_manager).set_stop_on_nothing_to_do(stop_on_nothing_to_do); -} - -#[no_mangle] -pub unsafe extern "C" fn do_maintenance( - client_manager: *mut CoinJoinClientManager, - balance_info: Balance -) { - (*client_manager).do_maintenance(balance_info); -} - -#[no_mangle] -pub unsafe extern "C" fn do_automatic_denominating( - client_manager: *mut CoinJoinClientManager, - balance_info: Balance, - dry_run: bool -) -> bool { - return (*client_manager).do_automatic_denominating(balance_info, dry_run); -} - -#[no_mangle] -pub unsafe extern "C" fn finish_automatic_denominating( - manager: *mut CoinJoinClientManager, - client_session_id: *mut [u8; 32] -) -> bool { - return (*manager).finish_automatic_denominating(UInt256(*(client_session_id))); -} - -#[no_mangle] -pub unsafe extern "C" fn destroy_transaction( - tx: *mut types::Transaction -) { - let unboxed = unbox_any(tx); -} - -#[no_mangle] -pub unsafe extern "C" fn unregister_client_manager(client_manager: *mut CoinJoinClientManager) { - let unboxed = unbox_any(client_manager); -} - -#[no_mangle] -pub unsafe extern "C" fn is_denominated_amount( - amount: u64, -) -> bool { - return CoinJoin::is_denominated_amount(amount); -} - -#[no_mangle] -pub unsafe extern "C" fn is_collateral_amount( - amount: u64, -) -> bool { - return CoinJoin::is_collateral_amount(amount); -} - -#[no_mangle] -pub unsafe extern "C" fn has_collateral_inputs( - client_manager: *mut CoinJoinClientManager, - only_confirmed: bool -) -> bool { - return (*client_manager).wallet_ex.borrow_mut().has_collateral_inputs(only_confirmed); -} - -#[no_mangle] -pub unsafe extern "C" fn is_fully_mixed_with_manager( - client_manager: *mut CoinJoinClientManager, - prevout_hash: *mut [u8; 32], - index: u32, -) -> bool { - return (*client_manager).wallet_ex.borrow_mut().is_fully_mixed(TxOutPoint::new(UInt256(*(prevout_hash)), index)); -} - -#[no_mangle] -pub unsafe extern "C" fn is_fully_mixed( - wallet_ex: *mut WalletEx, - prevout_hash: *mut [u8; 32], - index: u32, -) -> bool { - return (*wallet_ex).is_fully_mixed(TxOutPoint::new(UInt256(*(prevout_hash)), index)); -} - -#[no_mangle] -pub unsafe extern "C" fn is_locked_coin( - wallet_ex: *mut WalletEx, - prevout_hash: *mut [u8; 32], - index: u32, -) -> bool { - return (*wallet_ex).locked_coins_set.contains(&TxOutPoint::new(UInt256(*(prevout_hash)), index)); -} - -#[no_mangle] -pub unsafe extern "C" fn is_locked_coin_with_manager( - client_manager: *mut CoinJoinClientManager, - prevout_hash: *mut [u8; 32], - index: u32, -) -> bool { - return (*client_manager).wallet_ex.borrow().locked_coins_set.contains(&TxOutPoint::new(UInt256(*(prevout_hash)), index)); -} - -#[no_mangle] -pub unsafe extern "C" fn coinjoin_get_smallest_denomination() -> u64 { - return CoinJoin::get_smallest_denomination(); -} - -#[no_mangle] -pub unsafe extern "C" fn process_coinjoin_message( - client_manager: *mut CoinJoinClientManager, - peer_address: *const u8, - peer_port: u16, - message: *mut ByteArray, - message_type: *const c_char -) { - let c_str = unsafe { CStr::from_ptr(message_type) }; - let message = match c_str.to_str().unwrap() { - "dssu" => CoinJoinMessage::StatusUpdate(process_coinjoin_status_update((*message).ptr, (*message).len)), - "dsf" => CoinJoinMessage::FinalTransaction(process_coinjoin_final_transaction((*message).ptr, (*message).len)), - "dsc" => CoinJoinMessage::Complete(process_coinjoin_complete_message((*message).ptr, (*message).len)), - "dstx" => CoinJoinMessage::BroadcastTx(process_coinjoin_broadcast_tx((*message).ptr, (*message).len)), - _ => panic!("CoinJoin: Unsupported message type") - }; - - let from_peer = SocketAddress { - ip_address: UInt128::from_const(peer_address).unwrap_or(UInt128::MIN), - port: peer_port - }; - - (*client_manager).process_message(from_peer, message); -} - -#[no_mangle] -pub unsafe extern "C" fn notify_new_best_block( - client_manager: *mut CoinJoinClientManager, - block_hash: *mut [u8; 32], - block_height: u32 -) { - let block = common::Block::new( - block_height, - UInt256(*(block_hash)) - ); - (*client_manager).update_block_tip(block); -} - -unsafe fn process_coinjoin_accept_message( - message: *const u8, - message_length: usize -) -> messages::CoinJoinAcceptMessage { - let message: &[u8] = slice::from_raw_parts(message, message_length); - let mut cursor = Cursor::new(message); - - return messages::CoinJoinAcceptMessage::consensus_decode(&mut cursor).unwrap(); -} - -unsafe fn process_coinjoin_broadcast_tx( - message: *const u8, - message_length: usize -) -> CoinJoinBroadcastTx { - let message: &[u8] = slice::from_raw_parts(message, message_length); - let mut cursor = Cursor::new(message); - - return CoinJoinBroadcastTx::consensus_decode(&mut cursor).unwrap(); -} - -unsafe fn process_coinjoin_complete_message( - message: *const u8, - message_length: usize -) -> messages::CoinJoinCompleteMessage { - let message: &[u8] = slice::from_raw_parts(message, message_length); - let mut cursor = Cursor::new(message); - - return messages::CoinJoinCompleteMessage::consensus_decode(&mut cursor).unwrap(); -} - -unsafe fn process_coinjoin_entry( - message: *const u8, - message_length: usize -) -> messages::CoinJoinEntry { - let message: &[u8] = slice::from_raw_parts(message, message_length); - let mut cursor = Cursor::new(message); - return messages::CoinJoinEntry::consensus_decode(&mut cursor).unwrap(); -} - -unsafe fn process_coinjoin_final_transaction( - message: *const u8, - message_length: usize -) -> messages::CoinJoinFinalTransaction { - let message: &[u8] = slice::from_raw_parts(message, message_length); - let mut cursor = Cursor::new(message); - - return messages::CoinJoinFinalTransaction::consensus_decode(&mut cursor).unwrap(); -} - -unsafe fn process_coinjoin_queue_message( - message: *const u8, - message_length: usize -) -> messages::CoinJoinQueueMessage { - let message: &[u8] = slice::from_raw_parts(message, message_length); - let mut cursor = Cursor::new(message); - - return messages::CoinJoinQueueMessage::consensus_decode(&mut cursor).unwrap(); -} - -unsafe fn process_coinjoin_status_update( - message: *const u8, - message_length: usize -) -> messages::CoinJoinStatusUpdate { - let message: &[u8] = slice::from_raw_parts(message, message_length); - let mut cursor = Cursor::new(message); - - return messages::CoinJoinStatusUpdate::consensus_decode(&mut cursor).unwrap(); -} - -#[no_mangle] -pub unsafe extern "C" fn process_ds_queue( - client_manager: *mut CoinJoinClientManager, - peer_address: *const u8, - peer_port: u16, - message: *mut ByteArray -) { - let from_peer = SocketAddress { - ip_address: UInt128::from_const(peer_address).unwrap_or(UInt128::MIN), - port: peer_port - }; - let message = process_coinjoin_queue_message((*message).ptr, (*message).len); - (*client_manager).queue_queue_manager.as_ref().unwrap().borrow_mut().process_ds_queue(from_peer, message); -} - -#[no_mangle] -pub unsafe extern "C" fn is_mixing_fee_tx( - client_manager: *mut CoinJoinClientManager, - tx_id: *mut [u8; 32] -) -> bool { - return (*client_manager).is_mixing_fee_tx(UInt256(*(tx_id))); -} - -#[no_mangle] -pub unsafe extern "C" fn get_coinjoin_tx_type( - tx: *mut types::Transaction, - input_values: *const u64, - input_values_len: usize -) -> CoinJoinTransactionType { - let inputs: Vec = (0..input_values_len).map(|i| *(input_values.add(i))).collect(); - return CoinJoinTransactionType::from_tx(&(*tx).decode(), &inputs) -} - -#[no_mangle] -pub unsafe extern "C" fn lock_outputs( - client_manager: *mut CoinJoinClientManager, - tx_hash: *mut [u8; 32], - incicies: *const u32, - incicies_len: usize -) { - let indices: Vec = (0..incicies_len).map(|i| *(incicies.add(i))).collect(); - (*client_manager).lock_outputs(UInt256(*(tx_hash)), indices); -} - -#[no_mangle] -pub unsafe extern "C" fn unlock_outputs( - client_manager: *mut CoinJoinClientManager, - tx: *mut types::Transaction -) { - (*client_manager).unlock_outputs(&(*tx).decode()); -} - -#[no_mangle] -pub unsafe extern "C" fn process_used_scripts( - client_manager: *mut CoinJoinClientManager, - coinjoin_keys: *mut CoinJoinKeys -) { - let mut scripts: Vec> = Vec::new(); - - for i in 0..(*coinjoin_keys).item_count { - let byte_array = *(*coinjoin_keys).items.add(i); - let script = slice::from_raw_parts((*byte_array).ptr, (*byte_array).len); - scripts.push(script.to_vec()); - } - - (*client_manager).process_used_scripts(&scripts) -} - -#[no_mangle] -pub unsafe extern "C" fn refresh_unused_keys( - client_manager: *mut CoinJoinClientManager -) { - (*client_manager).refresh_unused_keys(); -} - -#[no_mangle] -pub unsafe extern "C" fn get_anonymizable_balance( - client_manager: *mut CoinJoinClientManager, - skip_denominated: bool, - skip_unconfirmed: bool -) -> u64 { - return (*client_manager).wallet_ex.borrow_mut().get_anonymizable_balance(skip_denominated, skip_unconfirmed); -} - -#[no_mangle] -pub unsafe extern "C" fn change_coinjoin_options( - client_manager: *mut CoinJoinClientManager, - new_options_ptr: *mut CoinJoinClientOptions -) { - (*client_manager).change_options(std::ptr::read(new_options_ptr)); -} - -#[no_mangle] -pub unsafe extern "C" fn get_standard_denominations() -> *mut CoinJoinDenominations { - let denominations = CoinJoin::get_standard_denominations(); - return boxed(CoinJoinDenominations { - denoms: denominations.as_ptr(), - length: denominations.len(), - }) -} - -#[no_mangle] -pub unsafe extern "C" fn destroy_coinjoin_denomination( - denomination: *mut CoinJoinDenominations -) { - let _ = unbox_any(denomination); -} - -#[no_mangle] -pub unsafe extern "C" fn amount_to_denomination( - input_amount: u64 -) -> u32 { - return CoinJoin::amount_to_denomination(input_amount); -} - -#[no_mangle] -pub unsafe extern "C" fn get_real_outpoint_coinjoin_rounds( - client_manager: *mut CoinJoinClientManager, - prevout_hash: *mut [u8; 32], - index: u32, - rounds: i32 -) -> i32 { - let outpoint = TxOutPoint::new(UInt256(*(prevout_hash)), index); - return (*client_manager).get_real_outpoint_coinjoin_rounds(outpoint, rounds); -} - -#[no_mangle] -pub unsafe extern "C" fn get_collateral_amount() -> u64 { - return CoinJoin::get_collateral_amount(); -} - -#[no_mangle] -pub unsafe extern "C" fn get_max_collateral_amount() -> u64 { - return CoinJoin::get_max_collateral_amount(); -} - -#[no_mangle] -pub unsafe extern "C" fn get_sessions_status( - client_manager: *mut CoinJoinClientManager -) -> *mut CoinJoinSessionStatuses { - let statuses = (*client_manager).get_sessions_status(); - let statuses_ptr = statuses.as_ptr(); - let length = statuses.len(); - - return boxed(CoinJoinSessionStatuses { - statuses: statuses_ptr, - length: length, - }); -} - -#[no_mangle] -pub unsafe extern "C" fn destroy_coinjoin_session_statuses( - statuses: *mut CoinJoinSessionStatuses -) { - let _ = unbox_any(statuses); -} - -#[no_mangle] -pub unsafe extern "C" fn stop_and_reset_coinjoin( - client_manager: *mut CoinJoinClientManager -) { - if (*client_manager).is_mixing { - (*client_manager).reset_pool(); - (*client_manager).stop_mixing(); - } -} - -#[no_mangle] -pub unsafe extern "C" fn initiate_shutdown( - client_manager: *mut CoinJoinClientManager -) { - (*client_manager).initiate_shutdown(); -} - -#[no_mangle] -pub unsafe extern "C" fn session_amount( - client_manager: *mut CoinJoinClientManager -) -> i32 { - return (*client_manager).session_amount() as i32; -} +// use core::slice; +// use std::cell::RefCell; +// use std::ffi::{c_void, CStr}; +// use std::io::Cursor; +// use std::os::raw::c_char; +// use std::rc::Rc; +// +// use dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager; +// use dash_spv_coinjoin::coinjoin_client_queue_manager::CoinJoinClientQueueManager; +// +// use dash_spv_coinjoin::coinjoin::CoinJoin; +// use dash_spv_coinjoin::ffi::callbacks::{AddPendingMasternode, AvailableCoins, CommitTransaction, DestroyCoinJoinKeys, DestroyGatheredOutputs, DestroyInputValue, DestroyMasternode, DestroyMasternodeList, DestroySelectedCoins, DestroyWalletTransaction, DisconnectMasternode, FreshCoinJoinAddress, GetCoinJoinKeys, GetInputValueByPrevoutHash, GetMasternodeList, GetWalletTransaction, HasChainLock, InputsWithAmount, IsBlockchainSynced, IsMasternodeOrDisconnectRequested, IsMineInput, IsWaitingForNewBlock, MasternodeByHash, MixingLivecycleListener, SelectCoinsGroupedByAddresses, SendMessage, SessionLifecycleListener, SignTransaction, StartManagerAsync, UpdateSuccessBlock, ValidMasternodeCount}; +// use dash_spv_coinjoin::ffi::coinjoin_denominations::CoinJoinDenominations; +// use dash_spv_coinjoin::ffi::coinjoin_keys::CoinJoinKeys; +// use dash_spv_coinjoin::ffi::coinjoin_session_statuses::CoinJoinSessionStatuses; +// use dash_spv_coinjoin::masternode_meta_data_manager::MasternodeMetadataManager; +// use dash_spv_coinjoin::messages; +// use dash_spv_coinjoin::messages::coinjoin_broadcast_tx::CoinJoinBroadcastTx; +// use dash_spv_coinjoin::messages::coinjoin_message::CoinJoinMessage; +// use dash_spv_coinjoin::models::coinjoin_tx_type::CoinJoinTransactionType; +// use dash_spv_coinjoin::models::tx_outpoint::TxOutPoint; +// use dash_spv_coinjoin::models::{Balance, CoinJoinClientOptions}; +// use dash_spv_coinjoin::wallet_ex::WalletEx; +// use dash_spv_masternode_processor::common::{self, SocketAddress}; +// use dash_spv_masternode_processor::consensus::Decodable; +// use dash_spv_masternode_processor::crypto::byte_util::ConstDecodable; +// use dash_spv_masternode_processor::crypto::{UInt128, UInt256}; +// use dash_spv_masternode_processor::ffi::boxer::boxed; +// use dash_spv_masternode_processor::ffi::from::FromFFI; +// use dash_spv_masternode_processor::ffi::unboxer::unbox_any; +// use dash_spv_masternode_processor::ffi::ByteArray; +// use dash_spv_masternode_processor::types; +// use logging::*; +// use tracing::*; + +// #[no_mangle] +// pub unsafe extern "C" fn register_client_manager( +// context: *const c_void, +// options_ptr: *mut CoinJoinClientOptions, +// get_masternode_list: GetMasternodeList, +// destroy_mn_list: DestroyMasternodeList, +// get_input_value_by_prevout_hash: GetInputValueByPrevoutHash, +// has_chain_lock: HasChainLock, +// destroy_input_value: DestroyInputValue, +// update_success_block: UpdateSuccessBlock, +// is_waiting_for_new_block: IsWaitingForNewBlock, +// get_wallet_transaction: GetWalletTransaction, +// sign_transaction: SignTransaction, +// destroy_transaction: DestroyWalletTransaction, +// is_mine: IsMineInput, +// commit_transaction: CommitTransaction, +// is_synced: IsBlockchainSynced, +// fresh_coinjoin_key: FreshCoinJoinAddress, +// count_inputs_with_amount: InputsWithAmount, +// available_coins: AvailableCoins, +// destroy_gathered_outputs: DestroyGatheredOutputs, +// selected_coins: SelectCoinsGroupedByAddresses, +// destroy_selected_coins: DestroySelectedCoins, +// is_masternode_or_disconnect_requested: IsMasternodeOrDisconnectRequested, +// disconnect_masternode: DisconnectMasternode, +// send_message: SendMessage, +// add_pending_masternode: AddPendingMasternode, +// start_manager_async: StartManagerAsync, +// session_lifecycle_listener: SessionLifecycleListener, +// mixing_lifecycle_listener: MixingLivecycleListener, +// get_coinjoin_keys: GetCoinJoinKeys, +// destroy_coinjoin_keys: DestroyCoinJoinKeys +// ) -> *mut CoinJoinClientManager { +// logging::init_logging(); +// let coinjoin = CoinJoin::new( +// get_input_value_by_prevout_hash, +// has_chain_lock, +// // destroy_input_value, +// context +// ); +// +// let options = Rc::new(RefCell::new(std::ptr::read(options_ptr))); +// +// let wallet_ex: WalletEx = WalletEx::new( +// context, +// options.clone(), +// get_wallet_transaction, +// sign_transaction, +// destroy_transaction, +// is_mine, +// available_coins, +// destroy_gathered_outputs, +// selected_coins, +// destroy_selected_coins, +// count_inputs_with_amount, +// fresh_coinjoin_key, +// commit_transaction, +// is_synced, +// is_masternode_or_disconnect_requested, +// disconnect_masternode, +// send_message, +// add_pending_masternode, +// start_manager_async, +// get_coinjoin_keys, +// destroy_coinjoin_keys +// ); +// +// let client_manager = CoinJoinClientManager::new( +// Rc::new(RefCell::new(wallet_ex)), +// Rc::new(RefCell::new(coinjoin)), +// options, +// get_masternode_list, +// destroy_mn_list, +// update_success_block, +// is_waiting_for_new_block, +// session_lifecycle_listener, +// mixing_lifecycle_listener, +// context +// ); +// log_info!(target: "CoinJoin", "register_client_manager"); +// boxed(client_manager) +// } + +// #[no_mangle] +// pub unsafe extern "C" fn add_client_queue_manager( +// client_manager_ptr: *mut CoinJoinClientManager, +// masternode_by_hash: MasternodeByHash, +// // destroy_masternode: DestroyMasternode, +// valid_mns_count: ValidMasternodeCount, +// context: *const c_void +// ) { +// let client_queue_manager = CoinJoinClientQueueManager::new( +// // client_manager_ptr, +// MasternodeMetadataManager::new(), +// masternode_by_hash, +// // destroy_masternode, +// valid_mns_count, +// context +// ); +// +// (*client_manager_ptr).set_client_queue_manager(client_queue_manager); +// log_info!(target: "CoinJoin", "add_client_queue_manager"); +// } + +// #[no_mangle] +// pub unsafe extern "C" fn start_mixing( +// client_manager: *mut CoinJoinClientManager +// ) -> bool { +// return (*client_manager).start_mixing(); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn set_stop_on_nothing_to_do( +// client_manager: *mut CoinJoinClientManager, +// stop_on_nothing_to_do: bool +// ) { +// (*client_manager).set_stop_on_nothing_to_do(stop_on_nothing_to_do); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn do_maintenance( +// client_manager: *mut CoinJoinClientManager, +// balance_info: Balance +// ) { +// (*client_manager).do_maintenance(balance_info); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn do_automatic_denominating( +// client_manager: *mut CoinJoinClientManager, +// balance_info: Balance, +// dry_run: bool +// ) -> bool { +// return (*client_manager).do_automatic_denominating(balance_info, dry_run); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn finish_automatic_denominating( +// manager: *mut CoinJoinClientManager, +// client_session_id: *mut [u8; 32] +// ) -> bool { +// return (*manager).finish_automatic_denominating(UInt256(*(client_session_id))); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn destroy_transaction( +// tx: *mut types::Transaction +// ) { +// let unboxed = unbox_any(tx); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn unregister_client_manager(client_manager: *mut CoinJoinClientManager) { +// let unboxed = unbox_any(client_manager); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn is_denominated_amount( +// amount: u64, +// ) -> bool { +// return CoinJoin::is_denominated_amount(amount); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn is_collateral_amount( +// amount: u64, +// ) -> bool { +// return CoinJoin::is_collateral_amount(amount); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn has_collateral_inputs( +// client_manager: *mut CoinJoinClientManager, +// only_confirmed: bool +// ) -> bool { +// return (*client_manager).wallet_ex.borrow_mut().has_collateral_inputs(only_confirmed); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn is_fully_mixed_with_manager( +// client_manager: *mut CoinJoinClientManager, +// prevout_hash: *mut [u8; 32], +// index: u32, +// ) -> bool { +// return (*client_manager).wallet_ex.borrow_mut().is_fully_mixed(TxOutPoint::new(UInt256(*(prevout_hash)), index)); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn is_fully_mixed( +// wallet_ex: *mut WalletEx, +// prevout_hash: *mut [u8; 32], +// index: u32, +// ) -> bool { +// return (*wallet_ex).is_fully_mixed(TxOutPoint::new(UInt256(*(prevout_hash)), index)); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn is_locked_coin( +// wallet_ex: *mut WalletEx, +// prevout_hash: *mut [u8; 32], +// index: u32, +// ) -> bool { +// return (*wallet_ex).locked_coins_set.contains(&TxOutPoint::new(UInt256(*(prevout_hash)), index)); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn is_locked_coin_with_manager( +// client_manager: *mut CoinJoinClientManager, +// prevout_hash: *mut [u8; 32], +// index: u32, +// ) -> bool { +// return (*client_manager).wallet_ex.borrow().locked_coins_set.contains(&TxOutPoint::new(UInt256(*(prevout_hash)), index)); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn coinjoin_get_smallest_denomination() -> u64 { +// return CoinJoin::get_smallest_denomination(); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn process_coinjoin_message( +// client_manager: *mut CoinJoinClientManager, +// peer_address: *const u8, +// peer_port: u16, +// message: *mut ByteArray, +// message_type: *const c_char +// ) { +// let c_str = unsafe { CStr::from_ptr(message_type) }; +// let message = match c_str.to_str().unwrap() { +// "dssu" => CoinJoinMessage::StatusUpdate(process_coinjoin_status_update((*message).ptr, (*message).len)), +// "dsf" => CoinJoinMessage::FinalTransaction(process_coinjoin_final_transaction((*message).ptr, (*message).len)), +// "dsc" => CoinJoinMessage::Complete(process_coinjoin_complete_message((*message).ptr, (*message).len)), +// "dstx" => CoinJoinMessage::BroadcastTx(process_coinjoin_broadcast_tx((*message).ptr, (*message).len)), +// _ => panic!("CoinJoin: Unsupported message type") +// }; +// +// let from_peer = SocketAddress { +// ip_address: UInt128::from_const(peer_address).unwrap_or(UInt128::MIN), +// port: peer_port +// }; +// +// (*client_manager).process_message(from_peer, message); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn notify_new_best_block( +// client_manager: *mut CoinJoinClientManager, +// block_hash: *mut [u8; 32], +// block_height: u32 +// ) { +// let block = common::Block::new( +// block_height, +// UInt256(*(block_hash)) +// ); +// (*client_manager).update_block_tip(block); +// } +// +// unsafe fn process_coinjoin_accept_message( +// message: *const u8, +// message_length: usize +// ) -> messages::CoinJoinAcceptMessage { +// let message: &[u8] = slice::from_raw_parts(message, message_length); +// let mut cursor = Cursor::new(message); +// +// return messages::CoinJoinAcceptMessage::consensus_decode(&mut cursor).unwrap(); +// } +// +// unsafe fn process_coinjoin_broadcast_tx( +// message: *const u8, +// message_length: usize +// ) -> CoinJoinBroadcastTx { +// let message: &[u8] = slice::from_raw_parts(message, message_length); +// let mut cursor = Cursor::new(message); +// +// return CoinJoinBroadcastTx::consensus_decode(&mut cursor).unwrap(); +// } +// +// unsafe fn process_coinjoin_complete_message( +// message: *const u8, +// message_length: usize +// ) -> messages::CoinJoinCompleteMessage { +// let message: &[u8] = slice::from_raw_parts(message, message_length); +// let mut cursor = Cursor::new(message); +// +// return messages::CoinJoinCompleteMessage::consensus_decode(&mut cursor).unwrap(); +// } +// +// unsafe fn process_coinjoin_entry( +// message: *const u8, +// message_length: usize +// ) -> messages::CoinJoinEntry { +// let message: &[u8] = slice::from_raw_parts(message, message_length); +// let mut cursor = Cursor::new(message); +// return messages::CoinJoinEntry::consensus_decode(&mut cursor).unwrap(); +// } +// +// unsafe fn process_coinjoin_final_transaction( +// message: *const u8, +// message_length: usize +// ) -> messages::CoinJoinFinalTransaction { +// let message: &[u8] = slice::from_raw_parts(message, message_length); +// let mut cursor = Cursor::new(message); +// +// return messages::CoinJoinFinalTransaction::consensus_decode(&mut cursor).unwrap(); +// } +// +// unsafe fn process_coinjoin_queue_message( +// message: *const u8, +// message_length: usize +// ) -> messages::CoinJoinQueueMessage { +// let message: &[u8] = slice::from_raw_parts(message, message_length); +// let mut cursor = Cursor::new(message); +// +// return messages::CoinJoinQueueMessage::consensus_decode(&mut cursor).unwrap(); +// } +// +// unsafe fn process_coinjoin_status_update( +// message: *const u8, +// message_length: usize +// ) -> messages::CoinJoinStatusUpdate { +// let message: &[u8] = slice::from_raw_parts(message, message_length); +// let mut cursor = Cursor::new(message); +// +// return messages::CoinJoinStatusUpdate::consensus_decode(&mut cursor).unwrap(); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn process_ds_queue( +// client_manager: *mut CoinJoinClientManager, +// peer_address: *const u8, +// peer_port: u16, +// message: *mut ByteArray +// ) { +// let from_peer = SocketAddress { +// ip_address: UInt128::from_const(peer_address).unwrap_or(UInt128::MIN), +// port: peer_port +// }; +// let message = process_coinjoin_queue_message((*message).ptr, (*message).len); +// (*client_manager).queue_queue_manager.as_ref().unwrap().borrow_mut().process_ds_queue(from_peer, message); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn is_mixing_fee_tx( +// client_manager: *mut CoinJoinClientManager, +// tx_id: *mut [u8; 32] +// ) -> bool { +// return (*client_manager).is_mixing_fee_tx(UInt256(*(tx_id))); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn get_coinjoin_tx_type( +// tx: *mut types::Transaction, +// input_values: *const u64, +// input_values_len: usize +// ) -> CoinJoinTransactionType { +// let inputs: Vec = (0..input_values_len).map(|i| *(input_values.add(i))).collect(); +// return CoinJoinTransactionType::from_tx(&(*tx).decode(), &inputs) +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn lock_outputs( +// client_manager: *mut CoinJoinClientManager, +// tx_hash: *mut [u8; 32], +// incicies: *const u32, +// incicies_len: usize +// ) { +// let indices: Vec = (0..incicies_len).map(|i| *(incicies.add(i))).collect(); +// (*client_manager).lock_outputs(UInt256(*(tx_hash)), indices); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn unlock_outputs( +// client_manager: *mut CoinJoinClientManager, +// tx: *mut types::Transaction +// ) { +// (*client_manager).unlock_outputs(&(*tx).decode()); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn process_used_scripts( +// client_manager: *mut CoinJoinClientManager, +// coinjoin_keys: *mut CoinJoinKeys +// ) { +// let mut scripts: Vec> = Vec::new(); +// +// for i in 0..(*coinjoin_keys).item_count { +// let byte_array = *(*coinjoin_keys).items.add(i); +// let script = slice::from_raw_parts((*byte_array).ptr, (*byte_array).len); +// scripts.push(script.to_vec()); +// } +// +// (*client_manager).process_used_scripts(&scripts) +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn refresh_unused_keys( +// client_manager: *mut CoinJoinClientManager +// ) { +// (*client_manager).refresh_unused_keys(); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn get_anonymizable_balance( +// client_manager: *mut CoinJoinClientManager, +// skip_denominated: bool, +// skip_unconfirmed: bool +// ) -> u64 { +// return (*client_manager).wallet_ex.borrow_mut().get_anonymizable_balance(skip_denominated, skip_unconfirmed); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn change_coinjoin_options( +// client_manager: *mut CoinJoinClientManager, +// new_options_ptr: *mut CoinJoinClientOptions +// ) { +// (*client_manager).change_options(std::ptr::read(new_options_ptr)); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn get_standard_denominations() -> *mut CoinJoinDenominations { +// let denominations = CoinJoin::get_standard_denominations(); +// return boxed(CoinJoinDenominations { +// denoms: denominations.as_ptr(), +// length: denominations.len(), +// }) +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn destroy_coinjoin_denomination( +// denomination: *mut CoinJoinDenominations +// ) { +// let _ = unbox_any(denomination); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn amount_to_denomination( +// input_amount: u64 +// ) -> u32 { +// return CoinJoin::amount_to_denomination(input_amount); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn get_real_outpoint_coinjoin_rounds( +// client_manager: *mut CoinJoinClientManager, +// prevout_hash: *mut [u8; 32], +// index: u32, +// rounds: i32 +// ) -> i32 { +// let outpoint = TxOutPoint::new(UInt256(*(prevout_hash)), index); +// return (*client_manager).get_real_outpoint_coinjoin_rounds(outpoint, rounds); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn get_collateral_amount() -> u64 { +// return CoinJoin::get_collateral_amount(); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn get_max_collateral_amount() -> u64 { +// return CoinJoin::get_max_collateral_amount(); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn get_sessions_status( +// client_manager: *mut CoinJoinClientManager +// ) -> *mut CoinJoinSessionStatuses { +// let statuses = (*client_manager).get_sessions_status(); +// let statuses_ptr = statuses.as_ptr(); +// let length = statuses.len(); +// +// return boxed(CoinJoinSessionStatuses { +// statuses: statuses_ptr, +// length: length, +// }); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn destroy_coinjoin_session_statuses( +// statuses: *mut CoinJoinSessionStatuses +// ) { +// let _ = unbox_any(statuses); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn stop_and_reset_coinjoin( +// client_manager: *mut CoinJoinClientManager +// ) { +// if (*client_manager).is_mixing { +// (*client_manager).reset_pool(); +// (*client_manager).stop_mixing(); +// } +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn initiate_shutdown( +// client_manager: *mut CoinJoinClientManager +// ) { +// (*client_manager).initiate_shutdown(); +// } +// +// #[no_mangle] +// pub unsafe extern "C" fn session_amount( +// client_manager: *mut CoinJoinClientManager +// ) -> i32 { +// return (*client_manager).session_amount() as i32; +// } diff --git a/dash-spv-apple-bindings/src/custom/anyhow.rs b/dash-spv-apple-bindings/src/custom/anyhow.rs new file mode 100644 index 00000000..21485c46 --- /dev/null +++ b/dash-spv-apple-bindings/src/custom/anyhow.rs @@ -0,0 +1,20 @@ +#[allow(non_camel_case_types)] +#[derive(Clone)] +#[ferment_macro::register(anyhow::Error)] +pub struct anyhow_Error(*mut std::os::raw::c_void); +impl ferment::FFIConversionFrom for anyhow_Error { + unsafe fn ffi_from_const(ffi: *const Self) -> anyhow::Error { + *ferment::unbox_any((&*ffi).0 as *mut anyhow::Error) + } +} +impl ferment::FFIConversionTo for anyhow_Error { + unsafe fn ffi_to_const(obj: anyhow::Error) -> *const Self { + ferment::boxed(anyhow_Error(ferment::boxed(obj) as *mut std::os::raw::c_void)) + } +} + +impl Drop for anyhow_Error { + fn drop(&mut self) { + unsafe { ferment::unbox_any(self.0); } + } +} diff --git a/dash-spv-apple-bindings/src/custom/byte.rs b/dash-spv-apple-bindings/src/custom/byte.rs new file mode 100644 index 00000000..5bf19291 --- /dev/null +++ b/dash-spv-apple-bindings/src/custom/byte.rs @@ -0,0 +1,46 @@ +#[allow(non_camel_case_types)] +#[derive(Clone)] +#[ferment_macro::register(byte::Error)] +pub enum byte_Error_FFI { + Incomplete, + BadOffset(usize), + BadInput { err: *mut std::os::raw::c_char }, +} + +impl ferment::FFIConversionFrom for byte_Error_FFI { + unsafe fn ffi_from_const(ffi: *const byte_Error_FFI) -> byte::Error { + let ffi_ref = &*ffi; + match ffi_ref { + byte_Error_FFI::Incomplete => + byte::Error::Incomplete, + byte_Error_FFI::BadOffset(o_0) => byte::Error::BadOffset(*o_0), + byte_Error_FFI::BadInput { err} => + byte::Error::BadInput { err: ferment::FFIConversionFrom::ffi_from_const(*err) }, + } + } +} +impl ferment::FFIConversionTo for byte_Error_FFI { + unsafe fn ffi_to_const(obj: byte::Error) -> *const byte_Error_FFI { + ferment::boxed(match obj { + byte::Error::Incomplete => byte_Error_FFI::Incomplete, + byte::Error::BadOffset(o_0) => byte_Error_FFI::BadOffset(o_0), + byte::Error::BadInput { err } => byte_Error_FFI::BadInput { err: ferment::FFIConversionTo::ffi_to(err) }, + }) + } +} +impl ferment::FFIConversionDestroy for byte_Error_FFI { + unsafe fn destroy(ffi: *mut byte_Error_FFI) { + ferment::unbox_any(ffi); + } +} +impl Drop for byte_Error_FFI { + fn drop(&mut self) { + unsafe { + match self { + byte_Error_FFI::BadInput { err } => + >::destroy(*err), + _ => {}, + } + } + } +} \ No newline at end of file diff --git a/dash-spv-apple-bindings/src/custom/dashcore.rs b/dash-spv-apple-bindings/src/custom/dashcore.rs new file mode 100644 index 00000000..e0cbe406 --- /dev/null +++ b/dash-spv-apple-bindings/src/custom/dashcore.rs @@ -0,0 +1,144 @@ +use crate::fermented::generics::{Arr_u8_20, Arr_u8_32}; +use dashcore::hashes::Hash; +use crate::impl_hash_ferment; + +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::consensus::encode::Error)] +pub struct dashcore_consensus_Error(pub *mut dashcore::consensus::encode::Error); +impl ferment::FFIConversionFrom for dashcore_consensus_Error { + unsafe fn ffi_from_const(ffi: *const Self) -> dashcore::consensus::encode::Error { + *ferment::unbox_any((&*ffi).0) + } +} +impl ferment::FFIConversionTo for dashcore_consensus_Error { + unsafe fn ffi_to_const(obj: dashcore::consensus::encode::Error) -> *const Self { + ferment::boxed(Self(ferment::boxed(obj.into()))) + } +} + +impl Drop for dashcore_consensus_Error { + fn drop(&mut self) { + unsafe { ferment::unbox_any(self.0); } + } +} +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::hash_types::BlockHash)] +pub struct dashcore_hash_types_BlockHash(*mut Arr_u8_32); +impl_hash_ferment!(dashcore::hash_types::BlockHash, dashcore_hash_types_BlockHash); +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::hash_types::CycleHash)] +pub struct dashcore_hash_types_CycleHash(*mut Arr_u8_32); +impl_hash_ferment!(dashcore::hash_types::CycleHash, dashcore_hash_types_CycleHash); +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::hash_types::Txid)] +pub struct dashcore_hash_types_Txid(*mut Arr_u8_32); +impl_hash_ferment!(dashcore::hash_types::Txid, dashcore_hash_types_Txid); +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::hash_types::PubkeyHash)] +pub struct dashcore_hash_types_PubkeyHash(*mut Arr_u8_20); +impl_hash_ferment!(dashcore::hash_types::PubkeyHash, dashcore_hash_types_PubkeyHash); + +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::hash_types::ScriptHash)] +pub struct dashcore_hash_types_ScriptHash(*mut Arr_u8_20); +impl_hash_ferment!(dashcore::hash_types::ScriptHash, dashcore_hash_types_ScriptHash); +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::hash_types::TxMerkleNode)] +pub struct dashcore_hash_types_TxMerkleNode(*mut Arr_u8_32); +impl_hash_ferment!(dashcore::hash_types::TxMerkleNode, dashcore_hash_types_TxMerkleNode); +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::hash_types::SpecialTransactionPayloadHash)] +pub struct dashcore_hash_types_SpecialTransactionPayloadHash(*mut Arr_u8_32); +impl_hash_ferment!(dashcore::hash_types::SpecialTransactionPayloadHash, dashcore_hash_types_SpecialTransactionPayloadHash); + +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::hash_types::InputsHash)] +pub struct dashcore_hash_types_InputsHash(*mut Arr_u8_32); +impl_hash_ferment!(dashcore::hash_types::InputsHash, dashcore_hash_types_InputsHash); +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::hash_types::QuorumHash)] +pub struct dashcore_hash_types_QuorumHash(*mut Arr_u8_32); +impl_hash_ferment!(dashcore::hash_types::QuorumHash, dashcore_hash_types_QuorumHash); +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::hash_types::QuorumVVecHash)] +pub struct dashcore_hash_types_QuorumVVecHash(*mut Arr_u8_32); +impl_hash_ferment!(dashcore::hash_types::QuorumVVecHash, dashcore_hash_types_QuorumVVecHash); + +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::hash_types::QuorumSigningRequestId)] +pub struct dashcore_hash_types_QuorumSigningRequestId(*mut Arr_u8_32); +impl_hash_ferment!(dashcore::hash_types::QuorumSigningRequestId, dashcore_hash_types_QuorumSigningRequestId); +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::hash_types::ProTxHash)] +pub struct dashcore_hash_types_ProTxHash(*mut Arr_u8_32); +impl_hash_ferment!(dashcore::hash_types::ProTxHash, dashcore_hash_types_ProTxHash); + +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::hash_types::MerkleRootMasternodeList)] +pub struct dashcore_hash_types_MerkleRootMasternodeList(*mut Arr_u8_32); +impl_hash_ferment!(dashcore::hash_types::MerkleRootMasternodeList, dashcore_hash_types_MerkleRootMasternodeList); + +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::hash_types::MerkleRootQuorums)] +pub struct dashcore_hash_types_MerkleRootQuorums(*mut Arr_u8_32); +impl_hash_ferment!(dashcore::hash_types::MerkleRootQuorums, dashcore_hash_types_MerkleRootQuorums); + +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::hash_types::QuorumEntryHash)] +pub struct dashcore_hash_types_QuorumEntryHash(*mut Arr_u8_32); +impl_hash_ferment!(dashcore::hash_types::QuorumEntryHash, dashcore_hash_types_QuorumEntryHash); + +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::hash_types::ConfirmedHashHashedWithProRegTx)] +pub struct dashcore_hash_types_ConfirmedHashHashedWithProRegTx(*mut Arr_u8_32); +impl_hash_ferment!(dashcore::hash_types::ConfirmedHashHashedWithProRegTx, dashcore_hash_types_ConfirmedHashHashedWithProRegTx); + +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::hash_types::ConfirmedHash)] +pub struct dashcore_hash_types_ConfirmedHash(*mut Arr_u8_32); +impl_hash_ferment!(dashcore::hash_types::ConfirmedHash, dashcore_hash_types_ConfirmedHash); +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::hash_types::QuorumCommitmentHash)] +pub struct dashcore_hash_types_QuorumCommitmentHash(*mut Arr_u8_32); +impl_hash_ferment!(dashcore::hash_types::QuorumCommitmentHash, dashcore_hash_types_QuorumCommitmentHash); + +#[allow(non_camel_case_types)] +#[ferment_macro::register(dashcore::hash_types::Sha256dHash)] +pub struct dashcore_hash_types_Sha256dHash(*mut Arr_u8_32); +impl_hash_ferment!(dashcore::hash_types::Sha256dHash, dashcore_hash_types_Sha256dHash); + + +#[allow(non_camel_case_types)] +#[derive(Clone)] +#[ferment_macro::register(dashcore::hashes::hex::Error)] +pub enum hashes_hex_Error_FFI { + InvalidChar(u8), + OddLengthString(usize), + InvalidLength(usize, usize), +} +// use + +impl ferment::FFIConversionFrom for hashes_hex_Error_FFI { + unsafe fn ffi_from_const(ffi: *const hashes_hex_Error_FFI) -> dashcore::hashes::hex::Error { + let ffi_ref = &*ffi; + match ffi_ref { + hashes_hex_Error_FFI::InvalidChar(o_0) => dashcore::hashes::hex::Error::InvalidChar(*o_0), + hashes_hex_Error_FFI::OddLengthString(o_0) => dashcore::hashes::hex::Error::OddLengthString(*o_0), + hashes_hex_Error_FFI::InvalidLength(o_0, o_1) => dashcore::hashes::hex::Error::InvalidLength(*o_0, *o_1), + } + } +} +impl ferment::FFIConversionTo for hashes_hex_Error_FFI { + unsafe fn ffi_to_const(obj: dashcore::hashes::hex::Error) -> *const hashes_hex_Error_FFI { + ferment::boxed(match obj { + dashcore::hashes::hex::Error::InvalidChar(o_0) => hashes_hex_Error_FFI::InvalidChar(o_0), + dashcore::hashes::hex::Error::OddLengthString(o_0) => hashes_hex_Error_FFI::OddLengthString(o_0), + dashcore::hashes::hex::Error::InvalidLength(o_0, o_1) => hashes_hex_Error_FFI::InvalidLength(o_0, o_1), + }) + } +} +impl ferment::FFIConversionDestroy for hashes_hex_Error_FFI { + unsafe fn destroy(ffi: *mut hashes_hex_Error_FFI) { + ferment::unbox_any(ffi); + } +} diff --git a/dash-spv-apple-bindings/src/custom/dpp.rs b/dash-spv-apple-bindings/src/custom/dpp.rs new file mode 100644 index 00000000..1beaf1d7 --- /dev/null +++ b/dash-spv-apple-bindings/src/custom/dpp.rs @@ -0,0 +1,19 @@ +#[allow(non_camel_case_types)] +#[derive(Clone)] +#[ferment_macro::register(dpp::data_contract::document_type::index::LazyRegex)] +pub struct LazyRegexFFI(pub *mut dpp::data_contract::document_type::index::LazyRegex); +crate::impl_cloneable_ferment!(dpp::data_contract::document_type::index::LazyRegex, LazyRegexFFI); + +#[allow(non_camel_case_types)] +#[derive(Clone)] +#[ferment_macro::register(dpp::data_contract::associated_token::token_configuration::TokenConfiguration)] +pub struct TokenConfigurationFFI(pub *mut dpp::data_contract::associated_token::token_configuration::TokenConfiguration); +crate::impl_cloneable_ferment!(dpp::data_contract::associated_token::token_configuration::TokenConfiguration, TokenConfigurationFFI); + +#[allow(non_camel_case_types)] +#[derive(Clone)] +#[ferment_macro::register(dpp::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem)] +pub struct TokenConfigurationChangeItemFFI(pub *mut dpp::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem); +crate::impl_cloneable_ferment!(dpp::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem, TokenConfigurationChangeItemFFI); + + diff --git a/dash-spv-apple-bindings/src/custom/grovedb_version.rs b/dash-spv-apple-bindings/src/custom/grovedb_version.rs new file mode 100644 index 00000000..d8b3dd99 --- /dev/null +++ b/dash-spv-apple-bindings/src/custom/grovedb_version.rs @@ -0,0 +1,26 @@ +#[allow(non_camel_case_types)] +#[ferment_macro::register(grovedb_version::version::GroveVersion)] +pub struct grovedb_version_GroveVersion { + raw: *mut grovedb_version::version::GroveVersion, +} + +impl ferment::FFIConversionFrom for grovedb_version_GroveVersion { + unsafe fn ffi_from_const(ffi: *const Self) -> grovedb_version::version::GroveVersion { + let ffi = &*ffi; + let raw = &*ffi.raw; + raw.clone() + } +} +impl ferment::FFIConversionTo for grovedb_version_GroveVersion { + unsafe fn ffi_to_const(obj: grovedb_version::version::GroveVersion) -> *const Self { + ferment::boxed(Self { raw: ferment::boxed(obj) }) + } +} + +impl Drop for grovedb_version_GroveVersion { + fn drop(&mut self) { + unsafe { + ferment::unbox_any(self.raw); + } + } +} diff --git a/dash-spv-apple-bindings/src/custom/jsonschema.rs b/dash-spv-apple-bindings/src/custom/jsonschema.rs new file mode 100644 index 00000000..9ab5b9b6 --- /dev/null +++ b/dash-spv-apple-bindings/src/custom/jsonschema.rs @@ -0,0 +1,29 @@ +use ferment::{boxed, FFIConversionFrom, FFIConversionTo, unbox_any}; + +#[allow(non_camel_case_types)] +#[ferment_macro::register(jsonschema::ValidationError)] +pub struct jsonschema_ValidationError { + raw: *mut jsonschema::ValidationError<'static>, +} +impl FFIConversionFrom> for jsonschema_ValidationError { + unsafe fn ffi_from_const(ffi: *const Self) -> jsonschema::ValidationError<'static> { + FFIConversionFrom::ffi_from(ffi.cast_mut()) + } + + unsafe fn ffi_from(ffi: *mut Self) -> jsonschema::ValidationError<'static> { + *unbox_any((&*ffi).raw) + } +} +impl FFIConversionTo> for jsonschema_ValidationError { + unsafe fn ffi_to_const(obj: jsonschema::ValidationError<'static>) -> *const Self { + boxed(jsonschema_ValidationError { raw: boxed(obj) }) + } +} + +impl Drop for jsonschema_ValidationError { + fn drop(&mut self) { + unsafe { + unbox_any(self.raw); + } + } +} diff --git a/dash-spv-apple-bindings/src/custom/mod.rs b/dash-spv-apple-bindings/src/custom/mod.rs new file mode 100644 index 00000000..4d3e8472 --- /dev/null +++ b/dash-spv-apple-bindings/src/custom/mod.rs @@ -0,0 +1,91 @@ +use ::dashcore::hashes::Hash; + +pub mod anyhow; +pub mod byte; +pub mod dashcore; +pub mod dpp; +pub mod grovedb_version; +pub mod jsonschema; +pub mod regex; +pub mod serde_json; +pub mod std; +pub mod sdk; +pub mod versioned_feature_core; + +#[macro_export] +macro_rules! mangle_path { + // Base case: handle a single segment + ($segment:ident, $suffix:literal) => { + concat!(stringify!($segment), $suffix) + }; + // Recursive case: replace `::` with `_` + ($first:ident :: $($rest:tt)*, $suffix:literal) => { + concat!(stringify!($first), "_", mangle_path!($($rest)*, $suffix)) + }; +} + +#[macro_export] +macro_rules! impl_cloneable_ferment { + ($ty:path, $ffitype:ident) => { + impl ferment::FFIConversionFrom<$ty> for $ffitype { + unsafe fn ffi_from_const(ffi: *const Self) -> $ty { + let ffi = &*ffi; + let raw = &*ffi.0; + raw.clone() + } + } + impl ferment::FFIConversionTo<$ty> for $ffitype { + unsafe fn ffi_to_const(obj: $ty) -> *const Self { + ferment::boxed(Self(ferment::boxed(obj))) + } + } + impl Drop for $ffitype { + fn drop(&mut self) { + unsafe { + ferment::unbox_any(self.0); + } + } + } + }; +} + +#[macro_export] +macro_rules! impl_hash_ferment { + ($hashtype:path, $ffitype:ident) => { + impl ferment::FFIConversionFrom<$hashtype> for $ffitype { + unsafe fn ffi_from_const(ffi: *const Self) -> $hashtype { + <$hashtype>::from_byte_array(ferment::FFIConversionFrom::ffi_from((&*ffi).0)) + } + } + impl ferment::FFIConversionTo<$hashtype> for $ffitype { + unsafe fn ffi_to_const(obj: $hashtype) -> *const Self { + ferment::boxed(Self(ferment::FFIConversionTo::ffi_to(obj.to_byte_array()))) + } + } + impl Drop for $ffitype { + fn drop(&mut self) { + unsafe { ferment::unbox_any(self.0); } + } + } + }; +} + +pub unsafe fn to_ffi_bytes(ptr: *mut F) -> *mut B +where T: Hash, + F: ferment::FFIConversionFrom, + B: ferment::FFIConversionTo { + let hash = ferment::FFIConversionFrom::::ffi_from(ptr); + let byte_arr = T::to_byte_array(hash); + let ptr = ferment::FFIConversionTo::ffi_to(byte_arr); + ptr +} + +pub unsafe fn to_ffi_hash(ffi_bytes: *mut B) -> *mut F +where T: Hash, + F: ferment::FFIConversionTo, + B: ferment::FFIConversionFrom { + let byte_arr = ferment::FFIConversionFrom::ffi_from(ffi_bytes); + let hash = T::from_byte_array(byte_arr); + let ptr = ferment::FFIConversionTo::ffi_to(hash); + ptr +} diff --git a/dash-spv-apple-bindings/src/custom/regex.rs b/dash-spv-apple-bindings/src/custom/regex.rs new file mode 100644 index 00000000..91273c85 --- /dev/null +++ b/dash-spv-apple-bindings/src/custom/regex.rs @@ -0,0 +1,26 @@ +#[allow(non_camel_case_types)] +#[ferment_macro::register(regex::Regex)] +pub struct regex_Regex { + raw: *mut regex::Regex, +} + +impl ferment::FFIConversionFrom for regex_Regex { + unsafe fn ffi_from_const(ffi: *const Self) -> regex::Regex { + let ffi = &*ffi; + let raw = &*ffi.raw; + raw.clone() + } +} +impl ferment::FFIConversionTo for regex_Regex { + unsafe fn ffi_to_const(obj: regex::Regex) -> *const Self { + ferment::boxed(Self { raw: ferment::boxed(obj) }) + } +} + +impl Drop for regex_Regex { + fn drop(&mut self) { + unsafe { + ferment::unbox_any(self.raw); + } + } +} diff --git a/dash-spv-apple-bindings/src/custom/sdk.rs b/dash-spv-apple-bindings/src/custom/sdk.rs new file mode 100644 index 00000000..43ec45cf --- /dev/null +++ b/dash-spv-apple-bindings/src/custom/sdk.rs @@ -0,0 +1,30 @@ +use ferment::{boxed, FFIConversionFrom, FFIConversionTo, unbox_any}; + +#[allow(non_camel_case_types)] +#[derive(Clone)] +#[ferment_macro::register(dash_sdk::error::Error)] +pub struct dash_sdk_error_ErrorFFI { + raw: *mut dash_sdk::error::Error, +} +impl FFIConversionFrom for dash_sdk_error_ErrorFFI { + unsafe fn ffi_from_const(ffi: *const Self) -> dash_sdk::error::Error { + FFIConversionFrom::ffi_from(ffi.cast_mut()) + } + + unsafe fn ffi_from(ffi: *mut Self) -> dash_sdk::error::Error { + *unbox_any((&*ffi).raw) + } +} +impl FFIConversionTo for dash_sdk_error_ErrorFFI { + unsafe fn ffi_to_const(obj: dash_sdk::error::Error) -> *const Self { + boxed(dash_sdk_error_ErrorFFI { raw: boxed(obj) }) + } +} + +impl Drop for dash_sdk_error_ErrorFFI { + fn drop(&mut self) { + unsafe { + unbox_any(self.raw); + } + } +} diff --git a/dash-spv-apple-bindings/src/custom/serde_json.rs b/dash-spv-apple-bindings/src/custom/serde_json.rs new file mode 100644 index 00000000..e68ea881 --- /dev/null +++ b/dash-spv-apple-bindings/src/custom/serde_json.rs @@ -0,0 +1,89 @@ +#[allow(non_camel_case_types)] +#[ferment_macro::register(serde_json::Value)] +#[derive(Clone)] +pub struct serde_json_JsonValue { + raw_err: *mut serde_json::Value, +} +impl ferment::FFIConversionFrom for serde_json_JsonValue { + unsafe fn ffi_from_const(ffi: *const Self) -> serde_json::Value { + let ffi = &*ffi; + match &*ffi.raw_err { + serde_json::Value::Null => serde_json::Value::Null, + serde_json::Value::Bool(o_0) => serde_json::Value::Bool(*o_0), + serde_json::Value::Number(o_0) => serde_json::Value::Number(o_0.clone()), + serde_json::Value::String(o_0) => serde_json::Value::String(o_0.clone()), + serde_json::Value::Array(o_0) => serde_json::Value::Array(o_0.clone()), + serde_json::Value::Object(o_0) => serde_json::Value::Object(o_0.clone()) + } + } +} +impl ferment::FFIConversionTo for serde_json_JsonValue { + unsafe fn ffi_to_const(obj: serde_json::Value) -> *const Self { + ferment::boxed(serde_json_JsonValue { raw_err: ferment::boxed(obj) }) + } +} + +impl Drop for serde_json_JsonValue { + fn drop(&mut self) { + unsafe { + ferment::unbox_any(self.raw_err); + } + } +} + +#[allow(non_camel_case_types)] +#[ferment_macro::register(serde_json::Error)] +// #[derive(Clone)] +pub struct serde_json_Error { + raw: *mut serde_json::Error, +} +impl ferment::FFIConversionFrom for serde_json_Error { + unsafe fn ffi_from_const(ffi: *const Self) -> serde_json::Error { + ferment::FFIConversionFrom::ffi_from(ffi.cast_mut()) + } + unsafe fn ffi_from(ffi: *mut Self) -> serde_json::Error { + *ferment::unbox_any((&*ffi).raw) + } +} +impl ferment::FFIConversionTo for serde_json_Error { + unsafe fn ffi_to_const(obj: serde_json::Error) -> *const Self { + ferment::boxed(serde_json_Error { raw: ferment::boxed(obj) }) + } +} + +impl Drop for serde_json_Error { + fn drop(&mut self) { + unsafe { + ferment::unbox_any(self.raw); + } + } +} + +#[allow(non_camel_case_types)] +// #[ferment_macro::register(serde_json::Map)] +// #[derive(Clone)] +pub struct serde_json_Map_keys_String_values_platform_value_Value { + raw: *mut serde_json::Map, +} + +impl ferment::FFIConversionFrom> for serde_json_Map_keys_String_values_platform_value_Value { + unsafe fn ffi_from_const(ffi: *const Self) -> serde_json::Map { + Self::ffi_from(ffi.cast_mut()) + } + unsafe fn ffi_from(ffi: *mut Self) -> serde_json::Map { + *ferment::unbox_any((&*ffi).raw) + } +} +impl ferment::FFIConversionTo> for serde_json_Map_keys_String_values_platform_value_Value { + unsafe fn ffi_to_const(obj: serde_json::Map) -> *const Self { + ferment::boxed(serde_json_Map_keys_String_values_platform_value_Value { raw: ferment::boxed(obj) }) + } +} + +impl Drop for serde_json_Map_keys_String_values_platform_value_Value { + fn drop(&mut self) { + unsafe { + ferment::unbox_any(self.raw); + } + } +} \ No newline at end of file diff --git a/dash-spv-apple-bindings/src/custom/std.rs b/dash-spv-apple-bindings/src/custom/std.rs new file mode 100644 index 00000000..3c5f96e9 --- /dev/null +++ b/dash-spv-apple-bindings/src/custom/std.rs @@ -0,0 +1,39 @@ +#[allow(non_camel_case_types)] +#[ferment_macro::register(std::net::SocketAddr)] +#[derive(Clone)] +pub enum SocketAddr { + V4 { ip: *mut [u8; 4], port: u16 }, + V6 { ip: *mut [u8; 16], port: u16, flowinfo: u32, scope_id: u32 }, +} +impl ferment::FFIConversionFrom for SocketAddr { + unsafe fn ffi_from_const(ffi: *const Self) -> std::net::SocketAddr { + let ffi = &*ffi; + match ffi { + Self::V4 { ip, port } => + std::net::SocketAddr::V4(std::net::SocketAddrV4::new(std::net::Ipv4Addr::from(*ip.clone()), *port)), + Self::V6 { ip, port, flowinfo, scope_id } => + std::net::SocketAddr::V6(std::net::SocketAddrV6::new(std::net::Ipv6Addr::from(*ip.clone()), *port, *flowinfo, *scope_id)) + } + } +} +impl ferment::FFIConversionTo for SocketAddr { + unsafe fn ffi_to_const(obj: std::net::SocketAddr) -> *const Self { + ferment::boxed(match obj { + std::net::SocketAddr::V4(addr) => + Self::V4 { ip: ferment::boxed(addr.ip().octets()), port: addr.port() }, + std::net::SocketAddr::V6(addr) => + Self::V6 { ip: ferment::boxed(addr.ip().octets()), port: addr.port(), flowinfo: addr.flowinfo(), scope_id: addr.scope_id() } + }) + } +} + +impl Drop for SocketAddr { + fn drop(&mut self) { + unsafe { + match self { + Self::V4 { ip, port } => { ferment::unbox_any(ip); } + Self::V6 { ip, port, flowinfo, scope_id } => { ferment::unbox_any(ip); } + } + } + } +} diff --git a/dash-spv-apple-bindings/src/custom/versioned_feature_core.rs b/dash-spv-apple-bindings/src/custom/versioned_feature_core.rs new file mode 100644 index 00000000..0d61fc1b --- /dev/null +++ b/dash-spv-apple-bindings/src/custom/versioned_feature_core.rs @@ -0,0 +1,30 @@ +use ferment::{boxed, unbox_any, FFIConversionFrom, FFIConversionTo}; + +#[allow(non_camel_case_types)] +#[derive(Clone)] +#[ferment_macro::register(versioned_feature_core::FeatureVersion)] +pub struct versioned_feature_core_FeatureVersion { + raw: *mut versioned_feature_core::FeatureVersion, +} +impl FFIConversionFrom for versioned_feature_core_FeatureVersion { + unsafe fn ffi_from_const(ffi: *const Self) -> versioned_feature_core::FeatureVersion { + FFIConversionFrom::ffi_from(ffi.cast_mut()) + } + + unsafe fn ffi_from(ffi: *mut Self) -> versioned_feature_core::FeatureVersion { + *unbox_any((&*ffi).raw) + } +} +impl FFIConversionTo for versioned_feature_core_FeatureVersion { + unsafe fn ffi_to_const(obj: versioned_feature_core::FeatureVersion) -> *const Self { + boxed(versioned_feature_core_FeatureVersion { raw: boxed(obj) }) + } +} + +impl Drop for versioned_feature_core_FeatureVersion { + fn drop(&mut self) { + unsafe { + unbox_any(self.raw); + } + } +} diff --git a/dash-spv-apple-bindings/src/fermented.rs b/dash-spv-apple-bindings/src/fermented.rs index ba7b8d52..a6f9456a 100644 --- a/dash-spv-apple-bindings/src/fermented.rs +++ b/dash-spv-apple-bindings/src/fermented.rs @@ -1 +1 @@ -# [allow (clippy :: let_and_return , clippy :: suspicious_else_formatting , clippy :: redundant_field_names , dead_code , redundant_semicolons , unused_braces , unused_imports , unused_unsafe , unused_variables , unused_qualifications)] pub mod types { pub mod address { pub mod addresses { # [doc = "FFI-representation of the address_with_script_pubkey"] # [doc = r" # Safety"] # [no_mangle] pub unsafe extern "C" fn ffi_address_with_script_pubkey (script : * mut crate :: fermented :: generics :: Vec_u8 , chain_type : * mut dash_spv_masternode_processor :: fermented :: types :: chain :: common :: chain_type :: ChainType ,) -> * mut std :: os :: raw :: c_char { let obj = crate :: address :: addresses :: address_with_script_pubkey (ferment_interfaces :: FFIConversion :: ffi_from (script) , ferment_interfaces :: FFIConversion :: ffi_from (chain_type) ,) ; ferment_interfaces :: FFIConversion :: ffi_to_opt (obj) } # [doc = "FFI-representation of the address_from_hash160"] # [doc = r" # Safety"] # [no_mangle] pub unsafe extern "C" fn ffi_address_from_hash160 (hash : * mut dash_spv_masternode_processor :: fermented :: types :: crypto :: byte_util :: UInt160 , chain_type : * mut dash_spv_masternode_processor :: fermented :: types :: chain :: common :: chain_type :: ChainType ,) -> * mut std :: os :: raw :: c_char { let obj = crate :: address :: addresses :: address_from_hash160 (ferment_interfaces :: FFIConversion :: ffi_from (hash) , ferment_interfaces :: FFIConversion :: ffi_from (chain_type) ,) ; ferment_interfaces :: FFIConversion :: ffi_to (obj) } } } pub mod ffi { pub mod callbacks { # [doc = "FFI-representation of the GetMerkleRootCallback"] # [allow (non_camel_case_types)] pub type GetMerkleRootCallback = unsafe extern "C" fn (block_hash : * mut dash_spv_masternode_processor :: fermented :: types :: crypto :: byte_util :: UInt256 , context : * mut ferment_interfaces :: fermented :: types :: OpaqueContext_FFI) -> * mut dash_spv_masternode_processor :: fermented :: types :: crypto :: byte_util :: UInt256 ; # [doc = "FFI-representation of the GetBlockHashByHeightCallback"] # [allow (non_camel_case_types)] pub type GetBlockHashByHeightCallback = unsafe extern "C" fn (block_height : u32 , context : * mut ferment_interfaces :: fermented :: types :: OpaqueContext_FFI) -> * mut dash_spv_masternode_processor :: fermented :: types :: crypto :: byte_util :: UInt256 ; # [doc = "FFI-representation of the ShouldProcessDiffWithRangeCallback"] # [allow (non_camel_case_types)] pub type ShouldProcessDiffWithRangeCallback = unsafe extern "C" fn (base_block_hash : * mut dash_spv_masternode_processor :: fermented :: types :: crypto :: byte_util :: UInt256 , block_hash : * mut dash_spv_masternode_processor :: fermented :: types :: crypto :: byte_util :: UInt256 , context : * mut ferment_interfaces :: fermented :: types :: OpaqueContext_FFI) -> * mut dash_spv_masternode_processor :: fermented :: types :: processing :: processing_error :: ProcessingError ; # [doc = "FFI-representation of the GetLLMQSnapshotByBlockHashCallback"] # [allow (non_camel_case_types)] pub type GetLLMQSnapshotByBlockHashCallback = unsafe extern "C" fn (block_hash : * mut dash_spv_masternode_processor :: fermented :: types :: crypto :: byte_util :: UInt256 , context : * mut ferment_interfaces :: fermented :: types :: OpaqueContext_FFI) -> * mut dash_spv_masternode_processor :: fermented :: types :: models :: snapshot :: LLMQSnapshot ; # [doc = "FFI-representation of the SaveMasternodeListCallback"] # [allow (non_camel_case_types)] pub type SaveMasternodeListCallback = unsafe extern "C" fn (block_hash : * mut dash_spv_masternode_processor :: fermented :: types :: crypto :: byte_util :: UInt256 , masternode_list : * mut dash_spv_masternode_processor :: fermented :: types :: models :: masternode_list :: MasternodeList , context : * mut ferment_interfaces :: fermented :: types :: OpaqueContext_FFI) -> bool ; # [doc = "FFI-representation of the SaveLLMQSnapshotCallback"] # [allow (non_camel_case_types)] pub type SaveLLMQSnapshotCallback = unsafe extern "C" fn (block_hash : * mut dash_spv_masternode_processor :: fermented :: types :: crypto :: byte_util :: UInt256 , snapshot : * mut dash_spv_masternode_processor :: fermented :: types :: models :: snapshot :: LLMQSnapshot , context : * mut ferment_interfaces :: fermented :: types :: OpaqueContext_FFI) -> bool ; # [doc = "FFI-representation of the GetBlockHeightByHashCallback"] # [allow (non_camel_case_types)] pub type GetBlockHeightByHashCallback = unsafe extern "C" fn (block_hash : * mut dash_spv_masternode_processor :: fermented :: types :: crypto :: byte_util :: UInt256 , context : * mut ferment_interfaces :: fermented :: types :: OpaqueContext_FFI) -> u32 ; # [doc = "FFI-representation of the AddInsightCallback"] # [allow (non_camel_case_types)] pub type AddInsightCallback = unsafe extern "C" fn (block_hash : * mut dash_spv_masternode_processor :: fermented :: types :: crypto :: byte_util :: UInt256 , context : * mut ferment_interfaces :: fermented :: types :: OpaqueContext_FFI) ; # [doc = "FFI-representation of the DestroyMasternodeListCallback"] # [allow (non_camel_case_types)] pub type DestroyMasternodeListCallback = unsafe extern "C" fn (masternode_list : * mut dash_spv_masternode_processor :: fermented :: types :: models :: masternode_list :: MasternodeList) ; # [doc = "FFI-representation of the DestroyHashCallback"] # [allow (non_camel_case_types)] pub type DestroyHashCallback = unsafe extern "C" fn (hash : * mut dash_spv_masternode_processor :: fermented :: types :: crypto :: byte_util :: UInt256) ; # [doc = "FFI-representation of the GetMasternodeListCallback"] # [allow (non_camel_case_types)] pub type GetMasternodeListCallback = unsafe extern "C" fn (block_hash : * mut dash_spv_masternode_processor :: fermented :: types :: crypto :: byte_util :: UInt256 , context : * mut ferment_interfaces :: fermented :: types :: OpaqueContext_FFI) -> * mut dash_spv_masternode_processor :: fermented :: types :: models :: masternode_list :: MasternodeList ; # [doc = "FFI-representation of the GetCLSignatureByBlockHashCallback"] # [allow (non_camel_case_types)] pub type GetCLSignatureByBlockHashCallback = unsafe extern "C" fn (block_hash : * mut dash_spv_masternode_processor :: fermented :: types :: crypto :: byte_util :: UInt256 , context : * mut ferment_interfaces :: fermented :: types :: OpaqueContext_FFI) -> * mut dash_spv_masternode_processor :: fermented :: types :: crypto :: byte_util :: UInt768 ; # [doc = "FFI-representation of the DestroyLLMQSnapshotCallback"] # [allow (non_camel_case_types)] pub type DestroyLLMQSnapshotCallback = unsafe extern "C" fn (snapshot : * mut dash_spv_masternode_processor :: fermented :: types :: models :: snapshot :: LLMQSnapshot) ; # [doc = "FFI-representation of the SaveCLSignatureCallback"] # [allow (non_camel_case_types)] pub type SaveCLSignatureCallback = unsafe extern "C" fn (block_hash : * mut dash_spv_masternode_processor :: fermented :: types :: crypto :: byte_util :: UInt256 , cl_signature : * mut dash_spv_masternode_processor :: fermented :: types :: crypto :: byte_util :: UInt768 , context : * mut ferment_interfaces :: fermented :: types :: OpaqueContext_FFI) -> bool ; } } } # [allow (clippy :: let_and_return , clippy :: suspicious_else_formatting , clippy :: redundant_field_names , dead_code , redundant_semicolons , unused_braces , unused_imports , unused_unsafe , unused_variables , unused_qualifications)] pub mod generics { # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct Vec_u8 { pub count : usize , pub values : * mut u8 , } impl ferment_interfaces :: FFIConversion < Vec < u8 > > for Vec_u8 { unsafe fn ffi_from_const (ffi : * const Vec_u8) -> Vec < u8 > { ferment_interfaces :: FFIVecConversion :: decode (& * ffi) } unsafe fn ffi_to_const (obj : Vec < u8 >) -> * const Vec_u8 { ferment_interfaces :: FFIVecConversion :: encode (obj) } unsafe fn destroy (ffi : * mut Vec_u8) { ferment_interfaces :: unbox_any (ffi) ; ; } } impl ferment_interfaces :: FFIVecConversion for Vec_u8 { type Value = Vec < u8 > ; unsafe fn decode (& self) -> Self :: Value { ferment_interfaces :: from_primitive_vec (self . values , self . count) } unsafe fn encode (obj : Self :: Value) -> * mut Self { ferment_interfaces :: boxed (Self { count : obj . len () , values : ferment_interfaces :: boxed_vec (obj) }) } } impl Drop for Vec_u8 { fn drop (& mut self) { unsafe { ferment_interfaces :: unbox_vec_ptr (self . values , self . count) ; } } } } \ No newline at end of file +# [allow (clippy :: let_and_return , clippy :: suspicious_else_formatting , clippy :: redundant_field_names , dead_code , non_camel_case_types , non_snake_case , non_upper_case_globals , redundant_semicolons , unreachable_patterns , unused_braces , unused_imports , unused_parens , unused_qualifications , unused_unsafe , unused_variables)] pub mod types { pub mod dash_spv_keychain { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`KeyChainError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_keychain_KeyChainError { OsStatusCode (i32) } impl ferment :: FFIConversionFrom < dash_spv_keychain :: KeyChainError > for dash_spv_keychain_KeyChainError { unsafe fn ffi_from_const (ffi : * const dash_spv_keychain_KeyChainError) -> dash_spv_keychain :: KeyChainError { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_keychain_KeyChainError :: OsStatusCode (o_0) => dash_spv_keychain :: KeyChainError :: OsStatusCode (* o_0) } } } impl ferment :: FFIConversionTo < dash_spv_keychain :: KeyChainError > for dash_spv_keychain_KeyChainError { unsafe fn ffi_to_const (obj : dash_spv_keychain :: KeyChainError) -> * const dash_spv_keychain_KeyChainError { ferment :: boxed (match obj { dash_spv_keychain :: KeyChainError :: OsStatusCode (o_0) => dash_spv_keychain_KeyChainError :: OsStatusCode (o_0) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_keychain_KeyChainError { fn drop (& mut self) { unsafe { match self { dash_spv_keychain_KeyChainError :: OsStatusCode (o_0) => { ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_keychain_KeyChainError_OsStatusCode_ctor (o_o_0 : i32) -> * mut dash_spv_keychain_KeyChainError { ferment :: boxed (dash_spv_keychain_KeyChainError :: OsStatusCode (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_keychain_KeyChainError_destroy < > (ffi : * mut dash_spv_keychain_KeyChainError) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`dash_spv_keychain::KeychainController::new`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_keychain_KeychainController_new (get : crate :: fermented :: generics :: Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError , set : crate :: fermented :: generics :: Fn_ARGS_dash_spv_keychain_KeyChainKey_dash_spv_keychain_KeyChainValue_bool_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError , has : crate :: fermented :: generics :: Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError , delete : crate :: fermented :: generics :: Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError) -> * mut dash_spv_keychain :: KeychainController { let obj = dash_spv_keychain :: KeychainController :: new (move | o_0 | unsafe { get . call (o_0) } , move | o_0 , o_1 , o_2 | unsafe { set . call (o_0 , o_1 , o_2) } , move | o_0 | unsafe { has . call (o_0) } , move | o_0 | unsafe { delete . call (o_0) }) ; ferment :: boxed (obj) } # [doc = "FFI-representation of the [`dash_spv_keychain::KeychainController::get`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_keychain_KeychainController_get (self_ : * mut dash_spv_keychain :: KeychainController , key : * mut crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainKey) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError { let obj = dash_spv_keychain :: KeychainController :: get (& * self_ , < crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainKey as ferment :: FFIConversionFrom < dash_spv_keychain :: KeyChainKey >> :: ffi_from (key)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError as ferment :: FFIConversionTo < Result < dash_spv_keychain :: KeyChainValue , dash_spv_keychain :: KeyChainError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_keychain::KeychainController::set`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_keychain_KeychainController_set (self_ : * mut dash_spv_keychain :: KeychainController , key : * mut crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainKey , value : * mut crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainValue , authenticated : bool) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_keychain_KeyChainError { let obj = dash_spv_keychain :: KeychainController :: set (& * self_ , < crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainKey as ferment :: FFIConversionFrom < dash_spv_keychain :: KeyChainKey >> :: ffi_from (key) , < crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainValue as ferment :: FFIConversionFrom < dash_spv_keychain :: KeyChainValue >> :: ffi_from (value) , authenticated) ; < crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_keychain_KeyChainError as ferment :: FFIConversionTo < Result < bool , dash_spv_keychain :: KeyChainError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_keychain::KeychainController::has`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_keychain_KeychainController_has (self_ : * mut dash_spv_keychain :: KeychainController , key : * mut crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainKey) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_keychain_KeyChainError { let obj = dash_spv_keychain :: KeychainController :: has (& * self_ , < crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainKey as ferment :: FFIConversionFrom < dash_spv_keychain :: KeyChainKey >> :: ffi_from (key)) ; < crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_keychain_KeyChainError as ferment :: FFIConversionTo < Result < bool , dash_spv_keychain :: KeyChainError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_keychain::KeychainController::delete`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_keychain_KeychainController_delete (self_ : * mut dash_spv_keychain :: KeychainController , key : * mut crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainKey) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_keychain_KeyChainError { let obj = dash_spv_keychain :: KeychainController :: delete (& * self_ , < crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainKey as ferment :: FFIConversionFrom < dash_spv_keychain :: KeyChainKey >> :: ffi_from (key)) ; < crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_keychain_KeyChainError as ferment :: FFIConversionTo < Result < bool , dash_spv_keychain :: KeyChainError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`KeyChainValue`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_keychain_KeyChainValue { Bytes (* mut crate :: fermented :: generics :: Vec_u8) , Int64 (i64) , String (* mut std :: os :: raw :: c_char) } impl ferment :: FFIConversionFrom < dash_spv_keychain :: KeyChainValue > for dash_spv_keychain_KeyChainValue { unsafe fn ffi_from_const (ffi : * const dash_spv_keychain_KeyChainValue) -> dash_spv_keychain :: KeyChainValue { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_keychain_KeyChainValue :: Bytes (o_0) => dash_spv_keychain :: KeyChainValue :: Bytes (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (* o_0)) , dash_spv_keychain_KeyChainValue :: Int64 (o_0) => dash_spv_keychain :: KeyChainValue :: Int64 (* o_0) , dash_spv_keychain_KeyChainValue :: String (o_0) => dash_spv_keychain :: KeyChainValue :: String (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dash_spv_keychain :: KeyChainValue > for dash_spv_keychain_KeyChainValue { unsafe fn ffi_to_const (obj : dash_spv_keychain :: KeyChainValue) -> * const dash_spv_keychain_KeyChainValue { ferment :: boxed (match obj { dash_spv_keychain :: KeyChainValue :: Bytes (o_0) => dash_spv_keychain_KeyChainValue :: Bytes (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (o_0)) , dash_spv_keychain :: KeyChainValue :: Int64 (o_0) => dash_spv_keychain_KeyChainValue :: Int64 (o_0) , dash_spv_keychain :: KeyChainValue :: String (o_0) => dash_spv_keychain_KeyChainValue :: String (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_keychain_KeyChainValue { fn drop (& mut self) { unsafe { match self { dash_spv_keychain_KeyChainValue :: Bytes (o_0) => { ferment :: unbox_any (* o_0) ; } , dash_spv_keychain_KeyChainValue :: Int64 (o_0) => { ; } , dash_spv_keychain_KeyChainValue :: String (o_0) => { ferment :: unbox_string (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_keychain_KeyChainValue_Bytes_ctor (o_o_0 : * mut crate :: fermented :: generics :: Vec_u8) -> * mut dash_spv_keychain_KeyChainValue { ferment :: boxed (dash_spv_keychain_KeyChainValue :: Bytes (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_keychain_KeyChainValue_Int64_ctor (o_o_0 : i64) -> * mut dash_spv_keychain_KeyChainValue { ferment :: boxed (dash_spv_keychain_KeyChainValue :: Int64 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_keychain_KeyChainValue_String_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dash_spv_keychain_KeyChainValue { ferment :: boxed (dash_spv_keychain_KeyChainValue :: String (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_keychain_KeyChainValue_destroy < > (ffi : * mut dash_spv_keychain_KeyChainValue) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`KeyChainKey`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_keychain_KeyChainKey { StandaloneInfoDictionaryLocationString { extended_public_key_identifier : * mut std :: os :: raw :: c_char } , StandaloneExtendedPublicKeyLocationString { extended_public_key_identifier : * mut std :: os :: raw :: c_char } , HasKnownBalanceUniqueIDString { reference : u32 , unique_id : * mut std :: os :: raw :: c_char } , WalletBasedExtendedPrivateKeyLocationString { unique_id : * mut std :: os :: raw :: c_char } , WalletBasedExtendedPublicKeyLocationString { unique_id : * mut std :: os :: raw :: c_char } } impl ferment :: FFIConversionFrom < dash_spv_keychain :: KeyChainKey > for dash_spv_keychain_KeyChainKey { unsafe fn ffi_from_const (ffi : * const dash_spv_keychain_KeyChainKey) -> dash_spv_keychain :: KeyChainKey { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_keychain_KeyChainKey :: StandaloneInfoDictionaryLocationString { extended_public_key_identifier } => dash_spv_keychain :: KeyChainKey :: StandaloneInfoDictionaryLocationString { extended_public_key_identifier : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* extended_public_key_identifier) } , dash_spv_keychain_KeyChainKey :: StandaloneExtendedPublicKeyLocationString { extended_public_key_identifier } => dash_spv_keychain :: KeyChainKey :: StandaloneExtendedPublicKeyLocationString { extended_public_key_identifier : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* extended_public_key_identifier) } , dash_spv_keychain_KeyChainKey :: HasKnownBalanceUniqueIDString { reference , unique_id } => dash_spv_keychain :: KeyChainKey :: HasKnownBalanceUniqueIDString { reference : * reference , unique_id : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* unique_id) } , dash_spv_keychain_KeyChainKey :: WalletBasedExtendedPrivateKeyLocationString { unique_id } => dash_spv_keychain :: KeyChainKey :: WalletBasedExtendedPrivateKeyLocationString { unique_id : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* unique_id) } , dash_spv_keychain_KeyChainKey :: WalletBasedExtendedPublicKeyLocationString { unique_id } => dash_spv_keychain :: KeyChainKey :: WalletBasedExtendedPublicKeyLocationString { unique_id : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* unique_id) } } } } impl ferment :: FFIConversionTo < dash_spv_keychain :: KeyChainKey > for dash_spv_keychain_KeyChainKey { unsafe fn ffi_to_const (obj : dash_spv_keychain :: KeyChainKey) -> * const dash_spv_keychain_KeyChainKey { ferment :: boxed (match obj { dash_spv_keychain :: KeyChainKey :: StandaloneInfoDictionaryLocationString { extended_public_key_identifier } => dash_spv_keychain_KeyChainKey :: StandaloneInfoDictionaryLocationString { extended_public_key_identifier : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (extended_public_key_identifier) } , dash_spv_keychain :: KeyChainKey :: StandaloneExtendedPublicKeyLocationString { extended_public_key_identifier } => dash_spv_keychain_KeyChainKey :: StandaloneExtendedPublicKeyLocationString { extended_public_key_identifier : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (extended_public_key_identifier) } , dash_spv_keychain :: KeyChainKey :: HasKnownBalanceUniqueIDString { reference , unique_id } => dash_spv_keychain_KeyChainKey :: HasKnownBalanceUniqueIDString { reference : reference , unique_id : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (unique_id) } , dash_spv_keychain :: KeyChainKey :: WalletBasedExtendedPrivateKeyLocationString { unique_id } => dash_spv_keychain_KeyChainKey :: WalletBasedExtendedPrivateKeyLocationString { unique_id : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (unique_id) } , dash_spv_keychain :: KeyChainKey :: WalletBasedExtendedPublicKeyLocationString { unique_id } => dash_spv_keychain_KeyChainKey :: WalletBasedExtendedPublicKeyLocationString { unique_id : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (unique_id) } , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_keychain_KeyChainKey { fn drop (& mut self) { unsafe { match self { dash_spv_keychain_KeyChainKey :: StandaloneInfoDictionaryLocationString { extended_public_key_identifier } => { ferment :: unbox_string (* extended_public_key_identifier) ; } , dash_spv_keychain_KeyChainKey :: StandaloneExtendedPublicKeyLocationString { extended_public_key_identifier } => { ferment :: unbox_string (* extended_public_key_identifier) ; } , dash_spv_keychain_KeyChainKey :: HasKnownBalanceUniqueIDString { reference , unique_id } => { ; ; ferment :: unbox_string (* unique_id) ; } , dash_spv_keychain_KeyChainKey :: WalletBasedExtendedPrivateKeyLocationString { unique_id } => { ferment :: unbox_string (* unique_id) ; } , dash_spv_keychain_KeyChainKey :: WalletBasedExtendedPublicKeyLocationString { unique_id } => { ferment :: unbox_string (* unique_id) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_keychain_KeyChainKey_StandaloneInfoDictionaryLocationString_ctor (extended_public_key_identifier : * mut std :: os :: raw :: c_char) -> * mut dash_spv_keychain_KeyChainKey { ferment :: boxed (dash_spv_keychain_KeyChainKey :: StandaloneInfoDictionaryLocationString { extended_public_key_identifier }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_keychain_KeyChainKey_StandaloneExtendedPublicKeyLocationString_ctor (extended_public_key_identifier : * mut std :: os :: raw :: c_char) -> * mut dash_spv_keychain_KeyChainKey { ferment :: boxed (dash_spv_keychain_KeyChainKey :: StandaloneExtendedPublicKeyLocationString { extended_public_key_identifier }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_keychain_KeyChainKey_HasKnownBalanceUniqueIDString_ctor (reference : u32 , unique_id : * mut std :: os :: raw :: c_char) -> * mut dash_spv_keychain_KeyChainKey { ferment :: boxed (dash_spv_keychain_KeyChainKey :: HasKnownBalanceUniqueIDString { reference , unique_id }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_keychain_KeyChainKey_WalletBasedExtendedPrivateKeyLocationString_ctor (unique_id : * mut std :: os :: raw :: c_char) -> * mut dash_spv_keychain_KeyChainKey { ferment :: boxed (dash_spv_keychain_KeyChainKey :: WalletBasedExtendedPrivateKeyLocationString { unique_id }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_keychain_KeyChainKey_WalletBasedExtendedPublicKeyLocationString_ctor (unique_id : * mut std :: os :: raw :: c_char) -> * mut dash_spv_keychain_KeyChainKey { ferment :: boxed (dash_spv_keychain_KeyChainKey :: WalletBasedExtendedPublicKeyLocationString { unique_id }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_keychain_KeyChainKey_destroy < > (ffi : * mut dash_spv_keychain_KeyChainKey) { ferment :: unbox_any (ffi) ; } } pub mod dash_sdk { use crate as dash_spv_apple_bindings ; pub mod core { use crate as dash_spv_apple_bindings ; } pub mod mock { use crate as dash_spv_apple_bindings ; # [cfg (feature = "mocks")] pub mod sdk { use crate as dash_spv_apple_bindings ; } } pub mod sdk { use crate as dash_spv_apple_bindings ; } pub mod platform { use crate as dash_spv_apple_bindings ; } pub mod error { use crate as dash_spv_apple_bindings ; # [cfg (test)] pub mod tests { use crate as dash_spv_apple_bindings ; } } pub mod sync { use crate as dash_spv_apple_bindings ; } } pub mod drive_proof_verifier { use crate as dash_spv_apple_bindings ; pub mod error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ContextProviderError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum drive_proof_verifier_error_ContextProviderError { Generic (* mut std :: os :: raw :: c_char) , Config (* mut std :: os :: raw :: c_char) , DataContractFailure (* mut std :: os :: raw :: c_char) , InvalidQuorum (* mut std :: os :: raw :: c_char) , ActivationForkError (* mut std :: os :: raw :: c_char) , AsyncError (* mut std :: os :: raw :: c_char) } impl ferment :: FFIConversionFrom < drive_proof_verifier :: error :: ContextProviderError > for drive_proof_verifier_error_ContextProviderError { unsafe fn ffi_from_const (ffi : * const drive_proof_verifier_error_ContextProviderError) -> drive_proof_verifier :: error :: ContextProviderError { let ffi_ref = & * ffi ; match ffi_ref { drive_proof_verifier_error_ContextProviderError :: Generic (o_0) => drive_proof_verifier :: error :: ContextProviderError :: Generic (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , drive_proof_verifier_error_ContextProviderError :: Config (o_0) => drive_proof_verifier :: error :: ContextProviderError :: Config (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , drive_proof_verifier_error_ContextProviderError :: DataContractFailure (o_0) => drive_proof_verifier :: error :: ContextProviderError :: DataContractFailure (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , drive_proof_verifier_error_ContextProviderError :: InvalidQuorum (o_0) => drive_proof_verifier :: error :: ContextProviderError :: InvalidQuorum (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , drive_proof_verifier_error_ContextProviderError :: ActivationForkError (o_0) => drive_proof_verifier :: error :: ContextProviderError :: ActivationForkError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , drive_proof_verifier_error_ContextProviderError :: AsyncError (o_0) => drive_proof_verifier :: error :: ContextProviderError :: AsyncError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < drive_proof_verifier :: error :: ContextProviderError > for drive_proof_verifier_error_ContextProviderError { unsafe fn ffi_to_const (obj : drive_proof_verifier :: error :: ContextProviderError) -> * const drive_proof_verifier_error_ContextProviderError { ferment :: boxed (match obj { drive_proof_verifier :: error :: ContextProviderError :: Generic (o_0) => drive_proof_verifier_error_ContextProviderError :: Generic (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , drive_proof_verifier :: error :: ContextProviderError :: Config (o_0) => drive_proof_verifier_error_ContextProviderError :: Config (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , drive_proof_verifier :: error :: ContextProviderError :: DataContractFailure (o_0) => drive_proof_verifier_error_ContextProviderError :: DataContractFailure (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , drive_proof_verifier :: error :: ContextProviderError :: InvalidQuorum (o_0) => drive_proof_verifier_error_ContextProviderError :: InvalidQuorum (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , drive_proof_verifier :: error :: ContextProviderError :: ActivationForkError (o_0) => drive_proof_verifier_error_ContextProviderError :: ActivationForkError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , drive_proof_verifier :: error :: ContextProviderError :: AsyncError (o_0) => drive_proof_verifier_error_ContextProviderError :: AsyncError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for drive_proof_verifier_error_ContextProviderError { fn drop (& mut self) { unsafe { match self { drive_proof_verifier_error_ContextProviderError :: Generic (o_0) => { ferment :: unbox_string (* o_0) ; } , drive_proof_verifier_error_ContextProviderError :: Config (o_0) => { ferment :: unbox_string (* o_0) ; } , drive_proof_verifier_error_ContextProviderError :: DataContractFailure (o_0) => { ferment :: unbox_string (* o_0) ; } , drive_proof_verifier_error_ContextProviderError :: InvalidQuorum (o_0) => { ferment :: unbox_string (* o_0) ; } , drive_proof_verifier_error_ContextProviderError :: ActivationForkError (o_0) => { ferment :: unbox_string (* o_0) ; } , drive_proof_verifier_error_ContextProviderError :: AsyncError (o_0) => { ferment :: unbox_string (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn drive_proof_verifier_error_ContextProviderError_Generic_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut drive_proof_verifier_error_ContextProviderError { ferment :: boxed (drive_proof_verifier_error_ContextProviderError :: Generic (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn drive_proof_verifier_error_ContextProviderError_Config_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut drive_proof_verifier_error_ContextProviderError { ferment :: boxed (drive_proof_verifier_error_ContextProviderError :: Config (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn drive_proof_verifier_error_ContextProviderError_DataContractFailure_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut drive_proof_verifier_error_ContextProviderError { ferment :: boxed (drive_proof_verifier_error_ContextProviderError :: DataContractFailure (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn drive_proof_verifier_error_ContextProviderError_InvalidQuorum_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut drive_proof_verifier_error_ContextProviderError { ferment :: boxed (drive_proof_verifier_error_ContextProviderError :: InvalidQuorum (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn drive_proof_verifier_error_ContextProviderError_ActivationForkError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut drive_proof_verifier_error_ContextProviderError { ferment :: boxed (drive_proof_verifier_error_ContextProviderError :: ActivationForkError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn drive_proof_verifier_error_ContextProviderError_AsyncError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut drive_proof_verifier_error_ContextProviderError { ferment :: boxed (drive_proof_verifier_error_ContextProviderError :: AsyncError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn drive_proof_verifier_error_ContextProviderError_destroy < > (ffi : * mut drive_proof_verifier_error_ContextProviderError) { ferment :: unbox_any (ffi) ; } } pub mod types { use crate as dash_spv_apple_bindings ; } pub mod proof { use crate as dash_spv_apple_bindings ; } } pub mod dashcore_hashes { use crate as dash_spv_apple_bindings ; pub mod hmac { use crate as dash_spv_apple_bindings ; } pub mod serde_macros { use crate as dash_spv_apple_bindings ; } pub mod sha256t { use crate as dash_spv_apple_bindings ; } pub mod sha512 { use crate as dash_spv_apple_bindings ; } pub mod sha256d { use crate as dash_spv_apple_bindings ; } pub mod sha512_256 { use crate as dash_spv_apple_bindings ; } pub mod _export { use crate as dash_spv_apple_bindings ; } pub mod ripemd160 { use crate as dash_spv_apple_bindings ; } pub mod cmp { use crate as dash_spv_apple_bindings ; } pub mod hex { use crate as dash_spv_apple_bindings ; } pub mod hash160 { use crate as dash_spv_apple_bindings ; } pub mod sha256 { use crate as dash_spv_apple_bindings ; # [cfg (test)] pub mod tests { use crate as dash_spv_apple_bindings ; } } pub mod siphash24 { use crate as dash_spv_apple_bindings ; } pub mod sha1 { use crate as dash_spv_apple_bindings ; } # [cfg (any (feature = "std" , feature = "core2"))] pub mod impls { use crate as dash_spv_apple_bindings ; } pub mod util { use crate as dash_spv_apple_bindings ; } } pub mod dash_spv_coinjoin { use crate as dash_spv_apple_bindings ; pub mod utils { use crate as dash_spv_apple_bindings ; } # [cfg (test)] pub mod tests { use crate as dash_spv_apple_bindings ; } pub mod provider { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_coinjoin::provider::CoinJoinProvider::new`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_provider_CoinJoinProvider_new (get_masternode_list : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_RTRN_dashcore_sml_masternode_list_MasternodeList , update_success_block : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_RTRN_ , is_waiting_for_new_block : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_RTRN_bool , session_lifecycle_listener : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_i32_Arr_u8_32_u32_dash_spv_coinjoin_messages_pool_state_PoolState_dash_spv_coinjoin_messages_pool_message_PoolMessage_dash_spv_coinjoin_messages_pool_status_PoolStatus_Option_std_net_SocketAddr_bool_RTRN_ , mixing_lifecycle_listener : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_bool_Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus_RTRN_ , masternode_by_hash : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry , valid_mns_count : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_RTRN_usize , context : * const std :: os :: raw :: c_void) -> * mut dash_spv_coinjoin :: provider :: CoinJoinProvider { let obj = dash_spv_coinjoin :: provider :: CoinJoinProvider :: new (move | o_0 | unsafe { get_masternode_list . call (o_0) } , move | o_0 | unsafe { update_success_block . call (o_0) } , move | o_0 | unsafe { is_waiting_for_new_block . call (o_0) } , move | o_0 , o_1 , o_2 , o_3 , o_4 , o_5 , o_6 , o_7 , o_8 , o_9 | unsafe { session_lifecycle_listener . call (o_0 , o_1 , o_2 , o_3 , o_4 , o_5 , o_6 , o_7 , o_8 , o_9) } , move | o_0 , o_1 , o_2 , o_3 | unsafe { mixing_lifecycle_listener . call (o_0 , o_1 , o_2 , o_3) } , move | o_0 , o_1 | unsafe { masternode_by_hash . call (o_0 , o_1) } , move | o_0 | unsafe { valid_mns_count . call (o_0) } , context) ; ferment :: boxed (obj) } } pub mod wallet_provider { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_coinjoin::wallet_provider::WalletProvider::new`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_wallet_provider_WalletProvider_new (get_wallet_transaction : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction , sign_transaction : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction , is_mine_input : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool , available_coins : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin , select_coins : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem , inputs_with_amount : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32 , fresh_coinjoin_address : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_RTRN_String , commit_transaction : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool , is_masternode_or_disconnect_requested : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool , disconnect_masternode : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool , is_synced : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_RTRN_bool , send_message : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool , add_pending_masternode : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool , start_manager_async : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_RTRN_ , get_coinjoin_keys : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String , context : * const std :: os :: raw :: c_void) -> * mut dash_spv_coinjoin :: wallet_provider :: WalletProvider { let obj = dash_spv_coinjoin :: wallet_provider :: WalletProvider :: new (move | o_0 , o_1 | unsafe { get_wallet_transaction . call (o_0 , o_1) } , move | o_0 , o_1 , o_2 | unsafe { sign_transaction . call (o_0 , o_1 , o_2) } , move | o_0 , o_1 | unsafe { is_mine_input . call (o_0 , o_1) } , move | o_0 , o_1 , o_2 , o_3 | unsafe { available_coins . call (o_0 , o_1 , o_2 , o_3) } , move | o_0 , o_1 , o_2 , o_3 , o_4 , o_5 | unsafe { select_coins . call (o_0 , o_1 , o_2 , o_3 , o_4 , o_5) } , move | o_0 , o_1 | unsafe { inputs_with_amount . call (o_0 , o_1) } , move | o_0 , o_1 | unsafe { fresh_coinjoin_address . call (o_0 , o_1) } , move | o_0 , o_1 , o_2 , o_3 , o_4 | unsafe { commit_transaction . call (o_0 , o_1 , o_2 , o_3 , o_4) } , move | o_0 , o_1 | unsafe { is_masternode_or_disconnect_requested . call (o_0 , o_1) } , move | o_0 , o_1 | unsafe { disconnect_masternode . call (o_0 , o_1) } , move | o_0 | unsafe { is_synced . call (o_0) } , move | o_0 , o_1 , o_2 , o_3 , o_4 | unsafe { send_message . call (o_0 , o_1 , o_2 , o_3 , o_4) } , move | o_0 , o_1 , o_2 | unsafe { add_pending_masternode . call (o_0 , o_1 , o_2) } , move | o_0 | unsafe { start_manager_async . call (o_0) } , move | o_0 , o_1 | unsafe { get_coinjoin_keys . call (o_0 , o_1) } , context) ; ferment :: boxed (obj) } } pub mod models { use crate as dash_spv_apple_bindings ; pub mod valid_in_outs { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_coinjoin::models::valid_in_outs::ValidInOuts::new`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_valid_in_outs_ValidInOuts_new () -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: valid_in_outs :: dash_spv_coinjoin_models_valid_in_outs_ValidInOuts { let obj = dash_spv_coinjoin :: models :: valid_in_outs :: ValidInOuts :: new () ; < crate :: fermented :: types :: dash_spv_coinjoin :: models :: valid_in_outs :: dash_spv_coinjoin_models_valid_in_outs_ValidInOuts as ferment :: FFIConversionTo < dash_spv_coinjoin :: models :: valid_in_outs :: ValidInOuts >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`ValidInOuts`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_coinjoin_models_valid_in_outs_ValidInOuts { pub result : bool , pub message_id : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage , pub consume_collateral : bool } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: models :: valid_in_outs :: ValidInOuts > for dash_spv_coinjoin_models_valid_in_outs_ValidInOuts { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_models_valid_in_outs_ValidInOuts) -> dash_spv_coinjoin :: models :: valid_in_outs :: ValidInOuts { let ffi_ref = & * ffi ; dash_spv_coinjoin :: models :: valid_in_outs :: ValidInOuts { result : ffi_ref . result , message_id : < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage as ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: pool_message :: PoolMessage >> :: ffi_from (ffi_ref . message_id) , consume_collateral : ffi_ref . consume_collateral } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: models :: valid_in_outs :: ValidInOuts > for dash_spv_coinjoin_models_valid_in_outs_ValidInOuts { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: models :: valid_in_outs :: ValidInOuts) -> * const dash_spv_coinjoin_models_valid_in_outs_ValidInOuts { ferment :: boxed (dash_spv_coinjoin_models_valid_in_outs_ValidInOuts { result : obj . result , message_id : < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_message :: PoolMessage >> :: ffi_to (obj . message_id) , consume_collateral : obj . consume_collateral }) } } impl Drop for dash_spv_coinjoin_models_valid_in_outs_ValidInOuts { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . message_id) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_valid_in_outs_ValidInOuts_ctor < > (result : bool , message_id : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage , consume_collateral : bool) -> * mut dash_spv_coinjoin_models_valid_in_outs_ValidInOuts { ferment :: boxed (dash_spv_coinjoin_models_valid_in_outs_ValidInOuts { result , message_id , consume_collateral }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_valid_in_outs_ValidInOuts_destroy < > (ffi : * mut dash_spv_coinjoin_models_valid_in_outs_ValidInOuts) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_valid_in_outs_ValidInOuts_get_result < > (obj : * const dash_spv_coinjoin_models_valid_in_outs_ValidInOuts) -> bool { (* obj) . result } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_valid_in_outs_ValidInOuts_get_message_id < > (obj : * const dash_spv_coinjoin_models_valid_in_outs_ValidInOuts) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage { (* obj) . message_id } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_valid_in_outs_ValidInOuts_get_consume_collateral < > (obj : * const dash_spv_coinjoin_models_valid_in_outs_ValidInOuts) -> bool { (* obj) . consume_collateral } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_valid_in_outs_ValidInOuts_set_result < > (obj : * const dash_spv_coinjoin_models_valid_in_outs_ValidInOuts) -> bool { (* obj) . result } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_valid_in_outs_ValidInOuts_set_message_id < > (obj : * const dash_spv_coinjoin_models_valid_in_outs_ValidInOuts) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage { (* obj) . message_id } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_valid_in_outs_ValidInOuts_set_consume_collateral < > (obj : * const dash_spv_coinjoin_models_valid_in_outs_ValidInOuts) -> bool { (* obj) . consume_collateral } } pub mod balance { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`Balance`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_coinjoin_models_balance_Balance { pub my_trusted : u64 , pub my_untrusted_pending : u64 , pub my_immature : u64 , pub watch_only_trusted : u64 , pub watch_only_untrusted_pending : u64 , pub watch_only_immature : u64 , pub anonymized : u64 , pub denominated_trusted : u64 , pub denominated_untrusted_pending : u64 } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: models :: balance :: Balance > for dash_spv_coinjoin_models_balance_Balance { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_models_balance_Balance) -> dash_spv_coinjoin :: models :: balance :: Balance { let ffi_ref = & * ffi ; dash_spv_coinjoin :: models :: balance :: Balance { my_trusted : ffi_ref . my_trusted , my_untrusted_pending : ffi_ref . my_untrusted_pending , my_immature : ffi_ref . my_immature , watch_only_trusted : ffi_ref . watch_only_trusted , watch_only_untrusted_pending : ffi_ref . watch_only_untrusted_pending , watch_only_immature : ffi_ref . watch_only_immature , anonymized : ffi_ref . anonymized , denominated_trusted : ffi_ref . denominated_trusted , denominated_untrusted_pending : ffi_ref . denominated_untrusted_pending } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: models :: balance :: Balance > for dash_spv_coinjoin_models_balance_Balance { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: models :: balance :: Balance) -> * const dash_spv_coinjoin_models_balance_Balance { ferment :: boxed (dash_spv_coinjoin_models_balance_Balance { my_trusted : obj . my_trusted , my_untrusted_pending : obj . my_untrusted_pending , my_immature : obj . my_immature , watch_only_trusted : obj . watch_only_trusted , watch_only_untrusted_pending : obj . watch_only_untrusted_pending , watch_only_immature : obj . watch_only_immature , anonymized : obj . anonymized , denominated_trusted : obj . denominated_trusted , denominated_untrusted_pending : obj . denominated_untrusted_pending }) } } impl Drop for dash_spv_coinjoin_models_balance_Balance { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ; ; ; ; ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_ctor < > (my_trusted : u64 , my_untrusted_pending : u64 , my_immature : u64 , watch_only_trusted : u64 , watch_only_untrusted_pending : u64 , watch_only_immature : u64 , anonymized : u64 , denominated_trusted : u64 , denominated_untrusted_pending : u64) -> * mut dash_spv_coinjoin_models_balance_Balance { ferment :: boxed (dash_spv_coinjoin_models_balance_Balance { my_trusted , my_untrusted_pending , my_immature , watch_only_trusted , watch_only_untrusted_pending , watch_only_immature , anonymized , denominated_trusted , denominated_untrusted_pending }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_destroy < > (ffi : * mut dash_spv_coinjoin_models_balance_Balance) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_get_my_trusted < > (obj : * const dash_spv_coinjoin_models_balance_Balance) -> u64 { (* obj) . my_trusted } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_get_my_untrusted_pending < > (obj : * const dash_spv_coinjoin_models_balance_Balance) -> u64 { (* obj) . my_untrusted_pending } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_get_my_immature < > (obj : * const dash_spv_coinjoin_models_balance_Balance) -> u64 { (* obj) . my_immature } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_get_watch_only_trusted < > (obj : * const dash_spv_coinjoin_models_balance_Balance) -> u64 { (* obj) . watch_only_trusted } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_get_watch_only_untrusted_pending < > (obj : * const dash_spv_coinjoin_models_balance_Balance) -> u64 { (* obj) . watch_only_untrusted_pending } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_get_watch_only_immature < > (obj : * const dash_spv_coinjoin_models_balance_Balance) -> u64 { (* obj) . watch_only_immature } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_get_anonymized < > (obj : * const dash_spv_coinjoin_models_balance_Balance) -> u64 { (* obj) . anonymized } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_get_denominated_trusted < > (obj : * const dash_spv_coinjoin_models_balance_Balance) -> u64 { (* obj) . denominated_trusted } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_get_denominated_untrusted_pending < > (obj : * const dash_spv_coinjoin_models_balance_Balance) -> u64 { (* obj) . denominated_untrusted_pending } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_set_my_trusted < > (obj : * const dash_spv_coinjoin_models_balance_Balance) -> u64 { (* obj) . my_trusted } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_set_my_untrusted_pending < > (obj : * const dash_spv_coinjoin_models_balance_Balance) -> u64 { (* obj) . my_untrusted_pending } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_set_my_immature < > (obj : * const dash_spv_coinjoin_models_balance_Balance) -> u64 { (* obj) . my_immature } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_set_watch_only_trusted < > (obj : * const dash_spv_coinjoin_models_balance_Balance) -> u64 { (* obj) . watch_only_trusted } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_set_watch_only_untrusted_pending < > (obj : * const dash_spv_coinjoin_models_balance_Balance) -> u64 { (* obj) . watch_only_untrusted_pending } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_set_watch_only_immature < > (obj : * const dash_spv_coinjoin_models_balance_Balance) -> u64 { (* obj) . watch_only_immature } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_set_anonymized < > (obj : * const dash_spv_coinjoin_models_balance_Balance) -> u64 { (* obj) . anonymized } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_set_denominated_trusted < > (obj : * const dash_spv_coinjoin_models_balance_Balance) -> u64 { (* obj) . denominated_trusted } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_set_denominated_untrusted_pending < > (obj : * const dash_spv_coinjoin_models_balance_Balance) -> u64 { (* obj) . denominated_untrusted_pending } # [doc = "FFI-representation of the [`dash_spv_coinjoin::models::balance::Balance::new`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_balance_Balance_new () -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: balance :: dash_spv_coinjoin_models_balance_Balance { let obj = dash_spv_coinjoin :: models :: balance :: Balance :: new () ; < crate :: fermented :: types :: dash_spv_coinjoin :: models :: balance :: dash_spv_coinjoin_models_balance_Balance as ferment :: FFIConversionTo < dash_spv_coinjoin :: models :: balance :: Balance >> :: ffi_to (obj) } } pub mod coin_control { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`CoinType`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_coinjoin_models_coin_control_CoinType { AllCoins = 0 , OnlyFullyMixed = 1 , OnlyReadyToMix = 2 , OnlyNonDenominated = 3 , OnlyMasternodeCollateral = 4 , OnlyCoinJoinCollateral = 5 } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: models :: coin_control :: CoinType > for dash_spv_coinjoin_models_coin_control_CoinType { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_models_coin_control_CoinType) -> dash_spv_coinjoin :: models :: coin_control :: CoinType { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_coinjoin_models_coin_control_CoinType :: AllCoins => dash_spv_coinjoin :: models :: coin_control :: CoinType :: AllCoins , dash_spv_coinjoin_models_coin_control_CoinType :: OnlyFullyMixed => dash_spv_coinjoin :: models :: coin_control :: CoinType :: OnlyFullyMixed , dash_spv_coinjoin_models_coin_control_CoinType :: OnlyReadyToMix => dash_spv_coinjoin :: models :: coin_control :: CoinType :: OnlyReadyToMix , dash_spv_coinjoin_models_coin_control_CoinType :: OnlyNonDenominated => dash_spv_coinjoin :: models :: coin_control :: CoinType :: OnlyNonDenominated , dash_spv_coinjoin_models_coin_control_CoinType :: OnlyMasternodeCollateral => dash_spv_coinjoin :: models :: coin_control :: CoinType :: OnlyMasternodeCollateral , dash_spv_coinjoin_models_coin_control_CoinType :: OnlyCoinJoinCollateral => dash_spv_coinjoin :: models :: coin_control :: CoinType :: OnlyCoinJoinCollateral } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: models :: coin_control :: CoinType > for dash_spv_coinjoin_models_coin_control_CoinType { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: models :: coin_control :: CoinType) -> * const dash_spv_coinjoin_models_coin_control_CoinType { ferment :: boxed (match obj { dash_spv_coinjoin :: models :: coin_control :: CoinType :: AllCoins => dash_spv_coinjoin_models_coin_control_CoinType :: AllCoins , dash_spv_coinjoin :: models :: coin_control :: CoinType :: OnlyFullyMixed => dash_spv_coinjoin_models_coin_control_CoinType :: OnlyFullyMixed , dash_spv_coinjoin :: models :: coin_control :: CoinType :: OnlyReadyToMix => dash_spv_coinjoin_models_coin_control_CoinType :: OnlyReadyToMix , dash_spv_coinjoin :: models :: coin_control :: CoinType :: OnlyNonDenominated => dash_spv_coinjoin_models_coin_control_CoinType :: OnlyNonDenominated , dash_spv_coinjoin :: models :: coin_control :: CoinType :: OnlyMasternodeCollateral => dash_spv_coinjoin_models_coin_control_CoinType :: OnlyMasternodeCollateral , dash_spv_coinjoin :: models :: coin_control :: CoinType :: OnlyCoinJoinCollateral => dash_spv_coinjoin_models_coin_control_CoinType :: OnlyCoinJoinCollateral , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_coinjoin_models_coin_control_CoinType { fn drop (& mut self) { unsafe { match self { dash_spv_coinjoin_models_coin_control_CoinType :: AllCoins => { } , dash_spv_coinjoin_models_coin_control_CoinType :: OnlyFullyMixed => { } , dash_spv_coinjoin_models_coin_control_CoinType :: OnlyReadyToMix => { } , dash_spv_coinjoin_models_coin_control_CoinType :: OnlyNonDenominated => { } , dash_spv_coinjoin_models_coin_control_CoinType :: OnlyMasternodeCollateral => { } , dash_spv_coinjoin_models_coin_control_CoinType :: OnlyCoinJoinCollateral => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinType_AllCoins_ctor () -> * mut dash_spv_coinjoin_models_coin_control_CoinType { ferment :: boxed (dash_spv_coinjoin_models_coin_control_CoinType :: AllCoins { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinType_OnlyFullyMixed_ctor () -> * mut dash_spv_coinjoin_models_coin_control_CoinType { ferment :: boxed (dash_spv_coinjoin_models_coin_control_CoinType :: OnlyFullyMixed { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinType_OnlyReadyToMix_ctor () -> * mut dash_spv_coinjoin_models_coin_control_CoinType { ferment :: boxed (dash_spv_coinjoin_models_coin_control_CoinType :: OnlyReadyToMix { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinType_OnlyNonDenominated_ctor () -> * mut dash_spv_coinjoin_models_coin_control_CoinType { ferment :: boxed (dash_spv_coinjoin_models_coin_control_CoinType :: OnlyNonDenominated { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinType_OnlyMasternodeCollateral_ctor () -> * mut dash_spv_coinjoin_models_coin_control_CoinType { ferment :: boxed (dash_spv_coinjoin_models_coin_control_CoinType :: OnlyMasternodeCollateral { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinType_OnlyCoinJoinCollateral_ctor () -> * mut dash_spv_coinjoin_models_coin_control_CoinType { ferment :: boxed (dash_spv_coinjoin_models_coin_control_CoinType :: OnlyCoinJoinCollateral { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinType_destroy < > (ffi : * mut dash_spv_coinjoin_models_coin_control_CoinType) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::models::coin_control::CoinType::is_all_coins`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinType_is_all_coins (self_ : * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinType) -> bool { let obj = dash_spv_coinjoin :: models :: coin_control :: CoinType :: is_all_coins (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::models::coin_control::CoinType::is_only_fully_mixed`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinType_is_only_fully_mixed (self_ : * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinType) -> bool { let obj = dash_spv_coinjoin :: models :: coin_control :: CoinType :: is_only_fully_mixed (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::models::coin_control::CoinType::is_only_ready_to_mix`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinType_is_only_ready_to_mix (self_ : * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinType) -> bool { let obj = dash_spv_coinjoin :: models :: coin_control :: CoinType :: is_only_ready_to_mix (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::models::coin_control::CoinType::is_only_non_denominated`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinType_is_only_non_denominated (self_ : * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinType) -> bool { let obj = dash_spv_coinjoin :: models :: coin_control :: CoinType :: is_only_non_denominated (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::models::coin_control::CoinType::is_only_masternode_collateral`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinType_is_only_masternode_collateral (self_ : * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinType) -> bool { let obj = dash_spv_coinjoin :: models :: coin_control :: CoinType :: is_only_masternode_collateral (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::models::coin_control::CoinType::is_only_coinjoin_collateral`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinType_is_only_coinjoin_collateral (self_ : * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinType) -> bool { let obj = dash_spv_coinjoin :: models :: coin_control :: CoinType :: is_only_coinjoin_collateral (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::models::coin_control::CoinType::index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinType_index (self_ : * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinType) -> u8 { let obj = dash_spv_coinjoin :: models :: coin_control :: CoinType :: index (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::models::coin_control::CoinType::from_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinType_from_index (index : u8) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinType { let obj = dash_spv_coinjoin :: models :: coin_control :: CoinType :: from_index (index) ; < crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinType as ferment :: FFIConversionTo < dash_spv_coinjoin :: models :: coin_control :: CoinType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`CoinControl`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_coinjoin_models_coin_control_CoinControl { pub dest_change : * mut crate :: fermented :: generics :: Vec_u8 , pub allow_other_inputs : bool , pub fee_rate : u64 , pub discard_fee_rate : u64 , pub avoid_address_reuse : bool , pub min_depth : i32 , pub max_depth : i32 , pub coin_type : * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinType , pub set_selected : * mut crate :: fermented :: generics :: std_collections_HashSet_dashcore_blockdata_transaction_outpoint_OutPoint } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: models :: coin_control :: CoinControl > for dash_spv_coinjoin_models_coin_control_CoinControl { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_models_coin_control_CoinControl) -> dash_spv_coinjoin :: models :: coin_control :: CoinControl { let ffi_ref = & * ffi ; dash_spv_coinjoin :: models :: coin_control :: CoinControl { dest_change : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from_opt (ffi_ref . dest_change) , allow_other_inputs : ffi_ref . allow_other_inputs , fee_rate : ffi_ref . fee_rate , discard_fee_rate : ffi_ref . discard_fee_rate , avoid_address_reuse : ffi_ref . avoid_address_reuse , min_depth : ffi_ref . min_depth , max_depth : ffi_ref . max_depth , coin_type : < crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinType as ferment :: FFIConversionFrom < dash_spv_coinjoin :: models :: coin_control :: CoinType >> :: ffi_from (ffi_ref . coin_type) , set_selected : < crate :: fermented :: generics :: std_collections_HashSet_dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionFrom < std :: collections :: HashSet < dashcore :: blockdata :: transaction :: outpoint :: OutPoint > >> :: ffi_from (ffi_ref . set_selected) } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: models :: coin_control :: CoinControl > for dash_spv_coinjoin_models_coin_control_CoinControl { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: models :: coin_control :: CoinControl) -> * const dash_spv_coinjoin_models_coin_control_CoinControl { ferment :: boxed (dash_spv_coinjoin_models_coin_control_CoinControl { dest_change : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to_opt (obj . dest_change) , allow_other_inputs : obj . allow_other_inputs , fee_rate : obj . fee_rate , discard_fee_rate : obj . discard_fee_rate , avoid_address_reuse : obj . avoid_address_reuse , min_depth : obj . min_depth , max_depth : obj . max_depth , coin_type : < crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinType as ferment :: FFIConversionTo < dash_spv_coinjoin :: models :: coin_control :: CoinType >> :: ffi_to (obj . coin_type) , set_selected : < crate :: fermented :: generics :: std_collections_HashSet_dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionTo < std :: collections :: HashSet < dashcore :: blockdata :: transaction :: outpoint :: OutPoint > >> :: ffi_to (obj . set_selected) }) } } impl Drop for dash_spv_coinjoin_models_coin_control_CoinControl { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any_opt (ffi_ref . dest_change) ; ; ; ; ; ; ; ferment :: unbox_any (ffi_ref . coin_type) ; ferment :: unbox_any (ffi_ref . set_selected) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_ctor < > (dest_change : * mut crate :: fermented :: generics :: Vec_u8 , allow_other_inputs : bool , fee_rate : u64 , discard_fee_rate : u64 , avoid_address_reuse : bool , min_depth : i32 , max_depth : i32 , coin_type : * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinType , set_selected : * mut crate :: fermented :: generics :: std_collections_HashSet_dashcore_blockdata_transaction_outpoint_OutPoint) -> * mut dash_spv_coinjoin_models_coin_control_CoinControl { ferment :: boxed (dash_spv_coinjoin_models_coin_control_CoinControl { dest_change , allow_other_inputs , fee_rate , discard_fee_rate , avoid_address_reuse , min_depth , max_depth , coin_type , set_selected }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_destroy < > (ffi : * mut dash_spv_coinjoin_models_coin_control_CoinControl) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_get_dest_change < > (obj : * const dash_spv_coinjoin_models_coin_control_CoinControl) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . dest_change } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_get_allow_other_inputs < > (obj : * const dash_spv_coinjoin_models_coin_control_CoinControl) -> bool { (* obj) . allow_other_inputs } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_get_fee_rate < > (obj : * const dash_spv_coinjoin_models_coin_control_CoinControl) -> u64 { (* obj) . fee_rate } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_get_discard_fee_rate < > (obj : * const dash_spv_coinjoin_models_coin_control_CoinControl) -> u64 { (* obj) . discard_fee_rate } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_get_avoid_address_reuse < > (obj : * const dash_spv_coinjoin_models_coin_control_CoinControl) -> bool { (* obj) . avoid_address_reuse } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_get_min_depth < > (obj : * const dash_spv_coinjoin_models_coin_control_CoinControl) -> i32 { (* obj) . min_depth } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_get_max_depth < > (obj : * const dash_spv_coinjoin_models_coin_control_CoinControl) -> i32 { (* obj) . max_depth } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_get_coin_type < > (obj : * const dash_spv_coinjoin_models_coin_control_CoinControl) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinType { (* obj) . coin_type } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_get_set_selected < > (obj : * const dash_spv_coinjoin_models_coin_control_CoinControl) -> * mut crate :: fermented :: generics :: std_collections_HashSet_dashcore_blockdata_transaction_outpoint_OutPoint { (* obj) . set_selected } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_set_dest_change < > (obj : * const dash_spv_coinjoin_models_coin_control_CoinControl) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . dest_change } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_set_allow_other_inputs < > (obj : * const dash_spv_coinjoin_models_coin_control_CoinControl) -> bool { (* obj) . allow_other_inputs } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_set_fee_rate < > (obj : * const dash_spv_coinjoin_models_coin_control_CoinControl) -> u64 { (* obj) . fee_rate } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_set_discard_fee_rate < > (obj : * const dash_spv_coinjoin_models_coin_control_CoinControl) -> u64 { (* obj) . discard_fee_rate } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_set_avoid_address_reuse < > (obj : * const dash_spv_coinjoin_models_coin_control_CoinControl) -> bool { (* obj) . avoid_address_reuse } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_set_min_depth < > (obj : * const dash_spv_coinjoin_models_coin_control_CoinControl) -> i32 { (* obj) . min_depth } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_set_max_depth < > (obj : * const dash_spv_coinjoin_models_coin_control_CoinControl) -> i32 { (* obj) . max_depth } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_set_coin_type < > (obj : * const dash_spv_coinjoin_models_coin_control_CoinControl) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinType { (* obj) . coin_type } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coin_control_CoinControl_set_set_selected < > (obj : * const dash_spv_coinjoin_models_coin_control_CoinControl) -> * mut crate :: fermented :: generics :: std_collections_HashSet_dashcore_blockdata_transaction_outpoint_OutPoint { (* obj) . set_selected } } pub mod coinjoin_client_options { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`CoinJoinClientOptions`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions { pub enable_coinjoin : bool , pub coinjoin_amount : u64 , pub coinjoin_sessions : i32 , pub coinjoin_rounds : i32 , pub coinjoin_random_rounds : i32 , pub coinjoin_denoms_goal : i32 , pub coinjoin_denoms_hardcap : i32 , pub coinjoin_multi_session : bool , pub chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType , pub denom_only : bool } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: models :: coinjoin_client_options :: CoinJoinClientOptions > for dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> dash_spv_coinjoin :: models :: coinjoin_client_options :: CoinJoinClientOptions { let ffi_ref = & * ffi ; dash_spv_coinjoin :: models :: coinjoin_client_options :: CoinJoinClientOptions { enable_coinjoin : ffi_ref . enable_coinjoin , coinjoin_amount : ffi_ref . coinjoin_amount , coinjoin_sessions : ffi_ref . coinjoin_sessions , coinjoin_rounds : ffi_ref . coinjoin_rounds , coinjoin_random_rounds : ffi_ref . coinjoin_random_rounds , coinjoin_denoms_goal : ffi_ref . coinjoin_denoms_goal , coinjoin_denoms_hardcap : ffi_ref . coinjoin_denoms_hardcap , coinjoin_multi_session : ffi_ref . coinjoin_multi_session , chain_type : < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (ffi_ref . chain_type) , denom_only : ffi_ref . denom_only } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: models :: coinjoin_client_options :: CoinJoinClientOptions > for dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: models :: coinjoin_client_options :: CoinJoinClientOptions) -> * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions { ferment :: boxed (dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions { enable_coinjoin : obj . enable_coinjoin , coinjoin_amount : obj . coinjoin_amount , coinjoin_sessions : obj . coinjoin_sessions , coinjoin_rounds : obj . coinjoin_rounds , coinjoin_random_rounds : obj . coinjoin_random_rounds , coinjoin_denoms_goal : obj . coinjoin_denoms_goal , coinjoin_denoms_hardcap : obj . coinjoin_denoms_hardcap , coinjoin_multi_session : obj . coinjoin_multi_session , chain_type : < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionTo < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_to (obj . chain_type) , denom_only : obj . denom_only }) } } impl Drop for dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ; ; ; ; ; ; ferment :: unbox_any (ffi_ref . chain_type) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_ctor < > (enable_coinjoin : bool , coinjoin_amount : u64 , coinjoin_sessions : i32 , coinjoin_rounds : i32 , coinjoin_random_rounds : i32 , coinjoin_denoms_goal : i32 , coinjoin_denoms_hardcap : i32 , coinjoin_multi_session : bool , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType , denom_only : bool) -> * mut dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions { ferment :: boxed (dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions { enable_coinjoin , coinjoin_amount , coinjoin_sessions , coinjoin_rounds , coinjoin_random_rounds , coinjoin_denoms_goal , coinjoin_denoms_hardcap , coinjoin_multi_session , chain_type , denom_only }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_destroy < > (ffi : * mut dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_get_enable_coinjoin < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> bool { (* obj) . enable_coinjoin } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_get_coinjoin_amount < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> u64 { (* obj) . coinjoin_amount } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_get_coinjoin_sessions < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> i32 { (* obj) . coinjoin_sessions } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_get_coinjoin_rounds < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> i32 { (* obj) . coinjoin_rounds } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_get_coinjoin_random_rounds < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> i32 { (* obj) . coinjoin_random_rounds } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_get_coinjoin_denoms_goal < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> i32 { (* obj) . coinjoin_denoms_goal } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_get_coinjoin_denoms_hardcap < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> i32 { (* obj) . coinjoin_denoms_hardcap } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_get_coinjoin_multi_session < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> bool { (* obj) . coinjoin_multi_session } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_get_chain_type < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType { (* obj) . chain_type } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_get_denom_only < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> bool { (* obj) . denom_only } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_set_enable_coinjoin < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> bool { (* obj) . enable_coinjoin } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_set_coinjoin_amount < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> u64 { (* obj) . coinjoin_amount } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_set_coinjoin_sessions < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> i32 { (* obj) . coinjoin_sessions } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_set_coinjoin_rounds < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> i32 { (* obj) . coinjoin_rounds } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_set_coinjoin_random_rounds < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> i32 { (* obj) . coinjoin_random_rounds } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_set_coinjoin_denoms_goal < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> i32 { (* obj) . coinjoin_denoms_goal } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_set_coinjoin_denoms_hardcap < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> i32 { (* obj) . coinjoin_denoms_hardcap } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_set_coinjoin_multi_session < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> bool { (* obj) . coinjoin_multi_session } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_set_chain_type < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType { (* obj) . chain_type } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_set_denom_only < > (obj : * const dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> bool { (* obj) . denom_only } } pub mod masternode_meta_info { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MasternodeMetaInfo`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo { pub pro_tx_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash , pub last_dsq : i64 , pub mixing_tx_count : i32 } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: models :: masternode_meta_info :: MasternodeMetaInfo > for dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo) -> dash_spv_coinjoin :: models :: masternode_meta_info :: MasternodeMetaInfo { let ffi_ref = & * ffi ; dash_spv_coinjoin :: models :: masternode_meta_info :: MasternodeMetaInfo { pro_tx_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: ProTxHash >> :: ffi_from (ffi_ref . pro_tx_hash) , last_dsq : ffi_ref . last_dsq , mixing_tx_count : ffi_ref . mixing_tx_count } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: models :: masternode_meta_info :: MasternodeMetaInfo > for dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: models :: masternode_meta_info :: MasternodeMetaInfo) -> * const dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo { ferment :: boxed (dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo { pro_tx_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash as ferment :: FFIConversionTo < dashcore :: hash_types :: ProTxHash >> :: ffi_to (obj . pro_tx_hash) , last_dsq : obj . last_dsq , mixing_tx_count : obj . mixing_tx_count }) } } impl Drop for dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . pro_tx_hash) ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo_ctor < > (pro_tx_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash , last_dsq : i64 , mixing_tx_count : i32) -> * mut dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo { ferment :: boxed (dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo { pro_tx_hash , last_dsq , mixing_tx_count }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo_destroy < > (ffi : * mut dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo_get_pro_tx_hash < > (obj : * const dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo_get_last_dsq < > (obj : * const dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo) -> i64 { (* obj) . last_dsq } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo_get_mixing_tx_count < > (obj : * const dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo) -> i32 { (* obj) . mixing_tx_count } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo_set_pro_tx_hash < > (obj : * const dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo_set_last_dsq < > (obj : * const dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo) -> i64 { (* obj) . last_dsq } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo_set_mixing_tx_count < > (obj : * const dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo) -> i32 { (* obj) . mixing_tx_count } # [doc = "FFI-representation of the [`dash_spv_coinjoin::models::masternode_meta_info::MasternodeMetaInfo::new`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo_new (pro_tx_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: masternode_meta_info :: dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo { let obj = dash_spv_coinjoin :: models :: masternode_meta_info :: MasternodeMetaInfo :: new (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: ProTxHash >> :: ffi_from (pro_tx_hash)) ; < crate :: fermented :: types :: dash_spv_coinjoin :: models :: masternode_meta_info :: dash_spv_coinjoin_models_masternode_meta_info_MasternodeMetaInfo as ferment :: FFIConversionTo < dash_spv_coinjoin :: models :: masternode_meta_info :: MasternodeMetaInfo >> :: ffi_to (obj) } } pub mod coinjoin_tx_type { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_coinjoin::models::coinjoin_tx_type::CoinJoinTransactionType::index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType_index (self_ : * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coinjoin_tx_type :: dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType) -> u8 { let obj = dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType :: index (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::models::coinjoin_tx_type::CoinJoinTransactionType::from_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType_from_index (index : u8) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coinjoin_tx_type :: dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType { let obj = dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType :: from_index (index) ; < crate :: fermented :: types :: dash_spv_coinjoin :: models :: coinjoin_tx_type :: dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType as ferment :: FFIConversionTo < dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::models::coinjoin_tx_type::CoinJoinTransactionType::from_tx`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType_from_tx (tx : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction , input_values : * mut crate :: fermented :: generics :: Vec_u64) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coinjoin_tx_type :: dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType { let obj = dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType :: from_tx (Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_from (tx))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Vec_u64 as ferment :: FFIConversionFrom < Vec < u64 > >> :: ffi_from (input_values)))) ; < crate :: fermented :: types :: dash_spv_coinjoin :: models :: coinjoin_tx_type :: dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType as ferment :: FFIConversionTo < dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::models::coinjoin_tx_type::CoinJoinTransactionType::is_coinjoin_send`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType_is_coinjoin_send (tx : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction , input_values : * mut crate :: fermented :: generics :: Vec_u64) -> bool { let obj = dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType :: is_coinjoin_send (Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_from (tx))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Vec_u64 as ferment :: FFIConversionFrom < Vec < u64 > >> :: ffi_from (input_values)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::models::coinjoin_tx_type::CoinJoinTransactionType::is_mixing_fee`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType_is_mixing_fee (tx : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction , inputs_value : u64) -> bool { let obj = dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType :: is_mixing_fee (Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_from (tx))) , inputs_value) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::models::coinjoin_tx_type::CoinJoinTransactionType::get_fee`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType_get_fee (tx : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction , inputs_values : * mut crate :: fermented :: generics :: Vec_u64) -> * mut u64 { let obj = dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType :: get_fee (Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_from (tx))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Vec_u64 as ferment :: FFIConversionFrom < Vec < u64 > >> :: ffi_from (inputs_values)))) ; ferment :: to_opt_primitive (obj) } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`CoinJoinTransactionType`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType { None , CreateDenomination , MakeCollateralInputs , MixingFee , Mixing , Send } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType > for dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType) -> dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: None => dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType :: None , dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: CreateDenomination => dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType :: CreateDenomination , dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: MakeCollateralInputs => dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType :: MakeCollateralInputs , dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: MixingFee => dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType :: MixingFee , dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: Mixing => dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType :: Mixing , dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: Send => dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType :: Send } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType > for dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType) -> * const dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType { ferment :: boxed (match obj { dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType :: None => dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: None , dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType :: CreateDenomination => dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: CreateDenomination , dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType :: MakeCollateralInputs => dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: MakeCollateralInputs , dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType :: MixingFee => dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: MixingFee , dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType :: Mixing => dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: Mixing , dash_spv_coinjoin :: models :: coinjoin_tx_type :: CoinJoinTransactionType :: Send => dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: Send , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType { fn drop (& mut self) { unsafe { match self { dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: None => { } , dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: CreateDenomination => { } , dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: MakeCollateralInputs => { } , dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: MixingFee => { } , dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: Mixing => { } , dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: Send => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType_None_ctor () -> * mut dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType { ferment :: boxed (dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: None { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType_CreateDenomination_ctor () -> * mut dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType { ferment :: boxed (dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: CreateDenomination { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType_MakeCollateralInputs_ctor () -> * mut dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType { ferment :: boxed (dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: MakeCollateralInputs { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType_MixingFee_ctor () -> * mut dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType { ferment :: boxed (dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: MixingFee { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType_Mixing_ctor () -> * mut dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType { ferment :: boxed (dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: Mixing { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType_Send_ctor () -> * mut dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType { ferment :: boxed (dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType :: Send { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType_destroy < > (ffi : * mut dash_spv_coinjoin_models_coinjoin_tx_type_CoinJoinTransactionType) { ferment :: unbox_any (ffi) ; } } } pub mod messages { use crate as dash_spv_apple_bindings ; pub mod coinjoin_broadcast_tx { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::coinjoin_broadcast_tx::from_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_broadcast_tx_from_message (message : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx { let obj = dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: from_message (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message)))) ; < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: CoinJoinBroadcastTx >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`CoinJoinBroadcastTx`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx { pub tx : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction , pub pro_tx_hash : * mut crate :: fermented :: generics :: Arr_u8_32 , pub signature : * mut crate :: fermented :: generics :: Vec_u8 , pub signature_time : i64 , pub confirmed_height : i32 } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: CoinJoinBroadcastTx > for dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx) -> dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: CoinJoinBroadcastTx { let ffi_ref = & * ffi ; dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: CoinJoinBroadcastTx { tx : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_from (ffi_ref . tx) , pro_tx_hash : < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (ffi_ref . pro_tx_hash) , signature : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from_opt (ffi_ref . signature) , signature_time : ffi_ref . signature_time , confirmed_height : ffi_ref . confirmed_height } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: CoinJoinBroadcastTx > for dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: CoinJoinBroadcastTx) -> * const dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx { tx : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_to (obj . tx) , pro_tx_hash : < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj . pro_tx_hash) , signature : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to_opt (obj . signature) , signature_time : obj . signature_time , confirmed_height : obj . confirmed_height }) } } impl Drop for dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . tx) ; ferment :: unbox_any (ffi_ref . pro_tx_hash) ; ferment :: unbox_any_opt (ffi_ref . signature) ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx_ctor < > (tx : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction , pro_tx_hash : * mut crate :: fermented :: generics :: Arr_u8_32 , signature : * mut crate :: fermented :: generics :: Vec_u8 , signature_time : i64 , confirmed_height : i32) -> * mut dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx { tx , pro_tx_hash , signature , signature_time , confirmed_height }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx_destroy < > (ffi : * mut dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx_get_tx < > (obj : * const dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction { (* obj) . tx } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx_get_pro_tx_hash < > (obj : * const dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx_get_signature < > (obj : * const dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx_get_signature_time < > (obj : * const dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx) -> i64 { (* obj) . signature_time } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx_get_confirmed_height < > (obj : * const dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx) -> i32 { (* obj) . confirmed_height } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx_set_tx < > (obj : * const dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction { (* obj) . tx } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx_set_pro_tx_hash < > (obj : * const dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx_set_signature < > (obj : * const dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx_set_signature_time < > (obj : * const dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx) -> i64 { (* obj) . signature_time } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx_set_confirmed_height < > (obj : * const dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx) -> i32 { (* obj) . confirmed_height } } pub mod coinjoin_signed_inputs { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`CoinJoinSignedInputs`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_coinjoin_messages_coinjoin_signed_inputs_CoinJoinSignedInputs { pub inputs : * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: coinjoin_signed_inputs :: CoinJoinSignedInputs > for dash_spv_coinjoin_messages_coinjoin_signed_inputs_CoinJoinSignedInputs { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_messages_coinjoin_signed_inputs_CoinJoinSignedInputs) -> dash_spv_coinjoin :: messages :: coinjoin_signed_inputs :: CoinJoinSignedInputs { let ffi_ref = & * ffi ; dash_spv_coinjoin :: messages :: coinjoin_signed_inputs :: CoinJoinSignedInputs { inputs : < crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn as ferment :: FFIConversionFrom < Vec < dashcore :: blockdata :: transaction :: txin :: TxIn > >> :: ffi_from (ffi_ref . inputs) } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_signed_inputs :: CoinJoinSignedInputs > for dash_spv_coinjoin_messages_coinjoin_signed_inputs_CoinJoinSignedInputs { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: messages :: coinjoin_signed_inputs :: CoinJoinSignedInputs) -> * const dash_spv_coinjoin_messages_coinjoin_signed_inputs_CoinJoinSignedInputs { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_signed_inputs_CoinJoinSignedInputs { inputs : < crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn as ferment :: FFIConversionTo < Vec < dashcore :: blockdata :: transaction :: txin :: TxIn > >> :: ffi_to (obj . inputs) }) } } impl Drop for dash_spv_coinjoin_messages_coinjoin_signed_inputs_CoinJoinSignedInputs { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . inputs) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_signed_inputs_CoinJoinSignedInputs_ctor < > (inputs : * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn) -> * mut dash_spv_coinjoin_messages_coinjoin_signed_inputs_CoinJoinSignedInputs { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_signed_inputs_CoinJoinSignedInputs { inputs }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_signed_inputs_CoinJoinSignedInputs_destroy < > (ffi : * mut dash_spv_coinjoin_messages_coinjoin_signed_inputs_CoinJoinSignedInputs) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_signed_inputs_CoinJoinSignedInputs_get_inputs < > (obj : * const dash_spv_coinjoin_messages_coinjoin_signed_inputs_CoinJoinSignedInputs) -> * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn { (* obj) . inputs } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_signed_inputs_CoinJoinSignedInputs_set_inputs < > (obj : * const dash_spv_coinjoin_messages_coinjoin_signed_inputs_CoinJoinSignedInputs) -> * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn { (* obj) . inputs } } pub mod send_coinjoin_queue { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`SendCoinJoinQueue`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_coinjoin_messages_send_coinjoin_queue_SendCoinJoinQueue { pub send : bool } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: send_coinjoin_queue :: SendCoinJoinQueue > for dash_spv_coinjoin_messages_send_coinjoin_queue_SendCoinJoinQueue { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_messages_send_coinjoin_queue_SendCoinJoinQueue) -> dash_spv_coinjoin :: messages :: send_coinjoin_queue :: SendCoinJoinQueue { let ffi_ref = & * ffi ; dash_spv_coinjoin :: messages :: send_coinjoin_queue :: SendCoinJoinQueue { send : ffi_ref . send } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: send_coinjoin_queue :: SendCoinJoinQueue > for dash_spv_coinjoin_messages_send_coinjoin_queue_SendCoinJoinQueue { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: messages :: send_coinjoin_queue :: SendCoinJoinQueue) -> * const dash_spv_coinjoin_messages_send_coinjoin_queue_SendCoinJoinQueue { ferment :: boxed (dash_spv_coinjoin_messages_send_coinjoin_queue_SendCoinJoinQueue { send : obj . send }) } } impl Drop for dash_spv_coinjoin_messages_send_coinjoin_queue_SendCoinJoinQueue { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_send_coinjoin_queue_SendCoinJoinQueue_ctor < > (send : bool) -> * mut dash_spv_coinjoin_messages_send_coinjoin_queue_SendCoinJoinQueue { ferment :: boxed (dash_spv_coinjoin_messages_send_coinjoin_queue_SendCoinJoinQueue { send }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_send_coinjoin_queue_SendCoinJoinQueue_destroy < > (ffi : * mut dash_spv_coinjoin_messages_send_coinjoin_queue_SendCoinJoinQueue) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_send_coinjoin_queue_SendCoinJoinQueue_get_send < > (obj : * const dash_spv_coinjoin_messages_send_coinjoin_queue_SendCoinJoinQueue) -> bool { (* obj) . send } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_send_coinjoin_queue_SendCoinJoinQueue_set_send < > (obj : * const dash_spv_coinjoin_messages_send_coinjoin_queue_SendCoinJoinQueue) -> bool { (* obj) . send } } pub mod coinjoin_complete_message { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::coinjoin_complete_message::from_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_complete_message_from_message (message : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_complete_message :: dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage { let obj = dash_spv_coinjoin :: messages :: coinjoin_complete_message :: from_message (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message)))) ; < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_complete_message :: dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_complete_message :: CoinJoinCompleteMessage >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`CoinJoinCompleteMessage`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage { pub msg_session_id : i32 , pub msg_message_id : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: coinjoin_complete_message :: CoinJoinCompleteMessage > for dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage) -> dash_spv_coinjoin :: messages :: coinjoin_complete_message :: CoinJoinCompleteMessage { let ffi_ref = & * ffi ; dash_spv_coinjoin :: messages :: coinjoin_complete_message :: CoinJoinCompleteMessage { msg_session_id : ffi_ref . msg_session_id , msg_message_id : < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage as ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: pool_message :: PoolMessage >> :: ffi_from (ffi_ref . msg_message_id) } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_complete_message :: CoinJoinCompleteMessage > for dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: messages :: coinjoin_complete_message :: CoinJoinCompleteMessage) -> * const dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage { msg_session_id : obj . msg_session_id , msg_message_id : < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_message :: PoolMessage >> :: ffi_to (obj . msg_message_id) }) } } impl Drop for dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . msg_message_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage_ctor < > (msg_session_id : i32 , msg_message_id : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage) -> * mut dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage { msg_session_id , msg_message_id }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage_destroy < > (ffi : * mut dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage_get_msg_session_id < > (obj : * const dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage) -> i32 { (* obj) . msg_session_id } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage_get_msg_message_id < > (obj : * const dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage { (* obj) . msg_message_id } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage_set_msg_session_id < > (obj : * const dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage) -> i32 { (* obj) . msg_session_id } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage_set_msg_message_id < > (obj : * const dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage { (* obj) . msg_message_id } } pub mod coinjoin_final_transaction { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`CoinJoinFinalTransaction`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction { pub msg_session_id : i32 , pub tx : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: coinjoin_final_transaction :: CoinJoinFinalTransaction > for dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction) -> dash_spv_coinjoin :: messages :: coinjoin_final_transaction :: CoinJoinFinalTransaction { let ffi_ref = & * ffi ; dash_spv_coinjoin :: messages :: coinjoin_final_transaction :: CoinJoinFinalTransaction { msg_session_id : ffi_ref . msg_session_id , tx : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_from (ffi_ref . tx) } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_final_transaction :: CoinJoinFinalTransaction > for dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: messages :: coinjoin_final_transaction :: CoinJoinFinalTransaction) -> * const dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction { msg_session_id : obj . msg_session_id , tx : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_to (obj . tx) }) } } impl Drop for dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . tx) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction_ctor < > (msg_session_id : i32 , tx : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction) -> * mut dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction { msg_session_id , tx }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction_destroy < > (ffi : * mut dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction_get_msg_session_id < > (obj : * const dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction) -> i32 { (* obj) . msg_session_id } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction_get_tx < > (obj : * const dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction { (* obj) . tx } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction_set_msg_session_id < > (obj : * const dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction) -> i32 { (* obj) . msg_session_id } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction_set_tx < > (obj : * const dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction { (* obj) . tx } # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::coinjoin_final_transaction::from_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_final_transaction_from_message (message : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_final_transaction :: dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction { let obj = dash_spv_coinjoin :: messages :: coinjoin_final_transaction :: from_message (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message)))) ; < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_final_transaction :: dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_final_transaction :: CoinJoinFinalTransaction >> :: ffi_to (obj) } } pub mod coinjoin_status_update { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::coinjoin_status_update::from_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_status_update_from_message (message : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_status_update :: dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate { let obj = dash_spv_coinjoin :: messages :: coinjoin_status_update :: from_message (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message)))) ; < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_status_update :: dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_status_update :: CoinJoinStatusUpdate >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`CoinJoinStatusUpdate`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate { pub session_id : i32 , pub pool_state : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState , pub status_update : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status_update :: dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate , pub message_id : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: coinjoin_status_update :: CoinJoinStatusUpdate > for dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate) -> dash_spv_coinjoin :: messages :: coinjoin_status_update :: CoinJoinStatusUpdate { let ffi_ref = & * ffi ; dash_spv_coinjoin :: messages :: coinjoin_status_update :: CoinJoinStatusUpdate { session_id : ffi_ref . session_id , pool_state : < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState as ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: pool_state :: PoolState >> :: ffi_from (ffi_ref . pool_state) , status_update : < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status_update :: dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate as ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: pool_status_update :: PoolStatusUpdate >> :: ffi_from (ffi_ref . status_update) , message_id : < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage as ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: pool_message :: PoolMessage >> :: ffi_from (ffi_ref . message_id) } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_status_update :: CoinJoinStatusUpdate > for dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: messages :: coinjoin_status_update :: CoinJoinStatusUpdate) -> * const dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate { session_id : obj . session_id , pool_state : < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_state :: PoolState >> :: ffi_to (obj . pool_state) , status_update : < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status_update :: dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_status_update :: PoolStatusUpdate >> :: ffi_to (obj . status_update) , message_id : < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_message :: PoolMessage >> :: ffi_to (obj . message_id) }) } } impl Drop for dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . pool_state) ; ferment :: unbox_any (ffi_ref . status_update) ; ferment :: unbox_any (ffi_ref . message_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate_ctor < > (session_id : i32 , pool_state : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState , status_update : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status_update :: dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate , message_id : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage) -> * mut dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate { session_id , pool_state , status_update , message_id }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate_destroy < > (ffi : * mut dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate_get_session_id < > (obj : * const dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate) -> i32 { (* obj) . session_id } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate_get_pool_state < > (obj : * const dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState { (* obj) . pool_state } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate_get_status_update < > (obj : * const dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status_update :: dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate { (* obj) . status_update } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate_get_message_id < > (obj : * const dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage { (* obj) . message_id } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate_set_session_id < > (obj : * const dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate) -> i32 { (* obj) . session_id } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate_set_pool_state < > (obj : * const dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState { (* obj) . pool_state } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate_set_status_update < > (obj : * const dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status_update :: dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate { (* obj) . status_update } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate_set_message_id < > (obj : * const dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage { (* obj) . message_id } } pub mod pool_status { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::pool_status::PoolStatus::value`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_value (self_ : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus) -> i32 { let obj = dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: value (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::pool_status::PoolStatus::from_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_from_index (index : i32) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus { let obj = dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: from_index (index) ; < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_status :: PoolStatus >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::pool_status::PoolStatus::is_error`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_is_error (self_ : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus) -> bool { let obj = dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: is_error (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::pool_status::PoolStatus::is_warning`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_is_warning (self_ : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus) -> bool { let obj = dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: is_warning (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::pool_status::PoolStatus::is_err_not_enough_funds`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_is_err_not_enough_funds (self_ : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus) -> bool { let obj = dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: is_err_not_enough_funds (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::pool_status::PoolStatus::should_stop`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_should_stop (self_ : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus) -> bool { let obj = dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: should_stop (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::pool_status::PoolStatus::session_completed`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_session_completed (self_ : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus) -> bool { let obj = dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: session_completed (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`PoolStatus`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_coinjoin_messages_pool_status_PoolStatus { Warmup = 0x0001 , Idle = 0x0002 , Connecting = 0x0003 , Connected = 0x0004 , Mixing = 0x0005 , Complete = 0x0106 , Finished = 0x1007 , Timeout = 0x0107 , ConnectionTimeout = 0x0108 , ErrNoInputs = 0x2100 , ErrMasternodeNotFound = 0x2101 , ErrNoMasternodesDetected = 0x2102 , ErrWalletLocked = 0x3103 , ErrNotEnoughFunds = 0x3104 , WarnNoMixingQueues = 0x4200 , WarnNoCompatibleMasternode = 0x4201 } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: pool_status :: PoolStatus > for dash_spv_coinjoin_messages_pool_status_PoolStatus { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_messages_pool_status_PoolStatus) -> dash_spv_coinjoin :: messages :: pool_status :: PoolStatus { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_coinjoin_messages_pool_status_PoolStatus :: Warmup => dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: Warmup , dash_spv_coinjoin_messages_pool_status_PoolStatus :: Idle => dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: Idle , dash_spv_coinjoin_messages_pool_status_PoolStatus :: Connecting => dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: Connecting , dash_spv_coinjoin_messages_pool_status_PoolStatus :: Connected => dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: Connected , dash_spv_coinjoin_messages_pool_status_PoolStatus :: Mixing => dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: Mixing , dash_spv_coinjoin_messages_pool_status_PoolStatus :: Complete => dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: Complete , dash_spv_coinjoin_messages_pool_status_PoolStatus :: Finished => dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: Finished , dash_spv_coinjoin_messages_pool_status_PoolStatus :: Timeout => dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: Timeout , dash_spv_coinjoin_messages_pool_status_PoolStatus :: ConnectionTimeout => dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: ConnectionTimeout , dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrNoInputs => dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: ErrNoInputs , dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrMasternodeNotFound => dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: ErrMasternodeNotFound , dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrNoMasternodesDetected => dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: ErrNoMasternodesDetected , dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrWalletLocked => dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: ErrWalletLocked , dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrNotEnoughFunds => dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: ErrNotEnoughFunds , dash_spv_coinjoin_messages_pool_status_PoolStatus :: WarnNoMixingQueues => dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: WarnNoMixingQueues , dash_spv_coinjoin_messages_pool_status_PoolStatus :: WarnNoCompatibleMasternode => dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: WarnNoCompatibleMasternode } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_status :: PoolStatus > for dash_spv_coinjoin_messages_pool_status_PoolStatus { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: messages :: pool_status :: PoolStatus) -> * const dash_spv_coinjoin_messages_pool_status_PoolStatus { ferment :: boxed (match obj { dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: Warmup => dash_spv_coinjoin_messages_pool_status_PoolStatus :: Warmup , dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: Idle => dash_spv_coinjoin_messages_pool_status_PoolStatus :: Idle , dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: Connecting => dash_spv_coinjoin_messages_pool_status_PoolStatus :: Connecting , dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: Connected => dash_spv_coinjoin_messages_pool_status_PoolStatus :: Connected , dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: Mixing => dash_spv_coinjoin_messages_pool_status_PoolStatus :: Mixing , dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: Complete => dash_spv_coinjoin_messages_pool_status_PoolStatus :: Complete , dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: Finished => dash_spv_coinjoin_messages_pool_status_PoolStatus :: Finished , dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: Timeout => dash_spv_coinjoin_messages_pool_status_PoolStatus :: Timeout , dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: ConnectionTimeout => dash_spv_coinjoin_messages_pool_status_PoolStatus :: ConnectionTimeout , dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: ErrNoInputs => dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrNoInputs , dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: ErrMasternodeNotFound => dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrMasternodeNotFound , dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: ErrNoMasternodesDetected => dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrNoMasternodesDetected , dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: ErrWalletLocked => dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrWalletLocked , dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: ErrNotEnoughFunds => dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrNotEnoughFunds , dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: WarnNoMixingQueues => dash_spv_coinjoin_messages_pool_status_PoolStatus :: WarnNoMixingQueues , dash_spv_coinjoin :: messages :: pool_status :: PoolStatus :: WarnNoCompatibleMasternode => dash_spv_coinjoin_messages_pool_status_PoolStatus :: WarnNoCompatibleMasternode , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_coinjoin_messages_pool_status_PoolStatus { fn drop (& mut self) { unsafe { match self { dash_spv_coinjoin_messages_pool_status_PoolStatus :: Warmup => { } , dash_spv_coinjoin_messages_pool_status_PoolStatus :: Idle => { } , dash_spv_coinjoin_messages_pool_status_PoolStatus :: Connecting => { } , dash_spv_coinjoin_messages_pool_status_PoolStatus :: Connected => { } , dash_spv_coinjoin_messages_pool_status_PoolStatus :: Mixing => { } , dash_spv_coinjoin_messages_pool_status_PoolStatus :: Complete => { } , dash_spv_coinjoin_messages_pool_status_PoolStatus :: Finished => { } , dash_spv_coinjoin_messages_pool_status_PoolStatus :: Timeout => { } , dash_spv_coinjoin_messages_pool_status_PoolStatus :: ConnectionTimeout => { } , dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrNoInputs => { } , dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrMasternodeNotFound => { } , dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrNoMasternodesDetected => { } , dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrWalletLocked => { } , dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrNotEnoughFunds => { } , dash_spv_coinjoin_messages_pool_status_PoolStatus :: WarnNoMixingQueues => { } , dash_spv_coinjoin_messages_pool_status_PoolStatus :: WarnNoCompatibleMasternode => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_Warmup_ctor () -> * mut dash_spv_coinjoin_messages_pool_status_PoolStatus { ferment :: boxed (dash_spv_coinjoin_messages_pool_status_PoolStatus :: Warmup { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_Idle_ctor () -> * mut dash_spv_coinjoin_messages_pool_status_PoolStatus { ferment :: boxed (dash_spv_coinjoin_messages_pool_status_PoolStatus :: Idle { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_Connecting_ctor () -> * mut dash_spv_coinjoin_messages_pool_status_PoolStatus { ferment :: boxed (dash_spv_coinjoin_messages_pool_status_PoolStatus :: Connecting { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_Connected_ctor () -> * mut dash_spv_coinjoin_messages_pool_status_PoolStatus { ferment :: boxed (dash_spv_coinjoin_messages_pool_status_PoolStatus :: Connected { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_Mixing_ctor () -> * mut dash_spv_coinjoin_messages_pool_status_PoolStatus { ferment :: boxed (dash_spv_coinjoin_messages_pool_status_PoolStatus :: Mixing { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_Complete_ctor () -> * mut dash_spv_coinjoin_messages_pool_status_PoolStatus { ferment :: boxed (dash_spv_coinjoin_messages_pool_status_PoolStatus :: Complete { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_Finished_ctor () -> * mut dash_spv_coinjoin_messages_pool_status_PoolStatus { ferment :: boxed (dash_spv_coinjoin_messages_pool_status_PoolStatus :: Finished { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_Timeout_ctor () -> * mut dash_spv_coinjoin_messages_pool_status_PoolStatus { ferment :: boxed (dash_spv_coinjoin_messages_pool_status_PoolStatus :: Timeout { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_ConnectionTimeout_ctor () -> * mut dash_spv_coinjoin_messages_pool_status_PoolStatus { ferment :: boxed (dash_spv_coinjoin_messages_pool_status_PoolStatus :: ConnectionTimeout { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_ErrNoInputs_ctor () -> * mut dash_spv_coinjoin_messages_pool_status_PoolStatus { ferment :: boxed (dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrNoInputs { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_ErrMasternodeNotFound_ctor () -> * mut dash_spv_coinjoin_messages_pool_status_PoolStatus { ferment :: boxed (dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrMasternodeNotFound { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_ErrNoMasternodesDetected_ctor () -> * mut dash_spv_coinjoin_messages_pool_status_PoolStatus { ferment :: boxed (dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrNoMasternodesDetected { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_ErrWalletLocked_ctor () -> * mut dash_spv_coinjoin_messages_pool_status_PoolStatus { ferment :: boxed (dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrWalletLocked { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_ErrNotEnoughFunds_ctor () -> * mut dash_spv_coinjoin_messages_pool_status_PoolStatus { ferment :: boxed (dash_spv_coinjoin_messages_pool_status_PoolStatus :: ErrNotEnoughFunds { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_WarnNoMixingQueues_ctor () -> * mut dash_spv_coinjoin_messages_pool_status_PoolStatus { ferment :: boxed (dash_spv_coinjoin_messages_pool_status_PoolStatus :: WarnNoMixingQueues { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_WarnNoCompatibleMasternode_ctor () -> * mut dash_spv_coinjoin_messages_pool_status_PoolStatus { ferment :: boxed (dash_spv_coinjoin_messages_pool_status_PoolStatus :: WarnNoCompatibleMasternode { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_PoolStatus_destroy < > (ffi : * mut dash_spv_coinjoin_messages_pool_status_PoolStatus) { ferment :: unbox_any (ffi) ; } } pub mod pool_state { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::pool_state::PoolState::value`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_state_PoolState_value (self_ : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState) -> i32 { let obj = dash_spv_coinjoin :: messages :: pool_state :: PoolState :: value (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::pool_state::PoolState::from_value`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_state_PoolState_from_value (value : i32) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState { let obj = dash_spv_coinjoin :: messages :: pool_state :: PoolState :: from_value (value) ; < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_state :: PoolState >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::pool_state::PoolState::pool_state_min`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_state_PoolState_pool_state_min () -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState { let obj = dash_spv_coinjoin :: messages :: pool_state :: PoolState :: pool_state_min () ; < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_state :: PoolState >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::pool_state::PoolState::pool_state_max`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_state_PoolState_pool_state_max () -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState { let obj = dash_spv_coinjoin :: messages :: pool_state :: PoolState :: pool_state_max () ; < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_state :: PoolState >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`PoolState`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_coinjoin_messages_pool_state_PoolState { Idle = 0 , Queue = 1 , AcceptingEntries = 2 , Signing = 3 , Error = 4 } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: pool_state :: PoolState > for dash_spv_coinjoin_messages_pool_state_PoolState { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_messages_pool_state_PoolState) -> dash_spv_coinjoin :: messages :: pool_state :: PoolState { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_coinjoin_messages_pool_state_PoolState :: Idle => dash_spv_coinjoin :: messages :: pool_state :: PoolState :: Idle , dash_spv_coinjoin_messages_pool_state_PoolState :: Queue => dash_spv_coinjoin :: messages :: pool_state :: PoolState :: Queue , dash_spv_coinjoin_messages_pool_state_PoolState :: AcceptingEntries => dash_spv_coinjoin :: messages :: pool_state :: PoolState :: AcceptingEntries , dash_spv_coinjoin_messages_pool_state_PoolState :: Signing => dash_spv_coinjoin :: messages :: pool_state :: PoolState :: Signing , dash_spv_coinjoin_messages_pool_state_PoolState :: Error => dash_spv_coinjoin :: messages :: pool_state :: PoolState :: Error } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_state :: PoolState > for dash_spv_coinjoin_messages_pool_state_PoolState { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: messages :: pool_state :: PoolState) -> * const dash_spv_coinjoin_messages_pool_state_PoolState { ferment :: boxed (match obj { dash_spv_coinjoin :: messages :: pool_state :: PoolState :: Idle => dash_spv_coinjoin_messages_pool_state_PoolState :: Idle , dash_spv_coinjoin :: messages :: pool_state :: PoolState :: Queue => dash_spv_coinjoin_messages_pool_state_PoolState :: Queue , dash_spv_coinjoin :: messages :: pool_state :: PoolState :: AcceptingEntries => dash_spv_coinjoin_messages_pool_state_PoolState :: AcceptingEntries , dash_spv_coinjoin :: messages :: pool_state :: PoolState :: Signing => dash_spv_coinjoin_messages_pool_state_PoolState :: Signing , dash_spv_coinjoin :: messages :: pool_state :: PoolState :: Error => dash_spv_coinjoin_messages_pool_state_PoolState :: Error , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_coinjoin_messages_pool_state_PoolState { fn drop (& mut self) { unsafe { match self { dash_spv_coinjoin_messages_pool_state_PoolState :: Idle => { } , dash_spv_coinjoin_messages_pool_state_PoolState :: Queue => { } , dash_spv_coinjoin_messages_pool_state_PoolState :: AcceptingEntries => { } , dash_spv_coinjoin_messages_pool_state_PoolState :: Signing => { } , dash_spv_coinjoin_messages_pool_state_PoolState :: Error => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_state_PoolState_Idle_ctor () -> * mut dash_spv_coinjoin_messages_pool_state_PoolState { ferment :: boxed (dash_spv_coinjoin_messages_pool_state_PoolState :: Idle { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_state_PoolState_Queue_ctor () -> * mut dash_spv_coinjoin_messages_pool_state_PoolState { ferment :: boxed (dash_spv_coinjoin_messages_pool_state_PoolState :: Queue { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_state_PoolState_AcceptingEntries_ctor () -> * mut dash_spv_coinjoin_messages_pool_state_PoolState { ferment :: boxed (dash_spv_coinjoin_messages_pool_state_PoolState :: AcceptingEntries { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_state_PoolState_Signing_ctor () -> * mut dash_spv_coinjoin_messages_pool_state_PoolState { ferment :: boxed (dash_spv_coinjoin_messages_pool_state_PoolState :: Signing { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_state_PoolState_Error_ctor () -> * mut dash_spv_coinjoin_messages_pool_state_PoolState { ferment :: boxed (dash_spv_coinjoin_messages_pool_state_PoolState :: Error { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_state_PoolState_destroy < > (ffi : * mut dash_spv_coinjoin_messages_pool_state_PoolState) { ferment :: unbox_any (ffi) ; } } pub mod coinjoin_entry { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`CoinJoinEntry`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry { pub mixing_inputs : * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn , pub mixing_outputs : * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut , pub tx_collateral : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: coinjoin_entry :: CoinJoinEntry > for dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry) -> dash_spv_coinjoin :: messages :: coinjoin_entry :: CoinJoinEntry { let ffi_ref = & * ffi ; dash_spv_coinjoin :: messages :: coinjoin_entry :: CoinJoinEntry { mixing_inputs : < crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn as ferment :: FFIConversionFrom < Vec < dashcore :: blockdata :: transaction :: txin :: TxIn > >> :: ffi_from (ffi_ref . mixing_inputs) , mixing_outputs : < crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut as ferment :: FFIConversionFrom < Vec < dashcore :: blockdata :: transaction :: txout :: TxOut > >> :: ffi_from (ffi_ref . mixing_outputs) , tx_collateral : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_from (ffi_ref . tx_collateral) } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_entry :: CoinJoinEntry > for dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: messages :: coinjoin_entry :: CoinJoinEntry) -> * const dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry { mixing_inputs : < crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn as ferment :: FFIConversionTo < Vec < dashcore :: blockdata :: transaction :: txin :: TxIn > >> :: ffi_to (obj . mixing_inputs) , mixing_outputs : < crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut as ferment :: FFIConversionTo < Vec < dashcore :: blockdata :: transaction :: txout :: TxOut > >> :: ffi_to (obj . mixing_outputs) , tx_collateral : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_to (obj . tx_collateral) }) } } impl Drop for dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . mixing_inputs) ; ferment :: unbox_any (ffi_ref . mixing_outputs) ; ferment :: unbox_any (ffi_ref . tx_collateral) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry_ctor < > (mixing_inputs : * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn , mixing_outputs : * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut , tx_collateral : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction) -> * mut dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry { mixing_inputs , mixing_outputs , tx_collateral }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry_destroy < > (ffi : * mut dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry_get_mixing_inputs < > (obj : * const dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry) -> * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn { (* obj) . mixing_inputs } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry_get_mixing_outputs < > (obj : * const dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry) -> * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut { (* obj) . mixing_outputs } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry_get_tx_collateral < > (obj : * const dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction { (* obj) . tx_collateral } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry_set_mixing_inputs < > (obj : * const dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry) -> * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn { (* obj) . mixing_inputs } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry_set_mixing_outputs < > (obj : * const dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry) -> * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut { (* obj) . mixing_outputs } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry_set_tx_collateral < > (obj : * const dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction { (* obj) . tx_collateral } # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::coinjoin_entry::from_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_entry_from_message (message : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_entry :: dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry { let obj = dash_spv_coinjoin :: messages :: coinjoin_entry :: from_message (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message)))) ; < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_entry :: dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_entry :: CoinJoinEntry >> :: ffi_to (obj) } } pub mod pool_message { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::pool_message::PoolMessage::value`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_value (self_ : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage) -> i32 { let obj = dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: value (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::pool_message::PoolMessage::from_value`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_from_value (value : i32) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage { let obj = dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: from_value (value) ; < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_message :: PoolMessage >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::pool_message::PoolMessage::msg_pool_min`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_msg_pool_min () -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage { let obj = dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: msg_pool_min () ; < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_message :: PoolMessage >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::pool_message::PoolMessage::msg_pool_max`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_msg_pool_max () -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage { let obj = dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: msg_pool_max () ; < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_message :: PoolMessage >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`PoolMessage`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_coinjoin_messages_pool_message_PoolMessage { ErrAlreadyHave = 0 , ErrDenom = 1 , ErrEntriesFull = 2 , ErrExistingTx = 3 , ErrFees = 4 , ErrInvalidCollateral = 5 , ErrInvalidInput = 6 , ErrInvalidScript = 7 , ErrInvalidTx = 8 , ErrMaximum = 9 , ErrMnList = 10 , ErrMode = 11 , ErrQueueFull = 14 , ErrRecent = 15 , ErrSession = 16 , ErrMissingTx = 17 , ErrVersion = 18 , MsgNoErr = 19 , MsgSuccess = 20 , MsgEntriesAdded = 21 , ErrSizeMismatch = 22 , ErrTimeout = 23 , ErrConnectionTimeout = 24 } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: pool_message :: PoolMessage > for dash_spv_coinjoin_messages_pool_message_PoolMessage { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_messages_pool_message_PoolMessage) -> dash_spv_coinjoin :: messages :: pool_message :: PoolMessage { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrAlreadyHave => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrAlreadyHave , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrDenom => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrDenom , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrEntriesFull => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrEntriesFull , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrExistingTx => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrExistingTx , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrFees => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrFees , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrInvalidCollateral => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrInvalidCollateral , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrInvalidInput => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrInvalidInput , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrInvalidScript => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrInvalidScript , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrInvalidTx => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrInvalidTx , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrMaximum => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrMaximum , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrMnList => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrMnList , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrMode => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrMode , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrQueueFull => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrQueueFull , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrRecent => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrRecent , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrSession => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrSession , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrMissingTx => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrMissingTx , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrVersion => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrVersion , dash_spv_coinjoin_messages_pool_message_PoolMessage :: MsgNoErr => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: MsgNoErr , dash_spv_coinjoin_messages_pool_message_PoolMessage :: MsgSuccess => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: MsgSuccess , dash_spv_coinjoin_messages_pool_message_PoolMessage :: MsgEntriesAdded => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: MsgEntriesAdded , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrSizeMismatch => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrSizeMismatch , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrTimeout => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrTimeout , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrConnectionTimeout => dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrConnectionTimeout } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_message :: PoolMessage > for dash_spv_coinjoin_messages_pool_message_PoolMessage { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: messages :: pool_message :: PoolMessage) -> * const dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (match obj { dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrAlreadyHave => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrAlreadyHave , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrDenom => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrDenom , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrEntriesFull => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrEntriesFull , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrExistingTx => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrExistingTx , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrFees => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrFees , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrInvalidCollateral => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrInvalidCollateral , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrInvalidInput => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrInvalidInput , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrInvalidScript => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrInvalidScript , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrInvalidTx => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrInvalidTx , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrMaximum => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrMaximum , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrMnList => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrMnList , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrMode => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrMode , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrQueueFull => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrQueueFull , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrRecent => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrRecent , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrSession => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrSession , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrMissingTx => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrMissingTx , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrVersion => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrVersion , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: MsgNoErr => dash_spv_coinjoin_messages_pool_message_PoolMessage :: MsgNoErr , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: MsgSuccess => dash_spv_coinjoin_messages_pool_message_PoolMessage :: MsgSuccess , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: MsgEntriesAdded => dash_spv_coinjoin_messages_pool_message_PoolMessage :: MsgEntriesAdded , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrSizeMismatch => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrSizeMismatch , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrTimeout => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrTimeout , dash_spv_coinjoin :: messages :: pool_message :: PoolMessage :: ErrConnectionTimeout => dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrConnectionTimeout , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_coinjoin_messages_pool_message_PoolMessage { fn drop (& mut self) { unsafe { match self { dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrAlreadyHave => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrDenom => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrEntriesFull => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrExistingTx => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrFees => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrInvalidCollateral => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrInvalidInput => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrInvalidScript => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrInvalidTx => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrMaximum => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrMnList => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrMode => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrQueueFull => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrRecent => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrSession => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrMissingTx => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrVersion => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: MsgNoErr => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: MsgSuccess => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: MsgEntriesAdded => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrSizeMismatch => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrTimeout => { } , dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrConnectionTimeout => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrAlreadyHave_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrAlreadyHave { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrDenom_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrDenom { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrEntriesFull_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrEntriesFull { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrExistingTx_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrExistingTx { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrFees_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrFees { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrInvalidCollateral_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrInvalidCollateral { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrInvalidInput_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrInvalidInput { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrInvalidScript_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrInvalidScript { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrInvalidTx_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrInvalidTx { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrMaximum_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrMaximum { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrMnList_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrMnList { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrMode_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrMode { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrQueueFull_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrQueueFull { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrRecent_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrRecent { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrSession_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrSession { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrMissingTx_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrMissingTx { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrVersion_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrVersion { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_MsgNoErr_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: MsgNoErr { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_MsgSuccess_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: MsgSuccess { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_MsgEntriesAdded_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: MsgEntriesAdded { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrSizeMismatch_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrSizeMismatch { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrTimeout_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrTimeout { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_ErrConnectionTimeout_ctor () -> * mut dash_spv_coinjoin_messages_pool_message_PoolMessage { ferment :: boxed (dash_spv_coinjoin_messages_pool_message_PoolMessage :: ErrConnectionTimeout { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_message_PoolMessage_destroy < > (ffi : * mut dash_spv_coinjoin_messages_pool_message_PoolMessage) { ferment :: unbox_any (ffi) ; } } pub mod pool_status_update { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::pool_status_update::PoolStatusUpdate::value`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate_value (self_ : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status_update :: dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate) -> i32 { let obj = dash_spv_coinjoin :: messages :: pool_status_update :: PoolStatusUpdate :: value (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::pool_status_update::PoolStatusUpdate::from_value`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate_from_value (value : i32) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status_update :: dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate { let obj = dash_spv_coinjoin :: messages :: pool_status_update :: PoolStatusUpdate :: from_value (value) ; < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status_update :: dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_status_update :: PoolStatusUpdate >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`PoolStatusUpdate`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate { Rejected = 0 , Accepted = 1 } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: pool_status_update :: PoolStatusUpdate > for dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate) -> dash_spv_coinjoin :: messages :: pool_status_update :: PoolStatusUpdate { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate :: Rejected => dash_spv_coinjoin :: messages :: pool_status_update :: PoolStatusUpdate :: Rejected , dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate :: Accepted => dash_spv_coinjoin :: messages :: pool_status_update :: PoolStatusUpdate :: Accepted } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_status_update :: PoolStatusUpdate > for dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: messages :: pool_status_update :: PoolStatusUpdate) -> * const dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate { ferment :: boxed (match obj { dash_spv_coinjoin :: messages :: pool_status_update :: PoolStatusUpdate :: Rejected => dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate :: Rejected , dash_spv_coinjoin :: messages :: pool_status_update :: PoolStatusUpdate :: Accepted => dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate :: Accepted , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate { fn drop (& mut self) { unsafe { match self { dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate :: Rejected => { } , dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate :: Accepted => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate_Rejected_ctor () -> * mut dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate { ferment :: boxed (dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate :: Rejected { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate_Accepted_ctor () -> * mut dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate { ferment :: boxed (dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate :: Accepted { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate_destroy < > (ffi : * mut dash_spv_coinjoin_messages_pool_status_update_PoolStatusUpdate) { ferment :: unbox_any (ffi) ; } } pub mod coinjoin_queue_message { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`CoinJoinQueueMessage`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage { pub denomination : u32 , pub pro_tx_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash , pub time : i64 , pub ready : bool , pub signature : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature , pub tried : bool } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: coinjoin_queue_message :: CoinJoinQueueMessage > for dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage) -> dash_spv_coinjoin :: messages :: coinjoin_queue_message :: CoinJoinQueueMessage { let ffi_ref = & * ffi ; dash_spv_coinjoin :: messages :: coinjoin_queue_message :: CoinJoinQueueMessage { denomination : ffi_ref . denomination , pro_tx_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: ProTxHash >> :: ffi_from (ffi_ref . pro_tx_hash) , time : ffi_ref . time , ready : ffi_ref . ready , signature : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionFrom < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_from_opt (ffi_ref . signature) , tried : ffi_ref . tried } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_queue_message :: CoinJoinQueueMessage > for dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: messages :: coinjoin_queue_message :: CoinJoinQueueMessage) -> * const dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage { denomination : obj . denomination , pro_tx_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash as ferment :: FFIConversionTo < dashcore :: hash_types :: ProTxHash >> :: ffi_to (obj . pro_tx_hash) , time : obj . time , ready : obj . ready , signature : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionTo < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_to_opt (obj . signature) , tried : obj . tried }) } } impl Drop for dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . pro_tx_hash) ; ; ; ferment :: unbox_any_opt (ffi_ref . signature) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage_ctor < > (denomination : u32 , pro_tx_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash , time : i64 , ready : bool , signature : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature , tried : bool) -> * mut dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage { denomination , pro_tx_hash , time , ready , signature , tried }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage_destroy < > (ffi : * mut dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage_get_denomination < > (obj : * const dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage) -> u32 { (* obj) . denomination } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage_get_pro_tx_hash < > (obj : * const dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage_get_time < > (obj : * const dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage) -> i64 { (* obj) . time } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage_get_ready < > (obj : * const dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage) -> bool { (* obj) . ready } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage_get_signature < > (obj : * const dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage_get_tried < > (obj : * const dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage) -> bool { (* obj) . tried } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage_set_denomination < > (obj : * const dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage) -> u32 { (* obj) . denomination } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage_set_pro_tx_hash < > (obj : * const dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage_set_time < > (obj : * const dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage) -> i64 { (* obj) . time } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage_set_ready < > (obj : * const dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage) -> bool { (* obj) . ready } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage_set_signature < > (obj : * const dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage_set_tried < > (obj : * const dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage) -> bool { (* obj) . tried } # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::coinjoin_queue_message::CoinJoinQueueMessage::from_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage_from_message (message : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_queue_message :: dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage { let obj = dash_spv_coinjoin :: messages :: coinjoin_queue_message :: CoinJoinQueueMessage :: from_message (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message)))) ; < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_queue_message :: dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_queue_message :: CoinJoinQueueMessage >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::coinjoin_queue_message::CoinJoinQueueMessage::is_time_out_of_bounds`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage_is_time_out_of_bounds (self_ : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_queue_message :: dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage , current_time : u64) -> bool { let obj = dash_spv_coinjoin :: messages :: coinjoin_queue_message :: CoinJoinQueueMessage :: is_time_out_of_bounds (& ferment :: FFIConversionFrom :: ffi_from (self_) , current_time) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::coinjoin_queue_message::CoinJoinQueueMessage::check_signature`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage_check_signature (self_ : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_queue_message :: dash_spv_coinjoin_messages_coinjoin_queue_message_CoinJoinQueueMessage , key : * mut crate :: fermented :: generics :: Arr_u8_48 , use_legacy : bool) -> bool { let obj = dash_spv_coinjoin :: messages :: coinjoin_queue_message :: CoinJoinQueueMessage :: check_signature (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: generics :: Arr_u8_48 as ferment :: FFIConversionFrom < [u8 ; 48] >> :: ffi_from (key) , use_legacy) ; obj } } pub mod coinjoin_accept_message { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`CoinJoinAcceptMessage`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage { pub denomination : u32 , pub tx_collateral : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: coinjoin_accept_message :: CoinJoinAcceptMessage > for dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage) -> dash_spv_coinjoin :: messages :: coinjoin_accept_message :: CoinJoinAcceptMessage { let ffi_ref = & * ffi ; dash_spv_coinjoin :: messages :: coinjoin_accept_message :: CoinJoinAcceptMessage { denomination : ffi_ref . denomination , tx_collateral : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_from (ffi_ref . tx_collateral) } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_accept_message :: CoinJoinAcceptMessage > for dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: messages :: coinjoin_accept_message :: CoinJoinAcceptMessage) -> * const dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage { denomination : obj . denomination , tx_collateral : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_to (obj . tx_collateral) }) } } impl Drop for dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . tx_collateral) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage_ctor < > (denomination : u32 , tx_collateral : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction) -> * mut dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage { denomination , tx_collateral }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage_destroy < > (ffi : * mut dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage_get_denomination < > (obj : * const dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage) -> u32 { (* obj) . denomination } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage_get_tx_collateral < > (obj : * const dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction { (* obj) . tx_collateral } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage_set_denomination < > (obj : * const dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage) -> u32 { (* obj) . denomination } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage_set_tx_collateral < > (obj : * const dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction { (* obj) . tx_collateral } # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::coinjoin_accept_message::from_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_accept_message_from_message (message : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_accept_message :: dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage { let obj = dash_spv_coinjoin :: messages :: coinjoin_accept_message :: from_message (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message)))) ; < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_accept_message :: dash_spv_coinjoin_messages_coinjoin_accept_message_CoinJoinAcceptMessage as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_accept_message :: CoinJoinAcceptMessage >> :: ffi_to (obj) } } pub mod coinjoin_message { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_coinjoin::messages::coinjoin_message::CoinJoinMessage::from_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage_from_message (message : * mut crate :: fermented :: generics :: Slice_u8 , message_type : * mut std :: os :: raw :: c_char) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_message :: dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage { let obj = dash_spv_coinjoin :: messages :: coinjoin_message :: CoinJoinMessage :: from_message (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message))) , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (message_type)))) ; < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_message :: dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_message :: CoinJoinMessage >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`CoinJoinMessage`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage { StatusUpdate (* mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_status_update :: dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate) , BroadcastTx (* mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx) , FinalTransaction (* mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_final_transaction :: dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction) , Complete (* mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_complete_message :: dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage) } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: coinjoin_message :: CoinJoinMessage > for dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage) -> dash_spv_coinjoin :: messages :: coinjoin_message :: CoinJoinMessage { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage :: StatusUpdate (o_0) => dash_spv_coinjoin :: messages :: coinjoin_message :: CoinJoinMessage :: StatusUpdate (< crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_status_update :: dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate as ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: coinjoin_status_update :: CoinJoinStatusUpdate >> :: ffi_from (* o_0)) , dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage :: BroadcastTx (o_0) => dash_spv_coinjoin :: messages :: coinjoin_message :: CoinJoinMessage :: BroadcastTx (< crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx as ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: CoinJoinBroadcastTx >> :: ffi_from (* o_0)) , dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage :: FinalTransaction (o_0) => dash_spv_coinjoin :: messages :: coinjoin_message :: CoinJoinMessage :: FinalTransaction (< crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_final_transaction :: dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction as ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: coinjoin_final_transaction :: CoinJoinFinalTransaction >> :: ffi_from (* o_0)) , dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage :: Complete (o_0) => dash_spv_coinjoin :: messages :: coinjoin_message :: CoinJoinMessage :: Complete (< crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_complete_message :: dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage as ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: coinjoin_complete_message :: CoinJoinCompleteMessage >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_message :: CoinJoinMessage > for dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: messages :: coinjoin_message :: CoinJoinMessage) -> * const dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage { ferment :: boxed (match obj { dash_spv_coinjoin :: messages :: coinjoin_message :: CoinJoinMessage :: StatusUpdate (o_0) => dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage :: StatusUpdate (< crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_status_update :: dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_status_update :: CoinJoinStatusUpdate >> :: ffi_to (o_0)) , dash_spv_coinjoin :: messages :: coinjoin_message :: CoinJoinMessage :: BroadcastTx (o_0) => dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage :: BroadcastTx (< crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: CoinJoinBroadcastTx >> :: ffi_to (o_0)) , dash_spv_coinjoin :: messages :: coinjoin_message :: CoinJoinMessage :: FinalTransaction (o_0) => dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage :: FinalTransaction (< crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_final_transaction :: dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_final_transaction :: CoinJoinFinalTransaction >> :: ffi_to (o_0)) , dash_spv_coinjoin :: messages :: coinjoin_message :: CoinJoinMessage :: Complete (o_0) => dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage :: Complete (< crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_complete_message :: dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_complete_message :: CoinJoinCompleteMessage >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage { fn drop (& mut self) { unsafe { match self { dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage :: StatusUpdate (o_0) => { ferment :: unbox_any (* o_0) ; } , dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage :: BroadcastTx (o_0) => { ferment :: unbox_any (* o_0) ; } , dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage :: FinalTransaction (o_0) => { ferment :: unbox_any (* o_0) ; } , dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage :: Complete (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage_StatusUpdate_ctor (o_o_0 : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_status_update :: dash_spv_coinjoin_messages_coinjoin_status_update_CoinJoinStatusUpdate) -> * mut dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage :: StatusUpdate (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage_BroadcastTx_ctor (o_o_0 : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx) -> * mut dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage :: BroadcastTx (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage_FinalTransaction_ctor (o_o_0 : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_final_transaction :: dash_spv_coinjoin_messages_coinjoin_final_transaction_CoinJoinFinalTransaction) -> * mut dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage :: FinalTransaction (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage_Complete_ctor (o_o_0 : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_complete_message :: dash_spv_coinjoin_messages_coinjoin_complete_message_CoinJoinCompleteMessage) -> * mut dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage { ferment :: boxed (dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage :: Complete (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage_destroy < > (ffi : * mut dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage) { ferment :: unbox_any (ffi) ; } } } pub mod coinjoin { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::new`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_new (get_input_value_by_prev_outpoint : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64 , has_chain_lock : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool , context : * const std :: os :: raw :: c_void) -> * mut dash_spv_coinjoin :: coinjoin :: CoinJoin { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: new (move | o_0 , o_1 , o_2 | unsafe { get_input_value_by_prev_outpoint . call (o_0 , o_1 , o_2) } , move | o_0 , o_1 | unsafe { has_chain_lock . call (o_0 , o_1) } , context) ; ferment :: boxed (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::get_standard_denominations`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_get_standard_denominations () -> * mut crate :: fermented :: generics :: Arr_u64_5 { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: get_standard_denominations () ; < crate :: fermented :: generics :: Arr_u64_5 as ferment :: FFIConversionTo < [u64 ; 5] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::get_smallest_denomination`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_get_smallest_denomination () -> u64 { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: get_smallest_denomination () ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::is_denominated_amount`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_is_denominated_amount (input_amount : u64) -> bool { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: is_denominated_amount (input_amount) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::is_valid_denomination`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_is_valid_denomination (n_denom : u32) -> bool { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: is_valid_denomination (n_denom) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::amount_to_denomination`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_amount_to_denomination (input_amount : u64) -> u32 { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: amount_to_denomination (input_amount) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::denomination_to_amount`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_denomination_to_amount (n_denom : u32) -> i64 { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: denomination_to_amount (n_denom) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::max_pool_amount`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_max_pool_amount () -> u64 { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: max_pool_amount () ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::denomination_to_string`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_denomination_to_string (denom : u32) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: denomination_to_string (denom) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::is_collateral_valid`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_is_collateral_valid (self_ : * mut dash_spv_coinjoin :: coinjoin :: CoinJoin , tx_collateral : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction , check_inputs : bool) -> bool { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: is_collateral_valid (& * self_ , Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_from (tx_collateral))) , check_inputs) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::get_collateral_amount`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_get_collateral_amount () -> u64 { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: get_collateral_amount () ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::get_max_collateral_amount`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_get_max_collateral_amount () -> u64 { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: get_max_collateral_amount () ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::is_collateral_amount`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_is_collateral_amount (input_amount : u64) -> bool { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: is_collateral_amount (input_amount) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::calculate_amount_priority`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_calculate_amount_priority (input_amount : u64) -> i64 { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: calculate_amount_priority (input_amount) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::add_dstx`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_add_dstx (self_ : * mut dash_spv_coinjoin :: coinjoin :: CoinJoin , dstx : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx) { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: add_dstx (& mut * self_ , < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx as ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: CoinJoinBroadcastTx >> :: ffi_from (dstx)) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::has_dstx`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_has_dstx (self_ : * mut dash_spv_coinjoin :: coinjoin :: CoinJoin , tx_hash : * mut crate :: fermented :: generics :: Arr_u8_32) -> bool { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: has_dstx (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (tx_hash)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::get_dstx`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_get_dstx (self_ : * mut dash_spv_coinjoin :: coinjoin :: CoinJoin , tx_hash : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: get_dstx (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (tx_hash)) ; < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: CoinJoinBroadcastTx >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::update_block_tip`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_update_block_tip (self_ : * mut dash_spv_coinjoin :: coinjoin :: CoinJoin , block_height : u32) { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: update_block_tip (& mut * self_ , block_height) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::notify_chain_lock`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_notify_chain_lock (self_ : * mut dash_spv_coinjoin :: coinjoin :: CoinJoin , block_height : u32) { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: notify_chain_lock (& mut * self_ , block_height) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::update_dstx_confirmed_height`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_update_dstx_confirmed_height (self_ : * mut dash_spv_coinjoin :: coinjoin :: CoinJoin , tx_hash : * mut crate :: fermented :: generics :: Arr_u8_32 , n_height : i32) { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: update_dstx_confirmed_height (& mut * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (tx_hash) , n_height) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::transaction_added_to_mempool`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_transaction_added_to_mempool (self_ : * mut dash_spv_coinjoin :: coinjoin :: CoinJoin , tx_hash : * mut crate :: fermented :: generics :: Arr_u8_32) { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: transaction_added_to_mempool (& mut * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (tx_hash)) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::block_connected`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_block_connected (self_ : * mut dash_spv_coinjoin :: coinjoin :: CoinJoin , block_height : u32 , block_transactions : * mut crate :: fermented :: generics :: Vec_u8_32 , vtx_conflicted : * mut crate :: fermented :: generics :: Vec_u8_32) { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: block_connected (& mut * self_ , block_height , < crate :: fermented :: generics :: Vec_u8_32 as ferment :: FFIConversionFrom < Vec < [u8 ; 32] > >> :: ffi_from (block_transactions) , < crate :: fermented :: generics :: Vec_u8_32 as ferment :: FFIConversionFrom < Vec < [u8 ; 32] > >> :: ffi_from (vtx_conflicted)) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::block_disconnected`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_block_disconnected (self_ : * mut dash_spv_coinjoin :: coinjoin :: CoinJoin , block_transactions : * mut crate :: fermented :: generics :: Vec_u8_32) { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: block_disconnected (& mut * self_ , < crate :: fermented :: generics :: Vec_u8_32 as ferment :: FFIConversionFrom < Vec < [u8 ; 32] > >> :: ffi_from (block_transactions)) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::get_message_by_id`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_get_message_by_id (message_id : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: get_message_by_id (< crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage as ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: pool_message :: PoolMessage >> :: ffi_from (message_id)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < & str >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::get_status_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_get_status_message (status : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: get_status_message (< crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus as ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: pool_status :: PoolStatus >> :: ffi_from (status)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < & str >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::pool_min_participants`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_pool_min_participants (chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u32 { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: pool_min_participants (Box :: leak (Box :: new (< crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::pool_max_participants`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_pool_max_participants (chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u32 { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: pool_max_participants (Box :: leak (Box :: new (< crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::get_rounds_string`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_get_rounds_string (rounds : i32) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: get_rounds_string (rounds) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < & str >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::get_input_value_by_prev_outpoint`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_get_input_value_by_prev_outpoint (self_ : * mut dash_spv_coinjoin :: coinjoin :: CoinJoin , txid : * mut crate :: fermented :: generics :: Arr_u8_32 , vout : u32) -> i64 { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: get_input_value_by_prev_outpoint (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (txid) , vout) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin::CoinJoin::check_dstxs`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_CoinJoin_check_dstxs (self_ : * mut dash_spv_coinjoin :: coinjoin :: CoinJoin , block_height : u32) { let obj = dash_spv_coinjoin :: coinjoin :: CoinJoin :: check_dstxs (& mut * self_ , block_height) ; ; } } pub mod coinjoin_client_manager { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::new`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_new (wallet_ex : * mut dash_spv_coinjoin :: wallet_ex :: WalletEx , coinjoin : * mut dash_spv_coinjoin :: coinjoin :: CoinJoin , options : * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coinjoin_client_options :: dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions , get_masternode_list : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_RTRN_dashcore_sml_masternode_list_MasternodeList , update_success_block : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_RTRN_ , is_waiting_for_new_block : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_RTRN_bool , session_lifecycle_listener : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_i32_Arr_u8_32_u32_dash_spv_coinjoin_messages_pool_state_PoolState_dash_spv_coinjoin_messages_pool_message_PoolMessage_dash_spv_coinjoin_messages_pool_status_PoolStatus_Option_std_net_SocketAddr_bool_RTRN_ , mixing_lifecycle_listener : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_bool_Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus_RTRN_ , masternode_by_hash : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry , valid_mns_count : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_RTRN_usize , context : * const std :: os :: raw :: c_void) -> * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: new ((& * wallet_ex) . clone () , (& * coinjoin) . clone () , < crate :: fermented :: types :: dash_spv_coinjoin :: models :: coinjoin_client_options :: dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions as ferment :: FFIConversionFrom < dash_spv_coinjoin :: models :: coinjoin_client_options :: CoinJoinClientOptions >> :: ffi_from (options) , move | o_0 | unsafe { get_masternode_list . call (o_0) } , move | o_0 | unsafe { update_success_block . call (o_0) } , move | o_0 | unsafe { is_waiting_for_new_block . call (o_0) } , move | o_0 , o_1 , o_2 , o_3 , o_4 , o_5 , o_6 , o_7 , o_8 , o_9 | unsafe { session_lifecycle_listener . call (o_0 , o_1 , o_2 , o_3 , o_4 , o_5 , o_6 , o_7 , o_8 , o_9) } , move | o_0 , o_1 , o_2 , o_3 | unsafe { mixing_lifecycle_listener . call (o_0 , o_1 , o_2 , o_3) } , move | o_0 , o_1 | unsafe { masternode_by_hash . call (o_0 , o_1) } , move | o_0 | unsafe { valid_mns_count . call (o_0) } , context) ; ferment :: boxed (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::process_raw_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_process_raw_message (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , from : * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr , message : * mut crate :: fermented :: generics :: Slice_u8 , message_type : * mut std :: os :: raw :: c_char) { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: process_raw_message (& mut * self_ , < dash_spv_apple_bindings :: custom :: std :: SocketAddr as ferment :: FFIConversionFrom < std :: net :: SocketAddr >> :: ffi_from (from) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message))) , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (message_type)))) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::process_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_process_message (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , from : * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr , message : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_message :: dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage) { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: process_message (& mut * self_ , < dash_spv_apple_bindings :: custom :: std :: SocketAddr as ferment :: FFIConversionFrom < std :: net :: SocketAddr >> :: ffi_from (from) , < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_message :: dash_spv_coinjoin_messages_coinjoin_message_CoinJoinMessage as ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: coinjoin_message :: CoinJoinMessage >> :: ffi_from (message)) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::start_mixing`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_start_mixing (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager) -> bool { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: start_mixing (& mut * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::set_stop_on_nothing_to_do`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_set_stop_on_nothing_to_do (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , stop : bool) { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: set_stop_on_nothing_to_do (& mut * self_ , stop) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::stop_mixing`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_stop_mixing (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager) { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: stop_mixing (& mut * self_) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::do_maintenance`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_do_maintenance (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , balance_info : * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: balance :: dash_spv_coinjoin_models_balance_Balance) { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: do_maintenance (& mut * self_ , < crate :: fermented :: types :: dash_spv_coinjoin :: models :: balance :: dash_spv_coinjoin_models_balance_Balance as ferment :: FFIConversionFrom < dash_spv_coinjoin :: models :: balance :: Balance >> :: ffi_from (balance_info)) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::initiate_shutdown`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_initiate_shutdown (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager) { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: initiate_shutdown (& mut * self_) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::do_automatic_denominating`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_do_automatic_denominating (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , balance_info : * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: balance :: dash_spv_coinjoin_models_balance_Balance , dry_run : bool) -> bool { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: do_automatic_denominating (& mut * self_ , < crate :: fermented :: types :: dash_spv_coinjoin :: models :: balance :: dash_spv_coinjoin_models_balance_Balance as ferment :: FFIConversionFrom < dash_spv_coinjoin :: models :: balance :: Balance >> :: ffi_from (balance_info) , dry_run) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::finish_automatic_denominating`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_finish_automatic_denominating (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , client_session_id : * mut crate :: fermented :: generics :: Arr_u8_32) -> bool { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: finish_automatic_denominating (& mut * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (client_session_id)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::add_used_masternode`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_add_used_masternode (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , pro_tx_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash) { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: add_used_masternode (& mut * self_ , < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: ProTxHash >> :: ffi_from (pro_tx_hash)) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::get_random_not_used_masternode`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_get_random_not_used_masternode (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager) -> * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: get_random_not_used_masternode (& * self_) ; < crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry as ferment :: FFIConversionTo < dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::process_pending_dsa_request`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_process_pending_dsa_request (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager) { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: process_pending_dsa_request (& mut * self_) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::get_sessions_status`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_get_sessions_status (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager) -> * mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: get_sessions_status (& * self_) ; < crate :: fermented :: generics :: Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus as ferment :: FFIConversionTo < Vec < dash_spv_coinjoin :: messages :: pool_status :: PoolStatus > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::is_waiting_for_new_block`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_is_waiting_for_new_block (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager) -> bool { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: is_waiting_for_new_block (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::refresh_unused_keys`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_refresh_unused_keys (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager) { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: refresh_unused_keys (& mut * self_) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::check_if_is_fully_mixed`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_check_if_is_fully_mixed (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , outpoint : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint) -> bool { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: check_if_is_fully_mixed (& mut * self_ , < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_from (outpoint)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::process_ds_queue`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_process_ds_queue (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , from_peer : * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr , message : * mut crate :: fermented :: generics :: Slice_u8) { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: process_ds_queue (& mut * self_ , < dash_spv_apple_bindings :: custom :: std :: SocketAddr as ferment :: FFIConversionFrom < std :: net :: SocketAddr >> :: ffi_from (from_peer) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message)))) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::update_block_tip`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_update_block_tip (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , block_height : u32) { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: update_block_tip (& mut * self_ , block_height) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::is_mixing_fee_tx`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_is_mixing_fee_tx (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , tx_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid) -> bool { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: is_mixing_fee_tx (& * self_ , Box :: leak (Box :: new (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionFrom < dashcore :: hash_types :: Txid >> :: ffi_from (tx_id)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::change_options`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_change_options (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , new_options : * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coinjoin_client_options :: dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: change_options (& mut * self_ , < crate :: fermented :: types :: dash_spv_coinjoin :: models :: coinjoin_client_options :: dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions as ferment :: FFIConversionFrom < dash_spv_coinjoin :: models :: coinjoin_client_options :: CoinJoinClientOptions >> :: ffi_from (new_options)) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::process_used_scripts`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_process_used_scripts (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , scripts : * mut crate :: fermented :: generics :: Vec_Vec_u8) { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: process_used_scripts (& mut * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Vec_Vec_u8 as ferment :: FFIConversionFrom < Vec < Vec < u8 > > >> :: ffi_from (scripts)))) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::get_real_outpoint_coinjoin_rounds`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_get_real_outpoint_coinjoin_rounds (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , outpoint : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint , rounds : i32) -> i32 { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: get_real_outpoint_coinjoin_rounds (& mut * self_ , < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_from (outpoint) , rounds) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::reset_pool`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_reset_pool (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager) { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: reset_pool (& mut * self_) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::stop_and_reset`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_stop_and_reset (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager) { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: stop_and_reset (& mut * self_) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::has_collateral_inputs`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_has_collateral_inputs (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , only_confirmed : bool) -> bool { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: has_collateral_inputs (& * self_ , only_confirmed) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::is_locked_coin`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_is_locked_coin (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , outpoint : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint) -> bool { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: is_locked_coin (& * self_ , Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_from (outpoint)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::lock_outputs`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_lock_outputs (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , tx_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , indices : * mut crate :: fermented :: generics :: Vec_u32) { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: lock_outputs (& mut * self_ , < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionFrom < dashcore :: hash_types :: Txid >> :: ffi_from (tx_hash) , < crate :: fermented :: generics :: Vec_u32 as ferment :: FFIConversionFrom < Vec < u32 > >> :: ffi_from (indices)) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::unlock_outputs`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_unlock_outputs (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , tx : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction) { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: unlock_outputs (& mut * self_ , Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_from (tx)))) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::session_amount`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_session_amount (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager) -> usize { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: session_amount (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::select_coins_grouped_by_addresses`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_select_coins_grouped_by_addresses (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , skip_denominated : bool , anonymizable : bool , skip_unconfirmed : bool , max_outpoints_per_address : i32) -> * mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: select_coins_grouped_by_addresses (& mut * self_ , skip_denominated , anonymizable , skip_unconfirmed , max_outpoints_per_address) ; < crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem as ferment :: FFIConversionTo < Vec < dash_spv_coinjoin :: coin_selection :: compact_tally_item :: CompactTallyItem > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager::get_anonymizable_balance`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_get_anonymizable_balance (self_ : * mut dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager , skip_denominated : bool , skip_unconfirmed : bool) -> u64 { let obj = dash_spv_coinjoin :: coinjoin_client_manager :: CoinJoinClientManager :: get_anonymizable_balance (& mut * self_ , skip_denominated , skip_unconfirmed) ; obj } } pub mod coinjoin_base_session { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`CoinJoinBaseSession`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession { pub entries : * mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry , pub final_mutable_transaction : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction , pub state : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState , pub status : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus , pub time_last_successful_step : u64 , pub session_id : i32 , pub session_denom : u32 } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: coinjoin_base_session :: CoinJoinBaseSession > for dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession) -> dash_spv_coinjoin :: coinjoin_base_session :: CoinJoinBaseSession { let ffi_ref = & * ffi ; dash_spv_coinjoin :: coinjoin_base_session :: CoinJoinBaseSession { entries : < crate :: fermented :: generics :: Vec_dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry as ferment :: FFIConversionFrom < Vec < dash_spv_coinjoin :: messages :: coinjoin_entry :: CoinJoinEntry > >> :: ffi_from (ffi_ref . entries) , final_mutable_transaction : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_from_opt (ffi_ref . final_mutable_transaction) , state : < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState as ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: pool_state :: PoolState >> :: ffi_from (ffi_ref . state) , status : < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus as ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: pool_status :: PoolStatus >> :: ffi_from (ffi_ref . status) , time_last_successful_step : ffi_ref . time_last_successful_step , session_id : ffi_ref . session_id , session_denom : ffi_ref . session_denom } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: coinjoin_base_session :: CoinJoinBaseSession > for dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: coinjoin_base_session :: CoinJoinBaseSession) -> * const dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession { ferment :: boxed (dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession { entries : < crate :: fermented :: generics :: Vec_dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry as ferment :: FFIConversionTo < Vec < dash_spv_coinjoin :: messages :: coinjoin_entry :: CoinJoinEntry > >> :: ffi_to (obj . entries) , final_mutable_transaction : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_to_opt (obj . final_mutable_transaction) , state : < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_state :: PoolState >> :: ffi_to (obj . state) , status : < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_status :: PoolStatus >> :: ffi_to (obj . status) , time_last_successful_step : obj . time_last_successful_step , session_id : obj . session_id , session_denom : obj . session_denom }) } } impl Drop for dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . entries) ; ferment :: unbox_any_opt (ffi_ref . final_mutable_transaction) ; ferment :: unbox_any (ffi_ref . state) ; ferment :: unbox_any (ffi_ref . status) ; ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession_ctor < > (entries : * mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry , final_mutable_transaction : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction , state : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState , status : * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus , time_last_successful_step : u64 , session_id : i32 , session_denom : u32) -> * mut dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession { ferment :: boxed (dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession { entries , final_mutable_transaction , state , status , time_last_successful_step , session_id , session_denom }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession_destroy < > (ffi : * mut dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession_get_entries < > (obj : * const dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession) -> * mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry { (* obj) . entries } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession_get_final_mutable_transaction < > (obj : * const dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction { (* obj) . final_mutable_transaction } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession_get_state < > (obj : * const dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState { (* obj) . state } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession_get_status < > (obj : * const dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus { (* obj) . status } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession_get_time_last_successful_step < > (obj : * const dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession) -> u64 { (* obj) . time_last_successful_step } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession_get_session_id < > (obj : * const dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession) -> i32 { (* obj) . session_id } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession_get_session_denom < > (obj : * const dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession) -> u32 { (* obj) . session_denom } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession_set_entries < > (obj : * const dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession) -> * mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry { (* obj) . entries } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession_set_final_mutable_transaction < > (obj : * const dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction { (* obj) . final_mutable_transaction } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession_set_state < > (obj : * const dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState { (* obj) . state } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession_set_status < > (obj : * const dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus { (* obj) . status } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession_set_time_last_successful_step < > (obj : * const dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession) -> u64 { (* obj) . time_last_successful_step } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession_set_session_id < > (obj : * const dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession) -> i32 { (* obj) . session_id } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession_set_session_denom < > (obj : * const dash_spv_coinjoin_coinjoin_base_session_CoinJoinBaseSession) -> u32 { (* obj) . session_denom } } pub mod wallet_ex { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_coinjoin::wallet_ex::WalletEx::new`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_wallet_ex_WalletEx_new (context : * const std :: os :: raw :: c_void , options : * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coinjoin_client_options :: dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions , get_wallet_transaction : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction , sign_transaction : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction , is_mine_input : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool , available_coins : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin , select_coins : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem , inputs_with_amount : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32 , fresh_coinjoin_address : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_RTRN_String , commit_transaction : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool , is_synced : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_RTRN_bool , is_masternode_or_disconnect_requested : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool , disconnect_masternode : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool , send_message : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool , add_pending_masternode : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool , start_manager_async : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_RTRN_ , get_coinjoin_keys : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String) -> * mut dash_spv_coinjoin :: wallet_ex :: WalletEx { let obj = dash_spv_coinjoin :: wallet_ex :: WalletEx :: new (context , < crate :: fermented :: types :: dash_spv_coinjoin :: models :: coinjoin_client_options :: dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions as ferment :: FFIConversionFrom < dash_spv_coinjoin :: models :: coinjoin_client_options :: CoinJoinClientOptions >> :: ffi_from (options) , move | o_0 , o_1 | unsafe { get_wallet_transaction . call (o_0 , o_1) } , move | o_0 , o_1 , o_2 | unsafe { sign_transaction . call (o_0 , o_1 , o_2) } , move | o_0 , o_1 | unsafe { is_mine_input . call (o_0 , o_1) } , move | o_0 , o_1 , o_2 , o_3 | unsafe { available_coins . call (o_0 , o_1 , o_2 , o_3) } , move | o_0 , o_1 , o_2 , o_3 , o_4 , o_5 | unsafe { select_coins . call (o_0 , o_1 , o_2 , o_3 , o_4 , o_5) } , move | o_0 , o_1 | unsafe { inputs_with_amount . call (o_0 , o_1) } , move | o_0 , o_1 | unsafe { fresh_coinjoin_address . call (o_0 , o_1) } , move | o_0 , o_1 , o_2 , o_3 , o_4 | unsafe { commit_transaction . call (o_0 , o_1 , o_2 , o_3 , o_4) } , move | o_0 | unsafe { is_synced . call (o_0) } , move | o_0 , o_1 | unsafe { is_masternode_or_disconnect_requested . call (o_0 , o_1) } , move | o_0 , o_1 | unsafe { disconnect_masternode . call (o_0 , o_1) } , move | o_0 , o_1 , o_2 , o_3 , o_4 | unsafe { send_message . call (o_0 , o_1 , o_2 , o_3 , o_4) } , move | o_0 , o_1 , o_2 | unsafe { add_pending_masternode . call (o_0 , o_1 , o_2) } , move | o_0 | unsafe { start_manager_async . call (o_0) } , move | o_0 , o_1 | unsafe { get_coinjoin_keys . call (o_0 , o_1) }) ; ferment :: boxed (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::wallet_ex::WalletEx::lock_coin`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_wallet_ex_WalletEx_lock_coin (self_ : * mut dash_spv_coinjoin :: wallet_ex :: WalletEx , outpoint : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint) { let obj = dash_spv_coinjoin :: wallet_ex :: WalletEx :: lock_coin (& mut * self_ , < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_from (outpoint)) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::wallet_ex::WalletEx::unlock_coin`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_wallet_ex_WalletEx_unlock_coin (self_ : * mut dash_spv_coinjoin :: wallet_ex :: WalletEx , outpoint : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint) { let obj = dash_spv_coinjoin :: wallet_ex :: WalletEx :: unlock_coin (& mut * self_ , Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_from (outpoint)))) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::wallet_ex::WalletEx::is_locked_coin`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_wallet_ex_WalletEx_is_locked_coin (self_ : * mut dash_spv_coinjoin :: wallet_ex :: WalletEx , outpoint : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint) -> bool { let obj = dash_spv_coinjoin :: wallet_ex :: WalletEx :: is_locked_coin (& * self_ , Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_from (outpoint)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::wallet_ex::WalletEx::check_if_is_fully_mixed`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_wallet_ex_WalletEx_check_if_is_fully_mixed (self_ : * mut dash_spv_coinjoin :: wallet_ex :: WalletEx , outpoint : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint) -> bool { let obj = dash_spv_coinjoin :: wallet_ex :: WalletEx :: check_if_is_fully_mixed (& mut * self_ , < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_from (outpoint)) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::wallet_ex::WalletEx::get_real_outpoint_coinjoin_rounds`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_wallet_ex_WalletEx_get_real_outpoint_coinjoin_rounds (self_ : * mut dash_spv_coinjoin :: wallet_ex :: WalletEx , outpoint : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint , rounds : i32) -> i32 { let obj = dash_spv_coinjoin :: wallet_ex :: WalletEx :: get_real_outpoint_coinjoin_rounds (& mut * self_ , < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_from (outpoint) , rounds) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::wallet_ex::WalletEx::has_collateral_inputs`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_wallet_ex_WalletEx_has_collateral_inputs (self_ : * mut dash_spv_coinjoin :: wallet_ex :: WalletEx , only_confirmed : bool) -> bool { let obj = dash_spv_coinjoin :: wallet_ex :: WalletEx :: has_collateral_inputs (& * self_ , only_confirmed) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::wallet_ex::WalletEx::select_coins_grouped_by_addresses`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_wallet_ex_WalletEx_select_coins_grouped_by_addresses (self_ : * mut dash_spv_coinjoin :: wallet_ex :: WalletEx , skip_denominated : bool , anonymizable : bool , skip_unconfirmed : bool , max_outpoints_per_address : i32) -> * mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { let obj = dash_spv_coinjoin :: wallet_ex :: WalletEx :: select_coins_grouped_by_addresses (& mut * self_ , skip_denominated , anonymizable , skip_unconfirmed , max_outpoints_per_address) ; < crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem as ferment :: FFIConversionTo < Vec < dash_spv_coinjoin :: coin_selection :: compact_tally_item :: CompactTallyItem > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::wallet_ex::WalletEx::get_anonymizable_balance`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_wallet_ex_WalletEx_get_anonymizable_balance (self_ : * mut dash_spv_coinjoin :: wallet_ex :: WalletEx , skip_denominated : bool , skip_unconfirmed : bool) -> u64 { let obj = dash_spv_coinjoin :: wallet_ex :: WalletEx :: get_anonymizable_balance (& mut * self_ , skip_denominated , skip_unconfirmed) ; obj } # [doc = "FFI-representation of the [`dash_spv_coinjoin::wallet_ex::WalletEx::get_unused_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_wallet_ex_WalletEx_get_unused_key (self_ : * mut dash_spv_coinjoin :: wallet_ex :: WalletEx , internal : bool) -> * mut dash_spv_coinjoin :: models :: tx_destination :: TxDestination { let obj = dash_spv_coinjoin :: wallet_ex :: WalletEx :: get_unused_key (& mut * self_ , internal) ; ferment :: boxed (obj) } # [doc = "FFI-representation of the [`dash_spv_coinjoin::wallet_ex::WalletEx::add_unused_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_wallet_ex_WalletEx_add_unused_key (self_ : * mut dash_spv_coinjoin :: wallet_ex :: WalletEx , destination : * mut crate :: fermented :: generics :: Vec_u8) { let obj = dash_spv_coinjoin :: wallet_ex :: WalletEx :: add_unused_key (& mut * self_ , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (destination)) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::wallet_ex::WalletEx::refresh_unused_keys`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_wallet_ex_WalletEx_refresh_unused_keys (self_ : * mut dash_spv_coinjoin :: wallet_ex :: WalletEx) { let obj = dash_spv_coinjoin :: wallet_ex :: WalletEx :: refresh_unused_keys (& mut * self_) ; ; } # [doc = "FFI-representation of the [`dash_spv_coinjoin::wallet_ex::WalletEx::process_used_scripts`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_wallet_ex_WalletEx_process_used_scripts (self_ : * mut dash_spv_coinjoin :: wallet_ex :: WalletEx , scripts : * mut crate :: fermented :: generics :: Vec_Vec_u8) { let obj = dash_spv_coinjoin :: wallet_ex :: WalletEx :: process_used_scripts (& mut * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Vec_Vec_u8 as ferment :: FFIConversionFrom < Vec < Vec < u8 > > >> :: ffi_from (scripts)))) ; ; } } pub mod coin_selection { use crate as dash_spv_apple_bindings ; pub mod input_coin { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InputCoin`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_coinjoin_coin_selection_input_coin_InputCoin { pub tx_outpoint : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint , pub output : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: txout :: dashcore_blockdata_transaction_txout_TxOut , pub effective_value : u64 } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: coin_selection :: input_coin :: InputCoin > for dash_spv_coinjoin_coin_selection_input_coin_InputCoin { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_coin_selection_input_coin_InputCoin) -> dash_spv_coinjoin :: coin_selection :: input_coin :: InputCoin { let ffi_ref = & * ffi ; dash_spv_coinjoin :: coin_selection :: input_coin :: InputCoin { tx_outpoint : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_from (ffi_ref . tx_outpoint) , output : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: txout :: dashcore_blockdata_transaction_txout_TxOut as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: txout :: TxOut >> :: ffi_from (ffi_ref . output) , effective_value : ffi_ref . effective_value } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: coin_selection :: input_coin :: InputCoin > for dash_spv_coinjoin_coin_selection_input_coin_InputCoin { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: coin_selection :: input_coin :: InputCoin) -> * const dash_spv_coinjoin_coin_selection_input_coin_InputCoin { ferment :: boxed (dash_spv_coinjoin_coin_selection_input_coin_InputCoin { tx_outpoint : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_to (obj . tx_outpoint) , output : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: txout :: dashcore_blockdata_transaction_txout_TxOut as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: txout :: TxOut >> :: ffi_to (obj . output) , effective_value : obj . effective_value }) } } impl Drop for dash_spv_coinjoin_coin_selection_input_coin_InputCoin { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . tx_outpoint) ; ferment :: unbox_any (ffi_ref . output) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coin_selection_input_coin_InputCoin_ctor < > (tx_outpoint : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint , output : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: txout :: dashcore_blockdata_transaction_txout_TxOut , effective_value : u64) -> * mut dash_spv_coinjoin_coin_selection_input_coin_InputCoin { ferment :: boxed (dash_spv_coinjoin_coin_selection_input_coin_InputCoin { tx_outpoint , output , effective_value }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coin_selection_input_coin_InputCoin_destroy < > (ffi : * mut dash_spv_coinjoin_coin_selection_input_coin_InputCoin) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coin_selection_input_coin_InputCoin_get_tx_outpoint < > (obj : * const dash_spv_coinjoin_coin_selection_input_coin_InputCoin) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint { (* obj) . tx_outpoint } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coin_selection_input_coin_InputCoin_get_output < > (obj : * const dash_spv_coinjoin_coin_selection_input_coin_InputCoin) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: txout :: dashcore_blockdata_transaction_txout_TxOut { (* obj) . output } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coin_selection_input_coin_InputCoin_get_effective_value < > (obj : * const dash_spv_coinjoin_coin_selection_input_coin_InputCoin) -> u64 { (* obj) . effective_value } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coin_selection_input_coin_InputCoin_set_tx_outpoint < > (obj : * const dash_spv_coinjoin_coin_selection_input_coin_InputCoin) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint { (* obj) . tx_outpoint } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coin_selection_input_coin_InputCoin_set_output < > (obj : * const dash_spv_coinjoin_coin_selection_input_coin_InputCoin) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: txout :: dashcore_blockdata_transaction_txout_TxOut { (* obj) . output } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coin_selection_input_coin_InputCoin_set_effective_value < > (obj : * const dash_spv_coinjoin_coin_selection_input_coin_InputCoin) -> u64 { (* obj) . effective_value } } pub mod compact_tally_item { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`CompactTallyItem`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { pub tx_destination : * mut crate :: fermented :: generics :: Vec_u8 , pub amount : u64 , pub input_coins : * mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin } impl ferment :: FFIConversionFrom < dash_spv_coinjoin :: coin_selection :: compact_tally_item :: CompactTallyItem > for dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { unsafe fn ffi_from_const (ffi : * const dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem) -> dash_spv_coinjoin :: coin_selection :: compact_tally_item :: CompactTallyItem { let ffi_ref = & * ffi ; dash_spv_coinjoin :: coin_selection :: compact_tally_item :: CompactTallyItem { tx_destination : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from_opt (ffi_ref . tx_destination) , amount : ffi_ref . amount , input_coins : < crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin as ferment :: FFIConversionFrom < Vec < dash_spv_coinjoin :: coin_selection :: input_coin :: InputCoin > >> :: ffi_from (ffi_ref . input_coins) } } } impl ferment :: FFIConversionTo < dash_spv_coinjoin :: coin_selection :: compact_tally_item :: CompactTallyItem > for dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { unsafe fn ffi_to_const (obj : dash_spv_coinjoin :: coin_selection :: compact_tally_item :: CompactTallyItem) -> * const dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { ferment :: boxed (dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { tx_destination : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to_opt (obj . tx_destination) , amount : obj . amount , input_coins : < crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin as ferment :: FFIConversionTo < Vec < dash_spv_coinjoin :: coin_selection :: input_coin :: InputCoin > >> :: ffi_to (obj . input_coins) }) } } impl Drop for dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any_opt (ffi_ref . tx_destination) ; ; ferment :: unbox_any (ffi_ref . input_coins) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem_ctor < > (tx_destination : * mut crate :: fermented :: generics :: Vec_u8 , amount : u64 , input_coins : * mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin) -> * mut dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { ferment :: boxed (dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { tx_destination , amount , input_coins }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem_destroy < > (ffi : * mut dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem_get_tx_destination < > (obj : * const dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . tx_destination } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem_get_amount < > (obj : * const dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem) -> u64 { (* obj) . amount } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem_get_input_coins < > (obj : * const dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem) -> * mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { (* obj) . input_coins } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem_set_tx_destination < > (obj : * const dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . tx_destination } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem_set_amount < > (obj : * const dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem) -> u64 { (* obj) . amount } # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem_set_input_coins < > (obj : * const dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem) -> * mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { (* obj) . input_coins } # [doc = "FFI-representation of the [`dash_spv_coinjoin::coin_selection::compact_tally_item::CompactTallyItem::new`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem_new (tx_destination : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: types :: dash_spv_coinjoin :: coin_selection :: compact_tally_item :: dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { let obj = dash_spv_coinjoin :: coin_selection :: compact_tally_item :: CompactTallyItem :: new (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from_opt (tx_destination)) ; < crate :: fermented :: types :: dash_spv_coinjoin :: coin_selection :: compact_tally_item :: dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem as ferment :: FFIConversionTo < dash_spv_coinjoin :: coin_selection :: compact_tally_item :: CompactTallyItem >> :: ffi_to (obj) } } } } pub mod platform_value { use crate as dash_spv_apple_bindings ; pub mod value_map { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ValueMap`]"] # [repr (C)] # [derive (Clone)] pub struct platform_value_value_map_ValueMap (* mut crate :: fermented :: generics :: Vec_Tuple_platform_value_Value_platform_value_Value) ; impl ferment :: FFIConversionFrom < platform_value :: value_map :: ValueMap > for platform_value_value_map_ValueMap { unsafe fn ffi_from_const (ffi : * const platform_value_value_map_ValueMap) -> platform_value :: value_map :: ValueMap { let ffi_ref = & * ffi ; < crate :: fermented :: generics :: Vec_Tuple_platform_value_Value_platform_value_Value as ferment :: FFIConversionFrom < Vec < (platform_value :: Value , platform_value :: Value) > >> :: ffi_from (ffi_ref . 0) } } impl ferment :: FFIConversionTo < platform_value :: value_map :: ValueMap > for platform_value_value_map_ValueMap { unsafe fn ffi_to_const (obj : platform_value :: value_map :: ValueMap) -> * const platform_value_value_map_ValueMap { ferment :: boxed (platform_value_value_map_ValueMap (< crate :: fermented :: generics :: Vec_Tuple_platform_value_Value_platform_value_Value as ferment :: FFIConversionTo < Vec < (platform_value :: Value , platform_value :: Value) > >> :: ffi_to (obj))) } } impl Drop for platform_value_value_map_ValueMap { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn platform_value_value_map_ValueMap_ctor < > (o_0 : * mut crate :: fermented :: generics :: Vec_Tuple_platform_value_Value_platform_value_Value) -> * mut platform_value_value_map_ValueMap { ferment :: boxed (platform_value_value_map_ValueMap (o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_value_map_ValueMap_destroy < > (ffi : * mut platform_value_value_map_ValueMap) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn platform_value_value_map_ValueMap_get_0 < > (obj : * const platform_value_value_map_ValueMap) -> * mut crate :: fermented :: generics :: Vec_Tuple_platform_value_Value_platform_value_Value { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn platform_value_value_map_ValueMap_set_0 < > (obj : * const platform_value_value_map_ValueMap) -> * mut crate :: fermented :: generics :: Vec_Tuple_platform_value_Value_platform_value_Value { (* obj) . 0 } } pub mod value_serialization { use crate as dash_spv_apple_bindings ; } pub mod inner_value_at_path { use crate as dash_spv_apple_bindings ; # [cfg (test)] pub mod tests { use crate as dash_spv_apple_bindings ; } } pub mod index { use crate as dash_spv_apple_bindings ; } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`Value`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum platform_value_Value { U128 (* mut [u8 ; 16]) , I128 (* mut [u8 ; 16]) , U64 (u64) , I64 (i64) , U32 (u32) , I32 (i32) , U16 (u16) , I16 (i16) , U8 (u8) , I8 (i8) , Bytes (* mut crate :: fermented :: generics :: Vec_u8) , Bytes20 (* mut crate :: fermented :: generics :: Arr_u8_20) , Bytes32 (* mut crate :: fermented :: generics :: Arr_u8_32) , Bytes36 (* mut crate :: fermented :: generics :: Arr_u8_36) , EnumU8 (* mut crate :: fermented :: generics :: Vec_u8) , EnumString (* mut crate :: fermented :: generics :: Vec_String) , Identifier (* mut crate :: fermented :: types :: platform_value :: platform_value_Hash256) , Float (f64) , Text (* mut std :: os :: raw :: c_char) , Bool (bool) , Null , Array (* mut crate :: fermented :: generics :: Vec_platform_value_Value) , Map (* mut crate :: fermented :: types :: platform_value :: value_map :: platform_value_value_map_ValueMap) } impl ferment :: FFIConversionFrom < platform_value :: Value > for platform_value_Value { unsafe fn ffi_from_const (ffi : * const platform_value_Value) -> platform_value :: Value { let ffi_ref = & * ffi ; match ffi_ref { platform_value_Value :: U128 (o_0) => platform_value :: Value :: U128 (< [u8 ; 16] as ferment :: FFIConversionFrom < u128 >> :: ffi_from (* o_0)) , platform_value_Value :: I128 (o_0) => platform_value :: Value :: I128 (< [u8 ; 16] as ferment :: FFIConversionFrom < i128 >> :: ffi_from (* o_0)) , platform_value_Value :: U64 (o_0) => platform_value :: Value :: U64 (* o_0) , platform_value_Value :: I64 (o_0) => platform_value :: Value :: I64 (* o_0) , platform_value_Value :: U32 (o_0) => platform_value :: Value :: U32 (* o_0) , platform_value_Value :: I32 (o_0) => platform_value :: Value :: I32 (* o_0) , platform_value_Value :: U16 (o_0) => platform_value :: Value :: U16 (* o_0) , platform_value_Value :: I16 (o_0) => platform_value :: Value :: I16 (* o_0) , platform_value_Value :: U8 (o_0) => platform_value :: Value :: U8 (* o_0) , platform_value_Value :: I8 (o_0) => platform_value :: Value :: I8 (* o_0) , platform_value_Value :: Bytes (o_0) => platform_value :: Value :: Bytes (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (* o_0)) , platform_value_Value :: Bytes20 (o_0) => platform_value :: Value :: Bytes20 (< crate :: fermented :: generics :: Arr_u8_20 as ferment :: FFIConversionFrom < [u8 ; 20] >> :: ffi_from (* o_0)) , platform_value_Value :: Bytes32 (o_0) => platform_value :: Value :: Bytes32 (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (* o_0)) , platform_value_Value :: Bytes36 (o_0) => platform_value :: Value :: Bytes36 (< crate :: fermented :: generics :: Arr_u8_36 as ferment :: FFIConversionFrom < [u8 ; 36] >> :: ffi_from (* o_0)) , platform_value_Value :: EnumU8 (o_0) => platform_value :: Value :: EnumU8 (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (* o_0)) , platform_value_Value :: EnumString (o_0) => platform_value :: Value :: EnumString (< crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionFrom < Vec < String > >> :: ffi_from (* o_0)) , platform_value_Value :: Identifier (o_0) => platform_value :: Value :: Identifier (< crate :: fermented :: types :: platform_value :: platform_value_Hash256 as ferment :: FFIConversionFrom < platform_value :: Hash256 >> :: ffi_from (* o_0)) , platform_value_Value :: Float (o_0) => platform_value :: Value :: Float (* o_0) , platform_value_Value :: Text (o_0) => platform_value :: Value :: Text (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , platform_value_Value :: Bool (o_0) => platform_value :: Value :: Bool (* o_0) , platform_value_Value :: Null => platform_value :: Value :: Null , platform_value_Value :: Array (o_0) => platform_value :: Value :: Array (< crate :: fermented :: generics :: Vec_platform_value_Value as ferment :: FFIConversionFrom < Vec < platform_value :: Value > >> :: ffi_from (* o_0)) , platform_value_Value :: Map (o_0) => platform_value :: Value :: Map (< crate :: fermented :: types :: platform_value :: value_map :: platform_value_value_map_ValueMap as ferment :: FFIConversionFrom < platform_value :: value_map :: ValueMap >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < platform_value :: Value > for platform_value_Value { unsafe fn ffi_to_const (obj : platform_value :: Value) -> * const platform_value_Value { ferment :: boxed (match obj { platform_value :: Value :: U128 (o_0) => platform_value_Value :: U128 (< [u8 ; 16] as ferment :: FFIConversionTo < u128 >> :: ffi_to (o_0)) , platform_value :: Value :: I128 (o_0) => platform_value_Value :: I128 (< [u8 ; 16] as ferment :: FFIConversionTo < i128 >> :: ffi_to (o_0)) , platform_value :: Value :: U64 (o_0) => platform_value_Value :: U64 (o_0) , platform_value :: Value :: I64 (o_0) => platform_value_Value :: I64 (o_0) , platform_value :: Value :: U32 (o_0) => platform_value_Value :: U32 (o_0) , platform_value :: Value :: I32 (o_0) => platform_value_Value :: I32 (o_0) , platform_value :: Value :: U16 (o_0) => platform_value_Value :: U16 (o_0) , platform_value :: Value :: I16 (o_0) => platform_value_Value :: I16 (o_0) , platform_value :: Value :: U8 (o_0) => platform_value_Value :: U8 (o_0) , platform_value :: Value :: I8 (o_0) => platform_value_Value :: I8 (o_0) , platform_value :: Value :: Bytes (o_0) => platform_value_Value :: Bytes (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (o_0)) , platform_value :: Value :: Bytes20 (o_0) => platform_value_Value :: Bytes20 (< crate :: fermented :: generics :: Arr_u8_20 as ferment :: FFIConversionTo < [u8 ; 20] >> :: ffi_to (o_0)) , platform_value :: Value :: Bytes32 (o_0) => platform_value_Value :: Bytes32 (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (o_0)) , platform_value :: Value :: Bytes36 (o_0) => platform_value_Value :: Bytes36 (< crate :: fermented :: generics :: Arr_u8_36 as ferment :: FFIConversionTo < [u8 ; 36] >> :: ffi_to (o_0)) , platform_value :: Value :: EnumU8 (o_0) => platform_value_Value :: EnumU8 (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (o_0)) , platform_value :: Value :: EnumString (o_0) => platform_value_Value :: EnumString (< crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionTo < Vec < String > >> :: ffi_to (o_0)) , platform_value :: Value :: Identifier (o_0) => platform_value_Value :: Identifier (< crate :: fermented :: types :: platform_value :: platform_value_Hash256 as ferment :: FFIConversionTo < platform_value :: Hash256 >> :: ffi_to (o_0)) , platform_value :: Value :: Float (o_0) => platform_value_Value :: Float (o_0) , platform_value :: Value :: Text (o_0) => platform_value_Value :: Text (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , platform_value :: Value :: Bool (o_0) => platform_value_Value :: Bool (o_0) , platform_value :: Value :: Null => platform_value_Value :: Null , platform_value :: Value :: Array (o_0) => platform_value_Value :: Array (< crate :: fermented :: generics :: Vec_platform_value_Value as ferment :: FFIConversionTo < Vec < platform_value :: Value > >> :: ffi_to (o_0)) , platform_value :: Value :: Map (o_0) => platform_value_Value :: Map (< crate :: fermented :: types :: platform_value :: value_map :: platform_value_value_map_ValueMap as ferment :: FFIConversionTo < platform_value :: value_map :: ValueMap >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for platform_value_Value { fn drop (& mut self) { unsafe { match self { platform_value_Value :: U128 (o_0) => { ferment :: unbox_any_opt (* o_0) ; } , platform_value_Value :: I128 (o_0) => { ferment :: unbox_any_opt (* o_0) ; } , platform_value_Value :: U64 (o_0) => { ; } , platform_value_Value :: I64 (o_0) => { ; } , platform_value_Value :: U32 (o_0) => { ; } , platform_value_Value :: I32 (o_0) => { ; } , platform_value_Value :: U16 (o_0) => { ; } , platform_value_Value :: I16 (o_0) => { ; } , platform_value_Value :: U8 (o_0) => { ; } , platform_value_Value :: I8 (o_0) => { ; } , platform_value_Value :: Bytes (o_0) => { ferment :: unbox_any (* o_0) ; } , platform_value_Value :: Bytes20 (o_0) => { ferment :: unbox_any (* o_0) ; } , platform_value_Value :: Bytes32 (o_0) => { ferment :: unbox_any (* o_0) ; } , platform_value_Value :: Bytes36 (o_0) => { ferment :: unbox_any (* o_0) ; } , platform_value_Value :: EnumU8 (o_0) => { ferment :: unbox_any (* o_0) ; } , platform_value_Value :: EnumString (o_0) => { ferment :: unbox_any (* o_0) ; } , platform_value_Value :: Identifier (o_0) => { ferment :: unbox_any (* o_0) ; } , platform_value_Value :: Float (o_0) => { ; } , platform_value_Value :: Text (o_0) => { ferment :: unbox_string (* o_0) ; } , platform_value_Value :: Bool (o_0) => { ; } , platform_value_Value :: Null => { } , platform_value_Value :: Array (o_0) => { ferment :: unbox_any (* o_0) ; } , platform_value_Value :: Map (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_U128_ctor (o_o_0 : * mut [u8 ; 16]) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: U128 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_I128_ctor (o_o_0 : * mut [u8 ; 16]) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: I128 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_U64_ctor (o_o_0 : u64) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: U64 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_I64_ctor (o_o_0 : i64) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: I64 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_U32_ctor (o_o_0 : u32) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: U32 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_I32_ctor (o_o_0 : i32) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: I32 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_U16_ctor (o_o_0 : u16) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: U16 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_I16_ctor (o_o_0 : i16) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: I16 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_U8_ctor (o_o_0 : u8) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: U8 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_I8_ctor (o_o_0 : i8) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: I8 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_Bytes_ctor (o_o_0 : * mut crate :: fermented :: generics :: Vec_u8) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: Bytes (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_Bytes20_ctor (o_o_0 : * mut crate :: fermented :: generics :: Arr_u8_20) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: Bytes20 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_Bytes32_ctor (o_o_0 : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: Bytes32 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_Bytes36_ctor (o_o_0 : * mut crate :: fermented :: generics :: Arr_u8_36) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: Bytes36 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_EnumU8_ctor (o_o_0 : * mut crate :: fermented :: generics :: Vec_u8) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: EnumU8 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_EnumString_ctor (o_o_0 : * mut crate :: fermented :: generics :: Vec_String) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: EnumString (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_Identifier_ctor (o_o_0 : * mut crate :: fermented :: types :: platform_value :: platform_value_Hash256) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: Identifier (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_Float_ctor (o_o_0 : f64) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: Float (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_Text_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: Text (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_Bool_ctor (o_o_0 : bool) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: Bool (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_Null_ctor () -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: Null { }) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_Array_ctor (o_o_0 : * mut crate :: fermented :: generics :: Vec_platform_value_Value) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: Array (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_Map_ctor (o_o_0 : * mut crate :: fermented :: types :: platform_value :: value_map :: platform_value_value_map_ValueMap) -> * mut platform_value_Value { ferment :: boxed (platform_value_Value :: Map (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Value_destroy < > (ffi : * mut platform_value_Value) { ferment :: unbox_any (ffi) ; } pub mod error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`Error`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum platform_value_error_Error { Unsupported (* mut std :: os :: raw :: c_char) , StructureError (* mut std :: os :: raw :: c_char) , PathError (* mut std :: os :: raw :: c_char) , IntegerSizeError , IntegerParsingError , StringDecodingError (* mut std :: os :: raw :: c_char) , KeyMustBeAString , ByteLengthNot20BytesError (* mut std :: os :: raw :: c_char) , ByteLengthNot32BytesError (* mut std :: os :: raw :: c_char) , ByteLengthNot36BytesError (* mut std :: os :: raw :: c_char) , SerdeSerializationError (* mut std :: os :: raw :: c_char) , SerdeDeserializationError (* mut std :: os :: raw :: c_char) , CborSerializationError (* mut std :: os :: raw :: c_char) } impl ferment :: FFIConversionFrom < platform_value :: error :: Error > for platform_value_error_Error { unsafe fn ffi_from_const (ffi : * const platform_value_error_Error) -> platform_value :: error :: Error { let ffi_ref = & * ffi ; match ffi_ref { platform_value_error_Error :: Unsupported (o_0) => platform_value :: error :: Error :: Unsupported (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , platform_value_error_Error :: StructureError (o_0) => platform_value :: error :: Error :: StructureError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , platform_value_error_Error :: PathError (o_0) => platform_value :: error :: Error :: PathError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , platform_value_error_Error :: IntegerSizeError => platform_value :: error :: Error :: IntegerSizeError , platform_value_error_Error :: IntegerParsingError => platform_value :: error :: Error :: IntegerParsingError , platform_value_error_Error :: StringDecodingError (o_0) => platform_value :: error :: Error :: StringDecodingError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , platform_value_error_Error :: KeyMustBeAString => platform_value :: error :: Error :: KeyMustBeAString , platform_value_error_Error :: ByteLengthNot20BytesError (o_0) => platform_value :: error :: Error :: ByteLengthNot20BytesError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , platform_value_error_Error :: ByteLengthNot32BytesError (o_0) => platform_value :: error :: Error :: ByteLengthNot32BytesError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , platform_value_error_Error :: ByteLengthNot36BytesError (o_0) => platform_value :: error :: Error :: ByteLengthNot36BytesError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , platform_value_error_Error :: SerdeSerializationError (o_0) => platform_value :: error :: Error :: SerdeSerializationError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , platform_value_error_Error :: SerdeDeserializationError (o_0) => platform_value :: error :: Error :: SerdeDeserializationError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , platform_value_error_Error :: CborSerializationError (o_0) => platform_value :: error :: Error :: CborSerializationError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < platform_value :: error :: Error > for platform_value_error_Error { unsafe fn ffi_to_const (obj : platform_value :: error :: Error) -> * const platform_value_error_Error { ferment :: boxed (match obj { platform_value :: error :: Error :: Unsupported (o_0) => platform_value_error_Error :: Unsupported (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , platform_value :: error :: Error :: StructureError (o_0) => platform_value_error_Error :: StructureError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , platform_value :: error :: Error :: PathError (o_0) => platform_value_error_Error :: PathError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , platform_value :: error :: Error :: IntegerSizeError => platform_value_error_Error :: IntegerSizeError , platform_value :: error :: Error :: IntegerParsingError => platform_value_error_Error :: IntegerParsingError , platform_value :: error :: Error :: StringDecodingError (o_0) => platform_value_error_Error :: StringDecodingError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , platform_value :: error :: Error :: KeyMustBeAString => platform_value_error_Error :: KeyMustBeAString , platform_value :: error :: Error :: ByteLengthNot20BytesError (o_0) => platform_value_error_Error :: ByteLengthNot20BytesError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , platform_value :: error :: Error :: ByteLengthNot32BytesError (o_0) => platform_value_error_Error :: ByteLengthNot32BytesError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , platform_value :: error :: Error :: ByteLengthNot36BytesError (o_0) => platform_value_error_Error :: ByteLengthNot36BytesError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , platform_value :: error :: Error :: SerdeSerializationError (o_0) => platform_value_error_Error :: SerdeSerializationError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , platform_value :: error :: Error :: SerdeDeserializationError (o_0) => platform_value_error_Error :: SerdeDeserializationError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , platform_value :: error :: Error :: CborSerializationError (o_0) => platform_value_error_Error :: CborSerializationError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for platform_value_error_Error { fn drop (& mut self) { unsafe { match self { platform_value_error_Error :: Unsupported (o_0) => { ferment :: unbox_string (* o_0) ; } , platform_value_error_Error :: StructureError (o_0) => { ferment :: unbox_string (* o_0) ; } , platform_value_error_Error :: PathError (o_0) => { ferment :: unbox_string (* o_0) ; } , platform_value_error_Error :: IntegerSizeError => { } , platform_value_error_Error :: IntegerParsingError => { } , platform_value_error_Error :: StringDecodingError (o_0) => { ferment :: unbox_string (* o_0) ; } , platform_value_error_Error :: KeyMustBeAString => { } , platform_value_error_Error :: ByteLengthNot20BytesError (o_0) => { ferment :: unbox_string (* o_0) ; } , platform_value_error_Error :: ByteLengthNot32BytesError (o_0) => { ferment :: unbox_string (* o_0) ; } , platform_value_error_Error :: ByteLengthNot36BytesError (o_0) => { ferment :: unbox_string (* o_0) ; } , platform_value_error_Error :: SerdeSerializationError (o_0) => { ferment :: unbox_string (* o_0) ; } , platform_value_error_Error :: SerdeDeserializationError (o_0) => { ferment :: unbox_string (* o_0) ; } , platform_value_error_Error :: CborSerializationError (o_0) => { ferment :: unbox_string (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn platform_value_error_Error_Unsupported_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut platform_value_error_Error { ferment :: boxed (platform_value_error_Error :: Unsupported (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_error_Error_StructureError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut platform_value_error_Error { ferment :: boxed (platform_value_error_Error :: StructureError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_error_Error_PathError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut platform_value_error_Error { ferment :: boxed (platform_value_error_Error :: PathError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_error_Error_IntegerSizeError_ctor () -> * mut platform_value_error_Error { ferment :: boxed (platform_value_error_Error :: IntegerSizeError { }) } # [no_mangle] pub unsafe extern "C" fn platform_value_error_Error_IntegerParsingError_ctor () -> * mut platform_value_error_Error { ferment :: boxed (platform_value_error_Error :: IntegerParsingError { }) } # [no_mangle] pub unsafe extern "C" fn platform_value_error_Error_StringDecodingError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut platform_value_error_Error { ferment :: boxed (platform_value_error_Error :: StringDecodingError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_error_Error_KeyMustBeAString_ctor () -> * mut platform_value_error_Error { ferment :: boxed (platform_value_error_Error :: KeyMustBeAString { }) } # [no_mangle] pub unsafe extern "C" fn platform_value_error_Error_ByteLengthNot20BytesError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut platform_value_error_Error { ferment :: boxed (platform_value_error_Error :: ByteLengthNot20BytesError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_error_Error_ByteLengthNot32BytesError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut platform_value_error_Error { ferment :: boxed (platform_value_error_Error :: ByteLengthNot32BytesError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_error_Error_ByteLengthNot36BytesError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut platform_value_error_Error { ferment :: boxed (platform_value_error_Error :: ByteLengthNot36BytesError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_error_Error_SerdeSerializationError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut platform_value_error_Error { ferment :: boxed (platform_value_error_Error :: SerdeSerializationError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_error_Error_SerdeDeserializationError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut platform_value_error_Error { ferment :: boxed (platform_value_error_Error :: SerdeDeserializationError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_error_Error_CborSerializationError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut platform_value_error_Error { ferment :: boxed (platform_value_error_Error :: CborSerializationError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_error_Error_destroy < > (ffi : * mut platform_value_error_Error) { ferment :: unbox_any (ffi) ; } } pub mod macros { use crate as dash_spv_apple_bindings ; } pub mod types { use crate as dash_spv_apple_bindings ; pub mod identifier { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentifierBytes32`]"] # [repr (C)] # [derive (Clone)] pub struct platform_value_types_identifier_IdentifierBytes32 (* mut crate :: fermented :: generics :: Arr_u8_32) ; impl ferment :: FFIConversionFrom < platform_value :: types :: identifier :: IdentifierBytes32 > for platform_value_types_identifier_IdentifierBytes32 { unsafe fn ffi_from_const (ffi : * const platform_value_types_identifier_IdentifierBytes32) -> platform_value :: types :: identifier :: IdentifierBytes32 { let ffi_ref = & * ffi ; platform_value :: types :: identifier :: IdentifierBytes32 (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (ffi_ref . 0)) } } impl ferment :: FFIConversionTo < platform_value :: types :: identifier :: IdentifierBytes32 > for platform_value_types_identifier_IdentifierBytes32 { unsafe fn ffi_to_const (obj : platform_value :: types :: identifier :: IdentifierBytes32) -> * const platform_value_types_identifier_IdentifierBytes32 { ferment :: boxed (platform_value_types_identifier_IdentifierBytes32 (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj . 0))) } } impl Drop for platform_value_types_identifier_IdentifierBytes32 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn platform_value_types_identifier_IdentifierBytes32_ctor < > (o_0 : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut platform_value_types_identifier_IdentifierBytes32 { ferment :: boxed (platform_value_types_identifier_IdentifierBytes32 (o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_types_identifier_IdentifierBytes32_destroy < > (ffi : * mut platform_value_types_identifier_IdentifierBytes32) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn platform_value_types_identifier_IdentifierBytes32_get_0 < > (obj : * const platform_value_types_identifier_IdentifierBytes32) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn platform_value_types_identifier_IdentifierBytes32_set_0 < > (obj : * const platform_value_types_identifier_IdentifierBytes32) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . 0 } # [doc = "FFI-representation of the [`Identifier`]"] # [repr (C)] # [derive (Clone)] pub struct platform_value_types_identifier_Identifier (* mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_IdentifierBytes32) ; impl ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier > for platform_value_types_identifier_Identifier { unsafe fn ffi_from_const (ffi : * const platform_value_types_identifier_Identifier) -> platform_value :: types :: identifier :: Identifier { let ffi_ref = & * ffi ; platform_value :: types :: identifier :: Identifier (< crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_IdentifierBytes32 as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: IdentifierBytes32 >> :: ffi_from (ffi_ref . 0)) } } impl ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier > for platform_value_types_identifier_Identifier { unsafe fn ffi_to_const (obj : platform_value :: types :: identifier :: Identifier) -> * const platform_value_types_identifier_Identifier { ferment :: boxed (platform_value_types_identifier_Identifier (< crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_IdentifierBytes32 as ferment :: FFIConversionTo < platform_value :: types :: identifier :: IdentifierBytes32 >> :: ffi_to (obj . 0))) } } impl Drop for platform_value_types_identifier_Identifier { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn platform_value_types_identifier_Identifier_ctor < > (o_0 : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_IdentifierBytes32) -> * mut platform_value_types_identifier_Identifier { ferment :: boxed (platform_value_types_identifier_Identifier (o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_types_identifier_Identifier_destroy < > (ffi : * mut platform_value_types_identifier_Identifier) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn platform_value_types_identifier_Identifier_get_0 < > (obj : * const platform_value_types_identifier_Identifier) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_IdentifierBytes32 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn platform_value_types_identifier_Identifier_set_0 < > (obj : * const platform_value_types_identifier_Identifier) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_IdentifierBytes32 { (* obj) . 0 } } pub mod bytes_32 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`Bytes32`]"] # [repr (C)] # [derive (Clone)] pub struct platform_value_types_bytes_32_Bytes32 (* mut crate :: fermented :: generics :: Arr_u8_32) ; impl ferment :: FFIConversionFrom < platform_value :: types :: bytes_32 :: Bytes32 > for platform_value_types_bytes_32_Bytes32 { unsafe fn ffi_from_const (ffi : * const platform_value_types_bytes_32_Bytes32) -> platform_value :: types :: bytes_32 :: Bytes32 { let ffi_ref = & * ffi ; platform_value :: types :: bytes_32 :: Bytes32 (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (ffi_ref . 0)) } } impl ferment :: FFIConversionTo < platform_value :: types :: bytes_32 :: Bytes32 > for platform_value_types_bytes_32_Bytes32 { unsafe fn ffi_to_const (obj : platform_value :: types :: bytes_32 :: Bytes32) -> * const platform_value_types_bytes_32_Bytes32 { ferment :: boxed (platform_value_types_bytes_32_Bytes32 (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj . 0))) } } impl Drop for platform_value_types_bytes_32_Bytes32 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn platform_value_types_bytes_32_Bytes32_ctor < > (o_0 : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut platform_value_types_bytes_32_Bytes32 { ferment :: boxed (platform_value_types_bytes_32_Bytes32 (o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_types_bytes_32_Bytes32_destroy < > (ffi : * mut platform_value_types_bytes_32_Bytes32) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn platform_value_types_bytes_32_Bytes32_get_0 < > (obj : * const platform_value_types_bytes_32_Bytes32) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn platform_value_types_bytes_32_Bytes32_set_0 < > (obj : * const platform_value_types_bytes_32_Bytes32) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . 0 } } pub mod binary_data { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`BinaryData`]"] # [repr (C)] # [derive (Clone)] pub struct platform_value_types_binary_data_BinaryData (* mut crate :: fermented :: generics :: Vec_u8) ; impl ferment :: FFIConversionFrom < platform_value :: types :: binary_data :: BinaryData > for platform_value_types_binary_data_BinaryData { unsafe fn ffi_from_const (ffi : * const platform_value_types_binary_data_BinaryData) -> platform_value :: types :: binary_data :: BinaryData { let ffi_ref = & * ffi ; platform_value :: types :: binary_data :: BinaryData (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (ffi_ref . 0)) } } impl ferment :: FFIConversionTo < platform_value :: types :: binary_data :: BinaryData > for platform_value_types_binary_data_BinaryData { unsafe fn ffi_to_const (obj : platform_value :: types :: binary_data :: BinaryData) -> * const platform_value_types_binary_data_BinaryData { ferment :: boxed (platform_value_types_binary_data_BinaryData (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj . 0))) } } impl Drop for platform_value_types_binary_data_BinaryData { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn platform_value_types_binary_data_BinaryData_ctor < > (o_0 : * mut crate :: fermented :: generics :: Vec_u8) -> * mut platform_value_types_binary_data_BinaryData { ferment :: boxed (platform_value_types_binary_data_BinaryData (o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_types_binary_data_BinaryData_destroy < > (ffi : * mut platform_value_types_binary_data_BinaryData) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn platform_value_types_binary_data_BinaryData_get_0 < > (obj : * const platform_value_types_binary_data_BinaryData) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn platform_value_types_binary_data_BinaryData_set_0 < > (obj : * const platform_value_types_binary_data_BinaryData) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . 0 } } pub mod bytes_20 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`Bytes20`]"] # [repr (C)] # [derive (Clone)] pub struct platform_value_types_bytes_20_Bytes20 (* mut crate :: fermented :: generics :: Arr_u8_20) ; impl ferment :: FFIConversionFrom < platform_value :: types :: bytes_20 :: Bytes20 > for platform_value_types_bytes_20_Bytes20 { unsafe fn ffi_from_const (ffi : * const platform_value_types_bytes_20_Bytes20) -> platform_value :: types :: bytes_20 :: Bytes20 { let ffi_ref = & * ffi ; platform_value :: types :: bytes_20 :: Bytes20 (< crate :: fermented :: generics :: Arr_u8_20 as ferment :: FFIConversionFrom < [u8 ; 20] >> :: ffi_from (ffi_ref . 0)) } } impl ferment :: FFIConversionTo < platform_value :: types :: bytes_20 :: Bytes20 > for platform_value_types_bytes_20_Bytes20 { unsafe fn ffi_to_const (obj : platform_value :: types :: bytes_20 :: Bytes20) -> * const platform_value_types_bytes_20_Bytes20 { ferment :: boxed (platform_value_types_bytes_20_Bytes20 (< crate :: fermented :: generics :: Arr_u8_20 as ferment :: FFIConversionTo < [u8 ; 20] >> :: ffi_to (obj . 0))) } } impl Drop for platform_value_types_bytes_20_Bytes20 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn platform_value_types_bytes_20_Bytes20_ctor < > (o_0 : * mut crate :: fermented :: generics :: Arr_u8_20) -> * mut platform_value_types_bytes_20_Bytes20 { ferment :: boxed (platform_value_types_bytes_20_Bytes20 (o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_types_bytes_20_Bytes20_destroy < > (ffi : * mut platform_value_types_bytes_20_Bytes20) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn platform_value_types_bytes_20_Bytes20_get_0 < > (obj : * const platform_value_types_bytes_20_Bytes20) -> * mut crate :: fermented :: generics :: Arr_u8_20 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn platform_value_types_bytes_20_Bytes20_set_0 < > (obj : * const platform_value_types_bytes_20_Bytes20) -> * mut crate :: fermented :: generics :: Arr_u8_20 { (* obj) . 0 } } } pub mod patch { use crate as dash_spv_apple_bindings ; pub mod diff { use crate as dash_spv_apple_bindings ; } } pub mod converter { use crate as dash_spv_apple_bindings ; # [cfg (feature = "json")] pub mod serde_json { use crate as dash_spv_apple_bindings ; } } pub mod btreemap_extensions { use crate as dash_spv_apple_bindings ; } # [doc = "FFI-representation of the [`Hash256`]"] # [repr (C)] # [derive (Clone)] pub struct platform_value_Hash256 (* mut crate :: fermented :: generics :: Arr_u8_32) ; impl ferment :: FFIConversionFrom < platform_value :: Hash256 > for platform_value_Hash256 { unsafe fn ffi_from_const (ffi : * const platform_value_Hash256) -> platform_value :: Hash256 { let ffi_ref = & * ffi ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (ffi_ref . 0) } } impl ferment :: FFIConversionTo < platform_value :: Hash256 > for platform_value_Hash256 { unsafe fn ffi_to_const (obj : platform_value :: Hash256) -> * const platform_value_Hash256 { ferment :: boxed (platform_value_Hash256 (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj))) } } impl Drop for platform_value_Hash256 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn platform_value_Hash256_ctor < > (o_0 : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut platform_value_Hash256 { ferment :: boxed (platform_value_Hash256 (o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_value_Hash256_destroy < > (ffi : * mut platform_value_Hash256) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn platform_value_Hash256_get_0 < > (obj : * const platform_value_Hash256) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn platform_value_Hash256_set_0 < > (obj : * const platform_value_Hash256) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . 0 } } pub mod platform_version { use crate as dash_spv_apple_bindings ; pub mod error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`PlatformVersionError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum platform_version_error_PlatformVersionError { UnknownVersionError (* mut std :: os :: raw :: c_char) } impl ferment :: FFIConversionFrom < platform_version :: error :: PlatformVersionError > for platform_version_error_PlatformVersionError { unsafe fn ffi_from_const (ffi : * const platform_version_error_PlatformVersionError) -> platform_version :: error :: PlatformVersionError { let ffi_ref = & * ffi ; match ffi_ref { platform_version_error_PlatformVersionError :: UnknownVersionError (o_0) => platform_version :: error :: PlatformVersionError :: UnknownVersionError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < platform_version :: error :: PlatformVersionError > for platform_version_error_PlatformVersionError { unsafe fn ffi_to_const (obj : platform_version :: error :: PlatformVersionError) -> * const platform_version_error_PlatformVersionError { ferment :: boxed (match obj { platform_version :: error :: PlatformVersionError :: UnknownVersionError (o_0) => platform_version_error_PlatformVersionError :: UnknownVersionError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for platform_version_error_PlatformVersionError { fn drop (& mut self) { unsafe { match self { platform_version_error_PlatformVersionError :: UnknownVersionError (o_0) => { ferment :: unbox_string (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn platform_version_error_PlatformVersionError_UnknownVersionError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut platform_version_error_PlatformVersionError { ferment :: boxed (platform_version_error_PlatformVersionError :: UnknownVersionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn platform_version_error_PlatformVersionError_destroy < > (ffi : * mut platform_version_error_PlatformVersionError) { ferment :: unbox_any (ffi) ; } } pub mod version { use crate as dash_spv_apple_bindings ; pub mod drive_abci_versions { use crate as dash_spv_apple_bindings ; pub mod drive_abci_method_versions { use crate as dash_spv_apple_bindings ; } pub mod drive_abci_query_versions { use crate as dash_spv_apple_bindings ; } pub mod drive_abci_validation_versions { use crate as dash_spv_apple_bindings ; } pub mod drive_abci_withdrawal_constants { use crate as dash_spv_apple_bindings ; } pub mod drive_abci_structure_versions { use crate as dash_spv_apple_bindings ; } } pub mod system_limits { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`SystemLimits`]"] # [repr (C)] # [derive (Clone)] pub struct platform_version_version_system_limits_SystemLimits { pub estimated_contract_max_serialized_size : u16 , pub max_field_value_size : u32 , pub max_state_transition_size : u64 , pub max_transitions_in_documents_batch : u16 , pub withdrawal_transactions_per_block_limit : u16 , pub retry_signing_expired_withdrawal_documents_per_block_limit : u16 , pub max_withdrawal_amount : u64 , pub max_contract_group_size : u32 , pub max_token_redemption_cycles : u32 } impl ferment :: FFIConversionFrom < platform_version :: version :: system_limits :: SystemLimits > for platform_version_version_system_limits_SystemLimits { unsafe fn ffi_from_const (ffi : * const platform_version_version_system_limits_SystemLimits) -> platform_version :: version :: system_limits :: SystemLimits { let ffi_ref = & * ffi ; platform_version :: version :: system_limits :: SystemLimits { estimated_contract_max_serialized_size : ffi_ref . estimated_contract_max_serialized_size , max_field_value_size : ffi_ref . max_field_value_size , max_state_transition_size : ffi_ref . max_state_transition_size , max_transitions_in_documents_batch : ffi_ref . max_transitions_in_documents_batch , withdrawal_transactions_per_block_limit : ffi_ref . withdrawal_transactions_per_block_limit , retry_signing_expired_withdrawal_documents_per_block_limit : ffi_ref . retry_signing_expired_withdrawal_documents_per_block_limit , max_withdrawal_amount : ffi_ref . max_withdrawal_amount , max_contract_group_size : ffi_ref . max_contract_group_size , max_token_redemption_cycles : ffi_ref . max_token_redemption_cycles } } } impl ferment :: FFIConversionTo < platform_version :: version :: system_limits :: SystemLimits > for platform_version_version_system_limits_SystemLimits { unsafe fn ffi_to_const (obj : platform_version :: version :: system_limits :: SystemLimits) -> * const platform_version_version_system_limits_SystemLimits { ferment :: boxed (platform_version_version_system_limits_SystemLimits { estimated_contract_max_serialized_size : obj . estimated_contract_max_serialized_size , max_field_value_size : obj . max_field_value_size , max_state_transition_size : obj . max_state_transition_size , max_transitions_in_documents_batch : obj . max_transitions_in_documents_batch , withdrawal_transactions_per_block_limit : obj . withdrawal_transactions_per_block_limit , retry_signing_expired_withdrawal_documents_per_block_limit : obj . retry_signing_expired_withdrawal_documents_per_block_limit , max_withdrawal_amount : obj . max_withdrawal_amount , max_contract_group_size : obj . max_contract_group_size , max_token_redemption_cycles : obj . max_token_redemption_cycles }) } } impl Drop for platform_version_version_system_limits_SystemLimits { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ; ; ; ; ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_ctor < > (estimated_contract_max_serialized_size : u16 , max_field_value_size : u32 , max_state_transition_size : u64 , max_transitions_in_documents_batch : u16 , withdrawal_transactions_per_block_limit : u16 , retry_signing_expired_withdrawal_documents_per_block_limit : u16 , max_withdrawal_amount : u64 , max_contract_group_size : u32 , max_token_redemption_cycles : u32) -> * mut platform_version_version_system_limits_SystemLimits { ferment :: boxed (platform_version_version_system_limits_SystemLimits { estimated_contract_max_serialized_size , max_field_value_size , max_state_transition_size , max_transitions_in_documents_batch , withdrawal_transactions_per_block_limit , retry_signing_expired_withdrawal_documents_per_block_limit , max_withdrawal_amount , max_contract_group_size , max_token_redemption_cycles }) } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_destroy < > (ffi : * mut platform_version_version_system_limits_SystemLimits) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_get_estimated_contract_max_serialized_size < > (obj : * const platform_version_version_system_limits_SystemLimits) -> u16 { (* obj) . estimated_contract_max_serialized_size } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_get_max_field_value_size < > (obj : * const platform_version_version_system_limits_SystemLimits) -> u32 { (* obj) . max_field_value_size } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_get_max_state_transition_size < > (obj : * const platform_version_version_system_limits_SystemLimits) -> u64 { (* obj) . max_state_transition_size } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_get_max_transitions_in_documents_batch < > (obj : * const platform_version_version_system_limits_SystemLimits) -> u16 { (* obj) . max_transitions_in_documents_batch } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_get_withdrawal_transactions_per_block_limit < > (obj : * const platform_version_version_system_limits_SystemLimits) -> u16 { (* obj) . withdrawal_transactions_per_block_limit } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_get_retry_signing_expired_withdrawal_documents_per_block_limit < > (obj : * const platform_version_version_system_limits_SystemLimits) -> u16 { (* obj) . retry_signing_expired_withdrawal_documents_per_block_limit } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_get_max_withdrawal_amount < > (obj : * const platform_version_version_system_limits_SystemLimits) -> u64 { (* obj) . max_withdrawal_amount } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_get_max_contract_group_size < > (obj : * const platform_version_version_system_limits_SystemLimits) -> u32 { (* obj) . max_contract_group_size } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_get_max_token_redemption_cycles < > (obj : * const platform_version_version_system_limits_SystemLimits) -> u32 { (* obj) . max_token_redemption_cycles } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_set_estimated_contract_max_serialized_size < > (obj : * const platform_version_version_system_limits_SystemLimits) -> u16 { (* obj) . estimated_contract_max_serialized_size } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_set_max_field_value_size < > (obj : * const platform_version_version_system_limits_SystemLimits) -> u32 { (* obj) . max_field_value_size } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_set_max_state_transition_size < > (obj : * const platform_version_version_system_limits_SystemLimits) -> u64 { (* obj) . max_state_transition_size } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_set_max_transitions_in_documents_batch < > (obj : * const platform_version_version_system_limits_SystemLimits) -> u16 { (* obj) . max_transitions_in_documents_batch } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_set_withdrawal_transactions_per_block_limit < > (obj : * const platform_version_version_system_limits_SystemLimits) -> u16 { (* obj) . withdrawal_transactions_per_block_limit } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_set_retry_signing_expired_withdrawal_documents_per_block_limit < > (obj : * const platform_version_version_system_limits_SystemLimits) -> u16 { (* obj) . retry_signing_expired_withdrawal_documents_per_block_limit } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_set_max_withdrawal_amount < > (obj : * const platform_version_version_system_limits_SystemLimits) -> u64 { (* obj) . max_withdrawal_amount } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_set_max_contract_group_size < > (obj : * const platform_version_version_system_limits_SystemLimits) -> u32 { (* obj) . max_contract_group_size } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_limits_SystemLimits_set_max_token_redemption_cycles < > (obj : * const platform_version_version_system_limits_SystemLimits) -> u32 { (* obj) . max_token_redemption_cycles } } pub mod drive_versions { use crate as dash_spv_apple_bindings ; pub mod drive_state_transition_method_versions { use crate as dash_spv_apple_bindings ; } pub mod drive_token_method_versions { use crate as dash_spv_apple_bindings ; } pub mod drive_credit_pool_method_versions { use crate as dash_spv_apple_bindings ; } pub mod drive_document_method_versions { use crate as dash_spv_apple_bindings ; } pub mod drive_identity_method_versions { use crate as dash_spv_apple_bindings ; } pub mod drive_verify_method_versions { use crate as dash_spv_apple_bindings ; } pub mod drive_vote_method_versions { use crate as dash_spv_apple_bindings ; } pub mod drive_contract_method_versions { use crate as dash_spv_apple_bindings ; } pub mod drive_structure_version { use crate as dash_spv_apple_bindings ; } pub mod drive_grove_method_versions { use crate as dash_spv_apple_bindings ; } pub mod drive_group_method_versions { use crate as dash_spv_apple_bindings ; } } pub mod system_data_contract_versions { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`SystemDataContractVersions`]"] # [repr (C)] # [derive (Clone)] pub struct platform_version_version_system_data_contract_versions_SystemDataContractVersions { pub withdrawals : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion , pub dpns : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion , pub dashpay : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion , pub masternode_reward_shares : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion , pub feature_flags : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion , pub wallet : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion } impl ferment :: FFIConversionFrom < platform_version :: version :: system_data_contract_versions :: SystemDataContractVersions > for platform_version_version_system_data_contract_versions_SystemDataContractVersions { unsafe fn ffi_from_const (ffi : * const platform_version_version_system_data_contract_versions_SystemDataContractVersions) -> platform_version :: version :: system_data_contract_versions :: SystemDataContractVersions { let ffi_ref = & * ffi ; platform_version :: version :: system_data_contract_versions :: SystemDataContractVersions { withdrawals : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionFrom < versioned_feature_core :: FeatureVersion >> :: ffi_from (ffi_ref . withdrawals) , dpns : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionFrom < versioned_feature_core :: FeatureVersion >> :: ffi_from (ffi_ref . dpns) , dashpay : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionFrom < versioned_feature_core :: FeatureVersion >> :: ffi_from (ffi_ref . dashpay) , masternode_reward_shares : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionFrom < versioned_feature_core :: FeatureVersion >> :: ffi_from (ffi_ref . masternode_reward_shares) , feature_flags : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionFrom < versioned_feature_core :: FeatureVersion >> :: ffi_from (ffi_ref . feature_flags) , wallet : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionFrom < versioned_feature_core :: FeatureVersion >> :: ffi_from (ffi_ref . wallet) } } } impl ferment :: FFIConversionTo < platform_version :: version :: system_data_contract_versions :: SystemDataContractVersions > for platform_version_version_system_data_contract_versions_SystemDataContractVersions { unsafe fn ffi_to_const (obj : platform_version :: version :: system_data_contract_versions :: SystemDataContractVersions) -> * const platform_version_version_system_data_contract_versions_SystemDataContractVersions { ferment :: boxed (platform_version_version_system_data_contract_versions_SystemDataContractVersions { withdrawals : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionTo < versioned_feature_core :: FeatureVersion >> :: ffi_to (obj . withdrawals) , dpns : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionTo < versioned_feature_core :: FeatureVersion >> :: ffi_to (obj . dpns) , dashpay : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionTo < versioned_feature_core :: FeatureVersion >> :: ffi_to (obj . dashpay) , masternode_reward_shares : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionTo < versioned_feature_core :: FeatureVersion >> :: ffi_to (obj . masternode_reward_shares) , feature_flags : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionTo < versioned_feature_core :: FeatureVersion >> :: ffi_to (obj . feature_flags) , wallet : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionTo < versioned_feature_core :: FeatureVersion >> :: ffi_to (obj . wallet) }) } } impl Drop for platform_version_version_system_data_contract_versions_SystemDataContractVersions { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . withdrawals) ; ferment :: unbox_any (ffi_ref . dpns) ; ferment :: unbox_any (ffi_ref . dashpay) ; ferment :: unbox_any (ffi_ref . masternode_reward_shares) ; ferment :: unbox_any (ffi_ref . feature_flags) ; ferment :: unbox_any (ffi_ref . wallet) ; } } } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_data_contract_versions_SystemDataContractVersions_ctor < > (withdrawals : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion , dpns : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion , dashpay : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion , masternode_reward_shares : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion , feature_flags : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion , wallet : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion) -> * mut platform_version_version_system_data_contract_versions_SystemDataContractVersions { ferment :: boxed (platform_version_version_system_data_contract_versions_SystemDataContractVersions { withdrawals , dpns , dashpay , masternode_reward_shares , feature_flags , wallet }) } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_data_contract_versions_SystemDataContractVersions_destroy < > (ffi : * mut platform_version_version_system_data_contract_versions_SystemDataContractVersions) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_data_contract_versions_SystemDataContractVersions_get_withdrawals < > (obj : * const platform_version_version_system_data_contract_versions_SystemDataContractVersions) -> * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion { (* obj) . withdrawals } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_data_contract_versions_SystemDataContractVersions_get_dpns < > (obj : * const platform_version_version_system_data_contract_versions_SystemDataContractVersions) -> * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion { (* obj) . dpns } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_data_contract_versions_SystemDataContractVersions_get_dashpay < > (obj : * const platform_version_version_system_data_contract_versions_SystemDataContractVersions) -> * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion { (* obj) . dashpay } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_data_contract_versions_SystemDataContractVersions_get_masternode_reward_shares < > (obj : * const platform_version_version_system_data_contract_versions_SystemDataContractVersions) -> * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion { (* obj) . masternode_reward_shares } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_data_contract_versions_SystemDataContractVersions_get_feature_flags < > (obj : * const platform_version_version_system_data_contract_versions_SystemDataContractVersions) -> * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion { (* obj) . feature_flags } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_data_contract_versions_SystemDataContractVersions_get_wallet < > (obj : * const platform_version_version_system_data_contract_versions_SystemDataContractVersions) -> * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion { (* obj) . wallet } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_data_contract_versions_SystemDataContractVersions_set_withdrawals < > (obj : * const platform_version_version_system_data_contract_versions_SystemDataContractVersions) -> * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion { (* obj) . withdrawals } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_data_contract_versions_SystemDataContractVersions_set_dpns < > (obj : * const platform_version_version_system_data_contract_versions_SystemDataContractVersions) -> * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion { (* obj) . dpns } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_data_contract_versions_SystemDataContractVersions_set_dashpay < > (obj : * const platform_version_version_system_data_contract_versions_SystemDataContractVersions) -> * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion { (* obj) . dashpay } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_data_contract_versions_SystemDataContractVersions_set_masternode_reward_shares < > (obj : * const platform_version_version_system_data_contract_versions_SystemDataContractVersions) -> * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion { (* obj) . masternode_reward_shares } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_data_contract_versions_SystemDataContractVersions_set_feature_flags < > (obj : * const platform_version_version_system_data_contract_versions_SystemDataContractVersions) -> * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion { (* obj) . feature_flags } # [no_mangle] pub unsafe extern "C" fn platform_version_version_system_data_contract_versions_SystemDataContractVersions_set_wallet < > (obj : * const platform_version_version_system_data_contract_versions_SystemDataContractVersions) -> * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion { (* obj) . wallet } } pub mod fee { use crate as dash_spv_apple_bindings ; pub mod state_transition_min_fees { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`StateTransitionMinFees`]"] # [repr (C)] # [derive (Clone)] pub struct platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees { pub credit_transfer : u64 , pub credit_withdrawal : u64 , pub identity_update : u64 , pub document_batch_sub_transition : u64 , pub contract_create : u64 , pub contract_update : u64 , pub masternode_vote : u64 } impl ferment :: FFIConversionFrom < platform_version :: version :: fee :: state_transition_min_fees :: StateTransitionMinFees > for platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees { unsafe fn ffi_from_const (ffi : * const platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees) -> platform_version :: version :: fee :: state_transition_min_fees :: StateTransitionMinFees { let ffi_ref = & * ffi ; platform_version :: version :: fee :: state_transition_min_fees :: StateTransitionMinFees { credit_transfer : ffi_ref . credit_transfer , credit_withdrawal : ffi_ref . credit_withdrawal , identity_update : ffi_ref . identity_update , document_batch_sub_transition : ffi_ref . document_batch_sub_transition , contract_create : ffi_ref . contract_create , contract_update : ffi_ref . contract_update , masternode_vote : ffi_ref . masternode_vote } } } impl ferment :: FFIConversionTo < platform_version :: version :: fee :: state_transition_min_fees :: StateTransitionMinFees > for platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees { unsafe fn ffi_to_const (obj : platform_version :: version :: fee :: state_transition_min_fees :: StateTransitionMinFees) -> * const platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees { ferment :: boxed (platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees { credit_transfer : obj . credit_transfer , credit_withdrawal : obj . credit_withdrawal , identity_update : obj . identity_update , document_batch_sub_transition : obj . document_batch_sub_transition , contract_create : obj . contract_create , contract_update : obj . contract_update , masternode_vote : obj . masternode_vote }) } } impl Drop for platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ; ; ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees_ctor < > (credit_transfer : u64 , credit_withdrawal : u64 , identity_update : u64 , document_batch_sub_transition : u64 , contract_create : u64 , contract_update : u64 , masternode_vote : u64) -> * mut platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees { ferment :: boxed (platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees { credit_transfer , credit_withdrawal , identity_update , document_batch_sub_transition , contract_create , contract_update , masternode_vote }) } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees_destroy < > (ffi : * mut platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees_get_credit_transfer < > (obj : * const platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees) -> u64 { (* obj) . credit_transfer } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees_get_credit_withdrawal < > (obj : * const platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees) -> u64 { (* obj) . credit_withdrawal } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees_get_identity_update < > (obj : * const platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees) -> u64 { (* obj) . identity_update } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees_get_document_batch_sub_transition < > (obj : * const platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees) -> u64 { (* obj) . document_batch_sub_transition } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees_get_contract_create < > (obj : * const platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees) -> u64 { (* obj) . contract_create } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees_get_contract_update < > (obj : * const platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees) -> u64 { (* obj) . contract_update } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees_get_masternode_vote < > (obj : * const platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees) -> u64 { (* obj) . masternode_vote } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees_set_credit_transfer < > (obj : * const platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees) -> u64 { (* obj) . credit_transfer } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees_set_credit_withdrawal < > (obj : * const platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees) -> u64 { (* obj) . credit_withdrawal } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees_set_identity_update < > (obj : * const platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees) -> u64 { (* obj) . identity_update } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees_set_document_batch_sub_transition < > (obj : * const platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees) -> u64 { (* obj) . document_batch_sub_transition } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees_set_contract_create < > (obj : * const platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees) -> u64 { (* obj) . contract_create } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees_set_contract_update < > (obj : * const platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees) -> u64 { (* obj) . contract_update } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees_set_masternode_vote < > (obj : * const platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees) -> u64 { (* obj) . masternode_vote } } pub mod hashing { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`FeeHashingVersion`]"] # [repr (C)] # [derive (Clone)] pub struct platform_version_version_fee_hashing_FeeHashingVersion { pub blake3_base : u64 , pub blake3_per_block : u64 , pub sha256_per_block : u64 , pub sha256_ripe_md160_base : u64 , pub single_sha256_base : u64 } impl ferment :: FFIConversionFrom < platform_version :: version :: fee :: hashing :: FeeHashingVersion > for platform_version_version_fee_hashing_FeeHashingVersion { unsafe fn ffi_from_const (ffi : * const platform_version_version_fee_hashing_FeeHashingVersion) -> platform_version :: version :: fee :: hashing :: FeeHashingVersion { let ffi_ref = & * ffi ; platform_version :: version :: fee :: hashing :: FeeHashingVersion { blake3_base : ffi_ref . blake3_base , blake3_per_block : ffi_ref . blake3_per_block , sha256_per_block : ffi_ref . sha256_per_block , sha256_ripe_md160_base : ffi_ref . sha256_ripe_md160_base , single_sha256_base : ffi_ref . single_sha256_base } } } impl ferment :: FFIConversionTo < platform_version :: version :: fee :: hashing :: FeeHashingVersion > for platform_version_version_fee_hashing_FeeHashingVersion { unsafe fn ffi_to_const (obj : platform_version :: version :: fee :: hashing :: FeeHashingVersion) -> * const platform_version_version_fee_hashing_FeeHashingVersion { ferment :: boxed (platform_version_version_fee_hashing_FeeHashingVersion { blake3_base : obj . blake3_base , blake3_per_block : obj . blake3_per_block , sha256_per_block : obj . sha256_per_block , sha256_ripe_md160_base : obj . sha256_ripe_md160_base , single_sha256_base : obj . single_sha256_base }) } } impl Drop for platform_version_version_fee_hashing_FeeHashingVersion { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_hashing_FeeHashingVersion_ctor < > (blake3_base : u64 , blake3_per_block : u64 , sha256_per_block : u64 , sha256_ripe_md160_base : u64 , single_sha256_base : u64) -> * mut platform_version_version_fee_hashing_FeeHashingVersion { ferment :: boxed (platform_version_version_fee_hashing_FeeHashingVersion { blake3_base , blake3_per_block , sha256_per_block , sha256_ripe_md160_base , single_sha256_base }) } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_hashing_FeeHashingVersion_destroy < > (ffi : * mut platform_version_version_fee_hashing_FeeHashingVersion) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_hashing_FeeHashingVersion_get_blake3_base < > (obj : * const platform_version_version_fee_hashing_FeeHashingVersion) -> u64 { (* obj) . blake3_base } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_hashing_FeeHashingVersion_get_blake3_per_block < > (obj : * const platform_version_version_fee_hashing_FeeHashingVersion) -> u64 { (* obj) . blake3_per_block } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_hashing_FeeHashingVersion_get_sha256_per_block < > (obj : * const platform_version_version_fee_hashing_FeeHashingVersion) -> u64 { (* obj) . sha256_per_block } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_hashing_FeeHashingVersion_get_sha256_ripe_md160_base < > (obj : * const platform_version_version_fee_hashing_FeeHashingVersion) -> u64 { (* obj) . sha256_ripe_md160_base } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_hashing_FeeHashingVersion_get_single_sha256_base < > (obj : * const platform_version_version_fee_hashing_FeeHashingVersion) -> u64 { (* obj) . single_sha256_base } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_hashing_FeeHashingVersion_set_blake3_base < > (obj : * const platform_version_version_fee_hashing_FeeHashingVersion) -> u64 { (* obj) . blake3_base } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_hashing_FeeHashingVersion_set_blake3_per_block < > (obj : * const platform_version_version_fee_hashing_FeeHashingVersion) -> u64 { (* obj) . blake3_per_block } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_hashing_FeeHashingVersion_set_sha256_per_block < > (obj : * const platform_version_version_fee_hashing_FeeHashingVersion) -> u64 { (* obj) . sha256_per_block } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_hashing_FeeHashingVersion_set_sha256_ripe_md160_base < > (obj : * const platform_version_version_fee_hashing_FeeHashingVersion) -> u64 { (* obj) . sha256_ripe_md160_base } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_hashing_FeeHashingVersion_set_single_sha256_base < > (obj : * const platform_version_version_fee_hashing_FeeHashingVersion) -> u64 { (* obj) . single_sha256_base } } pub mod storage { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`FeeStorageVersion`]"] # [repr (C)] # [derive (Clone)] pub struct platform_version_version_fee_storage_FeeStorageVersion { pub storage_disk_usage_credit_per_byte : u64 , pub storage_processing_credit_per_byte : u64 , pub storage_load_credit_per_byte : u64 , pub non_storage_load_credit_per_byte : u64 , pub storage_seek_cost : u64 } impl ferment :: FFIConversionFrom < platform_version :: version :: fee :: storage :: FeeStorageVersion > for platform_version_version_fee_storage_FeeStorageVersion { unsafe fn ffi_from_const (ffi : * const platform_version_version_fee_storage_FeeStorageVersion) -> platform_version :: version :: fee :: storage :: FeeStorageVersion { let ffi_ref = & * ffi ; platform_version :: version :: fee :: storage :: FeeStorageVersion { storage_disk_usage_credit_per_byte : ffi_ref . storage_disk_usage_credit_per_byte , storage_processing_credit_per_byte : ffi_ref . storage_processing_credit_per_byte , storage_load_credit_per_byte : ffi_ref . storage_load_credit_per_byte , non_storage_load_credit_per_byte : ffi_ref . non_storage_load_credit_per_byte , storage_seek_cost : ffi_ref . storage_seek_cost } } } impl ferment :: FFIConversionTo < platform_version :: version :: fee :: storage :: FeeStorageVersion > for platform_version_version_fee_storage_FeeStorageVersion { unsafe fn ffi_to_const (obj : platform_version :: version :: fee :: storage :: FeeStorageVersion) -> * const platform_version_version_fee_storage_FeeStorageVersion { ferment :: boxed (platform_version_version_fee_storage_FeeStorageVersion { storage_disk_usage_credit_per_byte : obj . storage_disk_usage_credit_per_byte , storage_processing_credit_per_byte : obj . storage_processing_credit_per_byte , storage_load_credit_per_byte : obj . storage_load_credit_per_byte , non_storage_load_credit_per_byte : obj . non_storage_load_credit_per_byte , storage_seek_cost : obj . storage_seek_cost }) } } impl Drop for platform_version_version_fee_storage_FeeStorageVersion { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_storage_FeeStorageVersion_ctor < > (storage_disk_usage_credit_per_byte : u64 , storage_processing_credit_per_byte : u64 , storage_load_credit_per_byte : u64 , non_storage_load_credit_per_byte : u64 , storage_seek_cost : u64) -> * mut platform_version_version_fee_storage_FeeStorageVersion { ferment :: boxed (platform_version_version_fee_storage_FeeStorageVersion { storage_disk_usage_credit_per_byte , storage_processing_credit_per_byte , storage_load_credit_per_byte , non_storage_load_credit_per_byte , storage_seek_cost }) } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_storage_FeeStorageVersion_destroy < > (ffi : * mut platform_version_version_fee_storage_FeeStorageVersion) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_storage_FeeStorageVersion_get_storage_disk_usage_credit_per_byte < > (obj : * const platform_version_version_fee_storage_FeeStorageVersion) -> u64 { (* obj) . storage_disk_usage_credit_per_byte } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_storage_FeeStorageVersion_get_storage_processing_credit_per_byte < > (obj : * const platform_version_version_fee_storage_FeeStorageVersion) -> u64 { (* obj) . storage_processing_credit_per_byte } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_storage_FeeStorageVersion_get_storage_load_credit_per_byte < > (obj : * const platform_version_version_fee_storage_FeeStorageVersion) -> u64 { (* obj) . storage_load_credit_per_byte } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_storage_FeeStorageVersion_get_non_storage_load_credit_per_byte < > (obj : * const platform_version_version_fee_storage_FeeStorageVersion) -> u64 { (* obj) . non_storage_load_credit_per_byte } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_storage_FeeStorageVersion_get_storage_seek_cost < > (obj : * const platform_version_version_fee_storage_FeeStorageVersion) -> u64 { (* obj) . storage_seek_cost } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_storage_FeeStorageVersion_set_storage_disk_usage_credit_per_byte < > (obj : * const platform_version_version_fee_storage_FeeStorageVersion) -> u64 { (* obj) . storage_disk_usage_credit_per_byte } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_storage_FeeStorageVersion_set_storage_processing_credit_per_byte < > (obj : * const platform_version_version_fee_storage_FeeStorageVersion) -> u64 { (* obj) . storage_processing_credit_per_byte } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_storage_FeeStorageVersion_set_storage_load_credit_per_byte < > (obj : * const platform_version_version_fee_storage_FeeStorageVersion) -> u64 { (* obj) . storage_load_credit_per_byte } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_storage_FeeStorageVersion_set_non_storage_load_credit_per_byte < > (obj : * const platform_version_version_fee_storage_FeeStorageVersion) -> u64 { (* obj) . non_storage_load_credit_per_byte } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_storage_FeeStorageVersion_set_storage_seek_cost < > (obj : * const platform_version_version_fee_storage_FeeStorageVersion) -> u64 { (* obj) . storage_seek_cost } } pub mod data_contract { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`FeeDataContractValidationVersion`]"] # [repr (C)] # [derive (Clone)] pub struct platform_version_version_fee_data_contract_FeeDataContractValidationVersion { pub document_type_base_fee : u64 , pub document_type_size_fee : u64 , pub document_type_per_property_fee : u64 , pub document_type_base_non_unique_index_fee : u64 , pub document_type_non_unique_index_per_property_fee : u64 , pub document_type_base_unique_index_fee : u64 , pub document_type_unique_index_per_property_fee : u64 } impl ferment :: FFIConversionFrom < platform_version :: version :: fee :: data_contract :: FeeDataContractValidationVersion > for platform_version_version_fee_data_contract_FeeDataContractValidationVersion { unsafe fn ffi_from_const (ffi : * const platform_version_version_fee_data_contract_FeeDataContractValidationVersion) -> platform_version :: version :: fee :: data_contract :: FeeDataContractValidationVersion { let ffi_ref = & * ffi ; platform_version :: version :: fee :: data_contract :: FeeDataContractValidationVersion { document_type_base_fee : ffi_ref . document_type_base_fee , document_type_size_fee : ffi_ref . document_type_size_fee , document_type_per_property_fee : ffi_ref . document_type_per_property_fee , document_type_base_non_unique_index_fee : ffi_ref . document_type_base_non_unique_index_fee , document_type_non_unique_index_per_property_fee : ffi_ref . document_type_non_unique_index_per_property_fee , document_type_base_unique_index_fee : ffi_ref . document_type_base_unique_index_fee , document_type_unique_index_per_property_fee : ffi_ref . document_type_unique_index_per_property_fee } } } impl ferment :: FFIConversionTo < platform_version :: version :: fee :: data_contract :: FeeDataContractValidationVersion > for platform_version_version_fee_data_contract_FeeDataContractValidationVersion { unsafe fn ffi_to_const (obj : platform_version :: version :: fee :: data_contract :: FeeDataContractValidationVersion) -> * const platform_version_version_fee_data_contract_FeeDataContractValidationVersion { ferment :: boxed (platform_version_version_fee_data_contract_FeeDataContractValidationVersion { document_type_base_fee : obj . document_type_base_fee , document_type_size_fee : obj . document_type_size_fee , document_type_per_property_fee : obj . document_type_per_property_fee , document_type_base_non_unique_index_fee : obj . document_type_base_non_unique_index_fee , document_type_non_unique_index_per_property_fee : obj . document_type_non_unique_index_per_property_fee , document_type_base_unique_index_fee : obj . document_type_base_unique_index_fee , document_type_unique_index_per_property_fee : obj . document_type_unique_index_per_property_fee }) } } impl Drop for platform_version_version_fee_data_contract_FeeDataContractValidationVersion { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ; ; ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_data_contract_FeeDataContractValidationVersion_ctor < > (document_type_base_fee : u64 , document_type_size_fee : u64 , document_type_per_property_fee : u64 , document_type_base_non_unique_index_fee : u64 , document_type_non_unique_index_per_property_fee : u64 , document_type_base_unique_index_fee : u64 , document_type_unique_index_per_property_fee : u64) -> * mut platform_version_version_fee_data_contract_FeeDataContractValidationVersion { ferment :: boxed (platform_version_version_fee_data_contract_FeeDataContractValidationVersion { document_type_base_fee , document_type_size_fee , document_type_per_property_fee , document_type_base_non_unique_index_fee , document_type_non_unique_index_per_property_fee , document_type_base_unique_index_fee , document_type_unique_index_per_property_fee }) } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_data_contract_FeeDataContractValidationVersion_destroy < > (ffi : * mut platform_version_version_fee_data_contract_FeeDataContractValidationVersion) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_data_contract_FeeDataContractValidationVersion_get_document_type_base_fee < > (obj : * const platform_version_version_fee_data_contract_FeeDataContractValidationVersion) -> u64 { (* obj) . document_type_base_fee } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_data_contract_FeeDataContractValidationVersion_get_document_type_size_fee < > (obj : * const platform_version_version_fee_data_contract_FeeDataContractValidationVersion) -> u64 { (* obj) . document_type_size_fee } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_data_contract_FeeDataContractValidationVersion_get_document_type_per_property_fee < > (obj : * const platform_version_version_fee_data_contract_FeeDataContractValidationVersion) -> u64 { (* obj) . document_type_per_property_fee } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_data_contract_FeeDataContractValidationVersion_get_document_type_base_non_unique_index_fee < > (obj : * const platform_version_version_fee_data_contract_FeeDataContractValidationVersion) -> u64 { (* obj) . document_type_base_non_unique_index_fee } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_data_contract_FeeDataContractValidationVersion_get_document_type_non_unique_index_per_property_fee < > (obj : * const platform_version_version_fee_data_contract_FeeDataContractValidationVersion) -> u64 { (* obj) . document_type_non_unique_index_per_property_fee } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_data_contract_FeeDataContractValidationVersion_get_document_type_base_unique_index_fee < > (obj : * const platform_version_version_fee_data_contract_FeeDataContractValidationVersion) -> u64 { (* obj) . document_type_base_unique_index_fee } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_data_contract_FeeDataContractValidationVersion_get_document_type_unique_index_per_property_fee < > (obj : * const platform_version_version_fee_data_contract_FeeDataContractValidationVersion) -> u64 { (* obj) . document_type_unique_index_per_property_fee } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_data_contract_FeeDataContractValidationVersion_set_document_type_base_fee < > (obj : * const platform_version_version_fee_data_contract_FeeDataContractValidationVersion) -> u64 { (* obj) . document_type_base_fee } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_data_contract_FeeDataContractValidationVersion_set_document_type_size_fee < > (obj : * const platform_version_version_fee_data_contract_FeeDataContractValidationVersion) -> u64 { (* obj) . document_type_size_fee } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_data_contract_FeeDataContractValidationVersion_set_document_type_per_property_fee < > (obj : * const platform_version_version_fee_data_contract_FeeDataContractValidationVersion) -> u64 { (* obj) . document_type_per_property_fee } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_data_contract_FeeDataContractValidationVersion_set_document_type_base_non_unique_index_fee < > (obj : * const platform_version_version_fee_data_contract_FeeDataContractValidationVersion) -> u64 { (* obj) . document_type_base_non_unique_index_fee } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_data_contract_FeeDataContractValidationVersion_set_document_type_non_unique_index_per_property_fee < > (obj : * const platform_version_version_fee_data_contract_FeeDataContractValidationVersion) -> u64 { (* obj) . document_type_non_unique_index_per_property_fee } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_data_contract_FeeDataContractValidationVersion_set_document_type_base_unique_index_fee < > (obj : * const platform_version_version_fee_data_contract_FeeDataContractValidationVersion) -> u64 { (* obj) . document_type_base_unique_index_fee } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_data_contract_FeeDataContractValidationVersion_set_document_type_unique_index_per_property_fee < > (obj : * const platform_version_version_fee_data_contract_FeeDataContractValidationVersion) -> u64 { (* obj) . document_type_unique_index_per_property_fee } } pub mod vote_resolution_fund_fees { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`VoteResolutionFundFees`]"] # [repr (C)] # [derive (Clone)] pub struct platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees { pub contested_document_vote_resolution_fund_required_amount : u64 , pub contested_document_vote_resolution_unlock_fund_required_amount : u64 , pub contested_document_single_vote_cost : u64 } impl ferment :: FFIConversionFrom < platform_version :: version :: fee :: vote_resolution_fund_fees :: VoteResolutionFundFees > for platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees { unsafe fn ffi_from_const (ffi : * const platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees) -> platform_version :: version :: fee :: vote_resolution_fund_fees :: VoteResolutionFundFees { let ffi_ref = & * ffi ; platform_version :: version :: fee :: vote_resolution_fund_fees :: VoteResolutionFundFees { contested_document_vote_resolution_fund_required_amount : ffi_ref . contested_document_vote_resolution_fund_required_amount , contested_document_vote_resolution_unlock_fund_required_amount : ffi_ref . contested_document_vote_resolution_unlock_fund_required_amount , contested_document_single_vote_cost : ffi_ref . contested_document_single_vote_cost } } } impl ferment :: FFIConversionTo < platform_version :: version :: fee :: vote_resolution_fund_fees :: VoteResolutionFundFees > for platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees { unsafe fn ffi_to_const (obj : platform_version :: version :: fee :: vote_resolution_fund_fees :: VoteResolutionFundFees) -> * const platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees { ferment :: boxed (platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees { contested_document_vote_resolution_fund_required_amount : obj . contested_document_vote_resolution_fund_required_amount , contested_document_vote_resolution_unlock_fund_required_amount : obj . contested_document_vote_resolution_unlock_fund_required_amount , contested_document_single_vote_cost : obj . contested_document_single_vote_cost }) } } impl Drop for platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees_ctor < > (contested_document_vote_resolution_fund_required_amount : u64 , contested_document_vote_resolution_unlock_fund_required_amount : u64 , contested_document_single_vote_cost : u64) -> * mut platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees { ferment :: boxed (platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees { contested_document_vote_resolution_fund_required_amount , contested_document_vote_resolution_unlock_fund_required_amount , contested_document_single_vote_cost }) } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees_destroy < > (ffi : * mut platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees_get_contested_document_vote_resolution_fund_required_amount < > (obj : * const platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees) -> u64 { (* obj) . contested_document_vote_resolution_fund_required_amount } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees_get_contested_document_vote_resolution_unlock_fund_required_amount < > (obj : * const platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees) -> u64 { (* obj) . contested_document_vote_resolution_unlock_fund_required_amount } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees_get_contested_document_single_vote_cost < > (obj : * const platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees) -> u64 { (* obj) . contested_document_single_vote_cost } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees_set_contested_document_vote_resolution_fund_required_amount < > (obj : * const platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees) -> u64 { (* obj) . contested_document_vote_resolution_fund_required_amount } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees_set_contested_document_vote_resolution_unlock_fund_required_amount < > (obj : * const platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees) -> u64 { (* obj) . contested_document_vote_resolution_unlock_fund_required_amount } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees_set_contested_document_single_vote_cost < > (obj : * const platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees) -> u64 { (* obj) . contested_document_single_vote_cost } } # [doc = "FFI-representation of the [`FeeVersion`]"] # [repr (C)] # [derive (Clone)] pub struct platform_version_version_fee_FeeVersion { pub fee_version_number : * mut platform_version :: version :: fee :: FeeVersionNumber , pub uses_version_fee_multiplier_permille : * mut u64 , pub storage : * mut crate :: fermented :: types :: platform_version :: version :: fee :: storage :: platform_version_version_fee_storage_FeeStorageVersion , pub signature : * mut crate :: fermented :: types :: platform_version :: version :: fee :: signature :: platform_version_version_fee_signature_FeeSignatureVersion , pub hashing : * mut crate :: fermented :: types :: platform_version :: version :: fee :: hashing :: platform_version_version_fee_hashing_FeeHashingVersion , pub processing : * mut crate :: fermented :: types :: platform_version :: version :: fee :: processing :: platform_version_version_fee_processing_FeeProcessingVersion , pub data_contract : * mut crate :: fermented :: types :: platform_version :: version :: fee :: data_contract :: platform_version_version_fee_data_contract_FeeDataContractValidationVersion , pub state_transition_min_fees : * mut crate :: fermented :: types :: platform_version :: version :: fee :: state_transition_min_fees :: platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees , pub vote_resolution_fund_fees : * mut crate :: fermented :: types :: platform_version :: version :: fee :: vote_resolution_fund_fees :: platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees } impl ferment :: FFIConversionFrom < platform_version :: version :: fee :: FeeVersion > for platform_version_version_fee_FeeVersion { unsafe fn ffi_from_const (ffi : * const platform_version_version_fee_FeeVersion) -> platform_version :: version :: fee :: FeeVersion { let ffi_ref = & * ffi ; platform_version :: version :: fee :: FeeVersion { fee_version_number : (& * ffi_ref . fee_version_number) . clone () , uses_version_fee_multiplier_permille : ferment :: from_opt_primitive (ffi_ref . uses_version_fee_multiplier_permille) , storage : < crate :: fermented :: types :: platform_version :: version :: fee :: storage :: platform_version_version_fee_storage_FeeStorageVersion as ferment :: FFIConversionFrom < platform_version :: version :: fee :: storage :: FeeStorageVersion >> :: ffi_from (ffi_ref . storage) , signature : < crate :: fermented :: types :: platform_version :: version :: fee :: signature :: platform_version_version_fee_signature_FeeSignatureVersion as ferment :: FFIConversionFrom < platform_version :: version :: fee :: signature :: FeeSignatureVersion >> :: ffi_from (ffi_ref . signature) , hashing : < crate :: fermented :: types :: platform_version :: version :: fee :: hashing :: platform_version_version_fee_hashing_FeeHashingVersion as ferment :: FFIConversionFrom < platform_version :: version :: fee :: hashing :: FeeHashingVersion >> :: ffi_from (ffi_ref . hashing) , processing : < crate :: fermented :: types :: platform_version :: version :: fee :: processing :: platform_version_version_fee_processing_FeeProcessingVersion as ferment :: FFIConversionFrom < platform_version :: version :: fee :: processing :: FeeProcessingVersion >> :: ffi_from (ffi_ref . processing) , data_contract : < crate :: fermented :: types :: platform_version :: version :: fee :: data_contract :: platform_version_version_fee_data_contract_FeeDataContractValidationVersion as ferment :: FFIConversionFrom < platform_version :: version :: fee :: data_contract :: FeeDataContractValidationVersion >> :: ffi_from (ffi_ref . data_contract) , state_transition_min_fees : < crate :: fermented :: types :: platform_version :: version :: fee :: state_transition_min_fees :: platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees as ferment :: FFIConversionFrom < platform_version :: version :: fee :: state_transition_min_fees :: StateTransitionMinFees >> :: ffi_from (ffi_ref . state_transition_min_fees) , vote_resolution_fund_fees : < crate :: fermented :: types :: platform_version :: version :: fee :: vote_resolution_fund_fees :: platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees as ferment :: FFIConversionFrom < platform_version :: version :: fee :: vote_resolution_fund_fees :: VoteResolutionFundFees >> :: ffi_from (ffi_ref . vote_resolution_fund_fees) } } } impl ferment :: FFIConversionTo < platform_version :: version :: fee :: FeeVersion > for platform_version_version_fee_FeeVersion { unsafe fn ffi_to_const (obj : platform_version :: version :: fee :: FeeVersion) -> * const platform_version_version_fee_FeeVersion { ferment :: boxed (platform_version_version_fee_FeeVersion { fee_version_number : ferment :: boxed (obj . fee_version_number) , uses_version_fee_multiplier_permille : ferment :: to_opt_primitive (obj . uses_version_fee_multiplier_permille) , storage : < crate :: fermented :: types :: platform_version :: version :: fee :: storage :: platform_version_version_fee_storage_FeeStorageVersion as ferment :: FFIConversionTo < platform_version :: version :: fee :: storage :: FeeStorageVersion >> :: ffi_to (obj . storage) , signature : < crate :: fermented :: types :: platform_version :: version :: fee :: signature :: platform_version_version_fee_signature_FeeSignatureVersion as ferment :: FFIConversionTo < platform_version :: version :: fee :: signature :: FeeSignatureVersion >> :: ffi_to (obj . signature) , hashing : < crate :: fermented :: types :: platform_version :: version :: fee :: hashing :: platform_version_version_fee_hashing_FeeHashingVersion as ferment :: FFIConversionTo < platform_version :: version :: fee :: hashing :: FeeHashingVersion >> :: ffi_to (obj . hashing) , processing : < crate :: fermented :: types :: platform_version :: version :: fee :: processing :: platform_version_version_fee_processing_FeeProcessingVersion as ferment :: FFIConversionTo < platform_version :: version :: fee :: processing :: FeeProcessingVersion >> :: ffi_to (obj . processing) , data_contract : < crate :: fermented :: types :: platform_version :: version :: fee :: data_contract :: platform_version_version_fee_data_contract_FeeDataContractValidationVersion as ferment :: FFIConversionTo < platform_version :: version :: fee :: data_contract :: FeeDataContractValidationVersion >> :: ffi_to (obj . data_contract) , state_transition_min_fees : < crate :: fermented :: types :: platform_version :: version :: fee :: state_transition_min_fees :: platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees as ferment :: FFIConversionTo < platform_version :: version :: fee :: state_transition_min_fees :: StateTransitionMinFees >> :: ffi_to (obj . state_transition_min_fees) , vote_resolution_fund_fees : < crate :: fermented :: types :: platform_version :: version :: fee :: vote_resolution_fund_fees :: platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees as ferment :: FFIConversionTo < platform_version :: version :: fee :: vote_resolution_fund_fees :: VoteResolutionFundFees >> :: ffi_to (obj . vote_resolution_fund_fees) }) } } impl Drop for platform_version_version_fee_FeeVersion { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . fee_version_number) ; ferment :: destroy_opt_primitive (ffi_ref . uses_version_fee_multiplier_permille) ; ferment :: unbox_any (ffi_ref . storage) ; ferment :: unbox_any (ffi_ref . signature) ; ferment :: unbox_any (ffi_ref . hashing) ; ferment :: unbox_any (ffi_ref . processing) ; ferment :: unbox_any (ffi_ref . data_contract) ; ferment :: unbox_any (ffi_ref . state_transition_min_fees) ; ferment :: unbox_any (ffi_ref . vote_resolution_fund_fees) ; } } } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_ctor < > (fee_version_number : * mut platform_version :: version :: fee :: FeeVersionNumber , uses_version_fee_multiplier_permille : * mut u64 , storage : * mut crate :: fermented :: types :: platform_version :: version :: fee :: storage :: platform_version_version_fee_storage_FeeStorageVersion , signature : * mut crate :: fermented :: types :: platform_version :: version :: fee :: signature :: platform_version_version_fee_signature_FeeSignatureVersion , hashing : * mut crate :: fermented :: types :: platform_version :: version :: fee :: hashing :: platform_version_version_fee_hashing_FeeHashingVersion , processing : * mut crate :: fermented :: types :: platform_version :: version :: fee :: processing :: platform_version_version_fee_processing_FeeProcessingVersion , data_contract : * mut crate :: fermented :: types :: platform_version :: version :: fee :: data_contract :: platform_version_version_fee_data_contract_FeeDataContractValidationVersion , state_transition_min_fees : * mut crate :: fermented :: types :: platform_version :: version :: fee :: state_transition_min_fees :: platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees , vote_resolution_fund_fees : * mut crate :: fermented :: types :: platform_version :: version :: fee :: vote_resolution_fund_fees :: platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees) -> * mut platform_version_version_fee_FeeVersion { ferment :: boxed (platform_version_version_fee_FeeVersion { fee_version_number , uses_version_fee_multiplier_permille , storage , signature , hashing , processing , data_contract , state_transition_min_fees , vote_resolution_fund_fees }) } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_destroy < > (ffi : * mut platform_version_version_fee_FeeVersion) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_get_fee_version_number < > (obj : * const platform_version_version_fee_FeeVersion) -> * mut platform_version :: version :: fee :: FeeVersionNumber { (* obj) . fee_version_number } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_get_uses_version_fee_multiplier_permille < > (obj : * const platform_version_version_fee_FeeVersion) -> * mut u64 { (* obj) . uses_version_fee_multiplier_permille } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_get_storage < > (obj : * const platform_version_version_fee_FeeVersion) -> * mut crate :: fermented :: types :: platform_version :: version :: fee :: storage :: platform_version_version_fee_storage_FeeStorageVersion { (* obj) . storage } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_get_signature < > (obj : * const platform_version_version_fee_FeeVersion) -> * mut crate :: fermented :: types :: platform_version :: version :: fee :: signature :: platform_version_version_fee_signature_FeeSignatureVersion { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_get_hashing < > (obj : * const platform_version_version_fee_FeeVersion) -> * mut crate :: fermented :: types :: platform_version :: version :: fee :: hashing :: platform_version_version_fee_hashing_FeeHashingVersion { (* obj) . hashing } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_get_processing < > (obj : * const platform_version_version_fee_FeeVersion) -> * mut crate :: fermented :: types :: platform_version :: version :: fee :: processing :: platform_version_version_fee_processing_FeeProcessingVersion { (* obj) . processing } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_get_data_contract < > (obj : * const platform_version_version_fee_FeeVersion) -> * mut crate :: fermented :: types :: platform_version :: version :: fee :: data_contract :: platform_version_version_fee_data_contract_FeeDataContractValidationVersion { (* obj) . data_contract } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_get_state_transition_min_fees < > (obj : * const platform_version_version_fee_FeeVersion) -> * mut crate :: fermented :: types :: platform_version :: version :: fee :: state_transition_min_fees :: platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees { (* obj) . state_transition_min_fees } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_get_vote_resolution_fund_fees < > (obj : * const platform_version_version_fee_FeeVersion) -> * mut crate :: fermented :: types :: platform_version :: version :: fee :: vote_resolution_fund_fees :: platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees { (* obj) . vote_resolution_fund_fees } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_set_fee_version_number < > (obj : * const platform_version_version_fee_FeeVersion) -> * mut platform_version :: version :: fee :: FeeVersionNumber { (* obj) . fee_version_number } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_set_uses_version_fee_multiplier_permille < > (obj : * const platform_version_version_fee_FeeVersion) -> * mut u64 { (* obj) . uses_version_fee_multiplier_permille } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_set_storage < > (obj : * const platform_version_version_fee_FeeVersion) -> * mut crate :: fermented :: types :: platform_version :: version :: fee :: storage :: platform_version_version_fee_storage_FeeStorageVersion { (* obj) . storage } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_set_signature < > (obj : * const platform_version_version_fee_FeeVersion) -> * mut crate :: fermented :: types :: platform_version :: version :: fee :: signature :: platform_version_version_fee_signature_FeeSignatureVersion { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_set_hashing < > (obj : * const platform_version_version_fee_FeeVersion) -> * mut crate :: fermented :: types :: platform_version :: version :: fee :: hashing :: platform_version_version_fee_hashing_FeeHashingVersion { (* obj) . hashing } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_set_processing < > (obj : * const platform_version_version_fee_FeeVersion) -> * mut crate :: fermented :: types :: platform_version :: version :: fee :: processing :: platform_version_version_fee_processing_FeeProcessingVersion { (* obj) . processing } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_set_data_contract < > (obj : * const platform_version_version_fee_FeeVersion) -> * mut crate :: fermented :: types :: platform_version :: version :: fee :: data_contract :: platform_version_version_fee_data_contract_FeeDataContractValidationVersion { (* obj) . data_contract } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_set_state_transition_min_fees < > (obj : * const platform_version_version_fee_FeeVersion) -> * mut crate :: fermented :: types :: platform_version :: version :: fee :: state_transition_min_fees :: platform_version_version_fee_state_transition_min_fees_StateTransitionMinFees { (* obj) . state_transition_min_fees } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_FeeVersion_set_vote_resolution_fund_fees < > (obj : * const platform_version_version_fee_FeeVersion) -> * mut crate :: fermented :: types :: platform_version :: version :: fee :: vote_resolution_fund_fees :: platform_version_version_fee_vote_resolution_fund_fees_VoteResolutionFundFees { (* obj) . vote_resolution_fund_fees } pub mod processing { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`FeeProcessingVersion`]"] # [repr (C)] # [derive (Clone)] pub struct platform_version_version_fee_processing_FeeProcessingVersion { pub fetch_identity_balance_processing_cost : u64 , pub fetch_identity_revision_processing_cost : u64 , pub fetch_identity_balance_and_revision_processing_cost : u64 , pub fetch_identity_cost_per_look_up_key_by_id : u64 , pub fetch_identity_token_balance_processing_cost : u64 , pub fetch_prefunded_specialized_balance_processing_cost : u64 , pub fetch_single_identity_key_processing_cost : u64 , pub validate_key_structure : u64 , pub perform_network_threshold_signing : u64 } impl ferment :: FFIConversionFrom < platform_version :: version :: fee :: processing :: FeeProcessingVersion > for platform_version_version_fee_processing_FeeProcessingVersion { unsafe fn ffi_from_const (ffi : * const platform_version_version_fee_processing_FeeProcessingVersion) -> platform_version :: version :: fee :: processing :: FeeProcessingVersion { let ffi_ref = & * ffi ; platform_version :: version :: fee :: processing :: FeeProcessingVersion { fetch_identity_balance_processing_cost : ffi_ref . fetch_identity_balance_processing_cost , fetch_identity_revision_processing_cost : ffi_ref . fetch_identity_revision_processing_cost , fetch_identity_balance_and_revision_processing_cost : ffi_ref . fetch_identity_balance_and_revision_processing_cost , fetch_identity_cost_per_look_up_key_by_id : ffi_ref . fetch_identity_cost_per_look_up_key_by_id , fetch_identity_token_balance_processing_cost : ffi_ref . fetch_identity_token_balance_processing_cost , fetch_prefunded_specialized_balance_processing_cost : ffi_ref . fetch_prefunded_specialized_balance_processing_cost , fetch_single_identity_key_processing_cost : ffi_ref . fetch_single_identity_key_processing_cost , validate_key_structure : ffi_ref . validate_key_structure , perform_network_threshold_signing : ffi_ref . perform_network_threshold_signing } } } impl ferment :: FFIConversionTo < platform_version :: version :: fee :: processing :: FeeProcessingVersion > for platform_version_version_fee_processing_FeeProcessingVersion { unsafe fn ffi_to_const (obj : platform_version :: version :: fee :: processing :: FeeProcessingVersion) -> * const platform_version_version_fee_processing_FeeProcessingVersion { ferment :: boxed (platform_version_version_fee_processing_FeeProcessingVersion { fetch_identity_balance_processing_cost : obj . fetch_identity_balance_processing_cost , fetch_identity_revision_processing_cost : obj . fetch_identity_revision_processing_cost , fetch_identity_balance_and_revision_processing_cost : obj . fetch_identity_balance_and_revision_processing_cost , fetch_identity_cost_per_look_up_key_by_id : obj . fetch_identity_cost_per_look_up_key_by_id , fetch_identity_token_balance_processing_cost : obj . fetch_identity_token_balance_processing_cost , fetch_prefunded_specialized_balance_processing_cost : obj . fetch_prefunded_specialized_balance_processing_cost , fetch_single_identity_key_processing_cost : obj . fetch_single_identity_key_processing_cost , validate_key_structure : obj . validate_key_structure , perform_network_threshold_signing : obj . perform_network_threshold_signing }) } } impl Drop for platform_version_version_fee_processing_FeeProcessingVersion { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ; ; ; ; ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_ctor < > (fetch_identity_balance_processing_cost : u64 , fetch_identity_revision_processing_cost : u64 , fetch_identity_balance_and_revision_processing_cost : u64 , fetch_identity_cost_per_look_up_key_by_id : u64 , fetch_identity_token_balance_processing_cost : u64 , fetch_prefunded_specialized_balance_processing_cost : u64 , fetch_single_identity_key_processing_cost : u64 , validate_key_structure : u64 , perform_network_threshold_signing : u64) -> * mut platform_version_version_fee_processing_FeeProcessingVersion { ferment :: boxed (platform_version_version_fee_processing_FeeProcessingVersion { fetch_identity_balance_processing_cost , fetch_identity_revision_processing_cost , fetch_identity_balance_and_revision_processing_cost , fetch_identity_cost_per_look_up_key_by_id , fetch_identity_token_balance_processing_cost , fetch_prefunded_specialized_balance_processing_cost , fetch_single_identity_key_processing_cost , validate_key_structure , perform_network_threshold_signing }) } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_destroy < > (ffi : * mut platform_version_version_fee_processing_FeeProcessingVersion) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_get_fetch_identity_balance_processing_cost < > (obj : * const platform_version_version_fee_processing_FeeProcessingVersion) -> u64 { (* obj) . fetch_identity_balance_processing_cost } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_get_fetch_identity_revision_processing_cost < > (obj : * const platform_version_version_fee_processing_FeeProcessingVersion) -> u64 { (* obj) . fetch_identity_revision_processing_cost } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_get_fetch_identity_balance_and_revision_processing_cost < > (obj : * const platform_version_version_fee_processing_FeeProcessingVersion) -> u64 { (* obj) . fetch_identity_balance_and_revision_processing_cost } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_get_fetch_identity_cost_per_look_up_key_by_id < > (obj : * const platform_version_version_fee_processing_FeeProcessingVersion) -> u64 { (* obj) . fetch_identity_cost_per_look_up_key_by_id } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_get_fetch_identity_token_balance_processing_cost < > (obj : * const platform_version_version_fee_processing_FeeProcessingVersion) -> u64 { (* obj) . fetch_identity_token_balance_processing_cost } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_get_fetch_prefunded_specialized_balance_processing_cost < > (obj : * const platform_version_version_fee_processing_FeeProcessingVersion) -> u64 { (* obj) . fetch_prefunded_specialized_balance_processing_cost } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_get_fetch_single_identity_key_processing_cost < > (obj : * const platform_version_version_fee_processing_FeeProcessingVersion) -> u64 { (* obj) . fetch_single_identity_key_processing_cost } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_get_validate_key_structure < > (obj : * const platform_version_version_fee_processing_FeeProcessingVersion) -> u64 { (* obj) . validate_key_structure } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_get_perform_network_threshold_signing < > (obj : * const platform_version_version_fee_processing_FeeProcessingVersion) -> u64 { (* obj) . perform_network_threshold_signing } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_set_fetch_identity_balance_processing_cost < > (obj : * const platform_version_version_fee_processing_FeeProcessingVersion) -> u64 { (* obj) . fetch_identity_balance_processing_cost } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_set_fetch_identity_revision_processing_cost < > (obj : * const platform_version_version_fee_processing_FeeProcessingVersion) -> u64 { (* obj) . fetch_identity_revision_processing_cost } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_set_fetch_identity_balance_and_revision_processing_cost < > (obj : * const platform_version_version_fee_processing_FeeProcessingVersion) -> u64 { (* obj) . fetch_identity_balance_and_revision_processing_cost } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_set_fetch_identity_cost_per_look_up_key_by_id < > (obj : * const platform_version_version_fee_processing_FeeProcessingVersion) -> u64 { (* obj) . fetch_identity_cost_per_look_up_key_by_id } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_set_fetch_identity_token_balance_processing_cost < > (obj : * const platform_version_version_fee_processing_FeeProcessingVersion) -> u64 { (* obj) . fetch_identity_token_balance_processing_cost } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_set_fetch_prefunded_specialized_balance_processing_cost < > (obj : * const platform_version_version_fee_processing_FeeProcessingVersion) -> u64 { (* obj) . fetch_prefunded_specialized_balance_processing_cost } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_set_fetch_single_identity_key_processing_cost < > (obj : * const platform_version_version_fee_processing_FeeProcessingVersion) -> u64 { (* obj) . fetch_single_identity_key_processing_cost } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_set_validate_key_structure < > (obj : * const platform_version_version_fee_processing_FeeProcessingVersion) -> u64 { (* obj) . validate_key_structure } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_processing_FeeProcessingVersion_set_perform_network_threshold_signing < > (obj : * const platform_version_version_fee_processing_FeeProcessingVersion) -> u64 { (* obj) . perform_network_threshold_signing } } pub mod signature { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`FeeSignatureVersion`]"] # [repr (C)] # [derive (Clone)] pub struct platform_version_version_fee_signature_FeeSignatureVersion { pub verify_signature_ecdsa_secp256k1 : u64 , pub verify_signature_bls12_381 : u64 , pub verify_signature_ecdsa_hash160 : u64 , pub verify_signature_bip13_script_hash : u64 , pub verify_signature_eddsa25519_hash160 : u64 } impl ferment :: FFIConversionFrom < platform_version :: version :: fee :: signature :: FeeSignatureVersion > for platform_version_version_fee_signature_FeeSignatureVersion { unsafe fn ffi_from_const (ffi : * const platform_version_version_fee_signature_FeeSignatureVersion) -> platform_version :: version :: fee :: signature :: FeeSignatureVersion { let ffi_ref = & * ffi ; platform_version :: version :: fee :: signature :: FeeSignatureVersion { verify_signature_ecdsa_secp256k1 : ffi_ref . verify_signature_ecdsa_secp256k1 , verify_signature_bls12_381 : ffi_ref . verify_signature_bls12_381 , verify_signature_ecdsa_hash160 : ffi_ref . verify_signature_ecdsa_hash160 , verify_signature_bip13_script_hash : ffi_ref . verify_signature_bip13_script_hash , verify_signature_eddsa25519_hash160 : ffi_ref . verify_signature_eddsa25519_hash160 } } } impl ferment :: FFIConversionTo < platform_version :: version :: fee :: signature :: FeeSignatureVersion > for platform_version_version_fee_signature_FeeSignatureVersion { unsafe fn ffi_to_const (obj : platform_version :: version :: fee :: signature :: FeeSignatureVersion) -> * const platform_version_version_fee_signature_FeeSignatureVersion { ferment :: boxed (platform_version_version_fee_signature_FeeSignatureVersion { verify_signature_ecdsa_secp256k1 : obj . verify_signature_ecdsa_secp256k1 , verify_signature_bls12_381 : obj . verify_signature_bls12_381 , verify_signature_ecdsa_hash160 : obj . verify_signature_ecdsa_hash160 , verify_signature_bip13_script_hash : obj . verify_signature_bip13_script_hash , verify_signature_eddsa25519_hash160 : obj . verify_signature_eddsa25519_hash160 }) } } impl Drop for platform_version_version_fee_signature_FeeSignatureVersion { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_signature_FeeSignatureVersion_ctor < > (verify_signature_ecdsa_secp256k1 : u64 , verify_signature_bls12_381 : u64 , verify_signature_ecdsa_hash160 : u64 , verify_signature_bip13_script_hash : u64 , verify_signature_eddsa25519_hash160 : u64) -> * mut platform_version_version_fee_signature_FeeSignatureVersion { ferment :: boxed (platform_version_version_fee_signature_FeeSignatureVersion { verify_signature_ecdsa_secp256k1 , verify_signature_bls12_381 , verify_signature_ecdsa_hash160 , verify_signature_bip13_script_hash , verify_signature_eddsa25519_hash160 }) } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_signature_FeeSignatureVersion_destroy < > (ffi : * mut platform_version_version_fee_signature_FeeSignatureVersion) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_signature_FeeSignatureVersion_get_verify_signature_ecdsa_secp256k1 < > (obj : * const platform_version_version_fee_signature_FeeSignatureVersion) -> u64 { (* obj) . verify_signature_ecdsa_secp256k1 } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_signature_FeeSignatureVersion_get_verify_signature_bls12_381 < > (obj : * const platform_version_version_fee_signature_FeeSignatureVersion) -> u64 { (* obj) . verify_signature_bls12_381 } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_signature_FeeSignatureVersion_get_verify_signature_ecdsa_hash160 < > (obj : * const platform_version_version_fee_signature_FeeSignatureVersion) -> u64 { (* obj) . verify_signature_ecdsa_hash160 } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_signature_FeeSignatureVersion_get_verify_signature_bip13_script_hash < > (obj : * const platform_version_version_fee_signature_FeeSignatureVersion) -> u64 { (* obj) . verify_signature_bip13_script_hash } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_signature_FeeSignatureVersion_get_verify_signature_eddsa25519_hash160 < > (obj : * const platform_version_version_fee_signature_FeeSignatureVersion) -> u64 { (* obj) . verify_signature_eddsa25519_hash160 } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_signature_FeeSignatureVersion_set_verify_signature_ecdsa_secp256k1 < > (obj : * const platform_version_version_fee_signature_FeeSignatureVersion) -> u64 { (* obj) . verify_signature_ecdsa_secp256k1 } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_signature_FeeSignatureVersion_set_verify_signature_bls12_381 < > (obj : * const platform_version_version_fee_signature_FeeSignatureVersion) -> u64 { (* obj) . verify_signature_bls12_381 } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_signature_FeeSignatureVersion_set_verify_signature_ecdsa_hash160 < > (obj : * const platform_version_version_fee_signature_FeeSignatureVersion) -> u64 { (* obj) . verify_signature_ecdsa_hash160 } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_signature_FeeSignatureVersion_set_verify_signature_bip13_script_hash < > (obj : * const platform_version_version_fee_signature_FeeSignatureVersion) -> u64 { (* obj) . verify_signature_bip13_script_hash } # [no_mangle] pub unsafe extern "C" fn platform_version_version_fee_signature_FeeSignatureVersion_set_verify_signature_eddsa25519_hash160 < > (obj : * const platform_version_version_fee_signature_FeeSignatureVersion) -> u64 { (* obj) . verify_signature_eddsa25519_hash160 } } } pub mod dpp_versions { use crate as dash_spv_apple_bindings ; pub mod dpp_state_transition_conversion_versions { use crate as dash_spv_apple_bindings ; } pub mod dpp_voting_versions { use crate as dash_spv_apple_bindings ; } pub mod dpp_method_versions { use crate as dash_spv_apple_bindings ; } pub mod dpp_token_versions { use crate as dash_spv_apple_bindings ; } pub mod dpp_costs_versions { use crate as dash_spv_apple_bindings ; } pub mod dpp_state_transition_method_versions { use crate as dash_spv_apple_bindings ; } pub mod dpp_state_transition_serialization_versions { use crate as dash_spv_apple_bindings ; } pub mod dpp_state_transition_versions { use crate as dash_spv_apple_bindings ; } pub mod dpp_asset_lock_versions { use crate as dash_spv_apple_bindings ; } pub mod dpp_contract_versions { use crate as dash_spv_apple_bindings ; } pub mod dpp_factory_versions { use crate as dash_spv_apple_bindings ; } pub mod dpp_validation_versions { use crate as dash_spv_apple_bindings ; } pub mod dpp_identity_versions { use crate as dash_spv_apple_bindings ; } pub mod dpp_document_versions { use crate as dash_spv_apple_bindings ; } } # [cfg (feature = "mock-versions")] pub mod mocks { use crate as dash_spv_apple_bindings ; } } } pub mod rs_dapi_client { use crate as dash_spv_apple_bindings ; pub mod transport { use crate as dash_spv_apple_bindings ; } } pub mod dashcore { use crate as dash_spv_apple_bindings ; pub mod amount { use crate as dash_spv_apple_bindings ; # [cfg (feature = "serde")] pub mod serde { use crate as dash_spv_apple_bindings ; pub mod as_sat { use crate as dash_spv_apple_bindings ; } pub mod as_btc { use crate as dash_spv_apple_bindings ; } } } pub mod network { use crate as dash_spv_apple_bindings ; pub mod constants { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "std")] pub mod message_network { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "std")] pub mod message { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "std")] pub mod address { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "std")] pub mod message_blockdata { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "std")] pub mod message_sml { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "std")] pub mod message_qrinfo { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`QuorumSnapshot`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_network_message_qrinfo_QuorumSnapshot { pub skip_list_mode : * mut crate :: fermented :: types :: dashcore :: network :: message_qrinfo :: dashcore_network_message_qrinfo_MNSkipListMode , pub active_quorum_members : * mut crate :: fermented :: generics :: Vec_bool , pub skip_list : * mut crate :: fermented :: generics :: Vec_u32 } impl ferment :: FFIConversionFrom < dashcore :: network :: message_qrinfo :: QuorumSnapshot > for dashcore_network_message_qrinfo_QuorumSnapshot { unsafe fn ffi_from_const (ffi : * const dashcore_network_message_qrinfo_QuorumSnapshot) -> dashcore :: network :: message_qrinfo :: QuorumSnapshot { let ffi_ref = & * ffi ; dashcore :: network :: message_qrinfo :: QuorumSnapshot { skip_list_mode : < crate :: fermented :: types :: dashcore :: network :: message_qrinfo :: dashcore_network_message_qrinfo_MNSkipListMode as ferment :: FFIConversionFrom < dashcore :: network :: message_qrinfo :: MNSkipListMode >> :: ffi_from (ffi_ref . skip_list_mode) , active_quorum_members : < crate :: fermented :: generics :: Vec_bool as ferment :: FFIConversionFrom < Vec < bool > >> :: ffi_from (ffi_ref . active_quorum_members) , skip_list : < crate :: fermented :: generics :: Vec_u32 as ferment :: FFIConversionFrom < Vec < u32 > >> :: ffi_from (ffi_ref . skip_list) } } } impl ferment :: FFIConversionTo < dashcore :: network :: message_qrinfo :: QuorumSnapshot > for dashcore_network_message_qrinfo_QuorumSnapshot { unsafe fn ffi_to_const (obj : dashcore :: network :: message_qrinfo :: QuorumSnapshot) -> * const dashcore_network_message_qrinfo_QuorumSnapshot { ferment :: boxed (dashcore_network_message_qrinfo_QuorumSnapshot { skip_list_mode : < crate :: fermented :: types :: dashcore :: network :: message_qrinfo :: dashcore_network_message_qrinfo_MNSkipListMode as ferment :: FFIConversionTo < dashcore :: network :: message_qrinfo :: MNSkipListMode >> :: ffi_to (obj . skip_list_mode) , active_quorum_members : < crate :: fermented :: generics :: Vec_bool as ferment :: FFIConversionTo < Vec < bool > >> :: ffi_to (obj . active_quorum_members) , skip_list : < crate :: fermented :: generics :: Vec_u32 as ferment :: FFIConversionTo < Vec < u32 > >> :: ffi_to (obj . skip_list) }) } } impl Drop for dashcore_network_message_qrinfo_QuorumSnapshot { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . skip_list_mode) ; ferment :: unbox_any (ffi_ref . active_quorum_members) ; ferment :: unbox_any (ffi_ref . skip_list) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_network_message_qrinfo_QuorumSnapshot_ctor < > (skip_list_mode : * mut crate :: fermented :: types :: dashcore :: network :: message_qrinfo :: dashcore_network_message_qrinfo_MNSkipListMode , active_quorum_members : * mut crate :: fermented :: generics :: Vec_bool , skip_list : * mut crate :: fermented :: generics :: Vec_u32) -> * mut dashcore_network_message_qrinfo_QuorumSnapshot { ferment :: boxed (dashcore_network_message_qrinfo_QuorumSnapshot { skip_list_mode , active_quorum_members , skip_list }) } # [no_mangle] pub unsafe extern "C" fn dashcore_network_message_qrinfo_QuorumSnapshot_destroy < > (ffi : * mut dashcore_network_message_qrinfo_QuorumSnapshot) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_network_message_qrinfo_QuorumSnapshot_get_skip_list_mode < > (obj : * const dashcore_network_message_qrinfo_QuorumSnapshot) -> * mut crate :: fermented :: types :: dashcore :: network :: message_qrinfo :: dashcore_network_message_qrinfo_MNSkipListMode { (* obj) . skip_list_mode } # [no_mangle] pub unsafe extern "C" fn dashcore_network_message_qrinfo_QuorumSnapshot_get_active_quorum_members < > (obj : * const dashcore_network_message_qrinfo_QuorumSnapshot) -> * mut crate :: fermented :: generics :: Vec_bool { (* obj) . active_quorum_members } # [no_mangle] pub unsafe extern "C" fn dashcore_network_message_qrinfo_QuorumSnapshot_get_skip_list < > (obj : * const dashcore_network_message_qrinfo_QuorumSnapshot) -> * mut crate :: fermented :: generics :: Vec_u32 { (* obj) . skip_list } # [no_mangle] pub unsafe extern "C" fn dashcore_network_message_qrinfo_QuorumSnapshot_set_skip_list_mode < > (obj : * const dashcore_network_message_qrinfo_QuorumSnapshot) -> * mut crate :: fermented :: types :: dashcore :: network :: message_qrinfo :: dashcore_network_message_qrinfo_MNSkipListMode { (* obj) . skip_list_mode } # [no_mangle] pub unsafe extern "C" fn dashcore_network_message_qrinfo_QuorumSnapshot_set_active_quorum_members < > (obj : * const dashcore_network_message_qrinfo_QuorumSnapshot) -> * mut crate :: fermented :: generics :: Vec_bool { (* obj) . active_quorum_members } # [no_mangle] pub unsafe extern "C" fn dashcore_network_message_qrinfo_QuorumSnapshot_set_skip_list < > (obj : * const dashcore_network_message_qrinfo_QuorumSnapshot) -> * mut crate :: fermented :: generics :: Vec_u32 { (* obj) . skip_list } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`MNSkipListMode`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dashcore_network_message_qrinfo_MNSkipListMode { NoSkipping = 0 , SkipFirst = 1 , SkipExcept = 2 , SkipAll = 3 } impl ferment :: FFIConversionFrom < dashcore :: network :: message_qrinfo :: MNSkipListMode > for dashcore_network_message_qrinfo_MNSkipListMode { unsafe fn ffi_from_const (ffi : * const dashcore_network_message_qrinfo_MNSkipListMode) -> dashcore :: network :: message_qrinfo :: MNSkipListMode { let ffi_ref = & * ffi ; match ffi_ref { dashcore_network_message_qrinfo_MNSkipListMode :: NoSkipping => dashcore :: network :: message_qrinfo :: MNSkipListMode :: NoSkipping , dashcore_network_message_qrinfo_MNSkipListMode :: SkipFirst => dashcore :: network :: message_qrinfo :: MNSkipListMode :: SkipFirst , dashcore_network_message_qrinfo_MNSkipListMode :: SkipExcept => dashcore :: network :: message_qrinfo :: MNSkipListMode :: SkipExcept , dashcore_network_message_qrinfo_MNSkipListMode :: SkipAll => dashcore :: network :: message_qrinfo :: MNSkipListMode :: SkipAll } } } impl ferment :: FFIConversionTo < dashcore :: network :: message_qrinfo :: MNSkipListMode > for dashcore_network_message_qrinfo_MNSkipListMode { unsafe fn ffi_to_const (obj : dashcore :: network :: message_qrinfo :: MNSkipListMode) -> * const dashcore_network_message_qrinfo_MNSkipListMode { ferment :: boxed (match obj { dashcore :: network :: message_qrinfo :: MNSkipListMode :: NoSkipping => dashcore_network_message_qrinfo_MNSkipListMode :: NoSkipping , dashcore :: network :: message_qrinfo :: MNSkipListMode :: SkipFirst => dashcore_network_message_qrinfo_MNSkipListMode :: SkipFirst , dashcore :: network :: message_qrinfo :: MNSkipListMode :: SkipExcept => dashcore_network_message_qrinfo_MNSkipListMode :: SkipExcept , dashcore :: network :: message_qrinfo :: MNSkipListMode :: SkipAll => dashcore_network_message_qrinfo_MNSkipListMode :: SkipAll , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dashcore_network_message_qrinfo_MNSkipListMode { fn drop (& mut self) { unsafe { match self { dashcore_network_message_qrinfo_MNSkipListMode :: NoSkipping => { } , dashcore_network_message_qrinfo_MNSkipListMode :: SkipFirst => { } , dashcore_network_message_qrinfo_MNSkipListMode :: SkipExcept => { } , dashcore_network_message_qrinfo_MNSkipListMode :: SkipAll => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_network_message_qrinfo_MNSkipListMode_NoSkipping_ctor () -> * mut dashcore_network_message_qrinfo_MNSkipListMode { ferment :: boxed (dashcore_network_message_qrinfo_MNSkipListMode :: NoSkipping { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_network_message_qrinfo_MNSkipListMode_SkipFirst_ctor () -> * mut dashcore_network_message_qrinfo_MNSkipListMode { ferment :: boxed (dashcore_network_message_qrinfo_MNSkipListMode :: SkipFirst { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_network_message_qrinfo_MNSkipListMode_SkipExcept_ctor () -> * mut dashcore_network_message_qrinfo_MNSkipListMode { ferment :: boxed (dashcore_network_message_qrinfo_MNSkipListMode :: SkipExcept { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_network_message_qrinfo_MNSkipListMode_SkipAll_ctor () -> * mut dashcore_network_message_qrinfo_MNSkipListMode { ferment :: boxed (dashcore_network_message_qrinfo_MNSkipListMode :: SkipAll { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_network_message_qrinfo_MNSkipListMode_destroy < > (ffi : * mut dashcore_network_message_qrinfo_MNSkipListMode) { ferment :: unbox_any (ffi) ; } } } pub mod prelude { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`CoreBlockHeight`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_prelude_CoreBlockHeight (u32) ; impl ferment :: FFIConversionFrom < dashcore :: prelude :: CoreBlockHeight > for dashcore_prelude_CoreBlockHeight { unsafe fn ffi_from_const (ffi : * const dashcore_prelude_CoreBlockHeight) -> dashcore :: prelude :: CoreBlockHeight { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dashcore :: prelude :: CoreBlockHeight > for dashcore_prelude_CoreBlockHeight { unsafe fn ffi_to_const (obj : dashcore :: prelude :: CoreBlockHeight) -> * const dashcore_prelude_CoreBlockHeight { ferment :: boxed (dashcore_prelude_CoreBlockHeight (obj)) } } impl Drop for dashcore_prelude_CoreBlockHeight { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_prelude_CoreBlockHeight_ctor < > (o_0 : u32) -> * mut dashcore_prelude_CoreBlockHeight { ferment :: boxed (dashcore_prelude_CoreBlockHeight (o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_prelude_CoreBlockHeight_destroy < > (ffi : * mut dashcore_prelude_CoreBlockHeight) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_prelude_CoreBlockHeight_get_0 < > (obj : * const dashcore_prelude_CoreBlockHeight) -> u32 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dashcore_prelude_CoreBlockHeight_set_0 < > (obj : * const dashcore_prelude_CoreBlockHeight) -> u32 { (* obj) . 0 } } pub mod sml { use crate as dash_spv_apple_bindings ; pub mod masternode_list_engine { use crate as dash_spv_apple_bindings ; # [cfg (feature = "message_verification")] pub mod message_request_verification { use crate as dash_spv_apple_bindings ; } } pub mod masternode_list_entry { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MasternodeListEntry`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_sml_masternode_list_entry_MasternodeListEntry { pub version : u16 , pub pro_reg_tx_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash , pub confirmed_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ConfirmedHash , pub service_address : * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr , pub operator_public_key : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey , pub key_id_voting : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash , pub is_valid : bool , pub mn_type : * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: dashcore_sml_masternode_list_entry_EntryMasternodeType } impl ferment :: FFIConversionFrom < dashcore :: sml :: masternode_list_entry :: MasternodeListEntry > for dashcore_sml_masternode_list_entry_MasternodeListEntry { unsafe fn ffi_from_const (ffi : * const dashcore_sml_masternode_list_entry_MasternodeListEntry) -> dashcore :: sml :: masternode_list_entry :: MasternodeListEntry { let ffi_ref = & * ffi ; dashcore :: sml :: masternode_list_entry :: MasternodeListEntry { version : ffi_ref . version , pro_reg_tx_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: ProTxHash >> :: ffi_from (ffi_ref . pro_reg_tx_hash) , confirmed_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ConfirmedHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: ConfirmedHash >> :: ffi_from_opt (ffi_ref . confirmed_hash) , service_address : < dash_spv_apple_bindings :: custom :: std :: SocketAddr as ferment :: FFIConversionFrom < std :: net :: SocketAddr >> :: ffi_from (ffi_ref . service_address) , operator_public_key : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey as ferment :: FFIConversionFrom < dashcore :: bls_sig_utils :: BLSPublicKey >> :: ffi_from (ffi_ref . operator_public_key) , key_id_voting : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: PubkeyHash >> :: ffi_from (ffi_ref . key_id_voting) , is_valid : ffi_ref . is_valid , mn_type : < crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: dashcore_sml_masternode_list_entry_EntryMasternodeType as ferment :: FFIConversionFrom < dashcore :: sml :: masternode_list_entry :: EntryMasternodeType >> :: ffi_from (ffi_ref . mn_type) } } } impl ferment :: FFIConversionTo < dashcore :: sml :: masternode_list_entry :: MasternodeListEntry > for dashcore_sml_masternode_list_entry_MasternodeListEntry { unsafe fn ffi_to_const (obj : dashcore :: sml :: masternode_list_entry :: MasternodeListEntry) -> * const dashcore_sml_masternode_list_entry_MasternodeListEntry { ferment :: boxed (dashcore_sml_masternode_list_entry_MasternodeListEntry { version : obj . version , pro_reg_tx_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash as ferment :: FFIConversionTo < dashcore :: hash_types :: ProTxHash >> :: ffi_to (obj . pro_reg_tx_hash) , confirmed_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ConfirmedHash as ferment :: FFIConversionTo < dashcore :: hash_types :: ConfirmedHash >> :: ffi_to_opt (obj . confirmed_hash) , service_address : < dash_spv_apple_bindings :: custom :: std :: SocketAddr as ferment :: FFIConversionTo < std :: net :: SocketAddr >> :: ffi_to (obj . service_address) , operator_public_key : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey as ferment :: FFIConversionTo < dashcore :: bls_sig_utils :: BLSPublicKey >> :: ffi_to (obj . operator_public_key) , key_id_voting : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash as ferment :: FFIConversionTo < dashcore :: hash_types :: PubkeyHash >> :: ffi_to (obj . key_id_voting) , is_valid : obj . is_valid , mn_type : < crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: dashcore_sml_masternode_list_entry_EntryMasternodeType as ferment :: FFIConversionTo < dashcore :: sml :: masternode_list_entry :: EntryMasternodeType >> :: ffi_to (obj . mn_type) }) } } impl Drop for dashcore_sml_masternode_list_entry_MasternodeListEntry { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . pro_reg_tx_hash) ; ferment :: unbox_any_opt (ffi_ref . confirmed_hash) ; ferment :: unbox_any (ffi_ref . service_address) ; ferment :: unbox_any (ffi_ref . operator_public_key) ; ferment :: unbox_any (ffi_ref . key_id_voting) ; ; ferment :: unbox_any (ffi_ref . mn_type) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_MasternodeListEntry_ctor < > (version : u16 , pro_reg_tx_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash , confirmed_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ConfirmedHash , service_address : * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr , operator_public_key : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey , key_id_voting : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash , is_valid : bool , mn_type : * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: dashcore_sml_masternode_list_entry_EntryMasternodeType) -> * mut dashcore_sml_masternode_list_entry_MasternodeListEntry { ferment :: boxed (dashcore_sml_masternode_list_entry_MasternodeListEntry { version , pro_reg_tx_hash , confirmed_hash , service_address , operator_public_key , key_id_voting , is_valid , mn_type }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_MasternodeListEntry_destroy < > (ffi : * mut dashcore_sml_masternode_list_entry_MasternodeListEntry) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_MasternodeListEntry_get_version < > (obj : * const dashcore_sml_masternode_list_entry_MasternodeListEntry) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_MasternodeListEntry_get_pro_reg_tx_hash < > (obj : * const dashcore_sml_masternode_list_entry_MasternodeListEntry) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash { (* obj) . pro_reg_tx_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_MasternodeListEntry_get_confirmed_hash < > (obj : * const dashcore_sml_masternode_list_entry_MasternodeListEntry) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ConfirmedHash { (* obj) . confirmed_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_MasternodeListEntry_get_service_address < > (obj : * const dashcore_sml_masternode_list_entry_MasternodeListEntry) -> * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr { (* obj) . service_address } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_MasternodeListEntry_get_operator_public_key < > (obj : * const dashcore_sml_masternode_list_entry_MasternodeListEntry) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey { (* obj) . operator_public_key } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_MasternodeListEntry_get_key_id_voting < > (obj : * const dashcore_sml_masternode_list_entry_MasternodeListEntry) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash { (* obj) . key_id_voting } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_MasternodeListEntry_get_is_valid < > (obj : * const dashcore_sml_masternode_list_entry_MasternodeListEntry) -> bool { (* obj) . is_valid } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_MasternodeListEntry_get_mn_type < > (obj : * const dashcore_sml_masternode_list_entry_MasternodeListEntry) -> * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: dashcore_sml_masternode_list_entry_EntryMasternodeType { (* obj) . mn_type } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_MasternodeListEntry_set_version < > (obj : * const dashcore_sml_masternode_list_entry_MasternodeListEntry) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_MasternodeListEntry_set_pro_reg_tx_hash < > (obj : * const dashcore_sml_masternode_list_entry_MasternodeListEntry) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash { (* obj) . pro_reg_tx_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_MasternodeListEntry_set_confirmed_hash < > (obj : * const dashcore_sml_masternode_list_entry_MasternodeListEntry) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ConfirmedHash { (* obj) . confirmed_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_MasternodeListEntry_set_service_address < > (obj : * const dashcore_sml_masternode_list_entry_MasternodeListEntry) -> * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr { (* obj) . service_address } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_MasternodeListEntry_set_operator_public_key < > (obj : * const dashcore_sml_masternode_list_entry_MasternodeListEntry) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey { (* obj) . operator_public_key } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_MasternodeListEntry_set_key_id_voting < > (obj : * const dashcore_sml_masternode_list_entry_MasternodeListEntry) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash { (* obj) . key_id_voting } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_MasternodeListEntry_set_is_valid < > (obj : * const dashcore_sml_masternode_list_entry_MasternodeListEntry) -> bool { (* obj) . is_valid } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_MasternodeListEntry_set_mn_type < > (obj : * const dashcore_sml_masternode_list_entry_MasternodeListEntry) -> * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: dashcore_sml_masternode_list_entry_EntryMasternodeType { (* obj) . mn_type } pub mod qualified_masternode_list_entry { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`QualifiedMasternodeListEntry`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { pub masternode_list_entry : * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: dashcore_sml_masternode_list_entry_MasternodeListEntry , pub entry_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Sha256dHash , pub confirmed_hash_hashed_with_pro_reg_tx : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ConfirmedHashHashedWithProRegTx } impl ferment :: FFIConversionFrom < dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry > for dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { unsafe fn ffi_from_const (ffi : * const dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry) -> dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry { let ffi_ref = & * ffi ; dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry { masternode_list_entry : < crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: dashcore_sml_masternode_list_entry_MasternodeListEntry as ferment :: FFIConversionFrom < dashcore :: sml :: masternode_list_entry :: MasternodeListEntry >> :: ffi_from (ffi_ref . masternode_list_entry) , entry_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Sha256dHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: Sha256dHash >> :: ffi_from (ffi_ref . entry_hash) , confirmed_hash_hashed_with_pro_reg_tx : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ConfirmedHashHashedWithProRegTx as ferment :: FFIConversionFrom < dashcore :: hash_types :: ConfirmedHashHashedWithProRegTx >> :: ffi_from_opt (ffi_ref . confirmed_hash_hashed_with_pro_reg_tx) } } } impl ferment :: FFIConversionTo < dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry > for dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { unsafe fn ffi_to_const (obj : dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry) -> * const dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { ferment :: boxed (dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { masternode_list_entry : < crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: dashcore_sml_masternode_list_entry_MasternodeListEntry as ferment :: FFIConversionTo < dashcore :: sml :: masternode_list_entry :: MasternodeListEntry >> :: ffi_to (obj . masternode_list_entry) , entry_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Sha256dHash as ferment :: FFIConversionTo < dashcore :: hash_types :: Sha256dHash >> :: ffi_to (obj . entry_hash) , confirmed_hash_hashed_with_pro_reg_tx : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ConfirmedHashHashedWithProRegTx as ferment :: FFIConversionTo < dashcore :: hash_types :: ConfirmedHashHashedWithProRegTx >> :: ffi_to_opt (obj . confirmed_hash_hashed_with_pro_reg_tx) }) } } impl Drop for dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . masternode_list_entry) ; ferment :: unbox_any (ffi_ref . entry_hash) ; ferment :: unbox_any_opt (ffi_ref . confirmed_hash_hashed_with_pro_reg_tx) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_ctor < > (masternode_list_entry : * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: dashcore_sml_masternode_list_entry_MasternodeListEntry , entry_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Sha256dHash , confirmed_hash_hashed_with_pro_reg_tx : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ConfirmedHashHashedWithProRegTx) -> * mut dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { ferment :: boxed (dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { masternode_list_entry , entry_hash , confirmed_hash_hashed_with_pro_reg_tx }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_destroy < > (ffi : * mut dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_get_masternode_list_entry < > (obj : * const dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry) -> * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: dashcore_sml_masternode_list_entry_MasternodeListEntry { (* obj) . masternode_list_entry } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_get_entry_hash < > (obj : * const dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Sha256dHash { (* obj) . entry_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_get_confirmed_hash_hashed_with_pro_reg_tx < > (obj : * const dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ConfirmedHashHashedWithProRegTx { (* obj) . confirmed_hash_hashed_with_pro_reg_tx } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_set_masternode_list_entry < > (obj : * const dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry) -> * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: dashcore_sml_masternode_list_entry_MasternodeListEntry { (* obj) . masternode_list_entry } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_set_entry_hash < > (obj : * const dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Sha256dHash { (* obj) . entry_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_set_confirmed_hash_hashed_with_pro_reg_tx < > (obj : * const dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ConfirmedHashHashedWithProRegTx { (* obj) . confirmed_hash_hashed_with_pro_reg_tx } } # [doc = "FFI-representation of the [`OperatorPublicKey`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_sml_masternode_list_entry_OperatorPublicKey { pub data : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey , pub version : u16 } impl ferment :: FFIConversionFrom < dashcore :: sml :: masternode_list_entry :: OperatorPublicKey > for dashcore_sml_masternode_list_entry_OperatorPublicKey { unsafe fn ffi_from_const (ffi : * const dashcore_sml_masternode_list_entry_OperatorPublicKey) -> dashcore :: sml :: masternode_list_entry :: OperatorPublicKey { let ffi_ref = & * ffi ; dashcore :: sml :: masternode_list_entry :: OperatorPublicKey { data : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey as ferment :: FFIConversionFrom < dashcore :: bls_sig_utils :: BLSPublicKey >> :: ffi_from (ffi_ref . data) , version : ffi_ref . version } } } impl ferment :: FFIConversionTo < dashcore :: sml :: masternode_list_entry :: OperatorPublicKey > for dashcore_sml_masternode_list_entry_OperatorPublicKey { unsafe fn ffi_to_const (obj : dashcore :: sml :: masternode_list_entry :: OperatorPublicKey) -> * const dashcore_sml_masternode_list_entry_OperatorPublicKey { ferment :: boxed (dashcore_sml_masternode_list_entry_OperatorPublicKey { data : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey as ferment :: FFIConversionTo < dashcore :: bls_sig_utils :: BLSPublicKey >> :: ffi_to (obj . data) , version : obj . version }) } } impl Drop for dashcore_sml_masternode_list_entry_OperatorPublicKey { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_OperatorPublicKey_ctor < > (data : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey , version : u16) -> * mut dashcore_sml_masternode_list_entry_OperatorPublicKey { ferment :: boxed (dashcore_sml_masternode_list_entry_OperatorPublicKey { data , version }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_OperatorPublicKey_destroy < > (ffi : * mut dashcore_sml_masternode_list_entry_OperatorPublicKey) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_OperatorPublicKey_get_data < > (obj : * const dashcore_sml_masternode_list_entry_OperatorPublicKey) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey { (* obj) . data } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_OperatorPublicKey_get_version < > (obj : * const dashcore_sml_masternode_list_entry_OperatorPublicKey) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_OperatorPublicKey_set_data < > (obj : * const dashcore_sml_masternode_list_entry_OperatorPublicKey) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey { (* obj) . data } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_OperatorPublicKey_set_version < > (obj : * const dashcore_sml_masternode_list_entry_OperatorPublicKey) -> u16 { (* obj) . version } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`EntryMasternodeType`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dashcore_sml_masternode_list_entry_EntryMasternodeType { Regular , HighPerformance { platform_http_port : u16 , platform_node_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash } } impl ferment :: FFIConversionFrom < dashcore :: sml :: masternode_list_entry :: EntryMasternodeType > for dashcore_sml_masternode_list_entry_EntryMasternodeType { unsafe fn ffi_from_const (ffi : * const dashcore_sml_masternode_list_entry_EntryMasternodeType) -> dashcore :: sml :: masternode_list_entry :: EntryMasternodeType { let ffi_ref = & * ffi ; match ffi_ref { dashcore_sml_masternode_list_entry_EntryMasternodeType :: Regular => dashcore :: sml :: masternode_list_entry :: EntryMasternodeType :: Regular , dashcore_sml_masternode_list_entry_EntryMasternodeType :: HighPerformance { platform_http_port , platform_node_id } => dashcore :: sml :: masternode_list_entry :: EntryMasternodeType :: HighPerformance { platform_http_port : * platform_http_port , platform_node_id : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: PubkeyHash >> :: ffi_from (* platform_node_id) } } } } impl ferment :: FFIConversionTo < dashcore :: sml :: masternode_list_entry :: EntryMasternodeType > for dashcore_sml_masternode_list_entry_EntryMasternodeType { unsafe fn ffi_to_const (obj : dashcore :: sml :: masternode_list_entry :: EntryMasternodeType) -> * const dashcore_sml_masternode_list_entry_EntryMasternodeType { ferment :: boxed (match obj { dashcore :: sml :: masternode_list_entry :: EntryMasternodeType :: Regular => dashcore_sml_masternode_list_entry_EntryMasternodeType :: Regular , dashcore :: sml :: masternode_list_entry :: EntryMasternodeType :: HighPerformance { platform_http_port , platform_node_id } => dashcore_sml_masternode_list_entry_EntryMasternodeType :: HighPerformance { platform_http_port : platform_http_port , platform_node_id : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash as ferment :: FFIConversionTo < dashcore :: hash_types :: PubkeyHash >> :: ffi_to (platform_node_id) } , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dashcore_sml_masternode_list_entry_EntryMasternodeType { fn drop (& mut self) { unsafe { match self { dashcore_sml_masternode_list_entry_EntryMasternodeType :: Regular => { } , dashcore_sml_masternode_list_entry_EntryMasternodeType :: HighPerformance { platform_http_port , platform_node_id } => { ; ; ferment :: unbox_any (* platform_node_id) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_EntryMasternodeType_Regular_ctor () -> * mut dashcore_sml_masternode_list_entry_EntryMasternodeType { ferment :: boxed (dashcore_sml_masternode_list_entry_EntryMasternodeType :: Regular { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_EntryMasternodeType_HighPerformance_ctor (platform_http_port : u16 , platform_node_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash) -> * mut dashcore_sml_masternode_list_entry_EntryMasternodeType { ferment :: boxed (dashcore_sml_masternode_list_entry_EntryMasternodeType :: HighPerformance { platform_http_port , platform_node_id }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_entry_EntryMasternodeType_destroy < > (ffi : * mut dashcore_sml_masternode_list_entry_EntryMasternodeType) { ferment :: unbox_any (ffi) ; } } pub mod error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`SmlError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dashcore_sml_error_SmlError { BaseBlockNotGenesis (* mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) , BlockHashLookupFailed (* mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) , IncompleteMnListDiff , MissingStartMasternodeList (* mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) , BaseBlockHashMismatch { expected : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash , found : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash } , UnknownError , CorruptedCodeExecution (* mut std :: os :: raw :: c_char) , FeatureNotTurnedOn (* mut std :: os :: raw :: c_char) , InvalidIndexInSignatureSet (u16) , IncompleteSignatureSet } impl ferment :: FFIConversionFrom < dashcore :: sml :: error :: SmlError > for dashcore_sml_error_SmlError { unsafe fn ffi_from_const (ffi : * const dashcore_sml_error_SmlError) -> dashcore :: sml :: error :: SmlError { let ffi_ref = & * ffi ; match ffi_ref { dashcore_sml_error_SmlError :: BaseBlockNotGenesis (o_0) => dashcore :: sml :: error :: SmlError :: BaseBlockNotGenesis (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: BlockHash >> :: ffi_from (* o_0)) , dashcore_sml_error_SmlError :: BlockHashLookupFailed (o_0) => dashcore :: sml :: error :: SmlError :: BlockHashLookupFailed (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: BlockHash >> :: ffi_from (* o_0)) , dashcore_sml_error_SmlError :: IncompleteMnListDiff => dashcore :: sml :: error :: SmlError :: IncompleteMnListDiff , dashcore_sml_error_SmlError :: MissingStartMasternodeList (o_0) => dashcore :: sml :: error :: SmlError :: MissingStartMasternodeList (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: BlockHash >> :: ffi_from (* o_0)) , dashcore_sml_error_SmlError :: BaseBlockHashMismatch { expected , found } => dashcore :: sml :: error :: SmlError :: BaseBlockHashMismatch { expected : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: BlockHash >> :: ffi_from (* expected) , found : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: BlockHash >> :: ffi_from (* found) } , dashcore_sml_error_SmlError :: UnknownError => dashcore :: sml :: error :: SmlError :: UnknownError , dashcore_sml_error_SmlError :: CorruptedCodeExecution (o_0) => dashcore :: sml :: error :: SmlError :: CorruptedCodeExecution (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dashcore_sml_error_SmlError :: FeatureNotTurnedOn (o_0) => dashcore :: sml :: error :: SmlError :: FeatureNotTurnedOn (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dashcore_sml_error_SmlError :: InvalidIndexInSignatureSet (o_0) => dashcore :: sml :: error :: SmlError :: InvalidIndexInSignatureSet (* o_0) , dashcore_sml_error_SmlError :: IncompleteSignatureSet => dashcore :: sml :: error :: SmlError :: IncompleteSignatureSet } } } impl ferment :: FFIConversionTo < dashcore :: sml :: error :: SmlError > for dashcore_sml_error_SmlError { unsafe fn ffi_to_const (obj : dashcore :: sml :: error :: SmlError) -> * const dashcore_sml_error_SmlError { ferment :: boxed (match obj { dashcore :: sml :: error :: SmlError :: BaseBlockNotGenesis (o_0) => dashcore_sml_error_SmlError :: BaseBlockNotGenesis (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionTo < dashcore :: hash_types :: BlockHash >> :: ffi_to (o_0)) , dashcore :: sml :: error :: SmlError :: BlockHashLookupFailed (o_0) => dashcore_sml_error_SmlError :: BlockHashLookupFailed (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionTo < dashcore :: hash_types :: BlockHash >> :: ffi_to (o_0)) , dashcore :: sml :: error :: SmlError :: IncompleteMnListDiff => dashcore_sml_error_SmlError :: IncompleteMnListDiff , dashcore :: sml :: error :: SmlError :: MissingStartMasternodeList (o_0) => dashcore_sml_error_SmlError :: MissingStartMasternodeList (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionTo < dashcore :: hash_types :: BlockHash >> :: ffi_to (o_0)) , dashcore :: sml :: error :: SmlError :: BaseBlockHashMismatch { expected , found } => dashcore_sml_error_SmlError :: BaseBlockHashMismatch { expected : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionTo < dashcore :: hash_types :: BlockHash >> :: ffi_to (expected) , found : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionTo < dashcore :: hash_types :: BlockHash >> :: ffi_to (found) } , dashcore :: sml :: error :: SmlError :: UnknownError => dashcore_sml_error_SmlError :: UnknownError , dashcore :: sml :: error :: SmlError :: CorruptedCodeExecution (o_0) => dashcore_sml_error_SmlError :: CorruptedCodeExecution (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dashcore :: sml :: error :: SmlError :: FeatureNotTurnedOn (o_0) => dashcore_sml_error_SmlError :: FeatureNotTurnedOn (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dashcore :: sml :: error :: SmlError :: InvalidIndexInSignatureSet (o_0) => dashcore_sml_error_SmlError :: InvalidIndexInSignatureSet (o_0) , dashcore :: sml :: error :: SmlError :: IncompleteSignatureSet => dashcore_sml_error_SmlError :: IncompleteSignatureSet , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dashcore_sml_error_SmlError { fn drop (& mut self) { unsafe { match self { dashcore_sml_error_SmlError :: BaseBlockNotGenesis (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_sml_error_SmlError :: BlockHashLookupFailed (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_sml_error_SmlError :: IncompleteMnListDiff => { } , dashcore_sml_error_SmlError :: MissingStartMasternodeList (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_sml_error_SmlError :: BaseBlockHashMismatch { expected , found } => { ferment :: unbox_any (* expected) ; ; ferment :: unbox_any (* found) ; } , dashcore_sml_error_SmlError :: UnknownError => { } , dashcore_sml_error_SmlError :: CorruptedCodeExecution (o_0) => { ferment :: unbox_string (* o_0) ; } , dashcore_sml_error_SmlError :: FeatureNotTurnedOn (o_0) => { ferment :: unbox_string (* o_0) ; } , dashcore_sml_error_SmlError :: InvalidIndexInSignatureSet (o_0) => { ; } , dashcore_sml_error_SmlError :: IncompleteSignatureSet => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_error_SmlError_BaseBlockNotGenesis_ctor (o_o_0 : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) -> * mut dashcore_sml_error_SmlError { ferment :: boxed (dashcore_sml_error_SmlError :: BaseBlockNotGenesis (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_error_SmlError_BlockHashLookupFailed_ctor (o_o_0 : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) -> * mut dashcore_sml_error_SmlError { ferment :: boxed (dashcore_sml_error_SmlError :: BlockHashLookupFailed (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_error_SmlError_IncompleteMnListDiff_ctor () -> * mut dashcore_sml_error_SmlError { ferment :: boxed (dashcore_sml_error_SmlError :: IncompleteMnListDiff { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_error_SmlError_MissingStartMasternodeList_ctor (o_o_0 : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) -> * mut dashcore_sml_error_SmlError { ferment :: boxed (dashcore_sml_error_SmlError :: MissingStartMasternodeList (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_error_SmlError_BaseBlockHashMismatch_ctor (expected : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash , found : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) -> * mut dashcore_sml_error_SmlError { ferment :: boxed (dashcore_sml_error_SmlError :: BaseBlockHashMismatch { expected , found }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_error_SmlError_UnknownError_ctor () -> * mut dashcore_sml_error_SmlError { ferment :: boxed (dashcore_sml_error_SmlError :: UnknownError { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_error_SmlError_CorruptedCodeExecution_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dashcore_sml_error_SmlError { ferment :: boxed (dashcore_sml_error_SmlError :: CorruptedCodeExecution (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_error_SmlError_FeatureNotTurnedOn_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dashcore_sml_error_SmlError { ferment :: boxed (dashcore_sml_error_SmlError :: FeatureNotTurnedOn (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_error_SmlError_InvalidIndexInSignatureSet_ctor (o_o_0 : u16) -> * mut dashcore_sml_error_SmlError { ferment :: boxed (dashcore_sml_error_SmlError :: InvalidIndexInSignatureSet (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_error_SmlError_IncompleteSignatureSet_ctor () -> * mut dashcore_sml_error_SmlError { ferment :: boxed (dashcore_sml_error_SmlError :: IncompleteSignatureSet { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_error_SmlError_destroy < > (ffi : * mut dashcore_sml_error_SmlError) { ferment :: unbox_any (ffi) ; } } pub mod llmq_entry_verification { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`LLMQEntryVerificationStatus`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus { Unknown , Verified , Skipped (* mut dashcore :: sml :: llmq_entry_verification :: LLMQEntryVerificationSkipStatus) , Invalid (* mut crate :: fermented :: types :: dashcore :: sml :: quorum_validation_error :: dashcore_sml_quorum_validation_error_QuorumValidationError) } impl ferment :: FFIConversionFrom < dashcore :: sml :: llmq_entry_verification :: LLMQEntryVerificationStatus > for dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus { unsafe fn ffi_from_const (ffi : * const dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus) -> dashcore :: sml :: llmq_entry_verification :: LLMQEntryVerificationStatus { let ffi_ref = & * ffi ; match ffi_ref { dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus :: Unknown => dashcore :: sml :: llmq_entry_verification :: LLMQEntryVerificationStatus :: Unknown , dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus :: Verified => dashcore :: sml :: llmq_entry_verification :: LLMQEntryVerificationStatus :: Verified , dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus :: Skipped (o_0) => dashcore :: sml :: llmq_entry_verification :: LLMQEntryVerificationStatus :: Skipped ((& * * o_0) . clone ()) , dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus :: Invalid (o_0) => dashcore :: sml :: llmq_entry_verification :: LLMQEntryVerificationStatus :: Invalid (< crate :: fermented :: types :: dashcore :: sml :: quorum_validation_error :: dashcore_sml_quorum_validation_error_QuorumValidationError as ferment :: FFIConversionFrom < dashcore :: sml :: quorum_validation_error :: QuorumValidationError >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dashcore :: sml :: llmq_entry_verification :: LLMQEntryVerificationStatus > for dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus { unsafe fn ffi_to_const (obj : dashcore :: sml :: llmq_entry_verification :: LLMQEntryVerificationStatus) -> * const dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus { ferment :: boxed (match obj { dashcore :: sml :: llmq_entry_verification :: LLMQEntryVerificationStatus :: Unknown => dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus :: Unknown , dashcore :: sml :: llmq_entry_verification :: LLMQEntryVerificationStatus :: Verified => dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus :: Verified , dashcore :: sml :: llmq_entry_verification :: LLMQEntryVerificationStatus :: Skipped (o_0) => dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus :: Skipped (ferment :: boxed (o_0)) , dashcore :: sml :: llmq_entry_verification :: LLMQEntryVerificationStatus :: Invalid (o_0) => dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus :: Invalid (< crate :: fermented :: types :: dashcore :: sml :: quorum_validation_error :: dashcore_sml_quorum_validation_error_QuorumValidationError as ferment :: FFIConversionTo < dashcore :: sml :: quorum_validation_error :: QuorumValidationError >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus { fn drop (& mut self) { unsafe { match self { dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus :: Unknown => { } , dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus :: Verified => { } , dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus :: Skipped (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus :: Invalid (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus_Unknown_ctor () -> * mut dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus { ferment :: boxed (dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus :: Unknown { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus_Verified_ctor () -> * mut dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus { ferment :: boxed (dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus :: Verified { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus_Skipped_ctor (o_o_0 : * mut dashcore :: sml :: llmq_entry_verification :: LLMQEntryVerificationSkipStatus) -> * mut dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus { ferment :: boxed (dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus :: Skipped (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus_Invalid_ctor (o_o_0 : * mut crate :: fermented :: types :: dashcore :: sml :: quorum_validation_error :: dashcore_sml_quorum_validation_error_QuorumValidationError) -> * mut dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus { ferment :: boxed (dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus :: Invalid (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus_destroy < > (ffi : * mut dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus) { ferment :: unbox_any (ffi) ; } } pub mod quorum_validation_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ClientDataRetrievalError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dashcore_sml_quorum_validation_error_ClientDataRetrievalError { RequiredBlockNotPresent (* mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) , CoinbaseNotFoundOnBlock (* mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) } impl ferment :: FFIConversionFrom < dashcore :: sml :: quorum_validation_error :: ClientDataRetrievalError > for dashcore_sml_quorum_validation_error_ClientDataRetrievalError { unsafe fn ffi_from_const (ffi : * const dashcore_sml_quorum_validation_error_ClientDataRetrievalError) -> dashcore :: sml :: quorum_validation_error :: ClientDataRetrievalError { let ffi_ref = & * ffi ; match ffi_ref { dashcore_sml_quorum_validation_error_ClientDataRetrievalError :: RequiredBlockNotPresent (o_0) => dashcore :: sml :: quorum_validation_error :: ClientDataRetrievalError :: RequiredBlockNotPresent (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: BlockHash >> :: ffi_from (* o_0)) , dashcore_sml_quorum_validation_error_ClientDataRetrievalError :: CoinbaseNotFoundOnBlock (o_0) => dashcore :: sml :: quorum_validation_error :: ClientDataRetrievalError :: CoinbaseNotFoundOnBlock (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: BlockHash >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dashcore :: sml :: quorum_validation_error :: ClientDataRetrievalError > for dashcore_sml_quorum_validation_error_ClientDataRetrievalError { unsafe fn ffi_to_const (obj : dashcore :: sml :: quorum_validation_error :: ClientDataRetrievalError) -> * const dashcore_sml_quorum_validation_error_ClientDataRetrievalError { ferment :: boxed (match obj { dashcore :: sml :: quorum_validation_error :: ClientDataRetrievalError :: RequiredBlockNotPresent (o_0) => dashcore_sml_quorum_validation_error_ClientDataRetrievalError :: RequiredBlockNotPresent (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionTo < dashcore :: hash_types :: BlockHash >> :: ffi_to (o_0)) , dashcore :: sml :: quorum_validation_error :: ClientDataRetrievalError :: CoinbaseNotFoundOnBlock (o_0) => dashcore_sml_quorum_validation_error_ClientDataRetrievalError :: CoinbaseNotFoundOnBlock (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionTo < dashcore :: hash_types :: BlockHash >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dashcore_sml_quorum_validation_error_ClientDataRetrievalError { fn drop (& mut self) { unsafe { match self { dashcore_sml_quorum_validation_error_ClientDataRetrievalError :: RequiredBlockNotPresent (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_sml_quorum_validation_error_ClientDataRetrievalError :: CoinbaseNotFoundOnBlock (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_ClientDataRetrievalError_RequiredBlockNotPresent_ctor (o_o_0 : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) -> * mut dashcore_sml_quorum_validation_error_ClientDataRetrievalError { ferment :: boxed (dashcore_sml_quorum_validation_error_ClientDataRetrievalError :: RequiredBlockNotPresent (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_ClientDataRetrievalError_CoinbaseNotFoundOnBlock_ctor (o_o_0 : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) -> * mut dashcore_sml_quorum_validation_error_ClientDataRetrievalError { ferment :: boxed (dashcore_sml_quorum_validation_error_ClientDataRetrievalError :: CoinbaseNotFoundOnBlock (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_ClientDataRetrievalError_destroy < > (ffi : * mut dashcore_sml_quorum_validation_error_ClientDataRetrievalError) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`QuorumValidationError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dashcore_sml_quorum_validation_error_QuorumValidationError { RequiredBlockNotPresent (* mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) , RequiredBlockHeightNotPresent (* mut crate :: fermented :: types :: dashcore :: prelude :: dashcore_prelude_CoreBlockHeight) , VerifyingMasternodeListNotPresent (* mut crate :: fermented :: types :: dashcore :: prelude :: dashcore_prelude_CoreBlockHeight) , RequiredMasternodeListNotPresent (* mut crate :: fermented :: types :: dashcore :: prelude :: dashcore_prelude_CoreBlockHeight) , RequiredChainLockNotPresent (* mut crate :: fermented :: types :: dashcore :: prelude :: dashcore_prelude_CoreBlockHeight , * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) , RequiredRotatedChainLockSigNotPresent (u8 , * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) , RequiredRotatedChainLockSigsNotPresent (* mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) , InsufficientSigners { required : u64 , found : u64 } , InsufficientValidMembers { required : u64 , found : u64 } , MismatchedBitsetLengths { signers_len : usize , valid_members_len : usize } , InvalidQuorumPublicKey , InvalidBLSPublicKey (* mut std :: os :: raw :: c_char) , InvalidBLSSignature (* mut std :: os :: raw :: c_char) , InvalidQuorumSignature , InvalidFinalSignature , AllCommitmentAggregatedSignatureNotValid (* mut std :: os :: raw :: c_char) , ThresholdSignatureNotValid (* mut std :: os :: raw :: c_char) , CommitmentHashNotPresent , RequiredSnapshotNotPresent (* mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) , SMLError (* mut crate :: fermented :: types :: dashcore :: sml :: error :: dashcore_sml_error_SmlError) , RequiredQuorumIndexNotPresent (* mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash) , CorruptedCodeExecution (* mut std :: os :: raw :: c_char) , ExpectedOnlyRotatedQuorums (* mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash , * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType) , ClientDataRetrievalError (* mut crate :: fermented :: types :: dashcore :: sml :: quorum_validation_error :: dashcore_sml_quorum_validation_error_ClientDataRetrievalError) , FeatureNotTurnedOn (* mut std :: os :: raw :: c_char) } impl ferment :: FFIConversionFrom < dashcore :: sml :: quorum_validation_error :: QuorumValidationError > for dashcore_sml_quorum_validation_error_QuorumValidationError { unsafe fn ffi_from_const (ffi : * const dashcore_sml_quorum_validation_error_QuorumValidationError) -> dashcore :: sml :: quorum_validation_error :: QuorumValidationError { let ffi_ref = & * ffi ; match ffi_ref { dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredBlockNotPresent (o_0) => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: RequiredBlockNotPresent (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: BlockHash >> :: ffi_from (* o_0)) , dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredBlockHeightNotPresent (o_0) => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: RequiredBlockHeightNotPresent (< crate :: fermented :: types :: dashcore :: prelude :: dashcore_prelude_CoreBlockHeight as ferment :: FFIConversionFrom < dashcore :: prelude :: CoreBlockHeight >> :: ffi_from (* o_0)) , dashcore_sml_quorum_validation_error_QuorumValidationError :: VerifyingMasternodeListNotPresent (o_0) => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: VerifyingMasternodeListNotPresent (< crate :: fermented :: types :: dashcore :: prelude :: dashcore_prelude_CoreBlockHeight as ferment :: FFIConversionFrom < dashcore :: prelude :: CoreBlockHeight >> :: ffi_from (* o_0)) , dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredMasternodeListNotPresent (o_0) => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: RequiredMasternodeListNotPresent (< crate :: fermented :: types :: dashcore :: prelude :: dashcore_prelude_CoreBlockHeight as ferment :: FFIConversionFrom < dashcore :: prelude :: CoreBlockHeight >> :: ffi_from (* o_0)) , dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredChainLockNotPresent (o_0 , o_1) => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: RequiredChainLockNotPresent (< crate :: fermented :: types :: dashcore :: prelude :: dashcore_prelude_CoreBlockHeight as ferment :: FFIConversionFrom < dashcore :: prelude :: CoreBlockHeight >> :: ffi_from (* o_0) , < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: BlockHash >> :: ffi_from (* o_1)) , dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredRotatedChainLockSigNotPresent (o_0 , o_1) => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: RequiredRotatedChainLockSigNotPresent (* o_0 , < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: BlockHash >> :: ffi_from (* o_1)) , dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredRotatedChainLockSigsNotPresent (o_0) => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: RequiredRotatedChainLockSigsNotPresent (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: BlockHash >> :: ffi_from (* o_0)) , dashcore_sml_quorum_validation_error_QuorumValidationError :: InsufficientSigners { required , found } => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: InsufficientSigners { required : * required , found : * found } , dashcore_sml_quorum_validation_error_QuorumValidationError :: InsufficientValidMembers { required , found } => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: InsufficientValidMembers { required : * required , found : * found } , dashcore_sml_quorum_validation_error_QuorumValidationError :: MismatchedBitsetLengths { signers_len , valid_members_len } => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: MismatchedBitsetLengths { signers_len : * signers_len , valid_members_len : * valid_members_len } , dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidQuorumPublicKey => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: InvalidQuorumPublicKey , dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidBLSPublicKey (o_0) => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: InvalidBLSPublicKey (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidBLSSignature (o_0) => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: InvalidBLSSignature (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidQuorumSignature => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: InvalidQuorumSignature , dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidFinalSignature => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: InvalidFinalSignature , dashcore_sml_quorum_validation_error_QuorumValidationError :: AllCommitmentAggregatedSignatureNotValid (o_0) => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: AllCommitmentAggregatedSignatureNotValid (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dashcore_sml_quorum_validation_error_QuorumValidationError :: ThresholdSignatureNotValid (o_0) => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: ThresholdSignatureNotValid (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dashcore_sml_quorum_validation_error_QuorumValidationError :: CommitmentHashNotPresent => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: CommitmentHashNotPresent , dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredSnapshotNotPresent (o_0) => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: RequiredSnapshotNotPresent (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: BlockHash >> :: ffi_from (* o_0)) , dashcore_sml_quorum_validation_error_QuorumValidationError :: SMLError (o_0) => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: SMLError (< crate :: fermented :: types :: dashcore :: sml :: error :: dashcore_sml_error_SmlError as ferment :: FFIConversionFrom < dashcore :: sml :: error :: SmlError >> :: ffi_from (* o_0)) , dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredQuorumIndexNotPresent (o_0) => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: RequiredQuorumIndexNotPresent (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: QuorumHash >> :: ffi_from (* o_0)) , dashcore_sml_quorum_validation_error_QuorumValidationError :: CorruptedCodeExecution (o_0) => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: CorruptedCodeExecution (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dashcore_sml_quorum_validation_error_QuorumValidationError :: ExpectedOnlyRotatedQuorums (o_0 , o_1) => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: ExpectedOnlyRotatedQuorums (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: QuorumHash >> :: ffi_from (* o_0) , < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionFrom < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_from (* o_1)) , dashcore_sml_quorum_validation_error_QuorumValidationError :: ClientDataRetrievalError (o_0) => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: ClientDataRetrievalError (< crate :: fermented :: types :: dashcore :: sml :: quorum_validation_error :: dashcore_sml_quorum_validation_error_ClientDataRetrievalError as ferment :: FFIConversionFrom < dashcore :: sml :: quorum_validation_error :: ClientDataRetrievalError >> :: ffi_from (* o_0)) , dashcore_sml_quorum_validation_error_QuorumValidationError :: FeatureNotTurnedOn (o_0) => dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: FeatureNotTurnedOn (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dashcore :: sml :: quorum_validation_error :: QuorumValidationError > for dashcore_sml_quorum_validation_error_QuorumValidationError { unsafe fn ffi_to_const (obj : dashcore :: sml :: quorum_validation_error :: QuorumValidationError) -> * const dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (match obj { dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: RequiredBlockNotPresent (o_0) => dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredBlockNotPresent (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionTo < dashcore :: hash_types :: BlockHash >> :: ffi_to (o_0)) , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: RequiredBlockHeightNotPresent (o_0) => dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredBlockHeightNotPresent (< crate :: fermented :: types :: dashcore :: prelude :: dashcore_prelude_CoreBlockHeight as ferment :: FFIConversionTo < dashcore :: prelude :: CoreBlockHeight >> :: ffi_to (o_0)) , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: VerifyingMasternodeListNotPresent (o_0) => dashcore_sml_quorum_validation_error_QuorumValidationError :: VerifyingMasternodeListNotPresent (< crate :: fermented :: types :: dashcore :: prelude :: dashcore_prelude_CoreBlockHeight as ferment :: FFIConversionTo < dashcore :: prelude :: CoreBlockHeight >> :: ffi_to (o_0)) , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: RequiredMasternodeListNotPresent (o_0) => dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredMasternodeListNotPresent (< crate :: fermented :: types :: dashcore :: prelude :: dashcore_prelude_CoreBlockHeight as ferment :: FFIConversionTo < dashcore :: prelude :: CoreBlockHeight >> :: ffi_to (o_0)) , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: RequiredChainLockNotPresent (o_0 , o_1) => dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredChainLockNotPresent (< crate :: fermented :: types :: dashcore :: prelude :: dashcore_prelude_CoreBlockHeight as ferment :: FFIConversionTo < dashcore :: prelude :: CoreBlockHeight >> :: ffi_to (o_0) , < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionTo < dashcore :: hash_types :: BlockHash >> :: ffi_to (o_1)) , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: RequiredRotatedChainLockSigNotPresent (o_0 , o_1) => dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredRotatedChainLockSigNotPresent (o_0 , < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionTo < dashcore :: hash_types :: BlockHash >> :: ffi_to (o_1)) , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: RequiredRotatedChainLockSigsNotPresent (o_0) => dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredRotatedChainLockSigsNotPresent (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionTo < dashcore :: hash_types :: BlockHash >> :: ffi_to (o_0)) , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: InsufficientSigners { required , found } => dashcore_sml_quorum_validation_error_QuorumValidationError :: InsufficientSigners { required : required , found : found } , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: InsufficientValidMembers { required , found } => dashcore_sml_quorum_validation_error_QuorumValidationError :: InsufficientValidMembers { required : required , found : found } , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: MismatchedBitsetLengths { signers_len , valid_members_len } => dashcore_sml_quorum_validation_error_QuorumValidationError :: MismatchedBitsetLengths { signers_len : signers_len , valid_members_len : valid_members_len } , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: InvalidQuorumPublicKey => dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidQuorumPublicKey , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: InvalidBLSPublicKey (o_0) => dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidBLSPublicKey (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: InvalidBLSSignature (o_0) => dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidBLSSignature (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: InvalidQuorumSignature => dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidQuorumSignature , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: InvalidFinalSignature => dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidFinalSignature , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: AllCommitmentAggregatedSignatureNotValid (o_0) => dashcore_sml_quorum_validation_error_QuorumValidationError :: AllCommitmentAggregatedSignatureNotValid (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: ThresholdSignatureNotValid (o_0) => dashcore_sml_quorum_validation_error_QuorumValidationError :: ThresholdSignatureNotValid (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: CommitmentHashNotPresent => dashcore_sml_quorum_validation_error_QuorumValidationError :: CommitmentHashNotPresent , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: RequiredSnapshotNotPresent (o_0) => dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredSnapshotNotPresent (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionTo < dashcore :: hash_types :: BlockHash >> :: ffi_to (o_0)) , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: SMLError (o_0) => dashcore_sml_quorum_validation_error_QuorumValidationError :: SMLError (< crate :: fermented :: types :: dashcore :: sml :: error :: dashcore_sml_error_SmlError as ferment :: FFIConversionTo < dashcore :: sml :: error :: SmlError >> :: ffi_to (o_0)) , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: RequiredQuorumIndexNotPresent (o_0) => dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredQuorumIndexNotPresent (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash as ferment :: FFIConversionTo < dashcore :: hash_types :: QuorumHash >> :: ffi_to (o_0)) , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: CorruptedCodeExecution (o_0) => dashcore_sml_quorum_validation_error_QuorumValidationError :: CorruptedCodeExecution (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: ExpectedOnlyRotatedQuorums (o_0 , o_1) => dashcore_sml_quorum_validation_error_QuorumValidationError :: ExpectedOnlyRotatedQuorums (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash as ferment :: FFIConversionTo < dashcore :: hash_types :: QuorumHash >> :: ffi_to (o_0) , < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (o_1)) , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: ClientDataRetrievalError (o_0) => dashcore_sml_quorum_validation_error_QuorumValidationError :: ClientDataRetrievalError (< crate :: fermented :: types :: dashcore :: sml :: quorum_validation_error :: dashcore_sml_quorum_validation_error_ClientDataRetrievalError as ferment :: FFIConversionTo < dashcore :: sml :: quorum_validation_error :: ClientDataRetrievalError >> :: ffi_to (o_0)) , dashcore :: sml :: quorum_validation_error :: QuorumValidationError :: FeatureNotTurnedOn (o_0) => dashcore_sml_quorum_validation_error_QuorumValidationError :: FeatureNotTurnedOn (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dashcore_sml_quorum_validation_error_QuorumValidationError { fn drop (& mut self) { unsafe { match self { dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredBlockNotPresent (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredBlockHeightNotPresent (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: VerifyingMasternodeListNotPresent (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredMasternodeListNotPresent (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredChainLockNotPresent (o_0 , o_1) => { ferment :: unbox_any (* o_0) ; ; ferment :: unbox_any (* o_1) ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredRotatedChainLockSigNotPresent (o_0 , o_1) => { ; ; ferment :: unbox_any (* o_1) ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredRotatedChainLockSigsNotPresent (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: InsufficientSigners { required , found } => { ; ; ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: InsufficientValidMembers { required , found } => { ; ; ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: MismatchedBitsetLengths { signers_len , valid_members_len } => { ; ; ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidQuorumPublicKey => { } , dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidBLSPublicKey (o_0) => { ferment :: unbox_string (* o_0) ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidBLSSignature (o_0) => { ferment :: unbox_string (* o_0) ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidQuorumSignature => { } , dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidFinalSignature => { } , dashcore_sml_quorum_validation_error_QuorumValidationError :: AllCommitmentAggregatedSignatureNotValid (o_0) => { ferment :: unbox_string (* o_0) ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: ThresholdSignatureNotValid (o_0) => { ferment :: unbox_string (* o_0) ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: CommitmentHashNotPresent => { } , dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredSnapshotNotPresent (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: SMLError (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredQuorumIndexNotPresent (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: CorruptedCodeExecution (o_0) => { ferment :: unbox_string (* o_0) ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: ExpectedOnlyRotatedQuorums (o_0 , o_1) => { ferment :: unbox_any (* o_0) ; ; ferment :: unbox_any (* o_1) ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: ClientDataRetrievalError (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_sml_quorum_validation_error_QuorumValidationError :: FeatureNotTurnedOn (o_0) => { ferment :: unbox_string (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_RequiredBlockNotPresent_ctor (o_o_0 : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredBlockNotPresent (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_RequiredBlockHeightNotPresent_ctor (o_o_0 : * mut crate :: fermented :: types :: dashcore :: prelude :: dashcore_prelude_CoreBlockHeight) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredBlockHeightNotPresent (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_VerifyingMasternodeListNotPresent_ctor (o_o_0 : * mut crate :: fermented :: types :: dashcore :: prelude :: dashcore_prelude_CoreBlockHeight) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: VerifyingMasternodeListNotPresent (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_RequiredMasternodeListNotPresent_ctor (o_o_0 : * mut crate :: fermented :: types :: dashcore :: prelude :: dashcore_prelude_CoreBlockHeight) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredMasternodeListNotPresent (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_RequiredChainLockNotPresent_ctor (o_o_0 : * mut crate :: fermented :: types :: dashcore :: prelude :: dashcore_prelude_CoreBlockHeight , o_o_1 : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredChainLockNotPresent (o_o_0 , o_o_1)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_RequiredRotatedChainLockSigNotPresent_ctor (o_o_0 : u8 , o_o_1 : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredRotatedChainLockSigNotPresent (o_o_0 , o_o_1)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_RequiredRotatedChainLockSigsNotPresent_ctor (o_o_0 : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredRotatedChainLockSigsNotPresent (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_InsufficientSigners_ctor (required : u64 , found : u64) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: InsufficientSigners { required , found }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_InsufficientValidMembers_ctor (required : u64 , found : u64) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: InsufficientValidMembers { required , found }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_MismatchedBitsetLengths_ctor (signers_len : usize , valid_members_len : usize) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: MismatchedBitsetLengths { signers_len , valid_members_len }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_InvalidQuorumPublicKey_ctor () -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidQuorumPublicKey { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_InvalidBLSPublicKey_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidBLSPublicKey (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_InvalidBLSSignature_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidBLSSignature (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_InvalidQuorumSignature_ctor () -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidQuorumSignature { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_InvalidFinalSignature_ctor () -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: InvalidFinalSignature { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_AllCommitmentAggregatedSignatureNotValid_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: AllCommitmentAggregatedSignatureNotValid (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_ThresholdSignatureNotValid_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: ThresholdSignatureNotValid (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_CommitmentHashNotPresent_ctor () -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: CommitmentHashNotPresent { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_RequiredSnapshotNotPresent_ctor (o_o_0 : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredSnapshotNotPresent (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_SMLError_ctor (o_o_0 : * mut crate :: fermented :: types :: dashcore :: sml :: error :: dashcore_sml_error_SmlError) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: SMLError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_RequiredQuorumIndexNotPresent_ctor (o_o_0 : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: RequiredQuorumIndexNotPresent (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_CorruptedCodeExecution_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: CorruptedCodeExecution (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_ExpectedOnlyRotatedQuorums_ctor (o_o_0 : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash , o_o_1 : * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: ExpectedOnlyRotatedQuorums (o_o_0 , o_o_1)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_ClientDataRetrievalError_ctor (o_o_0 : * mut crate :: fermented :: types :: dashcore :: sml :: quorum_validation_error :: dashcore_sml_quorum_validation_error_ClientDataRetrievalError) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: ClientDataRetrievalError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_FeatureNotTurnedOn_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dashcore_sml_quorum_validation_error_QuorumValidationError { ferment :: boxed (dashcore_sml_quorum_validation_error_QuorumValidationError :: FeatureNotTurnedOn (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_validation_error_QuorumValidationError_destroy < > (ffi : * mut dashcore_sml_quorum_validation_error_QuorumValidationError) { ferment :: unbox_any (ffi) ; } } pub mod masternode_list { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MasternodeList`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_sml_masternode_list_MasternodeList { pub block_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash , pub known_height : u32 , pub masternode_merkle_root : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootMasternodeList , pub llmq_merkle_root : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootQuorums , pub masternodes : * mut crate :: fermented :: generics :: std_collections_Map_keys_dashcore_hash_types_ProTxHash_values_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry , pub quorums : * mut crate :: fermented :: generics :: std_collections_Map_keys_dashcore_sml_llmq_type_LLMQType_values_std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry } impl ferment :: FFIConversionFrom < dashcore :: sml :: masternode_list :: MasternodeList > for dashcore_sml_masternode_list_MasternodeList { unsafe fn ffi_from_const (ffi : * const dashcore_sml_masternode_list_MasternodeList) -> dashcore :: sml :: masternode_list :: MasternodeList { let ffi_ref = & * ffi ; dashcore :: sml :: masternode_list :: MasternodeList { block_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: BlockHash >> :: ffi_from (ffi_ref . block_hash) , known_height : ffi_ref . known_height , masternode_merkle_root : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootMasternodeList as ferment :: FFIConversionFrom < dashcore :: hash_types :: MerkleRootMasternodeList >> :: ffi_from_opt (ffi_ref . masternode_merkle_root) , llmq_merkle_root : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootQuorums as ferment :: FFIConversionFrom < dashcore :: hash_types :: MerkleRootQuorums >> :: ffi_from_opt (ffi_ref . llmq_merkle_root) , masternodes : < crate :: fermented :: generics :: std_collections_Map_keys_dashcore_hash_types_ProTxHash_values_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dashcore :: hash_types :: ProTxHash , dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry > >> :: ffi_from (ffi_ref . masternodes) , quorums : < crate :: fermented :: generics :: std_collections_Map_keys_dashcore_sml_llmq_type_LLMQType_values_std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dashcore :: sml :: llmq_type :: LLMQType , std :: collections :: BTreeMap < dashcore :: hash_types :: QuorumHash , dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: QualifiedQuorumEntry > > >> :: ffi_from (ffi_ref . quorums) } } } impl ferment :: FFIConversionTo < dashcore :: sml :: masternode_list :: MasternodeList > for dashcore_sml_masternode_list_MasternodeList { unsafe fn ffi_to_const (obj : dashcore :: sml :: masternode_list :: MasternodeList) -> * const dashcore_sml_masternode_list_MasternodeList { ferment :: boxed (dashcore_sml_masternode_list_MasternodeList { block_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionTo < dashcore :: hash_types :: BlockHash >> :: ffi_to (obj . block_hash) , known_height : obj . known_height , masternode_merkle_root : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootMasternodeList as ferment :: FFIConversionTo < dashcore :: hash_types :: MerkleRootMasternodeList >> :: ffi_to_opt (obj . masternode_merkle_root) , llmq_merkle_root : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootQuorums as ferment :: FFIConversionTo < dashcore :: hash_types :: MerkleRootQuorums >> :: ffi_to_opt (obj . llmq_merkle_root) , masternodes : < crate :: fermented :: generics :: std_collections_Map_keys_dashcore_hash_types_ProTxHash_values_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry as ferment :: FFIConversionTo < std :: collections :: BTreeMap < dashcore :: hash_types :: ProTxHash , dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry > >> :: ffi_to (obj . masternodes) , quorums : < crate :: fermented :: generics :: std_collections_Map_keys_dashcore_sml_llmq_type_LLMQType_values_std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry as ferment :: FFIConversionTo < std :: collections :: BTreeMap < dashcore :: sml :: llmq_type :: LLMQType , std :: collections :: BTreeMap < dashcore :: hash_types :: QuorumHash , dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: QualifiedQuorumEntry > > >> :: ffi_to (obj . quorums) }) } } impl Drop for dashcore_sml_masternode_list_MasternodeList { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . block_hash) ; ; ferment :: unbox_any_opt (ffi_ref . masternode_merkle_root) ; ferment :: unbox_any_opt (ffi_ref . llmq_merkle_root) ; ferment :: unbox_any (ffi_ref . masternodes) ; ferment :: unbox_any (ffi_ref . quorums) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_MasternodeList_ctor < > (block_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash , known_height : u32 , masternode_merkle_root : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootMasternodeList , llmq_merkle_root : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootQuorums , masternodes : * mut crate :: fermented :: generics :: std_collections_Map_keys_dashcore_hash_types_ProTxHash_values_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry , quorums : * mut crate :: fermented :: generics :: std_collections_Map_keys_dashcore_sml_llmq_type_LLMQType_values_std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry) -> * mut dashcore_sml_masternode_list_MasternodeList { ferment :: boxed (dashcore_sml_masternode_list_MasternodeList { block_hash , known_height , masternode_merkle_root , llmq_merkle_root , masternodes , quorums }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_MasternodeList_destroy < > (ffi : * mut dashcore_sml_masternode_list_MasternodeList) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_MasternodeList_get_block_hash < > (obj : * const dashcore_sml_masternode_list_MasternodeList) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash { (* obj) . block_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_MasternodeList_get_known_height < > (obj : * const dashcore_sml_masternode_list_MasternodeList) -> u32 { (* obj) . known_height } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_MasternodeList_get_masternode_merkle_root < > (obj : * const dashcore_sml_masternode_list_MasternodeList) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootMasternodeList { (* obj) . masternode_merkle_root } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_MasternodeList_get_llmq_merkle_root < > (obj : * const dashcore_sml_masternode_list_MasternodeList) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootQuorums { (* obj) . llmq_merkle_root } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_MasternodeList_get_masternodes < > (obj : * const dashcore_sml_masternode_list_MasternodeList) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dashcore_hash_types_ProTxHash_values_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { (* obj) . masternodes } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_MasternodeList_get_quorums < > (obj : * const dashcore_sml_masternode_list_MasternodeList) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dashcore_sml_llmq_type_LLMQType_values_std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { (* obj) . quorums } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_MasternodeList_set_block_hash < > (obj : * const dashcore_sml_masternode_list_MasternodeList) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash { (* obj) . block_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_MasternodeList_set_known_height < > (obj : * const dashcore_sml_masternode_list_MasternodeList) -> u32 { (* obj) . known_height } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_MasternodeList_set_masternode_merkle_root < > (obj : * const dashcore_sml_masternode_list_MasternodeList) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootMasternodeList { (* obj) . masternode_merkle_root } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_MasternodeList_set_llmq_merkle_root < > (obj : * const dashcore_sml_masternode_list_MasternodeList) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootQuorums { (* obj) . llmq_merkle_root } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_MasternodeList_set_masternodes < > (obj : * const dashcore_sml_masternode_list_MasternodeList) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dashcore_hash_types_ProTxHash_values_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { (* obj) . masternodes } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_masternode_list_MasternodeList_set_quorums < > (obj : * const dashcore_sml_masternode_list_MasternodeList) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dashcore_sml_llmq_type_LLMQType_values_std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { (* obj) . quorums } } pub mod llmq_type { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dashcore::sml::llmq_type::LLMQType::index`]"] # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_index (self_ : * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType) -> u8 { let obj = dashcore :: sml :: llmq_type :: LLMQType :: index (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dashcore::sml::llmq_type::LLMQType::from_u16`]"] # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_from_u16 (index : u16) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = dashcore :: sml :: llmq_type :: LLMQType :: from_u16 (index) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dashcore::sml::llmq_type::LLMQType::from_u8`]"] # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_from_u8 (index : u8) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = dashcore :: sml :: llmq_type :: LLMQType :: from_u8 (index) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dashcore::sml::llmq_type::LLMQType::is_rotating_quorum_type`]"] # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_is_rotating_quorum_type (self_ : * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType) -> bool { let obj = dashcore :: sml :: llmq_type :: LLMQType :: is_rotating_quorum_type (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`LLMQType`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dashcore_sml_llmq_type_LLMQType { LlmqtypeUnknown = 0 , Llmqtype50_60 = 1 , Llmqtype400_60 = 2 , Llmqtype400_85 = 3 , Llmqtype100_67 = 4 , Llmqtype60_75 = 5 , Llmqtype25_67 = 6 , LlmqtypeTest = 100 , LlmqtypeDevnet = 101 , LlmqtypeTestV17 = 102 , LlmqtypeTestDIP0024 = 103 , LlmqtypeTestInstantSend = 104 , LlmqtypeDevnetDIP0024 = 105 , LlmqtypeTestnetPlatform = 106 , LlmqtypeDevnetPlatform = 107 } impl ferment :: FFIConversionFrom < dashcore :: sml :: llmq_type :: LLMQType > for dashcore_sml_llmq_type_LLMQType { unsafe fn ffi_from_const (ffi : * const dashcore_sml_llmq_type_LLMQType) -> dashcore :: sml :: llmq_type :: LLMQType { let ffi_ref = & * ffi ; match ffi_ref { dashcore_sml_llmq_type_LLMQType :: LlmqtypeUnknown => dashcore :: sml :: llmq_type :: LLMQType :: LlmqtypeUnknown , dashcore_sml_llmq_type_LLMQType :: Llmqtype50_60 => dashcore :: sml :: llmq_type :: LLMQType :: Llmqtype50_60 , dashcore_sml_llmq_type_LLMQType :: Llmqtype400_60 => dashcore :: sml :: llmq_type :: LLMQType :: Llmqtype400_60 , dashcore_sml_llmq_type_LLMQType :: Llmqtype400_85 => dashcore :: sml :: llmq_type :: LLMQType :: Llmqtype400_85 , dashcore_sml_llmq_type_LLMQType :: Llmqtype100_67 => dashcore :: sml :: llmq_type :: LLMQType :: Llmqtype100_67 , dashcore_sml_llmq_type_LLMQType :: Llmqtype60_75 => dashcore :: sml :: llmq_type :: LLMQType :: Llmqtype60_75 , dashcore_sml_llmq_type_LLMQType :: Llmqtype25_67 => dashcore :: sml :: llmq_type :: LLMQType :: Llmqtype25_67 , dashcore_sml_llmq_type_LLMQType :: LlmqtypeTest => dashcore :: sml :: llmq_type :: LLMQType :: LlmqtypeTest , dashcore_sml_llmq_type_LLMQType :: LlmqtypeDevnet => dashcore :: sml :: llmq_type :: LLMQType :: LlmqtypeDevnet , dashcore_sml_llmq_type_LLMQType :: LlmqtypeTestV17 => dashcore :: sml :: llmq_type :: LLMQType :: LlmqtypeTestV17 , dashcore_sml_llmq_type_LLMQType :: LlmqtypeTestDIP0024 => dashcore :: sml :: llmq_type :: LLMQType :: LlmqtypeTestDIP0024 , dashcore_sml_llmq_type_LLMQType :: LlmqtypeTestInstantSend => dashcore :: sml :: llmq_type :: LLMQType :: LlmqtypeTestInstantSend , dashcore_sml_llmq_type_LLMQType :: LlmqtypeDevnetDIP0024 => dashcore :: sml :: llmq_type :: LLMQType :: LlmqtypeDevnetDIP0024 , dashcore_sml_llmq_type_LLMQType :: LlmqtypeTestnetPlatform => dashcore :: sml :: llmq_type :: LLMQType :: LlmqtypeTestnetPlatform , dashcore_sml_llmq_type_LLMQType :: LlmqtypeDevnetPlatform => dashcore :: sml :: llmq_type :: LLMQType :: LlmqtypeDevnetPlatform } } } impl ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType > for dashcore_sml_llmq_type_LLMQType { unsafe fn ffi_to_const (obj : dashcore :: sml :: llmq_type :: LLMQType) -> * const dashcore_sml_llmq_type_LLMQType { ferment :: boxed (match obj { dashcore :: sml :: llmq_type :: LLMQType :: LlmqtypeUnknown => dashcore_sml_llmq_type_LLMQType :: LlmqtypeUnknown , dashcore :: sml :: llmq_type :: LLMQType :: Llmqtype50_60 => dashcore_sml_llmq_type_LLMQType :: Llmqtype50_60 , dashcore :: sml :: llmq_type :: LLMQType :: Llmqtype400_60 => dashcore_sml_llmq_type_LLMQType :: Llmqtype400_60 , dashcore :: sml :: llmq_type :: LLMQType :: Llmqtype400_85 => dashcore_sml_llmq_type_LLMQType :: Llmqtype400_85 , dashcore :: sml :: llmq_type :: LLMQType :: Llmqtype100_67 => dashcore_sml_llmq_type_LLMQType :: Llmqtype100_67 , dashcore :: sml :: llmq_type :: LLMQType :: Llmqtype60_75 => dashcore_sml_llmq_type_LLMQType :: Llmqtype60_75 , dashcore :: sml :: llmq_type :: LLMQType :: Llmqtype25_67 => dashcore_sml_llmq_type_LLMQType :: Llmqtype25_67 , dashcore :: sml :: llmq_type :: LLMQType :: LlmqtypeTest => dashcore_sml_llmq_type_LLMQType :: LlmqtypeTest , dashcore :: sml :: llmq_type :: LLMQType :: LlmqtypeDevnet => dashcore_sml_llmq_type_LLMQType :: LlmqtypeDevnet , dashcore :: sml :: llmq_type :: LLMQType :: LlmqtypeTestV17 => dashcore_sml_llmq_type_LLMQType :: LlmqtypeTestV17 , dashcore :: sml :: llmq_type :: LLMQType :: LlmqtypeTestDIP0024 => dashcore_sml_llmq_type_LLMQType :: LlmqtypeTestDIP0024 , dashcore :: sml :: llmq_type :: LLMQType :: LlmqtypeTestInstantSend => dashcore_sml_llmq_type_LLMQType :: LlmqtypeTestInstantSend , dashcore :: sml :: llmq_type :: LLMQType :: LlmqtypeDevnetDIP0024 => dashcore_sml_llmq_type_LLMQType :: LlmqtypeDevnetDIP0024 , dashcore :: sml :: llmq_type :: LLMQType :: LlmqtypeTestnetPlatform => dashcore_sml_llmq_type_LLMQType :: LlmqtypeTestnetPlatform , dashcore :: sml :: llmq_type :: LLMQType :: LlmqtypeDevnetPlatform => dashcore_sml_llmq_type_LLMQType :: LlmqtypeDevnetPlatform , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dashcore_sml_llmq_type_LLMQType { fn drop (& mut self) { unsafe { match self { dashcore_sml_llmq_type_LLMQType :: LlmqtypeUnknown => { } , dashcore_sml_llmq_type_LLMQType :: Llmqtype50_60 => { } , dashcore_sml_llmq_type_LLMQType :: Llmqtype400_60 => { } , dashcore_sml_llmq_type_LLMQType :: Llmqtype400_85 => { } , dashcore_sml_llmq_type_LLMQType :: Llmqtype100_67 => { } , dashcore_sml_llmq_type_LLMQType :: Llmqtype60_75 => { } , dashcore_sml_llmq_type_LLMQType :: Llmqtype25_67 => { } , dashcore_sml_llmq_type_LLMQType :: LlmqtypeTest => { } , dashcore_sml_llmq_type_LLMQType :: LlmqtypeDevnet => { } , dashcore_sml_llmq_type_LLMQType :: LlmqtypeTestV17 => { } , dashcore_sml_llmq_type_LLMQType :: LlmqtypeTestDIP0024 => { } , dashcore_sml_llmq_type_LLMQType :: LlmqtypeTestInstantSend => { } , dashcore_sml_llmq_type_LLMQType :: LlmqtypeDevnetDIP0024 => { } , dashcore_sml_llmq_type_LLMQType :: LlmqtypeTestnetPlatform => { } , dashcore_sml_llmq_type_LLMQType :: LlmqtypeDevnetPlatform => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_LlmqtypeUnknown_ctor () -> * mut dashcore_sml_llmq_type_LLMQType { ferment :: boxed (dashcore_sml_llmq_type_LLMQType :: LlmqtypeUnknown { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_Llmqtype50_60_ctor () -> * mut dashcore_sml_llmq_type_LLMQType { ferment :: boxed (dashcore_sml_llmq_type_LLMQType :: Llmqtype50_60 { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_Llmqtype400_60_ctor () -> * mut dashcore_sml_llmq_type_LLMQType { ferment :: boxed (dashcore_sml_llmq_type_LLMQType :: Llmqtype400_60 { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_Llmqtype400_85_ctor () -> * mut dashcore_sml_llmq_type_LLMQType { ferment :: boxed (dashcore_sml_llmq_type_LLMQType :: Llmqtype400_85 { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_Llmqtype100_67_ctor () -> * mut dashcore_sml_llmq_type_LLMQType { ferment :: boxed (dashcore_sml_llmq_type_LLMQType :: Llmqtype100_67 { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_Llmqtype60_75_ctor () -> * mut dashcore_sml_llmq_type_LLMQType { ferment :: boxed (dashcore_sml_llmq_type_LLMQType :: Llmqtype60_75 { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_Llmqtype25_67_ctor () -> * mut dashcore_sml_llmq_type_LLMQType { ferment :: boxed (dashcore_sml_llmq_type_LLMQType :: Llmqtype25_67 { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_LlmqtypeTest_ctor () -> * mut dashcore_sml_llmq_type_LLMQType { ferment :: boxed (dashcore_sml_llmq_type_LLMQType :: LlmqtypeTest { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_LlmqtypeDevnet_ctor () -> * mut dashcore_sml_llmq_type_LLMQType { ferment :: boxed (dashcore_sml_llmq_type_LLMQType :: LlmqtypeDevnet { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_LlmqtypeTestV17_ctor () -> * mut dashcore_sml_llmq_type_LLMQType { ferment :: boxed (dashcore_sml_llmq_type_LLMQType :: LlmqtypeTestV17 { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_LlmqtypeTestDIP0024_ctor () -> * mut dashcore_sml_llmq_type_LLMQType { ferment :: boxed (dashcore_sml_llmq_type_LLMQType :: LlmqtypeTestDIP0024 { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_LlmqtypeTestInstantSend_ctor () -> * mut dashcore_sml_llmq_type_LLMQType { ferment :: boxed (dashcore_sml_llmq_type_LLMQType :: LlmqtypeTestInstantSend { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_LlmqtypeDevnetDIP0024_ctor () -> * mut dashcore_sml_llmq_type_LLMQType { ferment :: boxed (dashcore_sml_llmq_type_LLMQType :: LlmqtypeDevnetDIP0024 { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_LlmqtypeTestnetPlatform_ctor () -> * mut dashcore_sml_llmq_type_LLMQType { ferment :: boxed (dashcore_sml_llmq_type_LLMQType :: LlmqtypeTestnetPlatform { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_LlmqtypeDevnetPlatform_ctor () -> * mut dashcore_sml_llmq_type_LLMQType { ferment :: boxed (dashcore_sml_llmq_type_LLMQType :: LlmqtypeDevnetPlatform { }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_llmq_type_LLMQType_destroy < > (ffi : * mut dashcore_sml_llmq_type_LLMQType) { ferment :: unbox_any (ffi) ; } } pub mod address { use crate as dash_spv_apple_bindings ; } pub mod quorum_entry { use crate as dash_spv_apple_bindings ; pub mod qualified_quorum_entry { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`VerifyingChainLockSignaturesType`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType { Rotating (* mut crate :: fermented :: generics :: Arr_dashcore_bls_sig_utils_BLSSignature_4) , NonRotating (* mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature) } impl ferment :: FFIConversionFrom < dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: VerifyingChainLockSignaturesType > for dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType { unsafe fn ffi_from_const (ffi : * const dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType) -> dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: VerifyingChainLockSignaturesType { let ffi_ref = & * ffi ; match ffi_ref { dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType :: Rotating (o_0) => dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: VerifyingChainLockSignaturesType :: Rotating (< crate :: fermented :: generics :: Arr_dashcore_bls_sig_utils_BLSSignature_4 as ferment :: FFIConversionFrom < [dashcore :: bls_sig_utils :: BLSSignature ; 4] >> :: ffi_from (* o_0)) , dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType :: NonRotating (o_0) => dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: VerifyingChainLockSignaturesType :: NonRotating (< crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionFrom < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: VerifyingChainLockSignaturesType > for dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType { unsafe fn ffi_to_const (obj : dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: VerifyingChainLockSignaturesType) -> * const dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType { ferment :: boxed (match obj { dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: VerifyingChainLockSignaturesType :: Rotating (o_0) => dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType :: Rotating (< crate :: fermented :: generics :: Arr_dashcore_bls_sig_utils_BLSSignature_4 as ferment :: FFIConversionTo < [dashcore :: bls_sig_utils :: BLSSignature ; 4] >> :: ffi_to (o_0)) , dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: VerifyingChainLockSignaturesType :: NonRotating (o_0) => dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType :: NonRotating (< crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionTo < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType { fn drop (& mut self) { unsafe { match self { dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType :: Rotating (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType :: NonRotating (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType_Rotating_ctor (o_o_0 : * mut crate :: fermented :: generics :: Arr_dashcore_bls_sig_utils_BLSSignature_4) -> * mut dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType { ferment :: boxed (dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType :: Rotating (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType_NonRotating_ctor (o_o_0 : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature) -> * mut dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType { ferment :: boxed (dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType :: NonRotating (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType_destroy < > (ffi : * mut dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`QualifiedQuorumEntry`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { pub quorum_entry : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry , pub verified : * mut crate :: fermented :: types :: dashcore :: sml :: llmq_entry_verification :: dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus , pub commitment_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumCommitmentHash , pub entry_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumEntryHash , pub verifying_chain_lock_signature : * mut crate :: fermented :: types :: dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType } impl ferment :: FFIConversionFrom < dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: QualifiedQuorumEntry > for dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { unsafe fn ffi_from_const (ffi : * const dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry) -> dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: QualifiedQuorumEntry { let ffi_ref = & * ffi ; dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: QualifiedQuorumEntry { quorum_entry : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: QuorumEntry >> :: ffi_from (ffi_ref . quorum_entry) , verified : < crate :: fermented :: types :: dashcore :: sml :: llmq_entry_verification :: dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus as ferment :: FFIConversionFrom < dashcore :: sml :: llmq_entry_verification :: LLMQEntryVerificationStatus >> :: ffi_from (ffi_ref . verified) , commitment_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumCommitmentHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: QuorumCommitmentHash >> :: ffi_from (ffi_ref . commitment_hash) , entry_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumEntryHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: QuorumEntryHash >> :: ffi_from (ffi_ref . entry_hash) , verifying_chain_lock_signature : < crate :: fermented :: types :: dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType as ferment :: FFIConversionFrom < dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: VerifyingChainLockSignaturesType >> :: ffi_from_opt (ffi_ref . verifying_chain_lock_signature) } } } impl ferment :: FFIConversionTo < dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: QualifiedQuorumEntry > for dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { unsafe fn ffi_to_const (obj : dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: QualifiedQuorumEntry) -> * const dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { ferment :: boxed (dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { quorum_entry : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: QuorumEntry >> :: ffi_to (obj . quorum_entry) , verified : < crate :: fermented :: types :: dashcore :: sml :: llmq_entry_verification :: dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus as ferment :: FFIConversionTo < dashcore :: sml :: llmq_entry_verification :: LLMQEntryVerificationStatus >> :: ffi_to (obj . verified) , commitment_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumCommitmentHash as ferment :: FFIConversionTo < dashcore :: hash_types :: QuorumCommitmentHash >> :: ffi_to (obj . commitment_hash) , entry_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumEntryHash as ferment :: FFIConversionTo < dashcore :: hash_types :: QuorumEntryHash >> :: ffi_to (obj . entry_hash) , verifying_chain_lock_signature : < crate :: fermented :: types :: dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType as ferment :: FFIConversionTo < dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: VerifyingChainLockSignaturesType >> :: ffi_to_opt (obj . verifying_chain_lock_signature) }) } } impl Drop for dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . quorum_entry) ; ferment :: unbox_any (ffi_ref . verified) ; ferment :: unbox_any (ffi_ref . commitment_hash) ; ferment :: unbox_any (ffi_ref . entry_hash) ; ferment :: unbox_any_opt (ffi_ref . verifying_chain_lock_signature) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry_ctor < > (quorum_entry : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry , verified : * mut crate :: fermented :: types :: dashcore :: sml :: llmq_entry_verification :: dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus , commitment_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumCommitmentHash , entry_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumEntryHash , verifying_chain_lock_signature : * mut crate :: fermented :: types :: dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType) -> * mut dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { ferment :: boxed (dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { quorum_entry , verified , commitment_hash , entry_hash , verifying_chain_lock_signature }) } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry_destroy < > (ffi : * mut dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry_get_quorum_entry < > (obj : * const dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry { (* obj) . quorum_entry } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry_get_verified < > (obj : * const dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_entry_verification :: dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus { (* obj) . verified } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry_get_commitment_hash < > (obj : * const dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumCommitmentHash { (* obj) . commitment_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry_get_entry_hash < > (obj : * const dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumEntryHash { (* obj) . entry_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry_get_verifying_chain_lock_signature < > (obj : * const dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry) -> * mut crate :: fermented :: types :: dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType { (* obj) . verifying_chain_lock_signature } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry_set_quorum_entry < > (obj : * const dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry { (* obj) . quorum_entry } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry_set_verified < > (obj : * const dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_entry_verification :: dashcore_sml_llmq_entry_verification_LLMQEntryVerificationStatus { (* obj) . verified } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry_set_commitment_hash < > (obj : * const dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumCommitmentHash { (* obj) . commitment_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry_set_entry_hash < > (obj : * const dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumEntryHash { (* obj) . entry_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry_set_verifying_chain_lock_signature < > (obj : * const dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry) -> * mut crate :: fermented :: types :: dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: dashcore_sml_quorum_entry_qualified_quorum_entry_VerifyingChainLockSignaturesType { (* obj) . verifying_chain_lock_signature } } } } pub mod consensus { use crate as dash_spv_apple_bindings ; pub mod encode { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "serde")] pub mod serde { use crate as dash_spv_apple_bindings ; pub mod hex { use crate as dash_spv_apple_bindings ; } } } pub mod hash_types { use crate as dash_spv_apple_bindings ; } pub mod bip158 { use crate as dash_spv_apple_bindings ; } pub mod base58 { use crate as dash_spv_apple_bindings ; } pub mod blockdata { use crate as dash_spv_apple_bindings ; pub mod constants { use crate as dash_spv_apple_bindings ; } pub mod script { use crate as dash_spv_apple_bindings ; pub mod owned { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ScriptBuf`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_blockdata_script_owned_ScriptBuf (* mut crate :: fermented :: generics :: Vec_u8) ; impl ferment :: FFIConversionFrom < dashcore :: blockdata :: script :: owned :: ScriptBuf > for dashcore_blockdata_script_owned_ScriptBuf { unsafe fn ffi_from_const (ffi : * const dashcore_blockdata_script_owned_ScriptBuf) -> dashcore :: blockdata :: script :: owned :: ScriptBuf { let ffi_ref = & * ffi ; dashcore :: blockdata :: script :: owned :: ScriptBuf (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (ffi_ref . 0)) } } impl ferment :: FFIConversionTo < dashcore :: blockdata :: script :: owned :: ScriptBuf > for dashcore_blockdata_script_owned_ScriptBuf { unsafe fn ffi_to_const (obj : dashcore :: blockdata :: script :: owned :: ScriptBuf) -> * const dashcore_blockdata_script_owned_ScriptBuf { ferment :: boxed (dashcore_blockdata_script_owned_ScriptBuf (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj . 0))) } } impl Drop for dashcore_blockdata_script_owned_ScriptBuf { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_script_owned_ScriptBuf_ctor < > (o_0 : * mut crate :: fermented :: generics :: Vec_u8) -> * mut dashcore_blockdata_script_owned_ScriptBuf { ferment :: boxed (dashcore_blockdata_script_owned_ScriptBuf (o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_script_owned_ScriptBuf_destroy < > (ffi : * mut dashcore_blockdata_script_owned_ScriptBuf) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_script_owned_ScriptBuf_get_0 < > (obj : * const dashcore_blockdata_script_owned_ScriptBuf) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_script_owned_ScriptBuf_set_0 < > (obj : * const dashcore_blockdata_script_owned_ScriptBuf) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . 0 } } pub mod push_bytes { use crate as dash_spv_apple_bindings ; } } pub mod locktime { use crate as dash_spv_apple_bindings ; pub mod relative { use crate as dash_spv_apple_bindings ; } pub mod absolute { use crate as dash_spv_apple_bindings ; } } pub mod block { use crate as dash_spv_apple_bindings ; } pub mod fee_rate { use crate as dash_spv_apple_bindings ; } pub mod weight { use crate as dash_spv_apple_bindings ; } pub mod witness { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`Witness`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_blockdata_witness_Witness { pub content : * mut crate :: fermented :: generics :: Vec_u8 , pub witness_elements : usize , pub indices_start : usize } impl ferment :: FFIConversionFrom < dashcore :: blockdata :: witness :: Witness > for dashcore_blockdata_witness_Witness { unsafe fn ffi_from_const (ffi : * const dashcore_blockdata_witness_Witness) -> dashcore :: blockdata :: witness :: Witness { let ffi_ref = & * ffi ; dashcore :: blockdata :: witness :: Witness { content : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (ffi_ref . content) , witness_elements : ffi_ref . witness_elements , indices_start : ffi_ref . indices_start } } } impl ferment :: FFIConversionTo < dashcore :: blockdata :: witness :: Witness > for dashcore_blockdata_witness_Witness { unsafe fn ffi_to_const (obj : dashcore :: blockdata :: witness :: Witness) -> * const dashcore_blockdata_witness_Witness { ferment :: boxed (dashcore_blockdata_witness_Witness { content : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj . content) , witness_elements : obj . witness_elements , indices_start : obj . indices_start }) } } impl Drop for dashcore_blockdata_witness_Witness { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . content) ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_witness_Witness_ctor < > (content : * mut crate :: fermented :: generics :: Vec_u8 , witness_elements : usize , indices_start : usize) -> * mut dashcore_blockdata_witness_Witness { ferment :: boxed (dashcore_blockdata_witness_Witness { content , witness_elements , indices_start }) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_witness_Witness_destroy < > (ffi : * mut dashcore_blockdata_witness_Witness) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_witness_Witness_get_content < > (obj : * const dashcore_blockdata_witness_Witness) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . content } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_witness_Witness_get_witness_elements < > (obj : * const dashcore_blockdata_witness_Witness) -> usize { (* obj) . witness_elements } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_witness_Witness_get_indices_start < > (obj : * const dashcore_blockdata_witness_Witness) -> usize { (* obj) . indices_start } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_witness_Witness_set_content < > (obj : * const dashcore_blockdata_witness_Witness) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . content } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_witness_Witness_set_witness_elements < > (obj : * const dashcore_blockdata_witness_Witness) -> usize { (* obj) . witness_elements } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_witness_Witness_set_indices_start < > (obj : * const dashcore_blockdata_witness_Witness) -> usize { (* obj) . indices_start } } pub mod opcodes { use crate as dash_spv_apple_bindings ; } pub mod transaction { use crate as dash_spv_apple_bindings ; pub mod special_transaction { use crate as dash_spv_apple_bindings ; pub mod coinbase { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`CoinbasePayload`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload { pub version : u16 , pub height : u32 , pub merkle_root_masternode_list : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootMasternodeList , pub merkle_root_quorums : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootQuorums , pub best_cl_height : * mut u32 , pub best_cl_signature : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature , pub asset_locked_amount : * mut u64 } impl ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: coinbase :: CoinbasePayload > for dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload { unsafe fn ffi_from_const (ffi : * const dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload) -> dashcore :: blockdata :: transaction :: special_transaction :: coinbase :: CoinbasePayload { let ffi_ref = & * ffi ; dashcore :: blockdata :: transaction :: special_transaction :: coinbase :: CoinbasePayload { version : ffi_ref . version , height : ffi_ref . height , merkle_root_masternode_list : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootMasternodeList as ferment :: FFIConversionFrom < dashcore :: hash_types :: MerkleRootMasternodeList >> :: ffi_from (ffi_ref . merkle_root_masternode_list) , merkle_root_quorums : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootQuorums as ferment :: FFIConversionFrom < dashcore :: hash_types :: MerkleRootQuorums >> :: ffi_from (ffi_ref . merkle_root_quorums) , best_cl_height : ferment :: from_opt_primitive (ffi_ref . best_cl_height) , best_cl_signature : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionFrom < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_from_opt (ffi_ref . best_cl_signature) , asset_locked_amount : ferment :: from_opt_primitive (ffi_ref . asset_locked_amount) } } } impl ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: coinbase :: CoinbasePayload > for dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload { unsafe fn ffi_to_const (obj : dashcore :: blockdata :: transaction :: special_transaction :: coinbase :: CoinbasePayload) -> * const dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload { version : obj . version , height : obj . height , merkle_root_masternode_list : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootMasternodeList as ferment :: FFIConversionTo < dashcore :: hash_types :: MerkleRootMasternodeList >> :: ffi_to (obj . merkle_root_masternode_list) , merkle_root_quorums : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootQuorums as ferment :: FFIConversionTo < dashcore :: hash_types :: MerkleRootQuorums >> :: ffi_to (obj . merkle_root_quorums) , best_cl_height : ferment :: to_opt_primitive (obj . best_cl_height) , best_cl_signature : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionTo < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_to_opt (obj . best_cl_signature) , asset_locked_amount : ferment :: to_opt_primitive (obj . asset_locked_amount) }) } } impl Drop for dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ferment :: unbox_any (ffi_ref . merkle_root_masternode_list) ; ferment :: unbox_any (ffi_ref . merkle_root_quorums) ; ferment :: destroy_opt_primitive (ffi_ref . best_cl_height) ; ferment :: unbox_any_opt (ffi_ref . best_cl_signature) ; ferment :: destroy_opt_primitive (ffi_ref . asset_locked_amount) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload_ctor < > (version : u16 , height : u32 , merkle_root_masternode_list : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootMasternodeList , merkle_root_quorums : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootQuorums , best_cl_height : * mut u32 , best_cl_signature : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature , asset_locked_amount : * mut u64) -> * mut dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload { version , height , merkle_root_masternode_list , merkle_root_quorums , best_cl_height , best_cl_signature , asset_locked_amount }) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload_destroy < > (ffi : * mut dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload_get_version < > (obj : * const dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload_get_height < > (obj : * const dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload) -> u32 { (* obj) . height } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload_get_merkle_root_masternode_list < > (obj : * const dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootMasternodeList { (* obj) . merkle_root_masternode_list } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload_get_merkle_root_quorums < > (obj : * const dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootQuorums { (* obj) . merkle_root_quorums } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload_get_best_cl_height < > (obj : * const dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload) -> * mut u32 { (* obj) . best_cl_height } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload_get_best_cl_signature < > (obj : * const dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature { (* obj) . best_cl_signature } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload_get_asset_locked_amount < > (obj : * const dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload) -> * mut u64 { (* obj) . asset_locked_amount } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload_set_version < > (obj : * const dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload_set_height < > (obj : * const dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload) -> u32 { (* obj) . height } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload_set_merkle_root_masternode_list < > (obj : * const dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootMasternodeList { (* obj) . merkle_root_masternode_list } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload_set_merkle_root_quorums < > (obj : * const dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_MerkleRootQuorums { (* obj) . merkle_root_quorums } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload_set_best_cl_height < > (obj : * const dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload) -> * mut u32 { (* obj) . best_cl_height } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload_set_best_cl_signature < > (obj : * const dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature { (* obj) . best_cl_signature } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload_set_asset_locked_amount < > (obj : * const dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload) -> * mut u64 { (* obj) . asset_locked_amount } } pub mod provider_update_service { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ProviderUpdateServicePayload`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload { pub version : u16 , pub pro_tx_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , pub ip_address : * mut [u8 ; 16] , pub port : u16 , pub script_payout : * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf , pub inputs_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash , pub payload_sig : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature } impl ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: provider_update_service :: ProviderUpdateServicePayload > for dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload { unsafe fn ffi_from_const (ffi : * const dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload) -> dashcore :: blockdata :: transaction :: special_transaction :: provider_update_service :: ProviderUpdateServicePayload { let ffi_ref = & * ffi ; dashcore :: blockdata :: transaction :: special_transaction :: provider_update_service :: ProviderUpdateServicePayload { version : ffi_ref . version , pro_tx_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionFrom < dashcore :: hash_types :: Txid >> :: ffi_from (ffi_ref . pro_tx_hash) , ip_address : < [u8 ; 16] as ferment :: FFIConversionFrom < u128 >> :: ffi_from (ffi_ref . ip_address) , port : ffi_ref . port , script_payout : < crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf as ferment :: FFIConversionFrom < dashcore :: blockdata :: script :: owned :: ScriptBuf >> :: ffi_from (ffi_ref . script_payout) , inputs_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: InputsHash >> :: ffi_from (ffi_ref . inputs_hash) , payload_sig : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionFrom < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_from (ffi_ref . payload_sig) } } } impl ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: provider_update_service :: ProviderUpdateServicePayload > for dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload { unsafe fn ffi_to_const (obj : dashcore :: blockdata :: transaction :: special_transaction :: provider_update_service :: ProviderUpdateServicePayload) -> * const dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload { version : obj . version , pro_tx_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionTo < dashcore :: hash_types :: Txid >> :: ffi_to (obj . pro_tx_hash) , ip_address : < [u8 ; 16] as ferment :: FFIConversionTo < u128 >> :: ffi_to (obj . ip_address) , port : obj . port , script_payout : < crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf as ferment :: FFIConversionTo < dashcore :: blockdata :: script :: owned :: ScriptBuf >> :: ffi_to (obj . script_payout) , inputs_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash as ferment :: FFIConversionTo < dashcore :: hash_types :: InputsHash >> :: ffi_to (obj . inputs_hash) , payload_sig : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionTo < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_to (obj . payload_sig) }) } } impl Drop for dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . pro_tx_hash) ; ferment :: unbox_any_opt (ffi_ref . ip_address) ; ; ferment :: unbox_any (ffi_ref . script_payout) ; ferment :: unbox_any (ffi_ref . inputs_hash) ; ferment :: unbox_any (ffi_ref . payload_sig) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload_ctor < > (version : u16 , pro_tx_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , ip_address : * mut [u8 ; 16] , port : u16 , script_payout : * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf , inputs_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash , payload_sig : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature) -> * mut dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload { version , pro_tx_hash , ip_address , port , script_payout , inputs_hash , payload_sig }) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload_destroy < > (ffi : * mut dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload_get_version < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload_get_pro_tx_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload_get_ip_address < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload) -> * mut [u8 ; 16] { (* obj) . ip_address } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload_get_port < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload) -> u16 { (* obj) . port } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload_get_script_payout < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf { (* obj) . script_payout } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload_get_inputs_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash { (* obj) . inputs_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload_get_payload_sig < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature { (* obj) . payload_sig } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload_set_version < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload_set_pro_tx_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload_set_ip_address < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload) -> * mut [u8 ; 16] { (* obj) . ip_address } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload_set_port < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload) -> u16 { (* obj) . port } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload_set_script_payout < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf { (* obj) . script_payout } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload_set_inputs_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash { (* obj) . inputs_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload_set_payload_sig < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature { (* obj) . payload_sig } } pub mod asset_lock { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`AssetLockPayload`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload { pub version : u8 , pub credit_outputs : * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut } impl ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: asset_lock :: AssetLockPayload > for dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload { unsafe fn ffi_from_const (ffi : * const dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload) -> dashcore :: blockdata :: transaction :: special_transaction :: asset_lock :: AssetLockPayload { let ffi_ref = & * ffi ; dashcore :: blockdata :: transaction :: special_transaction :: asset_lock :: AssetLockPayload { version : ffi_ref . version , credit_outputs : < crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut as ferment :: FFIConversionFrom < Vec < dashcore :: blockdata :: transaction :: txout :: TxOut > >> :: ffi_from (ffi_ref . credit_outputs) } } } impl ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: asset_lock :: AssetLockPayload > for dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload { unsafe fn ffi_to_const (obj : dashcore :: blockdata :: transaction :: special_transaction :: asset_lock :: AssetLockPayload) -> * const dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload { version : obj . version , credit_outputs : < crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut as ferment :: FFIConversionTo < Vec < dashcore :: blockdata :: transaction :: txout :: TxOut > >> :: ffi_to (obj . credit_outputs) }) } } impl Drop for dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . credit_outputs) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload_ctor < > (version : u8 , credit_outputs : * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut) -> * mut dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload { version , credit_outputs }) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload_destroy < > (ffi : * mut dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload_get_version < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload) -> u8 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload_get_credit_outputs < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload) -> * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut { (* obj) . credit_outputs } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload_set_version < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload) -> u8 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload_set_credit_outputs < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload) -> * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut { (* obj) . credit_outputs } } pub mod quorum_commitment { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`QuorumCommitmentPayload`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload { pub version : u16 , pub height : u32 , pub finalization_commitment : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry } impl ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: QuorumCommitmentPayload > for dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload { unsafe fn ffi_from_const (ffi : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload) -> dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: QuorumCommitmentPayload { let ffi_ref = & * ffi ; dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: QuorumCommitmentPayload { version : ffi_ref . version , height : ffi_ref . height , finalization_commitment : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: QuorumEntry >> :: ffi_from (ffi_ref . finalization_commitment) } } } impl ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: QuorumCommitmentPayload > for dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload { unsafe fn ffi_to_const (obj : dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: QuorumCommitmentPayload) -> * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload { version : obj . version , height : obj . height , finalization_commitment : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: QuorumEntry >> :: ffi_to (obj . finalization_commitment) }) } } impl Drop for dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ferment :: unbox_any (ffi_ref . finalization_commitment) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload_ctor < > (version : u16 , height : u32 , finalization_commitment : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> * mut dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload { version , height , finalization_commitment }) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload_destroy < > (ffi : * mut dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload_get_version < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload_get_height < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload) -> u32 { (* obj) . height } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload_get_finalization_commitment < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry { (* obj) . finalization_commitment } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload_set_version < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload_set_height < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload) -> u32 { (* obj) . height } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload_set_finalization_commitment < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry { (* obj) . finalization_commitment } # [doc = "FFI-representation of the [`QuorumEntry`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry { pub version : u16 , pub llmq_type : * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType , pub quorum_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash , pub quorum_index : * mut i16 , pub signers : * mut crate :: fermented :: generics :: Vec_bool , pub valid_members : * mut crate :: fermented :: generics :: Vec_bool , pub quorum_public_key : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey , pub quorum_vvec_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumVVecHash , pub threshold_sig : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature , pub all_commitment_aggregated_signature : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature } impl ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: QuorumEntry > for dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry { unsafe fn ffi_from_const (ffi : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: QuorumEntry { let ffi_ref = & * ffi ; dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: QuorumEntry { version : ffi_ref . version , llmq_type : < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionFrom < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_from (ffi_ref . llmq_type) , quorum_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: QuorumHash >> :: ffi_from (ffi_ref . quorum_hash) , quorum_index : ferment :: from_opt_primitive (ffi_ref . quorum_index) , signers : < crate :: fermented :: generics :: Vec_bool as ferment :: FFIConversionFrom < Vec < bool > >> :: ffi_from (ffi_ref . signers) , valid_members : < crate :: fermented :: generics :: Vec_bool as ferment :: FFIConversionFrom < Vec < bool > >> :: ffi_from (ffi_ref . valid_members) , quorum_public_key : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey as ferment :: FFIConversionFrom < dashcore :: bls_sig_utils :: BLSPublicKey >> :: ffi_from (ffi_ref . quorum_public_key) , quorum_vvec_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumVVecHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: QuorumVVecHash >> :: ffi_from (ffi_ref . quorum_vvec_hash) , threshold_sig : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionFrom < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_from (ffi_ref . threshold_sig) , all_commitment_aggregated_signature : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionFrom < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_from (ffi_ref . all_commitment_aggregated_signature) } } } impl ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: QuorumEntry > for dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry { unsafe fn ffi_to_const (obj : dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: QuorumEntry) -> * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry { version : obj . version , llmq_type : < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj . llmq_type) , quorum_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash as ferment :: FFIConversionTo < dashcore :: hash_types :: QuorumHash >> :: ffi_to (obj . quorum_hash) , quorum_index : ferment :: to_opt_primitive (obj . quorum_index) , signers : < crate :: fermented :: generics :: Vec_bool as ferment :: FFIConversionTo < Vec < bool > >> :: ffi_to (obj . signers) , valid_members : < crate :: fermented :: generics :: Vec_bool as ferment :: FFIConversionTo < Vec < bool > >> :: ffi_to (obj . valid_members) , quorum_public_key : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey as ferment :: FFIConversionTo < dashcore :: bls_sig_utils :: BLSPublicKey >> :: ffi_to (obj . quorum_public_key) , quorum_vvec_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumVVecHash as ferment :: FFIConversionTo < dashcore :: hash_types :: QuorumVVecHash >> :: ffi_to (obj . quorum_vvec_hash) , threshold_sig : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionTo < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_to (obj . threshold_sig) , all_commitment_aggregated_signature : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionTo < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_to (obj . all_commitment_aggregated_signature) }) } } impl Drop for dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . llmq_type) ; ferment :: unbox_any (ffi_ref . quorum_hash) ; ferment :: destroy_opt_primitive (ffi_ref . quorum_index) ; ferment :: unbox_any (ffi_ref . signers) ; ferment :: unbox_any (ffi_ref . valid_members) ; ferment :: unbox_any (ffi_ref . quorum_public_key) ; ferment :: unbox_any (ffi_ref . quorum_vvec_hash) ; ferment :: unbox_any (ffi_ref . threshold_sig) ; ferment :: unbox_any (ffi_ref . all_commitment_aggregated_signature) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_ctor < > (version : u16 , llmq_type : * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType , quorum_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash , quorum_index : * mut i16 , signers : * mut crate :: fermented :: generics :: Vec_bool , valid_members : * mut crate :: fermented :: generics :: Vec_bool , quorum_public_key : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey , quorum_vvec_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumVVecHash , threshold_sig : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature , all_commitment_aggregated_signature : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature) -> * mut dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry { version , llmq_type , quorum_hash , quorum_index , signers , valid_members , quorum_public_key , quorum_vvec_hash , threshold_sig , all_commitment_aggregated_signature }) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_destroy < > (ffi : * mut dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_get_version < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_get_llmq_type < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { (* obj) . llmq_type } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_get_quorum_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash { (* obj) . quorum_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_get_quorum_index < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> * mut i16 { (* obj) . quorum_index } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_get_signers < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> * mut crate :: fermented :: generics :: Vec_bool { (* obj) . signers } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_get_valid_members < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> * mut crate :: fermented :: generics :: Vec_bool { (* obj) . valid_members } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_get_quorum_public_key < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey { (* obj) . quorum_public_key } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_get_quorum_vvec_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumVVecHash { (* obj) . quorum_vvec_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_get_threshold_sig < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature { (* obj) . threshold_sig } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_get_all_commitment_aggregated_signature < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature { (* obj) . all_commitment_aggregated_signature } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_set_version < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_set_llmq_type < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { (* obj) . llmq_type } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_set_quorum_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash { (* obj) . quorum_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_set_quorum_index < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> * mut i16 { (* obj) . quorum_index } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_set_signers < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> * mut crate :: fermented :: generics :: Vec_bool { (* obj) . signers } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_set_valid_members < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> * mut crate :: fermented :: generics :: Vec_bool { (* obj) . valid_members } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_set_quorum_public_key < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey { (* obj) . quorum_public_key } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_set_quorum_vvec_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumVVecHash { (* obj) . quorum_vvec_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_set_threshold_sig < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature { (* obj) . threshold_sig } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry_set_all_commitment_aggregated_signature < > (obj : * const dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumEntry) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature { (* obj) . all_commitment_aggregated_signature } } pub mod provider_update_revocation { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ProviderUpdateRevocationPayload`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload { pub version : u16 , pub pro_tx_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , pub reason : u16 , pub inputs_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash , pub payload_sig : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature } impl ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: provider_update_revocation :: ProviderUpdateRevocationPayload > for dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload { unsafe fn ffi_from_const (ffi : * const dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload) -> dashcore :: blockdata :: transaction :: special_transaction :: provider_update_revocation :: ProviderUpdateRevocationPayload { let ffi_ref = & * ffi ; dashcore :: blockdata :: transaction :: special_transaction :: provider_update_revocation :: ProviderUpdateRevocationPayload { version : ffi_ref . version , pro_tx_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionFrom < dashcore :: hash_types :: Txid >> :: ffi_from (ffi_ref . pro_tx_hash) , reason : ffi_ref . reason , inputs_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: InputsHash >> :: ffi_from (ffi_ref . inputs_hash) , payload_sig : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionFrom < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_from (ffi_ref . payload_sig) } } } impl ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: provider_update_revocation :: ProviderUpdateRevocationPayload > for dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload { unsafe fn ffi_to_const (obj : dashcore :: blockdata :: transaction :: special_transaction :: provider_update_revocation :: ProviderUpdateRevocationPayload) -> * const dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload { version : obj . version , pro_tx_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionTo < dashcore :: hash_types :: Txid >> :: ffi_to (obj . pro_tx_hash) , reason : obj . reason , inputs_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash as ferment :: FFIConversionTo < dashcore :: hash_types :: InputsHash >> :: ffi_to (obj . inputs_hash) , payload_sig : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionTo < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_to (obj . payload_sig) }) } } impl Drop for dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . pro_tx_hash) ; ; ferment :: unbox_any (ffi_ref . inputs_hash) ; ferment :: unbox_any (ffi_ref . payload_sig) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload_ctor < > (version : u16 , pro_tx_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , reason : u16 , inputs_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash , payload_sig : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature) -> * mut dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload { version , pro_tx_hash , reason , inputs_hash , payload_sig }) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload_destroy < > (ffi : * mut dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload_get_version < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload_get_pro_tx_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload_get_reason < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload) -> u16 { (* obj) . reason } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload_get_inputs_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash { (* obj) . inputs_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload_get_payload_sig < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature { (* obj) . payload_sig } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload_set_version < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload_set_pro_tx_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload_set_reason < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload) -> u16 { (* obj) . reason } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload_set_inputs_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash { (* obj) . inputs_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload_set_payload_sig < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature { (* obj) . payload_sig } } pub mod provider_registration { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ProviderRegistrationPayload`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload { pub version : u16 , pub masternode_type : * mut dashcore :: blockdata :: transaction :: special_transaction :: provider_registration :: ProviderMasternodeType , pub masternode_mode : u16 , pub collateral_outpoint : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint , pub service_address : * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr , pub owner_key_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash , pub operator_public_key : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey , pub voting_key_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash , pub operator_reward : u16 , pub script_payout : * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf , pub inputs_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash , pub signature : * mut crate :: fermented :: generics :: Vec_u8 , pub platform_node_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash , pub platform_p2p_port : * mut u16 , pub platform_http_port : * mut u16 } impl ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: provider_registration :: ProviderRegistrationPayload > for dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload { unsafe fn ffi_from_const (ffi : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> dashcore :: blockdata :: transaction :: special_transaction :: provider_registration :: ProviderRegistrationPayload { let ffi_ref = & * ffi ; dashcore :: blockdata :: transaction :: special_transaction :: provider_registration :: ProviderRegistrationPayload { version : ffi_ref . version , masternode_type : (& * ffi_ref . masternode_type) . clone () , masternode_mode : ffi_ref . masternode_mode , collateral_outpoint : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_from (ffi_ref . collateral_outpoint) , service_address : < dash_spv_apple_bindings :: custom :: std :: SocketAddr as ferment :: FFIConversionFrom < std :: net :: SocketAddr >> :: ffi_from (ffi_ref . service_address) , owner_key_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: PubkeyHash >> :: ffi_from (ffi_ref . owner_key_hash) , operator_public_key : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey as ferment :: FFIConversionFrom < dashcore :: bls_sig_utils :: BLSPublicKey >> :: ffi_from (ffi_ref . operator_public_key) , voting_key_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: PubkeyHash >> :: ffi_from (ffi_ref . voting_key_hash) , operator_reward : ffi_ref . operator_reward , script_payout : < crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf as ferment :: FFIConversionFrom < dashcore :: blockdata :: script :: owned :: ScriptBuf >> :: ffi_from (ffi_ref . script_payout) , inputs_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: InputsHash >> :: ffi_from (ffi_ref . inputs_hash) , signature : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (ffi_ref . signature) , platform_node_id : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: PubkeyHash >> :: ffi_from_opt (ffi_ref . platform_node_id) , platform_p2p_port : ferment :: from_opt_primitive (ffi_ref . platform_p2p_port) , platform_http_port : ferment :: from_opt_primitive (ffi_ref . platform_http_port) } } } impl ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: provider_registration :: ProviderRegistrationPayload > for dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload { unsafe fn ffi_to_const (obj : dashcore :: blockdata :: transaction :: special_transaction :: provider_registration :: ProviderRegistrationPayload) -> * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload { version : obj . version , masternode_type : ferment :: boxed (obj . masternode_type) , masternode_mode : obj . masternode_mode , collateral_outpoint : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_to (obj . collateral_outpoint) , service_address : < dash_spv_apple_bindings :: custom :: std :: SocketAddr as ferment :: FFIConversionTo < std :: net :: SocketAddr >> :: ffi_to (obj . service_address) , owner_key_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash as ferment :: FFIConversionTo < dashcore :: hash_types :: PubkeyHash >> :: ffi_to (obj . owner_key_hash) , operator_public_key : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey as ferment :: FFIConversionTo < dashcore :: bls_sig_utils :: BLSPublicKey >> :: ffi_to (obj . operator_public_key) , voting_key_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash as ferment :: FFIConversionTo < dashcore :: hash_types :: PubkeyHash >> :: ffi_to (obj . voting_key_hash) , operator_reward : obj . operator_reward , script_payout : < crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf as ferment :: FFIConversionTo < dashcore :: blockdata :: script :: owned :: ScriptBuf >> :: ffi_to (obj . script_payout) , inputs_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash as ferment :: FFIConversionTo < dashcore :: hash_types :: InputsHash >> :: ffi_to (obj . inputs_hash) , signature : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj . signature) , platform_node_id : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash as ferment :: FFIConversionTo < dashcore :: hash_types :: PubkeyHash >> :: ffi_to_opt (obj . platform_node_id) , platform_p2p_port : ferment :: to_opt_primitive (obj . platform_p2p_port) , platform_http_port : ferment :: to_opt_primitive (obj . platform_http_port) }) } } impl Drop for dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . masternode_type) ; ; ferment :: unbox_any (ffi_ref . collateral_outpoint) ; ferment :: unbox_any (ffi_ref . service_address) ; ferment :: unbox_any (ffi_ref . owner_key_hash) ; ferment :: unbox_any (ffi_ref . operator_public_key) ; ferment :: unbox_any (ffi_ref . voting_key_hash) ; ; ferment :: unbox_any (ffi_ref . script_payout) ; ferment :: unbox_any (ffi_ref . inputs_hash) ; ferment :: unbox_any (ffi_ref . signature) ; ferment :: unbox_any_opt (ffi_ref . platform_node_id) ; ferment :: destroy_opt_primitive (ffi_ref . platform_p2p_port) ; ferment :: destroy_opt_primitive (ffi_ref . platform_http_port) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_ctor < > (version : u16 , masternode_type : * mut dashcore :: blockdata :: transaction :: special_transaction :: provider_registration :: ProviderMasternodeType , masternode_mode : u16 , collateral_outpoint : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint , service_address : * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr , owner_key_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash , operator_public_key : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey , voting_key_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash , operator_reward : u16 , script_payout : * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf , inputs_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash , signature : * mut crate :: fermented :: generics :: Vec_u8 , platform_node_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash , platform_p2p_port : * mut u16 , platform_http_port : * mut u16) -> * mut dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload { version , masternode_type , masternode_mode , collateral_outpoint , service_address , owner_key_hash , operator_public_key , voting_key_hash , operator_reward , script_payout , inputs_hash , signature , platform_node_id , platform_p2p_port , platform_http_port }) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_destroy < > (ffi : * mut dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_get_version < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_get_masternode_type < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut dashcore :: blockdata :: transaction :: special_transaction :: provider_registration :: ProviderMasternodeType { (* obj) . masternode_type } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_get_masternode_mode < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> u16 { (* obj) . masternode_mode } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_get_collateral_outpoint < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint { (* obj) . collateral_outpoint } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_get_service_address < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr { (* obj) . service_address } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_get_owner_key_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash { (* obj) . owner_key_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_get_operator_public_key < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey { (* obj) . operator_public_key } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_get_voting_key_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash { (* obj) . voting_key_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_get_operator_reward < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> u16 { (* obj) . operator_reward } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_get_script_payout < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf { (* obj) . script_payout } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_get_inputs_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash { (* obj) . inputs_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_get_signature < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_get_platform_node_id < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash { (* obj) . platform_node_id } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_get_platform_p2p_port < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut u16 { (* obj) . platform_p2p_port } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_get_platform_http_port < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut u16 { (* obj) . platform_http_port } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_set_version < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_set_masternode_type < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut dashcore :: blockdata :: transaction :: special_transaction :: provider_registration :: ProviderMasternodeType { (* obj) . masternode_type } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_set_masternode_mode < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> u16 { (* obj) . masternode_mode } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_set_collateral_outpoint < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint { (* obj) . collateral_outpoint } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_set_service_address < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr { (* obj) . service_address } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_set_owner_key_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash { (* obj) . owner_key_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_set_operator_public_key < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey { (* obj) . operator_public_key } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_set_voting_key_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash { (* obj) . voting_key_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_set_operator_reward < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> u16 { (* obj) . operator_reward } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_set_script_payout < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf { (* obj) . script_payout } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_set_inputs_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash { (* obj) . inputs_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_set_signature < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_set_platform_node_id < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash { (* obj) . platform_node_id } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_set_platform_p2p_port < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut u16 { (* obj) . platform_p2p_port } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload_set_platform_http_port < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut u16 { (* obj) . platform_http_port } } pub mod asset_unlock { use crate as dash_spv_apple_bindings ; pub mod qualified_asset_unlock { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`AssetUnlockPayload`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload { pub base : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: unqualified_asset_unlock :: dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload , pub request_info : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: request_info :: dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo , pub quorum_sig : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature } impl ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: qualified_asset_unlock :: AssetUnlockPayload > for dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload { unsafe fn ffi_from_const (ffi : * const dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload) -> dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: qualified_asset_unlock :: AssetUnlockPayload { let ffi_ref = & * ffi ; dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: qualified_asset_unlock :: AssetUnlockPayload { base : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: unqualified_asset_unlock :: dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: unqualified_asset_unlock :: AssetUnlockBasePayload >> :: ffi_from (ffi_ref . base) , request_info : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: request_info :: dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: request_info :: AssetUnlockRequestInfo >> :: ffi_from (ffi_ref . request_info) , quorum_sig : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionFrom < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_from (ffi_ref . quorum_sig) } } } impl ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: qualified_asset_unlock :: AssetUnlockPayload > for dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload { unsafe fn ffi_to_const (obj : dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: qualified_asset_unlock :: AssetUnlockPayload) -> * const dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload { base : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: unqualified_asset_unlock :: dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: unqualified_asset_unlock :: AssetUnlockBasePayload >> :: ffi_to (obj . base) , request_info : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: request_info :: dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: request_info :: AssetUnlockRequestInfo >> :: ffi_to (obj . request_info) , quorum_sig : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionTo < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_to (obj . quorum_sig) }) } } impl Drop for dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . base) ; ferment :: unbox_any (ffi_ref . request_info) ; ferment :: unbox_any (ffi_ref . quorum_sig) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload_ctor < > (base : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: unqualified_asset_unlock :: dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload , request_info : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: request_info :: dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo , quorum_sig : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature) -> * mut dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload { base , request_info , quorum_sig }) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload_destroy < > (ffi : * mut dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload_get_base < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: unqualified_asset_unlock :: dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload_get_request_info < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: request_info :: dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo { (* obj) . request_info } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload_get_quorum_sig < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature { (* obj) . quorum_sig } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload_set_base < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: unqualified_asset_unlock :: dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload_set_request_info < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: request_info :: dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo { (* obj) . request_info } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload_set_quorum_sig < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature { (* obj) . quorum_sig } } pub mod unqualified_asset_unlock { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`AssetUnlockBasePayload`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload { pub version : u8 , pub index : u64 , pub fee : u32 } impl ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: unqualified_asset_unlock :: AssetUnlockBasePayload > for dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload { unsafe fn ffi_from_const (ffi : * const dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload) -> dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: unqualified_asset_unlock :: AssetUnlockBasePayload { let ffi_ref = & * ffi ; dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: unqualified_asset_unlock :: AssetUnlockBasePayload { version : ffi_ref . version , index : ffi_ref . index , fee : ffi_ref . fee } } } impl ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: unqualified_asset_unlock :: AssetUnlockBasePayload > for dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload { unsafe fn ffi_to_const (obj : dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: unqualified_asset_unlock :: AssetUnlockBasePayload) -> * const dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload { version : obj . version , index : obj . index , fee : obj . fee }) } } impl Drop for dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload_ctor < > (version : u8 , index : u64 , fee : u32) -> * mut dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload { version , index , fee }) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload_destroy < > (ffi : * mut dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload_get_version < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload) -> u8 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload_get_index < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload) -> u64 { (* obj) . index } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload_get_fee < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload) -> u32 { (* obj) . fee } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload_set_version < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload) -> u8 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload_set_index < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload) -> u64 { (* obj) . index } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload_set_fee < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_unlock_unqualified_asset_unlock_AssetUnlockBasePayload) -> u32 { (* obj) . fee } } pub mod request_info { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`AssetUnlockRequestInfo`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo { pub request_height : u32 , pub quorum_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash } impl ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: request_info :: AssetUnlockRequestInfo > for dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo { unsafe fn ffi_from_const (ffi : * const dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo) -> dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: request_info :: AssetUnlockRequestInfo { let ffi_ref = & * ffi ; dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: request_info :: AssetUnlockRequestInfo { request_height : ffi_ref . request_height , quorum_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: QuorumHash >> :: ffi_from (ffi_ref . quorum_hash) } } } impl ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: request_info :: AssetUnlockRequestInfo > for dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo { unsafe fn ffi_to_const (obj : dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: request_info :: AssetUnlockRequestInfo) -> * const dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo { request_height : obj . request_height , quorum_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash as ferment :: FFIConversionTo < dashcore :: hash_types :: QuorumHash >> :: ffi_to (obj . quorum_hash) }) } } impl Drop for dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . quorum_hash) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo_ctor < > (request_height : u32 , quorum_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash) -> * mut dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo { request_height , quorum_hash }) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo_destroy < > (ffi : * mut dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo_get_request_height < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo) -> u32 { (* obj) . request_height } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo_get_quorum_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash { (* obj) . quorum_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo_set_request_height < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo) -> u32 { (* obj) . request_height } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo_set_quorum_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_asset_unlock_request_info_AssetUnlockRequestInfo) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash { (* obj) . quorum_hash } } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`TransactionPayload`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dashcore_blockdata_transaction_special_transaction_TransactionPayload { ProviderRegistrationPayloadType (* mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: provider_registration :: dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) , ProviderUpdateServicePayloadType (* mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: provider_update_service :: dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload) , ProviderUpdateRegistrarPayloadType (* mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: provider_update_registrar :: dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) , ProviderUpdateRevocationPayloadType (* mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: provider_update_revocation :: dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload) , CoinbasePayloadType (* mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: coinbase :: dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload) , QuorumCommitmentPayloadType (* mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload) , AssetLockPayloadType (* mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_lock :: dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload) , AssetUnlockPayloadType (* mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: qualified_asset_unlock :: dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload) } impl ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload > for dashcore_blockdata_transaction_special_transaction_TransactionPayload { unsafe fn ffi_from_const (ffi : * const dashcore_blockdata_transaction_special_transaction_TransactionPayload) -> dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload { let ffi_ref = & * ffi ; match ffi_ref { dashcore_blockdata_transaction_special_transaction_TransactionPayload :: ProviderRegistrationPayloadType (o_0) => dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload :: ProviderRegistrationPayloadType (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: provider_registration :: dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: provider_registration :: ProviderRegistrationPayload >> :: ffi_from (* o_0)) , dashcore_blockdata_transaction_special_transaction_TransactionPayload :: ProviderUpdateServicePayloadType (o_0) => dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload :: ProviderUpdateServicePayloadType (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: provider_update_service :: dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: provider_update_service :: ProviderUpdateServicePayload >> :: ffi_from (* o_0)) , dashcore_blockdata_transaction_special_transaction_TransactionPayload :: ProviderUpdateRegistrarPayloadType (o_0) => dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload :: ProviderUpdateRegistrarPayloadType (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: provider_update_registrar :: dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: provider_update_registrar :: ProviderUpdateRegistrarPayload >> :: ffi_from (* o_0)) , dashcore_blockdata_transaction_special_transaction_TransactionPayload :: ProviderUpdateRevocationPayloadType (o_0) => dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload :: ProviderUpdateRevocationPayloadType (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: provider_update_revocation :: dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: provider_update_revocation :: ProviderUpdateRevocationPayload >> :: ffi_from (* o_0)) , dashcore_blockdata_transaction_special_transaction_TransactionPayload :: CoinbasePayloadType (o_0) => dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload :: CoinbasePayloadType (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: coinbase :: dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: coinbase :: CoinbasePayload >> :: ffi_from (* o_0)) , dashcore_blockdata_transaction_special_transaction_TransactionPayload :: QuorumCommitmentPayloadType (o_0) => dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload :: QuorumCommitmentPayloadType (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: QuorumCommitmentPayload >> :: ffi_from (* o_0)) , dashcore_blockdata_transaction_special_transaction_TransactionPayload :: AssetLockPayloadType (o_0) => dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload :: AssetLockPayloadType (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_lock :: dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: asset_lock :: AssetLockPayload >> :: ffi_from (* o_0)) , dashcore_blockdata_transaction_special_transaction_TransactionPayload :: AssetUnlockPayloadType (o_0) => dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload :: AssetUnlockPayloadType (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: qualified_asset_unlock :: dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: qualified_asset_unlock :: AssetUnlockPayload >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload > for dashcore_blockdata_transaction_special_transaction_TransactionPayload { unsafe fn ffi_to_const (obj : dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload) -> * const dashcore_blockdata_transaction_special_transaction_TransactionPayload { ferment :: boxed (match obj { dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload :: ProviderRegistrationPayloadType (o_0) => dashcore_blockdata_transaction_special_transaction_TransactionPayload :: ProviderRegistrationPayloadType (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: provider_registration :: dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: provider_registration :: ProviderRegistrationPayload >> :: ffi_to (o_0)) , dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload :: ProviderUpdateServicePayloadType (o_0) => dashcore_blockdata_transaction_special_transaction_TransactionPayload :: ProviderUpdateServicePayloadType (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: provider_update_service :: dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: provider_update_service :: ProviderUpdateServicePayload >> :: ffi_to (o_0)) , dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload :: ProviderUpdateRegistrarPayloadType (o_0) => dashcore_blockdata_transaction_special_transaction_TransactionPayload :: ProviderUpdateRegistrarPayloadType (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: provider_update_registrar :: dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: provider_update_registrar :: ProviderUpdateRegistrarPayload >> :: ffi_to (o_0)) , dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload :: ProviderUpdateRevocationPayloadType (o_0) => dashcore_blockdata_transaction_special_transaction_TransactionPayload :: ProviderUpdateRevocationPayloadType (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: provider_update_revocation :: dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: provider_update_revocation :: ProviderUpdateRevocationPayload >> :: ffi_to (o_0)) , dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload :: CoinbasePayloadType (o_0) => dashcore_blockdata_transaction_special_transaction_TransactionPayload :: CoinbasePayloadType (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: coinbase :: dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: coinbase :: CoinbasePayload >> :: ffi_to (o_0)) , dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload :: QuorumCommitmentPayloadType (o_0) => dashcore_blockdata_transaction_special_transaction_TransactionPayload :: QuorumCommitmentPayloadType (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: QuorumCommitmentPayload >> :: ffi_to (o_0)) , dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload :: AssetLockPayloadType (o_0) => dashcore_blockdata_transaction_special_transaction_TransactionPayload :: AssetLockPayloadType (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_lock :: dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: asset_lock :: AssetLockPayload >> :: ffi_to (o_0)) , dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload :: AssetUnlockPayloadType (o_0) => dashcore_blockdata_transaction_special_transaction_TransactionPayload :: AssetUnlockPayloadType (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: qualified_asset_unlock :: dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: qualified_asset_unlock :: AssetUnlockPayload >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dashcore_blockdata_transaction_special_transaction_TransactionPayload { fn drop (& mut self) { unsafe { match self { dashcore_blockdata_transaction_special_transaction_TransactionPayload :: ProviderRegistrationPayloadType (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_blockdata_transaction_special_transaction_TransactionPayload :: ProviderUpdateServicePayloadType (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_blockdata_transaction_special_transaction_TransactionPayload :: ProviderUpdateRegistrarPayloadType (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_blockdata_transaction_special_transaction_TransactionPayload :: ProviderUpdateRevocationPayloadType (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_blockdata_transaction_special_transaction_TransactionPayload :: CoinbasePayloadType (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_blockdata_transaction_special_transaction_TransactionPayload :: QuorumCommitmentPayloadType (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_blockdata_transaction_special_transaction_TransactionPayload :: AssetLockPayloadType (o_0) => { ferment :: unbox_any (* o_0) ; } , dashcore_blockdata_transaction_special_transaction_TransactionPayload :: AssetUnlockPayloadType (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_TransactionPayload_ProviderRegistrationPayloadType_ctor (o_o_0 : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: provider_registration :: dashcore_blockdata_transaction_special_transaction_provider_registration_ProviderRegistrationPayload) -> * mut dashcore_blockdata_transaction_special_transaction_TransactionPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_TransactionPayload :: ProviderRegistrationPayloadType (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_TransactionPayload_ProviderUpdateServicePayloadType_ctor (o_o_0 : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: provider_update_service :: dashcore_blockdata_transaction_special_transaction_provider_update_service_ProviderUpdateServicePayload) -> * mut dashcore_blockdata_transaction_special_transaction_TransactionPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_TransactionPayload :: ProviderUpdateServicePayloadType (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_TransactionPayload_ProviderUpdateRegistrarPayloadType_ctor (o_o_0 : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: provider_update_registrar :: dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) -> * mut dashcore_blockdata_transaction_special_transaction_TransactionPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_TransactionPayload :: ProviderUpdateRegistrarPayloadType (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_TransactionPayload_ProviderUpdateRevocationPayloadType_ctor (o_o_0 : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: provider_update_revocation :: dashcore_blockdata_transaction_special_transaction_provider_update_revocation_ProviderUpdateRevocationPayload) -> * mut dashcore_blockdata_transaction_special_transaction_TransactionPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_TransactionPayload :: ProviderUpdateRevocationPayloadType (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_TransactionPayload_CoinbasePayloadType_ctor (o_o_0 : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: coinbase :: dashcore_blockdata_transaction_special_transaction_coinbase_CoinbasePayload) -> * mut dashcore_blockdata_transaction_special_transaction_TransactionPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_TransactionPayload :: CoinbasePayloadType (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_TransactionPayload_QuorumCommitmentPayloadType_ctor (o_o_0 : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: quorum_commitment :: dashcore_blockdata_transaction_special_transaction_quorum_commitment_QuorumCommitmentPayload) -> * mut dashcore_blockdata_transaction_special_transaction_TransactionPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_TransactionPayload :: QuorumCommitmentPayloadType (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_TransactionPayload_AssetLockPayloadType_ctor (o_o_0 : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_lock :: dashcore_blockdata_transaction_special_transaction_asset_lock_AssetLockPayload) -> * mut dashcore_blockdata_transaction_special_transaction_TransactionPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_TransactionPayload :: AssetLockPayloadType (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_TransactionPayload_AssetUnlockPayloadType_ctor (o_o_0 : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: asset_unlock :: qualified_asset_unlock :: dashcore_blockdata_transaction_special_transaction_asset_unlock_qualified_asset_unlock_AssetUnlockPayload) -> * mut dashcore_blockdata_transaction_special_transaction_TransactionPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_TransactionPayload :: AssetUnlockPayloadType (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_TransactionPayload_destroy < > (ffi : * mut dashcore_blockdata_transaction_special_transaction_TransactionPayload) { ferment :: unbox_any (ffi) ; } pub mod provider_update_registrar { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ProviderUpdateRegistrarPayload`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload { pub version : u16 , pub pro_tx_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , pub provider_mode : u16 , pub operator_public_key : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey , pub voting_key_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash , pub script_payout : * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf , pub inputs_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash , pub payload_sig : * mut crate :: fermented :: generics :: Vec_u8 } impl ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: provider_update_registrar :: ProviderUpdateRegistrarPayload > for dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload { unsafe fn ffi_from_const (ffi : * const dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) -> dashcore :: blockdata :: transaction :: special_transaction :: provider_update_registrar :: ProviderUpdateRegistrarPayload { let ffi_ref = & * ffi ; dashcore :: blockdata :: transaction :: special_transaction :: provider_update_registrar :: ProviderUpdateRegistrarPayload { version : ffi_ref . version , pro_tx_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionFrom < dashcore :: hash_types :: Txid >> :: ffi_from (ffi_ref . pro_tx_hash) , provider_mode : ffi_ref . provider_mode , operator_public_key : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey as ferment :: FFIConversionFrom < dashcore :: bls_sig_utils :: BLSPublicKey >> :: ffi_from (ffi_ref . operator_public_key) , voting_key_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: PubkeyHash >> :: ffi_from (ffi_ref . voting_key_hash) , script_payout : < crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf as ferment :: FFIConversionFrom < dashcore :: blockdata :: script :: owned :: ScriptBuf >> :: ffi_from (ffi_ref . script_payout) , inputs_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: InputsHash >> :: ffi_from (ffi_ref . inputs_hash) , payload_sig : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (ffi_ref . payload_sig) } } } impl ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: provider_update_registrar :: ProviderUpdateRegistrarPayload > for dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload { unsafe fn ffi_to_const (obj : dashcore :: blockdata :: transaction :: special_transaction :: provider_update_registrar :: ProviderUpdateRegistrarPayload) -> * const dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload { version : obj . version , pro_tx_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionTo < dashcore :: hash_types :: Txid >> :: ffi_to (obj . pro_tx_hash) , provider_mode : obj . provider_mode , operator_public_key : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey as ferment :: FFIConversionTo < dashcore :: bls_sig_utils :: BLSPublicKey >> :: ffi_to (obj . operator_public_key) , voting_key_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash as ferment :: FFIConversionTo < dashcore :: hash_types :: PubkeyHash >> :: ffi_to (obj . voting_key_hash) , script_payout : < crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf as ferment :: FFIConversionTo < dashcore :: blockdata :: script :: owned :: ScriptBuf >> :: ffi_to (obj . script_payout) , inputs_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash as ferment :: FFIConversionTo < dashcore :: hash_types :: InputsHash >> :: ffi_to (obj . inputs_hash) , payload_sig : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj . payload_sig) }) } } impl Drop for dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . pro_tx_hash) ; ; ferment :: unbox_any (ffi_ref . operator_public_key) ; ferment :: unbox_any (ffi_ref . voting_key_hash) ; ferment :: unbox_any (ffi_ref . script_payout) ; ferment :: unbox_any (ffi_ref . inputs_hash) ; ferment :: unbox_any (ffi_ref . payload_sig) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload_ctor < > (version : u16 , pro_tx_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , provider_mode : u16 , operator_public_key : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey , voting_key_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash , script_payout : * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf , inputs_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash , payload_sig : * mut crate :: fermented :: generics :: Vec_u8) -> * mut dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload { ferment :: boxed (dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload { version , pro_tx_hash , provider_mode , operator_public_key , voting_key_hash , script_payout , inputs_hash , payload_sig }) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload_destroy < > (ffi : * mut dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload_get_version < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload_get_pro_tx_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload_get_provider_mode < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) -> u16 { (* obj) . provider_mode } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload_get_operator_public_key < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey { (* obj) . operator_public_key } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload_get_voting_key_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash { (* obj) . voting_key_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload_get_script_payout < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf { (* obj) . script_payout } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload_get_inputs_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash { (* obj) . inputs_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload_get_payload_sig < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . payload_sig } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload_set_version < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload_set_pro_tx_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload_set_provider_mode < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) -> u16 { (* obj) . provider_mode } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload_set_operator_public_key < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey { (* obj) . operator_public_key } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload_set_voting_key_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash { (* obj) . voting_key_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload_set_script_payout < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf { (* obj) . script_payout } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload_set_inputs_hash < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_InputsHash { (* obj) . inputs_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload_set_payload_sig < > (obj : * const dashcore_blockdata_transaction_special_transaction_provider_update_registrar_ProviderUpdateRegistrarPayload) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . payload_sig } } } pub mod outpoint { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`OutPoint`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_blockdata_transaction_outpoint_OutPoint { pub txid : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , pub vout : u32 } impl ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: outpoint :: OutPoint > for dashcore_blockdata_transaction_outpoint_OutPoint { unsafe fn ffi_from_const (ffi : * const dashcore_blockdata_transaction_outpoint_OutPoint) -> dashcore :: blockdata :: transaction :: outpoint :: OutPoint { let ffi_ref = & * ffi ; dashcore :: blockdata :: transaction :: outpoint :: OutPoint { txid : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionFrom < dashcore :: hash_types :: Txid >> :: ffi_from (ffi_ref . txid) , vout : ffi_ref . vout } } } impl ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: outpoint :: OutPoint > for dashcore_blockdata_transaction_outpoint_OutPoint { unsafe fn ffi_to_const (obj : dashcore :: blockdata :: transaction :: outpoint :: OutPoint) -> * const dashcore_blockdata_transaction_outpoint_OutPoint { ferment :: boxed (dashcore_blockdata_transaction_outpoint_OutPoint { txid : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionTo < dashcore :: hash_types :: Txid >> :: ffi_to (obj . txid) , vout : obj . vout }) } } impl Drop for dashcore_blockdata_transaction_outpoint_OutPoint { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . txid) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_outpoint_OutPoint_ctor < > (txid : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , vout : u32) -> * mut dashcore_blockdata_transaction_outpoint_OutPoint { ferment :: boxed (dashcore_blockdata_transaction_outpoint_OutPoint { txid , vout }) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_outpoint_OutPoint_destroy < > (ffi : * mut dashcore_blockdata_transaction_outpoint_OutPoint) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_outpoint_OutPoint_get_txid < > (obj : * const dashcore_blockdata_transaction_outpoint_OutPoint) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . txid } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_outpoint_OutPoint_get_vout < > (obj : * const dashcore_blockdata_transaction_outpoint_OutPoint) -> u32 { (* obj) . vout } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_outpoint_OutPoint_set_txid < > (obj : * const dashcore_blockdata_transaction_outpoint_OutPoint) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . txid } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_outpoint_OutPoint_set_vout < > (obj : * const dashcore_blockdata_transaction_outpoint_OutPoint) -> u32 { (* obj) . vout } } pub mod txout { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TxOut`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_blockdata_transaction_txout_TxOut { pub value : u64 , pub script_pubkey : * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf } impl ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: txout :: TxOut > for dashcore_blockdata_transaction_txout_TxOut { unsafe fn ffi_from_const (ffi : * const dashcore_blockdata_transaction_txout_TxOut) -> dashcore :: blockdata :: transaction :: txout :: TxOut { let ffi_ref = & * ffi ; dashcore :: blockdata :: transaction :: txout :: TxOut { value : ffi_ref . value , script_pubkey : < crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf as ferment :: FFIConversionFrom < dashcore :: blockdata :: script :: owned :: ScriptBuf >> :: ffi_from (ffi_ref . script_pubkey) } } } impl ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: txout :: TxOut > for dashcore_blockdata_transaction_txout_TxOut { unsafe fn ffi_to_const (obj : dashcore :: blockdata :: transaction :: txout :: TxOut) -> * const dashcore_blockdata_transaction_txout_TxOut { ferment :: boxed (dashcore_blockdata_transaction_txout_TxOut { value : obj . value , script_pubkey : < crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf as ferment :: FFIConversionTo < dashcore :: blockdata :: script :: owned :: ScriptBuf >> :: ffi_to (obj . script_pubkey) }) } } impl Drop for dashcore_blockdata_transaction_txout_TxOut { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . script_pubkey) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_txout_TxOut_ctor < > (value : u64 , script_pubkey : * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf) -> * mut dashcore_blockdata_transaction_txout_TxOut { ferment :: boxed (dashcore_blockdata_transaction_txout_TxOut { value , script_pubkey }) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_txout_TxOut_destroy < > (ffi : * mut dashcore_blockdata_transaction_txout_TxOut) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_txout_TxOut_get_value < > (obj : * const dashcore_blockdata_transaction_txout_TxOut) -> u64 { (* obj) . value } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_txout_TxOut_get_script_pubkey < > (obj : * const dashcore_blockdata_transaction_txout_TxOut) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf { (* obj) . script_pubkey } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_txout_TxOut_set_value < > (obj : * const dashcore_blockdata_transaction_txout_TxOut) -> u64 { (* obj) . value } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_txout_TxOut_set_script_pubkey < > (obj : * const dashcore_blockdata_transaction_txout_TxOut) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf { (* obj) . script_pubkey } } # [doc = "FFI-representation of the [`Transaction`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_blockdata_transaction_Transaction { pub version : u16 , pub lock_time : u32 , pub input : * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn , pub output : * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut , pub special_transaction_payload : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: dashcore_blockdata_transaction_special_transaction_TransactionPayload } impl ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: Transaction > for dashcore_blockdata_transaction_Transaction { unsafe fn ffi_from_const (ffi : * const dashcore_blockdata_transaction_Transaction) -> dashcore :: blockdata :: transaction :: Transaction { let ffi_ref = & * ffi ; dashcore :: blockdata :: transaction :: Transaction { version : ffi_ref . version , lock_time : ffi_ref . lock_time , input : < crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn as ferment :: FFIConversionFrom < Vec < dashcore :: blockdata :: transaction :: txin :: TxIn > >> :: ffi_from (ffi_ref . input) , output : < crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut as ferment :: FFIConversionFrom < Vec < dashcore :: blockdata :: transaction :: txout :: TxOut > >> :: ffi_from (ffi_ref . output) , special_transaction_payload : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: dashcore_blockdata_transaction_special_transaction_TransactionPayload as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload >> :: ffi_from_opt (ffi_ref . special_transaction_payload) } } } impl ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: Transaction > for dashcore_blockdata_transaction_Transaction { unsafe fn ffi_to_const (obj : dashcore :: blockdata :: transaction :: Transaction) -> * const dashcore_blockdata_transaction_Transaction { ferment :: boxed (dashcore_blockdata_transaction_Transaction { version : obj . version , lock_time : obj . lock_time , input : < crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn as ferment :: FFIConversionTo < Vec < dashcore :: blockdata :: transaction :: txin :: TxIn > >> :: ffi_to (obj . input) , output : < crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut as ferment :: FFIConversionTo < Vec < dashcore :: blockdata :: transaction :: txout :: TxOut > >> :: ffi_to (obj . output) , special_transaction_payload : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: dashcore_blockdata_transaction_special_transaction_TransactionPayload as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: special_transaction :: TransactionPayload >> :: ffi_to_opt (obj . special_transaction_payload) }) } } impl Drop for dashcore_blockdata_transaction_Transaction { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ferment :: unbox_any (ffi_ref . input) ; ferment :: unbox_any (ffi_ref . output) ; ferment :: unbox_any_opt (ffi_ref . special_transaction_payload) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_Transaction_ctor < > (version : u16 , lock_time : u32 , input : * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn , output : * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut , special_transaction_payload : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: dashcore_blockdata_transaction_special_transaction_TransactionPayload) -> * mut dashcore_blockdata_transaction_Transaction { ferment :: boxed (dashcore_blockdata_transaction_Transaction { version , lock_time , input , output , special_transaction_payload }) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_Transaction_destroy < > (ffi : * mut dashcore_blockdata_transaction_Transaction) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_Transaction_get_version < > (obj : * const dashcore_blockdata_transaction_Transaction) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_Transaction_get_lock_time < > (obj : * const dashcore_blockdata_transaction_Transaction) -> u32 { (* obj) . lock_time } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_Transaction_get_input < > (obj : * const dashcore_blockdata_transaction_Transaction) -> * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn { (* obj) . input } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_Transaction_get_output < > (obj : * const dashcore_blockdata_transaction_Transaction) -> * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut { (* obj) . output } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_Transaction_get_special_transaction_payload < > (obj : * const dashcore_blockdata_transaction_Transaction) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: dashcore_blockdata_transaction_special_transaction_TransactionPayload { (* obj) . special_transaction_payload } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_Transaction_set_version < > (obj : * const dashcore_blockdata_transaction_Transaction) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_Transaction_set_lock_time < > (obj : * const dashcore_blockdata_transaction_Transaction) -> u32 { (* obj) . lock_time } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_Transaction_set_input < > (obj : * const dashcore_blockdata_transaction_Transaction) -> * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn { (* obj) . input } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_Transaction_set_output < > (obj : * const dashcore_blockdata_transaction_Transaction) -> * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut { (* obj) . output } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_Transaction_set_special_transaction_payload < > (obj : * const dashcore_blockdata_transaction_Transaction) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: special_transaction :: dashcore_blockdata_transaction_special_transaction_TransactionPayload { (* obj) . special_transaction_payload } pub mod hash_type { use crate as dash_spv_apple_bindings ; } pub mod txin { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TxIn`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_blockdata_transaction_txin_TxIn { pub previous_output : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint , pub script_sig : * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf , pub sequence : u32 , pub witness : * mut crate :: fermented :: types :: dashcore :: blockdata :: witness :: dashcore_blockdata_witness_Witness } impl ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: txin :: TxIn > for dashcore_blockdata_transaction_txin_TxIn { unsafe fn ffi_from_const (ffi : * const dashcore_blockdata_transaction_txin_TxIn) -> dashcore :: blockdata :: transaction :: txin :: TxIn { let ffi_ref = & * ffi ; dashcore :: blockdata :: transaction :: txin :: TxIn { previous_output : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_from (ffi_ref . previous_output) , script_sig : < crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf as ferment :: FFIConversionFrom < dashcore :: blockdata :: script :: owned :: ScriptBuf >> :: ffi_from (ffi_ref . script_sig) , sequence : ffi_ref . sequence , witness : < crate :: fermented :: types :: dashcore :: blockdata :: witness :: dashcore_blockdata_witness_Witness as ferment :: FFIConversionFrom < dashcore :: blockdata :: witness :: Witness >> :: ffi_from (ffi_ref . witness) } } } impl ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: txin :: TxIn > for dashcore_blockdata_transaction_txin_TxIn { unsafe fn ffi_to_const (obj : dashcore :: blockdata :: transaction :: txin :: TxIn) -> * const dashcore_blockdata_transaction_txin_TxIn { ferment :: boxed (dashcore_blockdata_transaction_txin_TxIn { previous_output : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_to (obj . previous_output) , script_sig : < crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf as ferment :: FFIConversionTo < dashcore :: blockdata :: script :: owned :: ScriptBuf >> :: ffi_to (obj . script_sig) , sequence : obj . sequence , witness : < crate :: fermented :: types :: dashcore :: blockdata :: witness :: dashcore_blockdata_witness_Witness as ferment :: FFIConversionTo < dashcore :: blockdata :: witness :: Witness >> :: ffi_to (obj . witness) }) } } impl Drop for dashcore_blockdata_transaction_txin_TxIn { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . previous_output) ; ferment :: unbox_any (ffi_ref . script_sig) ; ; ferment :: unbox_any (ffi_ref . witness) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_txin_TxIn_ctor < > (previous_output : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint , script_sig : * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf , sequence : u32 , witness : * mut crate :: fermented :: types :: dashcore :: blockdata :: witness :: dashcore_blockdata_witness_Witness) -> * mut dashcore_blockdata_transaction_txin_TxIn { ferment :: boxed (dashcore_blockdata_transaction_txin_TxIn { previous_output , script_sig , sequence , witness }) } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_txin_TxIn_destroy < > (ffi : * mut dashcore_blockdata_transaction_txin_TxIn) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_txin_TxIn_get_previous_output < > (obj : * const dashcore_blockdata_transaction_txin_TxIn) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint { (* obj) . previous_output } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_txin_TxIn_get_script_sig < > (obj : * const dashcore_blockdata_transaction_txin_TxIn) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf { (* obj) . script_sig } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_txin_TxIn_get_sequence < > (obj : * const dashcore_blockdata_transaction_txin_TxIn) -> u32 { (* obj) . sequence } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_txin_TxIn_get_witness < > (obj : * const dashcore_blockdata_transaction_txin_TxIn) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: witness :: dashcore_blockdata_witness_Witness { (* obj) . witness } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_txin_TxIn_set_previous_output < > (obj : * const dashcore_blockdata_transaction_txin_TxIn) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint { (* obj) . previous_output } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_txin_TxIn_set_script_sig < > (obj : * const dashcore_blockdata_transaction_txin_TxIn) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: script :: owned :: dashcore_blockdata_script_owned_ScriptBuf { (* obj) . script_sig } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_txin_TxIn_set_sequence < > (obj : * const dashcore_blockdata_transaction_txin_TxIn) -> u32 { (* obj) . sequence } # [no_mangle] pub unsafe extern "C" fn dashcore_blockdata_transaction_txin_TxIn_set_witness < > (obj : * const dashcore_blockdata_transaction_txin_TxIn) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: witness :: dashcore_blockdata_witness_Witness { (* obj) . witness } } } } pub mod address { use crate as dash_spv_apple_bindings ; } pub mod pow { use crate as dash_spv_apple_bindings ; } pub mod crypto { use crate as dash_spv_apple_bindings ; pub mod sighash { use crate as dash_spv_apple_bindings ; } pub mod key { use crate as dash_spv_apple_bindings ; } } pub mod ephemerealdata { use crate as dash_spv_apple_bindings ; pub mod chain_lock { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ChainLock`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_ephemerealdata_chain_lock_ChainLock { pub block_height : u32 , pub block_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash , pub signature : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature } impl ferment :: FFIConversionFrom < dashcore :: ephemerealdata :: chain_lock :: ChainLock > for dashcore_ephemerealdata_chain_lock_ChainLock { unsafe fn ffi_from_const (ffi : * const dashcore_ephemerealdata_chain_lock_ChainLock) -> dashcore :: ephemerealdata :: chain_lock :: ChainLock { let ffi_ref = & * ffi ; dashcore :: ephemerealdata :: chain_lock :: ChainLock { block_height : ffi_ref . block_height , block_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: BlockHash >> :: ffi_from (ffi_ref . block_hash) , signature : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionFrom < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_from (ffi_ref . signature) } } } impl ferment :: FFIConversionTo < dashcore :: ephemerealdata :: chain_lock :: ChainLock > for dashcore_ephemerealdata_chain_lock_ChainLock { unsafe fn ffi_to_const (obj : dashcore :: ephemerealdata :: chain_lock :: ChainLock) -> * const dashcore_ephemerealdata_chain_lock_ChainLock { ferment :: boxed (dashcore_ephemerealdata_chain_lock_ChainLock { block_height : obj . block_height , block_hash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionTo < dashcore :: hash_types :: BlockHash >> :: ffi_to (obj . block_hash) , signature : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionTo < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_to (obj . signature) }) } } impl Drop for dashcore_ephemerealdata_chain_lock_ChainLock { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . block_hash) ; ferment :: unbox_any (ffi_ref . signature) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_chain_lock_ChainLock_ctor < > (block_height : u32 , block_hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash , signature : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature) -> * mut dashcore_ephemerealdata_chain_lock_ChainLock { ferment :: boxed (dashcore_ephemerealdata_chain_lock_ChainLock { block_height , block_hash , signature }) } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_chain_lock_ChainLock_destroy < > (ffi : * mut dashcore_ephemerealdata_chain_lock_ChainLock) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_chain_lock_ChainLock_get_block_height < > (obj : * const dashcore_ephemerealdata_chain_lock_ChainLock) -> u32 { (* obj) . block_height } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_chain_lock_ChainLock_get_block_hash < > (obj : * const dashcore_ephemerealdata_chain_lock_ChainLock) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash { (* obj) . block_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_chain_lock_ChainLock_get_signature < > (obj : * const dashcore_ephemerealdata_chain_lock_ChainLock) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_chain_lock_ChainLock_set_block_height < > (obj : * const dashcore_ephemerealdata_chain_lock_ChainLock) -> u32 { (* obj) . block_height } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_chain_lock_ChainLock_set_block_hash < > (obj : * const dashcore_ephemerealdata_chain_lock_ChainLock) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash { (* obj) . block_hash } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_chain_lock_ChainLock_set_signature < > (obj : * const dashcore_ephemerealdata_chain_lock_ChainLock) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature { (* obj) . signature } } pub mod instant_lock { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InstantLock`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_ephemerealdata_instant_lock_InstantLock { pub version : u8 , pub inputs : * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_outpoint_OutPoint , pub txid : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , pub cyclehash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_CycleHash , pub signature : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature } impl ferment :: FFIConversionFrom < dashcore :: ephemerealdata :: instant_lock :: InstantLock > for dashcore_ephemerealdata_instant_lock_InstantLock { unsafe fn ffi_from_const (ffi : * const dashcore_ephemerealdata_instant_lock_InstantLock) -> dashcore :: ephemerealdata :: instant_lock :: InstantLock { let ffi_ref = & * ffi ; dashcore :: ephemerealdata :: instant_lock :: InstantLock { version : ffi_ref . version , inputs : < crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionFrom < Vec < dashcore :: blockdata :: transaction :: outpoint :: OutPoint > >> :: ffi_from (ffi_ref . inputs) , txid : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionFrom < dashcore :: hash_types :: Txid >> :: ffi_from (ffi_ref . txid) , cyclehash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_CycleHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: CycleHash >> :: ffi_from (ffi_ref . cyclehash) , signature : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionFrom < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_from (ffi_ref . signature) } } } impl ferment :: FFIConversionTo < dashcore :: ephemerealdata :: instant_lock :: InstantLock > for dashcore_ephemerealdata_instant_lock_InstantLock { unsafe fn ffi_to_const (obj : dashcore :: ephemerealdata :: instant_lock :: InstantLock) -> * const dashcore_ephemerealdata_instant_lock_InstantLock { ferment :: boxed (dashcore_ephemerealdata_instant_lock_InstantLock { version : obj . version , inputs : < crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionTo < Vec < dashcore :: blockdata :: transaction :: outpoint :: OutPoint > >> :: ffi_to (obj . inputs) , txid : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionTo < dashcore :: hash_types :: Txid >> :: ffi_to (obj . txid) , cyclehash : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_CycleHash as ferment :: FFIConversionTo < dashcore :: hash_types :: CycleHash >> :: ffi_to (obj . cyclehash) , signature : < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionTo < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_to (obj . signature) }) } } impl Drop for dashcore_ephemerealdata_instant_lock_InstantLock { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . inputs) ; ferment :: unbox_any (ffi_ref . txid) ; ferment :: unbox_any (ffi_ref . cyclehash) ; ferment :: unbox_any (ffi_ref . signature) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_instant_lock_InstantLock_ctor < > (version : u8 , inputs : * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_outpoint_OutPoint , txid : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , cyclehash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_CycleHash , signature : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature) -> * mut dashcore_ephemerealdata_instant_lock_InstantLock { ferment :: boxed (dashcore_ephemerealdata_instant_lock_InstantLock { version , inputs , txid , cyclehash , signature }) } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_instant_lock_InstantLock_destroy < > (ffi : * mut dashcore_ephemerealdata_instant_lock_InstantLock) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_instant_lock_InstantLock_get_version < > (obj : * const dashcore_ephemerealdata_instant_lock_InstantLock) -> u8 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_instant_lock_InstantLock_get_inputs < > (obj : * const dashcore_ephemerealdata_instant_lock_InstantLock) -> * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_outpoint_OutPoint { (* obj) . inputs } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_instant_lock_InstantLock_get_txid < > (obj : * const dashcore_ephemerealdata_instant_lock_InstantLock) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . txid } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_instant_lock_InstantLock_get_cyclehash < > (obj : * const dashcore_ephemerealdata_instant_lock_InstantLock) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_CycleHash { (* obj) . cyclehash } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_instant_lock_InstantLock_get_signature < > (obj : * const dashcore_ephemerealdata_instant_lock_InstantLock) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_instant_lock_InstantLock_set_version < > (obj : * const dashcore_ephemerealdata_instant_lock_InstantLock) -> u8 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_instant_lock_InstantLock_set_inputs < > (obj : * const dashcore_ephemerealdata_instant_lock_InstantLock) -> * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_outpoint_OutPoint { (* obj) . inputs } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_instant_lock_InstantLock_set_txid < > (obj : * const dashcore_ephemerealdata_instant_lock_InstantLock) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . txid } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_instant_lock_InstantLock_set_cyclehash < > (obj : * const dashcore_ephemerealdata_instant_lock_InstantLock) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_CycleHash { (* obj) . cyclehash } # [no_mangle] pub unsafe extern "C" fn dashcore_ephemerealdata_instant_lock_InstantLock_set_signature < > (obj : * const dashcore_ephemerealdata_instant_lock_InstantLock) -> * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature { (* obj) . signature } } } pub mod util { use crate as dash_spv_apple_bindings ; } pub mod bls_sig_utils { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`BLSSignature`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_bls_sig_utils_BLSSignature (* mut crate :: fermented :: generics :: Arr_u8_96) ; impl ferment :: FFIConversionFrom < dashcore :: bls_sig_utils :: BLSSignature > for dashcore_bls_sig_utils_BLSSignature { unsafe fn ffi_from_const (ffi : * const dashcore_bls_sig_utils_BLSSignature) -> dashcore :: bls_sig_utils :: BLSSignature { let ffi_ref = & * ffi ; dashcore :: bls_sig_utils :: BLSSignature (< crate :: fermented :: generics :: Arr_u8_96 as ferment :: FFIConversionFrom < [u8 ; 96] >> :: ffi_from (ffi_ref . 0)) } } impl ferment :: FFIConversionTo < dashcore :: bls_sig_utils :: BLSSignature > for dashcore_bls_sig_utils_BLSSignature { unsafe fn ffi_to_const (obj : dashcore :: bls_sig_utils :: BLSSignature) -> * const dashcore_bls_sig_utils_BLSSignature { ferment :: boxed (dashcore_bls_sig_utils_BLSSignature (< crate :: fermented :: generics :: Arr_u8_96 as ferment :: FFIConversionTo < [u8 ; 96] >> :: ffi_to (obj . 0))) } } impl Drop for dashcore_bls_sig_utils_BLSSignature { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_bls_sig_utils_BLSSignature_ctor < > (o_0 : * mut crate :: fermented :: generics :: Arr_u8_96) -> * mut dashcore_bls_sig_utils_BLSSignature { ferment :: boxed (dashcore_bls_sig_utils_BLSSignature (o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_bls_sig_utils_BLSSignature_destroy < > (ffi : * mut dashcore_bls_sig_utils_BLSSignature) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_bls_sig_utils_BLSSignature_get_0 < > (obj : * const dashcore_bls_sig_utils_BLSSignature) -> * mut crate :: fermented :: generics :: Arr_u8_96 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dashcore_bls_sig_utils_BLSSignature_set_0 < > (obj : * const dashcore_bls_sig_utils_BLSSignature) -> * mut crate :: fermented :: generics :: Arr_u8_96 { (* obj) . 0 } # [doc = "FFI-representation of the [`BLSPublicKey`]"] # [repr (C)] # [derive (Clone)] pub struct dashcore_bls_sig_utils_BLSPublicKey (* mut crate :: fermented :: generics :: Arr_u8_48) ; impl ferment :: FFIConversionFrom < dashcore :: bls_sig_utils :: BLSPublicKey > for dashcore_bls_sig_utils_BLSPublicKey { unsafe fn ffi_from_const (ffi : * const dashcore_bls_sig_utils_BLSPublicKey) -> dashcore :: bls_sig_utils :: BLSPublicKey { let ffi_ref = & * ffi ; dashcore :: bls_sig_utils :: BLSPublicKey (< crate :: fermented :: generics :: Arr_u8_48 as ferment :: FFIConversionFrom < [u8 ; 48] >> :: ffi_from (ffi_ref . 0)) } } impl ferment :: FFIConversionTo < dashcore :: bls_sig_utils :: BLSPublicKey > for dashcore_bls_sig_utils_BLSPublicKey { unsafe fn ffi_to_const (obj : dashcore :: bls_sig_utils :: BLSPublicKey) -> * const dashcore_bls_sig_utils_BLSPublicKey { ferment :: boxed (dashcore_bls_sig_utils_BLSPublicKey (< crate :: fermented :: generics :: Arr_u8_48 as ferment :: FFIConversionTo < [u8 ; 48] >> :: ffi_to (obj . 0))) } } impl Drop for dashcore_bls_sig_utils_BLSPublicKey { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn dashcore_bls_sig_utils_BLSPublicKey_ctor < > (o_0 : * mut crate :: fermented :: generics :: Arr_u8_48) -> * mut dashcore_bls_sig_utils_BLSPublicKey { ferment :: boxed (dashcore_bls_sig_utils_BLSPublicKey (o_0)) } # [no_mangle] pub unsafe extern "C" fn dashcore_bls_sig_utils_BLSPublicKey_destroy < > (ffi : * mut dashcore_bls_sig_utils_BLSPublicKey) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dashcore_bls_sig_utils_BLSPublicKey_get_0 < > (obj : * const dashcore_bls_sig_utils_BLSPublicKey) -> * mut crate :: fermented :: generics :: Arr_u8_48 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dashcore_bls_sig_utils_BLSPublicKey_set_0 < > (obj : * const dashcore_bls_sig_utils_BLSPublicKey) -> * mut crate :: fermented :: generics :: Arr_u8_48 { (* obj) . 0 } } pub mod bip32 { use crate as dash_spv_apple_bindings ; } pub mod taproot { use crate as dash_spv_apple_bindings ; } pub mod psbt { use crate as dash_spv_apple_bindings ; pub mod serialize { use crate as dash_spv_apple_bindings ; } # [cfg (test)] pub mod tests { use crate as dash_spv_apple_bindings ; } pub mod map { use crate as dash_spv_apple_bindings ; pub mod input { use crate as dash_spv_apple_bindings ; } } } pub mod sign_message { use crate as dash_spv_apple_bindings ; } pub mod bip152 { use crate as dash_spv_apple_bindings ; } pub mod merkle_tree { use crate as dash_spv_apple_bindings ; pub mod block { use crate as dash_spv_apple_bindings ; } } pub mod internal_macros { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "serde")] pub mod serde_utils { use crate as dash_spv_apple_bindings ; } pub mod signer { use crate as dash_spv_apple_bindings ; } } pub mod data_contracts { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`SystemDataContract`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum data_contracts_SystemDataContract { Withdrawals = 0 , MasternodeRewards = 1 , FeatureFlags = 2 , DPNS = 3 , Dashpay = 4 , WalletUtils = 5 , TokenHistory = 6 } impl ferment :: FFIConversionFrom < data_contracts :: SystemDataContract > for data_contracts_SystemDataContract { unsafe fn ffi_from_const (ffi : * const data_contracts_SystemDataContract) -> data_contracts :: SystemDataContract { let ffi_ref = & * ffi ; match ffi_ref { data_contracts_SystemDataContract :: Withdrawals => data_contracts :: SystemDataContract :: Withdrawals , data_contracts_SystemDataContract :: MasternodeRewards => data_contracts :: SystemDataContract :: MasternodeRewards , data_contracts_SystemDataContract :: FeatureFlags => data_contracts :: SystemDataContract :: FeatureFlags , data_contracts_SystemDataContract :: DPNS => data_contracts :: SystemDataContract :: DPNS , data_contracts_SystemDataContract :: Dashpay => data_contracts :: SystemDataContract :: Dashpay , data_contracts_SystemDataContract :: WalletUtils => data_contracts :: SystemDataContract :: WalletUtils , data_contracts_SystemDataContract :: TokenHistory => data_contracts :: SystemDataContract :: TokenHistory } } } impl ferment :: FFIConversionTo < data_contracts :: SystemDataContract > for data_contracts_SystemDataContract { unsafe fn ffi_to_const (obj : data_contracts :: SystemDataContract) -> * const data_contracts_SystemDataContract { ferment :: boxed (match obj { data_contracts :: SystemDataContract :: Withdrawals => data_contracts_SystemDataContract :: Withdrawals , data_contracts :: SystemDataContract :: MasternodeRewards => data_contracts_SystemDataContract :: MasternodeRewards , data_contracts :: SystemDataContract :: FeatureFlags => data_contracts_SystemDataContract :: FeatureFlags , data_contracts :: SystemDataContract :: DPNS => data_contracts_SystemDataContract :: DPNS , data_contracts :: SystemDataContract :: Dashpay => data_contracts_SystemDataContract :: Dashpay , data_contracts :: SystemDataContract :: WalletUtils => data_contracts_SystemDataContract :: WalletUtils , data_contracts :: SystemDataContract :: TokenHistory => data_contracts_SystemDataContract :: TokenHistory , _ => unreachable ! ("This is unreachable") }) } } impl Drop for data_contracts_SystemDataContract { fn drop (& mut self) { unsafe { match self { data_contracts_SystemDataContract :: Withdrawals => { } , data_contracts_SystemDataContract :: MasternodeRewards => { } , data_contracts_SystemDataContract :: FeatureFlags => { } , data_contracts_SystemDataContract :: DPNS => { } , data_contracts_SystemDataContract :: Dashpay => { } , data_contracts_SystemDataContract :: WalletUtils => { } , data_contracts_SystemDataContract :: TokenHistory => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn data_contracts_SystemDataContract_Withdrawals_ctor () -> * mut data_contracts_SystemDataContract { ferment :: boxed (data_contracts_SystemDataContract :: Withdrawals { }) } # [no_mangle] pub unsafe extern "C" fn data_contracts_SystemDataContract_MasternodeRewards_ctor () -> * mut data_contracts_SystemDataContract { ferment :: boxed (data_contracts_SystemDataContract :: MasternodeRewards { }) } # [no_mangle] pub unsafe extern "C" fn data_contracts_SystemDataContract_FeatureFlags_ctor () -> * mut data_contracts_SystemDataContract { ferment :: boxed (data_contracts_SystemDataContract :: FeatureFlags { }) } # [no_mangle] pub unsafe extern "C" fn data_contracts_SystemDataContract_DPNS_ctor () -> * mut data_contracts_SystemDataContract { ferment :: boxed (data_contracts_SystemDataContract :: DPNS { }) } # [no_mangle] pub unsafe extern "C" fn data_contracts_SystemDataContract_Dashpay_ctor () -> * mut data_contracts_SystemDataContract { ferment :: boxed (data_contracts_SystemDataContract :: Dashpay { }) } # [no_mangle] pub unsafe extern "C" fn data_contracts_SystemDataContract_WalletUtils_ctor () -> * mut data_contracts_SystemDataContract { ferment :: boxed (data_contracts_SystemDataContract :: WalletUtils { }) } # [no_mangle] pub unsafe extern "C" fn data_contracts_SystemDataContract_TokenHistory_ctor () -> * mut data_contracts_SystemDataContract { ferment :: boxed (data_contracts_SystemDataContract :: TokenHistory { }) } # [no_mangle] pub unsafe extern "C" fn data_contracts_SystemDataContract_destroy < > (ffi : * mut data_contracts_SystemDataContract) { ferment :: unbox_any (ffi) ; } } pub mod dash_spv_crypto { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_crypto::devnet_genesis_coinbase_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_devnet_genesis_coinbase_message (devnet_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType , protocol_version : u32) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = dash_spv_crypto :: devnet_genesis_coinbase_message (< crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: DevnetType >> :: ffi_from (devnet_type) , protocol_version) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } pub mod derivation { use crate as dash_spv_apple_bindings ; } pub mod keys { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`KeyError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_crypto_keys_KeyError { WrongFormat , WrongLength (usize) , Extended (bool) , UnableToDerive , DHKeyExchange , CCCrypt (i32) , EmptySecKey , Product , Any (* mut std :: os :: raw :: c_char) } impl ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: KeyError > for dash_spv_crypto_keys_KeyError { unsafe fn ffi_from_const (ffi : * const dash_spv_crypto_keys_KeyError) -> dash_spv_crypto :: keys :: KeyError { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_crypto_keys_KeyError :: WrongFormat => dash_spv_crypto :: keys :: KeyError :: WrongFormat , dash_spv_crypto_keys_KeyError :: WrongLength (o_0) => dash_spv_crypto :: keys :: KeyError :: WrongLength (* o_0) , dash_spv_crypto_keys_KeyError :: Extended (o_0) => dash_spv_crypto :: keys :: KeyError :: Extended (* o_0) , dash_spv_crypto_keys_KeyError :: UnableToDerive => dash_spv_crypto :: keys :: KeyError :: UnableToDerive , dash_spv_crypto_keys_KeyError :: DHKeyExchange => dash_spv_crypto :: keys :: KeyError :: DHKeyExchange , dash_spv_crypto_keys_KeyError :: CCCrypt (o_0) => dash_spv_crypto :: keys :: KeyError :: CCCrypt (* o_0) , dash_spv_crypto_keys_KeyError :: EmptySecKey => dash_spv_crypto :: keys :: KeyError :: EmptySecKey , dash_spv_crypto_keys_KeyError :: Product => dash_spv_crypto :: keys :: KeyError :: Product , dash_spv_crypto_keys_KeyError :: Any (o_0) => dash_spv_crypto :: keys :: KeyError :: Any (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dash_spv_crypto :: keys :: KeyError > for dash_spv_crypto_keys_KeyError { unsafe fn ffi_to_const (obj : dash_spv_crypto :: keys :: KeyError) -> * const dash_spv_crypto_keys_KeyError { ferment :: boxed (match obj { dash_spv_crypto :: keys :: KeyError :: WrongFormat => dash_spv_crypto_keys_KeyError :: WrongFormat , dash_spv_crypto :: keys :: KeyError :: WrongLength (o_0) => dash_spv_crypto_keys_KeyError :: WrongLength (o_0) , dash_spv_crypto :: keys :: KeyError :: Extended (o_0) => dash_spv_crypto_keys_KeyError :: Extended (o_0) , dash_spv_crypto :: keys :: KeyError :: UnableToDerive => dash_spv_crypto_keys_KeyError :: UnableToDerive , dash_spv_crypto :: keys :: KeyError :: DHKeyExchange => dash_spv_crypto_keys_KeyError :: DHKeyExchange , dash_spv_crypto :: keys :: KeyError :: CCCrypt (o_0) => dash_spv_crypto_keys_KeyError :: CCCrypt (o_0) , dash_spv_crypto :: keys :: KeyError :: EmptySecKey => dash_spv_crypto_keys_KeyError :: EmptySecKey , dash_spv_crypto :: keys :: KeyError :: Product => dash_spv_crypto_keys_KeyError :: Product , dash_spv_crypto :: keys :: KeyError :: Any (o_0) => dash_spv_crypto_keys_KeyError :: Any (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_crypto_keys_KeyError { fn drop (& mut self) { unsafe { match self { dash_spv_crypto_keys_KeyError :: WrongFormat => { } , dash_spv_crypto_keys_KeyError :: WrongLength (o_0) => { ; } , dash_spv_crypto_keys_KeyError :: Extended (o_0) => { ; } , dash_spv_crypto_keys_KeyError :: UnableToDerive => { } , dash_spv_crypto_keys_KeyError :: DHKeyExchange => { } , dash_spv_crypto_keys_KeyError :: CCCrypt (o_0) => { ; } , dash_spv_crypto_keys_KeyError :: EmptySecKey => { } , dash_spv_crypto_keys_KeyError :: Product => { } , dash_spv_crypto_keys_KeyError :: Any (o_0) => { ferment :: unbox_string (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_KeyError_WrongFormat_ctor () -> * mut dash_spv_crypto_keys_KeyError { ferment :: boxed (dash_spv_crypto_keys_KeyError :: WrongFormat { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_KeyError_WrongLength_ctor (o_o_0 : usize) -> * mut dash_spv_crypto_keys_KeyError { ferment :: boxed (dash_spv_crypto_keys_KeyError :: WrongLength (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_KeyError_Extended_ctor (o_o_0 : bool) -> * mut dash_spv_crypto_keys_KeyError { ferment :: boxed (dash_spv_crypto_keys_KeyError :: Extended (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_KeyError_UnableToDerive_ctor () -> * mut dash_spv_crypto_keys_KeyError { ferment :: boxed (dash_spv_crypto_keys_KeyError :: UnableToDerive { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_KeyError_DHKeyExchange_ctor () -> * mut dash_spv_crypto_keys_KeyError { ferment :: boxed (dash_spv_crypto_keys_KeyError :: DHKeyExchange { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_KeyError_CCCrypt_ctor (o_o_0 : i32) -> * mut dash_spv_crypto_keys_KeyError { ferment :: boxed (dash_spv_crypto_keys_KeyError :: CCCrypt (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_KeyError_EmptySecKey_ctor () -> * mut dash_spv_crypto_keys_KeyError { ferment :: boxed (dash_spv_crypto_keys_KeyError :: EmptySecKey { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_KeyError_Product_ctor () -> * mut dash_spv_crypto_keys_KeyError { ferment :: boxed (dash_spv_crypto_keys_KeyError :: Product { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_KeyError_Any_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dash_spv_crypto_keys_KeyError { ferment :: boxed (dash_spv_crypto_keys_KeyError :: Any (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_KeyError_destroy < > (ffi : * mut dash_spv_crypto_keys_KeyError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct dash_spv_crypto_keys_IKey_VTable { # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::kind`]"] pub kind : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::secret_key_string`]"] pub secret_key_string : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut std :: os :: raw :: c_char , # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::has_private_key`]"] pub has_private_key : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> bool , # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::address_with_public_key_data`]"] pub address_with_public_key_data : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , chain : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char , # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::sign`]"] pub sign : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Vec_u8 , # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::hash_and_sign`]"] pub hash_and_sign : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Vec_u8 , # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::verify`]"] pub verify : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , message_digest : * mut crate :: fermented :: generics :: Slice_u8 , signature : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError , # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::secret_key`]"] pub secret_key : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 , # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::chaincode`]"] pub chaincode : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 , # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::fingerprint`]"] pub fingerprint : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> u32 , # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::private_key_data`]"] pub private_key_data : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError , # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::public_key_data`]"] pub public_key_data : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Vec_u8 , # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::extended_private_key_data`]"] pub extended_private_key_data : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError , # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::extended_public_key_data`]"] pub extended_public_key_data : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError , # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::serialized_private_key_for_script`]"] pub serialized_private_key_for_script : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , chain_prefix : u8) -> * mut std :: os :: raw :: c_char , # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::hmac_256_data`]"] pub hmac_256_data : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Arr_u8_32 , # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::forget_private_key`]"] pub forget_private_key : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) , # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::sign_message_digest`]"] pub sign_message_digest : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , digest : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Vec_u8 , # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::private_key_data_equal_to`]"] pub private_key_data_equal_to : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , other_private_key_data : * mut crate :: fermented :: generics :: Arr_u8_32) -> bool , # [doc = "FFI-representation of the [`dash_spv_crypto::keys::IKey::public_key_data_equal_to`]"] pub public_key_data_equal_to : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , other_public_key_data : * mut crate :: fermented :: generics :: Vec_u8) -> bool } # [repr (C)] # [derive (Clone)] pub struct dash_spv_crypto_keys_IKey { object : * const () , vtable : * const dash_spv_crypto_keys_IKey_VTable } pub mod key { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::maybe_opaque_key_used_in_tx_input_script`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_maybe_opaque_key_used_in_tx_input_script (tx_input_script : * mut crate :: fermented :: generics :: Vec_u8 , keys : * mut crate :: fermented :: generics :: Vec_dash_spv_crypto_keys_key_OpaqueKey , chain : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey { let obj = dash_spv_crypto :: keys :: key :: maybe_opaque_key_used_in_tx_input_script (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (tx_input_script) , < crate :: fermented :: generics :: Vec_dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < Vec < dash_spv_crypto :: keys :: key :: OpaqueKey > >> :: ffi_from (keys) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain)) ; < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`OpaqueKey`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_crypto_keys_key_OpaqueKey { ECDSA (* mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) , BLS (* mut dash_spv_crypto :: keys :: bls_key :: BLSKey) , ED25519 (* mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) } impl ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey > for dash_spv_crypto_keys_key_OpaqueKey { unsafe fn ffi_from_const (ffi : * const dash_spv_crypto_keys_key_OpaqueKey) -> dash_spv_crypto :: keys :: key :: OpaqueKey { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_crypto_keys_key_OpaqueKey :: ECDSA (o_0) => dash_spv_crypto :: keys :: key :: OpaqueKey :: ECDSA ((& * * o_0) . clone ()) , dash_spv_crypto_keys_key_OpaqueKey :: BLS (o_0) => dash_spv_crypto :: keys :: key :: OpaqueKey :: BLS ((& * * o_0) . clone ()) , dash_spv_crypto_keys_key_OpaqueKey :: ED25519 (o_0) => dash_spv_crypto :: keys :: key :: OpaqueKey :: ED25519 ((& * * o_0) . clone ()) } } } impl ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: OpaqueKey > for dash_spv_crypto_keys_key_OpaqueKey { unsafe fn ffi_to_const (obj : dash_spv_crypto :: keys :: key :: OpaqueKey) -> * const dash_spv_crypto_keys_key_OpaqueKey { ferment :: boxed (match obj { dash_spv_crypto :: keys :: key :: OpaqueKey :: ECDSA (o_0) => dash_spv_crypto_keys_key_OpaqueKey :: ECDSA (ferment :: boxed (o_0)) , dash_spv_crypto :: keys :: key :: OpaqueKey :: BLS (o_0) => dash_spv_crypto_keys_key_OpaqueKey :: BLS (ferment :: boxed (o_0)) , dash_spv_crypto :: keys :: key :: OpaqueKey :: ED25519 (o_0) => dash_spv_crypto_keys_key_OpaqueKey :: ED25519 (ferment :: boxed (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_crypto_keys_key_OpaqueKey { fn drop (& mut self) { unsafe { match self { dash_spv_crypto_keys_key_OpaqueKey :: ECDSA (o_0) => { ferment :: unbox_any (* o_0) ; } , dash_spv_crypto_keys_key_OpaqueKey :: BLS (o_0) => { ferment :: unbox_any (* o_0) ; } , dash_spv_crypto_keys_key_OpaqueKey :: ED25519 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_ECDSA_ctor (o_o_0 : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) -> * mut dash_spv_crypto_keys_key_OpaqueKey { ferment :: boxed (dash_spv_crypto_keys_key_OpaqueKey :: ECDSA (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_BLS_ctor (o_o_0 : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey) -> * mut dash_spv_crypto_keys_key_OpaqueKey { ferment :: boxed (dash_spv_crypto_keys_key_OpaqueKey :: BLS (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_ED25519_ctor (o_o_0 : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) -> * mut dash_spv_crypto_keys_key_OpaqueKey { ferment :: boxed (dash_spv_crypto_keys_key_OpaqueKey :: ED25519 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_destroy < > (ffi : * mut dash_spv_crypto_keys_key_OpaqueKey) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`IndexPathU256`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_crypto_keys_key_IndexPathU256 { pub indexes : * mut crate :: fermented :: generics :: Vec_u8_32 , pub hardened : * mut crate :: fermented :: generics :: Vec_bool } impl ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: IndexPathU256 > for dash_spv_crypto_keys_key_IndexPathU256 { unsafe fn ffi_from_const (ffi : * const dash_spv_crypto_keys_key_IndexPathU256) -> dash_spv_crypto :: keys :: key :: IndexPathU256 { let ffi_ref = & * ffi ; dash_spv_crypto :: keys :: key :: IndexPathU256 { indexes : < crate :: fermented :: generics :: Vec_u8_32 as ferment :: FFIConversionFrom < Vec < [u8 ; 32] > >> :: ffi_from (ffi_ref . indexes) , hardened : < crate :: fermented :: generics :: Vec_bool as ferment :: FFIConversionFrom < Vec < bool > >> :: ffi_from (ffi_ref . hardened) } } } impl ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: IndexPathU256 > for dash_spv_crypto_keys_key_IndexPathU256 { unsafe fn ffi_to_const (obj : dash_spv_crypto :: keys :: key :: IndexPathU256) -> * const dash_spv_crypto_keys_key_IndexPathU256 { ferment :: boxed (dash_spv_crypto_keys_key_IndexPathU256 { indexes : < crate :: fermented :: generics :: Vec_u8_32 as ferment :: FFIConversionTo < Vec < [u8 ; 32] > >> :: ffi_to (obj . indexes) , hardened : < crate :: fermented :: generics :: Vec_bool as ferment :: FFIConversionTo < Vec < bool > >> :: ffi_to (obj . hardened) }) } } impl Drop for dash_spv_crypto_keys_key_IndexPathU256 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . indexes) ; ferment :: unbox_any (ffi_ref . hardened) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_IndexPathU256_ctor < > (indexes : * mut crate :: fermented :: generics :: Vec_u8_32 , hardened : * mut crate :: fermented :: generics :: Vec_bool) -> * mut dash_spv_crypto_keys_key_IndexPathU256 { ferment :: boxed (dash_spv_crypto_keys_key_IndexPathU256 { indexes , hardened }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_IndexPathU256_destroy < > (ffi : * mut dash_spv_crypto_keys_key_IndexPathU256) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_IndexPathU256_get_indexes < > (obj : * const dash_spv_crypto_keys_key_IndexPathU256) -> * mut crate :: fermented :: generics :: Vec_u8_32 { (* obj) . indexes } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_IndexPathU256_get_hardened < > (obj : * const dash_spv_crypto_keys_key_IndexPathU256) -> * mut crate :: fermented :: generics :: Vec_bool { (* obj) . hardened } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_IndexPathU256_set_indexes < > (obj : * const dash_spv_crypto_keys_key_IndexPathU256) -> * mut crate :: fermented :: generics :: Vec_u8_32 { (* obj) . indexes } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_IndexPathU256_set_hardened < > (obj : * const dash_spv_crypto_keys_key_IndexPathU256) -> * mut crate :: fermented :: generics :: Vec_bool { (* obj) . hardened } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::KeyKind::equal_to_kind`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_equal_to_kind (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , kind : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind) -> bool { let obj = dash_spv_crypto :: keys :: key :: KeyKind :: equal_to_kind (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_from (kind)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::KeyKind::index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_index (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind) -> i16 { let obj = dash_spv_crypto :: keys :: key :: KeyKind :: index (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::KeyKind::public_key_from_extended_public_key_data_at_index_path`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_public_key_from_extended_public_key_data_at_index_path (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , data : * mut crate :: fermented :: generics :: Slice_u8 , index_path : * mut crate :: fermented :: generics :: Vec_u32) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: KeyKind :: public_key_from_extended_public_key_data_at_index_path (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Vec_u32 as ferment :: FFIConversionFrom < Vec < u32 > >> :: ffi_from (index_path)))) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::KeyKind::public_key_from_extended_public_key_data_at_index_path_256`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_public_key_from_extended_public_key_data_at_index_path_256 (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , data : * mut crate :: fermented :: generics :: Slice_u8 , index_path : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_IndexPathU256) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: KeyKind :: public_key_from_extended_public_key_data_at_index_path_256 (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data))) , Box :: leak (Box :: new (< crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_IndexPathU256 as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: IndexPathU256 >> :: ffi_from (index_path)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::KeyKind::private_key_at_index_path_wrapped`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_private_key_at_index_path_wrapped (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , seed : * mut crate :: fermented :: generics :: Slice_u8 , index_path : * mut crate :: fermented :: generics :: Vec_u32 , derivation_path : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_IndexPathU256) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: KeyKind :: private_key_at_index_path_wrapped (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (seed))) , < crate :: fermented :: generics :: Vec_u32 as ferment :: FFIConversionFrom < Vec < u32 > >> :: ffi_from (index_path) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_IndexPathU256 as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: IndexPathU256 >> :: ffi_from (derivation_path)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::KeyKind::derive_key_from_seed_wrapped`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_derive_key_from_seed_wrapped (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , seed : * mut crate :: fermented :: generics :: Slice_u8 , derivation_path : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_IndexPathU256) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: KeyKind :: derive_key_from_seed_wrapped (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (seed))) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_IndexPathU256 as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: IndexPathU256 >> :: ffi_from (derivation_path)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::KeyKind::key_with_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_key_with_private_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , secret : * mut std :: os :: raw :: c_char , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: KeyKind :: key_with_private_key (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (secret))) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::KeyKind::private_keys_at_index_paths_wrapped`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_private_keys_at_index_paths_wrapped (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , seed : * mut crate :: fermented :: generics :: Slice_u8 , index_paths : * mut crate :: fermented :: generics :: Vec_Vec_u32 , derivation_path : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_IndexPathU256) -> * mut crate :: fermented :: generics :: Result_ok_Vec_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: KeyKind :: private_keys_at_index_paths_wrapped (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (seed))) , < crate :: fermented :: generics :: Vec_Vec_u32 as ferment :: FFIConversionFrom < Vec < Vec < u32 > > >> :: ffi_from (index_paths) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_IndexPathU256 as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: IndexPathU256 >> :: ffi_from (derivation_path)) ; < crate :: fermented :: generics :: Result_ok_Vec_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < dash_spv_crypto :: keys :: key :: OpaqueKey > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::KeyKind::serialized_private_keys_at_index_paths_wrapper`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_serialized_private_keys_at_index_paths_wrapper (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , seed : * mut crate :: fermented :: generics :: Slice_u8 , index_paths : * mut crate :: fermented :: generics :: Vec_Vec_u32 , derivation_path : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_IndexPathU256 , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: generics :: Result_ok_Vec_String_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: KeyKind :: serialized_private_keys_at_index_paths_wrapper (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (seed))) , < crate :: fermented :: generics :: Vec_Vec_u32 as ferment :: FFIConversionFrom < Vec < Vec < u32 > > >> :: ffi_from (index_paths) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_IndexPathU256 as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: IndexPathU256 >> :: ffi_from (derivation_path) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; < crate :: fermented :: generics :: Result_ok_Vec_String_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < String > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::KeyKind::derivation_string`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_derivation_string (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_crypto :: keys :: key :: KeyKind :: derivation_string (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::KeyKind::key_storage_prefix`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_key_storage_prefix (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_crypto :: keys :: key :: KeyKind :: key_storage_prefix (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::KeyKind::private_key_from_extended_private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_private_key_from_extended_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: KeyKind :: private_key_from_extended_private_key_data (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::KeyKind::key_with_private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_key_with_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: KeyKind :: key_with_private_key_data (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::KeyKind::key_with_seed_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_key_with_seed_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , seed : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: KeyKind :: key_with_seed_data (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (seed)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::KeyKind::key_with_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_key_with_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: KeyKind :: key_with_public_key_data (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::KeyKind::key_init_with_extended_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_key_init_with_extended_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: KeyKind :: key_init_with_extended_public_key_data (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::KeyKind::key_with_extended_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_key_with_extended_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: KeyKind :: key_with_extended_public_key_data (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::KeyKind::key_with_extended_private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_key_with_extended_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: KeyKind :: key_with_extended_private_key_data (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::KeyKind::derive_key_from_extended_private_key_data_for_index_path`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_derive_key_from_extended_private_key_data_for_index_path (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , data : * mut crate :: fermented :: generics :: Slice_u8 , index_path : * mut crate :: fermented :: generics :: Vec_u32) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: KeyKind :: derive_key_from_extended_private_key_data_for_index_path (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data))) , < crate :: fermented :: generics :: Vec_u32 as ferment :: FFIConversionFrom < Vec < u32 > >> :: ffi_from (index_path)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::has_kind`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_has_kind (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , kind : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind) -> bool { let obj = dash_spv_crypto :: keys :: key :: OpaqueKey :: has_kind (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_from (kind)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::hash160`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_hash160 (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Arr_u8_20 { let obj = dash_spv_crypto :: keys :: key :: OpaqueKey :: hash160 (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: generics :: Arr_u8_20 as ferment :: FFIConversionTo < [u8 ; 20] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::check_payload_signature`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_check_payload_signature (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , key_hash : * mut crate :: fermented :: generics :: Arr_u8_20) -> bool { let obj = dash_spv_crypto :: keys :: key :: OpaqueKey :: check_payload_signature (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: generics :: Arr_u8_20 as ferment :: FFIConversionFrom < [u8 ; 20] >> :: ffi_from (key_hash)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::create_tx_signature`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_create_tx_signature (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , data : * mut crate :: fermented :: generics :: Slice_u8 , flags : u8 , tx_input_script : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = dash_spv_crypto :: keys :: key :: OpaqueKey :: create_tx_signature (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data))) , flags , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (tx_input_script)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::create_account_reference`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_create_account_reference (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , extended_public_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , account_number : usize) -> u32 { let obj = dash_spv_crypto :: keys :: key :: OpaqueKey :: create_account_reference (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (extended_public_key) , account_number) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::create_identifier`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_create_identifier (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_u8_arr_32_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: OpaqueKey :: create_identifier (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: generics :: Result_ok_u8_arr_32_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < [u8 ; 32] , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::public_derive_to_256_path_with_offset`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_public_derive_to_256_path_with_offset (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , path : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_IndexPathU256 , offset : usize) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: OpaqueKey :: public_derive_to_256_path_with_offset (& mut ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_IndexPathU256 as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: IndexPathU256 >> :: ffi_from (path))) , offset) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::public_key_from_extended_public_key_data_at_index_path`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_public_key_from_extended_public_key_data_at_index_path (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , index_path : * mut crate :: fermented :: generics :: Vec_u32) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: OpaqueKey :: public_key_from_extended_public_key_data_at_index_path (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: generics :: Vec_u32 as ferment :: FFIConversionFrom < Vec < u32 > >> :: ffi_from (index_path)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::public_key_data_at_index_path`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_public_key_data_at_index_path (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , index_path : * mut crate :: fermented :: generics :: Vec_u32) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: OpaqueKey :: public_key_data_at_index_path (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: generics :: Vec_u32 as ferment :: FFIConversionFrom < Vec < u32 > >> :: ffi_from (index_path)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::encrypt_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_encrypt_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , public_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: OpaqueKey :: encrypt_data (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (public_key) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::encrypt_data_vec`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_encrypt_data_vec (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , public_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , data : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: OpaqueKey :: encrypt_data_vec (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (public_key) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::encrypt_data_using_iv`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_encrypt_data_using_iv (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , public_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , data : * mut crate :: fermented :: generics :: Slice_u8 , iv : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: OpaqueKey :: encrypt_data_using_iv (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (public_key) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data))) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (iv)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::decrypt_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_decrypt_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , public_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: OpaqueKey :: decrypt_data (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (public_key) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::decrypt_data_vec`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_decrypt_data_vec (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , public_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , data : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: OpaqueKey :: decrypt_data_vec (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (public_key) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::decrypt_data_using_iv_size`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_decrypt_data_using_iv_size (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , public_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , data : * mut crate :: fermented :: generics :: Slice_u8 , iv_size : usize) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: OpaqueKey :: decrypt_data_using_iv_size (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (public_key) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data))) , iv_size) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::encrypt_data_with_dh_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_encrypt_data_with_dh_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , data : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: OpaqueKey :: encrypt_data_with_dh_key (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::decrypt_data_with_dh_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_decrypt_data_with_dh_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , data : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: OpaqueKey :: decrypt_data_with_dh_key (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::encrypt_data_with_dh_key_using_iv`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_encrypt_data_with_dh_key_using_iv (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , data : * mut crate :: fermented :: generics :: Vec_u8 , iv : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: OpaqueKey :: encrypt_data_with_dh_key_using_iv (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (iv)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::decrypt_data_with_dh_key_using_iv_size`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_decrypt_data_with_dh_key_using_iv_size (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , data : * mut crate :: fermented :: generics :: Vec_u8 , iv_size : usize) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: key :: OpaqueKey :: decrypt_data_with_dh_key_using_iv_size (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data) , iv_size) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`KeyKind`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_crypto_keys_key_KeyKind { ECDSA = 0 , BLS = 1 , BLSBasic = 2 , ED25519 = 3 } impl ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: KeyKind > for dash_spv_crypto_keys_key_KeyKind { unsafe fn ffi_from_const (ffi : * const dash_spv_crypto_keys_key_KeyKind) -> dash_spv_crypto :: keys :: key :: KeyKind { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_crypto_keys_key_KeyKind :: ECDSA => dash_spv_crypto :: keys :: key :: KeyKind :: ECDSA , dash_spv_crypto_keys_key_KeyKind :: BLS => dash_spv_crypto :: keys :: key :: KeyKind :: BLS , dash_spv_crypto_keys_key_KeyKind :: BLSBasic => dash_spv_crypto :: keys :: key :: KeyKind :: BLSBasic , dash_spv_crypto_keys_key_KeyKind :: ED25519 => dash_spv_crypto :: keys :: key :: KeyKind :: ED25519 } } } impl ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: KeyKind > for dash_spv_crypto_keys_key_KeyKind { unsafe fn ffi_to_const (obj : dash_spv_crypto :: keys :: key :: KeyKind) -> * const dash_spv_crypto_keys_key_KeyKind { ferment :: boxed (match obj { dash_spv_crypto :: keys :: key :: KeyKind :: ECDSA => dash_spv_crypto_keys_key_KeyKind :: ECDSA , dash_spv_crypto :: keys :: key :: KeyKind :: BLS => dash_spv_crypto_keys_key_KeyKind :: BLS , dash_spv_crypto :: keys :: key :: KeyKind :: BLSBasic => dash_spv_crypto_keys_key_KeyKind :: BLSBasic , dash_spv_crypto :: keys :: key :: KeyKind :: ED25519 => dash_spv_crypto_keys_key_KeyKind :: ED25519 , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_crypto_keys_key_KeyKind { fn drop (& mut self) { unsafe { match self { dash_spv_crypto_keys_key_KeyKind :: ECDSA => { } , dash_spv_crypto_keys_key_KeyKind :: BLS => { } , dash_spv_crypto_keys_key_KeyKind :: BLSBasic => { } , dash_spv_crypto_keys_key_KeyKind :: ED25519 => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_ECDSA_ctor () -> * mut dash_spv_crypto_keys_key_KeyKind { ferment :: boxed (dash_spv_crypto_keys_key_KeyKind :: ECDSA { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_BLS_ctor () -> * mut dash_spv_crypto_keys_key_KeyKind { ferment :: boxed (dash_spv_crypto_keys_key_KeyKind :: BLS { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_BLSBasic_ctor () -> * mut dash_spv_crypto_keys_key_KeyKind { ferment :: boxed (dash_spv_crypto_keys_key_KeyKind :: BLSBasic { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_ED25519_ctor () -> * mut dash_spv_crypto_keys_key_KeyKind { ferment :: boxed (dash_spv_crypto_keys_key_KeyKind :: ED25519 { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_KeyKind_destroy < > (ffi : * mut dash_spv_crypto_keys_key_KeyKind) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::key_kind_from_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_key_kind_from_index (index : i16) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind { let obj = dash_spv_crypto :: keys :: key :: key_kind_from_index (index) ; < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_to (obj) } # [no_mangle] pub static dash_spv_crypto_keys_key_OpaqueKey_dash_spv_crypto_keys_IKey : crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey_VTable = { # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_kind (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: kind (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_secret_key_string (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: secret_key_string (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_has_private_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> bool { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: has_private_key (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; obj } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_address_with_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , chain : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: address_with_public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_sign (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: sign (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_hash_and_sign (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: hash_and_sign (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_verify (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , message_digest : * mut crate :: fermented :: generics :: Slice_u8 , signature : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: verify (& mut * ((* self_) . object as * mut dash_spv_crypto :: keys :: key :: OpaqueKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message_digest))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (signature)))) ; < crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < bool , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_secret_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: secret_key (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_chaincode (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: chaincode (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_fingerprint (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> u32 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: fingerprint (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; obj } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: private_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_extended_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: extended_private_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: util :: sec_vec :: SecVec , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_extended_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: extended_public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_serialized_private_key_for_script (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , chain_prefix : u8) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: serialized_private_key_for_script (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey) , chain_prefix) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_hmac_256_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: hmac_256_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_forget_private_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: forget_private_key (& mut * ((* self_) . object as * mut dash_spv_crypto :: keys :: key :: OpaqueKey)) ; ; } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_sign_message_digest (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , digest : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: sign_message_digest (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (digest)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_private_key_data_equal_to (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , other_private_key_data : * mut crate :: fermented :: generics :: Arr_u8_32) -> bool { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: private_key_data_equal_to (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (other_private_key_data)))) ; obj } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_public_key_data_equal_to (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , other_public_key_data : * mut crate :: fermented :: generics :: Vec_u8) -> bool { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: public_key_data_equal_to (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (other_public_key_data)))) ; obj } crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey_VTable { kind : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_kind , secret_key_string : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_secret_key_string , has_private_key : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_has_private_key , address_with_public_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_address_with_public_key_data , sign : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_sign , hash_and_sign : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_hash_and_sign , verify : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_verify , secret_key : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_secret_key , chaincode : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_chaincode , fingerprint : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_fingerprint , private_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_private_key_data , public_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_public_key_data , extended_private_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_extended_private_key_data , extended_public_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_extended_public_key_data , serialized_private_key_for_script : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_serialized_private_key_for_script , hmac_256_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_hmac_256_data , forget_private_key : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_forget_private_key , sign_message_digest : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_sign_message_digest , private_key_data_equal_to : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_private_key_data_equal_to , public_key_data_equal_to : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_key_OpaqueKey_public_key_data_equal_to } } ; # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_as_crate_fermented_types_dash_spv_crypto_keys_dash_spv_crypto_keys_IKey (obj : * const dash_spv_crypto :: keys :: key :: OpaqueKey) -> crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey { crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey { object : obj as * const () , vtable : & dash_spv_crypto_keys_key_OpaqueKey_dash_spv_crypto_keys_IKey } } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_as_crate_fermented_types_dash_spv_crypto_keys_dash_spv_crypto_keys_IKey_destroy (obj : crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) { ferment :: unbox_any (obj . object as * mut dash_spv_crypto :: keys :: key :: OpaqueKey) ; } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::kind`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_kind (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: kind (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::kind`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_kind (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: kind (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::secret_key_string`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_secret_key_string (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: secret_key_string (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::secret_key_string`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_secret_key_string (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: secret_key_string (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::has_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_has_private_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> bool { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: has_private_key (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::has_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_has_private_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> bool { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: has_private_key (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::address_with_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_address_with_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , chain : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: address_with_public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::address_with_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_address_with_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , chain : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: address_with_public_key_data (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::sign`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_sign (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: sign (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::sign`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_sign (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: sign (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::hash_and_sign`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_hash_and_sign (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: hash_and_sign (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::hash_and_sign`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_hash_and_sign (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , data : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: hash_and_sign (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::verify`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_verify (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , message_digest : * mut crate :: fermented :: generics :: Slice_u8 , signature : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: verify (& mut * ((* self_) . object as * mut dash_spv_crypto :: keys :: key :: OpaqueKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message_digest))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (signature)))) ; < crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < bool , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::verify`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_verify (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , message_digest : * mut crate :: fermented :: generics :: Slice_u8 , signature : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: verify (& mut ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message_digest))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (signature)))) ; < crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < bool , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::secret_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_secret_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: secret_key (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::secret_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_secret_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: secret_key (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::chaincode`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_chaincode (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: chaincode (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::chaincode`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_chaincode (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: chaincode (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::fingerprint`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_fingerprint (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> u32 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: fingerprint (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::fingerprint`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_fingerprint (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> u32 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: fingerprint (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: private_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: private_key_data (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: public_key_data (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::extended_private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_extended_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: extended_private_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: util :: sec_vec :: SecVec , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::extended_private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_extended_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: extended_private_key_data (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: util :: sec_vec :: SecVec , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::extended_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_extended_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: extended_public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::extended_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_extended_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: extended_public_key_data (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::serialized_private_key_for_script`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_serialized_private_key_for_script (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , chain_prefix : u8) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: serialized_private_key_for_script (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey) , chain_prefix) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::serialized_private_key_for_script`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_serialized_private_key_for_script (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , chain_prefix : u8) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: serialized_private_key_for_script (& ferment :: FFIConversionFrom :: ffi_from (self_) , chain_prefix) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::hmac_256_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_hmac_256_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: hmac_256_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::hmac_256_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_hmac_256_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: hmac_256_data (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::forget_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_forget_private_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: forget_private_key (& mut * ((* self_) . object as * mut dash_spv_crypto :: keys :: key :: OpaqueKey)) ; ; } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::forget_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_forget_private_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: forget_private_key (& mut ferment :: FFIConversionFrom :: ffi_from (self_)) ; ; } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::sign_message_digest`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_sign_message_digest (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , digest : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: sign_message_digest (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (digest)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::sign_message_digest`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_sign_message_digest (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , digest : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: sign_message_digest (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (digest)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::private_key_data_equal_to`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_private_key_data_equal_to (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , other_private_key_data : * mut crate :: fermented :: generics :: Arr_u8_32) -> bool { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: private_key_data_equal_to (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (other_private_key_data)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::private_key_data_equal_to`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_private_key_data_equal_to (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , other_private_key_data : * mut crate :: fermented :: generics :: Arr_u8_32) -> bool { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: private_key_data_equal_to (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (other_private_key_data)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::public_key_data_equal_to`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_IKey_public_key_data_equal_to (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , other : * mut crate :: fermented :: generics :: Vec_u8) -> bool { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: public_key_data_equal_to (& * ((* self_) . object as * const dash_spv_crypto :: keys :: key :: OpaqueKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (other)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::key::OpaqueKey::public_key_data_equal_to`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_key_OpaqueKey_public_key_data_equal_to (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , other : * mut crate :: fermented :: generics :: Vec_u8) -> bool { let obj = < dash_spv_crypto :: keys :: key :: OpaqueKey as dash_spv_crypto :: keys :: IKey > :: public_key_data_equal_to (& ferment :: FFIConversionFrom :: ffi_from (self_) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (other)))) ; obj } } pub mod ecdsa_key { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::key_with_secret_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_key_with_secret_data (data : * mut crate :: fermented :: generics :: Slice_u8 , compressed : bool) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: key_with_secret_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data))) , compressed) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::key_with_extended_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_key_with_extended_public_key_data (bytes : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: key_with_extended_public_key_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (bytes)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::public_key_data_from_seed`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_public_key_data_from_seed (seed : * mut crate :: fermented :: generics :: Slice_u8 , compressed : bool) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: public_key_data_from_seed (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (seed))) , compressed) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::key_with_secret`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_key_with_secret (secret : * mut crate :: fermented :: generics :: Arr_u8_32 , compressed : bool) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: key_with_secret (Box :: leak (Box :: new (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (secret))) , compressed) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::key_with_secret_hex`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_key_with_secret_hex (string : * mut std :: os :: raw :: c_char , compressed : bool) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: key_with_secret_hex (Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (string))) , compressed) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::key_recovered_from_compact_sig`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_key_recovered_from_compact_sig (compact_sig : * mut crate :: fermented :: generics :: Slice_u8 , message_digest : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: key_recovered_from_compact_sig (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (compact_sig))) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (message_digest)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::key_with_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_key_with_private_key (private_key_string : * mut std :: os :: raw :: c_char , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: key_with_private_key (Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (private_key_string))) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::key_with_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_key_with_public_key_data (data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: key_with_public_key_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::init_with_compact_sig`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_init_with_compact_sig (compact_sig : * mut crate :: fermented :: generics :: Slice_u8 , message_digest : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: init_with_compact_sig (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (compact_sig))) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (message_digest)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::init_with_seed_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_init_with_seed_data (seed : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: init_with_seed_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (seed)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::init_with_secret`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_init_with_secret (secret : * mut crate :: fermented :: generics :: Arr_u8_32 , compressed : bool) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: init_with_secret (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (secret) , compressed) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::init_with_extended_private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_init_with_extended_private_key_data (data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: init_with_extended_private_key_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::init_with_extended_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_init_with_extended_public_key_data (data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: init_with_extended_public_key_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::init_with_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_init_with_private_key (private_key : * mut std :: os :: raw :: c_char , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: init_with_private_key (Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (private_key))) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::init_with_public_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_init_with_public_key (public_key : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: init_with_public_key (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (public_key)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::key_with_extended_private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_key_with_extended_private_key_data (data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: key_with_extended_private_key_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::compact_sign`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_compact_sign (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , message_digest : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Arr_u8_65 { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: compact_sign (& * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message_digest)))) ; < crate :: fermented :: generics :: Arr_u8_65 as ferment :: FFIConversionTo < [u8 ; 65] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::key_with_compact_sig`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_key_with_compact_sig (compact_sig : * mut crate :: fermented :: generics :: Slice_u8 , message_digest : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: key_with_compact_sig (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (compact_sig))) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (message_digest)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::deprecated_incorrect_extended_public_key_from_seed`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_deprecated_incorrect_extended_public_key_from_seed (secret : * mut crate :: fermented :: generics :: Slice_u8 , chaincode : * mut crate :: fermented :: generics :: Slice_u8 , hashes : * mut crate :: fermented :: generics :: Slice_u8 , derivation_len : usize) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: deprecated_incorrect_extended_public_key_from_seed (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (secret))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (chaincode))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (hashes))) , derivation_len) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::deprecated_incorrect_extended_public_key_from_seed_as_opaque`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_deprecated_incorrect_extended_public_key_from_seed_as_opaque (secret : * mut crate :: fermented :: generics :: Slice_u8 , chaincode : * mut crate :: fermented :: generics :: Slice_u8 , hashes : * mut crate :: fermented :: generics :: Slice_u8 , derivation_len : usize) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: deprecated_incorrect_extended_public_key_from_seed_as_opaque (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (secret))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (chaincode))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (hashes))) , derivation_len) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::hash160`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_hash160 (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) -> * mut crate :: fermented :: generics :: Arr_u8_20 { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: hash160 (& * self_) ; < crate :: fermented :: generics :: Arr_u8_20 as ferment :: FFIConversionTo < [u8 ; 20] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::public_key_from_extended_public_key_data_at_u32_path`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_public_key_from_extended_public_key_data_at_u32_path (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , index_path : * mut crate :: fermented :: generics :: Vec_u32) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: public_key_from_extended_public_key_data_at_u32_path (& * self_ , < crate :: fermented :: generics :: Vec_u32 as ferment :: FFIConversionFrom < Vec < u32 > >> :: ffi_from (index_path)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::serialized_extended_private_key_from_seed_at_u256_path`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_serialized_extended_private_key_from_seed_at_u256_path (seed : * mut crate :: fermented :: generics :: Slice_u8 , index_path : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_IndexPathU256 , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: generics :: Result_ok_String_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: serialized_extended_private_key_from_seed_at_u256_path (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (seed))) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_IndexPathU256 as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: IndexPathU256 >> :: ffi_from (index_path) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; < crate :: fermented :: generics :: Result_ok_String_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < String , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::serialized_private_master_key_from_seed`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_serialized_private_master_key_from_seed (seed : * mut crate :: fermented :: generics :: Slice_u8 , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: serialized_private_master_key_from_seed (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (seed))) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::public_key_unique_id_from_derived_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_public_key_unique_id_from_derived_key_data (derived_key_data : * mut crate :: fermented :: generics :: Slice_u8 , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u64 { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: public_key_unique_id_from_derived_key_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (derived_key_data))) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::serialized_auth_private_key_from_seed_for_chain`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_serialized_auth_private_key_from_seed_for_chain (seed : * mut crate :: fermented :: generics :: Slice_u8 , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: serialized_auth_private_key_from_seed_for_chain (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (seed))) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::serialized_from_bip38_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_serialized_from_bip38_key (key_string : * mut std :: os :: raw :: c_char , passphrase : * mut std :: os :: raw :: c_char , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: generics :: Result_ok_String_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: serialized_from_bip38_key (Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (key_string))) , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (passphrase))) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; < crate :: fermented :: generics :: Result_ok_String_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < String , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::is_valid_bip38_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_is_valid_bip38_key (key_string : * mut std :: os :: raw :: c_char) -> bool { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: is_valid_bip38_key (Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (key_string)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::is_empty_secret_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_is_empty_secret_key (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) -> bool { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: is_empty_secret_key (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::contains_secret_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_contains_secret_key (string_key : * mut std :: os :: raw :: c_char , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> bool { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: contains_secret_key (Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (string_key))) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::public_key_data_for_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_public_key_data_for_private_key (string_key : * mut std :: os :: raw :: c_char , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: public_key_data_for_private_key (Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (string_key))) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::address_from_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_address_from_public_key_data (data : * mut crate :: fermented :: generics :: Slice_u8 , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: address_from_public_key_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data))) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::address_from_recovered_compact_sig`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_address_from_recovered_compact_sig (compact_sig : * mut crate :: fermented :: generics :: Slice_u8 , digest : * mut crate :: fermented :: generics :: Arr_u8_32 , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: generics :: Result_ok_String_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: address_from_recovered_compact_sig (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (compact_sig))) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (digest) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; < crate :: fermented :: generics :: Result_ok_String_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < String , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::pro_reg_tx_verify_payload_signature`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_pro_reg_tx_verify_payload_signature (signature : * mut crate :: fermented :: generics :: Slice_u8 , payload : * mut crate :: fermented :: generics :: Slice_u8 , owner_key_hash : * mut crate :: fermented :: generics :: Arr_u8_20) -> bool { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: pro_reg_tx_verify_payload_signature (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (signature))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (payload))) , < crate :: fermented :: generics :: Arr_u8_20 as ferment :: FFIConversionFrom < [u8 ; 20] >> :: ffi_from (owner_key_hash)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::pro_reg_tx_payload_collateral_digest`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_pro_reg_tx_payload_collateral_digest (payload : * mut crate :: fermented :: generics :: Slice_u8 , script_payout : * mut crate :: fermented :: generics :: Slice_u8 , operator_reward : u16 , owner_key_hash : * mut crate :: fermented :: generics :: Arr_u8_20 , voter_key_hash : * mut crate :: fermented :: generics :: Arr_u8_20 , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey :: pro_reg_tx_payload_collateral_digest (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (payload))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (script_payout))) , operator_reward , < crate :: fermented :: generics :: Arr_u8_20 as ferment :: FFIConversionFrom < [u8 ; 20] >> :: ffi_from (owner_key_hash) , < crate :: fermented :: generics :: Arr_u8_20 as ferment :: FFIConversionFrom < [u8 ; 20] >> :: ffi_from (voter_key_hash) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [no_mangle] pub static dash_spv_crypto_keys_ecdsa_key_ECDSAKey_dash_spv_crypto_keys_IKey : crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey_VTable = { # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_kind (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: kind (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_secret_key_string (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: secret_key_string (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_has_private_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> bool { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: has_private_key (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; obj } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_address_with_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , chain : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: address_with_public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_sign (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: sign (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_hash_and_sign (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: hash_and_sign (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_verify (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , message_digest : * mut crate :: fermented :: generics :: Slice_u8 , signature : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: verify (& mut * ((* self_) . object as * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message_digest))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (signature)))) ; < crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < bool , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_secret_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: secret_key (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_chaincode (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: chaincode (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_fingerprint (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> u32 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: fingerprint (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; obj } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: private_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_extended_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: extended_private_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: util :: sec_vec :: SecVec , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_extended_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: extended_public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_serialized_private_key_for_script (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , chain_prefix : u8) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: serialized_private_key_for_script (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) , chain_prefix) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_hmac_256_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: hmac_256_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_forget_private_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: forget_private_key (& mut * ((* self_) . object as * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; ; } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_sign_message_digest (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , digest : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: sign_message_digest (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (digest)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_private_key_data_equal_to (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , other_private_key_data : * mut crate :: fermented :: generics :: Arr_u8_32) -> bool { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: private_key_data_equal_to (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (other_private_key_data)))) ; obj } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_public_key_data_equal_to (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , other_public_key_data : * mut crate :: fermented :: generics :: Vec_u8) -> bool { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: public_key_data_equal_to (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (other_public_key_data)))) ; obj } crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey_VTable { kind : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_kind , secret_key_string : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_secret_key_string , has_private_key : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_has_private_key , address_with_public_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_address_with_public_key_data , sign : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_sign , hash_and_sign : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_hash_and_sign , verify : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_verify , secret_key : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_secret_key , chaincode : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_chaincode , fingerprint : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_fingerprint , private_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_private_key_data , public_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_public_key_data , extended_private_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_extended_private_key_data , extended_public_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_extended_public_key_data , serialized_private_key_for_script : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_serialized_private_key_for_script , hmac_256_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_hmac_256_data , forget_private_key : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_forget_private_key , sign_message_digest : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_sign_message_digest , private_key_data_equal_to : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_private_key_data_equal_to , public_key_data_equal_to : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_public_key_data_equal_to } } ; # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_as_crate_fermented_types_dash_spv_crypto_keys_dash_spv_crypto_keys_IKey (obj : * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) -> crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey { crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey { object : obj as * const () , vtable : & dash_spv_crypto_keys_ecdsa_key_ECDSAKey_dash_spv_crypto_keys_IKey } } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_as_crate_fermented_types_dash_spv_crypto_keys_dash_spv_crypto_keys_IKey_destroy (obj : crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) { ferment :: unbox_any (obj . object as * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) ; } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::kind`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_kind (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: kind (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::kind`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_kind (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: kind (& * self_) ; < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::secret_key_string`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_secret_key_string (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: secret_key_string (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::secret_key_string`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_secret_key_string (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: secret_key_string (& * self_) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::has_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_has_private_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> bool { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: has_private_key (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::has_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_has_private_key (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) -> bool { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: has_private_key (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::address_with_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_address_with_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , chain : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: address_with_public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::address_with_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_address_with_public_key_data (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , chain : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: address_with_public_key_data (& * self_ , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::sign`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_sign (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: sign (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::sign`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_sign (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: sign (& * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::hash_and_sign`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_hash_and_sign (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: hash_and_sign (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::hash_and_sign`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_hash_and_sign (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , data : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: hash_and_sign (& * self_ , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::verify`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_verify (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , message_digest : * mut crate :: fermented :: generics :: Slice_u8 , signature : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: verify (& mut * ((* self_) . object as * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message_digest))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (signature)))) ; < crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < bool , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::verify`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_verify (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , message_digest : * mut crate :: fermented :: generics :: Slice_u8 , signature : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: verify (& mut * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message_digest))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (signature)))) ; < crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < bool , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::secret_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_secret_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: secret_key (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::secret_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_secret_key (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: secret_key (& * self_) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::chaincode`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_chaincode (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: chaincode (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::chaincode`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_chaincode (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: chaincode (& * self_) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::fingerprint`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_fingerprint (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> u32 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: fingerprint (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::fingerprint`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_fingerprint (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) -> u32 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: fingerprint (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: private_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_private_key_data (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: private_key_data (& * self_) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_public_key_data (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: public_key_data (& * self_) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::extended_private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_extended_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: extended_private_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: util :: sec_vec :: SecVec , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::extended_private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_extended_private_key_data (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: extended_private_key_data (& * self_) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: util :: sec_vec :: SecVec , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::extended_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_extended_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: extended_public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::extended_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_extended_public_key_data (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: extended_public_key_data (& * self_) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::serialized_private_key_for_script`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_serialized_private_key_for_script (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , chain_prefix : u8) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: serialized_private_key_for_script (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) , chain_prefix) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::serialized_private_key_for_script`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_serialized_private_key_for_script (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , chain_prefix : u8) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: serialized_private_key_for_script (& * self_ , chain_prefix) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::hmac_256_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_hmac_256_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: hmac_256_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::hmac_256_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_hmac_256_data (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: hmac_256_data (& * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::forget_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_forget_private_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: forget_private_key (& mut * ((* self_) . object as * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey)) ; ; } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::forget_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_forget_private_key (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: forget_private_key (& mut * self_) ; ; } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::sign_message_digest`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_sign_message_digest (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , digest : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: sign_message_digest (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (digest)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::sign_message_digest`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_sign_message_digest (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , digest : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: sign_message_digest (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (digest)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::private_key_data_equal_to`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_private_key_data_equal_to (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , other_private_key_data : * mut crate :: fermented :: generics :: Arr_u8_32) -> bool { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: private_key_data_equal_to (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (other_private_key_data)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::private_key_data_equal_to`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_private_key_data_equal_to (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , other_private_key_data : * mut crate :: fermented :: generics :: Arr_u8_32) -> bool { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: private_key_data_equal_to (& * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (other_private_key_data)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::public_key_data_equal_to`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_IKey_public_key_data_equal_to (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , other_public_key_data : * mut crate :: fermented :: generics :: Vec_u8) -> bool { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: public_key_data_equal_to (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (other_public_key_data)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ecdsa_key::ECDSAKey::public_key_data_equal_to`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ecdsa_key_ECDSAKey_public_key_data_equal_to (self_ : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , other_public_key_data : * mut crate :: fermented :: generics :: Vec_u8) -> bool { let obj = < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey as dash_spv_crypto :: keys :: IKey > :: public_key_data_equal_to (& * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (other_public_key_data)))) ; obj } } pub mod ed25519_key { use crate as dash_spv_apple_bindings ; # [no_mangle] pub static dash_spv_crypto_keys_ed25519_key_ED25519Key_dash_spv_crypto_keys_IKey : crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey_VTable = { # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_kind (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: kind (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_secret_key_string (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: secret_key_string (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_has_private_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> bool { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: has_private_key (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; obj } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_address_with_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , chain : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: address_with_public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_sign (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: sign (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_hash_and_sign (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: hash_and_sign (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_verify (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , message_digest : * mut crate :: fermented :: generics :: Slice_u8 , signature : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: verify (& mut * ((* self_) . object as * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message_digest))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (signature)))) ; < crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < bool , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_secret_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: secret_key (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_chaincode (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: chaincode (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_fingerprint (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> u32 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: fingerprint (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; obj } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: private_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_extended_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: extended_private_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: util :: sec_vec :: SecVec , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_extended_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: extended_public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_serialized_private_key_for_script (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , chain_prefix : u8) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: serialized_private_key_for_script (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) , chain_prefix) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_hmac_256_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: hmac_256_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_forget_private_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: forget_private_key (& mut * ((* self_) . object as * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; ; } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_sign_message_digest (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , digest : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: sign_message_digest (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (digest)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_private_key_data_equal_to (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , other_private_key_data : * mut crate :: fermented :: generics :: Arr_u8_32) -> bool { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: private_key_data_equal_to (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (other_private_key_data)))) ; obj } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_public_key_data_equal_to (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , other_public_key_data : * mut crate :: fermented :: generics :: Vec_u8) -> bool { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: public_key_data_equal_to (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (other_public_key_data)))) ; obj } crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey_VTable { kind : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_kind , secret_key_string : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_secret_key_string , has_private_key : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_has_private_key , address_with_public_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_address_with_public_key_data , sign : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_sign , hash_and_sign : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_hash_and_sign , verify : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_verify , secret_key : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_secret_key , chaincode : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_chaincode , fingerprint : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_fingerprint , private_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_private_key_data , public_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_public_key_data , extended_private_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_extended_private_key_data , extended_public_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_extended_public_key_data , serialized_private_key_for_script : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_serialized_private_key_for_script , hmac_256_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_hmac_256_data , forget_private_key : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_forget_private_key , sign_message_digest : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_sign_message_digest , private_key_data_equal_to : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_private_key_data_equal_to , public_key_data_equal_to : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_ed25519_key_ED25519Key_public_key_data_equal_to } } ; # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_as_crate_fermented_types_dash_spv_crypto_keys_dash_spv_crypto_keys_IKey (obj : * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) -> crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey { crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey { object : obj as * const () , vtable : & dash_spv_crypto_keys_ed25519_key_ED25519Key_dash_spv_crypto_keys_IKey } } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_as_crate_fermented_types_dash_spv_crypto_keys_dash_spv_crypto_keys_IKey_destroy (obj : crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) { ferment :: unbox_any (obj . object as * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) ; } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::kind`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_kind (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: kind (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::kind`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_kind (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: kind (& * self_) ; < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::secret_key_string`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_secret_key_string (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: secret_key_string (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::secret_key_string`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_secret_key_string (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: secret_key_string (& * self_) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::has_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_has_private_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> bool { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: has_private_key (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::has_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_has_private_key (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) -> bool { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: has_private_key (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::address_with_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_address_with_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , chain : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: address_with_public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::address_with_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_address_with_public_key_data (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key , chain : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: address_with_public_key_data (& * self_ , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::sign`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_sign (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: sign (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::sign`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_sign (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: sign (& * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::hash_and_sign`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_hash_and_sign (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: hash_and_sign (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::hash_and_sign`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_hash_and_sign (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key , data : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: hash_and_sign (& * self_ , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::verify`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_verify (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , message_digest : * mut crate :: fermented :: generics :: Slice_u8 , signature : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: verify (& mut * ((* self_) . object as * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message_digest))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (signature)))) ; < crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < bool , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::verify`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_verify (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key , message_digest : * mut crate :: fermented :: generics :: Slice_u8 , signature : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: verify (& mut * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message_digest))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (signature)))) ; < crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < bool , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::secret_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_secret_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: secret_key (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::secret_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_secret_key (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: secret_key (& * self_) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::chaincode`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_chaincode (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: chaincode (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::chaincode`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_chaincode (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: chaincode (& * self_) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::fingerprint`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_fingerprint (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> u32 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: fingerprint (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::fingerprint`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_fingerprint (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) -> u32 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: fingerprint (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: private_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_private_key_data (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: private_key_data (& * self_) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_public_key_data (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: public_key_data (& * self_) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::extended_private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_extended_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: extended_private_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: util :: sec_vec :: SecVec , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::extended_private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_extended_private_key_data (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: extended_private_key_data (& * self_) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: util :: sec_vec :: SecVec , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::extended_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_extended_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: extended_public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::extended_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_extended_public_key_data (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: extended_public_key_data (& * self_) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::serialized_private_key_for_script`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_serialized_private_key_for_script (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , chain_prefix : u8) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: serialized_private_key_for_script (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) , chain_prefix) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::serialized_private_key_for_script`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_serialized_private_key_for_script (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key , chain_prefix : u8) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: serialized_private_key_for_script (& * self_ , chain_prefix) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::hmac_256_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_hmac_256_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: hmac_256_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::hmac_256_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_hmac_256_data (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: hmac_256_data (& * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::forget_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_forget_private_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: forget_private_key (& mut * ((* self_) . object as * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key)) ; ; } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::forget_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_forget_private_key (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: forget_private_key (& mut * self_) ; ; } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::sign_message_digest`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_sign_message_digest (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , digest : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: sign_message_digest (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (digest)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::sign_message_digest`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_sign_message_digest (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key , digest : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: sign_message_digest (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (digest)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::private_key_data_equal_to`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_private_key_data_equal_to (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , other_private_key_data : * mut crate :: fermented :: generics :: Arr_u8_32) -> bool { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: private_key_data_equal_to (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (other_private_key_data)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::private_key_data_equal_to`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_private_key_data_equal_to (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key , other_private_key_data : * mut crate :: fermented :: generics :: Arr_u8_32) -> bool { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: private_key_data_equal_to (& * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (other_private_key_data)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::public_key_data_equal_to`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_IKey_public_key_data_equal_to (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , other_public_key_data : * mut crate :: fermented :: generics :: Vec_u8) -> bool { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: public_key_data_equal_to (& * ((* self_) . object as * const dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (other_public_key_data)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::public_key_data_equal_to`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_public_key_data_equal_to (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key , other_public_key_data : * mut crate :: fermented :: generics :: Vec_u8) -> bool { let obj = < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key as dash_spv_crypto :: keys :: IKey > :: public_key_data_equal_to (& * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (other_public_key_data)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::key_with_extended_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_key_with_extended_public_key_data (bytes : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ed25519_key_ED25519Key_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ed25519_key :: ED25519Key :: key_with_extended_public_key_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (bytes)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ed25519_key_ED25519Key_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::key_with_extended_private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_key_with_extended_private_key_data (bytes : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ed25519_key_ED25519Key_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ed25519_key :: ED25519Key :: key_with_extended_private_key_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (bytes)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ed25519_key_ED25519Key_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::key_with_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_key_with_private_key (string : * mut std :: os :: raw :: c_char) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ed25519_key_ED25519Key_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ed25519_key :: ED25519Key :: key_with_private_key (Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (string)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ed25519_key_ED25519Key_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::key_with_secret_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_key_with_secret_data (data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ed25519_key_ED25519Key_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: ed25519_key :: ED25519Key :: key_with_secret_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_ed25519_key_ED25519Key_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::ed25519_key::ED25519Key::hash160`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_ed25519_key_ED25519Key_hash160 (self_ : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key) -> * mut crate :: fermented :: generics :: Arr_u8_20 { let obj = dash_spv_crypto :: keys :: ed25519_key :: ED25519Key :: hash160 (& * self_) ; < crate :: fermented :: generics :: Arr_u8_20 as ferment :: FFIConversionTo < [u8 ; 20] >> :: ffi_to (obj) } } pub mod operator_public_key { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`OperatorPublicKey`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_crypto_keys_operator_public_key_OperatorPublicKey { pub data : * mut crate :: fermented :: generics :: Arr_u8_48 , pub version : u16 } impl ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: operator_public_key :: OperatorPublicKey > for dash_spv_crypto_keys_operator_public_key_OperatorPublicKey { unsafe fn ffi_from_const (ffi : * const dash_spv_crypto_keys_operator_public_key_OperatorPublicKey) -> dash_spv_crypto :: keys :: operator_public_key :: OperatorPublicKey { let ffi_ref = & * ffi ; dash_spv_crypto :: keys :: operator_public_key :: OperatorPublicKey { data : < crate :: fermented :: generics :: Arr_u8_48 as ferment :: FFIConversionFrom < [u8 ; 48] >> :: ffi_from (ffi_ref . data) , version : ffi_ref . version } } } impl ferment :: FFIConversionTo < dash_spv_crypto :: keys :: operator_public_key :: OperatorPublicKey > for dash_spv_crypto_keys_operator_public_key_OperatorPublicKey { unsafe fn ffi_to_const (obj : dash_spv_crypto :: keys :: operator_public_key :: OperatorPublicKey) -> * const dash_spv_crypto_keys_operator_public_key_OperatorPublicKey { ferment :: boxed (dash_spv_crypto_keys_operator_public_key_OperatorPublicKey { data : < crate :: fermented :: generics :: Arr_u8_48 as ferment :: FFIConversionTo < [u8 ; 48] >> :: ffi_to (obj . data) , version : obj . version }) } } impl Drop for dash_spv_crypto_keys_operator_public_key_OperatorPublicKey { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_operator_public_key_OperatorPublicKey_ctor < > (data : * mut crate :: fermented :: generics :: Arr_u8_48 , version : u16) -> * mut dash_spv_crypto_keys_operator_public_key_OperatorPublicKey { ferment :: boxed (dash_spv_crypto_keys_operator_public_key_OperatorPublicKey { data , version }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_operator_public_key_OperatorPublicKey_destroy < > (ffi : * mut dash_spv_crypto_keys_operator_public_key_OperatorPublicKey) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_operator_public_key_OperatorPublicKey_get_data < > (obj : * const dash_spv_crypto_keys_operator_public_key_OperatorPublicKey) -> * mut crate :: fermented :: generics :: Arr_u8_48 { (* obj) . data } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_operator_public_key_OperatorPublicKey_get_version < > (obj : * const dash_spv_crypto_keys_operator_public_key_OperatorPublicKey) -> u16 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_operator_public_key_OperatorPublicKey_set_data < > (obj : * const dash_spv_crypto_keys_operator_public_key_OperatorPublicKey) -> * mut crate :: fermented :: generics :: Arr_u8_48 { (* obj) . data } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_operator_public_key_OperatorPublicKey_set_version < > (obj : * const dash_spv_crypto_keys_operator_public_key_OperatorPublicKey) -> u16 { (* obj) . version } } pub mod bls_key { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::verify_signature`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_verify_signature (pubkey : * mut crate :: fermented :: generics :: Arr_u8_48 , use_legacy : bool , digest : * mut crate :: fermented :: generics :: Slice_u8 , signature : * mut crate :: fermented :: generics :: Arr_u8_96) -> bool { let obj = dash_spv_crypto :: keys :: bls_key :: BLSKey :: verify_signature (< crate :: fermented :: generics :: Arr_u8_48 as ferment :: FFIConversionFrom < [u8 ; 48] >> :: ffi_from (pubkey) , use_legacy , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (digest))) , < crate :: fermented :: generics :: Arr_u8_96 as ferment :: FFIConversionFrom < [u8 ; 96] >> :: ffi_from (signature)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::key_with_seed_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_key_with_seed_data (seed : * mut crate :: fermented :: generics :: Slice_u8 , use_legacy : bool) -> * mut dash_spv_crypto :: keys :: bls_key :: BLSKey { let obj = dash_spv_crypto :: keys :: bls_key :: BLSKey :: key_with_seed_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (seed))) , use_legacy) ; ferment :: boxed (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::key_with_secret_hex`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_key_with_secret_hex (string : * mut std :: os :: raw :: c_char , use_legacy : bool) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dashcore_hashes_hex_Error { let obj = dash_spv_crypto :: keys :: bls_key :: BLSKey :: key_with_secret_hex (Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (string))) , use_legacy) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dashcore_hashes_hex_Error as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: bls_key :: BLSKey , dashcore :: hashes :: hex :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::key_with_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_key_with_private_key (string : * mut std :: os :: raw :: c_char , use_legacy : bool) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: bls_key :: BLSKey :: key_with_private_key (Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (string))) , use_legacy) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: bls_key :: BLSKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::key_with_private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_key_with_private_key_data (data : * mut crate :: fermented :: generics :: Slice_u8 , use_legacy : bool) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: bls_key :: BLSKey :: key_with_private_key_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data))) , use_legacy) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: bls_key :: BLSKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::key_with_public_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_key_with_public_key (pubkey : * mut crate :: fermented :: generics :: Arr_u8_48 , use_legacy : bool) -> * mut dash_spv_crypto :: keys :: bls_key :: BLSKey { let obj = dash_spv_crypto :: keys :: bls_key :: BLSKey :: key_with_public_key (< crate :: fermented :: generics :: Arr_u8_48 as ferment :: FFIConversionFrom < [u8 ; 48] >> :: ffi_from (pubkey) , use_legacy) ; ferment :: boxed (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::key_with_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_key_with_public_key_data (data : * mut crate :: fermented :: generics :: Slice_u8 , use_legacy : bool) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: bls_key :: BLSKey :: key_with_public_key_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data))) , use_legacy) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: bls_key :: BLSKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::key_with_extended_private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_key_with_extended_private_key_data (bytes : * mut crate :: fermented :: generics :: Slice_u8 , use_legacy : bool) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: bls_key :: BLSKey :: key_with_extended_private_key_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (bytes))) , use_legacy) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: bls_key :: BLSKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::migrate_from_legacy_extended_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_migrate_from_legacy_extended_public_key_data (bytes : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: bls_key :: BLSKey :: migrate_from_legacy_extended_public_key_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (bytes)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: bls_key :: BLSKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::migrate_from_basic_extended_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_migrate_from_basic_extended_public_key_data (bytes : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: bls_key :: BLSKey :: migrate_from_basic_extended_public_key_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (bytes)))) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: bls_key :: BLSKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::product`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_product (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey , public_key : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey) -> * mut crate :: fermented :: generics :: Result_ok_u8_arr_48_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: bls_key :: BLSKey :: product (& * self_ , Box :: leak (Box :: new ((& * public_key) . clone ()))) ; < crate :: fermented :: generics :: Result_ok_u8_arr_48_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < [u8 ; 48] , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::key_with_extended_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_key_with_extended_public_key_data (bytes : * mut crate :: fermented :: generics :: Slice_u8 , use_legacy : bool) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: bls_key :: BLSKey :: key_with_extended_public_key_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (bytes))) , use_legacy) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: bls_key :: BLSKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::sign_digest`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_sign_digest (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey , md : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Arr_u8_96 { let obj = dash_spv_crypto :: keys :: bls_key :: BLSKey :: sign_digest (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (md)) ; < crate :: fermented :: generics :: Arr_u8_96 as ferment :: FFIConversionTo < [u8 ; 96] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::sign_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_sign_data (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Arr_u8_96 { let obj = dash_spv_crypto :: keys :: bls_key :: BLSKey :: sign_data (& * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Arr_u8_96 as ferment :: FFIConversionTo < [u8 ; 96] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::extended_private_key_with_seed_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_extended_private_key_with_seed_data (seed : * mut crate :: fermented :: generics :: Slice_u8 , use_legacy : bool) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: bls_key :: BLSKey :: extended_private_key_with_seed_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (seed))) , use_legacy) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: bls_key :: BLSKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::hash160`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_hash160 (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey) -> * mut crate :: fermented :: generics :: Arr_u8_20 { let obj = dash_spv_crypto :: keys :: bls_key :: BLSKey :: hash160 (& * self_) ; < crate :: fermented :: generics :: Arr_u8_20 as ferment :: FFIConversionTo < [u8 ; 20] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::public_key_serialized`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_public_key_serialized (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey , use_legacy : bool) -> * mut crate :: fermented :: generics :: Result_ok_String_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_crypto :: keys :: bls_key :: BLSKey :: public_key_serialized (& * self_ , use_legacy) ; < crate :: fermented :: generics :: Result_ok_String_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < String , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [no_mangle] pub static dash_spv_crypto_keys_bls_key_BLSKey_dash_spv_crypto_keys_IKey : crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey_VTable = { # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_kind (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: kind (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_secret_key_string (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: secret_key_string (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_has_private_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> bool { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: has_private_key (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; obj } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_address_with_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , chain : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: address_with_public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_sign (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: sign (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_hash_and_sign (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: hash_and_sign (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_verify (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , message_digest : * mut crate :: fermented :: generics :: Slice_u8 , signature : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: verify (& mut * ((* self_) . object as * mut dash_spv_crypto :: keys :: bls_key :: BLSKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message_digest))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (signature)))) ; < crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < bool , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_secret_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: secret_key (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_chaincode (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: chaincode (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_fingerprint (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> u32 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: fingerprint (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; obj } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: private_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_extended_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: extended_private_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: util :: sec_vec :: SecVec , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_extended_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: extended_public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_serialized_private_key_for_script (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , chain_prefix : u8) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: serialized_private_key_for_script (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey) , chain_prefix) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_hmac_256_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: hmac_256_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_forget_private_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: forget_private_key (& mut * ((* self_) . object as * mut dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; ; } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_sign_message_digest (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , digest : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: sign_message_digest (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (digest)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_private_key_data_equal_to (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , other_private_key_data : * mut crate :: fermented :: generics :: Arr_u8_32) -> bool { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: private_key_data_equal_to (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (other_private_key_data)))) ; obj } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_public_key_data_equal_to (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , other_public_key_data : * mut crate :: fermented :: generics :: Vec_u8) -> bool { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: public_key_data_equal_to (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (other_public_key_data)))) ; obj } crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey_VTable { kind : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_kind , secret_key_string : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_secret_key_string , has_private_key : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_has_private_key , address_with_public_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_address_with_public_key_data , sign : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_sign , hash_and_sign : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_hash_and_sign , verify : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_verify , secret_key : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_secret_key , chaincode : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_chaincode , fingerprint : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_fingerprint , private_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_private_key_data , public_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_public_key_data , extended_private_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_extended_private_key_data , extended_public_key_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_extended_public_key_data , serialized_private_key_for_script : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_serialized_private_key_for_script , hmac_256_data : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_hmac_256_data , forget_private_key : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_forget_private_key , sign_message_digest : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_sign_message_digest , private_key_data_equal_to : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_private_key_data_equal_to , public_key_data_equal_to : dash_spv_crypto_keys_IKey_dash_spv_crypto_keys_bls_key_BLSKey_public_key_data_equal_to } } ; # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_as_crate_fermented_types_dash_spv_crypto_keys_dash_spv_crypto_keys_IKey (obj : * const dash_spv_crypto :: keys :: bls_key :: BLSKey) -> crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey { crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey { object : obj as * const () , vtable : & dash_spv_crypto_keys_bls_key_BLSKey_dash_spv_crypto_keys_IKey } } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_as_crate_fermented_types_dash_spv_crypto_keys_dash_spv_crypto_keys_IKey_destroy (obj : crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) { ferment :: unbox_any (obj . object as * mut dash_spv_crypto :: keys :: bls_key :: BLSKey) ; } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::kind`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_kind (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: kind (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::kind`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_kind (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: kind (& * self_) ; < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::secret_key_string`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_secret_key_string (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: secret_key_string (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::secret_key_string`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_secret_key_string (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: secret_key_string (& * self_) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::has_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_has_private_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> bool { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: has_private_key (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::has_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_has_private_key (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey) -> bool { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: has_private_key (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::address_with_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_address_with_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , chain : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: address_with_public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::address_with_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_address_with_public_key_data (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey , chain : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: address_with_public_key_data (& * self_ , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::sign`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_sign (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: sign (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::sign`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_sign (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: sign (& * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::hash_and_sign`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_hash_and_sign (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: hash_and_sign (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::hash_and_sign`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_hash_and_sign (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey , data : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: hash_and_sign (& * self_ , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::verify`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_verify (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , message_digest : * mut crate :: fermented :: generics :: Slice_u8 , signature : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: verify (& mut * ((* self_) . object as * mut dash_spv_crypto :: keys :: bls_key :: BLSKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message_digest))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (signature)))) ; < crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < bool , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::verify`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_verify (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey , message_digest : * mut crate :: fermented :: generics :: Slice_u8 , signature : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: verify (& mut * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message_digest))) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (signature)))) ; < crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < bool , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::secret_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_secret_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: secret_key (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::secret_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_secret_key (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: secret_key (& * self_) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::chaincode`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_chaincode (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: chaincode (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::chaincode`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_chaincode (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: chaincode (& * self_) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::fingerprint`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_fingerprint (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> u32 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: fingerprint (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::fingerprint`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_fingerprint (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey) -> u32 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: fingerprint (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: private_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_private_key_data (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: private_key_data (& * self_) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_public_key_data (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: public_key_data (& * self_) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::extended_private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_extended_private_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: extended_private_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: util :: sec_vec :: SecVec , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::extended_private_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_extended_private_key_data (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: extended_private_key_data (& * self_) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: util :: sec_vec :: SecVec , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::extended_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_extended_public_key_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: extended_public_key_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::extended_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_extended_public_key_data (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: extended_public_key_data (& * self_) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::serialized_private_key_for_script`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_serialized_private_key_for_script (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , chain_prefix : u8) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: serialized_private_key_for_script (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey) , chain_prefix) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::serialized_private_key_for_script`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_serialized_private_key_for_script (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey , chain_prefix : u8) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: serialized_private_key_for_script (& * self_ , chain_prefix) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::hmac_256_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_hmac_256_data (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: hmac_256_data (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::hmac_256_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_hmac_256_data (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey , data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: hmac_256_data (& * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::forget_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_forget_private_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey) { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: forget_private_key (& mut * ((* self_) . object as * mut dash_spv_crypto :: keys :: bls_key :: BLSKey)) ; ; } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::forget_private_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_forget_private_key (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey) { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: forget_private_key (& mut * self_) ; ; } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::sign_message_digest`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_sign_message_digest (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , digest : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: sign_message_digest (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (digest)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::sign_message_digest`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_sign_message_digest (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey , digest : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: sign_message_digest (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (digest)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::private_key_data_equal_to`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_private_key_data_equal_to (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , other_private_key_data : * mut crate :: fermented :: generics :: Arr_u8_32) -> bool { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: private_key_data_equal_to (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (other_private_key_data)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::private_key_data_equal_to`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_private_key_data_equal_to (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey , other_private_key_data : * mut crate :: fermented :: generics :: Arr_u8_32) -> bool { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: private_key_data_equal_to (& * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (other_private_key_data)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::public_key_data_equal_to`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_IKey_public_key_data_equal_to (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_IKey , other_public_key_data : * mut crate :: fermented :: generics :: Vec_u8) -> bool { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: public_key_data_equal_to (& * ((* self_) . object as * const dash_spv_crypto :: keys :: bls_key :: BLSKey) , Box :: leak (Box :: new (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (other_public_key_data)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::keys::bls_key::BLSKey::public_key_data_equal_to`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_keys_bls_key_BLSKey_public_key_data_equal_to (self_ : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey , other_public_key_data : * mut crate :: fermented :: generics :: Vec_u8) -> bool { let obj = < dash_spv_crypto :: keys :: bls_key :: BLSKey as dash_spv_crypto :: keys :: IKey > :: public_key_data_equal_to (& * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (other_public_key_data)))) ; obj } } } pub mod crypto { use crate as dash_spv_apple_bindings ; pub mod byte_util { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`UInt256`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_crypto_crypto_byte_util_UInt256 (* mut crate :: fermented :: generics :: Arr_u8_32) ; impl ferment :: FFIConversionFrom < dash_spv_crypto :: crypto :: byte_util :: UInt256 > for dash_spv_crypto_crypto_byte_util_UInt256 { unsafe fn ffi_from_const (ffi : * const dash_spv_crypto_crypto_byte_util_UInt256) -> dash_spv_crypto :: crypto :: byte_util :: UInt256 { let ffi_ref = & * ffi ; dash_spv_crypto :: crypto :: byte_util :: UInt256 (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (ffi_ref . 0)) } } impl ferment :: FFIConversionTo < dash_spv_crypto :: crypto :: byte_util :: UInt256 > for dash_spv_crypto_crypto_byte_util_UInt256 { unsafe fn ffi_to_const (obj : dash_spv_crypto :: crypto :: byte_util :: UInt256) -> * const dash_spv_crypto_crypto_byte_util_UInt256 { ferment :: boxed (dash_spv_crypto_crypto_byte_util_UInt256 (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj . 0))) } } impl Drop for dash_spv_crypto_crypto_byte_util_UInt256 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_crypto_byte_util_UInt256_ctor < > (o_0 : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut dash_spv_crypto_crypto_byte_util_UInt256 { ferment :: boxed (dash_spv_crypto_crypto_byte_util_UInt256 (o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_crypto_byte_util_UInt256_destroy < > (ffi : * mut dash_spv_crypto_crypto_byte_util_UInt256) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_crypto_byte_util_UInt256_get_0 < > (obj : * const dash_spv_crypto_crypto_byte_util_UInt256) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_crypto_byte_util_UInt256_set_0 < > (obj : * const dash_spv_crypto_crypto_byte_util_UInt256) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . 0 } } } pub mod util { use crate as dash_spv_apple_bindings ; pub mod psbt { use crate as dash_spv_apple_bindings ; } pub mod script { use crate as dash_spv_apple_bindings ; } pub mod sec_vec { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_crypto::util::sec_vec::SecVec::to_vec`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_sec_vec_SecVec_to_vec (self_ : * mut dash_spv_crypto :: util :: sec_vec :: SecVec) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = dash_spv_crypto :: util :: sec_vec :: SecVec :: to_vec (& * self_) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } } pub mod address { use crate as dash_spv_apple_bindings ; pub mod address { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_crypto::util::address::address::public_key_hash_from_script`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_address_address_public_key_hash_from_script (script : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = dash_spv_crypto :: util :: address :: address :: public_key_hash_from_script (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (script)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::util::address::address::with_public_key_data_and_script_pub_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_address_address_with_public_key_data_and_script_pub_key (data : * mut crate :: fermented :: generics :: Slice_u8 , script_pub_key : u8) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_crypto :: util :: address :: address :: with_public_key_data_and_script_pub_key (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data))) , script_pub_key) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::util::address::address::with_public_key_data`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_address_address_with_public_key_data (data : * mut crate :: fermented :: generics :: Slice_u8 , map : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_crypto :: util :: address :: address :: with_public_key_data (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data))) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (map)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } } } pub mod params { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`SporkParams`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_crypto_util_params_SporkParams { pub public_key_hex_string : * mut std :: os :: raw :: c_char , pub private_key_base58_string : * mut std :: os :: raw :: c_char , pub address : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dash_spv_crypto :: util :: params :: SporkParams > for dash_spv_crypto_util_params_SporkParams { unsafe fn ffi_from_const (ffi : * const dash_spv_crypto_util_params_SporkParams) -> dash_spv_crypto :: util :: params :: SporkParams { let ffi_ref = & * ffi ; dash_spv_crypto :: util :: params :: SporkParams { public_key_hex_string : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (ffi_ref . public_key_hex_string) , private_key_base58_string : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (ffi_ref . private_key_base58_string) , address : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . address) } } } impl ferment :: FFIConversionTo < dash_spv_crypto :: util :: params :: SporkParams > for dash_spv_crypto_util_params_SporkParams { unsafe fn ffi_to_const (obj : dash_spv_crypto :: util :: params :: SporkParams) -> * const dash_spv_crypto_util_params_SporkParams { ferment :: boxed (dash_spv_crypto_util_params_SporkParams { public_key_hex_string : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj . public_key_hex_string) , private_key_base58_string : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj . private_key_base58_string) , address : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . address) }) } } impl Drop for dash_spv_crypto_util_params_SporkParams { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any_opt (ffi_ref . public_key_hex_string) ; ferment :: unbox_any_opt (ffi_ref . private_key_base58_string) ; ferment :: unbox_string (ffi_ref . address) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_SporkParams_ctor < > (public_key_hex_string : * mut std :: os :: raw :: c_char , private_key_base58_string : * mut std :: os :: raw :: c_char , address : * mut std :: os :: raw :: c_char) -> * mut dash_spv_crypto_util_params_SporkParams { ferment :: boxed (dash_spv_crypto_util_params_SporkParams { public_key_hex_string , private_key_base58_string , address }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_SporkParams_destroy < > (ffi : * mut dash_spv_crypto_util_params_SporkParams) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_SporkParams_get_public_key_hex_string < > (obj : * const dash_spv_crypto_util_params_SporkParams) -> * mut std :: os :: raw :: c_char { (* obj) . public_key_hex_string } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_SporkParams_get_private_key_base58_string < > (obj : * const dash_spv_crypto_util_params_SporkParams) -> * mut std :: os :: raw :: c_char { (* obj) . private_key_base58_string } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_SporkParams_get_address < > (obj : * const dash_spv_crypto_util_params_SporkParams) -> * mut std :: os :: raw :: c_char { (* obj) . address } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_SporkParams_set_public_key_hex_string < > (obj : * const dash_spv_crypto_util_params_SporkParams) -> * mut std :: os :: raw :: c_char { (* obj) . public_key_hex_string } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_SporkParams_set_private_key_base58_string < > (obj : * const dash_spv_crypto_util_params_SporkParams) -> * mut std :: os :: raw :: c_char { (* obj) . private_key_base58_string } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_SporkParams_set_address < > (obj : * const dash_spv_crypto_util_params_SporkParams) -> * mut std :: os :: raw :: c_char { (* obj) . address } # [doc = "FFI-representation of the [`ScriptMap`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_crypto_util_params_ScriptMap { pub privkey : u8 , pub pubkey : u8 , pub script : u8 } impl ferment :: FFIConversionFrom < dash_spv_crypto :: util :: params :: ScriptMap > for dash_spv_crypto_util_params_ScriptMap { unsafe fn ffi_from_const (ffi : * const dash_spv_crypto_util_params_ScriptMap) -> dash_spv_crypto :: util :: params :: ScriptMap { let ffi_ref = & * ffi ; dash_spv_crypto :: util :: params :: ScriptMap { privkey : ffi_ref . privkey , pubkey : ffi_ref . pubkey , script : ffi_ref . script } } } impl ferment :: FFIConversionTo < dash_spv_crypto :: util :: params :: ScriptMap > for dash_spv_crypto_util_params_ScriptMap { unsafe fn ffi_to_const (obj : dash_spv_crypto :: util :: params :: ScriptMap) -> * const dash_spv_crypto_util_params_ScriptMap { ferment :: boxed (dash_spv_crypto_util_params_ScriptMap { privkey : obj . privkey , pubkey : obj . pubkey , script : obj . script }) } } impl Drop for dash_spv_crypto_util_params_ScriptMap { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_ScriptMap_ctor < > (privkey : u8 , pubkey : u8 , script : u8) -> * mut dash_spv_crypto_util_params_ScriptMap { ferment :: boxed (dash_spv_crypto_util_params_ScriptMap { privkey , pubkey , script }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_ScriptMap_destroy < > (ffi : * mut dash_spv_crypto_util_params_ScriptMap) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_ScriptMap_get_privkey < > (obj : * const dash_spv_crypto_util_params_ScriptMap) -> u8 { (* obj) . privkey } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_ScriptMap_get_pubkey < > (obj : * const dash_spv_crypto_util_params_ScriptMap) -> u8 { (* obj) . pubkey } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_ScriptMap_get_script < > (obj : * const dash_spv_crypto_util_params_ScriptMap) -> u8 { (* obj) . script } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_ScriptMap_set_privkey < > (obj : * const dash_spv_crypto_util_params_ScriptMap) -> u8 { (* obj) . privkey } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_ScriptMap_set_pubkey < > (obj : * const dash_spv_crypto_util_params_ScriptMap) -> u8 { (* obj) . pubkey } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_ScriptMap_set_script < > (obj : * const dash_spv_crypto_util_params_ScriptMap) -> u8 { (* obj) . script } # [doc = "FFI-representation of the [`Params`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_crypto_util_params_Params { pub chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType , pub max_proof_of_work : * mut std :: os :: raw :: c_char , pub max_proof_of_work_target : u32 , pub allow_min_difficulty_blocks : bool , pub base_reward : u64 , pub min_protocol_version : u32 , pub protocol_version : u32 , pub standard_port : u16 , pub standard_dapi_grpc_port : u32 , pub magic_number : u32 , pub headers_max_amount : u32 , pub peer_misbehaving_threshold : u32 , pub transaction_version : u16 , pub is_evolution_enabled : bool , pub fee_per_byte : u64 , pub platform_protocol_version : u32 , pub dpns_contract_id : * mut std :: os :: raw :: c_char , pub dashpay_contract_id : * mut std :: os :: raw :: c_char , pub minimum_difficulty_blocks : u32 , pub standard_dapi_jrpc_port : u32 } impl ferment :: FFIConversionFrom < dash_spv_crypto :: util :: params :: Params > for dash_spv_crypto_util_params_Params { unsafe fn ffi_from_const (ffi : * const dash_spv_crypto_util_params_Params) -> dash_spv_crypto :: util :: params :: Params { let ffi_ref = & * ffi ; dash_spv_crypto :: util :: params :: Params { chain_type : < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (ffi_ref . chain_type) , max_proof_of_work : Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (ffi_ref . max_proof_of_work))) , max_proof_of_work_target : ffi_ref . max_proof_of_work_target , allow_min_difficulty_blocks : ffi_ref . allow_min_difficulty_blocks , base_reward : ffi_ref . base_reward , min_protocol_version : ffi_ref . min_protocol_version , protocol_version : ffi_ref . protocol_version , standard_port : ffi_ref . standard_port , standard_dapi_grpc_port : ffi_ref . standard_dapi_grpc_port , magic_number : ffi_ref . magic_number , headers_max_amount : ffi_ref . headers_max_amount , peer_misbehaving_threshold : ffi_ref . peer_misbehaving_threshold , transaction_version : ffi_ref . transaction_version , is_evolution_enabled : ffi_ref . is_evolution_enabled , fee_per_byte : ffi_ref . fee_per_byte , platform_protocol_version : ffi_ref . platform_protocol_version , dpns_contract_id : Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (ffi_ref . dpns_contract_id))) , dashpay_contract_id : Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (ffi_ref . dashpay_contract_id))) , minimum_difficulty_blocks : ffi_ref . minimum_difficulty_blocks , standard_dapi_jrpc_port : ffi_ref . standard_dapi_jrpc_port } } } impl ferment :: FFIConversionTo < dash_spv_crypto :: util :: params :: Params > for dash_spv_crypto_util_params_Params { unsafe fn ffi_to_const (obj : dash_spv_crypto :: util :: params :: Params) -> * const dash_spv_crypto_util_params_Params { ferment :: boxed (dash_spv_crypto_util_params_Params { chain_type : < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionTo < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_to (obj . chain_type) , max_proof_of_work : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < & str >> :: ffi_to (obj . max_proof_of_work) , max_proof_of_work_target : obj . max_proof_of_work_target , allow_min_difficulty_blocks : obj . allow_min_difficulty_blocks , base_reward : obj . base_reward , min_protocol_version : obj . min_protocol_version , protocol_version : obj . protocol_version , standard_port : obj . standard_port , standard_dapi_grpc_port : obj . standard_dapi_grpc_port , magic_number : obj . magic_number , headers_max_amount : obj . headers_max_amount , peer_misbehaving_threshold : obj . peer_misbehaving_threshold , transaction_version : obj . transaction_version , is_evolution_enabled : obj . is_evolution_enabled , fee_per_byte : obj . fee_per_byte , platform_protocol_version : obj . platform_protocol_version , dpns_contract_id : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < & str >> :: ffi_to (obj . dpns_contract_id) , dashpay_contract_id : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < & str >> :: ffi_to (obj . dashpay_contract_id) , minimum_difficulty_blocks : obj . minimum_difficulty_blocks , standard_dapi_jrpc_port : obj . standard_dapi_jrpc_port }) } } impl Drop for dash_spv_crypto_util_params_Params { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . chain_type) ; ferment :: unbox_string (ffi_ref . max_proof_of_work) ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ferment :: unbox_string (ffi_ref . dpns_contract_id) ; ferment :: unbox_string (ffi_ref . dashpay_contract_id) ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_ctor < > (chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType , max_proof_of_work : * mut std :: os :: raw :: c_char , max_proof_of_work_target : u32 , allow_min_difficulty_blocks : bool , base_reward : u64 , min_protocol_version : u32 , protocol_version : u32 , standard_port : u16 , standard_dapi_grpc_port : u32 , magic_number : u32 , headers_max_amount : u32 , peer_misbehaving_threshold : u32 , transaction_version : u16 , is_evolution_enabled : bool , fee_per_byte : u64 , platform_protocol_version : u32 , dpns_contract_id : * mut std :: os :: raw :: c_char , dashpay_contract_id : * mut std :: os :: raw :: c_char , minimum_difficulty_blocks : u32 , standard_dapi_jrpc_port : u32) -> * mut dash_spv_crypto_util_params_Params { ferment :: boxed (dash_spv_crypto_util_params_Params { chain_type , max_proof_of_work , max_proof_of_work_target , allow_min_difficulty_blocks , base_reward , min_protocol_version , protocol_version , standard_port , standard_dapi_grpc_port , magic_number , headers_max_amount , peer_misbehaving_threshold , transaction_version , is_evolution_enabled , fee_per_byte , platform_protocol_version , dpns_contract_id , dashpay_contract_id , minimum_difficulty_blocks , standard_dapi_jrpc_port }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_destroy < > (ffi : * mut dash_spv_crypto_util_params_Params) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_chain_type < > (obj : * const dash_spv_crypto_util_params_Params) -> * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType { (* obj) . chain_type } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_max_proof_of_work < > (obj : * const dash_spv_crypto_util_params_Params) -> * mut std :: os :: raw :: c_char { (* obj) . max_proof_of_work } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_max_proof_of_work_target < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . max_proof_of_work_target } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_allow_min_difficulty_blocks < > (obj : * const dash_spv_crypto_util_params_Params) -> bool { (* obj) . allow_min_difficulty_blocks } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_base_reward < > (obj : * const dash_spv_crypto_util_params_Params) -> u64 { (* obj) . base_reward } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_min_protocol_version < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . min_protocol_version } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_protocol_version < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . protocol_version } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_standard_port < > (obj : * const dash_spv_crypto_util_params_Params) -> u16 { (* obj) . standard_port } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_standard_dapi_grpc_port < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . standard_dapi_grpc_port } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_magic_number < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . magic_number } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_headers_max_amount < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . headers_max_amount } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_peer_misbehaving_threshold < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . peer_misbehaving_threshold } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_transaction_version < > (obj : * const dash_spv_crypto_util_params_Params) -> u16 { (* obj) . transaction_version } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_is_evolution_enabled < > (obj : * const dash_spv_crypto_util_params_Params) -> bool { (* obj) . is_evolution_enabled } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_fee_per_byte < > (obj : * const dash_spv_crypto_util_params_Params) -> u64 { (* obj) . fee_per_byte } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_platform_protocol_version < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . platform_protocol_version } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_dpns_contract_id < > (obj : * const dash_spv_crypto_util_params_Params) -> * mut std :: os :: raw :: c_char { (* obj) . dpns_contract_id } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_dashpay_contract_id < > (obj : * const dash_spv_crypto_util_params_Params) -> * mut std :: os :: raw :: c_char { (* obj) . dashpay_contract_id } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_minimum_difficulty_blocks < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . minimum_difficulty_blocks } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_get_standard_dapi_jrpc_port < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . standard_dapi_jrpc_port } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_chain_type < > (obj : * const dash_spv_crypto_util_params_Params) -> * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType { (* obj) . chain_type } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_max_proof_of_work < > (obj : * const dash_spv_crypto_util_params_Params) -> * mut std :: os :: raw :: c_char { (* obj) . max_proof_of_work } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_max_proof_of_work_target < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . max_proof_of_work_target } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_allow_min_difficulty_blocks < > (obj : * const dash_spv_crypto_util_params_Params) -> bool { (* obj) . allow_min_difficulty_blocks } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_base_reward < > (obj : * const dash_spv_crypto_util_params_Params) -> u64 { (* obj) . base_reward } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_min_protocol_version < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . min_protocol_version } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_protocol_version < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . protocol_version } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_standard_port < > (obj : * const dash_spv_crypto_util_params_Params) -> u16 { (* obj) . standard_port } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_standard_dapi_grpc_port < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . standard_dapi_grpc_port } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_magic_number < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . magic_number } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_headers_max_amount < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . headers_max_amount } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_peer_misbehaving_threshold < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . peer_misbehaving_threshold } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_transaction_version < > (obj : * const dash_spv_crypto_util_params_Params) -> u16 { (* obj) . transaction_version } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_is_evolution_enabled < > (obj : * const dash_spv_crypto_util_params_Params) -> bool { (* obj) . is_evolution_enabled } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_fee_per_byte < > (obj : * const dash_spv_crypto_util_params_Params) -> u64 { (* obj) . fee_per_byte } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_platform_protocol_version < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . platform_protocol_version } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_dpns_contract_id < > (obj : * const dash_spv_crypto_util_params_Params) -> * mut std :: os :: raw :: c_char { (* obj) . dpns_contract_id } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_dashpay_contract_id < > (obj : * const dash_spv_crypto_util_params_Params) -> * mut std :: os :: raw :: c_char { (* obj) . dashpay_contract_id } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_minimum_difficulty_blocks < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . minimum_difficulty_blocks } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_Params_set_standard_dapi_jrpc_port < > (obj : * const dash_spv_crypto_util_params_Params) -> u32 { (* obj) . standard_dapi_jrpc_port } # [doc = "FFI-representation of the [`DIP14ScriptMap`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_crypto_util_params_DIP14ScriptMap { pub dps : * mut crate :: fermented :: generics :: Arr_u8_4 , pub dpp : * mut crate :: fermented :: generics :: Arr_u8_4 } impl ferment :: FFIConversionFrom < dash_spv_crypto :: util :: params :: DIP14ScriptMap > for dash_spv_crypto_util_params_DIP14ScriptMap { unsafe fn ffi_from_const (ffi : * const dash_spv_crypto_util_params_DIP14ScriptMap) -> dash_spv_crypto :: util :: params :: DIP14ScriptMap { let ffi_ref = & * ffi ; dash_spv_crypto :: util :: params :: DIP14ScriptMap { dps : < crate :: fermented :: generics :: Arr_u8_4 as ferment :: FFIConversionFrom < [u8 ; 4] >> :: ffi_from (ffi_ref . dps) , dpp : < crate :: fermented :: generics :: Arr_u8_4 as ferment :: FFIConversionFrom < [u8 ; 4] >> :: ffi_from (ffi_ref . dpp) } } } impl ferment :: FFIConversionTo < dash_spv_crypto :: util :: params :: DIP14ScriptMap > for dash_spv_crypto_util_params_DIP14ScriptMap { unsafe fn ffi_to_const (obj : dash_spv_crypto :: util :: params :: DIP14ScriptMap) -> * const dash_spv_crypto_util_params_DIP14ScriptMap { ferment :: boxed (dash_spv_crypto_util_params_DIP14ScriptMap { dps : < crate :: fermented :: generics :: Arr_u8_4 as ferment :: FFIConversionTo < [u8 ; 4] >> :: ffi_to (obj . dps) , dpp : < crate :: fermented :: generics :: Arr_u8_4 as ferment :: FFIConversionTo < [u8 ; 4] >> :: ffi_to (obj . dpp) }) } } impl Drop for dash_spv_crypto_util_params_DIP14ScriptMap { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . dps) ; ferment :: unbox_any (ffi_ref . dpp) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_DIP14ScriptMap_ctor < > (dps : * mut crate :: fermented :: generics :: Arr_u8_4 , dpp : * mut crate :: fermented :: generics :: Arr_u8_4) -> * mut dash_spv_crypto_util_params_DIP14ScriptMap { ferment :: boxed (dash_spv_crypto_util_params_DIP14ScriptMap { dps , dpp }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_DIP14ScriptMap_destroy < > (ffi : * mut dash_spv_crypto_util_params_DIP14ScriptMap) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_DIP14ScriptMap_get_dps < > (obj : * const dash_spv_crypto_util_params_DIP14ScriptMap) -> * mut crate :: fermented :: generics :: Arr_u8_4 { (* obj) . dps } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_DIP14ScriptMap_get_dpp < > (obj : * const dash_spv_crypto_util_params_DIP14ScriptMap) -> * mut crate :: fermented :: generics :: Arr_u8_4 { (* obj) . dpp } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_DIP14ScriptMap_set_dps < > (obj : * const dash_spv_crypto_util_params_DIP14ScriptMap) -> * mut crate :: fermented :: generics :: Arr_u8_4 { (* obj) . dps } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_DIP14ScriptMap_set_dpp < > (obj : * const dash_spv_crypto_util_params_DIP14ScriptMap) -> * mut crate :: fermented :: generics :: Arr_u8_4 { (* obj) . dpp } # [doc = "FFI-representation of the [`BIP32ScriptMap`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_crypto_util_params_BIP32ScriptMap { pub xprv : * mut crate :: fermented :: generics :: Arr_u8_4 , pub xpub : * mut crate :: fermented :: generics :: Arr_u8_4 } impl ferment :: FFIConversionFrom < dash_spv_crypto :: util :: params :: BIP32ScriptMap > for dash_spv_crypto_util_params_BIP32ScriptMap { unsafe fn ffi_from_const (ffi : * const dash_spv_crypto_util_params_BIP32ScriptMap) -> dash_spv_crypto :: util :: params :: BIP32ScriptMap { let ffi_ref = & * ffi ; dash_spv_crypto :: util :: params :: BIP32ScriptMap { xprv : < crate :: fermented :: generics :: Arr_u8_4 as ferment :: FFIConversionFrom < [u8 ; 4] >> :: ffi_from (ffi_ref . xprv) , xpub : < crate :: fermented :: generics :: Arr_u8_4 as ferment :: FFIConversionFrom < [u8 ; 4] >> :: ffi_from (ffi_ref . xpub) } } } impl ferment :: FFIConversionTo < dash_spv_crypto :: util :: params :: BIP32ScriptMap > for dash_spv_crypto_util_params_BIP32ScriptMap { unsafe fn ffi_to_const (obj : dash_spv_crypto :: util :: params :: BIP32ScriptMap) -> * const dash_spv_crypto_util_params_BIP32ScriptMap { ferment :: boxed (dash_spv_crypto_util_params_BIP32ScriptMap { xprv : < crate :: fermented :: generics :: Arr_u8_4 as ferment :: FFIConversionTo < [u8 ; 4] >> :: ffi_to (obj . xprv) , xpub : < crate :: fermented :: generics :: Arr_u8_4 as ferment :: FFIConversionTo < [u8 ; 4] >> :: ffi_to (obj . xpub) }) } } impl Drop for dash_spv_crypto_util_params_BIP32ScriptMap { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . xprv) ; ferment :: unbox_any (ffi_ref . xpub) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_BIP32ScriptMap_ctor < > (xprv : * mut crate :: fermented :: generics :: Arr_u8_4 , xpub : * mut crate :: fermented :: generics :: Arr_u8_4) -> * mut dash_spv_crypto_util_params_BIP32ScriptMap { ferment :: boxed (dash_spv_crypto_util_params_BIP32ScriptMap { xprv , xpub }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_BIP32ScriptMap_destroy < > (ffi : * mut dash_spv_crypto_util_params_BIP32ScriptMap) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_BIP32ScriptMap_get_xprv < > (obj : * const dash_spv_crypto_util_params_BIP32ScriptMap) -> * mut crate :: fermented :: generics :: Arr_u8_4 { (* obj) . xprv } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_BIP32ScriptMap_get_xpub < > (obj : * const dash_spv_crypto_util_params_BIP32ScriptMap) -> * mut crate :: fermented :: generics :: Arr_u8_4 { (* obj) . xpub } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_BIP32ScriptMap_set_xprv < > (obj : * const dash_spv_crypto_util_params_BIP32ScriptMap) -> * mut crate :: fermented :: generics :: Arr_u8_4 { (* obj) . xprv } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_util_params_BIP32ScriptMap_set_xpub < > (obj : * const dash_spv_crypto_util_params_BIP32ScriptMap) -> * mut crate :: fermented :: generics :: Arr_u8_4 { (* obj) . xpub } } pub mod base58 { use crate as dash_spv_apple_bindings ; } pub mod endian { use crate as dash_spv_apple_bindings ; } } # [doc = "FFI-representation of the [`dash_spv_crypto::blake3`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_blake3 (data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = dash_spv_crypto :: blake3 (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::x11`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_x11 (data : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = dash_spv_crypto :: x11 (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (data)))) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } pub mod network { use crate as dash_spv_apple_bindings ; pub mod chain_type { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::is_mainnet`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_is_mainnet (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> bool { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: is_mainnet (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::is_testnet`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_is_testnet (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> bool { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: is_testnet (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::is_devnet_any`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_is_devnet_any (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> bool { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: is_devnet_any (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::insight_url`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_insight_url (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: insight_url (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::user_agent`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_user_agent (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: user_agent (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::coin_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_coin_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u32 { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: coin_type (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::devnet_identifier`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_devnet_identifier (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: devnet_identifier (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::devnet_version`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_devnet_version (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> i16 { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: devnet_version (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::dns_seeds`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_dns_seeds (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: generics :: Vec_String { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: dns_seeds (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionTo < Vec < String > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::script_priv_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_script_priv_key (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u8 { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: script_priv_key (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::script_map`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_script_map (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: types :: dash_spv_crypto :: util :: params :: dash_spv_crypto_util_params_ScriptMap { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: script_map (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: types :: dash_spv_crypto :: util :: params :: dash_spv_crypto_util_params_ScriptMap as ferment :: FFIConversionTo < dash_spv_crypto :: util :: params :: ScriptMap >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::bip32_script_map`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_bip32_script_map (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: types :: dash_spv_crypto :: util :: params :: dash_spv_crypto_util_params_BIP32ScriptMap { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: bip32_script_map (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: types :: dash_spv_crypto :: util :: params :: dash_spv_crypto_util_params_BIP32ScriptMap as ferment :: FFIConversionTo < dash_spv_crypto :: util :: params :: BIP32ScriptMap >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::dip14_script_map`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_dip14_script_map (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: types :: dash_spv_crypto :: util :: params :: dash_spv_crypto_util_params_DIP14ScriptMap { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: dip14_script_map (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: types :: dash_spv_crypto :: util :: params :: dash_spv_crypto_util_params_DIP14ScriptMap as ferment :: FFIConversionTo < dash_spv_crypto :: util :: params :: DIP14ScriptMap >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::from_magic`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_from_magic (magic : u32) -> * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: from_magic (magic) ; < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionTo < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::magic`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_magic (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u32 { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: magic (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::allow_min_difficulty_blocks`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_allow_min_difficulty_blocks (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> bool { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: allow_min_difficulty_blocks (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::max_proof_of_work`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_max_proof_of_work (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: max_proof_of_work (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::max_proof_of_work_target`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_max_proof_of_work_target (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u32 { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: max_proof_of_work_target (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::min_protocol_version`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_min_protocol_version (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u32 { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: min_protocol_version (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::protocol_version`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_protocol_version (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u32 { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: protocol_version (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::use_legacy_bls`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_use_legacy_bls (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> bool { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: use_legacy_bls (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::standard_port`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_standard_port (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u16 { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: standard_port (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::platform_port`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_platform_port (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u16 { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: platform_port (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::standard_dapi_grpc_port`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_standard_dapi_grpc_port (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u16 { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: standard_dapi_grpc_port (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::standard_dapi_jrpc_port`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_standard_dapi_jrpc_port (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u16 { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: standard_dapi_jrpc_port (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::localhost`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_localhost (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: localhost (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < dash_spv_apple_bindings :: custom :: std :: SocketAddr as ferment :: FFIConversionTo < std :: net :: SocketAddr >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::transaction_version`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_transaction_version (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u16 { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: transaction_version (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::base_reward`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_base_reward (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u64 { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: base_reward (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::magic_number`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_magic_number (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u64 { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: magic_number (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::header_max_amount`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_header_max_amount (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u64 { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: header_max_amount (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::spork_params`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_spork_params (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: types :: dash_spv_crypto :: util :: params :: dash_spv_crypto_util_params_SporkParams { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: spork_params (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: types :: dash_spv_crypto :: util :: params :: dash_spv_crypto_util_params_SporkParams as ferment :: FFIConversionTo < dash_spv_crypto :: util :: params :: SporkParams >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::peer_misbehaving_threshold`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_peer_misbehaving_threshold (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> usize { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: peer_misbehaving_threshold (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::core19_activation_height`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_core19_activation_height (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u32 { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: core19_activation_height (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::core20_activation_height`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_core20_activation_height (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u32 { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: core20_activation_height (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::core20_is_active_at`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_core20_is_active_at (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType , height : u32) -> bool { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: core20_is_active_at (& ferment :: FFIConversionFrom :: ffi_from (self_) , height) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::identifier`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_identifier (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: identifier (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_index (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u16 { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: index (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::devnet_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_devnet_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: devnet_type (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType as ferment :: FFIConversionTo < dash_spv_crypto :: network :: chain_type :: DevnetType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::unique_id`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_unique_id (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_crypto :: network :: chain_type :: ChainType :: unique_id (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [no_mangle] pub static dash_spv_crypto_network_chain_type_ChainType_dash_spv_crypto_network_chain_type_IHaveChainSettings : crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings_VTable = { # [no_mangle] unsafe extern "C" fn dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_ChainType_genesis_hash (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: genesis_hash (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: ChainType)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_ChainType_genesis_height (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> u32 { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: genesis_height (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: ChainType)) ; obj } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_ChainType_is_llmq_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: is_llmq_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: ChainType)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_ChainType_isd_llmq_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: isd_llmq_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: ChainType)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_ChainType_chain_locks_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: chain_locks_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: ChainType)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_ChainType_platform_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: platform_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: ChainType)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_ChainType_should_process_llmq_of_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings , llmq_type : * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType) -> bool { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: should_process_llmq_of_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: ChainType) , < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionFrom < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_from (llmq_type)) ; obj } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_ChainType_is_evolution_enabled (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> bool { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: is_evolution_enabled (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: ChainType)) ; obj } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_ChainType_name (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: name (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: ChainType)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings_VTable { genesis_hash : dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_ChainType_genesis_hash , genesis_height : dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_ChainType_genesis_height , is_llmq_type : dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_ChainType_is_llmq_type , isd_llmq_type : dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_ChainType_isd_llmq_type , chain_locks_type : dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_ChainType_chain_locks_type , platform_type : dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_ChainType_platform_type , should_process_llmq_of_type : dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_ChainType_should_process_llmq_of_type , is_evolution_enabled : dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_ChainType_is_evolution_enabled , name : dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_ChainType_name } } ; # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_as_crate_fermented_types_dash_spv_crypto_network_chain_type_dash_spv_crypto_network_chain_type_IHaveChainSettings (obj : * const dash_spv_crypto :: network :: chain_type :: ChainType) -> crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings { crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings { object : obj as * const () , vtable : & dash_spv_crypto_network_chain_type_ChainType_dash_spv_crypto_network_chain_type_IHaveChainSettings } } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_as_crate_fermented_types_dash_spv_crypto_network_chain_type_dash_spv_crypto_network_chain_type_IHaveChainSettings_destroy (obj : crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) { ferment :: unbox_any (obj . object as * mut dash_spv_crypto :: network :: chain_type :: ChainType) ; } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::genesis_hash`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_IHaveChainSettings_genesis_hash (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: genesis_hash (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: ChainType)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::genesis_hash`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_genesis_hash (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: genesis_hash (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::genesis_height`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_IHaveChainSettings_genesis_height (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> u32 { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: genesis_height (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: ChainType)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::genesis_height`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_genesis_height (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> u32 { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: genesis_height (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::is_llmq_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_IHaveChainSettings_is_llmq_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: is_llmq_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: ChainType)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::is_llmq_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_is_llmq_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: is_llmq_type (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::isd_llmq_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_IHaveChainSettings_isd_llmq_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: isd_llmq_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: ChainType)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::isd_llmq_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_isd_llmq_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: isd_llmq_type (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::chain_locks_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_IHaveChainSettings_chain_locks_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: chain_locks_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: ChainType)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::chain_locks_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_chain_locks_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: chain_locks_type (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::platform_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_IHaveChainSettings_platform_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: platform_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: ChainType)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::platform_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_platform_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: platform_type (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::should_process_llmq_of_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_IHaveChainSettings_should_process_llmq_of_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings , llmq_type : * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType) -> bool { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: should_process_llmq_of_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: ChainType) , < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionFrom < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_from (llmq_type)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::should_process_llmq_of_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_should_process_llmq_of_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType , llmq_type : * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType) -> bool { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: should_process_llmq_of_type (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionFrom < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_from (llmq_type)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::is_evolution_enabled`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_IHaveChainSettings_is_evolution_enabled (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> bool { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: is_evolution_enabled (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: ChainType)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::is_evolution_enabled`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_is_evolution_enabled (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> bool { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: is_evolution_enabled (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::name`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_IHaveChainSettings_name (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: name (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: ChainType)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::ChainType::name`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_name (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: network :: chain_type :: ChainType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: name (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DevnetType`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_crypto_network_chain_type_DevnetType { JackDaniels = 0 , Devnet333 = 1 , Chacha = 2 , Mojito = 3 , WhiteRussian = 4 , MiningTest = 5 , Mobile2 = 6 , Zero = 7 , Screwdriver = 8 , Absinthe = 9 , Bintang = 10 , DRA = 11 } impl ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: DevnetType > for dash_spv_crypto_network_chain_type_DevnetType { unsafe fn ffi_from_const (ffi : * const dash_spv_crypto_network_chain_type_DevnetType) -> dash_spv_crypto :: network :: chain_type :: DevnetType { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_crypto_network_chain_type_DevnetType :: JackDaniels => dash_spv_crypto :: network :: chain_type :: DevnetType :: JackDaniels , dash_spv_crypto_network_chain_type_DevnetType :: Devnet333 => dash_spv_crypto :: network :: chain_type :: DevnetType :: Devnet333 , dash_spv_crypto_network_chain_type_DevnetType :: Chacha => dash_spv_crypto :: network :: chain_type :: DevnetType :: Chacha , dash_spv_crypto_network_chain_type_DevnetType :: Mojito => dash_spv_crypto :: network :: chain_type :: DevnetType :: Mojito , dash_spv_crypto_network_chain_type_DevnetType :: WhiteRussian => dash_spv_crypto :: network :: chain_type :: DevnetType :: WhiteRussian , dash_spv_crypto_network_chain_type_DevnetType :: MiningTest => dash_spv_crypto :: network :: chain_type :: DevnetType :: MiningTest , dash_spv_crypto_network_chain_type_DevnetType :: Mobile2 => dash_spv_crypto :: network :: chain_type :: DevnetType :: Mobile2 , dash_spv_crypto_network_chain_type_DevnetType :: Zero => dash_spv_crypto :: network :: chain_type :: DevnetType :: Zero , dash_spv_crypto_network_chain_type_DevnetType :: Screwdriver => dash_spv_crypto :: network :: chain_type :: DevnetType :: Screwdriver , dash_spv_crypto_network_chain_type_DevnetType :: Absinthe => dash_spv_crypto :: network :: chain_type :: DevnetType :: Absinthe , dash_spv_crypto_network_chain_type_DevnetType :: Bintang => dash_spv_crypto :: network :: chain_type :: DevnetType :: Bintang , dash_spv_crypto_network_chain_type_DevnetType :: DRA => dash_spv_crypto :: network :: chain_type :: DevnetType :: DRA } } } impl ferment :: FFIConversionTo < dash_spv_crypto :: network :: chain_type :: DevnetType > for dash_spv_crypto_network_chain_type_DevnetType { unsafe fn ffi_to_const (obj : dash_spv_crypto :: network :: chain_type :: DevnetType) -> * const dash_spv_crypto_network_chain_type_DevnetType { ferment :: boxed (match obj { dash_spv_crypto :: network :: chain_type :: DevnetType :: JackDaniels => dash_spv_crypto_network_chain_type_DevnetType :: JackDaniels , dash_spv_crypto :: network :: chain_type :: DevnetType :: Devnet333 => dash_spv_crypto_network_chain_type_DevnetType :: Devnet333 , dash_spv_crypto :: network :: chain_type :: DevnetType :: Chacha => dash_spv_crypto_network_chain_type_DevnetType :: Chacha , dash_spv_crypto :: network :: chain_type :: DevnetType :: Mojito => dash_spv_crypto_network_chain_type_DevnetType :: Mojito , dash_spv_crypto :: network :: chain_type :: DevnetType :: WhiteRussian => dash_spv_crypto_network_chain_type_DevnetType :: WhiteRussian , dash_spv_crypto :: network :: chain_type :: DevnetType :: MiningTest => dash_spv_crypto_network_chain_type_DevnetType :: MiningTest , dash_spv_crypto :: network :: chain_type :: DevnetType :: Mobile2 => dash_spv_crypto_network_chain_type_DevnetType :: Mobile2 , dash_spv_crypto :: network :: chain_type :: DevnetType :: Zero => dash_spv_crypto_network_chain_type_DevnetType :: Zero , dash_spv_crypto :: network :: chain_type :: DevnetType :: Screwdriver => dash_spv_crypto_network_chain_type_DevnetType :: Screwdriver , dash_spv_crypto :: network :: chain_type :: DevnetType :: Absinthe => dash_spv_crypto_network_chain_type_DevnetType :: Absinthe , dash_spv_crypto :: network :: chain_type :: DevnetType :: Bintang => dash_spv_crypto_network_chain_type_DevnetType :: Bintang , dash_spv_crypto :: network :: chain_type :: DevnetType :: DRA => dash_spv_crypto_network_chain_type_DevnetType :: DRA , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_crypto_network_chain_type_DevnetType { fn drop (& mut self) { unsafe { match self { dash_spv_crypto_network_chain_type_DevnetType :: JackDaniels => { } , dash_spv_crypto_network_chain_type_DevnetType :: Devnet333 => { } , dash_spv_crypto_network_chain_type_DevnetType :: Chacha => { } , dash_spv_crypto_network_chain_type_DevnetType :: Mojito => { } , dash_spv_crypto_network_chain_type_DevnetType :: WhiteRussian => { } , dash_spv_crypto_network_chain_type_DevnetType :: MiningTest => { } , dash_spv_crypto_network_chain_type_DevnetType :: Mobile2 => { } , dash_spv_crypto_network_chain_type_DevnetType :: Zero => { } , dash_spv_crypto_network_chain_type_DevnetType :: Screwdriver => { } , dash_spv_crypto_network_chain_type_DevnetType :: Absinthe => { } , dash_spv_crypto_network_chain_type_DevnetType :: Bintang => { } , dash_spv_crypto_network_chain_type_DevnetType :: DRA => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_JackDaniels_ctor () -> * mut dash_spv_crypto_network_chain_type_DevnetType { ferment :: boxed (dash_spv_crypto_network_chain_type_DevnetType :: JackDaniels { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_Devnet333_ctor () -> * mut dash_spv_crypto_network_chain_type_DevnetType { ferment :: boxed (dash_spv_crypto_network_chain_type_DevnetType :: Devnet333 { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_Chacha_ctor () -> * mut dash_spv_crypto_network_chain_type_DevnetType { ferment :: boxed (dash_spv_crypto_network_chain_type_DevnetType :: Chacha { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_Mojito_ctor () -> * mut dash_spv_crypto_network_chain_type_DevnetType { ferment :: boxed (dash_spv_crypto_network_chain_type_DevnetType :: Mojito { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_WhiteRussian_ctor () -> * mut dash_spv_crypto_network_chain_type_DevnetType { ferment :: boxed (dash_spv_crypto_network_chain_type_DevnetType :: WhiteRussian { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_MiningTest_ctor () -> * mut dash_spv_crypto_network_chain_type_DevnetType { ferment :: boxed (dash_spv_crypto_network_chain_type_DevnetType :: MiningTest { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_Mobile2_ctor () -> * mut dash_spv_crypto_network_chain_type_DevnetType { ferment :: boxed (dash_spv_crypto_network_chain_type_DevnetType :: Mobile2 { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_Zero_ctor () -> * mut dash_spv_crypto_network_chain_type_DevnetType { ferment :: boxed (dash_spv_crypto_network_chain_type_DevnetType :: Zero { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_Screwdriver_ctor () -> * mut dash_spv_crypto_network_chain_type_DevnetType { ferment :: boxed (dash_spv_crypto_network_chain_type_DevnetType :: Screwdriver { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_Absinthe_ctor () -> * mut dash_spv_crypto_network_chain_type_DevnetType { ferment :: boxed (dash_spv_crypto_network_chain_type_DevnetType :: Absinthe { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_Bintang_ctor () -> * mut dash_spv_crypto_network_chain_type_DevnetType { ferment :: boxed (dash_spv_crypto_network_chain_type_DevnetType :: Bintang { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_DRA_ctor () -> * mut dash_spv_crypto_network_chain_type_DevnetType { ferment :: boxed (dash_spv_crypto_network_chain_type_DevnetType :: DRA { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_destroy < > (ffi : * mut dash_spv_crypto_network_chain_type_DevnetType) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct dash_spv_crypto_network_chain_type_IHaveChainSettings_VTable { # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::IHaveChainSettings::genesis_hash`]"] pub genesis_hash : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: generics :: Arr_u8_32 , # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::IHaveChainSettings::genesis_height`]"] pub genesis_height : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> u32 , # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::IHaveChainSettings::is_llmq_type`]"] pub is_llmq_type : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType , # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::IHaveChainSettings::isd_llmq_type`]"] pub isd_llmq_type : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType , # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::IHaveChainSettings::chain_locks_type`]"] pub chain_locks_type : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType , # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::IHaveChainSettings::platform_type`]"] pub platform_type : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType , # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::IHaveChainSettings::should_process_llmq_of_type`]"] pub should_process_llmq_of_type : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings , llmq_type : * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType) -> bool , # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::IHaveChainSettings::is_evolution_enabled`]"] pub is_evolution_enabled : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> bool , # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::IHaveChainSettings::name`]"] pub name : unsafe extern "C" fn (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut std :: os :: raw :: c_char } # [repr (C)] # [derive (Clone)] pub struct dash_spv_crypto_network_chain_type_IHaveChainSettings { object : * const () , vtable : * const dash_spv_crypto_network_chain_type_IHaveChainSettings_VTable } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::identifier`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_identifier (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_crypto :: network :: chain_type :: DevnetType :: identifier (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::version`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_version (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType) -> u16 { let obj = dash_spv_crypto :: network :: chain_type :: DevnetType :: version (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_index (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType) -> u16 { let obj = dash_spv_crypto :: network :: chain_type :: DevnetType :: index (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ChainType`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_crypto_network_chain_type_ChainType { MainNet , TestNet , DevNet (* mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType) } impl ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType > for dash_spv_crypto_network_chain_type_ChainType { unsafe fn ffi_from_const (ffi : * const dash_spv_crypto_network_chain_type_ChainType) -> dash_spv_crypto :: network :: chain_type :: ChainType { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_crypto_network_chain_type_ChainType :: MainNet => dash_spv_crypto :: network :: chain_type :: ChainType :: MainNet , dash_spv_crypto_network_chain_type_ChainType :: TestNet => dash_spv_crypto :: network :: chain_type :: ChainType :: TestNet , dash_spv_crypto_network_chain_type_ChainType :: DevNet (o_0) => dash_spv_crypto :: network :: chain_type :: ChainType :: DevNet (< crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: DevnetType >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dash_spv_crypto :: network :: chain_type :: ChainType > for dash_spv_crypto_network_chain_type_ChainType { unsafe fn ffi_to_const (obj : dash_spv_crypto :: network :: chain_type :: ChainType) -> * const dash_spv_crypto_network_chain_type_ChainType { ferment :: boxed (match obj { dash_spv_crypto :: network :: chain_type :: ChainType :: MainNet => dash_spv_crypto_network_chain_type_ChainType :: MainNet , dash_spv_crypto :: network :: chain_type :: ChainType :: TestNet => dash_spv_crypto_network_chain_type_ChainType :: TestNet , dash_spv_crypto :: network :: chain_type :: ChainType :: DevNet (o_0) => dash_spv_crypto_network_chain_type_ChainType :: DevNet (< crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType as ferment :: FFIConversionTo < dash_spv_crypto :: network :: chain_type :: DevnetType >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_crypto_network_chain_type_ChainType { fn drop (& mut self) { unsafe { match self { dash_spv_crypto_network_chain_type_ChainType :: MainNet => { } , dash_spv_crypto_network_chain_type_ChainType :: TestNet => { } , dash_spv_crypto_network_chain_type_ChainType :: DevNet (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_MainNet_ctor () -> * mut dash_spv_crypto_network_chain_type_ChainType { ferment :: boxed (dash_spv_crypto_network_chain_type_ChainType :: MainNet { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_TestNet_ctor () -> * mut dash_spv_crypto_network_chain_type_ChainType { ferment :: boxed (dash_spv_crypto_network_chain_type_ChainType :: TestNet { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_DevNet_ctor (o_o_0 : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType) -> * mut dash_spv_crypto_network_chain_type_ChainType { ferment :: boxed (dash_spv_crypto_network_chain_type_ChainType :: DevNet (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_ChainType_destroy < > (ffi : * mut dash_spv_crypto_network_chain_type_ChainType) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::devnet_type_from_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_devnet_type_from_index (index : u16) -> * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType { let obj = dash_spv_crypto :: network :: chain_type :: devnet_type_from_index (index) ; < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType as ferment :: FFIConversionTo < dash_spv_crypto :: network :: chain_type :: DevnetType >> :: ffi_to (obj) } # [no_mangle] pub static dash_spv_crypto_network_chain_type_DevnetType_dash_spv_crypto_network_chain_type_IHaveChainSettings : crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings_VTable = { # [no_mangle] unsafe extern "C" fn dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_DevnetType_genesis_hash (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: genesis_hash (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: DevnetType)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_DevnetType_genesis_height (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> u32 { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: genesis_height (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: DevnetType)) ; obj } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_DevnetType_is_llmq_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: is_llmq_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: DevnetType)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_DevnetType_isd_llmq_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: isd_llmq_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: DevnetType)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_DevnetType_chain_locks_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: chain_locks_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: DevnetType)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_DevnetType_platform_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: platform_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: DevnetType)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_DevnetType_should_process_llmq_of_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings , llmq_type : * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType) -> bool { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: should_process_llmq_of_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: DevnetType) , < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionFrom < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_from (llmq_type)) ; obj } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_DevnetType_is_evolution_enabled (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> bool { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: is_evolution_enabled (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: DevnetType)) ; obj } # [no_mangle] unsafe extern "C" fn dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_DevnetType_name (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: name (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: DevnetType)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings_VTable { genesis_hash : dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_DevnetType_genesis_hash , genesis_height : dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_DevnetType_genesis_height , is_llmq_type : dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_DevnetType_is_llmq_type , isd_llmq_type : dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_DevnetType_isd_llmq_type , chain_locks_type : dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_DevnetType_chain_locks_type , platform_type : dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_DevnetType_platform_type , should_process_llmq_of_type : dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_DevnetType_should_process_llmq_of_type , is_evolution_enabled : dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_DevnetType_is_evolution_enabled , name : dash_spv_crypto_network_chain_type_IHaveChainSettings_dash_spv_crypto_network_chain_type_DevnetType_name } } ; # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_as_crate_fermented_types_dash_spv_crypto_network_chain_type_dash_spv_crypto_network_chain_type_IHaveChainSettings (obj : * const dash_spv_crypto :: network :: chain_type :: DevnetType) -> crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings { crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings { object : obj as * const () , vtable : & dash_spv_crypto_network_chain_type_DevnetType_dash_spv_crypto_network_chain_type_IHaveChainSettings } } # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_as_crate_fermented_types_dash_spv_crypto_network_chain_type_dash_spv_crypto_network_chain_type_IHaveChainSettings_destroy (obj : crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) { ferment :: unbox_any (obj . object as * mut dash_spv_crypto :: network :: chain_type :: DevnetType) ; } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::genesis_hash`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_IHaveChainSettings_genesis_hash (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: genesis_hash (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: DevnetType)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::genesis_hash`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_genesis_hash (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: genesis_hash (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::genesis_height`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_IHaveChainSettings_genesis_height (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> u32 { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: genesis_height (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: DevnetType)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::genesis_height`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_genesis_height (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType) -> u32 { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: genesis_height (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::is_llmq_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_IHaveChainSettings_is_llmq_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: is_llmq_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: DevnetType)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::is_llmq_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_is_llmq_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: is_llmq_type (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::isd_llmq_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_IHaveChainSettings_isd_llmq_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: isd_llmq_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: DevnetType)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::isd_llmq_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_isd_llmq_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: isd_llmq_type (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::chain_locks_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_IHaveChainSettings_chain_locks_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: chain_locks_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: DevnetType)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::chain_locks_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_chain_locks_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: chain_locks_type (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::platform_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_IHaveChainSettings_platform_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: platform_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: DevnetType)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::platform_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_platform_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType) -> * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: platform_type (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionTo < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::should_process_llmq_of_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_IHaveChainSettings_should_process_llmq_of_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings , llmq_type : * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType) -> bool { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: should_process_llmq_of_type (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: DevnetType) , < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionFrom < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_from (llmq_type)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::should_process_llmq_of_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_should_process_llmq_of_type (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType , llmq_type : * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType) -> bool { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: should_process_llmq_of_type (& ferment :: FFIConversionFrom :: ffi_from (self_) , < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionFrom < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_from (llmq_type)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::is_evolution_enabled`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_IHaveChainSettings_is_evolution_enabled (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> bool { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: is_evolution_enabled (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: DevnetType)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::is_evolution_enabled`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_is_evolution_enabled (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType) -> bool { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: is_evolution_enabled (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::name`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_IHaveChainSettings_name (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_IHaveChainSettings) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: name (& * ((* self_) . object as * const dash_spv_crypto :: network :: chain_type :: DevnetType)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::DevnetType::name`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_DevnetType_name (self_ : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType) -> * mut std :: os :: raw :: c_char { let obj = < dash_spv_crypto :: network :: chain_type :: DevnetType as dash_spv_crypto :: network :: chain_type :: IHaveChainSettings > :: name (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::chain_type_from_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_chain_type_from_index (index : u16) -> * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType { let obj = dash_spv_crypto :: network :: chain_type :: chain_type_from_index (index) ; < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionTo < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_crypto::network::chain_type::devnet_type_from_identifier`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_network_chain_type_devnet_type_from_identifier (identifier : * mut std :: os :: raw :: c_char) -> * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType { let obj = dash_spv_crypto :: network :: chain_type :: devnet_type_from_identifier (Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (identifier)))) ; < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_DevnetType as ferment :: FFIConversionTo < dash_spv_crypto :: network :: chain_type :: DevnetType >> :: ffi_to (obj) } } } pub mod bip { use crate as dash_spv_apple_bindings ; pub mod bip38 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_crypto::bip::bip38::is_valid_payment_request_address`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_bip_bip38_is_valid_payment_request_address (key : * mut std :: os :: raw :: c_char , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> bool { let obj = dash_spv_crypto :: bip :: bip38 :: is_valid_payment_request_address (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (key) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; obj } # [doc = "FFI-representation of the [`dash_spv_crypto::bip::bip38::is_valid_bip38_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_crypto_bip_bip38_is_valid_bip38_key (key : * mut std :: os :: raw :: c_char) -> bool { let obj = dash_spv_crypto :: bip :: bip38 :: is_valid_bip38_key (Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (key)))) ; obj } } } } pub mod dash_spv_masternode_processor { use crate as dash_spv_apple_bindings ; pub mod models { use crate as dash_spv_apple_bindings ; pub mod sync_state { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`CacheState`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_masternode_processor_models_sync_state_CacheState { QueueChanged { count : usize , max_amount : usize } , StoreChanged { count : usize , last_block_height : u32 } , StubCount { count : usize } } impl ferment :: FFIConversionFrom < dash_spv_masternode_processor :: models :: sync_state :: CacheState > for dash_spv_masternode_processor_models_sync_state_CacheState { unsafe fn ffi_from_const (ffi : * const dash_spv_masternode_processor_models_sync_state_CacheState) -> dash_spv_masternode_processor :: models :: sync_state :: CacheState { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_masternode_processor_models_sync_state_CacheState :: QueueChanged { count , max_amount } => dash_spv_masternode_processor :: models :: sync_state :: CacheState :: QueueChanged { count : * count , max_amount : * max_amount } , dash_spv_masternode_processor_models_sync_state_CacheState :: StoreChanged { count , last_block_height } => dash_spv_masternode_processor :: models :: sync_state :: CacheState :: StoreChanged { count : * count , last_block_height : * last_block_height } , dash_spv_masternode_processor_models_sync_state_CacheState :: StubCount { count } => dash_spv_masternode_processor :: models :: sync_state :: CacheState :: StubCount { count : * count } } } } impl ferment :: FFIConversionTo < dash_spv_masternode_processor :: models :: sync_state :: CacheState > for dash_spv_masternode_processor_models_sync_state_CacheState { unsafe fn ffi_to_const (obj : dash_spv_masternode_processor :: models :: sync_state :: CacheState) -> * const dash_spv_masternode_processor_models_sync_state_CacheState { ferment :: boxed (match obj { dash_spv_masternode_processor :: models :: sync_state :: CacheState :: QueueChanged { count , max_amount } => dash_spv_masternode_processor_models_sync_state_CacheState :: QueueChanged { count : count , max_amount : max_amount } , dash_spv_masternode_processor :: models :: sync_state :: CacheState :: StoreChanged { count , last_block_height } => dash_spv_masternode_processor_models_sync_state_CacheState :: StoreChanged { count : count , last_block_height : last_block_height } , dash_spv_masternode_processor :: models :: sync_state :: CacheState :: StubCount { count } => dash_spv_masternode_processor_models_sync_state_CacheState :: StubCount { count : count } , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_masternode_processor_models_sync_state_CacheState { fn drop (& mut self) { unsafe { match self { dash_spv_masternode_processor_models_sync_state_CacheState :: QueueChanged { count , max_amount } => { ; ; ; } , dash_spv_masternode_processor_models_sync_state_CacheState :: StoreChanged { count , last_block_height } => { ; ; ; } , dash_spv_masternode_processor_models_sync_state_CacheState :: StubCount { count } => { ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_models_sync_state_CacheState_QueueChanged_ctor (count : usize , max_amount : usize) -> * mut dash_spv_masternode_processor_models_sync_state_CacheState { ferment :: boxed (dash_spv_masternode_processor_models_sync_state_CacheState :: QueueChanged { count , max_amount }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_models_sync_state_CacheState_StoreChanged_ctor (count : usize , last_block_height : u32) -> * mut dash_spv_masternode_processor_models_sync_state_CacheState { ferment :: boxed (dash_spv_masternode_processor_models_sync_state_CacheState :: StoreChanged { count , last_block_height }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_models_sync_state_CacheState_StubCount_ctor (count : usize) -> * mut dash_spv_masternode_processor_models_sync_state_CacheState { ferment :: boxed (dash_spv_masternode_processor_models_sync_state_CacheState :: StubCount { count }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_models_sync_state_CacheState_destroy < > (ffi : * mut dash_spv_masternode_processor_models_sync_state_CacheState) { ferment :: unbox_any (ffi) ; } } } pub mod common { use crate as dash_spv_apple_bindings ; pub mod block { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MBlock`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_masternode_processor_common_block_MBlock { pub height : u32 , pub hash : * mut crate :: fermented :: generics :: Arr_u8_32 , pub merkle_root : * mut crate :: fermented :: generics :: Arr_u8_32 } impl ferment :: FFIConversionFrom < dash_spv_masternode_processor :: common :: block :: MBlock > for dash_spv_masternode_processor_common_block_MBlock { unsafe fn ffi_from_const (ffi : * const dash_spv_masternode_processor_common_block_MBlock) -> dash_spv_masternode_processor :: common :: block :: MBlock { let ffi_ref = & * ffi ; dash_spv_masternode_processor :: common :: block :: MBlock { height : ffi_ref . height , hash : < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (ffi_ref . hash) , merkle_root : < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (ffi_ref . merkle_root) } } } impl ferment :: FFIConversionTo < dash_spv_masternode_processor :: common :: block :: MBlock > for dash_spv_masternode_processor_common_block_MBlock { unsafe fn ffi_to_const (obj : dash_spv_masternode_processor :: common :: block :: MBlock) -> * const dash_spv_masternode_processor_common_block_MBlock { ferment :: boxed (dash_spv_masternode_processor_common_block_MBlock { height : obj . height , hash : < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj . hash) , merkle_root : < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj . merkle_root) }) } } impl Drop for dash_spv_masternode_processor_common_block_MBlock { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . hash) ; ferment :: unbox_any (ffi_ref . merkle_root) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_common_block_MBlock_ctor < > (height : u32 , hash : * mut crate :: fermented :: generics :: Arr_u8_32 , merkle_root : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut dash_spv_masternode_processor_common_block_MBlock { ferment :: boxed (dash_spv_masternode_processor_common_block_MBlock { height , hash , merkle_root }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_common_block_MBlock_destroy < > (ffi : * mut dash_spv_masternode_processor_common_block_MBlock) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_common_block_MBlock_get_height < > (obj : * const dash_spv_masternode_processor_common_block_MBlock) -> u32 { (* obj) . height } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_common_block_MBlock_get_hash < > (obj : * const dash_spv_masternode_processor_common_block_MBlock) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . hash } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_common_block_MBlock_get_merkle_root < > (obj : * const dash_spv_masternode_processor_common_block_MBlock) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . merkle_root } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_common_block_MBlock_set_height < > (obj : * const dash_spv_masternode_processor_common_block_MBlock) -> u32 { (* obj) . height } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_common_block_MBlock_set_hash < > (obj : * const dash_spv_masternode_processor_common_block_MBlock) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . hash } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_common_block_MBlock_set_merkle_root < > (obj : * const dash_spv_masternode_processor_common_block_MBlock) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . merkle_root } # [doc = "FFI-representation of the [`Block`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_masternode_processor_common_block_Block { pub height : u32 , pub hash : * mut crate :: fermented :: generics :: Arr_u8_32 } impl ferment :: FFIConversionFrom < dash_spv_masternode_processor :: common :: block :: Block > for dash_spv_masternode_processor_common_block_Block { unsafe fn ffi_from_const (ffi : * const dash_spv_masternode_processor_common_block_Block) -> dash_spv_masternode_processor :: common :: block :: Block { let ffi_ref = & * ffi ; dash_spv_masternode_processor :: common :: block :: Block { height : ffi_ref . height , hash : < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (ffi_ref . hash) } } } impl ferment :: FFIConversionTo < dash_spv_masternode_processor :: common :: block :: Block > for dash_spv_masternode_processor_common_block_Block { unsafe fn ffi_to_const (obj : dash_spv_masternode_processor :: common :: block :: Block) -> * const dash_spv_masternode_processor_common_block_Block { ferment :: boxed (dash_spv_masternode_processor_common_block_Block { height : obj . height , hash : < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj . hash) }) } } impl Drop for dash_spv_masternode_processor_common_block_Block { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . hash) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_common_block_Block_ctor < > (height : u32 , hash : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut dash_spv_masternode_processor_common_block_Block { ferment :: boxed (dash_spv_masternode_processor_common_block_Block { height , hash }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_common_block_Block_destroy < > (ffi : * mut dash_spv_masternode_processor_common_block_Block) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_common_block_Block_get_height < > (obj : * const dash_spv_masternode_processor_common_block_Block) -> u32 { (* obj) . height } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_common_block_Block_get_hash < > (obj : * const dash_spv_masternode_processor_common_block_Block) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . hash } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_common_block_Block_set_height < > (obj : * const dash_spv_masternode_processor_common_block_Block) -> u32 { (* obj) . height } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_common_block_Block_set_hash < > (obj : * const dash_spv_masternode_processor_common_block_Block) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . hash } } } pub mod tests { use crate as dash_spv_apple_bindings ; # [cfg (test)] pub mod listdiff { use crate as dash_spv_apple_bindings ; } # [cfg (test)] pub mod indexes { use crate as dash_spv_apple_bindings ; } # [cfg (test)] pub mod hashes { use crate as dash_spv_apple_bindings ; } # [cfg (test)] pub mod keys { use crate as dash_spv_apple_bindings ; } } pub mod util { use crate as dash_spv_apple_bindings ; } pub mod processing { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::instant_lock_outpoint_at_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_instant_lock_outpoint_at_index (lock : * mut crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock , index : usize) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint { let obj = dash_spv_masternode_processor :: processing :: instant_lock_outpoint_at_index (Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock as ferment :: FFIConversionFrom < dashcore :: ephemerealdata :: instant_lock :: InstantLock >> :: ffi_from (lock))) , index) ; < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::socket_addr_ip`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_socket_addr_ip (socket_addr : * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr) -> * mut crate :: fermented :: generics :: Arr_u8_16 { let obj = dash_spv_masternode_processor :: processing :: socket_addr_ip (< dash_spv_apple_bindings :: custom :: std :: SocketAddr as ferment :: FFIConversionFrom < std :: net :: SocketAddr >> :: ffi_from (socket_addr)) ; < crate :: fermented :: generics :: Arr_u8_16 as ferment :: FFIConversionTo < [u8 ; 16] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::chain_lock_block_hash`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_chain_lock_block_hash (chain_lock : * mut crate :: fermented :: types :: dashcore :: ephemerealdata :: chain_lock :: dashcore_ephemerealdata_chain_lock_ChainLock) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = dash_spv_masternode_processor :: processing :: chain_lock_block_hash (Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: ephemerealdata :: chain_lock :: dashcore_ephemerealdata_chain_lock_ChainLock as ferment :: FFIConversionFrom < dashcore :: ephemerealdata :: chain_lock :: ChainLock >> :: ffi_from (chain_lock)))) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::voting_address`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_voting_address (key_id_voting : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_masternode_processor :: processing :: voting_address (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: PubkeyHash >> :: ffi_from (key_id_voting) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::outpoint_from_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_outpoint_from_message (message : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint { let obj = dash_spv_masternode_processor :: processing :: outpoint_from_message (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message)))) ; < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::socket_addr_port`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_socket_addr_port (socket_addr : * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr) -> u16 { let obj = dash_spv_masternode_processor :: processing :: socket_addr_port (< dash_spv_apple_bindings :: custom :: std :: SocketAddr as ferment :: FFIConversionFrom < std :: net :: SocketAddr >> :: ffi_from (socket_addr)) ; obj } pub mod core_provider { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`CoreProviderError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_masternode_processor_processing_core_provider_CoreProviderError { NullResult (* mut std :: os :: raw :: c_char) , BadBlockHash (* mut crate :: fermented :: generics :: Arr_u8_32) , UnknownBlockHeightForHash (* mut crate :: fermented :: generics :: Arr_u8_32) , BlockHashNotFoundAt (u32) , NoSnapshot (* mut crate :: fermented :: generics :: Arr_u8_32) , HexError (* mut dash_spv_apple_bindings :: custom :: dashcore :: hashes_hex_Error_FFI) , MissedMasternodeListAt (* mut crate :: fermented :: generics :: Arr_u8_32) } impl ferment :: FFIConversionFrom < dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError > for dash_spv_masternode_processor_processing_core_provider_CoreProviderError { unsafe fn ffi_from_const (ffi : * const dash_spv_masternode_processor_processing_core_provider_CoreProviderError) -> dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: NullResult (o_0) => dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError :: NullResult (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: BadBlockHash (o_0) => dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError :: BadBlockHash (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (* o_0)) , dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: UnknownBlockHeightForHash (o_0) => dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError :: UnknownBlockHeightForHash (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (* o_0)) , dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: BlockHashNotFoundAt (o_0) => dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError :: BlockHashNotFoundAt (* o_0) , dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: NoSnapshot (o_0) => dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError :: NoSnapshot (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (* o_0)) , dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: HexError (o_0) => dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError :: HexError (< dash_spv_apple_bindings :: custom :: dashcore :: hashes_hex_Error_FFI as ferment :: FFIConversionFrom < dashcore :: hashes :: hex :: Error >> :: ffi_from (* o_0)) , dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: MissedMasternodeListAt (o_0) => dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError :: MissedMasternodeListAt (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError > for dash_spv_masternode_processor_processing_core_provider_CoreProviderError { unsafe fn ffi_to_const (obj : dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError) -> * const dash_spv_masternode_processor_processing_core_provider_CoreProviderError { ferment :: boxed (match obj { dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError :: NullResult (o_0) => dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: NullResult (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError :: BadBlockHash (o_0) => dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: BadBlockHash (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (o_0)) , dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError :: UnknownBlockHeightForHash (o_0) => dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: UnknownBlockHeightForHash (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (o_0)) , dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError :: BlockHashNotFoundAt (o_0) => dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: BlockHashNotFoundAt (o_0) , dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError :: NoSnapshot (o_0) => dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: NoSnapshot (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (o_0)) , dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError :: HexError (o_0) => dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: HexError (< dash_spv_apple_bindings :: custom :: dashcore :: hashes_hex_Error_FFI as ferment :: FFIConversionTo < dashcore :: hashes :: hex :: Error >> :: ffi_to (o_0)) , dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError :: MissedMasternodeListAt (o_0) => dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: MissedMasternodeListAt (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_masternode_processor_processing_core_provider_CoreProviderError { fn drop (& mut self) { unsafe { match self { dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: NullResult (o_0) => { ferment :: unbox_string (* o_0) ; } , dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: BadBlockHash (o_0) => { ferment :: unbox_any (* o_0) ; } , dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: UnknownBlockHeightForHash (o_0) => { ferment :: unbox_any (* o_0) ; } , dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: BlockHashNotFoundAt (o_0) => { ; } , dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: NoSnapshot (o_0) => { ferment :: unbox_any (* o_0) ; } , dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: HexError (o_0) => { ferment :: unbox_any (* o_0) ; } , dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: MissedMasternodeListAt (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_core_provider_CoreProviderError_NullResult_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dash_spv_masternode_processor_processing_core_provider_CoreProviderError { ferment :: boxed (dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: NullResult (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_core_provider_CoreProviderError_BadBlockHash_ctor (o_o_0 : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut dash_spv_masternode_processor_processing_core_provider_CoreProviderError { ferment :: boxed (dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: BadBlockHash (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_core_provider_CoreProviderError_UnknownBlockHeightForHash_ctor (o_o_0 : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut dash_spv_masternode_processor_processing_core_provider_CoreProviderError { ferment :: boxed (dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: UnknownBlockHeightForHash (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_core_provider_CoreProviderError_BlockHashNotFoundAt_ctor (o_o_0 : u32) -> * mut dash_spv_masternode_processor_processing_core_provider_CoreProviderError { ferment :: boxed (dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: BlockHashNotFoundAt (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_core_provider_CoreProviderError_NoSnapshot_ctor (o_o_0 : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut dash_spv_masternode_processor_processing_core_provider_CoreProviderError { ferment :: boxed (dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: NoSnapshot (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_core_provider_CoreProviderError_HexError_ctor (o_o_0 : * mut dash_spv_apple_bindings :: custom :: dashcore :: hashes_hex_Error_FFI) -> * mut dash_spv_masternode_processor_processing_core_provider_CoreProviderError { ferment :: boxed (dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: HexError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_core_provider_CoreProviderError_MissedMasternodeListAt_ctor (o_o_0 : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut dash_spv_masternode_processor_processing_core_provider_CoreProviderError { ferment :: boxed (dash_spv_masternode_processor_processing_core_provider_CoreProviderError :: MissedMasternodeListAt (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_core_provider_CoreProviderError_destroy < > (ffi : * mut dash_spv_masternode_processor_processing_core_provider_CoreProviderError) { ferment :: unbox_any (ffi) ; } } pub mod processor { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::clear`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_clear (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor) { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: clear (& mut * self_) ; ; } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::current_masternode_list`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_current_masternode_list (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor) -> * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list :: dashcore_sml_masternode_list_MasternodeList { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: current_masternode_list (& * self_) ; < crate :: fermented :: types :: dashcore :: sml :: masternode_list :: dashcore_sml_masternode_list_MasternodeList as ferment :: FFIConversionTo < dashcore :: sml :: masternode_list :: MasternodeList >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::known_masternode_lists_count`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_known_masternode_lists_count (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor) -> usize { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: known_masternode_lists_count (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::has_current_masternode_list`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_has_current_masternode_list (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor) -> bool { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: has_current_masternode_list (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::valid_masternodes_count`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_valid_masternodes_count (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor) -> usize { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: valid_masternodes_count (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::masternode_list_for_block_hash`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_masternode_list_for_block_hash (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor , block_hash : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list :: dashcore_sml_masternode_list_MasternodeList { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: masternode_list_for_block_hash (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (block_hash)) ; < crate :: fermented :: types :: dashcore :: sml :: masternode_list :: dashcore_sml_masternode_list_MasternodeList as ferment :: FFIConversionTo < dashcore :: sml :: masternode_list :: MasternodeList >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::has_masternode_at_location`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_has_masternode_at_location (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor , address : * mut crate :: fermented :: generics :: Arr_u8_16 , port : u16) -> bool { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: has_masternode_at_location (& * self_ , < crate :: fermented :: generics :: Arr_u8_16 as ferment :: FFIConversionFrom < [u8 ; 16] >> :: ffi_from (address) , port) ; obj } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::masternode_at_location`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_masternode_at_location (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor , location : * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr) -> * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: masternode_at_location (& * self_ , < dash_spv_apple_bindings :: custom :: std :: SocketAddr as ferment :: FFIConversionFrom < std :: net :: SocketAddr >> :: ffi_from (location)) ; < crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry as ferment :: FFIConversionTo < dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::current_masternode_list_masternode_with_pro_reg_tx_hash`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_current_masternode_list_masternode_with_pro_reg_tx_hash (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor , hash : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash) -> * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: current_masternode_list_masternode_with_pro_reg_tx_hash (& * self_ , Box :: leak (Box :: new (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: ProTxHash >> :: ffi_from (hash)))) ; < crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry as ferment :: FFIConversionTo < dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::current_masternode_list_height`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_current_masternode_list_height (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor) -> u32 { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: current_masternode_list_height (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::current_masternode_list_masternode_count`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_current_masternode_list_masternode_count (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor) -> usize { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: current_masternode_list_masternode_count (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::current_masternode_list_quorum_count`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_current_masternode_list_quorum_count (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor) -> usize { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: current_masternode_list_quorum_count (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::closest_known_masternode_list_block_hash`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_closest_known_masternode_list_block_hash (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor , core_block_height : u32) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: closest_known_masternode_list_block_hash (& * self_ , core_block_height) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::masternode_lists`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_masternode_lists (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dashcore_prelude_CoreBlockHeight_values_dashcore_sml_masternode_list_MasternodeList { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: masternode_lists (& * self_) ; < crate :: fermented :: generics :: std_collections_Map_keys_dashcore_prelude_CoreBlockHeight_values_dashcore_sml_masternode_list_MasternodeList as ferment :: FFIConversionTo < std :: collections :: BTreeMap < dashcore :: prelude :: CoreBlockHeight , dashcore :: sml :: masternode_list :: MasternodeList > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::known_block_hashes`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_known_block_hashes (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_u32_values_u8_arr_32 { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: known_block_hashes (& * self_) ; < crate :: fermented :: generics :: std_collections_Map_keys_u32_values_u8_arr_32 as ferment :: FFIConversionTo < std :: collections :: BTreeMap < u32 , [u8 ; 32] > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::known_block_heights`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_known_block_heights (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_u8_arr_32_values_u32 { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: known_block_heights (& * self_) ; < crate :: fermented :: generics :: std_collections_Map_keys_u8_arr_32_values_u32 as ferment :: FFIConversionTo < std :: collections :: BTreeMap < [u8 ; 32] , u32 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::known_snapshots`]"] # [cfg (feature = "std")] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_known_snapshots (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dashcore_hash_types_BlockHash_values_dashcore_network_message_qrinfo_QuorumSnapshot { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: known_snapshots (& * self_) ; < crate :: fermented :: generics :: std_collections_Map_keys_dashcore_hash_types_BlockHash_values_dashcore_network_message_qrinfo_QuorumSnapshot as ferment :: FFIConversionTo < std :: collections :: BTreeMap < dashcore :: hash_types :: BlockHash , dashcore :: network :: message_qrinfo :: QuorumSnapshot > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::verify_is_lock`]"] # [cfg (feature = "message_verification")] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_verify_is_lock (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor , instant_lock : * mut crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dashcore_sml_message_verification_error_MessageVerificationError { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: verify_is_lock (& * self_ , Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock as ferment :: FFIConversionFrom < dashcore :: ephemerealdata :: instant_lock :: InstantLock >> :: ffi_from (instant_lock)))) ; < crate :: fermented :: generics :: Result_ok_bool_err_dashcore_sml_message_verification_error_MessageVerificationError as ferment :: FFIConversionTo < Result < bool , dashcore :: sml :: message_verification_error :: MessageVerificationError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::verify_chain_lock`]"] # [cfg (feature = "message_verification")] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_verify_chain_lock (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor , chain_lock : * mut crate :: fermented :: types :: dashcore :: ephemerealdata :: chain_lock :: dashcore_ephemerealdata_chain_lock_ChainLock) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dashcore_sml_message_verification_error_MessageVerificationError { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: verify_chain_lock (& * self_ , Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: ephemerealdata :: chain_lock :: dashcore_ephemerealdata_chain_lock_ChainLock as ferment :: FFIConversionFrom < dashcore :: ephemerealdata :: chain_lock :: ChainLock >> :: ffi_from (chain_lock)))) ; < crate :: fermented :: generics :: Result_ok_bool_err_dashcore_sml_message_verification_error_MessageVerificationError as ferment :: FFIConversionTo < Result < bool , dashcore :: sml :: message_verification_error :: MessageVerificationError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::process_qr_info_result_from_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_process_qr_info_result_from_message (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor , message : * mut crate :: fermented :: generics :: Slice_u8 , verify_tip_non_rotated_quorums : bool , verify_rotated_quorums : bool) -> * mut crate :: fermented :: generics :: Result_ok_std_collections_BTreeSet_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: process_qr_info_result_from_message (& mut * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message))) , verify_tip_non_rotated_quorums , verify_rotated_quorums) ; < crate :: fermented :: generics :: Result_ok_std_collections_BTreeSet_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError as ferment :: FFIConversionTo < Result < std :: collections :: BTreeSet < dashcore :: hash_types :: BlockHash > , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::process_mn_list_diff_result_from_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_process_mn_list_diff_result_from_message (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor , message : * mut crate :: fermented :: generics :: Slice_u8 , diff_block_height : * mut u32 , verify_quorums : bool) -> * mut crate :: fermented :: generics :: Result_Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: process_mn_list_diff_result_from_message (& mut * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message))) , ferment :: from_opt_primitive (diff_block_height) , verify_quorums) ; < crate :: fermented :: generics :: Result_Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError as ferment :: FFIConversionTo < Result < (dashcore :: hash_types :: BlockHash , dashcore :: hash_types :: BlockHash) , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::serialize_engine`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_serialize_engine (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: serialize_engine (& * self_) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::MasternodeProcessor::deserialize_engine`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_MasternodeProcessor_deserialize_engine (self_ : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor , bytes : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: generics :: Result_ok_usize_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { let obj = dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor :: deserialize_engine (& mut * self_ , Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (bytes)))) ; < crate :: fermented :: generics :: Result_ok_usize_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError as ferment :: FFIConversionTo < Result < usize , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError > >> :: ffi_to (obj) } pub mod processing_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ProcessingError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { PersistInRetrieval (* mut crate :: fermented :: generics :: Arr_u8_32 , * mut crate :: fermented :: generics :: Arr_u8_32) , LocallyStored (u32 , * mut crate :: fermented :: generics :: Arr_u8_32) , ParseError (* mut std :: os :: raw :: c_char) , HasNoBaseBlockHash (* mut crate :: fermented :: generics :: Arr_u8_32) , UnknownBlockHash (* mut crate :: fermented :: generics :: Arr_u8_32) , InvalidResult (* mut std :: os :: raw :: c_char) , CoreProvider (* mut crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: core_provider :: dash_spv_masternode_processor_processing_core_provider_CoreProviderError) , MissingLists (* mut std :: os :: raw :: c_char) , EncodeError (* mut std :: os :: raw :: c_char) , DecodeError (* mut std :: os :: raw :: c_char) , QuorumValidationError (* mut crate :: fermented :: types :: dashcore :: sml :: quorum_validation_error :: dashcore_sml_quorum_validation_error_QuorumValidationError) } impl ferment :: FFIConversionFrom < dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError > for dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { unsafe fn ffi_from_const (ffi : * const dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError) -> dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: PersistInRetrieval (o_0 , o_1) => dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: PersistInRetrieval (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (* o_0) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (* o_1)) , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: LocallyStored (o_0 , o_1) => dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: LocallyStored (* o_0 , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (* o_1)) , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: ParseError (o_0) => dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: ParseError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: HasNoBaseBlockHash (o_0) => dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: HasNoBaseBlockHash (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (* o_0)) , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: UnknownBlockHash (o_0) => dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: UnknownBlockHash (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (* o_0)) , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: InvalidResult (o_0) => dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: InvalidResult (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: CoreProvider (o_0) => dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: CoreProvider (< crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: core_provider :: dash_spv_masternode_processor_processing_core_provider_CoreProviderError as ferment :: FFIConversionFrom < dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError >> :: ffi_from (* o_0)) , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: MissingLists (o_0) => dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: MissingLists (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: EncodeError (o_0) => dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: EncodeError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: DecodeError (o_0) => dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: DecodeError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: QuorumValidationError (o_0) => dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: QuorumValidationError (< crate :: fermented :: types :: dashcore :: sml :: quorum_validation_error :: dashcore_sml_quorum_validation_error_QuorumValidationError as ferment :: FFIConversionFrom < dashcore :: sml :: quorum_validation_error :: QuorumValidationError >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError > for dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { unsafe fn ffi_to_const (obj : dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError) -> * const dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed (match obj { dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: PersistInRetrieval (o_0 , o_1) => dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: PersistInRetrieval (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (o_0) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (o_1)) , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: LocallyStored (o_0 , o_1) => dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: LocallyStored (o_0 , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (o_1)) , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: ParseError (o_0) => dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: ParseError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: HasNoBaseBlockHash (o_0) => dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: HasNoBaseBlockHash (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (o_0)) , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: UnknownBlockHash (o_0) => dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: UnknownBlockHash (< crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (o_0)) , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: InvalidResult (o_0) => dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: InvalidResult (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: CoreProvider (o_0) => dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: CoreProvider (< crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: core_provider :: dash_spv_masternode_processor_processing_core_provider_CoreProviderError as ferment :: FFIConversionTo < dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError >> :: ffi_to (o_0)) , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: MissingLists (o_0) => dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: MissingLists (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: EncodeError (o_0) => dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: EncodeError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: DecodeError (o_0) => dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: DecodeError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: QuorumValidationError (o_0) => dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: QuorumValidationError (< crate :: fermented :: types :: dashcore :: sml :: quorum_validation_error :: dashcore_sml_quorum_validation_error_QuorumValidationError as ferment :: FFIConversionTo < dashcore :: sml :: quorum_validation_error :: QuorumValidationError >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { fn drop (& mut self) { unsafe { match self { dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: PersistInRetrieval (o_0 , o_1) => { ferment :: unbox_any (* o_0) ; ; ferment :: unbox_any (* o_1) ; } , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: LocallyStored (o_0 , o_1) => { ; ; ferment :: unbox_any (* o_1) ; } , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: ParseError (o_0) => { ferment :: unbox_string (* o_0) ; } , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: HasNoBaseBlockHash (o_0) => { ferment :: unbox_any (* o_0) ; } , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: UnknownBlockHash (o_0) => { ferment :: unbox_any (* o_0) ; } , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: InvalidResult (o_0) => { ferment :: unbox_string (* o_0) ; } , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: CoreProvider (o_0) => { ferment :: unbox_any (* o_0) ; } , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: MissingLists (o_0) => { ferment :: unbox_string (* o_0) ; } , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: EncodeError (o_0) => { ferment :: unbox_string (* o_0) ; } , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: DecodeError (o_0) => { ferment :: unbox_string (* o_0) ; } , dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: QuorumValidationError (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_PersistInRetrieval_ctor (o_o_0 : * mut crate :: fermented :: generics :: Arr_u8_32 , o_o_1 : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed (dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: PersistInRetrieval (o_o_0 , o_o_1)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_LocallyStored_ctor (o_o_0 : u32 , o_o_1 : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed (dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: LocallyStored (o_o_0 , o_o_1)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_ParseError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed (dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: ParseError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_HasNoBaseBlockHash_ctor (o_o_0 : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed (dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: HasNoBaseBlockHash (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_UnknownBlockHash_ctor (o_o_0 : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed (dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: UnknownBlockHash (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_InvalidResult_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed (dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: InvalidResult (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_CoreProvider_ctor (o_o_0 : * mut crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: core_provider :: dash_spv_masternode_processor_processing_core_provider_CoreProviderError) -> * mut dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed (dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: CoreProvider (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_MissingLists_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed (dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: MissingLists (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_EncodeError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed (dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: EncodeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_DecodeError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed (dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: DecodeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_QuorumValidationError_ctor (o_o_0 : * mut crate :: fermented :: types :: dashcore :: sml :: quorum_validation_error :: dashcore_sml_quorum_validation_error_QuorumValidationError) -> * mut dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed (dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError :: QuorumValidationError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_destroy < > (ffi : * mut dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::processor::processing_error::ProcessingError::string_value`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_string_value (self_ : * mut crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: processor :: processing_error :: dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError :: string_value (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } } } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::instant_lock_to_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_instant_lock_to_message (lock : * mut crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = dash_spv_masternode_processor :: processing :: instant_lock_to_message (Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock as ferment :: FFIConversionFrom < dashcore :: ephemerealdata :: instant_lock :: InstantLock >> :: ffi_from (lock)))) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::operator_public_key_address`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_operator_public_key_address (public_key : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_masternode_processor :: processing :: operator_public_key_address (< crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSPublicKey as ferment :: FFIConversionFrom < dashcore :: bls_sig_utils :: BLSPublicKey >> :: ffi_from (public_key) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::chain_lock_from_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_chain_lock_from_message (message : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: types :: dashcore :: ephemerealdata :: chain_lock :: dashcore_ephemerealdata_chain_lock_ChainLock { let obj = dash_spv_masternode_processor :: processing :: chain_lock_from_message (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message)))) ; < crate :: fermented :: types :: dashcore :: ephemerealdata :: chain_lock :: dashcore_ephemerealdata_chain_lock_ChainLock as ferment :: FFIConversionTo < dashcore :: ephemerealdata :: chain_lock :: ChainLock >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::chain_lock_signature`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_chain_lock_signature (chain_lock : * mut crate :: fermented :: types :: dashcore :: ephemerealdata :: chain_lock :: dashcore_ephemerealdata_chain_lock_ChainLock) -> * mut crate :: fermented :: generics :: Arr_u8_96 { let obj = dash_spv_masternode_processor :: processing :: chain_lock_signature (Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: ephemerealdata :: chain_lock :: dashcore_ephemerealdata_chain_lock_ChainLock as ferment :: FFIConversionFrom < dashcore :: ephemerealdata :: chain_lock :: ChainLock >> :: ffi_from (chain_lock)))) ; < crate :: fermented :: generics :: Arr_u8_96 as ferment :: FFIConversionTo < [u8 ; 96] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::instant_lock_from_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_instant_lock_from_message (message : * mut crate :: fermented :: generics :: Slice_u8) -> * mut crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock { let obj = dash_spv_masternode_processor :: processing :: instant_lock_from_message (Box :: leak (Box :: new (< crate :: fermented :: generics :: Slice_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (message)))) ; < crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock as ferment :: FFIConversionTo < dashcore :: ephemerealdata :: instant_lock :: InstantLock >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::instant_lock_cycle_hash`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_instant_lock_cycle_hash (lock : * mut crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = dash_spv_masternode_processor :: processing :: instant_lock_cycle_hash (Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock as ferment :: FFIConversionFrom < dashcore :: ephemerealdata :: instant_lock :: InstantLock >> :: ffi_from (lock)))) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::evo_node_address`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_evo_node_address (evo_node_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_masternode_processor :: processing :: evo_node_address (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_PubkeyHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: PubkeyHash >> :: ffi_from (evo_node_id) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::chain_lock_to_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_chain_lock_to_message (lock : * mut crate :: fermented :: types :: dashcore :: ephemerealdata :: chain_lock :: dashcore_ephemerealdata_chain_lock_ChainLock) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = dash_spv_masternode_processor :: processing :: chain_lock_to_message (Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: ephemerealdata :: chain_lock :: dashcore_ephemerealdata_chain_lock_ChainLock as ferment :: FFIConversionFrom < dashcore :: ephemerealdata :: chain_lock :: ChainLock >> :: ffi_from (lock)))) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::instant_lock_tx_hash`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_instant_lock_tx_hash (lock : * mut crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock) -> * mut crate :: fermented :: generics :: Arr_u8_32 { let obj = dash_spv_masternode_processor :: processing :: instant_lock_tx_hash (Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock as ferment :: FFIConversionFrom < dashcore :: ephemerealdata :: instant_lock :: InstantLock >> :: ffi_from (lock)))) ; < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::socket_addr_v4_ctor`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_socket_addr_v4_ctor (ip : * mut crate :: fermented :: generics :: Arr_u8_16 , port : u16) -> * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr { let obj = dash_spv_masternode_processor :: processing :: socket_addr_v4_ctor (< crate :: fermented :: generics :: Arr_u8_16 as ferment :: FFIConversionFrom < [u8 ; 16] >> :: ffi_from (ip) , port) ; < dash_spv_apple_bindings :: custom :: std :: SocketAddr as ferment :: FFIConversionTo < std :: net :: SocketAddr >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::outpoint_to_message`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_outpoint_to_message (lock : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = dash_spv_masternode_processor :: processing :: outpoint_to_message (Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_from (lock)))) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::peer_addresses_with_connectivity_nonce`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_peer_addresses_with_connectivity_nonce (masternode_list : * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list :: dashcore_sml_masternode_list_MasternodeList , nonce : u64 , max_count : usize) -> * mut crate :: fermented :: generics :: Vec_Tuple_Arr_u8_16_u16 { let obj = dash_spv_masternode_processor :: processing :: peer_addresses_with_connectivity_nonce (< crate :: fermented :: types :: dashcore :: sml :: masternode_list :: dashcore_sml_masternode_list_MasternodeList as ferment :: FFIConversionFrom < dashcore :: sml :: masternode_list :: MasternodeList >> :: ffi_from (masternode_list) , nonce , max_count) ; < crate :: fermented :: generics :: Vec_Tuple_Arr_u8_16_u16 as ferment :: FFIConversionTo < Vec < ([u8 ; 16] , u16) > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::instant_lock_outpoints`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_instant_lock_outpoints (lock : * mut crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock) -> * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_outpoint_OutPoint { let obj = dash_spv_masternode_processor :: processing :: instant_lock_outpoints (Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock as ferment :: FFIConversionFrom < dashcore :: ephemerealdata :: instant_lock :: InstantLock >> :: ffi_from (lock)))) ; < crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionTo < Vec < dashcore :: blockdata :: transaction :: outpoint :: OutPoint > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_masternode_processor::processing::instant_lock_signature`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_masternode_processor_processing_instant_lock_signature (lock : * mut crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock) -> * mut crate :: fermented :: generics :: Arr_u8_96 { let obj = dash_spv_masternode_processor :: processing :: instant_lock_signature (Box :: leak (Box :: new (< crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock as ferment :: FFIConversionFrom < dashcore :: ephemerealdata :: instant_lock :: InstantLock >> :: ffi_from (lock)))) ; < crate :: fermented :: generics :: Arr_u8_96 as ferment :: FFIConversionTo < [u8 ; 96] >> :: ffi_to (obj) } } } pub mod dash_spv_platform { use crate as dash_spv_apple_bindings ; pub mod document { use crate as dash_spv_apple_bindings ; pub mod manager { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DocumentValidator`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_platform_document_manager_DocumentValidator { None = 0 , AcceptNotFoundAsNotAnError = 1 } impl ferment :: FFIConversionFrom < dash_spv_platform :: document :: manager :: DocumentValidator > for dash_spv_platform_document_manager_DocumentValidator { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_document_manager_DocumentValidator) -> dash_spv_platform :: document :: manager :: DocumentValidator { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_platform_document_manager_DocumentValidator :: None => dash_spv_platform :: document :: manager :: DocumentValidator :: None , dash_spv_platform_document_manager_DocumentValidator :: AcceptNotFoundAsNotAnError => dash_spv_platform :: document :: manager :: DocumentValidator :: AcceptNotFoundAsNotAnError } } } impl ferment :: FFIConversionTo < dash_spv_platform :: document :: manager :: DocumentValidator > for dash_spv_platform_document_manager_DocumentValidator { unsafe fn ffi_to_const (obj : dash_spv_platform :: document :: manager :: DocumentValidator) -> * const dash_spv_platform_document_manager_DocumentValidator { ferment :: boxed (match obj { dash_spv_platform :: document :: manager :: DocumentValidator :: None => dash_spv_platform_document_manager_DocumentValidator :: None , dash_spv_platform :: document :: manager :: DocumentValidator :: AcceptNotFoundAsNotAnError => dash_spv_platform_document_manager_DocumentValidator :: AcceptNotFoundAsNotAnError , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_platform_document_manager_DocumentValidator { fn drop (& mut self) { unsafe { match self { dash_spv_platform_document_manager_DocumentValidator :: None => { } , dash_spv_platform_document_manager_DocumentValidator :: AcceptNotFoundAsNotAnError => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_manager_DocumentValidator_None_ctor () -> * mut dash_spv_platform_document_manager_DocumentValidator { ferment :: boxed (dash_spv_platform_document_manager_DocumentValidator :: None { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_manager_DocumentValidator_AcceptNotFoundAsNotAnError_ctor () -> * mut dash_spv_platform_document_manager_DocumentValidator { ferment :: boxed (dash_spv_platform_document_manager_DocumentValidator :: AcceptNotFoundAsNotAnError { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_manager_DocumentValidator_destroy < > (ffi : * mut dash_spv_platform_document_manager_DocumentValidator) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`dash_spv_platform::document::manager::DocumentsManager::dpns_documents_for_identity_with_user_id`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_manager_DocumentsManager_dpns_documents_for_identity_with_user_id (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: manager :: DocumentsManager , user_id : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: manager :: DocumentsManager :: dpns_documents_for_identity_with_user_id (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (user_id)) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::manager::DocumentsManager::stream_dpns_documents_for_identity_with_user_id`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_manager_DocumentsManager_stream_dpns_documents_for_identity_with_user_id (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: manager :: DocumentsManager , user_id : * mut crate :: fermented :: generics :: Arr_u8_32 , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: document :: manager :: dash_spv_platform_document_manager_DocumentValidator , delay : u64) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: manager :: DocumentsManager :: stream_dpns_documents_for_identity_with_user_id (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (user_id) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: document :: manager :: dash_spv_platform_document_manager_DocumentValidator as ferment :: FFIConversionFrom < dash_spv_platform :: document :: manager :: DocumentValidator >> :: ffi_from (options) , delay) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::manager::DocumentsManager::stream_dpns_documents_for_identity_with_user_id_using_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_manager_DocumentsManager_stream_dpns_documents_for_identity_with_user_id_using_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: manager :: DocumentsManager , user_id : * mut crate :: fermented :: generics :: Arr_u8_32 , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: document :: manager :: dash_spv_platform_document_manager_DocumentValidator , delay : u64) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: manager :: DocumentsManager :: stream_dpns_documents_for_identity_with_user_id_using_contract (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (user_id) , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: document :: manager :: dash_spv_platform_document_manager_DocumentValidator as ferment :: FFIConversionFrom < dash_spv_platform :: document :: manager :: DocumentValidator >> :: ffi_from (options) , delay) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::manager::DocumentsManager::dpns_documents_for_username`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_manager_DocumentsManager_dpns_documents_for_username (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: manager :: DocumentsManager , username : * mut std :: os :: raw :: c_char) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: manager :: DocumentsManager :: dpns_documents_for_username (& * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (username)) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::manager::DocumentsManager::dpns_documents_for_username_prefix`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_manager_DocumentsManager_dpns_documents_for_username_prefix (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: manager :: DocumentsManager , username_prefix : * mut std :: os :: raw :: c_char) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: manager :: DocumentsManager :: dpns_documents_for_username_prefix (& * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (username_prefix)) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::manager::DocumentsManager::dashpay_profile_for_user_id`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_manager_DocumentsManager_dashpay_profile_for_user_id (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: manager :: DocumentsManager , user_id : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: manager :: DocumentsManager :: dashpay_profile_for_user_id (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (user_id)) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: document :: Document > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::manager::DocumentsManager::dashpay_profiles_for_user_ids`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_manager_DocumentsManager_dashpay_profiles_for_user_ids (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: manager :: DocumentsManager , user_ids : * mut crate :: fermented :: generics :: Vec_u8_32) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: manager :: DocumentsManager :: dashpay_profiles_for_user_ids (& * self_ , < crate :: fermented :: generics :: Vec_u8_32 as ferment :: FFIConversionFrom < Vec < [u8 ; 32] > >> :: ffi_from (user_ids)) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::manager::DocumentsManager::dpns_documents_for_identity_with_user_id_using_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_manager_DocumentsManager_dpns_documents_for_identity_with_user_id_using_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: manager :: DocumentsManager , user_id : * mut crate :: fermented :: generics :: Arr_u8_32 , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: manager :: DocumentsManager :: dpns_documents_for_identity_with_user_id_using_contract (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (user_id) , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract)) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::manager::DocumentsManager::dashpay_profile_for_user_id_using_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_manager_DocumentsManager_dashpay_profile_for_user_id_using_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: manager :: DocumentsManager , user_id : * mut crate :: fermented :: generics :: Arr_u8_32 , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: manager :: DocumentsManager :: dashpay_profile_for_user_id_using_contract (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (user_id) , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract)) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: document :: Document > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::manager::DocumentsManager::stream_dashpay_profile_for_user_id_using_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_manager_DocumentsManager_stream_dashpay_profile_for_user_id_using_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: manager :: DocumentsManager , user_id : * mut crate :: fermented :: generics :: Arr_u8_32 , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: document :: manager :: dash_spv_platform_document_manager_DocumentValidator , delay : u64) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: manager :: DocumentsManager :: stream_dashpay_profile_for_user_id_using_contract (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (user_id) , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: document :: manager :: dash_spv_platform_document_manager_DocumentValidator as ferment :: FFIConversionFrom < dash_spv_platform :: document :: manager :: DocumentValidator >> :: ffi_from (options) , delay) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: document :: Document > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::manager::DocumentsManager::dashpay_profiles_for_user_ids_using_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_manager_DocumentsManager_dashpay_profiles_for_user_ids_using_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: manager :: DocumentsManager , user_ids : * mut crate :: fermented :: generics :: Vec_u8_32 , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: manager :: DocumentsManager :: dashpay_profiles_for_user_ids_using_contract (& * self_ , < crate :: fermented :: generics :: Vec_u8_32 as ferment :: FFIConversionFrom < Vec < [u8 ; 32] > >> :: ffi_from (user_ids) , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract)) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::manager::DocumentsManager::stream_dashpay_profiles_for_user_ids_using_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_manager_DocumentsManager_stream_dashpay_profiles_for_user_ids_using_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: manager :: DocumentsManager , user_ids : * mut crate :: fermented :: generics :: Vec_u8_32 , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: document :: manager :: dash_spv_platform_document_manager_DocumentValidator , delay : u64) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: manager :: DocumentsManager :: stream_dashpay_profiles_for_user_ids_using_contract (& * self_ , < crate :: fermented :: generics :: Vec_u8_32 as ferment :: FFIConversionFrom < Vec < [u8 ; 32] > >> :: ffi_from (user_ids) , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: document :: manager :: dash_spv_platform_document_manager_DocumentValidator as ferment :: FFIConversionFrom < dash_spv_platform :: document :: manager :: DocumentValidator >> :: ffi_from (options) , delay) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::manager::DocumentsManager::dpns_documents_for_username_using_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_manager_DocumentsManager_dpns_documents_for_username_using_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: manager :: DocumentsManager , username : * mut std :: os :: raw :: c_char , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: manager :: DocumentsManager :: dpns_documents_for_username_using_contract (& * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (username) , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract)) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::manager::DocumentsManager::dpns_documents_for_username_prefix_using_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_manager_DocumentsManager_dpns_documents_for_username_prefix_using_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: manager :: DocumentsManager , username_prefix : * mut std :: os :: raw :: c_char , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: manager :: DocumentsManager :: dpns_documents_for_username_prefix_using_contract (& * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (username_prefix) , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract)) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } } # [doc = "FFI-representation of the [`dash_spv_platform::document::print_document`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_print_document (document : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document) { let obj = dash_spv_platform :: document :: print_document (< crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionFrom < dpp :: document :: Document >> :: ffi_from (document)) ; ; } pub mod salted_domain_hashes { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_platform::document::salted_domain_hashes::SaltedDomainHashesManager::preorder_salted_domain_hash`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager_preorder_salted_domain_hash (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager , hash : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager :: preorder_salted_domain_hash (& * self_ , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (hash)) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: document :: Document > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::salted_domain_hashes::SaltedDomainHashesManager::preorder_salted_domain_hashes`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager_preorder_salted_domain_hashes (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager , hashes : * mut crate :: fermented :: generics :: Vec_Vec_u8) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager :: preorder_salted_domain_hashes (& * self_ , < crate :: fermented :: generics :: Vec_Vec_u8 as ferment :: FFIConversionFrom < Vec < Vec < u8 > > >> :: ffi_from (hashes)) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::salted_domain_hashes::SaltedDomainHashesManager::preorder_salted_domain_hash_stream`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager_preorder_salted_domain_hash_stream (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager , hash : * mut crate :: fermented :: generics :: Vec_u8 , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: document :: salted_domain_hashes :: dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator , delay : u64) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager :: preorder_salted_domain_hash_stream (& * self_ , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (hash) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: document :: salted_domain_hashes :: dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator as ferment :: FFIConversionFrom < dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashValidator >> :: ffi_from (options) , delay) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: document :: Document > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::salted_domain_hashes::SaltedDomainHashesManager::preorder_salted_domain_hashes_stream`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager_preorder_salted_domain_hashes_stream (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager , hashes : * mut crate :: fermented :: generics :: Vec_Vec_u8 , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: document :: salted_domain_hashes :: dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator , delay : u64) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager :: preorder_salted_domain_hashes_stream (& * self_ , < crate :: fermented :: generics :: Vec_Vec_u8 as ferment :: FFIConversionFrom < Vec < Vec < u8 > > >> :: ffi_from (hashes) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: document :: salted_domain_hashes :: dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator as ferment :: FFIConversionFrom < dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashValidator >> :: ffi_from (options) , delay) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::salted_domain_hashes::SaltedDomainHashesManager::preorder_salted_domain_hash_with_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager_preorder_salted_domain_hash_with_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager , hash : * mut crate :: fermented :: generics :: Vec_u8 , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager :: preorder_salted_domain_hash_with_contract (& * self_ , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (hash) , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract)) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: document :: Document > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::salted_domain_hashes::SaltedDomainHashesManager::preorder_salted_domain_hashes_with_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager_preorder_salted_domain_hashes_with_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager , hashes : * mut crate :: fermented :: generics :: Vec_Vec_u8 , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager :: preorder_salted_domain_hashes_with_contract (& * self_ , < crate :: fermented :: generics :: Vec_Vec_u8 as ferment :: FFIConversionFrom < Vec < Vec < u8 > > >> :: ffi_from (hashes) , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract)) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::salted_domain_hashes::SaltedDomainHashesManager::stream_preorder_salted_domain_hash_with_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager_stream_preorder_salted_domain_hash_with_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager , hash : * mut crate :: fermented :: generics :: Vec_u8 , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: document :: salted_domain_hashes :: dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator , delay : u64) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager :: stream_preorder_salted_domain_hash_with_contract (& * self_ , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (hash) , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: document :: salted_domain_hashes :: dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator as ferment :: FFIConversionFrom < dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashValidator >> :: ffi_from (options) , delay) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: document :: Document > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::salted_domain_hashes::SaltedDomainHashesManager::stream_preorder_salted_domain_hashes_with_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager_stream_preorder_salted_domain_hashes_with_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager , hashes : * mut crate :: fermented :: generics :: Vec_Vec_u8 , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: document :: salted_domain_hashes :: dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator , delay : u64) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager :: stream_preorder_salted_domain_hashes_with_contract (& * self_ , < crate :: fermented :: generics :: Vec_Vec_u8 as ferment :: FFIConversionFrom < Vec < Vec < u8 > > >> :: ffi_from (hashes) , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: document :: salted_domain_hashes :: dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator as ferment :: FFIConversionFrom < dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashValidator >> :: ffi_from (options) , delay) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`SaltedDomainHashValidator`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator { None = 0 , AcceptNotFoundAsNotAnError = 1 } impl ferment :: FFIConversionFrom < dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashValidator > for dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator) -> dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashValidator { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator :: None => dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashValidator :: None , dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator :: AcceptNotFoundAsNotAnError => dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashValidator :: AcceptNotFoundAsNotAnError } } } impl ferment :: FFIConversionTo < dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashValidator > for dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator { unsafe fn ffi_to_const (obj : dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashValidator) -> * const dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator { ferment :: boxed (match obj { dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashValidator :: None => dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator :: None , dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashValidator :: AcceptNotFoundAsNotAnError => dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator :: AcceptNotFoundAsNotAnError , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator { fn drop (& mut self) { unsafe { match self { dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator :: None => { } , dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator :: AcceptNotFoundAsNotAnError => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator_None_ctor () -> * mut dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator { ferment :: boxed (dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator :: None { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator_AcceptNotFoundAsNotAnError_ctor () -> * mut dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator { ferment :: boxed (dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator :: AcceptNotFoundAsNotAnError { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator_destroy < > (ffi : * mut dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashValidator) { ferment :: unbox_any (ffi) ; } } pub mod contact_request { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_platform::document::contact_request::ContactRequestManager::incoming_contact_requests_using_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_contact_request_ContactRequestManager_incoming_contact_requests_using_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: contact_request :: ContactRequestManager , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , user_id : * mut crate :: fermented :: generics :: Arr_u8_32 , since : u64 , start_after : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: contact_request :: ContactRequestManager :: incoming_contact_requests_using_contract (& * self_ , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (user_id) , since , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from_opt (start_after)) . await }) ; < crate :: fermented :: generics :: Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Vec < dash_spv_platform :: models :: contact_request :: ContactRequestKind > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::contact_request::ContactRequestManager::outgoing_contact_requests_using_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_contact_request_ContactRequestManager_outgoing_contact_requests_using_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: contact_request :: ContactRequestManager , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , user_id : * mut crate :: fermented :: generics :: Arr_u8_32 , since : u64 , start_after : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: contact_request :: ContactRequestManager :: outgoing_contact_requests_using_contract (& * self_ , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (user_id) , since , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from_opt (start_after)) . await }) ; < crate :: fermented :: generics :: Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Vec < dash_spv_platform :: models :: contact_request :: ContactRequestKind > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::contact_request::ContactRequestManager::incoming_contact_requests`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_contact_request_ContactRequestManager_incoming_contact_requests (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: contact_request :: ContactRequestManager , user_id : * mut crate :: fermented :: generics :: Arr_u8_32 , since : u64 , start_after : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: contact_request :: ContactRequestManager :: incoming_contact_requests (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (user_id) , since , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from_opt (start_after)) . await }) ; < crate :: fermented :: generics :: Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Vec < dash_spv_platform :: models :: contact_request :: ContactRequestKind > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::contact_request::ContactRequestManager::outgoing_contact_requests`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_contact_request_ContactRequestManager_outgoing_contact_requests (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: contact_request :: ContactRequestManager , user_id : * mut crate :: fermented :: generics :: Arr_u8_32 , since : u64 , start_after : * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: contact_request :: ContactRequestManager :: outgoing_contact_requests (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (user_id) , since , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from_opt (start_after)) . await }) ; < crate :: fermented :: generics :: Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Vec < dash_spv_platform :: models :: contact_request :: ContactRequestKind > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::contact_request::ContactRequestManager::stream_incoming_contact_requests`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_contact_request_ContactRequestManager_stream_incoming_contact_requests (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: contact_request :: ContactRequestManager , user_id : * mut crate :: fermented :: generics :: Arr_u8_32 , since : u64 , start_after : * mut crate :: fermented :: generics :: Vec_u8 , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: document :: contact_request :: dash_spv_platform_document_contact_request_ContactRequestValidator , delay : u64) -> * mut crate :: fermented :: generics :: Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: contact_request :: ContactRequestManager :: stream_incoming_contact_requests (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (user_id) , since , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from_opt (start_after) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: document :: contact_request :: dash_spv_platform_document_contact_request_ContactRequestValidator as ferment :: FFIConversionFrom < dash_spv_platform :: document :: contact_request :: ContactRequestValidator >> :: ffi_from (options) , delay) . await }) ; < crate :: fermented :: generics :: Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Vec < dash_spv_platform :: models :: contact_request :: ContactRequestKind > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::contact_request::ContactRequestManager::stream_incoming_contact_requests_with_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_contact_request_ContactRequestManager_stream_incoming_contact_requests_with_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: contact_request :: ContactRequestManager , user_id : * mut crate :: fermented :: generics :: Arr_u8_32 , since : u64 , start_after : * mut crate :: fermented :: generics :: Vec_u8 , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: document :: contact_request :: dash_spv_platform_document_contact_request_ContactRequestValidator , delay : u64) -> * mut crate :: fermented :: generics :: Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: contact_request :: ContactRequestManager :: stream_incoming_contact_requests_with_contract (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (user_id) , since , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from_opt (start_after) , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: document :: contact_request :: dash_spv_platform_document_contact_request_ContactRequestValidator as ferment :: FFIConversionFrom < dash_spv_platform :: document :: contact_request :: ContactRequestValidator >> :: ffi_from (options) , delay) . await }) ; < crate :: fermented :: generics :: Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Vec < dash_spv_platform :: models :: contact_request :: ContactRequestKind > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::contact_request::ContactRequestManager::stream_outgoing_contact_requests`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_contact_request_ContactRequestManager_stream_outgoing_contact_requests (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: contact_request :: ContactRequestManager , user_id : * mut crate :: fermented :: generics :: Arr_u8_32 , since : u64 , start_after : * mut crate :: fermented :: generics :: Vec_u8 , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: document :: contact_request :: dash_spv_platform_document_contact_request_ContactRequestValidator , delay : u64) -> * mut crate :: fermented :: generics :: Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: contact_request :: ContactRequestManager :: stream_outgoing_contact_requests (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (user_id) , since , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from_opt (start_after) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: document :: contact_request :: dash_spv_platform_document_contact_request_ContactRequestValidator as ferment :: FFIConversionFrom < dash_spv_platform :: document :: contact_request :: ContactRequestValidator >> :: ffi_from (options) , delay) . await }) ; < crate :: fermented :: generics :: Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Vec < dash_spv_platform :: models :: contact_request :: ContactRequestKind > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::contact_request::ContactRequestManager::stream_outgoing_contact_requests_with_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_contact_request_ContactRequestManager_stream_outgoing_contact_requests_with_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: contact_request :: ContactRequestManager , user_id : * mut crate :: fermented :: generics :: Arr_u8_32 , since : u64 , start_after : * mut crate :: fermented :: generics :: Vec_u8 , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: document :: contact_request :: dash_spv_platform_document_contact_request_ContactRequestValidator , delay : u64) -> * mut crate :: fermented :: generics :: Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: contact_request :: ContactRequestManager :: stream_outgoing_contact_requests_with_contract (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (user_id) , since , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from_opt (start_after) , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: document :: contact_request :: dash_spv_platform_document_contact_request_ContactRequestValidator as ferment :: FFIConversionFrom < dash_spv_platform :: document :: contact_request :: ContactRequestValidator >> :: ffi_from (options) , delay) . await }) ; < crate :: fermented :: generics :: Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Vec < dash_spv_platform :: models :: contact_request :: ContactRequestKind > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::contact_request::as_incoming_request`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_contact_request_as_incoming_request (kind : * mut crate :: fermented :: types :: dash_spv_platform :: models :: contact_request :: dash_spv_platform_models_contact_request_ContactRequestKind) -> * mut crate :: fermented :: types :: dash_spv_platform :: models :: contact_request :: dash_spv_platform_models_contact_request_ContactRequest { let obj = dash_spv_platform :: document :: contact_request :: as_incoming_request (< crate :: fermented :: types :: dash_spv_platform :: models :: contact_request :: dash_spv_platform_models_contact_request_ContactRequestKind as ferment :: FFIConversionFrom < dash_spv_platform :: models :: contact_request :: ContactRequestKind >> :: ffi_from (kind)) ; < crate :: fermented :: types :: dash_spv_platform :: models :: contact_request :: dash_spv_platform_models_contact_request_ContactRequest as ferment :: FFIConversionTo < dash_spv_platform :: models :: contact_request :: ContactRequest >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::contact_request::as_outgoing_request`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_contact_request_as_outgoing_request (kind : * mut crate :: fermented :: types :: dash_spv_platform :: models :: contact_request :: dash_spv_platform_models_contact_request_ContactRequestKind) -> * mut crate :: fermented :: types :: dash_spv_platform :: models :: contact_request :: dash_spv_platform_models_contact_request_ContactRequest { let obj = dash_spv_platform :: document :: contact_request :: as_outgoing_request (< crate :: fermented :: types :: dash_spv_platform :: models :: contact_request :: dash_spv_platform_models_contact_request_ContactRequestKind as ferment :: FFIConversionFrom < dash_spv_platform :: models :: contact_request :: ContactRequestKind >> :: ffi_from (kind)) ; < crate :: fermented :: types :: dash_spv_platform :: models :: contact_request :: dash_spv_platform_models_contact_request_ContactRequest as ferment :: FFIConversionTo < dash_spv_platform :: models :: contact_request :: ContactRequest >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ContactRequestValidator`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_platform_document_contact_request_ContactRequestValidator { None = 0 , AcceptNotFoundAsNotAnError = 1 } impl ferment :: FFIConversionFrom < dash_spv_platform :: document :: contact_request :: ContactRequestValidator > for dash_spv_platform_document_contact_request_ContactRequestValidator { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_document_contact_request_ContactRequestValidator) -> dash_spv_platform :: document :: contact_request :: ContactRequestValidator { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_platform_document_contact_request_ContactRequestValidator :: None => dash_spv_platform :: document :: contact_request :: ContactRequestValidator :: None , dash_spv_platform_document_contact_request_ContactRequestValidator :: AcceptNotFoundAsNotAnError => dash_spv_platform :: document :: contact_request :: ContactRequestValidator :: AcceptNotFoundAsNotAnError } } } impl ferment :: FFIConversionTo < dash_spv_platform :: document :: contact_request :: ContactRequestValidator > for dash_spv_platform_document_contact_request_ContactRequestValidator { unsafe fn ffi_to_const (obj : dash_spv_platform :: document :: contact_request :: ContactRequestValidator) -> * const dash_spv_platform_document_contact_request_ContactRequestValidator { ferment :: boxed (match obj { dash_spv_platform :: document :: contact_request :: ContactRequestValidator :: None => dash_spv_platform_document_contact_request_ContactRequestValidator :: None , dash_spv_platform :: document :: contact_request :: ContactRequestValidator :: AcceptNotFoundAsNotAnError => dash_spv_platform_document_contact_request_ContactRequestValidator :: AcceptNotFoundAsNotAnError , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_platform_document_contact_request_ContactRequestValidator { fn drop (& mut self) { unsafe { match self { dash_spv_platform_document_contact_request_ContactRequestValidator :: None => { } , dash_spv_platform_document_contact_request_ContactRequestValidator :: AcceptNotFoundAsNotAnError => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_contact_request_ContactRequestValidator_None_ctor () -> * mut dash_spv_platform_document_contact_request_ContactRequestValidator { ferment :: boxed (dash_spv_platform_document_contact_request_ContactRequestValidator :: None { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_contact_request_ContactRequestValidator_AcceptNotFoundAsNotAnError_ctor () -> * mut dash_spv_platform_document_contact_request_ContactRequestValidator { ferment :: boxed (dash_spv_platform_document_contact_request_ContactRequestValidator :: AcceptNotFoundAsNotAnError { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_contact_request_ContactRequestValidator_destroy < > (ffi : * mut dash_spv_platform_document_contact_request_ContactRequestValidator) { ferment :: unbox_any (ffi) ; } } # [doc = "FFI-representation of the [`dash_spv_platform::document::get_document_property`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_get_document_property (document : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document , property : * mut std :: os :: raw :: c_char) -> * mut crate :: fermented :: types :: platform_value :: platform_value_Value { let obj = dash_spv_platform :: document :: get_document_property (< crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionFrom < dpp :: document :: Document >> :: ffi_from (document) , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (property)))) ; < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionTo < platform_value :: Value >> :: ffi_to_opt (obj) } pub mod usernames { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`UsernameStatus`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_platform_document_usernames_UsernameStatus { NotPresent = 0 , Initial = 1 , PreorderRegistrationPending = 2 , Preordered = 3 , RegistrationPending = 4 , Confirmed = 5 , TakenOnNetwork = 6 , VotingPeriod = 7 , Locked = 8 } impl ferment :: FFIConversionFrom < dash_spv_platform :: document :: usernames :: UsernameStatus > for dash_spv_platform_document_usernames_UsernameStatus { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_document_usernames_UsernameStatus) -> dash_spv_platform :: document :: usernames :: UsernameStatus { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_platform_document_usernames_UsernameStatus :: NotPresent => dash_spv_platform :: document :: usernames :: UsernameStatus :: NotPresent , dash_spv_platform_document_usernames_UsernameStatus :: Initial => dash_spv_platform :: document :: usernames :: UsernameStatus :: Initial , dash_spv_platform_document_usernames_UsernameStatus :: PreorderRegistrationPending => dash_spv_platform :: document :: usernames :: UsernameStatus :: PreorderRegistrationPending , dash_spv_platform_document_usernames_UsernameStatus :: Preordered => dash_spv_platform :: document :: usernames :: UsernameStatus :: Preordered , dash_spv_platform_document_usernames_UsernameStatus :: RegistrationPending => dash_spv_platform :: document :: usernames :: UsernameStatus :: RegistrationPending , dash_spv_platform_document_usernames_UsernameStatus :: Confirmed => dash_spv_platform :: document :: usernames :: UsernameStatus :: Confirmed , dash_spv_platform_document_usernames_UsernameStatus :: TakenOnNetwork => dash_spv_platform :: document :: usernames :: UsernameStatus :: TakenOnNetwork , dash_spv_platform_document_usernames_UsernameStatus :: VotingPeriod => dash_spv_platform :: document :: usernames :: UsernameStatus :: VotingPeriod , dash_spv_platform_document_usernames_UsernameStatus :: Locked => dash_spv_platform :: document :: usernames :: UsernameStatus :: Locked } } } impl ferment :: FFIConversionTo < dash_spv_platform :: document :: usernames :: UsernameStatus > for dash_spv_platform_document_usernames_UsernameStatus { unsafe fn ffi_to_const (obj : dash_spv_platform :: document :: usernames :: UsernameStatus) -> * const dash_spv_platform_document_usernames_UsernameStatus { ferment :: boxed (match obj { dash_spv_platform :: document :: usernames :: UsernameStatus :: NotPresent => dash_spv_platform_document_usernames_UsernameStatus :: NotPresent , dash_spv_platform :: document :: usernames :: UsernameStatus :: Initial => dash_spv_platform_document_usernames_UsernameStatus :: Initial , dash_spv_platform :: document :: usernames :: UsernameStatus :: PreorderRegistrationPending => dash_spv_platform_document_usernames_UsernameStatus :: PreorderRegistrationPending , dash_spv_platform :: document :: usernames :: UsernameStatus :: Preordered => dash_spv_platform_document_usernames_UsernameStatus :: Preordered , dash_spv_platform :: document :: usernames :: UsernameStatus :: RegistrationPending => dash_spv_platform_document_usernames_UsernameStatus :: RegistrationPending , dash_spv_platform :: document :: usernames :: UsernameStatus :: Confirmed => dash_spv_platform_document_usernames_UsernameStatus :: Confirmed , dash_spv_platform :: document :: usernames :: UsernameStatus :: TakenOnNetwork => dash_spv_platform_document_usernames_UsernameStatus :: TakenOnNetwork , dash_spv_platform :: document :: usernames :: UsernameStatus :: VotingPeriod => dash_spv_platform_document_usernames_UsernameStatus :: VotingPeriod , dash_spv_platform :: document :: usernames :: UsernameStatus :: Locked => dash_spv_platform_document_usernames_UsernameStatus :: Locked , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_platform_document_usernames_UsernameStatus { fn drop (& mut self) { unsafe { match self { dash_spv_platform_document_usernames_UsernameStatus :: NotPresent => { } , dash_spv_platform_document_usernames_UsernameStatus :: Initial => { } , dash_spv_platform_document_usernames_UsernameStatus :: PreorderRegistrationPending => { } , dash_spv_platform_document_usernames_UsernameStatus :: Preordered => { } , dash_spv_platform_document_usernames_UsernameStatus :: RegistrationPending => { } , dash_spv_platform_document_usernames_UsernameStatus :: Confirmed => { } , dash_spv_platform_document_usernames_UsernameStatus :: TakenOnNetwork => { } , dash_spv_platform_document_usernames_UsernameStatus :: VotingPeriod => { } , dash_spv_platform_document_usernames_UsernameStatus :: Locked => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameStatus_NotPresent_ctor () -> * mut dash_spv_platform_document_usernames_UsernameStatus { ferment :: boxed (dash_spv_platform_document_usernames_UsernameStatus :: NotPresent { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameStatus_Initial_ctor () -> * mut dash_spv_platform_document_usernames_UsernameStatus { ferment :: boxed (dash_spv_platform_document_usernames_UsernameStatus :: Initial { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameStatus_PreorderRegistrationPending_ctor () -> * mut dash_spv_platform_document_usernames_UsernameStatus { ferment :: boxed (dash_spv_platform_document_usernames_UsernameStatus :: PreorderRegistrationPending { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameStatus_Preordered_ctor () -> * mut dash_spv_platform_document_usernames_UsernameStatus { ferment :: boxed (dash_spv_platform_document_usernames_UsernameStatus :: Preordered { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameStatus_RegistrationPending_ctor () -> * mut dash_spv_platform_document_usernames_UsernameStatus { ferment :: boxed (dash_spv_platform_document_usernames_UsernameStatus :: RegistrationPending { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameStatus_Confirmed_ctor () -> * mut dash_spv_platform_document_usernames_UsernameStatus { ferment :: boxed (dash_spv_platform_document_usernames_UsernameStatus :: Confirmed { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameStatus_TakenOnNetwork_ctor () -> * mut dash_spv_platform_document_usernames_UsernameStatus { ferment :: boxed (dash_spv_platform_document_usernames_UsernameStatus :: TakenOnNetwork { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameStatus_VotingPeriod_ctor () -> * mut dash_spv_platform_document_usernames_UsernameStatus { ferment :: boxed (dash_spv_platform_document_usernames_UsernameStatus :: VotingPeriod { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameStatus_Locked_ctor () -> * mut dash_spv_platform_document_usernames_UsernameStatus { ferment :: boxed (dash_spv_platform_document_usernames_UsernameStatus :: Locked { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameStatus_destroy < > (ffi : * mut dash_spv_platform_document_usernames_UsernameStatus) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`UsernameValidator`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_platform_document_usernames_UsernameValidator { None = 0 , AcceptNotFoundAsNotAnError = 1 } impl ferment :: FFIConversionFrom < dash_spv_platform :: document :: usernames :: UsernameValidator > for dash_spv_platform_document_usernames_UsernameValidator { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_document_usernames_UsernameValidator) -> dash_spv_platform :: document :: usernames :: UsernameValidator { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_platform_document_usernames_UsernameValidator :: None => dash_spv_platform :: document :: usernames :: UsernameValidator :: None , dash_spv_platform_document_usernames_UsernameValidator :: AcceptNotFoundAsNotAnError => dash_spv_platform :: document :: usernames :: UsernameValidator :: AcceptNotFoundAsNotAnError } } } impl ferment :: FFIConversionTo < dash_spv_platform :: document :: usernames :: UsernameValidator > for dash_spv_platform_document_usernames_UsernameValidator { unsafe fn ffi_to_const (obj : dash_spv_platform :: document :: usernames :: UsernameValidator) -> * const dash_spv_platform_document_usernames_UsernameValidator { ferment :: boxed (match obj { dash_spv_platform :: document :: usernames :: UsernameValidator :: None => dash_spv_platform_document_usernames_UsernameValidator :: None , dash_spv_platform :: document :: usernames :: UsernameValidator :: AcceptNotFoundAsNotAnError => dash_spv_platform_document_usernames_UsernameValidator :: AcceptNotFoundAsNotAnError , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_platform_document_usernames_UsernameValidator { fn drop (& mut self) { unsafe { match self { dash_spv_platform_document_usernames_UsernameValidator :: None => { } , dash_spv_platform_document_usernames_UsernameValidator :: AcceptNotFoundAsNotAnError => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameValidator_None_ctor () -> * mut dash_spv_platform_document_usernames_UsernameValidator { ferment :: boxed (dash_spv_platform_document_usernames_UsernameValidator :: None { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameValidator_AcceptNotFoundAsNotAnError_ctor () -> * mut dash_spv_platform_document_usernames_UsernameValidator { ferment :: boxed (dash_spv_platform_document_usernames_UsernameValidator :: AcceptNotFoundAsNotAnError { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameValidator_destroy < > (ffi : * mut dash_spv_platform_document_usernames_UsernameValidator) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`dash_spv_platform::document::usernames::username_status_from_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_username_status_from_index (index : u8) -> * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus { let obj = dash_spv_platform :: document :: usernames :: username_status_from_index (index) ; < crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus as ferment :: FFIConversionTo < dash_spv_platform :: document :: usernames :: UsernameStatus >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::usernames::UsernamesManager::username`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernamesManager_username (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: usernames :: UsernamesManager , domain : * mut std :: os :: raw :: c_char , username : * mut std :: os :: raw :: c_char) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: usernames :: UsernamesManager :: username (& * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (domain) , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (username)) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: document :: Document > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::usernames::UsernamesManager::usernames`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernamesManager_usernames (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: usernames :: UsernamesManager , domain : * mut std :: os :: raw :: c_char , usernames : * mut crate :: fermented :: generics :: Vec_String) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: usernames :: UsernamesManager :: usernames (& * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (domain) , < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionFrom < Vec < String > >> :: ffi_from (usernames)) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::usernames::UsernamesManager::username_stream`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernamesManager_username_stream (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: usernames :: UsernamesManager , domain : * mut std :: os :: raw :: c_char , username : * mut std :: os :: raw :: c_char , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameValidator , delay : u64) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: usernames :: UsernamesManager :: username_stream (& * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (domain) , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (username) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameValidator as ferment :: FFIConversionFrom < dash_spv_platform :: document :: usernames :: UsernameValidator >> :: ffi_from (options) , delay) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: document :: Document > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::usernames::UsernamesManager::usernames_stream`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernamesManager_usernames_stream (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: usernames :: UsernamesManager , domain : * mut std :: os :: raw :: c_char , usernames : * mut crate :: fermented :: generics :: Vec_String , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameValidator , delay : u64) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: usernames :: UsernamesManager :: usernames_stream (& * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (domain) , < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionFrom < Vec < String > >> :: ffi_from (usernames) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameValidator as ferment :: FFIConversionFrom < dash_spv_platform :: document :: usernames :: UsernameValidator >> :: ffi_from (options) , delay) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::usernames::UsernamesManager::username_with_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernamesManager_username_with_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: usernames :: UsernamesManager , domain : * mut std :: os :: raw :: c_char , username : * mut std :: os :: raw :: c_char , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: usernames :: UsernamesManager :: username_with_contract (& * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (domain) , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (username) , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract)) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: document :: Document > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::usernames::UsernamesManager::usernames_with_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernamesManager_usernames_with_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: usernames :: UsernamesManager , domain : * mut std :: os :: raw :: c_char , usernames : * mut crate :: fermented :: generics :: Vec_String , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: usernames :: UsernamesManager :: usernames_with_contract (& * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (domain) , < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionFrom < Vec < String > >> :: ffi_from (usernames) , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract)) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::usernames::UsernamesManager::stream_username_with_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernamesManager_stream_username_with_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: usernames :: UsernamesManager , domain : * mut std :: os :: raw :: c_char , username : * mut std :: os :: raw :: c_char , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameValidator , delay : u64) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: usernames :: UsernamesManager :: stream_username_with_contract (& * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (domain) , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (username) , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameValidator as ferment :: FFIConversionFrom < dash_spv_platform :: document :: usernames :: UsernameValidator >> :: ffi_from (options) , delay) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: document :: Document > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::usernames::UsernamesManager::stream_usernames_with_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernamesManager_stream_usernames_with_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: document :: usernames :: UsernamesManager , domain : * mut std :: os :: raw :: c_char , usernames : * mut crate :: fermented :: generics :: Vec_String , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameValidator , delay : u64) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: document :: usernames :: UsernamesManager :: stream_usernames_with_contract (& * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (domain) , < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionFrom < Vec < String > >> :: ffi_from (usernames) , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameValidator as ferment :: FFIConversionFrom < dash_spv_platform :: document :: usernames :: UsernameValidator >> :: ffi_from (options) , delay) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::document::usernames::username_status_to_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_username_status_to_index (status : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus) -> u8 { let obj = dash_spv_platform :: document :: usernames :: username_status_to_index (< crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus as ferment :: FFIConversionFrom < dash_spv_platform :: document :: usernames :: UsernameStatus >> :: ffi_from (status)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::document::usernames::UsernameStatus::is_not_present`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameStatus_is_not_present (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus) -> bool { let obj = dash_spv_platform :: document :: usernames :: UsernameStatus :: is_not_present (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::document::usernames::UsernameStatus::is_initial`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameStatus_is_initial (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus) -> bool { let obj = dash_spv_platform :: document :: usernames :: UsernameStatus :: is_initial (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::document::usernames::UsernameStatus::is_preorder_registration_pending`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameStatus_is_preorder_registration_pending (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus) -> bool { let obj = dash_spv_platform :: document :: usernames :: UsernameStatus :: is_preorder_registration_pending (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::document::usernames::UsernameStatus::is_preordered`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameStatus_is_preordered (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus) -> bool { let obj = dash_spv_platform :: document :: usernames :: UsernameStatus :: is_preordered (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::document::usernames::UsernameStatus::is_registration_pending`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameStatus_is_registration_pending (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus) -> bool { let obj = dash_spv_platform :: document :: usernames :: UsernameStatus :: is_registration_pending (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::document::usernames::UsernameStatus::is_confirmed`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameStatus_is_confirmed (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus) -> bool { let obj = dash_spv_platform :: document :: usernames :: UsernameStatus :: is_confirmed (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::document::usernames::UsernameStatus::is_taken_on_network`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameStatus_is_taken_on_network (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus) -> bool { let obj = dash_spv_platform :: document :: usernames :: UsernameStatus :: is_taken_on_network (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::document::usernames::UsernameStatus::is_voting_period`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameStatus_is_voting_period (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus) -> bool { let obj = dash_spv_platform :: document :: usernames :: UsernameStatus :: is_voting_period (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::document::usernames::UsernameStatus::is_locked`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_document_usernames_UsernameStatus_is_locked (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus) -> bool { let obj = dash_spv_platform :: document :: usernames :: UsernameStatus :: is_locked (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } } } pub mod contract { use crate as dash_spv_apple_bindings ; pub mod manager { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ContractValidator`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_platform_contract_manager_ContractValidator { None = 0 , AcceptNotFoundAsNotAnError = 1 } impl ferment :: FFIConversionFrom < dash_spv_platform :: contract :: manager :: ContractValidator > for dash_spv_platform_contract_manager_ContractValidator { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_contract_manager_ContractValidator) -> dash_spv_platform :: contract :: manager :: ContractValidator { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_platform_contract_manager_ContractValidator :: None => dash_spv_platform :: contract :: manager :: ContractValidator :: None , dash_spv_platform_contract_manager_ContractValidator :: AcceptNotFoundAsNotAnError => dash_spv_platform :: contract :: manager :: ContractValidator :: AcceptNotFoundAsNotAnError } } } impl ferment :: FFIConversionTo < dash_spv_platform :: contract :: manager :: ContractValidator > for dash_spv_platform_contract_manager_ContractValidator { unsafe fn ffi_to_const (obj : dash_spv_platform :: contract :: manager :: ContractValidator) -> * const dash_spv_platform_contract_manager_ContractValidator { ferment :: boxed (match obj { dash_spv_platform :: contract :: manager :: ContractValidator :: None => dash_spv_platform_contract_manager_ContractValidator :: None , dash_spv_platform :: contract :: manager :: ContractValidator :: AcceptNotFoundAsNotAnError => dash_spv_platform_contract_manager_ContractValidator :: AcceptNotFoundAsNotAnError , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_platform_contract_manager_ContractValidator { fn drop (& mut self) { unsafe { match self { dash_spv_platform_contract_manager_ContractValidator :: None => { } , dash_spv_platform_contract_manager_ContractValidator :: AcceptNotFoundAsNotAnError => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_contract_manager_ContractValidator_None_ctor () -> * mut dash_spv_platform_contract_manager_ContractValidator { ferment :: boxed (dash_spv_platform_contract_manager_ContractValidator :: None { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_contract_manager_ContractValidator_AcceptNotFoundAsNotAnError_ctor () -> * mut dash_spv_platform_contract_manager_ContractValidator { ferment :: boxed (dash_spv_platform_contract_manager_ContractValidator :: AcceptNotFoundAsNotAnError { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_contract_manager_ContractValidator_destroy < > (ffi : * mut dash_spv_platform_contract_manager_ContractValidator) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`dash_spv_platform::contract::manager::ContractsManager::contract_serialized`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_contract_manager_ContractsManager_contract_serialized (self_ : * mut dash_spv_platform :: contract :: manager :: ContractsManager , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_platform_error_Error { let obj = dash_spv_platform :: contract :: manager :: ContractsManager :: contract_serialized (& * self_ , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::contract::manager::ContractsManager::contract_serialized_hash`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_contract_manager_ContractsManager_contract_serialized_hash (self_ : * mut dash_spv_platform :: contract :: manager :: ContractsManager , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract) -> * mut crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_platform_error_Error { let obj = dash_spv_platform :: contract :: manager :: ContractsManager :: contract_serialized_hash (& * self_ , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract)) ; < crate :: fermented :: generics :: Result_ok_Vec_u8_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::contract::manager::ContractsManager::load_system_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_contract_manager_ContractsManager_load_system_contract (self_ : * mut dash_spv_platform :: contract :: manager :: ContractsManager , contract : * mut crate :: fermented :: types :: data_contracts :: data_contracts_SystemDataContract) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract { let obj = dash_spv_platform :: contract :: manager :: ContractsManager :: load_system_contract (& * self_ , < crate :: fermented :: types :: data_contracts :: data_contracts_SystemDataContract as ferment :: FFIConversionFrom < data_contracts :: SystemDataContract >> :: ffi_from (contract)) ; < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionTo < dpp :: data_contract :: DataContract >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::contract::manager::ContractsManager::load_dashpay_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_contract_manager_ContractsManager_load_dashpay_contract (self_ : * mut dash_spv_platform :: contract :: manager :: ContractsManager) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract { let obj = dash_spv_platform :: contract :: manager :: ContractsManager :: load_dashpay_contract (& * self_) ; < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionTo < dpp :: data_contract :: DataContract >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::contract::manager::ContractsManager::load_dpns_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_contract_manager_ContractsManager_load_dpns_contract (self_ : * mut dash_spv_platform :: contract :: manager :: ContractsManager) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract { let obj = dash_spv_platform :: contract :: manager :: ContractsManager :: load_dpns_contract (& * self_) ; < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionTo < dpp :: data_contract :: DataContract >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::contract::manager::ContractsManager::fetch_contract_by_id_bytes`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_contract_manager_ContractsManager_fetch_contract_by_id_bytes (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: contract :: manager :: ContractsManager , id_bytes : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: contract :: manager :: ContractsManager :: fetch_contract_by_id_bytes (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (id_bytes)) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: data_contract :: DataContract > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::contract::manager::ContractsManager::fetch_contract_by_id`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_contract_manager_ContractsManager_fetch_contract_by_id (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: contract :: manager :: ContractsManager , id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: contract :: manager :: ContractsManager :: fetch_contract_by_id (& * self_ , < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (id)) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: data_contract :: DataContract > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::contract::manager::ContractsManager::fetch_contract_by_id_error_if_none`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_contract_manager_ContractsManager_fetch_contract_by_id_error_if_none (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: contract :: manager :: ContractsManager , id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut crate :: fermented :: generics :: Result_ok_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: contract :: manager :: ContractsManager :: fetch_contract_by_id_error_if_none (& * self_ , < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (id)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: data_contract :: DataContract , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::contract::manager::ContractsManager::contract_registration_transition`]"] # [cfg (feature = "state-transitions")] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_contract_manager_ContractsManager_contract_registration_transition (self_ : * mut dash_spv_platform :: contract :: manager :: ContractsManager , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition_err_dash_spv_platform_error_Error { let obj = dash_spv_platform :: contract :: manager :: ContractsManager :: contract_registration_transition (& * self_ , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract)) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: DataContractCreateTransition , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::contract::manager::ContractsManager::monitor`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_contract_manager_ContractsManager_monitor (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: contract :: manager :: ContractsManager , unique_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: contract :: manager :: dash_spv_platform_contract_manager_ContractValidator) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: contract :: manager :: ContractsManager :: monitor (& * self_ , < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (unique_id) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: contract :: manager :: dash_spv_platform_contract_manager_ContractValidator as ferment :: FFIConversionFrom < dash_spv_platform :: contract :: manager :: ContractValidator >> :: ffi_from (options)) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: data_contract :: DataContract > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::contract::manager::ContractsManager::monitor_for_id_bytes`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_contract_manager_ContractsManager_monitor_for_id_bytes (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: contract :: manager :: ContractsManager , unique_id : * mut crate :: fermented :: generics :: Arr_u8_32 , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: contract :: manager :: dash_spv_platform_contract_manager_ContractValidator) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: contract :: manager :: ContractsManager :: monitor_for_id_bytes (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (unique_id) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: contract :: manager :: dash_spv_platform_contract_manager_ContractValidator as ferment :: FFIConversionFrom < dash_spv_platform :: contract :: manager :: ContractValidator >> :: ffi_from (options)) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: data_contract :: DataContract > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::contract::manager::ContractsManager::monitor_with_delay`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_contract_manager_ContractsManager_monitor_with_delay (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: contract :: manager :: ContractsManager , unique_id : * mut crate :: fermented :: generics :: Arr_u8_32 , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: contract :: manager :: dash_spv_platform_contract_manager_ContractValidator , delay : u64) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: contract :: manager :: ContractsManager :: monitor_with_delay (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (unique_id) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: contract :: manager :: dash_spv_platform_contract_manager_ContractValidator as ferment :: FFIConversionFrom < dash_spv_platform :: contract :: manager :: ContractValidator >> :: ffi_from (options) , delay) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: data_contract :: DataContract > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::contract::manager::has_equal_document_type_keys`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_contract_manager_has_equal_document_type_keys (contract1 : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , contract2 : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract) -> bool { let obj = dash_spv_platform :: contract :: manager :: has_equal_document_type_keys (< crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract1) , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract2)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::contract::manager::is_document_defined_for_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_contract_manager_is_document_defined_for_type (contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , ty : * mut std :: os :: raw :: c_char) -> bool { let obj = dash_spv_platform :: contract :: manager :: is_document_defined_for_type (< crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (ty)))) ; obj } } } pub mod util { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`RetryStrategy`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_platform_util_RetryStrategy { None , Linear (u32) , SlowingDown20Percent (u32) , SlowingDown50Percent (u32) } impl ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy > for dash_spv_platform_util_RetryStrategy { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_util_RetryStrategy) -> dash_spv_platform :: util :: RetryStrategy { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_platform_util_RetryStrategy :: None => dash_spv_platform :: util :: RetryStrategy :: None , dash_spv_platform_util_RetryStrategy :: Linear (o_0) => dash_spv_platform :: util :: RetryStrategy :: Linear (* o_0) , dash_spv_platform_util_RetryStrategy :: SlowingDown20Percent (o_0) => dash_spv_platform :: util :: RetryStrategy :: SlowingDown20Percent (* o_0) , dash_spv_platform_util_RetryStrategy :: SlowingDown50Percent (o_0) => dash_spv_platform :: util :: RetryStrategy :: SlowingDown50Percent (* o_0) } } } impl ferment :: FFIConversionTo < dash_spv_platform :: util :: RetryStrategy > for dash_spv_platform_util_RetryStrategy { unsafe fn ffi_to_const (obj : dash_spv_platform :: util :: RetryStrategy) -> * const dash_spv_platform_util_RetryStrategy { ferment :: boxed (match obj { dash_spv_platform :: util :: RetryStrategy :: None => dash_spv_platform_util_RetryStrategy :: None , dash_spv_platform :: util :: RetryStrategy :: Linear (o_0) => dash_spv_platform_util_RetryStrategy :: Linear (o_0) , dash_spv_platform :: util :: RetryStrategy :: SlowingDown20Percent (o_0) => dash_spv_platform_util_RetryStrategy :: SlowingDown20Percent (o_0) , dash_spv_platform :: util :: RetryStrategy :: SlowingDown50Percent (o_0) => dash_spv_platform_util_RetryStrategy :: SlowingDown50Percent (o_0) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_platform_util_RetryStrategy { fn drop (& mut self) { unsafe { match self { dash_spv_platform_util_RetryStrategy :: None => { } , dash_spv_platform_util_RetryStrategy :: Linear (o_0) => { ; } , dash_spv_platform_util_RetryStrategy :: SlowingDown20Percent (o_0) => { ; } , dash_spv_platform_util_RetryStrategy :: SlowingDown50Percent (o_0) => { ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_util_RetryStrategy_None_ctor () -> * mut dash_spv_platform_util_RetryStrategy { ferment :: boxed (dash_spv_platform_util_RetryStrategy :: None { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_util_RetryStrategy_Linear_ctor (o_o_0 : u32) -> * mut dash_spv_platform_util_RetryStrategy { ferment :: boxed (dash_spv_platform_util_RetryStrategy :: Linear (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_util_RetryStrategy_SlowingDown20Percent_ctor (o_o_0 : u32) -> * mut dash_spv_platform_util_RetryStrategy { ferment :: boxed (dash_spv_platform_util_RetryStrategy :: SlowingDown20Percent (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_util_RetryStrategy_SlowingDown50Percent_ctor (o_o_0 : u32) -> * mut dash_spv_platform_util_RetryStrategy { ferment :: boxed (dash_spv_platform_util_RetryStrategy :: SlowingDown50Percent (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_util_RetryStrategy_destroy < > (ffi : * mut dash_spv_platform_util_RetryStrategy) { ferment :: unbox_any (ffi) ; } } pub mod models { use crate as dash_spv_apple_bindings ; pub mod contact_request { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ContactRequest`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_platform_models_contact_request_ContactRequest { pub id : * mut crate :: fermented :: generics :: Arr_u8_32 , pub owner_id : * mut crate :: fermented :: generics :: Arr_u8_32 , pub recipient : * mut crate :: fermented :: generics :: Arr_u8_32 , pub encrypted_account_label : * mut crate :: fermented :: generics :: Vec_u8 , pub encrypted_public_key : * mut crate :: fermented :: generics :: Vec_u8 , pub account_reference : u32 , pub sender_key_index : u32 , pub recipient_key_index : u32 , pub created_at : u64 } impl ferment :: FFIConversionFrom < dash_spv_platform :: models :: contact_request :: ContactRequest > for dash_spv_platform_models_contact_request_ContactRequest { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_models_contact_request_ContactRequest) -> dash_spv_platform :: models :: contact_request :: ContactRequest { let ffi_ref = & * ffi ; dash_spv_platform :: models :: contact_request :: ContactRequest { id : < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (ffi_ref . id) , owner_id : < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (ffi_ref . owner_id) , recipient : < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (ffi_ref . recipient) , encrypted_account_label : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from_opt (ffi_ref . encrypted_account_label) , encrypted_public_key : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (ffi_ref . encrypted_public_key) , account_reference : ffi_ref . account_reference , sender_key_index : ffi_ref . sender_key_index , recipient_key_index : ffi_ref . recipient_key_index , created_at : ffi_ref . created_at } } } impl ferment :: FFIConversionTo < dash_spv_platform :: models :: contact_request :: ContactRequest > for dash_spv_platform_models_contact_request_ContactRequest { unsafe fn ffi_to_const (obj : dash_spv_platform :: models :: contact_request :: ContactRequest) -> * const dash_spv_platform_models_contact_request_ContactRequest { ferment :: boxed (dash_spv_platform_models_contact_request_ContactRequest { id : < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj . id) , owner_id : < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj . owner_id) , recipient : < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj . recipient) , encrypted_account_label : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to_opt (obj . encrypted_account_label) , encrypted_public_key : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj . encrypted_public_key) , account_reference : obj . account_reference , sender_key_index : obj . sender_key_index , recipient_key_index : obj . recipient_key_index , created_at : obj . created_at }) } } impl Drop for dash_spv_platform_models_contact_request_ContactRequest { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . id) ; ferment :: unbox_any (ffi_ref . owner_id) ; ferment :: unbox_any (ffi_ref . recipient) ; ferment :: unbox_any_opt (ffi_ref . encrypted_account_label) ; ferment :: unbox_any (ffi_ref . encrypted_public_key) ; ; ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_ctor < > (id : * mut crate :: fermented :: generics :: Arr_u8_32 , owner_id : * mut crate :: fermented :: generics :: Arr_u8_32 , recipient : * mut crate :: fermented :: generics :: Arr_u8_32 , encrypted_account_label : * mut crate :: fermented :: generics :: Vec_u8 , encrypted_public_key : * mut crate :: fermented :: generics :: Vec_u8 , account_reference : u32 , sender_key_index : u32 , recipient_key_index : u32 , created_at : u64) -> * mut dash_spv_platform_models_contact_request_ContactRequest { ferment :: boxed (dash_spv_platform_models_contact_request_ContactRequest { id , owner_id , recipient , encrypted_account_label , encrypted_public_key , account_reference , sender_key_index , recipient_key_index , created_at }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_destroy < > (ffi : * mut dash_spv_platform_models_contact_request_ContactRequest) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_get_id < > (obj : * const dash_spv_platform_models_contact_request_ContactRequest) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_get_owner_id < > (obj : * const dash_spv_platform_models_contact_request_ContactRequest) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . owner_id } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_get_recipient < > (obj : * const dash_spv_platform_models_contact_request_ContactRequest) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . recipient } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_get_encrypted_account_label < > (obj : * const dash_spv_platform_models_contact_request_ContactRequest) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . encrypted_account_label } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_get_encrypted_public_key < > (obj : * const dash_spv_platform_models_contact_request_ContactRequest) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . encrypted_public_key } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_get_account_reference < > (obj : * const dash_spv_platform_models_contact_request_ContactRequest) -> u32 { (* obj) . account_reference } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_get_sender_key_index < > (obj : * const dash_spv_platform_models_contact_request_ContactRequest) -> u32 { (* obj) . sender_key_index } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_get_recipient_key_index < > (obj : * const dash_spv_platform_models_contact_request_ContactRequest) -> u32 { (* obj) . recipient_key_index } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_get_created_at < > (obj : * const dash_spv_platform_models_contact_request_ContactRequest) -> u64 { (* obj) . created_at } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_set_id < > (obj : * const dash_spv_platform_models_contact_request_ContactRequest) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_set_owner_id < > (obj : * const dash_spv_platform_models_contact_request_ContactRequest) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . owner_id } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_set_recipient < > (obj : * const dash_spv_platform_models_contact_request_ContactRequest) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . recipient } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_set_encrypted_account_label < > (obj : * const dash_spv_platform_models_contact_request_ContactRequest) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . encrypted_account_label } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_set_encrypted_public_key < > (obj : * const dash_spv_platform_models_contact_request_ContactRequest) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . encrypted_public_key } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_set_account_reference < > (obj : * const dash_spv_platform_models_contact_request_ContactRequest) -> u32 { (* obj) . account_reference } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_set_sender_key_index < > (obj : * const dash_spv_platform_models_contact_request_ContactRequest) -> u32 { (* obj) . sender_key_index } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_set_recipient_key_index < > (obj : * const dash_spv_platform_models_contact_request_ContactRequest) -> u32 { (* obj) . recipient_key_index } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequest_set_created_at < > (obj : * const dash_spv_platform_models_contact_request_ContactRequest) -> u64 { (* obj) . created_at } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ContactRequestKind`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_platform_models_contact_request_ContactRequestKind { Incoming (* mut crate :: fermented :: types :: dash_spv_platform :: models :: contact_request :: dash_spv_platform_models_contact_request_ContactRequest) , Outgoing (* mut crate :: fermented :: types :: dash_spv_platform :: models :: contact_request :: dash_spv_platform_models_contact_request_ContactRequest) } impl ferment :: FFIConversionFrom < dash_spv_platform :: models :: contact_request :: ContactRequestKind > for dash_spv_platform_models_contact_request_ContactRequestKind { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_models_contact_request_ContactRequestKind) -> dash_spv_platform :: models :: contact_request :: ContactRequestKind { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_platform_models_contact_request_ContactRequestKind :: Incoming (o_0) => dash_spv_platform :: models :: contact_request :: ContactRequestKind :: Incoming (< crate :: fermented :: types :: dash_spv_platform :: models :: contact_request :: dash_spv_platform_models_contact_request_ContactRequest as ferment :: FFIConversionFrom < dash_spv_platform :: models :: contact_request :: ContactRequest >> :: ffi_from (* o_0)) , dash_spv_platform_models_contact_request_ContactRequestKind :: Outgoing (o_0) => dash_spv_platform :: models :: contact_request :: ContactRequestKind :: Outgoing (< crate :: fermented :: types :: dash_spv_platform :: models :: contact_request :: dash_spv_platform_models_contact_request_ContactRequest as ferment :: FFIConversionFrom < dash_spv_platform :: models :: contact_request :: ContactRequest >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dash_spv_platform :: models :: contact_request :: ContactRequestKind > for dash_spv_platform_models_contact_request_ContactRequestKind { unsafe fn ffi_to_const (obj : dash_spv_platform :: models :: contact_request :: ContactRequestKind) -> * const dash_spv_platform_models_contact_request_ContactRequestKind { ferment :: boxed (match obj { dash_spv_platform :: models :: contact_request :: ContactRequestKind :: Incoming (o_0) => dash_spv_platform_models_contact_request_ContactRequestKind :: Incoming (< crate :: fermented :: types :: dash_spv_platform :: models :: contact_request :: dash_spv_platform_models_contact_request_ContactRequest as ferment :: FFIConversionTo < dash_spv_platform :: models :: contact_request :: ContactRequest >> :: ffi_to (o_0)) , dash_spv_platform :: models :: contact_request :: ContactRequestKind :: Outgoing (o_0) => dash_spv_platform_models_contact_request_ContactRequestKind :: Outgoing (< crate :: fermented :: types :: dash_spv_platform :: models :: contact_request :: dash_spv_platform_models_contact_request_ContactRequest as ferment :: FFIConversionTo < dash_spv_platform :: models :: contact_request :: ContactRequest >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_platform_models_contact_request_ContactRequestKind { fn drop (& mut self) { unsafe { match self { dash_spv_platform_models_contact_request_ContactRequestKind :: Incoming (o_0) => { ferment :: unbox_any (* o_0) ; } , dash_spv_platform_models_contact_request_ContactRequestKind :: Outgoing (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequestKind_Incoming_ctor (o_o_0 : * mut crate :: fermented :: types :: dash_spv_platform :: models :: contact_request :: dash_spv_platform_models_contact_request_ContactRequest) -> * mut dash_spv_platform_models_contact_request_ContactRequestKind { ferment :: boxed (dash_spv_platform_models_contact_request_ContactRequestKind :: Incoming (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequestKind_Outgoing_ctor (o_o_0 : * mut crate :: fermented :: types :: dash_spv_platform :: models :: contact_request :: dash_spv_platform_models_contact_request_ContactRequest) -> * mut dash_spv_platform_models_contact_request_ContactRequestKind { ferment :: boxed (dash_spv_platform_models_contact_request_ContactRequestKind :: Outgoing (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contact_request_ContactRequestKind_destroy < > (ffi : * mut dash_spv_platform_models_contact_request_ContactRequestKind) { ferment :: unbox_any (ffi) ; } } pub mod profile { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`Profile`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_platform_models_profile_Profile { pub updated_at : u64 , pub created_at : u64 , pub revision : u64 , pub public_message : * mut std :: os :: raw :: c_char , pub avatar_url : * mut std :: os :: raw :: c_char , pub avatar_fingerprint : * mut crate :: fermented :: generics :: Vec_u8 , pub avatar_hash : * mut crate :: fermented :: generics :: Vec_u8 , pub display_name : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dash_spv_platform :: models :: profile :: Profile > for dash_spv_platform_models_profile_Profile { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_models_profile_Profile) -> dash_spv_platform :: models :: profile :: Profile { let ffi_ref = & * ffi ; dash_spv_platform :: models :: profile :: Profile { updated_at : ffi_ref . updated_at , created_at : ffi_ref . created_at , revision : ffi_ref . revision , public_message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (ffi_ref . public_message) , avatar_url : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (ffi_ref . avatar_url) , avatar_fingerprint : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from_opt (ffi_ref . avatar_fingerprint) , avatar_hash : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from_opt (ffi_ref . avatar_hash) , display_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (ffi_ref . display_name) } } } impl ferment :: FFIConversionTo < dash_spv_platform :: models :: profile :: Profile > for dash_spv_platform_models_profile_Profile { unsafe fn ffi_to_const (obj : dash_spv_platform :: models :: profile :: Profile) -> * const dash_spv_platform_models_profile_Profile { ferment :: boxed (dash_spv_platform_models_profile_Profile { updated_at : obj . updated_at , created_at : obj . created_at , revision : obj . revision , public_message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj . public_message) , avatar_url : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj . avatar_url) , avatar_fingerprint : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to_opt (obj . avatar_fingerprint) , avatar_hash : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to_opt (obj . avatar_hash) , display_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj . display_name) }) } } impl Drop for dash_spv_platform_models_profile_Profile { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ; ferment :: unbox_any_opt (ffi_ref . public_message) ; ferment :: unbox_any_opt (ffi_ref . avatar_url) ; ferment :: unbox_any_opt (ffi_ref . avatar_fingerprint) ; ferment :: unbox_any_opt (ffi_ref . avatar_hash) ; ferment :: unbox_any_opt (ffi_ref . display_name) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_profile_Profile_ctor < > (updated_at : u64 , created_at : u64 , revision : u64 , public_message : * mut std :: os :: raw :: c_char , avatar_url : * mut std :: os :: raw :: c_char , avatar_fingerprint : * mut crate :: fermented :: generics :: Vec_u8 , avatar_hash : * mut crate :: fermented :: generics :: Vec_u8 , display_name : * mut std :: os :: raw :: c_char) -> * mut dash_spv_platform_models_profile_Profile { ferment :: boxed (dash_spv_platform_models_profile_Profile { updated_at , created_at , revision , public_message , avatar_url , avatar_fingerprint , avatar_hash , display_name }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_profile_Profile_destroy < > (ffi : * mut dash_spv_platform_models_profile_Profile) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_profile_Profile_get_updated_at < > (obj : * const dash_spv_platform_models_profile_Profile) -> u64 { (* obj) . updated_at } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_profile_Profile_get_created_at < > (obj : * const dash_spv_platform_models_profile_Profile) -> u64 { (* obj) . created_at } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_profile_Profile_get_revision < > (obj : * const dash_spv_platform_models_profile_Profile) -> u64 { (* obj) . revision } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_profile_Profile_get_public_message < > (obj : * const dash_spv_platform_models_profile_Profile) -> * mut std :: os :: raw :: c_char { (* obj) . public_message } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_profile_Profile_get_avatar_url < > (obj : * const dash_spv_platform_models_profile_Profile) -> * mut std :: os :: raw :: c_char { (* obj) . avatar_url } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_profile_Profile_get_avatar_fingerprint < > (obj : * const dash_spv_platform_models_profile_Profile) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . avatar_fingerprint } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_profile_Profile_get_avatar_hash < > (obj : * const dash_spv_platform_models_profile_Profile) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . avatar_hash } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_profile_Profile_get_display_name < > (obj : * const dash_spv_platform_models_profile_Profile) -> * mut std :: os :: raw :: c_char { (* obj) . display_name } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_profile_Profile_set_updated_at < > (obj : * const dash_spv_platform_models_profile_Profile) -> u64 { (* obj) . updated_at } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_profile_Profile_set_created_at < > (obj : * const dash_spv_platform_models_profile_Profile) -> u64 { (* obj) . created_at } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_profile_Profile_set_revision < > (obj : * const dash_spv_platform_models_profile_Profile) -> u64 { (* obj) . revision } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_profile_Profile_set_public_message < > (obj : * const dash_spv_platform_models_profile_Profile) -> * mut std :: os :: raw :: c_char { (* obj) . public_message } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_profile_Profile_set_avatar_url < > (obj : * const dash_spv_platform_models_profile_Profile) -> * mut std :: os :: raw :: c_char { (* obj) . avatar_url } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_profile_Profile_set_avatar_fingerprint < > (obj : * const dash_spv_platform_models_profile_Profile) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . avatar_fingerprint } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_profile_Profile_set_avatar_hash < > (obj : * const dash_spv_platform_models_profile_Profile) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . avatar_hash } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_profile_Profile_set_display_name < > (obj : * const dash_spv_platform_models_profile_Profile) -> * mut std :: os :: raw :: c_char { (* obj) . display_name } } pub mod transient_dashpay_user { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TransientDashPayUser`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { pub display_name : * mut std :: os :: raw :: c_char , pub avatar_url : * mut std :: os :: raw :: c_char , pub avatar_fingerprint : * mut crate :: fermented :: generics :: Vec_u8 , pub avatar_hash : * mut crate :: fermented :: types :: platform_value :: platform_value_Hash256 , pub public_message : * mut std :: os :: raw :: c_char , pub revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision , pub document_identifier : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub created_at : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis , pub updated_at : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis } impl ferment :: FFIConversionFrom < dash_spv_platform :: models :: transient_dashpay_user :: TransientDashPayUser > for dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> dash_spv_platform :: models :: transient_dashpay_user :: TransientDashPayUser { let ffi_ref = & * ffi ; dash_spv_platform :: models :: transient_dashpay_user :: TransientDashPayUser { display_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (ffi_ref . display_name) , avatar_url : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (ffi_ref . avatar_url) , avatar_fingerprint : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from_opt (ffi_ref . avatar_fingerprint) , avatar_hash : < crate :: fermented :: types :: platform_value :: platform_value_Hash256 as ferment :: FFIConversionFrom < platform_value :: Hash256 >> :: ffi_from_opt (ffi_ref . avatar_hash) , public_message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (ffi_ref . public_message) , revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionFrom < dpp :: prelude :: Revision >> :: ffi_from_opt (ffi_ref . revision) , document_identifier : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . document_identifier) , created_at : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis as ferment :: FFIConversionFrom < dpp :: prelude :: TimestampMillis >> :: ffi_from_opt (ffi_ref . created_at) , updated_at : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis as ferment :: FFIConversionFrom < dpp :: prelude :: TimestampMillis >> :: ffi_from_opt (ffi_ref . updated_at) } } } impl ferment :: FFIConversionTo < dash_spv_platform :: models :: transient_dashpay_user :: TransientDashPayUser > for dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { unsafe fn ffi_to_const (obj : dash_spv_platform :: models :: transient_dashpay_user :: TransientDashPayUser) -> * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { ferment :: boxed (dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { display_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj . display_name) , avatar_url : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj . avatar_url) , avatar_fingerprint : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to_opt (obj . avatar_fingerprint) , avatar_hash : < crate :: fermented :: types :: platform_value :: platform_value_Hash256 as ferment :: FFIConversionTo < platform_value :: Hash256 >> :: ffi_to_opt (obj . avatar_hash) , public_message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj . public_message) , revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionTo < dpp :: prelude :: Revision >> :: ffi_to_opt (obj . revision) , document_identifier : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . document_identifier) , created_at : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis as ferment :: FFIConversionTo < dpp :: prelude :: TimestampMillis >> :: ffi_to_opt (obj . created_at) , updated_at : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis as ferment :: FFIConversionTo < dpp :: prelude :: TimestampMillis >> :: ffi_to_opt (obj . updated_at) }) } } impl Drop for dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any_opt (ffi_ref . display_name) ; ferment :: unbox_any_opt (ffi_ref . avatar_url) ; ferment :: unbox_any_opt (ffi_ref . avatar_fingerprint) ; ferment :: unbox_any_opt (ffi_ref . avatar_hash) ; ferment :: unbox_any_opt (ffi_ref . public_message) ; ferment :: unbox_any_opt (ffi_ref . revision) ; ferment :: unbox_any (ffi_ref . document_identifier) ; ferment :: unbox_any_opt (ffi_ref . created_at) ; ferment :: unbox_any_opt (ffi_ref . updated_at) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_ctor < > (display_name : * mut std :: os :: raw :: c_char , avatar_url : * mut std :: os :: raw :: c_char , avatar_fingerprint : * mut crate :: fermented :: generics :: Vec_u8 , avatar_hash : * mut crate :: fermented :: types :: platform_value :: platform_value_Hash256 , public_message : * mut std :: os :: raw :: c_char , revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision , document_identifier : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , created_at : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis , updated_at : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis) -> * mut dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { ferment :: boxed (dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { display_name , avatar_url , avatar_fingerprint , avatar_hash , public_message , revision , document_identifier , created_at , updated_at }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_destroy < > (ffi : * mut dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_get_display_name < > (obj : * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut std :: os :: raw :: c_char { (* obj) . display_name } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_get_avatar_url < > (obj : * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut std :: os :: raw :: c_char { (* obj) . avatar_url } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_get_avatar_fingerprint < > (obj : * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . avatar_fingerprint } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_get_avatar_hash < > (obj : * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut crate :: fermented :: types :: platform_value :: platform_value_Hash256 { (* obj) . avatar_hash } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_get_public_message < > (obj : * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut std :: os :: raw :: c_char { (* obj) . public_message } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_get_revision < > (obj : * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . revision } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_get_document_identifier < > (obj : * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_identifier } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_get_created_at < > (obj : * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis { (* obj) . created_at } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_get_updated_at < > (obj : * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis { (* obj) . updated_at } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_set_display_name < > (obj : * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut std :: os :: raw :: c_char { (* obj) . display_name } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_set_avatar_url < > (obj : * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut std :: os :: raw :: c_char { (* obj) . avatar_url } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_set_avatar_fingerprint < > (obj : * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . avatar_fingerprint } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_set_avatar_hash < > (obj : * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut crate :: fermented :: types :: platform_value :: platform_value_Hash256 { (* obj) . avatar_hash } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_set_public_message < > (obj : * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut std :: os :: raw :: c_char { (* obj) . public_message } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_set_revision < > (obj : * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . revision } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_set_document_identifier < > (obj : * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_identifier } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_set_created_at < > (obj : * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis { (* obj) . created_at } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_set_updated_at < > (obj : * const dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis { (* obj) . updated_at } } pub mod contract { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ContractModel`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_platform_models_contract_ContractModel { pub chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType , pub data_contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , pub state : * mut crate :: fermented :: types :: dash_spv_platform :: models :: contract :: dash_spv_platform_models_contract_ContractState , pub local_identifier : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dash_spv_platform :: models :: contract :: ContractModel > for dash_spv_platform_models_contract_ContractModel { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_models_contract_ContractModel) -> dash_spv_platform :: models :: contract :: ContractModel { let ffi_ref = & * ffi ; dash_spv_platform :: models :: contract :: ContractModel { chain_type : < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (ffi_ref . chain_type) , data_contract : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (ffi_ref . data_contract) , state : < crate :: fermented :: types :: dash_spv_platform :: models :: contract :: dash_spv_platform_models_contract_ContractState as ferment :: FFIConversionFrom < dash_spv_platform :: models :: contract :: ContractState >> :: ffi_from (ffi_ref . state) , local_identifier : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . local_identifier) } } } impl ferment :: FFIConversionTo < dash_spv_platform :: models :: contract :: ContractModel > for dash_spv_platform_models_contract_ContractModel { unsafe fn ffi_to_const (obj : dash_spv_platform :: models :: contract :: ContractModel) -> * const dash_spv_platform_models_contract_ContractModel { ferment :: boxed (dash_spv_platform_models_contract_ContractModel { chain_type : < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionTo < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_to (obj . chain_type) , data_contract : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionTo < dpp :: data_contract :: DataContract >> :: ffi_to (obj . data_contract) , state : < crate :: fermented :: types :: dash_spv_platform :: models :: contract :: dash_spv_platform_models_contract_ContractState as ferment :: FFIConversionTo < dash_spv_platform :: models :: contract :: ContractState >> :: ffi_to (obj . state) , local_identifier : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . local_identifier) }) } } impl Drop for dash_spv_platform_models_contract_ContractModel { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . chain_type) ; ferment :: unbox_any (ffi_ref . data_contract) ; ferment :: unbox_any (ffi_ref . state) ; ferment :: unbox_string (ffi_ref . local_identifier) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contract_ContractModel_ctor < > (chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType , data_contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , state : * mut crate :: fermented :: types :: dash_spv_platform :: models :: contract :: dash_spv_platform_models_contract_ContractState , local_identifier : * mut std :: os :: raw :: c_char) -> * mut dash_spv_platform_models_contract_ContractModel { ferment :: boxed (dash_spv_platform_models_contract_ContractModel { chain_type , data_contract , state , local_identifier }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contract_ContractModel_destroy < > (ffi : * mut dash_spv_platform_models_contract_ContractModel) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contract_ContractModel_get_chain_type < > (obj : * const dash_spv_platform_models_contract_ContractModel) -> * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType { (* obj) . chain_type } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contract_ContractModel_get_data_contract < > (obj : * const dash_spv_platform_models_contract_ContractModel) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract { (* obj) . data_contract } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contract_ContractModel_get_state < > (obj : * const dash_spv_platform_models_contract_ContractModel) -> * mut crate :: fermented :: types :: dash_spv_platform :: models :: contract :: dash_spv_platform_models_contract_ContractState { (* obj) . state } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contract_ContractModel_get_local_identifier < > (obj : * const dash_spv_platform_models_contract_ContractModel) -> * mut std :: os :: raw :: c_char { (* obj) . local_identifier } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contract_ContractModel_set_chain_type < > (obj : * const dash_spv_platform_models_contract_ContractModel) -> * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType { (* obj) . chain_type } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contract_ContractModel_set_data_contract < > (obj : * const dash_spv_platform_models_contract_ContractModel) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract { (* obj) . data_contract } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contract_ContractModel_set_state < > (obj : * const dash_spv_platform_models_contract_ContractModel) -> * mut crate :: fermented :: types :: dash_spv_platform :: models :: contract :: dash_spv_platform_models_contract_ContractState { (* obj) . state } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contract_ContractModel_set_local_identifier < > (obj : * const dash_spv_platform_models_contract_ContractModel) -> * mut std :: os :: raw :: c_char { (* obj) . local_identifier } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ContractState`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_platform_models_contract_ContractState { Unknown , NotRegistered , Registered , Registering } impl ferment :: FFIConversionFrom < dash_spv_platform :: models :: contract :: ContractState > for dash_spv_platform_models_contract_ContractState { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_models_contract_ContractState) -> dash_spv_platform :: models :: contract :: ContractState { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_platform_models_contract_ContractState :: Unknown => dash_spv_platform :: models :: contract :: ContractState :: Unknown , dash_spv_platform_models_contract_ContractState :: NotRegistered => dash_spv_platform :: models :: contract :: ContractState :: NotRegistered , dash_spv_platform_models_contract_ContractState :: Registered => dash_spv_platform :: models :: contract :: ContractState :: Registered , dash_spv_platform_models_contract_ContractState :: Registering => dash_spv_platform :: models :: contract :: ContractState :: Registering } } } impl ferment :: FFIConversionTo < dash_spv_platform :: models :: contract :: ContractState > for dash_spv_platform_models_contract_ContractState { unsafe fn ffi_to_const (obj : dash_spv_platform :: models :: contract :: ContractState) -> * const dash_spv_platform_models_contract_ContractState { ferment :: boxed (match obj { dash_spv_platform :: models :: contract :: ContractState :: Unknown => dash_spv_platform_models_contract_ContractState :: Unknown , dash_spv_platform :: models :: contract :: ContractState :: NotRegistered => dash_spv_platform_models_contract_ContractState :: NotRegistered , dash_spv_platform :: models :: contract :: ContractState :: Registered => dash_spv_platform_models_contract_ContractState :: Registered , dash_spv_platform :: models :: contract :: ContractState :: Registering => dash_spv_platform_models_contract_ContractState :: Registering , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_platform_models_contract_ContractState { fn drop (& mut self) { unsafe { match self { dash_spv_platform_models_contract_ContractState :: Unknown => { } , dash_spv_platform_models_contract_ContractState :: NotRegistered => { } , dash_spv_platform_models_contract_ContractState :: Registered => { } , dash_spv_platform_models_contract_ContractState :: Registering => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contract_ContractState_Unknown_ctor () -> * mut dash_spv_platform_models_contract_ContractState { ferment :: boxed (dash_spv_platform_models_contract_ContractState :: Unknown { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contract_ContractState_NotRegistered_ctor () -> * mut dash_spv_platform_models_contract_ContractState { ferment :: boxed (dash_spv_platform_models_contract_ContractState :: NotRegistered { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contract_ContractState_Registered_ctor () -> * mut dash_spv_platform_models_contract_ContractState { ferment :: boxed (dash_spv_platform_models_contract_ContractState :: Registered { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contract_ContractState_Registering_ctor () -> * mut dash_spv_platform_models_contract_ContractState { ferment :: boxed (dash_spv_platform_models_contract_ContractState :: Registering { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_models_contract_ContractState_destroy < > (ffi : * mut dash_spv_platform_models_contract_ContractState) { ferment :: unbox_any (ffi) ; } } } pub mod identity { use crate as dash_spv_apple_bindings ; pub mod model { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`KeyInfo`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_platform_identity_model_KeyInfo { pub key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , pub key_type : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , pub key_status : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityKeyStatus , pub security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel , pub purpose : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose } impl ferment :: FFIConversionFrom < dash_spv_platform :: identity :: model :: KeyInfo > for dash_spv_platform_identity_model_KeyInfo { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_identity_model_KeyInfo) -> dash_spv_platform :: identity :: model :: KeyInfo { let ffi_ref = & * ffi ; dash_spv_platform :: identity :: model :: KeyInfo { key : < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (ffi_ref . key) , key_type : < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_from (ffi_ref . key_type) , key_status : < crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityKeyStatus as ferment :: FFIConversionFrom < dash_spv_platform :: identity :: model :: IdentityKeyStatus >> :: ffi_from (ffi_ref . key_status) , security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_from (ffi_ref . security_level) , purpose : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: purpose :: Purpose >> :: ffi_from (ffi_ref . purpose) } } } impl ferment :: FFIConversionTo < dash_spv_platform :: identity :: model :: KeyInfo > for dash_spv_platform_identity_model_KeyInfo { unsafe fn ffi_to_const (obj : dash_spv_platform :: identity :: model :: KeyInfo) -> * const dash_spv_platform_identity_model_KeyInfo { ferment :: boxed (dash_spv_platform_identity_model_KeyInfo { key : < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_to (obj . key) , key_type : < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_to (obj . key_type) , key_status : < crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityKeyStatus as ferment :: FFIConversionTo < dash_spv_platform :: identity :: model :: IdentityKeyStatus >> :: ffi_to (obj . key_status) , security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_to (obj . security_level) , purpose : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: purpose :: Purpose >> :: ffi_to (obj . purpose) }) } } impl Drop for dash_spv_platform_identity_model_KeyInfo { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . key) ; ferment :: unbox_any (ffi_ref . key_type) ; ferment :: unbox_any (ffi_ref . key_status) ; ferment :: unbox_any (ffi_ref . security_level) ; ferment :: unbox_any (ffi_ref . purpose) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_KeyInfo_ctor < > (key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , key_type : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , key_status : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityKeyStatus , security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel , purpose : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose) -> * mut dash_spv_platform_identity_model_KeyInfo { ferment :: boxed (dash_spv_platform_identity_model_KeyInfo { key , key_type , key_status , security_level , purpose }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_KeyInfo_destroy < > (ffi : * mut dash_spv_platform_identity_model_KeyInfo) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_KeyInfo_get_key < > (obj : * const dash_spv_platform_identity_model_KeyInfo) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey { (* obj) . key } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_KeyInfo_get_key_type < > (obj : * const dash_spv_platform_identity_model_KeyInfo) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind { (* obj) . key_type } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_KeyInfo_get_key_status < > (obj : * const dash_spv_platform_identity_model_KeyInfo) -> * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityKeyStatus { (* obj) . key_status } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_KeyInfo_get_security_level < > (obj : * const dash_spv_platform_identity_model_KeyInfo) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . security_level } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_KeyInfo_get_purpose < > (obj : * const dash_spv_platform_identity_model_KeyInfo) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose { (* obj) . purpose } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_KeyInfo_set_key < > (obj : * const dash_spv_platform_identity_model_KeyInfo) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey { (* obj) . key } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_KeyInfo_set_key_type < > (obj : * const dash_spv_platform_identity_model_KeyInfo) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind { (* obj) . key_type } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_KeyInfo_set_key_status < > (obj : * const dash_spv_platform_identity_model_KeyInfo) -> * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityKeyStatus { (* obj) . key_status } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_KeyInfo_set_security_level < > (obj : * const dash_spv_platform_identity_model_KeyInfo) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . security_level } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_KeyInfo_set_purpose < > (obj : * const dash_spv_platform_identity_model_KeyInfo) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose { (* obj) . purpose } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`IdentityRegistrationStatus`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_platform_identity_model_IdentityRegistrationStatus { Unknown = 0 , Registered = 1 , Registering = 2 , NotRegistered = 3 } impl ferment :: FFIConversionFrom < dash_spv_platform :: identity :: model :: IdentityRegistrationStatus > for dash_spv_platform_identity_model_IdentityRegistrationStatus { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_identity_model_IdentityRegistrationStatus) -> dash_spv_platform :: identity :: model :: IdentityRegistrationStatus { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_platform_identity_model_IdentityRegistrationStatus :: Unknown => dash_spv_platform :: identity :: model :: IdentityRegistrationStatus :: Unknown , dash_spv_platform_identity_model_IdentityRegistrationStatus :: Registered => dash_spv_platform :: identity :: model :: IdentityRegistrationStatus :: Registered , dash_spv_platform_identity_model_IdentityRegistrationStatus :: Registering => dash_spv_platform :: identity :: model :: IdentityRegistrationStatus :: Registering , dash_spv_platform_identity_model_IdentityRegistrationStatus :: NotRegistered => dash_spv_platform :: identity :: model :: IdentityRegistrationStatus :: NotRegistered } } } impl ferment :: FFIConversionTo < dash_spv_platform :: identity :: model :: IdentityRegistrationStatus > for dash_spv_platform_identity_model_IdentityRegistrationStatus { unsafe fn ffi_to_const (obj : dash_spv_platform :: identity :: model :: IdentityRegistrationStatus) -> * const dash_spv_platform_identity_model_IdentityRegistrationStatus { ferment :: boxed (match obj { dash_spv_platform :: identity :: model :: IdentityRegistrationStatus :: Unknown => dash_spv_platform_identity_model_IdentityRegistrationStatus :: Unknown , dash_spv_platform :: identity :: model :: IdentityRegistrationStatus :: Registered => dash_spv_platform_identity_model_IdentityRegistrationStatus :: Registered , dash_spv_platform :: identity :: model :: IdentityRegistrationStatus :: Registering => dash_spv_platform_identity_model_IdentityRegistrationStatus :: Registering , dash_spv_platform :: identity :: model :: IdentityRegistrationStatus :: NotRegistered => dash_spv_platform_identity_model_IdentityRegistrationStatus :: NotRegistered , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_platform_identity_model_IdentityRegistrationStatus { fn drop (& mut self) { unsafe { match self { dash_spv_platform_identity_model_IdentityRegistrationStatus :: Unknown => { } , dash_spv_platform_identity_model_IdentityRegistrationStatus :: Registered => { } , dash_spv_platform_identity_model_IdentityRegistrationStatus :: Registering => { } , dash_spv_platform_identity_model_IdentityRegistrationStatus :: NotRegistered => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityRegistrationStatus_Unknown_ctor () -> * mut dash_spv_platform_identity_model_IdentityRegistrationStatus { ferment :: boxed (dash_spv_platform_identity_model_IdentityRegistrationStatus :: Unknown { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityRegistrationStatus_Registered_ctor () -> * mut dash_spv_platform_identity_model_IdentityRegistrationStatus { ferment :: boxed (dash_spv_platform_identity_model_IdentityRegistrationStatus :: Registered { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityRegistrationStatus_Registering_ctor () -> * mut dash_spv_platform_identity_model_IdentityRegistrationStatus { ferment :: boxed (dash_spv_platform_identity_model_IdentityRegistrationStatus :: Registering { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityRegistrationStatus_NotRegistered_ctor () -> * mut dash_spv_platform_identity_model_IdentityRegistrationStatus { ferment :: boxed (dash_spv_platform_identity_model_IdentityRegistrationStatus :: NotRegistered { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityRegistrationStatus_destroy < > (ffi : * mut dash_spv_platform_identity_model_IdentityRegistrationStatus) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`UsernameStatusInfo`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_platform_identity_model_UsernameStatusInfo { pub proper : * mut std :: os :: raw :: c_char , pub domain : * mut std :: os :: raw :: c_char , pub status : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus , pub salt : * mut crate :: fermented :: generics :: Vec_u8 } impl ferment :: FFIConversionFrom < dash_spv_platform :: identity :: model :: UsernameStatusInfo > for dash_spv_platform_identity_model_UsernameStatusInfo { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_identity_model_UsernameStatusInfo) -> dash_spv_platform :: identity :: model :: UsernameStatusInfo { let ffi_ref = & * ffi ; dash_spv_platform :: identity :: model :: UsernameStatusInfo { proper : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (ffi_ref . proper) , domain : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (ffi_ref . domain) , status : < crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus as ferment :: FFIConversionFrom < dash_spv_platform :: document :: usernames :: UsernameStatus >> :: ffi_from (ffi_ref . status) , salt : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (ffi_ref . salt) } } } impl ferment :: FFIConversionTo < dash_spv_platform :: identity :: model :: UsernameStatusInfo > for dash_spv_platform_identity_model_UsernameStatusInfo { unsafe fn ffi_to_const (obj : dash_spv_platform :: identity :: model :: UsernameStatusInfo) -> * const dash_spv_platform_identity_model_UsernameStatusInfo { ferment :: boxed (dash_spv_platform_identity_model_UsernameStatusInfo { proper : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj . proper) , domain : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj . domain) , status : < crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus as ferment :: FFIConversionTo < dash_spv_platform :: document :: usernames :: UsernameStatus >> :: ffi_to (obj . status) , salt : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj . salt) }) } } impl Drop for dash_spv_platform_identity_model_UsernameStatusInfo { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any_opt (ffi_ref . proper) ; ferment :: unbox_any_opt (ffi_ref . domain) ; ferment :: unbox_any (ffi_ref . status) ; ferment :: unbox_any (ffi_ref . salt) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_UsernameStatusInfo_ctor < > (proper : * mut std :: os :: raw :: c_char , domain : * mut std :: os :: raw :: c_char , status : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus , salt : * mut crate :: fermented :: generics :: Vec_u8) -> * mut dash_spv_platform_identity_model_UsernameStatusInfo { ferment :: boxed (dash_spv_platform_identity_model_UsernameStatusInfo { proper , domain , status , salt }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_UsernameStatusInfo_destroy < > (ffi : * mut dash_spv_platform_identity_model_UsernameStatusInfo) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_UsernameStatusInfo_get_proper < > (obj : * const dash_spv_platform_identity_model_UsernameStatusInfo) -> * mut std :: os :: raw :: c_char { (* obj) . proper } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_UsernameStatusInfo_get_domain < > (obj : * const dash_spv_platform_identity_model_UsernameStatusInfo) -> * mut std :: os :: raw :: c_char { (* obj) . domain } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_UsernameStatusInfo_get_status < > (obj : * const dash_spv_platform_identity_model_UsernameStatusInfo) -> * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus { (* obj) . status } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_UsernameStatusInfo_get_salt < > (obj : * const dash_spv_platform_identity_model_UsernameStatusInfo) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . salt } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_UsernameStatusInfo_set_proper < > (obj : * const dash_spv_platform_identity_model_UsernameStatusInfo) -> * mut std :: os :: raw :: c_char { (* obj) . proper } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_UsernameStatusInfo_set_domain < > (obj : * const dash_spv_platform_identity_model_UsernameStatusInfo) -> * mut std :: os :: raw :: c_char { (* obj) . domain } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_UsernameStatusInfo_set_status < > (obj : * const dash_spv_platform_identity_model_UsernameStatusInfo) -> * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus { (* obj) . status } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_UsernameStatusInfo_set_salt < > (obj : * const dash_spv_platform_identity_model_UsernameStatusInfo) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . salt } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`IdentityKeyStatus`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_platform_identity_model_IdentityKeyStatus { Unknown = 0 , Registered = 1 , Registering = 2 , NotRegistered = 3 , Revoked = 4 } impl ferment :: FFIConversionFrom < dash_spv_platform :: identity :: model :: IdentityKeyStatus > for dash_spv_platform_identity_model_IdentityKeyStatus { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_identity_model_IdentityKeyStatus) -> dash_spv_platform :: identity :: model :: IdentityKeyStatus { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_platform_identity_model_IdentityKeyStatus :: Unknown => dash_spv_platform :: identity :: model :: IdentityKeyStatus :: Unknown , dash_spv_platform_identity_model_IdentityKeyStatus :: Registered => dash_spv_platform :: identity :: model :: IdentityKeyStatus :: Registered , dash_spv_platform_identity_model_IdentityKeyStatus :: Registering => dash_spv_platform :: identity :: model :: IdentityKeyStatus :: Registering , dash_spv_platform_identity_model_IdentityKeyStatus :: NotRegistered => dash_spv_platform :: identity :: model :: IdentityKeyStatus :: NotRegistered , dash_spv_platform_identity_model_IdentityKeyStatus :: Revoked => dash_spv_platform :: identity :: model :: IdentityKeyStatus :: Revoked } } } impl ferment :: FFIConversionTo < dash_spv_platform :: identity :: model :: IdentityKeyStatus > for dash_spv_platform_identity_model_IdentityKeyStatus { unsafe fn ffi_to_const (obj : dash_spv_platform :: identity :: model :: IdentityKeyStatus) -> * const dash_spv_platform_identity_model_IdentityKeyStatus { ferment :: boxed (match obj { dash_spv_platform :: identity :: model :: IdentityKeyStatus :: Unknown => dash_spv_platform_identity_model_IdentityKeyStatus :: Unknown , dash_spv_platform :: identity :: model :: IdentityKeyStatus :: Registered => dash_spv_platform_identity_model_IdentityKeyStatus :: Registered , dash_spv_platform :: identity :: model :: IdentityKeyStatus :: Registering => dash_spv_platform_identity_model_IdentityKeyStatus :: Registering , dash_spv_platform :: identity :: model :: IdentityKeyStatus :: NotRegistered => dash_spv_platform_identity_model_IdentityKeyStatus :: NotRegistered , dash_spv_platform :: identity :: model :: IdentityKeyStatus :: Revoked => dash_spv_platform_identity_model_IdentityKeyStatus :: Revoked , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_platform_identity_model_IdentityKeyStatus { fn drop (& mut self) { unsafe { match self { dash_spv_platform_identity_model_IdentityKeyStatus :: Unknown => { } , dash_spv_platform_identity_model_IdentityKeyStatus :: Registered => { } , dash_spv_platform_identity_model_IdentityKeyStatus :: Registering => { } , dash_spv_platform_identity_model_IdentityKeyStatus :: NotRegistered => { } , dash_spv_platform_identity_model_IdentityKeyStatus :: Revoked => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityKeyStatus_Unknown_ctor () -> * mut dash_spv_platform_identity_model_IdentityKeyStatus { ferment :: boxed (dash_spv_platform_identity_model_IdentityKeyStatus :: Unknown { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityKeyStatus_Registered_ctor () -> * mut dash_spv_platform_identity_model_IdentityKeyStatus { ferment :: boxed (dash_spv_platform_identity_model_IdentityKeyStatus :: Registered { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityKeyStatus_Registering_ctor () -> * mut dash_spv_platform_identity_model_IdentityKeyStatus { ferment :: boxed (dash_spv_platform_identity_model_IdentityKeyStatus :: Registering { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityKeyStatus_NotRegistered_ctor () -> * mut dash_spv_platform_identity_model_IdentityKeyStatus { ferment :: boxed (dash_spv_platform_identity_model_IdentityKeyStatus :: NotRegistered { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityKeyStatus_Revoked_ctor () -> * mut dash_spv_platform_identity_model_IdentityKeyStatus { ferment :: boxed (dash_spv_platform_identity_model_IdentityKeyStatus :: Revoked { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityKeyStatus_destroy < > (ffi : * mut dash_spv_platform_identity_model_IdentityKeyStatus) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityRegistrationStatus::to_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityRegistrationStatus_to_index (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityRegistrationStatus) -> u8 { let obj = dash_spv_platform :: identity :: model :: IdentityRegistrationStatus :: to_index (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityRegistrationStatus::from_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityRegistrationStatus_from_index (index : u8) -> * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityRegistrationStatus { let obj = dash_spv_platform :: identity :: model :: IdentityRegistrationStatus :: from_index (index) ; < crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityRegistrationStatus as ferment :: FFIConversionTo < dash_spv_platform :: identity :: model :: IdentityRegistrationStatus >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityRegistrationStatus::is_unknown`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityRegistrationStatus_is_unknown (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityRegistrationStatus) -> bool { let obj = dash_spv_platform :: identity :: model :: IdentityRegistrationStatus :: is_unknown (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityRegistrationStatus::is_registered`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityRegistrationStatus_is_registered (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityRegistrationStatus) -> bool { let obj = dash_spv_platform :: identity :: model :: IdentityRegistrationStatus :: is_registered (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityRegistrationStatus::is_registering`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityRegistrationStatus_is_registering (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityRegistrationStatus) -> bool { let obj = dash_spv_platform :: identity :: model :: IdentityRegistrationStatus :: is_registering (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityRegistrationStatus::is_not_registered`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityRegistrationStatus_is_not_registered (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityRegistrationStatus) -> bool { let obj = dash_spv_platform :: identity :: model :: IdentityRegistrationStatus :: is_not_registered (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityRegistrationStatus::string`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityRegistrationStatus_string (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityRegistrationStatus) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_platform :: identity :: model :: IdentityRegistrationStatus :: string (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityKeyStatus::to_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityKeyStatus_to_index (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityKeyStatus) -> u8 { let obj = dash_spv_platform :: identity :: model :: IdentityKeyStatus :: to_index (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityKeyStatus::from_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityKeyStatus_from_index (index : u8) -> * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityKeyStatus { let obj = dash_spv_platform :: identity :: model :: IdentityKeyStatus :: from_index (index) ; < crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityKeyStatus as ferment :: FFIConversionTo < dash_spv_platform :: identity :: model :: IdentityKeyStatus >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityKeyStatus::string`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityKeyStatus_string (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityKeyStatus) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_platform :: identity :: model :: IdentityKeyStatus :: string (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityKeyStatus::string_description`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityKeyStatus_string_description (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityKeyStatus) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_platform :: identity :: model :: IdentityKeyStatus :: string_description (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityKeyStatus::is_unknown`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityKeyStatus_is_unknown (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityKeyStatus) -> bool { let obj = dash_spv_platform :: identity :: model :: IdentityKeyStatus :: is_unknown (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityKeyStatus::is_registered`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityKeyStatus_is_registered (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityKeyStatus) -> bool { let obj = dash_spv_platform :: identity :: model :: IdentityKeyStatus :: is_registered (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityKeyStatus::is_registering`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityKeyStatus_is_registering (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityKeyStatus) -> bool { let obj = dash_spv_platform :: identity :: model :: IdentityKeyStatus :: is_registering (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityKeyStatus::is_not_registered`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityKeyStatus_is_not_registered (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityKeyStatus) -> bool { let obj = dash_spv_platform :: identity :: model :: IdentityKeyStatus :: is_not_registered (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityKeyStatus::is_revoked`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityKeyStatus_is_revoked (self_ : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityKeyStatus) -> bool { let obj = dash_spv_platform :: identity :: model :: IdentityKeyStatus :: is_revoked (& ferment :: FFIConversionFrom :: ffi_from (self_)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::new`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_new (status : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityRegistrationStatus) -> * mut dash_spv_platform :: identity :: model :: IdentityModel { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: new (< crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityRegistrationStatus as ferment :: FFIConversionFrom < dash_spv_platform :: identity :: model :: IdentityRegistrationStatus >> :: ffi_from (status)) ; ferment :: boxed (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::set_registration_status`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_set_registration_status (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , status : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityRegistrationStatus) { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: set_registration_status (& mut * self_ , < crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityRegistrationStatus as ferment :: FFIConversionFrom < dash_spv_platform :: identity :: model :: IdentityRegistrationStatus >> :: ffi_from (status)) ; ; } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::registration_status`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_registration_status (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel) -> * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityRegistrationStatus { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: registration_status (& * self_) ; < crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityRegistrationStatus as ferment :: FFIConversionTo < dash_spv_platform :: identity :: model :: IdentityRegistrationStatus >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::registration_status_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_registration_status_index (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel) -> u8 { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: registration_status_index (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::is_registered`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_is_registered (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel) -> bool { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: is_registered (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::set_identity`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_set_identity (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , identity : * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity) { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: set_identity (& mut * self_ , < crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity as ferment :: FFIConversionFrom < dpp :: identity :: identity :: Identity >> :: ffi_from (identity)) ; ; } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::identity`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_identity (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel) -> * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: identity (& * self_) ; < crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity as ferment :: FFIConversionTo < dpp :: identity :: identity :: Identity >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::add_username`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_add_username (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , username : * mut std :: os :: raw :: c_char , domain : * mut std :: os :: raw :: c_char , status : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus) { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: add_username (& mut * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (username) , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (domain) , < crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus as ferment :: FFIConversionFrom < dash_spv_platform :: document :: usernames :: UsernameStatus >> :: ffi_from (status)) ; ; } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::add_username_with_salt`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_add_username_with_salt (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , username : * mut std :: os :: raw :: c_char , domain : * mut std :: os :: raw :: c_char , status : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus , salt : * mut crate :: fermented :: generics :: Vec_u8) { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: add_username_with_salt (& mut * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (username) , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (domain) , < crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus as ferment :: FFIConversionFrom < dash_spv_platform :: document :: usernames :: UsernameStatus >> :: ffi_from (status) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (salt)) ; ; } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::add_key_info`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_add_key_info (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , index : u32 , key_info : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_KeyInfo) { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: add_key_info (& mut * self_ , index , < crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_KeyInfo as ferment :: FFIConversionFrom < dash_spv_platform :: identity :: model :: KeyInfo >> :: ffi_from (key_info)) ; ; } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::add_salt`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_add_salt (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , username : * mut std :: os :: raw :: c_char , salt : * mut crate :: fermented :: generics :: Vec_u8) { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: add_salt (& mut * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (username) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (salt)) ; ; } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::salt_for_username`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_salt_for_username (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , username : * mut std :: os :: raw :: c_char) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: salt_for_username (& * self_ , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (username)))) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::full_path_for_username`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_full_path_for_username (username : * mut std :: os :: raw :: c_char , domain : * mut std :: os :: raw :: c_char) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: full_path_for_username (Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (username))) , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (domain)))) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::username_full_paths_with_status`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_username_full_paths_with_status (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , status : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus) -> * mut crate :: fermented :: generics :: Vec_String { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: username_full_paths_with_status (& * self_ , < crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus as ferment :: FFIConversionFrom < dash_spv_platform :: document :: usernames :: UsernameStatus >> :: ffi_from (status)) ; < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionTo < Vec < String > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::unregistered_username_full_paths`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_unregistered_username_full_paths (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel) -> * mut crate :: fermented :: generics :: Vec_String { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: unregistered_username_full_paths (& * self_) ; < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionTo < Vec < String > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::confirmed_username_full_paths`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_confirmed_username_full_paths (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel) -> * mut crate :: fermented :: generics :: Vec_String { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: confirmed_username_full_paths (& * self_) ; < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionTo < Vec < String > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::unregistered_username_full_paths_count`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_unregistered_username_full_paths_count (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel) -> usize { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: unregistered_username_full_paths_count (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::confirmed_username_full_paths_count`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_confirmed_username_full_paths_count (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel) -> usize { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: confirmed_username_full_paths_count (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::status_of_username`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_status_of_username (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , username : * mut std :: os :: raw :: c_char , domain : * mut std :: os :: raw :: c_char) -> * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: status_of_username (& * self_ , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (username))) , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (domain)))) ; < crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus as ferment :: FFIConversionTo < dash_spv_platform :: document :: usernames :: UsernameStatus >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::status_of_dashpay_username`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_status_of_dashpay_username (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , username : * mut std :: os :: raw :: c_char) -> * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: status_of_dashpay_username (& * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (username)) ; < crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus as ferment :: FFIConversionTo < dash_spv_platform :: document :: usernames :: UsernameStatus >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::status_of_username_full_path`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_status_of_username_full_path (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , username_full_path : * mut std :: os :: raw :: c_char) -> * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: status_of_username_full_path (& * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (username_full_path)) ; < crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus as ferment :: FFIConversionTo < dash_spv_platform :: document :: usernames :: UsernameStatus >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::status_index_of_username_full_path`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_status_index_of_username_full_path (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , username_full_path : * mut std :: os :: raw :: c_char) -> * mut u8 { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: status_index_of_username_full_path (& * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (username_full_path)) ; ferment :: to_opt_primitive (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::status_of_username_full_path_is_initial`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_status_of_username_full_path_is_initial (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , username_full_path : * mut std :: os :: raw :: c_char) -> bool { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: status_of_username_full_path_is_initial (& * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (username_full_path)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::username_of_username_full_path`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_username_of_username_full_path (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , username_full_path : * mut std :: os :: raw :: c_char) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: username_of_username_full_path (& * self_ , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (username_full_path)))) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::domain_of_username_full_path`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_domain_of_username_full_path (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , username_full_path : * mut std :: os :: raw :: c_char) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: domain_of_username_full_path (& * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (username_full_path)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::dashpay_username_full_paths`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_dashpay_username_full_paths (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel) -> * mut crate :: fermented :: generics :: Vec_String { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: dashpay_username_full_paths (& * self_) ; < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionTo < Vec < String > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::dashpay_username_count`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_dashpay_username_count (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel) -> usize { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: dashpay_username_count (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::username_statuses`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_username_statuses (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_dash_spv_platform_identity_model_UsernameStatusInfo { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: username_statuses (& * self_) ; < crate :: fermented :: generics :: std_collections_Map_keys_String_values_dash_spv_platform_identity_model_UsernameStatusInfo as ferment :: FFIConversionTo < std :: collections :: HashMap < String , dash_spv_platform :: identity :: model :: UsernameStatusInfo > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::usernames_and_domains`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_usernames_and_domains (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , username_full_paths : * mut crate :: fermented :: generics :: Vec_String) -> * mut crate :: fermented :: generics :: Vec_Tuple_String_String { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: usernames_and_domains (& * self_ , < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionFrom < Vec < String > >> :: ffi_from (username_full_paths)) ; < crate :: fermented :: generics :: Vec_Tuple_String_String as ferment :: FFIConversionTo < Vec < (String , String) > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::dashpay_usernames`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_dashpay_usernames (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel) -> * mut crate :: fermented :: generics :: Vec_String { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: dashpay_usernames (& * self_) ; < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionTo < Vec < String > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::first_dashpay_username`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_first_dashpay_username (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: first_dashpay_username (& * self_) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::has_dashpay_username`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_has_dashpay_username (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , username : * mut std :: os :: raw :: c_char) -> bool { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: has_dashpay_username (& * self_ , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (username)))) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::set_username_full_paths`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_set_username_full_paths (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , username_full_paths : * mut crate :: fermented :: generics :: Vec_String , status : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus) { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: set_username_full_paths (& mut * self_ , < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionFrom < Vec < String > >> :: ffi_from (username_full_paths) , < crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus as ferment :: FFIConversionFrom < dash_spv_platform :: document :: usernames :: UsernameStatus >> :: ffi_from (status)) ; ; } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::set_username_status`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_set_username_status (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , username_full_path : * mut std :: os :: raw :: c_char , status : * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus) { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: set_username_status (& mut * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (username_full_path) , < crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus as ferment :: FFIConversionFrom < dash_spv_platform :: document :: usernames :: UsernameStatus >> :: ffi_from (status)) ; ; } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::set_username_status_confirmed`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_set_username_status_confirmed (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , username : * mut std :: os :: raw :: c_char , normalized_parent_domain_name : * mut std :: os :: raw :: c_char , label : * mut std :: os :: raw :: c_char) -> bool { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: set_username_status_confirmed (& mut * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (username) , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (normalized_parent_domain_name) , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (label)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::set_username_status_confirmed2`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_set_username_status_confirmed2 (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , username : * mut std :: os :: raw :: c_char , domain : * mut std :: os :: raw :: c_char , lowercase_username : * mut std :: os :: raw :: c_char) -> bool { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: set_username_status_confirmed2 (& mut * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (username) , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (domain) , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (lowercase_username)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::active_key_count`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_active_key_count (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel) -> usize { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: active_key_count (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::total_key_count`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_total_key_count (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel) -> usize { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: total_key_count (& * self_) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::key_info_dictionaries`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_key_info_dictionaries (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_u32_values_dash_spv_platform_identity_model_KeyInfo { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: key_info_dictionaries (& * self_) ; < crate :: fermented :: generics :: std_collections_Map_keys_u32_values_dash_spv_platform_identity_model_KeyInfo as ferment :: FFIConversionTo < std :: collections :: HashMap < u32 , dash_spv_platform :: identity :: model :: KeyInfo > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::registered_key_info_dictionaries`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_registered_key_info_dictionaries (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_u32_values_dash_spv_platform_identity_model_KeyInfo { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: registered_key_info_dictionaries (& * self_) ; < crate :: fermented :: generics :: std_collections_Map_keys_u32_values_dash_spv_platform_identity_model_KeyInfo as ferment :: FFIConversionTo < std :: collections :: HashMap < u32 , dash_spv_platform :: identity :: model :: KeyInfo > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::active_keys_for_key_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_active_keys_for_key_type (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , kind : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind) -> * mut crate :: fermented :: generics :: Vec_dash_spv_crypto_keys_key_OpaqueKey { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: active_keys_for_key_type (& * self_ , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_from (kind)) ; < crate :: fermented :: generics :: Vec_dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionTo < Vec < dash_spv_crypto :: keys :: key :: OpaqueKey > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::verify_signature`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_verify_signature (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , signature : * mut crate :: fermented :: generics :: Vec_u8 , kind : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind , digest : * mut crate :: fermented :: generics :: Arr_u8_32) -> bool { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: verify_signature (& mut * self_ , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (signature) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_from (kind) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (digest)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::key_info_at_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_key_info_at_index (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , index : u32) -> * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_KeyInfo { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: key_info_at_index (& * self_ , index) ; < crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_KeyInfo as ferment :: FFIConversionTo < dash_spv_platform :: identity :: model :: KeyInfo >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::status_of_key_at_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_status_of_key_at_index (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , index : u32) -> * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityKeyStatus { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: status_of_key_at_index (& * self_ , index) ; < crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_IdentityKeyStatus as ferment :: FFIConversionTo < dash_spv_platform :: identity :: model :: IdentityKeyStatus >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::key_at_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_key_at_index (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , index : u32) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: key_at_index (& * self_ , index) ; < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::first_identity_public_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_first_identity_public_key (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel , purpose : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: first_identity_public_key (& * self_ , < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_from (security_level) , < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: purpose :: Purpose >> :: ffi_from (purpose)) ; < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: IdentityPublicKey >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::model::IdentityModel::has_identity_public_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_model_IdentityModel_has_identity_public_key (self_ : * mut dash_spv_platform :: identity :: model :: IdentityModel , key : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey) -> bool { let obj = dash_spv_platform :: identity :: model :: IdentityModel :: has_identity_public_key (& * self_ , < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: IdentityPublicKey >> :: ffi_from (key)) ; obj } } pub mod manager { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::identity_registration_public_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_identity_registration_public_key (index : u32 , public_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey { let obj = dash_spv_platform :: identity :: manager :: identity_registration_public_key (index , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (public_key)) ; < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: IdentityPublicKey >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::opaque_key_to_key_type_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_opaque_key_to_key_type_index (opaque_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> u8 { let obj = dash_spv_platform :: identity :: manager :: opaque_key_to_key_type_index (< crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (opaque_key)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::key_type_from_opaque_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_key_type_from_opaque_key (opaque_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_identity_identity_public_key_key_type_KeyType_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_platform :: identity :: manager :: key_type_from_opaque_key (< crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (opaque_key)) ; < crate :: fermented :: generics :: Result_ok_dpp_identity_identity_public_key_key_type_KeyType_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dpp :: identity :: identity_public_key :: key_type :: KeyType , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`IdentityValidator`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_platform_identity_manager_IdentityValidator { None = 0 , AcceptNotFoundAsNotAnError = 1 } impl ferment :: FFIConversionFrom < dash_spv_platform :: identity :: manager :: IdentityValidator > for dash_spv_platform_identity_manager_IdentityValidator { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_identity_manager_IdentityValidator) -> dash_spv_platform :: identity :: manager :: IdentityValidator { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_platform_identity_manager_IdentityValidator :: None => dash_spv_platform :: identity :: manager :: IdentityValidator :: None , dash_spv_platform_identity_manager_IdentityValidator :: AcceptNotFoundAsNotAnError => dash_spv_platform :: identity :: manager :: IdentityValidator :: AcceptNotFoundAsNotAnError } } } impl ferment :: FFIConversionTo < dash_spv_platform :: identity :: manager :: IdentityValidator > for dash_spv_platform_identity_manager_IdentityValidator { unsafe fn ffi_to_const (obj : dash_spv_platform :: identity :: manager :: IdentityValidator) -> * const dash_spv_platform_identity_manager_IdentityValidator { ferment :: boxed (match obj { dash_spv_platform :: identity :: manager :: IdentityValidator :: None => dash_spv_platform_identity_manager_IdentityValidator :: None , dash_spv_platform :: identity :: manager :: IdentityValidator :: AcceptNotFoundAsNotAnError => dash_spv_platform_identity_manager_IdentityValidator :: AcceptNotFoundAsNotAnError , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_platform_identity_manager_IdentityValidator { fn drop (& mut self) { unsafe { match self { dash_spv_platform_identity_manager_IdentityValidator :: None => { } , dash_spv_platform_identity_manager_IdentityValidator :: AcceptNotFoundAsNotAnError => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IdentityValidator_None_ctor () -> * mut dash_spv_platform_identity_manager_IdentityValidator { ferment :: boxed (dash_spv_platform_identity_manager_IdentityValidator :: None { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IdentityValidator_AcceptNotFoundAsNotAnError_ctor () -> * mut dash_spv_platform_identity_manager_IdentityValidator { ferment :: boxed (dash_spv_platform_identity_manager_IdentityValidator :: AcceptNotFoundAsNotAnError { }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IdentityValidator_destroy < > (ffi : * mut dash_spv_platform_identity_manager_IdentityValidator) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::key_kind_to_key_type_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_key_kind_to_key_type_index (kind : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind) -> u8 { let obj = dash_spv_platform :: identity :: manager :: key_kind_to_key_type_index (< crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_from (kind)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::key_kind_from_key_type`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_key_kind_from_key_type (key_type : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind { let obj = dash_spv_platform :: identity :: manager :: key_kind_from_key_type (< crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: key_type :: KeyType >> :: ffi_from (key_type)) ; < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_KeyKind as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: KeyKind >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::purpose_to_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_purpose_to_index (purpose : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose) -> u8 { let obj = dash_spv_platform :: identity :: manager :: purpose_to_index (< crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: purpose :: Purpose >> :: ffi_from (purpose)) ; obj } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::security_level_from_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_security_level_from_index (index : u8) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { let obj = dash_spv_platform :: identity :: manager :: security_level_from_index (index) ; < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`IndexedKey`]"] # [repr (C)] # [derive (Clone)] pub struct dash_spv_platform_identity_manager_IndexedKey { pub index : u32 , pub key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey } impl ferment :: FFIConversionFrom < dash_spv_platform :: identity :: manager :: IndexedKey > for dash_spv_platform_identity_manager_IndexedKey { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_identity_manager_IndexedKey) -> dash_spv_platform :: identity :: manager :: IndexedKey { let ffi_ref = & * ffi ; dash_spv_platform :: identity :: manager :: IndexedKey { index : ffi_ref . index , key : < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (ffi_ref . key) } } } impl ferment :: FFIConversionTo < dash_spv_platform :: identity :: manager :: IndexedKey > for dash_spv_platform_identity_manager_IndexedKey { unsafe fn ffi_to_const (obj : dash_spv_platform :: identity :: manager :: IndexedKey) -> * const dash_spv_platform_identity_manager_IndexedKey { ferment :: boxed (dash_spv_platform_identity_manager_IndexedKey { index : obj . index , key : < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_to (obj . key) }) } } impl Drop for dash_spv_platform_identity_manager_IndexedKey { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . key) ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IndexedKey_ctor < > (index : u32 , key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut dash_spv_platform_identity_manager_IndexedKey { ferment :: boxed (dash_spv_platform_identity_manager_IndexedKey { index , key }) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IndexedKey_destroy < > (ffi : * mut dash_spv_platform_identity_manager_IndexedKey) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IndexedKey_get_index < > (obj : * const dash_spv_platform_identity_manager_IndexedKey) -> u32 { (* obj) . index } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IndexedKey_get_key < > (obj : * const dash_spv_platform_identity_manager_IndexedKey) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey { (* obj) . key } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IndexedKey_set_index < > (obj : * const dash_spv_platform_identity_manager_IndexedKey) -> u32 { (* obj) . index } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IndexedKey_set_key < > (obj : * const dash_spv_platform_identity_manager_IndexedKey) -> * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey { (* obj) . key } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::identity_public_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_identity_public_key (index : u32 , public_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel , purpose : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey { let obj = dash_spv_platform :: identity :: manager :: identity_public_key (index , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (public_key) , < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_from (security_level) , < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: purpose :: Purpose >> :: ffi_from (purpose)) ; < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: IdentityPublicKey >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::IdentitiesManager::fetch_by_id_bytes`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IdentitiesManager_fetch_by_id_bytes (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: identity :: manager :: IdentitiesManager , id_bytes : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: identity :: manager :: IdentitiesManager :: fetch_by_id_bytes (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (id_bytes)) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::IdentitiesManager::fetch_by_id`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IdentitiesManager_fetch_by_id (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: identity :: manager :: IdentitiesManager , id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: identity :: manager :: IdentitiesManager :: fetch_by_id (& * self_ , < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (id)) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::IdentitiesManager::fetch_by_key_hash`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IdentitiesManager_fetch_by_key_hash (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: identity :: manager :: IdentitiesManager , key_hash : * mut dash_sdk :: platform :: types :: identity :: PublicKeyHash) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: identity :: manager :: IdentitiesManager :: fetch_by_key_hash (& * self_ , (& * key_hash) . clone ()) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::IdentitiesManager::fetch_balance`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IdentitiesManager_fetch_balance (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: identity :: manager :: IdentitiesManager , id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut crate :: fermented :: generics :: Result_ok_Option_u64_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: identity :: manager :: IdentitiesManager :: fetch_balance (& * self_ , < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (id)) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_u64_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < u64 > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::IdentitiesManager::fetch_balance_by_id_bytes`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IdentitiesManager_fetch_balance_by_id_bytes (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: identity :: manager :: IdentitiesManager , id : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Result_ok_Option_u64_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: identity :: manager :: IdentitiesManager :: fetch_balance_by_id_bytes (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (id)) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_u64_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < u64 > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::IdentitiesManager::get_identities_for_wallets_public_keys`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IdentitiesManager_get_identities_for_wallets_public_keys (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: identity :: manager :: IdentitiesManager , wallets : * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_Vec_u8_20) -> * mut crate :: fermented :: generics :: Result_ok_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: identity :: manager :: IdentitiesManager :: get_identities_for_wallets_public_keys (& * self_ , < crate :: fermented :: generics :: std_collections_Map_keys_String_values_Vec_u8_20 as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < String , Vec < [u8 ; 20] > > >> :: ffi_from (wallets)) . await }) ; < crate :: fermented :: generics :: Result_ok_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < std :: collections :: BTreeMap < String , std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::IdentitiesManager::get_identities_for_key_hashes`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IdentitiesManager_get_identities_for_key_hashes (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: identity :: manager :: IdentitiesManager , wallet_id : * mut std :: os :: raw :: c_char , key_hashes : * mut crate :: fermented :: generics :: Vec_u8_20) -> * mut crate :: fermented :: generics :: Result_ok_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: identity :: manager :: IdentitiesManager :: get_identities_for_key_hashes (& * self_ , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (wallet_id) , < crate :: fermented :: generics :: Vec_u8_20 as ferment :: FFIConversionFrom < Vec < [u8 ; 20] > >> :: ffi_from (key_hashes)) . await }) ; < crate :: fermented :: generics :: Result_ok_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::IdentitiesManager::get_identities_by_pub_key_hashes_at_index_range`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IdentitiesManager_get_identities_by_pub_key_hashes_at_index_range (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: identity :: manager :: IdentitiesManager , extended_public_key : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , unused_index : u32) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_u32_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: identity :: manager :: IdentitiesManager :: get_identities_by_pub_key_hashes_at_index_range (& * self_ , Box :: leak (Box :: new ((& * extended_public_key) . clone ())) , unused_index) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_u32_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < u32 , dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::IdentitiesManager::monitor`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IdentitiesManager_monitor (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: identity :: manager :: IdentitiesManager , unique_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: manager :: dash_spv_platform_identity_manager_IdentityValidator) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: identity :: manager :: IdentitiesManager :: monitor (& * self_ , < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (unique_id) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: identity :: manager :: dash_spv_platform_identity_manager_IdentityValidator as ferment :: FFIConversionFrom < dash_spv_platform :: identity :: manager :: IdentityValidator >> :: ffi_from (options)) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::IdentitiesManager::monitor_for_id_bytes`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IdentitiesManager_monitor_for_id_bytes (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: identity :: manager :: IdentitiesManager , unique_id : * mut crate :: fermented :: generics :: Arr_u8_32 , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: manager :: dash_spv_platform_identity_manager_IdentityValidator) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: identity :: manager :: IdentitiesManager :: monitor_for_id_bytes (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (unique_id) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: identity :: manager :: dash_spv_platform_identity_manager_IdentityValidator as ferment :: FFIConversionFrom < dash_spv_platform :: identity :: manager :: IdentityValidator >> :: ffi_from (options)) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::IdentitiesManager::monitor_for_key_hash`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IdentitiesManager_monitor_for_key_hash (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: identity :: manager :: IdentitiesManager , key_hash : * mut crate :: fermented :: generics :: Arr_u8_20 , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: manager :: dash_spv_platform_identity_manager_IdentityValidator) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: identity :: manager :: IdentitiesManager :: monitor_for_key_hash (& * self_ , < crate :: fermented :: generics :: Arr_u8_20 as ferment :: FFIConversionFrom < [u8 ; 20] >> :: ffi_from (key_hash) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: identity :: manager :: dash_spv_platform_identity_manager_IdentityValidator as ferment :: FFIConversionFrom < dash_spv_platform :: identity :: manager :: IdentityValidator >> :: ffi_from (options)) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::IdentitiesManager::monitor_with_delay`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IdentitiesManager_monitor_with_delay (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: identity :: manager :: IdentitiesManager , unique_id : * mut crate :: fermented :: generics :: Arr_u8_32 , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: manager :: dash_spv_platform_identity_manager_IdentityValidator , delay : u64) -> * mut crate :: fermented :: generics :: Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: identity :: manager :: IdentitiesManager :: monitor_with_delay (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (unique_id) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: identity :: manager :: dash_spv_platform_identity_manager_IdentityValidator as ferment :: FFIConversionFrom < dash_spv_platform :: identity :: manager :: IdentityValidator >> :: ffi_from (options) , delay) . await }) ; < crate :: fermented :: generics :: Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < Option < dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::IdentitiesManager::monitor_for_key_hashes`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_IdentitiesManager_monitor_for_key_hashes (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: identity :: manager :: IdentitiesManager , key_hashes : * mut crate :: fermented :: generics :: Vec_u8_20 , retry : * mut crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy , options : * mut crate :: fermented :: types :: dash_spv_platform :: identity :: manager :: dash_spv_platform_identity_manager_IdentityValidator) -> * mut crate :: fermented :: generics :: Result_ok_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: identity :: manager :: IdentitiesManager :: monitor_for_key_hashes (& * self_ , < crate :: fermented :: generics :: Vec_u8_20 as ferment :: FFIConversionFrom < Vec < [u8 ; 20] > >> :: ffi_from (key_hashes) , < crate :: fermented :: types :: dash_spv_platform :: util :: dash_spv_platform_util_RetryStrategy as ferment :: FFIConversionFrom < dash_spv_platform :: util :: RetryStrategy >> :: ffi_from (retry) , < crate :: fermented :: types :: dash_spv_platform :: identity :: manager :: dash_spv_platform_identity_manager_IdentityValidator as ferment :: FFIConversionFrom < dash_spv_platform :: identity :: manager :: IdentityValidator >> :: ffi_from (options)) . await }) ; < crate :: fermented :: generics :: Result_ok_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::opaque_key_from_identity_public_key`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_opaque_key_from_identity_public_key (public_key : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { let obj = dash_spv_platform :: identity :: manager :: opaque_key_from_identity_public_key (< crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: IdentityPublicKey >> :: ffi_from (public_key)) ; < crate :: fermented :: generics :: Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::purpose_from_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_purpose_from_index (index : u8) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose { let obj = dash_spv_platform :: identity :: manager :: purpose_from_index (index) ; < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: purpose :: Purpose >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::identity::manager::security_level_to_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_identity_manager_security_level_to_index (level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel) -> u8 { let obj = dash_spv_platform :: identity :: manager :: security_level_to_index (< crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_from (level)) ; obj } } } pub mod transition { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_platform::transition::instant_proof`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_transition_instant_proof (output_index : u32 , instant_lock : * mut crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock , tx_version : u16 , lock_time : u32 , input : * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn , output : * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut , asset_lock_payload_version : u8 , credit_outputs : * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut) -> * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof { let obj = dash_spv_platform :: transition :: instant_proof (output_index , < crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock as ferment :: FFIConversionFrom < dashcore :: ephemerealdata :: instant_lock :: InstantLock >> :: ffi_from (instant_lock) , tx_version , lock_time , < crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txin_TxIn as ferment :: FFIConversionFrom < Vec < dashcore :: blockdata :: transaction :: txin :: TxIn > >> :: ffi_from (input) , < crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut as ferment :: FFIConversionFrom < Vec < dashcore :: blockdata :: transaction :: txout :: TxOut > >> :: ffi_from (output) , asset_lock_payload_version , < crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut as ferment :: FFIConversionFrom < Vec < dashcore :: blockdata :: transaction :: txout :: TxOut > >> :: ffi_from (credit_outputs)) ; < crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof as ferment :: FFIConversionTo < dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::transition::chain_proof`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_transition_chain_proof (core_chain_locked_height : u32 , txid : * mut crate :: fermented :: generics :: Arr_u8_32 , vout : u32) -> * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof { let obj = dash_spv_platform :: transition :: chain_proof (core_chain_locked_height , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (txid) , vout) ; < crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof as ferment :: FFIConversionTo < dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof >> :: ffi_to (obj) } } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::identity_manager`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_identity_manager (self_ : * mut dash_spv_platform :: PlatformSDK) -> * mut crate :: fermented :: generics :: std_sync_Arc_dash_spv_platform_identity_manager_IdentitiesManager { let obj = dash_spv_platform :: PlatformSDK :: identity_manager (& * self_) ; < crate :: fermented :: generics :: std_sync_Arc_dash_spv_platform_identity_manager_IdentitiesManager as ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_platform :: identity :: manager :: IdentitiesManager > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::contract_manager`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_contract_manager (self_ : * mut dash_spv_platform :: PlatformSDK) -> * mut crate :: fermented :: generics :: std_sync_Arc_dash_spv_platform_contract_manager_ContractsManager { let obj = dash_spv_platform :: PlatformSDK :: contract_manager (& * self_) ; < crate :: fermented :: generics :: std_sync_Arc_dash_spv_platform_contract_manager_ContractsManager as ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_platform :: contract :: manager :: ContractsManager > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::doc_manager`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_doc_manager (self_ : * mut dash_spv_platform :: PlatformSDK) -> * mut crate :: fermented :: generics :: std_sync_Arc_dash_spv_platform_document_manager_DocumentsManager { let obj = dash_spv_platform :: PlatformSDK :: doc_manager (& * self_) ; < crate :: fermented :: generics :: std_sync_Arc_dash_spv_platform_document_manager_DocumentsManager as ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_platform :: document :: manager :: DocumentsManager > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::contact_requests`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_contact_requests (self_ : * mut dash_spv_platform :: PlatformSDK) -> * mut crate :: fermented :: generics :: std_sync_Arc_dash_spv_platform_document_contact_request_ContactRequestManager { let obj = dash_spv_platform :: PlatformSDK :: contact_requests (& * self_) ; < crate :: fermented :: generics :: std_sync_Arc_dash_spv_platform_document_contact_request_ContactRequestManager as ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_platform :: document :: contact_request :: ContactRequestManager > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::salted_domain_hashes`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_salted_domain_hashes (self_ : * mut dash_spv_platform :: PlatformSDK) -> * mut crate :: fermented :: generics :: std_sync_Arc_dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager { let obj = dash_spv_platform :: PlatformSDK :: salted_domain_hashes (& * self_) ; < crate :: fermented :: generics :: std_sync_Arc_dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager as ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::usernames`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_usernames (self_ : * mut dash_spv_platform :: PlatformSDK) -> * mut crate :: fermented :: generics :: std_sync_Arc_dash_spv_platform_document_usernames_UsernamesManager { let obj = dash_spv_platform :: PlatformSDK :: usernames (& * self_) ; < crate :: fermented :: generics :: std_sync_Arc_dash_spv_platform_document_usernames_UsernamesManager as ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_platform :: document :: usernames :: UsernamesManager > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::get_status`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_get_status (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , address : * mut std :: os :: raw :: c_char) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: get_status (& * self_ , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (address)))) . await }) ; < crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < bool , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::get_transaction_with_hash`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_get_transaction_with_hash (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , hash : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Result_ok_dashcore_blockdata_transaction_Transaction_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: get_transaction_with_hash (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (hash)) . await }) ; < crate :: fermented :: generics :: Result_ok_dashcore_blockdata_transaction_Transaction_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dashcore :: blockdata :: transaction :: Transaction , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::check_ping_times_for_current_masternode_list`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_check_ping_times_for_current_masternode_list (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK) { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: check_ping_times_for_current_masternode_list (& * self_) . await }) ; ; } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::put_document`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_put_document (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , document_type : * mut std :: os :: raw :: c_char , document : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document , identity_public_key : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey , block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight , core_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight) -> * mut crate :: fermented :: generics :: Result_ok_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: put_document (& * self_ , < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (contract_id) , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (document_type))) , < crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionFrom < dpp :: document :: Document >> :: ffi_from (document) , < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: IdentityPublicKey >> :: ffi_from (identity_public_key) , < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight as ferment :: FFIConversionFrom < dpp :: prelude :: BlockHeight >> :: ffi_from (block_height) , < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight as ferment :: FFIConversionFrom < dpp :: prelude :: CoreBlockHeight >> :: ffi_from (core_block_height)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: document :: Document , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::dpns_domain_starts_with`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_dpns_domain_starts_with (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , document_type : * mut std :: os :: raw :: c_char , starts_with : * mut std :: os :: raw :: c_char) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: dpns_domain_starts_with (& * self_ , < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (contract_id) , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (document_type))) , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (starts_with)))) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::dpns_domain_by_id`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_dpns_domain_by_id (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , document_type : * mut std :: os :: raw :: c_char , unique_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: dpns_domain_by_id (& * self_ , < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (contract_id) , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (document_type))) , < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (unique_id)) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::dpns_usernames`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_dpns_usernames (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , document_type : * mut std :: os :: raw :: c_char , usernames : * mut crate :: fermented :: generics :: Vec_String) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: dpns_usernames (& * self_ , < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (contract_id) , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (document_type))) , < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionFrom < Vec < String > >> :: ffi_from (usernames)) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::find_username`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_find_username (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , document_type : * mut std :: os :: raw :: c_char , starts_with : * mut std :: os :: raw :: c_char) -> * mut crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: find_username (& * self_ , < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (contract_id) , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (document_type))) , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (starts_with)))) . await }) ; < crate :: fermented :: generics :: Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::publish_contract`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_publish_contract (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , identity_public_key : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: publish_contract (& * self_ , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: IdentityPublicKey >> :: ffi_from (identity_public_key)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: data_contract :: DataContract , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::identity_registration_signed_transition`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_identity_registration_signed_transition (self_ : * mut dash_spv_platform :: PlatformSDK , identity : * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity , proof : * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { let obj = dash_spv_platform :: PlatformSDK :: identity_registration_signed_transition (& * self_ , < crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity as ferment :: FFIConversionFrom < dpp :: identity :: identity :: Identity >> :: ffi_from (identity) , < crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof as ferment :: FFIConversionFrom < dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof >> :: ffi_from (proof) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: StateTransition , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::identity_registration_signed_transition_with_public_keys`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_identity_registration_signed_transition_with_public_keys (self_ : * mut dash_spv_platform :: PlatformSDK , public_keys : * mut crate :: fermented :: generics :: std_collections_Map_keys_u32_values_dpp_identity_identity_public_key_IdentityPublicKey , proof : * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { let obj = dash_spv_platform :: PlatformSDK :: identity_registration_signed_transition_with_public_keys (& * self_ , < crate :: fermented :: generics :: std_collections_Map_keys_u32_values_dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < u32 , dpp :: identity :: identity_public_key :: IdentityPublicKey > >> :: ffi_from (public_keys) , < crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof as ferment :: FFIConversionFrom < dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof >> :: ffi_from (proof) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: StateTransition , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::identity_registration_signed_transition_with_public_key_at_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_identity_registration_signed_transition_with_public_key_at_index (self_ : * mut dash_spv_platform :: PlatformSDK , public_key : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey , index : u32 , proof : * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { let obj = dash_spv_platform :: PlatformSDK :: identity_registration_signed_transition_with_public_key_at_index (& * self_ , < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: IdentityPublicKey >> :: ffi_from (public_key) , index , < crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof as ferment :: FFIConversionFrom < dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof >> :: ffi_from (proof) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: StateTransition , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::identity_topup_signed_transition`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_identity_topup_signed_transition (self_ : * mut dash_spv_platform :: PlatformSDK , identity_id : * mut crate :: fermented :: generics :: Arr_u8_32 , proof : * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { let obj = dash_spv_platform :: PlatformSDK :: identity_topup_signed_transition (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (identity_id) , < crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof as ferment :: FFIConversionFrom < dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof >> :: ffi_from (proof) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: StateTransition , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::identity_withdraw_signed_transition`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_identity_withdraw_signed_transition (self_ : * mut dash_spv_platform :: PlatformSDK , identity_id : * mut crate :: fermented :: generics :: Arr_u8_32 , amount : u64 , fee : u32 , pooling : * mut crate :: fermented :: types :: dpp :: withdrawal :: dpp_withdrawal_Pooling , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , script : * mut crate :: fermented :: generics :: Vec_u8 , nonce : u64) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { let obj = dash_spv_platform :: PlatformSDK :: identity_withdraw_signed_transition (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (identity_id) , amount , fee , < crate :: fermented :: types :: dpp :: withdrawal :: dpp_withdrawal_Pooling as ferment :: FFIConversionFrom < dpp :: withdrawal :: Pooling >> :: ffi_from (pooling) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from_opt (script) , nonce) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: StateTransition , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::identity_update_signed_transition`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_identity_update_signed_transition (self_ : * mut dash_spv_platform :: PlatformSDK , identity : * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity , nonce : u64 , add_public_keys : * mut crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation , disable_key_ids : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { let obj = dash_spv_platform :: PlatformSDK :: identity_update_signed_transition (& * self_ , < crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity as ferment :: FFIConversionFrom < dpp :: identity :: identity :: Identity >> :: ffi_from (identity) , nonce , < crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation as ferment :: FFIConversionFrom < Vec < dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: IdentityPublicKeyInCreation > >> :: ffi_from_opt (add_public_keys) , < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < Vec < dpp :: identity :: identity_public_key :: KeyID > >> :: ffi_from_opt (disable_key_ids) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: StateTransition , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::identity_transfer_signed_transition`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_identity_transfer_signed_transition (self_ : * mut dash_spv_platform :: PlatformSDK , identity : * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity , recipient_id : * mut crate :: fermented :: generics :: Arr_u8_32 , amount : u64 , nonce : u64 , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { let obj = dash_spv_platform :: PlatformSDK :: identity_transfer_signed_transition (& * self_ , < crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity as ferment :: FFIConversionFrom < dpp :: identity :: identity :: Identity >> :: ffi_from (identity) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (recipient_id) , amount , nonce , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: StateTransition , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::data_contract_create_signed_transition`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_data_contract_create_signed_transition (self_ : * mut dash_spv_platform :: PlatformSDK , owner_id : * mut crate :: fermented :: generics :: Arr_u8_32 , nonce : u64 , documents : * mut crate :: fermented :: types :: platform_value :: platform_value_Value , config : * mut crate :: fermented :: types :: platform_value :: platform_value_Value , definitions : * mut crate :: fermented :: types :: platform_value :: platform_value_Value , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { let obj = dash_spv_platform :: PlatformSDK :: data_contract_create_signed_transition (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (owner_id) , nonce , < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionFrom < platform_value :: Value >> :: ffi_from (documents) , < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionFrom < platform_value :: Value >> :: ffi_from_opt (config) , < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionFrom < platform_value :: Value >> :: ffi_from_opt (definitions) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: StateTransition , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::data_contract_create_signed_transition2`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_data_contract_create_signed_transition2 (self_ : * mut dash_spv_platform :: PlatformSDK , system_contract : * mut crate :: fermented :: types :: data_contracts :: data_contracts_SystemDataContract , owner_id : * mut crate :: fermented :: generics :: Arr_u8_32 , nonce : u64 , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { let obj = dash_spv_platform :: PlatformSDK :: data_contract_create_signed_transition2 (& * self_ , < crate :: fermented :: types :: data_contracts :: data_contracts_SystemDataContract as ferment :: FFIConversionFrom < data_contracts :: SystemDataContract >> :: ffi_from (system_contract) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (owner_id) , nonce , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: StateTransition , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::data_contract_update_signed_transition`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_data_contract_update_signed_transition (self_ : * mut dash_spv_platform :: PlatformSDK , data_contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , nonce : u64 , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { let obj = dash_spv_platform :: PlatformSDK :: data_contract_update_signed_transition (& * self_ , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (data_contract) , nonce , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: StateTransition , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::document_single_signed_transition`]"] # [cfg (feature = "state-transitions")] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_document_single_signed_transition (self_ : * mut dash_spv_platform :: PlatformSDK , action_type : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType , document_type : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: dpp_data_contract_document_type_DocumentType , document : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document , entropy : * mut crate :: fermented :: generics :: Arr_u8_32 , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { let obj = dash_spv_platform :: PlatformSDK :: document_single_signed_transition (& * self_ , < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType >> :: ffi_from (action_type) , < crate :: fermented :: types :: dpp :: data_contract :: document_type :: dpp_data_contract_document_type_DocumentType as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: DocumentType >> :: ffi_from (document_type) , < crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionFrom < dpp :: document :: Document >> :: ffi_from (document) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (entropy) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: StateTransition , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::document_single_on_table_signed_transition`]"] # [cfg (feature = "state-transitions")] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_document_single_on_table_signed_transition (self_ : * mut dash_spv_platform :: PlatformSDK , data_contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , action_type : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType , table_name : * mut std :: os :: raw :: c_char , document : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document , entropy : * mut crate :: fermented :: generics :: Arr_u8_32 , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { let obj = dash_spv_platform :: PlatformSDK :: document_single_on_table_signed_transition (& * self_ , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (data_contract) , < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType >> :: ffi_from (action_type) , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (table_name))) , < crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionFrom < dpp :: document :: Document >> :: ffi_from (document) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (entropy) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: StateTransition , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::document_batch_signed_transition`]"] # [cfg (feature = "state-transitions")] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_document_batch_signed_transition < 'a > (self_ : * mut dash_spv_platform :: PlatformSDK , documents : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_values_Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { let obj = dash_spv_platform :: PlatformSDK :: document_batch_signed_transition (& * self_ , < crate :: fermented :: generics :: std_collections_Map_keys_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_values_Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 as ferment :: FFIConversionFrom < std :: collections :: HashMap < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType , Vec < (dpp :: document :: Document , dpp :: data_contract :: document_type :: DocumentTypeRef < 'a > , platform_value :: types :: bytes_32 :: Bytes32) > > >> :: ffi_from (documents) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: StateTransition , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::identity_register`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_identity_register (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , identity : * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity , proof : * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: identity_register (& * self_ , < crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity as ferment :: FFIConversionFrom < dpp :: identity :: identity :: Identity >> :: ffi_from (identity) , < crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof as ferment :: FFIConversionFrom < dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof >> :: ffi_from (proof) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::identity_register2`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_identity_register2 (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , identity : * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity , proof : * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: identity_register2 (& * self_ , < crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity as ferment :: FFIConversionFrom < dpp :: identity :: identity :: Identity >> :: ffi_from (identity) , < crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof as ferment :: FFIConversionFrom < dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof >> :: ffi_from (proof) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: identity :: identity :: Identity , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::identity_register_using_public_keys`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_identity_register_using_public_keys (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , public_keys : * mut crate :: fermented :: generics :: std_collections_Map_keys_u32_values_dpp_identity_identity_public_key_IdentityPublicKey , proof : * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: identity_register_using_public_keys (& * self_ , < crate :: fermented :: generics :: std_collections_Map_keys_u32_values_dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < u32 , dpp :: identity :: identity_public_key :: IdentityPublicKey > >> :: ffi_from (public_keys) , < crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof as ferment :: FFIConversionFrom < dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof >> :: ffi_from (proof) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::identity_register_using_public_key_at_index`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_identity_register_using_public_key_at_index (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , public_key : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey , index : u32 , proof : * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: identity_register_using_public_key_at_index (& * self_ , < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: IdentityPublicKey >> :: ffi_from (public_key) , index , < crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof as ferment :: FFIConversionFrom < dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof >> :: ffi_from (proof) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::identity_register_using_public_key_at_index2`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_identity_register_using_public_key_at_index2 (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , public_key : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey , index : u32 , proof : * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: identity_register_using_public_key_at_index2 (& * self_ , < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: IdentityPublicKey >> :: ffi_from (public_key) , index , < crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof as ferment :: FFIConversionFrom < dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof >> :: ffi_from (proof) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: identity :: identity :: Identity , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::identity_topup`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_identity_topup (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , identity_id : * mut crate :: fermented :: generics :: Arr_u8_32 , proof : * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: identity_topup (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (identity_id) , < crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof as ferment :: FFIConversionFrom < dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof >> :: ffi_from (proof) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::identity_withdraw`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_identity_withdraw (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , identity_id : * mut crate :: fermented :: generics :: Arr_u8_32 , amount : u64 , fee : u32 , pooling : * mut crate :: fermented :: types :: dpp :: withdrawal :: dpp_withdrawal_Pooling , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , script : * mut crate :: fermented :: generics :: Vec_u8 , nonce : u64) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: identity_withdraw (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (identity_id) , amount , fee , < crate :: fermented :: types :: dpp :: withdrawal :: dpp_withdrawal_Pooling as ferment :: FFIConversionFrom < dpp :: withdrawal :: Pooling >> :: ffi_from (pooling) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from_opt (script) , nonce) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::identity_update`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_identity_update (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , identity : * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity , nonce : u64 , add_public_keys : * mut crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation , disable_key_ids : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: identity_update (& * self_ , < crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity as ferment :: FFIConversionFrom < dpp :: identity :: identity :: Identity >> :: ffi_from (identity) , nonce , < crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation as ferment :: FFIConversionFrom < Vec < dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: IdentityPublicKeyInCreation > >> :: ffi_from_opt (add_public_keys) , < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < Vec < dpp :: identity :: identity_public_key :: KeyID > >> :: ffi_from_opt (disable_key_ids) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::identity_transfer`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_identity_transfer (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , identity : * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity , recipient_id : * mut crate :: fermented :: generics :: Arr_u8_32 , amount : u64 , nonce : u64 , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: identity_transfer (& * self_ , < crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity as ferment :: FFIConversionFrom < dpp :: identity :: identity :: Identity >> :: ffi_from (identity) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (recipient_id) , amount , nonce , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::data_contract_create`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_data_contract_create (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , owner_id : * mut crate :: fermented :: generics :: Arr_u8_32 , nonce : u64 , documents : * mut crate :: fermented :: types :: platform_value :: platform_value_Value , config : * mut crate :: fermented :: types :: platform_value :: platform_value_Value , definitions : * mut crate :: fermented :: types :: platform_value :: platform_value_Value , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: data_contract_create (& * self_ , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (owner_id) , nonce , < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionFrom < platform_value :: Value >> :: ffi_from (documents) , < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionFrom < platform_value :: Value >> :: ffi_from_opt (config) , < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionFrom < platform_value :: Value >> :: ffi_from_opt (definitions) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::data_contract_create2`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_data_contract_create2 (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , system_contract : * mut crate :: fermented :: types :: data_contracts :: data_contracts_SystemDataContract , owner_id : * mut crate :: fermented :: generics :: Arr_u8_32 , nonce : u64 , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: data_contract_create2 (& * self_ , < crate :: fermented :: types :: data_contracts :: data_contracts_SystemDataContract as ferment :: FFIConversionFrom < data_contracts :: SystemDataContract >> :: ffi_from (system_contract) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (owner_id) , nonce , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::data_contract_update`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_data_contract_update (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , data_contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , nonce : u64 , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: data_contract_update (& * self_ , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (data_contract) , nonce , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::document_single`]"] # [cfg (feature = "state-transitions")] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_document_single (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , action_type : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType , document_type : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: dpp_data_contract_document_type_DocumentType , document : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document , entropy : * mut crate :: fermented :: generics :: Arr_u8_32 , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: document_single (& * self_ , < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType >> :: ffi_from (action_type) , < crate :: fermented :: types :: dpp :: data_contract :: document_type :: dpp_data_contract_document_type_DocumentType as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: DocumentType >> :: ffi_from (document_type) , < crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionFrom < dpp :: document :: Document >> :: ffi_from (document) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (entropy) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::document_single2`]"] # [cfg (feature = "state-transitions")] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_document_single2 (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , document_type : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: dpp_data_contract_document_type_DocumentType , document : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document , entropy : * mut crate :: fermented :: generics :: Arr_u8_32 , identity_public_key : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: document_single2 (& * self_ , < crate :: fermented :: types :: dpp :: data_contract :: document_type :: dpp_data_contract_document_type_DocumentType as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: DocumentType >> :: ffi_from (document_type) , < crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionFrom < dpp :: document :: Document >> :: ffi_from (document) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (entropy) , < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: IdentityPublicKey >> :: ffi_from (identity_public_key)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: document :: Document , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::document_single_on_table`]"] # [cfg (feature = "state-transitions")] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_document_single_on_table (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , data_contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , action_type : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType , table_name : * mut std :: os :: raw :: c_char , document : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document , entropy : * mut crate :: fermented :: generics :: Arr_u8_32 , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: document_single_on_table (& * self_ , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (data_contract) , < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType >> :: ffi_from (action_type) , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (table_name))) , < crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionFrom < dpp :: document :: Document >> :: ffi_from (document) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (entropy) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::document_batch`]"] # [cfg (feature = "state-transitions")] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_document_batch < 'a > (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , documents : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_values_Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: document_batch (& * self_ , < crate :: fermented :: generics :: std_collections_Map_keys_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_values_Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 as ferment :: FFIConversionFrom < std :: collections :: HashMap < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType , Vec < (dpp :: document :: Document , dpp :: data_contract :: document_type :: DocumentTypeRef < 'a > , platform_value :: types :: bytes_32 :: Bytes32) > > >> :: ffi_from (documents) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::friend_request_document`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_friend_request_document (self_ : * mut dash_spv_platform :: PlatformSDK , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , identity_id : * mut crate :: fermented :: generics :: Arr_u8_32 , table_name : * mut std :: os :: raw :: c_char , created_at : u64 , to_user_id : * mut crate :: fermented :: generics :: Arr_u8_32 , encrypted_extended_public_key_data : * mut crate :: fermented :: generics :: Vec_u8 , sender_key_index : u32 , recipient_key_index : u32 , account_reference : u32 , entropy : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Result_ok_dpp_document_Document_err_dash_spv_platform_error_Error { let obj = dash_spv_platform :: PlatformSDK :: friend_request_document (& * self_ , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (identity_id) , Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (table_name))) , created_at , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (to_user_id) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (encrypted_extended_public_key_data) , sender_key_index , recipient_key_index , account_reference , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (entropy)) ; < crate :: fermented :: generics :: Result_ok_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: document :: Document , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::send_friend_request`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_send_friend_request (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , identity_id : * mut crate :: fermented :: generics :: Arr_u8_32 , created_at : u64 , to_user_id : * mut crate :: fermented :: generics :: Arr_u8_32 , encrypted_extended_public_key_data : * mut crate :: fermented :: generics :: Vec_u8 , sender_key_index : u32 , recipient_key_index : u32 , account_reference : u32 , entropy : * mut crate :: fermented :: generics :: Arr_u8_32 , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: send_friend_request (& * self_ , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (identity_id) , created_at , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (to_user_id) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (encrypted_extended_public_key_data) , sender_key_index , recipient_key_index , account_reference , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (entropy) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::send_friend_request_with_value`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_send_friend_request_with_value (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , identity_id : * mut crate :: fermented :: generics :: Arr_u8_32 , value : * mut crate :: fermented :: types :: platform_value :: platform_value_Value , entropy : * mut crate :: fermented :: generics :: Arr_u8_32 , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: send_friend_request_with_value (& * self_ , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (identity_id) , < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionFrom < platform_value :: Value >> :: ffi_from (value) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (entropy) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::register_username_domains_for_username_full_paths`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_register_username_domains_for_username_full_paths (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , identity_id : * mut crate :: fermented :: generics :: Arr_u8_32 , username_values : * mut crate :: fermented :: generics :: Vec_platform_value_Value , entropy : * mut crate :: fermented :: generics :: Arr_u8_32 , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , save_context : * const std :: os :: raw :: c_void , save_callback : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_dash_spv_platform_document_usernames_UsernameStatus_RTRN_) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: register_username_domains_for_username_full_paths (& * self_ , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (identity_id) , < crate :: fermented :: generics :: Vec_platform_value_Value as ferment :: FFIConversionFrom < Vec < platform_value :: Value > >> :: ffi_from (username_values) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (entropy) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key) , save_context , move | o_0 , o_1 | unsafe { save_callback . call (o_0 , o_1) }) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::register_preordered_salted_domain_hashes_for_username_full_paths`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_register_preordered_salted_domain_hashes_for_username_full_paths (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , identity_id : * mut crate :: fermented :: generics :: Arr_u8_32 , salted_domain_hashes : * mut crate :: fermented :: generics :: Vec_Vec_u8 , entropy : * mut crate :: fermented :: generics :: Arr_u8_32 , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , save_context : * const std :: os :: raw :: c_void , save_callback : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_dash_spv_platform_document_usernames_UsernameStatus_RTRN_) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: register_preordered_salted_domain_hashes_for_username_full_paths (& * self_ , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (identity_id) , < crate :: fermented :: generics :: Vec_Vec_u8 as ferment :: FFIConversionFrom < Vec < Vec < u8 > > >> :: ffi_from (salted_domain_hashes) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (entropy) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key) , save_context , move | o_0 , o_1 | unsafe { save_callback . call (o_0 , o_1) }) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::register_preordered_salted_domain_hash_for_username_full_path`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_register_preordered_salted_domain_hash_for_username_full_path (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , identity_id : * mut crate :: fermented :: generics :: Arr_u8_32 , identity_public_key : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey , salted_domain_hash : * mut crate :: fermented :: generics :: Vec_u8 , entropy : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Result_ok_dpp_document_Document_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: register_preordered_salted_domain_hash_for_username_full_path (& * self_ , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (identity_id) , < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: IdentityPublicKey >> :: ffi_from (identity_public_key) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (salted_domain_hash) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (entropy)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_document_Document_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: document :: Document , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_platform::PlatformSDK::sign_and_publish_profile`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_PlatformSDK_sign_and_publish_profile (runtime : * mut std :: os :: raw :: c_void , self_ : * mut dash_spv_platform :: PlatformSDK , contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , identity_id : * mut crate :: fermented :: generics :: Arr_u8_32 , profile : * mut crate :: fermented :: types :: dash_spv_platform :: models :: profile :: dash_spv_platform_models_profile_Profile , entropy : * mut crate :: fermented :: generics :: Arr_u8_32 , document_id : * mut crate :: fermented :: generics :: Arr_u8_32 , private_key : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { let rt = unsafe { & * (runtime as * mut tokio :: runtime :: Runtime) } ; let obj = rt . block_on (async { dash_spv_platform :: PlatformSDK :: sign_and_publish_profile (& * self_ , < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (contract) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (identity_id) , < crate :: fermented :: types :: dash_spv_platform :: models :: profile :: dash_spv_platform_models_profile_Profile as ferment :: FFIConversionFrom < dash_spv_platform :: models :: profile :: Profile >> :: ffi_from (profile) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (entropy) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from_opt (document_id) , < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (private_key)) . await }) ; < crate :: fermented :: generics :: Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error as ferment :: FFIConversionTo < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > >> :: ffi_to (obj) } pub mod cache { use crate as dash_spv_apple_bindings ; } pub mod thread_safe_context { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_platform::thread_safe_context::FFIThreadSafeContext::new`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_thread_safe_context_FFIThreadSafeContext_new (context : * const std :: os :: raw :: c_void) -> * mut dash_spv_platform :: thread_safe_context :: FFIThreadSafeContext { let obj = dash_spv_platform :: thread_safe_context :: FFIThreadSafeContext :: new (context) ; ferment :: boxed (obj) } } pub mod error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`Error`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dash_spv_platform_error_Error { KeyError (* mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError) , DashSDKError (* mut std :: os :: raw :: c_char) , Any (i32 , * mut std :: os :: raw :: c_char) , MaxRetryExceeded (* mut std :: os :: raw :: c_char) , InstantSendSignatureVerificationError (* mut std :: os :: raw :: c_char) } impl ferment :: FFIConversionFrom < dash_spv_platform :: error :: Error > for dash_spv_platform_error_Error { unsafe fn ffi_from_const (ffi : * const dash_spv_platform_error_Error) -> dash_spv_platform :: error :: Error { let ffi_ref = & * ffi ; match ffi_ref { dash_spv_platform_error_Error :: KeyError (o_0) => dash_spv_platform :: error :: Error :: KeyError (< crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: KeyError >> :: ffi_from (* o_0)) , dash_spv_platform_error_Error :: DashSDKError (o_0) => dash_spv_platform :: error :: Error :: DashSDKError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dash_spv_platform_error_Error :: Any (o_0 , o_1) => dash_spv_platform :: error :: Error :: Any (* o_0 , < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_1)) , dash_spv_platform_error_Error :: MaxRetryExceeded (o_0) => dash_spv_platform :: error :: Error :: MaxRetryExceeded (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dash_spv_platform_error_Error :: InstantSendSignatureVerificationError (o_0) => dash_spv_platform :: error :: Error :: InstantSendSignatureVerificationError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dash_spv_platform :: error :: Error > for dash_spv_platform_error_Error { unsafe fn ffi_to_const (obj : dash_spv_platform :: error :: Error) -> * const dash_spv_platform_error_Error { ferment :: boxed (match obj { dash_spv_platform :: error :: Error :: KeyError (o_0) => dash_spv_platform_error_Error :: KeyError (< crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError as ferment :: FFIConversionTo < dash_spv_crypto :: keys :: KeyError >> :: ffi_to (o_0)) , dash_spv_platform :: error :: Error :: DashSDKError (o_0) => dash_spv_platform_error_Error :: DashSDKError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dash_spv_platform :: error :: Error :: Any (o_0 , o_1) => dash_spv_platform_error_Error :: Any (o_0 , < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_1)) , dash_spv_platform :: error :: Error :: MaxRetryExceeded (o_0) => dash_spv_platform_error_Error :: MaxRetryExceeded (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dash_spv_platform :: error :: Error :: InstantSendSignatureVerificationError (o_0) => dash_spv_platform_error_Error :: InstantSendSignatureVerificationError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dash_spv_platform_error_Error { fn drop (& mut self) { unsafe { match self { dash_spv_platform_error_Error :: KeyError (o_0) => { ferment :: unbox_any (* o_0) ; } , dash_spv_platform_error_Error :: DashSDKError (o_0) => { ferment :: unbox_string (* o_0) ; } , dash_spv_platform_error_Error :: Any (o_0 , o_1) => { ; ; ferment :: unbox_string (* o_1) ; } , dash_spv_platform_error_Error :: MaxRetryExceeded (o_0) => { ferment :: unbox_string (* o_0) ; } , dash_spv_platform_error_Error :: InstantSendSignatureVerificationError (o_0) => { ferment :: unbox_string (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_error_Error_KeyError_ctor (o_o_0 : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError) -> * mut dash_spv_platform_error_Error { ferment :: boxed (dash_spv_platform_error_Error :: KeyError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_error_Error_DashSDKError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dash_spv_platform_error_Error { ferment :: boxed (dash_spv_platform_error_Error :: DashSDKError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_error_Error_Any_ctor (o_o_0 : i32 , o_o_1 : * mut std :: os :: raw :: c_char) -> * mut dash_spv_platform_error_Error { ferment :: boxed (dash_spv_platform_error_Error :: Any (o_o_0 , o_o_1)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_error_Error_MaxRetryExceeded_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dash_spv_platform_error_Error { ferment :: boxed (dash_spv_platform_error_Error :: MaxRetryExceeded (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_error_Error_InstantSendSignatureVerificationError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dash_spv_platform_error_Error { ferment :: boxed (dash_spv_platform_error_Error :: InstantSendSignatureVerificationError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dash_spv_platform_error_Error_destroy < > (ffi : * mut dash_spv_platform_error_Error) { ferment :: unbox_any (ffi) ; } } } pub mod dpp { use crate as dash_spv_apple_bindings ; pub mod validation { use crate as dash_spv_apple_bindings ; # [cfg (feature = "validation")] pub mod json_schema_validator { use crate as dash_spv_apple_bindings ; pub mod methods { use crate as dash_spv_apple_bindings ; pub mod new { use crate as dash_spv_apple_bindings ; } pub mod validate { use crate as dash_spv_apple_bindings ; } pub mod compile { use crate as dash_spv_apple_bindings ; } } } # [cfg (feature = "validation")] pub mod byte_array_keyword { use crate as dash_spv_apple_bindings ; # [cfg (test)] pub mod tests { use crate as dash_spv_apple_bindings ; } } } pub mod voting { use crate as dash_spv_apple_bindings ; pub mod vote_polls { use crate as dash_spv_apple_bindings ; pub mod contested_document_resource_vote_poll { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ContestedDocumentResourceVotePoll`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll { pub contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub document_type_name : * mut std :: os :: raw :: c_char , pub index_name : * mut std :: os :: raw :: c_char , pub index_values : * mut crate :: fermented :: generics :: Vec_platform_value_Value } impl ferment :: FFIConversionFrom < dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: ContestedDocumentResourceVotePoll > for dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll { unsafe fn ffi_from_const (ffi : * const dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll) -> dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: ContestedDocumentResourceVotePoll { let ffi_ref = & * ffi ; dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: ContestedDocumentResourceVotePoll { contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . contract_id) , document_type_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type_name) , index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . index_name) , index_values : < crate :: fermented :: generics :: Vec_platform_value_Value as ferment :: FFIConversionFrom < Vec < platform_value :: Value > >> :: ffi_from (ffi_ref . index_values) } } } impl ferment :: FFIConversionTo < dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: ContestedDocumentResourceVotePoll > for dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll { unsafe fn ffi_to_const (obj : dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: ContestedDocumentResourceVotePoll) -> * const dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll { ferment :: boxed (dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll { contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . contract_id) , document_type_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type_name) , index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . index_name) , index_values : < crate :: fermented :: generics :: Vec_platform_value_Value as ferment :: FFIConversionTo < Vec < platform_value :: Value > >> :: ffi_to (obj . index_values) }) } } impl Drop for dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . contract_id) ; ferment :: unbox_string (ffi_ref . document_type_name) ; ferment :: unbox_string (ffi_ref . index_name) ; ferment :: unbox_any (ffi_ref . index_values) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll_ctor < > (contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , document_type_name : * mut std :: os :: raw :: c_char , index_name : * mut std :: os :: raw :: c_char , index_values : * mut crate :: fermented :: generics :: Vec_platform_value_Value) -> * mut dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll { ferment :: boxed (dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll { contract_id , document_type_name , index_name , index_values }) } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll_destroy < > (ffi : * mut dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll_get_contract_id < > (obj : * const dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll_get_document_type_name < > (obj : * const dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll) -> * mut std :: os :: raw :: c_char { (* obj) . document_type_name } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll_get_index_name < > (obj : * const dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll) -> * mut std :: os :: raw :: c_char { (* obj) . index_name } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll_get_index_values < > (obj : * const dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll) -> * mut crate :: fermented :: generics :: Vec_platform_value_Value { (* obj) . index_values } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll_set_contract_id < > (obj : * const dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll_set_document_type_name < > (obj : * const dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll) -> * mut std :: os :: raw :: c_char { (* obj) . document_type_name } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll_set_index_name < > (obj : * const dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll) -> * mut std :: os :: raw :: c_char { (* obj) . index_name } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll_set_index_values < > (obj : * const dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll) -> * mut crate :: fermented :: generics :: Vec_platform_value_Value { (* obj) . index_values } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`VotePoll`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_voting_vote_polls_VotePoll { ContestedDocumentResourceVotePoll (* mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll) } impl ferment :: FFIConversionFrom < dpp :: voting :: vote_polls :: VotePoll > for dpp_voting_vote_polls_VotePoll { unsafe fn ffi_from_const (ffi : * const dpp_voting_vote_polls_VotePoll) -> dpp :: voting :: vote_polls :: VotePoll { let ffi_ref = & * ffi ; match ffi_ref { dpp_voting_vote_polls_VotePoll :: ContestedDocumentResourceVotePoll (o_0) => dpp :: voting :: vote_polls :: VotePoll :: ContestedDocumentResourceVotePoll (< crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll as ferment :: FFIConversionFrom < dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: ContestedDocumentResourceVotePoll >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: voting :: vote_polls :: VotePoll > for dpp_voting_vote_polls_VotePoll { unsafe fn ffi_to_const (obj : dpp :: voting :: vote_polls :: VotePoll) -> * const dpp_voting_vote_polls_VotePoll { ferment :: boxed (match obj { dpp :: voting :: vote_polls :: VotePoll :: ContestedDocumentResourceVotePoll (o_0) => dpp_voting_vote_polls_VotePoll :: ContestedDocumentResourceVotePoll (< crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll as ferment :: FFIConversionTo < dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: ContestedDocumentResourceVotePoll >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_voting_vote_polls_VotePoll { fn drop (& mut self) { unsafe { match self { dpp_voting_vote_polls_VotePoll :: ContestedDocumentResourceVotePoll (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_polls_VotePoll_ContestedDocumentResourceVotePoll_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll) -> * mut dpp_voting_vote_polls_VotePoll { ferment :: boxed (dpp_voting_vote_polls_VotePoll :: ContestedDocumentResourceVotePoll (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_polls_VotePoll_destroy < > (ffi : * mut dpp_voting_vote_polls_VotePoll) { ferment :: unbox_any (ffi) ; } } pub mod votes { use crate as dash_spv_apple_bindings ; pub mod resource_vote { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ResourceVote`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_voting_votes_resource_vote_ResourceVote { V0 (* mut crate :: fermented :: types :: dpp :: voting :: votes :: resource_vote :: v0 :: dpp_voting_votes_resource_vote_v0_ResourceVoteV0) } impl ferment :: FFIConversionFrom < dpp :: voting :: votes :: resource_vote :: ResourceVote > for dpp_voting_votes_resource_vote_ResourceVote { unsafe fn ffi_from_const (ffi : * const dpp_voting_votes_resource_vote_ResourceVote) -> dpp :: voting :: votes :: resource_vote :: ResourceVote { let ffi_ref = & * ffi ; match ffi_ref { dpp_voting_votes_resource_vote_ResourceVote :: V0 (o_0) => dpp :: voting :: votes :: resource_vote :: ResourceVote :: V0 (< crate :: fermented :: types :: dpp :: voting :: votes :: resource_vote :: v0 :: dpp_voting_votes_resource_vote_v0_ResourceVoteV0 as ferment :: FFIConversionFrom < dpp :: voting :: votes :: resource_vote :: v0 :: ResourceVoteV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: voting :: votes :: resource_vote :: ResourceVote > for dpp_voting_votes_resource_vote_ResourceVote { unsafe fn ffi_to_const (obj : dpp :: voting :: votes :: resource_vote :: ResourceVote) -> * const dpp_voting_votes_resource_vote_ResourceVote { ferment :: boxed (match obj { dpp :: voting :: votes :: resource_vote :: ResourceVote :: V0 (o_0) => dpp_voting_votes_resource_vote_ResourceVote :: V0 (< crate :: fermented :: types :: dpp :: voting :: votes :: resource_vote :: v0 :: dpp_voting_votes_resource_vote_v0_ResourceVoteV0 as ferment :: FFIConversionTo < dpp :: voting :: votes :: resource_vote :: v0 :: ResourceVoteV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_voting_votes_resource_vote_ResourceVote { fn drop (& mut self) { unsafe { match self { dpp_voting_votes_resource_vote_ResourceVote :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_voting_votes_resource_vote_ResourceVote_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: voting :: votes :: resource_vote :: v0 :: dpp_voting_votes_resource_vote_v0_ResourceVoteV0) -> * mut dpp_voting_votes_resource_vote_ResourceVote { ferment :: boxed (dpp_voting_votes_resource_vote_ResourceVote :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_voting_votes_resource_vote_ResourceVote_destroy < > (ffi : * mut dpp_voting_votes_resource_vote_ResourceVote) { ferment :: unbox_any (ffi) ; } pub mod accessors { use crate as dash_spv_apple_bindings ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ResourceVoteV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_voting_votes_resource_vote_v0_ResourceVoteV0 { pub vote_poll : * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll , pub resource_vote_choice : * mut crate :: fermented :: types :: dpp :: voting :: vote_choices :: resource_vote_choice :: dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice } impl ferment :: FFIConversionFrom < dpp :: voting :: votes :: resource_vote :: v0 :: ResourceVoteV0 > for dpp_voting_votes_resource_vote_v0_ResourceVoteV0 { unsafe fn ffi_from_const (ffi : * const dpp_voting_votes_resource_vote_v0_ResourceVoteV0) -> dpp :: voting :: votes :: resource_vote :: v0 :: ResourceVoteV0 { let ffi_ref = & * ffi ; dpp :: voting :: votes :: resource_vote :: v0 :: ResourceVoteV0 { vote_poll : < crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll as ferment :: FFIConversionFrom < dpp :: voting :: vote_polls :: VotePoll >> :: ffi_from (ffi_ref . vote_poll) , resource_vote_choice : < crate :: fermented :: types :: dpp :: voting :: vote_choices :: resource_vote_choice :: dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice as ferment :: FFIConversionFrom < dpp :: voting :: vote_choices :: resource_vote_choice :: ResourceVoteChoice >> :: ffi_from (ffi_ref . resource_vote_choice) } } } impl ferment :: FFIConversionTo < dpp :: voting :: votes :: resource_vote :: v0 :: ResourceVoteV0 > for dpp_voting_votes_resource_vote_v0_ResourceVoteV0 { unsafe fn ffi_to_const (obj : dpp :: voting :: votes :: resource_vote :: v0 :: ResourceVoteV0) -> * const dpp_voting_votes_resource_vote_v0_ResourceVoteV0 { ferment :: boxed (dpp_voting_votes_resource_vote_v0_ResourceVoteV0 { vote_poll : < crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll as ferment :: FFIConversionTo < dpp :: voting :: vote_polls :: VotePoll >> :: ffi_to (obj . vote_poll) , resource_vote_choice : < crate :: fermented :: types :: dpp :: voting :: vote_choices :: resource_vote_choice :: dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice as ferment :: FFIConversionTo < dpp :: voting :: vote_choices :: resource_vote_choice :: ResourceVoteChoice >> :: ffi_to (obj . resource_vote_choice) }) } } impl Drop for dpp_voting_votes_resource_vote_v0_ResourceVoteV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . vote_poll) ; ferment :: unbox_any (ffi_ref . resource_vote_choice) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_voting_votes_resource_vote_v0_ResourceVoteV0_ctor < > (vote_poll : * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll , resource_vote_choice : * mut crate :: fermented :: types :: dpp :: voting :: vote_choices :: resource_vote_choice :: dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice) -> * mut dpp_voting_votes_resource_vote_v0_ResourceVoteV0 { ferment :: boxed (dpp_voting_votes_resource_vote_v0_ResourceVoteV0 { vote_poll , resource_vote_choice }) } # [no_mangle] pub unsafe extern "C" fn dpp_voting_votes_resource_vote_v0_ResourceVoteV0_destroy < > (ffi : * mut dpp_voting_votes_resource_vote_v0_ResourceVoteV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_voting_votes_resource_vote_v0_ResourceVoteV0_get_vote_poll < > (obj : * const dpp_voting_votes_resource_vote_v0_ResourceVoteV0) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll { (* obj) . vote_poll } # [no_mangle] pub unsafe extern "C" fn dpp_voting_votes_resource_vote_v0_ResourceVoteV0_get_resource_vote_choice < > (obj : * const dpp_voting_votes_resource_vote_v0_ResourceVoteV0) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_choices :: resource_vote_choice :: dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice { (* obj) . resource_vote_choice } # [no_mangle] pub unsafe extern "C" fn dpp_voting_votes_resource_vote_v0_ResourceVoteV0_set_vote_poll < > (obj : * const dpp_voting_votes_resource_vote_v0_ResourceVoteV0) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll { (* obj) . vote_poll } # [no_mangle] pub unsafe extern "C" fn dpp_voting_votes_resource_vote_v0_ResourceVoteV0_set_resource_vote_choice < > (obj : * const dpp_voting_votes_resource_vote_v0_ResourceVoteV0) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_choices :: resource_vote_choice :: dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice { (* obj) . resource_vote_choice } } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`Vote`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_voting_votes_Vote { ResourceVote (* mut crate :: fermented :: types :: dpp :: voting :: votes :: resource_vote :: dpp_voting_votes_resource_vote_ResourceVote) } impl ferment :: FFIConversionFrom < dpp :: voting :: votes :: Vote > for dpp_voting_votes_Vote { unsafe fn ffi_from_const (ffi : * const dpp_voting_votes_Vote) -> dpp :: voting :: votes :: Vote { let ffi_ref = & * ffi ; match ffi_ref { dpp_voting_votes_Vote :: ResourceVote (o_0) => dpp :: voting :: votes :: Vote :: ResourceVote (< crate :: fermented :: types :: dpp :: voting :: votes :: resource_vote :: dpp_voting_votes_resource_vote_ResourceVote as ferment :: FFIConversionFrom < dpp :: voting :: votes :: resource_vote :: ResourceVote >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: voting :: votes :: Vote > for dpp_voting_votes_Vote { unsafe fn ffi_to_const (obj : dpp :: voting :: votes :: Vote) -> * const dpp_voting_votes_Vote { ferment :: boxed (match obj { dpp :: voting :: votes :: Vote :: ResourceVote (o_0) => dpp_voting_votes_Vote :: ResourceVote (< crate :: fermented :: types :: dpp :: voting :: votes :: resource_vote :: dpp_voting_votes_resource_vote_ResourceVote as ferment :: FFIConversionTo < dpp :: voting :: votes :: resource_vote :: ResourceVote >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_voting_votes_Vote { fn drop (& mut self) { unsafe { match self { dpp_voting_votes_Vote :: ResourceVote (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_voting_votes_Vote_ResourceVote_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: voting :: votes :: resource_vote :: dpp_voting_votes_resource_vote_ResourceVote) -> * mut dpp_voting_votes_Vote { ferment :: boxed (dpp_voting_votes_Vote :: ResourceVote (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_voting_votes_Vote_destroy < > (ffi : * mut dpp_voting_votes_Vote) { ferment :: unbox_any (ffi) ; } } pub mod vote_choices { use crate as dash_spv_apple_bindings ; pub mod resource_vote_choice { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ResourceVoteChoice`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice { TowardsIdentity (* mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) , Abstain , Lock } impl ferment :: FFIConversionFrom < dpp :: voting :: vote_choices :: resource_vote_choice :: ResourceVoteChoice > for dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice { unsafe fn ffi_from_const (ffi : * const dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice) -> dpp :: voting :: vote_choices :: resource_vote_choice :: ResourceVoteChoice { let ffi_ref = & * ffi ; match ffi_ref { dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice :: TowardsIdentity (o_0) => dpp :: voting :: vote_choices :: resource_vote_choice :: ResourceVoteChoice :: TowardsIdentity (< crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (* o_0)) , dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice :: Abstain => dpp :: voting :: vote_choices :: resource_vote_choice :: ResourceVoteChoice :: Abstain , dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice :: Lock => dpp :: voting :: vote_choices :: resource_vote_choice :: ResourceVoteChoice :: Lock } } } impl ferment :: FFIConversionTo < dpp :: voting :: vote_choices :: resource_vote_choice :: ResourceVoteChoice > for dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice { unsafe fn ffi_to_const (obj : dpp :: voting :: vote_choices :: resource_vote_choice :: ResourceVoteChoice) -> * const dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice { ferment :: boxed (match obj { dpp :: voting :: vote_choices :: resource_vote_choice :: ResourceVoteChoice :: TowardsIdentity (o_0) => dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice :: TowardsIdentity (< crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (o_0)) , dpp :: voting :: vote_choices :: resource_vote_choice :: ResourceVoteChoice :: Abstain => dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice :: Abstain , dpp :: voting :: vote_choices :: resource_vote_choice :: ResourceVoteChoice :: Lock => dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice :: Lock , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice { fn drop (& mut self) { unsafe { match self { dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice :: TowardsIdentity (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice :: Abstain => { } , dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice :: Lock => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice_TowardsIdentity_ctor (o_o_0 : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice { ferment :: boxed (dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice :: TowardsIdentity (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice_Abstain_ctor () -> * mut dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice { ferment :: boxed (dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice :: Abstain { }) } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice_Lock_ctor () -> * mut dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice { ferment :: boxed (dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice :: Lock { }) } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice_destroy < > (ffi : * mut dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice) { ferment :: unbox_any (ffi) ; } } } pub mod vote_info_storage { use crate as dash_spv_apple_bindings ; pub mod contested_document_vote_poll_stored_info { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ContestedDocumentVotePollStoredInfo`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo { V0 (* mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0) } impl ferment :: FFIConversionFrom < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStoredInfo > for dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo { unsafe fn ffi_from_const (ffi : * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo) -> dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStoredInfo { let ffi_ref = & * ffi ; match ffi_ref { dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo :: V0 (o_0) => dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStoredInfo :: V0 (< crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0 as ferment :: FFIConversionFrom < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: ContestedDocumentVotePollStoredInfoV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStoredInfo > for dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo { unsafe fn ffi_to_const (obj : dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStoredInfo) -> * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo { ferment :: boxed (match obj { dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStoredInfo :: V0 (o_0) => dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo :: V0 (< crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0 as ferment :: FFIConversionTo < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: ContestedDocumentVotePollStoredInfoV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo { fn drop (& mut self) { unsafe { match self { dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0) -> * mut dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo { ferment :: boxed (dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo_destroy < > (ffi : * mut dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ContestedDocumentVotePollStatus`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus { NotStarted , Awarded (* mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) , Locked , Started (* mut crate :: fermented :: types :: dpp :: block :: block_info :: dpp_block_block_info_BlockInfo) } impl ferment :: FFIConversionFrom < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStatus > for dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus { unsafe fn ffi_from_const (ffi : * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus) -> dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStatus { let ffi_ref = & * ffi ; match ffi_ref { dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus :: NotStarted => dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStatus :: NotStarted , dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus :: Awarded (o_0) => dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStatus :: Awarded (< crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (* o_0)) , dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus :: Locked => dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStatus :: Locked , dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus :: Started (o_0) => dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStatus :: Started (< crate :: fermented :: types :: dpp :: block :: block_info :: dpp_block_block_info_BlockInfo as ferment :: FFIConversionFrom < dpp :: block :: block_info :: BlockInfo >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStatus > for dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus { unsafe fn ffi_to_const (obj : dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStatus) -> * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus { ferment :: boxed (match obj { dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStatus :: NotStarted => dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus :: NotStarted , dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStatus :: Awarded (o_0) => dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus :: Awarded (< crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (o_0)) , dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStatus :: Locked => dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus :: Locked , dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStatus :: Started (o_0) => dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus :: Started (< crate :: fermented :: types :: dpp :: block :: block_info :: dpp_block_block_info_BlockInfo as ferment :: FFIConversionTo < dpp :: block :: block_info :: BlockInfo >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus { fn drop (& mut self) { unsafe { match self { dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus :: NotStarted => { } , dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus :: Awarded (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus :: Locked => { } , dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus :: Started (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus_NotStarted_ctor () -> * mut dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus { ferment :: boxed (dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus :: NotStarted { }) } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus_Awarded_ctor (o_o_0 : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus { ferment :: boxed (dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus :: Awarded (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus_Locked_ctor () -> * mut dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus { ferment :: boxed (dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus :: Locked { }) } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus_Started_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: block :: block_info :: dpp_block_block_info_BlockInfo) -> * mut dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus { ferment :: boxed (dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus :: Started (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus_destroy < > (ffi : * mut dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus) { ferment :: unbox_any (ffi) ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ContestedDocumentVotePollStoredInfoVoteEventV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 { pub resource_vote_choices : * mut crate :: fermented :: generics :: Vec_dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo , pub start_block : * mut crate :: fermented :: types :: dpp :: block :: block_info :: dpp_block_block_info_BlockInfo , pub finalization_block : * mut crate :: fermented :: types :: dpp :: block :: block_info :: dpp_block_block_info_BlockInfo , pub winner : * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_winner_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo } impl ferment :: FFIConversionFrom < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: ContestedDocumentVotePollStoredInfoVoteEventV0 > for dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 { unsafe fn ffi_from_const (ffi : * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0) -> dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: ContestedDocumentVotePollStoredInfoVoteEventV0 { let ffi_ref = & * ffi ; dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: ContestedDocumentVotePollStoredInfoVoteEventV0 { resource_vote_choices : < crate :: fermented :: generics :: Vec_dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo as ferment :: FFIConversionFrom < Vec < dpp :: voting :: contender_structs :: FinalizedResourceVoteChoicesWithVoterInfo > >> :: ffi_from (ffi_ref . resource_vote_choices) , start_block : < crate :: fermented :: types :: dpp :: block :: block_info :: dpp_block_block_info_BlockInfo as ferment :: FFIConversionFrom < dpp :: block :: block_info :: BlockInfo >> :: ffi_from (ffi_ref . start_block) , finalization_block : < crate :: fermented :: types :: dpp :: block :: block_info :: dpp_block_block_info_BlockInfo as ferment :: FFIConversionFrom < dpp :: block :: block_info :: BlockInfo >> :: ffi_from (ffi_ref . finalization_block) , winner : < crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_winner_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo as ferment :: FFIConversionFrom < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_winner_info :: ContestedDocumentVotePollWinnerInfo >> :: ffi_from (ffi_ref . winner) } } } impl ferment :: FFIConversionTo < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: ContestedDocumentVotePollStoredInfoVoteEventV0 > for dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 { unsafe fn ffi_to_const (obj : dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: ContestedDocumentVotePollStoredInfoVoteEventV0) -> * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 { ferment :: boxed (dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 { resource_vote_choices : < crate :: fermented :: generics :: Vec_dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo as ferment :: FFIConversionTo < Vec < dpp :: voting :: contender_structs :: FinalizedResourceVoteChoicesWithVoterInfo > >> :: ffi_to (obj . resource_vote_choices) , start_block : < crate :: fermented :: types :: dpp :: block :: block_info :: dpp_block_block_info_BlockInfo as ferment :: FFIConversionTo < dpp :: block :: block_info :: BlockInfo >> :: ffi_to (obj . start_block) , finalization_block : < crate :: fermented :: types :: dpp :: block :: block_info :: dpp_block_block_info_BlockInfo as ferment :: FFIConversionTo < dpp :: block :: block_info :: BlockInfo >> :: ffi_to (obj . finalization_block) , winner : < crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_winner_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo as ferment :: FFIConversionTo < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_winner_info :: ContestedDocumentVotePollWinnerInfo >> :: ffi_to (obj . winner) }) } } impl Drop for dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . resource_vote_choices) ; ferment :: unbox_any (ffi_ref . start_block) ; ferment :: unbox_any (ffi_ref . finalization_block) ; ferment :: unbox_any (ffi_ref . winner) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0_ctor < > (resource_vote_choices : * mut crate :: fermented :: generics :: Vec_dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo , start_block : * mut crate :: fermented :: types :: dpp :: block :: block_info :: dpp_block_block_info_BlockInfo , finalization_block : * mut crate :: fermented :: types :: dpp :: block :: block_info :: dpp_block_block_info_BlockInfo , winner : * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_winner_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo) -> * mut dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 { ferment :: boxed (dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 { resource_vote_choices , start_block , finalization_block , winner }) } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0_destroy < > (ffi : * mut dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0_get_resource_vote_choices < > (obj : * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0) -> * mut crate :: fermented :: generics :: Vec_dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo { (* obj) . resource_vote_choices } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0_get_start_block < > (obj : * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0) -> * mut crate :: fermented :: types :: dpp :: block :: block_info :: dpp_block_block_info_BlockInfo { (* obj) . start_block } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0_get_finalization_block < > (obj : * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0) -> * mut crate :: fermented :: types :: dpp :: block :: block_info :: dpp_block_block_info_BlockInfo { (* obj) . finalization_block } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0_get_winner < > (obj : * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_winner_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo { (* obj) . winner } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0_set_resource_vote_choices < > (obj : * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0) -> * mut crate :: fermented :: generics :: Vec_dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo { (* obj) . resource_vote_choices } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0_set_start_block < > (obj : * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0) -> * mut crate :: fermented :: types :: dpp :: block :: block_info :: dpp_block_block_info_BlockInfo { (* obj) . start_block } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0_set_finalization_block < > (obj : * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0) -> * mut crate :: fermented :: types :: dpp :: block :: block_info :: dpp_block_block_info_BlockInfo { (* obj) . finalization_block } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0_set_winner < > (obj : * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_winner_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo { (* obj) . winner } # [doc = "FFI-representation of the [`ContestedDocumentVotePollStoredInfoV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0 { pub finalized_events : * mut crate :: fermented :: generics :: Vec_dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 , pub vote_poll_status : * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus , pub locked_count : u16 } impl ferment :: FFIConversionFrom < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: ContestedDocumentVotePollStoredInfoV0 > for dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0 { unsafe fn ffi_from_const (ffi : * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0) -> dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: ContestedDocumentVotePollStoredInfoV0 { let ffi_ref = & * ffi ; dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: ContestedDocumentVotePollStoredInfoV0 { finalized_events : < crate :: fermented :: generics :: Vec_dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 as ferment :: FFIConversionFrom < Vec < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: ContestedDocumentVotePollStoredInfoVoteEventV0 > >> :: ffi_from (ffi_ref . finalized_events) , vote_poll_status : < crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus as ferment :: FFIConversionFrom < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStatus >> :: ffi_from (ffi_ref . vote_poll_status) , locked_count : ffi_ref . locked_count } } } impl ferment :: FFIConversionTo < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: ContestedDocumentVotePollStoredInfoV0 > for dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0 { unsafe fn ffi_to_const (obj : dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: ContestedDocumentVotePollStoredInfoV0) -> * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0 { ferment :: boxed (dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0 { finalized_events : < crate :: fermented :: generics :: Vec_dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 as ferment :: FFIConversionTo < Vec < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: ContestedDocumentVotePollStoredInfoVoteEventV0 > >> :: ffi_to (obj . finalized_events) , vote_poll_status : < crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus as ferment :: FFIConversionTo < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStatus >> :: ffi_to (obj . vote_poll_status) , locked_count : obj . locked_count }) } } impl Drop for dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . finalized_events) ; ferment :: unbox_any (ffi_ref . vote_poll_status) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0_ctor < > (finalized_events : * mut crate :: fermented :: generics :: Vec_dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 , vote_poll_status : * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus , locked_count : u16) -> * mut dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0 { ferment :: boxed (dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0 { finalized_events , vote_poll_status , locked_count }) } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0_destroy < > (ffi : * mut dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0_get_finalized_events < > (obj : * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0) -> * mut crate :: fermented :: generics :: Vec_dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 { (* obj) . finalized_events } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0_get_vote_poll_status < > (obj : * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus { (* obj) . vote_poll_status } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0_get_locked_count < > (obj : * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0) -> u16 { (* obj) . locked_count } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0_set_finalized_events < > (obj : * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0) -> * mut crate :: fermented :: generics :: Vec_dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 { (* obj) . finalized_events } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0_set_vote_poll_status < > (obj : * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus { (* obj) . vote_poll_status } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0_set_locked_count < > (obj : * const dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoV0) -> u16 { (* obj) . locked_count } } } pub mod contested_document_vote_poll_winner_info { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ContestedDocumentVotePollWinnerInfo`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo { NoWinner , WonByIdentity (* mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) , Locked } impl ferment :: FFIConversionFrom < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_winner_info :: ContestedDocumentVotePollWinnerInfo > for dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo { unsafe fn ffi_from_const (ffi : * const dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo) -> dpp :: voting :: vote_info_storage :: contested_document_vote_poll_winner_info :: ContestedDocumentVotePollWinnerInfo { let ffi_ref = & * ffi ; match ffi_ref { dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo :: NoWinner => dpp :: voting :: vote_info_storage :: contested_document_vote_poll_winner_info :: ContestedDocumentVotePollWinnerInfo :: NoWinner , dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo :: WonByIdentity (o_0) => dpp :: voting :: vote_info_storage :: contested_document_vote_poll_winner_info :: ContestedDocumentVotePollWinnerInfo :: WonByIdentity (< crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (* o_0)) , dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo :: Locked => dpp :: voting :: vote_info_storage :: contested_document_vote_poll_winner_info :: ContestedDocumentVotePollWinnerInfo :: Locked } } } impl ferment :: FFIConversionTo < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_winner_info :: ContestedDocumentVotePollWinnerInfo > for dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo { unsafe fn ffi_to_const (obj : dpp :: voting :: vote_info_storage :: contested_document_vote_poll_winner_info :: ContestedDocumentVotePollWinnerInfo) -> * const dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo { ferment :: boxed (match obj { dpp :: voting :: vote_info_storage :: contested_document_vote_poll_winner_info :: ContestedDocumentVotePollWinnerInfo :: NoWinner => dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo :: NoWinner , dpp :: voting :: vote_info_storage :: contested_document_vote_poll_winner_info :: ContestedDocumentVotePollWinnerInfo :: WonByIdentity (o_0) => dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo :: WonByIdentity (< crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (o_0)) , dpp :: voting :: vote_info_storage :: contested_document_vote_poll_winner_info :: ContestedDocumentVotePollWinnerInfo :: Locked => dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo :: Locked , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo { fn drop (& mut self) { unsafe { match self { dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo :: NoWinner => { } , dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo :: WonByIdentity (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo :: Locked => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo_NoWinner_ctor () -> * mut dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo { ferment :: boxed (dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo :: NoWinner { }) } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo_WonByIdentity_ctor (o_o_0 : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo { ferment :: boxed (dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo :: WonByIdentity (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo_Locked_ctor () -> * mut dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo { ferment :: boxed (dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo :: Locked { }) } # [no_mangle] pub unsafe extern "C" fn dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo_destroy < > (ffi : * mut dpp_voting_vote_info_storage_contested_document_vote_poll_winner_info_ContestedDocumentVotePollWinnerInfo) { ferment :: unbox_any (ffi) ; } } } pub mod contender_structs { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`FinalizedResourceVoteChoicesWithVoterInfo`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo { pub resource_vote_choice : * mut crate :: fermented :: types :: dpp :: voting :: vote_choices :: resource_vote_choice :: dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice , pub voters : * mut crate :: fermented :: generics :: Vec_Tuple_platform_value_types_identifier_Identifier_u8 } impl ferment :: FFIConversionFrom < dpp :: voting :: contender_structs :: FinalizedResourceVoteChoicesWithVoterInfo > for dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo { unsafe fn ffi_from_const (ffi : * const dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo) -> dpp :: voting :: contender_structs :: FinalizedResourceVoteChoicesWithVoterInfo { let ffi_ref = & * ffi ; dpp :: voting :: contender_structs :: FinalizedResourceVoteChoicesWithVoterInfo { resource_vote_choice : < crate :: fermented :: types :: dpp :: voting :: vote_choices :: resource_vote_choice :: dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice as ferment :: FFIConversionFrom < dpp :: voting :: vote_choices :: resource_vote_choice :: ResourceVoteChoice >> :: ffi_from (ffi_ref . resource_vote_choice) , voters : < crate :: fermented :: generics :: Vec_Tuple_platform_value_types_identifier_Identifier_u8 as ferment :: FFIConversionFrom < Vec < (platform_value :: types :: identifier :: Identifier , u8) > >> :: ffi_from (ffi_ref . voters) } } } impl ferment :: FFIConversionTo < dpp :: voting :: contender_structs :: FinalizedResourceVoteChoicesWithVoterInfo > for dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo { unsafe fn ffi_to_const (obj : dpp :: voting :: contender_structs :: FinalizedResourceVoteChoicesWithVoterInfo) -> * const dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo { ferment :: boxed (dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo { resource_vote_choice : < crate :: fermented :: types :: dpp :: voting :: vote_choices :: resource_vote_choice :: dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice as ferment :: FFIConversionTo < dpp :: voting :: vote_choices :: resource_vote_choice :: ResourceVoteChoice >> :: ffi_to (obj . resource_vote_choice) , voters : < crate :: fermented :: generics :: Vec_Tuple_platform_value_types_identifier_Identifier_u8 as ferment :: FFIConversionTo < Vec < (platform_value :: types :: identifier :: Identifier , u8) > >> :: ffi_to (obj . voters) }) } } impl Drop for dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . resource_vote_choice) ; ferment :: unbox_any (ffi_ref . voters) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo_ctor < > (resource_vote_choice : * mut crate :: fermented :: types :: dpp :: voting :: vote_choices :: resource_vote_choice :: dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice , voters : * mut crate :: fermented :: generics :: Vec_Tuple_platform_value_types_identifier_Identifier_u8) -> * mut dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo { ferment :: boxed (dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo { resource_vote_choice , voters }) } # [no_mangle] pub unsafe extern "C" fn dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo_destroy < > (ffi : * mut dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo_get_resource_vote_choice < > (obj : * const dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_choices :: resource_vote_choice :: dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice { (* obj) . resource_vote_choice } # [no_mangle] pub unsafe extern "C" fn dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo_get_voters < > (obj : * const dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo) -> * mut crate :: fermented :: generics :: Vec_Tuple_platform_value_types_identifier_Identifier_u8 { (* obj) . voters } # [no_mangle] pub unsafe extern "C" fn dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo_set_resource_vote_choice < > (obj : * const dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_choices :: resource_vote_choice :: dpp_voting_vote_choices_resource_vote_choice_ResourceVoteChoice { (* obj) . resource_vote_choice } # [no_mangle] pub unsafe extern "C" fn dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo_set_voters < > (obj : * const dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo) -> * mut crate :: fermented :: generics :: Vec_Tuple_platform_value_types_identifier_Identifier_u8 { (* obj) . voters } pub mod contender { use crate as dash_spv_apple_bindings ; } } } pub mod util { use crate as dash_spv_apple_bindings ; pub mod json_schema { use crate as dash_spv_apple_bindings ; } pub mod json_path { use crate as dash_spv_apple_bindings ; } pub mod json_value { use crate as dash_spv_apple_bindings ; pub mod insert_with_path { use crate as dash_spv_apple_bindings ; } pub mod remove_path { use crate as dash_spv_apple_bindings ; } } pub mod deserializer { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ProtocolVersion`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_util_deserializer_ProtocolVersion (u32) ; impl ferment :: FFIConversionFrom < dpp :: util :: deserializer :: ProtocolVersion > for dpp_util_deserializer_ProtocolVersion { unsafe fn ffi_from_const (ffi : * const dpp_util_deserializer_ProtocolVersion) -> dpp :: util :: deserializer :: ProtocolVersion { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: util :: deserializer :: ProtocolVersion > for dpp_util_deserializer_ProtocolVersion { unsafe fn ffi_to_const (obj : dpp :: util :: deserializer :: ProtocolVersion) -> * const dpp_util_deserializer_ProtocolVersion { ferment :: boxed (dpp_util_deserializer_ProtocolVersion (obj)) } } impl Drop for dpp_util_deserializer_ProtocolVersion { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_util_deserializer_ProtocolVersion_ctor < > (o_0 : u32) -> * mut dpp_util_deserializer_ProtocolVersion { ferment :: boxed (dpp_util_deserializer_ProtocolVersion (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_util_deserializer_ProtocolVersion_destroy < > (ffi : * mut dpp_util_deserializer_ProtocolVersion) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_util_deserializer_ProtocolVersion_get_0 < > (obj : * const dpp_util_deserializer_ProtocolVersion) -> u32 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_util_deserializer_ProtocolVersion_set_0 < > (obj : * const dpp_util_deserializer_ProtocolVersion) -> u32 { (* obj) . 0 } } # [cfg (feature = "cbor")] pub mod cbor_value { use crate as dash_spv_apple_bindings ; pub mod canonical { use crate as dash_spv_apple_bindings ; } pub mod convert { use crate as dash_spv_apple_bindings ; } } pub mod strings { use crate as dash_spv_apple_bindings ; # [cfg (test)] pub mod tests { use crate as dash_spv_apple_bindings ; } } } pub mod group { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`GroupStateTransitionInfo`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_group_GroupStateTransitionInfo { pub group_contract_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition , pub action_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub action_is_proposer : bool } impl ferment :: FFIConversionFrom < dpp :: group :: GroupStateTransitionInfo > for dpp_group_GroupStateTransitionInfo { unsafe fn ffi_from_const (ffi : * const dpp_group_GroupStateTransitionInfo) -> dpp :: group :: GroupStateTransitionInfo { let ffi_ref = & * ffi ; dpp :: group :: GroupStateTransitionInfo { group_contract_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionFrom < dpp :: data_contract :: GroupContractPosition >> :: ffi_from (ffi_ref . group_contract_position) , action_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . action_id) , action_is_proposer : ffi_ref . action_is_proposer } } } impl ferment :: FFIConversionTo < dpp :: group :: GroupStateTransitionInfo > for dpp_group_GroupStateTransitionInfo { unsafe fn ffi_to_const (obj : dpp :: group :: GroupStateTransitionInfo) -> * const dpp_group_GroupStateTransitionInfo { ferment :: boxed (dpp_group_GroupStateTransitionInfo { group_contract_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionTo < dpp :: data_contract :: GroupContractPosition >> :: ffi_to (obj . group_contract_position) , action_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . action_id) , action_is_proposer : obj . action_is_proposer }) } } impl Drop for dpp_group_GroupStateTransitionInfo { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . group_contract_position) ; ferment :: unbox_any (ffi_ref . action_id) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_group_GroupStateTransitionInfo_ctor < > (group_contract_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition , action_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , action_is_proposer : bool) -> * mut dpp_group_GroupStateTransitionInfo { ferment :: boxed (dpp_group_GroupStateTransitionInfo { group_contract_position , action_id , action_is_proposer }) } # [no_mangle] pub unsafe extern "C" fn dpp_group_GroupStateTransitionInfo_destroy < > (ffi : * mut dpp_group_GroupStateTransitionInfo) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_group_GroupStateTransitionInfo_get_group_contract_position < > (obj : * const dpp_group_GroupStateTransitionInfo) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . group_contract_position } # [no_mangle] pub unsafe extern "C" fn dpp_group_GroupStateTransitionInfo_get_action_id < > (obj : * const dpp_group_GroupStateTransitionInfo) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . action_id } # [no_mangle] pub unsafe extern "C" fn dpp_group_GroupStateTransitionInfo_get_action_is_proposer < > (obj : * const dpp_group_GroupStateTransitionInfo) -> bool { (* obj) . action_is_proposer } # [no_mangle] pub unsafe extern "C" fn dpp_group_GroupStateTransitionInfo_set_group_contract_position < > (obj : * const dpp_group_GroupStateTransitionInfo) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . group_contract_position } # [no_mangle] pub unsafe extern "C" fn dpp_group_GroupStateTransitionInfo_set_action_id < > (obj : * const dpp_group_GroupStateTransitionInfo) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . action_id } # [no_mangle] pub unsafe extern "C" fn dpp_group_GroupStateTransitionInfo_set_action_is_proposer < > (obj : * const dpp_group_GroupStateTransitionInfo) -> bool { (* obj) . action_is_proposer } pub mod group_action { use crate as dash_spv_apple_bindings ; } } pub mod errors { use crate as dash_spv_apple_bindings ; pub mod invalid_vector_size_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidVectorSizeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_invalid_vector_size_error_InvalidVectorSizeError { pub expected_size : usize , pub actual_size : usize } impl ferment :: FFIConversionFrom < dpp :: errors :: invalid_vector_size_error :: InvalidVectorSizeError > for dpp_errors_invalid_vector_size_error_InvalidVectorSizeError { unsafe fn ffi_from_const (ffi : * const dpp_errors_invalid_vector_size_error_InvalidVectorSizeError) -> dpp :: errors :: invalid_vector_size_error :: InvalidVectorSizeError { let ffi_ref = & * ffi ; dpp :: errors :: invalid_vector_size_error :: InvalidVectorSizeError { expected_size : ffi_ref . expected_size , actual_size : ffi_ref . actual_size } } } impl ferment :: FFIConversionTo < dpp :: errors :: invalid_vector_size_error :: InvalidVectorSizeError > for dpp_errors_invalid_vector_size_error_InvalidVectorSizeError { unsafe fn ffi_to_const (obj : dpp :: errors :: invalid_vector_size_error :: InvalidVectorSizeError) -> * const dpp_errors_invalid_vector_size_error_InvalidVectorSizeError { ferment :: boxed (dpp_errors_invalid_vector_size_error_InvalidVectorSizeError { expected_size : obj . expected_size , actual_size : obj . actual_size }) } } impl Drop for dpp_errors_invalid_vector_size_error_InvalidVectorSizeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_invalid_vector_size_error_InvalidVectorSizeError_ctor < > (expected_size : usize , actual_size : usize) -> * mut dpp_errors_invalid_vector_size_error_InvalidVectorSizeError { ferment :: boxed (dpp_errors_invalid_vector_size_error_InvalidVectorSizeError { expected_size , actual_size }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_invalid_vector_size_error_InvalidVectorSizeError_destroy < > (ffi : * mut dpp_errors_invalid_vector_size_error_InvalidVectorSizeError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_invalid_vector_size_error_InvalidVectorSizeError_get_expected_size < > (obj : * const dpp_errors_invalid_vector_size_error_InvalidVectorSizeError) -> usize { (* obj) . expected_size } # [no_mangle] pub unsafe extern "C" fn dpp_errors_invalid_vector_size_error_InvalidVectorSizeError_get_actual_size < > (obj : * const dpp_errors_invalid_vector_size_error_InvalidVectorSizeError) -> usize { (* obj) . actual_size } # [no_mangle] pub unsafe extern "C" fn dpp_errors_invalid_vector_size_error_InvalidVectorSizeError_set_expected_size < > (obj : * const dpp_errors_invalid_vector_size_error_InvalidVectorSizeError) -> usize { (* obj) . expected_size } # [no_mangle] pub unsafe extern "C" fn dpp_errors_invalid_vector_size_error_InvalidVectorSizeError_set_actual_size < > (obj : * const dpp_errors_invalid_vector_size_error_InvalidVectorSizeError) -> usize { (* obj) . actual_size } } pub mod serde_parsing_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`SerdeParsingError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_serde_parsing_error_SerdeParsingError { pub message : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: serde_parsing_error :: SerdeParsingError > for dpp_errors_serde_parsing_error_SerdeParsingError { unsafe fn ffi_from_const (ffi : * const dpp_errors_serde_parsing_error_SerdeParsingError) -> dpp :: errors :: serde_parsing_error :: SerdeParsingError { let ffi_ref = & * ffi ; dpp :: errors :: serde_parsing_error :: SerdeParsingError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . message) } } } impl ferment :: FFIConversionTo < dpp :: errors :: serde_parsing_error :: SerdeParsingError > for dpp_errors_serde_parsing_error_SerdeParsingError { unsafe fn ffi_to_const (obj : dpp :: errors :: serde_parsing_error :: SerdeParsingError) -> * const dpp_errors_serde_parsing_error_SerdeParsingError { ferment :: boxed (dpp_errors_serde_parsing_error_SerdeParsingError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . message) }) } } impl Drop for dpp_errors_serde_parsing_error_SerdeParsingError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . message) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_serde_parsing_error_SerdeParsingError_ctor < > (message : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_serde_parsing_error_SerdeParsingError { ferment :: boxed (dpp_errors_serde_parsing_error_SerdeParsingError { message }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_serde_parsing_error_SerdeParsingError_destroy < > (ffi : * mut dpp_errors_serde_parsing_error_SerdeParsingError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_serde_parsing_error_SerdeParsingError_get_message < > (obj : * const dpp_errors_serde_parsing_error_SerdeParsingError) -> * mut std :: os :: raw :: c_char { (* obj) . message } # [no_mangle] pub unsafe extern "C" fn dpp_errors_serde_parsing_error_SerdeParsingError_set_message < > (obj : * const dpp_errors_serde_parsing_error_SerdeParsingError) -> * mut std :: os :: raw :: c_char { (* obj) . message } } pub mod public_key_validation_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`PublicKeyValidationError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_public_key_validation_error_PublicKeyValidationError { pub message : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: public_key_validation_error :: PublicKeyValidationError > for dpp_errors_public_key_validation_error_PublicKeyValidationError { unsafe fn ffi_from_const (ffi : * const dpp_errors_public_key_validation_error_PublicKeyValidationError) -> dpp :: errors :: public_key_validation_error :: PublicKeyValidationError { let ffi_ref = & * ffi ; dpp :: errors :: public_key_validation_error :: PublicKeyValidationError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . message) } } } impl ferment :: FFIConversionTo < dpp :: errors :: public_key_validation_error :: PublicKeyValidationError > for dpp_errors_public_key_validation_error_PublicKeyValidationError { unsafe fn ffi_to_const (obj : dpp :: errors :: public_key_validation_error :: PublicKeyValidationError) -> * const dpp_errors_public_key_validation_error_PublicKeyValidationError { ferment :: boxed (dpp_errors_public_key_validation_error_PublicKeyValidationError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . message) }) } } impl Drop for dpp_errors_public_key_validation_error_PublicKeyValidationError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . message) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_public_key_validation_error_PublicKeyValidationError_ctor < > (message : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_public_key_validation_error_PublicKeyValidationError { ferment :: boxed (dpp_errors_public_key_validation_error_PublicKeyValidationError { message }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_public_key_validation_error_PublicKeyValidationError_destroy < > (ffi : * mut dpp_errors_public_key_validation_error_PublicKeyValidationError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_public_key_validation_error_PublicKeyValidationError_get_message < > (obj : * const dpp_errors_public_key_validation_error_PublicKeyValidationError) -> * mut std :: os :: raw :: c_char { (* obj) . message } # [no_mangle] pub unsafe extern "C" fn dpp_errors_public_key_validation_error_PublicKeyValidationError_set_message < > (obj : * const dpp_errors_public_key_validation_error_PublicKeyValidationError) -> * mut std :: os :: raw :: c_char { (* obj) . message } } pub mod dpp_init_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DashPlatformProtocolInitError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_errors_dpp_init_error_DashPlatformProtocolInitError { SchemaDeserializationError (* mut dash_spv_apple_bindings :: custom :: serde_json :: serde_json_Error) , InvalidSchemaError (* mut std :: os :: raw :: c_char) , UnknownVersionMismatch { method : * mut std :: os :: raw :: c_char , known_versions : * mut crate :: fermented :: generics :: Vec_versioned_feature_core_FeatureVersion , received : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion } } impl ferment :: FFIConversionFrom < dpp :: errors :: dpp_init_error :: DashPlatformProtocolInitError > for dpp_errors_dpp_init_error_DashPlatformProtocolInitError { unsafe fn ffi_from_const (ffi : * const dpp_errors_dpp_init_error_DashPlatformProtocolInitError) -> dpp :: errors :: dpp_init_error :: DashPlatformProtocolInitError { let ffi_ref = & * ffi ; match ffi_ref { dpp_errors_dpp_init_error_DashPlatformProtocolInitError :: SchemaDeserializationError (o_0) => dpp :: errors :: dpp_init_error :: DashPlatformProtocolInitError :: SchemaDeserializationError (< dash_spv_apple_bindings :: custom :: serde_json :: serde_json_Error as ferment :: FFIConversionFrom < serde_json :: Error >> :: ffi_from (* o_0)) , dpp_errors_dpp_init_error_DashPlatformProtocolInitError :: InvalidSchemaError (o_0) => dpp :: errors :: dpp_init_error :: DashPlatformProtocolInitError :: InvalidSchemaError (Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (* o_0)))) , dpp_errors_dpp_init_error_DashPlatformProtocolInitError :: UnknownVersionMismatch { method , known_versions , received } => dpp :: errors :: dpp_init_error :: DashPlatformProtocolInitError :: UnknownVersionMismatch { method : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* method) , known_versions : < crate :: fermented :: generics :: Vec_versioned_feature_core_FeatureVersion as ferment :: FFIConversionFrom < Vec < versioned_feature_core :: FeatureVersion > >> :: ffi_from (* known_versions) , received : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionFrom < versioned_feature_core :: FeatureVersion >> :: ffi_from (* received) } } } } impl ferment :: FFIConversionTo < dpp :: errors :: dpp_init_error :: DashPlatformProtocolInitError > for dpp_errors_dpp_init_error_DashPlatformProtocolInitError { unsafe fn ffi_to_const (obj : dpp :: errors :: dpp_init_error :: DashPlatformProtocolInitError) -> * const dpp_errors_dpp_init_error_DashPlatformProtocolInitError { ferment :: boxed (match obj { dpp :: errors :: dpp_init_error :: DashPlatformProtocolInitError :: SchemaDeserializationError (o_0) => dpp_errors_dpp_init_error_DashPlatformProtocolInitError :: SchemaDeserializationError (< dash_spv_apple_bindings :: custom :: serde_json :: serde_json_Error as ferment :: FFIConversionTo < serde_json :: Error >> :: ffi_to (o_0)) , dpp :: errors :: dpp_init_error :: DashPlatformProtocolInitError :: InvalidSchemaError (o_0) => dpp_errors_dpp_init_error_DashPlatformProtocolInitError :: InvalidSchemaError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < & str >> :: ffi_to (o_0)) , dpp :: errors :: dpp_init_error :: DashPlatformProtocolInitError :: UnknownVersionMismatch { method , known_versions , received } => dpp_errors_dpp_init_error_DashPlatformProtocolInitError :: UnknownVersionMismatch { method : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (method) , known_versions : < crate :: fermented :: generics :: Vec_versioned_feature_core_FeatureVersion as ferment :: FFIConversionTo < Vec < versioned_feature_core :: FeatureVersion > >> :: ffi_to (known_versions) , received : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionTo < versioned_feature_core :: FeatureVersion >> :: ffi_to (received) } , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_errors_dpp_init_error_DashPlatformProtocolInitError { fn drop (& mut self) { unsafe { match self { dpp_errors_dpp_init_error_DashPlatformProtocolInitError :: SchemaDeserializationError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_dpp_init_error_DashPlatformProtocolInitError :: InvalidSchemaError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_dpp_init_error_DashPlatformProtocolInitError :: UnknownVersionMismatch { method , known_versions , received } => { ferment :: unbox_string (* method) ; ; ferment :: unbox_any (* known_versions) ; ; ferment :: unbox_any (* received) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_dpp_init_error_DashPlatformProtocolInitError_SchemaDeserializationError_ctor (o_o_0 : * mut dash_spv_apple_bindings :: custom :: serde_json :: serde_json_Error) -> * mut dpp_errors_dpp_init_error_DashPlatformProtocolInitError { ferment :: boxed (dpp_errors_dpp_init_error_DashPlatformProtocolInitError :: SchemaDeserializationError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_dpp_init_error_DashPlatformProtocolInitError_InvalidSchemaError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_dpp_init_error_DashPlatformProtocolInitError { ferment :: boxed (dpp_errors_dpp_init_error_DashPlatformProtocolInitError :: InvalidSchemaError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_dpp_init_error_DashPlatformProtocolInitError_UnknownVersionMismatch_ctor (method : * mut std :: os :: raw :: c_char , known_versions : * mut crate :: fermented :: generics :: Vec_versioned_feature_core_FeatureVersion , received : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion) -> * mut dpp_errors_dpp_init_error_DashPlatformProtocolInitError { ferment :: boxed (dpp_errors_dpp_init_error_DashPlatformProtocolInitError :: UnknownVersionMismatch { method , known_versions , received }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_dpp_init_error_DashPlatformProtocolInitError_destroy < > (ffi : * mut dpp_errors_dpp_init_error_DashPlatformProtocolInitError) { ferment :: unbox_any (ffi) ; } } pub mod non_consensus_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`NonConsensusError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_errors_non_consensus_error_NonConsensusError { ValueError (* mut crate :: fermented :: types :: platform_value :: error :: platform_value_error_Error) , UnknownVersionMismatch { method : * mut std :: os :: raw :: c_char , known_versions : * mut crate :: fermented :: generics :: Vec_versioned_feature_core_FeatureVersion , received : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion } , SerdeParsingError (* mut crate :: fermented :: types :: dpp :: errors :: serde_parsing_error :: dpp_errors_serde_parsing_error_SerdeParsingError) , CompatibleProtocolVersionIsNotDefinedError (* mut crate :: fermented :: types :: dpp :: errors :: compatible_protocol_version_is_not_defined_error :: dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError) , SerdeJsonError (* mut std :: os :: raw :: c_char) , InvalidVectorSizeError (* mut crate :: fermented :: types :: dpp :: errors :: invalid_vector_size_error :: dpp_errors_invalid_vector_size_error_InvalidVectorSizeError) , StateRepositoryFetchError (* mut std :: os :: raw :: c_char) , WithdrawalError (* mut std :: os :: raw :: c_char) , IdentifierCreateError (* mut std :: os :: raw :: c_char) , StateTransitionCreationError (* mut std :: os :: raw :: c_char) , IdentityPublicKeyCreateError (* mut std :: os :: raw :: c_char) , RequiredPropertyError { property_name : * mut std :: os :: raw :: c_char } , InvalidDataProcessedError (* mut std :: os :: raw :: c_char) , ObjectCreationError { object_name : * mut std :: os :: raw :: c_char , details : * mut std :: os :: raw :: c_char } , DPPError (* mut crate :: fermented :: types :: dpp :: errors :: dpp_error :: dpp_errors_dpp_error_DPPError) , Error (* mut dash_spv_apple_bindings :: custom :: anyhow :: anyhow_Error) , Overflow (* mut std :: os :: raw :: c_char) } impl ferment :: FFIConversionFrom < dpp :: errors :: non_consensus_error :: NonConsensusError > for dpp_errors_non_consensus_error_NonConsensusError { unsafe fn ffi_from_const (ffi : * const dpp_errors_non_consensus_error_NonConsensusError) -> dpp :: errors :: non_consensus_error :: NonConsensusError { let ffi_ref = & * ffi ; match ffi_ref { dpp_errors_non_consensus_error_NonConsensusError :: ValueError (o_0) => dpp :: errors :: non_consensus_error :: NonConsensusError :: ValueError (< crate :: fermented :: types :: platform_value :: error :: platform_value_error_Error as ferment :: FFIConversionFrom < platform_value :: error :: Error >> :: ffi_from (* o_0)) , dpp_errors_non_consensus_error_NonConsensusError :: UnknownVersionMismatch { method , known_versions , received } => dpp :: errors :: non_consensus_error :: NonConsensusError :: UnknownVersionMismatch { method : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* method) , known_versions : < crate :: fermented :: generics :: Vec_versioned_feature_core_FeatureVersion as ferment :: FFIConversionFrom < Vec < versioned_feature_core :: FeatureVersion > >> :: ffi_from (* known_versions) , received : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionFrom < versioned_feature_core :: FeatureVersion >> :: ffi_from (* received) } , dpp_errors_non_consensus_error_NonConsensusError :: SerdeParsingError (o_0) => dpp :: errors :: non_consensus_error :: NonConsensusError :: SerdeParsingError (< crate :: fermented :: types :: dpp :: errors :: serde_parsing_error :: dpp_errors_serde_parsing_error_SerdeParsingError as ferment :: FFIConversionFrom < dpp :: errors :: serde_parsing_error :: SerdeParsingError >> :: ffi_from (* o_0)) , dpp_errors_non_consensus_error_NonConsensusError :: CompatibleProtocolVersionIsNotDefinedError (o_0) => dpp :: errors :: non_consensus_error :: NonConsensusError :: CompatibleProtocolVersionIsNotDefinedError (< crate :: fermented :: types :: dpp :: errors :: compatible_protocol_version_is_not_defined_error :: dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError as ferment :: FFIConversionFrom < dpp :: errors :: compatible_protocol_version_is_not_defined_error :: CompatibleProtocolVersionIsNotDefinedError >> :: ffi_from (* o_0)) , dpp_errors_non_consensus_error_NonConsensusError :: SerdeJsonError (o_0) => dpp :: errors :: non_consensus_error :: NonConsensusError :: SerdeJsonError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_non_consensus_error_NonConsensusError :: InvalidVectorSizeError (o_0) => dpp :: errors :: non_consensus_error :: NonConsensusError :: InvalidVectorSizeError (< crate :: fermented :: types :: dpp :: errors :: invalid_vector_size_error :: dpp_errors_invalid_vector_size_error_InvalidVectorSizeError as ferment :: FFIConversionFrom < dpp :: errors :: invalid_vector_size_error :: InvalidVectorSizeError >> :: ffi_from (* o_0)) , dpp_errors_non_consensus_error_NonConsensusError :: StateRepositoryFetchError (o_0) => dpp :: errors :: non_consensus_error :: NonConsensusError :: StateRepositoryFetchError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_non_consensus_error_NonConsensusError :: WithdrawalError (o_0) => dpp :: errors :: non_consensus_error :: NonConsensusError :: WithdrawalError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_non_consensus_error_NonConsensusError :: IdentifierCreateError (o_0) => dpp :: errors :: non_consensus_error :: NonConsensusError :: IdentifierCreateError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_non_consensus_error_NonConsensusError :: StateTransitionCreationError (o_0) => dpp :: errors :: non_consensus_error :: NonConsensusError :: StateTransitionCreationError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_non_consensus_error_NonConsensusError :: IdentityPublicKeyCreateError (o_0) => dpp :: errors :: non_consensus_error :: NonConsensusError :: IdentityPublicKeyCreateError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_non_consensus_error_NonConsensusError :: RequiredPropertyError { property_name } => dpp :: errors :: non_consensus_error :: NonConsensusError :: RequiredPropertyError { property_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* property_name) } , dpp_errors_non_consensus_error_NonConsensusError :: InvalidDataProcessedError (o_0) => dpp :: errors :: non_consensus_error :: NonConsensusError :: InvalidDataProcessedError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_non_consensus_error_NonConsensusError :: ObjectCreationError { object_name , details } => dpp :: errors :: non_consensus_error :: NonConsensusError :: ObjectCreationError { object_name : Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (* object_name))) , details : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* details) } , dpp_errors_non_consensus_error_NonConsensusError :: DPPError (o_0) => dpp :: errors :: non_consensus_error :: NonConsensusError :: DPPError (< crate :: fermented :: types :: dpp :: errors :: dpp_error :: dpp_errors_dpp_error_DPPError as ferment :: FFIConversionFrom < dpp :: errors :: dpp_error :: DPPError >> :: ffi_from (* o_0)) , dpp_errors_non_consensus_error_NonConsensusError :: Error (o_0) => dpp :: errors :: non_consensus_error :: NonConsensusError :: Error (< dash_spv_apple_bindings :: custom :: anyhow :: anyhow_Error as ferment :: FFIConversionFrom < anyhow :: Error >> :: ffi_from (* o_0)) , dpp_errors_non_consensus_error_NonConsensusError :: Overflow (o_0) => dpp :: errors :: non_consensus_error :: NonConsensusError :: Overflow (Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (* o_0)))) } } } impl ferment :: FFIConversionTo < dpp :: errors :: non_consensus_error :: NonConsensusError > for dpp_errors_non_consensus_error_NonConsensusError { unsafe fn ffi_to_const (obj : dpp :: errors :: non_consensus_error :: NonConsensusError) -> * const dpp_errors_non_consensus_error_NonConsensusError { ferment :: boxed (match obj { dpp :: errors :: non_consensus_error :: NonConsensusError :: ValueError (o_0) => dpp_errors_non_consensus_error_NonConsensusError :: ValueError (< crate :: fermented :: types :: platform_value :: error :: platform_value_error_Error as ferment :: FFIConversionTo < platform_value :: error :: Error >> :: ffi_to (o_0)) , dpp :: errors :: non_consensus_error :: NonConsensusError :: UnknownVersionMismatch { method , known_versions , received } => dpp_errors_non_consensus_error_NonConsensusError :: UnknownVersionMismatch { method : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (method) , known_versions : < crate :: fermented :: generics :: Vec_versioned_feature_core_FeatureVersion as ferment :: FFIConversionTo < Vec < versioned_feature_core :: FeatureVersion > >> :: ffi_to (known_versions) , received : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionTo < versioned_feature_core :: FeatureVersion >> :: ffi_to (received) } , dpp :: errors :: non_consensus_error :: NonConsensusError :: SerdeParsingError (o_0) => dpp_errors_non_consensus_error_NonConsensusError :: SerdeParsingError (< crate :: fermented :: types :: dpp :: errors :: serde_parsing_error :: dpp_errors_serde_parsing_error_SerdeParsingError as ferment :: FFIConversionTo < dpp :: errors :: serde_parsing_error :: SerdeParsingError >> :: ffi_to (o_0)) , dpp :: errors :: non_consensus_error :: NonConsensusError :: CompatibleProtocolVersionIsNotDefinedError (o_0) => dpp_errors_non_consensus_error_NonConsensusError :: CompatibleProtocolVersionIsNotDefinedError (< crate :: fermented :: types :: dpp :: errors :: compatible_protocol_version_is_not_defined_error :: dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError as ferment :: FFIConversionTo < dpp :: errors :: compatible_protocol_version_is_not_defined_error :: CompatibleProtocolVersionIsNotDefinedError >> :: ffi_to (o_0)) , dpp :: errors :: non_consensus_error :: NonConsensusError :: SerdeJsonError (o_0) => dpp_errors_non_consensus_error_NonConsensusError :: SerdeJsonError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: non_consensus_error :: NonConsensusError :: InvalidVectorSizeError (o_0) => dpp_errors_non_consensus_error_NonConsensusError :: InvalidVectorSizeError (< crate :: fermented :: types :: dpp :: errors :: invalid_vector_size_error :: dpp_errors_invalid_vector_size_error_InvalidVectorSizeError as ferment :: FFIConversionTo < dpp :: errors :: invalid_vector_size_error :: InvalidVectorSizeError >> :: ffi_to (o_0)) , dpp :: errors :: non_consensus_error :: NonConsensusError :: StateRepositoryFetchError (o_0) => dpp_errors_non_consensus_error_NonConsensusError :: StateRepositoryFetchError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: non_consensus_error :: NonConsensusError :: WithdrawalError (o_0) => dpp_errors_non_consensus_error_NonConsensusError :: WithdrawalError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: non_consensus_error :: NonConsensusError :: IdentifierCreateError (o_0) => dpp_errors_non_consensus_error_NonConsensusError :: IdentifierCreateError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: non_consensus_error :: NonConsensusError :: StateTransitionCreationError (o_0) => dpp_errors_non_consensus_error_NonConsensusError :: StateTransitionCreationError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: non_consensus_error :: NonConsensusError :: IdentityPublicKeyCreateError (o_0) => dpp_errors_non_consensus_error_NonConsensusError :: IdentityPublicKeyCreateError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: non_consensus_error :: NonConsensusError :: RequiredPropertyError { property_name } => dpp_errors_non_consensus_error_NonConsensusError :: RequiredPropertyError { property_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (property_name) } , dpp :: errors :: non_consensus_error :: NonConsensusError :: InvalidDataProcessedError (o_0) => dpp_errors_non_consensus_error_NonConsensusError :: InvalidDataProcessedError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: non_consensus_error :: NonConsensusError :: ObjectCreationError { object_name , details } => dpp_errors_non_consensus_error_NonConsensusError :: ObjectCreationError { object_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < & str >> :: ffi_to (object_name) , details : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (details) } , dpp :: errors :: non_consensus_error :: NonConsensusError :: DPPError (o_0) => dpp_errors_non_consensus_error_NonConsensusError :: DPPError (< crate :: fermented :: types :: dpp :: errors :: dpp_error :: dpp_errors_dpp_error_DPPError as ferment :: FFIConversionTo < dpp :: errors :: dpp_error :: DPPError >> :: ffi_to (o_0)) , dpp :: errors :: non_consensus_error :: NonConsensusError :: Error (o_0) => dpp_errors_non_consensus_error_NonConsensusError :: Error (< dash_spv_apple_bindings :: custom :: anyhow :: anyhow_Error as ferment :: FFIConversionTo < anyhow :: Error >> :: ffi_to (o_0)) , dpp :: errors :: non_consensus_error :: NonConsensusError :: Overflow (o_0) => dpp_errors_non_consensus_error_NonConsensusError :: Overflow (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < & str >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_errors_non_consensus_error_NonConsensusError { fn drop (& mut self) { unsafe { match self { dpp_errors_non_consensus_error_NonConsensusError :: ValueError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_non_consensus_error_NonConsensusError :: UnknownVersionMismatch { method , known_versions , received } => { ferment :: unbox_string (* method) ; ; ferment :: unbox_any (* known_versions) ; ; ferment :: unbox_any (* received) ; } , dpp_errors_non_consensus_error_NonConsensusError :: SerdeParsingError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_non_consensus_error_NonConsensusError :: CompatibleProtocolVersionIsNotDefinedError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_non_consensus_error_NonConsensusError :: SerdeJsonError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_non_consensus_error_NonConsensusError :: InvalidVectorSizeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_non_consensus_error_NonConsensusError :: StateRepositoryFetchError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_non_consensus_error_NonConsensusError :: WithdrawalError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_non_consensus_error_NonConsensusError :: IdentifierCreateError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_non_consensus_error_NonConsensusError :: StateTransitionCreationError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_non_consensus_error_NonConsensusError :: IdentityPublicKeyCreateError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_non_consensus_error_NonConsensusError :: RequiredPropertyError { property_name } => { ferment :: unbox_string (* property_name) ; } , dpp_errors_non_consensus_error_NonConsensusError :: InvalidDataProcessedError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_non_consensus_error_NonConsensusError :: ObjectCreationError { object_name , details } => { ferment :: unbox_string (* object_name) ; ; ferment :: unbox_string (* details) ; } , dpp_errors_non_consensus_error_NonConsensusError :: DPPError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_non_consensus_error_NonConsensusError :: Error (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_non_consensus_error_NonConsensusError :: Overflow (o_0) => { ferment :: unbox_string (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_non_consensus_error_NonConsensusError_ValueError_ctor (o_o_0 : * mut crate :: fermented :: types :: platform_value :: error :: platform_value_error_Error) -> * mut dpp_errors_non_consensus_error_NonConsensusError { ferment :: boxed (dpp_errors_non_consensus_error_NonConsensusError :: ValueError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_non_consensus_error_NonConsensusError_UnknownVersionMismatch_ctor (method : * mut std :: os :: raw :: c_char , known_versions : * mut crate :: fermented :: generics :: Vec_versioned_feature_core_FeatureVersion , received : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion) -> * mut dpp_errors_non_consensus_error_NonConsensusError { ferment :: boxed (dpp_errors_non_consensus_error_NonConsensusError :: UnknownVersionMismatch { method , known_versions , received }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_non_consensus_error_NonConsensusError_SerdeParsingError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: serde_parsing_error :: dpp_errors_serde_parsing_error_SerdeParsingError) -> * mut dpp_errors_non_consensus_error_NonConsensusError { ferment :: boxed (dpp_errors_non_consensus_error_NonConsensusError :: SerdeParsingError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_non_consensus_error_NonConsensusError_CompatibleProtocolVersionIsNotDefinedError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: compatible_protocol_version_is_not_defined_error :: dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError) -> * mut dpp_errors_non_consensus_error_NonConsensusError { ferment :: boxed (dpp_errors_non_consensus_error_NonConsensusError :: CompatibleProtocolVersionIsNotDefinedError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_non_consensus_error_NonConsensusError_SerdeJsonError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_non_consensus_error_NonConsensusError { ferment :: boxed (dpp_errors_non_consensus_error_NonConsensusError :: SerdeJsonError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_non_consensus_error_NonConsensusError_InvalidVectorSizeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: invalid_vector_size_error :: dpp_errors_invalid_vector_size_error_InvalidVectorSizeError) -> * mut dpp_errors_non_consensus_error_NonConsensusError { ferment :: boxed (dpp_errors_non_consensus_error_NonConsensusError :: InvalidVectorSizeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_non_consensus_error_NonConsensusError_StateRepositoryFetchError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_non_consensus_error_NonConsensusError { ferment :: boxed (dpp_errors_non_consensus_error_NonConsensusError :: StateRepositoryFetchError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_non_consensus_error_NonConsensusError_WithdrawalError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_non_consensus_error_NonConsensusError { ferment :: boxed (dpp_errors_non_consensus_error_NonConsensusError :: WithdrawalError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_non_consensus_error_NonConsensusError_IdentifierCreateError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_non_consensus_error_NonConsensusError { ferment :: boxed (dpp_errors_non_consensus_error_NonConsensusError :: IdentifierCreateError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_non_consensus_error_NonConsensusError_StateTransitionCreationError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_non_consensus_error_NonConsensusError { ferment :: boxed (dpp_errors_non_consensus_error_NonConsensusError :: StateTransitionCreationError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_non_consensus_error_NonConsensusError_IdentityPublicKeyCreateError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_non_consensus_error_NonConsensusError { ferment :: boxed (dpp_errors_non_consensus_error_NonConsensusError :: IdentityPublicKeyCreateError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_non_consensus_error_NonConsensusError_RequiredPropertyError_ctor (property_name : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_non_consensus_error_NonConsensusError { ferment :: boxed (dpp_errors_non_consensus_error_NonConsensusError :: RequiredPropertyError { property_name }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_non_consensus_error_NonConsensusError_InvalidDataProcessedError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_non_consensus_error_NonConsensusError { ferment :: boxed (dpp_errors_non_consensus_error_NonConsensusError :: InvalidDataProcessedError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_non_consensus_error_NonConsensusError_ObjectCreationError_ctor (object_name : * mut std :: os :: raw :: c_char , details : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_non_consensus_error_NonConsensusError { ferment :: boxed (dpp_errors_non_consensus_error_NonConsensusError :: ObjectCreationError { object_name , details }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_non_consensus_error_NonConsensusError_DPPError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: dpp_error :: dpp_errors_dpp_error_DPPError) -> * mut dpp_errors_non_consensus_error_NonConsensusError { ferment :: boxed (dpp_errors_non_consensus_error_NonConsensusError :: DPPError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_non_consensus_error_NonConsensusError_Error_ctor (o_o_0 : * mut dash_spv_apple_bindings :: custom :: anyhow :: anyhow_Error) -> * mut dpp_errors_non_consensus_error_NonConsensusError { ferment :: boxed (dpp_errors_non_consensus_error_NonConsensusError :: Error (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_non_consensus_error_NonConsensusError_Overflow_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_non_consensus_error_NonConsensusError { ferment :: boxed (dpp_errors_non_consensus_error_NonConsensusError :: Overflow (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_non_consensus_error_NonConsensusError_destroy < > (ffi : * mut dpp_errors_non_consensus_error_NonConsensusError) { ferment :: unbox_any (ffi) ; } } pub mod dpp_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DPPError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_errors_dpp_error_DPPError { AssetLockOutputNotFoundError (* mut crate :: fermented :: types :: dpp :: identity :: errors :: asset_lock_output_not_found_error :: dpp_identity_errors_asset_lock_output_not_found_error_AssetLockOutputNotFoundError) , AssetLockTransactionIsNotFoundError (* mut crate :: fermented :: types :: dpp :: identity :: errors :: asset_lock_transaction_is_not_found_error :: dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError) , WrongPublicKeyHashSize , WrongBurnOutputType , InvalidAssetLockTransaction , CoreMessageCorruption (* mut std :: os :: raw :: c_char) } impl ferment :: FFIConversionFrom < dpp :: errors :: dpp_error :: DPPError > for dpp_errors_dpp_error_DPPError { unsafe fn ffi_from_const (ffi : * const dpp_errors_dpp_error_DPPError) -> dpp :: errors :: dpp_error :: DPPError { let ffi_ref = & * ffi ; match ffi_ref { dpp_errors_dpp_error_DPPError :: AssetLockOutputNotFoundError (o_0) => dpp :: errors :: dpp_error :: DPPError :: AssetLockOutputNotFoundError (< crate :: fermented :: types :: dpp :: identity :: errors :: asset_lock_output_not_found_error :: dpp_identity_errors_asset_lock_output_not_found_error_AssetLockOutputNotFoundError as ferment :: FFIConversionFrom < dpp :: identity :: errors :: asset_lock_output_not_found_error :: AssetLockOutputNotFoundError >> :: ffi_from (* o_0)) , dpp_errors_dpp_error_DPPError :: AssetLockTransactionIsNotFoundError (o_0) => dpp :: errors :: dpp_error :: DPPError :: AssetLockTransactionIsNotFoundError (< crate :: fermented :: types :: dpp :: identity :: errors :: asset_lock_transaction_is_not_found_error :: dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError as ferment :: FFIConversionFrom < dpp :: identity :: errors :: asset_lock_transaction_is_not_found_error :: AssetLockTransactionIsNotFoundError >> :: ffi_from (* o_0)) , dpp_errors_dpp_error_DPPError :: WrongPublicKeyHashSize => dpp :: errors :: dpp_error :: DPPError :: WrongPublicKeyHashSize , dpp_errors_dpp_error_DPPError :: WrongBurnOutputType => dpp :: errors :: dpp_error :: DPPError :: WrongBurnOutputType , dpp_errors_dpp_error_DPPError :: InvalidAssetLockTransaction => dpp :: errors :: dpp_error :: DPPError :: InvalidAssetLockTransaction , dpp_errors_dpp_error_DPPError :: CoreMessageCorruption (o_0) => dpp :: errors :: dpp_error :: DPPError :: CoreMessageCorruption (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: errors :: dpp_error :: DPPError > for dpp_errors_dpp_error_DPPError { unsafe fn ffi_to_const (obj : dpp :: errors :: dpp_error :: DPPError) -> * const dpp_errors_dpp_error_DPPError { ferment :: boxed (match obj { dpp :: errors :: dpp_error :: DPPError :: AssetLockOutputNotFoundError (o_0) => dpp_errors_dpp_error_DPPError :: AssetLockOutputNotFoundError (< crate :: fermented :: types :: dpp :: identity :: errors :: asset_lock_output_not_found_error :: dpp_identity_errors_asset_lock_output_not_found_error_AssetLockOutputNotFoundError as ferment :: FFIConversionTo < dpp :: identity :: errors :: asset_lock_output_not_found_error :: AssetLockOutputNotFoundError >> :: ffi_to (o_0)) , dpp :: errors :: dpp_error :: DPPError :: AssetLockTransactionIsNotFoundError (o_0) => dpp_errors_dpp_error_DPPError :: AssetLockTransactionIsNotFoundError (< crate :: fermented :: types :: dpp :: identity :: errors :: asset_lock_transaction_is_not_found_error :: dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError as ferment :: FFIConversionTo < dpp :: identity :: errors :: asset_lock_transaction_is_not_found_error :: AssetLockTransactionIsNotFoundError >> :: ffi_to (o_0)) , dpp :: errors :: dpp_error :: DPPError :: WrongPublicKeyHashSize => dpp_errors_dpp_error_DPPError :: WrongPublicKeyHashSize , dpp :: errors :: dpp_error :: DPPError :: WrongBurnOutputType => dpp_errors_dpp_error_DPPError :: WrongBurnOutputType , dpp :: errors :: dpp_error :: DPPError :: InvalidAssetLockTransaction => dpp_errors_dpp_error_DPPError :: InvalidAssetLockTransaction , dpp :: errors :: dpp_error :: DPPError :: CoreMessageCorruption (o_0) => dpp_errors_dpp_error_DPPError :: CoreMessageCorruption (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_errors_dpp_error_DPPError { fn drop (& mut self) { unsafe { match self { dpp_errors_dpp_error_DPPError :: AssetLockOutputNotFoundError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_dpp_error_DPPError :: AssetLockTransactionIsNotFoundError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_dpp_error_DPPError :: WrongPublicKeyHashSize => { } , dpp_errors_dpp_error_DPPError :: WrongBurnOutputType => { } , dpp_errors_dpp_error_DPPError :: InvalidAssetLockTransaction => { } , dpp_errors_dpp_error_DPPError :: CoreMessageCorruption (o_0) => { ferment :: unbox_string (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_dpp_error_DPPError_AssetLockOutputNotFoundError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: identity :: errors :: asset_lock_output_not_found_error :: dpp_identity_errors_asset_lock_output_not_found_error_AssetLockOutputNotFoundError) -> * mut dpp_errors_dpp_error_DPPError { ferment :: boxed (dpp_errors_dpp_error_DPPError :: AssetLockOutputNotFoundError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_dpp_error_DPPError_AssetLockTransactionIsNotFoundError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: identity :: errors :: asset_lock_transaction_is_not_found_error :: dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError) -> * mut dpp_errors_dpp_error_DPPError { ferment :: boxed (dpp_errors_dpp_error_DPPError :: AssetLockTransactionIsNotFoundError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_dpp_error_DPPError_WrongPublicKeyHashSize_ctor () -> * mut dpp_errors_dpp_error_DPPError { ferment :: boxed (dpp_errors_dpp_error_DPPError :: WrongPublicKeyHashSize { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_dpp_error_DPPError_WrongBurnOutputType_ctor () -> * mut dpp_errors_dpp_error_DPPError { ferment :: boxed (dpp_errors_dpp_error_DPPError :: WrongBurnOutputType { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_dpp_error_DPPError_InvalidAssetLockTransaction_ctor () -> * mut dpp_errors_dpp_error_DPPError { ferment :: boxed (dpp_errors_dpp_error_DPPError :: InvalidAssetLockTransaction { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_dpp_error_DPPError_CoreMessageCorruption_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_dpp_error_DPPError { ferment :: boxed (dpp_errors_dpp_error_DPPError :: CoreMessageCorruption (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_dpp_error_DPPError_destroy < > (ffi : * mut dpp_errors_dpp_error_DPPError) { ferment :: unbox_any (ffi) ; } } pub mod compatible_protocol_version_is_not_defined_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`CompatibleProtocolVersionIsNotDefinedError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError { pub current_protocol_version : u32 } impl ferment :: FFIConversionFrom < dpp :: errors :: compatible_protocol_version_is_not_defined_error :: CompatibleProtocolVersionIsNotDefinedError > for dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError { unsafe fn ffi_from_const (ffi : * const dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError) -> dpp :: errors :: compatible_protocol_version_is_not_defined_error :: CompatibleProtocolVersionIsNotDefinedError { let ffi_ref = & * ffi ; dpp :: errors :: compatible_protocol_version_is_not_defined_error :: CompatibleProtocolVersionIsNotDefinedError { current_protocol_version : ffi_ref . current_protocol_version } } } impl ferment :: FFIConversionTo < dpp :: errors :: compatible_protocol_version_is_not_defined_error :: CompatibleProtocolVersionIsNotDefinedError > for dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError { unsafe fn ffi_to_const (obj : dpp :: errors :: compatible_protocol_version_is_not_defined_error :: CompatibleProtocolVersionIsNotDefinedError) -> * const dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError { ferment :: boxed (dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError { current_protocol_version : obj . current_protocol_version }) } } impl Drop for dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError_ctor < > (current_protocol_version : u32) -> * mut dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError { ferment :: boxed (dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError { current_protocol_version }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError_destroy < > (ffi : * mut dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError_get_current_protocol_version < > (obj : * const dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError) -> u32 { (* obj) . current_protocol_version } # [no_mangle] pub unsafe extern "C" fn dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError_set_current_protocol_version < > (obj : * const dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError) -> u32 { (* obj) . current_protocol_version } } pub mod consensus { use crate as dash_spv_apple_bindings ; pub mod basic { use crate as dash_spv_apple_bindings ; pub mod document { use crate as dash_spv_apple_bindings ; pub mod document_transitions_are_absent_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentTransitionsAreAbsentError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_document_document_transitions_are_absent_error_DocumentTransitionsAreAbsentError { } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: document_transitions_are_absent_error :: DocumentTransitionsAreAbsentError > for dpp_errors_consensus_basic_document_document_transitions_are_absent_error_DocumentTransitionsAreAbsentError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_document_document_transitions_are_absent_error_DocumentTransitionsAreAbsentError) -> dpp :: errors :: consensus :: basic :: document :: document_transitions_are_absent_error :: DocumentTransitionsAreAbsentError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: document :: document_transitions_are_absent_error :: DocumentTransitionsAreAbsentError { } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: document_transitions_are_absent_error :: DocumentTransitionsAreAbsentError > for dpp_errors_consensus_basic_document_document_transitions_are_absent_error_DocumentTransitionsAreAbsentError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: document :: document_transitions_are_absent_error :: DocumentTransitionsAreAbsentError) -> * const dpp_errors_consensus_basic_document_document_transitions_are_absent_error_DocumentTransitionsAreAbsentError { ferment :: boxed (dpp_errors_consensus_basic_document_document_transitions_are_absent_error_DocumentTransitionsAreAbsentError { }) } } impl Drop for dpp_errors_consensus_basic_document_document_transitions_are_absent_error_DocumentTransitionsAreAbsentError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_document_transitions_are_absent_error_DocumentTransitionsAreAbsentError_ctor < > () -> * mut dpp_errors_consensus_basic_document_document_transitions_are_absent_error_DocumentTransitionsAreAbsentError { ferment :: boxed (dpp_errors_consensus_basic_document_document_transitions_are_absent_error_DocumentTransitionsAreAbsentError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_document_transitions_are_absent_error_DocumentTransitionsAreAbsentError_destroy < > (ffi : * mut dpp_errors_consensus_basic_document_document_transitions_are_absent_error_DocumentTransitionsAreAbsentError) { ferment :: unbox_any (ffi) ; } } pub mod duplicate_document_transitions_with_indices_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DuplicateDocumentTransitionsWithIndicesError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError { pub references : * mut crate :: fermented :: generics :: Vec_Tuple_String_Arr_u8_32 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_indices_error :: DuplicateDocumentTransitionsWithIndicesError > for dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError) -> dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_indices_error :: DuplicateDocumentTransitionsWithIndicesError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_indices_error :: DuplicateDocumentTransitionsWithIndicesError { references : < crate :: fermented :: generics :: Vec_Tuple_String_Arr_u8_32 as ferment :: FFIConversionFrom < Vec < (String , [u8 ; 32]) > >> :: ffi_from (ffi_ref . references) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_indices_error :: DuplicateDocumentTransitionsWithIndicesError > for dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_indices_error :: DuplicateDocumentTransitionsWithIndicesError) -> * const dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError { ferment :: boxed (dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError { references : < crate :: fermented :: generics :: Vec_Tuple_String_Arr_u8_32 as ferment :: FFIConversionTo < Vec < (String , [u8 ; 32]) > >> :: ffi_to (obj . references) }) } } impl Drop for dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . references) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError_ctor < > (references : * mut crate :: fermented :: generics :: Vec_Tuple_String_Arr_u8_32) -> * mut dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError { ferment :: boxed (dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError { references }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError_destroy < > (ffi : * mut dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError_get_references < > (obj : * const dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError) -> * mut crate :: fermented :: generics :: Vec_Tuple_String_Arr_u8_32 { (* obj) . references } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError_set_references < > (obj : * const dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError) -> * mut crate :: fermented :: generics :: Vec_Tuple_String_Arr_u8_32 { (* obj) . references } } pub mod invalid_document_transition_id_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidDocumentTransitionIdError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError { pub expected_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub invalid_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_id_error :: InvalidDocumentTransitionIdError > for dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError) -> dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_id_error :: InvalidDocumentTransitionIdError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_id_error :: InvalidDocumentTransitionIdError { expected_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . expected_id) , invalid_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . invalid_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_id_error :: InvalidDocumentTransitionIdError > for dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_id_error :: InvalidDocumentTransitionIdError) -> * const dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError { ferment :: boxed (dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError { expected_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . expected_id) , invalid_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . invalid_id) }) } } impl Drop for dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . expected_id) ; ferment :: unbox_any (ffi_ref . invalid_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError_ctor < > (expected_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , invalid_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError { ferment :: boxed (dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError { expected_id , invalid_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError_destroy < > (ffi : * mut dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError_get_expected_id < > (obj : * const dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . expected_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError_get_invalid_id < > (obj : * const dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . invalid_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError_set_expected_id < > (obj : * const dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . expected_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError_set_invalid_id < > (obj : * const dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . invalid_id } } pub mod missing_data_contract_id_basic_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MissingDataContractIdBasicError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_document_missing_data_contract_id_basic_error_MissingDataContractIdBasicError { } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: missing_data_contract_id_basic_error :: MissingDataContractIdBasicError > for dpp_errors_consensus_basic_document_missing_data_contract_id_basic_error_MissingDataContractIdBasicError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_document_missing_data_contract_id_basic_error_MissingDataContractIdBasicError) -> dpp :: errors :: consensus :: basic :: document :: missing_data_contract_id_basic_error :: MissingDataContractIdBasicError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: document :: missing_data_contract_id_basic_error :: MissingDataContractIdBasicError { } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: missing_data_contract_id_basic_error :: MissingDataContractIdBasicError > for dpp_errors_consensus_basic_document_missing_data_contract_id_basic_error_MissingDataContractIdBasicError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: document :: missing_data_contract_id_basic_error :: MissingDataContractIdBasicError) -> * const dpp_errors_consensus_basic_document_missing_data_contract_id_basic_error_MissingDataContractIdBasicError { ferment :: boxed (dpp_errors_consensus_basic_document_missing_data_contract_id_basic_error_MissingDataContractIdBasicError { }) } } impl Drop for dpp_errors_consensus_basic_document_missing_data_contract_id_basic_error_MissingDataContractIdBasicError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_missing_data_contract_id_basic_error_MissingDataContractIdBasicError_ctor < > () -> * mut dpp_errors_consensus_basic_document_missing_data_contract_id_basic_error_MissingDataContractIdBasicError { ferment :: boxed (dpp_errors_consensus_basic_document_missing_data_contract_id_basic_error_MissingDataContractIdBasicError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_missing_data_contract_id_basic_error_MissingDataContractIdBasicError_destroy < > (ffi : * mut dpp_errors_consensus_basic_document_missing_data_contract_id_basic_error_MissingDataContractIdBasicError) { ferment :: unbox_any (ffi) ; } } pub mod invalid_document_type_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidDocumentTypeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError { pub document_type : * mut std :: os :: raw :: c_char , pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: invalid_document_type_error :: InvalidDocumentTypeError > for dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError) -> dpp :: errors :: consensus :: basic :: document :: invalid_document_type_error :: InvalidDocumentTypeError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: document :: invalid_document_type_error :: InvalidDocumentTypeError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type) , data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: invalid_document_type_error :: InvalidDocumentTypeError > for dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: document :: invalid_document_type_error :: InvalidDocumentTypeError) -> * const dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError { ferment :: boxed (dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type) , data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) }) } } impl Drop for dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . document_type) ; ferment :: unbox_any (ffi_ref . data_contract_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError_ctor < > (document_type : * mut std :: os :: raw :: c_char , data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError { ferment :: boxed (dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError { document_type , data_contract_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError_destroy < > (ffi : * mut dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError_get_document_type < > (obj : * const dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError_get_data_contract_id < > (obj : * const dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError_set_document_type < > (obj : * const dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError_set_data_contract_id < > (obj : * const dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } } pub mod duplicate_document_transitions_with_ids_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DuplicateDocumentTransitionsWithIdsError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError { pub references : * mut crate :: fermented :: generics :: Vec_Tuple_String_Arr_u8_32 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_ids_error :: DuplicateDocumentTransitionsWithIdsError > for dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError) -> dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_ids_error :: DuplicateDocumentTransitionsWithIdsError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_ids_error :: DuplicateDocumentTransitionsWithIdsError { references : < crate :: fermented :: generics :: Vec_Tuple_String_Arr_u8_32 as ferment :: FFIConversionFrom < Vec < (String , [u8 ; 32]) > >> :: ffi_from (ffi_ref . references) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_ids_error :: DuplicateDocumentTransitionsWithIdsError > for dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_ids_error :: DuplicateDocumentTransitionsWithIdsError) -> * const dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError { ferment :: boxed (dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError { references : < crate :: fermented :: generics :: Vec_Tuple_String_Arr_u8_32 as ferment :: FFIConversionTo < Vec < (String , [u8 ; 32]) > >> :: ffi_to (obj . references) }) } } impl Drop for dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . references) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError_ctor < > (references : * mut crate :: fermented :: generics :: Vec_Tuple_String_Arr_u8_32) -> * mut dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError { ferment :: boxed (dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError { references }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError_destroy < > (ffi : * mut dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError_get_references < > (obj : * const dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError) -> * mut crate :: fermented :: generics :: Vec_Tuple_String_Arr_u8_32 { (* obj) . references } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError_set_references < > (obj : * const dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError) -> * mut crate :: fermented :: generics :: Vec_Tuple_String_Arr_u8_32 { (* obj) . references } } pub mod data_contract_not_present_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractNotPresentError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError { pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: data_contract_not_present_error :: DataContractNotPresentError > for dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError) -> dpp :: errors :: consensus :: basic :: document :: data_contract_not_present_error :: DataContractNotPresentError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: document :: data_contract_not_present_error :: DataContractNotPresentError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: data_contract_not_present_error :: DataContractNotPresentError > for dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: document :: data_contract_not_present_error :: DataContractNotPresentError) -> * const dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError { ferment :: boxed (dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) }) } } impl Drop for dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data_contract_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError_ctor < > (data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError { ferment :: boxed (dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError { data_contract_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError_destroy < > (ffi : * mut dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError_get_data_contract_id < > (obj : * const dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError_set_data_contract_id < > (obj : * const dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } } pub mod identity_contract_nonce_out_of_bounds_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`NonceOutOfBoundsError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError { pub nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: identity_contract_nonce_out_of_bounds_error :: NonceOutOfBoundsError > for dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError) -> dpp :: errors :: consensus :: basic :: document :: identity_contract_nonce_out_of_bounds_error :: NonceOutOfBoundsError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: document :: identity_contract_nonce_out_of_bounds_error :: NonceOutOfBoundsError { nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionFrom < dpp :: prelude :: IdentityNonce >> :: ffi_from (ffi_ref . nonce) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: identity_contract_nonce_out_of_bounds_error :: NonceOutOfBoundsError > for dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: document :: identity_contract_nonce_out_of_bounds_error :: NonceOutOfBoundsError) -> * const dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError { ferment :: boxed (dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError { nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionTo < dpp :: prelude :: IdentityNonce >> :: ffi_to (obj . nonce) }) } } impl Drop for dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . nonce) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError_ctor < > (nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce) -> * mut dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError { ferment :: boxed (dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError { nonce }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError_destroy < > (ffi : * mut dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError_get_nonce < > (obj : * const dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . nonce } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError_set_nonce < > (obj : * const dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . nonce } } pub mod document_field_max_size_exceeded_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentFieldMaxSizeExceededError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError { pub field : * mut std :: os :: raw :: c_char , pub actual_size_bytes : u64 , pub max_size_bytes : u64 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: document_field_max_size_exceeded_error :: DocumentFieldMaxSizeExceededError > for dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError) -> dpp :: errors :: consensus :: basic :: document :: document_field_max_size_exceeded_error :: DocumentFieldMaxSizeExceededError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: document :: document_field_max_size_exceeded_error :: DocumentFieldMaxSizeExceededError { field : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . field) , actual_size_bytes : ffi_ref . actual_size_bytes , max_size_bytes : ffi_ref . max_size_bytes } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: document_field_max_size_exceeded_error :: DocumentFieldMaxSizeExceededError > for dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: document :: document_field_max_size_exceeded_error :: DocumentFieldMaxSizeExceededError) -> * const dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError { ferment :: boxed (dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError { field : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . field) , actual_size_bytes : obj . actual_size_bytes , max_size_bytes : obj . max_size_bytes }) } } impl Drop for dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . field) ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError_ctor < > (field : * mut std :: os :: raw :: c_char , actual_size_bytes : u64 , max_size_bytes : u64) -> * mut dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError { ferment :: boxed (dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError { field , actual_size_bytes , max_size_bytes }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError_destroy < > (ffi : * mut dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError_get_field < > (obj : * const dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError) -> * mut std :: os :: raw :: c_char { (* obj) . field } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError_get_actual_size_bytes < > (obj : * const dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError) -> u64 { (* obj) . actual_size_bytes } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError_get_max_size_bytes < > (obj : * const dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError) -> u64 { (* obj) . max_size_bytes } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError_set_field < > (obj : * const dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError) -> * mut std :: os :: raw :: c_char { (* obj) . field } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError_set_actual_size_bytes < > (obj : * const dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError) -> u64 { (* obj) . actual_size_bytes } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError_set_max_size_bytes < > (obj : * const dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError) -> u64 { (* obj) . max_size_bytes } } pub mod contested_documents_temporarily_not_allowed_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ContestedDocumentsTemporarilyNotAllowedError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError { pub current_epoch : * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex , pub target_epoch : * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: contested_documents_temporarily_not_allowed_error :: ContestedDocumentsTemporarilyNotAllowedError > for dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError) -> dpp :: errors :: consensus :: basic :: document :: contested_documents_temporarily_not_allowed_error :: ContestedDocumentsTemporarilyNotAllowedError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: document :: contested_documents_temporarily_not_allowed_error :: ContestedDocumentsTemporarilyNotAllowedError { current_epoch : < crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex as ferment :: FFIConversionFrom < dpp :: block :: epoch :: EpochIndex >> :: ffi_from (ffi_ref . current_epoch) , target_epoch : < crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex as ferment :: FFIConversionFrom < dpp :: block :: epoch :: EpochIndex >> :: ffi_from (ffi_ref . target_epoch) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: contested_documents_temporarily_not_allowed_error :: ContestedDocumentsTemporarilyNotAllowedError > for dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: document :: contested_documents_temporarily_not_allowed_error :: ContestedDocumentsTemporarilyNotAllowedError) -> * const dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError { ferment :: boxed (dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError { current_epoch : < crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex as ferment :: FFIConversionTo < dpp :: block :: epoch :: EpochIndex >> :: ffi_to (obj . current_epoch) , target_epoch : < crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex as ferment :: FFIConversionTo < dpp :: block :: epoch :: EpochIndex >> :: ffi_to (obj . target_epoch) }) } } impl Drop for dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . current_epoch) ; ferment :: unbox_any (ffi_ref . target_epoch) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError_ctor < > (current_epoch : * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex , target_epoch : * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex) -> * mut dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError { ferment :: boxed (dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError { current_epoch , target_epoch }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError_destroy < > (ffi : * mut dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError_get_current_epoch < > (obj : * const dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError) -> * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex { (* obj) . current_epoch } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError_get_target_epoch < > (obj : * const dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError) -> * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex { (* obj) . target_epoch } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError_set_current_epoch < > (obj : * const dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError) -> * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex { (* obj) . current_epoch } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError_set_target_epoch < > (obj : * const dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError) -> * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex { (* obj) . target_epoch } } pub mod missing_document_type_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MissingDocumentTypeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_document_missing_document_type_error_MissingDocumentTypeError { } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: missing_document_type_error :: MissingDocumentTypeError > for dpp_errors_consensus_basic_document_missing_document_type_error_MissingDocumentTypeError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_document_missing_document_type_error_MissingDocumentTypeError) -> dpp :: errors :: consensus :: basic :: document :: missing_document_type_error :: MissingDocumentTypeError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: document :: missing_document_type_error :: MissingDocumentTypeError { } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: missing_document_type_error :: MissingDocumentTypeError > for dpp_errors_consensus_basic_document_missing_document_type_error_MissingDocumentTypeError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: document :: missing_document_type_error :: MissingDocumentTypeError) -> * const dpp_errors_consensus_basic_document_missing_document_type_error_MissingDocumentTypeError { ferment :: boxed (dpp_errors_consensus_basic_document_missing_document_type_error_MissingDocumentTypeError { }) } } impl Drop for dpp_errors_consensus_basic_document_missing_document_type_error_MissingDocumentTypeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_missing_document_type_error_MissingDocumentTypeError_ctor < > () -> * mut dpp_errors_consensus_basic_document_missing_document_type_error_MissingDocumentTypeError { ferment :: boxed (dpp_errors_consensus_basic_document_missing_document_type_error_MissingDocumentTypeError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_missing_document_type_error_MissingDocumentTypeError_destroy < > (ffi : * mut dpp_errors_consensus_basic_document_missing_document_type_error_MissingDocumentTypeError) { ferment :: unbox_any (ffi) ; } } pub mod missing_document_transition_action_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MissingDocumentTransitionActionError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_document_missing_document_transition_action_error_MissingDocumentTransitionActionError { } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: missing_document_transition_action_error :: MissingDocumentTransitionActionError > for dpp_errors_consensus_basic_document_missing_document_transition_action_error_MissingDocumentTransitionActionError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_document_missing_document_transition_action_error_MissingDocumentTransitionActionError) -> dpp :: errors :: consensus :: basic :: document :: missing_document_transition_action_error :: MissingDocumentTransitionActionError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: document :: missing_document_transition_action_error :: MissingDocumentTransitionActionError { } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: missing_document_transition_action_error :: MissingDocumentTransitionActionError > for dpp_errors_consensus_basic_document_missing_document_transition_action_error_MissingDocumentTransitionActionError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: document :: missing_document_transition_action_error :: MissingDocumentTransitionActionError) -> * const dpp_errors_consensus_basic_document_missing_document_transition_action_error_MissingDocumentTransitionActionError { ferment :: boxed (dpp_errors_consensus_basic_document_missing_document_transition_action_error_MissingDocumentTransitionActionError { }) } } impl Drop for dpp_errors_consensus_basic_document_missing_document_transition_action_error_MissingDocumentTransitionActionError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_missing_document_transition_action_error_MissingDocumentTransitionActionError_ctor < > () -> * mut dpp_errors_consensus_basic_document_missing_document_transition_action_error_MissingDocumentTransitionActionError { ferment :: boxed (dpp_errors_consensus_basic_document_missing_document_transition_action_error_MissingDocumentTransitionActionError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_missing_document_transition_action_error_MissingDocumentTransitionActionError_destroy < > (ffi : * mut dpp_errors_consensus_basic_document_missing_document_transition_action_error_MissingDocumentTransitionActionError) { ferment :: unbox_any (ffi) ; } } pub mod missing_positions_in_document_type_properties_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MissingPositionsInDocumentTypePropertiesError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError { pub missing_position : u32 , pub contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub document_type_name : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: missing_positions_in_document_type_properties_error :: MissingPositionsInDocumentTypePropertiesError > for dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError) -> dpp :: errors :: consensus :: basic :: document :: missing_positions_in_document_type_properties_error :: MissingPositionsInDocumentTypePropertiesError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: document :: missing_positions_in_document_type_properties_error :: MissingPositionsInDocumentTypePropertiesError { missing_position : ffi_ref . missing_position , contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . contract_id) , document_type_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type_name) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: missing_positions_in_document_type_properties_error :: MissingPositionsInDocumentTypePropertiesError > for dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: document :: missing_positions_in_document_type_properties_error :: MissingPositionsInDocumentTypePropertiesError) -> * const dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError { ferment :: boxed (dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError { missing_position : obj . missing_position , contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . contract_id) , document_type_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type_name) }) } } impl Drop for dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . contract_id) ; ferment :: unbox_string (ffi_ref . document_type_name) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError_ctor < > (missing_position : u32 , contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , document_type_name : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError { ferment :: boxed (dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError { missing_position , contract_id , document_type_name }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError_destroy < > (ffi : * mut dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError_get_missing_position < > (obj : * const dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError) -> u32 { (* obj) . missing_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError_get_contract_id < > (obj : * const dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError_get_document_type_name < > (obj : * const dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError_set_missing_position < > (obj : * const dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError) -> u32 { (* obj) . missing_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError_set_contract_id < > (obj : * const dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError_set_document_type_name < > (obj : * const dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type_name } } pub mod document_creation_not_allowed_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentCreationNotAllowedError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError { pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub document_type_name : * mut std :: os :: raw :: c_char , pub creation_restriction_mode : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: restricted_creation :: dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: document_creation_not_allowed_error :: DocumentCreationNotAllowedError > for dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError) -> dpp :: errors :: consensus :: basic :: document :: document_creation_not_allowed_error :: DocumentCreationNotAllowedError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: document :: document_creation_not_allowed_error :: DocumentCreationNotAllowedError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) , document_type_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type_name) , creation_restriction_mode : < crate :: fermented :: types :: dpp :: data_contract :: document_type :: restricted_creation :: dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: restricted_creation :: CreationRestrictionMode >> :: ffi_from (ffi_ref . creation_restriction_mode) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: document_creation_not_allowed_error :: DocumentCreationNotAllowedError > for dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: document :: document_creation_not_allowed_error :: DocumentCreationNotAllowedError) -> * const dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError { ferment :: boxed (dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) , document_type_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type_name) , creation_restriction_mode : < crate :: fermented :: types :: dpp :: data_contract :: document_type :: restricted_creation :: dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode as ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: restricted_creation :: CreationRestrictionMode >> :: ffi_to (obj . creation_restriction_mode) }) } } impl Drop for dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data_contract_id) ; ferment :: unbox_string (ffi_ref . document_type_name) ; ferment :: unbox_any (ffi_ref . creation_restriction_mode) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError_ctor < > (data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , document_type_name : * mut std :: os :: raw :: c_char , creation_restriction_mode : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: restricted_creation :: dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode) -> * mut dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError { ferment :: boxed (dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError { data_contract_id , document_type_name , creation_restriction_mode }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError_destroy < > (ffi : * mut dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError_get_data_contract_id < > (obj : * const dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError_get_document_type_name < > (obj : * const dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError_get_creation_restriction_mode < > (obj : * const dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: restricted_creation :: dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode { (* obj) . creation_restriction_mode } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError_set_data_contract_id < > (obj : * const dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError_set_document_type_name < > (obj : * const dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError_set_creation_restriction_mode < > (obj : * const dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: restricted_creation :: dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode { (* obj) . creation_restriction_mode } } pub mod invalid_document_transition_action_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidDocumentTransitionActionError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError { pub action : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_action_error :: InvalidDocumentTransitionActionError > for dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError) -> dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_action_error :: InvalidDocumentTransitionActionError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_action_error :: InvalidDocumentTransitionActionError { action : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . action) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_action_error :: InvalidDocumentTransitionActionError > for dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_action_error :: InvalidDocumentTransitionActionError) -> * const dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError { ferment :: boxed (dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError { action : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . action) }) } } impl Drop for dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . action) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError_ctor < > (action : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError { ferment :: boxed (dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError { action }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError_destroy < > (ffi : * mut dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError_get_action < > (obj : * const dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError) -> * mut std :: os :: raw :: c_char { (* obj) . action } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError_set_action < > (obj : * const dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError) -> * mut std :: os :: raw :: c_char { (* obj) . action } } pub mod inconsistent_compound_index_data_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InconsistentCompoundIndexDataError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError { pub document_type : * mut std :: os :: raw :: c_char , pub index_properties : * mut crate :: fermented :: generics :: Vec_String } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: inconsistent_compound_index_data_error :: InconsistentCompoundIndexDataError > for dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError) -> dpp :: errors :: consensus :: basic :: document :: inconsistent_compound_index_data_error :: InconsistentCompoundIndexDataError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: document :: inconsistent_compound_index_data_error :: InconsistentCompoundIndexDataError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type) , index_properties : < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionFrom < Vec < String > >> :: ffi_from (ffi_ref . index_properties) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: inconsistent_compound_index_data_error :: InconsistentCompoundIndexDataError > for dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: document :: inconsistent_compound_index_data_error :: InconsistentCompoundIndexDataError) -> * const dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError { ferment :: boxed (dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type) , index_properties : < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionTo < Vec < String > >> :: ffi_to (obj . index_properties) }) } } impl Drop for dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . document_type) ; ferment :: unbox_any (ffi_ref . index_properties) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError_ctor < > (document_type : * mut std :: os :: raw :: c_char , index_properties : * mut crate :: fermented :: generics :: Vec_String) -> * mut dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError { ferment :: boxed (dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError { document_type , index_properties }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError_destroy < > (ffi : * mut dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError_get_document_type < > (obj : * const dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError_get_index_properties < > (obj : * const dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError) -> * mut crate :: fermented :: generics :: Vec_String { (* obj) . index_properties } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError_set_document_type < > (obj : * const dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError_set_index_properties < > (obj : * const dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError) -> * mut crate :: fermented :: generics :: Vec_String { (* obj) . index_properties } } pub mod missing_document_transition_type_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MissingDocumentTransitionTypeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_document_missing_document_transition_type_error_MissingDocumentTransitionTypeError { } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: missing_document_transition_type_error :: MissingDocumentTransitionTypeError > for dpp_errors_consensus_basic_document_missing_document_transition_type_error_MissingDocumentTransitionTypeError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_document_missing_document_transition_type_error_MissingDocumentTransitionTypeError) -> dpp :: errors :: consensus :: basic :: document :: missing_document_transition_type_error :: MissingDocumentTransitionTypeError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: document :: missing_document_transition_type_error :: MissingDocumentTransitionTypeError { } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: missing_document_transition_type_error :: MissingDocumentTransitionTypeError > for dpp_errors_consensus_basic_document_missing_document_transition_type_error_MissingDocumentTransitionTypeError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: document :: missing_document_transition_type_error :: MissingDocumentTransitionTypeError) -> * const dpp_errors_consensus_basic_document_missing_document_transition_type_error_MissingDocumentTransitionTypeError { ferment :: boxed (dpp_errors_consensus_basic_document_missing_document_transition_type_error_MissingDocumentTransitionTypeError { }) } } impl Drop for dpp_errors_consensus_basic_document_missing_document_transition_type_error_MissingDocumentTransitionTypeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_missing_document_transition_type_error_MissingDocumentTransitionTypeError_ctor < > () -> * mut dpp_errors_consensus_basic_document_missing_document_transition_type_error_MissingDocumentTransitionTypeError { ferment :: boxed (dpp_errors_consensus_basic_document_missing_document_transition_type_error_MissingDocumentTransitionTypeError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_missing_document_transition_type_error_MissingDocumentTransitionTypeError_destroy < > (ffi : * mut dpp_errors_consensus_basic_document_missing_document_transition_type_error_MissingDocumentTransitionTypeError) { ferment :: unbox_any (ffi) ; } } pub mod max_documents_transitions_exceeded_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MaxDocumentsTransitionsExceededError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError { pub max_transitions : u16 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: max_documents_transitions_exceeded_error :: MaxDocumentsTransitionsExceededError > for dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError) -> dpp :: errors :: consensus :: basic :: document :: max_documents_transitions_exceeded_error :: MaxDocumentsTransitionsExceededError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: document :: max_documents_transitions_exceeded_error :: MaxDocumentsTransitionsExceededError { max_transitions : ffi_ref . max_transitions } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: max_documents_transitions_exceeded_error :: MaxDocumentsTransitionsExceededError > for dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: document :: max_documents_transitions_exceeded_error :: MaxDocumentsTransitionsExceededError) -> * const dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError { ferment :: boxed (dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError { max_transitions : obj . max_transitions }) } } impl Drop for dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError_ctor < > (max_transitions : u16) -> * mut dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError { ferment :: boxed (dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError { max_transitions }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError_destroy < > (ffi : * mut dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError_get_max_transitions < > (obj : * const dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError) -> u16 { (* obj) . max_transitions } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError_set_max_transitions < > (obj : * const dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError) -> u16 { (* obj) . max_transitions } } } # [cfg (feature = "json-schema-validation")] pub mod json_schema_compilation_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`JsonSchemaCompilationError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError { pub compilation_error : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: json_schema_compilation_error :: JsonSchemaCompilationError > for dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError) -> dpp :: errors :: consensus :: basic :: json_schema_compilation_error :: JsonSchemaCompilationError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: json_schema_compilation_error :: JsonSchemaCompilationError { compilation_error : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . compilation_error) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: json_schema_compilation_error :: JsonSchemaCompilationError > for dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: json_schema_compilation_error :: JsonSchemaCompilationError) -> * const dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError { ferment :: boxed (dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError { compilation_error : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . compilation_error) }) } } impl Drop for dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . compilation_error) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError_ctor < > (compilation_error : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError { ferment :: boxed (dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError { compilation_error }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError_destroy < > (ffi : * mut dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError_get_compilation_error < > (obj : * const dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError) -> * mut std :: os :: raw :: c_char { (* obj) . compilation_error } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError_set_compilation_error < > (obj : * const dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError) -> * mut std :: os :: raw :: c_char { (* obj) . compilation_error } } pub mod group { use crate as dash_spv_apple_bindings ; pub mod group_action_not_allowed_on_transition_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`GroupActionNotAllowedOnTransitionError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError { pub transition_type : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: group :: group_action_not_allowed_on_transition_error :: GroupActionNotAllowedOnTransitionError > for dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError) -> dpp :: errors :: consensus :: basic :: group :: group_action_not_allowed_on_transition_error :: GroupActionNotAllowedOnTransitionError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: group :: group_action_not_allowed_on_transition_error :: GroupActionNotAllowedOnTransitionError { transition_type : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . transition_type) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: group :: group_action_not_allowed_on_transition_error :: GroupActionNotAllowedOnTransitionError > for dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: group :: group_action_not_allowed_on_transition_error :: GroupActionNotAllowedOnTransitionError) -> * const dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError { ferment :: boxed (dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError { transition_type : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . transition_type) }) } } impl Drop for dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . transition_type) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError_ctor < > (transition_type : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError { ferment :: boxed (dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError { transition_type }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError_destroy < > (ffi : * mut dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError_get_transition_type < > (obj : * const dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError) -> * mut std :: os :: raw :: c_char { (* obj) . transition_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError_set_transition_type < > (obj : * const dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError) -> * mut std :: os :: raw :: c_char { (* obj) . transition_type } } } pub mod incompatible_protocol_version_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IncompatibleProtocolVersionError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError { pub parsed_protocol_version : u32 , pub minimal_protocol_version : u32 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: incompatible_protocol_version_error :: IncompatibleProtocolVersionError > for dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError) -> dpp :: errors :: consensus :: basic :: incompatible_protocol_version_error :: IncompatibleProtocolVersionError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: incompatible_protocol_version_error :: IncompatibleProtocolVersionError { parsed_protocol_version : ffi_ref . parsed_protocol_version , minimal_protocol_version : ffi_ref . minimal_protocol_version } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: incompatible_protocol_version_error :: IncompatibleProtocolVersionError > for dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: incompatible_protocol_version_error :: IncompatibleProtocolVersionError) -> * const dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError { ferment :: boxed (dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError { parsed_protocol_version : obj . parsed_protocol_version , minimal_protocol_version : obj . minimal_protocol_version }) } } impl Drop for dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError_ctor < > (parsed_protocol_version : u32 , minimal_protocol_version : u32) -> * mut dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError { ferment :: boxed (dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError { parsed_protocol_version , minimal_protocol_version }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError_destroy < > (ffi : * mut dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError_get_parsed_protocol_version < > (obj : * const dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError) -> u32 { (* obj) . parsed_protocol_version } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError_get_minimal_protocol_version < > (obj : * const dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError) -> u32 { (* obj) . minimal_protocol_version } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError_set_parsed_protocol_version < > (obj : * const dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError) -> u32 { (* obj) . parsed_protocol_version } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError_set_minimal_protocol_version < > (obj : * const dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError) -> u32 { (* obj) . minimal_protocol_version } } pub mod overflow_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`OverflowError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_overflow_error_OverflowError { pub message : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: overflow_error :: OverflowError > for dpp_errors_consensus_basic_overflow_error_OverflowError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_overflow_error_OverflowError) -> dpp :: errors :: consensus :: basic :: overflow_error :: OverflowError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: overflow_error :: OverflowError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . message) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: overflow_error :: OverflowError > for dpp_errors_consensus_basic_overflow_error_OverflowError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: overflow_error :: OverflowError) -> * const dpp_errors_consensus_basic_overflow_error_OverflowError { ferment :: boxed (dpp_errors_consensus_basic_overflow_error_OverflowError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . message) }) } } impl Drop for dpp_errors_consensus_basic_overflow_error_OverflowError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . message) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_overflow_error_OverflowError_ctor < > (message : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_overflow_error_OverflowError { ferment :: boxed (dpp_errors_consensus_basic_overflow_error_OverflowError { message }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_overflow_error_OverflowError_destroy < > (ffi : * mut dpp_errors_consensus_basic_overflow_error_OverflowError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_overflow_error_OverflowError_get_message < > (obj : * const dpp_errors_consensus_basic_overflow_error_OverflowError) -> * mut std :: os :: raw :: c_char { (* obj) . message } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_overflow_error_OverflowError_set_message < > (obj : * const dpp_errors_consensus_basic_overflow_error_OverflowError) -> * mut std :: os :: raw :: c_char { (* obj) . message } } # [cfg (feature = "json-schema-validation")] pub mod json_schema_error { use crate as dash_spv_apple_bindings ; pub mod json_schema_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`JsonSchemaError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError { pub error_summary : * mut std :: os :: raw :: c_char , pub keyword : * mut std :: os :: raw :: c_char , pub instance_path : * mut std :: os :: raw :: c_char , pub schema_path : * mut std :: os :: raw :: c_char , pub params : * mut crate :: fermented :: types :: platform_value :: platform_value_Value , pub property_name : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: json_schema_error :: json_schema_error :: JsonSchemaError > for dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError) -> dpp :: errors :: consensus :: basic :: json_schema_error :: json_schema_error :: JsonSchemaError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: json_schema_error :: json_schema_error :: JsonSchemaError { error_summary : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . error_summary) , keyword : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . keyword) , instance_path : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . instance_path) , schema_path : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . schema_path) , params : < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionFrom < platform_value :: Value >> :: ffi_from (ffi_ref . params) , property_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . property_name) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: json_schema_error :: json_schema_error :: JsonSchemaError > for dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: json_schema_error :: json_schema_error :: JsonSchemaError) -> * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError { ferment :: boxed (dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError { error_summary : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . error_summary) , keyword : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . keyword) , instance_path : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . instance_path) , schema_path : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . schema_path) , params : < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionTo < platform_value :: Value >> :: ffi_to (obj . params) , property_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . property_name) }) } } impl Drop for dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . error_summary) ; ferment :: unbox_string (ffi_ref . keyword) ; ferment :: unbox_string (ffi_ref . instance_path) ; ferment :: unbox_string (ffi_ref . schema_path) ; ferment :: unbox_any (ffi_ref . params) ; ferment :: unbox_string (ffi_ref . property_name) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError_ctor < > (error_summary : * mut std :: os :: raw :: c_char , keyword : * mut std :: os :: raw :: c_char , instance_path : * mut std :: os :: raw :: c_char , schema_path : * mut std :: os :: raw :: c_char , params : * mut crate :: fermented :: types :: platform_value :: platform_value_Value , property_name : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError { ferment :: boxed (dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError { error_summary , keyword , instance_path , schema_path , params , property_name }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError_destroy < > (ffi : * mut dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError_get_error_summary < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . error_summary } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError_get_keyword < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . keyword } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError_get_instance_path < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . instance_path } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError_get_schema_path < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . schema_path } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError_get_params < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError) -> * mut crate :: fermented :: types :: platform_value :: platform_value_Value { (* obj) . params } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError_get_property_name < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . property_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError_set_error_summary < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . error_summary } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError_set_keyword < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . keyword } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError_set_instance_path < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . instance_path } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError_set_schema_path < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . schema_path } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError_set_params < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError) -> * mut crate :: fermented :: types :: platform_value :: platform_value_Value { (* obj) . params } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError_set_property_name < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . property_name } } pub mod json_schema_error_data { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`JsonSchemaErrorData`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData { pub keyword : * mut std :: os :: raw :: c_char , pub params : * mut serde_json :: Map < String , serde_json :: Value > , pub property_name : * mut std :: os :: raw :: c_char , pub error_message : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: json_schema_error :: json_schema_error_data :: JsonSchemaErrorData > for dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData) -> dpp :: errors :: consensus :: basic :: json_schema_error :: json_schema_error_data :: JsonSchemaErrorData { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: json_schema_error :: json_schema_error_data :: JsonSchemaErrorData { keyword : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . keyword) , params : (& * ffi_ref . params) . clone () , property_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . property_name) , error_message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . error_message) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: json_schema_error :: json_schema_error_data :: JsonSchemaErrorData > for dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: json_schema_error :: json_schema_error_data :: JsonSchemaErrorData) -> * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData { ferment :: boxed (dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData { keyword : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . keyword) , params : ferment :: boxed (obj . params) , property_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . property_name) , error_message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . error_message) }) } } impl Drop for dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . keyword) ; ferment :: unbox_any (ffi_ref . params) ; ferment :: unbox_string (ffi_ref . property_name) ; ferment :: unbox_string (ffi_ref . error_message) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData_ctor < > (keyword : * mut std :: os :: raw :: c_char , params : * mut serde_json :: Map < String , serde_json :: Value > , property_name : * mut std :: os :: raw :: c_char , error_message : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData { ferment :: boxed (dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData { keyword , params , property_name , error_message }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData_destroy < > (ffi : * mut dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData_get_keyword < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData) -> * mut std :: os :: raw :: c_char { (* obj) . keyword } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData_get_params < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData) -> * mut serde_json :: Map < String , serde_json :: Value > { (* obj) . params } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData_get_property_name < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData) -> * mut std :: os :: raw :: c_char { (* obj) . property_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData_get_error_message < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData) -> * mut std :: os :: raw :: c_char { (* obj) . error_message } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData_set_keyword < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData) -> * mut std :: os :: raw :: c_char { (* obj) . keyword } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData_set_params < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData) -> * mut serde_json :: Map < String , serde_json :: Value > { (* obj) . params } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData_set_property_name < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData) -> * mut std :: os :: raw :: c_char { (* obj) . property_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData_set_error_message < > (obj : * const dpp_errors_consensus_basic_json_schema_error_json_schema_error_data_JsonSchemaErrorData) -> * mut std :: os :: raw :: c_char { (* obj) . error_message } } } pub mod unsupported_version_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`UnsupportedVersionError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError { pub received_version : u16 , pub min_version : u16 , pub max_version : u16 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: unsupported_version_error :: UnsupportedVersionError > for dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError) -> dpp :: errors :: consensus :: basic :: unsupported_version_error :: UnsupportedVersionError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: unsupported_version_error :: UnsupportedVersionError { received_version : ffi_ref . received_version , min_version : ffi_ref . min_version , max_version : ffi_ref . max_version } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: unsupported_version_error :: UnsupportedVersionError > for dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: unsupported_version_error :: UnsupportedVersionError) -> * const dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError { ferment :: boxed (dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError { received_version : obj . received_version , min_version : obj . min_version , max_version : obj . max_version }) } } impl Drop for dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError_ctor < > (received_version : u16 , min_version : u16 , max_version : u16) -> * mut dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError { ferment :: boxed (dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError { received_version , min_version , max_version }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError_destroy < > (ffi : * mut dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError_get_received_version < > (obj : * const dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError) -> u16 { (* obj) . received_version } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError_get_min_version < > (obj : * const dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError) -> u16 { (* obj) . min_version } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError_get_max_version < > (obj : * const dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError) -> u16 { (* obj) . max_version } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError_set_received_version < > (obj : * const dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError) -> u16 { (* obj) . received_version } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError_set_min_version < > (obj : * const dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError) -> u16 { (* obj) . min_version } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError_set_max_version < > (obj : * const dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError) -> u16 { (* obj) . max_version } } pub mod state_transition { use crate as dash_spv_apple_bindings ; pub mod invalid_state_transition_type_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidStateTransitionTypeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError { pub transition_type : u8 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: state_transition :: invalid_state_transition_type_error :: InvalidStateTransitionTypeError > for dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError) -> dpp :: errors :: consensus :: basic :: state_transition :: invalid_state_transition_type_error :: InvalidStateTransitionTypeError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: state_transition :: invalid_state_transition_type_error :: InvalidStateTransitionTypeError { transition_type : ffi_ref . transition_type } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: state_transition :: invalid_state_transition_type_error :: InvalidStateTransitionTypeError > for dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: state_transition :: invalid_state_transition_type_error :: InvalidStateTransitionTypeError) -> * const dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError { ferment :: boxed (dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError { transition_type : obj . transition_type }) } } impl Drop for dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError_ctor < > (transition_type : u8) -> * mut dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError { ferment :: boxed (dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError { transition_type }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError_destroy < > (ffi : * mut dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError_get_transition_type < > (obj : * const dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError) -> u8 { (* obj) . transition_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError_set_transition_type < > (obj : * const dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError) -> u8 { (* obj) . transition_type } } pub mod missing_state_transition_type_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MissingStateTransitionTypeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_state_transition_missing_state_transition_type_error_MissingStateTransitionTypeError { } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: state_transition :: missing_state_transition_type_error :: MissingStateTransitionTypeError > for dpp_errors_consensus_basic_state_transition_missing_state_transition_type_error_MissingStateTransitionTypeError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_state_transition_missing_state_transition_type_error_MissingStateTransitionTypeError) -> dpp :: errors :: consensus :: basic :: state_transition :: missing_state_transition_type_error :: MissingStateTransitionTypeError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: state_transition :: missing_state_transition_type_error :: MissingStateTransitionTypeError { } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: state_transition :: missing_state_transition_type_error :: MissingStateTransitionTypeError > for dpp_errors_consensus_basic_state_transition_missing_state_transition_type_error_MissingStateTransitionTypeError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: state_transition :: missing_state_transition_type_error :: MissingStateTransitionTypeError) -> * const dpp_errors_consensus_basic_state_transition_missing_state_transition_type_error_MissingStateTransitionTypeError { ferment :: boxed (dpp_errors_consensus_basic_state_transition_missing_state_transition_type_error_MissingStateTransitionTypeError { }) } } impl Drop for dpp_errors_consensus_basic_state_transition_missing_state_transition_type_error_MissingStateTransitionTypeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_state_transition_missing_state_transition_type_error_MissingStateTransitionTypeError_ctor < > () -> * mut dpp_errors_consensus_basic_state_transition_missing_state_transition_type_error_MissingStateTransitionTypeError { ferment :: boxed (dpp_errors_consensus_basic_state_transition_missing_state_transition_type_error_MissingStateTransitionTypeError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_state_transition_missing_state_transition_type_error_MissingStateTransitionTypeError_destroy < > (ffi : * mut dpp_errors_consensus_basic_state_transition_missing_state_transition_type_error_MissingStateTransitionTypeError) { ferment :: unbox_any (ffi) ; } } pub mod state_transition_max_size_exceeded_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`StateTransitionMaxSizeExceededError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError { pub actual_size_bytes : u64 , pub max_size_bytes : u64 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: state_transition :: state_transition_max_size_exceeded_error :: StateTransitionMaxSizeExceededError > for dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError) -> dpp :: errors :: consensus :: basic :: state_transition :: state_transition_max_size_exceeded_error :: StateTransitionMaxSizeExceededError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: state_transition :: state_transition_max_size_exceeded_error :: StateTransitionMaxSizeExceededError { actual_size_bytes : ffi_ref . actual_size_bytes , max_size_bytes : ffi_ref . max_size_bytes } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: state_transition :: state_transition_max_size_exceeded_error :: StateTransitionMaxSizeExceededError > for dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: state_transition :: state_transition_max_size_exceeded_error :: StateTransitionMaxSizeExceededError) -> * const dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError { ferment :: boxed (dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError { actual_size_bytes : obj . actual_size_bytes , max_size_bytes : obj . max_size_bytes }) } } impl Drop for dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError_ctor < > (actual_size_bytes : u64 , max_size_bytes : u64) -> * mut dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError { ferment :: boxed (dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError { actual_size_bytes , max_size_bytes }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError_destroy < > (ffi : * mut dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError_get_actual_size_bytes < > (obj : * const dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError) -> u64 { (* obj) . actual_size_bytes } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError_get_max_size_bytes < > (obj : * const dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError) -> u64 { (* obj) . max_size_bytes } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError_set_actual_size_bytes < > (obj : * const dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError) -> u64 { (* obj) . actual_size_bytes } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError_set_max_size_bytes < > (obj : * const dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError) -> u64 { (* obj) . max_size_bytes } } } pub mod data_contract { use crate as dash_spv_apple_bindings ; pub mod invalid_token_base_supply_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidTokenBaseSupplyError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError { pub base_supply : u64 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_base_supply_error :: InvalidTokenBaseSupplyError > for dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError) -> dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_base_supply_error :: InvalidTokenBaseSupplyError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_base_supply_error :: InvalidTokenBaseSupplyError { base_supply : ffi_ref . base_supply } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_base_supply_error :: InvalidTokenBaseSupplyError > for dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_base_supply_error :: InvalidTokenBaseSupplyError) -> * const dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError { base_supply : obj . base_supply }) } } impl Drop for dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError_ctor < > (base_supply : u64) -> * mut dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError { base_supply }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError_get_base_supply < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError) -> u64 { (* obj) . base_supply } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError_set_base_supply < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError) -> u64 { (* obj) . base_supply } } pub mod invalid_document_type_required_security_level { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidDocumentTypeRequiredSecurityLevelError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError { pub security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel , pub contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub document_type_name : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_required_security_level :: InvalidDocumentTypeRequiredSecurityLevelError > for dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError) -> dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_required_security_level :: InvalidDocumentTypeRequiredSecurityLevelError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_required_security_level :: InvalidDocumentTypeRequiredSecurityLevelError { security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_from (ffi_ref . security_level) , contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . contract_id) , document_type_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type_name) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_required_security_level :: InvalidDocumentTypeRequiredSecurityLevelError > for dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_required_security_level :: InvalidDocumentTypeRequiredSecurityLevelError) -> * const dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError { security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_to (obj . security_level) , contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . contract_id) , document_type_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type_name) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . security_level) ; ferment :: unbox_any (ffi_ref . contract_id) ; ferment :: unbox_string (ffi_ref . document_type_name) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError_ctor < > (security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel , contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , document_type_name : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError { security_level , contract_id , document_type_name }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError_get_security_level < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . security_level } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError_get_contract_id < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError_get_document_type_name < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError_set_security_level < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . security_level } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError_set_contract_id < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError_set_document_type_name < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type_name } } pub mod unknown_security_level_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`UnknownSecurityLevelError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError { pub allowed_values : * mut crate :: fermented :: generics :: Vec_u8 , pub received : u8 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: unknown_security_level_error :: UnknownSecurityLevelError > for dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError) -> dpp :: errors :: consensus :: basic :: data_contract :: unknown_security_level_error :: UnknownSecurityLevelError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: unknown_security_level_error :: UnknownSecurityLevelError { allowed_values : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (ffi_ref . allowed_values) , received : ffi_ref . received } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: unknown_security_level_error :: UnknownSecurityLevelError > for dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: unknown_security_level_error :: UnknownSecurityLevelError) -> * const dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError { allowed_values : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj . allowed_values) , received : obj . received }) } } impl Drop for dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . allowed_values) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError_ctor < > (allowed_values : * mut crate :: fermented :: generics :: Vec_u8 , received : u8) -> * mut dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError { allowed_values , received }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError_get_allowed_values < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . allowed_values } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError_get_received < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError) -> u8 { (* obj) . received } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError_set_allowed_values < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . allowed_values } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError_set_received < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError) -> u8 { (* obj) . received } } pub mod unknown_transferable_type_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`UnknownTransferableTypeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError { pub allowed_values : * mut crate :: fermented :: generics :: Vec_u8 , pub received : u8 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: unknown_transferable_type_error :: UnknownTransferableTypeError > for dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError) -> dpp :: errors :: consensus :: basic :: data_contract :: unknown_transferable_type_error :: UnknownTransferableTypeError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: unknown_transferable_type_error :: UnknownTransferableTypeError { allowed_values : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (ffi_ref . allowed_values) , received : ffi_ref . received } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: unknown_transferable_type_error :: UnknownTransferableTypeError > for dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: unknown_transferable_type_error :: UnknownTransferableTypeError) -> * const dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError { allowed_values : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj . allowed_values) , received : obj . received }) } } impl Drop for dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . allowed_values) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError_ctor < > (allowed_values : * mut crate :: fermented :: generics :: Vec_u8 , received : u8) -> * mut dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError { allowed_values , received }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError_get_allowed_values < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . allowed_values } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError_get_received < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError) -> u8 { (* obj) . received } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError_set_allowed_values < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . allowed_values } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError_set_received < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError) -> u8 { (* obj) . received } } pub mod invalid_compound_index_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidCompoundIndexError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError { pub document_type : * mut std :: os :: raw :: c_char , pub index_name : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_compound_index_error :: InvalidCompoundIndexError > for dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError) -> dpp :: errors :: consensus :: basic :: data_contract :: invalid_compound_index_error :: InvalidCompoundIndexError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: invalid_compound_index_error :: InvalidCompoundIndexError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type) , index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . index_name) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_compound_index_error :: InvalidCompoundIndexError > for dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: invalid_compound_index_error :: InvalidCompoundIndexError) -> * const dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type) , index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . index_name) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . document_type) ; ferment :: unbox_string (ffi_ref . index_name) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError_ctor < > (document_type : * mut std :: os :: raw :: c_char , index_name : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError { document_type , index_name }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError_get_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError_get_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError) -> * mut std :: os :: raw :: c_char { (* obj) . index_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError_set_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError_set_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError) -> * mut std :: os :: raw :: c_char { (* obj) . index_name } } pub mod duplicate_index_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DuplicateIndexError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError { pub document_type : * mut std :: os :: raw :: c_char , pub index_name : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_error :: DuplicateIndexError > for dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError) -> dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_error :: DuplicateIndexError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_error :: DuplicateIndexError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type) , index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . index_name) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_error :: DuplicateIndexError > for dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_error :: DuplicateIndexError) -> * const dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type) , index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . index_name) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . document_type) ; ferment :: unbox_string (ffi_ref . index_name) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError_ctor < > (document_type : * mut std :: os :: raw :: c_char , index_name : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError { document_type , index_name }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError_get_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError_get_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError) -> * mut std :: os :: raw :: c_char { (* obj) . index_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError_set_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError_set_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError) -> * mut std :: os :: raw :: c_char { (* obj) . index_name } } pub mod contested_unique_index_on_mutable_document_type_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ContestedUniqueIndexOnMutableDocumentTypeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError { pub document_type : * mut std :: os :: raw :: c_char , pub contested_unique_index_name : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_on_mutable_document_type_error :: ContestedUniqueIndexOnMutableDocumentTypeError > for dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError) -> dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_on_mutable_document_type_error :: ContestedUniqueIndexOnMutableDocumentTypeError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_on_mutable_document_type_error :: ContestedUniqueIndexOnMutableDocumentTypeError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type) , contested_unique_index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . contested_unique_index_name) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_on_mutable_document_type_error :: ContestedUniqueIndexOnMutableDocumentTypeError > for dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_on_mutable_document_type_error :: ContestedUniqueIndexOnMutableDocumentTypeError) -> * const dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type) , contested_unique_index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . contested_unique_index_name) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . document_type) ; ferment :: unbox_string (ffi_ref . contested_unique_index_name) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError_ctor < > (document_type : * mut std :: os :: raw :: c_char , contested_unique_index_name : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError { document_type , contested_unique_index_name }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError_get_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError_get_contested_unique_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError) -> * mut std :: os :: raw :: c_char { (* obj) . contested_unique_index_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError_set_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError_set_contested_unique_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError) -> * mut std :: os :: raw :: c_char { (* obj) . contested_unique_index_name } } pub mod group_total_power_has_less_than_required_power_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`GroupTotalPowerLessThanRequiredError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError { pub total_power : * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower , pub required_power : * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: group_total_power_has_less_than_required_power_error :: GroupTotalPowerLessThanRequiredError > for dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError) -> dpp :: errors :: consensus :: basic :: data_contract :: group_total_power_has_less_than_required_power_error :: GroupTotalPowerLessThanRequiredError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: group_total_power_has_less_than_required_power_error :: GroupTotalPowerLessThanRequiredError { total_power : < crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower as ferment :: FFIConversionFrom < dpp :: data_contract :: group :: GroupMemberPower >> :: ffi_from (ffi_ref . total_power) , required_power : < crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower as ferment :: FFIConversionFrom < dpp :: data_contract :: group :: GroupMemberPower >> :: ffi_from (ffi_ref . required_power) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: group_total_power_has_less_than_required_power_error :: GroupTotalPowerLessThanRequiredError > for dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: group_total_power_has_less_than_required_power_error :: GroupTotalPowerLessThanRequiredError) -> * const dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError { total_power : < crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower as ferment :: FFIConversionTo < dpp :: data_contract :: group :: GroupMemberPower >> :: ffi_to (obj . total_power) , required_power : < crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower as ferment :: FFIConversionTo < dpp :: data_contract :: group :: GroupMemberPower >> :: ffi_to (obj . required_power) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . total_power) ; ferment :: unbox_any (ffi_ref . required_power) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError_ctor < > (total_power : * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower , required_power : * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower) -> * mut dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError { total_power , required_power }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError_get_total_power < > (obj : * const dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower { (* obj) . total_power } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError_get_required_power < > (obj : * const dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower { (* obj) . required_power } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError_set_total_power < > (obj : * const dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower { (* obj) . total_power } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError_set_required_power < > (obj : * const dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower { (* obj) . required_power } } pub mod data_contract_immutable_properties_update_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractImmutablePropertiesUpdateError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError { pub operation : * mut std :: os :: raw :: c_char , pub field_path : * mut std :: os :: raw :: c_char , pub old_value : * mut crate :: fermented :: types :: platform_value :: platform_value_Value , pub new_value : * mut crate :: fermented :: types :: platform_value :: platform_value_Value } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_immutable_properties_update_error :: DataContractImmutablePropertiesUpdateError > for dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError) -> dpp :: errors :: consensus :: basic :: data_contract :: data_contract_immutable_properties_update_error :: DataContractImmutablePropertiesUpdateError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: data_contract_immutable_properties_update_error :: DataContractImmutablePropertiesUpdateError { operation : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . operation) , field_path : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . field_path) , old_value : < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionFrom < platform_value :: Value >> :: ffi_from (ffi_ref . old_value) , new_value : < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionFrom < platform_value :: Value >> :: ffi_from (ffi_ref . new_value) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_immutable_properties_update_error :: DataContractImmutablePropertiesUpdateError > for dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: data_contract_immutable_properties_update_error :: DataContractImmutablePropertiesUpdateError) -> * const dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError { operation : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . operation) , field_path : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . field_path) , old_value : < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionTo < platform_value :: Value >> :: ffi_to (obj . old_value) , new_value : < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionTo < platform_value :: Value >> :: ffi_to (obj . new_value) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . operation) ; ferment :: unbox_string (ffi_ref . field_path) ; ferment :: unbox_any (ffi_ref . old_value) ; ferment :: unbox_any (ffi_ref . new_value) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError_ctor < > (operation : * mut std :: os :: raw :: c_char , field_path : * mut std :: os :: raw :: c_char , old_value : * mut crate :: fermented :: types :: platform_value :: platform_value_Value , new_value : * mut crate :: fermented :: types :: platform_value :: platform_value_Value) -> * mut dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError { operation , field_path , old_value , new_value }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError_get_operation < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . operation } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError_get_field_path < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . field_path } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError_get_old_value < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError) -> * mut crate :: fermented :: types :: platform_value :: platform_value_Value { (* obj) . old_value } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError_get_new_value < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError) -> * mut crate :: fermented :: types :: platform_value :: platform_value_Value { (* obj) . new_value } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError_set_operation < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . operation } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError_set_field_path < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . field_path } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError_set_old_value < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError) -> * mut crate :: fermented :: types :: platform_value :: platform_value_Value { (* obj) . old_value } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError_set_new_value < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError) -> * mut crate :: fermented :: types :: platform_value :: platform_value_Value { (* obj) . new_value } } pub mod data_contract_unique_indices_changed_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractUniqueIndicesChangedError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError { pub document_type : * mut std :: os :: raw :: c_char , pub index_name : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_unique_indices_changed_error :: DataContractUniqueIndicesChangedError > for dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError) -> dpp :: errors :: consensus :: basic :: data_contract :: data_contract_unique_indices_changed_error :: DataContractUniqueIndicesChangedError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: data_contract_unique_indices_changed_error :: DataContractUniqueIndicesChangedError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type) , index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . index_name) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_unique_indices_changed_error :: DataContractUniqueIndicesChangedError > for dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: data_contract_unique_indices_changed_error :: DataContractUniqueIndicesChangedError) -> * const dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type) , index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . index_name) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . document_type) ; ferment :: unbox_string (ffi_ref . index_name) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError_ctor < > (document_type : * mut std :: os :: raw :: c_char , index_name : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError { document_type , index_name }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError_get_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError_get_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError) -> * mut std :: os :: raw :: c_char { (* obj) . index_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError_set_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError_set_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError) -> * mut std :: os :: raw :: c_char { (* obj) . index_name } } pub mod invalid_indexed_property_constraint_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIndexedPropertyConstraintError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError { pub document_type : * mut std :: os :: raw :: c_char , pub index_name : * mut std :: os :: raw :: c_char , pub property_name : * mut std :: os :: raw :: c_char , pub constraint_name : * mut std :: os :: raw :: c_char , pub reason : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_indexed_property_constraint_error :: InvalidIndexedPropertyConstraintError > for dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError) -> dpp :: errors :: consensus :: basic :: data_contract :: invalid_indexed_property_constraint_error :: InvalidIndexedPropertyConstraintError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: invalid_indexed_property_constraint_error :: InvalidIndexedPropertyConstraintError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type) , index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . index_name) , property_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . property_name) , constraint_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . constraint_name) , reason : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . reason) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_indexed_property_constraint_error :: InvalidIndexedPropertyConstraintError > for dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: invalid_indexed_property_constraint_error :: InvalidIndexedPropertyConstraintError) -> * const dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type) , index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . index_name) , property_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . property_name) , constraint_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . constraint_name) , reason : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . reason) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . document_type) ; ferment :: unbox_string (ffi_ref . index_name) ; ferment :: unbox_string (ffi_ref . property_name) ; ferment :: unbox_string (ffi_ref . constraint_name) ; ferment :: unbox_string (ffi_ref . reason) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError_ctor < > (document_type : * mut std :: os :: raw :: c_char , index_name : * mut std :: os :: raw :: c_char , property_name : * mut std :: os :: raw :: c_char , constraint_name : * mut std :: os :: raw :: c_char , reason : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError { document_type , index_name , property_name , constraint_name , reason }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError_get_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError_get_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError) -> * mut std :: os :: raw :: c_char { (* obj) . index_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError_get_property_name < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError) -> * mut std :: os :: raw :: c_char { (* obj) . property_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError_get_constraint_name < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError) -> * mut std :: os :: raw :: c_char { (* obj) . constraint_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError_get_reason < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError) -> * mut std :: os :: raw :: c_char { (* obj) . reason } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError_set_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError_set_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError) -> * mut std :: os :: raw :: c_char { (* obj) . index_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError_set_property_name < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError) -> * mut std :: os :: raw :: c_char { (* obj) . property_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError_set_constraint_name < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError) -> * mut std :: os :: raw :: c_char { (* obj) . constraint_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError_set_reason < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError) -> * mut std :: os :: raw :: c_char { (* obj) . reason } } pub mod incompatible_data_contract_schema_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IncompatibleDataContractSchemaError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError { pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub operation : * mut std :: os :: raw :: c_char , pub field_path : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: incompatible_data_contract_schema_error :: IncompatibleDataContractSchemaError > for dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError) -> dpp :: errors :: consensus :: basic :: data_contract :: incompatible_data_contract_schema_error :: IncompatibleDataContractSchemaError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: incompatible_data_contract_schema_error :: IncompatibleDataContractSchemaError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) , operation : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . operation) , field_path : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . field_path) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: incompatible_data_contract_schema_error :: IncompatibleDataContractSchemaError > for dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: incompatible_data_contract_schema_error :: IncompatibleDataContractSchemaError) -> * const dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) , operation : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . operation) , field_path : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . field_path) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data_contract_id) ; ferment :: unbox_string (ffi_ref . operation) ; ferment :: unbox_string (ffi_ref . field_path) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError_ctor < > (data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , operation : * mut std :: os :: raw :: c_char , field_path : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError { data_contract_id , operation , field_path }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError_get_data_contract_id < > (obj : * const dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError_get_operation < > (obj : * const dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . operation } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError_get_field_path < > (obj : * const dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . field_path } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError_set_data_contract_id < > (obj : * const dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError_set_operation < > (obj : * const dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . operation } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError_set_field_path < > (obj : * const dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . field_path } } pub mod incompatible_document_type_schema_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IncompatibleDocumentTypeSchemaError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError { pub document_type_name : * mut std :: os :: raw :: c_char , pub operation : * mut std :: os :: raw :: c_char , pub property_path : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: incompatible_document_type_schema_error :: IncompatibleDocumentTypeSchemaError > for dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError) -> dpp :: errors :: consensus :: basic :: data_contract :: incompatible_document_type_schema_error :: IncompatibleDocumentTypeSchemaError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: incompatible_document_type_schema_error :: IncompatibleDocumentTypeSchemaError { document_type_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type_name) , operation : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . operation) , property_path : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . property_path) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: incompatible_document_type_schema_error :: IncompatibleDocumentTypeSchemaError > for dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: incompatible_document_type_schema_error :: IncompatibleDocumentTypeSchemaError) -> * const dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError { document_type_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type_name) , operation : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . operation) , property_path : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . property_path) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . document_type_name) ; ferment :: unbox_string (ffi_ref . operation) ; ferment :: unbox_string (ffi_ref . property_path) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError_ctor < > (document_type_name : * mut std :: os :: raw :: c_char , operation : * mut std :: os :: raw :: c_char , property_path : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError { document_type_name , operation , property_path }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError_get_document_type_name < > (obj : * const dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError_get_operation < > (obj : * const dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . operation } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError_get_property_path < > (obj : * const dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . property_path } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError_set_document_type_name < > (obj : * const dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError_set_operation < > (obj : * const dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . operation } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError_set_property_path < > (obj : * const dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError) -> * mut std :: os :: raw :: c_char { (* obj) . property_path } } pub mod document_types_are_missing_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentTypesAreMissingError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError { pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: document_types_are_missing_error :: DocumentTypesAreMissingError > for dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError) -> dpp :: errors :: consensus :: basic :: data_contract :: document_types_are_missing_error :: DocumentTypesAreMissingError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: document_types_are_missing_error :: DocumentTypesAreMissingError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: document_types_are_missing_error :: DocumentTypesAreMissingError > for dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: document_types_are_missing_error :: DocumentTypesAreMissingError) -> * const dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data_contract_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError_ctor < > (data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError { data_contract_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError_get_data_contract_id < > (obj : * const dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError_set_data_contract_id < > (obj : * const dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } } pub mod invalid_token_distribution_function_incoherence_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidTokenDistributionFunctionIncoherenceError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError { pub message : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_incoherence_error :: InvalidTokenDistributionFunctionIncoherenceError > for dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError) -> dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_incoherence_error :: InvalidTokenDistributionFunctionIncoherenceError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_incoherence_error :: InvalidTokenDistributionFunctionIncoherenceError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . message) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_incoherence_error :: InvalidTokenDistributionFunctionIncoherenceError > for dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_incoherence_error :: InvalidTokenDistributionFunctionIncoherenceError) -> * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . message) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . message) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError_ctor < > (message : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError { message }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError_get_message < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError) -> * mut std :: os :: raw :: c_char { (* obj) . message } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError_set_message < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError) -> * mut std :: os :: raw :: c_char { (* obj) . message } } pub mod invalid_token_distribution_function_divide_by_zero_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidTokenDistributionFunctionDivideByZeroError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError { pub distribution_function : * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_divide_by_zero_error :: InvalidTokenDistributionFunctionDivideByZeroError > for dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError) -> dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_divide_by_zero_error :: InvalidTokenDistributionFunctionDivideByZeroError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_divide_by_zero_error :: InvalidTokenDistributionFunctionDivideByZeroError { distribution_function : < crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction as ferment :: FFIConversionFrom < dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction >> :: ffi_from (ffi_ref . distribution_function) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_divide_by_zero_error :: InvalidTokenDistributionFunctionDivideByZeroError > for dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_divide_by_zero_error :: InvalidTokenDistributionFunctionDivideByZeroError) -> * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError { distribution_function : < crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction as ferment :: FFIConversionTo < dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction >> :: ffi_to (obj . distribution_function) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . distribution_function) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError_ctor < > (distribution_function : * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction) -> * mut dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError { distribution_function }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError_get_distribution_function < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction { (* obj) . distribution_function } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError_set_distribution_function < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction { (* obj) . distribution_function } } pub mod unknown_storage_key_requirements_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`UnknownStorageKeyRequirementsError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError { pub allowed_values : * mut crate :: fermented :: generics :: Vec_u8 , pub received : * mut [u8 ; 16] } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: unknown_storage_key_requirements_error :: UnknownStorageKeyRequirementsError > for dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError) -> dpp :: errors :: consensus :: basic :: data_contract :: unknown_storage_key_requirements_error :: UnknownStorageKeyRequirementsError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: unknown_storage_key_requirements_error :: UnknownStorageKeyRequirementsError { allowed_values : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (ffi_ref . allowed_values) , received : < [u8 ; 16] as ferment :: FFIConversionFrom < i128 >> :: ffi_from (ffi_ref . received) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: unknown_storage_key_requirements_error :: UnknownStorageKeyRequirementsError > for dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: unknown_storage_key_requirements_error :: UnknownStorageKeyRequirementsError) -> * const dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError { allowed_values : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj . allowed_values) , received : < [u8 ; 16] as ferment :: FFIConversionTo < i128 >> :: ffi_to (obj . received) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . allowed_values) ; ferment :: unbox_any_opt (ffi_ref . received) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError_ctor < > (allowed_values : * mut crate :: fermented :: generics :: Vec_u8 , received : * mut [u8 ; 16]) -> * mut dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError { allowed_values , received }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError_get_allowed_values < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . allowed_values } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError_get_received < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError) -> * mut [u8 ; 16] { (* obj) . received } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError_set_allowed_values < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . allowed_values } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError_set_received < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError) -> * mut [u8 ; 16] { (* obj) . received } } pub mod undefined_index_property_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`UndefinedIndexPropertyError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError { pub document_type : * mut std :: os :: raw :: c_char , pub index_name : * mut std :: os :: raw :: c_char , pub property_name : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: undefined_index_property_error :: UndefinedIndexPropertyError > for dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError) -> dpp :: errors :: consensus :: basic :: data_contract :: undefined_index_property_error :: UndefinedIndexPropertyError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: undefined_index_property_error :: UndefinedIndexPropertyError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type) , index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . index_name) , property_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . property_name) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: undefined_index_property_error :: UndefinedIndexPropertyError > for dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: undefined_index_property_error :: UndefinedIndexPropertyError) -> * const dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type) , index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . index_name) , property_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . property_name) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . document_type) ; ferment :: unbox_string (ffi_ref . index_name) ; ferment :: unbox_string (ffi_ref . property_name) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError_ctor < > (document_type : * mut std :: os :: raw :: c_char , index_name : * mut std :: os :: raw :: c_char , property_name : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError { document_type , index_name , property_name }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError_get_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError_get_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError) -> * mut std :: os :: raw :: c_char { (* obj) . index_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError_get_property_name < > (obj : * const dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError) -> * mut std :: os :: raw :: c_char { (* obj) . property_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError_set_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError_set_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError) -> * mut std :: os :: raw :: c_char { (* obj) . index_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError_set_property_name < > (obj : * const dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError) -> * mut std :: os :: raw :: c_char { (* obj) . property_name } } pub mod data_contract_max_depth_exceed_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractMaxDepthExceedError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError { pub max_depth : usize } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_max_depth_exceed_error :: DataContractMaxDepthExceedError > for dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError) -> dpp :: errors :: consensus :: basic :: data_contract :: data_contract_max_depth_exceed_error :: DataContractMaxDepthExceedError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: data_contract_max_depth_exceed_error :: DataContractMaxDepthExceedError { max_depth : ffi_ref . max_depth } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_max_depth_exceed_error :: DataContractMaxDepthExceedError > for dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: data_contract_max_depth_exceed_error :: DataContractMaxDepthExceedError) -> * const dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError { max_depth : obj . max_depth }) } } impl Drop for dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError_ctor < > (max_depth : usize) -> * mut dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError { max_depth }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError_get_max_depth < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError) -> usize { (* obj) . max_depth } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError_set_max_depth < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError) -> usize { (* obj) . max_depth } } pub mod unique_indices_limit_reached_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`UniqueIndicesLimitReachedError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError { pub document_type : * mut std :: os :: raw :: c_char , pub index_limit : u16 , pub is_contested_limit : bool } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: unique_indices_limit_reached_error :: UniqueIndicesLimitReachedError > for dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError) -> dpp :: errors :: consensus :: basic :: data_contract :: unique_indices_limit_reached_error :: UniqueIndicesLimitReachedError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: unique_indices_limit_reached_error :: UniqueIndicesLimitReachedError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type) , index_limit : ffi_ref . index_limit , is_contested_limit : ffi_ref . is_contested_limit } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: unique_indices_limit_reached_error :: UniqueIndicesLimitReachedError > for dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: unique_indices_limit_reached_error :: UniqueIndicesLimitReachedError) -> * const dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type) , index_limit : obj . index_limit , is_contested_limit : obj . is_contested_limit }) } } impl Drop for dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . document_type) ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError_ctor < > (document_type : * mut std :: os :: raw :: c_char , index_limit : u16 , is_contested_limit : bool) -> * mut dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError { document_type , index_limit , is_contested_limit }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError_get_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError_get_index_limit < > (obj : * const dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError) -> u16 { (* obj) . index_limit } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError_get_is_contested_limit < > (obj : * const dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError) -> bool { (* obj) . is_contested_limit } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError_set_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError_set_index_limit < > (obj : * const dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError) -> u16 { (* obj) . index_limit } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError_set_is_contested_limit < > (obj : * const dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError) -> bool { (* obj) . is_contested_limit } } pub mod invalid_data_contract_id_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidDataContractIdError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError { pub expected_id : * mut crate :: fermented :: generics :: Vec_u8 , pub invalid_id : * mut crate :: fermented :: generics :: Vec_u8 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_id_error :: InvalidDataContractIdError > for dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError) -> dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_id_error :: InvalidDataContractIdError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_id_error :: InvalidDataContractIdError { expected_id : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (ffi_ref . expected_id) , invalid_id : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (ffi_ref . invalid_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_id_error :: InvalidDataContractIdError > for dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_id_error :: InvalidDataContractIdError) -> * const dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError { expected_id : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj . expected_id) , invalid_id : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj . invalid_id) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . expected_id) ; ferment :: unbox_any (ffi_ref . invalid_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError_ctor < > (expected_id : * mut crate :: fermented :: generics :: Vec_u8 , invalid_id : * mut crate :: fermented :: generics :: Vec_u8) -> * mut dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError { expected_id , invalid_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError_get_expected_id < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . expected_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError_get_invalid_id < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . invalid_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError_set_expected_id < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . expected_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError_set_invalid_id < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . invalid_id } } pub mod incompatible_re2_pattern_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IncompatibleRe2PatternError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError { pub pattern : * mut std :: os :: raw :: c_char , pub path : * mut std :: os :: raw :: c_char , pub message : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: incompatible_re2_pattern_error :: IncompatibleRe2PatternError > for dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError) -> dpp :: errors :: consensus :: basic :: data_contract :: incompatible_re2_pattern_error :: IncompatibleRe2PatternError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: incompatible_re2_pattern_error :: IncompatibleRe2PatternError { pattern : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . pattern) , path : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . path) , message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . message) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: incompatible_re2_pattern_error :: IncompatibleRe2PatternError > for dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: incompatible_re2_pattern_error :: IncompatibleRe2PatternError) -> * const dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError { pattern : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . pattern) , path : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . path) , message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . message) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . pattern) ; ferment :: unbox_string (ffi_ref . path) ; ferment :: unbox_string (ffi_ref . message) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError_ctor < > (pattern : * mut std :: os :: raw :: c_char , path : * mut std :: os :: raw :: c_char , message : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError { pattern , path , message }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError_get_pattern < > (obj : * const dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError) -> * mut std :: os :: raw :: c_char { (* obj) . pattern } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError_get_path < > (obj : * const dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError) -> * mut std :: os :: raw :: c_char { (* obj) . path } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError_get_message < > (obj : * const dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError) -> * mut std :: os :: raw :: c_char { (* obj) . message } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError_set_pattern < > (obj : * const dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError) -> * mut std :: os :: raw :: c_char { (* obj) . pattern } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError_set_path < > (obj : * const dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError) -> * mut std :: os :: raw :: c_char { (* obj) . path } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError_set_message < > (obj : * const dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError) -> * mut std :: os :: raw :: c_char { (* obj) . message } } pub mod system_property_index_already_present_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`SystemPropertyIndexAlreadyPresentError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError { pub document_type : * mut std :: os :: raw :: c_char , pub index_name : * mut std :: os :: raw :: c_char , pub property_name : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: system_property_index_already_present_error :: SystemPropertyIndexAlreadyPresentError > for dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError) -> dpp :: errors :: consensus :: basic :: data_contract :: system_property_index_already_present_error :: SystemPropertyIndexAlreadyPresentError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: system_property_index_already_present_error :: SystemPropertyIndexAlreadyPresentError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type) , index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . index_name) , property_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . property_name) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: system_property_index_already_present_error :: SystemPropertyIndexAlreadyPresentError > for dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: system_property_index_already_present_error :: SystemPropertyIndexAlreadyPresentError) -> * const dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type) , index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . index_name) , property_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . property_name) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . document_type) ; ferment :: unbox_string (ffi_ref . index_name) ; ferment :: unbox_string (ffi_ref . property_name) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError_ctor < > (document_type : * mut std :: os :: raw :: c_char , index_name : * mut std :: os :: raw :: c_char , property_name : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError { document_type , index_name , property_name }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError_get_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError_get_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError) -> * mut std :: os :: raw :: c_char { (* obj) . index_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError_get_property_name < > (obj : * const dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError) -> * mut std :: os :: raw :: c_char { (* obj) . property_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError_set_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError_set_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError) -> * mut std :: os :: raw :: c_char { (* obj) . index_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError_set_property_name < > (obj : * const dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError) -> * mut std :: os :: raw :: c_char { (* obj) . property_name } } pub mod group_member_has_power_over_limit_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`GroupMemberHasPowerOverLimitError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError { pub member_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub power : * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower , pub max_power : * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_over_limit_error :: GroupMemberHasPowerOverLimitError > for dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError) -> dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_over_limit_error :: GroupMemberHasPowerOverLimitError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_over_limit_error :: GroupMemberHasPowerOverLimitError { member_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . member_id) , power : < crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower as ferment :: FFIConversionFrom < dpp :: data_contract :: group :: GroupMemberPower >> :: ffi_from (ffi_ref . power) , max_power : < crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower as ferment :: FFIConversionFrom < dpp :: data_contract :: group :: GroupMemberPower >> :: ffi_from (ffi_ref . max_power) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_over_limit_error :: GroupMemberHasPowerOverLimitError > for dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_over_limit_error :: GroupMemberHasPowerOverLimitError) -> * const dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError { member_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . member_id) , power : < crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower as ferment :: FFIConversionTo < dpp :: data_contract :: group :: GroupMemberPower >> :: ffi_to (obj . power) , max_power : < crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower as ferment :: FFIConversionTo < dpp :: data_contract :: group :: GroupMemberPower >> :: ffi_to (obj . max_power) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . member_id) ; ferment :: unbox_any (ffi_ref . power) ; ferment :: unbox_any (ffi_ref . max_power) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError_ctor < > (member_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , power : * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower , max_power : * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower) -> * mut dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError { member_id , power , max_power }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError_get_member_id < > (obj : * const dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . member_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError_get_power < > (obj : * const dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower { (* obj) . power } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError_get_max_power < > (obj : * const dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower { (* obj) . max_power } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError_set_member_id < > (obj : * const dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . member_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError_set_power < > (obj : * const dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower { (* obj) . power } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError_set_max_power < > (obj : * const dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower { (* obj) . max_power } } pub mod unknown_document_creation_restriction_mode_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`UnknownDocumentCreationRestrictionModeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError { pub allowed_values : * mut crate :: fermented :: generics :: Vec_u8 , pub received : u8 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: unknown_document_creation_restriction_mode_error :: UnknownDocumentCreationRestrictionModeError > for dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError) -> dpp :: errors :: consensus :: basic :: data_contract :: unknown_document_creation_restriction_mode_error :: UnknownDocumentCreationRestrictionModeError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: unknown_document_creation_restriction_mode_error :: UnknownDocumentCreationRestrictionModeError { allowed_values : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (ffi_ref . allowed_values) , received : ffi_ref . received } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: unknown_document_creation_restriction_mode_error :: UnknownDocumentCreationRestrictionModeError > for dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: unknown_document_creation_restriction_mode_error :: UnknownDocumentCreationRestrictionModeError) -> * const dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError { allowed_values : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj . allowed_values) , received : obj . received }) } } impl Drop for dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . allowed_values) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError_ctor < > (allowed_values : * mut crate :: fermented :: generics :: Vec_u8 , received : u8) -> * mut dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError { allowed_values , received }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError_get_allowed_values < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . allowed_values } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError_get_received < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError) -> u8 { (* obj) . received } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError_set_allowed_values < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . allowed_values } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError_set_received < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError) -> u8 { (* obj) . received } } pub mod group_non_unilateral_member_power_has_less_than_required_power_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError { pub total_power : * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower , pub required_power : * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: group_non_unilateral_member_power_has_less_than_required_power_error :: GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError > for dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError) -> dpp :: errors :: consensus :: basic :: data_contract :: group_non_unilateral_member_power_has_less_than_required_power_error :: GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: group_non_unilateral_member_power_has_less_than_required_power_error :: GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError { total_power : < crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower as ferment :: FFIConversionFrom < dpp :: data_contract :: group :: GroupMemberPower >> :: ffi_from (ffi_ref . total_power) , required_power : < crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower as ferment :: FFIConversionFrom < dpp :: data_contract :: group :: GroupMemberPower >> :: ffi_from (ffi_ref . required_power) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: group_non_unilateral_member_power_has_less_than_required_power_error :: GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError > for dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: group_non_unilateral_member_power_has_less_than_required_power_error :: GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError) -> * const dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError { total_power : < crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower as ferment :: FFIConversionTo < dpp :: data_contract :: group :: GroupMemberPower >> :: ffi_to (obj . total_power) , required_power : < crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower as ferment :: FFIConversionTo < dpp :: data_contract :: group :: GroupMemberPower >> :: ffi_to (obj . required_power) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . total_power) ; ferment :: unbox_any (ffi_ref . required_power) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError_ctor < > (total_power : * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower , required_power : * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower) -> * mut dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError { total_power , required_power }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError_get_total_power < > (obj : * const dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower { (* obj) . total_power } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError_get_required_power < > (obj : * const dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower { (* obj) . required_power } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError_set_total_power < > (obj : * const dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower { (* obj) . total_power } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError_set_required_power < > (obj : * const dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower { (* obj) . required_power } } pub mod unknown_trade_mode_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`UnknownTradeModeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError { pub allowed_values : * mut crate :: fermented :: generics :: Vec_u8 , pub received : u8 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: unknown_trade_mode_error :: UnknownTradeModeError > for dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError) -> dpp :: errors :: consensus :: basic :: data_contract :: unknown_trade_mode_error :: UnknownTradeModeError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: unknown_trade_mode_error :: UnknownTradeModeError { allowed_values : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (ffi_ref . allowed_values) , received : ffi_ref . received } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: unknown_trade_mode_error :: UnknownTradeModeError > for dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: unknown_trade_mode_error :: UnknownTradeModeError) -> * const dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError { allowed_values : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj . allowed_values) , received : obj . received }) } } impl Drop for dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . allowed_values) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError_ctor < > (allowed_values : * mut crate :: fermented :: generics :: Vec_u8 , received : u8) -> * mut dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError { allowed_values , received }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError_get_allowed_values < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . allowed_values } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError_get_received < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError) -> u8 { (* obj) . received } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError_set_allowed_values < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . allowed_values } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError_set_received < > (obj : * const dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError) -> u8 { (* obj) . received } } pub mod duplicate_index_name_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DuplicateIndexNameError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError { pub document_type : * mut std :: os :: raw :: c_char , pub duplicate_index_name : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_name_error :: DuplicateIndexNameError > for dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError) -> dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_name_error :: DuplicateIndexNameError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_name_error :: DuplicateIndexNameError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type) , duplicate_index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . duplicate_index_name) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_name_error :: DuplicateIndexNameError > for dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_name_error :: DuplicateIndexNameError) -> * const dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type) , duplicate_index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . duplicate_index_name) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . document_type) ; ferment :: unbox_string (ffi_ref . duplicate_index_name) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError_ctor < > (document_type : * mut std :: os :: raw :: c_char , duplicate_index_name : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError { document_type , duplicate_index_name }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError_get_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError_get_duplicate_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError) -> * mut std :: os :: raw :: c_char { (* obj) . duplicate_index_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError_set_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError_set_duplicate_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError) -> * mut std :: os :: raw :: c_char { (* obj) . duplicate_index_name } } pub mod invalid_document_type_name_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidDocumentTypeNameError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError { pub name : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_name_error :: InvalidDocumentTypeNameError > for dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError) -> dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_name_error :: InvalidDocumentTypeNameError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_name_error :: InvalidDocumentTypeNameError { name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . name) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_name_error :: InvalidDocumentTypeNameError > for dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_name_error :: InvalidDocumentTypeNameError) -> * const dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError { name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . name) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . name) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError_ctor < > (name : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError { name }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError_get_name < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError) -> * mut std :: os :: raw :: c_char { (* obj) . name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError_set_name < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError) -> * mut std :: os :: raw :: c_char { (* obj) . name } } pub mod non_contiguous_contract_group_positions_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`NonContiguousContractGroupPositionsError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError { pub missing_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition , pub followed_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_group_positions_error :: NonContiguousContractGroupPositionsError > for dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError) -> dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_group_positions_error :: NonContiguousContractGroupPositionsError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_group_positions_error :: NonContiguousContractGroupPositionsError { missing_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionFrom < dpp :: data_contract :: GroupContractPosition >> :: ffi_from (ffi_ref . missing_position) , followed_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionFrom < dpp :: data_contract :: GroupContractPosition >> :: ffi_from (ffi_ref . followed_position) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_group_positions_error :: NonContiguousContractGroupPositionsError > for dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_group_positions_error :: NonContiguousContractGroupPositionsError) -> * const dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError { missing_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionTo < dpp :: data_contract :: GroupContractPosition >> :: ffi_to (obj . missing_position) , followed_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionTo < dpp :: data_contract :: GroupContractPosition >> :: ffi_to (obj . followed_position) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . missing_position) ; ferment :: unbox_any (ffi_ref . followed_position) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError_ctor < > (missing_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition , followed_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition) -> * mut dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError { missing_position , followed_position }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError_get_missing_position < > (obj : * const dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . missing_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError_get_followed_position < > (obj : * const dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . followed_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError_set_missing_position < > (obj : * const dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . missing_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError_set_followed_position < > (obj : * const dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . followed_position } } pub mod group_exceeds_max_members_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`GroupExceedsMaxMembersError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError { pub max_members : u32 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: group_exceeds_max_members_error :: GroupExceedsMaxMembersError > for dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError) -> dpp :: errors :: consensus :: basic :: data_contract :: group_exceeds_max_members_error :: GroupExceedsMaxMembersError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: group_exceeds_max_members_error :: GroupExceedsMaxMembersError { max_members : ffi_ref . max_members } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: group_exceeds_max_members_error :: GroupExceedsMaxMembersError > for dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: group_exceeds_max_members_error :: GroupExceedsMaxMembersError) -> * const dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError { max_members : obj . max_members }) } } impl Drop for dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError_ctor < > (max_members : u32) -> * mut dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError { max_members }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError_get_max_members < > (obj : * const dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError) -> u32 { (* obj) . max_members } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError_set_max_members < > (obj : * const dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError) -> u32 { (* obj) . max_members } } pub mod invalid_token_distribution_function_invalid_parameter_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidTokenDistributionFunctionInvalidParameterError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError { pub parameter : * mut std :: os :: raw :: c_char , pub min : i64 , pub max : i64 , pub not_valid : * mut i64 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_error :: InvalidTokenDistributionFunctionInvalidParameterError > for dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError) -> dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_error :: InvalidTokenDistributionFunctionInvalidParameterError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_error :: InvalidTokenDistributionFunctionInvalidParameterError { parameter : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . parameter) , min : ffi_ref . min , max : ffi_ref . max , not_valid : ferment :: from_opt_primitive (ffi_ref . not_valid) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_error :: InvalidTokenDistributionFunctionInvalidParameterError > for dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_error :: InvalidTokenDistributionFunctionInvalidParameterError) -> * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError { parameter : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . parameter) , min : obj . min , max : obj . max , not_valid : ferment :: to_opt_primitive (obj . not_valid) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . parameter) ; ; ; ferment :: destroy_opt_primitive (ffi_ref . not_valid) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError_ctor < > (parameter : * mut std :: os :: raw :: c_char , min : i64 , max : i64 , not_valid : * mut i64) -> * mut dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError { parameter , min , max , not_valid }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError_get_parameter < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError) -> * mut std :: os :: raw :: c_char { (* obj) . parameter } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError_get_min < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError) -> i64 { (* obj) . min } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError_get_max < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError) -> i64 { (* obj) . max } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError_get_not_valid < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError) -> * mut i64 { (* obj) . not_valid } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError_set_parameter < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError) -> * mut std :: os :: raw :: c_char { (* obj) . parameter } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError_set_min < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError) -> i64 { (* obj) . min } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError_set_max < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError) -> i64 { (* obj) . max } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError_set_not_valid < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError) -> * mut i64 { (* obj) . not_valid } } pub mod group_position_does_not_exist_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`GroupPositionDoesNotExistError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError { pub missing_group_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: group_position_does_not_exist_error :: GroupPositionDoesNotExistError > for dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError) -> dpp :: errors :: consensus :: basic :: data_contract :: group_position_does_not_exist_error :: GroupPositionDoesNotExistError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: group_position_does_not_exist_error :: GroupPositionDoesNotExistError { missing_group_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionFrom < dpp :: data_contract :: GroupContractPosition >> :: ffi_from (ffi_ref . missing_group_position) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: group_position_does_not_exist_error :: GroupPositionDoesNotExistError > for dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: group_position_does_not_exist_error :: GroupPositionDoesNotExistError) -> * const dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError { missing_group_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionTo < dpp :: data_contract :: GroupContractPosition >> :: ffi_to (obj . missing_group_position) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . missing_group_position) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError_ctor < > (missing_group_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition) -> * mut dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError { missing_group_position }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError_get_missing_group_position < > (obj : * const dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . missing_group_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError_set_missing_group_position < > (obj : * const dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . missing_group_position } } # [cfg (feature = "json-schema-validation")] pub mod invalid_json_schema_ref_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidJsonSchemaRefError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError { pub message : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_json_schema_ref_error :: InvalidJsonSchemaRefError > for dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError) -> dpp :: errors :: consensus :: basic :: data_contract :: invalid_json_schema_ref_error :: InvalidJsonSchemaRefError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: invalid_json_schema_ref_error :: InvalidJsonSchemaRefError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . message) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_json_schema_ref_error :: InvalidJsonSchemaRefError > for dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: invalid_json_schema_ref_error :: InvalidJsonSchemaRefError) -> * const dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . message) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . message) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError_ctor < > (message : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError { message }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError_get_message < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError) -> * mut std :: os :: raw :: c_char { (* obj) . message } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError_set_message < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError) -> * mut std :: os :: raw :: c_char { (* obj) . message } } pub mod non_contiguous_contract_token_positions_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`NonContiguousContractTokenPositionsError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError { pub missing_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition , pub followed_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_token_positions_error :: NonContiguousContractTokenPositionsError > for dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError) -> dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_token_positions_error :: NonContiguousContractTokenPositionsError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_token_positions_error :: NonContiguousContractTokenPositionsError { missing_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition as ferment :: FFIConversionFrom < dpp :: data_contract :: TokenContractPosition >> :: ffi_from (ffi_ref . missing_position) , followed_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition as ferment :: FFIConversionFrom < dpp :: data_contract :: TokenContractPosition >> :: ffi_from (ffi_ref . followed_position) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_token_positions_error :: NonContiguousContractTokenPositionsError > for dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_token_positions_error :: NonContiguousContractTokenPositionsError) -> * const dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError { missing_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition as ferment :: FFIConversionTo < dpp :: data_contract :: TokenContractPosition >> :: ffi_to (obj . missing_position) , followed_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition as ferment :: FFIConversionTo < dpp :: data_contract :: TokenContractPosition >> :: ffi_to (obj . followed_position) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . missing_position) ; ferment :: unbox_any (ffi_ref . followed_position) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError_ctor < > (missing_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition , followed_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition) -> * mut dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError { missing_position , followed_position }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError_get_missing_position < > (obj : * const dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition { (* obj) . missing_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError_get_followed_position < > (obj : * const dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition { (* obj) . followed_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError_set_missing_position < > (obj : * const dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition { (* obj) . missing_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError_set_followed_position < > (obj : * const dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition { (* obj) . followed_position } } pub mod data_contract_token_configuration_update_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractTokenConfigurationUpdateError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError { pub operation : * mut std :: os :: raw :: c_char , pub field_path : * mut std :: os :: raw :: c_char , pub old_config : * mut dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationFFI , pub new_config : * mut dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationFFI } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_token_configuration_update_error :: DataContractTokenConfigurationUpdateError > for dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError) -> dpp :: errors :: consensus :: basic :: data_contract :: data_contract_token_configuration_update_error :: DataContractTokenConfigurationUpdateError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: data_contract_token_configuration_update_error :: DataContractTokenConfigurationUpdateError { operation : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . operation) , field_path : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . field_path) , old_config : < dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationFFI as ferment :: FFIConversionFrom < dpp :: data_contract :: associated_token :: token_configuration :: TokenConfiguration >> :: ffi_from (ffi_ref . old_config) , new_config : < dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationFFI as ferment :: FFIConversionFrom < dpp :: data_contract :: associated_token :: token_configuration :: TokenConfiguration >> :: ffi_from (ffi_ref . new_config) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_token_configuration_update_error :: DataContractTokenConfigurationUpdateError > for dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: data_contract_token_configuration_update_error :: DataContractTokenConfigurationUpdateError) -> * const dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError { operation : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . operation) , field_path : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . field_path) , old_config : < dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationFFI as ferment :: FFIConversionTo < dpp :: data_contract :: associated_token :: token_configuration :: TokenConfiguration >> :: ffi_to (obj . old_config) , new_config : < dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationFFI as ferment :: FFIConversionTo < dpp :: data_contract :: associated_token :: token_configuration :: TokenConfiguration >> :: ffi_to (obj . new_config) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . operation) ; ferment :: unbox_string (ffi_ref . field_path) ; ferment :: unbox_any (ffi_ref . old_config) ; ferment :: unbox_any (ffi_ref . new_config) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError_ctor < > (operation : * mut std :: os :: raw :: c_char , field_path : * mut std :: os :: raw :: c_char , old_config : * mut dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationFFI , new_config : * mut dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationFFI) -> * mut dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError { operation , field_path , old_config , new_config }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError_get_operation < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . operation } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError_get_field_path < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . field_path } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError_get_old_config < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError) -> * mut dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationFFI { (* obj) . old_config } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError_get_new_config < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError) -> * mut dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationFFI { (* obj) . new_config } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError_set_operation < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . operation } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError_set_field_path < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . field_path } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError_set_old_config < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError) -> * mut dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationFFI { (* obj) . old_config } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError_set_new_config < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError) -> * mut dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationFFI { (* obj) . new_config } } pub mod data_contract_invalid_index_definition_update_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractInvalidIndexDefinitionUpdateError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError { pub document_type : * mut std :: os :: raw :: c_char , pub index_path : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_invalid_index_definition_update_error :: DataContractInvalidIndexDefinitionUpdateError > for dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError) -> dpp :: errors :: consensus :: basic :: data_contract :: data_contract_invalid_index_definition_update_error :: DataContractInvalidIndexDefinitionUpdateError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: data_contract_invalid_index_definition_update_error :: DataContractInvalidIndexDefinitionUpdateError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type) , index_path : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . index_path) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_invalid_index_definition_update_error :: DataContractInvalidIndexDefinitionUpdateError > for dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: data_contract_invalid_index_definition_update_error :: DataContractInvalidIndexDefinitionUpdateError) -> * const dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type) , index_path : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . index_path) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . document_type) ; ferment :: unbox_string (ffi_ref . index_path) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError_ctor < > (document_type : * mut std :: os :: raw :: c_char , index_path : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError { document_type , index_path }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError_get_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError_get_index_path < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . index_path } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError_set_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError_set_index_path < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . index_path } } pub mod invalid_token_distribution_function_invalid_parameter_tuple_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidTokenDistributionFunctionInvalidParameterTupleError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError { pub first_parameter : * mut std :: os :: raw :: c_char , pub second_parameter : * mut std :: os :: raw :: c_char , pub relation : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_tuple_error :: InvalidTokenDistributionFunctionInvalidParameterTupleError > for dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError) -> dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_tuple_error :: InvalidTokenDistributionFunctionInvalidParameterTupleError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_tuple_error :: InvalidTokenDistributionFunctionInvalidParameterTupleError { first_parameter : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . first_parameter) , second_parameter : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . second_parameter) , relation : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . relation) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_tuple_error :: InvalidTokenDistributionFunctionInvalidParameterTupleError > for dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_tuple_error :: InvalidTokenDistributionFunctionInvalidParameterTupleError) -> * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError { first_parameter : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . first_parameter) , second_parameter : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . second_parameter) , relation : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . relation) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . first_parameter) ; ferment :: unbox_string (ffi_ref . second_parameter) ; ferment :: unbox_string (ffi_ref . relation) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError_ctor < > (first_parameter : * mut std :: os :: raw :: c_char , second_parameter : * mut std :: os :: raw :: c_char , relation : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError { first_parameter , second_parameter , relation }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError_get_first_parameter < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError) -> * mut std :: os :: raw :: c_char { (* obj) . first_parameter } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError_get_second_parameter < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError) -> * mut std :: os :: raw :: c_char { (* obj) . second_parameter } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError_get_relation < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError) -> * mut std :: os :: raw :: c_char { (* obj) . relation } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError_set_first_parameter < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError) -> * mut std :: os :: raw :: c_char { (* obj) . first_parameter } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError_set_second_parameter < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError) -> * mut std :: os :: raw :: c_char { (* obj) . second_parameter } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError_set_relation < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError) -> * mut std :: os :: raw :: c_char { (* obj) . relation } } pub mod invalid_index_property_type_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIndexPropertyTypeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError { pub document_type : * mut std :: os :: raw :: c_char , pub index_name : * mut std :: os :: raw :: c_char , pub property_name : * mut std :: os :: raw :: c_char , pub property_type : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_index_property_type_error :: InvalidIndexPropertyTypeError > for dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError) -> dpp :: errors :: consensus :: basic :: data_contract :: invalid_index_property_type_error :: InvalidIndexPropertyTypeError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: invalid_index_property_type_error :: InvalidIndexPropertyTypeError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type) , index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . index_name) , property_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . property_name) , property_type : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . property_type) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_index_property_type_error :: InvalidIndexPropertyTypeError > for dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: invalid_index_property_type_error :: InvalidIndexPropertyTypeError) -> * const dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type) , index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . index_name) , property_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . property_name) , property_type : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . property_type) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . document_type) ; ferment :: unbox_string (ffi_ref . index_name) ; ferment :: unbox_string (ffi_ref . property_name) ; ferment :: unbox_string (ffi_ref . property_type) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError_ctor < > (document_type : * mut std :: os :: raw :: c_char , index_name : * mut std :: os :: raw :: c_char , property_name : * mut std :: os :: raw :: c_char , property_type : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError { document_type , index_name , property_name , property_type }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError_get_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError_get_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError) -> * mut std :: os :: raw :: c_char { (* obj) . index_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError_get_property_name < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError) -> * mut std :: os :: raw :: c_char { (* obj) . property_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError_get_property_type < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError) -> * mut std :: os :: raw :: c_char { (* obj) . property_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError_set_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError_set_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError) -> * mut std :: os :: raw :: c_char { (* obj) . index_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError_set_property_name < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError) -> * mut std :: os :: raw :: c_char { (* obj) . property_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError_set_property_type < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError) -> * mut std :: os :: raw :: c_char { (* obj) . property_type } } pub mod data_contract_have_new_unique_index_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractHaveNewUniqueIndexError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError { pub document_type : * mut std :: os :: raw :: c_char , pub index_name : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_have_new_unique_index_error :: DataContractHaveNewUniqueIndexError > for dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError) -> dpp :: errors :: consensus :: basic :: data_contract :: data_contract_have_new_unique_index_error :: DataContractHaveNewUniqueIndexError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: data_contract_have_new_unique_index_error :: DataContractHaveNewUniqueIndexError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type) , index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . index_name) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_have_new_unique_index_error :: DataContractHaveNewUniqueIndexError > for dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: data_contract_have_new_unique_index_error :: DataContractHaveNewUniqueIndexError) -> * const dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type) , index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . index_name) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . document_type) ; ferment :: unbox_string (ffi_ref . index_name) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError_ctor < > (document_type : * mut std :: os :: raw :: c_char , index_name : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError { document_type , index_name }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError_get_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError_get_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError) -> * mut std :: os :: raw :: c_char { (* obj) . index_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError_set_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError_set_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError) -> * mut std :: os :: raw :: c_char { (* obj) . index_name } } pub mod group_member_has_power_of_zero_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`GroupMemberHasPowerOfZeroError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError { pub member_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_of_zero_error :: GroupMemberHasPowerOfZeroError > for dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError) -> dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_of_zero_error :: GroupMemberHasPowerOfZeroError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_of_zero_error :: GroupMemberHasPowerOfZeroError { member_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . member_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_of_zero_error :: GroupMemberHasPowerOfZeroError > for dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_of_zero_error :: GroupMemberHasPowerOfZeroError) -> * const dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError { member_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . member_id) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . member_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError_ctor < > (member_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError { member_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError_get_member_id < > (obj : * const dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . member_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError_set_member_id < > (obj : * const dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . member_id } } pub mod contested_unique_index_with_unique_index_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ContestedUniqueIndexWithUniqueIndexError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError { pub document_type : * mut std :: os :: raw :: c_char , pub contested_unique_index_name : * mut std :: os :: raw :: c_char , pub unique_index_name : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_with_unique_index_error :: ContestedUniqueIndexWithUniqueIndexError > for dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError) -> dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_with_unique_index_error :: ContestedUniqueIndexWithUniqueIndexError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_with_unique_index_error :: ContestedUniqueIndexWithUniqueIndexError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type) , contested_unique_index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . contested_unique_index_name) , unique_index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . unique_index_name) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_with_unique_index_error :: ContestedUniqueIndexWithUniqueIndexError > for dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_with_unique_index_error :: ContestedUniqueIndexWithUniqueIndexError) -> * const dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError { document_type : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type) , contested_unique_index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . contested_unique_index_name) , unique_index_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . unique_index_name) }) } } impl Drop for dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . document_type) ; ferment :: unbox_string (ffi_ref . contested_unique_index_name) ; ferment :: unbox_string (ffi_ref . unique_index_name) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError_ctor < > (document_type : * mut std :: os :: raw :: c_char , contested_unique_index_name : * mut std :: os :: raw :: c_char , unique_index_name : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError { document_type , contested_unique_index_name , unique_index_name }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError_get_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError_get_contested_unique_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError) -> * mut std :: os :: raw :: c_char { (* obj) . contested_unique_index_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError_get_unique_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError) -> * mut std :: os :: raw :: c_char { (* obj) . unique_index_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError_set_document_type < > (obj : * const dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError_set_contested_unique_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError) -> * mut std :: os :: raw :: c_char { (* obj) . contested_unique_index_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError_set_unique_index_name < > (obj : * const dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError) -> * mut std :: os :: raw :: c_char { (* obj) . unique_index_name } } pub mod invalid_data_contract_version_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidDataContractVersionError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError { pub expected_version : u32 , pub version : u32 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_version_error :: InvalidDataContractVersionError > for dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError) -> dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_version_error :: InvalidDataContractVersionError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_version_error :: InvalidDataContractVersionError { expected_version : ffi_ref . expected_version , version : ffi_ref . version } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_version_error :: InvalidDataContractVersionError > for dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_version_error :: InvalidDataContractVersionError) -> * const dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError { expected_version : obj . expected_version , version : obj . version }) } } impl Drop for dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError_ctor < > (expected_version : u32 , version : u32) -> * mut dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError { ferment :: boxed (dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError { expected_version , version }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError_destroy < > (ffi : * mut dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError_get_expected_version < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError) -> u32 { (* obj) . expected_version } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError_get_version < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError) -> u32 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError_set_expected_version < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError) -> u32 { (* obj) . expected_version } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError_set_version < > (obj : * const dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError) -> u32 { (* obj) . version } } } pub mod value_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ValueError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_value_error_ValueError { pub value_error : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: value_error :: ValueError > for dpp_errors_consensus_basic_value_error_ValueError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_value_error_ValueError) -> dpp :: errors :: consensus :: basic :: value_error :: ValueError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: value_error :: ValueError { value_error : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . value_error) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: value_error :: ValueError > for dpp_errors_consensus_basic_value_error_ValueError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: value_error :: ValueError) -> * const dpp_errors_consensus_basic_value_error_ValueError { ferment :: boxed (dpp_errors_consensus_basic_value_error_ValueError { value_error : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . value_error) }) } } impl Drop for dpp_errors_consensus_basic_value_error_ValueError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . value_error) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_value_error_ValueError_ctor < > (value_error : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_value_error_ValueError { ferment :: boxed (dpp_errors_consensus_basic_value_error_ValueError { value_error }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_value_error_ValueError_destroy < > (ffi : * mut dpp_errors_consensus_basic_value_error_ValueError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_value_error_ValueError_get_value_error < > (obj : * const dpp_errors_consensus_basic_value_error_ValueError) -> * mut std :: os :: raw :: c_char { (* obj) . value_error } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_value_error_ValueError_set_value_error < > (obj : * const dpp_errors_consensus_basic_value_error_ValueError) -> * mut std :: os :: raw :: c_char { (* obj) . value_error } } pub mod decode { use crate as dash_spv_apple_bindings ; pub mod protocol_version_parsing_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ProtocolVersionParsingError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError { pub parsing_error : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: decode :: protocol_version_parsing_error :: ProtocolVersionParsingError > for dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError) -> dpp :: errors :: consensus :: basic :: decode :: protocol_version_parsing_error :: ProtocolVersionParsingError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: decode :: protocol_version_parsing_error :: ProtocolVersionParsingError { parsing_error : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . parsing_error) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: decode :: protocol_version_parsing_error :: ProtocolVersionParsingError > for dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: decode :: protocol_version_parsing_error :: ProtocolVersionParsingError) -> * const dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError { ferment :: boxed (dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError { parsing_error : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . parsing_error) }) } } impl Drop for dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . parsing_error) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError_ctor < > (parsing_error : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError { ferment :: boxed (dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError { parsing_error }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError_destroy < > (ffi : * mut dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError_get_parsing_error < > (obj : * const dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError) -> * mut std :: os :: raw :: c_char { (* obj) . parsing_error } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError_set_parsing_error < > (obj : * const dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError) -> * mut std :: os :: raw :: c_char { (* obj) . parsing_error } } pub mod serialized_object_parsing_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`SerializedObjectParsingError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError { pub parsing_error : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: decode :: serialized_object_parsing_error :: SerializedObjectParsingError > for dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError) -> dpp :: errors :: consensus :: basic :: decode :: serialized_object_parsing_error :: SerializedObjectParsingError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: decode :: serialized_object_parsing_error :: SerializedObjectParsingError { parsing_error : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . parsing_error) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: decode :: serialized_object_parsing_error :: SerializedObjectParsingError > for dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: decode :: serialized_object_parsing_error :: SerializedObjectParsingError) -> * const dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError { ferment :: boxed (dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError { parsing_error : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . parsing_error) }) } } impl Drop for dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . parsing_error) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError_ctor < > (parsing_error : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError { ferment :: boxed (dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError { parsing_error }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError_destroy < > (ffi : * mut dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError_get_parsing_error < > (obj : * const dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError) -> * mut std :: os :: raw :: c_char { (* obj) . parsing_error } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError_set_parsing_error < > (obj : * const dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError) -> * mut std :: os :: raw :: c_char { (* obj) . parsing_error } } pub mod decoding_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DecodingError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_decode_decoding_error_DecodingError { pub error : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: decode :: decoding_error :: DecodingError > for dpp_errors_consensus_basic_decode_decoding_error_DecodingError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_decode_decoding_error_DecodingError) -> dpp :: errors :: consensus :: basic :: decode :: decoding_error :: DecodingError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: decode :: decoding_error :: DecodingError { error : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . error) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: decode :: decoding_error :: DecodingError > for dpp_errors_consensus_basic_decode_decoding_error_DecodingError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: decode :: decoding_error :: DecodingError) -> * const dpp_errors_consensus_basic_decode_decoding_error_DecodingError { ferment :: boxed (dpp_errors_consensus_basic_decode_decoding_error_DecodingError { error : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . error) }) } } impl Drop for dpp_errors_consensus_basic_decode_decoding_error_DecodingError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . error) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_decode_decoding_error_DecodingError_ctor < > (error : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_decode_decoding_error_DecodingError { ferment :: boxed (dpp_errors_consensus_basic_decode_decoding_error_DecodingError { error }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_decode_decoding_error_DecodingError_destroy < > (ffi : * mut dpp_errors_consensus_basic_decode_decoding_error_DecodingError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_decode_decoding_error_DecodingError_get_error < > (obj : * const dpp_errors_consensus_basic_decode_decoding_error_DecodingError) -> * mut std :: os :: raw :: c_char { (* obj) . error } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_decode_decoding_error_DecodingError_set_error < > (obj : * const dpp_errors_consensus_basic_decode_decoding_error_DecodingError) -> * mut std :: os :: raw :: c_char { (* obj) . error } } pub mod version_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`VersionError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_decode_version_error_VersionError { pub error : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: decode :: version_error :: VersionError > for dpp_errors_consensus_basic_decode_version_error_VersionError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_decode_version_error_VersionError) -> dpp :: errors :: consensus :: basic :: decode :: version_error :: VersionError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: decode :: version_error :: VersionError { error : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . error) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: decode :: version_error :: VersionError > for dpp_errors_consensus_basic_decode_version_error_VersionError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: decode :: version_error :: VersionError) -> * const dpp_errors_consensus_basic_decode_version_error_VersionError { ferment :: boxed (dpp_errors_consensus_basic_decode_version_error_VersionError { error : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . error) }) } } impl Drop for dpp_errors_consensus_basic_decode_version_error_VersionError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . error) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_decode_version_error_VersionError_ctor < > (error : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_decode_version_error_VersionError { ferment :: boxed (dpp_errors_consensus_basic_decode_version_error_VersionError { error }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_decode_version_error_VersionError_destroy < > (ffi : * mut dpp_errors_consensus_basic_decode_version_error_VersionError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_decode_version_error_VersionError_get_error < > (obj : * const dpp_errors_consensus_basic_decode_version_error_VersionError) -> * mut std :: os :: raw :: c_char { (* obj) . error } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_decode_version_error_VersionError_set_error < > (obj : * const dpp_errors_consensus_basic_decode_version_error_VersionError) -> * mut std :: os :: raw :: c_char { (* obj) . error } } } pub mod identity { use crate as dash_spv_apple_bindings ; pub mod invalid_instant_asset_lock_proof_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidInstantAssetLockProofError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError { pub message : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_error :: InvalidInstantAssetLockProofError > for dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError) -> dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_error :: InvalidInstantAssetLockProofError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_error :: InvalidInstantAssetLockProofError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . message) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_error :: InvalidInstantAssetLockProofError > for dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_error :: InvalidInstantAssetLockProofError) -> * const dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . message) }) } } impl Drop for dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . message) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError_ctor < > (message : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError { message }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError_get_message < > (obj : * const dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError) -> * mut std :: os :: raw :: c_char { (* obj) . message } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError_set_message < > (obj : * const dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError) -> * mut std :: os :: raw :: c_char { (* obj) . message } } pub mod invalid_asset_lock_proof_core_chain_height_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidAssetLockProofCoreChainHeightError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError { pub proof_core_chain_locked_height : u32 , pub current_core_chain_locked_height : u32 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_core_chain_height_error :: InvalidAssetLockProofCoreChainHeightError > for dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError) -> dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_core_chain_height_error :: InvalidAssetLockProofCoreChainHeightError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_core_chain_height_error :: InvalidAssetLockProofCoreChainHeightError { proof_core_chain_locked_height : ffi_ref . proof_core_chain_locked_height , current_core_chain_locked_height : ffi_ref . current_core_chain_locked_height } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_core_chain_height_error :: InvalidAssetLockProofCoreChainHeightError > for dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_core_chain_height_error :: InvalidAssetLockProofCoreChainHeightError) -> * const dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError { proof_core_chain_locked_height : obj . proof_core_chain_locked_height , current_core_chain_locked_height : obj . current_core_chain_locked_height }) } } impl Drop for dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError_ctor < > (proof_core_chain_locked_height : u32 , current_core_chain_locked_height : u32) -> * mut dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError { proof_core_chain_locked_height , current_core_chain_locked_height }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError_get_proof_core_chain_locked_height < > (obj : * const dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError) -> u32 { (* obj) . proof_core_chain_locked_height } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError_get_current_core_chain_locked_height < > (obj : * const dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError) -> u32 { (* obj) . current_core_chain_locked_height } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError_set_proof_core_chain_locked_height < > (obj : * const dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError) -> u32 { (* obj) . proof_core_chain_locked_height } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError_set_current_core_chain_locked_height < > (obj : * const dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError) -> u32 { (* obj) . current_core_chain_locked_height } } pub mod invalid_asset_lock_transaction_output_return_size { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidAssetLockTransactionOutputReturnSizeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError { pub output_index : usize } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_transaction_output_return_size :: InvalidAssetLockTransactionOutputReturnSizeError > for dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError) -> dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_transaction_output_return_size :: InvalidAssetLockTransactionOutputReturnSizeError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_transaction_output_return_size :: InvalidAssetLockTransactionOutputReturnSizeError { output_index : ffi_ref . output_index } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_transaction_output_return_size :: InvalidAssetLockTransactionOutputReturnSizeError > for dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_transaction_output_return_size :: InvalidAssetLockTransactionOutputReturnSizeError) -> * const dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError { output_index : obj . output_index }) } } impl Drop for dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError_ctor < > (output_index : usize) -> * mut dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError { output_index }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError_get_output_index < > (obj : * const dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError) -> usize { (* obj) . output_index } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError_set_output_index < > (obj : * const dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError) -> usize { (* obj) . output_index } } pub mod too_many_master_public_key_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TooManyMasterPublicKeyError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_too_many_master_public_key_error_TooManyMasterPublicKeyError { } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: too_many_master_public_key_error :: TooManyMasterPublicKeyError > for dpp_errors_consensus_basic_identity_too_many_master_public_key_error_TooManyMasterPublicKeyError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_too_many_master_public_key_error_TooManyMasterPublicKeyError) -> dpp :: errors :: consensus :: basic :: identity :: too_many_master_public_key_error :: TooManyMasterPublicKeyError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: too_many_master_public_key_error :: TooManyMasterPublicKeyError { } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: too_many_master_public_key_error :: TooManyMasterPublicKeyError > for dpp_errors_consensus_basic_identity_too_many_master_public_key_error_TooManyMasterPublicKeyError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: too_many_master_public_key_error :: TooManyMasterPublicKeyError) -> * const dpp_errors_consensus_basic_identity_too_many_master_public_key_error_TooManyMasterPublicKeyError { ferment :: boxed (dpp_errors_consensus_basic_identity_too_many_master_public_key_error_TooManyMasterPublicKeyError { }) } } impl Drop for dpp_errors_consensus_basic_identity_too_many_master_public_key_error_TooManyMasterPublicKeyError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_too_many_master_public_key_error_TooManyMasterPublicKeyError_ctor < > () -> * mut dpp_errors_consensus_basic_identity_too_many_master_public_key_error_TooManyMasterPublicKeyError { ferment :: boxed (dpp_errors_consensus_basic_identity_too_many_master_public_key_error_TooManyMasterPublicKeyError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_too_many_master_public_key_error_TooManyMasterPublicKeyError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_too_many_master_public_key_error_TooManyMasterPublicKeyError) { ferment :: unbox_any (ffi) ; } } pub mod invalid_identity_update_transition_disable_keys_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIdentityUpdateTransitionDisableKeysError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_invalid_identity_update_transition_disable_keys_error_InvalidIdentityUpdateTransitionDisableKeysError { } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_disable_keys_error :: InvalidIdentityUpdateTransitionDisableKeysError > for dpp_errors_consensus_basic_identity_invalid_identity_update_transition_disable_keys_error_InvalidIdentityUpdateTransitionDisableKeysError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_invalid_identity_update_transition_disable_keys_error_InvalidIdentityUpdateTransitionDisableKeysError) -> dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_disable_keys_error :: InvalidIdentityUpdateTransitionDisableKeysError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_disable_keys_error :: InvalidIdentityUpdateTransitionDisableKeysError { } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_disable_keys_error :: InvalidIdentityUpdateTransitionDisableKeysError > for dpp_errors_consensus_basic_identity_invalid_identity_update_transition_disable_keys_error_InvalidIdentityUpdateTransitionDisableKeysError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_disable_keys_error :: InvalidIdentityUpdateTransitionDisableKeysError) -> * const dpp_errors_consensus_basic_identity_invalid_identity_update_transition_disable_keys_error_InvalidIdentityUpdateTransitionDisableKeysError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_update_transition_disable_keys_error_InvalidIdentityUpdateTransitionDisableKeysError { }) } } impl Drop for dpp_errors_consensus_basic_identity_invalid_identity_update_transition_disable_keys_error_InvalidIdentityUpdateTransitionDisableKeysError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_update_transition_disable_keys_error_InvalidIdentityUpdateTransitionDisableKeysError_ctor < > () -> * mut dpp_errors_consensus_basic_identity_invalid_identity_update_transition_disable_keys_error_InvalidIdentityUpdateTransitionDisableKeysError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_update_transition_disable_keys_error_InvalidIdentityUpdateTransitionDisableKeysError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_update_transition_disable_keys_error_InvalidIdentityUpdateTransitionDisableKeysError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_invalid_identity_update_transition_disable_keys_error_InvalidIdentityUpdateTransitionDisableKeysError) { ferment :: unbox_any (ffi) ; } } pub mod identity_asset_lock_transaction_out_point_not_enough_balance_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityAssetLockTransactionOutPointNotEnoughBalanceError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError { pub transaction_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , pub output_index : usize , pub initial_asset_lock_credits : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits , pub credits_left : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits , pub credits_required : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_not_enough_balance_error :: IdentityAssetLockTransactionOutPointNotEnoughBalanceError > for dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError) -> dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_not_enough_balance_error :: IdentityAssetLockTransactionOutPointNotEnoughBalanceError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_not_enough_balance_error :: IdentityAssetLockTransactionOutPointNotEnoughBalanceError { transaction_id : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionFrom < dashcore :: hash_types :: Txid >> :: ffi_from (ffi_ref . transaction_id) , output_index : ffi_ref . output_index , initial_asset_lock_credits : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionFrom < dpp :: balances :: credits :: Credits >> :: ffi_from (ffi_ref . initial_asset_lock_credits) , credits_left : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionFrom < dpp :: balances :: credits :: Credits >> :: ffi_from (ffi_ref . credits_left) , credits_required : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionFrom < dpp :: balances :: credits :: Credits >> :: ffi_from (ffi_ref . credits_required) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_not_enough_balance_error :: IdentityAssetLockTransactionOutPointNotEnoughBalanceError > for dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_not_enough_balance_error :: IdentityAssetLockTransactionOutPointNotEnoughBalanceError) -> * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError { ferment :: boxed (dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError { transaction_id : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionTo < dashcore :: hash_types :: Txid >> :: ffi_to (obj . transaction_id) , output_index : obj . output_index , initial_asset_lock_credits : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionTo < dpp :: balances :: credits :: Credits >> :: ffi_to (obj . initial_asset_lock_credits) , credits_left : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionTo < dpp :: balances :: credits :: Credits >> :: ffi_to (obj . credits_left) , credits_required : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionTo < dpp :: balances :: credits :: Credits >> :: ffi_to (obj . credits_required) }) } } impl Drop for dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . transaction_id) ; ; ferment :: unbox_any (ffi_ref . initial_asset_lock_credits) ; ferment :: unbox_any (ffi_ref . credits_left) ; ferment :: unbox_any (ffi_ref . credits_required) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError_ctor < > (transaction_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , output_index : usize , initial_asset_lock_credits : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits , credits_left : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits , credits_required : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits) -> * mut dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError { ferment :: boxed (dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError { transaction_id , output_index , initial_asset_lock_credits , credits_left , credits_required }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError_get_transaction_id < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . transaction_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError_get_output_index < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError) -> usize { (* obj) . output_index } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError_get_initial_asset_lock_credits < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . initial_asset_lock_credits } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError_get_credits_left < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . credits_left } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError_get_credits_required < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . credits_required } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError_set_transaction_id < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . transaction_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError_set_output_index < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError) -> usize { (* obj) . output_index } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError_set_initial_asset_lock_credits < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . initial_asset_lock_credits } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError_set_credits_left < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . credits_left } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError_set_credits_required < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . credits_required } } pub mod duplicated_identity_public_key_id_basic_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DuplicatedIdentityPublicKeyIdBasicError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError { pub duplicated_ids : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_id_basic_error :: DuplicatedIdentityPublicKeyIdBasicError > for dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError) -> dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_id_basic_error :: DuplicatedIdentityPublicKeyIdBasicError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_id_basic_error :: DuplicatedIdentityPublicKeyIdBasicError { duplicated_ids : < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < Vec < dpp :: identity :: identity_public_key :: KeyID > >> :: ffi_from (ffi_ref . duplicated_ids) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_id_basic_error :: DuplicatedIdentityPublicKeyIdBasicError > for dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_id_basic_error :: DuplicatedIdentityPublicKeyIdBasicError) -> * const dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError { ferment :: boxed (dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError { duplicated_ids : < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < Vec < dpp :: identity :: identity_public_key :: KeyID > >> :: ffi_to (obj . duplicated_ids) }) } } impl Drop for dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . duplicated_ids) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError_ctor < > (duplicated_ids : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID) -> * mut dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError { ferment :: boxed (dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError { duplicated_ids }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError_get_duplicated_ids < > (obj : * const dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError) -> * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID { (* obj) . duplicated_ids } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError_set_duplicated_ids < > (obj : * const dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError) -> * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID { (* obj) . duplicated_ids } } pub mod missing_master_public_key_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MissingMasterPublicKeyError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_missing_master_public_key_error_MissingMasterPublicKeyError { } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: missing_master_public_key_error :: MissingMasterPublicKeyError > for dpp_errors_consensus_basic_identity_missing_master_public_key_error_MissingMasterPublicKeyError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_missing_master_public_key_error_MissingMasterPublicKeyError) -> dpp :: errors :: consensus :: basic :: identity :: missing_master_public_key_error :: MissingMasterPublicKeyError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: missing_master_public_key_error :: MissingMasterPublicKeyError { } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: missing_master_public_key_error :: MissingMasterPublicKeyError > for dpp_errors_consensus_basic_identity_missing_master_public_key_error_MissingMasterPublicKeyError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: missing_master_public_key_error :: MissingMasterPublicKeyError) -> * const dpp_errors_consensus_basic_identity_missing_master_public_key_error_MissingMasterPublicKeyError { ferment :: boxed (dpp_errors_consensus_basic_identity_missing_master_public_key_error_MissingMasterPublicKeyError { }) } } impl Drop for dpp_errors_consensus_basic_identity_missing_master_public_key_error_MissingMasterPublicKeyError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_missing_master_public_key_error_MissingMasterPublicKeyError_ctor < > () -> * mut dpp_errors_consensus_basic_identity_missing_master_public_key_error_MissingMasterPublicKeyError { ferment :: boxed (dpp_errors_consensus_basic_identity_missing_master_public_key_error_MissingMasterPublicKeyError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_missing_master_public_key_error_MissingMasterPublicKeyError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_missing_master_public_key_error_MissingMasterPublicKeyError) { ferment :: unbox_any (ffi) ; } } pub mod data_contract_bounds_not_present_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractBoundsNotPresentError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError { pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: data_contract_bounds_not_present_error :: DataContractBoundsNotPresentError > for dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError) -> dpp :: errors :: consensus :: basic :: identity :: data_contract_bounds_not_present_error :: DataContractBoundsNotPresentError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: data_contract_bounds_not_present_error :: DataContractBoundsNotPresentError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: data_contract_bounds_not_present_error :: DataContractBoundsNotPresentError > for dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: data_contract_bounds_not_present_error :: DataContractBoundsNotPresentError) -> * const dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError { ferment :: boxed (dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) }) } } impl Drop for dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data_contract_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError_ctor < > (data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError { ferment :: boxed (dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError { data_contract_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError_get_data_contract_id < > (obj : * const dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError_set_data_contract_id < > (obj : * const dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } } pub mod invalid_instant_asset_lock_proof_signature_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidInstantAssetLockProofSignatureError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_signature_error_InvalidInstantAssetLockProofSignatureError { } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_signature_error :: InvalidInstantAssetLockProofSignatureError > for dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_signature_error_InvalidInstantAssetLockProofSignatureError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_signature_error_InvalidInstantAssetLockProofSignatureError) -> dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_signature_error :: InvalidInstantAssetLockProofSignatureError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_signature_error :: InvalidInstantAssetLockProofSignatureError { } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_signature_error :: InvalidInstantAssetLockProofSignatureError > for dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_signature_error_InvalidInstantAssetLockProofSignatureError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_signature_error :: InvalidInstantAssetLockProofSignatureError) -> * const dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_signature_error_InvalidInstantAssetLockProofSignatureError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_signature_error_InvalidInstantAssetLockProofSignatureError { }) } } impl Drop for dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_signature_error_InvalidInstantAssetLockProofSignatureError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_signature_error_InvalidInstantAssetLockProofSignatureError_ctor < > () -> * mut dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_signature_error_InvalidInstantAssetLockProofSignatureError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_signature_error_InvalidInstantAssetLockProofSignatureError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_signature_error_InvalidInstantAssetLockProofSignatureError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_signature_error_InvalidInstantAssetLockProofSignatureError) { ferment :: unbox_any (ffi) ; } } pub mod invalid_asset_lock_proof_transaction_height_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidAssetLockProofTransactionHeightError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError { pub proof_core_chain_locked_height : u32 , pub transaction_height : * mut u32 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_transaction_height_error :: InvalidAssetLockProofTransactionHeightError > for dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError) -> dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_transaction_height_error :: InvalidAssetLockProofTransactionHeightError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_transaction_height_error :: InvalidAssetLockProofTransactionHeightError { proof_core_chain_locked_height : ffi_ref . proof_core_chain_locked_height , transaction_height : ferment :: from_opt_primitive (ffi_ref . transaction_height) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_transaction_height_error :: InvalidAssetLockProofTransactionHeightError > for dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_transaction_height_error :: InvalidAssetLockProofTransactionHeightError) -> * const dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError { proof_core_chain_locked_height : obj . proof_core_chain_locked_height , transaction_height : ferment :: to_opt_primitive (obj . transaction_height) }) } } impl Drop for dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: destroy_opt_primitive (ffi_ref . transaction_height) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError_ctor < > (proof_core_chain_locked_height : u32 , transaction_height : * mut u32) -> * mut dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError { proof_core_chain_locked_height , transaction_height }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError_get_proof_core_chain_locked_height < > (obj : * const dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError) -> u32 { (* obj) . proof_core_chain_locked_height } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError_get_transaction_height < > (obj : * const dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError) -> * mut u32 { (* obj) . transaction_height } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError_set_proof_core_chain_locked_height < > (obj : * const dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError) -> u32 { (* obj) . proof_core_chain_locked_height } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError_set_transaction_height < > (obj : * const dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError) -> * mut u32 { (* obj) . transaction_height } } pub mod identity_credit_transfer_to_self_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityCreditTransferToSelfError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_identity_credit_transfer_to_self_error_IdentityCreditTransferToSelfError { } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: identity_credit_transfer_to_self_error :: IdentityCreditTransferToSelfError > for dpp_errors_consensus_basic_identity_identity_credit_transfer_to_self_error_IdentityCreditTransferToSelfError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_identity_credit_transfer_to_self_error_IdentityCreditTransferToSelfError) -> dpp :: errors :: consensus :: basic :: identity :: identity_credit_transfer_to_self_error :: IdentityCreditTransferToSelfError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: identity_credit_transfer_to_self_error :: IdentityCreditTransferToSelfError { } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: identity_credit_transfer_to_self_error :: IdentityCreditTransferToSelfError > for dpp_errors_consensus_basic_identity_identity_credit_transfer_to_self_error_IdentityCreditTransferToSelfError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: identity_credit_transfer_to_self_error :: IdentityCreditTransferToSelfError) -> * const dpp_errors_consensus_basic_identity_identity_credit_transfer_to_self_error_IdentityCreditTransferToSelfError { ferment :: boxed (dpp_errors_consensus_basic_identity_identity_credit_transfer_to_self_error_IdentityCreditTransferToSelfError { }) } } impl Drop for dpp_errors_consensus_basic_identity_identity_credit_transfer_to_self_error_IdentityCreditTransferToSelfError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_credit_transfer_to_self_error_IdentityCreditTransferToSelfError_ctor < > () -> * mut dpp_errors_consensus_basic_identity_identity_credit_transfer_to_self_error_IdentityCreditTransferToSelfError { ferment :: boxed (dpp_errors_consensus_basic_identity_identity_credit_transfer_to_self_error_IdentityCreditTransferToSelfError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_credit_transfer_to_self_error_IdentityCreditTransferToSelfError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_identity_credit_transfer_to_self_error_IdentityCreditTransferToSelfError) { ferment :: unbox_any (ffi) ; } } pub mod invalid_identity_credit_transfer_amount_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIdentityCreditTransferAmountError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError { pub amount : u64 , pub min_amount : u64 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_transfer_amount_error :: InvalidIdentityCreditTransferAmountError > for dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError) -> dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_transfer_amount_error :: InvalidIdentityCreditTransferAmountError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_transfer_amount_error :: InvalidIdentityCreditTransferAmountError { amount : ffi_ref . amount , min_amount : ffi_ref . min_amount } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_transfer_amount_error :: InvalidIdentityCreditTransferAmountError > for dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_transfer_amount_error :: InvalidIdentityCreditTransferAmountError) -> * const dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError { amount : obj . amount , min_amount : obj . min_amount }) } } impl Drop for dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError_ctor < > (amount : u64 , min_amount : u64) -> * mut dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError { amount , min_amount }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError_get_amount < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError) -> u64 { (* obj) . amount } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError_get_min_amount < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError) -> u64 { (* obj) . min_amount } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError_set_amount < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError) -> u64 { (* obj) . amount } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError_set_min_amount < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError) -> u64 { (* obj) . min_amount } } pub mod not_implemented_identity_credit_withdrawal_transition_pooling_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`NotImplementedIdentityCreditWithdrawalTransitionPoolingError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError { pub pooling : u8 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: not_implemented_identity_credit_withdrawal_transition_pooling_error :: NotImplementedIdentityCreditWithdrawalTransitionPoolingError > for dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError) -> dpp :: errors :: consensus :: basic :: identity :: not_implemented_identity_credit_withdrawal_transition_pooling_error :: NotImplementedIdentityCreditWithdrawalTransitionPoolingError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: not_implemented_identity_credit_withdrawal_transition_pooling_error :: NotImplementedIdentityCreditWithdrawalTransitionPoolingError { pooling : ffi_ref . pooling } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: not_implemented_identity_credit_withdrawal_transition_pooling_error :: NotImplementedIdentityCreditWithdrawalTransitionPoolingError > for dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: not_implemented_identity_credit_withdrawal_transition_pooling_error :: NotImplementedIdentityCreditWithdrawalTransitionPoolingError) -> * const dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError { ferment :: boxed (dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError { pooling : obj . pooling }) } } impl Drop for dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError_ctor < > (pooling : u8) -> * mut dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError { ferment :: boxed (dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError { pooling }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError_get_pooling < > (obj : * const dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError) -> u8 { (* obj) . pooling } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError_set_pooling < > (obj : * const dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError) -> u8 { (* obj) . pooling } } pub mod invalid_identity_public_key_data_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIdentityPublicKeyDataError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError { pub public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , pub validation_error : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_data_error :: InvalidIdentityPublicKeyDataError > for dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError) -> dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_data_error :: InvalidIdentityPublicKeyDataError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_data_error :: InvalidIdentityPublicKeyDataError { public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . public_key_id) , validation_error : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . validation_error) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_data_error :: InvalidIdentityPublicKeyDataError > for dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_data_error :: InvalidIdentityPublicKeyDataError) -> * const dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError { public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . public_key_id) , validation_error : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . validation_error) }) } } impl Drop for dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . public_key_id) ; ferment :: unbox_string (ffi_ref . validation_error) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError_ctor < > (public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , validation_error : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError { public_key_id , validation_error }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError_get_public_key_id < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError_get_validation_error < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError) -> * mut std :: os :: raw :: c_char { (* obj) . validation_error } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError_set_public_key_id < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError_set_validation_error < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError) -> * mut std :: os :: raw :: c_char { (* obj) . validation_error } } pub mod identity_asset_lock_proof_locked_transaction_mismatch_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityAssetLockProofLockedTransactionMismatchError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError { pub instant_lock_transaction_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , pub asset_lock_transaction_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_proof_locked_transaction_mismatch_error :: IdentityAssetLockProofLockedTransactionMismatchError > for dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError) -> dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_proof_locked_transaction_mismatch_error :: IdentityAssetLockProofLockedTransactionMismatchError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_proof_locked_transaction_mismatch_error :: IdentityAssetLockProofLockedTransactionMismatchError { instant_lock_transaction_id : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionFrom < dashcore :: hash_types :: Txid >> :: ffi_from (ffi_ref . instant_lock_transaction_id) , asset_lock_transaction_id : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionFrom < dashcore :: hash_types :: Txid >> :: ffi_from (ffi_ref . asset_lock_transaction_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_proof_locked_transaction_mismatch_error :: IdentityAssetLockProofLockedTransactionMismatchError > for dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_proof_locked_transaction_mismatch_error :: IdentityAssetLockProofLockedTransactionMismatchError) -> * const dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError { ferment :: boxed (dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError { instant_lock_transaction_id : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionTo < dashcore :: hash_types :: Txid >> :: ffi_to (obj . instant_lock_transaction_id) , asset_lock_transaction_id : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionTo < dashcore :: hash_types :: Txid >> :: ffi_to (obj . asset_lock_transaction_id) }) } } impl Drop for dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . instant_lock_transaction_id) ; ferment :: unbox_any (ffi_ref . asset_lock_transaction_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError_ctor < > (instant_lock_transaction_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , asset_lock_transaction_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid) -> * mut dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError { ferment :: boxed (dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError { instant_lock_transaction_id , asset_lock_transaction_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError_get_instant_lock_transaction_id < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . instant_lock_transaction_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError_get_asset_lock_transaction_id < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . asset_lock_transaction_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError_set_instant_lock_transaction_id < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . instant_lock_transaction_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError_set_asset_lock_transaction_id < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . asset_lock_transaction_id } } pub mod identity_asset_lock_transaction_output_not_found_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityAssetLockTransactionOutputNotFoundError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError { pub output_index : usize } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_output_not_found_error :: IdentityAssetLockTransactionOutputNotFoundError > for dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError) -> dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_output_not_found_error :: IdentityAssetLockTransactionOutputNotFoundError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_output_not_found_error :: IdentityAssetLockTransactionOutputNotFoundError { output_index : ffi_ref . output_index } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_output_not_found_error :: IdentityAssetLockTransactionOutputNotFoundError > for dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_output_not_found_error :: IdentityAssetLockTransactionOutputNotFoundError) -> * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError { ferment :: boxed (dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError { output_index : obj . output_index }) } } impl Drop for dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError_ctor < > (output_index : usize) -> * mut dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError { ferment :: boxed (dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError { output_index }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError_get_output_index < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError) -> usize { (* obj) . output_index } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError_set_output_index < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError) -> usize { (* obj) . output_index } } pub mod withdrawal_output_script_not_allowed_when_signing_with_owner_key { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError { pub output_script : * mut crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript , pub key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: withdrawal_output_script_not_allowed_when_signing_with_owner_key :: WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError > for dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError) -> dpp :: errors :: consensus :: basic :: identity :: withdrawal_output_script_not_allowed_when_signing_with_owner_key :: WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: withdrawal_output_script_not_allowed_when_signing_with_owner_key :: WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError { output_script : < crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript as ferment :: FFIConversionFrom < dpp :: identity :: core_script :: CoreScript >> :: ffi_from (ffi_ref . output_script) , key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . key_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: withdrawal_output_script_not_allowed_when_signing_with_owner_key :: WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError > for dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: withdrawal_output_script_not_allowed_when_signing_with_owner_key :: WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError) -> * const dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError { ferment :: boxed (dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError { output_script : < crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript as ferment :: FFIConversionTo < dpp :: identity :: core_script :: CoreScript >> :: ffi_to (obj . output_script) , key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . key_id) }) } } impl Drop for dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . output_script) ; ferment :: unbox_any (ffi_ref . key_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError_ctor < > (output_script : * mut crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript , key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID) -> * mut dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError { ferment :: boxed (dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError { output_script , key_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError_get_output_script < > (obj : * const dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError) -> * mut crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript { (* obj) . output_script } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError_get_key_id < > (obj : * const dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . key_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError_set_output_script < > (obj : * const dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError) -> * mut crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript { (* obj) . output_script } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError_set_key_id < > (obj : * const dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . key_id } } pub mod invalid_identity_public_key_security_level_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIdentityPublicKeySecurityLevelError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError { pub public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , pub purpose : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose , pub security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel , pub allowed_security_levels : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_security_level_error :: InvalidIdentityPublicKeySecurityLevelError > for dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError) -> dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_security_level_error :: InvalidIdentityPublicKeySecurityLevelError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_security_level_error :: InvalidIdentityPublicKeySecurityLevelError { public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . public_key_id) , purpose : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: purpose :: Purpose >> :: ffi_from (ffi_ref . purpose) , security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_from (ffi_ref . security_level) , allowed_security_levels : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . allowed_security_levels) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_security_level_error :: InvalidIdentityPublicKeySecurityLevelError > for dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_security_level_error :: InvalidIdentityPublicKeySecurityLevelError) -> * const dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError { public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . public_key_id) , purpose : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: purpose :: Purpose >> :: ffi_to (obj . purpose) , security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_to (obj . security_level) , allowed_security_levels : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . allowed_security_levels) }) } } impl Drop for dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . public_key_id) ; ferment :: unbox_any (ffi_ref . purpose) ; ferment :: unbox_any (ffi_ref . security_level) ; ferment :: unbox_string (ffi_ref . allowed_security_levels) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError_ctor < > (public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , purpose : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose , security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel , allowed_security_levels : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError { public_key_id , purpose , security_level , allowed_security_levels }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError_get_public_key_id < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError_get_purpose < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose { (* obj) . purpose } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError_get_security_level < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . security_level } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError_get_allowed_security_levels < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError) -> * mut std :: os :: raw :: c_char { (* obj) . allowed_security_levels } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError_set_public_key_id < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError_set_purpose < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose { (* obj) . purpose } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError_set_security_level < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . security_level } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError_set_allowed_security_levels < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError) -> * mut std :: os :: raw :: c_char { (* obj) . allowed_security_levels } } pub mod duplicated_identity_public_key_basic_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DuplicatedIdentityPublicKeyBasicError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError { pub duplicated_ids : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_basic_error :: DuplicatedIdentityPublicKeyBasicError > for dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError) -> dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_basic_error :: DuplicatedIdentityPublicKeyBasicError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_basic_error :: DuplicatedIdentityPublicKeyBasicError { duplicated_ids : < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < Vec < dpp :: identity :: identity_public_key :: KeyID > >> :: ffi_from (ffi_ref . duplicated_ids) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_basic_error :: DuplicatedIdentityPublicKeyBasicError > for dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_basic_error :: DuplicatedIdentityPublicKeyBasicError) -> * const dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError { ferment :: boxed (dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError { duplicated_ids : < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < Vec < dpp :: identity :: identity_public_key :: KeyID > >> :: ffi_to (obj . duplicated_ids) }) } } impl Drop for dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . duplicated_ids) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError_ctor < > (duplicated_ids : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID) -> * mut dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError { ferment :: boxed (dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError { duplicated_ids }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError_get_duplicated_ids < > (obj : * const dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError) -> * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID { (* obj) . duplicated_ids } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError_set_duplicated_ids < > (obj : * const dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError) -> * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID { (* obj) . duplicated_ids } } pub mod invalid_identity_credit_withdrawal_transition_output_script_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIdentityCreditWithdrawalTransitionOutputScriptError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError { pub output_script : * mut crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_output_script_error :: InvalidIdentityCreditWithdrawalTransitionOutputScriptError > for dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError) -> dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_output_script_error :: InvalidIdentityCreditWithdrawalTransitionOutputScriptError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_output_script_error :: InvalidIdentityCreditWithdrawalTransitionOutputScriptError { output_script : < crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript as ferment :: FFIConversionFrom < dpp :: identity :: core_script :: CoreScript >> :: ffi_from (ffi_ref . output_script) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_output_script_error :: InvalidIdentityCreditWithdrawalTransitionOutputScriptError > for dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_output_script_error :: InvalidIdentityCreditWithdrawalTransitionOutputScriptError) -> * const dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError { output_script : < crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript as ferment :: FFIConversionTo < dpp :: identity :: core_script :: CoreScript >> :: ffi_to (obj . output_script) }) } } impl Drop for dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . output_script) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError_ctor < > (output_script : * mut crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript) -> * mut dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError { output_script }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError_get_output_script < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError) -> * mut crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript { (* obj) . output_script } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError_set_output_script < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError) -> * mut crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript { (* obj) . output_script } } pub mod invalid_identity_asset_lock_transaction_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIdentityAssetLockTransactionError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError { pub message : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_error :: InvalidIdentityAssetLockTransactionError > for dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError) -> dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_error :: InvalidIdentityAssetLockTransactionError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_error :: InvalidIdentityAssetLockTransactionError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . message) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_error :: InvalidIdentityAssetLockTransactionError > for dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_error :: InvalidIdentityAssetLockTransactionError) -> * const dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . message) }) } } impl Drop for dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . message) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError_ctor < > (message : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError { message }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError_get_message < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError) -> * mut std :: os :: raw :: c_char { (* obj) . message } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError_set_message < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError) -> * mut std :: os :: raw :: c_char { (* obj) . message } } pub mod identity_asset_lock_state_transition_replay_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityAssetLockStateTransitionReplayError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError { pub transaction_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , pub output_index : usize , pub state_transition_id : * mut crate :: fermented :: types :: platform_value :: types :: bytes_32 :: platform_value_types_bytes_32_Bytes32 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_state_transition_replay_error :: IdentityAssetLockStateTransitionReplayError > for dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError) -> dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_state_transition_replay_error :: IdentityAssetLockStateTransitionReplayError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_state_transition_replay_error :: IdentityAssetLockStateTransitionReplayError { transaction_id : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionFrom < dashcore :: hash_types :: Txid >> :: ffi_from (ffi_ref . transaction_id) , output_index : ffi_ref . output_index , state_transition_id : < crate :: fermented :: types :: platform_value :: types :: bytes_32 :: platform_value_types_bytes_32_Bytes32 as ferment :: FFIConversionFrom < platform_value :: types :: bytes_32 :: Bytes32 >> :: ffi_from (ffi_ref . state_transition_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_state_transition_replay_error :: IdentityAssetLockStateTransitionReplayError > for dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_state_transition_replay_error :: IdentityAssetLockStateTransitionReplayError) -> * const dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError { ferment :: boxed (dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError { transaction_id : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionTo < dashcore :: hash_types :: Txid >> :: ffi_to (obj . transaction_id) , output_index : obj . output_index , state_transition_id : < crate :: fermented :: types :: platform_value :: types :: bytes_32 :: platform_value_types_bytes_32_Bytes32 as ferment :: FFIConversionTo < platform_value :: types :: bytes_32 :: Bytes32 >> :: ffi_to (obj . state_transition_id) }) } } impl Drop for dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . transaction_id) ; ; ferment :: unbox_any (ffi_ref . state_transition_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError_ctor < > (transaction_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , output_index : usize , state_transition_id : * mut crate :: fermented :: types :: platform_value :: types :: bytes_32 :: platform_value_types_bytes_32_Bytes32) -> * mut dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError { ferment :: boxed (dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError { transaction_id , output_index , state_transition_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError_get_transaction_id < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . transaction_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError_get_output_index < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError) -> usize { (* obj) . output_index } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError_get_state_transition_id < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError) -> * mut crate :: fermented :: types :: platform_value :: types :: bytes_32 :: platform_value_types_bytes_32_Bytes32 { (* obj) . state_transition_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError_set_transaction_id < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . transaction_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError_set_output_index < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError) -> usize { (* obj) . output_index } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError_set_state_transition_id < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError) -> * mut crate :: fermented :: types :: platform_value :: types :: bytes_32 :: platform_value_types_bytes_32_Bytes32 { (* obj) . state_transition_id } } pub mod invalid_identity_update_transition_empty_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIdentityUpdateTransitionEmptyError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_invalid_identity_update_transition_empty_error_InvalidIdentityUpdateTransitionEmptyError { } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_empty_error :: InvalidIdentityUpdateTransitionEmptyError > for dpp_errors_consensus_basic_identity_invalid_identity_update_transition_empty_error_InvalidIdentityUpdateTransitionEmptyError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_invalid_identity_update_transition_empty_error_InvalidIdentityUpdateTransitionEmptyError) -> dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_empty_error :: InvalidIdentityUpdateTransitionEmptyError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_empty_error :: InvalidIdentityUpdateTransitionEmptyError { } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_empty_error :: InvalidIdentityUpdateTransitionEmptyError > for dpp_errors_consensus_basic_identity_invalid_identity_update_transition_empty_error_InvalidIdentityUpdateTransitionEmptyError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_empty_error :: InvalidIdentityUpdateTransitionEmptyError) -> * const dpp_errors_consensus_basic_identity_invalid_identity_update_transition_empty_error_InvalidIdentityUpdateTransitionEmptyError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_update_transition_empty_error_InvalidIdentityUpdateTransitionEmptyError { }) } } impl Drop for dpp_errors_consensus_basic_identity_invalid_identity_update_transition_empty_error_InvalidIdentityUpdateTransitionEmptyError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_update_transition_empty_error_InvalidIdentityUpdateTransitionEmptyError_ctor < > () -> * mut dpp_errors_consensus_basic_identity_invalid_identity_update_transition_empty_error_InvalidIdentityUpdateTransitionEmptyError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_update_transition_empty_error_InvalidIdentityUpdateTransitionEmptyError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_update_transition_empty_error_InvalidIdentityUpdateTransitionEmptyError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_invalid_identity_update_transition_empty_error_InvalidIdentityUpdateTransitionEmptyError) { ferment :: unbox_any (ffi) ; } } pub mod disabling_key_id_also_being_added_in_same_transition_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DisablingKeyIdAlsoBeingAddedInSameTransitionError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError { pub key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: disabling_key_id_also_being_added_in_same_transition_error :: DisablingKeyIdAlsoBeingAddedInSameTransitionError > for dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError) -> dpp :: errors :: consensus :: basic :: identity :: disabling_key_id_also_being_added_in_same_transition_error :: DisablingKeyIdAlsoBeingAddedInSameTransitionError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: disabling_key_id_also_being_added_in_same_transition_error :: DisablingKeyIdAlsoBeingAddedInSameTransitionError { key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . key_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: disabling_key_id_also_being_added_in_same_transition_error :: DisablingKeyIdAlsoBeingAddedInSameTransitionError > for dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: disabling_key_id_also_being_added_in_same_transition_error :: DisablingKeyIdAlsoBeingAddedInSameTransitionError) -> * const dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError { ferment :: boxed (dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError { key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . key_id) }) } } impl Drop for dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . key_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError_ctor < > (key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID) -> * mut dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError { ferment :: boxed (dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError { key_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError_get_key_id < > (obj : * const dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . key_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError_set_key_id < > (obj : * const dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . key_id } } pub mod invalid_identity_credit_withdrawal_transition_amount_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIdentityCreditWithdrawalTransitionAmountError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError { pub amount : u64 , pub min_amount : u64 , pub max_amount : u64 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_amount_error :: InvalidIdentityCreditWithdrawalTransitionAmountError > for dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError) -> dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_amount_error :: InvalidIdentityCreditWithdrawalTransitionAmountError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_amount_error :: InvalidIdentityCreditWithdrawalTransitionAmountError { amount : ffi_ref . amount , min_amount : ffi_ref . min_amount , max_amount : ffi_ref . max_amount } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_amount_error :: InvalidIdentityCreditWithdrawalTransitionAmountError > for dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_amount_error :: InvalidIdentityCreditWithdrawalTransitionAmountError) -> * const dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError { amount : obj . amount , min_amount : obj . min_amount , max_amount : obj . max_amount }) } } impl Drop for dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError_ctor < > (amount : u64 , min_amount : u64 , max_amount : u64) -> * mut dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError { amount , min_amount , max_amount }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError_get_amount < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError) -> u64 { (* obj) . amount } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError_get_min_amount < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError) -> u64 { (* obj) . min_amount } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError_get_max_amount < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError) -> u64 { (* obj) . max_amount } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError_set_amount < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError) -> u64 { (* obj) . amount } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError_set_min_amount < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError) -> u64 { (* obj) . min_amount } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError_set_max_amount < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError) -> u64 { (* obj) . max_amount } } pub mod identity_asset_lock_transaction_is_not_found_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityAssetLockTransactionIsNotFoundError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError { pub transaction_id : * mut crate :: fermented :: generics :: Arr_u8_32 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_is_not_found_error :: IdentityAssetLockTransactionIsNotFoundError > for dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError) -> dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_is_not_found_error :: IdentityAssetLockTransactionIsNotFoundError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_is_not_found_error :: IdentityAssetLockTransactionIsNotFoundError { transaction_id : < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (ffi_ref . transaction_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_is_not_found_error :: IdentityAssetLockTransactionIsNotFoundError > for dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_is_not_found_error :: IdentityAssetLockTransactionIsNotFoundError) -> * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError { ferment :: boxed (dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError { transaction_id : < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj . transaction_id) }) } } impl Drop for dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . transaction_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError_ctor < > (transaction_id : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError { ferment :: boxed (dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError { transaction_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError_get_transaction_id < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . transaction_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError_set_transaction_id < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . transaction_id } } pub mod identity_asset_lock_transaction_out_point_already_consumed_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityAssetLockTransactionOutPointAlreadyConsumedError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError { pub transaction_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , pub output_index : usize } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_already_consumed_error :: IdentityAssetLockTransactionOutPointAlreadyConsumedError > for dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError) -> dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_already_consumed_error :: IdentityAssetLockTransactionOutPointAlreadyConsumedError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_already_consumed_error :: IdentityAssetLockTransactionOutPointAlreadyConsumedError { transaction_id : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionFrom < dashcore :: hash_types :: Txid >> :: ffi_from (ffi_ref . transaction_id) , output_index : ffi_ref . output_index } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_already_consumed_error :: IdentityAssetLockTransactionOutPointAlreadyConsumedError > for dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_already_consumed_error :: IdentityAssetLockTransactionOutPointAlreadyConsumedError) -> * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError { ferment :: boxed (dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError { transaction_id : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionTo < dashcore :: hash_types :: Txid >> :: ffi_to (obj . transaction_id) , output_index : obj . output_index }) } } impl Drop for dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . transaction_id) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError_ctor < > (transaction_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , output_index : usize) -> * mut dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError { ferment :: boxed (dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError { transaction_id , output_index }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError_get_transaction_id < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . transaction_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError_get_output_index < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError) -> usize { (* obj) . output_index } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError_set_transaction_id < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . transaction_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError_set_output_index < > (obj : * const dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError) -> usize { (* obj) . output_index } } pub mod invalid_identity_asset_lock_proof_chain_lock_validation_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIdentityAssetLockProofChainLockValidationError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError { pub transaction_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , pub height_reported_not_locked : u32 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_proof_chain_lock_validation_error :: InvalidIdentityAssetLockProofChainLockValidationError > for dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError) -> dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_proof_chain_lock_validation_error :: InvalidIdentityAssetLockProofChainLockValidationError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_proof_chain_lock_validation_error :: InvalidIdentityAssetLockProofChainLockValidationError { transaction_id : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionFrom < dashcore :: hash_types :: Txid >> :: ffi_from (ffi_ref . transaction_id) , height_reported_not_locked : ffi_ref . height_reported_not_locked } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_proof_chain_lock_validation_error :: InvalidIdentityAssetLockProofChainLockValidationError > for dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_proof_chain_lock_validation_error :: InvalidIdentityAssetLockProofChainLockValidationError) -> * const dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError { transaction_id : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionTo < dashcore :: hash_types :: Txid >> :: ffi_to (obj . transaction_id) , height_reported_not_locked : obj . height_reported_not_locked }) } } impl Drop for dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . transaction_id) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError_ctor < > (transaction_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid , height_reported_not_locked : u32) -> * mut dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError { transaction_id , height_reported_not_locked }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError_get_transaction_id < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . transaction_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError_get_height_reported_not_locked < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError) -> u32 { (* obj) . height_reported_not_locked } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError_set_transaction_id < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . transaction_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError_set_height_reported_not_locked < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError) -> u32 { (* obj) . height_reported_not_locked } } pub mod invalid_identity_asset_lock_transaction_output_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIdentityAssetLockTransactionOutputError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError { pub output_index : usize } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_output_error :: InvalidIdentityAssetLockTransactionOutputError > for dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError) -> dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_output_error :: InvalidIdentityAssetLockTransactionOutputError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_output_error :: InvalidIdentityAssetLockTransactionOutputError { output_index : ffi_ref . output_index } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_output_error :: InvalidIdentityAssetLockTransactionOutputError > for dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_output_error :: InvalidIdentityAssetLockTransactionOutputError) -> * const dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError { output_index : obj . output_index }) } } impl Drop for dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError_ctor < > (output_index : usize) -> * mut dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError { output_index }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError_get_output_index < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError) -> usize { (* obj) . output_index } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError_set_output_index < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError) -> usize { (* obj) . output_index } } pub mod invalid_identity_key_signature_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIdentityKeySignatureError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError { pub public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_key_signature_error :: InvalidIdentityKeySignatureError > for dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError) -> dpp :: errors :: consensus :: basic :: identity :: invalid_identity_key_signature_error :: InvalidIdentityKeySignatureError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: invalid_identity_key_signature_error :: InvalidIdentityKeySignatureError { public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . public_key_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_key_signature_error :: InvalidIdentityKeySignatureError > for dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: invalid_identity_key_signature_error :: InvalidIdentityKeySignatureError) -> * const dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError { public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . public_key_id) }) } } impl Drop for dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . public_key_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError_ctor < > (public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID) -> * mut dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError { public_key_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError_get_public_key_id < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError_set_public_key_id < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . public_key_id } } pub mod invalid_identity_credit_withdrawal_transition_core_fee_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIdentityCreditWithdrawalTransitionCoreFeeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError { pub core_fee_per_byte : u32 , pub min_core_fee_per_byte : u32 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_core_fee_error :: InvalidIdentityCreditWithdrawalTransitionCoreFeeError > for dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError) -> dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_core_fee_error :: InvalidIdentityCreditWithdrawalTransitionCoreFeeError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_core_fee_error :: InvalidIdentityCreditWithdrawalTransitionCoreFeeError { core_fee_per_byte : ffi_ref . core_fee_per_byte , min_core_fee_per_byte : ffi_ref . min_core_fee_per_byte } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_core_fee_error :: InvalidIdentityCreditWithdrawalTransitionCoreFeeError > for dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_core_fee_error :: InvalidIdentityCreditWithdrawalTransitionCoreFeeError) -> * const dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError { core_fee_per_byte : obj . core_fee_per_byte , min_core_fee_per_byte : obj . min_core_fee_per_byte }) } } impl Drop for dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError_ctor < > (core_fee_per_byte : u32 , min_core_fee_per_byte : u32) -> * mut dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError { ferment :: boxed (dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError { core_fee_per_byte , min_core_fee_per_byte }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError_destroy < > (ffi : * mut dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError_get_core_fee_per_byte < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError) -> u32 { (* obj) . core_fee_per_byte } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError_get_min_core_fee_per_byte < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError) -> u32 { (* obj) . min_core_fee_per_byte } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError_set_core_fee_per_byte < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError) -> u32 { (* obj) . core_fee_per_byte } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError_set_min_core_fee_per_byte < > (obj : * const dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError) -> u32 { (* obj) . min_core_fee_per_byte } } } pub mod basic_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`BasicError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_errors_consensus_basic_basic_error_BasicError { ProtocolVersionParsingError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: protocol_version_parsing_error :: dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError) , VersionError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: version_error :: dpp_errors_consensus_basic_decode_version_error_VersionError) , ContractError (* mut crate :: fermented :: types :: dpp :: data_contract :: errors :: contract :: dpp_data_contract_errors_contract_DataContractError) , UnknownSecurityLevelError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_security_level_error :: dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError) , UnknownStorageKeyRequirementsError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_storage_key_requirements_error :: dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError) , UnknownTransferableTypeError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_transferable_type_error :: dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError) , UnknownTradeModeError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_trade_mode_error :: dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError) , UnknownDocumentCreationRestrictionModeError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_document_creation_restriction_mode_error :: dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError) , SerializedObjectParsingError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: serialized_object_parsing_error :: dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError) , UnsupportedProtocolVersionError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: unsupported_protocol_version_error :: dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError) , UnsupportedVersionError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: unsupported_version_error :: dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError) , IncompatibleProtocolVersionError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: incompatible_protocol_version_error :: dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError) , # [cfg (feature = "json-schema-validation")] JsonSchemaCompilationError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: json_schema_compilation_error :: dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError) , # [cfg (feature = "json-schema-validation")] JsonSchemaError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: json_schema_error :: json_schema_error :: dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError) , InvalidIdentifierError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: invalid_identifier_error :: dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError) , ValueError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: value_error :: dpp_errors_consensus_basic_value_error_ValueError) , DataContractMaxDepthExceedError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_max_depth_exceed_error :: dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError) , DuplicateIndexError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_error :: dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError) , IncompatibleRe2PatternError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: incompatible_re2_pattern_error :: dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError) , InvalidCompoundIndexError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_compound_index_error :: dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError) , InvalidDataContractIdError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_id_error :: dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError) , InvalidIndexedPropertyConstraintError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_indexed_property_constraint_error :: dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError) , InvalidIndexPropertyTypeError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_index_property_type_error :: dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError) , # [cfg (feature = "json-schema-validation")] InvalidJsonSchemaRefError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_json_schema_ref_error :: dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError) , SystemPropertyIndexAlreadyPresentError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: system_property_index_already_present_error :: dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError) , UndefinedIndexPropertyError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: undefined_index_property_error :: dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError) , UniqueIndicesLimitReachedError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unique_indices_limit_reached_error :: dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError) , DuplicateIndexNameError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_name_error :: dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError) , InvalidDataContractVersionError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_version_error :: dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError) , IncompatibleDataContractSchemaError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: incompatible_data_contract_schema_error :: dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError) , DataContractImmutablePropertiesUpdateError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_immutable_properties_update_error :: dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError) , DataContractUniqueIndicesChangedError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_unique_indices_changed_error :: dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError) , DataContractInvalidIndexDefinitionUpdateError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_invalid_index_definition_update_error :: dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError) , DataContractHaveNewUniqueIndexError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_have_new_unique_index_error :: dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError) , DataContractNotPresentError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: data_contract_not_present_error :: dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError) , DocumentCreationNotAllowedError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: document_creation_not_allowed_error :: dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError) , DataContractBoundsNotPresentError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: data_contract_bounds_not_present_error :: dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError) , DuplicateDocumentTransitionsWithIdsError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_ids_error :: dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError) , DuplicateDocumentTransitionsWithIndicesError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_indices_error :: dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError) , NonceOutOfBoundsError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: identity_contract_nonce_out_of_bounds_error :: dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError) , InconsistentCompoundIndexDataError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: inconsistent_compound_index_data_error :: dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError) , InvalidDocumentTransitionActionError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_action_error :: dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError) , InvalidDocumentTransitionIdError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_id_error :: dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError) , InvalidDocumentTypeError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: invalid_document_type_error :: dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError) , MissingPositionsInDocumentTypePropertiesError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_positions_in_document_type_properties_error :: dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError) , MissingDataContractIdBasicError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_data_contract_id_basic_error :: dpp_errors_consensus_basic_document_missing_data_contract_id_basic_error_MissingDataContractIdBasicError) , MissingDocumentTransitionActionError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_document_transition_action_error :: dpp_errors_consensus_basic_document_missing_document_transition_action_error_MissingDocumentTransitionActionError) , MissingDocumentTransitionTypeError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_document_transition_type_error :: dpp_errors_consensus_basic_document_missing_document_transition_type_error_MissingDocumentTransitionTypeError) , MissingDocumentTypeError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_document_type_error :: dpp_errors_consensus_basic_document_missing_document_type_error_MissingDocumentTypeError) , MaxDocumentsTransitionsExceededError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: max_documents_transitions_exceeded_error :: dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError) , DuplicatedIdentityPublicKeyBasicError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_basic_error :: dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError) , DuplicatedIdentityPublicKeyIdBasicError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_id_basic_error :: dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError) , DisablingKeyIdAlsoBeingAddedInSameTransitionError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: disabling_key_id_also_being_added_in_same_transition_error :: dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError) , IdentityAssetLockProofLockedTransactionMismatchError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_proof_locked_transaction_mismatch_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError) , IdentityAssetLockTransactionIsNotFoundError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_is_not_found_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError) , IdentityAssetLockTransactionOutPointAlreadyConsumedError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_already_consumed_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError) , IdentityAssetLockTransactionOutPointNotEnoughBalanceError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_not_enough_balance_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError) , IdentityAssetLockStateTransitionReplayError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_state_transition_replay_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError) , IdentityAssetLockTransactionOutputNotFoundError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_output_not_found_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError) , InvalidAssetLockProofCoreChainHeightError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_core_chain_height_error :: dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError) , InvalidIdentityAssetLockProofChainLockValidationError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_proof_chain_lock_validation_error :: dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError) , InvalidAssetLockProofTransactionHeightError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_transaction_height_error :: dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError) , InvalidAssetLockTransactionOutputReturnSizeError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_transaction_output_return_size :: dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError) , InvalidIdentityAssetLockTransactionError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_error :: dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError) , InvalidIdentityAssetLockTransactionOutputError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_output_error :: dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError) , InvalidIdentityPublicKeyDataError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_data_error :: dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError) , InvalidInstantAssetLockProofError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_error :: dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError) , InvalidInstantAssetLockProofSignatureError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_signature_error :: dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_signature_error_InvalidInstantAssetLockProofSignatureError) , MissingMasterPublicKeyError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: missing_master_public_key_error :: dpp_errors_consensus_basic_identity_missing_master_public_key_error_MissingMasterPublicKeyError) , TooManyMasterPublicKeyError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: too_many_master_public_key_error :: dpp_errors_consensus_basic_identity_too_many_master_public_key_error_TooManyMasterPublicKeyError) , MasterPublicKeyUpdateError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: master_public_key_update_error :: dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError) , InvalidDocumentTypeRequiredSecurityLevelError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_required_security_level :: dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError) , InvalidIdentityPublicKeySecurityLevelError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_security_level_error :: dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError) , InvalidIdentityKeySignatureError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_key_signature_error :: dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError) , InvalidIdentityCreditTransferAmountError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_transfer_amount_error :: dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError) , InvalidIdentityCreditWithdrawalTransitionOutputScriptError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_output_script_error :: dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError) , WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: withdrawal_output_script_not_allowed_when_signing_with_owner_key :: dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError) , InvalidIdentityCreditWithdrawalTransitionCoreFeeError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_core_fee_error :: dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError) , InvalidIdentityCreditWithdrawalTransitionAmountError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_amount_error :: dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError) , InvalidIdentityUpdateTransitionEmptyError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_empty_error :: dpp_errors_consensus_basic_identity_invalid_identity_update_transition_empty_error_InvalidIdentityUpdateTransitionEmptyError) , InvalidIdentityUpdateTransitionDisableKeysError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_disable_keys_error :: dpp_errors_consensus_basic_identity_invalid_identity_update_transition_disable_keys_error_InvalidIdentityUpdateTransitionDisableKeysError) , NotImplementedIdentityCreditWithdrawalTransitionPoolingError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: not_implemented_identity_credit_withdrawal_transition_pooling_error :: dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError) , InvalidStateTransitionTypeError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: state_transition :: invalid_state_transition_type_error :: dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError) , MissingStateTransitionTypeError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: state_transition :: missing_state_transition_type_error :: dpp_errors_consensus_basic_state_transition_missing_state_transition_type_error_MissingStateTransitionTypeError) , DocumentFieldMaxSizeExceededError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: document_field_max_size_exceeded_error :: dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError) , StateTransitionMaxSizeExceededError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: state_transition :: state_transition_max_size_exceeded_error :: dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError) , DocumentTransitionsAreAbsentError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: document_transitions_are_absent_error :: dpp_errors_consensus_basic_document_document_transitions_are_absent_error_DocumentTransitionsAreAbsentError) , IdentityCreditTransferToSelfError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_credit_transfer_to_self_error :: dpp_errors_consensus_basic_identity_identity_credit_transfer_to_self_error_IdentityCreditTransferToSelfError) , InvalidDocumentTypeNameError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_name_error :: dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError) , IncompatibleDocumentTypeSchemaError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: incompatible_document_type_schema_error :: dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError) , ContestedUniqueIndexOnMutableDocumentTypeError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_on_mutable_document_type_error :: dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError) , ContestedUniqueIndexWithUniqueIndexError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_with_unique_index_error :: dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError) , OverflowError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: overflow_error :: dpp_errors_consensus_basic_overflow_error_OverflowError) , UnsupportedFeatureError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: unsupported_feature_error :: dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError) , ContestedDocumentsTemporarilyNotAllowedError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: contested_documents_temporarily_not_allowed_error :: dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError) , DataContractTokenConfigurationUpdateError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_token_configuration_update_error :: dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError) , NonContiguousContractTokenPositionsError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_token_positions_error :: dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError) , NonContiguousContractGroupPositionsError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_group_positions_error :: dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError) , InvalidTokenBaseSupplyError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_base_supply_error :: dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError) , InvalidTokenIdError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_id_error :: dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError) , InvalidTokenAmountError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_amount_error :: dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError) , InvalidTokenPositionError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_position_error :: dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError) , InvalidTokenConfigUpdateNoChangeError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_config_update_no_change_error :: dpp_errors_consensus_basic_token_invalid_token_config_update_no_change_error_InvalidTokenConfigUpdateNoChangeError) , InvalidTokenDistributionFunctionDivideByZeroError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_divide_by_zero_error :: dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError) , InvalidTokenDistributionFunctionInvalidParameterError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_error :: dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError) , InvalidTokenDistributionFunctionInvalidParameterTupleError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_tuple_error :: dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError) , InvalidTokenDistributionFunctionIncoherenceError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_incoherence_error :: dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError) , TokenTransferToOurselfError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: token_transfer_to_ourselves_error :: dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError) , InvalidTokenNoteTooBigError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_note_too_big_error :: dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError) , ContractHasNoTokensError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: contract_has_no_tokens_error :: dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError) , GroupPositionDoesNotExistError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_position_does_not_exist_error :: dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError) , InvalidActionIdError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_action_id_error :: dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError) , DestinationIdentityForTokenMintingNotSetError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: destination_identity_for_token_minting_not_set_error :: dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError) , ChoosingTokenMintRecipientNotAllowedError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: choosing_token_mint_recipient_not_allowed_error :: dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError) , GroupActionNotAllowedOnTransitionError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: group :: group_action_not_allowed_on_transition_error :: dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError) , GroupExceedsMaxMembersError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_exceeds_max_members_error :: dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError) , GroupMemberHasPowerOfZeroError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_of_zero_error :: dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError) , GroupMemberHasPowerOverLimitError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_over_limit_error :: dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError) , GroupTotalPowerLessThanRequiredError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_total_power_has_less_than_required_power_error :: dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError) , GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_non_unilateral_member_power_has_less_than_required_power_error :: dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError) , MissingDefaultLocalizationError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: missing_default_localization :: dpp_errors_consensus_basic_token_missing_default_localization_MissingDefaultLocalizationError) } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: basic_error :: BasicError > for dpp_errors_consensus_basic_basic_error_BasicError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_basic_error_BasicError) -> dpp :: errors :: consensus :: basic :: basic_error :: BasicError { let ffi_ref = & * ffi ; match ffi_ref { dpp_errors_consensus_basic_basic_error_BasicError :: ProtocolVersionParsingError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: ProtocolVersionParsingError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: protocol_version_parsing_error :: dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: decode :: protocol_version_parsing_error :: ProtocolVersionParsingError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: VersionError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: VersionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: version_error :: dpp_errors_consensus_basic_decode_version_error_VersionError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: decode :: version_error :: VersionError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: ContractError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: ContractError (< crate :: fermented :: types :: dpp :: data_contract :: errors :: contract :: dpp_data_contract_errors_contract_DataContractError as ferment :: FFIConversionFrom < dpp :: data_contract :: errors :: contract :: DataContractError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: UnknownSecurityLevelError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UnknownSecurityLevelError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_security_level_error :: dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: unknown_security_level_error :: UnknownSecurityLevelError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: UnknownStorageKeyRequirementsError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UnknownStorageKeyRequirementsError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_storage_key_requirements_error :: dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: unknown_storage_key_requirements_error :: UnknownStorageKeyRequirementsError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: UnknownTransferableTypeError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UnknownTransferableTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_transferable_type_error :: dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: unknown_transferable_type_error :: UnknownTransferableTypeError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: UnknownTradeModeError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UnknownTradeModeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_trade_mode_error :: dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: unknown_trade_mode_error :: UnknownTradeModeError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: UnknownDocumentCreationRestrictionModeError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UnknownDocumentCreationRestrictionModeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_document_creation_restriction_mode_error :: dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: unknown_document_creation_restriction_mode_error :: UnknownDocumentCreationRestrictionModeError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: SerializedObjectParsingError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: SerializedObjectParsingError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: serialized_object_parsing_error :: dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: decode :: serialized_object_parsing_error :: SerializedObjectParsingError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: UnsupportedProtocolVersionError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UnsupportedProtocolVersionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: unsupported_protocol_version_error :: dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: unsupported_protocol_version_error :: UnsupportedProtocolVersionError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: UnsupportedVersionError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UnsupportedVersionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: unsupported_version_error :: dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: unsupported_version_error :: UnsupportedVersionError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: IncompatibleProtocolVersionError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IncompatibleProtocolVersionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: incompatible_protocol_version_error :: dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: incompatible_protocol_version_error :: IncompatibleProtocolVersionError >> :: ffi_from (* o_0)) , # [cfg (feature = "json-schema-validation")] dpp_errors_consensus_basic_basic_error_BasicError :: JsonSchemaCompilationError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: JsonSchemaCompilationError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: json_schema_compilation_error :: dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: json_schema_compilation_error :: JsonSchemaCompilationError >> :: ffi_from (* o_0)) , # [cfg (feature = "json-schema-validation")] dpp_errors_consensus_basic_basic_error_BasicError :: JsonSchemaError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: JsonSchemaError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: json_schema_error :: json_schema_error :: dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: json_schema_error :: json_schema_error :: JsonSchemaError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentifierError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentifierError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: invalid_identifier_error :: dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: invalid_identifier_error :: InvalidIdentifierError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: ValueError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: ValueError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: value_error :: dpp_errors_consensus_basic_value_error_ValueError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: value_error :: ValueError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: DataContractMaxDepthExceedError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DataContractMaxDepthExceedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_max_depth_exceed_error :: dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_max_depth_exceed_error :: DataContractMaxDepthExceedError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: DuplicateIndexError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DuplicateIndexError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_error :: dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_error :: DuplicateIndexError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: IncompatibleRe2PatternError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IncompatibleRe2PatternError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: incompatible_re2_pattern_error :: dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: incompatible_re2_pattern_error :: IncompatibleRe2PatternError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidCompoundIndexError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidCompoundIndexError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_compound_index_error :: dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_compound_index_error :: InvalidCompoundIndexError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDataContractIdError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidDataContractIdError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_id_error :: dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_id_error :: InvalidDataContractIdError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIndexedPropertyConstraintError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIndexedPropertyConstraintError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_indexed_property_constraint_error :: dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_indexed_property_constraint_error :: InvalidIndexedPropertyConstraintError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIndexPropertyTypeError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIndexPropertyTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_index_property_type_error :: dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_index_property_type_error :: InvalidIndexPropertyTypeError >> :: ffi_from (* o_0)) , # [cfg (feature = "json-schema-validation")] dpp_errors_consensus_basic_basic_error_BasicError :: InvalidJsonSchemaRefError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidJsonSchemaRefError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_json_schema_ref_error :: dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_json_schema_ref_error :: InvalidJsonSchemaRefError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: SystemPropertyIndexAlreadyPresentError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: SystemPropertyIndexAlreadyPresentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: system_property_index_already_present_error :: dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: system_property_index_already_present_error :: SystemPropertyIndexAlreadyPresentError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: UndefinedIndexPropertyError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UndefinedIndexPropertyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: undefined_index_property_error :: dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: undefined_index_property_error :: UndefinedIndexPropertyError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: UniqueIndicesLimitReachedError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UniqueIndicesLimitReachedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unique_indices_limit_reached_error :: dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: unique_indices_limit_reached_error :: UniqueIndicesLimitReachedError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: DuplicateIndexNameError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DuplicateIndexNameError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_name_error :: dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_name_error :: DuplicateIndexNameError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDataContractVersionError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidDataContractVersionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_version_error :: dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_version_error :: InvalidDataContractVersionError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: IncompatibleDataContractSchemaError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IncompatibleDataContractSchemaError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: incompatible_data_contract_schema_error :: dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: incompatible_data_contract_schema_error :: IncompatibleDataContractSchemaError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: DataContractImmutablePropertiesUpdateError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DataContractImmutablePropertiesUpdateError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_immutable_properties_update_error :: dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_immutable_properties_update_error :: DataContractImmutablePropertiesUpdateError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: DataContractUniqueIndicesChangedError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DataContractUniqueIndicesChangedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_unique_indices_changed_error :: dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_unique_indices_changed_error :: DataContractUniqueIndicesChangedError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: DataContractInvalidIndexDefinitionUpdateError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DataContractInvalidIndexDefinitionUpdateError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_invalid_index_definition_update_error :: dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_invalid_index_definition_update_error :: DataContractInvalidIndexDefinitionUpdateError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: DataContractHaveNewUniqueIndexError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DataContractHaveNewUniqueIndexError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_have_new_unique_index_error :: dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_have_new_unique_index_error :: DataContractHaveNewUniqueIndexError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: DataContractNotPresentError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DataContractNotPresentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: data_contract_not_present_error :: dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: data_contract_not_present_error :: DataContractNotPresentError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: DocumentCreationNotAllowedError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DocumentCreationNotAllowedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: document_creation_not_allowed_error :: dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: document_creation_not_allowed_error :: DocumentCreationNotAllowedError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: DataContractBoundsNotPresentError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DataContractBoundsNotPresentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: data_contract_bounds_not_present_error :: dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: data_contract_bounds_not_present_error :: DataContractBoundsNotPresentError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: DuplicateDocumentTransitionsWithIdsError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DuplicateDocumentTransitionsWithIdsError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_ids_error :: dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_ids_error :: DuplicateDocumentTransitionsWithIdsError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: DuplicateDocumentTransitionsWithIndicesError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DuplicateDocumentTransitionsWithIndicesError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_indices_error :: dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_indices_error :: DuplicateDocumentTransitionsWithIndicesError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: NonceOutOfBoundsError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: NonceOutOfBoundsError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: identity_contract_nonce_out_of_bounds_error :: dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: identity_contract_nonce_out_of_bounds_error :: NonceOutOfBoundsError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InconsistentCompoundIndexDataError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InconsistentCompoundIndexDataError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: inconsistent_compound_index_data_error :: dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: inconsistent_compound_index_data_error :: InconsistentCompoundIndexDataError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTransitionActionError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidDocumentTransitionActionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_action_error :: dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_action_error :: InvalidDocumentTransitionActionError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTransitionIdError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidDocumentTransitionIdError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_id_error :: dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_id_error :: InvalidDocumentTransitionIdError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTypeError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidDocumentTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: invalid_document_type_error :: dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: invalid_document_type_error :: InvalidDocumentTypeError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: MissingPositionsInDocumentTypePropertiesError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MissingPositionsInDocumentTypePropertiesError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_positions_in_document_type_properties_error :: dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: missing_positions_in_document_type_properties_error :: MissingPositionsInDocumentTypePropertiesError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: MissingDataContractIdBasicError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MissingDataContractIdBasicError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_data_contract_id_basic_error :: dpp_errors_consensus_basic_document_missing_data_contract_id_basic_error_MissingDataContractIdBasicError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: missing_data_contract_id_basic_error :: MissingDataContractIdBasicError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: MissingDocumentTransitionActionError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MissingDocumentTransitionActionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_document_transition_action_error :: dpp_errors_consensus_basic_document_missing_document_transition_action_error_MissingDocumentTransitionActionError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: missing_document_transition_action_error :: MissingDocumentTransitionActionError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: MissingDocumentTransitionTypeError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MissingDocumentTransitionTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_document_transition_type_error :: dpp_errors_consensus_basic_document_missing_document_transition_type_error_MissingDocumentTransitionTypeError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: missing_document_transition_type_error :: MissingDocumentTransitionTypeError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: MissingDocumentTypeError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MissingDocumentTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_document_type_error :: dpp_errors_consensus_basic_document_missing_document_type_error_MissingDocumentTypeError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: missing_document_type_error :: MissingDocumentTypeError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: MaxDocumentsTransitionsExceededError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MaxDocumentsTransitionsExceededError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: max_documents_transitions_exceeded_error :: dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: max_documents_transitions_exceeded_error :: MaxDocumentsTransitionsExceededError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: DuplicatedIdentityPublicKeyBasicError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DuplicatedIdentityPublicKeyBasicError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_basic_error :: dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_basic_error :: DuplicatedIdentityPublicKeyBasicError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: DuplicatedIdentityPublicKeyIdBasicError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DuplicatedIdentityPublicKeyIdBasicError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_id_basic_error :: dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_id_basic_error :: DuplicatedIdentityPublicKeyIdBasicError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: DisablingKeyIdAlsoBeingAddedInSameTransitionError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DisablingKeyIdAlsoBeingAddedInSameTransitionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: disabling_key_id_also_being_added_in_same_transition_error :: dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: disabling_key_id_also_being_added_in_same_transition_error :: DisablingKeyIdAlsoBeingAddedInSameTransitionError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockProofLockedTransactionMismatchError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IdentityAssetLockProofLockedTransactionMismatchError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_proof_locked_transaction_mismatch_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_proof_locked_transaction_mismatch_error :: IdentityAssetLockProofLockedTransactionMismatchError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockTransactionIsNotFoundError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IdentityAssetLockTransactionIsNotFoundError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_is_not_found_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_is_not_found_error :: IdentityAssetLockTransactionIsNotFoundError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockTransactionOutPointAlreadyConsumedError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IdentityAssetLockTransactionOutPointAlreadyConsumedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_already_consumed_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_already_consumed_error :: IdentityAssetLockTransactionOutPointAlreadyConsumedError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockTransactionOutPointNotEnoughBalanceError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IdentityAssetLockTransactionOutPointNotEnoughBalanceError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_not_enough_balance_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_not_enough_balance_error :: IdentityAssetLockTransactionOutPointNotEnoughBalanceError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockStateTransitionReplayError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IdentityAssetLockStateTransitionReplayError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_state_transition_replay_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_state_transition_replay_error :: IdentityAssetLockStateTransitionReplayError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockTransactionOutputNotFoundError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IdentityAssetLockTransactionOutputNotFoundError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_output_not_found_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_output_not_found_error :: IdentityAssetLockTransactionOutputNotFoundError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidAssetLockProofCoreChainHeightError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidAssetLockProofCoreChainHeightError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_core_chain_height_error :: dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_core_chain_height_error :: InvalidAssetLockProofCoreChainHeightError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityAssetLockProofChainLockValidationError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityAssetLockProofChainLockValidationError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_proof_chain_lock_validation_error :: dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_proof_chain_lock_validation_error :: InvalidIdentityAssetLockProofChainLockValidationError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidAssetLockProofTransactionHeightError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidAssetLockProofTransactionHeightError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_transaction_height_error :: dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_transaction_height_error :: InvalidAssetLockProofTransactionHeightError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidAssetLockTransactionOutputReturnSizeError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidAssetLockTransactionOutputReturnSizeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_transaction_output_return_size :: dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_transaction_output_return_size :: InvalidAssetLockTransactionOutputReturnSizeError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityAssetLockTransactionError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityAssetLockTransactionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_error :: dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_error :: InvalidIdentityAssetLockTransactionError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityAssetLockTransactionOutputError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityAssetLockTransactionOutputError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_output_error :: dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_output_error :: InvalidIdentityAssetLockTransactionOutputError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityPublicKeyDataError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityPublicKeyDataError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_data_error :: dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_data_error :: InvalidIdentityPublicKeyDataError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidInstantAssetLockProofError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidInstantAssetLockProofError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_error :: dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_error :: InvalidInstantAssetLockProofError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidInstantAssetLockProofSignatureError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidInstantAssetLockProofSignatureError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_signature_error :: dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_signature_error_InvalidInstantAssetLockProofSignatureError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_signature_error :: InvalidInstantAssetLockProofSignatureError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: MissingMasterPublicKeyError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MissingMasterPublicKeyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: missing_master_public_key_error :: dpp_errors_consensus_basic_identity_missing_master_public_key_error_MissingMasterPublicKeyError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: missing_master_public_key_error :: MissingMasterPublicKeyError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: TooManyMasterPublicKeyError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: TooManyMasterPublicKeyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: too_many_master_public_key_error :: dpp_errors_consensus_basic_identity_too_many_master_public_key_error_TooManyMasterPublicKeyError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: too_many_master_public_key_error :: TooManyMasterPublicKeyError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: MasterPublicKeyUpdateError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MasterPublicKeyUpdateError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: master_public_key_update_error :: dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: master_public_key_update_error :: MasterPublicKeyUpdateError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTypeRequiredSecurityLevelError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidDocumentTypeRequiredSecurityLevelError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_required_security_level :: dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_required_security_level :: InvalidDocumentTypeRequiredSecurityLevelError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityPublicKeySecurityLevelError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityPublicKeySecurityLevelError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_security_level_error :: dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_security_level_error :: InvalidIdentityPublicKeySecurityLevelError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityKeySignatureError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityKeySignatureError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_key_signature_error :: dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_key_signature_error :: InvalidIdentityKeySignatureError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityCreditTransferAmountError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityCreditTransferAmountError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_transfer_amount_error :: dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_transfer_amount_error :: InvalidIdentityCreditTransferAmountError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityCreditWithdrawalTransitionOutputScriptError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityCreditWithdrawalTransitionOutputScriptError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_output_script_error :: dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_output_script_error :: InvalidIdentityCreditWithdrawalTransitionOutputScriptError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: withdrawal_output_script_not_allowed_when_signing_with_owner_key :: dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: withdrawal_output_script_not_allowed_when_signing_with_owner_key :: WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityCreditWithdrawalTransitionCoreFeeError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityCreditWithdrawalTransitionCoreFeeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_core_fee_error :: dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_core_fee_error :: InvalidIdentityCreditWithdrawalTransitionCoreFeeError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityCreditWithdrawalTransitionAmountError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityCreditWithdrawalTransitionAmountError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_amount_error :: dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_amount_error :: InvalidIdentityCreditWithdrawalTransitionAmountError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityUpdateTransitionEmptyError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityUpdateTransitionEmptyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_empty_error :: dpp_errors_consensus_basic_identity_invalid_identity_update_transition_empty_error_InvalidIdentityUpdateTransitionEmptyError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_empty_error :: InvalidIdentityUpdateTransitionEmptyError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityUpdateTransitionDisableKeysError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityUpdateTransitionDisableKeysError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_disable_keys_error :: dpp_errors_consensus_basic_identity_invalid_identity_update_transition_disable_keys_error_InvalidIdentityUpdateTransitionDisableKeysError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_disable_keys_error :: InvalidIdentityUpdateTransitionDisableKeysError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: NotImplementedIdentityCreditWithdrawalTransitionPoolingError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: NotImplementedIdentityCreditWithdrawalTransitionPoolingError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: not_implemented_identity_credit_withdrawal_transition_pooling_error :: dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: not_implemented_identity_credit_withdrawal_transition_pooling_error :: NotImplementedIdentityCreditWithdrawalTransitionPoolingError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidStateTransitionTypeError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidStateTransitionTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: state_transition :: invalid_state_transition_type_error :: dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: state_transition :: invalid_state_transition_type_error :: InvalidStateTransitionTypeError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: MissingStateTransitionTypeError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MissingStateTransitionTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: state_transition :: missing_state_transition_type_error :: dpp_errors_consensus_basic_state_transition_missing_state_transition_type_error_MissingStateTransitionTypeError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: state_transition :: missing_state_transition_type_error :: MissingStateTransitionTypeError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: DocumentFieldMaxSizeExceededError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DocumentFieldMaxSizeExceededError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: document_field_max_size_exceeded_error :: dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: document_field_max_size_exceeded_error :: DocumentFieldMaxSizeExceededError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: StateTransitionMaxSizeExceededError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: StateTransitionMaxSizeExceededError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: state_transition :: state_transition_max_size_exceeded_error :: dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: state_transition :: state_transition_max_size_exceeded_error :: StateTransitionMaxSizeExceededError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: DocumentTransitionsAreAbsentError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DocumentTransitionsAreAbsentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: document_transitions_are_absent_error :: dpp_errors_consensus_basic_document_document_transitions_are_absent_error_DocumentTransitionsAreAbsentError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: document_transitions_are_absent_error :: DocumentTransitionsAreAbsentError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: IdentityCreditTransferToSelfError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IdentityCreditTransferToSelfError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_credit_transfer_to_self_error :: dpp_errors_consensus_basic_identity_identity_credit_transfer_to_self_error_IdentityCreditTransferToSelfError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: identity :: identity_credit_transfer_to_self_error :: IdentityCreditTransferToSelfError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTypeNameError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidDocumentTypeNameError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_name_error :: dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_name_error :: InvalidDocumentTypeNameError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: IncompatibleDocumentTypeSchemaError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IncompatibleDocumentTypeSchemaError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: incompatible_document_type_schema_error :: dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: incompatible_document_type_schema_error :: IncompatibleDocumentTypeSchemaError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: ContestedUniqueIndexOnMutableDocumentTypeError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: ContestedUniqueIndexOnMutableDocumentTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_on_mutable_document_type_error :: dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_on_mutable_document_type_error :: ContestedUniqueIndexOnMutableDocumentTypeError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: ContestedUniqueIndexWithUniqueIndexError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: ContestedUniqueIndexWithUniqueIndexError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_with_unique_index_error :: dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_with_unique_index_error :: ContestedUniqueIndexWithUniqueIndexError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: OverflowError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: OverflowError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: overflow_error :: dpp_errors_consensus_basic_overflow_error_OverflowError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: overflow_error :: OverflowError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: UnsupportedFeatureError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UnsupportedFeatureError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: unsupported_feature_error :: dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: unsupported_feature_error :: UnsupportedFeatureError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: ContestedDocumentsTemporarilyNotAllowedError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: ContestedDocumentsTemporarilyNotAllowedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: contested_documents_temporarily_not_allowed_error :: dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: contested_documents_temporarily_not_allowed_error :: ContestedDocumentsTemporarilyNotAllowedError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: DataContractTokenConfigurationUpdateError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DataContractTokenConfigurationUpdateError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_token_configuration_update_error :: dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_token_configuration_update_error :: DataContractTokenConfigurationUpdateError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: NonContiguousContractTokenPositionsError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: NonContiguousContractTokenPositionsError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_token_positions_error :: dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_token_positions_error :: NonContiguousContractTokenPositionsError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: NonContiguousContractGroupPositionsError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: NonContiguousContractGroupPositionsError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_group_positions_error :: dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_group_positions_error :: NonContiguousContractGroupPositionsError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenBaseSupplyError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenBaseSupplyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_base_supply_error :: dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_base_supply_error :: InvalidTokenBaseSupplyError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenIdError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenIdError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_id_error :: dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: invalid_token_id_error :: InvalidTokenIdError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenAmountError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenAmountError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_amount_error :: dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: invalid_token_amount_error :: InvalidTokenAmountError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenPositionError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenPositionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_position_error :: dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: invalid_token_position_error :: InvalidTokenPositionError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenConfigUpdateNoChangeError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenConfigUpdateNoChangeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_config_update_no_change_error :: dpp_errors_consensus_basic_token_invalid_token_config_update_no_change_error_InvalidTokenConfigUpdateNoChangeError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: invalid_token_config_update_no_change_error :: InvalidTokenConfigUpdateNoChangeError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenDistributionFunctionDivideByZeroError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenDistributionFunctionDivideByZeroError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_divide_by_zero_error :: dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_divide_by_zero_error :: InvalidTokenDistributionFunctionDivideByZeroError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenDistributionFunctionInvalidParameterError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenDistributionFunctionInvalidParameterError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_error :: dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_error :: InvalidTokenDistributionFunctionInvalidParameterError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenDistributionFunctionInvalidParameterTupleError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenDistributionFunctionInvalidParameterTupleError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_tuple_error :: dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_tuple_error :: InvalidTokenDistributionFunctionInvalidParameterTupleError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenDistributionFunctionIncoherenceError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenDistributionFunctionIncoherenceError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_incoherence_error :: dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_incoherence_error :: InvalidTokenDistributionFunctionIncoherenceError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: TokenTransferToOurselfError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: TokenTransferToOurselfError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: token_transfer_to_ourselves_error :: dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: token_transfer_to_ourselves_error :: TokenTransferToOurselfError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenNoteTooBigError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenNoteTooBigError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_note_too_big_error :: dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: invalid_token_note_too_big_error :: InvalidTokenNoteTooBigError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: ContractHasNoTokensError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: ContractHasNoTokensError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: contract_has_no_tokens_error :: dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: contract_has_no_tokens_error :: ContractHasNoTokensError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: GroupPositionDoesNotExistError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: GroupPositionDoesNotExistError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_position_does_not_exist_error :: dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: group_position_does_not_exist_error :: GroupPositionDoesNotExistError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidActionIdError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidActionIdError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_action_id_error :: dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: invalid_action_id_error :: InvalidActionIdError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: DestinationIdentityForTokenMintingNotSetError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DestinationIdentityForTokenMintingNotSetError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: destination_identity_for_token_minting_not_set_error :: dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: destination_identity_for_token_minting_not_set_error :: DestinationIdentityForTokenMintingNotSetError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: ChoosingTokenMintRecipientNotAllowedError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: ChoosingTokenMintRecipientNotAllowedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: choosing_token_mint_recipient_not_allowed_error :: dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: choosing_token_mint_recipient_not_allowed_error :: ChoosingTokenMintRecipientNotAllowedError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: GroupActionNotAllowedOnTransitionError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: GroupActionNotAllowedOnTransitionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: group :: group_action_not_allowed_on_transition_error :: dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: group :: group_action_not_allowed_on_transition_error :: GroupActionNotAllowedOnTransitionError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: GroupExceedsMaxMembersError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: GroupExceedsMaxMembersError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_exceeds_max_members_error :: dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: group_exceeds_max_members_error :: GroupExceedsMaxMembersError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: GroupMemberHasPowerOfZeroError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: GroupMemberHasPowerOfZeroError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_of_zero_error :: dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_of_zero_error :: GroupMemberHasPowerOfZeroError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: GroupMemberHasPowerOverLimitError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: GroupMemberHasPowerOverLimitError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_over_limit_error :: dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_over_limit_error :: GroupMemberHasPowerOverLimitError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: GroupTotalPowerLessThanRequiredError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: GroupTotalPowerLessThanRequiredError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_total_power_has_less_than_required_power_error :: dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: group_total_power_has_less_than_required_power_error :: GroupTotalPowerLessThanRequiredError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_non_unilateral_member_power_has_less_than_required_power_error :: dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: group_non_unilateral_member_power_has_less_than_required_power_error :: GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError >> :: ffi_from (* o_0)) , dpp_errors_consensus_basic_basic_error_BasicError :: MissingDefaultLocalizationError (o_0) => dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MissingDefaultLocalizationError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: missing_default_localization :: dpp_errors_consensus_basic_token_missing_default_localization_MissingDefaultLocalizationError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: missing_default_localization :: MissingDefaultLocalizationError >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: basic_error :: BasicError > for dpp_errors_consensus_basic_basic_error_BasicError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: basic_error :: BasicError) -> * const dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (match obj { dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: ProtocolVersionParsingError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: ProtocolVersionParsingError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: protocol_version_parsing_error :: dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: decode :: protocol_version_parsing_error :: ProtocolVersionParsingError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: VersionError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: VersionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: version_error :: dpp_errors_consensus_basic_decode_version_error_VersionError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: decode :: version_error :: VersionError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: ContractError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: ContractError (< crate :: fermented :: types :: dpp :: data_contract :: errors :: contract :: dpp_data_contract_errors_contract_DataContractError as ferment :: FFIConversionTo < dpp :: data_contract :: errors :: contract :: DataContractError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UnknownSecurityLevelError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: UnknownSecurityLevelError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_security_level_error :: dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: unknown_security_level_error :: UnknownSecurityLevelError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UnknownStorageKeyRequirementsError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: UnknownStorageKeyRequirementsError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_storage_key_requirements_error :: dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: unknown_storage_key_requirements_error :: UnknownStorageKeyRequirementsError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UnknownTransferableTypeError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: UnknownTransferableTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_transferable_type_error :: dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: unknown_transferable_type_error :: UnknownTransferableTypeError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UnknownTradeModeError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: UnknownTradeModeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_trade_mode_error :: dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: unknown_trade_mode_error :: UnknownTradeModeError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UnknownDocumentCreationRestrictionModeError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: UnknownDocumentCreationRestrictionModeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_document_creation_restriction_mode_error :: dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: unknown_document_creation_restriction_mode_error :: UnknownDocumentCreationRestrictionModeError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: SerializedObjectParsingError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: SerializedObjectParsingError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: serialized_object_parsing_error :: dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: decode :: serialized_object_parsing_error :: SerializedObjectParsingError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UnsupportedProtocolVersionError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: UnsupportedProtocolVersionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: unsupported_protocol_version_error :: dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: unsupported_protocol_version_error :: UnsupportedProtocolVersionError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UnsupportedVersionError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: UnsupportedVersionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: unsupported_version_error :: dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: unsupported_version_error :: UnsupportedVersionError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IncompatibleProtocolVersionError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: IncompatibleProtocolVersionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: incompatible_protocol_version_error :: dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: incompatible_protocol_version_error :: IncompatibleProtocolVersionError >> :: ffi_to (o_0)) , # [cfg (feature = "json-schema-validation")] dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: JsonSchemaCompilationError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: JsonSchemaCompilationError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: json_schema_compilation_error :: dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: json_schema_compilation_error :: JsonSchemaCompilationError >> :: ffi_to (o_0)) , # [cfg (feature = "json-schema-validation")] dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: JsonSchemaError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: JsonSchemaError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: json_schema_error :: json_schema_error :: dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: json_schema_error :: json_schema_error :: JsonSchemaError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentifierError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentifierError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: invalid_identifier_error :: dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: invalid_identifier_error :: InvalidIdentifierError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: ValueError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: ValueError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: value_error :: dpp_errors_consensus_basic_value_error_ValueError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: value_error :: ValueError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DataContractMaxDepthExceedError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: DataContractMaxDepthExceedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_max_depth_exceed_error :: dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_max_depth_exceed_error :: DataContractMaxDepthExceedError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DuplicateIndexError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: DuplicateIndexError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_error :: dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_error :: DuplicateIndexError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IncompatibleRe2PatternError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: IncompatibleRe2PatternError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: incompatible_re2_pattern_error :: dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: incompatible_re2_pattern_error :: IncompatibleRe2PatternError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidCompoundIndexError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidCompoundIndexError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_compound_index_error :: dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_compound_index_error :: InvalidCompoundIndexError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidDataContractIdError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDataContractIdError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_id_error :: dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_id_error :: InvalidDataContractIdError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIndexedPropertyConstraintError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIndexedPropertyConstraintError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_indexed_property_constraint_error :: dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_indexed_property_constraint_error :: InvalidIndexedPropertyConstraintError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIndexPropertyTypeError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIndexPropertyTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_index_property_type_error :: dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_index_property_type_error :: InvalidIndexPropertyTypeError >> :: ffi_to (o_0)) , # [cfg (feature = "json-schema-validation")] dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidJsonSchemaRefError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidJsonSchemaRefError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_json_schema_ref_error :: dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_json_schema_ref_error :: InvalidJsonSchemaRefError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: SystemPropertyIndexAlreadyPresentError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: SystemPropertyIndexAlreadyPresentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: system_property_index_already_present_error :: dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: system_property_index_already_present_error :: SystemPropertyIndexAlreadyPresentError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UndefinedIndexPropertyError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: UndefinedIndexPropertyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: undefined_index_property_error :: dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: undefined_index_property_error :: UndefinedIndexPropertyError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UniqueIndicesLimitReachedError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: UniqueIndicesLimitReachedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unique_indices_limit_reached_error :: dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: unique_indices_limit_reached_error :: UniqueIndicesLimitReachedError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DuplicateIndexNameError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: DuplicateIndexNameError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_name_error :: dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_name_error :: DuplicateIndexNameError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidDataContractVersionError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDataContractVersionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_version_error :: dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_version_error :: InvalidDataContractVersionError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IncompatibleDataContractSchemaError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: IncompatibleDataContractSchemaError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: incompatible_data_contract_schema_error :: dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: incompatible_data_contract_schema_error :: IncompatibleDataContractSchemaError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DataContractImmutablePropertiesUpdateError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: DataContractImmutablePropertiesUpdateError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_immutable_properties_update_error :: dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_immutable_properties_update_error :: DataContractImmutablePropertiesUpdateError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DataContractUniqueIndicesChangedError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: DataContractUniqueIndicesChangedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_unique_indices_changed_error :: dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_unique_indices_changed_error :: DataContractUniqueIndicesChangedError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DataContractInvalidIndexDefinitionUpdateError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: DataContractInvalidIndexDefinitionUpdateError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_invalid_index_definition_update_error :: dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_invalid_index_definition_update_error :: DataContractInvalidIndexDefinitionUpdateError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DataContractHaveNewUniqueIndexError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: DataContractHaveNewUniqueIndexError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_have_new_unique_index_error :: dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_have_new_unique_index_error :: DataContractHaveNewUniqueIndexError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DataContractNotPresentError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: DataContractNotPresentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: data_contract_not_present_error :: dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: data_contract_not_present_error :: DataContractNotPresentError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DocumentCreationNotAllowedError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: DocumentCreationNotAllowedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: document_creation_not_allowed_error :: dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: document_creation_not_allowed_error :: DocumentCreationNotAllowedError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DataContractBoundsNotPresentError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: DataContractBoundsNotPresentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: data_contract_bounds_not_present_error :: dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: data_contract_bounds_not_present_error :: DataContractBoundsNotPresentError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DuplicateDocumentTransitionsWithIdsError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: DuplicateDocumentTransitionsWithIdsError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_ids_error :: dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_ids_error :: DuplicateDocumentTransitionsWithIdsError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DuplicateDocumentTransitionsWithIndicesError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: DuplicateDocumentTransitionsWithIndicesError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_indices_error :: dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_indices_error :: DuplicateDocumentTransitionsWithIndicesError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: NonceOutOfBoundsError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: NonceOutOfBoundsError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: identity_contract_nonce_out_of_bounds_error :: dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: identity_contract_nonce_out_of_bounds_error :: NonceOutOfBoundsError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InconsistentCompoundIndexDataError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InconsistentCompoundIndexDataError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: inconsistent_compound_index_data_error :: dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: inconsistent_compound_index_data_error :: InconsistentCompoundIndexDataError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidDocumentTransitionActionError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTransitionActionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_action_error :: dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_action_error :: InvalidDocumentTransitionActionError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidDocumentTransitionIdError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTransitionIdError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_id_error :: dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_id_error :: InvalidDocumentTransitionIdError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidDocumentTypeError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: invalid_document_type_error :: dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: invalid_document_type_error :: InvalidDocumentTypeError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MissingPositionsInDocumentTypePropertiesError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: MissingPositionsInDocumentTypePropertiesError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_positions_in_document_type_properties_error :: dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: missing_positions_in_document_type_properties_error :: MissingPositionsInDocumentTypePropertiesError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MissingDataContractIdBasicError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: MissingDataContractIdBasicError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_data_contract_id_basic_error :: dpp_errors_consensus_basic_document_missing_data_contract_id_basic_error_MissingDataContractIdBasicError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: missing_data_contract_id_basic_error :: MissingDataContractIdBasicError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MissingDocumentTransitionActionError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: MissingDocumentTransitionActionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_document_transition_action_error :: dpp_errors_consensus_basic_document_missing_document_transition_action_error_MissingDocumentTransitionActionError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: missing_document_transition_action_error :: MissingDocumentTransitionActionError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MissingDocumentTransitionTypeError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: MissingDocumentTransitionTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_document_transition_type_error :: dpp_errors_consensus_basic_document_missing_document_transition_type_error_MissingDocumentTransitionTypeError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: missing_document_transition_type_error :: MissingDocumentTransitionTypeError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MissingDocumentTypeError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: MissingDocumentTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_document_type_error :: dpp_errors_consensus_basic_document_missing_document_type_error_MissingDocumentTypeError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: missing_document_type_error :: MissingDocumentTypeError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MaxDocumentsTransitionsExceededError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: MaxDocumentsTransitionsExceededError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: max_documents_transitions_exceeded_error :: dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: max_documents_transitions_exceeded_error :: MaxDocumentsTransitionsExceededError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DuplicatedIdentityPublicKeyBasicError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: DuplicatedIdentityPublicKeyBasicError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_basic_error :: dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_basic_error :: DuplicatedIdentityPublicKeyBasicError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DuplicatedIdentityPublicKeyIdBasicError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: DuplicatedIdentityPublicKeyIdBasicError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_id_basic_error :: dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_id_basic_error :: DuplicatedIdentityPublicKeyIdBasicError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DisablingKeyIdAlsoBeingAddedInSameTransitionError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: DisablingKeyIdAlsoBeingAddedInSameTransitionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: disabling_key_id_also_being_added_in_same_transition_error :: dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: disabling_key_id_also_being_added_in_same_transition_error :: DisablingKeyIdAlsoBeingAddedInSameTransitionError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IdentityAssetLockProofLockedTransactionMismatchError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockProofLockedTransactionMismatchError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_proof_locked_transaction_mismatch_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_proof_locked_transaction_mismatch_error :: IdentityAssetLockProofLockedTransactionMismatchError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IdentityAssetLockTransactionIsNotFoundError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockTransactionIsNotFoundError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_is_not_found_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_is_not_found_error :: IdentityAssetLockTransactionIsNotFoundError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IdentityAssetLockTransactionOutPointAlreadyConsumedError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockTransactionOutPointAlreadyConsumedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_already_consumed_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_already_consumed_error :: IdentityAssetLockTransactionOutPointAlreadyConsumedError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IdentityAssetLockTransactionOutPointNotEnoughBalanceError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockTransactionOutPointNotEnoughBalanceError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_not_enough_balance_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_not_enough_balance_error :: IdentityAssetLockTransactionOutPointNotEnoughBalanceError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IdentityAssetLockStateTransitionReplayError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockStateTransitionReplayError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_state_transition_replay_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_state_transition_replay_error :: IdentityAssetLockStateTransitionReplayError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IdentityAssetLockTransactionOutputNotFoundError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockTransactionOutputNotFoundError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_output_not_found_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_output_not_found_error :: IdentityAssetLockTransactionOutputNotFoundError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidAssetLockProofCoreChainHeightError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidAssetLockProofCoreChainHeightError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_core_chain_height_error :: dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_core_chain_height_error :: InvalidAssetLockProofCoreChainHeightError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityAssetLockProofChainLockValidationError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityAssetLockProofChainLockValidationError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_proof_chain_lock_validation_error :: dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_proof_chain_lock_validation_error :: InvalidIdentityAssetLockProofChainLockValidationError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidAssetLockProofTransactionHeightError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidAssetLockProofTransactionHeightError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_transaction_height_error :: dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_transaction_height_error :: InvalidAssetLockProofTransactionHeightError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidAssetLockTransactionOutputReturnSizeError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidAssetLockTransactionOutputReturnSizeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_transaction_output_return_size :: dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_transaction_output_return_size :: InvalidAssetLockTransactionOutputReturnSizeError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityAssetLockTransactionError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityAssetLockTransactionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_error :: dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_error :: InvalidIdentityAssetLockTransactionError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityAssetLockTransactionOutputError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityAssetLockTransactionOutputError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_output_error :: dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_output_error :: InvalidIdentityAssetLockTransactionOutputError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityPublicKeyDataError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityPublicKeyDataError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_data_error :: dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_data_error :: InvalidIdentityPublicKeyDataError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidInstantAssetLockProofError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidInstantAssetLockProofError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_error :: dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_error :: InvalidInstantAssetLockProofError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidInstantAssetLockProofSignatureError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidInstantAssetLockProofSignatureError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_signature_error :: dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_signature_error_InvalidInstantAssetLockProofSignatureError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_signature_error :: InvalidInstantAssetLockProofSignatureError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MissingMasterPublicKeyError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: MissingMasterPublicKeyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: missing_master_public_key_error :: dpp_errors_consensus_basic_identity_missing_master_public_key_error_MissingMasterPublicKeyError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: missing_master_public_key_error :: MissingMasterPublicKeyError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: TooManyMasterPublicKeyError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: TooManyMasterPublicKeyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: too_many_master_public_key_error :: dpp_errors_consensus_basic_identity_too_many_master_public_key_error_TooManyMasterPublicKeyError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: too_many_master_public_key_error :: TooManyMasterPublicKeyError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MasterPublicKeyUpdateError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: MasterPublicKeyUpdateError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: master_public_key_update_error :: dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: master_public_key_update_error :: MasterPublicKeyUpdateError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidDocumentTypeRequiredSecurityLevelError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTypeRequiredSecurityLevelError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_required_security_level :: dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_required_security_level :: InvalidDocumentTypeRequiredSecurityLevelError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityPublicKeySecurityLevelError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityPublicKeySecurityLevelError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_security_level_error :: dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_security_level_error :: InvalidIdentityPublicKeySecurityLevelError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityKeySignatureError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityKeySignatureError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_key_signature_error :: dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_key_signature_error :: InvalidIdentityKeySignatureError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityCreditTransferAmountError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityCreditTransferAmountError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_transfer_amount_error :: dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_transfer_amount_error :: InvalidIdentityCreditTransferAmountError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityCreditWithdrawalTransitionOutputScriptError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityCreditWithdrawalTransitionOutputScriptError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_output_script_error :: dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_output_script_error :: InvalidIdentityCreditWithdrawalTransitionOutputScriptError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: withdrawal_output_script_not_allowed_when_signing_with_owner_key :: dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: withdrawal_output_script_not_allowed_when_signing_with_owner_key :: WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityCreditWithdrawalTransitionCoreFeeError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityCreditWithdrawalTransitionCoreFeeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_core_fee_error :: dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_core_fee_error :: InvalidIdentityCreditWithdrawalTransitionCoreFeeError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityCreditWithdrawalTransitionAmountError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityCreditWithdrawalTransitionAmountError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_amount_error :: dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_amount_error :: InvalidIdentityCreditWithdrawalTransitionAmountError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityUpdateTransitionEmptyError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityUpdateTransitionEmptyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_empty_error :: dpp_errors_consensus_basic_identity_invalid_identity_update_transition_empty_error_InvalidIdentityUpdateTransitionEmptyError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_empty_error :: InvalidIdentityUpdateTransitionEmptyError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidIdentityUpdateTransitionDisableKeysError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityUpdateTransitionDisableKeysError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_disable_keys_error :: dpp_errors_consensus_basic_identity_invalid_identity_update_transition_disable_keys_error_InvalidIdentityUpdateTransitionDisableKeysError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_disable_keys_error :: InvalidIdentityUpdateTransitionDisableKeysError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: NotImplementedIdentityCreditWithdrawalTransitionPoolingError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: NotImplementedIdentityCreditWithdrawalTransitionPoolingError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: not_implemented_identity_credit_withdrawal_transition_pooling_error :: dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: not_implemented_identity_credit_withdrawal_transition_pooling_error :: NotImplementedIdentityCreditWithdrawalTransitionPoolingError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidStateTransitionTypeError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidStateTransitionTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: state_transition :: invalid_state_transition_type_error :: dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: state_transition :: invalid_state_transition_type_error :: InvalidStateTransitionTypeError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MissingStateTransitionTypeError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: MissingStateTransitionTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: state_transition :: missing_state_transition_type_error :: dpp_errors_consensus_basic_state_transition_missing_state_transition_type_error_MissingStateTransitionTypeError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: state_transition :: missing_state_transition_type_error :: MissingStateTransitionTypeError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DocumentFieldMaxSizeExceededError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: DocumentFieldMaxSizeExceededError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: document_field_max_size_exceeded_error :: dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: document_field_max_size_exceeded_error :: DocumentFieldMaxSizeExceededError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: StateTransitionMaxSizeExceededError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: StateTransitionMaxSizeExceededError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: state_transition :: state_transition_max_size_exceeded_error :: dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: state_transition :: state_transition_max_size_exceeded_error :: StateTransitionMaxSizeExceededError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DocumentTransitionsAreAbsentError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: DocumentTransitionsAreAbsentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: document_transitions_are_absent_error :: dpp_errors_consensus_basic_document_document_transitions_are_absent_error_DocumentTransitionsAreAbsentError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: document_transitions_are_absent_error :: DocumentTransitionsAreAbsentError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IdentityCreditTransferToSelfError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: IdentityCreditTransferToSelfError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_credit_transfer_to_self_error :: dpp_errors_consensus_basic_identity_identity_credit_transfer_to_self_error_IdentityCreditTransferToSelfError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: identity :: identity_credit_transfer_to_self_error :: IdentityCreditTransferToSelfError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidDocumentTypeNameError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTypeNameError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_name_error :: dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_name_error :: InvalidDocumentTypeNameError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: IncompatibleDocumentTypeSchemaError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: IncompatibleDocumentTypeSchemaError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: incompatible_document_type_schema_error :: dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: incompatible_document_type_schema_error :: IncompatibleDocumentTypeSchemaError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: ContestedUniqueIndexOnMutableDocumentTypeError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: ContestedUniqueIndexOnMutableDocumentTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_on_mutable_document_type_error :: dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_on_mutable_document_type_error :: ContestedUniqueIndexOnMutableDocumentTypeError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: ContestedUniqueIndexWithUniqueIndexError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: ContestedUniqueIndexWithUniqueIndexError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_with_unique_index_error :: dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_with_unique_index_error :: ContestedUniqueIndexWithUniqueIndexError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: OverflowError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: OverflowError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: overflow_error :: dpp_errors_consensus_basic_overflow_error_OverflowError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: overflow_error :: OverflowError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: UnsupportedFeatureError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: UnsupportedFeatureError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: unsupported_feature_error :: dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: unsupported_feature_error :: UnsupportedFeatureError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: ContestedDocumentsTemporarilyNotAllowedError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: ContestedDocumentsTemporarilyNotAllowedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: contested_documents_temporarily_not_allowed_error :: dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: contested_documents_temporarily_not_allowed_error :: ContestedDocumentsTemporarilyNotAllowedError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DataContractTokenConfigurationUpdateError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: DataContractTokenConfigurationUpdateError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_token_configuration_update_error :: dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: data_contract_token_configuration_update_error :: DataContractTokenConfigurationUpdateError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: NonContiguousContractTokenPositionsError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: NonContiguousContractTokenPositionsError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_token_positions_error :: dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_token_positions_error :: NonContiguousContractTokenPositionsError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: NonContiguousContractGroupPositionsError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: NonContiguousContractGroupPositionsError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_group_positions_error :: dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_group_positions_error :: NonContiguousContractGroupPositionsError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenBaseSupplyError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenBaseSupplyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_base_supply_error :: dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_base_supply_error :: InvalidTokenBaseSupplyError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenIdError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenIdError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_id_error :: dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: invalid_token_id_error :: InvalidTokenIdError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenAmountError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenAmountError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_amount_error :: dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: invalid_token_amount_error :: InvalidTokenAmountError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenPositionError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenPositionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_position_error :: dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: invalid_token_position_error :: InvalidTokenPositionError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenConfigUpdateNoChangeError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenConfigUpdateNoChangeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_config_update_no_change_error :: dpp_errors_consensus_basic_token_invalid_token_config_update_no_change_error_InvalidTokenConfigUpdateNoChangeError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: invalid_token_config_update_no_change_error :: InvalidTokenConfigUpdateNoChangeError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenDistributionFunctionDivideByZeroError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenDistributionFunctionDivideByZeroError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_divide_by_zero_error :: dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_divide_by_zero_error :: InvalidTokenDistributionFunctionDivideByZeroError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenDistributionFunctionInvalidParameterError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenDistributionFunctionInvalidParameterError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_error :: dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_error :: InvalidTokenDistributionFunctionInvalidParameterError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenDistributionFunctionInvalidParameterTupleError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenDistributionFunctionInvalidParameterTupleError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_tuple_error :: dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_tuple_error :: InvalidTokenDistributionFunctionInvalidParameterTupleError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenDistributionFunctionIncoherenceError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenDistributionFunctionIncoherenceError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_incoherence_error :: dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_incoherence_error :: InvalidTokenDistributionFunctionIncoherenceError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: TokenTransferToOurselfError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: TokenTransferToOurselfError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: token_transfer_to_ourselves_error :: dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: token_transfer_to_ourselves_error :: TokenTransferToOurselfError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidTokenNoteTooBigError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenNoteTooBigError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_note_too_big_error :: dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: invalid_token_note_too_big_error :: InvalidTokenNoteTooBigError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: ContractHasNoTokensError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: ContractHasNoTokensError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: contract_has_no_tokens_error :: dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: contract_has_no_tokens_error :: ContractHasNoTokensError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: GroupPositionDoesNotExistError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: GroupPositionDoesNotExistError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_position_does_not_exist_error :: dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: group_position_does_not_exist_error :: GroupPositionDoesNotExistError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: InvalidActionIdError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: InvalidActionIdError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_action_id_error :: dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: invalid_action_id_error :: InvalidActionIdError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: DestinationIdentityForTokenMintingNotSetError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: DestinationIdentityForTokenMintingNotSetError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: destination_identity_for_token_minting_not_set_error :: dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: destination_identity_for_token_minting_not_set_error :: DestinationIdentityForTokenMintingNotSetError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: ChoosingTokenMintRecipientNotAllowedError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: ChoosingTokenMintRecipientNotAllowedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: choosing_token_mint_recipient_not_allowed_error :: dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: choosing_token_mint_recipient_not_allowed_error :: ChoosingTokenMintRecipientNotAllowedError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: GroupActionNotAllowedOnTransitionError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: GroupActionNotAllowedOnTransitionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: group :: group_action_not_allowed_on_transition_error :: dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: group :: group_action_not_allowed_on_transition_error :: GroupActionNotAllowedOnTransitionError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: GroupExceedsMaxMembersError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: GroupExceedsMaxMembersError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_exceeds_max_members_error :: dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: group_exceeds_max_members_error :: GroupExceedsMaxMembersError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: GroupMemberHasPowerOfZeroError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: GroupMemberHasPowerOfZeroError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_of_zero_error :: dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_of_zero_error :: GroupMemberHasPowerOfZeroError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: GroupMemberHasPowerOverLimitError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: GroupMemberHasPowerOverLimitError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_over_limit_error :: dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_over_limit_error :: GroupMemberHasPowerOverLimitError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: GroupTotalPowerLessThanRequiredError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: GroupTotalPowerLessThanRequiredError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_total_power_has_less_than_required_power_error :: dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: group_total_power_has_less_than_required_power_error :: GroupTotalPowerLessThanRequiredError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_non_unilateral_member_power_has_less_than_required_power_error :: dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: group_non_unilateral_member_power_has_less_than_required_power_error :: GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: basic :: basic_error :: BasicError :: MissingDefaultLocalizationError (o_0) => dpp_errors_consensus_basic_basic_error_BasicError :: MissingDefaultLocalizationError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: missing_default_localization :: dpp_errors_consensus_basic_token_missing_default_localization_MissingDefaultLocalizationError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: missing_default_localization :: MissingDefaultLocalizationError >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_errors_consensus_basic_basic_error_BasicError { fn drop (& mut self) { unsafe { match self { dpp_errors_consensus_basic_basic_error_BasicError :: ProtocolVersionParsingError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: VersionError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: ContractError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: UnknownSecurityLevelError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: UnknownStorageKeyRequirementsError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: UnknownTransferableTypeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: UnknownTradeModeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: UnknownDocumentCreationRestrictionModeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: SerializedObjectParsingError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: UnsupportedProtocolVersionError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: UnsupportedVersionError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: IncompatibleProtocolVersionError (o_0) => { ferment :: unbox_any (* o_0) ; } , # [cfg (feature = "json-schema-validation")] dpp_errors_consensus_basic_basic_error_BasicError :: JsonSchemaCompilationError (o_0) => { ferment :: unbox_any (* o_0) ; } , # [cfg (feature = "json-schema-validation")] dpp_errors_consensus_basic_basic_error_BasicError :: JsonSchemaError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentifierError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: ValueError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: DataContractMaxDepthExceedError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: DuplicateIndexError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: IncompatibleRe2PatternError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidCompoundIndexError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDataContractIdError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIndexedPropertyConstraintError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIndexPropertyTypeError (o_0) => { ferment :: unbox_any (* o_0) ; } , # [cfg (feature = "json-schema-validation")] dpp_errors_consensus_basic_basic_error_BasicError :: InvalidJsonSchemaRefError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: SystemPropertyIndexAlreadyPresentError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: UndefinedIndexPropertyError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: UniqueIndicesLimitReachedError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: DuplicateIndexNameError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDataContractVersionError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: IncompatibleDataContractSchemaError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: DataContractImmutablePropertiesUpdateError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: DataContractUniqueIndicesChangedError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: DataContractInvalidIndexDefinitionUpdateError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: DataContractHaveNewUniqueIndexError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: DataContractNotPresentError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: DocumentCreationNotAllowedError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: DataContractBoundsNotPresentError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: DuplicateDocumentTransitionsWithIdsError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: DuplicateDocumentTransitionsWithIndicesError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: NonceOutOfBoundsError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InconsistentCompoundIndexDataError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTransitionActionError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTransitionIdError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTypeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: MissingPositionsInDocumentTypePropertiesError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: MissingDataContractIdBasicError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: MissingDocumentTransitionActionError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: MissingDocumentTransitionTypeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: MissingDocumentTypeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: MaxDocumentsTransitionsExceededError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: DuplicatedIdentityPublicKeyBasicError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: DuplicatedIdentityPublicKeyIdBasicError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: DisablingKeyIdAlsoBeingAddedInSameTransitionError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockProofLockedTransactionMismatchError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockTransactionIsNotFoundError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockTransactionOutPointAlreadyConsumedError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockTransactionOutPointNotEnoughBalanceError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockStateTransitionReplayError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockTransactionOutputNotFoundError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidAssetLockProofCoreChainHeightError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityAssetLockProofChainLockValidationError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidAssetLockProofTransactionHeightError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidAssetLockTransactionOutputReturnSizeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityAssetLockTransactionError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityAssetLockTransactionOutputError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityPublicKeyDataError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidInstantAssetLockProofError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidInstantAssetLockProofSignatureError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: MissingMasterPublicKeyError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: TooManyMasterPublicKeyError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: MasterPublicKeyUpdateError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTypeRequiredSecurityLevelError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityPublicKeySecurityLevelError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityKeySignatureError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityCreditTransferAmountError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityCreditWithdrawalTransitionOutputScriptError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityCreditWithdrawalTransitionCoreFeeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityCreditWithdrawalTransitionAmountError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityUpdateTransitionEmptyError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityUpdateTransitionDisableKeysError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: NotImplementedIdentityCreditWithdrawalTransitionPoolingError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidStateTransitionTypeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: MissingStateTransitionTypeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: DocumentFieldMaxSizeExceededError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: StateTransitionMaxSizeExceededError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: DocumentTransitionsAreAbsentError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: IdentityCreditTransferToSelfError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTypeNameError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: IncompatibleDocumentTypeSchemaError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: ContestedUniqueIndexOnMutableDocumentTypeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: ContestedUniqueIndexWithUniqueIndexError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: OverflowError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: UnsupportedFeatureError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: ContestedDocumentsTemporarilyNotAllowedError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: DataContractTokenConfigurationUpdateError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: NonContiguousContractTokenPositionsError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: NonContiguousContractGroupPositionsError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenBaseSupplyError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenIdError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenAmountError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenPositionError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenConfigUpdateNoChangeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenDistributionFunctionDivideByZeroError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenDistributionFunctionInvalidParameterError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenDistributionFunctionInvalidParameterTupleError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenDistributionFunctionIncoherenceError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: TokenTransferToOurselfError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenNoteTooBigError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: ContractHasNoTokensError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: GroupPositionDoesNotExistError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: InvalidActionIdError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: DestinationIdentityForTokenMintingNotSetError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: ChoosingTokenMintRecipientNotAllowedError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: GroupActionNotAllowedOnTransitionError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: GroupExceedsMaxMembersError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: GroupMemberHasPowerOfZeroError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: GroupMemberHasPowerOverLimitError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: GroupTotalPowerLessThanRequiredError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_basic_basic_error_BasicError :: MissingDefaultLocalizationError (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_ProtocolVersionParsingError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: protocol_version_parsing_error :: dpp_errors_consensus_basic_decode_protocol_version_parsing_error_ProtocolVersionParsingError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: ProtocolVersionParsingError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_VersionError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: version_error :: dpp_errors_consensus_basic_decode_version_error_VersionError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: VersionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_ContractError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: errors :: contract :: dpp_data_contract_errors_contract_DataContractError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: ContractError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_UnknownSecurityLevelError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_security_level_error :: dpp_errors_consensus_basic_data_contract_unknown_security_level_error_UnknownSecurityLevelError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: UnknownSecurityLevelError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_UnknownStorageKeyRequirementsError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_storage_key_requirements_error :: dpp_errors_consensus_basic_data_contract_unknown_storage_key_requirements_error_UnknownStorageKeyRequirementsError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: UnknownStorageKeyRequirementsError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_UnknownTransferableTypeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_transferable_type_error :: dpp_errors_consensus_basic_data_contract_unknown_transferable_type_error_UnknownTransferableTypeError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: UnknownTransferableTypeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_UnknownTradeModeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_trade_mode_error :: dpp_errors_consensus_basic_data_contract_unknown_trade_mode_error_UnknownTradeModeError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: UnknownTradeModeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_UnknownDocumentCreationRestrictionModeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unknown_document_creation_restriction_mode_error :: dpp_errors_consensus_basic_data_contract_unknown_document_creation_restriction_mode_error_UnknownDocumentCreationRestrictionModeError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: UnknownDocumentCreationRestrictionModeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_SerializedObjectParsingError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: serialized_object_parsing_error :: dpp_errors_consensus_basic_decode_serialized_object_parsing_error_SerializedObjectParsingError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: SerializedObjectParsingError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_UnsupportedProtocolVersionError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: unsupported_protocol_version_error :: dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: UnsupportedProtocolVersionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_UnsupportedVersionError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: unsupported_version_error :: dpp_errors_consensus_basic_unsupported_version_error_UnsupportedVersionError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: UnsupportedVersionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_IncompatibleProtocolVersionError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: incompatible_protocol_version_error :: dpp_errors_consensus_basic_incompatible_protocol_version_error_IncompatibleProtocolVersionError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: IncompatibleProtocolVersionError (o_o_0)) } # [cfg (feature = "json-schema-validation")] # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_JsonSchemaCompilationError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: json_schema_compilation_error :: dpp_errors_consensus_basic_json_schema_compilation_error_JsonSchemaCompilationError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: JsonSchemaCompilationError (o_o_0)) } # [cfg (feature = "json-schema-validation")] # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_JsonSchemaError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: json_schema_error :: json_schema_error :: dpp_errors_consensus_basic_json_schema_error_json_schema_error_JsonSchemaError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: JsonSchemaError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidIdentifierError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: invalid_identifier_error :: dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentifierError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_ValueError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: value_error :: dpp_errors_consensus_basic_value_error_ValueError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: ValueError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_DataContractMaxDepthExceedError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_max_depth_exceed_error :: dpp_errors_consensus_basic_data_contract_data_contract_max_depth_exceed_error_DataContractMaxDepthExceedError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: DataContractMaxDepthExceedError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_DuplicateIndexError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_error :: dpp_errors_consensus_basic_data_contract_duplicate_index_error_DuplicateIndexError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: DuplicateIndexError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_IncompatibleRe2PatternError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: incompatible_re2_pattern_error :: dpp_errors_consensus_basic_data_contract_incompatible_re2_pattern_error_IncompatibleRe2PatternError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: IncompatibleRe2PatternError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidCompoundIndexError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_compound_index_error :: dpp_errors_consensus_basic_data_contract_invalid_compound_index_error_InvalidCompoundIndexError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidCompoundIndexError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidDataContractIdError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_id_error :: dpp_errors_consensus_basic_data_contract_invalid_data_contract_id_error_InvalidDataContractIdError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDataContractIdError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidIndexedPropertyConstraintError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_indexed_property_constraint_error :: dpp_errors_consensus_basic_data_contract_invalid_indexed_property_constraint_error_InvalidIndexedPropertyConstraintError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIndexedPropertyConstraintError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidIndexPropertyTypeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_index_property_type_error :: dpp_errors_consensus_basic_data_contract_invalid_index_property_type_error_InvalidIndexPropertyTypeError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIndexPropertyTypeError (o_o_0)) } # [cfg (feature = "json-schema-validation")] # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidJsonSchemaRefError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_json_schema_ref_error :: dpp_errors_consensus_basic_data_contract_invalid_json_schema_ref_error_InvalidJsonSchemaRefError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidJsonSchemaRefError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_SystemPropertyIndexAlreadyPresentError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: system_property_index_already_present_error :: dpp_errors_consensus_basic_data_contract_system_property_index_already_present_error_SystemPropertyIndexAlreadyPresentError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: SystemPropertyIndexAlreadyPresentError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_UndefinedIndexPropertyError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: undefined_index_property_error :: dpp_errors_consensus_basic_data_contract_undefined_index_property_error_UndefinedIndexPropertyError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: UndefinedIndexPropertyError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_UniqueIndicesLimitReachedError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: unique_indices_limit_reached_error :: dpp_errors_consensus_basic_data_contract_unique_indices_limit_reached_error_UniqueIndicesLimitReachedError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: UniqueIndicesLimitReachedError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_DuplicateIndexNameError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: duplicate_index_name_error :: dpp_errors_consensus_basic_data_contract_duplicate_index_name_error_DuplicateIndexNameError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: DuplicateIndexNameError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidDataContractVersionError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_data_contract_version_error :: dpp_errors_consensus_basic_data_contract_invalid_data_contract_version_error_InvalidDataContractVersionError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDataContractVersionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_IncompatibleDataContractSchemaError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: incompatible_data_contract_schema_error :: dpp_errors_consensus_basic_data_contract_incompatible_data_contract_schema_error_IncompatibleDataContractSchemaError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: IncompatibleDataContractSchemaError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_DataContractImmutablePropertiesUpdateError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_immutable_properties_update_error :: dpp_errors_consensus_basic_data_contract_data_contract_immutable_properties_update_error_DataContractImmutablePropertiesUpdateError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: DataContractImmutablePropertiesUpdateError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_DataContractUniqueIndicesChangedError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_unique_indices_changed_error :: dpp_errors_consensus_basic_data_contract_data_contract_unique_indices_changed_error_DataContractUniqueIndicesChangedError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: DataContractUniqueIndicesChangedError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_DataContractInvalidIndexDefinitionUpdateError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_invalid_index_definition_update_error :: dpp_errors_consensus_basic_data_contract_data_contract_invalid_index_definition_update_error_DataContractInvalidIndexDefinitionUpdateError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: DataContractInvalidIndexDefinitionUpdateError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_DataContractHaveNewUniqueIndexError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_have_new_unique_index_error :: dpp_errors_consensus_basic_data_contract_data_contract_have_new_unique_index_error_DataContractHaveNewUniqueIndexError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: DataContractHaveNewUniqueIndexError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_DataContractNotPresentError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: data_contract_not_present_error :: dpp_errors_consensus_basic_document_data_contract_not_present_error_DataContractNotPresentError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: DataContractNotPresentError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_DocumentCreationNotAllowedError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: document_creation_not_allowed_error :: dpp_errors_consensus_basic_document_document_creation_not_allowed_error_DocumentCreationNotAllowedError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: DocumentCreationNotAllowedError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_DataContractBoundsNotPresentError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: data_contract_bounds_not_present_error :: dpp_errors_consensus_basic_identity_data_contract_bounds_not_present_error_DataContractBoundsNotPresentError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: DataContractBoundsNotPresentError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_DuplicateDocumentTransitionsWithIdsError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_ids_error :: dpp_errors_consensus_basic_document_duplicate_document_transitions_with_ids_error_DuplicateDocumentTransitionsWithIdsError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: DuplicateDocumentTransitionsWithIdsError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_DuplicateDocumentTransitionsWithIndicesError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: duplicate_document_transitions_with_indices_error :: dpp_errors_consensus_basic_document_duplicate_document_transitions_with_indices_error_DuplicateDocumentTransitionsWithIndicesError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: DuplicateDocumentTransitionsWithIndicesError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_NonceOutOfBoundsError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: identity_contract_nonce_out_of_bounds_error :: dpp_errors_consensus_basic_document_identity_contract_nonce_out_of_bounds_error_NonceOutOfBoundsError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: NonceOutOfBoundsError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InconsistentCompoundIndexDataError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: inconsistent_compound_index_data_error :: dpp_errors_consensus_basic_document_inconsistent_compound_index_data_error_InconsistentCompoundIndexDataError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InconsistentCompoundIndexDataError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidDocumentTransitionActionError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_action_error :: dpp_errors_consensus_basic_document_invalid_document_transition_action_error_InvalidDocumentTransitionActionError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTransitionActionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidDocumentTransitionIdError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: invalid_document_transition_id_error :: dpp_errors_consensus_basic_document_invalid_document_transition_id_error_InvalidDocumentTransitionIdError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTransitionIdError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidDocumentTypeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: invalid_document_type_error :: dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTypeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_MissingPositionsInDocumentTypePropertiesError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_positions_in_document_type_properties_error :: dpp_errors_consensus_basic_document_missing_positions_in_document_type_properties_error_MissingPositionsInDocumentTypePropertiesError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: MissingPositionsInDocumentTypePropertiesError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_MissingDataContractIdBasicError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_data_contract_id_basic_error :: dpp_errors_consensus_basic_document_missing_data_contract_id_basic_error_MissingDataContractIdBasicError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: MissingDataContractIdBasicError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_MissingDocumentTransitionActionError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_document_transition_action_error :: dpp_errors_consensus_basic_document_missing_document_transition_action_error_MissingDocumentTransitionActionError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: MissingDocumentTransitionActionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_MissingDocumentTransitionTypeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_document_transition_type_error :: dpp_errors_consensus_basic_document_missing_document_transition_type_error_MissingDocumentTransitionTypeError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: MissingDocumentTransitionTypeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_MissingDocumentTypeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: missing_document_type_error :: dpp_errors_consensus_basic_document_missing_document_type_error_MissingDocumentTypeError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: MissingDocumentTypeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_MaxDocumentsTransitionsExceededError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: max_documents_transitions_exceeded_error :: dpp_errors_consensus_basic_document_max_documents_transitions_exceeded_error_MaxDocumentsTransitionsExceededError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: MaxDocumentsTransitionsExceededError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_DuplicatedIdentityPublicKeyBasicError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_basic_error :: dpp_errors_consensus_basic_identity_duplicated_identity_public_key_basic_error_DuplicatedIdentityPublicKeyBasicError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: DuplicatedIdentityPublicKeyBasicError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_DuplicatedIdentityPublicKeyIdBasicError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: duplicated_identity_public_key_id_basic_error :: dpp_errors_consensus_basic_identity_duplicated_identity_public_key_id_basic_error_DuplicatedIdentityPublicKeyIdBasicError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: DuplicatedIdentityPublicKeyIdBasicError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_DisablingKeyIdAlsoBeingAddedInSameTransitionError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: disabling_key_id_also_being_added_in_same_transition_error :: dpp_errors_consensus_basic_identity_disabling_key_id_also_being_added_in_same_transition_error_DisablingKeyIdAlsoBeingAddedInSameTransitionError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: DisablingKeyIdAlsoBeingAddedInSameTransitionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_IdentityAssetLockProofLockedTransactionMismatchError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_proof_locked_transaction_mismatch_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_proof_locked_transaction_mismatch_error_IdentityAssetLockProofLockedTransactionMismatchError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockProofLockedTransactionMismatchError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_IdentityAssetLockTransactionIsNotFoundError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_is_not_found_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_is_not_found_error_IdentityAssetLockTransactionIsNotFoundError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockTransactionIsNotFoundError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_IdentityAssetLockTransactionOutPointAlreadyConsumedError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_already_consumed_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_already_consumed_error_IdentityAssetLockTransactionOutPointAlreadyConsumedError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockTransactionOutPointAlreadyConsumedError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_IdentityAssetLockTransactionOutPointNotEnoughBalanceError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_out_point_not_enough_balance_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_out_point_not_enough_balance_error_IdentityAssetLockTransactionOutPointNotEnoughBalanceError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockTransactionOutPointNotEnoughBalanceError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_IdentityAssetLockStateTransitionReplayError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_state_transition_replay_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_state_transition_replay_error_IdentityAssetLockStateTransitionReplayError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockStateTransitionReplayError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_IdentityAssetLockTransactionOutputNotFoundError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_asset_lock_transaction_output_not_found_error :: dpp_errors_consensus_basic_identity_identity_asset_lock_transaction_output_not_found_error_IdentityAssetLockTransactionOutputNotFoundError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: IdentityAssetLockTransactionOutputNotFoundError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidAssetLockProofCoreChainHeightError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_core_chain_height_error :: dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_core_chain_height_error_InvalidAssetLockProofCoreChainHeightError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidAssetLockProofCoreChainHeightError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidIdentityAssetLockProofChainLockValidationError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_proof_chain_lock_validation_error :: dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_proof_chain_lock_validation_error_InvalidIdentityAssetLockProofChainLockValidationError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityAssetLockProofChainLockValidationError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidAssetLockProofTransactionHeightError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_proof_transaction_height_error :: dpp_errors_consensus_basic_identity_invalid_asset_lock_proof_transaction_height_error_InvalidAssetLockProofTransactionHeightError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidAssetLockProofTransactionHeightError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidAssetLockTransactionOutputReturnSizeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_asset_lock_transaction_output_return_size :: dpp_errors_consensus_basic_identity_invalid_asset_lock_transaction_output_return_size_InvalidAssetLockTransactionOutputReturnSizeError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidAssetLockTransactionOutputReturnSizeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidIdentityAssetLockTransactionError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_error :: dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_error_InvalidIdentityAssetLockTransactionError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityAssetLockTransactionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidIdentityAssetLockTransactionOutputError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_asset_lock_transaction_output_error :: dpp_errors_consensus_basic_identity_invalid_identity_asset_lock_transaction_output_error_InvalidIdentityAssetLockTransactionOutputError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityAssetLockTransactionOutputError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidIdentityPublicKeyDataError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_data_error :: dpp_errors_consensus_basic_identity_invalid_identity_public_key_data_error_InvalidIdentityPublicKeyDataError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityPublicKeyDataError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidInstantAssetLockProofError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_error :: dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_error_InvalidInstantAssetLockProofError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidInstantAssetLockProofError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidInstantAssetLockProofSignatureError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_instant_asset_lock_proof_signature_error :: dpp_errors_consensus_basic_identity_invalid_instant_asset_lock_proof_signature_error_InvalidInstantAssetLockProofSignatureError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidInstantAssetLockProofSignatureError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_MissingMasterPublicKeyError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: missing_master_public_key_error :: dpp_errors_consensus_basic_identity_missing_master_public_key_error_MissingMasterPublicKeyError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: MissingMasterPublicKeyError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_TooManyMasterPublicKeyError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: too_many_master_public_key_error :: dpp_errors_consensus_basic_identity_too_many_master_public_key_error_TooManyMasterPublicKeyError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: TooManyMasterPublicKeyError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_MasterPublicKeyUpdateError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: master_public_key_update_error :: dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: MasterPublicKeyUpdateError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidDocumentTypeRequiredSecurityLevelError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_required_security_level :: dpp_errors_consensus_basic_data_contract_invalid_document_type_required_security_level_InvalidDocumentTypeRequiredSecurityLevelError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTypeRequiredSecurityLevelError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidIdentityPublicKeySecurityLevelError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_public_key_security_level_error :: dpp_errors_consensus_basic_identity_invalid_identity_public_key_security_level_error_InvalidIdentityPublicKeySecurityLevelError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityPublicKeySecurityLevelError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidIdentityKeySignatureError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_key_signature_error :: dpp_errors_consensus_basic_identity_invalid_identity_key_signature_error_InvalidIdentityKeySignatureError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityKeySignatureError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidIdentityCreditTransferAmountError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_transfer_amount_error :: dpp_errors_consensus_basic_identity_invalid_identity_credit_transfer_amount_error_InvalidIdentityCreditTransferAmountError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityCreditTransferAmountError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidIdentityCreditWithdrawalTransitionOutputScriptError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_output_script_error :: dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_output_script_error_InvalidIdentityCreditWithdrawalTransitionOutputScriptError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityCreditWithdrawalTransitionOutputScriptError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: withdrawal_output_script_not_allowed_when_signing_with_owner_key :: dpp_errors_consensus_basic_identity_withdrawal_output_script_not_allowed_when_signing_with_owner_key_WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidIdentityCreditWithdrawalTransitionCoreFeeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_core_fee_error :: dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_core_fee_error_InvalidIdentityCreditWithdrawalTransitionCoreFeeError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityCreditWithdrawalTransitionCoreFeeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidIdentityCreditWithdrawalTransitionAmountError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_credit_withdrawal_transition_amount_error :: dpp_errors_consensus_basic_identity_invalid_identity_credit_withdrawal_transition_amount_error_InvalidIdentityCreditWithdrawalTransitionAmountError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityCreditWithdrawalTransitionAmountError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidIdentityUpdateTransitionEmptyError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_empty_error :: dpp_errors_consensus_basic_identity_invalid_identity_update_transition_empty_error_InvalidIdentityUpdateTransitionEmptyError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityUpdateTransitionEmptyError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidIdentityUpdateTransitionDisableKeysError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: invalid_identity_update_transition_disable_keys_error :: dpp_errors_consensus_basic_identity_invalid_identity_update_transition_disable_keys_error_InvalidIdentityUpdateTransitionDisableKeysError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidIdentityUpdateTransitionDisableKeysError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_NotImplementedIdentityCreditWithdrawalTransitionPoolingError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: not_implemented_identity_credit_withdrawal_transition_pooling_error :: dpp_errors_consensus_basic_identity_not_implemented_identity_credit_withdrawal_transition_pooling_error_NotImplementedIdentityCreditWithdrawalTransitionPoolingError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: NotImplementedIdentityCreditWithdrawalTransitionPoolingError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidStateTransitionTypeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: state_transition :: invalid_state_transition_type_error :: dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidStateTransitionTypeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_MissingStateTransitionTypeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: state_transition :: missing_state_transition_type_error :: dpp_errors_consensus_basic_state_transition_missing_state_transition_type_error_MissingStateTransitionTypeError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: MissingStateTransitionTypeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_DocumentFieldMaxSizeExceededError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: document_field_max_size_exceeded_error :: dpp_errors_consensus_basic_document_document_field_max_size_exceeded_error_DocumentFieldMaxSizeExceededError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: DocumentFieldMaxSizeExceededError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_StateTransitionMaxSizeExceededError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: state_transition :: state_transition_max_size_exceeded_error :: dpp_errors_consensus_basic_state_transition_state_transition_max_size_exceeded_error_StateTransitionMaxSizeExceededError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: StateTransitionMaxSizeExceededError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_DocumentTransitionsAreAbsentError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: document_transitions_are_absent_error :: dpp_errors_consensus_basic_document_document_transitions_are_absent_error_DocumentTransitionsAreAbsentError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: DocumentTransitionsAreAbsentError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_IdentityCreditTransferToSelfError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: identity :: identity_credit_transfer_to_self_error :: dpp_errors_consensus_basic_identity_identity_credit_transfer_to_self_error_IdentityCreditTransferToSelfError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: IdentityCreditTransferToSelfError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidDocumentTypeNameError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_document_type_name_error :: dpp_errors_consensus_basic_data_contract_invalid_document_type_name_error_InvalidDocumentTypeNameError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidDocumentTypeNameError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_IncompatibleDocumentTypeSchemaError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: incompatible_document_type_schema_error :: dpp_errors_consensus_basic_data_contract_incompatible_document_type_schema_error_IncompatibleDocumentTypeSchemaError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: IncompatibleDocumentTypeSchemaError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_ContestedUniqueIndexOnMutableDocumentTypeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_on_mutable_document_type_error :: dpp_errors_consensus_basic_data_contract_contested_unique_index_on_mutable_document_type_error_ContestedUniqueIndexOnMutableDocumentTypeError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: ContestedUniqueIndexOnMutableDocumentTypeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_ContestedUniqueIndexWithUniqueIndexError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: contested_unique_index_with_unique_index_error :: dpp_errors_consensus_basic_data_contract_contested_unique_index_with_unique_index_error_ContestedUniqueIndexWithUniqueIndexError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: ContestedUniqueIndexWithUniqueIndexError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_OverflowError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: overflow_error :: dpp_errors_consensus_basic_overflow_error_OverflowError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: OverflowError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_UnsupportedFeatureError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: unsupported_feature_error :: dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: UnsupportedFeatureError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_ContestedDocumentsTemporarilyNotAllowedError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: contested_documents_temporarily_not_allowed_error :: dpp_errors_consensus_basic_document_contested_documents_temporarily_not_allowed_error_ContestedDocumentsTemporarilyNotAllowedError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: ContestedDocumentsTemporarilyNotAllowedError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_DataContractTokenConfigurationUpdateError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: data_contract_token_configuration_update_error :: dpp_errors_consensus_basic_data_contract_data_contract_token_configuration_update_error_DataContractTokenConfigurationUpdateError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: DataContractTokenConfigurationUpdateError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_NonContiguousContractTokenPositionsError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_token_positions_error :: dpp_errors_consensus_basic_data_contract_non_contiguous_contract_token_positions_error_NonContiguousContractTokenPositionsError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: NonContiguousContractTokenPositionsError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_NonContiguousContractGroupPositionsError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: non_contiguous_contract_group_positions_error :: dpp_errors_consensus_basic_data_contract_non_contiguous_contract_group_positions_error_NonContiguousContractGroupPositionsError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: NonContiguousContractGroupPositionsError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidTokenBaseSupplyError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_base_supply_error :: dpp_errors_consensus_basic_data_contract_invalid_token_base_supply_error_InvalidTokenBaseSupplyError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenBaseSupplyError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidTokenIdError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_id_error :: dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenIdError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidTokenAmountError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_amount_error :: dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenAmountError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidTokenPositionError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_position_error :: dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenPositionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidTokenConfigUpdateNoChangeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_config_update_no_change_error :: dpp_errors_consensus_basic_token_invalid_token_config_update_no_change_error_InvalidTokenConfigUpdateNoChangeError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenConfigUpdateNoChangeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidTokenDistributionFunctionDivideByZeroError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_divide_by_zero_error :: dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_divide_by_zero_error_InvalidTokenDistributionFunctionDivideByZeroError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenDistributionFunctionDivideByZeroError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidTokenDistributionFunctionInvalidParameterError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_error :: dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_error_InvalidTokenDistributionFunctionInvalidParameterError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenDistributionFunctionInvalidParameterError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidTokenDistributionFunctionInvalidParameterTupleError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_invalid_parameter_tuple_error :: dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_invalid_parameter_tuple_error_InvalidTokenDistributionFunctionInvalidParameterTupleError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenDistributionFunctionInvalidParameterTupleError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidTokenDistributionFunctionIncoherenceError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: invalid_token_distribution_function_incoherence_error :: dpp_errors_consensus_basic_data_contract_invalid_token_distribution_function_incoherence_error_InvalidTokenDistributionFunctionIncoherenceError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenDistributionFunctionIncoherenceError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_TokenTransferToOurselfError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: token_transfer_to_ourselves_error :: dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: TokenTransferToOurselfError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidTokenNoteTooBigError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_token_note_too_big_error :: dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidTokenNoteTooBigError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_ContractHasNoTokensError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: contract_has_no_tokens_error :: dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: ContractHasNoTokensError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_GroupPositionDoesNotExistError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_position_does_not_exist_error :: dpp_errors_consensus_basic_data_contract_group_position_does_not_exist_error_GroupPositionDoesNotExistError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: GroupPositionDoesNotExistError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_InvalidActionIdError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: invalid_action_id_error :: dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: InvalidActionIdError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_DestinationIdentityForTokenMintingNotSetError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: destination_identity_for_token_minting_not_set_error :: dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: DestinationIdentityForTokenMintingNotSetError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_ChoosingTokenMintRecipientNotAllowedError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: choosing_token_mint_recipient_not_allowed_error :: dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: ChoosingTokenMintRecipientNotAllowedError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_GroupActionNotAllowedOnTransitionError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: group :: group_action_not_allowed_on_transition_error :: dpp_errors_consensus_basic_group_group_action_not_allowed_on_transition_error_GroupActionNotAllowedOnTransitionError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: GroupActionNotAllowedOnTransitionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_GroupExceedsMaxMembersError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_exceeds_max_members_error :: dpp_errors_consensus_basic_data_contract_group_exceeds_max_members_error_GroupExceedsMaxMembersError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: GroupExceedsMaxMembersError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_GroupMemberHasPowerOfZeroError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_of_zero_error :: dpp_errors_consensus_basic_data_contract_group_member_has_power_of_zero_error_GroupMemberHasPowerOfZeroError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: GroupMemberHasPowerOfZeroError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_GroupMemberHasPowerOverLimitError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_member_has_power_over_limit_error :: dpp_errors_consensus_basic_data_contract_group_member_has_power_over_limit_error_GroupMemberHasPowerOverLimitError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: GroupMemberHasPowerOverLimitError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_GroupTotalPowerLessThanRequiredError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_total_power_has_less_than_required_power_error :: dpp_errors_consensus_basic_data_contract_group_total_power_has_less_than_required_power_error_GroupTotalPowerLessThanRequiredError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: GroupTotalPowerLessThanRequiredError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: group_non_unilateral_member_power_has_less_than_required_power_error :: dpp_errors_consensus_basic_data_contract_group_non_unilateral_member_power_has_less_than_required_power_error_GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_MissingDefaultLocalizationError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: token :: missing_default_localization :: dpp_errors_consensus_basic_token_missing_default_localization_MissingDefaultLocalizationError) -> * mut dpp_errors_consensus_basic_basic_error_BasicError { ferment :: boxed (dpp_errors_consensus_basic_basic_error_BasicError :: MissingDefaultLocalizationError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_basic_error_BasicError_destroy < > (ffi : * mut dpp_errors_consensus_basic_basic_error_BasicError) { ferment :: unbox_any (ffi) ; } } pub mod invalid_identifier_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIdentifierError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError { pub identifier_name : * mut std :: os :: raw :: c_char , pub message : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: invalid_identifier_error :: InvalidIdentifierError > for dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError) -> dpp :: errors :: consensus :: basic :: invalid_identifier_error :: InvalidIdentifierError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: invalid_identifier_error :: InvalidIdentifierError { identifier_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . identifier_name) , message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . message) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: invalid_identifier_error :: InvalidIdentifierError > for dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: invalid_identifier_error :: InvalidIdentifierError) -> * const dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError { ferment :: boxed (dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError { identifier_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . identifier_name) , message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . message) }) } } impl Drop for dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . identifier_name) ; ferment :: unbox_string (ffi_ref . message) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError_ctor < > (identifier_name : * mut std :: os :: raw :: c_char , message : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError { ferment :: boxed (dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError { identifier_name , message }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError_destroy < > (ffi : * mut dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError_get_identifier_name < > (obj : * const dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError) -> * mut std :: os :: raw :: c_char { (* obj) . identifier_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError_get_message < > (obj : * const dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError) -> * mut std :: os :: raw :: c_char { (* obj) . message } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError_set_identifier_name < > (obj : * const dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError) -> * mut std :: os :: raw :: c_char { (* obj) . identifier_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError_set_message < > (obj : * const dpp_errors_consensus_basic_invalid_identifier_error_InvalidIdentifierError) -> * mut std :: os :: raw :: c_char { (* obj) . message } } pub mod unsupported_feature_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`UnsupportedFeatureError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError { pub feature_name : * mut std :: os :: raw :: c_char , pub current_protocol_version : u32 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: unsupported_feature_error :: UnsupportedFeatureError > for dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError) -> dpp :: errors :: consensus :: basic :: unsupported_feature_error :: UnsupportedFeatureError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: unsupported_feature_error :: UnsupportedFeatureError { feature_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . feature_name) , current_protocol_version : ffi_ref . current_protocol_version } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: unsupported_feature_error :: UnsupportedFeatureError > for dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: unsupported_feature_error :: UnsupportedFeatureError) -> * const dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError { ferment :: boxed (dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError { feature_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . feature_name) , current_protocol_version : obj . current_protocol_version }) } } impl Drop for dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . feature_name) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError_ctor < > (feature_name : * mut std :: os :: raw :: c_char , current_protocol_version : u32) -> * mut dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError { ferment :: boxed (dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError { feature_name , current_protocol_version }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError_destroy < > (ffi : * mut dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError_get_feature_name < > (obj : * const dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError) -> * mut std :: os :: raw :: c_char { (* obj) . feature_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError_get_current_protocol_version < > (obj : * const dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError) -> u32 { (* obj) . current_protocol_version } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError_set_feature_name < > (obj : * const dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError) -> * mut std :: os :: raw :: c_char { (* obj) . feature_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError_set_current_protocol_version < > (obj : * const dpp_errors_consensus_basic_unsupported_feature_error_UnsupportedFeatureError) -> u32 { (* obj) . current_protocol_version } } pub mod token { use crate as dash_spv_apple_bindings ; pub mod invalid_token_config_update_no_change_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidTokenConfigUpdateNoChangeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_token_invalid_token_config_update_no_change_error_InvalidTokenConfigUpdateNoChangeError { } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: invalid_token_config_update_no_change_error :: InvalidTokenConfigUpdateNoChangeError > for dpp_errors_consensus_basic_token_invalid_token_config_update_no_change_error_InvalidTokenConfigUpdateNoChangeError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_token_invalid_token_config_update_no_change_error_InvalidTokenConfigUpdateNoChangeError) -> dpp :: errors :: consensus :: basic :: token :: invalid_token_config_update_no_change_error :: InvalidTokenConfigUpdateNoChangeError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: token :: invalid_token_config_update_no_change_error :: InvalidTokenConfigUpdateNoChangeError { } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: invalid_token_config_update_no_change_error :: InvalidTokenConfigUpdateNoChangeError > for dpp_errors_consensus_basic_token_invalid_token_config_update_no_change_error_InvalidTokenConfigUpdateNoChangeError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: token :: invalid_token_config_update_no_change_error :: InvalidTokenConfigUpdateNoChangeError) -> * const dpp_errors_consensus_basic_token_invalid_token_config_update_no_change_error_InvalidTokenConfigUpdateNoChangeError { ferment :: boxed (dpp_errors_consensus_basic_token_invalid_token_config_update_no_change_error_InvalidTokenConfigUpdateNoChangeError { }) } } impl Drop for dpp_errors_consensus_basic_token_invalid_token_config_update_no_change_error_InvalidTokenConfigUpdateNoChangeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_config_update_no_change_error_InvalidTokenConfigUpdateNoChangeError_ctor < > () -> * mut dpp_errors_consensus_basic_token_invalid_token_config_update_no_change_error_InvalidTokenConfigUpdateNoChangeError { ferment :: boxed (dpp_errors_consensus_basic_token_invalid_token_config_update_no_change_error_InvalidTokenConfigUpdateNoChangeError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_config_update_no_change_error_InvalidTokenConfigUpdateNoChangeError_destroy < > (ffi : * mut dpp_errors_consensus_basic_token_invalid_token_config_update_no_change_error_InvalidTokenConfigUpdateNoChangeError) { ferment :: unbox_any (ffi) ; } } pub mod destination_identity_for_token_minting_not_set_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DestinationIdentityForTokenMintingNotSetError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError { pub token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: destination_identity_for_token_minting_not_set_error :: DestinationIdentityForTokenMintingNotSetError > for dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError) -> dpp :: errors :: consensus :: basic :: token :: destination_identity_for_token_minting_not_set_error :: DestinationIdentityForTokenMintingNotSetError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: token :: destination_identity_for_token_minting_not_set_error :: DestinationIdentityForTokenMintingNotSetError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . token_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: destination_identity_for_token_minting_not_set_error :: DestinationIdentityForTokenMintingNotSetError > for dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: token :: destination_identity_for_token_minting_not_set_error :: DestinationIdentityForTokenMintingNotSetError) -> * const dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError { ferment :: boxed (dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . token_id) }) } } impl Drop for dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . token_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError_ctor < > (token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError { ferment :: boxed (dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError { token_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError_destroy < > (ffi : * mut dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError_get_token_id < > (obj : * const dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError_set_token_id < > (obj : * const dpp_errors_consensus_basic_token_destination_identity_for_token_minting_not_set_error_DestinationIdentityForTokenMintingNotSetError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } } pub mod invalid_token_amount_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidTokenAmountError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError { pub max_token_amount : u64 , pub token_amount : u64 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: invalid_token_amount_error :: InvalidTokenAmountError > for dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError) -> dpp :: errors :: consensus :: basic :: token :: invalid_token_amount_error :: InvalidTokenAmountError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: token :: invalid_token_amount_error :: InvalidTokenAmountError { max_token_amount : ffi_ref . max_token_amount , token_amount : ffi_ref . token_amount } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: invalid_token_amount_error :: InvalidTokenAmountError > for dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: token :: invalid_token_amount_error :: InvalidTokenAmountError) -> * const dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError { ferment :: boxed (dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError { max_token_amount : obj . max_token_amount , token_amount : obj . token_amount }) } } impl Drop for dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError_ctor < > (max_token_amount : u64 , token_amount : u64) -> * mut dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError { ferment :: boxed (dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError { max_token_amount , token_amount }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError_destroy < > (ffi : * mut dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError_get_max_token_amount < > (obj : * const dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError) -> u64 { (* obj) . max_token_amount } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError_get_token_amount < > (obj : * const dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError) -> u64 { (* obj) . token_amount } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError_set_max_token_amount < > (obj : * const dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError) -> u64 { (* obj) . max_token_amount } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError_set_token_amount < > (obj : * const dpp_errors_consensus_basic_token_invalid_token_amount_error_InvalidTokenAmountError) -> u64 { (* obj) . token_amount } } pub mod token_transfer_to_ourselves_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TokenTransferToOurselfError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError { pub token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: token_transfer_to_ourselves_error :: TokenTransferToOurselfError > for dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError) -> dpp :: errors :: consensus :: basic :: token :: token_transfer_to_ourselves_error :: TokenTransferToOurselfError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: token :: token_transfer_to_ourselves_error :: TokenTransferToOurselfError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . token_id) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: token_transfer_to_ourselves_error :: TokenTransferToOurselfError > for dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: token :: token_transfer_to_ourselves_error :: TokenTransferToOurselfError) -> * const dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError { ferment :: boxed (dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . token_id) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) }) } } impl Drop for dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . token_id) ; ferment :: unbox_any (ffi_ref . identity_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError_ctor < > (token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError { ferment :: boxed (dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError { token_id , identity_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError_destroy < > (ffi : * mut dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError_get_token_id < > (obj : * const dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError_get_identity_id < > (obj : * const dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError_set_token_id < > (obj : * const dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError_set_identity_id < > (obj : * const dpp_errors_consensus_basic_token_token_transfer_to_ourselves_error_TokenTransferToOurselfError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } } pub mod invalid_action_id_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidActionIdError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError { pub expected_action_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub invalid_action_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: invalid_action_id_error :: InvalidActionIdError > for dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError) -> dpp :: errors :: consensus :: basic :: token :: invalid_action_id_error :: InvalidActionIdError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: token :: invalid_action_id_error :: InvalidActionIdError { expected_action_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . expected_action_id) , invalid_action_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . invalid_action_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: invalid_action_id_error :: InvalidActionIdError > for dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: token :: invalid_action_id_error :: InvalidActionIdError) -> * const dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError { ferment :: boxed (dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError { expected_action_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . expected_action_id) , invalid_action_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . invalid_action_id) }) } } impl Drop for dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . expected_action_id) ; ferment :: unbox_any (ffi_ref . invalid_action_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError_ctor < > (expected_action_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , invalid_action_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError { ferment :: boxed (dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError { expected_action_id , invalid_action_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError_destroy < > (ffi : * mut dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError_get_expected_action_id < > (obj : * const dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . expected_action_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError_get_invalid_action_id < > (obj : * const dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . invalid_action_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError_set_expected_action_id < > (obj : * const dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . expected_action_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError_set_invalid_action_id < > (obj : * const dpp_errors_consensus_basic_token_invalid_action_id_error_InvalidActionIdError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . invalid_action_id } } pub mod missing_default_localization { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MissingDefaultLocalizationError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_token_missing_default_localization_MissingDefaultLocalizationError { } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: missing_default_localization :: MissingDefaultLocalizationError > for dpp_errors_consensus_basic_token_missing_default_localization_MissingDefaultLocalizationError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_token_missing_default_localization_MissingDefaultLocalizationError) -> dpp :: errors :: consensus :: basic :: token :: missing_default_localization :: MissingDefaultLocalizationError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: token :: missing_default_localization :: MissingDefaultLocalizationError { } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: missing_default_localization :: MissingDefaultLocalizationError > for dpp_errors_consensus_basic_token_missing_default_localization_MissingDefaultLocalizationError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: token :: missing_default_localization :: MissingDefaultLocalizationError) -> * const dpp_errors_consensus_basic_token_missing_default_localization_MissingDefaultLocalizationError { ferment :: boxed (dpp_errors_consensus_basic_token_missing_default_localization_MissingDefaultLocalizationError { }) } } impl Drop for dpp_errors_consensus_basic_token_missing_default_localization_MissingDefaultLocalizationError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_missing_default_localization_MissingDefaultLocalizationError_ctor < > () -> * mut dpp_errors_consensus_basic_token_missing_default_localization_MissingDefaultLocalizationError { ferment :: boxed (dpp_errors_consensus_basic_token_missing_default_localization_MissingDefaultLocalizationError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_missing_default_localization_MissingDefaultLocalizationError_destroy < > (ffi : * mut dpp_errors_consensus_basic_token_missing_default_localization_MissingDefaultLocalizationError) { ferment :: unbox_any (ffi) ; } } pub mod invalid_token_note_too_big_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidTokenNoteTooBigError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError { pub max_note_length : u32 , pub note_type : * mut std :: os :: raw :: c_char , pub note_length : u32 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: invalid_token_note_too_big_error :: InvalidTokenNoteTooBigError > for dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError) -> dpp :: errors :: consensus :: basic :: token :: invalid_token_note_too_big_error :: InvalidTokenNoteTooBigError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: token :: invalid_token_note_too_big_error :: InvalidTokenNoteTooBigError { max_note_length : ffi_ref . max_note_length , note_type : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . note_type) , note_length : ffi_ref . note_length } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: invalid_token_note_too_big_error :: InvalidTokenNoteTooBigError > for dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: token :: invalid_token_note_too_big_error :: InvalidTokenNoteTooBigError) -> * const dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError { ferment :: boxed (dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError { max_note_length : obj . max_note_length , note_type : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . note_type) , note_length : obj . note_length }) } } impl Drop for dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_string (ffi_ref . note_type) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError_ctor < > (max_note_length : u32 , note_type : * mut std :: os :: raw :: c_char , note_length : u32) -> * mut dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError { ferment :: boxed (dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError { max_note_length , note_type , note_length }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError_destroy < > (ffi : * mut dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError_get_max_note_length < > (obj : * const dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError) -> u32 { (* obj) . max_note_length } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError_get_note_type < > (obj : * const dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError) -> * mut std :: os :: raw :: c_char { (* obj) . note_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError_get_note_length < > (obj : * const dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError) -> u32 { (* obj) . note_length } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError_set_max_note_length < > (obj : * const dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError) -> u32 { (* obj) . max_note_length } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError_set_note_type < > (obj : * const dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError) -> * mut std :: os :: raw :: c_char { (* obj) . note_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError_set_note_length < > (obj : * const dpp_errors_consensus_basic_token_invalid_token_note_too_big_error_InvalidTokenNoteTooBigError) -> u32 { (* obj) . note_length } } pub mod choosing_token_mint_recipient_not_allowed_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ChoosingTokenMintRecipientNotAllowedError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError { pub token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: choosing_token_mint_recipient_not_allowed_error :: ChoosingTokenMintRecipientNotAllowedError > for dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError) -> dpp :: errors :: consensus :: basic :: token :: choosing_token_mint_recipient_not_allowed_error :: ChoosingTokenMintRecipientNotAllowedError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: token :: choosing_token_mint_recipient_not_allowed_error :: ChoosingTokenMintRecipientNotAllowedError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . token_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: choosing_token_mint_recipient_not_allowed_error :: ChoosingTokenMintRecipientNotAllowedError > for dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: token :: choosing_token_mint_recipient_not_allowed_error :: ChoosingTokenMintRecipientNotAllowedError) -> * const dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError { ferment :: boxed (dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . token_id) }) } } impl Drop for dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . token_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError_ctor < > (token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError { ferment :: boxed (dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError { token_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError_destroy < > (ffi : * mut dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError_get_token_id < > (obj : * const dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError_set_token_id < > (obj : * const dpp_errors_consensus_basic_token_choosing_token_mint_recipient_not_allowed_error_ChoosingTokenMintRecipientNotAllowedError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } } pub mod invalid_token_id_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidTokenIdError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError { pub expected_token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub invalid_token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: invalid_token_id_error :: InvalidTokenIdError > for dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError) -> dpp :: errors :: consensus :: basic :: token :: invalid_token_id_error :: InvalidTokenIdError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: token :: invalid_token_id_error :: InvalidTokenIdError { expected_token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . expected_token_id) , invalid_token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . invalid_token_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: invalid_token_id_error :: InvalidTokenIdError > for dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: token :: invalid_token_id_error :: InvalidTokenIdError) -> * const dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError { ferment :: boxed (dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError { expected_token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . expected_token_id) , invalid_token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . invalid_token_id) }) } } impl Drop for dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . expected_token_id) ; ferment :: unbox_any (ffi_ref . invalid_token_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError_ctor < > (expected_token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , invalid_token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError { ferment :: boxed (dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError { expected_token_id , invalid_token_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError_destroy < > (ffi : * mut dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError_get_expected_token_id < > (obj : * const dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . expected_token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError_get_invalid_token_id < > (obj : * const dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . invalid_token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError_set_expected_token_id < > (obj : * const dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . expected_token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError_set_invalid_token_id < > (obj : * const dpp_errors_consensus_basic_token_invalid_token_id_error_InvalidTokenIdError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . invalid_token_id } } pub mod invalid_token_position_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidTokenPositionError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError { pub max_token_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition , pub invalid_token_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: invalid_token_position_error :: InvalidTokenPositionError > for dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError) -> dpp :: errors :: consensus :: basic :: token :: invalid_token_position_error :: InvalidTokenPositionError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: token :: invalid_token_position_error :: InvalidTokenPositionError { max_token_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition as ferment :: FFIConversionFrom < dpp :: data_contract :: TokenContractPosition >> :: ffi_from (ffi_ref . max_token_position) , invalid_token_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition as ferment :: FFIConversionFrom < dpp :: data_contract :: TokenContractPosition >> :: ffi_from (ffi_ref . invalid_token_position) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: invalid_token_position_error :: InvalidTokenPositionError > for dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: token :: invalid_token_position_error :: InvalidTokenPositionError) -> * const dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError { ferment :: boxed (dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError { max_token_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition as ferment :: FFIConversionTo < dpp :: data_contract :: TokenContractPosition >> :: ffi_to (obj . max_token_position) , invalid_token_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition as ferment :: FFIConversionTo < dpp :: data_contract :: TokenContractPosition >> :: ffi_to (obj . invalid_token_position) }) } } impl Drop for dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . max_token_position) ; ferment :: unbox_any (ffi_ref . invalid_token_position) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError_ctor < > (max_token_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition , invalid_token_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition) -> * mut dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError { ferment :: boxed (dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError { max_token_position , invalid_token_position }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError_destroy < > (ffi : * mut dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError_get_max_token_position < > (obj : * const dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition { (* obj) . max_token_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError_get_invalid_token_position < > (obj : * const dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition { (* obj) . invalid_token_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError_set_max_token_position < > (obj : * const dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition { (* obj) . max_token_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError_set_invalid_token_position < > (obj : * const dpp_errors_consensus_basic_token_invalid_token_position_error_InvalidTokenPositionError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition { (* obj) . invalid_token_position } } pub mod contract_has_no_tokens_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ContractHasNoTokensError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError { pub contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: token :: contract_has_no_tokens_error :: ContractHasNoTokensError > for dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError) -> dpp :: errors :: consensus :: basic :: token :: contract_has_no_tokens_error :: ContractHasNoTokensError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: token :: contract_has_no_tokens_error :: ContractHasNoTokensError { contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . contract_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: token :: contract_has_no_tokens_error :: ContractHasNoTokensError > for dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: token :: contract_has_no_tokens_error :: ContractHasNoTokensError) -> * const dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError { ferment :: boxed (dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError { contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . contract_id) }) } } impl Drop for dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . contract_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError_ctor < > (contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError { ferment :: boxed (dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError { contract_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError_destroy < > (ffi : * mut dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError_get_contract_id < > (obj : * const dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError_set_contract_id < > (obj : * const dpp_errors_consensus_basic_token_contract_has_no_tokens_error_ContractHasNoTokensError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . contract_id } } } pub mod unsupported_protocol_version_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`UnsupportedProtocolVersionError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError { pub parsed_protocol_version : u32 , pub latest_version : u32 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: unsupported_protocol_version_error :: UnsupportedProtocolVersionError > for dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError) -> dpp :: errors :: consensus :: basic :: unsupported_protocol_version_error :: UnsupportedProtocolVersionError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: basic :: unsupported_protocol_version_error :: UnsupportedProtocolVersionError { parsed_protocol_version : ffi_ref . parsed_protocol_version , latest_version : ffi_ref . latest_version } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: unsupported_protocol_version_error :: UnsupportedProtocolVersionError > for dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: basic :: unsupported_protocol_version_error :: UnsupportedProtocolVersionError) -> * const dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError { ferment :: boxed (dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError { parsed_protocol_version : obj . parsed_protocol_version , latest_version : obj . latest_version }) } } impl Drop for dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError_ctor < > (parsed_protocol_version : u32 , latest_version : u32) -> * mut dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError { ferment :: boxed (dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError { parsed_protocol_version , latest_version }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError_destroy < > (ffi : * mut dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError_get_parsed_protocol_version < > (obj : * const dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError) -> u32 { (* obj) . parsed_protocol_version } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError_get_latest_version < > (obj : * const dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError) -> u32 { (* obj) . latest_version } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError_set_parsed_protocol_version < > (obj : * const dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError) -> u32 { (* obj) . parsed_protocol_version } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError_set_latest_version < > (obj : * const dpp_errors_consensus_basic_unsupported_protocol_version_error_UnsupportedProtocolVersionError) -> u32 { (* obj) . latest_version } } } pub mod state { use crate as dash_spv_apple_bindings ; pub mod token { use crate as dash_spv_apple_bindings ; pub mod invalid_token_claim_property_mismatch { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidTokenClaimPropertyMismatch`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch { pub property : * mut std :: os :: raw :: c_char , pub token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: invalid_token_claim_property_mismatch :: InvalidTokenClaimPropertyMismatch > for dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch) -> dpp :: errors :: consensus :: state :: token :: invalid_token_claim_property_mismatch :: InvalidTokenClaimPropertyMismatch { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: token :: invalid_token_claim_property_mismatch :: InvalidTokenClaimPropertyMismatch { property : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . property) , token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . token_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: invalid_token_claim_property_mismatch :: InvalidTokenClaimPropertyMismatch > for dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: token :: invalid_token_claim_property_mismatch :: InvalidTokenClaimPropertyMismatch) -> * const dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch { ferment :: boxed (dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch { property : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . property) , token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . token_id) }) } } impl Drop for dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . property) ; ferment :: unbox_any (ffi_ref . token_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch_ctor < > (property : * mut std :: os :: raw :: c_char , token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch { ferment :: boxed (dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch { property , token_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch_destroy < > (ffi : * mut dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch_get_property < > (obj : * const dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch) -> * mut std :: os :: raw :: c_char { (* obj) . property } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch_get_token_id < > (obj : * const dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch_set_property < > (obj : * const dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch) -> * mut std :: os :: raw :: c_char { (* obj) . property } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch_set_token_id < > (obj : * const dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } } pub mod token_already_paused_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TokenAlreadyPausedError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError { pub token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub action : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: token_already_paused_error :: TokenAlreadyPausedError > for dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError) -> dpp :: errors :: consensus :: state :: token :: token_already_paused_error :: TokenAlreadyPausedError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: token :: token_already_paused_error :: TokenAlreadyPausedError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . token_id) , action : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . action) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: token_already_paused_error :: TokenAlreadyPausedError > for dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: token :: token_already_paused_error :: TokenAlreadyPausedError) -> * const dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError { ferment :: boxed (dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . token_id) , action : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . action) }) } } impl Drop for dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . token_id) ; ferment :: unbox_string (ffi_ref . action) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError_ctor < > (token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , action : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError { ferment :: boxed (dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError { token_id , action }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError_destroy < > (ffi : * mut dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError_get_token_id < > (obj : * const dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError_get_action < > (obj : * const dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError) -> * mut std :: os :: raw :: c_char { (* obj) . action } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError_set_token_id < > (obj : * const dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError_set_action < > (obj : * const dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError) -> * mut std :: os :: raw :: c_char { (* obj) . action } } pub mod new_tokens_destination_identity_does_not_exist_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`NewTokensDestinationIdentityDoesNotExistError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError { pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: new_tokens_destination_identity_does_not_exist_error :: NewTokensDestinationIdentityDoesNotExistError > for dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError) -> dpp :: errors :: consensus :: state :: token :: new_tokens_destination_identity_does_not_exist_error :: NewTokensDestinationIdentityDoesNotExistError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: token :: new_tokens_destination_identity_does_not_exist_error :: NewTokensDestinationIdentityDoesNotExistError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: new_tokens_destination_identity_does_not_exist_error :: NewTokensDestinationIdentityDoesNotExistError > for dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: token :: new_tokens_destination_identity_does_not_exist_error :: NewTokensDestinationIdentityDoesNotExistError) -> * const dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError { ferment :: boxed (dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) }) } } impl Drop for dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . identity_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError_ctor < > (identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError { ferment :: boxed (dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError { identity_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError_destroy < > (ffi : * mut dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError_get_identity_id < > (obj : * const dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError_set_identity_id < > (obj : * const dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } } pub mod identity_token_account_not_frozen_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityTokenAccountNotFrozenError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError { pub token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub action : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: identity_token_account_not_frozen_error :: IdentityTokenAccountNotFrozenError > for dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError) -> dpp :: errors :: consensus :: state :: token :: identity_token_account_not_frozen_error :: IdentityTokenAccountNotFrozenError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: token :: identity_token_account_not_frozen_error :: IdentityTokenAccountNotFrozenError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . token_id) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) , action : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . action) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: identity_token_account_not_frozen_error :: IdentityTokenAccountNotFrozenError > for dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: token :: identity_token_account_not_frozen_error :: IdentityTokenAccountNotFrozenError) -> * const dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError { ferment :: boxed (dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . token_id) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) , action : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . action) }) } } impl Drop for dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . token_id) ; ferment :: unbox_any (ffi_ref . identity_id) ; ferment :: unbox_string (ffi_ref . action) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError_ctor < > (token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , action : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError { ferment :: boxed (dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError { token_id , identity_id , action }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError_destroy < > (ffi : * mut dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError_get_token_id < > (obj : * const dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError_get_identity_id < > (obj : * const dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError_get_action < > (obj : * const dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError) -> * mut std :: os :: raw :: c_char { (* obj) . action } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError_set_token_id < > (obj : * const dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError_set_identity_id < > (obj : * const dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError_set_action < > (obj : * const dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError) -> * mut std :: os :: raw :: c_char { (* obj) . action } } pub mod token_mint_past_max_supply_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TokenMintPastMaxSupplyError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError { pub token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub amount : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount , pub current_supply : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount , pub max_supply : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: token_mint_past_max_supply_error :: TokenMintPastMaxSupplyError > for dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError) -> dpp :: errors :: consensus :: state :: token :: token_mint_past_max_supply_error :: TokenMintPastMaxSupplyError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: token :: token_mint_past_max_supply_error :: TokenMintPastMaxSupplyError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . token_id) , amount : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionFrom < dpp :: balances :: credits :: TokenAmount >> :: ffi_from (ffi_ref . amount) , current_supply : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionFrom < dpp :: balances :: credits :: TokenAmount >> :: ffi_from (ffi_ref . current_supply) , max_supply : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionFrom < dpp :: balances :: credits :: TokenAmount >> :: ffi_from (ffi_ref . max_supply) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: token_mint_past_max_supply_error :: TokenMintPastMaxSupplyError > for dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: token :: token_mint_past_max_supply_error :: TokenMintPastMaxSupplyError) -> * const dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError { ferment :: boxed (dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . token_id) , amount : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionTo < dpp :: balances :: credits :: TokenAmount >> :: ffi_to (obj . amount) , current_supply : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionTo < dpp :: balances :: credits :: TokenAmount >> :: ffi_to (obj . current_supply) , max_supply : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionTo < dpp :: balances :: credits :: TokenAmount >> :: ffi_to (obj . max_supply) }) } } impl Drop for dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . token_id) ; ferment :: unbox_any (ffi_ref . amount) ; ferment :: unbox_any (ffi_ref . current_supply) ; ferment :: unbox_any (ffi_ref . max_supply) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError_ctor < > (token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , amount : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount , current_supply : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount , max_supply : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount) -> * mut dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError { ferment :: boxed (dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError { token_id , amount , current_supply , max_supply }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError_destroy < > (ffi : * mut dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError_get_token_id < > (obj : * const dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError_get_amount < > (obj : * const dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount { (* obj) . amount } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError_get_current_supply < > (obj : * const dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount { (* obj) . current_supply } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError_get_max_supply < > (obj : * const dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount { (* obj) . max_supply } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError_set_token_id < > (obj : * const dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError_set_amount < > (obj : * const dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount { (* obj) . amount } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError_set_current_supply < > (obj : * const dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount { (* obj) . current_supply } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError_set_max_supply < > (obj : * const dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount { (* obj) . max_supply } } pub mod invalid_group_position_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidGroupPositionError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError { pub max_group_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition , pub invalid_group_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: invalid_group_position_error :: InvalidGroupPositionError > for dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError) -> dpp :: errors :: consensus :: state :: token :: invalid_group_position_error :: InvalidGroupPositionError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: token :: invalid_group_position_error :: InvalidGroupPositionError { max_group_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionFrom < dpp :: data_contract :: GroupContractPosition >> :: ffi_from_opt (ffi_ref . max_group_position) , invalid_group_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionFrom < dpp :: data_contract :: GroupContractPosition >> :: ffi_from (ffi_ref . invalid_group_position) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: invalid_group_position_error :: InvalidGroupPositionError > for dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: token :: invalid_group_position_error :: InvalidGroupPositionError) -> * const dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError { ferment :: boxed (dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError { max_group_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionTo < dpp :: data_contract :: GroupContractPosition >> :: ffi_to_opt (obj . max_group_position) , invalid_group_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionTo < dpp :: data_contract :: GroupContractPosition >> :: ffi_to (obj . invalid_group_position) }) } } impl Drop for dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any_opt (ffi_ref . max_group_position) ; ferment :: unbox_any (ffi_ref . invalid_group_position) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError_ctor < > (max_group_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition , invalid_group_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition) -> * mut dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError { ferment :: boxed (dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError { max_group_position , invalid_group_position }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError_destroy < > (ffi : * mut dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError_get_max_group_position < > (obj : * const dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . max_group_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError_get_invalid_group_position < > (obj : * const dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . invalid_group_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError_set_max_group_position < > (obj : * const dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . max_group_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError_set_invalid_group_position < > (obj : * const dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . invalid_group_position } } pub mod identity_token_account_already_frozen_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityTokenAccountAlreadyFrozenError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError { pub token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub action : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: identity_token_account_already_frozen_error :: IdentityTokenAccountAlreadyFrozenError > for dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError) -> dpp :: errors :: consensus :: state :: token :: identity_token_account_already_frozen_error :: IdentityTokenAccountAlreadyFrozenError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: token :: identity_token_account_already_frozen_error :: IdentityTokenAccountAlreadyFrozenError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . token_id) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) , action : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . action) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: identity_token_account_already_frozen_error :: IdentityTokenAccountAlreadyFrozenError > for dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: token :: identity_token_account_already_frozen_error :: IdentityTokenAccountAlreadyFrozenError) -> * const dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError { ferment :: boxed (dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . token_id) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) , action : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . action) }) } } impl Drop for dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . token_id) ; ferment :: unbox_any (ffi_ref . identity_id) ; ferment :: unbox_string (ffi_ref . action) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError_ctor < > (token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , action : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError { ferment :: boxed (dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError { token_id , identity_id , action }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError_destroy < > (ffi : * mut dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError_get_token_id < > (obj : * const dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError_get_identity_id < > (obj : * const dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError_get_action < > (obj : * const dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError) -> * mut std :: os :: raw :: c_char { (* obj) . action } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError_set_token_id < > (obj : * const dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError_set_identity_id < > (obj : * const dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError_set_action < > (obj : * const dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError) -> * mut std :: os :: raw :: c_char { (* obj) . action } } pub mod invalid_token_claim_wrong_claimant { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidTokenClaimWrongClaimant`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant { pub token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub expected_claimant_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub claimant_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: invalid_token_claim_wrong_claimant :: InvalidTokenClaimWrongClaimant > for dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant) -> dpp :: errors :: consensus :: state :: token :: invalid_token_claim_wrong_claimant :: InvalidTokenClaimWrongClaimant { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: token :: invalid_token_claim_wrong_claimant :: InvalidTokenClaimWrongClaimant { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . token_id) , expected_claimant_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . expected_claimant_id) , claimant_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . claimant_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: invalid_token_claim_wrong_claimant :: InvalidTokenClaimWrongClaimant > for dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: token :: invalid_token_claim_wrong_claimant :: InvalidTokenClaimWrongClaimant) -> * const dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant { ferment :: boxed (dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . token_id) , expected_claimant_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . expected_claimant_id) , claimant_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . claimant_id) }) } } impl Drop for dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . token_id) ; ferment :: unbox_any (ffi_ref . expected_claimant_id) ; ferment :: unbox_any (ffi_ref . claimant_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant_ctor < > (token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , expected_claimant_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , claimant_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant { ferment :: boxed (dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant { token_id , expected_claimant_id , claimant_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant_destroy < > (ffi : * mut dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant_get_token_id < > (obj : * const dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant_get_expected_claimant_id < > (obj : * const dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . expected_claimant_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant_get_claimant_id < > (obj : * const dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . claimant_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant_set_token_id < > (obj : * const dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant_set_expected_claimant_id < > (obj : * const dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . expected_claimant_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant_set_claimant_id < > (obj : * const dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . claimant_id } } pub mod new_authorized_action_taker_main_group_not_set_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`NewAuthorizedActionTakerMainGroupNotSetError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_token_new_authorized_action_taker_main_group_not_set_error_NewAuthorizedActionTakerMainGroupNotSetError { } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_main_group_not_set_error :: NewAuthorizedActionTakerMainGroupNotSetError > for dpp_errors_consensus_state_token_new_authorized_action_taker_main_group_not_set_error_NewAuthorizedActionTakerMainGroupNotSetError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_token_new_authorized_action_taker_main_group_not_set_error_NewAuthorizedActionTakerMainGroupNotSetError) -> dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_main_group_not_set_error :: NewAuthorizedActionTakerMainGroupNotSetError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_main_group_not_set_error :: NewAuthorizedActionTakerMainGroupNotSetError { } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_main_group_not_set_error :: NewAuthorizedActionTakerMainGroupNotSetError > for dpp_errors_consensus_state_token_new_authorized_action_taker_main_group_not_set_error_NewAuthorizedActionTakerMainGroupNotSetError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_main_group_not_set_error :: NewAuthorizedActionTakerMainGroupNotSetError) -> * const dpp_errors_consensus_state_token_new_authorized_action_taker_main_group_not_set_error_NewAuthorizedActionTakerMainGroupNotSetError { ferment :: boxed (dpp_errors_consensus_state_token_new_authorized_action_taker_main_group_not_set_error_NewAuthorizedActionTakerMainGroupNotSetError { }) } } impl Drop for dpp_errors_consensus_state_token_new_authorized_action_taker_main_group_not_set_error_NewAuthorizedActionTakerMainGroupNotSetError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_new_authorized_action_taker_main_group_not_set_error_NewAuthorizedActionTakerMainGroupNotSetError_ctor < > () -> * mut dpp_errors_consensus_state_token_new_authorized_action_taker_main_group_not_set_error_NewAuthorizedActionTakerMainGroupNotSetError { ferment :: boxed (dpp_errors_consensus_state_token_new_authorized_action_taker_main_group_not_set_error_NewAuthorizedActionTakerMainGroupNotSetError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_new_authorized_action_taker_main_group_not_set_error_NewAuthorizedActionTakerMainGroupNotSetError_destroy < > (ffi : * mut dpp_errors_consensus_state_token_new_authorized_action_taker_main_group_not_set_error_NewAuthorizedActionTakerMainGroupNotSetError) { ferment :: unbox_any (ffi) ; } } pub mod token_not_paused_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TokenNotPausedError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError { pub token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub action : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: token_not_paused_error :: TokenNotPausedError > for dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError) -> dpp :: errors :: consensus :: state :: token :: token_not_paused_error :: TokenNotPausedError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: token :: token_not_paused_error :: TokenNotPausedError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . token_id) , action : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . action) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: token_not_paused_error :: TokenNotPausedError > for dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: token :: token_not_paused_error :: TokenNotPausedError) -> * const dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError { ferment :: boxed (dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . token_id) , action : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . action) }) } } impl Drop for dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . token_id) ; ferment :: unbox_string (ffi_ref . action) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError_ctor < > (token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , action : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError { ferment :: boxed (dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError { token_id , action }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError_destroy < > (ffi : * mut dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError_get_token_id < > (obj : * const dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError_get_action < > (obj : * const dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError) -> * mut std :: os :: raw :: c_char { (* obj) . action } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError_set_token_id < > (obj : * const dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError_set_action < > (obj : * const dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError) -> * mut std :: os :: raw :: c_char { (* obj) . action } } pub mod token_is_paused_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TokenIsPausedError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError { pub token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: token_is_paused_error :: TokenIsPausedError > for dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError) -> dpp :: errors :: consensus :: state :: token :: token_is_paused_error :: TokenIsPausedError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: token :: token_is_paused_error :: TokenIsPausedError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . token_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: token_is_paused_error :: TokenIsPausedError > for dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: token :: token_is_paused_error :: TokenIsPausedError) -> * const dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError { ferment :: boxed (dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . token_id) }) } } impl Drop for dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . token_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError_ctor < > (token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError { ferment :: boxed (dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError { token_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError_destroy < > (ffi : * mut dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError_get_token_id < > (obj : * const dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError_set_token_id < > (obj : * const dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } } pub mod token_setting_max_supply_to_less_than_current_supply_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TokenSettingMaxSupplyToLessThanCurrentSupplyError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError { pub token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub max_supply : u64 , pub current_supply : u64 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: token_setting_max_supply_to_less_than_current_supply_error :: TokenSettingMaxSupplyToLessThanCurrentSupplyError > for dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError) -> dpp :: errors :: consensus :: state :: token :: token_setting_max_supply_to_less_than_current_supply_error :: TokenSettingMaxSupplyToLessThanCurrentSupplyError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: token :: token_setting_max_supply_to_less_than_current_supply_error :: TokenSettingMaxSupplyToLessThanCurrentSupplyError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . token_id) , max_supply : ffi_ref . max_supply , current_supply : ffi_ref . current_supply } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: token_setting_max_supply_to_less_than_current_supply_error :: TokenSettingMaxSupplyToLessThanCurrentSupplyError > for dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: token :: token_setting_max_supply_to_less_than_current_supply_error :: TokenSettingMaxSupplyToLessThanCurrentSupplyError) -> * const dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError { ferment :: boxed (dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . token_id) , max_supply : obj . max_supply , current_supply : obj . current_supply }) } } impl Drop for dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . token_id) ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError_ctor < > (token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , max_supply : u64 , current_supply : u64) -> * mut dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError { ferment :: boxed (dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError { token_id , max_supply , current_supply }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError_destroy < > (ffi : * mut dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError_get_token_id < > (obj : * const dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError_get_max_supply < > (obj : * const dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError) -> u64 { (* obj) . max_supply } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError_get_current_supply < > (obj : * const dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError) -> u64 { (* obj) . current_supply } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError_set_token_id < > (obj : * const dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError_set_max_supply < > (obj : * const dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError) -> u64 { (* obj) . max_supply } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError_set_current_supply < > (obj : * const dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError) -> u64 { (* obj) . current_supply } } pub mod new_authorized_action_taker_identity_does_not_exist_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`NewAuthorizedActionTakerIdentityDoesNotExistError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError { pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_identity_does_not_exist_error :: NewAuthorizedActionTakerIdentityDoesNotExistError > for dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError) -> dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_identity_does_not_exist_error :: NewAuthorizedActionTakerIdentityDoesNotExistError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_identity_does_not_exist_error :: NewAuthorizedActionTakerIdentityDoesNotExistError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_identity_does_not_exist_error :: NewAuthorizedActionTakerIdentityDoesNotExistError > for dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_identity_does_not_exist_error :: NewAuthorizedActionTakerIdentityDoesNotExistError) -> * const dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError { ferment :: boxed (dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) }) } } impl Drop for dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . identity_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError_ctor < > (identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError { ferment :: boxed (dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError { identity_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError_destroy < > (ffi : * mut dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError_get_identity_id < > (obj : * const dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError_set_identity_id < > (obj : * const dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } } pub mod invalid_token_claim_no_current_rewards { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidTokenClaimNoCurrentRewards`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards { pub token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub recipient_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub current_moment : * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment , pub last_claimed_moment : * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: invalid_token_claim_no_current_rewards :: InvalidTokenClaimNoCurrentRewards > for dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards) -> dpp :: errors :: consensus :: state :: token :: invalid_token_claim_no_current_rewards :: InvalidTokenClaimNoCurrentRewards { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: token :: invalid_token_claim_no_current_rewards :: InvalidTokenClaimNoCurrentRewards { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . token_id) , recipient_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . recipient_id) , current_moment : < crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment as ferment :: FFIConversionFrom < dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: RewardDistributionMoment >> :: ffi_from (ffi_ref . current_moment) , last_claimed_moment : < crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment as ferment :: FFIConversionFrom < dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: RewardDistributionMoment >> :: ffi_from_opt (ffi_ref . last_claimed_moment) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: invalid_token_claim_no_current_rewards :: InvalidTokenClaimNoCurrentRewards > for dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: token :: invalid_token_claim_no_current_rewards :: InvalidTokenClaimNoCurrentRewards) -> * const dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards { ferment :: boxed (dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . token_id) , recipient_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . recipient_id) , current_moment : < crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment as ferment :: FFIConversionTo < dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: RewardDistributionMoment >> :: ffi_to (obj . current_moment) , last_claimed_moment : < crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment as ferment :: FFIConversionTo < dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: RewardDistributionMoment >> :: ffi_to_opt (obj . last_claimed_moment) }) } } impl Drop for dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . token_id) ; ferment :: unbox_any (ffi_ref . recipient_id) ; ferment :: unbox_any (ffi_ref . current_moment) ; ferment :: unbox_any_opt (ffi_ref . last_claimed_moment) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards_ctor < > (token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , recipient_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , current_moment : * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment , last_claimed_moment : * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment) -> * mut dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards { ferment :: boxed (dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards { token_id , recipient_id , current_moment , last_claimed_moment }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards_destroy < > (ffi : * mut dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards_get_token_id < > (obj : * const dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards_get_recipient_id < > (obj : * const dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . recipient_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards_get_current_moment < > (obj : * const dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards) -> * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment { (* obj) . current_moment } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards_get_last_claimed_moment < > (obj : * const dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards) -> * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment { (* obj) . last_claimed_moment } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards_set_token_id < > (obj : * const dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards_set_recipient_id < > (obj : * const dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . recipient_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards_set_current_moment < > (obj : * const dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards) -> * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment { (* obj) . current_moment } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards_set_last_claimed_moment < > (obj : * const dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards) -> * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment { (* obj) . last_claimed_moment } } pub mod identity_token_account_frozen_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityTokenAccountFrozenError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError { pub token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub action : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: identity_token_account_frozen_error :: IdentityTokenAccountFrozenError > for dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError) -> dpp :: errors :: consensus :: state :: token :: identity_token_account_frozen_error :: IdentityTokenAccountFrozenError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: token :: identity_token_account_frozen_error :: IdentityTokenAccountFrozenError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . token_id) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) , action : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . action) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: identity_token_account_frozen_error :: IdentityTokenAccountFrozenError > for dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: token :: identity_token_account_frozen_error :: IdentityTokenAccountFrozenError) -> * const dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError { ferment :: boxed (dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . token_id) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) , action : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . action) }) } } impl Drop for dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . token_id) ; ferment :: unbox_any (ffi_ref . identity_id) ; ferment :: unbox_string (ffi_ref . action) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError_ctor < > (token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , action : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError { ferment :: boxed (dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError { token_id , identity_id , action }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError_destroy < > (ffi : * mut dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError_get_token_id < > (obj : * const dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError_get_identity_id < > (obj : * const dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError_get_action < > (obj : * const dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError) -> * mut std :: os :: raw :: c_char { (* obj) . action } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError_set_token_id < > (obj : * const dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError_set_identity_id < > (obj : * const dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError_set_action < > (obj : * const dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError) -> * mut std :: os :: raw :: c_char { (* obj) . action } } pub mod identity_does_not_have_enough_token_balance_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityDoesNotHaveEnoughTokenBalanceError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError { pub token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub required_balance : u64 , pub actual_balance : u64 , pub action : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: identity_does_not_have_enough_token_balance_error :: IdentityDoesNotHaveEnoughTokenBalanceError > for dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError) -> dpp :: errors :: consensus :: state :: token :: identity_does_not_have_enough_token_balance_error :: IdentityDoesNotHaveEnoughTokenBalanceError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: token :: identity_does_not_have_enough_token_balance_error :: IdentityDoesNotHaveEnoughTokenBalanceError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . token_id) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) , required_balance : ffi_ref . required_balance , actual_balance : ffi_ref . actual_balance , action : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . action) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: identity_does_not_have_enough_token_balance_error :: IdentityDoesNotHaveEnoughTokenBalanceError > for dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: token :: identity_does_not_have_enough_token_balance_error :: IdentityDoesNotHaveEnoughTokenBalanceError) -> * const dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError { ferment :: boxed (dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . token_id) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) , required_balance : obj . required_balance , actual_balance : obj . actual_balance , action : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . action) }) } } impl Drop for dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . token_id) ; ferment :: unbox_any (ffi_ref . identity_id) ; ; ; ferment :: unbox_string (ffi_ref . action) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError_ctor < > (token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , required_balance : u64 , actual_balance : u64 , action : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError { ferment :: boxed (dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError { token_id , identity_id , required_balance , actual_balance , action }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError_destroy < > (ffi : * mut dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError_get_token_id < > (obj : * const dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError_get_identity_id < > (obj : * const dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError_get_required_balance < > (obj : * const dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError) -> u64 { (* obj) . required_balance } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError_get_actual_balance < > (obj : * const dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError) -> u64 { (* obj) . actual_balance } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError_get_action < > (obj : * const dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError) -> * mut std :: os :: raw :: c_char { (* obj) . action } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError_set_token_id < > (obj : * const dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError_set_identity_id < > (obj : * const dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError_set_required_balance < > (obj : * const dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError) -> u64 { (* obj) . required_balance } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError_set_actual_balance < > (obj : * const dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError) -> u64 { (* obj) . actual_balance } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError_set_action < > (obj : * const dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError) -> * mut std :: os :: raw :: c_char { (* obj) . action } } pub mod unauthorized_token_action_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`UnauthorizedTokenActionError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError { pub token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub action : * mut std :: os :: raw :: c_char , pub authorized_action_takers : * mut crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: authorized_action_takers :: dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: unauthorized_token_action_error :: UnauthorizedTokenActionError > for dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError) -> dpp :: errors :: consensus :: state :: token :: unauthorized_token_action_error :: UnauthorizedTokenActionError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: token :: unauthorized_token_action_error :: UnauthorizedTokenActionError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . token_id) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) , action : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . action) , authorized_action_takers : < crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: authorized_action_takers :: dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers as ferment :: FFIConversionFrom < dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers >> :: ffi_from (ffi_ref . authorized_action_takers) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: unauthorized_token_action_error :: UnauthorizedTokenActionError > for dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: token :: unauthorized_token_action_error :: UnauthorizedTokenActionError) -> * const dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError { ferment :: boxed (dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError { token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . token_id) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) , action : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . action) , authorized_action_takers : < crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: authorized_action_takers :: dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers as ferment :: FFIConversionTo < dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers >> :: ffi_to (obj . authorized_action_takers) }) } } impl Drop for dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . token_id) ; ferment :: unbox_any (ffi_ref . identity_id) ; ferment :: unbox_string (ffi_ref . action) ; ferment :: unbox_any (ffi_ref . authorized_action_takers) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError_ctor < > (token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , action : * mut std :: os :: raw :: c_char , authorized_action_takers : * mut crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: authorized_action_takers :: dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers) -> * mut dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError { ferment :: boxed (dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError { token_id , identity_id , action , authorized_action_takers }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError_destroy < > (ffi : * mut dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError_get_token_id < > (obj : * const dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError_get_identity_id < > (obj : * const dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError_get_action < > (obj : * const dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError) -> * mut std :: os :: raw :: c_char { (* obj) . action } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError_get_authorized_action_takers < > (obj : * const dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: authorized_action_takers :: dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers { (* obj) . authorized_action_takers } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError_set_token_id < > (obj : * const dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError_set_identity_id < > (obj : * const dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError_set_action < > (obj : * const dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError) -> * mut std :: os :: raw :: c_char { (* obj) . action } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError_set_authorized_action_takers < > (obj : * const dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: authorized_action_takers :: dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers { (* obj) . authorized_action_takers } } pub mod new_authorized_action_taker_group_does_not_exist_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`NewAuthorizedActionTakerGroupDoesNotExistError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError { pub group_contract_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_group_does_not_exist_error :: NewAuthorizedActionTakerGroupDoesNotExistError > for dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError) -> dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_group_does_not_exist_error :: NewAuthorizedActionTakerGroupDoesNotExistError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_group_does_not_exist_error :: NewAuthorizedActionTakerGroupDoesNotExistError { group_contract_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionFrom < dpp :: data_contract :: GroupContractPosition >> :: ffi_from (ffi_ref . group_contract_position) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_group_does_not_exist_error :: NewAuthorizedActionTakerGroupDoesNotExistError > for dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_group_does_not_exist_error :: NewAuthorizedActionTakerGroupDoesNotExistError) -> * const dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError { ferment :: boxed (dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError { group_contract_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionTo < dpp :: data_contract :: GroupContractPosition >> :: ffi_to (obj . group_contract_position) }) } } impl Drop for dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . group_contract_position) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError_ctor < > (group_contract_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition) -> * mut dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError { ferment :: boxed (dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError { group_contract_position }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError_destroy < > (ffi : * mut dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError_get_group_contract_position < > (obj : * const dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . group_contract_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError_set_group_contract_position < > (obj : * const dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . group_contract_position } } } pub mod prefunded_specialized_balances { use crate as dash_spv_apple_bindings ; pub mod prefunded_specialized_balance_not_found_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`PrefundedSpecializedBalanceNotFoundError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError { pub balance_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_not_found_error :: PrefundedSpecializedBalanceNotFoundError > for dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError) -> dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_not_found_error :: PrefundedSpecializedBalanceNotFoundError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_not_found_error :: PrefundedSpecializedBalanceNotFoundError { balance_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . balance_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_not_found_error :: PrefundedSpecializedBalanceNotFoundError > for dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_not_found_error :: PrefundedSpecializedBalanceNotFoundError) -> * const dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError { ferment :: boxed (dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError { balance_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . balance_id) }) } } impl Drop for dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . balance_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError_ctor < > (balance_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError { ferment :: boxed (dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError { balance_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError_destroy < > (ffi : * mut dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError_get_balance_id < > (obj : * const dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . balance_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError_set_balance_id < > (obj : * const dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . balance_id } } pub mod prefunded_specialized_balance_insufficient_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`PrefundedSpecializedBalanceInsufficientError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError { pub balance_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub balance : u64 , pub required_balance : u64 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_insufficient_error :: PrefundedSpecializedBalanceInsufficientError > for dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError) -> dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_insufficient_error :: PrefundedSpecializedBalanceInsufficientError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_insufficient_error :: PrefundedSpecializedBalanceInsufficientError { balance_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . balance_id) , balance : ffi_ref . balance , required_balance : ffi_ref . required_balance } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_insufficient_error :: PrefundedSpecializedBalanceInsufficientError > for dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_insufficient_error :: PrefundedSpecializedBalanceInsufficientError) -> * const dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError { ferment :: boxed (dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError { balance_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . balance_id) , balance : obj . balance , required_balance : obj . required_balance }) } } impl Drop for dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . balance_id) ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError_ctor < > (balance_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , balance : u64 , required_balance : u64) -> * mut dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError { ferment :: boxed (dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError { balance_id , balance , required_balance }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError_destroy < > (ffi : * mut dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError_get_balance_id < > (obj : * const dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . balance_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError_get_balance < > (obj : * const dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError) -> u64 { (* obj) . balance } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError_get_required_balance < > (obj : * const dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError) -> u64 { (* obj) . required_balance } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError_set_balance_id < > (obj : * const dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . balance_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError_set_balance < > (obj : * const dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError) -> u64 { (* obj) . balance } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError_set_required_balance < > (obj : * const dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError) -> u64 { (* obj) . required_balance } } } pub mod data_contract { use crate as dash_spv_apple_bindings ; pub mod data_contract_already_present_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractAlreadyPresentError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError { pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_contract :: data_contract_already_present_error :: DataContractAlreadyPresentError > for dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError) -> dpp :: errors :: consensus :: state :: data_contract :: data_contract_already_present_error :: DataContractAlreadyPresentError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: data_contract :: data_contract_already_present_error :: DataContractAlreadyPresentError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_contract :: data_contract_already_present_error :: DataContractAlreadyPresentError > for dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: data_contract :: data_contract_already_present_error :: DataContractAlreadyPresentError) -> * const dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError { ferment :: boxed (dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) }) } } impl Drop for dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data_contract_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError_ctor < > (data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError { ferment :: boxed (dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError { data_contract_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError_destroy < > (ffi : * mut dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError_get_data_contract_id < > (obj : * const dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError_set_data_contract_id < > (obj : * const dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } } pub mod data_contract_config_update_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractConfigUpdateError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError { pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub additional_message : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_contract :: data_contract_config_update_error :: DataContractConfigUpdateError > for dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError) -> dpp :: errors :: consensus :: state :: data_contract :: data_contract_config_update_error :: DataContractConfigUpdateError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: data_contract :: data_contract_config_update_error :: DataContractConfigUpdateError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) , additional_message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . additional_message) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_contract :: data_contract_config_update_error :: DataContractConfigUpdateError > for dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: data_contract :: data_contract_config_update_error :: DataContractConfigUpdateError) -> * const dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError { ferment :: boxed (dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) , additional_message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . additional_message) }) } } impl Drop for dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data_contract_id) ; ferment :: unbox_string (ffi_ref . additional_message) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError_ctor < > (data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , additional_message : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError { ferment :: boxed (dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError { data_contract_id , additional_message }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError_destroy < > (ffi : * mut dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError_get_data_contract_id < > (obj : * const dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError_get_additional_message < > (obj : * const dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . additional_message } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError_set_data_contract_id < > (obj : * const dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError_set_additional_message < > (obj : * const dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . additional_message } } pub mod data_contract_update_permission_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractUpdatePermissionError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError { pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_permission_error :: DataContractUpdatePermissionError > for dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError) -> dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_permission_error :: DataContractUpdatePermissionError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_permission_error :: DataContractUpdatePermissionError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_permission_error :: DataContractUpdatePermissionError > for dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_permission_error :: DataContractUpdatePermissionError) -> * const dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError { ferment :: boxed (dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) }) } } impl Drop for dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data_contract_id) ; ferment :: unbox_any (ffi_ref . identity_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError_ctor < > (data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError { ferment :: boxed (dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError { data_contract_id , identity_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError_destroy < > (ffi : * mut dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError_get_data_contract_id < > (obj : * const dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError_get_identity_id < > (obj : * const dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError_set_data_contract_id < > (obj : * const dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError_set_identity_id < > (obj : * const dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } } pub mod data_contract_is_readonly_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractIsReadonlyError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError { pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_contract :: data_contract_is_readonly_error :: DataContractIsReadonlyError > for dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError) -> dpp :: errors :: consensus :: state :: data_contract :: data_contract_is_readonly_error :: DataContractIsReadonlyError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: data_contract :: data_contract_is_readonly_error :: DataContractIsReadonlyError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_contract :: data_contract_is_readonly_error :: DataContractIsReadonlyError > for dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: data_contract :: data_contract_is_readonly_error :: DataContractIsReadonlyError) -> * const dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError { ferment :: boxed (dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) }) } } impl Drop for dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data_contract_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError_ctor < > (data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError { ferment :: boxed (dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError { data_contract_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError_destroy < > (ffi : * mut dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError_get_data_contract_id < > (obj : * const dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError_set_data_contract_id < > (obj : * const dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } } pub mod document_type_update_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentTypeUpdateError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError { pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub document_type_name : * mut std :: os :: raw :: c_char , pub additional_message : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_contract :: document_type_update_error :: DocumentTypeUpdateError > for dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError) -> dpp :: errors :: consensus :: state :: data_contract :: document_type_update_error :: DocumentTypeUpdateError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: data_contract :: document_type_update_error :: DocumentTypeUpdateError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) , document_type_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type_name) , additional_message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . additional_message) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_contract :: document_type_update_error :: DocumentTypeUpdateError > for dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: data_contract :: document_type_update_error :: DocumentTypeUpdateError) -> * const dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError { ferment :: boxed (dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) , document_type_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type_name) , additional_message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . additional_message) }) } } impl Drop for dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data_contract_id) ; ferment :: unbox_string (ffi_ref . document_type_name) ; ferment :: unbox_string (ffi_ref . additional_message) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError_ctor < > (data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , document_type_name : * mut std :: os :: raw :: c_char , additional_message : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError { ferment :: boxed (dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError { data_contract_id , document_type_name , additional_message }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError_destroy < > (ffi : * mut dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError_get_data_contract_id < > (obj : * const dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError_get_document_type_name < > (obj : * const dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError_get_additional_message < > (obj : * const dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . additional_message } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError_set_data_contract_id < > (obj : * const dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError_set_document_type_name < > (obj : * const dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . document_type_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError_set_additional_message < > (obj : * const dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . additional_message } } pub mod data_contract_update_action_not_allowed_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractUpdateActionNotAllowedError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError { pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub action : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_action_not_allowed_error :: DataContractUpdateActionNotAllowedError > for dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError) -> dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_action_not_allowed_error :: DataContractUpdateActionNotAllowedError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_action_not_allowed_error :: DataContractUpdateActionNotAllowedError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) , action : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . action) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_action_not_allowed_error :: DataContractUpdateActionNotAllowedError > for dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_action_not_allowed_error :: DataContractUpdateActionNotAllowedError) -> * const dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError { ferment :: boxed (dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) , action : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . action) }) } } impl Drop for dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data_contract_id) ; ferment :: unbox_string (ffi_ref . action) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError_ctor < > (data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , action : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError { ferment :: boxed (dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError { data_contract_id , action }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError_destroy < > (ffi : * mut dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError_get_data_contract_id < > (obj : * const dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError_get_action < > (obj : * const dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError) -> * mut std :: os :: raw :: c_char { (* obj) . action } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError_set_data_contract_id < > (obj : * const dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError_set_action < > (obj : * const dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError) -> * mut std :: os :: raw :: c_char { (* obj) . action } } } pub mod state_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`StateError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_errors_consensus_state_state_error_StateError { DataContractAlreadyPresentError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_already_present_error :: dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError) , # [cfg (feature = "state-transition-validation")] DataTriggerError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_trigger :: dpp_errors_consensus_state_data_trigger_DataTriggerError) , DocumentAlreadyPresentError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_already_present_error :: dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError) , DocumentContestCurrentlyLockedError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_currently_locked_error :: dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError) , DocumentContestNotJoinableError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_not_joinable_error :: dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError) , DocumentContestIdentityAlreadyContestantError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_identity_already_contestant :: dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError) , DocumentContestNotPaidForError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_not_paid_for_error :: dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError) , DocumentContestDocumentWithSameIdAlreadyPresentError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_document_with_same_id_already_present_error :: dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError) , DocumentNotFoundError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_not_found_error :: dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError) , DocumentNotForSaleError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_not_for_sale_error :: dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError) , DocumentIncorrectPurchasePriceError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_incorrect_purchase_price_error :: dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError) , DocumentOwnerIdMismatchError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_owner_id_mismatch_error :: dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError) , DocumentTimestampsMismatchError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_timestamps_mismatch_error :: dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError) , DocumentTimestampWindowViolationError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_timestamp_window_violation_error :: dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError) , DuplicateUniqueIndexError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: duplicate_unique_index_error :: dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError) , InvalidDocumentRevisionError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: invalid_document_revision_error :: dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError) , IdentityAlreadyExistsError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_already_exists_error :: dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError) , IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_public_key_already_exists_for_unique_contract_bounds_error :: dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError) , IdentityPublicKeyIsReadOnlyError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_read_only_error :: dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError) , MissingIdentityPublicKeyIdsError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: missing_identity_public_key_ids_error :: dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError) , MissingTransferKeyError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: missing_transfer_key_error :: dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError) , NoTransferKeyForCoreWithdrawalAvailableError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: no_transfer_key_for_core_withdrawal_available_error :: dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError) , InvalidIdentityPublicKeyIdError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: invalid_identity_public_key_id_error :: dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError) , InvalidIdentityRevisionError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: invalid_identity_revision_error :: dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError) , InvalidIdentityNonceError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: invalid_identity_contract_nonce_error :: dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError) , MaxIdentityPublicKeyLimitReachedError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: max_identity_public_key_limit_reached_error :: dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError) , DuplicatedIdentityPublicKeyStateError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_state_error :: dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError) , DuplicatedIdentityPublicKeyIdStateError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_id_state_error :: dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError) , IdentityPublicKeyIsDisabledError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_disabled_error :: dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError) , IdentityInsufficientBalanceError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_insufficient_balance_error :: dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError) , DocumentTimestampsAreEqualError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_timestamps_are_equal_error :: dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError) , DataContractIsReadonlyError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_is_readonly_error :: dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError) , DataContractConfigUpdateError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_config_update_error :: dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError) , DocumentTypeUpdateError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: document_type_update_error :: dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError) , PrefundedSpecializedBalanceInsufficientError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_insufficient_error :: dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError) , PrefundedSpecializedBalanceNotFoundError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_not_found_error :: dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError) , DataContractUpdatePermissionError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_permission_error :: dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError) , MasternodeNotFoundError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_not_found_error :: dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError) , MasternodeIncorrectVoterIdentityIdError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voter_identity_id_error :: dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError) , MasternodeIncorrectVotingAddressError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voting_address_error :: dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError) , VotePollNotFoundError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: vote_poll_not_found_error :: dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError) , VotePollNotAvailableForVotingError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: vote_poll_not_available_for_voting_error :: dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError) , MasternodeVotedTooManyTimesError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_voted_too_many_times :: dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError) , MasternodeVoteAlreadyPresentError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_vote_already_present_error :: dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError) , RecipientIdentityDoesNotExistError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: recipient_identity_does_not_exist_error :: dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError) , IdentityDoesNotHaveEnoughTokenBalanceError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: identity_does_not_have_enough_token_balance_error :: dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError) , UnauthorizedTokenActionError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: unauthorized_token_action_error :: dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError) , IdentityTokenAccountFrozenError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: identity_token_account_frozen_error :: dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError) , IdentityTokenAccountNotFrozenError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: identity_token_account_not_frozen_error :: dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError) , IdentityNotMemberOfGroupError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: group :: identity_not_member_of_group_error :: dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError) , GroupActionDoesNotExistError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: group :: group_action_does_not_exist_error :: dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError) , GroupActionAlreadyCompletedError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: group :: group_action_already_completed_error :: dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError) , GroupActionAlreadySignedByIdentityError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: group :: group_action_already_signed_by_identity_error :: dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError) , DataContractUpdateActionNotAllowedError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_action_not_allowed_error :: dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError) , TokenSettingMaxSupplyToLessThanCurrentSupplyError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_setting_max_supply_to_less_than_current_supply_error :: dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError) , TokenMintPastMaxSupplyError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_mint_past_max_supply_error :: dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError) , InvalidTokenClaimPropertyMismatch (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: invalid_token_claim_property_mismatch :: dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch) , InvalidTokenClaimNoCurrentRewards (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: invalid_token_claim_no_current_rewards :: dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards) , InvalidTokenClaimWrongClaimant (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: invalid_token_claim_wrong_claimant :: dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant) , NewTokensDestinationIdentityDoesNotExistError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: new_tokens_destination_identity_does_not_exist_error :: dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError) , NewAuthorizedActionTakerIdentityDoesNotExistError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_identity_does_not_exist_error :: dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError) , NewAuthorizedActionTakerGroupDoesNotExistError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_group_does_not_exist_error :: dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError) , NewAuthorizedActionTakerMainGroupNotSetError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_main_group_not_set_error :: dpp_errors_consensus_state_token_new_authorized_action_taker_main_group_not_set_error_NewAuthorizedActionTakerMainGroupNotSetError) , InvalidGroupPositionError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: invalid_group_position_error :: dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError) , TokenIsPausedError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_is_paused_error :: dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError) , IdentityTokenAccountAlreadyFrozenError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: identity_token_account_already_frozen_error :: dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError) , TokenAlreadyPausedError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_already_paused_error :: dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError) , TokenNotPausedError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_not_paused_error :: dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError) } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: state_error :: StateError > for dpp_errors_consensus_state_state_error_StateError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_state_error_StateError) -> dpp :: errors :: consensus :: state :: state_error :: StateError { let ffi_ref = & * ffi ; match ffi_ref { dpp_errors_consensus_state_state_error_StateError :: DataContractAlreadyPresentError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DataContractAlreadyPresentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_already_present_error :: dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_contract :: data_contract_already_present_error :: DataContractAlreadyPresentError >> :: ffi_from (* o_0)) , # [cfg (feature = "state-transition-validation")] dpp_errors_consensus_state_state_error_StateError :: DataTriggerError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DataTriggerError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_trigger :: dpp_errors_consensus_state_data_trigger_DataTriggerError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_trigger :: DataTriggerError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DocumentAlreadyPresentError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentAlreadyPresentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_already_present_error :: dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_already_present_error :: DocumentAlreadyPresentError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DocumentContestCurrentlyLockedError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentContestCurrentlyLockedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_currently_locked_error :: dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_contest_currently_locked_error :: DocumentContestCurrentlyLockedError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DocumentContestNotJoinableError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentContestNotJoinableError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_not_joinable_error :: dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_contest_not_joinable_error :: DocumentContestNotJoinableError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DocumentContestIdentityAlreadyContestantError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentContestIdentityAlreadyContestantError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_identity_already_contestant :: dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_contest_identity_already_contestant :: DocumentContestIdentityAlreadyContestantError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DocumentContestNotPaidForError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentContestNotPaidForError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_not_paid_for_error :: dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_contest_not_paid_for_error :: DocumentContestNotPaidForError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DocumentContestDocumentWithSameIdAlreadyPresentError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentContestDocumentWithSameIdAlreadyPresentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_document_with_same_id_already_present_error :: dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_contest_document_with_same_id_already_present_error :: DocumentContestDocumentWithSameIdAlreadyPresentError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DocumentNotFoundError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentNotFoundError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_not_found_error :: dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_not_found_error :: DocumentNotFoundError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DocumentNotForSaleError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentNotForSaleError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_not_for_sale_error :: dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_not_for_sale_error :: DocumentNotForSaleError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DocumentIncorrectPurchasePriceError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentIncorrectPurchasePriceError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_incorrect_purchase_price_error :: dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_incorrect_purchase_price_error :: DocumentIncorrectPurchasePriceError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DocumentOwnerIdMismatchError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentOwnerIdMismatchError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_owner_id_mismatch_error :: dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_owner_id_mismatch_error :: DocumentOwnerIdMismatchError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DocumentTimestampsMismatchError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentTimestampsMismatchError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_timestamps_mismatch_error :: dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_timestamps_mismatch_error :: DocumentTimestampsMismatchError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DocumentTimestampWindowViolationError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentTimestampWindowViolationError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_timestamp_window_violation_error :: dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_timestamp_window_violation_error :: DocumentTimestampWindowViolationError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DuplicateUniqueIndexError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DuplicateUniqueIndexError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: duplicate_unique_index_error :: dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: duplicate_unique_index_error :: DuplicateUniqueIndexError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: InvalidDocumentRevisionError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: InvalidDocumentRevisionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: invalid_document_revision_error :: dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: invalid_document_revision_error :: InvalidDocumentRevisionError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: IdentityAlreadyExistsError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityAlreadyExistsError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_already_exists_error :: dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: identity_already_exists_error :: IdentityAlreadyExistsError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_public_key_already_exists_for_unique_contract_bounds_error :: dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: identity_public_key_already_exists_for_unique_contract_bounds_error :: IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: IdentityPublicKeyIsReadOnlyError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityPublicKeyIsReadOnlyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_read_only_error :: dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_read_only_error :: IdentityPublicKeyIsReadOnlyError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: MissingIdentityPublicKeyIdsError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: MissingIdentityPublicKeyIdsError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: missing_identity_public_key_ids_error :: dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: missing_identity_public_key_ids_error :: MissingIdentityPublicKeyIdsError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: MissingTransferKeyError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: MissingTransferKeyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: missing_transfer_key_error :: dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: missing_transfer_key_error :: MissingTransferKeyError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: NoTransferKeyForCoreWithdrawalAvailableError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: NoTransferKeyForCoreWithdrawalAvailableError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: no_transfer_key_for_core_withdrawal_available_error :: dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: no_transfer_key_for_core_withdrawal_available_error :: NoTransferKeyForCoreWithdrawalAvailableError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: InvalidIdentityPublicKeyIdError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: InvalidIdentityPublicKeyIdError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: invalid_identity_public_key_id_error :: dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: invalid_identity_public_key_id_error :: InvalidIdentityPublicKeyIdError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: InvalidIdentityRevisionError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: InvalidIdentityRevisionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: invalid_identity_revision_error :: dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: invalid_identity_revision_error :: InvalidIdentityRevisionError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: InvalidIdentityNonceError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: InvalidIdentityNonceError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: invalid_identity_contract_nonce_error :: dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: invalid_identity_contract_nonce_error :: InvalidIdentityNonceError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: MaxIdentityPublicKeyLimitReachedError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: MaxIdentityPublicKeyLimitReachedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: max_identity_public_key_limit_reached_error :: dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: max_identity_public_key_limit_reached_error :: MaxIdentityPublicKeyLimitReachedError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DuplicatedIdentityPublicKeyStateError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DuplicatedIdentityPublicKeyStateError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_state_error :: dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_state_error :: DuplicatedIdentityPublicKeyStateError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DuplicatedIdentityPublicKeyIdStateError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DuplicatedIdentityPublicKeyIdStateError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_id_state_error :: dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_id_state_error :: DuplicatedIdentityPublicKeyIdStateError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: IdentityPublicKeyIsDisabledError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityPublicKeyIsDisabledError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_disabled_error :: dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_disabled_error :: IdentityPublicKeyIsDisabledError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: IdentityInsufficientBalanceError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityInsufficientBalanceError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_insufficient_balance_error :: dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: identity_insufficient_balance_error :: IdentityInsufficientBalanceError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DocumentTimestampsAreEqualError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentTimestampsAreEqualError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_timestamps_are_equal_error :: dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_timestamps_are_equal_error :: DocumentTimestampsAreEqualError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DataContractIsReadonlyError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DataContractIsReadonlyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_is_readonly_error :: dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_contract :: data_contract_is_readonly_error :: DataContractIsReadonlyError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DataContractConfigUpdateError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DataContractConfigUpdateError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_config_update_error :: dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_contract :: data_contract_config_update_error :: DataContractConfigUpdateError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DocumentTypeUpdateError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentTypeUpdateError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: document_type_update_error :: dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_contract :: document_type_update_error :: DocumentTypeUpdateError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: PrefundedSpecializedBalanceInsufficientError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: PrefundedSpecializedBalanceInsufficientError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_insufficient_error :: dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_insufficient_error :: PrefundedSpecializedBalanceInsufficientError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: PrefundedSpecializedBalanceNotFoundError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: PrefundedSpecializedBalanceNotFoundError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_not_found_error :: dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_not_found_error :: PrefundedSpecializedBalanceNotFoundError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DataContractUpdatePermissionError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DataContractUpdatePermissionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_permission_error :: dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_permission_error :: DataContractUpdatePermissionError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: MasternodeNotFoundError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: MasternodeNotFoundError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_not_found_error :: dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: voting :: masternode_not_found_error :: MasternodeNotFoundError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: MasternodeIncorrectVoterIdentityIdError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: MasternodeIncorrectVoterIdentityIdError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voter_identity_id_error :: dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voter_identity_id_error :: MasternodeIncorrectVoterIdentityIdError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: MasternodeIncorrectVotingAddressError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: MasternodeIncorrectVotingAddressError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voting_address_error :: dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voting_address_error :: MasternodeIncorrectVotingAddressError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: VotePollNotFoundError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: VotePollNotFoundError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: vote_poll_not_found_error :: dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: voting :: vote_poll_not_found_error :: VotePollNotFoundError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: VotePollNotAvailableForVotingError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: VotePollNotAvailableForVotingError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: vote_poll_not_available_for_voting_error :: dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: voting :: vote_poll_not_available_for_voting_error :: VotePollNotAvailableForVotingError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: MasternodeVotedTooManyTimesError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: MasternodeVotedTooManyTimesError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_voted_too_many_times :: dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: voting :: masternode_voted_too_many_times :: MasternodeVotedTooManyTimesError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: MasternodeVoteAlreadyPresentError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: MasternodeVoteAlreadyPresentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_vote_already_present_error :: dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: voting :: masternode_vote_already_present_error :: MasternodeVoteAlreadyPresentError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: RecipientIdentityDoesNotExistError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: RecipientIdentityDoesNotExistError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: recipient_identity_does_not_exist_error :: dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: recipient_identity_does_not_exist_error :: RecipientIdentityDoesNotExistError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: IdentityDoesNotHaveEnoughTokenBalanceError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityDoesNotHaveEnoughTokenBalanceError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: identity_does_not_have_enough_token_balance_error :: dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: identity_does_not_have_enough_token_balance_error :: IdentityDoesNotHaveEnoughTokenBalanceError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: UnauthorizedTokenActionError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: UnauthorizedTokenActionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: unauthorized_token_action_error :: dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: unauthorized_token_action_error :: UnauthorizedTokenActionError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: IdentityTokenAccountFrozenError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityTokenAccountFrozenError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: identity_token_account_frozen_error :: dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: identity_token_account_frozen_error :: IdentityTokenAccountFrozenError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: IdentityTokenAccountNotFrozenError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityTokenAccountNotFrozenError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: identity_token_account_not_frozen_error :: dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: identity_token_account_not_frozen_error :: IdentityTokenAccountNotFrozenError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: IdentityNotMemberOfGroupError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityNotMemberOfGroupError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: group :: identity_not_member_of_group_error :: dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: group :: identity_not_member_of_group_error :: IdentityNotMemberOfGroupError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: GroupActionDoesNotExistError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: GroupActionDoesNotExistError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: group :: group_action_does_not_exist_error :: dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: group :: group_action_does_not_exist_error :: GroupActionDoesNotExistError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: GroupActionAlreadyCompletedError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: GroupActionAlreadyCompletedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: group :: group_action_already_completed_error :: dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: group :: group_action_already_completed_error :: GroupActionAlreadyCompletedError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: GroupActionAlreadySignedByIdentityError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: GroupActionAlreadySignedByIdentityError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: group :: group_action_already_signed_by_identity_error :: dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: group :: group_action_already_signed_by_identity_error :: GroupActionAlreadySignedByIdentityError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: DataContractUpdateActionNotAllowedError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: DataContractUpdateActionNotAllowedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_action_not_allowed_error :: dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_action_not_allowed_error :: DataContractUpdateActionNotAllowedError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: TokenSettingMaxSupplyToLessThanCurrentSupplyError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: TokenSettingMaxSupplyToLessThanCurrentSupplyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_setting_max_supply_to_less_than_current_supply_error :: dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: token_setting_max_supply_to_less_than_current_supply_error :: TokenSettingMaxSupplyToLessThanCurrentSupplyError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: TokenMintPastMaxSupplyError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: TokenMintPastMaxSupplyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_mint_past_max_supply_error :: dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: token_mint_past_max_supply_error :: TokenMintPastMaxSupplyError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: InvalidTokenClaimPropertyMismatch (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: InvalidTokenClaimPropertyMismatch (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: invalid_token_claim_property_mismatch :: dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: invalid_token_claim_property_mismatch :: InvalidTokenClaimPropertyMismatch >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: InvalidTokenClaimNoCurrentRewards (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: InvalidTokenClaimNoCurrentRewards (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: invalid_token_claim_no_current_rewards :: dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: invalid_token_claim_no_current_rewards :: InvalidTokenClaimNoCurrentRewards >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: InvalidTokenClaimWrongClaimant (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: InvalidTokenClaimWrongClaimant (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: invalid_token_claim_wrong_claimant :: dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: invalid_token_claim_wrong_claimant :: InvalidTokenClaimWrongClaimant >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: NewTokensDestinationIdentityDoesNotExistError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: NewTokensDestinationIdentityDoesNotExistError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: new_tokens_destination_identity_does_not_exist_error :: dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: new_tokens_destination_identity_does_not_exist_error :: NewTokensDestinationIdentityDoesNotExistError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: NewAuthorizedActionTakerIdentityDoesNotExistError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: NewAuthorizedActionTakerIdentityDoesNotExistError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_identity_does_not_exist_error :: dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_identity_does_not_exist_error :: NewAuthorizedActionTakerIdentityDoesNotExistError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: NewAuthorizedActionTakerGroupDoesNotExistError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: NewAuthorizedActionTakerGroupDoesNotExistError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_group_does_not_exist_error :: dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_group_does_not_exist_error :: NewAuthorizedActionTakerGroupDoesNotExistError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: NewAuthorizedActionTakerMainGroupNotSetError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: NewAuthorizedActionTakerMainGroupNotSetError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_main_group_not_set_error :: dpp_errors_consensus_state_token_new_authorized_action_taker_main_group_not_set_error_NewAuthorizedActionTakerMainGroupNotSetError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_main_group_not_set_error :: NewAuthorizedActionTakerMainGroupNotSetError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: InvalidGroupPositionError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: InvalidGroupPositionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: invalid_group_position_error :: dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: invalid_group_position_error :: InvalidGroupPositionError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: TokenIsPausedError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: TokenIsPausedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_is_paused_error :: dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: token_is_paused_error :: TokenIsPausedError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: IdentityTokenAccountAlreadyFrozenError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityTokenAccountAlreadyFrozenError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: identity_token_account_already_frozen_error :: dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: identity_token_account_already_frozen_error :: IdentityTokenAccountAlreadyFrozenError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: TokenAlreadyPausedError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: TokenAlreadyPausedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_already_paused_error :: dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: token_already_paused_error :: TokenAlreadyPausedError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_state_error_StateError :: TokenNotPausedError (o_0) => dpp :: errors :: consensus :: state :: state_error :: StateError :: TokenNotPausedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_not_paused_error :: dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: token :: token_not_paused_error :: TokenNotPausedError >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: state_error :: StateError > for dpp_errors_consensus_state_state_error_StateError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: state_error :: StateError) -> * const dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (match obj { dpp :: errors :: consensus :: state :: state_error :: StateError :: DataContractAlreadyPresentError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DataContractAlreadyPresentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_already_present_error :: dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_contract :: data_contract_already_present_error :: DataContractAlreadyPresentError >> :: ffi_to (o_0)) , # [cfg (feature = "state-transition-validation")] dpp :: errors :: consensus :: state :: state_error :: StateError :: DataTriggerError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DataTriggerError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_trigger :: dpp_errors_consensus_state_data_trigger_DataTriggerError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_trigger :: DataTriggerError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentAlreadyPresentError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DocumentAlreadyPresentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_already_present_error :: dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_already_present_error :: DocumentAlreadyPresentError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentContestCurrentlyLockedError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DocumentContestCurrentlyLockedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_currently_locked_error :: dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_contest_currently_locked_error :: DocumentContestCurrentlyLockedError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentContestNotJoinableError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DocumentContestNotJoinableError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_not_joinable_error :: dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_contest_not_joinable_error :: DocumentContestNotJoinableError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentContestIdentityAlreadyContestantError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DocumentContestIdentityAlreadyContestantError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_identity_already_contestant :: dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_contest_identity_already_contestant :: DocumentContestIdentityAlreadyContestantError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentContestNotPaidForError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DocumentContestNotPaidForError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_not_paid_for_error :: dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_contest_not_paid_for_error :: DocumentContestNotPaidForError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentContestDocumentWithSameIdAlreadyPresentError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DocumentContestDocumentWithSameIdAlreadyPresentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_document_with_same_id_already_present_error :: dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_contest_document_with_same_id_already_present_error :: DocumentContestDocumentWithSameIdAlreadyPresentError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentNotFoundError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DocumentNotFoundError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_not_found_error :: dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_not_found_error :: DocumentNotFoundError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentNotForSaleError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DocumentNotForSaleError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_not_for_sale_error :: dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_not_for_sale_error :: DocumentNotForSaleError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentIncorrectPurchasePriceError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DocumentIncorrectPurchasePriceError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_incorrect_purchase_price_error :: dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_incorrect_purchase_price_error :: DocumentIncorrectPurchasePriceError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentOwnerIdMismatchError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DocumentOwnerIdMismatchError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_owner_id_mismatch_error :: dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_owner_id_mismatch_error :: DocumentOwnerIdMismatchError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentTimestampsMismatchError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DocumentTimestampsMismatchError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_timestamps_mismatch_error :: dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_timestamps_mismatch_error :: DocumentTimestampsMismatchError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentTimestampWindowViolationError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DocumentTimestampWindowViolationError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_timestamp_window_violation_error :: dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_timestamp_window_violation_error :: DocumentTimestampWindowViolationError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DuplicateUniqueIndexError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DuplicateUniqueIndexError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: duplicate_unique_index_error :: dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: duplicate_unique_index_error :: DuplicateUniqueIndexError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: InvalidDocumentRevisionError (o_0) => dpp_errors_consensus_state_state_error_StateError :: InvalidDocumentRevisionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: invalid_document_revision_error :: dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: invalid_document_revision_error :: InvalidDocumentRevisionError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityAlreadyExistsError (o_0) => dpp_errors_consensus_state_state_error_StateError :: IdentityAlreadyExistsError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_already_exists_error :: dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: identity_already_exists_error :: IdentityAlreadyExistsError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError (o_0) => dpp_errors_consensus_state_state_error_StateError :: IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_public_key_already_exists_for_unique_contract_bounds_error :: dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: identity_public_key_already_exists_for_unique_contract_bounds_error :: IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityPublicKeyIsReadOnlyError (o_0) => dpp_errors_consensus_state_state_error_StateError :: IdentityPublicKeyIsReadOnlyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_read_only_error :: dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_read_only_error :: IdentityPublicKeyIsReadOnlyError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: MissingIdentityPublicKeyIdsError (o_0) => dpp_errors_consensus_state_state_error_StateError :: MissingIdentityPublicKeyIdsError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: missing_identity_public_key_ids_error :: dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: missing_identity_public_key_ids_error :: MissingIdentityPublicKeyIdsError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: MissingTransferKeyError (o_0) => dpp_errors_consensus_state_state_error_StateError :: MissingTransferKeyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: missing_transfer_key_error :: dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: missing_transfer_key_error :: MissingTransferKeyError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: NoTransferKeyForCoreWithdrawalAvailableError (o_0) => dpp_errors_consensus_state_state_error_StateError :: NoTransferKeyForCoreWithdrawalAvailableError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: no_transfer_key_for_core_withdrawal_available_error :: dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: no_transfer_key_for_core_withdrawal_available_error :: NoTransferKeyForCoreWithdrawalAvailableError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: InvalidIdentityPublicKeyIdError (o_0) => dpp_errors_consensus_state_state_error_StateError :: InvalidIdentityPublicKeyIdError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: invalid_identity_public_key_id_error :: dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: invalid_identity_public_key_id_error :: InvalidIdentityPublicKeyIdError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: InvalidIdentityRevisionError (o_0) => dpp_errors_consensus_state_state_error_StateError :: InvalidIdentityRevisionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: invalid_identity_revision_error :: dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: invalid_identity_revision_error :: InvalidIdentityRevisionError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: InvalidIdentityNonceError (o_0) => dpp_errors_consensus_state_state_error_StateError :: InvalidIdentityNonceError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: invalid_identity_contract_nonce_error :: dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: invalid_identity_contract_nonce_error :: InvalidIdentityNonceError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: MaxIdentityPublicKeyLimitReachedError (o_0) => dpp_errors_consensus_state_state_error_StateError :: MaxIdentityPublicKeyLimitReachedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: max_identity_public_key_limit_reached_error :: dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: max_identity_public_key_limit_reached_error :: MaxIdentityPublicKeyLimitReachedError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DuplicatedIdentityPublicKeyStateError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DuplicatedIdentityPublicKeyStateError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_state_error :: dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_state_error :: DuplicatedIdentityPublicKeyStateError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DuplicatedIdentityPublicKeyIdStateError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DuplicatedIdentityPublicKeyIdStateError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_id_state_error :: dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_id_state_error :: DuplicatedIdentityPublicKeyIdStateError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityPublicKeyIsDisabledError (o_0) => dpp_errors_consensus_state_state_error_StateError :: IdentityPublicKeyIsDisabledError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_disabled_error :: dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_disabled_error :: IdentityPublicKeyIsDisabledError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityInsufficientBalanceError (o_0) => dpp_errors_consensus_state_state_error_StateError :: IdentityInsufficientBalanceError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_insufficient_balance_error :: dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: identity_insufficient_balance_error :: IdentityInsufficientBalanceError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentTimestampsAreEqualError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DocumentTimestampsAreEqualError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_timestamps_are_equal_error :: dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_timestamps_are_equal_error :: DocumentTimestampsAreEqualError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DataContractIsReadonlyError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DataContractIsReadonlyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_is_readonly_error :: dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_contract :: data_contract_is_readonly_error :: DataContractIsReadonlyError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DataContractConfigUpdateError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DataContractConfigUpdateError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_config_update_error :: dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_contract :: data_contract_config_update_error :: DataContractConfigUpdateError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DocumentTypeUpdateError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DocumentTypeUpdateError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: document_type_update_error :: dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_contract :: document_type_update_error :: DocumentTypeUpdateError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: PrefundedSpecializedBalanceInsufficientError (o_0) => dpp_errors_consensus_state_state_error_StateError :: PrefundedSpecializedBalanceInsufficientError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_insufficient_error :: dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_insufficient_error :: PrefundedSpecializedBalanceInsufficientError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: PrefundedSpecializedBalanceNotFoundError (o_0) => dpp_errors_consensus_state_state_error_StateError :: PrefundedSpecializedBalanceNotFoundError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_not_found_error :: dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_not_found_error :: PrefundedSpecializedBalanceNotFoundError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DataContractUpdatePermissionError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DataContractUpdatePermissionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_permission_error :: dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_permission_error :: DataContractUpdatePermissionError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: MasternodeNotFoundError (o_0) => dpp_errors_consensus_state_state_error_StateError :: MasternodeNotFoundError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_not_found_error :: dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: voting :: masternode_not_found_error :: MasternodeNotFoundError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: MasternodeIncorrectVoterIdentityIdError (o_0) => dpp_errors_consensus_state_state_error_StateError :: MasternodeIncorrectVoterIdentityIdError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voter_identity_id_error :: dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voter_identity_id_error :: MasternodeIncorrectVoterIdentityIdError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: MasternodeIncorrectVotingAddressError (o_0) => dpp_errors_consensus_state_state_error_StateError :: MasternodeIncorrectVotingAddressError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voting_address_error :: dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voting_address_error :: MasternodeIncorrectVotingAddressError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: VotePollNotFoundError (o_0) => dpp_errors_consensus_state_state_error_StateError :: VotePollNotFoundError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: vote_poll_not_found_error :: dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: voting :: vote_poll_not_found_error :: VotePollNotFoundError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: VotePollNotAvailableForVotingError (o_0) => dpp_errors_consensus_state_state_error_StateError :: VotePollNotAvailableForVotingError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: vote_poll_not_available_for_voting_error :: dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: voting :: vote_poll_not_available_for_voting_error :: VotePollNotAvailableForVotingError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: MasternodeVotedTooManyTimesError (o_0) => dpp_errors_consensus_state_state_error_StateError :: MasternodeVotedTooManyTimesError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_voted_too_many_times :: dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: voting :: masternode_voted_too_many_times :: MasternodeVotedTooManyTimesError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: MasternodeVoteAlreadyPresentError (o_0) => dpp_errors_consensus_state_state_error_StateError :: MasternodeVoteAlreadyPresentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_vote_already_present_error :: dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: voting :: masternode_vote_already_present_error :: MasternodeVoteAlreadyPresentError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: RecipientIdentityDoesNotExistError (o_0) => dpp_errors_consensus_state_state_error_StateError :: RecipientIdentityDoesNotExistError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: recipient_identity_does_not_exist_error :: dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: recipient_identity_does_not_exist_error :: RecipientIdentityDoesNotExistError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityDoesNotHaveEnoughTokenBalanceError (o_0) => dpp_errors_consensus_state_state_error_StateError :: IdentityDoesNotHaveEnoughTokenBalanceError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: identity_does_not_have_enough_token_balance_error :: dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: identity_does_not_have_enough_token_balance_error :: IdentityDoesNotHaveEnoughTokenBalanceError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: UnauthorizedTokenActionError (o_0) => dpp_errors_consensus_state_state_error_StateError :: UnauthorizedTokenActionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: unauthorized_token_action_error :: dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: unauthorized_token_action_error :: UnauthorizedTokenActionError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityTokenAccountFrozenError (o_0) => dpp_errors_consensus_state_state_error_StateError :: IdentityTokenAccountFrozenError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: identity_token_account_frozen_error :: dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: identity_token_account_frozen_error :: IdentityTokenAccountFrozenError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityTokenAccountNotFrozenError (o_0) => dpp_errors_consensus_state_state_error_StateError :: IdentityTokenAccountNotFrozenError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: identity_token_account_not_frozen_error :: dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: identity_token_account_not_frozen_error :: IdentityTokenAccountNotFrozenError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityNotMemberOfGroupError (o_0) => dpp_errors_consensus_state_state_error_StateError :: IdentityNotMemberOfGroupError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: group :: identity_not_member_of_group_error :: dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: group :: identity_not_member_of_group_error :: IdentityNotMemberOfGroupError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: GroupActionDoesNotExistError (o_0) => dpp_errors_consensus_state_state_error_StateError :: GroupActionDoesNotExistError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: group :: group_action_does_not_exist_error :: dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: group :: group_action_does_not_exist_error :: GroupActionDoesNotExistError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: GroupActionAlreadyCompletedError (o_0) => dpp_errors_consensus_state_state_error_StateError :: GroupActionAlreadyCompletedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: group :: group_action_already_completed_error :: dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: group :: group_action_already_completed_error :: GroupActionAlreadyCompletedError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: GroupActionAlreadySignedByIdentityError (o_0) => dpp_errors_consensus_state_state_error_StateError :: GroupActionAlreadySignedByIdentityError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: group :: group_action_already_signed_by_identity_error :: dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: group :: group_action_already_signed_by_identity_error :: GroupActionAlreadySignedByIdentityError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: DataContractUpdateActionNotAllowedError (o_0) => dpp_errors_consensus_state_state_error_StateError :: DataContractUpdateActionNotAllowedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_action_not_allowed_error :: dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_action_not_allowed_error :: DataContractUpdateActionNotAllowedError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: TokenSettingMaxSupplyToLessThanCurrentSupplyError (o_0) => dpp_errors_consensus_state_state_error_StateError :: TokenSettingMaxSupplyToLessThanCurrentSupplyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_setting_max_supply_to_less_than_current_supply_error :: dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: token_setting_max_supply_to_less_than_current_supply_error :: TokenSettingMaxSupplyToLessThanCurrentSupplyError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: TokenMintPastMaxSupplyError (o_0) => dpp_errors_consensus_state_state_error_StateError :: TokenMintPastMaxSupplyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_mint_past_max_supply_error :: dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: token_mint_past_max_supply_error :: TokenMintPastMaxSupplyError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: InvalidTokenClaimPropertyMismatch (o_0) => dpp_errors_consensus_state_state_error_StateError :: InvalidTokenClaimPropertyMismatch (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: invalid_token_claim_property_mismatch :: dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: invalid_token_claim_property_mismatch :: InvalidTokenClaimPropertyMismatch >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: InvalidTokenClaimNoCurrentRewards (o_0) => dpp_errors_consensus_state_state_error_StateError :: InvalidTokenClaimNoCurrentRewards (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: invalid_token_claim_no_current_rewards :: dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: invalid_token_claim_no_current_rewards :: InvalidTokenClaimNoCurrentRewards >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: InvalidTokenClaimWrongClaimant (o_0) => dpp_errors_consensus_state_state_error_StateError :: InvalidTokenClaimWrongClaimant (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: invalid_token_claim_wrong_claimant :: dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: invalid_token_claim_wrong_claimant :: InvalidTokenClaimWrongClaimant >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: NewTokensDestinationIdentityDoesNotExistError (o_0) => dpp_errors_consensus_state_state_error_StateError :: NewTokensDestinationIdentityDoesNotExistError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: new_tokens_destination_identity_does_not_exist_error :: dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: new_tokens_destination_identity_does_not_exist_error :: NewTokensDestinationIdentityDoesNotExistError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: NewAuthorizedActionTakerIdentityDoesNotExistError (o_0) => dpp_errors_consensus_state_state_error_StateError :: NewAuthorizedActionTakerIdentityDoesNotExistError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_identity_does_not_exist_error :: dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_identity_does_not_exist_error :: NewAuthorizedActionTakerIdentityDoesNotExistError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: NewAuthorizedActionTakerGroupDoesNotExistError (o_0) => dpp_errors_consensus_state_state_error_StateError :: NewAuthorizedActionTakerGroupDoesNotExistError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_group_does_not_exist_error :: dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_group_does_not_exist_error :: NewAuthorizedActionTakerGroupDoesNotExistError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: NewAuthorizedActionTakerMainGroupNotSetError (o_0) => dpp_errors_consensus_state_state_error_StateError :: NewAuthorizedActionTakerMainGroupNotSetError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_main_group_not_set_error :: dpp_errors_consensus_state_token_new_authorized_action_taker_main_group_not_set_error_NewAuthorizedActionTakerMainGroupNotSetError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_main_group_not_set_error :: NewAuthorizedActionTakerMainGroupNotSetError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: InvalidGroupPositionError (o_0) => dpp_errors_consensus_state_state_error_StateError :: InvalidGroupPositionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: invalid_group_position_error :: dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: invalid_group_position_error :: InvalidGroupPositionError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: TokenIsPausedError (o_0) => dpp_errors_consensus_state_state_error_StateError :: TokenIsPausedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_is_paused_error :: dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: token_is_paused_error :: TokenIsPausedError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: IdentityTokenAccountAlreadyFrozenError (o_0) => dpp_errors_consensus_state_state_error_StateError :: IdentityTokenAccountAlreadyFrozenError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: identity_token_account_already_frozen_error :: dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: identity_token_account_already_frozen_error :: IdentityTokenAccountAlreadyFrozenError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: TokenAlreadyPausedError (o_0) => dpp_errors_consensus_state_state_error_StateError :: TokenAlreadyPausedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_already_paused_error :: dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: token_already_paused_error :: TokenAlreadyPausedError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: state_error :: StateError :: TokenNotPausedError (o_0) => dpp_errors_consensus_state_state_error_StateError :: TokenNotPausedError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_not_paused_error :: dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: token :: token_not_paused_error :: TokenNotPausedError >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_errors_consensus_state_state_error_StateError { fn drop (& mut self) { unsafe { match self { dpp_errors_consensus_state_state_error_StateError :: DataContractAlreadyPresentError (o_0) => { ferment :: unbox_any (* o_0) ; } , # [cfg (feature = "state-transition-validation")] dpp_errors_consensus_state_state_error_StateError :: DataTriggerError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DocumentAlreadyPresentError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DocumentContestCurrentlyLockedError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DocumentContestNotJoinableError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DocumentContestIdentityAlreadyContestantError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DocumentContestNotPaidForError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DocumentContestDocumentWithSameIdAlreadyPresentError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DocumentNotFoundError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DocumentNotForSaleError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DocumentIncorrectPurchasePriceError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DocumentOwnerIdMismatchError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DocumentTimestampsMismatchError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DocumentTimestampWindowViolationError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DuplicateUniqueIndexError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: InvalidDocumentRevisionError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: IdentityAlreadyExistsError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: IdentityPublicKeyIsReadOnlyError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: MissingIdentityPublicKeyIdsError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: MissingTransferKeyError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: NoTransferKeyForCoreWithdrawalAvailableError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: InvalidIdentityPublicKeyIdError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: InvalidIdentityRevisionError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: InvalidIdentityNonceError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: MaxIdentityPublicKeyLimitReachedError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DuplicatedIdentityPublicKeyStateError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DuplicatedIdentityPublicKeyIdStateError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: IdentityPublicKeyIsDisabledError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: IdentityInsufficientBalanceError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DocumentTimestampsAreEqualError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DataContractIsReadonlyError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DataContractConfigUpdateError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DocumentTypeUpdateError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: PrefundedSpecializedBalanceInsufficientError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: PrefundedSpecializedBalanceNotFoundError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DataContractUpdatePermissionError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: MasternodeNotFoundError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: MasternodeIncorrectVoterIdentityIdError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: MasternodeIncorrectVotingAddressError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: VotePollNotFoundError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: VotePollNotAvailableForVotingError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: MasternodeVotedTooManyTimesError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: MasternodeVoteAlreadyPresentError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: RecipientIdentityDoesNotExistError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: IdentityDoesNotHaveEnoughTokenBalanceError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: UnauthorizedTokenActionError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: IdentityTokenAccountFrozenError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: IdentityTokenAccountNotFrozenError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: IdentityNotMemberOfGroupError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: GroupActionDoesNotExistError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: GroupActionAlreadyCompletedError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: GroupActionAlreadySignedByIdentityError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: DataContractUpdateActionNotAllowedError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: TokenSettingMaxSupplyToLessThanCurrentSupplyError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: TokenMintPastMaxSupplyError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: InvalidTokenClaimPropertyMismatch (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: InvalidTokenClaimNoCurrentRewards (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: InvalidTokenClaimWrongClaimant (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: NewTokensDestinationIdentityDoesNotExistError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: NewAuthorizedActionTakerIdentityDoesNotExistError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: NewAuthorizedActionTakerGroupDoesNotExistError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: NewAuthorizedActionTakerMainGroupNotSetError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: InvalidGroupPositionError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: TokenIsPausedError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: IdentityTokenAccountAlreadyFrozenError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: TokenAlreadyPausedError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_state_error_StateError :: TokenNotPausedError (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DataContractAlreadyPresentError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_already_present_error :: dpp_errors_consensus_state_data_contract_data_contract_already_present_error_DataContractAlreadyPresentError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DataContractAlreadyPresentError (o_o_0)) } # [cfg (feature = "state-transition-validation")] # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DataTriggerError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_trigger :: dpp_errors_consensus_state_data_trigger_DataTriggerError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DataTriggerError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DocumentAlreadyPresentError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_already_present_error :: dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DocumentAlreadyPresentError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DocumentContestCurrentlyLockedError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_currently_locked_error :: dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DocumentContestCurrentlyLockedError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DocumentContestNotJoinableError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_not_joinable_error :: dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DocumentContestNotJoinableError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DocumentContestIdentityAlreadyContestantError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_identity_already_contestant :: dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DocumentContestIdentityAlreadyContestantError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DocumentContestNotPaidForError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_not_paid_for_error :: dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DocumentContestNotPaidForError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DocumentContestDocumentWithSameIdAlreadyPresentError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_contest_document_with_same_id_already_present_error :: dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DocumentContestDocumentWithSameIdAlreadyPresentError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DocumentNotFoundError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_not_found_error :: dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DocumentNotFoundError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DocumentNotForSaleError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_not_for_sale_error :: dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DocumentNotForSaleError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DocumentIncorrectPurchasePriceError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_incorrect_purchase_price_error :: dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DocumentIncorrectPurchasePriceError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DocumentOwnerIdMismatchError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_owner_id_mismatch_error :: dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DocumentOwnerIdMismatchError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DocumentTimestampsMismatchError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_timestamps_mismatch_error :: dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DocumentTimestampsMismatchError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DocumentTimestampWindowViolationError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_timestamp_window_violation_error :: dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DocumentTimestampWindowViolationError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DuplicateUniqueIndexError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: duplicate_unique_index_error :: dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DuplicateUniqueIndexError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_InvalidDocumentRevisionError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: invalid_document_revision_error :: dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: InvalidDocumentRevisionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_IdentityAlreadyExistsError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_already_exists_error :: dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: IdentityAlreadyExistsError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_public_key_already_exists_for_unique_contract_bounds_error :: dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_IdentityPublicKeyIsReadOnlyError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_read_only_error :: dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: IdentityPublicKeyIsReadOnlyError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_MissingIdentityPublicKeyIdsError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: missing_identity_public_key_ids_error :: dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: MissingIdentityPublicKeyIdsError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_MissingTransferKeyError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: missing_transfer_key_error :: dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: MissingTransferKeyError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_NoTransferKeyForCoreWithdrawalAvailableError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: no_transfer_key_for_core_withdrawal_available_error :: dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: NoTransferKeyForCoreWithdrawalAvailableError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_InvalidIdentityPublicKeyIdError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: invalid_identity_public_key_id_error :: dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: InvalidIdentityPublicKeyIdError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_InvalidIdentityRevisionError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: invalid_identity_revision_error :: dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: InvalidIdentityRevisionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_InvalidIdentityNonceError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: invalid_identity_contract_nonce_error :: dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: InvalidIdentityNonceError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_MaxIdentityPublicKeyLimitReachedError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: max_identity_public_key_limit_reached_error :: dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: MaxIdentityPublicKeyLimitReachedError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DuplicatedIdentityPublicKeyStateError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_state_error :: dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DuplicatedIdentityPublicKeyStateError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DuplicatedIdentityPublicKeyIdStateError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_id_state_error :: dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DuplicatedIdentityPublicKeyIdStateError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_IdentityPublicKeyIsDisabledError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_disabled_error :: dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: IdentityPublicKeyIsDisabledError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_IdentityInsufficientBalanceError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: identity_insufficient_balance_error :: dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: IdentityInsufficientBalanceError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DocumentTimestampsAreEqualError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: document :: document_timestamps_are_equal_error :: dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DocumentTimestampsAreEqualError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DataContractIsReadonlyError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_is_readonly_error :: dpp_errors_consensus_state_data_contract_data_contract_is_readonly_error_DataContractIsReadonlyError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DataContractIsReadonlyError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DataContractConfigUpdateError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_config_update_error :: dpp_errors_consensus_state_data_contract_data_contract_config_update_error_DataContractConfigUpdateError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DataContractConfigUpdateError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DocumentTypeUpdateError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: document_type_update_error :: dpp_errors_consensus_state_data_contract_document_type_update_error_DocumentTypeUpdateError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DocumentTypeUpdateError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_PrefundedSpecializedBalanceInsufficientError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_insufficient_error :: dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_insufficient_error_PrefundedSpecializedBalanceInsufficientError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: PrefundedSpecializedBalanceInsufficientError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_PrefundedSpecializedBalanceNotFoundError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: prefunded_specialized_balances :: prefunded_specialized_balance_not_found_error :: dpp_errors_consensus_state_prefunded_specialized_balances_prefunded_specialized_balance_not_found_error_PrefundedSpecializedBalanceNotFoundError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: PrefundedSpecializedBalanceNotFoundError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DataContractUpdatePermissionError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_permission_error :: dpp_errors_consensus_state_data_contract_data_contract_update_permission_error_DataContractUpdatePermissionError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DataContractUpdatePermissionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_MasternodeNotFoundError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_not_found_error :: dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: MasternodeNotFoundError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_MasternodeIncorrectVoterIdentityIdError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voter_identity_id_error :: dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: MasternodeIncorrectVoterIdentityIdError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_MasternodeIncorrectVotingAddressError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voting_address_error :: dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: MasternodeIncorrectVotingAddressError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_VotePollNotFoundError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: vote_poll_not_found_error :: dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: VotePollNotFoundError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_VotePollNotAvailableForVotingError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: vote_poll_not_available_for_voting_error :: dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: VotePollNotAvailableForVotingError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_MasternodeVotedTooManyTimesError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_voted_too_many_times :: dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: MasternodeVotedTooManyTimesError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_MasternodeVoteAlreadyPresentError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: voting :: masternode_vote_already_present_error :: dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: MasternodeVoteAlreadyPresentError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_RecipientIdentityDoesNotExistError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: identity :: recipient_identity_does_not_exist_error :: dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: RecipientIdentityDoesNotExistError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_IdentityDoesNotHaveEnoughTokenBalanceError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: identity_does_not_have_enough_token_balance_error :: dpp_errors_consensus_state_token_identity_does_not_have_enough_token_balance_error_IdentityDoesNotHaveEnoughTokenBalanceError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: IdentityDoesNotHaveEnoughTokenBalanceError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_UnauthorizedTokenActionError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: unauthorized_token_action_error :: dpp_errors_consensus_state_token_unauthorized_token_action_error_UnauthorizedTokenActionError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: UnauthorizedTokenActionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_IdentityTokenAccountFrozenError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: identity_token_account_frozen_error :: dpp_errors_consensus_state_token_identity_token_account_frozen_error_IdentityTokenAccountFrozenError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: IdentityTokenAccountFrozenError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_IdentityTokenAccountNotFrozenError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: identity_token_account_not_frozen_error :: dpp_errors_consensus_state_token_identity_token_account_not_frozen_error_IdentityTokenAccountNotFrozenError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: IdentityTokenAccountNotFrozenError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_IdentityNotMemberOfGroupError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: group :: identity_not_member_of_group_error :: dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: IdentityNotMemberOfGroupError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_GroupActionDoesNotExistError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: group :: group_action_does_not_exist_error :: dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: GroupActionDoesNotExistError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_GroupActionAlreadyCompletedError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: group :: group_action_already_completed_error :: dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: GroupActionAlreadyCompletedError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_GroupActionAlreadySignedByIdentityError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: group :: group_action_already_signed_by_identity_error :: dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: GroupActionAlreadySignedByIdentityError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_DataContractUpdateActionNotAllowedError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_contract :: data_contract_update_action_not_allowed_error :: dpp_errors_consensus_state_data_contract_data_contract_update_action_not_allowed_error_DataContractUpdateActionNotAllowedError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: DataContractUpdateActionNotAllowedError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_TokenSettingMaxSupplyToLessThanCurrentSupplyError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_setting_max_supply_to_less_than_current_supply_error :: dpp_errors_consensus_state_token_token_setting_max_supply_to_less_than_current_supply_error_TokenSettingMaxSupplyToLessThanCurrentSupplyError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: TokenSettingMaxSupplyToLessThanCurrentSupplyError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_TokenMintPastMaxSupplyError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_mint_past_max_supply_error :: dpp_errors_consensus_state_token_token_mint_past_max_supply_error_TokenMintPastMaxSupplyError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: TokenMintPastMaxSupplyError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_InvalidTokenClaimPropertyMismatch_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: invalid_token_claim_property_mismatch :: dpp_errors_consensus_state_token_invalid_token_claim_property_mismatch_InvalidTokenClaimPropertyMismatch) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: InvalidTokenClaimPropertyMismatch (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_InvalidTokenClaimNoCurrentRewards_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: invalid_token_claim_no_current_rewards :: dpp_errors_consensus_state_token_invalid_token_claim_no_current_rewards_InvalidTokenClaimNoCurrentRewards) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: InvalidTokenClaimNoCurrentRewards (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_InvalidTokenClaimWrongClaimant_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: invalid_token_claim_wrong_claimant :: dpp_errors_consensus_state_token_invalid_token_claim_wrong_claimant_InvalidTokenClaimWrongClaimant) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: InvalidTokenClaimWrongClaimant (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_NewTokensDestinationIdentityDoesNotExistError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: new_tokens_destination_identity_does_not_exist_error :: dpp_errors_consensus_state_token_new_tokens_destination_identity_does_not_exist_error_NewTokensDestinationIdentityDoesNotExistError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: NewTokensDestinationIdentityDoesNotExistError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_NewAuthorizedActionTakerIdentityDoesNotExistError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_identity_does_not_exist_error :: dpp_errors_consensus_state_token_new_authorized_action_taker_identity_does_not_exist_error_NewAuthorizedActionTakerIdentityDoesNotExistError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: NewAuthorizedActionTakerIdentityDoesNotExistError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_NewAuthorizedActionTakerGroupDoesNotExistError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_group_does_not_exist_error :: dpp_errors_consensus_state_token_new_authorized_action_taker_group_does_not_exist_error_NewAuthorizedActionTakerGroupDoesNotExistError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: NewAuthorizedActionTakerGroupDoesNotExistError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_NewAuthorizedActionTakerMainGroupNotSetError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: new_authorized_action_taker_main_group_not_set_error :: dpp_errors_consensus_state_token_new_authorized_action_taker_main_group_not_set_error_NewAuthorizedActionTakerMainGroupNotSetError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: NewAuthorizedActionTakerMainGroupNotSetError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_InvalidGroupPositionError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: invalid_group_position_error :: dpp_errors_consensus_state_token_invalid_group_position_error_InvalidGroupPositionError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: InvalidGroupPositionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_TokenIsPausedError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_is_paused_error :: dpp_errors_consensus_state_token_token_is_paused_error_TokenIsPausedError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: TokenIsPausedError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_IdentityTokenAccountAlreadyFrozenError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: identity_token_account_already_frozen_error :: dpp_errors_consensus_state_token_identity_token_account_already_frozen_error_IdentityTokenAccountAlreadyFrozenError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: IdentityTokenAccountAlreadyFrozenError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_TokenAlreadyPausedError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_already_paused_error :: dpp_errors_consensus_state_token_token_already_paused_error_TokenAlreadyPausedError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: TokenAlreadyPausedError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_TokenNotPausedError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: token :: token_not_paused_error :: dpp_errors_consensus_state_token_token_not_paused_error_TokenNotPausedError) -> * mut dpp_errors_consensus_state_state_error_StateError { ferment :: boxed (dpp_errors_consensus_state_state_error_StateError :: TokenNotPausedError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_state_error_StateError_destroy < > (ffi : * mut dpp_errors_consensus_state_state_error_StateError) { ferment :: unbox_any (ffi) ; } } pub mod voting { use crate as dash_spv_apple_bindings ; pub mod masternode_voted_too_many_times { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MasternodeVotedTooManyTimesError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError { pub pro_tx_hash : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub times_already_voted : u16 , pub max_times_allowed : u16 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: voting :: masternode_voted_too_many_times :: MasternodeVotedTooManyTimesError > for dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError) -> dpp :: errors :: consensus :: state :: voting :: masternode_voted_too_many_times :: MasternodeVotedTooManyTimesError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: voting :: masternode_voted_too_many_times :: MasternodeVotedTooManyTimesError { pro_tx_hash : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . pro_tx_hash) , times_already_voted : ffi_ref . times_already_voted , max_times_allowed : ffi_ref . max_times_allowed } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: voting :: masternode_voted_too_many_times :: MasternodeVotedTooManyTimesError > for dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: voting :: masternode_voted_too_many_times :: MasternodeVotedTooManyTimesError) -> * const dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError { ferment :: boxed (dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError { pro_tx_hash : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . pro_tx_hash) , times_already_voted : obj . times_already_voted , max_times_allowed : obj . max_times_allowed }) } } impl Drop for dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . pro_tx_hash) ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError_ctor < > (pro_tx_hash : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , times_already_voted : u16 , max_times_allowed : u16) -> * mut dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError { ferment :: boxed (dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError { pro_tx_hash , times_already_voted , max_times_allowed }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError_destroy < > (ffi : * mut dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError_get_pro_tx_hash < > (obj : * const dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError_get_times_already_voted < > (obj : * const dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError) -> u16 { (* obj) . times_already_voted } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError_get_max_times_allowed < > (obj : * const dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError) -> u16 { (* obj) . max_times_allowed } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError_set_pro_tx_hash < > (obj : * const dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError_set_times_already_voted < > (obj : * const dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError) -> u16 { (* obj) . times_already_voted } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError_set_max_times_allowed < > (obj : * const dpp_errors_consensus_state_voting_masternode_voted_too_many_times_MasternodeVotedTooManyTimesError) -> u16 { (* obj) . max_times_allowed } } pub mod vote_poll_not_available_for_voting_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`VotePollNotAvailableForVotingError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError { pub vote_poll : * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll , pub status : * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: voting :: vote_poll_not_available_for_voting_error :: VotePollNotAvailableForVotingError > for dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError) -> dpp :: errors :: consensus :: state :: voting :: vote_poll_not_available_for_voting_error :: VotePollNotAvailableForVotingError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: voting :: vote_poll_not_available_for_voting_error :: VotePollNotAvailableForVotingError { vote_poll : < crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll as ferment :: FFIConversionFrom < dpp :: voting :: vote_polls :: VotePoll >> :: ffi_from (ffi_ref . vote_poll) , status : < crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus as ferment :: FFIConversionFrom < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStatus >> :: ffi_from (ffi_ref . status) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: voting :: vote_poll_not_available_for_voting_error :: VotePollNotAvailableForVotingError > for dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: voting :: vote_poll_not_available_for_voting_error :: VotePollNotAvailableForVotingError) -> * const dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError { ferment :: boxed (dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError { vote_poll : < crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll as ferment :: FFIConversionTo < dpp :: voting :: vote_polls :: VotePoll >> :: ffi_to (obj . vote_poll) , status : < crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus as ferment :: FFIConversionTo < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStatus >> :: ffi_to (obj . status) }) } } impl Drop for dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . vote_poll) ; ferment :: unbox_any (ffi_ref . status) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError_ctor < > (vote_poll : * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll , status : * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus) -> * mut dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError { ferment :: boxed (dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError { vote_poll , status }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError_destroy < > (ffi : * mut dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError_get_vote_poll < > (obj : * const dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll { (* obj) . vote_poll } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError_get_status < > (obj : * const dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus { (* obj) . status } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError_set_vote_poll < > (obj : * const dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll { (* obj) . vote_poll } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError_set_status < > (obj : * const dpp_errors_consensus_state_voting_vote_poll_not_available_for_voting_error_VotePollNotAvailableForVotingError) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStatus { (* obj) . status } } pub mod masternode_incorrect_voter_identity_id_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MasternodeIncorrectVoterIdentityIdError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError { pub pro_tx_hash : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub expected_voter_identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub provided_voter_identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voter_identity_id_error :: MasternodeIncorrectVoterIdentityIdError > for dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError) -> dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voter_identity_id_error :: MasternodeIncorrectVoterIdentityIdError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voter_identity_id_error :: MasternodeIncorrectVoterIdentityIdError { pro_tx_hash : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . pro_tx_hash) , expected_voter_identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . expected_voter_identity_id) , provided_voter_identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . provided_voter_identity_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voter_identity_id_error :: MasternodeIncorrectVoterIdentityIdError > for dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voter_identity_id_error :: MasternodeIncorrectVoterIdentityIdError) -> * const dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError { ferment :: boxed (dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError { pro_tx_hash : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . pro_tx_hash) , expected_voter_identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . expected_voter_identity_id) , provided_voter_identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . provided_voter_identity_id) }) } } impl Drop for dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . pro_tx_hash) ; ferment :: unbox_any (ffi_ref . expected_voter_identity_id) ; ferment :: unbox_any (ffi_ref . provided_voter_identity_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError_ctor < > (pro_tx_hash : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , expected_voter_identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , provided_voter_identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError { ferment :: boxed (dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError { pro_tx_hash , expected_voter_identity_id , provided_voter_identity_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError_destroy < > (ffi : * mut dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError_get_pro_tx_hash < > (obj : * const dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError_get_expected_voter_identity_id < > (obj : * const dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . expected_voter_identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError_get_provided_voter_identity_id < > (obj : * const dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . provided_voter_identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError_set_pro_tx_hash < > (obj : * const dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError_set_expected_voter_identity_id < > (obj : * const dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . expected_voter_identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError_set_provided_voter_identity_id < > (obj : * const dpp_errors_consensus_state_voting_masternode_incorrect_voter_identity_id_error_MasternodeIncorrectVoterIdentityIdError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . provided_voter_identity_id } } pub mod masternode_vote_already_present_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MasternodeVoteAlreadyPresentError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError { pub pro_tx_hash : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub vote_poll : * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: voting :: masternode_vote_already_present_error :: MasternodeVoteAlreadyPresentError > for dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError) -> dpp :: errors :: consensus :: state :: voting :: masternode_vote_already_present_error :: MasternodeVoteAlreadyPresentError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: voting :: masternode_vote_already_present_error :: MasternodeVoteAlreadyPresentError { pro_tx_hash : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . pro_tx_hash) , vote_poll : < crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll as ferment :: FFIConversionFrom < dpp :: voting :: vote_polls :: VotePoll >> :: ffi_from (ffi_ref . vote_poll) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: voting :: masternode_vote_already_present_error :: MasternodeVoteAlreadyPresentError > for dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: voting :: masternode_vote_already_present_error :: MasternodeVoteAlreadyPresentError) -> * const dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError { ferment :: boxed (dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError { pro_tx_hash : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . pro_tx_hash) , vote_poll : < crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll as ferment :: FFIConversionTo < dpp :: voting :: vote_polls :: VotePoll >> :: ffi_to (obj . vote_poll) }) } } impl Drop for dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . pro_tx_hash) ; ferment :: unbox_any (ffi_ref . vote_poll) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError_ctor < > (pro_tx_hash : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , vote_poll : * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll) -> * mut dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError { ferment :: boxed (dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError { pro_tx_hash , vote_poll }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError_destroy < > (ffi : * mut dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError_get_pro_tx_hash < > (obj : * const dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError_get_vote_poll < > (obj : * const dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll { (* obj) . vote_poll } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError_set_pro_tx_hash < > (obj : * const dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError_set_vote_poll < > (obj : * const dpp_errors_consensus_state_voting_masternode_vote_already_present_error_MasternodeVoteAlreadyPresentError) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll { (* obj) . vote_poll } } pub mod masternode_incorrect_voting_address_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MasternodeIncorrectVotingAddressError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError { pub pro_tx_hash : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub current_voting_address : * mut crate :: fermented :: types :: platform_value :: types :: bytes_20 :: platform_value_types_bytes_20_Bytes20 , pub given_voting_address : * mut crate :: fermented :: types :: platform_value :: types :: bytes_20 :: platform_value_types_bytes_20_Bytes20 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voting_address_error :: MasternodeIncorrectVotingAddressError > for dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError) -> dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voting_address_error :: MasternodeIncorrectVotingAddressError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voting_address_error :: MasternodeIncorrectVotingAddressError { pro_tx_hash : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . pro_tx_hash) , current_voting_address : < crate :: fermented :: types :: platform_value :: types :: bytes_20 :: platform_value_types_bytes_20_Bytes20 as ferment :: FFIConversionFrom < platform_value :: types :: bytes_20 :: Bytes20 >> :: ffi_from (ffi_ref . current_voting_address) , given_voting_address : < crate :: fermented :: types :: platform_value :: types :: bytes_20 :: platform_value_types_bytes_20_Bytes20 as ferment :: FFIConversionFrom < platform_value :: types :: bytes_20 :: Bytes20 >> :: ffi_from (ffi_ref . given_voting_address) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voting_address_error :: MasternodeIncorrectVotingAddressError > for dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: voting :: masternode_incorrect_voting_address_error :: MasternodeIncorrectVotingAddressError) -> * const dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError { ferment :: boxed (dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError { pro_tx_hash : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . pro_tx_hash) , current_voting_address : < crate :: fermented :: types :: platform_value :: types :: bytes_20 :: platform_value_types_bytes_20_Bytes20 as ferment :: FFIConversionTo < platform_value :: types :: bytes_20 :: Bytes20 >> :: ffi_to (obj . current_voting_address) , given_voting_address : < crate :: fermented :: types :: platform_value :: types :: bytes_20 :: platform_value_types_bytes_20_Bytes20 as ferment :: FFIConversionTo < platform_value :: types :: bytes_20 :: Bytes20 >> :: ffi_to (obj . given_voting_address) }) } } impl Drop for dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . pro_tx_hash) ; ferment :: unbox_any (ffi_ref . current_voting_address) ; ferment :: unbox_any (ffi_ref . given_voting_address) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError_ctor < > (pro_tx_hash : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , current_voting_address : * mut crate :: fermented :: types :: platform_value :: types :: bytes_20 :: platform_value_types_bytes_20_Bytes20 , given_voting_address : * mut crate :: fermented :: types :: platform_value :: types :: bytes_20 :: platform_value_types_bytes_20_Bytes20) -> * mut dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError { ferment :: boxed (dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError { pro_tx_hash , current_voting_address , given_voting_address }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError_destroy < > (ffi : * mut dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError_get_pro_tx_hash < > (obj : * const dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError_get_current_voting_address < > (obj : * const dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError) -> * mut crate :: fermented :: types :: platform_value :: types :: bytes_20 :: platform_value_types_bytes_20_Bytes20 { (* obj) . current_voting_address } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError_get_given_voting_address < > (obj : * const dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError) -> * mut crate :: fermented :: types :: platform_value :: types :: bytes_20 :: platform_value_types_bytes_20_Bytes20 { (* obj) . given_voting_address } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError_set_pro_tx_hash < > (obj : * const dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError_set_current_voting_address < > (obj : * const dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError) -> * mut crate :: fermented :: types :: platform_value :: types :: bytes_20 :: platform_value_types_bytes_20_Bytes20 { (* obj) . current_voting_address } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError_set_given_voting_address < > (obj : * const dpp_errors_consensus_state_voting_masternode_incorrect_voting_address_error_MasternodeIncorrectVotingAddressError) -> * mut crate :: fermented :: types :: platform_value :: types :: bytes_20 :: platform_value_types_bytes_20_Bytes20 { (* obj) . given_voting_address } } pub mod masternode_not_found_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MasternodeNotFoundError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError { pub pro_tx_hash : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: voting :: masternode_not_found_error :: MasternodeNotFoundError > for dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError) -> dpp :: errors :: consensus :: state :: voting :: masternode_not_found_error :: MasternodeNotFoundError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: voting :: masternode_not_found_error :: MasternodeNotFoundError { pro_tx_hash : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . pro_tx_hash) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: voting :: masternode_not_found_error :: MasternodeNotFoundError > for dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: voting :: masternode_not_found_error :: MasternodeNotFoundError) -> * const dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError { ferment :: boxed (dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError { pro_tx_hash : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . pro_tx_hash) }) } } impl Drop for dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . pro_tx_hash) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError_ctor < > (pro_tx_hash : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError { ferment :: boxed (dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError { pro_tx_hash }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError_destroy < > (ffi : * mut dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError_get_pro_tx_hash < > (obj : * const dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError_set_pro_tx_hash < > (obj : * const dpp_errors_consensus_state_voting_masternode_not_found_error_MasternodeNotFoundError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . pro_tx_hash } } pub mod vote_poll_not_found_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`VotePollNotFoundError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError { pub vote_poll : * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: voting :: vote_poll_not_found_error :: VotePollNotFoundError > for dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError) -> dpp :: errors :: consensus :: state :: voting :: vote_poll_not_found_error :: VotePollNotFoundError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: voting :: vote_poll_not_found_error :: VotePollNotFoundError { vote_poll : < crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll as ferment :: FFIConversionFrom < dpp :: voting :: vote_polls :: VotePoll >> :: ffi_from (ffi_ref . vote_poll) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: voting :: vote_poll_not_found_error :: VotePollNotFoundError > for dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: voting :: vote_poll_not_found_error :: VotePollNotFoundError) -> * const dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError { ferment :: boxed (dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError { vote_poll : < crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll as ferment :: FFIConversionTo < dpp :: voting :: vote_polls :: VotePoll >> :: ffi_to (obj . vote_poll) }) } } impl Drop for dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . vote_poll) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError_ctor < > (vote_poll : * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll) -> * mut dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError { ferment :: boxed (dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError { vote_poll }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError_destroy < > (ffi : * mut dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError_get_vote_poll < > (obj : * const dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll { (* obj) . vote_poll } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError_set_vote_poll < > (obj : * const dpp_errors_consensus_state_voting_vote_poll_not_found_error_VotePollNotFoundError) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: dpp_voting_vote_polls_VotePoll { (* obj) . vote_poll } } } pub mod group { use crate as dash_spv_apple_bindings ; pub mod identity_not_member_of_group_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityNotMemberOfGroupError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError { pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub group_contract_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: group :: identity_not_member_of_group_error :: IdentityNotMemberOfGroupError > for dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError) -> dpp :: errors :: consensus :: state :: group :: identity_not_member_of_group_error :: IdentityNotMemberOfGroupError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: group :: identity_not_member_of_group_error :: IdentityNotMemberOfGroupError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) , data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) , group_contract_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionFrom < dpp :: data_contract :: GroupContractPosition >> :: ffi_from (ffi_ref . group_contract_position) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: group :: identity_not_member_of_group_error :: IdentityNotMemberOfGroupError > for dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: group :: identity_not_member_of_group_error :: IdentityNotMemberOfGroupError) -> * const dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError { ferment :: boxed (dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) , data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) , group_contract_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionTo < dpp :: data_contract :: GroupContractPosition >> :: ffi_to (obj . group_contract_position) }) } } impl Drop for dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . identity_id) ; ferment :: unbox_any (ffi_ref . data_contract_id) ; ferment :: unbox_any (ffi_ref . group_contract_position) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError_ctor < > (identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , group_contract_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition) -> * mut dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError { ferment :: boxed (dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError { identity_id , data_contract_id , group_contract_position }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError_destroy < > (ffi : * mut dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError_get_identity_id < > (obj : * const dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError_get_data_contract_id < > (obj : * const dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError_get_group_contract_position < > (obj : * const dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . group_contract_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError_set_identity_id < > (obj : * const dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError_set_data_contract_id < > (obj : * const dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError_set_group_contract_position < > (obj : * const dpp_errors_consensus_state_group_identity_not_member_of_group_error_IdentityNotMemberOfGroupError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . group_contract_position } } pub mod group_action_already_signed_by_identity_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`GroupActionAlreadySignedByIdentityError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError { pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub group_contract_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition , pub action_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: group :: group_action_already_signed_by_identity_error :: GroupActionAlreadySignedByIdentityError > for dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError) -> dpp :: errors :: consensus :: state :: group :: group_action_already_signed_by_identity_error :: GroupActionAlreadySignedByIdentityError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: group :: group_action_already_signed_by_identity_error :: GroupActionAlreadySignedByIdentityError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) , data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) , group_contract_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionFrom < dpp :: data_contract :: GroupContractPosition >> :: ffi_from (ffi_ref . group_contract_position) , action_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . action_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: group :: group_action_already_signed_by_identity_error :: GroupActionAlreadySignedByIdentityError > for dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: group :: group_action_already_signed_by_identity_error :: GroupActionAlreadySignedByIdentityError) -> * const dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError { ferment :: boxed (dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) , data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) , group_contract_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionTo < dpp :: data_contract :: GroupContractPosition >> :: ffi_to (obj . group_contract_position) , action_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . action_id) }) } } impl Drop for dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . identity_id) ; ferment :: unbox_any (ffi_ref . data_contract_id) ; ferment :: unbox_any (ffi_ref . group_contract_position) ; ferment :: unbox_any (ffi_ref . action_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError_ctor < > (identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , group_contract_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition , action_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError { ferment :: boxed (dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError { identity_id , data_contract_id , group_contract_position , action_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError_destroy < > (ffi : * mut dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError_get_identity_id < > (obj : * const dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError_get_data_contract_id < > (obj : * const dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError_get_group_contract_position < > (obj : * const dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . group_contract_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError_get_action_id < > (obj : * const dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . action_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError_set_identity_id < > (obj : * const dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError_set_data_contract_id < > (obj : * const dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError_set_group_contract_position < > (obj : * const dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . group_contract_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError_set_action_id < > (obj : * const dpp_errors_consensus_state_group_group_action_already_signed_by_identity_error_GroupActionAlreadySignedByIdentityError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . action_id } } pub mod group_action_does_not_exist_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`GroupActionDoesNotExistError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError { pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub group_contract_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition , pub action_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: group :: group_action_does_not_exist_error :: GroupActionDoesNotExistError > for dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError) -> dpp :: errors :: consensus :: state :: group :: group_action_does_not_exist_error :: GroupActionDoesNotExistError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: group :: group_action_does_not_exist_error :: GroupActionDoesNotExistError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) , group_contract_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionFrom < dpp :: data_contract :: GroupContractPosition >> :: ffi_from (ffi_ref . group_contract_position) , action_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . action_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: group :: group_action_does_not_exist_error :: GroupActionDoesNotExistError > for dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: group :: group_action_does_not_exist_error :: GroupActionDoesNotExistError) -> * const dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError { ferment :: boxed (dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) , group_contract_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionTo < dpp :: data_contract :: GroupContractPosition >> :: ffi_to (obj . group_contract_position) , action_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . action_id) }) } } impl Drop for dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data_contract_id) ; ferment :: unbox_any (ffi_ref . group_contract_position) ; ferment :: unbox_any (ffi_ref . action_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError_ctor < > (data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , group_contract_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition , action_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError { ferment :: boxed (dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError { data_contract_id , group_contract_position , action_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError_destroy < > (ffi : * mut dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError_get_data_contract_id < > (obj : * const dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError_get_group_contract_position < > (obj : * const dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . group_contract_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError_get_action_id < > (obj : * const dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . action_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError_set_data_contract_id < > (obj : * const dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError_set_group_contract_position < > (obj : * const dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . group_contract_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError_set_action_id < > (obj : * const dpp_errors_consensus_state_group_group_action_does_not_exist_error_GroupActionDoesNotExistError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . action_id } } pub mod group_action_already_completed_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`GroupActionAlreadyCompletedError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError { pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub group_contract_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition , pub action_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: group :: group_action_already_completed_error :: GroupActionAlreadyCompletedError > for dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError) -> dpp :: errors :: consensus :: state :: group :: group_action_already_completed_error :: GroupActionAlreadyCompletedError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: group :: group_action_already_completed_error :: GroupActionAlreadyCompletedError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) , group_contract_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionFrom < dpp :: data_contract :: GroupContractPosition >> :: ffi_from (ffi_ref . group_contract_position) , action_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . action_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: group :: group_action_already_completed_error :: GroupActionAlreadyCompletedError > for dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: group :: group_action_already_completed_error :: GroupActionAlreadyCompletedError) -> * const dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError { ferment :: boxed (dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) , group_contract_position : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionTo < dpp :: data_contract :: GroupContractPosition >> :: ffi_to (obj . group_contract_position) , action_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . action_id) }) } } impl Drop for dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data_contract_id) ; ferment :: unbox_any (ffi_ref . group_contract_position) ; ferment :: unbox_any (ffi_ref . action_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError_ctor < > (data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , group_contract_position : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition , action_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError { ferment :: boxed (dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError { data_contract_id , group_contract_position , action_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError_destroy < > (ffi : * mut dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError_get_data_contract_id < > (obj : * const dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError_get_group_contract_position < > (obj : * const dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . group_contract_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError_get_action_id < > (obj : * const dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . action_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError_set_data_contract_id < > (obj : * const dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError_set_group_contract_position < > (obj : * const dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition { (* obj) . group_contract_position } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError_set_action_id < > (obj : * const dpp_errors_consensus_state_group_group_action_already_completed_error_GroupActionAlreadyCompletedError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . action_id } } } pub mod document { use crate as dash_spv_apple_bindings ; pub mod document_timestamps_mismatch_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentTimestampsMismatchError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError { pub document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_timestamps_mismatch_error :: DocumentTimestampsMismatchError > for dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError) -> dpp :: errors :: consensus :: state :: document :: document_timestamps_mismatch_error :: DocumentTimestampsMismatchError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: document :: document_timestamps_mismatch_error :: DocumentTimestampsMismatchError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . document_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_timestamps_mismatch_error :: DocumentTimestampsMismatchError > for dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: document :: document_timestamps_mismatch_error :: DocumentTimestampsMismatchError) -> * const dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError { ferment :: boxed (dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . document_id) }) } } impl Drop for dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . document_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError_ctor < > (document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError { ferment :: boxed (dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError { document_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError_destroy < > (ffi : * mut dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError_get_document_id < > (obj : * const dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError_set_document_id < > (obj : * const dpp_errors_consensus_state_document_document_timestamps_mismatch_error_DocumentTimestampsMismatchError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } } pub mod duplicate_unique_index_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DuplicateUniqueIndexError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError { pub document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub duplicating_properties : * mut crate :: fermented :: generics :: Vec_String } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: duplicate_unique_index_error :: DuplicateUniqueIndexError > for dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError) -> dpp :: errors :: consensus :: state :: document :: duplicate_unique_index_error :: DuplicateUniqueIndexError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: document :: duplicate_unique_index_error :: DuplicateUniqueIndexError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . document_id) , duplicating_properties : < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionFrom < Vec < String > >> :: ffi_from (ffi_ref . duplicating_properties) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: duplicate_unique_index_error :: DuplicateUniqueIndexError > for dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: document :: duplicate_unique_index_error :: DuplicateUniqueIndexError) -> * const dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError { ferment :: boxed (dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . document_id) , duplicating_properties : < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionTo < Vec < String > >> :: ffi_to (obj . duplicating_properties) }) } } impl Drop for dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . document_id) ; ferment :: unbox_any (ffi_ref . duplicating_properties) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError_ctor < > (document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , duplicating_properties : * mut crate :: fermented :: generics :: Vec_String) -> * mut dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError { ferment :: boxed (dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError { document_id , duplicating_properties }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError_destroy < > (ffi : * mut dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError_get_document_id < > (obj : * const dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError_get_duplicating_properties < > (obj : * const dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError) -> * mut crate :: fermented :: generics :: Vec_String { (* obj) . duplicating_properties } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError_set_document_id < > (obj : * const dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError_set_duplicating_properties < > (obj : * const dpp_errors_consensus_state_document_duplicate_unique_index_error_DuplicateUniqueIndexError) -> * mut crate :: fermented :: generics :: Vec_String { (* obj) . duplicating_properties } } pub mod document_incorrect_purchase_price_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentIncorrectPurchasePriceError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError { pub document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub trying_to_purchase_at_price : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits , pub actual_price : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_incorrect_purchase_price_error :: DocumentIncorrectPurchasePriceError > for dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError) -> dpp :: errors :: consensus :: state :: document :: document_incorrect_purchase_price_error :: DocumentIncorrectPurchasePriceError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: document :: document_incorrect_purchase_price_error :: DocumentIncorrectPurchasePriceError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . document_id) , trying_to_purchase_at_price : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionFrom < dpp :: balances :: credits :: Credits >> :: ffi_from (ffi_ref . trying_to_purchase_at_price) , actual_price : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionFrom < dpp :: balances :: credits :: Credits >> :: ffi_from (ffi_ref . actual_price) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_incorrect_purchase_price_error :: DocumentIncorrectPurchasePriceError > for dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: document :: document_incorrect_purchase_price_error :: DocumentIncorrectPurchasePriceError) -> * const dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError { ferment :: boxed (dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . document_id) , trying_to_purchase_at_price : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionTo < dpp :: balances :: credits :: Credits >> :: ffi_to (obj . trying_to_purchase_at_price) , actual_price : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionTo < dpp :: balances :: credits :: Credits >> :: ffi_to (obj . actual_price) }) } } impl Drop for dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . document_id) ; ferment :: unbox_any (ffi_ref . trying_to_purchase_at_price) ; ferment :: unbox_any (ffi_ref . actual_price) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError_ctor < > (document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , trying_to_purchase_at_price : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits , actual_price : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits) -> * mut dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError { ferment :: boxed (dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError { document_id , trying_to_purchase_at_price , actual_price }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError_destroy < > (ffi : * mut dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError_get_document_id < > (obj : * const dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError_get_trying_to_purchase_at_price < > (obj : * const dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . trying_to_purchase_at_price } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError_get_actual_price < > (obj : * const dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . actual_price } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError_set_document_id < > (obj : * const dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError_set_trying_to_purchase_at_price < > (obj : * const dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . trying_to_purchase_at_price } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError_set_actual_price < > (obj : * const dpp_errors_consensus_state_document_document_incorrect_purchase_price_error_DocumentIncorrectPurchasePriceError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . actual_price } } pub mod invalid_document_revision_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidDocumentRevisionError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError { pub document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub previous_revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision , pub desired_revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: invalid_document_revision_error :: InvalidDocumentRevisionError > for dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError) -> dpp :: errors :: consensus :: state :: document :: invalid_document_revision_error :: InvalidDocumentRevisionError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: document :: invalid_document_revision_error :: InvalidDocumentRevisionError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . document_id) , previous_revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionFrom < dpp :: prelude :: Revision >> :: ffi_from_opt (ffi_ref . previous_revision) , desired_revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionFrom < dpp :: prelude :: Revision >> :: ffi_from (ffi_ref . desired_revision) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: invalid_document_revision_error :: InvalidDocumentRevisionError > for dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: document :: invalid_document_revision_error :: InvalidDocumentRevisionError) -> * const dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError { ferment :: boxed (dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . document_id) , previous_revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionTo < dpp :: prelude :: Revision >> :: ffi_to_opt (obj . previous_revision) , desired_revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionTo < dpp :: prelude :: Revision >> :: ffi_to (obj . desired_revision) }) } } impl Drop for dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . document_id) ; ferment :: unbox_any_opt (ffi_ref . previous_revision) ; ferment :: unbox_any (ffi_ref . desired_revision) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError_ctor < > (document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , previous_revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision , desired_revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision) -> * mut dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError { ferment :: boxed (dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError { document_id , previous_revision , desired_revision }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError_destroy < > (ffi : * mut dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError_get_document_id < > (obj : * const dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError_get_previous_revision < > (obj : * const dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . previous_revision } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError_get_desired_revision < > (obj : * const dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . desired_revision } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError_set_document_id < > (obj : * const dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError_set_previous_revision < > (obj : * const dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . previous_revision } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError_set_desired_revision < > (obj : * const dpp_errors_consensus_state_document_invalid_document_revision_error_InvalidDocumentRevisionError) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . desired_revision } } pub mod document_not_found_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentNotFoundError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError { pub document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_not_found_error :: DocumentNotFoundError > for dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError) -> dpp :: errors :: consensus :: state :: document :: document_not_found_error :: DocumentNotFoundError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: document :: document_not_found_error :: DocumentNotFoundError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . document_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_not_found_error :: DocumentNotFoundError > for dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: document :: document_not_found_error :: DocumentNotFoundError) -> * const dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError { ferment :: boxed (dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . document_id) }) } } impl Drop for dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . document_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError_ctor < > (document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError { ferment :: boxed (dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError { document_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError_destroy < > (ffi : * mut dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError_get_document_id < > (obj : * const dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError_set_document_id < > (obj : * const dpp_errors_consensus_state_document_document_not_found_error_DocumentNotFoundError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } } pub mod document_contest_identity_already_contestant { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentContestIdentityAlreadyContestantError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError { pub vote_poll : * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll , pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_contest_identity_already_contestant :: DocumentContestIdentityAlreadyContestantError > for dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError) -> dpp :: errors :: consensus :: state :: document :: document_contest_identity_already_contestant :: DocumentContestIdentityAlreadyContestantError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: document :: document_contest_identity_already_contestant :: DocumentContestIdentityAlreadyContestantError { vote_poll : < crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll as ferment :: FFIConversionFrom < dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: ContestedDocumentResourceVotePoll >> :: ffi_from (ffi_ref . vote_poll) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_contest_identity_already_contestant :: DocumentContestIdentityAlreadyContestantError > for dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: document :: document_contest_identity_already_contestant :: DocumentContestIdentityAlreadyContestantError) -> * const dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError { ferment :: boxed (dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError { vote_poll : < crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll as ferment :: FFIConversionTo < dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: ContestedDocumentResourceVotePoll >> :: ffi_to (obj . vote_poll) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) }) } } impl Drop for dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . vote_poll) ; ferment :: unbox_any (ffi_ref . identity_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError_ctor < > (vote_poll : * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll , identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError { ferment :: boxed (dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError { vote_poll , identity_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError_destroy < > (ffi : * mut dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError_get_vote_poll < > (obj : * const dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll { (* obj) . vote_poll } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError_get_identity_id < > (obj : * const dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError_set_vote_poll < > (obj : * const dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll { (* obj) . vote_poll } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError_set_identity_id < > (obj : * const dpp_errors_consensus_state_document_document_contest_identity_already_contestant_DocumentContestIdentityAlreadyContestantError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } } pub mod document_timestamps_are_equal_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentTimestampsAreEqualError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError { pub document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_timestamps_are_equal_error :: DocumentTimestampsAreEqualError > for dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError) -> dpp :: errors :: consensus :: state :: document :: document_timestamps_are_equal_error :: DocumentTimestampsAreEqualError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: document :: document_timestamps_are_equal_error :: DocumentTimestampsAreEqualError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . document_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_timestamps_are_equal_error :: DocumentTimestampsAreEqualError > for dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: document :: document_timestamps_are_equal_error :: DocumentTimestampsAreEqualError) -> * const dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError { ferment :: boxed (dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . document_id) }) } } impl Drop for dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . document_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError_ctor < > (document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError { ferment :: boxed (dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError { document_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError_destroy < > (ffi : * mut dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError_get_document_id < > (obj : * const dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError_set_document_id < > (obj : * const dpp_errors_consensus_state_document_document_timestamps_are_equal_error_DocumentTimestampsAreEqualError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } } pub mod document_contest_not_joinable_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentContestNotJoinableError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError { pub vote_poll : * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll , pub stored_info : * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo , pub start_time : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis , pub current_time : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis , pub joinable_time : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_contest_not_joinable_error :: DocumentContestNotJoinableError > for dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError) -> dpp :: errors :: consensus :: state :: document :: document_contest_not_joinable_error :: DocumentContestNotJoinableError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: document :: document_contest_not_joinable_error :: DocumentContestNotJoinableError { vote_poll : < crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll as ferment :: FFIConversionFrom < dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: ContestedDocumentResourceVotePoll >> :: ffi_from (ffi_ref . vote_poll) , stored_info : < crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo as ferment :: FFIConversionFrom < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStoredInfo >> :: ffi_from (ffi_ref . stored_info) , start_time : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis as ferment :: FFIConversionFrom < dpp :: prelude :: TimestampMillis >> :: ffi_from (ffi_ref . start_time) , current_time : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis as ferment :: FFIConversionFrom < dpp :: prelude :: TimestampMillis >> :: ffi_from (ffi_ref . current_time) , joinable_time : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis as ferment :: FFIConversionFrom < dpp :: prelude :: TimestampMillis >> :: ffi_from (ffi_ref . joinable_time) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_contest_not_joinable_error :: DocumentContestNotJoinableError > for dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: document :: document_contest_not_joinable_error :: DocumentContestNotJoinableError) -> * const dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError { ferment :: boxed (dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError { vote_poll : < crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll as ferment :: FFIConversionTo < dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: ContestedDocumentResourceVotePoll >> :: ffi_to (obj . vote_poll) , stored_info : < crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo as ferment :: FFIConversionTo < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStoredInfo >> :: ffi_to (obj . stored_info) , start_time : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis as ferment :: FFIConversionTo < dpp :: prelude :: TimestampMillis >> :: ffi_to (obj . start_time) , current_time : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis as ferment :: FFIConversionTo < dpp :: prelude :: TimestampMillis >> :: ffi_to (obj . current_time) , joinable_time : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis as ferment :: FFIConversionTo < dpp :: prelude :: TimestampMillis >> :: ffi_to (obj . joinable_time) }) } } impl Drop for dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . vote_poll) ; ferment :: unbox_any (ffi_ref . stored_info) ; ferment :: unbox_any (ffi_ref . start_time) ; ferment :: unbox_any (ffi_ref . current_time) ; ferment :: unbox_any (ffi_ref . joinable_time) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError_ctor < > (vote_poll : * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll , stored_info : * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo , start_time : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis , current_time : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis , joinable_time : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis) -> * mut dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError { ferment :: boxed (dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError { vote_poll , stored_info , start_time , current_time , joinable_time }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError_destroy < > (ffi : * mut dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError_get_vote_poll < > (obj : * const dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll { (* obj) . vote_poll } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError_get_stored_info < > (obj : * const dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo { (* obj) . stored_info } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError_get_start_time < > (obj : * const dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis { (* obj) . start_time } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError_get_current_time < > (obj : * const dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis { (* obj) . current_time } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError_get_joinable_time < > (obj : * const dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis { (* obj) . joinable_time } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError_set_vote_poll < > (obj : * const dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll { (* obj) . vote_poll } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError_set_stored_info < > (obj : * const dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo { (* obj) . stored_info } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError_set_start_time < > (obj : * const dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis { (* obj) . start_time } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError_set_current_time < > (obj : * const dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis { (* obj) . current_time } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError_set_joinable_time < > (obj : * const dpp_errors_consensus_state_document_document_contest_not_joinable_error_DocumentContestNotJoinableError) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis { (* obj) . joinable_time } } pub mod document_contest_not_paid_for_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentContestNotPaidForError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError { pub document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub expected_amount : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits , pub paid_amount : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_contest_not_paid_for_error :: DocumentContestNotPaidForError > for dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError) -> dpp :: errors :: consensus :: state :: document :: document_contest_not_paid_for_error :: DocumentContestNotPaidForError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: document :: document_contest_not_paid_for_error :: DocumentContestNotPaidForError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . document_id) , expected_amount : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionFrom < dpp :: balances :: credits :: Credits >> :: ffi_from (ffi_ref . expected_amount) , paid_amount : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionFrom < dpp :: balances :: credits :: Credits >> :: ffi_from (ffi_ref . paid_amount) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_contest_not_paid_for_error :: DocumentContestNotPaidForError > for dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: document :: document_contest_not_paid_for_error :: DocumentContestNotPaidForError) -> * const dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError { ferment :: boxed (dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . document_id) , expected_amount : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionTo < dpp :: balances :: credits :: Credits >> :: ffi_to (obj . expected_amount) , paid_amount : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionTo < dpp :: balances :: credits :: Credits >> :: ffi_to (obj . paid_amount) }) } } impl Drop for dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . document_id) ; ferment :: unbox_any (ffi_ref . expected_amount) ; ferment :: unbox_any (ffi_ref . paid_amount) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError_ctor < > (document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , expected_amount : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits , paid_amount : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits) -> * mut dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError { ferment :: boxed (dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError { document_id , expected_amount , paid_amount }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError_destroy < > (ffi : * mut dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError_get_document_id < > (obj : * const dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError_get_expected_amount < > (obj : * const dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . expected_amount } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError_get_paid_amount < > (obj : * const dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . paid_amount } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError_set_document_id < > (obj : * const dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError_set_expected_amount < > (obj : * const dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . expected_amount } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError_set_paid_amount < > (obj : * const dpp_errors_consensus_state_document_document_contest_not_paid_for_error_DocumentContestNotPaidForError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . paid_amount } } pub mod document_not_for_sale_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentNotForSaleError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError { pub document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_not_for_sale_error :: DocumentNotForSaleError > for dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError) -> dpp :: errors :: consensus :: state :: document :: document_not_for_sale_error :: DocumentNotForSaleError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: document :: document_not_for_sale_error :: DocumentNotForSaleError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . document_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_not_for_sale_error :: DocumentNotForSaleError > for dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: document :: document_not_for_sale_error :: DocumentNotForSaleError) -> * const dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError { ferment :: boxed (dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . document_id) }) } } impl Drop for dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . document_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError_ctor < > (document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError { ferment :: boxed (dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError { document_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError_destroy < > (ffi : * mut dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError_get_document_id < > (obj : * const dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError_set_document_id < > (obj : * const dpp_errors_consensus_state_document_document_not_for_sale_error_DocumentNotForSaleError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } } pub mod document_contest_document_with_same_id_already_present_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentContestDocumentWithSameIdAlreadyPresentError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError { pub document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_contest_document_with_same_id_already_present_error :: DocumentContestDocumentWithSameIdAlreadyPresentError > for dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError) -> dpp :: errors :: consensus :: state :: document :: document_contest_document_with_same_id_already_present_error :: DocumentContestDocumentWithSameIdAlreadyPresentError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: document :: document_contest_document_with_same_id_already_present_error :: DocumentContestDocumentWithSameIdAlreadyPresentError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . document_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_contest_document_with_same_id_already_present_error :: DocumentContestDocumentWithSameIdAlreadyPresentError > for dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: document :: document_contest_document_with_same_id_already_present_error :: DocumentContestDocumentWithSameIdAlreadyPresentError) -> * const dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError { ferment :: boxed (dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . document_id) }) } } impl Drop for dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . document_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError_ctor < > (document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError { ferment :: boxed (dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError { document_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError_destroy < > (ffi : * mut dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError_get_document_id < > (obj : * const dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError_set_document_id < > (obj : * const dpp_errors_consensus_state_document_document_contest_document_with_same_id_already_present_error_DocumentContestDocumentWithSameIdAlreadyPresentError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } } pub mod document_contest_currently_locked_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentContestCurrentlyLockedError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError { pub vote_poll : * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll , pub stored_info : * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo , pub unlock_cost : u64 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_contest_currently_locked_error :: DocumentContestCurrentlyLockedError > for dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError) -> dpp :: errors :: consensus :: state :: document :: document_contest_currently_locked_error :: DocumentContestCurrentlyLockedError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: document :: document_contest_currently_locked_error :: DocumentContestCurrentlyLockedError { vote_poll : < crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll as ferment :: FFIConversionFrom < dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: ContestedDocumentResourceVotePoll >> :: ffi_from (ffi_ref . vote_poll) , stored_info : < crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo as ferment :: FFIConversionFrom < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStoredInfo >> :: ffi_from (ffi_ref . stored_info) , unlock_cost : ffi_ref . unlock_cost } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_contest_currently_locked_error :: DocumentContestCurrentlyLockedError > for dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: document :: document_contest_currently_locked_error :: DocumentContestCurrentlyLockedError) -> * const dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError { ferment :: boxed (dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError { vote_poll : < crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll as ferment :: FFIConversionTo < dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: ContestedDocumentResourceVotePoll >> :: ffi_to (obj . vote_poll) , stored_info : < crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo as ferment :: FFIConversionTo < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: ContestedDocumentVotePollStoredInfo >> :: ffi_to (obj . stored_info) , unlock_cost : obj . unlock_cost }) } } impl Drop for dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . vote_poll) ; ferment :: unbox_any (ffi_ref . stored_info) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError_ctor < > (vote_poll : * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll , stored_info : * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo , unlock_cost : u64) -> * mut dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError { ferment :: boxed (dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError { vote_poll , stored_info , unlock_cost }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError_destroy < > (ffi : * mut dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError_get_vote_poll < > (obj : * const dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll { (* obj) . vote_poll } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError_get_stored_info < > (obj : * const dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo { (* obj) . stored_info } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError_get_unlock_cost < > (obj : * const dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError) -> u64 { (* obj) . unlock_cost } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError_set_vote_poll < > (obj : * const dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_polls :: contested_document_resource_vote_poll :: dpp_voting_vote_polls_contested_document_resource_vote_poll_ContestedDocumentResourceVotePoll { (* obj) . vote_poll } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError_set_stored_info < > (obj : * const dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError) -> * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_ContestedDocumentVotePollStoredInfo { (* obj) . stored_info } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError_set_unlock_cost < > (obj : * const dpp_errors_consensus_state_document_document_contest_currently_locked_error_DocumentContestCurrentlyLockedError) -> u64 { (* obj) . unlock_cost } } pub mod document_already_present_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentAlreadyPresentError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError { pub document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_already_present_error :: DocumentAlreadyPresentError > for dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError) -> dpp :: errors :: consensus :: state :: document :: document_already_present_error :: DocumentAlreadyPresentError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: document :: document_already_present_error :: DocumentAlreadyPresentError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . document_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_already_present_error :: DocumentAlreadyPresentError > for dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: document :: document_already_present_error :: DocumentAlreadyPresentError) -> * const dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError { ferment :: boxed (dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . document_id) }) } } impl Drop for dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . document_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError_ctor < > (document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError { ferment :: boxed (dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError { document_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError_destroy < > (ffi : * mut dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError_get_document_id < > (obj : * const dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError_set_document_id < > (obj : * const dpp_errors_consensus_state_document_document_already_present_error_DocumentAlreadyPresentError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } } pub mod document_owner_id_mismatch_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentOwnerIdMismatchError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError { pub document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub document_owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub existing_document_owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_owner_id_mismatch_error :: DocumentOwnerIdMismatchError > for dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError) -> dpp :: errors :: consensus :: state :: document :: document_owner_id_mismatch_error :: DocumentOwnerIdMismatchError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: document :: document_owner_id_mismatch_error :: DocumentOwnerIdMismatchError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . document_id) , document_owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . document_owner_id) , existing_document_owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . existing_document_owner_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_owner_id_mismatch_error :: DocumentOwnerIdMismatchError > for dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: document :: document_owner_id_mismatch_error :: DocumentOwnerIdMismatchError) -> * const dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError { ferment :: boxed (dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError { document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . document_id) , document_owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . document_owner_id) , existing_document_owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . existing_document_owner_id) }) } } impl Drop for dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . document_id) ; ferment :: unbox_any (ffi_ref . document_owner_id) ; ferment :: unbox_any (ffi_ref . existing_document_owner_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError_ctor < > (document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , document_owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , existing_document_owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError { ferment :: boxed (dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError { document_id , document_owner_id , existing_document_owner_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError_destroy < > (ffi : * mut dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError_get_document_id < > (obj : * const dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError_get_document_owner_id < > (obj : * const dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_owner_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError_get_existing_document_owner_id < > (obj : * const dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . existing_document_owner_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError_set_document_id < > (obj : * const dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError_set_document_owner_id < > (obj : * const dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_owner_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError_set_existing_document_owner_id < > (obj : * const dpp_errors_consensus_state_document_document_owner_id_mismatch_error_DocumentOwnerIdMismatchError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . existing_document_owner_id } } pub mod document_timestamp_window_violation_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentTimestampWindowViolationError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError { pub timestamp_name : * mut std :: os :: raw :: c_char , pub document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub timestamp : i64 , pub time_window_start : i64 , pub time_window_end : i64 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: document :: document_timestamp_window_violation_error :: DocumentTimestampWindowViolationError > for dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError) -> dpp :: errors :: consensus :: state :: document :: document_timestamp_window_violation_error :: DocumentTimestampWindowViolationError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: document :: document_timestamp_window_violation_error :: DocumentTimestampWindowViolationError { timestamp_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . timestamp_name) , document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . document_id) , timestamp : ffi_ref . timestamp , time_window_start : ffi_ref . time_window_start , time_window_end : ffi_ref . time_window_end } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: document :: document_timestamp_window_violation_error :: DocumentTimestampWindowViolationError > for dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: document :: document_timestamp_window_violation_error :: DocumentTimestampWindowViolationError) -> * const dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError { ferment :: boxed (dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError { timestamp_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . timestamp_name) , document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . document_id) , timestamp : obj . timestamp , time_window_start : obj . time_window_start , time_window_end : obj . time_window_end }) } } impl Drop for dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . timestamp_name) ; ferment :: unbox_any (ffi_ref . document_id) ; ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError_ctor < > (timestamp_name : * mut std :: os :: raw :: c_char , document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , timestamp : i64 , time_window_start : i64 , time_window_end : i64) -> * mut dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError { ferment :: boxed (dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError { timestamp_name , document_id , timestamp , time_window_start , time_window_end }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError_destroy < > (ffi : * mut dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError_get_timestamp_name < > (obj : * const dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError) -> * mut std :: os :: raw :: c_char { (* obj) . timestamp_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError_get_document_id < > (obj : * const dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError_get_timestamp < > (obj : * const dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError) -> i64 { (* obj) . timestamp } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError_get_time_window_start < > (obj : * const dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError) -> i64 { (* obj) . time_window_start } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError_get_time_window_end < > (obj : * const dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError) -> i64 { (* obj) . time_window_end } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError_set_timestamp_name < > (obj : * const dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError) -> * mut std :: os :: raw :: c_char { (* obj) . timestamp_name } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError_set_document_id < > (obj : * const dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError_set_timestamp < > (obj : * const dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError) -> i64 { (* obj) . timestamp } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError_set_time_window_start < > (obj : * const dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError) -> i64 { (* obj) . time_window_start } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError_set_time_window_end < > (obj : * const dpp_errors_consensus_state_document_document_timestamp_window_violation_error_DocumentTimestampWindowViolationError) -> i64 { (* obj) . time_window_end } } } pub mod identity { use crate as dash_spv_apple_bindings ; pub mod invalid_identity_revision_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIdentityRevisionError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError { pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub current_revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: invalid_identity_revision_error :: InvalidIdentityRevisionError > for dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError) -> dpp :: errors :: consensus :: state :: identity :: invalid_identity_revision_error :: InvalidIdentityRevisionError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: identity :: invalid_identity_revision_error :: InvalidIdentityRevisionError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) , current_revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionFrom < dpp :: prelude :: Revision >> :: ffi_from (ffi_ref . current_revision) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: invalid_identity_revision_error :: InvalidIdentityRevisionError > for dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: identity :: invalid_identity_revision_error :: InvalidIdentityRevisionError) -> * const dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError { ferment :: boxed (dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) , current_revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionTo < dpp :: prelude :: Revision >> :: ffi_to (obj . current_revision) }) } } impl Drop for dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . identity_id) ; ferment :: unbox_any (ffi_ref . current_revision) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError_ctor < > (identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , current_revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision) -> * mut dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError { ferment :: boxed (dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError { identity_id , current_revision }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError_destroy < > (ffi : * mut dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError_get_identity_id < > (obj : * const dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError_get_current_revision < > (obj : * const dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . current_revision } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError_set_identity_id < > (obj : * const dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError_set_current_revision < > (obj : * const dpp_errors_consensus_state_identity_invalid_identity_revision_error_InvalidIdentityRevisionError) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . current_revision } } pub mod identity_insufficient_balance_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityInsufficientBalanceError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError { pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub balance : u64 , pub required_balance : u64 } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: identity_insufficient_balance_error :: IdentityInsufficientBalanceError > for dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError) -> dpp :: errors :: consensus :: state :: identity :: identity_insufficient_balance_error :: IdentityInsufficientBalanceError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: identity :: identity_insufficient_balance_error :: IdentityInsufficientBalanceError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) , balance : ffi_ref . balance , required_balance : ffi_ref . required_balance } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: identity_insufficient_balance_error :: IdentityInsufficientBalanceError > for dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: identity :: identity_insufficient_balance_error :: IdentityInsufficientBalanceError) -> * const dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError { ferment :: boxed (dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) , balance : obj . balance , required_balance : obj . required_balance }) } } impl Drop for dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . identity_id) ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError_ctor < > (identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , balance : u64 , required_balance : u64) -> * mut dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError { ferment :: boxed (dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError { identity_id , balance , required_balance }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError_destroy < > (ffi : * mut dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError_get_identity_id < > (obj : * const dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError_get_balance < > (obj : * const dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError) -> u64 { (* obj) . balance } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError_get_required_balance < > (obj : * const dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError) -> u64 { (* obj) . required_balance } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError_set_identity_id < > (obj : * const dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError_set_balance < > (obj : * const dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError) -> u64 { (* obj) . balance } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError_set_required_balance < > (obj : * const dpp_errors_consensus_state_identity_identity_insufficient_balance_error_IdentityInsufficientBalanceError) -> u64 { (* obj) . required_balance } } pub mod invalid_identity_public_key_id_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIdentityPublicKeyIdError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError { pub id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: invalid_identity_public_key_id_error :: InvalidIdentityPublicKeyIdError > for dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError) -> dpp :: errors :: consensus :: state :: identity :: invalid_identity_public_key_id_error :: InvalidIdentityPublicKeyIdError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: identity :: invalid_identity_public_key_id_error :: InvalidIdentityPublicKeyIdError { id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: invalid_identity_public_key_id_error :: InvalidIdentityPublicKeyIdError > for dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: identity :: invalid_identity_public_key_id_error :: InvalidIdentityPublicKeyIdError) -> * const dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError { ferment :: boxed (dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError { id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . id) }) } } impl Drop for dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError_ctor < > (id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID) -> * mut dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError { ferment :: boxed (dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError { id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError_destroy < > (ffi : * mut dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError_get_id < > (obj : * const dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError_set_id < > (obj : * const dpp_errors_consensus_state_identity_invalid_identity_public_key_id_error_InvalidIdentityPublicKeyIdError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . id } } pub mod duplicated_identity_public_key_state_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DuplicatedIdentityPublicKeyStateError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError { pub duplicated_public_key_ids : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_state_error :: DuplicatedIdentityPublicKeyStateError > for dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError) -> dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_state_error :: DuplicatedIdentityPublicKeyStateError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_state_error :: DuplicatedIdentityPublicKeyStateError { duplicated_public_key_ids : < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < Vec < dpp :: identity :: identity_public_key :: KeyID > >> :: ffi_from (ffi_ref . duplicated_public_key_ids) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_state_error :: DuplicatedIdentityPublicKeyStateError > for dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_state_error :: DuplicatedIdentityPublicKeyStateError) -> * const dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError { ferment :: boxed (dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError { duplicated_public_key_ids : < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < Vec < dpp :: identity :: identity_public_key :: KeyID > >> :: ffi_to (obj . duplicated_public_key_ids) }) } } impl Drop for dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . duplicated_public_key_ids) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError_ctor < > (duplicated_public_key_ids : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID) -> * mut dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError { ferment :: boxed (dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError { duplicated_public_key_ids }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError_destroy < > (ffi : * mut dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError_get_duplicated_public_key_ids < > (obj : * const dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError) -> * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID { (* obj) . duplicated_public_key_ids } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError_set_duplicated_public_key_ids < > (obj : * const dpp_errors_consensus_state_identity_duplicated_identity_public_key_state_error_DuplicatedIdentityPublicKeyStateError) -> * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID { (* obj) . duplicated_public_key_ids } } pub mod missing_identity_public_key_ids_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MissingIdentityPublicKeyIdsError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError { pub ids : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: missing_identity_public_key_ids_error :: MissingIdentityPublicKeyIdsError > for dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError) -> dpp :: errors :: consensus :: state :: identity :: missing_identity_public_key_ids_error :: MissingIdentityPublicKeyIdsError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: identity :: missing_identity_public_key_ids_error :: MissingIdentityPublicKeyIdsError { ids : < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < Vec < dpp :: identity :: identity_public_key :: KeyID > >> :: ffi_from (ffi_ref . ids) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: missing_identity_public_key_ids_error :: MissingIdentityPublicKeyIdsError > for dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: identity :: missing_identity_public_key_ids_error :: MissingIdentityPublicKeyIdsError) -> * const dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError { ferment :: boxed (dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError { ids : < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < Vec < dpp :: identity :: identity_public_key :: KeyID > >> :: ffi_to (obj . ids) }) } } impl Drop for dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . ids) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError_ctor < > (ids : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID) -> * mut dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError { ferment :: boxed (dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError { ids }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError_destroy < > (ffi : * mut dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError_get_ids < > (obj : * const dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError) -> * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID { (* obj) . ids } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError_set_ids < > (obj : * const dpp_errors_consensus_state_identity_missing_identity_public_key_ids_error_MissingIdentityPublicKeyIdsError) -> * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID { (* obj) . ids } } pub mod identity_public_key_is_read_only_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityPublicKeyIsReadOnlyError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError { pub public_key_index : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_read_only_error :: IdentityPublicKeyIsReadOnlyError > for dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError) -> dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_read_only_error :: IdentityPublicKeyIsReadOnlyError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_read_only_error :: IdentityPublicKeyIsReadOnlyError { public_key_index : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . public_key_index) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_read_only_error :: IdentityPublicKeyIsReadOnlyError > for dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_read_only_error :: IdentityPublicKeyIsReadOnlyError) -> * const dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError { ferment :: boxed (dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError { public_key_index : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . public_key_index) }) } } impl Drop for dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . public_key_index) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError_ctor < > (public_key_index : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID) -> * mut dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError { ferment :: boxed (dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError { public_key_index }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError_destroy < > (ffi : * mut dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError_get_public_key_index < > (obj : * const dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . public_key_index } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError_set_public_key_index < > (obj : * const dpp_errors_consensus_state_identity_identity_public_key_is_read_only_error_IdentityPublicKeyIsReadOnlyError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . public_key_index } } pub mod identity_already_exists_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityAlreadyExistsError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError { pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: identity_already_exists_error :: IdentityAlreadyExistsError > for dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError) -> dpp :: errors :: consensus :: state :: identity :: identity_already_exists_error :: IdentityAlreadyExistsError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: identity :: identity_already_exists_error :: IdentityAlreadyExistsError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: identity_already_exists_error :: IdentityAlreadyExistsError > for dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: identity :: identity_already_exists_error :: IdentityAlreadyExistsError) -> * const dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError { ferment :: boxed (dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) }) } } impl Drop for dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . identity_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError_ctor < > (identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError { ferment :: boxed (dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError { identity_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError_destroy < > (ffi : * mut dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError_get_identity_id < > (obj : * const dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError_set_identity_id < > (obj : * const dpp_errors_consensus_state_identity_identity_already_exists_error_IdentityAlreadyExistsError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } } pub mod recipient_identity_does_not_exist_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`RecipientIdentityDoesNotExistError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError { pub recipient_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: recipient_identity_does_not_exist_error :: RecipientIdentityDoesNotExistError > for dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError) -> dpp :: errors :: consensus :: state :: identity :: recipient_identity_does_not_exist_error :: RecipientIdentityDoesNotExistError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: identity :: recipient_identity_does_not_exist_error :: RecipientIdentityDoesNotExistError { recipient_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . recipient_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: recipient_identity_does_not_exist_error :: RecipientIdentityDoesNotExistError > for dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: identity :: recipient_identity_does_not_exist_error :: RecipientIdentityDoesNotExistError) -> * const dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError { ferment :: boxed (dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError { recipient_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . recipient_id) }) } } impl Drop for dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . recipient_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError_ctor < > (recipient_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError { ferment :: boxed (dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError { recipient_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError_destroy < > (ffi : * mut dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError_get_recipient_id < > (obj : * const dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . recipient_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError_set_recipient_id < > (obj : * const dpp_errors_consensus_state_identity_recipient_identity_does_not_exist_error_RecipientIdentityDoesNotExistError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . recipient_id } } pub mod invalid_identity_contract_nonce_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIdentityNonceError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError { pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub current_identity_nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , pub setting_identity_nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , pub error : * mut crate :: fermented :: types :: dpp :: identity :: identity_nonce :: dpp_identity_identity_nonce_MergeIdentityNonceResult } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: invalid_identity_contract_nonce_error :: InvalidIdentityNonceError > for dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError) -> dpp :: errors :: consensus :: state :: identity :: invalid_identity_contract_nonce_error :: InvalidIdentityNonceError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: identity :: invalid_identity_contract_nonce_error :: InvalidIdentityNonceError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) , current_identity_nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionFrom < dpp :: prelude :: IdentityNonce >> :: ffi_from_opt (ffi_ref . current_identity_nonce) , setting_identity_nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionFrom < dpp :: prelude :: IdentityNonce >> :: ffi_from (ffi_ref . setting_identity_nonce) , error : < crate :: fermented :: types :: dpp :: identity :: identity_nonce :: dpp_identity_identity_nonce_MergeIdentityNonceResult as ferment :: FFIConversionFrom < dpp :: identity :: identity_nonce :: MergeIdentityNonceResult >> :: ffi_from (ffi_ref . error) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: invalid_identity_contract_nonce_error :: InvalidIdentityNonceError > for dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: identity :: invalid_identity_contract_nonce_error :: InvalidIdentityNonceError) -> * const dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError { ferment :: boxed (dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) , current_identity_nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionTo < dpp :: prelude :: IdentityNonce >> :: ffi_to_opt (obj . current_identity_nonce) , setting_identity_nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionTo < dpp :: prelude :: IdentityNonce >> :: ffi_to (obj . setting_identity_nonce) , error : < crate :: fermented :: types :: dpp :: identity :: identity_nonce :: dpp_identity_identity_nonce_MergeIdentityNonceResult as ferment :: FFIConversionTo < dpp :: identity :: identity_nonce :: MergeIdentityNonceResult >> :: ffi_to (obj . error) }) } } impl Drop for dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . identity_id) ; ferment :: unbox_any_opt (ffi_ref . current_identity_nonce) ; ferment :: unbox_any (ffi_ref . setting_identity_nonce) ; ferment :: unbox_any (ffi_ref . error) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError_ctor < > (identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , current_identity_nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , setting_identity_nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , error : * mut crate :: fermented :: types :: dpp :: identity :: identity_nonce :: dpp_identity_identity_nonce_MergeIdentityNonceResult) -> * mut dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError { ferment :: boxed (dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError { identity_id , current_identity_nonce , setting_identity_nonce , error }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError_destroy < > (ffi : * mut dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError_get_identity_id < > (obj : * const dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError_get_current_identity_nonce < > (obj : * const dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . current_identity_nonce } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError_get_setting_identity_nonce < > (obj : * const dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . setting_identity_nonce } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError_get_error < > (obj : * const dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_nonce :: dpp_identity_identity_nonce_MergeIdentityNonceResult { (* obj) . error } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError_set_identity_id < > (obj : * const dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError_set_current_identity_nonce < > (obj : * const dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . current_identity_nonce } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError_set_setting_identity_nonce < > (obj : * const dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . setting_identity_nonce } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError_set_error < > (obj : * const dpp_errors_consensus_state_identity_invalid_identity_contract_nonce_error_InvalidIdentityNonceError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_nonce :: dpp_identity_identity_nonce_MergeIdentityNonceResult { (* obj) . error } } pub mod missing_transfer_key_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MissingTransferKeyError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError { pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: missing_transfer_key_error :: MissingTransferKeyError > for dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError) -> dpp :: errors :: consensus :: state :: identity :: missing_transfer_key_error :: MissingTransferKeyError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: identity :: missing_transfer_key_error :: MissingTransferKeyError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: missing_transfer_key_error :: MissingTransferKeyError > for dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: identity :: missing_transfer_key_error :: MissingTransferKeyError) -> * const dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError { ferment :: boxed (dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) }) } } impl Drop for dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . identity_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError_ctor < > (identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError { ferment :: boxed (dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError { identity_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError_destroy < > (ffi : * mut dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError_get_identity_id < > (obj : * const dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError_set_identity_id < > (obj : * const dpp_errors_consensus_state_identity_missing_transfer_key_error_MissingTransferKeyError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } } pub mod max_identity_public_key_limit_reached_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MaxIdentityPublicKeyLimitReachedError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError { pub max_items : usize } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: max_identity_public_key_limit_reached_error :: MaxIdentityPublicKeyLimitReachedError > for dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError) -> dpp :: errors :: consensus :: state :: identity :: max_identity_public_key_limit_reached_error :: MaxIdentityPublicKeyLimitReachedError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: identity :: max_identity_public_key_limit_reached_error :: MaxIdentityPublicKeyLimitReachedError { max_items : ffi_ref . max_items } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: max_identity_public_key_limit_reached_error :: MaxIdentityPublicKeyLimitReachedError > for dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: identity :: max_identity_public_key_limit_reached_error :: MaxIdentityPublicKeyLimitReachedError) -> * const dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError { ferment :: boxed (dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError { max_items : obj . max_items }) } } impl Drop for dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError_ctor < > (max_items : usize) -> * mut dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError { ferment :: boxed (dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError { max_items }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError_destroy < > (ffi : * mut dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError_get_max_items < > (obj : * const dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError) -> usize { (* obj) . max_items } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError_set_max_items < > (obj : * const dpp_errors_consensus_state_identity_max_identity_public_key_limit_reached_error_MaxIdentityPublicKeyLimitReachedError) -> usize { (* obj) . max_items } } pub mod master_public_key_update_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MasterPublicKeyUpdateError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError { pub adding : usize , pub removing : usize , pub description : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: master_public_key_update_error :: MasterPublicKeyUpdateError > for dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError) -> dpp :: errors :: consensus :: state :: identity :: master_public_key_update_error :: MasterPublicKeyUpdateError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: identity :: master_public_key_update_error :: MasterPublicKeyUpdateError { adding : ffi_ref . adding , removing : ffi_ref . removing , description : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . description) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: master_public_key_update_error :: MasterPublicKeyUpdateError > for dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: identity :: master_public_key_update_error :: MasterPublicKeyUpdateError) -> * const dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError { ferment :: boxed (dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError { adding : obj . adding , removing : obj . removing , description : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . description) }) } } impl Drop for dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ferment :: unbox_string (ffi_ref . description) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError_ctor < > (adding : usize , removing : usize , description : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError { ferment :: boxed (dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError { adding , removing , description }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError_destroy < > (ffi : * mut dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError_get_adding < > (obj : * const dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError) -> usize { (* obj) . adding } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError_get_removing < > (obj : * const dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError) -> usize { (* obj) . removing } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError_get_description < > (obj : * const dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . description } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError_set_adding < > (obj : * const dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError) -> usize { (* obj) . adding } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError_set_removing < > (obj : * const dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError) -> usize { (* obj) . removing } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError_set_description < > (obj : * const dpp_errors_consensus_state_identity_master_public_key_update_error_MasterPublicKeyUpdateError) -> * mut std :: os :: raw :: c_char { (* obj) . description } } pub mod no_transfer_key_for_core_withdrawal_available_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`NoTransferKeyForCoreWithdrawalAvailableError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError { pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: no_transfer_key_for_core_withdrawal_available_error :: NoTransferKeyForCoreWithdrawalAvailableError > for dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError) -> dpp :: errors :: consensus :: state :: identity :: no_transfer_key_for_core_withdrawal_available_error :: NoTransferKeyForCoreWithdrawalAvailableError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: identity :: no_transfer_key_for_core_withdrawal_available_error :: NoTransferKeyForCoreWithdrawalAvailableError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: no_transfer_key_for_core_withdrawal_available_error :: NoTransferKeyForCoreWithdrawalAvailableError > for dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: identity :: no_transfer_key_for_core_withdrawal_available_error :: NoTransferKeyForCoreWithdrawalAvailableError) -> * const dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError { ferment :: boxed (dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) }) } } impl Drop for dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . identity_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError_ctor < > (identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError { ferment :: boxed (dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError { identity_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError_destroy < > (ffi : * mut dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError_get_identity_id < > (obj : * const dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError_set_identity_id < > (obj : * const dpp_errors_consensus_state_identity_no_transfer_key_for_core_withdrawal_available_error_NoTransferKeyForCoreWithdrawalAvailableError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } } pub mod identity_public_key_is_disabled_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityPublicKeyIsDisabledError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError { pub public_key_index : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_disabled_error :: IdentityPublicKeyIsDisabledError > for dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError) -> dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_disabled_error :: IdentityPublicKeyIsDisabledError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_disabled_error :: IdentityPublicKeyIsDisabledError { public_key_index : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . public_key_index) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_disabled_error :: IdentityPublicKeyIsDisabledError > for dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: identity :: identity_public_key_is_disabled_error :: IdentityPublicKeyIsDisabledError) -> * const dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError { ferment :: boxed (dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError { public_key_index : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . public_key_index) }) } } impl Drop for dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . public_key_index) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError_ctor < > (public_key_index : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID) -> * mut dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError { ferment :: boxed (dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError { public_key_index }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError_destroy < > (ffi : * mut dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError_get_public_key_index < > (obj : * const dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . public_key_index } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError_set_public_key_index < > (obj : * const dpp_errors_consensus_state_identity_identity_public_key_is_disabled_error_IdentityPublicKeyIsDisabledError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . public_key_index } } pub mod duplicated_identity_public_key_id_state_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DuplicatedIdentityPublicKeyIdStateError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError { pub duplicated_ids : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_id_state_error :: DuplicatedIdentityPublicKeyIdStateError > for dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError) -> dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_id_state_error :: DuplicatedIdentityPublicKeyIdStateError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_id_state_error :: DuplicatedIdentityPublicKeyIdStateError { duplicated_ids : < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < Vec < dpp :: identity :: identity_public_key :: KeyID > >> :: ffi_from (ffi_ref . duplicated_ids) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_id_state_error :: DuplicatedIdentityPublicKeyIdStateError > for dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: identity :: duplicated_identity_public_key_id_state_error :: DuplicatedIdentityPublicKeyIdStateError) -> * const dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError { ferment :: boxed (dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError { duplicated_ids : < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < Vec < dpp :: identity :: identity_public_key :: KeyID > >> :: ffi_to (obj . duplicated_ids) }) } } impl Drop for dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . duplicated_ids) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError_ctor < > (duplicated_ids : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID) -> * mut dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError { ferment :: boxed (dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError { duplicated_ids }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError_destroy < > (ffi : * mut dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError_get_duplicated_ids < > (obj : * const dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError) -> * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID { (* obj) . duplicated_ids } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError_set_duplicated_ids < > (obj : * const dpp_errors_consensus_state_identity_duplicated_identity_public_key_id_state_error_DuplicatedIdentityPublicKeyIdStateError) -> * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID { (* obj) . duplicated_ids } } pub mod identity_public_key_already_exists_for_unique_contract_bounds_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError { pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub purpose : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose , pub new_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , pub old_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: identity :: identity_public_key_already_exists_for_unique_contract_bounds_error :: IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError > for dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError) -> dpp :: errors :: consensus :: state :: identity :: identity_public_key_already_exists_for_unique_contract_bounds_error :: IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: identity :: identity_public_key_already_exists_for_unique_contract_bounds_error :: IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) , contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . contract_id) , purpose : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: purpose :: Purpose >> :: ffi_from (ffi_ref . purpose) , new_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . new_key_id) , old_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . old_key_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: identity :: identity_public_key_already_exists_for_unique_contract_bounds_error :: IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError > for dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: identity :: identity_public_key_already_exists_for_unique_contract_bounds_error :: IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError) -> * const dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError { ferment :: boxed (dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) , contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . contract_id) , purpose : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: purpose :: Purpose >> :: ffi_to (obj . purpose) , new_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . new_key_id) , old_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . old_key_id) }) } } impl Drop for dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . identity_id) ; ferment :: unbox_any (ffi_ref . contract_id) ; ferment :: unbox_any (ffi_ref . purpose) ; ferment :: unbox_any (ffi_ref . new_key_id) ; ferment :: unbox_any (ffi_ref . old_key_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError_ctor < > (identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , purpose : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose , new_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , old_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID) -> * mut dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError { ferment :: boxed (dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError { identity_id , contract_id , purpose , new_key_id , old_key_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError_destroy < > (ffi : * mut dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError_get_identity_id < > (obj : * const dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError_get_contract_id < > (obj : * const dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError_get_purpose < > (obj : * const dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose { (* obj) . purpose } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError_get_new_key_id < > (obj : * const dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . new_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError_get_old_key_id < > (obj : * const dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . old_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError_set_identity_id < > (obj : * const dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError_set_contract_id < > (obj : * const dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError_set_purpose < > (obj : * const dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose { (* obj) . purpose } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError_set_new_key_id < > (obj : * const dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . new_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError_set_old_key_id < > (obj : * const dpp_errors_consensus_state_identity_identity_public_key_already_exists_for_unique_contract_bounds_error_IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . old_key_id } } } # [cfg (feature = "state-transition-validation")] pub mod data_trigger { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DataTriggerError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_errors_consensus_state_data_trigger_DataTriggerError { DataTriggerConditionError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_condition_error :: dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError) , DataTriggerExecutionError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_execution_error :: dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError) , DataTriggerInvalidResultError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_invalid_result_error :: dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError) } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_trigger :: DataTriggerError > for dpp_errors_consensus_state_data_trigger_DataTriggerError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_data_trigger_DataTriggerError) -> dpp :: errors :: consensus :: state :: data_trigger :: DataTriggerError { let ffi_ref = & * ffi ; match ffi_ref { dpp_errors_consensus_state_data_trigger_DataTriggerError :: DataTriggerConditionError (o_0) => dpp :: errors :: consensus :: state :: data_trigger :: DataTriggerError :: DataTriggerConditionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_condition_error :: dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_condition_error :: DataTriggerConditionError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_data_trigger_DataTriggerError :: DataTriggerExecutionError (o_0) => dpp :: errors :: consensus :: state :: data_trigger :: DataTriggerError :: DataTriggerExecutionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_execution_error :: dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_execution_error :: DataTriggerExecutionError >> :: ffi_from (* o_0)) , dpp_errors_consensus_state_data_trigger_DataTriggerError :: DataTriggerInvalidResultError (o_0) => dpp :: errors :: consensus :: state :: data_trigger :: DataTriggerError :: DataTriggerInvalidResultError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_invalid_result_error :: dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_invalid_result_error :: DataTriggerInvalidResultError >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_trigger :: DataTriggerError > for dpp_errors_consensus_state_data_trigger_DataTriggerError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: data_trigger :: DataTriggerError) -> * const dpp_errors_consensus_state_data_trigger_DataTriggerError { ferment :: boxed (match obj { dpp :: errors :: consensus :: state :: data_trigger :: DataTriggerError :: DataTriggerConditionError (o_0) => dpp_errors_consensus_state_data_trigger_DataTriggerError :: DataTriggerConditionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_condition_error :: dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_condition_error :: DataTriggerConditionError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: data_trigger :: DataTriggerError :: DataTriggerExecutionError (o_0) => dpp_errors_consensus_state_data_trigger_DataTriggerError :: DataTriggerExecutionError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_execution_error :: dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_execution_error :: DataTriggerExecutionError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: state :: data_trigger :: DataTriggerError :: DataTriggerInvalidResultError (o_0) => dpp_errors_consensus_state_data_trigger_DataTriggerError :: DataTriggerInvalidResultError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_invalid_result_error :: dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_invalid_result_error :: DataTriggerInvalidResultError >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_errors_consensus_state_data_trigger_DataTriggerError { fn drop (& mut self) { unsafe { match self { dpp_errors_consensus_state_data_trigger_DataTriggerError :: DataTriggerConditionError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_data_trigger_DataTriggerError :: DataTriggerExecutionError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_state_data_trigger_DataTriggerError :: DataTriggerInvalidResultError (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_DataTriggerError_DataTriggerConditionError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_condition_error :: dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError) -> * mut dpp_errors_consensus_state_data_trigger_DataTriggerError { ferment :: boxed (dpp_errors_consensus_state_data_trigger_DataTriggerError :: DataTriggerConditionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_DataTriggerError_DataTriggerExecutionError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_execution_error :: dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError) -> * mut dpp_errors_consensus_state_data_trigger_DataTriggerError { ferment :: boxed (dpp_errors_consensus_state_data_trigger_DataTriggerError :: DataTriggerExecutionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_DataTriggerError_DataTriggerInvalidResultError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_invalid_result_error :: dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError) -> * mut dpp_errors_consensus_state_data_trigger_DataTriggerError { ferment :: boxed (dpp_errors_consensus_state_data_trigger_DataTriggerError :: DataTriggerInvalidResultError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_DataTriggerError_destroy < > (ffi : * mut dpp_errors_consensus_state_data_trigger_DataTriggerError) { ferment :: unbox_any (ffi) ; } pub mod data_trigger_invalid_result_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataTriggerInvalidResultError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError { pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_invalid_result_error :: DataTriggerInvalidResultError > for dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError) -> dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_invalid_result_error :: DataTriggerInvalidResultError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_invalid_result_error :: DataTriggerInvalidResultError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) , document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . document_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_invalid_result_error :: DataTriggerInvalidResultError > for dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_invalid_result_error :: DataTriggerInvalidResultError) -> * const dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError { ferment :: boxed (dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) , document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . document_id) }) } } impl Drop for dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data_contract_id) ; ferment :: unbox_any (ffi_ref . document_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError_ctor < > (data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError { ferment :: boxed (dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError { data_contract_id , document_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError_destroy < > (ffi : * mut dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError_get_data_contract_id < > (obj : * const dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError_get_document_id < > (obj : * const dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError_set_data_contract_id < > (obj : * const dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError_set_document_id < > (obj : * const dpp_errors_consensus_state_data_trigger_data_trigger_invalid_result_error_DataTriggerInvalidResultError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } } pub mod data_trigger_execution_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataTriggerExecutionError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError { pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub message : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_execution_error :: DataTriggerExecutionError > for dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError) -> dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_execution_error :: DataTriggerExecutionError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_execution_error :: DataTriggerExecutionError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) , document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . document_id) , message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . message) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_execution_error :: DataTriggerExecutionError > for dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_execution_error :: DataTriggerExecutionError) -> * const dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError { ferment :: boxed (dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) , document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . document_id) , message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . message) }) } } impl Drop for dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data_contract_id) ; ferment :: unbox_any (ffi_ref . document_id) ; ferment :: unbox_string (ffi_ref . message) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError_ctor < > (data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , message : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError { ferment :: boxed (dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError { data_contract_id , document_id , message }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError_destroy < > (ffi : * mut dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError_get_data_contract_id < > (obj : * const dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError_get_document_id < > (obj : * const dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError_get_message < > (obj : * const dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError) -> * mut std :: os :: raw :: c_char { (* obj) . message } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError_set_data_contract_id < > (obj : * const dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError_set_document_id < > (obj : * const dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError_set_message < > (obj : * const dpp_errors_consensus_state_data_trigger_data_trigger_execution_error_DataTriggerExecutionError) -> * mut std :: os :: raw :: c_char { (* obj) . message } } pub mod data_trigger_condition_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataTriggerConditionError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError { pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub message : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_condition_error :: DataTriggerConditionError > for dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError) -> dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_condition_error :: DataTriggerConditionError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_condition_error :: DataTriggerConditionError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) , document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . document_id) , message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . message) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_condition_error :: DataTriggerConditionError > for dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: state :: data_trigger :: data_trigger_condition_error :: DataTriggerConditionError) -> * const dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError { ferment :: boxed (dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) , document_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . document_id) , message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . message) }) } } impl Drop for dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data_contract_id) ; ferment :: unbox_any (ffi_ref . document_id) ; ferment :: unbox_string (ffi_ref . message) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError_ctor < > (data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , document_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , message : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError { ferment :: boxed (dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError { data_contract_id , document_id , message }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError_destroy < > (ffi : * mut dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError_get_data_contract_id < > (obj : * const dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError_get_document_id < > (obj : * const dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError_get_message < > (obj : * const dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError) -> * mut std :: os :: raw :: c_char { (* obj) . message } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError_set_data_contract_id < > (obj : * const dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError_set_document_id < > (obj : * const dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . document_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError_set_message < > (obj : * const dpp_errors_consensus_state_data_trigger_data_trigger_condition_error_DataTriggerConditionError) -> * mut std :: os :: raw :: c_char { (* obj) . message } } } } pub mod fee { use crate as dash_spv_apple_bindings ; pub mod fee_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`FeeError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_errors_consensus_fee_fee_error_FeeError { BalanceIsNotEnoughError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: fee :: balance_is_not_enough_error :: dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError) } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: fee :: fee_error :: FeeError > for dpp_errors_consensus_fee_fee_error_FeeError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_fee_fee_error_FeeError) -> dpp :: errors :: consensus :: fee :: fee_error :: FeeError { let ffi_ref = & * ffi ; match ffi_ref { dpp_errors_consensus_fee_fee_error_FeeError :: BalanceIsNotEnoughError (o_0) => dpp :: errors :: consensus :: fee :: fee_error :: FeeError :: BalanceIsNotEnoughError (< crate :: fermented :: types :: dpp :: errors :: consensus :: fee :: balance_is_not_enough_error :: dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: fee :: balance_is_not_enough_error :: BalanceIsNotEnoughError >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: fee :: fee_error :: FeeError > for dpp_errors_consensus_fee_fee_error_FeeError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: fee :: fee_error :: FeeError) -> * const dpp_errors_consensus_fee_fee_error_FeeError { ferment :: boxed (match obj { dpp :: errors :: consensus :: fee :: fee_error :: FeeError :: BalanceIsNotEnoughError (o_0) => dpp_errors_consensus_fee_fee_error_FeeError :: BalanceIsNotEnoughError (< crate :: fermented :: types :: dpp :: errors :: consensus :: fee :: balance_is_not_enough_error :: dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: fee :: balance_is_not_enough_error :: BalanceIsNotEnoughError >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_errors_consensus_fee_fee_error_FeeError { fn drop (& mut self) { unsafe { match self { dpp_errors_consensus_fee_fee_error_FeeError :: BalanceIsNotEnoughError (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_fee_fee_error_FeeError_BalanceIsNotEnoughError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: fee :: balance_is_not_enough_error :: dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError) -> * mut dpp_errors_consensus_fee_fee_error_FeeError { ferment :: boxed (dpp_errors_consensus_fee_fee_error_FeeError :: BalanceIsNotEnoughError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_fee_fee_error_FeeError_destroy < > (ffi : * mut dpp_errors_consensus_fee_fee_error_FeeError) { ferment :: unbox_any (ffi) ; } } pub mod balance_is_not_enough_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`BalanceIsNotEnoughError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError { pub balance : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits , pub fee : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: fee :: balance_is_not_enough_error :: BalanceIsNotEnoughError > for dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError) -> dpp :: errors :: consensus :: fee :: balance_is_not_enough_error :: BalanceIsNotEnoughError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: fee :: balance_is_not_enough_error :: BalanceIsNotEnoughError { balance : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionFrom < dpp :: balances :: credits :: Credits >> :: ffi_from (ffi_ref . balance) , fee : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionFrom < dpp :: balances :: credits :: Credits >> :: ffi_from (ffi_ref . fee) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: fee :: balance_is_not_enough_error :: BalanceIsNotEnoughError > for dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: fee :: balance_is_not_enough_error :: BalanceIsNotEnoughError) -> * const dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError { ferment :: boxed (dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError { balance : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionTo < dpp :: balances :: credits :: Credits >> :: ffi_to (obj . balance) , fee : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionTo < dpp :: balances :: credits :: Credits >> :: ffi_to (obj . fee) }) } } impl Drop for dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . balance) ; ferment :: unbox_any (ffi_ref . fee) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError_ctor < > (balance : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits , fee : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits) -> * mut dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError { ferment :: boxed (dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError { balance , fee }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError_destroy < > (ffi : * mut dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError_get_balance < > (obj : * const dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . balance } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError_get_fee < > (obj : * const dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . fee } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError_set_balance < > (obj : * const dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . balance } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError_set_fee < > (obj : * const dpp_errors_consensus_fee_balance_is_not_enough_error_BalanceIsNotEnoughError) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . fee } } } pub mod consensus_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ConsensusError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_errors_consensus_consensus_error_ConsensusError { DefaultError , BasicError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: basic_error :: dpp_errors_consensus_basic_basic_error_BasicError) , StateError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: state_error :: dpp_errors_consensus_state_state_error_StateError) , SignatureError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: signature_error :: dpp_errors_consensus_signature_signature_error_SignatureError) , FeeError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: fee :: fee_error :: dpp_errors_consensus_fee_fee_error_FeeError) , # [cfg (test)] TestConsensusError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: test_consensus_error :: dpp_errors_consensus_test_consensus_error_TestConsensusError) } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: consensus_error :: ConsensusError > for dpp_errors_consensus_consensus_error_ConsensusError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_consensus_error_ConsensusError) -> dpp :: errors :: consensus :: consensus_error :: ConsensusError { let ffi_ref = & * ffi ; match ffi_ref { dpp_errors_consensus_consensus_error_ConsensusError :: DefaultError => dpp :: errors :: consensus :: consensus_error :: ConsensusError :: DefaultError , dpp_errors_consensus_consensus_error_ConsensusError :: BasicError (o_0) => dpp :: errors :: consensus :: consensus_error :: ConsensusError :: BasicError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: basic_error :: dpp_errors_consensus_basic_basic_error_BasicError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: basic_error :: BasicError >> :: ffi_from (* o_0)) , dpp_errors_consensus_consensus_error_ConsensusError :: StateError (o_0) => dpp :: errors :: consensus :: consensus_error :: ConsensusError :: StateError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: state_error :: dpp_errors_consensus_state_state_error_StateError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: state :: state_error :: StateError >> :: ffi_from (* o_0)) , dpp_errors_consensus_consensus_error_ConsensusError :: SignatureError (o_0) => dpp :: errors :: consensus :: consensus_error :: ConsensusError :: SignatureError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: signature_error :: dpp_errors_consensus_signature_signature_error_SignatureError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: signature_error :: SignatureError >> :: ffi_from (* o_0)) , dpp_errors_consensus_consensus_error_ConsensusError :: FeeError (o_0) => dpp :: errors :: consensus :: consensus_error :: ConsensusError :: FeeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: fee :: fee_error :: dpp_errors_consensus_fee_fee_error_FeeError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: fee :: fee_error :: FeeError >> :: ffi_from (* o_0)) , # [cfg (test)] dpp_errors_consensus_consensus_error_ConsensusError :: TestConsensusError (o_0) => dpp :: errors :: consensus :: consensus_error :: ConsensusError :: TestConsensusError (< crate :: fermented :: types :: dpp :: errors :: consensus :: test_consensus_error :: dpp_errors_consensus_test_consensus_error_TestConsensusError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: test_consensus_error :: TestConsensusError >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: consensus_error :: ConsensusError > for dpp_errors_consensus_consensus_error_ConsensusError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: consensus_error :: ConsensusError) -> * const dpp_errors_consensus_consensus_error_ConsensusError { ferment :: boxed (match obj { dpp :: errors :: consensus :: consensus_error :: ConsensusError :: DefaultError => dpp_errors_consensus_consensus_error_ConsensusError :: DefaultError , dpp :: errors :: consensus :: consensus_error :: ConsensusError :: BasicError (o_0) => dpp_errors_consensus_consensus_error_ConsensusError :: BasicError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: basic_error :: dpp_errors_consensus_basic_basic_error_BasicError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: basic_error :: BasicError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: consensus_error :: ConsensusError :: StateError (o_0) => dpp_errors_consensus_consensus_error_ConsensusError :: StateError (< crate :: fermented :: types :: dpp :: errors :: consensus :: state :: state_error :: dpp_errors_consensus_state_state_error_StateError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: state :: state_error :: StateError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: consensus_error :: ConsensusError :: SignatureError (o_0) => dpp_errors_consensus_consensus_error_ConsensusError :: SignatureError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: signature_error :: dpp_errors_consensus_signature_signature_error_SignatureError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: signature_error :: SignatureError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: consensus_error :: ConsensusError :: FeeError (o_0) => dpp_errors_consensus_consensus_error_ConsensusError :: FeeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: fee :: fee_error :: dpp_errors_consensus_fee_fee_error_FeeError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: fee :: fee_error :: FeeError >> :: ffi_to (o_0)) , # [cfg (test)] dpp :: errors :: consensus :: consensus_error :: ConsensusError :: TestConsensusError (o_0) => dpp_errors_consensus_consensus_error_ConsensusError :: TestConsensusError (< crate :: fermented :: types :: dpp :: errors :: consensus :: test_consensus_error :: dpp_errors_consensus_test_consensus_error_TestConsensusError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: test_consensus_error :: TestConsensusError >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_errors_consensus_consensus_error_ConsensusError { fn drop (& mut self) { unsafe { match self { dpp_errors_consensus_consensus_error_ConsensusError :: DefaultError => { } , dpp_errors_consensus_consensus_error_ConsensusError :: BasicError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_consensus_error_ConsensusError :: StateError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_consensus_error_ConsensusError :: SignatureError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_consensus_error_ConsensusError :: FeeError (o_0) => { ferment :: unbox_any (* o_0) ; } , # [cfg (test)] dpp_errors_consensus_consensus_error_ConsensusError :: TestConsensusError (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_consensus_error_ConsensusError_DefaultError_ctor () -> * mut dpp_errors_consensus_consensus_error_ConsensusError { ferment :: boxed (dpp_errors_consensus_consensus_error_ConsensusError :: DefaultError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_consensus_error_ConsensusError_BasicError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: basic_error :: dpp_errors_consensus_basic_basic_error_BasicError) -> * mut dpp_errors_consensus_consensus_error_ConsensusError { ferment :: boxed (dpp_errors_consensus_consensus_error_ConsensusError :: BasicError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_consensus_error_ConsensusError_StateError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: state :: state_error :: dpp_errors_consensus_state_state_error_StateError) -> * mut dpp_errors_consensus_consensus_error_ConsensusError { ferment :: boxed (dpp_errors_consensus_consensus_error_ConsensusError :: StateError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_consensus_error_ConsensusError_SignatureError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: signature_error :: dpp_errors_consensus_signature_signature_error_SignatureError) -> * mut dpp_errors_consensus_consensus_error_ConsensusError { ferment :: boxed (dpp_errors_consensus_consensus_error_ConsensusError :: SignatureError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_consensus_error_ConsensusError_FeeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: fee :: fee_error :: dpp_errors_consensus_fee_fee_error_FeeError) -> * mut dpp_errors_consensus_consensus_error_ConsensusError { ferment :: boxed (dpp_errors_consensus_consensus_error_ConsensusError :: FeeError (o_o_0)) } # [cfg (test)] # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_consensus_error_ConsensusError_TestConsensusError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: test_consensus_error :: dpp_errors_consensus_test_consensus_error_TestConsensusError) -> * mut dpp_errors_consensus_consensus_error_ConsensusError { ferment :: boxed (dpp_errors_consensus_consensus_error_ConsensusError :: TestConsensusError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_consensus_error_ConsensusError_destroy < > (ffi : * mut dpp_errors_consensus_consensus_error_ConsensusError) { ferment :: unbox_any (ffi) ; } } # [cfg (test)] pub mod test_consensus_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TestConsensusError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_test_consensus_error_TestConsensusError { pub message : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: test_consensus_error :: TestConsensusError > for dpp_errors_consensus_test_consensus_error_TestConsensusError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_test_consensus_error_TestConsensusError) -> dpp :: errors :: consensus :: test_consensus_error :: TestConsensusError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: test_consensus_error :: TestConsensusError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . message) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: test_consensus_error :: TestConsensusError > for dpp_errors_consensus_test_consensus_error_TestConsensusError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: test_consensus_error :: TestConsensusError) -> * const dpp_errors_consensus_test_consensus_error_TestConsensusError { ferment :: boxed (dpp_errors_consensus_test_consensus_error_TestConsensusError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . message) }) } } impl Drop for dpp_errors_consensus_test_consensus_error_TestConsensusError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . message) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_test_consensus_error_TestConsensusError_ctor < > (message : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_test_consensus_error_TestConsensusError { ferment :: boxed (dpp_errors_consensus_test_consensus_error_TestConsensusError { message }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_test_consensus_error_TestConsensusError_destroy < > (ffi : * mut dpp_errors_consensus_test_consensus_error_TestConsensusError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_test_consensus_error_TestConsensusError_get_message < > (obj : * const dpp_errors_consensus_test_consensus_error_TestConsensusError) -> * mut std :: os :: raw :: c_char { (* obj) . message } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_test_consensus_error_TestConsensusError_set_message < > (obj : * const dpp_errors_consensus_test_consensus_error_TestConsensusError) -> * mut std :: os :: raw :: c_char { (* obj) . message } } pub mod signature { use crate as dash_spv_apple_bindings ; pub mod invalid_signature_public_key_purpose_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidSignaturePublicKeyPurposeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError { pub public_key_purpose : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose , pub allowed_key_purposes : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_purpose_Purpose } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: invalid_signature_public_key_purpose_error :: InvalidSignaturePublicKeyPurposeError > for dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError) -> dpp :: errors :: consensus :: signature :: invalid_signature_public_key_purpose_error :: InvalidSignaturePublicKeyPurposeError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: signature :: invalid_signature_public_key_purpose_error :: InvalidSignaturePublicKeyPurposeError { public_key_purpose : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: purpose :: Purpose >> :: ffi_from (ffi_ref . public_key_purpose) , allowed_key_purposes : < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionFrom < Vec < dpp :: identity :: identity_public_key :: purpose :: Purpose > >> :: ffi_from (ffi_ref . allowed_key_purposes) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: invalid_signature_public_key_purpose_error :: InvalidSignaturePublicKeyPurposeError > for dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: signature :: invalid_signature_public_key_purpose_error :: InvalidSignaturePublicKeyPurposeError) -> * const dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError { ferment :: boxed (dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError { public_key_purpose : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: purpose :: Purpose >> :: ffi_to (obj . public_key_purpose) , allowed_key_purposes : < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionTo < Vec < dpp :: identity :: identity_public_key :: purpose :: Purpose > >> :: ffi_to (obj . allowed_key_purposes) }) } } impl Drop for dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . public_key_purpose) ; ferment :: unbox_any (ffi_ref . allowed_key_purposes) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError_ctor < > (public_key_purpose : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose , allowed_key_purposes : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_purpose_Purpose) -> * mut dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError { ferment :: boxed (dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError { public_key_purpose , allowed_key_purposes }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError_destroy < > (ffi : * mut dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError_get_public_key_purpose < > (obj : * const dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose { (* obj) . public_key_purpose } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError_get_allowed_key_purposes < > (obj : * const dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError) -> * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_purpose_Purpose { (* obj) . allowed_key_purposes } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError_set_public_key_purpose < > (obj : * const dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose { (* obj) . public_key_purpose } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError_set_allowed_key_purposes < > (obj : * const dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError) -> * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_purpose_Purpose { (* obj) . allowed_key_purposes } } pub mod basic_bls_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`BasicBLSError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_signature_basic_bls_error_BasicBLSError { pub message : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: basic_bls_error :: BasicBLSError > for dpp_errors_consensus_signature_basic_bls_error_BasicBLSError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_signature_basic_bls_error_BasicBLSError) -> dpp :: errors :: consensus :: signature :: basic_bls_error :: BasicBLSError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: signature :: basic_bls_error :: BasicBLSError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . message) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: basic_bls_error :: BasicBLSError > for dpp_errors_consensus_signature_basic_bls_error_BasicBLSError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: signature :: basic_bls_error :: BasicBLSError) -> * const dpp_errors_consensus_signature_basic_bls_error_BasicBLSError { ferment :: boxed (dpp_errors_consensus_signature_basic_bls_error_BasicBLSError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . message) }) } } impl Drop for dpp_errors_consensus_signature_basic_bls_error_BasicBLSError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . message) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_basic_bls_error_BasicBLSError_ctor < > (message : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_signature_basic_bls_error_BasicBLSError { ferment :: boxed (dpp_errors_consensus_signature_basic_bls_error_BasicBLSError { message }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_basic_bls_error_BasicBLSError_destroy < > (ffi : * mut dpp_errors_consensus_signature_basic_bls_error_BasicBLSError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_basic_bls_error_BasicBLSError_get_message < > (obj : * const dpp_errors_consensus_signature_basic_bls_error_BasicBLSError) -> * mut std :: os :: raw :: c_char { (* obj) . message } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_basic_bls_error_BasicBLSError_set_message < > (obj : * const dpp_errors_consensus_signature_basic_bls_error_BasicBLSError) -> * mut std :: os :: raw :: c_char { (* obj) . message } } pub mod signature_should_not_be_present_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`SignatureShouldNotBePresentError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError { pub message : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: signature_should_not_be_present_error :: SignatureShouldNotBePresentError > for dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError) -> dpp :: errors :: consensus :: signature :: signature_should_not_be_present_error :: SignatureShouldNotBePresentError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: signature :: signature_should_not_be_present_error :: SignatureShouldNotBePresentError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . message) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: signature_should_not_be_present_error :: SignatureShouldNotBePresentError > for dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: signature :: signature_should_not_be_present_error :: SignatureShouldNotBePresentError) -> * const dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError { ferment :: boxed (dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . message) }) } } impl Drop for dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . message) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError_ctor < > (message : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError { ferment :: boxed (dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError { message }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError_destroy < > (ffi : * mut dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError_get_message < > (obj : * const dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError) -> * mut std :: os :: raw :: c_char { (* obj) . message } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError_set_message < > (obj : * const dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError) -> * mut std :: os :: raw :: c_char { (* obj) . message } } pub mod invalid_state_transition_signature_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidStateTransitionSignatureError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError { pub message : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: invalid_state_transition_signature_error :: InvalidStateTransitionSignatureError > for dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError) -> dpp :: errors :: consensus :: signature :: invalid_state_transition_signature_error :: InvalidStateTransitionSignatureError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: signature :: invalid_state_transition_signature_error :: InvalidStateTransitionSignatureError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . message) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: invalid_state_transition_signature_error :: InvalidStateTransitionSignatureError > for dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: signature :: invalid_state_transition_signature_error :: InvalidStateTransitionSignatureError) -> * const dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError { ferment :: boxed (dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . message) }) } } impl Drop for dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . message) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError_ctor < > (message : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError { ferment :: boxed (dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError { message }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError_destroy < > (ffi : * mut dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError_get_message < > (obj : * const dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError) -> * mut std :: os :: raw :: c_char { (* obj) . message } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError_set_message < > (obj : * const dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError) -> * mut std :: os :: raw :: c_char { (* obj) . message } } pub mod signature_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`SignatureError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_errors_consensus_signature_signature_error_SignatureError { IdentityNotFoundError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: identity_not_found_error :: dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError) , InvalidIdentityPublicKeyTypeError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_identity_public_key_type_error :: dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError) , InvalidStateTransitionSignatureError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_state_transition_signature_error :: dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError) , MissingPublicKeyError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: missing_public_key_error :: dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError) , InvalidSignaturePublicKeyPurposeError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_signature_public_key_purpose_error :: dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError) , InvalidSignaturePublicKeySecurityLevelError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_signature_public_key_security_level_error :: dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError) , WrongPublicKeyPurposeError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: wrong_public_key_purpose_error :: dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError) , PublicKeyIsDisabledError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: public_key_is_disabled_error :: dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError) , PublicKeySecurityLevelNotMetError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: public_key_security_level_not_met_error :: dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError) , SignatureShouldNotBePresentError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: signature_should_not_be_present_error :: dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError) , BasicECDSAError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: basic_ecdsa_error :: dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError) , BasicBLSError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: basic_bls_error :: dpp_errors_consensus_signature_basic_bls_error_BasicBLSError) } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: signature_error :: SignatureError > for dpp_errors_consensus_signature_signature_error_SignatureError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_signature_signature_error_SignatureError) -> dpp :: errors :: consensus :: signature :: signature_error :: SignatureError { let ffi_ref = & * ffi ; match ffi_ref { dpp_errors_consensus_signature_signature_error_SignatureError :: IdentityNotFoundError (o_0) => dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: IdentityNotFoundError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: identity_not_found_error :: dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: identity_not_found_error :: IdentityNotFoundError >> :: ffi_from (* o_0)) , dpp_errors_consensus_signature_signature_error_SignatureError :: InvalidIdentityPublicKeyTypeError (o_0) => dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: InvalidIdentityPublicKeyTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_identity_public_key_type_error :: dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: invalid_identity_public_key_type_error :: InvalidIdentityPublicKeyTypeError >> :: ffi_from (* o_0)) , dpp_errors_consensus_signature_signature_error_SignatureError :: InvalidStateTransitionSignatureError (o_0) => dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: InvalidStateTransitionSignatureError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_state_transition_signature_error :: dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: invalid_state_transition_signature_error :: InvalidStateTransitionSignatureError >> :: ffi_from (* o_0)) , dpp_errors_consensus_signature_signature_error_SignatureError :: MissingPublicKeyError (o_0) => dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: MissingPublicKeyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: missing_public_key_error :: dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: missing_public_key_error :: MissingPublicKeyError >> :: ffi_from (* o_0)) , dpp_errors_consensus_signature_signature_error_SignatureError :: InvalidSignaturePublicKeyPurposeError (o_0) => dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: InvalidSignaturePublicKeyPurposeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_signature_public_key_purpose_error :: dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: invalid_signature_public_key_purpose_error :: InvalidSignaturePublicKeyPurposeError >> :: ffi_from (* o_0)) , dpp_errors_consensus_signature_signature_error_SignatureError :: InvalidSignaturePublicKeySecurityLevelError (o_0) => dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: InvalidSignaturePublicKeySecurityLevelError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_signature_public_key_security_level_error :: dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: invalid_signature_public_key_security_level_error :: InvalidSignaturePublicKeySecurityLevelError >> :: ffi_from (* o_0)) , dpp_errors_consensus_signature_signature_error_SignatureError :: WrongPublicKeyPurposeError (o_0) => dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: WrongPublicKeyPurposeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: wrong_public_key_purpose_error :: dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: wrong_public_key_purpose_error :: WrongPublicKeyPurposeError >> :: ffi_from (* o_0)) , dpp_errors_consensus_signature_signature_error_SignatureError :: PublicKeyIsDisabledError (o_0) => dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: PublicKeyIsDisabledError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: public_key_is_disabled_error :: dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: public_key_is_disabled_error :: PublicKeyIsDisabledError >> :: ffi_from (* o_0)) , dpp_errors_consensus_signature_signature_error_SignatureError :: PublicKeySecurityLevelNotMetError (o_0) => dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: PublicKeySecurityLevelNotMetError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: public_key_security_level_not_met_error :: dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: public_key_security_level_not_met_error :: PublicKeySecurityLevelNotMetError >> :: ffi_from (* o_0)) , dpp_errors_consensus_signature_signature_error_SignatureError :: SignatureShouldNotBePresentError (o_0) => dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: SignatureShouldNotBePresentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: signature_should_not_be_present_error :: dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: signature_should_not_be_present_error :: SignatureShouldNotBePresentError >> :: ffi_from (* o_0)) , dpp_errors_consensus_signature_signature_error_SignatureError :: BasicECDSAError (o_0) => dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: BasicECDSAError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: basic_ecdsa_error :: dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: basic_ecdsa_error :: BasicECDSAError >> :: ffi_from (* o_0)) , dpp_errors_consensus_signature_signature_error_SignatureError :: BasicBLSError (o_0) => dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: BasicBLSError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: basic_bls_error :: dpp_errors_consensus_signature_basic_bls_error_BasicBLSError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: basic_bls_error :: BasicBLSError >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: signature_error :: SignatureError > for dpp_errors_consensus_signature_signature_error_SignatureError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: signature :: signature_error :: SignatureError) -> * const dpp_errors_consensus_signature_signature_error_SignatureError { ferment :: boxed (match obj { dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: IdentityNotFoundError (o_0) => dpp_errors_consensus_signature_signature_error_SignatureError :: IdentityNotFoundError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: identity_not_found_error :: dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: identity_not_found_error :: IdentityNotFoundError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: InvalidIdentityPublicKeyTypeError (o_0) => dpp_errors_consensus_signature_signature_error_SignatureError :: InvalidIdentityPublicKeyTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_identity_public_key_type_error :: dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: invalid_identity_public_key_type_error :: InvalidIdentityPublicKeyTypeError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: InvalidStateTransitionSignatureError (o_0) => dpp_errors_consensus_signature_signature_error_SignatureError :: InvalidStateTransitionSignatureError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_state_transition_signature_error :: dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: invalid_state_transition_signature_error :: InvalidStateTransitionSignatureError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: MissingPublicKeyError (o_0) => dpp_errors_consensus_signature_signature_error_SignatureError :: MissingPublicKeyError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: missing_public_key_error :: dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: missing_public_key_error :: MissingPublicKeyError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: InvalidSignaturePublicKeyPurposeError (o_0) => dpp_errors_consensus_signature_signature_error_SignatureError :: InvalidSignaturePublicKeyPurposeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_signature_public_key_purpose_error :: dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: invalid_signature_public_key_purpose_error :: InvalidSignaturePublicKeyPurposeError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: InvalidSignaturePublicKeySecurityLevelError (o_0) => dpp_errors_consensus_signature_signature_error_SignatureError :: InvalidSignaturePublicKeySecurityLevelError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_signature_public_key_security_level_error :: dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: invalid_signature_public_key_security_level_error :: InvalidSignaturePublicKeySecurityLevelError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: WrongPublicKeyPurposeError (o_0) => dpp_errors_consensus_signature_signature_error_SignatureError :: WrongPublicKeyPurposeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: wrong_public_key_purpose_error :: dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: wrong_public_key_purpose_error :: WrongPublicKeyPurposeError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: PublicKeyIsDisabledError (o_0) => dpp_errors_consensus_signature_signature_error_SignatureError :: PublicKeyIsDisabledError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: public_key_is_disabled_error :: dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: public_key_is_disabled_error :: PublicKeyIsDisabledError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: PublicKeySecurityLevelNotMetError (o_0) => dpp_errors_consensus_signature_signature_error_SignatureError :: PublicKeySecurityLevelNotMetError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: public_key_security_level_not_met_error :: dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: public_key_security_level_not_met_error :: PublicKeySecurityLevelNotMetError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: SignatureShouldNotBePresentError (o_0) => dpp_errors_consensus_signature_signature_error_SignatureError :: SignatureShouldNotBePresentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: signature_should_not_be_present_error :: dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: signature_should_not_be_present_error :: SignatureShouldNotBePresentError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: BasicECDSAError (o_0) => dpp_errors_consensus_signature_signature_error_SignatureError :: BasicECDSAError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: basic_ecdsa_error :: dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: basic_ecdsa_error :: BasicECDSAError >> :: ffi_to (o_0)) , dpp :: errors :: consensus :: signature :: signature_error :: SignatureError :: BasicBLSError (o_0) => dpp_errors_consensus_signature_signature_error_SignatureError :: BasicBLSError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: basic_bls_error :: dpp_errors_consensus_signature_basic_bls_error_BasicBLSError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: basic_bls_error :: BasicBLSError >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_errors_consensus_signature_signature_error_SignatureError { fn drop (& mut self) { unsafe { match self { dpp_errors_consensus_signature_signature_error_SignatureError :: IdentityNotFoundError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_signature_signature_error_SignatureError :: InvalidIdentityPublicKeyTypeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_signature_signature_error_SignatureError :: InvalidStateTransitionSignatureError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_signature_signature_error_SignatureError :: MissingPublicKeyError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_signature_signature_error_SignatureError :: InvalidSignaturePublicKeyPurposeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_signature_signature_error_SignatureError :: InvalidSignaturePublicKeySecurityLevelError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_signature_signature_error_SignatureError :: WrongPublicKeyPurposeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_signature_signature_error_SignatureError :: PublicKeyIsDisabledError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_signature_signature_error_SignatureError :: PublicKeySecurityLevelNotMetError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_signature_signature_error_SignatureError :: SignatureShouldNotBePresentError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_signature_signature_error_SignatureError :: BasicECDSAError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_consensus_signature_signature_error_SignatureError :: BasicBLSError (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_signature_error_SignatureError_IdentityNotFoundError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: identity_not_found_error :: dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError) -> * mut dpp_errors_consensus_signature_signature_error_SignatureError { ferment :: boxed (dpp_errors_consensus_signature_signature_error_SignatureError :: IdentityNotFoundError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_signature_error_SignatureError_InvalidIdentityPublicKeyTypeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_identity_public_key_type_error :: dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError) -> * mut dpp_errors_consensus_signature_signature_error_SignatureError { ferment :: boxed (dpp_errors_consensus_signature_signature_error_SignatureError :: InvalidIdentityPublicKeyTypeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_signature_error_SignatureError_InvalidStateTransitionSignatureError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_state_transition_signature_error :: dpp_errors_consensus_signature_invalid_state_transition_signature_error_InvalidStateTransitionSignatureError) -> * mut dpp_errors_consensus_signature_signature_error_SignatureError { ferment :: boxed (dpp_errors_consensus_signature_signature_error_SignatureError :: InvalidStateTransitionSignatureError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_signature_error_SignatureError_MissingPublicKeyError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: missing_public_key_error :: dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError) -> * mut dpp_errors_consensus_signature_signature_error_SignatureError { ferment :: boxed (dpp_errors_consensus_signature_signature_error_SignatureError :: MissingPublicKeyError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_signature_error_SignatureError_InvalidSignaturePublicKeyPurposeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_signature_public_key_purpose_error :: dpp_errors_consensus_signature_invalid_signature_public_key_purpose_error_InvalidSignaturePublicKeyPurposeError) -> * mut dpp_errors_consensus_signature_signature_error_SignatureError { ferment :: boxed (dpp_errors_consensus_signature_signature_error_SignatureError :: InvalidSignaturePublicKeyPurposeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_signature_error_SignatureError_InvalidSignaturePublicKeySecurityLevelError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_signature_public_key_security_level_error :: dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError) -> * mut dpp_errors_consensus_signature_signature_error_SignatureError { ferment :: boxed (dpp_errors_consensus_signature_signature_error_SignatureError :: InvalidSignaturePublicKeySecurityLevelError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_signature_error_SignatureError_WrongPublicKeyPurposeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: wrong_public_key_purpose_error :: dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError) -> * mut dpp_errors_consensus_signature_signature_error_SignatureError { ferment :: boxed (dpp_errors_consensus_signature_signature_error_SignatureError :: WrongPublicKeyPurposeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_signature_error_SignatureError_PublicKeyIsDisabledError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: public_key_is_disabled_error :: dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError) -> * mut dpp_errors_consensus_signature_signature_error_SignatureError { ferment :: boxed (dpp_errors_consensus_signature_signature_error_SignatureError :: PublicKeyIsDisabledError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_signature_error_SignatureError_PublicKeySecurityLevelNotMetError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: public_key_security_level_not_met_error :: dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError) -> * mut dpp_errors_consensus_signature_signature_error_SignatureError { ferment :: boxed (dpp_errors_consensus_signature_signature_error_SignatureError :: PublicKeySecurityLevelNotMetError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_signature_error_SignatureError_SignatureShouldNotBePresentError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: signature_should_not_be_present_error :: dpp_errors_consensus_signature_signature_should_not_be_present_error_SignatureShouldNotBePresentError) -> * mut dpp_errors_consensus_signature_signature_error_SignatureError { ferment :: boxed (dpp_errors_consensus_signature_signature_error_SignatureError :: SignatureShouldNotBePresentError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_signature_error_SignatureError_BasicECDSAError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: basic_ecdsa_error :: dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError) -> * mut dpp_errors_consensus_signature_signature_error_SignatureError { ferment :: boxed (dpp_errors_consensus_signature_signature_error_SignatureError :: BasicECDSAError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_signature_error_SignatureError_BasicBLSError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: basic_bls_error :: dpp_errors_consensus_signature_basic_bls_error_BasicBLSError) -> * mut dpp_errors_consensus_signature_signature_error_SignatureError { ferment :: boxed (dpp_errors_consensus_signature_signature_error_SignatureError :: BasicBLSError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_signature_error_SignatureError_destroy < > (ffi : * mut dpp_errors_consensus_signature_signature_error_SignatureError) { ferment :: unbox_any (ffi) ; } } pub mod missing_public_key_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MissingPublicKeyError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError { pub public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: missing_public_key_error :: MissingPublicKeyError > for dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError) -> dpp :: errors :: consensus :: signature :: missing_public_key_error :: MissingPublicKeyError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: signature :: missing_public_key_error :: MissingPublicKeyError { public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . public_key_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: missing_public_key_error :: MissingPublicKeyError > for dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: signature :: missing_public_key_error :: MissingPublicKeyError) -> * const dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError { ferment :: boxed (dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError { public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . public_key_id) }) } } impl Drop for dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . public_key_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError_ctor < > (public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID) -> * mut dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError { ferment :: boxed (dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError { public_key_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError_destroy < > (ffi : * mut dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError_get_public_key_id < > (obj : * const dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError_set_public_key_id < > (obj : * const dpp_errors_consensus_signature_missing_public_key_error_MissingPublicKeyError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . public_key_id } } pub mod public_key_security_level_not_met_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`PublicKeySecurityLevelNotMetError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError { pub public_key_security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel , pub required_security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: public_key_security_level_not_met_error :: PublicKeySecurityLevelNotMetError > for dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError) -> dpp :: errors :: consensus :: signature :: public_key_security_level_not_met_error :: PublicKeySecurityLevelNotMetError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: signature :: public_key_security_level_not_met_error :: PublicKeySecurityLevelNotMetError { public_key_security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_from (ffi_ref . public_key_security_level) , required_security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_from (ffi_ref . required_security_level) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: public_key_security_level_not_met_error :: PublicKeySecurityLevelNotMetError > for dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: signature :: public_key_security_level_not_met_error :: PublicKeySecurityLevelNotMetError) -> * const dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError { ferment :: boxed (dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError { public_key_security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_to (obj . public_key_security_level) , required_security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_to (obj . required_security_level) }) } } impl Drop for dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . public_key_security_level) ; ferment :: unbox_any (ffi_ref . required_security_level) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError_ctor < > (public_key_security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel , required_security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel) -> * mut dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError { ferment :: boxed (dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError { public_key_security_level , required_security_level }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError_destroy < > (ffi : * mut dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError_get_public_key_security_level < > (obj : * const dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . public_key_security_level } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError_get_required_security_level < > (obj : * const dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . required_security_level } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError_set_public_key_security_level < > (obj : * const dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . public_key_security_level } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError_set_required_security_level < > (obj : * const dpp_errors_consensus_signature_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . required_security_level } } pub mod public_key_is_disabled_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`PublicKeyIsDisabledError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError { pub public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: public_key_is_disabled_error :: PublicKeyIsDisabledError > for dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError) -> dpp :: errors :: consensus :: signature :: public_key_is_disabled_error :: PublicKeyIsDisabledError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: signature :: public_key_is_disabled_error :: PublicKeyIsDisabledError { public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . public_key_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: public_key_is_disabled_error :: PublicKeyIsDisabledError > for dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: signature :: public_key_is_disabled_error :: PublicKeyIsDisabledError) -> * const dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError { ferment :: boxed (dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError { public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . public_key_id) }) } } impl Drop for dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . public_key_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError_ctor < > (public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID) -> * mut dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError { ferment :: boxed (dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError { public_key_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError_destroy < > (ffi : * mut dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError_get_public_key_id < > (obj : * const dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError_set_public_key_id < > (obj : * const dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . public_key_id } } pub mod basic_ecdsa_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`BasicECDSAError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError { pub message : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: basic_ecdsa_error :: BasicECDSAError > for dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError) -> dpp :: errors :: consensus :: signature :: basic_ecdsa_error :: BasicECDSAError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: signature :: basic_ecdsa_error :: BasicECDSAError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . message) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: basic_ecdsa_error :: BasicECDSAError > for dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: signature :: basic_ecdsa_error :: BasicECDSAError) -> * const dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError { ferment :: boxed (dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError { message : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . message) }) } } impl Drop for dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . message) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError_ctor < > (message : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError { ferment :: boxed (dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError { message }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError_destroy < > (ffi : * mut dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError_get_message < > (obj : * const dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError) -> * mut std :: os :: raw :: c_char { (* obj) . message } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError_set_message < > (obj : * const dpp_errors_consensus_signature_basic_ecdsa_error_BasicECDSAError) -> * mut std :: os :: raw :: c_char { (* obj) . message } } pub mod invalid_identity_public_key_type_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIdentityPublicKeyTypeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError { pub public_key_type : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: invalid_identity_public_key_type_error :: InvalidIdentityPublicKeyTypeError > for dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError) -> dpp :: errors :: consensus :: signature :: invalid_identity_public_key_type_error :: InvalidIdentityPublicKeyTypeError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: signature :: invalid_identity_public_key_type_error :: InvalidIdentityPublicKeyTypeError { public_key_type : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: key_type :: KeyType >> :: ffi_from (ffi_ref . public_key_type) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: invalid_identity_public_key_type_error :: InvalidIdentityPublicKeyTypeError > for dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: signature :: invalid_identity_public_key_type_error :: InvalidIdentityPublicKeyTypeError) -> * const dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError { ferment :: boxed (dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError { public_key_type : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: key_type :: KeyType >> :: ffi_to (obj . public_key_type) }) } } impl Drop for dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . public_key_type) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError_ctor < > (public_key_type : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType) -> * mut dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError { ferment :: boxed (dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError { public_key_type }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError_destroy < > (ffi : * mut dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError_get_public_key_type < > (obj : * const dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType { (* obj) . public_key_type } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError_set_public_key_type < > (obj : * const dpp_errors_consensus_signature_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType { (* obj) . public_key_type } } pub mod identity_not_found_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityNotFoundError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError { pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: identity_not_found_error :: IdentityNotFoundError > for dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError) -> dpp :: errors :: consensus :: signature :: identity_not_found_error :: IdentityNotFoundError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: signature :: identity_not_found_error :: IdentityNotFoundError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: identity_not_found_error :: IdentityNotFoundError > for dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: signature :: identity_not_found_error :: IdentityNotFoundError) -> * const dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError { ferment :: boxed (dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) }) } } impl Drop for dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . identity_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError_ctor < > (identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError { ferment :: boxed (dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError { identity_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError_destroy < > (ffi : * mut dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError_get_identity_id < > (obj : * const dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError_set_identity_id < > (obj : * const dpp_errors_consensus_signature_identity_not_found_error_IdentityNotFoundError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } } pub mod invalid_signature_public_key_security_level_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidSignaturePublicKeySecurityLevelError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError { pub public_key_security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel , pub allowed_key_security_levels : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_security_level_SecurityLevel } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: invalid_signature_public_key_security_level_error :: InvalidSignaturePublicKeySecurityLevelError > for dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError) -> dpp :: errors :: consensus :: signature :: invalid_signature_public_key_security_level_error :: InvalidSignaturePublicKeySecurityLevelError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: signature :: invalid_signature_public_key_security_level_error :: InvalidSignaturePublicKeySecurityLevelError { public_key_security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_from (ffi_ref . public_key_security_level) , allowed_key_security_levels : < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionFrom < Vec < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel > >> :: ffi_from (ffi_ref . allowed_key_security_levels) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: invalid_signature_public_key_security_level_error :: InvalidSignaturePublicKeySecurityLevelError > for dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: signature :: invalid_signature_public_key_security_level_error :: InvalidSignaturePublicKeySecurityLevelError) -> * const dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError { ferment :: boxed (dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError { public_key_security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_to (obj . public_key_security_level) , allowed_key_security_levels : < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionTo < Vec < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel > >> :: ffi_to (obj . allowed_key_security_levels) }) } } impl Drop for dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . public_key_security_level) ; ferment :: unbox_any (ffi_ref . allowed_key_security_levels) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError_ctor < > (public_key_security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel , allowed_key_security_levels : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_security_level_SecurityLevel) -> * mut dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError { ferment :: boxed (dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError { public_key_security_level , allowed_key_security_levels }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError_destroy < > (ffi : * mut dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError_get_public_key_security_level < > (obj : * const dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . public_key_security_level } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError_get_allowed_key_security_levels < > (obj : * const dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError) -> * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . allowed_key_security_levels } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError_set_public_key_security_level < > (obj : * const dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . public_key_security_level } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError_set_allowed_key_security_levels < > (obj : * const dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError) -> * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . allowed_key_security_levels } } pub mod wrong_public_key_purpose_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`WrongPublicKeyPurposeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError { pub public_key_purpose : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose , pub allowed_key_purposes : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_purpose_Purpose } impl ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: wrong_public_key_purpose_error :: WrongPublicKeyPurposeError > for dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError { unsafe fn ffi_from_const (ffi : * const dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError) -> dpp :: errors :: consensus :: signature :: wrong_public_key_purpose_error :: WrongPublicKeyPurposeError { let ffi_ref = & * ffi ; dpp :: errors :: consensus :: signature :: wrong_public_key_purpose_error :: WrongPublicKeyPurposeError { public_key_purpose : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: purpose :: Purpose >> :: ffi_from (ffi_ref . public_key_purpose) , allowed_key_purposes : < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionFrom < Vec < dpp :: identity :: identity_public_key :: purpose :: Purpose > >> :: ffi_from (ffi_ref . allowed_key_purposes) } } } impl ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: wrong_public_key_purpose_error :: WrongPublicKeyPurposeError > for dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError { unsafe fn ffi_to_const (obj : dpp :: errors :: consensus :: signature :: wrong_public_key_purpose_error :: WrongPublicKeyPurposeError) -> * const dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError { ferment :: boxed (dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError { public_key_purpose : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: purpose :: Purpose >> :: ffi_to (obj . public_key_purpose) , allowed_key_purposes : < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionTo < Vec < dpp :: identity :: identity_public_key :: purpose :: Purpose > >> :: ffi_to (obj . allowed_key_purposes) }) } } impl Drop for dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . public_key_purpose) ; ferment :: unbox_any (ffi_ref . allowed_key_purposes) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError_ctor < > (public_key_purpose : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose , allowed_key_purposes : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_purpose_Purpose) -> * mut dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError { ferment :: boxed (dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError { public_key_purpose , allowed_key_purposes }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError_destroy < > (ffi : * mut dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError_get_public_key_purpose < > (obj : * const dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose { (* obj) . public_key_purpose } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError_get_allowed_key_purposes < > (obj : * const dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError) -> * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_purpose_Purpose { (* obj) . allowed_key_purposes } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError_set_public_key_purpose < > (obj : * const dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose { (* obj) . public_key_purpose } # [no_mangle] pub unsafe extern "C" fn dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError_set_allowed_key_purposes < > (obj : * const dpp_errors_consensus_signature_wrong_public_key_purpose_error_WrongPublicKeyPurposeError) -> * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_purpose_Purpose { (* obj) . allowed_key_purposes } } } } pub mod protocol_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ProtocolError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_errors_protocol_error_ProtocolError { IdentifierError (* mut std :: os :: raw :: c_char) , StringDecodeError (* mut std :: os :: raw :: c_char) , EmptyPublicKeyDataError , MaxEncodedBytesReachedError { max_size_kbytes : usize , size_hit : usize } , EncodingError (* mut std :: os :: raw :: c_char) , DecodingError (* mut std :: os :: raw :: c_char) , FileNotFound (* mut std :: os :: raw :: c_char) , UnsupportedVersionMismatch { method : * mut std :: os :: raw :: c_char , allowed_versions : * mut crate :: fermented :: generics :: Vec_versioned_feature_core_FeatureVersion , received : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion } , UnknownVersionMismatch { method : * mut std :: os :: raw :: c_char , known_versions : * mut crate :: fermented :: generics :: Vec_versioned_feature_core_FeatureVersion , received : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion } , CurrentProtocolVersionNotInitialized , UnknownVersionError (* mut std :: os :: raw :: c_char) , UnknownProtocolVersionError (* mut std :: os :: raw :: c_char) , NoProtocolVersionError , ParsingError (* mut std :: os :: raw :: c_char) , ParsingJsonError (* mut dash_spv_apple_bindings :: custom :: serde_json :: serde_json_Error) , Error (* mut dash_spv_apple_bindings :: custom :: anyhow :: anyhow_Error) , InvalidKeyContractBoundsError (* mut std :: os :: raw :: c_char) , UnknownStorageKeyRequirements (* mut std :: os :: raw :: c_char) , UnknownContestedIndexResolution (* mut std :: os :: raw :: c_char) , DataContractError (* mut crate :: fermented :: types :: dpp :: data_contract :: errors :: contract :: dpp_data_contract_errors_contract_DataContractError) , # [cfg (all (feature = "state-transitions" , feature = "validation"))] StateTransitionError (* mut crate :: fermented :: types :: dpp :: state_transition :: errors :: state_transition_error :: dpp_state_transition_errors_state_transition_error_StateTransitionError) , InvalidStateTransitionType (* mut std :: os :: raw :: c_char) , PlatformVersionError (* mut crate :: fermented :: types :: platform_version :: error :: platform_version_error_PlatformVersionError) , ConsensusError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: consensus_error :: dpp_errors_consensus_consensus_error_ConsensusError) , Document (* mut crate :: fermented :: types :: dpp :: document :: errors :: dpp_document_errors_DocumentError) , Token (* mut crate :: fermented :: types :: dpp :: tokens :: errors :: dpp_tokens_errors_TokenError) , Generic (* mut std :: os :: raw :: c_char) , NotSupported (* mut std :: os :: raw :: c_char) , # [cfg (feature = "message-signing")] InvalidSigningKeyTypeError (* mut std :: os :: raw :: c_char) , # [cfg (any (feature = "state-transition-validation" , feature = "state-transition-signing"))] InvalidIdentityPublicKeyTypeError (* mut crate :: fermented :: types :: dpp :: state_transition :: errors :: invalid_identity_public_key_type_error :: dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError) , # [cfg (feature = "state-transition-validation")] StateTransitionIsNotSignedError (* mut crate :: fermented :: types :: dpp :: state_transition :: errors :: state_transition_is_not_signed_error :: dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError) , # [cfg (feature = "state-transition-validation")] PublicKeySecurityLevelNotMetError (* mut crate :: fermented :: types :: dpp :: state_transition :: errors :: public_key_security_level_not_met_error :: dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError) , # [cfg (any (all (feature = "state-transitions" , feature = "validation") , feature = "state-transition-validation" , feature = "state-transition-signing" , feature = "state-transition-validation"))] WrongPublicKeyPurposeError (* mut dpp :: state_transition :: errors :: wrong_public_key_purpose_error :: WrongPublicKeyPurposeError) , # [cfg (feature = "state-transition-validation")] PublicKeyMismatchError (* mut crate :: fermented :: types :: dpp :: state_transition :: errors :: public_key_mismatch_error :: dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError) , # [cfg (feature = "state-transition-validation")] InvalidSignaturePublicKeyError (* mut crate :: fermented :: types :: dpp :: state_transition :: errors :: invalid_signature_public_key_error :: dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError) , NonConsensusError (* mut crate :: fermented :: types :: dpp :: errors :: non_consensus_error :: dpp_errors_non_consensus_error_NonConsensusError) , CompatibleProtocolVersionIsNotDefinedError (* mut crate :: fermented :: types :: dpp :: errors :: compatible_protocol_version_is_not_defined_error :: dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError) , InvalidDocumentTypeError (* mut crate :: fermented :: types :: dpp :: data_contract :: errors :: invalid_document_type_error :: dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError) , DataContractNotPresentError (* mut crate :: fermented :: types :: dpp :: data_contract :: errors :: data_contract_not_present_error :: dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError) , InvalidSignaturePublicKeySecurityLevelError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_signature_public_key_security_level_error :: dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError) , InvalidStateTransitionTypeError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: state_transition :: invalid_state_transition_type_error :: dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError) , PublicKeyIsDisabledError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: public_key_is_disabled_error :: dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError) , IdentityNotPresentError (* mut crate :: fermented :: types :: dpp :: data_contract :: errors :: identity_not_present_error :: dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError) , Overflow (* mut std :: os :: raw :: c_char) , DivideByZero (* mut std :: os :: raw :: c_char) , DesiredKeyWithTypePurposeSecurityLevelMissing (* mut std :: os :: raw :: c_char) , ValueError (* mut crate :: fermented :: types :: platform_value :: error :: platform_value_error_Error) , PlatformSerializationError (* mut std :: os :: raw :: c_char) , PlatformDeserializationError (* mut std :: os :: raw :: c_char) , DashCoreError (* mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_consensus_Error) , InvalidIdentityError { errors : * mut crate :: fermented :: generics :: Vec_dpp_errors_consensus_consensus_error_ConsensusError , raw_identity : * mut crate :: fermented :: types :: platform_value :: platform_value_Value } , VoteError (* mut std :: os :: raw :: c_char) , PublicKeyGenerationError (* mut std :: os :: raw :: c_char) , GroupMemberNotFound (* mut std :: os :: raw :: c_char) , GroupNotFound (* mut std :: os :: raw :: c_char) , CorruptedCodeExecution (* mut std :: os :: raw :: c_char) , CorruptedSerialization (* mut std :: os :: raw :: c_char) , CriticalCorruptedCreditsCodeExecution (* mut std :: os :: raw :: c_char) , InvalidVectorSizeError (* mut crate :: fermented :: types :: dpp :: errors :: invalid_vector_size_error :: dpp_errors_invalid_vector_size_error_InvalidVectorSizeError) , InvalidCBOR (* mut std :: os :: raw :: c_char) , # [cfg (feature = "bls-signatures")] BlsError (* mut dashcore :: blsful :: BlsError) , PrivateKeySizeError { got : u32 } , InvalidBLSPrivateKeyError (* mut std :: os :: raw :: c_char) , BlsSignatureSizeError { got : u32 } , AddingDifferentTypes (* mut std :: os :: raw :: c_char) , InvalidDistributionStep (* mut std :: os :: raw :: c_char) , MissingEpochInfo (* mut std :: os :: raw :: c_char) } impl ferment :: FFIConversionFrom < dpp :: errors :: protocol_error :: ProtocolError > for dpp_errors_protocol_error_ProtocolError { unsafe fn ffi_from_const (ffi : * const dpp_errors_protocol_error_ProtocolError) -> dpp :: errors :: protocol_error :: ProtocolError { let ffi_ref = & * ffi ; match ffi_ref { dpp_errors_protocol_error_ProtocolError :: IdentifierError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: IdentifierError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: StringDecodeError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: StringDecodeError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: EmptyPublicKeyDataError => dpp :: errors :: protocol_error :: ProtocolError :: EmptyPublicKeyDataError , dpp_errors_protocol_error_ProtocolError :: MaxEncodedBytesReachedError { max_size_kbytes , size_hit } => dpp :: errors :: protocol_error :: ProtocolError :: MaxEncodedBytesReachedError { max_size_kbytes : * max_size_kbytes , size_hit : * size_hit } , dpp_errors_protocol_error_ProtocolError :: EncodingError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: EncodingError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: DecodingError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: DecodingError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: FileNotFound (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: FileNotFound (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: UnsupportedVersionMismatch { method , allowed_versions , received } => dpp :: errors :: protocol_error :: ProtocolError :: UnsupportedVersionMismatch { method : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* method) , allowed_versions : < crate :: fermented :: generics :: Vec_versioned_feature_core_FeatureVersion as ferment :: FFIConversionFrom < Vec < versioned_feature_core :: FeatureVersion > >> :: ffi_from (* allowed_versions) , received : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionFrom < versioned_feature_core :: FeatureVersion >> :: ffi_from (* received) } , dpp_errors_protocol_error_ProtocolError :: UnknownVersionMismatch { method , known_versions , received } => dpp :: errors :: protocol_error :: ProtocolError :: UnknownVersionMismatch { method : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* method) , known_versions : < crate :: fermented :: generics :: Vec_versioned_feature_core_FeatureVersion as ferment :: FFIConversionFrom < Vec < versioned_feature_core :: FeatureVersion > >> :: ffi_from (* known_versions) , received : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionFrom < versioned_feature_core :: FeatureVersion >> :: ffi_from (* received) } , dpp_errors_protocol_error_ProtocolError :: CurrentProtocolVersionNotInitialized => dpp :: errors :: protocol_error :: ProtocolError :: CurrentProtocolVersionNotInitialized , dpp_errors_protocol_error_ProtocolError :: UnknownVersionError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: UnknownVersionError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: UnknownProtocolVersionError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: UnknownProtocolVersionError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: NoProtocolVersionError => dpp :: errors :: protocol_error :: ProtocolError :: NoProtocolVersionError , dpp_errors_protocol_error_ProtocolError :: ParsingError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: ParsingError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: ParsingJsonError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: ParsingJsonError (< dash_spv_apple_bindings :: custom :: serde_json :: serde_json_Error as ferment :: FFIConversionFrom < serde_json :: Error >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: Error (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: Error (< dash_spv_apple_bindings :: custom :: anyhow :: anyhow_Error as ferment :: FFIConversionFrom < anyhow :: Error >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: InvalidKeyContractBoundsError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: InvalidKeyContractBoundsError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: UnknownStorageKeyRequirements (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: UnknownStorageKeyRequirements (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: UnknownContestedIndexResolution (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: UnknownContestedIndexResolution (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: DataContractError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: DataContractError (< crate :: fermented :: types :: dpp :: data_contract :: errors :: contract :: dpp_data_contract_errors_contract_DataContractError as ferment :: FFIConversionFrom < dpp :: data_contract :: errors :: contract :: DataContractError >> :: ffi_from (* o_0)) , # [cfg (all (feature = "state-transitions" , feature = "validation"))] dpp_errors_protocol_error_ProtocolError :: StateTransitionError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: StateTransitionError (< crate :: fermented :: types :: dpp :: state_transition :: errors :: state_transition_error :: dpp_state_transition_errors_state_transition_error_StateTransitionError as ferment :: FFIConversionFrom < dpp :: state_transition :: errors :: state_transition_error :: StateTransitionError >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: InvalidStateTransitionType (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: InvalidStateTransitionType (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: PlatformVersionError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: PlatformVersionError (< crate :: fermented :: types :: platform_version :: error :: platform_version_error_PlatformVersionError as ferment :: FFIConversionFrom < platform_version :: error :: PlatformVersionError >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: ConsensusError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: ConsensusError (Box :: new (< crate :: fermented :: types :: dpp :: errors :: consensus :: consensus_error :: dpp_errors_consensus_consensus_error_ConsensusError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: consensus_error :: ConsensusError >> :: ffi_from (* o_0))) , dpp_errors_protocol_error_ProtocolError :: Document (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: Document (Box :: new (< crate :: fermented :: types :: dpp :: document :: errors :: dpp_document_errors_DocumentError as ferment :: FFIConversionFrom < dpp :: document :: errors :: DocumentError >> :: ffi_from (* o_0))) , dpp_errors_protocol_error_ProtocolError :: Token (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: Token (Box :: new (< crate :: fermented :: types :: dpp :: tokens :: errors :: dpp_tokens_errors_TokenError as ferment :: FFIConversionFrom < dpp :: tokens :: errors :: TokenError >> :: ffi_from (* o_0))) , dpp_errors_protocol_error_ProtocolError :: Generic (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: Generic (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: NotSupported (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: NotSupported (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , # [cfg (feature = "message-signing")] dpp_errors_protocol_error_ProtocolError :: InvalidSigningKeyTypeError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: InvalidSigningKeyTypeError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , # [cfg (any (feature = "state-transition-validation" , feature = "state-transition-signing"))] dpp_errors_protocol_error_ProtocolError :: InvalidIdentityPublicKeyTypeError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: InvalidIdentityPublicKeyTypeError (< crate :: fermented :: types :: dpp :: state_transition :: errors :: invalid_identity_public_key_type_error :: dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError as ferment :: FFIConversionFrom < dpp :: state_transition :: errors :: invalid_identity_public_key_type_error :: InvalidIdentityPublicKeyTypeError >> :: ffi_from (* o_0)) , # [cfg (feature = "state-transition-validation")] dpp_errors_protocol_error_ProtocolError :: StateTransitionIsNotSignedError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: StateTransitionIsNotSignedError (< crate :: fermented :: types :: dpp :: state_transition :: errors :: state_transition_is_not_signed_error :: dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError as ferment :: FFIConversionFrom < dpp :: state_transition :: errors :: state_transition_is_not_signed_error :: StateTransitionIsNotSignedError >> :: ffi_from (* o_0)) , # [cfg (feature = "state-transition-validation")] dpp_errors_protocol_error_ProtocolError :: PublicKeySecurityLevelNotMetError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: PublicKeySecurityLevelNotMetError (< crate :: fermented :: types :: dpp :: state_transition :: errors :: public_key_security_level_not_met_error :: dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError as ferment :: FFIConversionFrom < dpp :: state_transition :: errors :: public_key_security_level_not_met_error :: PublicKeySecurityLevelNotMetError >> :: ffi_from (* o_0)) , # [cfg (any (all (feature = "state-transitions" , feature = "validation") , feature = "state-transition-validation" , feature = "state-transition-signing" , feature = "state-transition-validation"))] dpp_errors_protocol_error_ProtocolError :: WrongPublicKeyPurposeError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: WrongPublicKeyPurposeError ((& * * o_0) . clone ()) , # [cfg (feature = "state-transition-validation")] dpp_errors_protocol_error_ProtocolError :: PublicKeyMismatchError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: PublicKeyMismatchError (< crate :: fermented :: types :: dpp :: state_transition :: errors :: public_key_mismatch_error :: dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError as ferment :: FFIConversionFrom < dpp :: state_transition :: errors :: public_key_mismatch_error :: PublicKeyMismatchError >> :: ffi_from (* o_0)) , # [cfg (feature = "state-transition-validation")] dpp_errors_protocol_error_ProtocolError :: InvalidSignaturePublicKeyError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: InvalidSignaturePublicKeyError (< crate :: fermented :: types :: dpp :: state_transition :: errors :: invalid_signature_public_key_error :: dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError as ferment :: FFIConversionFrom < dpp :: state_transition :: errors :: invalid_signature_public_key_error :: InvalidSignaturePublicKeyError >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: NonConsensusError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: NonConsensusError (< crate :: fermented :: types :: dpp :: errors :: non_consensus_error :: dpp_errors_non_consensus_error_NonConsensusError as ferment :: FFIConversionFrom < dpp :: errors :: non_consensus_error :: NonConsensusError >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: CompatibleProtocolVersionIsNotDefinedError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: CompatibleProtocolVersionIsNotDefinedError (< crate :: fermented :: types :: dpp :: errors :: compatible_protocol_version_is_not_defined_error :: dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError as ferment :: FFIConversionFrom < dpp :: errors :: compatible_protocol_version_is_not_defined_error :: CompatibleProtocolVersionIsNotDefinedError >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: InvalidDocumentTypeError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: InvalidDocumentTypeError (< crate :: fermented :: types :: dpp :: data_contract :: errors :: invalid_document_type_error :: dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError as ferment :: FFIConversionFrom < dpp :: data_contract :: errors :: invalid_document_type_error :: InvalidDocumentTypeError >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: DataContractNotPresentError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: DataContractNotPresentError (< crate :: fermented :: types :: dpp :: data_contract :: errors :: data_contract_not_present_error :: dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError as ferment :: FFIConversionFrom < dpp :: data_contract :: errors :: data_contract_not_present_error :: DataContractNotPresentError >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: InvalidSignaturePublicKeySecurityLevelError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: InvalidSignaturePublicKeySecurityLevelError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_signature_public_key_security_level_error :: dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: invalid_signature_public_key_security_level_error :: InvalidSignaturePublicKeySecurityLevelError >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: InvalidStateTransitionTypeError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: InvalidStateTransitionTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: state_transition :: invalid_state_transition_type_error :: dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: state_transition :: invalid_state_transition_type_error :: InvalidStateTransitionTypeError >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: PublicKeyIsDisabledError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: PublicKeyIsDisabledError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: public_key_is_disabled_error :: dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: signature :: public_key_is_disabled_error :: PublicKeyIsDisabledError >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: IdentityNotPresentError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: IdentityNotPresentError (< crate :: fermented :: types :: dpp :: data_contract :: errors :: identity_not_present_error :: dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError as ferment :: FFIConversionFrom < dpp :: data_contract :: errors :: identity_not_present_error :: IdentityNotPresentError >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: Overflow (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: Overflow (Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (* o_0)))) , dpp_errors_protocol_error_ProtocolError :: DivideByZero (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: DivideByZero (Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (* o_0)))) , dpp_errors_protocol_error_ProtocolError :: DesiredKeyWithTypePurposeSecurityLevelMissing (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: DesiredKeyWithTypePurposeSecurityLevelMissing (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: ValueError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: ValueError (< crate :: fermented :: types :: platform_value :: error :: platform_value_error_Error as ferment :: FFIConversionFrom < platform_value :: error :: Error >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: PlatformSerializationError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: PlatformSerializationError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: PlatformDeserializationError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: PlatformDeserializationError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: DashCoreError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: DashCoreError (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_consensus_Error as ferment :: FFIConversionFrom < dashcore :: consensus :: encode :: Error >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: InvalidIdentityError { errors , raw_identity } => dpp :: errors :: protocol_error :: ProtocolError :: InvalidIdentityError { errors : < crate :: fermented :: generics :: Vec_dpp_errors_consensus_consensus_error_ConsensusError as ferment :: FFIConversionFrom < Vec < dpp :: errors :: consensus :: consensus_error :: ConsensusError > >> :: ffi_from (* errors) , raw_identity : < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionFrom < platform_value :: Value >> :: ffi_from (* raw_identity) } , dpp_errors_protocol_error_ProtocolError :: VoteError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: VoteError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: PublicKeyGenerationError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: PublicKeyGenerationError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: GroupMemberNotFound (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: GroupMemberNotFound (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: GroupNotFound (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: GroupNotFound (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: CorruptedCodeExecution (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: CorruptedCodeExecution (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: CorruptedSerialization (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: CorruptedSerialization (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: CriticalCorruptedCreditsCodeExecution (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: CriticalCorruptedCreditsCodeExecution (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: InvalidVectorSizeError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: InvalidVectorSizeError (< crate :: fermented :: types :: dpp :: errors :: invalid_vector_size_error :: dpp_errors_invalid_vector_size_error_InvalidVectorSizeError as ferment :: FFIConversionFrom < dpp :: errors :: invalid_vector_size_error :: InvalidVectorSizeError >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: InvalidCBOR (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: InvalidCBOR (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , # [cfg (feature = "bls-signatures")] dpp_errors_protocol_error_ProtocolError :: BlsError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: BlsError ((& * * o_0) . clone ()) , dpp_errors_protocol_error_ProtocolError :: PrivateKeySizeError { got } => dpp :: errors :: protocol_error :: ProtocolError :: PrivateKeySizeError { got : * got } , dpp_errors_protocol_error_ProtocolError :: InvalidBLSPrivateKeyError (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: InvalidBLSPrivateKeyError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: BlsSignatureSizeError { got } => dpp :: errors :: protocol_error :: ProtocolError :: BlsSignatureSizeError { got : * got } , dpp_errors_protocol_error_ProtocolError :: AddingDifferentTypes (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: AddingDifferentTypes (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_errors_protocol_error_ProtocolError :: InvalidDistributionStep (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: InvalidDistributionStep (Box :: leak (Box :: new (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < & str >> :: ffi_from (* o_0)))) , dpp_errors_protocol_error_ProtocolError :: MissingEpochInfo (o_0) => dpp :: errors :: protocol_error :: ProtocolError :: MissingEpochInfo (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: errors :: protocol_error :: ProtocolError > for dpp_errors_protocol_error_ProtocolError { unsafe fn ffi_to_const (obj : dpp :: errors :: protocol_error :: ProtocolError) -> * const dpp_errors_protocol_error_ProtocolError { ferment :: boxed (match obj { dpp :: errors :: protocol_error :: ProtocolError :: IdentifierError (o_0) => dpp_errors_protocol_error_ProtocolError :: IdentifierError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: StringDecodeError (o_0) => dpp_errors_protocol_error_ProtocolError :: StringDecodeError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: EmptyPublicKeyDataError => dpp_errors_protocol_error_ProtocolError :: EmptyPublicKeyDataError , dpp :: errors :: protocol_error :: ProtocolError :: MaxEncodedBytesReachedError { max_size_kbytes , size_hit } => dpp_errors_protocol_error_ProtocolError :: MaxEncodedBytesReachedError { max_size_kbytes : max_size_kbytes , size_hit : size_hit } , dpp :: errors :: protocol_error :: ProtocolError :: EncodingError (o_0) => dpp_errors_protocol_error_ProtocolError :: EncodingError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: DecodingError (o_0) => dpp_errors_protocol_error_ProtocolError :: DecodingError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: FileNotFound (o_0) => dpp_errors_protocol_error_ProtocolError :: FileNotFound (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: UnsupportedVersionMismatch { method , allowed_versions , received } => dpp_errors_protocol_error_ProtocolError :: UnsupportedVersionMismatch { method : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (method) , allowed_versions : < crate :: fermented :: generics :: Vec_versioned_feature_core_FeatureVersion as ferment :: FFIConversionTo < Vec < versioned_feature_core :: FeatureVersion > >> :: ffi_to (allowed_versions) , received : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionTo < versioned_feature_core :: FeatureVersion >> :: ffi_to (received) } , dpp :: errors :: protocol_error :: ProtocolError :: UnknownVersionMismatch { method , known_versions , received } => dpp_errors_protocol_error_ProtocolError :: UnknownVersionMismatch { method : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (method) , known_versions : < crate :: fermented :: generics :: Vec_versioned_feature_core_FeatureVersion as ferment :: FFIConversionTo < Vec < versioned_feature_core :: FeatureVersion > >> :: ffi_to (known_versions) , received : < dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion as ferment :: FFIConversionTo < versioned_feature_core :: FeatureVersion >> :: ffi_to (received) } , dpp :: errors :: protocol_error :: ProtocolError :: CurrentProtocolVersionNotInitialized => dpp_errors_protocol_error_ProtocolError :: CurrentProtocolVersionNotInitialized , dpp :: errors :: protocol_error :: ProtocolError :: UnknownVersionError (o_0) => dpp_errors_protocol_error_ProtocolError :: UnknownVersionError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: UnknownProtocolVersionError (o_0) => dpp_errors_protocol_error_ProtocolError :: UnknownProtocolVersionError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: NoProtocolVersionError => dpp_errors_protocol_error_ProtocolError :: NoProtocolVersionError , dpp :: errors :: protocol_error :: ProtocolError :: ParsingError (o_0) => dpp_errors_protocol_error_ProtocolError :: ParsingError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: ParsingJsonError (o_0) => dpp_errors_protocol_error_ProtocolError :: ParsingJsonError (< dash_spv_apple_bindings :: custom :: serde_json :: serde_json_Error as ferment :: FFIConversionTo < serde_json :: Error >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: Error (o_0) => dpp_errors_protocol_error_ProtocolError :: Error (< dash_spv_apple_bindings :: custom :: anyhow :: anyhow_Error as ferment :: FFIConversionTo < anyhow :: Error >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: InvalidKeyContractBoundsError (o_0) => dpp_errors_protocol_error_ProtocolError :: InvalidKeyContractBoundsError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: UnknownStorageKeyRequirements (o_0) => dpp_errors_protocol_error_ProtocolError :: UnknownStorageKeyRequirements (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: UnknownContestedIndexResolution (o_0) => dpp_errors_protocol_error_ProtocolError :: UnknownContestedIndexResolution (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: DataContractError (o_0) => dpp_errors_protocol_error_ProtocolError :: DataContractError (< crate :: fermented :: types :: dpp :: data_contract :: errors :: contract :: dpp_data_contract_errors_contract_DataContractError as ferment :: FFIConversionTo < dpp :: data_contract :: errors :: contract :: DataContractError >> :: ffi_to (o_0)) , # [cfg (all (feature = "state-transitions" , feature = "validation"))] dpp :: errors :: protocol_error :: ProtocolError :: StateTransitionError (o_0) => dpp_errors_protocol_error_ProtocolError :: StateTransitionError (< crate :: fermented :: types :: dpp :: state_transition :: errors :: state_transition_error :: dpp_state_transition_errors_state_transition_error_StateTransitionError as ferment :: FFIConversionTo < dpp :: state_transition :: errors :: state_transition_error :: StateTransitionError >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: InvalidStateTransitionType (o_0) => dpp_errors_protocol_error_ProtocolError :: InvalidStateTransitionType (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: PlatformVersionError (o_0) => dpp_errors_protocol_error_ProtocolError :: PlatformVersionError (< crate :: fermented :: types :: platform_version :: error :: platform_version_error_PlatformVersionError as ferment :: FFIConversionTo < platform_version :: error :: PlatformVersionError >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: ConsensusError (o_0) => dpp_errors_protocol_error_ProtocolError :: ConsensusError (< crate :: fermented :: types :: dpp :: errors :: consensus :: consensus_error :: dpp_errors_consensus_consensus_error_ConsensusError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: consensus_error :: ConsensusError >> :: ffi_to (* o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: Document (o_0) => dpp_errors_protocol_error_ProtocolError :: Document (< crate :: fermented :: types :: dpp :: document :: errors :: dpp_document_errors_DocumentError as ferment :: FFIConversionTo < dpp :: document :: errors :: DocumentError >> :: ffi_to (* o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: Token (o_0) => dpp_errors_protocol_error_ProtocolError :: Token (< crate :: fermented :: types :: dpp :: tokens :: errors :: dpp_tokens_errors_TokenError as ferment :: FFIConversionTo < dpp :: tokens :: errors :: TokenError >> :: ffi_to (* o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: Generic (o_0) => dpp_errors_protocol_error_ProtocolError :: Generic (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: NotSupported (o_0) => dpp_errors_protocol_error_ProtocolError :: NotSupported (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , # [cfg (feature = "message-signing")] dpp :: errors :: protocol_error :: ProtocolError :: InvalidSigningKeyTypeError (o_0) => dpp_errors_protocol_error_ProtocolError :: InvalidSigningKeyTypeError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , # [cfg (any (feature = "state-transition-validation" , feature = "state-transition-signing"))] dpp :: errors :: protocol_error :: ProtocolError :: InvalidIdentityPublicKeyTypeError (o_0) => dpp_errors_protocol_error_ProtocolError :: InvalidIdentityPublicKeyTypeError (< crate :: fermented :: types :: dpp :: state_transition :: errors :: invalid_identity_public_key_type_error :: dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError as ferment :: FFIConversionTo < dpp :: state_transition :: errors :: invalid_identity_public_key_type_error :: InvalidIdentityPublicKeyTypeError >> :: ffi_to (o_0)) , # [cfg (feature = "state-transition-validation")] dpp :: errors :: protocol_error :: ProtocolError :: StateTransitionIsNotSignedError (o_0) => dpp_errors_protocol_error_ProtocolError :: StateTransitionIsNotSignedError (< crate :: fermented :: types :: dpp :: state_transition :: errors :: state_transition_is_not_signed_error :: dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError as ferment :: FFIConversionTo < dpp :: state_transition :: errors :: state_transition_is_not_signed_error :: StateTransitionIsNotSignedError >> :: ffi_to (o_0)) , # [cfg (feature = "state-transition-validation")] dpp :: errors :: protocol_error :: ProtocolError :: PublicKeySecurityLevelNotMetError (o_0) => dpp_errors_protocol_error_ProtocolError :: PublicKeySecurityLevelNotMetError (< crate :: fermented :: types :: dpp :: state_transition :: errors :: public_key_security_level_not_met_error :: dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError as ferment :: FFIConversionTo < dpp :: state_transition :: errors :: public_key_security_level_not_met_error :: PublicKeySecurityLevelNotMetError >> :: ffi_to (o_0)) , # [cfg (any (all (feature = "state-transitions" , feature = "validation") , feature = "state-transition-validation" , feature = "state-transition-signing" , feature = "state-transition-validation"))] dpp :: errors :: protocol_error :: ProtocolError :: WrongPublicKeyPurposeError (o_0) => dpp_errors_protocol_error_ProtocolError :: WrongPublicKeyPurposeError (ferment :: boxed (o_0)) , # [cfg (feature = "state-transition-validation")] dpp :: errors :: protocol_error :: ProtocolError :: PublicKeyMismatchError (o_0) => dpp_errors_protocol_error_ProtocolError :: PublicKeyMismatchError (< crate :: fermented :: types :: dpp :: state_transition :: errors :: public_key_mismatch_error :: dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError as ferment :: FFIConversionTo < dpp :: state_transition :: errors :: public_key_mismatch_error :: PublicKeyMismatchError >> :: ffi_to (o_0)) , # [cfg (feature = "state-transition-validation")] dpp :: errors :: protocol_error :: ProtocolError :: InvalidSignaturePublicKeyError (o_0) => dpp_errors_protocol_error_ProtocolError :: InvalidSignaturePublicKeyError (< crate :: fermented :: types :: dpp :: state_transition :: errors :: invalid_signature_public_key_error :: dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError as ferment :: FFIConversionTo < dpp :: state_transition :: errors :: invalid_signature_public_key_error :: InvalidSignaturePublicKeyError >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: NonConsensusError (o_0) => dpp_errors_protocol_error_ProtocolError :: NonConsensusError (< crate :: fermented :: types :: dpp :: errors :: non_consensus_error :: dpp_errors_non_consensus_error_NonConsensusError as ferment :: FFIConversionTo < dpp :: errors :: non_consensus_error :: NonConsensusError >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: CompatibleProtocolVersionIsNotDefinedError (o_0) => dpp_errors_protocol_error_ProtocolError :: CompatibleProtocolVersionIsNotDefinedError (< crate :: fermented :: types :: dpp :: errors :: compatible_protocol_version_is_not_defined_error :: dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError as ferment :: FFIConversionTo < dpp :: errors :: compatible_protocol_version_is_not_defined_error :: CompatibleProtocolVersionIsNotDefinedError >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: InvalidDocumentTypeError (o_0) => dpp_errors_protocol_error_ProtocolError :: InvalidDocumentTypeError (< crate :: fermented :: types :: dpp :: data_contract :: errors :: invalid_document_type_error :: dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError as ferment :: FFIConversionTo < dpp :: data_contract :: errors :: invalid_document_type_error :: InvalidDocumentTypeError >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: DataContractNotPresentError (o_0) => dpp_errors_protocol_error_ProtocolError :: DataContractNotPresentError (< crate :: fermented :: types :: dpp :: data_contract :: errors :: data_contract_not_present_error :: dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError as ferment :: FFIConversionTo < dpp :: data_contract :: errors :: data_contract_not_present_error :: DataContractNotPresentError >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: InvalidSignaturePublicKeySecurityLevelError (o_0) => dpp_errors_protocol_error_ProtocolError :: InvalidSignaturePublicKeySecurityLevelError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_signature_public_key_security_level_error :: dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: invalid_signature_public_key_security_level_error :: InvalidSignaturePublicKeySecurityLevelError >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: InvalidStateTransitionTypeError (o_0) => dpp_errors_protocol_error_ProtocolError :: InvalidStateTransitionTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: state_transition :: invalid_state_transition_type_error :: dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: state_transition :: invalid_state_transition_type_error :: InvalidStateTransitionTypeError >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: PublicKeyIsDisabledError (o_0) => dpp_errors_protocol_error_ProtocolError :: PublicKeyIsDisabledError (< crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: public_key_is_disabled_error :: dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: signature :: public_key_is_disabled_error :: PublicKeyIsDisabledError >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: IdentityNotPresentError (o_0) => dpp_errors_protocol_error_ProtocolError :: IdentityNotPresentError (< crate :: fermented :: types :: dpp :: data_contract :: errors :: identity_not_present_error :: dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError as ferment :: FFIConversionTo < dpp :: data_contract :: errors :: identity_not_present_error :: IdentityNotPresentError >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: Overflow (o_0) => dpp_errors_protocol_error_ProtocolError :: Overflow (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < & str >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: DivideByZero (o_0) => dpp_errors_protocol_error_ProtocolError :: DivideByZero (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < & str >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: DesiredKeyWithTypePurposeSecurityLevelMissing (o_0) => dpp_errors_protocol_error_ProtocolError :: DesiredKeyWithTypePurposeSecurityLevelMissing (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: ValueError (o_0) => dpp_errors_protocol_error_ProtocolError :: ValueError (< crate :: fermented :: types :: platform_value :: error :: platform_value_error_Error as ferment :: FFIConversionTo < platform_value :: error :: Error >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: PlatformSerializationError (o_0) => dpp_errors_protocol_error_ProtocolError :: PlatformSerializationError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: PlatformDeserializationError (o_0) => dpp_errors_protocol_error_ProtocolError :: PlatformDeserializationError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: DashCoreError (o_0) => dpp_errors_protocol_error_ProtocolError :: DashCoreError (< dash_spv_apple_bindings :: custom :: dashcore :: dashcore_consensus_Error as ferment :: FFIConversionTo < dashcore :: consensus :: encode :: Error >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: InvalidIdentityError { errors , raw_identity } => dpp_errors_protocol_error_ProtocolError :: InvalidIdentityError { errors : < crate :: fermented :: generics :: Vec_dpp_errors_consensus_consensus_error_ConsensusError as ferment :: FFIConversionTo < Vec < dpp :: errors :: consensus :: consensus_error :: ConsensusError > >> :: ffi_to (errors) , raw_identity : < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionTo < platform_value :: Value >> :: ffi_to (raw_identity) } , dpp :: errors :: protocol_error :: ProtocolError :: VoteError (o_0) => dpp_errors_protocol_error_ProtocolError :: VoteError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: PublicKeyGenerationError (o_0) => dpp_errors_protocol_error_ProtocolError :: PublicKeyGenerationError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: GroupMemberNotFound (o_0) => dpp_errors_protocol_error_ProtocolError :: GroupMemberNotFound (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: GroupNotFound (o_0) => dpp_errors_protocol_error_ProtocolError :: GroupNotFound (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: CorruptedCodeExecution (o_0) => dpp_errors_protocol_error_ProtocolError :: CorruptedCodeExecution (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: CorruptedSerialization (o_0) => dpp_errors_protocol_error_ProtocolError :: CorruptedSerialization (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: CriticalCorruptedCreditsCodeExecution (o_0) => dpp_errors_protocol_error_ProtocolError :: CriticalCorruptedCreditsCodeExecution (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: InvalidVectorSizeError (o_0) => dpp_errors_protocol_error_ProtocolError :: InvalidVectorSizeError (< crate :: fermented :: types :: dpp :: errors :: invalid_vector_size_error :: dpp_errors_invalid_vector_size_error_InvalidVectorSizeError as ferment :: FFIConversionTo < dpp :: errors :: invalid_vector_size_error :: InvalidVectorSizeError >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: InvalidCBOR (o_0) => dpp_errors_protocol_error_ProtocolError :: InvalidCBOR (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , # [cfg (feature = "bls-signatures")] dpp :: errors :: protocol_error :: ProtocolError :: BlsError (o_0) => dpp_errors_protocol_error_ProtocolError :: BlsError (ferment :: boxed (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: PrivateKeySizeError { got } => dpp_errors_protocol_error_ProtocolError :: PrivateKeySizeError { got : got } , dpp :: errors :: protocol_error :: ProtocolError :: InvalidBLSPrivateKeyError (o_0) => dpp_errors_protocol_error_ProtocolError :: InvalidBLSPrivateKeyError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: BlsSignatureSizeError { got } => dpp_errors_protocol_error_ProtocolError :: BlsSignatureSizeError { got : got } , dpp :: errors :: protocol_error :: ProtocolError :: AddingDifferentTypes (o_0) => dpp_errors_protocol_error_ProtocolError :: AddingDifferentTypes (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: InvalidDistributionStep (o_0) => dpp_errors_protocol_error_ProtocolError :: InvalidDistributionStep (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < & str >> :: ffi_to (o_0)) , dpp :: errors :: protocol_error :: ProtocolError :: MissingEpochInfo (o_0) => dpp_errors_protocol_error_ProtocolError :: MissingEpochInfo (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_errors_protocol_error_ProtocolError { fn drop (& mut self) { unsafe { match self { dpp_errors_protocol_error_ProtocolError :: IdentifierError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: StringDecodeError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: EmptyPublicKeyDataError => { } , dpp_errors_protocol_error_ProtocolError :: MaxEncodedBytesReachedError { max_size_kbytes , size_hit } => { ; ; ; } , dpp_errors_protocol_error_ProtocolError :: EncodingError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: DecodingError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: FileNotFound (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: UnsupportedVersionMismatch { method , allowed_versions , received } => { ferment :: unbox_string (* method) ; ; ferment :: unbox_any (* allowed_versions) ; ; ferment :: unbox_any (* received) ; } , dpp_errors_protocol_error_ProtocolError :: UnknownVersionMismatch { method , known_versions , received } => { ferment :: unbox_string (* method) ; ; ferment :: unbox_any (* known_versions) ; ; ferment :: unbox_any (* received) ; } , dpp_errors_protocol_error_ProtocolError :: CurrentProtocolVersionNotInitialized => { } , dpp_errors_protocol_error_ProtocolError :: UnknownVersionError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: UnknownProtocolVersionError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: NoProtocolVersionError => { } , dpp_errors_protocol_error_ProtocolError :: ParsingError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: ParsingJsonError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: Error (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: InvalidKeyContractBoundsError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: UnknownStorageKeyRequirements (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: UnknownContestedIndexResolution (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: DataContractError (o_0) => { ferment :: unbox_any (* o_0) ; } , # [cfg (all (feature = "state-transitions" , feature = "validation"))] dpp_errors_protocol_error_ProtocolError :: StateTransitionError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: InvalidStateTransitionType (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: PlatformVersionError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: ConsensusError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: Document (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: Token (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: Generic (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: NotSupported (o_0) => { ferment :: unbox_string (* o_0) ; } , # [cfg (feature = "message-signing")] dpp_errors_protocol_error_ProtocolError :: InvalidSigningKeyTypeError (o_0) => { ferment :: unbox_string (* o_0) ; } , # [cfg (any (feature = "state-transition-validation" , feature = "state-transition-signing"))] dpp_errors_protocol_error_ProtocolError :: InvalidIdentityPublicKeyTypeError (o_0) => { ferment :: unbox_any (* o_0) ; } , # [cfg (feature = "state-transition-validation")] dpp_errors_protocol_error_ProtocolError :: StateTransitionIsNotSignedError (o_0) => { ferment :: unbox_any (* o_0) ; } , # [cfg (feature = "state-transition-validation")] dpp_errors_protocol_error_ProtocolError :: PublicKeySecurityLevelNotMetError (o_0) => { ferment :: unbox_any (* o_0) ; } , # [cfg (any (all (feature = "state-transitions" , feature = "validation") , feature = "state-transition-validation" , feature = "state-transition-signing" , feature = "state-transition-validation"))] dpp_errors_protocol_error_ProtocolError :: WrongPublicKeyPurposeError (o_0) => { ferment :: unbox_any (* o_0) ; } , # [cfg (feature = "state-transition-validation")] dpp_errors_protocol_error_ProtocolError :: PublicKeyMismatchError (o_0) => { ferment :: unbox_any (* o_0) ; } , # [cfg (feature = "state-transition-validation")] dpp_errors_protocol_error_ProtocolError :: InvalidSignaturePublicKeyError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: NonConsensusError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: CompatibleProtocolVersionIsNotDefinedError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: InvalidDocumentTypeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: DataContractNotPresentError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: InvalidSignaturePublicKeySecurityLevelError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: InvalidStateTransitionTypeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: PublicKeyIsDisabledError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: IdentityNotPresentError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: Overflow (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: DivideByZero (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: DesiredKeyWithTypePurposeSecurityLevelMissing (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: ValueError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: PlatformSerializationError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: PlatformDeserializationError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: DashCoreError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: InvalidIdentityError { errors , raw_identity } => { ferment :: unbox_any (* errors) ; ; ferment :: unbox_any (* raw_identity) ; } , dpp_errors_protocol_error_ProtocolError :: VoteError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: PublicKeyGenerationError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: GroupMemberNotFound (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: GroupNotFound (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: CorruptedCodeExecution (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: CorruptedSerialization (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: CriticalCorruptedCreditsCodeExecution (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: InvalidVectorSizeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: InvalidCBOR (o_0) => { ferment :: unbox_string (* o_0) ; } , # [cfg (feature = "bls-signatures")] dpp_errors_protocol_error_ProtocolError :: BlsError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: PrivateKeySizeError { got } => { ; } , dpp_errors_protocol_error_ProtocolError :: InvalidBLSPrivateKeyError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: BlsSignatureSizeError { got } => { ; } , dpp_errors_protocol_error_ProtocolError :: AddingDifferentTypes (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: InvalidDistributionStep (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_errors_protocol_error_ProtocolError :: MissingEpochInfo (o_0) => { ferment :: unbox_string (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_IdentifierError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: IdentifierError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_StringDecodeError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: StringDecodeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_EmptyPublicKeyDataError_ctor () -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: EmptyPublicKeyDataError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_MaxEncodedBytesReachedError_ctor (max_size_kbytes : usize , size_hit : usize) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: MaxEncodedBytesReachedError { max_size_kbytes , size_hit }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_EncodingError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: EncodingError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_DecodingError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: DecodingError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_FileNotFound_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: FileNotFound (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_UnsupportedVersionMismatch_ctor (method : * mut std :: os :: raw :: c_char , allowed_versions : * mut crate :: fermented :: generics :: Vec_versioned_feature_core_FeatureVersion , received : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: UnsupportedVersionMismatch { method , allowed_versions , received }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_UnknownVersionMismatch_ctor (method : * mut std :: os :: raw :: c_char , known_versions : * mut crate :: fermented :: generics :: Vec_versioned_feature_core_FeatureVersion , received : * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: UnknownVersionMismatch { method , known_versions , received }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_CurrentProtocolVersionNotInitialized_ctor () -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: CurrentProtocolVersionNotInitialized { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_UnknownVersionError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: UnknownVersionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_UnknownProtocolVersionError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: UnknownProtocolVersionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_NoProtocolVersionError_ctor () -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: NoProtocolVersionError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_ParsingError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: ParsingError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_ParsingJsonError_ctor (o_o_0 : * mut dash_spv_apple_bindings :: custom :: serde_json :: serde_json_Error) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: ParsingJsonError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_Error_ctor (o_o_0 : * mut dash_spv_apple_bindings :: custom :: anyhow :: anyhow_Error) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: Error (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_InvalidKeyContractBoundsError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: InvalidKeyContractBoundsError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_UnknownStorageKeyRequirements_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: UnknownStorageKeyRequirements (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_UnknownContestedIndexResolution_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: UnknownContestedIndexResolution (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_DataContractError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: errors :: contract :: dpp_data_contract_errors_contract_DataContractError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: DataContractError (o_o_0)) } # [cfg (all (feature = "state-transitions" , feature = "validation"))] # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_StateTransitionError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: errors :: state_transition_error :: dpp_state_transition_errors_state_transition_error_StateTransitionError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: StateTransitionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_InvalidStateTransitionType_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: InvalidStateTransitionType (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_PlatformVersionError_ctor (o_o_0 : * mut crate :: fermented :: types :: platform_version :: error :: platform_version_error_PlatformVersionError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: PlatformVersionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_ConsensusError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: consensus_error :: dpp_errors_consensus_consensus_error_ConsensusError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: ConsensusError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_Document_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: document :: errors :: dpp_document_errors_DocumentError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: Document (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_Token_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: tokens :: errors :: dpp_tokens_errors_TokenError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: Token (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_Generic_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: Generic (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_NotSupported_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: NotSupported (o_o_0)) } # [cfg (feature = "message-signing")] # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_InvalidSigningKeyTypeError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: InvalidSigningKeyTypeError (o_o_0)) } # [cfg (any (feature = "state-transition-validation" , feature = "state-transition-signing"))] # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_InvalidIdentityPublicKeyTypeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: errors :: invalid_identity_public_key_type_error :: dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: InvalidIdentityPublicKeyTypeError (o_o_0)) } # [cfg (feature = "state-transition-validation")] # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_StateTransitionIsNotSignedError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: errors :: state_transition_is_not_signed_error :: dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: StateTransitionIsNotSignedError (o_o_0)) } # [cfg (feature = "state-transition-validation")] # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_PublicKeySecurityLevelNotMetError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: errors :: public_key_security_level_not_met_error :: dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: PublicKeySecurityLevelNotMetError (o_o_0)) } # [cfg (any (all (feature = "state-transitions" , feature = "validation") , feature = "state-transition-validation" , feature = "state-transition-signing" , feature = "state-transition-validation"))] # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_WrongPublicKeyPurposeError_ctor (o_o_0 : * mut dpp :: state_transition :: errors :: wrong_public_key_purpose_error :: WrongPublicKeyPurposeError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: WrongPublicKeyPurposeError (o_o_0)) } # [cfg (feature = "state-transition-validation")] # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_PublicKeyMismatchError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: errors :: public_key_mismatch_error :: dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: PublicKeyMismatchError (o_o_0)) } # [cfg (feature = "state-transition-validation")] # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_InvalidSignaturePublicKeyError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: errors :: invalid_signature_public_key_error :: dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: InvalidSignaturePublicKeyError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_NonConsensusError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: non_consensus_error :: dpp_errors_non_consensus_error_NonConsensusError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: NonConsensusError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_CompatibleProtocolVersionIsNotDefinedError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: compatible_protocol_version_is_not_defined_error :: dpp_errors_compatible_protocol_version_is_not_defined_error_CompatibleProtocolVersionIsNotDefinedError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: CompatibleProtocolVersionIsNotDefinedError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_InvalidDocumentTypeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: errors :: invalid_document_type_error :: dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: InvalidDocumentTypeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_DataContractNotPresentError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: errors :: data_contract_not_present_error :: dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: DataContractNotPresentError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_InvalidSignaturePublicKeySecurityLevelError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: invalid_signature_public_key_security_level_error :: dpp_errors_consensus_signature_invalid_signature_public_key_security_level_error_InvalidSignaturePublicKeySecurityLevelError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: InvalidSignaturePublicKeySecurityLevelError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_InvalidStateTransitionTypeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: state_transition :: invalid_state_transition_type_error :: dpp_errors_consensus_basic_state_transition_invalid_state_transition_type_error_InvalidStateTransitionTypeError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: InvalidStateTransitionTypeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_PublicKeyIsDisabledError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: signature :: public_key_is_disabled_error :: dpp_errors_consensus_signature_public_key_is_disabled_error_PublicKeyIsDisabledError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: PublicKeyIsDisabledError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_IdentityNotPresentError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: errors :: identity_not_present_error :: dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: IdentityNotPresentError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_Overflow_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: Overflow (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_DivideByZero_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: DivideByZero (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_DesiredKeyWithTypePurposeSecurityLevelMissing_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: DesiredKeyWithTypePurposeSecurityLevelMissing (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_ValueError_ctor (o_o_0 : * mut crate :: fermented :: types :: platform_value :: error :: platform_value_error_Error) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: ValueError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_PlatformSerializationError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: PlatformSerializationError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_PlatformDeserializationError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: PlatformDeserializationError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_DashCoreError_ctor (o_o_0 : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_consensus_Error) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: DashCoreError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_InvalidIdentityError_ctor (errors : * mut crate :: fermented :: generics :: Vec_dpp_errors_consensus_consensus_error_ConsensusError , raw_identity : * mut crate :: fermented :: types :: platform_value :: platform_value_Value) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: InvalidIdentityError { errors , raw_identity }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_VoteError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: VoteError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_PublicKeyGenerationError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: PublicKeyGenerationError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_GroupMemberNotFound_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: GroupMemberNotFound (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_GroupNotFound_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: GroupNotFound (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_CorruptedCodeExecution_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: CorruptedCodeExecution (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_CorruptedSerialization_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: CorruptedSerialization (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_CriticalCorruptedCreditsCodeExecution_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: CriticalCorruptedCreditsCodeExecution (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_InvalidVectorSizeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: invalid_vector_size_error :: dpp_errors_invalid_vector_size_error_InvalidVectorSizeError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: InvalidVectorSizeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_InvalidCBOR_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: InvalidCBOR (o_o_0)) } # [cfg (feature = "bls-signatures")] # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_BlsError_ctor (o_o_0 : * mut dashcore :: blsful :: BlsError) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: BlsError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_PrivateKeySizeError_ctor (got : u32) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: PrivateKeySizeError { got }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_InvalidBLSPrivateKeyError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: InvalidBLSPrivateKeyError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_BlsSignatureSizeError_ctor (got : u32) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: BlsSignatureSizeError { got }) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_AddingDifferentTypes_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: AddingDifferentTypes (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_InvalidDistributionStep_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: InvalidDistributionStep (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_MissingEpochInfo_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_errors_protocol_error_ProtocolError { ferment :: boxed (dpp_errors_protocol_error_ProtocolError :: MissingEpochInfo (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_errors_protocol_error_ProtocolError_destroy < > (ffi : * mut dpp_errors_protocol_error_ProtocolError) { ferment :: unbox_any (ffi) ; } } } pub mod core_subsidy { use crate as dash_spv_apple_bindings ; pub mod epoch_core_reward_credits_for_distribution { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; } } } pub mod nft { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`TradeMode`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_nft_TradeMode { None = 0 , DirectPurchase = 1 } impl ferment :: FFIConversionFrom < dpp :: nft :: TradeMode > for dpp_nft_TradeMode { unsafe fn ffi_from_const (ffi : * const dpp_nft_TradeMode) -> dpp :: nft :: TradeMode { let ffi_ref = & * ffi ; match ffi_ref { dpp_nft_TradeMode :: None => dpp :: nft :: TradeMode :: None , dpp_nft_TradeMode :: DirectPurchase => dpp :: nft :: TradeMode :: DirectPurchase } } } impl ferment :: FFIConversionTo < dpp :: nft :: TradeMode > for dpp_nft_TradeMode { unsafe fn ffi_to_const (obj : dpp :: nft :: TradeMode) -> * const dpp_nft_TradeMode { ferment :: boxed (match obj { dpp :: nft :: TradeMode :: None => dpp_nft_TradeMode :: None , dpp :: nft :: TradeMode :: DirectPurchase => dpp_nft_TradeMode :: DirectPurchase , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_nft_TradeMode { fn drop (& mut self) { unsafe { match self { dpp_nft_TradeMode :: None => { } , dpp_nft_TradeMode :: DirectPurchase => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_nft_TradeMode_None_ctor () -> * mut dpp_nft_TradeMode { ferment :: boxed (dpp_nft_TradeMode :: None { }) } # [no_mangle] pub unsafe extern "C" fn dpp_nft_TradeMode_DirectPurchase_ctor () -> * mut dpp_nft_TradeMode { ferment :: boxed (dpp_nft_TradeMode :: DirectPurchase { }) } # [no_mangle] pub unsafe extern "C" fn dpp_nft_TradeMode_destroy < > (ffi : * mut dpp_nft_TradeMode) { ferment :: unbox_any (ffi) ; } } pub mod identity { use crate as dash_spv_apple_bindings ; pub mod conversion { use crate as dash_spv_apple_bindings ; # [cfg (feature = "identity-value-conversion")] pub mod platform_value { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "identity-json-conversion")] pub mod json { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "identity-cbor-conversion")] pub mod cbor { use crate as dash_spv_apple_bindings ; } } pub mod identity_nonce { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`MergeIdentityNonceResult`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_identity_identity_nonce_MergeIdentityNonceResult { InvalidNonce , NonceTooFarInFuture , NonceTooFarInPast , NonceAlreadyPresentAtTip , NonceAlreadyPresentInPast (u64) , MergeIdentityNonceSuccess (* mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce) } impl ferment :: FFIConversionFrom < dpp :: identity :: identity_nonce :: MergeIdentityNonceResult > for dpp_identity_identity_nonce_MergeIdentityNonceResult { unsafe fn ffi_from_const (ffi : * const dpp_identity_identity_nonce_MergeIdentityNonceResult) -> dpp :: identity :: identity_nonce :: MergeIdentityNonceResult { let ffi_ref = & * ffi ; match ffi_ref { dpp_identity_identity_nonce_MergeIdentityNonceResult :: InvalidNonce => dpp :: identity :: identity_nonce :: MergeIdentityNonceResult :: InvalidNonce , dpp_identity_identity_nonce_MergeIdentityNonceResult :: NonceTooFarInFuture => dpp :: identity :: identity_nonce :: MergeIdentityNonceResult :: NonceTooFarInFuture , dpp_identity_identity_nonce_MergeIdentityNonceResult :: NonceTooFarInPast => dpp :: identity :: identity_nonce :: MergeIdentityNonceResult :: NonceTooFarInPast , dpp_identity_identity_nonce_MergeIdentityNonceResult :: NonceAlreadyPresentAtTip => dpp :: identity :: identity_nonce :: MergeIdentityNonceResult :: NonceAlreadyPresentAtTip , dpp_identity_identity_nonce_MergeIdentityNonceResult :: NonceAlreadyPresentInPast (o_0) => dpp :: identity :: identity_nonce :: MergeIdentityNonceResult :: NonceAlreadyPresentInPast (* o_0) , dpp_identity_identity_nonce_MergeIdentityNonceResult :: MergeIdentityNonceSuccess (o_0) => dpp :: identity :: identity_nonce :: MergeIdentityNonceResult :: MergeIdentityNonceSuccess (< crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionFrom < dpp :: prelude :: IdentityNonce >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: identity :: identity_nonce :: MergeIdentityNonceResult > for dpp_identity_identity_nonce_MergeIdentityNonceResult { unsafe fn ffi_to_const (obj : dpp :: identity :: identity_nonce :: MergeIdentityNonceResult) -> * const dpp_identity_identity_nonce_MergeIdentityNonceResult { ferment :: boxed (match obj { dpp :: identity :: identity_nonce :: MergeIdentityNonceResult :: InvalidNonce => dpp_identity_identity_nonce_MergeIdentityNonceResult :: InvalidNonce , dpp :: identity :: identity_nonce :: MergeIdentityNonceResult :: NonceTooFarInFuture => dpp_identity_identity_nonce_MergeIdentityNonceResult :: NonceTooFarInFuture , dpp :: identity :: identity_nonce :: MergeIdentityNonceResult :: NonceTooFarInPast => dpp_identity_identity_nonce_MergeIdentityNonceResult :: NonceTooFarInPast , dpp :: identity :: identity_nonce :: MergeIdentityNonceResult :: NonceAlreadyPresentAtTip => dpp_identity_identity_nonce_MergeIdentityNonceResult :: NonceAlreadyPresentAtTip , dpp :: identity :: identity_nonce :: MergeIdentityNonceResult :: NonceAlreadyPresentInPast (o_0) => dpp_identity_identity_nonce_MergeIdentityNonceResult :: NonceAlreadyPresentInPast (o_0) , dpp :: identity :: identity_nonce :: MergeIdentityNonceResult :: MergeIdentityNonceSuccess (o_0) => dpp_identity_identity_nonce_MergeIdentityNonceResult :: MergeIdentityNonceSuccess (< crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionTo < dpp :: prelude :: IdentityNonce >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_identity_identity_nonce_MergeIdentityNonceResult { fn drop (& mut self) { unsafe { match self { dpp_identity_identity_nonce_MergeIdentityNonceResult :: InvalidNonce => { } , dpp_identity_identity_nonce_MergeIdentityNonceResult :: NonceTooFarInFuture => { } , dpp_identity_identity_nonce_MergeIdentityNonceResult :: NonceTooFarInPast => { } , dpp_identity_identity_nonce_MergeIdentityNonceResult :: NonceAlreadyPresentAtTip => { } , dpp_identity_identity_nonce_MergeIdentityNonceResult :: NonceAlreadyPresentInPast (o_0) => { ; } , dpp_identity_identity_nonce_MergeIdentityNonceResult :: MergeIdentityNonceSuccess (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_nonce_MergeIdentityNonceResult_InvalidNonce_ctor () -> * mut dpp_identity_identity_nonce_MergeIdentityNonceResult { ferment :: boxed (dpp_identity_identity_nonce_MergeIdentityNonceResult :: InvalidNonce { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_nonce_MergeIdentityNonceResult_NonceTooFarInFuture_ctor () -> * mut dpp_identity_identity_nonce_MergeIdentityNonceResult { ferment :: boxed (dpp_identity_identity_nonce_MergeIdentityNonceResult :: NonceTooFarInFuture { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_nonce_MergeIdentityNonceResult_NonceTooFarInPast_ctor () -> * mut dpp_identity_identity_nonce_MergeIdentityNonceResult { ferment :: boxed (dpp_identity_identity_nonce_MergeIdentityNonceResult :: NonceTooFarInPast { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_nonce_MergeIdentityNonceResult_NonceAlreadyPresentAtTip_ctor () -> * mut dpp_identity_identity_nonce_MergeIdentityNonceResult { ferment :: boxed (dpp_identity_identity_nonce_MergeIdentityNonceResult :: NonceAlreadyPresentAtTip { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_nonce_MergeIdentityNonceResult_NonceAlreadyPresentInPast_ctor (o_o_0 : u64) -> * mut dpp_identity_identity_nonce_MergeIdentityNonceResult { ferment :: boxed (dpp_identity_identity_nonce_MergeIdentityNonceResult :: NonceAlreadyPresentInPast (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_nonce_MergeIdentityNonceResult_MergeIdentityNonceSuccess_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce) -> * mut dpp_identity_identity_nonce_MergeIdentityNonceResult { ferment :: boxed (dpp_identity_identity_nonce_MergeIdentityNonceResult :: MergeIdentityNonceSuccess (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_nonce_MergeIdentityNonceResult_destroy < > (ffi : * mut dpp_identity_identity_nonce_MergeIdentityNonceResult) { ferment :: unbox_any (ffi) ; } } pub mod state_transition { use crate as dash_spv_apple_bindings ; pub mod asset_lock_proof { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`AssetLockProof`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_identity_state_transition_asset_lock_proof_AssetLockProof { Instant (* mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: instant :: instant_asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof) , Chain (* mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: chain :: chain_asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof) } impl ferment :: FFIConversionFrom < dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof > for dpp_identity_state_transition_asset_lock_proof_AssetLockProof { unsafe fn ffi_from_const (ffi : * const dpp_identity_state_transition_asset_lock_proof_AssetLockProof) -> dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof { let ffi_ref = & * ffi ; match ffi_ref { dpp_identity_state_transition_asset_lock_proof_AssetLockProof :: Instant (o_0) => dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof :: Instant (< crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: instant :: instant_asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof as ferment :: FFIConversionFrom < dpp :: identity :: state_transition :: asset_lock_proof :: instant :: instant_asset_lock_proof :: InstantAssetLockProof >> :: ffi_from (* o_0)) , dpp_identity_state_transition_asset_lock_proof_AssetLockProof :: Chain (o_0) => dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof :: Chain (< crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: chain :: chain_asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof as ferment :: FFIConversionFrom < dpp :: identity :: state_transition :: asset_lock_proof :: chain :: chain_asset_lock_proof :: ChainAssetLockProof >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof > for dpp_identity_state_transition_asset_lock_proof_AssetLockProof { unsafe fn ffi_to_const (obj : dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof) -> * const dpp_identity_state_transition_asset_lock_proof_AssetLockProof { ferment :: boxed (match obj { dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof :: Instant (o_0) => dpp_identity_state_transition_asset_lock_proof_AssetLockProof :: Instant (< crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: instant :: instant_asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof as ferment :: FFIConversionTo < dpp :: identity :: state_transition :: asset_lock_proof :: instant :: instant_asset_lock_proof :: InstantAssetLockProof >> :: ffi_to (o_0)) , dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof :: Chain (o_0) => dpp_identity_state_transition_asset_lock_proof_AssetLockProof :: Chain (< crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: chain :: chain_asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof as ferment :: FFIConversionTo < dpp :: identity :: state_transition :: asset_lock_proof :: chain :: chain_asset_lock_proof :: ChainAssetLockProof >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_identity_state_transition_asset_lock_proof_AssetLockProof { fn drop (& mut self) { unsafe { match self { dpp_identity_state_transition_asset_lock_proof_AssetLockProof :: Instant (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_identity_state_transition_asset_lock_proof_AssetLockProof :: Chain (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_state_transition_asset_lock_proof_AssetLockProof_Instant_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: instant :: instant_asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof) -> * mut dpp_identity_state_transition_asset_lock_proof_AssetLockProof { ferment :: boxed (dpp_identity_state_transition_asset_lock_proof_AssetLockProof :: Instant (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_state_transition_asset_lock_proof_AssetLockProof_Chain_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: chain :: chain_asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof) -> * mut dpp_identity_state_transition_asset_lock_proof_AssetLockProof { ferment :: boxed (dpp_identity_state_transition_asset_lock_proof_AssetLockProof :: Chain (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_state_transition_asset_lock_proof_AssetLockProof_destroy < > (ffi : * mut dpp_identity_state_transition_asset_lock_proof_AssetLockProof) { ferment :: unbox_any (ffi) ; } pub mod instant { use crate as dash_spv_apple_bindings ; pub mod methods { use crate as dash_spv_apple_bindings ; pub mod validate_structure { use crate as dash_spv_apple_bindings ; } } pub mod instant_asset_lock_proof { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InstantAssetLockProof`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof { pub instant_lock : * mut crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock , pub transaction : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction , pub output_index : u32 } impl ferment :: FFIConversionFrom < dpp :: identity :: state_transition :: asset_lock_proof :: instant :: instant_asset_lock_proof :: InstantAssetLockProof > for dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof { unsafe fn ffi_from_const (ffi : * const dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof) -> dpp :: identity :: state_transition :: asset_lock_proof :: instant :: instant_asset_lock_proof :: InstantAssetLockProof { let ffi_ref = & * ffi ; dpp :: identity :: state_transition :: asset_lock_proof :: instant :: instant_asset_lock_proof :: InstantAssetLockProof { instant_lock : < crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock as ferment :: FFIConversionFrom < dashcore :: ephemerealdata :: instant_lock :: InstantLock >> :: ffi_from (ffi_ref . instant_lock) , transaction : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_from (ffi_ref . transaction) , output_index : ffi_ref . output_index } } } impl ferment :: FFIConversionTo < dpp :: identity :: state_transition :: asset_lock_proof :: instant :: instant_asset_lock_proof :: InstantAssetLockProof > for dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof { unsafe fn ffi_to_const (obj : dpp :: identity :: state_transition :: asset_lock_proof :: instant :: instant_asset_lock_proof :: InstantAssetLockProof) -> * const dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof { ferment :: boxed (dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof { instant_lock : < crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock as ferment :: FFIConversionTo < dashcore :: ephemerealdata :: instant_lock :: InstantLock >> :: ffi_to (obj . instant_lock) , transaction : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_to (obj . transaction) , output_index : obj . output_index }) } } impl Drop for dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . instant_lock) ; ferment :: unbox_any (ffi_ref . transaction) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof_ctor < > (instant_lock : * mut crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock , transaction : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction , output_index : u32) -> * mut dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof { ferment :: boxed (dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof { instant_lock , transaction , output_index }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof_destroy < > (ffi : * mut dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof_get_instant_lock < > (obj : * const dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof) -> * mut crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock { (* obj) . instant_lock } # [no_mangle] pub unsafe extern "C" fn dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof_get_transaction < > (obj : * const dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction { (* obj) . transaction } # [no_mangle] pub unsafe extern "C" fn dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof_get_output_index < > (obj : * const dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof) -> u32 { (* obj) . output_index } # [no_mangle] pub unsafe extern "C" fn dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof_set_instant_lock < > (obj : * const dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof) -> * mut crate :: fermented :: types :: dashcore :: ephemerealdata :: instant_lock :: dashcore_ephemerealdata_instant_lock_InstantLock { (* obj) . instant_lock } # [no_mangle] pub unsafe extern "C" fn dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof_set_transaction < > (obj : * const dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction { (* obj) . transaction } # [no_mangle] pub unsafe extern "C" fn dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof_set_output_index < > (obj : * const dpp_identity_state_transition_asset_lock_proof_instant_instant_asset_lock_proof_InstantAssetLockProof) -> u32 { (* obj) . output_index } } } pub mod chain { use crate as dash_spv_apple_bindings ; pub mod chain_asset_lock_proof { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ChainAssetLockProof`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof { pub core_chain_locked_height : u32 , pub out_point : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint } impl ferment :: FFIConversionFrom < dpp :: identity :: state_transition :: asset_lock_proof :: chain :: chain_asset_lock_proof :: ChainAssetLockProof > for dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof { unsafe fn ffi_from_const (ffi : * const dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof) -> dpp :: identity :: state_transition :: asset_lock_proof :: chain :: chain_asset_lock_proof :: ChainAssetLockProof { let ffi_ref = & * ffi ; dpp :: identity :: state_transition :: asset_lock_proof :: chain :: chain_asset_lock_proof :: ChainAssetLockProof { core_chain_locked_height : ffi_ref . core_chain_locked_height , out_point : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_from (ffi_ref . out_point) } } } impl ferment :: FFIConversionTo < dpp :: identity :: state_transition :: asset_lock_proof :: chain :: chain_asset_lock_proof :: ChainAssetLockProof > for dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof { unsafe fn ffi_to_const (obj : dpp :: identity :: state_transition :: asset_lock_proof :: chain :: chain_asset_lock_proof :: ChainAssetLockProof) -> * const dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof { ferment :: boxed (dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof { core_chain_locked_height : obj . core_chain_locked_height , out_point : < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_to (obj . out_point) }) } } impl Drop for dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . out_point) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof_ctor < > (core_chain_locked_height : u32 , out_point : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint) -> * mut dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof { ferment :: boxed (dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof { core_chain_locked_height , out_point }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof_destroy < > (ffi : * mut dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof_get_core_chain_locked_height < > (obj : * const dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof) -> u32 { (* obj) . core_chain_locked_height } # [no_mangle] pub unsafe extern "C" fn dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof_get_out_point < > (obj : * const dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint { (* obj) . out_point } # [no_mangle] pub unsafe extern "C" fn dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof_set_core_chain_locked_height < > (obj : * const dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof) -> u32 { (* obj) . core_chain_locked_height } # [no_mangle] pub unsafe extern "C" fn dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof_set_out_point < > (obj : * const dpp_identity_state_transition_asset_lock_proof_chain_chain_asset_lock_proof_ChainAssetLockProof) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint { (* obj) . out_point } } } pub mod validate_asset_lock_transaction_structure { use crate as dash_spv_apple_bindings ; } } } pub mod methods { use crate as dash_spv_apple_bindings ; pub mod create_basic_identity { use crate as dash_spv_apple_bindings ; } } pub mod identity { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`Identity`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_identity_identity_Identity { V0 (* mut crate :: fermented :: types :: dpp :: identity :: v0 :: dpp_identity_v0_IdentityV0) } impl ferment :: FFIConversionFrom < dpp :: identity :: identity :: Identity > for dpp_identity_identity_Identity { unsafe fn ffi_from_const (ffi : * const dpp_identity_identity_Identity) -> dpp :: identity :: identity :: Identity { let ffi_ref = & * ffi ; match ffi_ref { dpp_identity_identity_Identity :: V0 (o_0) => dpp :: identity :: identity :: Identity :: V0 (< crate :: fermented :: types :: dpp :: identity :: v0 :: dpp_identity_v0_IdentityV0 as ferment :: FFIConversionFrom < dpp :: identity :: v0 :: IdentityV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: identity :: identity :: Identity > for dpp_identity_identity_Identity { unsafe fn ffi_to_const (obj : dpp :: identity :: identity :: Identity) -> * const dpp_identity_identity_Identity { ferment :: boxed (match obj { dpp :: identity :: identity :: Identity :: V0 (o_0) => dpp_identity_identity_Identity :: V0 (< crate :: fermented :: types :: dpp :: identity :: v0 :: dpp_identity_v0_IdentityV0 as ferment :: FFIConversionTo < dpp :: identity :: v0 :: IdentityV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_identity_identity_Identity { fn drop (& mut self) { unsafe { match self { dpp_identity_identity_Identity :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_Identity_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: identity :: v0 :: dpp_identity_v0_IdentityV0) -> * mut dpp_identity_identity_Identity { ferment :: boxed (dpp_identity_identity_Identity :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_Identity_destroy < > (ffi : * mut dpp_identity_identity_Identity) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`PartialIdentity`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_identity_identity_PartialIdentity { pub id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub loaded_public_keys : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey , pub balance : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits , pub revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision , pub not_found_public_keys : * mut crate :: fermented :: generics :: std_collections_BTreeSet_dpp_identity_identity_public_key_KeyID } impl ferment :: FFIConversionFrom < dpp :: identity :: identity :: PartialIdentity > for dpp_identity_identity_PartialIdentity { unsafe fn ffi_from_const (ffi : * const dpp_identity_identity_PartialIdentity) -> dpp :: identity :: identity :: PartialIdentity { let ffi_ref = & * ffi ; dpp :: identity :: identity :: PartialIdentity { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . id) , loaded_public_keys : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: identity :: identity_public_key :: KeyID , dpp :: identity :: identity_public_key :: IdentityPublicKey > >> :: ffi_from (ffi_ref . loaded_public_keys) , balance : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionFrom < dpp :: balances :: credits :: Credits >> :: ffi_from_opt (ffi_ref . balance) , revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionFrom < dpp :: prelude :: Revision >> :: ffi_from_opt (ffi_ref . revision) , not_found_public_keys : < crate :: fermented :: generics :: std_collections_BTreeSet_dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < std :: collections :: BTreeSet < dpp :: identity :: identity_public_key :: KeyID > >> :: ffi_from (ffi_ref . not_found_public_keys) } } } impl ferment :: FFIConversionTo < dpp :: identity :: identity :: PartialIdentity > for dpp_identity_identity_PartialIdentity { unsafe fn ffi_to_const (obj : dpp :: identity :: identity :: PartialIdentity) -> * const dpp_identity_identity_PartialIdentity { ferment :: boxed (dpp_identity_identity_PartialIdentity { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . id) , loaded_public_keys : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: identity :: identity_public_key :: KeyID , dpp :: identity :: identity_public_key :: IdentityPublicKey > >> :: ffi_to (obj . loaded_public_keys) , balance : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionTo < dpp :: balances :: credits :: Credits >> :: ffi_to_opt (obj . balance) , revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionTo < dpp :: prelude :: Revision >> :: ffi_to_opt (obj . revision) , not_found_public_keys : < crate :: fermented :: generics :: std_collections_BTreeSet_dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < std :: collections :: BTreeSet < dpp :: identity :: identity_public_key :: KeyID > >> :: ffi_to (obj . not_found_public_keys) }) } } impl Drop for dpp_identity_identity_PartialIdentity { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . id) ; ferment :: unbox_any (ffi_ref . loaded_public_keys) ; ferment :: unbox_any_opt (ffi_ref . balance) ; ferment :: unbox_any_opt (ffi_ref . revision) ; ferment :: unbox_any (ffi_ref . not_found_public_keys) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_PartialIdentity_ctor < > (id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , loaded_public_keys : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey , balance : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits , revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision , not_found_public_keys : * mut crate :: fermented :: generics :: std_collections_BTreeSet_dpp_identity_identity_public_key_KeyID) -> * mut dpp_identity_identity_PartialIdentity { ferment :: boxed (dpp_identity_identity_PartialIdentity { id , loaded_public_keys , balance , revision , not_found_public_keys }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_PartialIdentity_destroy < > (ffi : * mut dpp_identity_identity_PartialIdentity) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_PartialIdentity_get_id < > (obj : * const dpp_identity_identity_PartialIdentity) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_PartialIdentity_get_loaded_public_keys < > (obj : * const dpp_identity_identity_PartialIdentity) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey { (* obj) . loaded_public_keys } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_PartialIdentity_get_balance < > (obj : * const dpp_identity_identity_PartialIdentity) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . balance } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_PartialIdentity_get_revision < > (obj : * const dpp_identity_identity_PartialIdentity) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . revision } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_PartialIdentity_get_not_found_public_keys < > (obj : * const dpp_identity_identity_PartialIdentity) -> * mut crate :: fermented :: generics :: std_collections_BTreeSet_dpp_identity_identity_public_key_KeyID { (* obj) . not_found_public_keys } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_PartialIdentity_set_id < > (obj : * const dpp_identity_identity_PartialIdentity) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_PartialIdentity_set_loaded_public_keys < > (obj : * const dpp_identity_identity_PartialIdentity) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey { (* obj) . loaded_public_keys } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_PartialIdentity_set_balance < > (obj : * const dpp_identity_identity_PartialIdentity) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . balance } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_PartialIdentity_set_revision < > (obj : * const dpp_identity_identity_PartialIdentity) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . revision } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_PartialIdentity_set_not_found_public_keys < > (obj : * const dpp_identity_identity_PartialIdentity) -> * mut crate :: fermented :: generics :: std_collections_BTreeSet_dpp_identity_identity_public_key_KeyID { (* obj) . not_found_public_keys } } pub mod core_script { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`CoreScript`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_identity_core_script_CoreScript (* mut dashcore :: blockdata :: script :: ScriptBuf) ; impl ferment :: FFIConversionFrom < dpp :: identity :: core_script :: CoreScript > for dpp_identity_core_script_CoreScript { unsafe fn ffi_from_const (ffi : * const dpp_identity_core_script_CoreScript) -> dpp :: identity :: core_script :: CoreScript { let ffi_ref = & * ffi ; dpp :: identity :: core_script :: CoreScript ((& * ffi_ref . 0) . clone ()) } } impl ferment :: FFIConversionTo < dpp :: identity :: core_script :: CoreScript > for dpp_identity_core_script_CoreScript { unsafe fn ffi_to_const (obj : dpp :: identity :: core_script :: CoreScript) -> * const dpp_identity_core_script_CoreScript { ferment :: boxed (dpp_identity_core_script_CoreScript (ferment :: boxed (obj . 0))) } } impl Drop for dpp_identity_core_script_CoreScript { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_core_script_CoreScript_ctor < > (o_0 : * mut dashcore :: blockdata :: script :: ScriptBuf) -> * mut dpp_identity_core_script_CoreScript { ferment :: boxed (dpp_identity_core_script_CoreScript (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_core_script_CoreScript_destroy < > (ffi : * mut dpp_identity_core_script_CoreScript) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_identity_core_script_CoreScript_get_0 < > (obj : * const dpp_identity_core_script_CoreScript) -> * mut dashcore :: blockdata :: script :: ScriptBuf { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_identity_core_script_CoreScript_set_0 < > (obj : * const dpp_identity_core_script_CoreScript) -> * mut dashcore :: blockdata :: script :: ScriptBuf { (* obj) . 0 } } pub mod fields { use crate as dash_spv_apple_bindings ; } pub mod accessors { use crate as dash_spv_apple_bindings ; } pub mod errors { use crate as dash_spv_apple_bindings ; pub mod asset_lock_transaction_is_not_found_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`AssetLockTransactionIsNotFoundError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError { pub transaction_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid } impl ferment :: FFIConversionFrom < dpp :: identity :: errors :: asset_lock_transaction_is_not_found_error :: AssetLockTransactionIsNotFoundError > for dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError { unsafe fn ffi_from_const (ffi : * const dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError) -> dpp :: identity :: errors :: asset_lock_transaction_is_not_found_error :: AssetLockTransactionIsNotFoundError { let ffi_ref = & * ffi ; dpp :: identity :: errors :: asset_lock_transaction_is_not_found_error :: AssetLockTransactionIsNotFoundError { transaction_id : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionFrom < dashcore :: hash_types :: Txid >> :: ffi_from (ffi_ref . transaction_id) } } } impl ferment :: FFIConversionTo < dpp :: identity :: errors :: asset_lock_transaction_is_not_found_error :: AssetLockTransactionIsNotFoundError > for dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError { unsafe fn ffi_to_const (obj : dpp :: identity :: errors :: asset_lock_transaction_is_not_found_error :: AssetLockTransactionIsNotFoundError) -> * const dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError { ferment :: boxed (dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError { transaction_id : < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid as ferment :: FFIConversionTo < dashcore :: hash_types :: Txid >> :: ffi_to (obj . transaction_id) }) } } impl Drop for dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . transaction_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError_ctor < > (transaction_id : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid) -> * mut dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError { ferment :: boxed (dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError { transaction_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError_destroy < > (ffi : * mut dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError_get_transaction_id < > (obj : * const dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . transaction_id } # [no_mangle] pub unsafe extern "C" fn dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError_set_transaction_id < > (obj : * const dpp_identity_errors_asset_lock_transaction_is_not_found_error_AssetLockTransactionIsNotFoundError) -> * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_Txid { (* obj) . transaction_id } } pub mod asset_lock_output_not_found_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`AssetLockOutputNotFoundError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_identity_errors_asset_lock_output_not_found_error_AssetLockOutputNotFoundError { } impl ferment :: FFIConversionFrom < dpp :: identity :: errors :: asset_lock_output_not_found_error :: AssetLockOutputNotFoundError > for dpp_identity_errors_asset_lock_output_not_found_error_AssetLockOutputNotFoundError { unsafe fn ffi_from_const (ffi : * const dpp_identity_errors_asset_lock_output_not_found_error_AssetLockOutputNotFoundError) -> dpp :: identity :: errors :: asset_lock_output_not_found_error :: AssetLockOutputNotFoundError { let ffi_ref = & * ffi ; dpp :: identity :: errors :: asset_lock_output_not_found_error :: AssetLockOutputNotFoundError { } } } impl ferment :: FFIConversionTo < dpp :: identity :: errors :: asset_lock_output_not_found_error :: AssetLockOutputNotFoundError > for dpp_identity_errors_asset_lock_output_not_found_error_AssetLockOutputNotFoundError { unsafe fn ffi_to_const (obj : dpp :: identity :: errors :: asset_lock_output_not_found_error :: AssetLockOutputNotFoundError) -> * const dpp_identity_errors_asset_lock_output_not_found_error_AssetLockOutputNotFoundError { ferment :: boxed (dpp_identity_errors_asset_lock_output_not_found_error_AssetLockOutputNotFoundError { }) } } impl Drop for dpp_identity_errors_asset_lock_output_not_found_error_AssetLockOutputNotFoundError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_errors_asset_lock_output_not_found_error_AssetLockOutputNotFoundError_ctor < > () -> * mut dpp_identity_errors_asset_lock_output_not_found_error_AssetLockOutputNotFoundError { ferment :: boxed (dpp_identity_errors_asset_lock_output_not_found_error_AssetLockOutputNotFoundError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_errors_asset_lock_output_not_found_error_AssetLockOutputNotFoundError_destroy < > (ffi : * mut dpp_identity_errors_asset_lock_output_not_found_error_AssetLockOutputNotFoundError) { ferment :: unbox_any (ffi) ; } } pub mod unknown_asset_lock_proof_type_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`UnknownAssetLockProofTypeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_identity_errors_unknown_asset_lock_proof_type_error_UnknownAssetLockProofTypeError { pub asset_lock_type : * mut u8 } impl ferment :: FFIConversionFrom < dpp :: identity :: errors :: unknown_asset_lock_proof_type_error :: UnknownAssetLockProofTypeError > for dpp_identity_errors_unknown_asset_lock_proof_type_error_UnknownAssetLockProofTypeError { unsafe fn ffi_from_const (ffi : * const dpp_identity_errors_unknown_asset_lock_proof_type_error_UnknownAssetLockProofTypeError) -> dpp :: identity :: errors :: unknown_asset_lock_proof_type_error :: UnknownAssetLockProofTypeError { let ffi_ref = & * ffi ; dpp :: identity :: errors :: unknown_asset_lock_proof_type_error :: UnknownAssetLockProofTypeError { asset_lock_type : ferment :: from_opt_primitive (ffi_ref . asset_lock_type) } } } impl ferment :: FFIConversionTo < dpp :: identity :: errors :: unknown_asset_lock_proof_type_error :: UnknownAssetLockProofTypeError > for dpp_identity_errors_unknown_asset_lock_proof_type_error_UnknownAssetLockProofTypeError { unsafe fn ffi_to_const (obj : dpp :: identity :: errors :: unknown_asset_lock_proof_type_error :: UnknownAssetLockProofTypeError) -> * const dpp_identity_errors_unknown_asset_lock_proof_type_error_UnknownAssetLockProofTypeError { ferment :: boxed (dpp_identity_errors_unknown_asset_lock_proof_type_error_UnknownAssetLockProofTypeError { asset_lock_type : ferment :: to_opt_primitive (obj . asset_lock_type) }) } } impl Drop for dpp_identity_errors_unknown_asset_lock_proof_type_error_UnknownAssetLockProofTypeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: destroy_opt_primitive (ffi_ref . asset_lock_type) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_errors_unknown_asset_lock_proof_type_error_UnknownAssetLockProofTypeError_ctor < > (asset_lock_type : * mut u8) -> * mut dpp_identity_errors_unknown_asset_lock_proof_type_error_UnknownAssetLockProofTypeError { ferment :: boxed (dpp_identity_errors_unknown_asset_lock_proof_type_error_UnknownAssetLockProofTypeError { asset_lock_type }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_errors_unknown_asset_lock_proof_type_error_UnknownAssetLockProofTypeError_destroy < > (ffi : * mut dpp_identity_errors_unknown_asset_lock_proof_type_error_UnknownAssetLockProofTypeError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_identity_errors_unknown_asset_lock_proof_type_error_UnknownAssetLockProofTypeError_get_asset_lock_type < > (obj : * const dpp_identity_errors_unknown_asset_lock_proof_type_error_UnknownAssetLockProofTypeError) -> * mut u8 { (* obj) . asset_lock_type } # [no_mangle] pub unsafe extern "C" fn dpp_identity_errors_unknown_asset_lock_proof_type_error_UnknownAssetLockProofTypeError_set_asset_lock_type < > (obj : * const dpp_identity_errors_unknown_asset_lock_proof_type_error_UnknownAssetLockProofTypeError) -> * mut u8 { (* obj) . asset_lock_type } } } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_identity_v0_IdentityV0 { pub id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub public_keys : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey , pub balance : u64 , pub revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision } impl ferment :: FFIConversionFrom < dpp :: identity :: v0 :: IdentityV0 > for dpp_identity_v0_IdentityV0 { unsafe fn ffi_from_const (ffi : * const dpp_identity_v0_IdentityV0) -> dpp :: identity :: v0 :: IdentityV0 { let ffi_ref = & * ffi ; dpp :: identity :: v0 :: IdentityV0 { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . id) , public_keys : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: identity :: identity_public_key :: KeyID , dpp :: identity :: identity_public_key :: IdentityPublicKey > >> :: ffi_from (ffi_ref . public_keys) , balance : ffi_ref . balance , revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionFrom < dpp :: prelude :: Revision >> :: ffi_from (ffi_ref . revision) } } } impl ferment :: FFIConversionTo < dpp :: identity :: v0 :: IdentityV0 > for dpp_identity_v0_IdentityV0 { unsafe fn ffi_to_const (obj : dpp :: identity :: v0 :: IdentityV0) -> * const dpp_identity_v0_IdentityV0 { ferment :: boxed (dpp_identity_v0_IdentityV0 { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . id) , public_keys : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: identity :: identity_public_key :: KeyID , dpp :: identity :: identity_public_key :: IdentityPublicKey > >> :: ffi_to (obj . public_keys) , balance : obj . balance , revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionTo < dpp :: prelude :: Revision >> :: ffi_to (obj . revision) }) } } impl Drop for dpp_identity_v0_IdentityV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . id) ; ferment :: unbox_any (ffi_ref . public_keys) ; ; ferment :: unbox_any (ffi_ref . revision) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_v0_IdentityV0_ctor < > (id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , public_keys : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey , balance : u64 , revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision) -> * mut dpp_identity_v0_IdentityV0 { ferment :: boxed (dpp_identity_v0_IdentityV0 { id , public_keys , balance , revision }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_v0_IdentityV0_destroy < > (ffi : * mut dpp_identity_v0_IdentityV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_identity_v0_IdentityV0_get_id < > (obj : * const dpp_identity_v0_IdentityV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_identity_v0_IdentityV0_get_public_keys < > (obj : * const dpp_identity_v0_IdentityV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey { (* obj) . public_keys } # [no_mangle] pub unsafe extern "C" fn dpp_identity_v0_IdentityV0_get_balance < > (obj : * const dpp_identity_v0_IdentityV0) -> u64 { (* obj) . balance } # [no_mangle] pub unsafe extern "C" fn dpp_identity_v0_IdentityV0_get_revision < > (obj : * const dpp_identity_v0_IdentityV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . revision } # [no_mangle] pub unsafe extern "C" fn dpp_identity_v0_IdentityV0_set_id < > (obj : * const dpp_identity_v0_IdentityV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_identity_v0_IdentityV0_set_public_keys < > (obj : * const dpp_identity_v0_IdentityV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey { (* obj) . public_keys } # [no_mangle] pub unsafe extern "C" fn dpp_identity_v0_IdentityV0_set_balance < > (obj : * const dpp_identity_v0_IdentityV0) -> u64 { (* obj) . balance } # [no_mangle] pub unsafe extern "C" fn dpp_identity_v0_IdentityV0_set_revision < > (obj : * const dpp_identity_v0_IdentityV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . revision } pub mod conversion { use crate as dash_spv_apple_bindings ; } } pub mod credits_converter { use crate as dash_spv_apple_bindings ; } pub mod identity_public_key { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TimestampMillis`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_identity_identity_public_key_TimestampMillis (u64) ; impl ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: TimestampMillis > for dpp_identity_identity_public_key_TimestampMillis { unsafe fn ffi_from_const (ffi : * const dpp_identity_identity_public_key_TimestampMillis) -> dpp :: identity :: identity_public_key :: TimestampMillis { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: TimestampMillis > for dpp_identity_identity_public_key_TimestampMillis { unsafe fn ffi_to_const (obj : dpp :: identity :: identity_public_key :: TimestampMillis) -> * const dpp_identity_identity_public_key_TimestampMillis { ferment :: boxed (dpp_identity_identity_public_key_TimestampMillis (obj)) } } impl Drop for dpp_identity_identity_public_key_TimestampMillis { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_TimestampMillis_ctor < > (o_0 : u64) -> * mut dpp_identity_identity_public_key_TimestampMillis { ferment :: boxed (dpp_identity_identity_public_key_TimestampMillis (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_TimestampMillis_destroy < > (ffi : * mut dpp_identity_identity_public_key_TimestampMillis) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_TimestampMillis_get_0 < > (obj : * const dpp_identity_identity_public_key_TimestampMillis) -> u64 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_TimestampMillis_set_0 < > (obj : * const dpp_identity_identity_public_key_TimestampMillis) -> u64 { (* obj) . 0 } pub mod accessors { use crate as dash_spv_apple_bindings ; } pub mod key_type { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`KeyType`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_identity_identity_public_key_key_type_KeyType { ECDSA_SECP256K1 = 0 , BLS12_381 = 1 , ECDSA_HASH160 = 2 , BIP13_SCRIPT_HASH = 3 , EDDSA_25519_HASH160 = 4 } impl ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: key_type :: KeyType > for dpp_identity_identity_public_key_key_type_KeyType { unsafe fn ffi_from_const (ffi : * const dpp_identity_identity_public_key_key_type_KeyType) -> dpp :: identity :: identity_public_key :: key_type :: KeyType { let ffi_ref = & * ffi ; match ffi_ref { dpp_identity_identity_public_key_key_type_KeyType :: ECDSA_SECP256K1 => dpp :: identity :: identity_public_key :: key_type :: KeyType :: ECDSA_SECP256K1 , dpp_identity_identity_public_key_key_type_KeyType :: BLS12_381 => dpp :: identity :: identity_public_key :: key_type :: KeyType :: BLS12_381 , dpp_identity_identity_public_key_key_type_KeyType :: ECDSA_HASH160 => dpp :: identity :: identity_public_key :: key_type :: KeyType :: ECDSA_HASH160 , dpp_identity_identity_public_key_key_type_KeyType :: BIP13_SCRIPT_HASH => dpp :: identity :: identity_public_key :: key_type :: KeyType :: BIP13_SCRIPT_HASH , dpp_identity_identity_public_key_key_type_KeyType :: EDDSA_25519_HASH160 => dpp :: identity :: identity_public_key :: key_type :: KeyType :: EDDSA_25519_HASH160 } } } impl ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: key_type :: KeyType > for dpp_identity_identity_public_key_key_type_KeyType { unsafe fn ffi_to_const (obj : dpp :: identity :: identity_public_key :: key_type :: KeyType) -> * const dpp_identity_identity_public_key_key_type_KeyType { ferment :: boxed (match obj { dpp :: identity :: identity_public_key :: key_type :: KeyType :: ECDSA_SECP256K1 => dpp_identity_identity_public_key_key_type_KeyType :: ECDSA_SECP256K1 , dpp :: identity :: identity_public_key :: key_type :: KeyType :: BLS12_381 => dpp_identity_identity_public_key_key_type_KeyType :: BLS12_381 , dpp :: identity :: identity_public_key :: key_type :: KeyType :: ECDSA_HASH160 => dpp_identity_identity_public_key_key_type_KeyType :: ECDSA_HASH160 , dpp :: identity :: identity_public_key :: key_type :: KeyType :: BIP13_SCRIPT_HASH => dpp_identity_identity_public_key_key_type_KeyType :: BIP13_SCRIPT_HASH , dpp :: identity :: identity_public_key :: key_type :: KeyType :: EDDSA_25519_HASH160 => dpp_identity_identity_public_key_key_type_KeyType :: EDDSA_25519_HASH160 , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_identity_identity_public_key_key_type_KeyType { fn drop (& mut self) { unsafe { match self { dpp_identity_identity_public_key_key_type_KeyType :: ECDSA_SECP256K1 => { } , dpp_identity_identity_public_key_key_type_KeyType :: BLS12_381 => { } , dpp_identity_identity_public_key_key_type_KeyType :: ECDSA_HASH160 => { } , dpp_identity_identity_public_key_key_type_KeyType :: BIP13_SCRIPT_HASH => { } , dpp_identity_identity_public_key_key_type_KeyType :: EDDSA_25519_HASH160 => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_key_type_KeyType_ECDSA_SECP256K1_ctor () -> * mut dpp_identity_identity_public_key_key_type_KeyType { ferment :: boxed (dpp_identity_identity_public_key_key_type_KeyType :: ECDSA_SECP256K1 { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_key_type_KeyType_BLS12_381_ctor () -> * mut dpp_identity_identity_public_key_key_type_KeyType { ferment :: boxed (dpp_identity_identity_public_key_key_type_KeyType :: BLS12_381 { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_key_type_KeyType_ECDSA_HASH160_ctor () -> * mut dpp_identity_identity_public_key_key_type_KeyType { ferment :: boxed (dpp_identity_identity_public_key_key_type_KeyType :: ECDSA_HASH160 { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_key_type_KeyType_BIP13_SCRIPT_HASH_ctor () -> * mut dpp_identity_identity_public_key_key_type_KeyType { ferment :: boxed (dpp_identity_identity_public_key_key_type_KeyType :: BIP13_SCRIPT_HASH { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_key_type_KeyType_EDDSA_25519_HASH160_ctor () -> * mut dpp_identity_identity_public_key_key_type_KeyType { ferment :: boxed (dpp_identity_identity_public_key_key_type_KeyType :: EDDSA_25519_HASH160 { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_key_type_KeyType_destroy < > (ffi : * mut dpp_identity_identity_public_key_key_type_KeyType) { ferment :: unbox_any (ffi) ; } } # [doc = "FFI-representation of the [`KeyID`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_identity_identity_public_key_KeyID (u32) ; impl ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID > for dpp_identity_identity_public_key_KeyID { unsafe fn ffi_from_const (ffi : * const dpp_identity_identity_public_key_KeyID) -> dpp :: identity :: identity_public_key :: KeyID { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID > for dpp_identity_identity_public_key_KeyID { unsafe fn ffi_to_const (obj : dpp :: identity :: identity_public_key :: KeyID) -> * const dpp_identity_identity_public_key_KeyID { ferment :: boxed (dpp_identity_identity_public_key_KeyID (obj)) } } impl Drop for dpp_identity_identity_public_key_KeyID { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_KeyID_ctor < > (o_0 : u32) -> * mut dpp_identity_identity_public_key_KeyID { ferment :: boxed (dpp_identity_identity_public_key_KeyID (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_KeyID_destroy < > (ffi : * mut dpp_identity_identity_public_key_KeyID) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_KeyID_get_0 < > (obj : * const dpp_identity_identity_public_key_KeyID) -> u32 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_KeyID_set_0 < > (obj : * const dpp_identity_identity_public_key_KeyID) -> u32 { (* obj) . 0 } pub mod conversion { use crate as dash_spv_apple_bindings ; # [cfg (feature = "platform-value")] pub mod platform_value { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "json-object")] pub mod json { use crate as dash_spv_apple_bindings ; } } pub mod methods { use crate as dash_spv_apple_bindings ; pub mod hash { use crate as dash_spv_apple_bindings ; } } pub mod security_level { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`SecurityLevel`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_identity_identity_public_key_security_level_SecurityLevel { MASTER = 0 , CRITICAL = 1 , HIGH = 2 , MEDIUM = 3 } impl ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel > for dpp_identity_identity_public_key_security_level_SecurityLevel { unsafe fn ffi_from_const (ffi : * const dpp_identity_identity_public_key_security_level_SecurityLevel) -> dpp :: identity :: identity_public_key :: security_level :: SecurityLevel { let ffi_ref = & * ffi ; match ffi_ref { dpp_identity_identity_public_key_security_level_SecurityLevel :: MASTER => dpp :: identity :: identity_public_key :: security_level :: SecurityLevel :: MASTER , dpp_identity_identity_public_key_security_level_SecurityLevel :: CRITICAL => dpp :: identity :: identity_public_key :: security_level :: SecurityLevel :: CRITICAL , dpp_identity_identity_public_key_security_level_SecurityLevel :: HIGH => dpp :: identity :: identity_public_key :: security_level :: SecurityLevel :: HIGH , dpp_identity_identity_public_key_security_level_SecurityLevel :: MEDIUM => dpp :: identity :: identity_public_key :: security_level :: SecurityLevel :: MEDIUM } } } impl ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel > for dpp_identity_identity_public_key_security_level_SecurityLevel { unsafe fn ffi_to_const (obj : dpp :: identity :: identity_public_key :: security_level :: SecurityLevel) -> * const dpp_identity_identity_public_key_security_level_SecurityLevel { ferment :: boxed (match obj { dpp :: identity :: identity_public_key :: security_level :: SecurityLevel :: MASTER => dpp_identity_identity_public_key_security_level_SecurityLevel :: MASTER , dpp :: identity :: identity_public_key :: security_level :: SecurityLevel :: CRITICAL => dpp_identity_identity_public_key_security_level_SecurityLevel :: CRITICAL , dpp :: identity :: identity_public_key :: security_level :: SecurityLevel :: HIGH => dpp_identity_identity_public_key_security_level_SecurityLevel :: HIGH , dpp :: identity :: identity_public_key :: security_level :: SecurityLevel :: MEDIUM => dpp_identity_identity_public_key_security_level_SecurityLevel :: MEDIUM , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_identity_identity_public_key_security_level_SecurityLevel { fn drop (& mut self) { unsafe { match self { dpp_identity_identity_public_key_security_level_SecurityLevel :: MASTER => { } , dpp_identity_identity_public_key_security_level_SecurityLevel :: CRITICAL => { } , dpp_identity_identity_public_key_security_level_SecurityLevel :: HIGH => { } , dpp_identity_identity_public_key_security_level_SecurityLevel :: MEDIUM => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_security_level_SecurityLevel_MASTER_ctor () -> * mut dpp_identity_identity_public_key_security_level_SecurityLevel { ferment :: boxed (dpp_identity_identity_public_key_security_level_SecurityLevel :: MASTER { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_security_level_SecurityLevel_CRITICAL_ctor () -> * mut dpp_identity_identity_public_key_security_level_SecurityLevel { ferment :: boxed (dpp_identity_identity_public_key_security_level_SecurityLevel :: CRITICAL { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_security_level_SecurityLevel_HIGH_ctor () -> * mut dpp_identity_identity_public_key_security_level_SecurityLevel { ferment :: boxed (dpp_identity_identity_public_key_security_level_SecurityLevel :: HIGH { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_security_level_SecurityLevel_MEDIUM_ctor () -> * mut dpp_identity_identity_public_key_security_level_SecurityLevel { ferment :: boxed (dpp_identity_identity_public_key_security_level_SecurityLevel :: MEDIUM { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_security_level_SecurityLevel_destroy < > (ffi : * mut dpp_identity_identity_public_key_security_level_SecurityLevel) { ferment :: unbox_any (ffi) ; } } pub mod contract_bounds { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ContractBounds`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_identity_identity_public_key_contract_bounds_ContractBounds { SingleContract { id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } , SingleContractDocumentType { id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , document_type_name : * mut std :: os :: raw :: c_char } } impl ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: contract_bounds :: ContractBounds > for dpp_identity_identity_public_key_contract_bounds_ContractBounds { unsafe fn ffi_from_const (ffi : * const dpp_identity_identity_public_key_contract_bounds_ContractBounds) -> dpp :: identity :: identity_public_key :: contract_bounds :: ContractBounds { let ffi_ref = & * ffi ; match ffi_ref { dpp_identity_identity_public_key_contract_bounds_ContractBounds :: SingleContract { id } => dpp :: identity :: identity_public_key :: contract_bounds :: ContractBounds :: SingleContract { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (* id) } , dpp_identity_identity_public_key_contract_bounds_ContractBounds :: SingleContractDocumentType { id , document_type_name } => dpp :: identity :: identity_public_key :: contract_bounds :: ContractBounds :: SingleContractDocumentType { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (* id) , document_type_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* document_type_name) } } } } impl ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: contract_bounds :: ContractBounds > for dpp_identity_identity_public_key_contract_bounds_ContractBounds { unsafe fn ffi_to_const (obj : dpp :: identity :: identity_public_key :: contract_bounds :: ContractBounds) -> * const dpp_identity_identity_public_key_contract_bounds_ContractBounds { ferment :: boxed (match obj { dpp :: identity :: identity_public_key :: contract_bounds :: ContractBounds :: SingleContract { id } => dpp_identity_identity_public_key_contract_bounds_ContractBounds :: SingleContract { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (id) } , dpp :: identity :: identity_public_key :: contract_bounds :: ContractBounds :: SingleContractDocumentType { id , document_type_name } => dpp_identity_identity_public_key_contract_bounds_ContractBounds :: SingleContractDocumentType { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (id) , document_type_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (document_type_name) } , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_identity_identity_public_key_contract_bounds_ContractBounds { fn drop (& mut self) { unsafe { match self { dpp_identity_identity_public_key_contract_bounds_ContractBounds :: SingleContract { id } => { ferment :: unbox_any (* id) ; } , dpp_identity_identity_public_key_contract_bounds_ContractBounds :: SingleContractDocumentType { id , document_type_name } => { ferment :: unbox_any (* id) ; ; ferment :: unbox_string (* document_type_name) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_contract_bounds_ContractBounds_SingleContract_ctor (id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_identity_identity_public_key_contract_bounds_ContractBounds { ferment :: boxed (dpp_identity_identity_public_key_contract_bounds_ContractBounds :: SingleContract { id }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_contract_bounds_ContractBounds_SingleContractDocumentType_ctor (id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , document_type_name : * mut std :: os :: raw :: c_char) -> * mut dpp_identity_identity_public_key_contract_bounds_ContractBounds { ferment :: boxed (dpp_identity_identity_public_key_contract_bounds_ContractBounds :: SingleContractDocumentType { id , document_type_name }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_contract_bounds_ContractBounds_destroy < > (ffi : * mut dpp_identity_identity_public_key_contract_bounds_ContractBounds) { ferment :: unbox_any (ffi) ; } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`IdentityPublicKey`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_identity_identity_public_key_IdentityPublicKey { V0 (* mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: v0 :: dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) } impl ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: IdentityPublicKey > for dpp_identity_identity_public_key_IdentityPublicKey { unsafe fn ffi_from_const (ffi : * const dpp_identity_identity_public_key_IdentityPublicKey) -> dpp :: identity :: identity_public_key :: IdentityPublicKey { let ffi_ref = & * ffi ; match ffi_ref { dpp_identity_identity_public_key_IdentityPublicKey :: V0 (o_0) => dpp :: identity :: identity_public_key :: IdentityPublicKey :: V0 (< crate :: fermented :: types :: dpp :: identity :: identity_public_key :: v0 :: dpp_identity_identity_public_key_v0_IdentityPublicKeyV0 as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: v0 :: IdentityPublicKeyV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: IdentityPublicKey > for dpp_identity_identity_public_key_IdentityPublicKey { unsafe fn ffi_to_const (obj : dpp :: identity :: identity_public_key :: IdentityPublicKey) -> * const dpp_identity_identity_public_key_IdentityPublicKey { ferment :: boxed (match obj { dpp :: identity :: identity_public_key :: IdentityPublicKey :: V0 (o_0) => dpp_identity_identity_public_key_IdentityPublicKey :: V0 (< crate :: fermented :: types :: dpp :: identity :: identity_public_key :: v0 :: dpp_identity_identity_public_key_v0_IdentityPublicKeyV0 as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: v0 :: IdentityPublicKeyV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_identity_identity_public_key_IdentityPublicKey { fn drop (& mut self) { unsafe { match self { dpp_identity_identity_public_key_IdentityPublicKey :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_IdentityPublicKey_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: v0 :: dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) -> * mut dpp_identity_identity_public_key_IdentityPublicKey { ferment :: boxed (dpp_identity_identity_public_key_IdentityPublicKey :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_IdentityPublicKey_destroy < > (ffi : * mut dpp_identity_identity_public_key_IdentityPublicKey) { ferment :: unbox_any (ffi) ; } pub mod purpose { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`Purpose`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_identity_identity_public_key_purpose_Purpose { AUTHENTICATION = 0 , ENCRYPTION = 1 , DECRYPTION = 2 , TRANSFER = 3 , SYSTEM = 4 , VOTING = 5 , OWNER = 6 } impl ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: purpose :: Purpose > for dpp_identity_identity_public_key_purpose_Purpose { unsafe fn ffi_from_const (ffi : * const dpp_identity_identity_public_key_purpose_Purpose) -> dpp :: identity :: identity_public_key :: purpose :: Purpose { let ffi_ref = & * ffi ; match ffi_ref { dpp_identity_identity_public_key_purpose_Purpose :: AUTHENTICATION => dpp :: identity :: identity_public_key :: purpose :: Purpose :: AUTHENTICATION , dpp_identity_identity_public_key_purpose_Purpose :: ENCRYPTION => dpp :: identity :: identity_public_key :: purpose :: Purpose :: ENCRYPTION , dpp_identity_identity_public_key_purpose_Purpose :: DECRYPTION => dpp :: identity :: identity_public_key :: purpose :: Purpose :: DECRYPTION , dpp_identity_identity_public_key_purpose_Purpose :: TRANSFER => dpp :: identity :: identity_public_key :: purpose :: Purpose :: TRANSFER , dpp_identity_identity_public_key_purpose_Purpose :: SYSTEM => dpp :: identity :: identity_public_key :: purpose :: Purpose :: SYSTEM , dpp_identity_identity_public_key_purpose_Purpose :: VOTING => dpp :: identity :: identity_public_key :: purpose :: Purpose :: VOTING , dpp_identity_identity_public_key_purpose_Purpose :: OWNER => dpp :: identity :: identity_public_key :: purpose :: Purpose :: OWNER } } } impl ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: purpose :: Purpose > for dpp_identity_identity_public_key_purpose_Purpose { unsafe fn ffi_to_const (obj : dpp :: identity :: identity_public_key :: purpose :: Purpose) -> * const dpp_identity_identity_public_key_purpose_Purpose { ferment :: boxed (match obj { dpp :: identity :: identity_public_key :: purpose :: Purpose :: AUTHENTICATION => dpp_identity_identity_public_key_purpose_Purpose :: AUTHENTICATION , dpp :: identity :: identity_public_key :: purpose :: Purpose :: ENCRYPTION => dpp_identity_identity_public_key_purpose_Purpose :: ENCRYPTION , dpp :: identity :: identity_public_key :: purpose :: Purpose :: DECRYPTION => dpp_identity_identity_public_key_purpose_Purpose :: DECRYPTION , dpp :: identity :: identity_public_key :: purpose :: Purpose :: TRANSFER => dpp_identity_identity_public_key_purpose_Purpose :: TRANSFER , dpp :: identity :: identity_public_key :: purpose :: Purpose :: SYSTEM => dpp_identity_identity_public_key_purpose_Purpose :: SYSTEM , dpp :: identity :: identity_public_key :: purpose :: Purpose :: VOTING => dpp_identity_identity_public_key_purpose_Purpose :: VOTING , dpp :: identity :: identity_public_key :: purpose :: Purpose :: OWNER => dpp_identity_identity_public_key_purpose_Purpose :: OWNER , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_identity_identity_public_key_purpose_Purpose { fn drop (& mut self) { unsafe { match self { dpp_identity_identity_public_key_purpose_Purpose :: AUTHENTICATION => { } , dpp_identity_identity_public_key_purpose_Purpose :: ENCRYPTION => { } , dpp_identity_identity_public_key_purpose_Purpose :: DECRYPTION => { } , dpp_identity_identity_public_key_purpose_Purpose :: TRANSFER => { } , dpp_identity_identity_public_key_purpose_Purpose :: SYSTEM => { } , dpp_identity_identity_public_key_purpose_Purpose :: VOTING => { } , dpp_identity_identity_public_key_purpose_Purpose :: OWNER => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_purpose_Purpose_AUTHENTICATION_ctor () -> * mut dpp_identity_identity_public_key_purpose_Purpose { ferment :: boxed (dpp_identity_identity_public_key_purpose_Purpose :: AUTHENTICATION { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_purpose_Purpose_ENCRYPTION_ctor () -> * mut dpp_identity_identity_public_key_purpose_Purpose { ferment :: boxed (dpp_identity_identity_public_key_purpose_Purpose :: ENCRYPTION { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_purpose_Purpose_DECRYPTION_ctor () -> * mut dpp_identity_identity_public_key_purpose_Purpose { ferment :: boxed (dpp_identity_identity_public_key_purpose_Purpose :: DECRYPTION { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_purpose_Purpose_TRANSFER_ctor () -> * mut dpp_identity_identity_public_key_purpose_Purpose { ferment :: boxed (dpp_identity_identity_public_key_purpose_Purpose :: TRANSFER { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_purpose_Purpose_SYSTEM_ctor () -> * mut dpp_identity_identity_public_key_purpose_Purpose { ferment :: boxed (dpp_identity_identity_public_key_purpose_Purpose :: SYSTEM { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_purpose_Purpose_VOTING_ctor () -> * mut dpp_identity_identity_public_key_purpose_Purpose { ferment :: boxed (dpp_identity_identity_public_key_purpose_Purpose :: VOTING { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_purpose_Purpose_OWNER_ctor () -> * mut dpp_identity_identity_public_key_purpose_Purpose { ferment :: boxed (dpp_identity_identity_public_key_purpose_Purpose :: OWNER { }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_purpose_Purpose_destroy < > (ffi : * mut dpp_identity_identity_public_key_purpose_Purpose) { ferment :: unbox_any (ffi) ; } } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityPublicKeyV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_identity_identity_public_key_v0_IdentityPublicKeyV0 { pub id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , pub purpose : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose , pub security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel , pub contract_bounds : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: contract_bounds :: dpp_identity_identity_public_key_contract_bounds_ContractBounds , pub key_type : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType , pub read_only : bool , pub data : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData , pub disabled_at : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis } impl ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: v0 :: IdentityPublicKeyV0 > for dpp_identity_identity_public_key_v0_IdentityPublicKeyV0 { unsafe fn ffi_from_const (ffi : * const dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) -> dpp :: identity :: identity_public_key :: v0 :: IdentityPublicKeyV0 { let ffi_ref = & * ffi ; dpp :: identity :: identity_public_key :: v0 :: IdentityPublicKeyV0 { id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . id) , purpose : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: purpose :: Purpose >> :: ffi_from (ffi_ref . purpose) , security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_from (ffi_ref . security_level) , contract_bounds : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: contract_bounds :: dpp_identity_identity_public_key_contract_bounds_ContractBounds as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: contract_bounds :: ContractBounds >> :: ffi_from_opt (ffi_ref . contract_bounds) , key_type : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: key_type :: KeyType >> :: ffi_from (ffi_ref . key_type) , read_only : ffi_ref . read_only , data : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionFrom < platform_value :: types :: binary_data :: BinaryData >> :: ffi_from (ffi_ref . data) , disabled_at : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: TimestampMillis >> :: ffi_from_opt (ffi_ref . disabled_at) } } } impl ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: v0 :: IdentityPublicKeyV0 > for dpp_identity_identity_public_key_v0_IdentityPublicKeyV0 { unsafe fn ffi_to_const (obj : dpp :: identity :: identity_public_key :: v0 :: IdentityPublicKeyV0) -> * const dpp_identity_identity_public_key_v0_IdentityPublicKeyV0 { ferment :: boxed (dpp_identity_identity_public_key_v0_IdentityPublicKeyV0 { id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . id) , purpose : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: purpose :: Purpose >> :: ffi_to (obj . purpose) , security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_to (obj . security_level) , contract_bounds : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: contract_bounds :: dpp_identity_identity_public_key_contract_bounds_ContractBounds as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: contract_bounds :: ContractBounds >> :: ffi_to_opt (obj . contract_bounds) , key_type : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: key_type :: KeyType >> :: ffi_to (obj . key_type) , read_only : obj . read_only , data : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionTo < platform_value :: types :: binary_data :: BinaryData >> :: ffi_to (obj . data) , disabled_at : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: TimestampMillis >> :: ffi_to_opt (obj . disabled_at) }) } } impl Drop for dpp_identity_identity_public_key_v0_IdentityPublicKeyV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . id) ; ferment :: unbox_any (ffi_ref . purpose) ; ferment :: unbox_any (ffi_ref . security_level) ; ferment :: unbox_any_opt (ffi_ref . contract_bounds) ; ferment :: unbox_any (ffi_ref . key_type) ; ; ferment :: unbox_any (ffi_ref . data) ; ferment :: unbox_any_opt (ffi_ref . disabled_at) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_v0_IdentityPublicKeyV0_ctor < > (id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , purpose : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose , security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel , contract_bounds : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: contract_bounds :: dpp_identity_identity_public_key_contract_bounds_ContractBounds , key_type : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType , read_only : bool , data : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData , disabled_at : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis) -> * mut dpp_identity_identity_public_key_v0_IdentityPublicKeyV0 { ferment :: boxed (dpp_identity_identity_public_key_v0_IdentityPublicKeyV0 { id , purpose , security_level , contract_bounds , key_type , read_only , data , disabled_at }) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_v0_IdentityPublicKeyV0_destroy < > (ffi : * mut dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_v0_IdentityPublicKeyV0_get_id < > (obj : * const dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_v0_IdentityPublicKeyV0_get_purpose < > (obj : * const dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose { (* obj) . purpose } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_v0_IdentityPublicKeyV0_get_security_level < > (obj : * const dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . security_level } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_v0_IdentityPublicKeyV0_get_contract_bounds < > (obj : * const dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: contract_bounds :: dpp_identity_identity_public_key_contract_bounds_ContractBounds { (* obj) . contract_bounds } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_v0_IdentityPublicKeyV0_get_key_type < > (obj : * const dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType { (* obj) . key_type } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_v0_IdentityPublicKeyV0_get_read_only < > (obj : * const dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) -> bool { (* obj) . read_only } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_v0_IdentityPublicKeyV0_get_data < > (obj : * const dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . data } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_v0_IdentityPublicKeyV0_get_disabled_at < > (obj : * const dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis { (* obj) . disabled_at } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_v0_IdentityPublicKeyV0_set_id < > (obj : * const dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_v0_IdentityPublicKeyV0_set_purpose < > (obj : * const dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose { (* obj) . purpose } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_v0_IdentityPublicKeyV0_set_security_level < > (obj : * const dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . security_level } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_v0_IdentityPublicKeyV0_set_contract_bounds < > (obj : * const dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: contract_bounds :: dpp_identity_identity_public_key_contract_bounds_ContractBounds { (* obj) . contract_bounds } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_v0_IdentityPublicKeyV0_set_key_type < > (obj : * const dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType { (* obj) . key_type } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_v0_IdentityPublicKeyV0_set_read_only < > (obj : * const dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) -> bool { (* obj) . read_only } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_v0_IdentityPublicKeyV0_set_data < > (obj : * const dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . data } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_v0_IdentityPublicKeyV0_set_disabled_at < > (obj : * const dpp_identity_identity_public_key_v0_IdentityPublicKeyV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis { (* obj) . disabled_at } pub mod methods { use crate as dash_spv_apple_bindings ; } pub mod conversion { use crate as dash_spv_apple_bindings ; } } # [doc = "FFI-representation of the [`KeyCount`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_identity_identity_public_key_KeyCount (* mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID) ; impl ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyCount > for dpp_identity_identity_public_key_KeyCount { unsafe fn ffi_from_const (ffi : * const dpp_identity_identity_public_key_KeyCount) -> dpp :: identity :: identity_public_key :: KeyCount { let ffi_ref = & * ffi ; < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . 0) } } impl ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyCount > for dpp_identity_identity_public_key_KeyCount { unsafe fn ffi_to_const (obj : dpp :: identity :: identity_public_key :: KeyCount) -> * const dpp_identity_identity_public_key_KeyCount { ferment :: boxed (dpp_identity_identity_public_key_KeyCount (< crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj))) } } impl Drop for dpp_identity_identity_public_key_KeyCount { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_KeyCount_ctor < > (o_0 : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID) -> * mut dpp_identity_identity_public_key_KeyCount { ferment :: boxed (dpp_identity_identity_public_key_KeyCount (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_KeyCount_destroy < > (ffi : * mut dpp_identity_identity_public_key_KeyCount) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_KeyCount_get_0 < > (obj : * const dpp_identity_identity_public_key_KeyCount) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_identity_identity_public_key_KeyCount_set_0 < > (obj : * const dpp_identity_identity_public_key_KeyCount) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . 0 } } } pub mod asset_lock { use crate as dash_spv_apple_bindings ; pub mod reduced_asset_lock_value { use crate as dash_spv_apple_bindings ; } } pub mod metadata { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`Metadata`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_metadata_Metadata { pub block_height : u64 , pub core_chain_locked_height : u64 , pub time_ms : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis , pub protocol_version : * mut crate :: fermented :: types :: dpp :: util :: deserializer :: dpp_util_deserializer_ProtocolVersion } impl ferment :: FFIConversionFrom < dpp :: metadata :: Metadata > for dpp_metadata_Metadata { unsafe fn ffi_from_const (ffi : * const dpp_metadata_Metadata) -> dpp :: metadata :: Metadata { let ffi_ref = & * ffi ; dpp :: metadata :: Metadata { block_height : ffi_ref . block_height , core_chain_locked_height : ffi_ref . core_chain_locked_height , time_ms : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis as ferment :: FFIConversionFrom < dpp :: prelude :: TimestampMillis >> :: ffi_from (ffi_ref . time_ms) , protocol_version : < crate :: fermented :: types :: dpp :: util :: deserializer :: dpp_util_deserializer_ProtocolVersion as ferment :: FFIConversionFrom < dpp :: util :: deserializer :: ProtocolVersion >> :: ffi_from (ffi_ref . protocol_version) } } } impl ferment :: FFIConversionTo < dpp :: metadata :: Metadata > for dpp_metadata_Metadata { unsafe fn ffi_to_const (obj : dpp :: metadata :: Metadata) -> * const dpp_metadata_Metadata { ferment :: boxed (dpp_metadata_Metadata { block_height : obj . block_height , core_chain_locked_height : obj . core_chain_locked_height , time_ms : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis as ferment :: FFIConversionTo < dpp :: prelude :: TimestampMillis >> :: ffi_to (obj . time_ms) , protocol_version : < crate :: fermented :: types :: dpp :: util :: deserializer :: dpp_util_deserializer_ProtocolVersion as ferment :: FFIConversionTo < dpp :: util :: deserializer :: ProtocolVersion >> :: ffi_to (obj . protocol_version) }) } } impl Drop for dpp_metadata_Metadata { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ferment :: unbox_any (ffi_ref . time_ms) ; ferment :: unbox_any (ffi_ref . protocol_version) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_metadata_Metadata_ctor < > (block_height : u64 , core_chain_locked_height : u64 , time_ms : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis , protocol_version : * mut crate :: fermented :: types :: dpp :: util :: deserializer :: dpp_util_deserializer_ProtocolVersion) -> * mut dpp_metadata_Metadata { ferment :: boxed (dpp_metadata_Metadata { block_height , core_chain_locked_height , time_ms , protocol_version }) } # [no_mangle] pub unsafe extern "C" fn dpp_metadata_Metadata_destroy < > (ffi : * mut dpp_metadata_Metadata) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_metadata_Metadata_get_block_height < > (obj : * const dpp_metadata_Metadata) -> u64 { (* obj) . block_height } # [no_mangle] pub unsafe extern "C" fn dpp_metadata_Metadata_get_core_chain_locked_height < > (obj : * const dpp_metadata_Metadata) -> u64 { (* obj) . core_chain_locked_height } # [no_mangle] pub unsafe extern "C" fn dpp_metadata_Metadata_get_time_ms < > (obj : * const dpp_metadata_Metadata) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis { (* obj) . time_ms } # [no_mangle] pub unsafe extern "C" fn dpp_metadata_Metadata_get_protocol_version < > (obj : * const dpp_metadata_Metadata) -> * mut crate :: fermented :: types :: dpp :: util :: deserializer :: dpp_util_deserializer_ProtocolVersion { (* obj) . protocol_version } # [no_mangle] pub unsafe extern "C" fn dpp_metadata_Metadata_set_block_height < > (obj : * const dpp_metadata_Metadata) -> u64 { (* obj) . block_height } # [no_mangle] pub unsafe extern "C" fn dpp_metadata_Metadata_set_core_chain_locked_height < > (obj : * const dpp_metadata_Metadata) -> u64 { (* obj) . core_chain_locked_height } # [no_mangle] pub unsafe extern "C" fn dpp_metadata_Metadata_set_time_ms < > (obj : * const dpp_metadata_Metadata) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis { (* obj) . time_ms } # [no_mangle] pub unsafe extern "C" fn dpp_metadata_Metadata_set_protocol_version < > (obj : * const dpp_metadata_Metadata) -> * mut crate :: fermented :: types :: dpp :: util :: deserializer :: dpp_util_deserializer_ProtocolVersion { (* obj) . protocol_version } } pub mod tokens { use crate as dash_spv_apple_bindings ; pub mod emergency_action { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`TokenEmergencyAction`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_tokens_emergency_action_TokenEmergencyAction { Pause = 0 , Resume = 1 } impl ferment :: FFIConversionFrom < dpp :: tokens :: emergency_action :: TokenEmergencyAction > for dpp_tokens_emergency_action_TokenEmergencyAction { unsafe fn ffi_from_const (ffi : * const dpp_tokens_emergency_action_TokenEmergencyAction) -> dpp :: tokens :: emergency_action :: TokenEmergencyAction { let ffi_ref = & * ffi ; match ffi_ref { dpp_tokens_emergency_action_TokenEmergencyAction :: Pause => dpp :: tokens :: emergency_action :: TokenEmergencyAction :: Pause , dpp_tokens_emergency_action_TokenEmergencyAction :: Resume => dpp :: tokens :: emergency_action :: TokenEmergencyAction :: Resume } } } impl ferment :: FFIConversionTo < dpp :: tokens :: emergency_action :: TokenEmergencyAction > for dpp_tokens_emergency_action_TokenEmergencyAction { unsafe fn ffi_to_const (obj : dpp :: tokens :: emergency_action :: TokenEmergencyAction) -> * const dpp_tokens_emergency_action_TokenEmergencyAction { ferment :: boxed (match obj { dpp :: tokens :: emergency_action :: TokenEmergencyAction :: Pause => dpp_tokens_emergency_action_TokenEmergencyAction :: Pause , dpp :: tokens :: emergency_action :: TokenEmergencyAction :: Resume => dpp_tokens_emergency_action_TokenEmergencyAction :: Resume , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_tokens_emergency_action_TokenEmergencyAction { fn drop (& mut self) { unsafe { match self { dpp_tokens_emergency_action_TokenEmergencyAction :: Pause => { } , dpp_tokens_emergency_action_TokenEmergencyAction :: Resume => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_emergency_action_TokenEmergencyAction_Pause_ctor () -> * mut dpp_tokens_emergency_action_TokenEmergencyAction { ferment :: boxed (dpp_tokens_emergency_action_TokenEmergencyAction :: Pause { }) } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_emergency_action_TokenEmergencyAction_Resume_ctor () -> * mut dpp_tokens_emergency_action_TokenEmergencyAction { ferment :: boxed (dpp_tokens_emergency_action_TokenEmergencyAction :: Resume { }) } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_emergency_action_TokenEmergencyAction_destroy < > (ffi : * mut dpp_tokens_emergency_action_TokenEmergencyAction) { ferment :: unbox_any (ffi) ; } } # [doc = "FFI-representation of the [`SharedEncryptedNote`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_tokens_SharedEncryptedNote (* mut crate :: fermented :: generics :: Tuple_dpp_prelude_SenderKeyIndex_dpp_prelude_RecipientKeyIndex_Vec_u8) ; impl ferment :: FFIConversionFrom < dpp :: tokens :: SharedEncryptedNote > for dpp_tokens_SharedEncryptedNote { unsafe fn ffi_from_const (ffi : * const dpp_tokens_SharedEncryptedNote) -> dpp :: tokens :: SharedEncryptedNote { let ffi_ref = & * ffi ; < crate :: fermented :: generics :: Tuple_dpp_prelude_SenderKeyIndex_dpp_prelude_RecipientKeyIndex_Vec_u8 as ferment :: FFIConversionFrom < (dpp :: prelude :: SenderKeyIndex , dpp :: prelude :: RecipientKeyIndex , Vec < u8 >) >> :: ffi_from (ffi_ref . 0) } } impl ferment :: FFIConversionTo < dpp :: tokens :: SharedEncryptedNote > for dpp_tokens_SharedEncryptedNote { unsafe fn ffi_to_const (obj : dpp :: tokens :: SharedEncryptedNote) -> * const dpp_tokens_SharedEncryptedNote { ferment :: boxed (dpp_tokens_SharedEncryptedNote (< crate :: fermented :: generics :: Tuple_dpp_prelude_SenderKeyIndex_dpp_prelude_RecipientKeyIndex_Vec_u8 as ferment :: FFIConversionTo < (dpp :: prelude :: SenderKeyIndex , dpp :: prelude :: RecipientKeyIndex , Vec < u8 >) >> :: ffi_to (obj))) } } impl Drop for dpp_tokens_SharedEncryptedNote { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_SharedEncryptedNote_ctor < > (o_0 : * mut crate :: fermented :: generics :: Tuple_dpp_prelude_SenderKeyIndex_dpp_prelude_RecipientKeyIndex_Vec_u8) -> * mut dpp_tokens_SharedEncryptedNote { ferment :: boxed (dpp_tokens_SharedEncryptedNote (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_SharedEncryptedNote_destroy < > (ffi : * mut dpp_tokens_SharedEncryptedNote) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_SharedEncryptedNote_get_0 < > (obj : * const dpp_tokens_SharedEncryptedNote) -> * mut crate :: fermented :: generics :: Tuple_dpp_prelude_SenderKeyIndex_dpp_prelude_RecipientKeyIndex_Vec_u8 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_SharedEncryptedNote_set_0 < > (obj : * const dpp_tokens_SharedEncryptedNote) -> * mut crate :: fermented :: generics :: Tuple_dpp_prelude_SenderKeyIndex_dpp_prelude_RecipientKeyIndex_Vec_u8 { (* obj) . 0 } pub mod errors { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`TokenError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_tokens_errors_TokenError { TokenNotFoundAtPositionError , TokenNotFoundOnContractVersion , TokenNoMintingRecipient } impl ferment :: FFIConversionFrom < dpp :: tokens :: errors :: TokenError > for dpp_tokens_errors_TokenError { unsafe fn ffi_from_const (ffi : * const dpp_tokens_errors_TokenError) -> dpp :: tokens :: errors :: TokenError { let ffi_ref = & * ffi ; match ffi_ref { dpp_tokens_errors_TokenError :: TokenNotFoundAtPositionError => dpp :: tokens :: errors :: TokenError :: TokenNotFoundAtPositionError , dpp_tokens_errors_TokenError :: TokenNotFoundOnContractVersion => dpp :: tokens :: errors :: TokenError :: TokenNotFoundOnContractVersion , dpp_tokens_errors_TokenError :: TokenNoMintingRecipient => dpp :: tokens :: errors :: TokenError :: TokenNoMintingRecipient } } } impl ferment :: FFIConversionTo < dpp :: tokens :: errors :: TokenError > for dpp_tokens_errors_TokenError { unsafe fn ffi_to_const (obj : dpp :: tokens :: errors :: TokenError) -> * const dpp_tokens_errors_TokenError { ferment :: boxed (match obj { dpp :: tokens :: errors :: TokenError :: TokenNotFoundAtPositionError => dpp_tokens_errors_TokenError :: TokenNotFoundAtPositionError , dpp :: tokens :: errors :: TokenError :: TokenNotFoundOnContractVersion => dpp_tokens_errors_TokenError :: TokenNotFoundOnContractVersion , dpp :: tokens :: errors :: TokenError :: TokenNoMintingRecipient => dpp_tokens_errors_TokenError :: TokenNoMintingRecipient , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_tokens_errors_TokenError { fn drop (& mut self) { unsafe { match self { dpp_tokens_errors_TokenError :: TokenNotFoundAtPositionError => { } , dpp_tokens_errors_TokenError :: TokenNotFoundOnContractVersion => { } , dpp_tokens_errors_TokenError :: TokenNoMintingRecipient => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_errors_TokenError_TokenNotFoundAtPositionError_ctor () -> * mut dpp_tokens_errors_TokenError { ferment :: boxed (dpp_tokens_errors_TokenError :: TokenNotFoundAtPositionError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_errors_TokenError_TokenNotFoundOnContractVersion_ctor () -> * mut dpp_tokens_errors_TokenError { ferment :: boxed (dpp_tokens_errors_TokenError :: TokenNotFoundOnContractVersion { }) } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_errors_TokenError_TokenNoMintingRecipient_ctor () -> * mut dpp_tokens_errors_TokenError { ferment :: boxed (dpp_tokens_errors_TokenError :: TokenNoMintingRecipient { }) } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_errors_TokenError_destroy < > (ffi : * mut dpp_tokens_errors_TokenError) { ferment :: unbox_any (ffi) ; } } pub mod status { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`TokenStatus`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_tokens_status_TokenStatus { V0 (* mut crate :: fermented :: types :: dpp :: tokens :: status :: v0 :: dpp_tokens_status_v0_TokenStatusV0) } impl ferment :: FFIConversionFrom < dpp :: tokens :: status :: TokenStatus > for dpp_tokens_status_TokenStatus { unsafe fn ffi_from_const (ffi : * const dpp_tokens_status_TokenStatus) -> dpp :: tokens :: status :: TokenStatus { let ffi_ref = & * ffi ; match ffi_ref { dpp_tokens_status_TokenStatus :: V0 (o_0) => dpp :: tokens :: status :: TokenStatus :: V0 (< crate :: fermented :: types :: dpp :: tokens :: status :: v0 :: dpp_tokens_status_v0_TokenStatusV0 as ferment :: FFIConversionFrom < dpp :: tokens :: status :: v0 :: TokenStatusV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: tokens :: status :: TokenStatus > for dpp_tokens_status_TokenStatus { unsafe fn ffi_to_const (obj : dpp :: tokens :: status :: TokenStatus) -> * const dpp_tokens_status_TokenStatus { ferment :: boxed (match obj { dpp :: tokens :: status :: TokenStatus :: V0 (o_0) => dpp_tokens_status_TokenStatus :: V0 (< crate :: fermented :: types :: dpp :: tokens :: status :: v0 :: dpp_tokens_status_v0_TokenStatusV0 as ferment :: FFIConversionTo < dpp :: tokens :: status :: v0 :: TokenStatusV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_tokens_status_TokenStatus { fn drop (& mut self) { unsafe { match self { dpp_tokens_status_TokenStatus :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_status_TokenStatus_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: tokens :: status :: v0 :: dpp_tokens_status_v0_TokenStatusV0) -> * mut dpp_tokens_status_TokenStatus { ferment :: boxed (dpp_tokens_status_TokenStatus :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_status_TokenStatus_destroy < > (ffi : * mut dpp_tokens_status_TokenStatus) { ferment :: unbox_any (ffi) ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TokenStatusV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_tokens_status_v0_TokenStatusV0 { pub paused : bool } impl ferment :: FFIConversionFrom < dpp :: tokens :: status :: v0 :: TokenStatusV0 > for dpp_tokens_status_v0_TokenStatusV0 { unsafe fn ffi_from_const (ffi : * const dpp_tokens_status_v0_TokenStatusV0) -> dpp :: tokens :: status :: v0 :: TokenStatusV0 { let ffi_ref = & * ffi ; dpp :: tokens :: status :: v0 :: TokenStatusV0 { paused : ffi_ref . paused } } } impl ferment :: FFIConversionTo < dpp :: tokens :: status :: v0 :: TokenStatusV0 > for dpp_tokens_status_v0_TokenStatusV0 { unsafe fn ffi_to_const (obj : dpp :: tokens :: status :: v0 :: TokenStatusV0) -> * const dpp_tokens_status_v0_TokenStatusV0 { ferment :: boxed (dpp_tokens_status_v0_TokenStatusV0 { paused : obj . paused }) } } impl Drop for dpp_tokens_status_v0_TokenStatusV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_status_v0_TokenStatusV0_ctor < > (paused : bool) -> * mut dpp_tokens_status_v0_TokenStatusV0 { ferment :: boxed (dpp_tokens_status_v0_TokenStatusV0 { paused }) } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_status_v0_TokenStatusV0_destroy < > (ffi : * mut dpp_tokens_status_v0_TokenStatusV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_status_v0_TokenStatusV0_get_paused < > (obj : * const dpp_tokens_status_v0_TokenStatusV0) -> bool { (* obj) . paused } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_status_v0_TokenStatusV0_set_paused < > (obj : * const dpp_tokens_status_v0_TokenStatusV0) -> bool { (* obj) . paused } } } pub mod info { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityTokenInfoV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_tokens_info_v0_IdentityTokenInfoV0 { pub frozen : bool } impl ferment :: FFIConversionFrom < dpp :: tokens :: info :: v0 :: IdentityTokenInfoV0 > for dpp_tokens_info_v0_IdentityTokenInfoV0 { unsafe fn ffi_from_const (ffi : * const dpp_tokens_info_v0_IdentityTokenInfoV0) -> dpp :: tokens :: info :: v0 :: IdentityTokenInfoV0 { let ffi_ref = & * ffi ; dpp :: tokens :: info :: v0 :: IdentityTokenInfoV0 { frozen : ffi_ref . frozen } } } impl ferment :: FFIConversionTo < dpp :: tokens :: info :: v0 :: IdentityTokenInfoV0 > for dpp_tokens_info_v0_IdentityTokenInfoV0 { unsafe fn ffi_to_const (obj : dpp :: tokens :: info :: v0 :: IdentityTokenInfoV0) -> * const dpp_tokens_info_v0_IdentityTokenInfoV0 { ferment :: boxed (dpp_tokens_info_v0_IdentityTokenInfoV0 { frozen : obj . frozen }) } } impl Drop for dpp_tokens_info_v0_IdentityTokenInfoV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_info_v0_IdentityTokenInfoV0_ctor < > (frozen : bool) -> * mut dpp_tokens_info_v0_IdentityTokenInfoV0 { ferment :: boxed (dpp_tokens_info_v0_IdentityTokenInfoV0 { frozen }) } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_info_v0_IdentityTokenInfoV0_destroy < > (ffi : * mut dpp_tokens_info_v0_IdentityTokenInfoV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_info_v0_IdentityTokenInfoV0_get_frozen < > (obj : * const dpp_tokens_info_v0_IdentityTokenInfoV0) -> bool { (* obj) . frozen } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_info_v0_IdentityTokenInfoV0_set_frozen < > (obj : * const dpp_tokens_info_v0_IdentityTokenInfoV0) -> bool { (* obj) . frozen } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`IdentityTokenInfo`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_tokens_info_IdentityTokenInfo { V0 (* mut crate :: fermented :: types :: dpp :: tokens :: info :: v0 :: dpp_tokens_info_v0_IdentityTokenInfoV0) } impl ferment :: FFIConversionFrom < dpp :: tokens :: info :: IdentityTokenInfo > for dpp_tokens_info_IdentityTokenInfo { unsafe fn ffi_from_const (ffi : * const dpp_tokens_info_IdentityTokenInfo) -> dpp :: tokens :: info :: IdentityTokenInfo { let ffi_ref = & * ffi ; match ffi_ref { dpp_tokens_info_IdentityTokenInfo :: V0 (o_0) => dpp :: tokens :: info :: IdentityTokenInfo :: V0 (< crate :: fermented :: types :: dpp :: tokens :: info :: v0 :: dpp_tokens_info_v0_IdentityTokenInfoV0 as ferment :: FFIConversionFrom < dpp :: tokens :: info :: v0 :: IdentityTokenInfoV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: tokens :: info :: IdentityTokenInfo > for dpp_tokens_info_IdentityTokenInfo { unsafe fn ffi_to_const (obj : dpp :: tokens :: info :: IdentityTokenInfo) -> * const dpp_tokens_info_IdentityTokenInfo { ferment :: boxed (match obj { dpp :: tokens :: info :: IdentityTokenInfo :: V0 (o_0) => dpp_tokens_info_IdentityTokenInfo :: V0 (< crate :: fermented :: types :: dpp :: tokens :: info :: v0 :: dpp_tokens_info_v0_IdentityTokenInfoV0 as ferment :: FFIConversionTo < dpp :: tokens :: info :: v0 :: IdentityTokenInfoV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_tokens_info_IdentityTokenInfo { fn drop (& mut self) { unsafe { match self { dpp_tokens_info_IdentityTokenInfo :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_info_IdentityTokenInfo_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: tokens :: info :: v0 :: dpp_tokens_info_v0_IdentityTokenInfoV0) -> * mut dpp_tokens_info_IdentityTokenInfo { ferment :: boxed (dpp_tokens_info_IdentityTokenInfo :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_info_IdentityTokenInfo_destroy < > (ffi : * mut dpp_tokens_info_IdentityTokenInfo) { ferment :: unbox_any (ffi) ; } } # [doc = "FFI-representation of the [`PrivateEncryptedNote`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_tokens_PrivateEncryptedNote (* mut crate :: fermented :: generics :: Tuple_dpp_prelude_RootEncryptionKeyIndex_dpp_prelude_DerivationEncryptionKeyIndex_Vec_u8) ; impl ferment :: FFIConversionFrom < dpp :: tokens :: PrivateEncryptedNote > for dpp_tokens_PrivateEncryptedNote { unsafe fn ffi_from_const (ffi : * const dpp_tokens_PrivateEncryptedNote) -> dpp :: tokens :: PrivateEncryptedNote { let ffi_ref = & * ffi ; < crate :: fermented :: generics :: Tuple_dpp_prelude_RootEncryptionKeyIndex_dpp_prelude_DerivationEncryptionKeyIndex_Vec_u8 as ferment :: FFIConversionFrom < (dpp :: prelude :: RootEncryptionKeyIndex , dpp :: prelude :: DerivationEncryptionKeyIndex , Vec < u8 > ,) >> :: ffi_from (ffi_ref . 0) } } impl ferment :: FFIConversionTo < dpp :: tokens :: PrivateEncryptedNote > for dpp_tokens_PrivateEncryptedNote { unsafe fn ffi_to_const (obj : dpp :: tokens :: PrivateEncryptedNote) -> * const dpp_tokens_PrivateEncryptedNote { ferment :: boxed (dpp_tokens_PrivateEncryptedNote (< crate :: fermented :: generics :: Tuple_dpp_prelude_RootEncryptionKeyIndex_dpp_prelude_DerivationEncryptionKeyIndex_Vec_u8 as ferment :: FFIConversionTo < (dpp :: prelude :: RootEncryptionKeyIndex , dpp :: prelude :: DerivationEncryptionKeyIndex , Vec < u8 > ,) >> :: ffi_to (obj))) } } impl Drop for dpp_tokens_PrivateEncryptedNote { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_PrivateEncryptedNote_ctor < > (o_0 : * mut crate :: fermented :: generics :: Tuple_dpp_prelude_RootEncryptionKeyIndex_dpp_prelude_DerivationEncryptionKeyIndex_Vec_u8) -> * mut dpp_tokens_PrivateEncryptedNote { ferment :: boxed (dpp_tokens_PrivateEncryptedNote (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_PrivateEncryptedNote_destroy < > (ffi : * mut dpp_tokens_PrivateEncryptedNote) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_PrivateEncryptedNote_get_0 < > (obj : * const dpp_tokens_PrivateEncryptedNote) -> * mut crate :: fermented :: generics :: Tuple_dpp_prelude_RootEncryptionKeyIndex_dpp_prelude_DerivationEncryptionKeyIndex_Vec_u8 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_tokens_PrivateEncryptedNote_set_0 < > (obj : * const dpp_tokens_PrivateEncryptedNote) -> * mut crate :: fermented :: generics :: Tuple_dpp_prelude_RootEncryptionKeyIndex_dpp_prelude_DerivationEncryptionKeyIndex_Vec_u8 { (* obj) . 0 } } pub mod bls { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "core-types")] pub mod core_types { use crate as dash_spv_apple_bindings ; pub mod validator_set { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; } } pub mod validator { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; } } } pub mod withdrawal { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`Pooling`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_withdrawal_Pooling { Never = 0 , IfAvailable = 1 , Standard = 2 } impl ferment :: FFIConversionFrom < dpp :: withdrawal :: Pooling > for dpp_withdrawal_Pooling { unsafe fn ffi_from_const (ffi : * const dpp_withdrawal_Pooling) -> dpp :: withdrawal :: Pooling { let ffi_ref = & * ffi ; match ffi_ref { dpp_withdrawal_Pooling :: Never => dpp :: withdrawal :: Pooling :: Never , dpp_withdrawal_Pooling :: IfAvailable => dpp :: withdrawal :: Pooling :: IfAvailable , dpp_withdrawal_Pooling :: Standard => dpp :: withdrawal :: Pooling :: Standard } } } impl ferment :: FFIConversionTo < dpp :: withdrawal :: Pooling > for dpp_withdrawal_Pooling { unsafe fn ffi_to_const (obj : dpp :: withdrawal :: Pooling) -> * const dpp_withdrawal_Pooling { ferment :: boxed (match obj { dpp :: withdrawal :: Pooling :: Never => dpp_withdrawal_Pooling :: Never , dpp :: withdrawal :: Pooling :: IfAvailable => dpp_withdrawal_Pooling :: IfAvailable , dpp :: withdrawal :: Pooling :: Standard => dpp_withdrawal_Pooling :: Standard , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_withdrawal_Pooling { fn drop (& mut self) { unsafe { match self { dpp_withdrawal_Pooling :: Never => { } , dpp_withdrawal_Pooling :: IfAvailable => { } , dpp_withdrawal_Pooling :: Standard => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_withdrawal_Pooling_Never_ctor () -> * mut dpp_withdrawal_Pooling { ferment :: boxed (dpp_withdrawal_Pooling :: Never { }) } # [no_mangle] pub unsafe extern "C" fn dpp_withdrawal_Pooling_IfAvailable_ctor () -> * mut dpp_withdrawal_Pooling { ferment :: boxed (dpp_withdrawal_Pooling :: IfAvailable { }) } # [no_mangle] pub unsafe extern "C" fn dpp_withdrawal_Pooling_Standard_ctor () -> * mut dpp_withdrawal_Pooling { ferment :: boxed (dpp_withdrawal_Pooling :: Standard { }) } # [no_mangle] pub unsafe extern "C" fn dpp_withdrawal_Pooling_destroy < > (ffi : * mut dpp_withdrawal_Pooling) { ferment :: unbox_any (ffi) ; } # [cfg (feature = "system_contracts")] pub mod document_try_into_asset_unlock_base_transaction_info { use crate as dash_spv_apple_bindings ; } pub mod daily_withdrawal_limit { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; } } } pub mod serialization { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "fixtures-and-mocks")] pub mod tests { use crate as dash_spv_apple_bindings ; pub mod fixtures { use crate as dash_spv_apple_bindings ; } pub mod utils { use crate as dash_spv_apple_bindings ; } } pub mod document { use crate as dash_spv_apple_bindings ; # [cfg (feature = "factories")] pub mod document_factory { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; } } pub mod transfer { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`Transferable`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_document_transfer_Transferable { Never = 0 , Always = 1 } impl ferment :: FFIConversionFrom < dpp :: document :: transfer :: Transferable > for dpp_document_transfer_Transferable { unsafe fn ffi_from_const (ffi : * const dpp_document_transfer_Transferable) -> dpp :: document :: transfer :: Transferable { let ffi_ref = & * ffi ; match ffi_ref { dpp_document_transfer_Transferable :: Never => dpp :: document :: transfer :: Transferable :: Never , dpp_document_transfer_Transferable :: Always => dpp :: document :: transfer :: Transferable :: Always } } } impl ferment :: FFIConversionTo < dpp :: document :: transfer :: Transferable > for dpp_document_transfer_Transferable { unsafe fn ffi_to_const (obj : dpp :: document :: transfer :: Transferable) -> * const dpp_document_transfer_Transferable { ferment :: boxed (match obj { dpp :: document :: transfer :: Transferable :: Never => dpp_document_transfer_Transferable :: Never , dpp :: document :: transfer :: Transferable :: Always => dpp_document_transfer_Transferable :: Always , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_document_transfer_Transferable { fn drop (& mut self) { unsafe { match self { dpp_document_transfer_Transferable :: Never => { } , dpp_document_transfer_Transferable :: Always => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_document_transfer_Transferable_Never_ctor () -> * mut dpp_document_transfer_Transferable { ferment :: boxed (dpp_document_transfer_Transferable :: Never { }) } # [no_mangle] pub unsafe extern "C" fn dpp_document_transfer_Transferable_Always_ctor () -> * mut dpp_document_transfer_Transferable { ferment :: boxed (dpp_document_transfer_Transferable :: Always { }) } # [no_mangle] pub unsafe extern "C" fn dpp_document_transfer_Transferable_destroy < > (ffi : * mut dpp_document_transfer_Transferable) { ferment :: unbox_any (ffi) ; } } # [cfg (feature = "factories")] pub mod specialized_document_factory { use crate as dash_spv_apple_bindings ; } pub mod serialization_traits { use crate as dash_spv_apple_bindings ; # [cfg (feature = "document-value-conversion")] pub mod platform_value_conversion { use crate as dash_spv_apple_bindings ; } pub mod platform_serialization_conversion { use crate as dash_spv_apple_bindings ; pub mod deserialize { use crate as dash_spv_apple_bindings ; } pub mod serialize { use crate as dash_spv_apple_bindings ; } } # [cfg (feature = "document-json-conversion")] pub mod json_conversion { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "document-cbor-conversion")] pub mod cbor_conversion { use crate as dash_spv_apple_bindings ; } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`Document`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_document_Document { V0 (* mut crate :: fermented :: types :: dpp :: document :: v0 :: dpp_document_v0_DocumentV0) } impl ferment :: FFIConversionFrom < dpp :: document :: Document > for dpp_document_Document { unsafe fn ffi_from_const (ffi : * const dpp_document_Document) -> dpp :: document :: Document { let ffi_ref = & * ffi ; match ffi_ref { dpp_document_Document :: V0 (o_0) => dpp :: document :: Document :: V0 (< crate :: fermented :: types :: dpp :: document :: v0 :: dpp_document_v0_DocumentV0 as ferment :: FFIConversionFrom < dpp :: document :: v0 :: DocumentV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: document :: Document > for dpp_document_Document { unsafe fn ffi_to_const (obj : dpp :: document :: Document) -> * const dpp_document_Document { ferment :: boxed (match obj { dpp :: document :: Document :: V0 (o_0) => dpp_document_Document :: V0 (< crate :: fermented :: types :: dpp :: document :: v0 :: dpp_document_v0_DocumentV0 as ferment :: FFIConversionTo < dpp :: document :: v0 :: DocumentV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_document_Document { fn drop (& mut self) { unsafe { match self { dpp_document_Document :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_document_Document_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: document :: v0 :: dpp_document_v0_DocumentV0) -> * mut dpp_document_Document { ferment :: boxed (dpp_document_Document :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_document_Document_destroy < > (ffi : * mut dpp_document_Document) { ferment :: unbox_any (ffi) ; } pub mod fields { use crate as dash_spv_apple_bindings ; } pub mod accessors { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "extended-document")] pub mod extended_document { use crate as dash_spv_apple_bindings ; pub mod fields { use crate as dash_spv_apple_bindings ; } pub mod v0 { use crate as dash_spv_apple_bindings ; } } pub mod errors { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DocumentError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_document_errors_DocumentError { # [cfg (feature = "state-transitions")] DocumentAlreadyExistsError { document_transition : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition } , # [cfg (feature = "state-transitions")] DocumentNotProvidedError { document_transition : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition } , InvalidActionError (u8) , InvalidActionNameError { actions : * mut crate :: fermented :: generics :: Vec_String } , # [cfg (feature = "state-transitions")] InvalidDocumentActionError { document_transition : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition } , InvalidDocumentError { errors : * mut crate :: fermented :: generics :: Vec_dpp_errors_consensus_consensus_error_ConsensusError , raw_document : * mut crate :: fermented :: types :: platform_value :: platform_value_Value } , InvalidInitialRevisionError { document : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document } , RevisionAbsentError { document : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document } , TryingToReplaceImmutableDocument { document : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document } , TryingToDeleteIndelibleDocument { document : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document } , MismatchOwnerIdsError { documents : * mut crate :: fermented :: generics :: Vec_dpp_document_Document } , DocumentNoRevisionError { document : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document } , NoDocumentsSuppliedError } impl ferment :: FFIConversionFrom < dpp :: document :: errors :: DocumentError > for dpp_document_errors_DocumentError { unsafe fn ffi_from_const (ffi : * const dpp_document_errors_DocumentError) -> dpp :: document :: errors :: DocumentError { let ffi_ref = & * ffi ; match ffi_ref { # [cfg (feature = "state-transitions")] dpp_document_errors_DocumentError :: DocumentAlreadyExistsError { document_transition } => dpp :: document :: errors :: DocumentError :: DocumentAlreadyExistsError { document_transition : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition >> :: ffi_from (* document_transition) } , # [cfg (feature = "state-transitions")] dpp_document_errors_DocumentError :: DocumentNotProvidedError { document_transition } => dpp :: document :: errors :: DocumentError :: DocumentNotProvidedError { document_transition : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition >> :: ffi_from (* document_transition) } , dpp_document_errors_DocumentError :: InvalidActionError (o_0) => dpp :: document :: errors :: DocumentError :: InvalidActionError (* o_0) , dpp_document_errors_DocumentError :: InvalidActionNameError { actions } => dpp :: document :: errors :: DocumentError :: InvalidActionNameError { actions : < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionFrom < Vec < String > >> :: ffi_from (* actions) } , # [cfg (feature = "state-transitions")] dpp_document_errors_DocumentError :: InvalidDocumentActionError { document_transition } => dpp :: document :: errors :: DocumentError :: InvalidDocumentActionError { document_transition : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition >> :: ffi_from (* document_transition) } , dpp_document_errors_DocumentError :: InvalidDocumentError { errors , raw_document } => dpp :: document :: errors :: DocumentError :: InvalidDocumentError { errors : < crate :: fermented :: generics :: Vec_dpp_errors_consensus_consensus_error_ConsensusError as ferment :: FFIConversionFrom < Vec < dpp :: errors :: consensus :: consensus_error :: ConsensusError > >> :: ffi_from (* errors) , raw_document : < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionFrom < platform_value :: Value >> :: ffi_from (* raw_document) } , dpp_document_errors_DocumentError :: InvalidInitialRevisionError { document } => dpp :: document :: errors :: DocumentError :: InvalidInitialRevisionError { document : Box :: new (< crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionFrom < dpp :: document :: Document >> :: ffi_from (* document)) } , dpp_document_errors_DocumentError :: RevisionAbsentError { document } => dpp :: document :: errors :: DocumentError :: RevisionAbsentError { document : Box :: new (< crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionFrom < dpp :: document :: Document >> :: ffi_from (* document)) } , dpp_document_errors_DocumentError :: TryingToReplaceImmutableDocument { document } => dpp :: document :: errors :: DocumentError :: TryingToReplaceImmutableDocument { document : Box :: new (< crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionFrom < dpp :: document :: Document >> :: ffi_from (* document)) } , dpp_document_errors_DocumentError :: TryingToDeleteIndelibleDocument { document } => dpp :: document :: errors :: DocumentError :: TryingToDeleteIndelibleDocument { document : Box :: new (< crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionFrom < dpp :: document :: Document >> :: ffi_from (* document)) } , dpp_document_errors_DocumentError :: MismatchOwnerIdsError { documents } => dpp :: document :: errors :: DocumentError :: MismatchOwnerIdsError { documents : < crate :: fermented :: generics :: Vec_dpp_document_Document as ferment :: FFIConversionFrom < Vec < dpp :: document :: Document > >> :: ffi_from (* documents) } , dpp_document_errors_DocumentError :: DocumentNoRevisionError { document } => dpp :: document :: errors :: DocumentError :: DocumentNoRevisionError { document : Box :: new (< crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionFrom < dpp :: document :: Document >> :: ffi_from (* document)) } , dpp_document_errors_DocumentError :: NoDocumentsSuppliedError => dpp :: document :: errors :: DocumentError :: NoDocumentsSuppliedError } } } impl ferment :: FFIConversionTo < dpp :: document :: errors :: DocumentError > for dpp_document_errors_DocumentError { unsafe fn ffi_to_const (obj : dpp :: document :: errors :: DocumentError) -> * const dpp_document_errors_DocumentError { ferment :: boxed (match obj { # [cfg (feature = "state-transitions")] dpp :: document :: errors :: DocumentError :: DocumentAlreadyExistsError { document_transition } => dpp_document_errors_DocumentError :: DocumentAlreadyExistsError { document_transition : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition >> :: ffi_to (document_transition) } , # [cfg (feature = "state-transitions")] dpp :: document :: errors :: DocumentError :: DocumentNotProvidedError { document_transition } => dpp_document_errors_DocumentError :: DocumentNotProvidedError { document_transition : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition >> :: ffi_to (document_transition) } , dpp :: document :: errors :: DocumentError :: InvalidActionError (o_0) => dpp_document_errors_DocumentError :: InvalidActionError (o_0) , dpp :: document :: errors :: DocumentError :: InvalidActionNameError { actions } => dpp_document_errors_DocumentError :: InvalidActionNameError { actions : < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionTo < Vec < String > >> :: ffi_to (actions) } , # [cfg (feature = "state-transitions")] dpp :: document :: errors :: DocumentError :: InvalidDocumentActionError { document_transition } => dpp_document_errors_DocumentError :: InvalidDocumentActionError { document_transition : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition >> :: ffi_to (document_transition) } , dpp :: document :: errors :: DocumentError :: InvalidDocumentError { errors , raw_document } => dpp_document_errors_DocumentError :: InvalidDocumentError { errors : < crate :: fermented :: generics :: Vec_dpp_errors_consensus_consensus_error_ConsensusError as ferment :: FFIConversionTo < Vec < dpp :: errors :: consensus :: consensus_error :: ConsensusError > >> :: ffi_to (errors) , raw_document : < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionTo < platform_value :: Value >> :: ffi_to (raw_document) } , dpp :: document :: errors :: DocumentError :: InvalidInitialRevisionError { document } => dpp_document_errors_DocumentError :: InvalidInitialRevisionError { document : < crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionTo < dpp :: document :: Document >> :: ffi_to (* document) } , dpp :: document :: errors :: DocumentError :: RevisionAbsentError { document } => dpp_document_errors_DocumentError :: RevisionAbsentError { document : < crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionTo < dpp :: document :: Document >> :: ffi_to (* document) } , dpp :: document :: errors :: DocumentError :: TryingToReplaceImmutableDocument { document } => dpp_document_errors_DocumentError :: TryingToReplaceImmutableDocument { document : < crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionTo < dpp :: document :: Document >> :: ffi_to (* document) } , dpp :: document :: errors :: DocumentError :: TryingToDeleteIndelibleDocument { document } => dpp_document_errors_DocumentError :: TryingToDeleteIndelibleDocument { document : < crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionTo < dpp :: document :: Document >> :: ffi_to (* document) } , dpp :: document :: errors :: DocumentError :: MismatchOwnerIdsError { documents } => dpp_document_errors_DocumentError :: MismatchOwnerIdsError { documents : < crate :: fermented :: generics :: Vec_dpp_document_Document as ferment :: FFIConversionTo < Vec < dpp :: document :: Document > >> :: ffi_to (documents) } , dpp :: document :: errors :: DocumentError :: DocumentNoRevisionError { document } => dpp_document_errors_DocumentError :: DocumentNoRevisionError { document : < crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionTo < dpp :: document :: Document >> :: ffi_to (* document) } , dpp :: document :: errors :: DocumentError :: NoDocumentsSuppliedError => dpp_document_errors_DocumentError :: NoDocumentsSuppliedError , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_document_errors_DocumentError { fn drop (& mut self) { unsafe { match self { # [cfg (feature = "state-transitions")] dpp_document_errors_DocumentError :: DocumentAlreadyExistsError { document_transition } => { ferment :: unbox_any (* document_transition) ; } , # [cfg (feature = "state-transitions")] dpp_document_errors_DocumentError :: DocumentNotProvidedError { document_transition } => { ferment :: unbox_any (* document_transition) ; } , dpp_document_errors_DocumentError :: InvalidActionError (o_0) => { ; } , dpp_document_errors_DocumentError :: InvalidActionNameError { actions } => { ferment :: unbox_any (* actions) ; } , # [cfg (feature = "state-transitions")] dpp_document_errors_DocumentError :: InvalidDocumentActionError { document_transition } => { ferment :: unbox_any (* document_transition) ; } , dpp_document_errors_DocumentError :: InvalidDocumentError { errors , raw_document } => { ferment :: unbox_any (* errors) ; ; ferment :: unbox_any (* raw_document) ; } , dpp_document_errors_DocumentError :: InvalidInitialRevisionError { document } => { ferment :: unbox_any (* document) ; } , dpp_document_errors_DocumentError :: RevisionAbsentError { document } => { ferment :: unbox_any (* document) ; } , dpp_document_errors_DocumentError :: TryingToReplaceImmutableDocument { document } => { ferment :: unbox_any (* document) ; } , dpp_document_errors_DocumentError :: TryingToDeleteIndelibleDocument { document } => { ferment :: unbox_any (* document) ; } , dpp_document_errors_DocumentError :: MismatchOwnerIdsError { documents } => { ferment :: unbox_any (* documents) ; } , dpp_document_errors_DocumentError :: DocumentNoRevisionError { document } => { ferment :: unbox_any (* document) ; } , dpp_document_errors_DocumentError :: NoDocumentsSuppliedError => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [cfg (feature = "state-transitions")] # [no_mangle] pub unsafe extern "C" fn dpp_document_errors_DocumentError_DocumentAlreadyExistsError_ctor (document_transition : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition) -> * mut dpp_document_errors_DocumentError { ferment :: boxed (dpp_document_errors_DocumentError :: DocumentAlreadyExistsError { document_transition }) } # [cfg (feature = "state-transitions")] # [no_mangle] pub unsafe extern "C" fn dpp_document_errors_DocumentError_DocumentNotProvidedError_ctor (document_transition : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition) -> * mut dpp_document_errors_DocumentError { ferment :: boxed (dpp_document_errors_DocumentError :: DocumentNotProvidedError { document_transition }) } # [no_mangle] pub unsafe extern "C" fn dpp_document_errors_DocumentError_InvalidActionError_ctor (o_o_0 : u8) -> * mut dpp_document_errors_DocumentError { ferment :: boxed (dpp_document_errors_DocumentError :: InvalidActionError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_document_errors_DocumentError_InvalidActionNameError_ctor (actions : * mut crate :: fermented :: generics :: Vec_String) -> * mut dpp_document_errors_DocumentError { ferment :: boxed (dpp_document_errors_DocumentError :: InvalidActionNameError { actions }) } # [cfg (feature = "state-transitions")] # [no_mangle] pub unsafe extern "C" fn dpp_document_errors_DocumentError_InvalidDocumentActionError_ctor (document_transition : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition) -> * mut dpp_document_errors_DocumentError { ferment :: boxed (dpp_document_errors_DocumentError :: InvalidDocumentActionError { document_transition }) } # [no_mangle] pub unsafe extern "C" fn dpp_document_errors_DocumentError_InvalidDocumentError_ctor (errors : * mut crate :: fermented :: generics :: Vec_dpp_errors_consensus_consensus_error_ConsensusError , raw_document : * mut crate :: fermented :: types :: platform_value :: platform_value_Value) -> * mut dpp_document_errors_DocumentError { ferment :: boxed (dpp_document_errors_DocumentError :: InvalidDocumentError { errors , raw_document }) } # [no_mangle] pub unsafe extern "C" fn dpp_document_errors_DocumentError_InvalidInitialRevisionError_ctor (document : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document) -> * mut dpp_document_errors_DocumentError { ferment :: boxed (dpp_document_errors_DocumentError :: InvalidInitialRevisionError { document }) } # [no_mangle] pub unsafe extern "C" fn dpp_document_errors_DocumentError_RevisionAbsentError_ctor (document : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document) -> * mut dpp_document_errors_DocumentError { ferment :: boxed (dpp_document_errors_DocumentError :: RevisionAbsentError { document }) } # [no_mangle] pub unsafe extern "C" fn dpp_document_errors_DocumentError_TryingToReplaceImmutableDocument_ctor (document : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document) -> * mut dpp_document_errors_DocumentError { ferment :: boxed (dpp_document_errors_DocumentError :: TryingToReplaceImmutableDocument { document }) } # [no_mangle] pub unsafe extern "C" fn dpp_document_errors_DocumentError_TryingToDeleteIndelibleDocument_ctor (document : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document) -> * mut dpp_document_errors_DocumentError { ferment :: boxed (dpp_document_errors_DocumentError :: TryingToDeleteIndelibleDocument { document }) } # [no_mangle] pub unsafe extern "C" fn dpp_document_errors_DocumentError_MismatchOwnerIdsError_ctor (documents : * mut crate :: fermented :: generics :: Vec_dpp_document_Document) -> * mut dpp_document_errors_DocumentError { ferment :: boxed (dpp_document_errors_DocumentError :: MismatchOwnerIdsError { documents }) } # [no_mangle] pub unsafe extern "C" fn dpp_document_errors_DocumentError_DocumentNoRevisionError_ctor (document : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document) -> * mut dpp_document_errors_DocumentError { ferment :: boxed (dpp_document_errors_DocumentError :: DocumentNoRevisionError { document }) } # [no_mangle] pub unsafe extern "C" fn dpp_document_errors_DocumentError_NoDocumentsSuppliedError_ctor () -> * mut dpp_document_errors_DocumentError { ferment :: boxed (dpp_document_errors_DocumentError :: NoDocumentsSuppliedError { }) } # [no_mangle] pub unsafe extern "C" fn dpp_document_errors_DocumentError_destroy < > (ffi : * mut dpp_document_errors_DocumentError) { ferment :: unbox_any (ffi) ; } } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_document_v0_DocumentV0 { pub id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub properties : * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_platform_value_Value , pub revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision , pub created_at : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis , pub updated_at : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis , pub transferred_at : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis , pub created_at_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight , pub updated_at_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight , pub transferred_at_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight , pub created_at_core_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight , pub updated_at_core_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight , pub transferred_at_core_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight } impl ferment :: FFIConversionFrom < dpp :: document :: v0 :: DocumentV0 > for dpp_document_v0_DocumentV0 { unsafe fn ffi_from_const (ffi : * const dpp_document_v0_DocumentV0) -> dpp :: document :: v0 :: DocumentV0 { let ffi_ref = & * ffi ; dpp :: document :: v0 :: DocumentV0 { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . id) , owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . owner_id) , properties : < crate :: fermented :: generics :: std_collections_Map_keys_String_values_platform_value_Value as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < String , platform_value :: Value > >> :: ffi_from (ffi_ref . properties) , revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionFrom < dpp :: prelude :: Revision >> :: ffi_from_opt (ffi_ref . revision) , created_at : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: TimestampMillis >> :: ffi_from_opt (ffi_ref . created_at) , updated_at : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: TimestampMillis >> :: ffi_from_opt (ffi_ref . updated_at) , transferred_at : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: TimestampMillis >> :: ffi_from_opt (ffi_ref . transferred_at) , created_at_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight as ferment :: FFIConversionFrom < dpp :: prelude :: BlockHeight >> :: ffi_from_opt (ffi_ref . created_at_block_height) , updated_at_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight as ferment :: FFIConversionFrom < dpp :: prelude :: BlockHeight >> :: ffi_from_opt (ffi_ref . updated_at_block_height) , transferred_at_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight as ferment :: FFIConversionFrom < dpp :: prelude :: BlockHeight >> :: ffi_from_opt (ffi_ref . transferred_at_block_height) , created_at_core_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight as ferment :: FFIConversionFrom < dpp :: prelude :: CoreBlockHeight >> :: ffi_from_opt (ffi_ref . created_at_core_block_height) , updated_at_core_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight as ferment :: FFIConversionFrom < dpp :: prelude :: CoreBlockHeight >> :: ffi_from_opt (ffi_ref . updated_at_core_block_height) , transferred_at_core_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight as ferment :: FFIConversionFrom < dpp :: prelude :: CoreBlockHeight >> :: ffi_from_opt (ffi_ref . transferred_at_core_block_height) } } } impl ferment :: FFIConversionTo < dpp :: document :: v0 :: DocumentV0 > for dpp_document_v0_DocumentV0 { unsafe fn ffi_to_const (obj : dpp :: document :: v0 :: DocumentV0) -> * const dpp_document_v0_DocumentV0 { ferment :: boxed (dpp_document_v0_DocumentV0 { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . id) , owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . owner_id) , properties : < crate :: fermented :: generics :: std_collections_Map_keys_String_values_platform_value_Value as ferment :: FFIConversionTo < std :: collections :: BTreeMap < String , platform_value :: Value > >> :: ffi_to (obj . properties) , revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionTo < dpp :: prelude :: Revision >> :: ffi_to_opt (obj . revision) , created_at : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: TimestampMillis >> :: ffi_to_opt (obj . created_at) , updated_at : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: TimestampMillis >> :: ffi_to_opt (obj . updated_at) , transferred_at : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: TimestampMillis >> :: ffi_to_opt (obj . transferred_at) , created_at_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight as ferment :: FFIConversionTo < dpp :: prelude :: BlockHeight >> :: ffi_to_opt (obj . created_at_block_height) , updated_at_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight as ferment :: FFIConversionTo < dpp :: prelude :: BlockHeight >> :: ffi_to_opt (obj . updated_at_block_height) , transferred_at_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight as ferment :: FFIConversionTo < dpp :: prelude :: BlockHeight >> :: ffi_to_opt (obj . transferred_at_block_height) , created_at_core_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight as ferment :: FFIConversionTo < dpp :: prelude :: CoreBlockHeight >> :: ffi_to_opt (obj . created_at_core_block_height) , updated_at_core_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight as ferment :: FFIConversionTo < dpp :: prelude :: CoreBlockHeight >> :: ffi_to_opt (obj . updated_at_core_block_height) , transferred_at_core_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight as ferment :: FFIConversionTo < dpp :: prelude :: CoreBlockHeight >> :: ffi_to_opt (obj . transferred_at_core_block_height) }) } } impl Drop for dpp_document_v0_DocumentV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . id) ; ferment :: unbox_any (ffi_ref . owner_id) ; ferment :: unbox_any (ffi_ref . properties) ; ferment :: unbox_any_opt (ffi_ref . revision) ; ferment :: unbox_any_opt (ffi_ref . created_at) ; ferment :: unbox_any_opt (ffi_ref . updated_at) ; ferment :: unbox_any_opt (ffi_ref . transferred_at) ; ferment :: unbox_any_opt (ffi_ref . created_at_block_height) ; ferment :: unbox_any_opt (ffi_ref . updated_at_block_height) ; ferment :: unbox_any_opt (ffi_ref . transferred_at_block_height) ; ferment :: unbox_any_opt (ffi_ref . created_at_core_block_height) ; ferment :: unbox_any_opt (ffi_ref . updated_at_core_block_height) ; ferment :: unbox_any_opt (ffi_ref . transferred_at_core_block_height) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_ctor < > (id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , properties : * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_platform_value_Value , revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision , created_at : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis , updated_at : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis , transferred_at : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis , created_at_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight , updated_at_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight , transferred_at_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight , created_at_core_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight , updated_at_core_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight , transferred_at_core_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight) -> * mut dpp_document_v0_DocumentV0 { ferment :: boxed (dpp_document_v0_DocumentV0 { id , owner_id , properties , revision , created_at , updated_at , transferred_at , created_at_block_height , updated_at_block_height , transferred_at_block_height , created_at_core_block_height , updated_at_core_block_height , transferred_at_core_block_height }) } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_destroy < > (ffi : * mut dpp_document_v0_DocumentV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_get_id < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_get_owner_id < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . owner_id } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_get_properties < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_platform_value_Value { (* obj) . properties } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_get_revision < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . revision } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_get_created_at < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis { (* obj) . created_at } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_get_updated_at < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis { (* obj) . updated_at } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_get_transferred_at < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis { (* obj) . transferred_at } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_get_created_at_block_height < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight { (* obj) . created_at_block_height } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_get_updated_at_block_height < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight { (* obj) . updated_at_block_height } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_get_transferred_at_block_height < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight { (* obj) . transferred_at_block_height } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_get_created_at_core_block_height < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight { (* obj) . created_at_core_block_height } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_get_updated_at_core_block_height < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight { (* obj) . updated_at_core_block_height } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_get_transferred_at_core_block_height < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight { (* obj) . transferred_at_core_block_height } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_set_id < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_set_owner_id < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . owner_id } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_set_properties < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_platform_value_Value { (* obj) . properties } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_set_revision < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . revision } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_set_created_at < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis { (* obj) . created_at } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_set_updated_at < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis { (* obj) . updated_at } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_set_transferred_at < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis { (* obj) . transferred_at } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_set_created_at_block_height < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight { (* obj) . created_at_block_height } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_set_updated_at_block_height < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight { (* obj) . updated_at_block_height } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_set_transferred_at_block_height < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight { (* obj) . transferred_at_block_height } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_set_created_at_core_block_height < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight { (* obj) . created_at_core_block_height } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_set_updated_at_core_block_height < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight { (* obj) . updated_at_core_block_height } # [no_mangle] pub unsafe extern "C" fn dpp_document_v0_DocumentV0_set_transferred_at_core_block_height < > (obj : * const dpp_document_v0_DocumentV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight { (* obj) . transferred_at_core_block_height } } pub mod document_methods { use crate as dash_spv_apple_bindings ; pub mod get_raw_for_contract { use crate as dash_spv_apple_bindings ; } pub mod get_raw_for_document_type { use crate as dash_spv_apple_bindings ; } pub mod hash { use crate as dash_spv_apple_bindings ; } pub mod is_equal_ignoring_timestamps { use crate as dash_spv_apple_bindings ; } } } pub mod balances { use crate as dash_spv_apple_bindings ; pub mod credits { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`Credits`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_balances_credits_Credits (u64) ; impl ferment :: FFIConversionFrom < dpp :: balances :: credits :: Credits > for dpp_balances_credits_Credits { unsafe fn ffi_from_const (ffi : * const dpp_balances_credits_Credits) -> dpp :: balances :: credits :: Credits { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: balances :: credits :: Credits > for dpp_balances_credits_Credits { unsafe fn ffi_to_const (obj : dpp :: balances :: credits :: Credits) -> * const dpp_balances_credits_Credits { ferment :: boxed (dpp_balances_credits_Credits (obj)) } } impl Drop for dpp_balances_credits_Credits { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_balances_credits_Credits_ctor < > (o_0 : u64) -> * mut dpp_balances_credits_Credits { ferment :: boxed (dpp_balances_credits_Credits (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_balances_credits_Credits_destroy < > (ffi : * mut dpp_balances_credits_Credits) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_balances_credits_Credits_get_0 < > (obj : * const dpp_balances_credits_Credits) -> u64 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_balances_credits_Credits_set_0 < > (obj : * const dpp_balances_credits_Credits) -> u64 { (* obj) . 0 } # [doc = "FFI-representation of the [`SignedCredits`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_balances_credits_SignedCredits (i64) ; impl ferment :: FFIConversionFrom < dpp :: balances :: credits :: SignedCredits > for dpp_balances_credits_SignedCredits { unsafe fn ffi_from_const (ffi : * const dpp_balances_credits_SignedCredits) -> dpp :: balances :: credits :: SignedCredits { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: balances :: credits :: SignedCredits > for dpp_balances_credits_SignedCredits { unsafe fn ffi_to_const (obj : dpp :: balances :: credits :: SignedCredits) -> * const dpp_balances_credits_SignedCredits { ferment :: boxed (dpp_balances_credits_SignedCredits (obj)) } } impl Drop for dpp_balances_credits_SignedCredits { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_balances_credits_SignedCredits_ctor < > (o_0 : i64) -> * mut dpp_balances_credits_SignedCredits { ferment :: boxed (dpp_balances_credits_SignedCredits (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_balances_credits_SignedCredits_destroy < > (ffi : * mut dpp_balances_credits_SignedCredits) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_balances_credits_SignedCredits_get_0 < > (obj : * const dpp_balances_credits_SignedCredits) -> i64 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_balances_credits_SignedCredits_set_0 < > (obj : * const dpp_balances_credits_SignedCredits) -> i64 { (* obj) . 0 } # [doc = "FFI-representation of the [`TokenAmount`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_balances_credits_TokenAmount (u64) ; impl ferment :: FFIConversionFrom < dpp :: balances :: credits :: TokenAmount > for dpp_balances_credits_TokenAmount { unsafe fn ffi_from_const (ffi : * const dpp_balances_credits_TokenAmount) -> dpp :: balances :: credits :: TokenAmount { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: balances :: credits :: TokenAmount > for dpp_balances_credits_TokenAmount { unsafe fn ffi_to_const (obj : dpp :: balances :: credits :: TokenAmount) -> * const dpp_balances_credits_TokenAmount { ferment :: boxed (dpp_balances_credits_TokenAmount (obj)) } } impl Drop for dpp_balances_credits_TokenAmount { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_balances_credits_TokenAmount_ctor < > (o_0 : u64) -> * mut dpp_balances_credits_TokenAmount { ferment :: boxed (dpp_balances_credits_TokenAmount (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_balances_credits_TokenAmount_destroy < > (ffi : * mut dpp_balances_credits_TokenAmount) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_balances_credits_TokenAmount_get_0 < > (obj : * const dpp_balances_credits_TokenAmount) -> u64 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_balances_credits_TokenAmount_set_0 < > (obj : * const dpp_balances_credits_TokenAmount) -> u64 { (* obj) . 0 } } } pub mod prelude { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DerivationEncryptionKeyIndex`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_prelude_DerivationEncryptionKeyIndex (u32) ; impl ferment :: FFIConversionFrom < dpp :: prelude :: DerivationEncryptionKeyIndex > for dpp_prelude_DerivationEncryptionKeyIndex { unsafe fn ffi_from_const (ffi : * const dpp_prelude_DerivationEncryptionKeyIndex) -> dpp :: prelude :: DerivationEncryptionKeyIndex { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: prelude :: DerivationEncryptionKeyIndex > for dpp_prelude_DerivationEncryptionKeyIndex { unsafe fn ffi_to_const (obj : dpp :: prelude :: DerivationEncryptionKeyIndex) -> * const dpp_prelude_DerivationEncryptionKeyIndex { ferment :: boxed (dpp_prelude_DerivationEncryptionKeyIndex (obj)) } } impl Drop for dpp_prelude_DerivationEncryptionKeyIndex { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_DerivationEncryptionKeyIndex_ctor < > (o_0 : u32) -> * mut dpp_prelude_DerivationEncryptionKeyIndex { ferment :: boxed (dpp_prelude_DerivationEncryptionKeyIndex (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_DerivationEncryptionKeyIndex_destroy < > (ffi : * mut dpp_prelude_DerivationEncryptionKeyIndex) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_DerivationEncryptionKeyIndex_get_0 < > (obj : * const dpp_prelude_DerivationEncryptionKeyIndex) -> u32 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_DerivationEncryptionKeyIndex_set_0 < > (obj : * const dpp_prelude_DerivationEncryptionKeyIndex) -> u32 { (* obj) . 0 } # [doc = "FFI-representation of the [`RecipientKeyIndex`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_prelude_RecipientKeyIndex (u32) ; impl ferment :: FFIConversionFrom < dpp :: prelude :: RecipientKeyIndex > for dpp_prelude_RecipientKeyIndex { unsafe fn ffi_from_const (ffi : * const dpp_prelude_RecipientKeyIndex) -> dpp :: prelude :: RecipientKeyIndex { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: prelude :: RecipientKeyIndex > for dpp_prelude_RecipientKeyIndex { unsafe fn ffi_to_const (obj : dpp :: prelude :: RecipientKeyIndex) -> * const dpp_prelude_RecipientKeyIndex { ferment :: boxed (dpp_prelude_RecipientKeyIndex (obj)) } } impl Drop for dpp_prelude_RecipientKeyIndex { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_RecipientKeyIndex_ctor < > (o_0 : u32) -> * mut dpp_prelude_RecipientKeyIndex { ferment :: boxed (dpp_prelude_RecipientKeyIndex (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_RecipientKeyIndex_destroy < > (ffi : * mut dpp_prelude_RecipientKeyIndex) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_RecipientKeyIndex_get_0 < > (obj : * const dpp_prelude_RecipientKeyIndex) -> u32 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_RecipientKeyIndex_set_0 < > (obj : * const dpp_prelude_RecipientKeyIndex) -> u32 { (* obj) . 0 } # [doc = "FFI-representation of the [`IdentityNonce`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_prelude_IdentityNonce (u64) ; impl ferment :: FFIConversionFrom < dpp :: prelude :: IdentityNonce > for dpp_prelude_IdentityNonce { unsafe fn ffi_from_const (ffi : * const dpp_prelude_IdentityNonce) -> dpp :: prelude :: IdentityNonce { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: prelude :: IdentityNonce > for dpp_prelude_IdentityNonce { unsafe fn ffi_to_const (obj : dpp :: prelude :: IdentityNonce) -> * const dpp_prelude_IdentityNonce { ferment :: boxed (dpp_prelude_IdentityNonce (obj)) } } impl Drop for dpp_prelude_IdentityNonce { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_IdentityNonce_ctor < > (o_0 : u64) -> * mut dpp_prelude_IdentityNonce { ferment :: boxed (dpp_prelude_IdentityNonce (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_IdentityNonce_destroy < > (ffi : * mut dpp_prelude_IdentityNonce) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_IdentityNonce_get_0 < > (obj : * const dpp_prelude_IdentityNonce) -> u64 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_IdentityNonce_set_0 < > (obj : * const dpp_prelude_IdentityNonce) -> u64 { (* obj) . 0 } # [doc = "FFI-representation of the [`SenderKeyIndex`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_prelude_SenderKeyIndex (u32) ; impl ferment :: FFIConversionFrom < dpp :: prelude :: SenderKeyIndex > for dpp_prelude_SenderKeyIndex { unsafe fn ffi_from_const (ffi : * const dpp_prelude_SenderKeyIndex) -> dpp :: prelude :: SenderKeyIndex { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: prelude :: SenderKeyIndex > for dpp_prelude_SenderKeyIndex { unsafe fn ffi_to_const (obj : dpp :: prelude :: SenderKeyIndex) -> * const dpp_prelude_SenderKeyIndex { ferment :: boxed (dpp_prelude_SenderKeyIndex (obj)) } } impl Drop for dpp_prelude_SenderKeyIndex { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_SenderKeyIndex_ctor < > (o_0 : u32) -> * mut dpp_prelude_SenderKeyIndex { ferment :: boxed (dpp_prelude_SenderKeyIndex (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_SenderKeyIndex_destroy < > (ffi : * mut dpp_prelude_SenderKeyIndex) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_SenderKeyIndex_get_0 < > (obj : * const dpp_prelude_SenderKeyIndex) -> u32 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_SenderKeyIndex_set_0 < > (obj : * const dpp_prelude_SenderKeyIndex) -> u32 { (* obj) . 0 } # [doc = "FFI-representation of the [`CoreBlockHeight`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_prelude_CoreBlockHeight (u32) ; impl ferment :: FFIConversionFrom < dpp :: prelude :: CoreBlockHeight > for dpp_prelude_CoreBlockHeight { unsafe fn ffi_from_const (ffi : * const dpp_prelude_CoreBlockHeight) -> dpp :: prelude :: CoreBlockHeight { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: prelude :: CoreBlockHeight > for dpp_prelude_CoreBlockHeight { unsafe fn ffi_to_const (obj : dpp :: prelude :: CoreBlockHeight) -> * const dpp_prelude_CoreBlockHeight { ferment :: boxed (dpp_prelude_CoreBlockHeight (obj)) } } impl Drop for dpp_prelude_CoreBlockHeight { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_CoreBlockHeight_ctor < > (o_0 : u32) -> * mut dpp_prelude_CoreBlockHeight { ferment :: boxed (dpp_prelude_CoreBlockHeight (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_CoreBlockHeight_destroy < > (ffi : * mut dpp_prelude_CoreBlockHeight) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_CoreBlockHeight_get_0 < > (obj : * const dpp_prelude_CoreBlockHeight) -> u32 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_CoreBlockHeight_set_0 < > (obj : * const dpp_prelude_CoreBlockHeight) -> u32 { (* obj) . 0 } # [doc = "FFI-representation of the [`UserFeeIncrease`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_prelude_UserFeeIncrease (u16) ; impl ferment :: FFIConversionFrom < dpp :: prelude :: UserFeeIncrease > for dpp_prelude_UserFeeIncrease { unsafe fn ffi_from_const (ffi : * const dpp_prelude_UserFeeIncrease) -> dpp :: prelude :: UserFeeIncrease { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: prelude :: UserFeeIncrease > for dpp_prelude_UserFeeIncrease { unsafe fn ffi_to_const (obj : dpp :: prelude :: UserFeeIncrease) -> * const dpp_prelude_UserFeeIncrease { ferment :: boxed (dpp_prelude_UserFeeIncrease (obj)) } } impl Drop for dpp_prelude_UserFeeIncrease { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_UserFeeIncrease_ctor < > (o_0 : u16) -> * mut dpp_prelude_UserFeeIncrease { ferment :: boxed (dpp_prelude_UserFeeIncrease (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_UserFeeIncrease_destroy < > (ffi : * mut dpp_prelude_UserFeeIncrease) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_UserFeeIncrease_get_0 < > (obj : * const dpp_prelude_UserFeeIncrease) -> u16 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_UserFeeIncrease_set_0 < > (obj : * const dpp_prelude_UserFeeIncrease) -> u16 { (* obj) . 0 } # [doc = "FFI-representation of the [`BlockHeight`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_prelude_BlockHeight (u64) ; impl ferment :: FFIConversionFrom < dpp :: prelude :: BlockHeight > for dpp_prelude_BlockHeight { unsafe fn ffi_from_const (ffi : * const dpp_prelude_BlockHeight) -> dpp :: prelude :: BlockHeight { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: prelude :: BlockHeight > for dpp_prelude_BlockHeight { unsafe fn ffi_to_const (obj : dpp :: prelude :: BlockHeight) -> * const dpp_prelude_BlockHeight { ferment :: boxed (dpp_prelude_BlockHeight (obj)) } } impl Drop for dpp_prelude_BlockHeight { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_BlockHeight_ctor < > (o_0 : u64) -> * mut dpp_prelude_BlockHeight { ferment :: boxed (dpp_prelude_BlockHeight (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_BlockHeight_destroy < > (ffi : * mut dpp_prelude_BlockHeight) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_BlockHeight_get_0 < > (obj : * const dpp_prelude_BlockHeight) -> u64 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_BlockHeight_set_0 < > (obj : * const dpp_prelude_BlockHeight) -> u64 { (* obj) . 0 } # [doc = "FFI-representation of the [`TimestampIncluded`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_prelude_TimestampIncluded (bool) ; impl ferment :: FFIConversionFrom < dpp :: prelude :: TimestampIncluded > for dpp_prelude_TimestampIncluded { unsafe fn ffi_from_const (ffi : * const dpp_prelude_TimestampIncluded) -> dpp :: prelude :: TimestampIncluded { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: prelude :: TimestampIncluded > for dpp_prelude_TimestampIncluded { unsafe fn ffi_to_const (obj : dpp :: prelude :: TimestampIncluded) -> * const dpp_prelude_TimestampIncluded { ferment :: boxed (dpp_prelude_TimestampIncluded (obj)) } } impl Drop for dpp_prelude_TimestampIncluded { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_TimestampIncluded_ctor < > (o_0 : bool) -> * mut dpp_prelude_TimestampIncluded { ferment :: boxed (dpp_prelude_TimestampIncluded (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_TimestampIncluded_destroy < > (ffi : * mut dpp_prelude_TimestampIncluded) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_TimestampIncluded_get_0 < > (obj : * const dpp_prelude_TimestampIncluded) -> bool { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_TimestampIncluded_set_0 < > (obj : * const dpp_prelude_TimestampIncluded) -> bool { (* obj) . 0 } # [doc = "FFI-representation of the [`RootEncryptionKeyIndex`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_prelude_RootEncryptionKeyIndex (u32) ; impl ferment :: FFIConversionFrom < dpp :: prelude :: RootEncryptionKeyIndex > for dpp_prelude_RootEncryptionKeyIndex { unsafe fn ffi_from_const (ffi : * const dpp_prelude_RootEncryptionKeyIndex) -> dpp :: prelude :: RootEncryptionKeyIndex { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: prelude :: RootEncryptionKeyIndex > for dpp_prelude_RootEncryptionKeyIndex { unsafe fn ffi_to_const (obj : dpp :: prelude :: RootEncryptionKeyIndex) -> * const dpp_prelude_RootEncryptionKeyIndex { ferment :: boxed (dpp_prelude_RootEncryptionKeyIndex (obj)) } } impl Drop for dpp_prelude_RootEncryptionKeyIndex { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_RootEncryptionKeyIndex_ctor < > (o_0 : u32) -> * mut dpp_prelude_RootEncryptionKeyIndex { ferment :: boxed (dpp_prelude_RootEncryptionKeyIndex (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_RootEncryptionKeyIndex_destroy < > (ffi : * mut dpp_prelude_RootEncryptionKeyIndex) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_RootEncryptionKeyIndex_get_0 < > (obj : * const dpp_prelude_RootEncryptionKeyIndex) -> u32 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_RootEncryptionKeyIndex_set_0 < > (obj : * const dpp_prelude_RootEncryptionKeyIndex) -> u32 { (* obj) . 0 } # [doc = "FFI-representation of the [`TimestampMillis`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_prelude_TimestampMillis (u64) ; impl ferment :: FFIConversionFrom < dpp :: prelude :: TimestampMillis > for dpp_prelude_TimestampMillis { unsafe fn ffi_from_const (ffi : * const dpp_prelude_TimestampMillis) -> dpp :: prelude :: TimestampMillis { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: prelude :: TimestampMillis > for dpp_prelude_TimestampMillis { unsafe fn ffi_to_const (obj : dpp :: prelude :: TimestampMillis) -> * const dpp_prelude_TimestampMillis { ferment :: boxed (dpp_prelude_TimestampMillis (obj)) } } impl Drop for dpp_prelude_TimestampMillis { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_TimestampMillis_ctor < > (o_0 : u64) -> * mut dpp_prelude_TimestampMillis { ferment :: boxed (dpp_prelude_TimestampMillis (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_TimestampMillis_destroy < > (ffi : * mut dpp_prelude_TimestampMillis) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_TimestampMillis_get_0 < > (obj : * const dpp_prelude_TimestampMillis) -> u64 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_TimestampMillis_set_0 < > (obj : * const dpp_prelude_TimestampMillis) -> u64 { (* obj) . 0 } # [doc = "FFI-representation of the [`Revision`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_prelude_Revision (u64) ; impl ferment :: FFIConversionFrom < dpp :: prelude :: Revision > for dpp_prelude_Revision { unsafe fn ffi_from_const (ffi : * const dpp_prelude_Revision) -> dpp :: prelude :: Revision { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: prelude :: Revision > for dpp_prelude_Revision { unsafe fn ffi_to_const (obj : dpp :: prelude :: Revision) -> * const dpp_prelude_Revision { ferment :: boxed (dpp_prelude_Revision (obj)) } } impl Drop for dpp_prelude_Revision { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_Revision_ctor < > (o_0 : u64) -> * mut dpp_prelude_Revision { ferment :: boxed (dpp_prelude_Revision (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_Revision_destroy < > (ffi : * mut dpp_prelude_Revision) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_Revision_get_0 < > (obj : * const dpp_prelude_Revision) -> u64 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_Revision_set_0 < > (obj : * const dpp_prelude_Revision) -> u64 { (* obj) . 0 } # [doc = "FFI-representation of the [`TimestampMillisInterval`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_prelude_TimestampMillisInterval (u64) ; impl ferment :: FFIConversionFrom < dpp :: prelude :: TimestampMillisInterval > for dpp_prelude_TimestampMillisInterval { unsafe fn ffi_from_const (ffi : * const dpp_prelude_TimestampMillisInterval) -> dpp :: prelude :: TimestampMillisInterval { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: prelude :: TimestampMillisInterval > for dpp_prelude_TimestampMillisInterval { unsafe fn ffi_to_const (obj : dpp :: prelude :: TimestampMillisInterval) -> * const dpp_prelude_TimestampMillisInterval { ferment :: boxed (dpp_prelude_TimestampMillisInterval (obj)) } } impl Drop for dpp_prelude_TimestampMillisInterval { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_TimestampMillisInterval_ctor < > (o_0 : u64) -> * mut dpp_prelude_TimestampMillisInterval { ferment :: boxed (dpp_prelude_TimestampMillisInterval (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_TimestampMillisInterval_destroy < > (ffi : * mut dpp_prelude_TimestampMillisInterval) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_TimestampMillisInterval_get_0 < > (obj : * const dpp_prelude_TimestampMillisInterval) -> u64 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_TimestampMillisInterval_set_0 < > (obj : * const dpp_prelude_TimestampMillisInterval) -> u64 { (* obj) . 0 } # [doc = "FFI-representation of the [`StartAtIncluded`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_prelude_StartAtIncluded (bool) ; impl ferment :: FFIConversionFrom < dpp :: prelude :: StartAtIncluded > for dpp_prelude_StartAtIncluded { unsafe fn ffi_from_const (ffi : * const dpp_prelude_StartAtIncluded) -> dpp :: prelude :: StartAtIncluded { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: prelude :: StartAtIncluded > for dpp_prelude_StartAtIncluded { unsafe fn ffi_to_const (obj : dpp :: prelude :: StartAtIncluded) -> * const dpp_prelude_StartAtIncluded { ferment :: boxed (dpp_prelude_StartAtIncluded (obj)) } } impl Drop for dpp_prelude_StartAtIncluded { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_StartAtIncluded_ctor < > (o_0 : bool) -> * mut dpp_prelude_StartAtIncluded { ferment :: boxed (dpp_prelude_StartAtIncluded (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_StartAtIncluded_destroy < > (ffi : * mut dpp_prelude_StartAtIncluded) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_StartAtIncluded_get_0 < > (obj : * const dpp_prelude_StartAtIncluded) -> bool { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_StartAtIncluded_set_0 < > (obj : * const dpp_prelude_StartAtIncluded) -> bool { (* obj) . 0 } # [doc = "FFI-representation of the [`FeeMultiplier`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_prelude_FeeMultiplier (u64) ; impl ferment :: FFIConversionFrom < dpp :: prelude :: FeeMultiplier > for dpp_prelude_FeeMultiplier { unsafe fn ffi_from_const (ffi : * const dpp_prelude_FeeMultiplier) -> dpp :: prelude :: FeeMultiplier { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: prelude :: FeeMultiplier > for dpp_prelude_FeeMultiplier { unsafe fn ffi_to_const (obj : dpp :: prelude :: FeeMultiplier) -> * const dpp_prelude_FeeMultiplier { ferment :: boxed (dpp_prelude_FeeMultiplier (obj)) } } impl Drop for dpp_prelude_FeeMultiplier { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_FeeMultiplier_ctor < > (o_0 : u64) -> * mut dpp_prelude_FeeMultiplier { ferment :: boxed (dpp_prelude_FeeMultiplier (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_FeeMultiplier_destroy < > (ffi : * mut dpp_prelude_FeeMultiplier) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_FeeMultiplier_get_0 < > (obj : * const dpp_prelude_FeeMultiplier) -> u64 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_FeeMultiplier_set_0 < > (obj : * const dpp_prelude_FeeMultiplier) -> u64 { (* obj) . 0 } # [doc = "FFI-representation of the [`EpochInterval`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_prelude_EpochInterval (u16) ; impl ferment :: FFIConversionFrom < dpp :: prelude :: EpochInterval > for dpp_prelude_EpochInterval { unsafe fn ffi_from_const (ffi : * const dpp_prelude_EpochInterval) -> dpp :: prelude :: EpochInterval { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: prelude :: EpochInterval > for dpp_prelude_EpochInterval { unsafe fn ffi_to_const (obj : dpp :: prelude :: EpochInterval) -> * const dpp_prelude_EpochInterval { ferment :: boxed (dpp_prelude_EpochInterval (obj)) } } impl Drop for dpp_prelude_EpochInterval { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_EpochInterval_ctor < > (o_0 : u16) -> * mut dpp_prelude_EpochInterval { ferment :: boxed (dpp_prelude_EpochInterval (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_EpochInterval_destroy < > (ffi : * mut dpp_prelude_EpochInterval) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_EpochInterval_get_0 < > (obj : * const dpp_prelude_EpochInterval) -> u16 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_prelude_EpochInterval_set_0 < > (obj : * const dpp_prelude_EpochInterval) -> u16 { (* obj) . 0 } } # [cfg (feature = "state-transitions")] pub mod state_transition { use crate as dash_spv_apple_bindings ; pub mod state_transitions { use crate as dash_spv_apple_bindings ; pub mod identity { use crate as dash_spv_apple_bindings ; pub mod identity_credit_withdrawal_transition { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityCreditWithdrawalTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0 { pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub amount : u64 , pub core_fee_per_byte : u32 , pub pooling : * mut crate :: fermented :: types :: dpp :: withdrawal :: dpp_withdrawal_Pooling , pub output_script : * mut crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript , pub nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , pub user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , pub signature_public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , pub signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v0 :: IdentityCreditWithdrawalTransitionV0 > for dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v0 :: IdentityCreditWithdrawalTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v0 :: IdentityCreditWithdrawalTransitionV0 { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) , amount : ffi_ref . amount , core_fee_per_byte : ffi_ref . core_fee_per_byte , pooling : < crate :: fermented :: types :: dpp :: withdrawal :: dpp_withdrawal_Pooling as ferment :: FFIConversionFrom < dpp :: withdrawal :: Pooling >> :: ffi_from (ffi_ref . pooling) , output_script : < crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript as ferment :: FFIConversionFrom < dpp :: identity :: core_script :: CoreScript >> :: ffi_from (ffi_ref . output_script) , nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionFrom < dpp :: prelude :: IdentityNonce >> :: ffi_from (ffi_ref . nonce) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionFrom < dpp :: prelude :: UserFeeIncrease >> :: ffi_from (ffi_ref . user_fee_increase) , signature_public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . signature_public_key_id) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionFrom < platform_value :: types :: binary_data :: BinaryData >> :: ffi_from (ffi_ref . signature) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v0 :: IdentityCreditWithdrawalTransitionV0 > for dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v0 :: IdentityCreditWithdrawalTransitionV0) -> * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0 { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) , amount : obj . amount , core_fee_per_byte : obj . core_fee_per_byte , pooling : < crate :: fermented :: types :: dpp :: withdrawal :: dpp_withdrawal_Pooling as ferment :: FFIConversionTo < dpp :: withdrawal :: Pooling >> :: ffi_to (obj . pooling) , output_script : < crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript as ferment :: FFIConversionTo < dpp :: identity :: core_script :: CoreScript >> :: ffi_to (obj . output_script) , nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionTo < dpp :: prelude :: IdentityNonce >> :: ffi_to (obj . nonce) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionTo < dpp :: prelude :: UserFeeIncrease >> :: ffi_to (obj . user_fee_increase) , signature_public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . signature_public_key_id) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionTo < platform_value :: types :: binary_data :: BinaryData >> :: ffi_to (obj . signature) }) } } impl Drop for dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . identity_id) ; ; ; ferment :: unbox_any (ffi_ref . pooling) ; ferment :: unbox_any (ffi_ref . output_script) ; ferment :: unbox_any (ffi_ref . nonce) ; ferment :: unbox_any (ffi_ref . user_fee_increase) ; ferment :: unbox_any (ffi_ref . signature_public_key_id) ; ferment :: unbox_any (ffi_ref . signature) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_ctor < > (identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , amount : u64 , core_fee_per_byte : u32 , pooling : * mut crate :: fermented :: types :: dpp :: withdrawal :: dpp_withdrawal_Pooling , output_script : * mut crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript , nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , signature_public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData) -> * mut dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0 { identity_id , amount , core_fee_per_byte , pooling , output_script , nonce , user_fee_increase , signature_public_key_id , signature }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_get_identity_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_get_amount < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> u64 { (* obj) . amount } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_get_core_fee_per_byte < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> u32 { (* obj) . core_fee_per_byte } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_get_pooling < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> * mut crate :: fermented :: types :: dpp :: withdrawal :: dpp_withdrawal_Pooling { (* obj) . pooling } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_get_output_script < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript { (* obj) . output_script } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_get_nonce < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . nonce } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_get_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_get_signature_public_key_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . signature_public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_get_signature < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_set_identity_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_set_amount < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> u64 { (* obj) . amount } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_set_core_fee_per_byte < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> u32 { (* obj) . core_fee_per_byte } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_set_pooling < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> * mut crate :: fermented :: types :: dpp :: withdrawal :: dpp_withdrawal_Pooling { (* obj) . pooling } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_set_output_script < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript { (* obj) . output_script } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_set_nonce < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . nonce } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_set_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_set_signature_public_key_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . signature_public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0_set_signature < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } } pub mod accessors { use crate as dash_spv_apple_bindings ; } pub mod v1 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityCreditWithdrawalTransitionV1`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1 { pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub amount : u64 , pub core_fee_per_byte : u32 , pub pooling : * mut crate :: fermented :: types :: dpp :: withdrawal :: dpp_withdrawal_Pooling , pub output_script : * mut crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript , pub nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , pub user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , pub signature_public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , pub signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v1 :: IdentityCreditWithdrawalTransitionV1 > for dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v1 :: IdentityCreditWithdrawalTransitionV1 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v1 :: IdentityCreditWithdrawalTransitionV1 { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) , amount : ffi_ref . amount , core_fee_per_byte : ffi_ref . core_fee_per_byte , pooling : < crate :: fermented :: types :: dpp :: withdrawal :: dpp_withdrawal_Pooling as ferment :: FFIConversionFrom < dpp :: withdrawal :: Pooling >> :: ffi_from (ffi_ref . pooling) , output_script : < crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript as ferment :: FFIConversionFrom < dpp :: identity :: core_script :: CoreScript >> :: ffi_from_opt (ffi_ref . output_script) , nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionFrom < dpp :: prelude :: IdentityNonce >> :: ffi_from (ffi_ref . nonce) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionFrom < dpp :: prelude :: UserFeeIncrease >> :: ffi_from (ffi_ref . user_fee_increase) , signature_public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . signature_public_key_id) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionFrom < platform_value :: types :: binary_data :: BinaryData >> :: ffi_from (ffi_ref . signature) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v1 :: IdentityCreditWithdrawalTransitionV1 > for dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v1 :: IdentityCreditWithdrawalTransitionV1) -> * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1 { ferment :: boxed (dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1 { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) , amount : obj . amount , core_fee_per_byte : obj . core_fee_per_byte , pooling : < crate :: fermented :: types :: dpp :: withdrawal :: dpp_withdrawal_Pooling as ferment :: FFIConversionTo < dpp :: withdrawal :: Pooling >> :: ffi_to (obj . pooling) , output_script : < crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript as ferment :: FFIConversionTo < dpp :: identity :: core_script :: CoreScript >> :: ffi_to_opt (obj . output_script) , nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionTo < dpp :: prelude :: IdentityNonce >> :: ffi_to (obj . nonce) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionTo < dpp :: prelude :: UserFeeIncrease >> :: ffi_to (obj . user_fee_increase) , signature_public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . signature_public_key_id) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionTo < platform_value :: types :: binary_data :: BinaryData >> :: ffi_to (obj . signature) }) } } impl Drop for dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . identity_id) ; ; ; ferment :: unbox_any (ffi_ref . pooling) ; ferment :: unbox_any_opt (ffi_ref . output_script) ; ferment :: unbox_any (ffi_ref . nonce) ; ferment :: unbox_any (ffi_ref . user_fee_increase) ; ferment :: unbox_any (ffi_ref . signature_public_key_id) ; ferment :: unbox_any (ffi_ref . signature) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_ctor < > (identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , amount : u64 , core_fee_per_byte : u32 , pooling : * mut crate :: fermented :: types :: dpp :: withdrawal :: dpp_withdrawal_Pooling , output_script : * mut crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript , nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , signature_public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData) -> * mut dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1 { ferment :: boxed (dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1 { identity_id , amount , core_fee_per_byte , pooling , output_script , nonce , user_fee_increase , signature_public_key_id , signature }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_destroy < > (ffi : * mut dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_get_identity_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_get_amount < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> u64 { (* obj) . amount } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_get_core_fee_per_byte < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> u32 { (* obj) . core_fee_per_byte } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_get_pooling < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> * mut crate :: fermented :: types :: dpp :: withdrawal :: dpp_withdrawal_Pooling { (* obj) . pooling } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_get_output_script < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> * mut crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript { (* obj) . output_script } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_get_nonce < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . nonce } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_get_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_get_signature_public_key_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . signature_public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_get_signature < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_set_identity_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_set_amount < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> u64 { (* obj) . amount } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_set_core_fee_per_byte < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> u32 { (* obj) . core_fee_per_byte } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_set_pooling < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> * mut crate :: fermented :: types :: dpp :: withdrawal :: dpp_withdrawal_Pooling { (* obj) . pooling } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_set_output_script < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> * mut crate :: fermented :: types :: dpp :: identity :: core_script :: dpp_identity_core_script_CoreScript { (* obj) . output_script } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_set_nonce < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . nonce } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_set_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_set_signature_public_key_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . signature_public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1_set_signature < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`IdentityCreditWithdrawalTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) , V1 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v1 :: dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: IdentityCreditWithdrawalTransition > for dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition) -> dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: IdentityCreditWithdrawalTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: IdentityCreditWithdrawalTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v0 :: IdentityCreditWithdrawalTransitionV0 >> :: ffi_from (* o_0)) , dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition :: V1 (o_0) => dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: IdentityCreditWithdrawalTransition :: V1 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v1 :: dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v1 :: IdentityCreditWithdrawalTransitionV1 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: IdentityCreditWithdrawalTransition > for dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: IdentityCreditWithdrawalTransition) -> * const dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: IdentityCreditWithdrawalTransition :: V0 (o_0) => dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v0 :: IdentityCreditWithdrawalTransitionV0 >> :: ffi_to (o_0)) , dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: IdentityCreditWithdrawalTransition :: V1 (o_0) => dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition :: V1 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v1 :: dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v1 :: IdentityCreditWithdrawalTransitionV1 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition :: V1 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v0_IdentityCreditWithdrawalTransitionV0) -> * mut dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition { ferment :: boxed (dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition_V1_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: v1 :: dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_v1_IdentityCreditWithdrawalTransitionV1) -> * mut dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition { ferment :: boxed (dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition :: V1 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition) { ferment :: unbox_any (ffi) ; } pub mod methods { use crate as dash_spv_apple_bindings ; } } pub mod identity_topup_transition { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityTopUpTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0 { pub asset_lock_proof : * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof , pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , pub signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: v0 :: IdentityTopUpTransitionV0 > for dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0) -> dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: v0 :: IdentityTopUpTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: v0 :: IdentityTopUpTransitionV0 { asset_lock_proof : < crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof as ferment :: FFIConversionFrom < dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof >> :: ffi_from (ffi_ref . asset_lock_proof) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionFrom < dpp :: prelude :: UserFeeIncrease >> :: ffi_from (ffi_ref . user_fee_increase) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionFrom < platform_value :: types :: binary_data :: BinaryData >> :: ffi_from (ffi_ref . signature) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: v0 :: IdentityTopUpTransitionV0 > for dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: v0 :: IdentityTopUpTransitionV0) -> * const dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0 { asset_lock_proof : < crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof as ferment :: FFIConversionTo < dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof >> :: ffi_to (obj . asset_lock_proof) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionTo < dpp :: prelude :: UserFeeIncrease >> :: ffi_to (obj . user_fee_increase) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionTo < platform_value :: types :: binary_data :: BinaryData >> :: ffi_to (obj . signature) }) } } impl Drop for dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . asset_lock_proof) ; ferment :: unbox_any (ffi_ref . identity_id) ; ferment :: unbox_any (ffi_ref . user_fee_increase) ; ferment :: unbox_any (ffi_ref . signature) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0_ctor < > (asset_lock_proof : * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof , identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData) -> * mut dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0 { asset_lock_proof , identity_id , user_fee_increase , signature }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0_get_asset_lock_proof < > (obj : * const dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof { (* obj) . asset_lock_proof } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0_get_identity_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0_get_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0_get_signature < > (obj : * const dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0_set_asset_lock_proof < > (obj : * const dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof { (* obj) . asset_lock_proof } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0_set_identity_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0_set_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0_set_signature < > (obj : * const dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`IdentityTopUpTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_identity_identity_topup_transition_IdentityTopUpTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: IdentityTopUpTransition > for dpp_state_transition_state_transitions_identity_identity_topup_transition_IdentityTopUpTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_identity_identity_topup_transition_IdentityTopUpTransition) -> dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: IdentityTopUpTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_identity_identity_topup_transition_IdentityTopUpTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: IdentityTopUpTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: v0 :: IdentityTopUpTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: IdentityTopUpTransition > for dpp_state_transition_state_transitions_identity_identity_topup_transition_IdentityTopUpTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: IdentityTopUpTransition) -> * const dpp_state_transition_state_transitions_identity_identity_topup_transition_IdentityTopUpTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: IdentityTopUpTransition :: V0 (o_0) => dpp_state_transition_state_transitions_identity_identity_topup_transition_IdentityTopUpTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: v0 :: IdentityTopUpTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_identity_identity_topup_transition_IdentityTopUpTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_identity_identity_topup_transition_IdentityTopUpTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_topup_transition_IdentityTopUpTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_topup_transition_v0_IdentityTopUpTransitionV0) -> * mut dpp_state_transition_state_transitions_identity_identity_topup_transition_IdentityTopUpTransition { ferment :: boxed (dpp_state_transition_state_transitions_identity_identity_topup_transition_IdentityTopUpTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_topup_transition_IdentityTopUpTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_identity_identity_topup_transition_IdentityTopUpTransition) { ferment :: unbox_any (ffi) ; } pub mod methods { use crate as dash_spv_apple_bindings ; } pub mod accessors { use crate as dash_spv_apple_bindings ; } } pub mod public_key_in_creation { use crate as dash_spv_apple_bindings ; pub mod methods { use crate as dash_spv_apple_bindings ; pub mod duplicated_keys_witness { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "state-transition-signing")] pub mod from_public_key_signed_external { use crate as dash_spv_apple_bindings ; } pub mod duplicated_key_ids_witness { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "state-transition-signing")] pub mod from_public_key_signed_with_private_key { use crate as dash_spv_apple_bindings ; } pub mod validate_identity_public_keys_structure { use crate as dash_spv_apple_bindings ; } pub mod hash { use crate as dash_spv_apple_bindings ; } } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityPublicKeyInCreationV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0 { pub id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , pub key_type : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType , pub purpose : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose , pub security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel , pub contract_bounds : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: contract_bounds :: dpp_identity_identity_public_key_contract_bounds_ContractBounds , pub read_only : bool , pub data : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData , pub signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: v0 :: IdentityPublicKeyInCreationV0 > for dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) -> dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: v0 :: IdentityPublicKeyInCreationV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: v0 :: IdentityPublicKeyInCreationV0 { id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . id) , key_type : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: key_type :: KeyType >> :: ffi_from (ffi_ref . key_type) , purpose : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: purpose :: Purpose >> :: ffi_from (ffi_ref . purpose) , security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_from (ffi_ref . security_level) , contract_bounds : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: contract_bounds :: dpp_identity_identity_public_key_contract_bounds_ContractBounds as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: contract_bounds :: ContractBounds >> :: ffi_from_opt (ffi_ref . contract_bounds) , read_only : ffi_ref . read_only , data : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionFrom < platform_value :: types :: binary_data :: BinaryData >> :: ffi_from (ffi_ref . data) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionFrom < platform_value :: types :: binary_data :: BinaryData >> :: ffi_from (ffi_ref . signature) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: v0 :: IdentityPublicKeyInCreationV0 > for dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: v0 :: IdentityPublicKeyInCreationV0) -> * const dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0 { ferment :: boxed (dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0 { id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . id) , key_type : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: key_type :: KeyType >> :: ffi_to (obj . key_type) , purpose : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: purpose :: Purpose >> :: ffi_to (obj . purpose) , security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_to (obj . security_level) , contract_bounds : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: contract_bounds :: dpp_identity_identity_public_key_contract_bounds_ContractBounds as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: contract_bounds :: ContractBounds >> :: ffi_to_opt (obj . contract_bounds) , read_only : obj . read_only , data : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionTo < platform_value :: types :: binary_data :: BinaryData >> :: ffi_to (obj . data) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionTo < platform_value :: types :: binary_data :: BinaryData >> :: ffi_to (obj . signature) }) } } impl Drop for dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . id) ; ferment :: unbox_any (ffi_ref . key_type) ; ferment :: unbox_any (ffi_ref . purpose) ; ferment :: unbox_any (ffi_ref . security_level) ; ferment :: unbox_any_opt (ffi_ref . contract_bounds) ; ; ferment :: unbox_any (ffi_ref . data) ; ferment :: unbox_any (ffi_ref . signature) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0_ctor < > (id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , key_type : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType , purpose : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose , security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel , contract_bounds : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: contract_bounds :: dpp_identity_identity_public_key_contract_bounds_ContractBounds , read_only : bool , data : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData , signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData) -> * mut dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0 { ferment :: boxed (dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0 { id , key_type , purpose , security_level , contract_bounds , read_only , data , signature }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0_get_id < > (obj : * const dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0_get_key_type < > (obj : * const dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType { (* obj) . key_type } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0_get_purpose < > (obj : * const dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose { (* obj) . purpose } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0_get_security_level < > (obj : * const dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . security_level } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0_get_contract_bounds < > (obj : * const dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: contract_bounds :: dpp_identity_identity_public_key_contract_bounds_ContractBounds { (* obj) . contract_bounds } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0_get_read_only < > (obj : * const dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) -> bool { (* obj) . read_only } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0_get_data < > (obj : * const dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . data } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0_get_signature < > (obj : * const dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0_set_id < > (obj : * const dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0_set_key_type < > (obj : * const dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType { (* obj) . key_type } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0_set_purpose < > (obj : * const dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose { (* obj) . purpose } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0_set_security_level < > (obj : * const dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . security_level } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0_set_contract_bounds < > (obj : * const dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: contract_bounds :: dpp_identity_identity_public_key_contract_bounds_ContractBounds { (* obj) . contract_bounds } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0_set_read_only < > (obj : * const dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) -> bool { (* obj) . read_only } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0_set_data < > (obj : * const dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . data } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0_set_signature < > (obj : * const dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`IdentityPublicKeyInCreation`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: v0 :: dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: IdentityPublicKeyInCreation > for dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation) -> dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: IdentityPublicKeyInCreation { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation :: V0 (o_0) => dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: IdentityPublicKeyInCreation :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: v0 :: dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: v0 :: IdentityPublicKeyInCreationV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: IdentityPublicKeyInCreation > for dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: IdentityPublicKeyInCreation) -> * const dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: IdentityPublicKeyInCreation :: V0 (o_0) => dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: v0 :: dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: v0 :: IdentityPublicKeyInCreationV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: v0 :: dpp_state_transition_state_transitions_identity_public_key_in_creation_v0_IdentityPublicKeyInCreationV0) -> * mut dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation { ferment :: boxed (dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation_destroy < > (ffi : * mut dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation) { ferment :: unbox_any (ffi) ; } } pub mod identity_update_transition { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityUpdateTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0 { pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision , pub nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , pub add_public_keys : * mut crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation , pub disable_public_keys : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID , pub user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , pub signature_public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , pub signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: v0 :: IdentityUpdateTransitionV0 > for dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) -> dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: v0 :: IdentityUpdateTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: v0 :: IdentityUpdateTransitionV0 { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) , revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionFrom < dpp :: prelude :: Revision >> :: ffi_from (ffi_ref . revision) , nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionFrom < dpp :: prelude :: IdentityNonce >> :: ffi_from (ffi_ref . nonce) , add_public_keys : < crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation as ferment :: FFIConversionFrom < Vec < dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: IdentityPublicKeyInCreation > >> :: ffi_from (ffi_ref . add_public_keys) , disable_public_keys : < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < Vec < dpp :: identity :: identity_public_key :: KeyID > >> :: ffi_from (ffi_ref . disable_public_keys) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionFrom < dpp :: prelude :: UserFeeIncrease >> :: ffi_from (ffi_ref . user_fee_increase) , signature_public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . signature_public_key_id) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionFrom < platform_value :: types :: binary_data :: BinaryData >> :: ffi_from (ffi_ref . signature) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: v0 :: IdentityUpdateTransitionV0 > for dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: v0 :: IdentityUpdateTransitionV0) -> * const dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0 { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) , revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionTo < dpp :: prelude :: Revision >> :: ffi_to (obj . revision) , nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionTo < dpp :: prelude :: IdentityNonce >> :: ffi_to (obj . nonce) , add_public_keys : < crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation as ferment :: FFIConversionTo < Vec < dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: IdentityPublicKeyInCreation > >> :: ffi_to (obj . add_public_keys) , disable_public_keys : < crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < Vec < dpp :: identity :: identity_public_key :: KeyID > >> :: ffi_to (obj . disable_public_keys) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionTo < dpp :: prelude :: UserFeeIncrease >> :: ffi_to (obj . user_fee_increase) , signature_public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . signature_public_key_id) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionTo < platform_value :: types :: binary_data :: BinaryData >> :: ffi_to (obj . signature) }) } } impl Drop for dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . identity_id) ; ferment :: unbox_any (ffi_ref . revision) ; ferment :: unbox_any (ffi_ref . nonce) ; ferment :: unbox_any (ffi_ref . add_public_keys) ; ferment :: unbox_any (ffi_ref . disable_public_keys) ; ferment :: unbox_any (ffi_ref . user_fee_increase) ; ferment :: unbox_any (ffi_ref . signature_public_key_id) ; ferment :: unbox_any (ffi_ref . signature) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0_ctor < > (identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision , nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , add_public_keys : * mut crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation , disable_public_keys : * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID , user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , signature_public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData) -> * mut dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0 { identity_id , revision , nonce , add_public_keys , disable_public_keys , user_fee_increase , signature_public_key_id , signature }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0_get_identity_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0_get_revision < > (obj : * const dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . revision } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0_get_nonce < > (obj : * const dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . nonce } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0_get_add_public_keys < > (obj : * const dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) -> * mut crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation { (* obj) . add_public_keys } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0_get_disable_public_keys < > (obj : * const dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) -> * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID { (* obj) . disable_public_keys } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0_get_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0_get_signature_public_key_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . signature_public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0_get_signature < > (obj : * const dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0_set_identity_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0_set_revision < > (obj : * const dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . revision } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0_set_nonce < > (obj : * const dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . nonce } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0_set_add_public_keys < > (obj : * const dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) -> * mut crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation { (* obj) . add_public_keys } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0_set_disable_public_keys < > (obj : * const dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) -> * mut crate :: fermented :: generics :: Vec_dpp_identity_identity_public_key_KeyID { (* obj) . disable_public_keys } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0_set_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0_set_signature_public_key_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . signature_public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0_set_signature < > (obj : * const dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } # [cfg (feature = "state-transition-json-conversion")] pub mod json_conversion { use crate as dash_spv_apple_bindings ; } } pub mod accessors { use crate as dash_spv_apple_bindings ; } pub mod fields { use crate as dash_spv_apple_bindings ; } pub mod methods { use crate as dash_spv_apple_bindings ; } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`IdentityUpdateTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_identity_identity_update_transition_IdentityUpdateTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: IdentityUpdateTransition > for dpp_state_transition_state_transitions_identity_identity_update_transition_IdentityUpdateTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_identity_identity_update_transition_IdentityUpdateTransition) -> dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: IdentityUpdateTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_identity_identity_update_transition_IdentityUpdateTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: IdentityUpdateTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: v0 :: IdentityUpdateTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: IdentityUpdateTransition > for dpp_state_transition_state_transitions_identity_identity_update_transition_IdentityUpdateTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: IdentityUpdateTransition) -> * const dpp_state_transition_state_transitions_identity_identity_update_transition_IdentityUpdateTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: IdentityUpdateTransition :: V0 (o_0) => dpp_state_transition_state_transitions_identity_identity_update_transition_IdentityUpdateTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: v0 :: IdentityUpdateTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_identity_identity_update_transition_IdentityUpdateTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_identity_identity_update_transition_IdentityUpdateTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_IdentityUpdateTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_update_transition_v0_IdentityUpdateTransitionV0) -> * mut dpp_state_transition_state_transitions_identity_identity_update_transition_IdentityUpdateTransition { ferment :: boxed (dpp_state_transition_state_transitions_identity_identity_update_transition_IdentityUpdateTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_update_transition_IdentityUpdateTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_identity_identity_update_transition_IdentityUpdateTransition) { ferment :: unbox_any (ffi) ; } } pub mod identity_credit_transfer_transition { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`IdentityCreditTransferTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_IdentityCreditTransferTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: IdentityCreditTransferTransition > for dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_IdentityCreditTransferTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_IdentityCreditTransferTransition) -> dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: IdentityCreditTransferTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_IdentityCreditTransferTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: IdentityCreditTransferTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: v0 :: IdentityCreditTransferTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: IdentityCreditTransferTransition > for dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_IdentityCreditTransferTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: IdentityCreditTransferTransition) -> * const dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_IdentityCreditTransferTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: IdentityCreditTransferTransition :: V0 (o_0) => dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_IdentityCreditTransferTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: v0 :: IdentityCreditTransferTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_IdentityCreditTransferTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_IdentityCreditTransferTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_IdentityCreditTransferTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0) -> * mut dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_IdentityCreditTransferTransition { ferment :: boxed (dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_IdentityCreditTransferTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_IdentityCreditTransferTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_IdentityCreditTransferTransition) { ferment :: unbox_any (ffi) ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityCreditTransferTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0 { pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub recipient_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub amount : u64 , pub nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , pub user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , pub signature_public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , pub signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: v0 :: IdentityCreditTransferTransitionV0 > for dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0) -> dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: v0 :: IdentityCreditTransferTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: v0 :: IdentityCreditTransferTransitionV0 { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) , recipient_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . recipient_id) , amount : ffi_ref . amount , nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionFrom < dpp :: prelude :: IdentityNonce >> :: ffi_from (ffi_ref . nonce) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionFrom < dpp :: prelude :: UserFeeIncrease >> :: ffi_from (ffi_ref . user_fee_increase) , signature_public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . signature_public_key_id) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionFrom < platform_value :: types :: binary_data :: BinaryData >> :: ffi_from (ffi_ref . signature) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: v0 :: IdentityCreditTransferTransitionV0 > for dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: v0 :: IdentityCreditTransferTransitionV0) -> * const dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0 { identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) , recipient_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . recipient_id) , amount : obj . amount , nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionTo < dpp :: prelude :: IdentityNonce >> :: ffi_to (obj . nonce) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionTo < dpp :: prelude :: UserFeeIncrease >> :: ffi_to (obj . user_fee_increase) , signature_public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . signature_public_key_id) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionTo < platform_value :: types :: binary_data :: BinaryData >> :: ffi_to (obj . signature) }) } } impl Drop for dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . identity_id) ; ferment :: unbox_any (ffi_ref . recipient_id) ; ; ferment :: unbox_any (ffi_ref . nonce) ; ferment :: unbox_any (ffi_ref . user_fee_increase) ; ferment :: unbox_any (ffi_ref . signature_public_key_id) ; ferment :: unbox_any (ffi_ref . signature) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0_ctor < > (identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , recipient_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , amount : u64 , nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , signature_public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData) -> * mut dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0 { identity_id , recipient_id , amount , nonce , user_fee_increase , signature_public_key_id , signature }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0_get_identity_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0_get_recipient_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . recipient_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0_get_amount < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0) -> u64 { (* obj) . amount } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0_get_nonce < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . nonce } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0_get_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0_get_signature_public_key_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . signature_public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0_get_signature < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0_set_identity_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0_set_recipient_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . recipient_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0_set_amount < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0) -> u64 { (* obj) . amount } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0_set_nonce < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . nonce } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0_set_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0_set_signature_public_key_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . signature_public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0_set_signature < > (obj : * const dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_v0_IdentityCreditTransferTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } } pub mod methods { use crate as dash_spv_apple_bindings ; } pub mod accessors { use crate as dash_spv_apple_bindings ; } pub mod fields { use crate as dash_spv_apple_bindings ; } } pub mod masternode_vote_transition { use crate as dash_spv_apple_bindings ; pub mod fields { use crate as dash_spv_apple_bindings ; } pub mod accessors { use crate as dash_spv_apple_bindings ; } pub mod methods { use crate as dash_spv_apple_bindings ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`MasternodeVoteTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0 { pub pro_tx_hash : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub voter_identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub vote : * mut crate :: fermented :: types :: dpp :: voting :: votes :: dpp_voting_votes_Vote , pub nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , pub signature_public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , pub signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: v0 :: MasternodeVoteTransitionV0 > for dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0) -> dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: v0 :: MasternodeVoteTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: v0 :: MasternodeVoteTransitionV0 { pro_tx_hash : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . pro_tx_hash) , voter_identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . voter_identity_id) , vote : < crate :: fermented :: types :: dpp :: voting :: votes :: dpp_voting_votes_Vote as ferment :: FFIConversionFrom < dpp :: voting :: votes :: Vote >> :: ffi_from (ffi_ref . vote) , nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionFrom < dpp :: prelude :: IdentityNonce >> :: ffi_from (ffi_ref . nonce) , signature_public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . signature_public_key_id) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionFrom < platform_value :: types :: binary_data :: BinaryData >> :: ffi_from (ffi_ref . signature) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: v0 :: MasternodeVoteTransitionV0 > for dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: v0 :: MasternodeVoteTransitionV0) -> * const dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0 { pro_tx_hash : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . pro_tx_hash) , voter_identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . voter_identity_id) , vote : < crate :: fermented :: types :: dpp :: voting :: votes :: dpp_voting_votes_Vote as ferment :: FFIConversionTo < dpp :: voting :: votes :: Vote >> :: ffi_to (obj . vote) , nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionTo < dpp :: prelude :: IdentityNonce >> :: ffi_to (obj . nonce) , signature_public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . signature_public_key_id) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionTo < platform_value :: types :: binary_data :: BinaryData >> :: ffi_to (obj . signature) }) } } impl Drop for dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . pro_tx_hash) ; ferment :: unbox_any (ffi_ref . voter_identity_id) ; ferment :: unbox_any (ffi_ref . vote) ; ferment :: unbox_any (ffi_ref . nonce) ; ferment :: unbox_any (ffi_ref . signature_public_key_id) ; ferment :: unbox_any (ffi_ref . signature) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0_ctor < > (pro_tx_hash : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , voter_identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , vote : * mut crate :: fermented :: types :: dpp :: voting :: votes :: dpp_voting_votes_Vote , nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , signature_public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData) -> * mut dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0 { pro_tx_hash , voter_identity_id , vote , nonce , signature_public_key_id , signature }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0_get_pro_tx_hash < > (obj : * const dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0_get_voter_identity_id < > (obj : * const dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . voter_identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0_get_vote < > (obj : * const dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0) -> * mut crate :: fermented :: types :: dpp :: voting :: votes :: dpp_voting_votes_Vote { (* obj) . vote } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0_get_nonce < > (obj : * const dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . nonce } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0_get_signature_public_key_id < > (obj : * const dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . signature_public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0_get_signature < > (obj : * const dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0_set_pro_tx_hash < > (obj : * const dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . pro_tx_hash } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0_set_voter_identity_id < > (obj : * const dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . voter_identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0_set_vote < > (obj : * const dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0) -> * mut crate :: fermented :: types :: dpp :: voting :: votes :: dpp_voting_votes_Vote { (* obj) . vote } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0_set_nonce < > (obj : * const dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . nonce } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0_set_signature_public_key_id < > (obj : * const dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . signature_public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0_set_signature < > (obj : * const dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`MasternodeVoteTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_identity_masternode_vote_transition_MasternodeVoteTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: v0 :: dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: MasternodeVoteTransition > for dpp_state_transition_state_transitions_identity_masternode_vote_transition_MasternodeVoteTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_identity_masternode_vote_transition_MasternodeVoteTransition) -> dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: MasternodeVoteTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_identity_masternode_vote_transition_MasternodeVoteTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: MasternodeVoteTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: v0 :: dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: v0 :: MasternodeVoteTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: MasternodeVoteTransition > for dpp_state_transition_state_transitions_identity_masternode_vote_transition_MasternodeVoteTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: MasternodeVoteTransition) -> * const dpp_state_transition_state_transitions_identity_masternode_vote_transition_MasternodeVoteTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: MasternodeVoteTransition :: V0 (o_0) => dpp_state_transition_state_transitions_identity_masternode_vote_transition_MasternodeVoteTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: v0 :: dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: v0 :: MasternodeVoteTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_identity_masternode_vote_transition_MasternodeVoteTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_identity_masternode_vote_transition_MasternodeVoteTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_masternode_vote_transition_MasternodeVoteTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: v0 :: dpp_state_transition_state_transitions_identity_masternode_vote_transition_v0_MasternodeVoteTransitionV0) -> * mut dpp_state_transition_state_transitions_identity_masternode_vote_transition_MasternodeVoteTransition { ferment :: boxed (dpp_state_transition_state_transitions_identity_masternode_vote_transition_MasternodeVoteTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_masternode_vote_transition_MasternodeVoteTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_identity_masternode_vote_transition_MasternodeVoteTransition) { ferment :: unbox_any (ffi) ; } } pub mod common_fields { use crate as dash_spv_apple_bindings ; } pub mod identity_create_transition { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityCreateTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0 { pub public_keys : * mut crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation , pub asset_lock_proof : * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof , pub user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , pub signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData , pub identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: v0 :: IdentityCreateTransitionV0 > for dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0) -> dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: v0 :: IdentityCreateTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: v0 :: IdentityCreateTransitionV0 { public_keys : < crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation as ferment :: FFIConversionFrom < Vec < dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: IdentityPublicKeyInCreation > >> :: ffi_from (ffi_ref . public_keys) , asset_lock_proof : < crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof as ferment :: FFIConversionFrom < dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof >> :: ffi_from (ffi_ref . asset_lock_proof) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionFrom < dpp :: prelude :: UserFeeIncrease >> :: ffi_from (ffi_ref . user_fee_increase) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionFrom < platform_value :: types :: binary_data :: BinaryData >> :: ffi_from (ffi_ref . signature) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_id) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: v0 :: IdentityCreateTransitionV0 > for dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: v0 :: IdentityCreateTransitionV0) -> * const dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0 { public_keys : < crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation as ferment :: FFIConversionTo < Vec < dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: IdentityPublicKeyInCreation > >> :: ffi_to (obj . public_keys) , asset_lock_proof : < crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof as ferment :: FFIConversionTo < dpp :: identity :: state_transition :: asset_lock_proof :: AssetLockProof >> :: ffi_to (obj . asset_lock_proof) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionTo < dpp :: prelude :: UserFeeIncrease >> :: ffi_to (obj . user_fee_increase) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionTo < platform_value :: types :: binary_data :: BinaryData >> :: ffi_to (obj . signature) , identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_id) }) } } impl Drop for dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . public_keys) ; ferment :: unbox_any (ffi_ref . asset_lock_proof) ; ferment :: unbox_any (ffi_ref . user_fee_increase) ; ferment :: unbox_any (ffi_ref . signature) ; ferment :: unbox_any (ffi_ref . identity_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0_ctor < > (public_keys : * mut crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation , asset_lock_proof : * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof , user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData , identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0 { public_keys , asset_lock_proof , user_fee_increase , signature , identity_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0_get_public_keys < > (obj : * const dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0) -> * mut crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation { (* obj) . public_keys } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0_get_asset_lock_proof < > (obj : * const dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof { (* obj) . asset_lock_proof } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0_get_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0_get_signature < > (obj : * const dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0_get_identity_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0_set_public_keys < > (obj : * const dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0) -> * mut crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation { (* obj) . public_keys } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0_set_asset_lock_proof < > (obj : * const dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: state_transition :: asset_lock_proof :: dpp_identity_state_transition_asset_lock_proof_AssetLockProof { (* obj) . asset_lock_proof } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0_set_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0_set_signature < > (obj : * const dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0_set_identity_id < > (obj : * const dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_id } } pub mod accessors { use crate as dash_spv_apple_bindings ; } pub mod methods { use crate as dash_spv_apple_bindings ; } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`IdentityCreateTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_identity_identity_create_transition_IdentityCreateTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: IdentityCreateTransition > for dpp_state_transition_state_transitions_identity_identity_create_transition_IdentityCreateTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_identity_identity_create_transition_IdentityCreateTransition) -> dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: IdentityCreateTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_identity_identity_create_transition_IdentityCreateTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: IdentityCreateTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: v0 :: IdentityCreateTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: IdentityCreateTransition > for dpp_state_transition_state_transitions_identity_identity_create_transition_IdentityCreateTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: IdentityCreateTransition) -> * const dpp_state_transition_state_transitions_identity_identity_create_transition_IdentityCreateTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: IdentityCreateTransition :: V0 (o_0) => dpp_state_transition_state_transitions_identity_identity_create_transition_IdentityCreateTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: v0 :: IdentityCreateTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_identity_identity_create_transition_IdentityCreateTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_identity_identity_create_transition_IdentityCreateTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_create_transition_IdentityCreateTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: v0 :: dpp_state_transition_state_transitions_identity_identity_create_transition_v0_IdentityCreateTransitionV0) -> * mut dpp_state_transition_state_transitions_identity_identity_create_transition_IdentityCreateTransition { ferment :: boxed (dpp_state_transition_state_transitions_identity_identity_create_transition_IdentityCreateTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_identity_identity_create_transition_IdentityCreateTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_identity_identity_create_transition_IdentityCreateTransition) { ferment :: unbox_any (ffi) ; } } } pub mod common_fields { use crate as dash_spv_apple_bindings ; } pub mod document { use crate as dash_spv_apple_bindings ; pub mod batch_transition { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`BatchTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0 { pub owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub transitions : * mut crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition , pub user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , pub signature_public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , pub signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: v0 :: BatchTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: v0 :: BatchTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: document :: batch_transition :: v0 :: BatchTransitionV0 { owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . owner_id) , transitions : < crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition as ferment :: FFIConversionFrom < Vec < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition > >> :: ffi_from (ffi_ref . transitions) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionFrom < dpp :: prelude :: UserFeeIncrease >> :: ffi_from (ffi_ref . user_fee_increase) , signature_public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . signature_public_key_id) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionFrom < platform_value :: types :: binary_data :: BinaryData >> :: ffi_from (ffi_ref . signature) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: v0 :: BatchTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: v0 :: BatchTransitionV0) -> * const dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0 { owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . owner_id) , transitions : < crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition as ferment :: FFIConversionTo < Vec < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition > >> :: ffi_to (obj . transitions) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionTo < dpp :: prelude :: UserFeeIncrease >> :: ffi_to (obj . user_fee_increase) , signature_public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . signature_public_key_id) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionTo < platform_value :: types :: binary_data :: BinaryData >> :: ffi_to (obj . signature) }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . owner_id) ; ferment :: unbox_any (ffi_ref . transitions) ; ferment :: unbox_any (ffi_ref . user_fee_increase) ; ferment :: unbox_any (ffi_ref . signature_public_key_id) ; ferment :: unbox_any (ffi_ref . signature) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0_ctor < > (owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , transitions : * mut crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition , user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , signature_public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData) -> * mut dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0 { owner_id , transitions , user_fee_increase , signature_public_key_id , signature }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0_get_owner_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . owner_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0_get_transitions < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0) -> * mut crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { (* obj) . transitions } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0_get_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0_get_signature_public_key_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . signature_public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0_get_signature < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0_set_owner_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . owner_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0_set_transitions < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0) -> * mut crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { (* obj) . transitions } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0_set_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0_set_signature_public_key_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . signature_public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0_set_signature < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } } pub mod fields { use crate as dash_spv_apple_bindings ; } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`BatchTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_BatchTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0) , V1 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: v1 :: dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: BatchTransition > for dpp_state_transition_state_transitions_document_batch_transition_BatchTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_BatchTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: BatchTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_BatchTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: BatchTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: v0 :: BatchTransitionV0 >> :: ffi_from (* o_0)) , dpp_state_transition_state_transitions_document_batch_transition_BatchTransition :: V1 (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: BatchTransition :: V1 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: v1 :: dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: v1 :: BatchTransitionV1 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: BatchTransition > for dpp_state_transition_state_transitions_document_batch_transition_BatchTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: BatchTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_BatchTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: BatchTransition :: V0 (o_0) => dpp_state_transition_state_transitions_document_batch_transition_BatchTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: v0 :: BatchTransitionV0 >> :: ffi_to (o_0)) , dpp :: state_transition :: state_transitions :: document :: batch_transition :: BatchTransition :: V1 (o_0) => dpp_state_transition_state_transitions_document_batch_transition_BatchTransition :: V1 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: v1 :: dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: v1 :: BatchTransitionV1 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_BatchTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_BatchTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_state_transitions_document_batch_transition_BatchTransition :: V1 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_BatchTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_v0_BatchTransitionV0) -> * mut dpp_state_transition_state_transitions_document_batch_transition_BatchTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_BatchTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_BatchTransition_V1_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: v1 :: dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1) -> * mut dpp_state_transition_state_transitions_document_batch_transition_BatchTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_BatchTransition :: V1 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_BatchTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_BatchTransition) { ferment :: unbox_any (ffi) ; } pub mod accessors { use crate as dash_spv_apple_bindings ; } pub mod methods { use crate as dash_spv_apple_bindings ; } pub mod resolvers { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "validation")] pub mod validation { use crate as dash_spv_apple_bindings ; pub mod validate_basic_structure { use crate as dash_spv_apple_bindings ; } pub mod find_duplicates_by_id { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; } } } pub mod v1 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`BatchTransitionV1`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1 { pub owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub transitions : * mut crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition , pub user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , pub signature_public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , pub signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: v1 :: BatchTransitionV1 > for dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: v1 :: BatchTransitionV1 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: document :: batch_transition :: v1 :: BatchTransitionV1 { owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . owner_id) , transitions : < crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition as ferment :: FFIConversionFrom < Vec < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: BatchedTransition > >> :: ffi_from (ffi_ref . transitions) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionFrom < dpp :: prelude :: UserFeeIncrease >> :: ffi_from (ffi_ref . user_fee_increase) , signature_public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . signature_public_key_id) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionFrom < platform_value :: types :: binary_data :: BinaryData >> :: ffi_from (ffi_ref . signature) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: v1 :: BatchTransitionV1 > for dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: v1 :: BatchTransitionV1) -> * const dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1 { owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . owner_id) , transitions : < crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition as ferment :: FFIConversionTo < Vec < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: BatchedTransition > >> :: ffi_to (obj . transitions) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionTo < dpp :: prelude :: UserFeeIncrease >> :: ffi_to (obj . user_fee_increase) , signature_public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . signature_public_key_id) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionTo < platform_value :: types :: binary_data :: BinaryData >> :: ffi_to (obj . signature) }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . owner_id) ; ferment :: unbox_any (ffi_ref . transitions) ; ferment :: unbox_any (ffi_ref . user_fee_increase) ; ferment :: unbox_any (ffi_ref . signature_public_key_id) ; ferment :: unbox_any (ffi_ref . signature) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1_ctor < > (owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , transitions : * mut crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition , user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , signature_public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData) -> * mut dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1 { owner_id , transitions , user_fee_increase , signature_public_key_id , signature }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1_get_owner_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . owner_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1_get_transitions < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1) -> * mut crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition { (* obj) . transitions } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1_get_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1_get_signature_public_key_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . signature_public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1_get_signature < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1_set_owner_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . owner_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1_set_transitions < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1) -> * mut crate :: fermented :: generics :: Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition { (* obj) . transitions } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1_set_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1_set_signature_public_key_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . signature_public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1_set_signature < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_v1_BatchTransitionV1) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } } pub mod batched_transition { use crate as dash_spv_apple_bindings ; pub mod document_create_transition { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DocumentCreateTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_DocumentCreateTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: DocumentCreateTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_DocumentCreateTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_DocumentCreateTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: DocumentCreateTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_DocumentCreateTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: DocumentCreateTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: v0 :: DocumentCreateTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: DocumentCreateTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_DocumentCreateTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: DocumentCreateTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_DocumentCreateTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: DocumentCreateTransition :: V0 (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_DocumentCreateTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: v0 :: DocumentCreateTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_DocumentCreateTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_DocumentCreateTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_DocumentCreateTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_DocumentCreateTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_DocumentCreateTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_DocumentCreateTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_DocumentCreateTransition) { ferment :: unbox_any (ffi) ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentCreateTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0 { pub base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition , pub entropy : * mut crate :: fermented :: generics :: Arr_u8_32 , pub data : * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_platform_value_Value , pub prefunded_voting_balance : * mut crate :: fermented :: generics :: Tuple_String_dpp_balances_credits_Credits } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: v0 :: DocumentCreateTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: v0 :: DocumentCreateTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: v0 :: DocumentCreateTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: DocumentBaseTransition >> :: ffi_from (ffi_ref . base) , entropy : < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (ffi_ref . entropy) , data : < crate :: fermented :: generics :: std_collections_Map_keys_String_values_platform_value_Value as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < String , platform_value :: Value > >> :: ffi_from (ffi_ref . data) , prefunded_voting_balance : < crate :: fermented :: generics :: Tuple_String_dpp_balances_credits_Credits as ferment :: FFIConversionFrom < (String , dpp :: balances :: credits :: Credits) >> :: ffi_from_opt (ffi_ref . prefunded_voting_balance) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: v0 :: DocumentCreateTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: v0 :: DocumentCreateTransitionV0) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: DocumentBaseTransition >> :: ffi_to (obj . base) , entropy : < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (obj . entropy) , data : < crate :: fermented :: generics :: std_collections_Map_keys_String_values_platform_value_Value as ferment :: FFIConversionTo < std :: collections :: BTreeMap < String , platform_value :: Value > >> :: ffi_to (obj . data) , prefunded_voting_balance : < crate :: fermented :: generics :: Tuple_String_dpp_balances_credits_Credits as ferment :: FFIConversionTo < (String , dpp :: balances :: credits :: Credits) >> :: ffi_to_opt (obj . prefunded_voting_balance) }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . base) ; ferment :: unbox_any (ffi_ref . entropy) ; ferment :: unbox_any (ffi_ref . data) ; ferment :: unbox_any_opt (ffi_ref . prefunded_voting_balance) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0_ctor < > (base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition , entropy : * mut crate :: fermented :: generics :: Arr_u8_32 , data : * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_platform_value_Value , prefunded_voting_balance : * mut crate :: fermented :: generics :: Tuple_String_dpp_balances_credits_Credits) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0 { base , entropy , data , prefunded_voting_balance }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0_get_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0_get_entropy < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . entropy } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0_get_data < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_platform_value_Value { (* obj) . data } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0_get_prefunded_voting_balance < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0) -> * mut crate :: fermented :: generics :: Tuple_String_dpp_balances_credits_Credits { (* obj) . prefunded_voting_balance } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0_set_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0_set_entropy < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0) -> * mut crate :: fermented :: generics :: Arr_u8_32 { (* obj) . entropy } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0_set_data < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_platform_value_Value { (* obj) . data } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0_set_prefunded_voting_balance < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_v0_DocumentCreateTransitionV0) -> * mut crate :: fermented :: generics :: Tuple_String_dpp_balances_credits_Credits { (* obj) . prefunded_voting_balance } } } pub mod document_transition { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DocumentTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { Create (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_DocumentCreateTransition) , Replace (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_DocumentReplaceTransition) , Delete (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_DocumentDeleteTransition) , Transfer (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_DocumentTransferTransition) , UpdatePrice (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_DocumentUpdatePriceTransition) , Purchase (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_DocumentPurchaseTransition) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Create (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition :: Create (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_DocumentCreateTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: DocumentCreateTransition >> :: ffi_from (* o_0)) , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Replace (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition :: Replace (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_DocumentReplaceTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: DocumentReplaceTransition >> :: ffi_from (* o_0)) , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Delete (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition :: Delete (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_DocumentDeleteTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: DocumentDeleteTransition >> :: ffi_from (* o_0)) , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Transfer (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition :: Transfer (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_DocumentTransferTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: DocumentTransferTransition >> :: ffi_from (* o_0)) , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: UpdatePrice (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition :: UpdatePrice (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_DocumentUpdatePriceTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: DocumentUpdatePriceTransition >> :: ffi_from (* o_0)) , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Purchase (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition :: Purchase (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_DocumentPurchaseTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: DocumentPurchaseTransition >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition :: Create (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Create (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_DocumentCreateTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: DocumentCreateTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition :: Replace (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Replace (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_DocumentReplaceTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: DocumentReplaceTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition :: Delete (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Delete (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_DocumentDeleteTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: DocumentDeleteTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition :: Transfer (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Transfer (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_DocumentTransferTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: DocumentTransferTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition :: UpdatePrice (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: UpdatePrice (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_DocumentUpdatePriceTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: DocumentUpdatePriceTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition :: Purchase (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Purchase (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_DocumentPurchaseTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: DocumentPurchaseTransition >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Create (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Replace (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Delete (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Transfer (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: UpdatePrice (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Purchase (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition_Create_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_create_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_create_transition_DocumentCreateTransition) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Create (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition_Replace_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_DocumentReplaceTransition) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Replace (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition_Delete_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_DocumentDeleteTransition) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Delete (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition_Transfer_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_DocumentTransferTransition) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Transfer (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition_UpdatePrice_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_DocumentUpdatePriceTransition) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: UpdatePrice (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition_Purchase_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_DocumentPurchaseTransition) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition :: Purchase (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition) { ferment :: unbox_any (ffi) ; } } pub mod document_update_price_transition { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentUpdatePriceTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0 { pub base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition , pub revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision , pub price : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: v0 :: DocumentUpdatePriceTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: v0 :: DocumentUpdatePriceTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: v0 :: DocumentUpdatePriceTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: DocumentBaseTransition >> :: ffi_from (ffi_ref . base) , revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionFrom < dpp :: prelude :: Revision >> :: ffi_from (ffi_ref . revision) , price : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionFrom < dpp :: balances :: credits :: Credits >> :: ffi_from (ffi_ref . price) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: v0 :: DocumentUpdatePriceTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: v0 :: DocumentUpdatePriceTransitionV0) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: DocumentBaseTransition >> :: ffi_to (obj . base) , revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionTo < dpp :: prelude :: Revision >> :: ffi_to (obj . revision) , price : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionTo < dpp :: balances :: credits :: Credits >> :: ffi_to (obj . price) }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . base) ; ferment :: unbox_any (ffi_ref . revision) ; ferment :: unbox_any (ffi_ref . price) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0_ctor < > (base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition , revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision , price : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0 { base , revision , price }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0_get_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0_get_revision < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . revision } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0_get_price < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . price } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0_set_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0_set_revision < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . revision } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0_set_price < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . price } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DocumentUpdatePriceTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_DocumentUpdatePriceTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: DocumentUpdatePriceTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_DocumentUpdatePriceTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_DocumentUpdatePriceTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: DocumentUpdatePriceTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_DocumentUpdatePriceTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: DocumentUpdatePriceTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: v0 :: DocumentUpdatePriceTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: DocumentUpdatePriceTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_DocumentUpdatePriceTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: DocumentUpdatePriceTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_DocumentUpdatePriceTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: DocumentUpdatePriceTransition :: V0 (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_DocumentUpdatePriceTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: v0 :: DocumentUpdatePriceTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_DocumentUpdatePriceTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_DocumentUpdatePriceTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_DocumentUpdatePriceTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_update_price_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_v0_DocumentUpdatePriceTransitionV0) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_DocumentUpdatePriceTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_DocumentUpdatePriceTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_DocumentUpdatePriceTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_update_price_transition_DocumentUpdatePriceTransition) { ferment :: unbox_any (ffi) ; } } pub mod token_transition { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`TokenTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition { Burn (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_TokenBurnTransition) , Mint (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_TokenMintTransition) , Transfer (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_TokenTransferTransition) , Freeze (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_TokenFreezeTransition) , Unfreeze (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_TokenUnfreezeTransition) , DestroyFrozenFunds (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_TokenDestroyFrozenFundsTransition) , Claim (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_TokenClaimTransition) , EmergencyAction (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_TokenEmergencyActionTransition) , ConfigUpdate (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_TokenConfigUpdateTransition) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Burn (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition :: Burn (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_TokenBurnTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: TokenBurnTransition >> :: ffi_from (* o_0)) , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Mint (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition :: Mint (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_TokenMintTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: TokenMintTransition >> :: ffi_from (* o_0)) , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Transfer (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition :: Transfer (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_TokenTransferTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: TokenTransferTransition >> :: ffi_from (* o_0)) , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Freeze (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition :: Freeze (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_TokenFreezeTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: TokenFreezeTransition >> :: ffi_from (* o_0)) , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Unfreeze (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition :: Unfreeze (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_TokenUnfreezeTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: TokenUnfreezeTransition >> :: ffi_from (* o_0)) , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: DestroyFrozenFunds (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition :: DestroyFrozenFunds (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_TokenDestroyFrozenFundsTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: TokenDestroyFrozenFundsTransition >> :: ffi_from (* o_0)) , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Claim (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition :: Claim (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_TokenClaimTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: TokenClaimTransition >> :: ffi_from (* o_0)) , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: EmergencyAction (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition :: EmergencyAction (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_TokenEmergencyActionTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: TokenEmergencyActionTransition >> :: ffi_from (* o_0)) , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: ConfigUpdate (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition :: ConfigUpdate (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_TokenConfigUpdateTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: TokenConfigUpdateTransition >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition :: Burn (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Burn (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_TokenBurnTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: TokenBurnTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition :: Mint (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Mint (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_TokenMintTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: TokenMintTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition :: Transfer (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Transfer (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_TokenTransferTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: TokenTransferTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition :: Freeze (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Freeze (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_TokenFreezeTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: TokenFreezeTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition :: Unfreeze (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Unfreeze (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_TokenUnfreezeTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: TokenUnfreezeTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition :: DestroyFrozenFunds (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: DestroyFrozenFunds (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_TokenDestroyFrozenFundsTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: TokenDestroyFrozenFundsTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition :: Claim (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Claim (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_TokenClaimTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: TokenClaimTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition :: EmergencyAction (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: EmergencyAction (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_TokenEmergencyActionTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: TokenEmergencyActionTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition :: ConfigUpdate (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: ConfigUpdate (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_TokenConfigUpdateTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: TokenConfigUpdateTransition >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Burn (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Mint (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Transfer (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Freeze (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Unfreeze (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: DestroyFrozenFunds (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Claim (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: EmergencyAction (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: ConfigUpdate (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition_Burn_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_TokenBurnTransition) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Burn (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition_Mint_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_TokenMintTransition) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Mint (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition_Transfer_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_TokenTransferTransition) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Transfer (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition_Freeze_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_TokenFreezeTransition) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Freeze (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition_Unfreeze_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_TokenUnfreezeTransition) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Unfreeze (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition_DestroyFrozenFunds_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_TokenDestroyFrozenFundsTransition) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: DestroyFrozenFunds (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition_Claim_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_TokenClaimTransition) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: Claim (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition_EmergencyAction_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_TokenEmergencyActionTransition) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: EmergencyAction (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition_ConfigUpdate_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_TokenConfigUpdateTransition) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition :: ConfigUpdate (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition) { ferment :: unbox_any (ffi) ; } } pub mod document_replace_transition { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DocumentReplaceTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_DocumentReplaceTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: DocumentReplaceTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_DocumentReplaceTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_DocumentReplaceTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: DocumentReplaceTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_DocumentReplaceTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: DocumentReplaceTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: v0 :: DocumentReplaceTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: DocumentReplaceTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_DocumentReplaceTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: DocumentReplaceTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_DocumentReplaceTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: DocumentReplaceTransition :: V0 (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_DocumentReplaceTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: v0 :: DocumentReplaceTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_DocumentReplaceTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_DocumentReplaceTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_DocumentReplaceTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_DocumentReplaceTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_DocumentReplaceTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_DocumentReplaceTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_DocumentReplaceTransition) { ferment :: unbox_any (ffi) ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentReplaceTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0 { pub base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition , pub revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision , pub data : * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_platform_value_Value } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: v0 :: DocumentReplaceTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: v0 :: DocumentReplaceTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: v0 :: DocumentReplaceTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: DocumentBaseTransition >> :: ffi_from (ffi_ref . base) , revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionFrom < dpp :: prelude :: Revision >> :: ffi_from (ffi_ref . revision) , data : < crate :: fermented :: generics :: std_collections_Map_keys_String_values_platform_value_Value as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < String , platform_value :: Value > >> :: ffi_from (ffi_ref . data) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: v0 :: DocumentReplaceTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_replace_transition :: v0 :: DocumentReplaceTransitionV0) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: DocumentBaseTransition >> :: ffi_to (obj . base) , revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionTo < dpp :: prelude :: Revision >> :: ffi_to (obj . revision) , data : < crate :: fermented :: generics :: std_collections_Map_keys_String_values_platform_value_Value as ferment :: FFIConversionTo < std :: collections :: BTreeMap < String , platform_value :: Value > >> :: ffi_to (obj . data) }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . base) ; ferment :: unbox_any (ffi_ref . revision) ; ferment :: unbox_any (ffi_ref . data) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0_ctor < > (base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition , revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision , data : * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_platform_value_Value) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0 { base , revision , data }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0_get_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0_get_revision < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . revision } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0_get_data < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_platform_value_Value { (* obj) . data } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0_set_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0_set_revision < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . revision } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0_set_data < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_replace_transition_v0_DocumentReplaceTransitionV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_platform_value_Value { (* obj) . data } } } pub mod token_freeze_transition { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`TokenFreezeTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_TokenFreezeTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: TokenFreezeTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_TokenFreezeTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_TokenFreezeTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: TokenFreezeTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_TokenFreezeTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: TokenFreezeTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: v0 :: TokenFreezeTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: TokenFreezeTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_TokenFreezeTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: TokenFreezeTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_TokenFreezeTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: TokenFreezeTransition :: V0 (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_TokenFreezeTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: v0 :: TokenFreezeTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_TokenFreezeTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_TokenFreezeTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_TokenFreezeTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_TokenFreezeTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_TokenFreezeTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_TokenFreezeTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_TokenFreezeTransition) { ferment :: unbox_any (ffi) ; } pub mod validate_structure { use crate as dash_spv_apple_bindings ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TokenFreezeTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0 { pub base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition , pub identity_to_freeze_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub public_note : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: v0 :: TokenFreezeTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: v0 :: TokenFreezeTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: v0 :: TokenFreezeTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition >> :: ffi_from (ffi_ref . base) , identity_to_freeze_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . identity_to_freeze_id) , public_note : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (ffi_ref . public_note) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: v0 :: TokenFreezeTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_freeze_transition :: v0 :: TokenFreezeTransitionV0) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition >> :: ffi_to (obj . base) , identity_to_freeze_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . identity_to_freeze_id) , public_note : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj . public_note) }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . base) ; ferment :: unbox_any (ffi_ref . identity_to_freeze_id) ; ferment :: unbox_any_opt (ffi_ref . public_note) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0_ctor < > (base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition , identity_to_freeze_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , public_note : * mut std :: os :: raw :: c_char) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0 { base , identity_to_freeze_id , public_note }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0_get_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0_get_identity_to_freeze_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_to_freeze_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0_get_public_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . public_note } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0_set_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0_set_identity_to_freeze_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . identity_to_freeze_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0_set_public_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_freeze_transition_v0_TokenFreezeTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . public_note } } } pub mod token_claim_transition { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TokenClaimTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0 { pub base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition , pub distribution_type : * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_distribution_key :: dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType , pub public_note : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: v0 :: TokenClaimTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: v0 :: TokenClaimTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: v0 :: TokenClaimTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition >> :: ffi_from (ffi_ref . base) , distribution_type : < crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_distribution_key :: dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType as ferment :: FFIConversionFrom < dpp :: data_contract :: associated_token :: token_distribution_key :: TokenDistributionType >> :: ffi_from (ffi_ref . distribution_type) , public_note : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (ffi_ref . public_note) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: v0 :: TokenClaimTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: v0 :: TokenClaimTransitionV0) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition >> :: ffi_to (obj . base) , distribution_type : < crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_distribution_key :: dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType as ferment :: FFIConversionTo < dpp :: data_contract :: associated_token :: token_distribution_key :: TokenDistributionType >> :: ffi_to (obj . distribution_type) , public_note : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj . public_note) }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . base) ; ferment :: unbox_any (ffi_ref . distribution_type) ; ferment :: unbox_any_opt (ffi_ref . public_note) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0_ctor < > (base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition , distribution_type : * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_distribution_key :: dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType , public_note : * mut std :: os :: raw :: c_char) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0 { base , distribution_type , public_note }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0_get_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0_get_distribution_type < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_distribution_key :: dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType { (* obj) . distribution_type } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0_get_public_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . public_note } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0_set_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0_set_distribution_type < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_distribution_key :: dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType { (* obj) . distribution_type } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0_set_public_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . public_note } } pub mod validate_structure { use crate as dash_spv_apple_bindings ; } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`TokenClaimTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_TokenClaimTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: TokenClaimTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_TokenClaimTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_TokenClaimTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: TokenClaimTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_TokenClaimTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: TokenClaimTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: v0 :: TokenClaimTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: TokenClaimTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_TokenClaimTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: TokenClaimTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_TokenClaimTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: TokenClaimTransition :: V0 (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_TokenClaimTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: v0 :: TokenClaimTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_TokenClaimTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_TokenClaimTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_TokenClaimTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_claim_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_v0_TokenClaimTransitionV0) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_TokenClaimTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_TokenClaimTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_TokenClaimTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_claim_transition_TokenClaimTransition) { ferment :: unbox_any (ffi) ; } } pub mod document_purchase_transition { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DocumentPurchaseTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_DocumentPurchaseTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: DocumentPurchaseTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_DocumentPurchaseTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_DocumentPurchaseTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: DocumentPurchaseTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_DocumentPurchaseTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: DocumentPurchaseTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: v0 :: DocumentPurchaseTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: DocumentPurchaseTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_DocumentPurchaseTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: DocumentPurchaseTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_DocumentPurchaseTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: DocumentPurchaseTransition :: V0 (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_DocumentPurchaseTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: v0 :: DocumentPurchaseTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_DocumentPurchaseTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_DocumentPurchaseTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_DocumentPurchaseTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_DocumentPurchaseTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_DocumentPurchaseTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_DocumentPurchaseTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_DocumentPurchaseTransition) { ferment :: unbox_any (ffi) ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentPurchaseTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0 { pub base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition , pub revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision , pub price : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: v0 :: DocumentPurchaseTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: v0 :: DocumentPurchaseTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: v0 :: DocumentPurchaseTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: DocumentBaseTransition >> :: ffi_from (ffi_ref . base) , revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionFrom < dpp :: prelude :: Revision >> :: ffi_from (ffi_ref . revision) , price : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionFrom < dpp :: balances :: credits :: Credits >> :: ffi_from (ffi_ref . price) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: v0 :: DocumentPurchaseTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_purchase_transition :: v0 :: DocumentPurchaseTransitionV0) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: DocumentBaseTransition >> :: ffi_to (obj . base) , revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionTo < dpp :: prelude :: Revision >> :: ffi_to (obj . revision) , price : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits as ferment :: FFIConversionTo < dpp :: balances :: credits :: Credits >> :: ffi_to (obj . price) }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . base) ; ferment :: unbox_any (ffi_ref . revision) ; ferment :: unbox_any (ffi_ref . price) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0_ctor < > (base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition , revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision , price : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0 { base , revision , price }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0_get_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0_get_revision < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . revision } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0_get_price < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . price } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0_set_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0_set_revision < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . revision } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0_set_price < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_purchase_transition_v0_DocumentPurchaseTransitionV0) -> * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits { (* obj) . price } } } pub mod token_burn_transition { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TokenBurnTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0 { pub base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition , pub burn_amount : u64 , pub public_note : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: v0 :: TokenBurnTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: v0 :: TokenBurnTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: v0 :: TokenBurnTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition >> :: ffi_from (ffi_ref . base) , burn_amount : ffi_ref . burn_amount , public_note : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (ffi_ref . public_note) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: v0 :: TokenBurnTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: v0 :: TokenBurnTransitionV0) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition >> :: ffi_to (obj . base) , burn_amount : obj . burn_amount , public_note : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj . public_note) }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . base) ; ; ferment :: unbox_any_opt (ffi_ref . public_note) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0_ctor < > (base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition , burn_amount : u64 , public_note : * mut std :: os :: raw :: c_char) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0 { base , burn_amount , public_note }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0_get_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0_get_burn_amount < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0) -> u64 { (* obj) . burn_amount } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0_get_public_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . public_note } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0_set_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0_set_burn_amount < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0) -> u64 { (* obj) . burn_amount } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0_set_public_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . public_note } } pub mod validate_structure { use crate as dash_spv_apple_bindings ; } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`TokenBurnTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_TokenBurnTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: TokenBurnTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_TokenBurnTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_TokenBurnTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: TokenBurnTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_TokenBurnTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: TokenBurnTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: v0 :: TokenBurnTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: TokenBurnTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_TokenBurnTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: TokenBurnTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_TokenBurnTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: TokenBurnTransition :: V0 (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_TokenBurnTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: v0 :: TokenBurnTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_TokenBurnTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_TokenBurnTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_TokenBurnTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_burn_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_v0_TokenBurnTransitionV0) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_TokenBurnTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_TokenBurnTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_TokenBurnTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_burn_transition_TokenBurnTransition) { ferment :: unbox_any (ffi) ; } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`BatchedTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition { Document (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition) , Token (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: BatchedTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: BatchedTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition :: Document (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: BatchedTransition :: Document (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition >> :: ffi_from (* o_0)) , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition :: Token (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: BatchedTransition :: Token (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: BatchedTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: BatchedTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: BatchedTransition :: Document (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition :: Document (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: BatchedTransition :: Token (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition :: Token (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: TokenTransition >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition :: Document (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition :: Token (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition_Document_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition :: Document (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition_Token_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transition_TokenTransition) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition :: Token (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition) { ferment :: unbox_any (ffi) ; } pub mod document_delete_transition { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentDeleteTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0 { pub base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: v0 :: DocumentDeleteTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: v0 :: DocumentDeleteTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: v0 :: DocumentDeleteTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: DocumentBaseTransition >> :: ffi_from (ffi_ref . base) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: v0 :: DocumentDeleteTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: v0 :: DocumentDeleteTransitionV0) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: DocumentBaseTransition >> :: ffi_to (obj . base) }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . base) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0_ctor < > (base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0 { base }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0_get_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0_set_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition { (* obj) . base } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DocumentDeleteTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_DocumentDeleteTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: DocumentDeleteTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_DocumentDeleteTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_DocumentDeleteTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: DocumentDeleteTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_DocumentDeleteTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: DocumentDeleteTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: v0 :: DocumentDeleteTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: DocumentDeleteTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_DocumentDeleteTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: DocumentDeleteTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_DocumentDeleteTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: DocumentDeleteTransition :: V0 (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_DocumentDeleteTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: v0 :: DocumentDeleteTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_DocumentDeleteTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_DocumentDeleteTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_DocumentDeleteTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_delete_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_v0_DocumentDeleteTransitionV0) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_DocumentDeleteTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_DocumentDeleteTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_DocumentDeleteTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_delete_transition_DocumentDeleteTransition) { ferment :: unbox_any (ffi) ; } } pub mod token_destroy_frozen_funds_transition { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TokenDestroyFrozenFundsTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0 { pub base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition , pub frozen_identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub public_note : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: v0 :: TokenDestroyFrozenFundsTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: v0 :: TokenDestroyFrozenFundsTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: v0 :: TokenDestroyFrozenFundsTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition >> :: ffi_from (ffi_ref . base) , frozen_identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . frozen_identity_id) , public_note : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (ffi_ref . public_note) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: v0 :: TokenDestroyFrozenFundsTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: v0 :: TokenDestroyFrozenFundsTransitionV0) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition >> :: ffi_to (obj . base) , frozen_identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . frozen_identity_id) , public_note : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj . public_note) }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . base) ; ferment :: unbox_any (ffi_ref . frozen_identity_id) ; ferment :: unbox_any_opt (ffi_ref . public_note) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0_ctor < > (base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition , frozen_identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , public_note : * mut std :: os :: raw :: c_char) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0 { base , frozen_identity_id , public_note }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0_get_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0_get_frozen_identity_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . frozen_identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0_get_public_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . public_note } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0_set_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0_set_frozen_identity_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . frozen_identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0_set_public_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . public_note } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`TokenDestroyFrozenFundsTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_TokenDestroyFrozenFundsTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: TokenDestroyFrozenFundsTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_TokenDestroyFrozenFundsTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_TokenDestroyFrozenFundsTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: TokenDestroyFrozenFundsTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_TokenDestroyFrozenFundsTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: TokenDestroyFrozenFundsTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: v0 :: TokenDestroyFrozenFundsTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: TokenDestroyFrozenFundsTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_TokenDestroyFrozenFundsTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: TokenDestroyFrozenFundsTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_TokenDestroyFrozenFundsTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: TokenDestroyFrozenFundsTransition :: V0 (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_TokenDestroyFrozenFundsTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: v0 :: TokenDestroyFrozenFundsTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_TokenDestroyFrozenFundsTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_TokenDestroyFrozenFundsTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_TokenDestroyFrozenFundsTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_destroy_frozen_funds_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_v0_TokenDestroyFrozenFundsTransitionV0) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_TokenDestroyFrozenFundsTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_TokenDestroyFrozenFundsTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_TokenDestroyFrozenFundsTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_destroy_frozen_funds_transition_TokenDestroyFrozenFundsTransition) { ferment :: unbox_any (ffi) ; } pub mod validate_structure { use crate as dash_spv_apple_bindings ; } } pub mod token_base_transition { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`TokenBaseTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: v0 :: TokenBaseTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition :: V0 (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: v0 :: TokenBaseTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition) { ferment :: unbox_any (ffi) ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TokenBaseTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0 { pub identity_contract_nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , pub token_contract_position : u16 , pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub using_group_info : * mut crate :: fermented :: types :: dpp :: group :: dpp_group_GroupStateTransitionInfo } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: v0 :: TokenBaseTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: v0 :: TokenBaseTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: v0 :: TokenBaseTransitionV0 { identity_contract_nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionFrom < dpp :: prelude :: IdentityNonce >> :: ffi_from (ffi_ref . identity_contract_nonce) , token_contract_position : ffi_ref . token_contract_position , data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) , token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . token_id) , using_group_info : < crate :: fermented :: types :: dpp :: group :: dpp_group_GroupStateTransitionInfo as ferment :: FFIConversionFrom < dpp :: group :: GroupStateTransitionInfo >> :: ffi_from_opt (ffi_ref . using_group_info) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: v0 :: TokenBaseTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: v0 :: TokenBaseTransitionV0) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0 { identity_contract_nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionTo < dpp :: prelude :: IdentityNonce >> :: ffi_to (obj . identity_contract_nonce) , token_contract_position : obj . token_contract_position , data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) , token_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . token_id) , using_group_info : < crate :: fermented :: types :: dpp :: group :: dpp_group_GroupStateTransitionInfo as ferment :: FFIConversionTo < dpp :: group :: GroupStateTransitionInfo >> :: ffi_to_opt (obj . using_group_info) }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . identity_contract_nonce) ; ; ferment :: unbox_any (ffi_ref . data_contract_id) ; ferment :: unbox_any (ffi_ref . token_id) ; ferment :: unbox_any_opt (ffi_ref . using_group_info) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0_ctor < > (identity_contract_nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , token_contract_position : u16 , data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , token_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , using_group_info : * mut crate :: fermented :: types :: dpp :: group :: dpp_group_GroupStateTransitionInfo) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0 { identity_contract_nonce , token_contract_position , data_contract_id , token_id , using_group_info }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0_get_identity_contract_nonce < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . identity_contract_nonce } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0_get_token_contract_position < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0) -> u16 { (* obj) . token_contract_position } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0_get_data_contract_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0_get_token_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0_get_using_group_info < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0) -> * mut crate :: fermented :: types :: dpp :: group :: dpp_group_GroupStateTransitionInfo { (* obj) . using_group_info } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0_set_identity_contract_nonce < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . identity_contract_nonce } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0_set_token_contract_position < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0) -> u16 { (* obj) . token_contract_position } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0_set_data_contract_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0_set_token_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . token_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0_set_using_group_info < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_v0_TokenBaseTransitionV0) -> * mut crate :: fermented :: types :: dpp :: group :: dpp_group_GroupStateTransitionInfo { (* obj) . using_group_info } } pub mod fields { use crate as dash_spv_apple_bindings ; } } pub mod token_config_update_transition { use crate as dash_spv_apple_bindings ; pub mod validate_structure { use crate as dash_spv_apple_bindings ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TokenConfigUpdateTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0 { pub base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition , pub update_token_configuration_item : * mut dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationChangeItemFFI , pub public_note : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: v0 :: TokenConfigUpdateTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: v0 :: TokenConfigUpdateTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: v0 :: TokenConfigUpdateTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition >> :: ffi_from (ffi_ref . base) , update_token_configuration_item : < dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationChangeItemFFI as ferment :: FFIConversionFrom < dpp :: data_contract :: associated_token :: token_configuration_item :: TokenConfigurationChangeItem >> :: ffi_from (ffi_ref . update_token_configuration_item) , public_note : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (ffi_ref . public_note) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: v0 :: TokenConfigUpdateTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: v0 :: TokenConfigUpdateTransitionV0) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition >> :: ffi_to (obj . base) , update_token_configuration_item : < dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationChangeItemFFI as ferment :: FFIConversionTo < dpp :: data_contract :: associated_token :: token_configuration_item :: TokenConfigurationChangeItem >> :: ffi_to (obj . update_token_configuration_item) , public_note : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj . public_note) }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . base) ; ferment :: unbox_any (ffi_ref . update_token_configuration_item) ; ferment :: unbox_any_opt (ffi_ref . public_note) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0_ctor < > (base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition , update_token_configuration_item : * mut dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationChangeItemFFI , public_note : * mut std :: os :: raw :: c_char) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0 { base , update_token_configuration_item , public_note }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0_get_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0_get_update_token_configuration_item < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0) -> * mut dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationChangeItemFFI { (* obj) . update_token_configuration_item } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0_get_public_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . public_note } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0_set_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0_set_update_token_configuration_item < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0) -> * mut dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationChangeItemFFI { (* obj) . update_token_configuration_item } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0_set_public_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . public_note } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`TokenConfigUpdateTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_TokenConfigUpdateTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: TokenConfigUpdateTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_TokenConfigUpdateTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_TokenConfigUpdateTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: TokenConfigUpdateTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_TokenConfigUpdateTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: TokenConfigUpdateTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: v0 :: TokenConfigUpdateTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: TokenConfigUpdateTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_TokenConfigUpdateTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: TokenConfigUpdateTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_TokenConfigUpdateTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: TokenConfigUpdateTransition :: V0 (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_TokenConfigUpdateTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: v0 :: TokenConfigUpdateTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_TokenConfigUpdateTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_TokenConfigUpdateTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_TokenConfigUpdateTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_config_update_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_v0_TokenConfigUpdateTransitionV0) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_TokenConfigUpdateTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_TokenConfigUpdateTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_TokenConfigUpdateTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_config_update_transition_TokenConfigUpdateTransition) { ferment :: unbox_any (ffi) ; } } pub mod token_transfer_transition { use crate as dash_spv_apple_bindings ; pub mod validate_structure { use crate as dash_spv_apple_bindings ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TokenTransferTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0 { pub base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition , pub amount : u64 , pub recipient_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub public_note : * mut std :: os :: raw :: c_char , pub shared_encrypted_note : * mut crate :: fermented :: types :: dpp :: tokens :: dpp_tokens_SharedEncryptedNote , pub private_encrypted_note : * mut crate :: fermented :: types :: dpp :: tokens :: dpp_tokens_PrivateEncryptedNote } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: v0 :: TokenTransferTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: v0 :: TokenTransferTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: v0 :: TokenTransferTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition >> :: ffi_from (ffi_ref . base) , amount : ffi_ref . amount , recipient_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . recipient_id) , public_note : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (ffi_ref . public_note) , shared_encrypted_note : < crate :: fermented :: types :: dpp :: tokens :: dpp_tokens_SharedEncryptedNote as ferment :: FFIConversionFrom < dpp :: tokens :: SharedEncryptedNote >> :: ffi_from_opt (ffi_ref . shared_encrypted_note) , private_encrypted_note : < crate :: fermented :: types :: dpp :: tokens :: dpp_tokens_PrivateEncryptedNote as ferment :: FFIConversionFrom < dpp :: tokens :: PrivateEncryptedNote >> :: ffi_from_opt (ffi_ref . private_encrypted_note) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: v0 :: TokenTransferTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: v0 :: TokenTransferTransitionV0) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition >> :: ffi_to (obj . base) , amount : obj . amount , recipient_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . recipient_id) , public_note : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj . public_note) , shared_encrypted_note : < crate :: fermented :: types :: dpp :: tokens :: dpp_tokens_SharedEncryptedNote as ferment :: FFIConversionTo < dpp :: tokens :: SharedEncryptedNote >> :: ffi_to_opt (obj . shared_encrypted_note) , private_encrypted_note : < crate :: fermented :: types :: dpp :: tokens :: dpp_tokens_PrivateEncryptedNote as ferment :: FFIConversionTo < dpp :: tokens :: PrivateEncryptedNote >> :: ffi_to_opt (obj . private_encrypted_note) }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . base) ; ; ferment :: unbox_any (ffi_ref . recipient_id) ; ferment :: unbox_any_opt (ffi_ref . public_note) ; ferment :: unbox_any_opt (ffi_ref . shared_encrypted_note) ; ferment :: unbox_any_opt (ffi_ref . private_encrypted_note) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0_ctor < > (base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition , amount : u64 , recipient_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , public_note : * mut std :: os :: raw :: c_char , shared_encrypted_note : * mut crate :: fermented :: types :: dpp :: tokens :: dpp_tokens_SharedEncryptedNote , private_encrypted_note : * mut crate :: fermented :: types :: dpp :: tokens :: dpp_tokens_PrivateEncryptedNote) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0 { base , amount , recipient_id , public_note , shared_encrypted_note , private_encrypted_note }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0_get_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0_get_amount < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0) -> u64 { (* obj) . amount } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0_get_recipient_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . recipient_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0_get_public_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . public_note } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0_get_shared_encrypted_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0) -> * mut crate :: fermented :: types :: dpp :: tokens :: dpp_tokens_SharedEncryptedNote { (* obj) . shared_encrypted_note } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0_get_private_encrypted_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0) -> * mut crate :: fermented :: types :: dpp :: tokens :: dpp_tokens_PrivateEncryptedNote { (* obj) . private_encrypted_note } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0_set_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0_set_amount < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0) -> u64 { (* obj) . amount } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0_set_recipient_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . recipient_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0_set_public_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . public_note } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0_set_shared_encrypted_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0) -> * mut crate :: fermented :: types :: dpp :: tokens :: dpp_tokens_SharedEncryptedNote { (* obj) . shared_encrypted_note } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0_set_private_encrypted_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0) -> * mut crate :: fermented :: types :: dpp :: tokens :: dpp_tokens_PrivateEncryptedNote { (* obj) . private_encrypted_note } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`TokenTransferTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_TokenTransferTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: TokenTransferTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_TokenTransferTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_TokenTransferTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: TokenTransferTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_TokenTransferTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: TokenTransferTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: v0 :: TokenTransferTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: TokenTransferTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_TokenTransferTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: TokenTransferTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_TokenTransferTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: TokenTransferTransition :: V0 (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_TokenTransferTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: v0 :: TokenTransferTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_TokenTransferTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_TokenTransferTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_TokenTransferTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_transfer_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_v0_TokenTransferTransitionV0) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_TokenTransferTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_TokenTransferTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_TokenTransferTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_transfer_transition_TokenTransferTransition) { ferment :: unbox_any (ffi) ; } } pub mod token_emergency_action_transition { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`TokenEmergencyActionTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_TokenEmergencyActionTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: TokenEmergencyActionTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_TokenEmergencyActionTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_TokenEmergencyActionTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: TokenEmergencyActionTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_TokenEmergencyActionTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: TokenEmergencyActionTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: v0 :: TokenEmergencyActionTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: TokenEmergencyActionTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_TokenEmergencyActionTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: TokenEmergencyActionTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_TokenEmergencyActionTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: TokenEmergencyActionTransition :: V0 (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_TokenEmergencyActionTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: v0 :: TokenEmergencyActionTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_TokenEmergencyActionTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_TokenEmergencyActionTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_TokenEmergencyActionTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_TokenEmergencyActionTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_TokenEmergencyActionTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_TokenEmergencyActionTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_TokenEmergencyActionTransition) { ferment :: unbox_any (ffi) ; } pub mod validate_structure { use crate as dash_spv_apple_bindings ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TokenEmergencyActionTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0 { pub base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition , pub emergency_action : * mut crate :: fermented :: types :: dpp :: tokens :: emergency_action :: dpp_tokens_emergency_action_TokenEmergencyAction , pub public_note : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: v0 :: TokenEmergencyActionTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: v0 :: TokenEmergencyActionTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: v0 :: TokenEmergencyActionTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition >> :: ffi_from (ffi_ref . base) , emergency_action : < crate :: fermented :: types :: dpp :: tokens :: emergency_action :: dpp_tokens_emergency_action_TokenEmergencyAction as ferment :: FFIConversionFrom < dpp :: tokens :: emergency_action :: TokenEmergencyAction >> :: ffi_from (ffi_ref . emergency_action) , public_note : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (ffi_ref . public_note) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: v0 :: TokenEmergencyActionTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_emergency_action_transition :: v0 :: TokenEmergencyActionTransitionV0) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition >> :: ffi_to (obj . base) , emergency_action : < crate :: fermented :: types :: dpp :: tokens :: emergency_action :: dpp_tokens_emergency_action_TokenEmergencyAction as ferment :: FFIConversionTo < dpp :: tokens :: emergency_action :: TokenEmergencyAction >> :: ffi_to (obj . emergency_action) , public_note : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj . public_note) }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . base) ; ferment :: unbox_any (ffi_ref . emergency_action) ; ferment :: unbox_any_opt (ffi_ref . public_note) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0_ctor < > (base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition , emergency_action : * mut crate :: fermented :: types :: dpp :: tokens :: emergency_action :: dpp_tokens_emergency_action_TokenEmergencyAction , public_note : * mut std :: os :: raw :: c_char) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0 { base , emergency_action , public_note }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0_get_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0_get_emergency_action < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0) -> * mut crate :: fermented :: types :: dpp :: tokens :: emergency_action :: dpp_tokens_emergency_action_TokenEmergencyAction { (* obj) . emergency_action } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0_get_public_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . public_note } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0_set_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0_set_emergency_action < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0) -> * mut crate :: fermented :: types :: dpp :: tokens :: emergency_action :: dpp_tokens_emergency_action_TokenEmergencyAction { (* obj) . emergency_action } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0_set_public_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_emergency_action_transition_v0_TokenEmergencyActionTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . public_note } } } pub mod document_transfer_transition { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DocumentTransferTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_DocumentTransferTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: DocumentTransferTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_DocumentTransferTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_DocumentTransferTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: DocumentTransferTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_DocumentTransferTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: DocumentTransferTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: v0 :: DocumentTransferTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: DocumentTransferTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_DocumentTransferTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: DocumentTransferTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_DocumentTransferTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: DocumentTransferTransition :: V0 (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_DocumentTransferTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: v0 :: DocumentTransferTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_DocumentTransferTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_DocumentTransferTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_DocumentTransferTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_DocumentTransferTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_DocumentTransferTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_DocumentTransferTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_DocumentTransferTransition) { ferment :: unbox_any (ffi) ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentTransferTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0 { pub base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition , pub revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision , pub recipient_owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: v0 :: DocumentTransferTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: v0 :: DocumentTransferTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: v0 :: DocumentTransferTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: DocumentBaseTransition >> :: ffi_from (ffi_ref . base) , revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionFrom < dpp :: prelude :: Revision >> :: ffi_from (ffi_ref . revision) , recipient_owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . recipient_owner_id) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: v0 :: DocumentTransferTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transfer_transition :: v0 :: DocumentTransferTransitionV0) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: DocumentBaseTransition >> :: ffi_to (obj . base) , revision : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision as ferment :: FFIConversionTo < dpp :: prelude :: Revision >> :: ffi_to (obj . revision) , recipient_owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . recipient_owner_id) }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . base) ; ferment :: unbox_any (ffi_ref . revision) ; ferment :: unbox_any (ffi_ref . recipient_owner_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0_ctor < > (base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition , revision : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision , recipient_owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0 { base , revision , recipient_owner_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0_get_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0_get_revision < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . revision } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0_get_recipient_owner_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . recipient_owner_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0_set_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0_set_revision < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_Revision { (* obj) . revision } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0_set_recipient_owner_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transfer_transition_v0_DocumentTransferTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . recipient_owner_id } } } pub mod document_base_transition { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DocumentBaseTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: DocumentBaseTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: DocumentBaseTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: DocumentBaseTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: v0 :: DocumentBaseTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: DocumentBaseTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: DocumentBaseTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: DocumentBaseTransition :: V0 (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: v0 :: DocumentBaseTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_DocumentBaseTransition) { ferment :: unbox_any (ffi) ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DocumentBaseTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0 { pub id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub identity_contract_nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , pub document_type_name : * mut std :: os :: raw :: c_char , pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: v0 :: DocumentBaseTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: v0 :: DocumentBaseTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: v0 :: DocumentBaseTransitionV0 { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . id) , identity_contract_nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionFrom < dpp :: prelude :: IdentityNonce >> :: ffi_from (ffi_ref . identity_contract_nonce) , document_type_name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . document_type_name) , data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: v0 :: DocumentBaseTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_base_transition :: v0 :: DocumentBaseTransitionV0) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0 { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . id) , identity_contract_nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionTo < dpp :: prelude :: IdentityNonce >> :: ffi_to (obj . identity_contract_nonce) , document_type_name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . document_type_name) , data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . id) ; ferment :: unbox_any (ffi_ref . identity_contract_nonce) ; ferment :: unbox_string (ffi_ref . document_type_name) ; ferment :: unbox_any (ffi_ref . data_contract_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0_ctor < > (id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , identity_contract_nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , document_type_name : * mut std :: os :: raw :: c_char , data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0 { id , identity_contract_nonce , document_type_name , data_contract_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0_get_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0_get_identity_contract_nonce < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . identity_contract_nonce } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0_get_document_type_name < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . document_type_name } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0_get_data_contract_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0_set_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0_set_identity_contract_nonce < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . identity_contract_nonce } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0_set_document_type_name < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . document_type_name } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0_set_data_contract_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_base_transition_v0_DocumentBaseTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } } pub mod fields { use crate as dash_spv_apple_bindings ; } } pub mod token_mint_transition { use crate as dash_spv_apple_bindings ; pub mod validate_structure { use crate as dash_spv_apple_bindings ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TokenMintTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0 { pub base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition , pub issued_to_identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub amount : u64 , pub public_note : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: v0 :: TokenMintTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: v0 :: TokenMintTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: v0 :: TokenMintTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition >> :: ffi_from (ffi_ref . base) , issued_to_identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from_opt (ffi_ref . issued_to_identity_id) , amount : ffi_ref . amount , public_note : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (ffi_ref . public_note) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: v0 :: TokenMintTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: v0 :: TokenMintTransitionV0) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition >> :: ffi_to (obj . base) , issued_to_identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to_opt (obj . issued_to_identity_id) , amount : obj . amount , public_note : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj . public_note) }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . base) ; ferment :: unbox_any_opt (ffi_ref . issued_to_identity_id) ; ; ferment :: unbox_any_opt (ffi_ref . public_note) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0_ctor < > (base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition , issued_to_identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , amount : u64 , public_note : * mut std :: os :: raw :: c_char) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0 { base , issued_to_identity_id , amount , public_note }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0_get_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0_get_issued_to_identity_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . issued_to_identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0_get_amount < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0) -> u64 { (* obj) . amount } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0_get_public_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . public_note } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0_set_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0_set_issued_to_identity_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . issued_to_identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0_set_amount < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0) -> u64 { (* obj) . amount } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0_set_public_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . public_note } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`TokenMintTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_TokenMintTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: TokenMintTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_TokenMintTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_TokenMintTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: TokenMintTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_TokenMintTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: TokenMintTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: v0 :: TokenMintTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: TokenMintTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_TokenMintTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: TokenMintTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_TokenMintTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: TokenMintTransition :: V0 (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_TokenMintTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: v0 :: TokenMintTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_TokenMintTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_TokenMintTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_TokenMintTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_mint_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_v0_TokenMintTransitionV0) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_TokenMintTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_TokenMintTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_TokenMintTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_mint_transition_TokenMintTransition) { ferment :: unbox_any (ffi) ; } } pub mod document_transition_action_type { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DocumentTransitionActionType`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType { Create , Replace , Delete , Transfer , Purchase , UpdatePrice , IgnoreWhileBumpingRevision } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Create => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType :: Create , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Replace => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType :: Replace , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Delete => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType :: Delete , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Transfer => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType :: Transfer , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Purchase => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType :: Purchase , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: UpdatePrice => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType :: UpdatePrice , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: IgnoreWhileBumpingRevision => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType :: IgnoreWhileBumpingRevision } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType :: Create => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Create , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType :: Replace => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Replace , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType :: Delete => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Delete , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType :: Transfer => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Transfer , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType :: Purchase => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Purchase , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType :: UpdatePrice => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: UpdatePrice , dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType :: IgnoreWhileBumpingRevision => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: IgnoreWhileBumpingRevision , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Create => { } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Replace => { } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Delete => { } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Transfer => { } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Purchase => { } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: UpdatePrice => { } , dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: IgnoreWhileBumpingRevision => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_Create_ctor () -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Create { }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_Replace_ctor () -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Replace { }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_Delete_ctor () -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Delete { }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_Transfer_ctor () -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Transfer { }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_Purchase_ctor () -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: Purchase { }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_UpdatePrice_ctor () -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: UpdatePrice { }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_IgnoreWhileBumpingRevision_ctor () -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType :: IgnoreWhileBumpingRevision { }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType) { ferment :: unbox_any (ffi) ; } } pub mod token_unfreeze_transition { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TokenUnfreezeTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0 { pub base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition , pub frozen_identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub public_note : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: v0 :: TokenUnfreezeTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: v0 :: TokenUnfreezeTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: v0 :: TokenUnfreezeTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition >> :: ffi_from (ffi_ref . base) , frozen_identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . frozen_identity_id) , public_note : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (ffi_ref . public_note) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: v0 :: TokenUnfreezeTransitionV0 > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: v0 :: TokenUnfreezeTransitionV0) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0 { base : < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: TokenBaseTransition >> :: ffi_to (obj . base) , frozen_identity_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . frozen_identity_id) , public_note : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj . public_note) }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . base) ; ferment :: unbox_any (ffi_ref . frozen_identity_id) ; ferment :: unbox_any_opt (ffi_ref . public_note) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0_ctor < > (base : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition , frozen_identity_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , public_note : * mut std :: os :: raw :: c_char) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0 { base , frozen_identity_id , public_note }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0_get_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0_get_frozen_identity_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . frozen_identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0_get_public_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . public_note } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0_set_base < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0) -> * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_base_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_base_transition_TokenBaseTransition { (* obj) . base } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0_set_frozen_identity_id < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . frozen_identity_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0_set_public_note < > (obj : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0) -> * mut std :: os :: raw :: c_char { (* obj) . public_note } } pub mod validate_structure { use crate as dash_spv_apple_bindings ; } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`TokenUnfreezeTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_TokenUnfreezeTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: TokenUnfreezeTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_TokenUnfreezeTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_TokenUnfreezeTransition) -> dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: TokenUnfreezeTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_TokenUnfreezeTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: TokenUnfreezeTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: v0 :: TokenUnfreezeTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: TokenUnfreezeTransition > for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_TokenUnfreezeTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: TokenUnfreezeTransition) -> * const dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_TokenUnfreezeTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: TokenUnfreezeTransition :: V0 (o_0) => dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_TokenUnfreezeTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: v0 :: TokenUnfreezeTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_TokenUnfreezeTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_TokenUnfreezeTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_TokenUnfreezeTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: token_unfreeze_transition :: v0 :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_v0_TokenUnfreezeTransitionV0) -> * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_TokenUnfreezeTransition { ferment :: boxed (dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_TokenUnfreezeTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_TokenUnfreezeTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_document_batch_transition_batched_transition_token_unfreeze_transition_TokenUnfreezeTransition) { ferment :: unbox_any (ffi) ; } } } } } pub mod contract { use crate as dash_spv_apple_bindings ; pub mod data_contract_update_transition { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DataContractUpdateTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_contract_data_contract_update_transition_DataContractUpdateTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: v0 :: dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: DataContractUpdateTransition > for dpp_state_transition_state_transitions_contract_data_contract_update_transition_DataContractUpdateTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_contract_data_contract_update_transition_DataContractUpdateTransition) -> dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: DataContractUpdateTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_contract_data_contract_update_transition_DataContractUpdateTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: DataContractUpdateTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: v0 :: dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: v0 :: DataContractUpdateTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: DataContractUpdateTransition > for dpp_state_transition_state_transitions_contract_data_contract_update_transition_DataContractUpdateTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: DataContractUpdateTransition) -> * const dpp_state_transition_state_transitions_contract_data_contract_update_transition_DataContractUpdateTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: DataContractUpdateTransition :: V0 (o_0) => dpp_state_transition_state_transitions_contract_data_contract_update_transition_DataContractUpdateTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: v0 :: dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: v0 :: DataContractUpdateTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_contract_data_contract_update_transition_DataContractUpdateTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_contract_data_contract_update_transition_DataContractUpdateTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_update_transition_DataContractUpdateTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: v0 :: dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0) -> * mut dpp_state_transition_state_transitions_contract_data_contract_update_transition_DataContractUpdateTransition { ferment :: boxed (dpp_state_transition_state_transitions_contract_data_contract_update_transition_DataContractUpdateTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_update_transition_DataContractUpdateTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_contract_data_contract_update_transition_DataContractUpdateTransition) { ferment :: unbox_any (ffi) ; } pub mod accessors { use crate as dash_spv_apple_bindings ; } pub mod methods { use crate as dash_spv_apple_bindings ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractUpdateTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0 { pub identity_contract_nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , pub data_contract : * mut crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: dpp_data_contract_serialized_version_DataContractInSerializationFormat , pub user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , pub signature_public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , pub signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: v0 :: DataContractUpdateTransitionV0 > for dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0) -> dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: v0 :: DataContractUpdateTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: v0 :: DataContractUpdateTransitionV0 { identity_contract_nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionFrom < dpp :: prelude :: IdentityNonce >> :: ffi_from (ffi_ref . identity_contract_nonce) , data_contract : < crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: dpp_data_contract_serialized_version_DataContractInSerializationFormat as ferment :: FFIConversionFrom < dpp :: data_contract :: serialized_version :: DataContractInSerializationFormat >> :: ffi_from (ffi_ref . data_contract) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionFrom < dpp :: prelude :: UserFeeIncrease >> :: ffi_from (ffi_ref . user_fee_increase) , signature_public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . signature_public_key_id) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionFrom < platform_value :: types :: binary_data :: BinaryData >> :: ffi_from (ffi_ref . signature) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: v0 :: DataContractUpdateTransitionV0 > for dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: v0 :: DataContractUpdateTransitionV0) -> * const dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0 { identity_contract_nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionTo < dpp :: prelude :: IdentityNonce >> :: ffi_to (obj . identity_contract_nonce) , data_contract : < crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: dpp_data_contract_serialized_version_DataContractInSerializationFormat as ferment :: FFIConversionTo < dpp :: data_contract :: serialized_version :: DataContractInSerializationFormat >> :: ffi_to (obj . data_contract) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionTo < dpp :: prelude :: UserFeeIncrease >> :: ffi_to (obj . user_fee_increase) , signature_public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . signature_public_key_id) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionTo < platform_value :: types :: binary_data :: BinaryData >> :: ffi_to (obj . signature) }) } } impl Drop for dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . identity_contract_nonce) ; ferment :: unbox_any (ffi_ref . data_contract) ; ferment :: unbox_any (ffi_ref . user_fee_increase) ; ferment :: unbox_any (ffi_ref . signature_public_key_id) ; ferment :: unbox_any (ffi_ref . signature) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0_ctor < > (identity_contract_nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , data_contract : * mut crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: dpp_data_contract_serialized_version_DataContractInSerializationFormat , user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , signature_public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData) -> * mut dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0 { identity_contract_nonce , data_contract , user_fee_increase , signature_public_key_id , signature }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0_get_identity_contract_nonce < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . identity_contract_nonce } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0_get_data_contract < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: dpp_data_contract_serialized_version_DataContractInSerializationFormat { (* obj) . data_contract } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0_get_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0_get_signature_public_key_id < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . signature_public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0_get_signature < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0_set_identity_contract_nonce < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . identity_contract_nonce } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0_set_data_contract < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: dpp_data_contract_serialized_version_DataContractInSerializationFormat { (* obj) . data_contract } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0_set_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0_set_signature_public_key_id < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . signature_public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0_set_signature < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_update_transition_v0_DataContractUpdateTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } } } pub mod data_contract_create_transition { use crate as dash_spv_apple_bindings ; # [cfg (feature = "state-transition-json-conversion")] pub mod json_conversion { use crate as dash_spv_apple_bindings ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractCreateTransitionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0 { pub data_contract : * mut crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: dpp_data_contract_serialized_version_DataContractInSerializationFormat , pub identity_nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , pub user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , pub signature_public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , pub signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: v0 :: DataContractCreateTransitionV0 > for dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0 { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0) -> dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: v0 :: DataContractCreateTransitionV0 { let ffi_ref = & * ffi ; dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: v0 :: DataContractCreateTransitionV0 { data_contract : < crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: dpp_data_contract_serialized_version_DataContractInSerializationFormat as ferment :: FFIConversionFrom < dpp :: data_contract :: serialized_version :: DataContractInSerializationFormat >> :: ffi_from (ffi_ref . data_contract) , identity_nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionFrom < dpp :: prelude :: IdentityNonce >> :: ffi_from (ffi_ref . identity_nonce) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionFrom < dpp :: prelude :: UserFeeIncrease >> :: ffi_from (ffi_ref . user_fee_increase) , signature_public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (ffi_ref . signature_public_key_id) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionFrom < platform_value :: types :: binary_data :: BinaryData >> :: ffi_from (ffi_ref . signature) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: v0 :: DataContractCreateTransitionV0 > for dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0 { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: v0 :: DataContractCreateTransitionV0) -> * const dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0 { data_contract : < crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: dpp_data_contract_serialized_version_DataContractInSerializationFormat as ferment :: FFIConversionTo < dpp :: data_contract :: serialized_version :: DataContractInSerializationFormat >> :: ffi_to (obj . data_contract) , identity_nonce : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce as ferment :: FFIConversionTo < dpp :: prelude :: IdentityNonce >> :: ffi_to (obj . identity_nonce) , user_fee_increase : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease as ferment :: FFIConversionTo < dpp :: prelude :: UserFeeIncrease >> :: ffi_to (obj . user_fee_increase) , signature_public_key_id : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_to (obj . signature_public_key_id) , signature : < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionTo < platform_value :: types :: binary_data :: BinaryData >> :: ffi_to (obj . signature) }) } } impl Drop for dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data_contract) ; ferment :: unbox_any (ffi_ref . identity_nonce) ; ferment :: unbox_any (ffi_ref . user_fee_increase) ; ferment :: unbox_any (ffi_ref . signature_public_key_id) ; ferment :: unbox_any (ffi_ref . signature) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0_ctor < > (data_contract : * mut crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: dpp_data_contract_serialized_version_DataContractInSerializationFormat , identity_nonce : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce , user_fee_increase : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease , signature_public_key_id : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , signature : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData) -> * mut dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0 { ferment :: boxed (dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0 { data_contract , identity_nonce , user_fee_increase , signature_public_key_id , signature }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0_destroy < > (ffi : * mut dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0_get_data_contract < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: dpp_data_contract_serialized_version_DataContractInSerializationFormat { (* obj) . data_contract } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0_get_identity_nonce < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . identity_nonce } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0_get_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0_get_signature_public_key_id < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . signature_public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0_get_signature < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0_set_data_contract < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: dpp_data_contract_serialized_version_DataContractInSerializationFormat { (* obj) . data_contract } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0_set_identity_nonce < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_IdentityNonce { (* obj) . identity_nonce } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0_set_user_fee_increase < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_UserFeeIncrease { (* obj) . user_fee_increase } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0_set_signature_public_key_id < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID { (* obj) . signature_public_key_id } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0_set_signature < > (obj : * const dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0) -> * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData { (* obj) . signature } } pub mod methods { use crate as dash_spv_apple_bindings ; } pub mod accessors { use crate as dash_spv_apple_bindings ; } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DataContractCreateTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition { V0 (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: v0 :: dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: DataContractCreateTransition > for dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition) -> dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: DataContractCreateTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition :: V0 (o_0) => dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: DataContractCreateTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: v0 :: dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0 as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: v0 :: DataContractCreateTransitionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: DataContractCreateTransition > for dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: DataContractCreateTransition) -> * const dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition { ferment :: boxed (match obj { dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: DataContractCreateTransition :: V0 (o_0) => dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition :: V0 (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: v0 :: dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0 as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: v0 :: DataContractCreateTransitionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: v0 :: dpp_state_transition_state_transitions_contract_data_contract_create_transition_v0_DataContractCreateTransitionV0) -> * mut dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition { ferment :: boxed (dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition_destroy < > (ffi : * mut dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition) { ferment :: unbox_any (ffi) ; } } pub mod common_fields { use crate as dash_spv_apple_bindings ; } } } pub mod state_transition_types { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`StateTransitionType`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_state_transition_types_StateTransitionType { DataContractCreate = 0 , Batch = 1 , IdentityCreate = 2 , IdentityTopUp = 3 , DataContractUpdate = 4 , IdentityUpdate = 5 , IdentityCreditWithdrawal = 6 , IdentityCreditTransfer = 7 , MasternodeVote = 8 } impl ferment :: FFIConversionFrom < dpp :: state_transition :: state_transition_types :: StateTransitionType > for dpp_state_transition_state_transition_types_StateTransitionType { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_state_transition_types_StateTransitionType) -> dpp :: state_transition :: state_transition_types :: StateTransitionType { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_state_transition_types_StateTransitionType :: DataContractCreate => dpp :: state_transition :: state_transition_types :: StateTransitionType :: DataContractCreate , dpp_state_transition_state_transition_types_StateTransitionType :: Batch => dpp :: state_transition :: state_transition_types :: StateTransitionType :: Batch , dpp_state_transition_state_transition_types_StateTransitionType :: IdentityCreate => dpp :: state_transition :: state_transition_types :: StateTransitionType :: IdentityCreate , dpp_state_transition_state_transition_types_StateTransitionType :: IdentityTopUp => dpp :: state_transition :: state_transition_types :: StateTransitionType :: IdentityTopUp , dpp_state_transition_state_transition_types_StateTransitionType :: DataContractUpdate => dpp :: state_transition :: state_transition_types :: StateTransitionType :: DataContractUpdate , dpp_state_transition_state_transition_types_StateTransitionType :: IdentityUpdate => dpp :: state_transition :: state_transition_types :: StateTransitionType :: IdentityUpdate , dpp_state_transition_state_transition_types_StateTransitionType :: IdentityCreditWithdrawal => dpp :: state_transition :: state_transition_types :: StateTransitionType :: IdentityCreditWithdrawal , dpp_state_transition_state_transition_types_StateTransitionType :: IdentityCreditTransfer => dpp :: state_transition :: state_transition_types :: StateTransitionType :: IdentityCreditTransfer , dpp_state_transition_state_transition_types_StateTransitionType :: MasternodeVote => dpp :: state_transition :: state_transition_types :: StateTransitionType :: MasternodeVote } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: state_transition_types :: StateTransitionType > for dpp_state_transition_state_transition_types_StateTransitionType { unsafe fn ffi_to_const (obj : dpp :: state_transition :: state_transition_types :: StateTransitionType) -> * const dpp_state_transition_state_transition_types_StateTransitionType { ferment :: boxed (match obj { dpp :: state_transition :: state_transition_types :: StateTransitionType :: DataContractCreate => dpp_state_transition_state_transition_types_StateTransitionType :: DataContractCreate , dpp :: state_transition :: state_transition_types :: StateTransitionType :: Batch => dpp_state_transition_state_transition_types_StateTransitionType :: Batch , dpp :: state_transition :: state_transition_types :: StateTransitionType :: IdentityCreate => dpp_state_transition_state_transition_types_StateTransitionType :: IdentityCreate , dpp :: state_transition :: state_transition_types :: StateTransitionType :: IdentityTopUp => dpp_state_transition_state_transition_types_StateTransitionType :: IdentityTopUp , dpp :: state_transition :: state_transition_types :: StateTransitionType :: DataContractUpdate => dpp_state_transition_state_transition_types_StateTransitionType :: DataContractUpdate , dpp :: state_transition :: state_transition_types :: StateTransitionType :: IdentityUpdate => dpp_state_transition_state_transition_types_StateTransitionType :: IdentityUpdate , dpp :: state_transition :: state_transition_types :: StateTransitionType :: IdentityCreditWithdrawal => dpp_state_transition_state_transition_types_StateTransitionType :: IdentityCreditWithdrawal , dpp :: state_transition :: state_transition_types :: StateTransitionType :: IdentityCreditTransfer => dpp_state_transition_state_transition_types_StateTransitionType :: IdentityCreditTransfer , dpp :: state_transition :: state_transition_types :: StateTransitionType :: MasternodeVote => dpp_state_transition_state_transition_types_StateTransitionType :: MasternodeVote , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_state_transition_types_StateTransitionType { fn drop (& mut self) { unsafe { match self { dpp_state_transition_state_transition_types_StateTransitionType :: DataContractCreate => { } , dpp_state_transition_state_transition_types_StateTransitionType :: Batch => { } , dpp_state_transition_state_transition_types_StateTransitionType :: IdentityCreate => { } , dpp_state_transition_state_transition_types_StateTransitionType :: IdentityTopUp => { } , dpp_state_transition_state_transition_types_StateTransitionType :: DataContractUpdate => { } , dpp_state_transition_state_transition_types_StateTransitionType :: IdentityUpdate => { } , dpp_state_transition_state_transition_types_StateTransitionType :: IdentityCreditWithdrawal => { } , dpp_state_transition_state_transition_types_StateTransitionType :: IdentityCreditTransfer => { } , dpp_state_transition_state_transition_types_StateTransitionType :: MasternodeVote => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transition_types_StateTransitionType_DataContractCreate_ctor () -> * mut dpp_state_transition_state_transition_types_StateTransitionType { ferment :: boxed (dpp_state_transition_state_transition_types_StateTransitionType :: DataContractCreate { }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transition_types_StateTransitionType_Batch_ctor () -> * mut dpp_state_transition_state_transition_types_StateTransitionType { ferment :: boxed (dpp_state_transition_state_transition_types_StateTransitionType :: Batch { }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transition_types_StateTransitionType_IdentityCreate_ctor () -> * mut dpp_state_transition_state_transition_types_StateTransitionType { ferment :: boxed (dpp_state_transition_state_transition_types_StateTransitionType :: IdentityCreate { }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transition_types_StateTransitionType_IdentityTopUp_ctor () -> * mut dpp_state_transition_state_transition_types_StateTransitionType { ferment :: boxed (dpp_state_transition_state_transition_types_StateTransitionType :: IdentityTopUp { }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transition_types_StateTransitionType_DataContractUpdate_ctor () -> * mut dpp_state_transition_state_transition_types_StateTransitionType { ferment :: boxed (dpp_state_transition_state_transition_types_StateTransitionType :: DataContractUpdate { }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transition_types_StateTransitionType_IdentityUpdate_ctor () -> * mut dpp_state_transition_state_transition_types_StateTransitionType { ferment :: boxed (dpp_state_transition_state_transition_types_StateTransitionType :: IdentityUpdate { }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transition_types_StateTransitionType_IdentityCreditWithdrawal_ctor () -> * mut dpp_state_transition_state_transition_types_StateTransitionType { ferment :: boxed (dpp_state_transition_state_transition_types_StateTransitionType :: IdentityCreditWithdrawal { }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transition_types_StateTransitionType_IdentityCreditTransfer_ctor () -> * mut dpp_state_transition_state_transition_types_StateTransitionType { ferment :: boxed (dpp_state_transition_state_transition_types_StateTransitionType :: IdentityCreditTransfer { }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transition_types_StateTransitionType_MasternodeVote_ctor () -> * mut dpp_state_transition_state_transition_types_StateTransitionType { ferment :: boxed (dpp_state_transition_state_transition_types_StateTransitionType :: MasternodeVote { }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_state_transition_types_StateTransitionType_destroy < > (ffi : * mut dpp_state_transition_state_transition_types_StateTransitionType) { ferment :: unbox_any (ffi) ; } } pub mod serialization { use crate as dash_spv_apple_bindings ; } pub mod proof_result { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`StateTransitionProofResult`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_proof_result_StateTransitionProofResult { VerifiedDataContract (* mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract) , VerifiedIdentity (* mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity) , VerifiedTokenBalanceAbsence (* mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) , VerifiedTokenBalance (* mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount) , VerifiedTokenIdentityInfo (* mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , * mut crate :: fermented :: types :: dpp :: tokens :: info :: dpp_tokens_info_IdentityTokenInfo) , VerifiedTokenStatus (* mut crate :: fermented :: types :: dpp :: tokens :: status :: dpp_tokens_status_TokenStatus) , VerifiedTokenIdentitiesBalances (* mut crate :: fermented :: generics :: std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_balances_credits_TokenAmount) , VerifiedPartialIdentity (* mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_PartialIdentity) , VerifiedBalanceTransfer (* mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_PartialIdentity , * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_PartialIdentity) , VerifiedDocuments (* mut crate :: fermented :: generics :: std_collections_Map_keys_platform_value_types_identifier_Identifier_values_Option_dpp_document_Document) , VerifiedTokenActionWithDocument (* mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document) , VerifiedMasternodeVote (* mut crate :: fermented :: types :: dpp :: voting :: votes :: dpp_voting_votes_Vote) , VerifiedNextDistribution (* mut crate :: fermented :: types :: dpp :: voting :: votes :: dpp_voting_votes_Vote) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: proof_result :: StateTransitionProofResult > for dpp_state_transition_proof_result_StateTransitionProofResult { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_proof_result_StateTransitionProofResult) -> dpp :: state_transition :: proof_result :: StateTransitionProofResult { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedDataContract (o_0) => dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedDataContract (< crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (* o_0)) , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedIdentity (o_0) => dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedIdentity (< crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity as ferment :: FFIConversionFrom < dpp :: identity :: identity :: Identity >> :: ffi_from (* o_0)) , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenBalanceAbsence (o_0) => dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedTokenBalanceAbsence (< crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (* o_0)) , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenBalance (o_0 , o_1) => dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedTokenBalance (< crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (* o_0) , < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionFrom < dpp :: balances :: credits :: TokenAmount >> :: ffi_from (* o_1)) , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenIdentityInfo (o_0 , o_1) => dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedTokenIdentityInfo (< crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (* o_0) , < crate :: fermented :: types :: dpp :: tokens :: info :: dpp_tokens_info_IdentityTokenInfo as ferment :: FFIConversionFrom < dpp :: tokens :: info :: IdentityTokenInfo >> :: ffi_from (* o_1)) , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenStatus (o_0) => dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedTokenStatus (< crate :: fermented :: types :: dpp :: tokens :: status :: dpp_tokens_status_TokenStatus as ferment :: FFIConversionFrom < dpp :: tokens :: status :: TokenStatus >> :: ffi_from (* o_0)) , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenIdentitiesBalances (o_0) => dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedTokenIdentitiesBalances (< crate :: fermented :: generics :: std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_balances_credits_TokenAmount as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dpp :: balances :: credits :: TokenAmount > >> :: ffi_from (* o_0)) , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedPartialIdentity (o_0) => dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedPartialIdentity (< crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_PartialIdentity as ferment :: FFIConversionFrom < dpp :: identity :: identity :: PartialIdentity >> :: ffi_from (* o_0)) , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedBalanceTransfer (o_0 , o_1) => dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedBalanceTransfer (< crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_PartialIdentity as ferment :: FFIConversionFrom < dpp :: identity :: identity :: PartialIdentity >> :: ffi_from (* o_0) , < crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_PartialIdentity as ferment :: FFIConversionFrom < dpp :: identity :: identity :: PartialIdentity >> :: ffi_from (* o_1)) , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedDocuments (o_0) => dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedDocuments (< crate :: fermented :: generics :: std_collections_Map_keys_platform_value_types_identifier_Identifier_values_Option_dpp_document_Document as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > >> :: ffi_from (* o_0)) , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenActionWithDocument (o_0) => dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedTokenActionWithDocument (< crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionFrom < dpp :: document :: Document >> :: ffi_from (* o_0)) , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedMasternodeVote (o_0) => dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedMasternodeVote (< crate :: fermented :: types :: dpp :: voting :: votes :: dpp_voting_votes_Vote as ferment :: FFIConversionFrom < dpp :: voting :: votes :: Vote >> :: ffi_from (* o_0)) , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedNextDistribution (o_0) => dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedNextDistribution (< crate :: fermented :: types :: dpp :: voting :: votes :: dpp_voting_votes_Vote as ferment :: FFIConversionFrom < dpp :: voting :: votes :: Vote >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: proof_result :: StateTransitionProofResult > for dpp_state_transition_proof_result_StateTransitionProofResult { unsafe fn ffi_to_const (obj : dpp :: state_transition :: proof_result :: StateTransitionProofResult) -> * const dpp_state_transition_proof_result_StateTransitionProofResult { ferment :: boxed (match obj { dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedDataContract (o_0) => dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedDataContract (< crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionTo < dpp :: data_contract :: DataContract >> :: ffi_to (o_0)) , dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedIdentity (o_0) => dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedIdentity (< crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity as ferment :: FFIConversionTo < dpp :: identity :: identity :: Identity >> :: ffi_to (o_0)) , dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedTokenBalanceAbsence (o_0) => dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenBalanceAbsence (< crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (o_0)) , dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedTokenBalance (o_0 , o_1) => dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenBalance (< crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (o_0) , < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionTo < dpp :: balances :: credits :: TokenAmount >> :: ffi_to (o_1)) , dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedTokenIdentityInfo (o_0 , o_1) => dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenIdentityInfo (< crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (o_0) , < crate :: fermented :: types :: dpp :: tokens :: info :: dpp_tokens_info_IdentityTokenInfo as ferment :: FFIConversionTo < dpp :: tokens :: info :: IdentityTokenInfo >> :: ffi_to (o_1)) , dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedTokenStatus (o_0) => dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenStatus (< crate :: fermented :: types :: dpp :: tokens :: status :: dpp_tokens_status_TokenStatus as ferment :: FFIConversionTo < dpp :: tokens :: status :: TokenStatus >> :: ffi_to (o_0)) , dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedTokenIdentitiesBalances (o_0) => dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenIdentitiesBalances (< crate :: fermented :: generics :: std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_balances_credits_TokenAmount as ferment :: FFIConversionTo < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dpp :: balances :: credits :: TokenAmount > >> :: ffi_to (o_0)) , dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedPartialIdentity (o_0) => dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedPartialIdentity (< crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_PartialIdentity as ferment :: FFIConversionTo < dpp :: identity :: identity :: PartialIdentity >> :: ffi_to (o_0)) , dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedBalanceTransfer (o_0 , o_1) => dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedBalanceTransfer (< crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_PartialIdentity as ferment :: FFIConversionTo < dpp :: identity :: identity :: PartialIdentity >> :: ffi_to (o_0) , < crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_PartialIdentity as ferment :: FFIConversionTo < dpp :: identity :: identity :: PartialIdentity >> :: ffi_to (o_1)) , dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedDocuments (o_0) => dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedDocuments (< crate :: fermented :: generics :: std_collections_Map_keys_platform_value_types_identifier_Identifier_values_Option_dpp_document_Document as ferment :: FFIConversionTo < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > >> :: ffi_to (o_0)) , dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedTokenActionWithDocument (o_0) => dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenActionWithDocument (< crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionTo < dpp :: document :: Document >> :: ffi_to (o_0)) , dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedMasternodeVote (o_0) => dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedMasternodeVote (< crate :: fermented :: types :: dpp :: voting :: votes :: dpp_voting_votes_Vote as ferment :: FFIConversionTo < dpp :: voting :: votes :: Vote >> :: ffi_to (o_0)) , dpp :: state_transition :: proof_result :: StateTransitionProofResult :: VerifiedNextDistribution (o_0) => dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedNextDistribution (< crate :: fermented :: types :: dpp :: voting :: votes :: dpp_voting_votes_Vote as ferment :: FFIConversionTo < dpp :: voting :: votes :: Vote >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_proof_result_StateTransitionProofResult { fn drop (& mut self) { unsafe { match self { dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedDataContract (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedIdentity (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenBalanceAbsence (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenBalance (o_0 , o_1) => { ferment :: unbox_any (* o_0) ; ; ferment :: unbox_any (* o_1) ; } , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenIdentityInfo (o_0 , o_1) => { ferment :: unbox_any (* o_0) ; ; ferment :: unbox_any (* o_1) ; } , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenStatus (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenIdentitiesBalances (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedPartialIdentity (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedBalanceTransfer (o_0 , o_1) => { ferment :: unbox_any (* o_0) ; ; ferment :: unbox_any (* o_1) ; } , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedDocuments (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenActionWithDocument (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedMasternodeVote (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedNextDistribution (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_proof_result_StateTransitionProofResult_VerifiedDataContract_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract) -> * mut dpp_state_transition_proof_result_StateTransitionProofResult { ferment :: boxed (dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedDataContract (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_proof_result_StateTransitionProofResult_VerifiedIdentity_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity) -> * mut dpp_state_transition_proof_result_StateTransitionProofResult { ferment :: boxed (dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedIdentity (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_proof_result_StateTransitionProofResult_VerifiedTokenBalanceAbsence_ctor (o_o_0 : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_state_transition_proof_result_StateTransitionProofResult { ferment :: boxed (dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenBalanceAbsence (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_proof_result_StateTransitionProofResult_VerifiedTokenBalance_ctor (o_o_0 : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , o_o_1 : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount) -> * mut dpp_state_transition_proof_result_StateTransitionProofResult { ferment :: boxed (dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenBalance (o_o_0 , o_o_1)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_proof_result_StateTransitionProofResult_VerifiedTokenIdentityInfo_ctor (o_o_0 : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , o_o_1 : * mut crate :: fermented :: types :: dpp :: tokens :: info :: dpp_tokens_info_IdentityTokenInfo) -> * mut dpp_state_transition_proof_result_StateTransitionProofResult { ferment :: boxed (dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenIdentityInfo (o_o_0 , o_o_1)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_proof_result_StateTransitionProofResult_VerifiedTokenStatus_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: tokens :: status :: dpp_tokens_status_TokenStatus) -> * mut dpp_state_transition_proof_result_StateTransitionProofResult { ferment :: boxed (dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenStatus (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_proof_result_StateTransitionProofResult_VerifiedTokenIdentitiesBalances_ctor (o_o_0 : * mut crate :: fermented :: generics :: std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_balances_credits_TokenAmount) -> * mut dpp_state_transition_proof_result_StateTransitionProofResult { ferment :: boxed (dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenIdentitiesBalances (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_proof_result_StateTransitionProofResult_VerifiedPartialIdentity_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_PartialIdentity) -> * mut dpp_state_transition_proof_result_StateTransitionProofResult { ferment :: boxed (dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedPartialIdentity (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_proof_result_StateTransitionProofResult_VerifiedBalanceTransfer_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_PartialIdentity , o_o_1 : * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_PartialIdentity) -> * mut dpp_state_transition_proof_result_StateTransitionProofResult { ferment :: boxed (dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedBalanceTransfer (o_o_0 , o_o_1)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_proof_result_StateTransitionProofResult_VerifiedDocuments_ctor (o_o_0 : * mut crate :: fermented :: generics :: std_collections_Map_keys_platform_value_types_identifier_Identifier_values_Option_dpp_document_Document) -> * mut dpp_state_transition_proof_result_StateTransitionProofResult { ferment :: boxed (dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedDocuments (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_proof_result_StateTransitionProofResult_VerifiedTokenActionWithDocument_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document) -> * mut dpp_state_transition_proof_result_StateTransitionProofResult { ferment :: boxed (dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedTokenActionWithDocument (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_proof_result_StateTransitionProofResult_VerifiedMasternodeVote_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: voting :: votes :: dpp_voting_votes_Vote) -> * mut dpp_state_transition_proof_result_StateTransitionProofResult { ferment :: boxed (dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedMasternodeVote (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_proof_result_StateTransitionProofResult_VerifiedNextDistribution_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: voting :: votes :: dpp_voting_votes_Vote) -> * mut dpp_state_transition_proof_result_StateTransitionProofResult { ferment :: boxed (dpp_state_transition_proof_result_StateTransitionProofResult :: VerifiedNextDistribution (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_proof_result_StateTransitionProofResult_destroy < > (ffi : * mut dpp_state_transition_proof_result_StateTransitionProofResult) { ferment :: unbox_any (ffi) ; } } pub mod traits { use crate as dash_spv_apple_bindings ; } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`StateTransition`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_StateTransition { DataContractCreate (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition) , DataContractUpdate (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: dpp_state_transition_state_transitions_contract_data_contract_update_transition_DataContractUpdateTransition) , Batch (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: dpp_state_transition_state_transitions_document_batch_transition_BatchTransition) , IdentityCreate (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: dpp_state_transition_state_transitions_identity_identity_create_transition_IdentityCreateTransition) , IdentityTopUp (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: dpp_state_transition_state_transitions_identity_identity_topup_transition_IdentityTopUpTransition) , IdentityCreditWithdrawal (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition) , IdentityUpdate (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: dpp_state_transition_state_transitions_identity_identity_update_transition_IdentityUpdateTransition) , IdentityCreditTransfer (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_IdentityCreditTransferTransition) , MasternodeVote (* mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: dpp_state_transition_state_transitions_identity_masternode_vote_transition_MasternodeVoteTransition) } impl ferment :: FFIConversionFrom < dpp :: state_transition :: StateTransition > for dpp_state_transition_StateTransition { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_StateTransition) -> dpp :: state_transition :: StateTransition { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_StateTransition :: DataContractCreate (o_0) => dpp :: state_transition :: StateTransition :: DataContractCreate (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: DataContractCreateTransition >> :: ffi_from (* o_0)) , dpp_state_transition_StateTransition :: DataContractUpdate (o_0) => dpp :: state_transition :: StateTransition :: DataContractUpdate (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: dpp_state_transition_state_transitions_contract_data_contract_update_transition_DataContractUpdateTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: DataContractUpdateTransition >> :: ffi_from (* o_0)) , dpp_state_transition_StateTransition :: Batch (o_0) => dpp :: state_transition :: StateTransition :: Batch (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: dpp_state_transition_state_transitions_document_batch_transition_BatchTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: BatchTransition >> :: ffi_from (* o_0)) , dpp_state_transition_StateTransition :: IdentityCreate (o_0) => dpp :: state_transition :: StateTransition :: IdentityCreate (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: dpp_state_transition_state_transitions_identity_identity_create_transition_IdentityCreateTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: IdentityCreateTransition >> :: ffi_from (* o_0)) , dpp_state_transition_StateTransition :: IdentityTopUp (o_0) => dpp :: state_transition :: StateTransition :: IdentityTopUp (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: dpp_state_transition_state_transitions_identity_identity_topup_transition_IdentityTopUpTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: IdentityTopUpTransition >> :: ffi_from (* o_0)) , dpp_state_transition_StateTransition :: IdentityCreditWithdrawal (o_0) => dpp :: state_transition :: StateTransition :: IdentityCreditWithdrawal (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: IdentityCreditWithdrawalTransition >> :: ffi_from (* o_0)) , dpp_state_transition_StateTransition :: IdentityUpdate (o_0) => dpp :: state_transition :: StateTransition :: IdentityUpdate (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: dpp_state_transition_state_transitions_identity_identity_update_transition_IdentityUpdateTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: IdentityUpdateTransition >> :: ffi_from (* o_0)) , dpp_state_transition_StateTransition :: IdentityCreditTransfer (o_0) => dpp :: state_transition :: StateTransition :: IdentityCreditTransfer (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_IdentityCreditTransferTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: IdentityCreditTransferTransition >> :: ffi_from (* o_0)) , dpp_state_transition_StateTransition :: MasternodeVote (o_0) => dpp :: state_transition :: StateTransition :: MasternodeVote (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: dpp_state_transition_state_transitions_identity_masternode_vote_transition_MasternodeVoteTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: MasternodeVoteTransition >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: StateTransition > for dpp_state_transition_StateTransition { unsafe fn ffi_to_const (obj : dpp :: state_transition :: StateTransition) -> * const dpp_state_transition_StateTransition { ferment :: boxed (match obj { dpp :: state_transition :: StateTransition :: DataContractCreate (o_0) => dpp_state_transition_StateTransition :: DataContractCreate (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: DataContractCreateTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: StateTransition :: DataContractUpdate (o_0) => dpp_state_transition_StateTransition :: DataContractUpdate (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: dpp_state_transition_state_transitions_contract_data_contract_update_transition_DataContractUpdateTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: DataContractUpdateTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: StateTransition :: Batch (o_0) => dpp_state_transition_StateTransition :: Batch (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: dpp_state_transition_state_transitions_document_batch_transition_BatchTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: document :: batch_transition :: BatchTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: StateTransition :: IdentityCreate (o_0) => dpp_state_transition_StateTransition :: IdentityCreate (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: dpp_state_transition_state_transitions_identity_identity_create_transition_IdentityCreateTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: IdentityCreateTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: StateTransition :: IdentityTopUp (o_0) => dpp_state_transition_StateTransition :: IdentityTopUp (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: dpp_state_transition_state_transitions_identity_identity_topup_transition_IdentityTopUpTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: IdentityTopUpTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: StateTransition :: IdentityCreditWithdrawal (o_0) => dpp_state_transition_StateTransition :: IdentityCreditWithdrawal (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: IdentityCreditWithdrawalTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: StateTransition :: IdentityUpdate (o_0) => dpp_state_transition_StateTransition :: IdentityUpdate (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: dpp_state_transition_state_transitions_identity_identity_update_transition_IdentityUpdateTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: IdentityUpdateTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: StateTransition :: IdentityCreditTransfer (o_0) => dpp_state_transition_StateTransition :: IdentityCreditTransfer (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_IdentityCreditTransferTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: IdentityCreditTransferTransition >> :: ffi_to (o_0)) , dpp :: state_transition :: StateTransition :: MasternodeVote (o_0) => dpp_state_transition_StateTransition :: MasternodeVote (< crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: dpp_state_transition_state_transitions_identity_masternode_vote_transition_MasternodeVoteTransition as ferment :: FFIConversionTo < dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: MasternodeVoteTransition >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_StateTransition { fn drop (& mut self) { unsafe { match self { dpp_state_transition_StateTransition :: DataContractCreate (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_StateTransition :: DataContractUpdate (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_StateTransition :: Batch (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_StateTransition :: IdentityCreate (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_StateTransition :: IdentityTopUp (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_StateTransition :: IdentityCreditWithdrawal (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_StateTransition :: IdentityUpdate (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_StateTransition :: IdentityCreditTransfer (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_state_transition_StateTransition :: MasternodeVote (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_StateTransition_DataContractCreate_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition) -> * mut dpp_state_transition_StateTransition { ferment :: boxed (dpp_state_transition_StateTransition :: DataContractCreate (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_StateTransition_DataContractUpdate_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: contract :: data_contract_update_transition :: dpp_state_transition_state_transitions_contract_data_contract_update_transition_DataContractUpdateTransition) -> * mut dpp_state_transition_StateTransition { ferment :: boxed (dpp_state_transition_StateTransition :: DataContractUpdate (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_StateTransition_Batch_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: dpp_state_transition_state_transitions_document_batch_transition_BatchTransition) -> * mut dpp_state_transition_StateTransition { ferment :: boxed (dpp_state_transition_StateTransition :: Batch (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_StateTransition_IdentityCreate_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_create_transition :: dpp_state_transition_state_transitions_identity_identity_create_transition_IdentityCreateTransition) -> * mut dpp_state_transition_StateTransition { ferment :: boxed (dpp_state_transition_StateTransition :: IdentityCreate (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_StateTransition_IdentityTopUp_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_topup_transition :: dpp_state_transition_state_transitions_identity_identity_topup_transition_IdentityTopUpTransition) -> * mut dpp_state_transition_StateTransition { ferment :: boxed (dpp_state_transition_StateTransition :: IdentityTopUp (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_StateTransition_IdentityCreditWithdrawal_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_withdrawal_transition :: dpp_state_transition_state_transitions_identity_identity_credit_withdrawal_transition_IdentityCreditWithdrawalTransition) -> * mut dpp_state_transition_StateTransition { ferment :: boxed (dpp_state_transition_StateTransition :: IdentityCreditWithdrawal (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_StateTransition_IdentityUpdate_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_update_transition :: dpp_state_transition_state_transitions_identity_identity_update_transition_IdentityUpdateTransition) -> * mut dpp_state_transition_StateTransition { ferment :: boxed (dpp_state_transition_StateTransition :: IdentityUpdate (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_StateTransition_IdentityCreditTransfer_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: identity_credit_transfer_transition :: dpp_state_transition_state_transitions_identity_identity_credit_transfer_transition_IdentityCreditTransferTransition) -> * mut dpp_state_transition_StateTransition { ferment :: boxed (dpp_state_transition_StateTransition :: IdentityCreditTransfer (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_StateTransition_MasternodeVote_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: masternode_vote_transition :: dpp_state_transition_state_transitions_identity_masternode_vote_transition_MasternodeVoteTransition) -> * mut dpp_state_transition_StateTransition { ferment :: boxed (dpp_state_transition_StateTransition :: MasternodeVote (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_StateTransition_destroy < > (ffi : * mut dpp_state_transition_StateTransition) { ferment :: unbox_any (ffi) ; } pub mod abstract_state_transition { use crate as dash_spv_apple_bindings ; } pub mod errors { use crate as dash_spv_apple_bindings ; # [cfg (feature = "state-transition-validation")] pub mod state_transition_is_not_signed_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`StateTransitionIsNotSignedError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError { pub state_transition : * mut crate :: fermented :: types :: dpp :: state_transition :: dpp_state_transition_StateTransition } impl ferment :: FFIConversionFrom < dpp :: state_transition :: errors :: state_transition_is_not_signed_error :: StateTransitionIsNotSignedError > for dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError) -> dpp :: state_transition :: errors :: state_transition_is_not_signed_error :: StateTransitionIsNotSignedError { let ffi_ref = & * ffi ; dpp :: state_transition :: errors :: state_transition_is_not_signed_error :: StateTransitionIsNotSignedError { state_transition : < crate :: fermented :: types :: dpp :: state_transition :: dpp_state_transition_StateTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: StateTransition >> :: ffi_from (ffi_ref . state_transition) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: errors :: state_transition_is_not_signed_error :: StateTransitionIsNotSignedError > for dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError { unsafe fn ffi_to_const (obj : dpp :: state_transition :: errors :: state_transition_is_not_signed_error :: StateTransitionIsNotSignedError) -> * const dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError { ferment :: boxed (dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError { state_transition : < crate :: fermented :: types :: dpp :: state_transition :: dpp_state_transition_StateTransition as ferment :: FFIConversionTo < dpp :: state_transition :: StateTransition >> :: ffi_to (obj . state_transition) }) } } impl Drop for dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . state_transition) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError_ctor < > (state_transition : * mut crate :: fermented :: types :: dpp :: state_transition :: dpp_state_transition_StateTransition) -> * mut dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError { ferment :: boxed (dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError { state_transition }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError_destroy < > (ffi : * mut dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError_get_state_transition < > (obj : * const dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError) -> * mut crate :: fermented :: types :: dpp :: state_transition :: dpp_state_transition_StateTransition { (* obj) . state_transition } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError_set_state_transition < > (obj : * const dpp_state_transition_errors_state_transition_is_not_signed_error_StateTransitionIsNotSignedError) -> * mut crate :: fermented :: types :: dpp :: state_transition :: dpp_state_transition_StateTransition { (* obj) . state_transition } } # [cfg (feature = "state-transition-validation")] pub mod public_key_security_level_not_met_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`PublicKeySecurityLevelNotMetError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError { pub public_key_security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel , pub required_security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel } impl ferment :: FFIConversionFrom < dpp :: state_transition :: errors :: public_key_security_level_not_met_error :: PublicKeySecurityLevelNotMetError > for dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError) -> dpp :: state_transition :: errors :: public_key_security_level_not_met_error :: PublicKeySecurityLevelNotMetError { let ffi_ref = & * ffi ; dpp :: state_transition :: errors :: public_key_security_level_not_met_error :: PublicKeySecurityLevelNotMetError { public_key_security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_from (ffi_ref . public_key_security_level) , required_security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_from (ffi_ref . required_security_level) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: errors :: public_key_security_level_not_met_error :: PublicKeySecurityLevelNotMetError > for dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError { unsafe fn ffi_to_const (obj : dpp :: state_transition :: errors :: public_key_security_level_not_met_error :: PublicKeySecurityLevelNotMetError) -> * const dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError { ferment :: boxed (dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError { public_key_security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_to (obj . public_key_security_level) , required_security_level : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_to (obj . required_security_level) }) } } impl Drop for dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . public_key_security_level) ; ferment :: unbox_any (ffi_ref . required_security_level) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError_ctor < > (public_key_security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel , required_security_level : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel) -> * mut dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError { ferment :: boxed (dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError { public_key_security_level , required_security_level }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError_destroy < > (ffi : * mut dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError_get_public_key_security_level < > (obj : * const dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . public_key_security_level } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError_get_required_security_level < > (obj : * const dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . required_security_level } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError_set_public_key_security_level < > (obj : * const dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . public_key_security_level } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError_set_required_security_level < > (obj : * const dpp_state_transition_errors_public_key_security_level_not_met_error_PublicKeySecurityLevelNotMetError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . required_security_level } } # [cfg (any (feature = "state-transition-validation" , feature = "state-transition-signing"))] pub mod invalid_signature_public_key_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidSignaturePublicKeyError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError { pub public_key : * mut crate :: fermented :: generics :: Vec_u8 } impl ferment :: FFIConversionFrom < dpp :: state_transition :: errors :: invalid_signature_public_key_error :: InvalidSignaturePublicKeyError > for dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError) -> dpp :: state_transition :: errors :: invalid_signature_public_key_error :: InvalidSignaturePublicKeyError { let ffi_ref = & * ffi ; dpp :: state_transition :: errors :: invalid_signature_public_key_error :: InvalidSignaturePublicKeyError { public_key : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (ffi_ref . public_key) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: errors :: invalid_signature_public_key_error :: InvalidSignaturePublicKeyError > for dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError { unsafe fn ffi_to_const (obj : dpp :: state_transition :: errors :: invalid_signature_public_key_error :: InvalidSignaturePublicKeyError) -> * const dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError { ferment :: boxed (dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError { public_key : < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (obj . public_key) }) } } impl Drop for dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . public_key) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError_ctor < > (public_key : * mut crate :: fermented :: generics :: Vec_u8) -> * mut dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError { ferment :: boxed (dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError { public_key }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError_destroy < > (ffi : * mut dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError_get_public_key < > (obj : * const dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . public_key } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError_set_public_key < > (obj : * const dpp_state_transition_errors_invalid_signature_public_key_error_InvalidSignaturePublicKeyError) -> * mut crate :: fermented :: generics :: Vec_u8 { (* obj) . public_key } } # [cfg (any (all (feature = "state-transitions" , feature = "validation") , feature = "state-transition-validation"))] pub mod state_transition_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`StateTransitionError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_state_transition_errors_state_transition_error_StateTransitionError { InvalidStateTransitionError { errors : * mut crate :: fermented :: generics :: Vec_dpp_errors_consensus_consensus_error_ConsensusError , raw_state_transition : * mut crate :: fermented :: types :: platform_value :: platform_value_Value } } impl ferment :: FFIConversionFrom < dpp :: state_transition :: errors :: state_transition_error :: StateTransitionError > for dpp_state_transition_errors_state_transition_error_StateTransitionError { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_errors_state_transition_error_StateTransitionError) -> dpp :: state_transition :: errors :: state_transition_error :: StateTransitionError { let ffi_ref = & * ffi ; match ffi_ref { dpp_state_transition_errors_state_transition_error_StateTransitionError :: InvalidStateTransitionError { errors , raw_state_transition } => dpp :: state_transition :: errors :: state_transition_error :: StateTransitionError :: InvalidStateTransitionError { errors : < crate :: fermented :: generics :: Vec_dpp_errors_consensus_consensus_error_ConsensusError as ferment :: FFIConversionFrom < Vec < dpp :: errors :: consensus :: consensus_error :: ConsensusError > >> :: ffi_from (* errors) , raw_state_transition : < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionFrom < platform_value :: Value >> :: ffi_from (* raw_state_transition) } } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: errors :: state_transition_error :: StateTransitionError > for dpp_state_transition_errors_state_transition_error_StateTransitionError { unsafe fn ffi_to_const (obj : dpp :: state_transition :: errors :: state_transition_error :: StateTransitionError) -> * const dpp_state_transition_errors_state_transition_error_StateTransitionError { ferment :: boxed (match obj { dpp :: state_transition :: errors :: state_transition_error :: StateTransitionError :: InvalidStateTransitionError { errors , raw_state_transition } => dpp_state_transition_errors_state_transition_error_StateTransitionError :: InvalidStateTransitionError { errors : < crate :: fermented :: generics :: Vec_dpp_errors_consensus_consensus_error_ConsensusError as ferment :: FFIConversionTo < Vec < dpp :: errors :: consensus :: consensus_error :: ConsensusError > >> :: ffi_to (errors) , raw_state_transition : < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionTo < platform_value :: Value >> :: ffi_to (raw_state_transition) } , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_state_transition_errors_state_transition_error_StateTransitionError { fn drop (& mut self) { unsafe { match self { dpp_state_transition_errors_state_transition_error_StateTransitionError :: InvalidStateTransitionError { errors , raw_state_transition } => { ferment :: unbox_any (* errors) ; ; ferment :: unbox_any (* raw_state_transition) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_state_transition_error_StateTransitionError_InvalidStateTransitionError_ctor (errors : * mut crate :: fermented :: generics :: Vec_dpp_errors_consensus_consensus_error_ConsensusError , raw_state_transition : * mut crate :: fermented :: types :: platform_value :: platform_value_Value) -> * mut dpp_state_transition_errors_state_transition_error_StateTransitionError { ferment :: boxed (dpp_state_transition_errors_state_transition_error_StateTransitionError :: InvalidStateTransitionError { errors , raw_state_transition }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_state_transition_error_StateTransitionError_destroy < > (ffi : * mut dpp_state_transition_errors_state_transition_error_StateTransitionError) { ferment :: unbox_any (ffi) ; } } # [cfg (feature = "state-transition-validation")] pub mod public_key_mismatch_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`PublicKeyMismatchError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError { pub public_key : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey } impl ferment :: FFIConversionFrom < dpp :: state_transition :: errors :: public_key_mismatch_error :: PublicKeyMismatchError > for dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError) -> dpp :: state_transition :: errors :: public_key_mismatch_error :: PublicKeyMismatchError { let ffi_ref = & * ffi ; dpp :: state_transition :: errors :: public_key_mismatch_error :: PublicKeyMismatchError { public_key : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: IdentityPublicKey >> :: ffi_from (ffi_ref . public_key) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: errors :: public_key_mismatch_error :: PublicKeyMismatchError > for dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError { unsafe fn ffi_to_const (obj : dpp :: state_transition :: errors :: public_key_mismatch_error :: PublicKeyMismatchError) -> * const dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError { ferment :: boxed (dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError { public_key : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: IdentityPublicKey >> :: ffi_to (obj . public_key) }) } } impl Drop for dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . public_key) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError_ctor < > (public_key : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey) -> * mut dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError { ferment :: boxed (dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError { public_key }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError_destroy < > (ffi : * mut dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError_get_public_key < > (obj : * const dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey { (* obj) . public_key } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError_set_public_key < > (obj : * const dpp_state_transition_errors_public_key_mismatch_error_PublicKeyMismatchError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey { (* obj) . public_key } } # [cfg (any (feature = "state-transition-validation" , feature = "state-transition-signing"))] pub mod invalid_identity_public_key_type_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidIdentityPublicKeyTypeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError { pub public_key_type : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType } impl ferment :: FFIConversionFrom < dpp :: state_transition :: errors :: invalid_identity_public_key_type_error :: InvalidIdentityPublicKeyTypeError > for dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError { unsafe fn ffi_from_const (ffi : * const dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError) -> dpp :: state_transition :: errors :: invalid_identity_public_key_type_error :: InvalidIdentityPublicKeyTypeError { let ffi_ref = & * ffi ; dpp :: state_transition :: errors :: invalid_identity_public_key_type_error :: InvalidIdentityPublicKeyTypeError { public_key_type : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: key_type :: KeyType >> :: ffi_from (ffi_ref . public_key_type) } } } impl ferment :: FFIConversionTo < dpp :: state_transition :: errors :: invalid_identity_public_key_type_error :: InvalidIdentityPublicKeyTypeError > for dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError { unsafe fn ffi_to_const (obj : dpp :: state_transition :: errors :: invalid_identity_public_key_type_error :: InvalidIdentityPublicKeyTypeError) -> * const dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError { ferment :: boxed (dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError { public_key_type : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: key_type :: KeyType >> :: ffi_to (obj . public_key_type) }) } } impl Drop for dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . public_key_type) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError_ctor < > (public_key_type : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType) -> * mut dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError { ferment :: boxed (dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError { public_key_type }) } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError_destroy < > (ffi : * mut dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError_get_public_key_type < > (obj : * const dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType { (* obj) . public_key_type } # [no_mangle] pub unsafe extern "C" fn dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError_set_public_key_type < > (obj : * const dpp_state_transition_errors_invalid_identity_public_key_type_error_InvalidIdentityPublicKeyTypeError) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType { (* obj) . public_key_type } } } } pub mod data_contract { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DefinitionName`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_DefinitionName (* mut std :: os :: raw :: c_char) ; impl ferment :: FFIConversionFrom < dpp :: data_contract :: DefinitionName > for dpp_data_contract_DefinitionName { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_DefinitionName) -> dpp :: data_contract :: DefinitionName { let ffi_ref = & * ffi ; < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . 0) } } impl ferment :: FFIConversionTo < dpp :: data_contract :: DefinitionName > for dpp_data_contract_DefinitionName { unsafe fn ffi_to_const (obj : dpp :: data_contract :: DefinitionName) -> * const dpp_data_contract_DefinitionName { ferment :: boxed (dpp_data_contract_DefinitionName (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj))) } } impl Drop for dpp_data_contract_DefinitionName { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_DefinitionName_ctor < > (o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_DefinitionName { ferment :: boxed (dpp_data_contract_DefinitionName (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_DefinitionName_destroy < > (ffi : * mut dpp_data_contract_DefinitionName) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_DefinitionName_get_0 < > (obj : * const dpp_data_contract_DefinitionName) -> * mut std :: os :: raw :: c_char { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_DefinitionName_set_0 < > (obj : * const dpp_data_contract_DefinitionName) -> * mut std :: os :: raw :: c_char { (* obj) . 0 } # [cfg (feature = "factories")] pub mod factory { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; } } pub mod errors { use crate as dash_spv_apple_bindings ; pub mod invalid_document_type_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`InvalidDocumentTypeError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError { pub doc_type : * mut std :: os :: raw :: c_char , pub data_contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract } impl ferment :: FFIConversionFrom < dpp :: data_contract :: errors :: invalid_document_type_error :: InvalidDocumentTypeError > for dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError) -> dpp :: data_contract :: errors :: invalid_document_type_error :: InvalidDocumentTypeError { let ffi_ref = & * ffi ; dpp :: data_contract :: errors :: invalid_document_type_error :: InvalidDocumentTypeError { doc_type : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . doc_type) , data_contract : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (ffi_ref . data_contract) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: errors :: invalid_document_type_error :: InvalidDocumentTypeError > for dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError { unsafe fn ffi_to_const (obj : dpp :: data_contract :: errors :: invalid_document_type_error :: InvalidDocumentTypeError) -> * const dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError { ferment :: boxed (dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError { doc_type : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . doc_type) , data_contract : < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionTo < dpp :: data_contract :: DataContract >> :: ffi_to (obj . data_contract) }) } } impl Drop for dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . doc_type) ; ferment :: unbox_any (ffi_ref . data_contract) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError_ctor < > (doc_type : * mut std :: os :: raw :: c_char , data_contract : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract) -> * mut dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError { ferment :: boxed (dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError { doc_type , data_contract }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError_destroy < > (ffi : * mut dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError_get_doc_type < > (obj : * const dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError) -> * mut std :: os :: raw :: c_char { (* obj) . doc_type } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError_get_data_contract < > (obj : * const dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract { (* obj) . data_contract } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError_set_doc_type < > (obj : * const dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError) -> * mut std :: os :: raw :: c_char { (* obj) . doc_type } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError_set_data_contract < > (obj : * const dpp_data_contract_errors_invalid_document_type_error_InvalidDocumentTypeError) -> * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract { (* obj) . data_contract } } pub mod data_contract_not_present_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractNotPresentError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError { pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: data_contract :: errors :: data_contract_not_present_error :: DataContractNotPresentError > for dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError) -> dpp :: data_contract :: errors :: data_contract_not_present_error :: DataContractNotPresentError { let ffi_ref = & * ffi ; dpp :: data_contract :: errors :: data_contract_not_present_error :: DataContractNotPresentError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: errors :: data_contract_not_present_error :: DataContractNotPresentError > for dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError { unsafe fn ffi_to_const (obj : dpp :: data_contract :: errors :: data_contract_not_present_error :: DataContractNotPresentError) -> * const dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError { ferment :: boxed (dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError { data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) }) } } impl Drop for dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . data_contract_id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError_ctor < > (data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError { ferment :: boxed (dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError { data_contract_id }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError_destroy < > (ffi : * mut dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError_get_data_contract_id < > (obj : * const dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError_set_data_contract_id < > (obj : * const dpp_data_contract_errors_data_contract_not_present_error_DataContractNotPresentError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } } pub mod identity_not_present_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IdentityNotPresentError`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError { pub id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier } impl ferment :: FFIConversionFrom < dpp :: data_contract :: errors :: identity_not_present_error :: IdentityNotPresentError > for dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError) -> dpp :: data_contract :: errors :: identity_not_present_error :: IdentityNotPresentError { let ffi_ref = & * ffi ; dpp :: data_contract :: errors :: identity_not_present_error :: IdentityNotPresentError { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . id) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: errors :: identity_not_present_error :: IdentityNotPresentError > for dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError { unsafe fn ffi_to_const (obj : dpp :: data_contract :: errors :: identity_not_present_error :: IdentityNotPresentError) -> * const dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError { ferment :: boxed (dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . id) }) } } impl Drop for dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . id) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError_ctor < > (id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError { ferment :: boxed (dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError { id }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError_destroy < > (ffi : * mut dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError_get_id < > (obj : * const dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError_set_id < > (obj : * const dpp_data_contract_errors_identity_not_present_error_IdentityNotPresentError) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . id } } pub mod contract { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DataContractError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_errors_contract_DataContractError { DecodingContractError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: decoding_error :: dpp_errors_consensus_basic_decode_decoding_error_DecodingError) , DecodingDocumentError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: decoding_error :: dpp_errors_consensus_basic_decode_decoding_error_DecodingError) , InvalidDocumentTypeError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: invalid_document_type_error :: dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError) , DocumentTypesAreMissingError (* mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: document_types_are_missing_error :: dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError) , MissingRequiredKey (* mut std :: os :: raw :: c_char) , FieldRequirementUnmet (* mut std :: os :: raw :: c_char) , RegexError (* mut std :: os :: raw :: c_char) , KeyWrongType (* mut std :: os :: raw :: c_char) , ValueWrongType (* mut std :: os :: raw :: c_char) , InvalidURI (* mut std :: os :: raw :: c_char) , KeyWrongBounds (* mut std :: os :: raw :: c_char) , KeyValueMustExist (* mut std :: os :: raw :: c_char) , ValueDecodingError (* mut std :: os :: raw :: c_char) , EncodingDataStructureNotSupported (* mut std :: os :: raw :: c_char) , InvalidContractStructure (* mut std :: os :: raw :: c_char) , DocumentTypeNotFound (* mut std :: os :: raw :: c_char) , DocumentTypeFieldNotFound (* mut std :: os :: raw :: c_char) , ReferenceDefinitionNotFound (* mut std :: os :: raw :: c_char) , DocumentOwnerIdMissing (* mut std :: os :: raw :: c_char) , DocumentIdMissing (* mut std :: os :: raw :: c_char) , Unsupported (* mut std :: os :: raw :: c_char) , CorruptedSerialization (* mut std :: os :: raw :: c_char) , JsonSchema (* mut crate :: fermented :: types :: dpp :: data_contract :: errors :: json_schema_error :: dpp_data_contract_errors_json_schema_error_JsonSchemaError) } impl ferment :: FFIConversionFrom < dpp :: data_contract :: errors :: contract :: DataContractError > for dpp_data_contract_errors_contract_DataContractError { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_errors_contract_DataContractError) -> dpp :: data_contract :: errors :: contract :: DataContractError { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_errors_contract_DataContractError :: DecodingContractError (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: DecodingContractError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: decoding_error :: dpp_errors_consensus_basic_decode_decoding_error_DecodingError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: decode :: decoding_error :: DecodingError >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: DecodingDocumentError (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: DecodingDocumentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: decoding_error :: dpp_errors_consensus_basic_decode_decoding_error_DecodingError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: decode :: decoding_error :: DecodingError >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: InvalidDocumentTypeError (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: InvalidDocumentTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: invalid_document_type_error :: dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: document :: invalid_document_type_error :: InvalidDocumentTypeError >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: DocumentTypesAreMissingError (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: DocumentTypesAreMissingError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: document_types_are_missing_error :: dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError as ferment :: FFIConversionFrom < dpp :: errors :: consensus :: basic :: data_contract :: document_types_are_missing_error :: DocumentTypesAreMissingError >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: MissingRequiredKey (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: MissingRequiredKey (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: FieldRequirementUnmet (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: FieldRequirementUnmet (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: RegexError (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: RegexError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: KeyWrongType (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: KeyWrongType (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: ValueWrongType (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: ValueWrongType (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: InvalidURI (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: InvalidURI (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: KeyWrongBounds (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: KeyWrongBounds (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: KeyValueMustExist (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: KeyValueMustExist (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: ValueDecodingError (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: ValueDecodingError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: EncodingDataStructureNotSupported (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: EncodingDataStructureNotSupported (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: InvalidContractStructure (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: InvalidContractStructure (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: DocumentTypeNotFound (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: DocumentTypeNotFound (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: DocumentTypeFieldNotFound (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: DocumentTypeFieldNotFound (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: ReferenceDefinitionNotFound (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: ReferenceDefinitionNotFound (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: DocumentOwnerIdMissing (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: DocumentOwnerIdMissing (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: DocumentIdMissing (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: DocumentIdMissing (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: Unsupported (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: Unsupported (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: CorruptedSerialization (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: CorruptedSerialization (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_data_contract_errors_contract_DataContractError :: JsonSchema (o_0) => dpp :: data_contract :: errors :: contract :: DataContractError :: JsonSchema (< crate :: fermented :: types :: dpp :: data_contract :: errors :: json_schema_error :: dpp_data_contract_errors_json_schema_error_JsonSchemaError as ferment :: FFIConversionFrom < dpp :: data_contract :: errors :: json_schema_error :: JsonSchemaError >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: errors :: contract :: DataContractError > for dpp_data_contract_errors_contract_DataContractError { unsafe fn ffi_to_const (obj : dpp :: data_contract :: errors :: contract :: DataContractError) -> * const dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (match obj { dpp :: data_contract :: errors :: contract :: DataContractError :: DecodingContractError (o_0) => dpp_data_contract_errors_contract_DataContractError :: DecodingContractError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: decoding_error :: dpp_errors_consensus_basic_decode_decoding_error_DecodingError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: decode :: decoding_error :: DecodingError >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: DecodingDocumentError (o_0) => dpp_data_contract_errors_contract_DataContractError :: DecodingDocumentError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: decoding_error :: dpp_errors_consensus_basic_decode_decoding_error_DecodingError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: decode :: decoding_error :: DecodingError >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: InvalidDocumentTypeError (o_0) => dpp_data_contract_errors_contract_DataContractError :: InvalidDocumentTypeError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: invalid_document_type_error :: dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: document :: invalid_document_type_error :: InvalidDocumentTypeError >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: DocumentTypesAreMissingError (o_0) => dpp_data_contract_errors_contract_DataContractError :: DocumentTypesAreMissingError (< crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: document_types_are_missing_error :: dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError as ferment :: FFIConversionTo < dpp :: errors :: consensus :: basic :: data_contract :: document_types_are_missing_error :: DocumentTypesAreMissingError >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: MissingRequiredKey (o_0) => dpp_data_contract_errors_contract_DataContractError :: MissingRequiredKey (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: FieldRequirementUnmet (o_0) => dpp_data_contract_errors_contract_DataContractError :: FieldRequirementUnmet (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: RegexError (o_0) => dpp_data_contract_errors_contract_DataContractError :: RegexError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: KeyWrongType (o_0) => dpp_data_contract_errors_contract_DataContractError :: KeyWrongType (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: ValueWrongType (o_0) => dpp_data_contract_errors_contract_DataContractError :: ValueWrongType (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: InvalidURI (o_0) => dpp_data_contract_errors_contract_DataContractError :: InvalidURI (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: KeyWrongBounds (o_0) => dpp_data_contract_errors_contract_DataContractError :: KeyWrongBounds (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: KeyValueMustExist (o_0) => dpp_data_contract_errors_contract_DataContractError :: KeyValueMustExist (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: ValueDecodingError (o_0) => dpp_data_contract_errors_contract_DataContractError :: ValueDecodingError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: EncodingDataStructureNotSupported (o_0) => dpp_data_contract_errors_contract_DataContractError :: EncodingDataStructureNotSupported (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: InvalidContractStructure (o_0) => dpp_data_contract_errors_contract_DataContractError :: InvalidContractStructure (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: DocumentTypeNotFound (o_0) => dpp_data_contract_errors_contract_DataContractError :: DocumentTypeNotFound (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: DocumentTypeFieldNotFound (o_0) => dpp_data_contract_errors_contract_DataContractError :: DocumentTypeFieldNotFound (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: ReferenceDefinitionNotFound (o_0) => dpp_data_contract_errors_contract_DataContractError :: ReferenceDefinitionNotFound (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: DocumentOwnerIdMissing (o_0) => dpp_data_contract_errors_contract_DataContractError :: DocumentOwnerIdMissing (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: DocumentIdMissing (o_0) => dpp_data_contract_errors_contract_DataContractError :: DocumentIdMissing (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: Unsupported (o_0) => dpp_data_contract_errors_contract_DataContractError :: Unsupported (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: CorruptedSerialization (o_0) => dpp_data_contract_errors_contract_DataContractError :: CorruptedSerialization (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: contract :: DataContractError :: JsonSchema (o_0) => dpp_data_contract_errors_contract_DataContractError :: JsonSchema (< crate :: fermented :: types :: dpp :: data_contract :: errors :: json_schema_error :: dpp_data_contract_errors_json_schema_error_JsonSchemaError as ferment :: FFIConversionTo < dpp :: data_contract :: errors :: json_schema_error :: JsonSchemaError >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_errors_contract_DataContractError { fn drop (& mut self) { unsafe { match self { dpp_data_contract_errors_contract_DataContractError :: DecodingContractError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: DecodingDocumentError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: InvalidDocumentTypeError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: DocumentTypesAreMissingError (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: MissingRequiredKey (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: FieldRequirementUnmet (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: RegexError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: KeyWrongType (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: ValueWrongType (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: InvalidURI (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: KeyWrongBounds (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: KeyValueMustExist (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: ValueDecodingError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: EncodingDataStructureNotSupported (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: InvalidContractStructure (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: DocumentTypeNotFound (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: DocumentTypeFieldNotFound (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: ReferenceDefinitionNotFound (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: DocumentOwnerIdMissing (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: DocumentIdMissing (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: Unsupported (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: CorruptedSerialization (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_data_contract_errors_contract_DataContractError :: JsonSchema (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_DecodingContractError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: decoding_error :: dpp_errors_consensus_basic_decode_decoding_error_DecodingError) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: DecodingContractError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_DecodingDocumentError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: decode :: decoding_error :: dpp_errors_consensus_basic_decode_decoding_error_DecodingError) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: DecodingDocumentError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_InvalidDocumentTypeError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: document :: invalid_document_type_error :: dpp_errors_consensus_basic_document_invalid_document_type_error_InvalidDocumentTypeError) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: InvalidDocumentTypeError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_DocumentTypesAreMissingError_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: errors :: consensus :: basic :: data_contract :: document_types_are_missing_error :: dpp_errors_consensus_basic_data_contract_document_types_are_missing_error_DocumentTypesAreMissingError) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: DocumentTypesAreMissingError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_MissingRequiredKey_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: MissingRequiredKey (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_FieldRequirementUnmet_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: FieldRequirementUnmet (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_RegexError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: RegexError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_KeyWrongType_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: KeyWrongType (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_ValueWrongType_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: ValueWrongType (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_InvalidURI_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: InvalidURI (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_KeyWrongBounds_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: KeyWrongBounds (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_KeyValueMustExist_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: KeyValueMustExist (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_ValueDecodingError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: ValueDecodingError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_EncodingDataStructureNotSupported_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: EncodingDataStructureNotSupported (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_InvalidContractStructure_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: InvalidContractStructure (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_DocumentTypeNotFound_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: DocumentTypeNotFound (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_DocumentTypeFieldNotFound_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: DocumentTypeFieldNotFound (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_ReferenceDefinitionNotFound_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: ReferenceDefinitionNotFound (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_DocumentOwnerIdMissing_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: DocumentOwnerIdMissing (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_DocumentIdMissing_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: DocumentIdMissing (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_Unsupported_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: Unsupported (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_CorruptedSerialization_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: CorruptedSerialization (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_JsonSchema_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: errors :: json_schema_error :: dpp_data_contract_errors_json_schema_error_JsonSchemaError) -> * mut dpp_data_contract_errors_contract_DataContractError { ferment :: boxed (dpp_data_contract_errors_contract_DataContractError :: JsonSchema (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_contract_DataContractError_destroy < > (ffi : * mut dpp_data_contract_errors_contract_DataContractError) { ferment :: unbox_any (ffi) ; } } pub mod json_schema_error { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`JsonSchemaError`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_errors_json_schema_error_JsonSchemaError { CreateSchemaError (* mut std :: os :: raw :: c_char) , SchemaCompatibilityValidationError (* mut std :: os :: raw :: c_char) } impl ferment :: FFIConversionFrom < dpp :: data_contract :: errors :: json_schema_error :: JsonSchemaError > for dpp_data_contract_errors_json_schema_error_JsonSchemaError { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_errors_json_schema_error_JsonSchemaError) -> dpp :: data_contract :: errors :: json_schema_error :: JsonSchemaError { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_errors_json_schema_error_JsonSchemaError :: CreateSchemaError (o_0) => dpp :: data_contract :: errors :: json_schema_error :: JsonSchemaError :: CreateSchemaError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) , dpp_data_contract_errors_json_schema_error_JsonSchemaError :: SchemaCompatibilityValidationError (o_0) => dpp :: data_contract :: errors :: json_schema_error :: JsonSchemaError :: SchemaCompatibilityValidationError (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: errors :: json_schema_error :: JsonSchemaError > for dpp_data_contract_errors_json_schema_error_JsonSchemaError { unsafe fn ffi_to_const (obj : dpp :: data_contract :: errors :: json_schema_error :: JsonSchemaError) -> * const dpp_data_contract_errors_json_schema_error_JsonSchemaError { ferment :: boxed (match obj { dpp :: data_contract :: errors :: json_schema_error :: JsonSchemaError :: CreateSchemaError (o_0) => dpp_data_contract_errors_json_schema_error_JsonSchemaError :: CreateSchemaError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , dpp :: data_contract :: errors :: json_schema_error :: JsonSchemaError :: SchemaCompatibilityValidationError (o_0) => dpp_data_contract_errors_json_schema_error_JsonSchemaError :: SchemaCompatibilityValidationError (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_errors_json_schema_error_JsonSchemaError { fn drop (& mut self) { unsafe { match self { dpp_data_contract_errors_json_schema_error_JsonSchemaError :: CreateSchemaError (o_0) => { ferment :: unbox_string (* o_0) ; } , dpp_data_contract_errors_json_schema_error_JsonSchemaError :: SchemaCompatibilityValidationError (o_0) => { ferment :: unbox_string (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_json_schema_error_JsonSchemaError_CreateSchemaError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_json_schema_error_JsonSchemaError { ferment :: boxed (dpp_data_contract_errors_json_schema_error_JsonSchemaError :: CreateSchemaError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_json_schema_error_JsonSchemaError_SchemaCompatibilityValidationError_ctor (o_o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_errors_json_schema_error_JsonSchemaError { ferment :: boxed (dpp_data_contract_errors_json_schema_error_JsonSchemaError :: SchemaCompatibilityValidationError (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_errors_json_schema_error_JsonSchemaError_destroy < > (ffi : * mut dpp_data_contract_errors_json_schema_error_JsonSchemaError) { ferment :: unbox_any (ffi) ; } } } pub mod change_control_rules { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ChangeControlRules`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_change_control_rules_ChangeControlRules { V0 (* mut crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: v0 :: dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0) } impl ferment :: FFIConversionFrom < dpp :: data_contract :: change_control_rules :: ChangeControlRules > for dpp_data_contract_change_control_rules_ChangeControlRules { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_change_control_rules_ChangeControlRules) -> dpp :: data_contract :: change_control_rules :: ChangeControlRules { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_change_control_rules_ChangeControlRules :: V0 (o_0) => dpp :: data_contract :: change_control_rules :: ChangeControlRules :: V0 (< crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: v0 :: dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0 as ferment :: FFIConversionFrom < dpp :: data_contract :: change_control_rules :: v0 :: ChangeControlRulesV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: change_control_rules :: ChangeControlRules > for dpp_data_contract_change_control_rules_ChangeControlRules { unsafe fn ffi_to_const (obj : dpp :: data_contract :: change_control_rules :: ChangeControlRules) -> * const dpp_data_contract_change_control_rules_ChangeControlRules { ferment :: boxed (match obj { dpp :: data_contract :: change_control_rules :: ChangeControlRules :: V0 (o_0) => dpp_data_contract_change_control_rules_ChangeControlRules :: V0 (< crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: v0 :: dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0 as ferment :: FFIConversionTo < dpp :: data_contract :: change_control_rules :: v0 :: ChangeControlRulesV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_change_control_rules_ChangeControlRules { fn drop (& mut self) { unsafe { match self { dpp_data_contract_change_control_rules_ChangeControlRules :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_ChangeControlRules_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: v0 :: dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0) -> * mut dpp_data_contract_change_control_rules_ChangeControlRules { ferment :: boxed (dpp_data_contract_change_control_rules_ChangeControlRules :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_ChangeControlRules_destroy < > (ffi : * mut dpp_data_contract_change_control_rules_ChangeControlRules) { ferment :: unbox_any (ffi) ; } pub mod authorized_action_takers { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`AuthorizedActionTakers`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers { NoOne , ContractOwner , Identity (* mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) , MainGroup , Group (* mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition) } impl ferment :: FFIConversionFrom < dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers > for dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers) -> dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: NoOne => dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers :: NoOne , dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: ContractOwner => dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers :: ContractOwner , dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: Identity (o_0) => dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers :: Identity (< crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (* o_0)) , dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: MainGroup => dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers :: MainGroup , dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: Group (o_0) => dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers :: Group (< crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionFrom < dpp :: data_contract :: GroupContractPosition >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers > for dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers { unsafe fn ffi_to_const (obj : dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers) -> * const dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers { ferment :: boxed (match obj { dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers :: NoOne => dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: NoOne , dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers :: ContractOwner => dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: ContractOwner , dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers :: Identity (o_0) => dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: Identity (< crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (o_0)) , dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers :: MainGroup => dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: MainGroup , dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers :: Group (o_0) => dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: Group (< crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionTo < dpp :: data_contract :: GroupContractPosition >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers { fn drop (& mut self) { unsafe { match self { dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: NoOne => { } , dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: ContractOwner => { } , dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: Identity (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: MainGroup => { } , dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: Group (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers_NoOne_ctor () -> * mut dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers { ferment :: boxed (dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: NoOne { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers_ContractOwner_ctor () -> * mut dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers { ferment :: boxed (dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: ContractOwner { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers_Identity_ctor (o_o_0 : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers { ferment :: boxed (dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: Identity (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers_MainGroup_ctor () -> * mut dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers { ferment :: boxed (dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: MainGroup { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers_Group_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition) -> * mut dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers { ferment :: boxed (dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers :: Group (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers_destroy < > (ffi : * mut dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers) { ferment :: unbox_any (ffi) ; } } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`ChangeControlRulesV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0 { pub authorized_to_make_change : * mut crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: authorized_action_takers :: dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers , pub admin_action_takers : * mut crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: authorized_action_takers :: dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers , pub changing_authorized_action_takers_to_no_one_allowed : bool , pub changing_admin_action_takers_to_no_one_allowed : bool , pub self_changing_admin_action_takers_allowed : bool } impl ferment :: FFIConversionFrom < dpp :: data_contract :: change_control_rules :: v0 :: ChangeControlRulesV0 > for dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0 { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0) -> dpp :: data_contract :: change_control_rules :: v0 :: ChangeControlRulesV0 { let ffi_ref = & * ffi ; dpp :: data_contract :: change_control_rules :: v0 :: ChangeControlRulesV0 { authorized_to_make_change : < crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: authorized_action_takers :: dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers as ferment :: FFIConversionFrom < dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers >> :: ffi_from (ffi_ref . authorized_to_make_change) , admin_action_takers : < crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: authorized_action_takers :: dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers as ferment :: FFIConversionFrom < dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers >> :: ffi_from (ffi_ref . admin_action_takers) , changing_authorized_action_takers_to_no_one_allowed : ffi_ref . changing_authorized_action_takers_to_no_one_allowed , changing_admin_action_takers_to_no_one_allowed : ffi_ref . changing_admin_action_takers_to_no_one_allowed , self_changing_admin_action_takers_allowed : ffi_ref . self_changing_admin_action_takers_allowed } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: change_control_rules :: v0 :: ChangeControlRulesV0 > for dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0 { unsafe fn ffi_to_const (obj : dpp :: data_contract :: change_control_rules :: v0 :: ChangeControlRulesV0) -> * const dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0 { ferment :: boxed (dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0 { authorized_to_make_change : < crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: authorized_action_takers :: dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers as ferment :: FFIConversionTo < dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers >> :: ffi_to (obj . authorized_to_make_change) , admin_action_takers : < crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: authorized_action_takers :: dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers as ferment :: FFIConversionTo < dpp :: data_contract :: change_control_rules :: authorized_action_takers :: AuthorizedActionTakers >> :: ffi_to (obj . admin_action_takers) , changing_authorized_action_takers_to_no_one_allowed : obj . changing_authorized_action_takers_to_no_one_allowed , changing_admin_action_takers_to_no_one_allowed : obj . changing_admin_action_takers_to_no_one_allowed , self_changing_admin_action_takers_allowed : obj . self_changing_admin_action_takers_allowed }) } } impl Drop for dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . authorized_to_make_change) ; ferment :: unbox_any (ffi_ref . admin_action_takers) ; ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0_ctor < > (authorized_to_make_change : * mut crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: authorized_action_takers :: dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers , admin_action_takers : * mut crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: authorized_action_takers :: dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers , changing_authorized_action_takers_to_no_one_allowed : bool , changing_admin_action_takers_to_no_one_allowed : bool , self_changing_admin_action_takers_allowed : bool) -> * mut dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0 { ferment :: boxed (dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0 { authorized_to_make_change , admin_action_takers , changing_authorized_action_takers_to_no_one_allowed , changing_admin_action_takers_to_no_one_allowed , self_changing_admin_action_takers_allowed }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0_destroy < > (ffi : * mut dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0_get_authorized_to_make_change < > (obj : * const dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: authorized_action_takers :: dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers { (* obj) . authorized_to_make_change } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0_get_admin_action_takers < > (obj : * const dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: authorized_action_takers :: dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers { (* obj) . admin_action_takers } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0_get_changing_authorized_action_takers_to_no_one_allowed < > (obj : * const dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0) -> bool { (* obj) . changing_authorized_action_takers_to_no_one_allowed } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0_get_changing_admin_action_takers_to_no_one_allowed < > (obj : * const dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0) -> bool { (* obj) . changing_admin_action_takers_to_no_one_allowed } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0_get_self_changing_admin_action_takers_allowed < > (obj : * const dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0) -> bool { (* obj) . self_changing_admin_action_takers_allowed } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0_set_authorized_to_make_change < > (obj : * const dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: authorized_action_takers :: dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers { (* obj) . authorized_to_make_change } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0_set_admin_action_takers < > (obj : * const dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: change_control_rules :: authorized_action_takers :: dpp_data_contract_change_control_rules_authorized_action_takers_AuthorizedActionTakers { (* obj) . admin_action_takers } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0_set_changing_authorized_action_takers_to_no_one_allowed < > (obj : * const dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0) -> bool { (* obj) . changing_authorized_action_takers_to_no_one_allowed } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0_set_changing_admin_action_takers_to_no_one_allowed < > (obj : * const dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0) -> bool { (* obj) . changing_admin_action_takers_to_no_one_allowed } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0_set_self_changing_admin_action_takers_allowed < > (obj : * const dpp_data_contract_change_control_rules_v0_ChangeControlRulesV0) -> bool { (* obj) . self_changing_admin_action_takers_allowed } } } pub mod group { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`GroupMemberPower`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_group_GroupMemberPower (u32) ; impl ferment :: FFIConversionFrom < dpp :: data_contract :: group :: GroupMemberPower > for dpp_data_contract_group_GroupMemberPower { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_group_GroupMemberPower) -> dpp :: data_contract :: group :: GroupMemberPower { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: data_contract :: group :: GroupMemberPower > for dpp_data_contract_group_GroupMemberPower { unsafe fn ffi_to_const (obj : dpp :: data_contract :: group :: GroupMemberPower) -> * const dpp_data_contract_group_GroupMemberPower { ferment :: boxed (dpp_data_contract_group_GroupMemberPower (obj)) } } impl Drop for dpp_data_contract_group_GroupMemberPower { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_group_GroupMemberPower_ctor < > (o_0 : u32) -> * mut dpp_data_contract_group_GroupMemberPower { ferment :: boxed (dpp_data_contract_group_GroupMemberPower (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_group_GroupMemberPower_destroy < > (ffi : * mut dpp_data_contract_group_GroupMemberPower) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_group_GroupMemberPower_get_0 < > (obj : * const dpp_data_contract_group_GroupMemberPower) -> u32 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_group_GroupMemberPower_set_0 < > (obj : * const dpp_data_contract_group_GroupMemberPower) -> u32 { (* obj) . 0 } # [doc = "FFI-representation of the [`GroupRequiredPower`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_group_GroupRequiredPower (u32) ; impl ferment :: FFIConversionFrom < dpp :: data_contract :: group :: GroupRequiredPower > for dpp_data_contract_group_GroupRequiredPower { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_group_GroupRequiredPower) -> dpp :: data_contract :: group :: GroupRequiredPower { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: data_contract :: group :: GroupRequiredPower > for dpp_data_contract_group_GroupRequiredPower { unsafe fn ffi_to_const (obj : dpp :: data_contract :: group :: GroupRequiredPower) -> * const dpp_data_contract_group_GroupRequiredPower { ferment :: boxed (dpp_data_contract_group_GroupRequiredPower (obj)) } } impl Drop for dpp_data_contract_group_GroupRequiredPower { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_group_GroupRequiredPower_ctor < > (o_0 : u32) -> * mut dpp_data_contract_group_GroupRequiredPower { ferment :: boxed (dpp_data_contract_group_GroupRequiredPower (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_group_GroupRequiredPower_destroy < > (ffi : * mut dpp_data_contract_group_GroupRequiredPower) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_group_GroupRequiredPower_get_0 < > (obj : * const dpp_data_contract_group_GroupRequiredPower) -> u32 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_group_GroupRequiredPower_set_0 < > (obj : * const dpp_data_contract_group_GroupRequiredPower) -> u32 { (* obj) . 0 } pub mod accessors { use crate as dash_spv_apple_bindings ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`GroupV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_group_v0_GroupV0 { pub members : * mut crate :: fermented :: generics :: std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_data_contract_group_GroupMemberPower , pub required_power : * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupRequiredPower } impl ferment :: FFIConversionFrom < dpp :: data_contract :: group :: v0 :: GroupV0 > for dpp_data_contract_group_v0_GroupV0 { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_group_v0_GroupV0) -> dpp :: data_contract :: group :: v0 :: GroupV0 { let ffi_ref = & * ffi ; dpp :: data_contract :: group :: v0 :: GroupV0 { members : < crate :: fermented :: generics :: std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_data_contract_group_GroupMemberPower as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dpp :: data_contract :: group :: GroupMemberPower > >> :: ffi_from (ffi_ref . members) , required_power : < crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupRequiredPower as ferment :: FFIConversionFrom < dpp :: data_contract :: group :: GroupRequiredPower >> :: ffi_from (ffi_ref . required_power) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: group :: v0 :: GroupV0 > for dpp_data_contract_group_v0_GroupV0 { unsafe fn ffi_to_const (obj : dpp :: data_contract :: group :: v0 :: GroupV0) -> * const dpp_data_contract_group_v0_GroupV0 { ferment :: boxed (dpp_data_contract_group_v0_GroupV0 { members : < crate :: fermented :: generics :: std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_data_contract_group_GroupMemberPower as ferment :: FFIConversionTo < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dpp :: data_contract :: group :: GroupMemberPower > >> :: ffi_to (obj . members) , required_power : < crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupRequiredPower as ferment :: FFIConversionTo < dpp :: data_contract :: group :: GroupRequiredPower >> :: ffi_to (obj . required_power) }) } } impl Drop for dpp_data_contract_group_v0_GroupV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . members) ; ferment :: unbox_any (ffi_ref . required_power) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_group_v0_GroupV0_ctor < > (members : * mut crate :: fermented :: generics :: std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_data_contract_group_GroupMemberPower , required_power : * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupRequiredPower) -> * mut dpp_data_contract_group_v0_GroupV0 { ferment :: boxed (dpp_data_contract_group_v0_GroupV0 { members , required_power }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_group_v0_GroupV0_destroy < > (ffi : * mut dpp_data_contract_group_v0_GroupV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_group_v0_GroupV0_get_members < > (obj : * const dpp_data_contract_group_v0_GroupV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_data_contract_group_GroupMemberPower { (* obj) . members } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_group_v0_GroupV0_get_required_power < > (obj : * const dpp_data_contract_group_v0_GroupV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupRequiredPower { (* obj) . required_power } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_group_v0_GroupV0_set_members < > (obj : * const dpp_data_contract_group_v0_GroupV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_data_contract_group_GroupMemberPower { (* obj) . members } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_group_v0_GroupV0_set_required_power < > (obj : * const dpp_data_contract_group_v0_GroupV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupRequiredPower { (* obj) . required_power } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`Group`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_group_Group { V0 (* mut crate :: fermented :: types :: dpp :: data_contract :: group :: v0 :: dpp_data_contract_group_v0_GroupV0) } impl ferment :: FFIConversionFrom < dpp :: data_contract :: group :: Group > for dpp_data_contract_group_Group { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_group_Group) -> dpp :: data_contract :: group :: Group { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_group_Group :: V0 (o_0) => dpp :: data_contract :: group :: Group :: V0 (< crate :: fermented :: types :: dpp :: data_contract :: group :: v0 :: dpp_data_contract_group_v0_GroupV0 as ferment :: FFIConversionFrom < dpp :: data_contract :: group :: v0 :: GroupV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: group :: Group > for dpp_data_contract_group_Group { unsafe fn ffi_to_const (obj : dpp :: data_contract :: group :: Group) -> * const dpp_data_contract_group_Group { ferment :: boxed (match obj { dpp :: data_contract :: group :: Group :: V0 (o_0) => dpp_data_contract_group_Group :: V0 (< crate :: fermented :: types :: dpp :: data_contract :: group :: v0 :: dpp_data_contract_group_v0_GroupV0 as ferment :: FFIConversionTo < dpp :: data_contract :: group :: v0 :: GroupV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_group_Group { fn drop (& mut self) { unsafe { match self { dpp_data_contract_group_Group :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_group_Group_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: group :: v0 :: dpp_data_contract_group_v0_GroupV0) -> * mut dpp_data_contract_group_Group { ferment :: boxed (dpp_data_contract_group_Group :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_group_Group_destroy < > (ffi : * mut dpp_data_contract_group_Group) { ferment :: unbox_any (ffi) ; } pub mod methods { use crate as dash_spv_apple_bindings ; } } pub mod document_type { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DocumentType`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_document_type_DocumentType { V0 (* mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: v0 :: dpp_data_contract_document_type_v0_DocumentTypeV0) } impl ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: DocumentType > for dpp_data_contract_document_type_DocumentType { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_document_type_DocumentType) -> dpp :: data_contract :: document_type :: DocumentType { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_document_type_DocumentType :: V0 (o_0) => dpp :: data_contract :: document_type :: DocumentType :: V0 (< crate :: fermented :: types :: dpp :: data_contract :: document_type :: v0 :: dpp_data_contract_document_type_v0_DocumentTypeV0 as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: v0 :: DocumentTypeV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: DocumentType > for dpp_data_contract_document_type_DocumentType { unsafe fn ffi_to_const (obj : dpp :: data_contract :: document_type :: DocumentType) -> * const dpp_data_contract_document_type_DocumentType { ferment :: boxed (match obj { dpp :: data_contract :: document_type :: DocumentType :: V0 (o_0) => dpp_data_contract_document_type_DocumentType :: V0 (< crate :: fermented :: types :: dpp :: data_contract :: document_type :: v0 :: dpp_data_contract_document_type_v0_DocumentTypeV0 as ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: v0 :: DocumentTypeV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_document_type_DocumentType { fn drop (& mut self) { unsafe { match self { dpp_data_contract_document_type_DocumentType :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_DocumentType_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: v0 :: dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut dpp_data_contract_document_type_DocumentType { ferment :: boxed (dpp_data_contract_document_type_DocumentType :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_DocumentType_destroy < > (ffi : * mut dpp_data_contract_document_type_DocumentType) { ferment :: unbox_any (ffi) ; } pub mod schema { use crate as dash_spv_apple_bindings ; # [cfg (feature = "validation")] pub mod recursive_schema_validator { use crate as dash_spv_apple_bindings ; pub mod traversal_validator { use crate as dash_spv_apple_bindings ; } } # [cfg (feature = "validation")] pub mod validate_max_depth { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; } } pub mod find_identifier_and_binary_paths { use crate as dash_spv_apple_bindings ; } pub mod enrich_with_base_schema { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "validation")] pub mod validate_schema_compatibility { use crate as dash_spv_apple_bindings ; } } pub mod methods { use crate as dash_spv_apple_bindings ; pub mod deserialize_value_for_key { use crate as dash_spv_apple_bindings ; } pub mod create_document_with_prevalidated_properties { use crate as dash_spv_apple_bindings ; } pub mod max_size { use crate as dash_spv_apple_bindings ; } pub mod index_for_types { use crate as dash_spv_apple_bindings ; } pub mod serialize_value_for_key { use crate as dash_spv_apple_bindings ; } pub mod estimated_size { use crate as dash_spv_apple_bindings ; } pub mod create_document_from_data { use crate as dash_spv_apple_bindings ; } pub mod contested_vote_poll_for_document { use crate as dash_spv_apple_bindings ; } pub mod prefunded_voting_balances_for_document { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "validation")] pub mod validate_update { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; # [cfg (test)] pub mod tests { use crate as dash_spv_apple_bindings ; } } } } pub mod index { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IndexProperty`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_document_type_index_IndexProperty { pub name : * mut std :: os :: raw :: c_char , pub ascending : bool } impl ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: index :: IndexProperty > for dpp_data_contract_document_type_index_IndexProperty { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_document_type_index_IndexProperty) -> dpp :: data_contract :: document_type :: index :: IndexProperty { let ffi_ref = & * ffi ; dpp :: data_contract :: document_type :: index :: IndexProperty { name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . name) , ascending : ffi_ref . ascending } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: index :: IndexProperty > for dpp_data_contract_document_type_index_IndexProperty { unsafe fn ffi_to_const (obj : dpp :: data_contract :: document_type :: index :: IndexProperty) -> * const dpp_data_contract_document_type_index_IndexProperty { ferment :: boxed (dpp_data_contract_document_type_index_IndexProperty { name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . name) , ascending : obj . ascending }) } } impl Drop for dpp_data_contract_document_type_index_IndexProperty { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . name) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_IndexProperty_ctor < > (name : * mut std :: os :: raw :: c_char , ascending : bool) -> * mut dpp_data_contract_document_type_index_IndexProperty { ferment :: boxed (dpp_data_contract_document_type_index_IndexProperty { name , ascending }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_IndexProperty_destroy < > (ffi : * mut dpp_data_contract_document_type_index_IndexProperty) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_IndexProperty_get_name < > (obj : * const dpp_data_contract_document_type_index_IndexProperty) -> * mut std :: os :: raw :: c_char { (* obj) . name } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_IndexProperty_get_ascending < > (obj : * const dpp_data_contract_document_type_index_IndexProperty) -> bool { (* obj) . ascending } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_IndexProperty_set_name < > (obj : * const dpp_data_contract_document_type_index_IndexProperty) -> * mut std :: os :: raw :: c_char { (* obj) . name } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_IndexProperty_set_ascending < > (obj : * const dpp_data_contract_document_type_index_IndexProperty) -> bool { (* obj) . ascending } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`OrderBy`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_document_type_index_OrderBy { Asc , Desc } impl ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: index :: OrderBy > for dpp_data_contract_document_type_index_OrderBy { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_document_type_index_OrderBy) -> dpp :: data_contract :: document_type :: index :: OrderBy { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_document_type_index_OrderBy :: Asc => dpp :: data_contract :: document_type :: index :: OrderBy :: Asc , dpp_data_contract_document_type_index_OrderBy :: Desc => dpp :: data_contract :: document_type :: index :: OrderBy :: Desc } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: index :: OrderBy > for dpp_data_contract_document_type_index_OrderBy { unsafe fn ffi_to_const (obj : dpp :: data_contract :: document_type :: index :: OrderBy) -> * const dpp_data_contract_document_type_index_OrderBy { ferment :: boxed (match obj { dpp :: data_contract :: document_type :: index :: OrderBy :: Asc => dpp_data_contract_document_type_index_OrderBy :: Asc , dpp :: data_contract :: document_type :: index :: OrderBy :: Desc => dpp_data_contract_document_type_index_OrderBy :: Desc , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_document_type_index_OrderBy { fn drop (& mut self) { unsafe { match self { dpp_data_contract_document_type_index_OrderBy :: Asc => { } , dpp_data_contract_document_type_index_OrderBy :: Desc => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_OrderBy_Asc_ctor () -> * mut dpp_data_contract_document_type_index_OrderBy { ferment :: boxed (dpp_data_contract_document_type_index_OrderBy :: Asc { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_OrderBy_Desc_ctor () -> * mut dpp_data_contract_document_type_index_OrderBy { ferment :: boxed (dpp_data_contract_document_type_index_OrderBy :: Desc { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_OrderBy_destroy < > (ffi : * mut dpp_data_contract_document_type_index_OrderBy) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`ContestedIndexInformation`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_document_type_index_ContestedIndexInformation { pub field_matches : * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_ContestedIndexFieldMatch , pub resolution : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_ContestedIndexResolution } impl ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: index :: ContestedIndexInformation > for dpp_data_contract_document_type_index_ContestedIndexInformation { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_document_type_index_ContestedIndexInformation) -> dpp :: data_contract :: document_type :: index :: ContestedIndexInformation { let ffi_ref = & * ffi ; dpp :: data_contract :: document_type :: index :: ContestedIndexInformation { field_matches : < crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_ContestedIndexFieldMatch as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < String , dpp :: data_contract :: document_type :: index :: ContestedIndexFieldMatch > >> :: ffi_from (ffi_ref . field_matches) , resolution : < crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_ContestedIndexResolution as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: index :: ContestedIndexResolution >> :: ffi_from (ffi_ref . resolution) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: index :: ContestedIndexInformation > for dpp_data_contract_document_type_index_ContestedIndexInformation { unsafe fn ffi_to_const (obj : dpp :: data_contract :: document_type :: index :: ContestedIndexInformation) -> * const dpp_data_contract_document_type_index_ContestedIndexInformation { ferment :: boxed (dpp_data_contract_document_type_index_ContestedIndexInformation { field_matches : < crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_ContestedIndexFieldMatch as ferment :: FFIConversionTo < std :: collections :: BTreeMap < String , dpp :: data_contract :: document_type :: index :: ContestedIndexFieldMatch > >> :: ffi_to (obj . field_matches) , resolution : < crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_ContestedIndexResolution as ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: index :: ContestedIndexResolution >> :: ffi_to (obj . resolution) }) } } impl Drop for dpp_data_contract_document_type_index_ContestedIndexInformation { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . field_matches) ; ferment :: unbox_any (ffi_ref . resolution) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_ContestedIndexInformation_ctor < > (field_matches : * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_ContestedIndexFieldMatch , resolution : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_ContestedIndexResolution) -> * mut dpp_data_contract_document_type_index_ContestedIndexInformation { ferment :: boxed (dpp_data_contract_document_type_index_ContestedIndexInformation { field_matches , resolution }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_ContestedIndexInformation_destroy < > (ffi : * mut dpp_data_contract_document_type_index_ContestedIndexInformation) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_ContestedIndexInformation_get_field_matches < > (obj : * const dpp_data_contract_document_type_index_ContestedIndexInformation) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_ContestedIndexFieldMatch { (* obj) . field_matches } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_ContestedIndexInformation_get_resolution < > (obj : * const dpp_data_contract_document_type_index_ContestedIndexInformation) -> * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_ContestedIndexResolution { (* obj) . resolution } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_ContestedIndexInformation_set_field_matches < > (obj : * const dpp_data_contract_document_type_index_ContestedIndexInformation) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_ContestedIndexFieldMatch { (* obj) . field_matches } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_ContestedIndexInformation_set_resolution < > (obj : * const dpp_data_contract_document_type_index_ContestedIndexInformation) -> * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_ContestedIndexResolution { (* obj) . resolution } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ContestedIndexResolution`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_document_type_index_ContestedIndexResolution { MasternodeVote = 0 } impl ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: index :: ContestedIndexResolution > for dpp_data_contract_document_type_index_ContestedIndexResolution { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_document_type_index_ContestedIndexResolution) -> dpp :: data_contract :: document_type :: index :: ContestedIndexResolution { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_document_type_index_ContestedIndexResolution :: MasternodeVote => dpp :: data_contract :: document_type :: index :: ContestedIndexResolution :: MasternodeVote } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: index :: ContestedIndexResolution > for dpp_data_contract_document_type_index_ContestedIndexResolution { unsafe fn ffi_to_const (obj : dpp :: data_contract :: document_type :: index :: ContestedIndexResolution) -> * const dpp_data_contract_document_type_index_ContestedIndexResolution { ferment :: boxed (match obj { dpp :: data_contract :: document_type :: index :: ContestedIndexResolution :: MasternodeVote => dpp_data_contract_document_type_index_ContestedIndexResolution :: MasternodeVote , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_document_type_index_ContestedIndexResolution { fn drop (& mut self) { unsafe { match self { dpp_data_contract_document_type_index_ContestedIndexResolution :: MasternodeVote => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_ContestedIndexResolution_MasternodeVote_ctor () -> * mut dpp_data_contract_document_type_index_ContestedIndexResolution { ferment :: boxed (dpp_data_contract_document_type_index_ContestedIndexResolution :: MasternodeVote { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_ContestedIndexResolution_destroy < > (ffi : * mut dpp_data_contract_document_type_index_ContestedIndexResolution) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ContestedIndexFieldMatch`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_document_type_index_ContestedIndexFieldMatch { Regex (* mut dash_spv_apple_bindings :: custom :: dpp :: LazyRegexFFI) , PositiveIntegerMatch (* mut [u8 ; 16]) } impl ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: index :: ContestedIndexFieldMatch > for dpp_data_contract_document_type_index_ContestedIndexFieldMatch { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_document_type_index_ContestedIndexFieldMatch) -> dpp :: data_contract :: document_type :: index :: ContestedIndexFieldMatch { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_document_type_index_ContestedIndexFieldMatch :: Regex (o_0) => dpp :: data_contract :: document_type :: index :: ContestedIndexFieldMatch :: Regex (< dash_spv_apple_bindings :: custom :: dpp :: LazyRegexFFI as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: index :: LazyRegex >> :: ffi_from (* o_0)) , dpp_data_contract_document_type_index_ContestedIndexFieldMatch :: PositiveIntegerMatch (o_0) => dpp :: data_contract :: document_type :: index :: ContestedIndexFieldMatch :: PositiveIntegerMatch (< [u8 ; 16] as ferment :: FFIConversionFrom < u128 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: index :: ContestedIndexFieldMatch > for dpp_data_contract_document_type_index_ContestedIndexFieldMatch { unsafe fn ffi_to_const (obj : dpp :: data_contract :: document_type :: index :: ContestedIndexFieldMatch) -> * const dpp_data_contract_document_type_index_ContestedIndexFieldMatch { ferment :: boxed (match obj { dpp :: data_contract :: document_type :: index :: ContestedIndexFieldMatch :: Regex (o_0) => dpp_data_contract_document_type_index_ContestedIndexFieldMatch :: Regex (< dash_spv_apple_bindings :: custom :: dpp :: LazyRegexFFI as ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: index :: LazyRegex >> :: ffi_to (o_0)) , dpp :: data_contract :: document_type :: index :: ContestedIndexFieldMatch :: PositiveIntegerMatch (o_0) => dpp_data_contract_document_type_index_ContestedIndexFieldMatch :: PositiveIntegerMatch (< [u8 ; 16] as ferment :: FFIConversionTo < u128 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_document_type_index_ContestedIndexFieldMatch { fn drop (& mut self) { unsafe { match self { dpp_data_contract_document_type_index_ContestedIndexFieldMatch :: Regex (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_data_contract_document_type_index_ContestedIndexFieldMatch :: PositiveIntegerMatch (o_0) => { ferment :: unbox_any_opt (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_ContestedIndexFieldMatch_Regex_ctor (o_o_0 : * mut dash_spv_apple_bindings :: custom :: dpp :: LazyRegexFFI) -> * mut dpp_data_contract_document_type_index_ContestedIndexFieldMatch { ferment :: boxed (dpp_data_contract_document_type_index_ContestedIndexFieldMatch :: Regex (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_ContestedIndexFieldMatch_PositiveIntegerMatch_ctor (o_o_0 : * mut [u8 ; 16]) -> * mut dpp_data_contract_document_type_index_ContestedIndexFieldMatch { ferment :: boxed (dpp_data_contract_document_type_index_ContestedIndexFieldMatch :: PositiveIntegerMatch (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_ContestedIndexFieldMatch_destroy < > (ffi : * mut dpp_data_contract_document_type_index_ContestedIndexFieldMatch) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`Index`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_document_type_index_Index { pub name : * mut std :: os :: raw :: c_char , pub properties : * mut crate :: fermented :: generics :: Vec_dpp_data_contract_document_type_index_IndexProperty , pub unique : bool , pub null_searchable : bool , pub contested_index : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_ContestedIndexInformation } impl ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: index :: Index > for dpp_data_contract_document_type_index_Index { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_document_type_index_Index) -> dpp :: data_contract :: document_type :: index :: Index { let ffi_ref = & * ffi ; dpp :: data_contract :: document_type :: index :: Index { name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . name) , properties : < crate :: fermented :: generics :: Vec_dpp_data_contract_document_type_index_IndexProperty as ferment :: FFIConversionFrom < Vec < dpp :: data_contract :: document_type :: index :: IndexProperty > >> :: ffi_from (ffi_ref . properties) , unique : ffi_ref . unique , null_searchable : ffi_ref . null_searchable , contested_index : < crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_ContestedIndexInformation as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: index :: ContestedIndexInformation >> :: ffi_from_opt (ffi_ref . contested_index) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: index :: Index > for dpp_data_contract_document_type_index_Index { unsafe fn ffi_to_const (obj : dpp :: data_contract :: document_type :: index :: Index) -> * const dpp_data_contract_document_type_index_Index { ferment :: boxed (dpp_data_contract_document_type_index_Index { name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . name) , properties : < crate :: fermented :: generics :: Vec_dpp_data_contract_document_type_index_IndexProperty as ferment :: FFIConversionTo < Vec < dpp :: data_contract :: document_type :: index :: IndexProperty > >> :: ffi_to (obj . properties) , unique : obj . unique , null_searchable : obj . null_searchable , contested_index : < crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_ContestedIndexInformation as ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: index :: ContestedIndexInformation >> :: ffi_to_opt (obj . contested_index) }) } } impl Drop for dpp_data_contract_document_type_index_Index { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . name) ; ferment :: unbox_any (ffi_ref . properties) ; ; ; ferment :: unbox_any_opt (ffi_ref . contested_index) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_Index_ctor < > (name : * mut std :: os :: raw :: c_char , properties : * mut crate :: fermented :: generics :: Vec_dpp_data_contract_document_type_index_IndexProperty , unique : bool , null_searchable : bool , contested_index : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_ContestedIndexInformation) -> * mut dpp_data_contract_document_type_index_Index { ferment :: boxed (dpp_data_contract_document_type_index_Index { name , properties , unique , null_searchable , contested_index }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_Index_destroy < > (ffi : * mut dpp_data_contract_document_type_index_Index) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_Index_get_name < > (obj : * const dpp_data_contract_document_type_index_Index) -> * mut std :: os :: raw :: c_char { (* obj) . name } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_Index_get_properties < > (obj : * const dpp_data_contract_document_type_index_Index) -> * mut crate :: fermented :: generics :: Vec_dpp_data_contract_document_type_index_IndexProperty { (* obj) . properties } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_Index_get_unique < > (obj : * const dpp_data_contract_document_type_index_Index) -> bool { (* obj) . unique } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_Index_get_null_searchable < > (obj : * const dpp_data_contract_document_type_index_Index) -> bool { (* obj) . null_searchable } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_Index_get_contested_index < > (obj : * const dpp_data_contract_document_type_index_Index) -> * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_ContestedIndexInformation { (* obj) . contested_index } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_Index_set_name < > (obj : * const dpp_data_contract_document_type_index_Index) -> * mut std :: os :: raw :: c_char { (* obj) . name } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_Index_set_properties < > (obj : * const dpp_data_contract_document_type_index_Index) -> * mut crate :: fermented :: generics :: Vec_dpp_data_contract_document_type_index_IndexProperty { (* obj) . properties } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_Index_set_unique < > (obj : * const dpp_data_contract_document_type_index_Index) -> bool { (* obj) . unique } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_Index_set_null_searchable < > (obj : * const dpp_data_contract_document_type_index_Index) -> bool { (* obj) . null_searchable } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_Index_set_contested_index < > (obj : * const dpp_data_contract_document_type_index_Index) -> * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_ContestedIndexInformation { (* obj) . contested_index } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DocumentTypeRef`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_document_type_DocumentTypeRef { V0 (* mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: v0 :: dpp_data_contract_document_type_v0_DocumentTypeV0) } impl < 'a , > ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: DocumentTypeRef < 'a > > for dpp_data_contract_document_type_DocumentTypeRef { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_document_type_DocumentTypeRef) -> dpp :: data_contract :: document_type :: DocumentTypeRef < 'a > { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_document_type_DocumentTypeRef :: V0 (o_0) => dpp :: data_contract :: document_type :: DocumentTypeRef :: V0 (Box :: leak (Box :: new (< crate :: fermented :: types :: dpp :: data_contract :: document_type :: v0 :: dpp_data_contract_document_type_v0_DocumentTypeV0 as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: v0 :: DocumentTypeV0 >> :: ffi_from (* o_0)))) } } } impl < 'a , > ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: DocumentTypeRef < 'a > > for dpp_data_contract_document_type_DocumentTypeRef { unsafe fn ffi_to_const (obj : dpp :: data_contract :: document_type :: DocumentTypeRef < 'a >) -> * const dpp_data_contract_document_type_DocumentTypeRef { ferment :: boxed (match obj { dpp :: data_contract :: document_type :: DocumentTypeRef :: V0 (o_0) => dpp_data_contract_document_type_DocumentTypeRef :: V0 (< crate :: fermented :: types :: dpp :: data_contract :: document_type :: v0 :: dpp_data_contract_document_type_v0_DocumentTypeV0 as ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: v0 :: DocumentTypeV0 >> :: ffi_to (o_0 . clone ())) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_document_type_DocumentTypeRef { fn drop (& mut self) { unsafe { match self { dpp_data_contract_document_type_DocumentTypeRef :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_DocumentTypeRef_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: v0 :: dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut dpp_data_contract_document_type_DocumentTypeRef { ferment :: boxed (dpp_data_contract_document_type_DocumentTypeRef :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_DocumentTypeRef_destroy < 'a > (ffi : * mut dpp_data_contract_document_type_DocumentTypeRef) { ferment :: unbox_any (ffi) ; } pub mod accessors { use crate as dash_spv_apple_bindings ; } pub mod restricted_creation { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`CreationRestrictionMode`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode { NoRestrictions , OwnerOnly , NoCreationAllowed } impl ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: restricted_creation :: CreationRestrictionMode > for dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode) -> dpp :: data_contract :: document_type :: restricted_creation :: CreationRestrictionMode { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode :: NoRestrictions => dpp :: data_contract :: document_type :: restricted_creation :: CreationRestrictionMode :: NoRestrictions , dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode :: OwnerOnly => dpp :: data_contract :: document_type :: restricted_creation :: CreationRestrictionMode :: OwnerOnly , dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode :: NoCreationAllowed => dpp :: data_contract :: document_type :: restricted_creation :: CreationRestrictionMode :: NoCreationAllowed } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: restricted_creation :: CreationRestrictionMode > for dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode { unsafe fn ffi_to_const (obj : dpp :: data_contract :: document_type :: restricted_creation :: CreationRestrictionMode) -> * const dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode { ferment :: boxed (match obj { dpp :: data_contract :: document_type :: restricted_creation :: CreationRestrictionMode :: NoRestrictions => dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode :: NoRestrictions , dpp :: data_contract :: document_type :: restricted_creation :: CreationRestrictionMode :: OwnerOnly => dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode :: OwnerOnly , dpp :: data_contract :: document_type :: restricted_creation :: CreationRestrictionMode :: NoCreationAllowed => dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode :: NoCreationAllowed , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode { fn drop (& mut self) { unsafe { match self { dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode :: NoRestrictions => { } , dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode :: OwnerOnly => { } , dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode :: NoCreationAllowed => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode_NoRestrictions_ctor () -> * mut dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode { ferment :: boxed (dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode :: NoRestrictions { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode_OwnerOnly_ctor () -> * mut dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode { ferment :: boxed (dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode :: OwnerOnly { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode_NoCreationAllowed_ctor () -> * mut dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode { ferment :: boxed (dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode :: NoCreationAllowed { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode_destroy < > (ffi : * mut dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode) { ferment :: unbox_any (ffi) ; } } pub mod index_level { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`IndexLevel`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_document_type_index_level_IndexLevel { pub sub_index_levels : * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_level_IndexLevel , pub has_index_with_type : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexLevelTypeInfo , pub level_identifier : u64 } impl ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: index_level :: IndexLevel > for dpp_data_contract_document_type_index_level_IndexLevel { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_document_type_index_level_IndexLevel) -> dpp :: data_contract :: document_type :: index_level :: IndexLevel { let ffi_ref = & * ffi ; dpp :: data_contract :: document_type :: index_level :: IndexLevel { sub_index_levels : < crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_level_IndexLevel as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < String , dpp :: data_contract :: document_type :: index_level :: IndexLevel > >> :: ffi_from (ffi_ref . sub_index_levels) , has_index_with_type : < crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexLevelTypeInfo as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: index_level :: IndexLevelTypeInfo >> :: ffi_from_opt (ffi_ref . has_index_with_type) , level_identifier : ffi_ref . level_identifier } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: index_level :: IndexLevel > for dpp_data_contract_document_type_index_level_IndexLevel { unsafe fn ffi_to_const (obj : dpp :: data_contract :: document_type :: index_level :: IndexLevel) -> * const dpp_data_contract_document_type_index_level_IndexLevel { ferment :: boxed (dpp_data_contract_document_type_index_level_IndexLevel { sub_index_levels : < crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_level_IndexLevel as ferment :: FFIConversionTo < std :: collections :: BTreeMap < String , dpp :: data_contract :: document_type :: index_level :: IndexLevel > >> :: ffi_to (obj . sub_index_levels) , has_index_with_type : < crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexLevelTypeInfo as ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: index_level :: IndexLevelTypeInfo >> :: ffi_to_opt (obj . has_index_with_type) , level_identifier : obj . level_identifier }) } } impl Drop for dpp_data_contract_document_type_index_level_IndexLevel { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . sub_index_levels) ; ferment :: unbox_any_opt (ffi_ref . has_index_with_type) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_level_IndexLevel_ctor < > (sub_index_levels : * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_level_IndexLevel , has_index_with_type : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexLevelTypeInfo , level_identifier : u64) -> * mut dpp_data_contract_document_type_index_level_IndexLevel { ferment :: boxed (dpp_data_contract_document_type_index_level_IndexLevel { sub_index_levels , has_index_with_type , level_identifier }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_level_IndexLevel_destroy < > (ffi : * mut dpp_data_contract_document_type_index_level_IndexLevel) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_level_IndexLevel_get_sub_index_levels < > (obj : * const dpp_data_contract_document_type_index_level_IndexLevel) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_level_IndexLevel { (* obj) . sub_index_levels } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_level_IndexLevel_get_has_index_with_type < > (obj : * const dpp_data_contract_document_type_index_level_IndexLevel) -> * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexLevelTypeInfo { (* obj) . has_index_with_type } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_level_IndexLevel_get_level_identifier < > (obj : * const dpp_data_contract_document_type_index_level_IndexLevel) -> u64 { (* obj) . level_identifier } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_level_IndexLevel_set_sub_index_levels < > (obj : * const dpp_data_contract_document_type_index_level_IndexLevel) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_level_IndexLevel { (* obj) . sub_index_levels } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_level_IndexLevel_set_has_index_with_type < > (obj : * const dpp_data_contract_document_type_index_level_IndexLevel) -> * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexLevelTypeInfo { (* obj) . has_index_with_type } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_level_IndexLevel_set_level_identifier < > (obj : * const dpp_data_contract_document_type_index_level_IndexLevel) -> u64 { (* obj) . level_identifier } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`IndexType`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_document_type_index_level_IndexType { NonUniqueIndex , UniqueIndex , ContestedResourceIndex } impl ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: index_level :: IndexType > for dpp_data_contract_document_type_index_level_IndexType { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_document_type_index_level_IndexType) -> dpp :: data_contract :: document_type :: index_level :: IndexType { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_document_type_index_level_IndexType :: NonUniqueIndex => dpp :: data_contract :: document_type :: index_level :: IndexType :: NonUniqueIndex , dpp_data_contract_document_type_index_level_IndexType :: UniqueIndex => dpp :: data_contract :: document_type :: index_level :: IndexType :: UniqueIndex , dpp_data_contract_document_type_index_level_IndexType :: ContestedResourceIndex => dpp :: data_contract :: document_type :: index_level :: IndexType :: ContestedResourceIndex } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: index_level :: IndexType > for dpp_data_contract_document_type_index_level_IndexType { unsafe fn ffi_to_const (obj : dpp :: data_contract :: document_type :: index_level :: IndexType) -> * const dpp_data_contract_document_type_index_level_IndexType { ferment :: boxed (match obj { dpp :: data_contract :: document_type :: index_level :: IndexType :: NonUniqueIndex => dpp_data_contract_document_type_index_level_IndexType :: NonUniqueIndex , dpp :: data_contract :: document_type :: index_level :: IndexType :: UniqueIndex => dpp_data_contract_document_type_index_level_IndexType :: UniqueIndex , dpp :: data_contract :: document_type :: index_level :: IndexType :: ContestedResourceIndex => dpp_data_contract_document_type_index_level_IndexType :: ContestedResourceIndex , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_document_type_index_level_IndexType { fn drop (& mut self) { unsafe { match self { dpp_data_contract_document_type_index_level_IndexType :: NonUniqueIndex => { } , dpp_data_contract_document_type_index_level_IndexType :: UniqueIndex => { } , dpp_data_contract_document_type_index_level_IndexType :: ContestedResourceIndex => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_level_IndexType_NonUniqueIndex_ctor () -> * mut dpp_data_contract_document_type_index_level_IndexType { ferment :: boxed (dpp_data_contract_document_type_index_level_IndexType :: NonUniqueIndex { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_level_IndexType_UniqueIndex_ctor () -> * mut dpp_data_contract_document_type_index_level_IndexType { ferment :: boxed (dpp_data_contract_document_type_index_level_IndexType :: UniqueIndex { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_level_IndexType_ContestedResourceIndex_ctor () -> * mut dpp_data_contract_document_type_index_level_IndexType { ferment :: boxed (dpp_data_contract_document_type_index_level_IndexType :: ContestedResourceIndex { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_level_IndexType_destroy < > (ffi : * mut dpp_data_contract_document_type_index_level_IndexType) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`IndexLevelTypeInfo`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_document_type_index_level_IndexLevelTypeInfo { pub should_insert_with_all_null : bool , pub index_type : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexType } impl ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: index_level :: IndexLevelTypeInfo > for dpp_data_contract_document_type_index_level_IndexLevelTypeInfo { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_document_type_index_level_IndexLevelTypeInfo) -> dpp :: data_contract :: document_type :: index_level :: IndexLevelTypeInfo { let ffi_ref = & * ffi ; dpp :: data_contract :: document_type :: index_level :: IndexLevelTypeInfo { should_insert_with_all_null : ffi_ref . should_insert_with_all_null , index_type : < crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexType as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: index_level :: IndexType >> :: ffi_from (ffi_ref . index_type) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: index_level :: IndexLevelTypeInfo > for dpp_data_contract_document_type_index_level_IndexLevelTypeInfo { unsafe fn ffi_to_const (obj : dpp :: data_contract :: document_type :: index_level :: IndexLevelTypeInfo) -> * const dpp_data_contract_document_type_index_level_IndexLevelTypeInfo { ferment :: boxed (dpp_data_contract_document_type_index_level_IndexLevelTypeInfo { should_insert_with_all_null : obj . should_insert_with_all_null , index_type : < crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexType as ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: index_level :: IndexType >> :: ffi_to (obj . index_type) }) } } impl Drop for dpp_data_contract_document_type_index_level_IndexLevelTypeInfo { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_any (ffi_ref . index_type) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_level_IndexLevelTypeInfo_ctor < > (should_insert_with_all_null : bool , index_type : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexType) -> * mut dpp_data_contract_document_type_index_level_IndexLevelTypeInfo { ferment :: boxed (dpp_data_contract_document_type_index_level_IndexLevelTypeInfo { should_insert_with_all_null , index_type }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_level_IndexLevelTypeInfo_destroy < > (ffi : * mut dpp_data_contract_document_type_index_level_IndexLevelTypeInfo) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_level_IndexLevelTypeInfo_get_should_insert_with_all_null < > (obj : * const dpp_data_contract_document_type_index_level_IndexLevelTypeInfo) -> bool { (* obj) . should_insert_with_all_null } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_level_IndexLevelTypeInfo_get_index_type < > (obj : * const dpp_data_contract_document_type_index_level_IndexLevelTypeInfo) -> * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexType { (* obj) . index_type } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_level_IndexLevelTypeInfo_set_should_insert_with_all_null < > (obj : * const dpp_data_contract_document_type_index_level_IndexLevelTypeInfo) -> bool { (* obj) . should_insert_with_all_null } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_index_level_IndexLevelTypeInfo_set_index_type < > (obj : * const dpp_data_contract_document_type_index_level_IndexLevelTypeInfo) -> * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexType { (* obj) . index_type } } pub mod v0 { use crate as dash_spv_apple_bindings ; # [cfg (feature = "validation")] pub mod validator { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`StatelessJsonSchemaLazyValidator`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_document_type_v0_validator_StatelessJsonSchemaLazyValidator (* mut dpp :: validation :: json_schema_validator :: dpp_validation_JsonSchemaValidator) ; impl ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: v0 :: validator :: StatelessJsonSchemaLazyValidator > for dpp_data_contract_document_type_v0_validator_StatelessJsonSchemaLazyValidator { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_document_type_v0_validator_StatelessJsonSchemaLazyValidator) -> dpp :: data_contract :: document_type :: v0 :: validator :: StatelessJsonSchemaLazyValidator { let ffi_ref = & * ffi ; dpp :: data_contract :: document_type :: v0 :: validator :: StatelessJsonSchemaLazyValidator (< dpp :: validation :: json_schema_validator :: dpp_validation_JsonSchemaValidator as ferment :: FFIConversionFrom < dpp :: validation :: json_schema_validator :: JsonSchemaValidator >> :: ffi_from (ffi_ref . 0)) } } impl ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: v0 :: validator :: StatelessJsonSchemaLazyValidator > for dpp_data_contract_document_type_v0_validator_StatelessJsonSchemaLazyValidator { unsafe fn ffi_to_const (obj : dpp :: data_contract :: document_type :: v0 :: validator :: StatelessJsonSchemaLazyValidator) -> * const dpp_data_contract_document_type_v0_validator_StatelessJsonSchemaLazyValidator { ferment :: boxed (dpp_data_contract_document_type_v0_validator_StatelessJsonSchemaLazyValidator (< dpp :: validation :: json_schema_validator :: dpp_validation_JsonSchemaValidator as ferment :: FFIConversionTo < dpp :: validation :: json_schema_validator :: JsonSchemaValidator >> :: ffi_to (obj . 0))) } } impl Drop for dpp_data_contract_document_type_v0_validator_StatelessJsonSchemaLazyValidator { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_validator_StatelessJsonSchemaLazyValidator_ctor < > (o_0 : * mut dpp :: validation :: json_schema_validator :: dpp_validation_JsonSchemaValidator) -> * mut dpp_data_contract_document_type_v0_validator_StatelessJsonSchemaLazyValidator { ferment :: boxed (dpp_data_contract_document_type_v0_validator_StatelessJsonSchemaLazyValidator (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_validator_StatelessJsonSchemaLazyValidator_destroy < > (ffi : * mut dpp_data_contract_document_type_v0_validator_StatelessJsonSchemaLazyValidator) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_validator_StatelessJsonSchemaLazyValidator_get_0 < > (obj : * const dpp_data_contract_document_type_v0_validator_StatelessJsonSchemaLazyValidator) -> * mut dpp :: validation :: json_schema_validator :: dpp_validation_JsonSchemaValidator { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_validator_StatelessJsonSchemaLazyValidator_set_0 < > (obj : * const dpp_data_contract_document_type_v0_validator_StatelessJsonSchemaLazyValidator) -> * mut dpp :: validation :: json_schema_validator :: dpp_validation_JsonSchemaValidator { (* obj) . 0 } } # [doc = "FFI-representation of the [`DocumentTypeV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_document_type_v0_DocumentTypeV0 { pub name : * mut std :: os :: raw :: c_char , pub schema : * mut crate :: fermented :: types :: platform_value :: platform_value_Value , pub indices : * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_Index , pub index_structure : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexLevel , pub flattened_properties : * mut crate :: fermented :: generics :: indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty , pub properties : * mut crate :: fermented :: generics :: indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty , pub identifier_paths : * mut crate :: fermented :: generics :: std_collections_BTreeSet_String , pub binary_paths : * mut crate :: fermented :: generics :: std_collections_BTreeSet_String , pub required_fields : * mut crate :: fermented :: generics :: std_collections_BTreeSet_String , pub transient_fields : * mut crate :: fermented :: generics :: std_collections_BTreeSet_String , pub documents_keep_history : bool , pub documents_mutable : bool , pub documents_can_be_deleted : bool , pub documents_transferable : * mut crate :: fermented :: types :: dpp :: document :: transfer :: dpp_document_transfer_Transferable , pub trade_mode : * mut crate :: fermented :: types :: dpp :: nft :: dpp_nft_TradeMode , pub creation_restriction_mode : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: restricted_creation :: dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode , pub data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub requires_identity_encryption_bounded_key : * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements , pub requires_identity_decryption_bounded_key : * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements , pub security_level_requirement : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel } impl ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: v0 :: DocumentTypeV0 > for dpp_data_contract_document_type_v0_DocumentTypeV0 { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> dpp :: data_contract :: document_type :: v0 :: DocumentTypeV0 { let ffi_ref = & * ffi ; dpp :: data_contract :: document_type :: v0 :: DocumentTypeV0 { name : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . name) , schema : < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionFrom < platform_value :: Value >> :: ffi_from (ffi_ref . schema) , indices : < crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_Index as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < String , dpp :: data_contract :: document_type :: index :: Index > >> :: ffi_from (ffi_ref . indices) , index_structure : < crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexLevel as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: index_level :: IndexLevel >> :: ffi_from (ffi_ref . index_structure) , flattened_properties : < crate :: fermented :: generics :: indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty as ferment :: FFIConversionFrom < indexmap :: IndexMap < String , dpp :: data_contract :: document_type :: property :: DocumentProperty > >> :: ffi_from (ffi_ref . flattened_properties) , properties : < crate :: fermented :: generics :: indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty as ferment :: FFIConversionFrom < indexmap :: IndexMap < String , dpp :: data_contract :: document_type :: property :: DocumentProperty > >> :: ffi_from (ffi_ref . properties) , identifier_paths : < crate :: fermented :: generics :: std_collections_BTreeSet_String as ferment :: FFIConversionFrom < std :: collections :: BTreeSet < String > >> :: ffi_from (ffi_ref . identifier_paths) , binary_paths : < crate :: fermented :: generics :: std_collections_BTreeSet_String as ferment :: FFIConversionFrom < std :: collections :: BTreeSet < String > >> :: ffi_from (ffi_ref . binary_paths) , required_fields : < crate :: fermented :: generics :: std_collections_BTreeSet_String as ferment :: FFIConversionFrom < std :: collections :: BTreeSet < String > >> :: ffi_from (ffi_ref . required_fields) , transient_fields : < crate :: fermented :: generics :: std_collections_BTreeSet_String as ferment :: FFIConversionFrom < std :: collections :: BTreeSet < String > >> :: ffi_from (ffi_ref . transient_fields) , documents_keep_history : ffi_ref . documents_keep_history , documents_mutable : ffi_ref . documents_mutable , documents_can_be_deleted : ffi_ref . documents_can_be_deleted , documents_transferable : < crate :: fermented :: types :: dpp :: document :: transfer :: dpp_document_transfer_Transferable as ferment :: FFIConversionFrom < dpp :: document :: transfer :: Transferable >> :: ffi_from (ffi_ref . documents_transferable) , trade_mode : < crate :: fermented :: types :: dpp :: nft :: dpp_nft_TradeMode as ferment :: FFIConversionFrom < dpp :: nft :: TradeMode >> :: ffi_from (ffi_ref . trade_mode) , creation_restriction_mode : < crate :: fermented :: types :: dpp :: data_contract :: document_type :: restricted_creation :: dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: restricted_creation :: CreationRestrictionMode >> :: ffi_from (ffi_ref . creation_restriction_mode) , data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . data_contract_id) , requires_identity_encryption_bounded_key : < crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements as ferment :: FFIConversionFrom < dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements >> :: ffi_from_opt (ffi_ref . requires_identity_encryption_bounded_key) , requires_identity_decryption_bounded_key : < crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements as ferment :: FFIConversionFrom < dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements >> :: ffi_from_opt (ffi_ref . requires_identity_decryption_bounded_key) , security_level_requirement : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_from (ffi_ref . security_level_requirement) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: v0 :: DocumentTypeV0 > for dpp_data_contract_document_type_v0_DocumentTypeV0 { unsafe fn ffi_to_const (obj : dpp :: data_contract :: document_type :: v0 :: DocumentTypeV0) -> * const dpp_data_contract_document_type_v0_DocumentTypeV0 { ferment :: boxed (dpp_data_contract_document_type_v0_DocumentTypeV0 { name : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . name) , schema : < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionTo < platform_value :: Value >> :: ffi_to (obj . schema) , indices : < crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_Index as ferment :: FFIConversionTo < std :: collections :: BTreeMap < String , dpp :: data_contract :: document_type :: index :: Index > >> :: ffi_to (obj . indices) , index_structure : < crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexLevel as ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: index_level :: IndexLevel >> :: ffi_to (obj . index_structure) , flattened_properties : < crate :: fermented :: generics :: indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty as ferment :: FFIConversionTo < indexmap :: IndexMap < String , dpp :: data_contract :: document_type :: property :: DocumentProperty > >> :: ffi_to (obj . flattened_properties) , properties : < crate :: fermented :: generics :: indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty as ferment :: FFIConversionTo < indexmap :: IndexMap < String , dpp :: data_contract :: document_type :: property :: DocumentProperty > >> :: ffi_to (obj . properties) , identifier_paths : < crate :: fermented :: generics :: std_collections_BTreeSet_String as ferment :: FFIConversionTo < std :: collections :: BTreeSet < String > >> :: ffi_to (obj . identifier_paths) , binary_paths : < crate :: fermented :: generics :: std_collections_BTreeSet_String as ferment :: FFIConversionTo < std :: collections :: BTreeSet < String > >> :: ffi_to (obj . binary_paths) , required_fields : < crate :: fermented :: generics :: std_collections_BTreeSet_String as ferment :: FFIConversionTo < std :: collections :: BTreeSet < String > >> :: ffi_to (obj . required_fields) , transient_fields : < crate :: fermented :: generics :: std_collections_BTreeSet_String as ferment :: FFIConversionTo < std :: collections :: BTreeSet < String > >> :: ffi_to (obj . transient_fields) , documents_keep_history : obj . documents_keep_history , documents_mutable : obj . documents_mutable , documents_can_be_deleted : obj . documents_can_be_deleted , documents_transferable : < crate :: fermented :: types :: dpp :: document :: transfer :: dpp_document_transfer_Transferable as ferment :: FFIConversionTo < dpp :: document :: transfer :: Transferable >> :: ffi_to (obj . documents_transferable) , trade_mode : < crate :: fermented :: types :: dpp :: nft :: dpp_nft_TradeMode as ferment :: FFIConversionTo < dpp :: nft :: TradeMode >> :: ffi_to (obj . trade_mode) , creation_restriction_mode : < crate :: fermented :: types :: dpp :: data_contract :: document_type :: restricted_creation :: dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode as ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: restricted_creation :: CreationRestrictionMode >> :: ffi_to (obj . creation_restriction_mode) , data_contract_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . data_contract_id) , requires_identity_encryption_bounded_key : < crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements as ferment :: FFIConversionTo < dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements >> :: ffi_to_opt (obj . requires_identity_encryption_bounded_key) , requires_identity_decryption_bounded_key : < crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements as ferment :: FFIConversionTo < dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements >> :: ffi_to_opt (obj . requires_identity_decryption_bounded_key) , security_level_requirement : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >> :: ffi_to (obj . security_level_requirement) }) } } impl Drop for dpp_data_contract_document_type_v0_DocumentTypeV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . name) ; ferment :: unbox_any (ffi_ref . schema) ; ferment :: unbox_any (ffi_ref . indices) ; ferment :: unbox_any (ffi_ref . index_structure) ; ferment :: unbox_any (ffi_ref . flattened_properties) ; ferment :: unbox_any (ffi_ref . properties) ; ferment :: unbox_any (ffi_ref . identifier_paths) ; ferment :: unbox_any (ffi_ref . binary_paths) ; ferment :: unbox_any (ffi_ref . required_fields) ; ferment :: unbox_any (ffi_ref . transient_fields) ; ; ; ; ferment :: unbox_any (ffi_ref . documents_transferable) ; ferment :: unbox_any (ffi_ref . trade_mode) ; ferment :: unbox_any (ffi_ref . creation_restriction_mode) ; ferment :: unbox_any (ffi_ref . data_contract_id) ; ferment :: unbox_any_opt (ffi_ref . requires_identity_encryption_bounded_key) ; ferment :: unbox_any_opt (ffi_ref . requires_identity_decryption_bounded_key) ; ferment :: unbox_any (ffi_ref . security_level_requirement) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_ctor < > (name : * mut std :: os :: raw :: c_char , schema : * mut crate :: fermented :: types :: platform_value :: platform_value_Value , indices : * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_Index , index_structure : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexLevel , flattened_properties : * mut crate :: fermented :: generics :: indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty , properties : * mut crate :: fermented :: generics :: indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty , identifier_paths : * mut crate :: fermented :: generics :: std_collections_BTreeSet_String , binary_paths : * mut crate :: fermented :: generics :: std_collections_BTreeSet_String , required_fields : * mut crate :: fermented :: generics :: std_collections_BTreeSet_String , transient_fields : * mut crate :: fermented :: generics :: std_collections_BTreeSet_String , documents_keep_history : bool , documents_mutable : bool , documents_can_be_deleted : bool , documents_transferable : * mut crate :: fermented :: types :: dpp :: document :: transfer :: dpp_document_transfer_Transferable , trade_mode : * mut crate :: fermented :: types :: dpp :: nft :: dpp_nft_TradeMode , creation_restriction_mode : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: restricted_creation :: dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode , data_contract_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , requires_identity_encryption_bounded_key : * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements , requires_identity_decryption_bounded_key : * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements , security_level_requirement : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel) -> * mut dpp_data_contract_document_type_v0_DocumentTypeV0 { ferment :: boxed (dpp_data_contract_document_type_v0_DocumentTypeV0 { name , schema , indices , index_structure , flattened_properties , properties , identifier_paths , binary_paths , required_fields , transient_fields , documents_keep_history , documents_mutable , documents_can_be_deleted , documents_transferable , trade_mode , creation_restriction_mode , data_contract_id , requires_identity_encryption_bounded_key , requires_identity_decryption_bounded_key , security_level_requirement }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_destroy < > (ffi : * mut dpp_data_contract_document_type_v0_DocumentTypeV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_name < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut std :: os :: raw :: c_char { (* obj) . name } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_schema < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: types :: platform_value :: platform_value_Value { (* obj) . schema } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_indices < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_Index { (* obj) . indices } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_index_structure < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexLevel { (* obj) . index_structure } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_flattened_properties < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: generics :: indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty { (* obj) . flattened_properties } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_properties < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: generics :: indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty { (* obj) . properties } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_identifier_paths < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: generics :: std_collections_BTreeSet_String { (* obj) . identifier_paths } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_binary_paths < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: generics :: std_collections_BTreeSet_String { (* obj) . binary_paths } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_required_fields < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: generics :: std_collections_BTreeSet_String { (* obj) . required_fields } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_transient_fields < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: generics :: std_collections_BTreeSet_String { (* obj) . transient_fields } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_documents_keep_history < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> bool { (* obj) . documents_keep_history } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_documents_mutable < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> bool { (* obj) . documents_mutable } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_documents_can_be_deleted < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> bool { (* obj) . documents_can_be_deleted } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_documents_transferable < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: types :: dpp :: document :: transfer :: dpp_document_transfer_Transferable { (* obj) . documents_transferable } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_trade_mode < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: types :: dpp :: nft :: dpp_nft_TradeMode { (* obj) . trade_mode } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_creation_restriction_mode < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: restricted_creation :: dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode { (* obj) . creation_restriction_mode } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_data_contract_id < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_requires_identity_encryption_bounded_key < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { (* obj) . requires_identity_encryption_bounded_key } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_requires_identity_decryption_bounded_key < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { (* obj) . requires_identity_decryption_bounded_key } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_get_security_level_requirement < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . security_level_requirement } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_name < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut std :: os :: raw :: c_char { (* obj) . name } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_schema < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: types :: platform_value :: platform_value_Value { (* obj) . schema } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_indices < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_Index { (* obj) . indices } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_index_structure < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexLevel { (* obj) . index_structure } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_flattened_properties < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: generics :: indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty { (* obj) . flattened_properties } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_properties < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: generics :: indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty { (* obj) . properties } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_identifier_paths < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: generics :: std_collections_BTreeSet_String { (* obj) . identifier_paths } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_binary_paths < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: generics :: std_collections_BTreeSet_String { (* obj) . binary_paths } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_required_fields < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: generics :: std_collections_BTreeSet_String { (* obj) . required_fields } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_transient_fields < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: generics :: std_collections_BTreeSet_String { (* obj) . transient_fields } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_documents_keep_history < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> bool { (* obj) . documents_keep_history } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_documents_mutable < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> bool { (* obj) . documents_mutable } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_documents_can_be_deleted < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> bool { (* obj) . documents_can_be_deleted } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_documents_transferable < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: types :: dpp :: document :: transfer :: dpp_document_transfer_Transferable { (* obj) . documents_transferable } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_trade_mode < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: types :: dpp :: nft :: dpp_nft_TradeMode { (* obj) . trade_mode } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_creation_restriction_mode < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: restricted_creation :: dpp_data_contract_document_type_restricted_creation_CreationRestrictionMode { (* obj) . creation_restriction_mode } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_data_contract_id < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . data_contract_id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_requires_identity_encryption_bounded_key < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { (* obj) . requires_identity_encryption_bounded_key } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_requires_identity_decryption_bounded_key < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { (* obj) . requires_identity_decryption_bounded_key } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_v0_DocumentTypeV0_set_security_level_requirement < > (obj : * const dpp_data_contract_document_type_v0_DocumentTypeV0) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel { (* obj) . security_level_requirement } } pub mod class_methods { use crate as dash_spv_apple_bindings ; pub mod try_from_schema { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; # [cfg (test)] pub mod tests { use crate as dash_spv_apple_bindings ; } } } pub mod create_document_types_from_document_schemas { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; } } } pub mod property { use crate as dash_spv_apple_bindings ; pub mod array { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`ArrayItemType`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_document_type_property_array_ArrayItemType { Integer , Number , String (* mut usize , * mut usize) , ByteArray (* mut usize , * mut usize) , Identifier , Boolean , Date } impl ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: property :: array :: ArrayItemType > for dpp_data_contract_document_type_property_array_ArrayItemType { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_document_type_property_array_ArrayItemType) -> dpp :: data_contract :: document_type :: property :: array :: ArrayItemType { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_document_type_property_array_ArrayItemType :: Integer => dpp :: data_contract :: document_type :: property :: array :: ArrayItemType :: Integer , dpp_data_contract_document_type_property_array_ArrayItemType :: Number => dpp :: data_contract :: document_type :: property :: array :: ArrayItemType :: Number , dpp_data_contract_document_type_property_array_ArrayItemType :: String (o_0 , o_1) => dpp :: data_contract :: document_type :: property :: array :: ArrayItemType :: String (ferment :: from_opt_primitive (* o_0) , ferment :: from_opt_primitive (* o_1)) , dpp_data_contract_document_type_property_array_ArrayItemType :: ByteArray (o_0 , o_1) => dpp :: data_contract :: document_type :: property :: array :: ArrayItemType :: ByteArray (ferment :: from_opt_primitive (* o_0) , ferment :: from_opt_primitive (* o_1)) , dpp_data_contract_document_type_property_array_ArrayItemType :: Identifier => dpp :: data_contract :: document_type :: property :: array :: ArrayItemType :: Identifier , dpp_data_contract_document_type_property_array_ArrayItemType :: Boolean => dpp :: data_contract :: document_type :: property :: array :: ArrayItemType :: Boolean , dpp_data_contract_document_type_property_array_ArrayItemType :: Date => dpp :: data_contract :: document_type :: property :: array :: ArrayItemType :: Date } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: property :: array :: ArrayItemType > for dpp_data_contract_document_type_property_array_ArrayItemType { unsafe fn ffi_to_const (obj : dpp :: data_contract :: document_type :: property :: array :: ArrayItemType) -> * const dpp_data_contract_document_type_property_array_ArrayItemType { ferment :: boxed (match obj { dpp :: data_contract :: document_type :: property :: array :: ArrayItemType :: Integer => dpp_data_contract_document_type_property_array_ArrayItemType :: Integer , dpp :: data_contract :: document_type :: property :: array :: ArrayItemType :: Number => dpp_data_contract_document_type_property_array_ArrayItemType :: Number , dpp :: data_contract :: document_type :: property :: array :: ArrayItemType :: String (o_0 , o_1) => dpp_data_contract_document_type_property_array_ArrayItemType :: String (ferment :: to_opt_primitive (o_0) , ferment :: to_opt_primitive (o_1)) , dpp :: data_contract :: document_type :: property :: array :: ArrayItemType :: ByteArray (o_0 , o_1) => dpp_data_contract_document_type_property_array_ArrayItemType :: ByteArray (ferment :: to_opt_primitive (o_0) , ferment :: to_opt_primitive (o_1)) , dpp :: data_contract :: document_type :: property :: array :: ArrayItemType :: Identifier => dpp_data_contract_document_type_property_array_ArrayItemType :: Identifier , dpp :: data_contract :: document_type :: property :: array :: ArrayItemType :: Boolean => dpp_data_contract_document_type_property_array_ArrayItemType :: Boolean , dpp :: data_contract :: document_type :: property :: array :: ArrayItemType :: Date => dpp_data_contract_document_type_property_array_ArrayItemType :: Date , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_document_type_property_array_ArrayItemType { fn drop (& mut self) { unsafe { match self { dpp_data_contract_document_type_property_array_ArrayItemType :: Integer => { } , dpp_data_contract_document_type_property_array_ArrayItemType :: Number => { } , dpp_data_contract_document_type_property_array_ArrayItemType :: String (o_0 , o_1) => { ferment :: destroy_opt_primitive (* o_0) ; ; ferment :: destroy_opt_primitive (* o_1) ; } , dpp_data_contract_document_type_property_array_ArrayItemType :: ByteArray (o_0 , o_1) => { ferment :: destroy_opt_primitive (* o_0) ; ; ferment :: destroy_opt_primitive (* o_1) ; } , dpp_data_contract_document_type_property_array_ArrayItemType :: Identifier => { } , dpp_data_contract_document_type_property_array_ArrayItemType :: Boolean => { } , dpp_data_contract_document_type_property_array_ArrayItemType :: Date => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_array_ArrayItemType_Integer_ctor () -> * mut dpp_data_contract_document_type_property_array_ArrayItemType { ferment :: boxed (dpp_data_contract_document_type_property_array_ArrayItemType :: Integer { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_array_ArrayItemType_Number_ctor () -> * mut dpp_data_contract_document_type_property_array_ArrayItemType { ferment :: boxed (dpp_data_contract_document_type_property_array_ArrayItemType :: Number { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_array_ArrayItemType_String_ctor (o_o_0 : * mut usize , o_o_1 : * mut usize) -> * mut dpp_data_contract_document_type_property_array_ArrayItemType { ferment :: boxed (dpp_data_contract_document_type_property_array_ArrayItemType :: String (o_o_0 , o_o_1)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_array_ArrayItemType_ByteArray_ctor (o_o_0 : * mut usize , o_o_1 : * mut usize) -> * mut dpp_data_contract_document_type_property_array_ArrayItemType { ferment :: boxed (dpp_data_contract_document_type_property_array_ArrayItemType :: ByteArray (o_o_0 , o_o_1)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_array_ArrayItemType_Identifier_ctor () -> * mut dpp_data_contract_document_type_property_array_ArrayItemType { ferment :: boxed (dpp_data_contract_document_type_property_array_ArrayItemType :: Identifier { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_array_ArrayItemType_Boolean_ctor () -> * mut dpp_data_contract_document_type_property_array_ArrayItemType { ferment :: boxed (dpp_data_contract_document_type_property_array_ArrayItemType :: Boolean { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_array_ArrayItemType_Date_ctor () -> * mut dpp_data_contract_document_type_property_array_ArrayItemType { ferment :: boxed (dpp_data_contract_document_type_property_array_ArrayItemType :: Date { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_array_ArrayItemType_destroy < > (ffi : * mut dpp_data_contract_document_type_property_array_ArrayItemType) { ferment :: unbox_any (ffi) ; } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DocumentPropertyType`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_document_type_property_DocumentPropertyType { U128 , I128 , U64 , I64 , U32 , I32 , U16 , I16 , U8 , I8 , F64 , String (* mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: dpp_data_contract_document_type_property_StringPropertySizes) , ByteArray (* mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: dpp_data_contract_document_type_property_ByteArrayPropertySizes) , Identifier , Boolean , Date , Object (* mut crate :: fermented :: generics :: indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty) , Array (* mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: array :: dpp_data_contract_document_type_property_array_ArrayItemType) , VariableTypeArray (* mut crate :: fermented :: generics :: Vec_dpp_data_contract_document_type_property_array_ArrayItemType) } impl ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: property :: DocumentPropertyType > for dpp_data_contract_document_type_property_DocumentPropertyType { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_document_type_property_DocumentPropertyType) -> dpp :: data_contract :: document_type :: property :: DocumentPropertyType { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_document_type_property_DocumentPropertyType :: U128 => dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: U128 , dpp_data_contract_document_type_property_DocumentPropertyType :: I128 => dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: I128 , dpp_data_contract_document_type_property_DocumentPropertyType :: U64 => dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: U64 , dpp_data_contract_document_type_property_DocumentPropertyType :: I64 => dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: I64 , dpp_data_contract_document_type_property_DocumentPropertyType :: U32 => dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: U32 , dpp_data_contract_document_type_property_DocumentPropertyType :: I32 => dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: I32 , dpp_data_contract_document_type_property_DocumentPropertyType :: U16 => dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: U16 , dpp_data_contract_document_type_property_DocumentPropertyType :: I16 => dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: I16 , dpp_data_contract_document_type_property_DocumentPropertyType :: U8 => dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: U8 , dpp_data_contract_document_type_property_DocumentPropertyType :: I8 => dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: I8 , dpp_data_contract_document_type_property_DocumentPropertyType :: F64 => dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: F64 , dpp_data_contract_document_type_property_DocumentPropertyType :: String (o_0) => dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: String (< crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: dpp_data_contract_document_type_property_StringPropertySizes as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: property :: StringPropertySizes >> :: ffi_from (* o_0)) , dpp_data_contract_document_type_property_DocumentPropertyType :: ByteArray (o_0) => dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: ByteArray (< crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: dpp_data_contract_document_type_property_ByteArrayPropertySizes as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: property :: ByteArrayPropertySizes >> :: ffi_from (* o_0)) , dpp_data_contract_document_type_property_DocumentPropertyType :: Identifier => dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: Identifier , dpp_data_contract_document_type_property_DocumentPropertyType :: Boolean => dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: Boolean , dpp_data_contract_document_type_property_DocumentPropertyType :: Date => dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: Date , dpp_data_contract_document_type_property_DocumentPropertyType :: Object (o_0) => dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: Object (< crate :: fermented :: generics :: indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty as ferment :: FFIConversionFrom < indexmap :: IndexMap < String , dpp :: data_contract :: document_type :: property :: DocumentProperty > >> :: ffi_from (* o_0)) , dpp_data_contract_document_type_property_DocumentPropertyType :: Array (o_0) => dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: Array (< crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: array :: dpp_data_contract_document_type_property_array_ArrayItemType as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: property :: array :: ArrayItemType >> :: ffi_from (* o_0)) , dpp_data_contract_document_type_property_DocumentPropertyType :: VariableTypeArray (o_0) => dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: VariableTypeArray (< crate :: fermented :: generics :: Vec_dpp_data_contract_document_type_property_array_ArrayItemType as ferment :: FFIConversionFrom < Vec < dpp :: data_contract :: document_type :: property :: array :: ArrayItemType > >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: property :: DocumentPropertyType > for dpp_data_contract_document_type_property_DocumentPropertyType { unsafe fn ffi_to_const (obj : dpp :: data_contract :: document_type :: property :: DocumentPropertyType) -> * const dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (match obj { dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: U128 => dpp_data_contract_document_type_property_DocumentPropertyType :: U128 , dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: I128 => dpp_data_contract_document_type_property_DocumentPropertyType :: I128 , dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: U64 => dpp_data_contract_document_type_property_DocumentPropertyType :: U64 , dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: I64 => dpp_data_contract_document_type_property_DocumentPropertyType :: I64 , dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: U32 => dpp_data_contract_document_type_property_DocumentPropertyType :: U32 , dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: I32 => dpp_data_contract_document_type_property_DocumentPropertyType :: I32 , dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: U16 => dpp_data_contract_document_type_property_DocumentPropertyType :: U16 , dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: I16 => dpp_data_contract_document_type_property_DocumentPropertyType :: I16 , dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: U8 => dpp_data_contract_document_type_property_DocumentPropertyType :: U8 , dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: I8 => dpp_data_contract_document_type_property_DocumentPropertyType :: I8 , dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: F64 => dpp_data_contract_document_type_property_DocumentPropertyType :: F64 , dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: String (o_0) => dpp_data_contract_document_type_property_DocumentPropertyType :: String (< crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: dpp_data_contract_document_type_property_StringPropertySizes as ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: property :: StringPropertySizes >> :: ffi_to (o_0)) , dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: ByteArray (o_0) => dpp_data_contract_document_type_property_DocumentPropertyType :: ByteArray (< crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: dpp_data_contract_document_type_property_ByteArrayPropertySizes as ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: property :: ByteArrayPropertySizes >> :: ffi_to (o_0)) , dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: Identifier => dpp_data_contract_document_type_property_DocumentPropertyType :: Identifier , dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: Boolean => dpp_data_contract_document_type_property_DocumentPropertyType :: Boolean , dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: Date => dpp_data_contract_document_type_property_DocumentPropertyType :: Date , dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: Object (o_0) => dpp_data_contract_document_type_property_DocumentPropertyType :: Object (< crate :: fermented :: generics :: indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty as ferment :: FFIConversionTo < indexmap :: IndexMap < String , dpp :: data_contract :: document_type :: property :: DocumentProperty > >> :: ffi_to (o_0)) , dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: Array (o_0) => dpp_data_contract_document_type_property_DocumentPropertyType :: Array (< crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: array :: dpp_data_contract_document_type_property_array_ArrayItemType as ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: property :: array :: ArrayItemType >> :: ffi_to (o_0)) , dpp :: data_contract :: document_type :: property :: DocumentPropertyType :: VariableTypeArray (o_0) => dpp_data_contract_document_type_property_DocumentPropertyType :: VariableTypeArray (< crate :: fermented :: generics :: Vec_dpp_data_contract_document_type_property_array_ArrayItemType as ferment :: FFIConversionTo < Vec < dpp :: data_contract :: document_type :: property :: array :: ArrayItemType > >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_document_type_property_DocumentPropertyType { fn drop (& mut self) { unsafe { match self { dpp_data_contract_document_type_property_DocumentPropertyType :: U128 => { } , dpp_data_contract_document_type_property_DocumentPropertyType :: I128 => { } , dpp_data_contract_document_type_property_DocumentPropertyType :: U64 => { } , dpp_data_contract_document_type_property_DocumentPropertyType :: I64 => { } , dpp_data_contract_document_type_property_DocumentPropertyType :: U32 => { } , dpp_data_contract_document_type_property_DocumentPropertyType :: I32 => { } , dpp_data_contract_document_type_property_DocumentPropertyType :: U16 => { } , dpp_data_contract_document_type_property_DocumentPropertyType :: I16 => { } , dpp_data_contract_document_type_property_DocumentPropertyType :: U8 => { } , dpp_data_contract_document_type_property_DocumentPropertyType :: I8 => { } , dpp_data_contract_document_type_property_DocumentPropertyType :: F64 => { } , dpp_data_contract_document_type_property_DocumentPropertyType :: String (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_data_contract_document_type_property_DocumentPropertyType :: ByteArray (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_data_contract_document_type_property_DocumentPropertyType :: Identifier => { } , dpp_data_contract_document_type_property_DocumentPropertyType :: Boolean => { } , dpp_data_contract_document_type_property_DocumentPropertyType :: Date => { } , dpp_data_contract_document_type_property_DocumentPropertyType :: Object (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_data_contract_document_type_property_DocumentPropertyType :: Array (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_data_contract_document_type_property_DocumentPropertyType :: VariableTypeArray (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_U128_ctor () -> * mut dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (dpp_data_contract_document_type_property_DocumentPropertyType :: U128 { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_I128_ctor () -> * mut dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (dpp_data_contract_document_type_property_DocumentPropertyType :: I128 { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_U64_ctor () -> * mut dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (dpp_data_contract_document_type_property_DocumentPropertyType :: U64 { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_I64_ctor () -> * mut dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (dpp_data_contract_document_type_property_DocumentPropertyType :: I64 { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_U32_ctor () -> * mut dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (dpp_data_contract_document_type_property_DocumentPropertyType :: U32 { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_I32_ctor () -> * mut dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (dpp_data_contract_document_type_property_DocumentPropertyType :: I32 { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_U16_ctor () -> * mut dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (dpp_data_contract_document_type_property_DocumentPropertyType :: U16 { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_I16_ctor () -> * mut dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (dpp_data_contract_document_type_property_DocumentPropertyType :: I16 { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_U8_ctor () -> * mut dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (dpp_data_contract_document_type_property_DocumentPropertyType :: U8 { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_I8_ctor () -> * mut dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (dpp_data_contract_document_type_property_DocumentPropertyType :: I8 { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_F64_ctor () -> * mut dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (dpp_data_contract_document_type_property_DocumentPropertyType :: F64 { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_String_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: dpp_data_contract_document_type_property_StringPropertySizes) -> * mut dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (dpp_data_contract_document_type_property_DocumentPropertyType :: String (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_ByteArray_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: dpp_data_contract_document_type_property_ByteArrayPropertySizes) -> * mut dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (dpp_data_contract_document_type_property_DocumentPropertyType :: ByteArray (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_Identifier_ctor () -> * mut dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (dpp_data_contract_document_type_property_DocumentPropertyType :: Identifier { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_Boolean_ctor () -> * mut dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (dpp_data_contract_document_type_property_DocumentPropertyType :: Boolean { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_Date_ctor () -> * mut dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (dpp_data_contract_document_type_property_DocumentPropertyType :: Date { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_Object_ctor (o_o_0 : * mut crate :: fermented :: generics :: indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty) -> * mut dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (dpp_data_contract_document_type_property_DocumentPropertyType :: Object (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_Array_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: array :: dpp_data_contract_document_type_property_array_ArrayItemType) -> * mut dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (dpp_data_contract_document_type_property_DocumentPropertyType :: Array (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_VariableTypeArray_ctor (o_o_0 : * mut crate :: fermented :: generics :: Vec_dpp_data_contract_document_type_property_array_ArrayItemType) -> * mut dpp_data_contract_document_type_property_DocumentPropertyType { ferment :: boxed (dpp_data_contract_document_type_property_DocumentPropertyType :: VariableTypeArray (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentPropertyType_destroy < > (ffi : * mut dpp_data_contract_document_type_property_DocumentPropertyType) { ferment :: unbox_any (ffi) ; } # [doc = "FFI-representation of the [`StringPropertySizes`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_document_type_property_StringPropertySizes { pub min_length : * mut u16 , pub max_length : * mut u16 } impl ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: property :: StringPropertySizes > for dpp_data_contract_document_type_property_StringPropertySizes { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_document_type_property_StringPropertySizes) -> dpp :: data_contract :: document_type :: property :: StringPropertySizes { let ffi_ref = & * ffi ; dpp :: data_contract :: document_type :: property :: StringPropertySizes { min_length : ferment :: from_opt_primitive (ffi_ref . min_length) , max_length : ferment :: from_opt_primitive (ffi_ref . max_length) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: property :: StringPropertySizes > for dpp_data_contract_document_type_property_StringPropertySizes { unsafe fn ffi_to_const (obj : dpp :: data_contract :: document_type :: property :: StringPropertySizes) -> * const dpp_data_contract_document_type_property_StringPropertySizes { ferment :: boxed (dpp_data_contract_document_type_property_StringPropertySizes { min_length : ferment :: to_opt_primitive (obj . min_length) , max_length : ferment :: to_opt_primitive (obj . max_length) }) } } impl Drop for dpp_data_contract_document_type_property_StringPropertySizes { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: destroy_opt_primitive (ffi_ref . min_length) ; ferment :: destroy_opt_primitive (ffi_ref . max_length) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_StringPropertySizes_ctor < > (min_length : * mut u16 , max_length : * mut u16) -> * mut dpp_data_contract_document_type_property_StringPropertySizes { ferment :: boxed (dpp_data_contract_document_type_property_StringPropertySizes { min_length , max_length }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_StringPropertySizes_destroy < > (ffi : * mut dpp_data_contract_document_type_property_StringPropertySizes) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_StringPropertySizes_get_min_length < > (obj : * const dpp_data_contract_document_type_property_StringPropertySizes) -> * mut u16 { (* obj) . min_length } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_StringPropertySizes_get_max_length < > (obj : * const dpp_data_contract_document_type_property_StringPropertySizes) -> * mut u16 { (* obj) . max_length } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_StringPropertySizes_set_min_length < > (obj : * const dpp_data_contract_document_type_property_StringPropertySizes) -> * mut u16 { (* obj) . min_length } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_StringPropertySizes_set_max_length < > (obj : * const dpp_data_contract_document_type_property_StringPropertySizes) -> * mut u16 { (* obj) . max_length } # [doc = "FFI-representation of the [`DocumentProperty`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_document_type_property_DocumentProperty { pub property_type : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: dpp_data_contract_document_type_property_DocumentPropertyType , pub required : bool , pub transient : bool } impl ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: property :: DocumentProperty > for dpp_data_contract_document_type_property_DocumentProperty { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_document_type_property_DocumentProperty) -> dpp :: data_contract :: document_type :: property :: DocumentProperty { let ffi_ref = & * ffi ; dpp :: data_contract :: document_type :: property :: DocumentProperty { property_type : < crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: dpp_data_contract_document_type_property_DocumentPropertyType as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: property :: DocumentPropertyType >> :: ffi_from (ffi_ref . property_type) , required : ffi_ref . required , transient : ffi_ref . transient } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: property :: DocumentProperty > for dpp_data_contract_document_type_property_DocumentProperty { unsafe fn ffi_to_const (obj : dpp :: data_contract :: document_type :: property :: DocumentProperty) -> * const dpp_data_contract_document_type_property_DocumentProperty { ferment :: boxed (dpp_data_contract_document_type_property_DocumentProperty { property_type : < crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: dpp_data_contract_document_type_property_DocumentPropertyType as ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: property :: DocumentPropertyType >> :: ffi_to (obj . property_type) , required : obj . required , transient : obj . transient }) } } impl Drop for dpp_data_contract_document_type_property_DocumentProperty { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . property_type) ; ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentProperty_ctor < > (property_type : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: dpp_data_contract_document_type_property_DocumentPropertyType , required : bool , transient : bool) -> * mut dpp_data_contract_document_type_property_DocumentProperty { ferment :: boxed (dpp_data_contract_document_type_property_DocumentProperty { property_type , required , transient }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentProperty_destroy < > (ffi : * mut dpp_data_contract_document_type_property_DocumentProperty) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentProperty_get_property_type < > (obj : * const dpp_data_contract_document_type_property_DocumentProperty) -> * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: dpp_data_contract_document_type_property_DocumentPropertyType { (* obj) . property_type } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentProperty_get_required < > (obj : * const dpp_data_contract_document_type_property_DocumentProperty) -> bool { (* obj) . required } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentProperty_get_transient < > (obj : * const dpp_data_contract_document_type_property_DocumentProperty) -> bool { (* obj) . transient } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentProperty_set_property_type < > (obj : * const dpp_data_contract_document_type_property_DocumentProperty) -> * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: dpp_data_contract_document_type_property_DocumentPropertyType { (* obj) . property_type } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentProperty_set_required < > (obj : * const dpp_data_contract_document_type_property_DocumentProperty) -> bool { (* obj) . required } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_DocumentProperty_set_transient < > (obj : * const dpp_data_contract_document_type_property_DocumentProperty) -> bool { (* obj) . transient } # [doc = "FFI-representation of the [`ByteArrayPropertySizes`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_document_type_property_ByteArrayPropertySizes { pub min_size : * mut u16 , pub max_size : * mut u16 } impl ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: property :: ByteArrayPropertySizes > for dpp_data_contract_document_type_property_ByteArrayPropertySizes { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_document_type_property_ByteArrayPropertySizes) -> dpp :: data_contract :: document_type :: property :: ByteArrayPropertySizes { let ffi_ref = & * ffi ; dpp :: data_contract :: document_type :: property :: ByteArrayPropertySizes { min_size : ferment :: from_opt_primitive (ffi_ref . min_size) , max_size : ferment :: from_opt_primitive (ffi_ref . max_size) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: document_type :: property :: ByteArrayPropertySizes > for dpp_data_contract_document_type_property_ByteArrayPropertySizes { unsafe fn ffi_to_const (obj : dpp :: data_contract :: document_type :: property :: ByteArrayPropertySizes) -> * const dpp_data_contract_document_type_property_ByteArrayPropertySizes { ferment :: boxed (dpp_data_contract_document_type_property_ByteArrayPropertySizes { min_size : ferment :: to_opt_primitive (obj . min_size) , max_size : ferment :: to_opt_primitive (obj . max_size) }) } } impl Drop for dpp_data_contract_document_type_property_ByteArrayPropertySizes { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: destroy_opt_primitive (ffi_ref . min_size) ; ferment :: destroy_opt_primitive (ffi_ref . max_size) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_ByteArrayPropertySizes_ctor < > (min_size : * mut u16 , max_size : * mut u16) -> * mut dpp_data_contract_document_type_property_ByteArrayPropertySizes { ferment :: boxed (dpp_data_contract_document_type_property_ByteArrayPropertySizes { min_size , max_size }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_ByteArrayPropertySizes_destroy < > (ffi : * mut dpp_data_contract_document_type_property_ByteArrayPropertySizes) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_ByteArrayPropertySizes_get_min_size < > (obj : * const dpp_data_contract_document_type_property_ByteArrayPropertySizes) -> * mut u16 { (* obj) . min_size } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_ByteArrayPropertySizes_get_max_size < > (obj : * const dpp_data_contract_document_type_property_ByteArrayPropertySizes) -> * mut u16 { (* obj) . max_size } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_ByteArrayPropertySizes_set_min_size < > (obj : * const dpp_data_contract_document_type_property_ByteArrayPropertySizes) -> * mut u16 { (* obj) . min_size } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_document_type_property_ByteArrayPropertySizes_set_max_size < > (obj : * const dpp_data_contract_document_type_property_ByteArrayPropertySizes) -> * mut u16 { (* obj) . max_size } } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DataContract`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_DataContract { V0 (* mut crate :: fermented :: types :: dpp :: data_contract :: v0 :: data_contract :: dpp_data_contract_v0_data_contract_DataContractV0) , V1 (* mut crate :: fermented :: types :: dpp :: data_contract :: v1 :: data_contract :: dpp_data_contract_v1_data_contract_DataContractV1) } impl ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract > for dpp_data_contract_DataContract { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_DataContract) -> dpp :: data_contract :: DataContract { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_DataContract :: V0 (o_0) => dpp :: data_contract :: DataContract :: V0 (< crate :: fermented :: types :: dpp :: data_contract :: v0 :: data_contract :: dpp_data_contract_v0_data_contract_DataContractV0 as ferment :: FFIConversionFrom < dpp :: data_contract :: v0 :: data_contract :: DataContractV0 >> :: ffi_from (* o_0)) , dpp_data_contract_DataContract :: V1 (o_0) => dpp :: data_contract :: DataContract :: V1 (< crate :: fermented :: types :: dpp :: data_contract :: v1 :: data_contract :: dpp_data_contract_v1_data_contract_DataContractV1 as ferment :: FFIConversionFrom < dpp :: data_contract :: v1 :: data_contract :: DataContractV1 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: DataContract > for dpp_data_contract_DataContract { unsafe fn ffi_to_const (obj : dpp :: data_contract :: DataContract) -> * const dpp_data_contract_DataContract { ferment :: boxed (match obj { dpp :: data_contract :: DataContract :: V0 (o_0) => dpp_data_contract_DataContract :: V0 (< crate :: fermented :: types :: dpp :: data_contract :: v0 :: data_contract :: dpp_data_contract_v0_data_contract_DataContractV0 as ferment :: FFIConversionTo < dpp :: data_contract :: v0 :: data_contract :: DataContractV0 >> :: ffi_to (o_0)) , dpp :: data_contract :: DataContract :: V1 (o_0) => dpp_data_contract_DataContract :: V1 (< crate :: fermented :: types :: dpp :: data_contract :: v1 :: data_contract :: dpp_data_contract_v1_data_contract_DataContractV1 as ferment :: FFIConversionTo < dpp :: data_contract :: v1 :: data_contract :: DataContractV1 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_DataContract { fn drop (& mut self) { unsafe { match self { dpp_data_contract_DataContract :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_data_contract_DataContract :: V1 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_DataContract_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: v0 :: data_contract :: dpp_data_contract_v0_data_contract_DataContractV0) -> * mut dpp_data_contract_DataContract { ferment :: boxed (dpp_data_contract_DataContract :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_DataContract_V1_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: v1 :: data_contract :: dpp_data_contract_v1_data_contract_DataContractV1) -> * mut dpp_data_contract_DataContract { ferment :: boxed (dpp_data_contract_DataContract :: V1 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_DataContract_destroy < > (ffi : * mut dpp_data_contract_DataContract) { ferment :: unbox_any (ffi) ; } pub mod v1 { use crate as dash_spv_apple_bindings ; pub mod serialization { use crate as dash_spv_apple_bindings ; } pub mod data_contract { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractV1`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_v1_data_contract_DataContractV1 { pub id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub version : u32 , pub owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub document_types : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType , pub config : * mut crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig , pub schema_defs : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value , pub created_at : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis , pub updated_at : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis , pub created_at_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight , pub updated_at_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight , pub created_at_epoch : * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex , pub updated_at_epoch : * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex , pub groups : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group , pub tokens : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration } impl ferment :: FFIConversionFrom < dpp :: data_contract :: v1 :: data_contract :: DataContractV1 > for dpp_data_contract_v1_data_contract_DataContractV1 { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_v1_data_contract_DataContractV1) -> dpp :: data_contract :: v1 :: data_contract :: DataContractV1 { let ffi_ref = & * ffi ; dpp :: data_contract :: v1 :: data_contract :: DataContractV1 { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . id) , version : ffi_ref . version , owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . owner_id) , document_types : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: data_contract :: DocumentName , dpp :: data_contract :: document_type :: DocumentType > >> :: ffi_from (ffi_ref . document_types) , config : < crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig as ferment :: FFIConversionFrom < dpp :: data_contract :: config :: DataContractConfig >> :: ffi_from (ffi_ref . config) , schema_defs : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: data_contract :: DefinitionName , platform_value :: Value > >> :: ffi_from_opt (ffi_ref . schema_defs) , created_at : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: TimestampMillis >> :: ffi_from_opt (ffi_ref . created_at) , updated_at : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: TimestampMillis >> :: ffi_from_opt (ffi_ref . updated_at) , created_at_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight as ferment :: FFIConversionFrom < dpp :: prelude :: BlockHeight >> :: ffi_from_opt (ffi_ref . created_at_block_height) , updated_at_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight as ferment :: FFIConversionFrom < dpp :: prelude :: BlockHeight >> :: ffi_from_opt (ffi_ref . updated_at_block_height) , created_at_epoch : < crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex as ferment :: FFIConversionFrom < dpp :: block :: epoch :: EpochIndex >> :: ffi_from_opt (ffi_ref . created_at_epoch) , updated_at_epoch : < crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex as ferment :: FFIConversionFrom < dpp :: block :: epoch :: EpochIndex >> :: ffi_from_opt (ffi_ref . updated_at_epoch) , groups : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: data_contract :: GroupContractPosition , dpp :: data_contract :: group :: Group > >> :: ffi_from (ffi_ref . groups) , tokens : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: data_contract :: TokenContractPosition , dpp :: data_contract :: associated_token :: token_configuration :: TokenConfiguration > >> :: ffi_from (ffi_ref . tokens) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: v1 :: data_contract :: DataContractV1 > for dpp_data_contract_v1_data_contract_DataContractV1 { unsafe fn ffi_to_const (obj : dpp :: data_contract :: v1 :: data_contract :: DataContractV1) -> * const dpp_data_contract_v1_data_contract_DataContractV1 { ferment :: boxed (dpp_data_contract_v1_data_contract_DataContractV1 { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . id) , version : obj . version , owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . owner_id) , document_types : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType as ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: data_contract :: DocumentName , dpp :: data_contract :: document_type :: DocumentType > >> :: ffi_to (obj . document_types) , config : < crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig as ferment :: FFIConversionTo < dpp :: data_contract :: config :: DataContractConfig >> :: ffi_to (obj . config) , schema_defs : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value as ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: data_contract :: DefinitionName , platform_value :: Value > >> :: ffi_to_opt (obj . schema_defs) , created_at : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: TimestampMillis >> :: ffi_to_opt (obj . created_at) , updated_at : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: TimestampMillis >> :: ffi_to_opt (obj . updated_at) , created_at_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight as ferment :: FFIConversionTo < dpp :: prelude :: BlockHeight >> :: ffi_to_opt (obj . created_at_block_height) , updated_at_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight as ferment :: FFIConversionTo < dpp :: prelude :: BlockHeight >> :: ffi_to_opt (obj . updated_at_block_height) , created_at_epoch : < crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex as ferment :: FFIConversionTo < dpp :: block :: epoch :: EpochIndex >> :: ffi_to_opt (obj . created_at_epoch) , updated_at_epoch : < crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex as ferment :: FFIConversionTo < dpp :: block :: epoch :: EpochIndex >> :: ffi_to_opt (obj . updated_at_epoch) , groups : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group as ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: data_contract :: GroupContractPosition , dpp :: data_contract :: group :: Group > >> :: ffi_to (obj . groups) , tokens : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration as ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: data_contract :: TokenContractPosition , dpp :: data_contract :: associated_token :: token_configuration :: TokenConfiguration > >> :: ffi_to (obj . tokens) }) } } impl Drop for dpp_data_contract_v1_data_contract_DataContractV1 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . id) ; ; ferment :: unbox_any (ffi_ref . owner_id) ; ferment :: unbox_any (ffi_ref . document_types) ; ferment :: unbox_any (ffi_ref . config) ; ferment :: unbox_any_opt (ffi_ref . schema_defs) ; ferment :: unbox_any_opt (ffi_ref . created_at) ; ferment :: unbox_any_opt (ffi_ref . updated_at) ; ferment :: unbox_any_opt (ffi_ref . created_at_block_height) ; ferment :: unbox_any_opt (ffi_ref . updated_at_block_height) ; ferment :: unbox_any_opt (ffi_ref . created_at_epoch) ; ferment :: unbox_any_opt (ffi_ref . updated_at_epoch) ; ferment :: unbox_any (ffi_ref . groups) ; ferment :: unbox_any (ffi_ref . tokens) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_ctor < > (id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , version : u32 , owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , document_types : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType , config : * mut crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig , schema_defs : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value , created_at : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis , updated_at : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis , created_at_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight , updated_at_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight , created_at_epoch : * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex , updated_at_epoch : * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex , groups : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group , tokens : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration) -> * mut dpp_data_contract_v1_data_contract_DataContractV1 { ferment :: boxed (dpp_data_contract_v1_data_contract_DataContractV1 { id , version , owner_id , document_types , config , schema_defs , created_at , updated_at , created_at_block_height , updated_at_block_height , created_at_epoch , updated_at_epoch , groups , tokens }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_destroy < > (ffi : * mut dpp_data_contract_v1_data_contract_DataContractV1) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_get_id < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_get_version < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> u32 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_get_owner_id < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . owner_id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_get_document_types < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType { (* obj) . document_types } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_get_config < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig { (* obj) . config } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_get_schema_defs < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value { (* obj) . schema_defs } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_get_created_at < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis { (* obj) . created_at } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_get_updated_at < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis { (* obj) . updated_at } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_get_created_at_block_height < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight { (* obj) . created_at_block_height } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_get_updated_at_block_height < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight { (* obj) . updated_at_block_height } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_get_created_at_epoch < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex { (* obj) . created_at_epoch } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_get_updated_at_epoch < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex { (* obj) . updated_at_epoch } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_get_groups < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group { (* obj) . groups } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_get_tokens < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration { (* obj) . tokens } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_set_id < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_set_version < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> u32 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_set_owner_id < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . owner_id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_set_document_types < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType { (* obj) . document_types } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_set_config < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig { (* obj) . config } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_set_schema_defs < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value { (* obj) . schema_defs } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_set_created_at < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis { (* obj) . created_at } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_set_updated_at < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis { (* obj) . updated_at } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_set_created_at_block_height < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight { (* obj) . created_at_block_height } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_set_updated_at_block_height < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight { (* obj) . updated_at_block_height } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_set_created_at_epoch < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex { (* obj) . created_at_epoch } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_set_updated_at_epoch < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex { (* obj) . updated_at_epoch } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_set_groups < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group { (* obj) . groups } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v1_data_contract_DataContractV1_set_tokens < > (obj : * const dpp_data_contract_v1_data_contract_DataContractV1) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration { (* obj) . tokens } } pub mod methods { use crate as dash_spv_apple_bindings ; pub mod schema { use crate as dash_spv_apple_bindings ; } } pub mod conversion { use crate as dash_spv_apple_bindings ; } } pub mod accessors { use crate as dash_spv_apple_bindings ; } # [cfg (any (feature = "data-contract-value-conversion" , feature = "data-contract-cbor-conversion" , feature = "data-contract-json-conversion"))] pub mod conversion { use crate as dash_spv_apple_bindings ; # [cfg (feature = "data-contract-value-conversion")] pub mod value { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "data-contract-cbor-conversion")] pub mod cbor { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "data-contract-json-conversion")] pub mod json { use crate as dash_spv_apple_bindings ; } } pub mod config { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractConfigV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_config_v0_DataContractConfigV0 { pub can_be_deleted : bool , pub readonly : bool , pub keeps_history : bool , pub documents_keep_history_contract_default : bool , pub documents_mutable_contract_default : bool , pub documents_can_be_deleted_contract_default : bool , pub requires_identity_encryption_bounded_key : * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements , pub requires_identity_decryption_bounded_key : * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements } impl ferment :: FFIConversionFrom < dpp :: data_contract :: config :: v0 :: DataContractConfigV0 > for dpp_data_contract_config_v0_DataContractConfigV0 { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_config_v0_DataContractConfigV0) -> dpp :: data_contract :: config :: v0 :: DataContractConfigV0 { let ffi_ref = & * ffi ; dpp :: data_contract :: config :: v0 :: DataContractConfigV0 { can_be_deleted : ffi_ref . can_be_deleted , readonly : ffi_ref . readonly , keeps_history : ffi_ref . keeps_history , documents_keep_history_contract_default : ffi_ref . documents_keep_history_contract_default , documents_mutable_contract_default : ffi_ref . documents_mutable_contract_default , documents_can_be_deleted_contract_default : ffi_ref . documents_can_be_deleted_contract_default , requires_identity_encryption_bounded_key : < crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements as ferment :: FFIConversionFrom < dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements >> :: ffi_from_opt (ffi_ref . requires_identity_encryption_bounded_key) , requires_identity_decryption_bounded_key : < crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements as ferment :: FFIConversionFrom < dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements >> :: ffi_from_opt (ffi_ref . requires_identity_decryption_bounded_key) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: config :: v0 :: DataContractConfigV0 > for dpp_data_contract_config_v0_DataContractConfigV0 { unsafe fn ffi_to_const (obj : dpp :: data_contract :: config :: v0 :: DataContractConfigV0) -> * const dpp_data_contract_config_v0_DataContractConfigV0 { ferment :: boxed (dpp_data_contract_config_v0_DataContractConfigV0 { can_be_deleted : obj . can_be_deleted , readonly : obj . readonly , keeps_history : obj . keeps_history , documents_keep_history_contract_default : obj . documents_keep_history_contract_default , documents_mutable_contract_default : obj . documents_mutable_contract_default , documents_can_be_deleted_contract_default : obj . documents_can_be_deleted_contract_default , requires_identity_encryption_bounded_key : < crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements as ferment :: FFIConversionTo < dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements >> :: ffi_to_opt (obj . requires_identity_encryption_bounded_key) , requires_identity_decryption_bounded_key : < crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements as ferment :: FFIConversionTo < dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements >> :: ffi_to_opt (obj . requires_identity_decryption_bounded_key) }) } } impl Drop for dpp_data_contract_config_v0_DataContractConfigV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ; ; ; ; ferment :: unbox_any_opt (ffi_ref . requires_identity_encryption_bounded_key) ; ferment :: unbox_any_opt (ffi_ref . requires_identity_decryption_bounded_key) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v0_DataContractConfigV0_ctor < > (can_be_deleted : bool , readonly : bool , keeps_history : bool , documents_keep_history_contract_default : bool , documents_mutable_contract_default : bool , documents_can_be_deleted_contract_default : bool , requires_identity_encryption_bounded_key : * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements , requires_identity_decryption_bounded_key : * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements) -> * mut dpp_data_contract_config_v0_DataContractConfigV0 { ferment :: boxed (dpp_data_contract_config_v0_DataContractConfigV0 { can_be_deleted , readonly , keeps_history , documents_keep_history_contract_default , documents_mutable_contract_default , documents_can_be_deleted_contract_default , requires_identity_encryption_bounded_key , requires_identity_decryption_bounded_key }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v0_DataContractConfigV0_destroy < > (ffi : * mut dpp_data_contract_config_v0_DataContractConfigV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v0_DataContractConfigV0_get_can_be_deleted < > (obj : * const dpp_data_contract_config_v0_DataContractConfigV0) -> bool { (* obj) . can_be_deleted } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v0_DataContractConfigV0_get_readonly < > (obj : * const dpp_data_contract_config_v0_DataContractConfigV0) -> bool { (* obj) . readonly } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v0_DataContractConfigV0_get_keeps_history < > (obj : * const dpp_data_contract_config_v0_DataContractConfigV0) -> bool { (* obj) . keeps_history } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v0_DataContractConfigV0_get_documents_keep_history_contract_default < > (obj : * const dpp_data_contract_config_v0_DataContractConfigV0) -> bool { (* obj) . documents_keep_history_contract_default } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v0_DataContractConfigV0_get_documents_mutable_contract_default < > (obj : * const dpp_data_contract_config_v0_DataContractConfigV0) -> bool { (* obj) . documents_mutable_contract_default } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v0_DataContractConfigV0_get_documents_can_be_deleted_contract_default < > (obj : * const dpp_data_contract_config_v0_DataContractConfigV0) -> bool { (* obj) . documents_can_be_deleted_contract_default } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v0_DataContractConfigV0_get_requires_identity_encryption_bounded_key < > (obj : * const dpp_data_contract_config_v0_DataContractConfigV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { (* obj) . requires_identity_encryption_bounded_key } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v0_DataContractConfigV0_get_requires_identity_decryption_bounded_key < > (obj : * const dpp_data_contract_config_v0_DataContractConfigV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { (* obj) . requires_identity_decryption_bounded_key } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v0_DataContractConfigV0_set_can_be_deleted < > (obj : * const dpp_data_contract_config_v0_DataContractConfigV0) -> bool { (* obj) . can_be_deleted } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v0_DataContractConfigV0_set_readonly < > (obj : * const dpp_data_contract_config_v0_DataContractConfigV0) -> bool { (* obj) . readonly } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v0_DataContractConfigV0_set_keeps_history < > (obj : * const dpp_data_contract_config_v0_DataContractConfigV0) -> bool { (* obj) . keeps_history } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v0_DataContractConfigV0_set_documents_keep_history_contract_default < > (obj : * const dpp_data_contract_config_v0_DataContractConfigV0) -> bool { (* obj) . documents_keep_history_contract_default } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v0_DataContractConfigV0_set_documents_mutable_contract_default < > (obj : * const dpp_data_contract_config_v0_DataContractConfigV0) -> bool { (* obj) . documents_mutable_contract_default } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v0_DataContractConfigV0_set_documents_can_be_deleted_contract_default < > (obj : * const dpp_data_contract_config_v0_DataContractConfigV0) -> bool { (* obj) . documents_can_be_deleted_contract_default } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v0_DataContractConfigV0_set_requires_identity_encryption_bounded_key < > (obj : * const dpp_data_contract_config_v0_DataContractConfigV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { (* obj) . requires_identity_encryption_bounded_key } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v0_DataContractConfigV0_set_requires_identity_decryption_bounded_key < > (obj : * const dpp_data_contract_config_v0_DataContractConfigV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { (* obj) . requires_identity_decryption_bounded_key } } pub mod v1 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractConfigV1`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_config_v1_DataContractConfigV1 { pub can_be_deleted : bool , pub readonly : bool , pub keeps_history : bool , pub documents_keep_history_contract_default : bool , pub documents_mutable_contract_default : bool , pub documents_can_be_deleted_contract_default : bool , pub requires_identity_encryption_bounded_key : * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements , pub requires_identity_decryption_bounded_key : * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements , pub sized_integer_types : bool } impl ferment :: FFIConversionFrom < dpp :: data_contract :: config :: v1 :: DataContractConfigV1 > for dpp_data_contract_config_v1_DataContractConfigV1 { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_config_v1_DataContractConfigV1) -> dpp :: data_contract :: config :: v1 :: DataContractConfigV1 { let ffi_ref = & * ffi ; dpp :: data_contract :: config :: v1 :: DataContractConfigV1 { can_be_deleted : ffi_ref . can_be_deleted , readonly : ffi_ref . readonly , keeps_history : ffi_ref . keeps_history , documents_keep_history_contract_default : ffi_ref . documents_keep_history_contract_default , documents_mutable_contract_default : ffi_ref . documents_mutable_contract_default , documents_can_be_deleted_contract_default : ffi_ref . documents_can_be_deleted_contract_default , requires_identity_encryption_bounded_key : < crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements as ferment :: FFIConversionFrom < dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements >> :: ffi_from_opt (ffi_ref . requires_identity_encryption_bounded_key) , requires_identity_decryption_bounded_key : < crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements as ferment :: FFIConversionFrom < dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements >> :: ffi_from_opt (ffi_ref . requires_identity_decryption_bounded_key) , sized_integer_types : ffi_ref . sized_integer_types } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: config :: v1 :: DataContractConfigV1 > for dpp_data_contract_config_v1_DataContractConfigV1 { unsafe fn ffi_to_const (obj : dpp :: data_contract :: config :: v1 :: DataContractConfigV1) -> * const dpp_data_contract_config_v1_DataContractConfigV1 { ferment :: boxed (dpp_data_contract_config_v1_DataContractConfigV1 { can_be_deleted : obj . can_be_deleted , readonly : obj . readonly , keeps_history : obj . keeps_history , documents_keep_history_contract_default : obj . documents_keep_history_contract_default , documents_mutable_contract_default : obj . documents_mutable_contract_default , documents_can_be_deleted_contract_default : obj . documents_can_be_deleted_contract_default , requires_identity_encryption_bounded_key : < crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements as ferment :: FFIConversionTo < dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements >> :: ffi_to_opt (obj . requires_identity_encryption_bounded_key) , requires_identity_decryption_bounded_key : < crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements as ferment :: FFIConversionTo < dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements >> :: ffi_to_opt (obj . requires_identity_decryption_bounded_key) , sized_integer_types : obj . sized_integer_types }) } } impl Drop for dpp_data_contract_config_v1_DataContractConfigV1 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ; ; ; ; ferment :: unbox_any_opt (ffi_ref . requires_identity_encryption_bounded_key) ; ferment :: unbox_any_opt (ffi_ref . requires_identity_decryption_bounded_key) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_ctor < > (can_be_deleted : bool , readonly : bool , keeps_history : bool , documents_keep_history_contract_default : bool , documents_mutable_contract_default : bool , documents_can_be_deleted_contract_default : bool , requires_identity_encryption_bounded_key : * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements , requires_identity_decryption_bounded_key : * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements , sized_integer_types : bool) -> * mut dpp_data_contract_config_v1_DataContractConfigV1 { ferment :: boxed (dpp_data_contract_config_v1_DataContractConfigV1 { can_be_deleted , readonly , keeps_history , documents_keep_history_contract_default , documents_mutable_contract_default , documents_can_be_deleted_contract_default , requires_identity_encryption_bounded_key , requires_identity_decryption_bounded_key , sized_integer_types }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_destroy < > (ffi : * mut dpp_data_contract_config_v1_DataContractConfigV1) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_get_can_be_deleted < > (obj : * const dpp_data_contract_config_v1_DataContractConfigV1) -> bool { (* obj) . can_be_deleted } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_get_readonly < > (obj : * const dpp_data_contract_config_v1_DataContractConfigV1) -> bool { (* obj) . readonly } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_get_keeps_history < > (obj : * const dpp_data_contract_config_v1_DataContractConfigV1) -> bool { (* obj) . keeps_history } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_get_documents_keep_history_contract_default < > (obj : * const dpp_data_contract_config_v1_DataContractConfigV1) -> bool { (* obj) . documents_keep_history_contract_default } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_get_documents_mutable_contract_default < > (obj : * const dpp_data_contract_config_v1_DataContractConfigV1) -> bool { (* obj) . documents_mutable_contract_default } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_get_documents_can_be_deleted_contract_default < > (obj : * const dpp_data_contract_config_v1_DataContractConfigV1) -> bool { (* obj) . documents_can_be_deleted_contract_default } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_get_requires_identity_encryption_bounded_key < > (obj : * const dpp_data_contract_config_v1_DataContractConfigV1) -> * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { (* obj) . requires_identity_encryption_bounded_key } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_get_requires_identity_decryption_bounded_key < > (obj : * const dpp_data_contract_config_v1_DataContractConfigV1) -> * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { (* obj) . requires_identity_decryption_bounded_key } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_get_sized_integer_types < > (obj : * const dpp_data_contract_config_v1_DataContractConfigV1) -> bool { (* obj) . sized_integer_types } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_set_can_be_deleted < > (obj : * const dpp_data_contract_config_v1_DataContractConfigV1) -> bool { (* obj) . can_be_deleted } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_set_readonly < > (obj : * const dpp_data_contract_config_v1_DataContractConfigV1) -> bool { (* obj) . readonly } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_set_keeps_history < > (obj : * const dpp_data_contract_config_v1_DataContractConfigV1) -> bool { (* obj) . keeps_history } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_set_documents_keep_history_contract_default < > (obj : * const dpp_data_contract_config_v1_DataContractConfigV1) -> bool { (* obj) . documents_keep_history_contract_default } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_set_documents_mutable_contract_default < > (obj : * const dpp_data_contract_config_v1_DataContractConfigV1) -> bool { (* obj) . documents_mutable_contract_default } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_set_documents_can_be_deleted_contract_default < > (obj : * const dpp_data_contract_config_v1_DataContractConfigV1) -> bool { (* obj) . documents_can_be_deleted_contract_default } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_set_requires_identity_encryption_bounded_key < > (obj : * const dpp_data_contract_config_v1_DataContractConfigV1) -> * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { (* obj) . requires_identity_encryption_bounded_key } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_set_requires_identity_decryption_bounded_key < > (obj : * const dpp_data_contract_config_v1_DataContractConfigV1) -> * mut crate :: fermented :: types :: dpp :: data_contract :: storage_requirements :: keys_for_document_type :: dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { (* obj) . requires_identity_decryption_bounded_key } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_v1_DataContractConfigV1_set_sized_integer_types < > (obj : * const dpp_data_contract_config_v1_DataContractConfigV1) -> bool { (* obj) . sized_integer_types } } pub mod fields { use crate as dash_spv_apple_bindings ; } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DataContractConfig`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_config_DataContractConfig { V0 (* mut crate :: fermented :: types :: dpp :: data_contract :: config :: v0 :: dpp_data_contract_config_v0_DataContractConfigV0) , V1 (* mut crate :: fermented :: types :: dpp :: data_contract :: config :: v1 :: dpp_data_contract_config_v1_DataContractConfigV1) } impl ferment :: FFIConversionFrom < dpp :: data_contract :: config :: DataContractConfig > for dpp_data_contract_config_DataContractConfig { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_config_DataContractConfig) -> dpp :: data_contract :: config :: DataContractConfig { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_config_DataContractConfig :: V0 (o_0) => dpp :: data_contract :: config :: DataContractConfig :: V0 (< crate :: fermented :: types :: dpp :: data_contract :: config :: v0 :: dpp_data_contract_config_v0_DataContractConfigV0 as ferment :: FFIConversionFrom < dpp :: data_contract :: config :: v0 :: DataContractConfigV0 >> :: ffi_from (* o_0)) , dpp_data_contract_config_DataContractConfig :: V1 (o_0) => dpp :: data_contract :: config :: DataContractConfig :: V1 (< crate :: fermented :: types :: dpp :: data_contract :: config :: v1 :: dpp_data_contract_config_v1_DataContractConfigV1 as ferment :: FFIConversionFrom < dpp :: data_contract :: config :: v1 :: DataContractConfigV1 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: config :: DataContractConfig > for dpp_data_contract_config_DataContractConfig { unsafe fn ffi_to_const (obj : dpp :: data_contract :: config :: DataContractConfig) -> * const dpp_data_contract_config_DataContractConfig { ferment :: boxed (match obj { dpp :: data_contract :: config :: DataContractConfig :: V0 (o_0) => dpp_data_contract_config_DataContractConfig :: V0 (< crate :: fermented :: types :: dpp :: data_contract :: config :: v0 :: dpp_data_contract_config_v0_DataContractConfigV0 as ferment :: FFIConversionTo < dpp :: data_contract :: config :: v0 :: DataContractConfigV0 >> :: ffi_to (o_0)) , dpp :: data_contract :: config :: DataContractConfig :: V1 (o_0) => dpp_data_contract_config_DataContractConfig :: V1 (< crate :: fermented :: types :: dpp :: data_contract :: config :: v1 :: dpp_data_contract_config_v1_DataContractConfigV1 as ferment :: FFIConversionTo < dpp :: data_contract :: config :: v1 :: DataContractConfigV1 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_config_DataContractConfig { fn drop (& mut self) { unsafe { match self { dpp_data_contract_config_DataContractConfig :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_data_contract_config_DataContractConfig :: V1 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_DataContractConfig_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: config :: v0 :: dpp_data_contract_config_v0_DataContractConfigV0) -> * mut dpp_data_contract_config_DataContractConfig { ferment :: boxed (dpp_data_contract_config_DataContractConfig :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_DataContractConfig_V1_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: config :: v1 :: dpp_data_contract_config_v1_DataContractConfigV1) -> * mut dpp_data_contract_config_DataContractConfig { ferment :: boxed (dpp_data_contract_config_DataContractConfig :: V1 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_config_DataContractConfig_destroy < > (ffi : * mut dpp_data_contract_config_DataContractConfig) { ferment :: unbox_any (ffi) ; } pub mod methods { use crate as dash_spv_apple_bindings ; pub mod validate_update { use crate as dash_spv_apple_bindings ; } } } pub mod associated_token { use crate as dash_spv_apple_bindings ; pub mod token_perpetual_distribution { use crate as dash_spv_apple_bindings ; pub mod methods { use crate as dash_spv_apple_bindings ; } pub mod distribution_function { use crate as dash_spv_apple_bindings ; pub mod validation { use crate as dash_spv_apple_bindings ; # [cfg (test)] pub mod tests { use crate as dash_spv_apple_bindings ; } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DistributionFunction`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction { FixedAmount { amount : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount } , Random { min : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount , max : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount } , StepDecreasingAmount { step_count : u32 , decrease_per_interval_numerator : u16 , decrease_per_interval_denominator : u16 , s : * mut u64 , n : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount , min_value : * mut u64 } , Stepwise (* mut crate :: fermented :: generics :: std_collections_Map_keys_u64_values_dpp_balances_credits_TokenAmount) , Linear { a : i64 , d : u64 , start_step : * mut u64 , starting_amount : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount , min_value : * mut u64 , max_value : * mut u64 } , Polynomial { a : i64 , d : u64 , m : i64 , n : u64 , o : i64 , start_moment : * mut u64 , b : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount , min_value : * mut u64 , max_value : * mut u64 } , Exponential { a : u64 , d : u64 , m : i64 , n : u64 , o : i64 , start_moment : * mut u64 , c : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount , min_value : * mut u64 , max_value : * mut u64 } , Logarithmic { a : i64 , d : u64 , m : u64 , n : u64 , o : i64 , start_moment : * mut u64 , b : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount , min_value : * mut u64 , max_value : * mut u64 } , InvertedLogarithmic { a : i64 , d : u64 , m : u64 , n : u64 , o : i64 , start_moment : * mut u64 , b : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount , min_value : * mut u64 , max_value : * mut u64 } } impl ferment :: FFIConversionFrom < dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction > for dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction) -> dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: FixedAmount { amount } => dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction :: FixedAmount { amount : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionFrom < dpp :: balances :: credits :: TokenAmount >> :: ffi_from (* amount) } , dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Random { min , max } => dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction :: Random { min : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionFrom < dpp :: balances :: credits :: TokenAmount >> :: ffi_from (* min) , max : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionFrom < dpp :: balances :: credits :: TokenAmount >> :: ffi_from (* max) } , dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: StepDecreasingAmount { step_count , decrease_per_interval_numerator , decrease_per_interval_denominator , s , n , min_value } => dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction :: StepDecreasingAmount { step_count : * step_count , decrease_per_interval_numerator : * decrease_per_interval_numerator , decrease_per_interval_denominator : * decrease_per_interval_denominator , s : ferment :: from_opt_primitive (* s) , n : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionFrom < dpp :: balances :: credits :: TokenAmount >> :: ffi_from (* n) , min_value : ferment :: from_opt_primitive (* min_value) } , dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Stepwise (o_0) => dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction :: Stepwise (< crate :: fermented :: generics :: std_collections_Map_keys_u64_values_dpp_balances_credits_TokenAmount as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < u64 , dpp :: balances :: credits :: TokenAmount > >> :: ffi_from (* o_0)) , dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Linear { a , d , start_step , starting_amount , min_value , max_value } => dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction :: Linear { a : * a , d : * d , start_step : ferment :: from_opt_primitive (* start_step) , starting_amount : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionFrom < dpp :: balances :: credits :: TokenAmount >> :: ffi_from (* starting_amount) , min_value : ferment :: from_opt_primitive (* min_value) , max_value : ferment :: from_opt_primitive (* max_value) } , dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Polynomial { a , d , m , n , o , start_moment , b , min_value , max_value } => dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction :: Polynomial { a : * a , d : * d , m : * m , n : * n , o : * o , start_moment : ferment :: from_opt_primitive (* start_moment) , b : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionFrom < dpp :: balances :: credits :: TokenAmount >> :: ffi_from (* b) , min_value : ferment :: from_opt_primitive (* min_value) , max_value : ferment :: from_opt_primitive (* max_value) } , dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Exponential { a , d , m , n , o , start_moment , c , min_value , max_value } => dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction :: Exponential { a : * a , d : * d , m : * m , n : * n , o : * o , start_moment : ferment :: from_opt_primitive (* start_moment) , c : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionFrom < dpp :: balances :: credits :: TokenAmount >> :: ffi_from (* c) , min_value : ferment :: from_opt_primitive (* min_value) , max_value : ferment :: from_opt_primitive (* max_value) } , dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Logarithmic { a , d , m , n , o , start_moment , b , min_value , max_value } => dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction :: Logarithmic { a : * a , d : * d , m : * m , n : * n , o : * o , start_moment : ferment :: from_opt_primitive (* start_moment) , b : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionFrom < dpp :: balances :: credits :: TokenAmount >> :: ffi_from (* b) , min_value : ferment :: from_opt_primitive (* min_value) , max_value : ferment :: from_opt_primitive (* max_value) } , dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: InvertedLogarithmic { a , d , m , n , o , start_moment , b , min_value , max_value } => dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction :: InvertedLogarithmic { a : * a , d : * d , m : * m , n : * n , o : * o , start_moment : ferment :: from_opt_primitive (* start_moment) , b : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionFrom < dpp :: balances :: credits :: TokenAmount >> :: ffi_from (* b) , min_value : ferment :: from_opt_primitive (* min_value) , max_value : ferment :: from_opt_primitive (* max_value) } } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction > for dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction { unsafe fn ffi_to_const (obj : dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction) -> * const dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction { ferment :: boxed (match obj { dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction :: FixedAmount { amount } => dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: FixedAmount { amount : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionTo < dpp :: balances :: credits :: TokenAmount >> :: ffi_to (amount) } , dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction :: Random { min , max } => dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Random { min : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionTo < dpp :: balances :: credits :: TokenAmount >> :: ffi_to (min) , max : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionTo < dpp :: balances :: credits :: TokenAmount >> :: ffi_to (max) } , dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction :: StepDecreasingAmount { step_count , decrease_per_interval_numerator , decrease_per_interval_denominator , s , n , min_value } => dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: StepDecreasingAmount { step_count : step_count , decrease_per_interval_numerator : decrease_per_interval_numerator , decrease_per_interval_denominator : decrease_per_interval_denominator , s : ferment :: to_opt_primitive (s) , n : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionTo < dpp :: balances :: credits :: TokenAmount >> :: ffi_to (n) , min_value : ferment :: to_opt_primitive (min_value) } , dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction :: Stepwise (o_0) => dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Stepwise (< crate :: fermented :: generics :: std_collections_Map_keys_u64_values_dpp_balances_credits_TokenAmount as ferment :: FFIConversionTo < std :: collections :: BTreeMap < u64 , dpp :: balances :: credits :: TokenAmount > >> :: ffi_to (o_0)) , dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction :: Linear { a , d , start_step , starting_amount , min_value , max_value } => dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Linear { a : a , d : d , start_step : ferment :: to_opt_primitive (start_step) , starting_amount : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionTo < dpp :: balances :: credits :: TokenAmount >> :: ffi_to (starting_amount) , min_value : ferment :: to_opt_primitive (min_value) , max_value : ferment :: to_opt_primitive (max_value) } , dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction :: Polynomial { a , d , m , n , o , start_moment , b , min_value , max_value } => dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Polynomial { a : a , d : d , m : m , n : n , o : o , start_moment : ferment :: to_opt_primitive (start_moment) , b : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionTo < dpp :: balances :: credits :: TokenAmount >> :: ffi_to (b) , min_value : ferment :: to_opt_primitive (min_value) , max_value : ferment :: to_opt_primitive (max_value) } , dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction :: Exponential { a , d , m , n , o , start_moment , c , min_value , max_value } => dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Exponential { a : a , d : d , m : m , n : n , o : o , start_moment : ferment :: to_opt_primitive (start_moment) , c : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionTo < dpp :: balances :: credits :: TokenAmount >> :: ffi_to (c) , min_value : ferment :: to_opt_primitive (min_value) , max_value : ferment :: to_opt_primitive (max_value) } , dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction :: Logarithmic { a , d , m , n , o , start_moment , b , min_value , max_value } => dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Logarithmic { a : a , d : d , m : m , n : n , o : o , start_moment : ferment :: to_opt_primitive (start_moment) , b : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionTo < dpp :: balances :: credits :: TokenAmount >> :: ffi_to (b) , min_value : ferment :: to_opt_primitive (min_value) , max_value : ferment :: to_opt_primitive (max_value) } , dpp :: data_contract :: associated_token :: token_perpetual_distribution :: distribution_function :: DistributionFunction :: InvertedLogarithmic { a , d , m , n , o , start_moment , b , min_value , max_value } => dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: InvertedLogarithmic { a : a , d : d , m : m , n : n , o : o , start_moment : ferment :: to_opt_primitive (start_moment) , b : < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionTo < dpp :: balances :: credits :: TokenAmount >> :: ffi_to (b) , min_value : ferment :: to_opt_primitive (min_value) , max_value : ferment :: to_opt_primitive (max_value) } , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction { fn drop (& mut self) { unsafe { match self { dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: FixedAmount { amount } => { ferment :: unbox_any (* amount) ; } , dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Random { min , max } => { ferment :: unbox_any (* min) ; ; ferment :: unbox_any (* max) ; } , dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: StepDecreasingAmount { step_count , decrease_per_interval_numerator , decrease_per_interval_denominator , s , n , min_value } => { ; ; ; ; ; ; ferment :: destroy_opt_primitive (* s) ; ; ferment :: unbox_any (* n) ; ; ferment :: destroy_opt_primitive (* min_value) ; } , dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Stepwise (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Linear { a , d , start_step , starting_amount , min_value , max_value } => { ; ; ; ; ferment :: destroy_opt_primitive (* start_step) ; ; ferment :: unbox_any (* starting_amount) ; ; ferment :: destroy_opt_primitive (* min_value) ; ; ferment :: destroy_opt_primitive (* max_value) ; } , dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Polynomial { a , d , m , n , o , start_moment , b , min_value , max_value } => { ; ; ; ; ; ; ; ; ; ; ferment :: destroy_opt_primitive (* start_moment) ; ; ferment :: unbox_any (* b) ; ; ferment :: destroy_opt_primitive (* min_value) ; ; ferment :: destroy_opt_primitive (* max_value) ; } , dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Exponential { a , d , m , n , o , start_moment , c , min_value , max_value } => { ; ; ; ; ; ; ; ; ; ; ferment :: destroy_opt_primitive (* start_moment) ; ; ferment :: unbox_any (* c) ; ; ferment :: destroy_opt_primitive (* min_value) ; ; ferment :: destroy_opt_primitive (* max_value) ; } , dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Logarithmic { a , d , m , n , o , start_moment , b , min_value , max_value } => { ; ; ; ; ; ; ; ; ; ; ferment :: destroy_opt_primitive (* start_moment) ; ; ferment :: unbox_any (* b) ; ; ferment :: destroy_opt_primitive (* min_value) ; ; ferment :: destroy_opt_primitive (* max_value) ; } , dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: InvertedLogarithmic { a , d , m , n , o , start_moment , b , min_value , max_value } => { ; ; ; ; ; ; ; ; ; ; ferment :: destroy_opt_primitive (* start_moment) ; ; ferment :: unbox_any (* b) ; ; ferment :: destroy_opt_primitive (* min_value) ; ; ferment :: destroy_opt_primitive (* max_value) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction_FixedAmount_ctor (amount : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount) -> * mut dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction { ferment :: boxed (dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: FixedAmount { amount }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction_Random_ctor (min : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount , max : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount) -> * mut dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction { ferment :: boxed (dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Random { min , max }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction_StepDecreasingAmount_ctor (step_count : u32 , decrease_per_interval_numerator : u16 , decrease_per_interval_denominator : u16 , s : * mut u64 , n : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount , min_value : * mut u64) -> * mut dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction { ferment :: boxed (dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: StepDecreasingAmount { step_count , decrease_per_interval_numerator , decrease_per_interval_denominator , s , n , min_value }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction_Stepwise_ctor (o_o_0 : * mut crate :: fermented :: generics :: std_collections_Map_keys_u64_values_dpp_balances_credits_TokenAmount) -> * mut dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction { ferment :: boxed (dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Stepwise (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction_Linear_ctor (a : i64 , d : u64 , start_step : * mut u64 , starting_amount : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount , min_value : * mut u64 , max_value : * mut u64) -> * mut dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction { ferment :: boxed (dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Linear { a , d , start_step , starting_amount , min_value , max_value }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction_Polynomial_ctor (a : i64 , d : u64 , m : i64 , n : u64 , o : i64 , start_moment : * mut u64 , b : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount , min_value : * mut u64 , max_value : * mut u64) -> * mut dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction { ferment :: boxed (dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Polynomial { a , d , m , n , o , start_moment , b , min_value , max_value }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction_Exponential_ctor (a : u64 , d : u64 , m : i64 , n : u64 , o : i64 , start_moment : * mut u64 , c : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount , min_value : * mut u64 , max_value : * mut u64) -> * mut dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction { ferment :: boxed (dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Exponential { a , d , m , n , o , start_moment , c , min_value , max_value }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction_Logarithmic_ctor (a : i64 , d : u64 , m : u64 , n : u64 , o : i64 , start_moment : * mut u64 , b : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount , min_value : * mut u64 , max_value : * mut u64) -> * mut dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction { ferment :: boxed (dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: Logarithmic { a , d , m , n , o , start_moment , b , min_value , max_value }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction_InvertedLogarithmic_ctor (a : i64 , d : u64 , m : u64 , n : u64 , o : i64 , start_moment : * mut u64 , b : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount , min_value : * mut u64 , max_value : * mut u64) -> * mut dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction { ferment :: boxed (dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction :: InvertedLogarithmic { a , d , m , n , o , start_moment , b , min_value , max_value }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction_destroy < > (ffi : * mut dpp_data_contract_associated_token_token_perpetual_distribution_distribution_function_DistributionFunction) { ferment :: unbox_any (ffi) ; } pub mod evaluate { use crate as dash_spv_apple_bindings ; # [cfg (test)] pub mod tests { use crate as dash_spv_apple_bindings ; } } } pub mod reward_distribution_type { use crate as dash_spv_apple_bindings ; } pub mod v0 { use crate as dash_spv_apple_bindings ; } pub mod reward_distribution_moment { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`RewardDistributionMoment`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment { BlockBasedMoment (* mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight) , TimeBasedMoment (* mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis) , EpochBasedMoment (* mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex) } impl ferment :: FFIConversionFrom < dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: RewardDistributionMoment > for dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment) -> dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: RewardDistributionMoment { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment :: BlockBasedMoment (o_0) => dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: RewardDistributionMoment :: BlockBasedMoment (< crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight as ferment :: FFIConversionFrom < dpp :: prelude :: BlockHeight >> :: ffi_from (* o_0)) , dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment :: TimeBasedMoment (o_0) => dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: RewardDistributionMoment :: TimeBasedMoment (< crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis as ferment :: FFIConversionFrom < dpp :: prelude :: TimestampMillis >> :: ffi_from (* o_0)) , dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment :: EpochBasedMoment (o_0) => dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: RewardDistributionMoment :: EpochBasedMoment (< crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex as ferment :: FFIConversionFrom < dpp :: block :: epoch :: EpochIndex >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: RewardDistributionMoment > for dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment { unsafe fn ffi_to_const (obj : dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: RewardDistributionMoment) -> * const dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment { ferment :: boxed (match obj { dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: RewardDistributionMoment :: BlockBasedMoment (o_0) => dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment :: BlockBasedMoment (< crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight as ferment :: FFIConversionTo < dpp :: prelude :: BlockHeight >> :: ffi_to (o_0)) , dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: RewardDistributionMoment :: TimeBasedMoment (o_0) => dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment :: TimeBasedMoment (< crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis as ferment :: FFIConversionTo < dpp :: prelude :: TimestampMillis >> :: ffi_to (o_0)) , dpp :: data_contract :: associated_token :: token_perpetual_distribution :: reward_distribution_moment :: RewardDistributionMoment :: EpochBasedMoment (o_0) => dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment :: EpochBasedMoment (< crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex as ferment :: FFIConversionTo < dpp :: block :: epoch :: EpochIndex >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment { fn drop (& mut self) { unsafe { match self { dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment :: BlockBasedMoment (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment :: TimeBasedMoment (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment :: EpochBasedMoment (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment_BlockBasedMoment_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight) -> * mut dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment { ferment :: boxed (dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment :: BlockBasedMoment (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment_TimeBasedMoment_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis) -> * mut dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment { ferment :: boxed (dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment :: TimeBasedMoment (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment_EpochBasedMoment_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex) -> * mut dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment { ferment :: boxed (dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment :: EpochBasedMoment (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment_destroy < > (ffi : * mut dpp_data_contract_associated_token_token_perpetual_distribution_reward_distribution_moment_RewardDistributionMoment) { ferment :: unbox_any (ffi) ; } } } pub mod token_configuration_localization { use crate as dash_spv_apple_bindings ; pub mod accessors { use crate as dash_spv_apple_bindings ; } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`TokenConfigurationLocalization`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization { V0 (* mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_configuration_localization :: v0 :: dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0) } impl ferment :: FFIConversionFrom < dpp :: data_contract :: associated_token :: token_configuration_localization :: TokenConfigurationLocalization > for dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization) -> dpp :: data_contract :: associated_token :: token_configuration_localization :: TokenConfigurationLocalization { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization :: V0 (o_0) => dpp :: data_contract :: associated_token :: token_configuration_localization :: TokenConfigurationLocalization :: V0 (< crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_configuration_localization :: v0 :: dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0 as ferment :: FFIConversionFrom < dpp :: data_contract :: associated_token :: token_configuration_localization :: v0 :: TokenConfigurationLocalizationV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: associated_token :: token_configuration_localization :: TokenConfigurationLocalization > for dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization { unsafe fn ffi_to_const (obj : dpp :: data_contract :: associated_token :: token_configuration_localization :: TokenConfigurationLocalization) -> * const dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization { ferment :: boxed (match obj { dpp :: data_contract :: associated_token :: token_configuration_localization :: TokenConfigurationLocalization :: V0 (o_0) => dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization :: V0 (< crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_configuration_localization :: v0 :: dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0 as ferment :: FFIConversionTo < dpp :: data_contract :: associated_token :: token_configuration_localization :: v0 :: TokenConfigurationLocalizationV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization { fn drop (& mut self) { unsafe { match self { dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_configuration_localization :: v0 :: dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0) -> * mut dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization { ferment :: boxed (dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization_destroy < > (ffi : * mut dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization) { ferment :: unbox_any (ffi) ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TokenConfigurationLocalizationV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0 { pub should_capitalize : bool , pub singular_form : * mut std :: os :: raw :: c_char , pub plural_form : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < dpp :: data_contract :: associated_token :: token_configuration_localization :: v0 :: TokenConfigurationLocalizationV0 > for dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0 { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0) -> dpp :: data_contract :: associated_token :: token_configuration_localization :: v0 :: TokenConfigurationLocalizationV0 { let ffi_ref = & * ffi ; dpp :: data_contract :: associated_token :: token_configuration_localization :: v0 :: TokenConfigurationLocalizationV0 { should_capitalize : ffi_ref . should_capitalize , singular_form : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . singular_form) , plural_form : < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . plural_form) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: associated_token :: token_configuration_localization :: v0 :: TokenConfigurationLocalizationV0 > for dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0 { unsafe fn ffi_to_const (obj : dpp :: data_contract :: associated_token :: token_configuration_localization :: v0 :: TokenConfigurationLocalizationV0) -> * const dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0 { ferment :: boxed (dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0 { should_capitalize : obj . should_capitalize , singular_form : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . singular_form) , plural_form : < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj . plural_form) }) } } impl Drop for dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment :: unbox_string (ffi_ref . singular_form) ; ferment :: unbox_string (ffi_ref . plural_form) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0_ctor < > (should_capitalize : bool , singular_form : * mut std :: os :: raw :: c_char , plural_form : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0 { ferment :: boxed (dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0 { should_capitalize , singular_form , plural_form }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0_destroy < > (ffi : * mut dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0_get_should_capitalize < > (obj : * const dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0) -> bool { (* obj) . should_capitalize } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0_get_singular_form < > (obj : * const dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0) -> * mut std :: os :: raw :: c_char { (* obj) . singular_form } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0_get_plural_form < > (obj : * const dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0) -> * mut std :: os :: raw :: c_char { (* obj) . plural_form } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0_set_should_capitalize < > (obj : * const dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0) -> bool { (* obj) . should_capitalize } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0_set_singular_form < > (obj : * const dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0) -> * mut std :: os :: raw :: c_char { (* obj) . singular_form } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0_set_plural_form < > (obj : * const dpp_data_contract_associated_token_token_configuration_localization_v0_TokenConfigurationLocalizationV0) -> * mut std :: os :: raw :: c_char { (* obj) . plural_form } } } pub mod token_distribution_rules { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; } pub mod accessors { use crate as dash_spv_apple_bindings ; } } pub mod token_keeps_history_rules { use crate as dash_spv_apple_bindings ; pub mod accessors { use crate as dash_spv_apple_bindings ; } pub mod v0 { use crate as dash_spv_apple_bindings ; } } pub mod token_pre_programmed_distribution { use crate as dash_spv_apple_bindings ; pub mod methods { use crate as dash_spv_apple_bindings ; } } pub mod token_configuration { use crate as dash_spv_apple_bindings ; pub mod methods { use crate as dash_spv_apple_bindings ; pub mod can_apply_token_configuration_item { use crate as dash_spv_apple_bindings ; } pub mod authorized_action_takers_for_configuration_item { use crate as dash_spv_apple_bindings ; } pub mod validate_token_configuration_update { use crate as dash_spv_apple_bindings ; } pub mod apply_token_configuration_item { use crate as dash_spv_apple_bindings ; } pub mod validate_token_configuration_groups_exist { use crate as dash_spv_apple_bindings ; } } pub mod v0 { use crate as dash_spv_apple_bindings ; } pub mod accessors { use crate as dash_spv_apple_bindings ; } } pub mod token_distribution_key { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`TokenDistributionType`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType { PreProgrammed = 0 , Perpetual = 1 } impl ferment :: FFIConversionFrom < dpp :: data_contract :: associated_token :: token_distribution_key :: TokenDistributionType > for dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType) -> dpp :: data_contract :: associated_token :: token_distribution_key :: TokenDistributionType { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType :: PreProgrammed => dpp :: data_contract :: associated_token :: token_distribution_key :: TokenDistributionType :: PreProgrammed , dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType :: Perpetual => dpp :: data_contract :: associated_token :: token_distribution_key :: TokenDistributionType :: Perpetual } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: associated_token :: token_distribution_key :: TokenDistributionType > for dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType { unsafe fn ffi_to_const (obj : dpp :: data_contract :: associated_token :: token_distribution_key :: TokenDistributionType) -> * const dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType { ferment :: boxed (match obj { dpp :: data_contract :: associated_token :: token_distribution_key :: TokenDistributionType :: PreProgrammed => dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType :: PreProgrammed , dpp :: data_contract :: associated_token :: token_distribution_key :: TokenDistributionType :: Perpetual => dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType :: Perpetual , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType { fn drop (& mut self) { unsafe { match self { dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType :: PreProgrammed => { } , dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType :: Perpetual => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType_PreProgrammed_ctor () -> * mut dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType { ferment :: boxed (dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType :: PreProgrammed { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType_Perpetual_ctor () -> * mut dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType { ferment :: boxed (dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType :: Perpetual { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType_destroy < > (ffi : * mut dpp_data_contract_associated_token_token_distribution_key_TokenDistributionType) { ferment :: unbox_any (ffi) ; } } pub mod token_configuration_convention { use crate as dash_spv_apple_bindings ; pub mod accessors { use crate as dash_spv_apple_bindings ; } pub mod methods { use crate as dash_spv_apple_bindings ; pub mod validate_localizations { use crate as dash_spv_apple_bindings ; } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`TokenConfigurationConvention`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_associated_token_token_configuration_convention_TokenConfigurationConvention { V0 (* mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_configuration_convention :: v0 :: dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0) } impl ferment :: FFIConversionFrom < dpp :: data_contract :: associated_token :: token_configuration_convention :: TokenConfigurationConvention > for dpp_data_contract_associated_token_token_configuration_convention_TokenConfigurationConvention { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_associated_token_token_configuration_convention_TokenConfigurationConvention) -> dpp :: data_contract :: associated_token :: token_configuration_convention :: TokenConfigurationConvention { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_associated_token_token_configuration_convention_TokenConfigurationConvention :: V0 (o_0) => dpp :: data_contract :: associated_token :: token_configuration_convention :: TokenConfigurationConvention :: V0 (< crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_configuration_convention :: v0 :: dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0 as ferment :: FFIConversionFrom < dpp :: data_contract :: associated_token :: token_configuration_convention :: v0 :: TokenConfigurationConventionV0 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: associated_token :: token_configuration_convention :: TokenConfigurationConvention > for dpp_data_contract_associated_token_token_configuration_convention_TokenConfigurationConvention { unsafe fn ffi_to_const (obj : dpp :: data_contract :: associated_token :: token_configuration_convention :: TokenConfigurationConvention) -> * const dpp_data_contract_associated_token_token_configuration_convention_TokenConfigurationConvention { ferment :: boxed (match obj { dpp :: data_contract :: associated_token :: token_configuration_convention :: TokenConfigurationConvention :: V0 (o_0) => dpp_data_contract_associated_token_token_configuration_convention_TokenConfigurationConvention :: V0 (< crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_configuration_convention :: v0 :: dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0 as ferment :: FFIConversionTo < dpp :: data_contract :: associated_token :: token_configuration_convention :: v0 :: TokenConfigurationConventionV0 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_associated_token_token_configuration_convention_TokenConfigurationConvention { fn drop (& mut self) { unsafe { match self { dpp_data_contract_associated_token_token_configuration_convention_TokenConfigurationConvention :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_configuration_convention_TokenConfigurationConvention_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_configuration_convention :: v0 :: dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0) -> * mut dpp_data_contract_associated_token_token_configuration_convention_TokenConfigurationConvention { ferment :: boxed (dpp_data_contract_associated_token_token_configuration_convention_TokenConfigurationConvention :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_configuration_convention_TokenConfigurationConvention_destroy < > (ffi : * mut dpp_data_contract_associated_token_token_configuration_convention_TokenConfigurationConvention) { ferment :: unbox_any (ffi) ; } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`TokenConfigurationConventionV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0 { pub localizations : * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization , pub decimals : u16 } impl ferment :: FFIConversionFrom < dpp :: data_contract :: associated_token :: token_configuration_convention :: v0 :: TokenConfigurationConventionV0 > for dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0 { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0) -> dpp :: data_contract :: associated_token :: token_configuration_convention :: v0 :: TokenConfigurationConventionV0 { let ffi_ref = & * ffi ; dpp :: data_contract :: associated_token :: token_configuration_convention :: v0 :: TokenConfigurationConventionV0 { localizations : < crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < String , dpp :: data_contract :: associated_token :: token_configuration_localization :: TokenConfigurationLocalization > >> :: ffi_from (ffi_ref . localizations) , decimals : ffi_ref . decimals } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: associated_token :: token_configuration_convention :: v0 :: TokenConfigurationConventionV0 > for dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0 { unsafe fn ffi_to_const (obj : dpp :: data_contract :: associated_token :: token_configuration_convention :: v0 :: TokenConfigurationConventionV0) -> * const dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0 { ferment :: boxed (dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0 { localizations : < crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization as ferment :: FFIConversionTo < std :: collections :: BTreeMap < String , dpp :: data_contract :: associated_token :: token_configuration_localization :: TokenConfigurationLocalization > >> :: ffi_to (obj . localizations) , decimals : obj . decimals }) } } impl Drop for dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . localizations) ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0_ctor < > (localizations : * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization , decimals : u16) -> * mut dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0 { ferment :: boxed (dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0 { localizations , decimals }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0_destroy < > (ffi : * mut dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0_get_localizations < > (obj : * const dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization { (* obj) . localizations } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0_get_decimals < > (obj : * const dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0) -> u16 { (* obj) . decimals } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0_set_localizations < > (obj : * const dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization { (* obj) . localizations } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0_set_decimals < > (obj : * const dpp_data_contract_associated_token_token_configuration_convention_v0_TokenConfigurationConventionV0) -> u16 { (* obj) . decimals } } } } # [doc = "FFI-representation of the [`PropertyPath`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_PropertyPath (* mut std :: os :: raw :: c_char) ; impl ferment :: FFIConversionFrom < dpp :: data_contract :: PropertyPath > for dpp_data_contract_PropertyPath { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_PropertyPath) -> dpp :: data_contract :: PropertyPath { let ffi_ref = & * ffi ; < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . 0) } } impl ferment :: FFIConversionTo < dpp :: data_contract :: PropertyPath > for dpp_data_contract_PropertyPath { unsafe fn ffi_to_const (obj : dpp :: data_contract :: PropertyPath) -> * const dpp_data_contract_PropertyPath { ferment :: boxed (dpp_data_contract_PropertyPath (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj))) } } impl Drop for dpp_data_contract_PropertyPath { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_PropertyPath_ctor < > (o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_PropertyPath { ferment :: boxed (dpp_data_contract_PropertyPath (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_PropertyPath_destroy < > (ffi : * mut dpp_data_contract_PropertyPath) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_PropertyPath_get_0 < > (obj : * const dpp_data_contract_PropertyPath) -> * mut std :: os :: raw :: c_char { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_PropertyPath_set_0 < > (obj : * const dpp_data_contract_PropertyPath) -> * mut std :: os :: raw :: c_char { (* obj) . 0 } # [doc = "FFI-representation of the [`DocumentName`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_DocumentName (* mut std :: os :: raw :: c_char) ; impl ferment :: FFIConversionFrom < dpp :: data_contract :: DocumentName > for dpp_data_contract_DocumentName { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_DocumentName) -> dpp :: data_contract :: DocumentName { let ffi_ref = & * ffi ; < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_ref . 0) } } impl ferment :: FFIConversionTo < dpp :: data_contract :: DocumentName > for dpp_data_contract_DocumentName { unsafe fn ffi_to_const (obj : dpp :: data_contract :: DocumentName) -> * const dpp_data_contract_DocumentName { ferment :: boxed (dpp_data_contract_DocumentName (< std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj))) } } impl Drop for dpp_data_contract_DocumentName { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_string (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_DocumentName_ctor < > (o_0 : * mut std :: os :: raw :: c_char) -> * mut dpp_data_contract_DocumentName { ferment :: boxed (dpp_data_contract_DocumentName (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_DocumentName_destroy < > (ffi : * mut dpp_data_contract_DocumentName) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_DocumentName_get_0 < > (obj : * const dpp_data_contract_DocumentName) -> * mut std :: os :: raw :: c_char { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_DocumentName_set_0 < > (obj : * const dpp_data_contract_DocumentName) -> * mut std :: os :: raw :: c_char { (* obj) . 0 } pub mod storage_requirements { use crate as dash_spv_apple_bindings ; pub mod keys_for_document_type { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`StorageKeyRequirements`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { Unique = 0 , Multiple = 1 , MultipleReferenceToLatest = 2 } impl ferment :: FFIConversionFrom < dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements > for dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements) -> dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements :: Unique => dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements :: Unique , dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements :: Multiple => dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements :: Multiple , dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements :: MultipleReferenceToLatest => dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements :: MultipleReferenceToLatest } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements > for dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { unsafe fn ffi_to_const (obj : dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements) -> * const dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { ferment :: boxed (match obj { dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements :: Unique => dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements :: Unique , dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements :: Multiple => dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements :: Multiple , dpp :: data_contract :: storage_requirements :: keys_for_document_type :: StorageKeyRequirements :: MultipleReferenceToLatest => dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements :: MultipleReferenceToLatest , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { fn drop (& mut self) { unsafe { match self { dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements :: Unique => { } , dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements :: Multiple => { } , dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements :: MultipleReferenceToLatest => { } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements_Unique_ctor () -> * mut dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { ferment :: boxed (dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements :: Unique { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements_Multiple_ctor () -> * mut dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { ferment :: boxed (dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements :: Multiple { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements_MultipleReferenceToLatest_ctor () -> * mut dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements { ferment :: boxed (dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements :: MultipleReferenceToLatest { }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements_destroy < > (ffi : * mut dpp_data_contract_storage_requirements_keys_for_document_type_StorageKeyRequirements) { ferment :: unbox_any (ffi) ; } } } # [doc = "FFI-representation of the [`TokenContractPosition`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_TokenContractPosition (u16) ; impl ferment :: FFIConversionFrom < dpp :: data_contract :: TokenContractPosition > for dpp_data_contract_TokenContractPosition { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_TokenContractPosition) -> dpp :: data_contract :: TokenContractPosition { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: data_contract :: TokenContractPosition > for dpp_data_contract_TokenContractPosition { unsafe fn ffi_to_const (obj : dpp :: data_contract :: TokenContractPosition) -> * const dpp_data_contract_TokenContractPosition { ferment :: boxed (dpp_data_contract_TokenContractPosition (obj)) } } impl Drop for dpp_data_contract_TokenContractPosition { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_TokenContractPosition_ctor < > (o_0 : u16) -> * mut dpp_data_contract_TokenContractPosition { ferment :: boxed (dpp_data_contract_TokenContractPosition (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_TokenContractPosition_destroy < > (ffi : * mut dpp_data_contract_TokenContractPosition) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_TokenContractPosition_get_0 < > (obj : * const dpp_data_contract_TokenContractPosition) -> u16 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_TokenContractPosition_set_0 < > (obj : * const dpp_data_contract_TokenContractPosition) -> u16 { (* obj) . 0 } pub mod v0 { use crate as dash_spv_apple_bindings ; pub mod conversion { use crate as dash_spv_apple_bindings ; } pub mod serialization { use crate as dash_spv_apple_bindings ; } pub mod data_contract { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_v0_data_contract_DataContractV0 { pub id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub version : u32 , pub owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub document_types : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType , pub metadata : * mut crate :: fermented :: types :: dpp :: metadata :: dpp_metadata_Metadata , pub config : * mut crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig , pub schema_defs : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value } impl ferment :: FFIConversionFrom < dpp :: data_contract :: v0 :: data_contract :: DataContractV0 > for dpp_data_contract_v0_data_contract_DataContractV0 { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_v0_data_contract_DataContractV0) -> dpp :: data_contract :: v0 :: data_contract :: DataContractV0 { let ffi_ref = & * ffi ; dpp :: data_contract :: v0 :: data_contract :: DataContractV0 { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . id) , version : ffi_ref . version , owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . owner_id) , document_types : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: data_contract :: DocumentName , dpp :: data_contract :: document_type :: DocumentType > >> :: ffi_from (ffi_ref . document_types) , metadata : < crate :: fermented :: types :: dpp :: metadata :: dpp_metadata_Metadata as ferment :: FFIConversionFrom < dpp :: metadata :: Metadata >> :: ffi_from_opt (ffi_ref . metadata) , config : < crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig as ferment :: FFIConversionFrom < dpp :: data_contract :: config :: DataContractConfig >> :: ffi_from (ffi_ref . config) , schema_defs : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: data_contract :: DefinitionName , platform_value :: Value > >> :: ffi_from_opt (ffi_ref . schema_defs) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: v0 :: data_contract :: DataContractV0 > for dpp_data_contract_v0_data_contract_DataContractV0 { unsafe fn ffi_to_const (obj : dpp :: data_contract :: v0 :: data_contract :: DataContractV0) -> * const dpp_data_contract_v0_data_contract_DataContractV0 { ferment :: boxed (dpp_data_contract_v0_data_contract_DataContractV0 { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . id) , version : obj . version , owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . owner_id) , document_types : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType as ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: data_contract :: DocumentName , dpp :: data_contract :: document_type :: DocumentType > >> :: ffi_to (obj . document_types) , metadata : < crate :: fermented :: types :: dpp :: metadata :: dpp_metadata_Metadata as ferment :: FFIConversionTo < dpp :: metadata :: Metadata >> :: ffi_to_opt (obj . metadata) , config : < crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig as ferment :: FFIConversionTo < dpp :: data_contract :: config :: DataContractConfig >> :: ffi_to (obj . config) , schema_defs : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value as ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: data_contract :: DefinitionName , platform_value :: Value > >> :: ffi_to_opt (obj . schema_defs) }) } } impl Drop for dpp_data_contract_v0_data_contract_DataContractV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . id) ; ; ferment :: unbox_any (ffi_ref . owner_id) ; ferment :: unbox_any (ffi_ref . document_types) ; ferment :: unbox_any_opt (ffi_ref . metadata) ; ferment :: unbox_any (ffi_ref . config) ; ferment :: unbox_any_opt (ffi_ref . schema_defs) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v0_data_contract_DataContractV0_ctor < > (id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , version : u32 , owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , document_types : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType , metadata : * mut crate :: fermented :: types :: dpp :: metadata :: dpp_metadata_Metadata , config : * mut crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig , schema_defs : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value) -> * mut dpp_data_contract_v0_data_contract_DataContractV0 { ferment :: boxed (dpp_data_contract_v0_data_contract_DataContractV0 { id , version , owner_id , document_types , metadata , config , schema_defs }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v0_data_contract_DataContractV0_destroy < > (ffi : * mut dpp_data_contract_v0_data_contract_DataContractV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v0_data_contract_DataContractV0_get_id < > (obj : * const dpp_data_contract_v0_data_contract_DataContractV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v0_data_contract_DataContractV0_get_version < > (obj : * const dpp_data_contract_v0_data_contract_DataContractV0) -> u32 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v0_data_contract_DataContractV0_get_owner_id < > (obj : * const dpp_data_contract_v0_data_contract_DataContractV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . owner_id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v0_data_contract_DataContractV0_get_document_types < > (obj : * const dpp_data_contract_v0_data_contract_DataContractV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType { (* obj) . document_types } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v0_data_contract_DataContractV0_get_metadata < > (obj : * const dpp_data_contract_v0_data_contract_DataContractV0) -> * mut crate :: fermented :: types :: dpp :: metadata :: dpp_metadata_Metadata { (* obj) . metadata } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v0_data_contract_DataContractV0_get_config < > (obj : * const dpp_data_contract_v0_data_contract_DataContractV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig { (* obj) . config } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v0_data_contract_DataContractV0_get_schema_defs < > (obj : * const dpp_data_contract_v0_data_contract_DataContractV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value { (* obj) . schema_defs } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v0_data_contract_DataContractV0_set_id < > (obj : * const dpp_data_contract_v0_data_contract_DataContractV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v0_data_contract_DataContractV0_set_version < > (obj : * const dpp_data_contract_v0_data_contract_DataContractV0) -> u32 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v0_data_contract_DataContractV0_set_owner_id < > (obj : * const dpp_data_contract_v0_data_contract_DataContractV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . owner_id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v0_data_contract_DataContractV0_set_document_types < > (obj : * const dpp_data_contract_v0_data_contract_DataContractV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType { (* obj) . document_types } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v0_data_contract_DataContractV0_set_metadata < > (obj : * const dpp_data_contract_v0_data_contract_DataContractV0) -> * mut crate :: fermented :: types :: dpp :: metadata :: dpp_metadata_Metadata { (* obj) . metadata } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v0_data_contract_DataContractV0_set_config < > (obj : * const dpp_data_contract_v0_data_contract_DataContractV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig { (* obj) . config } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_v0_data_contract_DataContractV0_set_schema_defs < > (obj : * const dpp_data_contract_v0_data_contract_DataContractV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value { (* obj) . schema_defs } } pub mod methods { use crate as dash_spv_apple_bindings ; pub mod schema { use crate as dash_spv_apple_bindings ; } } } pub mod extra { use crate as dash_spv_apple_bindings ; # [cfg (test)] pub mod drive_api_tests { use crate as dash_spv_apple_bindings ; } } pub mod methods { use crate as dash_spv_apple_bindings ; # [cfg (feature = "validation")] pub mod validate_groups { use crate as dash_spv_apple_bindings ; } pub mod schema { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "validation")] pub mod validate_document { use crate as dash_spv_apple_bindings ; } pub mod equal_ignoring_time_based_fields { use crate as dash_spv_apple_bindings ; } # [cfg (feature = "validation")] pub mod validate_update { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; # [cfg (test)] pub mod tests { use crate as dash_spv_apple_bindings ; } } } } # [doc = "FFI-representation of the [`GroupContractPosition`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_GroupContractPosition (u16) ; impl ferment :: FFIConversionFrom < dpp :: data_contract :: GroupContractPosition > for dpp_data_contract_GroupContractPosition { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_GroupContractPosition) -> dpp :: data_contract :: GroupContractPosition { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: data_contract :: GroupContractPosition > for dpp_data_contract_GroupContractPosition { unsafe fn ffi_to_const (obj : dpp :: data_contract :: GroupContractPosition) -> * const dpp_data_contract_GroupContractPosition { ferment :: boxed (dpp_data_contract_GroupContractPosition (obj)) } } impl Drop for dpp_data_contract_GroupContractPosition { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_GroupContractPosition_ctor < > (o_0 : u16) -> * mut dpp_data_contract_GroupContractPosition { ferment :: boxed (dpp_data_contract_GroupContractPosition (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_GroupContractPosition_destroy < > (ffi : * mut dpp_data_contract_GroupContractPosition) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_GroupContractPosition_get_0 < > (obj : * const dpp_data_contract_GroupContractPosition) -> u16 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_GroupContractPosition_set_0 < > (obj : * const dpp_data_contract_GroupContractPosition) -> u16 { (* obj) . 0 } # [doc = "FFI-representation of the [`JsonSchema`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_JsonSchema (* mut dash_spv_apple_bindings :: custom :: serde_json :: serde_json_JsonValue) ; impl ferment :: FFIConversionFrom < dpp :: data_contract :: JsonSchema > for dpp_data_contract_JsonSchema { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_JsonSchema) -> dpp :: data_contract :: JsonSchema { let ffi_ref = & * ffi ; < dash_spv_apple_bindings :: custom :: serde_json :: serde_json_JsonValue as ferment :: FFIConversionFrom < serde_json :: Value >> :: ffi_from (ffi_ref . 0) } } impl ferment :: FFIConversionTo < dpp :: data_contract :: JsonSchema > for dpp_data_contract_JsonSchema { unsafe fn ffi_to_const (obj : dpp :: data_contract :: JsonSchema) -> * const dpp_data_contract_JsonSchema { ferment :: boxed (dpp_data_contract_JsonSchema (< dash_spv_apple_bindings :: custom :: serde_json :: serde_json_JsonValue as ferment :: FFIConversionTo < serde_json :: Value >> :: ffi_to (obj))) } } impl Drop for dpp_data_contract_JsonSchema { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . 0) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_JsonSchema_ctor < > (o_0 : * mut dash_spv_apple_bindings :: custom :: serde_json :: serde_json_JsonValue) -> * mut dpp_data_contract_JsonSchema { ferment :: boxed (dpp_data_contract_JsonSchema (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_JsonSchema_destroy < > (ffi : * mut dpp_data_contract_JsonSchema) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_JsonSchema_get_0 < > (obj : * const dpp_data_contract_JsonSchema) -> * mut dash_spv_apple_bindings :: custom :: serde_json :: serde_json_JsonValue { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_JsonSchema_set_0 < > (obj : * const dpp_data_contract_JsonSchema) -> * mut dash_spv_apple_bindings :: custom :: serde_json :: serde_json_JsonValue { (* obj) . 0 } pub mod serialized_version { use crate as dash_spv_apple_bindings ; pub mod v1 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractInSerializationFormatV1`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1 { pub id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub config : * mut crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig , pub version : u32 , pub owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub schema_defs : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value , pub document_schemas : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value , pub created_at : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis , pub updated_at : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis , pub created_at_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight , pub updated_at_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight , pub created_at_epoch : * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex , pub updated_at_epoch : * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex , pub groups : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group , pub tokens : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration } impl ferment :: FFIConversionFrom < dpp :: data_contract :: serialized_version :: v1 :: DataContractInSerializationFormatV1 > for dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1 { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> dpp :: data_contract :: serialized_version :: v1 :: DataContractInSerializationFormatV1 { let ffi_ref = & * ffi ; dpp :: data_contract :: serialized_version :: v1 :: DataContractInSerializationFormatV1 { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . id) , config : < crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig as ferment :: FFIConversionFrom < dpp :: data_contract :: config :: DataContractConfig >> :: ffi_from (ffi_ref . config) , version : ffi_ref . version , owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . owner_id) , schema_defs : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: data_contract :: DefinitionName , platform_value :: Value > >> :: ffi_from_opt (ffi_ref . schema_defs) , document_schemas : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: data_contract :: DocumentName , platform_value :: Value > >> :: ffi_from (ffi_ref . document_schemas) , created_at : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: TimestampMillis >> :: ffi_from_opt (ffi_ref . created_at) , updated_at : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: TimestampMillis >> :: ffi_from_opt (ffi_ref . updated_at) , created_at_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight as ferment :: FFIConversionFrom < dpp :: prelude :: BlockHeight >> :: ffi_from_opt (ffi_ref . created_at_block_height) , updated_at_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight as ferment :: FFIConversionFrom < dpp :: prelude :: BlockHeight >> :: ffi_from_opt (ffi_ref . updated_at_block_height) , created_at_epoch : < crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex as ferment :: FFIConversionFrom < dpp :: block :: epoch :: EpochIndex >> :: ffi_from_opt (ffi_ref . created_at_epoch) , updated_at_epoch : < crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex as ferment :: FFIConversionFrom < dpp :: block :: epoch :: EpochIndex >> :: ffi_from_opt (ffi_ref . updated_at_epoch) , groups : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: data_contract :: GroupContractPosition , dpp :: data_contract :: group :: Group > >> :: ffi_from (ffi_ref . groups) , tokens : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: data_contract :: TokenContractPosition , dpp :: data_contract :: associated_token :: token_configuration :: TokenConfiguration > >> :: ffi_from (ffi_ref . tokens) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: serialized_version :: v1 :: DataContractInSerializationFormatV1 > for dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1 { unsafe fn ffi_to_const (obj : dpp :: data_contract :: serialized_version :: v1 :: DataContractInSerializationFormatV1) -> * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1 { ferment :: boxed (dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1 { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . id) , config : < crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig as ferment :: FFIConversionTo < dpp :: data_contract :: config :: DataContractConfig >> :: ffi_to (obj . config) , version : obj . version , owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . owner_id) , schema_defs : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value as ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: data_contract :: DefinitionName , platform_value :: Value > >> :: ffi_to_opt (obj . schema_defs) , document_schemas : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value as ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: data_contract :: DocumentName , platform_value :: Value > >> :: ffi_to (obj . document_schemas) , created_at : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: TimestampMillis >> :: ffi_to_opt (obj . created_at) , updated_at : < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: TimestampMillis >> :: ffi_to_opt (obj . updated_at) , created_at_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight as ferment :: FFIConversionTo < dpp :: prelude :: BlockHeight >> :: ffi_to_opt (obj . created_at_block_height) , updated_at_block_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight as ferment :: FFIConversionTo < dpp :: prelude :: BlockHeight >> :: ffi_to_opt (obj . updated_at_block_height) , created_at_epoch : < crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex as ferment :: FFIConversionTo < dpp :: block :: epoch :: EpochIndex >> :: ffi_to_opt (obj . created_at_epoch) , updated_at_epoch : < crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex as ferment :: FFIConversionTo < dpp :: block :: epoch :: EpochIndex >> :: ffi_to_opt (obj . updated_at_epoch) , groups : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group as ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: data_contract :: GroupContractPosition , dpp :: data_contract :: group :: Group > >> :: ffi_to (obj . groups) , tokens : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration as ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: data_contract :: TokenContractPosition , dpp :: data_contract :: associated_token :: token_configuration :: TokenConfiguration > >> :: ffi_to (obj . tokens) }) } } impl Drop for dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . id) ; ferment :: unbox_any (ffi_ref . config) ; ; ferment :: unbox_any (ffi_ref . owner_id) ; ferment :: unbox_any_opt (ffi_ref . schema_defs) ; ferment :: unbox_any (ffi_ref . document_schemas) ; ferment :: unbox_any_opt (ffi_ref . created_at) ; ferment :: unbox_any_opt (ffi_ref . updated_at) ; ferment :: unbox_any_opt (ffi_ref . created_at_block_height) ; ferment :: unbox_any_opt (ffi_ref . updated_at_block_height) ; ferment :: unbox_any_opt (ffi_ref . created_at_epoch) ; ferment :: unbox_any_opt (ffi_ref . updated_at_epoch) ; ferment :: unbox_any (ffi_ref . groups) ; ferment :: unbox_any (ffi_ref . tokens) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_ctor < > (id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , config : * mut crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig , version : u32 , owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , schema_defs : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value , document_schemas : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value , created_at : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis , updated_at : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis , created_at_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight , updated_at_block_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight , created_at_epoch : * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex , updated_at_epoch : * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex , groups : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group , tokens : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration) -> * mut dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1 { ferment :: boxed (dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1 { id , config , version , owner_id , schema_defs , document_schemas , created_at , updated_at , created_at_block_height , updated_at_block_height , created_at_epoch , updated_at_epoch , groups , tokens }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_destroy < > (ffi : * mut dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_get_id < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_get_config < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig { (* obj) . config } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_get_version < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> u32 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_get_owner_id < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . owner_id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_get_schema_defs < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value { (* obj) . schema_defs } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_get_document_schemas < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value { (* obj) . document_schemas } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_get_created_at < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis { (* obj) . created_at } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_get_updated_at < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis { (* obj) . updated_at } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_get_created_at_block_height < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight { (* obj) . created_at_block_height } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_get_updated_at_block_height < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight { (* obj) . updated_at_block_height } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_get_created_at_epoch < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex { (* obj) . created_at_epoch } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_get_updated_at_epoch < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex { (* obj) . updated_at_epoch } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_get_groups < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group { (* obj) . groups } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_get_tokens < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration { (* obj) . tokens } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_set_id < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_set_config < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig { (* obj) . config } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_set_version < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> u32 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_set_owner_id < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . owner_id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_set_schema_defs < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value { (* obj) . schema_defs } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_set_document_schemas < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value { (* obj) . document_schemas } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_set_created_at < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis { (* obj) . created_at } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_set_updated_at < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_TimestampMillis { (* obj) . updated_at } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_set_created_at_block_height < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight { (* obj) . created_at_block_height } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_set_updated_at_block_height < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight { (* obj) . updated_at_block_height } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_set_created_at_epoch < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex { (* obj) . created_at_epoch } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_set_updated_at_epoch < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex { (* obj) . updated_at_epoch } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_set_groups < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group { (* obj) . groups } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1_set_tokens < > (obj : * const dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration { (* obj) . tokens } } pub mod v0 { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`DataContractInSerializationFormatV0`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0 { pub id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub config : * mut crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig , pub version : u32 , pub owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub schema_defs : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value , pub document_schemas : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value } impl ferment :: FFIConversionFrom < dpp :: data_contract :: serialized_version :: v0 :: DataContractInSerializationFormatV0 > for dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0 { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0) -> dpp :: data_contract :: serialized_version :: v0 :: DataContractInSerializationFormatV0 { let ffi_ref = & * ffi ; dpp :: data_contract :: serialized_version :: v0 :: DataContractInSerializationFormatV0 { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . id) , config : < crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig as ferment :: FFIConversionFrom < dpp :: data_contract :: config :: DataContractConfig >> :: ffi_from (ffi_ref . config) , version : ffi_ref . version , owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (ffi_ref . owner_id) , schema_defs : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: data_contract :: DefinitionName , platform_value :: Value > >> :: ffi_from_opt (ffi_ref . schema_defs) , document_schemas : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: data_contract :: DocumentName , platform_value :: Value > >> :: ffi_from (ffi_ref . document_schemas) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: serialized_version :: v0 :: DataContractInSerializationFormatV0 > for dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0 { unsafe fn ffi_to_const (obj : dpp :: data_contract :: serialized_version :: v0 :: DataContractInSerializationFormatV0) -> * const dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0 { ferment :: boxed (dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0 { id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . id) , config : < crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig as ferment :: FFIConversionTo < dpp :: data_contract :: config :: DataContractConfig >> :: ffi_to (obj . config) , version : obj . version , owner_id : < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (obj . owner_id) , schema_defs : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value as ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: data_contract :: DefinitionName , platform_value :: Value > >> :: ffi_to_opt (obj . schema_defs) , document_schemas : < crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value as ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: data_contract :: DocumentName , platform_value :: Value > >> :: ffi_to (obj . document_schemas) }) } } impl Drop for dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . id) ; ferment :: unbox_any (ffi_ref . config) ; ; ferment :: unbox_any (ffi_ref . owner_id) ; ferment :: unbox_any_opt (ffi_ref . schema_defs) ; ferment :: unbox_any (ffi_ref . document_schemas) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0_ctor < > (id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , config : * mut crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig , version : u32 , owner_id : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , schema_defs : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value , document_schemas : * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value) -> * mut dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0 { ferment :: boxed (dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0 { id , config , version , owner_id , schema_defs , document_schemas }) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0_destroy < > (ffi : * mut dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0_get_id < > (obj : * const dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0_get_config < > (obj : * const dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig { (* obj) . config } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0_get_version < > (obj : * const dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0) -> u32 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0_get_owner_id < > (obj : * const dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . owner_id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0_get_schema_defs < > (obj : * const dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value { (* obj) . schema_defs } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0_get_document_schemas < > (obj : * const dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value { (* obj) . document_schemas } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0_set_id < > (obj : * const dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0_set_config < > (obj : * const dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0) -> * mut crate :: fermented :: types :: dpp :: data_contract :: config :: dpp_data_contract_config_DataContractConfig { (* obj) . config } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0_set_version < > (obj : * const dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0) -> u32 { (* obj) . version } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0_set_owner_id < > (obj : * const dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0) -> * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier { (* obj) . owner_id } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0_set_schema_defs < > (obj : * const dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value { (* obj) . schema_defs } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0_set_document_schemas < > (obj : * const dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0) -> * mut crate :: fermented :: generics :: std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value { (* obj) . document_schemas } } # [doc = "FFI-representation of the [`# doc = \"FFI-representation of the [`DataContractInSerializationFormat`]\"`]"] # [repr (C)] # [derive (Clone)] # [non_exhaustive] pub enum dpp_data_contract_serialized_version_DataContractInSerializationFormat { V0 (* mut crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: v0 :: dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0) , V1 (* mut crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: v1 :: dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) } impl ferment :: FFIConversionFrom < dpp :: data_contract :: serialized_version :: DataContractInSerializationFormat > for dpp_data_contract_serialized_version_DataContractInSerializationFormat { unsafe fn ffi_from_const (ffi : * const dpp_data_contract_serialized_version_DataContractInSerializationFormat) -> dpp :: data_contract :: serialized_version :: DataContractInSerializationFormat { let ffi_ref = & * ffi ; match ffi_ref { dpp_data_contract_serialized_version_DataContractInSerializationFormat :: V0 (o_0) => dpp :: data_contract :: serialized_version :: DataContractInSerializationFormat :: V0 (< crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: v0 :: dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0 as ferment :: FFIConversionFrom < dpp :: data_contract :: serialized_version :: v0 :: DataContractInSerializationFormatV0 >> :: ffi_from (* o_0)) , dpp_data_contract_serialized_version_DataContractInSerializationFormat :: V1 (o_0) => dpp :: data_contract :: serialized_version :: DataContractInSerializationFormat :: V1 (< crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: v1 :: dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1 as ferment :: FFIConversionFrom < dpp :: data_contract :: serialized_version :: v1 :: DataContractInSerializationFormatV1 >> :: ffi_from (* o_0)) } } } impl ferment :: FFIConversionTo < dpp :: data_contract :: serialized_version :: DataContractInSerializationFormat > for dpp_data_contract_serialized_version_DataContractInSerializationFormat { unsafe fn ffi_to_const (obj : dpp :: data_contract :: serialized_version :: DataContractInSerializationFormat) -> * const dpp_data_contract_serialized_version_DataContractInSerializationFormat { ferment :: boxed (match obj { dpp :: data_contract :: serialized_version :: DataContractInSerializationFormat :: V0 (o_0) => dpp_data_contract_serialized_version_DataContractInSerializationFormat :: V0 (< crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: v0 :: dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0 as ferment :: FFIConversionTo < dpp :: data_contract :: serialized_version :: v0 :: DataContractInSerializationFormatV0 >> :: ffi_to (o_0)) , dpp :: data_contract :: serialized_version :: DataContractInSerializationFormat :: V1 (o_0) => dpp_data_contract_serialized_version_DataContractInSerializationFormat :: V1 (< crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: v1 :: dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1 as ferment :: FFIConversionTo < dpp :: data_contract :: serialized_version :: v1 :: DataContractInSerializationFormatV1 >> :: ffi_to (o_0)) , _ => unreachable ! ("This is unreachable") }) } } impl Drop for dpp_data_contract_serialized_version_DataContractInSerializationFormat { fn drop (& mut self) { unsafe { match self { dpp_data_contract_serialized_version_DataContractInSerializationFormat :: V0 (o_0) => { ferment :: unbox_any (* o_0) ; } , dpp_data_contract_serialized_version_DataContractInSerializationFormat :: V1 (o_0) => { ferment :: unbox_any (* o_0) ; } , _ => unreachable ! ("This is unreachable") } ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_DataContractInSerializationFormat_V0_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: v0 :: dpp_data_contract_serialized_version_v0_DataContractInSerializationFormatV0) -> * mut dpp_data_contract_serialized_version_DataContractInSerializationFormat { ferment :: boxed (dpp_data_contract_serialized_version_DataContractInSerializationFormat :: V0 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_DataContractInSerializationFormat_V1_ctor (o_o_0 : * mut crate :: fermented :: types :: dpp :: data_contract :: serialized_version :: v1 :: dpp_data_contract_serialized_version_v1_DataContractInSerializationFormatV1) -> * mut dpp_data_contract_serialized_version_DataContractInSerializationFormat { ferment :: boxed (dpp_data_contract_serialized_version_DataContractInSerializationFormat :: V1 (o_o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_data_contract_serialized_version_DataContractInSerializationFormat_destroy < > (ffi : * mut dpp_data_contract_serialized_version_DataContractInSerializationFormat) { ferment :: unbox_any (ffi) ; } } # [cfg (any (feature = "state-transitions" , feature = "factories"))] pub mod created_data_contract { use crate as dash_spv_apple_bindings ; pub mod fields { use crate as dash_spv_apple_bindings ; } } } pub mod block { use crate as dash_spv_apple_bindings ; pub mod finalized_epoch_info { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; } } pub mod extended_block_info { use crate as dash_spv_apple_bindings ; pub mod v0 { use crate as dash_spv_apple_bindings ; } } pub mod block_info { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`BlockInfo`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_block_block_info_BlockInfo { pub time_ms : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis , pub height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight , pub core_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight , pub epoch : * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_Epoch } impl ferment :: FFIConversionFrom < dpp :: block :: block_info :: BlockInfo > for dpp_block_block_info_BlockInfo { unsafe fn ffi_from_const (ffi : * const dpp_block_block_info_BlockInfo) -> dpp :: block :: block_info :: BlockInfo { let ffi_ref = & * ffi ; dpp :: block :: block_info :: BlockInfo { time_ms : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis as ferment :: FFIConversionFrom < dpp :: prelude :: TimestampMillis >> :: ffi_from (ffi_ref . time_ms) , height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight as ferment :: FFIConversionFrom < dpp :: prelude :: BlockHeight >> :: ffi_from (ffi_ref . height) , core_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight as ferment :: FFIConversionFrom < dpp :: prelude :: CoreBlockHeight >> :: ffi_from (ffi_ref . core_height) , epoch : < crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_Epoch as ferment :: FFIConversionFrom < dpp :: block :: epoch :: Epoch >> :: ffi_from (ffi_ref . epoch) } } } impl ferment :: FFIConversionTo < dpp :: block :: block_info :: BlockInfo > for dpp_block_block_info_BlockInfo { unsafe fn ffi_to_const (obj : dpp :: block :: block_info :: BlockInfo) -> * const dpp_block_block_info_BlockInfo { ferment :: boxed (dpp_block_block_info_BlockInfo { time_ms : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis as ferment :: FFIConversionTo < dpp :: prelude :: TimestampMillis >> :: ffi_to (obj . time_ms) , height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight as ferment :: FFIConversionTo < dpp :: prelude :: BlockHeight >> :: ffi_to (obj . height) , core_height : < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight as ferment :: FFIConversionTo < dpp :: prelude :: CoreBlockHeight >> :: ffi_to (obj . core_height) , epoch : < crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_Epoch as ferment :: FFIConversionTo < dpp :: block :: epoch :: Epoch >> :: ffi_to (obj . epoch) }) } } impl Drop for dpp_block_block_info_BlockInfo { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . time_ms) ; ferment :: unbox_any (ffi_ref . height) ; ferment :: unbox_any (ffi_ref . core_height) ; ferment :: unbox_any (ffi_ref . epoch) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_block_block_info_BlockInfo_ctor < > (time_ms : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis , height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight , core_height : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight , epoch : * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_Epoch) -> * mut dpp_block_block_info_BlockInfo { ferment :: boxed (dpp_block_block_info_BlockInfo { time_ms , height , core_height , epoch }) } # [no_mangle] pub unsafe extern "C" fn dpp_block_block_info_BlockInfo_destroy < > (ffi : * mut dpp_block_block_info_BlockInfo) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_block_block_info_BlockInfo_get_time_ms < > (obj : * const dpp_block_block_info_BlockInfo) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis { (* obj) . time_ms } # [no_mangle] pub unsafe extern "C" fn dpp_block_block_info_BlockInfo_get_height < > (obj : * const dpp_block_block_info_BlockInfo) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight { (* obj) . height } # [no_mangle] pub unsafe extern "C" fn dpp_block_block_info_BlockInfo_get_core_height < > (obj : * const dpp_block_block_info_BlockInfo) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight { (* obj) . core_height } # [no_mangle] pub unsafe extern "C" fn dpp_block_block_info_BlockInfo_get_epoch < > (obj : * const dpp_block_block_info_BlockInfo) -> * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_Epoch { (* obj) . epoch } # [no_mangle] pub unsafe extern "C" fn dpp_block_block_info_BlockInfo_set_time_ms < > (obj : * const dpp_block_block_info_BlockInfo) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_TimestampMillis { (* obj) . time_ms } # [no_mangle] pub unsafe extern "C" fn dpp_block_block_info_BlockInfo_set_height < > (obj : * const dpp_block_block_info_BlockInfo) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_BlockHeight { (* obj) . height } # [no_mangle] pub unsafe extern "C" fn dpp_block_block_info_BlockInfo_set_core_height < > (obj : * const dpp_block_block_info_BlockInfo) -> * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight { (* obj) . core_height } # [no_mangle] pub unsafe extern "C" fn dpp_block_block_info_BlockInfo_set_epoch < > (obj : * const dpp_block_block_info_BlockInfo) -> * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_Epoch { (* obj) . epoch } } pub mod extended_epoch_info { use crate as dash_spv_apple_bindings ; } pub mod epoch { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`Epoch`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_block_epoch_Epoch { pub index : * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex , pub key : * mut crate :: fermented :: generics :: Arr_u8_2 } impl ferment :: FFIConversionFrom < dpp :: block :: epoch :: Epoch > for dpp_block_epoch_Epoch { unsafe fn ffi_from_const (ffi : * const dpp_block_epoch_Epoch) -> dpp :: block :: epoch :: Epoch { let ffi_ref = & * ffi ; dpp :: block :: epoch :: Epoch { index : < crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex as ferment :: FFIConversionFrom < dpp :: block :: epoch :: EpochIndex >> :: ffi_from (ffi_ref . index) , key : < crate :: fermented :: generics :: Arr_u8_2 as ferment :: FFIConversionFrom < [u8 ; 2] >> :: ffi_from (ffi_ref . key) } } } impl ferment :: FFIConversionTo < dpp :: block :: epoch :: Epoch > for dpp_block_epoch_Epoch { unsafe fn ffi_to_const (obj : dpp :: block :: epoch :: Epoch) -> * const dpp_block_epoch_Epoch { ferment :: boxed (dpp_block_epoch_Epoch { index : < crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex as ferment :: FFIConversionTo < dpp :: block :: epoch :: EpochIndex >> :: ffi_to (obj . index) , key : < crate :: fermented :: generics :: Arr_u8_2 as ferment :: FFIConversionTo < [u8 ; 2] >> :: ffi_to (obj . key) }) } } impl Drop for dpp_block_epoch_Epoch { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment :: unbox_any (ffi_ref . index) ; ferment :: unbox_any (ffi_ref . key) ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_block_epoch_Epoch_ctor < > (index : * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex , key : * mut crate :: fermented :: generics :: Arr_u8_2) -> * mut dpp_block_epoch_Epoch { ferment :: boxed (dpp_block_epoch_Epoch { index , key }) } # [no_mangle] pub unsafe extern "C" fn dpp_block_epoch_Epoch_destroy < > (ffi : * mut dpp_block_epoch_Epoch) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_block_epoch_Epoch_get_index < > (obj : * const dpp_block_epoch_Epoch) -> * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex { (* obj) . index } # [no_mangle] pub unsafe extern "C" fn dpp_block_epoch_Epoch_get_key < > (obj : * const dpp_block_epoch_Epoch) -> * mut crate :: fermented :: generics :: Arr_u8_2 { (* obj) . key } # [no_mangle] pub unsafe extern "C" fn dpp_block_epoch_Epoch_set_index < > (obj : * const dpp_block_epoch_Epoch) -> * mut crate :: fermented :: types :: dpp :: block :: epoch :: dpp_block_epoch_EpochIndex { (* obj) . index } # [no_mangle] pub unsafe extern "C" fn dpp_block_epoch_Epoch_set_key < > (obj : * const dpp_block_epoch_Epoch) -> * mut crate :: fermented :: generics :: Arr_u8_2 { (* obj) . key } # [doc = "FFI-representation of the [`EpochIndex`]"] # [repr (C)] # [derive (Clone)] pub struct dpp_block_epoch_EpochIndex (u16) ; impl ferment :: FFIConversionFrom < dpp :: block :: epoch :: EpochIndex > for dpp_block_epoch_EpochIndex { unsafe fn ffi_from_const (ffi : * const dpp_block_epoch_EpochIndex) -> dpp :: block :: epoch :: EpochIndex { let ffi_ref = & * ffi ; ffi_ref . 0 } } impl ferment :: FFIConversionTo < dpp :: block :: epoch :: EpochIndex > for dpp_block_epoch_EpochIndex { unsafe fn ffi_to_const (obj : dpp :: block :: epoch :: EpochIndex) -> * const dpp_block_epoch_EpochIndex { ferment :: boxed (dpp_block_epoch_EpochIndex (obj)) } } impl Drop for dpp_block_epoch_EpochIndex { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; } } } # [no_mangle] pub unsafe extern "C" fn dpp_block_epoch_EpochIndex_ctor < > (o_0 : u16) -> * mut dpp_block_epoch_EpochIndex { ferment :: boxed (dpp_block_epoch_EpochIndex (o_0)) } # [no_mangle] pub unsafe extern "C" fn dpp_block_epoch_EpochIndex_destroy < > (ffi : * mut dpp_block_epoch_EpochIndex) { ferment :: unbox_any (ffi) ; } # [no_mangle] pub unsafe extern "C" fn dpp_block_epoch_EpochIndex_get_0 < > (obj : * const dpp_block_epoch_EpochIndex) -> u16 { (* obj) . 0 } # [no_mangle] pub unsafe extern "C" fn dpp_block_epoch_EpochIndex_set_0 < > (obj : * const dpp_block_epoch_EpochIndex) -> u16 { (* obj) . 0 } } } pub mod fee { use crate as dash_spv_apple_bindings ; pub mod default_costs { use crate as dash_spv_apple_bindings ; } pub mod epoch { use crate as dash_spv_apple_bindings ; # [cfg (feature = "fee-distribution")] pub mod distribution { use crate as dash_spv_apple_bindings ; # [cfg (test)] pub mod tests { use crate as dash_spv_apple_bindings ; } } } # [cfg (feature = "fee-distribution")] pub mod fee_result { use crate as dash_spv_apple_bindings ; pub mod refunds { use crate as dash_spv_apple_bindings ; # [cfg (test)] pub mod tests { use crate as dash_spv_apple_bindings ; } } } } } pub mod dash_spv_apple_bindings { use crate as dash_spv_apple_bindings ; # [cfg (test)] pub mod tests { use crate as dash_spv_apple_bindings ; pub mod listdiff { use crate as dash_spv_apple_bindings ; } } pub mod address { use crate as dash_spv_apple_bindings ; pub mod addresses { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_apple_bindings::address::addresses::address_with_script_sig`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_apple_bindings_address_addresses_address_with_script_sig (script : * mut crate :: fermented :: generics :: Vec_u8 , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_apple_bindings :: address :: addresses :: address_with_script_sig (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (script) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_apple_bindings::address::addresses::address_with_script_pubkey`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_apple_bindings_address_addresses_address_with_script_pubkey (script : * mut crate :: fermented :: generics :: Vec_u8 , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_apple_bindings :: address :: addresses :: address_with_script_pubkey (< crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (script) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_apple_bindings::address::addresses::address_from_hash160`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_apple_bindings_address_addresses_address_from_hash160 (hash : * mut crate :: fermented :: generics :: Arr_u8_20 , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut std :: os :: raw :: c_char { let obj = dash_spv_apple_bindings :: address :: addresses :: address_from_hash160 (< crate :: fermented :: generics :: Arr_u8_20 as ferment :: FFIConversionFrom < [u8 ; 20] >> :: ffi_from (hash) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_apple_bindings::address::addresses::script_pubkey_for_address`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_apple_bindings_address_addresses_script_pubkey_for_address (address : * mut std :: os :: raw :: c_char , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> * mut crate :: fermented :: generics :: Vec_u8 { let obj = dash_spv_apple_bindings :: address :: addresses :: script_pubkey_for_address (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (address) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to_opt (obj) } # [doc = "FFI-representation of the [`dash_spv_apple_bindings::address::addresses::is_valid_dash_address_for_chain`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_apple_bindings_address_addresses_is_valid_dash_address_for_chain (address : * mut std :: os :: raw :: c_char , chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType) -> bool { let obj = dash_spv_apple_bindings :: address :: addresses :: is_valid_dash_address_for_chain (< std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from_opt (address) , < crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type)) ; obj } } } pub mod custom { use crate as dash_spv_apple_bindings ; } # [doc = "FFI-representation of the [`dash_spv_apple_bindings::DashSPVCore::with_callbacks`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_apple_bindings_DashSPVCore_with_callbacks (chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType , address_list : * mut crate :: fermented :: generics :: Vec_ , get_data_contract : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_platform_value_types_identifier_Identifier_RTRN_Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError , get_platform_activation_height : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_RTRN_Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError , callback_signer : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_Vec_u8_RTRN_Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError , callback_can_sign : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_RTRN_bool , get_block_height_by_hash : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32 , get_block_hash_by_height : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32 , get_cl_signature_by_block_hash : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError , update_address_usage_of_masternodes : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN_ , issue_with_masternode_list_from_peer : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN_ , notify_sync_state : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN_ , context : * const std :: os :: raw :: c_void) -> * mut dash_spv_apple_bindings :: DashSPVCore { let obj = dash_spv_apple_bindings :: DashSPVCore :: with_callbacks (< crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type) , < crate :: fermented :: generics :: Vec_ as ferment :: FFIConversionFrom < Vec < & 'static str > >> :: ffi_from_opt (address_list) , move | o_0 , o_1 | unsafe { get_data_contract . call (o_0 , o_1) } , move | o_0 | unsafe { get_platform_activation_height . call (o_0) } , move | o_0 , o_1 , o_2 | unsafe { callback_signer . call (o_0 , o_1 , o_2) } , move | o_0 , o_1 | unsafe { callback_can_sign . call (o_0 , o_1) } , move | o_0 , o_1 | unsafe { get_block_height_by_hash . call (o_0 , o_1) } , move | o_0 , o_1 | unsafe { get_block_hash_by_height . call (o_0 , o_1) } , move | o_0 , o_1 | unsafe { get_cl_signature_by_block_hash . call (o_0 , o_1) } , move | o_0 , o_1 | unsafe { update_address_usage_of_masternodes . call (o_0 , o_1) } , move | o_0 , o_1 , o_2 | unsafe { issue_with_masternode_list_from_peer . call (o_0 , o_1 , o_2) } , move | o_0 , o_1 | unsafe { notify_sync_state . call (o_0 , o_1) } , context) ; ferment :: boxed (obj) } # [doc = "FFI-representation of the [`dash_spv_apple_bindings::DashSPVCore::platform_cache`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_apple_bindings_DashSPVCore_platform_cache (self_ : * mut dash_spv_apple_bindings :: DashSPVCore) -> * mut crate :: fermented :: generics :: std_sync_Arc_dash_spv_platform_cache_PlatformCache { let obj = dash_spv_apple_bindings :: DashSPVCore :: platform_cache (& * self_) ; < crate :: fermented :: generics :: std_sync_Arc_dash_spv_platform_cache_PlatformCache as ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_platform :: cache :: PlatformCache > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_apple_bindings::DashSPVCore::processor`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_apple_bindings_DashSPVCore_processor (self_ : * mut dash_spv_apple_bindings :: DashSPVCore) -> * mut crate :: fermented :: generics :: std_sync_Arc_dash_spv_masternode_processor_processing_processor_MasternodeProcessor { let obj = dash_spv_apple_bindings :: DashSPVCore :: processor (& * self_) ; < crate :: fermented :: generics :: std_sync_Arc_dash_spv_masternode_processor_processing_processor_MasternodeProcessor as ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor > >> :: ffi_to (obj) } # [doc = "FFI-representation of the [`dash_spv_apple_bindings::DashSPVCore::platform`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_apple_bindings_DashSPVCore_platform (self_ : * mut dash_spv_apple_bindings :: DashSPVCore) -> * mut crate :: fermented :: generics :: std_sync_Arc_dash_spv_platform_PlatformSDK { let obj = dash_spv_apple_bindings :: DashSPVCore :: platform (& * self_) ; < crate :: fermented :: generics :: std_sync_Arc_dash_spv_platform_PlatformSDK as ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_platform :: PlatformSDK > >> :: ffi_to (obj) } pub mod ffi_core_provider { use crate as dash_spv_apple_bindings ; # [doc = "FFI-representation of the [`dash_spv_apple_bindings::ffi_core_provider::FFICoreProvider::new`]"] # [no_mangle] pub unsafe extern "C" fn dash_spv_apple_bindings_ffi_core_provider_FFICoreProvider_new (chain_type : * mut crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType , get_block_height_by_hash : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32 , get_block_hash_by_height : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32 , get_cl_signature_by_block_hash : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError , update_address_usage_of_masternodes : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN_ , issue_with_masternode_list_from_peer : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN_ , notify_sync_state : crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN_ , context : * const std :: os :: raw :: c_void) -> * mut dash_spv_apple_bindings :: ffi_core_provider :: FFICoreProvider { let obj = dash_spv_apple_bindings :: ffi_core_provider :: FFICoreProvider :: new (< crate :: fermented :: types :: dash_spv_crypto :: network :: chain_type :: dash_spv_crypto_network_chain_type_ChainType as ferment :: FFIConversionFrom < dash_spv_crypto :: network :: chain_type :: ChainType >> :: ffi_from (chain_type) , move | o_0 , o_1 | unsafe { get_block_height_by_hash . call (o_0 , o_1) } , move | o_0 , o_1 | unsafe { get_block_hash_by_height . call (o_0 , o_1) } , move | o_0 , o_1 | unsafe { get_cl_signature_by_block_hash . call (o_0 , o_1) } , move | o_0 , o_1 | unsafe { update_address_usage_of_masternodes . call (o_0 , o_1) } , move | o_0 , o_1 , o_2 | unsafe { issue_with_masternode_list_from_peer . call (o_0 , o_1 , o_2) } , move | o_0 , o_1 | unsafe { notify_sync_state . call (o_0 , o_1) } , context) ; ferment :: boxed (obj) } } } } # [allow (clippy :: let_and_return , clippy :: suspicious_else_formatting , clippy :: redundant_field_names , dead_code , non_camel_case_types , non_snake_case , non_upper_case_globals , redundant_semicolons , unreachable_patterns , unused_braces , unused_imports , unused_parens , unused_qualifications , unused_unsafe , unused_variables)] pub mod generics { use crate as dash_spv_apple_bindings ; # [repr (C)] # [derive (Clone)] pub struct Vec_String { pub count : usize , pub values : * mut * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < Vec < String > > for Vec_String { unsafe fn ffi_from_const (ffi : * const Vec_String) -> Vec < String > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < String > > for Vec_String { unsafe fn ffi_to_const (obj : Vec < String >) -> * const Vec_String { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_String { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr_composer (self . values , self . count , ferment :: unbox_string) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_String_ctor (count : usize , values : * mut * mut std :: os :: raw :: c_char) -> * mut Vec_String { ferment :: boxed (Vec_String { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_String_destroy (ffi : * mut Vec_String) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_Vec_u8_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { pub ok : * mut crate :: fermented :: generics :: Vec_u8 , pub error : * mut crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: processor :: processing_error :: dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError } impl ferment :: FFIConversionFrom < Result < Vec < u8 > , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError > > for Result_ok_Vec_u8_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { unsafe fn ffi_from_const (ffi : * const Result_ok_Vec_u8_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError) -> Result < Vec < u8 > , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: processor :: processing_error :: dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError as ferment :: FFIConversionFrom < dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError > > for Result_ok_Vec_u8_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { unsafe fn ffi_to_const (obj : Result < Vec < u8 > , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError >) -> * const Result_ok_Vec_u8_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_Vec_u8_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_Vec_u8_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_ctor (ok : * mut crate :: fermented :: generics :: Vec_u8 , error : * mut crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: processor :: processing_error :: dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError) -> * mut Result_ok_Vec_u8_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed (Result_ok_Vec_u8_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_Vec_u8_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_destroy (ffi : * mut Result_ok_Vec_u8_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_Tuple_platform_value_types_identifier_Identifier_u8 { pub count : usize , pub values : * mut * mut crate :: fermented :: generics :: Tuple_platform_value_types_identifier_Identifier_u8 } impl ferment :: FFIConversionFrom < Vec < (platform_value :: types :: identifier :: Identifier , u8) > > for Vec_Tuple_platform_value_types_identifier_Identifier_u8 { unsafe fn ffi_from_const (ffi : * const Vec_Tuple_platform_value_types_identifier_Identifier_u8) -> Vec < (platform_value :: types :: identifier :: Identifier , u8) > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < (platform_value :: types :: identifier :: Identifier , u8) > > for Vec_Tuple_platform_value_types_identifier_Identifier_u8 { unsafe fn ffi_to_const (obj : Vec < (platform_value :: types :: identifier :: Identifier , u8) >) -> * const Vec_Tuple_platform_value_types_identifier_Identifier_u8 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_Tuple_platform_value_types_identifier_Identifier_u8 { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_Tuple_platform_value_types_identifier_Identifier_u8_ctor (count : usize , values : * mut * mut crate :: fermented :: generics :: Tuple_platform_value_types_identifier_Identifier_u8) -> * mut Vec_Tuple_platform_value_types_identifier_Identifier_u8 { ferment :: boxed (Vec_Tuple_platform_value_types_identifier_Identifier_u8 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_Tuple_platform_value_types_identifier_Identifier_u8_destroy (ffi : * mut Vec_Tuple_platform_value_types_identifier_Identifier_u8) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_u8 { pub count : usize , pub values : * mut u8 } impl ferment :: FFIConversionFrom < Vec < u8 > > for Vec_u8 { unsafe fn ffi_from_const (ffi : * const Vec_u8) -> Vec < u8 > { let ffi_ref = & * ffi ; ferment :: from_primitive_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < u8 > > for Vec_u8 { unsafe fn ffi_to_const (obj : Vec < u8 >) -> * const Vec_u8 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_primitive_group (obj . into_iter ()) }) } } impl Drop for Vec_u8 { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_u8_ctor (count : usize , values : * mut u8) -> * mut Vec_u8 { ferment :: boxed (Vec_u8 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_u8_destroy (ffi : * mut Vec_u8) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty { pub count : usize , pub keys : * mut * mut std :: os :: raw :: c_char , pub values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: dpp_data_contract_document_type_property_DocumentProperty } impl ferment :: FFIConversionFrom < indexmap :: IndexMap < String , dpp :: data_contract :: document_type :: property :: DocumentProperty > > for indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty { unsafe fn ffi_from_const (ffi : * const indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty) -> indexmap :: IndexMap < String , dpp :: data_contract :: document_type :: property :: DocumentProperty > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: dpp_data_contract_document_type_property_DocumentProperty as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: property :: DocumentProperty >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < indexmap :: IndexMap < String , dpp :: data_contract :: document_type :: property :: DocumentProperty > > for indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty { unsafe fn ffi_to_const (obj : indexmap :: IndexMap < String , dpp :: data_contract :: document_type :: property :: DocumentProperty >) -> * const indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr_composer (self . keys , self . count , ferment :: unbox_string) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty_ctor (count : usize , keys : * mut * mut std :: os :: raw :: c_char , values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: dpp_data_contract_document_type_property_DocumentProperty) -> * mut indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty { ferment :: boxed (indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty_destroy (ffi : * mut indexmap_IndexMap_String_dpp_data_contract_document_type_property_DocumentProperty) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , u32) -> bool > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , u32) -> bool > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool_ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool_destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_bool_err_dash_spv_keychain_KeyChainError { pub ok : * mut bool , pub error : * mut crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainError } impl ferment :: FFIConversionFrom < Result < bool , dash_spv_keychain :: KeyChainError > > for Result_ok_bool_err_dash_spv_keychain_KeyChainError { unsafe fn ffi_from_const (ffi : * const Result_ok_bool_err_dash_spv_keychain_KeyChainError) -> Result < bool , dash_spv_keychain :: KeyChainError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | * o , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainError as ferment :: FFIConversionFrom < dash_spv_keychain :: KeyChainError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < bool , dash_spv_keychain :: KeyChainError > > for Result_ok_bool_err_dash_spv_keychain_KeyChainError { unsafe fn ffi_to_const (obj : Result < bool , dash_spv_keychain :: KeyChainError >) -> * const Result_ok_bool_err_dash_spv_keychain_KeyChainError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: boxed (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_bool_err_dash_spv_keychain_KeyChainError { fn drop (& mut self) { unsafe { ferment :: destroy_opt_primitive (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_bool_err_dash_spv_keychain_KeyChainError_ctor (ok : * mut bool , error : * mut crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainError) -> * mut Result_ok_bool_err_dash_spv_keychain_KeyChainError { ferment :: boxed (Result_ok_bool_err_dash_spv_keychain_KeyChainError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_bool_err_dash_spv_keychain_KeyChainError_destroy (ffi : * mut Result_ok_bool_err_dash_spv_keychain_KeyChainError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_BTreeSet_dpp_identity_identity_public_key_KeyID { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID } impl ferment :: FFIConversionFrom < std :: collections :: BTreeSet < dpp :: identity :: identity_public_key :: KeyID > > for std_collections_BTreeSet_dpp_identity_identity_public_key_KeyID { unsafe fn ffi_from_const (ffi : * const std_collections_BTreeSet_dpp_identity_identity_public_key_KeyID) -> std :: collections :: BTreeSet < dpp :: identity :: identity_public_key :: KeyID > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeSet < dpp :: identity :: identity_public_key :: KeyID > > for std_collections_BTreeSet_dpp_identity_identity_public_key_KeyID { unsafe fn ffi_to_const (obj : std :: collections :: BTreeSet < dpp :: identity :: identity_public_key :: KeyID >) -> * const std_collections_BTreeSet_dpp_identity_identity_public_key_KeyID { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for std_collections_BTreeSet_dpp_identity_identity_public_key_KeyID { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_BTreeSet_dpp_identity_identity_public_key_KeyID_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID) -> * mut std_collections_BTreeSet_dpp_identity_identity_public_key_KeyID { ferment :: boxed (std_collections_BTreeSet_dpp_identity_identity_public_key_KeyID { count , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_BTreeSet_dpp_identity_identity_public_key_KeyID_destroy (ffi : * mut std_collections_BTreeSet_dpp_identity_identity_public_key_KeyID) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , bool , bool , bool , i32 , & dash_spv_coinjoin :: wallet_ex :: WalletEx) -> Vec < dash_spv_coinjoin :: coin_selection :: compact_tally_item :: CompactTallyItem > > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , bool , bool , bool , i32 , & dash_spv_coinjoin :: wallet_ex :: WalletEx) -> Vec < dash_spv_coinjoin :: coin_selection :: compact_tally_item :: CompactTallyItem > > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 , o_2 , o_3 , o_4 , o_5 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1 , o_2 , o_3 , o_4 , o_5) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem_ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem_destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { pub obj : * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity } impl ferment :: FFIConversionFrom < std :: sync :: RwLock < std :: collections :: BTreeMap < String , std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > > > > for std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { unsafe fn ffi_from_const (ffi : * const std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity) -> std :: sync :: RwLock < std :: collections :: BTreeMap < String , std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > > > { let ffi_ref = & * ffi ; std :: sync :: RwLock :: new (ferment :: FFIConversionFrom :: ffi_from (ffi_ref . obj)) } } impl ferment :: FFIConversionTo < std :: sync :: RwLock < std :: collections :: BTreeMap < String , std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > > > > for std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { unsafe fn ffi_to_const (obj : std :: sync :: RwLock < std :: collections :: BTreeMap < String , std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > > >) -> * const std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { ferment :: boxed (Self { obj : ferment :: FFIConversionTo :: ffi_to (obj . into_inner () . expect ("Err")) }) } } impl Drop for std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . obj) ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_ctor (obj : * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity) -> * mut std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { ferment :: boxed (std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_destroy (ffi : * mut std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_u32_values_u8_arr_32 { pub count : usize , pub keys : * mut u32 , pub values : * mut * mut crate :: fermented :: generics :: Arr_u8_32 } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < u32 , [u8 ; 32] > > for std_collections_Map_keys_u32_values_u8_arr_32 { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_u32_values_u8_arr_32) -> std :: collections :: BTreeMap < u32 , [u8 ; 32] > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | o , | o | < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < u32 , [u8 ; 32] > > for std_collections_Map_keys_u32_values_u8_arr_32 { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < u32 , [u8 ; 32] >) -> * const std_collections_Map_keys_u32_values_u8_arr_32 { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_primitive_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_u32_values_u8_arr_32 { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_u32_values_u8_arr_32_ctor (count : usize , keys : * mut u32 , values : * mut * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut std_collections_Map_keys_u32_values_u8_arr_32 { ferment :: boxed (std_collections_Map_keys_u32_values_u8_arr_32 { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_u32_values_u8_arr_32_destroy (ffi : * mut std_collections_Map_keys_u32_values_u8_arr_32) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { pub count : usize , pub keys : * mut * mut crate :: fermented :: generics :: Arr_u8_20 , pub values : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > > for std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity) -> std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: generics :: Arr_u8_20 as ferment :: FFIConversionFrom < [u8 ; 20] >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity as ferment :: FFIConversionFrom < dpp :: identity :: identity :: Identity >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > > for std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity >) -> * const std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_ctor (count : usize , keys : * mut * mut crate :: fermented :: generics :: Arr_u8_20 , values : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity) -> * mut std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { ferment :: boxed (std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_destroy (ffi : * mut std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_dashcore_sml_llmq_type_LLMQType_values_std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType , pub values : * mut * mut crate :: fermented :: generics :: std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dashcore :: sml :: llmq_type :: LLMQType , std :: collections :: BTreeMap < dashcore :: hash_types :: QuorumHash , dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: QualifiedQuorumEntry > > > for std_collections_Map_keys_dashcore_sml_llmq_type_LLMQType_values_std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_dashcore_sml_llmq_type_LLMQType_values_std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry) -> std :: collections :: BTreeMap < dashcore :: sml :: llmq_type :: LLMQType , std :: collections :: BTreeMap < dashcore :: hash_types :: QuorumHash , dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: QualifiedQuorumEntry > > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType as ferment :: FFIConversionFrom < dashcore :: sml :: llmq_type :: LLMQType >> :: ffi_from (o) , | o | < crate :: fermented :: generics :: std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dashcore :: hash_types :: QuorumHash , dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: QualifiedQuorumEntry > >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < dashcore :: sml :: llmq_type :: LLMQType , std :: collections :: BTreeMap < dashcore :: hash_types :: QuorumHash , dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: QualifiedQuorumEntry > > > for std_collections_Map_keys_dashcore_sml_llmq_type_LLMQType_values_std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < dashcore :: sml :: llmq_type :: LLMQType , std :: collections :: BTreeMap < dashcore :: hash_types :: QuorumHash , dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: QualifiedQuorumEntry > >) -> * const std_collections_Map_keys_dashcore_sml_llmq_type_LLMQType_values_std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_dashcore_sml_llmq_type_LLMQType_values_std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dashcore_sml_llmq_type_LLMQType_values_std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry_ctor (count : usize , keys : * mut * mut crate :: fermented :: types :: dashcore :: sml :: llmq_type :: dashcore_sml_llmq_type_LLMQType , values : * mut * mut crate :: fermented :: generics :: std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry) -> * mut std_collections_Map_keys_dashcore_sml_llmq_type_LLMQType_values_std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { ferment :: boxed (std_collections_Map_keys_dashcore_sml_llmq_type_LLMQType_values_std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dashcore_sml_llmq_type_LLMQType_values_std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry_destroy (ffi : * mut std_collections_Map_keys_dashcore_sml_llmq_type_LLMQType_values_std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { pub ok : * mut crate :: fermented :: generics :: std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity , pub error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error } impl ferment :: FFIConversionFrom < Result < std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error > > for Result_ok_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { unsafe fn ffi_from_const (ffi : * const Result_ok_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error) -> Result < std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: generics :: std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error as ferment :: FFIConversionFrom < dash_spv_platform :: error :: Error >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error > > for Result_ok_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { unsafe fn ffi_to_const (obj : Result < std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error >) -> * const Result_ok_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error_ctor (ok : * mut crate :: fermented :: generics :: std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity , error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error) -> * mut Result_ok_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { ferment :: boxed (Result_ok_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error_destroy (ffi : * mut Result_ok_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , [u8 ; 32]) -> Result < dashcore :: bls_sig_utils :: BLSSignature , dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError > > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , [u8 ; 32]) -> Result < dashcore :: bls_sig_utils :: BLSSignature , dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError > > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError_ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError_destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { pub obj : * mut crate :: fermented :: generics :: std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser } impl ferment :: FFIConversionFrom < std :: sync :: Arc < std :: sync :: RwLock < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dash_spv_platform :: models :: transient_dashpay_user :: TransientDashPayUser > > > > for std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> std :: sync :: Arc < std :: sync :: RwLock < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dash_spv_platform :: models :: transient_dashpay_user :: TransientDashPayUser > > > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (ferment :: FFIConversionFrom :: ffi_from (ffi_ref . obj)) } } impl ferment :: FFIConversionTo < std :: sync :: Arc < std :: sync :: RwLock < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dash_spv_platform :: models :: transient_dashpay_user :: TransientDashPayUser > > > > for std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { unsafe fn ffi_to_const (obj : std :: sync :: Arc < std :: sync :: RwLock < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dash_spv_platform :: models :: transient_dashpay_user :: TransientDashPayUser > > >) -> * const std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { ferment :: boxed (Self { obj : ferment :: FFIConversionTo :: ffi_to (std :: sync :: RwLock :: new (obj . read () . expect ("Poisoned") . clone ())) }) } } impl Drop for std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . obj) ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_ctor (obj : * mut crate :: fermented :: generics :: std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { ferment :: boxed (std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_destroy (ffi : * mut std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_dashcore_prelude_CoreBlockHeight_values_dashcore_sml_masternode_list_MasternodeList { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: dashcore :: prelude :: dashcore_prelude_CoreBlockHeight , pub values : * mut * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list :: dashcore_sml_masternode_list_MasternodeList } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dashcore :: prelude :: CoreBlockHeight , dashcore :: sml :: masternode_list :: MasternodeList > > for std_collections_Map_keys_dashcore_prelude_CoreBlockHeight_values_dashcore_sml_masternode_list_MasternodeList { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_dashcore_prelude_CoreBlockHeight_values_dashcore_sml_masternode_list_MasternodeList) -> std :: collections :: BTreeMap < dashcore :: prelude :: CoreBlockHeight , dashcore :: sml :: masternode_list :: MasternodeList > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: types :: dashcore :: prelude :: dashcore_prelude_CoreBlockHeight as ferment :: FFIConversionFrom < dashcore :: prelude :: CoreBlockHeight >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dashcore :: sml :: masternode_list :: dashcore_sml_masternode_list_MasternodeList as ferment :: FFIConversionFrom < dashcore :: sml :: masternode_list :: MasternodeList >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < dashcore :: prelude :: CoreBlockHeight , dashcore :: sml :: masternode_list :: MasternodeList > > for std_collections_Map_keys_dashcore_prelude_CoreBlockHeight_values_dashcore_sml_masternode_list_MasternodeList { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < dashcore :: prelude :: CoreBlockHeight , dashcore :: sml :: masternode_list :: MasternodeList >) -> * const std_collections_Map_keys_dashcore_prelude_CoreBlockHeight_values_dashcore_sml_masternode_list_MasternodeList { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_dashcore_prelude_CoreBlockHeight_values_dashcore_sml_masternode_list_MasternodeList { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dashcore_prelude_CoreBlockHeight_values_dashcore_sml_masternode_list_MasternodeList_ctor (count : usize , keys : * mut * mut crate :: fermented :: types :: dashcore :: prelude :: dashcore_prelude_CoreBlockHeight , values : * mut * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list :: dashcore_sml_masternode_list_MasternodeList) -> * mut std_collections_Map_keys_dashcore_prelude_CoreBlockHeight_values_dashcore_sml_masternode_list_MasternodeList { ferment :: boxed (std_collections_Map_keys_dashcore_prelude_CoreBlockHeight_values_dashcore_sml_masternode_list_MasternodeList { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dashcore_prelude_CoreBlockHeight_values_dashcore_sml_masternode_list_MasternodeList_destroy (ffi : * mut std_collections_Map_keys_dashcore_prelude_CoreBlockHeight_values_dashcore_sml_masternode_list_MasternodeList) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_u8_20 { pub count : usize , pub values : * mut * mut crate :: fermented :: generics :: Arr_u8_20 } impl ferment :: FFIConversionFrom < Vec < [u8 ; 20] > > for Vec_u8_20 { unsafe fn ffi_from_const (ffi : * const Vec_u8_20) -> Vec < [u8 ; 20] > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < [u8 ; 20] > > for Vec_u8_20 { unsafe fn ffi_to_const (obj : Vec < [u8 ; 20] >) -> * const Vec_u8_20 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_u8_20 { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_u8_20_ctor (count : usize , values : * mut * mut crate :: fermented :: generics :: Arr_u8_20) -> * mut Vec_u8_20 { ferment :: boxed (Vec_u8_20 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_u8_20_destroy (ffi : * mut Vec_u8_20) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error { pub ok : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document , pub error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error } impl ferment :: FFIConversionFrom < Result < Option < dpp :: document :: Document > , dash_spv_platform :: error :: Error > > for Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error { unsafe fn ffi_from_const (ffi : * const Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error) -> Result < Option < dpp :: document :: Document > , dash_spv_platform :: error :: Error > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionFrom < dpp :: document :: Document >> :: ffi_from_opt (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error as ferment :: FFIConversionFrom < dash_spv_platform :: error :: Error >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < Option < dpp :: document :: Document > , dash_spv_platform :: error :: Error > > for Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error { unsafe fn ffi_to_const (obj : Result < Option < dpp :: document :: Document > , dash_spv_platform :: error :: Error >) -> * const Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to_opt (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error_ctor (ok : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document , error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error) -> * mut Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error { ferment :: boxed (Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error_destroy (ffi : * mut Result_ok_Option_dpp_document_Document_err_dash_spv_platform_error_Error) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32 { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , u64) -> u32 , destructor : unsafe extern "C" fn (u32) } impl Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32 { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : u64) -> u32 { let ffi_result = (self . caller) (o_0 , o_1) ; ffi_result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32 { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32 { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , u64) -> u32 , destructor : unsafe extern "C" fn (u32)) -> * mut Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32 { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32 { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Tuple_String_Arr_u8_32 { pub o_0 : * mut std :: os :: raw :: c_char , pub o_1 : * mut crate :: fermented :: generics :: Arr_u8_32 } impl ferment :: FFIConversionFrom < (String , [u8 ; 32]) > for Tuple_String_Arr_u8_32 { unsafe fn ffi_from_const (ffi : * const Tuple_String_Arr_u8_32) -> (String , [u8 ; 32]) { let ffi_ref = & * ffi ; (ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_0) , ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_1)) } } impl ferment :: FFIConversionTo < (String , [u8 ; 32]) > for Tuple_String_Arr_u8_32 { unsafe fn ffi_to_const (obj : (String , [u8 ; 32])) -> * const Tuple_String_Arr_u8_32 { ferment :: boxed (Self { o_0 : ferment :: FFIConversionTo :: ffi_to (obj . 0) , o_1 : ferment :: FFIConversionTo :: ffi_to (obj . 1) }) } } impl Drop for Tuple_String_Arr_u8_32 { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . o_0) ; ferment :: unbox_any (self . o_1) ; } } } # [no_mangle] pub unsafe extern "C" fn Tuple_String_Arr_u8_32_ctor (o_0 : * mut std :: os :: raw :: c_char , o_1 : * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut Tuple_String_Arr_u8_32 { ferment :: boxed (Tuple_String_Arr_u8_32 { o_0 , o_1 }) } # [no_mangle] pub unsafe extern "C" fn Tuple_String_Arr_u8_32_destroy (ffi : * mut Tuple_String_Arr_u8_32) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_Option_u64_err_dash_spv_platform_error_Error { pub ok : * mut u64 , pub error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error } impl ferment :: FFIConversionFrom < Result < Option < u64 > , dash_spv_platform :: error :: Error > > for Result_ok_Option_u64_err_dash_spv_platform_error_Error { unsafe fn ffi_from_const (ffi : * const Result_ok_Option_u64_err_dash_spv_platform_error_Error) -> Result < Option < u64 > , dash_spv_platform :: error :: Error > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | ferment :: from_opt_primitive (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error as ferment :: FFIConversionFrom < dash_spv_platform :: error :: Error >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < Option < u64 > , dash_spv_platform :: error :: Error > > for Result_ok_Option_u64_err_dash_spv_platform_error_Error { unsafe fn ffi_to_const (obj : Result < Option < u64 > , dash_spv_platform :: error :: Error >) -> * const Result_ok_Option_u64_err_dash_spv_platform_error_Error { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: to_opt_primitive (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_Option_u64_err_dash_spv_platform_error_Error { fn drop (& mut self) { unsafe { ferment :: destroy_opt_primitive (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_Option_u64_err_dash_spv_platform_error_Error_ctor (ok : * mut u64 , error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error) -> * mut Result_ok_Option_u64_err_dash_spv_platform_error_Error { ferment :: boxed (Result_ok_Option_u64_err_dash_spv_platform_error_Error { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_Option_u64_err_dash_spv_platform_error_Error_destroy (ffi : * mut Result_ok_Option_u64_err_dash_spv_platform_error_Error) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_BTreeSet_String { pub count : usize , pub values : * mut * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < std :: collections :: BTreeSet < String > > for std_collections_BTreeSet_String { unsafe fn ffi_from_const (ffi : * const std_collections_BTreeSet_String) -> std :: collections :: BTreeSet < String > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeSet < String > > for std_collections_BTreeSet_String { unsafe fn ffi_to_const (obj : std :: collections :: BTreeSet < String >) -> * const std_collections_BTreeSet_String { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for std_collections_BTreeSet_String { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr_composer (self . values , self . count , ferment :: unbox_string) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_BTreeSet_String_ctor (count : usize , values : * mut * mut std :: os :: raw :: c_char) -> * mut std_collections_BTreeSet_String { ferment :: boxed (std_collections_BTreeSet_String { count , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_BTreeSet_String_destroy (ffi : * mut std_collections_BTreeSet_String) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64 { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: generics :: Arr_u8_32 , u32) -> i64 , destructor : unsafe extern "C" fn (i64) } impl Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64 { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : [u8 ; 32] , o_2 : u32) -> i64 { let ffi_result = (self . caller) (o_0 , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (o_1) , o_2) ; ffi_result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64 { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64 { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: generics :: Arr_u8_32 , u32) -> i64 , destructor : unsafe extern "C" fn (i64)) -> * mut Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64 { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64 { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_u8_arr_32_values_bool { pub count : usize , pub keys : * mut * mut crate :: fermented :: generics :: Arr_u8_32 , pub values : * mut bool } impl ferment :: FFIConversionFrom < std :: collections :: HashMap < [u8 ; 32] , bool > > for std_collections_Map_keys_u8_arr_32_values_bool { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_u8_arr_32_values_bool) -> std :: collections :: HashMap < [u8 ; 32] , bool > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (o) , | o | o) } } impl ferment :: FFIConversionTo < std :: collections :: HashMap < [u8 ; 32] , bool > > for std_collections_Map_keys_u8_arr_32_values_bool { unsafe fn ffi_to_const (obj : std :: collections :: HashMap < [u8 ; 32] , bool >) -> * const std_collections_Map_keys_u8_arr_32_values_bool { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_primitive_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_u8_arr_32_values_bool { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_u8_arr_32_values_bool_ctor (count : usize , keys : * mut * mut crate :: fermented :: generics :: Arr_u8_32 , values : * mut bool) -> * mut std_collections_Map_keys_u8_arr_32_values_bool { ferment :: boxed (std_collections_Map_keys_u8_arr_32_values_bool { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_u8_arr_32_values_bool_destroy (ffi : * mut std_collections_Map_keys_u8_arr_32_values_bool) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dpp_identity_identity_public_key_KeyID { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID } impl ferment :: FFIConversionFrom < Vec < dpp :: identity :: identity_public_key :: KeyID > > for Vec_dpp_identity_identity_public_key_KeyID { unsafe fn ffi_from_const (ffi : * const Vec_dpp_identity_identity_public_key_KeyID) -> Vec < dpp :: identity :: identity_public_key :: KeyID > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dpp :: identity :: identity_public_key :: KeyID > > for Vec_dpp_identity_identity_public_key_KeyID { unsafe fn ffi_to_const (obj : Vec < dpp :: identity :: identity_public_key :: KeyID >) -> * const Vec_dpp_identity_identity_public_key_KeyID { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dpp_identity_identity_public_key_KeyID { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_identity_identity_public_key_KeyID_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID) -> * mut Vec_dpp_identity_identity_public_key_KeyID { ferment :: boxed (Vec_dpp_identity_identity_public_key_KeyID { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_identity_identity_public_key_KeyID_destroy (ffi : * mut Vec_dpp_identity_identity_public_key_KeyID) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Arr_u64_5 { pub count : usize , pub values : * mut u64 } impl ferment :: FFIConversionFrom < [u64 ; 5] > for Arr_u64_5 { unsafe fn ffi_from_const (ffi : * const Arr_u64_5) -> [u64 ; 5] { let ffi_ref = & * ffi ; let vec : Vec < u64 > = ferment :: from_primitive_group (ffi_ref . values , ffi_ref . count) ; vec . try_into () . unwrap () } } impl ferment :: FFIConversionTo < [u64 ; 5] > for Arr_u64_5 { unsafe fn ffi_to_const (obj : [u64 ; 5]) -> * const Arr_u64_5 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_primitive_group (obj . into_iter ()) }) } } impl Drop for Arr_u64_5 { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Arr_u64_5_ctor (count : usize , values : * mut u64) -> * mut Arr_u64_5 { ferment :: boxed (Arr_u64_5 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Arr_u64_5_destroy (ffi : * mut Arr_u64_5) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_RTRN_bool { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_RTRN_bool } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void) -> bool > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_RTRN_bool { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_RTRN_bool) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void) -> bool > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 | unsafe { (& * ffi_ref . obj) . call (o_0) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_RTRN_bool { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_RTRN_bool_ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_RTRN_bool) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_RTRN_bool { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_RTRN_bool { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_RTRN_bool_destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_RTRN_bool) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , dashcore :: blockdata :: transaction :: outpoint :: OutPoint) -> bool > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , dashcore :: blockdata :: transaction :: outpoint :: OutPoint) -> bool > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool_ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool_destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_dashcore_blockdata_transaction_Transaction_err_dash_spv_platform_error_Error { pub ok : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction , pub error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error } impl ferment :: FFIConversionFrom < Result < dashcore :: blockdata :: transaction :: Transaction , dash_spv_platform :: error :: Error > > for Result_ok_dashcore_blockdata_transaction_Transaction_err_dash_spv_platform_error_Error { unsafe fn ffi_from_const (ffi : * const Result_ok_dashcore_blockdata_transaction_Transaction_err_dash_spv_platform_error_Error) -> Result < dashcore :: blockdata :: transaction :: Transaction , dash_spv_platform :: error :: Error > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error as ferment :: FFIConversionFrom < dash_spv_platform :: error :: Error >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < dashcore :: blockdata :: transaction :: Transaction , dash_spv_platform :: error :: Error > > for Result_ok_dashcore_blockdata_transaction_Transaction_err_dash_spv_platform_error_Error { unsafe fn ffi_to_const (obj : Result < dashcore :: blockdata :: transaction :: Transaction , dash_spv_platform :: error :: Error >) -> * const Result_ok_dashcore_blockdata_transaction_Transaction_err_dash_spv_platform_error_Error { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_dashcore_blockdata_transaction_Transaction_err_dash_spv_platform_error_Error { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_dashcore_blockdata_transaction_Transaction_err_dash_spv_platform_error_Error_ctor (ok : * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction , error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error) -> * mut Result_ok_dashcore_blockdata_transaction_Transaction_err_dash_spv_platform_error_Error { ferment :: boxed (Result_ok_dashcore_blockdata_transaction_Transaction_err_dash_spv_platform_error_Error { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_dashcore_blockdata_transaction_Transaction_err_dash_spv_platform_error_Error_destroy (ffi : * mut Result_ok_dashcore_blockdata_transaction_Transaction_err_dash_spv_platform_error_Error) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dash_spv_platform_document_manager_DocumentsManager { pub obj : * mut dash_spv_platform :: document :: manager :: DocumentsManager } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dash_spv_platform :: document :: manager :: DocumentsManager > > for std_sync_Arc_dash_spv_platform_document_manager_DocumentsManager { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dash_spv_platform_document_manager_DocumentsManager) -> std :: sync :: Arc < dash_spv_platform :: document :: manager :: DocumentsManager > { let ffi_ref = & * ffi ; std :: sync :: Arc :: from_raw (ffi_ref . obj) } } impl ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_platform :: document :: manager :: DocumentsManager > > for std_sync_Arc_dash_spv_platform_document_manager_DocumentsManager { unsafe fn ffi_to_const (obj : std :: sync :: Arc < dash_spv_platform :: document :: manager :: DocumentsManager >) -> * const std_sync_Arc_dash_spv_platform_document_manager_DocumentsManager { ferment :: boxed (Self { obj : std :: sync :: Arc :: into_raw (obj) . cast_mut () }) } } impl Drop for std_sync_Arc_dash_spv_platform_document_manager_DocumentsManager { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . obj) ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_platform_document_manager_DocumentsManager_ctor (obj : * mut dash_spv_platform :: document :: manager :: DocumentsManager) -> * mut std_sync_Arc_dash_spv_platform_document_manager_DocumentsManager { ferment :: boxed (std_sync_Arc_dash_spv_platform_document_manager_DocumentsManager { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_platform_document_manager_DocumentsManager_destroy (ffi : * mut std_sync_Arc_dash_spv_platform_document_manager_DocumentsManager) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { pub ok : * mut crate :: fermented :: types :: dpp :: state_transition :: dpp_state_transition_StateTransition , pub error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error } impl ferment :: FFIConversionFrom < Result < dpp :: state_transition :: StateTransition , dash_spv_platform :: error :: Error > > for Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { unsafe fn ffi_from_const (ffi : * const Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error) -> Result < dpp :: state_transition :: StateTransition , dash_spv_platform :: error :: Error > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: types :: dpp :: state_transition :: dpp_state_transition_StateTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: StateTransition >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error as ferment :: FFIConversionFrom < dash_spv_platform :: error :: Error >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < dpp :: state_transition :: StateTransition , dash_spv_platform :: error :: Error > > for Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { unsafe fn ffi_to_const (obj : Result < dpp :: state_transition :: StateTransition , dash_spv_platform :: error :: Error >) -> * const Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error_ctor (ok : * mut crate :: fermented :: types :: dpp :: state_transition :: dpp_state_transition_StateTransition , error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error) -> * mut Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { ferment :: boxed (Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error_destroy (ffi : * mut Result_ok_dpp_state_transition_StateTransition_err_dash_spv_platform_error_Error) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation } impl ferment :: FFIConversionFrom < Vec < dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: IdentityPublicKeyInCreation > > for Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation { unsafe fn ffi_from_const (ffi : * const Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation) -> Vec < dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: IdentityPublicKeyInCreation > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: IdentityPublicKeyInCreation > > for Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation { unsafe fn ffi_to_const (obj : Vec < dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: IdentityPublicKeyInCreation >) -> * const Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: identity :: public_key_in_creation :: dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation) -> * mut Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation { ferment :: boxed (Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation_destroy (ffi : * mut Vec_dpp_state_transition_state_transitions_identity_public_key_in_creation_IdentityPublicKeyInCreation) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_RTRN_ { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void) } impl Fn_ARGS_std_os_raw_c_void_RTRN_ { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void) { let ffi_result = (self . caller) (o_0) ; ffi_result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_RTRN_ { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_RTRN_ { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_RTRN__ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void)) -> * mut Fn_ARGS_std_os_raw_c_void_RTRN_ { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_RTRN_ { caller }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_RTRN__destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_RTRN_) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_RTRN_bool { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void) -> bool , destructor : unsafe extern "C" fn (bool) } impl Fn_ARGS_std_os_raw_c_void_RTRN_bool { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void) -> bool { let ffi_result = (self . caller) (o_0) ; ffi_result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_RTRN_bool { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_RTRN_bool { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_RTRN_bool_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void) -> bool , destructor : unsafe extern "C" fn (bool)) -> * mut Fn_ARGS_std_os_raw_c_void_RTRN_bool { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_RTRN_bool { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_RTRN_bool_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_RTRN_bool) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dash_spv_platform_PlatformSDK { pub obj : * mut dash_spv_platform :: PlatformSDK } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dash_spv_platform :: PlatformSDK > > for std_sync_Arc_dash_spv_platform_PlatformSDK { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dash_spv_platform_PlatformSDK) -> std :: sync :: Arc < dash_spv_platform :: PlatformSDK > { let ffi_ref = & * ffi ; std :: sync :: Arc :: from_raw (ffi_ref . obj) } } impl ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_platform :: PlatformSDK > > for std_sync_Arc_dash_spv_platform_PlatformSDK { unsafe fn ffi_to_const (obj : std :: sync :: Arc < dash_spv_platform :: PlatformSDK >) -> * const std_sync_Arc_dash_spv_platform_PlatformSDK { ferment :: boxed (Self { obj : std :: sync :: Arc :: into_raw (obj) . cast_mut () }) } } impl Drop for std_sync_Arc_dash_spv_platform_PlatformSDK { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . obj) ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_platform_PlatformSDK_ctor (obj : * mut dash_spv_platform :: PlatformSDK) -> * mut std_sync_Arc_dash_spv_platform_PlatformSDK { ferment :: boxed (std_sync_Arc_dash_spv_platform_PlatformSDK { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_platform_PlatformSDK_destroy (ffi : * mut std_sync_Arc_dash_spv_platform_PlatformSDK) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dash_spv_crypto_keys_key_OpaqueKey { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey } impl ferment :: FFIConversionFrom < Vec < dash_spv_crypto :: keys :: key :: OpaqueKey > > for Vec_dash_spv_crypto_keys_key_OpaqueKey { unsafe fn ffi_from_const (ffi : * const Vec_dash_spv_crypto_keys_key_OpaqueKey) -> Vec < dash_spv_crypto :: keys :: key :: OpaqueKey > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dash_spv_crypto :: keys :: key :: OpaqueKey > > for Vec_dash_spv_crypto_keys_key_OpaqueKey { unsafe fn ffi_to_const (obj : Vec < dash_spv_crypto :: keys :: key :: OpaqueKey >) -> * const Vec_dash_spv_crypto_keys_key_OpaqueKey { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dash_spv_crypto_keys_key_OpaqueKey { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dash_spv_crypto_keys_key_OpaqueKey_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey) -> * mut Vec_dash_spv_crypto_keys_key_OpaqueKey { ferment :: boxed (Vec_dash_spv_crypto_keys_key_OpaqueKey { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dash_spv_crypto_keys_key_OpaqueKey_destroy (ffi : * mut Vec_dash_spv_crypto_keys_key_OpaqueKey) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { pub ok : * mut crate :: fermented :: generics :: Vec_u8 , pub error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError } impl ferment :: FFIConversionFrom < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > > for Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_from_const (ffi : * const Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError) -> Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: KeyError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError > > for Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_to_const (obj : Result < Vec < u8 > , dash_spv_crypto :: keys :: KeyError >) -> * const Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError_ctor (ok : * mut crate :: fermented :: generics :: Vec_u8 , error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError) -> * mut Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { ferment :: boxed (Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError_destroy (ffi : * mut Result_ok_Vec_u8_err_dash_spv_crypto_keys_KeyError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_u64 { pub count : usize , pub values : * mut u64 } impl ferment :: FFIConversionFrom < Vec < u64 > > for Vec_u64 { unsafe fn ffi_from_const (ffi : * const Vec_u64) -> Vec < u64 > { let ffi_ref = & * ffi ; ferment :: from_primitive_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < u64 > > for Vec_u64 { unsafe fn ffi_to_const (obj : Vec < u64 >) -> * const Vec_u64 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_primitive_group (obj . into_iter ()) }) } } impl Drop for Vec_u64 { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_u64_ctor (count : usize , values : * mut u64) -> * mut Vec_u64 { ferment :: boxed (Vec_u64 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_u64_destroy (ffi : * mut Vec_u64) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_HashSet_dashcore_blockdata_transaction_outpoint_OutPoint { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint } impl ferment :: FFIConversionFrom < std :: collections :: HashSet < dashcore :: blockdata :: transaction :: outpoint :: OutPoint > > for std_collections_HashSet_dashcore_blockdata_transaction_outpoint_OutPoint { unsafe fn ffi_from_const (ffi : * const std_collections_HashSet_dashcore_blockdata_transaction_outpoint_OutPoint) -> std :: collections :: HashSet < dashcore :: blockdata :: transaction :: outpoint :: OutPoint > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < std :: collections :: HashSet < dashcore :: blockdata :: transaction :: outpoint :: OutPoint > > for std_collections_HashSet_dashcore_blockdata_transaction_outpoint_OutPoint { unsafe fn ffi_to_const (obj : std :: collections :: HashSet < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >) -> * const std_collections_HashSet_dashcore_blockdata_transaction_outpoint_OutPoint { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for std_collections_HashSet_dashcore_blockdata_transaction_outpoint_OutPoint { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_HashSet_dashcore_blockdata_transaction_outpoint_OutPoint_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint) -> * mut std_collections_HashSet_dashcore_blockdata_transaction_outpoint_OutPoint { ferment :: boxed (std_collections_HashSet_dashcore_blockdata_transaction_outpoint_OutPoint { count , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_HashSet_dashcore_blockdata_transaction_outpoint_OutPoint_destroy (ffi : * mut std_collections_HashSet_dashcore_blockdata_transaction_outpoint_OutPoint) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError { pub ok : * mut dash_spv_crypto :: util :: sec_vec :: SecVec , pub error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError } impl ferment :: FFIConversionFrom < Result < dash_spv_crypto :: util :: sec_vec :: SecVec , dash_spv_crypto :: keys :: KeyError > > for Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_from_const (ffi : * const Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError) -> Result < dash_spv_crypto :: util :: sec_vec :: SecVec , dash_spv_crypto :: keys :: KeyError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | (& * o) . clone () , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: KeyError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < dash_spv_crypto :: util :: sec_vec :: SecVec , dash_spv_crypto :: keys :: KeyError > > for Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_to_const (obj : Result < dash_spv_crypto :: util :: sec_vec :: SecVec , dash_spv_crypto :: keys :: KeyError >) -> * const Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: boxed (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError_ctor (ok : * mut dash_spv_crypto :: util :: sec_vec :: SecVec , error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError) -> * mut Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError { ferment :: boxed (Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError_destroy (ffi : * mut Result_ok_dash_spv_crypto_util_sec_vec_SecVec_err_dash_spv_crypto_keys_KeyError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_bool_bool_Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus_RTRN_ { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , bool , bool , * mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus) } impl Fn_ARGS_std_os_raw_c_void_bool_bool_Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus_RTRN_ { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : bool , o_2 : bool , o_3 : Vec < dash_spv_coinjoin :: messages :: pool_status :: PoolStatus >) { let ffi_result = (self . caller) (o_0 , o_1 , o_2 , < crate :: fermented :: generics :: Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus as ferment :: FFIConversionTo < Vec < dash_spv_coinjoin :: messages :: pool_status :: PoolStatus > >> :: ffi_to (o_3)) ; ffi_result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_bool_bool_Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus_RTRN_ { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_bool_bool_Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus_RTRN_ { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_bool_bool_Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus_RTRN__ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , bool , bool , * mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus)) -> * mut Fn_ARGS_std_os_raw_c_void_bool_bool_Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus_RTRN_ { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_bool_bool_Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus_RTRN_ { caller }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_bool_bool_Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus_RTRN__destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_bool_bool_Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus_RTRN_) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Arr_u8_4 { pub count : usize , pub values : * mut u8 } impl ferment :: FFIConversionFrom < [u8 ; 4] > for Arr_u8_4 { unsafe fn ffi_from_const (ffi : * const Arr_u8_4) -> [u8 ; 4] { let ffi_ref = & * ffi ; let vec : Vec < u8 > = ferment :: from_primitive_group (ffi_ref . values , ffi_ref . count) ; vec . try_into () . unwrap () } } impl ferment :: FFIConversionTo < [u8 ; 4] > for Arr_u8_4 { unsafe fn ffi_to_const (obj : [u8 ; 4]) -> * const Arr_u8_4 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_primitive_group (obj . into_iter ()) }) } } impl Drop for Arr_u8_4 { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Arr_u8_4_ctor (count : usize , values : * mut u8) -> * mut Arr_u8_4 { ferment :: boxed (Arr_u8_4 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Arr_u8_4_destroy (ffi : * mut Arr_u8_4) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr) -> bool , destructor : unsafe extern "C" fn (bool) } impl Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : std :: net :: SocketAddr) -> bool { let ffi_result = (self . caller) (o_0 , < dash_spv_apple_bindings :: custom :: std :: SocketAddr as ferment :: FFIConversionTo < std :: net :: SocketAddr >> :: ffi_to (o_1)) ; ffi_result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr) -> bool , destructor : unsafe extern "C" fn (bool)) -> * mut Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dash_spv_platform_identity_manager_IdentitiesManager { pub obj : * mut dash_spv_platform :: identity :: manager :: IdentitiesManager } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dash_spv_platform :: identity :: manager :: IdentitiesManager > > for std_sync_Arc_dash_spv_platform_identity_manager_IdentitiesManager { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dash_spv_platform_identity_manager_IdentitiesManager) -> std :: sync :: Arc < dash_spv_platform :: identity :: manager :: IdentitiesManager > { let ffi_ref = & * ffi ; std :: sync :: Arc :: from_raw (ffi_ref . obj) } } impl ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_platform :: identity :: manager :: IdentitiesManager > > for std_sync_Arc_dash_spv_platform_identity_manager_IdentitiesManager { unsafe fn ffi_to_const (obj : std :: sync :: Arc < dash_spv_platform :: identity :: manager :: IdentitiesManager >) -> * const std_sync_Arc_dash_spv_platform_identity_manager_IdentitiesManager { ferment :: boxed (Self { obj : std :: sync :: Arc :: into_raw (obj) . cast_mut () }) } } impl Drop for std_sync_Arc_dash_spv_platform_identity_manager_IdentitiesManager { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . obj) ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_platform_identity_manager_IdentitiesManager_ctor (obj : * mut dash_spv_platform :: identity :: manager :: IdentitiesManager) -> * mut std_sync_Arc_dash_spv_platform_identity_manager_IdentitiesManager { ferment :: boxed (std_sync_Arc_dash_spv_platform_identity_manager_IdentitiesManager { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_platform_identity_manager_IdentitiesManager_destroy (ffi : * mut std_sync_Arc_dash_spv_platform_identity_manager_IdentitiesManager) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN_ { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: types :: dash_spv_masternode_processor :: models :: sync_state :: dash_spv_masternode_processor_models_sync_state_CacheState) } impl Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN_ { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : dash_spv_masternode_processor :: models :: sync_state :: CacheState) { let ffi_result = (self . caller) (o_0 , < crate :: fermented :: types :: dash_spv_masternode_processor :: models :: sync_state :: dash_spv_masternode_processor_models_sync_state_CacheState as ferment :: FFIConversionTo < dash_spv_masternode_processor :: models :: sync_state :: CacheState >> :: ffi_to (o_1)) ; ffi_result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN_ { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN_ { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN__ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: types :: dash_spv_masternode_processor :: models :: sync_state :: dash_spv_masternode_processor_models_sync_state_CacheState)) -> * mut Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN_ { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN_ { caller }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN__destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN_) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError) } impl Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : [u8 ; 32]) -> Result < dashcore :: bls_sig_utils :: BLSSignature , dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError > { let ffi_result = (self . caller) (o_0 , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (o_1)) ; let result = < crate :: fermented :: generics :: Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError as ferment :: FFIConversionFrom < Result < dashcore :: bls_sig_utils :: BLSSignature , dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError > >> :: ffi_from (ffi_result) ; (self . destructor) (ffi_result) ; result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: generics :: Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError)) -> * mut Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction , bool) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction , destructor : unsafe extern "C" fn (* mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction) } impl Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : dashcore :: blockdata :: transaction :: Transaction , o_2 : bool) -> Option < dashcore :: blockdata :: transaction :: Transaction > { let ffi_result = (self . caller) (o_0 , < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_to (o_1) , o_2) ; if ffi_result . is_null () { None } else { let result = < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_from_opt (ffi_result) ; (self . destructor) (ffi_result) ; result } } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction , bool) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction , destructor : unsafe extern "C" fn (* mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction)) -> * mut Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError { pub ok : * mut crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainValue , pub error : * mut crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainError } impl ferment :: FFIConversionFrom < Result < dash_spv_keychain :: KeyChainValue , dash_spv_keychain :: KeyChainError > > for Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError { unsafe fn ffi_from_const (ffi : * const Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError) -> Result < dash_spv_keychain :: KeyChainValue , dash_spv_keychain :: KeyChainError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainValue as ferment :: FFIConversionFrom < dash_spv_keychain :: KeyChainValue >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainError as ferment :: FFIConversionFrom < dash_spv_keychain :: KeyChainError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < dash_spv_keychain :: KeyChainValue , dash_spv_keychain :: KeyChainError > > for Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError { unsafe fn ffi_to_const (obj : Result < dash_spv_keychain :: KeyChainValue , dash_spv_keychain :: KeyChainError >) -> * const Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError_ctor (ok : * mut crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainValue , error : * mut crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainError) -> * mut Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError { ferment :: boxed (Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError_destroy (ffi : * mut Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_Vec_u32 { pub count : usize , pub values : * mut * mut crate :: fermented :: generics :: Vec_u32 } impl ferment :: FFIConversionFrom < Vec < Vec < u32 > > > for Vec_Vec_u32 { unsafe fn ffi_from_const (ffi : * const Vec_Vec_u32) -> Vec < Vec < u32 > > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < Vec < u32 > > > for Vec_Vec_u32 { unsafe fn ffi_to_const (obj : Vec < Vec < u32 > >) -> * const Vec_Vec_u32 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_Vec_u32 { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_Vec_u32_ctor (count : usize , values : * mut * mut crate :: fermented :: generics :: Vec_u32) -> * mut Vec_Vec_u32 { ferment :: boxed (Vec_Vec_u32 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_Vec_u32_destroy (ffi : * mut Vec_Vec_u32) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error { pub ok : * mut crate :: fermented :: generics :: Vec_dash_spv_platform_models_contact_request_ContactRequestKind , pub error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error } impl ferment :: FFIConversionFrom < Result < Vec < dash_spv_platform :: models :: contact_request :: ContactRequestKind > , dash_spv_platform :: error :: Error > > for Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error { unsafe fn ffi_from_const (ffi : * const Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error) -> Result < Vec < dash_spv_platform :: models :: contact_request :: ContactRequestKind > , dash_spv_platform :: error :: Error > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: generics :: Vec_dash_spv_platform_models_contact_request_ContactRequestKind as ferment :: FFIConversionFrom < Vec < dash_spv_platform :: models :: contact_request :: ContactRequestKind > >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error as ferment :: FFIConversionFrom < dash_spv_platform :: error :: Error >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < Vec < dash_spv_platform :: models :: contact_request :: ContactRequestKind > , dash_spv_platform :: error :: Error > > for Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error { unsafe fn ffi_to_const (obj : Result < Vec < dash_spv_platform :: models :: contact_request :: ContactRequestKind > , dash_spv_platform :: error :: Error >) -> * const Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error_ctor (ok : * mut crate :: fermented :: generics :: Vec_dash_spv_platform_models_contact_request_ContactRequestKind , error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error) -> * mut Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error { ferment :: boxed (Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error_destroy (ffi : * mut Result_ok_Vec_dash_spv_platform_models_contact_request_ContactRequestKind_err_dash_spv_platform_error_Error) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError { pub ok : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey , pub error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError } impl ferment :: FFIConversionFrom < Result < dash_spv_crypto :: keys :: bls_key :: BLSKey , dash_spv_crypto :: keys :: KeyError > > for Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_from_const (ffi : * const Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError) -> Result < dash_spv_crypto :: keys :: bls_key :: BLSKey , dash_spv_crypto :: keys :: KeyError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | (& * o) . clone () , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: KeyError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: bls_key :: BLSKey , dash_spv_crypto :: keys :: KeyError > > for Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_to_const (obj : Result < dash_spv_crypto :: keys :: bls_key :: BLSKey , dash_spv_crypto :: keys :: KeyError >) -> * const Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: boxed (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError_ctor (ok : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey , error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError) -> * mut Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError { ferment :: boxed (Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError_destroy (ffi : * mut Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dash_spv_crypto_keys_KeyError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dpp_data_contract_DataContract { pub obj : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dpp :: data_contract :: DataContract > > for std_sync_Arc_dpp_data_contract_DataContract { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dpp_data_contract_DataContract) -> std :: sync :: Arc < dpp :: data_contract :: DataContract > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (ferment :: FFIConversionFrom :: ffi_from (ffi_ref . obj)) } } impl ferment :: FFIConversionTo < std :: sync :: Arc < dpp :: data_contract :: DataContract > > for std_sync_Arc_dpp_data_contract_DataContract { unsafe fn ffi_to_const (obj : std :: sync :: Arc < dpp :: data_contract :: DataContract >) -> * const std_sync_Arc_dpp_data_contract_DataContract { ferment :: boxed (Self { obj : ferment :: FFIConversionTo :: ffi_to ((* obj) . clone ()) }) } } impl Drop for std_sync_Arc_dpp_data_contract_DataContract { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . obj) ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dpp_data_contract_DataContract_ctor (obj : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract) -> * mut std_sync_Arc_dpp_data_contract_DataContract { ferment :: boxed (std_sync_Arc_dpp_data_contract_DataContract { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dpp_data_contract_DataContract_destroy (ffi : * mut std_sync_Arc_dpp_data_contract_DataContract) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dash_spv_platform_models_contact_request_ContactRequestKind { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dash_spv_platform :: models :: contact_request :: dash_spv_platform_models_contact_request_ContactRequestKind } impl ferment :: FFIConversionFrom < Vec < dash_spv_platform :: models :: contact_request :: ContactRequestKind > > for Vec_dash_spv_platform_models_contact_request_ContactRequestKind { unsafe fn ffi_from_const (ffi : * const Vec_dash_spv_platform_models_contact_request_ContactRequestKind) -> Vec < dash_spv_platform :: models :: contact_request :: ContactRequestKind > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dash_spv_platform :: models :: contact_request :: ContactRequestKind > > for Vec_dash_spv_platform_models_contact_request_ContactRequestKind { unsafe fn ffi_to_const (obj : Vec < dash_spv_platform :: models :: contact_request :: ContactRequestKind >) -> * const Vec_dash_spv_platform_models_contact_request_ContactRequestKind { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dash_spv_platform_models_contact_request_ContactRequestKind { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dash_spv_platform_models_contact_request_ContactRequestKind_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dash_spv_platform :: models :: contact_request :: dash_spv_platform_models_contact_request_ContactRequestKind) -> * mut Vec_dash_spv_platform_models_contact_request_ContactRequestKind { ferment :: boxed (Vec_dash_spv_platform_models_contact_request_ContactRequestKind { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dash_spv_platform_models_contact_request_ContactRequestKind_destroy (ffi : * mut Vec_dash_spv_platform_models_contact_request_ContactRequestKind) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_platform_value_Value { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: platform_value :: platform_value_Value } impl ferment :: FFIConversionFrom < Vec < platform_value :: Value > > for Vec_platform_value_Value { unsafe fn ffi_from_const (ffi : * const Vec_platform_value_Value) -> Vec < platform_value :: Value > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < platform_value :: Value > > for Vec_platform_value_Value { unsafe fn ffi_to_const (obj : Vec < platform_value :: Value >) -> * const Vec_platform_value_Value { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_platform_value_Value { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_platform_value_Value_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: platform_value :: platform_value_Value) -> * mut Vec_platform_value_Value { ferment :: boxed (Vec_platform_value_Value { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_platform_value_Value_destroy (ffi : * mut Vec_platform_value_Value) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , pub values : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: identity :: identity_public_key :: KeyID , dpp :: identity :: identity_public_key :: IdentityPublicKey > > for std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey) -> std :: collections :: BTreeMap < dpp :: identity :: identity_public_key :: KeyID , dpp :: identity :: identity_public_key :: IdentityPublicKey > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: KeyID >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: IdentityPublicKey >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: identity :: identity_public_key :: KeyID , dpp :: identity :: identity_public_key :: IdentityPublicKey > > for std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < dpp :: identity :: identity_public_key :: KeyID , dpp :: identity :: identity_public_key :: IdentityPublicKey >) -> * const std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey_ctor (count : usize , keys : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_KeyID , values : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey) -> * mut std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey { ferment :: boxed (std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey_destroy (ffi : * mut std_collections_Map_keys_dpp_identity_identity_public_key_KeyID_values_dpp_identity_identity_public_key_IdentityPublicKey) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Slice_u8 { pub count : usize , pub values : * mut u8 } impl ferment :: FFIConversionFrom < Vec < u8 > > for Slice_u8 { unsafe fn ffi_from_const (ffi : * const Slice_u8) -> Vec < u8 > { let ffi_ref = & * ffi ; ferment :: from_primitive_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < u8 > > for Slice_u8 { unsafe fn ffi_to_const (obj : Vec < u8 >) -> * const Slice_u8 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_primitive_group (obj . into_iter ()) }) } } impl Drop for Slice_u8 { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Slice_u8_ctor (count : usize , values : * mut u8) -> * mut Slice_u8 { ferment :: boxed (Slice_u8 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Slice_u8_destroy (ffi : * mut Slice_u8) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_Vec_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { pub ok : * mut crate :: fermented :: generics :: Vec_dash_spv_crypto_keys_key_OpaqueKey , pub error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError } impl ferment :: FFIConversionFrom < Result < Vec < dash_spv_crypto :: keys :: key :: OpaqueKey > , dash_spv_crypto :: keys :: KeyError > > for Result_ok_Vec_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_from_const (ffi : * const Result_ok_Vec_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError) -> Result < Vec < dash_spv_crypto :: keys :: key :: OpaqueKey > , dash_spv_crypto :: keys :: KeyError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: generics :: Vec_dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < Vec < dash_spv_crypto :: keys :: key :: OpaqueKey > >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: KeyError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < Vec < dash_spv_crypto :: keys :: key :: OpaqueKey > , dash_spv_crypto :: keys :: KeyError > > for Result_ok_Vec_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_to_const (obj : Result < Vec < dash_spv_crypto :: keys :: key :: OpaqueKey > , dash_spv_crypto :: keys :: KeyError >) -> * const Result_ok_Vec_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_Vec_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_Vec_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError_ctor (ok : * mut crate :: fermented :: generics :: Vec_dash_spv_crypto_keys_key_OpaqueKey , error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError) -> * mut Result_ok_Vec_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { ferment :: boxed (Result_ok_Vec_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_Vec_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError_destroy (ffi : * mut Result_ok_Vec_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_bool_err_dash_spv_crypto_keys_KeyError { pub ok : * mut bool , pub error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError } impl ferment :: FFIConversionFrom < Result < bool , dash_spv_crypto :: keys :: KeyError > > for Result_ok_bool_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_from_const (ffi : * const Result_ok_bool_err_dash_spv_crypto_keys_KeyError) -> Result < bool , dash_spv_crypto :: keys :: KeyError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | * o , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: KeyError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < bool , dash_spv_crypto :: keys :: KeyError > > for Result_ok_bool_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_to_const (obj : Result < bool , dash_spv_crypto :: keys :: KeyError >) -> * const Result_ok_bool_err_dash_spv_crypto_keys_KeyError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: boxed (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_bool_err_dash_spv_crypto_keys_KeyError { fn drop (& mut self) { unsafe { ferment :: destroy_opt_primitive (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_bool_err_dash_spv_crypto_keys_KeyError_ctor (ok : * mut bool , error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError) -> * mut Result_ok_bool_err_dash_spv_crypto_keys_KeyError { ferment :: boxed (Result_ok_bool_err_dash_spv_crypto_keys_KeyError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_bool_err_dash_spv_crypto_keys_KeyError_destroy (ffi : * mut Result_ok_bool_err_dash_spv_crypto_keys_KeyError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dpp_identity_identity_public_key_security_level_SecurityLevel { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel } impl ferment :: FFIConversionFrom < Vec < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel > > for Vec_dpp_identity_identity_public_key_security_level_SecurityLevel { unsafe fn ffi_from_const (ffi : * const Vec_dpp_identity_identity_public_key_security_level_SecurityLevel) -> Vec < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel > > for Vec_dpp_identity_identity_public_key_security_level_SecurityLevel { unsafe fn ffi_to_const (obj : Vec < dpp :: identity :: identity_public_key :: security_level :: SecurityLevel >) -> * const Vec_dpp_identity_identity_public_key_security_level_SecurityLevel { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dpp_identity_identity_public_key_security_level_SecurityLevel { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_identity_identity_public_key_security_level_SecurityLevel_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: security_level :: dpp_identity_identity_public_key_security_level_SecurityLevel) -> * mut Vec_dpp_identity_identity_public_key_security_level_SecurityLevel { ferment :: boxed (Vec_dpp_identity_identity_public_key_security_level_SecurityLevel { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_identity_identity_public_key_security_level_SecurityLevel_destroy (ffi : * mut Vec_dpp_identity_identity_public_key_security_level_SecurityLevel) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , [u8 ; 32]) -> Option < dashcore :: blockdata :: transaction :: Transaction > > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , [u8 ; 32]) -> Option < dashcore :: blockdata :: transaction :: Transaction > > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction_ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction_destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_RTRN_String { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_RTRN_String } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , bool) -> String > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_RTRN_String { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_RTRN_String) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , bool) -> String > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_RTRN_String { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_RTRN_String_ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_RTRN_String) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_RTRN_String { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_RTRN_String { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_RTRN_String_destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_RTRN_String) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_bool_err_dash_spv_platform_error_Error { pub ok : * mut bool , pub error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error } impl ferment :: FFIConversionFrom < Result < bool , dash_spv_platform :: error :: Error > > for Result_ok_bool_err_dash_spv_platform_error_Error { unsafe fn ffi_from_const (ffi : * const Result_ok_bool_err_dash_spv_platform_error_Error) -> Result < bool , dash_spv_platform :: error :: Error > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | * o , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error as ferment :: FFIConversionFrom < dash_spv_platform :: error :: Error >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < bool , dash_spv_platform :: error :: Error > > for Result_ok_bool_err_dash_spv_platform_error_Error { unsafe fn ffi_to_const (obj : Result < bool , dash_spv_platform :: error :: Error >) -> * const Result_ok_bool_err_dash_spv_platform_error_Error { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: boxed (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_bool_err_dash_spv_platform_error_Error { fn drop (& mut self) { unsafe { ferment :: destroy_opt_primitive (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_bool_err_dash_spv_platform_error_Error_ctor (ok : * mut bool , error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error) -> * mut Result_ok_bool_err_dash_spv_platform_error_Error { ferment :: boxed (Result_ok_bool_err_dash_spv_platform_error_Error { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_bool_err_dash_spv_platform_error_Error_destroy (ffi : * mut Result_ok_bool_err_dash_spv_platform_error_Error) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , [u8 ; 32] , [u8 ; 32]) -> bool > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , [u8 ; 32] , [u8 ; 32]) -> bool > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 , o_2 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1 , o_2) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool_ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool_destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN_ { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , bool , * const std :: os :: raw :: c_void) } impl Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN_ { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : bool , o_2 : * const std :: os :: raw :: c_void) { let ffi_result = (self . caller) (o_0 , o_1 , o_2) ; ffi_result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN_ { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN_ { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN__ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , bool , * const std :: os :: raw :: c_void)) -> * mut Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN_ { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN_ { caller }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN__destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN_) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Arr_u8_20 { pub count : usize , pub values : * mut u8 } impl ferment :: FFIConversionFrom < [u8 ; 20] > for Arr_u8_20 { unsafe fn ffi_from_const (ffi : * const Arr_u8_20) -> [u8 ; 20] { let ffi_ref = & * ffi ; let vec : Vec < u8 > = ferment :: from_primitive_group (ffi_ref . values , ffi_ref . count) ; vec . try_into () . unwrap () } } impl ferment :: FFIConversionTo < [u8 ; 20] > for Arr_u8_20 { unsafe fn ffi_to_const (obj : [u8 ; 20]) -> * const Arr_u8_20 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_primitive_group (obj . into_iter ()) }) } } impl Drop for Arr_u8_20 { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Arr_u8_20_ctor (count : usize , values : * mut u8) -> * mut Arr_u8_20 { ferment :: boxed (Arr_u8_20 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Arr_u8_20_destroy (ffi : * mut Arr_u8_20) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dashcore_blockdata_transaction_txout_TxOut { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: txout :: dashcore_blockdata_transaction_txout_TxOut } impl ferment :: FFIConversionFrom < Vec < dashcore :: blockdata :: transaction :: txout :: TxOut > > for Vec_dashcore_blockdata_transaction_txout_TxOut { unsafe fn ffi_from_const (ffi : * const Vec_dashcore_blockdata_transaction_txout_TxOut) -> Vec < dashcore :: blockdata :: transaction :: txout :: TxOut > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dashcore :: blockdata :: transaction :: txout :: TxOut > > for Vec_dashcore_blockdata_transaction_txout_TxOut { unsafe fn ffi_to_const (obj : Vec < dashcore :: blockdata :: transaction :: txout :: TxOut >) -> * const Vec_dashcore_blockdata_transaction_txout_TxOut { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dashcore_blockdata_transaction_txout_TxOut { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dashcore_blockdata_transaction_txout_TxOut_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: txout :: dashcore_blockdata_transaction_txout_TxOut) -> * mut Vec_dashcore_blockdata_transaction_txout_TxOut { ferment :: boxed (Vec_dashcore_blockdata_transaction_txout_TxOut { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dashcore_blockdata_transaction_txout_TxOut_destroy (ffi : * mut Vec_dashcore_blockdata_transaction_txout_TxOut) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_usize_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { pub ok : * mut usize , pub error : * mut crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: processor :: processing_error :: dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError } impl ferment :: FFIConversionFrom < Result < usize , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError > > for Result_ok_usize_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { unsafe fn ffi_from_const (ffi : * const Result_ok_usize_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError) -> Result < usize , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | * o , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: processor :: processing_error :: dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError as ferment :: FFIConversionFrom < dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < usize , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError > > for Result_ok_usize_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { unsafe fn ffi_to_const (obj : Result < usize , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError >) -> * const Result_ok_usize_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: boxed (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_usize_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { fn drop (& mut self) { unsafe { ferment :: destroy_opt_primitive (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_usize_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_ctor (ok : * mut usize , error : * mut crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: processor :: processing_error :: dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError) -> * mut Result_ok_usize_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed (Result_ok_usize_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_usize_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_destroy (ffi : * mut Result_ok_usize_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_u64_values_dpp_balances_credits_TokenAmount { pub count : usize , pub keys : * mut u64 , pub values : * mut * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < u64 , dpp :: balances :: credits :: TokenAmount > > for std_collections_Map_keys_u64_values_dpp_balances_credits_TokenAmount { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_u64_values_dpp_balances_credits_TokenAmount) -> std :: collections :: BTreeMap < u64 , dpp :: balances :: credits :: TokenAmount > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | o , | o | < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionFrom < dpp :: balances :: credits :: TokenAmount >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < u64 , dpp :: balances :: credits :: TokenAmount > > for std_collections_Map_keys_u64_values_dpp_balances_credits_TokenAmount { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < u64 , dpp :: balances :: credits :: TokenAmount >) -> * const std_collections_Map_keys_u64_values_dpp_balances_credits_TokenAmount { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_primitive_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_u64_values_dpp_balances_credits_TokenAmount { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_u64_values_dpp_balances_credits_TokenAmount_ctor (count : usize , keys : * mut u64 , values : * mut * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount) -> * mut std_collections_Map_keys_u64_values_dpp_balances_credits_TokenAmount { ferment :: boxed (std_collections_Map_keys_u64_values_dpp_balances_credits_TokenAmount { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_u64_values_dpp_balances_credits_TokenAmount_destroy (ffi : * mut std_collections_Map_keys_u64_values_dpp_balances_credits_TokenAmount) { ferment :: unbox_any (ffi) ; } # [cfg (any (any (feature = "state-transitions")))] # [repr (C)] # [derive (Clone)] # [cfg (any (any (feature = "state-transitions")))] pub struct Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { pub o_0 : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document , pub o_1 : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: dpp_data_contract_document_type_DocumentTypeRef , pub o_2 : * mut crate :: fermented :: types :: platform_value :: types :: bytes_32 :: platform_value_types_bytes_32_Bytes32 } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl < 'a > ferment :: FFIConversionFrom < (dpp :: document :: Document , dpp :: data_contract :: document_type :: DocumentTypeRef < 'a > , platform_value :: types :: bytes_32 :: Bytes32) > for Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { unsafe fn ffi_from_const (ffi : * const Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32) -> (dpp :: document :: Document , dpp :: data_contract :: document_type :: DocumentTypeRef < 'a > , platform_value :: types :: bytes_32 :: Bytes32) { let ffi_ref = & * ffi ; (ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_0) , ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_1) , ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_2)) } } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl < 'a > ferment :: FFIConversionTo < (dpp :: document :: Document , dpp :: data_contract :: document_type :: DocumentTypeRef < 'a > , platform_value :: types :: bytes_32 :: Bytes32) > for Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { unsafe fn ffi_to_const (obj : (dpp :: document :: Document , dpp :: data_contract :: document_type :: DocumentTypeRef < 'a > , platform_value :: types :: bytes_32 :: Bytes32)) -> * const Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { ferment :: boxed (Self { o_0 : ferment :: FFIConversionTo :: ffi_to (obj . 0) , o_1 : ferment :: FFIConversionTo :: ffi_to (obj . 1) , o_2 : ferment :: FFIConversionTo :: ffi_to (obj . 2) }) } } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl Drop for Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . o_0) ; ferment :: unbox_any (self . o_1) ; ferment :: unbox_any (self . o_2) ; } } } # [cfg (any (any (feature = "state-transitions")))] # [no_mangle] pub unsafe extern "C" fn Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32_ctor (o_0 : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document , o_1 : * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: dpp_data_contract_document_type_DocumentTypeRef , o_2 : * mut crate :: fermented :: types :: platform_value :: types :: bytes_32 :: platform_value_types_bytes_32_Bytes32) -> * mut Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { ferment :: boxed (Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { o_0 , o_1 , o_2 }) } # [cfg (any (any (feature = "state-transitions")))] # [no_mangle] pub unsafe extern "C" fn Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32_destroy (ffi : * mut Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , u32) -> bool , destructor : unsafe extern "C" fn (bool) } impl Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : u32) -> bool { let ffi_result = (self . caller) (o_0 , o_1) ; ffi_result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , u32) -> bool , destructor : unsafe extern "C" fn (bool)) -> * mut Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_u32_RTRN_bool) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dash_spv_platform_document_contact_request_ContactRequestManager { pub obj : * mut dash_spv_platform :: document :: contact_request :: ContactRequestManager } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dash_spv_platform :: document :: contact_request :: ContactRequestManager > > for std_sync_Arc_dash_spv_platform_document_contact_request_ContactRequestManager { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dash_spv_platform_document_contact_request_ContactRequestManager) -> std :: sync :: Arc < dash_spv_platform :: document :: contact_request :: ContactRequestManager > { let ffi_ref = & * ffi ; std :: sync :: Arc :: from_raw (ffi_ref . obj) } } impl ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_platform :: document :: contact_request :: ContactRequestManager > > for std_sync_Arc_dash_spv_platform_document_contact_request_ContactRequestManager { unsafe fn ffi_to_const (obj : std :: sync :: Arc < dash_spv_platform :: document :: contact_request :: ContactRequestManager >) -> * const std_sync_Arc_dash_spv_platform_document_contact_request_ContactRequestManager { ferment :: boxed (Self { obj : std :: sync :: Arc :: into_raw (obj) . cast_mut () }) } } impl Drop for std_sync_Arc_dash_spv_platform_document_contact_request_ContactRequestManager { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . obj) ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_platform_document_contact_request_ContactRequestManager_ctor (obj : * mut dash_spv_platform :: document :: contact_request :: ContactRequestManager) -> * mut std_sync_Arc_dash_spv_platform_document_contact_request_ContactRequestManager { ferment :: boxed (std_sync_Arc_dash_spv_platform_document_contact_request_ContactRequestManager { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_platform_document_contact_request_ContactRequestManager_destroy (ffi : * mut std_sync_Arc_dash_spv_platform_document_contact_request_ContactRequestManager) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32 { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32 } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , u64) -> u32 > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32 { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , u64) -> u32 > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32 { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32_ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32 { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32 { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32_destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u64_RTRN_u32) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dpp :: voting :: contender_structs :: dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo } impl ferment :: FFIConversionFrom < Vec < dpp :: voting :: contender_structs :: FinalizedResourceVoteChoicesWithVoterInfo > > for Vec_dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo { unsafe fn ffi_from_const (ffi : * const Vec_dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo) -> Vec < dpp :: voting :: contender_structs :: FinalizedResourceVoteChoicesWithVoterInfo > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dpp :: voting :: contender_structs :: FinalizedResourceVoteChoicesWithVoterInfo > > for Vec_dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo { unsafe fn ffi_to_const (obj : Vec < dpp :: voting :: contender_structs :: FinalizedResourceVoteChoicesWithVoterInfo >) -> * const Vec_dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dpp :: voting :: contender_structs :: dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo) -> * mut Vec_dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo { ferment :: boxed (Vec_dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo_destroy (ffi : * mut Vec_dpp_voting_contender_structs_FinalizedResourceVoteChoicesWithVoterInfo) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_RTRN_Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void) -> * mut crate :: fermented :: generics :: Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError) } impl Fn_ARGS_std_os_raw_c_void_RTRN_Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void) -> Result < dpp :: prelude :: CoreBlockHeight , drive_proof_verifier :: error :: ContextProviderError > { let ffi_result = (self . caller) (o_0) ; let result = < crate :: fermented :: generics :: Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError as ferment :: FFIConversionFrom < Result < dpp :: prelude :: CoreBlockHeight , drive_proof_verifier :: error :: ContextProviderError > >> :: ffi_from (ffi_result) ; (self . destructor) (ffi_result) ; result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_RTRN_Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_RTRN_Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_RTRN_Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void) -> * mut crate :: fermented :: generics :: Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError)) -> * mut Fn_ARGS_std_os_raw_c_void_RTRN_Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_RTRN_Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_RTRN_Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_RTRN_Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub values : * mut * mut crate :: fermented :: types :: dash_spv_platform :: models :: transient_dashpay_user :: dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dash_spv_platform :: models :: transient_dashpay_user :: TransientDashPayUser > > for std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dash_spv_platform :: models :: transient_dashpay_user :: TransientDashPayUser > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dash_spv_platform :: models :: transient_dashpay_user :: dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser as ferment :: FFIConversionFrom < dash_spv_platform :: models :: transient_dashpay_user :: TransientDashPayUser >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dash_spv_platform :: models :: transient_dashpay_user :: TransientDashPayUser > > for std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dash_spv_platform :: models :: transient_dashpay_user :: TransientDashPayUser >) -> * const std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_ctor (count : usize , keys : * mut * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , values : * mut * mut crate :: fermented :: types :: dash_spv_platform :: models :: transient_dashpay_user :: dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { ferment :: boxed (std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_destroy (ffi : * mut std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut , * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinControl , bool , * mut crate :: fermented :: generics :: Arr_u8_32) -> bool , destructor : unsafe extern "C" fn (bool) } impl Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : Vec < dashcore :: blockdata :: transaction :: txout :: TxOut > , o_2 : dash_spv_coinjoin :: models :: coin_control :: CoinControl , o_3 : bool , o_4 : [u8 ; 32]) -> bool { let ffi_result = (self . caller) (o_0 , < crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut as ferment :: FFIConversionTo < Vec < dashcore :: blockdata :: transaction :: txout :: TxOut > >> :: ffi_to (o_1) , < crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinControl as ferment :: FFIConversionTo < dash_spv_coinjoin :: models :: coin_control :: CoinControl >> :: ffi_to (o_2) , o_3 , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (o_4)) ; ffi_result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: generics :: Vec_dashcore_blockdata_transaction_txout_TxOut , * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinControl , bool , * mut crate :: fermented :: generics :: Arr_u8_32) -> bool , destructor : unsafe extern "C" fn (bool)) -> * mut Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN_ { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN_ } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , Vec < dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry >) > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN_ { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN_) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , Vec < dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry >) > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN_ { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN__ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN_) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN_ { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN_ { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN__destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN_) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_indexmap_IndexMap_u32_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { pub ok : * mut crate :: fermented :: generics :: indexmap_IndexMap_u32_dpp_identity_identity_Identity , pub error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error } impl ferment :: FFIConversionFrom < Result < indexmap :: IndexMap < u32 , dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error > > for Result_ok_indexmap_IndexMap_u32_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { unsafe fn ffi_from_const (ffi : * const Result_ok_indexmap_IndexMap_u32_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error) -> Result < indexmap :: IndexMap < u32 , dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: generics :: indexmap_IndexMap_u32_dpp_identity_identity_Identity as ferment :: FFIConversionFrom < indexmap :: IndexMap < u32 , dpp :: identity :: identity :: Identity > >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error as ferment :: FFIConversionFrom < dash_spv_platform :: error :: Error >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < indexmap :: IndexMap < u32 , dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error > > for Result_ok_indexmap_IndexMap_u32_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { unsafe fn ffi_to_const (obj : Result < indexmap :: IndexMap < u32 , dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error >) -> * const Result_ok_indexmap_IndexMap_u32_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_indexmap_IndexMap_u32_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_indexmap_IndexMap_u32_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error_ctor (ok : * mut crate :: fermented :: generics :: indexmap_IndexMap_u32_dpp_identity_identity_Identity , error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error) -> * mut Result_ok_indexmap_IndexMap_u32_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { ferment :: boxed (Result_ok_indexmap_IndexMap_u32_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_indexmap_IndexMap_u32_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error_destroy (ffi : * mut Result_ok_indexmap_IndexMap_u32_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_RTRN_ { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_RTRN_ } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void) > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_RTRN_ { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_RTRN_) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void) > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 | unsafe { (& * ffi_ref . obj) . call (o_0) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_RTRN_ { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_RTRN__ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_RTRN_) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_RTRN_ { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_RTRN_ { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_RTRN__destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_RTRN_) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus } impl ferment :: FFIConversionFrom < Vec < dash_spv_coinjoin :: messages :: pool_status :: PoolStatus > > for Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus { unsafe fn ffi_from_const (ffi : * const Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus) -> Vec < dash_spv_coinjoin :: messages :: pool_status :: PoolStatus > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dash_spv_coinjoin :: messages :: pool_status :: PoolStatus > > for Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus { unsafe fn ffi_to_const (obj : Vec < dash_spv_coinjoin :: messages :: pool_status :: PoolStatus >) -> * const Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus) -> * mut Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus { ferment :: boxed (Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus_destroy (ffi : * mut Vec_dash_spv_coinjoin_messages_pool_status_PoolStatus) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { pub ok : * mut crate :: fermented :: generics :: indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document , pub error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error } impl ferment :: FFIConversionFrom < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > > for Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { unsafe fn ffi_from_const (ffi : * const Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error) -> Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: generics :: indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document as ferment :: FFIConversionFrom < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error as ferment :: FFIConversionFrom < dash_spv_platform :: error :: Error >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error > > for Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { unsafe fn ffi_to_const (obj : Result < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > , dash_spv_platform :: error :: Error >) -> * const Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error_ctor (ok : * mut crate :: fermented :: generics :: indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document , error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error) -> * mut Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { ferment :: boxed (Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error_destroy (ffi : * mut Result_ok_indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_err_dash_spv_platform_error_Error) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , String , Vec < u8 > , std :: net :: SocketAddr , bool) -> bool > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , String , Vec < u8 > , std :: net :: SocketAddr , bool) -> bool > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 , o_2 , o_3 , o_4 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1 , o_2 , o_3 , o_4) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool_ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool_destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_RTRN_dashcore_sml_masternode_list_MasternodeList { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void) -> * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list :: dashcore_sml_masternode_list_MasternodeList , destructor : unsafe extern "C" fn (* mut crate :: fermented :: types :: dashcore :: sml :: masternode_list :: dashcore_sml_masternode_list_MasternodeList) } impl Fn_ARGS_std_os_raw_c_void_RTRN_dashcore_sml_masternode_list_MasternodeList { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void) -> dashcore :: sml :: masternode_list :: MasternodeList { let ffi_result = (self . caller) (o_0) ; let result = < crate :: fermented :: types :: dashcore :: sml :: masternode_list :: dashcore_sml_masternode_list_MasternodeList as ferment :: FFIConversionFrom < dashcore :: sml :: masternode_list :: MasternodeList >> :: ffi_from (ffi_result) ; (self . destructor) (ffi_result) ; result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_RTRN_dashcore_sml_masternode_list_MasternodeList { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_RTRN_dashcore_sml_masternode_list_MasternodeList { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_RTRN_dashcore_sml_masternode_list_MasternodeList_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void) -> * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list :: dashcore_sml_masternode_list_MasternodeList , destructor : unsafe extern "C" fn (* mut crate :: fermented :: types :: dashcore :: sml :: masternode_list :: dashcore_sml_masternode_list_MasternodeList)) -> * mut Fn_ARGS_std_os_raw_c_void_RTRN_dashcore_sml_masternode_list_MasternodeList { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_RTRN_dashcore_sml_masternode_list_MasternodeList { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_RTRN_dashcore_sml_masternode_list_MasternodeList_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_RTRN_dashcore_sml_masternode_list_MasternodeList) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Arr_u8_32 { pub count : usize , pub values : * mut u8 } impl ferment :: FFIConversionFrom < [u8 ; 32] > for Arr_u8_32 { unsafe fn ffi_from_const (ffi : * const Arr_u8_32) -> [u8 ; 32] { let ffi_ref = & * ffi ; let vec : Vec < u8 > = ferment :: from_primitive_group (ffi_ref . values , ffi_ref . count) ; vec . try_into () . unwrap () } } impl ferment :: FFIConversionTo < [u8 ; 32] > for Arr_u8_32 { unsafe fn ffi_to_const (obj : [u8 ; 32]) -> * const Arr_u8_32 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_primitive_group (obj . into_iter ()) }) } } impl Drop for Arr_u8_32 { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Arr_u8_32_ctor (count : usize , values : * mut u8) -> * mut Arr_u8_32 { ferment :: boxed (Arr_u8_32 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Arr_u8_32_destroy (ffi : * mut Arr_u8_32) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32 { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: generics :: Arr_u8_32) -> u32 , destructor : unsafe extern "C" fn (u32) } impl Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32 { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : [u8 ; 32]) -> u32 { let ffi_result = (self . caller) (o_0 , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (o_1)) ; ffi_result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32 { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32 { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: generics :: Arr_u8_32) -> u32 , destructor : unsafe extern "C" fn (u32)) -> * mut Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32 { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32 { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_Tuple_Arr_u8_16_u16 { pub count : usize , pub values : * mut * mut crate :: fermented :: generics :: Tuple_Arr_u8_16_u16 } impl ferment :: FFIConversionFrom < Vec < ([u8 ; 16] , u16) > > for Vec_Tuple_Arr_u8_16_u16 { unsafe fn ffi_from_const (ffi : * const Vec_Tuple_Arr_u8_16_u16) -> Vec < ([u8 ; 16] , u16) > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < ([u8 ; 16] , u16) > > for Vec_Tuple_Arr_u8_16_u16 { unsafe fn ffi_to_const (obj : Vec < ([u8 ; 16] , u16) >) -> * const Vec_Tuple_Arr_u8_16_u16 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_Tuple_Arr_u8_16_u16 { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_Tuple_Arr_u8_16_u16_ctor (count : usize , values : * mut * mut crate :: fermented :: generics :: Tuple_Arr_u8_16_u16) -> * mut Vec_Tuple_Arr_u8_16_u16 { ferment :: boxed (Vec_Tuple_Arr_u8_16_u16 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_Tuple_Arr_u8_16_u16_destroy (ffi : * mut Vec_Tuple_Arr_u8_16_u16) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_platform_value_types_identifier_Identifier_RTRN_Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut crate :: fermented :: generics :: Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError) } impl Fn_ARGS_std_os_raw_c_void_platform_value_types_identifier_Identifier_RTRN_Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : platform_value :: types :: identifier :: Identifier) -> Result < Option < std :: sync :: Arc < dpp :: data_contract :: DataContract > > , drive_proof_verifier :: error :: ContextProviderError > { let ffi_result = (self . caller) (o_0 , < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionTo < platform_value :: types :: identifier :: Identifier >> :: ffi_to (o_1)) ; let result = < crate :: fermented :: generics :: Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError as ferment :: FFIConversionFrom < Result < Option < std :: sync :: Arc < dpp :: data_contract :: DataContract > > , drive_proof_verifier :: error :: ContextProviderError > >> :: ffi_from (ffi_result) ; (self . destructor) (ffi_result) ; result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_platform_value_types_identifier_Identifier_RTRN_Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_platform_value_types_identifier_Identifier_RTRN_Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_platform_value_types_identifier_Identifier_RTRN_Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier) -> * mut crate :: fermented :: generics :: Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError)) -> * mut Fn_ARGS_std_os_raw_c_void_platform_value_types_identifier_Identifier_RTRN_Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_platform_value_types_identifier_Identifier_RTRN_Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_platform_value_types_identifier_Identifier_RTRN_Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_platform_value_types_identifier_Identifier_RTRN_Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_String_values_Vec_u8_20 { pub count : usize , pub keys : * mut * mut std :: os :: raw :: c_char , pub values : * mut * mut crate :: fermented :: generics :: Vec_u8_20 } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < String , Vec < [u8 ; 20] > > > for std_collections_Map_keys_String_values_Vec_u8_20 { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_String_values_Vec_u8_20) -> std :: collections :: BTreeMap < String , Vec < [u8 ; 20] > > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (o) , | o | < crate :: fermented :: generics :: Vec_u8_20 as ferment :: FFIConversionFrom < Vec < [u8 ; 20] > >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < String , Vec < [u8 ; 20] > > > for std_collections_Map_keys_String_values_Vec_u8_20 { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < String , Vec < [u8 ; 20] > >) -> * const std_collections_Map_keys_String_values_Vec_u8_20 { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_String_values_Vec_u8_20 { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr_composer (self . keys , self . count , ferment :: unbox_string) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_String_values_Vec_u8_20_ctor (count : usize , keys : * mut * mut std :: os :: raw :: c_char , values : * mut * mut crate :: fermented :: generics :: Vec_u8_20) -> * mut std_collections_Map_keys_String_values_Vec_u8_20 { ferment :: boxed (std_collections_Map_keys_String_values_Vec_u8_20 { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_String_values_Vec_u8_20_destroy (ffi : * mut std_collections_Map_keys_String_values_Vec_u8_20) { ferment :: unbox_any (ffi) ; } # [cfg (any (any (feature = "state-transitions")))] # [repr (C)] # [derive (Clone)] # [cfg (any (any (feature = "state-transitions")))] pub struct std_collections_Map_keys_platform_value_types_identifier_Identifier_values_Option_dpp_document_Document { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub values : * mut * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > > for std_collections_Map_keys_platform_value_types_identifier_Identifier_values_Option_dpp_document_Document { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_platform_value_types_identifier_Identifier_values_Option_dpp_document_Document) -> std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionFrom < dpp :: document :: Document >> :: ffi_from_opt (o)) } } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > > for std_collections_Map_keys_platform_value_types_identifier_Identifier_values_Option_dpp_document_Document { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > >) -> * const std_collections_Map_keys_platform_value_types_identifier_Identifier_values_Option_dpp_document_Document { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_opt_complex_group (obj . values () . cloned ()) }) } } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl Drop for std_collections_Map_keys_platform_value_types_identifier_Identifier_values_Option_dpp_document_Document { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [cfg (any (any (feature = "state-transitions")))] # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_platform_value_types_identifier_Identifier_values_Option_dpp_document_Document_ctor (count : usize , keys : * mut * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , values : * mut * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document) -> * mut std_collections_Map_keys_platform_value_types_identifier_Identifier_values_Option_dpp_document_Document { ferment :: boxed (std_collections_Map_keys_platform_value_types_identifier_Identifier_values_Option_dpp_document_Document { count , keys , values }) } # [cfg (any (any (feature = "state-transitions")))] # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_platform_value_types_identifier_Identifier_values_Option_dpp_document_Document_destroy (ffi : * mut std_collections_Map_keys_platform_value_types_identifier_Identifier_values_Option_dpp_document_Document) { ferment :: unbox_any (ffi) ; } # [cfg (any (any (feature = "state-transitions")))] # [repr (C)] # [derive (Clone)] # [cfg (any (any (feature = "state-transitions")))] pub struct Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl ferment :: FFIConversionFrom < Vec < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: BatchedTransition > > for Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition { unsafe fn ffi_from_const (ffi : * const Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition) -> Vec < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: BatchedTransition > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl ferment :: FFIConversionTo < Vec < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: BatchedTransition > > for Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition { unsafe fn ffi_to_const (obj : Vec < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: BatchedTransition >) -> * const Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl Drop for Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [cfg (any (any (feature = "state-transitions")))] # [no_mangle] pub unsafe extern "C" fn Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition) -> * mut Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition { ferment :: boxed (Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition { count , values }) } # [cfg (any (any (feature = "state-transitions")))] # [no_mangle] pub unsafe extern "C" fn Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition_destroy (ffi : * mut Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_BatchedTransition) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Arr_u8_16 { pub count : usize , pub values : * mut u8 } impl ferment :: FFIConversionFrom < [u8 ; 16] > for Arr_u8_16 { unsafe fn ffi_from_const (ffi : * const Arr_u8_16) -> [u8 ; 16] { let ffi_ref = & * ffi ; let vec : Vec < u8 > = ferment :: from_primitive_group (ffi_ref . values , ffi_ref . count) ; vec . try_into () . unwrap () } } impl ferment :: FFIConversionTo < [u8 ; 16] > for Arr_u8_16 { unsafe fn ffi_to_const (obj : [u8 ; 16]) -> * const Arr_u8_16 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_primitive_group (obj . into_iter ()) }) } } impl Drop for Arr_u8_16 { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Arr_u8_16_ctor (count : usize , values : * mut u8) -> * mut Arr_u8_16 { ferment :: boxed (Arr_u8_16 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Arr_u8_16_destroy (ffi : * mut Arr_u8_16) { ferment :: unbox_any (ffi) ; } # [cfg (any (any (feature = "json-schema-validation")))] # [repr (C)] # [derive (Clone)] # [cfg (any (any (feature = "json-schema-validation")))] pub struct serde_json_Map_String_serde_json_Value { pub count : usize , pub keys : * mut * mut std :: os :: raw :: c_char , pub values : * mut * mut dash_spv_apple_bindings :: custom :: serde_json :: serde_json_JsonValue } # [cfg (any (any (feature = "json-schema-validation")))] # [cfg (any (any (feature = "json-schema-validation")))] impl ferment :: FFIConversionFrom < serde_json :: Map < String , serde_json :: Value > > for serde_json_Map_String_serde_json_Value { unsafe fn ffi_from_const (ffi : * const serde_json_Map_String_serde_json_Value) -> serde_json :: Map < String , serde_json :: Value > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (o) , | o | < dash_spv_apple_bindings :: custom :: serde_json :: serde_json_JsonValue as ferment :: FFIConversionFrom < serde_json :: Value >> :: ffi_from (o)) } } # [cfg (any (any (feature = "json-schema-validation")))] # [cfg (any (any (feature = "json-schema-validation")))] impl ferment :: FFIConversionTo < serde_json :: Map < String , serde_json :: Value > > for serde_json_Map_String_serde_json_Value { unsafe fn ffi_to_const (obj : serde_json :: Map < String , serde_json :: Value >) -> * const serde_json_Map_String_serde_json_Value { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } # [cfg (any (any (feature = "json-schema-validation")))] # [cfg (any (any (feature = "json-schema-validation")))] impl Drop for serde_json_Map_String_serde_json_Value { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr_composer (self . keys , self . count , ferment :: unbox_string) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [cfg (any (any (feature = "json-schema-validation")))] # [no_mangle] pub unsafe extern "C" fn serde_json_Map_String_serde_json_Value_ctor (count : usize , keys : * mut * mut std :: os :: raw :: c_char , values : * mut * mut dash_spv_apple_bindings :: custom :: serde_json :: serde_json_JsonValue) -> * mut serde_json_Map_String_serde_json_Value { ferment :: boxed (serde_json_Map_String_serde_json_Value { count , keys , values }) } # [cfg (any (any (feature = "json-schema-validation")))] # [no_mangle] pub unsafe extern "C" fn serde_json_Map_String_serde_json_Value_destroy (ffi : * mut serde_json_Map_String_serde_json_Value) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN_ { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN_ } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , bool , * const std :: os :: raw :: c_void) > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN_ { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN_) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , bool , * const std :: os :: raw :: c_void) > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 , o_2 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1 , o_2) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN_ { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN__ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN_) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN_ { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN_ { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN__destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_std_os_raw_c_void_RTRN_) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_versioned_feature_core_FeatureVersion { pub count : usize , pub values : * mut * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion } impl ferment :: FFIConversionFrom < Vec < versioned_feature_core :: FeatureVersion > > for Vec_versioned_feature_core_FeatureVersion { unsafe fn ffi_from_const (ffi : * const Vec_versioned_feature_core_FeatureVersion) -> Vec < versioned_feature_core :: FeatureVersion > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < versioned_feature_core :: FeatureVersion > > for Vec_versioned_feature_core_FeatureVersion { unsafe fn ffi_to_const (obj : Vec < versioned_feature_core :: FeatureVersion >) -> * const Vec_versioned_feature_core_FeatureVersion { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_versioned_feature_core_FeatureVersion { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_versioned_feature_core_FeatureVersion_ctor (count : usize , values : * mut * mut dash_spv_apple_bindings :: custom :: versioned_feature_core :: versioned_feature_core_FeatureVersion) -> * mut Vec_versioned_feature_core_FeatureVersion { ferment :: boxed (Vec_versioned_feature_core_FeatureVersion { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_versioned_feature_core_FeatureVersion_destroy (ffi : * mut Vec_versioned_feature_core_FeatureVersion) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DocumentName , pub values : * mut * mut crate :: fermented :: types :: platform_value :: platform_value_Value } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: data_contract :: DocumentName , platform_value :: Value > > for std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value) -> std :: collections :: BTreeMap < dpp :: data_contract :: DocumentName , platform_value :: Value > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DocumentName as ferment :: FFIConversionFrom < dpp :: data_contract :: DocumentName >> :: ffi_from (o) , | o | < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionFrom < platform_value :: Value >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: data_contract :: DocumentName , platform_value :: Value > > for std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < dpp :: data_contract :: DocumentName , platform_value :: Value >) -> * const std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value_ctor (count : usize , keys : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DocumentName , values : * mut * mut crate :: fermented :: types :: platform_value :: platform_value_Value) -> * mut std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value { ferment :: boxed (std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value_destroy (ffi : * mut std_collections_Map_keys_dpp_data_contract_DocumentName_values_platform_value_Value) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_dashcore_blockdata_transaction_outpoint_OutPoint_values_i32 { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint , pub values : * mut i32 } impl ferment :: FFIConversionFrom < std :: collections :: HashMap < dashcore :: blockdata :: transaction :: outpoint :: OutPoint , i32 > > for std_collections_Map_keys_dashcore_blockdata_transaction_outpoint_OutPoint_values_i32 { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_dashcore_blockdata_transaction_outpoint_OutPoint_values_i32) -> std :: collections :: HashMap < dashcore :: blockdata :: transaction :: outpoint :: OutPoint , i32 > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_from (o) , | o | o) } } impl ferment :: FFIConversionTo < std :: collections :: HashMap < dashcore :: blockdata :: transaction :: outpoint :: OutPoint , i32 > > for std_collections_Map_keys_dashcore_blockdata_transaction_outpoint_OutPoint_values_i32 { unsafe fn ffi_to_const (obj : std :: collections :: HashMap < dashcore :: blockdata :: transaction :: outpoint :: OutPoint , i32 >) -> * const std_collections_Map_keys_dashcore_blockdata_transaction_outpoint_OutPoint_values_i32 { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_primitive_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_dashcore_blockdata_transaction_outpoint_OutPoint_values_i32 { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dashcore_blockdata_transaction_outpoint_OutPoint_values_i32_ctor (count : usize , keys : * mut * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint , values : * mut i32) -> * mut std_collections_Map_keys_dashcore_blockdata_transaction_outpoint_OutPoint_values_i32 { ferment :: boxed (std_collections_Map_keys_dashcore_blockdata_transaction_outpoint_OutPoint_values_i32 { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dashcore_blockdata_transaction_outpoint_OutPoint_values_i32_destroy (ffi : * mut std_collections_Map_keys_dashcore_blockdata_transaction_outpoint_OutPoint_values_i32) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Arr_u8_48 { pub count : usize , pub values : * mut u8 } impl ferment :: FFIConversionFrom < [u8 ; 48] > for Arr_u8_48 { unsafe fn ffi_from_const (ffi : * const Arr_u8_48) -> [u8 ; 48] { let ffi_ref = & * ffi ; let vec : Vec < u8 > = ferment :: from_primitive_group (ffi_ref . values , ffi_ref . count) ; vec . try_into () . unwrap () } } impl ferment :: FFIConversionTo < [u8 ; 48] > for Arr_u8_48 { unsafe fn ffi_to_const (obj : [u8 ; 48]) -> * const Arr_u8_48 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_primitive_group (obj . into_iter ()) }) } } impl Drop for Arr_u8_48 { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Arr_u8_48_ctor (count : usize , values : * mut u8) -> * mut Arr_u8_48 { ferment :: boxed (Arr_u8_48 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Arr_u8_48_destroy (ffi : * mut Arr_u8_48) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64 { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64 } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , [u8 ; 32] , u32) -> i64 > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64 { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , [u8 ; 32] , u32) -> i64 > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 , o_2 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1 , o_2) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64 { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64_ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64 { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64 { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64_destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_u32_RTRN_i64) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Tuple_platform_value_Value_platform_value_Value { pub o_0 : * mut crate :: fermented :: types :: platform_value :: platform_value_Value , pub o_1 : * mut crate :: fermented :: types :: platform_value :: platform_value_Value } impl ferment :: FFIConversionFrom < (platform_value :: Value , platform_value :: Value) > for Tuple_platform_value_Value_platform_value_Value { unsafe fn ffi_from_const (ffi : * const Tuple_platform_value_Value_platform_value_Value) -> (platform_value :: Value , platform_value :: Value) { let ffi_ref = & * ffi ; (ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_0) , ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_1)) } } impl ferment :: FFIConversionTo < (platform_value :: Value , platform_value :: Value) > for Tuple_platform_value_Value_platform_value_Value { unsafe fn ffi_to_const (obj : (platform_value :: Value , platform_value :: Value)) -> * const Tuple_platform_value_Value_platform_value_Value { ferment :: boxed (Self { o_0 : ferment :: FFIConversionTo :: ffi_to (obj . 0) , o_1 : ferment :: FFIConversionTo :: ffi_to (obj . 1) }) } } impl Drop for Tuple_platform_value_Value_platform_value_Value { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . o_0) ; ferment :: unbox_any (self . o_1) ; } } } # [no_mangle] pub unsafe extern "C" fn Tuple_platform_value_Value_platform_value_Value_ctor (o_0 : * mut crate :: fermented :: types :: platform_value :: platform_value_Value , o_1 : * mut crate :: fermented :: types :: platform_value :: platform_value_Value) -> * mut Tuple_platform_value_Value_platform_value_Value { ferment :: boxed (Tuple_platform_value_Value_platform_value_Value { o_0 , o_1 }) } # [no_mangle] pub unsafe extern "C" fn Tuple_platform_value_Value_platform_value_Value_destroy (ffi : * mut Tuple_platform_value_Value_platform_value_Value) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DocumentName , pub values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: dpp_data_contract_document_type_DocumentType } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: data_contract :: DocumentName , dpp :: data_contract :: document_type :: DocumentType > > for std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType) -> std :: collections :: BTreeMap < dpp :: data_contract :: DocumentName , dpp :: data_contract :: document_type :: DocumentType > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DocumentName as ferment :: FFIConversionFrom < dpp :: data_contract :: DocumentName >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dpp :: data_contract :: document_type :: dpp_data_contract_document_type_DocumentType as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: DocumentType >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: data_contract :: DocumentName , dpp :: data_contract :: document_type :: DocumentType > > for std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < dpp :: data_contract :: DocumentName , dpp :: data_contract :: document_type :: DocumentType >) -> * const std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType_ctor (count : usize , keys : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DocumentName , values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: dpp_data_contract_document_type_DocumentType) -> * mut std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType { ferment :: boxed (std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType_destroy (ffi : * mut std_collections_Map_keys_dpp_data_contract_DocumentName_values_dpp_data_contract_document_type_DocumentType) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dash_spv_coinjoin :: coin_selection :: input_coin :: dash_spv_coinjoin_coin_selection_input_coin_InputCoin } impl ferment :: FFIConversionFrom < Vec < dash_spv_coinjoin :: coin_selection :: input_coin :: InputCoin > > for Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { unsafe fn ffi_from_const (ffi : * const Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin) -> Vec < dash_spv_coinjoin :: coin_selection :: input_coin :: InputCoin > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dash_spv_coinjoin :: coin_selection :: input_coin :: InputCoin > > for Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { unsafe fn ffi_to_const (obj : Vec < dash_spv_coinjoin :: coin_selection :: input_coin :: InputCoin >) -> * const Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dash_spv_coinjoin :: coin_selection :: input_coin :: dash_spv_coinjoin_coin_selection_input_coin_InputCoin) -> * mut Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { ferment :: boxed (Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin_destroy (ffi : * mut Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_String_err_dash_spv_crypto_keys_KeyError { pub ok : * mut std :: os :: raw :: c_char , pub error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError } impl ferment :: FFIConversionFrom < Result < String , dash_spv_crypto :: keys :: KeyError > > for Result_ok_String_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_from_const (ffi : * const Result_ok_String_err_dash_spv_crypto_keys_KeyError) -> Result < String , dash_spv_crypto :: keys :: KeyError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: KeyError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < String , dash_spv_crypto :: keys :: KeyError > > for Result_ok_String_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_to_const (obj : Result < String , dash_spv_crypto :: keys :: KeyError >) -> * const Result_ok_String_err_dash_spv_crypto_keys_KeyError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_String_err_dash_spv_crypto_keys_KeyError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_String_err_dash_spv_crypto_keys_KeyError_ctor (ok : * mut std :: os :: raw :: c_char , error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError) -> * mut Result_ok_String_err_dash_spv_crypto_keys_KeyError { ferment :: boxed (Result_ok_String_err_dash_spv_crypto_keys_KeyError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_String_err_dash_spv_crypto_keys_KeyError_destroy (ffi : * mut Result_ok_String_err_dash_spv_crypto_keys_KeyError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_Vec_u8_RTRN_Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey , * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError) } impl Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_Vec_u8_RTRN_Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : & dpp :: identity :: identity_public_key :: IdentityPublicKey , o_2 : Vec < u8 >) -> Result < platform_value :: types :: binary_data :: BinaryData , dpp :: errors :: protocol_error :: ProtocolError > { let ffi_result = (self . caller) (o_0 , < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: IdentityPublicKey >> :: ffi_to (o_1 . clone ()) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (o_2)) ; let result = < crate :: fermented :: generics :: Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError as ferment :: FFIConversionFrom < Result < platform_value :: types :: binary_data :: BinaryData , dpp :: errors :: protocol_error :: ProtocolError > >> :: ffi_from (ffi_result) ; (self . destructor) (ffi_result) ; result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_Vec_u8_RTRN_Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_Vec_u8_RTRN_Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_Vec_u8_RTRN_Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey , * mut crate :: fermented :: generics :: Vec_u8) -> * mut crate :: fermented :: generics :: Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError)) -> * mut Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_Vec_u8_RTRN_Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_Vec_u8_RTRN_Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_Vec_u8_RTRN_Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_Vec_u8_RTRN_Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { pub ok : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , pub error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError } impl ferment :: FFIConversionFrom < Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError > > for Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_from_const (ffi : * const Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError) -> Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: key :: OpaqueKey >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: KeyError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError > > for Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_to_const (obj : Result < dash_spv_crypto :: keys :: key :: OpaqueKey , dash_spv_crypto :: keys :: KeyError >) -> * const Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError_ctor (ok : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: key :: dash_spv_crypto_keys_key_OpaqueKey , error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError) -> * mut Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { ferment :: boxed (Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError_destroy (ffi : * mut Result_ok_dash_spv_crypto_keys_key_OpaqueKey_err_dash_spv_crypto_keys_KeyError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Tuple_dpp_prelude_SenderKeyIndex_dpp_prelude_RecipientKeyIndex_Vec_u8 { pub o_0 : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_SenderKeyIndex , pub o_1 : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_RecipientKeyIndex , pub o_2 : * mut crate :: fermented :: generics :: Vec_u8 } impl ferment :: FFIConversionFrom < (dpp :: prelude :: SenderKeyIndex , dpp :: prelude :: RecipientKeyIndex , Vec < u8 >) > for Tuple_dpp_prelude_SenderKeyIndex_dpp_prelude_RecipientKeyIndex_Vec_u8 { unsafe fn ffi_from_const (ffi : * const Tuple_dpp_prelude_SenderKeyIndex_dpp_prelude_RecipientKeyIndex_Vec_u8) -> (dpp :: prelude :: SenderKeyIndex , dpp :: prelude :: RecipientKeyIndex , Vec < u8 >) { let ffi_ref = & * ffi ; (ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_0) , ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_1) , ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_2)) } } impl ferment :: FFIConversionTo < (dpp :: prelude :: SenderKeyIndex , dpp :: prelude :: RecipientKeyIndex , Vec < u8 >) > for Tuple_dpp_prelude_SenderKeyIndex_dpp_prelude_RecipientKeyIndex_Vec_u8 { unsafe fn ffi_to_const (obj : (dpp :: prelude :: SenderKeyIndex , dpp :: prelude :: RecipientKeyIndex , Vec < u8 >)) -> * const Tuple_dpp_prelude_SenderKeyIndex_dpp_prelude_RecipientKeyIndex_Vec_u8 { ferment :: boxed (Self { o_0 : ferment :: FFIConversionTo :: ffi_to (obj . 0) , o_1 : ferment :: FFIConversionTo :: ffi_to (obj . 1) , o_2 : ferment :: FFIConversionTo :: ffi_to (obj . 2) }) } } impl Drop for Tuple_dpp_prelude_SenderKeyIndex_dpp_prelude_RecipientKeyIndex_Vec_u8 { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . o_0) ; ferment :: unbox_any (self . o_1) ; ferment :: unbox_any (self . o_2) ; } } } # [no_mangle] pub unsafe extern "C" fn Tuple_dpp_prelude_SenderKeyIndex_dpp_prelude_RecipientKeyIndex_Vec_u8_ctor (o_0 : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_SenderKeyIndex , o_1 : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_RecipientKeyIndex , o_2 : * mut crate :: fermented :: generics :: Vec_u8) -> * mut Tuple_dpp_prelude_SenderKeyIndex_dpp_prelude_RecipientKeyIndex_Vec_u8 { ferment :: boxed (Tuple_dpp_prelude_SenderKeyIndex_dpp_prelude_RecipientKeyIndex_Vec_u8 { o_0 , o_1 , o_2 }) } # [no_mangle] pub unsafe extern "C" fn Tuple_dpp_prelude_SenderKeyIndex_dpp_prelude_RecipientKeyIndex_Vec_u8_destroy (ffi : * mut Tuple_dpp_prelude_SenderKeyIndex_dpp_prelude_RecipientKeyIndex_Vec_u8) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_dpp_identity_identity_public_key_key_type_KeyType_err_dash_spv_crypto_keys_KeyError { pub ok : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType , pub error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError } impl ferment :: FFIConversionFrom < Result < dpp :: identity :: identity_public_key :: key_type :: KeyType , dash_spv_crypto :: keys :: KeyError > > for Result_ok_dpp_identity_identity_public_key_key_type_KeyType_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_from_const (ffi : * const Result_ok_dpp_identity_identity_public_key_key_type_KeyType_err_dash_spv_crypto_keys_KeyError) -> Result < dpp :: identity :: identity_public_key :: key_type :: KeyType , dash_spv_crypto :: keys :: KeyError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: key_type :: KeyType >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: KeyError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < dpp :: identity :: identity_public_key :: key_type :: KeyType , dash_spv_crypto :: keys :: KeyError > > for Result_ok_dpp_identity_identity_public_key_key_type_KeyType_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_to_const (obj : Result < dpp :: identity :: identity_public_key :: key_type :: KeyType , dash_spv_crypto :: keys :: KeyError >) -> * const Result_ok_dpp_identity_identity_public_key_key_type_KeyType_err_dash_spv_crypto_keys_KeyError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_dpp_identity_identity_public_key_key_type_KeyType_err_dash_spv_crypto_keys_KeyError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_dpp_identity_identity_public_key_key_type_KeyType_err_dash_spv_crypto_keys_KeyError_ctor (ok : * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: key_type :: dpp_identity_identity_public_key_key_type_KeyType , error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError) -> * mut Result_ok_dpp_identity_identity_public_key_key_type_KeyType_err_dash_spv_crypto_keys_KeyError { ferment :: boxed (Result_ok_dpp_identity_identity_public_key_key_type_KeyType_err_dash_spv_crypto_keys_KeyError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_dpp_identity_identity_public_key_key_type_KeyType_err_dash_spv_crypto_keys_KeyError_destroy (ffi : * mut Result_ok_dpp_identity_identity_public_key_key_type_KeyType_err_dash_spv_crypto_keys_KeyError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dash_spv_platform_document_usernames_UsernamesManager { pub obj : * mut dash_spv_platform :: document :: usernames :: UsernamesManager } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dash_spv_platform :: document :: usernames :: UsernamesManager > > for std_sync_Arc_dash_spv_platform_document_usernames_UsernamesManager { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dash_spv_platform_document_usernames_UsernamesManager) -> std :: sync :: Arc < dash_spv_platform :: document :: usernames :: UsernamesManager > { let ffi_ref = & * ffi ; std :: sync :: Arc :: from_raw (ffi_ref . obj) } } impl ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_platform :: document :: usernames :: UsernamesManager > > for std_sync_Arc_dash_spv_platform_document_usernames_UsernamesManager { unsafe fn ffi_to_const (obj : std :: sync :: Arc < dash_spv_platform :: document :: usernames :: UsernamesManager >) -> * const std_sync_Arc_dash_spv_platform_document_usernames_UsernamesManager { ferment :: boxed (Self { obj : std :: sync :: Arc :: into_raw (obj) . cast_mut () }) } } impl Drop for std_sync_Arc_dash_spv_platform_document_usernames_UsernamesManager { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . obj) ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_platform_document_usernames_UsernamesManager_ctor (obj : * mut dash_spv_platform :: document :: usernames :: UsernamesManager) -> * mut std_sync_Arc_dash_spv_platform_document_usernames_UsernamesManager { ferment :: boxed (std_sync_Arc_dash_spv_platform_document_usernames_UsernamesManager { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_platform_document_usernames_UsernamesManager_destroy (ffi : * mut std_sync_Arc_dash_spv_platform_document_usernames_UsernamesManager) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , bool) -> Vec < String > > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , bool) -> Vec < String > > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String_ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String_destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32 { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32 } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , [u8 ; 32]) -> u32 > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32 { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , [u8 ; 32]) -> u32 > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32 { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32_ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32 { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32 { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32_destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_u32) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_bool_i32_Arr_u8_32_u32_dash_spv_coinjoin_messages_pool_state_PoolState_dash_spv_coinjoin_messages_pool_message_PoolMessage_dash_spv_coinjoin_messages_pool_status_PoolStatus_Option_std_net_SocketAddr_bool_RTRN_ { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , bool , i32 , * mut crate :: fermented :: generics :: Arr_u8_32 , u32 , * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState , * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage , * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus , * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr , bool) } impl Fn_ARGS_std_os_raw_c_void_bool_i32_Arr_u8_32_u32_dash_spv_coinjoin_messages_pool_state_PoolState_dash_spv_coinjoin_messages_pool_message_PoolMessage_dash_spv_coinjoin_messages_pool_status_PoolStatus_Option_std_net_SocketAddr_bool_RTRN_ { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : bool , o_2 : i32 , o_3 : [u8 ; 32] , o_4 : u32 , o_5 : dash_spv_coinjoin :: messages :: pool_state :: PoolState , o_6 : dash_spv_coinjoin :: messages :: pool_message :: PoolMessage , o_7 : dash_spv_coinjoin :: messages :: pool_status :: PoolStatus , o_8 : Option < std :: net :: SocketAddr > , o_9 : bool) { let ffi_result = (self . caller) (o_0 , o_1 , o_2 , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (o_3) , o_4 , < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_state :: PoolState >> :: ffi_to (o_5) , < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_message :: PoolMessage >> :: ffi_to (o_6) , < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus as ferment :: FFIConversionTo < dash_spv_coinjoin :: messages :: pool_status :: PoolStatus >> :: ffi_to (o_7) , < dash_spv_apple_bindings :: custom :: std :: SocketAddr as ferment :: FFIConversionTo < std :: net :: SocketAddr >> :: ffi_to_opt (o_8) , o_9) ; ffi_result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_bool_i32_Arr_u8_32_u32_dash_spv_coinjoin_messages_pool_state_PoolState_dash_spv_coinjoin_messages_pool_message_PoolMessage_dash_spv_coinjoin_messages_pool_status_PoolStatus_Option_std_net_SocketAddr_bool_RTRN_ { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_bool_i32_Arr_u8_32_u32_dash_spv_coinjoin_messages_pool_state_PoolState_dash_spv_coinjoin_messages_pool_message_PoolMessage_dash_spv_coinjoin_messages_pool_status_PoolStatus_Option_std_net_SocketAddr_bool_RTRN_ { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_bool_i32_Arr_u8_32_u32_dash_spv_coinjoin_messages_pool_state_PoolState_dash_spv_coinjoin_messages_pool_message_PoolMessage_dash_spv_coinjoin_messages_pool_status_PoolStatus_Option_std_net_SocketAddr_bool_RTRN__ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , bool , i32 , * mut crate :: fermented :: generics :: Arr_u8_32 , u32 , * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_state :: dash_spv_coinjoin_messages_pool_state_PoolState , * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_message :: dash_spv_coinjoin_messages_pool_message_PoolMessage , * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: pool_status :: dash_spv_coinjoin_messages_pool_status_PoolStatus , * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr , bool)) -> * mut Fn_ARGS_std_os_raw_c_void_bool_i32_Arr_u8_32_u32_dash_spv_coinjoin_messages_pool_state_PoolState_dash_spv_coinjoin_messages_pool_message_PoolMessage_dash_spv_coinjoin_messages_pool_status_PoolStatus_Option_std_net_SocketAddr_bool_RTRN_ { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_bool_i32_Arr_u8_32_u32_dash_spv_coinjoin_messages_pool_state_PoolState_dash_spv_coinjoin_messages_pool_message_PoolMessage_dash_spv_coinjoin_messages_pool_status_PoolStatus_Option_std_net_SocketAddr_bool_RTRN_ { caller }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_bool_i32_Arr_u8_32_u32_dash_spv_coinjoin_messages_pool_state_PoolState_dash_spv_coinjoin_messages_pool_message_PoolMessage_dash_spv_coinjoin_messages_pool_status_PoolStatus_Option_std_net_SocketAddr_bool_RTRN__destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_bool_i32_Arr_u8_32_u32_dash_spv_coinjoin_messages_pool_state_PoolState_dash_spv_coinjoin_messages_pool_message_PoolMessage_dash_spv_coinjoin_messages_pool_status_PoolStatus_Option_std_net_SocketAddr_bool_RTRN_) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DefinitionName , pub values : * mut * mut crate :: fermented :: types :: platform_value :: platform_value_Value } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: data_contract :: DefinitionName , platform_value :: Value > > for std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value) -> std :: collections :: BTreeMap < dpp :: data_contract :: DefinitionName , platform_value :: Value > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DefinitionName as ferment :: FFIConversionFrom < dpp :: data_contract :: DefinitionName >> :: ffi_from (o) , | o | < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionFrom < platform_value :: Value >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: data_contract :: DefinitionName , platform_value :: Value > > for std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < dpp :: data_contract :: DefinitionName , platform_value :: Value >) -> * const std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value_ctor (count : usize , keys : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DefinitionName , values : * mut * mut crate :: fermented :: types :: platform_value :: platform_value_Value) -> * mut std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value { ferment :: boxed (std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value_destroy (ffi : * mut std_collections_Map_keys_dpp_data_contract_DefinitionName_values_platform_value_Value) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_u8_arr_32_values_dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx { pub count : usize , pub keys : * mut * mut crate :: fermented :: generics :: Arr_u8_32 , pub values : * mut * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx } impl ferment :: FFIConversionFrom < std :: collections :: HashMap < [u8 ; 32] , dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: CoinJoinBroadcastTx > > for std_collections_Map_keys_u8_arr_32_values_dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_u8_arr_32_values_dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx) -> std :: collections :: HashMap < [u8 ; 32] , dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: CoinJoinBroadcastTx > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx as ferment :: FFIConversionFrom < dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: CoinJoinBroadcastTx >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: HashMap < [u8 ; 32] , dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: CoinJoinBroadcastTx > > for std_collections_Map_keys_u8_arr_32_values_dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx { unsafe fn ffi_to_const (obj : std :: collections :: HashMap < [u8 ; 32] , dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: CoinJoinBroadcastTx >) -> * const std_collections_Map_keys_u8_arr_32_values_dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_u8_arr_32_values_dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_u8_arr_32_values_dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx_ctor (count : usize , keys : * mut * mut crate :: fermented :: generics :: Arr_u8_32 , values : * mut * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_broadcast_tx :: dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx) -> * mut std_collections_Map_keys_u8_arr_32_values_dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx { ferment :: boxed (std_collections_Map_keys_u8_arr_32_values_dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_u8_arr_32_values_dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx_destroy (ffi : * mut std_collections_Map_keys_u8_arr_32_values_dash_spv_coinjoin_messages_coinjoin_broadcast_tx_CoinJoinBroadcastTx) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN_ { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN_ } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , dash_spv_masternode_processor :: models :: sync_state :: CacheState) > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN_ { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN_) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , dash_spv_masternode_processor :: models :: sync_state :: CacheState) > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN_ { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN__ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN_) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN_ { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN_ { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN__destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dash_spv_masternode_processor_models_sync_state_CacheState_RTRN_) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction , destructor : unsafe extern "C" fn (* mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction) } impl Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : [u8 ; 32]) -> Option < dashcore :: blockdata :: transaction :: Transaction > { let ffi_result = (self . caller) (o_0 , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (o_1)) ; if ffi_result . is_null () { None } else { let result = < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction as ferment :: FFIConversionFrom < dashcore :: blockdata :: transaction :: Transaction >> :: ffi_from_opt (ffi_result) ; (self . destructor) (ffi_result) ; result } } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction , destructor : unsafe extern "C" fn (* mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: dashcore_blockdata_transaction_Transaction)) -> * mut Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_blockdata_transaction_Transaction) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dash_spv_coinjoin :: coin_selection :: compact_tally_item :: dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem } impl ferment :: FFIConversionFrom < Vec < dash_spv_coinjoin :: coin_selection :: compact_tally_item :: CompactTallyItem > > for Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { unsafe fn ffi_from_const (ffi : * const Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem) -> Vec < dash_spv_coinjoin :: coin_selection :: compact_tally_item :: CompactTallyItem > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dash_spv_coinjoin :: coin_selection :: compact_tally_item :: CompactTallyItem > > for Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { unsafe fn ffi_to_const (obj : Vec < dash_spv_coinjoin :: coin_selection :: compact_tally_item :: CompactTallyItem >) -> * const Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dash_spv_coinjoin :: coin_selection :: compact_tally_item :: dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem) -> * mut Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { ferment :: boxed (Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem_destroy (ffi : * mut Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_bool_err_dashcore_sml_message_verification_error_MessageVerificationError { pub ok : * mut bool , pub error : * mut dashcore :: sml :: message_verification_error :: MessageVerificationError } impl ferment :: FFIConversionFrom < Result < bool , dashcore :: sml :: message_verification_error :: MessageVerificationError > > for Result_ok_bool_err_dashcore_sml_message_verification_error_MessageVerificationError { unsafe fn ffi_from_const (ffi : * const Result_ok_bool_err_dashcore_sml_message_verification_error_MessageVerificationError) -> Result < bool , dashcore :: sml :: message_verification_error :: MessageVerificationError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | * o , ffi_ref . error , | o | (& * o) . clone ()) } } impl ferment :: FFIConversionTo < Result < bool , dashcore :: sml :: message_verification_error :: MessageVerificationError > > for Result_ok_bool_err_dashcore_sml_message_verification_error_MessageVerificationError { unsafe fn ffi_to_const (obj : Result < bool , dashcore :: sml :: message_verification_error :: MessageVerificationError >) -> * const Result_ok_bool_err_dashcore_sml_message_verification_error_MessageVerificationError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: boxed (o) , | o | ferment :: boxed (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_bool_err_dashcore_sml_message_verification_error_MessageVerificationError { fn drop (& mut self) { unsafe { ferment :: destroy_opt_primitive (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_bool_err_dashcore_sml_message_verification_error_MessageVerificationError_ctor (ok : * mut bool , error : * mut dashcore :: sml :: message_verification_error :: MessageVerificationError) -> * mut Result_ok_bool_err_dashcore_sml_message_verification_error_MessageVerificationError { ferment :: boxed (Result_ok_bool_err_dashcore_sml_message_verification_error_MessageVerificationError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_bool_err_dashcore_sml_message_verification_error_MessageVerificationError_destroy (ffi : * mut Result_ok_bool_err_dashcore_sml_message_verification_error_MessageVerificationError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dpp_data_contract_document_type_property_array_ArrayItemType { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: array :: dpp_data_contract_document_type_property_array_ArrayItemType } impl ferment :: FFIConversionFrom < Vec < dpp :: data_contract :: document_type :: property :: array :: ArrayItemType > > for Vec_dpp_data_contract_document_type_property_array_ArrayItemType { unsafe fn ffi_from_const (ffi : * const Vec_dpp_data_contract_document_type_property_array_ArrayItemType) -> Vec < dpp :: data_contract :: document_type :: property :: array :: ArrayItemType > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dpp :: data_contract :: document_type :: property :: array :: ArrayItemType > > for Vec_dpp_data_contract_document_type_property_array_ArrayItemType { unsafe fn ffi_to_const (obj : Vec < dpp :: data_contract :: document_type :: property :: array :: ArrayItemType >) -> * const Vec_dpp_data_contract_document_type_property_array_ArrayItemType { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dpp_data_contract_document_type_property_array_ArrayItemType { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_data_contract_document_type_property_array_ArrayItemType_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: property :: array :: dpp_data_contract_document_type_property_array_ArrayItemType) -> * mut Vec_dpp_data_contract_document_type_property_array_ArrayItemType { ferment :: boxed (Vec_dpp_data_contract_document_type_property_array_ArrayItemType { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_data_contract_document_type_property_array_ArrayItemType_destroy (ffi : * mut Vec_dpp_data_contract_document_type_property_array_ArrayItemType) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_u32 { pub count : usize , pub values : * mut u32 } impl ferment :: FFIConversionFrom < Vec < u32 > > for Vec_u32 { unsafe fn ffi_from_const (ffi : * const Vec_u32) -> Vec < u32 > { let ffi_ref = & * ffi ; ferment :: from_primitive_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < u32 > > for Vec_u32 { unsafe fn ffi_to_const (obj : Vec < u32 >) -> * const Vec_u32 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_primitive_group (obj . into_iter ()) }) } } impl Drop for Vec_u32 { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_u32_ctor (count : usize , values : * mut u32) -> * mut Vec_u32 { ferment :: boxed (Vec_u32 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_u32_destroy (ffi : * mut Vec_u32) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , Vec < dashcore :: blockdata :: transaction :: txout :: TxOut > , dash_spv_coinjoin :: models :: coin_control :: CoinControl , bool , [u8 ; 32]) -> bool > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , Vec < dashcore :: blockdata :: transaction :: txout :: TxOut > , dash_spv_coinjoin :: models :: coin_control :: CoinControl , bool , [u8 ; 32]) -> bool > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 , o_2 , o_3 , o_4 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1 , o_2 , o_3 , o_4) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool_ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool_destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_Vec_dashcore_blockdata_transaction_txout_TxOut_dash_spv_coinjoin_models_coin_control_CoinControl_bool_Arr_u8_32_RTRN_bool) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dash_sdk_sdk_Sdk { pub obj : * mut dash_sdk :: sdk :: Sdk } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dash_sdk :: sdk :: Sdk > > for std_sync_Arc_dash_sdk_sdk_Sdk { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dash_sdk_sdk_Sdk) -> std :: sync :: Arc < dash_sdk :: sdk :: Sdk > { let ffi_ref = & * ffi ; std :: sync :: Arc :: from_raw (ffi_ref . obj) } } impl ferment :: FFIConversionTo < std :: sync :: Arc < dash_sdk :: sdk :: Sdk > > for std_sync_Arc_dash_sdk_sdk_Sdk { unsafe fn ffi_to_const (obj : std :: sync :: Arc < dash_sdk :: sdk :: Sdk >) -> * const std_sync_Arc_dash_sdk_sdk_Sdk { ferment :: boxed (Self { obj : std :: sync :: Arc :: into_raw (obj) . cast_mut () }) } } impl Drop for std_sync_Arc_dash_sdk_sdk_Sdk { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . obj) ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_sdk_sdk_Sdk_ctor (obj : * mut dash_sdk :: sdk :: Sdk) -> * mut std_sync_Arc_dash_sdk_sdk_Sdk { ferment :: boxed (std_sync_Arc_dash_sdk_sdk_Sdk { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_sdk_sdk_Sdk_destroy (ffi : * mut std_sync_Arc_dash_sdk_sdk_Sdk) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_level_IndexLevel { pub count : usize , pub keys : * mut * mut std :: os :: raw :: c_char , pub values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexLevel } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < String , dpp :: data_contract :: document_type :: index_level :: IndexLevel > > for std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_level_IndexLevel { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_level_IndexLevel) -> std :: collections :: BTreeMap < String , dpp :: data_contract :: document_type :: index_level :: IndexLevel > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexLevel as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: index_level :: IndexLevel >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < String , dpp :: data_contract :: document_type :: index_level :: IndexLevel > > for std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_level_IndexLevel { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < String , dpp :: data_contract :: document_type :: index_level :: IndexLevel >) -> * const std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_level_IndexLevel { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_level_IndexLevel { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr_composer (self . keys , self . count , ferment :: unbox_string) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_level_IndexLevel_ctor (count : usize , keys : * mut * mut std :: os :: raw :: c_char , values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index_level :: dpp_data_contract_document_type_index_level_IndexLevel) -> * mut std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_level_IndexLevel { ferment :: boxed (std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_level_IndexLevel { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_level_IndexLevel_destroy (ffi : * mut std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_level_IndexLevel) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_dashcore_hash_types_BlockHash_values_dashcore_network_message_qrinfo_QuorumSnapshot { pub count : usize , pub keys : * mut * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash , pub values : * mut * mut crate :: fermented :: types :: dashcore :: network :: message_qrinfo :: dashcore_network_message_qrinfo_QuorumSnapshot } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dashcore :: hash_types :: BlockHash , dashcore :: network :: message_qrinfo :: QuorumSnapshot > > for std_collections_Map_keys_dashcore_hash_types_BlockHash_values_dashcore_network_message_qrinfo_QuorumSnapshot { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_dashcore_hash_types_BlockHash_values_dashcore_network_message_qrinfo_QuorumSnapshot) -> std :: collections :: BTreeMap < dashcore :: hash_types :: BlockHash , dashcore :: network :: message_qrinfo :: QuorumSnapshot > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: BlockHash >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dashcore :: network :: message_qrinfo :: dashcore_network_message_qrinfo_QuorumSnapshot as ferment :: FFIConversionFrom < dashcore :: network :: message_qrinfo :: QuorumSnapshot >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < dashcore :: hash_types :: BlockHash , dashcore :: network :: message_qrinfo :: QuorumSnapshot > > for std_collections_Map_keys_dashcore_hash_types_BlockHash_values_dashcore_network_message_qrinfo_QuorumSnapshot { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < dashcore :: hash_types :: BlockHash , dashcore :: network :: message_qrinfo :: QuorumSnapshot >) -> * const std_collections_Map_keys_dashcore_hash_types_BlockHash_values_dashcore_network_message_qrinfo_QuorumSnapshot { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_dashcore_hash_types_BlockHash_values_dashcore_network_message_qrinfo_QuorumSnapshot { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dashcore_hash_types_BlockHash_values_dashcore_network_message_qrinfo_QuorumSnapshot_ctor (count : usize , keys : * mut * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash , values : * mut * mut crate :: fermented :: types :: dashcore :: network :: message_qrinfo :: dashcore_network_message_qrinfo_QuorumSnapshot) -> * mut std_collections_Map_keys_dashcore_hash_types_BlockHash_values_dashcore_network_message_qrinfo_QuorumSnapshot { ferment :: boxed (std_collections_Map_keys_dashcore_hash_types_BlockHash_values_dashcore_network_message_qrinfo_QuorumSnapshot { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dashcore_hash_types_BlockHash_values_dashcore_network_message_qrinfo_QuorumSnapshot_destroy (ffi : * mut std_collections_Map_keys_dashcore_hash_types_BlockHash_values_dashcore_network_message_qrinfo_QuorumSnapshot) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { pub count : usize , pub keys : * mut * mut std :: os :: raw :: c_char , pub values : * mut * mut crate :: fermented :: generics :: std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < String , std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > > > for std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity) -> std :: collections :: BTreeMap < String , std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (o) , | o | < crate :: fermented :: generics :: std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < String , std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > > > for std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < String , std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > >) -> * const std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr_composer (self . keys , self . count , ferment :: unbox_string) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_ctor (count : usize , keys : * mut * mut std :: os :: raw :: c_char , values : * mut * mut crate :: fermented :: generics :: std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity) -> * mut std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { ferment :: boxed (std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_destroy (ffi : * mut std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity) { ferment :: unbox_any (ffi) ; } # [cfg (any (any (feature = "state-transitions")))] # [repr (C)] # [derive (Clone)] # [cfg (any (any (feature = "state-transitions")))] pub struct Tuple_String_dpp_balances_credits_Credits { pub o_0 : * mut std :: os :: raw :: c_char , pub o_1 : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl ferment :: FFIConversionFrom < (String , dpp :: balances :: credits :: Credits) > for Tuple_String_dpp_balances_credits_Credits { unsafe fn ffi_from_const (ffi : * const Tuple_String_dpp_balances_credits_Credits) -> (String , dpp :: balances :: credits :: Credits) { let ffi_ref = & * ffi ; (ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_0) , ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_1)) } } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl ferment :: FFIConversionTo < (String , dpp :: balances :: credits :: Credits) > for Tuple_String_dpp_balances_credits_Credits { unsafe fn ffi_to_const (obj : (String , dpp :: balances :: credits :: Credits)) -> * const Tuple_String_dpp_balances_credits_Credits { ferment :: boxed (Self { o_0 : ferment :: FFIConversionTo :: ffi_to (obj . 0) , o_1 : ferment :: FFIConversionTo :: ffi_to (obj . 1) }) } } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl Drop for Tuple_String_dpp_balances_credits_Credits { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . o_0) ; ferment :: unbox_any (self . o_1) ; } } } # [cfg (any (any (feature = "state-transitions")))] # [no_mangle] pub unsafe extern "C" fn Tuple_String_dpp_balances_credits_Credits_ctor (o_0 : * mut std :: os :: raw :: c_char , o_1 : * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_Credits) -> * mut Tuple_String_dpp_balances_credits_Credits { ferment :: boxed (Tuple_String_dpp_balances_credits_Credits { o_0 , o_1 }) } # [cfg (any (any (feature = "state-transitions")))] # [no_mangle] pub unsafe extern "C" fn Tuple_String_dpp_balances_credits_Credits_destroy (ffi : * mut Tuple_String_dpp_balances_credits_Credits) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , bool , dash_spv_coinjoin :: models :: coin_control :: CoinControl , & dash_spv_coinjoin :: wallet_ex :: WalletEx) -> Vec < dash_spv_coinjoin :: coin_selection :: input_coin :: InputCoin > > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , bool , dash_spv_coinjoin :: models :: coin_control :: CoinControl , & dash_spv_coinjoin :: wallet_ex :: WalletEx) -> Vec < dash_spv_coinjoin :: coin_selection :: input_coin :: InputCoin > > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 , o_2 , o_3 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1 , o_2 , o_3) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin_ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin_destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_dash_spv_crypto_keys_ed25519_key_ED25519Key_err_dash_spv_crypto_keys_KeyError { pub ok : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key , pub error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError } impl ferment :: FFIConversionFrom < Result < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key , dash_spv_crypto :: keys :: KeyError > > for Result_ok_dash_spv_crypto_keys_ed25519_key_ED25519Key_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_from_const (ffi : * const Result_ok_dash_spv_crypto_keys_ed25519_key_ED25519Key_err_dash_spv_crypto_keys_KeyError) -> Result < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key , dash_spv_crypto :: keys :: KeyError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | (& * o) . clone () , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: KeyError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key , dash_spv_crypto :: keys :: KeyError > > for Result_ok_dash_spv_crypto_keys_ed25519_key_ED25519Key_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_to_const (obj : Result < dash_spv_crypto :: keys :: ed25519_key :: ED25519Key , dash_spv_crypto :: keys :: KeyError >) -> * const Result_ok_dash_spv_crypto_keys_ed25519_key_ED25519Key_err_dash_spv_crypto_keys_KeyError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: boxed (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_dash_spv_crypto_keys_ed25519_key_ED25519Key_err_dash_spv_crypto_keys_KeyError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_dash_spv_crypto_keys_ed25519_key_ED25519Key_err_dash_spv_crypto_keys_KeyError_ctor (ok : * mut dash_spv_crypto :: keys :: ed25519_key :: ED25519Key , error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError) -> * mut Result_ok_dash_spv_crypto_keys_ed25519_key_ED25519Key_err_dash_spv_crypto_keys_KeyError { ferment :: boxed (Result_ok_dash_spv_crypto_keys_ed25519_key_ED25519Key_err_dash_spv_crypto_keys_KeyError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_dash_spv_crypto_keys_ed25519_key_ED25519Key_err_dash_spv_crypto_keys_KeyError_destroy (ffi : * mut Result_ok_dash_spv_crypto_keys_ed25519_key_ED25519Key_err_dash_spv_crypto_keys_KeyError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_entry :: dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry } impl ferment :: FFIConversionFrom < Vec < dash_spv_coinjoin :: messages :: coinjoin_entry :: CoinJoinEntry > > for Vec_dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry { unsafe fn ffi_from_const (ffi : * const Vec_dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry) -> Vec < dash_spv_coinjoin :: messages :: coinjoin_entry :: CoinJoinEntry > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dash_spv_coinjoin :: messages :: coinjoin_entry :: CoinJoinEntry > > for Vec_dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry { unsafe fn ffi_to_const (obj : Vec < dash_spv_coinjoin :: messages :: coinjoin_entry :: CoinJoinEntry >) -> * const Vec_dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dash_spv_coinjoin :: messages :: coinjoin_entry :: dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry) -> * mut Vec_dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry { ferment :: boxed (Vec_dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry_destroy (ffi : * mut Vec_dash_spv_coinjoin_messages_coinjoin_entry_CoinJoinEntry) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { pub ok : * mut crate :: fermented :: generics :: Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash , pub error : * mut crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: processor :: processing_error :: dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError } impl ferment :: FFIConversionFrom < Result < (dashcore :: hash_types :: BlockHash , dashcore :: hash_types :: BlockHash) , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError > > for Result_Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { unsafe fn ffi_from_const (ffi : * const Result_Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError) -> Result < (dashcore :: hash_types :: BlockHash , dashcore :: hash_types :: BlockHash) , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: generics :: Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash as ferment :: FFIConversionFrom < (dashcore :: hash_types :: BlockHash , dashcore :: hash_types :: BlockHash) >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: processor :: processing_error :: dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError as ferment :: FFIConversionFrom < dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < (dashcore :: hash_types :: BlockHash , dashcore :: hash_types :: BlockHash) , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError > > for Result_Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { unsafe fn ffi_to_const (obj : Result < (dashcore :: hash_types :: BlockHash , dashcore :: hash_types :: BlockHash) , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError >) -> * const Result_Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_ctor (ok : * mut crate :: fermented :: generics :: Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash , error : * mut crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: processor :: processing_error :: dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError) -> * mut Result_Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed (Result_Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_destroy (ffi : * mut Result_Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError) { ferment :: unbox_any (ffi) ; } # [cfg (any (any (feature = "state-transitions")))] # [repr (C)] # [derive (Clone)] # [cfg (any (any (feature = "state-transitions")))] pub struct std_collections_Map_keys_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_values_Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType , pub values : * mut * mut crate :: fermented :: generics :: Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl < 'a > ferment :: FFIConversionFrom < std :: collections :: HashMap < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType , Vec < (dpp :: document :: Document , dpp :: data_contract :: document_type :: DocumentTypeRef < 'a > , platform_value :: types :: bytes_32 :: Bytes32) > > > for std_collections_Map_keys_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_values_Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_values_Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32) -> std :: collections :: HashMap < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType , Vec < (dpp :: document :: Document , dpp :: data_contract :: document_type :: DocumentTypeRef < 'a > , platform_value :: types :: bytes_32 :: Bytes32) > > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType >> :: ffi_from (o) , | o | < crate :: fermented :: generics :: Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 as ferment :: FFIConversionFrom < Vec < (dpp :: document :: Document , dpp :: data_contract :: document_type :: DocumentTypeRef < 'a > , platform_value :: types :: bytes_32 :: Bytes32) > >> :: ffi_from (o)) } } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl < 'a > ferment :: FFIConversionTo < std :: collections :: HashMap < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType , Vec < (dpp :: document :: Document , dpp :: data_contract :: document_type :: DocumentTypeRef < 'a > , platform_value :: types :: bytes_32 :: Bytes32) > > > for std_collections_Map_keys_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_values_Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { unsafe fn ffi_to_const (obj : std :: collections :: HashMap < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: DocumentTransitionActionType , Vec < (dpp :: document :: Document , dpp :: data_contract :: document_type :: DocumentTypeRef < 'a > , platform_value :: types :: bytes_32 :: Bytes32) > >) -> * const std_collections_Map_keys_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_values_Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl Drop for std_collections_Map_keys_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_values_Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [cfg (any (any (feature = "state-transitions")))] # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_values_Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32_ctor (count : usize , keys : * mut * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition_action_type :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType , values : * mut * mut crate :: fermented :: generics :: Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32) -> * mut std_collections_Map_keys_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_values_Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { ferment :: boxed (std_collections_Map_keys_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_values_Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { count , keys , values }) } # [cfg (any (any (feature = "state-transitions")))] # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_values_Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32_destroy (ffi : * mut std_collections_Map_keys_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_action_type_DocumentTransitionActionType_values_Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_dash_spv_keychain_KeyChainKey_dash_spv_keychain_KeyChainValue_bool_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError { caller : unsafe extern "C" fn (* mut crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainKey , * mut crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainValue , bool) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_keychain_KeyChainError , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_keychain_KeyChainError) } impl Fn_ARGS_dash_spv_keychain_KeyChainKey_dash_spv_keychain_KeyChainValue_bool_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError { pub unsafe fn call (& self , o_0 : dash_spv_keychain :: KeyChainKey , o_1 : dash_spv_keychain :: KeyChainValue , o_2 : bool) -> Result < bool , dash_spv_keychain :: KeyChainError > { let ffi_result = (self . caller) (< crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainKey as ferment :: FFIConversionTo < dash_spv_keychain :: KeyChainKey >> :: ffi_to (o_0) , < crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainValue as ferment :: FFIConversionTo < dash_spv_keychain :: KeyChainValue >> :: ffi_to (o_1) , o_2) ; let result = < crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_keychain_KeyChainError as ferment :: FFIConversionFrom < Result < bool , dash_spv_keychain :: KeyChainError > >> :: ffi_from (ffi_result) ; (self . destructor) (ffi_result) ; result } } unsafe impl Send for Fn_ARGS_dash_spv_keychain_KeyChainKey_dash_spv_keychain_KeyChainValue_bool_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError { } unsafe impl Sync for Fn_ARGS_dash_spv_keychain_KeyChainKey_dash_spv_keychain_KeyChainValue_bool_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_dash_spv_keychain_KeyChainKey_dash_spv_keychain_KeyChainValue_bool_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError_ctor (caller : unsafe extern "C" fn (* mut crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainKey , * mut crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainValue , bool) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_keychain_KeyChainError , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_keychain_KeyChainError)) -> * mut Fn_ARGS_dash_spv_keychain_KeyChainKey_dash_spv_keychain_KeyChainValue_bool_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError { ferment :: boxed (Fn_ARGS_dash_spv_keychain_KeyChainKey_dash_spv_keychain_KeyChainValue_bool_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_dash_spv_keychain_KeyChainKey_dash_spv_keychain_KeyChainValue_bool_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError_destroy (ffi : * mut Fn_ARGS_dash_spv_keychain_KeyChainKey_dash_spv_keychain_KeyChainValue_bool_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_Index { pub count : usize , pub keys : * mut * mut std :: os :: raw :: c_char , pub values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_Index } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < String , dpp :: data_contract :: document_type :: index :: Index > > for std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_Index { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_Index) -> std :: collections :: BTreeMap < String , dpp :: data_contract :: document_type :: index :: Index > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_Index as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: index :: Index >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < String , dpp :: data_contract :: document_type :: index :: Index > > for std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_Index { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < String , dpp :: data_contract :: document_type :: index :: Index >) -> * const std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_Index { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_Index { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr_composer (self . keys , self . count , ferment :: unbox_string) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_Index_ctor (count : usize , keys : * mut * mut std :: os :: raw :: c_char , values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_Index) -> * mut std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_Index { ferment :: boxed (std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_Index { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_Index_destroy (ffi : * mut std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_Index) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , bool , * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinControl , * mut dash_spv_coinjoin :: wallet_ex :: WalletEx) -> * mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin) } impl Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : bool , o_2 : dash_spv_coinjoin :: models :: coin_control :: CoinControl , o_3 : & dash_spv_coinjoin :: wallet_ex :: WalletEx) -> Vec < dash_spv_coinjoin :: coin_selection :: input_coin :: InputCoin > { let ffi_result = (self . caller) (o_0 , o_1 , < crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinControl as ferment :: FFIConversionTo < dash_spv_coinjoin :: models :: coin_control :: CoinControl >> :: ffi_to (o_2) , ferment :: boxed (o_3 . clone ())) ; let result = < crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin as ferment :: FFIConversionFrom < Vec < dash_spv_coinjoin :: coin_selection :: input_coin :: InputCoin > >> :: ffi_from (ffi_result) ; (self . destructor) (ffi_result) ; result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , bool , * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coin_control :: dash_spv_coinjoin_models_coin_control_CoinControl , * mut dash_spv_coinjoin :: wallet_ex :: WalletEx) -> * mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin)) -> * mut Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_bool_dash_spv_coinjoin_models_coin_control_CoinControl_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_input_coin_InputCoin) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition , pub values : * mut * mut dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationFFI } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: data_contract :: TokenContractPosition , dpp :: data_contract :: associated_token :: token_configuration :: TokenConfiguration > > for std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration) -> std :: collections :: BTreeMap < dpp :: data_contract :: TokenContractPosition , dpp :: data_contract :: associated_token :: token_configuration :: TokenConfiguration > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition as ferment :: FFIConversionFrom < dpp :: data_contract :: TokenContractPosition >> :: ffi_from (o) , | o | < dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationFFI as ferment :: FFIConversionFrom < dpp :: data_contract :: associated_token :: token_configuration :: TokenConfiguration >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: data_contract :: TokenContractPosition , dpp :: data_contract :: associated_token :: token_configuration :: TokenConfiguration > > for std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < dpp :: data_contract :: TokenContractPosition , dpp :: data_contract :: associated_token :: token_configuration :: TokenConfiguration >) -> * const std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration_ctor (count : usize , keys : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_TokenContractPosition , values : * mut * mut dash_spv_apple_bindings :: custom :: dpp :: TokenConfigurationFFI) -> * mut std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration { ferment :: boxed (std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration_destroy (ffi : * mut std_collections_Map_keys_dpp_data_contract_TokenContractPosition_values_dpp_data_contract_associated_token_token_configuration_TokenConfiguration) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError { caller : unsafe extern "C" fn (* mut crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainKey) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError) } impl Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError { pub unsafe fn call (& self , o_0 : dash_spv_keychain :: KeyChainKey) -> Result < dash_spv_keychain :: KeyChainValue , dash_spv_keychain :: KeyChainError > { let ffi_result = (self . caller) (< crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainKey as ferment :: FFIConversionTo < dash_spv_keychain :: KeyChainKey >> :: ffi_to (o_0)) ; let result = < crate :: fermented :: generics :: Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError as ferment :: FFIConversionFrom < Result < dash_spv_keychain :: KeyChainValue , dash_spv_keychain :: KeyChainError > >> :: ffi_from (ffi_result) ; (self . destructor) (ffi_result) ; result } } unsafe impl Send for Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError { } unsafe impl Sync for Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError_ctor (caller : unsafe extern "C" fn (* mut crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainKey) -> * mut crate :: fermented :: generics :: Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError)) -> * mut Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError { ferment :: boxed (Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError_destroy (ffi : * mut Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_dash_spv_keychain_KeyChainValue_err_dash_spv_keychain_KeyChainError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , dashcore :: blockdata :: transaction :: Transaction , bool) -> Option < dashcore :: blockdata :: transaction :: Transaction > > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , dashcore :: blockdata :: transaction :: Transaction , bool) -> Option < dashcore :: blockdata :: transaction :: Transaction > > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 , o_2 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1 , o_2) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction_ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction_destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_Transaction_bool_RTRN_Option_dashcore_blockdata_transaction_Transaction) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Tuple_Arr_u8_16_u16 { pub o_0 : * mut crate :: fermented :: generics :: Arr_u8_16 , pub o_1 : u16 } impl ferment :: FFIConversionFrom < ([u8 ; 16] , u16) > for Tuple_Arr_u8_16_u16 { unsafe fn ffi_from_const (ffi : * const Tuple_Arr_u8_16_u16) -> ([u8 ; 16] , u16) { let ffi_ref = & * ffi ; (ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_0) , ffi_ref . o_1) } } impl ferment :: FFIConversionTo < ([u8 ; 16] , u16) > for Tuple_Arr_u8_16_u16 { unsafe fn ffi_to_const (obj : ([u8 ; 16] , u16)) -> * const Tuple_Arr_u8_16_u16 { ferment :: boxed (Self { o_0 : ferment :: FFIConversionTo :: ffi_to (obj . 0) , o_1 : obj . 1 }) } } impl Drop for Tuple_Arr_u8_16_u16 { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . o_0) ; ; } } } # [no_mangle] pub unsafe extern "C" fn Tuple_Arr_u8_16_u16_ctor (o_0 : * mut crate :: fermented :: generics :: Arr_u8_16 , o_1 : u16) -> * mut Tuple_Arr_u8_16_u16 { ferment :: boxed (Tuple_Arr_u8_16_u16 { o_0 , o_1 }) } # [no_mangle] pub unsafe extern "C" fn Tuple_Arr_u8_16_u16_destroy (ffi : * mut Tuple_Arr_u8_16_u16) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , std :: net :: SocketAddr) -> bool > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , std :: net :: SocketAddr) -> bool > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool_ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool_destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_std_net_SocketAddr_RTRN_bool) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: generics :: Arr_u8_32 , * mut crate :: fermented :: generics :: Arr_u8_32) -> bool , destructor : unsafe extern "C" fn (bool) } impl Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : [u8 ; 32] , o_2 : [u8 ; 32]) -> bool { let ffi_result = (self . caller) (o_0 , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (o_1) , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (o_2)) ; ffi_result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: generics :: Arr_u8_32 , * mut crate :: fermented :: generics :: Arr_u8_32) -> bool , destructor : unsafe extern "C" fn (bool)) -> * mut Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_Arr_u8_32_Arr_u8_32_RTRN_bool) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Arr_u8_2 { pub count : usize , pub values : * mut u8 } impl ferment :: FFIConversionFrom < [u8 ; 2] > for Arr_u8_2 { unsafe fn ffi_from_const (ffi : * const Arr_u8_2) -> [u8 ; 2] { let ffi_ref = & * ffi ; let vec : Vec < u8 > = ferment :: from_primitive_group (ffi_ref . values , ffi_ref . count) ; vec . try_into () . unwrap () } } impl ferment :: FFIConversionTo < [u8 ; 2] > for Arr_u8_2 { unsafe fn ffi_to_const (obj : [u8 ; 2]) -> * const Arr_u8_2 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_primitive_group (obj . into_iter ()) }) } } impl Drop for Arr_u8_2 { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Arr_u8_2_ctor (count : usize , values : * mut u8) -> * mut Arr_u8_2 { ferment :: boxed (Arr_u8_2 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Arr_u8_2_destroy (ffi : * mut Arr_u8_2) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_Vec_String_err_dash_spv_crypto_keys_KeyError { pub ok : * mut crate :: fermented :: generics :: Vec_String , pub error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError } impl ferment :: FFIConversionFrom < Result < Vec < String > , dash_spv_crypto :: keys :: KeyError > > for Result_ok_Vec_String_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_from_const (ffi : * const Result_ok_Vec_String_err_dash_spv_crypto_keys_KeyError) -> Result < Vec < String > , dash_spv_crypto :: keys :: KeyError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionFrom < Vec < String > >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: KeyError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < Vec < String > , dash_spv_crypto :: keys :: KeyError > > for Result_ok_Vec_String_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_to_const (obj : Result < Vec < String > , dash_spv_crypto :: keys :: KeyError >) -> * const Result_ok_Vec_String_err_dash_spv_crypto_keys_KeyError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_Vec_String_err_dash_spv_crypto_keys_KeyError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_Vec_String_err_dash_spv_crypto_keys_KeyError_ctor (ok : * mut crate :: fermented :: generics :: Vec_String , error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError) -> * mut Result_ok_Vec_String_err_dash_spv_crypto_keys_KeyError { ferment :: boxed (Result_ok_Vec_String_err_dash_spv_crypto_keys_KeyError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_Vec_String_err_dash_spv_crypto_keys_KeyError_destroy (ffi : * mut Result_ok_Vec_String_err_dash_spv_crypto_keys_KeyError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , bool) -> * mut crate :: fermented :: generics :: Vec_String , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Vec_String) } impl Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : bool) -> Vec < String > { let ffi_result = (self . caller) (o_0 , o_1) ; let result = < crate :: fermented :: generics :: Vec_String as ferment :: FFIConversionFrom < Vec < String > >> :: ffi_from (ffi_result) ; (self . destructor) (ffi_result) ; result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , bool) -> * mut crate :: fermented :: generics :: Vec_String , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Vec_String)) -> * mut Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_bool_RTRN_Vec_String) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry } impl ferment :: FFIConversionFrom < Vec < dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry > > for Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { unsafe fn ffi_from_const (ffi : * const Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry) -> Vec < dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry > > for Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { unsafe fn ffi_to_const (obj : Vec < dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry >) -> * const Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry) -> * mut Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { ferment :: boxed (Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_destroy (ffi : * mut Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut std :: os :: raw :: c_char , * mut crate :: fermented :: generics :: Vec_u8 , * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr , bool) -> bool , destructor : unsafe extern "C" fn (bool) } impl Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : String , o_2 : Vec < u8 > , o_3 : std :: net :: SocketAddr , o_4 : bool) -> bool { let ffi_result = (self . caller) (o_0 , < std :: os :: raw :: c_char as ferment :: FFIConversionTo < String >> :: ffi_to (o_1) , < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionTo < Vec < u8 > >> :: ffi_to (o_2) , < dash_spv_apple_bindings :: custom :: std :: SocketAddr as ferment :: FFIConversionTo < std :: net :: SocketAddr >> :: ffi_to (o_3) , o_4) ; ffi_result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut std :: os :: raw :: c_char , * mut crate :: fermented :: generics :: Vec_u8 , * mut dash_spv_apple_bindings :: custom :: std :: SocketAddr , bool) -> bool , destructor : unsafe extern "C" fn (bool)) -> * mut Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_String_Vec_u8_std_net_SocketAddr_bool_RTRN_bool) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Arr_u8_36 { pub count : usize , pub values : * mut u8 } impl ferment :: FFIConversionFrom < [u8 ; 36] > for Arr_u8_36 { unsafe fn ffi_from_const (ffi : * const Arr_u8_36) -> [u8 ; 36] { let ffi_ref = & * ffi ; let vec : Vec < u8 > = ferment :: from_primitive_group (ffi_ref . values , ffi_ref . count) ; vec . try_into () . unwrap () } } impl ferment :: FFIConversionTo < [u8 ; 36] > for Arr_u8_36 { unsafe fn ffi_to_const (obj : [u8 ; 36]) -> * const Arr_u8_36 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_primitive_group (obj . into_iter ()) }) } } impl Drop for Arr_u8_36 { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Arr_u8_36_ctor (count : usize , values : * mut u8) -> * mut Arr_u8_36 { ferment :: boxed (Arr_u8_36 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Arr_u8_36_destroy (ffi : * mut Arr_u8_36) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Arr_dashcore_bls_sig_utils_BLSSignature_4 { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature } impl ferment :: FFIConversionFrom < [dashcore :: bls_sig_utils :: BLSSignature ; 4] > for Arr_dashcore_bls_sig_utils_BLSSignature_4 { unsafe fn ffi_from_const (ffi : * const Arr_dashcore_bls_sig_utils_BLSSignature_4) -> [dashcore :: bls_sig_utils :: BLSSignature ; 4] { let ffi_ref = & * ffi ; let vec : Vec < dashcore :: bls_sig_utils :: BLSSignature > = ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) ; vec . try_into () . unwrap () } } impl ferment :: FFIConversionTo < [dashcore :: bls_sig_utils :: BLSSignature ; 4] > for Arr_dashcore_bls_sig_utils_BLSSignature_4 { unsafe fn ffi_to_const (obj : [dashcore :: bls_sig_utils :: BLSSignature ; 4]) -> * const Arr_dashcore_bls_sig_utils_BLSSignature_4 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Arr_dashcore_bls_sig_utils_BLSSignature_4 { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Arr_dashcore_bls_sig_utils_BLSSignature_4_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature) -> * mut Arr_dashcore_bls_sig_utils_BLSSignature_4 { ferment :: boxed (Arr_dashcore_bls_sig_utils_BLSSignature_4 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Arr_dashcore_bls_sig_utils_BLSSignature_4_destroy (ffi : * mut Arr_dashcore_bls_sig_utils_BLSSignature_4) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_String_values_platform_value_Value { pub count : usize , pub keys : * mut * mut std :: os :: raw :: c_char , pub values : * mut * mut crate :: fermented :: types :: platform_value :: platform_value_Value } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < String , platform_value :: Value > > for std_collections_Map_keys_String_values_platform_value_Value { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_String_values_platform_value_Value) -> std :: collections :: BTreeMap < String , platform_value :: Value > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (o) , | o | < crate :: fermented :: types :: platform_value :: platform_value_Value as ferment :: FFIConversionFrom < platform_value :: Value >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < String , platform_value :: Value > > for std_collections_Map_keys_String_values_platform_value_Value { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < String , platform_value :: Value >) -> * const std_collections_Map_keys_String_values_platform_value_Value { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_String_values_platform_value_Value { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr_composer (self . keys , self . count , ferment :: unbox_string) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_String_values_platform_value_Value_ctor (count : usize , keys : * mut * mut std :: os :: raw :: c_char , values : * mut * mut crate :: fermented :: types :: platform_value :: platform_value_Value) -> * mut std_collections_Map_keys_String_values_platform_value_Value { ferment :: boxed (std_collections_Map_keys_String_values_platform_value_Value { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_String_values_platform_value_Value_destroy (ffi : * mut std_collections_Map_keys_String_values_platform_value_Value) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_bool { pub count : usize , pub values : * mut bool } impl ferment :: FFIConversionFrom < Vec < bool > > for Vec_bool { unsafe fn ffi_from_const (ffi : * const Vec_bool) -> Vec < bool > { let ffi_ref = & * ffi ; ferment :: from_primitive_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < bool > > for Vec_bool { unsafe fn ffi_to_const (obj : Vec < bool >) -> * const Vec_bool { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_primitive_group (obj . into_iter ()) }) } } impl Drop for Vec_bool { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_bool_ctor (count : usize , values : * mut bool) -> * mut Vec_bool { ferment :: boxed (Vec_bool { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_bool_destroy (ffi : * mut Vec_bool) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError { pub ok : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData , pub error : * mut crate :: fermented :: types :: dpp :: errors :: protocol_error :: dpp_errors_protocol_error_ProtocolError } impl ferment :: FFIConversionFrom < Result < platform_value :: types :: binary_data :: BinaryData , dpp :: errors :: protocol_error :: ProtocolError > > for Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError { unsafe fn ffi_from_const (ffi : * const Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError) -> Result < platform_value :: types :: binary_data :: BinaryData , dpp :: errors :: protocol_error :: ProtocolError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData as ferment :: FFIConversionFrom < platform_value :: types :: binary_data :: BinaryData >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dpp :: errors :: protocol_error :: dpp_errors_protocol_error_ProtocolError as ferment :: FFIConversionFrom < dpp :: errors :: protocol_error :: ProtocolError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < platform_value :: types :: binary_data :: BinaryData , dpp :: errors :: protocol_error :: ProtocolError > > for Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError { unsafe fn ffi_to_const (obj : Result < platform_value :: types :: binary_data :: BinaryData , dpp :: errors :: protocol_error :: ProtocolError >) -> * const Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError_ctor (ok : * mut crate :: fermented :: types :: platform_value :: types :: binary_data :: platform_value_types_binary_data_BinaryData , error : * mut crate :: fermented :: types :: dpp :: errors :: protocol_error :: dpp_errors_protocol_error_ProtocolError) -> * mut Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError { ferment :: boxed (Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError_destroy (ffi : * mut Result_ok_platform_value_types_binary_data_BinaryData_err_dpp_errors_protocol_error_ProtocolError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_ { pub count : usize , pub values : * mut * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < Vec < & 'static str > > for Vec_ { unsafe fn ffi_from_const (ffi : * const Vec_) -> Vec < & 'static str > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < & 'static str > > for Vec_ { unsafe fn ffi_to_const (obj : Vec < & 'static str >) -> * const Vec_ { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_ { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr_composer (self . values , self . count , ferment :: unbox_string) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec__ctor (count : usize , values : * mut * mut std :: os :: raw :: c_char) -> * mut Vec_ { ferment :: boxed (Vec_ { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec__destroy (ffi : * mut Vec_) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_Tuple_String_Arr_u8_32 { pub count : usize , pub values : * mut * mut crate :: fermented :: generics :: Tuple_String_Arr_u8_32 } impl ferment :: FFIConversionFrom < Vec < (String , [u8 ; 32]) > > for Vec_Tuple_String_Arr_u8_32 { unsafe fn ffi_from_const (ffi : * const Vec_Tuple_String_Arr_u8_32) -> Vec < (String , [u8 ; 32]) > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < (String , [u8 ; 32]) > > for Vec_Tuple_String_Arr_u8_32 { unsafe fn ffi_to_const (obj : Vec < (String , [u8 ; 32]) >) -> * const Vec_Tuple_String_Arr_u8_32 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_Tuple_String_Arr_u8_32 { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_Tuple_String_Arr_u8_32_ctor (count : usize , values : * mut * mut crate :: fermented :: generics :: Tuple_String_Arr_u8_32) -> * mut Vec_Tuple_String_Arr_u8_32 { ferment :: boxed (Vec_Tuple_String_Arr_u8_32 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_Tuple_String_Arr_u8_32_destroy (ffi : * mut Vec_Tuple_String_Arr_u8_32) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 } impl ferment :: FFIConversionFrom < Vec < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: ContestedDocumentVotePollStoredInfoVoteEventV0 > > for Vec_dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 { unsafe fn ffi_from_const (ffi : * const Vec_dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0) -> Vec < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: ContestedDocumentVotePollStoredInfoVoteEventV0 > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: ContestedDocumentVotePollStoredInfoVoteEventV0 > > for Vec_dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 { unsafe fn ffi_to_const (obj : Vec < dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: ContestedDocumentVotePollStoredInfoVoteEventV0 >) -> * const Vec_dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dpp :: voting :: vote_info_storage :: contested_document_vote_poll_stored_info :: v0 :: dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0) -> * mut Vec_dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 { ferment :: boxed (Vec_dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0_destroy (ffi : * mut Vec_dpp_voting_vote_info_storage_contested_document_vote_poll_stored_info_v0_ContestedDocumentVotePollStoredInfoVoteEventV0) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_u8_arr_32_err_dash_spv_crypto_keys_KeyError { pub ok : * mut crate :: fermented :: generics :: Arr_u8_32 , pub error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError } impl ferment :: FFIConversionFrom < Result < [u8 ; 32] , dash_spv_crypto :: keys :: KeyError > > for Result_ok_u8_arr_32_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_from_const (ffi : * const Result_ok_u8_arr_32_err_dash_spv_crypto_keys_KeyError) -> Result < [u8 ; 32] , dash_spv_crypto :: keys :: KeyError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: KeyError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < [u8 ; 32] , dash_spv_crypto :: keys :: KeyError > > for Result_ok_u8_arr_32_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_to_const (obj : Result < [u8 ; 32] , dash_spv_crypto :: keys :: KeyError >) -> * const Result_ok_u8_arr_32_err_dash_spv_crypto_keys_KeyError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_u8_arr_32_err_dash_spv_crypto_keys_KeyError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_u8_arr_32_err_dash_spv_crypto_keys_KeyError_ctor (ok : * mut crate :: fermented :: generics :: Arr_u8_32 , error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError) -> * mut Result_ok_u8_arr_32_err_dash_spv_crypto_keys_KeyError { ferment :: boxed (Result_ok_u8_arr_32_err_dash_spv_crypto_keys_KeyError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_u8_arr_32_err_dash_spv_crypto_keys_KeyError_destroy (ffi : * mut Result_ok_u8_arr_32_err_dash_spv_crypto_keys_KeyError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_u8_arr_48_err_dash_spv_crypto_keys_KeyError { pub ok : * mut crate :: fermented :: generics :: Arr_u8_48 , pub error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError } impl ferment :: FFIConversionFrom < Result < [u8 ; 48] , dash_spv_crypto :: keys :: KeyError > > for Result_ok_u8_arr_48_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_from_const (ffi : * const Result_ok_u8_arr_48_err_dash_spv_crypto_keys_KeyError) -> Result < [u8 ; 48] , dash_spv_crypto :: keys :: KeyError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: generics :: Arr_u8_48 as ferment :: FFIConversionFrom < [u8 ; 48] >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: KeyError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < [u8 ; 48] , dash_spv_crypto :: keys :: KeyError > > for Result_ok_u8_arr_48_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_to_const (obj : Result < [u8 ; 48] , dash_spv_crypto :: keys :: KeyError >) -> * const Result_ok_u8_arr_48_err_dash_spv_crypto_keys_KeyError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_u8_arr_48_err_dash_spv_crypto_keys_KeyError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_u8_arr_48_err_dash_spv_crypto_keys_KeyError_ctor (ok : * mut crate :: fermented :: generics :: Arr_u8_48 , error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError) -> * mut Result_ok_u8_arr_48_err_dash_spv_crypto_keys_KeyError { ferment :: boxed (Result_ok_u8_arr_48_err_dash_spv_crypto_keys_KeyError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_u8_arr_48_err_dash_spv_crypto_keys_KeyError_destroy (ffi : * mut Result_ok_u8_arr_48_err_dash_spv_crypto_keys_KeyError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dashcore_blockdata_transaction_txin_TxIn { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: txin :: dashcore_blockdata_transaction_txin_TxIn } impl ferment :: FFIConversionFrom < Vec < dashcore :: blockdata :: transaction :: txin :: TxIn > > for Vec_dashcore_blockdata_transaction_txin_TxIn { unsafe fn ffi_from_const (ffi : * const Vec_dashcore_blockdata_transaction_txin_TxIn) -> Vec < dashcore :: blockdata :: transaction :: txin :: TxIn > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dashcore :: blockdata :: transaction :: txin :: TxIn > > for Vec_dashcore_blockdata_transaction_txin_TxIn { unsafe fn ffi_to_const (obj : Vec < dashcore :: blockdata :: transaction :: txin :: TxIn >) -> * const Vec_dashcore_blockdata_transaction_txin_TxIn { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dashcore_blockdata_transaction_txin_TxIn { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dashcore_blockdata_transaction_txin_TxIn_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: txin :: dashcore_blockdata_transaction_txin_TxIn) -> * mut Vec_dashcore_blockdata_transaction_txin_TxIn { ferment :: boxed (Vec_dashcore_blockdata_transaction_txin_TxIn { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dashcore_blockdata_transaction_txin_TxIn_destroy (ffi : * mut Vec_dashcore_blockdata_transaction_txin_TxIn) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition_err_dash_spv_platform_error_Error { pub ok : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition , pub error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error } impl ferment :: FFIConversionFrom < Result < dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: DataContractCreateTransition , dash_spv_platform :: error :: Error > > for Result_ok_dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition_err_dash_spv_platform_error_Error { unsafe fn ffi_from_const (ffi : * const Result_ok_dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition_err_dash_spv_platform_error_Error) -> Result < dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: DataContractCreateTransition , dash_spv_platform :: error :: Error > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition as ferment :: FFIConversionFrom < dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: DataContractCreateTransition >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error as ferment :: FFIConversionFrom < dash_spv_platform :: error :: Error >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: DataContractCreateTransition , dash_spv_platform :: error :: Error > > for Result_ok_dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition_err_dash_spv_platform_error_Error { unsafe fn ffi_to_const (obj : Result < dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: DataContractCreateTransition , dash_spv_platform :: error :: Error >) -> * const Result_ok_dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition_err_dash_spv_platform_error_Error { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition_err_dash_spv_platform_error_Error { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition_err_dash_spv_platform_error_Error_ctor (ok : * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: contract :: data_contract_create_transition :: dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition , error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error) -> * mut Result_ok_dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition_err_dash_spv_platform_error_Error { ferment :: boxed (Result_ok_dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition_err_dash_spv_platform_error_Error { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition_err_dash_spv_platform_error_Error_destroy (ffi : * mut Result_ok_dpp_state_transition_state_transitions_contract_data_contract_create_transition_DataContractCreateTransition_err_dash_spv_platform_error_Error) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_u32_values_dpp_identity_identity_public_key_IdentityPublicKey { pub count : usize , pub keys : * mut u32 , pub values : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < u32 , dpp :: identity :: identity_public_key :: IdentityPublicKey > > for std_collections_Map_keys_u32_values_dpp_identity_identity_public_key_IdentityPublicKey { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_u32_values_dpp_identity_identity_public_key_IdentityPublicKey) -> std :: collections :: BTreeMap < u32 , dpp :: identity :: identity_public_key :: IdentityPublicKey > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | o , | o | < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionFrom < dpp :: identity :: identity_public_key :: IdentityPublicKey >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < u32 , dpp :: identity :: identity_public_key :: IdentityPublicKey > > for std_collections_Map_keys_u32_values_dpp_identity_identity_public_key_IdentityPublicKey { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < u32 , dpp :: identity :: identity_public_key :: IdentityPublicKey >) -> * const std_collections_Map_keys_u32_values_dpp_identity_identity_public_key_IdentityPublicKey { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_primitive_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_u32_values_dpp_identity_identity_public_key_IdentityPublicKey { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_u32_values_dpp_identity_identity_public_key_IdentityPublicKey_ctor (count : usize , keys : * mut u32 , values : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey) -> * mut std_collections_Map_keys_u32_values_dpp_identity_identity_public_key_IdentityPublicKey { ferment :: boxed (std_collections_Map_keys_u32_values_dpp_identity_identity_public_key_IdentityPublicKey { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_u32_values_dpp_identity_identity_public_key_IdentityPublicKey_destroy (ffi : * mut std_collections_Map_keys_u32_values_dpp_identity_identity_public_key_IdentityPublicKey) { ferment :: unbox_any (ffi) ; } # [cfg (any (any (feature = "state-transitions")))] # [repr (C)] # [derive (Clone)] # [cfg (any (any (feature = "state-transitions")))] pub struct std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_balances_credits_TokenAmount { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub values : * mut * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dpp :: balances :: credits :: TokenAmount > > for std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_balances_credits_TokenAmount { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_balances_credits_TokenAmount) -> std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dpp :: balances :: credits :: TokenAmount > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount as ferment :: FFIConversionFrom < dpp :: balances :: credits :: TokenAmount >> :: ffi_from (o)) } } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dpp :: balances :: credits :: TokenAmount > > for std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_balances_credits_TokenAmount { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dpp :: balances :: credits :: TokenAmount >) -> * const std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_balances_credits_TokenAmount { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl Drop for std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_balances_credits_TokenAmount { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [cfg (any (any (feature = "state-transitions")))] # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_balances_credits_TokenAmount_ctor (count : usize , keys : * mut * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , values : * mut * mut crate :: fermented :: types :: dpp :: balances :: credits :: dpp_balances_credits_TokenAmount) -> * mut std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_balances_credits_TokenAmount { ferment :: boxed (std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_balances_credits_TokenAmount { count , keys , values }) } # [cfg (any (any (feature = "state-transitions")))] # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_balances_credits_TokenAmount_destroy (ffi : * mut std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_balances_credits_TokenAmount) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { pub ok : * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity , pub error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error } impl ferment :: FFIConversionFrom < Result < std :: collections :: BTreeMap < String , std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > > , dash_spv_platform :: error :: Error > > for Result_ok_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { unsafe fn ffi_from_const (ffi : * const Result_ok_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error) -> Result < std :: collections :: BTreeMap < String , std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > > , dash_spv_platform :: error :: Error > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: generics :: std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity as ferment :: FFIConversionFrom < std :: collections :: BTreeMap < String , std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > > >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error as ferment :: FFIConversionFrom < dash_spv_platform :: error :: Error >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < std :: collections :: BTreeMap < String , std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > > , dash_spv_platform :: error :: Error > > for Result_ok_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { unsafe fn ffi_to_const (obj : Result < std :: collections :: BTreeMap < String , std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > > , dash_spv_platform :: error :: Error >) -> * const Result_ok_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error_ctor (ok : * mut crate :: fermented :: generics :: std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity , error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error) -> * mut Result_ok_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { ferment :: boxed (Result_ok_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error_destroy (ffi : * mut Result_ok_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Tuple_String_String { pub o_0 : * mut std :: os :: raw :: c_char , pub o_1 : * mut std :: os :: raw :: c_char } impl ferment :: FFIConversionFrom < (String , String) > for Tuple_String_String { unsafe fn ffi_from_const (ffi : * const Tuple_String_String) -> (String , String) { let ffi_ref = & * ffi ; (ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_0) , ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_1)) } } impl ferment :: FFIConversionTo < (String , String) > for Tuple_String_String { unsafe fn ffi_to_const (obj : (String , String)) -> * const Tuple_String_String { ferment :: boxed (Self { o_0 : ferment :: FFIConversionTo :: ffi_to (obj . 0) , o_1 : ferment :: FFIConversionTo :: ffi_to (obj . 1) }) } } impl Drop for Tuple_String_String { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . o_0) ; ferment :: unbox_any (self . o_1) ; } } } # [no_mangle] pub unsafe extern "C" fn Tuple_String_String_ctor (o_0 : * mut std :: os :: raw :: c_char , o_1 : * mut std :: os :: raw :: c_char) -> * mut Tuple_String_String { ferment :: boxed (Tuple_String_String { o_0 , o_1 }) } # [no_mangle] pub unsafe extern "C" fn Tuple_String_String_destroy (ffi : * mut Tuple_String_String) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError { caller : unsafe extern "C" fn (* mut crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainKey) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_keychain_KeyChainError , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_keychain_KeyChainError) } impl Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError { pub unsafe fn call (& self , o_0 : dash_spv_keychain :: KeyChainKey) -> Result < bool , dash_spv_keychain :: KeyChainError > { let ffi_result = (self . caller) (< crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainKey as ferment :: FFIConversionTo < dash_spv_keychain :: KeyChainKey >> :: ffi_to (o_0)) ; let result = < crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_keychain_KeyChainError as ferment :: FFIConversionFrom < Result < bool , dash_spv_keychain :: KeyChainError > >> :: ffi_from (ffi_result) ; (self . destructor) (ffi_result) ; result } } unsafe impl Send for Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError { } unsafe impl Sync for Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError_ctor (caller : unsafe extern "C" fn (* mut crate :: fermented :: types :: dash_spv_keychain :: dash_spv_keychain_KeyChainKey) -> * mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_keychain_KeyChainError , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Result_ok_bool_err_dash_spv_keychain_KeyChainError)) -> * mut Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError { ferment :: boxed (Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError_destroy (ffi : * mut Fn_ARGS_dash_spv_keychain_KeyChainKey_RTRN_Result_ok_bool_err_dash_spv_keychain_KeyChainError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_dashcore_hash_types_ProTxHash_values_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { pub count : usize , pub keys : * mut * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash , pub values : * mut * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dashcore :: hash_types :: ProTxHash , dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry > > for std_collections_Map_keys_dashcore_hash_types_ProTxHash_values_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_dashcore_hash_types_ProTxHash_values_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry) -> std :: collections :: BTreeMap < dashcore :: hash_types :: ProTxHash , dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: ProTxHash >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry as ferment :: FFIConversionFrom < dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < dashcore :: hash_types :: ProTxHash , dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry > > for std_collections_Map_keys_dashcore_hash_types_ProTxHash_values_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < dashcore :: hash_types :: ProTxHash , dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry >) -> * const std_collections_Map_keys_dashcore_hash_types_ProTxHash_values_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_dashcore_hash_types_ProTxHash_values_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dashcore_hash_types_ProTxHash_values_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_ctor (count : usize , keys : * mut * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_ProTxHash , values : * mut * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry) -> * mut std_collections_Map_keys_dashcore_hash_types_ProTxHash_values_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { ferment :: boxed (std_collections_Map_keys_dashcore_hash_types_ProTxHash_values_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dashcore_hash_types_ProTxHash_values_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_destroy (ffi : * mut std_collections_Map_keys_dashcore_hash_types_ProTxHash_values_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dashcore_blockdata_transaction_outpoint_OutPoint { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint } impl ferment :: FFIConversionFrom < Vec < dashcore :: blockdata :: transaction :: outpoint :: OutPoint > > for Vec_dashcore_blockdata_transaction_outpoint_OutPoint { unsafe fn ffi_from_const (ffi : * const Vec_dashcore_blockdata_transaction_outpoint_OutPoint) -> Vec < dashcore :: blockdata :: transaction :: outpoint :: OutPoint > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dashcore :: blockdata :: transaction :: outpoint :: OutPoint > > for Vec_dashcore_blockdata_transaction_outpoint_OutPoint { unsafe fn ffi_to_const (obj : Vec < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >) -> * const Vec_dashcore_blockdata_transaction_outpoint_OutPoint { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dashcore_blockdata_transaction_outpoint_OutPoint { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dashcore_blockdata_transaction_outpoint_OutPoint_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint) -> * mut Vec_dashcore_blockdata_transaction_outpoint_OutPoint { ferment :: boxed (Vec_dashcore_blockdata_transaction_outpoint_OutPoint { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dashcore_blockdata_transaction_outpoint_OutPoint_destroy (ffi : * mut Vec_dashcore_blockdata_transaction_outpoint_OutPoint) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint) -> bool , destructor : unsafe extern "C" fn (bool) } impl Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : dashcore :: blockdata :: transaction :: outpoint :: OutPoint) -> bool { let ffi_result = (self . caller) (o_0 , < crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint as ferment :: FFIConversionTo < dashcore :: blockdata :: transaction :: outpoint :: OutPoint >> :: ffi_to (o_1)) ; ffi_result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: types :: dashcore :: blockdata :: transaction :: outpoint :: dashcore_blockdata_transaction_outpoint_OutPoint) -> bool , destructor : unsafe extern "C" fn (bool)) -> * mut Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_dashcore_blockdata_transaction_outpoint_OutPoint_RTRN_bool) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { pub count : usize , pub keys : * mut * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash , pub values : * mut * mut crate :: fermented :: types :: dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dashcore :: hash_types :: QuorumHash , dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: QualifiedQuorumEntry > > for std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry) -> std :: collections :: BTreeMap < dashcore :: hash_types :: QuorumHash , dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: QualifiedQuorumEntry > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash as ferment :: FFIConversionFrom < dashcore :: hash_types :: QuorumHash >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry as ferment :: FFIConversionFrom < dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: QualifiedQuorumEntry >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < dashcore :: hash_types :: QuorumHash , dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: QualifiedQuorumEntry > > for std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < dashcore :: hash_types :: QuorumHash , dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: QualifiedQuorumEntry >) -> * const std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry_ctor (count : usize , keys : * mut * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_QuorumHash , values : * mut * mut crate :: fermented :: types :: dashcore :: sml :: quorum_entry :: qualified_quorum_entry :: dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry) -> * mut std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { ferment :: boxed (std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry_destroy (ffi : * mut std_collections_Map_keys_dashcore_hash_types_QuorumHash_values_dashcore_sml_quorum_entry_qualified_quorum_entry_QualifiedQuorumEntry) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_String_values_dash_spv_platform_identity_model_UsernameStatusInfo { pub count : usize , pub keys : * mut * mut std :: os :: raw :: c_char , pub values : * mut * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_UsernameStatusInfo } impl ferment :: FFIConversionFrom < std :: collections :: HashMap < String , dash_spv_platform :: identity :: model :: UsernameStatusInfo > > for std_collections_Map_keys_String_values_dash_spv_platform_identity_model_UsernameStatusInfo { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_String_values_dash_spv_platform_identity_model_UsernameStatusInfo) -> std :: collections :: HashMap < String , dash_spv_platform :: identity :: model :: UsernameStatusInfo > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_UsernameStatusInfo as ferment :: FFIConversionFrom < dash_spv_platform :: identity :: model :: UsernameStatusInfo >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: HashMap < String , dash_spv_platform :: identity :: model :: UsernameStatusInfo > > for std_collections_Map_keys_String_values_dash_spv_platform_identity_model_UsernameStatusInfo { unsafe fn ffi_to_const (obj : std :: collections :: HashMap < String , dash_spv_platform :: identity :: model :: UsernameStatusInfo >) -> * const std_collections_Map_keys_String_values_dash_spv_platform_identity_model_UsernameStatusInfo { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_String_values_dash_spv_platform_identity_model_UsernameStatusInfo { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr_composer (self . keys , self . count , ferment :: unbox_string) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_String_values_dash_spv_platform_identity_model_UsernameStatusInfo_ctor (count : usize , keys : * mut * mut std :: os :: raw :: c_char , values : * mut * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_UsernameStatusInfo) -> * mut std_collections_Map_keys_String_values_dash_spv_platform_identity_model_UsernameStatusInfo { ferment :: boxed (std_collections_Map_keys_String_values_dash_spv_platform_identity_model_UsernameStatusInfo { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_String_values_dash_spv_platform_identity_model_UsernameStatusInfo_destroy (ffi : * mut std_collections_Map_keys_String_values_dash_spv_platform_identity_model_UsernameStatusInfo) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions { pub obj : * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coinjoin_client_options :: dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dash_spv_coinjoin :: models :: coinjoin_client_options :: CoinJoinClientOptions > > for std_sync_Arc_dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> std :: sync :: Arc < dash_spv_coinjoin :: models :: coinjoin_client_options :: CoinJoinClientOptions > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (ferment :: FFIConversionFrom :: ffi_from (ffi_ref . obj)) } } impl ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_coinjoin :: models :: coinjoin_client_options :: CoinJoinClientOptions > > for std_sync_Arc_dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions { unsafe fn ffi_to_const (obj : std :: sync :: Arc < dash_spv_coinjoin :: models :: coinjoin_client_options :: CoinJoinClientOptions >) -> * const std_sync_Arc_dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions { ferment :: boxed (Self { obj : ferment :: FFIConversionTo :: ffi_to ((* obj) . clone ()) }) } } impl Drop for std_sync_Arc_dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . obj) ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_ctor (obj : * mut crate :: fermented :: types :: dash_spv_coinjoin :: models :: coinjoin_client_options :: dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) -> * mut std_sync_Arc_dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions { ferment :: boxed (std_sync_Arc_dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions_destroy (ffi : * mut std_sync_Arc_dash_spv_coinjoin_models_coinjoin_client_options_CoinJoinClientOptions) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry , destructor : unsafe extern "C" fn (* mut crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry) } impl Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : [u8 ; 32]) -> Option < dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry > { let ffi_result = (self . caller) (o_0 , < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionTo < [u8 ; 32] >> :: ffi_to (o_1)) ; if ffi_result . is_null () { None } else { let result = < crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry as ferment :: FFIConversionFrom < dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry >> :: ffi_from_opt (ffi_result) ; (self . destructor) (ffi_result) ; result } } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry , destructor : unsafe extern "C" fn (* mut crate :: fermented :: types :: dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry)) -> * mut Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_Arr_u8_32_RTRN_Option_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Tuple_platform_value_types_identifier_Identifier_u8 { pub o_0 : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub o_1 : u8 } impl ferment :: FFIConversionFrom < (platform_value :: types :: identifier :: Identifier , u8) > for Tuple_platform_value_types_identifier_Identifier_u8 { unsafe fn ffi_from_const (ffi : * const Tuple_platform_value_types_identifier_Identifier_u8) -> (platform_value :: types :: identifier :: Identifier , u8) { let ffi_ref = & * ffi ; (ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_0) , ffi_ref . o_1) } } impl ferment :: FFIConversionTo < (platform_value :: types :: identifier :: Identifier , u8) > for Tuple_platform_value_types_identifier_Identifier_u8 { unsafe fn ffi_to_const (obj : (platform_value :: types :: identifier :: Identifier , u8)) -> * const Tuple_platform_value_types_identifier_Identifier_u8 { ferment :: boxed (Self { o_0 : ferment :: FFIConversionTo :: ffi_to (obj . 0) , o_1 : obj . 1 }) } } impl Drop for Tuple_platform_value_types_identifier_Identifier_u8 { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . o_0) ; ; } } } # [no_mangle] pub unsafe extern "C" fn Tuple_platform_value_types_identifier_Identifier_u8_ctor (o_0 : * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , o_1 : u8) -> * mut Tuple_platform_value_types_identifier_Identifier_u8 { ferment :: boxed (Tuple_platform_value_types_identifier_Identifier_u8 { o_0 , o_1 }) } # [no_mangle] pub unsafe extern "C" fn Tuple_platform_value_types_identifier_Identifier_u8_destroy (ffi : * mut Tuple_platform_value_types_identifier_Identifier_u8) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dashcore_hashes_hex_Error { pub ok : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey , pub error : * mut dash_spv_apple_bindings :: custom :: dashcore :: hashes_hex_Error_FFI } impl ferment :: FFIConversionFrom < Result < dash_spv_crypto :: keys :: bls_key :: BLSKey , dashcore :: hashes :: hex :: Error > > for Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dashcore_hashes_hex_Error { unsafe fn ffi_from_const (ffi : * const Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dashcore_hashes_hex_Error) -> Result < dash_spv_crypto :: keys :: bls_key :: BLSKey , dashcore :: hashes :: hex :: Error > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | (& * o) . clone () , ffi_ref . error , | o | < dash_spv_apple_bindings :: custom :: dashcore :: hashes_hex_Error_FFI as ferment :: FFIConversionFrom < dashcore :: hashes :: hex :: Error >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: bls_key :: BLSKey , dashcore :: hashes :: hex :: Error > > for Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dashcore_hashes_hex_Error { unsafe fn ffi_to_const (obj : Result < dash_spv_crypto :: keys :: bls_key :: BLSKey , dashcore :: hashes :: hex :: Error >) -> * const Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dashcore_hashes_hex_Error { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: boxed (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dashcore_hashes_hex_Error { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dashcore_hashes_hex_Error_ctor (ok : * mut dash_spv_crypto :: keys :: bls_key :: BLSKey , error : * mut dash_spv_apple_bindings :: custom :: dashcore :: hashes_hex_Error_FFI) -> * mut Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dashcore_hashes_hex_Error { ferment :: boxed (Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dashcore_hashes_hex_Error { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dashcore_hashes_hex_Error_destroy (ffi : * mut Result_ok_dash_spv_crypto_keys_bls_key_BLSKey_err_dashcore_hashes_hex_Error) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_ContestedIndexFieldMatch { pub count : usize , pub keys : * mut * mut std :: os :: raw :: c_char , pub values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_ContestedIndexFieldMatch } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < String , dpp :: data_contract :: document_type :: index :: ContestedIndexFieldMatch > > for std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_ContestedIndexFieldMatch { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_ContestedIndexFieldMatch) -> std :: collections :: BTreeMap < String , dpp :: data_contract :: document_type :: index :: ContestedIndexFieldMatch > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_ContestedIndexFieldMatch as ferment :: FFIConversionFrom < dpp :: data_contract :: document_type :: index :: ContestedIndexFieldMatch >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < String , dpp :: data_contract :: document_type :: index :: ContestedIndexFieldMatch > > for std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_ContestedIndexFieldMatch { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < String , dpp :: data_contract :: document_type :: index :: ContestedIndexFieldMatch >) -> * const std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_ContestedIndexFieldMatch { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_ContestedIndexFieldMatch { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr_composer (self . keys , self . count , ferment :: unbox_string) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_ContestedIndexFieldMatch_ctor (count : usize , keys : * mut * mut std :: os :: raw :: c_char , values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_ContestedIndexFieldMatch) -> * mut std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_ContestedIndexFieldMatch { ferment :: boxed (std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_ContestedIndexFieldMatch { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_ContestedIndexFieldMatch_destroy (ffi : * mut std_collections_Map_keys_String_values_dpp_data_contract_document_type_index_ContestedIndexFieldMatch) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_u8_arr_32_values_Vec_u8 { pub count : usize , pub keys : * mut * mut crate :: fermented :: generics :: Arr_u8_32 , pub values : * mut * mut crate :: fermented :: generics :: Vec_u8 } impl ferment :: FFIConversionFrom < std :: collections :: HashMap < [u8 ; 32] , Vec < u8 > > > for std_collections_Map_keys_u8_arr_32_values_Vec_u8 { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_u8_arr_32_values_Vec_u8) -> std :: collections :: HashMap < [u8 ; 32] , Vec < u8 > > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (o) , | o | < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: HashMap < [u8 ; 32] , Vec < u8 > > > for std_collections_Map_keys_u8_arr_32_values_Vec_u8 { unsafe fn ffi_to_const (obj : std :: collections :: HashMap < [u8 ; 32] , Vec < u8 > >) -> * const std_collections_Map_keys_u8_arr_32_values_Vec_u8 { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_u8_arr_32_values_Vec_u8 { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_u8_arr_32_values_Vec_u8_ctor (count : usize , keys : * mut * mut crate :: fermented :: generics :: Arr_u8_32 , values : * mut * mut crate :: fermented :: generics :: Vec_u8) -> * mut std_collections_Map_keys_u8_arr_32_values_Vec_u8 { ferment :: boxed (std_collections_Map_keys_u8_arr_32_values_Vec_u8 { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_u8_arr_32_values_Vec_u8_destroy (ffi : * mut std_collections_Map_keys_u8_arr_32_values_Vec_u8) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_BTreeSet_dashcore_hash_types_BlockHash { pub count : usize , pub values : * mut * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash } impl ferment :: FFIConversionFrom < std :: collections :: BTreeSet < dashcore :: hash_types :: BlockHash > > for std_collections_BTreeSet_dashcore_hash_types_BlockHash { unsafe fn ffi_from_const (ffi : * const std_collections_BTreeSet_dashcore_hash_types_BlockHash) -> std :: collections :: BTreeSet < dashcore :: hash_types :: BlockHash > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeSet < dashcore :: hash_types :: BlockHash > > for std_collections_BTreeSet_dashcore_hash_types_BlockHash { unsafe fn ffi_to_const (obj : std :: collections :: BTreeSet < dashcore :: hash_types :: BlockHash >) -> * const std_collections_BTreeSet_dashcore_hash_types_BlockHash { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for std_collections_BTreeSet_dashcore_hash_types_BlockHash { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_BTreeSet_dashcore_hash_types_BlockHash_ctor (count : usize , values : * mut * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) -> * mut std_collections_BTreeSet_dashcore_hash_types_BlockHash { ferment :: boxed (std_collections_BTreeSet_dashcore_hash_types_BlockHash { count , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_BTreeSet_dashcore_hash_types_BlockHash_destroy (ffi : * mut std_collections_BTreeSet_dashcore_hash_types_BlockHash) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError { pub ok : * mut crate :: fermented :: generics :: std_sync_Arc_dpp_data_contract_DataContract , pub error : * mut crate :: fermented :: types :: drive_proof_verifier :: error :: drive_proof_verifier_error_ContextProviderError } impl ferment :: FFIConversionFrom < Result < Option < std :: sync :: Arc < dpp :: data_contract :: DataContract > > , drive_proof_verifier :: error :: ContextProviderError > > for Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError { unsafe fn ffi_from_const (ffi : * const Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError) -> Result < Option < std :: sync :: Arc < dpp :: data_contract :: DataContract > > , drive_proof_verifier :: error :: ContextProviderError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: generics :: std_sync_Arc_dpp_data_contract_DataContract as ferment :: FFIConversionFrom < std :: sync :: Arc < dpp :: data_contract :: DataContract > >> :: ffi_from_opt (o) , ffi_ref . error , | o | < crate :: fermented :: types :: drive_proof_verifier :: error :: drive_proof_verifier_error_ContextProviderError as ferment :: FFIConversionFrom < drive_proof_verifier :: error :: ContextProviderError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < Option < std :: sync :: Arc < dpp :: data_contract :: DataContract > > , drive_proof_verifier :: error :: ContextProviderError > > for Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError { unsafe fn ffi_to_const (obj : Result < Option < std :: sync :: Arc < dpp :: data_contract :: DataContract > > , drive_proof_verifier :: error :: ContextProviderError >) -> * const Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to_opt (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError_ctor (ok : * mut crate :: fermented :: generics :: std_sync_Arc_dpp_data_contract_DataContract , error : * mut crate :: fermented :: types :: drive_proof_verifier :: error :: drive_proof_verifier_error_ContextProviderError) -> * mut Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError { ferment :: boxed (Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError_destroy (ffi : * mut Result_ok_Option_std_sync_Arc_dpp_data_contract_DataContract_err_drive_proof_verifier_error_ContextProviderError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { pub ok : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , pub error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError } impl ferment :: FFIConversionFrom < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > > for Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_from_const (ffi : * const Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError) -> Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | (& * o) . clone () , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError as ferment :: FFIConversionFrom < dash_spv_crypto :: keys :: KeyError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError > > for Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { unsafe fn ffi_to_const (obj : Result < dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , dash_spv_crypto :: keys :: KeyError >) -> * const Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: boxed (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError_ctor (ok : * mut dash_spv_crypto :: keys :: ecdsa_key :: ECDSAKey , error : * mut crate :: fermented :: types :: dash_spv_crypto :: keys :: dash_spv_crypto_keys_KeyError) -> * mut Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { ferment :: boxed (Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError_destroy (ffi : * mut Result_ok_dash_spv_crypto_keys_ecdsa_key_ECDSAKey_err_dash_spv_crypto_keys_KeyError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32 { pub obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32 } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , u32) -> Option < [u8 ; 32] > > > for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32 { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32) -> std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , u32) -> Option < [u8 ; 32] > > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (move | o_0 , o_1 | unsafe { (& * ffi_ref . obj) . call (o_0 , o_1) }) } } impl Drop for std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32 { fn drop (& mut self) { unsafe { ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32_ctor (obj : * mut crate :: fermented :: generics :: Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32) -> * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32 { ferment :: boxed (std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32 { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32_destroy (ffi : * mut std_sync_Arc_dyn_trait_Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition , pub values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_Group } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < dpp :: data_contract :: GroupContractPosition , dpp :: data_contract :: group :: Group > > for std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group) -> std :: collections :: BTreeMap < dpp :: data_contract :: GroupContractPosition , dpp :: data_contract :: group :: Group > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition as ferment :: FFIConversionFrom < dpp :: data_contract :: GroupContractPosition >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_Group as ferment :: FFIConversionFrom < dpp :: data_contract :: group :: Group >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < dpp :: data_contract :: GroupContractPosition , dpp :: data_contract :: group :: Group > > for std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < dpp :: data_contract :: GroupContractPosition , dpp :: data_contract :: group :: Group >) -> * const std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group_ctor (count : usize , keys : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_GroupContractPosition , values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_Group) -> * mut std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group { ferment :: boxed (std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group_destroy (ffi : * mut std_collections_Map_keys_dpp_data_contract_GroupContractPosition_values_dpp_data_contract_group_Group) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_Tuple_String_String { pub count : usize , pub values : * mut * mut crate :: fermented :: generics :: Tuple_String_String } impl ferment :: FFIConversionFrom < Vec < (String , String) > > for Vec_Tuple_String_String { unsafe fn ffi_from_const (ffi : * const Vec_Tuple_String_String) -> Vec < (String , String) > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < (String , String) > > for Vec_Tuple_String_String { unsafe fn ffi_to_const (obj : Vec < (String , String) >) -> * const Vec_Tuple_String_String { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_Tuple_String_String { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_Tuple_String_String_ctor (count : usize , values : * mut * mut crate :: fermented :: generics :: Tuple_String_String) -> * mut Vec_Tuple_String_String { ferment :: boxed (Vec_Tuple_String_String { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_Tuple_String_String_destroy (ffi : * mut Vec_Tuple_String_String) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Tuple_dpp_prelude_RootEncryptionKeyIndex_dpp_prelude_DerivationEncryptionKeyIndex_Vec_u8 { pub o_0 : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_RootEncryptionKeyIndex , pub o_1 : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_DerivationEncryptionKeyIndex , pub o_2 : * mut crate :: fermented :: generics :: Vec_u8 } impl ferment :: FFIConversionFrom < (dpp :: prelude :: RootEncryptionKeyIndex , dpp :: prelude :: DerivationEncryptionKeyIndex , Vec < u8 > ,) > for Tuple_dpp_prelude_RootEncryptionKeyIndex_dpp_prelude_DerivationEncryptionKeyIndex_Vec_u8 { unsafe fn ffi_from_const (ffi : * const Tuple_dpp_prelude_RootEncryptionKeyIndex_dpp_prelude_DerivationEncryptionKeyIndex_Vec_u8) -> (dpp :: prelude :: RootEncryptionKeyIndex , dpp :: prelude :: DerivationEncryptionKeyIndex , Vec < u8 > ,) { let ffi_ref = & * ffi ; (ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_0) , ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_1) , ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_2)) } } impl ferment :: FFIConversionTo < (dpp :: prelude :: RootEncryptionKeyIndex , dpp :: prelude :: DerivationEncryptionKeyIndex , Vec < u8 > ,) > for Tuple_dpp_prelude_RootEncryptionKeyIndex_dpp_prelude_DerivationEncryptionKeyIndex_Vec_u8 { unsafe fn ffi_to_const (obj : (dpp :: prelude :: RootEncryptionKeyIndex , dpp :: prelude :: DerivationEncryptionKeyIndex , Vec < u8 > ,)) -> * const Tuple_dpp_prelude_RootEncryptionKeyIndex_dpp_prelude_DerivationEncryptionKeyIndex_Vec_u8 { ferment :: boxed (Self { o_0 : ferment :: FFIConversionTo :: ffi_to (obj . 0) , o_1 : ferment :: FFIConversionTo :: ffi_to (obj . 1) , o_2 : ferment :: FFIConversionTo :: ffi_to (obj . 2) }) } } impl Drop for Tuple_dpp_prelude_RootEncryptionKeyIndex_dpp_prelude_DerivationEncryptionKeyIndex_Vec_u8 { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . o_0) ; ferment :: unbox_any (self . o_1) ; ferment :: unbox_any (self . o_2) ; } } } # [no_mangle] pub unsafe extern "C" fn Tuple_dpp_prelude_RootEncryptionKeyIndex_dpp_prelude_DerivationEncryptionKeyIndex_Vec_u8_ctor (o_0 : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_RootEncryptionKeyIndex , o_1 : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_DerivationEncryptionKeyIndex , o_2 : * mut crate :: fermented :: generics :: Vec_u8) -> * mut Tuple_dpp_prelude_RootEncryptionKeyIndex_dpp_prelude_DerivationEncryptionKeyIndex_Vec_u8 { ferment :: boxed (Tuple_dpp_prelude_RootEncryptionKeyIndex_dpp_prelude_DerivationEncryptionKeyIndex_Vec_u8 { o_0 , o_1 , o_2 }) } # [no_mangle] pub unsafe extern "C" fn Tuple_dpp_prelude_RootEncryptionKeyIndex_dpp_prelude_DerivationEncryptionKeyIndex_Vec_u8_destroy (ffi : * mut Tuple_dpp_prelude_RootEncryptionKeyIndex_dpp_prelude_DerivationEncryptionKeyIndex_Vec_u8) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Arr_u8_65 { pub count : usize , pub values : * mut u8 } impl ferment :: FFIConversionFrom < [u8 ; 65] > for Arr_u8_65 { unsafe fn ffi_from_const (ffi : * const Arr_u8_65) -> [u8 ; 65] { let ffi_ref = & * ffi ; let vec : Vec < u8 > = ferment :: from_primitive_group (ffi_ref . values , ffi_ref . count) ; vec . try_into () . unwrap () } } impl ferment :: FFIConversionTo < [u8 ; 65] > for Arr_u8_65 { unsafe fn ffi_to_const (obj : [u8 ; 65]) -> * const Arr_u8_65 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_primitive_group (obj . into_iter ()) }) } } impl Drop for Arr_u8_65 { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Arr_u8_65_ctor (count : usize , values : * mut u8) -> * mut Arr_u8_65 { ferment :: boxed (Arr_u8_65 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Arr_u8_65_destroy (ffi : * mut Arr_u8_65) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { pub ok : * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity , pub error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error } impl ferment :: FFIConversionFrom < Result < dpp :: identity :: identity :: Identity , dash_spv_platform :: error :: Error > > for Result_ok_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { unsafe fn ffi_from_const (ffi : * const Result_ok_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error) -> Result < dpp :: identity :: identity :: Identity , dash_spv_platform :: error :: Error > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity as ferment :: FFIConversionFrom < dpp :: identity :: identity :: Identity >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error as ferment :: FFIConversionFrom < dash_spv_platform :: error :: Error >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < dpp :: identity :: identity :: Identity , dash_spv_platform :: error :: Error > > for Result_ok_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { unsafe fn ffi_to_const (obj : Result < dpp :: identity :: identity :: Identity , dash_spv_platform :: error :: Error >) -> * const Result_ok_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error_ctor (ok : * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity , error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error) -> * mut Result_ok_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { ferment :: boxed (Result_ok_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error_destroy (ffi : * mut Result_ok_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_Tuple_platform_value_Value_platform_value_Value { pub count : usize , pub values : * mut * mut crate :: fermented :: generics :: Tuple_platform_value_Value_platform_value_Value } impl ferment :: FFIConversionFrom < Vec < (platform_value :: Value , platform_value :: Value) > > for Vec_Tuple_platform_value_Value_platform_value_Value { unsafe fn ffi_from_const (ffi : * const Vec_Tuple_platform_value_Value_platform_value_Value) -> Vec < (platform_value :: Value , platform_value :: Value) > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < (platform_value :: Value , platform_value :: Value) > > for Vec_Tuple_platform_value_Value_platform_value_Value { unsafe fn ffi_to_const (obj : Vec < (platform_value :: Value , platform_value :: Value) >) -> * const Vec_Tuple_platform_value_Value_platform_value_Value { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_Tuple_platform_value_Value_platform_value_Value { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_Tuple_platform_value_Value_platform_value_Value_ctor (count : usize , values : * mut * mut crate :: fermented :: generics :: Tuple_platform_value_Value_platform_value_Value) -> * mut Vec_Tuple_platform_value_Value_platform_value_Value { ferment :: boxed (Vec_Tuple_platform_value_Value_platform_value_Value { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_Tuple_platform_value_Value_platform_value_Value_destroy (ffi : * mut Vec_Tuple_platform_value_Value_platform_value_Value) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager { pub obj : * mut dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager > > for std_sync_Arc_dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager) -> std :: sync :: Arc < dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager > { let ffi_ref = & * ffi ; std :: sync :: Arc :: from_raw (ffi_ref . obj) } } impl ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager > > for std_sync_Arc_dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager { unsafe fn ffi_to_const (obj : std :: sync :: Arc < dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager >) -> * const std_sync_Arc_dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager { ferment :: boxed (Self { obj : std :: sync :: Arc :: into_raw (obj) . cast_mut () }) } } impl Drop for std_sync_Arc_dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . obj) ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager_ctor (obj : * mut dash_spv_platform :: document :: salted_domain_hashes :: SaltedDomainHashesManager) -> * mut std_sync_Arc_dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager { ferment :: boxed (std_sync_Arc_dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager_destroy (ffi : * mut std_sync_Arc_dash_spv_platform_document_salted_domain_hashes_SaltedDomainHashesManager) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dash_spv_masternode_processor_processing_processor_MasternodeProcessor { pub obj : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor > > for std_sync_Arc_dash_spv_masternode_processor_processing_processor_MasternodeProcessor { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dash_spv_masternode_processor_processing_processor_MasternodeProcessor) -> std :: sync :: Arc < dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor > { let ffi_ref = & * ffi ; std :: sync :: Arc :: from_raw (ffi_ref . obj) } } impl ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor > > for std_sync_Arc_dash_spv_masternode_processor_processing_processor_MasternodeProcessor { unsafe fn ffi_to_const (obj : std :: sync :: Arc < dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor >) -> * const std_sync_Arc_dash_spv_masternode_processor_processing_processor_MasternodeProcessor { ferment :: boxed (Self { obj : std :: sync :: Arc :: into_raw (obj) . cast_mut () }) } } impl Drop for std_sync_Arc_dash_spv_masternode_processor_processing_processor_MasternodeProcessor { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . obj) ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_masternode_processor_processing_processor_MasternodeProcessor_ctor (obj : * mut dash_spv_masternode_processor :: processing :: processor :: MasternodeProcessor) -> * mut std_sync_Arc_dash_spv_masternode_processor_processing_processor_MasternodeProcessor { ferment :: boxed (std_sync_Arc_dash_spv_masternode_processor_processing_processor_MasternodeProcessor { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_masternode_processor_processing_processor_MasternodeProcessor_destroy (ffi : * mut std_sync_Arc_dash_spv_masternode_processor_processing_processor_MasternodeProcessor) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { pub ok : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , pub error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error } impl ferment :: FFIConversionFrom < Result < Option < dpp :: data_contract :: DataContract > , dash_spv_platform :: error :: Error > > for Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { unsafe fn ffi_from_const (ffi : * const Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error) -> Result < Option < dpp :: data_contract :: DataContract > , dash_spv_platform :: error :: Error > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from_opt (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error as ferment :: FFIConversionFrom < dash_spv_platform :: error :: Error >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < Option < dpp :: data_contract :: DataContract > , dash_spv_platform :: error :: Error > > for Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { unsafe fn ffi_to_const (obj : Result < Option < dpp :: data_contract :: DataContract > , dash_spv_platform :: error :: Error >) -> * const Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to_opt (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error_ctor (ok : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error) -> * mut Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { ferment :: boxed (Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error_destroy (ffi : * mut Result_ok_Option_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32 { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , u32) -> * mut crate :: fermented :: generics :: Arr_u8_32 , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Arr_u8_32) } impl Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32 { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : u32) -> Option < [u8 ; 32] > { let ffi_result = (self . caller) (o_0 , o_1) ; let result = < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from_opt (ffi_result) ; (self . destructor) (ffi_result) ; result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32 { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32 { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , u32) -> * mut crate :: fermented :: generics :: Arr_u8_32 , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Arr_u8_32)) -> * mut Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32 { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32 { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_u32_RTRN_Option_u8_32) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { pub ok : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , pub error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error } impl ferment :: FFIConversionFrom < Result < dpp :: data_contract :: DataContract , dash_spv_platform :: error :: Error > > for Result_ok_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { unsafe fn ffi_from_const (ffi : * const Result_ok_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error) -> Result < dpp :: data_contract :: DataContract , dash_spv_platform :: error :: Error > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract as ferment :: FFIConversionFrom < dpp :: data_contract :: DataContract >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error as ferment :: FFIConversionFrom < dash_spv_platform :: error :: Error >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < dpp :: data_contract :: DataContract , dash_spv_platform :: error :: Error > > for Result_ok_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { unsafe fn ffi_to_const (obj : Result < dpp :: data_contract :: DataContract , dash_spv_platform :: error :: Error >) -> * const Result_ok_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error_ctor (ok : * mut crate :: fermented :: types :: dpp :: data_contract :: dpp_data_contract_DataContract , error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error) -> * mut Result_ok_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { ferment :: boxed (Result_ok_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error_destroy (ffi : * mut Result_ok_dpp_data_contract_DataContract_err_dash_spv_platform_error_Error) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_u8_arr_32_values_u32 { pub count : usize , pub keys : * mut * mut crate :: fermented :: generics :: Arr_u8_32 , pub values : * mut u32 } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < [u8 ; 32] , u32 > > for std_collections_Map_keys_u8_arr_32_values_u32 { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_u8_arr_32_values_u32) -> std :: collections :: BTreeMap < [u8 ; 32] , u32 > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: generics :: Arr_u8_32 as ferment :: FFIConversionFrom < [u8 ; 32] >> :: ffi_from (o) , | o | o) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < [u8 ; 32] , u32 > > for std_collections_Map_keys_u8_arr_32_values_u32 { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < [u8 ; 32] , u32 >) -> * const std_collections_Map_keys_u8_arr_32_values_u32 { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_primitive_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_u8_arr_32_values_u32 { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_u8_arr_32_values_u32_ctor (count : usize , keys : * mut * mut crate :: fermented :: generics :: Arr_u8_32 , values : * mut u32) -> * mut std_collections_Map_keys_u8_arr_32_values_u32 { ferment :: boxed (std_collections_Map_keys_u8_arr_32_values_u32 { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_u8_arr_32_values_u32_destroy (ffi : * mut std_collections_Map_keys_u8_arr_32_values_u32) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_data_contract_group_GroupMemberPower { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dpp :: data_contract :: group :: GroupMemberPower > > for std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_data_contract_group_GroupMemberPower { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_data_contract_group_GroupMemberPower) -> std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dpp :: data_contract :: group :: GroupMemberPower > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower as ferment :: FFIConversionFrom < dpp :: data_contract :: group :: GroupMemberPower >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dpp :: data_contract :: group :: GroupMemberPower > > for std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_data_contract_group_GroupMemberPower { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dpp :: data_contract :: group :: GroupMemberPower >) -> * const std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_data_contract_group_GroupMemberPower { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_data_contract_group_GroupMemberPower { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_data_contract_group_GroupMemberPower_ctor (count : usize , keys : * mut * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: group :: dpp_data_contract_group_GroupMemberPower) -> * mut std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_data_contract_group_GroupMemberPower { ferment :: boxed (std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_data_contract_group_GroupMemberPower { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_data_contract_group_GroupMemberPower_destroy (ffi : * mut std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_data_contract_group_GroupMemberPower) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dpp_identity_identity_public_key_purpose_Purpose { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose } impl ferment :: FFIConversionFrom < Vec < dpp :: identity :: identity_public_key :: purpose :: Purpose > > for Vec_dpp_identity_identity_public_key_purpose_Purpose { unsafe fn ffi_from_const (ffi : * const Vec_dpp_identity_identity_public_key_purpose_Purpose) -> Vec < dpp :: identity :: identity_public_key :: purpose :: Purpose > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dpp :: identity :: identity_public_key :: purpose :: Purpose > > for Vec_dpp_identity_identity_public_key_purpose_Purpose { unsafe fn ffi_to_const (obj : Vec < dpp :: identity :: identity_public_key :: purpose :: Purpose >) -> * const Vec_dpp_identity_identity_public_key_purpose_Purpose { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dpp_identity_identity_public_key_purpose_Purpose { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_identity_identity_public_key_purpose_Purpose_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: purpose :: dpp_identity_identity_public_key_purpose_Purpose) -> * mut Vec_dpp_identity_identity_public_key_purpose_Purpose { ferment :: boxed (Vec_dpp_identity_identity_public_key_purpose_Purpose { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_identity_identity_public_key_purpose_Purpose_destroy (ffi : * mut Vec_dpp_identity_identity_public_key_purpose_Purpose) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash { pub o_0 : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash , pub o_1 : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash } impl ferment :: FFIConversionFrom < (dashcore :: hash_types :: BlockHash , dashcore :: hash_types :: BlockHash) > for Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash { unsafe fn ffi_from_const (ffi : * const Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash) -> (dashcore :: hash_types :: BlockHash , dashcore :: hash_types :: BlockHash) { let ffi_ref = & * ffi ; (ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_0) , ferment :: FFIConversionFrom :: ffi_from (ffi_ref . o_1)) } } impl ferment :: FFIConversionTo < (dashcore :: hash_types :: BlockHash , dashcore :: hash_types :: BlockHash) > for Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash { unsafe fn ffi_to_const (obj : (dashcore :: hash_types :: BlockHash , dashcore :: hash_types :: BlockHash)) -> * const Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash { ferment :: boxed (Self { o_0 : ferment :: FFIConversionTo :: ffi_to (obj . 0) , o_1 : ferment :: FFIConversionTo :: ffi_to (obj . 1) }) } } impl Drop for Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . o_0) ; ferment :: unbox_any (self . o_1) ; } } } # [no_mangle] pub unsafe extern "C" fn Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash_ctor (o_0 : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash , o_1 : * mut dash_spv_apple_bindings :: custom :: dashcore :: dashcore_hash_types_BlockHash) -> * mut Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash { ferment :: boxed (Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash { o_0 , o_1 }) } # [no_mangle] pub unsafe extern "C" fn Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash_destroy (ffi : * mut Tuple_dashcore_hash_types_BlockHash_dashcore_hash_types_BlockHash) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { pub ok : * mut crate :: fermented :: types :: dpp :: state_transition :: proof_result :: dpp_state_transition_proof_result_StateTransitionProofResult , pub error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error } impl ferment :: FFIConversionFrom < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > > for Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { unsafe fn ffi_from_const (ffi : * const Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error) -> Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: types :: dpp :: state_transition :: proof_result :: dpp_state_transition_proof_result_StateTransitionProofResult as ferment :: FFIConversionFrom < dpp :: state_transition :: proof_result :: StateTransitionProofResult >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error as ferment :: FFIConversionFrom < dash_spv_platform :: error :: Error >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error > > for Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { unsafe fn ffi_to_const (obj : Result < dpp :: state_transition :: proof_result :: StateTransitionProofResult , dash_spv_platform :: error :: Error >) -> * const Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error_ctor (ok : * mut crate :: fermented :: types :: dpp :: state_transition :: proof_result :: dpp_state_transition_proof_result_StateTransitionProofResult , error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error) -> * mut Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { ferment :: boxed (Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error_destroy (ffi : * mut Result_ok_dpp_state_transition_proof_result_StateTransitionProofResult_err_dash_spv_platform_error_Error) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dash_spv_coinjoin_wallet_provider_WalletProvider { pub obj : * mut dash_spv_coinjoin :: wallet_provider :: WalletProvider } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dash_spv_coinjoin :: wallet_provider :: WalletProvider > > for std_sync_Arc_dash_spv_coinjoin_wallet_provider_WalletProvider { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dash_spv_coinjoin_wallet_provider_WalletProvider) -> std :: sync :: Arc < dash_spv_coinjoin :: wallet_provider :: WalletProvider > { let ffi_ref = & * ffi ; std :: sync :: Arc :: from_raw (ffi_ref . obj) } } impl ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_coinjoin :: wallet_provider :: WalletProvider > > for std_sync_Arc_dash_spv_coinjoin_wallet_provider_WalletProvider { unsafe fn ffi_to_const (obj : std :: sync :: Arc < dash_spv_coinjoin :: wallet_provider :: WalletProvider >) -> * const std_sync_Arc_dash_spv_coinjoin_wallet_provider_WalletProvider { ferment :: boxed (Self { obj : std :: sync :: Arc :: into_raw (obj) . cast_mut () }) } } impl Drop for std_sync_Arc_dash_spv_coinjoin_wallet_provider_WalletProvider { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . obj) ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_coinjoin_wallet_provider_WalletProvider_ctor (obj : * mut dash_spv_coinjoin :: wallet_provider :: WalletProvider) -> * mut std_sync_Arc_dash_spv_coinjoin_wallet_provider_WalletProvider { ferment :: boxed (std_sync_Arc_dash_spv_coinjoin_wallet_provider_WalletProvider { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_coinjoin_wallet_provider_WalletProvider_destroy (ffi : * mut std_sync_Arc_dash_spv_coinjoin_wallet_provider_WalletProvider) { ferment :: unbox_any (ffi) ; } # [cfg (any (any (feature = "state-transitions")))] # [repr (C)] # [derive (Clone)] # [cfg (any (any (feature = "state-transitions")))] pub struct Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { pub count : usize , pub values : * mut * mut crate :: fermented :: generics :: Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl < 'a > ferment :: FFIConversionFrom < Vec < (dpp :: document :: Document , dpp :: data_contract :: document_type :: DocumentTypeRef < 'a > , platform_value :: types :: bytes_32 :: Bytes32) > > for Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { unsafe fn ffi_from_const (ffi : * const Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32) -> Vec < (dpp :: document :: Document , dpp :: data_contract :: document_type :: DocumentTypeRef < 'a > , platform_value :: types :: bytes_32 :: Bytes32) > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl < 'a > ferment :: FFIConversionTo < Vec < (dpp :: document :: Document , dpp :: data_contract :: document_type :: DocumentTypeRef < 'a > , platform_value :: types :: bytes_32 :: Bytes32) > > for Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { unsafe fn ffi_to_const (obj : Vec < (dpp :: document :: Document , dpp :: data_contract :: document_type :: DocumentTypeRef < 'a > , platform_value :: types :: bytes_32 :: Bytes32) >) -> * const Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl Drop for Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [cfg (any (any (feature = "state-transitions")))] # [no_mangle] pub unsafe extern "C" fn Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32_ctor (count : usize , values : * mut * mut crate :: fermented :: generics :: Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32) -> * mut Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { ferment :: boxed (Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32 { count , values }) } # [cfg (any (any (feature = "state-transitions")))] # [no_mangle] pub unsafe extern "C" fn Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32_destroy (ffi : * mut Vec_Tuple_dpp_document_Document_dpp_data_contract_document_type_DocumentTypeRef_platform_value_types_bytes_32_Bytes32) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , bool , bool , bool , i32 , * mut dash_spv_coinjoin :: wallet_ex :: WalletEx) -> * mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem) } impl Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : bool , o_2 : bool , o_3 : bool , o_4 : i32 , o_5 : & dash_spv_coinjoin :: wallet_ex :: WalletEx) -> Vec < dash_spv_coinjoin :: coin_selection :: compact_tally_item :: CompactTallyItem > { let ffi_result = (self . caller) (o_0 , o_1 , o_2 , o_3 , o_4 , ferment :: boxed (o_5 . clone ())) ; let result = < crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem as ferment :: FFIConversionFrom < Vec < dash_spv_coinjoin :: coin_selection :: compact_tally_item :: CompactTallyItem > >> :: ffi_from (ffi_result) ; (self . destructor) (ffi_result) ; result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , bool , bool , bool , i32 , * mut dash_spv_coinjoin :: wallet_ex :: WalletEx) -> * mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem , destructor : unsafe extern "C" fn (* mut crate :: fermented :: generics :: Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem)) -> * mut Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_bool_bool_bool_i32_dash_spv_coinjoin_wallet_ex_WalletEx_RTRN_Vec_dash_spv_coinjoin_coin_selection_compact_tally_item_CompactTallyItem) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_String_values_Vec_u8 { pub count : usize , pub keys : * mut * mut std :: os :: raw :: c_char , pub values : * mut * mut crate :: fermented :: generics :: Vec_u8 } impl ferment :: FFIConversionFrom < std :: collections :: HashMap < String , Vec < u8 > > > for std_collections_Map_keys_String_values_Vec_u8 { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_String_values_Vec_u8) -> std :: collections :: HashMap < String , Vec < u8 > > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (o) , | o | < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: HashMap < String , Vec < u8 > > > for std_collections_Map_keys_String_values_Vec_u8 { unsafe fn ffi_to_const (obj : std :: collections :: HashMap < String , Vec < u8 > >) -> * const std_collections_Map_keys_String_values_Vec_u8 { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_String_values_Vec_u8 { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr_composer (self . keys , self . count , ferment :: unbox_string) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_String_values_Vec_u8_ctor (count : usize , keys : * mut * mut std :: os :: raw :: c_char , values : * mut * mut crate :: fermented :: generics :: Vec_u8) -> * mut std_collections_Map_keys_String_values_Vec_u8 { ferment :: boxed (std_collections_Map_keys_String_values_Vec_u8 { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_String_values_Vec_u8_destroy (ffi : * mut std_collections_Map_keys_String_values_Vec_u8) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct indexmap_IndexMap_u32_dpp_identity_identity_Identity { pub count : usize , pub keys : * mut u32 , pub values : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity } impl ferment :: FFIConversionFrom < indexmap :: IndexMap < u32 , dpp :: identity :: identity :: Identity > > for indexmap_IndexMap_u32_dpp_identity_identity_Identity { unsafe fn ffi_from_const (ffi : * const indexmap_IndexMap_u32_dpp_identity_identity_Identity) -> indexmap :: IndexMap < u32 , dpp :: identity :: identity :: Identity > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | o , | o | < crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity as ferment :: FFIConversionFrom < dpp :: identity :: identity :: Identity >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < indexmap :: IndexMap < u32 , dpp :: identity :: identity :: Identity > > for indexmap_IndexMap_u32_dpp_identity_identity_Identity { unsafe fn ffi_to_const (obj : indexmap :: IndexMap < u32 , dpp :: identity :: identity :: Identity >) -> * const indexmap_IndexMap_u32_dpp_identity_identity_Identity { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_primitive_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for indexmap_IndexMap_u32_dpp_identity_identity_Identity { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn indexmap_IndexMap_u32_dpp_identity_identity_Identity_ctor (count : usize , keys : * mut u32 , values : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity) -> * mut indexmap_IndexMap_u32_dpp_identity_identity_Identity { ferment :: boxed (indexmap_IndexMap_u32_dpp_identity_identity_Identity { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn indexmap_IndexMap_u32_dpp_identity_identity_Identity_destroy (ffi : * mut indexmap_IndexMap_u32_dpp_identity_identity_Identity) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_std_collections_BTreeSet_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { pub ok : * mut crate :: fermented :: generics :: std_collections_BTreeSet_dashcore_hash_types_BlockHash , pub error : * mut crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: processor :: processing_error :: dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError } impl ferment :: FFIConversionFrom < Result < std :: collections :: BTreeSet < dashcore :: hash_types :: BlockHash > , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError > > for Result_ok_std_collections_BTreeSet_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { unsafe fn ffi_from_const (ffi : * const Result_ok_std_collections_BTreeSet_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError) -> Result < std :: collections :: BTreeSet < dashcore :: hash_types :: BlockHash > , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: generics :: std_collections_BTreeSet_dashcore_hash_types_BlockHash as ferment :: FFIConversionFrom < std :: collections :: BTreeSet < dashcore :: hash_types :: BlockHash > >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: processor :: processing_error :: dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError as ferment :: FFIConversionFrom < dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < std :: collections :: BTreeSet < dashcore :: hash_types :: BlockHash > , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError > > for Result_ok_std_collections_BTreeSet_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { unsafe fn ffi_to_const (obj : Result < std :: collections :: BTreeSet < dashcore :: hash_types :: BlockHash > , dash_spv_masternode_processor :: processing :: processor :: processing_error :: ProcessingError >) -> * const Result_ok_std_collections_BTreeSet_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_std_collections_BTreeSet_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_std_collections_BTreeSet_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_ctor (ok : * mut crate :: fermented :: generics :: std_collections_BTreeSet_dashcore_hash_types_BlockHash , error : * mut crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: processor :: processing_error :: dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError) -> * mut Result_ok_std_collections_BTreeSet_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ferment :: boxed (Result_ok_std_collections_BTreeSet_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_std_collections_BTreeSet_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError_destroy (ffi : * mut Result_ok_std_collections_BTreeSet_dashcore_hash_types_BlockHash_err_dash_spv_masternode_processor_processing_processor_processing_error_ProcessingError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { pub ok : * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity , pub error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error } impl ferment :: FFIConversionFrom < Result < Option < dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error > > for Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { unsafe fn ffi_from_const (ffi : * const Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error) -> Result < Option < dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity as ferment :: FFIConversionFrom < dpp :: identity :: identity :: Identity >> :: ffi_from_opt (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error as ferment :: FFIConversionFrom < dash_spv_platform :: error :: Error >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < Option < dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error > > for Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { unsafe fn ffi_to_const (obj : Result < Option < dpp :: identity :: identity :: Identity > , dash_spv_platform :: error :: Error >) -> * const Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to_opt (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error_ctor (ok : * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity , error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error) -> * mut Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { ferment :: boxed (Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error_destroy (ffi : * mut Result_ok_Option_dpp_identity_identity_Identity_err_dash_spv_platform_error_Error) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_u32_values_dash_spv_platform_identity_model_KeyInfo { pub count : usize , pub keys : * mut u32 , pub values : * mut * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_KeyInfo } impl ferment :: FFIConversionFrom < std :: collections :: HashMap < u32 , dash_spv_platform :: identity :: model :: KeyInfo > > for std_collections_Map_keys_u32_values_dash_spv_platform_identity_model_KeyInfo { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_u32_values_dash_spv_platform_identity_model_KeyInfo) -> std :: collections :: HashMap < u32 , dash_spv_platform :: identity :: model :: KeyInfo > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | o , | o | < crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_KeyInfo as ferment :: FFIConversionFrom < dash_spv_platform :: identity :: model :: KeyInfo >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: HashMap < u32 , dash_spv_platform :: identity :: model :: KeyInfo > > for std_collections_Map_keys_u32_values_dash_spv_platform_identity_model_KeyInfo { unsafe fn ffi_to_const (obj : std :: collections :: HashMap < u32 , dash_spv_platform :: identity :: model :: KeyInfo >) -> * const std_collections_Map_keys_u32_values_dash_spv_platform_identity_model_KeyInfo { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_primitive_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_u32_values_dash_spv_platform_identity_model_KeyInfo { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_u32_values_dash_spv_platform_identity_model_KeyInfo_ctor (count : usize , keys : * mut u32 , values : * mut * mut crate :: fermented :: types :: dash_spv_platform :: identity :: model :: dash_spv_platform_identity_model_KeyInfo) -> * mut std_collections_Map_keys_u32_values_dash_spv_platform_identity_model_KeyInfo { ferment :: boxed (std_collections_Map_keys_u32_values_dash_spv_platform_identity_model_KeyInfo { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_u32_values_dash_spv_platform_identity_model_KeyInfo_destroy (ffi : * mut std_collections_Map_keys_u32_values_dash_spv_platform_identity_model_KeyInfo) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_RTRN_bool { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey) -> bool , destructor : unsafe extern "C" fn (bool) } impl Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_RTRN_bool { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : & dpp :: identity :: identity_public_key :: IdentityPublicKey) -> bool { let ffi_result = (self . caller) (o_0 , < crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey as ferment :: FFIConversionTo < dpp :: identity :: identity_public_key :: IdentityPublicKey >> :: ffi_to (o_1 . clone ())) ; ffi_result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_RTRN_bool { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_RTRN_bool { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_RTRN_bool_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: types :: dpp :: identity :: identity_public_key :: dpp_identity_identity_public_key_IdentityPublicKey) -> bool , destructor : unsafe extern "C" fn (bool)) -> * mut Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_RTRN_bool { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_RTRN_bool { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_RTRN_bool_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_dpp_identity_identity_public_key_IdentityPublicKey_RTRN_bool) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dpp_document_Document { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document } impl ferment :: FFIConversionFrom < Vec < dpp :: document :: Document > > for Vec_dpp_document_Document { unsafe fn ffi_from_const (ffi : * const Vec_dpp_document_Document) -> Vec < dpp :: document :: Document > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dpp :: document :: Document > > for Vec_dpp_document_Document { unsafe fn ffi_to_const (obj : Vec < dpp :: document :: Document >) -> * const Vec_dpp_document_Document { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dpp_document_Document { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_document_Document_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document) -> * mut Vec_dpp_document_Document { ferment :: boxed (Vec_dpp_document_Document { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_document_Document_destroy (ffi : * mut Vec_dpp_document_Document) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dash_spv_platform_contract_manager_ContractsManager { pub obj : * mut dash_spv_platform :: contract :: manager :: ContractsManager } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dash_spv_platform :: contract :: manager :: ContractsManager > > for std_sync_Arc_dash_spv_platform_contract_manager_ContractsManager { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dash_spv_platform_contract_manager_ContractsManager) -> std :: sync :: Arc < dash_spv_platform :: contract :: manager :: ContractsManager > { let ffi_ref = & * ffi ; std :: sync :: Arc :: from_raw (ffi_ref . obj) } } impl ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_platform :: contract :: manager :: ContractsManager > > for std_sync_Arc_dash_spv_platform_contract_manager_ContractsManager { unsafe fn ffi_to_const (obj : std :: sync :: Arc < dash_spv_platform :: contract :: manager :: ContractsManager >) -> * const std_sync_Arc_dash_spv_platform_contract_manager_ContractsManager { ferment :: boxed (Self { obj : std :: sync :: Arc :: into_raw (obj) . cast_mut () }) } } impl Drop for std_sync_Arc_dash_spv_platform_contract_manager_ContractsManager { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . obj) ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_platform_contract_manager_ContractsManager_ctor (obj : * mut dash_spv_platform :: contract :: manager :: ContractsManager) -> * mut std_sync_Arc_dash_spv_platform_contract_manager_ContractsManager { ferment :: boxed (std_sync_Arc_dash_spv_platform_contract_manager_ContractsManager { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_platform_contract_manager_ContractsManager_destroy (ffi : * mut std_sync_Arc_dash_spv_platform_contract_manager_ContractsManager) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_identity_identity_Identity { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub values : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity } impl ferment :: FFIConversionFrom < std :: collections :: HashMap < platform_value :: types :: identifier :: Identifier , dpp :: identity :: identity :: Identity > > for std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_identity_identity_Identity { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_identity_identity_Identity) -> std :: collections :: HashMap < platform_value :: types :: identifier :: Identifier , dpp :: identity :: identity :: Identity > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity as ferment :: FFIConversionFrom < dpp :: identity :: identity :: Identity >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: HashMap < platform_value :: types :: identifier :: Identifier , dpp :: identity :: identity :: Identity > > for std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_identity_identity_Identity { unsafe fn ffi_to_const (obj : std :: collections :: HashMap < platform_value :: types :: identifier :: Identifier , dpp :: identity :: identity :: Identity >) -> * const std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_identity_identity_Identity { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_identity_identity_Identity { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_identity_identity_Identity_ctor (count : usize , keys : * mut * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , values : * mut * mut crate :: fermented :: types :: dpp :: identity :: identity :: dpp_identity_identity_Identity) -> * mut std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_identity_identity_Identity { ferment :: boxed (std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_identity_identity_Identity { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_identity_identity_Identity_destroy (ffi : * mut std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dpp_identity_identity_Identity) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Arr_u8_96 { pub count : usize , pub values : * mut u8 } impl ferment :: FFIConversionFrom < [u8 ; 96] > for Arr_u8_96 { unsafe fn ffi_from_const (ffi : * const Arr_u8_96) -> [u8 ; 96] { let ffi_ref = & * ffi ; let vec : Vec < u8 > = ferment :: from_primitive_group (ffi_ref . values , ffi_ref . count) ; vec . try_into () . unwrap () } } impl ferment :: FFIConversionTo < [u8 ; 96] > for Arr_u8_96 { unsafe fn ffi_to_const (obj : [u8 ; 96]) -> * const Arr_u8_96 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_primitive_group (obj . into_iter ()) }) } } impl Drop for Arr_u8_96 { fn drop (& mut self) { unsafe { ferment :: unbox_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Arr_u8_96_ctor (count : usize , values : * mut u8) -> * mut Arr_u8_96 { ferment :: boxed (Arr_u8_96 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Arr_u8_96_destroy (ffi : * mut Arr_u8_96) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { pub obj : * mut crate :: fermented :: generics :: std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser } impl ferment :: FFIConversionFrom < std :: sync :: RwLock < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dash_spv_platform :: models :: transient_dashpay_user :: TransientDashPayUser > > > for std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { unsafe fn ffi_from_const (ffi : * const std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> std :: sync :: RwLock < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dash_spv_platform :: models :: transient_dashpay_user :: TransientDashPayUser > > { let ffi_ref = & * ffi ; std :: sync :: RwLock :: new (ferment :: FFIConversionFrom :: ffi_from (ffi_ref . obj)) } } impl ferment :: FFIConversionTo < std :: sync :: RwLock < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dash_spv_platform :: models :: transient_dashpay_user :: TransientDashPayUser > > > for std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { unsafe fn ffi_to_const (obj : std :: sync :: RwLock < std :: collections :: BTreeMap < platform_value :: types :: identifier :: Identifier , dash_spv_platform :: models :: transient_dashpay_user :: TransientDashPayUser > >) -> * const std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { ferment :: boxed (Self { obj : ferment :: FFIConversionTo :: ffi_to (obj . into_inner () . expect ("Err")) }) } } impl Drop for std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . obj) ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_ctor (obj : * mut crate :: fermented :: generics :: std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) -> * mut std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { ferment :: boxed (std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser_destroy (ffi : * mut std_sync_RwLock_std_collections_Map_keys_platform_value_types_identifier_Identifier_values_dash_spv_platform_models_transient_dashpay_user_TransientDashPayUser) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dpp_errors_consensus_consensus_error_ConsensusError { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dpp :: errors :: consensus :: consensus_error :: dpp_errors_consensus_consensus_error_ConsensusError } impl ferment :: FFIConversionFrom < Vec < dpp :: errors :: consensus :: consensus_error :: ConsensusError > > for Vec_dpp_errors_consensus_consensus_error_ConsensusError { unsafe fn ffi_from_const (ffi : * const Vec_dpp_errors_consensus_consensus_error_ConsensusError) -> Vec < dpp :: errors :: consensus :: consensus_error :: ConsensusError > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dpp :: errors :: consensus :: consensus_error :: ConsensusError > > for Vec_dpp_errors_consensus_consensus_error_ConsensusError { unsafe fn ffi_to_const (obj : Vec < dpp :: errors :: consensus :: consensus_error :: ConsensusError >) -> * const Vec_dpp_errors_consensus_consensus_error_ConsensusError { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dpp_errors_consensus_consensus_error_ConsensusError { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_errors_consensus_consensus_error_ConsensusError_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dpp :: errors :: consensus :: consensus_error :: dpp_errors_consensus_consensus_error_ConsensusError) -> * mut Vec_dpp_errors_consensus_consensus_error_ConsensusError { ferment :: boxed (Vec_dpp_errors_consensus_consensus_error_ConsensusError { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_errors_consensus_consensus_error_ConsensusError_destroy (ffi : * mut Vec_dpp_errors_consensus_consensus_error_ConsensusError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError { pub ok : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature , pub error : * mut crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: core_provider :: dash_spv_masternode_processor_processing_core_provider_CoreProviderError } impl ferment :: FFIConversionFrom < Result < dashcore :: bls_sig_utils :: BLSSignature , dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError > > for Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError { unsafe fn ffi_from_const (ffi : * const Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError) -> Result < dashcore :: bls_sig_utils :: BLSSignature , dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature as ferment :: FFIConversionFrom < dashcore :: bls_sig_utils :: BLSSignature >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: core_provider :: dash_spv_masternode_processor_processing_core_provider_CoreProviderError as ferment :: FFIConversionFrom < dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < dashcore :: bls_sig_utils :: BLSSignature , dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError > > for Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError { unsafe fn ffi_to_const (obj : Result < dashcore :: bls_sig_utils :: BLSSignature , dash_spv_masternode_processor :: processing :: core_provider :: CoreProviderError >) -> * const Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError_ctor (ok : * mut crate :: fermented :: types :: dashcore :: bls_sig_utils :: dashcore_bls_sig_utils_BLSSignature , error : * mut crate :: fermented :: types :: dash_spv_masternode_processor :: processing :: core_provider :: dash_spv_masternode_processor_processing_core_provider_CoreProviderError) -> * mut Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError { ferment :: boxed (Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError_destroy (ffi : * mut Result_ok_dashcore_bls_sig_utils_BLSSignature_err_dash_spv_masternode_processor_processing_core_provider_CoreProviderError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError { pub ok : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight , pub error : * mut crate :: fermented :: types :: drive_proof_verifier :: error :: drive_proof_verifier_error_ContextProviderError } impl ferment :: FFIConversionFrom < Result < dpp :: prelude :: CoreBlockHeight , drive_proof_verifier :: error :: ContextProviderError > > for Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError { unsafe fn ffi_from_const (ffi : * const Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError) -> Result < dpp :: prelude :: CoreBlockHeight , drive_proof_verifier :: error :: ContextProviderError > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight as ferment :: FFIConversionFrom < dpp :: prelude :: CoreBlockHeight >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: drive_proof_verifier :: error :: drive_proof_verifier_error_ContextProviderError as ferment :: FFIConversionFrom < drive_proof_verifier :: error :: ContextProviderError >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < dpp :: prelude :: CoreBlockHeight , drive_proof_verifier :: error :: ContextProviderError > > for Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError { unsafe fn ffi_to_const (obj : Result < dpp :: prelude :: CoreBlockHeight , drive_proof_verifier :: error :: ContextProviderError >) -> * const Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError_ctor (ok : * mut crate :: fermented :: types :: dpp :: prelude :: dpp_prelude_CoreBlockHeight , error : * mut crate :: fermented :: types :: drive_proof_verifier :: error :: drive_proof_verifier_error_ContextProviderError) -> * mut Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError { ferment :: boxed (Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError_destroy (ffi : * mut Result_ok_dpp_prelude_CoreBlockHeight_err_drive_proof_verifier_error_ContextProviderError) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_u8_32 { pub count : usize , pub values : * mut * mut crate :: fermented :: generics :: Arr_u8_32 } impl ferment :: FFIConversionFrom < Vec < [u8 ; 32] > > for Vec_u8_32 { unsafe fn ffi_from_const (ffi : * const Vec_u8_32) -> Vec < [u8 ; 32] > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < [u8 ; 32] > > for Vec_u8_32 { unsafe fn ffi_to_const (obj : Vec < [u8 ; 32] >) -> * const Vec_u8_32 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_u8_32 { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_u8_32_ctor (count : usize , values : * mut * mut crate :: fermented :: generics :: Arr_u8_32) -> * mut Vec_u8_32 { ferment :: boxed (Vec_u8_32 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_u8_32_destroy (ffi : * mut Vec_u8_32) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_bool_RTRN_String { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , bool) -> * mut std :: os :: raw :: c_char , destructor : unsafe extern "C" fn (* mut std :: os :: raw :: c_char) } impl Fn_ARGS_std_os_raw_c_void_bool_RTRN_String { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : bool) -> String { let ffi_result = (self . caller) (o_0 , o_1) ; let result = < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (ffi_result) ; (self . destructor) (ffi_result) ; result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_bool_RTRN_String { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_bool_RTRN_String { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_bool_RTRN_String_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , bool) -> * mut std :: os :: raw :: c_char , destructor : unsafe extern "C" fn (* mut std :: os :: raw :: c_char)) -> * mut Fn_ARGS_std_os_raw_c_void_bool_RTRN_String { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_bool_RTRN_String { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_bool_RTRN_String_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_bool_RTRN_String) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_collections_Map_keys_String_values_dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization { pub count : usize , pub keys : * mut * mut std :: os :: raw :: c_char , pub values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_configuration_localization :: dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization } impl ferment :: FFIConversionFrom < std :: collections :: BTreeMap < String , dpp :: data_contract :: associated_token :: token_configuration_localization :: TokenConfigurationLocalization > > for std_collections_Map_keys_String_values_dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_String_values_dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization) -> std :: collections :: BTreeMap < String , dpp :: data_contract :: associated_token :: token_configuration_localization :: TokenConfigurationLocalization > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < std :: os :: raw :: c_char as ferment :: FFIConversionFrom < String >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_configuration_localization :: dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization as ferment :: FFIConversionFrom < dpp :: data_contract :: associated_token :: token_configuration_localization :: TokenConfigurationLocalization >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < std :: collections :: BTreeMap < String , dpp :: data_contract :: associated_token :: token_configuration_localization :: TokenConfigurationLocalization > > for std_collections_Map_keys_String_values_dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization { unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < String , dpp :: data_contract :: associated_token :: token_configuration_localization :: TokenConfigurationLocalization >) -> * const std_collections_Map_keys_String_values_dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_complex_group (obj . values () . cloned ()) }) } } impl Drop for std_collections_Map_keys_String_values_dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr_composer (self . keys , self . count , ferment :: unbox_string) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_String_values_dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization_ctor (count : usize , keys : * mut * mut std :: os :: raw :: c_char , values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: associated_token :: token_configuration_localization :: dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization) -> * mut std_collections_Map_keys_String_values_dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization { ferment :: boxed (std_collections_Map_keys_String_values_dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn std_collections_Map_keys_String_values_dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization_destroy (ffi : * mut std_collections_Map_keys_String_values_dpp_data_contract_associated_token_token_configuration_localization_TokenConfigurationLocalization) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_dpp_document_Document_err_dash_spv_platform_error_Error { pub ok : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document , pub error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error } impl ferment :: FFIConversionFrom < Result < dpp :: document :: Document , dash_spv_platform :: error :: Error > > for Result_ok_dpp_document_Document_err_dash_spv_platform_error_Error { unsafe fn ffi_from_const (ffi : * const Result_ok_dpp_document_Document_err_dash_spv_platform_error_Error) -> Result < dpp :: document :: Document , dash_spv_platform :: error :: Error > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionFrom < dpp :: document :: Document >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error as ferment :: FFIConversionFrom < dash_spv_platform :: error :: Error >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < dpp :: document :: Document , dash_spv_platform :: error :: Error > > for Result_ok_dpp_document_Document_err_dash_spv_platform_error_Error { unsafe fn ffi_to_const (obj : Result < dpp :: document :: Document , dash_spv_platform :: error :: Error >) -> * const Result_ok_dpp_document_Document_err_dash_spv_platform_error_Error { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_dpp_document_Document_err_dash_spv_platform_error_Error { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_dpp_document_Document_err_dash_spv_platform_error_Error_ctor (ok : * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document , error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error) -> * mut Result_ok_dpp_document_Document_err_dash_spv_platform_error_Error { ferment :: boxed (Result_ok_dpp_document_Document_err_dash_spv_platform_error_Error { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_dpp_document_Document_err_dash_spv_platform_error_Error_destroy (ffi : * mut Result_ok_dpp_document_Document_err_dash_spv_platform_error_Error) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Result_ok_Vec_u8_err_dash_spv_platform_error_Error { pub ok : * mut crate :: fermented :: generics :: Vec_u8 , pub error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error } impl ferment :: FFIConversionFrom < Result < Vec < u8 > , dash_spv_platform :: error :: Error > > for Result_ok_Vec_u8_err_dash_spv_platform_error_Error { unsafe fn ffi_from_const (ffi : * const Result_ok_Vec_u8_err_dash_spv_platform_error_Error) -> Result < Vec < u8 > , dash_spv_platform :: error :: Error > { let ffi_ref = & * ffi ; ferment :: fold_to_result (ffi_ref . ok , | o | < crate :: fermented :: generics :: Vec_u8 as ferment :: FFIConversionFrom < Vec < u8 > >> :: ffi_from (o) , ffi_ref . error , | o | < crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error as ferment :: FFIConversionFrom < dash_spv_platform :: error :: Error >> :: ffi_from (o)) } } impl ferment :: FFIConversionTo < Result < Vec < u8 > , dash_spv_platform :: error :: Error > > for Result_ok_Vec_u8_err_dash_spv_platform_error_Error { unsafe fn ffi_to_const (obj : Result < Vec < u8 > , dash_spv_platform :: error :: Error >) -> * const Result_ok_Vec_u8_err_dash_spv_platform_error_Error { ferment :: boxed ({ let (ok , error) = ferment :: to_result (obj , | o | ferment :: FFIConversionTo :: ffi_to (o) , | o | ferment :: FFIConversionTo :: ffi_to (o)) ; Self { ok , error } }) } } impl Drop for Result_ok_Vec_u8_err_dash_spv_platform_error_Error { fn drop (& mut self) { unsafe { ferment :: unbox_any_opt (self . ok) ; ferment :: unbox_any_opt (self . error) ; } } } # [no_mangle] pub unsafe extern "C" fn Result_ok_Vec_u8_err_dash_spv_platform_error_Error_ctor (ok : * mut crate :: fermented :: generics :: Vec_u8 , error : * mut crate :: fermented :: types :: dash_spv_platform :: error :: dash_spv_platform_error_Error) -> * mut Result_ok_Vec_u8_err_dash_spv_platform_error_Error { ferment :: boxed (Result_ok_Vec_u8_err_dash_spv_platform_error_Error { ok , error }) } # [no_mangle] pub unsafe extern "C" fn Result_ok_Vec_u8_err_dash_spv_platform_error_Error_destroy (ffi : * mut Result_ok_Vec_u8_err_dash_spv_platform_error_Error) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , pub values : * mut * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document } impl ferment :: FFIConversionFrom < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > > for indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document { unsafe fn ffi_from_const (ffi : * const indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document) -> indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > { let ffi_ref = & * ffi ; ferment :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | < crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier as ferment :: FFIConversionFrom < platform_value :: types :: identifier :: Identifier >> :: ffi_from (o) , | o | < crate :: fermented :: types :: dpp :: document :: dpp_document_Document as ferment :: FFIConversionFrom < dpp :: document :: Document >> :: ffi_from_opt (o)) } } impl ferment :: FFIConversionTo < indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > > > for indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document { unsafe fn ffi_to_const (obj : indexmap :: IndexMap < platform_value :: types :: identifier :: Identifier , Option < dpp :: document :: Document > >) -> * const indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document { ferment :: boxed (Self { count : obj . len () , keys : ferment :: to_complex_group (obj . keys () . cloned ()) , values : ferment :: to_opt_complex_group (obj . values () . cloned ()) }) } } impl Drop for indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . keys , self . count) ; ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_ctor (count : usize , keys : * mut * mut crate :: fermented :: types :: platform_value :: types :: identifier :: platform_value_types_identifier_Identifier , values : * mut * mut crate :: fermented :: types :: dpp :: document :: dpp_document_Document) -> * mut indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document { ferment :: boxed (indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document { count , keys , values }) } # [no_mangle] pub unsafe extern "C" fn indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document_destroy (ffi : * mut indexmap_IndexMap_platform_value_types_identifier_Identifier_Option_dpp_document_Document) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_dash_spv_platform_document_usernames_UsernameStatus_RTRN_ { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus) } impl Fn_ARGS_std_os_raw_c_void_dash_spv_platform_document_usernames_UsernameStatus_RTRN_ { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : dash_spv_platform :: document :: usernames :: UsernameStatus) { let ffi_result = (self . caller) (o_0 , < crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus as ferment :: FFIConversionTo < dash_spv_platform :: document :: usernames :: UsernameStatus >> :: ffi_to (o_1)) ; ffi_result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_dash_spv_platform_document_usernames_UsernameStatus_RTRN_ { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_dash_spv_platform_document_usernames_UsernameStatus_RTRN_ { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_dash_spv_platform_document_usernames_UsernameStatus_RTRN__ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: types :: dash_spv_platform :: document :: usernames :: dash_spv_platform_document_usernames_UsernameStatus)) -> * mut Fn_ARGS_std_os_raw_c_void_dash_spv_platform_document_usernames_UsernameStatus_RTRN_ { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_dash_spv_platform_document_usernames_UsernameStatus_RTRN_ { caller }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_dash_spv_platform_document_usernames_UsernameStatus_RTRN__destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_dash_spv_platform_document_usernames_UsernameStatus_RTRN_) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { pub obj : * mut crate :: fermented :: generics :: std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity } impl ferment :: FFIConversionFrom < std :: sync :: Arc < std :: sync :: RwLock < std :: collections :: BTreeMap < String , std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > > > > > for std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity) -> std :: sync :: Arc < std :: sync :: RwLock < std :: collections :: BTreeMap < String , std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > > > > { let ffi_ref = & * ffi ; std :: sync :: Arc :: new (ferment :: FFIConversionFrom :: ffi_from (ffi_ref . obj)) } } impl ferment :: FFIConversionTo < std :: sync :: Arc < std :: sync :: RwLock < std :: collections :: BTreeMap < String , std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > > > > > for std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { unsafe fn ffi_to_const (obj : std :: sync :: Arc < std :: sync :: RwLock < std :: collections :: BTreeMap < String , std :: collections :: BTreeMap < [u8 ; 20] , dpp :: identity :: identity :: Identity > > > >) -> * const std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { ferment :: boxed (Self { obj : ferment :: FFIConversionTo :: ffi_to (std :: sync :: RwLock :: new (obj . read () . expect ("Poisoned") . clone ())) }) } } impl Drop for std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . obj) ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_ctor (obj : * mut crate :: fermented :: generics :: std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity) -> * mut std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { ferment :: boxed (std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity_destroy (ffi : * mut std_sync_Arc_std_sync_RwLock_std_collections_Map_keys_String_values_std_collections_Map_keys_u8_arr_20_values_dpp_identity_identity_Identity) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_Vec_u8 { pub count : usize , pub values : * mut * mut crate :: fermented :: generics :: Vec_u8 } impl ferment :: FFIConversionFrom < Vec < Vec < u8 > > > for Vec_Vec_u8 { unsafe fn ffi_from_const (ffi : * const Vec_Vec_u8) -> Vec < Vec < u8 > > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < Vec < u8 > > > for Vec_Vec_u8 { unsafe fn ffi_to_const (obj : Vec < Vec < u8 > >) -> * const Vec_Vec_u8 { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_Vec_u8 { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_Vec_u8_ctor (count : usize , values : * mut * mut crate :: fermented :: generics :: Vec_u8) -> * mut Vec_Vec_u8 { ferment :: boxed (Vec_Vec_u8 { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_Vec_u8_destroy (ffi : * mut Vec_Vec_u8) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Vec_dpp_data_contract_document_type_index_IndexProperty { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_IndexProperty } impl ferment :: FFIConversionFrom < Vec < dpp :: data_contract :: document_type :: index :: IndexProperty > > for Vec_dpp_data_contract_document_type_index_IndexProperty { unsafe fn ffi_from_const (ffi : * const Vec_dpp_data_contract_document_type_index_IndexProperty) -> Vec < dpp :: data_contract :: document_type :: index :: IndexProperty > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } impl ferment :: FFIConversionTo < Vec < dpp :: data_contract :: document_type :: index :: IndexProperty > > for Vec_dpp_data_contract_document_type_index_IndexProperty { unsafe fn ffi_to_const (obj : Vec < dpp :: data_contract :: document_type :: index :: IndexProperty >) -> * const Vec_dpp_data_contract_document_type_index_IndexProperty { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } impl Drop for Vec_dpp_data_contract_document_type_index_IndexProperty { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_data_contract_document_type_index_IndexProperty_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dpp :: data_contract :: document_type :: index :: dpp_data_contract_document_type_index_IndexProperty) -> * mut Vec_dpp_data_contract_document_type_index_IndexProperty { ferment :: boxed (Vec_dpp_data_contract_document_type_index_IndexProperty { count , values }) } # [no_mangle] pub unsafe extern "C" fn Vec_dpp_data_contract_document_type_index_IndexProperty_destroy (ffi : * mut Vec_dpp_data_contract_document_type_index_IndexProperty) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct std_sync_Arc_dash_spv_platform_cache_PlatformCache { pub obj : * mut dash_spv_platform :: cache :: PlatformCache } impl ferment :: FFIConversionFrom < std :: sync :: Arc < dash_spv_platform :: cache :: PlatformCache > > for std_sync_Arc_dash_spv_platform_cache_PlatformCache { unsafe fn ffi_from_const (ffi : * const std_sync_Arc_dash_spv_platform_cache_PlatformCache) -> std :: sync :: Arc < dash_spv_platform :: cache :: PlatformCache > { let ffi_ref = & * ffi ; std :: sync :: Arc :: from_raw (ffi_ref . obj) } } impl ferment :: FFIConversionTo < std :: sync :: Arc < dash_spv_platform :: cache :: PlatformCache > > for std_sync_Arc_dash_spv_platform_cache_PlatformCache { unsafe fn ffi_to_const (obj : std :: sync :: Arc < dash_spv_platform :: cache :: PlatformCache >) -> * const std_sync_Arc_dash_spv_platform_cache_PlatformCache { ferment :: boxed (Self { obj : std :: sync :: Arc :: into_raw (obj) . cast_mut () }) } } impl Drop for std_sync_Arc_dash_spv_platform_cache_PlatformCache { fn drop (& mut self) { unsafe { ferment :: unbox_any (self . obj) ; } } } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_platform_cache_PlatformCache_ctor (obj : * mut dash_spv_platform :: cache :: PlatformCache) -> * mut std_sync_Arc_dash_spv_platform_cache_PlatformCache { ferment :: boxed (std_sync_Arc_dash_spv_platform_cache_PlatformCache { obj }) } # [no_mangle] pub unsafe extern "C" fn std_sync_Arc_dash_spv_platform_cache_PlatformCache_destroy (ffi : * mut std_sync_Arc_dash_spv_platform_cache_PlatformCache) { ferment :: unbox_any (ffi) ; } # [cfg (any (any (feature = "state-transitions")))] # [repr (C)] # [derive (Clone)] # [cfg (any (any (feature = "state-transitions")))] pub struct Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl ferment :: FFIConversionFrom < Vec < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition > > for Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { unsafe fn ffi_from_const (ffi : * const Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition) -> Vec < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition > { let ffi_ref = & * ffi ; ferment :: from_complex_group (ffi_ref . values , ffi_ref . count) } } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl ferment :: FFIConversionTo < Vec < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition > > for Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { unsafe fn ffi_to_const (obj : Vec < dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: DocumentTransition >) -> * const Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { ferment :: boxed (Self { count : obj . len () , values : ferment :: to_complex_group (obj . into_iter ()) }) } } # [cfg (any (any (feature = "state-transitions")))] # [cfg (any (any (feature = "state-transitions")))] impl Drop for Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { fn drop (& mut self) { unsafe { ferment :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [cfg (any (any (feature = "state-transitions")))] # [no_mangle] pub unsafe extern "C" fn Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition_ctor (count : usize , values : * mut * mut crate :: fermented :: types :: dpp :: state_transition :: state_transitions :: document :: batch_transition :: batched_transition :: document_transition :: dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition) -> * mut Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { ferment :: boxed (Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition { count , values }) } # [cfg (any (any (feature = "state-transitions")))] # [no_mangle] pub unsafe extern "C" fn Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition_destroy (ffi : * mut Vec_dpp_state_transition_state_transitions_document_batch_transition_batched_transition_document_transition_DocumentTransition) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN_ { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: generics :: Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry) } impl Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN_ { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void , o_1 : Vec < dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry >) { let ffi_result = (self . caller) (o_0 , < crate :: fermented :: generics :: Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry as ferment :: FFIConversionTo < Vec < dashcore :: sml :: masternode_list_entry :: qualified_masternode_list_entry :: QualifiedMasternodeListEntry > >> :: ffi_to (o_1)) ; ffi_result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN_ { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN_ { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN__ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void , * mut crate :: fermented :: generics :: Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry)) -> * mut Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN_ { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN_ { caller }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN__destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_Vec_dashcore_sml_masternode_list_entry_qualified_masternode_list_entry_QualifiedMasternodeListEntry_RTRN_) { ferment :: unbox_any (ffi) ; } # [repr (C)] # [derive (Clone)] pub struct Fn_ARGS_std_os_raw_c_void_RTRN_usize { caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void) -> usize , destructor : unsafe extern "C" fn (usize) } impl Fn_ARGS_std_os_raw_c_void_RTRN_usize { pub unsafe fn call (& self , o_0 : * const std :: os :: raw :: c_void) -> usize { let ffi_result = (self . caller) (o_0) ; ffi_result } } unsafe impl Send for Fn_ARGS_std_os_raw_c_void_RTRN_usize { } unsafe impl Sync for Fn_ARGS_std_os_raw_c_void_RTRN_usize { } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_RTRN_usize_ctor (caller : unsafe extern "C" fn (* const std :: os :: raw :: c_void) -> usize , destructor : unsafe extern "C" fn (usize)) -> * mut Fn_ARGS_std_os_raw_c_void_RTRN_usize { ferment :: boxed (Fn_ARGS_std_os_raw_c_void_RTRN_usize { caller , destructor }) } # [no_mangle] pub unsafe extern "C" fn Fn_ARGS_std_os_raw_c_void_RTRN_usize_destroy (ffi : * mut Fn_ARGS_std_os_raw_c_void_RTRN_usize) { ferment :: unbox_any (ffi) ; } } \ No newline at end of file diff --git a/dash-spv-apple-bindings/src/fermented_extended.rs b/dash-spv-apple-bindings/src/fermented_extended.rs new file mode 100644 index 00000000..81ae1ddc --- /dev/null +++ b/dash-spv-apple-bindings/src/fermented_extended.rs @@ -0,0 +1,211 @@ +use std::sync::Arc; +use ferment::{boxed, unbox_any}; +use tokio::runtime::Runtime; +use dash_spv_coinjoin::coinjoin_client_manager::CoinJoinClientManager; +use crate::custom::dashcore::{dashcore_hash_types_BlockHash, dashcore_hash_types_ConfirmedHash, dashcore_hash_types_ConfirmedHashHashedWithProRegTx, dashcore_hash_types_CycleHash, dashcore_hash_types_InputsHash, dashcore_hash_types_MerkleRootMasternodeList, dashcore_hash_types_MerkleRootQuorums, dashcore_hash_types_ProTxHash, dashcore_hash_types_PubkeyHash, dashcore_hash_types_QuorumCommitmentHash, dashcore_hash_types_QuorumEntryHash, dashcore_hash_types_QuorumHash, dashcore_hash_types_QuorumSigningRequestId, dashcore_hash_types_QuorumVVecHash, dashcore_hash_types_ScriptHash, dashcore_hash_types_Sha256dHash, dashcore_hash_types_SpecialTransactionPayloadHash, dashcore_hash_types_TxMerkleNode, dashcore_hash_types_Txid}; +use crate::custom::{to_ffi_bytes, to_ffi_hash}; +use crate::custom::std::SocketAddr; +use crate::DashSPVCore; +use crate::fermented::generics::{Arr_u8_20, Arr_u8_32}; + + +// //TODO: this is a tmp additional setup +// +#[repr(C)] +pub struct TokioRuntime(*const Runtime); +# [no_mangle] +pub unsafe extern "C" fn dash_spv_apple_bindings_DashSPVCore_tokio_runtime(self_: *mut DashSPVCore) -> *mut TokioRuntime { + boxed(TokioRuntime(Arc::as_ptr(&(&*self_).platform.runtime))) +} +# [no_mangle] +pub unsafe extern "C" fn dash_spv_apple_bindings_DashSPVCore_runtime(self_: *mut DashSPVCore) -> *mut Runtime { + Arc::as_ptr(&(&*self_).platform.runtime) as *mut _ +} +# [no_mangle] +pub unsafe extern "C" fn SocketAddr_destroy(self_: *mut SocketAddr) { + unbox_any(self_); +} +# [no_mangle] +pub unsafe extern "C" fn dash_spv_apple_bindings_DashSPVCore_destroy(self_: *mut DashSPVCore) { + unbox_any(self_); +} + +# [no_mangle] +pub unsafe extern "C" fn dash_spv_coinjoin_coinjoin_client_manager_CoinJoinClientManager_destroy(self_: *mut CoinJoinClientManager) { + unbox_any(self_); +} + +/// [u8; 32] +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_BlockHash_ctor(hash: *mut Arr_u8_32) -> *mut dashcore_hash_types_BlockHash { + to_ffi_hash::(hash) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_BlockHash_destroy(ptr: *mut dashcore_hash_types_BlockHash) { + unbox_any(ptr); +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_BlockHash_inner(ptr: *mut dashcore_hash_types_BlockHash) -> *mut Arr_u8_32 { + to_ffi_bytes::(ptr) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_CycleHash_ctor(hash: *mut Arr_u8_32) -> *mut dashcore_hash_types_CycleHash { + to_ffi_hash::(hash) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_CycleHash_destroy(ptr: *mut dashcore_hash_types_CycleHash) { + unbox_any(ptr); +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_CycleHash_inner(ptr: *mut dashcore_hash_types_CycleHash) -> *mut Arr_u8_32 { + to_ffi_bytes::(ptr) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_Txid_ctor(hash: *mut Arr_u8_32) -> *mut dashcore_hash_types_Txid { + to_ffi_hash::(hash) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_Txid_destroy(ptr: *mut dashcore_hash_types_Txid) { + unbox_any(ptr); +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_Txid_inner(ptr: *mut dashcore_hash_types_Txid) -> *mut Arr_u8_32 { + to_ffi_bytes::(ptr) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_TxMerkleNode_ctor(hash: *mut Arr_u8_32) -> *mut dashcore_hash_types_TxMerkleNode { + to_ffi_hash::(hash) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_TxMerkleNode_destroy(ptr: *mut dashcore_hash_types_TxMerkleNode) { + unbox_any(ptr); +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_TxMerkleNode_inner(ptr: *mut dashcore_hash_types_TxMerkleNode) -> *mut Arr_u8_32 { + to_ffi_bytes::(ptr) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_SpecialTransactionPayloadHash_ctor(hash: *mut Arr_u8_32) -> *mut dashcore_hash_types_SpecialTransactionPayloadHash { + to_ffi_hash::(hash) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_SpecialTransactionPayloadHash_destroy(ptr: *mut dashcore_hash_types_SpecialTransactionPayloadHash) { + unbox_any(ptr); +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_SpecialTransactionPayloadHash_inner(ptr: *mut dashcore_hash_types_SpecialTransactionPayloadHash) -> *mut Arr_u8_32 { + to_ffi_bytes::(ptr) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_InputsHash_ctor(hash: *mut Arr_u8_32) -> *mut dashcore_hash_types_InputsHash { + to_ffi_hash::(hash) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_InputsHash_destroy(ptr: *mut dashcore_hash_types_InputsHash) { + unbox_any(ptr); +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_InputsHash_inner(ptr: *mut dashcore_hash_types_InputsHash) -> *mut Arr_u8_32 { + to_ffi_bytes::(ptr) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_QuorumHash_ctor(hash: *mut Arr_u8_32) -> *mut dashcore_hash_types_QuorumHash { + to_ffi_hash::(hash) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_QuorumHash_destroy(ptr: *mut dashcore_hash_types_QuorumHash) { + unbox_any(ptr); +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_QuorumHash_inner(ptr: *mut dashcore_hash_types_QuorumHash) -> *mut Arr_u8_32 { + to_ffi_bytes::(ptr) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_QuorumVVecHash_ctor(hash: *mut Arr_u8_32) -> *mut dashcore_hash_types_QuorumVVecHash { + to_ffi_hash::(hash) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_QuorumVVecHash_destroy(ptr: *mut dashcore_hash_types_QuorumVVecHash) { + unbox_any(ptr); +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_QuorumVVecHash_inner(ptr: *mut dashcore_hash_types_QuorumVVecHash) -> *mut Arr_u8_32 { + to_ffi_bytes::(ptr) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_QuorumSigningRequestId_ctor(hash: *mut Arr_u8_32) -> *mut dashcore_hash_types_QuorumSigningRequestId { + to_ffi_hash::(hash) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_QuorumSigningRequestId_destroy(ptr: *mut dashcore_hash_types_QuorumSigningRequestId) { + unbox_any(ptr); +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_QuorumSigningRequestId_inner(ptr: *mut dashcore_hash_types_QuorumSigningRequestId) -> *mut Arr_u8_32 { + to_ffi_bytes::(ptr) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_ProTxHash_ctor(hash: *mut Arr_u8_32) -> *mut dashcore_hash_types_ProTxHash { + to_ffi_hash::(hash) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_ProTxHash_destroy(ptr: *mut dashcore_hash_types_ProTxHash) { + unbox_any(ptr); +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_ProTxHash_inner(ptr: *mut dashcore_hash_types_ProTxHash) -> *mut Arr_u8_32 { + to_ffi_bytes::(ptr) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_MerkleRootMasternodeList_ctor(hash: *mut Arr_u8_32) -> *mut dashcore_hash_types_MerkleRootMasternodeList { + to_ffi_hash::(hash) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_MerkleRootMasternodeList_destroy(ptr: *mut dashcore_hash_types_MerkleRootMasternodeList) { + unbox_any(ptr); +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_MerkleRootMasternodeList_inner(ptr: *mut dashcore_hash_types_MerkleRootMasternodeList) -> *mut Arr_u8_32 { + to_ffi_bytes::(ptr) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_MerkleRootQuorums_ctor(hash: *mut Arr_u8_32) -> *mut dashcore_hash_types_MerkleRootQuorums { + to_ffi_hash::(hash) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_MerkleRootQuorums_destroy(ptr: *mut dashcore_hash_types_MerkleRootQuorums) { + unbox_any(ptr); +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_MerkleRootQuorums_inner(ptr: *mut dashcore_hash_types_MerkleRootQuorums) -> *mut Arr_u8_32 { + to_ffi_bytes::(ptr) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_QuorumEntryHash_ctor(hash: *mut Arr_u8_32) -> *mut dashcore_hash_types_QuorumEntryHash { + to_ffi_hash::(hash) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_QuorumEntryHash_destroy(ptr: *mut dashcore_hash_types_QuorumEntryHash) { + unbox_any(ptr); +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_QuorumEntryHash_inner(ptr: *mut dashcore_hash_types_QuorumEntryHash) -> *mut Arr_u8_32 { + to_ffi_bytes::(ptr) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_ConfirmedHashHashedWithProRegTx_ctor(hash: *mut Arr_u8_32) -> *mut dashcore_hash_types_ConfirmedHashHashedWithProRegTx { + to_ffi_hash::(hash) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_ConfirmedHashHashedWithProRegTx_destroy(ptr: *mut dashcore_hash_types_ConfirmedHashHashedWithProRegTx) { + unbox_any(ptr); +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_ConfirmedHashHashedWithProRegTx_inner(ptr: *mut dashcore_hash_types_ConfirmedHashHashedWithProRegTx) -> *mut Arr_u8_32 { + to_ffi_bytes::(ptr) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_ConfirmedHash_ctor(hash: *mut Arr_u8_32) -> *mut dashcore_hash_types_ConfirmedHash { + to_ffi_hash::(hash) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_ConfirmedHash_destroy(ptr: *mut dashcore_hash_types_ConfirmedHash) { + unbox_any(ptr); +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_ConfirmedHash_inner(ptr: *mut dashcore_hash_types_ConfirmedHash) -> *mut Arr_u8_32 { + to_ffi_bytes::(ptr) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_QuorumCommitmentHash_ctor(hash: *mut Arr_u8_32) -> *mut dashcore_hash_types_QuorumCommitmentHash { + to_ffi_hash::(hash) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_QuorumCommitmentHash_destroy(ptr: *mut dashcore_hash_types_QuorumCommitmentHash) { + unbox_any(ptr); +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_QuorumCommitmentHash_inner(ptr: *mut dashcore_hash_types_QuorumCommitmentHash) -> *mut Arr_u8_32 { + to_ffi_bytes::(ptr) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_Sha256dHash_ctor(hash: *mut Arr_u8_32) -> *mut dashcore_hash_types_Sha256dHash { + to_ffi_hash::(hash) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_Sha256dHash_destroy(ptr: *mut dashcore_hash_types_Sha256dHash) { + unbox_any(ptr); +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_Sha256dHash_inner(ptr: *mut dashcore_hash_types_Sha256dHash) -> *mut Arr_u8_32 { + to_ffi_bytes::(ptr) +} +/// [u8; 20] +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_PubkeyHash_ctor(hash: *mut Arr_u8_20) -> *mut dashcore_hash_types_PubkeyHash { + to_ffi_hash::(hash) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_PubkeyHash_destroy(ptr: *mut dashcore_hash_types_PubkeyHash) { + unbox_any(ptr); +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_PubkeyHash_inner(ptr: *mut dashcore_hash_types_PubkeyHash) -> *mut Arr_u8_20 { + to_ffi_bytes::(ptr) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_ScriptHash_ctor(hash: *mut Arr_u8_20) -> *mut dashcore_hash_types_ScriptHash { + to_ffi_hash::(hash) +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_ScriptHash_destroy(ptr: *mut dashcore_hash_types_ScriptHash) { + unbox_any(ptr); +} +#[no_mangle] pub unsafe extern "C" fn dashcore_hash_types_ScriptHash_inner(ptr: *mut dashcore_hash_types_ScriptHash) -> *mut Arr_u8_20 { + to_ffi_bytes::(ptr) +} + diff --git a/dash-spv-apple-bindings/src/ffi_core_provider.rs b/dash-spv-apple-bindings/src/ffi_core_provider.rs new file mode 100644 index 00000000..3daf6d85 --- /dev/null +++ b/dash-spv-apple-bindings/src/ffi_core_provider.rs @@ -0,0 +1,162 @@ +use std::sync::Arc; +use dashcore::bls_sig_utils::BLSSignature; +#[cfg(test)] +use dashcore::secp256k1::hashes::hex::DisplayHex; +use dashcore::sml::masternode_list_entry::qualified_masternode_list_entry::QualifiedMasternodeListEntry; +use dash_spv_crypto::network::ChainType; +#[cfg(test)] +use dash_spv_masternode_processor::common::block::MBlock; +use dash_spv_masternode_processor::processing::core_provider::{CoreProvider, CoreProviderError}; +#[cfg(test)] +use dash_spv_masternode_processor::{processing::MasternodeProcessor, tests::FFIContext}; +use dash_spv_masternode_processor::models::sync_state::CacheState; + +#[ferment_macro::opaque] +pub struct FFICoreProvider { + pub context: *const std::ffi::c_void, + // pub context: Arc, + pub chain_type: ChainType, + + pub get_block_height_by_hash: Arc u32>, + pub get_block_hash_by_height: Arc Option<[u8; 32]>>, + pub get_cl_signature_by_block_hash: Arc Result>, + pub update_address_usage_of_masternodes: Arc)>, + pub issue_with_masternode_list_from_peer: Arc, + pub notify_sync_state: Arc, +} + +unsafe impl Send for FFICoreProvider {} +unsafe impl Sync for FFICoreProvider {} + +impl std::fmt::Debug for FFICoreProvider { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("FFICoreProvider") + .field("chain", &self.chain_type) + .field("context", &self.context) + .finish() + } +} + +impl CoreProvider for FFICoreProvider { + fn chain_type(&self) -> ChainType { + self.chain_type.clone() + } + fn lookup_cl_signature_by_block_hash(&self, block_hash: [u8; 32]) -> Result { + (self.get_cl_signature_by_block_hash)(self.context, block_hash) + } + + fn lookup_block_hash_by_height(&self, block_height: u32) -> Option<[u8; 32]> { + (self.get_block_hash_by_height)(self.context, block_height) + } + + fn lookup_block_height_by_hash(&self, block_hash: [u8; 32]) -> u32 { + (self.get_block_height_by_hash)(self.context, block_hash) + } + + fn update_address_usage_of_masternodes(&self, masternodes: Vec) { + (self.update_address_usage_of_masternodes)(self.context, masternodes) + } + + fn issue_with_masternode_list_from_peer(&self, is_dip24: bool, peer: *const std::os::raw::c_void) { + (self.issue_with_masternode_list_from_peer)(self.context, is_dip24, peer) + } + fn notify_sync_state(&self, state: CacheState) { + (self.notify_sync_state)(self.context, state) + } +} + +#[ferment_macro::export] +impl FFICoreProvider { + pub fn new< + BHT: Fn(*const std::os::raw::c_void, [u8; 32]) -> u32 + Send + Sync + 'static, + BHH: Fn(*const std::os::raw::c_void, u32) -> Option<[u8; 32]> + Send + Sync + 'static, + CLSBH: Fn(*const std::os::raw::c_void, [u8; 32]) -> Result + Send + Sync + 'static, + UMU: Fn(*const std::os::raw::c_void, Vec) + Send + Sync + 'static, + IWMLFP: Fn(*const std::os::raw::c_void, bool, *const std::os::raw::c_void) + Send + Sync + 'static, + NSS: Fn(*const std::os::raw::c_void, CacheState) + Send + Sync + 'static, + >( + chain_type: ChainType, + get_block_height_by_hash: BHT, + get_block_hash_by_height: BHH, + get_cl_signature_by_block_hash: CLSBH, + update_address_usage_of_masternodes: UMU, + issue_with_masternode_list_from_peer: IWMLFP, + notify_sync_state: NSS, + context: *const std::os::raw::c_void, + ) -> Self { + Self { + chain_type, + context, + get_block_height_by_hash: Arc::new(get_block_height_by_hash), + get_block_hash_by_height: Arc::new(get_block_hash_by_height), + get_cl_signature_by_block_hash: Arc::new(get_cl_signature_by_block_hash), + update_address_usage_of_masternodes: Arc::new(update_address_usage_of_masternodes), + issue_with_masternode_list_from_peer: Arc::new(issue_with_masternode_list_from_peer), + notify_sync_state: Arc::new(notify_sync_state), + } + } +} + +#[cfg(test)] +impl FFICoreProvider { + pub fn register_default(context: Arc, chain_type: ChainType) -> Self { + use dash_spv_crypto::crypto::byte_util::Reversed; + let context_raw = Arc::into_raw(context.clone()) as *const std::ffi::c_void; + Self { + context: context_raw, + chain_type: chain_type.clone(), + get_block_height_by_hash: { + let clone_chain = chain_type.clone(); + Arc::new(move |context, block_hash| unsafe { + let context = Arc::from_raw(context as *const FFIContext); + let result = context.block_height_for_hash(block_hash); + std::mem::forget(context); + #[cfg(feature = "use_serde")] + if result == u32::MAX { + return clone_chain.insight_url() + .and_then(|url| dash_spv_masternode_processor::util::insight::insight_block_by_block_hash(url, &block_hash.reversed()) + .ok() + .map(|b| MBlock::from(b).height)) + .unwrap_or(u32::MAX); + } + result + }) + }, + get_block_hash_by_height: { + let clone_chain = chain_type.clone(); + Arc::new(move |context, block_height| unsafe { + let context = Arc::from_raw(context as *const FFIContext); + let result = context.block_hash_for_height(block_height); + std::mem::forget(context); + #[cfg(feature = "use_serde")] + if result.is_err() { + return clone_chain.insight_url() + .ok_or(CoreProviderError::NullResult(format!("No insight for chain {:?}", clone_chain))) + .and_then(|url| dash_spv_masternode_processor::util::insight::insight_block_by_block_height(url, block_height) + .map(|b| MBlock::from(b).hash) + .map_err(|e| CoreProviderError::NullResult(e.to_string()))) + .ok() + } + + result.ok() + }) + }, + get_cl_signature_by_block_hash: Arc::new(move |context, block_hash| unsafe { + let context = Arc::from_raw(context as *const FFIContext); + let result = context.cl_signature_by_block_hash(&block_hash) + .map(|sig| BLSSignature::from(sig)) + .ok_or(CoreProviderError::NullResult(format!("No cl signature by block_hash {} ({})", block_hash.to_lower_hex_string(), block_hash.reversed().to_lower_hex_string()))); + std::mem::forget(context); + result + }), + update_address_usage_of_masternodes: Arc::new(|context, modified_masternodes| {}), + issue_with_masternode_list_from_peer: Arc::new(|context, is_dip24, peer| {}), + notify_sync_state: Arc::new(|context, state| {}), + } + } + pub fn default_processor(context: Arc, chain_type: ChainType) -> MasternodeProcessor { + let network = dashcore::Network::from(chain_type.clone()); + let provider = Arc::new(Self::register_default(context, chain_type)); + MasternodeProcessor::new(provider.clone(), network) + } +} diff --git a/dash-spv-apple-bindings/src/lib.rs b/dash-spv-apple-bindings/src/lib.rs index 1025a28a..9c644ba8 100644 --- a/dash-spv-apple-bindings/src/lib.rs +++ b/dash-spv-apple-bindings/src/lib.rs @@ -1,7 +1,139 @@ #![allow(dead_code)] #![allow(unused_variables)] + +mod address; +#[cfg(not(test))] +mod fermented; +#[cfg(not(test))] +mod fermented_extended; + +#[cfg(test)] +mod tests; +mod ffi_core_provider; +pub mod coinjoin; +pub mod custom; + pub extern crate dash_spv_masternode_processor; pub extern crate dash_spv_coinjoin; -pub extern crate merk; -pub mod coinjoin; \ No newline at end of file +use std::fmt::{Debug, Formatter}; +use std::sync::Arc; +use dashcore::{Network, QuorumHash}; +use dashcore::bls_sig_utils::BLSSignature; +use dashcore::hashes::Hash; +use dashcore::sml::llmq_type::LLMQType; +use dashcore::sml::masternode_list_entry::qualified_masternode_list_entry::QualifiedMasternodeListEntry; +use dpp::data_contract::DataContract; +use dpp::identity::identity_public_key::IdentityPublicKey; + +use dpp::prelude::CoreBlockHeight; +use dpp::errors::ProtocolError; +use drive_proof_verifier::error::ContextProviderError; +use dash_spv_crypto::network::{ChainType, IHaveChainSettings}; +use dash_spv_masternode_processor::processing::core_provider::CoreProviderError; +use dash_spv_masternode_processor::processing::MasternodeProcessor; +use dash_spv_platform::PlatformSDK; +use platform_value::{BinaryData, Identifier}; +use dash_spv_masternode_processor::models::sync_state::CacheState; +use dash_spv_platform::cache::PlatformCache; +use crate::ffi_core_provider::FFICoreProvider; + +#[ferment_macro::opaque] +pub struct DashSPVCore { + pub processor: Arc, + pub platform: Arc, + context: *const std::os::raw::c_void, +} + +impl Debug for DashSPVCore { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.write_str(format!("[{}] [SPVCore]", self.processor.provider.chain_type().name()).as_str()) + } +} +// AnyOther by_value: Type(Dictionary(NonPrimitiveFermentable(SmartPointer(Arc($Ty(std :: sync :: Arc < dyn Fn (* const std :: os :: raw :: c_void , u32) -> Option < [u8 ; 32] > >, [Object(Type(Dictionary(LambdaFn($Ty(dyn Fn (* const std :: os :: raw :: c_void , u32) -> Option < [u8 ; 32] >, [])))))])))))) + +#[ferment_macro::export] +impl DashSPVCore { + + pub fn with_callbacks< + // platform + DC: Fn(*const std::os::raw::c_void, Identifier) -> Result>, ContextProviderError> + Send + Sync + 'static, + AH: Fn(*const std::os::raw::c_void) -> Result + Send + Sync + 'static, + CS: Fn(*const std::os::raw::c_void, &IdentityPublicKey, Vec) -> Result + Send + Sync + 'static, + CCS: Fn(*const std::os::raw::c_void, &IdentityPublicKey) -> bool + Send + Sync + 'static, + // masternode + BHT: Fn(*const std::os::raw::c_void, [u8; 32]) -> u32 + Send + Sync + 'static, + BHH: Fn(*const std::os::raw::c_void, u32) -> Option<[u8; 32]> + Send + Sync + 'static, + CLSBH: Fn(*const std::os::raw::c_void, [u8; 32]) -> Result + Send + Sync + 'static, + UMU: Fn(*const std::os::raw::c_void, Vec) + Send + Sync + 'static, + IWMLFP: Fn(*const std::os::raw::c_void, bool, *const std::os::raw::c_void) + Send + Sync + 'static, + NSS: Fn(*const std::os::raw::c_void, CacheState) + Send + Sync + 'static, + >( + chain_type: ChainType, + address_list: Option>, + + get_data_contract: DC, + get_platform_activation_height: AH, + callback_signer: CS, + callback_can_sign: CCS, + + get_block_height_by_hash: BHT, + get_block_hash_by_height: BHH, + get_cl_signature_by_block_hash: CLSBH, + update_address_usage_of_masternodes: UMU, + issue_with_masternode_list_from_peer: IWMLFP, + notify_sync_state: NSS, + + context: *const std::os::raw::c_void) -> Self { + let provider = Arc::new(FFICoreProvider::new( + chain_type.clone(), + get_block_height_by_hash, + get_block_hash_by_height, + get_cl_signature_by_block_hash, + update_address_usage_of_masternodes, + issue_with_masternode_list_from_peer, + notify_sync_state, + context)); + let network = Network::from(chain_type.clone()); + let processor = MasternodeProcessor::new(provider.clone(), network); + let processor_arc = Arc::new(processor); + let processor_arc_clone = Arc::clone(&processor_arc); + let get_quorum_public_key = Arc::new(move |llmq_type: u32, llmq_hash: [u8; 32], core_chain_locked_height: u32| { + let llmq_type = LLMQType::from_u16(llmq_type as u16); + let llmq_hash = QuorumHash::from_byte_array(llmq_hash); + processor_arc_clone.engine.find_quorum_public_key(&llmq_type, &llmq_hash) + .map(|key| key.0) + .ok_or(ContextProviderError::InvalidQuorum(format!("Quorum not found: {}: {}", llmq_type, llmq_hash.to_string()))) + }); + let platform = Arc::new(PlatformSDK::new( + Arc::new(PlatformCache::default()), + get_quorum_public_key, + get_data_contract, + get_platform_activation_height, + callback_signer, + callback_can_sign, + address_list, + chain_type, + context + )); + // let dapi_address_handler = Arc::clone(&platform); + // processor.dapi_address_handler = Some(dapi_address_handler); + // let processor_arc = Arc::new(processor); + Self { + processor: processor_arc, + platform, + context, + } + } + + pub fn platform_cache(&self) -> Arc { + Arc::clone(&self.platform.cache) + } + pub fn processor(&self) -> Arc { + Arc::clone(&self.processor) + } + pub fn platform(&self) -> Arc { + Arc::clone(&self.platform) + } +} + diff --git a/dash-spv-apple-bindings/src/tests/common.rs b/dash-spv-apple-bindings/src/tests/common.rs new file mode 100644 index 00000000..8538e624 --- /dev/null +++ b/dash-spv-apple-bindings/src/tests/common.rs @@ -0,0 +1,201 @@ +use std::{fs, io::Read}; +use std::sync::Arc; +use dashcore::hashes::Hash; +use dashcore::hashes::hex::FromHex; +use dashcore::secp256k1::hashes::hex::DisplayHex; +use dash_spv_crypto::network::ChainType; +use dash_spv_crypto::crypto::byte_util::Reversed; +use dash_spv_masternode_processor::logger::register_rust_logger; +use dash_spv_masternode_processor::block_store::MerkleBlock; +use dash_spv_masternode_processor::processing::processor::processing_error::ProcessingError; +use dash_spv_masternode_processor::test_helpers::load_message; +pub use dash_spv_masternode_processor::tests::FFIContext; +use crate::ffi_core_provider::FFICoreProvider; + +extern crate libc; +extern crate reqwest; + +#[cfg(all(feature = "test-helpers", feature = "use_serde"))] +pub fn get_block_from_insight_by_hash(hash: [u8; 32]) -> Option { + let path = format!("https://testnet-insight.dashevo.org/insight-api/block/{}", hash.reversed().to_lower_hex_string().as_str()); + request_block(path) +} +#[cfg(all(feature = "test-helpers", feature = "use_serde"))] +pub fn get_block_from_insight_by_height(height: u32) -> Option { + let path = format!("https://testnet-insight.dashevo.org/insight-api/block/{}", height); + request_block(path) +} + +#[cfg(all(feature = "test-helpers", feature = "use_serde"))] +pub fn request_block(path: String) -> Option { + println!("request_block: {}", path.as_str()); + match reqwest::blocking::get(path.as_str()) { + Ok(response) => match response.json::() { + Ok(json) => { + let block: dash_spv_masternode_processor::tests::serde_helper::Block = serde_json::from_value(json).unwrap(); + let merkle_block = MerkleBlock::from(block); + println!("request_block: {}", path.as_str()); + Some(merkle_block) + }, + Err(err) => { + println!("{}", err); + None + }, + }, + Err(err) => { + println!("{}", err); + None + }, + } +} + +pub fn register_logger() { + unsafe { register_rust_logger(); } +} + +pub fn get_file_as_byte_vec(filename: &str) -> Vec { + //println!("get_file_as_byte_vec: {}", filename); + if let (Ok(mut f), Ok(metadata)) = (fs::File::open(&filename), fs::metadata(&filename)) { + let mut buffer = vec![0; metadata.len() as usize]; + if let Ok(()) = f.read_exact(&mut buffer) { + return buffer; + } + } + panic!("get_file_as_byte_vec: error for: {}", filename) +} + +pub fn perform_mnlist_diff_test_for_message( + hex_string: &str, + should_be_total_transactions: u32, + verify_string_hashes: Vec<&str>, + verify_string_smle_hashes: Vec<&str>, + allow_invalid_merkle_roots: bool +) { + let bytes = Vec::from_hex(hex_string).unwrap(); + let length = bytes.len(); + let c_array = bytes.as_ptr(); + let message: &[u8] = unsafe { std::slice::from_raw_parts(c_array, length) }; + let chain = ChainType::TestNet; + let offset = &mut 0; + assert!(length - *offset >= 32); + let base_block_hash = TryInto::<[u8; 32]>::try_into(&message[..32]).expect("Error converting message"); + assert!(length - *offset >= 32); + let _block_hash = TryInto::<[u8; 32]>::try_into(&message[32..64]).expect("Error converting message"); + assert!(length - *offset >= 4); + let total_transactions = TryInto::::try_into(&message[64..68]).expect("Error converting message"); + assert_eq!(total_transactions, should_be_total_transactions, "Invalid transaction count"); + + let use_insight_as_backup = false; + let context = Arc::new(FFIContext::create_default_context_and_cache(chain.clone(), false)); + let mut processor = FFICoreProvider::default_processor(context, chain); + let (base_block_hash, block_hash) = processor.process_mn_list_diff_result_from_message(&bytes, None, true) + .expect("Failed to process mnlistdiff"); + let masternode_list = processor.masternode_list_for_block_hash(block_hash.to_byte_array()) + .expect(format!("Masternode List at {}", block_hash.to_string()).as_str()); + + let masternodes = &masternode_list.masternodes; + let mut pro_tx_hashes: Vec<[u8; 32]> = masternodes.keys().map(Hash::to_byte_array).collect(); + pro_tx_hashes.sort(); + let mut verify_hashes: Vec<[u8; 32]> = verify_string_hashes + .into_iter() + .map(|h| <[u8; 32]>::from_hex(h).unwrap().reversed()) + .collect(); + verify_hashes.sort(); + + pro_tx_hashes.iter().zip(verify_hashes.iter()).for_each(|(h1, h2)| { + println!("{} == {}", h1.to_lower_hex_string(), h2.to_lower_hex_string()); + }); + + assert_eq!(verify_hashes, pro_tx_hashes, "Provider transaction hashes"); + let mut masternode_list_hashes: Vec<[u8; 32]> = pro_tx_hashes + .clone() + .iter() + .map(|hash| masternodes[hash].entry_hash.to_byte_array()) + .collect(); + masternode_list_hashes.sort(); + let mut verify_smle_hashes: Vec<[u8; 32]> = verify_string_smle_hashes + .into_iter() + // TODO: figure out why it now works without reversing + .map(|h| <[u8; 32]>::from_hex(h).unwrap()) + .collect(); + verify_smle_hashes.sort(); + assert_eq!(masternode_list_hashes, verify_smle_hashes, "SMLE transaction hashes"); + // assert!(result.has_found_coinbase, "The coinbase was not part of provided hashes"); +} + +pub fn load_masternode_lists_for_files( + files: Vec, + assert_validity: bool, + context: Arc, + allow_invalid_merkle_roots: bool, + chain_type: ChainType +) -> bool { + let mut processor = FFICoreProvider::default_processor(Arc::clone(&context), chain_type.clone()); + for file in files { + let bytes = load_message(chain_type.identifier(), file.as_str()); + match processor.process_mn_list_diff_result_from_message(&bytes, None, true) { + Ok((base_block_hash, block_hash)) => { + println!("List {}..{} successfully processed", base_block_hash.to_string(), block_hash.to_string()) + } + Err(err) => { + panic!("Should be valid result: {}", err); + } + } + } + true +} +pub fn extract_protocol_version_from_filename(filename: &str) -> Option { + filename.split("__") + .nth(1) + .and_then(|s| s.split('.').next()) + .and_then(|s| s.parse::().ok()) +} + +pub fn assert_diff_chain(chain: ChainType, diff_files: &[&'static str], qrinfo_files: &[&'static str], block_store: Option>, allow_invalid_merkle_roots: bool) { + register_logger(); + let context = Arc::new(FFIContext::chain_default(chain.clone(), false, block_store.unwrap_or_default())); + let mut processor = FFICoreProvider::default_processor(Arc::clone(&context), chain.clone()); + diff_files.iter().for_each(|filename| { + let protocol_version = extract_protocol_version_from_filename(filename).unwrap_or(70219); + let message = load_message(chain.identifier(), filename); + // let result = processor.mn_list_diff_result_from_message(&message, true, protocol_version, allow_invalid_merkle_roots, null()) + // .expect("Failed to process mnlistdiff"); + let maybe_result = processor.process_mn_list_diff_result_from_message(&message, None, true); + match maybe_result { + Ok(_) | + Err(ProcessingError::MissingLists(..)) => {}, + Err(err) => panic!("Failed to process mnlistdiff: {err}") + } + // println!("Diff is ok at {}", result.block_hash); + // assert_diff_result(&ctx, &result); + // let mut cache = ctx.cache.write().unwrap(); + // cache.mn_lists.insert(result.block_hash, result.masternode_list); + }); + // ctx.is_dip_0024 = true; + qrinfo_files.iter().for_each(|filename| { + let protocol_version = extract_protocol_version_from_filename(filename).unwrap_or(70219); + let message = load_message(chain.identifier(), filename); + let maybe_result = processor.process_qr_info_result_from_message(&message, true); + match maybe_result { + Ok(_) | + Err(ProcessingError::MissingLists(..)) => {}, + Err(err) => panic!("Failed to process qrinfo: {err}") + } + // assert_qrinfo_result(&ctx, &result); + // let mut cache = ctx.cache.write().unwrap(); + // if !result.result_at_h_4c.is_some() { + // let result = result.result_at_h_4c.unwrap(); + // cache.mn_lists.insert(result.block_hash, result.masternode_list); + // } + // let result_at_h_3c = result.result_at_h_3c; + // cache.mn_lists.insert(result_at_h_3c.block_hash, result_at_h_3c.masternode_list); + // let result_at_h_2c = result.result_at_h_2c; + // cache.mn_lists.insert(result_at_h_2c.block_hash, result_at_h_2c.masternode_list); + // let result_at_h_c = result.result_at_h_c; + // cache.mn_lists.insert(result_at_h_c.block_hash, result_at_h_c.masternode_list); + // let result_at_h = result.result_at_h; + // cache.mn_lists.insert(result_at_h.block_hash, result_at_h.masternode_list); + // let result_at_tip = result.result_at_tip; + // cache.mn_lists.insert(result_at_tip.block_hash, result_at_tip.masternode_list); + }); +} \ No newline at end of file diff --git a/dash-spv-apple-bindings/src/tests/listdiff/core20_testnet.rs b/dash-spv-apple-bindings/src/tests/listdiff/core20_testnet.rs new file mode 100644 index 00000000..66e8f334 --- /dev/null +++ b/dash-spv-apple-bindings/src/tests/listdiff/core20_testnet.rs @@ -0,0 +1,237 @@ +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; +use dash_spv_crypto::network::ChainType; +use dash_spv_masternode_processor::block_store::init_testnet_store; +#[cfg(feature = "serde")] +use dash_spv_masternode_processor::test_helpers::load_message; +#[cfg(all(feature = "use_serde", feature = "serde"))] +use dash_spv_masternode_processor::tests::serde_helper::Snapshot; +use crate::tests::common::assert_diff_chain; + +#[test] +pub fn test_core20_rc1_testnet() { + assert_diff_chain( + ChainType::TestNet, + &["MNL_0_530000__70228.dat", "MNL_530000_904382__70230.dat"], + &["QRINFO_x3_y3__70230.dat"], + Some(init_testnet_store()), + false); +} + +#[test] +pub fn test_core20_activated_testnet() { + assert_diff_chain( + ChainType::TestNet, + &["MNL_0_530000__70228.dat", "MNL_530000_905465__70230.dat"], + &["QRINFO_LAST__70230.dat"], + Some(init_testnet_store()), + false); +} + +#[cfg(feature = "serde")] +#[cfg_attr(docsrs, doc(cfg(feature = "serde")))] +#[derive(Serialize, Deserialize)] +struct LLMQ { + pub version: i64, + #[serde(rename = "llmqType")] + pub llmq_type: i64, + #[serde(rename = "quorumHash")] + pub quorum_hash: String, + #[serde(rename = "quorumIndex")] + pub quorum_index: i64, + #[serde(rename = "signersCount")] + pub signers_count: i64, + pub signers: String, + #[serde(rename = "validMembersCount")] + pub valid_members_count: i64, + #[serde(rename = "validMembers")] + pub valid_members: String, + #[serde(rename = "quorumPublicKey")] + pub quorum_public_key: String, + #[serde(rename = "quorumVvecHash")] + pub quorum_vvec_hash: String, + #[serde(rename = "quorumSig")] + pub quorum_sig: String, + #[serde(rename = "membersSig")] + pub members_sig: String, +} + +#[cfg(feature = "serde")] +#[cfg_attr(docsrs, doc(cfg(feature = "serde")))] +#[derive(Serialize, Deserialize)] +struct Masternode { + #[serde(rename = "nVersion")] + pub n_version: i64, + #[serde(rename = "nType")] + pub n_type: i64, + #[serde(rename = "proRegTxHash")] + pub pro_reg_tx_hash: String, + #[serde(rename = "confirmedHash")] + pub confirmed_hash: String, + pub service: String, + #[serde(rename = "pubKeyOperator")] + pub pub_key_operator: String, + #[serde(rename = "votingAddress")] + pub voting_address: String, + #[serde(rename = "isValid")] + pub is_valid: bool, +} + +#[cfg(feature = "serde")] +#[cfg_attr(docsrs, doc(cfg(feature = "serde")))] +#[derive(Serialize, Deserialize)] +struct QRInfoV20 { + #[serde(rename = "extraShare")] + pub extra_share: bool, + #[serde(rename = "quorumSnapshotAtHMinusC")] + pub quorum_snapshot_at_hminus_c: Snapshot, + #[serde(rename = "quorumSnapshotAtHMinus2C")] + pub quorum_snapshot_at_hminus2c: Snapshot, + #[serde(rename = "quorumSnapshotAtHMinus3C")] + pub quorum_snapshot_at_hminus3c: Snapshot, + #[serde(rename = "mnListDiffTip")] + pub mn_list_diff_tip: ListDiff_70230, + #[serde(rename = "mnListDiffH")] + pub mn_list_diff_h: ListDiff_70230, + #[serde(rename = "mnListDiffAtHMinusC")] + pub mn_list_diff_at_hminus_c: ListDiff_70230, + #[serde(rename = "mnListDiffAtHMinus2C")] + pub mn_list_diff_at_hminus2c: ListDiff_70230, + #[serde(rename = "mnListDiffAtHMinus3C")] + pub mn_list_diff_at_hminus3c: ListDiff_70230, + #[serde(rename = "lastCommitmentPerIndex")] + pub last_commitment_per_index: Vec, + #[serde(rename = "quorumSnapshotList")] + pub quorum_snapshot_list: Vec, + #[serde(rename = "mnListDiffList")] + pub mn_list_diff_list: Vec, +} + +#[cfg(feature = "serde")] +#[cfg_attr(docsrs, doc(cfg(feature = "serde")))] +#[derive(Serialize, Deserialize)] +struct DeletedLLMQ { + #[serde(rename = "llmqType")] + pub llmq_type: i64, + #[serde(rename = "quorumHash")] + pub quorum_hash: String, +} +#[cfg(feature = "serde")] +#[cfg_attr(docsrs, doc(cfg(feature = "serde")))] +#[derive(Serialize, Deserialize)] +struct LLMQCLSig { + +} + +#[allow(non_camel_case_types)] +#[cfg(feature = "serde")] +#[cfg_attr(docsrs, doc(cfg(feature = "serde")))] +#[derive(Serialize, Deserialize)] +struct ListDiff_70230 { + #[serde(rename = "nVersion")] + pub n_version: i64, + #[serde(rename = "baseBlockHash")] + pub base_block_hash: String, + #[serde(rename = "blockHash")] + pub block_hash: String, + #[serde(rename = "cbTxMerkleTree")] + pub cb_tx_merkle_tree: String, + #[serde(rename = "cbTx")] + pub cb_tx: String, + #[serde(rename = "deletedMNs")] + pub deleted_mns: Vec, + #[serde(rename = "mnList")] + pub mn_list: Vec, + #[serde(rename = "deletedQuorums")] + pub deleted_quorums: Vec, + #[serde(rename = "newQuorums")] + pub new_quorums: Vec, + #[serde(rename = "merkleRootMNList")] + pub merkle_root_mnlist: String, + #[serde(rename = "merkleRootQuorums")] + pub merkle_root_quorums: String, + #[serde(rename = "quorumsCLSigs")] + pub quorums_clsigs: Vec, +} + + + +#[cfg(feature = "serde")] +#[test] +pub fn test_core_20_rc1_testnet_etalon() { + let qrinfo_8792: QRInfoV20 = serde_json::from_slice(&load_message(ChainType::TestNet.identifier().as_str(), "qrinfo_530000_904144__70230.json")).unwrap(); + println!("qrinfo"); +} + + +#[test] +pub fn test_core20_rc2_testnet() { + assert_diff_chain( + ChainType::TestNet, + &[ + "MNL_0_530000__70228.dat", + "MNL_530000_905522__70230.dat", + "MNL_530000_904944__70230.dat", + "MNL_904944_904968__70230.dat", + "MNL_904968_904992__70230.dat", + "MNL_904992_905016__70230.dat", + "MNL_905016_905040__70230.dat", + "MNL_905040_905064__70230.dat", + "MNL_905064_905088__70230.dat", + "MNL_905088_905112__70230.dat", + "MNL_905112_905136__70230.dat", + "MNL_905136_905160__70230.dat", + "MNL_905160_905184__70230.dat", + "MNL_905184_905208__70230.dat", + "MNL_905208_905232__70230.dat", + "MNL_905232_905256__70230.dat", + "MNL_905256_905280__70230.dat", + "MNL_905280_905304__70230.dat", + "MNL_905304_905328__70230.dat", + "MNL_905328_905352__70230.dat", + "MNL_905352_905376__70230.dat", + "MNL_905376_905400__70230.dat", + "MNL_905400_905424__70230.dat", + "MNL_905424_905448__70230.dat", + "MNL_905448_905472__70230.dat", + "MNL_905472_905496__70230.dat", + "MNL_905496_905522__70230.dat", + "MNL_905522_905523__70230.dat", + "MNL_905523_905524__70230.dat", + "MNL_905524_905525__70230.dat", + ], + &["QRINFO_x3_y3__70230.dat"], + Some(init_testnet_store()), + false); +} + +#[test] +pub fn test_core20_activated_testnet2() { + assert_diff_chain( + ChainType::TestNet, + &["MNL_0_530000__70228.dat", "MNL_530000_905465__70230.dat"], + &["QRINFO_LAST_X__70230.dat"], + Some(init_testnet_store()), + false); +} + +#[test] +pub fn core20_quorum_signatures() { + assert_diff_chain( + ChainType::TestNet, + &[ + "MNL_0_530000__70228.dat", + "MNL_530000_907104__70230.dat", + "MNL_907104_907128__70230.dat", + "MNL_907128_907152__70230.dat", + "MNL_907152_907176__70230.dat", + "MNL_907176_907200__70230.dat", + "MNL_907200_907224__70230.dat", + "MNL_907224_907248__70230.dat", + // "MNL_907248_907272__70230.dat", + // "MNL_907272_907296__70230.dat", + ], + &[/*"QRINFO_0_907770__70230.dat"*/], + Some(init_testnet_store()), + false); +} \ No newline at end of file diff --git a/dash-spv-apple-bindings/src/tests/listdiff/core21_testnet.rs b/dash-spv-apple-bindings/src/tests/listdiff/core21_testnet.rs new file mode 100644 index 00000000..c7658311 --- /dev/null +++ b/dash-spv-apple-bindings/src/tests/listdiff/core21_testnet.rs @@ -0,0 +1,145 @@ +use std::ptr::null; +use std::sync::Arc; +use dash_spv_crypto::network::ChainType; +use dash_spv_masternode_processor::block_store::{init_mainnet_store, init_testnet_store}; +use dash_spv_masternode_processor::processing::ProcessingError; +use dash_spv_masternode_processor::test_helpers::load_message; +use dash_spv_masternode_processor::tests::FFIContext; +use crate::ffi_core_provider::FFICoreProvider; +use crate::tests::common::assert_diff_chain; + +#[test] +pub fn test_core21_testnet() { + assert_diff_chain( + ChainType::TestNet, + &[ + "MNL_0_530000__70228.dat", + "MNL_530000_1157239__70233.dat", + "MNL_530000_1157239__70233.dat", + "MNL_530000_1156656__70233.dat", + "MNL_1156656_1156680__70233.dat", + "MNL_1156680_1156704__70233.dat", + // "MNL_1156704_1156728__70233.dat", + // "MNL_1156728_1156752__70233.dat", + // "MNL_1156752_1156776__70233.dat", + // "MNL_1156776_1156800__70233.dat", + // "MNL_1156800_1156824__70233.dat", + // "MNL_1156824_1156848__70233.dat", + // "MNL_1156848_1156872__70233.dat", + // "MNL_1156872_1156896__70233.dat", + // "MNL_1156896_1156920__70233.dat", + // "MNL_1156920_1156944__70233.dat", + // "MNL_1156944_1156968__70233.dat", + // "MNL_1156968_1156992__70233.dat", + // "MNL_1156992_1157016__70233.dat", + // "MNL_1157016_1157040__70233.dat", + // "MNL_1157040_1157064__70233.dat", + // "MNL_1157064_1157088__70233.dat", + // "MNL_1157088_1157112__70233.dat", + // "MNL_1157112_1157136__70233.dat", + // "MNL_1157136_1157160__70233.dat", + // "MNL_1157160_1157184__70233.dat", + // "MNL_1157184_1157208__70233.dat", + // "MNL_1157208_1157239__70233.dat", + ], + &[], + Some(init_testnet_store()), + false); +} + +#[test] +pub fn test_core21_testnet_2() { + assert_diff_chain( + ChainType::TestNet, + &[ + "MNL_0_530000__70228.dat", + "MNL_530000_1158552__70233.dat", + "MNL_1158552_1158576__70233.dat", + "MNL_1158576_1158600__70233.dat", + "MNL_1158600_1158624__70233.dat", + "MNL_1158624_1158648__70233.dat", + "MNL_1158648_1158672__70233.dat", + "MNL_1158672_1158696__70233.dat", + "MNL_1158696_1158720__70233.dat", + "MNL_1158720_1158744__70233.dat", + "MNL_1158744_1158768__70233.dat", + "MNL_1158768_1158792__70233.dat", + "MNL_1158792_1158816__70233.dat", + "MNL_1158816_1158840__70233.dat", + "MNL_1158840_1158864__70233.dat", + "MNL_1158864_1158888__70233.dat", + "MNL_1158888_1158912__70233.dat", + "MNL_1158912_1158936__70233.dat", + "MNL_1158936_1158960__70233.dat", + "MNL_1158960_1158984__70233.dat", + "MNL_1158984_1159008__70233.dat", + "MNL_1159008_1159032__70233.dat", + "MNL_1159032_1159056__70233.dat", + "MNL_1159056_1159080__70233.dat", + "MNL_1159080_1159104__70233.dat", + "MNL_1159104_1159115__70233.dat", + "MNL_1159115_1159116__70235.dat", + "MNL_1159116_1159117__70235.dat", + ], + &["QRINFO_530000_1159116__70233.dat", "QRINFO_1159115_1159116__70235.dat"], + Some(init_testnet_store()), + false); +} + + +#[test] +pub fn core21_mainnet() { + assert_diff_chain( + ChainType::MainNet, + &[ + "ML1720000.dat", + "MNL_1720000_2187936__70235.dat", + // "MNL_1720000_2189098__70235.dat", + "MNL_2187936_2188224__70235.dat", + "MNL_2188224_2188512__70235.dat", + "MNL_2188512_2188536__70235.dat", + "MNL_2188536_2188560__70235.dat", + "MNL_2188560_2188584__70235.dat", + "MNL_2188584_2188608__70235.dat", + "MNL_2188608_2188632__70235.dat", + "MNL_2188632_2188656__70235.dat", + "MNL_2188656_2188680__70235.dat", + "MNL_2188680_2188704__70235.dat", + "MNL_2188704_2188728__70235.dat", + "MNL_2188728_2188752__70235.dat", + "MNL_2188752_2188776__70235.dat", + "MNL_2188776_2188800__70235.dat", + "MNL_2188800_2188824__70235.dat", + "MNL_2188824_2188848__70235.dat", + "MNL_2188848_2188872__70235.dat", + ], + &[], + Some(init_mainnet_store()), + false); + +} + +#[test] +pub fn testnet_quorums_70235() { + let chain = ChainType::TestNet; + let context = Arc::new(FFIContext::chain_default(chain.clone(), false, init_testnet_store())); + let processor = FFICoreProvider::default_processor(Arc::clone(&context), chain.clone()); + + let message = load_message(chain.identifier(), "MNL_0_530000__70228.dat"); + let maybe_result = processor.mn_list_diff_result_from_message(&message, true, 70228, false, null()); + match maybe_result { + Ok(_) | + Err(ProcessingError::MissingLists(..)) => {}, + Err(err) => panic!("Failed to process: {err}") + } + + // let protocol_version = extract_protocol_version_from_filename("QRINFO_1194627_1194629__70235.dat").unwrap_or(70219); + let message = load_message(chain.identifier(), "QRINFO_1194627_1194629__70235.dat"); + let maybe_result = processor.qr_info_result_from_message(&message, true, 70235, true, false, null()); + match maybe_result { + Ok(_) | + Err(ProcessingError::MissingLists(..)) => {}, + Err(err) => panic!("Failed to process: {err}") + } + +} \ No newline at end of file diff --git a/dash-spv-apple-bindings/src/tests/listdiff/llmq_rotation.rs b/dash-spv-apple-bindings/src/tests/listdiff/llmq_rotation.rs new file mode 100644 index 00000000..822b2a21 --- /dev/null +++ b/dash-spv-apple-bindings/src/tests/listdiff/llmq_rotation.rs @@ -0,0 +1,558 @@ +use std::sync::Arc; +use dashcore::bls_sig_utils::BLSSignature; +use dashcore::Network; +use dashcore::secp256k1::hashes::hex::DisplayHex; +use dash_spv_crypto::network::{ChainType, DevnetType}; +use dash_spv_crypto::crypto::byte_util::Reversed; +use dash_spv_masternode_processor::block_store::MerkleBlock; +use dash_spv_masternode_processor::common::block::MBlock; +use dash_spv_masternode_processor::processing::{core_provider::CoreProviderError, MasternodeProcessor}; +use dash_spv_masternode_processor::test_helpers::load_message; +use dash_spv_masternode_processor::tests::FFIContext; +use crate::ffi_core_provider::FFICoreProvider; +use crate::tests::common::assert_diff_chain; + +fn init_devnet_333_block_store() -> Vec { + vec![ + MerkleBlock::reversed(0, "000009ab6ebbf37176dd95a82f3f66d9ef24e8108dfe7874fdf2adee3dcab7c9", "e0028eb9648db56b1ac77cf090b99048a8007e2bb64b68f092c03c7f56a662c7"), + // MerkleBlock::reversed(0, "000008ca1832a4baf228eb1553c03d3a2c8e02399550dd6ea8d65cec3ef23d2e", "e0028eb9648db56b1ac77cf090b99048a8007e2bb64b68f092c03c7f56a662c7"), + MerkleBlock::reversed(5334, "00000072f3c73d891d86546f259ba2cd87d1aa655c447640a4257f6a8e6f7018", ""), + MerkleBlock::reversed(4207, "000000a451ba6459b3ce6128a5e8f273f9bc2010645dd4721e1b51efce18dda7", ""), + MerkleBlock::reversed(4192, "000000076aeba26f76a5d0e12e11c9b4d35d7232f1bbae6c47b4d8bef4a12b62", ""), + MerkleBlock::reversed(4168, "00000179987c39850ddd901eec6bfd0a508ec54fb6a0cd28481481aa0adf56b6", ""), + MerkleBlock::reversed(4144, "00000028bd64fd360dba79acf7cb3bae6cea18553c7232894a2ace15ada70940", ""), + MerkleBlock::reversed(4120, "000002410622902b361d1e2194f2072c6409c6f22ef5fea854d3326a27075713", ""), + MerkleBlock::reversed(4096, "000001f340d35fe89d1924de57ccbf63a7a09347835e6e4990ee2df12a4a67f9", ""), + MerkleBlock::new(21696, "36a179a25d081bc6836be48b11f10e6e484fd0ef068dd315a9e11482ea030000", ""), + MerkleBlock::new(21720, "cd36d310de9b14823aa9aedc00abbe2b5ac4117cb8d00f7693ad22af05060000", ""), + MerkleBlock::new(21744, "c244b2775b5fd5ec60d911f7b851ec4e78cf54f678f3d64cc69245fe60070000", ""), + MerkleBlock::new(21768, "4d523423dc19a438e57ee0e150c3f62369063a1bf99274083bd2f055fe020000", ""), + MerkleBlock::new(21784, "5b298e3fcc475e57f20520601057e3686219a2bbe09b0baa34d9759268050000", ""), + MerkleBlock::new(21792, "c90366c6455c23930215ce724062fa1dd2ae89b66c722302dc9d56ba1d030000", ""), + MerkleBlock::new(21816, "dbe354545727c9db4cf872765455d1aff09296a14daa4075d18db6bb4a030000", ""), + MerkleBlock::new(21832, "88d5f21114fddb86c8ab230f2b45fd90b8cfa7a61b0d819160fdb08345040000", ""), + MerkleBlock::new(21840, "2323ab4e88e0923e8e3bd506192dcaa4286c20340cc7525128665941ac050000", ""), + MerkleBlock::new(21864, "e30d315d4a40d82d059a65a900242f393b50ff8fefde58a4a1b482d232010000", ""), + MerkleBlock::new(21880, "1efab5ab1fe9d99f90072d7d377b0271511e16b2f833b3314576ae23e4030000", ""), + MerkleBlock::new(21888, "99867fdccf5f7b50c648b1ad3c93c1fa7515d4529aa5efde1ad17e0780050000", ""), + MerkleBlock::new(21912, "4887de631c97d933c8a52026589ad02aa31ad2a9e6fd66c8b278aa34bd060000", ""), + MerkleBlock::new(21928, "ef176a4a5dbbb041f7e582e4adac44c81e7d1efdc92c2b532bcaa24106000000", ""), + MerkleBlock::new(21936, "af5509f7e1a2c9827eac9487746dd6f363ac56d4659fdf0089f8bca54f020000", ""), + MerkleBlock::new(21960, "c970d99fa088f3a1e9bc9eb3b9a4d03263b755149ce39a6db5bdff6d23090000", ""), + MerkleBlock::new(21976, "4a53ef88bad2a12b5af9767bcef10980955971826b5f75ef0f17518a73020000", ""), + MerkleBlock::new(21984, "0b06e90c32f0611bce49e4646213f0bb7a43c59b82cc5a87295bf4f15a060000", ""), + MerkleBlock::new(22008, "7b9b8fe254a17c31a2315171b8b224ccf2ddf7960d69a87c5400514d19050000", ""), + MerkleBlock::new(22030, "df111a9253e9f2f80d3de7a7274aaaa6d5ac0426b6a048991fc8ed7586000000", ""), + MerkleBlock::reversed(24869, "0000086ccc192b07450acf188eba3d0360058dd43793fc622e0b7744cad5cbed", "52b4cb95e82f827e916b9a5a95198203cb7d60d892932bfc64aa9496c79631e7"), + MerkleBlock::reversed(24868, "000003227cf2f83a1faa683ece5b875abeb555ebf1252f62cb28a96d459bcc11", "5c30a026f7cb72fffa390b1200955354eafb6ab5264b8043ff2a2e582f230342"), + // MerkleBlock::reversed(24868, "000003227cf2f83a1faa683ece5b875abeb555ebf1252f62cb28a96d459bcc11", "0df2b5537f108386f42acbd9f7b5aa5dfab907b83c0212c7074e1209f2d78ddf"), + + MerkleBlock::reversed(24867, "000003bd988f78d4663780b467dc6155f5c1641c16a2d0a09cf62eeaaf9ffb39", "b8d3a314e523596b23a57537ba1a7a8328c96ae895eab8e80760eb841a88df06"), + MerkleBlock::reversed(24866, "0000091ffc39c9891a425b7eacb051c026d8e6ab4a86f074b6961f7c4a0ea87c", "5703a09bdc76f7e37107d359766a74dca3ed0c71b7a0132260e153544d4ee208"), + + MerkleBlock::reversed(24865, "000008804a2cc065da4752c7f6f4b889c682749997bf24c704ab44e932ae0f6b", "5551649a12b1f22b4e014b560aab1572f0470956bbe1c6ada1dae84310277eee"), + MerkleBlock::reversed(24864, "00000aa4e53ca2059b645787d4516dc75f1289708d2a2d3f6b103d171821647b", "09594af7333c774ec2407eccb9b24d2a4be9c49d8e59b34b10fa1f5d2c7739af"), + MerkleBlock::reversed(24863, "00003130c6ba235a12bf1057c459268ad10924a47d9b34eddc57858d77f72ddb", "ff4e47838f277a170ac230745b023dbe2fa9390fe9e9b3242aff129240944c94"), + MerkleBlock::reversed(24862, "000000b5f4669ac2ebda3607fa627df62656650ee689a8c82705f340ec3d78ea", "6de4c9854cd3ff66b4fc0f46d51c0a3da00919b08a1cde84404d8fa2ca8e8ba4"), + MerkleBlock::reversed(24861, "00000692fc267184a6ab60ed6af6a55cdf527773872c601f098569c254f2d189", "e74463659764773681b780aa204c8914db2aa831fb3da82dce529f9d67434495"), + MerkleBlock::reversed(24856, "000007991952ca7c32420cd92654ecc41d5716c191cc96cb8978ea3257a69992", "062fd8d751abcbcadf2027e1536e2710a04ed21f0d0ddc7f2697b7282f0bd04b"), + MerkleBlock::reversed(24808, "0000037bbcd8e2af574fff36fd248d2058b3a9582c9a9c3fc6ab1dcee69c25e5", "52430300040dd138bca38fe9441d94345e5c34644e1c211308bc420dde47ddbb"), + MerkleBlock::reversed(24760, "000004f78ebfe17c2e78c58ca1e754e02f3e52043bea00f63be7f2cd58d23c96", "ff3c3a2740c38cb87dbae24421f4473a35af8e8619ecbec677265bb74a0d1f51"), + MerkleBlock::reversed(24712, "00000597b3da0bdb229b571bfcebb78a5786c9bc21d3fb3253d497b8a62e5d99", "f1861fc7b0b00fa5cb76b4ec918f19a898ac50aeeaf69e9586cbb0cb2ccb4103"), + MerkleBlock::reversed(24664, "0000078bc1a0778aa6d8dbefde4f110eee570c1b945c553b9ed98368871d6b5b", "b600667103e998ab12bc8e8e45e1b6efd3ceb5ec8a15e6d7f765202d2ba70766"), + MerkleBlock::reversed(24816, "0000062c4e24e761dc2d1b9b6d1588198b3f4ad8a767151ef6414bfe87ec94da", "ab1331d5de92b75c32a8de2b75db01ea9676a7927779b3f38b9ebfb039d33ecc"), + MerkleBlock::reversed(24817, "000000e3756fb54df8e63db7c69158a88247ae6fb951602fececa314820a644c", "fc930831682f27c6a837e65adf545ed686a57eceb62f05a1e11c601183869920"), + MerkleBlock::reversed(24625, "000000461e6f7b4d5656173bf188e83bee5f10d971616d946db3027cbecfa13f", "77a02226b66fdd4b3494626bb75691ffc575b0de3236e519a7f88a90d2a8601f"), + MerkleBlock::reversed(24624, "0000037bd6d0b218eb906ab6206fde5a96f972ede0308bf76cac4190428a924d", "0d15faa6f607d4b17c5d24c2247c9327f1b36140bd6c10071a3360c1d57e6678"), + MerkleBlock::reversed(24672, "000007756da9e48ef99829c467379e3a873ec9bf90652a9d10483329ef4e222c", "544a57a166570b1569a58b736e7526ecdb79c972be5f4a60e3142b959f730d80"), + MerkleBlock::reversed(24673, "0000018ed9cd191989b356447ad4d0649d5c471e1661a79aab2613251cf991a7", "a89ef31ee6ac489f8f3607eb8f45de084d51cd87ab92fac7868e2a817440cb2b"), + MerkleBlock::reversed(24721, "000004413ed62592b7a47b06a296ecb79dfcf5e65227a3e93713b36c48846f6a", "48d83f6760e7c3eb3b19da95651cfc385d22cfe864a3b53c9c00c4654d1961f4"), + MerkleBlock::reversed(24720, "0000050c3da50cc911506eb4bfb50e7b1f1ac0d165eb62f239a48545cc5834c1", "892997c525cb923b96951814d4575e75ce16850e3cf12a9d673970682ef7eea5"), + MerkleBlock::reversed(24769, "0000010f2aabcceddff97f4f87987902f99629518dfdcdf5522e7e159b78a825", "6baa43c539d6605cfe29e2f49b0f5913874518206803c1031b9753d56f55ee7f"), + MerkleBlock::reversed(24768, "000000426666e40ff602a896a1493b765daa6fd6667f7c5edd0cfd7c23857750", "f0e942c71fc30f5997162a3392a7142557e801cdafe292ad9641aeb213aa6e4f"), + MerkleBlock::reversed(24860, "000000b693fbd6d2a02da459158394220f83a4cdb947117246c83a65c9296bf1", "48f81ed8fa2f69b1c6144e435ca78809f805db00109b708480d38a2b8197f241"), + MerkleBlock::reversed(24859, "00000683d6d9d7df1b530eecd973fd71aac2434687cdf94b02a959237b41b123", "9a27c39d7c0e47d331dcc07816b1794593e1c3b6d854b3e0d5f46a916766f7fb"), + MerkleBlock::reversed(24858, "0000052e1a801d4313cd6a90beed7f478f34b778c2a8cb0e8b98dbcf83c5efbc", "1e906bb71f88905f5f457eba573d4bea9fb37689dd59875533785b6c2cc506aa"), + MerkleBlock::reversed(24857, "0000076bffe00bf97fa0baa71c1444f5e3270cd0ada2423f1c77858b95d19338", "1955d09fb7650cf2eb2a8b300c89bb8b4522f0b720ea2c9c235c29625b72019d"), + MerkleBlock::reversed(24855, "00000763996b273b8f8fd4b184e0175679bae5bd176d021efd71d4d598e0a184", "ee69bab287a0561e23545c3092b5598889b2165045600b65091f5d064a38260c"), + MerkleBlock::reversed(24854, "00000088430da03d58df458cb0118dfb7a5583241718c8cbb1b02f7eee673463", "15cc835964dab2bb3886b5e5cee5511fba6e7c77cc802835dda39dd424265c17"), + MerkleBlock::reversed(24853, "000006fe4eb832348f5abbd7d7fe5653068dd20ca58e05bec321f486a9fe5eb1", "63515c8d179eda42dab1f4a975bbaadd9898788e061ec7357c6714353a332ed7"), + MerkleBlock::reversed(24852, "0000018db2f6d303edcdd6ded823acc31bfa50f08389111b4f90ca4cc753006d", "00022d442bc384793a356aeeacfe6d43effce4afa60d0ec5da4650c2e545755d"), + MerkleBlock::reversed(24851, "000002f575aa919a482ec157c9c3614057078bdf99da797305c9c7f549a9c677", "292ba3e5efad3c49097c0db3b818bf920933248a5706f845b313cb0598bdc776"), + MerkleBlock::reversed(24850, "000002dd2d2977ff6fa6765954919dd816b96671d4c8d5d0752f5e4efc48f8bf", "0fd38cd24e0b2213c2391152c35889fc18f84e075a1e214e4ba9fc82195a11d2"), + MerkleBlock::reversed(24849, "000004574333f4fcbbf989299a298c53b89718aa10c169c32db07c18c14a33ad", "eb722e4cee02f65a4839ed67631b80d1d0a7b323ee2c4b30ede92388eaa48a73"), + MerkleBlock::reversed(24848, "0000053f364c7ff258ff87185de4c789420372d9bd76f37dbdc57d5b3d1992c0", "ea387ae59b896c7e7351509632bb3943930370b884e13fbe703ca871d1725e55"), + MerkleBlock::reversed(24847, "000001e2680c8f337c3a6d81f7b72e67836dd64a6cbbaf13875a0a72976282e3", "b722474955912746173fb7f17f7a342b494c98d1599c50b7c9a35070c3e78924"), + MerkleBlock::reversed(24846, "0000030d4554e01211b54c9041f7a257ec83f9079a1913eda923bdad11f08670", "18439878443990f9fd7a2a598e0d74be3eda31dd198444aa35ebf9de3dea0dfe"), + MerkleBlock::reversed(24845, "0000045348e3cef51ae93a68a09e56eab3a08f339ab62b196709f83bc97c6936", "c1bc302bc6e7318178eeabfbcdfcc3de5b89b507a771aa5a06645ee05a8f03e6"), + MerkleBlock::reversed(24844, "0000040777831dcff5ffb3e3c0bd38a008a6d4456c06e320386004fa68a49e7e", "e81c9ab159a488f6a86c592f770ae44fbb31ccbaf77c2db31f8b7105137c30aa"), + MerkleBlock::reversed(24843, "0000027e119d72c5dda56cf39223b35f232092495996345be248eeb48c9f9130", "4ba1856be4bdd7faceafd79d8548c87917487e994b61c65454bcd46ff549f2d7"), + MerkleBlock::reversed(24842, "000000baa4a33d65e11107122a92601053ab4e716a6d661dfd6bb9f874188413", "73ef8566ea6a716033d4dea8a311043016efa0942981ebbab7289715b984b3cd"), + MerkleBlock::reversed(24841, "00000645381ff1106e135a9d5df3cec8edfafce71c182325d4b75099d4002c4d", "8e834a0a5482eca0cef23ce4a9c6ddca8412a972f938ede42d3900919db9f85c"), + MerkleBlock::reversed(24840, "00000056c854b1996beec75c464693bed7a958e9b67d71d701340b8ff6d9e054", "58811d85c144b03f273fc4579c5336e90fd58da543cba74110bde7471ff82b4f"), + MerkleBlock::reversed(24839, "0000027aa1d0102ddacd2f9dde2681ceaf0b5c0caa806cb7f816c119051464e6", "7eb1bd17340f7cff6deae1d6cb12de756338c145b51a58668773bc8a2275e47a"), + MerkleBlock::reversed(24838, "000006437989e53e813df1a8aa388096387ee5de9cd0b045779a703582e7949e", "6fa7e4e02ec3cf482fb179f463e00e34948115303a3e1ca0ce4a82fcf341e0c1"), + MerkleBlock::reversed(24837, "00004cbd92d058ad559d6cbb2d973e3e199015826eeab9691cb718ba349b0f70", "1271616d765ed0010c1213c190fe6d1d6e84859f6d6dfab62a95ba96c90eadc6"), + MerkleBlock::reversed(24836, "000000885cf1eaa6b419152fc651e0119d57281f18a6ae3806dbd4fcfb5cad25", "a28c627f58c40748536f3b6f6aeb73f55a6b1acc54ed81510972acba0a6acb33"), + MerkleBlock::reversed(24835, "0000049f89a5dac8c9593c601f9a385440ee050abe8cf5f039a3d59c58f06249", "21d1c3e4985f27a6b361891c63fe045a9fc3199234cc3e2089e9a3793de24424"), + MerkleBlock::reversed(24834, "00000104885a2403d15e65e25daf9f78c755c2953945914f58e6328c9dd50c4d", "08d3447875c127f2e37d06a1ed02cf973a61d35c7127860c3f3bb4393cc40dd7"), + MerkleBlock::reversed(24833, "00000795888b51da4cfe848adfcdff19cfc815c1865c58e2200ea9ad596df9e9", "7551b29e47bf5ecb9a39fe0722273c9b2622ff87ce088aa9c8f167c25674efab"), + MerkleBlock::reversed(24832, "000004169e45af9fd4ddaa64c400758df7cf36b0c1a22f2b9f29a11fdea70eba", "afe8d8af3ea9d2227d465613ec5005f8e663512dc129ef3169f013d6518cb493"), + MerkleBlock::reversed(24831, "00000743fc8bde3da9911bbd5275e2e2a68afed8ce1d56b73ed8557528a4fb45", "296d41098918166d02d61a99975ecaf7780f286d0b3b6e2a6619023af2c2fe68"), + MerkleBlock::reversed(24830, "000003e8049e2baee08e173a04106df0c4b0f858f8ae1918caf970eb10d2046a", "f258dae6201a647985d093f9e1ecc602ada427736888585556910b9ee324d475"), + MerkleBlock::reversed(24829, "00000169672fae75e70f45a7031bffbdc92fb81d183d0324f39eac9268d11ceb", "aff7439850e5ebe758714832bd56c19d67e005d7a27aa6b977e3a158fd86fbd4"), + MerkleBlock::reversed(24828, "0000082b9da7946ea66dfa9c6ca9765a41219a049129248e4c5656f9bdd8aab6", "58ea2e9310568de837fcd3278cc9083c0e31b79896e25c487c237eb65f38dbcc"), + MerkleBlock::reversed(24827, "000001249c80a3899d72096a03195ebfb96b27118559094e149fcdee18017458", "f68d24638b3b947689b1a95c1aa8fbe51cdc0bbf2546bb1b2145c09d97901598"), + MerkleBlock::reversed(24826, "0000002d7fc5efaf7d8799e6418f2cf0eda1e9dabc9771366ea66c5e09dae7cf", "95a9cc169d6600fc1ae5188010b0ab277ad816b59f78a39b4876f6641596bcbc"), + MerkleBlock::reversed(24825, "0000051ee159b9aa029497f509e3c92bfa03737974444d04bbc940cc8a901bab", "7ef98bb9b3566288bd7c28a2e42436bf8f60f52b15c8da32ae7e624988f1bf63"), + MerkleBlock::reversed(24824, "000008076d72be61be309f5a8e531eb5a85405f4ee75125a1b3556774b5848d2", "7f9512c2488e48e0ac3967ea476344ccb9b2572865e294c4a1bf7c082c0c1771"), + MerkleBlock::reversed(24823, "000006cba36bb9086be9ac34b03d0bb2379ccbf9af7cd17da4f2450dc9f7006c", "767d18f30dae94f145f81711f9867a903bc8fa58a4cc0d93791bc31cf683cc64"), + MerkleBlock::reversed(24822, "000004c5b1b7e1bdf532e1318154cf2ebe387b5b9ded7c748b75856003a43371", "85fff19567ca04c51cd5f345c563b755480227a512e63c2b94f007d82089f0ca"), + MerkleBlock::reversed(24821, "0000066acb91115887007ecbd8d82eb4f4c32c0270552fe8b2f32e48213575f9", "3280258fdc954d6470088b8b998ef3159f746721999b1e1ed8b48eca03a89897"), + MerkleBlock::reversed(24820, "0000006dc4fc61cdef4df41ee9b7f49fe17eff54a66f3a3a88bed959388a5434", "b3142f93901412470ff5a60bb97f154bd073fc4b5680de9f6e9ed8105f952f57"), + MerkleBlock::reversed(24819, "00000178548ba2f34bd307781683b0f97ac31ccdd9b1b22e148c59211567c407", "b2c7c4467f297d5b5555a78a04a5f388191ba0e1b66c46910ab50f23492ca314"), + MerkleBlock::reversed(24818, "000005e3612dd20b3bce4ea865eb39045fff1f8937301f9a1db3654d1a98ff80", "438c23bd2a25faa8a0e0938b4bf472a978e94f3ac28cf32c2cb4de1b093dc804"), + MerkleBlock::reversed(24815, "000008ab4c5a522743760f8ef14089c352b0f7b1013cd7ba7392c96e497afe85", "ef7eeb4cdababb13885d3914e1cd7b8f93d0372e9cf15c6cb9a9733e189d4105"), + MerkleBlock::reversed(24814, "0000049c9e3d99ae33ce5d71e7e3974d8be8d87e65f66f5d36f200f482eb89a3", "5a951f79deee87276b7a99c8d919b5625b11bb2b5e8130d101c0060c6ba22daf"), + MerkleBlock::reversed(24813, "000006799bc165a2d527f3f980c919863cd3a78dcf3fd201f57bdd6c27ff7af2", "edd0aa20824e1b9db9b04a5ee85fb16a7a7a0553999537caa2717c6266975c1c"), + MerkleBlock::reversed(24812, "000008822d1b4327327d2477ed48157ab739f5631451f59e669f65da6b4d99d0", "4a653975f3b01949bedf979fed7fece05ffc064e4d0ae5c69f57999445a00c70"), + MerkleBlock::reversed(24811, "000005cbfa02e404973f41eccae792d8394f35089a39ae4f4242e61fc3110dc4", "638c996bb12ad3581f31f2994ebb0983c975e541e6bd75fadc4aabab2b1e2949"), + MerkleBlock::reversed(24810, "000000c25bf5d29876879fd5664efecf5dbe6b889756b0413a7e9a7e14b63894", "33b7035620f8ab27533844a2069cc73e8879d721a79a3f4aa302d3516103dc29"), + MerkleBlock::reversed(24809, "000001c6e2988ef3d42b7fe817481eded236109b1ecab23bde43710cd0b82890", "5ec0593cf7bf479877e0b5aae2affe195fa860693129b14906f6205829e79db9"), + MerkleBlock::reversed(24807, "00000043a23d0bbcd576eb8c39b194e9ee5364ed47645dd4917bb45d06768777", "c47aea598c0bcb0fcaa5e3d2a1cae54de3d701ac999b3d75c478d8c3b4062e88"), + MerkleBlock::reversed(24806, "0000002c7dabf7c52be36c77728fc2a1111f0caa9d167e4930c954540c3aa142", "291739ec18d97bdbc2165b78276241a09071c780f703f44dbb99070fe297f260"), + MerkleBlock::reversed(24805, "00000213354b423e60b5e4e3da96a57658fae6451078b4301eb7fc96d286c346", "8d65d6f8d35ea86b40e22e7a281aecdf316ba3bdbcec0d135d732fa4e0adea5a"), + MerkleBlock::reversed(24804, "000006acdb4419d876c00a195f16edf1b5732ef6c26e651ae9f2f3c2b8964a3a", "ac0e90305591b67c48afdd22854961582b6270ada16b22b12e51535275ff6dff"), + MerkleBlock::reversed(24803, "000002a9757ea470f4d6341cec13cc12ae8e7940bc401b36b22a1a44d39cd7ec", "403baa600723264025e8f4121bf8a6d35e0f86a6791fe3c05ae9cc9a81371c99"), + MerkleBlock::reversed(24802, "0000042837f5359d0b4d72b88a90e782afe782afbec03fbe54c7f06ef91e0fd4", "1d1e1958e0cecda3756dccdc0daa9bd75d83534f99f1573e7f0f04a79d8ef999"), + MerkleBlock::reversed(24801, "000003de21b33156e7d94b1408fc9ef753f7cc9bfce52fe6ef2def3c2184a00a", "981f77de0a04a241c6ba5a9532c90f95399548c143ff6759a83af1c17f1d9c92"), + MerkleBlock::reversed(24800, "000000f63595d3c80a44ff104b19828bd7f337027dc064cd179e2eb5e5e8db56", "60d7c94e27c451d0b0519abf2e7297d6d03edc953839850d67f8fee315a333aa"), + MerkleBlock::reversed(24799, "000006ac1f34ea47d2db12fa1c8dd765190ab4c5c8329baf12c6a8ba5fc42dbb", "96bdced70b2ea5938ebab0786921422488e0c11f1542460b0a1a0abbc9ded2ff"), + MerkleBlock::reversed(24798, "00000401fc8d3cfd75086cc67b73a32d7978877e1726ad9949bbe67dc4d46840", "1680e4e050838ff64711a4e0b513a2a3c12e769bcee2ee98ced3130be22a9dc3"), + MerkleBlock::reversed(24797, "0000027b6ceb8c45d444005a6b948ced264c8fc39fb412dc69389ac63fee668e", "493c8ceb8c8bbe311d3a4ab438756f753393c59eeed20f49f450e0fffb01513b"), + MerkleBlock::reversed(24796, "000003f23b070d2734940dcc2682517883b6f5d3189c34b5dff4742153ec64ab", "42b4f4d81356e206a38e8902bdd3816c53bc37b99c26ad5c2656d93fdd997631"), + MerkleBlock::reversed(24795, "000002640f8273af03475f6ee496f80700b12980bc4fb059f734e6183377b078", "cff2b67def2c0330f3b94408263f0d16bc9dc6c5d7cdf1c27b5d69e7bc85ec2c"), + MerkleBlock::reversed(24794, "00000005cb3272a005d40b45caa1cdeaba2651d619cbd6196f2c6c6317c8917d", "e869767cdd4f87b2e5ce17af3771e3348e86fb464ab52415f5d6ae7f0810c666"), + MerkleBlock::reversed(24793, "00002b2c169c551e051fe563eec39734ef89eedee4d65f8a2c0074280418c8fb", "457ce3aa9c57e761c70006c5ee2b6cdc44268dffebb1496df027fc94f4434002"), + MerkleBlock::reversed(24792, "000001f0718c066dd865f72836254d6e9b217f49ed4e08b89bb8e7ff3b3aa6af", "5ce64f838c23a9684ffebf7417398a6978de294d0417d67721f2f3ea1fe59988"), + MerkleBlock::reversed(24791, "00000156030a46774d864bc346009cdafb47b9ea30a1ddfb5ad5ef5bcc8e0cf9", "25b41d4886e9c6522bad0f930bb8f6321b989abf22cc308446aca2332bb443ae"), + MerkleBlock::reversed(24790, "000003799100d36e4f1eae601ee81df2f02ffeba59d3f29a7db43c2b7568d481", "8614dc6a4b3df476d29df930d2a85085b747a9da4444f2ffd8ede95ecc3c3618"), + MerkleBlock::reversed(24789, "0000047213ccf1910fe90f8b8ced3e8a2e3a9c1bc93ebf4103f250dde548e470", "433604c27acdd014af061155f9f0427d6750eeda899be051ebc79988ee5ec741"), + MerkleBlock::reversed(24788, "000003e3515c438775628e49dd61701a8327005566c2b88407d9afb59244092c", "62b4fc1cec68e8700b428464eaa123d9206afcfe5515e43b6350cf960ddff3dc"), + MerkleBlock::reversed(24787, "000002563aa47ebb2189f33735f698231161c5df29627e36c01dcbf0a6a2315e", "2b94cbcfc62f96e38a2d35e89df86e3c73b6127bcd5ec54a1a6b65e425f62a9c"), + MerkleBlock::reversed(24786, "000003c7f4624196872c229be62947dd0004e09571fb1b8c0625fda088873e5c", "267d3e878168483b7a7326a5dce30de10719ebf612c6ec1609f97bc0c25a559f"), + MerkleBlock::reversed(24785, "000002c6cc3fc915987a1c89f295e969db682abad30b7143c66df3d020c81aa6", "69aadd8c54d743e283f7efe28c6c3747db9cc56dad527660f93675882c1fccc1"), + MerkleBlock::reversed(24784, "000001a0000cf3979494e1451bbb2e5b8e5364c003d69b07e33fc9a4a42afe49", "c87bcb325c5385d3a3d59d9825297e5afa6ac90c39c3bf8ce564f0b95310424f"), + MerkleBlock::reversed(24783, "0000051f34bb857fb33424cb780e066cfdd565c64714048d42b84d2ce64e0b87", "8b6c786b0e89691b9f525eccfbdcfe3c9d2e40486a541ca9e7fb584d88ccf5bb"), + MerkleBlock::reversed(24782, "0000046900a9d9478e84fa09702fa98e734ade9416f43229969c03d499e2b827", "1e1f36e337c0493bd1b178051c8b42be434b0ce567b9ee1ef844fc950cb7d612"), + MerkleBlock::reversed(24781, "0000020466a6a3f34b7edf6e7a56950992eb43e4f46babce3c8e7a1f027932cd", "ffbf5508f9f933ea14b91b00d804d63bf6f816a09db21ef2333e794326d9e4ec"), + MerkleBlock::reversed(24780, "0000008ea4a9398eeaa5ee996129f6d58f3ee6eb36ad48b39dcfafd491b72698", "1fe2f273d42263374697890bbb858d5c2479837599eff5e37ba9d80181a71ca2"), + MerkleBlock::reversed(24779, "0000023b916ba5f3cc323065f8673c6648cae692a97cb84ae052d372e2ad1fdc", "2d062245bee6e9c053bd5e26bce664c0a6c4271ffbcf4b502dea1ddb960d905f"), + MerkleBlock::reversed(24778, "00000128469a850ff260fab8d71cec4ae08953f53adc769b0e4510c64cd5b1ae", "1e366e20dafbd93954deb58361a6c92b0846ab57015033b4d46d153fd07376bf"), + MerkleBlock::reversed(24777, "00000329f84bfad3889f8e37a6e5f532547a73840428b36a875423aa3f781922", "ec8aaf177d99942033d4a5bf04f68436a37556a86ef86bae68b992150d8e0fe7"), + MerkleBlock::reversed(24776, "00000039433505249e61dcea66c0f3075ac384cf216970149d2e7f149f031ac7", "68a58f7cb6462b5509c8a52617fc14f4113fce4773dcf679345f12647fbc683d"), + MerkleBlock::reversed(24775, "000003c944684f4df6d0e9df65bd0ff45db24279400c977ad1ddd095d3d26a20", "1658ee60f05710256858a23281494aa144333ed06c2be3c167979cafaea18d7a"), + MerkleBlock::reversed(24774, "0000050ef9d0c1e6e6d1506dfc9a93c87b49adc40d3f266f168726a987cbb16a", "1ea15968bf1200beae5fd67242c134536c683388b88965c1332f41d147960daf"), + MerkleBlock::reversed(24773, "000000457cb432ced5fb2ea78d36ccb2744d22c1a4aace36ecd8e603325282fc", "15cd134152a289645ad5bf17b205fb7651f32954b4b0302538d81d67782eae37"), + MerkleBlock::reversed(24772, "000004c958970f8db6169284b8fc0a48624964e38a1da4260a528855c549ffd0", "69bcd4949035c8fc2b0f2d11806e031d7b1e728bf3a39c406454c4767eca3747"), + MerkleBlock::reversed(24771, "0000028a421d2f116e56ac5da67217e942fdc5d783d05f2b0ec08aaa98a4af1c", "e1b6c73a9f3540acbf87106ca8306edd9b25e40b576462f00a5b0268873f85d3"), + MerkleBlock::reversed(24770, "000001b392b1b5e29cb334a6c7d9baf85e8468fc9d5ac2860c2ed4dfa8affb3d", "323b403506c54cc4119029dcf2dea0e2ad27641135abac006aee894df0fd9e57"), + MerkleBlock::reversed(24767, "000003a2b3a849971822edc9505114e61704a58db8ebae14c78bd0fa9184f519", "52795e25b88332aab36e18a3871d8de9f0ffbd7a26394e633b85c52915d6b6f3"), + MerkleBlock::reversed(24766, "00000081a650f7953b6f6e704b14b142e06972a3fdd86ebf5327820adce8a6f4", "0599719b08ce78a6b79c9722a8d50e0f124a9158df2198c78db8cb59c2b13d0c"), + MerkleBlock::reversed(24765, "0000004b32f5cc9512ca0bd2f96f84a29b975c879ea050c7309c9321cd76d67e", "03556bc5c6eb0458410a48319fbae6d8b68e97264dd0185cf7996e3aa2432fff"), + MerkleBlock::reversed(24764, "000003367801e71b6bfe4ca3e277603f2f9091caf80be7bd697b2e7d8b2fa091", "49e298fd9fcadad735a72fa84279e66d3569ef3f417033e34ef0ec0b764d0d2e"), + MerkleBlock::reversed(24763, "00000555ea65e4120624c4c8699af9ea3c91a3f8e42095192397fbdf6774f02a", "3f9e47004fa5ae565199aa25f23a0d3e828f7062fa54f3d3922f8a8d42d87dcb"), + MerkleBlock::reversed(24762, "0000016c4f0f1cb3ebd8f2b2adb53347a3c69fae7c0854b4ea41a1d4c8af7d6c", "49ae7f66ecb7ab04675d13351983a4cb0d9c1270f6126a44f480ce8f7b0da9bf"), + MerkleBlock::reversed(24761, "0000028655333153a9e4262170b8acfda4a2dec64dd387b2033dc0a075eed242", "25b814db212d80f6ec64c896bc5703ed6c83d25a21208904dbece269b2c1e8f1"), + MerkleBlock::reversed(24759, "000001c7704486626aec884fe851b5b54326825dd56d56d09f03beb2a576ae09", "82c0e989264ee35a73c793ff4787dd9cccd360b9824310350f96a84e68a65486"), + MerkleBlock::reversed(24758, "000004db5d642d4a869ce8100ac5154658c06b9ef0b9e6b9957139529884b79c", "7837bd27d828f25e2553c20bd3c1bc791e74153d714d8698ea73e2274a285e9d"), + MerkleBlock::reversed(24757, "00000495b214d71655cc24f56bf9aab7d2ab286857e6f9890f1ae639c357b69e", "9eebc821850b559661dc12d2ad7956bcf84c48855157d69320cebed2a7af7081"), + MerkleBlock::reversed(24756, "0000029d66a078af9d234a430f0cf8580ee0aac264fc91e25b6e379836f64aa2", "095dc5603b17a20dcf9098bf78bc823ed978889a48e5419421ebf96bd1a72e14"), + MerkleBlock::reversed(24755, "00000319ef4c483b432a52e103a5fbaf72cb2cb03238793982455386f223b5f4", "e127647a7116620ac6b5c9860c3db07878c907a5455465eb1e7459ae0d44f535"), + MerkleBlock::reversed(24754, "000000a5cd94be2be2764cb5e3eebb1c4aa24b0bab289ba4bdf032cb5c4511a4", "91d3e18a32ff9cd35e03f9fde5c23acae3a49dca5ba53315621b29d6518fa586"), + MerkleBlock::reversed(24753, "000003a4acaf2de030463272ce372a6d38973bc4d3ec9abaecd88fb242095c6b", "dd26bba770ca425e65f1d246afcc66b13acb67f255a0595d4345d1b567fd82b6"), + MerkleBlock::reversed(24752, "000000b13d3a5e352c02e26fbbc0c5a19c630ffaba54177c3074b08311c334a5", "e1b0ff1824d3492cf1b57ebb37122bb0fa0291f2da58884326cf4556c594d43d"), + MerkleBlock::reversed(24751, "00000306d57c64e4ea982061c855b4ec7830836e9779d45460d96b7bbeb58ee9", "aea894630ab1cc0e67341cae8254d4c94ab0673542b6db168a88117e6b80eabf"), + MerkleBlock::reversed(24750, "0000046a30db2347c925c399ab3d08e95f134545a1b4f559c970db585b7a2a2b", "62e912763dfe8494d354d1422997eda857e8a87d737af9258926a5300d2e2cb8"), + MerkleBlock::reversed(24749, "00000002a9013220364222bb38dbfb6fa1a53177524d9e0de1d243b34ebfc136", "36f3743971a12d0a47343a8e420ff0e7f8773c0427f15b59ddfcdb63edb41f9f"), + MerkleBlock::reversed(24748, "0000004c90e593866678aa4cba5211019e02e922ff7180fa3f152b20aeee589e", "d0a6830114029bb5ee4fd98aac7f31dcc10b29a269a5207d433a4f9ef75acfd2"), + MerkleBlock::reversed(24747, "0000046d5e84be89842cd2f74a3d72f3299e63179409c7c14757b7d66ded1132", "8d0b3e7526c05a488a316457869911ddbcbe076ea0725d0731acf221e942b03f"), + MerkleBlock::reversed(24746, "0000024082c1607e22f1300d5df14ae43a7b41ed747c0a8ee4b6bbcccab493d9", "9e33d98eb38e719118539ca93a2b01bf960bab9912230ec389187115dff67a33"), + MerkleBlock::reversed(24745, "000006aa0077df5557c493d7eb81396e7ab10302a09d9fb2021d1eecc0077b08", "a435355c1e467e499d84a961c476252ddf0b866b832ff4ce9076fb891e0c92a1"), + MerkleBlock::reversed(24744, "00000149b4e0da935b7aa97f720ef7e6d49e828880e20d7fcc368923176a8968", "cf0a805bdeba1303ad9bf42102f8e1f6c115a808a30d17468fe491c07d35d598"), + MerkleBlock::reversed(24743, "000000b401b4b4a5174cec59765cbb23fe491ca4b7ae1521ddb32f3425860de2", "fb0e7c8757438e1d743fdf9a9aecdd34e3b8b8b4926e0013b1e619f3281cf955"), + MerkleBlock::reversed(24742, "0000056f246e61d0ce87af62a18bde093a00f782b339bb5708fb75abc3c1d3db", "b05cc74248717f3ca2b86af1c0adbaa136fc1531b6fa4556756457bfe65f25be"), + MerkleBlock::reversed(24741, "0000057c5bd82a630463ee1a6cc591c7b52b352c603d3d8909f6b4fc699fdd2b", "fdb3c89356432dfec8c3f338c04beafb34a10a18ce9bae6bad242e869572083a"), + MerkleBlock::reversed(24740, "000006f2286327b6a2a1270f770609ff027d02180d69d2ad18b63566dfc0515a", "b466f799d1bb83d68a84604e326b94ecd2e7c81f2c5e2484b81fe1c3af242811"), + MerkleBlock::reversed(24739, "000003611f378cd85a09df3bed09f29bb69923a73584ec70830ffdf4d9b25285", "b82c41fdd20e60fd8d4d1d2a20f619c164abe9c79f6aa412183be6305bdb4c09"), + MerkleBlock::reversed(24738, "00000018c1d055316dd10aaba200a40e4b22bfaa2aa4fe946aad9c48dd265a7f", "c4f40a3fb78b45c92e0c277088e11effaa5c82f3e090050c9b62fa118ec21f59"), + MerkleBlock::reversed(24737, "000005b7c527392bcfbdd75b06f0906fe85ec2ee8fe8c1fc08a4f7820e091f90", "19074ed4bb1d8c8c48457a6fd35944e3ed82fe9fb41058ea4d933843a982ab66"), + MerkleBlock::reversed(24736, "00000483b14397ee07d6a6e0ce4caca153c46e24ff9793a472b80be780fde4af", "edca803c70b7448a4a9bbf9a06ecec4f5a9355986bc4690980e3e38edc160a61"), + MerkleBlock::reversed(24735, "000001531ce19a3042757887098225c468a56fe159729d40d9a20e764875a0e2", "77e1a542d4896155ac4eb4046ebcf8c7f5b4c8992b94cf539fba100c4702f730"), + MerkleBlock::reversed(24734, "0000002f47f9cce781cee4169fe7e1a3966fafbe0375f6844d32b1337a91b4a6", "2946f59c0bc5b135a4dee08a182359edfe34ac7058e3b1200706aa3b40d91189"), + MerkleBlock::reversed(24733, "000004e5ea1774456c0c0225dd1bdd8ad0007f4552df456d5148243d6a38359f", "665e1e3efc15062c731180cba3c9346590c22b1e025ba69e63d5738627d69d50"), + MerkleBlock::reversed(24732, "0000022ee8c41b97ed57f95887d5942bdef91728abc8e5aba6ee8fd3b74ab4e3", "b6c3746b47cf2f623a33d9f9f45b9994cdf8a7bb56b90dfe4f8dc72ffaefc88a"), + MerkleBlock::reversed(24731, "0000034aceca60ff1c4136b3d3aba4a875d47b0cb481797b0dbeef9f1125485b", "e009dc1821ef7c066424db510a4fa92ff09287008a791eafa2dd30eaae0b0fb0"), + MerkleBlock::reversed(24730, "00000798b049b80fc751a9d02ce80872dbe54b3798123e47a7726be03a24013f", "23e2bee91da462aff5631ef2d38e61812db9f47e39d3dc9d41638bb9e26f82cc"), + MerkleBlock::reversed(24729, "000000f92ebd1f266b370a27cc8f3426f78153ab3fff492b2088eb92ea6a6243", "4207aec3e7fef47b03c948b56a9aacebf50942a144a60dd1dbdd099fe0b6f7b5"), + MerkleBlock::reversed(24728, "000000d4bfaef03c58066d660a30950705376f55fc9430fda897f1c340c149b9", "88c437101e0c5b74d3da9e602336b5ab5f718ad25e260f4929bfbebf63eb1de1"), + MerkleBlock::reversed(24727, "00000123d0cab60bc8bc0f7748d040090429a3570a55b77e11b032d90578fa95", "386ad0c2a54da863b60ffc5a5aa39f15865d8d63c97d6f332486ea86d5070997"), + MerkleBlock::reversed(24726, "000003258e7acb7c9f8e2d5f8f802a6418dd819388bbc1463360ad9f9505034f", "06205bb387002ecadd7008c111967944dd4c670c4660341089bc39113bbe2839"), + MerkleBlock::reversed(24725, "00000541b0635b6b9bbd8921d4a8fb12cb6633323cda8cac7a84c32dcc79cbdf", "d5b027bc4d5b5e51a058fc1f9790e4305aaf34a90b02bf52f9ad6b1fc48684f4"), + MerkleBlock::reversed(24724, "00000605bee6c4084f4bc1b8e0a0b4565513085df4888fbabb1ff59402cdfe60", "a837a841fd23b1239cc1192f918baa27f17b2c3590861fe1cbf1ed0e7df25e72"), + MerkleBlock::reversed(24723, "000000a42f0395faa6036ec8dbb6f40618d74fbc35b2c343bf03f0d5ab1f108b", "f3e0fd4f5839ac5d7006f151ecb69e3f809f956aa17401dfdaf23b3e562edcfb"), + MerkleBlock::reversed(24722, "00000535556772e86ca1210083a4cb4db74454f4cef914fcc719cdd7d17d8c54", "328d107fab30086071b55204e2c70a6578feaf25c58a9ce908a55c016d5085ac"), + MerkleBlock::reversed(24719, "000005e33e11c29db88a6a59520395c6d74ab06b168434171d51695d32d447e1", "13040668ebf7d3002ca7a8d92c7e900ee30005cf5676fa4bbcbf615f3b9c5468"), + MerkleBlock::reversed(24718, "000005f2268271f37aad0fe7cfb9ce5069d4ea9178d999b3488942c0152dffcb", "4abc6a4044d5fe0b8d78ce110be8b74d0e93ddaf13ac59327b783558943e85b3"), + MerkleBlock::reversed(24717, "00000470f83644a5c08132629c03807cc6682846e2aa5b39959d5f3cd12cf48f", "36e2a661bfd3f2c714f014a17536faa773cda0b69e4c6184d8e3fc5bc4f4447c"), + MerkleBlock::reversed(24716, "000000e70d9b8d5d9b8a6af9b7daa957df3d36f30edf1ef5a59da62eb10e17ae", "c26379382825a2b0e049e4879f8b58418903a3727996efb9cfa06753159ac7b0"), + MerkleBlock::reversed(24715, "0000065d0abb85677e6ab4af484d80f7e90a3cc01fc46c555e3ac8659644d844", "271ef00edcb62830944bc4f8b12f5468d1cd03c6f0fd91c23a5c84fb6a54a84c"), + MerkleBlock::reversed(24714, "000001f6cd40684b33b496fc574facfd81790681ee36088387a364dccb48def3", "48eb977cf38aa34fba9c7b3ef9eccf981f3dd2be79ded257713a069867400c55"), + MerkleBlock::reversed(24713, "0000049522e2a80117de535914d67c7e8904bfc0bbfdca4702d56939c06a8cd1", "dc6aeb6eb686dbb6fe006ad0511f62f19ac6fdf1bfaf2d378ab05227db16c112"), + MerkleBlock::reversed(24711, "0000012e65c0ac8c90b83d42a532b4a7c3774c0cdedfdb74ba64d1637ca4a7fe", "f4ca0168659be3483f4d76b7c6fc1c9b2fa0980e647b62edb4ea90bad0574401"), + MerkleBlock::reversed(24710, "0000007f70b2ea36d666379e731f7ecff79db6ec9838d39d24af693756608242", "10c48ab606cf8d9df59a189d2f8854b11c0eb0d31133a72bc6a48b7ee9c387e8"), + MerkleBlock::reversed(24709, "00000098ef907dedce9eaf2132cf67545a0f746e6316c698f35bcefbc5ead111", "214fdc442396bb4237f7f685321be9019c5af999e322bb2c65ce407c0541946a"), + MerkleBlock::reversed(24708, "00000672106963c28e4ae06d0e0491bdaf1aabd4ea3a0759a65261e231d6aa2c", "1edc0d86c37dcdf052a906ea97e845e6fe5b44b60e10e56297186b53f89773fa"), + MerkleBlock::reversed(24707, "000000fa70d8d7cba9ebbf96c297e22cebd58ab8d7e1da8fe801606701237610", "805000906a3d51ac46798c7f705e05677a9a9d1f4a7ffb8aaab534287427400b"), + MerkleBlock::reversed(24706, "000005b33952dfbb9e9c936503c1f474df369bb7807adf95909b37d316e9052d", "915cf5e4625e7f7af51f736906f11516167dd181ef9043bd79790eac7f54a183"), + MerkleBlock::reversed(24705, "0000028acaa3b4fcc3eb0e9295a3a9a0b395ef464507a9af5bc51cd2b04b38e5", "f14f86f7659787743da8ab9640e0032349a49cca51a55a2cb7f056db71ae2474"), + MerkleBlock::reversed(24704, "00000553a90aab22049b035f06cd4740d4c283c3b7daef5bfe8246b776e5d0a6", "87c7b4250747991b0a426d29df0a0a5c24ad315fcd0dad30e92d89aa78658a7f"), + MerkleBlock::reversed(24703, "00000015443346b5aaaf59fb71694428399183a0da3d23a36ba62ef6f868d65b", "a3fd7bfbd3fee3d24599b79286949ca533a5b8b8444c52b52ef8db84d412dbdf"), + MerkleBlock::reversed(24702, "00000524346a800cb8b841e79a429803f06daa25dda27c4e15529711dd026485", "0b93ecff8e8cb7b9f6ee8b04f9847ff58dd5942c9febbb471f6b5cf8d90621eb"), + MerkleBlock::reversed(24701, "000001ade388c5280e9c0abc025d860f4b134d78f5f894910966ef58d79eb6c3", "a72758cf7ccb75d0798bf0284bee2e2c09c9703c67a828425c70510275242be2"), + MerkleBlock::reversed(24700, "000004970192dd41d3afe3c809b8cb150c8210a6cd41360ecc504f8e765a14b5", "ec3603f979e4567d5de6e6720ae213f5c61fd89b2eb3b35ab58dbde3d2975461"), + MerkleBlock::reversed(24699, "000002be5a953f7fed9e4be3361df036a07676fff669f3fae721c1cfdeaa12ba", "854902335e3f9925a489da28b4e03ee6b13889323b86ac29199d27510470420a"), + MerkleBlock::reversed(24698, "000005ec3a5ed58b575c0dcea597b0bae984f9642cdbb745c2a4acf92b1228e8", "0a6de1ebaf8d6f5939cff888a90c1c9e9719c505f5a065937f45db49d228de26"), + MerkleBlock::reversed(24697, "000004416dc20703d3aa5f017d7cfb96f1f030c06dafad3b0c45414e7b84847c", "02893469abc44cf760eb93652a4d14bc9068aea36e6a257d2c22586f4b19cb43"), + MerkleBlock::reversed(24696, "000005cf0f4caba6b236341afb3e7f8beacb8018364136c198e6db485f131e14", "f00ef2bac46bd56bb5fdc3a92401c5aeabd2ca5768fc160d5546a09ba6938b17"), + MerkleBlock::reversed(24695, "00000487243de854c402ef3026822e4b33cb23f3526275e931d00589697c7b11", "11b5d83a01175ef00e457e2c88b5676cb771378edc196e769f8a3d908dc51db0"), + MerkleBlock::reversed(24694, "0000040fd0c77eb035c04daa054de7df0a330bdd767a2b9f40929fff4b631ca9", "fd3c2105bf11754a8b61951ad9c1fe8620d9bc806fa88d7ef108af2faf57f415"), + MerkleBlock::reversed(24693, "00000212c4234717534cf9b4351dcde432eebeeac2231cd04d1a1f470710e72d", "6ce77c3fcf9604c893f1308a90a2fb6cea90be8c74e595dc71cee56edf27f914"), + MerkleBlock::reversed(24692, "0000037372e681ae0013faa6f509043940f39345f6fc2c9d69bfb26a92d4d3a7", "29cbb16ac8bbd849a49c36ea89cfb6e301d3ecea23b6ce4eed02dd0c8f44c6fb"), + MerkleBlock::reversed(24691, "0000000c03ffa98e5ba1c1fe1441c4812a91746aefda9b6d150ed08242d4821b", "77e5d6f84c44c054830621c67d5401f9d678d88a783b6106d8eb4578aa58020a"), + MerkleBlock::reversed(24690, "000000602033c5a0c32421f3adcb3de7189931a633e98047b38ba6717f242740", "37d6724e05f33571e78f96a97efa65f3b5006e9e0302e19f6cf6da87291c5b83"), + MerkleBlock::reversed(24689, "00000362c6b66c7054dbdbab81c79e263472b1cea6b0a3e455716fcf328f8e58", "fea27119c993c72526432dcabd8994fe41b3b0f2f0132621310ae3cb2ca0631d"), + MerkleBlock::reversed(24688, "0000002fbb3e6eb53ec3174f2071db442dac5ffe82794cc5b0498fbac080f8da", "69cacb471ae2813cf45987cabf36a59d65e845b7b041dd488a9b5ba6ef5ff03b"), + MerkleBlock::reversed(24687, "000002177c627bdcaf2e95791166c9641bf02fdd5cc1d4a85ca20aa25acdd107", "9e126d96a5fe6d73ade44c5d3d78184462bee4c88e9818c8dd8e924d4bc16195"), + MerkleBlock::reversed(24686, "000001019891cb0eb860698cca78b8a17fae795c0798c437a0989896bb02c353", "bf593a2283bf6da71cb8226341dca164cf0487433403821bcc7ae730b916eb94"), + MerkleBlock::reversed(24685, "0000013f4ea9f6aebc88a59d1fa8631f46eff2e18e54b4ae9d284d1e640d7fea", "2edb60ad3b3cd55c337c5581cbe7b2beb9fb32f3bde5ba01f5f318ee835a4089"), + MerkleBlock::reversed(24684, "000006c99c58dbec27e6435cd4a1552007c55afec8af797c1435196a3c622aee", "92c4d264369a41a886a185108f3ef02463fccc088b2d0a993dd0ef13366c7d5a"), + MerkleBlock::reversed(24683, "000007e05572b439fc0a21ce64981b82669d34d73144344b80e2fccbaae85687", "10bd9b03ea231098959ad01bcf7e39bfb30e62a8edc8311f87be49d3f589b78d"), + MerkleBlock::reversed(24682, "000001be22b6a741824b01cca475101002e0f1457f024d439ea5ee0a1aada27f", "4c86015f0859abc0ee367c66c4de0e0a6b3a5fef87af890770ebd95f0aebeba0"), + MerkleBlock::reversed(24681, "0000001072bcf507e848486e5ff320c1522f887b158ba6e4303b3ceddd4762a8", "c367cd0b8812bac0076cc6d09751ffba418f69dd6e77c18dfda883ec8faed411"), + MerkleBlock::reversed(24680, "0000035731fd748b408aed499c9c4b45628e9338270a96fabcfe763f7b6e54ed", "e0f1cfb22cb14e932dce207416f5ecdf3ec99d0933cde16c90af24939606ceed"), + MerkleBlock::reversed(24679, "000006501d187ea8b178cd4b6d0aff146dd478609487bd889a693ebe76d27b09", "9650825a23523c0d5db69c15193d2c22514a447024a1010a8d26e8fc8fcb1216"), + MerkleBlock::reversed(24678, "000000b48edc5982b7986c89ddb7a3046fce5418a3bff0c40b9c208b768dcc90", "e3abd322716b7211f7c730d14dc9be77aa76b56f9ddb1a5b18fc57b202040ca7"), + MerkleBlock::reversed(24677, "0000040798a6b4632f2a9dd0f2a07523affae1bb4ab547598bb972d76fa19c8c", "3f23f56d6beeae1c6647f0c1dc7ac0522611e247c2ea3afdb31954b07d69deee"), + MerkleBlock::reversed(24676, "000003a5ef3d13b8f452e41fe4a45156d512c295d094e6ea352543b2280929b4", "da11d7d1db998c2685d44092943499cede70f4d5c1bdd546326385181f36a5d0"), + MerkleBlock::reversed(24675, "0000068ad662037d30811d86dac5b50ac0ee104afa0775b7b5be6e89ace77929", "8b4c7644283cb143585f9ddfca36598bd2b0a7dbd538c879b0091d0ecad9335b"), + MerkleBlock::reversed(24674, "000001fcac0d415ee0fec9b164a5c0d3baf7fcc01cefd8f55ae1cbaf4edc557a", "d801948eaf709e97eaf071ecc723c675483e674abfe68963d61350bb893dfdd3"), + MerkleBlock::reversed(24671, "00000439528d740502cfb49d869ea9e24d2a13ec9b4dbec666923aed9a74d52f", "d26a3242d276db7633aaa7d9b90927773364cde8b9d066003d42cea6211767f7"), + MerkleBlock::reversed(24670, "000004404897d33d867d3804df92ceffaccddf2fbde381800461ea3b88d89d30", "f0aea4033ad17837fd709be4ff01b5714b5d5faff1d684aa7ba57fad062aacd2"), + MerkleBlock::reversed(24669, "000009b14dec4bc7ba636de6ae25db8bde066f132b2fa96d9c4fa29ed1b6b82f", "89f31946adca397478aac8c8fca16325036a1b58697c8235611ce7a3d7ea543b"), + MerkleBlock::reversed(24668, "000005c6ec5a786816157f38b3e721529f6bac1d4a9e20bbc6119d1f44b38ddf", "ea2c7197551e3fcc6379fb0f828b251827005cdf09421c9b533eb6633c13c447"), + MerkleBlock::reversed(24667, "0000057e45e1a7176be2b0489956d83a1044e5e842097e353cd5ebae7f1a51d3", "9ee5aace19c67bc9149860b96166f62b056b99cd8ad4649ff68d749122be62fe"), + MerkleBlock::reversed(24666, "0000022e51809198d0ecf3fc49eb4706f9cd09b6ade82c9b87923cda2e5301fa", "d066614dd7466b66dc840baf48d3512f3b5c3d90a762d07cc83d16640553be1c"), + MerkleBlock::reversed(24665, "00000854e9d76d2507226e86af114dc3572206011d850843a40c1d3fea0860fc", "0838d17bf44b280dae9beb09c8a21c0a7f362d11cd5781f890d24077fc47054c"), + ] +} + +#[test] +fn processor_devnet_333() { + assert_diff_chain( + ChainType::DevNet(DevnetType::Devnet333), + &[], + &["QRINFO_1_21976__70221.dat"], + Some(init_devnet_333_block_store()), + false + ); +} + +fn devnet_333_height(hash: &str) -> u32 { + match hash { + "0000086ccc192b07450acf188eba3d0360058dd43793fc622e0b7744cad5cbed" => 24869, + "000003227cf2f83a1faa683ece5b875abeb555ebf1252f62cb28a96d459bcc11" => 24868, + "000003bd988f78d4663780b467dc6155f5c1641c16a2d0a09cf62eeaaf9ffb39" => 24867, + "0000091ffc39c9891a425b7eacb051c026d8e6ab4a86f074b6961f7c4a0ea87c" => 24866, + "000008804a2cc065da4752c7f6f4b889c682749997bf24c704ab44e932ae0f6b" => 24865, + "00000aa4e53ca2059b645787d4516dc75f1289708d2a2d3f6b103d171821647b" => 24864, + "00003130c6ba235a12bf1057c459268ad10924a47d9b34eddc57858d77f72ddb" => 24863, + "000000b5f4669ac2ebda3607fa627df62656650ee689a8c82705f340ec3d78ea" => 24862, + "00000692fc267184a6ab60ed6af6a55cdf527773872c601f098569c254f2d189" => 24861, + "000007991952ca7c32420cd92654ecc41d5716c191cc96cb8978ea3257a69992" => 24856, + "0000037bbcd8e2af574fff36fd248d2058b3a9582c9a9c3fc6ab1dcee69c25e5" => 24808, + "000004f78ebfe17c2e78c58ca1e754e02f3e52043bea00f63be7f2cd58d23c96" => 24760, + "00000597b3da0bdb229b571bfcebb78a5786c9bc21d3fb3253d497b8a62e5d99" => 24712, + "0000078bc1a0778aa6d8dbefde4f110eee570c1b945c553b9ed98368871d6b5b" => 24664, + "0000062c4e24e761dc2d1b9b6d1588198b3f4ad8a767151ef6414bfe87ec94da" => 24816, + "000000e3756fb54df8e63db7c69158a88247ae6fb951602fececa314820a644c" => 24817, + "000000461e6f7b4d5656173bf188e83bee5f10d971616d946db3027cbecfa13f" => 24625, + "0000037bd6d0b218eb906ab6206fde5a96f972ede0308bf76cac4190428a924d" => 24624, + "000007756da9e48ef99829c467379e3a873ec9bf90652a9d10483329ef4e222c" => 24672, + "0000018ed9cd191989b356447ad4d0649d5c471e1661a79aab2613251cf991a7" => 24673, + "000004413ed62592b7a47b06a296ecb79dfcf5e65227a3e93713b36c48846f6a" => 24721, + "0000050c3da50cc911506eb4bfb50e7b1f1ac0d165eb62f239a48545cc5834c1" => 24720, + "0000010f2aabcceddff97f4f87987902f99629518dfdcdf5522e7e159b78a825" => 24769, + "000000426666e40ff602a896a1493b765daa6fd6667f7c5edd0cfd7c23857750" => 24768, + "000000b693fbd6d2a02da459158394220f83a4cdb947117246c83a65c9296bf1" => 24860, + "00000683d6d9d7df1b530eecd973fd71aac2434687cdf94b02a959237b41b123" => 24859, + "0000052e1a801d4313cd6a90beed7f478f34b778c2a8cb0e8b98dbcf83c5efbc" => 24858, + "0000076bffe00bf97fa0baa71c1444f5e3270cd0ada2423f1c77858b95d19338" => 24857, + "00000763996b273b8f8fd4b184e0175679bae5bd176d021efd71d4d598e0a184" => 24855, + "00000088430da03d58df458cb0118dfb7a5583241718c8cbb1b02f7eee673463" => 24854, + "000006fe4eb832348f5abbd7d7fe5653068dd20ca58e05bec321f486a9fe5eb1" => 24853, + "0000018db2f6d303edcdd6ded823acc31bfa50f08389111b4f90ca4cc753006d" => 24852, + "000002f575aa919a482ec157c9c3614057078bdf99da797305c9c7f549a9c677" => 24851, + "000002dd2d2977ff6fa6765954919dd816b96671d4c8d5d0752f5e4efc48f8bf" => 24850, + "000004574333f4fcbbf989299a298c53b89718aa10c169c32db07c18c14a33ad" => 24849, + "0000053f364c7ff258ff87185de4c789420372d9bd76f37dbdc57d5b3d1992c0" => 24848, + "000001e2680c8f337c3a6d81f7b72e67836dd64a6cbbaf13875a0a72976282e3" => 24847, + "0000030d4554e01211b54c9041f7a257ec83f9079a1913eda923bdad11f08670" => 24846, + "0000045348e3cef51ae93a68a09e56eab3a08f339ab62b196709f83bc97c6936" => 24845, + "0000040777831dcff5ffb3e3c0bd38a008a6d4456c06e320386004fa68a49e7e" => 24844, + "0000027e119d72c5dda56cf39223b35f232092495996345be248eeb48c9f9130" => 24843, + "000000baa4a33d65e11107122a92601053ab4e716a6d661dfd6bb9f874188413" => 24842, + "00000645381ff1106e135a9d5df3cec8edfafce71c182325d4b75099d4002c4d" => 24841, + "00000056c854b1996beec75c464693bed7a958e9b67d71d701340b8ff6d9e054" => 24840, + "0000027aa1d0102ddacd2f9dde2681ceaf0b5c0caa806cb7f816c119051464e6" => 24839, + "000006437989e53e813df1a8aa388096387ee5de9cd0b045779a703582e7949e" => 24838, + "00004cbd92d058ad559d6cbb2d973e3e199015826eeab9691cb718ba349b0f70" => 24837, + "000000885cf1eaa6b419152fc651e0119d57281f18a6ae3806dbd4fcfb5cad25" => 24836, + "0000049f89a5dac8c9593c601f9a385440ee050abe8cf5f039a3d59c58f06249" => 24835, + "00000104885a2403d15e65e25daf9f78c755c2953945914f58e6328c9dd50c4d" => 24834, + "00000795888b51da4cfe848adfcdff19cfc815c1865c58e2200ea9ad596df9e9" => 24833, + "000004169e45af9fd4ddaa64c400758df7cf36b0c1a22f2b9f29a11fdea70eba" => 24832, + "00000743fc8bde3da9911bbd5275e2e2a68afed8ce1d56b73ed8557528a4fb45" => 24831, + "000003e8049e2baee08e173a04106df0c4b0f858f8ae1918caf970eb10d2046a" => 24830, + "00000169672fae75e70f45a7031bffbdc92fb81d183d0324f39eac9268d11ceb" => 24829, + "0000082b9da7946ea66dfa9c6ca9765a41219a049129248e4c5656f9bdd8aab6" => 24828, + "000001249c80a3899d72096a03195ebfb96b27118559094e149fcdee18017458" => 24827, + "0000002d7fc5efaf7d8799e6418f2cf0eda1e9dabc9771366ea66c5e09dae7cf" => 24826, + "0000051ee159b9aa029497f509e3c92bfa03737974444d04bbc940cc8a901bab" => 24825, + "000008076d72be61be309f5a8e531eb5a85405f4ee75125a1b3556774b5848d2" => 24824, + "000006cba36bb9086be9ac34b03d0bb2379ccbf9af7cd17da4f2450dc9f7006c" => 24823, + "000004c5b1b7e1bdf532e1318154cf2ebe387b5b9ded7c748b75856003a43371" => 24822, + "0000066acb91115887007ecbd8d82eb4f4c32c0270552fe8b2f32e48213575f9" => 24821, + "0000006dc4fc61cdef4df41ee9b7f49fe17eff54a66f3a3a88bed959388a5434" => 24820, + "00000178548ba2f34bd307781683b0f97ac31ccdd9b1b22e148c59211567c407" => 24819, + "000005e3612dd20b3bce4ea865eb39045fff1f8937301f9a1db3654d1a98ff80" => 24818, + "000008ab4c5a522743760f8ef14089c352b0f7b1013cd7ba7392c96e497afe85" => 24815, + "0000049c9e3d99ae33ce5d71e7e3974d8be8d87e65f66f5d36f200f482eb89a3" => 24814, + "000006799bc165a2d527f3f980c919863cd3a78dcf3fd201f57bdd6c27ff7af2" => 24813, + "000008822d1b4327327d2477ed48157ab739f5631451f59e669f65da6b4d99d0" => 24812, + "000005cbfa02e404973f41eccae792d8394f35089a39ae4f4242e61fc3110dc4" => 24811, + "000000c25bf5d29876879fd5664efecf5dbe6b889756b0413a7e9a7e14b63894" => 24810, + "000001c6e2988ef3d42b7fe817481eded236109b1ecab23bde43710cd0b82890" => 24809, + "00000043a23d0bbcd576eb8c39b194e9ee5364ed47645dd4917bb45d06768777" => 24807, + "0000002c7dabf7c52be36c77728fc2a1111f0caa9d167e4930c954540c3aa142" => 24806, + "00000213354b423e60b5e4e3da96a57658fae6451078b4301eb7fc96d286c346" => 24805, + "000006acdb4419d876c00a195f16edf1b5732ef6c26e651ae9f2f3c2b8964a3a" => 24804, + "000002a9757ea470f4d6341cec13cc12ae8e7940bc401b36b22a1a44d39cd7ec" => 24803, + "0000042837f5359d0b4d72b88a90e782afe782afbec03fbe54c7f06ef91e0fd4" => 24802, + "000003de21b33156e7d94b1408fc9ef753f7cc9bfce52fe6ef2def3c2184a00a" => 24801, + "000000f63595d3c80a44ff104b19828bd7f337027dc064cd179e2eb5e5e8db56" => 24800, + "000006ac1f34ea47d2db12fa1c8dd765190ab4c5c8329baf12c6a8ba5fc42dbb" => 24799, + "00000401fc8d3cfd75086cc67b73a32d7978877e1726ad9949bbe67dc4d46840" => 24798, + "0000027b6ceb8c45d444005a6b948ced264c8fc39fb412dc69389ac63fee668e" => 24797, + "000003f23b070d2734940dcc2682517883b6f5d3189c34b5dff4742153ec64ab" => 24796, + "000002640f8273af03475f6ee496f80700b12980bc4fb059f734e6183377b078" => 24795, + "00000005cb3272a005d40b45caa1cdeaba2651d619cbd6196f2c6c6317c8917d" => 24794, + "00002b2c169c551e051fe563eec39734ef89eedee4d65f8a2c0074280418c8fb" => 24793, + "000001f0718c066dd865f72836254d6e9b217f49ed4e08b89bb8e7ff3b3aa6af" => 24792, + "00000156030a46774d864bc346009cdafb47b9ea30a1ddfb5ad5ef5bcc8e0cf9" => 24791, + "000003799100d36e4f1eae601ee81df2f02ffeba59d3f29a7db43c2b7568d481" => 24790, + "0000047213ccf1910fe90f8b8ced3e8a2e3a9c1bc93ebf4103f250dde548e470" => 24789, + "000003e3515c438775628e49dd61701a8327005566c2b88407d9afb59244092c" => 24788, + "000002563aa47ebb2189f33735f698231161c5df29627e36c01dcbf0a6a2315e" => 24787, + "000003c7f4624196872c229be62947dd0004e09571fb1b8c0625fda088873e5c" => 24786, + "000002c6cc3fc915987a1c89f295e969db682abad30b7143c66df3d020c81aa6" => 24785, + "000001a0000cf3979494e1451bbb2e5b8e5364c003d69b07e33fc9a4a42afe49" => 24784, + "0000051f34bb857fb33424cb780e066cfdd565c64714048d42b84d2ce64e0b87" => 24783, + "0000046900a9d9478e84fa09702fa98e734ade9416f43229969c03d499e2b827" => 24782, + "0000020466a6a3f34b7edf6e7a56950992eb43e4f46babce3c8e7a1f027932cd" => 24781, + "0000008ea4a9398eeaa5ee996129f6d58f3ee6eb36ad48b39dcfafd491b72698" => 24780, + "0000023b916ba5f3cc323065f8673c6648cae692a97cb84ae052d372e2ad1fdc" => 24779, + "00000128469a850ff260fab8d71cec4ae08953f53adc769b0e4510c64cd5b1ae" => 24778, + "00000329f84bfad3889f8e37a6e5f532547a73840428b36a875423aa3f781922" => 24777, + "00000039433505249e61dcea66c0f3075ac384cf216970149d2e7f149f031ac7" => 24776, + "000003c944684f4df6d0e9df65bd0ff45db24279400c977ad1ddd095d3d26a20" => 24775, + "0000050ef9d0c1e6e6d1506dfc9a93c87b49adc40d3f266f168726a987cbb16a" => 24774, + "000000457cb432ced5fb2ea78d36ccb2744d22c1a4aace36ecd8e603325282fc" => 24773, + "000004c958970f8db6169284b8fc0a48624964e38a1da4260a528855c549ffd0" => 24772, + "0000028a421d2f116e56ac5da67217e942fdc5d783d05f2b0ec08aaa98a4af1c" => 24771, + "000001b392b1b5e29cb334a6c7d9baf85e8468fc9d5ac2860c2ed4dfa8affb3d" => 24770, + "000003a2b3a849971822edc9505114e61704a58db8ebae14c78bd0fa9184f519" => 24767, + "00000081a650f7953b6f6e704b14b142e06972a3fdd86ebf5327820adce8a6f4" => 24766, + "0000004b32f5cc9512ca0bd2f96f84a29b975c879ea050c7309c9321cd76d67e" => 24765, + "000003367801e71b6bfe4ca3e277603f2f9091caf80be7bd697b2e7d8b2fa091" => 24764, + "00000555ea65e4120624c4c8699af9ea3c91a3f8e42095192397fbdf6774f02a" => 24763, + "0000016c4f0f1cb3ebd8f2b2adb53347a3c69fae7c0854b4ea41a1d4c8af7d6c" => 24762, + "0000028655333153a9e4262170b8acfda4a2dec64dd387b2033dc0a075eed242" => 24761, + "000001c7704486626aec884fe851b5b54326825dd56d56d09f03beb2a576ae09" => 24759, + "000004db5d642d4a869ce8100ac5154658c06b9ef0b9e6b9957139529884b79c" => 24758, + "00000495b214d71655cc24f56bf9aab7d2ab286857e6f9890f1ae639c357b69e" => 24757, + "0000029d66a078af9d234a430f0cf8580ee0aac264fc91e25b6e379836f64aa2" => 24756, + "00000319ef4c483b432a52e103a5fbaf72cb2cb03238793982455386f223b5f4" => 24755, + "000000a5cd94be2be2764cb5e3eebb1c4aa24b0bab289ba4bdf032cb5c4511a4" => 24754, + "000003a4acaf2de030463272ce372a6d38973bc4d3ec9abaecd88fb242095c6b" => 24753, + "000000b13d3a5e352c02e26fbbc0c5a19c630ffaba54177c3074b08311c334a5" => 24752, + "00000306d57c64e4ea982061c855b4ec7830836e9779d45460d96b7bbeb58ee9" => 24751, + "0000046a30db2347c925c399ab3d08e95f134545a1b4f559c970db585b7a2a2b" => 24750, + "00000002a9013220364222bb38dbfb6fa1a53177524d9e0de1d243b34ebfc136" => 24749, + "0000004c90e593866678aa4cba5211019e02e922ff7180fa3f152b20aeee589e" => 24748, + "0000046d5e84be89842cd2f74a3d72f3299e63179409c7c14757b7d66ded1132" => 24747, + "0000024082c1607e22f1300d5df14ae43a7b41ed747c0a8ee4b6bbcccab493d9" => 24746, + "000006aa0077df5557c493d7eb81396e7ab10302a09d9fb2021d1eecc0077b08" => 24745, + "00000149b4e0da935b7aa97f720ef7e6d49e828880e20d7fcc368923176a8968" => 24744, + "000000b401b4b4a5174cec59765cbb23fe491ca4b7ae1521ddb32f3425860de2" => 24743, + "0000056f246e61d0ce87af62a18bde093a00f782b339bb5708fb75abc3c1d3db" => 24742, + "0000057c5bd82a630463ee1a6cc591c7b52b352c603d3d8909f6b4fc699fdd2b" => 24741, + "000006f2286327b6a2a1270f770609ff027d02180d69d2ad18b63566dfc0515a" => 24740, + "000003611f378cd85a09df3bed09f29bb69923a73584ec70830ffdf4d9b25285" => 24739, + "00000018c1d055316dd10aaba200a40e4b22bfaa2aa4fe946aad9c48dd265a7f" => 24738, + "000005b7c527392bcfbdd75b06f0906fe85ec2ee8fe8c1fc08a4f7820e091f90" => 24737, + "00000483b14397ee07d6a6e0ce4caca153c46e24ff9793a472b80be780fde4af" => 24736, + "000001531ce19a3042757887098225c468a56fe159729d40d9a20e764875a0e2" => 24735, + "0000002f47f9cce781cee4169fe7e1a3966fafbe0375f6844d32b1337a91b4a6" => 24734, + "000004e5ea1774456c0c0225dd1bdd8ad0007f4552df456d5148243d6a38359f" => 24733, + "0000022ee8c41b97ed57f95887d5942bdef91728abc8e5aba6ee8fd3b74ab4e3" => 24732, + "0000034aceca60ff1c4136b3d3aba4a875d47b0cb481797b0dbeef9f1125485b" => 24731, + "00000798b049b80fc751a9d02ce80872dbe54b3798123e47a7726be03a24013f" => 24730, + "000000f92ebd1f266b370a27cc8f3426f78153ab3fff492b2088eb92ea6a6243" => 24729, + "000000d4bfaef03c58066d660a30950705376f55fc9430fda897f1c340c149b9" => 24728, + "00000123d0cab60bc8bc0f7748d040090429a3570a55b77e11b032d90578fa95" => 24727, + "000003258e7acb7c9f8e2d5f8f802a6418dd819388bbc1463360ad9f9505034f" => 24726, + "00000541b0635b6b9bbd8921d4a8fb12cb6633323cda8cac7a84c32dcc79cbdf" => 24725, + "00000605bee6c4084f4bc1b8e0a0b4565513085df4888fbabb1ff59402cdfe60" => 24724, + "000000a42f0395faa6036ec8dbb6f40618d74fbc35b2c343bf03f0d5ab1f108b" => 24723, + "00000535556772e86ca1210083a4cb4db74454f4cef914fcc719cdd7d17d8c54" => 24722, + "000005e33e11c29db88a6a59520395c6d74ab06b168434171d51695d32d447e1" => 24719, + "000005f2268271f37aad0fe7cfb9ce5069d4ea9178d999b3488942c0152dffcb" => 24718, + "00000470f83644a5c08132629c03807cc6682846e2aa5b39959d5f3cd12cf48f" => 24717, + "000000e70d9b8d5d9b8a6af9b7daa957df3d36f30edf1ef5a59da62eb10e17ae" => 24716, + "0000065d0abb85677e6ab4af484d80f7e90a3cc01fc46c555e3ac8659644d844" => 24715, + "000001f6cd40684b33b496fc574facfd81790681ee36088387a364dccb48def3" => 24714, + "0000049522e2a80117de535914d67c7e8904bfc0bbfdca4702d56939c06a8cd1" => 24713, + "0000012e65c0ac8c90b83d42a532b4a7c3774c0cdedfdb74ba64d1637ca4a7fe" => 24711, + "0000007f70b2ea36d666379e731f7ecff79db6ec9838d39d24af693756608242" => 24710, + "00000098ef907dedce9eaf2132cf67545a0f746e6316c698f35bcefbc5ead111" => 24709, + "00000672106963c28e4ae06d0e0491bdaf1aabd4ea3a0759a65261e231d6aa2c" => 24708, + "000000fa70d8d7cba9ebbf96c297e22cebd58ab8d7e1da8fe801606701237610" => 24707, + "000005b33952dfbb9e9c936503c1f474df369bb7807adf95909b37d316e9052d" => 24706, + "0000028acaa3b4fcc3eb0e9295a3a9a0b395ef464507a9af5bc51cd2b04b38e5" => 24705, + "00000553a90aab22049b035f06cd4740d4c283c3b7daef5bfe8246b776e5d0a6" => 24704, + "00000015443346b5aaaf59fb71694428399183a0da3d23a36ba62ef6f868d65b" => 24703, + "00000524346a800cb8b841e79a429803f06daa25dda27c4e15529711dd026485" => 24702, + "000001ade388c5280e9c0abc025d860f4b134d78f5f894910966ef58d79eb6c3" => 24701, + "000004970192dd41d3afe3c809b8cb150c8210a6cd41360ecc504f8e765a14b5" => 24700, + "000002be5a953f7fed9e4be3361df036a07676fff669f3fae721c1cfdeaa12ba" => 24699, + "000005ec3a5ed58b575c0dcea597b0bae984f9642cdbb745c2a4acf92b1228e8" => 24698, + "000004416dc20703d3aa5f017d7cfb96f1f030c06dafad3b0c45414e7b84847c" => 24697, + "000005cf0f4caba6b236341afb3e7f8beacb8018364136c198e6db485f131e14" => 24696, + "00000487243de854c402ef3026822e4b33cb23f3526275e931d00589697c7b11" => 24695, + "0000040fd0c77eb035c04daa054de7df0a330bdd767a2b9f40929fff4b631ca9" => 24694, + "00000212c4234717534cf9b4351dcde432eebeeac2231cd04d1a1f470710e72d" => 24693, + "0000037372e681ae0013faa6f509043940f39345f6fc2c9d69bfb26a92d4d3a7" => 24692, + "0000000c03ffa98e5ba1c1fe1441c4812a91746aefda9b6d150ed08242d4821b" => 24691, + "000000602033c5a0c32421f3adcb3de7189931a633e98047b38ba6717f242740" => 24690, + "00000362c6b66c7054dbdbab81c79e263472b1cea6b0a3e455716fcf328f8e58" => 24689, + "0000002fbb3e6eb53ec3174f2071db442dac5ffe82794cc5b0498fbac080f8da" => 24688, + "000002177c627bdcaf2e95791166c9641bf02fdd5cc1d4a85ca20aa25acdd107" => 24687, + "000001019891cb0eb860698cca78b8a17fae795c0798c437a0989896bb02c353" => 24686, + "0000013f4ea9f6aebc88a59d1fa8631f46eff2e18e54b4ae9d284d1e640d7fea" => 24685, + "000006c99c58dbec27e6435cd4a1552007c55afec8af797c1435196a3c622aee" => 24684, + "000007e05572b439fc0a21ce64981b82669d34d73144344b80e2fccbaae85687" => 24683, + "000001be22b6a741824b01cca475101002e0f1457f024d439ea5ee0a1aada27f" => 24682, + "0000001072bcf507e848486e5ff320c1522f887b158ba6e4303b3ceddd4762a8" => 24681, + "0000035731fd748b408aed499c9c4b45628e9338270a96fabcfe763f7b6e54ed" => 24680, + "000006501d187ea8b178cd4b6d0aff146dd478609487bd889a693ebe76d27b09" => 24679, + "000000b48edc5982b7986c89ddb7a3046fce5418a3bff0c40b9c208b768dcc90" => 24678, + "0000040798a6b4632f2a9dd0f2a07523affae1bb4ab547598bb972d76fa19c8c" => 24677, + "000003a5ef3d13b8f452e41fe4a45156d512c295d094e6ea352543b2280929b4" => 24676, + "0000068ad662037d30811d86dac5b50ac0ee104afa0775b7b5be6e89ace77929" => 24675, + "000001fcac0d415ee0fec9b164a5c0d3baf7fcc01cefd8f55ae1cbaf4edc557a" => 24674, + "00000439528d740502cfb49d869ea9e24d2a13ec9b4dbec666923aed9a74d52f" => 24671, + "000004404897d33d867d3804df92ceffaccddf2fbde381800461ea3b88d89d30" => 24670, + "000009b14dec4bc7ba636de6ae25db8bde066f132b2fa96d9c4fa29ed1b6b82f" => 24669, + "000005c6ec5a786816157f38b3e721529f6bac1d4a9e20bbc6119d1f44b38ddf" => 24668, + "0000057e45e1a7176be2b0489956d83a1044e5e842097e353cd5ebae7f1a51d3" => 24667, + "0000022e51809198d0ecf3fc49eb4706f9cd09b6ade82c9b87923cda2e5301fa" => 24666, + "00000854e9d76d2507226e86af114dc3572206011d850843a40c1d3fea0860fc" => 24665, + // "000008ca1832a4baf228eb1553c03d3a2c8e02399550dd6ea8d65cec3ef23d2e" => 0, + "000009ab6ebbf37176dd95a82f3f66d9ef24e8108dfe7874fdf2adee3dcab7c9" => 0, + _ => u32::MAX, + } +} +#[test] +fn test_processor_devnet_333_2() { + let chain = ChainType::DevNet(DevnetType::Devnet333); + let context = Arc::new(FFIContext::create_default_context_and_cache(chain.clone(), false)); + let provider = FFICoreProvider { + context: Arc::into_raw(context.clone()) as *const std::ffi::c_void, + chain_type: chain.clone(), + get_block_height_by_hash: Arc::new(|context, block_hash| { + devnet_333_height(block_hash.reversed().to_lower_hex_string().as_str()) + }), + get_block_hash_by_height: Arc::new(move |context, h| unsafe { + let context = Arc::from_raw(context as *const FFIContext); + let result = context.block_for_height(h) + .map(MBlock::from) + .map(|b| b.hash) + .ok_or(CoreProviderError::NullResult); + + + std::mem::forget(context); + result.ok() + }), + get_cl_signature_by_block_hash: Arc::new(move |context, block_hash| unsafe { + let context = Arc::from_raw(context as *const FFIContext); + let result = context.cl_signature_by_block_hash(&block_hash) + .map(BLSSignature::from) + .ok_or(CoreProviderError::NullResult(format!("No clsig for block hash {}", block_hash.to_lower_hex_string()))); + std::mem::forget(context); + result + }), + update_address_usage_of_masternodes: Arc::new(|context, modified_masternodes| {}), + issue_with_masternode_list_from_peer: Arc::new(|context, is_dip24, peer| {}), + notify_sync_state: Arc::new(|context, state| {}), + }; + let provider_arc = Arc::new(provider); + // let cache = Arc::new(MasternodeProcessorCache::new(provider_arc.clone())); + let chain_id = chain.identifier(); + let mut processor = MasternodeProcessor::new(provider_arc, Network::from(chain)); + let message = load_message(chain_id.clone(), "mnlistdiff--1-25480.dat"); + let (base_block_hash, block_hash) = processor.process_mn_list_diff_result_from_message(&message, None, true).expect(""); + let message = load_message(chain_id, "qrinfo--1-24868.dat"); + let missed_hashes = processor.process_qr_info_result_from_message(&message, true).expect(""); + // .expect("Failed to process qr info"); + // let result = process_qr_info(&processor, &chain.load_message("qrinfo--1-24868.dat"), false, 70221, true, context.cache).unwrap(); + // assert!(result.result_at_h.is_valid(), "Invalid result at h"); + // assert!(result.result_at_h_c.is_valid(), "Invalid result at h"); + // assert!(result.result_at_h_2c.is_valid(), "Invalid result at h"); + // assert!(result.result_at_h_3c.is_valid(), "Invalid result at h"); + + // println!("result_at_tip: {}", result.result_at_tip.is_valid()); +} + +#[test] +fn test_jack_daniels() { + assert_diff_chain( + ChainType::DevNet(DevnetType::JackDaniels), + &[], + &["QRINFO_1_107966__70221.dat"], + Some(vec![ + MerkleBlock::new(1, "79ee40288949fd61132c025761d4f065e161d60a88aab4c03e613ca8718d1d26", ""), + MerkleBlock::new(74136, "3ad221f88a172adb8aca647f3a059b008d55fb0dd07f918412620178d2030000", ""), + MerkleBlock::new(74160, "132bfe2ab16f6fab18e1c4d64deb8a748b12c4bd92fdc660e222ab2a21050000", ""), + MerkleBlock::new(74184, "8d80307b7fd5728799e62e1d461948331dd4b543a330deaf2d98576eb6050000", ""), + MerkleBlock::new(74208, "97bceb2e855f80bf4f8617ce9cb9206682171a3e1b92d2160ad799d2cd040000", ""), + MerkleBlock::new(74209, "34336e375eb5f6eefb147479d4c1a4823ca47282bab8a5eaf85aa3b3e4010000", ""), + MerkleBlock::new(74221, "55cea87c22849891b4e8819a8504605cc54314d03dacb97e6fa2aeb3d8000000", "601bb47971ab483aec1ee77074a785036edbb7ce543d868881aa4e04a39490c0"), + MerkleBlock::new(107512, "5c1d03d5dfecf9d5b467eb79d08af9eb4529d69f5590bc7b3c66779271030000", ""), + MerkleBlock::new(107560, "45c100e3aa8c91998d7ba0fd9655f95ea93f892a6050679516b9f03f83010000", ""), + MerkleBlock::new(107608, "2906e8b02c3aad1aa9176c87b06d5c19d94ab6ad15777a88017d70a4e8010000", ""), + MerkleBlock::new(107656, "d7b56611622ebac1f98d11f5b567076459733da645b973581dc2342c95060000", ""), + MerkleBlock::new(107704, "e8ae95b476453ef1514c590941616582f527bbde2464974239b32184c2010000", ""), + MerkleBlock::new(107966, "8782b2192054460b20585848fc53f9a875e232bd4a4d7f7bfda4b9563a010000", ""), + ]), false); +} diff --git a/dash-spv-apple-bindings/src/tests/listdiff/llmq_verification.rs b/dash-spv-apple-bindings/src/tests/listdiff/llmq_verification.rs new file mode 100644 index 00000000..62003d8e --- /dev/null +++ b/dash-spv-apple-bindings/src/tests/listdiff/llmq_verification.rs @@ -0,0 +1,132 @@ +use std::ptr::null_mut; +use std::sync::Arc; +use dashcore::hashes::Hash; +use dashcore::hashes::hex::FromHex; +use dash_spv_crypto::network::ChainType; +use dash_spv_masternode_processor::block_store::init_testnet_store; +use dash_spv_masternode_processor::test_helpers::load_message; +use dash_spv_masternode_processor::tests::FFIContext; +use crate::ffi_core_provider::FFICoreProvider; +use crate::tests::common::assert_diff_chain; + +#[test] +fn testnet_llmq_verificationx() { + assert_diff_chain( + ChainType::TestNet, + &["MNL_0_122928__70221.dat", "MNL_122928_123000__70221.dat"], + &[], + Some(init_testnet_store()), false); +} + +#[test] +fn testnet_llmq_verification() { + //testTestnetQuorumVerification + let chain = ChainType::TestNet; + let bytes = load_message(chain.identifier().as_str(), "MNL_0_122928__70221.dat"); + let use_insight_as_backup = false; + let base_masternode_list_hash: *const u8 = null_mut(); + let context = Arc::new(FFIContext::create_default_context_and_cache(chain.clone(), false)); + let mut processor = FFICoreProvider::default_processor(Arc::clone(&context), chain.clone()); + // let mut ctx = context.write().unwrap(); + // let processor = MasternodeProcessor::new(Arc::new(provider)); + let result_119064 = processor.process_mn_list_diff_result_from_message(&bytes, None, true) + .expect("Unable to process mn_list_diff"); + // assert_diff_result(&ctx, &result_119064); + + // let is_valid = result_119064.is_valid(); + // println!("is_valid: {}", is_valid); + let bytes = load_message(chain.identifier(), "MNL_122928_123000__70221.dat"); + let block_hash_119064 = &result_119064.0; + // let block_hash_119064 = unsafe { *result_119064.block_hash }; + // let masternode_list_119064 = unsafe { &*result_119064.masternode_list }; + // let masternode_list_119064_decoded = unsafe { masternode_list_119064.decode() }; + // let masternode_list_119064_encoded = masternode_list_119064_decoded.encode(); + let result_119200 = processor.process_mn_list_diff_result_from_message(&bytes, None, true) + .expect("Unable to process mn_list_diff"); + // assert_diff_result(&ctx, &result_119200); + + // let masternode_list_119200 = unsafe { &*result_119200.masternode_list }; + // let masternode_list_119200_decoded = unsafe { masternode_list_119200.decode() }; + // let added_quorums = result_119200.added_quorums.iter() + // .fold(BTreeMap::new(), |mut acc, entry| { + // acc.entry(entry.llmq_type) + // .or_insert_with(BTreeMap::new) + // .insert(entry.llmq_hash, entry.clone()); + // acc + // }); + // let hmm: BTreeMap> = added_quorums + // .into_iter() + // .filter(|(_, map)| map.contains_key(block_hash_119064)) + // .collect(); + // assert!(!hmm.is_empty(), "There should be a quorum using 119064"); + // assert!(added_quorums.contains_key(&block_hash_119064), "There should be a quorum using 119064"); + // TODO: verify with QuorumValidationData (need implement BLS before) + //let quorum_to_verify = added_quorums[&block_hash_119064]; + //quorum_to_verify.validate_with_masternode_list(masternode_list_119064_decoded); + //assert!(quorum_to_verify.verified, "Unable to verify quorum"); +} + +#[test] +fn testnet_llmq_verification_using_processor_and_cache() { + //testTestnetQuorumVerification + let chain = ChainType::TestNet; + let context = Arc::new(FFIContext::create_default_context_and_cache(chain.clone(), false)); + let mut processor = FFICoreProvider::default_processor(Arc::clone(&context), chain.clone()); + let use_insight_as_backup = false; + let bytes = load_message(chain.identifier(), "MNL_0_122928__70221.dat"); + let result_119064 = processor.process_mn_list_diff_result_from_message(&bytes, None, true) + .expect("Unable to process mn_list_diff"); + let block_hash_119064 = result_119064.0; + let bb1 = <[u8; 32]>::from_hex("23b8cd5303c892c0b140152f256c7ff27645890e04f93dc7df75d90100000000").unwrap(); + // let hash_119024 = <[u8; 32]>::from_hex("2cbcf83b62913d56f605c0e581a48872839428c92e5eb76cd7ad94bcaf0b0000").unwrap(); + let list_119064 = processor.masternode_list_for_block_hash(bb1).unwrap(); + // processor.cache.add_masternode_list(block_hash_119064, list_119064); + let masternode_list_119064 = processor.masternode_list_for_block_hash(block_hash_119064.to_byte_array()) + .expect("MasternodeList"); + // let masternode_list_119064 = result_119064.masternode_list; + // let masternode_list_119064_decoded = unsafe { masternode_list_119064.decode() }; + // let masternode_list_119064_encoded = masternode_list_119064_decoded.encode(); + + let bytes = load_message(chain.identifier(), "MNL_122928_123000__70221.dat"); + let result_119200 = processor.process_mn_list_diff_result_from_message(&bytes, None, true) + .expect("Unable to process mn_list_diff"); + // let result = process_mnlistdiff(bytes, processor, &mut context, 70221, use_insight_as_backup, false); + // let result_119200 = unsafe { &*result }; + // assert_diff_result(&ctx, &result_119200); + + + // let masternode_list_119200 = result_119200.masternode_list; + let masternode_list_119200 = processor.masternode_list_for_block_hash(result_119200.0.to_byte_array()) + .expect("MasternodeList"); + + // let masternode_list_119200_decoded = unsafe { masternode_list_119200.decode() }; + // let added_quorums = result_119200.added_quorums.iter().fold(BTreeMap::new(), |mut acc, entry| { + // // let llmq_type = map.llmq_type; + // // let llmq_hash = map.llmq_hash; + // acc.entry(entry.llmq_type) + // .or_insert_with(BTreeMap::new) + // .insert(entry.llmq_hash, entry.clone()); + // acc + // }); + // let added_quorums = (0..result_119200.added_quorums_count) + // .into_iter() + // .fold(BTreeMap::new(), |mut acc, i| unsafe { + // let map = &*(*(result_119200.added_quorums.add(i))); + // let llmq_type = map.llmq_type; + // let llmq_hash = *map.llmq_hash; + // acc.entry(llmq_type) + // .or_insert_with(BTreeMap::new) + // .insert(llmq_hash, map.decode()); + // acc + // }); + // let hmm: BTreeMap> = added_quorums + // .into_iter() + // .filter(|(_, map)| map.contains_key(&block_hash_119064)) + // .collect(); + // assert!(!hmm.is_empty(), "There should be a quorum using 119064"); + // assert!(added_quorums.contains_key(&block_hash_119064), "There should be a quorum using 119064"); + // TODO: verify with QuorumValidationData (need implement BLS before) + //let quorum_to_verify = added_quorums[&block_hash_119064]; + //quorum_to_verify.validate_with_masternode_list(masternode_list_119064_decoded); + //assert!(quorum_to_verify.verified, "Unable to verify quorum"); +} diff --git a/dash-spv-apple-bindings/src/tests/listdiff/mainnet_core19.rs b/dash-spv-apple-bindings/src/tests/listdiff/mainnet_core19.rs new file mode 100644 index 00000000..d3990e96 --- /dev/null +++ b/dash-spv-apple-bindings/src/tests/listdiff/mainnet_core19.rs @@ -0,0 +1,85 @@ +use dash_spv_crypto::network::ChainType; +use dash_spv_masternode_processor::block_store::init_mainnet_store; +use crate::tests::common::assert_diff_chain; + +#[test] +fn test_verify_chained_rotation_1() { + assert_diff_chain( + ChainType::MainNet, + &[ + "MNL_0_1870848__70227.dat", + "MNL_1870848_1871136__70227.dat", + "MNL_1871136_1871184__70227.dat", + "MNL_1871184_1871208__70227.dat", + "MNL_1871208_1871232__70227.dat", + "MNL_1871232_1871256__70227.dat", + "MNL_1871256_1871280__70227.dat", + "MNL_1871280_1871304__70227.dat", + "MNL_1871304_1871328__70227.dat", + "MNL_1871328_1871352__70227.dat", + "MNL_1871352_1871376__70227.dat", + "MNL_1871376_1871400__70227.dat", + "MNL_1871400_1871424__70227.dat", + "MNL_1871424_1871448__70227.dat", + "MNL_1871448_1871472__70227.dat", + "MNL_1871472_1871496__70227.dat", + "MNL_1871496_1871520__70227.dat", + "MNL_1871520_1871544__70227.dat", + "MNL_1871544_1871568__70227.dat", + "MNL_1871568_1871592__70227.dat", + "MNL_1871592_1871616__70227.dat", + "MNL_1871616_1871640__70227.dat", + "MNL_1871640_1871664__70227.dat", + "MNL_1871664_1871688__70227.dat", + "MNL_1871688_1871712__70227.dat", + "MNL_1871712_1871736__70227.dat", + "MNL_1871736_1871755__70227.dat", + ], + &[ + "QRINFO_0_1871755__70227.dat" + ], + Some(init_mainnet_store()), false); +} + +#[test] +fn test_verify_chained_rotation_2() { + assert_diff_chain( + ChainType::MainNet, + &[ + "MNL_0_1870840__70227.dat", + "MNL_1870840_1871712__70227.dat", + "MNL_1871712_1871722__70227.dat", + "MNL_1871722_1871724__70227.dat", + "MNL_1871724_1871726__70227.dat", + "MNL_1871726_1871727__70227.dat", + "MNL_1871727_1871730__70227.dat", + "MNL_1871730_1871733__70227.dat", + "MNL_1871733_1871734__70227.dat", + "MNL_1871734_1871738__70227.dat", + "MNL_1871738_1872001__70227.dat", + "MNL_1872001_1872002__70227.dat", + "MNL_1872002_1872003__70227.dat", + "MNL_1872003_1872004__70227.dat", + "MNL_1872004_1872005__70227.dat", + "MNL_1872005_1872006__70227.dat", + "MNL_1872006_1872007__70227.dat", + "MNL_1872007_1872008__70227.dat", + "MNL_1872008_1872009__70227.dat", + "MNL_1872009_1872011__70227.dat", + "MNL_1872011_1872013__70227.dat", + "MNL_1872013_1872016__70227.dat", + "MNL_1872016_1872017__70227.dat", + "MNL_1872017_1872019__70227.dat", + "MNL_1872019_1872020__70227.dat", + "MNL_1872020_1872023__70227.dat", + "MNL_1872023_1872024__70227.dat", + "MNL_1872024_1872025__70227.dat", + "MNL_1872025_1872027__70227.dat", + "MNL_1872027_1872028__70227.dat", + "MNL_1872028_1872029__70227.dat", + "MNL_1872029_1872030__70227.dat", + "MNL_1872030_1872031__70227.dat", + ], + &["QRINFO_0_1872425__70227.dat"], + Some(init_mainnet_store()), false); +} diff --git a/dash-spv-apple-bindings/src/tests/listdiff/mainnet_reload.rs b/dash-spv-apple-bindings/src/tests/listdiff/mainnet_reload.rs new file mode 100644 index 00000000..746facf8 --- /dev/null +++ b/dash-spv-apple-bindings/src/tests/listdiff/mainnet_reload.rs @@ -0,0 +1,49 @@ +use std::sync::Arc; +use dash_spv_crypto::network::chain_type::ChainType; +use dash_spv_masternode_processor::tests::FFIContext; +use crate::tests::common::load_masternode_lists_for_files; + +#[test] +fn test_mainnet_reload_with_processor() { + let chain = ChainType::MainNet; + let files = [ + "MNL_0_1090944.dat", + "MNL_1090944_1091520.dat", + "MNL_1091520_1091808.dat", + "MNL_1091808_1092096.dat", + "MNL_1092096_1092336.dat", + "MNL_1092336_1092360.dat", + "MNL_1092360_1092384.dat", + "MNL_1092384_1092408.dat", + "MNL_1092408_1092432.dat", + "MNL_1092432_1092456.dat", + "MNL_1092456_1092480.dat", + "MNL_1092480_1092504.dat", + "MNL_1092504_1092528.dat", + "MNL_1092528_1092552.dat", + "MNL_1092552_1092576.dat", + "MNL_1092576_1092600.dat", + "MNL_1092600_1092624.dat", + "MNL_1092624_1092648.dat", + "MNL_1092648_1092672.dat", + "MNL_1092672_1092696.dat", + "MNL_1092696_1092720.dat", + "MNL_1092720_1092744.dat", + "MNL_1092744_1092768.dat", + "MNL_1092768_1092792.dat", + "MNL_1092792_1092816.dat", + "MNL_1092816_1092840.dat", + "MNL_1092840_1092864.dat", + "MNL_1092864_1092888.dat", + "MNL_1092888_1092916.dat", + ] + .map(Into::into) + .to_vec(); + + let context = Arc::new(FFIContext::create_default_context_and_cache(chain.clone(), false)); + let success = load_masternode_lists_for_files(files, true, Arc::clone(&context), false, chain); + assert!(success, "Unsuccessful"); + // let context_lock = context.read().unwrap(); + // let cache_lock = context_lock.cache.read().unwrap(); + // assert_eq!(cache_lock.mn_lists.len(), 29, "There should be 29 models lists"); +} diff --git a/dash-spv-apple-bindings/src/tests/listdiff/mainnet_test_invalid_mn_list_root.rs b/dash-spv-apple-bindings/src/tests/listdiff/mainnet_test_invalid_mn_list_root.rs new file mode 100644 index 00000000..cb9ab110 --- /dev/null +++ b/dash-spv-apple-bindings/src/tests/listdiff/mainnet_test_invalid_mn_list_root.rs @@ -0,0 +1,32 @@ +use std::ptr::null; +use std::sync::Arc; +use dash_spv_crypto::network::ChainType; +use dash_spv_masternode_processor::models::MasternodeList; +use dash_spv_masternode_processor::test_helpers::{load_message, message_from_file}; +use dash_spv_masternode_processor::tests::FFIContext; +use dash_spv_masternode_processor::tests::serde_helper::MNList; +use crate::ffi_core_provider::FFICoreProvider; +// use crate::tests::common::{create_default_context_and_cache, process_mnlistdiff, register_default_processor}; + +#[test] +fn mainnet_test_invalid_mn_list_root() { + let chain = ChainType::MainNet; + let bytes = load_message(chain.identifier(),"MNL_1761054_1761100.dat"); + let context = FFIContext::create_default_context_and_cache(chain.clone(), false); + let processor = FFICoreProvider::default_processor(Arc::new(context), chain.clone()); + let list_1761054: MNList = serde_json::from_slice(&message_from_file("mainnet/MNLIST_1761054_1666771101.811508_saveMasternodeList.json")).unwrap(); + let list_1761048: MNList = serde_json::from_slice(&message_from_file("mainnet/MNLIST_1761048_1666773093.153379_saveMasternodeList.json")).unwrap(); + let masternode_list_1761054 = MasternodeList::from(list_1761054); + let masternode_list_1761048 = MasternodeList::from(list_1761048); + processor.cache.write_mn_lists(|lock| { + lock.insert(masternode_list_1761048.block_hash, masternode_list_1761048); + lock.insert(masternode_list_1761054.block_hash, masternode_list_1761054); + }); + let result = processor.mn_list_diff_result_from_message(&bytes, true, 70221, false, null()) + .expect("SUCCESS"); + // let processor = register_default_processor(&mut context); + // let result = process_mnlistdiff(bytes, processor, &mut context, 70221, false, true); + // println!("{:#?}", result); + // assert_diff_result(context, result); +} + diff --git a/dash-spv-masternode-processor/src/tests/listdiff/masternode_list_diff_1.rs b/dash-spv-apple-bindings/src/tests/listdiff/masternode_list_diff_1.rs similarity index 99% rename from dash-spv-masternode-processor/src/tests/listdiff/masternode_list_diff_1.rs rename to dash-spv-apple-bindings/src/tests/listdiff/masternode_list_diff_1.rs index 59c5b8ad..ec69520b 100644 --- a/dash-spv-masternode-processor/src/tests/listdiff/masternode_list_diff_1.rs +++ b/dash-spv-apple-bindings/src/tests/listdiff/masternode_list_diff_1.rs @@ -1,4 +1,4 @@ -use crate::lib_tests::tests::perform_mnlist_diff_test_for_message; +use crate::tests::common::perform_mnlist_diff_test_for_message; #[test] fn test_masternode_list_diff1() { @@ -209,5 +209,6 @@ fn test_masternode_list_diff1() { 1, verify_string_hashes, verify_string_smle_hashes, + false ); } diff --git a/dash-spv-masternode-processor/src/tests/listdiff/masternode_list_diff_2.rs b/dash-spv-apple-bindings/src/tests/listdiff/masternode_list_diff_2.rs similarity index 99% rename from dash-spv-masternode-processor/src/tests/listdiff/masternode_list_diff_2.rs rename to dash-spv-apple-bindings/src/tests/listdiff/masternode_list_diff_2.rs index ef4dd7f9..f0ee7a08 100644 --- a/dash-spv-masternode-processor/src/tests/listdiff/masternode_list_diff_2.rs +++ b/dash-spv-apple-bindings/src/tests/listdiff/masternode_list_diff_2.rs @@ -1,4 +1,4 @@ -use crate::lib_tests::tests::perform_mnlist_diff_test_for_message; +use crate::tests::common::perform_mnlist_diff_test_for_message; #[test] fn test_masternode_list_diff2() { @@ -30,5 +30,6 @@ fn test_masternode_list_diff2() { 2, verify_string_hashes, verify_string_smle_hashes, + true ); } diff --git a/dash-spv-apple-bindings/src/tests/listdiff/masternode_list_saving_to_disk.rs b/dash-spv-apple-bindings/src/tests/listdiff/masternode_list_saving_to_disk.rs new file mode 100644 index 00000000..b2852d71 --- /dev/null +++ b/dash-spv-apple-bindings/src/tests/listdiff/masternode_list_saving_to_disk.rs @@ -0,0 +1,12 @@ +use dash_spv_masternode_processor::block_store::init_testnet_store; +use crate::tests::common::assert_diff_chain; + +#[test] +fn test_mnl_saving_to_disk() { + // testMNLSavingToDisk + assert_diff_chain( + dash_spv_crypto::network::ChainType::TestNet, + &["ML_at_122088__70221.dat"], + &[], + Some(init_testnet_store()), false); +} diff --git a/dash-spv-apple-bindings/src/tests/listdiff/migration_core19.rs b/dash-spv-apple-bindings/src/tests/listdiff/migration_core19.rs new file mode 100644 index 00000000..fbf7f28c --- /dev/null +++ b/dash-spv-apple-bindings/src/tests/listdiff/migration_core19.rs @@ -0,0 +1,80 @@ +use std::ptr::null; +use std::sync::Arc; +use dash_spv_crypto::network::{ChainType, DevnetType}; +use dash_spv_masternode_processor::block_store::MerkleBlock; +use dash_spv_masternode_processor::test_helpers::load_message; +use dash_spv_masternode_processor::tests::FFIContext; +use crate::ffi_core_provider::FFICoreProvider; +use crate::tests::common::register_logger; + +#[test] +fn test_verify_chained_rotation() { + register_logger(); + let version = 70224; + let chain = ChainType::DevNet(DevnetType::Screwdriver); + let context = Arc::new( + FFIContext::chain_default( + chain.clone(), + false, + vec![ + MerkleBlock::reversed(4840, "0000012768da68f985b294c80ee5f8077d29aa418fc66f68589069c8c21c0b33", "1debef742e21db3326716c265ffee6fe0883020d4b7d04986c8003affe5e7e8e"), + MerkleBlock::reversed(4872, "0000029d25df5aff9374c87e303da6032c7e8ec6517842e637a79b9d6d433e46", "149d92e7610e03ea62767a1cea6305aa97e7097ceadbe7ef6c34e01c065aee08"), + MerkleBlock::reversed(4888, "0000022c2d5726c2a664b96f551f3e83c8cfc574f76ce2e9477075d582cf39dc", "74f1f7f66a576961c50d4742ea12d02de4d7724ab77798c3acbf5b99e224c069"), + MerkleBlock::reversed(4896, "000001182e5764ae984c46fb2bd78fce01948843c8f03ac9605d036e39c27e79", "e039bac930e912d448499da5bfefd7837629aaa1fb477f3a81dd5e936033ecb0"), + MerkleBlock::reversed(4920, "000000bf59863ba21575c37b7ef53497453396508f529f101b6e11575e47c234", "9db6eebef676c7672a5d6b63fefc20c51af9db743f539a16b4db2e9f5f84774b"), + MerkleBlock::reversed(4936, "00000157d5e963945c891cc074f2e449ac487504b94e416d117b7346704b1e01", "4edb31b6abbf9cf70862850d4fbbcdb76f218afac382e13e9d3a3dd4f3df68ad"), + MerkleBlock::reversed(4944, "000000995145233fe3d01ad30e4a3b857e84c9e64a3aa60279aabbfb883ab643", "eb0fceac6c75fb7a7b31d4d535969968e256c4d28d9ef51541468ba7178d6608"), + MerkleBlock::reversed(4968, "000002642837447bab0912fe7cc4d83d95ce275f97ffaaaa20cd374f0d39d95d", "1be93f2f91380dca34b339c5f09028d91b11a8379b6e94b1251095a942260253"), + MerkleBlock::reversed(4984, "000002f7cae2beaeb050f4ea23e02940b0ab3a98722b329b328ac73f9487e6f9", "feecf6a2f5303536b54ce07fe1e1746c7f03a08ada93f53f6d1160f4b68eda04"), + MerkleBlock::reversed(4992, "000000795a16ffa6de765747c7cd1fd7ad48e3a899adc4f25c2b84b122181a5c", "a971a6d8bd96b1db56f86210950301987c976ddb8ce946f3486e494c7e6ff21a"), + MerkleBlock::reversed(4993, "0000012f2a8f19afd26771c49f1e6f378cabb8a9d2256c29ed694259b6579732", "8bb97d7c0ceebac65f2c6616e262e09276e206df5a701315b6284ea6150f3b0b"), + MerkleBlock::reversed(4994, "0000018081e31ed485dbd34b73848dacfd8199d5c157ed8713862d86f8f4d5c5", "b0e5e73b09f19218333b142edf60eec11779a1dc3ec15c03e4f426ef73caa714"), + MerkleBlock::reversed(4995, "000001f651ecb6cd5e7d7a75d63b87dc553d4d9b9edbf2d395eb6186be59c64c", "a49c2d473960e492de4d997a7049cd2b21c2d15c71c6f1dad75d580b3f5b038c"), + MerkleBlock::reversed(4996, "000001ef3630a372e0dabfdb9d528bdb117b79039a67619ba4de39339638d4bc", "af1fa60f314f50f718917a9108d167e819061b30555e31516ca86d0713d92199"), + MerkleBlock::reversed(5016, "00000019ea1f2c0d5db4c929897d70c9d3bd2b12b08e3948341688699b6ae63b", "239095828fbfcb42fdac4bd64c922fac6038e1b7a002fc234f2b8797f6847715"), + MerkleBlock::reversed(5032, "00000072cae9600a36e1040831a8c266d187b035d0d1366ece465a693df3cfec", "0a57f43c1c8290a7dfb956328799c494d4d0a21ac2138b10ea047c5e89141321"), + MerkleBlock::reversed(5040, "000001ab3033f1a00490aeb9359747fd6ab1c64fb50937c0357bb5bc0334ca58", "f739d678fc728d5e7391d04431789b3f65bda33badb8a510469ef738abacea45"), + MerkleBlock::reversed(5064, "000000d1095e75090835ce87246b1dfb105c4c31fa2942a5cf553f3e83aa3faa", "215339c99a1cba055162f8a0468fb6479ba8b40ecc5d553f49c8e059dc6527e7"), + MerkleBlock::reversed(5088, "00000095908d41ade340072107f74fe6a66b3148b692f3a25df6a29d5ca23e6b", "9c645a0770ff3b47c917b49775a475bcb93cc5871d5c5cafdecf163ebbbf0f2d"), + MerkleBlock::reversed(5112, "000001ae03fa0003fd6ba6b19b812ef6b50591affb29c959496a803a5a5b00f6", "eb7ddabe2b91a5f6cc7bc4df5aaff199274df53481cfdf0a7f69a025ea1e6660"), + MerkleBlock::reversed(1, "4ac35ceb629e529b2a0eb2e2676983d4b11ebddaff5bd00cae7156a02b521e6f", "3ed1169f5d3e92c4b00322b6da549dbbdfeefceb0aac81dda77a144ccbd61d67"), + MerkleBlock::reversed(5118, "0000003911af6750e5710238ee9dbab83812bf2af3dc9411e755ef2ae870c843", "b76872fec9896277e39052794cad91051a30759c618acf4c079d8e45180a864d"), + MerkleBlock::reversed(5140, "000001321487a80eefd7f6137da9bb9b06f19143cbdaa15cfda63753bd8eee46", "c344d520890dc4e1f16be687e359b13578e74ae14d01183ca417650d7498eb81"), + ])); + + let processor = FFICoreProvider::default_processor(Arc::clone(&context), chain.clone()); + let listdiffs = [ + "MNL_1_4968.dat", + "MNL_4968_4992.dat", + "MNL_4992_4993.dat", + "MNL_4993_4994.dat", + "MNL_4994_4995.dat", + "MNL_4995_4996.dat", + "MNL_4996_5016.dat", + "MNL_5016_5032.dat", + "MNL_5032_5040.dat", + "MNL_5040_5064.dat", + "MNL_5064_5088.dat", + "MNL_5088_5112.dat", + "MNL_5112_5140.dat", + ]; + let qrinfos = [ + "QRINFO_1_5140.dat", + "QRINFO_5032_5140.dat", + ]; + // let mut ctx = context.write().unwrap(); + listdiffs.iter().for_each(|filename| { + let message = load_message(chain.identifier(), filename); + let result = processor.mn_list_diff_result_from_message(&message, true, version, false, null()) + .expect("Failed to process listdiff"); + // assert_diff_result(&ctx, &result); + }); + + // ctx.is_dip_0024 = true; + qrinfos.iter().for_each(|filename| { + let message = load_message(chain.identifier(), filename); + let result = processor.qr_info_result_from_message(&message, true, version, true, false, null()) + .expect("Failed to process qrinfo"); + // assert_qrinfo_result(&ctx, &result); + }); +} diff --git a/dash-spv-apple-bindings/src/tests/listdiff/mod.rs b/dash-spv-apple-bindings/src/tests/listdiff/mod.rs new file mode 100644 index 00000000..6a424ab4 --- /dev/null +++ b/dash-spv-apple-bindings/src/tests/listdiff/mod.rs @@ -0,0 +1,18 @@ +pub mod core20_testnet; +pub mod llmq_rotation; +pub mod llmq_verification; +pub mod mainnet_core19; +pub mod mainnet_reload; +#[cfg(all(feature = "use_serde", feature = "test-helpers"))] +pub mod mainnet_test_invalid_mn_list_root; +pub mod masternode_list_diff_1; +pub mod masternode_list_diff_2; +pub mod masternode_list_saving_to_disk; +pub mod migration_core19; +pub mod test_basic_bls_scheme; +pub mod test_mainnet_checkpoints; +#[cfg(all(feature = "use_serde", feature = "test-helpers"))] +pub mod test_quorums_from_dash_core_snapshot; +pub mod testnet_core19; +pub mod quorum_issue; +mod core21_testnet; \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/tests/listdiff/quorum_issue.rs b/dash-spv-apple-bindings/src/tests/listdiff/quorum_issue.rs similarity index 69% rename from dash-spv-masternode-processor/src/tests/listdiff/quorum_issue.rs rename to dash-spv-apple-bindings/src/tests/listdiff/quorum_issue.rs index b8007855..8f7804a5 100644 --- a/dash-spv-masternode-processor/src/tests/listdiff/quorum_issue.rs +++ b/dash-spv-apple-bindings/src/tests/listdiff/quorum_issue.rs @@ -1,7 +1,7 @@ -use crate::chain::common::ChainType; -use crate::lib_tests::tests::FFIContext; -use crate::tests::block_store::init_mainnet_store; -use crate::tests::listdiff::mainnet_reload::load_masternode_lists_for_files; +use std::sync::Arc; +use dash_spv_crypto::network::ChainType; +use dash_spv_masternode_processor::tests::FFIContext; +use crate::tests::common::load_masternode_lists_for_files; #[test] fn test_quorum_issue() { @@ -38,17 +38,13 @@ fn test_quorum_issue() { "MNL_1098960_1098984.dat".to_string(), "MNL_1098984_1099008.dat".to_string(), ]; - let block_store = init_mainnet_store(); - let context = &mut (FFIContext { - chain, - is_dip_0024: false, - cache: &mut Default::default(), - blocks: block_store - }); - - let (success, lists) = load_masternode_lists_for_files(files, false, context); + let context = Arc::new(FFIContext::create_default_context_and_cache(chain.clone(), false)); + // let ctx = context.read().unwrap(); + let success = load_masternode_lists_for_files(files, false, Arc::clone(&context), false, chain); assert!(success, "Unsuccessful"); - lists.iter().for_each(|(hash, node)| { - println!("Testing quorum of models list at height {}", context.block_for_hash(*hash).unwrap().height); - }); + // let ctx = context.read().unwrap(); + // let cache_lock = ctx.cache.read().unwrap(); + // cache_lock.mn_lists.iter().for_each(|(hash, node)| { + // println!("Testing quorum of models list at height {}", ctx.block_for_hash(*hash).unwrap().height); + // }); } diff --git a/dash-spv-apple-bindings/src/tests/listdiff/test_basic_bls_scheme.rs b/dash-spv-apple-bindings/src/tests/listdiff/test_basic_bls_scheme.rs new file mode 100644 index 00000000..90ccb852 --- /dev/null +++ b/dash-spv-apple-bindings/src/tests/listdiff/test_basic_bls_scheme.rs @@ -0,0 +1,55 @@ +use std::ptr::null; +use std::sync::Arc; +use dash_spv_masternode_processor::block_store::MerkleBlock; +use dash_spv_crypto::network::{ChainType, DevnetType}; +use dash_spv_masternode_processor::test_helpers::load_message; +use dash_spv_masternode_processor::tests::FFIContext; +use crate::ffi_core_provider::FFICoreProvider; + +#[test] +fn test_basic_bls_scheme_using_chacha() { + let chain = DevnetType::Chacha; + let message = load_message(chain.identifier(), "MNL_1_9247.dat"); + let context = Arc::new(FFIContext::devnet_default( + chain.clone(), + false, + vec![ + MerkleBlock::new(1, "8862eca4bdb5255b51dc72903b8a842f6ffe7356bc40c7b7a7437b8e4556e220", "42a84456a608ade07581c35e1087634743f6293c56dbdc01930ad97df0f08b2e"), + MerkleBlock::new(9192, "3a29104cd905e2a584d5f1844a0f421a2af0fd9ad7840a0ebb097a628d1b0000", "42a84456a608ade07581c35e1087634743f6293c56dbdc01930ad97df0f08b2e"), + MerkleBlock::new(9247, "9993903c63b96f9a3846692535a11da2525561f0d61c7d31b7222bfddf020000", "42a84456a608ade07581c35e1087634743f6293c56dbdc01930ad97df0f08b2e"), + ])); + let processor = FFICoreProvider::default_processor(Arc::clone(&context), ChainType::DevNet(chain)); + // let mut ctx = context.write().unwrap(); + // let processor = MasternodeProcessor::new(Arc::new(provider)); + let (base_block_hash, block_hash, _) = processor.mn_list_diff_result_from_message(&message, true, 70224, false, null()) + .expect("failed to process diff"); + let masternode_list = processor.masternode_list_for_block_hash(block_hash).expect("MasternodeList"); + let bh = context.block_for_hash(masternode_list.block_hash) + .map(|b| b.height) + .unwrap_or(u32::MAX); + // assert!(result.has_found_coinbase, "has no coinbase {}", bh); + // assert!(result.has_valid_mn_list_root, "invalid mnl root {}", bh); + // assert!(result.has_valid_llmq_list_root, "invalid llmq root {}", bh); + // assert!(result.has_valid_quorums, "has invalid llmq height {}", bh); + println!("Diff is ok at {}", bh); + +} + +// #[test] +fn test_core_19_rc_2_testnet() { + let chain = ChainType::TestNet; + let identifier = chain.identifier(); + let context = Arc::new(FFIContext::create_default_context_and_cache(chain.clone(), false)); + let processor = FFICoreProvider::default_processor(Arc::clone(&context), chain); + // let mut ctx = context.write().unwrap(); + // let processor = MasternodeProcessor::new(Arc::new(provider)); + // test is failing due to lack of the 0000010472d5e8c1545b3dd1f5b67f486b48b963222e1ed6f44a16bb35731c1c block in the insight + let bytes = load_message(identifier, "MNL_TESTNET_CORE_19.dat"); + // + let result = processor.mn_list_diff_result_from_message(&bytes, true, 70223, false, null()) + .expect("failed to process mnlistdiff"); + // assert!(result.has_valid_llmq_list_root, "invalid llmq root {}", result.block_hash.0.to_hex()); + + // todo: need add new blocks to the testnet store + // assert_diff_result(context, result); +} diff --git a/dash-spv-apple-bindings/src/tests/listdiff/test_mainnet_checkpoints.rs b/dash-spv-apple-bindings/src/tests/listdiff/test_mainnet_checkpoints.rs new file mode 100644 index 00000000..7b3ff313 --- /dev/null +++ b/dash-spv-apple-bindings/src/tests/listdiff/test_mainnet_checkpoints.rs @@ -0,0 +1,22 @@ +use dash_spv_crypto::network::ChainType; +use dash_spv_masternode_processor::block_store::{init_mainnet_store, init_testnet_store}; +use crate::tests::common::assert_diff_chain; + +#[test] +fn testnet_checkpoint_530000() { + assert_diff_chain(ChainType::TestNet, &["MNT530000.dat"], &[], Some(init_testnet_store()), false); +} + +#[test] +fn mainnet_checkpoint_1720000() { + /*{ + 1720000, + "000000000000001ef1f8a3d33bbe304c1d12f59f2c8aa989099dc215fd10903e", + 1660295895, + 0x19362176u, + "ML1720000", + "67c6348c35bc42aa4cabd25e29560f5d22c6a9fba274bf0c52fe73021d0e8d5e", + "000000000000000000000000000000000000000000007715a9ae4dd7ff1d3902" + }*/ + assert_diff_chain(ChainType::MainNet, &["ML1720000.dat"], &[], Some(init_mainnet_store()), false); +} diff --git a/dash-spv-apple-bindings/src/tests/listdiff/test_quorums_from_dash_core_snapshot.rs b/dash-spv-apple-bindings/src/tests/listdiff/test_quorums_from_dash_core_snapshot.rs new file mode 100644 index 00000000..41d87424 --- /dev/null +++ b/dash-spv-apple-bindings/src/tests/listdiff/test_quorums_from_dash_core_snapshot.rs @@ -0,0 +1,62 @@ +// use std::sync::Arc; +// use dash_spv_crypto::network::{ChainType, IHaveChainSettings}; +// use dash_spv_masternode_processor::models::LLMQSnapshot; +// use dash_spv_masternode_processor::test_helpers::load_message; +// use dash_spv_masternode_processor::tests::FFIContext; +// use dash_spv_masternode_processor::tests::serde_helper::{masternode_list_from_genesis_diff, QRInfo}; +// use crate::ffi_core_provider::FFICoreProvider; +// +// #[test] +// pub fn test_from_snapshot() { +// let chain = ChainType::TestNet; +// let qrinfo: QRInfo = serde_json::from_slice(&load_message(chain.identifier(), "snapshot_0000021715c8575620382ceee42cc7556bac5ed395eaf9c75e2119aa2876a1e0.json")).unwrap(); +// let context = Arc::new(FFIContext::create_default_context_and_cache(chain.clone(), true)); +// let processor = FFICoreProvider::default_processor(context, chain.clone()); +// // let mut context = create_default_context_and_cache(chain, true); +// // let processor = unsafe { &mut *register_default_processor(&mut context) }; +// // let block_height_lookup = |hash: [u8; 32]| context.block_for_hash(hash).unwrap().height; +// let quorum_snapshot_h_c = LLMQSnapshot::from(qrinfo.quorum_snapshot_at_hminus_c); +// let quorum_snapshot_h_2c = LLMQSnapshot::from(qrinfo.quorum_snapshot_at_hminus2c); +// let quorum_snapshot_h_3c = LLMQSnapshot::from(qrinfo.quorum_snapshot_at_hminus3c); +// let mn_list_diff_tip = masternode_list_from_genesis_diff(qrinfo.mn_list_diff_tip, &processor, false); +// let mn_list_diff_h = masternode_list_from_genesis_diff(qrinfo.mn_list_diff_h, &processor, false); +// let mn_list_diff_h_c = masternode_list_from_genesis_diff(qrinfo.mn_list_diff_at_hminus_c, &processor, false); +// let mn_list_diff_h_2c = masternode_list_from_genesis_diff(qrinfo.mn_list_diff_at_hminus2c, &processor, false); +// let mn_list_diff_h_3c = masternode_list_from_genesis_diff(qrinfo.mn_list_diff_at_hminus3c, &processor, false); +// +// // println!("rotated_quorums at h ({}: {})", mn_list_diff_h.block_height, mn_list_diff_h.block_hash); +// // let cached_blocks = &context.blocks; +// // let get_height = |hash: [u8; 32]| cached_blocks.iter().find(|block| block.hash() == hash.reversed()).unwrap().height; +// // let cached_llmq_members = &mut context.cache.llmq_members; +// // let cached_llmq_indexed_members = &mut context.cache.llmq_indexed_members; +// +// mn_list_diff_h.added_quorums.iter().filter(|q| q.llmq_type == chain.isd_llmq_type()).for_each(|entry| { +// // println!("rotated_quorum: ({}: {})", entry.llmq_hash, entry.llmq_hash.reversed()); +// let llmq_block_height = processor.height_for_block_hash(entry.llmq_hash); +// // let llmq_block_height = get_height(entry.llmq_hash); +// // println!("rotated_quorum: ({}: {})\n {:#?}", llmq_block_height, entry.llmq_hash, entry); +// let masternodes = processor.get_rotated_masternodes_for_quorum( +// entry.llmq_type, +// entry.llmq_hash, +// llmq_block_height, +// false, +// ); +// // println!("masternodes: {:#?}", masternodes); +// }); +// +// // let masternodes = processor +// // .get_rotated_masternodes_for_quorum(chain.isd_llmq_type(), mn_list_diff_h.added_quorums) +// +// +// // let result_at_tip = processor.get_list_diff_result_internal_with_base_lookup(mn_list_diff_tip, cache); +// // let result_at_h = processor.get_list_diff_result_internal_with_base_lookup(mn_list_diff_h, cache); +// // let result_at_h_c = processor.get_list_diff_result_internal_with_base_lookup(mn_list_diff_h_c, cache); +// // let result_at_h_2c = processor.get_list_diff_result_internal_with_base_lookup(mn_list_diff_h_2c, cache); +// // let result_at_h_3c = processor.get_list_diff_result_internal_with_base_lookup(mn_list_diff_h_3c, cache); +// // println!("result_at_tip: {:#?}", result_at_tip); +// // println!("result_at_h: {:#?}", result_at_h); +// // println!("result_at_h_c: {:#?}", result_at_h_c); +// // println!("result_at_h_2c: {:#?}", result_at_h_2c); +// // println!("result_at_h_3c: {:#?}", result_at_h_3c); +// } +// diff --git a/dash-spv-apple-bindings/src/tests/listdiff/testnet_core19.rs b/dash-spv-apple-bindings/src/tests/listdiff/testnet_core19.rs new file mode 100644 index 00000000..1967db53 --- /dev/null +++ b/dash-spv-apple-bindings/src/tests/listdiff/testnet_core19.rs @@ -0,0 +1,83 @@ +use dash_spv_crypto::network::ChainType; +use dash_spv_masternode_processor::block_store::init_testnet_store; +use crate::tests::common::assert_diff_chain; + +// #[test] +// fn test_core19rc10() { +// // 85.209.243.24 (/Dash Core:18.2.1/ protocol 70227) +// assert_diff_chain( +// ChainType::TestNet, +// &["MN530000.dat", "MNL_530000_867700__70227.dat"], +// // &["MNT530000.dat", "MNL_530000_867700__70227.dat"], +// &[], +// None, false); +// } + +#[test] +fn test_core19_70227() { + assert_diff_chain( + ChainType::TestNet, + &["MNT530000.dat", "MNL_530000_868321__70227.dat"], + &[], + Some(init_testnet_store()), + false); +} + +#[test] +fn test_mnlistdiff_and_qrinfo_core19() { + assert_diff_chain( + ChainType::TestNet, + &[ + "MNL_0_868888__70227.dat", + "MNL_0_869464__70227.dat", + "MNL_0_869760__70227.dat", + "MNL_868888_869176__70227.dat", + "MNL_869176_869464__70227.dat", + "MNL_869464_869752__70227.dat", + "MNL_869752_869760__70227.dat", + "MNL_869760_869761__70227.dat", + "MNL_869761_869762__70227.dat", + "MNL_869762_869763__70227.dat", + "MNL_869763_869764__70227.dat", + "MNL_869764_869765__70227.dat", + "MNL_869765_869766__70227.dat", + "MNL_869766_869767__70227.dat", + "MNL_869767_869768__70227.dat", + "MNL_869768_869769__70227.dat", + "MNL_869769_869770__70227.dat", + "MNL_869770_869771__70227.dat", + "MNL_869771_869772__70227.dat", + "MNL_869772_869773__70227.dat", + "MNL_869773_869774__70227.dat", + "MNL_869774_869775__70227.dat", + "MNL_869775_869776__70227.dat", + "MNL_869776_869777__70227.dat", + "MNL_869777_869778__70227.dat", + "MNL_869778_869779__70227.dat", + "MNL_869779_869780__70227.dat", + "MNL_869780_869781__70227.dat", + "MNL_869781_869782__70227.dat", + "MNL_869782_869783__70227.dat", + "MNL_869783_869784__70227.dat", + "MNL_869784_869785__70227.dat", + "MNL_869785_869786__70227.dat", + "MNL_869786_869787__70227.dat", + "MNL_869787_869788__70227.dat", + "MNL_869788_869789__70227.dat", + "MNL_869789_869790__70227.dat", + "MNL_869790_869791__70227.dat", + ], + &[ + "QRINFO_0_870235__70227.dat" + ], + None, false); +} + +#[test] +fn test_core19_2() { + assert_diff_chain( + ChainType::TestNet, + &["MNL_0_530000__70228.dat", "MNL_530000_852596__70228.dat"], + &[], + Some(init_testnet_store()), false); +} diff --git a/dash-spv-apple-bindings/src/tests/mod.rs b/dash-spv-apple-bindings/src/tests/mod.rs new file mode 100644 index 00000000..39138f87 --- /dev/null +++ b/dash-spv-apple-bindings/src/tests/mod.rs @@ -0,0 +1,2 @@ +pub mod common; +pub mod listdiff; \ No newline at end of file diff --git a/dash-spv-coinjoin/Cargo.toml b/dash-spv-coinjoin/Cargo.toml index fbad0e4d..9d28d0df 100644 --- a/dash-spv-coinjoin/Cargo.toml +++ b/dash-spv-coinjoin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dash-spv-coinjoin" -version = "0.5.0" +version = "0.5.1" description = "Library for processing coinjoin messages" edition = "2021" @@ -12,13 +12,14 @@ unstable = [] test-helpers = [] [dependencies] -dash-spv-masternode-processor = { path = "../dash-spv-masternode-processor" } +dash-spv-crypto = { workspace = true } +dashcore = { git = "https://github.com/dashpay/rust-dashcore", features = ["std", "secp-recovery", "rand", "signer", "serde", "apple"], default-features = false, branch = "feat/ferment" } +ferment-macro = { git = "https://github.com/dashpay/ferment", package = "ferment-macro" } logging = { path = "../logging" } -byte = "0.2" tracing = "0.1.40" [build-dependencies] -cbindgen = "0.24.3" +cbindgen = "0.28.0" [lib] name = "dash_spv_coinjoin" diff --git a/dash-spv-coinjoin/src/coin_selection/compact_tally_item.rs b/dash-spv-coinjoin/src/coin_selection/compact_tally_item.rs index 8bb9e071..045923a1 100644 --- a/dash-spv-coinjoin/src/coin_selection/compact_tally_item.rs +++ b/dash-spv-coinjoin/src/coin_selection/compact_tally_item.rs @@ -1,15 +1,16 @@ -use crate::models::tx_destination::TxDestination; use crate::coin_selection::input_coin::InputCoin; #[derive(Clone, Debug)] +#[ferment_macro::export] pub struct CompactTallyItem { - pub tx_destination: TxDestination, + pub tx_destination: Option>, pub amount: u64, pub input_coins: Vec, } +#[ferment_macro::export] impl CompactTallyItem { - pub fn new(tx_destination: TxDestination) -> Self { + pub fn new(tx_destination: Option>) -> CompactTallyItem { CompactTallyItem { tx_destination, amount: 0, diff --git a/dash-spv-coinjoin/src/coin_selection/input_coin.rs b/dash-spv-coinjoin/src/coin_selection/input_coin.rs index 60f60cd6..c1b37cc6 100644 --- a/dash-spv-coinjoin/src/coin_selection/input_coin.rs +++ b/dash-spv-coinjoin/src/coin_selection/input_coin.rs @@ -1,9 +1,10 @@ -use dash_spv_masternode_processor::tx::TransactionOutput; -use crate::models::tx_outpoint::TxOutPoint; +use dashcore::blockdata::transaction::OutPoint; +use dashcore::blockdata::transaction::txout::TxOut; #[derive(Clone, Debug)] +#[ferment_macro::export] pub struct InputCoin { - pub tx_outpoint: TxOutPoint, - pub output: TransactionOutput, + pub tx_outpoint: OutPoint, + pub output: TxOut, pub effective_value: u64 } \ No newline at end of file diff --git a/dash-spv-coinjoin/src/coin_selection/mod.rs b/dash-spv-coinjoin/src/coin_selection/mod.rs index 2cbefc68..f4e121f0 100644 --- a/dash-spv-coinjoin/src/coin_selection/mod.rs +++ b/dash-spv-coinjoin/src/coin_selection/mod.rs @@ -1,2 +1,2 @@ -pub(crate) mod compact_tally_item; -pub(crate) mod input_coin; \ No newline at end of file +pub mod compact_tally_item; +pub mod input_coin; \ No newline at end of file diff --git a/dash-spv-coinjoin/src/coinjoin.rs b/dash-spv-coinjoin/src/coinjoin.rs index f5957aa4..33be0688 100644 --- a/dash-spv-coinjoin/src/coinjoin.rs +++ b/dash-spv-coinjoin/src/coinjoin.rs @@ -1,30 +1,24 @@ use std::collections::HashMap; - -use dash_spv_masternode_processor::chain::common::ChainType; -use dash_spv_masternode_processor::chain::params::DUFFS; -use dash_spv_masternode_processor::common::Block; -use dash_spv_masternode_processor::crypto::byte_util::UInt256; -use dash_spv_masternode_processor::ffi::boxer::boxed; -use dash_spv_masternode_processor::ffi::unboxer::unbox_any; -use dash_spv_masternode_processor::tx::transaction::Transaction; -use dash_spv_masternode_processor::util::script::ScriptType; +use std::os::raw::c_void; +use std::sync::Arc; +use dashcore::blockdata::transaction::Transaction; +use dashcore::hashes::Hash; +use dash_spv_crypto::network::ChainType; +use dash_spv_crypto::util::params::{DUFFS, MAX_SCRIPT_SIZE}; use logging::*; -use tracing::{info, warn, debug}; -use crate::ffi::callbacks::{GetInputValueByPrevoutHash, HasChainLock, DestroyInputValue}; -use crate::ffi::input_value::InputValue; use crate::messages::pool_message::PoolMessage; use crate::messages::pool_status::PoolStatus; use crate::messages::coinjoin_broadcast_tx::CoinJoinBroadcastTx; use crate::constants::COINJOIN_ENTRY_MAX_SIZE; use crate::utils::coin_format::CoinFormat; -#[derive(Debug)] +#[derive(Clone)] +#[ferment_macro::opaque] pub struct CoinJoin { - pub opaque_context: *const std::ffi::c_void, - pub get_input_value_by_prevout_hash: GetInputValueByPrevoutHash, - pub has_chain_lock: HasChainLock, - pub destroy_input_value: DestroyInputValue, - map_dstx: HashMap, + pub opaque_context: *const c_void, + pub get_input_value_by_prev_outpoint: Arc i64>, + pub has_chain_lock: Arc bool>, + map_dstx: HashMap<[u8; 32], CoinJoinBroadcastTx>, } impl CoinJoin { @@ -38,23 +32,29 @@ impl CoinJoin { (DUFFS / 1000) + 1, ]; - pub fn new( - get_input_value_by_prevout_hash: GetInputValueByPrevoutHash, - has_chain_lock: HasChainLock, - destroy_input_value: DestroyInputValue, - context: *const std::ffi::c_void +} + +#[ferment_macro::export] +impl CoinJoin { + + pub fn new< + GIV: Fn(*const c_void, [u8; 32], u32) -> i64 + Send + Sync + 'static, + HCL: Fn(*const c_void, u32) -> bool + Send + Sync + 'static, + >( + get_input_value_by_prev_outpoint: GIV, + has_chain_lock: HCL, + context: *const c_void ) -> Self { Self { opaque_context: context, - get_input_value_by_prevout_hash, - has_chain_lock, - destroy_input_value, + get_input_value_by_prev_outpoint: Arc::new(get_input_value_by_prev_outpoint), + has_chain_lock: Arc::new(has_chain_lock), map_dstx: HashMap::new() } } - pub fn get_standard_denominations() -> &'static [u64] { - &Self::STANDARD_DENOMINATIONS + pub fn get_standard_denominations() -> [u64; 5] { + Self::STANDARD_DENOMINATIONS } pub fn get_smallest_denomination() -> u64 { @@ -77,8 +77,7 @@ impl CoinJoin { return 1 << i; } } - - return 0; + 0 } /// # Returns @@ -131,51 +130,44 @@ impl CoinJoin { // check to make sure the collateral provided by the client is valid pub fn is_collateral_valid(&self, tx_collateral: &Transaction, check_inputs: bool) -> bool { - if tx_collateral.outputs.is_empty() { - log_warn!(target: "CoinJoin", "Collateral invalid due to no outputs: {}", tx_collateral.tx_hash.unwrap_or_default()); + if tx_collateral.output.is_empty() { + log_warn!(target: "CoinJoin", "Collateral invalid due to no outputs: {}", tx_collateral.txid().to_hex()); return false; } if tx_collateral.lock_time != 0 { - log_warn!(target: "CoinJoin", "Collateral invalid due to lock time != 0: {}", tx_collateral.tx_hash.unwrap_or_default()); + log_warn!(target: "CoinJoin", "Collateral invalid due to lock time != 0: {}", tx_collateral.txid().to_hex()); return false; } let mut n_value_in: i64 = 0; let mut n_value_out: i64 = 0; - for txout in &tx_collateral.outputs { - n_value_out = n_value_out + txout.amount as i64; - - if txout.script_pub_key_type() != ScriptType::PayToPubkeyHash && !txout.is_script_unspendable() { - log_warn!(target: "CoinJoin", "Invalid Script, txCollateral={}", tx_collateral.tx_hash().unwrap_or_default()); + for txout in &tx_collateral.output { + n_value_out = n_value_out + txout.value as i64; + // TODO: check that i recreated this correctly + if !txout.script_pubkey.is_p2pkh() && !txout.script_pubkey.is_op_return() && txout.script_pubkey.len() <= MAX_SCRIPT_SIZE { + log_warn!(target: "CoinJoin", "Invalid Script, txCollateral={}", tx_collateral.txid()); return false; } } if check_inputs { - for txin in &tx_collateral.inputs { - let result = self.get_input_value_by_prevout_hash(txin.input_hash, txin.index); - - if let Some(input_value) = result { - if !input_value.is_valid { - log_warn!(target: "CoinJoin", "spent or non-locked mempool input!"); - log_debug!(target: "CoinJoin", "txin={:?}", txin); - return false; - } - - n_value_in = n_value_in + input_value.value as i64; - } else { - log_warn!(target: "CoinJoin", "Unknown inputs in collateral transaction, txCollateral={}", tx_collateral.tx_hash().unwrap_or_default()); + for txin in &tx_collateral.input { + let value = self.get_input_value_by_prev_outpoint(txin.previous_output.txid.to_byte_array(), txin.previous_output.vout); + if value == -1 { + log_warn!(target: "CoinJoin", "spent or non-locked mempool input!"); + log_debug!(target: "CoinJoin", "txin={:?}", txin); return false; } + n_value_in += value; } log_debug!(target: "CoinJoin", "is_collateral_valid, values: n_value_out={}, n_value_in={}", n_value_out, n_value_in); if n_value_in - n_value_out < CoinJoin::get_collateral_amount() as i64 { log_warn!(target: "CoinJoin", "did not include enough fees in transaction: fees: {}", n_value_out - n_value_in); - log_debug!(target: "CoinJoin", "txCollateral={:?}", tx_collateral.tx_hash().unwrap_or_default()); + log_debug!(target: "CoinJoin", "txCollateral={:?}", tx_collateral.txid()); return false; } } @@ -194,8 +186,8 @@ impl CoinJoin { let mut opt_denom = 0; for denom in Self::get_standard_denominations() { - if input_amount == *denom { - opt_denom = *denom; + if input_amount == denom { + opt_denom = denom; } } @@ -212,38 +204,36 @@ impl CoinJoin { } pub fn add_dstx(&mut self, dstx: CoinJoinBroadcastTx) { - if let Some(tx_hash) = dstx.tx.tx_hash { - self.map_dstx.insert(tx_hash, dstx); - } + self.map_dstx.insert(dstx.tx.txid().to_byte_array(), dstx); } - pub fn has_dstx(&self, tx_hash: UInt256) -> bool { + pub fn has_dstx(&self, tx_hash: [u8; 32]) -> bool { self.map_dstx.contains_key(&tx_hash) } - pub fn get_dstx(&self, tx_hash: UInt256) -> Option<&CoinJoinBroadcastTx> { - self.map_dstx.get(&tx_hash) + pub fn get_dstx(&self, tx_hash: [u8; 32]) -> Option { + self.map_dstx.get(&tx_hash).cloned() } - pub fn update_block_tip(&mut self, block: Block) { - self.check_dstxs(block); + pub fn update_block_tip(&mut self, block_height: u32) { + self.check_dstxs(block_height); } - pub fn notify_chain_lock(&mut self, block: Block) { - self.check_dstxs(block); + pub fn notify_chain_lock(&mut self, block_height: u32) { + self.check_dstxs(block_height); } - pub fn update_dstx_confirmed_height(&mut self, tx_hash: UInt256, n_height: i32) { + pub fn update_dstx_confirmed_height(&mut self, tx_hash: [u8; 32], n_height: i32) { if let Some(broadcast_tx) = self.map_dstx.get_mut(&tx_hash) { broadcast_tx.set_confirmed_height(n_height); } } - pub fn transaction_added_to_mempool(&mut self, tx_hash: UInt256) { + pub fn transaction_added_to_mempool(&mut self, tx_hash: [u8; 32]) { self.update_dstx_confirmed_height(tx_hash, -1); } - pub fn block_connected(&mut self, block_height: u32, block_transactions: Vec, vtx_conflicted: Vec) { + pub fn block_connected(&mut self, block_height: u32, block_transactions: Vec<[u8; 32]>, vtx_conflicted: Vec<[u8; 32]>) { for tx_hash in vtx_conflicted { self.update_dstx_confirmed_height(tx_hash, -1); } @@ -253,7 +243,7 @@ impl CoinJoin { } } - pub fn block_disconnected(&mut self, block_transactions: Vec,) { + pub fn block_disconnected(&mut self, block_transactions: Vec<[u8; 32]>,) { for tx_hash in block_transactions { self.update_dstx_confirmed_height(tx_hash, -1); } @@ -330,24 +320,18 @@ impl CoinJoin { } } - fn get_input_value_by_prevout_hash(&self, prevout_hash: UInt256, index: u32) -> Option { - unsafe { - let boxed_prevout_hash = boxed(prevout_hash.0); - let input_ptr = (self.get_input_value_by_prevout_hash)(boxed_prevout_hash, index, self.opaque_context); - - if input_ptr.is_null() { - return None - } - - let input_value: InputValue = std::ptr::read(input_ptr); - (self.destroy_input_value)(input_ptr); - unbox_any(boxed_prevout_hash); - - return Some(input_value); - } + pub fn get_input_value_by_prev_outpoint(&self, txid: [u8; 32], vout: u32) -> i64 { + (self.get_input_value_by_prev_outpoint)(self.opaque_context, txid, vout) } - fn check_dstxs(&mut self, block: Block) { - self.map_dstx.retain(|_, tx| !tx.is_expired(block, self.has_chain_lock, self.opaque_context)); + pub fn check_dstxs(&mut self, block_height: u32) { + self.map_dstx.retain(|_, tx| { + // expire confirmed DSTXes after ~1h since confirmation or chainlocked confirmation + if tx.confirmed_height == -1 || (block_height as i32) < tx.confirmed_height { + return false; // not mined yet + } + let mined_more_than_hour_ago = block_height as i32 - tx.confirmed_height > 24; + mined_more_than_hour_ago || (self.has_chain_lock)(self.opaque_context, block_height) + }); } } \ No newline at end of file diff --git a/dash-spv-coinjoin/src/coinjoin_base_session.rs b/dash-spv-coinjoin/src/coinjoin_base_session.rs index 24df65c4..fa57e925 100644 --- a/dash-spv-coinjoin/src/coinjoin_base_session.rs +++ b/dash-spv-coinjoin/src/coinjoin_base_session.rs @@ -1,18 +1,17 @@ use std::collections::HashSet; use std::fmt::Debug; use std::time::{SystemTime, UNIX_EPOCH}; - -use dash_spv_masternode_processor::hashes::hex::ToHex; -use dash_spv_masternode_processor::tx::transaction::{Transaction, TransactionOutput, TransactionInput}; -use dash_spv_masternode_processor::util::script::ScriptType; +use dashcore::blockdata::transaction::Transaction; +use dashcore::blockdata::transaction::txin::TxIn; +use dashcore::blockdata::transaction::txout::TxOut; +use dashcore::hashes::Hash; use logging::*; -use tracing::{error, warn, info}; use crate::coinjoin::CoinJoin; use crate::messages::{coinjoin_entry::CoinJoinEntry, pool_state::PoolState, pool_status::PoolStatus, pool_message::PoolMessage}; use crate::models::valid_in_outs::ValidInOuts; -#[repr(C)] #[derive(Debug)] +#[ferment_macro::export] pub struct CoinJoinBaseSession { pub entries: Vec, pub final_mutable_transaction: Option, @@ -47,7 +46,7 @@ impl CoinJoinBaseSession { } } - pub fn is_valid_in_outs(&self, vin: &Vec, vout: &Vec) -> ValidInOuts { + pub fn is_valid_in_outs(&self, vin: &Vec, vout: &Vec) -> ValidInOuts { let mut set_scrip_pub_keys = HashSet::new(); let mut result = ValidInOuts::new(); @@ -60,8 +59,8 @@ impl CoinJoinBaseSession { return result; } - let mut check_tx_out = |tx_out: &TransactionOutput| -> ValidInOuts { - let denom = CoinJoin::amount_to_denomination(tx_out.amount); + let mut check_tx_out = |tx_out: &TxOut| -> ValidInOuts { + let denom = CoinJoin::amount_to_denomination(tx_out.value); let mut result = ValidInOuts::new(); if denom != self.session_denom { @@ -74,10 +73,11 @@ impl CoinJoinBaseSession { return result; } - let hex = tx_out.script.as_ref().unwrap_or(&vec![]).to_hex(); + let out_script = tx_out.script_pubkey.to_hex_string(); + // let hex = tx_out.script_pubkey.as_ref().unwrap_or(&vec![]).to_hex(); - if tx_out.script_pub_key_type() != ScriptType::PayToPubkeyHash { - log_error!(target: "CoinJoin", "ERROR: invalid scriptPubKey={}", hex); + if !tx_out.script_pubkey.is_p2pkh() { + log_error!(target: "CoinJoin", "ERROR: invalid scriptPubKey={}", out_script); result.message_id = PoolMessage::ErrInvalidScript; result.consume_collateral = true; result.result = false; @@ -85,8 +85,8 @@ impl CoinJoinBaseSession { return result; } - if !set_scrip_pub_keys.insert(hex.clone()) { - log_error!(target: "CoinJoin", "ERROR: already have this script! scriptPubKey={}", hex); + if !set_scrip_pub_keys.insert(out_script.clone()) { + log_error!(target: "CoinJoin", "ERROR: already have this script! scriptPubKey={}", out_script); result.message_id = PoolMessage::ErrAlreadyHave; result.consume_collateral = true; result.result = false; @@ -113,7 +113,7 @@ impl CoinJoinBaseSession { } for tx_in in vin { - if tx_in.input_hash.0.is_empty() { + if tx_in.previous_output.txid.as_byte_array().is_empty() { log_error!(target: "CoinJoin", "ERROR: invalid input! {:?}", tx_in); result.message_id = PoolMessage::ErrInvalidInput; result.consume_collateral = true; @@ -123,7 +123,7 @@ impl CoinJoinBaseSession { } } - return result; + result } pub fn get_state_string(&self) -> &'static str { diff --git a/dash-spv-coinjoin/src/coinjoin_client_manager.rs b/dash-spv-coinjoin/src/coinjoin_client_manager.rs index bc74843f..cacc62f9 100644 --- a/dash-spv-coinjoin/src/coinjoin_client_manager.rs +++ b/dash-spv-coinjoin/src/coinjoin_client_manager.rs @@ -1,15 +1,30 @@ -use dash_spv_masternode_processor::{common::{Block, SocketAddress}, crypto::UInt256, ffi::{boxer::boxed_vec, from::FromFFI, unboxer::unbox_vec_ptr}, models::{MasternodeEntry, MasternodeList}, secp256k1::rand::{self, seq::SliceRandom, thread_rng, Rng}, tx::Transaction}; -use std::{cell::RefCell, collections::VecDeque, ffi::c_void, rc::Rc, time::{SystemTime, UNIX_EPOCH}}; -use tracing::{info, warn, debug, error}; +use std::{cell::RefCell, collections::VecDeque, rc::Rc, time::{SystemTime, UNIX_EPOCH}}; +use std::collections::HashMap; +use std::net::SocketAddr; +use std::os::raw::c_void; +use std::sync::{Arc, RwLock}; +use dashcore::blockdata::transaction::{OutPoint, Transaction}; +use dashcore::hashes::Hash; +use dashcore::hash_types::{ProTxHash, Txid}; +use dashcore::prelude::DisplayHex; +use dashcore::secp256k1::rand::{thread_rng, Rng}; +use dashcore::secp256k1::rand::prelude::SliceRandom; +use dashcore::sml::masternode_list::MasternodeList; +use dashcore::sml::masternode_list_entry::qualified_masternode_list_entry::QualifiedMasternodeListEntry; use logging::*; -use crate::{coinjoin::CoinJoin, coinjoin_client_queue_manager::CoinJoinClientQueueManager, coinjoin_client_session::CoinJoinClientSession, constants::{COINJOIN_AUTO_TIMEOUT_MAX, COINJOIN_AUTO_TIMEOUT_MIN}, ffi::callbacks::{DestroyMasternodeList, GetMasternodeList, IsWaitingForNewBlock, MixingLivecycleListener, SessionLifecycleListener, UpdateSuccessBlock}, messages::{coinjoin_message::CoinJoinMessage, CoinJoinQueueMessage, PoolState, PoolStatus}, models::{tx_outpoint::TxOutPoint, Balance, CoinJoinClientOptions}, wallet_ex::WalletEx}; - +use crate::{coinjoin::CoinJoin, coinjoin_client_session::CoinJoinClientSession, constants::{COINJOIN_AUTO_TIMEOUT_MAX, COINJOIN_AUTO_TIMEOUT_MIN}, messages::{coinjoin_message::CoinJoinMessage, CoinJoinQueueMessage, PoolState, PoolStatus}, models::{Balance, CoinJoinClientOptions}, wallet_ex::WalletEx}; +use crate::coin_selection::compact_tally_item::CompactTallyItem; +use crate::constants::COINJOIN_QUEUE_TIMEOUT; +use crate::masternode_meta_data_manager::MasternodeMetadataManager; +use crate::messages::PoolMessage; +use crate::provider::CoinJoinProvider; + +// #[ferment_macro::opaque] pub struct CoinJoinClientManager { pub wallet_ex: Rc>, - coinjoin: Rc>, - pub queue_queue_manager: Option>>, + coinjoin: Arc>, options: Rc>, - masternodes_used: Vec, + masternodes_used: Vec, last_masternode_used: usize, last_time_report_too_recent: u64, tick: i32, @@ -21,33 +36,52 @@ pub struct CoinJoinClientManager { str_auto_denom_result: String, stop_on_nothing_to_do: bool, mixing_finished: bool, - get_masternode_list: GetMasternodeList, - destroy_mn_list: DestroyMasternodeList, - update_success_block: UpdateSuccessBlock, - is_waiting_for_new_block: IsWaitingForNewBlock, - session_lifecycle_listener: SessionLifecycleListener, - mixing_lifecycle_listener: MixingLivecycleListener, - context: *const c_void + coinjoin_queue: Vec, + spamming_masternodes: HashMap, + pub masternode_metadata_manager: MasternodeMetadataManager, + + provider: Arc, } +#[ferment_macro::export] impl CoinJoinClientManager { - pub fn new( - wallet_ex: Rc>, - coinjoin: Rc>, - options: Rc>, - get_masternode_list: GetMasternodeList, - destroy_mn_list: DestroyMasternodeList, - update_success_block: UpdateSuccessBlock, - is_waiting_for_new_block: IsWaitingForNewBlock, - session_lifecycle_listener: SessionLifecycleListener, - mixing_lifecycle_listener: MixingLivecycleListener, + pub fn new< + GML: Fn(*const c_void) -> MasternodeList + 'static, + USB: Fn(*const c_void) + 'static, + IWFNB: Fn(*const c_void) -> bool + 'static, + SLL: Fn(*const c_void, bool, i32, [u8; 32], u32, PoolState, PoolMessage, PoolStatus, Option, bool) + 'static, + MLL: Fn(*const c_void, bool, bool, Vec) + 'static, + MBH: Fn(*const c_void, [u8; 32]) -> Option + 'static, + VMC: Fn(*const c_void) -> usize + 'static, + >( + wallet_ex: WalletEx, + coinjoin: CoinJoin, + options: CoinJoinClientOptions, + get_masternode_list: GML, + update_success_block: USB, + is_waiting_for_new_block: IWFNB, + session_lifecycle_listener: SLL, + mixing_lifecycle_listener: MLL, + masternode_by_hash: MBH, + valid_mns_count: VMC, + context: *const c_void - ) -> Self { + ) -> CoinJoinClientManager { + let provider = Arc::new(CoinJoinProvider::new( + get_masternode_list, + update_success_block, + is_waiting_for_new_block, + session_lifecycle_listener, + mixing_lifecycle_listener, + masternode_by_hash, + valid_mns_count, + context)); + + Self { - wallet_ex, - coinjoin, - queue_queue_manager: None, - options, + wallet_ex: Rc::new(RefCell::new(wallet_ex)), + coinjoin: Arc::new(RwLock::new(coinjoin)), + options: Rc::new(RefCell::new(options)), masternodes_used: vec![], last_masternode_used: 0, last_time_report_too_recent: 0, @@ -60,21 +94,19 @@ impl CoinJoinClientManager { str_auto_denom_result: String::new(), stop_on_nothing_to_do: false, mixing_finished: false, - get_masternode_list, - destroy_mn_list, - update_success_block, - is_waiting_for_new_block, - session_lifecycle_listener, - mixing_lifecycle_listener, - context + coinjoin_queue: Vec::new(), + spamming_masternodes: HashMap::new(), + masternode_metadata_manager: MasternodeMetadataManager::new(), + provider, } } - pub fn set_client_queue_manager(&mut self, queue_queue_manager: Rc>) { - self.queue_queue_manager = Some(queue_queue_manager); + pub fn process_raw_message(&mut self, from: SocketAddr, message: &[u8], message_type: &str) { + let coinjoin_message = CoinJoinMessage::from_message(message, message_type); + self.process_message(from, coinjoin_message); } - pub fn process_message(&mut self, from: SocketAddress, message: CoinJoinMessage) { + pub fn process_message(&mut self, from: SocketAddr, message: CoinJoinMessage) { if !self.options.borrow().enable_coinjoin { return; } @@ -84,7 +116,9 @@ impl CoinJoinClientManager { } if let CoinJoinMessage::BroadcastTx(broadcast_tx) = message { - self.coinjoin.borrow_mut().add_dstx(broadcast_tx.clone()); + let mut lock = self.coinjoin.write().unwrap(); + lock.add_dstx(broadcast_tx.clone()); + drop(lock); } else { let mut update_success_block = false; @@ -100,14 +134,14 @@ impl CoinJoinClientManager { pub fn start_mixing(&mut self) -> bool { self.queue_mixing_lifecycle_listeners(false, false); - + if !self.is_mixing { self.is_mixing = true; self.is_shutting_down = false; - return true; + true + } else { + false } - - return false; } pub fn set_stop_on_nothing_to_do(&mut self, stop: bool) { @@ -130,9 +164,9 @@ impl CoinJoinClientManager { return; } - if let Some(queue_manager) = &self.queue_queue_manager { - queue_manager.borrow_mut().do_maintenance(); - } + self.check_queue(); + let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); + self.spamming_masternodes.retain(|_, v| (*v + COINJOIN_QUEUE_TIMEOUT) > current_time); self.tick += 1; self.check_timeout(); @@ -140,24 +174,24 @@ impl CoinJoinClientManager { if self.do_auto_next_run >= self.tick && !self.is_shutting_down { self.do_automatic_denominating(balance_info, false); - let mut rng = rand::thread_rng(); + let mut rng = thread_rng(); self.do_auto_next_run = self.tick + COINJOIN_AUTO_TIMEOUT_MIN + rng.gen_range(0..COINJOIN_AUTO_TIMEOUT_MAX - COINJOIN_AUTO_TIMEOUT_MIN); } // are all sessions idle? let mut is_idle = !self.deq_sessions.is_empty(); // false if no sessions created yet - + for session in &self.deq_sessions { if !session.has_nothing_to_do { is_idle = false; break; } } - + // if all sessions idle, then trigger stop mixing if is_idle { let statuses = self.get_sessions_status(); - + for status in statuses { if status == PoolStatus::Finished || (status.is_error() && !self.continue_mixing_on_status.contains(&status)) { self.trigger_mixing_finished(); @@ -172,10 +206,7 @@ impl CoinJoinClientManager { } self.is_shutting_down = true; - - if let Some(queue_manager) = &self.queue_queue_manager { - queue_manager.borrow_mut().set_null(); - } + self.coinjoin_queue.clear(); } pub fn do_automatic_denominating(&mut self, balance_info: Balance, dry_run: bool) -> bool { @@ -214,72 +245,67 @@ impl CoinJoinClientManager { log_warn!(target: "CoinJoin", "masternodesUsed: new size: {}, threshold: {}", self.masternodes_used.len(), threshold_high); } - if let Some(queue_manager) = &self.queue_queue_manager { - let mut result = true; - - if self.deq_sessions.len() < self.options.borrow().coinjoin_sessions as usize { - let new_session = CoinJoinClientSession::new( - self.coinjoin.clone(), - self.options.clone(), - self.wallet_ex.clone(), - queue_manager.clone(), - self.session_lifecycle_listener, - self.context - ); - - log_info!(target: "CoinJoin", "creating new session, current session amount: {}", self.deq_sessions.len()); - self.deq_sessions.push_back(new_session); - } + let mut result = true; - let mut sessions_to_process: Vec<_> = self.deq_sessions.drain(..).collect(); + if self.deq_sessions.len() < self.options.borrow().coinjoin_sessions as usize { + let new_session = CoinJoinClientSession::new( + self.coinjoin.clone(), + self.options.clone(), + self.wallet_ex.clone(), + // queue_manager.clone(), + Arc::clone(&self.provider) + ); - for session in sessions_to_process.iter_mut() { - // (DashJ) we may not need this - if !dry_run && self.is_waiting_for_new_block() { - let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); - - if current_time - self.last_time_report_too_recent > 15 { - self.str_auto_denom_result = "Last successful action was too recent.".to_string(); - log_info!(target: "CoinJoin", "do_automatic_denominating {}", self.str_auto_denom_result); - self.last_time_report_too_recent = current_time; - } - - result = false; - break; + log_info!(target: "CoinJoin", "creating new session, current session amount: {}", self.deq_sessions.len()); + self.deq_sessions.push_back(new_session); + } + + let mut sessions_to_process: Vec<_> = self.deq_sessions.drain(..).collect(); + + for session in sessions_to_process.iter_mut() { + // (DashJ) we may not need this + if !dry_run && self.is_waiting_for_new_block() { + let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); + + if current_time - self.last_time_report_too_recent > 15 { + self.str_auto_denom_result = "Last successful action was too recent.".to_string(); + log_info!(target: "CoinJoin", "do_automatic_denominating {}", self.str_auto_denom_result); + self.last_time_report_too_recent = current_time; } - - result &= session.do_automatic_denominating(self, dry_run, balance_info.clone()); - } - self.deq_sessions.extend(sessions_to_process); + result = false; + break; + } - return result; + result &= session.do_automatic_denominating(self, dry_run, balance_info.clone()); } - - return false; + + self.deq_sessions.extend(sessions_to_process); + + result } - - pub fn finish_automatic_denominating(&mut self, client_session_id: UInt256) -> bool { + + pub fn finish_automatic_denominating(&mut self, client_session_id: [u8; 32]) -> bool { let mut sessions: Vec<_> = self.deq_sessions.drain(..).collect(); let mut finished = false; - + for session in &mut sessions { if session.id == client_session_id { finished = session.finish_automatic_denominating(self); break; } } - + self.deq_sessions.extend(sessions); - - return finished; + + finished } - pub fn add_used_masternode(&mut self, pro_tx_hash: UInt256) { + pub fn add_used_masternode(&mut self, pro_tx_hash: ProTxHash) { self.masternodes_used.push(pro_tx_hash); } - pub fn get_random_not_used_masternode(&self) -> Option { + pub fn get_random_not_used_masternode(&self) -> Option { let mn_list = self.get_mn_list(); let count_enabled = self.get_valid_mns_count(&mn_list); let count_not_excluded = count_enabled - self.masternodes_used.len(); @@ -289,8 +315,8 @@ impl CoinJoinClientManager { } // fill a vector - let mut vp_masternodes_shuffled: Vec<&MasternodeEntry> = Vec::with_capacity(count_enabled); - mn_list.masternodes.values().filter(|mn| mn.is_valid).for_each(|mn| { + let mut vp_masternodes_shuffled: Vec<&QualifiedMasternodeListEntry> = Vec::with_capacity(count_enabled); + mn_list.masternodes.values().filter(|mn| mn.masternode_list_entry.is_valid).for_each(|mn| { vp_masternodes_shuffled.push(mn); }); @@ -300,34 +326,17 @@ impl CoinJoinClientManager { // loop through for dmn in vp_masternodes_shuffled { - if self.masternodes_used.contains(&dmn.provider_registration_transaction_hash) { + if self.masternodes_used.contains(&dmn.masternode_list_entry.pro_reg_tx_hash) { continue; } - log_info!(target: "CoinJoin", "mn found, proTxHash={}", dmn.provider_registration_transaction_hash); + log_info!(target: "CoinJoin", "mn found, proTxHash={}", dmn.masternode_list_entry.pro_reg_tx_hash.as_byte_array().to_lower_hex_string()); return Some(dmn.clone()); } log_error!(target: "CoinJoin", "failed get_random_not_used_masternode"); - return None; + None } - - pub fn updated_success_block(&mut self) { - unsafe { - (self.update_success_block)(self.context); - } - } - - pub fn get_mn_list(&self) -> MasternodeList { - unsafe { - let raw_mn_list = (self.get_masternode_list)(self.context); - let mn_list = (*raw_mn_list).decode(); - (self.destroy_mn_list)(raw_mn_list); - - mn_list - } - } - pub fn process_pending_dsa_request(&mut self) { for session in self.deq_sessions.iter_mut() { if session.process_pending_dsa_request() { @@ -338,70 +347,103 @@ impl CoinJoinClientManager { pub fn get_sessions_status(&self) -> Vec { let mut sessions_status = Vec::new(); - + for session in self.deq_sessions.iter() { sessions_status.push(session.base_session.status); } - - return sessions_status; + sessions_status } pub fn is_waiting_for_new_block(&self) -> bool { - return unsafe { (self.is_waiting_for_new_block)(self.context) }; + self.provider.is_waiting_for_new_block() } - pub fn try_submit_denominate(&mut self, mn_addr: SocketAddress) -> bool { - for session in self.deq_sessions.iter_mut() { - if let Some(mn_mixing) = &session.mixing_masternode { - if mn_mixing.socket_address == mn_addr && session.base_session.state == PoolState::Queue { - session.submit_denominate(); - return true; - } else { - log_debug!(target: "CoinJoin", "mixingMasternode {} != mnAddr {} or {:?} != {:?}", mn_mixing.socket_address, mn_addr, session.base_session.state, PoolState::Queue); + pub fn refresh_unused_keys(&mut self) { + self.wallet_ex.borrow_mut().refresh_unused_keys(); + } + pub fn check_if_is_fully_mixed(&mut self, outpoint: OutPoint) -> bool { + self.wallet_ex.borrow_mut().check_if_is_fully_mixed(outpoint) + } + + pub fn process_ds_queue(&mut self, from_peer: SocketAddr, message: &[u8]) { + let mut dsq = CoinJoinQueueMessage::from_message(message); + // process every dsq only once + for q in self.coinjoin_queue.iter() { + if q == &dsq { + return; + } + + if q.ready == dsq.ready && q.pro_tx_hash == dsq.pro_tx_hash { + // no way the same mn can send another dsq with the same readiness this soon + if !self.spamming_masternodes.contains_key(&dsq.pro_tx_hash) { + let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); + self.spamming_masternodes.insert(dsq.pro_tx_hash, current_time); + log_debug!(target: "CoinJoin", "Peer {:?} is sending WAY too many dsq messages for a masternode {:?}", from_peer.ip(), dsq.pro_tx_hash); } - } else { - log_debug!(target: "CoinJoin", "mixingMasternode is None"); + return; } } - return false; - } + let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); - pub fn mark_already_joined_queue_as_tried(&mut self, dsq: &mut CoinJoinQueueMessage) -> bool { - for session in self.deq_sessions.iter_mut() { - if let Some(mn_mixing) = &session.mixing_masternode { - if mn_mixing.provider_registration_transaction_hash == dsq.pro_tx_hash { - dsq.tried = true; - return true; + if dsq.is_time_out_of_bounds(current_time) { + return; + } + + if let Some(dmn) = self.provider.get_masternode_by_hash(dsq.pro_tx_hash.to_byte_array()) { + if !dsq.check_signature(dmn.masternode_list_entry.operator_public_key.0, false) { + // add 10 points to ban score + return; + } + + // if the queue is ready, submit if we can + if dsq.ready && self.try_submit_denominate(dmn.masternode_list_entry.service_address.clone()) { + log_info!(target: "CoinJoin", "CoinJoin queue ({}) is ready on masternode {}", dsq, dmn.masternode_list_entry.service_address); + } else { + if let Some(meta_info) = self.masternode_metadata_manager.get_meta_info(dmn.masternode_list_entry.pro_reg_tx_hash, true) { + let last_dsq = meta_info.last_dsq; + let dsq_threshold = self.masternode_metadata_manager.get_dsq_threshold(dmn.masternode_list_entry.pro_reg_tx_hash, self.provider.get_valid_mns_count()); + + // don't allow a few nodes to dominate the queuing process + if last_dsq != 0 && dsq_threshold > self.masternode_metadata_manager.dsq_count { + if !self.spamming_masternodes.contains_key(&dsq.pro_tx_hash) { + let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); + self.spamming_masternodes.insert(dsq.pro_tx_hash, current_time); + log_info!(target: "CoinJoin", "Masternode {} is sending too many dsq messages", dmn.masternode_list_entry.pro_reg_tx_hash.to_string()); + } + return; + } + } else { + return; } + + self.masternode_metadata_manager.allow_mixing(dmn.masternode_list_entry.pro_reg_tx_hash); + let log_msg = format!("new CoinJoin queue ({}) from masternode {}", dsq, dmn.masternode_list_entry.service_address.to_string()); + + if dsq.ready { + log_info!(target: "CoinJoin", "{}", log_msg); + } else { + log_debug!(target: "CoinJoin", "{}", log_msg); + } + // TODO: actually it doesn't make sense since 'tried' is never used after + dsq.tried = self.mark_already_joined_queue_as_tried(&dsq.pro_tx_hash); + self.coinjoin_queue.push(dsq); } } - - return false; } - - pub fn update_block_tip(&mut self, block: Block) { - self.coinjoin.borrow_mut().update_block_tip(block) + pub fn update_block_tip(&mut self, block_height: u32) { + let mut lock = self.coinjoin.write().unwrap(); + lock.update_block_tip(block_height); + drop(lock); } - - pub fn is_mixing_fee_tx(&mut self, tx_id: UInt256) -> bool { - for session in &mut self.deq_sessions { + pub fn is_mixing_fee_tx(&self, tx_id: &Txid) -> bool { + for session in &self.deq_sessions { if session.is_mixing_fee_tx(tx_id) { return true; } } - - return false; + false } - - pub fn refresh_unused_keys(&mut self) { - self.wallet_ex.borrow_mut().refresh_unused_keys(); - } - - pub fn process_used_scripts(&mut self, scripts: &Vec>) { - self.wallet_ex.borrow_mut().process_used_scripts(scripts); - } - pub fn change_options(&mut self, new_options: CoinJoinClientOptions) { if new_options != *self.options.borrow() { if self.options.borrow().enable_coinjoin || new_options.enable_coinjoin { @@ -410,9 +452,13 @@ impl CoinJoinClientManager { *self.options.borrow_mut() = new_options.clone(); } } + pub fn process_used_scripts(&mut self, scripts: &Vec>) { + self.wallet_ex.borrow_mut().process_used_scripts(scripts); + } + - pub fn get_real_outpoint_coinjoin_rounds(&mut self, outpoint: TxOutPoint, rounds: i32) -> i32 { - return self.wallet_ex.borrow_mut().get_real_outpoint_coinjoin_rounds(outpoint, rounds); + pub fn get_real_outpoint_coinjoin_rounds(&mut self, outpoint: OutPoint, rounds: i32) -> i32 { + self.wallet_ex.borrow_mut().get_real_outpoint_coinjoin_rounds(outpoint, rounds) } pub fn reset_pool(&mut self) { @@ -425,32 +471,97 @@ impl CoinJoinClientManager { self.tick = 0; self.do_auto_next_run = COINJOIN_AUTO_TIMEOUT_MIN; } + pub fn stop_and_reset(&mut self) { + if self.is_mixing { + self.reset_pool(); + self.stop_mixing(); + } + } + + pub fn has_collateral_inputs(&self, only_confirmed: bool) -> bool { + self.wallet_ex.borrow().has_collateral_inputs(only_confirmed) + } + + pub fn is_locked_coin(&self, outpoint: &OutPoint) -> bool { + self.wallet_ex.borrow().locked_coins_set.contains(outpoint) + } - pub fn lock_outputs(&mut self, tx_hash: UInt256, indices: Vec) { + pub fn lock_outputs(&mut self, tx_hash: Txid, indices: Vec) { for index in indices { - self.wallet_ex.borrow_mut().lock_coin(TxOutPoint::new(tx_hash, index)); + self.wallet_ex.borrow_mut().lock_coin(OutPoint::new(tx_hash, index)); } } pub fn unlock_outputs(&mut self, tx: &Transaction) { - for input in tx.inputs.iter() { - self.wallet_ex.borrow_mut().unlock_coin(&TxOutPoint::new(input.input_hash, input.index)); + for input in tx.input.iter() { + self.wallet_ex.borrow_mut().unlock_coin(&input.previous_output); } } pub fn session_amount(&self) -> usize { - let mut len = self.deq_sessions.len(); + let len = self.deq_sessions.len(); println!("[RUST] CoinJoin: sessions {:?}", len); for session in self.deq_sessions.iter() { println!("[RUST] CoinJoin: session status: {:?}", session.base_session.status); } - return len; + len } + pub fn select_coins_grouped_by_addresses( + &mut self, + skip_denominated: bool, + anonymizable: bool, + skip_unconfirmed: bool, + max_outpoints_per_address: i32) -> Vec { + self.wallet_ex.borrow_mut().select_coins_grouped_by_addresses(skip_denominated, anonymizable, skip_unconfirmed, max_outpoints_per_address) + } + + pub fn get_anonymizable_balance(&mut self, skip_denominated: bool, skip_unconfirmed: bool) -> u64 { + self.wallet_ex.borrow_mut().get_anonymizable_balance(skip_denominated, skip_unconfirmed) + } +} + +impl CoinJoinClientManager { + + + pub fn updated_success_block(&self) { + self.provider.update_success_block() + } + + pub fn get_mn_list(&self) -> MasternodeList { + self.provider.get_current_masternode_list() + } + + fn mark_already_joined_queue_as_tried(&mut self, pro_tx_hash: &ProTxHash) -> bool { + for session in self.deq_sessions.iter_mut() { + if let Some(mn_mixing) = &session.mixing_masternode { + if pro_tx_hash.eq(&mn_mixing.masternode_list_entry.pro_reg_tx_hash) { + return true; + } + } + } + false + } + fn try_submit_denominate(&mut self, mn_addr: SocketAddr) -> bool { + for session in self.deq_sessions.iter_mut() { + if let Some(mn_mixing) = &session.mixing_masternode { + if mn_mixing.masternode_list_entry.service_address == mn_addr && session.base_session.state == PoolState::Queue { + session.submit_denominate(); + return true; + } else { + log_debug!(target: "CoinJoin", "mixingMasternode {} != mnAddr {} or {:?} != {:?}", mn_mixing.masternode_list_entry.service_address, mn_addr, session.base_session.state, PoolState::Queue); + } + } else { + log_debug!(target: "CoinJoin", "mixingMasternode is None"); + } + } + + false + } fn get_valid_mns_count(&self, mn_list: &MasternodeList) -> usize { - mn_list.masternodes.values().filter(|mn| mn.is_valid).count() + mn_list.masternodes.values().filter(|mn| mn.masternode_list_entry.is_valid).count() } fn check_timeout(&mut self) { @@ -497,12 +608,24 @@ impl CoinJoinClientManager { fn queue_mixing_lifecycle_listeners(&self, is_complete: bool, is_interrupted: bool) { let statuses: Vec = self.deq_sessions.iter().map(|x| x.base_session.status).collect(); - let length = statuses.len(); + self.provider.queue_mixing_lifecycle(is_complete, is_interrupted, statuses); + } - unsafe { - let boxed_statuses = boxed_vec(statuses); - (self.mixing_lifecycle_listener)(is_complete, is_interrupted, boxed_statuses, length, self.context); - unbox_vec_ptr(boxed_statuses, length); + pub fn check_queue(&mut self) { + let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); + self.coinjoin_queue.retain(|q| !q.is_time_out_of_bounds(current_time)); + } + + pub fn get_queue_item_and_try(&mut self) -> Option { + for dsq in self.coinjoin_queue.iter_mut() { + let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); + + if !dsq.tried && !dsq.is_time_out_of_bounds(current_time) { + dsq.tried = true; + return Some(dsq.clone()); + } } + None } + } diff --git a/dash-spv-coinjoin/src/coinjoin_client_queue_manager.rs b/dash-spv-coinjoin/src/coinjoin_client_queue_manager.rs deleted file mode 100644 index d5570b79..00000000 --- a/dash-spv-coinjoin/src/coinjoin_client_queue_manager.rs +++ /dev/null @@ -1,163 +0,0 @@ -use std::collections::HashMap; -use dash_spv_masternode_processor::{common::SocketAddress, crypto::UInt256, ffi::{boxer::boxed, from::FromFFI, unboxer::unbox_any}, models::MasternodeEntry}; -use std::time::{SystemTime, UNIX_EPOCH}; -use tracing::{debug, info, warn}; -use logging::*; -use crate::{coinjoin_client_manager::CoinJoinClientManager, constants::COINJOIN_QUEUE_TIMEOUT, ffi::callbacks::{DestroyMasternode, MasternodeByHash, ValidMasternodeCount}, masternode_meta_data_manager::MasternodeMetadataManager, messages::CoinJoinQueueMessage}; - -pub struct CoinJoinClientQueueManager { - client_manager_ptr: *mut CoinJoinClientManager, - coinjoin_queue: Vec, - spamming_masternodes: HashMap, - pub masternode_metadata_manager: MasternodeMetadataManager, - masternode_by_hash: MasternodeByHash, - destroy_masternode: DestroyMasternode, - valid_mns_count: ValidMasternodeCount, - context: *const std::ffi::c_void -} - -impl CoinJoinClientQueueManager { - pub fn new( - client_manager_ptr: *mut CoinJoinClientManager, - masternode_metadata_manager: MasternodeMetadataManager, - masternode_by_hash: MasternodeByHash, - destroy_masternode: DestroyMasternode, - valid_mns_count: ValidMasternodeCount, - context: *const std::ffi::c_void - ) -> Self { - Self { - client_manager_ptr, - coinjoin_queue: Vec::new(), - spamming_masternodes: HashMap::new(), - masternode_by_hash, - destroy_masternode, - masternode_metadata_manager, - valid_mns_count, - context - } - } - - pub fn set_null(&mut self) { - self.coinjoin_queue.clear(); - } - - pub fn check_queue(&mut self) { - let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); - self.coinjoin_queue.retain(|q| !q.is_time_out_of_bounds(current_time)); - } - - pub fn get_queue_item_and_try(&mut self) -> Option { - for dsq in self.coinjoin_queue.iter_mut() { - let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); - - if !dsq.tried && !dsq.is_time_out_of_bounds(current_time) { - dsq.tried = true; - return Some(dsq.clone()); - } - } - None - } - - pub fn process_ds_queue(&mut self, from_peer: SocketAddress, mut dsq: CoinJoinQueueMessage) { - // let mut client_manager = (*self.client_manager_ptr); - - // process every dsq only once - for q in self.coinjoin_queue.iter() { - if q == &dsq { - return; - } - - if q.ready == dsq.ready && q.pro_tx_hash == dsq.pro_tx_hash { - // no way the same mn can send another dsq with the same readiness this soon - if !self.spamming_masternodes.contains_key(&dsq.pro_tx_hash) { - let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); - self.spamming_masternodes.insert(dsq.pro_tx_hash, current_time); - log_debug!(target: "CoinJoin", "Peer {:?} is sending WAY too many dsq messages for a masternode {:?}", from_peer.ip_address, dsq.pro_tx_hash); - } - return; - } - } - - let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); - - if dsq.is_time_out_of_bounds(current_time) { - return; - } - - if let Some(dmn) = self.get_mn(dsq.pro_tx_hash) { - if !dsq.check_signature(dmn.operator_public_key) { - // add 10 points to ban score - return; - } - - // if the queue is ready, submit if we can - if dsq.ready && self.try_submit_denominate(dmn.socket_address.clone()) { - log_info!(target: "CoinJoin", "CoinJoin queue ({}) is ready on masternode {}", dsq, dmn.socket_address); - } else { - if let Some(meta_info) = self.masternode_metadata_manager.get_meta_info(dmn.provider_registration_transaction_hash, true) { - let last_dsq = meta_info.last_dsq; - let dsq_threshold = self.masternode_metadata_manager.get_dsq_threshold(dmn.provider_registration_transaction_hash, self.valid_mns_count()); - - // don't allow a few nodes to dominate the queuing process - if last_dsq != 0 && dsq_threshold > self.masternode_metadata_manager.dsq_count { - if !self.spamming_masternodes.contains_key(&dsq.pro_tx_hash) { - let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); - self.spamming_masternodes.insert(dsq.pro_tx_hash, current_time); - log_info!(target: "CoinJoin", "Masternode {} is sending too many dsq messages", dmn.provider_registration_transaction_hash); - } - return; - } - } else { - return; - } - - self.masternode_metadata_manager.allow_mixing(dmn.provider_registration_transaction_hash); - let log_msg = format!("new CoinJoin queue ({}) from masternode {}", dsq, dmn.socket_address); - - if dsq.ready { - log_info!(target: "CoinJoin", "{}", log_msg); - } else { - log_debug!(target: "CoinJoin", "{}", log_msg); - } - - self.mark_already_joined_queue_as_tried(&mut dsq); - self.coinjoin_queue.push(dsq); - } - } - } - - pub fn do_maintenance(&mut self) { - self.check_queue(); - let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); - self.spamming_masternodes.retain(|_, v| (*v + COINJOIN_QUEUE_TIMEOUT as u64) > current_time); - } - - fn get_mn(&self, pro_tx_hash: UInt256) -> Option { - unsafe { - let boxed_hash = boxed(pro_tx_hash.0); - let mn = (self.masternode_by_hash)(boxed_hash, self.context); - - if mn.is_null() { - return None; - } - - let masternode = (*mn).decode(); - (self.destroy_masternode)(mn); - unbox_any(boxed_hash); - - return Some(masternode); - } - } - - fn valid_mns_count(&self) -> u64 { - unsafe { return (self.valid_mns_count)(self.context); } - } - - fn try_submit_denominate(&mut self, mn_addr: SocketAddress) -> bool { - unsafe { (*self.client_manager_ptr).try_submit_denominate(mn_addr) } - } - - fn mark_already_joined_queue_as_tried(&mut self, dsq: &mut CoinJoinQueueMessage) -> bool { - unsafe { (*self.client_manager_ptr).mark_already_joined_queue_as_tried(dsq) } - } -} \ No newline at end of file diff --git a/dash-spv-coinjoin/src/coinjoin_client_session.rs b/dash-spv-coinjoin/src/coinjoin_client_session.rs index ebc87620..46bae05f 100644 --- a/dash-spv-coinjoin/src/coinjoin_client_session.rs +++ b/dash-spv-coinjoin/src/coinjoin_client_session.rs @@ -1,35 +1,32 @@ use std::cell::RefCell; use std::cmp::Ordering; use std::collections::{HashMap, HashSet}; -use std::ffi::c_void; +use std::net::SocketAddr; use std::rc::Rc; +use std::sync::{Arc, RwLock}; use std::time::{SystemTime, UNIX_EPOCH}; +use dashcore::secp256k1::rand; +use dashcore::secp256k1::rand::Rng; +use dashcore::blockdata::script::ScriptBuf; +use dashcore::blockdata::transaction::{OutPoint, Transaction, txin::TxIn, txout::TxOut}; +use dashcore::consensus::Encodable; +use dashcore::hashes::Hash; +use dashcore::hash_types::Txid; +use dashcore::opcodes::all::OP_RETURN; +use dashcore::prelude::DisplayHex; +use dashcore::script::Builder; +use dashcore::sml::masternode_list_entry::qualified_masternode_list_entry::QualifiedMasternodeListEntry; +use dash_spv_crypto::crypto::byte_util::{Random, Reversed}; +use dash_spv_crypto::network::TXIN_SEQUENCE; +use dash_spv_crypto::util::params::DUFFS; use logging::*; -use tracing::{info, warn, error, debug}; -use dash_spv_masternode_processor::blockdata::opcodes::all::OP_RETURN; -use dash_spv_masternode_processor::chain::params::DUFFS; -use dash_spv_masternode_processor::chain::tx::protocol::{TXIN_SEQUENCE, TX_UNCONFIRMED}; -use dash_spv_masternode_processor::common::SocketAddress; -use dash_spv_masternode_processor::consensus::Encodable; -use dash_spv_masternode_processor::crypto::byte_util::{Random, Reversable}; -use dash_spv_masternode_processor::crypto::{UInt128, UInt256}; -use dash_spv_masternode_processor::ffi::boxer::boxed; -use dash_spv_masternode_processor::ffi::unboxer::unbox_any; -use dash_spv_masternode_processor::models::MasternodeEntry; -use dash_spv_masternode_processor::secp256k1::rand::{self, Rng}; -use dash_spv_masternode_processor::tx::{Transaction, TransactionInput, TransactionOutput, TransactionType}; -use dash_spv_masternode_processor::util::script::ScriptType; - use crate::coinjoin::CoinJoin; use crate::coinjoin_client_manager::CoinJoinClientManager; -use crate::coinjoin_client_queue_manager::CoinJoinClientQueueManager; use crate::constants::{COINJOIN_DENOM_OUTPUTS_THRESHOLD, COINJOIN_ENTRY_MAX_SIZE, COINJOIN_QUEUE_TIMEOUT, COINJOIN_SIGNING_TIMEOUT, DEFAULT_COINJOIN_DENOMS_GOAL, DEFAULT_COINJOIN_DENOMS_HARDCAP}; -use crate::ffi::callbacks::SessionLifecycleListener; use crate::messages::{CoinJoinAcceptMessage, CoinJoinCompleteMessage, CoinJoinEntry, CoinJoinFinalTransaction, CoinJoinSignedInputs, CoinJoinStatusUpdate, PoolMessage, PoolStatusUpdate}; use crate::models::coin_control::{CoinControl, CoinType}; use crate::models::coinjoin_transaction_input::CoinJoinTransactionInput; use crate::models::reserve_destination::ReserveDestination; -use crate::models::tx_outpoint::TxOutPoint; use crate::messages::{pool_state::PoolState, pool_status::PoolStatus}; use crate::models::pending_dsa_request::PendingDsaRequest; use crate::models::{CoinJoinClientOptions, Balance}; @@ -40,48 +37,47 @@ use crate::coin_selection::compact_tally_item::CompactTallyItem; use crate::utils::transaction_builder::TransactionBuilder; use crate::wallet_ex::WalletEx; use crate::messages::coinjoin_message::{CoinJoinMessageType, CoinJoinMessage}; +use crate::provider::CoinJoinProvider; pub struct CoinJoinClientSession { - pub id: UInt256, - coinjoin: Rc>, + pub id: [u8; 32], + coinjoin: Arc>, mixing_wallet: Rc>, - queue_manager: Rc>, + // queue_manager: Rc>, pub base_session: CoinJoinBaseSession, options: Rc>, key_holder_storage: KeyHolderStorage, last_create_denominated_result: bool, - pub outpoints_locked: Vec, - pub mixing_masternode: Option, + pub outpoints_locked: Vec, + pub mixing_masternode: Option, pending_dsa_request: Option, tx_my_collateral: Option, is_my_collateral_valid: bool, - collateral_session_map: HashMap, + collateral_session_map: HashMap, balance_needs_anonymized: u64, joined: bool, // did we join a session (true), or start a session (false) pub has_nothing_to_do: bool, str_auto_denom_result: String, str_last_message: String, - session_lifecycle_listener: SessionLifecycleListener, - context: *const c_void + provider: Arc, } impl CoinJoinClientSession { pub fn new( - coinjoin: Rc>, + coinjoin: Arc>, options: Rc>, wallet_ex: Rc>, - client_queue_manager: Rc>, - session_lifecycle_listener: SessionLifecycleListener, - context: *const c_void + // client_queue_manager: Rc>, + provider: Arc, ) -> Self { Self { - id: UInt256::random(), - coinjoin: coinjoin, + id: <[u8; 32]>::random(), + coinjoin, mixing_wallet: wallet_ex, - queue_manager: client_queue_manager, + // queue_manager: client_queue_manager, base_session: CoinJoinBaseSession::new(), key_holder_storage: KeyHolderStorage::new(), - options: options, + options, last_create_denominated_result: true, outpoints_locked: Vec::new(), mixing_masternode: None, @@ -94,8 +90,7 @@ impl CoinJoinClientSession { has_nothing_to_do: false, str_auto_denom_result: String::new(), str_last_message: String::new(), - session_lifecycle_listener, - context + provider, } } @@ -118,7 +113,7 @@ impl CoinJoinClientSession { let balance_anonymized = balance_info.anonymized; let sub_res = self.options.borrow().coinjoin_amount.checked_sub(balance_anonymized); - + if sub_res.is_none() || sub_res.unwrap() == 0 { log_info!(target: "CoinJoin", "CoinJoinClientSession::do_automatic_denominating -- Nothing to do"); // nothing to do, just keep it in idle mode @@ -142,12 +137,12 @@ impl CoinJoinClientSession { // mixable balance is way too small if balance_anonymizable < value_min { let balance_left_to_mix = self.mixing_wallet.borrow_mut().get_anonymizable_balance(false, false); - + if !dry_run && balance_left_to_mix < value_min { self.set_status(PoolStatus::ErrNotEnoughFunds); self.queue_session_lifecycle_listeners(true, self.base_session.state, PoolMessage::ErrSession, PoolStatus::ErrNotEnoughFunds); } - + log_info!(target: "CoinJoin", "skipping, balance_anonymizable: {}, balance_left_to_mix: {}, value_min: {}, dry_run: {}", balance_anonymizable, balance_left_to_mix, value_min, dry_run); return false; } @@ -160,14 +155,14 @@ impl CoinJoinClientSession { log_info!(target: "CoinJoin", "balance_to_denominate: {}, dry_run: {}", balance_to_denominate, dry_run); // Adjust balance_needs_anonymized to consume final denom - if balance_denominated.saturating_sub(balance_anonymized) > balance_needs_anonymized as u64 { + if balance_denominated.saturating_sub(balance_anonymized) > balance_needs_anonymized { log_info!(target: "CoinJoin", "adjusting balance_needs_anonymized to consume final denom"); let denoms = CoinJoin::get_standard_denominations(); let mut additional_denom: u64 = 0; - + for denom in denoms { - if (balance_needs_anonymized as u64) < *denom { - additional_denom = *denom; + if balance_needs_anonymized < denom { + additional_denom = denom; } else { break; } @@ -192,7 +187,7 @@ impl CoinJoinClientSession { // there are funds to denominate and denominated balance does not exceed // max amount to mix yet. self.last_create_denominated_result = false; - + if balance_anonimizable_non_denom >= value_min + CoinJoin::get_max_collateral_amount() && balance_to_denominate >= CoinJoin::get_smallest_denomination() { self.last_create_denominated_result = self.create_denominated(client_manager, balance_to_denominate, dry_run); } @@ -211,14 +206,12 @@ impl CoinJoinClientSession { if self.last_create_denominated_result { log_debug!(target: "CoinJoin", "auto_denom: wait for finish callback"); // If transaction was commited, return and wait for obj-c to call finish_automatic_denominating - return true; } else { log_debug!(target: "CoinJoin", "auto_denom: proceed immediately"); // If no transactions were commited, call finish_automatic_denominating directly self.finish_automatic_denominating(client_manager); - - return true; } + true } pub fn finish_automatic_denominating(&mut self, client_manager: &mut CoinJoinClientManager) -> bool { @@ -234,7 +227,7 @@ impl CoinJoinClientSession { // check if we have the collateral sized inputs if !self.mixing_wallet.borrow_mut().has_collateral_inputs(true) { let result = !self.mixing_wallet.borrow_mut().has_collateral_inputs(false) && self.make_collateral_amounts(client_manager); - + if !result && !self.last_create_denominated_result { self.set_status(PoolStatus::ErrNoInputs); } @@ -247,7 +240,7 @@ impl CoinJoinClientSession { log_info!(target: "CoinJoin", "base_session.session_id != 0"); return false; } - + // Initial phase, find a Masternode // Clean if there is anything left from previous session self.unlock_coins(); @@ -271,12 +264,12 @@ impl CoinJoinClientSession { } }, Some(collateral) => { - if !self.is_my_collateral_valid || !self.coinjoin.borrow().is_collateral_valid(&collateral, true) { - log_info!(target: "CoinJoin", "invalid collateral, recreating... [id: {}] ", self.id); - let output = &collateral.outputs[0]; - - if output.script_pub_key_type() == ScriptType::PayToPubkeyHash { - self.mixing_wallet.borrow_mut().add_unused_key(&output.script); + if !self.is_my_collateral_valid || !self.coinjoin.read().unwrap().is_collateral_valid(&collateral, true) { + log_info!(target: "CoinJoin", "invalid collateral, recreating... [id: {}] ", self.id.to_lower_hex_string()); + let output = &collateral.output[0]; + + if output.script_pubkey.is_p2pkh() { + self.mixing_wallet.borrow_mut().add_unused_key(output.script_pubkey.to_bytes()); } if !self.create_collateral_transaction(&mut reason) { @@ -286,10 +279,10 @@ impl CoinJoinClientSession { } // lock the funds we're going to use for our collateral - for txin in &collateral.inputs { - let outpoint = TxOutPoint::new(txin.input_hash, txin.index); - self.mixing_wallet.borrow_mut().lock_coin(outpoint.clone()); - self.outpoints_locked.push(outpoint); + for txin in &collateral.input { + // let outpoint = TxOutPoint::new(txin.input_hash, txin.index); + self.mixing_wallet.borrow_mut().lock_coin(txin.previous_output.clone()); + self.outpoints_locked.push(txin.previous_output.clone()); } } } @@ -307,10 +300,10 @@ impl CoinJoinClientSession { if self.start_new_queue(client_manager, balance_needs_anonymized) { return true; } - + self.set_status(PoolStatus::WarnNoCompatibleMasternode); - return false; + false } pub fn process_pending_dsa_request(&mut self) -> bool { @@ -321,8 +314,8 @@ impl CoinJoinClientSession { self.base_session.time_last_successful_step = current_time; let mut buffer = vec![]; pending_request.dsa.consensus_encode(&mut buffer).unwrap(); - message_sent = self.mixing_wallet.borrow_mut().send_message(buffer, pending_request.dsa.get_message_type(), &pending_request.addr, false); - + message_sent = self.mixing_wallet.borrow().send_message(buffer, pending_request.dsa.get_message_type(), pending_request.addr, false); + if message_sent { log_info!(target: "CoinJoin", "sent dsa to {}", pending_request.addr); log_debug!(target: "CoinJoin", "dsa={}", pending_request.dsa); @@ -336,25 +329,25 @@ impl CoinJoinClientSession { } } - return message_sent; + message_sent } fn create_denominated(&mut self, client_manager: &mut CoinJoinClientManager, balance_to_denominate: u64, dry_run: bool) -> bool { if !self.options.borrow().enable_coinjoin { return false; } - + // NOTE: We do not allow txes larger than 100 kB, so we have to limit number of inputs here. // We still want to consume a lot of inputs to avoid creating only smaller denoms though. // Knowing that each CTxIn is at least 148 B big, 400 inputs should take 400 x ~148 B = ~60 kB. // This still leaves more than enough room for another data of typical CreateDenominated tx. let mut vec_tally: Vec = self.mixing_wallet.borrow_mut().select_coins_grouped_by_addresses(true, true, true, 400); - + if vec_tally.is_empty() { log_info!(target: "CoinJoin", "CoinJoinClientSession::CreateDenominated -- SelectCoinsGroupedByAddresses can't find any inputs!"); return false; } - + // Start from the largest balances first to speed things up by creating txes with larger/largest denoms included vec_tally.sort_by(|a, b| b.amount.cmp(&a.amount)); let create_mixing_collaterals = !self.mixing_wallet.borrow_mut().has_collateral_inputs(true); @@ -367,7 +360,7 @@ impl CoinJoinClientSession { return true; } - + log_info!(target: "CoinJoin", "CoinJoinClientSession: createDenominated({}) -- failed!", balance_to_denominate.to_friendly_string()); false } @@ -375,9 +368,9 @@ impl CoinJoinClientSession { fn create_denominated_with_item( &mut self, client_manager: &mut CoinJoinClientManager, - tally_item: &CompactTallyItem, - balance_to_denominate: u64, - create_mixing_collaterals: bool, + tally_item: &CompactTallyItem, + balance_to_denominate: u64, + create_mixing_collaterals: bool, dry_run: bool ) -> bool { if !self.options.borrow().enable_coinjoin { @@ -391,7 +384,7 @@ impl CoinJoinClientSession { let mut tx_builder = TransactionBuilder::new( self.mixing_wallet.clone(), - self.options.borrow().chain_type, + self.options.borrow().chain_type.clone(), tally_item.clone(), dry_run ); @@ -412,7 +405,7 @@ impl CoinJoinClientSession { let mut map_denom_count = HashMap::new(); for denom_value in denoms { - map_denom_count.insert(*denom_value, self.mixing_wallet.borrow_mut().count_inputs_with_amount(*denom_value)); + map_denom_count.insert(denom_value, self.mixing_wallet.borrow().count_inputs_with_amount(denom_value)); } // Will generate outputs for the createdenoms up to coinjoinmaxdenoms per denom @@ -442,7 +435,7 @@ impl CoinJoinClientSession { return true; } } - + return false; }; @@ -499,7 +492,7 @@ impl CoinJoinClientSession { loop { // Create a potential output vec_outputs.push(amount); - if !tx_builder.could_add_outputs(&vec_outputs) || + if !tx_builder.could_add_outputs(&vec_outputs) || tx_builder.outputs.len() + vec_outputs.len() > COINJOIN_DENOM_OUTPUTS_THRESHOLD as usize { // If it's not possible to add it due to insufficient amount left or total number of outputs exceeds // COINJOIN_DENOM_OUTPUTS_THRESHOLD, drop the output again and stop trying. @@ -515,10 +508,10 @@ impl CoinJoinClientSession { if balance_to_denominate <= 0 { break; } - + let mut outputs = 0; // Number of denoms we can create given our denom and the amount of funds we have left - let denoms_to_create_value = count_possible_outputs(*denom_value, &tx_builder); + let denoms_to_create_value = count_possible_outputs(denom_value, &tx_builder); // Prefer overshooting the target balance by larger denoms (hence `+1`) instead of a more // accurate approximation by many smaller denoms. This is ok because when we get here we // should have nCoinJoinDenomsGoal of each smaller denom already. Also, without `+1` @@ -526,26 +519,26 @@ impl CoinJoinClientSession { // denoms, yet we can't mix the remaining nBalanceToDenominate because it's smaller than // nDenomValue (and thus denomsToCreateBal == 0), so the target would never get reached // even when there is enough funds for that. - let denoms_to_create_bal = (balance_to_denominate / *denom_value as u64) + 1; + let denoms_to_create_bal = (balance_to_denominate / denom_value) + 1; // Use the smaller value let denoms_to_create = denoms_to_create_value.min(denoms_to_create_bal); log_debug!(target: "CoinJoin", "CoinJoinClientSession -- 2 - nBalanceToDenominate: {}, nDenomValue: {}, denomsToCreateValue: {}, denomsToCreateBal: {}\n", balance_to_denominate.to_friendly_string(), denom_value.to_friendly_string(), denoms_to_create_value.to_friendly_string(), denoms_to_create_bal.to_friendly_string()); - let mut it = map_denom_count[denom_value]; + let mut it = map_denom_count[&denom_value]; for i in 0..denoms_to_create { // Never go above the cap unless it's the largest denom - if *denom_value != largest_denom_value && it >= DEFAULT_COINJOIN_DENOMS_HARDCAP { + if denom_value != largest_denom_value && it >= DEFAULT_COINJOIN_DENOMS_HARDCAP { break; } // Increment helpers, add output and subtract denomination amount - if tx_builder.add_output(*denom_value) { + if tx_builder.add_output(denom_value) { outputs += 1; it += 1; - map_denom_count.insert(*denom_value, it); - balance_to_denominate = balance_to_denominate.saturating_sub(*denom_value); + map_denom_count.insert(denom_value, it); + balance_to_denominate = balance_to_denominate.saturating_sub(denom_value); } else { log_error!(target: "CoinJoin", "CoinJoinClientSession -- 2 - Error: AddOutput failed at {}/{}, {}\n", i + 1, denoms_to_create, tx_builder.to_string()); break; @@ -553,7 +546,7 @@ impl CoinJoinClientSession { log_debug!(target: "CoinJoin", "CoinJoinClientSession -- 2 - denomValue: {}, balanceToDenominate: {}, nOutputs: {}, {}\n", denom_value.to_friendly_string(), balance_to_denominate.to_friendly_string(), outputs, tx_builder.to_string()); - + if (tx_builder.outputs.len() as i32) >= COINJOIN_DENOM_OUTPUTS_THRESHOLD { break; } @@ -578,7 +571,7 @@ impl CoinJoinClientSession { if !dry_run { let mut str_result = String::new(); - + if !tx_builder.commit(&mut str_result, true, self.id) { log_error!(target: "CoinJoin", "CoinJoinClientSession -- 4 - Commit failed: {}\n", str_result); return false; @@ -589,7 +582,7 @@ impl CoinJoinClientSession { log_info!(target: "CoinJoin", "CoinJoinClientSession -- 4: commited CreateDenomination tx, str_result: {}\n", str_result); } - return true; + true } fn make_collateral_amounts(&mut self, client_manager: &mut CoinJoinClientManager) -> bool { @@ -633,7 +626,7 @@ impl CoinJoinClientSession { // If we got here then something is terribly broken actually log_error!(target: "CoinJoin", "CoinJoinClientSession::MakeCollateralAmounts -- ERROR: Can't make collaterals!"); - return false; + false } fn make_collateral_amounts_with_item(&mut self, client_manager: &mut CoinJoinClientManager, tally_item: &CompactTallyItem, try_denominated: bool) -> bool { @@ -655,11 +648,11 @@ impl CoinJoinClientSession { let mut tx_builder = TransactionBuilder::new( self.mixing_wallet.clone(), - self.options.borrow().chain_type, + self.options.borrow().chain_type.clone(), tally_item.clone(), false ); - + // Skip way too tiny amounts. Smallest we want is minimum collateral amount in a one output tx if !tx_builder.could_add_output(CoinJoin::get_collateral_amount()) { return false; @@ -677,7 +670,7 @@ impl CoinJoinClientSession { // Note, here we first add a zero amount output to get the remainder after all fees and then assign it if tx_builder.add_zero_output() { let amount_left = tx_builder.amount_left(); - // If remainder is denominated add one duff to the fee + // If remainder is denominated add one duff to the fee if let Some(out) = tx_builder.outputs.last_mut() { out.update_amount( if CoinJoin::is_denominated_amount(amount_left) { amount_left - DUFFS } else { amount_left }, @@ -738,7 +731,7 @@ impl CoinJoinClientSession { client_manager.updated_success_block(); log_info!(target: "CoinJoin", "commited MakeCollateralInputs tx, str_result: {}", str_result); - return true; + true } @@ -752,7 +745,7 @@ impl CoinJoinClientSession { } self.base_session.status = pool_status; - + if pool_status.should_stop() { log_debug!(target: "CoinJoin", "Session has nothing to do: {:?}", pool_status); self.has_nothing_to_do = true; @@ -778,7 +771,7 @@ impl CoinJoinClientSession { PoolState::Signing => COINJOIN_SIGNING_TIMEOUT, _ => COINJOIN_QUEUE_TIMEOUT, }; - + let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); let is_timeout = current_time >= self.base_session.time_last_successful_step + timeout + lag_time; @@ -788,7 +781,7 @@ impl CoinJoinClientSession { log_warn!(target: "CoinJoin", "connect: {} {} timed out ({})", if self.base_session.state == PoolState::Signing { "Signing at session" } else { "Session" }, - self.id, timeout); + self.id.to_lower_hex_string(), timeout); self.queue_session_lifecycle_listeners(true, self.base_session.state, PoolMessage::ErrTimeout, PoolStatus::Timeout); self.base_session.state = PoolState::Error; @@ -799,11 +792,11 @@ impl CoinJoinClientSession { self.base_session.time_last_successful_step = current_time; self.str_last_message = CoinJoin::get_message_by_id(PoolMessage::ErrSession).to_string(); - return true; + true } - pub fn is_mixing_fee_tx(&self, tx_id: UInt256) -> bool { - return self.collateral_session_map.contains_key(&tx_id); + pub fn is_mixing_fee_tx(&self, tx_id: &Txid) -> bool { + self.collateral_session_map.contains_key(tx_id) } fn unlock_coins(&mut self) { @@ -821,12 +814,12 @@ impl CoinJoinClientSession { fn set_null(&mut self) { if let Some(dmn) = self.mixing_masternode.clone() { - if self.mixing_wallet.borrow().is_masternode_or_disconnect_requested(dmn.socket_address) { - if !self.mixing_wallet.borrow().disconnect_masternode(dmn.socket_address) { - log_info!(target: "CoinJoin", "not closing existing masternode: {}", dmn.socket_address); + if self.mixing_wallet.borrow().is_masternode_or_disconnect_requested(dmn.masternode_list_entry.service_address) { + if !self.mixing_wallet.borrow().disconnect_masternode(dmn.masternode_list_entry.service_address) { + log_info!(target: "CoinJoin", "not closing existing masternode: {}", dmn.masternode_list_entry.service_address); } } else { - log_info!(target: "CoinJoin", "not closing masternode since it is not found: {}", dmn.socket_address); + log_info!(target: "CoinJoin", "not closing masternode since it is not found: {}", dmn.masternode_list_entry.service_address); } } @@ -838,7 +831,7 @@ impl CoinJoinClientSession { fn create_collateral_transaction(&mut self, str_reason: &mut String) -> bool { let mut coin_control = CoinControl::new(); coin_control.coin_type = CoinType::OnlyCoinJoinCollateral; - let coins = self.mixing_wallet.borrow_mut().available_coins(true, coin_control); + let coins = self.mixing_wallet.borrow().available_coins(true, coin_control); if coins.is_empty() { str_reason.push_str("CoinJoin requires a collateral transaction and could not locate an acceptable input!"); @@ -847,72 +840,80 @@ impl CoinJoinClientSession { let mut rng = rand::thread_rng(); let txout = &coins[rng.gen_range(0..coins.len())]; - let inputs = vec![TransactionInput { - input_hash: txout.tx_outpoint.hash, - index: txout.tx_outpoint.index, - script: None, - signature: Some(Vec::new()), - sequence: TXIN_SEQUENCE + let inputs = vec![TxIn { + previous_output: txout.tx_outpoint, + script_sig: Default::default(), + sequence: TXIN_SEQUENCE, + witness: Default::default(), }]; + // let inputs = vec![TransactionInput { + // input_hash: txout.tx_outpoint.hash, + // index: txout.tx_outpoint.index, + // script: None, + // signature: Some(Vec::new()), + // sequence: TXIN_SEQUENCE + // }]; let mut tx_collateral = Transaction { - inputs: inputs, - outputs: Vec::new(), - lock_time: 0, version: 1, - tx_hash: None, - tx_type: TransactionType::Classic, - payload_offset: 0, - block_height: TX_UNCONFIRMED as u32 + lock_time: 0, + input: inputs, + output: vec![], + special_transaction_payload: None, }; + // let mut tx_collateral = Transaction { + // inputs: inputs, + // outputs: Vec::new(), + // lock_time: 0, + // version: 1, + // tx_hash: None, + // tx_type: TransactionType::Classic, + // payload_offset: 0, + // block_height: TX_UNCONFIRMED as u32 + // }; // pay collateral charge in fees // NOTE: no need for protobump patch here, // CCoinJoin::IsCollateralAmount in GetCollateralTxDSIn should already take care of this - if txout.output.amount >= CoinJoin::get_collateral_amount() * 2 { + if txout.output.value >= CoinJoin::get_collateral_amount() * 2 { // make our change address let mut reserve_destination = ReserveDestination::new(self.mixing_wallet.clone()); - + if let Some(dest) = reserve_destination.get_reserved_destination(true) { reserve_destination.keep_destination(); // return change - tx_collateral.outputs.push( - TransactionOutput { - amount: txout.output.amount.saturating_sub(CoinJoin::get_collateral_amount()), - script: Some(dest), - address: None + tx_collateral.output.push( + TxOut { + value: txout.output.value.saturating_sub(CoinJoin::get_collateral_amount()), + script_pubkey: ScriptBuf::from(dest), } + // TransactionOutput { + // amount: txout.output.amount.saturating_sub(CoinJoin::get_collateral_amount()), + // script: Some(dest), + // address: None + // } ); } } else { // txout.nValue < CCoinJoin::GetCollateralAmount() * 2 // create dummy data output only and pay everything as a fee - tx_collateral.outputs.push( - TransactionOutput { - amount: 0, - script: Some(vec![OP_RETURN.into_u8()]), - address: None - } - ); + tx_collateral.output.push(TxOut { value: 0, script_pubkey: Builder::new().push_opcode(OP_RETURN).into_script() }); } log_info!(target: "CoinJoin", "sign collateral"); log_debug!(target: "CoinJoin", "tx_collateral={:?}", tx_collateral); - if let Some(signed_tx) = self.mixing_wallet.borrow().sign_transaction(&tx_collateral, false) { - if let Some(tx_id) = signed_tx.tx_hash { - self.tx_my_collateral = Some(signed_tx); - self.is_my_collateral_valid = true; + if let Some(signed_tx) = self.mixing_wallet.borrow().sign_transaction(tx_collateral, false) { + let tx_id = signed_tx.txid(); + self.tx_my_collateral = Some(signed_tx); + self.is_my_collateral_valid = true; - if !self.collateral_session_map.contains_key(&tx_id) { - self.collateral_session_map.insert(tx_id, 0); - } + if !self.collateral_session_map.contains_key(&tx_id) { + self.collateral_session_map.insert(tx_id, 0); } - - return true; + true + } else { + log_warn!(target: "CoinJoin", "Unable to sign collateral transaction!"); + str_reason.push_str("Unable to sign collateral transaction!"); + false } - - log_warn!(target: "CoinJoin", "Unable to sign collateral transaction!"); - str_reason.push_str("Unable to sign collateral transaction!"); - - return false; } fn join_existing_queue(&mut self, client_manager: &mut CoinJoinClientManager, balance_needs_anonymized: u64) -> bool { @@ -921,17 +922,19 @@ impl CoinJoinClientSession { } let mn_list = client_manager.get_mn_list();// TODO: at_chain_tip ? - let queue_manager_rc = self.queue_manager.clone(); - let mut queue_manager = queue_manager_rc.borrow_mut(); - let mut dsq_option = queue_manager.get_queue_item_and_try(); + // let queue_manager_rc = self.queue_manager.clone(); + // let mut queue_manager = queue_manager_rc.borrow_mut(); + let mut dsq_option = client_manager.get_queue_item_and_try(); while let Some(dsq) = dsq_option.clone() { - let dmn = mn_list.masternode_for(dsq.pro_tx_hash.reversed()); + // let pro_tx_hash = ProTxHash::from(dsq.pro_tx_hash.reversed()); + let dmn = mn_list.masternodes.get(&dsq.pro_tx_hash); + // let dmn = mn_list.masternode_for(dsq.pro_tx_hash.reversed()); match (dmn, self.tx_my_collateral.clone()) { (None, _) => { - log_info!(target: "CoinJoin", "masternode is not in masternode list, masternode={}", dsq.pro_tx_hash); - dsq_option = queue_manager.get_queue_item_and_try(); + log_info!(target: "CoinJoin", "masternode is not in masternode list, masternode={}", dsq.pro_tx_hash.to_hex()); + dsq_option = client_manager.get_queue_item_and_try(); continue; }, (Some(dmn), Some(tx)) => { @@ -940,33 +943,30 @@ impl CoinJoinClientSession { if !self.mixing_wallet.borrow_mut().select_tx_dsins_by_denomination(dsq.denomination, balance_needs_anonymized, &mut vec_tx_dsin_tmp) { log_debug!(target: "CoinJoin", "couldn't match denomination {} ({})", dsq.denomination, CoinJoin::denomination_to_string(dsq.denomination)); - dsq_option = queue_manager.get_queue_item_and_try(); + dsq_option = client_manager.get_queue_item_and_try(); continue; } client_manager.add_used_masternode(dsq.pro_tx_hash); - if self.mixing_wallet.borrow().is_masternode_or_disconnect_requested(dmn.socket_address) { - log_debug!(target: "CoinJoin", "skipping masternode connection, addr={}", dmn.socket_address); - dsq_option = queue_manager.get_queue_item_and_try(); + if self.mixing_wallet.borrow().is_masternode_or_disconnect_requested(dmn.masternode_list_entry.service_address) { + log_debug!(target: "CoinJoin", "skipping masternode connection, addr={}", dmn.masternode_list_entry.service_address); + dsq_option = client_manager.get_queue_item_and_try(); continue; } self.base_session.session_denom = dsq.denomination; self.mixing_masternode = Some(dmn.clone()); self.pending_dsa_request = Some(PendingDsaRequest::new( - dmn.socket_address, - CoinJoinAcceptMessage::new( - self.base_session.session_denom, - tx - ) + dmn.masternode_list_entry.service_address, + CoinJoinAcceptMessage::new(self.base_session.session_denom, tx) )); - self.mixing_wallet.borrow_mut().add_pending_masternode(dmn.provider_registration_transaction_hash, self.id); + self.mixing_wallet.borrow().add_pending_masternode(dmn.masternode_list_entry.pro_reg_tx_hash.to_byte_array(), self.id); self.base_session.state = PoolState::Queue; let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); self.base_session.time_last_successful_step = current_time; log_info!(target: "CoinJoin", "join existing queue -> pending connection, sessionDenom: {} ({}), addr={}", - self.base_session.session_denom, CoinJoin::denomination_to_string(self.base_session.session_denom), dmn.socket_address); + self.base_session.session_denom, CoinJoin::denomination_to_string(self.base_session.session_denom), dmn.masternode_list_entry.service_address); self.set_status(PoolStatus::Connecting); self.joined = true; return true; @@ -978,7 +978,7 @@ impl CoinJoinClientSession { } self.set_status(PoolStatus::WarnNoMixingQueues); - return false; + false } fn start_new_queue(&mut self, client_manager: &mut CoinJoinClientManager, balance_needs_anonymized: u64) -> bool { @@ -991,10 +991,10 @@ impl CoinJoinClientSession { let mut tries = 0; let mn_list = client_manager.get_mn_list(); - let mn_count = mn_list.masternodes.values().filter(|x| x.is_valid).count(); + let mn_count = mn_list.masternodes.values().filter(|x| x.masternode_list_entry.is_valid).count(); let mut set_amounts = HashSet::new(); - if !self.mixing_wallet.borrow_mut().select_denominated_amounts(balance_needs_anonymized, &mut set_amounts) { + if !self.mixing_wallet.borrow().select_denominated_amounts(balance_needs_anonymized, &mut set_amounts) { if !self.last_create_denominated_result { self.set_status(PoolStatus::ErrNoInputs); } @@ -1004,34 +1004,34 @@ impl CoinJoinClientSession { while tries < 10 { let dmn = client_manager.get_random_not_used_masternode(); - match dmn { + return match dmn { None => { self.set_status(PoolStatus::ErrMasternodeNotFound); - return false; + false }, Some(dmn) => { - client_manager.add_used_masternode(dmn.provider_registration_transaction_hash); - + client_manager.add_used_masternode(dmn.masternode_list_entry.pro_reg_tx_hash); + { - let metadata_manager = &mut self.queue_manager.borrow_mut().masternode_metadata_manager; - let last_dsq = metadata_manager.get_meta_info(dmn.provider_registration_transaction_hash, true).unwrap().last_dsq; - let dsq_threshold = metadata_manager.get_dsq_threshold(dmn.provider_registration_transaction_hash, mn_count as u64); - + let metadata_manager = &mut client_manager.masternode_metadata_manager; + let last_dsq = metadata_manager.get_meta_info(dmn.masternode_list_entry.pro_reg_tx_hash, true).unwrap().last_dsq; + let dsq_threshold = metadata_manager.get_dsq_threshold(dmn.masternode_list_entry.pro_reg_tx_hash, mn_count); + if last_dsq != 0 && dsq_threshold > metadata_manager.dsq_count { log_warn!(target: "CoinJoin", "warning: Too early to mix on this masternode! masternode={} addr={} nLastDsq={} nDsqThreshold={} nDsqCount={}", - dmn.provider_registration_transaction_hash, dmn.socket_address, last_dsq, dsq_threshold, metadata_manager.dsq_count); + dmn.masternode_list_entry.pro_reg_tx_hash, dmn.masternode_list_entry.service_address, last_dsq, dsq_threshold, metadata_manager.dsq_count); tries += 1; continue; } - if self.mixing_wallet.borrow_mut().is_masternode_or_disconnect_requested(dmn.socket_address) { - log_warn!(target: "CoinJoin", "warning: skipping masternode connection, addr={}", dmn.socket_address); + if self.mixing_wallet.borrow_mut().is_masternode_or_disconnect_requested(dmn.masternode_list_entry.service_address) { + log_warn!(target: "CoinJoin", "warning: skipping masternode connection, addr={}", dmn.masternode_list_entry.service_address); tries += 1; continue; } } - log_info!(target: "CoinJoin", "attempt {} connection to masternode {}, protx: {}", tries + 1, dmn.socket_address, dmn.provider_registration_transaction_hash); + log_info!(target: "CoinJoin", "attempt {} connection to masternode {}, protx: {}", tries + 1, dmn.masternode_list_entry.service_address, dmn.masternode_list_entry.pro_reg_tx_hash); while self.base_session.session_denom == 0 { for amount in &set_amounts { @@ -1044,9 +1044,9 @@ impl CoinJoinClientSession { } self.mixing_masternode = Some(dmn.clone()); - self.mixing_wallet.borrow_mut().add_pending_masternode(dmn.provider_registration_transaction_hash, self.id); + self.mixing_wallet.borrow_mut().add_pending_masternode(dmn.masternode_list_entry.pro_reg_tx_hash.to_byte_array(), self.id); self.pending_dsa_request = Some(PendingDsaRequest::new( - dmn.socket_address, + dmn.masternode_list_entry.service_address, CoinJoinAcceptMessage::new( self.base_session.session_denom, self.tx_my_collateral.clone().unwrap() @@ -1056,17 +1056,17 @@ impl CoinJoinClientSession { let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); self.base_session.time_last_successful_step = current_time; log_info!(target: "CoinJoin", "start new queue -> pending connection, sessionDenom: {} ({}), addr={}", - self.base_session.session_denom, CoinJoin::denomination_to_string(self.base_session.session_denom), dmn.socket_address); - self.mixing_wallet.borrow_mut().start_manager_async(); + self.base_session.session_denom, CoinJoin::denomination_to_string(self.base_session.session_denom), dmn.masternode_list_entry.service_address); + self.mixing_wallet.borrow().start_manager_async(); self.set_status(PoolStatus::Connecting); self.joined = false; - - return true; + + true } } } self.str_auto_denom_result = "Failed to start a new mixing queue".to_string(); - return false; + false } /// As a client, submit part of a future mixing transaction to a Masternode to start the process @@ -1111,8 +1111,8 @@ impl CoinJoinClientSession { // Should never actually get here but just in case log_debug!(target: "CoinJoin", "Running CoinJoin denominate for all rounds, error: {}", str_error); self.str_auto_denom_result = str_error; - - return false; + + false } /// step 0: select denominated inputs and txouts @@ -1133,8 +1133,8 @@ impl CoinJoinClientSession { vec_tx_dsin_ret.clear(); let selected = self.mixing_wallet.borrow_mut().select_tx_dsins_by_denomination( - self.base_session.session_denom, - CoinJoin::max_pool_amount(), + self.base_session.session_denom, + CoinJoin::max_pool_amount(), vec_tx_dsin_ret ); @@ -1143,7 +1143,7 @@ impl CoinJoinClientSession { &format!("Can't select current denominated inputs: {} for session {} ", CoinJoin::denomination_to_amount(self.base_session.session_denom).to_friendly_string(), self.base_session.session_id) ); - + for input in vec_tx_dsin_ret.iter() { str_error_ret.push_str(&format!("\n{:?} ", input)); } @@ -1151,17 +1151,17 @@ impl CoinJoinClientSession { return false; } - return true; + true } /// step 1: prepare denominated inputs and outputs fn prepare_denominate( - &mut self, - min_rounds: i32, - max_rounds: i32, + &mut self, + min_rounds: i32, + max_rounds: i32, str_error_ret: &mut String, - vec_tx_dsin: &Vec, - vec_psin_out_pairs_ret: &mut Vec<(CoinJoinTransactionInput, TransactionOutput)>, + vec_tx_dsin: &Vec, + vec_psin_out_pairs_ret: &mut Vec<(CoinJoinTransactionInput, TxOut)>, dry_run: bool ) -> bool { if !CoinJoin::is_valid_denomination(self.base_session.session_denom) { @@ -1194,7 +1194,8 @@ impl CoinJoinClientSession { script_denom = self.key_holder_storage.add_key(self.mixing_wallet.clone()); } - vec_psin_out_pairs_ret.push((entry.clone(), TransactionOutput { amount: denom_amount as u64, script: script_denom, address: None } )); + + vec_psin_out_pairs_ret.push((entry.clone(), TxOut { value: denom_amount as u64, script_pubkey: script_denom.map(ScriptBuf::from).unwrap_or_default() })); steps += 1; } @@ -1205,9 +1206,9 @@ impl CoinJoinClientSession { } if !dry_run { - for pair in vec_psin_out_pairs_ret.iter() { - self.mixing_wallet.borrow_mut().lock_coin(pair.0.outpoint()); - self.outpoints_locked.push(pair.0.outpoint()); + for (cj_input, _) in vec_psin_out_pairs_ret.iter() { + self.mixing_wallet.borrow_mut().lock_coin(cj_input.outpoint()); + self.outpoints_locked.push(cj_input.outpoint()); } } @@ -1215,8 +1216,8 @@ impl CoinJoinClientSession { } /// step 2: send denominated inputs and outputs prepared in step 1 - fn send_denominate(&mut self, vec_psin_out_pairs: Vec<(CoinJoinTransactionInput, TransactionOutput)>) -> bool { - if self.tx_my_collateral.is_none() || self.tx_my_collateral.as_ref().unwrap().inputs.is_empty() { + fn send_denominate(&mut self, vec_psin_out_pairs: Vec<(CoinJoinTransactionInput, TxOut)>) -> bool { + if self.tx_my_collateral.is_none() || self.tx_my_collateral.as_ref().unwrap().input.is_empty() { log_warn!(target: "CoinJoin", "CoinJoin collateral not set"); return false; } @@ -1233,25 +1234,31 @@ impl CoinJoinClientSession { self.base_session.state = PoolState::AcceptingEntries; self.str_auto_denom_result = String::new(); - - let mut tx = Transaction { // for debug purposes only - inputs: vec![], - outputs: vec![], - lock_time: 0, + let mut tx = Transaction { version: 0, - tx_hash: None, - tx_type: TransactionType::Classic, - payload_offset: 0, - block_height: 0, + lock_time: 0, + input: vec![], + output: vec![], + special_transaction_payload: None, }; + // let mut tx = Transaction { // for debug purposes only + // inputs: vec![], + // outputs: vec![], + // lock_time: 0, + // version: 0, + // tx_hash: None, + // tx_type: TransactionType::Classic, + // payload_offset: 0, + // block_height: 0, + // }; let mut vec_tx_dsin_tmp = Vec::new(); let mut vec_tx_out_tmp = Vec::new(); - for pair in vec_psin_out_pairs { - vec_tx_dsin_tmp.push(pair.0.txin.clone()); - vec_tx_out_tmp.push(pair.1.clone()); - tx.inputs.push(pair.0.txin); - tx.outputs.push(pair.1); + for (cj_input, tx_out) in vec_psin_out_pairs { + vec_tx_dsin_tmp.push(cj_input.txin.clone()); + vec_tx_out_tmp.push(tx_out.clone()); + tx.input.push(cj_input.txin); + tx.output.push(tx_out); } log_info!(target: "CoinJoin", "Submitting partial tx to session {}", self.base_session.session_id); @@ -1259,16 +1266,16 @@ impl CoinJoinClientSession { // Store our entry for later use let entry = CoinJoinEntry { - mixing_inputs: vec_tx_dsin_tmp, - mixing_outputs: vec_tx_out_tmp, - tx_collateral: self.tx_my_collateral.as_ref().unwrap().clone() + mixing_inputs: vec_tx_dsin_tmp, + mixing_outputs: vec_tx_out_tmp, + tx_collateral: self.tx_my_collateral.as_ref().unwrap().clone() }; self.base_session.entries.push(entry.clone()); self.relay(&entry); let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); self.base_session.time_last_successful_step = current_time; - return true; + true } fn relay(&self, entry: &CoinJoinEntry) { @@ -1276,26 +1283,26 @@ impl CoinJoinClientSession { let mut buffer = vec![]; entry.consensus_encode(&mut buffer).unwrap(); - if !self.mixing_wallet.borrow_mut().send_message(buffer, entry.get_message_type(), &mn.socket_address, true) { - log_info!(target: "CoinJoin", "failed to send dsi to {}", mn.socket_address); + if !self.mixing_wallet.borrow().send_message(buffer, entry.get_message_type(), mn.masternode_list_entry.service_address, true) { + log_info!(target: "CoinJoin", "failed to send dsi to {}", mn.masternode_list_entry.service_address); } } } - pub fn process_message(&mut self, peer: &SocketAddress, message: &CoinJoinMessage) -> bool { + pub fn process_message(&mut self, peer: &SocketAddr, message: &CoinJoinMessage) -> bool { match message { CoinJoinMessage::StatusUpdate(status_update) => { self.process_status_update(peer, status_update); - return false; + false }, CoinJoinMessage::FinalTransaction(final_tx) => { self.process_final_transaction(peer, final_tx); - return false; + false }, CoinJoinMessage::Complete(complete) => { - return self.process_complete(peer, complete); + self.process_complete(peer, complete) }, - _ => { return false } + _ => false } } @@ -1306,12 +1313,12 @@ impl CoinJoinClientSession { self.set_null(); } - fn process_status_update(&mut self, peer: &SocketAddress, status_update: &CoinJoinStatusUpdate) { + fn process_status_update(&mut self, peer: &SocketAddr, status_update: &CoinJoinStatusUpdate) { if self.mixing_masternode.is_none() { return; } - if self.mixing_masternode.as_ref().unwrap().socket_address != *peer { + if !self.mixing_masternode.as_ref().unwrap().masternode_list_entry.service_address.eq(peer) { return; } @@ -1319,14 +1326,14 @@ impl CoinJoinClientSession { } /// Process Masternode updates about the progress of mixing - fn process_pool_state_update(&mut self, peer: &SocketAddress, status_update: &CoinJoinStatusUpdate) { + fn process_pool_state_update(&mut self, peer: &SocketAddr, status_update: &CoinJoinStatusUpdate) { log_debug!(target: "CoinJoin", "status update received: {:?} from {}", status_update, peer); // do not update state when mixing client state is one of these if self.base_session.state == PoolState::Idle || self.base_session.state == PoolState::Error { return; } - + if status_update.pool_state < PoolState::pool_state_min() || status_update.pool_state > PoolState::pool_state_max() { return; } @@ -1348,7 +1355,7 @@ impl CoinJoinClientSession { match status_update.message_id { PoolMessage::ErrInvalidCollateral => { if let Some(collateral) = &self.tx_my_collateral { - log_warn!(target: "CoinJoin", "is collateral valid: {}", self.coinjoin.borrow().is_collateral_valid(collateral, true)); + log_warn!(target: "CoinJoin", "is collateral valid: {}", self.coinjoin.read().unwrap().is_collateral_valid(collateral, true)); } else { log_warn!(target: "CoinJoin", "collateral invalid, tx_my_collateral is None"); } @@ -1366,14 +1373,14 @@ impl CoinJoinClientSession { }, PoolStatusUpdate::Accepted => { if let Some(collateral) = &self.tx_my_collateral { - if self.base_session.state == status_update.pool_state && - status_update.pool_state == PoolState::Queue && + if self.base_session.state == status_update.pool_state && + status_update.pool_state == PoolState::Queue && self.base_session.session_id == 0 && status_update.session_id != 0 { // new session id should be set only in POOL_STATE_QUEUE state self.base_session.session_id = status_update.session_id; - self.collateral_session_map.insert(collateral.tx_hash.unwrap(), status_update.session_id); + self.collateral_session_map.insert(collateral.txid(), status_update.session_id); self.base_session.time_last_successful_step = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); str_message_tmp = format!("{} Set SID to {}", str_message_tmp, status_update.session_id); self.queue_session_lifecycle_listeners(false, self.base_session.state, PoolMessage::MsgSuccess, PoolStatus::Mixing); @@ -1387,12 +1394,12 @@ impl CoinJoinClientSession { } } - fn process_complete(& mut self, peer: &SocketAddress, complete_message: &CoinJoinCompleteMessage) -> bool { + fn process_complete(& mut self, peer: &SocketAddr, complete_message: &CoinJoinCompleteMessage) -> bool { if self.mixing_masternode.is_none() { return false; } - if self.mixing_masternode.as_ref().unwrap().socket_address != *peer { + if !self.mixing_masternode.as_ref().unwrap().masternode_list_entry.service_address.eq(peer) { return false; } @@ -1410,7 +1417,7 @@ impl CoinJoinClientSession { log_info!(target: "CoinJoin", "msgSID {} msg {:?} ({})", complete_message.msg_session_id, complete_message.msg_message_id, CoinJoin::get_message_by_id(complete_message.msg_message_id)); - return self.completed_transaction(complete_message.msg_message_id); + self.completed_transaction(complete_message.msg_message_id) } fn completed_transaction(&mut self, message_id: PoolMessage) -> bool { @@ -1431,15 +1438,15 @@ impl CoinJoinClientSession { self.set_status(PoolStatus::Complete); self.str_last_message = CoinJoin::get_message_by_id(message_id).to_string(); - return update_success_block; + update_success_block } - fn process_final_transaction(&mut self, peer: &SocketAddress, final_tx: &CoinJoinFinalTransaction) { + fn process_final_transaction(&mut self, peer: &SocketAddr, final_tx: &CoinJoinFinalTransaction) { if self.mixing_masternode.is_none() { return; } - if self.mixing_masternode.as_ref().unwrap().socket_address != *peer { + if !self.mixing_masternode.as_ref().unwrap().masternode_list_entry.service_address.eq(peer) { return; } @@ -1456,7 +1463,7 @@ impl CoinJoinClientSession { } /// As a client, check and sign the final transaction - fn sign_final_transaction(&mut self, final_transaction_new: &Transaction, peer: &SocketAddress) { + fn sign_final_transaction(&mut self, final_transaction_new: &Transaction, peer: &SocketAddr) { if !self.options.borrow().enable_coinjoin { return; } @@ -1466,15 +1473,16 @@ impl CoinJoinClientSession { } let mut final_mutable_transaction = final_transaction_new.clone(); - + // STEP 1: check final transaction general rules // Make sure it's BIP69 compliant - final_mutable_transaction.inputs.sort_by(Self::compare_input_bip69); - final_mutable_transaction.outputs.sort_by(Self::compare_output_bip69); - - if UInt256::sha256d(final_mutable_transaction.to_data()) != UInt256::sha256d(final_transaction_new.to_data()) { - log_error!(target: "CoinJoin", "Masternode {} is not BIP69 compliant!", self.mixing_masternode.as_ref().unwrap().provider_registration_transaction_hash); + final_mutable_transaction.input.sort_by(Self::compare_input_bip69); + final_mutable_transaction.output.sort_by(Self::compare_output_bip69); + let tx_hash = final_mutable_transaction.txid(); + let new_tx_hash = final_transaction_new.txid(); + if tx_hash.ne(&new_tx_hash) { + log_error!(target: "CoinJoin", "Masternode {} is not BIP69 compliant!", self.mixing_masternode.as_ref().unwrap().masternode_list_entry.pro_reg_tx_hash); self.unlock_coins(); self.key_holder_storage.return_all(); self.set_null(); @@ -1482,7 +1490,7 @@ impl CoinJoinClientSession { } // Make sure all inputs/outputs are valid - let is_valid_ins_outs = self.base_session.is_valid_in_outs(&final_mutable_transaction.inputs, &final_mutable_transaction.outputs); + let is_valid_ins_outs = self.base_session.is_valid_in_outs(&final_mutable_transaction.input, &final_mutable_transaction.output); if !is_valid_ins_outs.result { log_error!(target: "CoinJoin", "IsValidInOuts() failed: {}", CoinJoin::get_message_by_id(is_valid_ins_outs.message_id)); @@ -1498,10 +1506,8 @@ impl CoinJoinClientSession { for entry in &self.base_session.entries { // Check that the final transaction has all our outputs for txout in &entry.mixing_outputs { - let found = final_mutable_transaction.outputs.iter().any(|txout_final| - txout_final.amount == txout.amount && txout_final.script == txout.script - ); - + let found = final_mutable_transaction.output.iter().any(|txout_final| txout_final.eq(txout)); + if !found { // Something went wrong and we'll refuse to sign. It's possible we'll be charged collateral. But that's // better than signing if the transaction doesn't look like what we wanted. @@ -1513,20 +1519,20 @@ impl CoinJoinClientSession { return; } } - + for txin in &entry.mixing_inputs { /* Sign my transaction and all outputs */ let mut my_input_index: Option = None; - for (i, txin_final) in final_mutable_transaction.inputs.iter().enumerate() { - if txin_final.input_hash == txin.input_hash && txin_final.index == txin.index { + for (i, txin_final) in final_mutable_transaction.input.iter().enumerate() { + if txin_final.eq(txin) { my_input_index = Some(i); break; } } if let Some(index) = my_input_index { - let input = final_mutable_transaction.inputs[index].clone(); + let input = final_mutable_transaction.input[index].clone(); // add a pair with an empty value coins.push(input); } else { @@ -1542,14 +1548,14 @@ impl CoinJoinClientSession { } } - let signed_tx = self.mixing_wallet.borrow_mut().sign_transaction(&final_mutable_transaction, true); + let signed_tx = self.mixing_wallet.borrow().sign_transaction(final_mutable_transaction, true); if let Some(tx) = signed_tx { let mut signed_inputs = vec![]; - - for txin in &tx.inputs { - if coins.iter().any(|coin| coin.input_hash == txin.input_hash && coin.index == txin.index) { - signed_inputs.push(txin.clone()); + + for tx_in in &tx.input { + if coins.iter().any(|coin| coin.previous_output.eq(&tx_in.previous_output)) { + signed_inputs.push(tx_in.clone()); } } @@ -1567,7 +1573,7 @@ impl CoinJoinClientSession { log_debug!(target: "CoinJoin", "{}", message); let mut buffer = vec![]; message.consensus_encode(&mut buffer).unwrap(); - self.mixing_wallet.borrow_mut().send_message(buffer, message.get_message_type(), peer, true); + self.mixing_wallet.borrow().send_message(buffer, message.get_message_type(), peer.clone(), true); self.base_session.state = PoolState::Signing; self.base_session.time_last_successful_step = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(); } else { @@ -1575,52 +1581,73 @@ impl CoinJoinClientSession { } } - fn compare_input_bip69(a: &TransactionInput, b: &TransactionInput) -> Ordering { - if a.input_hash == b.input_hash { - return a.index.cmp(&b.index); + fn compare_input_bip69(a: &TxIn, b: &TxIn) -> Ordering { + if a.previous_output.txid == b.previous_output.txid { + return a.previous_output.vout.cmp(&b.previous_output.vout); } - - let rev_hash_a: Vec = a.input_hash.reversed().0.to_vec(); - let rev_hash_b: Vec = b.input_hash.reversed().0.to_vec(); - + + let rev_hash_a = a.previous_output.txid.to_byte_array().reversed(); + let rev_hash_b = b.previous_output.txid.to_byte_array().reversed(); + rev_hash_a.cmp(&rev_hash_b) } - - fn compare_output_bip69(a: &TransactionOutput, b: &TransactionOutput) -> Ordering { - match a.amount.cmp(&b.amount) { - Ordering::Equal => a.script.cmp(&b.script), + + fn compare_output_bip69(a: &TxOut, b: &TxOut) -> Ordering { + match a.value.cmp(&b.value) { + Ordering::Equal => a.script_pubkey.cmp(&b.script_pubkey), other => other, } } fn queue_session_lifecycle_listeners(&self, is_complete: bool, state: PoolState, pool_message: PoolMessage, pool_status: PoolStatus) { if is_complete { - log_debug!(target: "CoinJoin", "session completed: {}, pool_status: {:?}", self.id, pool_status); - } - - unsafe { - let boxed_session_id = boxed(self.id.0); - let boxed_mixing_mn_ip = if let Some(mn) = self.mixing_masternode.as_ref() { - boxed(mn.socket_address.ip_address.0) - } else { - boxed(UInt128::ip_address_from_u32(0).0) - }; - - (self.session_lifecycle_listener)( - is_complete, - self.base_session.session_id, - boxed_session_id, - self.base_session.session_denom, - state, - pool_message, - pool_status, - boxed_mixing_mn_ip, - self.joined, - self.context - ); - - unbox_any(boxed_session_id); - unbox_any(boxed_mixing_mn_ip); - } + log_debug!(target: "CoinJoin", "session completed: {}, pool_status: {:?}", self.id.to_lower_hex_string(), pool_status); + } + self.provider.queue_session_lifecycle( + is_complete, + self.base_session.session_id, + self.id, + self.base_session.session_denom, + state, + pool_message, + pool_status, + self.mixing_masternode.as_ref().map(|e| e.masternode_list_entry.service_address.clone()), + self.joined) + // (self.session_lifecycle_listener)( + // self.context, + // is_complete, + // self.base_session.session_id, + // self.id, + // self.base_session.session_denom, + // state, + // pool_message, + // pool_status, + // self.mixing_masternode.as_ref().map(|e| e.masternode_list_entry.service_address.clone()), + // self.joined, + // ) + // unsafe { + // let boxed_session_id = boxed(self.id.0); + // let boxed_mixing_mn_ip = if let Some(mn) = self.mixing_masternode.as_ref() { + // boxed(mn.socket_address.ip_address.0) + // } else { + // boxed(UInt128::ip_address_from_u32(0).0) + // }; + // + // (self.session_lifecycle_listener)( + // is_complete, + // self.base_session.session_id, + // boxed_session_id, + // self.base_session.session_denom, + // state, + // pool_message, + // pool_status, + // boxed_mixing_mn_ip, + // self.joined, + // self.context + // ); + // + // unbox_any(boxed_session_id); + // unbox_any(boxed_mixing_mn_ip); + // } } } diff --git a/dash-spv-coinjoin/src/constants.rs b/dash-spv-coinjoin/src/constants.rs index 2872fbbb..80db5525 100644 --- a/dash-spv-coinjoin/src/constants.rs +++ b/dash-spv-coinjoin/src/constants.rs @@ -1,4 +1,5 @@ -use dash_spv_masternode_processor::chain::params::{MAX_MONEY, DUFFS}; +use dashcore::constants::MAX_MONEY; +use dash_spv_crypto::util::params::DUFFS; pub const COINJOIN_AUTO_TIMEOUT_MIN: i32 = 5; pub const COINJOIN_AUTO_TIMEOUT_MAX: i32 = 15; diff --git a/dash-spv-coinjoin/src/ffi/callbacks.rs b/dash-spv-coinjoin/src/ffi/callbacks.rs deleted file mode 100644 index b73af63f..00000000 --- a/dash-spv-coinjoin/src/ffi/callbacks.rs +++ /dev/null @@ -1,185 +0,0 @@ -use std::ffi::{c_char, c_void}; -use dash_spv_masternode_processor::ffi::ByteArray; -use dash_spv_masternode_processor::types::{self, MasternodeEntry}; -use crate::ffi::selected_coins::SelectedCoins; -use crate::messages::{PoolMessage, PoolState, PoolStatus}; -use crate::wallet_ex::WalletEx; - -use super::coin_control::CoinControl; -use super::coinjoin_keys::CoinJoinKeys; -use super::gathered_outputs::GatheredOutputs; -use super::input_value::InputValue; -use super::recepient::Recipient; - -pub type GetInputValueByPrevoutHash = unsafe extern "C" fn( - prevout_hash: *mut [u8; 32], - index: u32, - context: *const c_void, -) -> *mut InputValue; - -pub type HasChainLock = unsafe extern "C" fn( - block: *mut types::Block, - context: *const c_void, -) -> bool; - -pub type DestroyInputValue = unsafe extern "C" fn( - input_value: *mut InputValue, -); - -pub type GetWalletTransaction = unsafe extern "C" fn( - hash: *mut [u8; 32], - context: *const c_void, -) -> *mut types::Transaction; - -pub type DestroyWalletTransaction = unsafe extern "C" fn( - input_value: *mut types::Transaction, -); - -pub type SignTransaction = unsafe extern "C" fn( - transaction: *mut types::Transaction, - anyone_can_pay: bool, - context: *const c_void -) -> *mut types::Transaction; - -pub type IsMineInput = unsafe extern "C" fn( - prevout_hash: *mut [u8; 32], - index: u32, - context: *const c_void, -) -> bool; - -pub type AvailableCoins = unsafe extern "C" fn( - only_safe: bool, - coin_control: *mut CoinControl, - wallet_ex: &mut WalletEx, - context: *const c_void, -) -> *mut GatheredOutputs; - -pub type DestroyGatheredOutputs = unsafe extern "C" fn( - gathered_outputs: *mut GatheredOutputs, -); - -pub type SelectCoinsGroupedByAddresses = unsafe extern "C" fn( - skip_denominated: bool, - anonymizable: bool, - skip_unconfirmed: bool, - max_oupoints_per_address: i32, - wallet_ex: &mut WalletEx, - context: *const c_void, -) -> *mut SelectedCoins; - -pub type DestroySelectedCoins = unsafe extern "C" fn( - selected_coins: *mut SelectedCoins, -); - -pub type InputsWithAmount = unsafe extern "C" fn( - amount: u64, - context: *const c_void, -) -> u32; - -pub type FreshCoinJoinAddress = unsafe extern "C" fn( - internal: bool, - context: *const c_void, -) -> ByteArray; - -pub type CommitTransaction = unsafe extern "C" fn( - items: *mut *mut Recipient, - item_count: usize, - coin_control: *mut CoinControl, - is_denominating: bool, - client_session_id: *mut [u8; 32], - context: *const c_void -) -> bool; - -pub type MasternodeByHash = unsafe extern "C" fn( - address: *mut [u8; 32], - context: *const c_void, -) -> *mut MasternodeEntry; - -pub type DestroyMasternode = unsafe extern "C" fn( - selected_coins: *mut MasternodeEntry, -); - -pub type ValidMasternodeCount = unsafe extern "C" fn( - context: *const c_void, -) -> u64; - -pub type IsBlockchainSynced = unsafe extern "C" fn( - context: *const c_void, -) -> bool; - -pub type GetMasternodeList = unsafe extern "C" fn( - context: *const c_void, -) -> *mut types::MasternodeList; - -pub type DestroyMasternodeList = unsafe extern "C" fn( - mn_list: *mut types::MasternodeList, -); - -pub type IsMasternodeOrDisconnectRequested = unsafe extern "C" fn( - ip_address: *mut [u8; 16], - port: u16, - context: *const c_void -) -> bool; - -pub type DisconnectMasternode = unsafe extern "C" fn( - ip_address: *mut [u8; 16], - port: u16, - context: *const c_void -) -> bool; - -pub type SendMessage = unsafe extern "C" fn( - message_type: *mut c_char, - message: *mut ByteArray, - ip_address: *mut [u8; 16], - port: u16, - warn: bool, - context: *const c_void -) -> bool; - -pub type AddPendingMasternode = unsafe extern "C" fn( - pro_tx_hash: *mut [u8; 32], - session_id: *mut [u8; 32], - context: *const c_void -) -> bool; - -pub type StartManagerAsync = unsafe extern "C" fn( - context: *const c_void -); - -pub type UpdateSuccessBlock = unsafe extern "C" fn( - context: *const c_void -); - -pub type IsWaitingForNewBlock = unsafe extern "C" fn( - context: *const c_void -) -> bool; - -pub type SessionLifecycleListener = unsafe extern "C" fn( - is_complete: bool, - base_session_id: i32, - client_session_id: *mut [u8; 32], - denomination: u32, - state: PoolState, - message: PoolMessage, - status: PoolStatus, - ip_address: *mut [u8; 16], - joined: bool, - context: *const c_void -); - -pub type MixingLivecycleListener = unsafe extern "C" fn( - is_complete: bool, - is_interrupted: bool, - pool_statuses: *const PoolStatus, - pool_statuses_len: usize, - context: *const c_void -); - -pub type GetCoinJoinKeys = unsafe extern "C" fn( - used: bool, - context: *const c_void -) -> *mut CoinJoinKeys; - -pub type DestroyCoinJoinKeys = unsafe extern "C" fn( - coinjoin_keys: *mut CoinJoinKeys -); diff --git a/dash-spv-coinjoin/src/ffi/coin_control.rs b/dash-spv-coinjoin/src/ffi/coin_control.rs deleted file mode 100644 index 0a948060..00000000 --- a/dash-spv-coinjoin/src/ffi/coin_control.rs +++ /dev/null @@ -1,15 +0,0 @@ -use dash_spv_masternode_processor::ffi::ByteArray; -use crate::models::coin_control::CoinType; -use super::tx_outpoint::TxOutPoint; - -#[repr(C)] -pub struct CoinControl { - pub coin_type: CoinType, - pub min_depth: i32, - pub max_depth: i32, - pub avoid_address_reuse: bool, - pub allow_other_inputs: bool, - pub set_selected: *mut *mut TxOutPoint, - pub set_selected_size: usize, - pub dest_change: *mut ByteArray -} diff --git a/dash-spv-coinjoin/src/ffi/coinjoin_denominations.rs b/dash-spv-coinjoin/src/ffi/coinjoin_denominations.rs deleted file mode 100644 index bc313e11..00000000 --- a/dash-spv-coinjoin/src/ffi/coinjoin_denominations.rs +++ /dev/null @@ -1,5 +0,0 @@ -#[repr(C)] -pub struct CoinJoinDenominations { - pub denoms: *const u64, - pub length: usize, -} \ No newline at end of file diff --git a/dash-spv-coinjoin/src/ffi/coinjoin_keys.rs b/dash-spv-coinjoin/src/ffi/coinjoin_keys.rs deleted file mode 100644 index cce52b87..00000000 --- a/dash-spv-coinjoin/src/ffi/coinjoin_keys.rs +++ /dev/null @@ -1,8 +0,0 @@ -use dash_spv_masternode_processor::ffi::ByteArray; - -#[repr(C)] -#[derive(Clone, Debug)] -pub struct CoinJoinKeys { - pub items: *mut *mut ByteArray, - pub item_count: usize, -} \ No newline at end of file diff --git a/dash-spv-coinjoin/src/ffi/coinjoin_session_statuses.rs b/dash-spv-coinjoin/src/ffi/coinjoin_session_statuses.rs deleted file mode 100644 index 7d55ae89..00000000 --- a/dash-spv-coinjoin/src/ffi/coinjoin_session_statuses.rs +++ /dev/null @@ -1,7 +0,0 @@ -use crate::messages::PoolStatus; - -#[repr(C)] -pub struct CoinJoinSessionStatuses { - pub statuses: *const PoolStatus, - pub length: usize, -} diff --git a/dash-spv-coinjoin/src/ffi/compact_tally_item.rs b/dash-spv-coinjoin/src/ffi/compact_tally_item.rs deleted file mode 100644 index 80beace6..00000000 --- a/dash-spv-coinjoin/src/ffi/compact_tally_item.rs +++ /dev/null @@ -1,29 +0,0 @@ -use crate::ffi::input_coin::InputCoin; -use crate::coin_selection::compact_tally_item; - -#[repr(C)] -#[derive(Clone, Debug)] -pub struct CompactTallyItem { - pub tx_destination: *mut u8, - pub tx_destination_length: usize, - pub amount: u64, - pub input_coins: *mut *mut InputCoin, - pub input_coins_size: usize -} - -impl CompactTallyItem { - pub unsafe fn decode(&self) -> compact_tally_item::CompactTallyItem { - compact_tally_item::CompactTallyItem { - tx_destination: if self.tx_destination_length == 0 || self.tx_destination.is_null() { - None - } else { - Some(std::slice::from_raw_parts(self.tx_destination, self.tx_destination_length).to_vec()) - }, - input_coins: (0..self.input_coins_size) - .into_iter() - .map(|i| (*(*self.input_coins.add(i))).decode()) - .collect(), - amount: self.amount - } - } -} diff --git a/dash-spv-coinjoin/src/ffi/gathered_outputs.rs b/dash-spv-coinjoin/src/ffi/gathered_outputs.rs deleted file mode 100644 index a9171d94..00000000 --- a/dash-spv-coinjoin/src/ffi/gathered_outputs.rs +++ /dev/null @@ -1,8 +0,0 @@ -use super::input_coin::InputCoin; - -#[repr(C)] -#[derive(Clone, Debug)] -pub struct GatheredOutputs { - pub items: *mut *mut InputCoin, - pub item_count: usize, -} \ No newline at end of file diff --git a/dash-spv-coinjoin/src/ffi/input_coin.rs b/dash-spv-coinjoin/src/ffi/input_coin.rs deleted file mode 100644 index fe092afe..00000000 --- a/dash-spv-coinjoin/src/ffi/input_coin.rs +++ /dev/null @@ -1,27 +0,0 @@ -use dash_spv_masternode_processor::crypto::UInt256; -use dash_spv_masternode_processor::ffi::from::FromFFI; -use dash_spv_masternode_processor::types::TransactionOutput; -use crate::coin_selection::input_coin; -use crate::models::tx_outpoint::TxOutPoint; - -#[repr(C)] -#[derive(Clone, Debug)] -pub struct InputCoin { - pub outpoint_hash: *mut [u8; 32], - pub outpoint_index: u32, - pub output: *mut TransactionOutput, - pub effective_value: u64 -} - -impl InputCoin { - pub unsafe fn decode(&self) -> input_coin::InputCoin { - input_coin::InputCoin { - tx_outpoint: TxOutPoint { - hash: UInt256(*self.outpoint_hash), - index: self.outpoint_index - }, - output: (*self.output).decode(), - effective_value: self.effective_value - } - } -} diff --git a/dash-spv-coinjoin/src/ffi/input_value.rs b/dash-spv-coinjoin/src/ffi/input_value.rs deleted file mode 100644 index f12e5342..00000000 --- a/dash-spv-coinjoin/src/ffi/input_value.rs +++ /dev/null @@ -1,6 +0,0 @@ -#[repr(C)] -#[derive(Clone, Debug)] -pub struct InputValue { - pub is_valid: bool, - pub value: u64, -} \ No newline at end of file diff --git a/dash-spv-coinjoin/src/ffi/mod.rs b/dash-spv-coinjoin/src/ffi/mod.rs deleted file mode 100644 index 635d8ff6..00000000 --- a/dash-spv-coinjoin/src/ffi/mod.rs +++ /dev/null @@ -1,13 +0,0 @@ -pub mod compact_tally_item; -pub mod input_coin; -pub mod selected_coins; -pub mod callbacks; -pub mod recepient; -pub mod coin_control; -pub mod gathered_outputs; -pub mod input_value; -pub mod socket_addres; -pub mod coinjoin_keys; -pub mod coinjoin_denominations; -pub mod coinjoin_session_statuses; -pub mod tx_outpoint; \ No newline at end of file diff --git a/dash-spv-coinjoin/src/ffi/recepient.rs b/dash-spv-coinjoin/src/ffi/recepient.rs deleted file mode 100644 index 9f1d6bd1..00000000 --- a/dash-spv-coinjoin/src/ffi/recepient.rs +++ /dev/null @@ -1,8 +0,0 @@ -use dash_spv_masternode_processor::ffi::ByteArray; - -#[repr(C)] -#[derive(Debug, Clone)] -pub struct Recipient { - pub script_pub_key: ByteArray, - pub amount: u64 -} diff --git a/dash-spv-coinjoin/src/ffi/selected_coins.rs b/dash-spv-coinjoin/src/ffi/selected_coins.rs deleted file mode 100644 index 648b0359..00000000 --- a/dash-spv-coinjoin/src/ffi/selected_coins.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ffi::compact_tally_item::CompactTallyItem; - -#[repr(C)] -#[derive(Clone, Debug)] -pub struct SelectedCoins { - pub items: *mut *mut CompactTallyItem, - pub item_count: usize, -} \ No newline at end of file diff --git a/dash-spv-coinjoin/src/ffi/socket_addres.rs b/dash-spv-coinjoin/src/ffi/socket_addres.rs deleted file mode 100644 index 9bdcd03b..00000000 --- a/dash-spv-coinjoin/src/ffi/socket_addres.rs +++ /dev/null @@ -1,6 +0,0 @@ -#[repr(C)] -#[derive(Clone, Debug)] -pub struct SocketAddress { - pub ip_address: *mut [u8; 16], - pub port: u16 -} diff --git a/dash-spv-coinjoin/src/ffi/tx_outpoint.rs b/dash-spv-coinjoin/src/ffi/tx_outpoint.rs deleted file mode 100644 index a7de4199..00000000 --- a/dash-spv-coinjoin/src/ffi/tx_outpoint.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::models::tx_outpoint as tx_outpoint; - -#[repr(C)] -pub struct TxOutPoint { - pub hash: [u8; 32], - pub index: u32, -} - -impl From for TxOutPoint { - fn from(outpoint: tx_outpoint::TxOutPoint) -> Self { - TxOutPoint { - hash: outpoint.hash.0, - index: outpoint.index, - } - } -} diff --git a/dash-spv-coinjoin/src/lib.rs b/dash-spv-coinjoin/src/lib.rs index 9a42e51c..ac846e20 100644 --- a/dash-spv-coinjoin/src/lib.rs +++ b/dash-spv-coinjoin/src/lib.rs @@ -5,13 +5,12 @@ pub mod constants; pub mod coinjoin_base_session; pub mod coinjoin_client_session; pub mod coinjoin_client_manager; -pub mod coinjoin_client_queue_manager; pub mod masternode_meta_data_manager; pub mod wallet_ex; -pub mod ffi; - -pub(crate) mod coin_selection; -pub(crate) mod utils; +pub mod coin_selection; +pub mod utils; #[cfg(test)] -pub mod tests; \ No newline at end of file +pub mod tests; +pub mod provider; +pub mod wallet_provider; diff --git a/dash-spv-coinjoin/src/masternode_meta_data_manager.rs b/dash-spv-coinjoin/src/masternode_meta_data_manager.rs index a8a6bfb7..c4a7997d 100644 --- a/dash-spv-coinjoin/src/masternode_meta_data_manager.rs +++ b/dash-spv-coinjoin/src/masternode_meta_data_manager.rs @@ -1,46 +1,43 @@ use std::collections::HashMap; -use dash_spv_masternode_processor::crypto::UInt256; +use dashcore::hash_types::ProTxHash; use crate::models::masternode_meta_info::MasternodeMetaInfo; -#[derive(Debug)] +#[derive(Clone, Debug)] pub struct MasternodeMetadataManager { - meta_infos: HashMap, + meta_infos: HashMap, pub dsq_count: i64 } impl MasternodeMetadataManager { pub fn new() -> MasternodeMetadataManager { - return Self { + Self { meta_infos: HashMap::new(), dsq_count: 0 - }; + } } - pub fn get_meta_info(&mut self, pro_tx_hash: UInt256, create: bool) -> Option { + pub fn get_meta_info(&mut self, pro_tx_hash: ProTxHash, create: bool) -> Option { if let Some(info) = self.meta_infos.get(&pro_tx_hash) { return Some(info.clone()); } - if !create { return None; } - let info = MasternodeMetaInfo::new(pro_tx_hash); self.meta_infos.insert(pro_tx_hash, info.clone()); - - return Some(info); + Some(info) } - pub fn get_dsq_threshold(&mut self, pro_tx_hash: UInt256, mn_count: u64) -> i64 { + pub fn get_dsq_threshold(&mut self, pro_tx_hash: ProTxHash, mn_count: usize) -> i64 { if let Some(meta_info) = self.get_meta_info(pro_tx_hash, true) { - return meta_info.last_dsq + (mn_count / 5) as i64; + meta_info.last_dsq + (mn_count / 5) as i64 } else { // return a threshold which is slightly above nDsqCount i.e. a no-go - return mn_count as i64 / 5; + mn_count as i64 / 5 } } - pub fn allow_mixing(&mut self, pro_tx_hash: UInt256) { + pub fn allow_mixing(&mut self, pro_tx_hash: ProTxHash) { if let Some(mm) = self.meta_infos.get_mut(&pro_tx_hash) { self.dsq_count += 1; mm.last_dsq = self.dsq_count; diff --git a/dash-spv-coinjoin/src/messages/coinjoin_accept_message.rs b/dash-spv-coinjoin/src/messages/coinjoin_accept_message.rs index b0ce18cf..2d81a09f 100644 --- a/dash-spv-coinjoin/src/messages/coinjoin_accept_message.rs +++ b/dash-spv-coinjoin/src/messages/coinjoin_accept_message.rs @@ -1,24 +1,29 @@ -use std::io::{Read, Write, Error}; -use dash_spv_masternode_processor::consensus::encode; -use dash_spv_masternode_processor::tx::transaction::{Transaction, TransactionType}; +use std::io; +use std::io::{Cursor, Read, Write}; +use dashcore::consensus::{Decodable, Encodable, encode::Error}; +use dashcore::blockdata::transaction::Transaction; use crate::coinjoin::CoinJoin; use crate::messages::coinjoin_message::CoinJoinMessageType; // dsa -#[repr(C)] #[derive(Clone, Debug)] +#[ferment_macro::export] pub struct CoinJoinAcceptMessage { pub denomination: u32, pub tx_collateral: Transaction, } - +#[ferment_macro::export] +pub fn from_message(message: &[u8]) -> CoinJoinAcceptMessage { + let mut cursor = Cursor::new(message); + CoinJoinAcceptMessage::consensus_decode(&mut cursor).unwrap() +} impl std::fmt::Display for CoinJoinAcceptMessage { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "CoinJoinAccept(denom={}[{}], txCol={:?})", CoinJoin::denomination_to_string(self.denomination), self.denomination, - self.tx_collateral.tx_hash + self.tx_collateral.txid().to_hex() )?; Ok(()) } @@ -27,10 +32,10 @@ impl std::fmt::Display for CoinJoinAcceptMessage { impl CoinJoinAcceptMessage { pub fn new(denomination: u32, tx_collateral: Transaction) -> Self { - return Self { + Self { denomination, tx_collateral - }; + } } } @@ -40,25 +45,26 @@ impl CoinJoinMessageType for CoinJoinAcceptMessage { } } -impl encode::Encodable for CoinJoinAcceptMessage { +impl Encodable for CoinJoinAcceptMessage { #[inline] - fn consensus_encode(&self, mut writer: W) -> Result { + fn consensus_encode(&self, writer: &mut W) -> Result { let mut offset = 0; - offset += self.denomination.consensus_encode(&mut writer)?; - let tx_data = self.tx_collateral.to_data(); // TODO: consensus_encode - writer.write_all(&tx_data)?; - offset += tx_data.len(); + offset += self.denomination.consensus_encode(writer)?; + offset += self.tx_collateral.consensus_encode(writer)?; + // TODO: consensus_encode + // writer.write_all(&tx_data)?; + // offset += tx_data.len(); Ok(offset) } } -impl encode::Decodable for CoinJoinAcceptMessage { +impl Decodable for CoinJoinAcceptMessage { #[inline] - fn consensus_decode(mut d: D) -> Result { - let denomination = u32::consensus_decode(&mut d)?; - let mut tx_collateral = Transaction::consensus_decode(&mut d)?; - tx_collateral.tx_type = TransactionType::Classic; + fn consensus_decode(d: &mut D) -> Result { + let denomination = u32::consensus_decode(d)?; + let tx_collateral = Transaction::consensus_decode(d)?; + // tx_collateral.tx_type = TransactionType::Classic; Ok(CoinJoinAcceptMessage { denomination, tx_collateral }) } diff --git a/dash-spv-coinjoin/src/messages/coinjoin_broadcast_tx.rs b/dash-spv-coinjoin/src/messages/coinjoin_broadcast_tx.rs index 87015b7b..527d4add 100644 --- a/dash-spv-coinjoin/src/messages/coinjoin_broadcast_tx.rs +++ b/dash-spv-coinjoin/src/messages/coinjoin_broadcast_tx.rs @@ -1,31 +1,32 @@ -use std::ffi::c_void; -use std::io::{Read, Write, Error}; -use dash_spv_masternode_processor::consensus::encode; -use dash_spv_masternode_processor::common::block::Block; -use dash_spv_masternode_processor::crypto::byte_util::UInt256; -use dash_spv_masternode_processor::ffi::boxer::boxed; -use dash_spv_masternode_processor::ffi::to::ToFFI; -use dash_spv_masternode_processor::ffi::unboxer::unbox_any; -use dash_spv_masternode_processor::tx::transaction::Transaction; - -use crate::ffi::callbacks::HasChainLock; +use std::io; +use std::io::{Cursor, Read, Write}; +use dashcore::consensus::{Decodable, Encodable}; +use dashcore::consensus::encode::Error; +use dashcore::Transaction; use crate::messages::coinjoin_message::CoinJoinMessageType; // dstx // #[repr(C)] #[derive(Clone, Debug)] +#[ferment_macro::export] pub struct CoinJoinBroadcastTx { pub tx: Transaction, - pub pro_tx_hash: UInt256, + pub pro_tx_hash: [u8; 32], pub signature: Option>, pub signature_time: i64, // memory only // when corresponding tx is 0-confirmed or conflicted, nConfirmedHeight is -1 - confirmed_height: i32, + pub confirmed_height: i32, +} + +#[ferment_macro::export] +pub fn from_message(message: &[u8]) -> CoinJoinBroadcastTx { + let mut cursor = Cursor::new(message); + CoinJoinBroadcastTx::consensus_decode(&mut cursor).unwrap() } impl CoinJoinBroadcastTx { - pub fn new(tx: Transaction, pro_tx_hash: UInt256, signature: Option>, signature_time: i64) -> Self { + pub fn new(tx: Transaction, pro_tx_hash: [u8; 32], signature: Option>, signature_time: i64) -> Self { Self { tx, pro_tx_hash, @@ -39,24 +40,6 @@ impl CoinJoinBroadcastTx { self.confirmed_height = confirmed_height; } - pub fn is_expired(&self, block: Block, has_chain_lock: HasChainLock, context: *const c_void) -> bool { - // expire confirmed DSTXes after ~1h since confirmation or chainlocked confirmation - if self.confirmed_height == -1 || (block.height as i32) < self.confirmed_height { - return false; // not mined yet - } - - if block.height as i32 - self.confirmed_height > 24 { - return true; // mined more than an hour ago - } - - return unsafe { - let boxed_block = boxed(block.encode()); - let is_chain_locked = has_chain_lock(boxed_block, context); - unbox_any(boxed_block); - - is_chain_locked - }; - } } impl CoinJoinMessageType for CoinJoinBroadcastTx { @@ -65,31 +48,33 @@ impl CoinJoinMessageType for CoinJoinBroadcastTx { } } -impl encode::Encodable for CoinJoinBroadcastTx { +impl Encodable for CoinJoinBroadcastTx { #[inline] - fn consensus_encode(&self, mut writer: W) -> Result { + fn consensus_encode(&self, writer: &mut W) -> Result { let mut offset = 0; - let tx_data = self.tx.to_data(); // TODO: consensus_encode - writer.write_all(&tx_data)?; - offset += tx_data.len(); - offset += self.pro_tx_hash.consensus_encode(&mut writer)?; + offset += self.tx.consensus_encode(writer)?; + // let tx_data = self.tx.to_data(); // TODO: consensus_encode + // writer.write_all(&tx_data)?; + // offset += self.tx.consensus_encode(&mut writer)?; + // offset += tx_data.len(); + offset += self.pro_tx_hash.consensus_encode(writer)?; offset += match self.signature { - Some(ref signature) => signature.consensus_encode(&mut writer)?, + Some(ref signature) => signature.consensus_encode(writer)?, None => 0 }; - offset += self.signature_time.consensus_encode(&mut writer)?; + offset += self.signature_time.consensus_encode(writer)?; Ok(offset) } } -impl encode::Decodable for CoinJoinBroadcastTx { +impl Decodable for CoinJoinBroadcastTx { #[inline] - fn consensus_decode(mut d: D) -> Result { - let tx = Transaction::consensus_decode(&mut d)?; - let pro_tx_hash = UInt256::consensus_decode(&mut d)?; - let signature: Option> = Vec::consensus_decode(&mut d).ok(); - let signature_time = i64::consensus_decode(&mut d)?; + fn consensus_decode(d: &mut D) -> Result { + let tx = Transaction::consensus_decode(d)?; + let pro_tx_hash = <[u8; 32]>::consensus_decode(d)?; + let signature: Option> = Vec::consensus_decode(d).ok(); + let signature_time = i64::consensus_decode(d)?; Ok(CoinJoinBroadcastTx::new(tx, pro_tx_hash, signature, signature_time) ) } diff --git a/dash-spv-coinjoin/src/messages/coinjoin_complete_message.rs b/dash-spv-coinjoin/src/messages/coinjoin_complete_message.rs index 7b755d28..5b7c6d98 100644 --- a/dash-spv-coinjoin/src/messages/coinjoin_complete_message.rs +++ b/dash-spv-coinjoin/src/messages/coinjoin_complete_message.rs @@ -1,38 +1,46 @@ -use std::io::{Read, Write, Error}; -use dash_spv_masternode_processor::consensus::encode; +use std::io; +use std::io::{Cursor, Read, Write}; +use dashcore::consensus::{Decodable, Encodable, encode::Error}; use crate::messages::pool_message::PoolMessage; use crate::messages::coinjoin_message::CoinJoinMessageType; // dsc -#[repr(C)] +// #[repr(C)] #[derive(Clone, Debug)] +#[ferment_macro::export] pub struct CoinJoinCompleteMessage { pub msg_session_id: i32, pub msg_message_id: PoolMessage, } +#[ferment_macro::export] +pub fn from_message(message: &[u8]) -> CoinJoinCompleteMessage { + let mut cursor = Cursor::new(message); + CoinJoinCompleteMessage::consensus_decode(&mut cursor).unwrap() +} + impl CoinJoinMessageType for CoinJoinCompleteMessage { fn get_message_type(&self) -> String { - return "dsc".to_string(); + "dsc".to_string() } } -impl encode::Encodable for CoinJoinCompleteMessage { +impl Encodable for CoinJoinCompleteMessage { #[inline] - fn consensus_encode(&self, mut writer: W) -> Result { + fn consensus_encode(&self, writer: &mut W) -> Result { let mut offset = 0; - offset += self.msg_session_id.consensus_encode(&mut writer)?; - offset += self.msg_message_id.value().consensus_encode(&mut writer)?; + offset += self.msg_session_id.consensus_encode(writer)?; + offset += self.msg_message_id.value().consensus_encode(writer)?; Ok(offset) } } -impl encode::Decodable for CoinJoinCompleteMessage { +impl Decodable for CoinJoinCompleteMessage { #[inline] - fn consensus_decode(mut d: D) -> Result { - let msg_session_id = u32::consensus_decode(&mut d)? as i32; - let message_id = u32::consensus_decode(&mut d)? as i32; + fn consensus_decode(d: &mut D) -> Result { + let msg_session_id = u32::consensus_decode(d)? as i32; + let message_id = u32::consensus_decode(d)? as i32; Ok(CoinJoinCompleteMessage { msg_session_id, diff --git a/dash-spv-coinjoin/src/messages/coinjoin_entry.rs b/dash-spv-coinjoin/src/messages/coinjoin_entry.rs index 0a713b0a..783f299c 100644 --- a/dash-spv-coinjoin/src/messages/coinjoin_entry.rs +++ b/dash-spv-coinjoin/src/messages/coinjoin_entry.rs @@ -1,72 +1,66 @@ -use std::io::{Read, Write, Error}; -use dash_spv_masternode_processor::consensus::encode; -use dash_spv_masternode_processor::tx::transaction::{TransactionInput, TransactionOutput, Transaction, TransactionType}; -use dash_spv_masternode_processor::consensus::encode::VarInt; +use std::io; +use std::io::{Cursor, Read, Write}; +use dashcore::blockdata::transaction::Transaction; +use dashcore::blockdata::transaction::txin::TxIn; +use dashcore::blockdata::transaction::txout::TxOut; +use dashcore::consensus::{Decodable, Encodable, encode::{Error, VarInt}}; use crate::messages::coinjoin_message::CoinJoinMessageType; // dsi // A client's transaction in the mixing pool // #[repr(C)] #[derive(Clone, Debug)] +#[ferment_macro::export] pub struct CoinJoinEntry { - pub mixing_inputs: Vec, - pub mixing_outputs: Vec, + pub mixing_inputs: Vec, + pub mixing_outputs: Vec, pub tx_collateral: Transaction, } +#[ferment_macro::export] +pub fn from_message(message: &[u8]) -> CoinJoinEntry { + let mut cursor = Cursor::new(message); + CoinJoinEntry::consensus_decode(&mut cursor).unwrap() +} + impl CoinJoinMessageType for CoinJoinEntry { fn get_message_type(&self) -> String { - return "dsi".to_string(); + "dsi".to_string() } } -impl encode::Encodable for CoinJoinEntry { +impl Encodable for CoinJoinEntry { #[inline] - fn consensus_encode(&self, mut writer: W) -> Result { + fn consensus_encode(&self, writer: &mut W) -> Result { let mut offset = 0; let inputs_amount = VarInt(self.mixing_inputs.len() as u64); - offset += inputs_amount.consensus_encode(&mut writer)?; + offset += inputs_amount.consensus_encode(writer)?; for i in 0..self.mixing_inputs.len() { - offset += self.mixing_inputs[i].consensus_encode(&mut writer)?; + offset += self.mixing_inputs[i].consensus_encode(writer)?; } - - let tx_data = self.tx_collateral.to_data(); // TODO: consensus_encode - writer.write_all(&tx_data)?; - offset += tx_data.len(); + offset += self.tx_collateral.consensus_encode(writer)?; + // let tx_data = self.tx_collateral.to_data(); // TODO: consensus_encode + // writer.write_all(&tx_data)?; + // offset += tx_data.len(); let outputs_amount = VarInt(self.mixing_outputs.len() as u64); - offset += outputs_amount.consensus_encode(&mut writer)?; + offset += outputs_amount.consensus_encode(writer)?; for i in 0..self.mixing_outputs.len() { - offset += self.mixing_outputs[i].consensus_encode(&mut writer)?; + offset += self.mixing_outputs[i].consensus_encode(writer)?; } Ok(offset) } } -impl encode::Decodable for CoinJoinEntry { +impl Decodable for CoinJoinEntry { #[inline] - fn consensus_decode(mut d: D) -> Result { - let mut mixing_inputs = vec![]; - let input_amount = encode::VarInt::consensus_decode(&mut d)?.0; - - for _ in 0..input_amount { - let input = TransactionInput::consensus_decode(&mut d)?; - mixing_inputs.push(input); - } - - let mut tx_collateral = Transaction::consensus_decode(&mut d)?; - tx_collateral.tx_type = TransactionType::Classic; - - let mut mixing_outputs = vec![]; - let output_amount = encode::VarInt::consensus_decode(&mut d)?.0; - - for _ in 0..output_amount { - let output = TransactionOutput::consensus_decode(&mut d)?; - mixing_outputs.push(output); - } + fn consensus_decode(d: &mut D) -> Result { + let mixing_inputs = >::consensus_decode(d)?; + let tx_collateral = Transaction::consensus_decode(d)?; + let mixing_outputs = >::consensus_decode(d)?; Ok(CoinJoinEntry { mixing_inputs, diff --git a/dash-spv-coinjoin/src/messages/coinjoin_final_transaction.rs b/dash-spv-coinjoin/src/messages/coinjoin_final_transaction.rs index 537c7ae5..5a6c3cfa 100644 --- a/dash-spv-coinjoin/src/messages/coinjoin_final_transaction.rs +++ b/dash-spv-coinjoin/src/messages/coinjoin_final_transaction.rs @@ -1,41 +1,50 @@ -use std::io::{Error, Read, Write}; -use dash_spv_masternode_processor::tx::transaction::{Transaction, TransactionType}; -use dash_spv_masternode_processor::consensus::encode; +use std::io; +use std::io::{Cursor, Read, Write}; +use dashcore::consensus::{Decodable, Encodable, encode::Error}; +use dashcore::Transaction; use crate::messages::coinjoin_message::CoinJoinMessageType; // dsf -#[repr(C)] +// #[repr(C)] #[derive(Clone, Debug)] +#[ferment_macro::export] pub struct CoinJoinFinalTransaction { pub msg_session_id: i32, pub tx: Transaction, } +#[ferment_macro::export] +pub fn from_message(message: &[u8]) -> CoinJoinFinalTransaction { + let mut cursor = Cursor::new(message); + CoinJoinFinalTransaction::consensus_decode(&mut cursor).unwrap() +} + impl CoinJoinMessageType for CoinJoinFinalTransaction { fn get_message_type(&self) -> String { - return "dsf".to_string(); + "dsf".to_string() } } -impl encode::Encodable for CoinJoinFinalTransaction { +impl Encodable for CoinJoinFinalTransaction { #[inline] - fn consensus_encode(&self, mut writer: W) -> Result { + fn consensus_encode(&self, writer: &mut W) -> Result { let mut offset = 0; - offset += (self.msg_session_id as u32).consensus_encode(&mut writer)?; - let tx_data = self.tx.to_data(); // TODO: consensus_encode - writer.write_all(&tx_data)?; - offset += tx_data.len(); + offset += (self.msg_session_id as u32).consensus_encode(writer)?; + offset += self.tx.consensus_encode(writer)?; + // let tx_data = self.tx.to_data(); // TODO: consensus_encode + // writer.write_all(&tx_data)?; + // offset += tx_data.len(); Ok(offset) } } -impl encode::Decodable for CoinJoinFinalTransaction { +impl Decodable for CoinJoinFinalTransaction { #[inline] - fn consensus_decode(mut d: D) -> Result { - let msg_session_id = u32::consensus_decode(&mut d)? as i32; - let mut tx = Transaction::consensus_decode(&mut d)?; - tx.tx_type = TransactionType::Classic; + fn consensus_decode(d: &mut D) -> Result { + let msg_session_id = u32::consensus_decode(d)? as i32; + let tx = Transaction::consensus_decode(d)?; + // tx.tx_type = TransactionType::Classic; Ok(CoinJoinFinalTransaction { msg_session_id, tx }) } diff --git a/dash-spv-coinjoin/src/messages/coinjoin_message.rs b/dash-spv-coinjoin/src/messages/coinjoin_message.rs index 0d58ce36..2f976e9d 100644 --- a/dash-spv-coinjoin/src/messages/coinjoin_message.rs +++ b/dash-spv-coinjoin/src/messages/coinjoin_message.rs @@ -1,12 +1,28 @@ -use super::{coinjoin_broadcast_tx::CoinJoinBroadcastTx, CoinJoinCompleteMessage, CoinJoinFinalTransaction, CoinJoinStatusUpdate}; +use crate::messages::{coinjoin_broadcast_tx, coinjoin_complete_message, coinjoin_final_transaction, coinjoin_status_update, CoinJoinCompleteMessage, CoinJoinFinalTransaction, CoinJoinStatusUpdate}; +use crate::messages::coinjoin_broadcast_tx::CoinJoinBroadcastTx; pub trait CoinJoinMessageType { fn get_message_type(&self) -> String; } +#[ferment_macro::export] pub enum CoinJoinMessage { StatusUpdate(CoinJoinStatusUpdate), BroadcastTx(CoinJoinBroadcastTx), FinalTransaction(CoinJoinFinalTransaction), Complete(CoinJoinCompleteMessage) } + +#[ferment_macro::export] +impl CoinJoinMessage { + + pub fn from_message(message: &[u8], message_type: &str) -> CoinJoinMessage { + match message_type { + "dssu" => CoinJoinMessage::StatusUpdate(coinjoin_status_update::from_message(message)), + "dsf" => CoinJoinMessage::FinalTransaction(coinjoin_final_transaction::from_message(message)), + "dsc" => CoinJoinMessage::Complete(coinjoin_complete_message::from_message(message)), + "dstx" => CoinJoinMessage::BroadcastTx(coinjoin_broadcast_tx::from_message(message)), + _ => panic!("CoinJoin: Unsupported message type") + } + } +} \ No newline at end of file diff --git a/dash-spv-coinjoin/src/messages/coinjoin_queue_message.rs b/dash-spv-coinjoin/src/messages/coinjoin_queue_message.rs index 80a4e829..3b72169d 100644 --- a/dash-spv-coinjoin/src/messages/coinjoin_queue_message.rs +++ b/dash-spv-coinjoin/src/messages/coinjoin_queue_message.rs @@ -1,15 +1,13 @@ -use std::io::{Error, Read, Write}; +use std::io; +use std::io::{Cursor, Read, Write}; use std::time::{SystemTime, UNIX_EPOCH}; -use dash_spv_masternode_processor::consensus::encode::VarInt; -use dash_spv_masternode_processor::crypto::byte_util::{Reversable, UInt256}; -use dash_spv_masternode_processor::consensus::{encode, Encodable}; -use dash_spv_masternode_processor::crypto::UInt768; -use dash_spv_masternode_processor::hashes::hex::ToHex; -use dash_spv_masternode_processor::hashes::{sha256d, Hash}; -use dash_spv_masternode_processor::keys::BLSKey; -use dash_spv_masternode_processor::models::OperatorPublicKey; +use dashcore::bls_sig_utils::BLSSignature; +use dashcore::consensus::{Decodable, Encodable}; +use dashcore::consensus::encode::{Error, VarInt}; +use dashcore::hashes::{sha256d, Hash}; +use dashcore::hash_types::ProTxHash; use logging::*; -use tracing::warn; +use dash_spv_crypto::keys::BLSKey; use crate::coinjoin::CoinJoin; use crate::messages::coinjoin_message::CoinJoinMessageType; @@ -19,12 +17,13 @@ use crate::constants::COINJOIN_QUEUE_TIMEOUT; // A currently in progress mixing merge and denomination information // #[repr(C)] #[derive(Clone, Debug, Eq, PartialEq)] +#[ferment_macro::export] pub struct CoinJoinQueueMessage { pub denomination: u32, - pub pro_tx_hash: UInt256, + pub pro_tx_hash: ProTxHash, pub time: i64, pub ready: bool, // ready to submit - pub signature: Option, + pub signature: Option, // Memory only pub tried: bool } @@ -38,26 +37,38 @@ impl std::fmt::Display for CoinJoinQueueMessage { self.time, self.is_time_out_of_bounds(current_time), self.ready, - self.pro_tx_hash.reversed().0.to_hex().chars().take(16).collect::() + self.pro_tx_hash.to_hex() )?; Ok(()) } } impl CoinJoinQueueMessage { + pub fn get_signature_hash(&self) -> sha256d::Hash { + let mut writer = Vec::::new(); + self.denomination.consensus_encode(&mut writer).unwrap(); + self.pro_tx_hash.consensus_encode(&mut writer).unwrap(); + self.time.consensus_encode(&mut writer).unwrap(); + self.ready.consensus_encode(&mut writer).unwrap(); + sha256d::Hash::hash(&writer) + } +} + +#[ferment_macro::export] +impl CoinJoinQueueMessage { + pub fn from_message(message: &[u8]) -> CoinJoinQueueMessage { + let mut cursor = Cursor::new(message); + CoinJoinQueueMessage::consensus_decode(&mut cursor).unwrap() + } pub fn is_time_out_of_bounds(&self, current_time: u64) -> bool { - return current_time.saturating_sub(self.time as u64) > COINJOIN_QUEUE_TIMEOUT || - (self.time as u64).saturating_sub(current_time) > COINJOIN_QUEUE_TIMEOUT; + current_time.saturating_sub(self.time as u64) > COINJOIN_QUEUE_TIMEOUT || + (self.time as u64).saturating_sub(current_time) > COINJOIN_QUEUE_TIMEOUT } - pub fn check_signature(&self, key: OperatorPublicKey) -> bool { + pub fn check_signature(&self, key: [u8; 48], use_legacy: bool) -> bool { if let Some(ref signature) = self.signature { let hash = self.get_signature_hash(); - let verified = BLSKey::key_with_public_key( - key.data, - key.is_legacy() - ).verify_insecure(&hash, *signature); - + let verified = BLSKey::key_with_public_key(key, use_legacy).verify_insecure(hash.as_byte_array(), signature.as_bytes()); if !verified { log_warn!(target: "CoinJoinQueue", "verifySignature failed"); } @@ -65,17 +76,9 @@ impl CoinJoinQueueMessage { return verified; } - return false; + false } - pub fn get_signature_hash(&self) -> Vec { - let mut writer = Vec::::new(); - self.denomination.consensus_encode(&mut writer).unwrap(); - self.pro_tx_hash.consensus_encode(&mut writer).unwrap(); - self.time.consensus_encode(&mut writer).unwrap(); - self.ready.consensus_encode(&mut writer).unwrap(); - sha256d::Hash::hash(&writer).into_inner().to_vec() - } } impl CoinJoinMessageType for CoinJoinQueueMessage { @@ -84,18 +87,18 @@ impl CoinJoinMessageType for CoinJoinQueueMessage { } } -impl encode::Encodable for CoinJoinQueueMessage { +impl Encodable for CoinJoinQueueMessage { #[inline] - fn consensus_encode(&self, mut writer: W) -> Result { + fn consensus_encode(&self, writer: &mut W) -> Result { let mut offset = 0; - offset += self.denomination.consensus_encode(&mut writer)?; - offset += self.pro_tx_hash.consensus_encode(&mut writer)?; - offset += self.time.consensus_encode(&mut writer)?; - offset += self.ready.consensus_encode(&mut writer)?; + offset += self.denomination.consensus_encode(writer)?; + offset += self.pro_tx_hash.consensus_encode(writer)?; + offset += self.time.consensus_encode(writer)?; + offset += self.ready.consensus_encode(writer)?; offset += match self.signature { Some(ref signature) => { - let len_offset = VarInt(signature.0.len() as u64).consensus_encode(&mut writer)?; - let sig_offset = signature.consensus_encode(&mut writer)?; + let len_offset = VarInt(signature.len() as u64).consensus_encode(writer)?; + let sig_offset = signature.consensus_encode(writer)?; len_offset + sig_offset } None => 0 @@ -105,15 +108,15 @@ impl encode::Encodable for CoinJoinQueueMessage { } } -impl encode::Decodable for CoinJoinQueueMessage { +impl Decodable for CoinJoinQueueMessage { #[inline] - fn consensus_decode(mut d: D) -> Result { - let denomination = u32::consensus_decode(&mut d)?; - let pro_tx_hash = UInt256::consensus_decode(&mut d)?; - let time = i64::consensus_decode(&mut d)?; - let ready: bool = bool::consensus_decode(&mut d)?; - let _signature_len = VarInt::consensus_decode(&mut d)?; - let signature: Option = UInt768::consensus_decode(&mut d).ok(); + fn consensus_decode(d: &mut D) -> Result { + let denomination = u32::consensus_decode(d)?; + let pro_tx_hash = ProTxHash::consensus_decode(d)?; + let time = i64::consensus_decode(d)?; + let ready: bool = bool::consensus_decode(d)?; + let _signature_len = VarInt::consensus_decode(d)?; + let signature: Option = BLSSignature::consensus_decode(d).ok(); let message = CoinJoinQueueMessage { denomination, pro_tx_hash, time, ready, signature, tried: false }; Ok(message) } diff --git a/dash-spv-coinjoin/src/messages/coinjoin_signed_inputs.rs b/dash-spv-coinjoin/src/messages/coinjoin_signed_inputs.rs index 2abbd16c..27b2579f 100644 --- a/dash-spv-coinjoin/src/messages/coinjoin_signed_inputs.rs +++ b/dash-spv-coinjoin/src/messages/coinjoin_signed_inputs.rs @@ -1,13 +1,14 @@ -use std::io::{Error, Read, Write}; -use dash_spv_masternode_processor::tx::transaction::TransactionInput; -use dash_spv_masternode_processor::consensus::encode; +use std::io; +use std::io::{Read, Write}; +use dashcore::consensus::{Decodable, Encodable, encode::Error}; +use dashcore::blockdata::transaction::txin::TxIn; use crate::messages::coinjoin_message::CoinJoinMessageType; // dss -// #[repr(C)] #[derive(Clone, Debug)] +#[ferment_macro::export] pub struct CoinJoinSignedInputs { - pub inputs: Vec, + pub inputs: Vec, } impl CoinJoinMessageType for CoinJoinSignedInputs { @@ -23,38 +24,33 @@ impl std::fmt::Display for CoinJoinSignedInputs { if i > 0 { write!(f, ", ")?; } - write!(f, "{{ input_hash: {}, index: {} }}", input.input_hash, input.index)?; + write!(f, "{{ input_hash: {}, index: {} }}", input.previous_output, input.previous_output.vout)?; } write!(f, "] }}") } } -impl encode::Encodable for CoinJoinSignedInputs { +impl Encodable for CoinJoinSignedInputs { #[inline] - fn consensus_encode(&self, mut writer: W) -> Result { + fn consensus_encode(&self, writer: &mut W) -> Result { let mut offset = 0; - let amount = encode::VarInt(self.inputs.len() as u64); - offset += amount.consensus_encode(&mut writer)?; - - for i in 0..self.inputs.len() { - offset += self.inputs[i].consensus_encode(&mut writer)?; - } - + offset += self.inputs.consensus_encode(writer)?; + // let mut offset = 0; + // let amount = VarInt(self.inputs.len() as u64); + // offset += amount.consensus_encode(&mut writer)?; + // + // for i in 0..self.inputs.len() { + // offset += self.inputs[i].consensus_encode(&mut writer)?; + // } + // Ok(offset) } } -impl encode::Decodable for CoinJoinSignedInputs { +impl Decodable for CoinJoinSignedInputs { #[inline] - fn consensus_decode(mut d: D) -> Result { - let mut inputs = vec![]; - let amount = encode::VarInt::consensus_decode(&mut d)?.0; - - for _ in 0..amount { - let input = TransactionInput::consensus_decode(&mut d)?; - inputs.push(input); - } - + fn consensus_decode(d: &mut D) -> Result { + let inputs = >::consensus_decode(d)?; Ok(CoinJoinSignedInputs { inputs }) } } diff --git a/dash-spv-coinjoin/src/messages/coinjoin_status_update.rs b/dash-spv-coinjoin/src/messages/coinjoin_status_update.rs index 73daff56..6d9d5469 100644 --- a/dash-spv-coinjoin/src/messages/coinjoin_status_update.rs +++ b/dash-spv-coinjoin/src/messages/coinjoin_status_update.rs @@ -1,14 +1,15 @@ -use std::io::{Error, Read, Write}; -use dash_spv_masternode_processor::consensus::encode; - +use std::io; +use std::io::{Cursor, Read, Write}; +use dashcore::consensus::{Decodable, Encodable}; +use dashcore::consensus::encode::Error; use crate::messages::pool_message::PoolMessage; use crate::messages::pool_state::PoolState; use crate::messages::pool_status_update::PoolStatusUpdate; use crate::messages::coinjoin_message::CoinJoinMessageType; // dssu -#[repr(C)] #[derive(Clone, Debug)] +#[ferment_macro::export] pub struct CoinJoinStatusUpdate { pub session_id: i32, pub pool_state: PoolState, @@ -16,32 +17,38 @@ pub struct CoinJoinStatusUpdate { pub message_id: PoolMessage, } +#[ferment_macro::export] +pub fn from_message(message: &[u8]) -> CoinJoinStatusUpdate { + let mut cursor = Cursor::new(message); + CoinJoinStatusUpdate::consensus_decode(&mut cursor).unwrap() +} + impl CoinJoinMessageType for CoinJoinStatusUpdate { fn get_message_type(&self) -> String { - return "dssu".to_string(); + "dssu".to_string() } } -impl encode::Encodable for CoinJoinStatusUpdate { +impl Encodable for CoinJoinStatusUpdate { #[inline] - fn consensus_encode(&self, mut writer: W) -> Result { + fn consensus_encode(&self, writer: &mut W) -> Result { let mut offset = 0; - offset += (self.session_id as u32).consensus_encode(&mut writer)?; - offset += (self.pool_state.value() as u32).consensus_encode(&mut writer)?; - offset += (self.status_update.value() as u32).consensus_encode(&mut writer)?; - offset += (self.message_id.value() as u32).consensus_encode(&mut writer)?; + offset += (self.session_id as u32).consensus_encode(writer)?; + offset += (self.pool_state.value() as u32).consensus_encode(writer)?; + offset += (self.status_update.value() as u32).consensus_encode(writer)?; + offset += (self.message_id.value() as u32).consensus_encode(writer)?; Ok(offset) } } -impl encode::Decodable for CoinJoinStatusUpdate { +impl Decodable for CoinJoinStatusUpdate { #[inline] - fn consensus_decode(mut d: D) -> Result { - let session_id = u32::consensus_decode(&mut d)? as i32; - let pool_state = u32::consensus_decode(&mut d)? as i32; - let status_update = u32::consensus_decode(&mut d)? as i32; - let message_id = u32::consensus_decode(&mut d)? as i32; + fn consensus_decode(d: &mut D) -> Result { + let session_id = u32::consensus_decode(d)? as i32; + let pool_state = u32::consensus_decode(d)? as i32; + let status_update = u32::consensus_decode(d)? as i32; + let message_id = u32::consensus_decode(d)? as i32; Ok(CoinJoinStatusUpdate { session_id, diff --git a/dash-spv-coinjoin/src/messages/pool_message.rs b/dash-spv-coinjoin/src/messages/pool_message.rs index c79904bb..c4e5a9c1 100644 --- a/dash-spv-coinjoin/src/messages/pool_message.rs +++ b/dash-spv-coinjoin/src/messages/pool_message.rs @@ -1,5 +1,6 @@ -#[repr(C)] +// #[repr(C)] #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[ferment_macro::export] pub enum PoolMessage { ErrAlreadyHave = 0, ErrDenom = 1, @@ -28,12 +29,13 @@ pub enum PoolMessage { ErrConnectionTimeout = 24, } +#[ferment_macro::export] impl PoolMessage { pub fn value(&self) -> i32 { *self as i32 } - pub fn from_value(value: i32) -> Self { + pub fn from_value(value: i32) -> PoolMessage { match value { 0 => PoolMessage::ErrAlreadyHave, 1 => PoolMessage::ErrDenom, @@ -62,11 +64,11 @@ impl PoolMessage { } } - pub fn msg_pool_min() -> Self { + pub fn msg_pool_min() -> PoolMessage { PoolMessage::ErrAlreadyHave } - pub fn msg_pool_max() -> Self { + pub fn msg_pool_max() -> PoolMessage { PoolMessage::ErrSizeMismatch } } diff --git a/dash-spv-coinjoin/src/messages/pool_state.rs b/dash-spv-coinjoin/src/messages/pool_state.rs index 0e0e2128..fdbfd4d2 100644 --- a/dash-spv-coinjoin/src/messages/pool_state.rs +++ b/dash-spv-coinjoin/src/messages/pool_state.rs @@ -1,5 +1,5 @@ -#[repr(C)] #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[ferment_macro::export] pub enum PoolState { Idle = 0, Queue = 1, @@ -8,12 +8,13 @@ pub enum PoolState { Error = 4, } +#[ferment_macro::export] impl PoolState { pub fn value(&self) -> i32 { *self as i32 } - pub fn from_value(value: i32) -> Self { + pub fn from_value(value: i32) -> PoolState { match value { 0 => PoolState::Idle, 1 => PoolState::Queue, @@ -24,11 +25,11 @@ impl PoolState { } } - pub fn pool_state_min() -> Self { + pub fn pool_state_min() -> PoolState { PoolState::Idle } - pub fn pool_state_max() -> Self { + pub fn pool_state_max() -> PoolState { PoolState::Error } } diff --git a/dash-spv-coinjoin/src/messages/pool_status.rs b/dash-spv-coinjoin/src/messages/pool_status.rs index 96d648be..6febb363 100644 --- a/dash-spv-coinjoin/src/messages/pool_status.rs +++ b/dash-spv-coinjoin/src/messages/pool_status.rs @@ -1,5 +1,5 @@ -#[repr(C)] #[derive(Copy, Clone, Debug, PartialEq, Eq)] +#[ferment_macro::export] pub enum PoolStatus { Warmup = 0x0001, Idle = 0x0002, @@ -26,11 +26,34 @@ impl PoolStatus { const ERROR: i32 = 0x2000; const WARNING: i32 = 0x4000; const COMPLETED: i32 = 0x0100; - +} +#[ferment_macro::export] +impl PoolStatus { pub fn value(&self) -> i32 { *self as i32 } + pub fn from_index(index: i32) -> PoolStatus { + match index { + 0x0001 => PoolStatus::Warmup, + 0x0002 => PoolStatus::Idle, + 0x0003 => PoolStatus::Connecting, + 0x0004 => PoolStatus::Connected, + 0x0005 => PoolStatus::Mixing, + 0x0106 => PoolStatus::Complete, + 0x1007 => PoolStatus::Finished, + 0x0107 => PoolStatus::Timeout, + 0x0108 => PoolStatus::ConnectionTimeout, + 0x2100 => PoolStatus::ErrNoInputs, + 0x2101 => PoolStatus::ErrMasternodeNotFound, + 0x2102 => PoolStatus::ErrNoMasternodesDetected, + 0x3103 => PoolStatus::ErrWalletLocked, + 0x3104 => PoolStatus::ErrNotEnoughFunds, + 0x4200 => PoolStatus::WarnNoMixingQueues, + 0x4201 => PoolStatus::WarnNoCompatibleMasternode, + _ => panic!("Invalid index {}", index), + } + } pub fn is_error(&self) -> bool { (self.value() & Self::ERROR) != 0 } @@ -38,6 +61,9 @@ impl PoolStatus { pub fn is_warning(&self) -> bool { (self.value() & Self::WARNING) != 0 } + pub fn is_err_not_enough_funds(&self) -> bool { + matches!(self, Self::ErrNotEnoughFunds) + } pub fn should_stop(&self) -> bool { (self.value() & Self::STOP) != 0 || @@ -48,4 +74,5 @@ impl PoolStatus { pub fn session_completed(&self) -> bool { (self.value() & Self::COMPLETED) != 0 } -} + +} \ No newline at end of file diff --git a/dash-spv-coinjoin/src/messages/pool_status_update.rs b/dash-spv-coinjoin/src/messages/pool_status_update.rs index 9d1e5bc9..4febc7c6 100644 --- a/dash-spv-coinjoin/src/messages/pool_status_update.rs +++ b/dash-spv-coinjoin/src/messages/pool_status_update.rs @@ -1,16 +1,17 @@ -#[repr(C)] #[derive(Copy, Clone, Debug, PartialEq, Eq)] +#[ferment_macro::export] pub enum PoolStatusUpdate { Rejected = 0, Accepted = 1, } +#[ferment_macro::export] impl PoolStatusUpdate { pub fn value(&self) -> i32 { *self as i32 } - pub fn from_value(value: i32) -> Self { + pub fn from_value(value: i32) -> PoolStatusUpdate { match value { 0 => PoolStatusUpdate::Rejected, _ => PoolStatusUpdate::Accepted, diff --git a/dash-spv-coinjoin/src/messages/send_coinjoin_queue.rs b/dash-spv-coinjoin/src/messages/send_coinjoin_queue.rs index 40db59f0..9286343d 100644 --- a/dash-spv-coinjoin/src/messages/send_coinjoin_queue.rs +++ b/dash-spv-coinjoin/src/messages/send_coinjoin_queue.rs @@ -1,10 +1,10 @@ use std::io::{Error, Read, Write}; -use dash_spv_masternode_processor::consensus::encode; +use dashcore::consensus::{encode, Decodable, Encodable}; use crate::messages::coinjoin_message::CoinJoinMessageType; // senddsq -#[repr(C)] #[derive(Clone, Debug)] +#[ferment_macro::export] pub struct SendCoinJoinQueue { pub send: bool, } @@ -15,20 +15,20 @@ impl CoinJoinMessageType for SendCoinJoinQueue { } } -impl encode::Encodable for SendCoinJoinQueue { +impl Encodable for SendCoinJoinQueue { #[inline] - fn consensus_encode(&self, mut writer: W) -> Result { + fn consensus_encode(&self, writer: &mut W) -> Result { let mut offset = 0; - offset += self.send.consensus_encode(&mut writer)?; + offset += self.send.consensus_encode(writer)?; Ok(offset) } } -impl encode::Decodable for SendCoinJoinQueue { +impl Decodable for SendCoinJoinQueue { #[inline] - fn consensus_decode(mut d: D) -> Result { - let send = bool::consensus_decode(&mut d)?; + fn consensus_decode(d: &mut D) -> Result { + let send = bool::consensus_decode(d)?; Ok(SendCoinJoinQueue { send }) } diff --git a/dash-spv-coinjoin/src/models/balance.rs b/dash-spv-coinjoin/src/models/balance.rs index f61a8d8f..d04733f5 100644 --- a/dash-spv-coinjoin/src/models/balance.rs +++ b/dash-spv-coinjoin/src/models/balance.rs @@ -1,7 +1,7 @@ use std::fmt; -#[repr(C)] #[derive(Debug, Clone)] +#[ferment_macro::export] pub struct Balance { pub my_trusted: u64, // Trusted, at depth=GetBalance.min_depth or more pub my_untrusted_pending: u64, // Untrusted, but in mempool (pending) @@ -14,8 +14,9 @@ pub struct Balance { pub denominated_untrusted_pending: u64 } +#[ferment_macro::export] impl Balance { - pub fn new() -> Self{ + pub fn new() -> Balance { Self { my_trusted: 0, my_untrusted_pending: 0, diff --git a/dash-spv-coinjoin/src/models/coin_control.rs b/dash-spv-coinjoin/src/models/coin_control.rs index 7dd08f06..7b4d9f1d 100644 --- a/dash-spv-coinjoin/src/models/coin_control.rs +++ b/dash-spv-coinjoin/src/models/coin_control.rs @@ -1,13 +1,9 @@ use std::collections::HashSet; -use dash_spv_masternode_processor::ffi::{boxer::{boxed, boxed_vec}, ByteArray}; - -use crate::ffi as ffi; - +use dashcore::blockdata::transaction::outpoint::OutPoint; use crate::constants::REFERENCE_DEFAULT_MIN_TX_FEE; -use super::{tx_destination::TxDestination, tx_outpoint::TxOutPoint}; #[derive(Clone, Copy, Debug, PartialEq)] -#[repr(C)] +#[ferment_macro::export] pub enum CoinType { AllCoins = 0, OnlyFullyMixed = 1, @@ -17,19 +13,55 @@ pub enum CoinType { OnlyCoinJoinCollateral = 5, } +#[ferment_macro::export] +impl CoinType { + pub fn is_all_coins(&self) -> bool { + *self == CoinType::AllCoins + } + pub fn is_only_fully_mixed(&self) -> bool { + *self == CoinType::OnlyFullyMixed + } + pub fn is_only_ready_to_mix(&self) -> bool { + *self == CoinType::OnlyReadyToMix + } + pub fn is_only_non_denominated(&self) -> bool { + *self == CoinType::OnlyNonDenominated + } + pub fn is_only_masternode_collateral(&self) -> bool { + *self == CoinType::OnlyMasternodeCollateral + } + pub fn is_only_coinjoin_collateral(&self) -> bool { + *self == CoinType::OnlyCoinJoinCollateral + } + pub fn index(&self) -> u8 { + *self as u8 + } + pub fn from_index(index: u8) -> CoinType { + match index { + 0 => CoinType::AllCoins, + 1 => CoinType::OnlyFullyMixed, + 2 => CoinType::OnlyReadyToMix, + 3 => CoinType::OnlyNonDenominated, + 4 => CoinType::OnlyMasternodeCollateral, + 5 => CoinType::OnlyCoinJoinCollateral, + _ => panic!("Invalid CoinType index") + } + } +} + // CoinControl comes from Dash Core. Not all functions fields and functions are supported within the Wallet class #[derive(Clone, Debug)] - +#[ferment_macro::export] pub struct CoinControl { - pub dest_change: TxDestination, + pub dest_change: Option>, pub allow_other_inputs: bool, pub fee_rate: u64, pub discard_fee_rate: u64, - avoid_address_reuse: bool, - min_depth: i32, - max_depth: i32, + pub avoid_address_reuse: bool, + pub min_depth: i32, + pub max_depth: i32, pub coin_type: CoinType, - pub set_selected: HashSet + pub set_selected: HashSet } impl CoinControl { @@ -47,37 +79,37 @@ impl CoinControl { } } - pub fn select(&mut self, out_point: TxOutPoint) { + pub fn select(&mut self, out_point: OutPoint) { self.set_selected.insert(out_point); } - pub fn unselect(&mut self, out_point: TxOutPoint) { + pub fn unselect(&mut self, out_point: OutPoint) { self.set_selected.remove(&out_point); } - pub fn encode(&self) -> ffi::coin_control::CoinControl { - ffi::coin_control::CoinControl { - coin_type: self.coin_type, - min_depth: self.min_depth, - max_depth: self.max_depth, - avoid_address_reuse: self.avoid_address_reuse, - allow_other_inputs: self.allow_other_inputs, - set_selected: if self.set_selected.is_empty() { - std::ptr::null_mut() - } else { - boxed_vec( - self.set_selected - .iter() - .map(|outpoint| boxed(ffi::tx_outpoint::TxOutPoint::from(outpoint.clone()))) - .collect() - ) - }, - set_selected_size: self.set_selected.len(), - dest_change: if self.dest_change.is_none() { - std::ptr::null_mut() - } else { - boxed(ByteArray::from(self.dest_change.as_ref().unwrap().to_vec())) - } - } - } + // pub fn encode(&self) -> ffi::coin_control::CoinControl { + // ffi::coin_control::CoinControl { + // coin_type: self.coin_type, + // min_depth: self.min_depth, + // max_depth: self.max_depth, + // avoid_address_reuse: self.avoid_address_reuse, + // allow_other_inputs: self.allow_other_inputs, + // set_selected: if self.set_selected.is_empty() { + // std::ptr::null_mut() + // } else { + // boxed_vec( + // self.set_selected + // .iter() + // .map(|outpoint| boxed(ffi::tx_outpoint::TxOutPoint::from(outpoint.clone()))) + // .collect() + // ) + // }, + // set_selected_size: self.set_selected.len(), + // dest_change: if self.dest_change.is_none() { + // std::ptr::null_mut() + // } else { + // boxed(ByteArray::from(self.dest_change.as_ref().unwrap().to_vec())) + // } + // } + // } } diff --git a/dash-spv-coinjoin/src/models/coinjoin_client_options.rs b/dash-spv-coinjoin/src/models/coinjoin_client_options.rs index 375c5e7d..b0db4aa6 100644 --- a/dash-spv-coinjoin/src/models/coinjoin_client_options.rs +++ b/dash-spv-coinjoin/src/models/coinjoin_client_options.rs @@ -1,7 +1,7 @@ -use dash_spv_masternode_processor::chain::common::ChainType; +use dash_spv_crypto::network::ChainType; -#[repr(C)] #[derive(Debug, Clone, PartialEq, Eq)] +#[ferment_macro::export] pub struct CoinJoinClientOptions { pub enable_coinjoin: bool, pub coinjoin_amount: u64, diff --git a/dash-spv-coinjoin/src/models/coinjoin_transaction_input.rs b/dash-spv-coinjoin/src/models/coinjoin_transaction_input.rs index d158dac5..3c52692b 100644 --- a/dash-spv-coinjoin/src/models/coinjoin_transaction_input.rs +++ b/dash-spv-coinjoin/src/models/coinjoin_transaction_input.rs @@ -1,24 +1,24 @@ -use dash_spv_masternode_processor::tx::TransactionInput; - -use super::tx_outpoint::TxOutPoint; +use dashcore::blockdata::transaction::outpoint::OutPoint; +use dashcore::blockdata::transaction::txin::TxIn; // Holds a mixing input #[derive(Debug, Clone)] pub struct CoinJoinTransactionInput { - pub txin: TransactionInput, + pub txin: TxIn, pub rounds: i32 } impl CoinJoinTransactionInput { - pub fn new(txin: TransactionInput, rounds: i32) -> Self { + pub fn new(txin: TxIn, rounds: i32) -> Self { CoinJoinTransactionInput { txin, rounds } } - pub fn outpoint(&self) -> TxOutPoint { - return TxOutPoint::new(self.txin.input_hash, self.txin.index); + pub fn outpoint(&self) -> OutPoint { + self.txin.previous_output + // return TxOutPoint::new(self.txin.input_hash, self.txin.index); } } diff --git a/dash-spv-coinjoin/src/models/coinjoin_tx_type.rs b/dash-spv-coinjoin/src/models/coinjoin_tx_type.rs index 2ee2e506..57aeb225 100644 --- a/dash-spv-coinjoin/src/models/coinjoin_tx_type.rs +++ b/dash-spv-coinjoin/src/models/coinjoin_tx_type.rs @@ -1,9 +1,8 @@ -use dash_spv_masternode_processor::tx::Transaction; - +use dashcore::Transaction; use crate::coinjoin::CoinJoin; -#[repr(C)] #[derive(Debug, PartialEq)] +#[ferment_macro::export] pub enum CoinJoinTransactionType { None, CreateDenomination, @@ -13,33 +12,56 @@ pub enum CoinJoinTransactionType { Send, } +#[ferment_macro::export] impl CoinJoinTransactionType { - pub fn from_tx(tx: &Transaction, input_values: &Vec) -> Self { + + pub fn index(&self) -> u8 { + match self { + Self::None => 0, + Self::CreateDenomination => 1, + Self::MakeCollateralInputs => 2, + Self::MixingFee => 3, + Self::Mixing => 4, + Self::Send => 5, + } + } + pub fn from_index(index: u8) -> CoinJoinTransactionType { + match index { + 0 => Self::None, + 1 => Self::CreateDenomination, + 2 => Self::MakeCollateralInputs, + 3 => Self::MixingFee, + 4 => Self::Mixing, + 5 => Self::Send, + _ => panic!("Invalid index {}", index), + } + } + pub fn from_tx(tx: &Transaction, input_values: &Vec) -> CoinJoinTransactionType { let input_sum: u64 = input_values.iter().sum(); - if tx.inputs.len() == tx.outputs.len() && tx.outputs.iter().all(|output| CoinJoin::is_denominated_amount(output.amount)) { + if tx.input.len() == tx.output.len() && tx.output.iter().all(|output| CoinJoin::is_denominated_amount(output.value)) { return Self::Mixing; } else if Self::is_mixing_fee(tx, input_sum) { return Self::MixingFee; } else { let mut make_collateral = false; - if tx.outputs.len() == 2 { - let amount_0 = tx.outputs[0].amount; - let amount_1 = tx.outputs[1].amount; + if tx.output.len() == 2 { + let amount_0 = tx.output[0].value; + let amount_1 = tx.output[1].value; // , see CCoinJoinClientSession.makeCollateralAmounts make_collateral = (amount_0 == CoinJoin::get_max_collateral_amount() && !CoinJoin::is_denominated_amount(amount_1) && amount_1 >= CoinJoin::get_collateral_amount()) || (amount_1 == CoinJoin::get_max_collateral_amount() && !CoinJoin::is_denominated_amount(amount_0) && amount_0 >= CoinJoin::get_collateral_amount()) || // , see CCoinJoinClientSession.makeCollateralAmounts (amount_0 == amount_1 && CoinJoin::is_collateral_amount(amount_0)); - } else if tx.outputs.len() == 1 { + } else if tx.output.len() == 1 { // , see CCoinJoinClientSession.makeCollateralAmounts - make_collateral = CoinJoin::is_collateral_amount(tx.outputs[0].amount); + make_collateral = CoinJoin::is_collateral_amount(tx.output[0].value); } if make_collateral { return Self::MakeCollateralInputs; } else { - for output in &tx.outputs { - if CoinJoin::is_denominated_amount(output.amount) { + for output in &tx.output { + if CoinJoin::is_denominated_amount(output.value) { return Self::CreateDenomination; // Done, it's definitely a tx creating mixing denoms, no need to look any further } } @@ -48,21 +70,20 @@ impl CoinJoinTransactionType { // is this a coinjoin send transaction if CoinJoinTransactionType::is_coinjoin_send(tx, &input_values) { - return Self::Send; + Self::Send + } else { + Self::None } - - return Self::None; } - fn is_coinjoin_send(tx: &Transaction, input_values: &Vec) -> bool { + pub fn is_coinjoin_send(tx: &Transaction, input_values: &Vec) -> bool { let inputs_are_denominated = input_values.iter().all(|input| CoinJoin::is_denominated_amount(*input)); let fee = CoinJoinTransactionType::get_fee(tx, input_values); - - return inputs_are_denominated && fee.map_or(false, |f| f != 0); + inputs_are_denominated && fee.map_or(false, |f| f != 0) } - fn is_mixing_fee(tx: &Transaction, inputs_value: u64) -> bool { - let outputs_value = tx.outputs.iter().map(|output| output.amount).sum(); + pub fn is_mixing_fee(tx: &Transaction, inputs_value: u64) -> bool { + let outputs_value = tx.output.iter().map(|output| output.value).sum(); if inputs_value < outputs_value { return false; @@ -71,20 +92,20 @@ impl CoinJoinTransactionType { let net_value = inputs_value - outputs_value; // check for the tx with OP_RETURN - if outputs_value == 0 && tx.inputs.len() == 1 && tx.outputs.len() == 1 && tx.outputs[0].is_op_return() { + if outputs_value == 0 && tx.input.len() == 1 && tx.output.len() == 1 && tx.output[0].script_pubkey.is_op_return() { return true; } - return tx.inputs.len() == 1 && tx.outputs.len() == 1 + tx.input.len() == 1 && tx.output.len() == 1 && CoinJoin::is_collateral_amount(inputs_value) && CoinJoin::is_collateral_amount(outputs_value) - && CoinJoin::is_collateral_amount(net_value); + && CoinJoin::is_collateral_amount(net_value) } - fn get_fee(tx: &Transaction, inputs_values: &Vec) -> Option { + pub fn get_fee(tx: &Transaction, inputs_values: &Vec) -> Option { let mut fee: u64 = 0; - if inputs_values.is_empty() || tx.outputs.is_empty() { + if inputs_values.is_empty() || tx.output.is_empty() { return None; } @@ -92,10 +113,10 @@ impl CoinJoinTransactionType { fee = fee.saturating_add(*input_value); } - for output in &tx.outputs { - fee = fee.saturating_sub(output.amount); + for output in &tx.output { + fee = fee.saturating_sub(output.value); } - return Some(fee); + Some(fee) } } diff --git a/dash-spv-coinjoin/src/models/masternode_meta_info.rs b/dash-spv-coinjoin/src/models/masternode_meta_info.rs index 88d7b4a7..d1823a99 100644 --- a/dash-spv-coinjoin/src/models/masternode_meta_info.rs +++ b/dash-spv-coinjoin/src/models/masternode_meta_info.rs @@ -1,15 +1,17 @@ -use dash_spv_masternode_processor::crypto::UInt256; +use dashcore::hash_types::ProTxHash; #[derive(Debug, Clone)] +#[ferment_macro::export] pub struct MasternodeMetaInfo { - pub pro_tx_hash: UInt256, + pub pro_tx_hash: ProTxHash, // the dsq count from the last dsq broadcast of this node pub last_dsq: i64, pub mixing_tx_count: i32 } +#[ferment_macro::export] impl MasternodeMetaInfo { - pub fn new(pro_tx_hash: UInt256) -> MasternodeMetaInfo { + pub fn new(pro_tx_hash: ProTxHash) -> MasternodeMetaInfo { Self { pro_tx_hash, last_dsq: 0, diff --git a/dash-spv-coinjoin/src/models/mod.rs b/dash-spv-coinjoin/src/models/mod.rs index 96996bf9..498bf0a9 100644 --- a/dash-spv-coinjoin/src/models/mod.rs +++ b/dash-spv-coinjoin/src/models/mod.rs @@ -3,13 +3,13 @@ pub mod balance; pub mod tx_outpoint; pub mod coinjoin_transaction_input; pub mod coinjoin_tx_type; -pub(crate) mod tx_destination; -pub(crate) mod valid_in_outs; -pub(crate) mod pending_dsa_request; -pub(crate) mod coin_control; -pub(crate) mod reserve_destination; -pub(crate) mod transaction_builder_output; -pub(crate) mod masternode_meta_info; +pub mod tx_destination; +pub mod valid_in_outs; +pub mod pending_dsa_request; +pub mod coin_control; +pub mod reserve_destination; +pub mod transaction_builder_output; +pub mod masternode_meta_info; pub use self::coinjoin_client_options::CoinJoinClientOptions; pub use self::balance::Balance; diff --git a/dash-spv-coinjoin/src/models/pending_dsa_request.rs b/dash-spv-coinjoin/src/models/pending_dsa_request.rs index 548922f4..487546e6 100644 --- a/dash-spv-coinjoin/src/models/pending_dsa_request.rs +++ b/dash-spv-coinjoin/src/models/pending_dsa_request.rs @@ -1,12 +1,10 @@ +use std::net::SocketAddr; use std::time::{SystemTime, Duration}; - -use dash_spv_masternode_processor::common::SocketAddress; - use crate::messages::CoinJoinAcceptMessage; #[derive(Debug)] pub(crate) struct PendingDsaRequest { - pub addr: SocketAddress, + pub addr: SocketAddr, pub dsa: CoinJoinAcceptMessage, time_created: SystemTime, } @@ -14,7 +12,7 @@ pub(crate) struct PendingDsaRequest { const TIMEOUT: Duration = Duration::from_secs(15); impl PendingDsaRequest { - pub fn new(addr: SocketAddress, dsa: CoinJoinAcceptMessage) -> Self { + pub fn new(addr: SocketAddr, dsa: CoinJoinAcceptMessage) -> Self { Self { addr, dsa, time_created: SystemTime::now() } } diff --git a/dash-spv-coinjoin/src/models/reserve_destination.rs b/dash-spv-coinjoin/src/models/reserve_destination.rs index 5a4adf40..ba2f4f3a 100644 --- a/dash-spv-coinjoin/src/models/reserve_destination.rs +++ b/dash-spv-coinjoin/src/models/reserve_destination.rs @@ -1,5 +1,4 @@ use std::{cell::RefCell, rc::Rc}; -use tracing::debug; use logging::*; use crate::wallet_ex::WalletEx; use super::tx_destination::TxDestination; @@ -47,7 +46,7 @@ impl<'a> ReserveDestination { } } - return self.key.clone(); + self.key.clone() } pub fn keep_destination(&mut self) { @@ -62,7 +61,7 @@ impl<'a> ReserveDestination { pub fn return_destination(&mut self) { if self.key.is_some() { - self.wallet_ex.borrow_mut().add_unused_key(&self.key); + self.wallet_ex.borrow_mut().add_unused_key(self.key.clone().unwrap()); } else { log_debug!(target: "CoinJoin", "cannot return key"); } diff --git a/dash-spv-coinjoin/src/models/transaction_builder_output.rs b/dash-spv-coinjoin/src/models/transaction_builder_output.rs index 0946e3f6..fabde081 100644 --- a/dash-spv-coinjoin/src/models/transaction_builder_output.rs +++ b/dash-spv-coinjoin/src/models/transaction_builder_output.rs @@ -1,7 +1,8 @@ use std::{cell::RefCell, rc::Rc}; - +use dashcore::blockdata::script::ScriptBuf; +use dashcore::blockdata::transaction::txout::TxOut; +use crate::models::reserve_destination::ReserveDestination; use crate::wallet_ex::WalletEx; -use super::reserve_destination::ReserveDestination; #[derive(Clone)] pub struct TransactionBuilderOutput { @@ -37,6 +38,13 @@ impl<'a> TransactionBuilderOutput { } self.amount = new_amount; - return true; + true + } + + pub fn build_output(&self) -> TxOut { + TxOut { + value: self.amount, + script_pubkey: ScriptBuf::from(self.script.clone().unwrap_or_default()), + } } } \ No newline at end of file diff --git a/dash-spv-coinjoin/src/models/tx_outpoint.rs b/dash-spv-coinjoin/src/models/tx_outpoint.rs index c5e135a0..5f91a983 100644 --- a/dash-spv-coinjoin/src/models/tx_outpoint.rs +++ b/dash-spv-coinjoin/src/models/tx_outpoint.rs @@ -1,45 +1,45 @@ -use std::io::{Error, Read, Write}; -use dash_spv_masternode_processor::crypto::byte_util::{Reversable, UInt256}; -use dash_spv_masternode_processor::consensus::encode; - -#[derive(Clone, Eq, PartialEq, Hash)] -pub struct TxOutPoint { - pub hash: UInt256, - pub index: u32, -} - -impl std::fmt::Debug for TxOutPoint { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("TxOutPoint") - .field("hash", &self.hash.reversed()) - .field("index", &self.index) - .finish() - } -} - -impl TxOutPoint { - pub fn new(hash: UInt256, index: u32) -> Self { - TxOutPoint { hash, index } - } -} - -impl encode::Encodable for TxOutPoint { - #[inline] - fn consensus_encode(&self, mut writer: W) -> Result { - let mut offset = 0; - offset += self.hash.consensus_encode(&mut writer)?; - offset += self.index.consensus_encode(&mut writer)?; - - Ok(offset) - } -} - -impl encode::Decodable for TxOutPoint { - #[inline] - fn consensus_decode(mut d: D) -> Result { - let hash = UInt256::consensus_decode(&mut d)?; - let index = u32::consensus_decode(&mut d)?; - - Ok(TxOutPoint { hash, index }) - } -} +// use std::io::{Read, Write}; +// use dashcore::consensus::{Decodable, Encodable}; +// use dashcore::consensus::encode::Error; +// +// #[derive(Clone, Eq, PartialEq, Hash)] +// pub struct TxOutPoint { +// pub hash: UInt256, +// pub index: u32, +// } +// +// impl std::fmt::Debug for TxOutPoint { +// fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +// f.debug_struct("TxOutPoint") +// .field("hash", &self.hash.reversed()) +// .field("index", &self.index) +// .finish() +// } +// } +// +// impl TxOutPoint { +// pub fn new(hash: UInt256, index: u32) -> Self { +// TxOutPoint { hash, index } +// } +// } +// +// impl Encodable for TxOutPoint { +// #[inline] +// fn consensus_encode(&self, mut writer: W) -> Result { +// let mut offset = 0; +// offset += self.hash.consensus_encode(&mut writer)?; +// offset += self.index.consensus_encode(&mut writer)?; +// +// Ok(offset) +// } +// } +// +// impl Decodable for TxOutPoint { +// #[inline] +// fn consensus_decode(mut d: D) -> Result { +// let hash = <[u8; 32]>::consensus_decode(&mut d)?; +// let index = u32::consensus_decode(&mut d)?; +// +// Ok(TxOutPoint { hash, index }) +// } +// } diff --git a/dash-spv-coinjoin/src/models/valid_in_outs.rs b/dash-spv-coinjoin/src/models/valid_in_outs.rs index c1829405..992a8a3b 100644 --- a/dash-spv-coinjoin/src/models/valid_in_outs.rs +++ b/dash-spv-coinjoin/src/models/valid_in_outs.rs @@ -1,13 +1,16 @@ use crate::messages::pool_message::PoolMessage; +#[derive(Clone)] +#[ferment_macro::export] pub struct ValidInOuts { pub result: bool, pub message_id: PoolMessage, pub consume_collateral: bool } +#[ferment_macro::export] impl ValidInOuts { - pub fn new() -> Self { + pub fn new() -> ValidInOuts { Self { result: true, message_id: PoolMessage::MsgNoErr, diff --git a/dash-spv-coinjoin/src/provider.rs b/dash-spv-coinjoin/src/provider.rs new file mode 100644 index 00000000..3ffea06d --- /dev/null +++ b/dash-spv-coinjoin/src/provider.rs @@ -0,0 +1,79 @@ +use std::os::raw::c_void; +use std::net::SocketAddr; +use std::sync::Arc; +use dashcore::sml::masternode_list::MasternodeList; +use dashcore::sml::masternode_list_entry::qualified_masternode_list_entry::QualifiedMasternodeListEntry; +use crate::messages::{PoolMessage, PoolState, PoolStatus}; + +// #[ferment_macro::opaque] +pub struct CoinJoinProvider { + pub context: *const c_void, + + pub get_masternode_list: Arc MasternodeList>, + pub update_success_block: Arc, + pub is_waiting_for_new_block: Arc bool>, + pub session_lifecycle_listener: Arc, bool)>, + pub mixing_lifecycle_listener: Arc)>, + masternode_by_hash: Arc Option>, + valid_mns_count: Arc usize>, + +} + +#[ferment_macro::export] +impl CoinJoinProvider { + pub fn new< + GML: Fn(*const c_void) -> MasternodeList + 'static, + USB: Fn(*const c_void) + 'static, + IWFNB: Fn(*const c_void) -> bool + 'static, + SLL: Fn(*const c_void, bool, i32, [u8; 32], u32, PoolState, PoolMessage, PoolStatus, Option, bool) + 'static, + MLL: Fn(*const c_void, bool, bool, Vec) + 'static, + MBH: Fn(*const c_void, [u8; 32]) -> Option + 'static, + VMC: Fn(*const c_void) -> usize + 'static, + + >( + get_masternode_list: GML, + update_success_block: USB, + is_waiting_for_new_block: IWFNB, + session_lifecycle_listener: SLL, + mixing_lifecycle_listener: MLL, + masternode_by_hash: MBH, + valid_mns_count: VMC, + context: *const c_void, + ) -> Self { + Self { + context, + get_masternode_list: Arc::new(get_masternode_list), + update_success_block: Arc::new(update_success_block), + is_waiting_for_new_block: Arc::new(is_waiting_for_new_block), + session_lifecycle_listener: Arc::new(session_lifecycle_listener), + mixing_lifecycle_listener: Arc::new(mixing_lifecycle_listener), + masternode_by_hash: Arc::new(masternode_by_hash), + valid_mns_count: Arc::new(valid_mns_count), + + } + } +} + +impl CoinJoinProvider { + pub fn queue_session_lifecycle(&self, is_complete: bool, base_session_id: i32, session_id: [u8; 32], session_denom: u32, state: PoolState, message: PoolMessage, status: PoolStatus, addr: Option, joined: bool) { + (self.session_lifecycle_listener)(self.context, is_complete, base_session_id, session_id, session_denom, state, message, status, addr, joined); + } + pub fn queue_mixing_lifecycle(&self, is_complete: bool, is_interrupted: bool, statuses: Vec) { + (self.mixing_lifecycle_listener)(self.context, is_complete, is_interrupted, statuses); + } + pub fn is_waiting_for_new_block(&self) -> bool { + (self.is_waiting_for_new_block)(self.context) + } + pub fn get_current_masternode_list(&self) -> MasternodeList { + (self.get_masternode_list)(self.context) + } + pub fn update_success_block(&self) { + (self.update_success_block)(self.context) + } + pub fn get_masternode_by_hash(&self, hash: [u8; 32]) -> Option { + (self.masternode_by_hash)(self.context, hash) + } + pub fn get_valid_mns_count(&self) -> usize { + (self.valid_mns_count)(self.context) + } +} \ No newline at end of file diff --git a/dash-spv-coinjoin/src/tests/coinjoin.rs b/dash-spv-coinjoin/src/tests/coinjoin.rs index 00d6c706..3ef88d3f 100644 --- a/dash-spv-coinjoin/src/tests/coinjoin.rs +++ b/dash-spv-coinjoin/src/tests/coinjoin.rs @@ -1,11 +1,7 @@ -use std::ffi::c_void; use std::{collections::HashMap, io::Cursor}; -use dash_spv_masternode_processor::ffi::unboxer::unbox_any; -use dash_spv_masternode_processor::types; -use dash_spv_masternode_processor::{hashes::hex::FromHex, consensus::Decodable}; -use dash_spv_masternode_processor::tx::transaction::Transaction; - -use crate::ffi::input_value::InputValue; +use dashcore::consensus::Decodable; +use dashcore::hashes::hex::FromHex; +use dashcore::Transaction; use crate::coinjoin::CoinJoin; #[test] @@ -42,8 +38,8 @@ fn standard_denomination_test() { assert_eq!(100001, CoinJoin::get_smallest_denomination()); - for value in CoinJoin::get_standard_denominations().iter() { - assert_eq!(*value as i64, CoinJoin::denomination_to_amount(CoinJoin::amount_to_denomination(*value))); + for value in CoinJoin::get_standard_denominations() { + assert_eq!(value as i64, CoinJoin::denomination_to_amount(CoinJoin::amount_to_denomination(value))); } } @@ -83,47 +79,45 @@ fn is_collateral_valid_test() { let tx = Transaction::consensus_decode(&mut cursor).unwrap(); let coinjoin = CoinJoin::new( - good_input_value, - has_chain_lock, - destroy_input_value, + |_, _, _| 40000, + |_, _| true, std::ptr::null() ); assert!(coinjoin.is_collateral_valid(&tx, true)); let coinjoin = CoinJoin::new( - bad_input_value, - has_chain_lock, - destroy_input_value, + |_, _, _| 10000, + |_, _| true, std::ptr::null() ); assert!(!coinjoin.is_collateral_valid(&tx, true)); } -extern "C" fn good_input_value( - _prevout_hash: *mut [u8; 32], - _index: u32, - _context: *const c_void, -) -> *mut InputValue { - Box::into_raw(Box::new(InputValue { is_valid: true, value: 40000 })) -} - -extern "C" fn bad_input_value( - _prevout_hash: *mut [u8; 32], - _index: u32, - _context: *const c_void, -) -> *mut InputValue { - Box::into_raw(Box::new(InputValue { is_valid: true, value: 10000 })) -} - -extern "C" fn has_chain_lock( - _block: *mut types::Block, - _context: *const c_void, -) -> bool { - true -} - -unsafe extern "C" fn destroy_input_value(input_value: *mut InputValue) { - let _res = unbox_any(input_value); -} +// extern "C" fn good_input_value( +// _prevout_hash: *mut [u8; 32], +// _index: u32, +// _context: *const c_void, +// ) -> *mut InputValue { +// Box::into_raw(Box::new(InputValue { is_valid: true, value: 40000 })) +// } +// +// extern "C" fn bad_input_value( +// _prevout_hash: *mut [u8; 32], +// _index: u32, +// _context: *const c_void, +// ) -> *mut InputValue { +// Box::into_raw(Box::new(InputValue { is_valid: true, value: 10000 })) +// } +// +// extern "C" fn has_chain_lock( +// _block: *mut types::Block, +// _context: *const c_void, +// ) -> bool { +// true +// } +// +// unsafe extern "C" fn destroy_input_value(input_value: *mut InputValue) { +// let _res = unbox_any(input_value); +// } diff --git a/dash-spv-coinjoin/src/tests/messages.rs b/dash-spv-coinjoin/src/tests/messages.rs index 62d6741a..232015a7 100644 --- a/dash-spv-coinjoin/src/tests/messages.rs +++ b/dash-spv-coinjoin/src/tests/messages.rs @@ -1,28 +1,30 @@ use std::io::Cursor; -use dash_spv_masternode_processor::consensus::{Decodable, Encodable}; -use dash_spv_masternode_processor::hashes::hex::{FromHex, ToHex}; -use dash_spv_masternode_processor::crypto::byte_util::{AsBytes, Reversable}; -use dash_spv_masternode_processor::crypto::{UInt256, UInt384, UInt768}; -use dash_spv_masternode_processor::models::OperatorPublicKey; -use dash_spv_masternode_processor::tx::Transaction; -use crate::messages::{self, CoinJoinEntry}; +use dashcore::blockdata::transaction::Transaction; +use dashcore::consensus::{Decodable, Encodable}; +use dashcore::hashes::Hash; +use dashcore::hashes::hex::FromHex; +use dashcore::hash_types::ProTxHash; +use dashcore::prelude::DisplayHex; +use dashcore::bls_sig_utils::BLSSignature; +use dash_spv_crypto::crypto::byte_util::Reversed; use crate::messages::coinjoin_broadcast_tx::CoinJoinBroadcastTx; +use crate::messages::{CoinJoinAcceptMessage, CoinJoinCompleteMessage, CoinJoinEntry, CoinJoinFinalTransaction, CoinJoinQueueMessage, CoinJoinSignedInputs, CoinJoinStatusUpdate, PoolMessage, PoolState, PoolStatusUpdate}; #[test] pub fn test_coinjoin_accept_message() { // CoinJoinAcceptMessage(denomination=16, txCollateral=956685418a5c4fecaedf74d2ac56862e22830658b6b256e4e2dea0b665e1f756) let payload = Vec::from_hex("100000000100000001c493c126391c84670115d1d5ed81b27a741a99a8942289bc82396da0b490795c000000006b483045022100d9899056ed6aceee4411b965a07a4a624fc43faca0112fae49129101942ae42f02205b92eefecf87975a356fd80a918978da49594baf8bb1082f527542e56f4f191d012102bc626099759860a95d13a6cdeb754efa5deec2178cc65142b92bbd90ab4d1364ffffffff01204e0000000000001976a914b2705af1d15ee81e96fce5ec49cd9ed6639362f188ac00000000").unwrap(); - let tx_id = UInt256::from_hex("956685418a5c4fecaedf74d2ac56862e22830658b6b256e4e2dea0b665e1f756").unwrap().reversed(); + let tx_id = <[u8; 32]>::from_hex("956685418a5c4fecaedf74d2ac56862e22830658b6b256e4e2dea0b665e1f756").unwrap().reversed(); let mut cursor = Cursor::new(&payload); - let dca = messages::CoinJoinAcceptMessage::consensus_decode(&mut cursor).unwrap(); + let dca = CoinJoinAcceptMessage::consensus_decode(&mut cursor).unwrap(); let mut buffer = Vec::new(); dca.consensus_encode(&mut buffer).unwrap(); assert_eq!(16, dca.denomination); - assert_eq!(buffer.to_hex(), payload.to_hex()); - assert_eq!(Some(tx_id), dca.tx_collateral.tx_hash); + assert_eq!(buffer.to_lower_hex_string(), payload.to_lower_hex_string()); + assert_eq!(tx_id, dca.tx_collateral.txid().to_byte_array()); } @@ -32,31 +34,31 @@ pub fn test_coinjoin_complete_message() { let payload = Vec::from_hex("0362080014000000").unwrap(); let mut cursor = Cursor::new(&payload); - let dsc = messages::CoinJoinCompleteMessage::consensus_decode(&mut cursor).unwrap(); + let dsc = CoinJoinCompleteMessage::consensus_decode(&mut cursor).unwrap(); - let from_ctor = messages::CoinJoinCompleteMessage { + let from_ctor = CoinJoinCompleteMessage { msg_session_id: 549379, - msg_message_id: messages::PoolMessage::MsgSuccess + msg_message_id: PoolMessage::MsgSuccess }; let mut buffer = Vec::new(); from_ctor.consensus_encode(&mut buffer).unwrap(); assert_eq!(20, dsc.msg_message_id.value()); assert_eq!(549379, dsc.msg_session_id); - assert_eq!(buffer.to_hex(), payload.to_hex()); + assert_eq!(buffer.to_lower_hex_string(), payload.to_lower_hex_string()); } #[test] pub fn test_coinjoin_final_transaction() { // CoinJoinFinalTransaction(msgSessionID=512727, transaction=a57015f0f8c85cdee8ab47d9bb7792c23c21bfbad1a19b7b4368915ba970fae1) let payload = Vec::from_hex("d7d20700020000000424e55da190e79da9540b0fc87e859261e4a2a33530a005cab68f5cd3ece0234a0200000000fffffffff7b9fdaf651dc308b6f538ac9dae090268f08f424fd91c705fe5d12174999f5d0400000000ffffffff20d63b2ca93309e3526cac6fab31545bd932ba705e7011e720ba69af59baaba10000000000ffffffff20d63b2ca93309e3526cac6fab31545bd932ba705e7011e720ba69af59baaba10300000000ffffffff044a420f00000000001976a914257b0482306f29fe7d97fb8b847746ba4a1606e588ac4a420f00000000001976a9146662e6130b7b1f06778ae1e24b687db752e1a83d88ac4a420f00000000001976a914ac2faba75d50cdd8dff86b8a457c45201aefb96f88ac4a420f00000000001976a914b89ab9894c767e22e85e2164b9f65fc0a4c3dc7e88ac00000000").unwrap(); - let tx_id = UInt256::from_hex("a57015f0f8c85cdee8ab47d9bb7792c23c21bfbad1a19b7b4368915ba970fae1").unwrap().reversed(); + let tx_id = <[u8; 32]>::from_hex("a57015f0f8c85cdee8ab47d9bb7792c23c21bfbad1a19b7b4368915ba970fae1").unwrap().reversed(); let mut cursor = Cursor::new(&payload); - let dsf = messages::CoinJoinFinalTransaction::consensus_decode(&mut cursor).unwrap(); + let dsf = CoinJoinFinalTransaction::consensus_decode(&mut cursor).unwrap(); - let tx_hash = dsf.tx.tx_hash; - let from_ctor = messages::CoinJoinFinalTransaction { + let tx_hash = dsf.tx.txid(); + let from_ctor = CoinJoinFinalTransaction { msg_session_id: 512727, tx: dsf.tx }; @@ -64,8 +66,8 @@ pub fn test_coinjoin_final_transaction() { from_ctor.consensus_encode(&mut buffer).unwrap(); assert_eq!(512727, dsf.msg_session_id); - assert_eq!(Some(tx_id), tx_hash); - assert_eq!(buffer.to_hex(), payload.to_hex()); + assert_eq!(tx_id, tx_hash.to_byte_array()); + assert_eq!(buffer.to_lower_hex_string(), payload.to_lower_hex_string()); } #[test] @@ -73,45 +75,45 @@ pub fn test_coinjoin_status_update_from_payload() { // CoinJoinStatusUpdate(sessionID=783283, state=POOL_STATE_QUEUE, statusUpdate=STATUS_REJECTED, messageID=ERR_DENOM) let mut payload = Vec::from_hex("b3f30b00010000000000000001000000").unwrap(); let mut cursor = Cursor::new(&payload); - let mut dssu = messages::CoinJoinStatusUpdate::consensus_decode(&mut cursor).unwrap(); + let mut dssu = CoinJoinStatusUpdate::consensus_decode(&mut cursor).unwrap(); assert_eq!(783283, dssu.session_id); - assert_eq!(messages::PoolState::Queue, dssu.pool_state); - assert_eq!(messages::PoolStatusUpdate::Rejected, dssu.status_update); - assert_eq!(messages::PoolMessage::ErrDenom, dssu.message_id); + assert_eq!(PoolState::Queue, dssu.pool_state); + assert_eq!(PoolStatusUpdate::Rejected, dssu.status_update); + assert_eq!(PoolMessage::ErrDenom, dssu.message_id); payload = Vec::from_hex("d7d20700030000000100000013000000").unwrap(); cursor = Cursor::new(&payload); - dssu = messages::CoinJoinStatusUpdate::consensus_decode(&mut cursor).unwrap(); + dssu = CoinJoinStatusUpdate::consensus_decode(&mut cursor).unwrap(); assert_eq!(512727, dssu.session_id); - assert_eq!(messages::PoolState::Signing, dssu.pool_state); - assert_eq!(messages::PoolStatusUpdate::Accepted, dssu.status_update); - assert_eq!(messages::PoolMessage::MsgNoErr, dssu.message_id); + assert_eq!(PoolState::Signing, dssu.pool_state); + assert_eq!(PoolStatusUpdate::Accepted, dssu.status_update); + assert_eq!(PoolMessage::MsgNoErr, dssu.message_id); } #[test] pub fn test_coinjoin_status_update_from_ctor() { let payload = Vec::from_hex("5faa0c00010000000100000013000000").unwrap(); let mut cursor = Cursor::new(&payload); - let dssu = messages::CoinJoinStatusUpdate::consensus_decode(&mut cursor).unwrap(); + let dssu = CoinJoinStatusUpdate::consensus_decode(&mut cursor).unwrap(); assert_eq!(830047, dssu.session_id); - assert_eq!(messages::PoolState::Queue, dssu.pool_state); - assert_eq!(messages::PoolStatusUpdate::Accepted, dssu.status_update); - assert_eq!(messages::PoolMessage::MsgNoErr, dssu.message_id); + assert_eq!(PoolState::Queue, dssu.pool_state); + assert_eq!(PoolStatusUpdate::Accepted, dssu.status_update); + assert_eq!(PoolMessage::MsgNoErr, dssu.message_id); - let from_ctor = messages::CoinJoinStatusUpdate { + let from_ctor = CoinJoinStatusUpdate { session_id: 830047, - pool_state: messages::PoolState::Queue, - status_update: messages::PoolStatusUpdate::Accepted, - message_id: messages::PoolMessage::MsgNoErr + pool_state: PoolState::Queue, + status_update: PoolStatusUpdate::Accepted, + message_id: PoolMessage::MsgNoErr }; let mut buffer = Vec::new(); from_ctor.consensus_encode(&mut buffer).unwrap(); - assert_eq!(buffer.to_hex(), payload.to_hex()); + assert_eq!(buffer.to_lower_hex_string(), payload.to_lower_hex_string()); } #[test] @@ -120,17 +122,17 @@ pub fn coinjoin_signed_inputs_round_test() { let mut cursor = Cursor::new(&tx_data); let tx = Transaction::consensus_decode(&mut cursor).unwrap(); - let dss = messages::CoinJoinSignedInputs { inputs: tx.inputs }; // using inputs from the transaction above + let dss = CoinJoinSignedInputs { inputs: tx.input }; // using inputs from the transaction above let mut buffer = Vec::new(); dss.consensus_encode(&mut buffer).unwrap(); cursor = Cursor::new(&buffer); - let from_bytes = messages::CoinJoinSignedInputs::consensus_decode(&mut cursor).unwrap(); + let from_bytes = CoinJoinSignedInputs::consensus_decode(&mut cursor).unwrap(); assert_eq!(4, from_bytes.inputs.len()); assert_eq!(4, dss.inputs.len()); - assert_eq!(from_bytes.inputs[0].input_hash, dss.inputs[0].input_hash); - assert_eq!(from_bytes.inputs[2].input_hash, dss.inputs[2].input_hash); + assert_eq!(from_bytes.inputs[0].previous_output.txid, dss.inputs[0].previous_output.txid); + assert_eq!(from_bytes.inputs[2].previous_output.txid, dss.inputs[2].previous_output.txid); } #[test] @@ -143,9 +145,9 @@ pub fn coinjoin_entry_round_test() { cursor = Cursor::new(&tx_data); let tx2 = Transaction::consensus_decode(&mut cursor).unwrap(); - let dsi = messages::CoinJoinEntry { - mixing_inputs: tx1.inputs, - mixing_outputs: tx1.outputs, + let dsi = CoinJoinEntry { + mixing_inputs: tx1.input, + mixing_outputs: tx1.output, tx_collateral: tx2 }; @@ -153,20 +155,20 @@ pub fn coinjoin_entry_round_test() { dsi.consensus_encode(&mut buffer).unwrap(); cursor = Cursor::new(&buffer); - let from_bytes = messages::CoinJoinEntry::consensus_decode(&mut cursor).unwrap(); + let from_bytes = CoinJoinEntry::consensus_decode(&mut cursor).unwrap(); assert_eq!(4, from_bytes.mixing_inputs.len()); assert_eq!(4, dsi.mixing_inputs.len()); assert_eq!(2, from_bytes.mixing_outputs.len()); assert_eq!(2, dsi.mixing_outputs.len()); - assert_eq!(from_bytes.mixing_inputs[0].input_hash, dsi.mixing_inputs[0].input_hash); - assert_eq!(from_bytes.mixing_inputs[2].input_hash, dsi.mixing_inputs[2].input_hash); + assert_eq!(from_bytes.mixing_inputs[0].previous_output.txid, dsi.mixing_inputs[0].previous_output.txid); + assert_eq!(from_bytes.mixing_inputs[2].previous_output.txid, dsi.mixing_inputs[2].previous_output.txid); - assert_eq!(from_bytes.mixing_outputs[0].amount, dsi.mixing_outputs[0].amount); - assert_eq!(from_bytes.mixing_outputs[1].amount, dsi.mixing_outputs[1].amount); + assert_eq!(from_bytes.mixing_outputs[0].value, dsi.mixing_outputs[0].value); + assert_eq!(from_bytes.mixing_outputs[1].value, dsi.mixing_outputs[1].value); - assert_eq!(from_bytes.tx_collateral.tx_hash, dsi.tx_collateral.tx_hash); + assert_eq!(from_bytes.tx_collateral.txid(), dsi.tx_collateral.txid()); } #[test] @@ -188,7 +190,7 @@ pub fn coinjoin_broadcast_tx_round_test() { let tx_data = Vec::from_hex("02000000042607763cf6eceb2478060ead38fbb3151b7676b6a243e78b58c420a4ad99cb05010000006a47304402201f95f3a194bd51c521adcd46173d3d5c9bd2dd148004dd1da72e686fd6d946e4022020e34d85cd817aff0663b133915ca2eda5ecd5d5a93fba33f2e9644f1d1513a3012102bf7c36100b0d394e79a1704b8bf9e030a62e139a293f5da891671c56d555f732feffffffe27ecbb210e98a5d2dba6e3bfa0732b8f6371155c3f8bd0420027d2eb3d24a7d010000006b483045022100c7d5c710ebdf8a2526389347823c3de83b3da498eeac5d1e9001e2e86f4cd0d002200e91ee98abc4f5fb5a78e8e80ed6fd17697a706e7118f87e545d8fdad65a845b012102bf7c36100b0d394e79a1704b8bf9e030a62e139a293f5da891671c56d555f732feffffff70a65da4b8d4438058c2e8f36811577cdb244d33c7973644386259135e3635a3010000006b483045022100d1c279574bdb0a4c72b6a11247f2945746b50f3a847c9c6925f0badfa8f5827a0220059884f1e9099fcfbb4966cced355e764ddf18bc60a3e03a3804c0c9b20618a4012102bf7c36100b0d394e79a1704b8bf9e030a62e139a293f5da891671c56d555f732feffffff4605e08cc9758029e89705c41872f063854684b5abf2020e56aca53f161b3fea000000006b483045022100f5afc8c1e722b25532b0a3561f0c37cf80bcd288a40fa0ced53d9a137f06dbc8022067c8ad28484b4a504f74cc7ad754ab4b87f0fbb46a4725e915b625eb000be8fd012102bf7c36100b0d394e79a1704b8bf9e030a62e139a293f5da891671c56d555f732feffffff02224e0000000000001976a914b889fb3449a36530c85d9689c4773c5cd1ba223388ac51844c8c060000001976a9140d5bcbeeb459af40f97fcb4a98e9d1ed13e904c888acb1f80a00").unwrap(); let mut cursor = Cursor::new(&tx_data); let tx = Transaction::consensus_decode(&mut cursor).unwrap(); - let pro_tx_hash = UInt256::from_hex("3fc39b657385a7d2e824ca2644bdcddcef0bc25775c30c4f747345ef4f1c7503").unwrap().reversed(); + let pro_tx_hash = <[u8; 32]>::from_hex("3fc39b657385a7d2e824ca2644bdcddcef0bc25775c30c4f747345ef4f1c7503").unwrap().reversed(); let signature = Vec::from_hex("998c5118eef9a89bfe5c6b961a8cc5af52cb00d0394688e78b23194699f7356cece6f8af63fdb0c28c2728c05325a6fe").unwrap(); let signature_time: i64 = 1702813411; @@ -199,9 +201,9 @@ pub fn coinjoin_broadcast_tx_round_test() { cursor = Cursor::new(&buffer); let from_bytes = CoinJoinBroadcastTx::consensus_decode(&mut cursor).unwrap(); - assert_eq!(dstx.tx.tx_hash, from_bytes.tx.tx_hash); + assert_eq!(dstx.tx.txid(), from_bytes.tx.txid()); assert_eq!(dstx.pro_tx_hash, from_bytes.pro_tx_hash); - assert_eq!(dstx.signature.unwrap().to_hex(), from_bytes.signature.unwrap().to_hex()); + assert_eq!(dstx.signature.unwrap().to_lower_hex_string(), from_bytes.signature.unwrap().to_lower_hex_string()); assert_eq!(dstx.signature_time, from_bytes.signature_time); } @@ -209,34 +211,31 @@ pub fn coinjoin_broadcast_tx_round_test() { pub fn coinjoin_queue_message_test() { let payload = Vec::from_hex("0800000036c6298f595939395ec930f936452726f33a311a79b2abe290ae01aad020011652498465000000000060a4f1ebf98b3b2df98c6375d391c4aba667edbaccb31610a8ded1eaba92c87ce59d2dcbea67fd59d212edd87553fbbeac0041bc514782b3ae5184f6d194c3dbdd8f94b5ce5e0e358aed3557b18188d51cbbcda80fba2ff7dabb808029ba255431").unwrap(); let mut cursor = Cursor::new(&payload); - let queue_from_hex = messages::CoinJoinQueueMessage::consensus_decode(&mut cursor).unwrap(); + let queue_from_hex = CoinJoinQueueMessage::consensus_decode(&mut cursor).unwrap(); assert_eq!(8, queue_from_hex.denomination); - assert_eq!(UInt256::from_hex("160120d0aa01ae90e2abb2791a313af326274536f930c95e393959598f29c636").unwrap().reversed(), queue_from_hex.pro_tx_hash); + assert_eq!(ProTxHash::from_byte_array(<[u8; 32]>::from_hex("160120d0aa01ae90e2abb2791a313af326274536f930c95e393959598f29c636").unwrap().reversed()), queue_from_hex.pro_tx_hash); assert_eq!(1703168338, queue_from_hex.time); assert_eq!(false, queue_from_hex.ready); - assert_eq!(UInt768::from_hex("a4f1ebf98b3b2df98c6375d391c4aba667edbaccb31610a8ded1eaba92c87ce59d2dcbea67fd59d212edd87553fbbeac0041bc514782b3ae5184f6d194c3dbdd8f94b5ce5e0e358aed3557b18188d51cbbcda80fba2ff7dabb808029ba255431").unwrap(), queue_from_hex.signature.unwrap()); + assert_eq!(BLSSignature::from_hex("a4f1ebf98b3b2df98c6375d391c4aba667edbaccb31610a8ded1eaba92c87ce59d2dcbea67fd59d212edd87553fbbeac0041bc514782b3ae5184f6d194c3dbdd8f94b5ce5e0e358aed3557b18188d51cbbcda80fba2ff7dabb808029ba255431").unwrap(), queue_from_hex.signature.unwrap()); - let queue_from_ctor = messages::CoinJoinQueueMessage { + let queue_from_ctor = CoinJoinQueueMessage { denomination: 8, - pro_tx_hash: UInt256::from_hex("160120d0aa01ae90e2abb2791a313af326274536f930c95e393959598f29c636").unwrap().reversed(), + pro_tx_hash: ProTxHash::from_byte_array(<[u8; 32]>::from_hex("160120d0aa01ae90e2abb2791a313af326274536f930c95e393959598f29c636").unwrap().reversed()), time: 1703168338, ready: false, - signature: UInt768::from_hex("a4f1ebf98b3b2df98c6375d391c4aba667edbaccb31610a8ded1eaba92c87ce59d2dcbea67fd59d212edd87553fbbeac0041bc514782b3ae5184f6d194c3dbdd8f94b5ce5e0e358aed3557b18188d51cbbcda80fba2ff7dabb808029ba255431").ok(), + signature: BLSSignature::from_hex("a4f1ebf98b3b2df98c6375d391c4aba667edbaccb31610a8ded1eaba92c87ce59d2dcbea67fd59d212edd87553fbbeac0041bc514782b3ae5184f6d194c3dbdd8f94b5ce5e0e358aed3557b18188d51cbbcda80fba2ff7dabb808029ba255431").ok(), tried: false }; let mut buffer = Vec::new(); queue_from_ctor.consensus_encode(&mut buffer).unwrap(); assert_eq!(queue_from_hex, queue_from_ctor); - assert_eq!(buffer.to_hex(), payload.to_hex()); + assert_eq!(buffer.to_lower_hex_string(), payload.to_lower_hex_string()); assert_eq!(false, queue_from_ctor.tried); - let masternode_operator_key = OperatorPublicKey { - data: UInt384::from_hex("066d57a6451b7800c1c2a6c6e04fe73ec2e1c95e492bacae760ad2f79ca3c30727ec9bf0daea43c08ff1ad6c2cf07612").unwrap(), - version: 1 - }; - println!("op_key raw data: {}", masternode_operator_key.data.0.to_hex()); + let operator_key = <[u8; 48]>::from_hex("066d57a6451b7800c1c2a6c6e04fe73ec2e1c95e492bacae760ad2f79ca3c30727ec9bf0daea43c08ff1ad6c2cf07612").unwrap(); + println!("op_key raw data: {}", operator_key.to_lower_hex_string()); - assert!(queue_from_ctor.check_signature(masternode_operator_key)); + assert!(queue_from_ctor.check_signature(operator_key, true)); } diff --git a/dash-spv-coinjoin/src/tests/models.rs b/dash-spv-coinjoin/src/tests/models.rs index 08ca207a..16a65706 100644 --- a/dash-spv-coinjoin/src/tests/models.rs +++ b/dash-spv-coinjoin/src/tests/models.rs @@ -1,25 +1,27 @@ use std::io::Cursor; -use dash_spv_masternode_processor::hashes::hex::{FromHex, ToHex}; -use dash_spv_masternode_processor::crypto::{byte_util::Reversable, UInt256}; -use dash_spv_masternode_processor::consensus::{Decodable, Encodable}; -use crate::models::tx_outpoint::TxOutPoint; +use dashcore::hashes::hex::FromHex; +use dashcore::hash_types::Txid; +use dashcore::blockdata::transaction::OutPoint; +use dashcore::consensus::{Decodable, Encodable}; +use dashcore::prelude::DisplayHex; #[test] pub fn test_transaction_outpoint_payload() { let hex = "e2f910eb47e2dde768b9f89e1a84607ac559c0f9628ff0b44b49de0a92e5b0ce00000000"; let outpoint_data = Vec::from_hex(hex).unwrap(); let mut cursor = Cursor::new(&outpoint_data); - let outpoint = TxOutPoint::consensus_decode(&mut cursor).unwrap(); + let outpoint = OutPoint::consensus_decode(&mut cursor).unwrap(); - let hash = UInt256::from_hex("ceb0e5920ade494bb4f08f62f9c059c57a60841a9ef8b968e7dde247eb10f9e2").unwrap().reversed(); + let hash = Txid::from_hex("ceb0e5920ade494bb4f08f62f9c059c57a60841a9ef8b968e7dde247eb10f9e2").unwrap(); + // let hash = <[u8; 32]>::from_hex("ceb0e5920ade494bb4f08f62f9c059c57a60841a9ef8b968e7dde247eb10f9e2").unwrap().reversed(); - assert_eq!(hash, outpoint.hash); - assert_eq!(0, outpoint.index); + assert_eq!(hash, outpoint.txid); + assert_eq!(0, outpoint.vout); - let from_ctor = TxOutPoint { hash, index: 0 }; + let from_ctor = OutPoint { txid: Txid::from(hash), vout: 0 }; let mut buffer = Vec::new(); from_ctor.consensus_encode(&mut buffer).unwrap(); - assert_eq!(hash, outpoint.hash); - assert_eq!(hex, buffer.to_hex()); + assert_eq!(hash, outpoint.txid); + assert_eq!(hex, buffer.to_lower_hex_string()); } \ No newline at end of file diff --git a/dash-spv-coinjoin/src/utils/coin_format.rs b/dash-spv-coinjoin/src/utils/coin_format.rs index 0ea257b0..89d5e388 100644 --- a/dash-spv-coinjoin/src/utils/coin_format.rs +++ b/dash-spv-coinjoin/src/utils/coin_format.rs @@ -1,4 +1,4 @@ -use dash_spv_masternode_processor::chain::params::DUFFS; +use dash_spv_crypto::util::params::DUFFS; pub trait CoinFormat { fn to_friendly_string(self) -> String; diff --git a/dash-spv-coinjoin/src/utils/key_holder_storage.rs b/dash-spv-coinjoin/src/utils/key_holder_storage.rs index 5b3cef89..aa009889 100644 --- a/dash-spv-coinjoin/src/utils/key_holder_storage.rs +++ b/dash-spv-coinjoin/src/utils/key_holder_storage.rs @@ -1,5 +1,4 @@ use std::{cell::RefCell, rc::Rc}; -use tracing::info; use logging::*; use crate::{utils::key_holder::KeyHolder, wallet_ex::WalletEx}; @@ -18,8 +17,7 @@ impl KeyHolderStorage { let key_holder = KeyHolder::new(wallet); let script = key_holder.destination.clone(); self.storage.push(key_holder); - - return script; + script } pub fn keep_all(&mut self) { diff --git a/dash-spv-coinjoin/src/utils/transaction_builder.rs b/dash-spv-coinjoin/src/utils/transaction_builder.rs index e30a944e..a30d683d 100644 --- a/dash-spv-coinjoin/src/utils/transaction_builder.rs +++ b/dash-spv-coinjoin/src/utils/transaction_builder.rs @@ -1,20 +1,21 @@ use std::cell::RefCell; use std::fmt; use std::rc::Rc; -use tracing::{info, debug}; +use dashcore::psbt::serialize::Serialize; +use dashcore::blockdata::transaction::Transaction; +use dashcore::blockdata::transaction::txin::TxIn; +use dashcore::blockdata::transaction::txout::TxOut; +use dashcore::blockdata::script::ScriptBuf; +use dashcore::consensus::Encodable; +use dashcore::hashes::Hash; +use dash_spv_crypto::network::ChainType; +use dash_spv_crypto::network::TXIN_SEQUENCE; +use dash_spv_crypto::util::data_append::DataAppend; +use dash_spv_crypto::util::params::TX_MIN_OUTPUT_AMOUNT; use logging::*; -use dash_spv_masternode_processor::chain::common::ChainType; -use dash_spv_masternode_processor::chain::params::TX_MIN_OUTPUT_AMOUNT; -use dash_spv_masternode_processor::chain::tx::protocol::TXIN_SEQUENCE; -use dash_spv_masternode_processor::consensus::Encodable; -use dash_spv_masternode_processor::crypto::UInt256; -use dash_spv_masternode_processor::ffi::ByteArray; -use dash_spv_masternode_processor::tx::{Transaction, TransactionInput, TransactionOutput, TransactionType}; -use dash_spv_masternode_processor::util::data_append::DataAppend; use crate::coin_selection::compact_tally_item::CompactTallyItem; use crate::constants::REFERENCE_DEFAULT_MIN_TX_FEE; -use crate::ffi::recepient::Recipient; use crate::utils::coin_format::CoinFormat; use crate::wallet_ex::WalletEx; use crate::models::coin_control::CoinControl; @@ -67,27 +68,39 @@ impl<'a> TransactionBuilder { coin_control.allow_other_inputs = false; let mut dummy_tx = Transaction { - inputs: Vec::new(), - outputs: Vec::new(), + version: 0, lock_time: 0, - version: 0, - tx_hash: None, - tx_type: TransactionType::Classic, - payload_offset: 0, - block_height: 0 + input: vec![], + output: vec![], + special_transaction_payload: None }; - + // let mut dummy_tx = Transaction { + // inputs: Vec::new(), + // outputs: Vec::new(), + // lock_time: 0, + // version: 0, + // tx_hash: None, + // tx_type: TransactionType::Classic, + // payload_offset: 0, + // block_height: 0 + // }; + // // Select all tallyItem outputs in the coinControl so that CreateTransaction knows what to use for coin in &tally_item.input_coins { coin_control.select(coin.tx_outpoint.clone()); - let input = TransactionInput { - input_hash: coin.tx_outpoint.hash, - index: coin.tx_outpoint.index, - script: None, - signature: Some(Vec::new()), - sequence: TXIN_SEQUENCE - }; - dummy_tx.inputs.push(input); + // let input = TransactionInput { + // input_hash: coin.tx_outpoint.hash, + // index: coin.tx_outpoint.index, + // script: None, + // signature: Some(Vec::new()), + // sequence: TXIN_SEQUENCE + // }; + dummy_tx.input.push(TxIn { + previous_output: coin.tx_outpoint, + script_sig: ScriptBuf::from(vec![]), + sequence: TXIN_SEQUENCE, + witness: Default::default(), + }); } let bytes_base = TransactionBuilder::calculate_maximum_signed_tx_size(wallet_ex.clone(), &mut dummy_tx); @@ -112,7 +125,7 @@ impl<'a> TransactionBuilder { pub fn could_add_output(&self, amount_output: u64) -> bool { // Adding another output can change the serialized size of the vout size hence + GetSizeOfCompactSizeDiff() let bytes = self.get_bytes_total() + self.bytes_output + self.get_size_of_compact_size_diff(1); - return TransactionBuilder::get_amount_left(self.get_amount_initial() as i64, (self.get_amount_used() + amount_output) as i64, self.get_fee(bytes as u64) as i64) >= 0; + TransactionBuilder::get_amount_left(self.get_amount_initial() as i64, (self.get_amount_used() + amount_output) as i64, self.get_fee(bytes as u64) as i64) >= 0 } /// Check if it's possible to add multiple outputs as vector of amounts. Returns true if its possible to add all of them and false if not. @@ -126,17 +139,17 @@ impl<'a> TransactionBuilder { } // Adding other outputs can change the serialized size of the vout size hence + GetSizeOfCompactSizeDiff() let bytes = self.get_bytes_total() + bytes_additional + self.get_size_of_compact_size_diff(vec_len); - return TransactionBuilder::get_amount_left(self.get_amount_initial() as i64, self.get_amount_used() as i64 + amount_additional as i64, self.get_fee(bytes as u64) as i64) >= 0; + TransactionBuilder::get_amount_left(self.get_amount_initial() as i64, self.get_amount_used() as i64 + amount_additional as i64, self.get_fee(bytes as u64) as i64) >= 0 } /// Get amount we had available when we started pub fn get_amount_initial(&self) -> u64 { - return self.tally_item.amount; + self.tally_item.amount } /// Helper to calculate static amount left by simply subtracting an used amount and a fee from a provided initial amount. pub fn get_amount_left(amount_initial: i64, amount_used: i64, fee: i64) -> i64{ - return amount_initial - amount_used - fee; + amount_initial - amount_used - fee } /// Get the amount currently left to add more outputs. Does respect fees. @@ -146,40 +159,37 @@ impl<'a> TransactionBuilder { let bytes_total = self.get_bytes_total(); let fee = self.get_fee(bytes_total as u64); - return initial.saturating_sub(used).saturating_sub(fee); + initial.saturating_sub(used).saturating_sub(fee) } /// Check if an amounts should be considered as dust pub fn is_dust(amount: u64) -> bool { - return TX_MIN_OUTPUT_AMOUNT > amount; + TX_MIN_OUTPUT_AMOUNT > amount } /// Add an output with the amount. Returns a pointer to the output if it could be added and nullptr if not due to insufficient amount left. pub fn add_zero_output(&mut self) -> bool { - return self.add_output(0) + self.add_output(0) } pub fn add_output(&mut self, amount_output: u64) -> bool { if self.could_add_output(amount_output) { - self.outputs.push(TransactionBuilderOutput::new(self.wallet_ex.clone(), amount_output as u64, self.dry_run)); + self.outputs.push(TransactionBuilderOutput::new(self.wallet_ex.clone(), amount_output, self.dry_run)); return true; } - return false; + false } - pub fn commit(&mut self, str_result: &mut String, is_denominating: bool, client_session_id: UInt256) -> bool { - let vec_send: Vec = self.outputs + pub fn commit(&mut self, str_result: &mut String, is_denominating: bool, client_session_id: [u8; 32]) -> bool { + let vec_send: Vec = self.outputs .iter() .filter(|x| x.script.is_some()) - .map(|out| Recipient { - script_pub_key: ByteArray::from(out.script.clone().unwrap()), - amount: out.amount - }) + .map(TransactionBuilderOutput::build_output) .collect(); - log_debug!(target: "CoinJoin", "tx_builder.commit: {:?}", vec_send.iter().map(|f| f.amount).collect::>()); + log_debug!(target: "CoinJoin", "tx_builder.commit: {:?}", vec_send.iter().map(|f| f.value).collect::>()); - if !self.wallet_ex.borrow().commit_transaction(&vec_send, self.coin_control.clone(), is_denominating, client_session_id) { + if !self.wallet_ex.borrow().commit_transaction(vec_send, self.coin_control.clone(), is_denominating, client_session_id) { log_debug!(target: "CoinJoin", "tx_builder.commit: Failed to commit transaction"); str_result.push_str("Failed to commit transaction"); return false; @@ -188,15 +198,15 @@ impl<'a> TransactionBuilder { log_debug!(target: "CoinJoin", "tx_builder.commit: Transaction committed"); str_result.push_str("Transaction committed"); self.keep_keys = true; - return true; + true } fn calculate_maximum_signed_tx_size(wallet_ex: Rc>, tx: &mut Transaction) -> i32 { - for input in tx.inputs.iter_mut() { - match wallet_ex.borrow().get_wallet_transaction(input.input_hash) { + for input in tx.input.iter_mut() { + match wallet_ex.borrow().get_wallet_transaction(input.previous_output.txid.to_byte_array()) { Some(transaction) => { - assert!(input.index < transaction.outputs.len() as u32, "Index out of bounds"); - input.script = transaction.outputs[input.index as usize].script.clone(); + assert!(input.previous_output.vout < transaction.output.len() as u32, "Index out of bounds"); + input.script_sig = transaction.output[input.previous_output.vout as usize].script_pubkey.clone(); }, None => { // Cannot estimate size without knowing the input details @@ -205,36 +215,36 @@ impl<'a> TransactionBuilder { } } - if let Some(signed_tx) = wallet_ex.borrow().sign_transaction(&tx, false) { - return signed_tx.to_data().len() as i32; + if let Some(signed_tx) = wallet_ex.borrow().sign_transaction(tx.clone(), false) { + signed_tx.serialize().len() as i32 + } else { + log_info!(target: "CoinJoin", "TxBuilder: Could not sign transaction"); + -1 } - - log_info!(target: "CoinJoin", "TxBuilder: Could not sign transaction"); - return -1; } fn calculate_bytes_output(chain_type: ChainType) -> i32 { let script_map = chain_type.script_map(); let pub_key = Vec::::script_pub_key_for_address(&TransactionBuilder::get_dummy_address(chain_type), &script_map); - let tx_output = TransactionOutput { amount: 0, script: Some(pub_key), address: None }; + let tx_output = TxOut { value: 0, script_pubkey: ScriptBuf::from(pub_key) }; let mut buffer = Vec::new(); tx_output.consensus_encode(&mut buffer).unwrap(); - return buffer.len() as i32; + buffer.len() as i32 } fn get_dummy_address(chain_type: ChainType) -> String { - return if chain_type == ChainType::MainNet { "XqQHMfqiEbmswPk7Ruhfq3WKrgANDunDgG".to_string() } else { "yVkt3e49pAj11jSj4HAnzVAWmy4VD1MwZd".to_string() }; + if chain_type == ChainType::MainNet { "XqQHMfqiEbmswPk7Ruhfq3WKrgANDunDgG".to_string() } else { "yVkt3e49pAj11jSj4HAnzVAWmy4VD1MwZd".to_string() } } fn get_bytes_total(&self) -> i32 { - return self.bytes_base + self.outputs.len() as i32 * self.bytes_output + self.get_size_of_compact_size_diff(self.outputs.len()); + self.bytes_base + self.outputs.len() as i32 * self.bytes_output + self.get_size_of_compact_size_diff(self.outputs.len()) } fn get_size_of_compact_size_diff(&self, add: usize) -> i32 { let size = self.outputs.len(); - return self.get_compact_size_diff(size, size + add); + self.get_compact_size_diff(size, size + add) } fn get_compact_size_diff(&self, old_size: usize, new_size: usize) -> i32 { @@ -242,7 +252,7 @@ impl<'a> TransactionBuilder { let old_var_int_size = (old_size as i32).consensus_encode(&mut buffer).unwrap() as i32; let new_var_int_size = (new_size as i32).consensus_encode(&mut buffer).unwrap() as i32; - return old_var_int_size - new_var_int_size; + old_var_int_size - new_var_int_size } fn get_amount_used(&self) -> u64 { @@ -250,7 +260,7 @@ impl<'a> TransactionBuilder { for output in &self.outputs { amount += output.amount; } - return amount; + amount } /// Get fees based on the number of bytes and the feerate set in CoinControl. @@ -268,7 +278,7 @@ impl<'a> TransactionBuilder { fee_calc = REFERENCE_DEFAULT_MIN_TX_FEE; } - return fee_calc; + fee_calc } /// Clear the output vector and keep/return the included keys depending on the value of fKeepKeys diff --git a/dash-spv-coinjoin/src/wallet_ex.rs b/dash-spv-coinjoin/src/wallet_ex.rs index 4bb3c426..b89e1127 100644 --- a/dash-spv-coinjoin/src/wallet_ex.rs +++ b/dash-spv-coinjoin/src/wallet_ex.rs @@ -1,118 +1,89 @@ -use std::cell::RefCell; use std::collections::{HashSet, HashMap}; -use std::ffi::CString; -use std::rc::Rc; -use std::slice; -use byte::{BytesExt, LE}; -use dash_spv_masternode_processor::chain::tx::protocol::TXIN_SEQUENCE; -use dash_spv_masternode_processor::common::SocketAddress; -use dash_spv_masternode_processor::ffi::unboxer::{unbox_any, unbox_any_vec, unbox_vec, unbox_vec_ptr}; -use dash_spv_masternode_processor::ffi::ByteArray; -use dash_spv_masternode_processor::types::opaque_key::AsCStringPtr; -use rand::seq::SliceRandom; -use dash_spv_masternode_processor::consensus::Encodable; -use dash_spv_masternode_processor::crypto::UInt256; -use dash_spv_masternode_processor::crypto::byte_util::Reversable; -use dash_spv_masternode_processor::ffi::boxer::{boxed, boxed_vec}; -use dash_spv_masternode_processor::ffi::from::FromFFI; -use dash_spv_masternode_processor::ffi::to::ToFFI; -use dash_spv_masternode_processor::secp256k1::rand; -use dash_spv_masternode_processor::tx::{Transaction, TransactionInput}; -use dash_spv_masternode_processor::util::address::address; +use std::net::SocketAddr; +use std::os::raw::c_void; +use std::sync::Arc; +use dashcore::hashes::{sha256, Hash}; +use dashcore::blockdata::transaction::{OutPoint, Transaction, txin::TxIn, txout::TxOut}; +use dashcore::consensus::Encodable; +use dashcore::secp256k1::rand; +use dashcore::secp256k1::rand::seq::SliceRandom; use logging::*; -use tracing::{info, error, debug}; +use dash_spv_crypto::crypto::byte_util::{Reversed, U32LE}; +use dash_spv_crypto::network::TXIN_SEQUENCE; +use dash_spv_crypto::util::address::address; +use dash_spv_crypto::util::data_append::DataAppend; use crate::coin_selection::compact_tally_item::CompactTallyItem; use crate::coin_selection::input_coin::InputCoin; -use crate::ffi::callbacks::{AddPendingMasternode, AvailableCoins, CommitTransaction, DestroyCoinJoinKeys, DestroyGatheredOutputs, DestroySelectedCoins, DestroyWalletTransaction, DisconnectMasternode, FreshCoinJoinAddress, GetCoinJoinKeys, GetWalletTransaction, InputsWithAmount, IsBlockchainSynced, IsMasternodeOrDisconnectRequested, IsMineInput, SelectCoinsGroupedByAddresses, SendMessage, SignTransaction, StartManagerAsync}; use crate::coinjoin::CoinJoin; use crate::constants::MAX_COINJOIN_ROUNDS; -use crate::ffi::recepient::Recipient; use crate::models::coin_control::{CoinControl, CoinType}; use crate::models::coinjoin_transaction_input::CoinJoinTransactionInput; use crate::models::tx_destination::TxDestination; -use crate::models::tx_outpoint::TxOutPoint; use crate::models::CoinJoinClientOptions; +use crate::wallet_provider::WalletProvider; + +#[derive(Clone)] +#[ferment_macro::opaque] pub struct WalletEx { - context: *const std::ffi::c_void, - options: Rc>, - pub locked_coins_set: HashSet, + provider: Arc, + options: Arc, + pub locked_coins_set: HashSet, anonymizable_tally_cached_non_denom: bool, vec_anonymizable_tally_cached_non_denom: Vec, anonymizable_tally_cached: bool, vec_anonymizable_tally_cached: Vec, - map_outpoint_rounds_cache: HashMap, - unused_keys: HashMap>, + map_outpoint_rounds_cache: HashMap, + unused_keys: HashMap<[u8; 32], Vec>, // TODO (DashJ): we may not need keyUsage, it is used as a way to audit unusedKeys - key_usage: HashMap, - coinjoin_salt: UInt256, + key_usage: HashMap<[u8; 32], bool>, + coinjoin_salt: [u8; 32], loaded_keys: bool, - get_wallet_transaction: GetWalletTransaction, - sign_transaction: SignTransaction, - destroy_transaction: DestroyWalletTransaction, - is_mine_input: IsMineInput, - available_coins: AvailableCoins, - destroy_gathered_outputs: DestroyGatheredOutputs, - select_coins: SelectCoinsGroupedByAddresses, - destroy_selected_coins: DestroySelectedCoins, - inputs_with_amount: InputsWithAmount, - fresh_coinjoin_address: FreshCoinJoinAddress, - commit_transaction: CommitTransaction, - is_masternode_or_disconnect_requested: IsMasternodeOrDisconnectRequested, - disconnect_masternode: DisconnectMasternode, - is_synced: IsBlockchainSynced, - send_message: SendMessage, - add_pending_masternode: AddPendingMasternode, - start_manager_async: StartManagerAsync, - get_coinjoin_keys: GetCoinJoinKeys, - destroy_coinjoin_keys: DestroyCoinJoinKeys } +#[ferment_macro::export] impl WalletEx { - pub fn new( - context: *const std::ffi::c_void, - options: Rc>, - get_wallet_transaction: GetWalletTransaction, + pub fn new< + GetWalletTx: Fn(*const c_void, [u8; 32]) -> Option + 'static, + SignTransaction: Fn(*const c_void, Transaction, bool) -> Option + 'static, + IsMineInput: Fn(*const c_void, OutPoint) -> bool + 'static, + GetAvailableCoins: Fn(*const c_void, bool, CoinControl, &WalletEx) -> Vec + 'static, + SelectCoins: Fn(*const c_void, bool, bool, bool, i32, &WalletEx) -> Vec + 'static, + InputsWithAmount: Fn(*const c_void, u64) -> u32 + 'static, + FreshCJAddr: Fn(*const c_void, bool) -> String + 'static, + CommitTx: Fn(*const c_void, Vec, CoinControl, bool, [u8; 32]) -> bool + 'static, + IsSynced: Fn(*const c_void) -> bool + 'static, + IsMasternodeOrDisconnectRequested: Fn(*const c_void, SocketAddr) -> bool + 'static, + DisconnectMasternode: Fn(*const c_void, SocketAddr) -> bool + 'static, + SendMessage: Fn(*const c_void, String, Vec, SocketAddr, bool) -> bool + 'static, + AddPendingMasternode: Fn(*const c_void, [u8; 32], [u8; 32]) -> bool + 'static, + StartManagerAsync: Fn(*const c_void) + 'static, + GetCoinJoinKeys: Fn(*const c_void, bool) -> Vec + 'static, + >( + context: *const c_void, + options: CoinJoinClientOptions, + get_wallet_transaction: GetWalletTx, sign_transaction: SignTransaction, - destroy_transaction: DestroyWalletTransaction, is_mine_input: IsMineInput, - available_coins: AvailableCoins, - destroy_gathered_outputs: DestroyGatheredOutputs, - select_coins: SelectCoinsGroupedByAddresses, - destroy_selected_coins: DestroySelectedCoins, + available_coins: GetAvailableCoins, + select_coins: SelectCoins, inputs_with_amount: InputsWithAmount, - fresh_coinjoin_address: FreshCoinJoinAddress, - commit_transaction: CommitTransaction, - is_synced: IsBlockchainSynced, + fresh_coinjoin_address: FreshCJAddr, + commit_transaction: CommitTx, + is_synced: IsSynced, is_masternode_or_disconnect_requested: IsMasternodeOrDisconnectRequested, disconnect_masternode: DisconnectMasternode, send_message: SendMessage, add_pending_masternode: AddPendingMasternode, start_manager_async: StartManagerAsync, get_coinjoin_keys: GetCoinJoinKeys, - destroy_coinjoin_keys: DestroyCoinJoinKeys ) -> Self { - WalletEx { - context, - options: options, - locked_coins_set: HashSet::new(), - anonymizable_tally_cached_non_denom: false, - vec_anonymizable_tally_cached_non_denom: Vec::new(), - anonymizable_tally_cached: false, - vec_anonymizable_tally_cached: Vec::new(), - map_outpoint_rounds_cache: HashMap::new(), - coinjoin_salt: UInt256([0;32]), // TODO: InitCoinJoinSalt ? - loaded_keys: false, - unused_keys: HashMap::with_capacity(1024), - key_usage: HashMap::new(), + let provider = Arc::new(WalletProvider::new( get_wallet_transaction, sign_transaction, - destroy_transaction, is_mine_input, available_coins, - destroy_gathered_outputs, select_coins, - destroy_selected_coins, inputs_with_amount, fresh_coinjoin_address, commit_transaction, @@ -123,25 +94,43 @@ impl WalletEx { add_pending_masternode, start_manager_async, get_coinjoin_keys, - destroy_coinjoin_keys + context, + )); + WalletEx { + provider, + options: Arc::new(options), + locked_coins_set: HashSet::new(), + anonymizable_tally_cached_non_denom: false, + vec_anonymizable_tally_cached_non_denom: Vec::new(), + anonymizable_tally_cached: false, + vec_anonymizable_tally_cached: Vec::new(), + map_outpoint_rounds_cache: HashMap::new(), + coinjoin_salt: [0; 32], // TODO: InitCoinJoinSalt ? + loaded_keys: false, + unused_keys: HashMap::with_capacity(1024), + key_usage: HashMap::new(), } } - pub fn lock_coin(&mut self, outpoint: TxOutPoint) { + pub fn lock_coin(&mut self, outpoint: OutPoint) { self.locked_coins_set.insert(outpoint); self.clear_anonymizable_caches(); } - pub fn unlock_coin(&mut self, outpoint: &TxOutPoint) { + pub fn unlock_coin(&mut self, outpoint: &OutPoint) { self.locked_coins_set.remove(outpoint); self.clear_anonymizable_caches(); } - pub fn is_fully_mixed(&mut self, outpoint: TxOutPoint) -> bool { + pub fn is_locked_coin(&self, outpoint: &OutPoint) -> bool { + self.locked_coins_set.contains(outpoint) + } + + pub fn check_if_is_fully_mixed(&mut self, outpoint: OutPoint) -> bool { let rounds = self.get_real_outpoint_coinjoin_rounds(outpoint.clone(), 0); - + // Mix again if we don't have N rounds yet - if rounds < self.options.borrow().coinjoin_rounds { + if rounds < self.options.coinjoin_rounds { return false; } @@ -149,13 +138,12 @@ impl WalletEx { // If we have already mixed N + MaxOffset rounds, don't mix again. // Otherwise, we should mix again 50% of the time, this results in an exponential decay // N rounds 50% N+1 25% N+2 12.5%... until we reach N + GetRandomRounds() rounds where we stop. - if rounds < self.options.borrow().coinjoin_rounds + self.options.borrow().coinjoin_random_rounds { + if rounds < self.options.coinjoin_rounds + self.options.coinjoin_random_rounds { let mut buffer = Vec::new(); outpoint.consensus_encode(&mut buffer).unwrap(); - buffer.extend_from_slice(&self.coinjoin_salt.reversed().0); - let hash = UInt256::sha256(&buffer); - - if &hash.0.read_with::(&mut 0, LE).unwrap() % 2 == 0 { + buffer.extend_from_slice(&self.coinjoin_salt.reversed()); + let hash = sha256::Hash::hash(&buffer).to_byte_array(); + if hash.u32_le() % 2 == 0 { return false; } } @@ -163,8 +151,8 @@ impl WalletEx { true } - pub fn get_real_outpoint_coinjoin_rounds(&mut self, outpoint: TxOutPoint, rounds: i32) -> i32 { - let rounds_max = MAX_COINJOIN_ROUNDS + self.options.borrow().coinjoin_random_rounds; + pub fn get_real_outpoint_coinjoin_rounds(&mut self, outpoint: OutPoint, rounds: i32) -> i32 { + let rounds_max = MAX_COINJOIN_ROUNDS + self.options.coinjoin_random_rounds; if rounds >= rounds_max { // there can only be rounds_max rounds max @@ -177,7 +165,7 @@ impl WalletEx { return rounds_ref; } - let wtx: Option = self.get_wallet_transaction(outpoint.hash); + let wtx: Option = self.provider.get_wallet_transaction(outpoint.txid.to_byte_array()); if wtx.is_none() { // no such tx in this wallet @@ -189,7 +177,7 @@ impl WalletEx { let transaction = wtx.unwrap(); // bounds check - if outpoint.index >= transaction.outputs.len() as u32 { + if outpoint.vout >= transaction.output.len() as u32 { // should never actually hit this rounds_ref = -4; log_debug!(target: "CoinJoin", "FAILED {:?} {} (bad index)", outpoint, rounds_ref); @@ -197,9 +185,9 @@ impl WalletEx { return rounds_ref; } - let tx_out = &transaction.outputs[outpoint.index as usize]; + let tx_out = &transaction.output[outpoint.vout as usize]; - if CoinJoin::is_collateral_amount(tx_out.amount) { + if CoinJoin::is_collateral_amount(tx_out.value) { rounds_ref = -3; log_debug!(target: "CoinJoin", "UPDATED {:?} {} (collateral)", outpoint, rounds_ref); self.map_outpoint_rounds_cache.insert(outpoint, rounds_ref); @@ -207,15 +195,15 @@ impl WalletEx { } // make sure the final output is non-denominate - if !CoinJoin::is_denominated_amount(tx_out.amount) { + if !CoinJoin::is_denominated_amount(tx_out.value) { rounds_ref = -2; log_debug!(target: "CoinJoin", "UPDATED {:?} {} (non-denominated)", outpoint, rounds_ref); self.map_outpoint_rounds_cache.insert(outpoint, rounds_ref); return rounds_ref; } - for out in &transaction.outputs { - if !CoinJoin::is_denominated_amount(out.amount) { + for out in &transaction.output { + if !CoinJoin::is_denominated_amount(out.value) { // this one is denominated but there is another non-denominated output found in the same tx rounds_ref = 0; log_debug!(target: "CoinJoin", "UPDATED {:?} {} (non-denominated)", outpoint, rounds_ref); @@ -228,9 +216,10 @@ impl WalletEx { let mut denom_found = false; // only denoms here so let's look up - for txin_next in &transaction.inputs { - if self.is_mine_input(&txin_next) { - let outpoint = TxOutPoint::new(txin_next.input_hash, txin_next.index); + for txin_next in &transaction.input { + let outpoint = txin_next.previous_output; + if self.provider.is_mine_input(outpoint) { + // let outpoint = TxOutPoint::new(txin_next.input_hash, txin_next.index); let n = self.get_real_outpoint_coinjoin_rounds(outpoint, rounds + 1); // denom found, find the shortest chain or initially assign nShortest with the first found value @@ -252,44 +241,17 @@ impl WalletEx { rounds_ref } - pub fn has_collateral_inputs(&mut self, only_confirmed: bool) -> bool { + pub fn has_collateral_inputs(&self, only_confirmed: bool) -> bool { let mut coin_control = CoinControl::new(); coin_control.coin_type = CoinType::OnlyCoinJoinCollateral; let result = self.available_coins(only_confirmed, coin_control); - - return !result.is_empty(); + !result.is_empty() } - - pub fn available_coins(&mut self, only_safe: bool, coin_control: CoinControl) -> Vec { - let mut vec_gathered_outputs: Vec = Vec::new(); - - unsafe { - let encoded_coin_control = boxed(coin_control.encode()); - let gathered_outputs = (self.available_coins)(only_safe, encoded_coin_control, self, self.context); - (0..(*gathered_outputs).item_count) - .into_iter() - .map(|i| (**(*gathered_outputs).items.add(i)).decode()) - .for_each( - |item| vec_gathered_outputs.push(item) - ); - - (self.destroy_gathered_outputs)(gathered_outputs); - let unboxed_coin_control = unbox_any(encoded_coin_control); - - if !unboxed_coin_control.set_selected.is_null() && unboxed_coin_control.set_selected_size > 0 { - let unboxed = unbox_vec_ptr(unboxed_coin_control.set_selected, unboxed_coin_control.set_selected_size); - unbox_vec(unboxed); - } - } - - vec_gathered_outputs - } - pub fn select_coins_grouped_by_addresses( - &mut self, - skip_denominated: bool, - anonymizable: bool, - skip_unconfirmed: bool, + &mut self, + skip_denominated: bool, + anonymizable: bool, + skip_unconfirmed: bool, max_outpoints_per_address: i32 ) -> Vec { // Try using the cache for already confirmed mixable inputs. @@ -305,20 +267,8 @@ impl WalletEx { return self.vec_anonymizable_tally_cached.clone(); } } - - let mut vec_tally_ret: Vec = Vec::new(); - - unsafe { - let selected_coins = (self.select_coins)(skip_denominated, anonymizable, skip_unconfirmed, max_outpoints_per_address, self, self.context); - (0..(*selected_coins).item_count) - .into_iter() - .map(|i| (**(*selected_coins).items.add(i)).decode()) - .for_each( - |item| vec_tally_ret.push(item) - ); - - (self.destroy_selected_coins)(selected_coins); - } + + let vec_tally_ret = self.provider.select_coins(skip_denominated, anonymizable, skip_unconfirmed, max_outpoints_per_address, self); // Cache already confirmed mixable entries for later use. // This should only be used if nMaxOupointsPerAddress was NOT specified. @@ -334,16 +284,16 @@ impl WalletEx { } } - return vec_tally_ret; + vec_tally_ret } pub fn get_anonymizable_balance(&mut self, skip_denominated: bool, skip_unconfirmed: bool) -> u64 { - if !self.options.borrow().enable_coinjoin { + if !self.options.enable_coinjoin { return 0; } let tally_items = self.select_coins_grouped_by_addresses(skip_denominated, true, skip_unconfirmed, -1); - + if tally_items.is_empty() { return 0; } @@ -354,181 +304,145 @@ impl WalletEx { for item in tally_items { let is_denominated = CoinJoin::is_denominated_amount(item.amount); - + if skip_denominated && is_denominated { continue; } // assume that the fee to create denoms should be mixing collateral at max if item.amount >= smallest_denom + if is_denominated { 0 } else { mixing_collateral } { - total = total + item.amount; - } - } - - return total; - } - - pub fn get_wallet_transaction(&self, hash: UInt256) -> Option { - unsafe { - let boxed_hash = boxed(hash.0); - let wtx = (self.get_wallet_transaction)(boxed_hash, self.context); - - if wtx.is_null() { - return None; + total += item.amount; } - - let transaction = (*wtx).decode(); - (self.destroy_transaction)(wtx); - unbox_any(boxed_hash); - Some(transaction) } - } - /** - * Count the number of unspent outputs that have a certain value - */ - pub fn count_inputs_with_amount(&self, value: u64) -> u32 { - return unsafe { (self.inputs_with_amount)(value, self.context) }; + total } - pub fn get_unused_key(&mut self, internal: bool) -> TxDestination { if self.unused_keys.is_empty() { if !self.key_usage.is_empty() && self.key_usage.values().all(|used| !used) { log_info!(target: "CoinJoin", "WalletEx - keyUsage map has unused keys, unused key count: {}", self.unused_keys.len()); } - return Some(self.fresh_receive_key(internal)); } - let key: UInt256; - let item: Vec; - - if let Some(pair) = self.unused_keys.iter().next() { - key = *pair.0; - item = pair.1.clone(); + if let Some((&key, item)) = self.unused_keys.iter().next() { + let unused = item.clone(); + // let key = *pair.0; + // let item = pair.1.clone(); log_info!(target: "CoinJoin", "WalletEx - reusing key - is this key used: {}, unused key count: {}", self.key_usage.get(&key).unwrap(), self.unused_keys.len()); + // remove the key + self.unused_keys.remove(&key); + self.key_usage.insert(key, true); + Some(unused) } else { - return None; + None } - // remove the key - self.unused_keys.remove(&key); - self.key_usage.insert(key, true); - - return Some(item); } - pub fn add_unused_key(&mut self, destination: &TxDestination) { - if let Some(key) = destination { - let key_id = UInt256::sha256(key); - self.unused_keys.insert(key_id, key.clone()); - self.key_usage.insert(key_id, false); - log_debug!(target: "CoinJoin", "WalletEx - add unused key: {:?}", address::with_script_sig(&key, &self.options.borrow().chain_type.script_map())); - } - } - - pub fn remove_unused_key(&mut self, destination: &TxDestination) { - if let Some(key) = destination { - let key_id = UInt256::sha256(key); - self.unused_keys.remove(&key_id); - self.key_usage.insert(key_id, true); - log_debug!(target: "CoinJoin", "WalletEx - remove unused key: {:?}", address::with_script_sig(&key, &self.options.borrow().chain_type.script_map())); - } + pub fn add_unused_key(&mut self, destination: Vec) { + let key_id = sha256::Hash::hash(&destination).to_byte_array(); + log_debug!(target: "CoinJoin", "WalletEx - add unused key: {:?}", address::with_script_sig(&destination, &self.options.chain_type.script_map())); + self.unused_keys.insert(key_id, destination); + self.key_usage.insert(key_id, false); } - pub fn refresh_unused_keys(&mut self) { self.unused_keys.clear(); - let issued_keys = self.get_issued_receive_keys(); - + let issued_keys = self.provider.get_issued_receive_keys(); + for key in &issued_keys { - let key_id = UInt256::sha256(key); - self.unused_keys.insert(key_id, key.clone()); + let pub_key = Vec::::script_pub_key_for_address(key, &self.options.chain_type.script_map()); + let key_id = sha256::Hash::hash(&pub_key).to_byte_array(); + self.unused_keys.insert(key_id, pub_key); self.key_usage.insert(key_id, false); } - let used_keys = self.get_used_receive_keys(); + let used_keys = self.provider.get_used_receive_keys(); for used_key in &used_keys { - let key_id = UInt256::sha256(used_key); + let pub_key = Vec::::script_pub_key_for_address(used_key, &self.options.chain_type.script_map()); + let key_id = sha256::Hash::hash(&pub_key).to_byte_array(); self.unused_keys.remove(&key_id); self.key_usage.insert(key_id, true); } for (_, key) in &self.unused_keys { - log_debug!(target: "CoinJoin", "WalletEx - unused key: {:?}", address::with_script_sig(key, &self.options.borrow().chain_type.script_map())); + log_debug!(target: "CoinJoin", "WalletEx - unused key: {:?}", address::with_script_sig(key, &self.options.chain_type.script_map())); } for (key_id, used) in &self.key_usage { if !used { if let Some(key) = self.unused_keys.get(key_id) { - log_debug!(target: "CoinJoin", "WalletEx - unused key: {:?}", address::with_script_sig(key, &self.options.borrow().chain_type.script_map())); + log_debug!(target: "CoinJoin", "WalletEx - unused key: {:?}", address::with_script_sig(key, &self.options.chain_type.script_map())); } } } self.loaded_keys = true; - + } pub fn process_used_scripts(&mut self, scripts: &Vec>) { for script in scripts { - let key_id = UInt256::sha256(script); - + let key_id = sha256::Hash::hash(script).to_byte_array(); + if self.loaded_keys { self.key_usage.insert(key_id, true); self.unused_keys.remove(&key_id); } - + if let Some(key) = self.unused_keys.get(&key_id) { - log_debug!(target: "CoinJoin", "WalletEx - key used: {:?}", address::with_script_pub_key(key, &self.options.borrow().chain_type.script_map())); + log_debug!(target: "CoinJoin", "WalletEx - key used: {:?}", address::with_script_pub_key(key, &self.options.chain_type.script_map())); } } } +} +impl WalletEx { - pub fn commit_transaction(&self, vec_send: &Vec, coin_control: CoinControl, is_denominating: bool, client_session_id: UInt256) -> bool { - let result: bool; - - unsafe { - let encoded_coin_control = boxed(coin_control.encode()); - let boxed_vec = boxed_vec( - vec_send - .iter() - .map(|input| boxed((*input).clone())) - .collect() - ); - - let boxed_client_session_id = boxed(client_session_id.0); // Released in DashSync - result = (self.commit_transaction)(boxed_vec, vec_send.len(), encoded_coin_control, is_denominating, boxed_client_session_id, self.context); - let vec = unbox_vec_ptr(boxed_vec, vec_send.len()); - unbox_any_vec(vec); - let unboxed_coin_control = unbox_any(encoded_coin_control); - - if !unboxed_coin_control.set_selected.is_null() && unboxed_coin_control.set_selected_size > 0 { - let unboxed = unbox_vec_ptr(unboxed_coin_control.set_selected, unboxed_coin_control.set_selected_size); - unbox_vec(unboxed); - } - } - return result; + pub fn available_coins(&self, only_safe: bool, coin_control: CoinControl) -> Vec { + self.provider.available_coins(only_safe, coin_control, self) } - pub fn sign_transaction(&self, tx: &Transaction, anyone_can_pay: bool) -> Option { - unsafe { - let boxed_tx = boxed(tx.encode()); - let raw_tx = (self.sign_transaction)(boxed_tx, anyone_can_pay, self.context); + pub fn get_wallet_transaction(&self, hash: [u8; 32]) -> Option { + self.provider.get_wallet_transaction(hash) + } - if raw_tx.is_null() { - return None; - } + /** + * Count the number of unspent outputs that have a certain value + */ + pub fn count_inputs_with_amount(&self, value: u64) -> u32 { + self.provider.count_inputs_with_amount(value) + } - let signed_tx = (*raw_tx).decode(); - (self.destroy_transaction)(raw_tx); - unbox_any(boxed_tx); - return Some(signed_tx); + pub fn remove_unused_key(&mut self, destination: &TxDestination) { + if let Some(key) = destination { + let key_id = sha256::Hash::hash(key).to_byte_array(); + self.unused_keys.remove(&key_id); + self.key_usage.insert(key_id, true); + log_debug!(target: "CoinJoin", "WalletEx - remove unused key: {:?}", address::with_script_sig(&key, &self.options.chain_type.script_map())); } } + fn fresh_receive_key(&mut self, internal: bool) -> Vec { + let fresh_address = self.provider.get_fresh_coinjoin_address(internal); + let script_map = self.options.chain_type.script_map(); + let fresh_key = Vec::::script_pub_key_for_address(&fresh_address, &script_map); + log_debug!(target: "CoinJoin", "WalletEx - fresh key: {:?}", address::with_script_pub_key(&fresh_key, &script_map)); + let key_id = sha256::Hash::hash(&fresh_key).to_byte_array(); + self.key_usage.insert(key_id, true); + fresh_key + } + + + pub fn commit_transaction(&self, vec_send: Vec, coin_control: CoinControl, is_denominating: bool, client_session_id: [u8; 32]) -> bool { + self.provider.commit_transaction(vec_send, coin_control, is_denominating, client_session_id) + } + + pub fn sign_transaction(&self, tx: Transaction, anyone_can_pay: bool) -> Option { + self.provider.sign_transaction(tx, anyone_can_pay) + } pub fn select_tx_dsins_by_denomination(&mut self, denom: u32, value_max: u64, vec_tx_dsin_ret: &mut Vec) -> bool { let mut value_total: u64 = 0; let mut set_recent_tx_ids = HashSet::new(); @@ -546,20 +460,28 @@ impl WalletEx { coins.shuffle(&mut rand::thread_rng()); for out in coins.iter() { - let tx_hash = out.tx_outpoint.hash; - let value = out.output.amount; + let tx_hash = out.tx_outpoint.txid; + let value = out.output.value; if set_recent_tx_ids.contains(&tx_hash) || value_total + value > value_max || value as i64 != denom_amount { continue; } - - let txin = TransactionInput { - input_hash: tx_hash, - index: out.tx_outpoint.index, - script: None, - signature: Some(Vec::new()), - sequence: TXIN_SEQUENCE + + let txin = TxIn { + previous_output: out.tx_outpoint, + script_sig: Default::default(), + sequence: TXIN_SEQUENCE, + witness: Default::default(), }; + + + // let txin = TransactionInput { + // input_hash: tx_hash, + // index: out.tx_outpoint.index, + // script: None, + // signature: Some(Vec::new()), + // sequence: TXIN_SEQUENCE + // }; let rounds = self.get_real_outpoint_coinjoin_rounds(out.tx_outpoint.clone(), 0); value_total += value; @@ -567,10 +489,10 @@ impl WalletEx { set_recent_tx_ids.insert(tx_hash); } - return value_total > 0; + value_total > 0 } - pub fn select_denominated_amounts(&mut self, value_max: u64, set_amounts_ret: &mut HashSet) -> bool { + pub fn select_denominated_amounts(&self, value_max: u64, set_amounts_ret: &mut HashSet) -> bool { let mut value_total: u64 = 0; set_amounts_ret.clear(); @@ -579,80 +501,39 @@ impl WalletEx { let mut coins = self.available_coins(true, coin_control); // larger denoms first - coins.sort_by(|a, b| b.output.amount.cmp(&a.output.amount)); + coins.sort_by(|a, b| b.output.value.cmp(&a.output.value)); for out in coins.iter() { - let value = out.output.amount; + let value = out.output.value; if value_total + value <= value_max { value_total += value; set_amounts_ret.insert(value); } } - return value_total >= CoinJoin::get_smallest_denomination() + value_total >= CoinJoin::get_smallest_denomination() } - pub fn is_masternode_or_disconnect_requested(&self, address: SocketAddress) -> bool { - return unsafe { - let boxed_address = boxed(address.ip_address.0); - let result = (self.is_masternode_or_disconnect_requested)(boxed_address, address.port, self.context); - unbox_any(boxed_address); - result - }; + pub fn is_masternode_or_disconnect_requested(&self, address: SocketAddr) -> bool { + self.provider.is_masternode_or_disconnect_requested(address) } - pub fn disconnect_masternode(&self, address: SocketAddress) -> bool { - return unsafe { - let boxed_address = boxed(address.ip_address.0); - let result = (self.disconnect_masternode)(boxed_address, address.port, self.context); - unbox_any(boxed_address); - result - }; + pub fn disconnect_masternode(&self, address: SocketAddr) -> bool { + self.provider.disconnect_masternode(address) } - pub fn is_synced(&self) -> bool { - unsafe { return (self.is_synced)(self.context); } + self.provider.is_synced() } - - pub fn send_message(&mut self, message: Vec, msg_type: String, address: &SocketAddress, warn: bool) -> bool { - return unsafe { - let message_type = msg_type.to_c_string_ptr(); - let boxed_ip = boxed(address.ip_address.0); - let boxed_message = boxed(ByteArray::from(message)); - let result = (self.send_message)( - message_type, - boxed_message, - boxed_ip, - address.port, - warn, - self.context - ); - - let _ = CString::from_raw(message_type); - unbox_any(boxed_ip); - let msg = unbox_any(boxed_message); - let _ = Vec::from_raw_parts(msg.ptr as *mut u8, msg.len, msg.len); - - result - }; + pub fn send_message(&self, message: Vec, msg_type: String, address: SocketAddr, warn: bool) -> bool { + self.provider.send_message(message, msg_type, address, warn) } - pub fn add_pending_masternode(&mut self, pro_tx_hash: UInt256, session_id: UInt256) -> bool { - return unsafe { - let pro_tx_hash_ptr = boxed(pro_tx_hash.0); - let session_id_ptr = boxed(session_id.0); - - let result = (self.add_pending_masternode)(pro_tx_hash_ptr, session_id_ptr, self.context); - - unbox_any(pro_tx_hash_ptr); - unbox_any(session_id_ptr); - - result - }; + pub fn add_pending_masternode(&self, pro_tx_hash: [u8; 32], session_id: [u8; 32]) -> bool { + self.provider.add_pending_masternode(pro_tx_hash, session_id) } pub fn start_manager_async(&self) { - unsafe { (self.start_manager_async)(self.context); } + self.provider.start_manager_async() } fn clear_anonymizable_caches(&mut self) { @@ -660,63 +541,9 @@ impl WalletEx { self.anonymizable_tally_cached = false; } - fn is_mine_input(&self, txin: &TransactionInput) -> bool { - unsafe { - let boxed_txin_hash = boxed(txin.input_hash.0); - let is_mine = (self.is_mine_input)(boxed_txin_hash, txin.index, self.context); - unbox_any(boxed_txin_hash); - - return is_mine; - } - } - - fn fresh_receive_key(&mut self, internal: bool) -> Vec { - let fresh_key = unsafe { - let data = (self.fresh_coinjoin_address)(internal, self.context); - let result = slice::from_raw_parts(data.ptr, data.len).to_vec(); - unbox_vec_ptr(data.ptr as *mut u8, data.len); - result - }; - - log_debug!(target: "CoinJoin", "WalletEx - fresh key: {:?}", address::with_script_pub_key(&fresh_key, &self.options.borrow().chain_type.script_map())); - self.key_usage.insert(UInt256::sha256(&fresh_key), true); - - return fresh_key; - } - - fn get_issued_receive_keys(&self) -> Vec> { - unsafe { - let data = (self.get_coinjoin_keys)(false, self.context); - let keys = &*data; - let mut result = Vec::with_capacity(keys.item_count); - - for i in 0..keys.item_count { - let item = *keys.items.add(i); - let bytes = slice::from_raw_parts((*item).ptr, (*item).len).to_vec(); - result.push(bytes); - } + // fn is_mine_input(&self, txin: &OutPoint) -> bool { + // (self.is_mine_input)(self.context, txin) + // } - (self.destroy_coinjoin_keys)(data); - - result - } - } - fn get_used_receive_keys(&self) -> Vec> { - unsafe { - let data = (self.get_coinjoin_keys)(true, self.context); - let keys = &*data; - let mut result = Vec::with_capacity(keys.item_count); - - for i in 0..keys.item_count { - let item = *keys.items.add(i); - let bytes = slice::from_raw_parts((*item).ptr, (*item).len).to_vec(); - result.push(bytes); - } - - (self.destroy_coinjoin_keys)(data); - - result - } - } } diff --git a/dash-spv-coinjoin/src/wallet_provider.rs b/dash-spv-coinjoin/src/wallet_provider.rs new file mode 100644 index 00000000..93ae2c9c --- /dev/null +++ b/dash-spv-coinjoin/src/wallet_provider.rs @@ -0,0 +1,144 @@ +use std::net::SocketAddr; +use std::os::raw::c_void; +use std::sync::Arc; +use dashcore::blockdata::transaction::{OutPoint, Transaction, txout::TxOut}; +use crate::coin_selection::compact_tally_item::CompactTallyItem; +use crate::coin_selection::input_coin::InputCoin; +use crate::models::coin_control::CoinControl; +use crate::wallet_ex::WalletEx; + +#[ferment_macro::opaque] +pub struct WalletProvider { + context: *const c_void, + get_wallet_transaction: Arc Option>, + sign_transaction: Arc Option>, + is_mine_input: Arc bool>, + available_coins: Arc Vec>, + select_coins: Arc Vec>, + inputs_with_amount: Arc u32>, + fresh_coinjoin_address: Arc String>, + commit_transaction: Arc, CoinControl, bool, [u8; 32]) -> bool>, + is_masternode_or_disconnect_requested: Arc bool>, + disconnect_masternode: Arc bool>, + is_synced: Arc bool>, + send_message: Arc, SocketAddr, bool) -> bool>, + add_pending_masternode: Arc bool>, + start_manager_async: Arc, + get_coinjoin_keys: Arc Vec>, +} + +#[ferment_macro::export] +impl WalletProvider { + + pub fn new< + GWT: Fn(*const c_void, [u8; 32]) -> Option + 'static, + ST: Fn(*const c_void, Transaction, bool) -> Option + 'static, + IMI: Fn(*const c_void, OutPoint) -> bool + 'static, + AC: Fn(*const c_void, bool, CoinControl, &WalletEx) -> Vec + 'static, + SC: Fn(*const c_void, bool, bool, bool, i32, &WalletEx) -> Vec + 'static, + IWA: Fn(*const c_void, u64) -> u32 + 'static, + FCA: Fn(*const c_void, bool) -> String + 'static, + CT: Fn(*const c_void, Vec, CoinControl, bool, [u8; 32]) -> bool + 'static, + IMODR: Fn(*const c_void, SocketAddr) -> bool + 'static, + DM: Fn(*const c_void, SocketAddr) -> bool + 'static, + IS: Fn(*const c_void) -> bool + 'static, + SM: Fn(*const c_void, String, Vec, SocketAddr, bool) -> bool + 'static, + APM: Fn(*const c_void, [u8; 32], [u8; 32]) -> bool + 'static, + SMA: Fn(*const c_void) + 'static, + GCK: Fn(*const c_void, bool) -> Vec + 'static, + >( + get_wallet_transaction: GWT, + sign_transaction: ST, + is_mine_input: IMI, + available_coins: AC, + select_coins: SC, + inputs_with_amount: IWA, + fresh_coinjoin_address: FCA, + commit_transaction: CT, + is_masternode_or_disconnect_requested: IMODR, + disconnect_masternode: DM, + is_synced: IS, + send_message: SM, + add_pending_masternode: APM, + start_manager_async: SMA, + get_coinjoin_keys: GCK, + context: *const c_void, + ) -> WalletProvider { + Self { + context, + get_wallet_transaction: Arc::new(get_wallet_transaction), + sign_transaction: Arc::new(sign_transaction), + is_mine_input: Arc::new(is_mine_input), + available_coins: Arc::new(available_coins), + select_coins: Arc::new(select_coins), + inputs_with_amount: Arc::new(inputs_with_amount), + fresh_coinjoin_address: Arc::new(fresh_coinjoin_address), + commit_transaction: Arc::new(commit_transaction), + is_masternode_or_disconnect_requested: Arc::new(is_masternode_or_disconnect_requested), + disconnect_masternode: Arc::new(disconnect_masternode), + is_synced: Arc::new(is_synced), + send_message: Arc::new(send_message), + add_pending_masternode: Arc::new(add_pending_masternode), + start_manager_async: Arc::new(start_manager_async), + get_coinjoin_keys: Arc::new(get_coinjoin_keys), + } + } +} + +impl WalletProvider { + /** + * Count the number of unspent outputs that have a certain value + */ + pub(crate) fn count_inputs_with_amount(&self, value: u64) -> u32 { + (self.inputs_with_amount)(self.context, value) + } + pub(crate) fn get_wallet_transaction(&self, hash: [u8; 32]) -> Option { + (self.get_wallet_transaction)(self.context, hash) + } + pub(crate) fn commit_transaction(&self, vec_send: Vec, coin_control: CoinControl, is_denominating: bool, client_session_id: [u8; 32]) -> bool { + (self.commit_transaction)(self.context, vec_send, coin_control, is_denominating, client_session_id) + } + pub(crate) fn sign_transaction(&self, tx: Transaction, anyone_can_pay: bool) -> Option { + (self.sign_transaction)(self.context, tx, anyone_can_pay) + } + pub(crate) fn is_masternode_or_disconnect_requested(&self, address: SocketAddr) -> bool { + (self.is_masternode_or_disconnect_requested)(self.context, address) + } + pub(crate) fn disconnect_masternode(&self, address: SocketAddr) -> bool { + (self.disconnect_masternode)(self.context, address) + } + pub(crate) fn is_synced(&self) -> bool { + (self.is_synced)(self.context) + } + pub(crate) fn send_message(&self, message: Vec, msg_type: String, address: SocketAddr, warn: bool) -> bool { + (self.send_message)(self.context, msg_type, message, address, warn) + } + pub(crate) fn add_pending_masternode(&self, pro_tx_hash: [u8; 32], session_id: [u8; 32]) -> bool { + (self.add_pending_masternode)(self.context, pro_tx_hash, session_id) + } + pub(crate) fn start_manager_async(&self) { + (self.start_manager_async)(self.context) + } + pub(crate) fn get_issued_receive_keys(&self) -> Vec { + (self.get_coinjoin_keys)(self.context, false) + } + + pub(crate) fn get_used_receive_keys(&self) -> Vec { + (self.get_coinjoin_keys)(self.context, true) + } + pub(crate) fn get_fresh_coinjoin_address(&self, internal: bool) -> String { + (self.fresh_coinjoin_address)(self.context, internal) + } + pub(crate) fn select_coins(&self, skip_denominated: bool, anonymizable: bool, skip_unconfirmed: bool, max_outpoints_per_address: i32, wallet_ex: &WalletEx) -> Vec { + (self.select_coins)(self.context, skip_denominated, anonymizable, skip_unconfirmed, max_outpoints_per_address, wallet_ex) + } + + pub(crate) fn available_coins(&self, only_safe: bool, coin_control: CoinControl, wallet_ex: &WalletEx) -> Vec { + (self.available_coins)(self.context, only_safe, coin_control, wallet_ex) + } + + pub(crate) fn is_mine_input(&self, outpoint: OutPoint) -> bool { + (self.is_mine_input)(self.context, outpoint) + } + +} \ No newline at end of file diff --git a/dash-spv-coinjoin/target/dash_spv_coinjoin.h b/dash-spv-coinjoin/target/dash_spv_coinjoin.h index 6c2d20ce..a3138954 100644 --- a/dash-spv-coinjoin/target/dash_spv_coinjoin.h +++ b/dash-spv-coinjoin/target/dash_spv_coinjoin.h @@ -58,4 +58,4 @@ #define REFERENCE_DEFAULT_MIN_TX_FEE 1000 -#endif /* example_h */ +#endif /* example_h */ diff --git a/dash-spv-coinjoin/target/example.h b/dash-spv-coinjoin/target/example.h deleted file mode 100644 index 6c2d20ce..00000000 --- a/dash-spv-coinjoin/target/example.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef example_h -#define example_h - -/* This file is autogenerated by cbindgen. Don't modify this manually. */ - -#include -#include -#include -#include - -#define COINJOIN_AUTO_TIMEOUT_MIN 5 - -#define COINJOIN_AUTO_TIMEOUT_MAX 15 - -#define COINJOIN_QUEUE_TIMEOUT 30 - -#define COINJOIN_SIGNING_TIMEOUT 15 - -#define COINJOIN_ENTRY_MAX_SIZE 9 - -#define MIN_COINJOIN_SESSIONS 1 - -#define MIN_COINJOIN_ROUNDS 2 - -#define MIN_COINJOIN_AMOUNT 2 - -#define MIN_COINJOIN_DENOMS_GOAL 10 - -#define MIN_COINJOIN_DENOMS_HARDCAP 10 - -#define MAX_COINJOIN_SESSIONS 10 - -#define MAX_COINJOIN_ROUNDS 16 - -#define MAX_COINJOIN_DENOMS_GOAL 100000 - -#define MAX_COINJOIN_DENOMS_HARDCAP 100000 - -#define MAX_COINJOIN_AMOUNT (MAX_MONEY / DUFFS) - -#define DEFAULT_COINJOIN_SESSIONS 4 - -#define DEFAULT_COINJOIN_ROUNDS 4 - -#define DEFAULT_COINJOIN_AMOUNT 1000 - -#define DEFAULT_COINJOIN_DENOMS_GOAL 50 - -#define DEFAULT_COINJOIN_DENOMS_HARDCAP 300 - -#define COINJOIN_DENOM_OUTPUTS_THRESHOLD 500 - -#define COINJOIN_KEYS_THRESHOLD_WARNING 100 - -#define COINJOIN_KEYS_THRESHOLD_STOP 50 - -#define COINJOIN_RANDOM_ROUNDS 3 - -#define REFERENCE_DEFAULT_MIN_TX_FEE 1000 - -#endif /* example_h */ diff --git a/dash-spv-crypto/.gitignore b/dash-spv-crypto/.gitignore new file mode 100644 index 00000000..f54b4515 --- /dev/null +++ b/dash-spv-crypto/.gitignore @@ -0,0 +1,15 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ +/venv/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# Generated by Intellij Idea +/.idea/ +*.iml diff --git a/dash-spv-crypto/Cargo.toml b/dash-spv-crypto/Cargo.toml new file mode 100644 index 00000000..8cd5d260 --- /dev/null +++ b/dash-spv-crypto/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "dash-spv-crypto" +version = "0.5.1" +description = "Library for key derivation" + +edition = "2021" +publish = false + +[features] +default = [] +generate-dashj-tests = [] +use_serde = ["serde"] + +[dependencies] +bip38 = { git = "https://github.com/pankcuf/bip38", rev = "87abd21" } +blake3 = "1.3.2" +bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "1.3.5", features = ["legacy", "bip32", "apple", "use_serde" ] } +byte = "0.2" +dashcore = { git = "https://github.com/dashpay/rust-dashcore", features = ["std", "secp-recovery", "rand", "signer", "serde", "apple", "message_verification", "quorum_validation"], default-features = false, branch = "feat/ferment" } +dash-spv-keychain = { workspace = true } + +ed25519-dalek = "2.1.1" +log = { version = "0.4.*", features = ["std"] } +ferment = { git = "https://github.com/dashpay/ferment", package = "ferment" } +ferment-macro = { git = "https://github.com/dashpay/ferment", package = "ferment-macro" } +indexmap = "2.8.0" +rs-x11-hash = "0.1.8" +serde = { version = "1.0.215", features = ["derive"], optional = true } +simplelog = "0.12.2" +zeroize = "1.5.7" +bitflags = "2.9.0" + +[lib] +name = "dash_spv_crypto" diff --git a/dash-spv-masternode-processor/src/chain/bip/bip32.rs b/dash-spv-crypto/src/bip/bip32.rs similarity index 57% rename from dash-spv-masternode-processor/src/chain/bip/bip32.rs rename to dash-spv-crypto/src/bip/bip32.rs index 260807e6..0630e5fa 100644 --- a/dash-spv-masternode-processor/src/chain/bip/bip32.rs +++ b/dash-spv-crypto/src/bip/bip32.rs @@ -1,12 +1,11 @@ use byte::{BytesExt, TryRead}; -use hashes::{Hash, sha256d}; -use crate::chain::common::ChainType; -use crate::consensus::Encodable; -use crate::crypto::byte_util::clone_into_array; -use crate::crypto::UInt256; -use crate::chain::derivation::BIP32_HARD; -use crate::util::{base58, endian}; -use crate::util::sec_vec::SecVec; +use dashcore::hashes::{sha256d, Hash}; +use dashcore::consensus::Encodable; +use crate::crypto::byte_util::{clone_into_array, from_u32, Is31Bits, UInt256}; +use crate::derivation::BIP32_HARD; +use crate::keys::KeyError; +use crate::network::ChainType; +use crate::util::{base58, endian, sec_vec::SecVec}; #[allow(unused_assignments)] @@ -49,7 +48,7 @@ impl From for Error { } impl From for byte::Error { - fn from(value: Error) -> Self { + fn from(_value: Error) -> Self { byte::Error::BadInput { err: "Invalid Key" } } } @@ -57,21 +56,21 @@ impl From for byte::Error { pub struct Key { pub depth: u8, pub fingerprint: u32, - pub child: UInt256, - pub chaincode: UInt256, + pub child: [u8; 32], + pub chaincode: [u8; 32], pub data: Vec, pub hardened: bool } impl Key { - pub fn new(depth: u8, fingerprint: u32, child: UInt256, chaincode: UInt256, data: Vec, hardened: bool) -> Self { + pub fn new(depth: u8, fingerprint: u32, child: [u8; 32], chaincode: [u8; 32], data: Vec, hardened: bool) -> Self { Self { depth, fingerprint, child, chaincode, data, hardened } } pub fn extended_key_data(&self) -> Vec { let mut writer = Vec::::new(); - self.fingerprint.enc(&mut writer); - self.chaincode.enc(&mut writer); + self.fingerprint.consensus_encode(&mut writer).unwrap(); + self.chaincode.consensus_encode(&mut writer).unwrap(); writer.extend_from_slice(&self.data); writer } @@ -79,13 +78,13 @@ impl Key { // Decode base58-encoded string into bip32 private key impl TryInto for (&str, ChainType) { - type Error = Error; + type Error = KeyError; fn try_into(self) -> Result { base58::from(self.0) - .map_err(base58::Error::into) + .map_err(KeyError::from) .and_then(|message| message.read_with::(&mut 0, self.1) - .map_err(byte::Error::into)) + .map_err(KeyError::from)) } } @@ -94,8 +93,8 @@ impl<'a> TryRead<'a, ChainType> for Key { let len = message.len(); let mid = len - 4; let (data, checked_data) = message.split_at(mid); - let (head, tail) = data.split_at(4); - let expected = endian::slice_to_u32_le(&sha256d::Hash::hash(&data)[..4]); + let (head, _tail) = data.split_at(4); + let expected = endian::slice_to_u32_le(&sha256d::Hash::hash(&data).to_byte_array()[..4]); let actual = endian::slice_to_u32_le(&checked_data); let header: [u8; 4] = clone_into_array(&head); let mut offset = &mut 4; @@ -105,30 +104,43 @@ impl<'a> TryRead<'a, ChainType> for Key { chain_type.bip32_script_map().xprv.ne(&header) { return Err(Error::InvalidAddress(header).into()); } - let depth = data.read_with::(&mut offset, byte::LE).unwrap(); - let fingerprint = data.read_with::(&mut offset, byte::LE).unwrap(); - let child_32 = data.read_with::(&mut offset, byte::BE).unwrap(); - let chain = data.read_with::(&mut offset, byte::LE).unwrap(); + let depth = data.read_with::(&mut offset, byte::LE)?; + let fingerprint = data.read_with::(&mut offset, byte::LE)?; + let child_32 = data.read_with::(&mut offset, byte::BE)?; + let chaincode = data.read_with::(&mut offset, byte::LE)?.0; if chain_type.bip32_script_map().xprv.eq(&header) { *offset += 1; } let hardened = (child_32 & BIP32_HARD) > 0; - let child = UInt256::from(child_32 & !BIP32_HARD); - Ok((Key { depth, fingerprint, child, chaincode: chain, data: Vec::from(&data[*offset..]), hardened }, len)) + let child = from_u32(child_32 & !BIP32_HARD); + let data = Vec::from(&data[*offset..]); + Ok((Key { depth, fingerprint, child, chaincode, data, hardened }, len)) }, (true, 111) /* 256 */ => { if chain_type.dip14_script_map().dps.ne(&header) && chain_type.dip14_script_map().dpp.ne(&header) { return Err(Error::InvalidAddress(header).into()); } - let depth = data.read_with::(&mut offset, byte::LE).unwrap(); - let fingerprint = data.read_with::(&mut offset, byte::LE).unwrap(); - let hardened = data.read_with::(&mut offset, byte::LE).unwrap() > 0; - let child = data.read_with::(&mut offset, byte::LE).unwrap(); - let chain = data.read_with::(&mut offset, byte::LE).unwrap(); - if data.eq(&if chain_type.is_mainnet() { chain_type.dip14_script_map().dps } else { chain_type.bip32_script_map().xprv }) { - *offset += 1; - } - Ok((Key { depth, fingerprint, child, chaincode: chain, data: Vec::from(&data[*offset..]), hardened }, len)) + let depth = data[4]; + let fingerprint = u32::from_le_bytes(clone_into_array(&data[5..9])); + let hardened = data[9] > 0; + let child = TryInto::<[u8; 32]>::try_into(&data[10..42]).unwrap(); + let chaincode = TryInto::<[u8; 32]>::try_into(&data[42..74]).unwrap(); + let data = Vec::from(if data.eq(&if chain_type.is_mainnet() { chain_type.dip14_script_map().dps } else { chain_type.bip32_script_map().xprv }) { + &data[75..] + } else { + &data[74..] + }); + + // let depth = data.read_with::(&mut offset, byte::LE)?; + // let fingerprint = data.read_with::(&mut offset, byte::LE)?; + // let hardened = data.read_with::(&mut offset, byte::LE)? > 0; + // let child = data.read_with::(&mut offset, byte::LE)?.0; + // let chaincode = data.read_with::(&mut offset, byte::LE)?.0; + // if data.eq(&if chain_type.is_mainnet() { chain_type.dip14_script_map().dps } else { chain_type.bip32_script_map().xprv }) { + // *offset += 1; + // } + // let data = Vec::from(&data[*offset..]); + Ok((Key { depth, fingerprint, child, chaincode, data, hardened }, len)) }, (true, _) => Err(Error::InvalidLength(len).into()), _ => Err(Error::BadChecksum(expected, actual).into()), @@ -139,38 +151,34 @@ impl<'a> TryRead<'a, ChainType> for Key { impl Key { pub fn serialize(&self, chain_type: ChainType) -> String { if self.child.is_31_bits() { - let mut child = u32::from_le_bytes(clone_into_array(&self.child.0[..4])); + let mut child = u32::from_le_bytes(clone_into_array(&self.child[..4])); if self.hardened { child |= BIP32_HARD; } child = child.swap_bytes(); - // TODO: SecAlloc ([NSMutableData secureDataWithCapacity:14 + key.length + sizeof(chain)]) - // let mut writer = Vec::::with_capacity(14 + self.data.len() + std::mem::size_of::()); - let mut writer = SecVec::with_capacity(14 + self.data.len() + std::mem::size_of::()); + let mut writer = SecVec::with_capacity(14 + self.data.len() + size_of::<[u8; 32]>()); let is_priv = self.data.len() < 33; writer.extend_from_slice(&if is_priv { chain_type.bip32_script_map().xprv } else { chain_type.bip32_script_map().xpub }); // 4 - self.depth.enc(&mut writer); // 5 - self.fingerprint.enc(&mut writer); // 9 - child.enc(&mut writer); // 13 - self.chaincode.enc(&mut writer); // 45 + self.depth.consensus_encode(&mut writer).unwrap(); // 5 + self.fingerprint.consensus_encode(&mut writer).unwrap(); // 9 + child.consensus_encode(&mut writer).unwrap(); // 13 + self.chaincode.consensus_encode(&mut writer).unwrap(); // 45 if is_priv { - b'\0'.enc(&mut writer); // 46 (prv) / 45 (pub) + b'\0'.consensus_encode(&mut writer).unwrap(); // 46 (prv) / 45 (pub) } writer.extend_from_slice(&self.data); // 78 (prv) / 78 (pub) base58::check_encode_slice(&writer) } else { - // TODO: SecAlloc ([NSMutableData secureDataWithCapacity:47 + key.length + sizeof(chain)]) - // let mut writer = Vec::::with_capacity(47 + self.data.len() + std::mem::size_of::()); - let mut writer = SecVec::with_capacity(47 + self.data.len() + std::mem::size_of::()); + let mut writer = SecVec::with_capacity(47 + self.data.len() + size_of::<[u8; 32]>()); let is_priv = self.data.len() < 33; writer.extend_from_slice(&if is_priv { chain_type.dip14_script_map().dps } else { chain_type.dip14_script_map().dpp }); // 4 - self.depth.enc(&mut writer); // 5 - self.fingerprint.enc(&mut writer); // 9 - self.hardened.enc(&mut writer); // 10 - self.child.enc(&mut writer); // 42 - self.chaincode.enc(&mut writer); // 74 + self.depth.consensus_encode(&mut writer).unwrap(); // 5 + self.fingerprint.consensus_encode(&mut writer).unwrap(); // 9 + self.hardened.consensus_encode(&mut writer).unwrap(); // 10 + self.child.consensus_encode(&mut writer).unwrap(); // 42 + self.chaincode.consensus_encode(&mut writer).unwrap(); // 74 if is_priv { - b'\0'.enc(&mut writer); // 75 (prv) / 74 (pub) + b'\0'.consensus_encode(&mut writer).unwrap(); // 75 (prv) / 74 (pub) } writer.extend_from_slice(&self.data); // 107 (prv) / 107 (pub) base58::check_encode_slice(&writer) diff --git a/dash-spv-masternode-processor/src/chain/bip/bip38.rs b/dash-spv-crypto/src/bip/bip38.rs similarity index 72% rename from dash-spv-masternode-processor/src/chain/bip/bip38.rs rename to dash-spv-crypto/src/bip/bip38.rs index 64c3961c..27366111 100644 --- a/dash-spv-masternode-processor/src/chain/bip/bip38.rs +++ b/dash-spv-crypto/src/bip/bip38.rs @@ -1,20 +1,20 @@ use bip38::{Decrypt, Encrypt}; use byte::BytesExt; -use crate::chain::ScriptMap; -use crate::crypto::UInt256; -use crate::keys::ECDSAKey; -use crate::util::base58; +use crate::keys::{ECDSAKey, KeyError}; +use crate::network::ChainType; +use crate::util::{base58, is_valid_dash_address_for_script_map, is_valid_dash_private_key, ScriptMap}; const BIP38_NOEC_PREFIX: u16 = 0x0142; const BIP38_EC_PREFIX: u16 = 0x0143; const BIP38_NOEC_FLAG: u8 = 0x80 | 0x40; +#[allow(unused)] const BIP38_COMPRESSED_FLAG: u8 = 0x20; const BIP38_LOTSEQUENCE_FLAG: u8 = 0x04; const BIP38_INVALID_FLAG: u8 = 0x10 | 0x08 | 0x02 | 0x01; pub trait BIP38 { // decrypts a BIP38 key using the given passphrase or retuns nil if passphrase is incorrect - fn key_with_bip38_key(key: &str, passphrase: &str, script: &ScriptMap) -> Option where Self: Sized; + fn key_with_bip38_key(key: &str, passphrase: &str, script: &ScriptMap) -> Result where Self: Sized; // generates an "intermediate code" for an EC multiply mode key, salt should be 64bits of random data // fn bip38_intermediate_code_with_salt(salt: u64, passphrase: &str) -> Option; // generates an "intermediate code" for an EC multiply mode key with a lot and sequence number, lot must be less than @@ -23,21 +23,22 @@ pub trait BIP38 { // generates a BIP38 key from an "intermediate code" and 24 bytes of cryptographically random data (seedb), // fn bip38_key_with_intermediate_code(code: &str, seedb: Vec, chain_type: ChainType) -> Option; // encrypts receiver with passphrase and returns BIP38 key - fn bip38_key_with_passphrase(&self, passphrase: &str, script: &ScriptMap) -> Option; + fn bip38_key_with_passphrase(&self, passphrase: &str, script: &ScriptMap) -> Result; fn is_valid_bip38_key(key: &str) -> bool; } impl BIP38 for ECDSAKey { - fn key_with_bip38_key(key: &str, passphrase: &str, script: &ScriptMap) -> Option where Self: Sized { + fn key_with_bip38_key(key: &str, passphrase: &str, script: &ScriptMap) -> Result where Self: Sized { key.decrypt(passphrase, script.pubkey) - .ok() - .and_then(|(secret, compressed)| ECDSAKey::init_with_secret(UInt256(secret), compressed)) + .map_err(KeyError::from) + .and_then(|(secret, compressed)| ECDSAKey::init_with_secret(secret, compressed)) } - fn bip38_key_with_passphrase(&self, passphrase: &str, script: &ScriptMap) -> Option { - self.seckey.0.encrypt(passphrase, false, script.pubkey).ok() + fn bip38_key_with_passphrase(&self, passphrase: &str, script: &ScriptMap) -> Result { + self.seckey.encrypt(passphrase, false, script.pubkey) + .map_err(KeyError::from) } fn is_valid_bip38_key(key: &str) -> bool { @@ -60,3 +61,16 @@ impl BIP38 for ECDSAKey { } } } + +#[ferment_macro::export] +pub fn is_valid_payment_request_address(key: String, chain_type: ChainType) -> bool { + let script_map = chain_type.script_map(); + is_valid_dash_address_for_script_map(&key, &script_map) || + is_valid_dash_private_key(&key, &script_map) || + is_valid_bip38_key(&key) +} + +#[ferment_macro::export] +pub fn is_valid_bip38_key(key: &str) -> bool { + ECDSAKey::is_valid_bip38_key(key) +} \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/chain/bip/mod.rs b/dash-spv-crypto/src/bip/mod.rs similarity index 100% rename from dash-spv-masternode-processor/src/chain/bip/mod.rs rename to dash-spv-crypto/src/bip/mod.rs diff --git a/dash-spv-masternode-processor/src/crypto/byte_util.rs b/dash-spv-crypto/src/crypto/byte_util.rs similarity index 58% rename from dash-spv-masternode-processor/src/crypto/byte_util.rs rename to dash-spv-crypto/src/crypto/byte_util.rs index e50e5ec1..d9f175ce 100644 --- a/dash-spv-masternode-processor/src/crypto/byte_util.rs +++ b/dash-spv-crypto/src/crypto/byte_util.rs @@ -1,23 +1,19 @@ -use byte::{BytesExt, ctx::Endian, LE, Result, TryRead, TryWrite}; -use std::{io::Write, mem, net::{IpAddr, Ipv4Addr}, slice}; -use ed25519_dalek::{SigningKey, VerifyingKey}; -use hashes::{Hash, hash160, HashEngine, Hmac, HmacEngine, ripemd160, sha1, sha256, sha256d, sha512}; -use secp256k1::rand::{Rng, thread_rng}; +use byte::{BytesExt, ctx::Endian, LE, TryRead, TryWrite}; +use std::{io::Write, mem, slice}; +use dashcore::consensus::{Decodable, Encodable, ReadExt, WriteExt}; +use dashcore::hashes::{Hash, HashEngine, hex::FromHex, Hmac, HmacEngine}; +use dashcore::secp256k1::{hashes::hex::DisplayHex, rand::{Rng, thread_rng}}; #[cfg(feature = "generate-dashj-tests")] use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use crate::chain::params::{BIP32_SEED_KEY, ED25519_SEED_KEY}; -use crate::consensus::{Decodable, Encodable, ReadExt, WriteExt}; -use crate::ffi; -use crate::hashes::{hex::{FromHex, ToHex}, hex}; -use crate::util::base58; -use crate::util::data_ops::short_hex_string_from; -pub trait AsBytes { - fn as_bytes(&self) -> &[u8]; -} +use std::io; +use dashcore::secp256k1::rand::random; pub trait Reversable { fn reverse(&mut self) -> Self; + // fn reversed(&self) -> Self; +} +pub trait Reversed { fn reversed(&self) -> Self; } @@ -30,48 +26,25 @@ pub trait Random { } pub trait MutDecodable<'a, T: TryRead<'a, Endian>> { - fn from_mut(bytes: *mut u8) -> Option; + fn from_mut(bytes: *mut u8) -> byte::Result; } pub trait ConstDecodable<'a, T: TryRead<'a, Endian>> { - fn from_const(bytes: *const u8) -> Option; + fn from_const(bytes: *const u8) -> byte::Result; } pub trait BytesDecodable<'a, T: TryRead<'a, Endian>> { - fn from_bytes(bytes: &'a [u8], offset: &mut usize) -> Option; + fn from_bytes(bytes: &'a [u8], offset: &mut usize) -> byte::Result; } - -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct UInt128(pub [u8; 16]); -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct UInt160(pub [u8; 20]); #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +#[ferment_macro::export] pub struct UInt256(pub [u8; 32]); -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct UInt384(pub [u8; 48]); -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct UInt512(pub [u8; 64]); -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct UInt768(pub [u8; 96]); - -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct ECPoint(pub [u8; 33]); - #[macro_export] -macro_rules! impl_ffi_bytearray { - ($var_type: ident) => { - impl From<$var_type> for ffi::ByteArray { - fn from(value: $var_type) -> Self { - let vec = value.0.to_vec(); - vec.into() - } - } - impl From> for ffi::ByteArray { - fn from(value: Option<$var_type>) -> Self { - if let Some(v) = value { - v.into() - } else { - ffi::ByteArray::default() - } +macro_rules! impl_from_const_ptr { + ($var_type: ident, $byte_len: expr) => { + impl From<*const [u8; $byte_len]> for $var_type { + fn from(value: *const [u8; $byte_len]) -> Self { + let slice = unsafe { &*value }; + $var_type(*slice) } } } @@ -96,9 +69,9 @@ macro_rules! impl_random { #[macro_export] macro_rules! impl_bytes_decodable { ($var_type: ident) => { - impl<'a> BytesDecodable<'a, $var_type> for $var_type { - fn from_bytes(bytes: &'a [u8], offset: &mut usize) -> Option { - bytes.read_with(offset, LE).ok() + impl<'a> $crate::crypto::byte_util::BytesDecodable<'a, $var_type> for $var_type { + fn from_bytes(bytes: &'a [u8], offset: &mut usize) -> byte::Result { + byte::BytesExt::read_with(bytes, offset, byte::LE) } } } @@ -106,9 +79,9 @@ macro_rules! impl_bytes_decodable { #[macro_export] macro_rules! impl_bytes_decodable_lt { ($var_type: ident) => { - impl<'a> BytesDecodable<'a, $var_type<'a>> for $var_type<'a> { - fn from_bytes(bytes: &'a [u8], offset: &mut usize) -> Option { - bytes.read_with(offset, LE).ok() + impl<'a> $crate::crypto::byte_util::BytesDecodable<'a, $var_type<'a>> for $var_type<'a> { + fn from_bytes(bytes: &'a [u8], offset: &mut usize) -> byte::Result { + byte::BytesExt::read_with(bytes, offset, byte::LE) } } } @@ -121,24 +94,16 @@ macro_rules! impl_decodable { impl<'a> ConstDecodable<'a, $var_type> for $var_type { #[allow(clippy::not_unsafe_ptr_arg_deref)] - fn from_const(bytes: *const u8) -> Option { - if bytes.is_null() { - None - } else { - let safe_bytes = unsafe { slice::from_raw_parts(bytes, $byte_len) }; - safe_bytes.read_with::(&mut 0, LE).ok() - } + fn from_const(bytes: *const u8) -> byte::Result { + let safe_bytes = unsafe { slice::from_raw_parts(bytes, $byte_len) }; + safe_bytes.read_with::(&mut 0, LE) } } impl<'a> MutDecodable<'a, $var_type> for $var_type { #[allow(clippy::not_unsafe_ptr_arg_deref)] - fn from_mut(bytes: *mut u8) -> Option { - if bytes.is_null() { - None - } else { - let safe_bytes = unsafe { slice::from_raw_parts_mut(bytes, $byte_len) }; - safe_bytes.read_with::(&mut 0, LE).ok() - } + fn from_mut(bytes: *mut u8) -> byte::Result { + let safe_bytes = unsafe { slice::from_raw_parts_mut(bytes, $byte_len) }; + safe_bytes.read_with::(&mut 0, LE) } } } @@ -174,7 +139,7 @@ macro_rules! define_try_from_bytes { macro_rules! define_try_read_to_big_uint { ($uint_type: ident, $byte_len: expr) => { impl<'a> TryRead<'a, Endian> for $uint_type { - fn try_read(bytes: &'a [u8], endian: Endian) -> Result<(Self, usize)> { + fn try_read(bytes: &'a [u8], endian: Endian) -> byte::Result<(Self, usize)> { // Ok(($uint_type(bytes[..$byte_len].try_into().unwrap_or([0u8; $byte_len])), $byte_len)) let mut offset = 0usize; let mut data: [u8; $byte_len] = [0u8; $byte_len]; @@ -192,14 +157,14 @@ macro_rules! define_try_read_to_big_uint { macro_rules! define_serde_big_uint { ($uint_type: ident) => { impl Serialize for $uint_type { - fn serialize(&self, serializer: S) -> std::result::Result where S: Serializer { - let str = self.0.to_hex(); + fn serialize(&self, serializer: S) -> Result where S: Serializer { + let str = self.0.to_lower_hex_string(); serializer.serialize_str(&str) } } impl<'de> Deserialize<'de> for $uint_type { - fn deserialize(deserializer: D) -> std::result::Result where D: Deserializer<'de> { + fn deserialize(deserializer: D) -> Result where D: Deserializer<'de> { String::deserialize(deserializer) .map(|s| $uint_type::from_hex(s.as_str()).unwrap()) } @@ -211,13 +176,26 @@ macro_rules! define_serde_big_uint { macro_rules! define_try_write_from_big_uint { ($uint_type: ident) => { impl TryWrite for $uint_type { - fn try_write(self, mut bytes: &mut [u8], endian: Endian) -> byte::Result { + fn try_write(self, mut bytes: &mut [u8], _endian: Endian) -> byte::Result { bytes.write_all(&self.0).unwrap(); Ok(self.0.len()) } } } } +#[macro_export] +macro_rules! define_zeroable { + ($byte_len: expr) => { + impl Zeroable for [u8; $byte_len] { + fn is_zero(&self) -> bool { + !self.iter().any(|&byte| byte > 0) + } + } + } +} +define_zeroable!(32); +define_zeroable!(48); +define_zeroable!(96); #[macro_export] macro_rules! define_bytes_to_big_uint { @@ -226,8 +204,9 @@ macro_rules! define_bytes_to_big_uint { define_try_read_to_big_uint!($uint_type, $byte_len); define_try_write_from_big_uint!($uint_type); impl_decodable!($uint_type, $byte_len); + impl_from_const_ptr!($uint_type, $byte_len); define_try_from_bytes!($uint_type); - impl_ffi_bytearray!($uint_type); + // impl_ffi_bytearray!($uint_type); #[cfg(feature = "generate-dashj-tests")] define_serde_big_uint!($uint_type); @@ -240,41 +219,33 @@ macro_rules! define_bytes_to_big_uint { impl std::fmt::Display for $uint_type { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "{}", self.0.to_hex())?; + write!(f, "{}", self.0.to_lower_hex_string())?; Ok(()) } } - // Used for code generation sometime while debugging - // impl std::fmt::Debug for $uint_type { - // fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - // write!(f, "{}::from_hex(\"{}\").unwrap()", stringify!($uint_type), self.0.to_hex())?; - // Ok(()) - // } - // } impl std::fmt::Debug for $uint_type { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "{}", self.0.to_hex())?; + write!(f, "{}", self.0.to_lower_hex_string())?; Ok(()) } } impl Encodable for $uint_type { #[inline] - fn consensus_encode(&self, mut writer: W) -> std::result::Result { - writer.emit_slice(&self.as_bytes())?; + fn consensus_encode(&self, writer: &mut W) -> Result { + writer.emit_slice(self.as_ref())?; Ok($byte_len) } } impl Decodable for $uint_type { #[inline] - fn consensus_decode(mut d: D) -> std::result::Result { + fn consensus_decode(reader: &mut R) -> Result { let mut ret = [0; $byte_len]; - d.read_slice(&mut ret)?; + reader.read_slice(&mut ret)?; Ok($uint_type(ret)) } } - // TODO: as it's often use to compare hashes // it's needs to be optimized impl Reversable for $uint_type { @@ -282,17 +253,25 @@ macro_rules! define_bytes_to_big_uint { self.0.reverse(); *self } + } + impl Reversed for $uint_type { fn reversed(&self) -> Self { let mut s = self.0.clone(); s.reverse(); $uint_type(s) } } + impl Reversed for [u8; $byte_len] { + fn reversed(&self) -> Self { + let mut s = self.clone(); + s.reverse(); + s + } + } + impl FromHex for $uint_type { - fn from_byte_iter(iter: I) -> std::result::Result - where I: Iterator> + - ExactSizeIterator + - DoubleEndedIterator { + fn from_byte_iter(iter: I) -> Result + where I: Iterator> + ExactSizeIterator + DoubleEndedIterator { if iter.len() == $byte_len { let mut ret = [0; $byte_len]; for (n, byte) in iter.enumerate() { @@ -300,7 +279,7 @@ macro_rules! define_bytes_to_big_uint { } Ok($uint_type(ret)) } else { - Err(hex::Error::InvalidLength(2 * $byte_len, 2 * iter.len())) + Err(dashcore::hashes::hex::Error::InvalidLength(2 * $byte_len, 2 * iter.len())) } } } @@ -316,16 +295,9 @@ macro_rules! define_bytes_to_big_uint { pub const MAX: Self = $uint_type([!0; $byte_len]); pub const SIZE: usize = $byte_len; } - - impl AsBytes for $uint_type { - fn as_bytes(&self) -> &[u8] { - &self.0[..] - } - } } } - impl_decodable!(u8, 1); impl_decodable!(u16, 2); impl_decodable!(u32, 4); @@ -338,14 +310,51 @@ impl_decodable!(i64, 8); impl_decodable!(isize, mem::size_of::()); -define_bytes_to_big_uint!(UInt128, 16); -define_bytes_to_big_uint!(UInt160, 20); define_bytes_to_big_uint!(UInt256, 32); -define_bytes_to_big_uint!(UInt384, 48); -define_bytes_to_big_uint!(UInt512, 64); -define_bytes_to_big_uint!(UInt768, 96); -define_bytes_to_big_uint!(ECPoint, 33); +pub trait U32LE { + fn u32_le(&self) -> u32; + +} + +pub trait Is31Bits { + fn is_31_bits(&self) -> bool; +} + +impl Is31Bits for [u8; 32] { + fn is_31_bits(&self) -> bool { + let u64_1 = u64::from_le_bytes(clone_into_array(&self[8..16])); + let u64_2 = u64::from_le_bytes(clone_into_array(&self[16..24])); + let u64_3 = u64::from_le_bytes(clone_into_array(&self[24..])); + let u32_1 = u32::from_le_bytes(clone_into_array(&self[4..8])); + let u32_0 = u32::from_le_bytes(clone_into_array(&self[..4])); + (u64_1 | u64_2 | u64_3) == 0 && u32_1 == 0 && u32_0 & 0x80000000 == 0 + } + +} +impl U32LE for [u8; 32] { + fn u32_le(&self) -> u32 { + u32::from_le_bytes(clone_into_array(&self[..4])) + } +} + +impl U32LE for [u8; 20] { + fn u32_le(&self) -> u32 { + u32::from_le_bytes(clone_into_array(&self[..4])) + } +} + +impl Random for [u8; 32] { + fn random() -> Self where Self: Sized { + let mut data: [u8; 32] = [0u8; 32]; + for i in 0..32 { + data[i] = random(); + } + data + } +} + + pub const fn merge(mut buf: [u8; N], bytes: &[u8]) -> [u8; N] { let mut i = 0; @@ -369,6 +378,18 @@ impl From for UInt256 { UInt256(r) } } +pub fn from_u32(value: u32) -> [u8; 32] { + let mut r = [0u8; 32]; + r[..4].copy_from_slice(&value.to_le_bytes()); + r + +} +pub fn from_u64(value: u64) -> [u8; 32] { + let mut r = [0u8; 32]; + r[..8].copy_from_slice(&value.to_le_bytes()); + r + +} impl From for UInt256 { fn from(value: u64) -> Self { @@ -415,48 +436,50 @@ impl std::ops::Shl for UInt256 { } } -pub fn add_one_le(a: UInt256) -> UInt256 { +pub fn add_one_le(a: [u8; 32]) -> [u8; 32] { let mut r = [0u8; 32]; r[0..8].clone_from_slice(&1u64.to_le_bytes()); - add_le(a, UInt256(r)) + add_le(a, r) } -pub fn add_le(x: UInt256, a: UInt256) -> UInt256 { +pub fn add_le(x: [u8; 32], a: [u8; 32]) -> [u8; 32] { let mut carry = 0u64; let mut r = [0u8; 32]; for i in 0..8 { let len = i + 4; - let xb: [u8; 4] = clone_into_array(&x.0[i..len]); - let ab: [u8; 4] = clone_into_array(&a.0[i..len]); + let xb: [u8; 4] = clone_into_array(&x[i..len]); + let ab: [u8; 4] = clone_into_array(&a[i..len]); let sum = u32::from_le_bytes(xb) as u64 + u32::from_le_bytes(ab) as u64 + carry; r[i..len].clone_from_slice(&(sum as u32).to_le_bytes()); carry = sum >> 32; } - UInt256(r) + r } -fn multiply_u32_le(mut a: UInt256, b: u32) -> UInt256 { +#[allow(unused)] +fn multiply_u32_le(mut a: [u8; 32], b: u32) -> [u8; 32] { let mut carry = 0u64; for i in 0..8 { let len = i + 4; - let ab: [u8; 4] = clone_into_array(&a.0[i..len]); + let ab: [u8; 4] = clone_into_array(&a[i..len]); let n = carry + (b as u64) * (u32::from_le_bytes(ab) as u64); - a.0[i..len].clone_from_slice(&(n as u32 & 0xffffffff).to_le_bytes()); + a[i..len].clone_from_slice(&(n as u32 & 0xffffffff).to_le_bytes()); carry = n >> 32; } - return a; + a } -pub fn shift_left_le(a: UInt256, bits: u8) -> UInt256 { +#[allow(unused)] +pub fn shift_left_le(a: [u8; 32], bits: u8) -> [u8; 32] { let mut r = [0u8; 32]; let k = bits / 8; let bits = bits % 8; for i in 0..32 { let ik = i + k as usize; let ik1 = ik + 1; - let u8s = a.0[i]; + let u8s = a[i]; if ik1 < 32 && bits != 0 { r[ik1] |= u8s >> (8 - bits); } @@ -464,17 +487,18 @@ pub fn shift_left_le(a: UInt256, bits: u8) -> UInt256 { r[ik] |= u8s << bits; } } - UInt256(r) + r } -fn shift_right_le(a: UInt256, bits: u8) -> UInt256 { +#[allow(unused)] +fn shift_right_le(a: [u8; 32], bits: u8) -> [u8; 32] { let mut r = [0u8; 32]; let k = bits / 8; let bits = bits % 8; for i in 0..32 { let ik = i - k as isize; let ik1 = ik - 1; - let u8s = a.0[i as usize]; + let u8s = a[i as usize]; if ik1 >= 0 && bits != 0 { r[ik1 as usize] |= u8s << (8 - bits); } @@ -482,112 +506,96 @@ fn shift_right_le(a: UInt256, bits: u8) -> UInt256 { r[ik as usize] |= u8s >> bits; } } - UInt256(r) -} - -impl UInt160 { - pub fn hash160(data: &[u8]) -> Self { - UInt160(hash160::Hash::hash(data).into_inner()) - } - pub fn hash160u32le(data: &[u8]) -> u32 { - Self::hash160(data).u32_le() - } - pub fn ripemd160(data: &[u8]) -> Self { - UInt160(ripemd160::Hash::hash(data).into_inner()) - } - pub fn sha1(data: &[u8]) -> Self { - UInt160(sha1::Hash::hash(data).into_inner()) - } - - pub fn u32_le(&self) -> u32 { - u32::from_le_bytes(clone_into_array(&self.0[..4])) - } -} - -impl UInt128 { - pub fn ip_address_from_u32(value: u32) -> Self { - //UInt128 address = {.u32 = {0, 0, CFSwapInt32HostToBig(0xffff), CFSwapInt32HostToBig(self.address)}}; - let mut writer = Vec::::new(); - 0u64.enc(&mut writer); - 0xffffu32.swap_bytes().enc(&mut writer); - value.swap_bytes().enc(&mut writer); - UInt128(clone_into_array(&writer)) - } - - pub fn ip_address_to_i32(&self) -> i32 { - // todo: check impl - // if (p.address.u64[0] != 0 || p.address.u32[2] != CFSwapInt32HostToBig(0xffff)) continue; // skip IPv6 for now - // CFSwapInt32BigToHost(p.address.u32[3]) - i32::from_be_bytes(clone_into_array(&self.0[12..])) - } - - pub fn to_ip_addr(&self) -> IpAddr { - IpAddr::from(self.0) - } - - pub fn to_ipv4_addr(&self) -> Ipv4Addr { - Ipv4Addr::from(self.ip_address_to_i32() as u32) - } -} - -impl From for UInt128 { - fn from(value: IpAddr) -> Self { - match value { - IpAddr::V4(ipv4) => { - let mut writer = [0u8; 16]; - writer[8..12].copy_from_slice(&0xffffu32.to_be_bytes()); - writer[12..].copy_from_slice(&ipv4.octets()); - UInt128(writer) - }, - IpAddr::V6(ipv6) => UInt128(ipv6.octets()) - } - } + r +} + +// impl UInt160 { + // pub fn hash160(data: &[u8]) -> Self { + // UInt160(hash160::Hash::hash(data).to_byte_array()) + // } + // pub fn hash160u32le(data: &[u8]) -> u32 { + // Self::hash160(data).u32_le() + // } + // pub fn sha1(data: &[u8]) -> Self { + // UInt160(sha1::Hash::hash(data).to_byte_array()) + // } + // + // pub fn u32_le(&self) -> u32 { + // u32::from_le_bytes(clone_into_array(&self.0[..4])) + // } +// } + +// impl UInt128 { + // pub fn ip_address_from_u32(value: u32) -> Self { + // //UInt128 address = {.u32 = {0, 0, CFSwapInt32HostToBig(0xffff), CFSwapInt32HostToBig(self.address)}}; + // let mut writer = Vec::::new(); + // 0u64.consensus_encode(&mut writer).unwrap(); + // 0xffffu32.swap_bytes().consensus_encode(&mut writer).unwrap(); + // value.swap_bytes().consensus_encode(&mut writer).unwrap(); + // UInt128(clone_into_array(&writer)) + // } + // + // pub fn ip_address_to_i32(&self) -> i32 { + // // todo: check impl + // // if (p.address.u64[0] != 0 || p.address.u32[2] != CFSwapInt32HostToBig(0xffff)) continue; // skip IPv6 for now + // // CFSwapInt32BigToHost(p.address.u32[3]) + // i32::from_be_bytes(clone_into_array(&self.0[12..])) + // } + // + // pub fn to_ip_addr(&self) -> IpAddr { + // IpAddr::from(self.0) + // } + // + // pub fn to_ipv4_addr(&self) -> Ipv4Addr { + // Ipv4Addr::from(self.ip_address_to_i32() as u32) + // } +// } + +// impl From for UInt128 { +// fn from(value: IpAddr) -> Self { +// match value { +// IpAddr::V4(ipv4) => { +// let mut writer = [0u8; 16]; +// writer[8..12].copy_from_slice(&0xffffu32.to_be_bytes()); +// writer[12..].copy_from_slice(&ipv4.octets()); +// UInt128(writer) +// }, +// IpAddr::V6(ipv6) => UInt128(ipv6.octets()) +// } +// } +// } + +// impl UInt256 { + // pub fn sha256(data: &[u8]) -> Self { + // UInt256(sha256::Hash::hash(data).to_byte_array()) + // } + // pub fn sha256_str(data: &str) -> Self { + // UInt256(sha256::Hash::hash(data.as_bytes()).to_byte_array()) + // } + // pub fn sha256d(data: impl AsRef<[u8]>) -> Self { + // UInt256(sha256d::Hash::hash(data.as_ref()).to_byte_array()) + // } + // pub fn sha256d_str(data: &str) -> Self { + // UInt256(sha256d::Hash::hash(data.as_bytes()).to_byte_array()) + // } + // pub fn x11_hash(data: &[u8]) -> Self { + // let hash = rs_x11_hash::get_x11_hash(&data); + // UInt256(hash) + // } +// +//} +pub fn block_hash_for_dev_net_genesis_block_with_version(version: u32, prev_hash: [u8; 32], merkle_root: [u8; 32], timestamp: u32, target: u32, nonce: u32) -> [u8; 32] { + let mut writer = Vec::::new(); + version.consensus_encode(&mut writer).unwrap(); + prev_hash.consensus_encode(&mut writer).unwrap(); + merkle_root.consensus_encode(&mut writer).unwrap(); + timestamp.consensus_encode(&mut writer).unwrap(); + target.consensus_encode(&mut writer).unwrap(); + nonce.consensus_encode(&mut writer).unwrap(); + rs_x11_hash::get_x11_hash(&writer) } impl UInt256 { - pub fn sha256(data: &[u8]) -> Self { - UInt256(sha256::Hash::hash(data).into_inner()) - } - pub fn sha256_str(data: &str) -> Self { - UInt256(sha256::Hash::hash(data.as_bytes()).into_inner()) - } - pub fn sha256d(data: impl AsRef<[u8]>) -> Self { - UInt256(sha256d::Hash::hash(data.as_ref()).into_inner()) - } - pub fn sha256d_str(data: &str) -> Self { - UInt256(sha256d::Hash::hash(data.as_bytes()).into_inner()) - } - pub fn x11_hash(data: &[u8]) -> Self { - let hash = rs_x11_hash::get_x11_hash(&data); - UInt256(hash) - } - - pub fn block_hash_for_dev_net_genesis_block_with_version(version: u32, prev_hash: UInt256, merkle_root: UInt256, timestamp: u32, target: u32, nonce: u32) -> Self { - let mut writer = Vec::::new(); - version.enc(&mut writer); - prev_hash.enc(&mut writer); - merkle_root.enc(&mut writer); - timestamp.enc(&mut writer); - target.enc(&mut writer); - nonce.enc(&mut writer); - Self::x11_hash(&writer) - } -} - -impl UInt256 { - pub fn add_le_u32(&self, a: UInt256) -> UInt256 { - let mut carry = 0u64; - let mut r = [0u8; 32]; - for i in 0..8 { - let len = i + 4; - let xb: [u8; 4] = clone_into_array(&self.0[i..len]); - let ab: [u8; 4] = clone_into_array(&a.0[i..len]); - let sum = u32::from_le_bytes(xb) as u64 + u32::from_le_bytes(ab) as u64 + carry; - r[i..len].copy_from_slice(&(sum as u32).to_le_bytes()); - carry = sum >> 32; - } - UInt256(r) - } pub fn add_le(&self, a: UInt256) -> UInt256 { let mut carry = 0u64; @@ -825,85 +833,130 @@ impl UInt256 { u64::from_le_bytes(clone_into_array(&self.0[24..])) } } +pub fn hmac(key: &[u8], input: &[u8]) -> T::Bytes { + let mut engine = HmacEngine::::new(key); + engine.input(input); + Hmac::::from_engine(engine).to_byte_array() +} + +// impl UInt256 { +// pub fn short_hex(&self) -> String { +// short_hex_string_from(self.as_bytes()) +// } +// } +// +// impl UInt256 { +// pub fn from_base58_string(data: &str) -> Option { +// base58::from(data).ok() +// .and_then(|d| Self::from_bytes(&d, &mut 0).ok()) +// } +// } +// +// +// impl UInt256 { +// pub fn hmac>(key: &[u8], input: &[u8]) -> Self { +// let mut engine = HmacEngine::::new(key); +// engine.input(input); +// Self(Hmac::::from_engine(engine).to_byte_array()) +// } +// } +// +// impl From for UInt256 { +// fn from(value: SigningKey) -> Self { +// UInt256(value.to_bytes()) +// } +// } +// +// impl From for SigningKey { +// fn from(value: UInt256) -> Self { +// SigningKey::from_bytes(&value.0) +// } +// } +// +// impl From for UInt256 { +// fn from(value: VerifyingKey) -> Self { +// UInt256(value.to_bytes()) +// // let mut data = [0u8; 33]; +// // data[1..33].copy_from_slice(value.as_bytes()); +// // Self(data) +// } +// } +// impl From for ECPoint { +// fn from(value: VerifyingKey) -> Self { +// let mut data = [0u8; 33]; +// data[1..33].copy_from_slice(value.as_bytes()); +// Self(data) +// } +// } +// +// pub fn hmac(key: &[u8], input: &[u8]) -> [u8; 64] { +// let mut engine = HmacEngine::::new(key); +// engine.input(input); +// Hmac::::from_engine(engine).to_byte_array() +// } +// impl UInt512 { + // pub fn sha512(data: &[u8]) -> Self { + // UInt512(sha512::Hash::hash(data).to_byte_array()) + // } + // pub fn hmac(key: &[u8], input: &[u8]) -> Self { + // Self(hmac(key, input)) + // } + + // pub fn bip32_seed_key(input: &[u8]) -> Self { + // Self::hmac(BIP32_SEED_KEY.as_bytes(), input) + // } + + // pub fn ed25519_seed_key(input: &[u8]) -> Self { + // Self::hmac(ED25519_SEED_KEY.as_bytes(), input) + // } + // + // pub fn from(a: UInt256, b: UInt256) -> Self { + // let mut result = [0u8; 64]; + // result[..32].copy_from_slice(&a.0); + // result[32..].copy_from_slice(&b.0); + // Self(result) + // } +// } +// pub fn sup(lhs: [u8; 32], rhs: &[u8; 32]) -> bool { +// for i in (0..32).rev() { +// if lhs[i] > rhs[i] { +// return true; +// } else if lhs[i] < rhs[i] { +// return false; +// } +// } +// // equal +// false +// } + +#[test] +pub fn test_superior_and_equal_uint256() { + let big_a = UInt256::from(7u64); + let big_b = UInt256::from(5u64); + assert!(big_a.sup(&big_b), "A in uint 256 needs to be bigger than B"); + let big_c = UInt256::from([0,1,0,0]); + assert!(big_c.sup(&big_a), "C in uint 256 needs to be bigger than A"); + let d: u64 = 1 << 30; + let big_d = UInt256::from(d); + let big_d_left_shifted = big_d.shift_left_le(34); + assert!(big_c.eq(&big_d_left_shifted), "C and D should be equal"); + let e: u32 = 1 << 30; + let big_e = UInt256::from(e); + let big_e_left_shifted = big_e.shift_left_le(34); + assert!(big_e_left_shifted.eq(&big_d_left_shifted), "D and E should be equal"); +} + +#[test] +pub fn test_biguints_ops() { + let mut x = [0u8; 32]; + x[0] = 0x32; // 50 + let a = UInt256(x); + for i in 0..=32 { + println!("{}", a >> i); + } + + let a = b"a0fcffffffffffffffffffffffffffffffffffffffffffffffffffffff4ffbff"; + let b = b"100e000000000000000000000000000000000000000000000000000000000000"; -impl UInt256 { - pub fn short_hex(&self) -> String { - short_hex_string_from(self.as_bytes()) - } -} - -impl UInt256 { - pub fn from_base58_string(data: &str) -> Option { - base58::from(data) - .ok() - .and_then(|d| Self::from_bytes(&d, &mut 0)) - } -} - -impl UInt256 { - pub fn hmac>(key: &[u8], input: &[u8]) -> Self { - let mut engine = HmacEngine::::new(key); - engine.input(input); - Self(Hmac::::from_engine(engine).into_inner()) - } -} - -impl secp256k1::ThirtyTwoByteHash for UInt256 { - fn into_32(self) -> [u8; 32] { - self.0 - } -} - -impl From for UInt256 { - fn from(value: SigningKey) -> Self { - UInt256(value.to_bytes()) - } } -impl From for SigningKey { - fn from(value: UInt256) -> Self { - SigningKey::from_bytes(&value.0) - } -} - -impl From for UInt256 { - fn from(value: VerifyingKey) -> Self { - UInt256(value.to_bytes()) - // let mut data = [0u8; 33]; - // data[1..33].copy_from_slice(value.as_bytes()); - // Self(data) - } -} -impl From for ECPoint { - fn from(value: VerifyingKey) -> Self { - let mut data = [0u8; 33]; - data[1..33].copy_from_slice(value.as_bytes()); - Self(data) - } -} - -impl UInt512 { - pub fn sha512(data: &[u8]) -> Self { - UInt512(sha512::Hash::hash(data).into_inner()) - } - pub fn hmac(key: &[u8], input: &[u8]) -> Self { - let mut engine = HmacEngine::::new(key); - engine.input(input); - Self(Hmac::::from_engine(engine).into_inner()) - } - - pub fn bip32_seed_key(input: &[u8]) -> Self { - Self::hmac(BIP32_SEED_KEY.as_bytes(), input) - } - - pub fn ed25519_seed_key(input: &[u8]) -> Self { - Self::hmac(ED25519_SEED_KEY.as_bytes(), input) - } - - pub fn from(a: UInt256, b: UInt256) -> Self { - let mut result = [0u8; 64]; - result[..32].copy_from_slice(&a.0); - result[32..].copy_from_slice(&b.0); - Self(result) - } -} diff --git a/dash-spv-masternode-processor/src/crypto/data_ops.rs b/dash-spv-crypto/src/crypto/data_ops.rs similarity index 100% rename from dash-spv-masternode-processor/src/crypto/data_ops.rs rename to dash-spv-crypto/src/crypto/data_ops.rs diff --git a/dash-spv-crypto/src/crypto/mod.rs b/dash-spv-crypto/src/crypto/mod.rs new file mode 100644 index 00000000..dfb21190 --- /dev/null +++ b/dash-spv-crypto/src/crypto/mod.rs @@ -0,0 +1,3 @@ +pub mod data_ops; +pub mod byte_util; +pub use self::byte_util::UInt256; diff --git a/dash-spv-crypto/src/derivation/derivation_path.rs b/dash-spv-crypto/src/derivation/derivation_path.rs new file mode 100644 index 00000000..94c4099d --- /dev/null +++ b/dash-spv-crypto/src/derivation/derivation_path.rs @@ -0,0 +1,1774 @@ +use std::ops::Index; +use std::sync::Arc; +use std::thread::sleep; +use std::time::Duration; +use bitflags::bitflags; +use dashcore::bip32::DerivationPath; +use dashcore::dip9::{DerivationPathReference, DerivationPathType}; +use dashcore::secp256k1::hashes::hex::DisplayHex; +use indexmap::{IndexMap, IndexSet}; +use dash_spv_keychain::{KeyChainKey, KeyChainValue, KeychainController}; +use crate::derivation::{IIndexPath, IndexPath, BIP32_HARD}; +use crate::keys::{DeriveKey, ECDSAKey, IKey, KeyError, OpaqueKey}; +use crate::keys::key::KeyKind; +use crate::network::{ChainType, IHaveChainSettings}; +use crate::util::address::address; +use crate::util::{from_hash160_for_script_map, is_valid_dash_address_for_script_map}; + + +pub const SEQUENCE_GAP_LIMIT_EXTERNAL: usize = 10; +pub const SEQUENCE_GAP_LIMIT_INTERNAL: usize = 5; +pub const SEQUENCE_GAP_LIMIT_INITIAL: usize = 100; + +pub const SEQUENCE_UNUSED_GAP_LIMIT_EXTERNAL: usize = 10; +pub const SEQUENCE_UNUSED_GAP_LIMIT_INTERNAL: usize = 5; +pub const SEQUENCE_UNUSED_GAP_LIMIT_INITIAL: usize = 15; + +pub const SEQUENCE_DASHPAY_GAP_LIMIT_INCOMING: usize = 6; +pub const SEQUENCE_DASHPAY_GAP_LIMIT_OUTGOING: usize = 3; +pub const SEQUENCE_DASHPAY_GAP_LIMIT_INITIAL: usize = 10; + +pub struct AddressInfo { + pub index: u32, + pub address: String, + pub is_used: bool, + pub standalone: bool, + pub internal: Option, + pub identity_index: Option, +} + +#[derive(Clone)] +pub enum AccountKind { + Standalone(StandaloneInfo), + Account(AccountInfo), +} +impl AccountKind { + pub fn is_transient(&self) -> bool { + match self { + AccountKind::Standalone(_) => true, + AccountKind::Account(info) => info.is_transient + } + } +} + +#[derive(Clone, Debug)] +pub enum SecretSource<'a> { + Seed(&'a [u8]), + ExtendedPrivateKeyData(&'a [u8]), +} + +#[derive(Clone, Debug)] +pub struct AccountInfo { + pub account_number: u32, + pub wallet_unique_id: String, + pub is_transient: bool, +} + +#[derive(Clone, Debug)] +pub struct StandaloneInfo { + pub extended_public_key_identifier: String +} + +pub trait KeychainAccessible { + fn keychain_ref(&self) -> &KeychainController; +} +pub trait DBAccessible { + fn db_ref(&self) -> &DBController; +} + +pub trait AccountKindAccessible { + fn account_ref(&self) -> &AccountKind; + fn account_is_transient(&self) -> bool { + self.account_ref().is_transient() + } +} + +pub enum DerivationError { + AddressesMustBeLoaded, + UnsupportedSettings(RegisterAddressesSettings), + PublicKeyGeneration, +} +impl From for DerivationError { + fn from(_value: KeyError) -> Self { + DerivationError::PublicKeyGeneration + } +} +pub enum DerivationStorageContext { + Index(u32), + IndexedAddress(u32, String), + IndexedAddressIdentity(u32, String, u32), + Addresses(IndexMap, FundsDirection), + LoadAddresses(AccountKind), +} + +bitflags! { + #[derive(Clone, PartialEq)] + pub struct FundsDirection: u32 { + const Internal = 1; + const External = 2; + const All = Self::Internal.bits() | Self::External.bits(); + } +} +#[derive(Clone)] +pub enum RegisterAddressesSettings { + GapLimit(usize), + GapLimitFunds(usize, FundsDirection), + GapLimitIdentity(usize, u32), +} + +pub trait RegisterAddressesWithSettings { + fn register_addresses_with_settings(&mut self, settings: RegisterAddressesSettings) -> Result, DerivationError>; + fn register_addresses_with_settings_and_context(&mut self, settings: RegisterAddressesSettings, context: *const std::os::raw::c_void) -> Result, DerivationError>; +} + +pub trait KeyDataAtIndexPath { + fn private_key_at_index_path(&self, index_path: IndexPath, source: SecretSource) -> Result; + fn public_key_at_index_path(&self, index_path: IndexPath) -> Result; + fn public_key_data_at_index_path(&self, index_path: IndexPath) -> Result, KeyError>; +} + +#[derive(Clone)] +pub enum DerivationPathKind { + Funds(Funds), + IncomingFunds(IncomingFunds), + AssetSwap(AssetSwap), + Authentication(Authentication), + MasternodeHoldings(MasternodeHoldings), +} + +impl DerivationPathKind { + pub fn is_simple_indexed(&self) -> bool { + match self { + DerivationPathKind::AssetSwap(_) | + DerivationPathKind::Authentication(_) | + DerivationPathKind::MasternodeHoldings(_) => true, + _ => false + } + } +} + +#[derive(Clone)] +pub struct Funds { + // pub base: DerivationPathModel, + pub all_change_addresses: IndexSet, + pub all_receive_addresses: IndexSet, + pub internal_addresses: Vec<(u32, String)>, + pub external_addresses: Vec<(u32, String)>, + + pub is_for_first_account: bool, + pub has_known_balance_internal: bool, + pub checked_initial_has_known_balance: bool, +} + +// impl AccountKindAccessible for Funds { +// fn account_ref(&self) -> &AccountKind { +// self.base.account_ref() +// } +// } +// +// impl DBAccessible for Funds { +// fn db_ref(&self) -> &DBController { +// self.base.db_ref() +// } +// } + +// impl Funds { + // pub fn addresses(&self, internal: bool) -> Vec<(u32, String)> { + // Vec::from_iter(if internal { + // self.internal_addresses.iter().cloned() + // } else { + // self.external_addresses.iter().cloned() + // }) + // } + /// returns the first unused external address + // pub fn receive_address(&mut self) -> Option { + // //TODO: limit to 10,000 total addresses and utxos for practical usability with bloom filters + // if let Ok(addr) = self.register_addresses_with_settings(RegisterAddressesSettings::GapLimitFunds(1, FundsDirection::External)) { + // addr.last().map(|(_, address)| address.clone()) + // } else { + // self.all_receive_addresses.last().cloned() + // } + // } + // pub fn change_address(&mut self) -> Option { + // //TODO: limit to 10,000 total addresses and utxos for practical usability with bloom filters + // self.register_addresses_with_settings(RegisterAddressesSettings::GapLimitFunds(1, FundsDirection::Internal)) + // .ok() + // .and_then(|addresses| addresses.last().map(|(_, address)| address.clone())) + // } + + // pub fn contains_change_address(&self, address: &str) -> bool { + // self.all_change_addresses.contains(address) + // } + // pub fn contains_receive_address(&self, address: &str) -> bool { + // self.all_receive_addresses.contains(address) + // } + // + // pub fn used_receive_addresses(&self) -> Vec { + // self.all_receive_addresses.intersection(&self.base.used_addresses) + // .cloned() + // .collect() + // } + // pub fn used_change_addresses(&self) -> Vec { + // self.all_change_addresses.intersection(&self.base.used_addresses) + // .cloned() + // .collect() + // } + // + // pub fn should_use_reduced_gap_limit(&mut self) -> bool { + // if !self.checked_initial_has_known_balance { + // if let AccountKind::Account(AccountInfo { wallet_unique_id, .. }) = self.account_ref() { + // if let Ok(KeyChainValue::Int64(has_known_balance)) = self.base.keychain_ref().get(KeyChainKey::HasKnownBalanceUniqueIDString { reference: self.base.reference as u32, unique_id: wallet_unique_id.clone() }) { + // self.has_known_balance_internal = has_known_balance == 1; + // self.checked_initial_has_known_balance = true; + // } + // } + // } + // !self.has_known_balance_internal && !(self.is_for_first_account && self.base.reference == DerivationPathReference::BIP44) + // } + + // pub fn addresses_for_export(&self, internal_start: usize, internal_len: usize, external_start: usize, external_len: usize) -> Vec { + // let mut addresses = (internal_start..internal_start + internal_len) + // .into_iter() + // .filter_map(|index| { + // let index_path = IndexPath::index_path_with_indexes(vec![1, index as u32]); + // if let Ok(pub_key) = self.public_key_data_at_index_path(index_path) { + // ECDSAKey::address_from_public_key_data(&pub_key, self.base.chain_type.clone()) + // } else { + // None + // } + // }) + // .collect::>(); + // addresses.extend((external_start..external_start + external_len) + // .into_iter() + // .filter_map(|index| { + // let index_path = IndexPath::index_path_with_indexes(vec![0, index as u32]); + // if let Ok(pub_key) = self.public_key_data_at_index_path(index_path) { + // ECDSAKey::address_from_public_key_data(&pub_key, self.base.chain_type.clone()) + // } else { + // None + // } + // })); + // addresses + // } + + /// gets an address at an index path + // pub fn address_at_index(&self, index: u32, internal: bool) -> Result { + // let pub_key = self.public_key_data_at_index(index, internal)?; + // if let Some(address ) = ECDSAKey::address_from_public_key_data(&pub_key, self.base.chain_type.clone()) { + // Ok(address) + // } else { + // Err(KeyError::Any("Can't generate address from public key data".to_string())) + // } + // } + + // pub fn index_path_of_known_address(&self, address: &str) -> Option> { + // if let Some(index) = self.all_change_addresses.get_index_of(address) { + // Some(IndexPath::index_path_with_indexes(vec![1, index as u32])) + // } else if let Some(index) = self.all_receive_addresses.get_index_of(address) { + // Some(IndexPath::index_path_with_indexes(vec![0, index as u32])) + // } else { + // None + // } + // } + + + // pub fn public_key_data_at_index(&self, n: u32, internal: bool) -> Result, KeyError> { + // let path = IndexPath::new(vec![ if internal { 1 } else { 0 }, n]); + // self.base.public_key_data_at_index_path(path) + // } + // +// } + +#[derive(Clone)] +pub struct IncomingFunds { + // pub base: DerivationPathModel, + pub external_addresses: Vec<(u32, String)>, + pub contact_source_identity_unique_id: [u8; 32], + pub contact_destination_identity_unique_id: [u8; 32], +} + +// impl IncomingFunds { +// /// returns the first unused external address +// pub fn receive_address(&mut self) -> Option { +// self.receive_address_in_context(self.base.controller.context) +// } +// +// pub fn receive_address_in_context(&mut self, context: *const std::os::raw::c_void) -> Option { +// self.receive_address_at_offset_in_context(0, context) +// } +// +// pub fn receive_address_at_offset(&mut self, offset: usize) -> Option { +// self.receive_address_at_offset_in_context(offset, self.base.controller.context) +// } +// pub fn receive_address_at_offset_in_context(&mut self, offset: usize, context: *const std::os::raw::c_void) -> Option { +// //TODO: limit to 10,000 total addresses and utxos for practical usability with bloom filters +// if let Ok(addr) = self.register_addresses_with_settings_and_context(RegisterAddressesSettings::GapLimit(offset + 1), context) { +// addr.last().map(|(_, address)| address).cloned() +// } else { +// self.external_addresses.last().map(|(_, addr)| addr.clone()) +// } +// } +// } +// +// #[derive(Clone)] +// pub struct SimpleIndexed { +// pub base: DerivationPathModel, +// pub ordered_addresses: Vec<(u32, String)>, +// } +// +// impl KeychainAccessible for SimpleIndexed { +// fn keychain_ref(&self) -> &KeychainController { +// self.base.keychain_ref() +// } +// } +// +// impl DBAccessible for SimpleIndexed { +// fn db_ref(&self) -> &DBController { +// self.base.db_ref() +// } +// } + + + + +// pub trait SimpleIndexed { +// fn first_unused_index(&self) -> usize; +// fn addresses_to_index(&mut self, index: u32) -> Vec; +// fn addresses_to_index_using_cache(&mut self, index: u32, use_cache: bool, add_to_cache: bool) -> Vec; +// fn private_keys_for_range(&self, from: u32, len: u32, secret_source: SecretSource) -> Vec; +// fn private_keys_to_index(&self, index: u32, secret_source: SecretSource) -> Vec; +// fn address_at_index(&self, index: u32) -> Result; +// } + +// +// +// impl_simple_indexed!(Authentication); +// impl_simple_indexed!(MasternodeHoldings); +// impl_simple_indexed!(AssetSwap); +// +// impl RegisterAddressesWithSettings for Funds { +// fn register_addresses_with_settings(&mut self, settings: RegisterAddressesSettings) -> Result, DerivationError> { +// self.register_addresses_with_settings_and_context(settings, self.base.controller.context) +// } +// +// fn register_addresses_with_settings_and_context(&mut self, settings: RegisterAddressesSettings, context: *const std::os::raw::c_void) -> Result, DerivationError> { +// match settings { +// RegisterAddressesSettings::GapLimitFunds(gap_limit, direction) => { +// if !self.account_is_transient() { +// return Err(DerivationError::AddressesMustBeLoaded); +// } +// let mut ret = self.addresses(direction == FundsDirection::Internal); +// let mut i = ret.len(); +// +// // keep only the trailing contiguous block of addresses with no transactions +// while i > 0 && !self.base.address_is_used(&ret[i - 1].1) { +// i -= 1; +// } +// +// if i > 0 { +// ret.drain(..i); +// } +// if ret.len() >= gap_limit { +// ret.drain(gap_limit..); +// return Ok(ret); +// } +// +// if gap_limit > 1 { // get receiveAddress and changeAddress first to avoid blocking +// let _ = self.receive_address(); +// let _ = self.change_address(); +// } +// +// //It seems weird to repeat this, but it's correct because of the original call receive address and change address +// ret = self.addresses(direction == FundsDirection::Internal); +// i = ret.len(); +// +// let mut n = i as u32; +// +// // keep only the trailing contiguous block of addresses with no transactions +// while i > 0 && !self.base.address_is_used(&ret[i - 1].1) { +// i -= 1; +// } +// if i > 0 { +// ret.drain(..i); +// } +// if ret.len() >= gap_limit { +// ret.drain(gap_limit..); +// return Ok(ret); +// } +// let mut add_addresses = IndexMap::new(); +// while ret.len() < gap_limit { // generate new addresses up to gapLimit +// let pub_key = self.public_key_data_at_index(n, direction == FundsDirection::Internal).map_err(DerivationError::from)?; +// if let Some(addr) = ECDSAKey::address_from_public_key_data(&pub_key, self.base.chain_type.clone()) { +// self.base.all_addresses.insert(addr.clone()); +// if direction == FundsDirection::Internal { +// self.internal_addresses.push((n, addr.clone())); +// } else { +// self.external_addresses.push((n, addr.clone())); +// } +// ret.push((n, addr.clone())); +// add_addresses.insert(n, addr); +// n += 1; +// } else { +// print!("[{}] error generating keys", self.base.chain_type.name()); +// return Err(DerivationError::PublicKeyGeneration); +// } +// } +// +// if !self.account_is_transient() { +// self.db_ref().store_in_context(context, DerivationStorageContext::Addresses(add_addresses, direction)); +// } +// Ok(ret) +// } +// settings => Err(DerivationError::UnsupportedSettings(settings)) +// } +// } +// } +// impl AccountKindAccessible for IncomingFunds { +// fn account_ref(&self) -> &AccountKind { +// self.base.account_ref() +// } +// } +// impl DBAccessible for IncomingFunds { +// fn db_ref(&self) -> &DBController { +// self.base.db_ref() +// } +// } +// impl RegisterAddressesWithSettings for IncomingFunds { +// fn register_addresses_with_settings(&mut self, settings: RegisterAddressesSettings) -> Result, DerivationError> { +// self.register_addresses_with_settings_and_context(settings, self.base.controller.context) +// } +// +// fn register_addresses_with_settings_and_context(&mut self, settings: RegisterAddressesSettings, context: *const std::os::raw::c_void) -> Result, DerivationError> { +// match settings { +// RegisterAddressesSettings::GapLimit(gap_limit) => { +// if !self.account_is_transient() { +// if !self.base.controller.addresses_loaded { +// sleep(Duration::from_millis(1000)); //quite hacky, we need to fix this +// } +// if !self.base.controller.addresses_loaded { +// return Err(DerivationError::AddressesMustBeLoaded); +// } +// } +// let mut ret = Vec::from_iter(self.external_addresses.iter().cloned()); +// let mut i = ret.len(); +// // keep only the trailing contiguous block of addresses with no transactions +// while i > 0 && !self.base.address_is_used(&ret[i - 1].1) { +// i -= 1; +// } +// if i > 0 { +// ret.drain(..i); +// } +// if ret.len() >= gap_limit { +// ret.drain(gap_limit..); +// return Ok(ret); +// } +// if gap_limit > 1 { +// // get receiveAddress and changeAddress first to avoid blocking +// let _ = self.receive_address_in_context(context); +// } +// // It seems weird to repeat this, but it's correct because of the original call receive address and change address +// ret = Vec::from_iter(self.external_addresses.clone()); +// i = ret.len(); +// +// let mut n = i as u32; +// +// // keep only the trailing contiguous block of addresses with no transactions +// while i > 0 && !self.base.address_is_used(&ret[i - 1].1) { +// i -= 1; +// } +// +// if i > 0 { +// ret.drain(..i); +// } +// if ret.len() >= gap_limit { +// ret.drain(gap_limit..); +// return Ok(ret); +// } +// +// let mut upper_limit = gap_limit; +// while ret.len() < upper_limit { // generate new addresses up to gapLimit +// let pub_key = self.public_key_data_at_index_path(IndexPath::index_path_with_index(n))?; +// if let Some(address) = ECDSAKey::address_from_public_key_data(&pub_key, self.base.chain_type.clone()) { +// if !self.account_is_transient() { +// let is_used = self.base.store_new_address_in_context(address.as_str(), n, context); +// if is_used { +// self.base.used_addresses.insert(address.clone()); +// upper_limit += 1; +// } +// } +// self.base.all_addresses.insert(address.clone()); +// self.external_addresses.push((n , address.clone())); +// ret.push((n, address)); +// n += 1; +// +// } else { +// print!("[{}] error generating keys", self.base.chain_type.name()); +// return Err(DerivationError::PublicKeyGeneration); +// } +// } +// Ok(ret) +// }, +// settings => Err(DerivationError::UnsupportedSettings(settings)) +// } +// } +// } + +// impl AccountKindAccessible for SimpleIndexed { +// fn account_ref(&self) -> &AccountKind { +// self.base.account_ref() +// } +// } +// impl RegisterAddressesWithSettings for SimpleIndexed { +// fn register_addresses_with_settings(&mut self, settings: RegisterAddressesSettings) -> Result, DerivationError> { +// self.register_addresses_with_settings_and_context(settings, self.base.controller.context) +// } +// +// fn register_addresses_with_settings_and_context(&mut self, settings: RegisterAddressesSettings, context: *const std::os::raw::c_void) -> Result, DerivationError> { +// match settings { +// RegisterAddressesSettings::GapLimit(gap_limit) => { +// let mut ret = Vec::from_iter(self.ordered_addresses.clone()); +// if !self.account_is_transient() { +// if !self.base.controller.addresses_loaded { +// return Err(DerivationError::AddressesMustBeLoaded); +// } +// } +// let mut i = ret.len(); +// // keep only the trailing contiguous block of addresses that aren't used +// while i > 0 && !self.base.address_is_used(&ret[i - 1].1) { +// i -= 1; +// } +// if i > 0 { +// ret.drain(..i); +// } +// if ret.len() >= gap_limit { +// ret.drain(gap_limit..); +// return Ok(ret); +// } +// //It seems weird to repeat this, but it's correct because of the original call receive address and change address +// ret = Vec::from_iter(self.ordered_addresses.clone()); +// i = ret.len(); +// let mut n = i as u32; +// +// // keep only the trailing contiguous block of addresses with no transactions +// while i > 0 && !self.base.address_is_used(&ret[i - 1].1) { +// i -= 1; +// } +// if i > 0 { +// ret.drain(..i); +// } +// if ret.len() >= gap_limit { +// ret.drain(gap_limit..); +// Ok(ret) +// } else { +// while ret.len() < gap_limit { // generate new addresses up to gapLimit +// +// let pub_key = self.base.public_key_data_at_index_path(IndexPath::index_path_with_index(n))?; +// let addr = address::with_public_key_data(&pub_key, self.base.chain_type.clone()); +// if !self.account_is_transient() { +// self.base.store_new_address_in_context(&addr, n, context); +// } +// self.base.all_addresses.insert(addr.clone()); +// ret.push((n, addr.clone())); +// self.ordered_addresses.push((n, addr)); +// n += 1; +// } +// Ok(ret) +// } +// }, +// settings => Err(DerivationError::UnsupportedSettings(settings)) +// } +// } +// } +// impl AccountKindAccessible for Authentication { +// fn account_ref(&self) -> &AccountKind { +// self.base.account_ref() +// } +// } +// impl DBAccessible for Authentication { +// fn db_ref(&self) -> &DBController { +// self.base.db_ref() +// } +// } +// +// impl RegisterAddressesWithSettings for Authentication { +// fn register_addresses_with_settings(&mut self, settings: RegisterAddressesSettings) -> Result, DerivationError> { +// self.register_addresses_with_settings_and_context(settings, self.base.base.controller.context) +// } +// +// fn register_addresses_with_settings_and_context(&mut self, settings: RegisterAddressesSettings, context: *const std::os::raw::c_void) -> Result, DerivationError> { +// match settings { +// RegisterAddressesSettings::GapLimit(..) => +// self.base.register_addresses_with_settings_and_context(settings, context), +// RegisterAddressesSettings::GapLimitIdentity(gap_limit, identity_index) => { +// if !self.account_is_transient() { +// if !self.base.base.controller.addresses_loaded { +// return Err(DerivationError::AddressesMustBeLoaded); +// } +// assert_ne!(self.base.base.path_type, DerivationPathType::SINGLE_USER_AUTHENTICATION, "This should not be called for single user authentication. Use '- (NSArray *)registerAddressesWithGapLimit:(NSUInteger)gapLimit error:(NSError**)error' instead."); +// if self.use_hardened_keys && !self.has_extended_private_key() { +// return Ok(vec![]); +// } +// if self.addresses_by_identity.get(&identity_index).is_none() { +// self.addresses_by_identity.insert(identity_index, vec![]); +// } +// let mut ret = self.addresses_by_identity.get(&identity_index).cloned().unwrap(); +// let mut i = ret.len(); +// +// // keep only the trailing contiguous block of addresses with no transactions +// while i > 0 && !self.base.base.address_is_used(&ret[i - 1].1) { +// i -= 1; +// } +// if i > 0 { +// ret.drain(..i); +// } +// if ret.len() >= gap_limit { +// ret.drain(gap_limit..); +// return Ok(ret); +// } +// +// //It seems weird to repeat this, but it's correct because of the original call receive address and change address +// ret = self.addresses_by_identity.get(&identity_index).cloned().unwrap(); +// i = ret.len(); +// +// let mut n = i as u32; +// +// // keep only the trailing contiguous block of addresses with no transactions +// while i > 0 && !self.base.base.address_is_used(&ret[i - 1].1) { +// i -= 1; +// } +// if i > 0 { +// ret.drain(..i); +// } +// if ret.len() >= gap_limit { +// ret.drain(gap_limit..); +// return Ok(ret); +// } +// +// while ret.len() < gap_limit { +// // generate new addresses up to gapLimit +// let hardened_indexes = vec![identity_index | BIP32_HARD, n | BIP32_HARD]; +// let soft_indexes = vec![identity_index, n]; +// let indexes = if self.use_hardened_keys { hardened_indexes } else { soft_indexes }; +// let pub_key = self.base.base.public_key_data_at_index_path(IndexPath::new(indexes)).map_err(DerivationError::from)?; +// let addr = address::with_public_key_data(&pub_key, self.base.base.chain_type.clone()); +// if !self.account_is_transient() { +// self.db_ref().store_in_default_context(DerivationStorageContext::IndexedAddressIdentity(n, addr.clone(), identity_index)); +// } +// self.base.base.all_addresses.insert(addr.clone()); +// if let Some(addrs) = self.addresses_by_identity.get_mut(&identity_index) { +// addrs.push((n, addr.clone())); +// } +// ret.push((n, addr)); +// n += 1; +// } +// Ok(ret) +// } else { +// Ok(vec![]) +// } +// +// }, +// _ => Err(DerivationError::UnsupportedSettings(settings)) +// } +// } +// } + + +#[derive(Clone)] +pub struct AssetSwap { + pub ordered_addresses: Vec<(u32, String)>, + // pub base: SimpleIndexed, + +} + +#[derive(Clone)] +pub struct Authentication { + // pub base: SimpleIndexed, + pub ordered_addresses: Vec<(u32, String)>, + pub use_hardened_keys: bool, + pub should_store_extended_private_key: bool, + pub addresses_by_identity: IndexMap>, +} +// impl KeychainAccessible for DerivationPathModel { +// fn keychain_ref(&self) -> &KeychainController { +// self.controller.keychain_controller.as_ref() +// } +// } +// +// impl KeychainAccessible for Authentication { +// fn keychain_ref(&self) -> &KeychainController { +// self.base.keychain_ref() +// } +// } + +// impl Authentication { +// pub fn has_extended_private_key(&self) -> bool { +// if let AccountKind::Account(AccountInfo { wallet_unique_id, ..}) = self.account_ref() { +// if let Ok(true) = self.keychain_ref().has(KeyChainKey::wallet_based_extended_private_key_location_string(wallet_unique_id)) { +// return true; +// } +// } +// false +// } +// pub fn extended_private_key_data(&self) -> Option> { +// if let AccountKind::Account(AccountInfo { wallet_unique_id, ..}) = self.account_ref() { +// if let Ok(KeyChainValue::Bytes(data)) = self.keychain_ref().get(KeyChainKey::wallet_based_extended_private_key_location_string(wallet_unique_id)) { +// return Some(data); +// } +// } +// None +// } +// +// pub fn first_unused_public_key(&self) -> Result, KeyError> { +// let index_path = IndexPath::index_path_with_index(self.first_unused_index() as u32); +// self.public_key_data_at_index_path(index_path) +// } +// +// // +// pub fn first_unused_private_key_from_seed(&self, seed: &[u8]) -> Result { +// let index_path = IndexPath::index_path_with_index(self.first_unused_index() as u32); +// self.private_key_at_index_path(index_path, SecretSource::Seed(seed)) +// } +// } + +#[derive(Clone)] +pub struct MasternodeHoldings { + pub ordered_addresses: Vec<(u32, String)>, + // pub base: SimpleIndexed, +} + +#[derive(Clone)] +pub struct DBController { + pub context: *const std::os::raw::c_void, + pub store_in_context: Arc bool + Send + Sync>, + pub load_in_context: Arc Vec + Send + Sync>, +} +impl DBController { + pub fn new< + SC: Fn(*const std::os::raw::c_void, DerivationStorageContext) -> bool + Send + Sync + 'static, + LAC: Fn(*const std::os::raw::c_void, AccountKind) -> Vec + Send + Sync + 'static, + >(store_in_context: SC, load_in_context: LAC, context: *const std::os::raw::c_void) -> DBController { + Self { + context, + store_in_context: Arc::new(store_in_context), + load_in_context: Arc::new(load_in_context), + } + } +} + +impl DBController { + pub fn store_new_address(&self, address: &str, index: u32) -> bool { + (self.store_in_context)(self.context, DerivationStorageContext::IndexedAddress(index, address.to_string())) + } + pub fn store_new_address_in_context(&self, address: &str, index: u32, context: *const std::os::raw::c_void) -> bool { + (self.store_in_context)(context, DerivationStorageContext::IndexedAddress(index, address.to_string())) + } + + pub fn store_in_context(&self, context: *const std::os::raw::c_void, data: DerivationStorageContext) -> bool { + (self.store_in_context)(context, data) + } + pub fn store_in_default_context(&self, data: DerivationStorageContext) -> bool { + (self.store_in_context)(self.context, data) + } + + pub fn load_addresses_in_context(&self, context: *const std::os::raw::c_void, account_kind: AccountKind) -> Vec { + (self.load_in_context)(context, account_kind) + } + +} + +#[derive(Clone)] +pub struct DerivationPathController { + pub context: *const std::os::raw::c_void, + pub keychain_controller: Arc, + pub db_controller: Arc, + pub addresses_loaded: bool, +} +#[derive(Clone)] +pub struct DerivationPathModel { + pub chain_type: ChainType, + pub kind: DerivationPathKind, + // TODO: rust-dashcore hides the details of DerivationPath + pub path: DerivationPath, + pub path_type: DerivationPathType, + pub reference: DerivationPathReference, + pub signing_algorithm: KeyKind, + + pub account_kind: AccountKind, + + pub controller: DerivationPathController, + + pub all_addresses: IndexSet, + pub used_addresses: IndexSet, + /// master public key used to generate wallet addresses + pub extended_pub_key: Option, +} + +// impl AccountKindAccessible for DerivationPathModel { +// fn account_ref(&self) -> &AccountKind { +// &self.account_kind +// } +// } +// +// impl DBAccessible for DerivationPathModel { +// fn db_ref(&self) -> &DBController { +// self.controller.db_controller.as_ref() +// } +// } + +impl DerivationPathModel { + pub fn new< + SC: Fn(*const std::os::raw::c_void, DerivationStorageContext) -> bool + Send + Sync + 'static, + LAC: Fn(*const std::os::raw::c_void, AccountKind) -> Vec + Send + Sync + 'static, + >( + keychain_controller: Arc, + store_in_context: SC, + load_addresses_in_context: LAC, + account_kind: AccountKind, + kind: DerivationPathKind, + path_type: DerivationPathType, + path: DerivationPath, + reference: DerivationPathReference, + signing_algorithm: KeyKind, + context: *const std::os::raw::c_void, + chain_type: ChainType + ) -> Self { + Self { + chain_type, + kind, + path, + path_type, + reference, + signing_algorithm, + account_kind, + all_addresses: IndexSet::new(), + used_addresses: IndexSet::new(), + controller: DerivationPathController { + context, + keychain_controller, + db_controller: Arc::new(DBController::new(store_in_context, load_addresses_in_context, context)), + addresses_loaded: false, + }, + extended_pub_key: None, + } + } + + pub fn keychain_ref(&self) -> &KeychainController { + self.controller.keychain_controller.as_ref() + } + + pub fn db_ref(&self) -> &DBController { + self.controller.db_controller.as_ref() + } + fn account_is_transient(&self) -> bool { + self.account_kind.is_transient() + } + + pub fn extended_public_key_keychain_key(&self) -> KeyChainKey { + match &self.account_kind { + AccountKind::Standalone(StandaloneInfo { extended_public_key_identifier, .. }) => + KeyChainKey::standalone_extended_public_key_location_string(extended_public_key_identifier), + AccountKind::Account(AccountInfo { wallet_unique_id, .. }) => + KeyChainKey::wallet_based_extended_public_key_location_string(wallet_unique_id), + } + // if self.account_info.is_some() && (self.path.len() > 0 || self.reference == DerivationPathReference::Root) { + // KeyChainKey::WalletBasedExtendedPublicKeyLocationString { unique_id: self.unique_id.clone() } + // } else { + // KeyChainKey::StandaloneExtendedPublicKeyLocationString { extended_public_key_identifier: self.unique_id.clone() } + // } + } + pub fn extended_public_key(&self) -> Result { + if let Some(ext_pub_key) = &self.extended_pub_key { + Ok(ext_pub_key.clone()) + } else { + let key = self.extended_public_key_keychain_key(); + if let Ok(KeyChainValue::Bytes(data)) = self.controller.keychain_controller.get(key) { + self.signing_algorithm.key_with_extended_public_key_data(&data) + } else { + Err(KeyError::Any("Unable to get extended public key".to_string())) + } + } + } + pub fn has_extended_public_key(&self) -> bool { + if self.extended_pub_key.is_some() { + return true; + } + let key = self.extended_public_key_keychain_key(); + if let Ok(true) = self.controller.keychain_controller.has(key) { + true + } else { + false + } + } + + pub fn extended_public_key_data(&self) -> Result, KeyError> { + self.extended_public_key().and_then(|key| key.extended_public_key_data()) + } + + pub fn generate_extended_public_key_from_seed(&mut self, seed: &[u8], store_under_wallet_unique_id: Option, store_private_key: bool) -> Result { + if seed.is_empty() { + return Err(KeyError::EmptySecKey); + } + if self.path.len() == 0 && self.reference != DerivationPathReference::Root { + // there needs to be at least 1 length + return Err(KeyError::UnableToDerive); + } + let key = self.signing_algorithm.key_with_seed_data(seed) + .and_then(|seed_key| seed_key.private_derive_to_path(self))?; + self.extended_pub_key = Some(key.clone()); + if let Some(wallet_unique_id) = store_under_wallet_unique_id { + let pub_key_data = key.extended_public_key_data()?; + let _ = self.controller.keychain_controller.set(KeyChainKey::wallet_based_extended_public_key_location_string(wallet_unique_id.as_str()), KeyChainValue::Bytes(pub_key_data), false); + if store_private_key { + let prv_key_data = key.extended_private_key_data()?; + let _ = self.controller.keychain_controller.set(KeyChainKey::wallet_based_extended_private_key_location_string(wallet_unique_id.as_str()), KeyChainValue::Bytes(prv_key_data.to_vec()), true); + } + } + Ok(key) + } + + pub fn generate_extended_public_key_from_parent_derivation_path(&mut self, parent_derivation_path: &DerivationPathModel, store_under_wallet_unique_id: Option) -> Result { + if parent_derivation_path.signing_algorithm != self.signing_algorithm { + return Err(KeyError::Any("The signing algorithms must be the same".to_string())); + } + if self.path.len() <= parent_derivation_path.path.len() { + return Err(KeyError::Any("The length must be inferior to the parent derivation path length".to_string())); + } + let parent_ext_pub_key = parent_derivation_path.extended_public_key()?; + let last_parent_index = parent_derivation_path.path.len() - 1; + for i in 0..last_parent_index { + let parent_index = parent_derivation_path.path.index(i); + let index = self.path.index(i); + if parent_index != index { + return Err(KeyError::Any("This derivation path must start with elements of the parent derivation path".to_string())); + } + } + let child_key = parent_ext_pub_key.public_derive_to_path_with_offset(self, parent_derivation_path.path.len())?; + self.extended_pub_key = Some(child_key.clone()); + if let Some(wallet_unique_id) = store_under_wallet_unique_id { + let pub_key_data = child_key.extended_public_key_data()?; + let _ = self.keychain_ref().set(KeyChainKey::wallet_based_extended_public_key_location_string(wallet_unique_id.as_str()), KeyChainValue::Bytes(pub_key_data), false); + } + Ok(child_key) + } + + + pub fn private_key_at_index_path(&self, index_path: IndexPath, source: SecretSource) -> Result { + if self.path.is_empty() { + Err(KeyError::UnableToDerive) + } else { + match source { + SecretSource::Seed(seed) => { + let top_key = self.signing_algorithm.key_with_seed_data(seed)?; + let key = top_key.private_derive_to_path(self)?; + key.private_derive_to_path(&index_path) + } + SecretSource::ExtendedPrivateKeyData(data) => { + self.signing_algorithm.derive_key_from_extended_private_key_data_for_index_path_u32(data, index_path) + } + } + } + } + + + + pub fn store_new_address(&self, address: &str, index: u32) -> bool { + self.db_ref().store_new_address(address, index) + } + pub fn store_new_address_in_context(&self, address: &str, index: u32, context: *const std::os::raw::c_void) -> bool { + self.db_ref().store_new_address_in_context(address, index, context) + } + + /// true if the address is controlled by the wallet + pub fn contains_address(&self, address: &str) -> bool { + self.all_addresses.contains(address) + } + pub fn contains_address_hash(&self, hash: &[u8; 20]) -> bool { + let addr = from_hash160_for_script_map(hash, &self.chain_type.script_map()); + self.contains_address(&addr) + } + /// true if the address was previously used as an input or output in any wallet transaction + pub fn address_is_used(&self, address: &str) -> bool { + self.used_addresses.contains(address) + } + + pub fn address_at_index_path(&self, index_path: IndexPath) -> Result { + match &self.kind { + DerivationPathKind::Funds(_) => { + let pub_key = self.public_key_data_at_index_path(index_path)?; + if let Some(address ) = ECDSAKey::address_from_public_key_data(&pub_key, self.chain_type.clone()) { + Ok(address) + } else { + Err(KeyError::Any("Can't generate address from public key data".to_string())) + } + }, + _ => { + let pub_key = self.public_key_data_at_index_path(index_path)?; + Ok(address::with_public_key_data_and_script_pub_key(&pub_key, self.chain_type.script_map().pubkey)) + } + } + } + pub fn index_path_of_known_address(&self, address: &str) -> Option> { + match &self.kind { + DerivationPathKind::Funds(model) => if let Some(index) = model.all_change_addresses.get_index_of(address) { + Some(IndexPath::index_path_with_indexes(vec![1, index as u32])) + } else if let Some(index) = model.all_receive_addresses.get_index_of(address) { + Some(IndexPath::index_path_with_indexes(vec![0, index as u32])) + } else { + None + } + DerivationPathKind::IncomingFunds(model) => + model.external_addresses.iter() + .find_map(|(index, addr)| addr.eq(address) + .then_some(IndexPath::index_path_with_index(*index))), + DerivationPathKind::AssetSwap(AssetSwap { ordered_addresses, .. }) | + DerivationPathKind::Authentication(Authentication { ordered_addresses, .. }) | + DerivationPathKind::MasternodeHoldings(MasternodeHoldings { ordered_addresses, .. }) => + ordered_addresses.iter() + .find_map(|(index, addr)| addr.eq(address) + .then_some(IndexPath::index_path_with_index(*index))), + } + } + + /// inform the derivation path that the address has been used by a transaction, true if the derivation path contains the address + pub fn register_transaction_address(&mut self, address: &str) -> bool { + let contains = self.contains_address(address); + if contains && !self.address_is_used(address) { + self.used_addresses.insert(address.to_string()); + let _addresses = match &mut self.kind { + DerivationPathKind::Funds(model) if model.all_change_addresses.contains(address) => + self.register_addresses_with_settings(RegisterAddressesSettings::GapLimitFunds(SEQUENCE_GAP_LIMIT_INTERNAL, FundsDirection::Internal)), + DerivationPathKind::Funds(..) => + self.register_addresses_with_settings(RegisterAddressesSettings::GapLimitFunds(SEQUENCE_GAP_LIMIT_EXTERNAL, FundsDirection::External)), + DerivationPathKind::IncomingFunds(..) => + self.register_addresses_with_settings(RegisterAddressesSettings::GapLimit(SEQUENCE_GAP_LIMIT_EXTERNAL)), + DerivationPathKind::AssetSwap(..) => + self.register_addresses_with_settings(RegisterAddressesSettings::GapLimit(SEQUENCE_GAP_LIMIT_INTERNAL)), + DerivationPathKind::Authentication(..) => + self.register_addresses_with_settings(RegisterAddressesSettings::GapLimit(SEQUENCE_GAP_LIMIT_EXTERNAL)), + DerivationPathKind::MasternodeHoldings(..) => + self.register_addresses_with_settings(RegisterAddressesSettings::GapLimit(SEQUENCE_GAP_LIMIT_INTERNAL)), + }; + } + contains + } + pub fn load_addresses_in_context(&self, context: *const std::os::raw::c_void) -> Vec { + self.db_ref().load_addresses_in_context(context, self.account_kind.clone()) + } + pub fn load_addresses(&mut self) { + if self.controller.addresses_loaded { return } + let addresses = self.load_addresses_in_context(self.controller.context); + + match &mut self.kind { + DerivationPathKind::Funds(model) => { + for AddressInfo { internal, address, index, is_used, ..} in addresses { + if !is_valid_dash_address_for_script_map(&address, &self.chain_type.script_map()) { + #[cfg(debug_assertions)] + println!("{} address %@ loaded but was not valid on chain {}", self.chain_type.name(), address); + #[cfg(not(debug_assertions))] + println!("{} address %@ loaded but was not valid on chain ", self.chain_type.name()); + continue; + } + let container = if internal.unwrap() { &mut model.internal_addresses } else { &mut model.external_addresses }; + container.push((index, address.clone())); + self.all_addresses.insert(address.clone()); + if is_used { + self.used_addresses.insert(address.clone()); + } + } + + self.controller.addresses_loaded = true; + let reduced_gap_limit = self.should_use_reduced_gap_limit(); + let gap_limit = if reduced_gap_limit { SEQUENCE_UNUSED_GAP_LIMIT_INITIAL } else { SEQUENCE_GAP_LIMIT_INITIAL }; + let _ = self.register_addresses_with_settings_and_context(RegisterAddressesSettings::GapLimitFunds(gap_limit, FundsDirection::Internal), self.controller.context); + let _ = self.register_addresses_with_settings_and_context(RegisterAddressesSettings::GapLimitFunds(gap_limit, FundsDirection::External), self.controller.context); + }, + DerivationPathKind::IncomingFunds(model) => { + for AddressInfo { address, index, is_used, ..} in addresses { + if !is_valid_dash_address_for_script_map(&address, &self.chain_type.script_map()) { + #[cfg(debug_assertions)] + println!("{} address %@ loaded but was not valid on chain {}", self.chain_type.name(), address); + #[cfg(not(debug_assertions))] + println!("{} address %@ loaded but was not valid on chain ", self.chain_type.name()); + continue; + } + model.external_addresses.push((index, address.clone())); + self.all_addresses.insert(address.clone()); + if is_used { + self.used_addresses.insert(address.clone()); + } + } + self.controller.addresses_loaded = true; + let _ = self.register_addresses_with_settings_and_context(RegisterAddressesSettings::GapLimit(SEQUENCE_DASHPAY_GAP_LIMIT_INITIAL), self.controller.context); + }, + DerivationPathKind::Authentication(..) => { + self.controller.addresses_loaded = true; + let _ = self.register_addresses_with_settings(if self.path_type == DerivationPathType::SINGLE_USER_AUTHENTICATION { + RegisterAddressesSettings::GapLimit(10) + } else { + RegisterAddressesSettings::GapLimitIdentity(10, 0) + }); + }, + DerivationPathKind::AssetSwap(..) | + DerivationPathKind::MasternodeHoldings(..) => { + self.controller.addresses_loaded = true; + let _ = self.register_addresses_with_settings(RegisterAddressesSettings::GapLimit(10)); + }, + } + } + + pub fn create_identifier_for_derivation_path(&self) -> Result { + let extended_public_key = self.extended_public_key()?; + let identifier = extended_public_key.create_identifier()?; + let hex = identifier.to_lower_hex_string(); + Ok(hex[..7].to_string()) + } + + pub fn receive_address(&mut self) -> Option { + match &self.kind { + DerivationPathKind::Funds(model) => { + //TODO: limit to 10,000 total addresses and utxos for practical usability with bloom filters + if let Ok(addr) = self.register_addresses_with_settings(RegisterAddressesSettings::GapLimitFunds(1, FundsDirection::External)) { + addr.last().map(|(_, address)| address.clone()) + } else { + model.all_receive_addresses.last().cloned() + } + } + DerivationPathKind::IncomingFunds(_) => self.receive_address_in_context(self.controller.context), + _ => None + } + } + pub fn change_address(&mut self) -> Option { + //TODO: limit to 10,000 total addresses and utxos for practical usability with bloom filters + match &self.kind { + DerivationPathKind::Funds(..) => { + self.register_addresses_with_settings(RegisterAddressesSettings::GapLimitFunds(1, FundsDirection::Internal)) + .ok() + .and_then(|addresses| addresses.last().map(|(_, address)| address.clone())) + }, + _ => None + } + } + + pub fn contains_change_address(&self, address: &str) -> bool { + if let DerivationPathKind::Funds(model) = &self.kind { + model.all_change_addresses.contains(address) + } else { + false + } + } + pub fn contains_receive_address(&self, address: &str) -> bool { + if let DerivationPathKind::Funds(model) = &self.kind { + model.all_receive_addresses.contains(address) + } else { + false + } + } + + pub fn used_receive_addresses(&self) -> Vec { + if let DerivationPathKind::Funds(model) = &self.kind { + model.all_receive_addresses.intersection(&self.used_addresses) + .cloned() + .collect() + } else { + vec![] + } + } + pub fn used_change_addresses(&self) -> Vec { + if let DerivationPathKind::Funds(model) = &self.kind { + model.all_change_addresses.intersection(&self.used_addresses) + .cloned() + .collect() + } else { + vec![] + } + } + + pub fn should_use_reduced_gap_limit(&mut self) -> bool { + if let DerivationPathKind::Funds(model) = &mut self.kind { + if !model.checked_initial_has_known_balance { + if let AccountKind::Account(AccountInfo { wallet_unique_id, .. }) = &self.account_kind { + if let Ok(KeyChainValue::Int64(has_known_balance)) = self.keychain_ref().get(KeyChainKey::HasKnownBalanceUniqueIDString { reference: self.reference as u32, unique_id: wallet_unique_id.clone() }) { + model.has_known_balance_internal = has_known_balance == 1; + model.checked_initial_has_known_balance = true; + } + } + } + !model.has_known_balance_internal && !(model.is_for_first_account && self.reference == DerivationPathReference::BIP44) + } else { + panic!(""); + } + } + pub fn addresses_for_export(&self, internal_start: usize, internal_len: usize, external_start: usize, external_len: usize) -> Vec { + match &self.kind { + DerivationPathKind::Funds(..) => { + let mut addresses = (internal_start..internal_start + internal_len) + .into_iter() + .filter_map(|index| { + let index_path = IndexPath::index_path_with_indexes(vec![1, index as u32]); + if let Ok(pub_key) = self.public_key_data_at_index_path(index_path) { + ECDSAKey::address_from_public_key_data(&pub_key, self.chain_type.clone()) + } else { + None + } + }) + .collect::>(); + addresses.extend((external_start..external_start + external_len) + .into_iter() + .filter_map(|index| { + let index_path = IndexPath::index_path_with_indexes(vec![0, index as u32]); + if let Ok(pub_key) = self.public_key_data_at_index_path(index_path) { + ECDSAKey::address_from_public_key_data(&pub_key, self.chain_type.clone()) + } else { + None + } + })); + addresses + }, + _ => vec![] + } + } + + pub fn receive_address_in_context(&mut self, context: *const std::os::raw::c_void) -> Option { + self.receive_address_at_offset_in_context(0, context) + } + + pub fn receive_address_at_offset(&mut self, offset: usize) -> Option { + self.receive_address_at_offset_in_context(offset, self.controller.context) + } + pub fn receive_address_at_offset_in_context(&mut self, offset: usize, context: *const std::os::raw::c_void) -> Option { + match &self.kind { + DerivationPathKind::Funds(_) => None, + DerivationPathKind::IncomingFunds(model) => { + //TODO: limit to 10,000 total addresses and utxos for practical usability with bloom filters + if let Ok(addr) = self.register_addresses_with_settings_and_context(RegisterAddressesSettings::GapLimit(offset + 1), context) { + addr.last().map(|(_, address)| address).cloned() + } else { + model.external_addresses.last().map(|(_, addr)| addr.clone()) + } + }, + _ => None, + } + } + + + pub fn has_extended_private_key(&self) -> bool { + if let DerivationPathKind::Authentication(..) = &self.kind { + if let AccountKind::Account(AccountInfo { wallet_unique_id, ..}) = &self.account_kind { + if let Ok(true) = self.keychain_ref().has(KeyChainKey::wallet_based_extended_private_key_location_string(wallet_unique_id)) { + return true; + } + } + } + false + } + pub fn extended_private_key_data(&self) -> Option> { + if let DerivationPathKind::Authentication(..) = &self.kind { + if let AccountKind::Account(AccountInfo { wallet_unique_id, ..}) = &self.account_kind { + if let Ok(KeyChainValue::Bytes(data)) = self.keychain_ref().get(KeyChainKey::wallet_based_extended_private_key_location_string(wallet_unique_id)) { + return Some(data); + } + } + } + None + } + + pub fn first_unused_public_key(&self) -> Result, KeyError> { + if let DerivationPathKind::Authentication(..) = &self.kind { + let index_path = IndexPath::index_path_with_index(self.first_unused_index() as u32); + self.public_key_data_at_index_path(index_path) + } else { + Err(KeyError::Any("Unsupported".to_string())) + } + } + + // + pub fn first_unused_private_key_from_seed(&self, seed: &[u8]) -> Result { + if let DerivationPathKind::Authentication(..) = &self.kind { + let index_path = IndexPath::index_path_with_index(self.first_unused_index() as u32); + self.private_key_at_index_path(index_path, SecretSource::Seed(seed)) + } else { + Err(KeyError::Any("Unsupported".to_string())) + } + } + + pub fn first_unused_index(&self) -> usize { + match &self.kind { + DerivationPathKind::AssetSwap(AssetSwap { ordered_addresses, .. }) | + DerivationPathKind::Authentication(Authentication { ordered_addresses, .. }) | + DerivationPathKind::MasternodeHoldings(MasternodeHoldings { ordered_addresses, .. }) => { + let mut i = ordered_addresses.len(); + // keep only the trailing contiguous block of addresses that aren't used + while i > 0 && !self.address_is_used(&ordered_addresses[i - 1].1) { + i -= 1; + } + i + } + _ => 0 + } + } + + + pub fn addresses_to_index(&mut self, index: u32) -> Vec { + self.addresses_to_index_using_cache(index, false, false) + } + + pub fn addresses_to_index_using_cache(&mut self, index: u32, use_cache: bool, add_to_cache: bool) -> Vec { + match &mut self.kind { + DerivationPathKind::AssetSwap(AssetSwap { ordered_addresses, .. }) | + DerivationPathKind::Authentication(Authentication { ordered_addresses, .. }) | + DerivationPathKind::MasternodeHoldings(MasternodeHoldings { ordered_addresses, .. }) => { + let mut addresses = vec![]; + for i in 0..index { + match ordered_addresses.iter().find_map(|(id, addr)| (*id == i).then_some(addr)) { + Some(address) if use_cache && ordered_addresses.len() > i as usize => { + addresses.push(address.clone()); + }, + _ => match self.public_key_data_at_index_path(IndexPath::index_path_with_index(i)) { + Ok(pub_key) => { + let addr = address::with_public_key_data(&pub_key, self.chain_type.clone()); + addresses.push(addr.clone()); + if add_to_cache && ordered_addresses.len() == i as usize { + ordered_addresses.push((i, addr)); + } + }, + Err(err) => { + println!("Error getting public key data at index {i}: {err}"); + return addresses; + } + } + } + } + addresses + }, + _ => vec![] + } + } + + pub fn private_keys_for_range(&self, from: u32, len: u32, secret_source: SecretSource) -> Vec { + (from..from + len).into_iter() + .map(IndexPath::index_path_with_index) + .filter_map(|index_path| self.private_key_at_index_path(index_path, secret_source.clone()).ok()) + .collect() + } + + pub fn private_keys_to_index(&self, index: u32, secret_source: SecretSource) -> Vec { + self.private_keys_for_range(0, index, secret_source) + } + +} + +/// Wallets are composed of chains of addresses. Each chain is traversed until a gap of a certain number of addresses is +/// found that haven't been used in any transactions. This method returns an array of unused addresses +/// following the last used address in the chain. The internal chain is used for change addresses and the external chain +/// for receive addresses. +impl RegisterAddressesWithSettings for DerivationPathModel { + fn register_addresses_with_settings(&mut self, settings: RegisterAddressesSettings) -> Result, DerivationError> { + self.register_addresses_with_settings_and_context(settings, self.controller.context) + } + + fn register_addresses_with_settings_and_context(&mut self, settings: RegisterAddressesSettings, context: *const std::os::raw::c_void) -> Result, DerivationError> { + match (settings, &mut self.kind) { + (RegisterAddressesSettings::GapLimitFunds(gap_limit, direction), + DerivationPathKind::Funds(model)) => { + if !self.account_is_transient() { + return Err(DerivationError::AddressesMustBeLoaded); + } + let mut ret = Vec::from_iter(if direction == FundsDirection::Internal { + model.internal_addresses.iter().cloned() + } else { + model.external_addresses.iter().cloned() + }); + + let mut i = ret.len(); + + // keep only the trailing contiguous block of addresses with no transactions + while i > 0 && !self.address_is_used(&ret[i - 1].1) { + i -= 1; + } + + if i > 0 { + ret.drain(..i); + } + if ret.len() >= gap_limit { + ret.drain(gap_limit..); + return Ok(ret); + } + + if gap_limit > 1 { // get receiveAddress and changeAddress first to avoid blocking + let _ = self.receive_address(); + let _ = self.change_address(); + } + + //It seems weird to repeat this, but it's correct because of the original call receive address and change address + ret = Vec::from_iter(if direction == FundsDirection::Internal { + model.internal_addresses.iter().cloned() + } else { + model.external_addresses.iter().cloned() + }); + i = ret.len(); + + let mut n = i as u32; + + // keep only the trailing contiguous block of addresses with no transactions + while i > 0 && !self.address_is_used(&ret[i - 1].1) { + i -= 1; + } + if i > 0 { + ret.drain(..i); + } + if ret.len() >= gap_limit { + ret.drain(gap_limit..); + return Ok(ret); + } + let mut add_addresses = IndexMap::new(); + while ret.len() < gap_limit { // generate new addresses up to gapLimit + let index_path = IndexPath::index_path_with_indexes(vec![ if direction == FundsDirection::Internal { 1 } else { 0 }, n]); + let pub_key = self.public_key_data_at_index_path(index_path).map_err(DerivationError::from)?; + if let Some(addr) = ECDSAKey::address_from_public_key_data(&pub_key, self.chain_type.clone()) { + self.all_addresses.insert(addr.clone()); + if direction == FundsDirection::Internal { + model.internal_addresses.push((n, addr.clone())); + } else { + model.external_addresses.push((n, addr.clone())); + } + ret.push((n, addr.clone())); + add_addresses.insert(n, addr); + n += 1; + } else { + print!("[{}] error generating keys", self.chain_type.name()); + return Err(DerivationError::PublicKeyGeneration); + } + } + + if !self.account_is_transient() { + self.db_ref().store_in_context(context, DerivationStorageContext::Addresses(add_addresses, direction)); + } + Ok(ret) + + } + (RegisterAddressesSettings::GapLimit(gap_limit), + DerivationPathKind::IncomingFunds(model)) => { + if !self.account_is_transient() { + if !self.controller.addresses_loaded { + sleep(Duration::from_millis(1000)); //quite hacky, we need to fix this + } + if !self.controller.addresses_loaded { + return Err(DerivationError::AddressesMustBeLoaded); + } + } + let mut ret = Vec::from_iter(model.external_addresses.iter().cloned()); + let mut i = ret.len(); + // keep only the trailing contiguous block of addresses with no transactions + while i > 0 && !self.address_is_used(&ret[i - 1].1) { + i -= 1; + } + if i > 0 { + ret.drain(..i); + } + if ret.len() >= gap_limit { + ret.drain(gap_limit..); + return Ok(ret); + } + if gap_limit > 1 { + // get receiveAddress and changeAddress first to avoid blocking + let _ = self.receive_address_in_context(context); + } + // It seems weird to repeat this, but it's correct because of the original call receive address and change address + ret = Vec::from_iter(model.external_addresses.clone()); + i = ret.len(); + + let mut n = i as u32; + + // keep only the trailing contiguous block of addresses with no transactions + while i > 0 && !self.address_is_used(&ret[i - 1].1) { + i -= 1; + } + + if i > 0 { + ret.drain(..i); + } + if ret.len() >= gap_limit { + ret.drain(gap_limit..); + return Ok(ret); + } + + let mut upper_limit = gap_limit; + while ret.len() < upper_limit { // generate new addresses up to gapLimit + let pub_key = self.public_key_data_at_index_path(IndexPath::index_path_with_index(n))?; + if let Some(address) = ECDSAKey::address_from_public_key_data(&pub_key, self.chain_type.clone()) { + if !self.account_is_transient() { + let is_used = self.store_new_address_in_context(address.as_str(), n, context); + if is_used { + self.used_addresses.insert(address.clone()); + upper_limit += 1; + } + } + self.all_addresses.insert(address.clone()); + model.external_addresses.push((n , address.clone())); + ret.push((n, address)); + n += 1; + + } else { + print!("[{}] error generating keys", self.chain_type.name()); + return Err(DerivationError::PublicKeyGeneration); + } + } + Ok(ret) + } + (RegisterAddressesSettings::GapLimit(gap_limit), + DerivationPathKind::AssetSwap(AssetSwap { ordered_addresses, .. }) | + DerivationPathKind::MasternodeHoldings(MasternodeHoldings { ordered_addresses, .. }) | + DerivationPathKind::Authentication(Authentication { ordered_addresses, .. })) => { + let mut ret = Vec::from_iter(ordered_addresses.clone()); + if !self.account_is_transient() { + if !self.controller.addresses_loaded { + return Err(DerivationError::AddressesMustBeLoaded); + } + } + let mut i = ret.len(); + // keep only the trailing contiguous block of addresses that aren't used + while i > 0 && !self.address_is_used(&ret[i - 1].1) { + i -= 1; + } + if i > 0 { + ret.drain(..i); + } + if ret.len() >= gap_limit { + ret.drain(gap_limit..); + return Ok(ret); + } + //It seems weird to repeat this, but it's correct because of the original call receive address and change address + ret = Vec::from_iter(ordered_addresses.clone()); + i = ret.len(); + let mut n = i as u32; + + // keep only the trailing contiguous block of addresses with no transactions + while i > 0 && !self.address_is_used(&ret[i - 1].1) { + i -= 1; + } + if i > 0 { + ret.drain(..i); + } + if ret.len() >= gap_limit { + ret.drain(gap_limit..); + Ok(ret) + } else { + while ret.len() < gap_limit { // generate new addresses up to gapLimit + + let pub_key = self.public_key_data_at_index_path(IndexPath::index_path_with_index(n))?; + let addr = address::with_public_key_data(&pub_key, self.chain_type.clone()); + if !self.account_is_transient() { + self.store_new_address_in_context(&addr, n, context); + } + self.all_addresses.insert(addr.clone()); + ret.push((n, addr.clone())); + ordered_addresses.push((n, addr)); + n += 1; + } + Ok(ret) + } + } + (RegisterAddressesSettings::GapLimitIdentity(gap_limit, identity_index), + DerivationPathKind::Authentication(model)) => { + if !self.account_is_transient() { + if !self.controller.addresses_loaded { + return Err(DerivationError::AddressesMustBeLoaded); + } + assert_ne!(self.path_type, DerivationPathType::SINGLE_USER_AUTHENTICATION, "This should not be called for single user authentication. Use 'RegisterAddressesSettings::GapLimit(..)' instead."); + if model.use_hardened_keys && !self.has_extended_private_key() { + return Ok(vec![]); + } + if model.addresses_by_identity.get(&identity_index).is_none() { + model.addresses_by_identity.insert(identity_index, vec![]); + } + let mut ret = model.addresses_by_identity.get(&identity_index).cloned().unwrap(); + let mut i = ret.len(); + + // keep only the trailing contiguous block of addresses with no transactions + while i > 0 && !self.address_is_used(&ret[i - 1].1) { + i -= 1; + } + if i > 0 { + ret.drain(..i); + } + if ret.len() >= gap_limit { + ret.drain(gap_limit..); + return Ok(ret); + } + + //It seems weird to repeat this, but it's correct because of the original call receive address and change address + ret = model.addresses_by_identity.get(&identity_index).cloned().unwrap(); + i = ret.len(); + + let mut n = i as u32; + + // keep only the trailing contiguous block of addresses with no transactions + while i > 0 && !self.address_is_used(&ret[i - 1].1) { + i -= 1; + } + if i > 0 { + ret.drain(..i); + } + if ret.len() >= gap_limit { + ret.drain(gap_limit..); + return Ok(ret); + } + + while ret.len() < gap_limit { + // generate new addresses up to gapLimit + let hardened_indexes = vec![identity_index | BIP32_HARD, n | BIP32_HARD]; + let soft_indexes = vec![identity_index, n]; + let indexes = if model.use_hardened_keys { hardened_indexes } else { soft_indexes }; + let pub_key = self.public_key_data_at_index_path(IndexPath::new(indexes)).map_err(DerivationError::from)?; + let addr = address::with_public_key_data(&pub_key, self.chain_type.clone()); + if !self.account_is_transient() { + self.db_ref().store_in_default_context(DerivationStorageContext::IndexedAddressIdentity(n, addr.clone(), identity_index)); + } + self.all_addresses.insert(addr.clone()); + if let Some(addrs) = model.addresses_by_identity.get_mut(&identity_index) { + addrs.push((n, addr.clone())); + } + ret.push((n, addr)); + n += 1; + } + Ok(ret) + } else { + Ok(vec![]) + } + }, + (settings, _) => Err(DerivationError::UnsupportedSettings(settings)) + } + } +} + +impl KeyDataAtIndexPath for DerivationPathModel { + fn private_key_at_index_path(&self, index_path: IndexPath, source: SecretSource) -> Result { + if self.path.is_empty() { + Err(KeyError::UnableToDerive) + } else { + match source { + SecretSource::Seed(seed) => { + let top_key = self.signing_algorithm.key_with_seed_data(seed)?; + let key = top_key.private_derive_to_path(self)?; + key.private_derive_to_path(&index_path) + } + SecretSource::ExtendedPrivateKeyData(data) => { + self.signing_algorithm.derive_key_from_extended_private_key_data_for_index_path_u32(data, index_path) + } + } + } + + } + + fn public_key_at_index_path(&self, index_path: IndexPath) -> Result { + let data = self.public_key_data_at_index_path(index_path)?; + self.signing_algorithm.key_with_public_key_data(&data) + } + + fn public_key_data_at_index_path(&self, index_path: IndexPath) -> Result, KeyError> { + match &self.kind { + DerivationPathKind::Authentication(..) => { + let mut has_hardened_derivation = false; + for i in 0..index_path.length() { + let derivation = index_path.index_at_position(i); + has_hardened_derivation |= derivation & BIP32_HARD > 0; + if has_hardened_derivation { + break; + } + } + if has_hardened_derivation || self.reference == DerivationPathReference::ProviderPlatformNodeKeys { + if let Some(ext_prv_key_data) = self.extended_private_key_data() { + let prv_key = self.private_key_at_index_path(index_path, SecretSource::ExtendedPrivateKeyData(&ext_prv_key_data))?; + Ok(prv_key.public_key_data()) + } else { + Err(KeyError::Any("Keychain doesn't have an extended private key".to_string())) + } + } else { + self.extended_public_key() + .and_then(|key| key.public_key_data_at_index_path_u32(index_path)) + } + } + + _ => { + self.extended_public_key() + .and_then(|key| key.public_key_data_at_index_path_u32(index_path)) + } + } + } +} + +// impl KeyDataAtIndexPath for SimpleIndexed { +// fn private_key_at_index_path(&self, index_path: IndexPath, source: SecretSource) -> Result { +// self.base.private_key_at_index_path(index_path, source) +// } +// +// fn public_key_at_index_path(&self, index_path: IndexPath) -> Result { +// self.base.public_key_at_index_path(index_path) +// } +// +// fn public_key_data_at_index_path(&self, index_path: IndexPath) -> Result, KeyError> { +// self.base.public_key_data_at_index_path(index_path) +// } +// } +// +// impl KeyDataAtIndexPath for Authentication { +// fn private_key_at_index_path(&self, index_path: IndexPath, source: SecretSource) -> Result { +// self.base.private_key_at_index_path(index_path, source) +// } +// +// fn public_key_at_index_path(&self, index_path: IndexPath) -> Result { +// self.base.public_key_at_index_path(index_path) +// } +// +// fn public_key_data_at_index_path(&self, index_path: IndexPath) -> Result, KeyError> { +// self.base.public_key_data_at_index_path(index_path) +// } +// } +// +// impl KeyDataAtIndexPath for Funds { +// fn private_key_at_index_path(&self, index_path: IndexPath, source: SecretSource) -> Result { +// self.base.private_key_at_index_path(index_path, source) +// } +// +// fn public_key_at_index_path(&self, index_path: IndexPath) -> Result { +// self.base.public_key_at_index_path(index_path) +// } +// +// fn public_key_data_at_index_path(&self, index_path: IndexPath) -> Result, KeyError> { +// self.base.public_key_data_at_index_path(index_path) +// } +// } +// +// impl KeyDataAtIndexPath for IncomingFunds { +// fn private_key_at_index_path(&self, index_path: IndexPath, source: SecretSource) -> Result { +// self.base.private_key_at_index_path(index_path, source) +// } +// +// fn public_key_at_index_path(&self, index_path: IndexPath) -> Result { +// self.base.public_key_at_index_path(index_path) +// } +// +// fn public_key_data_at_index_path(&self, index_path: IndexPath) -> Result, KeyError> { +// self.base.public_key_data_at_index_path(index_path) +// } +// } + +// impl From for IndexPath<[u8; 32]> { +// fn from(value: DerivationPath) -> Self { +// value.de +// } +// } + +#[cfg(test)] +mod tests { + use dashcore::hashes::hex::FromHex; + // use dash_spv_keychain::KeychainController; + // use crate::derivation::derivation_path::DerivationPathModel; + + #[test] + pub fn test_address_registration() { + let seed = Vec::from_hex("467c2dd58bbd29427fb3c5467eee339021a87b21309eeabfe9459d31eeb6eba9b2a1213c12a173118c84fd49e8b4bf9282272d67bf7b7b394b088eab53b438bc").unwrap(); + // KeychainController::new(|| ) + // DerivationPathModel::new() + } +} diff --git a/dash-spv-crypto/src/derivation/factory.rs b/dash-spv-crypto/src/derivation/factory.rs new file mode 100644 index 00000000..075e5695 --- /dev/null +++ b/dash-spv-crypto/src/derivation/factory.rs @@ -0,0 +1,27 @@ +use std::collections::HashMap; +use dashcore::bip32::DerivationPath; + +pub struct Factory { + pub voting_key_derivation_path_by_wallet: HashMap, + pub owner_key_derivation_path_by_wallet: HashMap, + pub operator_key_derivation_path_by_wallet: HashMap, + pub evonode_key_derivation_path_by_wallet: HashMap, + pub provider_funds_key_derivation_path_by_wallet: HashMap, + pub identity_registration_funding_key_derivation_path_by_wallet: HashMap, + pub identity_topup_funding_key_derivation_path_by_wallet: HashMap, + pub identity_invitation_funding_key_derivation_path_by_wallet: HashMap, + pub identity_bls_derivation_path_by_wallet: HashMap, + pub identity_ecdsa_derivation_path_by_wallet: HashMap, + + // @property (nonatomic, strong) NSMutableDictionary *votingKeysDerivationPathByWallet; + // @property (nonatomic, strong) NSMutableDictionary *ownerKeysDerivationPathByWallet; + // @property (nonatomic, strong) NSMutableDictionary *operatorKeysDerivationPathByWallet; + // @property (nonatomic, strong) NSMutableDictionary *platformNodeKeysDerivationPathByWallet; + // @property (nonatomic, strong) NSMutableDictionary *providerFundsDerivationPathByWallet; + // @property (nonatomic, strong) NSMutableDictionary *blockchainIdentityRegistrationFundingDerivationPathByWallet; + // @property (nonatomic, strong) NSMutableDictionary *blockchainIdentityTopupFundingDerivationPathByWallet; + // @property (nonatomic, strong) NSMutableDictionary *blockchainIdentityInvitationFundingDerivationPathByWallet; + // @property (nonatomic, strong) NSMutableDictionary *blockchainIdentityBLSDerivationPathByWallet; + // @property (nonatomic, strong) NSMutableDictionary *blockchainIdentityECDSADerivationPathByWallet; +} + diff --git a/dash-spv-masternode-processor/src/chain/derivation/index_path.rs b/dash-spv-crypto/src/derivation/index_path.rs similarity index 72% rename from dash-spv-masternode-processor/src/chain/derivation/index_path.rs rename to dash-spv-crypto/src/derivation/index_path.rs index 4fb43eac..46fc1986 100644 --- a/dash-spv-masternode-processor/src/chain/derivation/index_path.rs +++ b/dash-spv-crypto/src/derivation/index_path.rs @@ -1,10 +1,6 @@ -use std::fmt::{Debug, Display}; -use std::os::raw::c_ulong; -use std::slice; -use byte::{BytesExt, LE, TryRead}; -use crate::consensus::Encodable; +use std::fmt::Debug; +use dashcore::consensus::Encodable; use crate::crypto::byte_util::clone_into_array; -use crate::crypto::UInt256; use super::BIP32_HARD; pub trait Extremum { @@ -21,12 +17,12 @@ impl Extremum for u32 { } } -impl Extremum for UInt256 { +impl Extremum for [u8; 32] { fn max() -> Self { - UInt256::MAX + [!0; 32] } fn min() -> Self { - UInt256::MIN + [0; 32] } } @@ -52,16 +48,16 @@ impl IndexHardSoft for u32 { } } -impl IndexHardSoft for UInt256 { +impl IndexHardSoft for [u8; 32] { fn harden(&self) -> Self { let mut v = [0u8; 32]; for i in 0..8 { let start = i << 2; let end = start + 4; - let hard = u32::from_le_bytes(clone_into_array(&self.0[start..end])) | BIP32_HARD; + let hard = u32::from_le_bytes(clone_into_array(&self[start..end])) | BIP32_HARD; v[start..end].copy_from_slice(&hard.to_le_bytes()) } - UInt256(v) + v } fn soften(&self) -> Self { @@ -69,23 +65,23 @@ impl IndexHardSoft for UInt256 { for i in 0..8 { let start = i << 2; let end = start + 4; - let hard = u32::from_le_bytes(clone_into_array(&self.0[start..end])) & !BIP32_HARD; + let hard = u32::from_le_bytes(clone_into_array(&self[start..end])) & !BIP32_HARD; v[start..end].copy_from_slice(&hard.to_le_bytes()) } - UInt256(v) + v } fn hardened(&self) -> u64 { - self.u64_le() | BIP32_HARD as u64 + u64::from_le_bytes(clone_into_array(&self[..8])) | BIP32_HARD as u64 } fn softened(&self) -> u64 { - self.u64_le() + u64::from_le_bytes(clone_into_array(&self[..8])) } } pub trait IIndexPath: Sized { - type Item: Copy + Clone + Display + Debug + Encodable + IndexHardSoft + PartialEq + Extremum; + type Item: Clone + Debug + Encodable + IndexHardSoft + PartialEq + Extremum; fn new(indexes: Vec) -> Self; fn new_hardened(indexes: Vec, hardened: Vec) -> Self; @@ -114,7 +110,7 @@ pub trait IIndexPath: Sized { if position >= self.length() { Self::Item::max() } else { - self.indexes()[position] + self.indexes()[position].clone() } } fn hardened_at_position(&self, position: usize) -> bool { @@ -142,13 +138,13 @@ pub trait IIndexPath: Sized { fn length(&self) -> usize { self.indexes().len() } - fn index_path_string(&self) -> String { - if self.is_empty() { - format!("") - } else { - self.indexes().into_iter().map(|index| index.to_string()).collect::>().join(".") - } - } + // fn index_path_string(&self) -> String { + // if self.is_empty() { + // "".to_string() + // } else { + // self.indexes().into_iter().map(|index| index.to_string()).collect::>().join(".") + // } + // } fn index_path_enumerated_string(&self) -> String { (0..self.length()) .map(|position| format!("_{}", self.index_u64_at_position(position))) @@ -193,19 +189,21 @@ pub trait IIndexPath: Sized { fn as_bytes_vec(&self) -> Vec { let mut writer = Vec::::new(); self.indexes().iter().for_each(|index| { - index.enc(&mut writer); + index.consensus_encode(&mut writer).unwrap(); }); writer } } + + #[derive(Debug, Default)] pub struct IndexPath { pub indexes: Vec, pub hardened: Vec, } -impl IIndexPath for IndexPath where T: Copy + Debug + Display + Encodable + IndexHardSoft + PartialEq + Extremum { +impl IIndexPath for IndexPath where T: Clone + Debug + Encodable + IndexHardSoft + PartialEq + Extremum { type Item = T; // TODO: avoid hardened allocation for u32 index paths fn new(indexes: Vec) -> Self { @@ -223,32 +221,4 @@ impl IIndexPath for IndexPath where T: Copy + Debug + Display + Encodable fn hardened_indexes(&self) -> &Vec { &self.hardened } -} - -impl IndexPath { - pub fn from_ffi(indexes: *const c_ulong, length: usize) -> Self { - let indexes_slice = unsafe { slice::from_raw_parts(indexes, length) }; - IndexPath::new(indexes_slice.iter().map(|&index| index as u32).collect()) - } -} - -// impl IndexPath { -// pub fn from_ffi(indexes: *const [u8; 32], hardened_indexes: *const u8, length: usize) -> Self { -// let indexes_slice = unsafe { slice::from_raw_parts(indexes, length) }; -// IndexPath::new(indexes_slice.iter().map(|&index| UInt256(index)).collect()) -// } -// } - -impl<'a> TryRead<'a, usize> for IndexPath { - #[inline] - fn try_read(bytes: &'a [u8], size: usize) -> byte::Result<(Self, usize)> { - let offset = &mut 0; - let mut indexes = Vec::with_capacity(size); - let mut hardened = Vec::with_capacity(size); - for i in 0..size { - indexes.push(bytes.read_with::(offset, LE)?); - hardened.push(bytes.read_with::(offset, ())?); - } - Ok((Self::new_hardened(indexes, hardened), size)) - } -} +} \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/chain/derivation/mod.rs b/dash-spv-crypto/src/derivation/mod.rs similarity index 84% rename from dash-spv-masternode-processor/src/chain/derivation/mod.rs rename to dash-spv-crypto/src/derivation/mod.rs index b6f30f34..4197b930 100644 --- a/dash-spv-masternode-processor/src/chain/derivation/mod.rs +++ b/dash-spv-crypto/src/derivation/mod.rs @@ -1,5 +1,7 @@ pub mod index_path; pub mod uint256_index_path; +pub mod factory; +// pub mod derivation_path; pub use self::index_path::{IIndexPath, IndexPath}; pub use self::uint256_index_path::UInt256IndexPath; diff --git a/dash-spv-masternode-processor/src/chain/derivation/uint256_index_path.rs b/dash-spv-crypto/src/derivation/uint256_index_path.rs similarity index 96% rename from dash-spv-masternode-processor/src/chain/derivation/uint256_index_path.rs rename to dash-spv-crypto/src/derivation/uint256_index_path.rs index 8ab21b60..1c749d2a 100644 --- a/dash-spv-masternode-processor/src/chain/derivation/uint256_index_path.rs +++ b/dash-spv-crypto/src/derivation/uint256_index_path.rs @@ -1,18 +1,17 @@ use std::cmp; use std::cmp::Ordering; use std::hash::Hash; -use crate::crypto::UInt256; use super::IIndexPath; #[derive(Clone, Debug, Default, Eq, Hash)] pub struct UInt256IndexPath { - pub indexes: Vec, + pub indexes: Vec<[u8; 32]>, pub hardened_indexes: Vec, // hash: u64, } impl IIndexPath for UInt256IndexPath { - type Item = UInt256; + type Item = [u8; 32]; fn new(indexes: Vec) -> Self { Self { indexes, ..Default::default() } } diff --git a/dash-spv-crypto/src/internal_macros.rs b/dash-spv-crypto/src/internal_macros.rs new file mode 100644 index 00000000..796626e0 --- /dev/null +++ b/dash-spv-crypto/src/internal_macros.rs @@ -0,0 +1,113 @@ +#[macro_export] +macro_rules! user_enum { + ( + $(#[$attr:meta])* + pub enum $name:ident { + $(#[$doc:meta] + $elem:ident <-> $txt:expr),* + } + ) => ( + $(#[$attr])* + pub enum $name { + $(#[$doc] $elem),* + } + + impl ::core::fmt::Display for $name { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + f.pad(match *self { + $($name::$elem => $txt),* + }) + } + } + + impl ::core::str::FromStr for $name { + type Err = $crate::io::Error; + #[inline] + fn from_str(s: &str) -> Result { + match s { + $($txt => Ok($name::$elem)),*, + _ => { + #[cfg(not(feature = "std"))] let message = "Unknown network"; + #[cfg(feature = "std")] let message = format!("Unknown network (type {})", s); + Err($crate::io::Error::new( + $crate::io::ErrorKind::InvalidInput, + message, + )) + } + } + } + } + + #[cfg(feature = "serde")] + #[cfg_attr(docsrs, doc(cfg(feature = "serde")))] + impl<'de> ::serde::Deserialize<'de> for $name { + #[inline] + fn deserialize(deserializer: D) -> Result + where + D: ::serde::Deserializer<'de>, + { + use ::core::fmt::{self, Formatter}; + + struct Visitor; + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = $name; + + fn expecting(&self, formatter: &mut Formatter) -> fmt::Result { + formatter.write_str("an enum value") + } + + fn visit_str(self, v: &str) -> Result + where + E: ::serde::de::Error, + { + static FIELDS: &'static [&'static str] = &[$(stringify!($txt)),*]; + + $( if v == $txt { Ok($name::$elem) } )else* + else { + Err(E::unknown_variant(v, FIELDS)) + } + } + + fn visit_borrowed_str(self, v: &'de str) -> Result + where + E: ::serde::de::Error, + { + self.visit_str(v) + } + + fn visit_string(self, v: String) -> Result + where + E: ::serde::de::Error, + { + self.visit_str(&v) + } + + } + + deserializer.deserialize_str(Visitor) + } + } + + #[cfg(feature = "serde")] + #[cfg_attr(docsrs, doc(cfg(feature = "serde")))] + impl ::serde::Serialize for $name { + fn serialize(&self, serializer: S) -> Result + where + S: ::serde::Serializer, + { + serializer.collect_str(&self) + } + } + ); +} + +#[macro_export] +macro_rules! display_from_debug { + ($thing:ident) => { + impl ::core::fmt::Display for $thing { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> Result<(), ::core::fmt::Error> { + ::core::fmt::Debug::fmt(self, f) + } + } + } +} diff --git a/dash-spv-crypto/src/keys/bls_key.rs b/dash-spv-crypto/src/keys/bls_key.rs new file mode 100644 index 00000000..2045014d --- /dev/null +++ b/dash-spv-crypto/src/keys/bls_key.rs @@ -0,0 +1,1018 @@ +use bls_signatures::bip32::{ExtendedPrivateKey, ExtendedPublicKey}; +use bls_signatures::{BasicSchemeMPL, BlsError, G1Element, G2Element, LegacySchemeMPL, PrivateKey, Scheme}; +use dashcore::consensus::Encodable; +use dashcore::hashes::{hash160, hex::FromHex, sha256, sha256d, Hash}; +use dashcore::secp256k1::hashes::hex::DisplayHex; +#[cfg(test)] +use dashcore::secp256k1::rand::{thread_rng, Rng}; +use crate::crypto::byte_util::{Zeroable, hmac}; +#[cfg(test)] +use crate::crypto::byte_util::Random; +use crate::keys::OperatorPublicKey; +use crate::util::{address::address, base58, data_ops::hex_with_data, sec_vec::SecVec}; +use crate::derivation::{IIndexPath, IndexPath}; +use crate::keys::{IKey, KeyKind, KeyError, DeriveKey}; +use crate::keys::crypto_data::{CryptoData, DHKey}; +use crate::keys::KeyError::DHKeyExchange; +use crate::network::ChainType; + +impl Zeroable for PrivateKey { + fn is_zero(&self) -> bool { + !self.to_bytes().iter().any(|&byte| byte > 0) + } +} + +#[derive(Clone, Debug)] +#[ferment_macro::opaque] +pub struct BLSKey { + pub seckey: [u8; 32], + pub chaincode: [u8; 32], + pub pubkey: [u8; 48], + pub extended_private_key_data: SecVec, + pub extended_public_key_data: Vec, + pub use_legacy: bool, +} +#[ferment_macro::export] +impl BLSKey { + + pub fn verify_signature(pubkey: [u8; 48], use_legacy: bool, digest: &[u8], signature: [u8; 96]) -> bool { + g1_element_from_bytes(use_legacy, &pubkey) + .map(|pub_key| Self::verify_message(&pub_key, digest, signature, use_legacy)) + .unwrap_or(false) + } + + pub fn key_with_seed_data(seed: &[u8], use_legacy: bool) -> Self { + let bls_private_key = PrivateKey::from_bip32_seed(seed); + let bls_public_key = bls_private_key.g1_element().unwrap(); + let seckey = TryInto::<[u8; 32]>::try_into(bls_private_key.to_bytes().as_slice()).map_err(KeyError::from).unwrap(); + let pubkey = g1_element_serialized(&bls_public_key, use_legacy); + Self { seckey, pubkey, use_legacy, chaincode: [0u8; 32], extended_public_key_data: Default::default(), extended_private_key_data: Default::default() } + } + + pub fn key_with_secret_hex(string: &str, use_legacy: bool) -> Result { + Vec::from_hex(string) + .map(|data| Self::key_with_seed_data(&data, use_legacy)) + } + pub fn key_with_private_key(string: &str, use_legacy: bool) -> Result { + Vec::from_hex(string) + .map_err(KeyError::from) + .and_then(|data| Self::key_with_private_key_data(&data, use_legacy)) + } + + pub fn key_with_private_key_data(data: &[u8], use_legacy: bool) -> Result { + <[u8; 32]>::try_from(data) + .map_err(KeyError::from) + .and_then(|seckey| PrivateKey::from_bytes(data, use_legacy) + .map_err(KeyError::from) + .and_then(|bls_private_key| bls_private_key + .g1_element() + .map_err(KeyError::from) + .map(|bls_public_key| Self { + seckey, + pubkey: g1_element_serialized(&bls_public_key, use_legacy), + extended_private_key_data: Default::default(), + extended_public_key_data: Default::default(), + use_legacy, + chaincode: [0u8; 32], + + }))) + } + + pub fn key_with_public_key(pubkey: [u8; 48], use_legacy: bool) -> Self { + Self { pubkey, use_legacy, seckey: [0u8; 32], chaincode: [0u8; 32], extended_public_key_data: Default::default(), extended_private_key_data: Default::default() } + } + pub fn key_with_public_key_data(data: &[u8], use_legacy: bool) -> Result { + let pubkey = TryInto::<[u8; 48]>::try_into(data).map_err(KeyError::from)?; + Ok(Self::key_with_public_key(pubkey, use_legacy)) + } + pub fn key_with_extended_private_key_data(bytes: &[u8], use_legacy: bool) -> Result { + ExtendedPrivateKey::from_bytes(bytes) + .and_then(|pk| Self::init_with_bls_extended_private_key(&pk, use_legacy)) + .map_err(KeyError::from) + } + + pub fn migrate_from_legacy_extended_public_key_data(bytes: &[u8]) -> Result { + let extended_public_key = ExtendedPublicKey::from_bytes_legacy(bytes) + .map_err(KeyError::from)?; + let chaincode = *extended_public_key.chain_code().serialize(); + Ok(Self { + pubkey: g1_element_serialized(&extended_public_key.public_key(), false), + chaincode, + extended_public_key_data: extended_public_key_serialized(&extended_public_key, false).to_vec(), + seckey: [0u8; 32], + extended_private_key_data: Default::default(), + use_legacy: false, + }) + } + + pub fn migrate_from_basic_extended_public_key_data(bytes: &[u8]) -> Result { + let extended_public_key = ExtendedPublicKey::from_bytes(bytes) + .map_err(KeyError::from)?; + let chaincode = *extended_public_key.chain_code().serialize(); + + Ok(Self { + pubkey: g1_element_serialized(&extended_public_key.public_key(), true), + chaincode, + extended_public_key_data: extended_public_key_serialized(&extended_public_key, true).to_vec(), + seckey: [0u8; 32], + extended_private_key_data: Default::default(), + use_legacy: false + }) + } + + pub fn product(&self, public_key: &BLSKey) -> Result<[u8; 48], KeyError> { + match (self.bls_private_key(), public_key.bls_public_key(), self.use_legacy) { + (Ok(priv_key), Ok(pub_key), use_legacy) if public_key.use_legacy == use_legacy => + (priv_key * pub_key) + .map_err(KeyError::from) + .map(|pk| g1_element_serialized(&pk, use_legacy)), + _ => Err(KeyError::Product) + } + } + pub fn key_with_extended_public_key_data(bytes: &[u8], use_legacy: bool) -> Result { + extended_public_key_from_bytes(bytes, use_legacy) + .map_err(KeyError::from) + .map(|bls_extended_public_key| Self::init_with_bls_extended_public_key(&bls_extended_public_key, use_legacy)) + } + + pub fn sign_digest(&self, md: [u8; 32]) -> [u8; 96] { + self.sign_with_key(|| md) + } + pub fn sign_data(&self, data: &[u8]) -> [u8; 96] { + self.sign_with_key(|| sha256d::Hash::hash(data).to_byte_array()) + } + + pub fn extended_private_key_with_seed_data(seed: &[u8], use_legacy: bool) -> Result { + // dashcore::blsful::SecretKey + ExtendedPrivateKey::from_seed(seed) + .and_then(|bls_extended_private_key| Self::init_with_bls_extended_private_key(&bls_extended_private_key, use_legacy)) + .map_err(KeyError::from) + } + pub fn hash160(&self) -> [u8; 20] { + hash160::Hash::hash(&self.public_key_data()).to_byte_array() + } + + pub fn public_key_serialized(&self, use_legacy: bool) -> Result { + + self.bls_public_key() + .map_err(KeyError::from) + .map(|pk| g1_element_serialized(&pk, use_legacy).to_lower_hex_string()) + } + +} + +#[ferment_macro::export] +impl IKey for BLSKey { + fn kind(&self) -> KeyKind { + KeyKind::BLSBasic + // KeyKind::BLS // &KeyType::BLSBasic + } + + fn secret_key_string(&self) -> String { + if self.seckey.is_zero() { + String::new() + } else { + hex_with_data(self.seckey.as_slice()) + } + } + + fn has_private_key(&self) -> bool { + !self.seckey.is_zero() + } + fn address_with_public_key_data(&self, chain: ChainType) -> String { + address::with_public_key_data(&self.public_key_data(), chain) + } + + fn sign(&self, data: &[u8]) -> Vec { + + if self.seckey.is_zero() && self.extended_private_key_data.is_empty() { + Vec::new() + } else if let Ok(bls_private_key) = self.bls_private_key() { + self.sign_message(&bls_private_key, data).to_vec() + } else { + Vec::new() + } + + } + + fn hash_and_sign(&self, data: Vec) -> Vec { + self.sign_digest(sha256d::Hash::hash(&data).to_byte_array()).to_vec() + } + + fn verify(&mut self, message_digest: &[u8], signature: &[u8]) -> Result { + self.bls_public_key().map_err(KeyError::from).map(|public_key| { + match g2_element_from_bytes(self.use_legacy, signature) { + Ok(signature) if self.use_legacy => + LegacySchemeMPL::new().verify(&public_key, message_digest, &signature), + Ok(signature) => + BasicSchemeMPL::new().verify(&public_key, message_digest, &signature), + _ => false + } + }) + } + + fn secret_key(&self) -> [u8; 32] { + self.seckey + } + + fn chaincode(&self) -> [u8; 32] { + self.chaincode + } + + fn fingerprint(&self) -> u32 { + self.public_key_fingerprint() + } + + fn private_key_data(&self) -> Result, KeyError> { + match self.seckey.is_zero() { + true => Err(KeyError::EmptySecKey), + false => Ok(self.seckey.to_vec()), + } + } + + fn public_key_data(&self) -> Vec { + self.pubkey.to_vec() + } + + fn extended_private_key_data(&self) -> Result { + Ok(self.extended_private_key_data.clone()) + } + fn extended_public_key_data(&self) -> Result, KeyError> { + Ok(self.extended_public_key_data.clone()) + } + + fn serialized_private_key_for_script(&self, chain_prefix: u8) -> String { + let mut writer = SecVec::with_capacity(34); + chain_prefix.consensus_encode(&mut writer).unwrap(); + self.seckey.consensus_encode(&mut writer).unwrap(); + b'\x02'.consensus_encode(&mut writer).unwrap(); + base58::check_encode_slice(&writer) + } + + fn hmac_256_data(&self, data: &[u8]) -> [u8; 32] { + hmac::(&self.seckey, data) + } + + fn forget_private_key(&mut self) { + self.seckey = [0u8; 32]; + } + + fn sign_message_digest(&self, digest: [u8; 32]) -> Vec { + self.sign_digest(digest).to_vec() + } + + fn private_key_data_equal_to(&self, other_private_key_data: &[u8; 32]) -> bool { + self.seckey.eq(other_private_key_data) + } + + fn public_key_data_equal_to(&self, other_public_key_data: &Vec) -> bool { + self.public_key_data().eq(other_public_key_data) + } +} + +impl DeriveKey> for BLSKey { + fn private_derive_to_path(&self, path: &IndexPath) -> Result { + ExtendedPrivateKey::from_bytes(self.extended_private_key_data.as_slice()) + .and_then(|bls_extended_private_key| Self::init_with_bls_extended_private_key(&Self::derive(bls_extended_private_key, path), self.use_legacy)) + .map_err(KeyError::from) + } + + fn public_derive_to_path_with_offset(&self, path: &IndexPath, _offset: usize) -> Result { + if self.extended_public_key_data.is_empty() && self.extended_private_key_data.is_empty() { + Err(KeyError::UnableToDerive) + } else { + let ext_pub_key = extended_public_key_from_bytes(&self.extended_public_key_data, self.use_legacy) + .map_err(KeyError::from)?; + let bls_extended_public_key = Self::public_derive(ext_pub_key, path, self.use_legacy); + let bls_public_key = bls_extended_public_key.public_key(); + Ok(Self { + extended_public_key_data: extended_public_key_serialized(&bls_extended_public_key, self.use_legacy).to_vec(), + chaincode: *bls_extended_public_key.chain_code().serialize(), + pubkey: g1_element_serialized(&bls_public_key, self.use_legacy), + use_legacy: self.use_legacy, + seckey: [0u8; 32], + extended_private_key_data: Default::default() + }) + } + } +} + +impl DeriveKey> for BLSKey { + fn private_derive_to_path(&self, path: &IndexPath<[u8; 32]>) -> Result { + self.private_derive_to_path(&path.base_index_path()) + } + + fn public_derive_to_path_with_offset(&self, _path: &IndexPath<[u8; 32]>, _offset: usize) -> Result { + panic!("This method is not implemented for BLSKey") + } +} + +impl BLSKey { + + pub fn init_with_extended_private_key_data(data: &[u8], use_legacy: bool) -> Result { + ExtendedPrivateKey::from_bytes(data) + .and_then(|bls_extended_private_key| Self::init_with_bls_extended_private_key(&bls_extended_private_key, use_legacy)) + } + + pub fn init_with_extended_public_key_data(data: &[u8], use_legacy: bool) -> Result { + extended_public_key_from_bytes(data, use_legacy) + .map(|bls_extended_public_key| Self::init_with_bls_extended_public_key(&bls_extended_public_key, use_legacy)) + } + + /// A little recursive magic since extended private keys can't be re-assigned in the library + pub fn derive(extended_private_key: ExtendedPrivateKey, path: &PATH) -> ExtendedPrivateKey + where PATH: IIndexPath { + if path.is_empty() { + extended_private_key + } else { + // always use legacy scheme derivation + Self::derive(extended_private_key.private_child_legacy(path.index_at_position(0)), &path.index_path_by_removing_first_index()) + } + } + + pub fn public_derive(extended_public_key: ExtendedPublicKey, index_path: &PATH, use_legacy: bool) -> ExtendedPublicKey + where PATH: IIndexPath { + if index_path.is_empty() { + extended_public_key + } else { + let top_index_path = index_path.index_at_position(0); + assert_eq!(top_index_path >> 31, 0, "There should be no hardened derivation if you wish to derive extended public keys"); + let pk_child = if use_legacy { + extended_public_key.public_child_legacy(top_index_path) + } else { + extended_public_key.public_child(top_index_path) + }; + Self::public_derive(pk_child, &index_path.index_path_by_removing_first_index(), use_legacy) + } + } + + + + pub fn init_with_bls_extended_public_key(bls_extended_public_key: &ExtendedPublicKey, use_legacy: bool) -> Self { + let bls_public_key = bls_extended_public_key.public_key(); + let chaincode = *bls_extended_public_key.chain_code().serialize(); + + Self { + extended_public_key_data: extended_public_key_serialized(bls_extended_public_key, use_legacy).to_vec(), + chaincode, + pubkey: g1_element_serialized(&bls_public_key, use_legacy), + use_legacy, + seckey: [0u8; 32], + extended_private_key_data: Default::default() + } + } + + pub fn init_with_bls_extended_private_key(bls_extended_private_key: &ExtendedPrivateKey, use_legacy: bool) -> Result { + let extended_public_key = extended_public_key_from_extended_private_key(bls_extended_private_key, use_legacy)?; + let extended_public_key_data = extended_public_key_serialized(&extended_public_key, use_legacy); + let chaincode = *bls_extended_private_key.chain_code().serialize(); + let bls_private_key = bls_extended_private_key.private_key(); + let bls_public_key = bls_private_key.g1_element()?; + let seckey = TryInto::<[u8; 32]>::try_into(bls_private_key.to_bytes().as_slice()).unwrap(); + Ok(Self { + extended_private_key_data: SecVec::from(bls_extended_private_key), + extended_public_key_data: extended_public_key_data.to_vec(), + chaincode, + seckey, + pubkey: g1_element_serialized(&bls_public_key, use_legacy), + use_legacy, + }) + } + + + pub fn public_key_from_extended_public_key_data(data: &[u8], index_path: &PATH, use_legacy: bool) -> Result, KeyError> + where PATH: IIndexPath, Self: DeriveKey { + extended_public_key_from_bytes(data, use_legacy) + .map_err(KeyError::from) + .and_then(|bls_extended_public_key| + BLSKey::init_with_bls_extended_public_key(&bls_extended_public_key, use_legacy) + .public_derive_to_path(index_path) + .map(|pk| pk.public_key_data())) + } + + pub fn public_key_fingerprint(&self) -> u32 { + match g1_element_from_bytes(self.use_legacy, &self.pubkey) { + Ok(pk) if self.use_legacy => pk.fingerprint_legacy(), + Ok(pk) => pk.fingerprint(), + _ => 0 + } + } + + pub fn serialized_private_key_for_script_map(&self, chain_prefix: u8) -> Result { + if self.seckey.is_zero() { + Err(KeyError::EmptySecKey) + } else { + // todo: impl securebox here + let mut writer = Vec::::with_capacity(34); + chain_prefix.consensus_encode(&mut writer).unwrap(); + self.seckey.consensus_encode(&mut writer).unwrap(); + b'\x02'.consensus_encode(&mut writer).unwrap(); + Ok(base58::check_encode_slice(&writer)) + } + } + + pub fn public_derive_to_path(&mut self, index_path: &PATH) -> Result + where PATH: IIndexPath { + if (self.extended_public_key_data().is_err() || self.extended_public_key_data()?.is_empty()) && self.extended_private_key_data.is_empty() { + Err(KeyError::UnableToDerive) + } else if let Ok(bls_extended_public_key) = self.bls_extended_public_key() { + Ok(BLSKey::init_with_bls_extended_public_key(&BLSKey::public_derive(bls_extended_public_key, index_path, self.use_legacy), self.use_legacy)) + } else { + Err(KeyError::UnableToDerive) + } + } + + pub fn bls_extended_public_key(&self) -> Result { + if let Ok(bytes) = self.extended_public_key_data() { + extended_public_key_from_bytes(&bytes, self.use_legacy) + .map_err(KeyError::from) + } else if let Ok(bytes) = self.extended_private_key_data() { + ExtendedPrivateKey::from_bytes(&bytes) + .and_then(|pk| extended_public_key_from_extended_private_key(&pk, self.use_legacy)) + .map_err(KeyError::from) + } else { + Err(KeyError::UnableToDerive) + } + } + + pub fn extended_private_key(&self) -> Result { + self.bls_extended_private_key() + .and_then(|pk| Self::init_with_bls_extended_private_key(&pk, self.use_legacy)) + } + + pub fn bls_extended_private_key(&self) -> Result { + ExtendedPrivateKey::from_bytes(&self.extended_private_key_data) + } + + pub fn bls_private_key(&self) -> Result { + if !self.seckey.is_zero() { + PrivateKey::from_bytes(&self.seckey, true) + } else { + ExtendedPrivateKey::from_bytes(self.extended_private_key_data.as_slice()) + .map(|ext_pk| ext_pk.private_key()) + } + } + + pub fn bls_public_key(&self) -> Result { + if Zeroable::is_zero(&self.pubkey) { + self.bls_private_key().and_then(|bls_pk| bls_pk.g1_element()) + } else { + g1_element_from_bytes(self.use_legacy, &self.pubkey) + } + } + + pub fn bls_public_key_serialized(&self, use_legacy: bool) -> Result<[u8; 48], BlsError> { + self.bls_public_key() + .map(|pk| g1_element_serialized(&pk, use_legacy)) + } + + pub fn public_key_uint(&self) -> [u8; 48] { + self.bls_public_key_serialized(self.use_legacy) + .unwrap_or([0u8; 48]) + } + + pub fn bls_version(&self) -> u16 { + if self.use_legacy { + 1 + } else { + 2 + } + } + + /// Signing + fn sign_message(&self, private_key: &PrivateKey, message: &[u8]) -> [u8; 96] { + g2_element_serialized(&if self.use_legacy { + LegacySchemeMPL::new().sign(private_key, message) + } else { + BasicSchemeMPL::new().sign(private_key, message) + }, self.use_legacy) + } + + fn sign_with_key(&self, message_producer: F) -> [u8; 96] where F: FnOnce() -> [u8; 32] { + if self.seckey.is_zero() && self.extended_private_key_data.is_empty() { + [0u8; 96] + } else if let Ok(bls_private_key) = self.bls_private_key() { + self.sign_message(&bls_private_key, &message_producer()) + } else { + [0u8; 96] + } + } + + pub fn sign_data_single_sha256(&self, data: &[u8]) -> [u8; 96] { + self.sign_with_key(|| sha256::Hash::hash(data).to_byte_array()) + } + + + pub fn sign_message_digest_with_completion(&self, digest: [u8; 32], completion: fn(bool, [u8; 96])) { + let signature = self.sign_digest(digest); + completion(!Zeroable::is_zero(&signature), signature) + } + + /// Verification + + pub fn verify_message(public_key: &G1Element, message: &[u8], signature: [u8; 96], use_legacy: bool) -> bool { + match g2_element_from_bytes(use_legacy, signature.as_slice()) { + Ok(signature) if use_legacy => + LegacySchemeMPL::new().verify(public_key, message, &signature), + Ok(signature) => + BasicSchemeMPL::new().verify(public_key, message, &signature), + _ => false + } + } + pub fn verify_message_with_pub_key(pub_key: &[u8; 48], message: &[u8], signature: &[u8; 96], use_legacy: bool) -> bool { + match (g1_element_from_bytes(use_legacy, pub_key), g2_element_from_bytes(use_legacy, signature)) { + (Ok(g1), Ok(g2)) if use_legacy => + LegacySchemeMPL::new().verify(&g1, message, &g2), + (Ok(g1), Ok(g2)) => + BasicSchemeMPL::new().verify(&g1, message, &g2), + _ => false + } + } + + fn verify_message_with_key(&self, message: &[u8], signature: [u8; 96]) -> bool { + self.bls_public_key() + .map_or(false, |public_key| Self::verify_message(&public_key, message, signature, self.use_legacy)) + } + + pub fn verify_with_public_key(digest: [u8; 32], signature: [u8; 96], public_key: [u8; 48], use_legacy: bool) -> bool { + let key = BLSKey::key_with_public_key(public_key, use_legacy); + key.verify_message_with_key(&digest, signature) + } + + pub fn verify_insecure(&self, message: &[u8], signature: &[u8; 96]) -> bool { + self.bls_public_key() + .map_or(false, |public_key| + match g2_element_from_bytes(false, signature) { + Ok(signature) => + BasicSchemeMPL::new().verify(&public_key, message, &signature), + _ => false + } + ) + } + + pub fn verify_secure_aggregated(commitment_hash: [u8; 32], signature: [u8; 96], operator_keys: Vec, use_legacy: bool) -> bool { + let message = commitment_hash.as_slice(); + let public_keys = operator_keys + .iter() + .filter_map(|key| g1_element_from_bytes(key.is_legacy(), &key.data).ok()) + .collect::>(); + match g2_element_from_bytes(use_legacy, &signature) { + Ok(signature) if use_legacy => LegacySchemeMPL::new().verify_secure(public_keys.iter(), message, &signature), + Ok(signature) => BasicSchemeMPL::new().verify_secure(public_keys.iter(), message, &signature), + _ => false + } + } + + pub fn verify_quorum_signature(message: &[u8], threshold_signature: &[u8], public_key: &[u8], use_legacy: bool) -> bool { + match (g1_element_from_bytes(use_legacy, public_key), + g2_element_from_bytes(use_legacy, threshold_signature)) { + (Ok(public_key), Ok(signature)) if use_legacy => + LegacySchemeMPL::new().verify(&public_key, message, &signature), + (Ok(public_key), Ok(signature)) => + BasicSchemeMPL::new().verify(&public_key, message, &signature), + _ => false + } + } + + pub fn verify_aggregated_signature(signature: [u8; 96], keys: Vec, messages: Vec>, use_legacy: bool) -> bool { + let bls_public_keys = keys.iter().filter_map(|key| key.bls_public_key().ok()).collect::>(); + let public_keys = bls_public_keys.iter().collect::>(); + let messages = messages.iter().map(|m| m.as_slice()).collect::>(); + // let bytes = signature.as_bytes(); + match g2_element_from_bytes(use_legacy, &signature) { + Ok(signature) if use_legacy => + LegacySchemeMPL::new().aggregate_verify(public_keys, messages, &signature), + Ok(signature) => + BasicSchemeMPL::new().aggregate_verify(public_keys, messages, &signature), + _ => false + } + } + + pub fn public_key_and_signature_from_seed(schema: S, seed: &[u8], message: &[u8]) -> (G1Element, G2Element) { + let private_key = PrivateKey::from_bip32_seed(seed); + let signature = schema.sign(&private_key, message); + let public_key = private_key.g1_element().unwrap(); + (public_key, signature) + } + + pub fn public_key_from_extended_public_key_data_at_u32_path(&self, index_path: Vec) -> Result { + let index_path = IndexPath::from(index_path); + let ext_pk_data = self.extended_public_key_data()?; + let pub_key_data = Self::public_key_from_extended_public_key_data(&ext_pk_data, &index_path, self.use_legacy)?; + let pub_key = TryInto::<[u8; 48]>::try_into(pub_key_data.as_slice()).map_err(KeyError::from)?; + Ok(Self::key_with_public_key(pub_key, self.use_legacy)) + } + +} + +/// For FFI +impl BLSKey { + pub fn public_key_from_extended_public_key_data_at_index_path(&self, index_path: &PATH) -> Result + where Self: Sized + DeriveKey, PATH: IIndexPath { + let ext_pk_data = self.extended_public_key_data()?; + let pub_key_data = Self::public_key_from_extended_public_key_data(&ext_pk_data, index_path, self.use_legacy)?; + let pub_key = TryInto::<[u8; 48]>::try_into(pub_key_data.as_slice()).map_err(KeyError::from)?; + Ok(Self::key_with_public_key(pub_key, self.use_legacy)) + } +} + + +impl DHKey for BLSKey { + fn init_with_dh_key_exchange_with_public_key(public_key: &mut Self, private_key: &Self) -> Result where Self: Sized { + match (public_key.bls_public_key(), private_key.bls_private_key(), private_key.use_legacy) { + (Ok(bls_public_key), Ok(bls_private_key), use_legacy) if public_key.use_legacy == use_legacy => + (bls_private_key * bls_public_key) + .map_err(KeyError::from) + .map(|key| BLSKey::key_with_public_key(g1_element_serialized(&key, use_legacy), use_legacy)), + _ => Err(DHKeyExchange) + } + } +} + +impl CryptoData for Vec { + + fn encrypt_with_secret_key_using_iv(&mut self, secret_key: &BLSKey, public_key: &BLSKey, initialization_vector: Vec) -> Result, KeyError> { + secret_key.product(public_key) + .and_then(|sym_key_data| sym_key_data[..32].try_into().map_err(KeyError::from)) + .map(|key_data: [u8; 32]| { + let mut destination = initialization_vector.clone(); + let iv: [u8; 16] = initialization_vector[..16].try_into().unwrap(); + let encrypted_data = >::encrypt(self, key_data, iv).unwrap(); + destination.extend(encrypted_data.clone()); + destination + }) + } + + fn decrypt_with_secret_key_using_iv_size(&mut self, secret_key: &BLSKey, public_key: &BLSKey, iv_size: usize) -> Result, KeyError> { + if self.len() < iv_size { + return Err(KeyError::WrongLength(self.len())); + } + secret_key.product(public_key) + .and_then(|sym_key_data| sym_key_data[..32].try_into().map_err(KeyError::from)) + .and_then(|key_data: [u8; 32]| + >::decrypt(self[iv_size..self.len()].to_vec(), key_data, &self[..iv_size])) + } + + fn encrypt_with_dh_key_using_iv(&self, key: &BLSKey, initialization_vector: Vec) -> Result, KeyError> { + let mut destination = initialization_vector.clone(); + key.bls_public_key_serialized(key.use_legacy) + .map_err(KeyError::from) + .and_then(|sym_key_data| sym_key_data[..32].try_into().map_err(KeyError::from)) + .and_then(|key_data: [u8; 32]| initialization_vector[..16].try_into().map_err(KeyError::from) + .and_then(|iv_data: [u8; 16]| + >::encrypt(self, key_data, iv_data)) + .map(|encrypted_data| { + destination.extend(encrypted_data); + destination + })) + } + + fn decrypt_with_dh_key_using_iv_size(&self, key: &BLSKey, iv_size: usize) -> Result, KeyError> { + if self.len() < iv_size { + return Err(KeyError::WrongLength(self.len())); + } + key.bls_public_key_serialized(key.use_legacy) + .map_err(KeyError::from) + .and_then(|sym_key_data| sym_key_data[..32].try_into().map_err(KeyError::from)) + .and_then(|key_data: [u8; 32]| self[..iv_size].try_into().map_err(KeyError::from) + .and_then(|iv_data: [u8; 16]| + >::decrypt(self[iv_size..self.len()].to_vec(), key_data, iv_data))) + } +} + +fn extended_public_key_from_bytes(bytes: &[u8], use_legacy: bool) -> Result { + if use_legacy { + ExtendedPublicKey::from_bytes_legacy(bytes) + } else { + ExtendedPublicKey::from_bytes(bytes) + } +} + +pub(crate) fn g1_element_from_bytes(use_legacy: bool, bytes: &[u8]) -> Result { + if use_legacy { + G1Element::from_bytes_legacy(bytes) + } else { + G1Element::from_bytes(bytes) + } +} + +pub(crate) fn g1_element_serialized(public_key: &G1Element, use_legacy: bool) -> [u8; 48] { + *if use_legacy { + public_key.serialize_legacy() + } else { + public_key.serialize() + } +} + +fn g2_element_serialized(signature: &G2Element, use_legacy: bool) -> [u8; 96] { + *if use_legacy { + signature.serialize_legacy() + } else { + signature.serialize() + } +} + +fn g2_element_from_bytes(use_legacy: bool, bytes: &[u8]) -> Result { + if use_legacy { + G2Element::from_bytes_legacy(bytes) + } else { + G2Element::from_bytes(bytes) + } +} +fn extended_public_key_from_extended_private_key(private_key: &ExtendedPrivateKey, use_legacy: bool) -> Result { + if use_legacy { + private_key.extended_public_key_legacy() + } else { + private_key.extended_public_key() + } +} + +fn extended_public_key_serialized(public_key: &ExtendedPublicKey, use_legacy: bool) -> [u8; 93] { + *if use_legacy { + public_key.serialize_legacy() + } else { + public_key.serialize() + } +} + +impl From<&OperatorPublicKey> for Result { + fn from(value: &OperatorPublicKey) -> Self { + g1_element_from_bytes(value.is_legacy(), &value.data) + } +} + +impl From<&ExtendedPrivateKey> for SecVec { + fn from(value: &ExtendedPrivateKey) -> Self { + SecVec::with_vec(value.serialize().to_vec()) + } +} + + +#[test] +fn bls_chaincode() { + let seed = [1, 50, 6, 244, 24, 199, 1, 25]; + let chain_code = BLSKey::extended_private_key_with_seed_data(&seed, true) + .expect("Failed to derive key") + .chaincode(); + assert_eq!(chain_code.to_lower_hex_string(), "d8b12555b4cc5578951e4a7c80031e22019cc0dce168b3ed88115311b8feb1e3", "Testing BLS derivation chain code"); +} + +#[test] +fn bls_operator_key() { + let key = BLSKey::key_with_private_key("0fc63f4e6d7572a6c33465525b5c3323f57036873dd37c98c393267c58b50533", true) + .expect("Failed to derive key"); + assert_eq!(key.pubkey, <[u8; 48]>::from_hex("139b654f0b1c031e1cf2b934c2d895178875cfe7c6a4f6758f02bc66eea7fc292d0040701acbe31f5e14a911cb061a2f").unwrap()); +} + +#[test] +pub fn test_bls_sign() { + // In dash we use SHA256_2, however these test vectors from the BLS library use a single SHA256 + let seed1 = vec![1u8,2,3,4,5]; + let seed2 = vec![1u8,2,3,4,5,6]; + let keypair1 = BLSKey::key_with_seed_data(&seed1, true); + let keypair2 = BLSKey::key_with_seed_data(&seed2, true); + let message1: Vec = vec![7,8,9]; + let _message2: Vec = vec![1,2,3]; + let _message3: Vec = vec![1,2,3,4]; + let _message4: Vec = vec![1,2]; + let fingerprint1 = keypair1.public_key_fingerprint(); + let fingerprint2 = keypair2.public_key_fingerprint(); + assert_eq!(fingerprint1, 0x26d53247, "Testing BLS private child public key fingerprint"); + assert_eq!(fingerprint2, 0x289bb56e, "Testing BLS private child public key fingerprint"); + let signature1 = keypair1.sign_data_single_sha256(&message1); + assert_eq!(signature1.to_lower_hex_string(), "93eb2e1cb5efcfb31f2c08b235e8203a67265bc6a13d9f0ab77727293b74a357ff0459ac210dc851fcb8a60cb7d393a419915cfcf83908ddbeac32039aaa3e8fea82efcb3ba4f740f20c76df5e97109b57370ae32d9b70d256a98942e5806065", "Testing BLS signing"); + assert_eq!(keypair1.seckey.to_lower_hex_string(), "022fb42c08c12de3a6af053880199806532e79515f94e83461612101f9412f9e", "Testing BLS private key"); + let signature2 = keypair2.sign_data_single_sha256(&message1); + assert_eq!(signature2.to_lower_hex_string(), "975b5daa64b915be19b5ac6d47bc1c2fc832d2fb8ca3e95c4805d8216f95cf2bdbb36cc23645f52040e381550727db420b523b57d494959e0e8c0c6060c46cf173872897f14d43b2ac2aec52fc7b46c02c5699ff7a10beba24d3ced4e89c821e", "Testing BLS signing"); +} + +#[test] +fn test_bls_verify() { + let seed1 = vec![1u8,2,3,4,5]; + let message1: Vec = vec![7, 8, 9]; + let mut key_pair1 = BLSKey::key_with_seed_data(&seed1, true); + assert_eq!(key_pair1.public_key_data().to_lower_hex_string(), "02a8d2aaa6a5e2e08d4b8d406aaf0121a2fc2088ed12431e6b0663028da9ac5922c9ea91cde7dd74b7d795580acc7a61"); + assert_eq!(key_pair1.private_key_data().unwrap().to_lower_hex_string(), "022fb42c08c12de3a6af053880199806532e79515f94e83461612101f9412f9e"); + let signature1 = key_pair1.sign_data(&message1); + assert_eq!(signature1.to_lower_hex_string(), "023f5c750f402c69dab304e5042a7419722536a38d58ce46ba045be23e99d4f9ceeffbbc6796ebbdab6e9813c411c78f07167a3b76bef2262775a1e9f95ff1a80c5fa9fe8daa220d4d9da049a96e8932d5071aaf48fbff27a920bc4aa7511fd4"); + assert!(key_pair1.verify(&sha256d::Hash::hash(&message1).to_byte_array(), &signature1).is_ok(), "Testing BLS signature verification"); +} + +#[test] +fn test_bls_multiplication() { + let private_key_data = Vec::from_hex("46891c2cec49593c81921e473db7480029e0fc1eb933c6b93d81f5370eb19fbd").unwrap(); + let public_key_data = Vec::from_hex("0e2f9055c17eb13221d8b41833468ab49f7d4e874ddf4b217f5126392a608fd48ccab3510548f1da4f397c1ad4f8e01a").unwrap(); + let expected_data = <[u8; 32]>::from_hex("03fd387c4d4c66ec9dcdb31ef0c08ad881090dcda13d4b2c9cbc5ef264ff4dc7").unwrap(); + println!("private_key: {:?}", private_key_data); + println!("public_key: {:?}", public_key_data); + println!("expected_data: {:?}", expected_data); + let private_key = PrivateKey::from_bytes(&private_key_data, false).unwrap(); + let public_key = G1Element::from_bytes_legacy(&public_key_data).unwrap(); + let result = private_key * public_key; + let result_serialize = &result.unwrap().serialize_legacy()[..32]; + assert_eq!(result_serialize.to_lower_hex_string(), expected_data.to_lower_hex_string()); +} + +#[test] +fn test_bls_from_bip32_short_seed() { + let private_key = PrivateKey::from_bip32_seed(&[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); + println!("{:?}", &*private_key.to_bytes().as_slice()); + assert_eq!( + private_key.to_bytes().as_slice(), + Vec::from_hex("46891c2cec49593c81921e473db7480029e0fc1eb933c6b93d81f5370eb19fbd").unwrap().as_slice(), + "----"); +} + +#[test] +fn test_bls_from_bip32_long_seed() { + let seed = Vec::from_hex("0102030405060708090a0102030405060708090a0102030405060708090a0102").unwrap(); + let private_key_test_data = Vec::from_hex("32439470cf06d276897d1b9069bdd6e4445390cd506985de0e1a1c88a76ff176").unwrap(); + println!("{:?}", seed); + println!("{:?}", private_key_test_data); + // let seed = [50, 67, 148, 112, 207, 6, 210, 118, 137, 125, 27, 144, 105, 189, 214, 228, 68, 83, 144, 205, 80, 105, 133, 222, 14, 26, 28, 136, 167, 111, 241, 118]; + // let secret = + let private_key = PrivateKey::from_bip32_seed(&seed); + println!("{:?}", &*private_key.to_bytes().as_slice()); + assert_eq!( + private_key.to_bytes().as_slice(), + private_key_test_data.as_slice(), + "----"); +} + +#[test] +fn test_bls_fingerprint_from_bip32_seed() { + let seed = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + let key_pair = BLSKey::key_with_seed_data(&seed, true); + let key_pair_fingerprint = key_pair.fingerprint(); + assert_eq!(key_pair_fingerprint, 0xddad59bb, "Testing BLS private child public key fingerprint"); + let seed2 = [1, 50, 6, 244, 24, 199, 1, 25]; + let key_pair2 = BLSKey::extended_private_key_with_seed_data(&seed2, true).unwrap(); + let key_pair2_fingerprint = key_pair2.fingerprint(); + assert_eq!(key_pair2_fingerprint, 0xa4700b27, "Testing BLS extended private child public key fingerprint"); +} + +#[test] +fn test_bls_signature_verify_secure_aggregated() { + let public_keys = vec![ + "8f3a813aa68a07fca73c616ea60d0dfbc81667c24a8ac6e6d4c9a64c6d162d5738808c5eab7138742a3d17c814a8bf94", + "92058ad273ac46e18e4f43a20b5bcfbabdcded712d80387eeabaf190d4351f45749db9a9d1bf4e13e4ae946a03ed4015", + "08ff9920aa7391cf47e0a1a816ab4c67e037a5d448d2cf28b4d8c7c4008c459eadbe5134f7176804046521ec0b49341e", + "8b817dcf0c4233d3c71ceae42db90a1b630f1f97285b4ffd265387a088a7d38400cd705ca090bd9c0f4619a225e16c73", + "91008785993639ba13e4e20981c89ed9a64a0e561da60e7e286f25c397d6e0db06acdded783b247fe26f2f2ff6665184", + "0936107afd59a0433113ee3d77ef0ed7bc48790f70959460fdcac663f7050b4e48179c68228fe15f91dd6c19c702d0c8", + "05ee12ead9b2fcbcd20e028acb74226fd75ec271ad8daa431fb9e6fdeea0070aeffb080c21edca34385060a1c8c05bdd", + "064cd7b508ad623a51d79c8557a667499383e8d723ec79792d08bfce5fb96a6a898f502b74ab79761fed79c652c081d9", + "919ad9aa930fc2cdafed3db371eb52dede4d14c9d170d1a75714556da791bc6973761ac975163488f258b988eb19d487", + "02ab52425100d319bc1b5e1382c4eba074f73f2ae94f6e1713ffd9a0f513b541f44d9a0879f48fdcaf3521ebd3b734e3", + "8f7242bdba0921c2418d4e3be676e320c0ba9ea86b5d185dd1dc1e665587925086e8bd0de4473f9eba0f1487ddf81f86", + "0a354bd6de479dce0864fced9cc8e3f7ee39f1f77a69b28d75745907a7e76e6565d6b5b12bc7cd64284d910650f8ccb1", + "921958278157241233fe7e816d06c4bba25583a108507c691d3ee45e3a7231a5606c31161c1c32614f74deff608690d9", + "944be5269df80a87677dd9c7f6202c58d7b8eeeff712b2581b96956e823f02b7095a0fa27d12f8e10a426fa666abe7d2", + "81b1f0151edf35e001385496b0b18481d4293eb1218f8105be8068d7864c535825d134f70177922a1c64674c87e10829", + "11d3f729e18d03589e5795565318007ec11675fbcd970ff72c6d8534f0a9e582f00d6254d897e5563e90286a5ab2197f", + "81a5c8199317dc83bebfa4b00c3c50c3c3ce9e1af8271016c44821dcb3f4a8181a35c21e3914d765f5a4e2059ebd5bbb", + "8451624e5fbcdcf1703e9c1e80cef6e07e648ce343952f3e30c82c17c64a934870b54f30249398532e4a3e74a1e07df4", + "8e1fbec112bc165a30db65e2bfbde2459fad2a590bcdca6c2350355ab9920c7db88655ac6ac25ed190f8e58900cfa507", + "114923b2ea69b786b8dd5ae2b95f726903735714890b923d42288f8a46d894009749f5acd47340de1a3a4d33d80a3258", + "0e7e5a1f72524c3bab4d7990a27af8d4451a327109549d876ec522e22305cadf80c9ff0f74d1a200dbcdb1376afd34e5", + "892bda25e986cfdce112814bff6bb7f01b5bba267f503902d006ed0c30c4c27b782bf3cdfdb761514fba52129e45f76f", + "99dc46b3b77144740a64f5dc1ca597424ac998d2a00e1eea6b248a02a5a53f9db0e122e598ad93d83b046ba3105d2f1a", + "8e433404d5169db60433f21db99edcce1afcb548d2b0414c9dbab698148aaaf8d91e1ee94a021404e5d8d3d644835659", + "0c3cd2a62cf315fb5c34615d8fda0d032d88de74d8100e85c4c07bb636ab609b699e1d593506eb160d4adfcd9f86dad8", + "0f396fa4c452d8c6eb1eb993bdea8af98f96c65bf0cc37ef5048c895af4e89aa8babaa95111157a0d0aaefe1809282a1", + "8162cb75478d2328c6af409b3ba0f4f720cd30c340d0b608e62bfb7ed72015a35f1ff5225acbd97af2a33320fe3ede48", + "8d630e590710227707903890ebb933e2c12cacd477f689a258cc2bcefc481ada7513b9e8a11878481f8aae36fc278fa8", + "01da056d3b253e6660c98771aea644191640f179dee3674f0c720ae896ebc9a4614f707c6809ad8f33a7226abf65d549", + "0bba5dc0e216fa128d8701d0ce4de39e2dc39f16a0a3ceeced7fcc89d17b65cee32362bc68b712bfc9cc5490c334c6e6", + "86f9f8c4738f1e83450f785017b983c6036ddcb23d16ba08735c51c531347dc3aa5ee8471ad883d2b1dd0873f6e18a70", + "860413b84c02b5bfd97f44a2737dc4bd20404614d74e63da02d3dd91fd211d7c5b4ffc9caa23b277b53b96ec50bd7ff7", + "05e2e0ff4488026ff18e1700c8378f50e4b84b9222ee46d0898ba7debe7da7121f98edca635bd167345e7904ee08330c", + "13e6578f575c681f159b019fbc7d425f6e9cee2a4bfc98bad504026418d351aec1f0e91a66de53ef8899ab6fb66a1bed", + "12e53b9b0f93bdac4d25e78fb5610aa4a10d12906586b1e162598a31718af93d015162ed7bb1d21daab9aa85e164afd1", + "183ad2fa4d5622e12ef083304461bcc046c41c2a24b2f1ef7b36e2fe8bc50f48dbef75cf51128bfa4e280ba724babf23", + "90908933bd97769966d74a7a85fad9ce894ec6dd943b71678a2ec87a155a9a0a390707e64d384a6452fe478771262504", + "1232235225905ae0f2f765dcc3908e2e40d241bf9783ee7e39831bf76b620e3c019fdb522900563dc06a0494b036c27e", + "0933c9280553bdf898189d3dec95419262433defd4bef9e90611ffc05376e582fe41f57d4b0547852928da79171e29fa", + "8f2d54ffb351acc9fb8ca90726b02320832dda589a83fae040611d96a0a6917a5fbac2841232e18312f675c6a5aee670", + "9555f97d16e75a135d98ec2f52a8881a60c790673cad6d9f0ef0e52bca3b0607aaa19cfec7ef4512e85b7fc687d0f3e6", + "84830a7f9af1b788df3060c089e3e7d6e242e94802dfb8d2eb46d69aa27276a860963c52b20f41cdb4791a71e58b4344", + "892fc0e02bff6e41f119ddb6f7f0d475a2721f101a26830db026681383fbbfab0cfa488473b51f511edab979ed915b28", + "8c8440a82f2fa19bcf1a1324de03db6beba690da39c79c7e09835728026c46a59475e2fae6d0fbe20c01a128e796aac8", + "8614b12d8761ef8fffe132725a9a6b511abe7823df3c0022ab3e4dec221cf8ce2ab6589cd617779023a54056d87f997b", + "89718b0bcc8233af8df3eab1f3d2003282506e6babe096eae072cb8a435431fb3ca0359ef7ee8bfb3fbe981debdf9c0f", + "0abc9b9ee35465c024cf4c72ed60dcb600c8657e6deff6f4ad69400b5f3a9d5140bb7c09c5262cd1265c093a7cb6c184", + "10f912e265e3865b0ca0e7a8514616f541d2526e493212d0e82218f2ec7abce09eeb0316d165cdf006dfb596b37380d9", + "8624a671b7eb6111e53adf55806ac01d6c0af6da23fe3e964650ed39b017585291cd6e2b3ff20a1f658aa26b4836abf6", + "069fdc47b17e21a2c12eb27e81ff4c011f8088b3525cb1e6140a6f7db38123232ede01ee4fb2b7be143b756533a77ef6", + "1053fe7f087d571a864a5a7408002f0ad786b33f06db9b719f39ed37af60270eb0c9e494833b6d2d1f029ec2700d3e6d", + "954b5017998fe8a16d3946ed13ffa255c546a1dbd478e5bb3a2657de4d331a6abda1587ee83a8c6954bcad8ee43bb16c", + "0c08500f384056485306bc8ff98a26ede2d20248ea1f7ccbd3ddc8b29a0e46a8fcda6a02d7a12b6ae94207a441411477", + "8e2c3b1b98e45c78c9ccd7934064da30b18f6891417a7915d8dd7ee3dc5be76baa6e164e3dc0ae7185e9a3b449bfe813", + "17ac04dcbe4572333decb848d4dcea1c2e5edf24a1e774aa1c1c6f31dbc3261883ad27cacd2efdd2ab91b24a77390b3f", + "0eda3c087f9a593efe4c8fa7fd4ce02c587952b1bc20a49b2d21d573213c4f47a6db3494b1a33a0749518ba3bc0002d0", + "022a15f6c1f3af9376cadbf2e99684de157ddcdd0966fac9fddb9772867213b867994bdcb55c8ea30e41b19c385f9fe4" + ]; + let members_signature = <[u8; 96]>::from_hex("052f62455ad81786528a2c7b7ab4c22f812982ed99c0799e6cbf9a719a76e9cff2eaca9aefd41f29922c2f85e3c3d70a1100b35bc0d7d25bd54291d99234bf556a5649e8cccf4fddb040ebaca5fa401b0ec409cbd285f6c58a8dc17b521b2093").unwrap(); + let commitment_hash = <[u8; 32]>::from_hex("656e3b2e895b155da40860ad4c09d48204d0847f1eb20bd1ebbe9416bfbd7961").unwrap(); + let operator_keys = public_keys.iter() + .map(|s| OperatorPublicKey { data: <[u8; 48]>::from_hex(s).unwrap(), version: 1}) + .collect::>(); + assert!(BLSKey::verify_secure_aggregated(commitment_hash, members_signature, operator_keys, true)); +} + + +#[cfg(test)] +fn test_bls_verify_random_signature_using_scheme(schema: S) { + + let len: usize = thread_rng().gen_range(0..30); + let mut vec_pks = Vec::with_capacity(len); + let mut vec_sigs = Vec::with_capacity(len); + let hash = <[u8; 32]>::random(); + for _i in 0..len { + let private_key = PrivateKey::from_bip32_seed(&<[u8; 32]>::random()); + let signature = schema.sign(&private_key, &hash); + let public_key = private_key.g1_element().unwrap(); + vec_sigs.push(signature); + vec_pks.push( public_key); + } + let signature = schema.aggregate_sigs(vec_sigs.iter().collect::>()); + let public_key = schema.aggregate_public_keys(vec_pks.iter().collect::>()); + assert!(schema.verify(&public_key, &hash, &signature)); +} + +#[test] +fn test_bls_basic_signature_verify_secure_aggregated() { + test_bls_verify_random_signature_using_scheme(LegacySchemeMPL::new()); + test_bls_verify_random_signature_using_scheme(BasicSchemeMPL::new()); +} + +#[test] +fn test_bls_llmq_50_60() { + // LLMQ::verify at 871584: Llmqtype50_60 + let commitment_hash = <[u8; 32]>::from_hex("0f602593b3ea2d71d14728edce3e92a29d800e6745baf7de5ac3c3a2a2c627f5").unwrap(); + let signature = <[u8; 96]>::from_hex("a97b10b1b24fd6aa0f958f73dcbab59e4bfca46647189cf0e186e25e355d74752a3069f6d030118860717068c611fcf513c6b1aafb75c1010bd76085f43e32401a1e58ba7f20acc99aefc7c00f9b04ce346767804095b7e014a68192614da077").unwrap(); + let operator_keys = vec![ + OperatorPublicKey { data: <[u8; 48]>::from_hex("a2fea620ee07107d6611b7ccf5726e0e8247a131a3f129eb2b3195fe0fc1a91044af42a839915161e2105944252c59aa").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("890f1ca955443740346b5b4b0bfb8251f040074b5a2feb77e54add831bf34aaf1d84207691f6f5aa5e702152a496fadc").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("9130b42d6eb505e811dfb18ff87c4bcacde56b76a7d47a8db88ca26e75f5c2eebdd767d440f375784f9d1f127f57c977").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("94e81203caa5c0cc305b5e0f3ae7a388b974a629358e4e83e50a25b2c2a387e3d114c7c82e2b23c25b65585220e63c99").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("99c6bb8f02fe03ebfe9f3c8900dd764e6f379ca1061b8dbd8ce6b6b139489c9083a84ee60f2aca4ae114797abc07d945").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("ac290b31d2e878c2d7235efb0c61f423aa37742a31318e61f8bb0bd6c110a892dc244512fec12a8b0fe7cbb08e12be28").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("a42c53c3aa11ae4b985a52ae6a3170bdb58f88ec04c62013f9322bd5fda4417939836b6f41741dd864c348103a1155d3").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("96ca29d03ef4897a22fe467bb58c52448c63bb29534502305e8ff142ac03907fae0851ff2528e4878ef51bfa3d5a1f22").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("852057284a7a9dbccb97fbaea3425104901dc661b69294a55c7ca800ed18d37df7ccc02367b5d6836ee4f6b052249a1d").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("97596d7a72b65531fffd5f610752422d6e286c975f30d026092f7900f8015073bd6f6d1b85dd3981814c093910e7dac6").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b05caab51ff07a2f8d69972fd6ec09f6f9893cf6dfc49775f5a2db2ea7a8a525bbaf4e7e369d06590f6f2e8e4658d4dc").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("8aeb5c2757211202b3afd2033ec1b4ef2dfe376ba5c6c07b45e6a7460afa4086423c4a704eb9a781514fbc513e190a62").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("8c9bf080a96d13b356b01e734618a77225f03b3e92684f252ccbd313764a9fd9247bde6b00d92f6b5669043e77860453").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("94e199beb2a2a59166a12a851ef158928bc5efc25b39eb78b3a428b25384609d8c03548a94e77c0c941c90c68a4187d8").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b2823797ad456d53ce1e6bde84e8a19164ff88a73ccd242ec48d9c6a479f2a049e214c7e8ec2243b7ea74ca6144ab2c5").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("8196970badc74d068ec1226ffd4a656313decef59d792237a32e6ff56cd4e43030c436025831a4a3d0306a616f033810").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("adeed4d18add0ef5a7dff743a206786ab2dcc1b4aff679a61577dea99b62fb24dd56e3fe7ff65fa0be964dc5d7967c3e").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("95a577f51dc6fd7fa4621f0a4601e48fd65418a89c2af2afef725fb4f053a8ee5841cd3fdae39ebdf5a202e0c4deca23").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("82ce863d0843ca66b4a64d94c0d84ec15980ea04e4444ac4d4188f38cc0da4d6d2360b8a2046725b682862255af6a48c").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("a26fc7f30c49215b98d5cb47a350f888a306c52fa42c77e765b55288e622f03859273cae7e1cac99e67f7a9a96a6aa2c").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b37befcc17d16d4154ea8bbe82e9bd52e2ecd825dd9a43f58730d594d87cceebcb41e11461319fd71bfc08d0a0545200").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("84c0ca8535c114f8f1b369f339b2653e7126610f5170b223970f4e63ad7b55ea2f61a08e263b51fb03f6940d655690f9").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b3ea90ebcf0d8e332e37e5ac3c676653bb1203e8db7604bb0ac64a9b655b553de514e9bff5eeb86bb3ef9178375392f9").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("875b907b6d6c12aa111da0e102186b9d06f4e065969b60732207f18c2c5d0deb8ecba47cb4c0929647db0e2fae6f08ca").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("a42d732a03847819b1e2675ac48b9af4a1c92b310ecacc42c428ff902099cc47d08ecd4616da55d185463855aee99f79").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("ac9c5c77fe321ff0a115d1ba5bf7462063ef21a82ba796415f4ee538bf9e8a6a49707530c72cbb6b60026c46ff1b9443").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("8e9855b2ee991f988e446b60dcd637f33a782baf1e755785ca058f0398133bf3a95e4e77d4168c13c47d7e3fb1e3ecfc").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("93146b3252f408f1cffc875b12b61f56c1ae02113b24c0b5aaedcda4a9b509332c8c4587450074f3e0906aaf3ceca754").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b9d1a6a4f7f817d2e004134d96fa0c831433e9c649726ba8567f447d1b2394209bc1ef184a93c707054fb6816790de30").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b888fe437eab3af5a7fee4e0164705458a6fda97ae390d69721a5f1d3830ec330fb53c6a29588f1f94f69adcff04ca09").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("90d4c6a24d00d70fe961b77d58eff318bb6cd00c122bcfa20f92d65d03b9fd3afa5a0effc90810103a53d53ab155f764").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("8fa5377eb256323aace31b45c3e48ea110404b053cb80e8043bd1e44de1705130548e4ab28738816251ea57a7fc10324").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b2cafe1870e043973b2f1fded8de3d5a66dac5ade46aa0995157077efee92d852857bc7f03ed69c92723a58f8bd2926e").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("aa0ede82d78a0a8f4c2332d431c7be496c3aa09349ed3b2db30f7eb7dcc7b6e580a9d71f7d76bdaca1b3670e0cf4cd3c").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("97f78abcee6d2ed68bf2c82afbf56ef9af67313e2eb655ea5178850907cb3057cae0bb5a1d09f161057bf62f9d4890c6").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("80ea87eef15f38c1a844d77348e687794c601277011c933026cdfdb649524632b055feea3539abc48472cb447d281d65").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("8ad4f577d067630f6fd15f4d2aefdb9456d648b71cb7253d47511acc81dd5ddb69a03c848322aa11e5242f66afde5a2a").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("92730062f122f937b29f69536db3ad36980b88004eadc2ca341425d432723d67e53a4f55786c54017d77c1bd1df6b310").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("81f24418ec73b09b00514dba8fb18d6d8af1dc2ff93d594bf987911f3b98d659eb43286cd450b7e1ee5978b361660d73").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b0051db915bd86bd938746c14440b11ee3b2801cbc6d6c1c912e8b41ea5eb1d8f852abf220ae91ecdb6da094846c1ba8").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("80a2e66a810493a91b5ed1a8ef8ac4be41543598f5b4765a6f5d6339078ab88030817dc9c9bdb60c7c7a02d7787d6f2e").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("95f9da603c572257802a689964ca8f4d96f9b94f33ab75968c9cb6c730a28d50b7bb72ac2cfceee6ab0755ead9cb53cd").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("90e3caa7ae519505a6e1f3b56d3a99865f70e48f772ac431c3964a33cce7fe1e736d43ec3343ad843faaaa2b2bb3a921").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b7d5f022c3b6c314bde5171ead1616e4c27f0e9a48a9a9dc3a7227a62d42213b93c8a4c32af18bd8ff931b7732782e09").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b32f6fc90c9dcaacdf9d836a2a7e60d090fe5e55b0b02f5a4f608a4b8235ba5aa7abc4e05f9387d1d942adc57c87f5b7").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("911a30e0a5f2f5135dcc5f09498e4ba5de22c7680f396599f7f29b91ac569c3d4336bc157443cf8c06682bfb5abb2271").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b4a637afe3810d73e3402b5d6a398e45222ba846a339f1c3570aa8e3f7f5b9d7acef08ac234cce4f706671498330a599").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("8dc75e865b89e96560b38fae96f1d0a5438795778e68b705a506046245ca5dbbedb09e2379eea4c9bde0d0fd4fe05080").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("882cbd9118474316f40b800e43f94a121928f256fd340098ff0ad81a902c4326dda4b42737d52739482f2baa80c487cc").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("92fa57a5676925e8dfe3b340df2132f5844ad9f89594b04efa28fb4fb884fe21f411fa49120ed7a60ce9381a54232a10").unwrap(), version: 2 } + ]; + let use_legacy = false; + + let all_commitment_aggregated_signature_validated = BLSKey::verify_secure_aggregated( + commitment_hash, + signature, + operator_keys, + use_legacy); + assert!(all_commitment_aggregated_signature_validated); +} + +// impl BlsModule + +// BlsModule diff --git a/dash-spv-masternode-processor/src/keys/crypto_data.rs b/dash-spv-crypto/src/keys/crypto_data.rs similarity index 71% rename from dash-spv-masternode-processor/src/keys/crypto_data.rs rename to dash-spv-crypto/src/keys/crypto_data.rs index 5c7b3862..4b6d0b6b 100644 --- a/dash-spv-masternode-processor/src/keys/crypto_data.rs +++ b/dash-spv-crypto/src/keys/crypto_data.rs @@ -1,61 +1,60 @@ use std::fmt::Debug; -use crate::keys::IKey; use crate::util::cc_crypt::{aes256_encrypt_decrypt, Operation}; +use crate::keys::{IKey, KeyError}; pub const CC_BLOCK_SIZE_AES128: usize = 16; pub trait DHKey: Send + Sync + Debug { - fn init_with_dh_key_exchange_with_public_key(public_key: &mut Self, private_key: &Self) -> Option where Self: Sized; + fn init_with_dh_key_exchange_with_public_key(public_key: &mut Self, private_key: &Self) -> Result where Self: Sized; } -// TODO: CryptoData where AsRef<[u8]>: CryptoData -pub trait CryptoData: Send + Sync + Debug where Vec: CryptoData { - +// TODO: generalise this +pub trait CryptoData: Send + Sync + Debug +where K: IKey + Clone, + Vec: CryptoData { #[inline] fn random_initialization_vector_of_size(size: usize) -> Vec { - use secp256k1::rand; - use secp256k1::rand::distributions::Uniform; - use secp256k1::rand::Rng; - let mut rng = rand::thread_rng(); + use dashcore::secp256k1::rand::{distributions::Uniform, Rng, thread_rng}; + let mut rng = thread_rng(); let range = Uniform::new(0, 255); (0..size).map(|_| rng.sample(&range)).collect() } - fn encrypt(data: impl AsRef<[u8]>, key: impl AsRef<[u8]>, iv: impl AsRef<[u8]>) -> Option> { + fn encrypt(data: impl AsRef<[u8]>, key: impl AsRef<[u8]>, iv: impl AsRef<[u8]>) -> Result, KeyError> { aes256_encrypt_decrypt(Operation::Encrypt, data, key, iv) } - fn decrypt(data: impl AsRef<[u8]>, key: impl AsRef<[u8]>, iv: impl AsRef<[u8]>) -> Option> { + fn decrypt(data: impl AsRef<[u8]>, key: impl AsRef<[u8]>, iv: impl AsRef<[u8]>) -> Result, KeyError> { aes256_encrypt_decrypt(Operation::Decrypt, data, key, iv) } - fn encrypt_with_secret_key(&mut self, secret_key: &K, public_key: &K) -> Option> { + fn encrypt_with_secret_key(&mut self, secret_key: &K, public_key: &K) -> Result, KeyError> { self.encrypt_with_secret_key_using_iv(secret_key, public_key, Self::random_initialization_vector_of_size(CC_BLOCK_SIZE_AES128)) } - fn encrypt_with_secret_key_using_iv(&mut self, secret_key: &K, public_key: &K, initialization_vector: Vec) -> Option>; + fn encrypt_with_secret_key_using_iv(&mut self, secret_key: &K, public_key: &K, initialization_vector: Vec) -> Result, KeyError>; - fn decrypt_with_secret_key(&mut self, secret_key: &K, public_key: &K) -> Option> { + fn decrypt_with_secret_key(&mut self, secret_key: &K, public_key: &K) -> Result, KeyError> { self.decrypt_with_secret_key_using_iv_size(secret_key, public_key, CC_BLOCK_SIZE_AES128) } - fn decrypt_with_secret_key_using_iv_size(&mut self, secret_key: &K, public_key: &K, iv_size: usize) -> Option>; + fn decrypt_with_secret_key_using_iv_size(&mut self, secret_key: &K, public_key: &K, iv_size: usize) -> Result, KeyError>; // DHKey - fn encrypt_with_dh_key(&self, key: &K) -> Option> where K: DHKey { + fn encrypt_with_dh_key(&self, key: &K) -> Result, KeyError> where K: DHKey { self.encrypt_with_dh_key_using_iv(key, Self::random_initialization_vector_of_size(CC_BLOCK_SIZE_AES128)) } - fn encrypt_with_dh_key_using_iv(&self, key: &K, initialization_vector: Vec) -> Option> where K: DHKey; - fn decrypt_with_dh_key(&self, key: &K) -> Option> where K: DHKey { + fn encrypt_with_dh_key_using_iv(&self, key: &K, initialization_vector: Vec) -> Result, KeyError> where K: DHKey; + fn decrypt_with_dh_key(&self, key: &K) -> Result, KeyError> where K: DHKey { self.decrypt_with_dh_key_using_iv_size(key, CC_BLOCK_SIZE_AES128) } - fn decrypt_with_dh_key_using_iv_size(&self, key: &K, iv_size: usize) -> Option> where K: DHKey; + fn decrypt_with_dh_key_using_iv_size(&self, key: &K, iv_size: usize) -> Result, KeyError> where K: DHKey; // Chained sequence - fn encapsulated_dh_decryption_with_keys(&mut self, keys: Vec) -> Option> where K: DHKey { + fn encapsulated_dh_decryption_with_keys(&mut self, keys: Vec) -> Result, KeyError> where K: DHKey { assert!(keys.len() > 0, "There should be at least one key"); match &keys[..] { [first_key, other @ ..] if !other.is_empty() => @@ -63,11 +62,11 @@ pub trait CryptoData: Send + Sync + Debug where Vec: Crypto .and_then(|mut data| data.encapsulated_dh_decryption_with_keys(other.to_vec())), [first_key] => self.decrypt_with_dh_key(first_key), - _ => None + _ => Err(KeyError::DHKeyExchange) } } - fn encapsulated_dh_decryption_with_keys_using_iv_size(&mut self, keys: Vec, iv_size: usize) -> Option> where K: DHKey { + fn encapsulated_dh_decryption_with_keys_using_iv_size(&mut self, keys: Vec, iv_size: usize) -> Result, KeyError> where K: DHKey { assert!(keys.len() > 1, "There should be at least two key (first pair)"); match &keys[..] { [first_key, other @ ..] if other.len() > 1 => @@ -75,29 +74,29 @@ pub trait CryptoData: Send + Sync + Debug where Vec: Crypto .and_then(|mut data| data.encapsulated_dh_decryption_with_keys_using_iv_size(other.to_vec(), iv_size)), [first_key, second_key] => self.decrypt_with_secret_key_using_iv_size(second_key, first_key, iv_size), - _ => None + _ => Err(KeyError::DHKeyExchange) } } - fn encapsulated_dh_encryption_with_keys(&mut self, keys: Vec) -> Option> where K: DHKey { + fn encapsulated_dh_encryption_with_keys(&mut self, keys: Vec) -> Result, KeyError> where K: DHKey { assert!(!keys.is_empty(), "There should be at least one key"); match &keys[..] { [first, other @ ..] if !other.is_empty() => self.encrypt_with_dh_key(first) .and_then(|mut data| data.encapsulated_dh_encryption_with_keys(other.to_vec())), [first] => self.encrypt_with_dh_key(first), - _ => None + _ => Err(KeyError::DHKeyExchange) } } - fn encapsulated_dh_encryption_with_keys_using_iv(&mut self, keys: Vec, initialization_vector: Vec) -> Option> where K: DHKey { + fn encapsulated_dh_encryption_with_keys_using_iv(&mut self, keys: Vec, initialization_vector: Vec) -> Result, KeyError> where K: DHKey { assert!(!keys.is_empty(), "There should be at least one key"); match &keys[..] { [first, other @ ..] if !other.is_empty() => self.encrypt_with_dh_key(first) .and_then(|mut data| data.encapsulated_dh_encryption_with_keys_using_iv(other.to_vec(), initialization_vector)), [first] => self.encrypt_with_dh_key(first), - _ => None + _ => Err(KeyError::DHKeyExchange) } } } diff --git a/dash-spv-crypto/src/keys/dip14.rs b/dash-spv-crypto/src/keys/dip14.rs new file mode 100644 index 00000000..5817d6b7 --- /dev/null +++ b/dash-spv-crypto/src/keys/dip14.rs @@ -0,0 +1,233 @@ +use ed25519_dalek::{SigningKey, VerifyingKey}; +use dashcore::secp256k1::Scalar; +use dashcore::consensus::encode::Encodable; +use dashcore::hashes::sha512; +use crate::crypto::byte_util::{clone_into_array, hmac, Is31Bits, U32LE}; +use crate::derivation::{BIP32_HARD, IIndexPath}; +use crate::keys::{ECDSAKey, ED25519Key}; + +pub trait IChildKeyDerivationData where SK: SignKey { + fn private_key_data_input(key: &SK, path: &PATH, position: usize) -> Vec where PATH: IIndexPath; + fn public_key_data_input(key: &PK, path: &PATH, position: usize) -> Vec where PATH: IIndexPath; +} + +impl IChildKeyDerivationData for ECDSAKey { + fn private_key_data_input(key: &[u8; 32], path: &PATH, position: usize) -> Vec where PATH: IIndexPath { + let index = path.index_at_position(position); + let buf = &mut [0u8; 37]; + if index & BIP32_HARD != 0 { + buf[1..33].copy_from_slice(key); + } else { + buf[..33].copy_from_slice(&secp256k1_point_from_byte_array(key)); + } + buf[33..37].copy_from_slice(&index.to_be_bytes()); + buf.to_vec() + } + + fn public_key_data_input(key: &[u8; 33], path: &PATH, position: usize) -> Vec where PATH: IIndexPath { + let index = path.index_at_position(position); + if index & BIP32_HARD != 0 { + panic!("can't derive private child key from public parent key"); + } + let writer = &mut [0u8; 37]; + writer[..33].copy_from_slice(key); + writer[33..].copy_from_slice(&index.to_be_bytes()); + writer.to_vec() + } +} + +impl IChildKeyDerivationData<[u8; 32], [u8; 32], [u8; 33]> for ECDSAKey { + fn private_key_data_input(key: &[u8; 32], path: &PATH, position: usize) -> Vec where PATH: IIndexPath { + let index = path.index_at_position(position); + let is_hardened = path.hardened_at_position(position); + let i_is_31_bits = index.is_31_bits(); + let mut writer = Vec::::new(); + if is_hardened { + 0u8.consensus_encode(&mut writer).unwrap(); + writer.extend_from_slice(key); + } else { + writer.extend_from_slice(&secp256k1_point_from_byte_array(key)); + }; + if i_is_31_bits { + let mut small_i = index.u32_le(); + if is_hardened { + small_i |= BIP32_HARD; + } + small_i.swap_bytes().consensus_encode(&mut writer).unwrap(); + } else { + index.consensus_encode(&mut writer).unwrap(); + }; + writer + } + + fn public_key_data_input(key: &[u8; 33], path: &PATH, position: usize) -> Vec where PATH: IIndexPath { + let index = path.index_at_position(position); + let is_hardened = path.hardened_at_position(position); + if is_hardened { + panic!("can't derive private child key from public parent key"); + } + let mut writer = key.to_vec(); + if index.is_31_bits() { + writer.extend_from_slice(&index.u32_le().to_be_bytes()); + } else { + writer.extend_from_slice(&index); + }; + writer + } +} + +impl IChildKeyDerivationData for ED25519Key { + fn private_key_data_input(key: &SigningKey, path: &PATH, position: usize) -> Vec where PATH: IIndexPath { + let mut index = path.index_at_position(position); + // it's always hardened + index |= BIP32_HARD; + let writer = &mut [0u8; 37]; + writer[1..33].copy_from_slice(&key.to_bytes()); + writer[33..37].copy_from_slice(&index.to_be_bytes()); + writer.to_vec() + } + + fn public_key_data_input(key: &[u8; 32], path: &PATH, position: usize) -> Vec where PATH: IIndexPath { + let index = path.index_at_position(position); + if index & BIP32_HARD != 0 { + panic!("can't derive private child key from public parent key"); + } + let writer = &mut [0u8; 36]; + writer[..32].copy_from_slice(key); + writer[32..].copy_from_slice(&index.to_be_bytes()); + writer.to_vec() + } +} + +impl IChildKeyDerivationData<[u8; 32], SigningKey, [u8; 32]> for ED25519Key { + fn private_key_data_input(key: &SigningKey, path: &PATH, position: usize) -> Vec where PATH: IIndexPath { + let index = path.index_at_position(position); + let is_hardened = path.hardened_at_position(position); + + let i_is_31_bits = index.is_31_bits(); + let mut writer = Vec::::new(); + if is_hardened { + 0u8.consensus_encode(&mut writer).unwrap(); + writer.extend_from_slice(&key.to_bytes()); + } else { + panic!("For ED25519 only hardened derivation is supported"); + }; + if i_is_31_bits { + let mut small_i = index.u32_le(); + if is_hardened { + small_i |= BIP32_HARD; + } + small_i.swap_bytes().consensus_encode(&mut writer).unwrap(); + } else { + index.consensus_encode(&mut writer).unwrap(); + }; + writer + } + + fn public_key_data_input(key: &[u8; 32], path: &PATH, position: usize) -> Vec where PATH: IIndexPath { + let index = path.index_at_position(position); + let is_hardened = path.hardened_at_position(position); + if is_hardened { + panic!("can't derive private child key from public parent key"); + } + let mut writer = key.to_vec(); + if index.is_31_bits() { + writer.extend_from_slice(&index.u32_le().to_be_bytes()); + } else { + writer.extend_from_slice(&index); + }; + writer + } +} + +pub trait SignKey: Sized { + // type Inner; +} + +impl SignKey for [u8; 32] { /*type Inner = UInt256;*/ } +impl SignKey for SigningKey { /*type Inner = SigningKey;*/ } + +pub trait IChildKeyDerivation where SK: SignKey + ?Sized { + fn derive_child_private_key(key: &mut SK, chaincode: &mut [u8; 32], path: &PATH, position: usize) where PATH: IIndexPath; + fn derive_child_public_key(key: &mut PK, chaincode: &mut [u8; 32], path: &PATH, position: usize) where PATH: IIndexPath; +} + +pub fn secp256k1_point_from_byte_array(data: &[u8; 32]) -> [u8; 33] { + let sec = dashcore::secp256k1::SecretKey::from_byte_array(data).unwrap(); + let s = dashcore::secp256k1::Secp256k1::new(); + let pub_key = dashcore::secp256k1::PublicKey::from_secret_key(&s, &sec); + pub_key.serialize() +} + + +impl IChildKeyDerivation for ECDSAKey where Self: IChildKeyDerivationData { + fn derive_child_private_key(key: &mut [u8; 32], chaincode: &mut [u8; 32], path: &PATH, position: usize) + where PATH: IIndexPath { + let input = Self::private_key_data_input(key, path, position); + let i = hmac::(chaincode.as_ref(), input.as_ref()); + let mut sec_key = dashcore::secp256k1::SecretKey::from_byte_array(key).expect("invalid private key"); + let tweak = Scalar::from_be_bytes(clone_into_array(&i[..32])).expect("invalid tweak"); + sec_key = sec_key.add_tweak(&tweak).expect("failed to add tweak"); + key.copy_from_slice(&sec_key.secret_bytes()); + chaincode.copy_from_slice(&i[32..]); + } + + fn derive_child_public_key(key: &mut [u8; 33], chaincode: &mut [u8; 32], path: &PATH, position: usize) + where PATH: IIndexPath { + let input = Self::public_key_data_input(key, path, position); + let i = hmac::(chaincode.as_ref(), input.as_ref()); + let s = dashcore::secp256k1::Secp256k1::new(); + let mut pub_key = dashcore::secp256k1::PublicKey::from_slice(key).expect("invalid public key"); + let tweak = Scalar::from_be_bytes(clone_into_array(&i[..32])).expect("invalid tweak"); + pub_key = pub_key.add_exp_tweak(&s, &tweak).expect("failed to add exp tweak"); + chaincode.copy_from_slice(&i[32..]); + key.copy_from_slice(pub_key.serialize().as_slice()) + } +} + +impl IChildKeyDerivation for ED25519Key where Self: IChildKeyDerivationData { + fn derive_child_private_key(key: &mut SigningKey, chaincode: &mut [u8; 32], path: &PATH, position: usize) + where PATH: IIndexPath { + let input = Self::private_key_data_input(key, path, position); + let i = hmac::(chaincode.as_ref(), input.as_ref()); + let scalar: [u8; 32] = i[..32].try_into().unwrap(); + let signing_key = SigningKey::from(&scalar); + key.clone_from(&signing_key); + chaincode.copy_from_slice(&i[32..]); + } + + fn derive_child_public_key(key: &mut [u8; 32], chaincode: &mut [u8; 32], path: &PATH, position: usize) + where PATH: IIndexPath { + let input = Self::public_key_data_input(key, path, position); + let i = hmac::(chaincode.as_ref(), input.as_ref()); + let scalar: [u8; 32] = i[..32].try_into().unwrap(); + match VerifyingKey::from_bytes(&scalar) { + Ok(pub_key) => { + key.copy_from_slice(pub_key.as_bytes()); + chaincode.copy_from_slice(&i[32..]); + }, + Err(err) => panic!("{}", err) + } + } +} + +// #[test] +// pub fn test_identity_key() { +// // get_identities_for_wallets -> wallet_id: e1049d4399c689f4: index: 0: key: ECDSA(ECDSAKey { seckey: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], pubkey: [2, 63, 137, 159, 254, 152, 58, 243, 60, 149, 56, 138, 170, 139, 57, 131, 111, 6, 201, 51, 226, 108, 213, 101, 243, 23, 230, 50, 134, 44, 223, 38, 130], compressed: true, chaincode: [3, 209, 66, 1, 182, 0, 244, 102, 103, 196, 92, 56, 17, 157, 182, 98, 231, 68, 6, 220, 168, 235, 114, 138, 112, 27, 246, 174, 167, 252, 162, 168], fingerprint: 627235130, is_extended: true }) +// let pub_key: [u8; 33] = [2, 63, 137, 159, 254, 152, 58, 243, 60, 149, 56, 138, 170, 139, 57, 131, 111, 6, 201, 51, 226, 108, 213, 101, 243, 23, 230, 50, 134, 44, 223, 38, 130]; +// let key = ECDSAKey { +// seckey: [0; 32], +// pubkey: pub_key.to_vec(), +// compressed: true, +// chaincode: [3, 209, 66, 1, 182, 0, 244, 102, 103, 196, 92, 56, 17, 157, 182, 98, 231, 68, 6, 220, 168, 235, 114, 138, 112, 27, 246, 174, 167, 252, 162, 168], +// fingerprint: 627235130, +// is_extended: true, +// }; +// +// +// let index_path = IndexPath::new(vec![0 | BIP32_HARD, 0 | BIP32_HARD]); +// +// let public_key = key.public_key_from_extended_public_key_data_at_index_path(&index_path); +// assert!(public_key.is_ok()); +// } +// diff --git a/dash-spv-crypto/src/keys/ecdsa_key.rs b/dash-spv-crypto/src/keys/ecdsa_key.rs new file mode 100644 index 00000000..1c598f79 --- /dev/null +++ b/dash-spv-crypto/src/keys/ecdsa_key.rs @@ -0,0 +1,874 @@ +use std::array::TryFromSliceError; +use std::str::FromStr; +use byte::BytesExt; +use dashcore::consensus::Encodable; +use dashcore::hashes::{hash160, sha256, sha256d, Hash, hex::FromHex, sha512}; +use dashcore::secp256k1::{Error, Secp256k1}; +use dashcore::secp256k1::ecdsa::{RecoverableSignature, RecoveryId, Signature}; +use dashcore::secp256k1::hashes::hex::DisplayHex; +use dashcore::secp256k1::{Message, PublicKey, Scalar, SecretKey}; +use dashcore::secp256k1::ecdh::SharedSecret; +use log::warn; +use crate::bip::bip32; +use crate::bip::bip38::BIP38; +use crate::network::{ChainType, IHaveChainSettings, DASH_MESSAGE_MAGIC}; +use crate::derivation::{BIP32_HARD, IIndexPath, IndexPath}; +use crate::crypto::byte_util::{clone_into_array, Zeroable, Reversed, hmac, U32LE}; +use crate::keys::{KeyKind, KeyError, IKey, DeriveKey, OpaqueKey}; +use crate::keys::crypto_data::{CryptoData, DHKey}; +use crate::keys::dip14::{secp256k1_point_from_byte_array, IChildKeyDerivation}; +use crate::keys::key::IndexPathU256; +use crate::util::address::address; +use crate::util::address::address::is_valid_dash_private_key; +use crate::util::base58; +use crate::util::params::BIP32_SEED_KEY; +use crate::util::ScriptMap; +use crate::util::sec_vec::SecVec; + +const EXT_PUBKEY_SIZE: usize = 4 + size_of::<[u8; 32]>() + size_of::<[u8; 33]>(); + +pub fn calculate_fingerprint(key: &[u8; 32]) -> u32 { + SecretKey::from_byte_array(&key) + .map(|sk| PublicKey::from_secret_key(&Secp256k1::new(), &sk)) + .map(|pk| hash160::Hash::hash(&pk.serialize()).to_byte_array().u32_le()) + .unwrap_or(0) +} + +pub fn bip32_seed_key(seed: &[u8]) -> Result<([u8; 32], [u8; 32]), TryFromSliceError> { + let i = hmac::(BIP32_SEED_KEY.as_bytes(), seed); + let seckey = TryInto::<[u8; 32]>::try_into(&i[..32])?; + let chaincode = TryInto::<[u8; 32]>::try_into(&i[32..])?; + Ok((seckey, chaincode)) +} +#[derive(Clone, Debug, Default)] +#[ferment_macro::opaque] +pub struct ECDSAKey { + pub seckey: [u8; 32], + pub pubkey: Vec, + pub compressed: bool, + pub chaincode: [u8; 32], + pub fingerprint: u32, + pub is_extended: bool, +} + +impl ECDSAKey { + + pub fn with_shared_secret(secret: SharedSecret, compressed: bool) -> Self { + Self { pubkey: secret.secret_bytes().to_vec(), compressed, ..Default::default() } + } + + fn with_pubkey_compressed(pubkey: PublicKey, compressed: bool) -> Self { + Self { pubkey: if compressed { pubkey.serialize().to_vec() } else { pubkey.serialize_uncompressed().to_vec() }, compressed, ..Default::default() } + } + + fn with_seckey(seckey: SecretKey, compressed: bool) -> Self { + Self { seckey: seckey.secret_bytes(), compressed, ..Default::default() } + } + + fn with_seckey_and_chaincode(seckey: SecretKey, chaincode: [u8; 32], compressed: bool) -> Self { + Self { seckey: seckey.secret_bytes(), chaincode, compressed, ..Default::default() } + } + fn update_extended_params(&mut self, data: &[u8]) { + self.fingerprint = u32::from_le_bytes(clone_into_array(&data[0..4])); + self.chaincode = TryInto::<[u8; 32]>::try_into(&data[4..36]).unwrap(); + self.is_extended = true; + } + + pub fn public_key(&self) -> Result { + Self::public_key_from_bytes(&self.pubkey) + } + + pub fn secret_key(&self) -> Result { + Self::secret_key_from_bytes(&self.seckey) + } + + pub fn public_key_from_inner_secret_key_serialized(&self) -> Result, Error> { + self.secret_key() + .map(|ref secret_key| Self::public_key_from_secret_key_serialized(secret_key, self.compressed)) + } + + pub fn public_key_from_secret_key_serialized(secret_key: &SecretKey, compressed: bool) -> Vec { + let pubkey = PublicKey::from_secret_key(&Secp256k1::new(), secret_key); + if compressed { + pubkey.serialize().to_vec() + } else { + pubkey.serialize_uncompressed().to_vec() + } + } + + + fn private_derive_to_256bit_derivation_path_for_seckey_and_chaincode(seckey: [u8; 32], chaincode: [u8; 32], path: &PATH) -> Result + where Self: Sized, PATH: IIndexPath { + let mut seckey = seckey.clone(); + let mut chaincode = chaincode.clone(); + let mut fingerprint = 0u32; + let length = path.length(); + (0..length) + .into_iter() + .for_each(|position| { + if position + 1 == length { + fingerprint = calculate_fingerprint(&seckey); + } + Self::derive_child_private_key(&mut seckey, &mut chaincode, path, position) + }); + Ok(Self { seckey, chaincode, fingerprint, is_extended: true, compressed: true, ..Default::default() }) + + } + pub fn message_from_bytes(data: &[u8]) -> Result { + TryInto::<[u8; 32]>::try_into(data) + .map_err(|_| Error::InvalidMessage) + .map(Message::from_digest) + } + + pub fn public_key_from_bytes(data: &[u8]) -> Result { + PublicKey::from_slice(data) + } + + pub fn secret_key_from_bytes(data: &[u8]) -> Result { + SecretKey::from_slice(data) + } + + +} + +/// Shorthands +#[ferment_macro::export] +impl ECDSAKey { + pub fn key_with_secret_data(data: &[u8], compressed: bool) -> Result { + Self::secret_key_from_bytes(data) + .map_err(KeyError::from) + .map(|seckey| Self::with_seckey(seckey, compressed)) + } + pub fn key_with_extended_public_key_data(bytes: &[u8]) -> Result { + let len = bytes.len(); + match len { + 69 | 101 => { + let fingerprint = u32::from_le_bytes(clone_into_array(&bytes[0..4])); + let chaincode = TryInto::<[u8; 32]>::try_into(&bytes[4..36])?; + let data = &bytes[36..]; + let compressed = data.len() == 33; + let key = Self::public_key_from_bytes(data) + .map_err(KeyError::from)?; + Ok(Self { + fingerprint, + chaincode, + compressed, + pubkey: if compressed { key.serialize().to_vec() } else { key.serialize_uncompressed().to_vec() }, + is_extended: true, + ..Default::default() + }) + }, + len => Err(KeyError::WrongLength(len)) + } + } + + pub fn public_key_data_from_seed(seed: &[u8], compressed: bool) -> Option> { + Self::secret_key_from_bytes(seed) + .ok() + .map(|secret_key| + Self::public_key_from_secret_key_serialized(&secret_key, compressed)) + } + + pub fn key_with_secret(secret: &[u8; 32], compressed: bool) -> Result { + Self::secret_key_from_bytes(secret) + .map_err(KeyError::from) + .map(|seckey| Self::with_seckey(seckey, compressed)) + } + pub fn key_with_secret_hex(string: &str, compressed: bool) -> Result { + Vec::from_hex(string) + .map_err(KeyError::from) + .and_then(|data| Self::key_with_secret_data(&data, compressed)) + } + + pub fn key_recovered_from_compact_sig(compact_sig: &[u8], message_digest: [u8; 32]) -> Result { + Self::init_with_compact_sig(compact_sig, message_digest) + } + + pub fn key_with_private_key(private_key_string: &str, chain_type: ChainType) -> Result { + Self::init_with_private_key(private_key_string, chain_type) + } + + pub fn key_with_public_key_data(data: &[u8]) -> Result { + assert!(!data.is_empty()); + match data.len() { + 33 | 65 => Self::public_key_from_bytes(data) + .map(|pubkey| Self::with_pubkey_compressed(pubkey, data.len() == 33)) + .map_err(KeyError::from), + len => Err(KeyError::WrongLength(len)) + } + } + + pub fn init_with_compact_sig(compact_sig: &[u8], message_digest: [u8; 32]) -> Result { + if compact_sig.len() != 65 { + return Err(KeyError::WrongLength(compact_sig.len())); + } + let compressed = compact_sig[0] - 27 >= 4; + let recid = RecoveryId::try_from(((compact_sig[0] - 27) % 4) as i32) + .map_err(KeyError::from)?; + let sig = RecoverableSignature::from_compact(&compact_sig[1..], recid) + .map_err(KeyError::from)?; + let msg = Message::from_digest(message_digest); + let pk = Secp256k1::new().recover_ecdsa(&msg, &sig) + .map_err(KeyError::from)?; + Ok(Self::with_pubkey_compressed(pk, compressed)) + } + + pub fn init_with_seed_data(seed: &[u8]) -> Result { + let (secret, chaincode) = bip32_seed_key(seed).map_err(KeyError::from)?; + let secret_key = SecretKey::from_byte_array(&secret) + .map_err(KeyError::from)?; + Ok(Self::with_seckey_and_chaincode(secret_key, chaincode, true)) + } + + pub fn init_with_secret(secret: [u8; 32], compressed: bool) -> Result { + SecretKey::from_byte_array(&secret) + .map_err(KeyError::from) + .map(|secret_key| Self::with_seckey(secret_key, compressed)) + } + + pub fn init_with_extended_private_key_data(data: &[u8]) -> Result { + if data.len() < 68 { + return Err(KeyError::WrongLength(data.len())); + } + let secret = TryInto::<[u8; 32]>::try_into(&data[36..68]) + .map_err(KeyError::from)?; + let mut key = Self::init_with_secret(secret, true)?; + key.update_extended_params(data); + Ok(key) + } + + pub fn init_with_extended_public_key_data(data: &[u8]) -> Result { + let mut key = Self::init_with_public_key(data[36..].to_vec())?; + key.update_extended_params(data); + Ok(key) + } + + pub fn init_with_private_key(private_key: &str, chain_type: ChainType) -> Result { + match private_key.len() { + 0 => Err(KeyError::WrongLength(0)), + // mini private key format + 22 | 30 if private_key.starts_with('L') => match is_valid_dash_private_key(&private_key.to_string(), &chain_type.script_map()) { + true => SecretKey::from_str(private_key) + .map_err(KeyError::from) + .map(|data| Self::with_seckey(data, false)), + false => Err(KeyError::WrongFormat) + }, + _ => { + let mut d = base58::from_check(private_key).ok(); + if d.is_none() || d.as_ref().unwrap().len() == 28 { + d = base58::from(private_key).ok(); + } + if d.as_ref().is_none() || !(32..=34).contains(&d.as_ref().unwrap().len()) { + d = Vec::from_hex(private_key).ok(); + } + if d.as_ref().is_none() { + return Err(KeyError::WrongLength(0)); + } + let data = d.unwrap(); + match data.len() { + 33 | 34 if data[0] == chain_type.script_map().privkey => + Self::secret_key_from_bytes(&data[1..33]) + .map_err(KeyError::from) + .map(|seckey| Self::with_seckey(seckey, data.len() == 34)), + 32 => + Self::secret_key_from_bytes(&data[..]) + .map_err(KeyError::from) + .map(|seckey| Self::with_seckey(seckey, false)), + len => + Err(KeyError::WrongLength(len)), + } + } + } + } + + pub fn init_with_public_key(public_key: Vec) -> Result { + assert!(!public_key.is_empty(), "public_key is empty"); + match public_key.len() { + 33 | 65 => Self::public_key_from_bytes(&public_key) + .map_err(KeyError::from) + .map(|pubkey| Self::with_pubkey_compressed(pubkey, public_key.len() == 33)), + _ => Err(KeyError::WrongLength(public_key.len())) + } + } + + pub fn key_with_extended_private_key_data(data: &[u8]) -> Result { + if data.len() < 68 { + return Err(KeyError::WrongLength(data.len())); + } + let secret = TryInto::<[u8; 32]>::try_into(&data[36..68]) + .map_err(KeyError::from)?; + let mut key = Self::init_with_secret(secret, true)?; + key.update_extended_params(data); + Ok(key) + } + + /// Pieter Wuille's compact signature encoding used for bitcoin message signing + /// to verify a compact signature, recover a public key from the signature and verify that it matches the signer's pubkey + pub fn compact_sign(&self, message_digest: &[u8]) -> [u8; 65] { + let mut sig = [0u8; 65]; + if self.seckey.is_zero() { + warn!("Can't sign with a public key"); + return sig; + } + let secp = Secp256k1::new(); + let msg = Self::message_from_bytes(message_digest).unwrap(); + let seckey = self.secret_key().unwrap(); + let rec_sig = secp.sign_ecdsa_recoverable(&msg, &seckey); + let (rec_id, bytes) = rec_sig.serialize_compact(); + + let version = 27 + i32::from(rec_id) as u8 + if self.compressed { 4 } else { 0 }; + sig[0] = version; + sig[1..].copy_from_slice(&bytes); + sig + } + pub fn key_with_compact_sig(compact_sig: &[u8], message_digest: [u8; 32]) -> Result { + if compact_sig.len() != 65 { + return Err(KeyError::Any(Error::InvalidSignature.to_string())); + } + let rec_id = RecoveryId::try_from(((compact_sig[0] - 27) % 4) as i32)?; + let sig = RecoverableSignature::from_compact(&compact_sig[1..], rec_id)?; + let msg = Message::from_digest(message_digest); + let pubkey = Secp256k1::new() + .recover_ecdsa(&msg, &sig) + .map_err(KeyError::from)?; + Ok(ECDSAKey::with_pubkey_compressed(pubkey, compact_sig[0] - 27 >= 4)) + } + pub fn deprecated_incorrect_extended_public_key_from_seed( + secret: &[u8], + chaincode: &[u8], + hashes: &[u8], + derivation_len: usize) + -> Result { + let seckey = ECDSAKey::key_with_secret_data(secret, true)?; + let mut chaincode = TryInto::<[u8; 32]>::try_into(chaincode).map_err(KeyError::from)?; + let mut key = TryInto::<[u8; 32]>::try_into(secret).map_err(KeyError::from)?; + let mut writer = SecVec::new(); + let hashed_key = seckey.hash160(); + u32::from_le_bytes(clone_into_array(&hashed_key[..4])).consensus_encode(&mut writer).unwrap(); + for position in 0..derivation_len { + let soft_index = hashes.read_with::(&mut position.clone(), byte::LE) + .map_err(KeyError::from)? as u32; + let buf = &mut [0u8; 37]; + if soft_index & BIP32_HARD != 0 { + buf[1..33].copy_from_slice(&key); + } else { + buf[..33].copy_from_slice(&secp256k1_point_from_byte_array(&key)); + } + buf[33..37].copy_from_slice(soft_index.to_be_bytes().as_slice()); + let i = hmac::(chaincode.as_ref(), buf); + let mut sec_key = SecretKey::from_byte_array(&key) + .map_err(KeyError::from)?; + let tweak = Scalar::from_be_bytes(clone_into_array(&i[..32])).expect("invalid tweak"); + sec_key = sec_key.add_tweak(&tweak).expect("failed to add tweak"); + key.copy_from_slice(&sec_key.secret_bytes()); + chaincode.copy_from_slice(&i[32..]); + } + ECDSAKey::key_with_secret(&key, true) + .and_then(|seckey| { + chaincode.consensus_encode(&mut writer).unwrap(); + writer.extend(seckey.public_key_data()); + ECDSAKey::key_with_extended_public_key_data(&writer) + }) + } + + pub fn deprecated_incorrect_extended_public_key_from_seed_as_opaque(secret: &[u8], + chaincode: &[u8], + hashes: &[u8], + derivation_len: usize) + -> Result { + Self::deprecated_incorrect_extended_public_key_from_seed(secret, chaincode, hashes, derivation_len) + .map(OpaqueKey::ECDSA) + } + pub fn hash160(&self) -> [u8; 20] { + hash160::Hash::hash(&self.public_key_data()).to_byte_array() + } + + pub fn public_key_from_extended_public_key_data_at_u32_path(&self, index_path: Vec) -> Result { + let index_path = IndexPath::from(index_path); + self.extended_public_key_data() + .and_then(|ext_pk_data| Self::public_key_from_extended_public_key_data(&ext_pk_data, &index_path)) + .and_then(|pub_key_data| Self::key_with_public_key_data(&pub_key_data)) + } + pub fn serialized_extended_private_key_from_seed_at_u256_path(seed: &[u8], index_path: IndexPathU256, chain_type: ChainType) -> Result { + let index_path = IndexPath::from(index_path); + let (secret, chaincode) = bip32_seed_key(seed) + .map_err(KeyError::from)?; + let ECDSAKey { fingerprint, chaincode, seckey, .. } = Self::private_derive_to_256bit_derivation_path_for_seckey_and_chaincode(secret, chaincode, &index_path)?; + let depth = index_path.length() as u8; + let child = if index_path.is_empty() { [0u8; 32] } else { index_path.last_index() }; + Ok(bip32::Key::new( + depth, + fingerprint, + child, + chaincode, + seckey.to_vec(), + index_path.last_hardened()) + .serialize(chain_type)) + + } + pub fn serialized_private_master_key_from_seed(seed: &[u8], chain_type: ChainType) -> String { + let (seckey, chaincode) = bip32_seed_key(seed) + .expect("Master Seed invalid"); + bip32::Key::new(0, 0, [0; 32], chaincode, seckey.to_vec(), false) + .serialize(chain_type) + } + + pub fn public_key_unique_id_from_derived_key_data(derived_key_data: &[u8], chain_type: ChainType) -> u64 { + if let Ok((seckey, _chaincode)) = bip32_seed_key(derived_key_data) { + if let Ok(key) = Self::key_with_secret(&seckey, true) { + let data = key.public_key_data(); + let mut writer = SecVec::new(); + writer.extend(chain_type.genesis_hash()); + writer.extend(data); + // one way injective function? + let unique_id = sha256::Hash::hash(&writer).to_byte_array(); + return u64::from_le_bytes(clone_into_array(&unique_id[..8])) + } + } + 0 + + } + pub fn serialized_auth_private_key_from_seed_for_chain(seed: &[u8], chain_type: ChainType) -> String { + Self::serialized_auth_private_key_from_seed(seed, chain_type.script_map()) + } + + pub fn serialized_from_bip38_key(key_string: &str, passphrase: &str, chain_type: ChainType) -> Result { + let script_map = chain_type.script_map(); + BIP38::key_with_bip38_key(key_string, passphrase, &script_map) + .map(|key: ECDSAKey| key.serialized_private_key_for_script(script_map.privkey)) + } + pub fn is_valid_bip38_key(key_string: &str) -> bool { + ::is_valid_bip38_key(key_string) + } + pub fn is_empty_secret_key(&self) -> bool { + self.seckey.is_zero() + } + pub fn contains_secret_key(string_key: &str, chain_type: ChainType) -> bool { + Self::key_with_private_key(string_key, chain_type) + .map(|key| key.seckey.is_zero()) + .unwrap_or(false) + } + pub fn public_key_data_for_private_key(string_key: &str, chain_type: ChainType) -> Result, KeyError> { + Self::key_with_private_key(string_key, chain_type) + .map(|key| key.public_key_data()) + } + + pub fn address_from_public_key_data(data: &[u8], chain_type: ChainType) -> Option { + Self::key_with_public_key_data(data) + .map(|key| key.address_with_public_key_data(chain_type)) + .ok() + } + pub fn address_from_recovered_compact_sig(compact_sig: &[u8], digest: [u8; 32], chain_type: ChainType) -> Result { + Self::key_with_compact_sig(compact_sig, digest) + .map(|key| key.address_with_public_key_data(chain_type)) + } + + pub fn pro_reg_tx_verify_payload_signature(signature: &[u8], payload: &[u8], owner_key_hash: [u8; 20]) -> bool { + Self::key_with_compact_sig(signature, sha256d::Hash::hash(payload).to_byte_array()) + .map(|key| key.hash160().eq(&owner_key_hash)) + .unwrap_or(false) + } + + pub fn pro_reg_tx_payload_collateral_digest(payload: &[u8], script_payout: &[u8], operator_reward: u16, owner_key_hash: [u8; 20], voter_key_hash: [u8; 20], chain_type: ChainType) -> [u8; 32] { + let mut writer = Vec::::new(); + let script_map = chain_type.script_map(); + DASH_MESSAGE_MAGIC.to_string().consensus_encode(&mut writer).unwrap(); + let payout_address = address::with_script_pub_key(&script_payout.to_vec(), &script_map) + .expect("Can't extract payout address"); + let payload_hash = sha256d::Hash::hash(payload).to_byte_array().reversed(); + let owner_address = address::from_hash160_for_script_map(&owner_key_hash, &script_map); + let voter_address = address::from_hash160_for_script_map(&voter_key_hash, &script_map); + let payload_collateral_string = format!("{}|{}|{}|{}|{}", payout_address, operator_reward, owner_address, voter_address, payload_hash.to_lower_hex_string()); + payload_collateral_string.consensus_encode(&mut writer).unwrap(); + sha256d::Hash::hash(&writer).to_byte_array() + } +} + +#[ferment_macro::export] +impl IKey for ECDSAKey { + + fn kind(&self) -> KeyKind { + KeyKind::ECDSA + } + + fn secret_key_string(&self) -> String { + if self.has_private_key() { + self.seckey.to_lower_hex_string() + } else { + String::new() + } + } + + fn has_private_key(&self) -> bool { + !self.seckey.is_zero() + } + fn address_with_public_key_data(&self, chain: ChainType) -> String { + address::with_public_key_data(&self.public_key_data(), chain) + } + + fn sign(&self, data: &[u8]) -> Vec { + if self.seckey.is_zero() { + warn!("There is no seckey for sign"); + return vec![]; + } + match (Self::message_from_bytes(data), self.secret_key()) { + // todo: check should we truncate up to 72 + (Ok(msg), Ok(seckey)) => Secp256k1::new().sign_ecdsa(&msg, &seckey).serialize_der().to_vec(), + _ => vec![] + } + } + + fn hash_and_sign(&self, data: Vec) -> Vec { + let hash = sha256d::Hash::hash(&data); + self.sign(hash.as_ref()) + } + fn verify(&mut self, message_digest: &[u8], signature: &[u8]) -> Result { + if signature.len() > 65 { + // not compact + Self::public_key_from_bytes(&self.public_key_data()) + .and_then(|pk| Signature::from_der(&signature) + .and_then(|sig| Self::message_from_bytes(message_digest) + .and_then(|msg| Secp256k1::new().verify_ecdsa(&msg, &sig, &pk).map(|_| true)))) + .map_err(KeyError::from) + } else { + // compact + let digest = TryInto::<[u8; 32]>::try_into(message_digest).map_err(KeyError::from)?; + Self::key_recovered_from_compact_sig(signature, digest) + .map(|key| key.public_key_data().eq(&self.public_key_data())) + } + } + + fn secret_key(&self) -> [u8; 32] { + self.seckey + } + + fn chaincode(&self) -> [u8; 32] { + self.chaincode + } + + fn fingerprint(&self) -> u32 { + self.fingerprint + } + + fn private_key_data(&self) -> Result, KeyError> { + match self.seckey.is_zero() { + true => Err(KeyError::EmptySecKey), + false => Ok(self.seckey.to_vec()) + } + } + + fn public_key_data(&self) -> Vec { + if self.pubkey.is_empty() && self.has_private_key() { + let seckey = self.secret_key().unwrap(); + let pubkey = PublicKey::from_secret_key(&Secp256k1::new(), &seckey); + let serialized = if self.compressed { + pubkey.serialize().to_vec() + } else { + pubkey.serialize_uncompressed().to_vec() + }; + return serialized; + } + self.pubkey.clone() + } + + fn extended_private_key_data(&self) -> Result { + match (self.is_extended, self.private_key_data()) { + (true, Ok(private_key_data)) => { + // TODO: secure data + //NSMutableData *data = [NSMutableData secureData]; + let mut writer = SecVec::new(); + self.fingerprint.consensus_encode(&mut writer).unwrap(); + self.chaincode.consensus_encode(&mut writer).unwrap(); + writer.extend(private_key_data); + // private_key_data.enc(&mut writer); + Ok(writer) + }, + _ => Err(KeyError::Extended(self.is_extended)) + } + } + + fn extended_public_key_data(&self) -> Result, KeyError> { + match self.is_extended { + true => { + let mut writer = Vec::::new(); + self.fingerprint.consensus_encode(&mut writer).unwrap(); + self.chaincode.consensus_encode(&mut writer).unwrap(); + writer.extend(self.public_key_data()); + Ok(writer) + }, + extended => Err(KeyError::Extended(extended)) + } + } + + fn serialized_private_key_for_script(&self, chain_prefix: u8) -> String { + let mut writer = SecVec::with_capacity(if self.compressed { 34 } else { 33 }); + chain_prefix.consensus_encode(&mut writer).unwrap(); + self.seckey.consensus_encode(&mut writer).unwrap(); + if self.compressed { + b'\x01'.consensus_encode(&mut writer).unwrap(); + } + base58::check_encode_slice(&writer) + } + + fn hmac_256_data(&self, data: &[u8]) -> [u8; 32] { + hmac::(&self.seckey, data) + } + + fn forget_private_key(&mut self) { + self.public_key_data_mut(); + self.seckey = [0u8; 32]; + } + + fn sign_message_digest(&self, digest: [u8; 32]) -> Vec { + self.compact_sign(&digest) + .to_vec() + } + fn private_key_data_equal_to(&self, other_private_key_data: &[u8; 32]) -> bool { + self.seckey.eq(other_private_key_data) + } + + fn public_key_data_equal_to(&self, other_public_key_data: &Vec) -> bool { + self.public_key_data().eq(other_public_key_data) + } +} + +impl ECDSAKey { + + + pub(crate) fn public_key_data_mut(&mut self) -> Vec { + if self.pubkey.is_empty() && self.has_private_key() { + // let mut d = Vec::::with_capacity(if self.compressed { 33 } else { 65 }); + let seckey = self.secret_key().unwrap(); + let pubkey = PublicKey::from_secret_key(&Secp256k1::new(), &seckey); + self.pubkey = if self.compressed { + pubkey.serialize().to_vec() + } else { + pubkey.serialize_uncompressed().to_vec() + }; + } + self.pubkey.clone() + } + + + + pub fn serialized_auth_private_key_from_seed(seed: &[u8], script_map: ScriptMap) -> String { + let (mut seckey, mut chaincode) = bip32_seed_key(seed).expect(""); + // path m/1H/0 (same as copay uses for bitauth) + let path = IndexPath::new(vec![1 | BIP32_HARD, 0]); + Self::derive_child_private_key(&mut seckey, &mut chaincode, &path, 0); + Self::derive_child_private_key(&mut seckey, &mut chaincode, &path, 1); + // derive_child_private_key(&mut seckey, &mut chaincode, 1 | BIP32_HARD); + // derive_child_private_key(&mut seckey, &mut chaincode, 0); + let mut writer = SecVec::new(); + script_map.privkey.consensus_encode(&mut writer).unwrap(); + writer.extend_from_slice(&seckey); + b'\x01'.consensus_encode(&mut writer).unwrap(); // specifies compressed pubkey format + base58::check_encode_slice(&writer) + } + + + pub fn public_key_from_extended_public_key_data(data: &[u8], path: &PATH) -> Result, KeyError> + where PATH: IIndexPath { + match data.len() { + EXT_PUBKEY_SIZE.. => { + let mut c = TryInto::<[u8; 32]>::try_into(&data[4..36]).map_err(KeyError::from)?; + let mut k = TryInto::<[u8; 33]>::try_into(&data[36..69]).map_err(KeyError::from)?; + (0..path.length()) + .into_iter() + .for_each(|position| Self::derive_child_public_key(&mut k, &mut c, path, position)); + Ok(k.to_vec()) + }, + _ => Err(KeyError::WrongLength(data.len())) + } + } + +} +/// For FFI +impl ECDSAKey { + + pub fn public_key_from_extended_public_key_data_at_index_path(&self, index_path: &PATH) -> Result + where Self: Sized, + PATH: IIndexPath { + self.extended_public_key_data() + .and_then(|ext_pk_data| Self::public_key_from_extended_public_key_data(&ext_pk_data, index_path)) + .and_then(|pub_key_data| Self::key_with_public_key_data(&pub_key_data)) + } +} + +impl DeriveKey> for ECDSAKey { + fn private_derive_to_path(&self, path: &IndexPath) -> Result { + let mut seckey = self.seckey.clone(); + let mut chaincode = self.chaincode.clone(); + let mut fingerprint = 0u32; + let length = path.length(); + (0..length) + .into_iter() + .for_each(|position| { + if position + 1 == length { + fingerprint = calculate_fingerprint(&seckey); + } + Self::derive_child_private_key(&mut seckey, &mut chaincode, path, position); + }); + Ok(Self { seckey, chaincode, fingerprint, is_extended: true, compressed: true, ..Default::default() }) + } + + fn public_derive_to_path_with_offset(&self, _path: &IndexPath, _offset: usize) -> Result { + unimplemented!("ECDSAKey::public_derive_to_path_with_offset") + } +} + +impl DeriveKey> for ECDSAKey { + fn private_derive_to_path(&self, path: &IndexPath<[u8; 32]>) -> Result { + Self::private_derive_to_256bit_derivation_path_for_seckey_and_chaincode(self.seckey, self.chaincode, path) + } + + fn public_derive_to_path_with_offset(&self, path: &IndexPath<[u8; 32]>, offset: usize) -> Result { + assert!(path.length() > offset, "derivation path offset must be smaller than the its length"); + let mut chaincode = self.chaincode.clone(); + let mut data = TryInto::<[u8; 33]>::try_into(self.public_key_data().as_slice()).map_err(KeyError::from)?; + let mut fingerprint = 0u32; + let length = path.length(); + (offset..length) + .into_iter() + .for_each(|position| { + if position + 1 == length { fingerprint = hash160::Hash::hash(data.as_ref()).to_byte_array().u32_le(); } + Self::derive_child_public_key(&mut data, &mut chaincode, path, position) + }); + if let Ok(mut child_key) = Self::public_key_from_bytes(&data).map(|pubkey| Self::with_pubkey_compressed(pubkey, true)) { + child_key.chaincode = chaincode; + child_key.fingerprint = fingerprint; + child_key.is_extended = true; + Ok(child_key) + } else { + assert!(false, "Public key should be created"); + Err(KeyError::UnableToDerive) + } + } +} + +impl DHKey for ECDSAKey { + fn init_with_dh_key_exchange_with_public_key(public_key: &mut Self, private_key: &Self) -> Result + where Self: Sized { + match (Self::public_key_from_bytes(&public_key.public_key_data()), + Self::secret_key_from_bytes(&private_key.seckey)) { + (Ok(pubkey), Ok(seckey)) => Ok(Self::with_shared_secret(SharedSecret::new(&pubkey, &seckey), false)), + _ => Err(KeyError::DHKeyExchange) + } + } +} + +impl CryptoData for Vec { + fn encrypt_with_secret_key_using_iv(&mut self, secret_key: &ECDSAKey, public_key: &ECDSAKey, initialization_vector: Vec) -> Result, KeyError> { + let mut destination = initialization_vector.clone(); + secret_key.secret_key() + .map_err(KeyError::from) + .and_then(|scalar| ECDSAKey::secret_key_from_bytes(&public_key.seckey) + .and_then(|seckey| ECDSAKey::public_key_from_bytes(&ECDSAKey::public_key_from_secret_key_serialized(&seckey, false))) + .map(|pubkey| SharedSecret::new(&pubkey, &scalar)) + .map_err(KeyError::from) + .and_then(|shared_secret| >::encrypt(self, shared_secret.secret_bytes(), initialization_vector)) + .map(|encrypted_data| { + destination.extend(encrypted_data); + destination + }) + ) + } + + fn decrypt_with_secret_key_using_iv_size(&mut self, secret_key: &ECDSAKey, public_key: &ECDSAKey, iv_size: usize) -> Result, KeyError> { + if self.len() < iv_size { + return Err(KeyError::WrongLength(self.len())); + } + ECDSAKey::secret_key_from_bytes(&public_key.seckey) + .and_then(|seckey| ECDSAKey::public_key_from_bytes(&ECDSAKey::public_key_from_secret_key_serialized(&seckey, false))) + .map_err(KeyError::from) + .map(|pubkey| SharedSecret::new(&pubkey, &secret_key.secret_key().unwrap())) + .and_then(|shared_secret| + >::decrypt(self[iv_size..self.len()].to_vec(), shared_secret.secret_bytes(), &self[..iv_size])) + } + + fn encrypt_with_dh_key_using_iv(&self, key: &ECDSAKey, initialization_vector: Vec) -> Result, KeyError> { + let mut destination = initialization_vector.clone(); + let pubkey_data = key.public_key_from_inner_secret_key_serialized() + .unwrap_or(key.public_key_data()); + // TODO: make it crash-safe + if pubkey_data.is_empty() { + Err(KeyError::DHKeyExchange) + } else { + match (TryInto::<[u8; 32]>::try_into(&pubkey_data[..32]), + TryInto::<[u8; 16]>::try_into(initialization_vector)) { + (Ok(key_data), Ok(iv_data)) => + >::encrypt(self, key_data, iv_data) + .map(|encrypted_data| { + destination.extend(encrypted_data); + destination + }), + _ => Err(KeyError::DHKeyExchange) + } + } + } + + fn decrypt_with_dh_key_using_iv_size(&self, key: &ECDSAKey, iv_size: usize) -> Result, KeyError> { + key.public_key_from_inner_secret_key_serialized() + .map_err(KeyError::from) + .and_then(|sym_key_data| sym_key_data[..32].try_into().map_err(KeyError::from)) + .and_then(|key_data: [u8; 32]| self[..iv_size].try_into().map_err(KeyError::from) + .and_then(|iv_data: [u8; 16]| + >::decrypt(self[iv_size..self.len()].to_vec(), key_data, iv_data))) + } +} + +#[test] +fn test_keys() { + let extended_public_key_data_string = "3dc2e416b0f9fcfd74fe847ccd80f71cf961e7c4ddede29ce5e4b72a19ebccf2831ba2d803740b52e94ad4d526ff2b4340646b2ce1423545755b5825fabc741d1d74c155d7"; + let extended_public_key_data = Vec::from_hex(extended_public_key_data_string).unwrap(); + let extended_public_key = ECDSAKey::key_with_extended_public_key_data(&extended_public_key_data) + .expect("ECDSA Key restored from extended public key data") + .extended_public_key_data() + .expect("Deserialized extended public key data"); + assert_eq!(extended_public_key.to_lower_hex_string(), extended_public_key_data_string); +} + +#[test] +fn test_ecdsa_encryption_and_decryption() { + let alice_secret = <[u8; 32]>::from_hex("0000000000000000000000000000000000000000000000000000000000000001").unwrap(); + let alice_key_pair = ECDSAKey::key_with_secret(&alice_secret, true).unwrap(); + let bob_secret = <[u8; 32]>::from_hex("fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140").unwrap(); + let mut bob_key_pair = ECDSAKey::key_with_secret(&bob_secret, true).unwrap(); + let key = ECDSAKey::init_with_dh_key_exchange_with_public_key(&mut bob_key_pair, &alice_key_pair).unwrap(); + let key_public_key_data_hex = key.public_key_data().to_lower_hex_string(); + assert_eq!(key_public_key_data_hex, "fbd27dbb9e7f471bf3de3704a35e884e37d35c676dc2cc8c3cc574c3962376d2", "they should be the same data"); + let secret = "my little secret is a pony that never sleeps"; + let mut data = secret.as_bytes().to_vec(); + // Alice is sending to Bob + let iv = Vec::from_hex("eac5bcd6eb85074759e0261497428c9b").unwrap(); + let encrypted = CryptoData::::encrypt_with_secret_key_using_iv(&mut data, &alice_key_pair, &bob_key_pair, iv); + assert!(encrypted.is_ok(), "Encrypted data is None"); + let mut encrypted = encrypted.unwrap(); + assert_eq!(encrypted.to_lower_hex_string(), "eac5bcd6eb85074759e0261497428c9b3725d3b9ec4d739a842116277c6ace81549089be0d11a54ee09a99dcf7ac695a8ea56d41bf0b62def90b6f78f8b0aca9"); + // Bob is receiving from Alice + let decrypted = CryptoData::::decrypt_with_secret_key(&mut encrypted, &bob_key_pair, &alice_key_pair); + assert!(decrypted.is_ok(), "Decrypted data is None"); + let decrypted = decrypted.unwrap(); + let decrypted_str = String::from_utf8(decrypted).unwrap(); + assert_eq!(secret, decrypted_str.as_str(), "they should be the same string"); +} + +#[test] +fn derive_key_at_index_path() { + let extended_private_key_data_str = Vec::from_hex("5f70ad115eeaf19db00e31f0a7704afdca5c1548e9923c3fa21ebd74293fc6b0befdc3745699f5d010021c6af63e9fb1522c5a9d0bcf8dba87a174ca5c2cb5f28df5e6bd").unwrap(); + let key = ECDSAKey::key_with_extended_private_key_data(&extended_private_key_data_str).expect("Key"); + // let indexes[] = {(unusedIndex + i) | BIP32_HARD, 0 | BIP32_HARD}; + + let index_path = IndexPath::new(vec![0 | BIP32_HARD, 0 | BIP32_HARD]); + let result = key.private_derive_to_path(&index_path).expect("Derived key"); + println!("prv: {}", key.private_key_data().map_or("".to_string(), |data| data.to_lower_hex_string())); + println!("pub: {}", key.public_key_data().to_lower_hex_string()); + println!("chain: {}", key.chaincode.to_lower_hex_string()); + println!("child prv: {}", result.private_key_data().map_or("".to_string(), |data| data.to_lower_hex_string())); + println!("child pub: {}", result.public_key_data().to_lower_hex_string()); + println!("child chain: {}", result.chaincode.to_lower_hex_string()); + + // childKey prv: 8f2aa37d18d2619f553f9ff18830dafacc062a1fee109c9924ed111eb5491c8e + // childKey pub: 027735f24c8d9d581c2c77072d420bdd96d5bf2868087d33d4550f45ddf5182a21 + +} \ No newline at end of file diff --git a/dash-spv-crypto/src/keys/ed25519_key.rs b/dash-spv-crypto/src/keys/ed25519_key.rs new file mode 100644 index 00000000..b92dc66b --- /dev/null +++ b/dash-spv-crypto/src/keys/ed25519_key.rs @@ -0,0 +1,362 @@ +use std::array::TryFromSliceError; +use dashcore::consensus::Encodable; +use dashcore::hashes::hex::FromHex; +use dashcore::hashes::{hash160, sha256, sha256d, sha512, Hash}; +use dashcore::secp256k1::hashes::hex::DisplayHex; +use ed25519_dalek::{Signature, SignatureError, Signer, SigningKey, Verifier, VerifyingKey}; +use log::warn; +use crate::crypto::byte_util::{clone_into_array, hmac, Zeroable, U32LE}; +use crate::derivation::{IIndexPath, IndexPath}; +use crate::keys::{IKey, KeyKind, dip14::IChildKeyDerivation, KeyError, DeriveKey}; +use crate::network::ChainType; +use crate::util::address::address; +use crate::util::base58; +use crate::util::params::ED25519_SEED_KEY; +use crate::util::sec_vec::SecVec; + +// TODO: check we need to use ECPoint here +const EXT_PUBKEY_SIZE: usize = 4 + size_of::<[u8; 32]>() + size_of::<[u8; 32]>(); + +pub fn seed_key(seed: &[u8]) -> Result<([u8; 32], [u8; 32]), TryFromSliceError> { + let i = hmac::(ED25519_SEED_KEY.as_bytes(), seed); + let seckey = TryInto::<[u8; 32]>::try_into(&i[..32])?; + let chaincode = TryInto::<[u8; 32]>::try_into(&i[32..])?; + Ok((seckey, chaincode)) +} +#[derive(Clone, Debug, Default)] +#[ferment_macro::opaque] +pub struct ED25519Key { + pub seckey: [u8; 32], + pub pubkey: Vec, + pub chaincode: [u8; 32], + pub fingerprint: u32, + pub is_extended: bool, +} + + + +#[ferment_macro::export] +impl ED25519Key { + pub fn key_with_extended_public_key_data(bytes: &[u8]) -> Result { + match bytes.len() { + // if len == 68 || len == 69 { + 68 => { + let fingerprint = u32::from_le_bytes(clone_into_array(&bytes[0..4])); + let chaincode = TryInto::<[u8; 32]>::try_into(&bytes[4..36])?; + let data = &bytes[36..68]; + // if len == 69 { + // // skip 1st byte as pub key was padded with 0x00 + // *offset += 1; + // } + Self::public_key_from_bytes(data) + .map_err(KeyError::from) + .map(|pubkey| Self::init_with_extended_public_parts(pubkey.as_bytes().to_vec(), chaincode, fingerprint)) + }, + len => Err(KeyError::WrongLength(len)) + } + } + pub fn key_with_extended_private_key_data(bytes: &[u8]) -> Result { + match bytes.len() { + 69 => { + let fingerprint = u32::from_le_bytes(clone_into_array(&bytes[0..4])); + let chaincode = TryInto::<[u8; 32]>::try_into(&bytes[4..36])?; + let seckey = TryInto::<[u8; 32]>::try_into(&bytes[36..68])?; + Ok(Self::init_with_extended_private_parts(seckey, chaincode, fingerprint)) + }, + len => Err(KeyError::WrongLength(len)) + } + } + pub fn key_with_private_key(string: &str) -> Result { + Vec::from_hex(string.as_bytes().to_lower_hex_string().as_str()) + .map_err(KeyError::from) + .and_then(|data| Self::key_with_secret_data(&data)) + } + pub fn key_with_secret_data(data: &[u8]) -> Result { + Self::secret_key_from_bytes(data) + .map_err(KeyError::from) + .map(|seckey| Self { seckey: seckey.to_bytes(), ..Default::default() }) + } + pub fn hash160(&self) -> [u8; 20] { + hash160::Hash::hash(&self.public_key_data()).to_byte_array() + } + +} + +#[ferment_macro::export] +impl IKey for ED25519Key { + + fn kind(&self) -> KeyKind { + KeyKind::ED25519 + } + + fn secret_key_string(&self) -> String { + self.seckey.to_lower_hex_string() + } + + fn has_private_key(&self) -> bool { + !self.seckey.is_zero() + } + fn address_with_public_key_data(&self, chain: ChainType) -> String { + address::with_public_key_data(&self.public_key_data(), chain) + } + + fn sign(&self, data: &[u8]) -> Vec { + if self.seckey.is_zero() { + warn!("There is no seckey for sign"); + return vec![]; + } + let signing_key: SigningKey = self.seckey.into(); + match signing_key.try_sign(data) { + Ok(signature) => signature.to_vec(), + Err(err) => { + warn!("ED25519Key::sign::error {}", err); + vec![] + } + } + } + + fn hash_and_sign(&self, data: Vec) -> Vec { + let hash = sha256d::Hash::hash(&data); + self.sign(hash.as_ref()) + } + fn verify(&mut self, message_digest: &[u8], signature: &[u8]) -> Result { + // todo: check if this needed & correct + Signature::from_slice(signature) + .map_err(KeyError::from) + .map(|s| SigningKey::from(self.seckey).verifying_key().verify(message_digest, &s).is_ok()) + // Signature::from_slice(signature) + // .map_or(false, |s| SigningKey::from(self.seckey) + // .verifying_key() + // .verify(message_digest, &s) + // .is_ok()) + } + + fn secret_key(&self) -> [u8; 32] { + self.seckey + } + + fn chaincode(&self) -> [u8; 32] { + self.chaincode + } + + fn fingerprint(&self) -> u32 { + self.fingerprint + } + + fn private_key_data(&self) -> Result, KeyError> { + match self.seckey.is_zero() { + true => Err(KeyError::EmptySecKey), + false => Ok(self.seckey.to_vec()) + } + } + + fn public_key_data(&self) -> Vec { + if !self.pubkey.is_empty() { + self.pubkey.to_vec() + } else { + let signing_key: SigningKey = self.seckey.into(); + let public_key = signing_key.verifying_key(); + public_key.as_bytes().to_vec() + // ECPoint::from(signing_key.verifying_key()).0.to_vec() + } + } + + fn extended_private_key_data(&self) -> Result { + match self.is_extended { + true => self.private_key_data().map(|private_key_data| { + // TODO: secure allocator + let mut writer = SecVec::new(); + self.fingerprint.consensus_encode(&mut writer).unwrap(); + self.chaincode.consensus_encode(&mut writer).unwrap(); + writer.extend(private_key_data); + writer + }), + extended => Err(KeyError::Extended(extended)) + } + } + + fn extended_public_key_data(&self) -> Result, KeyError> { + match self.is_extended { + true => { + let mut writer = Vec::::new(); + self.fingerprint.consensus_encode(&mut writer).unwrap(); + self.chaincode.consensus_encode(&mut writer).unwrap(); + writer.extend(self.public_key_data()); + Ok(writer) + }, + extended => Err(KeyError::Extended(extended)) + } + } + + fn serialized_private_key_for_script(&self, chain_prefix: u8) -> String { + let mut writer = SecVec::with_capacity(33); + chain_prefix.consensus_encode(&mut writer).unwrap(); + self.seckey.consensus_encode(&mut writer).unwrap(); + // todo: should we add additional byte here ? + // if self.compressed { + // b'\x01'.consensus_encode(&mut writer).unwrap(); + // } + base58::check_encode_slice(&writer) + } + + fn hmac_256_data(&self, data: &[u8]) -> [u8; 32] { + hmac::(&self.seckey, data) + } + + fn forget_private_key(&mut self) { + if self.pubkey.is_empty() && !self.seckey.is_zero() { + let signing_key: SigningKey = self.seckey.into(); + let public_key = signing_key.verifying_key(); + self.pubkey = public_key.as_bytes().to_vec(); + } + self.seckey = [0u8; 32]; + } + + fn sign_message_digest(&self, digest: [u8; 32]) -> Vec { + self.sign(&digest) + } + fn private_key_data_equal_to(&self, other_private_key_data: &[u8; 32]) -> bool { + self.seckey.eq(other_private_key_data) + } + + fn public_key_data_equal_to(&self, other_public_key_data: &Vec) -> bool { + self.public_key_data().eq(other_public_key_data) + } +} + +impl DeriveKey> for ED25519Key { + fn private_derive_to_path(&self, path: &IndexPath) -> Result { + let mut signing_key: SigningKey = self.seckey.into(); + let mut chaincode = self.chaincode.clone(); + let mut fingerprint = 0u32; + let length = path.length(); + (0..length) + .into_iter() + .for_each(|position| { + if position + 1 == length { + let mut data = [0u8; 33]; + data[1..33].copy_from_slice(signing_key.verifying_key().as_bytes()); + fingerprint = hash160::Hash::hash(&data).to_byte_array().u32_le() + } + Self::derive_child_private_key(&mut signing_key, &mut chaincode, path, position); + }); + Ok(Self::init_with_extended_private_parts(signing_key.to_bytes(), chaincode, fingerprint)) + } + + fn public_derive_to_path_with_offset(&self, _path: &IndexPath, _offset: usize) -> Result { + unimplemented!() + } +} + +impl DeriveKey> for ED25519Key { + fn private_derive_to_path(&self, path: &IndexPath<[u8; 32]>) -> Result { + let mut signing_key: SigningKey = self.seckey.into(); + let mut chaincode = self.chaincode.clone(); + let mut fingerprint = 0u32; + let length = path.length(); + (0..length) + .into_iter() + .for_each(|position| { + if position + 1 == length { + let mut data = [0u8; 33]; + data[1..33].copy_from_slice(signing_key.verifying_key().as_bytes()); + fingerprint = hash160::Hash::hash(&data).to_byte_array().u32_le() + } + Self::derive_child_private_key(&mut signing_key, &mut chaincode, path, position); + }); + Ok(Self::init_with_extended_private_parts(signing_key.to_bytes(), chaincode, fingerprint)) + } + + fn public_derive_to_path_with_offset(&self, path: &IndexPath<[u8; 32]>, offset: usize) -> Result { + let mut chaincode = self.chaincode.clone(); + let pub_key_data = self.public_key_data(); + let mut data = TryInto::<[u8; 32]>::try_into(pub_key_data.as_slice()).map_err(KeyError::from)?; + let mut fingerprint = 0u32; + let length = path.length(); + (offset..length) + .into_iter() + .for_each(|position| { + if position + 1 == length { + fingerprint = hash160::Hash::hash(&data).to_byte_array().u32_le(); + // fingerprint = hash160::Hash::hash(&ECPoint::from(data.as_slice()).0).to_byte_array().u32_le(); + } + Self::derive_child_public_key(&mut data, &mut chaincode, path, position); + }); + Ok(Self::init_with_extended_public_parts(data.to_vec(), chaincode, fingerprint)) + } +} + +impl ED25519Key { + + pub fn init_with_seed_data(seed: &[u8]) -> Result { + let (seckey, chaincode) = seed_key(seed) + .map_err(KeyError::from)?; + Ok(Self { seckey, chaincode, ..Default::default() }) + } + + fn init_with_extended_private_parts(seckey: [u8; 32], chaincode: [u8; 32], fingerprint: u32) -> Self { + Self { fingerprint, chaincode, seckey, is_extended: true, ..Default::default() } + } + + fn init_with_extended_public_parts(pubkey: Vec, chaincode: [u8; 32], fingerprint: u32) -> Self { + Self { fingerprint, chaincode, pubkey, is_extended: true, ..Default::default() } + } + + pub fn init_with_extended_private_key_data(data: &[u8]) -> Result { + Self::key_with_extended_private_key_data(data) + } + + pub fn init_with_extended_public_key_data(data: &[u8]) -> Result { + Self::key_with_extended_public_key_data(data) + } + + + pub fn public_key_from_bytes(data: &[u8]) -> Result { + VerifyingKey::try_from(data) + } + + pub fn secret_key_from_bytes(data: &[u8]) -> Result { + SigningKey::try_from(data) + } + + pub fn key_with_public_key_data(data: &[u8]) -> Result { + assert!(!data.is_empty()); + // TODO: if we follow SLIP-0010 then we have 33-bytes, and need to cut off 1st byte (0x00) + // TODO: if we follow IETF then we must ensure length == 32 bytes + match data.len() { + 32 => Self::public_key_from_bytes(data).map_err(KeyError::from), + 33 => Self::public_key_from_bytes(&data[1..]).map_err(KeyError::from), + len => Err(KeyError::WrongLength(len)) + }.map(|pk| Self { pubkey: pk.to_bytes().to_vec(), ..Default::default() }) + } + + pub fn public_key_data_from_extended_public_key_data(data: &[u8], path: &PATH) -> Result, KeyError> + where PATH: IIndexPath { + if data.len() < EXT_PUBKEY_SIZE { + assert!(false, "Extended public key is wrong size"); + return Err(KeyError::WrongLength(data.len())); + } + let mut chaincode = TryInto::<[u8; 32]>::try_into(&data[4..36]).map_err(KeyError::from)?; + let mut key = TryInto::<[u8; 32]>::try_into(&data[36..68]).map_err(KeyError::from)?; + (0..path.length()) + .into_iter() + .for_each(|position| Self::derive_child_public_key(&mut key, &mut chaincode, path, position)); + Ok(key.to_vec()) + } +} + + +/// For FFI +impl ED25519Key { + + + pub fn public_key_from_extended_public_key_data_at_index_path(&self, index_path: &PATH) -> Result + where Self: Sized, PATH: IIndexPath { + self.extended_public_key_data() + .and_then(|ext_pk_data| Self::public_key_data_from_extended_public_key_data(&ext_pk_data, index_path)) + .and_then(|pub_key_data| Self::key_with_public_key_data(&pub_key_data)) + } + + + +} diff --git a/dash-spv-crypto/src/keys/key.rs b/dash-spv-crypto/src/keys/key.rs new file mode 100644 index 00000000..3605746f --- /dev/null +++ b/dash-spv-crypto/src/keys/key.rs @@ -0,0 +1,850 @@ +use std::fmt::Debug; +use dashcore::{Network, PrivateKey}; +use dashcore::hashes::{sha256, sha256d, Hash}; +use crate::derivation::{IIndexPath, IndexPath, index_path::{Extremum, IndexHardSoft}}; +use dashcore::consensus::Encodable; +use crate::crypto::byte_util::{clone_into_array, Reversed}; +use crate::keys::{BLSKey, DeriveKey, ECDSAKey, ED25519Key, IKey, KeyError}; +use crate::keys::bls_key::g1_element_serialized; +use crate::keys::crypto_data::CryptoData; +use crate::network::ChainType; +use crate::util::address::address; +use crate::util::data_append::DataAppend; +use crate::util::script::ScriptElement; +use crate::util::sec_vec::SecVec; + +#[derive(Clone, Debug, PartialEq)] +#[ferment_macro::export] +pub enum KeyKind { + ECDSA = 0, + BLS = 1, + BLSBasic = 2, + ED25519 = 3, +} + +#[derive(Clone, Debug)] +#[ferment_macro::export] +pub enum OpaqueKey { + ECDSA(ECDSAKey), + BLS(BLSKey), + ED25519(ED25519Key), +} + +impl From for OpaqueKey { + fn from(value: ECDSAKey) -> Self { + OpaqueKey::ECDSA(value) + } +} + +impl From for OpaqueKey { + fn from(value: BLSKey) -> Self { + OpaqueKey::BLS(value) + } +} + +impl From for OpaqueKey { + fn from(value: ED25519Key) -> Self { + OpaqueKey::ED25519(value) + } +} + +impl From for ECDSAKey { + fn from(value: OpaqueKey) -> Self { + match value { + OpaqueKey::ECDSA(key) => key, + _ => panic!("trying to unwrap bls from different key type") + } + } +} +impl From for BLSKey { + fn from(value: OpaqueKey) -> Self { + match value { + OpaqueKey::BLS(key) => key, + _ => panic!("trying to unwrap ecdsa from different key type") + } + } +} +impl From for ED25519Key { + fn from(value: OpaqueKey) -> Self { + match value { + OpaqueKey::ED25519(key) => key, + _ => panic!("trying to unwrap ed25519 from different key type") + } + } +} + +impl Default for KeyKind { + fn default() -> Self { + KeyKind::ECDSA + } +} + +impl From for KeyKind { + fn from(orig: i16) -> Self { + match orig { + 0 => KeyKind::ECDSA, + 1 => KeyKind::BLS, + 2 => KeyKind::BLSBasic, + 3 => KeyKind::ED25519, + _ => KeyKind::default(), + } + } +} + +impl From for i16 { + fn from(value: KeyKind) -> Self { + value as i16 + } +} + +impl From<&KeyKind> for u8 { + fn from(value: &KeyKind) -> Self { + value.clone() as u8 + } +} + +impl OpaqueKey { + pub fn convert_opaque_key_to_ecdsa_private_key(&self, chain_type: &ChainType) -> Result { + match (chain_type, self) { + (ChainType::MainNet, OpaqueKey::ECDSA(key)) => + key.private_key_data().and_then(|data| PrivateKey::from_slice(&data, Network::Dash).map_err(|err| KeyError::Any(format!("Can't convert dash_shared_core key ({self:?}) to platform key: {err}")))), + (ChainType::TestNet, OpaqueKey::ECDSA(key)) => + key.private_key_data().and_then(|data| PrivateKey::from_slice(&data, Network::Testnet).map_err(|err| KeyError::Any(format!("Can't convert dash_shared_core key ({self:?}) to platform key: {err}")))), + _ => Err(KeyError::Any(format!("Can't convert dash_shared_core key ({self:?}) to platform key"))), + } + } + pub fn public_key_data_at_index_path_u32(&self, index_path: IndexPath) -> Result, KeyError> { + match self { + OpaqueKey::ECDSA(key) => + key.extended_public_key_data() + .and_then(|data| ECDSAKey::public_key_from_extended_public_key_data(&data, &index_path)), + OpaqueKey::BLS(key) => + key.extended_public_key_data() + .and_then(|data| BLSKey::public_key_from_extended_public_key_data(&data, &index_path, key.use_legacy)), + + OpaqueKey::ED25519(key) => + key.extended_public_key_data() + .and_then(|data| ED25519Key::public_key_data_from_extended_public_key_data(&data, &index_path)), + } + } + +} +#[ferment_macro::export] +impl OpaqueKey { + + pub fn has_kind(&self, kind: KeyKind) -> bool { + self.kind().eq(&kind) + } + pub fn hash160(&self) -> [u8; 20] { + match self { + OpaqueKey::ECDSA(key) => key.hash160(), + OpaqueKey::BLS(key) => key.hash160(), + OpaqueKey::ED25519(key) => key.hash160(), + } + } + pub fn check_payload_signature(&self, key_hash: [u8; 20]) -> bool { + self.hash160().eq(&key_hash) + } + pub fn create_tx_signature(&self, data: &[u8], flags: u8, tx_input_script: Vec) -> Vec { + let mut sig = Vec::new(); + let hash = sha256d::Hash::hash(data.as_ref()).to_byte_array(); + let signed_data = match self { + OpaqueKey::ECDSA(key) => key.sign(&hash), + OpaqueKey::BLS(key) => key.sign(&hash), + OpaqueKey::ED25519(key) => key.sign(&hash), + }; + let mut s = Vec::new(); + s.extend(signed_data); + s.push(flags); + s.append_script_push_data(&mut sig); + match tx_input_script.script_elements()[..] { + // pay-to-pubkey-hash scriptSig + [.., ScriptElement::Number(0x88/*OP_EQUALVERIFY*/), _elem] => { + self.public_key_data().append_script_push_data(&mut sig); + }, + _ => {} + } + sig + } + + pub fn create_account_reference(&self, extended_public_key: OpaqueKey, account_number: usize) -> u32 { + let extended_public_key_data = extended_public_key + .extended_public_key_data() + .unwrap_or_default(); + let account_secret_key = self.hmac_256_data(&extended_public_key_data).reversed(); + let account_secret_key28 = u32::from_le_bytes(clone_into_array(&account_secret_key[..4])) >> 4; + let shortened_account_bits = (account_number as u32) & 0x0FFFFFFF; + let version = 0; // currently set to 0 + let version_bits = version << 28; + // this is the account ref + version_bits | (account_secret_key28 ^ shortened_account_bits) + } + + pub fn create_identifier(&self) -> Result<[u8; 32], KeyError> { + self.extended_public_key_data() + .map(|ext_pubkey_data| sha256::Hash::hash(&ext_pubkey_data).to_byte_array()) + } + + pub fn public_derive_to_256_path_with_offset(&mut self, path: &IndexPathU256, offset: usize) -> Result { + self.public_derive_to_path_with_offset(&IndexPath::from(path), offset) + } + + pub fn public_key_from_extended_public_key_data_at_index_path(&self, index_path: Vec) -> Result { + let index_path = IndexPath::from(index_path); + match self { + OpaqueKey::ECDSA(key) => + key.public_key_from_extended_public_key_data_at_index_path(&index_path) + .map(OpaqueKey::ECDSA), + OpaqueKey::BLS(key) => + key.public_key_from_extended_public_key_data_at_index_path(&index_path) + .map(OpaqueKey::BLS), + OpaqueKey::ED25519(key) => + key.public_key_from_extended_public_key_data_at_index_path(&index_path) + .map(OpaqueKey::ED25519) + } + } + pub fn public_key_data_at_index_path(&self, index_path: Vec) -> Result, KeyError> { + let index_path = IndexPath::from(index_path); + match self { + OpaqueKey::ECDSA(key) => + key.extended_public_key_data() + .and_then(|data| ECDSAKey::public_key_from_extended_public_key_data(&data, &index_path)), + OpaqueKey::BLS(key) => + key.extended_public_key_data() + .and_then(|data| BLSKey::public_key_from_extended_public_key_data(&data, &index_path, key.use_legacy)), + + OpaqueKey::ED25519(key) => + key.extended_public_key_data() + .and_then(|data| ED25519Key::public_key_data_from_extended_public_key_data(&data, &index_path)), + } + } + + + + // Encryption + pub fn encrypt_data(&self, public_key: OpaqueKey, data: &[u8]) -> Result, KeyError> { + match (self, public_key) { + (OpaqueKey::ECDSA(key), OpaqueKey::ECDSA(public_key)) => { + let pubkey = dashcore::secp256k1::PublicKey::from_slice(&public_key.public_key_data()).map_err(KeyError::from)?; + let seckey = dashcore::secp256k1::SecretKey::from_byte_array(&key.seckey).map_err(KeyError::from)?; + let shared_secret = dashcore::secp256k1::ecdh::SharedSecret::new(&pubkey, &seckey); + let new_key = ECDSAKey::with_shared_secret(shared_secret, false); + CryptoData::encrypt_with_dh_key(&data.to_vec(), &new_key) + } + (OpaqueKey::BLS(key), OpaqueKey::BLS(public_key)) if key.use_legacy == public_key.use_legacy => { + let pubkey = public_key.bls_public_key().map_err(KeyError::from)?; + let seckey = key.bls_private_key().map_err(KeyError::from)?; + let product = (pubkey * seckey).map_err(KeyError::from)?; + let new_key = BLSKey::key_with_public_key(g1_element_serialized(&product, key.use_legacy), key.use_legacy); + CryptoData::encrypt_with_dh_key(&data.to_vec(), &new_key) + } + _ => Err(KeyError::DHKeyExchange) + } + } + pub fn encrypt_data_vec(&self, public_key: OpaqueKey, data: Vec) -> Result, KeyError> { + self.encrypt_data(public_key, &data) + } + pub fn encrypt_data_using_iv(&self, public_key: OpaqueKey, data: &[u8], iv: Vec) -> Result, KeyError> { + match (self, public_key) { + (OpaqueKey::ECDSA(key), OpaqueKey::ECDSA(public_key)) => { + let pubkey = dashcore::secp256k1::PublicKey::from_slice(&public_key.public_key_data()).map_err(KeyError::from)?; + let seckey = dashcore::secp256k1::SecretKey::from_byte_array(&key.seckey).map_err(KeyError::from)?; + let shared_secret = dashcore::secp256k1::ecdh::SharedSecret::new(&pubkey, &seckey); + let new_key = ECDSAKey::with_shared_secret(shared_secret, false); + CryptoData::encrypt_with_dh_key_using_iv(&data.to_vec(), &new_key, iv) + } + (OpaqueKey::BLS(key), OpaqueKey::BLS(public_key)) if key.use_legacy == public_key.use_legacy => { + let pubkey = public_key.bls_public_key().map_err(KeyError::from)?; + let seckey = key.bls_private_key().map_err(KeyError::from)?; + let product = (pubkey * seckey).map_err(KeyError::from)?; + let new_key = BLSKey::key_with_public_key(g1_element_serialized(&product, key.use_legacy), key.use_legacy); + CryptoData::encrypt_with_dh_key_using_iv(&data.to_vec(), &new_key, iv) + } + _ => Err(KeyError::DHKeyExchange) + } + } + + pub fn decrypt_data(&self, public_key: OpaqueKey, data: &[u8]) -> Result, KeyError> { + match (self, public_key) { + (OpaqueKey::ECDSA(key), OpaqueKey::ECDSA(public_key)) => { + let pubkey = dashcore::secp256k1::PublicKey::from_slice(&public_key.public_key_data()).map_err(KeyError::from)?; + let seckey = dashcore::secp256k1::SecretKey::from_byte_array(&key.seckey).map_err(KeyError::from)?; + let shared_secret = dashcore::secp256k1::ecdh::SharedSecret::new(&pubkey, &seckey); + let new_key = ECDSAKey::with_shared_secret(shared_secret, false); + CryptoData::decrypt_with_dh_key(&data.to_vec(), &new_key) + } + (OpaqueKey::BLS(key), OpaqueKey::BLS(public_key)) if key.use_legacy == public_key.use_legacy => { + let pubkey = public_key.bls_public_key().map_err(KeyError::from)?; + let seckey = key.bls_private_key().map_err(KeyError::from)?; + let product = (pubkey * seckey).map_err(KeyError::from)?; + let new_key = BLSKey::key_with_public_key(g1_element_serialized(&product, key.use_legacy), key.use_legacy); + CryptoData::decrypt_with_dh_key(&data.to_vec(), &new_key) + } + _ => Err(KeyError::DHKeyExchange) + } + } + pub fn decrypt_data_vec(&self, public_key: OpaqueKey, data: Vec) -> Result, KeyError> { + self.decrypt_data(public_key, &data) + } + + pub fn decrypt_data_using_iv_size(&self, public_key: OpaqueKey, data: &[u8], iv_size: usize) -> Result, KeyError> { + match (self, public_key) { + (OpaqueKey::ECDSA(key), OpaqueKey::ECDSA(public_key)) => { + let pubkey = dashcore::secp256k1::PublicKey::from_slice(&public_key.public_key_data()).map_err(KeyError::from)?; + let seckey = dashcore::secp256k1::SecretKey::from_byte_array(&key.seckey).map_err(KeyError::from)?; + let shared_secret = dashcore::secp256k1::ecdh::SharedSecret::new(&pubkey, &seckey); + let new_key = ECDSAKey::with_shared_secret(shared_secret, false); + CryptoData::decrypt_with_dh_key_using_iv_size(&data.to_vec(), &new_key, iv_size) + } + (OpaqueKey::BLS(key), OpaqueKey::BLS(public_key)) if key.use_legacy == public_key.use_legacy => { + let pubkey = public_key.bls_public_key().map_err(KeyError::from)?; + let seckey = key.bls_private_key().map_err(KeyError::from)?; + let product = (pubkey * seckey).map_err(KeyError::from)?; + let new_key = BLSKey::key_with_public_key(g1_element_serialized(&product, key.use_legacy), key.use_legacy); + CryptoData::decrypt_with_dh_key_using_iv_size(&data.to_vec(), &new_key, iv_size) + } + _ => Err(KeyError::DHKeyExchange) + } + } + + pub fn encrypt_data_with_dh_key(&self, data: Vec) -> Result, KeyError> { + match self { + OpaqueKey::ECDSA(key) => + CryptoData::encrypt_with_dh_key(&data, key), + OpaqueKey::BLS(key) => + CryptoData::encrypt_with_dh_key(&data, key), + _ => Err(KeyError::DHKeyExchange), + } + } + pub fn decrypt_data_with_dh_key(&self, data: Vec) -> Result, KeyError> { + match self { + OpaqueKey::ECDSA(key) => + CryptoData::decrypt_with_dh_key(&data, key), + OpaqueKey::BLS(key) => + CryptoData::decrypt_with_dh_key(&data, key), + _ => Err(KeyError::DHKeyExchange), + } + } + pub fn encrypt_data_with_dh_key_using_iv(&self, data: Vec, iv: Vec) -> Result, KeyError> { + match self { + OpaqueKey::ECDSA(key) => + CryptoData::encrypt_with_dh_key_using_iv(&data, key, iv), + OpaqueKey::BLS(key) => + CryptoData::encrypt_with_dh_key_using_iv(&data, key, iv), + _ => Err(KeyError::DHKeyExchange), + } + } + + pub fn decrypt_data_with_dh_key_using_iv_size(&self, data: Vec, iv_size: usize) -> Result, KeyError> { + match self { + OpaqueKey::ECDSA(key) => + CryptoData::decrypt_with_dh_key_using_iv_size(&data, key, iv_size), + OpaqueKey::BLS(key) => + CryptoData::decrypt_with_dh_key_using_iv_size(&data, key, iv_size), + _ => Err(KeyError::DHKeyExchange), + } + } + +} + +impl KeyKind { + pub fn public_key_from_extended_public_key_data(&self, data: &[u8], index_path: &IndexPath) -> Result, KeyError> { + match self { + KeyKind::ECDSA => ECDSAKey::public_key_from_extended_public_key_data(data, index_path), + KeyKind::ED25519 => ED25519Key::public_key_data_from_extended_public_key_data(data, index_path), + _ => BLSKey::public_key_from_extended_public_key_data(data, index_path, *self == KeyKind::BLS), + } + } + + pub fn derive_key_from_seed(&self, seed: &[u8], derivation_path: &IndexPath<[u8; 32]>) -> Result { + self.key_with_seed_data(seed) + .and_then(|top_key| top_key.private_derive_to_path(derivation_path)) + } + pub fn private_keys_at_index_paths( + &self, + seed: &[u8], + index_paths: Vec>, + derivation_path: &IndexPath<[u8; 32]> + ) -> Result, KeyError> { + self.derive_key_from_seed(seed, derivation_path) + .map(|derivation_path_extended_key| + index_paths.iter() + .map(|index_path| derivation_path_extended_key.private_derive_to_path(index_path)) + .flatten() + .collect()) + } + + pub fn serialized_private_keys_at_index_paths( + &self, + seed: &[u8], + index_paths: Vec>, + derivation_path: &IndexPath<[u8; 32]>, + chain_type: ChainType, + ) -> Result, KeyError> { + self.derive_key_from_seed(seed, derivation_path) + .map(|derivation_path_extended_key| { + let script = chain_type.script_map().privkey; + index_paths.iter() + .map(|index_path| derivation_path_extended_key.private_derive_to_path(index_path) + .map(|private_key| private_key.serialized_private_key_for_script(script))) + .flatten() + .collect() + }) + } + pub fn private_key_at_index_path_u32(&self, index_path: IndexPath, extended_private_key_data: &[u8]) -> Result { + match self { + KeyKind::ECDSA => ECDSAKey::key_with_extended_private_key_data(extended_private_key_data) + .and_then(|key| key.private_derive_to_path(&index_path)) + .map(OpaqueKey::ECDSA), + KeyKind::ED25519 => ED25519Key::key_with_extended_private_key_data(extended_private_key_data) + .and_then(|key| key.private_derive_to_path(&index_path)) + .map(OpaqueKey::ED25519), + _ => BLSKey::key_with_extended_private_key_data(extended_private_key_data, *self == KeyKind::BLS) + .and_then(|key| key.private_derive_to_path(&index_path)) + .map(OpaqueKey::BLS) + } + } + pub fn derive_key_from_extended_private_key_data_for_index_path_u32(&self, data: &[u8], index_path: IndexPath) -> Result { + match self { + KeyKind::ECDSA => ECDSAKey::key_with_extended_private_key_data(data) + .and_then(|key| key.private_derive_to_path(&index_path)) + .map(OpaqueKey::ECDSA), + KeyKind::ED25519 => ED25519Key::key_with_extended_private_key_data(data) + .and_then(|key| key.private_derive_to_path(&index_path)) + .map(OpaqueKey::ED25519), + _ => BLSKey::key_with_extended_private_key_data(data, *self == KeyKind::BLS) + .and_then(|key| key.private_derive_to_path(&index_path)) + .map(OpaqueKey::BLS) + + } + } + +} + +/// TMP solution since ferment fails with expanding such a generic type +// #[ferment_macro::export] +// #[derive(Clone, Debug)] +// pub struct IndexPathU32 { +// pub indexes: Vec, +// pub hardened: Vec, +// } +#[ferment_macro::export] +#[derive(Clone, Debug)] +pub struct IndexPathU256 { + pub indexes: Vec<[u8; 32]>, + pub hardened: Vec, +} + +impl From for IndexPath<[u8; 32]> { + fn from(value: IndexPathU256) -> Self { + let IndexPathU256 { indexes, hardened } = value; + IndexPath::new_hardened(indexes, hardened) + } +} +impl From<&IndexPathU256> for IndexPath<[u8; 32]> { + fn from(value: &IndexPathU256) -> Self { + IndexPath::from(value.clone()) + } +} +impl From> for IndexPath { + fn from(value: Vec) -> Self { + // let IndexPathU32 { indexes, hardened } = value; + IndexPath::new_hardened(value, vec![]) + } +} +impl From<&Vec> for IndexPath { + fn from(value: &Vec) -> Self { + IndexPath::from(value.clone()) + } +} + +#[ferment_macro::export] +impl KeyKind { + + pub fn equal_to_kind(&self, kind: KeyKind) -> bool { + kind.eq(self) + } + pub fn index(&self) -> i16 { + match self { + KeyKind::ECDSA => 0, + KeyKind::BLS => 1, + KeyKind::BLSBasic => 2, + KeyKind::ED25519 => 3 + } + } + pub fn public_key_from_extended_public_key_data_at_index_path(&self, data: &[u8], index_path: &Vec) -> Result, KeyError> { + let index_path = IndexPath::from(index_path); + self.public_key_from_extended_public_key_data(data, &index_path) + } + pub fn public_key_from_extended_public_key_data_at_index_path_256(&self, data: &[u8], index_path: &IndexPathU256) -> Result { + let key = self.key_with_seed_data(data)?; + let index_path = IndexPath::from(index_path); + key.private_derive_to_path(&index_path) + } + pub fn private_key_at_index_path_wrapped(&self, seed: &[u8], index_path: Vec, derivation_path: IndexPathU256) -> Result { + let key = self.derive_key_from_seed_wrapped(seed, derivation_path)?; + let index_path = IndexPath::from(index_path); + key.private_derive_to_path(&index_path) + } + pub fn derive_key_from_seed_wrapped(&self, seed: &[u8], derivation_path: IndexPathU256) -> Result { + let key = self.key_with_seed_data(seed)?; + let index_path = IndexPath::from(derivation_path); + key.private_derive_to_path(&index_path) + } + + pub fn key_with_private_key(&self, secret: &str, chain_type: ChainType) -> Result { + match self { + KeyKind::ECDSA => ECDSAKey::key_with_private_key(secret, chain_type).map(OpaqueKey::ECDSA), + KeyKind::BLS => BLSKey::key_with_private_key(secret, true).map(OpaqueKey::BLS), + KeyKind::BLSBasic => BLSKey::key_with_private_key(secret, false).map(OpaqueKey::BLS), + KeyKind::ED25519 => ED25519Key::key_with_private_key(secret).map(OpaqueKey::ED25519), + } + } + + pub fn private_keys_at_index_paths_wrapped( + &self, + seed: &[u8], + index_paths: Vec>, + derivation_path: IndexPathU256 + ) -> Result, KeyError> { + let key = self.derive_key_from_seed_wrapped(seed, derivation_path)?; + Ok(index_paths.into_iter() + .map(|index_path| key.private_derive_to_path(&IndexPath::from(index_path))) + .flatten() + .collect()) + } + pub fn serialized_private_keys_at_index_paths_wrapper( + &self, + seed: &[u8], + index_paths: Vec>, + derivation_path: IndexPathU256, + chain_type: ChainType, + ) -> Result, KeyError> { + let key = self.derive_key_from_seed_wrapped(seed, derivation_path)?; + let script = chain_type.script_map().privkey; + Ok(index_paths.into_iter() + .map(|index_path| key.private_derive_to_path(&IndexPath::from(index_path)) + .map(|private_key| private_key.serialized_private_key_for_script(script))) + .flatten() + .collect()) + } + + + pub fn derivation_string(&self) -> String { + match self { + KeyKind::ECDSA => "", + KeyKind::ED25519 => "_ED_", + KeyKind::BLS | KeyKind::BLSBasic => "_BLS_", + }.to_string() + } + pub fn key_storage_prefix(&self) -> String { + match self { + KeyKind::ECDSA => "", + KeyKind::BLS => "_BLS_", + KeyKind::BLSBasic => "_BLS_B_", + KeyKind::ED25519 => "_ED25519_" + }.to_string() + } + pub fn private_key_from_extended_private_key_data(&self, data: &[u8]) -> Result { + match self { + KeyKind::ECDSA => ECDSAKey::init_with_extended_private_key_data(data).map(OpaqueKey::ECDSA), + KeyKind::ED25519 => ED25519Key::init_with_extended_private_key_data(data).map(OpaqueKey::ED25519), + _ => BLSKey::init_with_extended_private_key_data(data, *self == KeyKind::BLS).map(OpaqueKey::BLS).map_err(KeyError::from), + } + } + + pub fn key_with_private_key_data(&self, data: &[u8]) -> Result { + match self { + KeyKind::ECDSA => ECDSAKey::key_with_secret_data(data, true).map(OpaqueKey::ECDSA), + KeyKind::ED25519 => ED25519Key::key_with_secret_data(data).map(OpaqueKey::ED25519), + _ => BLSKey::key_with_private_key_data(data, *self == KeyKind::BLS).map(OpaqueKey::BLS), + } + } + + pub fn key_with_seed_data(&self, seed: &[u8]) -> Result { + match self { + KeyKind::ECDSA => ECDSAKey::init_with_seed_data(seed).map(OpaqueKey::ECDSA), + KeyKind::ED25519 => ED25519Key::init_with_seed_data(seed).map(OpaqueKey::ED25519), + _ => BLSKey::extended_private_key_with_seed_data(seed, *self == KeyKind::BLS).map(OpaqueKey::BLS) + } + } + + pub fn key_with_public_key_data(&self, data: &[u8]) -> Result { + match self { + KeyKind::ECDSA => ECDSAKey::key_with_public_key_data(data).map(OpaqueKey::ECDSA), + KeyKind::ED25519 => ED25519Key::key_with_public_key_data(data).map(OpaqueKey::ED25519), + _ => BLSKey::key_with_public_key_data(data, *self == KeyKind::BLS).map(OpaqueKey::BLS), + } + } + + pub fn key_init_with_extended_public_key_data(&self, data: &[u8]) -> Result { + match self { + KeyKind::ECDSA => ECDSAKey::init_with_extended_public_key_data(data).map(OpaqueKey::ECDSA), + KeyKind::ED25519 => ED25519Key::init_with_extended_public_key_data(data).map(OpaqueKey::ED25519), + _ => BLSKey::init_with_extended_public_key_data(data, *self == KeyKind::BLS) + .map(OpaqueKey::BLS) + .map_err(KeyError::from) + } + } + pub fn key_with_extended_public_key_data(&self, data: &[u8]) -> Result { + match self { + KeyKind::ECDSA => ECDSAKey::key_with_extended_public_key_data(data).map(OpaqueKey::ECDSA), + KeyKind::ED25519 => ED25519Key::key_with_extended_public_key_data(data).map(OpaqueKey::ED25519), + _ => BLSKey::key_with_extended_public_key_data(data, *self == KeyKind::BLS).map(OpaqueKey::BLS).map_err(KeyError::from) + } + } + + pub fn key_with_extended_private_key_data(&self, data: &[u8]) -> Result { + match self { + KeyKind::ECDSA => ECDSAKey::init_with_extended_private_key_data(data).map(OpaqueKey::ECDSA), + KeyKind::ED25519 => ED25519Key::init_with_extended_private_key_data(data).map(OpaqueKey::ED25519), + _ => BLSKey::init_with_extended_private_key_data(data, *self == KeyKind::BLS).map(OpaqueKey::BLS).map_err(KeyError::from) + } + } + + pub fn derive_key_from_extended_private_key_data_for_index_path(&self, data: &[u8], index_path: Vec) -> Result { + let index_path = IndexPath::from(index_path); + match self { + KeyKind::ECDSA => ECDSAKey::key_with_extended_private_key_data(data) + .and_then(|key| key.private_derive_to_path(&index_path)) + .map(OpaqueKey::ECDSA), + KeyKind::ED25519 => ED25519Key::key_with_extended_private_key_data(data) + .and_then(|key| key.private_derive_to_path(&index_path)) + .map(OpaqueKey::ED25519), + _ => BLSKey::key_with_extended_private_key_data(data, *self == KeyKind::BLS) + .and_then(|key| key.private_derive_to_path(&index_path)) + .map(OpaqueKey::BLS) + + } + } + + /*pub fn private_derive_to_256bit_derivation_path_from_seed_and_store(&self, seed: &Seed, derivation_path: &DPATH, store_private_key: bool) -> Option + where IPATH: IIndexPath, DPATH: IDerivationPath + IIndexPath { + if let Some(seed_key) = self.key_with_seed_data(&seed.data) { + println!("private_derive_to_256bit_derivation_path_from_seed_and_store: seed_key: {:?}", seed_key.clone()); + let derived = seed_key.private_derive_to_256bit_derivation_path(derivation_path); + if let Some(mut ext_pk) = derived { + let ext_pub_data = ext_pk.extended_private_key_data(); + let ext_prv_data = ext_pk.extended_public_key_data(); + println!("private_derive_to_256bit_derivation_path_from_seed_and_store: ext_prv_data: {:?} ext_pub_data: {:?}", ext_prv_data.clone(), ext_pub_data.clone()); + if !seed.unique_id.is_empty() { + Keychain::set_data(derivation_path.wallet_based_extended_public_key_location_string_for_wallet_unique_id(seed.unique_id_as_str()), ext_pub_data, false) + .expect(""); + if store_private_key { + Keychain::set_data(wallet_based_extended_private_key_location_string_for_unique_id(seed.unique_id_as_str()), ext_prv_data, true) + .expect(""); + } + } + ext_pk.forget_private_key(); + Some(ext_pk) + } else { + None + } + } else { + None + } + }*/ + +} + +impl DeriveKey> for OpaqueKey +where U: Clone + Debug + Encodable + IndexHardSoft + PartialEq + Extremum, + ECDSAKey: DeriveKey>, + BLSKey: DeriveKey>, + ED25519Key: DeriveKey> { + fn private_derive_to_path(&self, path: &IndexPath) -> Result { + match self { + OpaqueKey::ECDSA(key) => key.private_derive_to_path(path).map(Into::into), + OpaqueKey::BLS(key) => key.private_derive_to_path(path).map(Into::into), + OpaqueKey::ED25519(key) => key.private_derive_to_path(path).map(Into::into), + } + } + fn public_derive_to_path_with_offset(&self, path: &IndexPath, offset: usize) -> Result { + match self { + OpaqueKey::ECDSA(key) => key.public_derive_to_path_with_offset(path, offset).map(Into::into), + OpaqueKey::BLS(key) => key.public_derive_to_path_with_offset(path, offset).map(Into::into), + OpaqueKey::ED25519(key) => key.public_derive_to_path_with_offset(path, offset).map(Into::into), + } + } +} + +#[ferment_macro::export] +impl IKey for OpaqueKey { + + fn kind(&self) -> KeyKind { + match self { + OpaqueKey::ECDSA(..) => KeyKind::ECDSA, + OpaqueKey::ED25519(..) => KeyKind::ED25519, + OpaqueKey::BLS(BLSKey { use_legacy: true, .. }) => KeyKind::BLS, + OpaqueKey::BLS(BLSKey { use_legacy: false, .. }) => KeyKind::BLSBasic + } + } + + fn secret_key_string(&self) -> String { + match self { + OpaqueKey::ECDSA(key) => key.secret_key_string(), + OpaqueKey::BLS(key) => key.secret_key_string(), + OpaqueKey::ED25519(key) => key.secret_key_string(), + } + } + + fn has_private_key(&self) -> bool { + match self { + OpaqueKey::ECDSA(key) => key.has_private_key(), + OpaqueKey::BLS(key) => key.has_private_key(), + OpaqueKey::ED25519(key) => key.has_private_key(), + } + } + fn address_with_public_key_data(&self, chain: ChainType) -> String { + address::with_public_key_data(&self.public_key_data(), chain) + } + + fn sign(&self, data: &[u8]) -> Vec { + match self { + OpaqueKey::ECDSA(key) => key.compact_sign(data).to_vec(), + OpaqueKey::BLS(key) => key.sign(data), + OpaqueKey::ED25519(key) => key.sign(data) + } + } + + fn hash_and_sign(&self, data: Vec) -> Vec { + let hash = sha256d::Hash::hash(&data); + self.sign(hash.as_ref()) + } + + fn verify(&mut self, message_digest: &[u8], signature: &[u8]) -> Result { + match self { + OpaqueKey::ECDSA(key) => key.verify(message_digest, signature), + OpaqueKey::BLS(key) => key.verify(message_digest, signature), + OpaqueKey::ED25519(key) => key.verify(message_digest, signature), + } + } + + fn secret_key(&self) -> [u8; 32] { + match self { + OpaqueKey::ECDSA(key) => key.seckey, + OpaqueKey::BLS(key) => key.secret_key(), + OpaqueKey::ED25519(key) => key.secret_key(), + } + } + + fn chaincode(&self) -> [u8; 32] { + match self { + OpaqueKey::ECDSA(key) => key.chaincode(), + OpaqueKey::BLS(key) => key.chaincode(), + OpaqueKey::ED25519(key) => key.chaincode(), + } + } + + fn fingerprint(&self) -> u32 { + match self { + OpaqueKey::ECDSA(key) => key.fingerprint(), + OpaqueKey::BLS(key) => key.fingerprint(), + OpaqueKey::ED25519(key) => key.fingerprint(), + } + } + + fn private_key_data(&self) -> Result, KeyError> { + match self { + OpaqueKey::ECDSA(key) => key.private_key_data(), + OpaqueKey::BLS(key) => key.private_key_data(), + OpaqueKey::ED25519(key) => key.private_key_data(), + } + } + + fn public_key_data(&self) -> Vec { + match self { + OpaqueKey::ECDSA(key) => key.public_key_data(), + OpaqueKey::BLS(key) => key.public_key_data(), + OpaqueKey::ED25519(key) => key.public_key_data(), + } + } + + fn extended_private_key_data(&self) -> Result { + match self { + OpaqueKey::ECDSA(key) => key.extended_private_key_data(), + OpaqueKey::BLS(key) => key.extended_private_key_data(), + OpaqueKey::ED25519(key) => key.extended_private_key_data(), + } + } + + fn extended_public_key_data(&self) -> Result, KeyError> { + match self { + OpaqueKey::ECDSA(key) => key.extended_public_key_data(), + OpaqueKey::BLS(key) => key.extended_public_key_data(), + OpaqueKey::ED25519(key) => key.extended_public_key_data(), + } + } + + fn serialized_private_key_for_script(&self, chain_prefix: u8) -> String { + match self { + OpaqueKey::ECDSA(key) => key.serialized_private_key_for_script(chain_prefix), + OpaqueKey::BLS(key) => key.serialized_private_key_for_script(chain_prefix), + OpaqueKey::ED25519(key) => key.serialized_private_key_for_script(chain_prefix), + } + } + + fn hmac_256_data(&self, data: &[u8]) -> [u8; 32] { + match self { + OpaqueKey::ECDSA(key) => key.hmac_256_data(data), + OpaqueKey::BLS(key) => key.hmac_256_data(data), + OpaqueKey::ED25519(key) => key.hmac_256_data(data), + } + } + + fn forget_private_key(&mut self) { + match self { + OpaqueKey::ECDSA(key) => key.forget_private_key(), + OpaqueKey::BLS(key) => key.forget_private_key(), + OpaqueKey::ED25519(key) => key.forget_private_key(), + } + + } + + fn sign_message_digest(&self, digest: [u8; 32]) -> Vec { + match self { + OpaqueKey::ECDSA(key) => key.sign_message_digest(digest), + OpaqueKey::BLS(key) => key.sign_message_digest(digest), + OpaqueKey::ED25519(key) => key.sign_message_digest(digest), + } + } + fn private_key_data_equal_to(&self, other_private_key_data: &[u8; 32]) -> bool { + match self { + OpaqueKey::ECDSA(key) => + key.private_key_data_equal_to(other_private_key_data), + OpaqueKey::BLS(key) => + key.private_key_data_equal_to(other_private_key_data), + OpaqueKey::ED25519(key) => + key.private_key_data_equal_to(other_private_key_data), + } + } + + fn public_key_data_equal_to(&self, other: &Vec) -> bool { + self.public_key_data().eq(other) + } + +} + +#[ferment_macro::export] +pub fn key_kind_from_index(index: i16) -> KeyKind { + KeyKind::from(index) +} + + +#[ferment_macro::export] +pub fn maybe_opaque_key_used_in_tx_input_script( + tx_input_script: Vec, + keys: Vec, + chain: ChainType +) -> Option { + for key in keys { + let chain_script_map = chain.script_map(); + if let Some(script_address) = address::with_script_pub_key(&tx_input_script, &chain_script_map) { + let key_addr = address::with_public_key_data_and_script_pub_key(&key.public_key_data(), chain_script_map.pubkey); + if script_address.eq(&key_addr) { + return Some(key); + } + } + } + None +} diff --git a/dash-spv-crypto/src/keys/mod.rs b/dash-spv-crypto/src/keys/mod.rs new file mode 100644 index 00000000..c260c759 --- /dev/null +++ b/dash-spv-crypto/src/keys/mod.rs @@ -0,0 +1,141 @@ +pub mod bls_key; +pub mod crypto_data; +pub mod dip14; +pub mod ed25519_key; +pub mod ecdsa_key; +pub mod key; +pub mod operator_public_key; + +use std::convert::Infallible; +pub use self::key::OpaqueKey; +pub use self::bls_key::BLSKey; +pub use self::ecdsa_key::ECDSAKey; +pub use self::ed25519_key::ED25519Key; +pub use self::operator_public_key::OperatorPublicKey; + +use std::fmt::Debug; +use dashcore::consensus::{encode, Encodable}; +use crate::bip::bip32; +use crate::derivation::index_path::{Extremum, IIndexPath, IndexHardSoft}; +use crate::keys::key::KeyKind; +use crate::network::ChainType; +use crate::util::{base58, sec_vec::SecVec}; + +pub trait DeriveKey: Sized + where T: IIndexPath { + fn private_derive_to_path(&self, path: &T) -> Result; + fn public_derive_to_path_with_offset(&self, path: &T, offset: usize) -> Result; + fn public_derive_to_path(&self, path: &T) -> Result { + self.public_derive_to_path_with_offset(path, 0) + } +} + +#[ferment_macro::export] +pub trait IKey: Send + Sync + Debug { + fn kind(&self) -> KeyKind; + fn secret_key_string(&self) -> String; + fn has_private_key(&self) -> bool; + + fn address_with_public_key_data(&self, chain: ChainType) -> String; + fn sign(&self, data: &[u8]) -> Vec; + fn hash_and_sign(&self, data: Vec) -> Vec; + fn verify(&mut self, message_digest: &[u8], signature: &[u8]) -> Result; + fn secret_key(&self) -> [u8; 32]; + + fn chaincode(&self) -> [u8; 32]; + fn fingerprint(&self) -> u32; + + fn private_key_data(&self) -> Result, KeyError>; + fn public_key_data(&self) -> Vec; + fn extended_private_key_data(&self) -> Result; + fn extended_public_key_data(&self) -> Result, KeyError>; + + fn serialized_private_key_for_script(&self, chain_prefix: u8) -> String; + fn hmac_256_data(&self, data: &[u8]) -> [u8; 32]; + fn forget_private_key(&mut self); + fn sign_message_digest(&self, digest: [u8; 32]) -> Vec; + fn private_key_data_equal_to(&self, other_private_key_data: &[u8; 32]) -> bool; + fn public_key_data_equal_to(&self, other_public_key_data: &Vec) -> bool; +} + +#[derive(Clone, Debug)] +#[ferment_macro::export] +pub enum KeyError { + WrongFormat, + WrongLength(usize), + Extended(bool), + UnableToDerive, + DHKeyExchange, + CCCrypt(i32), + EmptySecKey, + Product, + Any(String), +} + +impl std::fmt::Display for KeyError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self) + } +} +impl std::error::Error for KeyError {} + +impl From for KeyError { + fn from(value: std::array::TryFromSliceError) -> Self { + Self::Any(value.to_string()) + } +} + +impl From for KeyError { + fn from(value: Infallible) -> Self { + Self::Any(value.to_string()) + } +} + +impl From for KeyError { + fn from(value: base58::Error) -> Self { + Self::Any(value.to_string()) + } +} + +impl From for KeyError { + fn from(value: bip32::Error) -> Self { + Self::Any(format!("{value:?}")) + } +} +impl From for KeyError { + fn from(value: bip38::Error) -> Self { + Self::Any(value.to_string()) + } +} + +impl From for KeyError { + fn from(value: byte::Error) -> Self { + Self::Any(format!("{value:?}")) + } +} +impl From for KeyError { + fn from(value: dashcore::secp256k1::Error) -> Self { + Self::Any(value.to_string()) + } +} +impl From for KeyError { + fn from(value: bls_signatures::BlsError) -> Self { + Self::Any(value.to_string()) + } +} +impl From for KeyError { + fn from(value: dashcore::hashes::hex::Error) -> Self { + Self::Any(value.to_string()) + } +} +impl From for KeyError { + fn from(value: ed25519_dalek::SignatureError) -> Self { + Self::Any(value.to_string()) + } +} + +impl From for KeyError { + fn from(value: encode::Error) -> Self { + Self::Any(value.to_string()) + } +} \ No newline at end of file diff --git a/dash-spv-crypto/src/keys/operator_public_key.rs b/dash-spv-crypto/src/keys/operator_public_key.rs new file mode 100644 index 00000000..d6434cfd --- /dev/null +++ b/dash-spv-crypto/src/keys/operator_public_key.rs @@ -0,0 +1,61 @@ +use std::io; +use bls_signatures::G1Element; +use dashcore::consensus::{Decodable, Encodable}; +use crate::keys::BLSKey; + +#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq)] +#[ferment_macro::export] +pub struct OperatorPublicKey { + pub data: [u8; 48], + pub version: u16, +} + +impl OperatorPublicKey { + pub fn is_basic(&self) -> bool { + self.version >= 2 + } + pub fn is_legacy(&self) -> bool { + self.version < 2 + } +} + +impl Encodable for OperatorPublicKey { + #[inline] + fn consensus_encode(&self, writer: &mut W) -> Result { + self.data.consensus_encode(writer)?; + Ok(48) + } +} + +impl Decodable for OperatorPublicKey { + #[inline] + fn consensus_decode(reader: &mut R) -> Result { + let data = <[u8; 48]>::consensus_decode(reader)?; + Ok(Self { data, version: 0 }) + } +} + + +// Ctx: (version, protocol_version) +// impl<'a> TryRead<'a, u16> for OperatorPublicKey { +// fn try_read(bytes: &'a [u8], version: u16) -> byte::Result<(Self, usize)> { +// let data = bytes.read_with::(&mut 0, byte::LE)?.0; +// Ok((OperatorPublicKey { data, version }, 48)) +// } +// } + +impl From for Option { + fn from(value: OperatorPublicKey) -> Self { + if value.is_legacy() { + G1Element::from_bytes_legacy(&value.data) + } else { + G1Element::from_bytes(&value.data) + }.ok() + } +} + +impl From for OperatorPublicKey { + fn from(key: BLSKey) -> Self { + OperatorPublicKey { data: key.public_key_uint(), version: key.bls_version() } + } +} diff --git a/dash-spv-crypto/src/lib.rs b/dash-spv-crypto/src/lib.rs new file mode 100644 index 00000000..544a7fd9 --- /dev/null +++ b/dash-spv-crypto/src/lib.rs @@ -0,0 +1,27 @@ +extern crate simplelog; + +pub mod bip; +pub mod crypto; +pub mod derivation; +#[macro_use] +pub(crate) mod internal_macros; +pub mod keys; +pub mod network; +pub mod util; + +use crate::network::DevnetType; +use crate::util::data_append::DataAppend; + +#[ferment_macro::export] +pub fn x11(data: &[u8]) -> [u8; 32] { + rs_x11_hash::get_x11_hash(data) +} + +#[ferment_macro::export] +pub fn blake3(data: &[u8]) -> [u8; 32] { + blake3::hash(data).into() +} +#[ferment_macro::export] +pub fn devnet_genesis_coinbase_message(devnet_type: DevnetType, protocol_version: u32) -> Vec { + Vec::::devnet_genesis_coinbase_message(devnet_type, protocol_version) +} diff --git a/dash-spv-masternode-processor/src/chain/common/chain_type.rs b/dash-spv-crypto/src/network/chain_type.rs similarity index 63% rename from dash-spv-masternode-processor/src/chain/common/chain_type.rs rename to dash-spv-crypto/src/network/chain_type.rs index 3b40373d..3d1c6231 100644 --- a/dash-spv-masternode-processor/src/chain/common/chain_type.rs +++ b/dash-spv-crypto/src/network/chain_type.rs @@ -1,29 +1,27 @@ +use crate::crypto::byte_util::Reversed; +use crate::util::{BIP32ScriptMap, DIP14ScriptMap, ScriptMap, SporkParams}; +use crate::util::params::DUFFS; use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4}; -use hashes::hex::FromHex; -use crate::chain::{BIP32ScriptMap, DIP14ScriptMap, ScriptMap, SporkParams}; -use crate::chain::common::LLMQType; -use crate::chain::params::DUFFS; -use crate::crypto::{byte_util::Reversable, UInt256}; +use dashcore::hashes::hex::FromHex; +use dashcore::Network; +use dashcore::secp256k1::hashes::hex::DisplayHex; +use dashcore::sml::llmq_type::LLMQType; +#[ferment_macro::export] pub trait IHaveChainSettings { - fn genesis_hash(&self) -> UInt256; + fn genesis_hash(&self) -> [u8; 32]; fn genesis_height(&self) -> u32; fn is_llmq_type(&self) -> LLMQType; fn isd_llmq_type(&self) -> LLMQType; fn chain_locks_type(&self) -> LLMQType; fn platform_type(&self) -> LLMQType; - fn should_process_llmq_of_type(&self, llmq_type: LLMQType) -> bool { - self.chain_locks_type() == llmq_type || - self.is_llmq_type() == llmq_type || - self.platform_type() == llmq_type || - self.isd_llmq_type() == llmq_type - } + fn should_process_llmq_of_type(&self, llmq_type: LLMQType) -> bool; fn is_evolution_enabled(&self) -> bool; fn name(&self) -> String; } -#[repr(C)] -#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Hash)] +#[derive(Clone, Debug, Default, Eq, PartialEq, Hash)] +#[ferment_macro::export] pub enum ChainType { #[default] MainNet, @@ -31,6 +29,7 @@ pub enum ChainType { DevNet(DevnetType), } +// #[ferment_macro::export] impl From for ChainType { fn from(orig: i16) -> Self { match orig { @@ -50,8 +49,8 @@ impl From for i16 { } } } -#[repr(C)] -#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Hash)] +#[derive(Clone, Debug, Default, Eq, PartialEq, Hash)] +#[ferment_macro::export] pub enum DevnetType { JackDaniels = 0, Devnet333 = 1, @@ -65,6 +64,7 @@ pub enum DevnetType { Screwdriver = 8, Absinthe = 9, Bintang = 10, + DRA = 11, } impl From for ChainType { @@ -77,7 +77,7 @@ impl From for DevnetType { fn from(orig: ChainType) -> Self { match orig { ChainType::DevNet(devnet_type) => devnet_type, - _ => panic!("Can't get DevnetType from ChainType {:?}", orig) + _ => panic!("Can't get DevnetType from ChainType {:?}", orig), } } } @@ -96,6 +96,7 @@ impl From for DevnetType { 8 => DevnetType::Screwdriver, 9 => DevnetType::Absinthe, 10 => DevnetType::Bintang, + 11 => DevnetType::DRA, _ => DevnetType::JackDaniels, } } @@ -115,6 +116,7 @@ impl From for i16 { DevnetType::Screwdriver => 8, DevnetType::Absinthe => 9, DevnetType::Bintang => 10, + DevnetType::DRA => 11, } } } @@ -133,12 +135,13 @@ impl From<&str> for DevnetType { "devnet-screwdriver" => DevnetType::Screwdriver, "devnet-absinthe" => DevnetType::Absinthe, "devnet-bintang" => DevnetType::Bintang, - _ => panic!("Devnet with name: {} not supported", value) + "devnet-DRA" => DevnetType::DRA, + _ => panic!("Devnet with name: {} not supported", value), } } } - +#[ferment_macro::export] impl DevnetType { pub fn identifier(&self) -> String { match self { @@ -153,90 +156,45 @@ impl DevnetType { DevnetType::Screwdriver => "devnet-screwdriver", DevnetType::Absinthe => "devnet-absinthe", DevnetType::Bintang => "devnet-bintang", + DevnetType::DRA => "devnet-DRA", }.to_string() } pub fn version(&self) -> u16 { 1 } -} - -impl ChainType { - pub fn is_mainnet(&self) -> bool { - *self == ChainType::MainNet - } - - pub fn is_testnet(&self) -> bool { - *self == ChainType::TestNet - } - - pub fn is_devnet_any(&self) -> bool { - !self.is_mainnet() && !self.is_testnet() - } - - pub fn user_agent(&self) -> String { - format!("/dash-spv-core:{}{}/", env!("CARGO_PKG_VERSION"), - match self { - ChainType::MainNet => format!(""), - ChainType::TestNet => format!("(testnet)"), - ChainType::DevNet(devnet_type) => format!("(devnet.{})", devnet_type.identifier()) - }) - } - - pub fn coin_type(&self) -> u32 { - if self.is_mainnet() { 5 } else { 1 } - } - - pub fn devnet_identifier(&self) -> Option { - if let ChainType::DevNet(devnet_type) = self { - Some(devnet_type.identifier()) - } else { - None - } - } - - pub fn devnet_version(&self) -> Option { - if let ChainType::DevNet(devnet_type) = self { - Some(devnet_type.version() as i16) - } else { - None - } - } - - pub fn dns_seeds(&self) -> Vec<&str> { - match self { - ChainType::MainNet => vec!["dnsseed.dash.org"], - ChainType::TestNet => vec!["testnet-seed.dashdot.io"], - ChainType::DevNet(_) => vec![] - } - } - - pub fn script_map(&self) -> ScriptMap { - match self { - ChainType::MainNet => ScriptMap::MAINNET, - _ => ScriptMap::TESTNET - } - } - pub fn bip32_script_map(&self) -> BIP32ScriptMap { - match self { - ChainType::MainNet => BIP32ScriptMap::MAINNET, - _ => BIP32ScriptMap::TESTNET - } - } - pub fn dip14_script_map(&self) -> DIP14ScriptMap { + pub fn index(&self) -> u16 { match self { - ChainType::MainNet => DIP14ScriptMap::MAINNET, - _ => DIP14ScriptMap::TESTNET + DevnetType::JackDaniels => 0, + DevnetType::Devnet333 => 1, + DevnetType::Chacha => 2, + DevnetType::Mojito => 3, + DevnetType::WhiteRussian => 4, + DevnetType::MiningTest => 5, + DevnetType::Mobile2 => 6, + DevnetType::Zero => 7, + DevnetType::Screwdriver => 8, + DevnetType::Absinthe => 9, + DevnetType::Bintang => 10, + DevnetType::DRA => 11, } } } +#[ferment_macro::export] impl IHaveChainSettings for ChainType { - - fn genesis_hash(&self) -> UInt256 { + fn genesis_hash(&self) -> [u8; 32] { match self { - ChainType::MainNet => UInt256::from_hex("00000ffd590b1485b3caadc19b22e6379c733355108f107a430458cdf3407ab6").unwrap().reverse(), - ChainType::TestNet => UInt256::from_hex("00000bafbc94add76cb75e2ec92894837288a481e5c005f6563d91623bf8bc2c").unwrap().reverse(), + ChainType::MainNet => <[u8; 32]>::from_hex( + "00000ffd590b1485b3caadc19b22e6379c733355108f107a430458cdf3407ab6", + ) + .unwrap() + .reversed(), + ChainType::TestNet => <[u8; 32]>::from_hex( + "00000bafbc94add76cb75e2ec92894837288a481e5c005f6563d91623bf8bc2c", + ) + .unwrap() + .reversed(), ChainType::DevNet(devnet_type) => devnet_type.genesis_hash(), } } @@ -277,31 +235,52 @@ impl IHaveChainSettings for ChainType { } } + fn should_process_llmq_of_type(&self, llmq_type: LLMQType) -> bool { + self.chain_locks_type() == llmq_type + || self.is_llmq_type() == llmq_type + || self.platform_type() == llmq_type + || self.isd_llmq_type() == llmq_type + } + fn is_evolution_enabled(&self) -> bool { - false + true } fn name(&self) -> String { match self { Self::MainNet => "Mainnet".to_string(), Self::TestNet => "Testnet".to_string(), - Self::DevNet(devnet) => devnet.name() + Self::DevNet(devnet) => devnet.name(), } } } +#[ferment_macro::export] impl IHaveChainSettings for DevnetType { - - fn genesis_hash(&self) -> UInt256 { - UInt256::from_hex(match self { - DevnetType::JackDaniels => "79ee40288949fd61132c025761d4f065e161d60a88aab4c03e613ca8718d1d26", - DevnetType::Chacha => "8862eca4bdb5255b51dc72903b8a842f6ffe7356bc40c7b7a7437b8e4556e220", - DevnetType::Mojito => "739507391fa00da48a2ecae5df3b5e40b4432243603db6dafe33ca6b4966e357", - DevnetType::WhiteRussian => "9163d6958065ca5e73c36f0f2474ce618846260c215f5cba633bd0003585cb35", - DevnetType::Screwdriver => "4ac35ceb629e529b2a0eb2e2676983d4b11ebddaff5bd00cae7156a02b521e6f", - DevnetType::Absinthe => "53ab7716f36a92068d7bbfa6475681018788a438e028d8bfdf86bfff4f6b78ab", + fn genesis_hash(&self) -> [u8; 32] { + <[u8; 32]>::from_hex(match self { + DevnetType::JackDaniels => { + "79ee40288949fd61132c025761d4f065e161d60a88aab4c03e613ca8718d1d26" + }, + DevnetType::Chacha => { + "8862eca4bdb5255b51dc72903b8a842f6ffe7356bc40c7b7a7437b8e4556e220" + }, + DevnetType::Mojito => { + "739507391fa00da48a2ecae5df3b5e40b4432243603db6dafe33ca6b4966e357" + }, + DevnetType::WhiteRussian => { + "9163d6958065ca5e73c36f0f2474ce618846260c215f5cba633bd0003585cb35" + }, + DevnetType::Screwdriver => { + "4ac35ceb629e529b2a0eb2e2676983d4b11ebddaff5bd00cae7156a02b521e6f" + }, + DevnetType::Absinthe => { + "53ab7716f36a92068d7bbfa6475681018788a438e028d8bfdf86bfff4f6b78ab" + }, _ => "00000bafbc94add76cb75e2ec92894837288a481e5c005f6563d91623bf8bc2c", - }).unwrap().reverse() + }) + .unwrap() + .reversed() } fn genesis_height(&self) -> u32 { @@ -324,6 +303,13 @@ impl IHaveChainSettings for DevnetType { LLMQType::LlmqtypeTestnetPlatform } + fn should_process_llmq_of_type(&self, llmq_type: LLMQType) -> bool { + self.chain_locks_type() == llmq_type + || self.is_llmq_type() == llmq_type + || self.platform_type() == llmq_type + || self.isd_llmq_type() == llmq_type + } + fn is_evolution_enabled(&self) -> bool { false } @@ -333,7 +319,93 @@ impl IHaveChainSettings for DevnetType { } } // Params +#[ferment_macro::export] impl ChainType { + pub fn is_mainnet(&self) -> bool { + *self == ChainType::MainNet + } + + pub fn is_testnet(&self) -> bool { + *self == ChainType::TestNet + } + + pub fn is_devnet_any(&self) -> bool { + !self.is_mainnet() && !self.is_testnet() + } + + pub fn insight_url(&self) -> Option { + match self { + ChainType::MainNet => Some("https://insight.dash.org/insight-api".to_string()), + ChainType::TestNet => Some("https://insight.testnet.networks.dash.org/insight-api".to_string()), + ChainType::DevNet(_) => None + } + } + pub fn user_agent(&self) -> String { + format!( + "/dash-spv-core:{}{}/", + env!("CARGO_PKG_VERSION"), + match self { + ChainType::MainNet => format!(""), + ChainType::TestNet => format!("(testnet)"), + ChainType::DevNet(devnet_type) => format!("(devnet.{})", devnet_type.identifier()), + } + ) + } + + pub fn coin_type(&self) -> u32 { + if self.is_mainnet() { + 5 + } else { + 1 + } + } + + pub fn devnet_identifier(&self) -> Option { + if let ChainType::DevNet(devnet_type) = self { + Some(devnet_type.identifier()) + } else { + None + } + } + + pub fn devnet_version(&self) -> i16 { + if let ChainType::DevNet(devnet_type) = self { + devnet_type.version() as i16 + } else { + 0 + } + } + + pub fn dns_seeds(&self) -> Vec { + match self { + ChainType::MainNet => vec!["dnsseed.dash.org".to_string()], + ChainType::TestNet => vec!["testnet-seed.dashdot.io".to_string()], + ChainType::DevNet(_) => vec![], + } + } + + pub fn script_priv_key(&self) -> u8 { + self.script_map().privkey + } + + pub fn script_map(&self) -> ScriptMap { + match self { + ChainType::MainNet => ScriptMap::MAINNET, + _ => ScriptMap::TESTNET, + } + } + pub fn bip32_script_map(&self) -> BIP32ScriptMap { + match self { + ChainType::MainNet => BIP32ScriptMap::MAINNET, + _ => BIP32ScriptMap::TESTNET, + } + } + pub fn dip14_script_map(&self) -> DIP14ScriptMap { + match self { + ChainType::MainNet => DIP14ScriptMap::MAINNET, + _ => DIP14ScriptMap::TESTNET, + } + } pub fn from_magic(magic: u32) -> Option { // Note: any new entries here must be added to `magic` below match magic { @@ -355,23 +427,29 @@ impl ChainType { !self.is_mainnet() } - pub fn max_proof_of_work(&self) -> UInt256 { - UInt256::from_hex(if self.is_devnet_any() { + pub fn max_proof_of_work(&self) -> [u8; 32] { + <[u8; 32]>::from_hex(if self.is_devnet_any() { "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" } else { "00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - }).unwrap().reverse() + }) + .unwrap() + .reversed() } pub fn max_proof_of_work_target(&self) -> u32 { - if self.is_devnet_any() { 0x207fffff } else { 0x1e0fffff } + if self.is_devnet_any() { + 0x207fffff + } else { + 0x1e0fffff + } } pub fn min_protocol_version(&self) -> u32 { match self { ChainType::MainNet => 70218, ChainType::TestNet => 70218, - ChainType::DevNet(_) => 70219 + ChainType::DevNet(_) => 70219, } } @@ -391,13 +469,24 @@ impl ChainType { match self { ChainType::MainNet => 9999, ChainType::TestNet => 19999, - ChainType::DevNet(_) => 20001 + ChainType::DevNet(_) => 20001, } } - pub fn standard_dapi_grpc_port(&self) -> u16 { 3010 } + pub fn platform_port(&self) -> u16 { + match self { + ChainType::MainNet => 443, + _ => 1443, + } + } - pub fn standard_dapi_jrpc_port(&self) -> u16 { 3000 } + pub fn standard_dapi_grpc_port(&self) -> u16 { + 3010 + } + + pub fn standard_dapi_jrpc_port(&self) -> u16 { + 3000 + } pub fn localhost(&self) -> SocketAddr { SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::from(0x7f000001), 0)) @@ -414,7 +503,14 @@ impl ChainType { pub fn base_reward(&self) -> u64 { match self { ChainType::MainNet => 5 * DUFFS, - _ => 50 * DUFFS + _ => 50 * DUFFS, + } + } + pub fn magic_number(&self) -> u64 { + match self { + ChainType::MainNet => 0xbd6b0cbf, + ChainType::TestNet => 0xffcae2ce, + ChainType::DevNet(..) => 0xceffcae2, } } @@ -462,7 +558,7 @@ impl ChainType { match self { ChainType::MainNet => 20, ChainType::TestNet => 40, - ChainType::DevNet(_) => 4 + ChainType::DevNet(_) => 4, } } @@ -470,7 +566,7 @@ impl ChainType { match self { ChainType::MainNet => 1899072, ChainType::TestNet => 850100, - ChainType::DevNet(_) => 0 + ChainType::DevNet(_) => 0, } } @@ -485,4 +581,62 @@ impl ChainType { height >= self.core20_activation_height() } + pub fn identifier(&self) -> String { + match self { + ChainType::MainNet => "mainnet".to_string(), + ChainType::TestNet => "testnet".to_string(), + ChainType::DevNet(dev) => dev.identifier() + } + } + + pub fn index(&self) -> u16 { + match self { + ChainType::MainNet => 0, + ChainType::TestNet => 1, + ChainType::DevNet(..) => 2 + } + } + pub fn devnet_type(&self) -> DevnetType { + match self { + ChainType::DevNet(devnet_type) => devnet_type.clone(), + _ => panic!("Can't get DevnetType from ChainType {:?}", self), + } + } + + pub fn unique_id(&self) -> String { + let genesis = self.genesis_hash(); + let slice = &genesis[..8]; + slice.to_lower_hex_string() + } + +} +#[ferment_macro::export] +pub fn chain_type_from_index(index: u16) -> ChainType { + ChainType::from(index as i16) +} +#[ferment_macro::export] +pub fn devnet_type_from_index(index: u16) -> DevnetType { + DevnetType::from(index as i16) +}#[ferment_macro::export] +pub fn devnet_type_from_identifier(identifier: &str) -> DevnetType { + DevnetType::from(identifier) +} + +impl From for Network { + fn from(value: ChainType) -> Self { + match value { + ChainType::MainNet => Network::Dash, + ChainType::TestNet => Network::Testnet, + ChainType::DevNet(_) => Network::Devnet, + } + } } +impl From for ChainType { + fn from(value: Network) -> Self { + match value { + Network::Dash => ChainType::MainNet, + Network::Testnet => ChainType::TestNet, + _ => ChainType::DevNet(DevnetType::default()), + } + } +} \ No newline at end of file diff --git a/dash-spv-crypto/src/network/mod.rs b/dash-spv-crypto/src/network/mod.rs new file mode 100644 index 00000000..b66b646d --- /dev/null +++ b/dash-spv-crypto/src/network/mod.rs @@ -0,0 +1,15 @@ +pub mod chain_type; +pub use self::chain_type::{ChainType, DevnetType, IHaveChainSettings}; + +pub const DASH_MESSAGE_MAGIC: &str = "DarkCoin Signed Message:\n"; + +pub const CORE_PROTO_BLS_BASIC: u32 = 70225; +pub const CORE_PROTO_19: u32 = 70227; +pub const CORE_PROTO_19_2: u32 = 70228; +pub const CORE_PROTO_DIFF_VERSION_ORDER: u32 = 70229; +pub const CORE_PROTO_20: u32 = 70230; + +pub const CHAIN_LOCK_ACTIVATION_HEIGHT: u32 = 1088640; + +pub static SIGHASH_ALL: u32 = 1; +pub static TXIN_SEQUENCE: u32 = u32::MAX; diff --git a/dash-spv-masternode-processor/src/util/address.rs b/dash-spv-crypto/src/util/address.rs similarity index 67% rename from dash-spv-masternode-processor/src/util/address.rs rename to dash-spv-crypto/src/util/address.rs index b43ce22a..d070c3ed 100644 --- a/dash-spv-masternode-processor/src/util/address.rs +++ b/dash-spv-crypto/src/util/address.rs @@ -1,31 +1,47 @@ pub mod address { - use hashes::{Hash, hash160, sha256d}; - use hashes::hex::{FromHex, ToHex}; - use crate::chain::params::{BITCOIN_PUBKEY_ADDRESS, BITCOIN_SCRIPT_ADDRESS, ScriptMap}; - use crate::consensus::Encodable; + use dashcore::hashes::{Hash, hash160, sha256d}; + use dashcore::hashes::hex::FromHex; + use crate::util::params::{BITCOIN_PUBKEY_ADDRESS, BITCOIN_SCRIPT_ADDRESS, ScriptMap}; + use dashcore::consensus::Encodable; + use dashcore::secp256k1::hashes::hex::DisplayHex; use crate::crypto::byte_util::clone_into_array; - use crate::crypto::UInt160; + use crate::network::ChainType; use crate::util::base58; use crate::util::data_append::DataAppend; use crate::util::script::ScriptElement; use crate::util::sec_vec::SecVec; - pub fn from_hash160_for_script_map(hash: &UInt160, map: &ScriptMap) -> String { + pub fn from_hash160_for_script_map(hash: &[u8; 20], map: &ScriptMap) -> String { let mut writer: Vec = Vec::new(); - map.pubkey.enc(&mut writer); - hash.enc(&mut writer); - let val = u32::from_le_bytes(clone_into_array(&sha256d::Hash::hash(&writer).into_inner()[..4])); - val.enc(&mut writer); + map.pubkey.consensus_encode(&mut writer).unwrap(); + hash.consensus_encode(&mut writer).unwrap(); + let val = u32::from_le_bytes(clone_into_array(&sha256d::Hash::hash(&writer).to_byte_array()[..4])); + val.consensus_encode(&mut writer).unwrap(); base58::encode_slice(&writer) } - pub fn with_public_key_data(data: &[u8], map: &ScriptMap) -> String { + #[ferment_macro::export] + pub fn with_public_key_data(data: &[u8], map: ChainType) -> String { + with_public_key_data_and_script_pub_key(data, map.script_map().pubkey) + } + #[ferment_macro::export] + pub fn with_public_key_data_and_script_pub_key(data: &[u8], script_pub_key: u8) -> String { let mut writer = SecVec::with_capacity(21); - map.pubkey.enc(&mut writer); - UInt160::hash160(data).enc(&mut writer); + script_pub_key.consensus_encode(&mut writer).unwrap(); + hash160::Hash::hash(data).consensus_encode(&mut writer).unwrap(); base58::check_encode_slice(&writer) } + #[ferment_macro::export] + pub fn public_key_hash_from_script(script: Vec) -> Option> { + match script.script_elements()[..] { + // pay-to-pubkey-hash scriptPubKey + [ScriptElement::Number(0x76/*OP_DUP*/), ScriptElement::Number(0xa9/*OP_HASH160*/), ScriptElement::Data(data, _len @ b'\x14'), ScriptElement::Number(0x88/*OP_EQUALVERIFY*/), ScriptElement::Number(0xac/*OP_CHECKSIG*/)] => + Some(data.to_vec()), + _ => None + } + } + // NOTE: It's important here to be permissive with scriptSig (spends) and strict with scriptPubKey (receives). If we // miss a receive transaction, only that transaction's funds are missed, however if we accept a receive transaction that @@ -34,14 +50,14 @@ pub mod address { pub fn with_script_pub_key(script: &Vec, map: &ScriptMap) -> Option { match script.script_elements()[..] { // pay-to-pubkey-hash scriptPubKey - [ScriptElement::Number(0x76/*OP_DUP*/), ScriptElement::Number(0xa9/*OP_HASH160*/), ScriptElement::Data(data, len @ b'\x14'), ScriptElement::Number(0x88/*OP_EQUALVERIFY*/), ScriptElement::Number(0xac/*OP_CHECKSIG*/)] => + [ScriptElement::Number(0x76/*OP_DUP*/), ScriptElement::Number(0xa9/*OP_HASH160*/), ScriptElement::Data(data, _len @ b'\x14'), ScriptElement::Number(0x88/*OP_EQUALVERIFY*/), ScriptElement::Number(0xac/*OP_CHECKSIG*/)] => Some([&[map.pubkey], data].concat()), // pay-to-script-hash scriptPubKey - [ScriptElement::Number(0xa9/*OP_HASH160*/), ScriptElement::Data(data, len @ b'\x14'), ScriptElement::Number(0x87/*OP_EQUAL*/)] => + [ScriptElement::Number(0xa9/*OP_HASH160*/), ScriptElement::Data(data, _len @ b'\x14'), ScriptElement::Number(0x87/*OP_EQUAL*/)] => Some([&[map.script], data].concat()), // pay-to-pubkey scriptPubKey - [ScriptElement::Data(data, len @ 33u8 | len @ 65u8), ScriptElement::Number(0xac/*OP_CHECKSIG*/)] => - Some([&[map.pubkey] as &[u8], &hash160::Hash::hash(data).into_inner()].concat()), + [ScriptElement::Data(data, _len @ 33u8 | _len @ 65u8), ScriptElement::Number(0xac/*OP_CHECKSIG*/)] => + Some([&[map.pubkey] as &[u8], &hash160::Hash::hash(data).to_byte_array()].concat()), // unknown script type _ => None }.map(|data| base58::check_encode_slice(&data)) @@ -50,11 +66,11 @@ pub mod address { pub fn with_script_sig(script: &Vec, map: &ScriptMap) -> Option { match script.script_elements()[..] { // pay-to-pubkey-hash scriptSig - [.., ScriptElement::Data(.., 0..=0x4e), ScriptElement::Data(data, len @ 33 | len @ 65)] => - Some([&[map.pubkey] as &[u8], &hash160::Hash::hash(data).into_inner()].concat()), + [.., ScriptElement::Data(.., 0..=0x4e), ScriptElement::Data(data, _len @ 33 | _len @ 65)] => + Some([&[map.pubkey] as &[u8], &hash160::Hash::hash(data).to_byte_array()].concat()), // pay-to-script-hash scriptSig - [.., ScriptElement::Data(.., 0..=0x4e), ScriptElement::Data(data, len @ 0..=0x4e)] => - Some([&[map.script] as &[u8], &hash160::Hash::hash(data).into_inner()].concat()), + [.., ScriptElement::Data(.., 0..=0x4e), ScriptElement::Data(data, _len @ 0..=0x4e)] => + Some([&[map.script] as &[u8], &hash160::Hash::hash(data).to_byte_array()].concat()), // pay-to-pubkey scriptSig // TODO: implement Peter Wullie's pubKey recovery from signature [.., ScriptElement::Data(.., 0..=0x4e)] => None, @@ -107,7 +123,7 @@ pub mod address { d[0] == map.privkey } else { // hex encoded key - let hex_key = address.as_bytes().to_hex(); + let hex_key = address.as_bytes().to_lower_hex_string(); if let Ok(data) = Vec::from_hex(hex_key.as_str()) { data.len() == 32 } else { diff --git a/dash-spv-masternode-processor/src/util/base58.rs b/dash-spv-crypto/src/util/base58.rs similarity index 97% rename from dash-spv-masternode-processor/src/util/base58.rs rename to dash-spv-crypto/src/util/base58.rs index 4fbd1c21..2bde914b 100644 --- a/dash-spv-masternode-processor/src/util/base58.rs +++ b/dash-spv-crypto/src/util/base58.rs @@ -15,8 +15,8 @@ //! Base58 encoder and decoder use core::{fmt, str, iter, slice}; -use secp256k1; -use hashes::{Hash, sha256d}; +use dashcore::secp256k1; +use dashcore::hashes::{sha256d, Hash}; use crate::util::{endian, key}; /// An error that might occur during base58 decoding @@ -54,8 +54,6 @@ impl fmt::Display for Error { } } -#[cfg(feature = "std")] -#[cfg_attr(docsrs, doc(cfg(feature = "std")))] impl ::std::error::Error for Error {} /// Vector-like object that holds the first 100 elements on the stack. If more space is needed it @@ -154,7 +152,7 @@ pub fn from_check(data: &str) -> Result, Error> { return Err(Error::TooShort(ret.len())); } let ck_start = ret.len() - 4; - let expected = endian::slice_to_u32_le(&sha256d::Hash::hash(&ret[..ck_start])[..4]); + let expected = endian::slice_to_u32_le(&sha256d::Hash::hash(&ret[..ck_start]).to_byte_array()[..4]); let actual = endian::slice_to_u32_le(&ret[ck_start..(ck_start + 4)]); if expected != actual { return Err(Error::BadChecksum(expected, actual)); @@ -227,14 +225,14 @@ pub fn check_encode_slice(data: &[u8]) -> String { encode_iter( data.iter() .cloned() - .chain(checksum[0..4].iter().cloned()) + .chain(checksum.to_byte_array()[0..4].iter().cloned()) ) } /// Obtain a string with the base58check encoding of a slice /// (Tack the first 4 256-digits of the object's Bitcoin hash onto the end.) pub fn check_encode_slice_to_fmt(fmt: &mut fmt::Formatter, data: &[u8]) -> fmt::Result { - let checksum = sha256d::Hash::hash(data); + let checksum = sha256d::Hash::hash(data).to_byte_array(); let iter = data.iter() .cloned() .chain(checksum[0..4].iter().cloned()); @@ -253,7 +251,7 @@ impl From for Error { #[cfg(test)] mod tests { - use hashes::hex::FromHex; + use dashcore::hashes::hex::FromHex; use super::*; #[test] diff --git a/dash-spv-masternode-processor/src/util/cc_crypt.rs b/dash-spv-crypto/src/util/cc_crypt.rs similarity index 85% rename from dash-spv-masternode-processor/src/util/cc_crypt.rs rename to dash-spv-crypto/src/util/cc_crypt.rs index 2d425a6a..d2278046 100644 --- a/dash-spv-masternode-processor/src/util/cc_crypt.rs +++ b/dash-spv-crypto/src/util/cc_crypt.rs @@ -1,4 +1,5 @@ use std::os::raw::c_void; +use crate::keys::KeyError; // const K_CCENCRYPT: u32 = 0; // const K_CCDECRYPT: u32 = 1; @@ -25,16 +26,15 @@ extern "C" { ) -> i32; } +#[allow(unused)] fn random_initialization_vector_of_size(size: usize) -> Vec { - use secp256k1::rand; - use secp256k1::rand::distributions::Uniform; - use secp256k1::rand::Rng; - let mut rng = rand::thread_rng(); + use dashcore::secp256k1::rand::{distributions::Uniform, Rng, thread_rng}; + let mut rng = thread_rng(); let range = Uniform::new(0, 255); (0..size).map(|_| rng.sample(&range)).collect() } -pub fn aes256_encrypt_decrypt(operation: Operation, data: impl AsRef<[u8]>, key: impl AsRef<[u8]>, iv: impl AsRef<[u8]>) -> Option> { +pub fn aes256_encrypt_decrypt(operation: Operation, data: impl AsRef<[u8]>, key: impl AsRef<[u8]>, iv: impl AsRef<[u8]>) -> Result, KeyError> { let operation = match operation { Operation::Encrypt => 0, // kCCEncrypt Operation::Decrypt => 1, // kCCDecrypt @@ -67,8 +67,8 @@ pub fn aes256_encrypt_decrypt(operation: Operation, data: impl AsRef<[u8]>, key: if result == 0 { // kCCSuccess data_out.truncate(bytes_written); - Some(data_out) + Ok(data_out) } else { - None + Err(KeyError::CCCrypt(result)) } } diff --git a/dash-spv-masternode-processor/src/util/data_append.rs b/dash-spv-crypto/src/util/data_append.rs similarity index 65% rename from dash-spv-masternode-processor/src/util/data_append.rs rename to dash-spv-crypto/src/util/data_append.rs index 3ad9f1b5..c629485b 100644 --- a/dash-spv-masternode-processor/src/util/data_append.rs +++ b/dash-spv-crypto/src/util/data_append.rs @@ -1,10 +1,8 @@ -use hashes::{Hash, sha256d}; -use crate::blockdata::opcodes::all::{OP_CHECKSIG, OP_DUP, OP_EQUAL, OP_EQUALVERIFY, OP_HASH160, OP_PUSHDATA1, OP_PUSHDATA2, OP_PUSHDATA4, OP_RETURN}; -use crate::chain::common::chain_type::DevnetType; -use crate::chain::params::{BITCOIN_SCRIPT_ADDRESS, ScriptMap}; -use crate::consensus::{Encodable, WriteExt}; -use crate::util::base58; -use crate::util::script::{op_len, ScriptElement}; +use dashcore::blockdata::opcodes::all::{OP_CHECKSIG, OP_DUP, OP_EQUAL, OP_EQUALVERIFY, OP_HASH160, OP_PUSHDATA1, OP_PUSHDATA2, OP_PUSHDATA4, OP_RETURN}; +use dashcore::consensus::{Encodable, WriteExt}; +use dashcore::hashes::{Hash, sha256d}; +use crate::network::DevnetType; +use crate::util::{base58, params::BITCOIN_SCRIPT_ADDRESS, ScriptMap, script::{op_len, ScriptElement}}; pub trait DataAppend: std::io::Write { fn from_coinbase_message(message: &String, height: u32) -> Self; @@ -17,12 +15,10 @@ pub trait DataAppend: std::io::Write { fn append_coinbase_message(&self, message: &String, height: u32, writer: W) -> W; fn append_devnet_genesis_coinbase_message(devnet_type: DevnetType, protocol_version: u32, writer: Self) -> Self; fn append_credit_burn_script_pub_key_for_address(address: &String, script_map: &ScriptMap, writer: Self) -> Self; - fn append_proposal_info(proposal_info: &Vec, writer: Self) -> Self; + fn append_proposal_info(proposal_info: &[u8], writer: Self) -> Self; fn append_script_pub_key_for_address(address: &str, script_map: &ScriptMap, writer: Self) -> Self; fn append_script_push_data(&self, writer: W); - // fn append_script_push_data(&mut self, data: Vec); fn append_shapeshift_memo_for_address(address: String, writer: Self) -> Self; - // fn append_string(&mut self, data: String); fn script_elements(&self) -> Vec; } @@ -35,7 +31,6 @@ impl DataAppend for Vec /* io::Write */ { fn from_coinbase_message(message: &String, height: u32) -> Self { Vec::::new().append_coinbase_message(message, height, Vec::::new()) - // Self::append_coinbase_message(message, height, Vec::::new()) } fn devnet_genesis_coinbase_message(devnet_type: DevnetType, protocol_version: u32) -> Self { @@ -58,45 +53,39 @@ impl DataAppend for Vec /* io::Write */ { Self::append_shapeshift_memo_for_address(address, Vec::::new()) } - // fn append_coinbase_message(message: &String, height: u32, mut writer: W) { fn append_coinbase_message(&self, message: &String, height: u32, mut writer: W) -> W { - - // } - // fn append_coinbase_message(message: &String, height: u32, mut writer: Self) -> Self { - // todo: check - //NSUInteger l = [message lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; let l = message.len(); match height { 0..=0xfc => { let header = l as u8; let payload = height as u8; - header.enc(&mut writer); - payload.enc(&mut writer); + header.consensus_encode(&mut writer).unwrap(); + payload.consensus_encode(&mut writer).unwrap(); }, 0xfd..=U16MAX => { let header = (0xfd + l) as u8; let payload = (height as u16).swap_bytes(); - header.enc(&mut writer); - payload.enc(&mut writer); + header.consensus_encode(&mut writer).unwrap(); + payload.consensus_encode(&mut writer).unwrap(); }, U16MAX_PLUS_1..=u32::MAX => { let header = (0xfe + l) as u8; let payload = height.swap_bytes(); - header.enc(&mut writer); - payload.enc(&mut writer); + header.consensus_encode(&mut writer).unwrap(); + payload.consensus_encode(&mut writer).unwrap(); } } - message.enc(&mut writer); + message.consensus_encode(&mut writer).unwrap(); writer } - fn append_devnet_genesis_coinbase_message(devnet_type: DevnetType, protocol_version: u32, mut writer: Self) -> Self { + fn append_devnet_genesis_coinbase_message(devnet_type: DevnetType, _protocol_version: u32, mut writer: Self) -> Self { // A little weirder - 0x51u8.enc(&mut writer); + 0x51u8.consensus_encode(&mut writer).unwrap(); let identifier = devnet_type.identifier(); let bytes = identifier.as_bytes(); let len: u8 = bytes.len() as u8; - len.enc(&mut writer); + len.consensus_encode(&mut writer).unwrap(); writer.emit_slice(bytes).unwrap(); //if protocol_version >= 70221 { // [self appendUInt8:version + 0x50]; @@ -104,11 +93,11 @@ impl DataAppend for Vec /* io::Write */ { writer } - fn append_credit_burn_script_pub_key_for_address(address: &String, script_map: &ScriptMap, mut writer: Self) -> Self { + fn append_credit_burn_script_pub_key_for_address(address: &String, _script_map: &ScriptMap, mut writer: Self) -> Self { // todo: check impl base58checkToData match base58::from_check(address.as_str()) { Ok(d) if d.len() == 21 => { - OP_RETURN.into_u8().enc(&mut writer); + OP_RETURN.to_u8().consensus_encode(&mut writer).unwrap(); // d[1..].to_vec().append_script_push_data(&mut writer); // writer.append_script_push_data(d[1..].to_vec()); d[1..].to_vec().append_script_push_data(&mut writer); @@ -118,11 +107,11 @@ impl DataAppend for Vec /* io::Write */ { } } - fn append_proposal_info(proposal_info: &Vec, mut writer: Self) -> Self { - let hash = sha256d::Hash::hash(proposal_info).into_inner(); - OP_RETURN.into_u8().enc(&mut writer); + fn append_proposal_info(proposal_info: &[u8], mut writer: Self) -> Self { + // let hash = sha256d::Hash::hash(proposal_info).into_inner(); + OP_RETURN.to_u8().consensus_encode(&mut writer).unwrap(); // TODO check we need to write varint - hash.to_vec().enc(&mut writer); + sha256d::Hash::hash(proposal_info).consensus_encode(&mut writer).unwrap(); // writer.append_script_push_data(hash.to_vec()); // hash.to_vec().append_script_push_data(&mut writer); writer @@ -132,18 +121,18 @@ impl DataAppend for Vec /* io::Write */ { match base58::from_check(address) { Ok(data) => match &data[..] { [v, data @ ..] if *v == script_map.pubkey => { - OP_DUP.into_u8().enc(&mut writer); - OP_HASH160.into_u8().enc(&mut writer); + OP_DUP.to_u8().consensus_encode(&mut writer).unwrap(); + OP_HASH160.to_u8().consensus_encode(&mut writer).unwrap(); // writer.append_script_push_data(data.to_vec()); data.to_vec().append_script_push_data(&mut writer); - OP_EQUALVERIFY.into_u8().enc(&mut writer); - OP_CHECKSIG.into_u8().enc(&mut writer); + OP_EQUALVERIFY.to_u8().consensus_encode(&mut writer).unwrap(); + OP_CHECKSIG.to_u8().consensus_encode(&mut writer).unwrap(); }, [v, data @ ..] if *v == script_map.script => { - OP_HASH160.into_u8().enc(&mut writer); + OP_HASH160.to_u8().consensus_encode(&mut writer).unwrap(); writer.append_script_push_data(data.to_vec()); // data.to_vec().append_script_push_data(&mut writer); - OP_EQUAL.into_u8().enc(&mut writer); + OP_EQUAL.to_u8().consensus_encode(&mut writer).unwrap(); }, _ => {} }, @@ -152,53 +141,29 @@ impl DataAppend for Vec /* io::Write */ { writer } - // fn append_script_push_data(&mut self, data: Vec) { - // let len = data.len(); - // match len { - // 0 => { return }, - // 1..=0x4b => { - // (len as u8).enc(self); - // } - // 0x4c..=0xffff => { - // OP_PUSHDATA1.into_u8().enc(self); - // (len as u8).enc(self); - // }, - // 0x10000..=0xffffffff => { - // OP_PUSHDATA2.into_u8().enc(self); - // (len as u16).enc(self); - // }, - // _ => { - // OP_PUSHDATA4.into_u8().enc(self); - // (len as u32).enc(self); - // }, - // } - // self.extend(data); - // } fn append_script_push_data(&self, mut writer: W) { // todo: migrate into slice let len = self.len(); match len { 0 => { return; }, 1..=0x4b => { - (len as u8).enc(&mut writer); + (len as u8).consensus_encode(&mut writer).unwrap(); } 0x4c..=0xffff => { - OP_PUSHDATA1.into_u8().enc(&mut writer); - (len as u8).enc(&mut writer); + OP_PUSHDATA1.to_u8().consensus_encode(&mut writer).unwrap(); + (len as u8).consensus_encode(&mut writer).unwrap(); }, 0x10000..=0xffffffff => { - OP_PUSHDATA2.into_u8().enc(&mut writer); - (len as u16).enc(&mut writer); + OP_PUSHDATA2.to_u8().consensus_encode(&mut writer).unwrap(); + (len as u16).consensus_encode(&mut writer).unwrap(); }, _ => { - OP_PUSHDATA4.into_u8().enc(&mut writer); - (len as u32).enc(&mut writer); + OP_PUSHDATA4.to_u8().consensus_encode(&mut writer).unwrap(); + (len as u32).consensus_encode(&mut writer).unwrap(); }, } writer.write(self) .expect("can't write script push data"); - // self.enc(&mut writer); - // writer } fn append_shapeshift_memo_for_address(address: String, mut writer: Self) -> Self { @@ -207,14 +172,14 @@ impl DataAppend for Vec /* io::Write */ { let mut script_push = Vec::::new(); if d[0] == BITCOIN_SCRIPT_ADDRESS { // OP_SHAPESHIFT_SCRIPT - 0xb3.enc(&mut script_push); + 0xb3.consensus_encode(&mut script_push).unwrap(); } else { // shapeshift is actually part of the message // OP_SHAPESHIFT - 0xb1.enc(&mut script_push); + 0xb1.consensus_encode(&mut script_push).unwrap(); } script_push.extend(d.clone().drain(1..d.len())); - OP_RETURN.into_u8().enc(&mut writer); + OP_RETURN.to_u8().consensus_encode(&mut writer).unwrap(); // writer.append_script_push_data(script_push); script_push.append_script_push_data(&mut writer); }, @@ -223,14 +188,6 @@ impl DataAppend for Vec /* io::Write */ { writer } - // fn append_string(&mut self, data: String) { - // // NSUInteger l = [s lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - // // [self appendVarInt:l]; - // // [self appendBytes:s.UTF8String length:l]; - // VarInt(data.len() as u64).enc(self); - // data.enc(self); - // } - fn script_elements(&self) -> Vec { let mut a = Vec::::new(); let len = self.len(); @@ -246,19 +203,19 @@ impl DataAppend for Vec /* io::Write */ { }, 0x4c => { // OP_PUSHDATA1 i += 1; - if i + std::mem::size_of::() > len { + if i + size_of::() > len { break 'outer; } *chunk_size = self[i] as usize; - i += std::mem::size_of::(); + i += size_of::(); }, 0x4d => { // OP_PUSHDATA2 i += 1; - if i + std::mem::size_of::() > len { + if i + size_of::() > len { break 'outer; } *chunk_size = (self[i] as u16).swap_bytes() as usize; - i += std::mem::size_of::(); + i += size_of::(); }, 0x4e => { // OP_PUSHDATA4 i += 1; @@ -266,7 +223,7 @@ impl DataAppend for Vec /* io::Write */ { break 'outer; } *chunk_size = (self[i] as u32).swap_bytes() as usize; - i += std::mem::size_of::(); + i += size_of::(); }, _ => { *chunk_size = self[i] as usize; diff --git a/dash-spv-masternode-processor/src/util/data_ops.rs b/dash-spv-crypto/src/util/data_ops.rs similarity index 62% rename from dash-spv-masternode-processor/src/util/data_ops.rs rename to dash-spv-crypto/src/util/data_ops.rs index 131b9f19..40aa853a 100644 --- a/dash-spv-masternode-processor/src/util/data_ops.rs +++ b/dash-spv-crypto/src/util/data_ops.rs @@ -1,14 +1,11 @@ -use secp256k1::rand; -use secp256k1::rand::Rng; +use dashcore::secp256k1::rand::{Rng, thread_rng}; +use dashcore::consensus::Encodable; +use dashcore::hashes::{sha256d, Hash}; use std::fmt::Write; -use crate::consensus::Encodable; -use crate::crypto::UInt256; - -pub const DASH_MESSAGE_MAGIC: &str = "DarkCoin Signed Message:\n"; #[inline] pub fn random_initialization_vector_of_size(size: usize) -> Vec { - let mut rng = rand::thread_rng(); + let mut rng = thread_rng(); (0..size).map(|_| rng.gen_range(0..=255)).collect() } @@ -34,21 +31,20 @@ pub fn short_hex_string_from(data: &[u8]) -> String { } #[inline] -pub fn merkle_root_from_hashes(hashes: Vec) -> Option { +pub fn merkle_root_from_hashes(hashes: Vec<[u8; 32]>) -> Option<[u8; 32]> { let length = hashes.len(); let mut level = hashes; match length { 0 => None, - 1 => Some(level[0]), _ => { while level.len() != 1 { let len = level.len(); - let mut higher_level = Vec::::with_capacity((0.5 * len as f64).ceil() as usize); + let mut higher_level = Vec::<[u8; 32]>::with_capacity((0.5 * len as f64).ceil() as usize); for pair in level.chunks(2) { let mut buffer = Vec::with_capacity(64); - pair[0].enc(&mut buffer); - (pair.get(1).unwrap_or(&pair[0])).enc(&mut buffer); - higher_level.push(UInt256::sha256d(buffer)); + pair[0].consensus_encode(&mut buffer).unwrap(); + (pair.get(1).unwrap_or(&pair[0])).consensus_encode(&mut buffer).unwrap(); + higher_level.push(sha256d::Hash::hash(buffer.as_ref()).to_byte_array()); } level = higher_level; } diff --git a/dash-spv-masternode-processor/src/util/ecdsa.rs b/dash-spv-crypto/src/util/ecdsa.rs similarity index 92% rename from dash-spv-masternode-processor/src/util/ecdsa.rs rename to dash-spv-crypto/src/util/ecdsa.rs index 2bd79923..1ea5ddcb 100644 --- a/dash-spv-masternode-processor/src/util/ecdsa.rs +++ b/dash-spv-crypto/src/util/ecdsa.rs @@ -19,11 +19,11 @@ use core::{ops, str::FromStr}; use core::fmt::{self, Write as _fmtWrite}; use std::io; -use secp256k1::{self, Secp256k1}; +use dashcore::secp256k1::{self, Secp256k1}; -use crate::hash_types::{PubkeyHash, WPubkeyHash}; -use crate::hashes::{Hash, hash160}; -use crate::network::constants::Network; +use dashcore::hash_types::{PubkeyHash, WPubkeyHash}; +use dashcore::hashes::{Hash, hash160}; +use dashcore::network::constants::Network; use crate::util::base58; use crate::util::key::Error; @@ -60,9 +60,7 @@ impl PublicKey { /// Returns bitcoin 160-bit hash of the public key for witness program pub fn wpubkey_hash(&self) -> Option { if self.compressed { - Some(WPubkeyHash::from_inner( - hash160::Hash::hash(&self.key.serialize()).into_inner() - )) + Some(WPubkeyHash::from_raw_hash(hash160::Hash::hash(&self.key.serialize()))) } else { // We can't create witness pubkey hashes for an uncompressed // public keys @@ -94,17 +92,7 @@ impl PublicKey { }; reader.read_exact(&mut bytes[1..])?; - Self::from_slice(bytes).map_err(|e|{ - // Need a static string for core2 - #[cfg(feature = "std")] - let reason = e; - #[cfg(not(feature = "std"))] - let reason = match e { - Error::Base58(_) => "base58 error", - Error::Secp256k1(_) => "secp256k1 error", - }; - io::Error::new(io::ErrorKind::InvalidData, reason) - }) + Self::from_slice(bytes).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e)) } /// Serialize the public key to bytes @@ -200,8 +188,8 @@ impl PrivateKey { pub fn fmt_wif(&self, fmt: &mut dyn fmt::Write) -> fmt::Result { let mut ret = [0; 34]; ret[0] = match self.network { - Network::Bitcoin => 128, - Network::Testnet | Network::Signet | Network::Regtest => 239, + Network::Dash => 128, + _ => 239, }; ret[1..33].copy_from_slice(&self.key[..]); let privkey = if self.compressed { @@ -230,7 +218,7 @@ impl PrivateKey { _ => { return Err(Error::Base58(base58::Error::InvalidLength(data.len()))); } }; let network = match data[0] { - 128 => Network::Bitcoin, + 128 => Network::Dash, 239 => Network::Testnet, x=> { return Err(Error::Base58(base58::Error::InvalidAddressVersion(x))); } }; diff --git a/dash-spv-masternode-processor/src/util/endian.rs b/dash-spv-crypto/src/util/endian.rs similarity index 100% rename from dash-spv-masternode-processor/src/util/endian.rs rename to dash-spv-crypto/src/util/endian.rs diff --git a/dash-spv-masternode-processor/src/util/key.rs b/dash-spv-crypto/src/util/key.rs similarity index 93% rename from dash-spv-masternode-processor/src/util/key.rs rename to dash-spv-crypto/src/util/key.rs index f05a512b..4bab5a42 100644 --- a/dash-spv-masternode-processor/src/util/key.rs +++ b/dash-spv-crypto/src/util/key.rs @@ -20,9 +20,9 @@ //pub use util::ecdsa::{PrivateKey, PublicKey}; use core::fmt; -#[cfg(feature = "std")] use std::error; +use std::error; -use secp256k1; +use dashcore::secp256k1; use crate::util::base58; /// A key-related error. @@ -44,8 +44,6 @@ impl fmt::Display for Error { } } -#[cfg(feature = "std")] -#[cfg_attr(docsrs, doc(cfg(feature = "std")))] impl ::std::error::Error for Error { fn cause(&self) -> Option<&dyn error::Error> { match *self { diff --git a/dash-spv-crypto/src/util/mod.rs b/dash-spv-crypto/src/util/mod.rs new file mode 100644 index 00000000..a31dee67 --- /dev/null +++ b/dash-spv-crypto/src/util/mod.rs @@ -0,0 +1,24 @@ +pub mod address; +pub mod base58; +pub mod cc_crypt; +pub mod data_append; +pub mod data_ops; +pub mod ecdsa; +pub mod endian; +pub mod key; +#[allow(unused)] +pub mod params; +pub mod psbt; +pub mod script; +pub mod sec_vec; + +pub use self::params::{BIP32ScriptMap, DIP14ScriptMap, Params, ScriptMap, SporkParams}; +pub use self::address::address::from_hash160_for_script_map; +pub use self::address::address::with_script_pub_key; +pub use self::address::address::with_public_key_data; +pub use self::address::address::is_valid_dash_address_for_script_map; +pub use self::address::address::is_valid_dash_devnet_address; +pub use self::address::address::is_valid_dash_private_key; +pub use self::address::address::shapeshift_outbound_for_script; +pub use self::address::address::shapeshift_outbound_force_script; +pub use self::address::address::with_script_sig; diff --git a/dash-spv-masternode-processor/src/chain/params.rs b/dash-spv-crypto/src/util/params.rs similarity index 92% rename from dash-spv-masternode-processor/src/chain/params.rs rename to dash-spv-crypto/src/util/params.rs index cae07bb4..402532f4 100644 --- a/dash-spv-masternode-processor/src/chain/params.rs +++ b/dash-spv-crypto/src/util/params.rs @@ -1,8 +1,7 @@ -use hashes::hex::FromHex; -use crate::chain::common::chain_type::DevnetType; -use crate::chain::common::ChainType; -use crate::crypto::byte_util::Reversable; -use crate::crypto::UInt256; +use dashcore::hashes::hex::FromHex; +use crate::crypto::byte_util::Reversed; +use crate::network::{ChainType, DevnetType}; +use crate::util::base58; pub const DUFFS: u64 = 100000000; pub const MAX_MONEY: u64 = 21000000 * DUFFS; @@ -27,6 +26,8 @@ pub(crate) const MIN_FEE_PER_B: u64 = TX_FEE_PER_B; /// slightly higher than a 1000bit fee on a 191byte tx pub(crate) const MAX_FEE_PER_B: u64 = 1000; +pub const MAX_SCRIPT_SIZE: usize = 10000; + pub const DASH_PRIVKEY: u8 = 204; pub const DASH_PRIVKEY_TEST: u8 = 239; pub const DASH_PUBKEY_ADDRESS: u8 = 76; @@ -52,6 +53,7 @@ pub const BIP32_SEED_KEY: &str = "Bitcoin seed"; pub const ED25519_SEED_KEY: &str = "ed25519 seed"; #[derive(Clone, Debug, Default)] +#[ferment_macro::export] pub struct ScriptMap { // DASH_PRIVKEY | DASH_PRIVKEY_TEST pub privkey: u8, @@ -81,6 +83,7 @@ impl ScriptMap { } #[derive(Clone, Debug, Default)] +#[ferment_macro::export] pub struct BIP32ScriptMap { pub xprv: [u8; 4], pub xpub: [u8; 4], @@ -93,6 +96,7 @@ impl BIP32ScriptMap { #[derive(Clone, Debug, Default)] +#[ferment_macro::export] pub struct DIP14ScriptMap { pub dps: [u8; 4], pub dpp: [u8; 4], @@ -107,6 +111,7 @@ impl DIP14ScriptMap { // pub struct Script #[derive(Clone, Debug, Default)] +#[ferment_macro::export] pub struct SporkParams { pub public_key_hex_string: Option, pub private_key_base58_string: Option, @@ -114,12 +119,12 @@ pub struct SporkParams { } #[derive(Clone, Debug, Default)] +#[ferment_macro::export] pub struct Params { pub chain_type: ChainType, /// Mining and Dark Gravity Wave Parameters /// The lowest amount of work effort required to mine a block on the chain (higher values are less difficult) - // pub max_proof_of_work: UInt256, pub max_proof_of_work: &'static str, /// The lowest amount of work effort required to mine a block on the chain. Here it is represented as the compact target (higher values are less difficult) pub max_proof_of_work_target: u32, @@ -222,6 +227,10 @@ pub const TESTNET_PARAMS: Params = Params { }; pub fn create_devnet_params_for_type(r#type: DevnetType) -> Params { + let minimum_difficulty_blocks = match &r#type { + DevnetType::JackDaniels => 4032, + _ => 1000000, + }; Params { chain_type: ChainType::DevNet(r#type), max_proof_of_work: "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", @@ -256,10 +265,7 @@ pub fn create_devnet_params_for_type(r#type: DevnetType) -> Params { platform_protocol_version: 1, dpns_contract_id: "", dashpay_contract_id: "", - minimum_difficulty_blocks: match r#type { - DevnetType::JackDaniels => 4032, - _ => 1000000, - }, + minimum_difficulty_blocks, standard_dapi_jrpc_port: 3000, // script_map: ScriptMap::TESTNET, // bip32_script_map: BIP32ScriptMap::TESTNET, @@ -268,17 +274,17 @@ pub fn create_devnet_params_for_type(r#type: DevnetType) -> Params { } impl Params { - pub fn max_proof_of_work(&self) -> UInt256 { - UInt256::from_hex(self.max_proof_of_work).unwrap().reverse() + pub fn max_proof_of_work(&self) -> [u8; 32] { + <[u8; 32]>::from_hex(self.max_proof_of_work).unwrap().reversed() } /// Contract Parameters - pub fn dpns_contract_id(&self) -> UInt256 { - UInt256::from_base58_string(self.dpns_contract_id).unwrap() + pub fn dpns_contract_id(&self) -> [u8; 32] { + TryInto::<[u8; 32]>::try_into(base58::from(self.dpns_contract_id).unwrap()).unwrap() } - pub fn dashpay_contract_id(&self) -> UInt256 { - UInt256::from_base58_string(self.dashpay_contract_id).unwrap() + pub fn dashpay_contract_id(&self) -> [u8; 32] { + TryInto::<[u8; 32]>::try_into(base58::from(self.dashpay_contract_id).unwrap()).unwrap() } /// Fee Parameters diff --git a/dash-spv-crypto/src/util/psbt/error.rs b/dash-spv-crypto/src/util/psbt/error.rs new file mode 100644 index 00000000..f771b489 --- /dev/null +++ b/dash-spv-crypto/src/util/psbt/error.rs @@ -0,0 +1,125 @@ +// // Rust Bitcoin Library +// // Written by +// // The Rust Bitcoin developers +// // +// // To the extent possible under law, the author(s) have dedicated all +// // copyright and related and neighboring rights to this software to +// // the public domain worldwide. This software is distributed without +// // any warranty. +// // +// // You should have received a copy of the CC0 Public Domain Dedication +// // along with this software. +// // If not, see . +// // +// +// use core::fmt; +// +// // use blockdata::transaction::Transaction; +// //use util::psbt::raw; +// +// // use util::bip32::ExtendedPubKey; +// use crate::consensus::encode; +// +// #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] +// /// Enum for marking psbt hash error +// pub enum PsbtHash { +// Ripemd, +// Sha256, +// Hash160, +// Hash256, +// } +// /// Ways that a Partially Signed Transaction might fail. +// #[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] +// pub enum Error { +// /// Magic bytes for a PSBT must be the ASCII for "psbt" serialized in most +// /// significant byte order. +// InvalidMagic, +// /// The separator for a PSBT must be `0xff`. +// InvalidSeparator, +// /// Known keys must be according to spec. +// // InvalidKey(raw::Key), +// /// Non-proprietary key type found when proprietary key was expected +// InvalidProprietaryKey, +// /// Keys within key-value map should never be duplicated. +// // DuplicateKey(raw::Key), +// /// The scriptSigs for the unsigned transaction must be empty. +// UnsignedTxHasScriptSigs, +// /// The scriptWitnesses for the unsigned transaction must be empty. +// UnsignedTxHasScriptWitnesses, +// /// A PSBT must have an unsigned transaction. +// MustHaveUnsignedTx, +// /// Signals that there are no more key-value pairs in a key-value map. +// NoMorePairs, +// /// Attempting to merge with a PSBT describing a different unsigned +// /// transaction. +// // UnexpectedUnsignedTx { +// // /// Expected +// // expected: Box, +// // /// Actual +// // actual: Box, +// // }, +// /// Unable to parse as a standard SigHash type. +// NonStandardSigHashType(u32), +// /// Parsing errors from bitcoin_hashes +// HashParseError(dashcore::hashes::Error), +// /// The pre-image must hash to the correponding psbt hash +// InvalidPreimageHashPair { +// /// Hash-type +// hash_type: PsbtHash, +// /// Pre-image +// preimage: Box<[u8]>, +// /// Hash value +// hash: Box<[u8]>, +// }, +// /// Conflicting data during merge procedure: +// /// global extended public key has inconsistent key sources +// // MergeInconsistentKeySources(ExtendedPubKey), +// /// Serialization error in bitcoin consensus-encoded structures +// ConsensusEncoding, +// } +// +// impl fmt::Display for Error { +// fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { +// match *self { +// // Error::InvalidKey(ref rkey) => write!(f, "invalid key: {}", rkey), +// Error::InvalidProprietaryKey => write!(f, "non-proprietary key type found when proprietary key was expected"), +// // Error::DuplicateKey(ref rkey) => write!(f, "duplicate key: {}", rkey), +// // Error::UnexpectedUnsignedTx { expected: ref e, actual: ref a } => write!(f, "different unsigned transaction: expected {}, actual {}", e.txid(), a.txid()), +// Error::NonStandardSigHashType(ref sht) => write!(f, "non-standard sighash type: {}", sht), +// Error::InvalidMagic => f.write_str("invalid magic"), +// Error::InvalidSeparator => f.write_str("invalid separator"), +// Error::UnsignedTxHasScriptSigs => f.write_str("the unsigned transaction has script sigs"), +// Error::UnsignedTxHasScriptWitnesses => f.write_str("the unsigned transaction has script witnesses"), +// Error::MustHaveUnsignedTx => { +// f.write_str("partially signed transactions must have an unsigned transaction") +// } +// Error::NoMorePairs => f.write_str("no more key-value pairs for this psbt map"), +// Error::HashParseError(e) => write!(f, "Hash Parse Error: {}", e), +// Error::InvalidPreimageHashPair{ref preimage, ref hash, ref hash_type} => { +// // directly using debug forms of psbthash enums +// write!(f, "Preimage {:?} does not match {:?} hash {:?}", preimage, hash_type, hash ) +// } +// // Error::MergeInconsistentKeySources(ref s) => { write!(f, "merge conflict: {}", s) } +// Error::ConsensusEncoding => f.write_str("bitcoin consensus or BIP-174 encoding error"), +// } +// } +// } +// +// #[cfg(feature = "std")] +// impl ::std::error::Error for Error {} +// +// #[doc(hidden)] +// impl From for Error { +// fn from(e: hashes::Error) -> Error { +// Error::HashParseError(e) +// } +// } +// +// impl From for Error { +// fn from(err: encode::Error) -> Self { +// match err { +// encode::Error::Psbt(err) => err, +// _ => Error::ConsensusEncoding, +// } +// } +// } diff --git a/dash-spv-masternode-processor/src/util/psbt/mod.rs b/dash-spv-crypto/src/util/psbt/mod.rs similarity index 96% rename from dash-spv-masternode-processor/src/util/psbt/mod.rs rename to dash-spv-crypto/src/util/psbt/mod.rs index e4284fb9..0a40cd36 100644 --- a/dash-spv-masternode-processor/src/util/psbt/mod.rs +++ b/dash-spv-crypto/src/util/psbt/mod.rs @@ -19,4 +19,4 @@ //! except we define PSBTs containing non-standard SigHash types as invalid. mod error; -pub use self::error::Error; +// pub use self::error::Error; diff --git a/dash-spv-masternode-processor/src/util/script.rs b/dash-spv-crypto/src/util/script.rs similarity index 96% rename from dash-spv-masternode-processor/src/util/script.rs rename to dash-spv-crypto/src/util/script.rs index 0b07f8b3..850d5e68 100644 --- a/dash-spv-masternode-processor/src/util/script.rs +++ b/dash-spv-crypto/src/util/script.rs @@ -1,5 +1,5 @@ use std::fmt::{Debug, Formatter}; -use hashes::hex::ToHex; +use dashcore::secp256k1::hashes::hex::DisplayHex; #[derive(Debug, PartialEq, Eq)] pub enum ScriptType { @@ -30,7 +30,7 @@ impl<'a> Debug for ScriptElement<'a> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { match self { ScriptElement::Number(code) => write!(f, "{:02x}", code)?, - ScriptElement::Data(data, _) => write!(f, "{}", data.to_hex())?, + ScriptElement::Data(data, _) => write!(f, "{}", data.to_lower_hex_string())?, } Ok(()) } @@ -51,10 +51,10 @@ pub fn op_len(data: &[u8]) -> u8 { #[cfg(test)] mod tests { - use hashes::hex::{FromHex, ToHex}; - use crate::chain::params::ScriptMap; + use dashcore::hashes::hex::FromHex; + use crate::util::address::address; - use crate::util::base58; + use crate::util::{base58, ScriptMap}; use crate::util::data_append::DataAppend; use crate::util::script::ScriptElement; @@ -92,13 +92,13 @@ mod tests { } fn check_address_with_script_pubkey(data: &[u8], script_map: &ScriptMap, address: Option) { - let elem = data.to_vec().script_elements(); + // let elem = data.to_vec().script_elements(); let addr = address::with_script_pub_key(&data.to_vec(), script_map); assert_eq!(addr, address, "Address with script pubkey don't match") } fn check_address_with_script_signature(data: &[u8], script_map: &ScriptMap, address: Option) { - let elem = data.to_vec().script_elements(); + // let elem = data.to_vec().script_elements(); let addr = address::with_script_sig(&data.to_vec(), script_map); println!("check_address_with_script_signature: {:?} => {:?}", data.to_hex(), address); assert_eq!(addr, address, "Address with script signature don't match") diff --git a/dash-spv-masternode-processor/src/util/sec_vec.rs b/dash-spv-crypto/src/util/sec_vec.rs similarity index 84% rename from dash-spv-masternode-processor/src/util/sec_vec.rs rename to dash-spv-crypto/src/util/sec_vec.rs index fafd1dd6..dcef9867 100644 --- a/dash-spv-masternode-processor/src/util/sec_vec.rs +++ b/dash-spv-crypto/src/util/sec_vec.rs @@ -2,8 +2,9 @@ use std::io; use zeroize::Zeroize; #[derive(Clone, Debug, Default)] +#[ferment_macro::opaque] pub struct SecVec { - inner: Vec, + pub inner: Vec, } impl SecVec { @@ -19,6 +20,12 @@ impl SecVec { } } +#[ferment_macro::export] +impl SecVec { + pub fn to_vec(&self) -> Vec { + self.inner.clone() + } +} impl Drop for SecVec { fn drop(&mut self) { self.inner.zeroize(); @@ -48,3 +55,4 @@ impl io::Write for SecVec { self.inner.flush() } } + diff --git a/dash-spv-event-bus/.gitignore b/dash-spv-event-bus/.gitignore new file mode 100644 index 00000000..f54b4515 --- /dev/null +++ b/dash-spv-event-bus/.gitignore @@ -0,0 +1,15 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ +/venv/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# Generated by Intellij Idea +/.idea/ +*.iml diff --git a/dash-spv-event-bus/Cargo.toml b/dash-spv-event-bus/Cargo.toml new file mode 100644 index 00000000..1636ad7f --- /dev/null +++ b/dash-spv-event-bus/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "dash-spv-event-bus" +version = "0.5.1" +description = "Library for interactions between different SPV services" + +edition = "2021" +publish = false + +[dependencies] +#rs-dapi-client = { git = "https://github.com/dashpay/platform", branch = "test/ferment", package = "rs-dapi-client" } + +[lib] +name = "dash_spv_event_bus" diff --git a/dash-spv-event-bus/src/lib.rs b/dash-spv-event-bus/src/lib.rs new file mode 100644 index 00000000..129e4382 --- /dev/null +++ b/dash-spv-event-bus/src/lib.rs @@ -0,0 +1,50 @@ + +/*type Subscriber = Box; + +#[derive(Hash, Eq, PartialEq, Clone, Debug)] +pub enum Event { + MasternodeListChanged +} +#[derive(Clone, Debug)] +pub enum Message { + +} +pub struct EventBus { + handlers: Mutex>>, +} + +impl EventBus { + pub fn new() -> Self { + Self { handlers: Mutex::new(HashMap::new()) } + } + pub fn subscribe(&self, event: Event, handler: Subscriber) { + let mut handlers = self.handlers.lock().unwrap(); + handlers.entry(event) + .or_default() + .push(handler); + } + pub fn publish(&self, event: Event, message: Message) { + if let Some(subscribers) = self.handlers.lock().unwrap().get(&event) { + for subscriber in subscribers { + subscriber(message.clone()); + } + } + } +} +*/ +use std::error::Error; + +pub trait Linkable { + fn link(&mut self, parent: &Link); +} + +pub trait DAPIAddressHandler { + fn add_node(&self, address: [u8; 16]); + fn remove_node(&self, address: [u8; 16]); + fn add_nodes(&self, addresses: Vec<[u8; 16]>); + fn remove_nodes(&self, node: Vec<[u8; 16]>); +} + +pub trait MasternodeProvider { + fn quorum_public_key(&self, quorum_type: u32, quorum_hash: [u8; 32], core_chain_locked_height: u32) -> Result<[u8; 48], E> where E: Error; +} \ No newline at end of file diff --git a/dash-spv-example-app/dash-spv-example-app.xcodeproj/project.pbxproj b/dash-spv-example-app/dash-spv-example-app.xcodeproj/project.pbxproj new file mode 100644 index 00000000..cf3c79de --- /dev/null +++ b/dash-spv-example-app/dash-spv-example-app.xcodeproj/project.pbxproj @@ -0,0 +1,206 @@ +// !$*UTF8*$! +{ + /* generated with cargo-xcode 1.11.0 */ + archiveVersion = 1; + classes = { + }; + objectVersion = 53; + objects = { + +/* Begin PBXBuildFile section */ + CA00C60E854E53DCCC37379F /* Cargo.toml in Sources */ = {isa = PBXBuildFile; fileRef = CAF95A1F678F3EF4668187A5 /* Cargo.toml */; settings = {COMPILER_FLAGS = "--bin 'dash-spv-example-app'"; }; }; +/* End PBXBuildFile section */ + +/* Begin PBXBuildRule section */ + CAF45A1F678FAC6C1400ACA8 /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.apple.compilers.proxy.script; + dependencyFile = "$(DERIVED_FILE_DIR)/$(ARCHS)-$(EXECUTABLE_NAME).d"; + filePatterns = "*/Cargo.toml"; + fileType = pattern.proxy; + inputFiles = ( + ); + isEditable = 0; + name = "Cargo project build"; + outputFiles = ( + "$(TARGET_BUILD_DIR)/$(EXECUTABLE_NAME)", + ); + runOncePerArchitecture = 0; + script = "# generated with cargo-xcode 1.11.0\nset -euo pipefail;\nexport PATH=\"$HOME/.cargo/bin:$PATH:/usr/local/bin:/opt/homebrew/bin\";\n# don't use ios/watchos linker for build scripts and proc macros\nexport CARGO_TARGET_AARCH64_APPLE_DARWIN_LINKER=/usr/bin/ld\nexport CARGO_TARGET_X86_64_APPLE_DARWIN_LINKER=/usr/bin/ld\nexport NO_COLOR=1\n\ncase \"$PLATFORM_NAME\" in\n \"macosx\")\n CARGO_XCODE_TARGET_OS=darwin\n if [ \"${IS_MACCATALYST-NO}\" = YES ]; then\n CARGO_XCODE_TARGET_OS=ios-macabi\n fi\n ;;\n \"iphoneos\") CARGO_XCODE_TARGET_OS=ios ;;\n \"iphonesimulator\") CARGO_XCODE_TARGET_OS=ios-sim ;;\n \"appletvos\" | \"appletvsimulator\") CARGO_XCODE_TARGET_OS=tvos ;;\n \"watchos\") CARGO_XCODE_TARGET_OS=watchos ;;\n \"watchsimulator\") CARGO_XCODE_TARGET_OS=watchos-sim ;;\n \"xros\") CARGO_XCODE_TARGET_OS=visionos ;;\n \"xrsimulator\") CARGO_XCODE_TARGET_OS=visionos-sim ;;\n *)\n CARGO_XCODE_TARGET_OS=\"$PLATFORM_NAME\"\n echo >&2 \"warning: cargo-xcode needs to be updated to handle $PLATFORM_NAME\"\n ;;\nesac\n\nCARGO_XCODE_TARGET_TRIPLES=\"\"\nCARGO_XCODE_TARGET_FLAGS=\"\"\nLIPO_ARGS=\"\"\nfor arch in $ARCHS; do\n if [[ \"$arch\" == \"arm64\" ]]; then arch=aarch64; fi\n if [[ \"$arch\" == \"i386\" && \"$CARGO_XCODE_TARGET_OS\" != \"ios\" ]]; then arch=i686; fi\n triple=\"${arch}-apple-$CARGO_XCODE_TARGET_OS\"\n CARGO_XCODE_TARGET_TRIPLES+=\" $triple\"\n CARGO_XCODE_TARGET_FLAGS+=\" --target=$triple\"\n LIPO_ARGS+=\"$CARGO_TARGET_DIR/$triple/$CARGO_XCODE_BUILD_PROFILE/$CARGO_XCODE_CARGO_FILE_NAME\n\"\ndone\n\necho >&2 \"Cargo $CARGO_XCODE_BUILD_PROFILE $ACTION for $PLATFORM_NAME $ARCHS =$CARGO_XCODE_TARGET_TRIPLES; using ${SDK_NAMES:-}. \\$PATH is:\"\ntr >&2 : '\\n' <<<\"$PATH\"\n\nif command -v rustup &> /dev/null; then\n for triple in $CARGO_XCODE_TARGET_TRIPLES; do\n if ! rustup target list --installed | grep -Eq \"^$triple$\"; then\n echo >&2 \"warning: this build requires rustup toolchain for $triple, but it isn't installed (will try rustup next)\"\n rustup target add \"$triple\" || {\n echo >&2 \"warning: can't install $triple, will try nightly -Zbuild-std\";\n OTHER_INPUT_FILE_FLAGS+=\" -Zbuild-std\";\n if [ -z \"${RUSTUP_TOOLCHAIN:-}\" ]; then\n export RUSTUP_TOOLCHAIN=nightly\n fi\n break;\n }\n fi\n done\nfi\n\nif [ \"$CARGO_XCODE_BUILD_PROFILE\" = release ]; then\n OTHER_INPUT_FILE_FLAGS=\"$OTHER_INPUT_FILE_FLAGS --release\"\nfi\n\nif [ \"$ACTION\" = clean ]; then\n cargo clean --verbose --manifest-path=\"$SCRIPT_INPUT_FILE\" $CARGO_XCODE_TARGET_FLAGS $OTHER_INPUT_FILE_FLAGS;\n rm -f \"$SCRIPT_OUTPUT_FILE_0\"\n exit 0\nfi\n\n{ cargo build --manifest-path=\"$SCRIPT_INPUT_FILE\" --features=\"${CARGO_XCODE_FEATURES:-}\" $CARGO_XCODE_TARGET_FLAGS $OTHER_INPUT_FILE_FLAGS --verbose --message-format=short 2>&1 | sed -E 's/^([^ :]+:[0-9]+:[0-9]+: error)/\\1: /' >&2; } || { echo >&2 \"$SCRIPT_INPUT_FILE: error: cargo-xcode project build failed; $CARGO_XCODE_TARGET_TRIPLES\"; exit 1; }\n\ntr '\\n' '\\0' <<<\"$LIPO_ARGS\" | xargs -0 lipo -create -output \"$SCRIPT_OUTPUT_FILE_0\"\n\nif [ ${LD_DYLIB_INSTALL_NAME:+1} ]; then\n install_name_tool -id \"$LD_DYLIB_INSTALL_NAME\" \"$SCRIPT_OUTPUT_FILE_0\"\nfi\n\nDEP_FILE_DST=\"$DERIVED_FILE_DIR/${ARCHS}-${EXECUTABLE_NAME}.d\"\necho \"\" > \"$DEP_FILE_DST\"\nfor triple in $CARGO_XCODE_TARGET_TRIPLES; do\n BUILT_SRC=\"$CARGO_TARGET_DIR/$triple/$CARGO_XCODE_BUILD_PROFILE/$CARGO_XCODE_CARGO_FILE_NAME\"\n\n # cargo generates a dep file, but for its own path, so append our rename to it\n DEP_FILE_SRC=\"$CARGO_TARGET_DIR/$triple/$CARGO_XCODE_BUILD_PROFILE/$CARGO_XCODE_CARGO_DEP_FILE_NAME\"\n if [ -f \"$DEP_FILE_SRC\" ]; then\n cat \"$DEP_FILE_SRC\" >> \"$DEP_FILE_DST\"\n fi\n echo >> \"$DEP_FILE_DST\" \"${SCRIPT_OUTPUT_FILE_0/ /\\\\ /}: ${BUILT_SRC/ /\\\\ /}\"\ndone\ncat \"$DEP_FILE_DST\"\n\necho \"success: $ACTION of $SCRIPT_OUTPUT_FILE_0 for $CARGO_XCODE_TARGET_TRIPLES\"\n"; + }; +/* End PBXBuildRule section */ + +/* Begin PBXFileReference section */ + CA00A43D855BCA5AAE71FECD /* dash-spv-example-app */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "dash-spv-example-app"; sourceTree = BUILT_PRODUCTS_DIR; }; + CAF95A1F678F3EF4668187A5 /* Cargo.toml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = Cargo.toml; path = Cargo.toml; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXGroup section */ + CAF05A1F678FD65BC3C892A8 = { + isa = PBXGroup; + children = ( + CAF95A1F678F3EF4668187A5 /* Cargo.toml */, + CAF15A1F678F22869D176AE5 /* Products */, + CAF25A1F678F98AF0B5890DB /* Frameworks */, + ); + sourceTree = ""; + }; + CAF15A1F678F22869D176AE5 /* Products */ = { + isa = PBXGroup; + children = ( + CA00A43D855BCA5AAE71FECD /* dash-spv-example-app */, + ); + name = Products; + sourceTree = ""; + }; + CAF25A1F678F98AF0B5890DB /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + CA00A43D855B53DCCC37379F /* dash-spv-example-app (standalone executable) */ = { + isa = PBXNativeTarget; + buildConfigurationList = CA0071FAFE0E53DCCC37379F /* Build configuration list for PBXNativeTarget "dash-spv-example-app (standalone executable)" */; + buildPhases = ( + CA00E4D7C48C53DCCC37379F /* Sources */, + ); + buildRules = ( + CAF45A1F678FAC6C1400ACA8 /* PBXBuildRule */, + ); + dependencies = ( + ); + name = "dash-spv-example-app (standalone executable)"; + productName = "dash-spv-example-app"; + productReference = CA00A43D855BCA5AAE71FECD /* dash-spv-example-app */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + CAF35A1F678FE04653AD465F /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + TargetAttributes = { + CA00A43D855B53DCCC37379F = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = CAF65A1F678F80E02D6C7F57 /* Build configuration list for PBXProject "dash-spv-example-app" */; + compatibilityVersion = "Xcode 11.4"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = CAF05A1F678FD65BC3C892A8; + productRefGroup = CAF15A1F678F22869D176AE5 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + CA00A43D855B53DCCC37379F /* dash-spv-example-app (standalone executable) */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + CA00E4D7C48C53DCCC37379F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CA00C60E854E53DCCC37379F /* Cargo.toml in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + CA00CFFA7BAA53DCCC37379F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CARGO_XCODE_CARGO_DEP_FILE_NAME = "dash-spv-example-app.d"; + CARGO_XCODE_CARGO_FILE_NAME = "dash-spv-example-app"; + PRODUCT_NAME = "dash-spv-example-app"; + SUPPORTED_PLATFORMS = macosx; + }; + name = Release; + }; + CA009BEC839E53DCCC37379F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CARGO_XCODE_CARGO_DEP_FILE_NAME = "dash-spv-example-app.d"; + CARGO_XCODE_CARGO_FILE_NAME = "dash-spv-example-app"; + PRODUCT_NAME = "dash-spv-example-app"; + SUPPORTED_PLATFORMS = macosx; + }; + name = Debug; + }; + CAF7D67CD2EB3CC16B37690B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CARGO_TARGET_DIR = "$(PROJECT_TEMP_DIR)/cargo_target"; + CARGO_XCODE_BUILD_PROFILE = release; + CARGO_XCODE_FEATURES = ""; + CURRENT_PROJECT_VERSION = 0.1; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + MARKETING_VERSION = 0.1.0; + PRODUCT_NAME = "dash-spv-example-app"; + RUSTUP_TOOLCHAIN = ""; + SDKROOT = macosx; + SUPPORTS_MACCATALYST = YES; + }; + name = Release; + }; + CAF8D67CD2EB228BE02872F8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CARGO_TARGET_DIR = "$(PROJECT_TEMP_DIR)/cargo_target"; + CARGO_XCODE_BUILD_PROFILE = debug; + CARGO_XCODE_FEATURES = ""; + CURRENT_PROJECT_VERSION = 0.1; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + MARKETING_VERSION = 0.1.0; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "dash-spv-example-app"; + RUSTUP_TOOLCHAIN = ""; + SDKROOT = macosx; + SUPPORTS_MACCATALYST = YES; + }; + name = Debug; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + CA0071FAFE0E53DCCC37379F /* Build configuration list for PBXNativeTarget "dash-spv-example-app (standalone executable)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CA00CFFA7BAA53DCCC37379F /* Release */, + CA009BEC839E53DCCC37379F /* Debug */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CAF65A1F678F80E02D6C7F57 /* Build configuration list for PBXProject "dash-spv-example-app" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CAF7D67CD2EB3CC16B37690B /* Release */, + CAF8D67CD2EB228BE02872F8 /* Debug */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = CAF35A1F678FE04653AD465F /* Project object */; +} diff --git a/dash-spv-keychain/.gitignore b/dash-spv-keychain/.gitignore new file mode 100644 index 00000000..f54b4515 --- /dev/null +++ b/dash-spv-keychain/.gitignore @@ -0,0 +1,15 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ +/venv/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# Generated by Intellij Idea +/.idea/ +*.iml diff --git a/dash-spv-keychain/Cargo.toml b/dash-spv-keychain/Cargo.toml new file mode 100644 index 00000000..364a59e0 --- /dev/null +++ b/dash-spv-keychain/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "dash-spv-keychain" +version = "0.0.1" +description = "Library for interactions between OS Keychain" + +edition = "2021" +publish = false + +[dependencies] +ferment-macro = { git = "https://github.com/dashpay/ferment", package = "ferment-macro" } + +[lib] +name = "dash_spv_keychain" diff --git a/dash-spv-keychain/src/lib.rs b/dash-spv-keychain/src/lib.rs new file mode 100644 index 00000000..a4ff188e --- /dev/null +++ b/dash-spv-keychain/src/lib.rs @@ -0,0 +1,85 @@ +use std::sync::Arc; + +#[derive(Clone)] +#[ferment_macro::export] +pub enum KeyChainKey { + StandaloneInfoDictionaryLocationString { extended_public_key_identifier: String }, + StandaloneExtendedPublicKeyLocationString { extended_public_key_identifier: String }, + HasKnownBalanceUniqueIDString { reference: u32, unique_id: String }, + WalletBasedExtendedPrivateKeyLocationString { unique_id: String }, + WalletBasedExtendedPublicKeyLocationString { unique_id: String }, +} + +impl KeyChainKey { + pub fn standalone_info_dictionary_location_string(extended_public_key_identifier: &str) -> Self { + Self::StandaloneInfoDictionaryLocationString { extended_public_key_identifier: extended_public_key_identifier.to_string() } + } + pub fn standalone_extended_public_key_location_string(extended_public_key_identifier: &str) -> Self { + Self::StandaloneExtendedPublicKeyLocationString { extended_public_key_identifier: extended_public_key_identifier.to_string() } + } + pub fn has_known_balance_unique_id_string(reference: u32, unique_id: &str) -> Self { + Self::HasKnownBalanceUniqueIDString { reference, unique_id: unique_id.to_string() } + } + pub fn wallet_based_extended_private_key_location_string(unique_id: &str) -> Self { + Self::WalletBasedExtendedPrivateKeyLocationString { unique_id: unique_id.to_string() } + } + pub fn wallet_based_extended_public_key_location_string(unique_id: &str) -> Self { + Self::WalletBasedExtendedPublicKeyLocationString { unique_id: unique_id.to_string() } + } +} + +#[derive(Clone)] +#[ferment_macro::export] +pub enum KeyChainValue { + Bytes(Vec), + Int64(i64), + String(String), +} + +#[derive(Clone)] +#[ferment_macro::export] +pub enum KeyChainError { + OsStatusCode(i32) +} + +#[derive(Clone)] +pub struct KeychainController { + pub get: Arc Result + Send + Sync>, + pub set: Arc Result + Send + Sync>, + pub has: Arc Result + Send + Sync>, + pub delete: Arc Result + Send + Sync>, +} + +#[ferment_macro::export] +impl KeychainController { + pub fn new< + GET: Fn(KeyChainKey) -> Result + Send + Sync + 'static, + SET: Fn(KeyChainKey, KeyChainValue, bool) -> Result + Send + Sync + 'static, + HAS: Fn(KeyChainKey) -> Result + Send + Sync + 'static, + DEL: Fn(KeyChainKey) -> Result + Send + Sync + 'static, + >( + get: GET, + set: SET, + has: HAS, + delete: DEL, + ) -> Self { + Self { + get: Arc::new(get), + set: Arc::new(set), + has: Arc::new(has), + delete: Arc::new(delete), + } + } + pub fn get(&self, key: KeyChainKey) -> Result { + (self.get)(key) + } + pub fn set(&self, key: KeyChainKey, value: KeyChainValue, authenticated: bool) -> Result { + (self.set)(key, value, authenticated) + } + pub fn has(&self, key: KeyChainKey) -> Result { + (self.has)(key) + } + pub fn delete(&self, key: KeyChainKey) -> Result { + (self.delete)(key) + } +} \ No newline at end of file diff --git a/dash-spv-macro/.gitignore b/dash-spv-macro/.gitignore new file mode 100644 index 00000000..99d9d9a9 --- /dev/null +++ b/dash-spv-macro/.gitignore @@ -0,0 +1,14 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# Generated by Intellij Idea +/.idea/ +*.iml diff --git a/dash-spv-macro/Cargo.toml b/dash-spv-macro/Cargo.toml new file mode 100644 index 00000000..e21bec41 --- /dev/null +++ b/dash-spv-macro/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "dash-spv-macro" +version = "0.1.0" +description = "Macros for boilerplate" +edition = "2021" +license = "MIT" + +[lib] +proc-macro = true + +[dependencies] +syn = { version = "1.0.109", features = ["full", "visit-mut"] } +quote = "1.0.28" diff --git a/dash-spv-macro/src/lib.rs b/dash-spv-macro/src/lib.rs new file mode 100644 index 00000000..ead0d7bd --- /dev/null +++ b/dash-spv-macro/src/lib.rs @@ -0,0 +1,20 @@ +extern crate proc_macro; +use syn::{DeriveInput, parse_macro_input}; +use quote::quote; +use proc_macro::TokenStream; +#[proc_macro_derive(StreamManager)] +pub fn stream_manager_derive(input: TokenStream) -> TokenStream { + let DeriveInput { ident, .. } = parse_macro_input!(input as DeriveInput); + let expanded = quote! { + impl crate::util::StreamManager for #ident { + fn sdk_ref(&self) -> &dash_sdk::Sdk { + &self.sdk + } + fn chain_type(&self) -> &dash_spv_crypto::network::ChainType { + &self.chain_type + } + } + + }; + TokenStream::from(expanded) +} diff --git a/dash-spv-masternode-processor/Cargo.lock b/dash-spv-masternode-processor/Cargo.lock deleted file mode 100644 index 2654422b..00000000 --- a/dash-spv-masternode-processor/Cargo.lock +++ /dev/null @@ -1,1814 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "aho-corasick" -version = "0.7.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" -dependencies = [ - "memchr", -] - -[[package]] -name = "arrayref" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" - -[[package]] -name = "arrayvec" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - -[[package]] -name = "autocfg" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" -dependencies = [ - "autocfg 1.1.0", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "base64" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" - -[[package]] -name = "bindgen" -version = "0.60.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062dddbc1ba4aca46de6338e2bf87771414c335f7b2f2036e8f3e9befebf88e6" -dependencies = [ - "bitflags 1.3.2", - "cexpr", - "clang-sys", - "clap", - "env_logger", - "lazy_static", - "lazycell", - "log", - "peeking_take_while", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "which", -] - -[[package]] -name = "bindgen" -version = "0.63.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36d860121800b2a9a94f9b5604b332d5cffb234ce17609ea479d723dbc9d3885" -dependencies = [ - "bitflags 1.3.2", - "cexpr", - "clang-sys", - "lazy_static", - "lazycell", - "log", - "peeking_take_while", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn", - "which", -] - -[[package]] -name = "bip0039" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e68a5a99c65851e7be249f5cf510c0a136f18c9bca32139576d59bd3f577b043" -dependencies = [ - "hmac", - "pbkdf2", - "sha2", - "unicode-normalization", - "zeroize", -] - -[[package]] -name = "bip39" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e89470017230c38e52b82b3ee3f530db1856ba1d434e3a67a3456a8a8dec5f" -dependencies = [ - "bitcoin_hashes 0.9.7", - "rand 0.6.5", - "rand_core 0.4.2", -] - -[[package]] -name = "bitcoin_hashes" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ce18265ec2324ad075345d5814fbeed4f41f0a660055dc78840b74d19b874b1" - -[[package]] -name = "bitcoin_hashes" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" - -[[package]] -name = "bitcoinconsensus" -version = "0.19.0-3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a8aa43b5cd02f856cb126a9af819e77b8910fdd74dd1407be649f2f5fe3a1b5" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.0.0-rc.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eebde8a2685242023acc9d9464bb75aa20f7774a5aaaf77894b1cc94061370e3" - -[[package]] -name = "blake3" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ae2468a89544a466886840aa467a25b766499f4f04bf7d9fcd10ecee9fccef" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", - "digest", -] - -[[package]] -name = "block-buffer" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bls-dash-sys" -version = "1.2.5" -source = "git+https://github.com/dashevo/bls-signatures?branch=rust-bindings-enhancement#6d359c6201c68c7066526611f5461e378adf92ca" -dependencies = [ - "bindgen 0.60.1", - "cc", - "glob", -] - -[[package]] -name = "bls-signatures" -version = "1.2.5" -source = "git+https://github.com/dashevo/bls-signatures?branch=rust-bindings-enhancement#6d359c6201c68c7066526611f5461e378adf92ca" -dependencies = [ - "bls-dash-sys", -] - -[[package]] -name = "bumpalo" -version = "3.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" - -[[package]] -name = "byte" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cfd4a5b862cb6bfcaf4b9803e887a22393dd5c1ac9e2d1e131d516047eabd01" - -[[package]] -name = "bytes" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" - -[[package]] -name = "cbindgen" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6358dedf60f4d9b8db43ad187391afe959746101346fe51bb978126bec61dfb" -dependencies = [ - "clap", - "heck", - "indexmap", - "log", - "proc-macro2", - "quote", - "serde", - "serde_json", - "syn", - "tempfile", - "toml", -] - -[[package]] -name = "cc" -version = "1.0.79" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "clang-sys" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa2e27ae6ab525c3d369ded447057bca5438d86dc3a68f6faafb8269ba82ebf3" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "clap" -version = "3.2.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" -dependencies = [ - "atty", - "bitflags 1.3.2", - "clap_lex", - "indexmap", - "strsim", - "termcolor", - "textwrap", -] - -[[package]] -name = "clap_lex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", -] - -[[package]] -name = "cloudabi" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "common-crypto" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e064cdd45bbfa8a567479ab9f4b038c5e3d0c1876253c5af98eb645442be19a" - -[[package]] -name = "constant_time_eq" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3ad85c1f65dc7b37604eb0e89748faf0b9653065f2a8ef69f96a687ec1e9279" - -[[package]] -name = "core-foundation" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" - -[[package]] -name = "core2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" -dependencies = [ - "memchr", -] - -[[package]] -name = "cpufeatures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" -dependencies = [ - "libc", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "dash-spv-masternode-processor" -version = "0.3.10" -dependencies = [ - "base64", - "bip0039", - "bip39", - "bitcoin_hashes 0.11.0", - "bitcoinconsensus", - "bitflags 2.0.0-rc.2", - "blake3", - "bls-signatures", - "byte", - "cbindgen", - "common-crypto", - "core2", - "futures", - "libc", - "murmur3", - "os-timer", - "reqwest", - "rs-x11-hash", - "secp256k1", - "security-framework", - "serde", - "serde_json", - "tokio", - "unicode-normalization", -] - -[[package]] -name = "digest" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" -dependencies = [ - "block-buffer", - "crypto-common", - "subtle", -] - -[[package]] -name = "either" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" - -[[package]] -name = "encoding_rs" -version = "0.8.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "env_logger" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" - -[[package]] -name = "futures" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e2792b0ff0340399d58445b88fd9770e3489eff258a4cbc1523418f12abf84" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" - -[[package]] -name = "futures-executor" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8de0a35a6ab97ec8869e32a2473f4b1324459e14c29275d14b10cb1fd19b50e" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531" - -[[package]] -name = "futures-macro" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "futures-sink" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364" - -[[package]] -name = "futures-task" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" - -[[package]] -name = "futures-util" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "h2" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "http" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "hyper" -version = "0.14.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e011372fa0b68db8350aa7a248930ecc7839bf46d8485577d69f117a75f164c" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "idna" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" -dependencies = [ - "autocfg 1.1.0", - "hashbrown", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "ipnet" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" - -[[package]] -name = "itoa" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" - -[[package]] -name = "js-sys" -version = "0.3.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.139" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" - -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if", - "winapi", -] - -[[package]] -name = "log" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "mime" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "mio" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" -dependencies = [ - "libc", - "log", - "wasi", - "windows-sys 0.45.0", -] - -[[package]] -name = "murmur3" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9252111cf132ba0929b6f8e030cac2a24b507f3a4d6db6fb2896f27b354c714b" - -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "num_cpus" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" -dependencies = [ - "hermit-abi 0.2.6", - "libc", -] - -[[package]] -name = "once_cell" -version = "1.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" - -[[package]] -name = "openssl" -version = "0.10.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23bbbf7854cd45b83958ebe919f0e8e516793727652e27fda10a8384cfc790b7" -dependencies = [ - "autocfg 1.1.0", - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "os-timer" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d476661a07b5ed3a96ff3668af3ddfd77d79b70820ffb41489b7e6ee3bebcef8" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "os_str_bytes" -version = "6.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" - -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest", -] - -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - -[[package]] -name = "percent-encoding" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" - -[[package]] -name = "pin-project-lite" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro2" -version = "1.0.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -dependencies = [ - "autocfg 0.1.8", - "libc", - "rand_chacha 0.1.1", - "rand_core 0.4.2", - "rand_hc", - "rand_isaac", - "rand_jitter", - "rand_os", - "rand_pcg", - "rand_xorshift", - "winapi", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -dependencies = [ - "autocfg 0.1.8", - "rand_core 0.3.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -dependencies = [ - "rand_core 0.4.2", -] - -[[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_hc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_isaac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_jitter" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" -dependencies = [ - "libc", - "rand_core 0.4.2", - "winapi", -] - -[[package]] -name = "rand_os" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" -dependencies = [ - "cloudabi", - "fuchsia-cprng", - "libc", - "rand_core 0.4.2", - "rdrand", - "winapi", -] - -[[package]] -name = "rand_pcg" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" -dependencies = [ - "autocfg 0.1.8", - "rand_core 0.4.2", -] - -[[package]] -name = "rand_xorshift" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "regex" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.6.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" - -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - -[[package]] -name = "reqwest" -version = "0.11.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21eed90ec8570952d53b772ecf8f206aa1ec9a3d76b2521c56c42973f2d91ee9" -dependencies = [ - "base64", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - -[[package]] -name = "rs-x11-hash" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bcb5655bd3037ccd295b6d2141ad7dd19cc15cfcd222899ed3c95415960751d" -dependencies = [ - "bindgen 0.63.0", - "cc", - "libc", -] - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "ryu" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" - -[[package]] -name = "schannel" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" -dependencies = [ - "windows-sys 0.42.0", -] - -[[package]] -name = "secp256k1" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4124a35fe33ae14259c490fd70fa199a32b9ce9502f2ee6bc4f81ec06fa65894" -dependencies = [ - "bitcoin_hashes 0.11.0", - "rand 0.8.5", - "secp256k1-sys", -] - -[[package]] -name = "secp256k1-sys" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642a62736682fdd8c71da0eb273e453c8ac74e33b9fb310e22ba5b03ec7651ff" -dependencies = [ - "cc", -] - -[[package]] -name = "security-framework" -version = "2.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "serde" -version = "1.0.152" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.152" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cad406b69c91885b5107daf2c29572f6c8cdb3c66826821e286c533490c0bc76" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shlex" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" - -[[package]] -name = "slab" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" -dependencies = [ - "autocfg 1.1.0", -] - -[[package]] -name = "socket2" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "subtle" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" - -[[package]] -name = "syn" -version = "1.0.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tempfile" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" -dependencies = [ - "cfg-if", - "fastrand", - "libc", - "redox_syscall", - "remove_dir_all", - "winapi", -] - -[[package]] -name = "termcolor" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "textwrap" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e00990ebabbe4c14c08aca901caed183ecd5c09562a12c824bb53d3c3fd3af" -dependencies = [ - "autocfg 1.1.0", - "bytes", - "libc", - "memchr", - "mio", - "num_cpus", - "pin-project-lite", - "socket2", - "windows-sys 0.42.0", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" -dependencies = [ - "cfg-if", - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" - -[[package]] -name = "typenum" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" - -[[package]] -name = "unicode-bidi" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" - -[[package]] -name = "unicode-ident" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "url" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[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.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.84" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.84" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.84" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.84" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.84" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" - -[[package]] -name = "web-sys" -version = "0.3.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "which" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" -dependencies = [ - "either", - "libc", - "once_cell", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" - -[[package]] -name = "winreg" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi", -] - -[[package]] -name = "zeroize" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" diff --git a/dash-spv-masternode-processor/Cargo.toml b/dash-spv-masternode-processor/Cargo.toml index fdeef311..850bb7a8 100644 --- a/dash-spv-masternode-processor/Cargo.toml +++ b/dash-spv-masternode-processor/Cargo.toml @@ -1,62 +1,39 @@ [package] name = "dash-spv-masternode-processor" -version = "0.5.0" +version = "0.5.1" description = "Library for processing masternodes and quorums (SPV)" edition = "2021" -build = "build.rs" publish = false [features] -default = ["std", "secp-recovery"] -unstable = [] -rand = ["secp256k1/rand-std"] -secp-lowmemory = ["secp256k1/lowmemory"] -secp-recovery = ["secp256k1/recovery"] +default = ["message_verification"] generate-dashj-tests = [] +message_verification = ["dashcore/message_verification"] +test-helpers = [] use_serde = ["serde"] -# At least one of std, no-std must be enabled. -# -# The no-std feature doesn't disable std - you need to turn off the std feature for that by disabling default. -# Instead no-std enables additional features required for this crate to be usable without std. -# As a result, both can be enabled without conflict. -std = ["secp256k1/std", "bitcoin_hashes/std"] -#std = ["secp256k1/std", "bitcoin_hashes/std", "bech32/std"] -#no-std = ["hashbrown", "core2/alloc", "bitcoin_hashes/alloc"] +std = ["dashcore/std"] [dependencies] -bip38 = { git = "https://github.com/pankcuf/bip38", rev = "87abd21" } -bitcoin_hashes = { version = "0.11.0", default-features = false } -bitcoinconsensus = { version = "0.19.0-3", optional = true } blake3 = "1.3.2" -bls-signatures = { git = "https://github.com/dashpay/bls-signatures", rev = "4e070243aed142bc458472f8807ab77527dd879a", features = ["legacy", "bip32", "apple", "use_serde" ] } -byte = "0.2" -core2 = { version = "0.4.0", optional = true, default-features = false } +bincode = "=2.0.0-rc.3" +#bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "1.3.5", features = ["legacy", "bip32", "apple", "use_serde" ] } +dash-spv-crypto = { workspace = true } dirs-next = "2.0.0" -ed25519-dalek = "2.0.0-rc.3" -libc = "0.2.158" -logging = { path = "../logging" } +ferment = { git = "https://github.com/dashpay/ferment", package = "ferment" } +ferment-macro = { git = "https://github.com/dashpay/ferment", package = "ferment-macro" } + +dashcore = { git = "https://github.com/dashpay/rust-dashcore", features = ["std", "secp-recovery", "rand", "signer", "serde", "apple", "message_verification", "quorum_validation", "bincode"], default-features = false, branch = "feat/ferment" } + rs-x11-hash = "0.1.8" -secp256k1 = { version = "0.26.0", features = [ "recovery", "rand-std", "bitcoin_hashes" ] } -serde = { version = "1.0.209", features = ["derive"], optional = true } +serde = { version = "1.0.215", features = ["derive"], optional = true } serde_json = "1.0.85" -tracing = "0.1.40" -zeroize = "1.5.7" -bincode = "2.0.0-rc.3" +simplelog = "0.12.2" +reqwest = { version = "0.12.9", features = ["blocking", "json"] } [dev-dependencies] -base64 = "0.21.0" -reqwest = { version = "0.11", features = ["blocking", "json"] } - -[build-dependencies] -cbindgen = "0.24.3" - +base64 = "0.22.1" +serde = { version = "1.0.209", features = ["derive"] } [lib] name = "dash_spv_masternode_processor" -#crate-type = ["staticlib", "cdylib"] - -#[profile.release] -#lto = "thin" -#opt-level = 3 -#debug = true diff --git a/dash-spv-masternode-processor/build.rs b/dash-spv-masternode-processor/build.rs deleted file mode 100644 index 7f74693a..00000000 --- a/dash-spv-masternode-processor/build.rs +++ /dev/null @@ -1,20 +0,0 @@ -extern crate cbindgen; - -use std::env; - -fn main() { - let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); - let mut config = cbindgen::Config::from_file("./cbindgen.toml").expect("Error config"); - // Here we write down crate names (!) where we want to retrieve C-bindings - let includes = vec![/*"dash-spv-ffi".to_string(), "dash-spv-models".to_string()*/]; - config.language = cbindgen::Language::C; - config.parse = cbindgen::ParseConfig { - parse_deps: true, - include: Some(includes.clone()), - extra_bindings: includes, - ..Default::default() - }; - cbindgen::generate_with_config(&crate_dir, config) - .unwrap() - .write_to_file("target/dash_spv_masternode_processor.h"); -} diff --git a/dash-spv-masternode-processor/cbindgen.toml b/dash-spv-masternode-processor/cbindgen.toml deleted file mode 100644 index 6ad9a742..00000000 --- a/dash-spv-masternode-processor/cbindgen.toml +++ /dev/null @@ -1,9 +0,0 @@ -language = "C" -autogen_warning = "/* This file is autogenerated by cbindgen. Don't modify this manually. */" -cpp_compat = true -braces = "SameLine" -line_length = 80 -tab_width = 4 -documentation_style = "c" -#style = "tag" -include_guard = "dash_spv_masternode_processor_h" diff --git a/dash-spv-masternode-processor/files/MNLIST_1746460.dat b/dash-spv-masternode-processor/files/MNLIST_1746460.dat deleted file mode 100644 index dd76e7b3..00000000 --- a/dash-spv-masternode-processor/files/MNLIST_1746460.dat +++ /dev/null @@ -1 +0,0 @@ -{"blockHash":"eb9764a7f211514ee069104e606bb54081b5a04ca6c378040b00000000000000", "knownHeight":1746460, "masternodeMerkleRoot":"9189542049cc5f07c831901c3061d13fe26c67d99f42aadb1356157fa83a96bd", "quorumMerkleRoot":"7c2c6bf3379c6a4220e1eaa2b9b2e09b9b2ba12ad8a93de593899aed2284e5d2", "mnList": [{"proRegTxHash": "7838bb40bc802a6dc137c5505bc0de1ece9161af4b5910a8dbd9d6021da79870", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b01e", "pubKeyOperator": "93d6ee77e7476cee3093e9592348b86e7b75262ec29208b368bae3532e98f2061f612215dad0525de00f72af813e1eb2", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "9f2e31aa04b98f12ba6ba422d09b580663bac88b521d30c520fb169209ca820b", "confirmedHash": "7e2085edeb744a65b30a7d4a00c413f1d9f581c9e1a7ecf90f00000000000000", "service": "00000000000000000000ffff9f411bef", "pubKeyOperator": "97a5997b82ae593a234d7b091ae4fcf0ea8aa0140aea5ab94a0b38991e5a8e025bd45b4b5d0db0292b06ae588f3ba19a", "votingAddress": "4KBUd7c453obTrvA1cnjcuRjwfSW", "isValid": true},{"proRegTxHash": "450934286c73174baec6c44ae84b508d3d2908b1ddc40e32d2ff3f926df74859", "confirmedHash": "a80045999a11bf5454dcc2663dc1b6d0e99b4d329491010a2f00000000000000", "service": "00000000000000000000ffff3625c7ed", "pubKeyOperator": "86e7781eb401f76e9184f5ed6ba0718700fa7e6ce84bb7dbe58d870af4559ec7fd3ec4bf85514e24177766d2c10247a5", "votingAddress": "KhktjUmbUBrNhWxmvKgP6ZmMSet", "isValid": true},{"proRegTxHash": "a1f16c6bc0dbae7e150c85eb982fbd13de0293093c052abc5526e5f224596cb8", "confirmedHash": "3b561cf3e493afafe781480af786f940b055c55f829b47ff1300000000000000", "service": "00000000000000000000ffff2d4d0425", "pubKeyOperator": "8eb745a5a1ba17da8ee8f0a5203296f5cb36a181294359f3ab318ea71942161fd7d70677841470e83d22320a21813e21", "votingAddress": "44bZW5NrZzPisv5b866Ar7G6K6Hc", "isValid": false},{"proRegTxHash": "201ca29f932e13dec3897ecbc3cd895794e212121ca4d46989f0cad8b001ce4d", "confirmedHash": "d3860efe92840ffed489f523633220cdc457c444a34c10fe0100000000000000", "service": "00000000000000000000ffff52d315a6", "pubKeyOperator": "0cd7a149effbecf74df7840d71c93d546dea6b5f4a29d80453ce73447fa28f7f61786ab27ab4d1f9a9e248e31f1ad28a", "votingAddress": "4Vpobp7xC1o5ZdrD8KKnVN3yPomR", "isValid": true},{"proRegTxHash": "88de2336724cd16e5825c9fb1c7f26f79fbd6292dec0e4aa3d350a0bab9628bc", "confirmedHash": "75b3368da2d47da000fcf74bfb823a0b3ff13e945181df601200000000000000", "service": "00000000000000000000ffffb280cf9c", "pubKeyOperator": "87656edae5d0b4e4b1385d9190446a8164ebcd79b79ed244cb3c70ccb9ef69a5d69d01fd906439a626dbc6055d360a67", "votingAddress": "38Xe88e7mrukwZvA581iUFkk2Jp8", "isValid": false},{"proRegTxHash": "762c5bc39597347dc3bb6a78f7433da66e6f0056a93db4bae14ad743295aef36", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff8491cb48", "pubKeyOperator": "8a883dde54a8ed470a066b63a2715372a85e1304076a7c5211e46a7c47d38d6ecc8a872c45336e7740e784606ef9090a", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "8719aa58faf6cd8513499e9d560acac7c0ce6a604f413a41f5ccf31d476bc438", "confirmedHash": "672d3ecec79ab6b63f0f8483555ca51b6a834e050f3b6b6e3400000000000000", "service": "00000000000000000000ffff52d31509", "pubKeyOperator": "03a97b66fe20b4719d7929ec7db422afa1059703ed92a2acb13da3662f2226383c0ac27a5f7b47b1decf2187256d0ec0", "votingAddress": "3v63CgPHHVDoJs8cz7EZp3HgFztj", "isValid": true},{"proRegTxHash": "96892416e056e64b5cac472ec04a294b2229dc26354c67c52f164e47f0c89f04", "confirmedHash": "b5ea2e43d14953f8df398d10630bbd5eaa28c26c3a4d1a141e00000000000000", "service": "00000000000000000000ffff2d3f637b", "pubKeyOperator": "9771552c0369ace1577640f5f5122eeb12b375458497bca88de57fd731de6b5e968c1b3128ce66fe4a1fdc654b3ff399", "votingAddress": "rXKprebRyznsk1DX663f9vffNjH", "isValid": true},{"proRegTxHash": "97098a908747663c3b1c8a041443ec0e760e8d9d79ec916d7f94f14a60b07dee", "confirmedHash": "3708505a0d4821cfa720b98c5c2ae0d548a40be68df4d6320400000000000000", "service": "00000000000000000000ffffb9e453a0", "pubKeyOperator": "029ea6507a40269fc508a126749236718d11cbf7b5436df67d7335b643f9f6a962d72ff3a7477b27b134639148ed6307", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "aafa77aac3e0acbc024727bd7a05bc0db158b6640a91ef66f782a01b17dc1cda", "confirmedHash": "0936d8167da041e9b3edd2fa040a97218af7a503febdbd9b1800000000000000", "service": "00000000000000000000ffffc0f1a04a", "pubKeyOperator": "0e465455f76d96dd699e1dd5284b1403dc9f6b3d1ac0ea5aa05c333863a8f29d4f9171ade76d77e9ab0ff35fee73e105", "votingAddress": "deLnSsqc8MLfB8YVEuqALcGwpeE", "isValid": false},{"proRegTxHash": "5fe590dece088b80a32be5443454cb75fe3b11891127a5424ef5a398a519d884", "confirmedHash": "648d18135ce0480df70fed2d2ff1fb1380f94a18971624a30f00000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "jDcCp3qAYiW9fEcjgRhqqYKw16o", "isValid": false},{"proRegTxHash": "8b032d1325378512855d6f06956bee5caa695b2382c0c1d568972ed1f101edfb", "confirmedHash": "9efeeb9d6fbfef9754ed23812b89296b950ab15f03c35bc80400000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "CDdWa4ybQENPWtVU9e3H1DPQzcK", "isValid": false},{"proRegTxHash": "6252948726ef9787a07df67a2a79781c32ce0f605dfef8066db398d2ffa62a46", "confirmedHash": "91d2b52cffbc171ba84a742ddc084d5a3e41243de5aa9e660800000000000000", "service": "00000000000000000000ffff2e04a268", "pubKeyOperator": "07378c528ac33788df12375d105011823eda1acc73faee6cce6d4e88c6ad80ada80258d35ed3e9807d19af9e01c4953f", "votingAddress": "Fdby3zxs8mdK5vHogmPzNDTJAwt", "isValid": true},{"proRegTxHash": "771d5d288c1148e6e4c80dd7ead9385e335fdb47e023a56f3ef5d9914345ccad", "confirmedHash": "1cace12d73609b8cd6b314e0bbff0e695bd262f2315d74fe2100000000000000", "service": "00000000000000000000ffffa5e32b36", "pubKeyOperator": "11e0564192270ffc88307f66eb53b1ec2ce48a71844dfa73d955f021bf3c0d357781f74c1a45d28d50965ef1eb0a2d5d", "votingAddress": "3nPAPPMycMFbFzwdXw1MBHgm6zgh", "isValid": true},{"proRegTxHash": "185b50dbb314e308597e5c7bf2d4c5d9a6651b22072c40736af327f4b2aa11d8", "confirmedHash": "a6b1805f070669f7b04fc1d374872ee714a156d7f9b5ed0a2000000000000000", "service": "00000000000000000000ffff50f0106d", "pubKeyOperator": "0be7cd290fbe9c2de8b9314c8a5bc1345816b20508e46026a512f77d00a914ac7e9f204ceed4002801bfde238a14e0f2", "votingAddress": "3L55XzhcBYECRkxAV4sJXDv29Mth", "isValid": true},{"proRegTxHash": "3a68593e81537601d2abf0d6bb4f06c8eccf9fa7f4c201d15e9152e4e1bdf091", "confirmedHash": "a29c7d55d3babd727396fc7521a3f76e984efca6cc3527c81c00000000000000", "service": "00000000000000000000ffffc11d3940", "pubKeyOperator": "05e2e0ff4488026ff18e1700c8378f50e4b84b9222ee46d0898ba7debe7da7121f98edca635bd167345e7904ee08330c", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "6ea30c66f5e43b184ef1e7f46a3d1a641a395b7e7c47be4aa77d37798e78d0c1", "confirmedHash": "1efd979885ac1b63aab9816d1b528c388f2cecb2ba50744c0400000000000000", "service": "00000000000000000000ffff55d1f1e3", "pubKeyOperator": "92aadbcec7b7e611977020cb7592e47d971379e364b524c2a36389930bbd88fe532d5c22cb9811a5cfb793e0075302fd", "votingAddress": "2vH44853Kv2ab5HjXUmxJiuTPrMa", "isValid": true},{"proRegTxHash": "e66e834f369e663edd53cb9ac6edd09b655e07299e633cdc5ee00aa9be12e794", "confirmedHash": "60ccb195a9f1418dc9f0eae6d16d2c59a364c268d2244b7f0100000000000000", "service": "00000000000000000000ffffc2875094", "pubKeyOperator": "04171b6580816479ec432aa5afd73b257cdb787ba648b68d8b826909a4fcfe6d24b5e561f69cf3ad3225912192a89c61", "votingAddress": "2QSmr37SfTpPdBwJJmrhEF8MF8aH", "isValid": true},{"proRegTxHash": "a8954bf88414f94d7324701fb334a7d4e407127bc015a962bbe4b4c712fc318a", "confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", "service": "00000000000000000000ffff453d6bfc", "pubKeyOperator": "03bfbe677c2446ebdd4d86e1dce20852d882c2ed0ad04870a40e4a5042abfb244c20570aec3e8553fa66002ad8cb4731", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "933ef3070d56780ac837a206d1088e182666bec88f5073449ebb772d52c95d47", "confirmedHash": "ba8dfb29a3ece4bd24c6558d9c4364fa45f635117672338e0700000000000000", "service": "00000000000000000000ffffb009d20d", "pubKeyOperator": "964162ddec45e3dbe4e587c9c3e693661ee48a72596fac194851b71101087f830969bc33aa2ea742b119d30ea805e2f9", "votingAddress": "2136PWHRdA8BxZN1b3AhEmue59yN", "isValid": true},{"proRegTxHash": "17bd4294e70c5ebe12b2de719d887c8ef3f7a980469416650706e327eb3abb4d", "confirmedHash": "13a1b473a244a2e0464eeaa38ce95ebb758a928c002aa9332b00000000000000", "service": "00000000000000000000ffff5f553031", "pubKeyOperator": "96a3da1d9fbc05293e475a5195d263b13666374ddd42eaf69627cf31a50d20dd418faaeeb3fe2d16fe1a985318ad6697", "votingAddress": "2ce9EbfwRenCKhKpHfE8cxLGRS1j", "isValid": true},{"proRegTxHash": "3dbc2bc5f23f59cca379475f08879f7f67982ac035494cbf18a56e270f12b019", "confirmedHash": "f976b273ed390b990053f9fffa3e94d23aa7e936fcadbdfd0c00000000000000", "service": "00000000000000000000ffff86d1cb77", "pubKeyOperator": "8c60a43d99c862379cf61248807907dedf1158421c8d82bd3fb2b7a1a47f8156f91e476ffd3b70d77b1718745b8ac0f8", "votingAddress": "c4QuyM12wBtLui8WdxGqEQf17MX", "isValid": true},{"proRegTxHash": "dfd45b436fb2a3ab7dc37724adfc0b653dca7861822d8483b3e0fd1e407e103b", "confirmedHash": "52188024492a0321b8554469b12ca7b45de9ad731df7b4530000000000000000", "service": "00000000000000000000ffff5fb3aa1d", "pubKeyOperator": "9037fb85199c6d0c31455cfb63c3022eb4aa2071c701f2bbd9f2a0115bfaae4d92b08d75fb0c2d39cee55dc5c40aa003", "votingAddress": "nDyo5ARcUyjXSHJx6abLRYCSGnP", "isValid": true},{"proRegTxHash": "f0a7acdc8e09d97b64bbd26fcd5c3766d24f2cbdfc17bc997452abc8c6226871", "confirmedHash": "716e2e8c7e2795e293490ee391874fd59280ad8bce1c3c9a0200000000000000", "service": "00000000000000000000ffff55d1f23a", "pubKeyOperator": "19a39d07608e3aa0ad3b37edf102965f566b91d2fd51b0cdc6c9d7ede228f1bdafe5d866034dd57557f7532478111204", "votingAddress": "2Eggf1kvExxwhfrXDLqufp6Rashf", "isValid": false},{"proRegTxHash": "9b7c8d4c1591be862caf40b9d9eba4caac45da8c3af77a85ba5700e8978376c9", "confirmedHash": "b6bcd70982aadc4b7d4756042494518673b859c39c9d0b641300000000000000", "service": "00000000000000000000ffff52d31581", "pubKeyOperator": "11f81eeb277a8a467b579265b939c2d7c9eb75050c9db5445cc6cf4ff993e56c98b321edfac10126f1a99020464b5aaf", "votingAddress": "3tHQPU8GV4GG72y2as5UoVx9gWNs", "isValid": true},{"proRegTxHash": "f900f6640acf541c89b0b8aab53e1c6f2732875feac2a077fd135487b863bf55", "confirmedHash": "39feeb69183b3cbab2027ff629e2e4a3efe0efd86ae641ae0100000000000000", "service": "00000000000000000000ffffb23efdaa", "pubKeyOperator": "0aac9604129f4ff36cb8c224c30b9dfbb3f6f7225599922a2ac2b6163e09f51fded7e7a6ac6c5edc458d92e75d788bbe", "votingAddress": "QbzwzfSh6b2H3PwmJgzDTV4kRCE", "isValid": true},{"proRegTxHash": "00450f738658c1310401b1a5832b74023f58183462293bccf9b35527dae15a32", "confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", "service": "00000000000000000000ffffb0df882b", "pubKeyOperator": "01f64f042dd46b9d1631a68a7453d634af7f1ad9afa2b7d02769cdc509293211322a44a69263d70ca195129a4e1fceae", "votingAddress": "CSyMtGA1nkQVYHbkkaTVwVDGwXR", "isValid": false},{"proRegTxHash": "780de20612080bb8c6783019f0cea24d923c807b8c8f7f11c146feecff25437f", "confirmedHash": "ddf165be06772c606f2501a8c92d42933746d44e0723da420500000000000000", "service": "00000000000000000000ffffc0f1fd48", "pubKeyOperator": "0c4b199545f7eaa5bed7060f4f2dd30302ae56db001868a4df41c9fe056c346da71151c58faaa4d06b5bbd4deb7d7fb9", "votingAddress": "3TZhVrmyW5PePTAF5xvqGcH3mtnz", "isValid": false},{"proRegTxHash": "764b523f6b5334fdc665560205c18e043314fecec82680db26744d61fa553af5", "confirmedHash": "11826648ec9ade645f7596c033452d78fad07213865103281d00000000000000", "service": "00000000000000000000ffff9f411f41", "pubKeyOperator": "847a2d9b2c0c48408164f4953284351725a2f19833da31b577a4d708824236496125c817dd9408346378ae983acebf4d", "votingAddress": "2L7mn9SWvVSfwhnprhS7UuattEdn", "isValid": true},{"proRegTxHash": "9f3e0729fd7075131480a4f141894c63577ef17d10ee1d470f043612505da532", "confirmedHash": "776a1f9fb8e021653cd5e0bbd1dab2fec90b7ea09ba24c6c3000000000000000", "service": "00000000000000000000ffff34031319", "pubKeyOperator": "857ea69ca89ad3f8ed921cfa411f083a7122a49d9c34f2043621c204becb041cf4431b88d581c12e560eba19a2ba8d7a", "votingAddress": "39MXJRowxV9Joqz3kLaJCKweec2e", "isValid": true},{"proRegTxHash": "22cd40522a0704f295c62e2996674608ddf2d694e40ab3a22be7e8e54516ba52", "confirmedHash": "eadcd25a1e89b9a9920d0f3e54ff03355a95999e588e31a50200000000000000", "service": "00000000000000000000ffff95386f59", "pubKeyOperator": "1408fb73b2b76179f4d6e1c1a7bbe5a4155269fcaf051e84288ae8dff403b30f516adb718f378d6211bb945e75ab0fec", "votingAddress": "2USU7bVAinzEhxX622iQjo599TXx", "isValid": true},{"proRegTxHash": "9b819114fdc496ed983a75a0da77305e9e3d9d22e69ae242048dbec4ef3e1e57", "confirmedHash": "ee56a186b7e39ada68a7160f36070fc4ddce38125177441f0500000000000000", "service": "00000000000000000000ffffbc28e709", "pubKeyOperator": "97e803ec1bdb4a8e9d6212ee41cb3c940afd5f9c89b3c6605a16318605dc73069f159f623535bda75c38e024fa582013", "votingAddress": "apQkhWkJk2H4JdNfRGXkDJGeY15", "isValid": true},{"proRegTxHash": "5445f1069976e3bf70ccc0565b1a8a4e779292f7719caa126fd95be63b2925bf", "confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", "service": "00000000000000000000ffff9f45d42b", "pubKeyOperator": "901a882a011b70127e0e72552c0e308385d526f5d3e43fdfacb78ea52a4eee5519e00ae4e64a592202ab55972a99948c", "votingAddress": "2fJKkD1Z1SRSVUAhSayjGPuVwoS4", "isValid": false},{"proRegTxHash": "491487fdf621e938dde6800434d075817a66657a35781404bb81612eedb94dbc", "confirmedHash": "beae829de12b4541bb5f7b1b56c3112bba87218693a3409e0200000000000000", "service": "00000000000000000000ffff9de627aa", "pubKeyOperator": "13e991b55449d2f0280845061eca28f39d583d15b32ace75d7ab9ebfd65f17447216ff4159e898d202dcc3a10c6e4790", "votingAddress": "2w75cXQJFqbfLBBXGkDhx8qSMUCS", "isValid": false},{"proRegTxHash": "2e95bbb7431cebbef572aaa2ea7ba546458b2e742f9a242999ed931335509139", "confirmedHash": "b5ec8e431d9255cf165cada52b256a4aad780ef6d6469ba80400000000000000", "service": "00000000000000000000ffffa877578d", "pubKeyOperator": "8dd61094bd587ce5c5ba9fe253321d2f9e49ff71afadd4cd7d17ba1db0596314a3be53da2b9562608d9ee00d334bdfc1", "votingAddress": "fCPiYBstvDP93Hageo1vi5GjsmM", "isValid": true},{"proRegTxHash": "602a3e0045828e1a86f8091a5154937a7f9fd7043316042c9c9480c6e6b4867b", "confirmedHash": "0e9cbd94767002e1680aa8faf902d426c527f0efd146c4170200000000000000", "service": "00000000000000000000ffff22d1edf2", "pubKeyOperator": "033a892de5639d0ec877e6b1e734efab29cc48bdafc81e197552ef843ddd1e335a0d538cef6acd04a1e51025e2e33124", "votingAddress": "KqvNGLSmFDowGeWNcXsvXeGgSZw", "isValid": false},{"proRegTxHash": "094fb28582b8912f3b4be0cd30ea2e42d630a1350ca2e1eddea34d5fb5a084d3", "confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", "service": "00000000000000000000ffff55d1f135", "pubKeyOperator": "183ad2fa4d5622e12ef083304461bcc046c41c2a24b2f1ef7b36e2fe8bc50f48dbef75cf51128bfa4e280ba724babf23", "votingAddress": "2tuQcEHnM9AyMdyYGibkxWQta5ua", "isValid": true},{"proRegTxHash": "529fb061d5f48018b097e5d1832a3a6f632bdbb199188d940706a3916c17d436", "confirmedHash": "69c8d0112b90309e059bf8ea05c864bb9719cd7602d66fee0400000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "3SwcQ4gmuUKFMkpz4RFY8NfmgiCp", "isValid": false},{"proRegTxHash": "f6e298b30892db6f75b4de7fb11c2939518b25ac4c2fef70cba689cdd9fb12b5", "confirmedHash": "3210f32b9081cf46be00594399440fc1d9050d2f6dbdc8eb0800000000000000", "service": "00000000000000000000ffffbc28b985", "pubKeyOperator": "8a93b13b4b2ad3c3781f92b08f7652564bf3323c88ddd9390456ceae06f68d1cdb773f2216a2c0a4d0d4784fdf4adcb8", "votingAddress": "2PfcDh9GBHgZV3hYEPMuosReP6qK", "isValid": true},{"proRegTxHash": "e58218b059f4596b4a558147c92f6ad6b987f966fc311172d2144ba74df90e1f", "confirmedHash": "00c192ccb42a1f5ee3153ec2acf5548a7b734eb373d472560700000000000000", "service": "00000000000000000000ffff55d1f24a", "pubKeyOperator": "04327a6c8ac45749e0258a193f3997a1074fa442fd654654528f1a3c075a0b0fd6a7a45ee77eb090cc04c49afffc9b07", "votingAddress": "3ovH6bo5vpc69pZRW2cs5Lou8W5o", "isValid": false},{"proRegTxHash": "f12a100b87c576d82e5e442052ecd1d74448e896cdc8feed1503ce198a343818", "confirmedHash": "ba55cb4616d8414644fa469951f136092282262cf02dc48a2400000000000000", "service": "00000000000000000000ffffb0098f78", "pubKeyOperator": "0d51ee16a4cd6a1ef4dd706f2d6e77241e6ce311d287283e023c35de186b5b5b53fc48c80f25bbc8dbc78853acca9783", "votingAddress": "36VwwxZpJMZaDqHyTWcxcnPNbzP3", "isValid": false},{"proRegTxHash": "4daa5ac5ef4c2901aaed95c523b80697a7669e1345c5253f9098d8456c8ac0dd", "confirmedHash": "e723a8ec69d76b21ed258ebad5c3d5e31273d5fa64ca80220f00000000000000", "service": "00000000000000000000ffff88f31dcf", "pubKeyOperator": "0b7a71eb4ad3e67f5a53095d2f65e78a44abd9162366061c9ff09c551a52a091de5c12b805bc4f1a02ef43bcbbceb8c2", "votingAddress": "3HRK5xzL8J1JnYYrjKns7G3MR5Mc", "isValid": true},{"proRegTxHash": "e426b0d37b78a1096b2fed6e2492085ffac09d8ba0b1ec449e2a8b23d241d52d", "confirmedHash": "c5af7f22360e4b7605de655dd66914128c237a673836e8741000000000000000", "service": "00000000000000000000ffffb9b7629d", "pubKeyOperator": "00d2ce15782037e39455bec0f6cdcc4d594ff2535823629a3a837d1c7fb06f720a6baa14c02645612859baf3c89df8c8", "votingAddress": "2b3DDriuWksHR8GKjvqXsUZ5GZ1R", "isValid": false},{"proRegTxHash": "4755a854d2120d3377e87fbf7a60748adcae36ced10355711032bbca1dc39093", "confirmedHash": "f03873b8c9bb548f2942f25edd01f83fc84b2088280faf3a0e00000000000000", "service": "00000000000000000000ffff52d315dc", "pubKeyOperator": "0008b41272e26df09f1949cab4ccb1612d4c2cf4b3a31a1c84eac68e7092583726bab4a3a96e5482ef79bbb74dfbfc9e", "votingAddress": "oSitPg5CzChshvxDqasSVFiTY2G", "isValid": true},{"proRegTxHash": "19a70056b561c7380835adde9464eafb6f76ca1e6114b489c5ecadea195b3865", "confirmedHash": "00c192ccb42a1f5ee3153ec2acf5548a7b734eb373d472560700000000000000", "service": "00000000000000000000ffff55d1f247", "pubKeyOperator": "176b3fb49331dfa6338dbb876cbcb5e6fee76b664ebd95fa191b26b59b04cc08190c52a9912d11bfa395cd4977becc37", "votingAddress": "2LgKRUG4gdhaG4SvUvWyi7SCWuyG", "isValid": false},{"proRegTxHash": "a4b5310622ee9de86b11e336bbbb0a0c98a430ab9926d92ec16690f74acffa8b", "confirmedHash": "7a63f2fff216837c99cd7cf84762a7829688866cde3d903b2700000000000000", "service": "00000000000000000000ffffa772ae5f", "pubKeyOperator": "133bc1cae5a41cef7a97fdde556d1ae074bbd6b201626d52908a5fd9d217dd912668710409a52e2230d9e74fe8a1dbfb", "votingAddress": "2YzTrA91dX5HsqN8w5J12bgxSAKA", "isValid": true},{"proRegTxHash": "061bf5ea3fdfbf566c02032a4529762624295cde752a240a80a86593ae5de0be", "confirmedHash": "6adc93a648cf4470b930bcb290bd8549ee6add5235c6db0c1600000000000000", "service": "00000000000000000000ffffbc28be27", "pubKeyOperator": "136fc66c1b9dceb468c5e95aac34e83464ac6b885cbf9f0748ab833f35e6300c55e9aad03cec19015915c17e43ec03c2", "votingAddress": "2vtQiLhfNNx82jiRWmtpS7buLNyT", "isValid": true},{"proRegTxHash": "7d94c55640f71dddcce931b1dd2fa015d6332b4c683bf375b81ec098a7e92d00", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96887fe8", "pubKeyOperator": "07b5219d4f6f1a2cb18b215a82983477d5fe56fe34faaea0e3fab9a093e1012c555a97d0b660126860153397a96cc102", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "050ccbf1da1cdbf591bf01f10a7f0de778f75c6ec053077b83916058f3963bcd", "confirmedHash": "9a1d301a18559dc1aa20644fa3b6273224ce13f37e3b92b14400000000000000", "service": "00000000000000000000ffff9e65a24a", "pubKeyOperator": "81978e429266b97b5d9c73ad4c6b0e11e65a84f4f2ebd6b3e38acbf5dc4749a11a7a8daf5e46ad3f1e5b75387a0fa6c5", "votingAddress": "RHbpXfKfDR9YMwzZzXZtSE8K2YA", "isValid": true},{"proRegTxHash": "bf1fc72b447a56bf2aa372acaf1b3d49744e12260cbd2b96b163ca3cd80adfe2", "confirmedHash": "15b6f7df6f2710c92187e31344c2abfba08616dcf0d111610c00000000000000", "service": "00000000000000000000ffffcf9ae8fb", "pubKeyOperator": "074162697e2b3692bdc4d711dde7bc0c933068bc7ee5766b903d13ba6900f963d49e922f10ea61d587a717105a30c4c3", "votingAddress": "3bMPWh1y4k1DXdZK2vFQj6gWRB6K", "isValid": true},{"proRegTxHash": "b8277a1dbf0c1ccaf4f793756195a093a7a3eebfd6fc14dff7123404fd224353", "confirmedHash": "2aa9abacfda4e01b53df2819744001fb2490d66ccd107ce81500000000000000", "service": "00000000000000000000ffffb23fec77", "pubKeyOperator": "105896237718d5b2ac26e58350307694be49af73425f3d978ca00786c6f30c6886d25ad8a0eedef0d1fc15ac6d437b0c", "votingAddress": "3bLJeGYmPS3fQinxbxRALGvEpUxj", "isValid": true},{"proRegTxHash": "8704c214bc4c6f1ac70a479a01e20a47451d9762ccbb66401986090e351486ad", "confirmedHash": "b097f3b415f40922a3621239067945aea491d8d4e16698b03500000000000000", "service": "00000000000000000000ffffb9f27016", "pubKeyOperator": "852f55c29ebd2f351d1bf23671c5911947ee0d4f5bdc32ab38ae01534f9a9f5a971645f3155336e759b68099dae6ead5", "votingAddress": "3V6pgV2refmZfFAvoTXUxPCvykhj", "isValid": true},{"proRegTxHash": "191a22dbc4cd5dc5f2cd7dd9d28fea83863aa6b2ce8068390f5cd29906a63541", "confirmedHash": "07d63872a811e9f411c7954d2d50ab61442c0deb7ef9d4da0d00000000000000", "service": "00000000000000000000ffff8b3b4088", "pubKeyOperator": "8734dd6cf3888f55236757d6140b7dcef62711ba8a2c730e74c129103b3c266a875fdf7b5932684d657e4d466b5cafa5", "votingAddress": "41DS1CGRGJJChJ7AvweiHsXXsjeu", "isValid": true},{"proRegTxHash": "ab7933f0b2df99520e768beda79579ac99d6c541cbc2fcb5449532c089429226", "confirmedHash": "223ca2e8caa78a6ba7967ab622b7e865a8199e35efe8d5320200000000000000", "service": "00000000000000000000ffff6baaa288", "pubKeyOperator": "8fbd32ecbd54db00865c3ef6a784f12c0d070d0d69a162bea0aca0936b7706ca572de8c54e019c983b15d5b1a2429fa8", "votingAddress": "2TfXi6XGH5inKApeskGjkRkqAYrz", "isValid": true},{"proRegTxHash": "c83b726cdf4e1568d076658de511000b182cae2cab060eb73b31d9e6982a0e0d", "confirmedHash": "eff04ca2204de90ea4ef053e0553c0efda5f8ae1a5c025c80c00000000000000", "service": "00000000000000000000ffff2e04d9f2", "pubKeyOperator": "993b0b43e584ca5a6c961b53adb79f0af30d6eba3e445ff406c647ac1bd445d3ca3d9a50978907b1f33c2276169c8f47", "votingAddress": "vnAR7NyqTfcmmVabGDuqe8kJz6h", "isValid": true},{"proRegTxHash": "3b559ee44ab2b275df9ffa9fe2c3aaafc949013471cfdf64e357f90f20f73b3a", "confirmedHash": "59dedcb564479592f8a803c8bdc8a26d2df3e34c0d03b8171000000000000000", "service": "00000000000000000000ffff55d1f1c5", "pubKeyOperator": "16aa5621f250caf7bce28567f8279fa088a3dd4cfd69fc36a5a0ca251b286e18a9cb33631e762afd0ea1956d3bdfec6f", "votingAddress": "vGKTSrpqfWiwdDTpnpGhCxtVGHK", "isValid": true},{"proRegTxHash": "44f2d8f45ff753dabbad9785919ff78a279f0e16f6834fa45fbe298ac93851be", "confirmedHash": "c43a6a5f5da7ca9dad2077be182790c4dfa7fffb886c54a30f00000000000000", "service": "00000000000000000000ffff55d1f1dd", "pubKeyOperator": "88f7ae58b4e78d3909f6e648b5db7573a7d3b1d5d71ff9985e95c1466c2a4e9057450ddc810265fbab39e011d7729fdc", "votingAddress": "33gfkdqGVExZujd5wu961KJCLr4n", "isValid": true},{"proRegTxHash": "51233f57404f07f850a13b469779462ac67b38dd4c9991d06729faaa30e09928", "confirmedHash": "b56c2b7014ac7c8acc022746f28a05734553e68e1e9fb9ff0600000000000000", "service": "00000000000000000000ffff8c522948", "pubKeyOperator": "036382e6ceed79b7c8389090696ffba5e3f179aed1b7194679c9f3b9995d50eff2dbc022b464b7596a0a2c83d62f0c68", "votingAddress": "26KMv8quLRauA4uXzUAAmP2U1FVp", "isValid": true},{"proRegTxHash": "1310df94e54989cfd09bfbaa7440bfefbe475bbccb20b229a6f0a118b5932a4f", "confirmedHash": "46277ba4f6612c8e65bd6fa72acb0edd4750a84764308dce0f00000000000000", "service": "00000000000000000000ffff2d4f3392", "pubKeyOperator": "99509654d9c8266cec156733c39dc1e049e11ef0c61b257a54b223cae5b719382d4f54cbc3bf076bd7213a37d45177fc", "votingAddress": "BTPfa23jQaK3ykRN7tFSuhjcnfD", "isValid": true},{"proRegTxHash": "b43ee324cbdf7558f926b24c61331b7ca3fe324322fe48bb24db4195a816ec30", "confirmedHash": "0b609d0979c615de550a077f44abb47b4444dfc9aaff37380500000000000000", "service": "00000000000000000000ffff80c7114f", "pubKeyOperator": "043376ad6a2bb51c1d4805809282fb62d43199157615f580cfb4e7f1e465877ab35df52a50eab851a19ece461571345a", "votingAddress": "3SvapVYDQozcsN99knCakqRCTtMt", "isValid": true},{"proRegTxHash": "69c301a7f6ca1ebb1aea91db7c99c14c176fce2ecdd85870a269f9ad34109905", "confirmedHash": "245d2aa1f746068da867c375cda4d963bb09e0fd9621fb752e00000000000000", "service": "00000000000000000000ffff6deb466b", "pubKeyOperator": "8d56766dd40b24f0b4c9a19e18ff322057dbf25a9ed354fb8ae5853372bfad7086772ee6ae546239b33e7e8f78c8878c", "votingAddress": "8bodqEMwS1vgQDVtk23Fsb4qub6", "isValid": true},{"proRegTxHash": "ed7b17d1f04e56b7c50b01981d5189ef15ff4c4adda0369b6429ef120f772780", "confirmedHash": "89b2e80659a6eb7b463308ae86a4e80c1e59ce79a69b57f60f00000000000000", "service": "00000000000000000000ffffbc28a319", "pubKeyOperator": "976497a76bc74bea08009256bb23a5b39fa56844bcf271abc7d2839d52bb81a08acb9d9d50e918f4ed8e8b81631a6a7c", "votingAddress": "xMtYXFFdNyWDfhf1guXA2nZvj5C", "isValid": true},{"proRegTxHash": "430fcc341c597ba01885f32667bed6617e7a3dd4deb616b44c50eeeb8e08b0e8", "confirmedHash": "8e24590c9511b80589b8c145b2bc4a4d10fae365caf59ec31d00000000000000", "service": "00000000000000000000ffffc3b5d211", "pubKeyOperator": "0fa5210e16c5e58a21cf898b26ea815e6ee7afdde1e5646d2664676dd622c698e25fc74a493c1c02fb5277d4df5f52a1", "votingAddress": "3nfziMGSrDf4yFYGCDY4WAppRqnm", "isValid": true},{"proRegTxHash": "81bfc9040ea583204c02c2bce6e20d5e62384cbdc45d63397d34b3316eee66a7", "confirmedHash": "3cd62439516f73d1412658700dc261b7069f5f69325968d71b00000000000000", "service": "00000000000000000000ffff05bdfd48", "pubKeyOperator": "17b7ff2d673357a18a31cf9a92b94ce3d45da8e130a17e4a9bf82715b2c97eb926eb39f46ec36e4c9770f2feb39cf035", "votingAddress": "29CHPqna8B6D85RGnbBqVuo9iDFf", "isValid": true},{"proRegTxHash": "db3ff2cc1c30ca6ddf057dce3d2b4d0cc1c890366852691d3e812f083fc6fd5a", "confirmedHash": "3b3257340447e11d1392609f7708d899a4007e89035fd5da1700000000000000", "service": "00000000000000000000ffffc0f1e9c3", "pubKeyOperator": "87911e3b9a0080d4968047c808f1e5b08baeaf27c33f6339e7e28df92e93316df8096409f8ca786a74819793efc0196a", "votingAddress": "2SM6KXBZoAKmqD45TErJSkoBwAHT", "isValid": true},{"proRegTxHash": "2ddcee12e3cee46dd7f1b08f841f0d33825bf0b5bb4b22a987099a1bd7fdf032", "confirmedHash": "fa859d743c98722948ee7a9712e2b10feaa32a203fceab060800000000000000", "service": "00000000000000000000ffff3457362f", "pubKeyOperator": "92ffe80561cbe6e3976bd332a7aa55a382fdd512e4420b08e1d63be9f7b230c6e60ecbec7e2994703ea76381a87ab1e4", "votingAddress": "2ZfKoP9d5KDWfC8fyxiPhp9dGSwZ", "isValid": true},{"proRegTxHash": "024045d9489c0b38b7af50b8bfbf704887bd0bd257af5ca3a909e0101ba3d7c8", "confirmedHash": "a3545e8cfcbc399c36b37eaa89eb70fa80e14f4ed055b50c1000000000000000", "service": "00000000000000000000ffff4f621a44", "pubKeyOperator": "8356748ac871602e89f16c58d862e32a194d499a355b43dcff378000a4c0cd091a3e4edecdb78711fc9e04b081033f38", "votingAddress": "2quWhpRegsCcy4TjvSLUGRWwfJYG", "isValid": true},{"proRegTxHash": "98dca3a7b88299ee74c5014655181b4b3dc78f33e68c040c33671cfb5d5f51cc", "confirmedHash": "1b0487eab9c68004a97b77f45f0cf30aec0374979adab5af0300000000000000", "service": "00000000000000000000ffffbc28fbce", "pubKeyOperator": "17798cdf754c24c7605528730dbd4b438f4726269d95512224a43d01a715e64373b7acd177608c0cf4dde36239d02c23", "votingAddress": "LSFUvMFXvh4ca3RL7ePeUVxFSQY", "isValid": true},{"proRegTxHash": "4af900c8b8bce5072ddc934183866d8b0e0ebdd80bb4c312174cee55c3428b8a", "confirmedHash": "f88a0fed2337565e8b86119324fcda8715ea88a155b86b2b3700000000000000", "service": "00000000000000000000ffffb9453503", "pubKeyOperator": "0b8548d94e6dcd9e568baed416c0f1af986a74fb1d5dfd863f7bffa3eb3729d4089ac14c5230f690b8bf71baf8252d94", "votingAddress": "3sEDWabyTm3R4FVX2JeSwj6V1yxG", "isValid": true},{"proRegTxHash": "dee850c114533a03621594ab64ab1a0cd51bf8e862b5ca83c9822e64967de1f5", "confirmedHash": "790acc3c6e44b61cdcd205c64c13672cd701e4553e6a85f82f00000000000000", "service": "00000000000000000000ffff5b8493fb", "pubKeyOperator": "8a87cfc52774f1968252f5438342a999f5277b0c8e76ca119b71c1055e9c0af36feed23a419c530613aa573ceed441bb", "votingAddress": "3UPyJqn3bjEWRfvEques76q8ovR2", "isValid": true},{"proRegTxHash": "aa739e0dca816fd2b8deca801bdcfffe455e4948a1f058fb5e4729238d556b14", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b08a", "pubKeyOperator": "14f8be4c41f0309bf562ec60ba5cf4475cd2ba9b07e9b9478178994d6c78b595ced859acd7341280a2201f0a4682360b", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "59f920a401acacee9c5a1fec447856845deeaa7bf48731c075375298836dcd55", "confirmedHash": "78cd059f3cd6e842f014a035a34db036d6b3c5539b69d3671400000000000000", "service": "00000000000000000000ffffbce2d290", "pubKeyOperator": "92d74457102672384dfddc8917d80af492ac5de5e61faab182921113e61f1b84cdc88d311c522dd3ea631b3d4ca66fd2", "votingAddress": "41NEfXyBetcigVya5QVDXnJcjLPb", "isValid": true},{"proRegTxHash": "6bf6b6e7d629037cf7982eae2ffd37ec55fa176be859959b21a13adab5d0bb11", "confirmedHash": "c1ce2a44cbfe6bfad46f7935870599a0834ff20bdfce76970d00000000000000", "service": "00000000000000000000ffff55d1f11d", "pubKeyOperator": "087f31a9ce68a9de738e3025828c35a137473c209c163c46c40d0188e6a9e1a243ee343ece9a9f1bce18d586266f662d", "votingAddress": "3iD34yiWXLYmZGCFY3cMBp6FfmpP", "isValid": true},{"proRegTxHash": "ea2556b8908034b99ba78762d906543544c3fdf0b400ecb6082a619fa648fb07", "confirmedHash": "918c6e0925c9b175635ce4a6428a970bc716f5dcd7bc0cbb2300000000000000", "service": "00000000000000000000ffff55ff0141", "pubKeyOperator": "057ffb7a690ec686950435796762192438fee6c4f811f38f77e907f0ddebda3185d7e4b2ba4043a1d5f95894e9debca7", "votingAddress": "4AANWBkqDBDu2afJkTjb1uHtE8iU", "isValid": true},{"proRegTxHash": "d4a193d3898bb271b6788f15d68bcaf5f420d6a5a1855a95d86ea4a04453b1c8", "confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", "service": "00000000000000000000ffffb9453729", "pubKeyOperator": "0559c3018e88c553bf9ab9de736aca2e2e9304b2fa0061e1bfda00269d91f7cad8b97ae999b4850c5b434e8cc4fd2a2a", "votingAddress": "2RcQ9p4f2HMb2Xv8QjuoDDS8XP6", "isValid": false},{"proRegTxHash": "2df11189fb725d056e5292a623edf61671eda04ff03792a0ce58701bbae3ade2", "confirmedHash": "da9acbd1bf1190ccd120088a9357f3c5819c9d15a9f5b8931a00000000000000", "service": "00000000000000000000ffffc0b85ad7", "pubKeyOperator": "96f1c8fe7307b68794c69d7c7d9bf4cea72ff9003a6b0eb86dc04ab8cb230123a15d5c48d217efdc7c85ee7857074f93", "votingAddress": "2K7XpTkEUSyeUfD411czrUqWDpAe", "isValid": true},{"proRegTxHash": "28c10a76a2bedf0eab5ecc942876939ff02ca83126b1341b51d429aa3563eccc", "confirmedHash": "4012aac170fef2cfdc3bd3c387dcfe21aa8552c7769dde450500000000000000", "service": "00000000000000000000ffff44b750e3", "pubKeyOperator": "87b288fb9276d9ee276bc088d96a9b1e59917eaf74338472124dbaff2e0949667c8302933a11b00fffba399c738ebaf1", "votingAddress": "4FLUL9thUPjSBg7vUb7zWNYjzkKU", "isValid": true},{"proRegTxHash": "6a3af9896ac99b064c306544789be0c364fd06853a95662bfef96903eab23fdf", "confirmedHash": "8459ab8181bd64c8939a4f78325484ba9d083e30df317b441c00000000000000", "service": "00000000000000000000ffff51470da5", "pubKeyOperator": "8cbd9f9bc445cb6ef8be1ca9840c9275313a518c0af852e4b7289aa7a03a681a7f50dd540f6f1501c3cf8134f0460461", "votingAddress": "4UgpaXsua8FUA7buDgwmzYU9JSGF", "isValid": false},{"proRegTxHash": "d161b32670c80e76bdf20004704abced655f5f1c8116209925035db471c07c36", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688ee64", "pubKeyOperator": "8d8068119ee773b96bb0f173daa97a16dc33770f16594c1f7fc2f46275db406341bafe4334d2fbfd927cae29f565664c", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "41009a1c1d57c02702fceb1d5f69041189359ba709369311ac5c2cff34ed4a9d", "confirmedHash": "54808f967a1ed78b5194c7128b4acf5adbc9ab9704b9496b0800000000000000", "service": "00000000000000000000ffffbc28b6d8", "pubKeyOperator": "19464f857c07c15bcf36e89130580ae44a5519fab05a031c73a11846f2809387f5ead76f4ad88c3df0928f49bec53416", "votingAddress": "39dJQMDnmqL9RLeERocCBgv2C85C", "isValid": true},{"proRegTxHash": "1f2c799ab6c564249f1ca0e664f0183aaffdc61bbdee8c3b83053cc6cde7d287", "confirmedHash": "35465694ed14e8ab1990962004e7aeac367fba7e289ee42a1400000000000000", "service": "00000000000000000000ffff1f0a6124", "pubKeyOperator": "027e0ca0abb2cf196ed67893d2f17a1f46e819db294726fe982d99aafd9fe61ee6227fe8786bdab808355164a4f42bf9", "votingAddress": "tZn3jAvkVhgLKzzrZnbC2DkwsSk", "isValid": true},{"proRegTxHash": "9daf61b42276d0a7457d886a5834c107988de2bd205a8732c020ed7c457ae07b", "confirmedHash": "8cec3f98fdc047c94658a4204f1a16ebcf8ebc4105ffd0920b00000000000000", "service": "00000000000000000000ffff52d31939", "pubKeyOperator": "04559375e90a224a76da84c3682b90349633d5e759d49561d4dd53a6bcd35cf6fcdd779671e38e8c35c4a5abf3223d8e", "votingAddress": "3njbw2x6jqx8Ue85Ps8RGip4tyz7", "isValid": true},{"proRegTxHash": "5fc464b615b8c054ab7a1af249045ded873002ebcb98a5fea41087c49b0f8558", "confirmedHash": "6ae1fc97f35f12bcdbc795195e82d45c822437c0a18c9a702f00000000000000", "service": "00000000000000000000ffffb9453721", "pubKeyOperator": "85473f12dee8f18bd20066659629a1e24d3a3b3c78f5a18f579de575f606ac66978e4867bb50a1982e5f377633d92f66", "votingAddress": "2FmEJxrxXKVRJ1rwmT75vfxX41ak", "isValid": true},{"proRegTxHash": "e0d35368bed03ca09437e3ff433ffe22441ca9fad803e2ec5b795c86309af17f", "confirmedHash": "83a8a3243d7b236d466ebb47d9e7529524189888de422f4a0500000000000000", "service": "00000000000000000000ffffa87757cb", "pubKeyOperator": "001ade1fbc8a15e502c363fd608e1cfd4c812cefc69d4a14034df6955d6a83c3537c9ff933793a647553e9c929aa45ca", "votingAddress": "3TxpsraC1JZj9BBt1h8VfPqQtjcF", "isValid": true},{"proRegTxHash": "2b94e58c3635347c3dcd8099a13bf0792030d3801c5ea929b0b2fe62d1c2e34b", "confirmedHash": "726bb8ebeb821069f5a5482e5b53e3ce8e345299db59c0120f00000000000000", "service": "00000000000000000000ffff9df54993", "pubKeyOperator": "0c97c29040ffd46dacafe8f9a659349a023562de75f04c52b028d2819dee8abb21cb7c984b161b10068be1342378744f", "votingAddress": "2LuVcna8fQeTkzTo3ZjHvKPpCZ8B", "isValid": true},{"proRegTxHash": "7a2def6ca17ed92f1036841f37ee6e1ee8c17e8b38caaafa48a138ddea6d8dd6", "confirmedHash": "f8d2586299226669d61abe756f6c6392f14c3dd1b19d11d32100000000000000", "service": "00000000000000000000ffffc0f89611", "pubKeyOperator": "8ca075e56916f42e4af82c309d2fd5fda01a19c566aefef77339358beba526733fa87c7078d8dfc35eebe76425433a38", "votingAddress": "2rHYYYL979doayUsxgmcrVUytnVN", "isValid": false},{"proRegTxHash": "d9a5eff8e4fec22472b1da2758870c47fafe87eac1d2ea00e2e537c7ac26a8fd", "confirmedHash": "2dfa4588f6158b45237ffe2a2f8205191927ca2d46c591161500000000000000", "service": "00000000000000000000ffffc2875dd3", "pubKeyOperator": "96fd90441b1e341a32c9588cb369db663c6dd080da6620a636c9d97efed5e703b7aa5eecf8b831c40b01eebe1ff85cb1", "votingAddress": "jXLcvZNdbtrK3ZXrpsejvi6i7x8", "isValid": true},{"proRegTxHash": "7f70a950a340810a7efcdb3b3218ef8cf469f04a97cb7a0c6ced9bd1259b6543", "confirmedHash": "b98ef71f14062e1eea6c2d6ea34474cd142dcec16a63e9ca1600000000000000", "service": "00000000000000000000ffffa76329c6", "pubKeyOperator": "07f4ed0e7b83924c83519b09a34dae99c4d866aa3477fa838e9d9f4ea3d721062fc8b65272dafb4e16d92f2d7175c1bf", "votingAddress": "2TcmrrVjbh4Brfrhk5cVcxFnZbKi", "isValid": true},{"proRegTxHash": "9e87a7034b52e68d838de84307d69fb1dfc216f9f99ed6834fb548feb5d730fe", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6d1dc", "pubKeyOperator": "974c08f2bb56045dfb040c22ff4f66ff86f041c4bd1c83344c8dc20656365b600826ca73c8343e995185f7954142143d", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "55a4116977946b3956febda9c287ada48004d21f9159c65a884e7655fbe5c5ae", "confirmedHash": "0154fbb8c74a3b8dff418678e53bb4a5243df4b9fbd1d0e11300000000000000", "service": "00000000000000000000ffffb23ed180", "pubKeyOperator": "0090b8a58c3f1e3d2b9dc4530c06f3f7f96431d5dbc8acd40f7cdd501e6a520317162fe898f9ff0e44ee2d57643819f7", "votingAddress": "2Fik59NgCSyhAE8yeYz7PRRfeRbw", "isValid": true},{"proRegTxHash": "230a209b6bf1a365d548f6aa570e8760cb576220e0a313edc513bcfbf10bbea3", "confirmedHash": "eb611bdb0a7c7c13520e8b1ea86b2c22a70b04ce46fbf0cb1100000000000000", "service": "00000000000000000000ffffc2875d63", "pubKeyOperator": "91d8b20a6a878d8b637980ef499ccccc247f2606a2b81fb4f45d1a0935a614ebe6b7b2c8fbc15862c7c8cb9b97126edb", "votingAddress": "ABZSKeHymZRtpZTm76nxAtQHh1H", "isValid": true},{"proRegTxHash": "481dea23a70d6ff053d0a268e0fdadab5010a20f1c077a92cead1854669a167a", "confirmedHash": "fe7717ca14978ee4f70b044efff9833ab2286473b3846e721700000000000000", "service": "00000000000000000000ffff9fdf3cca", "pubKeyOperator": "027207eef74d579a943a5c606c445d1616e80a46b3d0cdbe73142b4aa60c878ec8c9a940cec3fca6118a35503c3b3164", "votingAddress": "4QZK7AXbXJ7NA1ACEmGtD9h1Da1t", "isValid": true},{"proRegTxHash": "4057df3863c18c1035b0597581290a305da1e87eaa63e6ac5e107d108e9847ba", "confirmedHash": "538ee80ad9ffa7f7a024d24a593ae7c8a434cfa9394b14ef0800000000000000", "service": "00000000000000000000ffffc11f1a2e", "pubKeyOperator": "988988be5fa339b8c7e4f5bfffbc240967712e97af741bb944214462c244f9e11c3f4a1d9222d91fd0d620cc21bc6e08", "votingAddress": "3yqLqgBkfvaPJoiahnhguV1hULt1", "isValid": true},{"proRegTxHash": "50dbe5ead305c57dd8a36b94cfb10739422d922af53d8c4860fff320c2815f8d", "confirmedHash": "fdea694d510e39493a708b6a35b976ebaa9fb667fcca4ebf1600000000000000", "service": "00000000000000000000ffffa75662fb", "pubKeyOperator": "874eef1c25a7000f11955ea2e4074cdd5a700038b2971ec4e0bac7911d2bbbcbf486e538ec3254ac5db7fad16f68c84f", "votingAddress": "skLTAnU6VeCSjS8kFxvFK5pZbAS", "isValid": true},{"proRegTxHash": "d458f604c9df855d03de0493ca27a563235360a18818c445e79fbe2bab5abe90", "confirmedHash": "776a1f9fb8e021653cd5e0bbd1dab2fec90b7ea09ba24c6c3000000000000000", "service": "00000000000000000000ffff369c4d11", "pubKeyOperator": "86885df116506d16a924febd85d2cf5e326dde67e6802aa358bc406fb7d9327fb7291228c83dd595dbd35edbdd418e62", "votingAddress": "4JQrmf2ZFRjfhVu2tBJSxL7QmmgE", "isValid": true},{"proRegTxHash": "90f9b109ac7a4d998b85c09cbe4afac534e9f3b349dd107337c70eb986f21d83", "confirmedHash": "84d6c6da7f81ed74d5e631aee18058356dc6965410d4eff02400000000000000", "service": "00000000000000000000ffffadd4dcb7", "pubKeyOperator": "1638c5c7d37f1ec5e216bcc5727a198bed6484690473f33a4ddbc180a6bd4e221bff3eb9575efceb0618926cd7e0248f", "votingAddress": "4Gbjq2DLEAVWJzvmVPzmD8PoAq2i", "isValid": true},{"proRegTxHash": "75c07d085e9bc307feef0eece487e6d21a400c9f34fab8cdc0efcc10317ec309", "confirmedHash": "a226e69a5bfd401292470fc800bcea75413cc4fc48c292550e00000000000000", "service": "00000000000000000000ffff52d31925", "pubKeyOperator": "9526af7d5e2f38025ea28720b3f515456d8f7a6e60adc1ebaa3fd96e5f7a8b6a6cabfa8fbe08e41b52caf57ed3d2084c", "votingAddress": "2zDhx8AzkqNPUUNgAHcWDeoaSSqn", "isValid": true},{"proRegTxHash": "ff01d409c1073ebc90b977061b0abce6357928f60ba8a620882e74d980903af8", "confirmedHash": "542a013847f0be52924d4dc57e2678c4415c8bb4a680845e0b00000000000000", "service": "00000000000000000000ffffc6c7712d", "pubKeyOperator": "134f3cdfa653634dbfadca4f9b8b6563756a6522bde32d1807eedbfc3faa86dcc16dd4c229733731989a3d067c4b9bbf", "votingAddress": "495iPFuXgBZmTUvPjoUn2ntsgAD5", "isValid": false},{"proRegTxHash": "39a474f95ec34722f8592eb582c8d5a990f4d582f3e43c7cd50b19f36f8b69cb", "confirmedHash": "31d3ac995a2ae9339108d53819c1683536ffc26da589e7e93000000000000000", "service": "00000000000000000000ffff55d1f11b", "pubKeyOperator": "19fa0b04474cee29e8e845a8a83db65afac0b7d0de97a2efe0dc910b5f9c0fdd6ed483eda1a4b72ce6c92c9a89d8d849", "votingAddress": "SRuFqy9kVKuz4rHEiw4JGcNpHK9", "isValid": true},{"proRegTxHash": "f337420fb4142b37c75e460508e151842ae9abed98447b19893c8c8e57c61b00", "confirmedHash": "0019ee768a811a3a10919f8dda3fb5d72c4b53b8896c79cb2100000000000000", "service": "00000000000000000000ffff80c792f4", "pubKeyOperator": "99ebf038414d67b3c881593ee4c1a0755fa6cae02a71c96568e9550054d1493ed45e4c1cb12e3213e5c0e0a2abd6df76", "votingAddress": "2ZrVUB4agp6MfT5KcDqb9JvcHeiL", "isValid": false},{"proRegTxHash": "a8f2bbd477245532606425d148942cb3ce0a3ea9cd4f42d6f0d8199a24e8b1e1", "confirmedHash": "29963cf14ea51b8afd66d9082c9c29436c5f8cd2992fb7662800000000000000", "service": "00000000000000000000ffff55d1f128", "pubKeyOperator": "07ee1b39df315909d3a4d125534d1d74fb91e9487f562042354c4f9462003c01e85e3154de836f13e1c37acb2b83fcc9", "votingAddress": "Eb4vFMAfmBRxJcvdx4YUHk7nKNn", "isValid": true},{"proRegTxHash": "10cebeb39f23fbaa32a76216a349ac7cb1344d842c140f0e0dae5fd27141889a", "confirmedHash": "18213c34e143bbee47985874fe9983481ccc1d87f65f21404000000000000000", "service": "00000000000000000000ffff12d7d054", "pubKeyOperator": "069debfe5f2a7bc3c5b612eba442aa108d3aa9f102638c2051cd019b783bf13b449303009bdc49da39ddbb9d14ceadee", "votingAddress": "kjyXSgugKNfULs3WKBwt84brgr2", "isValid": true},{"proRegTxHash": "4069deb6a4c8b09b75922fd4106c00fc110aea3b2bb60873c0241c0a6204f4c2", "confirmedHash": "0f958d48eca6c6dd7492ab76d3d9b43326521f8afec315cb1400000000000000", "service": "00000000000000000000ffff55d1f123", "pubKeyOperator": "81b285b858e2a4221aea57bc70c7bb3d800229e6164baee7955429acda11b4281428b4e665f6b351c52cfb461e456be9", "votingAddress": "2aC6kPpG9pnb39NmqZMgnZcozfHa", "isValid": true},{"proRegTxHash": "cdc1c4b88d6a77521fd4064d2bccda332f749a9586f74ebab42c1fe3e1fa8f08", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0be", "pubKeyOperator": "127bed4b5182e165c5c0b85b509280171e70392782128681a1eaddfaf61c69c3ace9ab035138aef51ae5a1b420585ba8", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "01c2cdff6a755ac4800bf7743df74fd5e7852fadebf69b158b95fcbf322413a4", "confirmedHash": "9fe735d16fdcd0ce52698935768a401e0d0ad59a4ba0bf881900000000000000", "service": "00000000000000000000ffffbce2b698", "pubKeyOperator": "11c03777a99acb79b3a2bc5fd32eb9e8815e7060982c33faf1559b944a418074f4214ab6b60026a15f75f1426ca883b1", "votingAddress": "2QxnsuyzdH4m7sm7KNXP531FyrNJ", "isValid": false},{"proRegTxHash": "c04a5713c481759c60e41fd3c5c83e4de85f749737a53f1de071a060233e4962", "confirmedHash": "d2085e6912125f5efff520e95d16f5232628a729da2345632400000000000000", "service": "00000000000000000000ffff3211af5b", "pubKeyOperator": "90abca26d8a3636b95bfdb1a27b9ada40f2f52179c41dc8c60d13ab4a1eba3a2b69f24660008f96fc1802c99e657cb4e", "votingAddress": "MqPJLyo27aVUQwuFKXza8obfBCZ", "isValid": true},{"proRegTxHash": "1fdd10aff65d7230126b0739f0fcc4dc2b02467e974e7993efe41b1e9247a629", "confirmedHash": "c0c8a92523d85c7fd3eb470aa1cac8590f52b895ec2d58f41600000000000000", "service": "00000000000000000000ffff6baa787d", "pubKeyOperator": "04ce9678f43158ec2b2a033cef694f6fd952e945b87ab9b456348c50f479ef8f6517f3ebe200064bb45975249f5d80d3", "votingAddress": "2fLcLjRonpZw4w4Swdcerznzfeee", "isValid": true},{"proRegTxHash": "d448905322486302c50f63941e5d8b6766978cad33f4278e15e7aa75c8ed54cc", "confirmedHash": "f9cb3cdc76cccc547962ae37ec14acd900fc9978f09c7ad70d00000000000000", "service": "00000000000000000000ffffbc28a308", "pubKeyOperator": "0ea6752dd1e19880a503ad2f87c580e17a6624da48e9980e55fc7ce81614d401d887352ed880f9cef2a82fbbf3184ed7", "votingAddress": "2rbrqWNNsxYLiDEVw27s8gk5FSFY", "isValid": true},{"proRegTxHash": "f7897905a35ca91e9529112b0bc6f7b2b3fe4692aa265b04e90f4122b2d27ce5", "confirmedHash": "43c48cefe6b33ead2d1759380e97041bb4ec50a24bd389873300000000000000", "service": "00000000000000000000ffff92b99ebc", "pubKeyOperator": "141d89e211c93bee9f4cb26e4bd1fa530798dc1cc27e545c0e096aec9d913ba2cae572b339aaab612a0bb2f60dd71ceb", "votingAddress": "mrBub5N7NLqW5DH67Ts1gvmZDYR", "isValid": true},{"proRegTxHash": "f2bef86d3e7d8fa07262472abca75d43847f8d41829c9cfeee3bea1d8560a192", "confirmedHash": "331e63b0fb154503217cf44a8818762854fd3007e17b07a00600000000000000", "service": "00000000000000000000ffff3eab9ec5", "pubKeyOperator": "82ac58f761a67fd0fd0b33ae8dbc3d0213712765299517e4690dc7fd09402059b3e5d8e7abf263ace2f35f7731954c9e", "votingAddress": "TNR7PB87rLvzgA2Dii7aRz5KmYw", "isValid": true},{"proRegTxHash": "e1110d74ba44ebad7649f2d084f0b687041f2ae885e2c155cbed05638c8d4184", "confirmedHash": "1c7ded6aa709cd4f279c060ac03422cc32a418ad3504afa10c00000000000000", "service": "00000000000000000000ffff14cbfe97", "pubKeyOperator": "83ee4b40aa42918c9ab2b435e41af0d786b03c9c24e0ea9efab0113e7de939e8305f909aecfdf32ce2d046794131e9d6", "votingAddress": "sgZ6NqtNVqsVveQCdbgdycjNwKR", "isValid": true},{"proRegTxHash": "47685f719f7dba05e6d96f701794b748669165521b475f995551ce059012bfa4", "confirmedHash": "9fc048af1f552101fbf2666384c0294b252a1ceda05c4d9c1300000000000000", "service": "00000000000000000000ffff453d6be2", "pubKeyOperator": "0aef134dce55e0add9cfbdd78801a88825f209a43afa576287ae0f2159d397c05b6f48d5898b497af3f4cc3528f39093", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "d819facf4adf061f83464e5ffb6f1969e5976450c77bbed1a375a5fc1f578e3a", "confirmedHash": "35a7609a3a6c5d85265dd3e7432412ba2bc7918c12920f650700000000000000", "service": "00000000000000000000ffff36270a65", "pubKeyOperator": "9060a01f8b8f0bc6c9ea2aee8cde9946c97f5614ecadb892e4594d52c7660f1224ce56640de3ce1dbf57316a6a200570", "votingAddress": "i3yYxKYgGzG5mUKRVTiGtEBfoYj", "isValid": true},{"proRegTxHash": "41425a4ac76487c4cf1ba5b6ea8d79dd64ba98ff1eb7ef7184c2e45136da35dd", "confirmedHash": "a29c7d55d3babd727396fc7521a3f76e984efca6cc3527c81c00000000000000", "service": "00000000000000000000ffff2d56a395", "pubKeyOperator": "03e387352258339b3f9a5c3f5353ef3dc234af947fa649bb359694b6daa43ab4d5d907e711f5de2e9ca7f6130f0ad69b", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "0bddae6751bb3d536e89703d9a69a83567cf92eab9747bde18d539ac48e56200", "confirmedHash": "d3d69e248c0c90abc2c61fac2e138de05a1128636109539c1400000000000000", "service": "00000000000000000000ffffbc28b245", "pubKeyOperator": "8e053cea8b28b4e904909e0c2d2e07c33855c518f0b7deb640d25f0b8b71d9401176eb4b72eaaff6c34761c699c8f291", "votingAddress": "28aUDc52doWzVdUKJz6SGoHxtN6G", "isValid": true},{"proRegTxHash": "dc0a17fe6e3d2e86357f67a8a7129ece6ca88857d54c56bcc97301c3c648e019", "confirmedHash": "b8fc3f1ee33f11a0f96ef4cc596e670742336a38102000741c00000000000000", "service": "00000000000000000000ffff52d3192b", "pubKeyOperator": "125b2d35d0ba451e02eff49192e7955fc43ccdc36ab19f6c1d9c05519eff83967d174d2b901888d558e469d27d4fb7ff", "votingAddress": "2obMJSd3ALzr45S29yzE8Y7FeiyD", "isValid": true},{"proRegTxHash": "aeedf52d7d95e689bdd8d5d9aa43174be25ca071bfe94f1410135e5d786fabad", "confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", "service": "00000000000000000000ffff5e82e363", "pubKeyOperator": "0c75b044b75af0c890613a6884bb5f98a0347160e55cf210e7056cfee66f8cddbe6fc485ee525c3b43b5a4a8cbbc0fb2", "votingAddress": "32DyXqrVkf9vXRavahAuxPmtC3ZJ", "isValid": false},{"proRegTxHash": "f056ba4ca2b78dce49d5d95c0cd3dbbab313fee88a230643175044b6d2f9d760", "confirmedHash": "6458e4fb1463e827e7b043ab7c16799f5397276f28b2d4230800000000000000", "service": "00000000000000000000ffff05bdfd6c", "pubKeyOperator": "851714cd1c95b65af051e03d5bddebb8d1104799ed7b2ea358aaca610782f442078cbce76c72d19d6117ea4d052fb7e1", "votingAddress": "n4H76pZhebp7qv9kcTzMrQFAtKf", "isValid": true},{"proRegTxHash": "7a049ae38bbf8cbb4fcf41510f1fb6919e037e39f1694c5ff41502819dbe7d2f", "confirmedHash": "f50a3d1017b4c38182daa544d8681fc33f9872208b1995213e00000000000000", "service": "00000000000000000000ffff23aa22aa", "pubKeyOperator": "80dbc6f31d5a321f923573674bd814939a3b626f6caa5f6cecf673e134d34085df0b40500ff71c2ba5c8d7744ebd2085", "votingAddress": "4XTQVaR1aRcM2xiJ1iK3funxJxNa", "isValid": true},{"proRegTxHash": "b869c699d66ae547fcf1772c0bd41ac5bacf144f920031f6ec4eef11137cb488", "confirmedHash": "1947ae88fbe846bd9fa3006f1163ac6c54ed487588925ea60a00000000000000", "service": "00000000000000000000ffff5fb73462", "pubKeyOperator": "0204d226791d6ab3d8172782738515d8dda22e020223fee1bc3aa22247fca8bee37f6de5bf85f3b64227b967b76f2a88", "votingAddress": "RiiXDZxzvTLBKShqoSTs8nuMVhB", "isValid": true},{"proRegTxHash": "cecc935cd54c64fe01d56ec1198fd2bd833a3d9e02bc8644e3c103b5858ff99a", "confirmedHash": "77f3095d792e59f24f4bc6a02e8423a5aa4697f2ec4f6c343d00000000000000", "service": "00000000000000000000ffff330f7748", "pubKeyOperator": "05f565023c06cdfe0fdd7b3ab5d7ff8ec6c777ac8736341626449f6d12b7d219f99e1fb56edb7edc0bad97f7d0458c3d", "votingAddress": "4MEhpCinHNHw7YgWBRLK9kTcYF2V", "isValid": true},{"proRegTxHash": "05c23aa25894627e4681474a3eb214d0d37c26f3d8357e7095a77a8dbe90ab98", "confirmedHash": "af5afb3f440f561c2ed8cf8b32b4c1823ca3fbfec89a8cd11a00000000000000", "service": "00000000000000000000ffffb2803510", "pubKeyOperator": "178b023e26b90e620f993d1923acd84bcbe82afd5a6f4a65db073883a9d091e4573071aad5d0721cae04705531f6dac3", "votingAddress": "2W7Rc4B8EyJVBP8kG1wiFRho8dXi", "isValid": true},{"proRegTxHash": "e124ad8eb5d51b245592aa133b9fbc32884a5b46d4e155ffa52d82c459244129", "confirmedHash": "74a7e681f40c0ed3da984741bb702716e6e278b0ca94442c2800000000000000", "service": "00000000000000000000ffff52d315cc", "pubKeyOperator": "16d9c52c4c50b38210b4c82e336905c17642d0aac9057b6f21677caced7970e0be53dc073e6cf2afefe97dc66d2f95b0", "votingAddress": "2y6NacaupW55oYowTvK4AGoJr63r", "isValid": true},{"proRegTxHash": "11552020898a546f37b90db58904e01b60a7bc76bb9394db6c636731c0850541", "confirmedHash": "9aa964552c4c30bdbab604ce89ffdc18cc79ff3e74d898821b00000000000000", "service": "00000000000000000000ffff52d31514", "pubKeyOperator": "96661efd681f5f89f46ac2fd55d6fd38c15d14e924b5aad7992158e8920d79e43c08115ba1f266b4386e2e6796a5046e", "votingAddress": "3y6C8waDLdLtGU5c83Ajd2RtPZE6", "isValid": true},{"proRegTxHash": "b88814cfe6cea7e2bd160ac51448010cae37ef72fbd2052493e0fdd4779f42b4", "confirmedHash": "fe2af33d4f88298679cb3908eabfc19ff30bd907775b159a0100000000000000", "service": "00000000000000000000ffff52d3190a", "pubKeyOperator": "17c265f846d8d9d7a9a3f1d797b870a9d94f4bacd623e5e3c26fd606b321c469d29ec46a1d863cd4e718c68c1911b37f", "votingAddress": "315a9TnuC71oUzrvB7LkvJUFgNWU", "isValid": true},{"proRegTxHash": "85178945d6ff422046d70c985b5d826f22d3c84afdf0ca6459eb0adac5c0bb77", "confirmedHash": "c369a1236e61c70953bd5e1dcb4afaae595e42c2ffc6859b1900000000000000", "service": "00000000000000000000ffff923b2cc9", "pubKeyOperator": "19424018f8ff5048fe4efe1023daf185287f254a0d3c976481ff4a2a86eefa70f580ebaa58fea036b0be7d3c12056a7d", "votingAddress": "LmAFH4dBhGBihnzNNEM6GdMgqYZ", "isValid": true},{"proRegTxHash": "f1712bfb50eec7e262f4afbd888ca488337d14aaa58c6817625f98fc3a8b1ad6", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b095", "pubKeyOperator": "1090d8a95dc2c9ead7660ebdad5337079bf5411a0c12326da00dad4ac4df84205b79ec3e2519108b2f9fd51c43cdedcb", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "09c40d4664fa991af5c89e9d5322f7137204c55f5bb8464a1f7d9f60dd46a11f", "confirmedHash": "65a36180e423a120c1cf202b41c2ce7727011285c9939c3d1a00000000000000", "service": "00000000000000000000ffff9f41cfc4", "pubKeyOperator": "824fb68c3d8268c335884368934dfef6969f79ee93bbf7d575a37812c9e5a014f02513f9e9bbae3fee5283e9363d0e38", "votingAddress": "25bCqeJ79hUJkvmmHv77jpUwMrRg", "isValid": true},{"proRegTxHash": "234be551866460864d3ea51da153ea3fc429f399b6d264348045486b4f05d753", "confirmedHash": "1b8a8b5d08ce8573533cf0daa68dba0afc5ecea9a64889a91700000000000000", "service": "00000000000000000000ffff55d1f19c", "pubKeyOperator": "954c04a289aa412f6b7d3a8781a50d48f2934cf8760d790467ff7b6ecc3eef00cec715e0103624a2eae2df251f5ff668", "votingAddress": "44kCheK1vyMoFHha1uiFxTUKGrum", "isValid": true},{"proRegTxHash": "a6a6aee8032b309ea9bfc960ea71788c8b5252e536a8e980c6eb74576de8a0bf", "confirmedHash": "b3de7eebefb5a598ca5ddb8c12f9c94bc6bcd728ce7aa0b40c00000000000000", "service": "00000000000000000000ffff8e5ddd8b", "pubKeyOperator": "93b19253ddb9d5f245be4551a39d51f4fc71e6653048e7a3dbb32896bf47460bb6621ac2133b7013cfd345b7fbe8e37e", "votingAddress": "4WzEzjX7eqYGy2xi6hphqbv7F61g", "isValid": true},{"proRegTxHash": "9fe122c80c3a529dc7c4722d871bb7cdd604f285dc4099b1075ad37ef3c662ca", "confirmedHash": "082ad0c1623b5b4f767158ef626336363e711175b7a491f30c00000000000000", "service": "00000000000000000000ffff55d1f1f6", "pubKeyOperator": "99dfb7ab2b00f53ffd983fd94aeedcbece6a6ed7e8b38c37d6cee200c32460c3d3ed3f0a5ae5e8e2c80326f001bc5af8", "votingAddress": "4TnXw1U8XWSgFC26Z936qmLvQQwH", "isValid": false},{"proRegTxHash": "557d688df6137e09196a02e645ad009b7023359980e0d4ffa62915740dc3f870", "confirmedHash": "a8b4104818ad25efbc50f0baa441a38707e40b8296217c270500000000000000", "service": "00000000000000000000ffffbc28fbd2", "pubKeyOperator": "806fa2fbdd4418265063e4ca1e273792a365ddb4c382ddc1445afdfa29e702a3adc5b600a8d4f013448915e054a84ddc", "votingAddress": "3F69KuoPwkBkfWtrRd2LqLEwst1b", "isValid": true},{"proRegTxHash": "2c8f34de6e4dab43606d4c57883ea99ff02f1906a1156d1998b24b57d6e6b3d3", "confirmedHash": "dae21056be7be38f03f3c8df1f9b0302e2fa891d4a26b0121800000000000000", "service": "00000000000000000000ffff592807ed", "pubKeyOperator": "177abacd7dd6e9c8c04925a64678d9a8ff0b073c825fc245f7627f43f1004a7f9a341167826d562a1766358ef98e0868", "votingAddress": "ePqNoUi96L5DCdfGTpbdwGSTc4y", "isValid": false},{"proRegTxHash": "78e92a46edc47563f7c44c9b4f38d6fae76c8aa578a04b88c118447c36c90d73", "confirmedHash": "06a2867e36d150643de89d87c53c9b6b9c6a195f78ed8a580500000000000000", "service": "00000000000000000000ffff52d319d5", "pubKeyOperator": "09ba528c79d06a9eb2adbd40a993315c3defcb11984ed6e2b880f4059f7704d21db555679eb7a7205662bddc0f2316e8", "votingAddress": "2UotFMjsRXL988mvijs2mYuUknrq", "isValid": true},{"proRegTxHash": "d8f288f702d13fdb9700836a8963ee9666e32dbf4f048b78b8e5997f47ad0e3c", "confirmedHash": "594c4e3838f0803bf2cd42508c3be3d4ddbb80f2d3bc7b590e00000000000000", "service": "00000000000000000000ffff52d3152b", "pubKeyOperator": "87dc22aa27b97cb4fe4d165ddb9c6ffb7505051f264714a12172018bfbef94ec272609526042be27a91d467802dec9f1", "votingAddress": "3PQgpKZ6FsLB4ida4t9GFgmhxK2c", "isValid": true},{"proRegTxHash": "afe31d208168450af622c0ce07eddc7437e0a950363ddf9f197ec1308edbf352", "confirmedHash": "dae21056be7be38f03f3c8df1f9b0302e2fa891d4a26b0121800000000000000", "service": "00000000000000000000ffff3e4d9c39", "pubKeyOperator": "99dfdb50df039dc411ecf477a7f49af1c02fb90326dd8463951ced0e637483fb54d4d6fb4af07e8b8e2c4b781575ed71", "votingAddress": "3U5Faay3vkM4pr9yP5bn8a4LHGij", "isValid": false},{"proRegTxHash": "989c54acab2c9b212ae13e35f7556faf69b7b9ee65d5e5c62c4fc0fc8b2403f8", "confirmedHash": "140755755e345fa96a67a6b0ff4446c01b665529fe77657f1e00000000000000", "service": "00000000000000000000ffffa516ed13", "pubKeyOperator": "8799297b722648d3c661019f00ccfb30ff9aa83dd6f0de703acc03296a0682252c1a99f0b3ca56abf812dc4e52e57bcc", "votingAddress": "3AiCpv2o1xPsmzBhpxfNjwHzaWGr", "isValid": true},{"proRegTxHash": "abe594953072b4368d00f85f58c7ece3ca8393456fd0ee04dbb366a3c9d140b3", "confirmedHash": "b57ce736dade8b7062f0ed4ad64aa92e5bbe20f726d419350300000000000000", "service": "00000000000000000000ffff6ca08a65", "pubKeyOperator": "839753cb42c43ec8dfb379e251d8579cf394c0952017f27a87a1395caf152355bfbb1cbbb531938fabed9ce61864664c", "votingAddress": "2ByACsiWuPvRsio5rpW1CfDbLAP3", "isValid": true},{"proRegTxHash": "d3c630825058f15faa2b6ce80d35ba20147cd8c92f6af7ee8fc87c9a0fab4009", "confirmedHash": "60d3af83b270df45686cdbcc85fb7a23d6982bdd7c0e7fa35400000000000000", "service": "00000000000000000000ffff52d3195a", "pubKeyOperator": "80d722388521768129bcc20f0a719f603233687d2f3acc6d1833dc0c25931a33d3b3172bd8290a91d942a1be409834a8", "votingAddress": "42dEPtpXcFNw1qEQ6yTwyJpPjUHp", "isValid": true},{"proRegTxHash": "d4d7ec19f732e7dc00bb6985e6ae443d7db398a644d984917d6126df50873594", "confirmedHash": "fbe9ae692745c865725846a2029f892e2135b7198c21c6fd0c00000000000000", "service": "00000000000000000000ffff05a12fd9", "pubKeyOperator": "001ac7cf76780938030a8ab5cf66b59bc1081cd2b2e6040455ebf689d8b0313817ea6952fc9deaaa5eaabe10bd8c8c0f", "votingAddress": "26b3ApAiacmMMmtQsgBXNT2A8zn1", "isValid": false},{"proRegTxHash": "38a28945909dcde396d94dc513c2000620c33a22b83324b3d7f61522ef69006c", "confirmedHash": "970dd37ccec228dff3134a8937c55ce3d6865aa39d22f7d10f00000000000000", "service": "00000000000000000000ffffb90537bf", "pubKeyOperator": "9695958cbef0a37619497480fdc235d74c9b8dc8408a686ecc9ef310ad0a5572a41a6b3731db34b74541727dd54094bb", "votingAddress": "3No96rKS9y9VpRvjmXWPzaof3afr", "isValid": true},{"proRegTxHash": "d646be72c4897e815b637290e562cb6524a6440831c36c1b5a7438eb06bbad12", "confirmedHash": "43b3caf59cbc5331ce20c7c1be57c84ded106d611d049e4f0000000000000000", "service": "00000000000000000000ffffb07b39df", "pubKeyOperator": "8c8d4b34b91f90ed0d562eb4a504960693cb647148ec5961642d14d4037eafe2afa8450ab66e5b173361615a163e80cb", "votingAddress": "CsnFEiVzaQqDqKzkFyE6qjLV7aa", "isValid": true},{"proRegTxHash": "30487646fd015fd7157d1f2c8c3a5aa3f62b928955e2288273c8ca928cdef65d", "confirmedHash": "b1f1f2deac554d901442ea4a38c60e2f5384e3564330fc971a00000000000000", "service": "00000000000000000000ffff52d31959", "pubKeyOperator": "1812622fc6dbdf5993bef522c5f4444c066a423f1bd51e17d5099b2745513ae6fd31de968640aa719167a117eddc705d", "votingAddress": "2WvTz9N5LRZnfZZeWyf7hBDk7QmE", "isValid": true},{"proRegTxHash": "73f65b52ce68db79a9a2f0db5560edb6915e151cddfc5ad366500937cd268ecb", "confirmedHash": "a698aaa06fe7a363ec0640a853b189470209949734fbb8ce0200000000000000", "service": "00000000000000000000ffff55d1f28c", "pubKeyOperator": "176448aa25c1887acd0871c6865b48b873b7aa531956da2b83f6d4305d063cb94898e7ce21da3e252a404a2033d46a2c", "votingAddress": "NJQfk4tpmWFMRahuZwFcQL5X5gL", "isValid": false},{"proRegTxHash": "4df7f04aef9575163e1f363e5328077712e99c44c5fac283b8d7e0b585ed77a9", "confirmedHash": "93753db7416691038cf0b54cba7b358c1a31d993a50535780f00000000000000", "service": "00000000000000000000ffff6c3dd0f4", "pubKeyOperator": "05549383e8bd3d933e3a79ba2e7ad7bcda18b4892b658981fb962db3a199ffffe755c376ab3a45224b7012a9c63500fe", "votingAddress": "44WfctG4wXWiTnSzXVSFin5Y4p76", "isValid": true},{"proRegTxHash": "477600635ce933615e90d11cdfdc6bd2bd6f4ff91a4eac63993496aaf22743d3", "confirmedHash": "472cd18877dea3dbc8531c5520ba6a6eaee9365e80e30ffd1600000000000000", "service": "00000000000000000000ffff2d5575bc", "pubKeyOperator": "8c98f23812ae5da3eeac73ee1c4384c68a755da6e25a4fc9b9562bcae4a5a6e9cab8a8a5c3e379039f5aae0804f954f3", "votingAddress": "47eGfbFpPV1b1yGGVZ4A3C8JTp2Q", "isValid": true},{"proRegTxHash": "2d6d924f91427790d0b2a384ffe8fcba5d2edde1c8f5255752f1df06ccfaf21e", "confirmedHash": "a05541ef5b20985b98e1e66349f3caf78f7c79b0cb74e9331100000000000000", "service": "00000000000000000000ffff6b15756a", "pubKeyOperator": "990dc65b7d5abf15198115be73aa298abc88b692b3705ebcd76dd5ec1c233de071ff8f2c803491f4dfa4a3bd8975aeb7", "votingAddress": "4ZPSX6qm64j2n7J7bPvrkmyQx6pA", "isValid": false},{"proRegTxHash": "9b425b58404fba41d0a3db0b72fbf758bee60a979867b6ca31fa0baa7c014bd0", "confirmedHash": "db73240a45b9a9b1453d810559a5835c46da0a193f7857c90400000000000000", "service": "00000000000000000000ffff0351118a", "pubKeyOperator": "18a4067bf12b74a1bba8c79d36c558df418a24edf087911e84abd161df1b5e759fd921bf4498f7853aa6dac1ad9b3703", "votingAddress": "2NFqmkhKv6v9KwRJkmDqLnNJJHx7", "isValid": false},{"proRegTxHash": "37c96efc20bee7ccecfc4a33d06290aa7c20411f930563c5cad666de778ec341", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b019", "pubKeyOperator": "93d82f1b54c7f375f2017da5e0b2c95851a3d60fdf0b7f72852f7cf25d5ed9b7a248055c622bfde0c5c32b42d802aa03", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "81c47eb6324036423bbf3ccebb00419e272120b748aff344e55b4b490b640bf1", "confirmedHash": "f8350e888f0346892bb90cdf45ad9793dd7355fc487a085c2400000000000000", "service": "00000000000000000000ffffbca6df1a", "pubKeyOperator": "153ebb7ddcd0bc70cda811cdc5fb7c4039b8f60fc9924844d8ec33db42a43223c320e9ef1cae1d53079f21ae7a29246b", "votingAddress": "RQxKnJZvpmNVZMfv2KJUM7umLWe", "isValid": true},{"proRegTxHash": "895ad69362288fae469eb055cfef8ee0c4ac4c680213cc138cb8129e7a0bfaab", "confirmedHash": "fe262375a8ceddfd2d764b03895f7a14c0f42124a8a330550000000000000000", "service": "00000000000000000000ffffbc2815ee", "pubKeyOperator": "9211f013c78cb6b321a442bf8cc95dc3b924c2d0d94948b9939d6611e030ffc496e5fd72c61ea5070691ddda217eae81", "votingAddress": "wtkGXxXNUwUa8gXzCdTZHShABfG", "isValid": true},{"proRegTxHash": "38ab2892419be545ea5070e11be3205ed0eb89deed44e3eb408bf84b7c494a54", "confirmedHash": "cfe210da8d7c3a5801390e79cc2f54382d291b89b5e8a32e1300000000000000", "service": "00000000000000000000ffffbc28be2b", "pubKeyOperator": "8903dabc4479bb21338a1911214830ac243924bc36768408e904b271c1edb9c09b610dee78f611672ed4c29043870d92", "votingAddress": "2119hFnggDnxrmavXuMe45zhaaRs", "isValid": true},{"proRegTxHash": "13e1710cda6005405794086fa1facf0cc0fe3a15331949779f2842f6d74d2963", "confirmedHash": "6789e3816f655bb354fbf6e43eaf81d33fe1f6b41839eb6c1300000000000000", "service": "00000000000000000000ffffa877578c", "pubKeyOperator": "03bb5c3564a9b5504b00433df5a89f0fa75d11a19e38197243b7e2afd7708405d0df79db0932c7fe6ba0a85421cea746", "votingAddress": "NTTSWkbpJzsdjpokEJjJhT34GBo", "isValid": true},{"proRegTxHash": "ed2545b179e4fb38f30e34b5b3dcfc4c5f3618f28ac1fe0999d43875fc48e7ed", "confirmedHash": "017ae7aad0dae9f32308d6bc490b574a4f4b78e92cbbd7910300000000000000", "service": "00000000000000000000ffffa5e326c7", "pubKeyOperator": "17beeb816b4793e3606dda013173200b8510c58e10512fdf4a38e33e3e5c4c64ba0fcc7af7eecc17b0b269c96e529da2", "votingAddress": "3JyLG8SvjpSRt2ApvNPktNFppjsV", "isValid": true},{"proRegTxHash": "cc18cc2401fde0b48d6e8a5530cfd9862c3a5018a995d476afd28a132033b035", "confirmedHash": "a5cf64211fd985673275a3cbc3f967b932898aded5bb864e0500000000000000", "service": "00000000000000000000ffff3e4d9e52", "pubKeyOperator": "93452568f14dcf1abdbf93c22ca2e9b6165777e073759af06dadd2a7bd3efbb3ef9a4c50fe58167625a17892a9a982b4", "votingAddress": "eVUF1AaG4CBecpXzb4PgL4quA77", "isValid": false},{"proRegTxHash": "8f60a775f1e59d7c73bdae09f70349b82aba15182c4617f5caac77190de0438b", "confirmedHash": "b60c2dbbb213c99a236e1f30c1d9f41b204f0b13b294c83d3300000000000000", "service": "00000000000000000000ffff52d3191f", "pubKeyOperator": "8fe70eee8a7fae6b612a623b32546bb746132c3b23c637e7d5a1989de5a4b053caa89ba6e1300477db9e2edb8ec2ae00", "votingAddress": "33XapapWBKuH2ng8cLMH7t8dUxEH", "isValid": true},{"proRegTxHash": "af04d2118c16c099a106abac9d8d83419a4b3439f5db317e0a978e86a44e5717", "confirmedHash": "fe79c6d2d1fd1c9311b52cd016f4869e644ebbd97a3ac0281200000000000000", "service": "00000000000000000000ffffc21ad5b8", "pubKeyOperator": "0b1e2e53a8a0a36cd78e93cf2cdb49cf92375c6ccb237684077e324e6f0ae9da7e12f7651f87a6b4b6caaf9657ae40e1", "votingAddress": "33R5CCQkj31Gx8chdJi3RHLU28C7", "isValid": true},{"proRegTxHash": "ea406ffd6a80c3f0d2e3155d030f0011377656242b56ba56f36a1d77b8ceefb6", "confirmedHash": "ac360859fa152178d0e8238e84f2f0be65837dbed66323870a00000000000000", "service": "00000000000000000000ffff923b0409", "pubKeyOperator": "161fb8a5a9aaca5ed98709c999821e5a410d287cdf0db5f8252ebc7617fec5e6e1a98d669ccaf35f0e977eedc476e0f9", "votingAddress": "4UKEk2XEiCBU1CfUWB6S7hMEUiEN", "isValid": true},{"proRegTxHash": "cb6b71eb671387010f3122e247e38d2ab52ea478ce644f1349bf488d981471ad", "confirmedHash": "ff5fb29092b815ec1f6d114249771c3b48ba38e11985689e1200000000000000", "service": "00000000000000000000ffff4f8fbad0", "pubKeyOperator": "01d61b00bd6fca019b88b00633a26f604eeec2667678b4d6e376185d25d6584dc9ae16e5d6d8a51de16962a3d5535b82", "votingAddress": "AedU87poZMiXAVLKkC9WGvMpVVt", "isValid": true},{"proRegTxHash": "ca2aea143c4545cc693fc8a415361250631e16f6480942aa818ea25fc1f93954", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b07d", "pubKeyOperator": "059b8668350928d46a04b6923c0c9e3ac75db756cc7e8511d439000f55b007d05f45e9a44ce870ed893a1ff7b85b70be", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "0ddb9f078a34ecf7e801538b8e80309c48cc1ef7c528c5c461f2effceca53717", "confirmedHash": "4eb4f58132a52da7cde38ecf8524e97bb1d7b783ff5991870e00000000000000", "service": "00000000000000000000ffff17a3002d", "pubKeyOperator": "81e54db3f12baf6018ed8252548bf6e775ef0cc5ad5ab937969fb5191e80aec2cc4bc5fcc965f8a20e5084f89bb37471", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "d5682f1cd0cfc6c17e29618c08b00cbc61362518ecf6f963693bab6b38ace6ea", "confirmedHash": "960cffe0dd7c1e3710e3804bbd1acab302ef47ef4928be221e00000000000000", "service": "00000000000000000000ffff52d315b2", "pubKeyOperator": "0e174ae474071ca7d9bcd0f8f1d011e82a59639faf2db95232e07c48ddb04885a1239135e90be5f640dc149d07798ccb", "votingAddress": "G4FMntMPegQa9KNfz5C2GTN1E31", "isValid": true},{"proRegTxHash": "35bb7d5303f662af0a416d0cbd279934d7e482ce707e0d4a2b934a970b6e048c", "confirmedHash": "f171b075fa0d685c76e09c14c8d96e929398f606fa92cc8a2200000000000000", "service": "00000000000000000000ffffa45cfc1c", "pubKeyOperator": "054224f48fa7f21f704e90c19d80c8a09dbe47ec7317adccd4ac0c662854d6f02944a2f6d3f72923c20772bcea693fa0", "votingAddress": "2NHszy4MNjL3ao7cAmXJaR6hoCaL", "isValid": true},{"proRegTxHash": "8688f74bf4b062026ef582f782857bb2a8b4eb38a14cd2873bd19db911e6703f", "confirmedHash": "fa1cccb7c38aa6459fa8c29fb93bf1d98078e59c10f97c340500000000000000", "service": "00000000000000000000ffffb9b13b8c", "pubKeyOperator": "041e5a1ca47fbf5f9856f2f2efee10c30945cdfba0dc88f54bd66f76e9bcf0c184386aba43af0a9401e0e5593c54f23b", "votingAddress": "K633jMz2n3AjBYFT1a87Xj2GAyp", "isValid": false},{"proRegTxHash": "6f993e0dd1bc9872b187611b919f60677f191d634c67273b180671f7c6c5de72", "confirmedHash": "44135898509247d993f87776845488436c9059d11ffe2b7d2000000000000000", "service": "00000000000000000000ffff9ef7d42c", "pubKeyOperator": "14fce0abdda962b6064c7475470823fc7e5691ab84af61efc8d7f4c2080f13ea11aef56e97e3641018c8277239af9fe1", "votingAddress": "4GD2g6QndHScLCn5wQVGuy5idxuS", "isValid": true},{"proRegTxHash": "cab5330dc49f86894d520e309cf3f0a7eb0ba95109b866dae5a531da1fbea8a7", "confirmedHash": "404dbf511466b89c10f74f35cf3f256609b823575faacfc30400000000000000", "service": "00000000000000000000ffffb280e5df", "pubKeyOperator": "8ebb6779f0a66b5cdf74bd15996ec1c44c571d34626775ca47499f24e2f670c9aa274a7868d28178b1e435c4964f4dec", "votingAddress": "DUXKcD7EkqsEj3ULyqymUxeiJKX", "isValid": true},{"proRegTxHash": "0c56e0cda79ab0094c357d770f769a472742d0485d1dd76d6d8dfac11c8eb346", "confirmedHash": "aa02064b08b769543561db6f878b4c803afead5cc23b5e030500000000000000", "service": "00000000000000000000ffff68f82e5d", "pubKeyOperator": "93522ca61f9e798f88882916f8b1b99da01265a7a1d799ceb471cb9b4f9c4a30dfb34b4bee045ec0b7b7c9635d11fca7", "votingAddress": "v3D8VBySJDhSSrdhiPKKbm9ACNz", "isValid": true},{"proRegTxHash": "5d4fe9ada415f186eb8d1a37ec2245bc8a35190d2b8d830cc156c9c1e034a1bd", "confirmedHash": "4399b5c07e5d328f142914b88505f53720fe01a31bed65710d00000000000000", "service": "00000000000000000000ffff32743bb1", "pubKeyOperator": "05ee10590f161bb6d794cff8d1a3aeab2dfb620fbd74643a7131176471e8e70b140cb0abe43b7bc5ed32c158d34361d5", "votingAddress": "bAgjET7u16RUdp3v2P8joGq4XEu", "isValid": true},{"proRegTxHash": "ec737e982094df09bc855a38845911f5b646e903b438fe7a80aeb64c317160f1", "confirmedHash": "897f1ce3b4576b5464fb0a582fdb33629d74304749fdc0f11300000000000000", "service": "00000000000000000000ffff334fa0c5", "pubKeyOperator": "0cfd80714557c74a3b35dbf381d1f33f2591f70990a943a938b2145fde597894338c80343a8fc93d92f69bb234d92bda", "votingAddress": "4F57SWVN3edBwo7MNH5HYzHwQMNo", "isValid": true},{"proRegTxHash": "07c8977a41dd7cdfa198a9e69e071b79966a544ded14ac33f9ccc21063bbde00", "confirmedHash": "f191aa2b95dfeec165c3111cd3b6edb1c76c4e5b24e606810900000000000000", "service": "00000000000000000000ffffa2134aa2", "pubKeyOperator": "0f7715b39eb2fdb6313bf9afb999c87645ff17da5125abc79e067ae7348dbf680a712aa59cef1d095de95f4a038d46af", "votingAddress": "2V3vpGVHqAuNpXbfDTV7nPDv9EWx", "isValid": true},{"proRegTxHash": "26cddc701d68450348b9ba70b28f74aefc95a20cd9ee262392c874844eeff4c1", "confirmedHash": "010c9b822686caa1f84f025bc0341f3d011191ad3e7c03020500000000000000", "service": "00000000000000000000ffffbc28af49", "pubKeyOperator": "19c6118dd36a17c3a101bdde49c633a91bc4e9540385ba413c454f70f87882a22ee2882491d948cfd1db7d7a60bc05b5", "votingAddress": "th2wpRYM4MeLPWTaocnd6At3Hj3", "isValid": true},{"proRegTxHash": "8ca0958c7045f6882846b345d6a0269a85ad02f90d9f672d2ac085d613ba8121", "confirmedHash": "d5295d23cd670217f43ba10230cd797116e0e2a5c5c0f6821f00000000000000", "service": "00000000000000000000ffff55d1f1a3", "pubKeyOperator": "936f163e37740943c0f01f7a14745610198b954c0cb51d6e460e0c05cd5a9fd5b5b0217d08e9567606a5ada2f419be08", "votingAddress": "2bCKusV7Q1ksNufkjEK933yvZa5J", "isValid": true},{"proRegTxHash": "0dbecb4459113baa1b9971f7058abb70596d9ba384dff161c8b70bc2b4111dcd", "confirmedHash": "d04a1be7c69eec88a22c4458a72abc903eaeced72523a83b1e00000000000000", "service": "00000000000000000000ffff867a6edc", "pubKeyOperator": "0079209cbcf3d3b198263250078c15ad7e6a95bbd90b0c0e31d49e8e1aaa2fb0afab9ce6e92a83e6de31bfe98f15f7bf", "votingAddress": "yvKdU9zJwqhsRYjABL36ZJqwmQJ", "isValid": true},{"proRegTxHash": "691817c8f9a11b151a1945229488d1c3eb5252f637e0759e1468aa6261c2d8be", "confirmedHash": "a635fac4fcc7c553d6cd0669946f0f67c9df69f02882d4d50700000000000000", "service": "00000000000000000000ffff5fd8542c", "pubKeyOperator": "1939ccb4f0796aa234a1f41422fd1fb1b5686628e00bce0fccb15cf643d050babe1761c2151b663b0ab1e4db9bf08cdb", "votingAddress": "347UoQmVhBKQqx8Kk1TcEAZzjDy3", "isValid": true},{"proRegTxHash": "bc5cbd52946dd5c58a699fd216898843c703d09e059ab23ffed30a0c0b83dc85", "confirmedHash": "f7a944841e2a2b5f62155d7a06d60ecb4648ba34eb8956cb1000000000000000", "service": "00000000000000000000ffff55d1f1b1", "pubKeyOperator": "944ef056f6c3a6bf344e385cd9ac47ccf1de5a5484698ba21a9e63a26187ee63d328fd1b634f537dbbc51773fe640507", "votingAddress": "tasGW6U9zyTRfGAzS4MCRMDSJZk", "isValid": true},{"proRegTxHash": "9484bef462f86954f6bf2e2d3f947140ff6a691837a4fabaf030aed2fbad7916", "confirmedHash": "1cd0219c8a36c16f5a05a55a629daf2901a42fa7e56a67bd1400000000000000", "service": "00000000000000000000ffff52d315a7", "pubKeyOperator": "1380a4dd89332d2bad342f59e0237ee470a9444e5a30567ce72ca61838acedefd9a19eaccfa0c619c554e9dfab961025", "votingAddress": "34C3u1C66Liwgp8gG6Ryhe1SCK8y", "isValid": true},{"proRegTxHash": "4f87cead03be560bce6bc3234b4df8ce08d043478ad97bc8f21515d13e0bf759", "confirmedHash": "01c48032ce79abbfeb1073329aaa7b52263e03f34f560e320600000000000000", "service": "00000000000000000000ffff9de67e25", "pubKeyOperator": "8040c2817cc954d06a4e0a11cfb891983794a62e7a324ce94188519e34ceb4a38a34d1305d5e65af6cc31787009763ca", "votingAddress": "3mD5ev4THXgC2rQKzpfPqMEpRyrd", "isValid": true},{"proRegTxHash": "a26f38e92a836492ef8062d7a8de67bf28cfc3304bbf6657e2d64d6734938f41", "confirmedHash": "5cf7d640b2280726bda19427ecfd76dc8e3288148a1c560a1900000000000000", "service": "00000000000000000000ffffd418648c", "pubKeyOperator": "962142b0a228abd3bbed3200a92476b110e59cf0e91c03be79c92203a31cb5b956a197326e14e61e6d69599e9153677c", "votingAddress": "2nwb9wXmpvykvGk6FcM7zUq142dr", "isValid": true},{"proRegTxHash": "980b84a92b3040f09da8c367f6043cd8d837a089eb9a8b97bd1e0ad98d568bf3", "confirmedHash": "a1e3df211d2c222ffdbb57c832f9aba4da95ef4a8d4580de3600000000000000", "service": "00000000000000000000ffff5fb39673", "pubKeyOperator": "92420af924128bb343d7ec9e8e0eb1840af2004b89e6c00cc00a78c6beebe134b441f0a2617d8595e6ca58ca73dbd397", "votingAddress": "KY1penZG3VDSZtSFWxzu23XvUUp", "isValid": false},{"proRegTxHash": "a13f8d54102bcc54c0e1b4d83c887e05bc384089a552a9492928533bee94dd82", "confirmedHash": "d08e629e93616e373ee7e1fa30725c6617dc3c6caa7287200700000000000000", "service": "00000000000000000000ffffbc28b48c", "pubKeyOperator": "9650065c969636f1f2f6bb45f09d31d8adb574883480a9e0e6f7ce58090d9655265ace70271714ff9639a251d79978d7", "votingAddress": "M2jSk3sFp2Wd3eRmJoGvRmKYkC2", "isValid": true},{"proRegTxHash": "0388e087d8690c9225dfe588307c1acbf1bdfbec61efddb08a3e9e4253abf694", "confirmedHash": "0dfe8ac685e2609de0c83996e9e10eb4cfd57090854bca980f00000000000000", "service": "00000000000000000000ffff55d1f1cc", "pubKeyOperator": "929bac089e6ae093ed726ed8dea16ce4b9428b119cdbedbccbfe7b6b6072460e804b07470ee60fa2cbd8c9140a310489", "votingAddress": "4GjtsLDDAErz6dfPwkuWoYPe1xY1", "isValid": true},{"proRegTxHash": "df431c1016a6621879832429f3d918b5e54668fcc4c88233ebf3b18d1e3018cf", "confirmedHash": "75650ba533e1ecccf81735b8c1aca5e527fd9d879a93d10f2300000000000000", "service": "00000000000000000000ffff2d4f28ec", "pubKeyOperator": "92dd3cf9a853022f4ca75df77c19d8ebe41f5159c912582b1ad3c9116f739b87eb84c8e2bfb4aacb34304606c96a69a9", "votingAddress": "4Y8p2vHVW3Z3esaprTqWsXJXZT3J", "isValid": true},{"proRegTxHash": "1a7c458b7d80a9ec3c32bc7bffb206889f5a7b21f00b35668d1f84d0e1b44cf2", "confirmedHash": "8a032333dadb2c9fdf1edcc3689c2a30e3f59c51f8ce97db2d00000000000000", "service": "00000000000000000000ffffb98d1b78", "pubKeyOperator": "980db8f86070ef2727d3de86604e0e3b01b5e66bc9a503cd9b9babf305fbbef7325d9a78fe80df702093aba23b48b485", "votingAddress": "tL8uqmrCHjEwnujw5BRMvuqZfQu", "isValid": false},{"proRegTxHash": "d8c7f48cf188c2bd5efb018442078ef1c584fd5f98fcaef029765dc936f18689", "confirmedHash": "c8de078a0c3365b251d3ae316158cf54798142de866eeb091b00000000000000", "service": "00000000000000000000ffffadc7463e", "pubKeyOperator": "918ca940fbc37718a6243eb5e2d7f6f92bb68f2c8ea8fc02fda810c6b4ea56813008735d4c3331a7210b82706f1e044b", "votingAddress": "2JT14M6WXkoyuEimAjTHVyDrpNRu", "isValid": true},{"proRegTxHash": "68a21d8478560ef5974d8b741122048d088cb7f5e35cbdea216ede8e564ae09d", "confirmedHash": "022af49a799b22889f1efde8bdb2806eef331922f7e201341d00000000000000", "service": "00000000000000000000ffff2d4c7410", "pubKeyOperator": "8aab605d32ba63fddedd6270a22578c742161150614885d8683c482241d475eb35e3ccc8c09d94ae455c1abee9a323f1", "votingAddress": "3235G613GnAHi89XU543KeEdCa1G", "isValid": true},{"proRegTxHash": "2ef4f886fdd55531a8d4d9a83849421c5394542f56a7845dc4fb9a976664e2ee", "confirmedHash": "9edc5e94b4fa57db636dd8b84f3f66ab7cec441bb7067bee2800000000000000", "service": "00000000000000000000ffff89dc26ff", "pubKeyOperator": "038bff1c246dabd21aa23e9de411228a89490797e70f9b7dcf331d82131018483db2976d6cffc2e3a08e696e79da50e5", "votingAddress": "8zDZsoX9JqEEUQ6gEReNbHc6Can", "isValid": true},{"proRegTxHash": "78f3de19c9f76fb85806597fd1cfc5b2c6600e762256c2b9d6bebad2bf488410", "confirmedHash": "60e0f3fdcbc47cd038384cc747e163d00ad92e094b2ca9712200000000000000", "service": "00000000000000000000ffff52d315b7", "pubKeyOperator": "0756859f4ea8be341328f411b2e16926cbdf96648fa7cab5eb8ba662d6d58d917fc7688c1d9147e2390d5349b9604ace", "votingAddress": "2n35LUJ5w8txrffbH11UNh6LMENG", "isValid": true},{"proRegTxHash": "4c8df8744a5b36d7c27fa9557daf83d8152282ec7b09a1354fba8a7646d4b292", "confirmedHash": "768528a01a34bbb7753b9fd0cc306f1b35e58f2b95a3cb320900000000000000", "service": "00000000000000000000ffffd1faef06", "pubKeyOperator": "152bab1c91e931e71955ecafc575b4da99cc33a6a083897d248df6e31a6c1faa70e2d8ae46eca4ae24e1ff45d01a8a08", "votingAddress": "3qGn3ahfxHcFZFWecv4oMjdfKN3x", "isValid": true},{"proRegTxHash": "0548683deffa2eb73c033c6c3e270d9de5aa2bb85d48a285de8e5ada75da304b", "confirmedHash": "443d2e9ab3ae8b7d538742a7f82992f122493f9cc50b299a0e00000000000000", "service": "00000000000000000000ffff8ac58f76", "pubKeyOperator": "0640d61191882c85979d766591ac97bc9b5088047c038be377c81f641fb23fc72bf8046fdc6d8be8eb870dbf42e72ec5", "votingAddress": "3Qkn9iG2Yz3ShGSoinJ1y6GYeQVp", "isValid": false},{"proRegTxHash": "acd3bfaf36079afddc4fc76db0a763f52f9c3b51fd41f70e09497ca56978a99d", "confirmedHash": "48d5c668bac6bbb02657a2b36c0b295c347875ffc2a9da8e0600000000000000", "service": "00000000000000000000ffffbc28fbc9", "pubKeyOperator": "0e65e278edac9039f5ef053680a9caf350bbd328f4499891ec68249efdbcc88b04190ac01c7d1a9e638ef3bdb859c8a7", "votingAddress": "4Moz2egUZQttwT5KGmTvFDRQkrei", "isValid": true},{"proRegTxHash": "be4d7d930d8198cae06cce719cd4d92beeafc454f3a169ad4487f7031e80ee99", "confirmedHash": "6b0b7096147be77aeb538b83ca7bfedea24969c7bbe80a271400000000000000", "service": "00000000000000000000ffff52d3151a", "pubKeyOperator": "911ef413183ef903a6ad5b0d5b1e5a7f0379ba605ae82cf0f673585f2ddef56bcb71068adf03a2bcf5ffdf89f9f117ca", "votingAddress": "3imKeQZfBJNYnBy2XEjSsqwLbG2s", "isValid": true},{"proRegTxHash": "e0a79e515e81649ca00a611f312a910a2549641b81e822066c5547ce989f9e47", "confirmedHash": "45ef0e702694413e4cd9866ccfc6fc30ab9083d16aa2f9e90c00000000000000", "service": "00000000000000000000ffffc6391be3", "pubKeyOperator": "0300512df5ac6907be59d8da5747c859f4586270c8ebdc5211245b728b31cded85620de69585ecb3a498d819b4a4b584", "votingAddress": "47KNg4tMmpyWfsX66UAkwqKQMLFu", "isValid": false},{"proRegTxHash": "e91fd24147bc1feacffda170ee37a35107c9a26c7c452bfbd36b62d6e1d6d578", "confirmedHash": "c871e716d4c992edded6a86eb35386c8664cc7b48a3245e33000000000000000", "service": "00000000000000000000ffff87b50fe5", "pubKeyOperator": "944cf7a45e0b80f63fc11f27c36dec1761de34f49909eab615bc775c3def78e136c5ebd65dba281c1e786eb05f3efd98", "votingAddress": "3zcnKN8spAstrXB3PP7o7k3mhFsh", "isValid": true},{"proRegTxHash": "10f2d3f299fea0ff89c624c77d1859ed3c3c4b87c94e6ef02bab9be5995e1a63", "confirmedHash": "f1b2db2b3f20ffc495763ad9e6f4a2a4205a85e5d5d5f5601400000000000000", "service": "00000000000000000000ffffbc28b6d5", "pubKeyOperator": "0db0e782170cd410e7968d78f31d5fdf92d7eebf3624b30e6f69f8a84907d68a1020081c4218a42e618a1bd85e768326", "votingAddress": "26awJktMsBz6vnmNySGmwBUovBRn", "isValid": true},{"proRegTxHash": "0b1a26f470ac553f9ae28bc4b175623d1d8dd44c52e0e6a4fe50745914607969", "confirmedHash": "58cd7037925233266e3829872e1b0f5dbc07207c9910e7d60e00000000000000", "service": "00000000000000000000ffffc0b85a59", "pubKeyOperator": "9441048591ec12d10ac463fb86f9778f79365d06058471ef8239cd20282b754b3f4be8c594dc7341c07a72bed6841a3e", "votingAddress": "3Zf7AmWzY33he7bak9cdTq4DUUJQ", "isValid": true},{"proRegTxHash": "11cb11bac940439a4dd05059e5570f43537a12d7977611c4b524010b9eda823f", "confirmedHash": "089f43e4b31161cdd6e167a44000c40bf8042b184c335cd52900000000000000", "service": "00000000000000000000ffff80c769df", "pubKeyOperator": "8ce79308c3d7057147ef96c8369b9740845c7dce40884b83eecfa9c4ceb0a4beeef25e0c74389355b287055a7b95e2ad", "votingAddress": "2sbEE8Kn8LMFg78T7osSkQy9NvGw", "isValid": false},{"proRegTxHash": "e6232c07ea0ea9a6ed4bc2cc86f4d442d2806f021ee5b9ef9794c72d9cb585e6", "confirmedHash": "089f43e4b31161cdd6e167a44000c40bf8042b184c335cd52900000000000000", "service": "00000000000000000000ffff8ac5a1a5", "pubKeyOperator": "134b39ef8618e67c27cf594b736b12f9c38965b91bd96429b3baff1bd0699904b6cc9a5c205b42d188a2b5a7a2935f7e", "votingAddress": "7fba1NTgFqbcVapPfLn23fnUEYT", "isValid": false},{"proRegTxHash": "3bc73c35048d733c7e1239c7b5a147d9752cb627da2c7c4427fe354525861eb2", "confirmedHash": "61035eb65070f42fb24400d08c281e263b1c57a5271ff4901400000000000000", "service": "00000000000000000000ffff55d1f14e", "pubKeyOperator": "1113329c269d0048394dec8b649939e3993de488e3a5b89363b2262b6aa34a9871f085a0c7e480d2104163c0e069a445", "votingAddress": "3QtmyEX92ne4WMU9MQdWKeNBRcsT", "isValid": true},{"proRegTxHash": "e8cc6e31a0525300eb35b65495d309a3e5bd58cd1d6b80cdcf48efdd192587a1", "confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", "service": "00000000000000000000ffffb9453757", "pubKeyOperator": "96272376aa3b91448589d857a27aa66aa7c86f9d61a2e35b3f509ef3a7b811ee7c3e3d00dd45cd66dd5cf058d1ed490b", "votingAddress": "3tRJv6wZYAKNGSCqZEqF6Yd8oDu8", "isValid": true},{"proRegTxHash": "fc267bc0260a5d0465d4a86cb17af822125ecab783206cfaf99daf0b7c6b806b", "confirmedHash": "03a7d38af9140e2d84ffe3347c50d18dbf35aa5cb8f820b20e00000000000000", "service": "00000000000000000000ffff55d1f20d", "pubKeyOperator": "9882b1a22ecc0050a3e8c7e99733505b417079c8b3db569fafb78a335e9a6982dbdd0627116639c8dc552e389cb023cc", "votingAddress": "3PdJWnPjnyAbBa9awRMEpM61tnhb", "isValid": true},{"proRegTxHash": "3c45390d87ce8b50b7375e03e153ac8f77cd82cb49d48536cdf1ee97032636b9", "confirmedHash": "caa0f11c028ae9d0614549ce5dd0f4c601322ed9625ee54f0e00000000000000", "service": "00000000000000000000ffff5fd8ff43", "pubKeyOperator": "98ab1fa778b091c5816a33d99a212ffddd1a6f59595c49a3058535f009a55201504e71af6be09126ab2f8a02f7326bba", "votingAddress": "uwJYLGQ6kUXx2169gsqYQXL6EM7", "isValid": true},{"proRegTxHash": "8df6e9e9f94225f24746b71311ecb5694323fc23c4b8baebf4bc747ba8eaab6d", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff84919f26", "pubKeyOperator": "99706ace81464c2112692cb31ac0701ae4903c7000d2f091dd6e64c4696a54fc6b5f5900851dd232744db730e5b74a66", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "384b748db5eda69dd923fa601bdb592963d32bad9ff7ab407326a34a0f1a7248", "confirmedHash": "4447ac1bfb418e44b1f0614a0af6b1902994317a452ffa920700000000000000", "service": "00000000000000000000ffff80c73b7c", "pubKeyOperator": "115ddf9be9c29e718bb165b595b1662b32a64df6c2846c273e774357872bb2c61eed226ed160409762778b58def524ee", "votingAddress": "3jfW589NaBDrqy9yRkda1mcepxBe", "isValid": true},{"proRegTxHash": "33bcb57bb7b0ae8767e75ea20a5c4277892902bde5ff1a1a6ec44d1800454c87", "confirmedHash": "c080d488982716ee367745c26a8f1b420b4826e3ba8415e20f00000000000000", "service": "00000000000000000000ffff58630b1d", "pubKeyOperator": "9949033f1b836cec66e675eb7d943ff04595a4e19d9e51b31d79cec9bf113e4d83f7f119201ab07488bb1f691b0b7e53", "votingAddress": "i9smGLQUeNpxomgN4bEHLMvkK53", "isValid": true},{"proRegTxHash": "129ab6cd770668775b8d1ce5a5ef2bf1185fbea9bf3b8d542b97f9e2c261a108", "confirmedHash": "2ef5c3c038fbb0424026bb9b7815341171eb2b902aba38fe0100000000000000", "service": "00000000000000000000ffffb96a7811", "pubKeyOperator": "12cd7735ad61ede596ccd4e091451168acb646a3cef7c986b3ccbb0f71b84e5d17f99899e3f69cb75840522b4af949cf", "votingAddress": "48UE6GpVWyoKaR7LmHYVVQaMBVio", "isValid": false},{"proRegTxHash": "cdcc87f563f208ae3ccdf43385e6e211bb6d0ac3db972cee0d51dff5038688bb", "confirmedHash": "c972ab5eb29814eb6fb87a0193affb965ab4384d8960ab771600000000000000", "service": "00000000000000000000ffff3a79e519", "pubKeyOperator": "9421efc6d1085e2d1bde085b7829c7540f15d56a694fb954770edf8c86fe5fb4574b479ba2ec92a2620ae76dd24b21d5", "votingAddress": "VBN83neUjnbom8DeCvjTWJRmo8X", "isValid": true},{"proRegTxHash": "f81e2654dfa2d8f73c8d57b03bbd146aad7c0ff283092a14fb95b4b623421a1c", "confirmedHash": "617a93d3408d0f74d9b4712474856a33c05eacedf7ddbfad0b00000000000000", "service": "00000000000000000000ffff8bb4d40d", "pubKeyOperator": "903e07afacbd2b00a57b00efce27dddc0d3792a315c4ec19f330e02c7b960ddfdc696d39ca522d52b7af7b9f031dac88", "votingAddress": "3hDnRQNBUo9uMDmzEtN77mfbRWLi", "isValid": true},{"proRegTxHash": "1017c402172ee82dc61647b05de38620f6c426c9942569c6da2956d0c670ad95", "confirmedHash": "085c87a168adef427bad38791dce86b3e81ee4a5bbb1b08e1800000000000000", "service": "00000000000000000000ffff8ac5a42a", "pubKeyOperator": "92e9fffbaaae6c5a1ce4be59d3b8c79776b7e60176be8f7411bc577caeb5d6c0dccb2f218796b3635e1cd1d856f8a064", "votingAddress": "3LYJAv4LjHRKmPYdrW5uR2HbJRBk", "isValid": true},{"proRegTxHash": "d37cfbe7c08af86bfdc5f7e1f5ad15ed9b75550c8b67e452634c428e55bb203d", "confirmedHash": "bf974f793efabca02947b0168a84fcdeb28e434fd6cb99b71600000000000000", "service": "00000000000000000000ffff2e659ee8", "pubKeyOperator": "953ecd21728bc274870260f4276bbbe4ed0ff3cd3f7708ea9560680bd618f9bb14b2482f77170fb634bd64dd997cf2bf", "votingAddress": "i7Mm2sT9kNPSZPVbEiPQj3XSrsc", "isValid": true},{"proRegTxHash": "23bc0cccf11566b33a15356f1f572c03ca2cb53335ec79afa3768010bde83821", "confirmedHash": "84f908988db6fbdec293b777ba7a6106ff0f85605f6b9f401b00000000000000", "service": "00000000000000000000ffff2e04a263", "pubKeyOperator": "8cb859caac46e998484fc328f28abcae1a7267d31c262049b61ec93c43ba83050e62f2f3d3a7c6269a08a5b7194766a5", "votingAddress": "2622shUBsL15eY9dRWuBwasj3GBh", "isValid": true},{"proRegTxHash": "a786988f047ba6adf30fada1bd7269360440085047ee6832b36113850af1e0ba", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96880dab", "pubKeyOperator": "081428d736ac2efe0c2b0f82da3c07cdef998d2a1f3a78340c34dae7f44082a7eb07d654637cd0b7ba4630abdf04a378", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "ca8a66981efb5ea56fa5aea0461c42c225aca110b065e99d0e2752f41dca7e79", "confirmedHash": "82a686d2117ecb764ede8a22d6635072e436a0128e3086911700000000000000", "service": "00000000000000000000ffff58630b1f", "pubKeyOperator": "92058ad273ac46e18e4f43a20b5bcfbabdcded712d80387eeabaf190d4351f45749db9a9d1bf4e13e4ae946a03ed4015", "votingAddress": "4YBVihGKoNb5Ks9MCDS1YgEE4XEe", "isValid": true},{"proRegTxHash": "d084667a45152c7d6fb27e64c8b8cabee8e1baf7ba0e601e47b112afde1373a0", "confirmedHash": "b38e566afd123d3ba6a79f811197247789566fa46f9c3eb40c00000000000000", "service": "00000000000000000000ffff40fb41ce", "pubKeyOperator": "85401739d4f6644f012ba9b1ae410ea6975146b63ef7e412d0a615bef5c4eaa913ee9f717be317c8e9dde6c206472c2e", "votingAddress": "6J1AcEeFGZya5BaQWciWpdD9Y42", "isValid": true},{"proRegTxHash": "b0ac6a2ffe9508494d705044ef7c00e42084ae33d7f6347244ca4334ff41e3c0", "confirmedHash": "89b346f05a32fdef48b777e82355d8d71d0382af8ed701260f00000000000000", "service": "00000000000000000000ffffa123d5d2", "pubKeyOperator": "0a199dca868dd87071c3a5b3e29fc725a1282e0b6a8d5414bd060ced7f7c64b9d53533dee3c73a519a5864dfc42b17e6", "votingAddress": "NpvggCF6xhPNFLTcQCp9zK2ecuc", "isValid": true},{"proRegTxHash": "121469797b4dbf379883b31bc52c73e81735e6164b317ce6989eebb3af6578e4", "confirmedHash": "5d5663de2e407152eb464894bd54475efbaab9f9d5f63e391f00000000000000", "service": "00000000000000000000ffff95f83530", "pubKeyOperator": "1081e8566e74790ba82b291627d7a612e76ccb7aeb1508b78162bc543c564161754446d28b6bb07a345420b72e34de54", "votingAddress": "3Phy6A53Byx7rQVsdygBSG5C3ZPv", "isValid": true},{"proRegTxHash": "ce1761accfdcc8d75fee5fe8cf32a8c0302d2589f1e3181a5adf887a52644d4e", "confirmedHash": "16e9f7c8bb6870c5fe24b709404c9aeef7d2222b40b9ddd00100000000000000", "service": "00000000000000000000ffffb9248f08", "pubKeyOperator": "873a1bb86c0daec84c5b22c2aca56a3022ac8816dbfceecd4a749800628790fcc5d9f2bb6dbc8b113dde50da06922b3d", "votingAddress": "3hQdVkGdNMTpXDyqzeSFe1mCdJ1h", "isValid": true},{"proRegTxHash": "5a9b33b42f2d2d1b47999585a32a27e7a312a3f300a14d77bd45039108775f26", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b015", "pubKeyOperator": "97cc843d3cd856eb2ff5400eb860f7b7c00804a119b3c117db3083eca6ec67e9d46ad851def5488df8edc80ade2099a2", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "898dfc634f118cefb3632165c576aff98a0ec66520c7219886042efe4105df45", "confirmedHash": "b4da35f89f198af2c8ae6b1de6441a109f42f077da6d2fed2200000000000000", "service": "00000000000000000000ffffc28759a6", "pubKeyOperator": "02658b865c9648b7da5b94a44d8dec3334358edd15313c9f16b37c8db979a6b73e1185f0785284cd59d8e4f0da6a2fee", "votingAddress": "Z2rUY9cWjjqmJ9q3o7dHKN5N5Hf", "isValid": true},{"proRegTxHash": "b0eb4926199f0be6a28ecfe8028563f2bd2e2d93f083305a26c2512290167bf1", "confirmedHash": "39c67156615520c44c386943e04fab47ad9139324f924b730c00000000000000", "service": "00000000000000000000ffff9fcb29d6", "pubKeyOperator": "0352e6fa0247c53137a34e43589380c3ebdc9f9e1f7956a58382afae373a84d4839513e3a0b5ddf295219fda3d219a82", "votingAddress": "3tMiRu9isnzZN2QrpULAnSRaA6rH", "isValid": true},{"proRegTxHash": "bb330c79cca244c18b245b5224025fbdd86a21ad8bab5dd8d429ebfe2192a60f", "confirmedHash": "eea9e6c47889c1f240be88daaa742646a2261eb161cd7d430600000000000000", "service": "00000000000000000000ffffa7ac36fa", "pubKeyOperator": "18e8fc69b0424b63cf221c75b247e49bb7a31b905975a07aae363ec98bd1b77cdf88fd243a677f574d60a7940af40888", "votingAddress": "3fMLtp9hyjyhFvmWPXrmHFErahp4", "isValid": true},{"proRegTxHash": "bfd280d22a21574ea9f568f7a729b370f4051b89eab6df3d0d74b65fde1bdb79", "confirmedHash": "86db59de2516f225210a10867e40541ca66c911efe9c30633300000000000000", "service": "00000000000000000000ffffd161ad89", "pubKeyOperator": "0a6a7fb814db71eb6ef12341749d81b5fd326eb4b9445a3be65668da9856910b378ec6427fe18fc81c39499e7c706064", "votingAddress": "2eRnFocgYK86VRPnv1rX6WMoMLxM", "isValid": true},{"proRegTxHash": "3331ca6c142c04d5de443dfbf8be33a53f5e339acd43486fa22348eda86286b7", "confirmedHash": "2cc7ad4bdc66c6cd1d538dc5f99816096e0e2acbc70308ac1a00000000000000", "service": "00000000000000000000ffff6deb43f6", "pubKeyOperator": "08713b27318898be84732dd431be9f4c906d2c282e555ec73fe83fe748d5dca5200fca28b3e5f676681f8bf858e6c7d0", "votingAddress": "2F9BmqjN1TbrK54W1xtY26chbMh6", "isValid": true},{"proRegTxHash": "2cad2e9f21d6c8be5c72716e8f66132dc6ac0789f93b4969bead4fab84d96e78", "confirmedHash": "d2d8ea65c35935567e5bb6350bdecebff76d00a0150e51171100000000000000", "service": "00000000000000000000ffffbc28fbd4", "pubKeyOperator": "0c90c237db66c4bafc8078df5badf04a171bd8790077570d4825ebb6be6d12fd65e9cd2390540d038afd59343dccb592", "votingAddress": "2wCXMWdaAPRfqUF1NrmZy2a8pAgk", "isValid": true},{"proRegTxHash": "658c321d9bb9e6b7d56ffe0b934083da2089267d19231ac4736883b4e1374af5", "confirmedHash": "a927cd71c585a25b3d39197012129f884443a34c794e9f9c0d00000000000000", "service": "00000000000000000000ffffc28758e3", "pubKeyOperator": "8fe8c0de542ebbb9cbdcebcb5076cbdc19173bcd6e1cf18aa135a9f526c9d3f73db267ca0ed77c1168cb4fc06951c377", "votingAddress": "2366WfW86tQ9Sfa6PAm1cmV4FTze", "isValid": true},{"proRegTxHash": "ae0d88f18965847bbe358e45c963f0c2f50385fd240e583d161e0adf386bd5a1", "confirmedHash": "22d1e1eac1d96ce5f817a479dc991518467d0a855ff0bb1f0900000000000000", "service": "00000000000000000000ffff55d1f14f", "pubKeyOperator": "0f5029dde490c93271d30b303a21fb8bbf35d66508265803783626e182397aaee7edc2fb77fce6e76a6a9c710b5fb89d", "votingAddress": "2hB6bRgC4qi3sGwUW3fDh5m83mXJ", "isValid": true},{"proRegTxHash": "5e8f0d20a19b27163e4cb531b952e8072ee2e1e397a5f22993030f10cdebd430", "confirmedHash": "96a8f07e78991a392580a0e6384937f86d4593d419e56a470000000000000000", "service": "00000000000000000000ffffbca63d76", "pubKeyOperator": "075aca7e96c83fef55d198e8ee837e20ec0ea8652a3f5ebff65de8c9a215f1f9203e8d4a9cd41935b6b14557ada4b256", "votingAddress": "2eWo4WuUBPtyzkQQXncPayi8X5Gg", "isValid": true},{"proRegTxHash": "089b06f3686d7bacbc3a30de8418bdb905d5989fbfb4cef53b0cc8051f9a454d", "confirmedHash": "0c217b7eba047f8b3baddf11c80707d924f2cd9645f2e6020900000000000000", "service": "00000000000000000000ffff5fd8ff4e", "pubKeyOperator": "8a5caeac98f9fbcb4c1e15734b9fc10bdcc8a3dbbe74b636095f8b218064b05beabeea0317945346d4d5017c3086a48d", "votingAddress": "2uSgbG3tcJ9BqW6oDCddCumgTqet", "isValid": true},{"proRegTxHash": "ccdf17ec4933a650fcdece3a0a0a05d2e55e0aac5998dd6362579e3225e80e0d", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff8491cafb", "pubKeyOperator": "91f325217de87935b334f4acb06c841fe9c64f28da1ddbfff511b777b4608f77f8b264a8c11af1c7b5b02549cce9d926", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "a49897ed786465fc8e89f2df71d3061502e84fef2a7106fa6d23a08399056fb1", "confirmedHash": "36b7742b6125ad0dafa80aaef2abe2e7043ba705dcf291022200000000000000", "service": "00000000000000000000ffff90ca2501", "pubKeyOperator": "835c33ef7379bcb444dffdac7f216144bb004b8ff0b5cf2993d810640ef5f7380a6427f7f0713ccbc69fbec8b15f8607", "votingAddress": "2reBJkEaMsE2v7ZU3XeuLELAJoRZ", "isValid": true},{"proRegTxHash": "e933f6ca49bf43da87e7f971840e51f7751dedb9be7a9c682df3e5ed6970f4d0", "confirmedHash": "c9b913428c2d2a05999debc9d651fd69df32a518a58b28c70600000000000000", "service": "00000000000000000000ffff5511f85b", "pubKeyOperator": "1375b996b9fe739ca2bbfd06613eec87ccd7c5715424d0085c6f835a1989221c3e99a66f09520c1d7750329a1af29e9a", "votingAddress": "38YMJkYrYT6NgyfWZhq97ke4tJAd", "isValid": true},{"proRegTxHash": "c387202431f526002c2cb42a867580cf5a762dde21915f9ae8d66442238cf38b", "confirmedHash": "a9c4a7b037b73d2704f2ffa0211184535e1cdf944cf975410e00000000000000", "service": "00000000000000000000ffff2e65c3e6", "pubKeyOperator": "0af741440fbb7382b47b31433be23a911b41afe40a1fb8c9ebe22c6946b370d351e5cfa1db891a8a9f749e675c56f61e", "votingAddress": "27jPaPcJzxMfiC3LsmkpwNj8ZC8h", "isValid": true},{"proRegTxHash": "13c6197940a105eb683107ecf668455a1a6bd526c7d497e60998d1f5fb8ef149", "confirmedHash": "ee44ed9cea0b59bd32cb9d1740104e13b280283aa6dade970900000000000000", "service": "00000000000000000000ffff9f41973d", "pubKeyOperator": "922f51fea28c9c398704200edc44166fae040ceb21b4de1b57f28f52b879de44fccab9055bd68bd74c18af6165f8978f", "votingAddress": "2uh9xELBCwHsRKj464dzMv8WTvmW", "isValid": true},{"proRegTxHash": "5e84fa2e58e7fcb222a8a4f5cae3d1ce7ec36aeadc626ed00bedf4b2ef426a9b", "confirmedHash": "bef98092b5df7da2cf10284bf279003ec55e9ff12d899a580e00000000000000", "service": "00000000000000000000ffff4f8fbcdb", "pubKeyOperator": "8cce4ec3385fc78a54d549c948a54c3d3c6fca1061c5699d602ec8d9c8b75323cba756bd005226dfb84fc2b1555afcc2", "votingAddress": "36Si7FMeRyquRGFqaxiMuTD4c5Xy", "isValid": true},{"proRegTxHash": "a9a33aa9bd76aa60f6ea0a6f88e2799c3e8349588a56b790749048edbfeae759", "confirmedHash": "c7f2ae3721473492eca02b6dbfb92a63fbef83b4f184ec962800000000000000", "service": "00000000000000000000ffffb23eacc5", "pubKeyOperator": "86c83c6f3f2295e4e323ff6898e79cc25e9879dced23fe8cb17d94b3ff79c8cbe814dcaa111e7158122db5aa0b8a094b", "votingAddress": "Lpdk5mW3hdDjVmtBTiSvTxyNP9X", "isValid": true},{"proRegTxHash": "3bff47963510a4b1f8c56d918e95f7d2464e9cd302de0ede7cd4fbcdcf447003", "confirmedHash": "26a6ae86c28349c7c34fb9b4412d58d4ac00e739b3f9ea941200000000000000", "service": "00000000000000000000ffff58630b0c", "pubKeyOperator": "0e0f7152aab56ba58ee443039f785a17fa79efcaead595679f814202ff23dfb09a200f0adf2e33cd9ec8aa6e65749880", "votingAddress": "3kJChqkSN97ouz72MmEm66HAfN92", "isValid": true},{"proRegTxHash": "7ba5efdbc97c89a20be3b9058caa025cd1ad73eeee077f6f059f2be191cff3a8", "confirmedHash": "e84677f96556aea73dd785bceab2845489ed3a5efba53a702200000000000000", "service": "00000000000000000000ffff87b5c59d", "pubKeyOperator": "8c57fa3fe905512259e1ac2af0121fe554966f95c3cd22e1c79b1f3dacf81c722873885ec7f2589cb90142c5bab21bf1", "votingAddress": "2GqRaxZZKCWqeVBwn2GbDeuxj5pC", "isValid": false},{"proRegTxHash": "c926f52330b20e61463d8c707881ae950779711ad3484ed08ed480ed308291bd", "confirmedHash": "ef4b37bc47d1962fbce7354c4e195b27e7469a59982ee1892700000000000000", "service": "00000000000000000000ffff55d1f22b", "pubKeyOperator": "0dbe84703906a15db501b2a1d602d35ae9e42f15fea041134818dd1630dfbb7ceee88a3d2bbbf2fc7b50618d3e56446c", "votingAddress": "5dZswUpWFyhkWtJTJFTzc6wncBn", "isValid": true},{"proRegTxHash": "3efa76fdada8cda2342943d2313ea81dba9962e36c1adde41da2c4e1511e898a", "confirmedHash": "43ab2e71a9c5d9928e5d0d0765f50145e1f39783680f7ece0200000000000000", "service": "00000000000000000000ffffbc28f16b", "pubKeyOperator": "93c551deb4feceae6e390fec0d1b729bfe7aee6c6df6102de8ac3624b2b7d002c795f67c836a629cf5cf6886be53a7a4", "votingAddress": "1a9M1SgHW1479H6bJ2jvDRkYYwn", "isValid": true},{"proRegTxHash": "fc20eaff1961edd1c8919dfbe7cf7a69ead116c989625bf5a97b512679a10d39", "confirmedHash": "6c534cf2daca1ed503ded17e3692f017367117bce39ded2d0000000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "3ZeX8EjATRkCiVed26GSKH6qfMmS", "isValid": false},{"proRegTxHash": "45110115ad53a15daf3913b07320f51f2edef6e97ad30594798826e3a562534d", "confirmedHash": "9f8cca2214769e23962cf39fa42fb3a0dccb30b8224a60312700000000000000", "service": "00000000000000000000ffff334d71d9", "pubKeyOperator": "011e3d9fb15dc40979cc2f9c845a80fa6ae91d08efe10bf91c69f304ed7b5281152f3f37e61246a2c01a58fc35df683b", "votingAddress": "2UTXMEHsxA3PvKJLSfi9X24nvQoc", "isValid": true},{"proRegTxHash": "9ffdfef20a26c2355f186d3c1d2210bb5095b6d4ee527189ece28df83442cba8", "confirmedHash": "44bd1811292f54f7da814dc227284df8e9d7c4f7eb9be9364000000000000000", "service": "00000000000000000000ffff9df560cb", "pubKeyOperator": "00fa62409ba4fe325bb55086f2deb25fb855974d3eaf6098b0edcc2a1f873ca82304836292b1f3a7497d729eb483316d", "votingAddress": "SXpGz3gXDS1KVdaTa9N6pcf5pLD", "isValid": true},{"proRegTxHash": "2dd02afe2e618608e7825b0968e7cc792b2895f30f939244b8c8ddb7c7df8cef", "confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", "service": "00000000000000000000ffff58c66986", "pubKeyOperator": "977e5d7f837d10b95291c2e97676b92eab462f9f420d7e1adf96656ba0bf577fd010d5670c765ca820aa644cf1382c06", "votingAddress": "3M8kRWHvS3A9tswKiCBkV4B6RKYi", "isValid": false},{"proRegTxHash": "bef8e74b8f70d988aade6f633a94d815bd47645fcf937d9929ddef8c16a9d66e", "confirmedHash": "55c0ca77c9cdec9f6efad6566e5914f881435ac8152069af0700000000000000", "service": "00000000000000000000ffff55d1f24c", "pubKeyOperator": "85317ab496469a0eaf66ffdfc756c5bca4e8a5f74613c2d186ca7eaff5f8fe630ba842b5bba8064a70eeb3425aa3e433", "votingAddress": "5wrPApsGAR7gPNuUJRejxfyBr78", "isValid": false},{"proRegTxHash": "1abdae8d8d2900f623efbb5f26526ffab1f04b0506c32cabc5627a35b723bd93", "confirmedHash": "8940486cad0de94eac6ea9f7a4844b127ecb29957e4933813000000000000000", "service": "00000000000000000000ffffd1faf354", "pubKeyOperator": "850949ee96c742bfb4fce49cf1e94e86adb93b3f801b3dfde4106787b64d2d42d0a4500024fa9c9426e17bdeee352a34", "votingAddress": "23kMC3CFFaycj3keW7Me767Q5n56", "isValid": false},{"proRegTxHash": "71c613385de7c5732b17f720f3b0dfd17ab91cf88742124c4acc1ff501f22d75", "confirmedHash": "20141d5bd8750b48856a349180ac2b52d3264ac4ecc737190f00000000000000", "service": "00000000000000000000ffff9f419706", "pubKeyOperator": "9948c49f3c5357252c0fa5355deaea37fbd1465c90f67b06108eb3db3049419b7d031d3aa0eb895b6db0762a2d39aad2", "votingAddress": "2gonZM259gBcN9JRNkr5BJSLTM2p", "isValid": true},{"proRegTxHash": "0c687d8a0c4a95b794c72e5de2966a12b1e32642d9100f2be49d7bcff1dbc7d8", "confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", "service": "00000000000000000000ffff3e4d9c7d", "pubKeyOperator": "96aebb8bec5132abd02ad09f09fa781aba64f15e27385f042328720f0b97372ead509611eeeb0339116551f2f661e53f", "votingAddress": "rEa6bqe9ERsXVrC8qcqvhB4n8PK", "isValid": false},{"proRegTxHash": "0b5661cb5a499700a2db23b9fd9acba6d41bd669055311387fed091e9a701421", "confirmedHash": "9626334594574a834f3d724ce9e291cd4f8d6f3e96d217081000000000000000", "service": "00000000000000000000ffffc28759ee", "pubKeyOperator": "966b6fe2cc2bc7d497150c85376d6df0077bc789c692c4bf4cb82f6c92d4a148ff263713eeba0e8a78fb6cbd5f54b85e", "votingAddress": "2knyJnwRpAXz1QYTFGqPZQk6LN1V", "isValid": true},{"proRegTxHash": "70861edad2be14f6d4fda67b19577dee33907e2804a725b9070b51bce4082057", "confirmedHash": "0fc9a90dc7502d2c30da066b6488fd076d8882714d76f5ea0a00000000000000", "service": "00000000000000000000ffffc2875f7b", "pubKeyOperator": "01cb1e307d13f87133e9e06c8c320e90e7191032e7eea307c81d82ecee56de2c1a35d9cbaf0a18c96dff29274b5560aa", "votingAddress": "3ChGom2VdcwUKM7uKWDPEfkGWeVw", "isValid": true},{"proRegTxHash": "ef7276d29abe19e38a02c1f2d34a0e41fdd2f5c9a6647dcf9cb22941f58477cf", "confirmedHash": "3845e61195b22b362b38fea85eb3aee5610ae09030e7ab260700000000000000", "service": "00000000000000000000ffff22f482ae", "pubKeyOperator": "8ab57b2df73bb68367fa9f93b6695eb4ee43468be85640515a10ff7adb2e5465aa45379867de7df7b43d286e414db6d3", "votingAddress": "YDGHwhY4LFZ3GbRrvNoT7uuLNrP", "isValid": false},{"proRegTxHash": "ad8d7d88c9d75e0166d29a9867bf41e04e91a5d9f80ed01f4be3d46069252709", "confirmedHash": "d117824eef4155d979434fba3ba7e972dea3e35045fdff972500000000000000", "service": "00000000000000000000ffff8bb485a4", "pubKeyOperator": "966373ca8bc9de6528cc9e45431f6d3806f6d352913d3a2fdd12e2962a08de74869f03e6e8d7396e8ca349227f3a0340", "votingAddress": "3RPXYoP3N5oiMM9BRt3mYPW1Je4s", "isValid": true},{"proRegTxHash": "3bb61602562814829ae439b350df1ed837e4c306d90c29294b911fe4e29e0c89", "confirmedHash": "28e523bfce572741fe4d09776c727ce0c07423c270cfd5841200000000000000", "service": "00000000000000000000ffff2e04d9f9", "pubKeyOperator": "19f17cb890786576a7e25a930289f1c71c2560490c6bf24faa2a234cf634ceef4c823145fe13712e18543b4dd9c5526a", "votingAddress": "49zdy84Ry8qQt2Xc8nekyJE4QbN4", "isValid": true},{"proRegTxHash": "a910289bc87ae122a9a231e17b264950b1f6954d722f13b271cb8abfe01dd205", "confirmedHash": "43b3caf59cbc5331ce20c7c1be57c84ded106d611d049e4f0000000000000000", "service": "00000000000000000000ffffb07b39da", "pubKeyOperator": "11e320662da70da43d903b525358803f65e2dbf6221e0d33cc22ad0f57281879757824c6c315d0ca2600b6121594072f", "votingAddress": "4SKsq3cLfN9UgYrFur58TyK965oe", "isValid": true},{"proRegTxHash": "cb71e572818299b802a60ff954508791cd1ba9dbd9cd5538fc722ece8ba34d97", "confirmedHash": "6bbac2ae6fe2ad70673ffc9e2efb40d78f90ec30f510f79b0c00000000000000", "service": "00000000000000000000ffff52d31524", "pubKeyOperator": "0d1f1de62607e61bb5b16cb0dd0ffc3e389224eee37d87fccb74781676bb92ec9c641b361c22c5094a11a04d31c83e3e", "votingAddress": "2D7smbfJZ2xdyPvuoZD8SRDL7anw", "isValid": true},{"proRegTxHash": "d108bf90063683249387e4bbbada726534b0012de00ed1861116300c71b371e4", "confirmedHash": "4ad2af3d29cb9e61973d001383e2ff06375355367c0786170a00000000000000", "service": "00000000000000000000ffff74cb2a60", "pubKeyOperator": "0c22633bd7b05873c80423fe16601bf43d10ab0f3047a93c930fb60a59f1dccabe5bd2292e2b199c8f3e4829770bbc38", "votingAddress": "26JjZQrqskDm96J99fZGu1YkNirZ", "isValid": true},{"proRegTxHash": "cdf1c4ac33e80542d1bf56ea80f3ee3c187949fd035add84916008f7947b2b6f", "confirmedHash": "0913e53028617984590c90583b02ad8279b52dc606a14ea81d00000000000000", "service": "00000000000000000000ffffb952ca3e", "pubKeyOperator": "99a6aef0824c4e03690860d4663e3b4e204c8994d25c21c9d60854f7d7bb04c20ab9b90921b49486c47169c65318a6a6", "votingAddress": "3yzsokw4Dz3DmaNGPrv1o1Y9TBss", "isValid": false},{"proRegTxHash": "e30e9d1d9e2f67f204a4aa97924739bbf0f5dd17aa4bf935fcfbc5fa59bb8c28", "confirmedHash": "2b372973e0b116b39ec0f659d6fdd3b085e361573f6e980c0000000000000000", "service": "00000000000000000000ffffbca6bc2a", "pubKeyOperator": "98f02e4f6b1ccd8cbcc4b353505749516982782d5ba456cf99992b5e030947700d8cb1f33e91d3e79716b7f6fba5180f", "votingAddress": "3CoBwW8KLdWCB2ns3w8neuYBMdRM", "isValid": true},{"proRegTxHash": "6070ff76961187ac4c69bcab1f4c0707b68ccfc0942a937a7aa58dac10df20de", "confirmedHash": "245401f903e56fecb152d4d9e9de1e8f96e97bfef2ecbafc0b00000000000000", "service": "00000000000000000000ffff8a441c08", "pubKeyOperator": "09555a9015f28fc8138eeda0d29e6df9722500d7b25bc6c6845ad939c9aeed0eed9676fb4a34d79867313f9982a4c715", "votingAddress": "2LffuBvYQ51nQiBY4DLP3ZbRCknZ", "isValid": true},{"proRegTxHash": "916db443bc57ac5fc24bc40f3aee69b8edb3d759bfad3f3c0729d69d4271207e", "confirmedHash": "9b9d03adeee2e2124e29d80c907babf1860ebf222820326d2800000000000000", "service": "00000000000000000000ffffd41868eb", "pubKeyOperator": "14894c3ce9df9184a26ec703c21a88b362fc32453187013e232dc95a0811921b25d5372c1f22172a17c46cba5b301a9f", "votingAddress": "4HDrxGRLB5cXKa7vJX2GgJwpPdCg", "isValid": true},{"proRegTxHash": "194cc367a13dd39dce1ab2caeac347eac229fe91933c4141717486bc44ca3294", "confirmedHash": "5d7ee98cf95bb5c65f39ea26113340a2dec82d9fb2902e4d1a00000000000000", "service": "00000000000000000000ffff5fd86354", "pubKeyOperator": "8534b5341c28f91f160b67c7f7deb077fe8303c4abb426f44428df5a9b9add8ba3fa29ba0d1a004976df3808b7304fc7", "votingAddress": "3g2Y7zDi4uWdXuhPaJXeBAAeht7u", "isValid": true},{"proRegTxHash": "0cc792351f306329b5155ce20999ab3a2b60990322a53b41c0d4a6b1537234f9", "confirmedHash": "2628966384eee5c586f9d1a03f9cd065fbf90b01ad2d14450e00000000000000", "service": "00000000000000000000ffffc0f8a9b6", "pubKeyOperator": "82882c567dab1c608a4473d4f4a0a05abcb38720879ea956b3a9e1264913a860807f77c1f9addfe755f66131baa6c28e", "votingAddress": "3s85E8ioVAjcRMQE9XDcgu3X98pv", "isValid": true},{"proRegTxHash": "15eb6c0ebd1df95b786a8fe55cf36b928b8b020a39803f544a18c60cf42761c9", "confirmedHash": "fb288c7061f29ce5be76ab4b0cdc7e2310fdcb8fe1be082c0000000000000000", "service": "00000000000000000000ffffc2a3bcfb", "pubKeyOperator": "923f4136a095533e96ec31516e1119bc8a85c0f4299b04ff7a169eea548561e25ee0cc33600ce137de8502e113246115", "votingAddress": "Zue3eTWmPkxy5Pgx7sSADSXDuhU", "isValid": true},{"proRegTxHash": "3d97999a20bcbf1636c0adab9b53ba0657780bf0721d3c7a4665d1547ef33d6f", "confirmedHash": "6ed6a400b9c9b65d4da63626648be9e0bf7bd2b07a8e1db71300000000000000", "service": "00000000000000000000ffff55d1f1eb", "pubKeyOperator": "94b13c7048f8b8c290083643d941f83bb5b5eb6517247ecc20b0da0b02c146810c8c4af0f9fdfa701a98dbdc4d15822e", "votingAddress": "GR5Ss4KNKLzJcbNX4evH5ZBiV5k", "isValid": false},{"proRegTxHash": "4e6858ba6e095cccf7b2cab6294e8105e06d9f20ad15eee80550acb431947cbd", "confirmedHash": "9940e54e5b07dc4777d29d49d4c00236b4437f6748014d760800000000000000", "service": "00000000000000000000ffff05b5ca15", "pubKeyOperator": "0a9cbd8c475671320ff80adde5d5132e529bec1dd904bdde9973a9896e580341a61455318cf8dbd6af7d44ad0497a8da", "votingAddress": "4YkbK1ZMuh2qMfkchyuL9EwxveTo", "isValid": true},{"proRegTxHash": "16c1edf363071ec0d6436d038f2b51b3d9ec5a0d63b7fc0cb3a5a8cbdea210db", "confirmedHash": "fd6b1568e3ec897a4394cc7dfa6d81f5005b84421636fd5b0000000000000000", "service": "00000000000000000000ffff55d1f206", "pubKeyOperator": "13231af24ec3acec2d46d9818e73786cc3c74f9dba271b00e5b3bc70d057101548096bb307241215d78f49a7eb06028c", "votingAddress": "3AiHkq8o7gZFmchk47wF6E99DeXw", "isValid": false},{"proRegTxHash": "066393d7fffca543a2c335cc4effb5aec589ca079789c6a219aea45843c7230d", "confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", "service": "00000000000000000000ffff55d1f265", "pubKeyOperator": "141c6bece5a4e61ca697029ea7d2234ae581fe730f20f5fe788a7d982085d7b96f31ba534ec83a981e674cdd762d123d", "votingAddress": "2dj6cvWFA9UCYZr1bT5C8meibDRc", "isValid": false},{"proRegTxHash": "4c81005e4702ade5f07989ac9a631b01c4441c149bd3fb7c29d1030f9883b609", "confirmedHash": "2d67f8dda4b07a3dd74c5fdc10d79ce37b5079a7a02cee6b0000000000000000", "service": "00000000000000000000ffff55d1f1f4", "pubKeyOperator": "9507d591b81df12820d546a15012f436aeb9ed8413aaf8167c8f5e8da30e6667503603bdeffa8d5a070b548bd10e0f5b", "votingAddress": "VpQkhsZJ3Lgf9QpFQH5hRRGwmmN", "isValid": false},{"proRegTxHash": "b685885ebf6b3e54200b53ab6b9d9b9aec05a70c567f9af4537e2d24b4217490", "confirmedHash": "932447da72e777f2289b1c6bdff09a9dda8c76868555eb970100000000000000", "service": "00000000000000000000ffffcebd0e55", "pubKeyOperator": "0b28d3592a0fbea905453b7873ea25645ef57b28430c06377a63e5ffe59000648e600fd55bf09eae25b319274cf83ae0", "votingAddress": "q8FFCdwFikSjqiBqT86kZMXwGB2", "isValid": false},{"proRegTxHash": "8eb30b22d4b47826614c481262d9916e8d509221edba3e0eb4b367725c1dac4c", "confirmedHash": "2b697476961b405442be9c0f10cab0f6696cb1eb23082e4e0100000000000000", "service": "00000000000000000000ffff36bf8340", "pubKeyOperator": "84cdd7483772dac81114ccb9def87d9d86f8203379483699b2f4ac85b41549ad6aa2bbf11a75669364a5ea74fa6c59f6", "votingAddress": "2mo9W5uLohMWadmcTr7JGnXw8tBF", "isValid": false},{"proRegTxHash": "c4b49620d3f98b34609aa758768ce3e904ce45d01f2c934ffe30a79d2bf6fe87", "confirmedHash": "4276e260a8babc36ddb1375640bef8f86b6d08bf4e02c1e60f00000000000000", "service": "00000000000000000000ffff45a4cf3d", "pubKeyOperator": "8245f108ad3e2d003b5a66a5bbdbed403145abb02d4c87087c983fe5182c2735efb1f4b5af250558466f65075cdc1f33", "votingAddress": "uWMopxcDXFNkCXpJhCqBbK3VYUy", "isValid": true},{"proRegTxHash": "b0157a7c95c0bb08347bce668430a22733875b8e8137b8ca7dcc2f361f00a865", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688631b", "pubKeyOperator": "1429f3fdefded9a8c5716f6e8f2b3412b60a0b9b1ca44ecf57845fc9ac93dd5bb44c5c7ac6e9c076a39c2725f9814cf4", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": false},{"proRegTxHash": "38ef03d91573d2305e5f36b496785c03ce5128ab9d31f95d25f1306c7cbec0a9", "confirmedHash": "725f11f42a44255a1125c09eacaa9f592c4dbbaf2f72f5830400000000000000", "service": "00000000000000000000ffff33591e5f", "pubKeyOperator": "0c44ef33651ac05c4d3824028669e9822799a77e72f73c91604921e0bbef288e4e9f363bf81ee9cf6def2c570a795d21", "votingAddress": "2xKL8bnubRs6vim3pLMZVmUS4god", "isValid": true},{"proRegTxHash": "86325940f36b5dd7d4583e27c40eeac51233178223b810563225785bf0a588a3", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b08b", "pubKeyOperator": "0f45f06da766fc716a48644fee4dea02d40596be0f4e3588478accda99bbbab4caa0fc5b8d2b4942bbd0c2a35c6b73c9", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "3e2033a423663b8a0a500ec060dda3834fae86bc3bb14be63c28ec149a3ddb26", "confirmedHash": "95748fb631d4f72e12c3b9a1d5736ba7658ce84e93c806250b00000000000000", "service": "00000000000000000000ffff8a4464be", "pubKeyOperator": "91e1e6e615eeeb15adc440cc2e74b7b12f11f6e5e6c2ba546a802f9859a5f3e081ce15928313625e64f936a5e2a708b1", "votingAddress": "UnjXpEvb9RiYqXiXxLY8sbqC7fP", "isValid": true},{"proRegTxHash": "a0a4bacb1f13b9babdce7c68c0029ca79b6dd6b8f0688b9101f68a0d5a0b2947", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0c3", "pubKeyOperator": "939cfaa411d4b25095fee9876d2a9275bbf383b1be80e372f814b4b2d06b23154ac6e64153283562ec7bdcaf659e8567", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "836beb9bd19ea33b3c7c422e19f133606e1b08733533c016a3e8aed0cb27b6cb", "confirmedHash": "fbcfbf9bce71734bc5ece837e72f05f4d98ac1e72bebe0c70e00000000000000", "service": "00000000000000000000ffffadf906ed", "pubKeyOperator": "96acd28d12c65a0c49fd06790d9ce7b5440051c960a9f71acd7110bcdd2a66cb15f0a1a9098c48b126d8161ac9e264cd", "votingAddress": "4VRfsfTDvYMWYdMNqNTeSSHJYvJT", "isValid": true},{"proRegTxHash": "5ebca6771fd193711c70f72f96ab1df7352714633b70368cd4d2b2964a03ff3e", "confirmedHash": "2a0465522ca98da7b298dd208cd3a7ad16becf7641f9e8c21200000000000000", "service": "00000000000000000000ffff44b7bcd7", "pubKeyOperator": "036883d465c035b86818993a36eebf8b2e7c38207f62387c9eb4a86911dda983a25c21659384f99dea4495dbb56bf021", "votingAddress": "2eLLkiS34X5JYJjZcqSv1dAZHoxz", "isValid": true},{"proRegTxHash": "733b756c5401d0141f1df71539885101049c6f1ad6e76631ccaf1f90de404f32", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d58685", "pubKeyOperator": "8fc158da6ec0d5db896d01349634cd3864a8d10cc1816cead3231e884015655d5d8f5656d23b6736a758e931e8cb2ab8", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "58dc3d12168c0aca2d33e7484994f8dd0c8ba54fc2b4bbf36cc639c3751e1f89", "confirmedHash": "c14af2a10a903726fed1cd86f38cd660334bf6bbfdbb199c4700000000000000", "service": "00000000000000000000ffff3407b656", "pubKeyOperator": "956fbe8201592f5885d3013a2a5378c3de7395046b8d61c975c7945c876df71bcb583b8fe7c653dbdfffae671b2e3b72", "votingAddress": "3JXSpizW8J5iHbvEofduXdxoZyci", "isValid": true},{"proRegTxHash": "bb4de4578c64490446a5937af3e13668168e6efc52b71520ac4ab781e33c5ded", "confirmedHash": "37878a6ec72be395550cd276823a17a96bae40134248981b2300000000000000", "service": "00000000000000000000ffff12d3d214", "pubKeyOperator": "0247de6ccbf1e0827bfda892cd248434cb47a20c9378e5b93df2d038dc381826ad2078a222735b03003cf5e470c2c7ad", "votingAddress": "zw9RztYCcpqitCFdHw3mUMLPQdi", "isValid": true},{"proRegTxHash": "ea117168252041d2cfe3054677481a65d329c055f447e0a74d2149cf6f4c8bee", "confirmedHash": "59480079ef251d169baab392fd32109aeb8446a1fa9f61930200000000000000", "service": "00000000000000000000ffffa5e3e55c", "pubKeyOperator": "99ba0e3d628e616b5764e5176b670e834d94924426888edffdd7bf1ea4972f4388e2208cdab197c0042940846901bfec", "votingAddress": "3MFgKyESotJrtarF7X88UCmpdM7j", "isValid": true},{"proRegTxHash": "d902ea37aa2daf93b2c906145bf53a2aaac84fd89cc38eb44428e73266d3b078", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff23b69ffb", "pubKeyOperator": "872f0eb377151c8ed3a1048e866728f484545ed7ae628a53c6607b40b113f256be89f38b1ff84e5fc9ed1611a814168b", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "b97e9b29cddcbc45c13e80677f8e8d75ce86353ee72b7415527be87a95735213", "confirmedHash": "2245e9310be449fb153930080c3953941059901f09a233450f00000000000000", "service": "00000000000000000000ffffd4813f09", "pubKeyOperator": "8fcf96eb08d040a75fdfa0e7d87fa87ed77fa73f7fc9d2cee46c209d975ae2e50865c52f209f76deeb9a907dd5d07a2c", "votingAddress": "377TJ7TbPifAM9rrTCz81cxHSdzY", "isValid": true},{"proRegTxHash": "ef778d49e573bd4de19477ea3262fb4cc47da776eacfa56cc1ba4107da251408", "confirmedHash": "1100d83f5a5a54fe2639da65eaddd6de53fd0dffda124bb40600000000000000", "service": "00000000000000000000ffff68f812cd", "pubKeyOperator": "99440810cfbf437086f51e43fdd773c7116627de2a92d3c8448e9e8b3a736b174e35a775ee2d0f933b4359af1168bcad", "votingAddress": "4TbhtKMxYtPbp4c5C1j76N4rsmDu", "isValid": true},{"proRegTxHash": "a6143a7960e2c32cb284311466a8d6ad749332919614671c1857ba8b263e2159", "confirmedHash": "6d4c77891849cc8c4305e5077d4fefe8f048a8f3e39f073e2200000000000000", "service": "00000000000000000000ffffb945350a", "pubKeyOperator": "995a9d46678bb9bd1e2426a9985bcc33ae82a27dddc2b2241483af14f08a70aa66d5a56a99adbb9121f82c90084487d3", "votingAddress": "26b3ApAiacmMMmtQsgBXNT2A8zn1", "isValid": true},{"proRegTxHash": "7ff75c69aae2870396dbbb082c9fbf817c622123bd63810cc94423ed6f70ae5f", "confirmedHash": "fe096963ac6afafdecadf238e470fcb612534d52ef43c3671000000000000000", "service": "00000000000000000000ffff2d3f7491", "pubKeyOperator": "82867c36ceb8f26d1f85364c6a2fb778929019006539d49038919f3d7927bb594fa84d1cc3a655b2f552ab12f7b16bcf", "votingAddress": "txy5qVxCW5Z8sgVbJ36ErJAcxqH", "isValid": true},{"proRegTxHash": "cd831f96f8c3a70d80a1a743b19e15028280edb73d9e5b3a372e4b80da68b19e", "confirmedHash": "6f7a648f6b9cfb72588cfce801faccef8bd3279efc4d6e7f2000000000000000", "service": "00000000000000000000ffffbca601b3", "pubKeyOperator": "083bfa973db6699f59855abff4570d74a4b9b192f80735723e3a0fc0121fef488d63195629eec3d98a1f4c9c3804d649", "votingAddress": "3P6p5nNoTCFCTaz9NkHceQmfYwVb", "isValid": true},{"proRegTxHash": "3abbbb5d427f55830c2927255c3d4b25dcdcfb84217715db75286e63b0625c11", "confirmedHash": "cb50b860aa7f10aab02fb0c1fdcb69af3fbd4c41f4c842580300000000000000", "service": "00000000000000000000ffffbc28be2e", "pubKeyOperator": "84c187ddb753d37409a9d11475cb7a6e80e2628ceb3d4ac29864851a402b13c69c647e86df5a14a457769c1c028d630b", "votingAddress": "DmAf46GJddY3pimRTfHPicdjLb9", "isValid": true},{"proRegTxHash": "0081a4615a1517a37d418ff9bf733e709e11c8de2e99133d8009585b289d84c0", "confirmedHash": "1fc7cddee389a2ddea4e05579c43fafa5e418f691f550bce3300000000000000", "service": "00000000000000000000ffff2e04a27f", "pubKeyOperator": "8e8e11b85e39a3bae5f7ead09f7b5578e7eb6d9a2c23524b2768351698008bcef29e93123f8fd4e03e638fbbd16e7339", "votingAddress": "3k1QuEakEBNpDj5cVji9C5K492kY", "isValid": true},{"proRegTxHash": "0dadad58151744dddefcfc0cb415438c1cb41ce168355e1a35c2c92f21ce12f4", "confirmedHash": "47247948e618e1b287d9faa53f2b8342a5ac6b656e94d9600500000000000000", "service": "00000000000000000000ffffbc28be28", "pubKeyOperator": "80c21ba0f529945ea70b80a450777bd3ca3c71221e7cdafbf6336b3b4488f29c04f53cd5782ac83788e8732e948f06c4", "votingAddress": "oA2rB8bCJwJ8LoNgY923yxkHE4G", "isValid": true},{"proRegTxHash": "497d68b013123f9927b24d79cb74cc4b6637f63a065e94351982c83d8c6b26e4", "confirmedHash": "066dc8e8694089cbc54d8e333185903714d2b76d136829d71f00000000000000", "service": "00000000000000000000ffff951ccf7e", "pubKeyOperator": "974f80efd62cc6c0f01e65ba7ccbdb99f0d8bd990decd8420aa2353f08e4e802278b76e7816a5d5c91543901f6c8f9c3", "votingAddress": "ASw3KgpMdwuCkJsJ6yEJuByStQr", "isValid": true},{"proRegTxHash": "3dd8780e8d531df4ac2cdedd54eb353992cd917fa36327383d294e90654fa420", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffffc17a9c64", "pubKeyOperator": "19fe7a9085ba63954e1ade5edd93059bb4c1ebcc9f7d12658ed1961dbe1e0ebe7ab2fce49d411c7be334d4d113c02b87", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "c9da9d1d38c9e69de67af3d9f3d3c219d1b17c6f2e56d09e3496ea09943e4e55", "confirmedHash": "d9b352abde7effc917bf1af7cd10a8d040c6a78871a191020e00000000000000", "service": "00000000000000000000ffff422a2101", "pubKeyOperator": "8032d79b37d385bdfc82c740c8bd16f52e2f951c196dd58b3e3e8f391f612658d825340df297f2d2d84e80417c8286d6", "votingAddress": "PXoRZUa8WpaB6kpj7ccwKckeeu5", "isValid": true},{"proRegTxHash": "57ba33b6822bae88342105d8df5ae48865229d2f1fa09ab3800a3e19408c0312", "confirmedHash": "635eda11ec6eaa35f268baab3264b860f5e863c94bc6fb3c1200000000000000", "service": "00000000000000000000ffff3359eea4", "pubKeyOperator": "152ec867e68775158c3c5821605d2cacffba7856fdceebae573d9bc5ac13b4f8a6647e3f66eb3d67b6b26760f476c539", "votingAddress": "CjSR9oUa11Kn5eAA2Awq7J9QEau", "isValid": true},{"proRegTxHash": "215b2514787e3adb62a17c2719f87dcaed946d3c9c571e93dbda7325c3f172a8", "confirmedHash": "e2c0169b4cd26a9f9d3010599507625bdc255f52fa9483521800000000000000", "service": "00000000000000000000ffff92b9837c", "pubKeyOperator": "0f088e81ec98c75ca12f89b0ed55b3c864a16766624e3d2881771bd1874a6bf53d6b5c62612f9897fa7df4768b5e3e59", "votingAddress": "3mie7RvCyZwRhzv9qBiReHgKu4dG", "isValid": true},{"proRegTxHash": "5631dfae376f9c1d108d7c5445360ab85a27e2776c5e159349bb4656ac7a35e6", "confirmedHash": "eaf2463e8a576011cf2dec6a71c7b77dcc1bc4054cc0bbed1c00000000000000", "service": "00000000000000000000ffff88f38e26", "pubKeyOperator": "9288eb223e2f32d7e4e381841d9b6628a830d2f19e54c79c18e163ce4a4d0d2e40160c291b8d8316a8c651a42f70a07b", "votingAddress": "45Gi3ikCAMM34BpeZmnWGcmurzcN", "isValid": true},{"proRegTxHash": "114533e419207be0ea97707e2f1fe99c3c6c594747122d19f30103d4181701cf", "confirmedHash": "f475109160142b7a3c9e88937ee42dddd0daeaf15eea728c1b00000000000000", "service": "00000000000000000000ffff50d3c5eb", "pubKeyOperator": "10f43c01376aa322ab767f14e32f87d049c80350fb655b23998436f59ba728ca679bc26c558d3121212900316546b0cd", "votingAddress": "4Q7rCR4LJEuMKoQr4pGLE4vdWUGS", "isValid": true},{"proRegTxHash": "0008858d870b0aa7967c39a551fc953e4e7fa602f19ba1fc805c218f87f41cb6", "confirmedHash": "8d187f99d4101de1d04d780a63e3b2935d5856dea9e205191200000000000000", "service": "00000000000000000000ffff12d65407", "pubKeyOperator": "04b672fff1708458c82de630083c8950cb826143e98c7cf4b83082c1bf1f6d5b69460c9f0f93f249ae97e0a235a0dc10", "votingAddress": "tK4dLLWJKLbWHb29gNLatTkPoDd", "isValid": true},{"proRegTxHash": "058a645ad3c0f571a35834056e6f7b103efffb6edb05c6b04435ea9f9ede8122", "confirmedHash": "a73df3c6a9633ca016170335ad8c7c1b3f42cc131e70a5bf2500000000000000", "service": "00000000000000000000ffffb280e58e", "pubKeyOperator": "87e9c1e89bb1960ddfaae8e26b9ea3ded2ca5aa5790968e2a9b3a08764f9888e7f2e628a88915b3e350d8ebddcd2692c", "votingAddress": "3Dv55bPwN18GuDE5eGUHxk3y26Tc", "isValid": true},{"proRegTxHash": "46fe156a03b458ee96e1993286d830922da6522ad1764c972932d4c72cf33cbd", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688e187", "pubKeyOperator": "10ec395339d1f9210316a1ba9be993a42536536fd910f4d4c1636f5badbc1761ab36154ab4347bbba96fa876383d9417", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "e65fecad84fbc81f866fe799cabc9fa2f29a9f393dcacdc782b19a295714f481", "confirmedHash": "a15fddf092fdf0484151f76d2b2ccee6620d9a8e9e75b4cd0f00000000000000", "service": "00000000000000000000ffff951c4fc7", "pubKeyOperator": "970ec27526148ab568f59bf045cdad70416b9df45dd2f9c77d36d2cfa16f51347d5a767d1e1ca8260856ee15ed5ffd7e", "votingAddress": "26HkgniSXRNWKjyXB5oPcPGzaG7e", "isValid": true},{"proRegTxHash": "434f10cdbeee76167829fb1e7762f2334e4da0a897e85e20340909cf95aeec37", "confirmedHash": "684178c25a5de77b3efb75710995a5c3319618e51c6cd8d51600000000000000", "service": "00000000000000000000ffff951c945a", "pubKeyOperator": "99d36aef0dac97efcfd2018b71286803718594a17bf77aba3bb9aec254da879feb6b10859abc784081d7e602b2b6dc63", "votingAddress": "4EpepUqbQ3TtCi9GXFsqz47b1vNX", "isValid": true},{"proRegTxHash": "6063f6b88f870aa4ad6a983b02cde9fdb8065e9f3740c70543dbf8bb4d2a0639", "confirmedHash": "60d516206b686f4383141d1a541f9b16d5ca4b9037f4cf6e1700000000000000", "service": "00000000000000000000ffffbca66292", "pubKeyOperator": "9269413512516c6613f423ab75059b7add78980cd33c854e630b2614923c361bc180aee5b879da47a631da1a9b42888f", "votingAddress": "jhAzVzbMrByGm17rvYJ1guGgufU", "isValid": false},{"proRegTxHash": "a4b8ea67bd455f3dcebfa0261a1dbb7f2af0f9d9f9ba2ecc35138afbd1dba91f", "confirmedHash": "5c2c7c249e17d812cc5f89e29f29998512f12aec729a798b1900000000000000", "service": "00000000000000000000ffff5fd93060", "pubKeyOperator": "0d8b775cbb384346567ee2632e97d7fb92c17fa7a49830aa8ddc621c87dc42e5291d52e728cb531c0413d6e7763ab065", "votingAddress": "49Ni9tHvkyijB4jnaKLoma3dwfGU", "isValid": true},{"proRegTxHash": "03541dbbe0b75087039c2681767571ba5cd7b5ad0e574e77513ca6c2642696f6", "confirmedHash": "e6f8029e47019962c4211a7d62ab875a7fc269ae1bc43b3f0600000000000000", "service": "00000000000000000000ffffa8775780", "pubKeyOperator": "8d15658d294b55063031f5a6d5291f00b4446b52afa3b26f27f8e0057c27c13f894ed5028ff0b86fcab3408517737bcb", "votingAddress": "4AMfG3nzkntFFABfWJVo3wQjL34w", "isValid": true},{"proRegTxHash": "5f2025551f5974a7e8345d6d48e035c1ef09543c46850c9210195ed6e9034aa7", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff84919f24", "pubKeyOperator": "92e21bd56af2442a6400da3bf95404df022eb1bf9d139359dd108149bde0825d8e6c25ea2b80b9af85b8734c3e59c2fc", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "a251e3965b476296b3e34f90c96eb6fefa78385098013b2727939c891a64b751", "confirmedHash": "d5156219a10f493bb81e918e8fa8acbfbc58157206bdb1f60300000000000000", "service": "00000000000000000000ffff55d1f154", "pubKeyOperator": "89133f89ff049d4da8cd3b718e7a10885aa332b31d83f102d184c3a33ab4f77b3faa39a0098443eadae470c3c5b5f9f0", "votingAddress": "3TP5m9TvSJecoYVenQhL4QDRACvP", "isValid": true},{"proRegTxHash": "5e80a259a7d0826ca69b5139b579bef150956e3b8b96fa1da0481907b82354d2", "confirmedHash": "a33a936fb8d05726f7210eae50c34a1a382c010ba02cb68a1700000000000000", "service": "00000000000000000000ffff55d1f169", "pubKeyOperator": "100286ddbcbee4f447e32bfb68a25f4796b67d86dd6c53f86b155d99127a788a0d591a070fb53f882d47e73611340a6a", "votingAddress": "2dHTxvLtscvmiq3j1dJtzzhozWTP", "isValid": true},{"proRegTxHash": "8a2d36ae324b022d65a54e95bb2dc0b98e328b113bff10696900b2579c491749", "confirmedHash": "74a7e681f40c0ed3da984741bb702716e6e278b0ca94442c2800000000000000", "service": "00000000000000000000ffffb9453478", "pubKeyOperator": "958f34e34c0b050cd3da0be731e40c88090ec6896581d70534334fd7de105d4b21270d9be5782ec9da634ba6e5dd85d7", "votingAddress": "3qaG74XjYdvwn8GXUS97hBFahpok", "isValid": true},{"proRegTxHash": "047a8905f617ef27cb6af22d0dadaf92dac9d44416d2acd75ff36775220315a3", "confirmedHash": "73586ae9fb558c8e399319a4c0afc58003d8c9c93c18a72a1200000000000000", "service": "00000000000000000000ffff032694f1", "pubKeyOperator": "148f7badefec781ed0e5c28985362dba230e471b358bba795422d352d654e9029d598981f2ecdd068460c5fb1cf67dae", "votingAddress": "27R55b51oUD47d8ceXoS2RvLz1kD", "isValid": true},{"proRegTxHash": "c05ee51d6e63e830da4f1470d41bee80b13750f23ce5968b9bdd7eaba4ea72bb", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b084", "pubKeyOperator": "0c4c52af30425c472f37b54b28888c14b0a1f03c8d5b624f6b84460d3b09801e91d8551ddfadf7ef01bc5b6e12e7c868", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "4f6fe7deeed014d40b8ebb1bcc71412b2224bc77946438b24db773d2100b6565", "confirmedHash": "1a32b20a911e7b69510382c7d714dd62235a1544240d34530400000000000000", "service": "00000000000000000000ffff17a30031", "pubKeyOperator": "122faaabfdb1d5922b496e95419b8a13007a05a7c3396ddccfe6be729808a669ca6d525e5b6171ae8e9dc4d561bf377b", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "2f22d099e71c051b1276c89bdf4394d5a62e8d049196ea3ce0f17dc205e5dabd", "confirmedHash": "a3dc13f6b99d9dad9ce7ff9753b17c106ea258e7cbebe8360700000000000000", "service": "00000000000000000000ffffbc28cd00", "pubKeyOperator": "8f88c1b4f3d8f658e66aa6cd78e6b422ffd67833c14ca3e9404d66f38d9c2d588c34d799465d47f50c30b7fe06302e6c", "votingAddress": "2wLCYchQMdovmcJ5jj2eHuBV1STf", "isValid": true},{"proRegTxHash": "9e0eeecf3a8e8be20005f0142a5960587e5755cde73335eebc885cb22f43df54", "confirmedHash": "91f4d02f97b7ed9c20739553d4d5c9b1b0350666283706a42700000000000000", "service": "00000000000000000000ffff2d2023aa", "pubKeyOperator": "87b9b39c92e2a0414eee1380234658943deea458398c5908a64d297ae1179646950747435a9a26135120c81c4dc731c1", "votingAddress": "4V3wMF6LM8b3pwTJFNSWYZSCHkgw", "isValid": true},{"proRegTxHash": "c0a96df48a181a158a2c8006481934448f4b51020211830834dffeb2f5033619", "confirmedHash": "f17712784dfebfc91e6e3a157e246ab73f16aa81546d92302000000000000000", "service": "00000000000000000000ffff6baafea0", "pubKeyOperator": "16ba343e2e3e9f7eff03451252d669fb8022c32011d7825509a8bcbfc15246e75a12fc41d36be143008c6be2ec3689c0", "votingAddress": "3Xn5QfePajjnwfNarfMLn877uKsg", "isValid": true},{"proRegTxHash": "b4e4565e4f25e691697be946c0c0651aa2589109407894d66bc441dc3840ec5b", "confirmedHash": "58cd2211d3576b50f2b46f0d6a3745b254b75da186f62be21800000000000000", "service": "00000000000000000000ffff55d1f25d", "pubKeyOperator": "96aad4f424fd2be1d8ab089dbf6a9883b38835bb1c4f0efb148708f5df54b188eac863accafe509129a2247c5b963989", "votingAddress": "3noHYHnrBLk78XqpNst3Rk8BHWd6", "isValid": false},{"proRegTxHash": "9347d330948f71c83fd638f6eef87fbfb799e5e47df5b6682901a285e45d9b93", "confirmedHash": "5c0d915ffb49d7f0b47f8a73e6801db19af99c248440047b0f00000000000000", "service": "00000000000000000000ffff94fb8806", "pubKeyOperator": "9143c6bb031f65b46933a9a050352746857f5c8bb921f1e73cbd7afb816c61d898ef2f72a65a8118ebfa2ec9f42828ab", "votingAddress": "3KJqnwp8DSzUb6nMsxww1L6XsreC", "isValid": false},{"proRegTxHash": "9a4737e245962a4de0c3488f074cc4cbf124aa42468bc01d3dd232a57396e592", "confirmedHash": "4626cbcf5a7250b0b20712ecb2779bcd1f5937592332eb880a00000000000000", "service": "00000000000000000000ffff8bb487c7", "pubKeyOperator": "86bef125318c66841b96feced92d4e911af82af4e0cc52973d7a6b3950f3cfa1e3af32741864397c95e6576a37f7613c", "votingAddress": "3Cq8LhoFcb2SwFLSE2aedv6kYbam", "isValid": true},{"proRegTxHash": "b58c2bf4d6d3891a4dcf967f93e5e98aa1b959d36d73d5699aad4566154bf90f", "confirmedHash": "17415463615ab5911377882fa2d05bf09acedec78ef5e99f2500000000000000", "service": "00000000000000000000ffff3e71ff04", "pubKeyOperator": "969aeb43c54f644029906795b5ba9113edf0eecd696a263bf94c45588097c92b93fa3147ce52c0ab662fe8dcc4075797", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "16e7175370f12ee91a8d00d3a0671f9630a5a814a4a29e9c949b6e8594b98fd8", "confirmedHash": "86c078eb8fe2613d573e52e70a7e8d37345148be0ec7fd5d1400000000000000", "service": "00000000000000000000ffffb9fce867", "pubKeyOperator": "08cb64eae0149046c2bd07922b6351c14fce5f2c1dd3113fde21dbcdb45e38629847257d9f1c22efd6ca0c04a36efd08", "votingAddress": "eGbXhYG313xENhZ9BNAsfqRsq3z", "isValid": true},{"proRegTxHash": "092b5f8107a309538bbd7c009b0c934c83c4912a9e919cdbcd2902ac7cb7aa52", "confirmedHash": "9379b73d17a311e77b0c92019c8f796bcdeb12978c9d88550900000000000000", "service": "00000000000000000000ffff87b53225", "pubKeyOperator": "0140574d6dc1c0c750e5c881ea7f116ad21b3b89f95944ed0c069bca3a91d95d1e682c46a42f71fdf570ce4de853e1d3", "votingAddress": "21iDTh4t2TVG24rUeyqVWLUw9HzC", "isValid": true},{"proRegTxHash": "41dd6ff1fd10e9b89eed5faadf80bfa4f4417714ef83e2a0a2b0146b34d1c254", "confirmedHash": "ebd42564915adc6b754b3ebfbd3393e6042b07d3cebafa8a1300000000000000", "service": "00000000000000000000ffffb23fec63", "pubKeyOperator": "914b6b5b8b3d95b3147ebc9a0bf9b66ffa0024839070fdf300cb3416df01e52b9f6c9d630d92350cdc992cb79bb89fee", "votingAddress": "tAzVkqeu7Af2S11WEwt6AWk9yzS", "isValid": true},{"proRegTxHash": "2b27c774f0776b5acb7a01bde76923a77d9a4299c42a7fcd0b6ed660a8d17ab2", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96887e81", "pubKeyOperator": "144e2de005a2aa34370866b1b083cdd838e1367e2c5796ee1eef7d027483009da3aca2d2518b9d00d40f15cbc80ee86e", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "ed1baf84b757e3f3902c62214512bda1eb3429df43aeee724b53f6e21713d8d0", "confirmedHash": "2a9b634ebddb5ce00d5098f3778cdf7bbe416a17a657cf140b00000000000000", "service": "00000000000000000000ffffbc2815eb", "pubKeyOperator": "8381e789c2446b8912b07c4d6fc95d8ca7578dec0f1d336c7a52f621ecc6cad36b9105d1e3173e76a65f9fa3a4d0b205", "votingAddress": "29UHXHPmN2hZ5itJXvU9nkgSjkNu", "isValid": true},{"proRegTxHash": "e2631c614b3fb8af0b622f7bf617fb06056738cbd046a131d6f186def544c11b", "confirmedHash": "196b5d6af5da3cd5a988f5ea0ebf2efdb68bf3fbfeea9cc00300000000000000", "service": "00000000000000000000ffffc11d393f", "pubKeyOperator": "94b94fa1e24a9dd749fce36ad738a8c6c8caae91f2e45636f21b11bdad75bb26c08e2ab9434f1109af87b3626f35cc26", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "1efb2d90c07ccea2fa3418f89c3c351bb7626f890670b7f27a6bd4239ad5b9e8", "confirmedHash": "a1c4e4958182fbba80b3177bca14b06996e592fc29d32d414100000000000000", "service": "00000000000000000000ffff52d31916", "pubKeyOperator": "95d3c42c3ac01e0410c2582654579bcdd2bb2036fc2b2e880a7ce44c538d56dda48b57c8ab4d1b285b5ce64f2505b732", "votingAddress": "2sn4xAAwrSiE7rsvPaZfYC2NSM86", "isValid": true},{"proRegTxHash": "458511901c6a9a47e80eff577414daf449100a5c38d50bab68f13d46e5591945", "confirmedHash": "d4c5106f0d969fd7a0ec148f3b56ef639b80e55fbc5a751b1a00000000000000", "service": "00000000000000000000ffff2d557528", "pubKeyOperator": "8538d58296efb817f9d5e6d5e685f04adc4f0d16e6a90b69fe31f8b4214de1c398bf5f60fa181557fd492ca3d8245e27", "votingAddress": "46s7TchXVpRJN2YAFQo6akaNNZFL", "isValid": true},{"proRegTxHash": "272b72cd25aac6f14afc49ce7b62e92f1866699c32b9a771ba3ee075e6cd3e80", "confirmedHash": "cf1e8d6a35577515b38eb62254d6259f261be04f35b7fad90800000000000000", "service": "00000000000000000000ffffa8eb5d31", "pubKeyOperator": "0cd6ca6c7e2c9d6d100db78101c33fab5cf58239fe363bac101b80b22995749421f3c06954efa04426801388f0d9b49a", "votingAddress": "2ZceykDzTXUMr59YKaZUwsKVWxSG", "isValid": true},{"proRegTxHash": "845552ae83319641abe7b1b4483aca4dd010e14d03f9f775390a8c3f92e1339f", "confirmedHash": "41eb25b3705258852abd5844a302f8bf2abdd35ba9e124e50f00000000000000", "service": "00000000000000000000ffff2578b822", "pubKeyOperator": "992e2cfe0659f5fbdfc552112925ce7709bbb2b04e2b7b45bdaa083b7658efc734194598af49149fa02ba4bdfd62141c", "votingAddress": "4GdX7Vt37x2v8xXvJLooztXQmUyJ", "isValid": true},{"proRegTxHash": "49e816991eda74484b969fe43a021427f260f0b94c8a22641728e6f954fb8787", "confirmedHash": "ec8d7116601fa908fd7dc58677950532f18bc3d616ba88991500000000000000", "service": "00000000000000000000ffffbc2815ef", "pubKeyOperator": "827e73dae855d342fd302721310a9979d58d92e5f1817fbe2cd817892c383d72076499a3ecf6db5321b77e0ca9125c18", "votingAddress": "ZWuhioveWFiiGc4gchuXMUSAqBj", "isValid": true},{"proRegTxHash": "70c3a20bb439b427e6c5517c64dc431d188a0ffa04bcff9da1f1110250bcedae", "confirmedHash": "b66ba86a783f8d88a44c9cea9f9835cdb3ce2d3a097a52002700000000000000", "service": "00000000000000000000ffff2d4c2cb6", "pubKeyOperator": "89da8f2b9e9d62cbdcf8dadf9c2e397caa1ddab2164bab477e78a52d6e5833c6b2678d00ed017f12e1cd01ad04e24a41", "votingAddress": "4EqV3DonQwYn6rFegL2qgBx1Cd23", "isValid": true},{"proRegTxHash": "a602ead0da8d8325313836fb269a064f5d2e73fb203ab1c95f72bd99c3b238d8", "confirmedHash": "29a009b5140be05c3e3e725befd88f27ab79726ae0567f971100000000000000", "service": "00000000000000000000ffffb23ec02a", "pubKeyOperator": "0842fbb05f2e52b17698e02c8c84fede045cf92ef6b9ec3cac3d83224820051e292fbaf23c029ecbbc46d9cb414f2ada", "votingAddress": "4C8zZ9hQ2CX2PiT1pfcPWtBYhtXC", "isValid": true},{"proRegTxHash": "8be9cb8430700dc6acdd27b839a01404875d87f894dff0de2c953c419678a24e", "confirmedHash": "16796389023ec085496ffdd3f6ba618430958cd3fd30e4281a00000000000000", "service": "00000000000000000000ffff0feb48fd", "pubKeyOperator": "0435753cd32a916ad051451ecee454139ca16cd7ef40a16d1a45b8816c53f9a7082e613b17aeafd3f2f02f31dd5d7118", "votingAddress": "3rTuocfVHg6K8PJp22xqqrRS5y6q", "isValid": true},{"proRegTxHash": "ff2dac7c5ca8516ee0e31eb6456d54a74f458a0202984f12174ea6882dd293f8", "confirmedHash": "f99e3a66357bcd146c6ed90be88b7eb826dce05c64387fd51a00000000000000", "service": "00000000000000000000ffffbc28fbd7", "pubKeyOperator": "89a733a3be676b9da9784fe1f34037b9f5905b19090f9ac27aae8b3557219961a0f54f4a5749bc6f0bbea628a28e71f4", "votingAddress": "36jtVpmZvzArNGEemn9Zqo31o3ZT", "isValid": true},{"proRegTxHash": "32197432547eb4cdfaa89e4a0a1a75b99b1093a34de02106fca4ff03cf153909", "confirmedHash": "62e6cefa4f13e012727361aa91736904b3dc1529440371c90e00000000000000", "service": "00000000000000000000ffff52d3199b", "pubKeyOperator": "98cd4ae45074ac70c832f588ebfb28961ee690fceb0be47a9be962eb8566a04406179bace0254e3ba605a3b03288ab8e", "votingAddress": "4XEv9GZnoCmxX4du4HzAhXAKpzPe", "isValid": true},{"proRegTxHash": "dfc80e0b0af9e669afc1c87d881fd858391a91e258bad106b6dec76693eaddd3", "confirmedHash": "196b5d6af5da3cd5a988f5ea0ebf2efdb68bf3fbfeea9cc00300000000000000", "service": "00000000000000000000ffff17e4e843", "pubKeyOperator": "132d5a7abd61180cdd71f092e32b84b3ba70fde01618aaacabe9633904e6959249e240e51a26de2aed0e5d07c2bfb75b", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "194414180822ba9aae0db02f36708ac0090add7f43db6c3f279adc30de9a8816", "confirmedHash": "f142219d724bdfab00024f3cbed54a68a5d2e022ccb528120500000000000000", "service": "00000000000000000000ffffb90536c9", "pubKeyOperator": "17cd31c59c1cc7a832130b97f8c650ac58ab6d39d8f412a01c939d49ad064a894bb2693108ebf7e843c837bb2bde5f34", "votingAddress": "umD8Cy6KcQ2CYHEhJE7uQbAjfLv", "isValid": true},{"proRegTxHash": "44536b0436362451d9a4ad5853bf404202bb4919863079f6636865f6e89c5ef0", "confirmedHash": "cda29b67ce0828b2618f89f898b47f3c596f0c080b42260c1700000000000000", "service": "00000000000000000000ffffd4186c53", "pubKeyOperator": "83e490194fb5a30747f2bea60cedfb61b437713edf8e81ebefc4ee8f30905de7e6912727298ba2036b81c4bf7c36cac7", "votingAddress": "44KBTr9AWwoonnLvQHEFj6LgQDbG", "isValid": false},{"proRegTxHash": "34ae2b86ba5e7cf20d7c3c1b5ca4700b77a8b5939a155a08860a2561a85b27d2", "confirmedHash": "1c8b4c37f5024071d2fd31f87f79d084309bfa2dce4c1f290600000000000000", "service": "00000000000000000000ffff82a2e172", "pubKeyOperator": "87c8a082fda5814f2c6760dcdb9ee43bd8058db09991c9ea459298006653d0e790825c33d9bcf4d814826621edb31677", "votingAddress": "QuzY53u2qcZDkQMhByUifeNBZKX", "isValid": true},{"proRegTxHash": "d1934e1da96606c6df85e3dc6298daaf48b2972fad594dfd80fe21f075a432a5", "confirmedHash": "ae106b4e448f5045d0fb397ce2093115cd3eed6227f868561100000000000000", "service": "00000000000000000000ffff9f597105", "pubKeyOperator": "802bf50260a119a62c7511b95017cf2486423ea8ac8d051cec2725a6b90bacebb10bb17f25d4c8aad3af5bb47daab72d", "votingAddress": "4Xg6qSpvzeTuBFTSeidKkQ25FUtc", "isValid": true},{"proRegTxHash": "66f749605b4526347c4af5ad94e530102fcf2bf14a4c7172cfc981943d75a5c2", "confirmedHash": "efc659e22a6c7e95ead4e691d04f33a4fc27ed07f9d8668f0b00000000000000", "service": "00000000000000000000ffff40e37814", "pubKeyOperator": "0b97cd3487a3ce1cb958093aecc532b348dbbfa0dbbc1b7037311feb75175d636ff10913472a28094d541f1952e5aa22", "votingAddress": "i3ZWNUeKjkGaAdhu1Q1VYy3y7Bw", "isValid": true},{"proRegTxHash": "ab1e7eaee845f19a6479c49ef16264056f651946ebe98a89d3d15e3e31ca1a66", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0ba", "pubKeyOperator": "8bdd8ed011adf4dcd8a012130bac2e96b5f71a81ded67b7b335357ab2a9a26acecccf108d9bcc1ebe14e141b0ce10408", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "52fbf403026739287fcb186a89b695d295060e0cfa116305dd625da34b8cafb0", "confirmedHash": "0b8efea2f3e20cf2843aa13e49bfc02b1556f0d4012501ba0b00000000000000", "service": "00000000000000000000ffffb280f3c2", "pubKeyOperator": "0081e4ac02e777fb31465936e39f1257187e266a16ed0a670ee1dcd4239ae345d581fe06cf2e87a233b054907529ba9f", "votingAddress": "MtrEpMRw8L99rCwKcqUZ4Mm6Ac7", "isValid": true},{"proRegTxHash": "0cfcf2d31fcd00f0c4f916d1c15037f14964ec9f00f4ebafeb63bf6bd6faf33f", "confirmedHash": "f50a3d1017b4c38182daa544d8681fc33f9872208b1995213e00000000000000", "service": "00000000000000000000ffff17146649", "pubKeyOperator": "0f8bb5a7c138b70f69c96fec54ebe8101314434a1c3ede53f61739564bd5cf4accc2ac64f66f33cd1cc77470dc99f16c", "votingAddress": "XN6zJ3EukMfnj16F42UoQ1HptGd", "isValid": true},{"proRegTxHash": "5aea060d28c994c59cf8ef25fa8907472db3af9434bc15fa553a2e3c66dbd049", "confirmedHash": "e3a7f0f74d9c457be02646248c65bd5c94cce33fef97212f1400000000000000", "service": "00000000000000000000ffffa87757c8", "pubKeyOperator": "8c01f5214a256388c7d499014c1251771edc0d775678a4536a5e84680831bb86c6b2906758ee7e24ad5082e7282d425c", "votingAddress": "2ExgoLQzkdLetBC45kfiA4JZvRiA", "isValid": true},{"proRegTxHash": "66a292d2d7d51b292db1eb73e7625e7d78faae5dd51ddaa9fea6558d32450709", "confirmedHash": "6a5e15a6654babe6fea0a9fc4bd0b704b270dbfd80a776e90e00000000000000", "service": "00000000000000000000ffff592fa46c", "pubKeyOperator": "837c9effd48a5c411183e502637aa4a31a6d317b2a9de8a409edf28b5c11dc367719354b1102a487b3b596f6fe52e7e8", "votingAddress": "fXaJNPZwDHx4S8VSJT82WrS7NRe", "isValid": false},{"proRegTxHash": "418dba7f76e69c7f84de9e3a040438518a08e541bd33b604f2f641774266c8a7", "confirmedHash": "e00b325a4a68df8a67c70bff60f552f374b4565f51a279e31400000000000000", "service": "00000000000000000000ffff2d38406b", "pubKeyOperator": "8e8abee19a0cd95478d437aa25460cd677e9e1c1724709a4807d86aca1db77b83f6571a20cde97312c558a6b5cd92bd9", "votingAddress": "2soKbCyFGKpkhjtHGAg9PfovRqH9", "isValid": true},{"proRegTxHash": "50fb9e2d35c1c64e2c434c60ed377d7d0a85d884619ef34bbbd1c96f76201c3f", "confirmedHash": "6cfb4a6e795a5469de9baec429e9c78e9c9768b09d14b2c30400000000000000", "service": "00000000000000000000ffff2d207cd2", "pubKeyOperator": "8a42a53c9e81ee86f6064f5cc3a53494dd7617e40dfc26a3229074824792c22041d7b9ccc9b4ec55dc6cdf3b9b20c630", "votingAddress": "4YgZTe7ohfRZ4d8Tq1mHp2xpheZ6", "isValid": true},{"proRegTxHash": "ad906bb493e4c2db8cc757a227644f89583d720114f8d105a97fc1fc14b6cc83", "confirmedHash": "67275c22573f09678a0f91dd9a3d1275714d2a6b9b7132072600000000000000", "service": "00000000000000000000ffff2d56a3a0", "pubKeyOperator": "8dd573605637b46e02e13d28188ed6bae3e34bce03951db830bbf1bf550dd5caaec34706bdfcb4274155edc222528cb8", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "d8e63124091426fef78f585e599a9e1774950332249da48d4ea80a779e66d3c0", "confirmedHash": "ce36e5522a4c547a07c5ded603da8ee6e8874709961b8f6f0800000000000000", "service": "00000000000000000000ffff258b1d42", "pubKeyOperator": "802cdeaa259db76ec4d23aebc6e012a65c7d53cb00a35686228ea4d170fd590d2dec213c841857655c2aeff0b5bd5fd5", "votingAddress": "p4YP5A8ML1sEXEn9LdcUGNzPME5", "isValid": false},{"proRegTxHash": "631e24ed12ad2a6538ca25ece47f64a4d32efd963e4c32f292558854ec7c9e4d", "confirmedHash": "cffbef032ba1ab095f15f551a29af139c1fcfa34a67491dc1900000000000000", "service": "00000000000000000000ffff55d1f106", "pubKeyOperator": "06461cd1cad6b0659bc9b2e066e550bc04a940dab682e3159262c6788e23b5d7636e7bbc8dba16f4d0835d598c6db2b7", "votingAddress": "2HzAYhCYgMtsBeDNHPAcsArFbAqq", "isValid": true},{"proRegTxHash": "f2c190ea2cbd9e3cef5846dfa5f4070104d9ee877fc5f95d5959f971a7b6cbd9", "confirmedHash": "73217b876df87745cb28af44351b2121c4ce142ab4d5a4a60b00000000000000", "service": "00000000000000000000ffff6bbf2f4c", "pubKeyOperator": "017c7ab255c609cb80029e883775095658cc97919f8cb20666c475154096d0ab68f5029859e10c0722b7b687ecd27273", "votingAddress": "47DaLSqMVdMoW1wKCcFFCKNq81Zm", "isValid": true},{"proRegTxHash": "0ee66f7f107869fa5dcb747eb7745c4207ccfa465efeaf5ce931861bcc32918b", "confirmedHash": "88a05bf7fcfe7bb6f051421ad6abbef061895858996ad6b60a00000000000000", "service": "00000000000000000000ffff55d1f189", "pubKeyOperator": "02c02a53cb66b84e8da1a1d134a4c7ab92e5eb93d0db3a9efb9dd54f6d875428fac15c44a2f189461f00ed67bb41459a", "votingAddress": "kT4YYX6f4DnxtCGGU78smxdbKxA", "isValid": true},{"proRegTxHash": "7ff2e7deafd629dd20d97a36eb698563c05fdddbe99a5119f6bbc8a2c6ac932b", "confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", "service": "00000000000000000000ffff9f45d5bb", "pubKeyOperator": "8b38eb72ffebbb44931cb580983a259e443d2f1ab9ba31c10c45b328ba9efe2a97563a1bf5a217067d341f32b0c6c0bd", "votingAddress": "2yo6xFrH4634koU12dpmLSRCz4jY", "isValid": false},{"proRegTxHash": "55af719f1c11a77e522aeb82ea436f4f434c7bb50ddc99ef61e3cf869d50a5ce", "confirmedHash": "834e9e6b307d52f98b459467939ced7f3f97c8effc114bdc3b00000000000000", "service": "00000000000000000000ffff91831c43", "pubKeyOperator": "0462c1c40b802dea057e27cd564c5fbc8601122ead64b79df959d401f1f4776c1b107563fd8c059b80b38122638abf1f", "votingAddress": "3VSktAAn73osDkfswWkRwmMJ71X2", "isValid": true},{"proRegTxHash": "08549fa80a8fad9c9ee6a197b43929c5afc6bf6dc5700349edffdaf0b4960e98", "confirmedHash": "36bf32e3d1a1e73e21f37d942926b61f17bca1725c4e98be0d00000000000000", "service": "00000000000000000000ffff3eabbe8a", "pubKeyOperator": "959f007b2b1614208f12c2d439bf2537299f0cb79e4d42a7ee31d2e2fb3c25b7aeb3248491010f69f34b259503224d1b", "votingAddress": "2Ny9GEwNGxbj1HdrRiMDRsVoW7EU", "isValid": true},{"proRegTxHash": "bef08d40a90f2a0736495bc59ae0bf7ccc5dc27adfb8b704ddbf19394438e22a", "confirmedHash": "db4b89252155240a5761c42d062cb2b52b7672b1accbd5cd1200000000000000", "service": "00000000000000000000ffff55d1f251", "pubKeyOperator": "14c40ccc9fb2ea92a4fc0b49f7d29d6e00d0a215fcbbbde4c1b0e51fa633b6c834327676f218a5f4a74196affb5770b4", "votingAddress": "2B4fM4X5CmLKmSnDnmeA6Uo5gSnE", "isValid": false},{"proRegTxHash": "be1654ede76d64340d85adb10b9867602af0153a0192a4661824e682bd10493f", "confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", "service": "00000000000000000000ffff87b558ca", "pubKeyOperator": "0c44d8aa26a036122c64895fe9fbe0074563b9135a135a99057d9977e9dfa01aaf622234eadd97f8fb56fbddded69814", "votingAddress": "2dHJAKtC7Gvu1i8J7GkTHkerPYvM", "isValid": false},{"proRegTxHash": "86847c8d251307392d4d0429fed87ff17f1dcf6debd59edcfe76b5f539b98755", "confirmedHash": "9f33e7836c51fb4803857a02d87ccd2b6f97488f33b25d0e1300000000000000", "service": "00000000000000000000ffff0888fb3c", "pubKeyOperator": "906bcdbcd1955f8e503855d5184f04f10f2b1ae5cf75064fd85aa5669efdffcc5b780618c7a668cc820a82d066486b5a", "votingAddress": "3KVKHjNPp1WpC3bwnw1ct7ZTNtdM", "isValid": false},{"proRegTxHash": "3b6721f3fa3a80e1712d90be181096448f9abe7e72fffec1dd3df131b43a988f", "confirmedHash": "778518d6fd7c30c1ea0272141c8873b5527621c6df2ccf133d00000000000000", "service": "00000000000000000000ffff4e2ef764", "pubKeyOperator": "983acbc2c600a6850d4191d52fb7aaf6c2d96f5e13a5a4a3e03c7381d2167d9b9b564d5aa39724792d5bb79a16bc5693", "votingAddress": "NuFTokdb9ETuVM7Qhk1AB6hRQo2", "isValid": true},{"proRegTxHash": "d7ed2d17ed54e1bf04d0b145ce6f97bb54b6d65001bb6a58baf3547fc631091c", "confirmedHash": "65941336b2ca38d50462d6efc9bd5c1a796d0f9e7bcf8cbf1200000000000000", "service": "00000000000000000000ffff55d1f1d3", "pubKeyOperator": "82400d21e7603ae4f2dd5cfd10c51b1b23564297419cbeda5041a427b907df925f70b51c842b3d01d691a88feec70e2c", "votingAddress": "3ttzkyiBw77vdG1uRiDPBaJmofUk", "isValid": true},{"proRegTxHash": "d0abe45d5524c9ce0398707d64638552ebf6d666a1ec056722afe5626fd88ece", "confirmedHash": "4a6daf127b168e882f067d5db59a5ad590d431af47f829a70f00000000000000", "service": "00000000000000000000ffffbc28fbc7", "pubKeyOperator": "118940acdd616600e812c4befecddcb099d853366987ee020905702495e59968982174b50128760592087ef499efc710", "votingAddress": "2ykAeqKjcu9PfmKfa5r495UzKqB7", "isValid": true},{"proRegTxHash": "88bf1c4c3e15be644f7be82ec3be2ad9a0fc4786372f064f45f0e69816e780c5", "confirmedHash": "5226e4a97317a7d21250d60f2e36eba8883e9ac41cf51a761300000000000000", "service": "00000000000000000000ffff5fb3f144", "pubKeyOperator": "987d2798ccfec27ef37b49224f8d46ce311e0a1ad5aabf4e65cc8830cc773f97652f47ccba52acdc0a21516fbb40ba47", "votingAddress": "3gd4VND8dQSYQxnRKi1vLTYWuzDu", "isValid": true},{"proRegTxHash": "b1cecd8d5508d86a0e23a998c272da00a35b257178b377ad66c0afc682e2d229", "confirmedHash": "7d5bdc08c7e185fd4ce0e76e0ffa22760534709f8c3d96782d00000000000000", "service": "00000000000000000000ffffb23e9fdb", "pubKeyOperator": "948fea6aae9145c85265710dfd17006871059c3c94c899785a53fcc0915918bdf09781a2309414355d26cbc8f067615a", "votingAddress": "4N8pQui6RaSuJHszQRQMCDDLVxJw", "isValid": true},{"proRegTxHash": "d1062bf4ab1137702f60ae95e2939f6b528d5431446b7c6c65e0f9254779d142", "confirmedHash": "77556ec306a9af8618cbfdba83d67557da957b8853936f7e1200000000000000", "service": "00000000000000000000ffffb23eacc3", "pubKeyOperator": "14763d91c47f39661197318786be4ff5cd763617389a1ee7d48f1da197d41f56e85b70dda052ffe43c73e9d469eb721e", "votingAddress": "3YyJSfoAK2fXC86Rctb4VpmDybCZ", "isValid": true},{"proRegTxHash": "046b6ffbf8bb38c97ec7eafefa418edc9e80b57a6091cce967b0002d6c2f4c99", "confirmedHash": "d8e4ecd6bda743b827bd115d041172410ea18d63f15e1f530700000000000000", "service": "00000000000000000000ffffbc28fbc3", "pubKeyOperator": "8b4bd11a11b940eb75110e0c5bd4f53e3774fc6b089d4812abf0fa944b91028d1f4161491801828bce72b8e56758755d", "votingAddress": "2NwSZ7TuQTLygGh6Fr1jKM86B1EL", "isValid": true},{"proRegTxHash": "9aa5ec5080443a6b04a9748150e6d54180dd65b773f847dfba9e0240214b1a95", "confirmedHash": "5f680c2bebccc7b722364e7e41377601c39874e2b4a7b2961800000000000000", "service": "00000000000000000000ffffb0df8b46", "pubKeyOperator": "8391bbb4eb6903654ef2c6d2774cc0d9f665e12e9ae0c2775aae7acf782b34a27dc5482a415706b7dc80820b671052be", "votingAddress": "m5HtSDWqFJnv2S3mnF4Yc6hzmmK", "isValid": false},{"proRegTxHash": "031c41d232f5448efb502ac36cf7aef7b350d6877097ca22cc63c9fe069f97e9", "confirmedHash": "245cd90a17cac504eeba8c0a12efc069c3e64bb42971ca2d2b00000000000000", "service": "00000000000000000000ffff8b3b04ac", "pubKeyOperator": "0cb72d4dd0ee253474f0d9435850ffe3fd7b94b2fdfa6a91072d0d5aa859d831b3e429244023c618ab82bc6b5cd154ad", "votingAddress": "SvZ89xYrADXVyaZ1xHUCeodWRUS", "isValid": true},{"proRegTxHash": "9c10cedb74e08a7f8ef933a6bfcbf646f9006d3025b6bd3314d13b1b63e7721a", "confirmedHash": "80f6ed208a88c29718f0fc157cce94c95ce6df42291b7b2b1700000000000000", "service": "00000000000000000000ffff68eeb07d", "pubKeyOperator": "86230e89575b73f17b2459324fe3eb802e2c03a354f9c050295facc1f64337226ea30ef992fa6830a3b7c17ef8ceda6b", "votingAddress": "FQGrANPvW6h7uzKmdcPVK28XiPi", "isValid": true},{"proRegTxHash": "dabc4ff75fef226635fedaa91b273afaf8e475587f812707e6f070988fd17937", "confirmedHash": "aa5a99c8ed59a52278524e01b094bb552800b10b3b4a693f2200000000000000", "service": "00000000000000000000ffff68f85af8", "pubKeyOperator": "0d7dcb21162ada05e561ad66234b36f6178587b1f38c051200911fd3e22c584ad368454ac90a3ec5c2d3a791419cd5e1", "votingAddress": "2VWad6KkVBFoXUW7BQQVfsjLKnbn", "isValid": true},{"proRegTxHash": "2a58dcfc501fd836cfd83f3959f073453cd0f9469d81ea924b8668822c04826f", "confirmedHash": "4a39a9f6dba557f4d1e6048c37501e0ee23b447ca112ab5f1800000000000000", "service": "00000000000000000000ffff36270a61", "pubKeyOperator": "04030afd2ec537dafbc383c88ed156208a2bba06214d7efaba8c8d772ff3d3a1105f4f389ff87d38f1413e9b25109d00", "votingAddress": "4TSSmZpg2w8CskLKHuJMTgZ1kgFU", "isValid": true},{"proRegTxHash": "85039b5d2ca73c5ea51076367b38a9685fe7f32e18561cc4b376183a5cd9e9b5", "confirmedHash": "f05d1db57b973664396c1ca333ba1d24f806cab4832553e00900000000000000", "service": "00000000000000000000ffff52d315a5", "pubKeyOperator": "0881f6f465294de57d35f1e406eddebb51d28b485ce3caee750c775f8cf76009ac8fc0e54030ddd23514a3f3daaa31b6", "votingAddress": "2Qd9Xw1kbCa1imLEy9D137CgcndU", "isValid": true},{"proRegTxHash": "1feefb334c7ebd26d6e5687530ffc11288f46490a5c9f20f0ebf9db7d5a2d5a9", "confirmedHash": "f4e56ed87cbf5c6439e89e656c3b7002d1183258e869aec21400000000000000", "service": "00000000000000000000ffff5eb0ecfc", "pubKeyOperator": "93323d3eec97b3b02577f9406739a3636486977426cebcbfcb8253eb90876b731f8e767ea4fe40807167fd61a280d797", "votingAddress": "2SECzJAFYsheP1iCch9fabQ2h1e7", "isValid": true},{"proRegTxHash": "eb5d90f0625797197403b8d4fd228ec4f5d0dadb1c0b544e4c0d736660fd192e", "confirmedHash": "74f025dacfb0c4a00ffc935f117697792ae2a0057c8674591700000000000000", "service": "00000000000000000000ffff52d3192d", "pubKeyOperator": "0f79935785167fb5b1885b8447546dd74c9b76b781dde9857c71438b32c9d138ec93ab722069112e700229f7076c74ce", "votingAddress": "2nESa3afkrko68MV7nfEGTU4LKAN", "isValid": true},{"proRegTxHash": "6aaf5c72fc4bc2292b3bdf92ddbec6fe1d012827ac0dc76785fe5ed828a7012d", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b06b", "pubKeyOperator": "0c5fd6a7292351092d719632d6d6c00cadd2c69e73ceac3df9b0a7746319d7f9a41e6c1417e2c7c9b126b6220b52acf8", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "89bbe96cbb89aceee1372c112b24efb859f6dc6941fcadbe7929cdfcfe27ee19", "confirmedHash": "6cea8c36eaaf9491fe7eb6d2055e2377d49f90e4af2641e20c00000000000000", "service": "00000000000000000000ffffb98ed490", "pubKeyOperator": "109982969cba295ed9cd43e908dcc3badf2e1c5397698ce611e42b404e4ecd41c752934ed6bcb07b0bcc26790688b7f9", "votingAddress": "49JHWXTGALzau7FTigGhtH2wAUhp", "isValid": true},{"proRegTxHash": "ad7ee87a8ee8cd8aa2901d5fb2db0e4cede8a3b9a11f1a30399c4f216dbdb0f7", "confirmedHash": "926c92598103e4f12bfa8fd8fe95737dc4e6303d12a67ce61300000000000000", "service": "00000000000000000000ffffd41864f8", "pubKeyOperator": "87cd1eac172b1fb108fb98ca70e58659da59fbf5ced7f1ebedf5ab838294e25814ce857daff97ebbe047d62d1f2c1ca3", "votingAddress": "M1fP2Qr3csCfQCCsrAarsrMfpoj", "isValid": true},{"proRegTxHash": "9d785f638a4e8d4bd79cdac0ed6a90023c22fb7b2666fb1fbeea22bdc2ab8277", "confirmedHash": "cf8bdd6305b9354d7a8cccae877393db461d1a22e6d4ab451600000000000000", "service": "00000000000000000000ffff2d4cae33", "pubKeyOperator": "1057603cbc0615f205dde6e7dfe68973733eef94e692aba2380a55bd0e1d179a65a1fe8f7d5b66f3168bdb62bfe60cc4", "votingAddress": "3pce4CjCVWkfwiYTbnFFUawyokJb", "isValid": true},{"proRegTxHash": "e8de4aa2c4eb514b97432ecaeda3a3fdbd4fec64137df7b36a3288b80bf4e470", "confirmedHash": "f31ab1359ae68c07bfbbf317e4a88589eea46f50d3e86e7f0e00000000000000", "service": "00000000000000000000ffff2d5b5ed9", "pubKeyOperator": "80ba0b03133ddad81e91ae6866b8f352f82d03351179322b3934e9897e2356ed8a05467e18654fce4ca2649f7874d60f", "votingAddress": "MCdxUmXVsRkGuorqRurNcqzmSL2", "isValid": true},{"proRegTxHash": "a8b40f5be2dbc326795a1c847769c10d214a56c7645cc51ebc51694e8a081f3a", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688eaaf", "pubKeyOperator": "01ee9f38c08f3cc381c7927c4077c7ecd09565594bb83a55bf088e0ef60a411aaa86368ad6610c05d079b21a85ad989c", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "3798aa3ed00d8af061a817795b59ff06ec31935459c019022b0e4bca2cb87403", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688ea11", "pubKeyOperator": "85fdb9112302997e108897f004b8f423437f912964f6fde0f6ed891a6fb90acb57fbbe048adf1d1a47b13f3c4a5c8536", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "29f05a097398d8806aa952c69fa724b0ffe53a6d7b27f8d227d4064264ab14f9", "confirmedHash": "e352b1f19966d28a14a505caa72b4e90d844f958c91257a60400000000000000", "service": "00000000000000000000ffffbc28b6d3", "pubKeyOperator": "94b605541d179ffb60ad538382c986110dc35b8cb8e859d0f7288c5c594bc0dde24a2bdf4178092eee532e0240ccd93e", "votingAddress": "32g64vkSDNYTd1RwBREojuKMqirj", "isValid": true},{"proRegTxHash": "861e46d654fc1c320e5e7b76085a0542e307744e6f30a36768bca40a79754f1b", "confirmedHash": "ce6fedf79934accff0148c34688da77a2530f0effcf9dae40900000000000000", "service": "00000000000000000000ffff5fd8a6e5", "pubKeyOperator": "9961a2df5a2a1a79fb810f748961c4970a5220dd0f3e7246f55d5eece6249f67758066087b17f837e365310ea80acf02", "votingAddress": "2kQATeQuvZsukC85bkQZu8uD9yP4", "isValid": true},{"proRegTxHash": "2a3080e912a750f3b055513cab099173694fa79e7b1b18ec58de5840880d7270", "confirmedHash": "421b37b16f952402223f71ca9c8c83bbcedd62e78196f4604000000000000000", "service": "00000000000000000000ffff2e04d9e7", "pubKeyOperator": "8708ffd0be3230df1b6d2fef8aa284437ec01cb7a40c82226ce2f0af06fc7c923d7ba8f9c87c86efc0c8bd0057aaff3a", "votingAddress": "3xQfkoggFULWLj95VnYft6W1EJgp", "isValid": true},{"proRegTxHash": "560fed2cc7f67be44c4c81fc82e2d514bd529af0d7332ba8cadf693644618be3", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6e39f", "pubKeyOperator": "80d8f28eed47b184a310b4511ab3fe0f268809f889b5360967db46038bd766266c6afe5fdb28893c302dd85a8679fb28", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "3ca69b36bb33149ff64cfe18f3f9e205efecd790cd16e0a0d5367501a00e9773", "confirmedHash": "97221bc903ddf56ff1e9309290fdb68039a800e677ed74cd1500000000000000", "service": "00000000000000000000ffff9fcb1cdb", "pubKeyOperator": "09bfa52fc9a9b1a92b93992c5fafda03f5840bc3711640b1235702a7fcad187725f3cca53aed29cafbb08a63bf1249e2", "votingAddress": "2YwF3iK4gKZWgysiyeWbGMVZiLr", "isValid": false},{"proRegTxHash": "428923d65b41e87a11837f3887965a5cfb29ba1453522644b338f312a0e665a8", "confirmedHash": "baabd814781e1e5098b3488021f389964be8e6a9f32449570000000000000000", "service": "00000000000000000000ffff2d55752a", "pubKeyOperator": "14fbf94255a7935f53568f8f0665ae4dbce603431b6b34db489725ba3280090dd293ab3953a3fccb8d0c51d65f293c81", "votingAddress": "AqNKhkaKGPG4t6juBEBErJpUYpe", "isValid": true},{"proRegTxHash": "36fccc2630a09bce9f649774617ab36321b41e689438be52ec3038aa42b644a3", "confirmedHash": "6a4faf2eafb31d6c24f25b65b1fd87a65aa4425930866a901100000000000000", "service": "00000000000000000000ffff2d4ced77", "pubKeyOperator": "8bd2e7d42a1db3aea9dae339352051d9f174d5e5b6863eb1b2c3e32153ce09f1b12ba4136d733d1ff2410558cb1d330d", "votingAddress": "22GKZVgSyFBgtvtF2qANknhSikvG", "isValid": false},{"proRegTxHash": "1a33449a6c9fb6660001233509cdb67d860383d1ade4ebda91178c0952a83c7c", "confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", "service": "00000000000000000000ffffc2875f59", "pubKeyOperator": "161cb3858fee597ad5393792d70db0c8aeb4c35ded31e7c3ca42be993e7a8811459788316bcf35f77799d8549675b03e", "votingAddress": "4WHJFzgTfrNHdeboSojwkbFp8jaQ", "isValid": false},{"proRegTxHash": "f78ba46c2b00fbd7a36bc8df566300ea14e85867957bc7bdf8dc4251a675e706", "confirmedHash": "926bafd5d8b19230ed4284d06829edf1b46dee2530f001821700000000000000", "service": "00000000000000000000ffff68ee9fc9", "pubKeyOperator": "12763adc88c89313e6a8fe3f95e5583302dd74bf3ad4186d519b587b2a474e50469e7cd089506558925ea459aa404934", "votingAddress": "Fi6RwgvP6fQy9fNF54GXD2suo9m", "isValid": true},{"proRegTxHash": "a88314f1a8fec789408f5bb8916430292d2865caad3b93a64849a8e66d66cb10", "confirmedHash": "f8a4771ea950a67b16b7e98733109321c435f0fbb2a831b20f00000000000000", "service": "00000000000000000000ffff5fd85423", "pubKeyOperator": "90b7dd7c99d5b3110f872b63dc8bbf1f1bb94284310206f58b878c71471c843297f106022b9167ed369f3c26c343c1da", "votingAddress": "2XQrcXaydquuWDV8MF8eitpxFXwY", "isValid": true},{"proRegTxHash": "ab16a35db1cbdf609f8b88c173f0d2dd469f502d3e30c5381865795b0e00d9c1", "confirmedHash": "5f680c2bebccc7b722364e7e41377601c39874e2b4a7b2961800000000000000", "service": "00000000000000000000ffffb9453422", "pubKeyOperator": "11e2864ed0de1ab74282d40aa026b3adbcf4899f2b3bde9b4081d39ecb8a9378211787308509daed26406e53cb34cf50", "votingAddress": "3Tetn1JRFuMLgYSa1LhxXbUQm2zK", "isValid": false},{"proRegTxHash": "668b3c407673664dbed9621bf28a46f99e668888dc77324e1a5644754e386c51", "confirmedHash": "cfa5c4fab60ece1bcb89c0432f69ab8551b2d0b451cee3460e00000000000000", "service": "00000000000000000000ffffbc28b847", "pubKeyOperator": "84b64ad2bf739f6ecfd9088d5616ae71ae96f3cda5f3a46f75b11afcb6f68c8f265b7fb83d52453af0c9eeb366139901", "votingAddress": "49LzbiwBitxcXhkb9fBCDiQS3i3D", "isValid": true},{"proRegTxHash": "909a3df4545a01c260d3bf1d26b012a94c0ac5b7b126393c69b0a7cfb6120cd3", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0d2", "pubKeyOperator": "1196ecf02128c5b910d0005a3f488561ce4bbb1705c59dc5252b84554fc00aac7ab29ba315f9cbbae1d5e5039e5dafc9", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "352df58598a7d7f0851cb04882460acdba43d5b8c4d6c7234309123e22bb0e4e", "confirmedHash": "037dda2412fcceaf8828e3244d10a55cbebfc93022a36eea0100000000000000", "service": "00000000000000000000ffffa516e01c", "pubKeyOperator": "0704c5f35bf5e5bde34391886bd2ca1db359171c09b72f750929a4da6b8d3d6a72385f504c67d3af107ff2095129801e", "votingAddress": "1cZnmN8kXbdSsV2gom6ejHmqBWt", "isValid": true},{"proRegTxHash": "dcf68c4d85b57f7a84bc3ff63994170508925909b4464163b2a3d75aa17a5245", "confirmedHash": "0cfaa787f2f37643addbd04088bd972961534ae2ebc6f4ae0a00000000000000", "service": "00000000000000000000ffff3326994d", "pubKeyOperator": "847a1d139dc7806f209c87d56c345ee6d2e4a15d49c1edb45e3e1539d1c76fb702363844c4e3fc8ac86a5d0c912e3686", "votingAddress": "3AWXrFQzeHM3ZJctn3zhjCkiyPF3", "isValid": true},{"proRegTxHash": "dc22fefcc33624fbe3803504432c8c268d915ff3d0a1aae072540679d87c4550", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96887cf8", "pubKeyOperator": "0b187eadab88caea04fd90a84389bbb99eb9f58f65bd29a3c7f2b1cdc02cd5ca2684f82d703130b97642abad95c369c2", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "49d297cc109a5483734bfc1fdb025cf8da14c570dbf6254ca4cca76e0a1bb682", "confirmedHash": "5f4ae1dc6498cdb33c0b060dfa714462564998cf6be9c1f12400000000000000", "service": "00000000000000000000ffff5f550193", "pubKeyOperator": "08af7220d9c42f6b7da6e2d301f084b915bf526d1c340a848303d92b3b57e7894d2717be6dd94a16cf4b8f94c03ad222", "votingAddress": "3UUVhkdG4ftRNnMbLirdNHmAAEap", "isValid": true},{"proRegTxHash": "9afab4f68cc14ede39ef563a6cf6b100900e5a5544df32bbc73e6f45abfd2fd6", "confirmedHash": "35d48cf31cbe503b11027cf8fd7bf57505b0fd27cd4cce041e00000000000000", "service": "00000000000000000000ffff52c409be", "pubKeyOperator": "104e92ca7a576374b8ac535a1b812fc4149ba677cf72f3a82dc386104dc9758764b0d6e58b65518a9aa47fac77accc5f", "votingAddress": "21Qjh8Mv33an5h3DsvkgTEUMBR3M", "isValid": false},{"proRegTxHash": "7ea804d4168b1135c7662e0a4d90880d2ea8964c12606ff6c3514bcc7ff76581", "confirmedHash": "15cb7b5489396dc7cdb179f5401443a16f678e034946b78c0500000000000000", "service": "00000000000000000000ffffa161407b", "pubKeyOperator": "86b49ff47584425ee1d0c230b11972c7761f167db6c39dcaedf2151e850d499daf8fe31eca142c798fedeb2a725c18c8", "votingAddress": "32k6ZQCmGGyQKG47KHPVWxyCgtfk", "isValid": true},{"proRegTxHash": "873bc7247d27df00f4c8d74c0e297403af0c0c07d857d127cfb1d1982feb0a76", "confirmedHash": "b7f0de186b7ab32f07b4231120fbda2714d0640e693612971b00000000000000", "service": "00000000000000000000ffffb951a50e", "pubKeyOperator": "9288c0469175963758b19d606f495e4325182b4185bff755dc3f03323129e3f82638a19553adfb63b3270be245e7d6e8", "votingAddress": "2KBcPrxwNYWhu3C22PeGkKb98YPy", "isValid": true},{"proRegTxHash": "2067cb20825711c5d899430a246de655dfd447bfe8c6b8acad4348690dc4895f", "confirmedHash": "61ca5a7856fd66dce5059c77c2076f96cfac0a98d01ad4531800000000000000", "service": "00000000000000000000ffff55d1f250", "pubKeyOperator": "12eb31fb3c5b861533c1a82a10dbc9e8d4ae6b6e47193fde850f260ac21fe8adfbe2e9dfc1e76239f09c34cc886a5a9b", "votingAddress": "2cVWUM4DTduwQk7tX9A2rxazXjg3", "isValid": false},{"proRegTxHash": "01a9810a299263b05ba5a1bb9e14e2c191d69266674830be9bc8fe721224c101", "confirmedHash": "920937bda7136ac1501889e859206df65452f8b309cb278a0a00000000000000", "service": "00000000000000000000ffffb23eece9", "pubKeyOperator": "059d940595f7e275f2a2c64b55b4e29c99b9db41c6cb949bb57d86a6890c598f9cccdca3f3e8bb4bd482d3621322ea9e", "votingAddress": "CxcRQFw7xxf2Egy9GCeVHYx8mT7", "isValid": true},{"proRegTxHash": "f4ca7bc7c9865579789648c6aec9b3900aa67d1140b91e63885de41dfe79af39", "confirmedHash": "bed37d65375b1fc71d5dbbe0a20a728ca0b30e590bd1cca70f00000000000000", "service": "00000000000000000000ffff2e04d9e8", "pubKeyOperator": "082192c1f6ebb688d62d3b512edaa7d7ee8a9e90075d04dda0428b9270a04349492a2ac38d01fcae9a1887cf66b04930", "votingAddress": "2fxBiksvs4pfkmiorVDzDA369kox", "isValid": true},{"proRegTxHash": "633d6fd05391ffbd17844b9500c6f2cded3f733cb82b8f354eb0c51b296ff5a1", "confirmedHash": "a3de1313fa2f1d6abf38fb4bf36c30ee3a26d79176abee120e00000000000000", "service": "00000000000000000000ffff86d11c23", "pubKeyOperator": "95b51537fe3c7a446412ca9ebf8ee287e7b3264ac26648d65a86abf55df8fa314c1c2746f6157c1aca502a4674ddac90", "votingAddress": "4BV53u2nDzKVf7gQb8FmebZoroVE", "isValid": true},{"proRegTxHash": "38d9a8e0027c2a24e80881802dc530db90af37bb44e316440b5680bb7c28a0d0", "confirmedHash": "7b0b01497bb3943e3ecada5060932d0a0cce6546346c9db01900000000000000", "service": "00000000000000000000ffff87b5349f", "pubKeyOperator": "08b10c128667ddb112aef836a07fd5f6decf7c05561e5b7b049ff7c348c1ee124a7c9462ee00c074e8923a135fc020d2", "votingAddress": "3PzHFPgnPpcvDsiVSwkYxT9ar9vj", "isValid": true},{"proRegTxHash": "2bcac5ffe301bdfb01f222a523c84d987dbce6474914521d8eb5b9aac69666ef", "confirmedHash": "303dba0a3629e1e3012386c30feb876aef34c3d4bb4e52b61000000000000000", "service": "00000000000000000000ffffbc28cd13", "pubKeyOperator": "0a64052c9b9543ee0d8e6f19f92687cc411addd1d3103433ab002b288c061a59ad4371b96d15dc2ed1f129e5cef4874d", "votingAddress": "23u9jwAisNyvpo1BJptRZphyNjMj", "isValid": true},{"proRegTxHash": "c22ae5af6d73191384c92022458575ef744c14468ef7326ac8890aa0102331db", "confirmedHash": "ba70cfb6393d45a2be3efd11943f0529eceff0cd65061c6d1300000000000000", "service": "00000000000000000000ffff8b3bae02", "pubKeyOperator": "8d9b75658d1cf91484b821fdbf84fbac99e196df62c2d694c769c4605eb7547a3bffaf799bd7ab9b01f890823001ffdd", "votingAddress": "4KzUstfyQoSSSHoEQKZAqa7xnymg", "isValid": true},{"proRegTxHash": "6cca0b5a3b2986e9d96688c87f46da96a3a78520067007ffe57322cb73c53edb", "confirmedHash": "a773d7618d3bac7c35da6a8f36102b48f9b154b866d311620b00000000000000", "service": "00000000000000000000ffff5fd8e665", "pubKeyOperator": "90056a306be3308a2a92623f1dbe6241f316c7c4a5c5be2461b0bb7eaaaa5f20218a4683fcd01d26340a42d9a69f62ae", "votingAddress": "cCvCLSLxKJhEyND912eWyt4MiE3", "isValid": true},{"proRegTxHash": "2accc5f2e9d01eb91a46e79a378223f37a8755fc12c0ed282feb3eb76d557db1", "confirmedHash": "6da3843651ca77cbe80d6285bfdc9cfdeb2f7b47d9c51b790300000000000000", "service": "00000000000000000000ffff52d31530", "pubKeyOperator": "819d7a48c62b58caae68bd7a9d552b01cb42951bdfac8bec0ebb65a00f1523c7b81f47df307027c0688b208c5cb84df3", "votingAddress": "3Ej9HYgtsiT9iESMJ7FUVaHR9kXL", "isValid": true},{"proRegTxHash": "351acc17c43e7d939309f70085e7e968b396a8160d84ec0d88e00553df0a63aa", "confirmedHash": "7ee01063fca25b0eb55e3da95a43450dd828687e080c4baa1500000000000000", "service": "00000000000000000000ffffbc2815f3", "pubKeyOperator": "1960e7a8b3ae22b3332b7b8b3abc5cc973e55c57e084bb304dfa81220a4954c855cc3149856df1abcfa9097ac6fb44b4", "votingAddress": "2sRYuDBPnk72FjHqtz1wDTBQ2zdv", "isValid": true},{"proRegTxHash": "2efec8906cd476adf763fdddf8467f6ce1493974181ee430b8d34fd6c895c9e8", "confirmedHash": "a230db350a0d6cf720181303831d2316eba4d5166f7ce8ec0100000000000000", "service": "00000000000000000000ffff3e4d9ef4", "pubKeyOperator": "8547f004c5882d374ee32a2a8e5a5746f04a494b80bc12fd987ef28cfa279e1080476c6f25602b868be1bf9aed22bba7", "votingAddress": "3XUFwbHcWyL2LE4PFmAwehaYX5U7", "isValid": false},{"proRegTxHash": "d14fecfbcf85936937f7fd5a40d160164dbb736b29f9a869be7535c6b6e60fd0", "confirmedHash": "f63d21db43b34bc795b2366c913c60485d28692fd4ceb7fd1700000000000000", "service": "00000000000000000000ffffa87757c0", "pubKeyOperator": "8cff5757b16497f58cb66912e3f97461d4d2bb83cf2a34015918af8d4ab7da912ac116d4d6d835a4020f5e9732ee73a0", "votingAddress": "3QW1SPNXjM7x7jEyb4ZbPqyAhKch", "isValid": true},{"proRegTxHash": "5cb6135207709273bd75f50980eaf184c0c1c1c0da9bb97f35bce91117a61467", "confirmedHash": "1f8cf116dc9b5051e265e0838e9b1fd62ba32ab0a155d9350700000000000000", "service": "00000000000000000000ffff05b5ca14", "pubKeyOperator": "05cfd146d476d1840c523c4f024e88e35c41df552f8135cce9c81b27856d42479c6ba4772e3b4de35cdfbcddeab4e507", "votingAddress": "3P3tj1apR9S7nKd2YdwhMsZkRvx4", "isValid": true},{"proRegTxHash": "a8a5d8481a2bab0fda97fba2c357a404894070ee6b85f61f235de3a05d8f6fe9", "confirmedHash": "772f3d1556b293194f3898274545b9a9a2f1271fd6cd5b630700000000000000", "service": "00000000000000000000ffff55d1f17b", "pubKeyOperator": "0f6d37a0d3dcab2c7caef84b0919dafe52c0a85da4ea51dccc51f58d33b51f439b75c98da213311d748d2b744f791c2a", "votingAddress": "46WLufKiSWnEzzpXhEvMoR4d2sbz", "isValid": false},{"proRegTxHash": "f48c982069746ebde78199d84b567e780dca5648a44f3485fbfb396bc04542ae", "confirmedHash": "226cd8f2ddbdcac768bf3ece2d964b6ce5628ed1edb582841400000000000000", "service": "00000000000000000000ffffb9af9e28", "pubKeyOperator": "0cca215e582847aee1d20544e6e2bb9eabbca756b04b8a8561af5ca3d33ed3d54642ac778e0e86350fb711f09b0501e7", "votingAddress": "2CcVhbQ3mgMioFNE7DD4ob6fBRe2", "isValid": true},{"proRegTxHash": "f847a8ae9a77464f0d019b46d25a84a48c0c3af001606222b33892c6400ea880", "confirmedHash": "154f3fad77ca27289e27591c007f1ce0aaec09c566f458242300000000000000", "service": "00000000000000000000ffffb90536a6", "pubKeyOperator": "0299e8c2d20fd211b62458335591986797b3b1a6422d86feab5ddc05eac0da86a312edc4b53287e86f3f320cf96188cb", "votingAddress": "4KbW4qA8S1wCMov5T5QMVdngRc3o", "isValid": true},{"proRegTxHash": "3166f732ddb11992e3b442f05cfe98bf52c3b592f1a6cef81d42f2c97e972748", "confirmedHash": "b06a94420aa80220781f4e2e88298985285d7b9166a5e9ca0000000000000000", "service": "00000000000000000000ffff2561e315", "pubKeyOperator": "939ec638b3a17c21d19c89127c3a2786141a8447bcad76ef25294e3287ad31a03b4e221ec2ade9c749e97ac1953a58e8", "votingAddress": "2AZkJsgGpqejWx7BJeTGyGJ4ZVCk", "isValid": true},{"proRegTxHash": "abdcd0d3db693666fcb87adacb24d768449f27787593e4adee48c17a21a033f4", "confirmedHash": "8d4a6cb31265062c2575854738dd8bf43bbf520a87b0866c0200000000000000", "service": "00000000000000000000ffff03d2fb9a", "pubKeyOperator": "11a6ffd5fa0d02c3f04d73b72e20e970c1d3fc10f210ceba4129409b22160a20bf6f9b24a43742b3451582c3ca1b3e9f", "votingAddress": "xECQRgcu5rb9vwFsx9tpXKqwU2Z", "isValid": true},{"proRegTxHash": "bc2ccda2f331ab688a5145ada42cd94722194d16041d266ddd99a7c3b471702b", "confirmedHash": "1d6fedff169df03a36a10c4c834acb785692ec120538e2770f00000000000000", "service": "00000000000000000000ffff2d206869", "pubKeyOperator": "065470795d73d66a5273893df0b2768b101bee5ebd709c739b72bbc64752272fed7f5daf6b3dffe3679941f9278a0cf4", "votingAddress": "Fs3bmmx9XrM1BhBoFzMe3WV321x", "isValid": true},{"proRegTxHash": "562d83167b29e29c661130e0e70cc3aabe3dfa8ebcb72ebb0b1e560b92527ffa", "confirmedHash": "26947752c9b552855d4ee180e6c26b8242bdb50b8abcbcfd3500000000000000", "service": "00000000000000000000ffffadf905d1", "pubKeyOperator": "90b8fd737e346f99c4d07f7b092f4795df54b058e4376d64800fa2585097e1514257806f75cb1c648b8e5b0ad7aa86e7", "votingAddress": "2zBxeVFVsEZnnUabdu9buDt95HCk", "isValid": true},{"proRegTxHash": "5dfa6e4e2a1cc9679d88df8b0b3abe38bf4522647a22f6ad122e0e4109c2bec3", "confirmedHash": "848d0ea6d1a6a63c4d14be50704b33e4e9c503d0d91c81690500000000000000", "service": "00000000000000000000ffff867a3d8b", "pubKeyOperator": "8659dcb618293ebb37b1511d73c32ac76cedbd8f37fb933e9eafe8bfc09d211d16584f30611b7f7aee54e2820a9432cc", "votingAddress": "2jNz9NcTguo7cBGw6keS7j1NTMzN", "isValid": true},{"proRegTxHash": "1400d0ffb5e6ed47e8a2b4716e9b68f5db784145a96b9f10ce41d4d028bb7af7", "confirmedHash": "ab25b4d2afe1c56f9b33733608b170a3b2b23c76b6e934012900000000000000", "service": "00000000000000000000ffffa8775787", "pubKeyOperator": "12a20dd3e82fa9774007bd84c9ca78c69e07416359e9e0d6bec9e3fff415d7676dad61344f7159fac27e62a6e801d5fc", "votingAddress": "2g3UUSMjQDrSD5BSu5Ewpjkyiuen", "isValid": true},{"proRegTxHash": "49e27420f86d2b6f48b847ba4734a8636f119e895e48fe59381c8dfabeb2adc6", "confirmedHash": "159d6c679927f79aca6561e0d43e0edd42b592cc3d3cf0b42100000000000000", "service": "00000000000000000000ffff258b1a54", "pubKeyOperator": "8e0f86604db2648066600e79cbe86f3dc9f14e86c45729d944e62309f9d965c50223caa96aa7c0bb30105c648bd0bb97", "votingAddress": "4Qq9AiDv2DQ8idw4Pv2ZgHm6ww3E", "isValid": false},{"proRegTxHash": "5a7178cbe3b812c5304216a59bf4ee2d01a9447df39a9685b98271a50514c75d", "confirmedHash": "7402acbef2029a7d64012a36f0c3d866f374fc6a78270be92900000000000000", "service": "00000000000000000000ffff2d3f6274", "pubKeyOperator": "0426933a053e68888f5c52e747dae5b958035dc39bea6b54c8af86cdfa90705519f8babe8ac085fc877e2bc83c3025d8", "votingAddress": "kvVSZEHckgxWGPgwM488mkEGui3", "isValid": true},{"proRegTxHash": "42b479cbe642b7321ce0cdeeaa35e25f23fef0eeb81435afba7507038f2881e6", "confirmedHash": "8b0d7e904626194397804b5e090b115eab807b2fc5dd314a2300000000000000", "service": "00000000000000000000ffff867a2614", "pubKeyOperator": "00ca402515cc7cc8ae8e69c8f5ac398da686cefeff5ed78556cfe0ab6bc91a67164da7d1a75be2c7f1af24bcf34ce10d", "votingAddress": "3aC6HjSNfdjeDk33WaXGT4j9Q6VG", "isValid": true},{"proRegTxHash": "8ea734e1f78f803fe3f380f38f63b642ca3af76853f343265bfd7e02102f33de", "confirmedHash": "294288135bd6e432d04d208f6de3d04cc9f2e788bc731f2e1400000000000000", "service": "00000000000000000000ffff8b3b9c1b", "pubKeyOperator": "105c1124139463c51caac8c9a056803166989f2f8db58a44d43d371098b845f9c5f9f4d1f9a5d169c155e5f6cf27020c", "votingAddress": "32hke2NLbSJnnNM22DyPMJvmnaNZ", "isValid": true},{"proRegTxHash": "b49999d29330a6fdc0c3198cedc7c192153e756cde2d1d5b8b2ec0720eac5804", "confirmedHash": "ba786af4c205544d07f5ad3643af93f6b030eabde964f3ee1900000000000000", "service": "00000000000000000000ffff416c3842", "pubKeyOperator": "850704c9e86fc8e98d3a809554fae81e08ef368058183cc32d7a6346da6cad2c369345edffb2879f22a7a290dabdb385", "votingAddress": "2hMLmVvHbUXipNN9aYSrzTaboFWK", "isValid": true},{"proRegTxHash": "7cd97c56589465e3f86bf98fa41f35903e7a13f2fb744e98cd19b9f1a0bc4628", "confirmedHash": "0eac18c848b2ef195fb05f44159f3ab249b951ed0a7945cd0f00000000000000", "service": "00000000000000000000ffffa8775785", "pubKeyOperator": "0e6723c137cbe0de445df186ac3955adad08977f45a2f0a660d3a12226f7b5a43ae727607f1ac072d0c80a58ca6a39b7", "votingAddress": "2qrqAvJT7CXkgUtaEK9W8iDLXa68", "isValid": true},{"proRegTxHash": "389418f7676d78b1227f6a7b8df9d41ee717c99d3ad99b5459229a155e6a42bf", "confirmedHash": "cf1d4eb85a4344016a2355bcf376a3e89859cdf6295e5dda0a00000000000000", "service": "00000000000000000000ffffc6c77055", "pubKeyOperator": "95863db0fa7d65755ac5dc3b063b0e171afdb57b6bcd889221a9af79cd0ebcdd93a6471043e32778c1a9a4818065312f", "votingAddress": "4QGukmYgWNaV3fw7aNCL6W8KnQ7j", "isValid": false},{"proRegTxHash": "d3b5ac925b9acb1213b6f888f83c4011dd37923a56827f0f0ea9351200ab2812", "confirmedHash": "cdbeebc4a3580b1d894014dcafb37c7472a5131b33ac100e0100000000000000", "service": "00000000000000000000ffff3e4d981c", "pubKeyOperator": "09e107c7cf4f63a00322167112f63018ddb2cc5a8b8ddd1cff29feed98499f77088296830e6687c08f8a7fdcf3e0b05f", "votingAddress": "38a36fFHRphkyD2f3LqNXdK5YLT3", "isValid": false},{"proRegTxHash": "6acadd599ea315d20ac2d9d98627b772e2b9b4fab214c98e5d7422bfcfa83443", "confirmedHash": "b2c65622a278328dec2cbb46e3d3215181ad1986c6b6688f0200000000000000", "service": "00000000000000000000ffff8e5d2604", "pubKeyOperator": "827b37a38091c5a6a2c4d338389e7591fbb36c14b3fb5bd245fe4783f32947e8764adb58824631c8c52c50ba3bab50d1", "votingAddress": "3ATz463tuireTrPw3JUzTcobGXfT", "isValid": true},{"proRegTxHash": "897e3f5a8fd41b4537fbb1c26049e85471935ea58080377afed8c287267c408d", "confirmedHash": "a2b8b9cccdc9f07082ad189a7afec6c2663101280a2d6c623d00000000000000", "service": "00000000000000000000ffff44b745f3", "pubKeyOperator": "16fcfbe2b1516a2438d0dbd03c0cb3e75db7eb6b7317b692871a043217063e97ef6a769b2141cc5ff1b1b5c8613b4b0d", "votingAddress": "5crXhuWKMRGgh4PTDcaEhZ6M2Bm", "isValid": true},{"proRegTxHash": "21b9ef566d6fa6d5b95a2d96d790aab2624520bfc383330fe1d7766f0c1016d3", "confirmedHash": "c05d887d39940df40d77594c3dbeded39fe833a0fbb15d6b0300000000000000", "service": "00000000000000000000ffff87b5084c", "pubKeyOperator": "920605a906f2093b57710c1afc3b4e9b65b322f2fb1c051d961ebdf32481051f64955b6646409cf9e7b379cfbc5b56a0", "votingAddress": "X2jGciBycXiPtaQY78vKoGi5q5c", "isValid": true},{"proRegTxHash": "f4c608dbb9d3f09826ee9e38fa54c1bc854db0962a11e2e238dbf4eb20d55f6d", "confirmedHash": "7999c0a5edd8b830062e0a6e1318bfde7f933ae548c1c3011600000000000000", "service": "00000000000000000000ffff9f59ac5f", "pubKeyOperator": "1720d8f48359ebc536fcc3be90e1de4f39c1dc111f718dbef77cf60a351978274ed98c8c966dbbf89bb0281528d7946f", "votingAddress": "nJQdDicnaUDzG4XJ96aZXu7UgMR", "isValid": true},{"proRegTxHash": "65a49ade0346dfaaf3f6ef943771b868cccd38685f65727bac189222e81a0843", "confirmedHash": "679536094fb62fd5f1da917c2d55f9caac98e17f5f41f5400900000000000000", "service": "00000000000000000000ffffd4186688", "pubKeyOperator": "0bc5441807edcdfcd7cb6ce590d25d07cf10b72ff92c3a31e134b852b01afb32d597d667a58e76af7a47febb9c099b7b", "votingAddress": "4KSYNLVCUT3tUK6XiKNWJUAMbMsz", "isValid": true},{"proRegTxHash": "ad534a71c392edd0a7bb344e44179ba8a009895f6b238dbbf6f1a0086e431e80", "confirmedHash": "bd31f35c5cedbf07c6ffa716f2a3acf8f725ab42af8758740500000000000000", "service": "00000000000000000000ffffb9e4539f", "pubKeyOperator": "05a6d65c3b220b06e553331728fc43a277ac1b07762d4be76916e898fadf76563d9a9a34a8d93d43962d6e7a879d8af0", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "bd257196d8996a6128c1933096f1b9f14b31831710bc10b2b9e2da7587454040", "confirmedHash": "245d2aa1f746068da867c375cda4d963bb09e0fd9621fb752e00000000000000", "service": "00000000000000000000ffff5fb3bed0", "pubKeyOperator": "10f912e265e3865b0ca0e7a8514616f541d2526e493212d0e82218f2ec7abce09eeb0316d165cdf006dfb596b37380d9", "votingAddress": "H6irCdv9HdDoMVqhgkgnieRZSY6", "isValid": true},{"proRegTxHash": "404428f82dfecd80d87ce7cd6d823829944f3e057366e290bee4887fa260ecb2", "confirmedHash": "98dc052d322809046515bfed84dbc857b2cf48f1aa3ebfcd1a00000000000000", "service": "00000000000000000000ffff5fb3e5b5", "pubKeyOperator": "145860e681f8b96d77bf4e26352ad20a7b01674776b77404027794b36c2805ec534cda8f0d052afe23e94b6ccd48f3c8", "votingAddress": "32PV5wZrjMGxfqgP8dCYxeyp9UJ2", "isValid": true},{"proRegTxHash": "8ed16bc59cb74e77d2d20500162c8b646a74f5d4e00e4053de7e479b3b109a5e", "confirmedHash": "0af85f472932784ec1b4bd6b6077765be28d84d4b0b1bf040900000000000000", "service": "00000000000000000000ffff87b599dd", "pubKeyOperator": "0efa31b75969bd481c7b539d5e2e881c603ac7ecb4d4275e89bc836718126f422292c7961a98a8a8c489b75c76ab62dd", "votingAddress": "3SRT6aeGuVz5kdQX57amw63XypT1", "isValid": true},{"proRegTxHash": "99f9bf4c6f3a69a3b17f5ffa4c55acc5c1c31bc2ee93dd5c8700b775d61a1a32", "confirmedHash": "2167e261f494a72423754c17a99ea24b633831c049be2de90a00000000000000", "service": "00000000000000000000ffffd4186b6a", "pubKeyOperator": "8db3056b5db9406d4762ceaefe9b06ab4a6a1bec369e60afdcc07545341a0f9f0c52ff6a7e0cee6397def0afc8140f52", "votingAddress": "49iit1urqoCFfx4oowoRyyHsCGuA", "isValid": true},{"proRegTxHash": "d689eaf7bfdd626a822359f02a0c466d25bafcd7944b5d8e63c7516aa705c142", "confirmedHash": "aef6ce4203bc3d19e0ab00bf4f1ea1178ad5094bf30cb7052200000000000000", "service": "00000000000000000000ffffb9e45354", "pubKeyOperator": "0e89e74ab7ca34eaacb9d0170111ded16a5ca19afc47624aa1b4b3841d77cfa012ef094a032ecf8a016988bc30e45f87", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "0d15072419023012ad65e6ef5d51264a01f4c6af64486d1c71a631ca0302bf6b", "confirmedHash": "52745b86c8db85aeacf4d338781f19f31a723b3d24f6a80d0a00000000000000", "service": "00000000000000000000ffff22e8d660", "pubKeyOperator": "0fc27152a0777d2c578654c8bb0e4550f3f17ca0e1eea363a4bb36b87864e390b6a7501ae6778af28d7fd4815125fb10", "votingAddress": "2G6kEornFaHEwFFrGcgX3wHYJYgv", "isValid": true},{"proRegTxHash": "e8fb68abf5c8407dc26431f624a8d1a753db47396b0c5b77da5e2b9d4811a96a", "confirmedHash": "2d055530faeccfa931e125c5560849ce2b63353222c6a5e00900000000000000", "service": "00000000000000000000ffff453d6be6", "pubKeyOperator": "8ae8efac9275b325bacb3817ced923e332d7d219bdfd2a2cade7f59b807103ac07d974f879eb337b16f4e12605e2c3c1", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "d3651b592a9e46497e89d2a124764f7e610889faa5f7a767266795eb056dd856", "confirmedHash": "c84bd7dc855a1b8eff6a6048a440adaaa68e41a9ea5792c01a00000000000000", "service": "00000000000000000000ffff258b06cc", "pubKeyOperator": "87368e0755b9b145d13cfab35e967f59eecf665da014f3025fd4247dde1ee749a1fbb0912e32668fc1c410cc2760d1ee", "votingAddress": "4YXGZC7zULZSK1heb8ns9aqquNHJ", "isValid": true},{"proRegTxHash": "6f55d61c76ede567dc91abc9463bc3f5d6196b99934fc1f49b237f5aed6e6e8a", "confirmedHash": "15cfd9d141b080898bac815019d2391d6c549d54f3bc20731500000000000000", "service": "00000000000000000000ffffa74788df", "pubKeyOperator": "8ad7e667c344704f88c306c35962833ab3163b7ba6ba53bc58b9054539ec09874948c5659c85b9e65ea2af5f259c1160", "votingAddress": "BiSYqjky7BvbXFSiYbCMFfCLgQo", "isValid": false},{"proRegTxHash": "0e308cf762e1a2bce89db89e5db6e0874f99c99f3bac401a1431bf1fb87df8d3", "confirmedHash": "632279adbc15df9709d63621a90c2d4032548fb951776be21b00000000000000", "service": "00000000000000000000ffffa51647fa", "pubKeyOperator": "0926540a9b2e5968c118152d099775d840f441930d9bc11eb6f21af78989ac34c51267bdc4dcdb7106cf8ce2e1380de3", "votingAddress": "4JbJz7vvvv6xfZJcTG1e1tX1GpJC", "isValid": true},{"proRegTxHash": "51fea30f3a50a7ca5572b7e7b830df5e9db271661435a7b9155e2e448eb9d4b3", "confirmedHash": "ef9c16922809a38c131f9ea59c085c786fc90bf7cb43d11b3800000000000000", "service": "00000000000000000000ffff2d9b7945", "pubKeyOperator": "8901506d5520e8ca760f1a9431777e8a1bbb3a041efd7f5b4febd03947fd1cd83fb07830a21156d31540ad85aef0cfab", "votingAddress": "NUgc6LAa7txMPkMZAkSYtd97Jju", "isValid": true},{"proRegTxHash": "66f78d2e6cff2be420bf29de7fd967b8e8460ef6c7e3e956562bfacb5d4af5f4", "confirmedHash": "32810e38e9d2fabade099a651026bc862e71dd7caa675b620c00000000000000", "service": "00000000000000000000ffffc28750ac", "pubKeyOperator": "14c021cdea12da46161c1228bb6e5f3606347e931733920f2c997c25d80b01eec97a1a8d62c9403c8b3efae5aa1574a9", "votingAddress": "2WXSSzyr7txqZDZk9x9LdPPMCc3s", "isValid": true},{"proRegTxHash": "3cfc6501e61809b5738189af646019e09e45dda4297041fc6c3611dc0c0145d3", "confirmedHash": "54317e0f9638e80793cef6f500031972e70191d95967f51d2c00000000000000", "service": "00000000000000000000ffff55d1f145", "pubKeyOperator": "93e30dd89474d8016a5facce14bfee27c44f4e705590278068c270c29543762e5d854fb696afb6dca9f43ec815a0cfb4", "votingAddress": "2ohBpYKp2piKQ79gCdz4jDRhjUNK", "isValid": true},{"proRegTxHash": "0b607dd6d8193f498d1b9f440f7ecb38828affc0a7eb0fd50614f0186bf6fd4c", "confirmedHash": "d08e629e93616e373ee7e1fa30725c6617dc3c6caa7287200700000000000000", "service": "00000000000000000000ffff5fd8ff4d", "pubKeyOperator": "016df3e0cd6196def78d6a524acb4350cae9496ed0ec9aa119c24dc1c5d6d2cfbc223c7fe51316895370650b4f8b98a7", "votingAddress": "2RLRECv7z3An7rdwrdKr4pmHsNAJ", "isValid": true},{"proRegTxHash": "48b7b2d7fadbda3665f48efec27732705ca41e432b48802004a95f2e70e4cbd9", "confirmedHash": "0f1956d0b7459944820631bf91f2897829232f17b71d64f91800000000000000", "service": "00000000000000000000ffffb9453522", "pubKeyOperator": "159750308aad4222df384646f1473d031a2bd003c7a43d7a141e81236e896e30ae57c88efe54ab39789558340511d052", "votingAddress": "2quEn6zgVKV4ehhBRxJ82BTSmZUM", "isValid": false},{"proRegTxHash": "e838e08ca3647681a42c7a1f806415c272632d261b2e891fa1d051ff2f50a54a", "confirmedHash": "9f8f9c52bbeebc19d4e54c45895b397645befb22600c1e1e2c00000000000000", "service": "00000000000000000000ffffb009d20c", "pubKeyOperator": "07c5ee75d827ebadb592c1f65410b62352e6a38d2be75ade0b387175e1621320074b3941d24cb0c2e9e9a10eb25c3621", "votingAddress": "6tYXHLjDJGgMpWSTr7x8do8yYCy", "isValid": true},{"proRegTxHash": "389562a601b4281d2923213f00cccaa539e035cfdbb3aed0a20cfbbf5313389a", "confirmedHash": "ee7c8539df0c9d98ee95d7eff7b364ee1935f9c9e16bbf7d0c00000000000000", "service": "00000000000000000000ffff2d20cf69", "pubKeyOperator": "8f0cff595f55e28f126900c6f02fce90e6c1aeb96296967975cf836a09a63022acf488c3f688a26697fca531afae252e", "votingAddress": "4Tj5x6AKsJv9PctLGtLFXMvud8xk", "isValid": true},{"proRegTxHash": "a9045cc70b62df3379e5208dc3026c63b0cf97898b50ced3c13f15414e19a9a3", "confirmedHash": "53d3e68878e2c3cfb4afdd3a1f2180b324a120f88b5022eb0100000000000000", "service": "00000000000000000000ffff6883b447", "pubKeyOperator": "0d5a5bff1379e632a30a1498f0a3ab1e7a349f7ad8abb89199648bcd6edb3318f592b8cd8b4d1ef2f154aa388bd1a347", "votingAddress": "2EmZBDoQ1a3iy1REgNv16HTREcap", "isValid": true},{"proRegTxHash": "34e95f40941eace053d038f076e489224a9bb60dd68396066611fd5d15bdc4e2", "confirmedHash": "4d01c3ecc4c1aceb90a9b3539f833454c0d4ca9f758b71c90f00000000000000", "service": "00000000000000000000ffff5fd87e24", "pubKeyOperator": "89a48272f5c3d52c6e7e9b97051438143b9b86e542e4395e165fa5b8038d73d7612ff8bb438e434b60390aabda8eae7f", "votingAddress": "4GABHUeRbqr6Kvro6d8qpaVdPf3b", "isValid": true},{"proRegTxHash": "58bc9eb488d08cdbb3a587e636d83b3da9fa86dd9b29588ed3b718af7bc77a28", "confirmedHash": "e86cd89f13988951151d5ebd01b90caacc7baebd771715ae0700000000000000", "service": "00000000000000000000ffffa8775303", "pubKeyOperator": "9889e17c7dbf3ecec79f653de9ce2ce1c230d82c4b0ca18542b3b4c2dfe4ea5bd58a34122f774ba78f4dcd0eb4877fea", "votingAddress": "2PXcjPKK7PJ6gRtyVoHxCnPMjwts", "isValid": true},{"proRegTxHash": "138a35fb7791e515b1e7728d6943979e546273518a9113988a9df695120368b1", "confirmedHash": "3cda68535dc39a4c842983452aeeaf98609e5fac435a91440700000000000000", "service": "00000000000000000000ffffd8bd93de", "pubKeyOperator": "18fe50e7237d2a46cc23222ef757f42a356659c0797c804523e6b1fdc420eee2f643a112bd8db9674362c64be7c52c89", "votingAddress": "3iCLkD3cxegJ4nm4g2zhMFMpwYGE", "isValid": false},{"proRegTxHash": "5eb87f19904c9faac81318866cd90ff220c732a248c22bd33a164310ecbbab08", "confirmedHash": "0a3424ccd1d4d1beab23b417ae3ceb3bc221f8ec14d216f40800000000000000", "service": "00000000000000000000ffff50d1e72c", "pubKeyOperator": "0d86e2d09e786dbfa63d94d77d4d13e9589bd6d20612f8cf2e0679ed8a382a953a53cc194f778392b4385bed2860766e", "votingAddress": "3DTwTQBQy8jJGZkxXmWutZfvDvyb", "isValid": false},{"proRegTxHash": "5aa34415495cebdfb9a6e24483acb2596db082e480839055bb233132763029fb", "confirmedHash": "d62e792ed6bbc1b35bbf2b0bcaf98aa30047119d43296e6b0600000000000000", "service": "00000000000000000000ffff52d31551", "pubKeyOperator": "964d9ad3cb892f3ee50a570a001063fb3e9e1541032637df7201e0963b21cdd15fcad6a5c52f637276c9dd0d53c2a34c", "votingAddress": "25mjRw3p7SwAhgaLZRSd1BajNyBS", "isValid": true},{"proRegTxHash": "741f2653cfb0099284e60fa2547ea5a6dcd2608feba303d02c53b3cc8f75c242", "confirmedHash": "58cd2211d3576b50f2b46f0d6a3745b254b75da186f62be21800000000000000", "service": "00000000000000000000ffff55d1f25c", "pubKeyOperator": "97d5c5095c9b768d45cde18b2b6b57c46852664ef9c6ed7fa3610489267ad08dfb1fbe1cb2a564e5f2279054571619b7", "votingAddress": "49SzmQWVnYZHhFoqL5srLnpMxP13", "isValid": false},{"proRegTxHash": "1b56fd3a8d5858f994d795893b2e4268226458f4773d8408c3503856df71502b", "confirmedHash": "4eedad9ac6806e3c89972ea51184c5c94b191ca1dad7680f0700000000000000", "service": "00000000000000000000ffffbc28e716", "pubKeyOperator": "077ca0d495806805cf8af45c253f3f00067edee340af11f2ce7538daa92cc90bd7d0869bef767c2de5541fa7a0e06610", "votingAddress": "2PxUAgZq5wfnEMR87x1dUGVUQ6mC", "isValid": true},{"proRegTxHash": "da45374edcb86c2054c7b7de54d638382b09b5113cf144fd7050acdfbe380fbf", "confirmedHash": "41ab00fd542d308240d8661ba11a4d8e9fdcd838374deb543400000000000000", "service": "00000000000000000000ffff5fd87e20", "pubKeyOperator": "08cad8053d78706d2e21efacd78401c1184316106e44e2b2011737eefe4c232f2e5c5efd929da2dcd103fa989a0ce786", "votingAddress": "W1unkYQUiiLHpf4P8WRrRXWKDBb", "isValid": true},{"proRegTxHash": "eb04987a534c73eb753c5e81df85459e7b1c10144a080bfd568ff12a460719f5", "confirmedHash": "53f8a5cb4ba5b7db1cbe5b27f7c70726bf7af99acc51c2181600000000000000", "service": "00000000000000000000ffffc28752ee", "pubKeyOperator": "07444cb7fab8d36d024c225a0ff7f3aace5b7ea2375d5dfc86ac4b86b38c41ee2f50d42274b9a20f68994687d88faeb0", "votingAddress": "W4mfCTEfpPtsHQPgP66PF4WEdnX", "isValid": true},{"proRegTxHash": "bec648c747be38d8c3f73d97a8db1da1fcc1daa66dac124d621fcd79c44cb775", "confirmedHash": "85518800e57ec823d44a71028c78482b9c449f950eea636d2d00000000000000", "service": "00000000000000000000ffffd4186dba", "pubKeyOperator": "8d09f84ccd3eba5e1344bd50c88619139c9c5ddf5b0ac71dc5d41879e036eea8af45335f164ca88c17a5417a8f6cb695", "votingAddress": "3Y3jGsA5hvxPoAGrwZaLgjjbj37K", "isValid": true},{"proRegTxHash": "b2c4e1bd90ab5727342b0861f68b3267a0b8906c2fecbd8fc9d638a21d94f649", "confirmedHash": "60b7a9415e5bd22b466b26dcf9024e6b52de0b228b818d8f0600000000000000", "service": "00000000000000000000ffffbc28b846", "pubKeyOperator": "95f430a5255c2fdc1127e076104cd4f0684fdf29f1f53591e6f1fd7bd54282d41796bf42061e2fe6f7c6730e43d59a3f", "votingAddress": "2MHAsPd7TezYGsnE1HGNaCe3Hub4", "isValid": true},{"proRegTxHash": "5d47826dbaa643a4c4d63e36146c5ea01be03c41443b303dc9c26ea001ace86b", "confirmedHash": "73217b876df87745cb28af44351b2121c4ce142ab4d5a4a60b00000000000000", "service": "00000000000000000000ffff2d2091b0", "pubKeyOperator": "84222ab9a2d1fb45ae405f161578968fd0c4835abe46de830abcde7f93bc3b6cf968c2f4c3f438859810f3e8e35c5e9a", "votingAddress": "2q9ty8qtarywhbAX6m8odcwm3krQ", "isValid": true},{"proRegTxHash": "e7c3dbdadc1f592ced06ae3a3e130dab3ce83db4b1ed6044feaf5120ebe96c50", "confirmedHash": "ad284db5bdcb64c37c802927ae74f6166d2e87e6ca4c56022200000000000000", "service": "00000000000000000000ffff9cf078f5", "pubKeyOperator": "127009b755ca8ed959c79b2e4ac1eb0b3dbe950758f01eba9bcc8633617fdd362f0d370f660c29874cca70b1f0f5be94", "votingAddress": "4WvfBncANTGJQMHGjEhoA4XzXH6a", "isValid": true},{"proRegTxHash": "80f699ce99b24443c373c871ae07db41eb27fc4497c969466f75231f83f3b2bd", "confirmedHash": "82ab4b63fa3970a636ec7a713b585558e79935af9cb3ab092100000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "r5CJX8BrRSaLm26RW5LdTbDednv", "isValid": false},{"proRegTxHash": "05865e17ca8e378ad265f69939ffa3d04eee88dfcb550a717cbde4dcc9672580", "confirmedHash": "528a4c8cf4caecac9122266ba8f0b1501f29d540449976740a00000000000000", "service": "00000000000000000000ffffa2f3db19", "pubKeyOperator": "885dfb06a6b7021e54f8ceee0c8d903b232f9113857b762e9ea846be256767203abe809463dff90116b7c397f81e1fa3", "votingAddress": "9GunK33UoSrPWapt8wyjfsDji7d", "isValid": true},{"proRegTxHash": "071ea8fd1fe9b421488b7dbc84b8131376c07bb91129ffd15b8443ed28259aaa", "confirmedHash": "f872e405e00cbf74dbcea854da56553c8d4edf09bbbd06a80a00000000000000", "service": "00000000000000000000ffffd41867c3", "pubKeyOperator": "0efaa416b97d55c0dfb1361d378e6797c75f932722729e702706d1e1226f3ab53b3c05d13c36e972cb043dc6be36280d", "votingAddress": "3Q1r5UiJDfesGcy4jD2CRtZfAD1N", "isValid": true},{"proRegTxHash": "c64f4814e6055d91dbedbdb908b2e8eea1eabe514e4023f8e2fe714654f7a6d9", "confirmedHash": "f8f6aa34b0c1a353a33fb563c32644a660b2096bf80fe1220900000000000000", "service": "00000000000000000000ffffbc28a302", "pubKeyOperator": "05c3c84c3ba97f186b454882eefc16ebaff748caf5d3b5051ebb7302fd5448d83e3929f2ef697f6e0d7dda4d643ea8bf", "votingAddress": "N8D3MKWGti3r21RXa186VpMXctQ", "isValid": true},{"proRegTxHash": "6f55603a40deef09e6f24f7cd95f95979f4db23fd37ee22db549392647b9df2c", "confirmedHash": "20ee019f6b56fa820083a711d32963fe0eba7971c8cbecc00d00000000000000", "service": "00000000000000000000ffff2d4d5ad7", "pubKeyOperator": "98f909298417df434ef2185fcd55569d904b61b12045bf45826a0895cd13d04efc7e69485ee2fb5c0196c831c518f276", "votingAddress": "44WjxKyb9PTgp9GNMJo5w27THQSR", "isValid": true},{"proRegTxHash": "55d8fe3456eb9621cc2d135ca8ed9a37db59cfdadc4b37790469ae95a730063a", "confirmedHash": "acfb51382d06fb7b23b2bb4655ccbc0cf023006d8f68d27a0c00000000000000", "service": "00000000000000000000ffff03dfd903", "pubKeyOperator": "108f343db65c53ffd6d4a0f43140e8a0168ed1264fd4dd5068add7bdff272daf011ac355f9b6a17b93fc3869d1b9392a", "votingAddress": "2XNXhYiWJ5S24zeusKP3g9jqxupb", "isValid": true},{"proRegTxHash": "11f969a892aa28ded1de1fb908aefd0cb97cf7e55173a9a1abe8b9643fcd8883", "confirmedHash": "617a93d3408d0f74d9b4712474856a33c05eacedf7ddbfad0b00000000000000", "service": "00000000000000000000ffff2d4dfb16", "pubKeyOperator": "196c5433726fc69c6f24e08f99a766790f94da5e6ba583792efe0000124789c2aabcf44df9071982f464eff943c14ff3", "votingAddress": "47u7YD3TB89CbGZur2kWK666iPKN", "isValid": true},{"proRegTxHash": "61779d08b44e80c0b09166dbd96fb863263faa86d554fa18cced98fcab2ab393", "confirmedHash": "3fe1cdc34e47206ab992f48e4f2e60e2195ad6d6c32d21d21b00000000000000", "service": "00000000000000000000ffff3625c7e9", "pubKeyOperator": "9050a68d5d6bbad4e7d3c53e99aa6a55ebd64261deac5ddc876f433b91a19e1d3f4723411e9c8cae42823c3511a4412b", "votingAddress": "enXnNBHG29co27UGjFprEKRJ9ot", "isValid": true},{"proRegTxHash": "d75ae0ff54bbe3df621080d6c930946c8f106a2b0c4e46fbd7ce1f27d4027134", "confirmedHash": "b2b75f9be9bb29ef0202d60df5e458a9a6798a0cff6f10f71200000000000000", "service": "00000000000000000000ffff52c409c0", "pubKeyOperator": "0ddd21baf1f027932e57528ce4f5771c08c3a94c02b0fbb02fca31c63713883695a857ed6582533cb43e3e82e49afe92", "votingAddress": "NeMGYqv7TyNr6juZV1VBPovQXT9", "isValid": false},{"proRegTxHash": "9859b2c077c31cc7dac0ae95c72ea71ba05d52e3dd049ff8a4247d2b45d11c7b", "confirmedHash": "562d29d7abeaa6f6649e7c9d60b4d31bbb684e08c26560912e00000000000000", "service": "00000000000000000000ffff52d31950", "pubKeyOperator": "1105bd78d0b25be7e9cd5a84e215f9dfd7e8d93202c2f7a5185e02955ae839fb197739c495e6332dec48e5de3382cd8c", "votingAddress": "4Y9Rmuf4WUTzC54pMXemi4egoN2x", "isValid": true},{"proRegTxHash": "c6d116c40fd951b9d2b73f5dc594cd901ae6e2c1d678dccba634a39e5cda76a4", "confirmedHash": "eb1ddc9d22ab0f1a8792240f695daae51c37cbe0b8d80c1f1a00000000000000", "service": "00000000000000000000ffffc0f8b0a0", "pubKeyOperator": "006c904a63593b64a548a67ddb6ca82a746e07319b135fedab88fcbf416ffc02fb84600513d76534d76bf5819ceb35e8", "votingAddress": "47NzgfR8ci5Drf4JgDVGKeusBkxp", "isValid": true},{"proRegTxHash": "1a6e1efb6567aadbf834b9b3ea9e50425ec4ec2e9476635390ba172a1379602b", "confirmedHash": "1cc49a098f3e23ebfb82eef4c9b48bf8b64fe8a9c9a177184a00000000000000", "service": "00000000000000000000ffff951c9509", "pubKeyOperator": "083087e7a975f24bec3db70d7978b35d2c41a6b142714257e9ed8777e428632b587c7b5d6bb9b5d33015cfe3ae548624", "votingAddress": "4FfPA1iq7bgnYhzCo5nAxeaPj9z5", "isValid": true},{"proRegTxHash": "4974054f71494b916f055a816f7deaf8b159a36bf0c08f010346b47aacd9deda", "confirmedHash": "601e6145d82c195fc7662679985dc885fabd2375357b0bca3000000000000000", "service": "00000000000000000000ffffbc28b249", "pubKeyOperator": "833a87a7f22d0e86c6d47c4a2a514609372c42a90c703a4f95e703d6cbbee918141e509de5e3a77b3ade3369f6c3cc0b", "votingAddress": "FqkyiXCuH3L3hW4BH5HdhzMDeKC", "isValid": true},{"proRegTxHash": "f5fde94898dfdb645138deedeee4b03b7cf891df477090f207b42e0efb6d3113", "confirmedHash": "5c68f7975db4d7563096158223fbe30e048dc59fd41dbae20b00000000000000", "service": "00000000000000000000ffff8d5f16e6", "pubKeyOperator": "8b34779044d92d6139fb9fccbe95b39935740bf99b289e69b75ef3ab7d2af7241e42368f445a3c6be0d0a876533b7d52", "votingAddress": "3kssaeFV7PAriX5qZsLe1XCoNMjT", "isValid": true},{"proRegTxHash": "e8eb565b08180d0eec3434e5bdffb51c06941b79d7c1ffb4b599aee9fbba004e", "confirmedHash": "33edb9326ec9af8fedaefe8710dc9e584fafec5b88cc7cc21200000000000000", "service": "00000000000000000000ffffbc28a301", "pubKeyOperator": "8079c64ede04fb2dc6b12f85869fe4ca38d593bcf3456a1a6b82175306679e43909f110bd1602b55391dee629ac069f4", "votingAddress": "2AU6LGW4BhdSDZoiWYuyRFsqrLC6", "isValid": true},{"proRegTxHash": "fc78a265ce3c726b08d30aa3b74689dbf84f6db1b5575692b3adec9ad7b2506c", "confirmedHash": "5ac61f1a7d627b02e1fcacfebbb81e7f4668b2db0a6333bb0400000000000000", "service": "00000000000000000000ffffbc28a304", "pubKeyOperator": "0ac487b713afc2d01170cdb3988c905c10df8caae0a59f7bdae55172c12c86273b389a0f527038d729c9b3501c212029", "votingAddress": "39LDE21EuiG6SqRcb4F9QbPL2bTc", "isValid": true},{"proRegTxHash": "63f62038548318402d45b3a7c389f8ace58368893dd5efe4f738be10967b6755", "confirmedHash": "704dc193c7de74d518e1cb1d219805fb0e848e645674df172400000000000000", "service": "00000000000000000000ffffbca64d5d", "pubKeyOperator": "805580aea9d30815985c2e99e78c117999f5e8dd747d76dfe91cd3544ee0026f617596686bfaff1c2c0f6810e74aa498", "votingAddress": "24haWSQZXQnnLVn1HMyM1ncyHJe3", "isValid": true},{"proRegTxHash": "34ec209a567e9108e38c4a1c0ae6f99f9b82f01ccf478e104fe9a4ad1508b634", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff8491cec2", "pubKeyOperator": "81b31cc2b700ef9e1185f739fdcb8214fcd576f2384f7a066f7ea2f5d52092a16837bb2989ca87808f651cedf18cf81a", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "bb299fa9efcd3ddcf37c2dfbd0b7c2e845fb33d00d429155cae8b26cd5f26524", "confirmedHash": "be3fabd32808e86165a05ccc57cc9c251a47353757a6987d0f00000000000000", "service": "00000000000000000000ffff951cfe9f", "pubKeyOperator": "144a96bbf2a15ec13ed0b679951099cfaedde29a5ad8e568bbc5c08058d77af78fefeb041f4fd4f88a4c9de15ed3b89a", "votingAddress": "hAqCs3kjkA22kWMjBBnxjfS1j4T", "isValid": true},{"proRegTxHash": "24d51fd004f96e604349536b0cdfd5698be66a17b4629421921c403ee5242034", "confirmedHash": "d20dc569d4467ef09cc04cfa209190948b5d62ddccce7b3d0a00000000000000", "service": "00000000000000000000ffffb98d1b6d", "pubKeyOperator": "9291e6de039cb43686d730c34470ea953af2555f95bf07e05f6907a324c90b7dfbd7092e997ea3737d061fd0f5bd449e", "votingAddress": "3s39ArJUfSqcmSJduPpRjRHNcwch", "isValid": false},{"proRegTxHash": "03d72df4e1298f0471665f7cf2f498b2373995af149e51e084475d06535c30c4", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff968867b3", "pubKeyOperator": "81b1f0151edf35e001385496b0b18481d4293eb1218f8105be8068d7864c535825d134f70177922a1c64674c87e10829", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "66f43e78cf1c341f53b5464239f9031dd1f2309aa74f16b18e1aebcb4d84951a", "confirmedHash": "261825887df3825bd970cff47164c06656b0e90dbf3adf980200000000000000", "service": "00000000000000000000ffff8b3b1314", "pubKeyOperator": "026ecb13e4dda694274b86fe406dfd7986da6622f273847f16c97ae16d3bdf551336e21751637c77cdac3b90fbe349d4", "votingAddress": "5PWiYrZfGynBgGpbHq7W31Jvn9H", "isValid": true},{"proRegTxHash": "5c605aaefb27a0a0d83ad71a18127487a5dc2982a16e5c26fd7a11f791e9d7ea", "confirmedHash": "a1f586cd14bd8a4ee504785b988ec1b45a5162602152509c0d00000000000000", "service": "00000000000000000000ffff2e6525ea", "pubKeyOperator": "991edfec8cc1b6c732eb67959d17c493497be581402ef2d8168fa3dab96e711a37af1cd15125c3fdf951ad495d58b5a7", "votingAddress": "2QJAp3XRGm5aKXHzakJihJizYzQh", "isValid": true},{"proRegTxHash": "343f221f75ec86f2be9293e1119afc6a4c18e86a942b04eca2bb2cf191b9b3cc", "confirmedHash": "f22f9890b9dfe1ac18173ca1e72721a3d3726f412cd104d92300000000000000", "service": "00000000000000000000ffff2f6eb8aa", "pubKeyOperator": "04effc4f66b47dc41c188e060ebfce3698f400f59a3eb46f2f7818f45c914dc7ff6d72dd239802dc2464ea166adb077a", "votingAddress": "3qh1YbJfpnbnxZGEBi4zhLPiumRD", "isValid": false},{"proRegTxHash": "05b21e1d0cceb56cfda12b87c48b302b29202c405a17a08e78bf3ae4ca51be78", "confirmedHash": "7bff4f371c94a24bc8bd45d996e8e1e504972248543b91fb3500000000000000", "service": "00000000000000000000ffff5fd97d67", "pubKeyOperator": "1089d208fa0d3ab7ae7a980e07915717ae69c7d59404beefff37ad2b4c90bac6c9df112b3d04272629b1e3480e9334b6", "votingAddress": "3tDqNhWcp85jQMuFvrzYBzzU6prQ", "isValid": true},{"proRegTxHash": "be00d9e3e717a5802d3908788f185eb8ff4a59161ba9375a9a8f44076f2644eb", "confirmedHash": "1be92ea886b0e569ecc90897430bc278a635a623af34718c0d00000000000000", "service": "00000000000000000000ffff59280fde", "pubKeyOperator": "0344c4bac00fb6bbb5c45d6384747bde3a2e5964329b15262d46ca682af6ba1ed6deb3f4bb25af1e453639021fed923b", "votingAddress": "2bwtgyrjRFLTU1Yrf7qtwQF6CAcg", "isValid": true},{"proRegTxHash": "48d20131ad0b23f5f5bdabb7c1157b15b88c2aef648ff21f57e1adf6de3711bd", "confirmedHash": "c8a4c02b005ce10b461495f8ab55cb05f568e0d3724948c30900000000000000", "service": "00000000000000000000ffff55d1f153", "pubKeyOperator": "83190a1c61a9fae05e75baefd649eeb2497c1beaae5df34a34cfa683093f828a1b63471b56b9204f97bc070333927de1", "votingAddress": "3o8g3N3fL6xSJBXVi6nMJSyqc96j", "isValid": true},{"proRegTxHash": "dfe725e9067d08f52c5ab08b8180c07ce67ecca698d5ed1a426de4ad619064e6", "confirmedHash": "4c35462a214d6b68576163190f4a182121f6a86ed5943f8b2700000000000000", "service": "00000000000000000000ffff52d3154d", "pubKeyOperator": "0edf78e852dc2fea4e8d5a341a54c4dd50fccbb081ddbec47e272220f3523b4082d0226648dec6dc0c0d95488cfc2e65", "votingAddress": "222SsBxhNA6oxLdcMxvu3qm43n2r", "isValid": true},{"proRegTxHash": "2d33a867286bf52639474cc6b46ae396d33692080de6d7beffa1e70505ff7ac5", "confirmedHash": "6167adca3211b0b61b9dfe53cee38b4ab8926c8ef07bf9512000000000000000", "service": "00000000000000000000ffffb23eab38", "pubKeyOperator": "8001e702fcff4389148ede7c9515b5dba5cffa05160c1d17055e6f3386dec52105e0d88b3d21c86d5dd34f2c6475bccd", "votingAddress": "45hNHNzpwtarCTuz9kcgbTdmHS46", "isValid": true},{"proRegTxHash": "4e6088df6cd761c0b518320e7ce90fa4b003a85420b1a4d9390567f722a56ed5", "confirmedHash": "0466836740481df381aebafccf63b9738cd756311b9de9b01000000000000000", "service": "00000000000000000000ffffd4186bc0", "pubKeyOperator": "008f305713fd342467f2d49d9467056f558971d4fd9674dc49fc9cf849bf7ad751f00fa8d49440479e361c2aa641ff4b", "votingAddress": "2tHk89bPP3CQvaWPrhSd8QtvLEKS", "isValid": false},{"proRegTxHash": "2b5b6d21ca50d456cc77cf4880c0572a842ef8d9239d5428f6af0392b06e3cf7", "confirmedHash": "3a7566155632d8cf8c396f73c723fbe4b48e5c1c630f68611a00000000000000", "service": "00000000000000000000ffffb23f7987", "pubKeyOperator": "903196d8d39ca96cad943b2a043031585dcbf746735b2db116620c112e2149dd309d299c6595ddc04c760157df0804ce", "votingAddress": "kkWt8qUGjjRRV77zVq4S1JXdu3v", "isValid": true},{"proRegTxHash": "f58b69d76b3a338b081e4b90d2dc93091ea905275a86e0f7b38cc12697c773e4", "confirmedHash": "03315aeb8ba0ed9313558c42d3719ca8f2b904fb710ebd692800000000000000", "service": "00000000000000000000ffffbc28f16e", "pubKeyOperator": "978b896ec439635e856aa2ff258af1af52d08c6f3b41db7bc2f097d01624fad691a4f5e5aabf8bd4b8fbda0a3ae42be6", "votingAddress": "STaS7Fowv1CcgdYUq9tWcsH6Jsh", "isValid": true},{"proRegTxHash": "4f611099dc019a5c67c4620990f76123ce4615b90d2673189d6487de005cd4c7", "confirmedHash": "c14641d19f521f1153ae688c345dd13908bda7c7cf27efa20100000000000000", "service": "00000000000000000000ffffb23edcc7", "pubKeyOperator": "064c3c7d54bfe94031e5b5e547bc668f5a2826fa5623c1dc0b5a76703442203c4b063e49efe02f729611ddc890ef137e", "votingAddress": "2JnrFVV1yBs9WubAV3bL6dYGcwNB", "isValid": true},{"proRegTxHash": "73a152b0e80fda89dee36587a662e0f6668204fd07695637a9b176b187ca7f86", "confirmedHash": "aa2970d027b9a3ba30caf7a893569484379c1ea866063dca1500000000000000", "service": "00000000000000000000ffffa7ac419b", "pubKeyOperator": "888fe3b956176c1299297a3ab11ffcb4dfa410b2f1b3e9a9317b3a8a287116e7ae1b952555d695c6f90b03926ea140fa", "votingAddress": "4CdK57qbgSvhB3hywWVkwhUkbeW5", "isValid": true},{"proRegTxHash": "00ddaaf8c9f348105a8e89945f37b79d974c6203dba4d7ff8805ef5f66cf10db", "confirmedHash": "64b416cd9399bc1885fe1b660d1c1d6a383970a6c5a45ad50100000000000000", "service": "00000000000000000000ffffb07b39c6", "pubKeyOperator": "87ba9be473c243bb72644e32db0fd2635b1856e9cde503014681b6a6549ca87ba7c061772b5a6ed10a4c19adb2c7cf9d", "votingAddress": "3XdevvqwupjWE3KQ2rKvzbWZ2pkr", "isValid": true},{"proRegTxHash": "c1d0b5c547b0778dde61c3560190fe0c48b80aa9e8a3114a2918641d3ddf1abc", "confirmedHash": "ce63eeee7398947f996c023ea94a8feae26467d5353409a21700000000000000", "service": "00000000000000000000ffffc0f1e9b3", "pubKeyOperator": "13d6c8e3b6eaebce13902ae15ea512baa98e7a0fac9ad24eb49275a5bccbb550b5261203065b7b5b00a9de582a8ab7ae", "votingAddress": "diKfnhKVQ8DQSJmDp5zESAo6xUY", "isValid": true},{"proRegTxHash": "7051bcca787b52582d3b9ba73f9eda4434228e952fc266840295c1ba7e1db7f0", "confirmedHash": "ae06cc22cc46401855349ed291205288b41759c66e2eeae40d00000000000000", "service": "00000000000000000000ffffd418666b", "pubKeyOperator": "0f78a9aac42dfec6620333f24c236c0f54358729e0ff90a54eec0f534bb93ee5d35b0034511210f1b23a02a1af2ea8ef", "votingAddress": "2wTffwdRVw98T5YVYAUcNzPgAULR", "isValid": false},{"proRegTxHash": "94bce04622103c687514b6a6e5a30026b1c28081a51913ce2016be413033b40f", "confirmedHash": "7ae41ca5b0abfad72d44d8ff279ebab168648ff29476db370700000000000000", "service": "00000000000000000000ffff52d31949", "pubKeyOperator": "94269ccd4003ddc0ef768ff023da06457c60b6adf7cbdb1d38a27fcb90ed59e890505bba255390170ea76d49683cef70", "votingAddress": "4Za7tqmi4ARz3rDNvvyJhpcmdvA", "isValid": true},{"proRegTxHash": "7e88f8fe1eb741efabdffcaf01f1f124434b3f5c876cd4913b1818aff43a88b5", "confirmedHash": "69af03d343bfca87c1f9e749f16be4177b49d5ccd4b0d39e0b00000000000000", "service": "00000000000000000000ffff68ecda30", "pubKeyOperator": "95118408fc9cd48024862efb437efb84e5aed8c3ba80f0deb287ae8c21533b56d9d25b79a0908dc1b16923b8924a73bc", "votingAddress": "3hHm4xAZodZ9C7m9W8xWMSZcxkLF", "isValid": false},{"proRegTxHash": "50b8616771e99dd6d3bdf97f5767f374301419414588cbc037c3450cc703d016", "confirmedHash": "ed446f3d7358db25281bf99280936b6c37fe5b0e397044220700000000000000", "service": "00000000000000000000ffff05bdfd6b", "pubKeyOperator": "898093c4fad7e15868d115dd043e593fa79f4a0307fdffbbd07fda714b03a6dac0c09efa923be07e3a46a19aafce8206", "votingAddress": "3Sm2vovXej6Wgyw3aBc8ChEENTE2", "isValid": true},{"proRegTxHash": "ba81202e8b52e3d91bcc2d571e4a19f902fc3f89d86ddf6a16e5c696821df78e", "confirmedHash": "8c84954c81ba3e4bfafa2e2489caf9333cfe7ab48ce096732e00000000000000", "service": "00000000000000000000ffffb29d5b13", "pubKeyOperator": "11a093411fd6679cd68186cf697d059cc408c76ea227055cf166813fb51bab52c259643945c0d0f8f905636c35896d45", "votingAddress": "4KhGjXSWvwa71yjTDwtzfiu2hRbS", "isValid": true},{"proRegTxHash": "ae70ed71950e3fa316de93d4f9232f15ad46b0ed59e76066e8ee86c2589aa124", "confirmedHash": "dbe92e44add5609df93297fdd82b438a3d13b6cc608b89eb0a00000000000000", "service": "00000000000000000000ffffbc28b240", "pubKeyOperator": "86df3cb8be2dd8ffb766330099593c5e271cee4960aa029d4d984a4dd394918348e8912e6765cdb87bd8a3ed476be8b4", "votingAddress": "YAGS59GTv9TfoTZDPzkacbSwZg9", "isValid": true},{"proRegTxHash": "9b8228005822b537af1f462b33bc939bee679e817c5e79425300af6a1ab1f66e", "confirmedHash": "1739ba773f37f199a5b11dcd31a61c69012f6814ea6a72c01600000000000000", "service": "00000000000000000000ffffb07b39ca", "pubKeyOperator": "92dae738ab948b027ac1cada939d0dc193d4ecc613f2101455c27d5b1d77dcf6957f1d82adcf890a1e2d9ded8567ea59", "votingAddress": "2FreghVV5SRJSdJxjkEGtBLEAyjz", "isValid": true},{"proRegTxHash": "85da05d606e7e62963bb89ca6596d9222d26f11be247df5d7bcb1b73edf97650", "confirmedHash": "e5b0942409f2cd2348b7382c7124c1e79c23a14cec3a7aa21a00000000000000", "service": "00000000000000000000ffff2cf0be08", "pubKeyOperator": "02c6e4f8d85aa7384126058a4eb277b8cea7489bb928930011adca5add01c2cd14560d7f508d8a838d5a49e1b45953b4", "votingAddress": "2Zz4TBGXMH8bnN3iWBfmtVdnnFZf", "isValid": true},{"proRegTxHash": "22d115f638f0bfc27779ed004484f58aadd8ff26b907af96080226a709d271dd", "confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", "service": "00000000000000000000ffffd4186302", "pubKeyOperator": "8b938523577906f0038d5837f55d37f98e4f5a46dbf9ff9128f92b9f107902a4f1c986356861ac3e7392c4a2253e28ee", "votingAddress": "2A28P8XJhy12MS3oBgEGGa2joZnF", "isValid": false},{"proRegTxHash": "5d424261c7da0bbc02c94a807416d13e873095ca3f67f24feb03568816aa5b6a", "confirmedHash": "6cfff0eb40d353531b66bd7ffb849606b19b5275beee122e1c00000000000000", "service": "00000000000000000000ffff8a44bfe1", "pubKeyOperator": "97a0fd450d220c1a421a39ce58a8d7c519881630946bd889a3132fecf34d4e8df1d1a1a0e1f39e6c95dfe933670ecb8d", "votingAddress": "2SyHg9vSTLUP1iZngkVLY574uXoj", "isValid": true},{"proRegTxHash": "edc1bc81fde15fd0c1c4677ee753aa6870c678e2b08f482ee924abef83ed3dde", "confirmedHash": "296efb00a95c08b738d5231f3462b774a9568475f8af7d250600000000000000", "service": "00000000000000000000ffff867a5cc0", "pubKeyOperator": "974b9cbf5f79dd2a4292b64853adb6c18fc083ea231715f4ae74ac5c9ab6b4c04ba8d90d4036c01340105c1a7c1a86aa", "votingAddress": "aWnjXCEEF6Hy4wbex5KdyGMiafp", "isValid": true},{"proRegTxHash": "de2f1ed81901297055642e5fe2408f13b27fec5850518469d92ebc583eb792c0", "confirmedHash": "acc63847e11cf708a9236dc3a5ab60b044f9f5e0900c1ce80700000000000000", "service": "00000000000000000000ffff2d4c94c2", "pubKeyOperator": "8b3a2027fe3d0d75dcad9dc2d34c138fbeb8abbf4e23c519a4281a0300fcf683c24fa3c5a37af270a277520d667b3907", "votingAddress": "KHwCnvztSF8czg7oDw3PkPUTFKW", "isValid": false},{"proRegTxHash": "351b7dec7244afb215f2adf487c6a11e27b2a7e37a613a7151122af33fa73814", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0a9", "pubKeyOperator": "10eeab3a590f1344b78e3c4de1bd039c68ffe57e3765b2da1d926eb8ae9914b62ce2e0179f5f7aa2f0ba7984a1237459", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "b581298ecaf34d471ca02dd108905aa6f28b2a1fd6b4f08f22b2b17bebb14418", "confirmedHash": "74fa6fd5fe40482bac138b4d428a7a5ac74417698045bc2a1800000000000000", "service": "00000000000000000000ffff5eb0ee0a", "pubKeyOperator": "94cc2df48ed7197d479337ff9c30d374ccbfac3f6a67f81fcb96573625ee418f3249a6ede19efb2d47ab739769f091c8", "votingAddress": "21f76RfHekV3jKstZAxPa5fJt4AF", "isValid": true},{"proRegTxHash": "da0ceec2e8ed0c2c524ee8efe861889759fe35c3764914caaceaad1d1def7e48", "confirmedHash": "f66924afd1d356b7e1cbed450248a3c94c669262962d13170d00000000000000", "service": "00000000000000000000ffffb945361c", "pubKeyOperator": "136803b9c38c253c981939c0f2838bea3c4476b7a80784472e19dbcd14dcda755a4032fc4d411d297af20f1db3fe6abc", "votingAddress": "28mCZX5xxweQ8mjg5Jzz7P6VaBKX", "isValid": true},{"proRegTxHash": "fad4bab15952ef482a8b16da2ff687bacc7f18b5c751b880e729d9d0d4a91645", "confirmedHash": "668a73ae24ceadc4847045846f3860607c345535371ea5f92200000000000000", "service": "00000000000000000000ffffb23ea01d", "pubKeyOperator": "8bec6df1f7e038fa64ce2f5f231f31a39710657a0b7e735bffe8c4a56350a8abe5dc019675bdb86af11880bd61641e82", "votingAddress": "3wwVCbqovsDfWapEivesifBfuMwn", "isValid": true},{"proRegTxHash": "514b15bea3b3be07978d706e926915208bc01b137ed1ebb8506132600c340c31", "confirmedHash": "517f9abe98a7b32ca1b016fbf96d977865a7802e7eefd8431900000000000000", "service": "00000000000000000000ffff2d56a256", "pubKeyOperator": "0a479b5115e9de2356d65fbc7c30e5e36390c59918855d37b3036d8deb13a8a3b3cbd54d396d500b6d73a62f386ec590", "votingAddress": "3wiTgremcPAnVfjdETrsR4grp8hC", "isValid": false},{"proRegTxHash": "b8501cfd8da7434518b41cf8c970a73c455634818f83ece121b0688df17b9b3c", "confirmedHash": "4cd142c4c56009e8d30a52e59664bfd6f04561a268f8636a0600000000000000", "service": "00000000000000000000ffff2d4f4a09", "pubKeyOperator": "8f7242bdba0921c2418d4e3be676e320c0ba9ea86b5d185dd1dc1e665587925086e8bd0de4473f9eba0f1487ddf81f86", "votingAddress": "22hUtX5mxw9N7RS4eH17v34z4uNE", "isValid": true},{"proRegTxHash": "f73b9cbaa8225653527818b6371bb814b287a35cc0017a41b9f063c8e7953076", "confirmedHash": "98c26ecfa52810f984aef045e1e4fe365542ffd1b562c1100100000000000000", "service": "00000000000000000000ffff87b50fe1", "pubKeyOperator": "0ba1dcd7ff176358a27d73f3b431c40513121855c952bf7e9f6ddfbe37ad55fbfbc3caccc28366b35adfe5501f2caad7", "votingAddress": "4PmwNFF2n4DfZeuzqh4jzy776kox", "isValid": true},{"proRegTxHash": "5ad2090f579cd540363e97512ace931056e0bd7e720174ebb21c52f25c604148", "confirmedHash": "3381b0181302cab2fb7faee7442e93251b622b3e43ef92ed0e00000000000000", "service": "00000000000000000000ffffa1614080", "pubKeyOperator": "8b3e55b882451d9b417eb85d2348fee6a65a1090842c18a5eaafb9beca95f64eb1ee611a51570a4bbb5f29bb417a80d9", "votingAddress": "3sohcrCojtx7PdJr1GB2934tXPLY", "isValid": true},{"proRegTxHash": "bccb8938b680973a110be980e36e18c5fa2d3c9a1198b5877cb96f50364259d7", "confirmedHash": "dda17e992efb6e90c925d967313985dfddb2aa5d0aeee9711000000000000000", "service": "00000000000000000000ffffb009d216", "pubKeyOperator": "8d1151625efd05ff64d0e602bba72902dcf6c154ff7f0a61b7a2c769558181f83bb810f0a6c99fec4aa640aa27244b53", "votingAddress": "tDcE9BYkT8fMMT254DGUYGK314K", "isValid": true},{"proRegTxHash": "cfc6fca430ba2b1ee8c41267bdeee6ff508b08c6b7e4727ed407f2386265003a", "confirmedHash": "7c4bf07be0eead967af3288d1d152106dd5f186ca43b7b801100000000000000", "service": "00000000000000000000ffffc3b5f666", "pubKeyOperator": "88d50e645ceee357a4e7ae05674735d96a292345c98994672398c25346975fa79c113cb4a9fefbce43e6ef6d79bbd943", "votingAddress": "3cxqP4ECJJHD91ApN4ZSuw4zBZoc", "isValid": false},{"proRegTxHash": "2a038b8f2029c30fd01e34ce69e6e287d5917ee1ee898f69ad5da78779014259", "confirmedHash": "6b0b7096147be77aeb538b83ca7bfedea24969c7bbe80a271400000000000000", "service": "00000000000000000000ffff52d31515", "pubKeyOperator": "0ccbb3fde3de721bf7797290cdbed6f5fa139b6b37bf5c663ad2d668827b52b31e82cf37e2d73c6e43ea0cfaae987ac4", "votingAddress": "EhCBgCqUMvm3hsnCUfhPiCHB9Rz", "isValid": true},{"proRegTxHash": "7a9b1a5016a718111d5a788335321033a1bc53ed727c907714b06d4cd9f4fb34", "confirmedHash": "ae79629a3cc7e5fddcf76b6b5065318f344c43d8416206481e00000000000000", "service": "00000000000000000000ffffbc28b6c8", "pubKeyOperator": "83afab1defed083c1f840a6e0d251b37049988dba78e505f069cf4f4ee4fad1b6ce9d131ae78e258c1eadb9ae54c71f5", "votingAddress": "kgRDakfmpRcJb1AvucchrSZsxaz", "isValid": true},{"proRegTxHash": "9c955321ed62303fcdee813de9c6e576bc655f76a3979b0cc4fd8c19e428e15d", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d52db9", "pubKeyOperator": "12774fccd87cd23ab50acaebc2f81165f2ba3a83225099c1e217188d70d6196b19a7f070f35e7494740d1317d86389a3", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "de75995fbc3a3648dd841535bba000b445454a0ea26164bb74d17d24d32e28b5", "confirmedHash": "73eca2c4827704415836465ee2450275e0bb2092f7c132711f00000000000000", "service": "00000000000000000000ffff9d5a946d", "pubKeyOperator": "114c9e7a6a0017ef5a868a07999073724846204cdfb1acd3617b3cfe129af04b01d35e14e8810eb328f192742dc507b4", "votingAddress": "3yZ8K8uhJ2A3tVCVKj46m2q2nqkb", "isValid": false},{"proRegTxHash": "1c70b05624cc1a9a435fc3a8e0d1befaf201a14902a49f169fe55064957aac53", "confirmedHash": "315ad97da1172ad90e2aae2932e55d5607cf25e3e823aeae0f00000000000000", "service": "00000000000000000000ffffa2138677", "pubKeyOperator": "063a250826accf1807292d8285b29352b2bb72797d2e416bfa31f5195d0b2caac6e7c55406b8497ba2ed4f3aea7b288c", "votingAddress": "Zyx1Q3ZrdWQi6imwGxzVC4bQSfx", "isValid": true},{"proRegTxHash": "05fc291080dcfcb3f2a804c545e6a0b1ec8a9c25e483a2304dfb17913bafc3c5", "confirmedHash": "6b2f6dcf4da20faebabc2062b527911741b7a546abb3d3cf1300000000000000", "service": "00000000000000000000ffff5fd86d81", "pubKeyOperator": "95f94b5aa41a9e9dfc99de48581ceb15b3bb9d9ee8a8cf8239a1f331526c77bbfb6f0d9e69fc2278638f854f4d6f7cf4", "votingAddress": "9tTDygjqZYnzj2PEjRDCXvgcYyU", "isValid": true},{"proRegTxHash": "3ac593115c4ff78432241258df02b146f3bc9bc87c5a16b1815051a8d01b14f0", "confirmedHash": "5d2aef7e8adfea5ecf416a03b38260bf0b686a4470bee5e12300000000000000", "service": "00000000000000000000ffff52d31958", "pubKeyOperator": "0c08500f384056485306bc8ff98a26ede2d20248ea1f7ccbd3ddc8b29a0e46a8fcda6a02d7a12b6ae94207a441411477", "votingAddress": "CsPtaifnN4CLfMZ6hkyYAdW9mxS", "isValid": true},{"proRegTxHash": "34d149a37901f1a8b71280d84cd9e41536b3b7fec9714a5f8cf3f6d18506b744", "confirmedHash": "50a4c2e17790cf4b393eb396ba5c55c7f68d3b5a527d3f590f00000000000000", "service": "00000000000000000000ffff52d3191a", "pubKeyOperator": "0ec6ed06e908e1b68891f53748e3327f9e58d49b693e82ae8ba6bd40a699a66a956bf387a7342d3095419030733b43b6", "votingAddress": "2UxKMTR1pvRbzTMMdUk5szM4PPWK", "isValid": true},{"proRegTxHash": "4f6f9de727361255417f0083fcf6075c167b810976b72c56f837f3e28b80ef01", "confirmedHash": "36ffd83b863fd3f3919f4d3343aff81ffae1a83932183ea42000000000000000", "service": "00000000000000000000ffff2e04a26b", "pubKeyOperator": "8d30803d46df4a2ccb9c356aa60f35f45f26b44f28b84e857c721a6215f20d8866e358110197786c85a568bf3b57ecb5", "votingAddress": "2D2dnr5EKwSYvb9dUKte9B6zNjZs", "isValid": true},{"proRegTxHash": "834db7ac049210972b1421e8a6428a2787cfc56bda34a9eda8963209dd108ae3", "confirmedHash": "0ce706c08c260fbea9f10c5c8187101d1051010efa3ed0290e00000000000000", "service": "00000000000000000000ffff5fd8ff4c", "pubKeyOperator": "8bf5dbbba95ab57ae716d6d13aeee49872ef3443946ccf296077fc106c93db76f64cd79fba907354219a9c052431c9f2", "votingAddress": "bzNj7rEqb8Pe4n7cA1zG72M4VMA", "isValid": true},{"proRegTxHash": "f9a6dd880b8bf656ab1ff3b6685d2e99cae06220f5793814a4edbb71376bc5c3", "confirmedHash": "11c85c1491e89c8d58e70fb0a8f5a1c0de6d2f4666e2afe61600000000000000", "service": "00000000000000000000ffffbc28f160", "pubKeyOperator": "84aa522dccd59aba1287a69c7f2e347cfd0f68bc84753c7f5d5df6f933392d96e6e3f5c595237c4465f7d55f605b8118", "votingAddress": "2ewtRX4zgWaRKHYmnn5k9cEgAunL", "isValid": true},{"proRegTxHash": "8f95065e62424d1cc3b65a0fe6bab64f41041ca3fcd1719b4c31e721e3bed11f", "confirmedHash": "d4d6cabead7ddbfd03c09cb5d38f89bfe8fcc4be61b955d71c00000000000000", "service": "00000000000000000000ffff2d4c5440", "pubKeyOperator": "8871b80253547dc69b5562c195627209108afbfaaad5245f4aac40c3f5cc4599d8e25b221da0ba9996cc59304d141428", "votingAddress": "34RpRU1RvvQY1UpexRHtN7SqapaT", "isValid": true},{"proRegTxHash": "507f182a66edad4ec1fb35396b553c04c87b0b746fe741ddf1e54bb7a650c0a5", "confirmedHash": "233874b4a21afe27d143d4dbf7e9b64b9d46fa5dee9177822b00000000000000", "service": "00000000000000000000ffff87b50849", "pubKeyOperator": "8af95a884355ebd1b0d603de448db546e5d2411f2f725742fcaecf0e155c7efb31dbb44452cb2e19e3f76793baf0b70e", "votingAddress": "A26tSjYZVxsRXsi3VEjvCyo2tjc", "isValid": true},{"proRegTxHash": "74120036d18b4e40112bf0be20faae4a3ca35c2cbd4112531960283379f5f58e", "confirmedHash": "3c4ca02f81aff688e0714f613caa39e2835d133d419393260900000000000000", "service": "00000000000000000000ffff52d3150c", "pubKeyOperator": "9888d8e257e399507946de1fc73e45ca9b3cba7909a31fdf47c9097c9af9a2d99e0d3bdf98c675d9b1f0ff963cf59b71", "votingAddress": "3GAxMyTCSS5gUJSwtjUamQxwd1bN", "isValid": true},{"proRegTxHash": "832d7490ba2f150334fcdaa72e86a3d583bf043cff6babc1aad490dabef34819", "confirmedHash": "d117824eef4155d979434fba3ba7e972dea3e35045fdff972500000000000000", "service": "00000000000000000000ffff422a3053", "pubKeyOperator": "84e3c51e50a0e2f36871b43a61fe594450b5f59053093058cc063adb71d04c12fc40400203ec0735733d768ae50ae059", "votingAddress": "F3ECM4uXBf5MX6shhrYeXu7txR4", "isValid": true},{"proRegTxHash": "f665addb9c6411391a9b185f95cf4bb4ab5777ffd59355fb93ab5143847820d7", "confirmedHash": "43ccd49a66d72a9da3fa559198c5bf7255ee71ca9f24f6862300000000000000", "service": "00000000000000000000ffff2e04d9ea", "pubKeyOperator": "9238822cdbe81fd293363a7fe5399cbd0b7ab0147068d01ff5b9e07c0947bbc0b3210109421345d381f9cb906bfe8131", "votingAddress": "3fzU8EtLLWEdTiUqe4Dib9MN1z5Y", "isValid": true},{"proRegTxHash": "612bf5417c3872bc55a179e3d610f215d8a77a3941772c33254a4ceb1c289d36", "confirmedHash": "6e536cccbcd4ee52c421bc42fd8e2722276de1bd7c0382c51c00000000000000", "service": "00000000000000000000ffff88f45fd1", "pubKeyOperator": "899b91f07736c40773089a0a93673e7d7ba4fc1f39f0596f32bde17d6ef982ced5706c0b9941de787bdd93a8e64d814f", "votingAddress": "WsSjMyQMDj8x9d66NEVtnmETRun", "isValid": true},{"proRegTxHash": "d205d6a43f852e2321ae2e9268d95406bb8acf4a96ca91cf06afad031687a3af", "confirmedHash": "a26dc300d061e7e42266c92bf2e7163df76b4812333729b40600000000000000", "service": "00000000000000000000ffffa8775789", "pubKeyOperator": "0c8d81af493441d4bd2d70cc1371b71e5addcd533f6c56fc0bcbce6f3070f9b21016745c4a71e3672b37ab88f84f8fa3", "votingAddress": "EXKsHuKaa68xQi3MDwrXaK72tpH", "isValid": true},{"proRegTxHash": "a9681805cce223de1273e6b0f1a87b62863c7cdccd346389565461b56a25bf3b", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b093", "pubKeyOperator": "16f034ec19f41fe1489e09820054f0ef2e393d1dbde0fe0f5d02158f886944d92e0d3c7be1a4785247caa843b00c6b4e", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "1434ae84822cf8cba7178fb82e768c9778989acb88775f4dfd74ff3961bc995b", "confirmedHash": "2b65c783dec6e9411c1a9cb063ae05b0de3199c8037360240500000000000000", "service": "00000000000000000000ffff55d1f22d", "pubKeyOperator": "8e1fbec112bc165a30db65e2bfbde2459fad2a590bcdca6c2350355ab9920c7db88655ac6ac25ed190f8e58900cfa507", "votingAddress": "3MXVGtLyxZBEUPdeugEhcyZJbmHn", "isValid": true},{"proRegTxHash": "160944c1ef041805cb7fdf11c98483065d493ae31bb294af8b430443525440dd", "confirmedHash": "599380850a553b01b77e357b2841c778834d35b813bdea0e0d00000000000000", "service": "00000000000000000000ffff55d1f102", "pubKeyOperator": "16feca1d699d6c9803448ce180bae228dc32d23ec31cc7337d97aa18c26052cd59a12ebdade1e05f0ee3528b3c11f65e", "votingAddress": "38uDdZLUudzg4WuUQxWrsEMzkXfV", "isValid": true},{"proRegTxHash": "c4a41b8f17ccb4cb661bc843dfe6332cedacb4da8b4c2153707a6ad68c1f0d1b", "confirmedHash": "ec635f6c430962ad02082674c15cd36348c617b8935201da0900000000000000", "service": "00000000000000000000ffffa8eb55f1", "pubKeyOperator": "92c40af38ae4ace7d9c0aec4847b19d30e3f76684d117732d2560a4335786993b4125f700b5b69da4de38d977db70f53", "votingAddress": "dH7H8eLJnMsX7aqvNEeVi5hzt1W", "isValid": true},{"proRegTxHash": "c1c8559066c24ec09867f41d7c96b38bd750090a92d1a25e428025a7ebbce3d8", "confirmedHash": "4497447712024afa80d13a79a30cbf40cc96073dde76e4eb0e00000000000000", "service": "00000000000000000000ffff91832a60", "pubKeyOperator": "852c50e7138027bf317d9533e6708182e26a738b3240078dc7d8030c7364b9533c7932c3bb1513f8881fd12d0222d269", "votingAddress": "njPdf8HWZbLoQ9wrpxxqvtc5EQg", "isValid": true},{"proRegTxHash": "788eb41e3bc1d4d3114f14d23248e1d131354b638099f489011b1baf6d4f0210", "confirmedHash": "e79a5e82f93bc9ec7d76246b2e821861700b7a1c2a4380841200000000000000", "service": "00000000000000000000ffff2d207377", "pubKeyOperator": "021f7f631d2e51ac71be562d8b8e085af4ab141417a29cda7400b4c0adbf39de163e232a432bd7faaad76b21e8d5ee88", "votingAddress": "2AtUfhSTewW2LypyZ1puyhydhz85", "isValid": true},{"proRegTxHash": "7c5fbaba600abd96698ebe205b4c7d4e4d2e0b8d35a35a26297fbd002a40490f", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6d333", "pubKeyOperator": "8903f7ec225a0a04118095d41cf6dd4be37ba7cfbd1ee67d49192c7531320b7f7bdbe3b6d6ed55975712b18bc88b6fb7", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "82cddf55f4a057b611d276da478d17db5571db1fad505744f45282392d33f390", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688b5e9", "pubKeyOperator": "94413f7a5ed22682cb96d0446dfdfe361c299f91598ac48552d34801cce2bdb88dc66fb5cda5967fccca400c3e009975", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "04fc65386aa7e2e2203a67e4478657a0204a1dc3721b11eb718565d5e72ff22c", "confirmedHash": "4edac6cb9bbcfe9deb7c2ee3457b06622ee4d6c73359a11b0800000000000000", "service": "00000000000000000000ffff867a20e6", "pubKeyOperator": "8c4326eb13a57102f4634210c25c162a3edc87eb9520b241808d1edd227d3a3a14d3a61a4a08a44266d4e5fdb95e5eee", "votingAddress": "yB6ujN75WGJ68q8KcqdNc3ePgaD", "isValid": true},{"proRegTxHash": "f31637e125f0d503ef924fad6823b886ddbaa3d2e74e6a163fc2b70d48642b0b", "confirmedHash": "60928db5ba3ff8888739bf8915bdd0dea56a47c80119c9812100000000000000", "service": "00000000000000000000ffff55d1f10d", "pubKeyOperator": "941b04a0e8b19e5994b9414917c176d8f4818dc3169d33c6a6ee6adba091aefed7fbba096012206511f7dd8b38b50a92", "votingAddress": "JzYRFoiBqS4eQHNDnP1ZaL5hJRT", "isValid": true},{"proRegTxHash": "514ee6f590daccf5e163ae4096cc1e723e1d5d73c1ed0f0a3c21283c1bddc9cb", "confirmedHash": "3c720348c0a969c9ba11ca4266554dd95e6c2b631c5e78ff1000000000000000", "service": "00000000000000000000ffffc2875b1a", "pubKeyOperator": "888b5b28cb723a2260f523eca3fbbc30b85658e73d607094ea49aaa5f8be24476d1a57d7d0bba4ca6e0d18ed1e7588b3", "votingAddress": "2AkgbEtymWNfocFTY2Q8r7hy3CCe", "isValid": true},{"proRegTxHash": "7b82bd747a2eb9aa283848b0b533e3e6b9c3d0061487b0cc16b21d649aa1985d", "confirmedHash": "a3aa307938d3b31bd73ae48f388836da52b5600f27f896aa1300000000000000", "service": "00000000000000000000ffff52d31982", "pubKeyOperator": "013229c4888095e41ce26a1e95765e7956e648e86cd85bdc357483795596b5bed52a190317fba02c3bccc1595dcc338e", "votingAddress": "2Bof9iQvquQ2DCF7ND4pmv8H11U", "isValid": true},{"proRegTxHash": "e6a119fef2b8a84f354d93911fa936a0345fd661b8a0ae77d211db56d6721d80", "confirmedHash": "3199902101465ae4a41755d0c5bc36fcaddbae59e2de860e0c00000000000000", "service": "00000000000000000000ffff9f590d18", "pubKeyOperator": "0c32eaa4a587c777a9ed6d606b91e8d2cd9f0d23d1a6ed0c74a9cbe6b8579accfee668e207595aa8b32d4ffe4f3fee10", "votingAddress": "4Pk4HNkgnbnK1gVxkeWaCZvGqZST", "isValid": false},{"proRegTxHash": "4263f4846443d710fb46298e2108e8de33bf98ec72b73ffc06ee0be35cd6195a", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff0363632d", "pubKeyOperator": "918141ed5626245466e918e094b57d3bb86abf1058b3256ea909237c4285c7276bd100892fe3dff1e3f36a8c431daf4d", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "68446554db2eb0ee39fac4eef4a4f7c3445227981c6bca1dced164ae8432fb91", "confirmedHash": "7c13c75dca54c44f63772fa8385e6756b886361e9e97aada0b00000000000000", "service": "00000000000000000000ffffb23f798c", "pubKeyOperator": "0af3061a6cc01178bd8ccfb7fc85303d242ce7270f46a7608c46023df765c8e01cee9cadb4b975a9c60b8c1991f890a8", "votingAddress": "3g2ZfjRianPo9S8mrKH5de1dtFgM", "isValid": true},{"proRegTxHash": "977b9d0990bed9a7acb5ba827a408e45d64178a45f53d209267c4cf1661a8183", "confirmedHash": "ff88f26a9534b99472900f26a60359c8fbf55964bf36a4920e00000000000000", "service": "00000000000000000000ffff58630b19", "pubKeyOperator": "85faf5e05eea4db2c5bb75dec9bbce159ecb1dcc237fa8258cd082bed6b3ba1a62a178e22d1122a1355f1be6f8769ba4", "votingAddress": "4U3hHqnXFQoUqBUPzv8XKog2G8od", "isValid": true},{"proRegTxHash": "3d0b2b0bc56c57a7f64c822a05071f18c0fa374599b4d30a0d0c0804eff80987", "confirmedHash": "aaa70be69b168e87c256f3bc088994221b4dc27b965b61142d00000000000000", "service": "00000000000000000000ffff33c3762b", "pubKeyOperator": "915967ce1d8a0fba7a47493fefb06c49a8525c5a5e3536aa7c10d49df1ee68cc0c13f487f58d04aad3c362062fcfe566", "votingAddress": "37yvuTsGZ8Ucn5rPMm9sVur9yEuf", "isValid": true},{"proRegTxHash": "f920abbae3c5a49142b38d4957abf7ad2b82f822503b949e009cbb7e69880001", "confirmedHash": "10825a0263176fa838aa56de0d873ea86afcb7fd26e93ad65100000000000000", "service": "00000000000000000000ffff344927d5", "pubKeyOperator": "8ad212f8f0565568b8eeacd6803247bef2140ba2c69f29de623081b622071f39cdca98998a2a45da07c48a46cffd8165", "votingAddress": "Dmh1FyNLQgkbxBTFe2D33rusdqi", "isValid": true},{"proRegTxHash": "eb4ea4c1ad7f1eeccc5dd593f99f00f85d0e63e37259bed6163280e72124299d", "confirmedHash": "42382f4a75589e03ad67081788967846eea75d13b582a5920d00000000000000", "service": "00000000000000000000ffffb23febc1", "pubKeyOperator": "8e201a62fb35dd6f068562aa31b44bcd94887457eba17618fe1dff366c8414acd7b8342a37d850a52b77c08697d93c93", "votingAddress": "2Bh5cTnq7DJL9km74v32zvEH27xA", "isValid": true},{"proRegTxHash": "fdbce2673cd013f564d47981d362f81d95bb358b0a6783926a67c004f4952e6d", "confirmedHash": "ce1395ee213bcad27afd562fd4924f7b8947e8c7bd6702da2700000000000000", "service": "00000000000000000000ffff55d1f1c4", "pubKeyOperator": "0398b8453d3094edf112269fd1b30ab48076a1ee076e1df5237f8930bd42708b63c67f390d1248d7dc8e877153286a28", "votingAddress": "xsH9f3JPZhAH6PA7Az79qkr6DQJ", "isValid": true},{"proRegTxHash": "19b372ac261d484020c5bc1c785b7a1e8adc9334aef31950abe433bb0d1fdd91", "confirmedHash": "41eb25b3705258852abd5844a302f8bf2abdd35ba9e124e50f00000000000000", "service": "00000000000000000000ffff8b3b3a39", "pubKeyOperator": "06d505f487eafa97e5cbcbf13ed9032e2779c8d1c74c64694e2b31849284fd967d8685c721a0ce995c795d8988bc7881", "votingAddress": "3muCy1svJ1NiFu4fiMKD6BCCXkXB", "isValid": false},{"proRegTxHash": "f58b18ac26fff664748bdf4253608b0c7297546f7435a220311eba089db9de78", "confirmedHash": "35b5c2c4c8ab898050485f18f9ec2f5eb9d3e8e815c91cd20900000000000000", "service": "00000000000000000000ffff5fd87e22", "pubKeyOperator": "96893ff9f7be91a90f8d5f2b87db814fbbca16bafdf0e47eb86637ab87265fbe181ade0dde7c5c9462ec3d248446bcf1", "votingAddress": "3XMbfmRew13qinK8HAVRfZzPrnGG", "isValid": true},{"proRegTxHash": "e38e32c1a047eaf726a9006154b3296e206fb73a6655702d16dadff50df455ca", "confirmedHash": "4f4211a7959264522248148652641455b3f4dcb593ff27662900000000000000", "service": "00000000000000000000ffff52d31566", "pubKeyOperator": "8eb7610c0453b7f3e0bd17097b69fed91df6047ad54c320d14810720a9496943c251894f4f5cd8e4e657d052876bd09a", "votingAddress": "3yoN6taHee7ui77e91ASEEDPx4iH", "isValid": true},{"proRegTxHash": "9b17917dbd88b33f9ece3f72b5eb93218efb763aecf29949051af94694103f23", "confirmedHash": "ec3ec1b529d1bd9a950a1f1669ae8e2df3ce6d3d3fa75e4a0700000000000000", "service": "00000000000000000000ffff59280a20", "pubKeyOperator": "1115e417c76b0e5b3ca6511162883621699e04fb1a4543ff07f1669cc8fa2eec0f684e7edc825f684da67d7725e41071", "votingAddress": "3pFukcDJdDyqSDLsYPjKaEGHG5E7", "isValid": false},{"proRegTxHash": "508bb193f06cd6f0b10e7f793df3a4c4c48bed1190d79cb913c15ec017e09541", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b051", "pubKeyOperator": "8a530583287269607fa22ccf8c8d5098f58dcb95207c80f67bb7fa20c4318b1470f5cec2ab95cd1be116a3a54302d956", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "6bed36c1fc731cf56fbc912df88a0485f1690b39909efc98fae8396567304fd8", "confirmedHash": "c804e578e02f62b36bdf51ec60774c43ee452f68dbfb04191100000000000000", "service": "00000000000000000000ffff44b707f7", "pubKeyOperator": "149f04b9b09c67ae7943ec4be07467cf248fa789ef199187f0f5a7603e61d6be7106504c643b9878b23a88e142eb0bb6", "votingAddress": "3Ndk1c8Y1zPY1gDSMQ5gqQwPwGxj", "isValid": true},{"proRegTxHash": "0419e8a7f344b4c480c89c4e28cdb16b104b39bf1c939ce5cba932ec3b697c6e", "confirmedHash": "be03f2f6cb2fd672e6d543d4eba7f3f27326baf5279f57222f00000000000000", "service": "00000000000000000000ffff86d1cc7d", "pubKeyOperator": "87bbb9da251ce598c8640ff9df28ebaf2bac76aaa78b80933a89b9f09facfa3bf84f6a16b4244430c153eea0f7eb2f6f", "votingAddress": "2PL2R774RrfZR8o9FXC7NGNwcZ3B", "isValid": true},{"proRegTxHash": "4940912ca4ac064951901a2ef1b01f45f2472ce922ae286623c6593548fe9ffe", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b087", "pubKeyOperator": "890c460c4a57fa509297a6ddc68fd0a0d624f29b18b8beb85bc977d33215c79d118d13e08bb28754dbb7e5f5fe12f4d3", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "f1cd140ebf37626f57c50cc9c0d5c3619a350af7d4b758f2aac67825aefcfc21", "confirmedHash": "f53cb68eb93481deb7965a1ddc993e7f33ca76bfc60603e80900000000000000", "service": "00000000000000000000ffff4f621f2d", "pubKeyOperator": "0b5fd9e493d7f58c6f670c7f0fa11e2a7c82739ed5b79409d198cee41efb85c57e30dfee1b7c5803d17d810f8111a2b1", "votingAddress": "2qmVcRQcUV1cUbrk31rbCNus3Pn8", "isValid": false},{"proRegTxHash": "1db8f1562fc6222f785a079dfbe5971e1d0afabfbea062ba60f861adf88b36b5", "confirmedHash": "bd31f35c5cedbf07c6ffa716f2a3acf8f725ab42af8758740500000000000000", "service": "00000000000000000000ffffc11d392f", "pubKeyOperator": "03b87f62f3951c32002bc926f2367d2251df0fa61a6189c72f0e1368187a953de35b0416682e0901144f1f8014ad0a46", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "808bd2f220373b325f781829ed8866b37e3bcf7346f7b2d3187e713ccc5238b8", "confirmedHash": "16393b0bdacfa0a283573a23e689a1a1908edba646460d540200000000000000", "service": "00000000000000000000ffff2d4df412", "pubKeyOperator": "92737a064249d3e8cdebdab8babe58a5d9b4d9bddf312b6d0295ae3841a36589e8ba22ea911b749790a5aae1f13bf985", "votingAddress": "38JUzBwW9PqKpGD4DPE9cA1F96gm", "isValid": true},{"proRegTxHash": "a3f09841930da69b44a6bf629457c60516a668e4abbe1a2f3b81fd2125fbd27f", "confirmedHash": "41530e88e2f9d68026603a1c94f51adce763880de07564801a00000000000000", "service": "00000000000000000000ffffcebd847e", "pubKeyOperator": "808fadbd78bcb5e6892ed68c3396d1b0693cd4d6b12b1dba2b569968f1c1d716ddc56368e94d7c3de855a89189913cbb", "votingAddress": "3ZYTbbqknGXa97D3guZR18rDSJCc", "isValid": true},{"proRegTxHash": "10f1a33a6084ac376943b568e06bce316aa00399224124048360e74bffe00567", "confirmedHash": "0767fbb6956bb7721ef6c6f7232daf605f44331a384eb6660600000000000000", "service": "00000000000000000000ffff9df52295", "pubKeyOperator": "17c8942de54ad5f8184bafe0c159c7a0868d94cd384392ed56f3f60beaada261cbfca5bba336d53655f2c9c11949601f", "votingAddress": "dhCQVDKFzdo3mPsqRVi6Lsh9NdF", "isValid": true},{"proRegTxHash": "65bbe752f2df5c7bef573c15b629d78b67e35816bb0fefe0c1644ee7c8a6733c", "confirmedHash": "2361df2cfb3dbd626bff6a20f35d1ab801a740bd10e5a7c31900000000000000", "service": "00000000000000000000ffffb9e45389", "pubKeyOperator": "045f64dd776b01114ec874eb3966b1f3e4d94ae53340b1d832e4a9e88727f059caa53dd75d917ab4f01d91323370f305", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "5157559bff47ea6e4008fb2a149337cfd71edb4b827f5944d04a6220b270e419", "confirmedHash": "fe73472c7776ba0335f76108760d4f0ad5f695b290ed771f2a00000000000000", "service": "00000000000000000000ffffa877500e", "pubKeyOperator": "92166ea48c5ec892de338e306c11613126d0eae570c1b08827b91634972cce655774c40799234d3d5b8b580a2364d609", "votingAddress": "P26hcTMmkJhLaCFrGQmaBdxrrBM", "isValid": true},{"proRegTxHash": "ca3f6bcd1ec429fa910eae0decffa4d61c100523cf5d80ff05aa147028c738f9", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0da", "pubKeyOperator": "90b1c6ab5b4091463f05839d5b0cea0b9f9b80cd1de90d983d8c25b5a18920f1d57aa12d6bde210b15709e607af793f1", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "98fada9bef7e8367fde0e62e1e6414b582ddc5d0b89f24d248ba42b514ecf55e", "confirmedHash": "1ad85701c3e4b66899cf9614d77e7642af8f8b9a2b6e819c0200000000000000", "service": "00000000000000000000ffff55d1f1b7", "pubKeyOperator": "15554d956346f2ed5a908e167476c91e0fabdc5a61a910cbeb1652fb64c2acada628aca292e03992304cb37f2e17a8c0", "votingAddress": "3ew1o3pLsquoA7JUwnvfhrJRRsny", "isValid": false},{"proRegTxHash": "0e41f5bc58d05acc45d02d6d7ae00484edbbfeb8e8a5e9ecb37742ada022f39e", "confirmedHash": "7c4bf07be0eead967af3288d1d152106dd5f186ca43b7b801100000000000000", "service": "00000000000000000000ffff59280646", "pubKeyOperator": "10955c9676f1cc8d71579c28289b3b9ac6851acf07f2b6c1cb110f6f34baaae69abef5ad0d143092f052d8fc5d57d1e1", "votingAddress": "2eSyiv1ntgrR6XEDEiH6PALUoDSL", "isValid": false},{"proRegTxHash": "c821963bfd416d5e7f2bd4c9a44d84dac896bc727a261094531a2bd60349ee90", "confirmedHash": "a729a0ed3e666fdf4f620de5b976c2af9deb68054be7e41f0100000000000000", "service": "00000000000000000000ffff05bdfde6", "pubKeyOperator": "00bcb734d66fad073feedb8dd41b6ab386eaad509631e417419b02e9159bc5c183b7c1c8862fc2fb6f09a9d5cc8d645c", "votingAddress": "3HxgprXQocbnchUkYAfQ2cfYCyqG", "isValid": true},{"proRegTxHash": "dcfd5fdd62579de68c7315e459aad4a85ccf0e80f3a66ed473cbc7f5f825fc8d", "confirmedHash": "7b55ee6e9b7d026b239f9c5ace8e4aef8d9c6a31e00ccff30800000000000000", "service": "00000000000000000000ffff2d208c4f", "pubKeyOperator": "140f9eaccec588d1bf8d19b61783e3fa3108f72b4c0d5ffadedbde40056e8a5a9bc99522be2908cbae56425a5b096fbd", "votingAddress": "3qGKg9g273DnkTQwEyYowbmtfVJy", "isValid": true},{"proRegTxHash": "00b0b50b180a969882e680a5e4e35b26f5691d006ef1f507f193d772548edb8a", "confirmedHash": "7f709f9b86421a3315772708ea430551eda93ecbda6dfc2b0500000000000000", "service": "00000000000000000000ffff0509ed22", "pubKeyOperator": "88f3e08f369c2329c799df091a20a67969a074e214f73fdad597ff6e83b180ed09bbcc966d310861462adc0bcebdbd7e", "votingAddress": "3kfjawv5wWohmU7Dr5cCb7jK8Tji", "isValid": true},{"proRegTxHash": "f78bcfb4e392de7a3c46d12da3f0f295e0b531bd99e7a5bf8755bdede5324073", "confirmedHash": "75d5fa513ec1fc7047768e44e059092a272f174c2791e7ce0a00000000000000", "service": "00000000000000000000ffff2e04a265", "pubKeyOperator": "111fba24f26ac04a564e099263c1d63fb0b189e4dd98684507631ffdd1789b62e95397688c9dbc954696ea2c37b6a577", "votingAddress": "21uM51PbmLhZinrHt2UgQqmqr1C", "isValid": true},{"proRegTxHash": "2f9bac7ab492fde8592946cf0104ec3d6b44581aa62ca493c1fcd824f7767e7d", "confirmedHash": "16c939a656540bec874aac641205a573fc55e949664cac860400000000000000", "service": "00000000000000000000ffff6c3dd2ff", "pubKeyOperator": "8a29844a20a56168454bde7ab7998a9fe8e2898dbf3c22844c79cb4dbc5c7e521769359299269b1a25fae20e11f7c960", "votingAddress": "415qRVujcetJuddDGmsdDkZhAFez", "isValid": true},{"proRegTxHash": "bf7ede2f9a970bac70b18dac4988457beb8f117890290d23835c9e57eb83094a", "confirmedHash": "9a1d301a18559dc1aa20644fa3b6273224ce13f37e3b92b14400000000000000", "service": "00000000000000000000ffff52d31580", "pubKeyOperator": "8b76a3ba304c94c4dd9e5d8218d9189b292bf205ceaa0af8c2ae07139f882dd036b9e8605b63022b6af2365cdb7d6e15", "votingAddress": "2khqdQ35zJoB4vUrzrZkHWTjsVc5", "isValid": true},{"proRegTxHash": "5078dbe9b7faf4e34ba850e22947617a5567f443fa37146c824ec56613083b8f", "confirmedHash": "bb0b09b67dbebed5edd0f20545de767da3db476c66a4570d2300000000000000", "service": "00000000000000000000ffffbc28e706", "pubKeyOperator": "8a67462d25875ef375c5a87431308d82903a4081daaebd16983563a1884c858d8c8669ba9f85bc95162e9173c4eeb3a0", "votingAddress": "2dbwr6bZYGBiTnxMjuXWxPRpqMD1", "isValid": true},{"proRegTxHash": "f985f535f0674327d7565e7e3c8e7fcddaad33b20eed05e53c45c9422f325a17", "confirmedHash": "082ad0c1623b5b4f767158ef626336363e711175b7a491f30c00000000000000", "service": "00000000000000000000ffff55d1f1f7", "pubKeyOperator": "02027a0e9e4c9fbab54a3b93350551d99fae077bcad84a579bfba6c59e1235fe1793c577ba87027312e8d7a2e1ad7ee4", "votingAddress": "eKajJYhgvmD1NkRHRhAaDAqxZMB", "isValid": false},{"proRegTxHash": "6bb813bfec163619745e98ef075c85c0c5f7d667de67152b955b32b6b50d84c6", "confirmedHash": "a85fca9079c952dd736505bcd851a91aad44499894f4f1fe2800000000000000", "service": "00000000000000000000ffff340e5c8c", "pubKeyOperator": "19ad2818533623a9d5c5985f78128ca2b6f2d552a87677de0a9e0693fb2334b88fa11fdf779fa4bfc120a77577619962", "votingAddress": "Czvn1pq25SXZdhM9nD6WaumfXCa", "isValid": true},{"proRegTxHash": "be67ecd89d35098fd586513e9988a6dcfd6f6ba8086f4157454872b0490301b9", "confirmedHash": "e5ca46c434b69b1bf4f8a9dac04e518d17a1f450bcb60bb03100000000000000", "service": "00000000000000000000ffff55d1f115", "pubKeyOperator": "0fde2b3a9b76a691066c0d7e17a65d58cef4dc2d2da18525febf4ade1f54e63fad7600e728bae166bb99a50f7bfcd9bc", "votingAddress": "3zZknpcLxwMPmWwgtiPpxpTfaHaN", "isValid": true},{"proRegTxHash": "b87bf4f03a38a7400abb7d1ded90ba5273afbbccc1b1241b22583f1c3992e1d3", "confirmedHash": "b6a157daf2cb60f72a308bf6c387763818dd55c61b6281210500000000000000", "service": "00000000000000000000ffff8ac58a3c", "pubKeyOperator": "0047512ac33a46fa61231f3087dbda792cffb3b9a4a17c0771f4c4533da230da7ca49459c9700b105db7c52975285b1d", "votingAddress": "2gwWePcQHtdYt4XqjDgxhhR8H7Fj", "isValid": false},{"proRegTxHash": "8aac31bd43b6afb8f45bba6e98cc24435d9b60d792cd0bed43582ddd3809cbf4", "confirmedHash": "5bb106c9522047198ce45961a5f319a811f46038e35864212200000000000000", "service": "00000000000000000000ffff325d68ab", "pubKeyOperator": "016844c9d0bc3058e75dd52fc52486943a07ab3a19ca91ec2e4aa0eafdfb8aa8de83d94ceeddb30fc7320ad37cb27fda", "votingAddress": "X19g8WHg6cZaSC7YXG1dspPPsWF", "isValid": true},{"proRegTxHash": "dad529afcdf2cdf705126f8fd8561f4083256d3ce00bea49ec9cee06c3576887", "confirmedHash": "c8a4c02b005ce10b461495f8ab55cb05f568e0d3724948c30900000000000000", "service": "00000000000000000000ffff55d1f10f", "pubKeyOperator": "939ac458195e7f4245f4dc6d2185f32d39aff42875d36b0fa51e97d03fb3b92d2001df4fb21a55303c9c92ea13505769", "votingAddress": "3TrWZ3DdQXFqfmU8Hvy5CCjwYynq", "isValid": true},{"proRegTxHash": "8e0290d83fb68d6fd1686bfa91003727459635d6ae8198a54acce1205cf3d810", "confirmedHash": "f7175bfea1e728e38ce424bd3612b79f5d8596d9b6aeada12a00000000000000", "service": "00000000000000000000ffff05bc3f6e", "pubKeyOperator": "8e98a4356f40afd73f3c6c7ee6be833ede633543c5e0bfba78b4ce1f43aced1cdf17212c81a48f11a09d912ed4419576", "votingAddress": "4VZBUsxfWFjDQDyxLipu6GEoZvAp", "isValid": true},{"proRegTxHash": "f714f3082136a2a3cbe5bd2a8c04f71b400781268169d42692b0a35c16c42f6c", "confirmedHash": "c01f3ac228dd9e08c529417ec163d7c2ee84bd79258d76140000000000000000", "service": "00000000000000000000ffffa763b689", "pubKeyOperator": "033dd38597ca9ab937ae0d838af2ea1e8d07e7ba47ea819580c618b54695194960aafc474de88b31eb903ae2cea28b9c", "votingAddress": "3VskYSbEhTwo1XpwMqcqQDmqTUqC", "isValid": true},{"proRegTxHash": "c72a7e16455d6d8c8ea7a5fb67fa1dcf6e526a937e9965078118a1980404fb3a", "confirmedHash": "01fbeee3b52af22cd62f7d2bb4e1c57eb9f65016d6738d7f0200000000000000", "service": "00000000000000000000ffff55d1f28a", "pubKeyOperator": "0d6d7534c4c23dfe2e961d0b90261b0be5e5f36a210b7be4a91dbab4cf55e50e2a39d3ddc6488b1f5d58a7219a6348b2", "votingAddress": "xC62iyxurkJUdUBBRd3XuuAQbLn", "isValid": false},{"proRegTxHash": "660e2f0f8b11c0e56bda26b9a421a6fddb4df008680e1831ad2311b580b5a26d", "confirmedHash": "e551662559ec910c4dad5f0dda0696f1114ca2581ab6b90b1500000000000000", "service": "00000000000000000000ffffa7ac2646", "pubKeyOperator": "8fbc73bd0b34163e4bc5c9ee5f50f4c3c3aaed22d762e97d9960f1f625f511abc9a4a7ee54db6038d2da783f70791454", "votingAddress": "469TFoDaiFxv8VVCQC4exhNghH6H", "isValid": true},{"proRegTxHash": "82e638a67688eec52901e352bb2d9ecc718e8ed7e451c5e768e88cc3bd405549", "confirmedHash": "0f90585c8f0c2a72623ec1b8ff2b8567a550689de80bfd500a00000000000000", "service": "00000000000000000000ffff88f38e22", "pubKeyOperator": "80dc0923f0a520938499b09e04c2d20a3eed81680726f5bca24767f710319acc9be30e22bdec38dc7e45d81eb88ffed1", "votingAddress": "58mbgGzoGE7oATUW2L1gRSaoAYM", "isValid": true},{"proRegTxHash": "006cb14c68d011267f8e29aa5475f18cb255dacc82ca0f22dbf2651a597c7dea", "confirmedHash": "aafc5a908ec32fa1f1600ee2e9bdb02fc4d99728dcf096201f00000000000000", "service": "00000000000000000000ffff2d4c593f", "pubKeyOperator": "0812499df5a01647ab95b13d3495e3fa60125a68e435e7b3ef8c2edd11172d768bd331d4b64101dc9b37a03b30b73431", "votingAddress": "soR2yhuefx7pgFkVLYy4YX1msiE", "isValid": true},{"proRegTxHash": "a9c29948a0b78b804ffbb7ab7a3a5f23d07a1b63672d83d7ea856e16bda65ef3", "confirmedHash": "d75c08e2eb41028f17dabb3fd83ef94f62255075ed10be050e00000000000000", "service": "00000000000000000000ffff68cf9649", "pubKeyOperator": "88dcb3964c55c96dfde499a9f3930fb1762c2e2d81c17baf6739e739e1f2f88f4ba79a93bd2579d6ae12aceb861261f1", "votingAddress": "2xGSWkF3Zuvy6gnjX6e5H5ymoNdm", "isValid": false},{"proRegTxHash": "78e51477c9066ab718ed1204236c467104a8a1f2e58e87c95eab18cc883846a7", "confirmedHash": "9ee6ac0bcfb85475eaf82a0f5eb7617be4322c5c7adf78280000000000000000", "service": "00000000000000000000ffff50d1eda8", "pubKeyOperator": "0bfdd6f1c7b313019a7237922b28e7de8375c690d83ff8e8ec287fd859d8fb4190e3599ab51a651a52fb6b89cabf4eed", "votingAddress": "3MDjDRjpypE1eLVXFmFSoCL7J8JX", "isValid": false},{"proRegTxHash": "81fa501159f3cdb8f57043d97888dc04a86d11e8681b042af60dee00f5be40df", "confirmedHash": "2db50aa143655d2cf608f57c758916871e2701a67d34b25e3100000000000000", "service": "00000000000000000000ffff342d911e", "pubKeyOperator": "81c1765f6ca9a730f5236321f1b22f85adb3f9484de628b03bf683544567fa607f4133de509abe7e3879ccc14efeb7bf", "votingAddress": "2u4UBeqDVjEZ42kZcPbdrCWuRfaw", "isValid": true},{"proRegTxHash": "742dc6ea2d54c4271b6fe2c2881152958cdd9bff4f4434a1b11aea9ca2fd22ad", "confirmedHash": "033a40a748eb7726a06d5c5943acd2f9987bd0b8b22ef5020b00000000000000", "service": "00000000000000000000ffff55d1f253", "pubKeyOperator": "911255bb393c571bccb4d3ae8e83a07f16b0551451d46e8fa6ab6031c1945d69ac828db7e06bc15ffee9b1c002fd4521", "votingAddress": "iZd4ECqswKwZajPxBKh4PGPxkpi", "isValid": false},{"proRegTxHash": "aed10edde70fda76f968cae40ec48fe0234181d2488daf677e0910c236a688d9", "confirmedHash": "b85b50ccb6eba87a9d6292fedc95948d5ea9bbaf0612d9000700000000000000", "service": "00000000000000000000ffff5e8294ee", "pubKeyOperator": "948a385deb58605517148c528ce97f531df38b51726e6a817dcc79c09a4491e1a28186dacf20d95082583e8553f7ae44", "votingAddress": "wzLLisUNUaaJ6vmgj2DJLS1CgDi", "isValid": false},{"proRegTxHash": "68da6fc99db223f8b67510ed136b37699df7fd266e0e032ddee2e90f65bde502", "confirmedHash": "6ec75e5b72e8d65dcb050522b7b0e917fc0b20d397a37bce1000000000000000", "service": "00000000000000000000ffff2cf1652f", "pubKeyOperator": "02ebbfcd0c99398cdb2c33019056418418b60dd18d5be12e23a66e0a4674655d271e107ede8727973a830375657700f1", "votingAddress": "2zmZbWkWyvnFeZpq5Qs5rc7EMMh3", "isValid": true},{"proRegTxHash": "ccb17d612bdef05e2170dc79fc8d9a9d66a461f31ae23ecd2410e95feb9d7948", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b080", "pubKeyOperator": "16c265b3a81661d3495afdc7a6e342dd5ec33db8dd403208d048ca6a7a95734f97b8c3e8d392f9c4625601e32f15a4ec", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "75b49121904e872d0ffb8be531a2657f7ff1163a02a7fe887f3e4a6af8afa2a3", "confirmedHash": "fa1ffd063b3f985800859e12a4056b758068a740f24ef92e0600000000000000", "service": "00000000000000000000ffff9fcb13f7", "pubKeyOperator": "957ebd552d5244c52e9722a306af2568329fe576979f2c60c490efade6ab9a27fa93c0676a2c4205745cd0688c8f1ded", "votingAddress": "3jEBzweGpmLDv2GBfjxVae2S3kxa", "isValid": true},{"proRegTxHash": "ba49f2fdaac7f6637e2f9b2612114773425d6c9a04680b859e4b679e8aa654b6", "confirmedHash": "00787909c9b5eba48f1473f57bd3114b2b1262a7ac3e74831f00000000000000", "service": "00000000000000000000ffff55d1f13d", "pubKeyOperator": "0a251adb2e9d1287d3639625bceda5fceea84d056587c53e637cb50e1a078e0024a59197fb5a22b6fa47910944350370", "votingAddress": "33hpD66ygGNmiQaF7j4Rn7JVsg7", "isValid": false},{"proRegTxHash": "791cc76f3890fc5be2038e39633584cc67eeea76119d93c030826676f284240a", "confirmedHash": "5b561fd8acb73c24cef8f61c66bcca92ea73692397d3fac60400000000000000", "service": "00000000000000000000ffff2f387614", "pubKeyOperator": "90dc1215a8de8234ee8b2d45966781a40cafc93cd204e9eb1955d0549890ec7fcd2eb13fe145c52b7f3a81fa63edd8f2", "votingAddress": "48tVvQnwE3R7NZEtTvsQNxYVK9rQ", "isValid": true},{"proRegTxHash": "53f203ac9cb110ad227664e6403566bbc6698bbe366c6cd9eac615cf0aa226e8", "confirmedHash": "bc61a53731825ebcd0f4c534cdf4f31ce48c6a0e6155e7dc1a00000000000000", "service": "00000000000000000000ffffb23ecf80", "pubKeyOperator": "0aad1c7f45985e73450171a37dbb7a1e19e8dd39e81609878bd0c10712a8a8f95e354bde780c73da3923cfb3fc6a28ce", "votingAddress": "49U6gndZp63nH295XmhdHrtfC9zM", "isValid": true},{"proRegTxHash": "cd10332e29250b009b81be26bf842562f8bd0d3200f477da9e0b3200a332a23d", "confirmedHash": "cdc19c042a7ad5a421f5164ca0c4605266dfe87ed645949a1200000000000000", "service": "00000000000000000000ffff8ac58274", "pubKeyOperator": "08cb0aa4bd876acd9865ac68224e309b48935f4e942366f1f2b0dff30cf2b03dcb26109996707604542db2cccb68c4f8", "votingAddress": "2MZVt8cDcXhwmsy8snSVPLfejsEo", "isValid": true},{"proRegTxHash": "0b57fee5142712229d67eeea649b4a814497b4a7cb0d4d44da71dd38e23f661a", "confirmedHash": "3ab4bd33c5eca1db58f7ff7e6306e4e220a1d293c809e8f51600000000000000", "service": "00000000000000000000ffff68eeb0a6", "pubKeyOperator": "8e3228798ca85d0dc88046b93ad6fb8d15565428d79bc550b83fd9aec0c1dd869d502e56dca65bb06a06118e1c83aecd", "votingAddress": "4UKrAqzzV7tPeTypZsiCgqnqhgQA", "isValid": true},{"proRegTxHash": "32e30ec0fed78c0ed650f7ebeeaabceaf8b34de90684e2792bd9a46a79a3d519", "confirmedHash": "6ce54bf9302d305e275e5bdf8c6874bb7cf2e5cf8231eeec0200000000000000", "service": "00000000000000000000ffffbc28b993", "pubKeyOperator": "01d01a64d62004661b11485e01dda1fa9c3bbd82b87627bc30a4068f5520ad6094f2f7e3817751eb13bd67e51a395d5a", "votingAddress": "jdorGSrBmGRumHivYZnXmbo28YT", "isValid": true},{"proRegTxHash": "b72feb1bbbbae53f680c8cb74a7784b90c0069130fba2c2f0c695a2809a8e728", "confirmedHash": "54ca220dce6177184e60d8a3194e7046c2aad4e4adaf83190f00000000000000", "service": "00000000000000000000ffff52d319ca", "pubKeyOperator": "188650a881fc99dec27ef70308774dd7abf6a580f42c1c05732b2cc145bf33918fa95f72e8dab7b88c36bf85ea322fa2", "votingAddress": "4Czt3sFQCVWrV4XMFJp8uTGZjBS2", "isValid": true},{"proRegTxHash": "ed2faa4f86cb8a6e1a5f5126e6cd8fb7ecbf18da61561648a5d9310591122e88", "confirmedHash": "0cb8360f47acf4d83f52985b96888a60e8a13f408478b5ed0300000000000000", "service": "00000000000000000000ffff2d4ce784", "pubKeyOperator": "80ce1e869c9eb7a3e42b056b50e515a977baab96e6ad21ce7f75157ffd284483b30ed6ae6f2f3034d6eccd417d6365dd", "votingAddress": "FqMBjjg8Ap1MBGyBqDZvxy5rM9A", "isValid": false},{"proRegTxHash": "ebd81b5aaedee8caef90f549f255eea278c120a02975c32dce0d4c7125a33d7d", "confirmedHash": "60d516206b686f4383141d1a541f9b16d5ca4b9037f4cf6e1700000000000000", "service": "00000000000000000000ffff258b12b4", "pubKeyOperator": "06d1b760f3a07c281dd79b2b14f6b8c9b3d56863f9841557a63f124078caf0df5a8ea4e58906f40db4dabaf22e8ebc0c", "votingAddress": "NBx2yFgw8Pfv7puKnJ5nQamMugd", "isValid": false},{"proRegTxHash": "c5016e612c345b60a39f22a44cc2f5d05baf6d7adf85dbccefd91e534fa4844d", "confirmedHash": "e7f8740520dcfe0ca2b29c2ad2bd90c963269cbd19149f630500000000000000", "service": "00000000000000000000ffff905b7fa6", "pubKeyOperator": "11820f1af19de9438d632512d512b007148b12250455a46b2ef5023106db3bb29eb02b6cf56a4466420c76c276530e25", "votingAddress": "45Qm1U2W3DWDG1NPdvSJ5xHrvr7N", "isValid": true},{"proRegTxHash": "5e9736ece25d1456ceaecacd4e889f3959372637eb01395ab55c413c110f08b6", "confirmedHash": "5d9e0af8699d67da03bd5976ab68c6e1544e9e49c62795a40c00000000000000", "service": "00000000000000000000ffffbc28be33", "pubKeyOperator": "0e548004b6859015c4e203aa1a6741144597beca063a2c487fda9000947deac9e94b848e135ddc9952746b02e80c89e8", "votingAddress": "qXoadbhBg6ZMfsJnh5YShhqXEtT", "isValid": true},{"proRegTxHash": "2e428b1a1e30aeb4c9d55935b0a42550df404037ac0a784576d3054cd86411ef", "confirmedHash": "f4115b01a7ba530a1ec27076c7dceee2690b620439edc0610800000000000000", "service": "00000000000000000000ffff607e73a6", "pubKeyOperator": "16240feb905eada6fffbd75ab7adf0bd1db98c57fa79564064931623fa144aead83fe6cbf6de49e6df464472a212f02b", "votingAddress": "3vRWU3gE4Cuqbgm4PMBAYiSbn3aB", "isValid": true},{"proRegTxHash": "e21afd4c48290a5dec08d2ee4333fb30410fa155cd09ff510f7f4a2057c5fca0", "confirmedHash": "bb251e65f4da76b684a009ea274de75fe8b6931bb233f0150400000000000000", "service": "00000000000000000000ffffd4186571", "pubKeyOperator": "18d24a879aae9c7cef55e8cacb93db839b80c71a36f7d49354d59d7391dd315e6ce7547df946ccf88b80b44f3569eeaa", "votingAddress": "Lm51T7a6DC2u1yKAgwuXZtVsexk", "isValid": true},{"proRegTxHash": "d19bfd6dd3a3ab54f5b531ebd752d4641451e1d0f03d85b2f0aa82a9060b7a5a", "confirmedHash": "a1fac75fe3ba5b1ee29c0b89dd2d1557136096701cffc6ec1700000000000000", "service": "00000000000000000000ffff52d31521", "pubKeyOperator": "0a58f58351e62787eed69ce59771859e8988a4f6239bc1b170b38f4e560c1be220f49ab4199f193d58888ae09e521bf8", "votingAddress": "3ku6L29nQb8SPFqKjMTDycUXbYF1", "isValid": true},{"proRegTxHash": "37165252999edfeabf3110ff1c5d3dc51ce24516dde8b8940507a762f4461d64", "confirmedHash": "aa08940ee0c8b88f456156c18bbc311ce17437f3a2f4828a1100000000000000", "service": "00000000000000000000ffff2d20835a", "pubKeyOperator": "07cabe11262d229cead36a97b894a864d22382ebf481b34aa6d1eb0553fa1f0a7e75a1543489ae8f839578058a8b28f9", "votingAddress": "cu3VeMmgZp4NAy1oyoxuAJRUaDS", "isValid": true},{"proRegTxHash": "8b585291f360f894ab0e03014ec6c75a911d3d24d04a3a9168a9af959becc653", "confirmedHash": "7472f73f953a7a4371d524dc5f968d9991c186812496d4090400000000000000", "service": "00000000000000000000ffff2d206ea3", "pubKeyOperator": "92ed4a9ba16d2e55fd1ba47236662a273ad29b6f2ee5150b135fc924d33cde5fe8c941bf8ddcaac598484b68bc4be8f9", "votingAddress": "2pqkTj6W5HpLwbshjwxpT8uDaRv3", "isValid": true},{"proRegTxHash": "88a89145430b9d11e700299f192fd97f64ff958a75beb01eeae2f584c77be7f0", "confirmedHash": "40185d57a6ebf7388733c14bf2d49a26f67be0704ac89af91100000000000000", "service": "00000000000000000000ffff2d5575bd", "pubKeyOperator": "8beeacfaa3778883f34d1cf5f829a19442487f4a4fd60a44a4ea48ec12c5dc084c6651dcf1389a94349ba301513906b3", "votingAddress": "LSJgkDXnJAt86vJsLfXGqQkU7F4", "isValid": true},{"proRegTxHash": "9d114fd993df577a4f6e003ab1c09f3eac6d4bee5321eedb9bd095a1da528d6e", "confirmedHash": "67275c22573f09678a0f91dd9a3d1275714d2a6b9b7132072600000000000000", "service": "00000000000000000000ffff453d6bea", "pubKeyOperator": "8fee49fc8503b54fc58b02ccfaf4bef0f801098cc565a21ada920a2c1a4cb6c9ccfe7f1f9f6989834c4d7874ba3bab6e", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "7c48e1d5eb0d22bca927a523ef47e56981253fb6f5634ea41f5bad7cfdca67f7", "confirmedHash": "07441760607dc824d0d8bdefb3dec059d111218b0c4c2bce0300000000000000", "service": "00000000000000000000ffff52d3154f", "pubKeyOperator": "03e8076dab8cb1a1a70244754b23408018fdd84d09b7442b002dfe15e7e9cf7110573f5462edd4029ca7c64fd2845c55", "votingAddress": "356Mzerec4sy31xWxYctjakJojmo", "isValid": true},{"proRegTxHash": "e121f445ec02bbb5764d6b5c7112fd644ef8ea651dd1ffcbe86b7581696d41d6", "confirmedHash": "e59accf123796e0e7dfe26f4fd3dc8a76244603294deaf201300000000000000", "service": "00000000000000000000ffff52d319ae", "pubKeyOperator": "8768f19c7e03389fa860cd827306361a774e1d6effb98f1628d0b1bf910c4be08c443b008069483107d10ab6de0fe293", "votingAddress": "3ADwdb8Q9N9PMHszFa9JPRjoc3Aa", "isValid": true},{"proRegTxHash": "0c128021f3783eb30daddb55bddbffc9984e334cd89b4cf98adb331959b2a830", "confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", "service": "00000000000000000000ffff2d20c045", "pubKeyOperator": "8aeeb80e6e4a1a076fa340f4470e02f0df44f28d59c1ae42684dee368735713cfc660461dc00cf0b4cef9239712e73c6", "votingAddress": "2fMh94BwshYYDd7iVN68M3oUr9aA", "isValid": true},{"proRegTxHash": "89182733fae865fdc34a9c1299ce4d3e6b895eaeef8ac2e46972c8d9aa4cd166", "confirmedHash": "5d6870115ea0c769a088c3842543416ee9f9b339a08cb77a0800000000000000", "service": "00000000000000000000ffff2d202394", "pubKeyOperator": "07115da81e3bf2f0c8e5d5456475f5bbf338d3b775dc192ad679f999fb8a432619f29f761bcb92ea5407a3c5c9dc2668", "votingAddress": "32MajE7KKvyVHpvNCDURchyPskp2", "isValid": true},{"proRegTxHash": "dfbe46fe65e89f0bcd88ffa2ad62fadaa585720a8b70439b7759190121168d32", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b098", "pubKeyOperator": "17aa991967e33a8346c2d6675ed35be9ee3651f498f2a7433c35e28693bac644702dec24a529e2559f4fd828f231b6da", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "f0e30a113ebc4e5ef953a1652fba2b7074776b36fc828d02b72b7f3d752070a3", "confirmedHash": "2540de764e3bb2cd3be361633805f1487a43437608f0f2910f00000000000000", "service": "00000000000000000000ffff74cb7289", "pubKeyOperator": "1652ef22c52f2bda1cce5275b72a75ddbdbfb05ddd4308bc79ac5862e8e8f495236ab2c59ed88b08f746702730a68807", "votingAddress": "45omRhV7fJFgnn2aZZojV3HeSf9r", "isValid": true},{"proRegTxHash": "d4ee0e234942854db45e5b89ec1c9845dcd70df445d052fc6f0935bad08c5051", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688e052", "pubKeyOperator": "95e808db573c628a7b2d50248ea212539283b52004f29f6a8a7e38712e6c8eafb89d95b59eeac4e141a2815b62218569", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "2e2f02ba59f40014f542c1571f810edab5b9030f50df3956b3a56ded50f22c67", "confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", "service": "00000000000000000000ffff50d1e5b4", "pubKeyOperator": "197a83ffc71495608ff759914ddc23356c15a15a2e7914be34ac3e60d3d5c3371cf389be9276be3f2b1e17d1f774a6dc", "votingAddress": "2dLkyPoTHxT7N2PSp3r9uZuRaf1K", "isValid": false},{"proRegTxHash": "968a9242af444f35b2c9156578c003e084b5482ad572f9d76e86189afc97a6c7", "confirmedHash": "d1b7942dd1c2a7cdf8b9e0a644ee6c605f87388a5e91bc7e0000000000000000", "service": "00000000000000000000ffff50d1e0da", "pubKeyOperator": "960f63e1c8f19381869f3da0115ef02734f1475ef9a20be42e07a8a318eccf6810e46c26c3733abb9c0c66be3fda79d6", "votingAddress": "M55qJtxhmwbrq2k6vqCNxaMUPgy", "isValid": true},{"proRegTxHash": "1903b0df5f5e41b3ab0c348f207dff75bda0c6fc5882c7d9cab956d4314b753a", "confirmedHash": "b37d5c6757a8accf7cc47546db0a4e9f4c9f2a526804c4310d00000000000000", "service": "00000000000000000000ffffa45cabd5", "pubKeyOperator": "8c3ef6a93e63e18de055f68b92f3db88e290c90bde9732b7f1dc5b187b5b788f0d430c6d848e5331595393fae53397df", "votingAddress": "7grcZ4roEEC9rMYaN3TPEAYbaRg", "isValid": true},{"proRegTxHash": "bdf2bc04135aa5618984f85021fb07823f06f6fce400d3e2f4359ab082101660", "confirmedHash": "c25346de137c142a2c5b5596166d8aaf0072c372f6affdca3800000000000000", "service": "00000000000000000000ffffc28752ad", "pubKeyOperator": "84830a7f9af1b788df3060c089e3e7d6e242e94802dfb8d2eb46d69aa27276a860963c52b20f41cdb4791a71e58b4344", "votingAddress": "ADuD6yUtVkYZNkFG1Kv21c9gf95", "isValid": true},{"proRegTxHash": "71440b91191864171b1ef4dc75f521476b0aa1a8f7b5dc565c08ae2c7ff928ad", "confirmedHash": "e56b93adfd0e0ab2161a711474a459612a41a586d350d6211d00000000000000", "service": "00000000000000000000ffff422a6c44", "pubKeyOperator": "0fd404da8fdb750c4cce6cf0c18686ad1c5499685a4bc5f6b55799da97b1d66a1ac4a82dba090c8fb1501575fe65f073", "votingAddress": "2Pd3rVJCLNAXqoL2FcAAdK9krH9k", "isValid": true},{"proRegTxHash": "292e1102b02ece1b00222fce2cb22d341dd0fe26f6b930f90482237a6fac93cb", "confirmedHash": "eacc60fa07dcf71b346a41e82d72b488473e463b71b4e63d1800000000000000", "service": "00000000000000000000ffffbc28a31a", "pubKeyOperator": "8ecc25139fe2363f0daa441c0430c08aadec3b5c59684cb7d514ec04c3ec7acc9fc77b85d3b5dabbda1d7f1f760a23cf", "votingAddress": "2xbVHvDHXt33xVQMkmk3oVQ4SBeW", "isValid": true},{"proRegTxHash": "015621f056e0e7f85ea1321e8245ec1cc53290bd01b6ce47f09d3f1e96b8e623", "confirmedHash": "9bfa9a03e826cc43582482c443d0cc686f2a867793233c981100000000000000", "service": "00000000000000000000ffff68cf94dd", "pubKeyOperator": "87c5fa8399499943a8053cc0abd333d7de887494abcf610a3bad844345745c639d4b649a6e28f1bf14f66dfeff361f97", "votingAddress": "4UQcamMSfMiBDmrCa2CGP4t7xH25", "isValid": true},{"proRegTxHash": "440f817cb92a7049bf0f703680b26d1abde0c40700c0b3e008ccc4c00912ab15", "confirmedHash": "d7c09d08a000032b10c21cac416b8dd08b45682423f35c130b00000000000000", "service": "00000000000000000000ffffb2801b04", "pubKeyOperator": "8669cddb5fb4aca1e2c215fb8652bcee79619cb226a0d9e3b795960ef9c789b976cab8623a765e70de289ef5752f82f7", "votingAddress": "2GVQdynPgX8n65gTgS451x5pg4Cz", "isValid": true},{"proRegTxHash": "ddfc87b9095545f817483391d77f429d5991e5c0e66536ab0eae44ea6ccd04f2", "confirmedHash": "8de01d22192e6c1198cc8161195e7ee0cd781d39ac90b1dc1200000000000000", "service": "00000000000000000000ffffc0b85aea", "pubKeyOperator": "8926a8377cd18bff825edf92fbbd60830c32556c4ee1fbae09036baf5c41567ccf8c6fdef5395c0d45c8280a8dc8dd23", "votingAddress": "bXHkDBonQQ2nbkSszmQkJ6VrhqU", "isValid": true},{"proRegTxHash": "fca7ed6f1beca441fb9cff1b6314b2cc9a3065c5b35bb769b013828c5c26c4fa", "confirmedHash": "67275c22573f09678a0f91dd9a3d1275714d2a6b9b7132072600000000000000", "service": "00000000000000000000ffff453d6be9", "pubKeyOperator": "09453eaac3282a0c76638f66b0a5da648fdb0fe5f2a313097817703a9737f129af76632dd0749ac4cdce1f9b4c19e4d8", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "578f0ec6c718462b0b2e706a2e57590a9b71decd0194a1d1f45502d2c63adc33", "confirmedHash": "2efc7c30c9237be335d66d55d91965a27c3a1884940024781b00000000000000", "service": "00000000000000000000ffff87b50850", "pubKeyOperator": "1719314556e198ba1e55e2b345c048cd6599019a494d3f5add734ba75f9788edacb5bccac2ac6d3443366d7f958fafbb", "votingAddress": "2K4bMgCAB6t1GM74HGkkGoPPNvBd", "isValid": true},{"proRegTxHash": "39b30e8a21b9cf68d6a9ccae910cde9361bdf5b9bc0baa76e2a9fc2e7edd5e8e", "confirmedHash": "b5d9a6fe126e4cbd806688bd744721b041572b28d71895191000000000000000", "service": "00000000000000000000ffffbc28f178", "pubKeyOperator": "02fce0055e7809d2a23f9533d5966f23306582ec8e845467ab2b51a0c4d1ad023d1fac365b5f672a267b5d797176dc67", "votingAddress": "277gmZs1H8CC3YBER3m5aBoiGdRL", "isValid": true},{"proRegTxHash": "a2c1dd1c8154f0b2c64c493fc25d049f499177b256df646971e55679a0fec38f", "confirmedHash": "e11b6319ba1c8de44128e93cf56d6f8b954cd0214ace17122200000000000000", "service": "00000000000000000000ffff2d56a253", "pubKeyOperator": "82e205ee61e6be75792f847127ba9e0cc109e96f2320b04e74236a41876f41944fb32be4c674c54c3d43915c2df7c076", "votingAddress": "2UNHmkmqn68m52JA69QaskYA3Dwf", "isValid": false},{"proRegTxHash": "2c4a2f73c98c953f46925e7486694fcd2e67f16df572bb5ac3e5d7ac9edc9417", "confirmedHash": "4562da1ee45196b8dcd0b604adb1c17182f99e37221f19ba0e00000000000000", "service": "00000000000000000000ffff416c9657", "pubKeyOperator": "846b1ef76fbabf5448e4fe86c7cafbeaf5b1951e586dfcf0d8d2e3e27e375a92a80da82c8790c0a40d03960e36b7f85b", "votingAddress": "3bxx3tgYSzxMWrCLnd5xiWbVoNvN", "isValid": true},{"proRegTxHash": "1f500cc06f846d129710883c8920a8ee60742fc35e5b4772bf33481f16ffd488", "confirmedHash": "d22f81da6cbd1adccf2514cbed13eba5458566548c2edc4a0300000000000000", "service": "00000000000000000000ffff50d1ee96", "pubKeyOperator": "02c4cb497f4a7421b7ecaabb4a7aeb14da31991e2af471e3433e05ae2e880e58f96bd3e4cdc38e219e2865d692bf1edb", "votingAddress": "49czXgFM2kSCCBD2jDvkhMte9ZZH", "isValid": false},{"proRegTxHash": "c2dfe88dfd86c1bd9cc8036dd354875dbd59703b64f9f7e7c7659bf36cfe4bd4", "confirmedHash": "67849a82f90391a5711224e602e358c9595a9db7578b57cd0300000000000000", "service": "00000000000000000000ffffb23febc5", "pubKeyOperator": "02d48f7bb5726f1eee252285383b4b7d4aa85c0859832e66f38983a4a769128185661193c3b890c35f809fd9c7b2b5bb", "votingAddress": "3v8DfmL2NYXJ1QrYg89pCs4Npzb9", "isValid": true},{"proRegTxHash": "82d06229f471e35ffb9b12d0aa286b23a313e0f82ebf330f537d61d7d0387338", "confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", "service": "00000000000000000000ffff17a300b0", "pubKeyOperator": "8162cb75478d2328c6af409b3ba0f4f720cd30c340d0b608e62bfb7ed72015a35f1ff5225acbd97af2a33320fe3ede48", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "b5d00e0eaa49532e0f0ef21e565d246999f2184934a8e86f7fab49e9983e964d", "confirmedHash": "98e062c23dea81cc826007b931884f048f1482b4d146dee60400000000000000", "service": "00000000000000000000ffffb9248f0a", "pubKeyOperator": "8e433404d5169db60433f21db99edcce1afcb548d2b0414c9dbab698148aaaf8d91e1ee94a021404e5d8d3d644835659", "votingAddress": "2tTBQKfRsueEx3grBZQTfKuNFRBv", "isValid": true},{"proRegTxHash": "2a3e0cda1b7f4c7b8a723d8986dfe3fc62ad3103584c6d91b6b63795071a0568", "confirmedHash": "e3c35885ac9a51cb683c576ee4c036a9b2a4ba467a4270f70500000000000000", "service": "00000000000000000000ffffcebd24da", "pubKeyOperator": "0f070dd58ea94827066bca09659c52cd254362a5a16c6d4cc7e9d027d12981dd5975060622896caa065add997d1ecd08", "votingAddress": "2D2zmstHkPXhFhEnpjyAKMvLMH6J", "isValid": true},{"proRegTxHash": "60ee8e1f469a8aba47e850d4fd772a871e2a2b01d55c0c39a93abd238f9bc233", "confirmedHash": "e2cef7b9f1068384090d18f30c215f1ab018a917a8f03bd60500000000000000", "service": "00000000000000000000ffffbc28be26", "pubKeyOperator": "8e5e34bd4a86ae56c423f92db1ccde76386ea3f645b8d612325491f248627969220b2166ceb10713131283ebdbd0ffeb", "votingAddress": "3MZfTbV75ccmjo1TGbZL22cqq5nE", "isValid": true},{"proRegTxHash": "1cdf5742ab5b500f35a71136993c98cf8f275912f46dc7aeffa4b66828cd775d", "confirmedHash": "fd08563c48ed50c253350d647fa3f85e7501ee78d059f2f31300000000000000", "service": "00000000000000000000ffff3e4d9ad9", "pubKeyOperator": "043cf67cf2bdccb76f4289f3f8ce3cba3c01f8d8fdd9d68e87e6247c8bf75b190b08cab628a88f92eee559a41b7a7dcd", "votingAddress": "4F1F9gwYX4AWV5d8yMYUrPg22z9j", "isValid": false},{"proRegTxHash": "ee0b6788003d202d5008a02ab06b6c7ece389ef65a8f1442a64e41fa46fa281a", "confirmedHash": "00a0f11caf1689cde6798fe0abea028367a38472dae7fab02400000000000000", "service": "00000000000000000000ffff52d3154c", "pubKeyOperator": "907f857dcee8fe59e08fb04176fb7def4b74d016f45f3ea48db00537119f973a1be6425735b6a71b308d8c7e7eed7d0a", "votingAddress": "jmjJ98FA8EdbRU2Jhnv3cs1Gx1V", "isValid": true},{"proRegTxHash": "ccbf2b7e6430c7b45f50b1c7be12523b7d0b206ac658a40407d6c57a55d074da", "confirmedHash": "331a13c3fd19415ab654eadcb86eba123609aa8bd97d62e70200000000000000", "service": "00000000000000000000ffff26f2e441", "pubKeyOperator": "8966af35493e4710f0ca751cf4894a77b7679f476576168ff8c12adff2ab1015d48d2f9e5ee53e3cbd3d0393ba418599", "votingAddress": "FgmxoMcUmdLuFoBtk4kkN6izpjb", "isValid": true},{"proRegTxHash": "656d7f6585b56dfd49be295ef4937e2eda1572dca14efa2a1f0571c03263b6ba", "confirmedHash": "ab25b4d2afe1c56f9b33733608b170a3b2b23c76b6e934012900000000000000", "service": "00000000000000000000ffff87b5084a", "pubKeyOperator": "81246626f435dd8aa0e74acc82b7b98c9e7a525cc84e93f2c9d563627b40684621722800a54b0ba20f71bb252401a37c", "votingAddress": "31DBmXk2ZwpB4oXwMAfWBjhPFXAS", "isValid": true},{"proRegTxHash": "ef5b94073cc591b4ac6f1fcfdc04f6bda1db98d1a0e3547fbdb6fe4649bd7fa9", "confirmedHash": "2e21ea1d0c8aa28c24191ea5935b30f83602e7075ff1f86d2b00000000000000", "service": "00000000000000000000ffff55d1f119", "pubKeyOperator": "052f6dbd88442166490382c9a39ac1744e3e0c155bb5c2bab4b32e7c02eacafaf81b9ff1592769c556512116d24b3f73", "votingAddress": "eP7QJPsfRyhjT3xAy5YooQaaA1w", "isValid": true},{"proRegTxHash": "fcb21403adf66030bb34ab622849430c51888fb8968e931352d7f7494b0e0f44", "confirmedHash": "62d121838ab3a41dc59a1321a5d1429c6f26e3fe1f85c2a80800000000000000", "service": "00000000000000000000ffff52d31956", "pubKeyOperator": "0ba1909b34168558eed087037e6e02ec1aa7c102d59fc72c759aa759a78d8fdb0246ae4d9e21b67f32da410e573995c2", "votingAddress": "aLMrNGdYraArZhdEoyHMukQj1Ki", "isValid": true},{"proRegTxHash": "7c648f5c6f730af82d4e0d171304e0814ebcd9d4e4ca22a30e6535ea4f20397c", "confirmedHash": "b49a2b915e6d059734b6cb21dd335268f4879897137ac9250600000000000000", "service": "00000000000000000000ffff369efb6b", "pubKeyOperator": "0843a3713fc6fc05a730eed3c9c6b1562a23bf5f1a1d3cec58a8334ac0d86ef4801b822b35f9adcdf66b463d9ba7ff5b", "votingAddress": "b5YKeGtA8YD6QFeVinyjcVtC2Af", "isValid": true},{"proRegTxHash": "97156d5301c3c361a3686d0190b88dea2e17e2234b341bba6580d5c4befd681b", "confirmedHash": "eb05fd67845ef3c5bbb37c2619b859a097cb9098a73def932100000000000000", "service": "00000000000000000000ffffbc28cd0e", "pubKeyOperator": "8b8953ea2ffcd2e552047e2f4470b52a163017f278fd24e8d79e6c80f98dfa4461b0bcb6b1614afa3cae601f55dd0377", "votingAddress": "2VhEQzw1377YE8FWnYD8MYrbtQai", "isValid": true},{"proRegTxHash": "a4017655fda36086121dc95316e2311d191dcb8c8e983f45f27ac977a7acb844", "confirmedHash": "02480155e7acf82afa5eae3263f0d683dc1a85b1712e29c22600000000000000", "service": "00000000000000000000ffff52d31955", "pubKeyOperator": "8e58385add22ea3673210e005b3aa845e0bdd8da1451e817edaf3fafca608a9f1069437b069ba58c49a3357b5e893f11", "votingAddress": "3JyzG83xPyWgUU6Aao7PB7FMZGST", "isValid": true},{"proRegTxHash": "6d61c1ef75aaaef1818d4cecfe04e9f8f085c128fa718ae4c978286eab7400b6", "confirmedHash": "61b426b48193da58d341da801e065d5e4ce4393b1a4a3ef90b00000000000000", "service": "00000000000000000000ffffb23e7197", "pubKeyOperator": "86ed5b93457af5a8889d73338a5972229d28ea588cce7021822d7fac321b3f787096409b4dc8f2f1e29ed24fb878fb86", "votingAddress": "DCnvwKVpLAHxbjHgNEEGmnCEpp4", "isValid": true},{"proRegTxHash": "48ac40058a84985d8a1269890244a12f94b2993657d917e2cc5a130fb3d48d06", "confirmedHash": "ece2c76c0b711c449c467ad5c9756e7df826b32d20ec69401800000000000000", "service": "00000000000000000000ffffd418683c", "pubKeyOperator": "0adc4415ff532f35199f84d1090987573902d80d96969703a2d38f872c71daee29359162fb367b31bf21726d4d640ef7", "votingAddress": "27WDJjdMQtmkydw68mLHCyK6EhBg", "isValid": true},{"proRegTxHash": "c918290a9d720cf7a4020e4b688d37239998b8413fc99f62ba46c61143a25a29", "confirmedHash": "4d02683f6431f62aeda253a14acf27b2499e7114cf8903ed1d00000000000000", "service": "00000000000000000000ffff332682b3", "pubKeyOperator": "9118d499736b7759ddee1146377b3bcfea1efe11864390b93945f59eace103ea9f9972c04623c98da46d5657e1c4d659", "votingAddress": "WF62YKEacaafeFq8rj5b7HkC2es", "isValid": true},{"proRegTxHash": "89baaa83bb4fcb029423a52d52d9e9621e61fb8dae8a2fec45f216b301c7b8bd", "confirmedHash": "5f680c2bebccc7b722364e7e41377601c39874e2b4a7b2961800000000000000", "service": "00000000000000000000ffffd4186d5e", "pubKeyOperator": "0854beece2ae968a168948bdd38b1354c89de6f5b5770b86ace0b6e472896f140fadaa990634dd3e45af6e51aef5fccd", "votingAddress": "25CVcUJ1B5tsLLjhJzA7p2TPgTXd", "isValid": false},{"proRegTxHash": "eeaab79739a6069c0f0dda8c763e28c526ab52124e1753edaa7f66ec86356284", "confirmedHash": "0e44f9e7d600409783685f4d58266d7f1927c9cb65b793662d00000000000000", "service": "00000000000000000000ffff2e04a27a", "pubKeyOperator": "890ff1f431f2b4d3d6b77872fe40a13ba7bee65956a8c509534b7c1d101d937d45afd7646cb75735a39a533581182e56", "votingAddress": "27Ej19eY7jwrUw4tdPXPWL5NkHuo", "isValid": true},{"proRegTxHash": "c6bd78b67d44876305e62ab6ea7af44ca3baaa4d5e7f934da4fee6574777a412", "confirmedHash": "8e45bf03c8478990f4f9a896ebb87caf17377492b443b4290300000000000000", "service": "00000000000000000000ffff52d315ce", "pubKeyOperator": "824f2cd76c3bcde385910d875f2965ddbe6f9f2271771d61ab2a51001d82da7835d4e5dce177ed24257789c08e91640c", "votingAddress": "2Pd6tAbGj1n9tmNuZEZevV9vZiH2", "isValid": true},{"proRegTxHash": "f230056377fbe105e57e9e2f60a1d49b8af7a7d76d0720bd015145c1227f8d08", "confirmedHash": "d70f5bee9b84a7c75d9578d3e374077a3078f46ec38ee1a60a00000000000000", "service": "00000000000000000000ffffb009d202", "pubKeyOperator": "037347bea229a1c2870ac73bd1f4878ccce9ac9507242d6a1ef5ee9d9e9c2f19049bd75a30b3cb8d1a9b904ed76f0bca", "votingAddress": "46GV89VYCxMvGUqE8cSoBsuJLAHs", "isValid": true},{"proRegTxHash": "4ffe2cf30148e2d04f50add320c2803d5bd7d16825cd5da2fd479d9cde448b9b", "confirmedHash": "cd2fafa2bf3c9b3f2bce962592911be2d7435ad9642b61db0300000000000000", "service": "00000000000000000000ffff5fd947c1", "pubKeyOperator": "99d50e2bd0f24425db66159e9bb8c92a89fd5d55ab5607aa58c3102e83f521b4344de1c47b6b47d4b0a06ba3863c9cfa", "votingAddress": "364VeLxEGokfCoMc3KzoSfxEZBco", "isValid": true},{"proRegTxHash": "465e099ba973da4b782bfc6a0380c105e789881a56e5a61712d88a735b027f2c", "confirmedHash": "4a55d3cb84c4630d1f8424b7931fc7c632cfdc7918a03d371700000000000000", "service": "00000000000000000000ffff52d31547", "pubKeyOperator": "08c0bf3d78757eb6e6b4dc3a57b948362852cad3d23ba145571d1feb4a29eb5317526800ce5076b7bf61dc1fe1d1e11e", "votingAddress": "Zn7tNUthy8ek1tuqPL5bHECVcgF", "isValid": true},{"proRegTxHash": "19fdebdb81d4b3606bed976d91d77727f388d7c891d38a27c9506cff33d3eb1c", "confirmedHash": "62cada33ada87aaadfc09250fdc8a35a1af2e53291d92fa40e00000000000000", "service": "00000000000000000000ffff55d1f1b5", "pubKeyOperator": "09eb0a97e7eb2e26829d11e3702b6f190f38a205616a209592761696589b23d283a522013c6e65e91f5da0dab353c410", "votingAddress": "27Kq5SVcMq6vA8p3qkk4kVzcMai7", "isValid": false},{"proRegTxHash": "f968bd17763a9a760649ecea0f9c8d82de160494532a22da44109bb32f7ead0e", "confirmedHash": "904ee3899f9fd0384cff01092dca7d2462a34b2860e1eca10500000000000000", "service": "00000000000000000000ffffd4186ea7", "pubKeyOperator": "981747f805b2031d6ca96a9f56f61f7c368a5b207367db0f2c4e809db45b05172386e7bd1264dc25f2e11affc8838e07", "votingAddress": "2kbtm75VCE4BYXFtmEzUFFPtRvTp", "isValid": true},{"proRegTxHash": "6981fbaac8bf56a6203e92da512c0b344fa4abf0695b2a256bbd1118f2447821", "confirmedHash": "7b0b01497bb3943e3ecada5060932d0a0cce6546346c9db01900000000000000", "service": "00000000000000000000ffffb23febc7", "pubKeyOperator": "91728b730fb7ab123bbc73fbdab23f1522033e5935b93c27bdb99dca2170e63617e4ef1e005b714a91019f4b9cc9af6d", "votingAddress": "4A8HngCt4AGWes5EyKMqso7qirAe", "isValid": true},{"proRegTxHash": "53923843c2cb135ee47bc49ce8d8456c8cfdfe3fbc20221c2e00693af66b707a", "confirmedHash": "b6d39591d746ddc8c5b5f1f74fb591cc33e41b018fa9f0fd2d00000000000000", "service": "00000000000000000000ffff8a4444a0", "pubKeyOperator": "9395648eebad762dc7ad728eec415737c9ab0a6b0b229ce354466c6398dc9301bdf8a09c33af48d50fd7e405cb23ad77", "votingAddress": "3BHbJfNA4A8dFJUU64oZrejokvj3", "isValid": true},{"proRegTxHash": "1cbd63621b9b64fa0e2722adcc82dee99756eafb3c51ee37e7adefbe1aa01235", "confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", "service": "00000000000000000000ffffb945353a", "pubKeyOperator": "823f10ed714c41c2007a9bc91b9528b780d3eb771887ee331cbb5d9b80defb0b4a12e73a6e7ea0d65c0234bcecb7b6f4", "votingAddress": "3KErC4wjzM2MvkPec9Rc3H4bmj7R", "isValid": false},{"proRegTxHash": "f87292bdadb35c58277d69e3f62f839267bc86173c2a59f2dcda402420be8c7d", "confirmedHash": "32bbf722f0c3917741a832e06aaed787792adb37c96f3e750600000000000000", "service": "00000000000000000000ffff8c52339a", "pubKeyOperator": "93cd3d69ed93f52a02053a827e694798738d94560c62988c6ce5a66d631c3ce0e18178172dfb244630c31ce6f810c5f4", "votingAddress": "3J11xnpXVd5SGHkD86vF7kemwN62", "isValid": true},{"proRegTxHash": "2edb83a9d351d9ef7f87ea0e7798d8ae153d94c8849896ed04e8e6405be69641", "confirmedHash": "1ef41db8033b96fef921a5f2e80720f653dd5991060ef0ad2d00000000000000", "service": "00000000000000000000ffff5dbe8c72", "pubKeyOperator": "10e71be732478e80d015db9011c8a3166f112a5da6a1ce6bc38333e0f8285285b89c6faa03a813d10d0136b061ae1410", "votingAddress": "3mjcwhuW1p69LsxKWFkF2dLMupfC", "isValid": true},{"proRegTxHash": "4274ca51d926f6101ee57ca679154fd94b5e802a3407596e02226a5eaa9838b5", "confirmedHash": "a957139e1bb4c820b60e2af2aa46e85cf1619b401495086c1900000000000000", "service": "00000000000000000000ffff33c3d9ba", "pubKeyOperator": "0721d96eea01880f0245d6b5d22bc75a663bf66bb49d22ee76b9bc59adcc9ec2cb5d88117f4ee8ce4e0ef61cf3dfd309", "votingAddress": "3hY3oREtqracDYBmER7KiUpW2XNW", "isValid": true},{"proRegTxHash": "3330017a997c6f8fca48806eb3386510c8f960af09197eba5480263ea75ded5d", "confirmedHash": "62916cbb0731ee81940fdd871542d25f72ae3700e61a877e0800000000000000", "service": "00000000000000000000ffff5f55276c", "pubKeyOperator": "9219ad4d63622fb50f0907aba2f1c009bf301702e8a928ff4ccab66faf5d6634c60951e4144520ab33c7c42820d20de9", "votingAddress": "29ViXgaCVgWizxDmRt1w38oazP22", "isValid": false},{"proRegTxHash": "ce2d31b2cdd8c4abc9e941034e8842973479a8036927b1d472cc611462107587", "confirmedHash": "85518800e57ec823d44a71028c78482b9c449f950eea636d2d00000000000000", "service": "00000000000000000000ffffb9053588", "pubKeyOperator": "825120c307ac8f3b6278c3654a687300d9b588f06d8813fdca61cc5e0116f85f8502cfa4d11d795b5df5b473bf3edfc2", "votingAddress": "47sYxqGhFCpM1JE3LR2oYKim11jD", "isValid": true},{"proRegTxHash": "009815e5fc174885308178910fc859e48317825bbef27a3bd9760aa91df3a5a1", "confirmedHash": "0d59948b0ed422b5770ab774ac1b08218b856a61647726fa0800000000000000", "service": "00000000000000000000ffff2d479e3a", "pubKeyOperator": "1335e1ec72de4cb59ae213dc0977d62dddf0bcae1674ef71a60c8f5b1516055673e9e294b88faaeff4a01c485ad56a85", "votingAddress": "2ZRGt9Bj5Smww1FzZAT5n4YcLDM2", "isValid": true},{"proRegTxHash": "8995e421fb778d088af2f951fa0b908c87cedd426cfa94b5decf69054a29e828", "confirmedHash": "384705056af13a71965c968f8440f70435560c321393559d0300000000000000", "service": "00000000000000000000ffff2ee8f9d7", "pubKeyOperator": "8ad9b57824c2d059c020de10301098755d4b30b2d315897a30c550fa98789955095afb4278bef8fade659bf5b28c882c", "votingAddress": "46mTemMud1MTPC61rZecnFpNbMgX", "isValid": true},{"proRegTxHash": "edc86ce539068f1a8915b4e6efcae7e0ad4976be7d669172d98dc3201f84a128", "confirmedHash": "d9dc3f2c20b20aa1129a533ee210b5e6f3a034b57c9df7e11200000000000000", "service": "00000000000000000000ffff55d1f10b", "pubKeyOperator": "99f775a0ff7eeb65374bfb275631c0bea2d1821e1f8f253eb057c9a61faffeef8af31bf74110e018862ef22aedb836bf", "votingAddress": "4REEqQmhaxfRAA4RxUHmyFZJiKyB", "isValid": true},{"proRegTxHash": "4c6ad988c9a81dd79471961a8a47ba49086686245930bc231a50c77e4d790a63", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d52b1c", "pubKeyOperator": "856c3309b2dd367b115f79abaf787082859a82501c20af511d4127fe53cdaf4a004ef2f331f5fa9879a443d080b950cf", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "02b7661861dd6f14e551ded2ff84d70fd285b21657348e08bc0de8751c3cac14", "confirmedHash": "7cda983d2dd8a2fce5cf6141c48cfe13ed4c9c83d43f2b4e2900000000000000", "service": "00000000000000000000ffff5fd8ff42", "pubKeyOperator": "8896af29cd715936bc3810902ac87341e966a22793bd566be50e6ecb6a29d116a82399d03c85607d2f8e0fae4f97fab0", "votingAddress": "2wWyubuT3xPmAiU3cdqMsqBGhCvN", "isValid": true},{"proRegTxHash": "f9a42253c94533b3e87d4447365ecbbc8c0b851e55320623090ed7594c588e8d", "confirmedHash": "2b587de4bd665def12b221d38c4dc24f84f6b66d967c199e4500000000000000", "service": "00000000000000000000ffff55d1f19d", "pubKeyOperator": "90ab6d18389446ea0bc9eb5b87f00b92467080d8a3114bca66ea19a3937354593b12ee46497d83a331b53db93a7fedf3", "votingAddress": "MPtfYgmFYwV3xg4m4aDJJX3pzoH", "isValid": true},{"proRegTxHash": "1ad51306c7514a77887dcfcb1c0dc0d100faeef39b14a42ac4674bce8ab912b2", "confirmedHash": "f5afa53809cb1fe0aa8c8cf862a63c90f318236f57728f5e2400000000000000", "service": "00000000000000000000ffff52d3155e", "pubKeyOperator": "887888943ad54b7b05ee5b45498d51061c1718044a0cf23320a80a3c47dea091f092b7f7e318abf7a01552c1aa3c6072", "votingAddress": "2Z4KoSENKVfwGgzT4zexxgFnT7ML", "isValid": true},{"proRegTxHash": "4a6b1c517b24b4fb2afc46e8cecdf51f120dc6ce425403e7b03543f6921b0db0", "confirmedHash": "9a49d0a86edc09a4d0f030855bfea2449ab66fb12bbcbcec0400000000000000", "service": "00000000000000000000ffffcfb4f0a2", "pubKeyOperator": "9718a408c4480e70d61bbe398087131042c122f44dc2b77c3ac0ea6b93e5e096b9fc81e8fcbcf1bad669b629ee36535d", "votingAddress": "3VAVaNsZL1N5gxdWWsEm85EUzaQ9", "isValid": true},{"proRegTxHash": "baa9286df80a38f24173a45ae260b3e14e20071449f2b732ac08115b4b16dbff", "confirmedHash": "ba83608a609447777b7f39adc1fee8009c1244237820aadd0a00000000000000", "service": "00000000000000000000ffff33de8998", "pubKeyOperator": "8ff6de5a584a502e35aaa8ad618af2662910006bab4b61c3d9cc1fc870260cafcca562c4942c0845f31a1a2479f2c197", "votingAddress": "2sv85R3p1ft2k2SULJcLLxG487yB", "isValid": true},{"proRegTxHash": "63ab7725683c38672e0074b609e90e427e9a166bd2b2522c5b49185a458eb64b", "confirmedHash": "dda17e992efb6e90c925d967313985dfddb2aa5d0aeee9711000000000000000", "service": "00000000000000000000ffffbc2815f5", "pubKeyOperator": "97a412fd4cc33fb3eaeca6fcafd8951376375a0b6a2ae0652662d5f620bb68cbcfa0612419cad34d4e79ec8e2477aed2", "votingAddress": "TRHVy9XnLibyKXYo2LXfhg54fx7", "isValid": true},{"proRegTxHash": "ae8af17c532759b8eff7ee9d65939404465e09a84066f4523105aab4bbd7e045", "confirmedHash": "4e2ada05da4aea661f6c17ff40e5ae9c405a8e29702e0f172800000000000000", "service": "00000000000000000000ffffa516ec5a", "pubKeyOperator": "8eedd2c3ba53f0cf6ad4e2a4bdf5d1b85fba8288ff16d146cc1a1c256f39b1d51dda3f758079814f4686c941bec99a20", "votingAddress": "2SUmKa3gvmvTYuYqcEBgufcYEYkd", "isValid": true},{"proRegTxHash": "bed0121f67bdc522286d94546b703d3099608122e9494c786c90c4f245176c65", "confirmedHash": "2a70b10100cae043bc965a5cee089c92aeffc4d50d5d442e0d00000000000000", "service": "00000000000000000000ffff9fdfe097", "pubKeyOperator": "09f8a0fa4d99f0370e57996c722a499d1eda917b74655ffdf6507af5fd5ae9f42659ca35d5b6748c8d05b7be56237f22", "votingAddress": "2P1iGcMBLme9Uk3P8mwsyGgaE3GY", "isValid": true},{"proRegTxHash": "a1d4942bc34f11351645ee82912950f603db43c1efa76b9c02504d5ba8b403b5", "confirmedHash": "fe262375a8ceddfd2d764b03895f7a14c0f42124a8a330550000000000000000", "service": "00000000000000000000ffffbc28fbd6", "pubKeyOperator": "01ec64aae06a306850bf90a0365861fcda0553f9a0e9e2b7338cfc758c4ba4cec75908e0f3c1235edb46b63ae191d05d", "votingAddress": "3ubaGArVXccwbFfmcyV7QmzGN6Ds", "isValid": true},{"proRegTxHash": "c7409ab93431ab656c0532b69f5c82b75d4c6617dd1672169fc8bf0e1dfdaa34", "confirmedHash": "a26dc300d061e7e42266c92bf2e7163df76b4812333729b40600000000000000", "service": "00000000000000000000ffffb23fec6d", "pubKeyOperator": "05157ff9099407426cfc0600c3f3b475e1904082a6787b912676b6c3af20e0608e995ded615907fb51c8e6b77ef9c325", "votingAddress": "Mbq2mYYJ5qG7qqcriBzi5DnQMeS", "isValid": true},{"proRegTxHash": "f5030c3ac89e8c2b141f06eeada349fc61a7e9958e31360df1f7a6dda835eecf", "confirmedHash": "635eda11ec6eaa35f268baab3264b860f5e863c94bc6fb3c1200000000000000", "service": "00000000000000000000ffff3359875e", "pubKeyOperator": "94d1244bd8ebdc0dfc0b618477751b66a18638219cf1178aa4382119cb0cdc9c28049340e642fbfaf2b4cd2ceb418668", "votingAddress": "3qbhQU9iRADnL7HgXE6hjGdVsG7C", "isValid": true},{"proRegTxHash": "178f4f2d88f887d33491652d7a32df6874a9704c5fe0dbc5226c34ec0e8ec75a", "confirmedHash": "7d3cf2d675690981a689072dca56c7c076fffa4c16d274071b00000000000000", "service": "00000000000000000000ffff74ca6068", "pubKeyOperator": "8d5a1a345350220dfb51f47a2bf9951c78a3008a321067ae7d532eafa1c65a325bc3b3ab6f6d8a1c7cecf015aebe13f9", "votingAddress": "2QRXas49ukGugExj7arN7iNh3Y5", "isValid": true},{"proRegTxHash": "4d850e15f7285d1ab66f30bfa4fa9f4bb715e7c093d923456cbdc676c9834f40", "confirmedHash": "a6189f2ba70bedcf6cb7d736dc989ec8434e5ca9b05c48c32f00000000000000", "service": "00000000000000000000ffffbca649f8", "pubKeyOperator": "863f4a3a7672c63f967facf801f41fe961fcf26423283fa4f85ddb1acafacd776f4c8741d868631d444dc74eaf32d741", "votingAddress": "VCm12sBqF6Fi9Q8vqGacdRfNpBg", "isValid": true},{"proRegTxHash": "360f786cfc1eb34c28b722cc754cdc62d9d8f7c2b21cd726ab6a7957d5a5b147", "confirmedHash": "7cda983d2dd8a2fce5cf6141c48cfe13ed4c9c83d43f2b4e2900000000000000", "service": "00000000000000000000ffffb009d210", "pubKeyOperator": "81bbb0dde6cd5e6ae53960f754459538ea430be443f10ceca831d8170f0813a41e53b672b53b4308e8013fed9939f7d8", "votingAddress": "3HLakBP7zAniBkmqEhY1hUhr4Fdt", "isValid": true},{"proRegTxHash": "b40dd97d26c97a3d0c737b943c3e3eed3e4350cd1b3a10b5fa44e74bce6d4757", "confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", "service": "00000000000000000000ffffc3c906ee", "pubKeyOperator": "899efa9186f74b483c615db4c3eeae226d5b50fd6ba9dd7cd53a5dd794352ee1c95a77026fbd1fb17755290b9a7c3427", "votingAddress": "3M7EEoxCQjuPQBjt2Zy3etmJXpJ9", "isValid": false},{"proRegTxHash": "9a532f48c9d02dd3397902aee664480930ef79c801d0358327f9510202c8e1bb", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0b6", "pubKeyOperator": "0156868acf3238a0a109e3bad8c427e8d442fffabb18fdafa629458255b5b3a9546c7ed1e2e78e0bc7112774f514d785", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "70722853542be88fc3378b009054406b9329972ceed5081fb8768a0988f28752", "confirmedHash": "69675e795d5819225cc4ea600f8c1ddacaa353c003be25051000000000000000", "service": "00000000000000000000ffff55d1f23e", "pubKeyOperator": "09b5ee37fec9d0cdf216499dee7350c7f0bd136bec42f62502c104f3e7819033e4c0b2b543a0b069f166761082268893", "votingAddress": "2Ag46QjJRBLRzyqJfCc72qyrfMqy", "isValid": true},{"proRegTxHash": "a1e61913fd0d6d73ff3f3af21eff33efddbd1ac815043bc5791031e3fe30d24e", "confirmedHash": "7a1530acdce1114e845ce3c01f9867f8b31089d1bb9fad682800000000000000", "service": "00000000000000000000ffff0238d5dd", "pubKeyOperator": "0a55feeb95069c67139787e86c6ad236dfbc9160ff2d42dcf9da99be146e5618b709b26ad6b451a5d2c0d9ca81b3ee21", "votingAddress": "7Cp8CdCEG6Av4d2qZotVmvzN2QC", "isValid": true},{"proRegTxHash": "98a746174870207b5744158be367eebb277bcb6ebcd0eb7db3cd97e739a0d8ce", "confirmedHash": "118750a5ac82aecc299c4023e8a12b3a9a73e21575f901093600000000000000", "service": "00000000000000000000ffff68eebab0", "pubKeyOperator": "14b2c4ff9fc14c8f724f5c16755f5cc612ba06bb4a83473eb1de7656adb011b3e373c02bca9cd4c1f990c53992042510", "votingAddress": "o1AT9SFsQSuAx5KQqgH7oZiU3uD", "isValid": false},{"proRegTxHash": "ff4f88b1d43977167a9e7b70ea43cce316325888353a6ba8a75a0d1cd86d84eb", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0d3", "pubKeyOperator": "8eea07e9f2876570ca89d250840a95451b074a6fe5ad1c6bc43554d4e48e275176068f5849688ca6e3441f70f25d9fb8", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "1de8b128d9127566188557eb4703b494cc20b42bcdb9e73e44fe40bfcd1b684c", "confirmedHash": "f320c62d8c6ba5dc78bb1701ee41cf6a73f52e0d932f20640f00000000000000", "service": "00000000000000000000ffff8b3b9e6f", "pubKeyOperator": "96b7e4f9ca9af7d1b881447ab40b81d1204226db7942f9ecd8631429b232f2c362817a55e691968a5ad13f5c827891b2", "votingAddress": "D24w6vid743chv3JDMUPSZum3qF", "isValid": true},{"proRegTxHash": "520963cb61ab5d8108b441042ad7418e2d206614bd004ef5c5b7dee658b11c67", "confirmedHash": "5a36a108d87b142451c92901e401cbe790e7f514080bcb3c0700000000000000", "service": "00000000000000000000ffffa45ac549", "pubKeyOperator": "1261f9309ba4a3c38270ec4ca8a443a1b4d7f34cd499744a14a319f50bac60d58ce79fc3a9addc2fccf7324ce6742460", "votingAddress": "62rb6ETTqp8SjUpasEo95HHZ9xP", "isValid": true},{"proRegTxHash": "153bee6ebed6010ecad0b205db9e5eadbf2c6454a178e07cc981f845a6a111b2", "confirmedHash": "58cd2211d3576b50f2b46f0d6a3745b254b75da186f62be21800000000000000", "service": "00000000000000000000ffff55d1f25b", "pubKeyOperator": "8486c481fb61a1f9f14a5fb2ae682e1cfa67e9c7f0069c268c849927232a1b3eac8678ae62cb8566c5c516dee02a97ea", "votingAddress": "9h6Ka5HTWMSpXztGtnF6f3yrtaH", "isValid": false},{"proRegTxHash": "97c88160e127ae2158fa67f6ebd155f5b9014a8f859290e269bab4bb29b9a725", "confirmedHash": "e185a107f5402e23f6f9a62e294308e623a4f183ed4b25221700000000000000", "service": "00000000000000000000ffff5bfaf9ae", "pubKeyOperator": "0dfabb12376408e5f0eb7ef6b00e1b7e79cd37424e8c94ec9528d71fe7af3140e02a598ce95dbcb8ebc97b51f393226a", "votingAddress": "234sAYGktM88SLDJSVBuMKGU34io", "isValid": true},{"proRegTxHash": "c4271a9dd6d02aee3369a2da522ef64d8b1c26ac5fb6d264c01b53bb8f99e103", "confirmedHash": "31dfdf11dae9a375283a684d0b88857b20cf7808760f84d40700000000000000", "service": "00000000000000000000ffffb951a70d", "pubKeyOperator": "0ff24b5b8e1f178f0845466eef113cea89682e0cc3472590437043d6bf00d8f72b06977daa9437d681ef536391c2add1", "votingAddress": "3BpfeQCQ4GE7SYjUm6DK5sNrLFy5", "isValid": true},{"proRegTxHash": "f6d7323cb33fc3d5202e78da3a7915f177ba57c322ecfe6ed6d88004f2684ba0", "confirmedHash": "83e46e5a745b1cba2bffa53f86f255a8536827be9958ec282300000000000000", "service": "00000000000000000000ffffa4843767", "pubKeyOperator": "1335202b451a6175d33ec5c647e5c8b820fb89cdd56ab18aeab9061850db7dc398b3d51b135fa2cfdc9e6edc502b0f1c", "votingAddress": "2eUYVQu1NV5z4kA9NxdWTUbVasLq", "isValid": true},{"proRegTxHash": "30bb946f10ddd7ce91ce0b6482b13dd69bf88969d28600025fc3cd71ed7eb734", "confirmedHash": "a6e6a0a3e941591ab781b6ecc6d34de9f37b6796bf96ac5e0a00000000000000", "service": "00000000000000000000ffffbca6259b", "pubKeyOperator": "143947c7996e131a8b3bb0c969b0c9951a3e6eb97d18a75e2c76eaad04ab3598f5609f6d50ce83002c47e1716a036d6c", "votingAddress": "2kSgRwgJEYaL4bhmxLtfASNJJVuK", "isValid": false},{"proRegTxHash": "9c9ab6520c6ef0b892ef57cb22c1610d5602ee191d115110cbd8799346539f9b", "confirmedHash": "53a78b0c6cacf1ac96b3879798fa784d5c58addd6c4eaf660b00000000000000", "service": "00000000000000000000ffffb945343b", "pubKeyOperator": "1684ed8b1b108409976f6ce7251cea3056248b53f30a46bb3e457bfd0b50dd0d1673408f28a717fe6492a122810875a4", "votingAddress": "2qB58QD3rzwuFSoY8gVgvFC452mK", "isValid": false},{"proRegTxHash": "0e1d925207de291b0e36cc0e74c22a16065ac440762514954a698540aa55d472", "confirmedHash": "5415871f1877b3e6d01a2711c7df33eee83f032a87f143df1c00000000000000", "service": "00000000000000000000ffffcebd27ab", "pubKeyOperator": "846ae84d53cb3b7b7cd73b2c7bc2f198669e6c075bdd4955c310eeb7148fe93ad953a8f15c1bbad65281142db1387aa3", "votingAddress": "3aRLK3FvrUkKvck2v2RKRCjPb3pa", "isValid": true},{"proRegTxHash": "c50cd951e30e591b89f6f7001ce845a472a61014779811166da10563bfdac439", "confirmedHash": "e9babebda286e2624e9ba828607a4cf0c91eaac599000b3b0200000000000000", "service": "00000000000000000000ffff9df54ab8", "pubKeyOperator": "09d2c99d136556a2e7fe3f2a4757d196b365a2669fc10edd6fd6b2528440838c8d6e3a1e2f2155478dde02e6b3755b01", "votingAddress": "3R7D7GxYzKhpnDXm93PMwkjkLDyY", "isValid": true},{"proRegTxHash": "c9c056183686625d073a41e97e46719c91610b696fdb31f1c7a517d24135c4cc", "confirmedHash": "99b3d0f943aa2807a2f0f30a375efbebf6ef1e51aa5c2a862200000000000000", "service": "00000000000000000000ffff90ca132a", "pubKeyOperator": "8193d738de366c96e276656dc424c7bbee967ac395f8081140cb5ed4bd0b8fab684e74125a751bc28560b2f516ba24bd", "votingAddress": "3ReziTp6m3KSyGoeoavbuRWMR6sN", "isValid": true},{"proRegTxHash": "a2851e625ffbeecab0c2abdadb1755ab2b015bd7a1840841d1f538bc75d4201a", "confirmedHash": "92e88e8c6db10d1940f2ac18144fe08855106086164582001d00000000000000", "service": "00000000000000000000ffff50d1e868", "pubKeyOperator": "952986c8b417ff0fb1ac11e2c6975ac52435e9cc168be7cab5dd73a3af861403932f8120c0ead5f308f38f9a0fee56f3", "votingAddress": "4Xwn8Zxon4XsccoDkLuhwzfi5NrR", "isValid": false},{"proRegTxHash": "6e7c93c7541fffed202827efcc6570d613e81199ea571f02d62aaf81595c2402", "confirmedHash": "cdbeebc4a3580b1d894014dcafb37c7472a5131b33ac100e0100000000000000", "service": "00000000000000000000ffff59280023", "pubKeyOperator": "1405bd2ab5ad5dc889217ab52ae0dfb44551ea297e15cf754d4736eeacad75bece59cefeca913be43234a1b1a9411a11", "votingAddress": "47x5XG2mMPUrCRaNNWqLPUrooZa2", "isValid": false},{"proRegTxHash": "dd25a8e7a0b089b3f4dac80e83891723b1bb6f65e9141a0b5dca475f336c8a31", "confirmedHash": "620765d85c7bf3051021136c79362c0f460a3b9688f0f0c21400000000000000", "service": "00000000000000000000ffff03d72586", "pubKeyOperator": "8fd03ccf9ef6eab2bef04e5ad5fc932ba584a9e02ee517f03e928a47f85a637240a89346422e27f621fbac58e913ebd4", "votingAddress": "2LFRbD6YSiBZZppQAiVRRpsP1F3Q", "isValid": true},{"proRegTxHash": "3dada537ef11164d8044197f8c71c012871b5582811786e7ab06d788a744f85c", "confirmedHash": "c09da1b76e75635a67cd90f4d7fc00c1a0541897f0bc26041200000000000000", "service": "00000000000000000000ffffb23eba27", "pubKeyOperator": "8451624e5fbcdcf1703e9c1e80cef6e07e648ce343952f3e30c82c17c64a934870b54f30249398532e4a3e74a1e07df4", "votingAddress": "3DJ2SyGAE7bWq8fhHxpmhRTPtD2e", "isValid": true},{"proRegTxHash": "76ad8e27b02bd27a464ffb3332d91c05ceaca2aca6af447026d7a6a5b3d7995f", "confirmedHash": "a226e69a5bfd401292470fc800bcea75413cc4fc48c292550e00000000000000", "service": "00000000000000000000ffff52d319a0", "pubKeyOperator": "12cd79728758a002a521a13d0542e9f1231dc0d92252814831741fcfb0773f96a10f066d5359675964ed60ade22e8eec", "votingAddress": "4VQcdVCntjgEQkcEhBNatX7MjXUX", "isValid": true},{"proRegTxHash": "e0cf7510347a605680a665d0725b13bd0239400b71b919d50fc7fcc61413a062", "confirmedHash": "49ec79f94c269b887fd26c30924fd3de5b53f68b363f80a41000000000000000", "service": "00000000000000000000ffff55d1f213", "pubKeyOperator": "992521fb4c5f1b12f8a129f40c0c53e17fdd2ef9c9dacedc65deb18075eb8c71f748893e14bc4c556766e60bea3935b2", "votingAddress": "4XC2JFt7Lryjsx9WipqWTZHT7oT4", "isValid": false},{"proRegTxHash": "a23f44a41c35c4b5276108f1018590e56613bc8b7b66c9c96a61c8dfd53432b6", "confirmedHash": "d1e3e3f5851d5e0b42013c7e796a38edfd86d489cd9e2ab20600000000000000", "service": "00000000000000000000ffffd8bd935f", "pubKeyOperator": "03ffabb0588844a60d5449a29fdabf8b99be18b25ccadfa0518d44280874993ca6458a3c939631af59fba7d0c2d52063", "votingAddress": "3bLL9oAzc9zbmU7HFkzE1FYzHe6n", "isValid": false},{"proRegTxHash": "5cfad3655b81f5885d7cf66436658122015465da5f4b7a13583a748ebbd204a2", "confirmedHash": "ab5d8290124e5fca0fd048c8ca1f4feb4772cefae8feae0c0b00000000000000", "service": "00000000000000000000ffff55d1f288", "pubKeyOperator": "981fafef2906b35c44647d4ed34b867e83eac93d5a0f24ba30dbcdd995573e4540935e3ae17e782faf87fbf60d298b62", "votingAddress": "7aEa98p5wMzDAkrbV9B3uF1fvnt", "isValid": false},{"proRegTxHash": "eadfcab21268752697b3015778f4280f2277920380d48426114c5563f44e717d", "confirmedHash": "76ca971f141a771d84e2e50da22a6191501535d43077e0f62900000000000000", "service": "00000000000000000000ffffc28754b6", "pubKeyOperator": "0f2a1eff2ae29124e34aa1878c105dfdcdeaf786f655c13be34ce97f7db53484733c2ffa2c9f9ab9f00d03185fa20ac1", "votingAddress": "LPz7u9Kap5N3wtYvsgptG4qAa9T", "isValid": true},{"proRegTxHash": "e72e2de9617488ab16ac133cd85fe4e2c3ac9f06197955eaf980bb970060d609", "confirmedHash": "068c7c57e96cc57fee314e66c0050761fcd8d7ca12c809251600000000000000", "service": "00000000000000000000ffff422a4521", "pubKeyOperator": "987cecf74e2205d632e5ef28afe874888cad11e7b0c8b58ff7b9f865a14fc41dfb48a11b2b5ca92a793aa4796fc5f3ad", "votingAddress": "4EqsjckKrrx5WHHtrXmDowRnedZj", "isValid": false},{"proRegTxHash": "a591320e5d576880dcb87da786de81720421558a6f9236ca1ece7a1979c2b724", "confirmedHash": "4eedad9ac6806e3c89972ea51184c5c94b191ca1dad7680f0700000000000000", "service": "00000000000000000000ffff5fd947c3", "pubKeyOperator": "8b4253f994e44b1e241fbefa9e8148ebc1e86bc5fba5c2a75d2c852ece56c2dab7138b9e87a8dfd7a53df4e6a1103707", "votingAddress": "3G4ioc7VFv7GyQVUxM6xW6bJWXEV", "isValid": true},{"proRegTxHash": "df3976529d9e9696b74f34e16de17f28a73583e0b20db6205b34057442f9d66c", "confirmedHash": "783fc6a233e0854653c8c3a22cbd0188b6cc25063cdabe750700000000000000", "service": "00000000000000000000ffff52d3191e", "pubKeyOperator": "820145104343a5b633bf6d1fab31868a6bc2ae6b39f324546de7b69d72d9a345c34bb74abd4fb05c1fc51a9fe9218261", "votingAddress": "3WNbs3vVZJ71cWxryHgyBJYVgjvm", "isValid": true},{"proRegTxHash": "657c068b6320997011447767e8d9ea3c6619e5513ac577a9228ecc0dd8cc5732", "confirmedHash": "5a44ea07cc8c568ecc510aedc72aa5d8a39d271c3e55a99b0a00000000000000", "service": "00000000000000000000ffffd1fae82c", "pubKeyOperator": "04b9e636cab6d25b43889f80d9b4c81699574b3670ea336be7642497fd3eba1e297ee05d2b0083fb594586a1cdff515f", "votingAddress": "7Ybab3M8adxHKvW3F8C45tPeo3j", "isValid": false},{"proRegTxHash": "1613fa6f5a9151e214e34165b3d1a56e6591a94e2f96b24911314e84926942d2", "confirmedHash": "06063039de00dca463cd44b7aba4eda9677f9e8f374e0c772600000000000000", "service": "00000000000000000000ffff8e5d92b3", "pubKeyOperator": "86c4c09198d62fcf414ec69eb825755722a613537a988c3f26529952164b68c3f1d71eaa7edaf0494080b9a654cf2084", "votingAddress": "2k45xpQA3KEHYVCne1pbyUnnwFVh", "isValid": true},{"proRegTxHash": "dcdd12bbc24432915e0092d91329f63247b1e751a1c04077934ea06ac6565ae1", "confirmedHash": "ccfd5e3b631cc87126b5818a698dfa59d1e849366d522bb60900000000000000", "service": "00000000000000000000ffff55d1f211", "pubKeyOperator": "94f26fc407123bd11ec67a2bffede806649ab6a733473360e11c53fa9c4213eeb487a4f537f37243d48869c02d5a7f84", "votingAddress": "4WxZbjw2ksmLGmnN4V2o6RvqWAon", "isValid": true},{"proRegTxHash": "9d84a4148764555878c6c4725ac9654826e7c20173745e2fb42a7fbaa0803a4a", "confirmedHash": "53408a699779a837116ae9e6317b1343bd222a9bad4248313a00000000000000", "service": "00000000000000000000ffff2d209de5", "pubKeyOperator": "88647a06f9f8f9821cc9efde02ae5404c654fb4eac958e4cd8b8f7093b70853586df3dddbb627b220f1a29645d933271", "votingAddress": "aWBTLRGgHJ15Kneui9yiTgKzTz5", "isValid": true},{"proRegTxHash": "e6365a07df051dce417a0a2cbcd71cfa61d92a5b12c43db4bc93a58f3d416320", "confirmedHash": "60e577983eece8fa69e60d42d2f3d9b83bfc146475a3591f1400000000000000", "service": "00000000000000000000ffffb95cdf19", "pubKeyOperator": "96cbaae2e210b872c9e680c631c9b1985899dbde70dd1e570f41b2e3287d9e99a152aa0476094edc647625b3ef46605c", "votingAddress": "sGLny5TTSeoqWxNXsuDakLctchG", "isValid": true},{"proRegTxHash": "501668bbd5cf1f42ed2d51d5f42ca6fe6db5de68ba3f52bd1edc3c56f3bdd59a", "confirmedHash": "d1ed6016c75ec0512253ead57075eb0057c965ca910499c20300000000000000", "service": "00000000000000000000ffffa8775781", "pubKeyOperator": "08e54f445249015ef165e167eb8d86dd1be1fb5c430e213f51cd2b56ced221ccca9f32947cf83da6839371e3556dc2f9", "votingAddress": "2Mqk7PMDTEjwZdGLR3D6n1vNpK9", "isValid": true},{"proRegTxHash": "504392d25b8749caff5e3e9901c8584d759f443646153558df1fde0b0c60d059", "confirmedHash": "b60c2dbbb213c99a236e1f30c1d9f41b204f0b13b294c83d3300000000000000", "service": "00000000000000000000ffff52d31922", "pubKeyOperator": "0e91e6b78e52a9faaa5cb0aedc595b8d47df93fe5b776aceb00409c379cd3d84bef112fa8268656213b2619ad0f75214", "votingAddress": "4KDfpQRiCfmKpxLbhUtHCLrC7SPj", "isValid": true},{"proRegTxHash": "c856c606c2227689f1024824ad32099db5617395dbcf8475d885d5447f611de3", "confirmedHash": "a646f8c8e895c2d292c12ae6710537b55732e8f51bf59cd90500000000000000", "service": "00000000000000000000ffff50d3dd8b", "pubKeyOperator": "0deed07c91102156faed7674e278b5940a05990aba7b487595182717dab4cad1f65e0cee6893d2e570115f0f405b382f", "votingAddress": "46qcnEJFAxnpfqtPgsQQBHH7nP2h", "isValid": true},{"proRegTxHash": "9276b5d66dc0faf75b60b392beb114fb55b9445471c842a2ccd97dba9ee3d18b", "confirmedHash": "d3784a868f2fbf7c46dc052d63b55f1ebd403028dfc4fe8a4700000000000000", "service": "00000000000000000000ffff91831c74", "pubKeyOperator": "166e6f2dc61d40cda2a977b84ed534ac25a32d58ad16457f6fe5fa60b1f9d453f5af33cdbc6e9ac5e579a7b737dbeeb6", "votingAddress": "74CbxiQJhyzGwfDJmbXTjdfE2tt", "isValid": true},{"proRegTxHash": "9a848fe981db0636deb03a36dd52ff67ee5583385585ae0b942eafbebdcbac87", "confirmedHash": "27fc852b5b77a10d8ba78603119d7e491d4c11c74b9d4ee80000000000000000", "service": "00000000000000000000ffff2d4d2cc8", "pubKeyOperator": "8eb054fb7e6f261e1e8d0f3637767bf89295998e088f0f6580d7596b4a4ef098a0d679aeb781889219c3701e38b504a8", "votingAddress": "2rFYaFnJrsn9vXqir1TbL6k9VLSr", "isValid": true},{"proRegTxHash": "3d5e37eae4ddc818da9ca878d0fc49e3b1646ad51a3214e85cec287092c53f57", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffffc17a9c0b", "pubKeyOperator": "8054ce4fb7a8a54a8218cfd95773da3712d0905112049ece7ec61553f56fd90f64c4e10bb235d6d0018a6d41da047542", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "35d1411eb7d238b5bb39fdbb48345a7245254be4949d3728a1c72daa985d90a2", "confirmedHash": "57efabf56b41af47a1c5fbaa9f869933a1bcdcdfd9e694581100000000000000", "service": "00000000000000000000ffff9fcbb428", "pubKeyOperator": "8bf3df519bc4e63cc86e95c74f518fc34aa409e8ad4bac8e54350c550ab905061fb8e84e8da67197547bb70a8f5e2fc7", "votingAddress": "2YsvtAo3pH9ZksYuYaUttNU9JL8S", "isValid": false},{"proRegTxHash": "88de6819e539bf702096e71814d61f2c35bb0fd52aaceec917b1b99ae54b9769", "confirmedHash": "46c492242f96706f9cf03561067468ad6a221205fbbc8ca01300000000000000", "service": "00000000000000000000ffff52d31936", "pubKeyOperator": "0fb14c31c4140d462aeb60c48741dafbe78a08ce77640d912d0439b3b083819d751c81c426842f2246229b2574381128", "votingAddress": "a6Ae8iNMTJActTbh4pyoRzjvBxa", "isValid": true},{"proRegTxHash": "7742cbc61caab6d00c5c1225bf72eef5e4c7b530b8784c999195fa070ee1638e", "confirmedHash": "08d83331ceaf20ac921fe42c759e6f027888a0eeff7865991300000000000000", "service": "00000000000000000000ffffc0f1e7bd", "pubKeyOperator": "99a22886cf1b4f03e64c22c8fff3c6bbbfa3f0d74d0dd11b1c3aebd0d3c49d9db332a18a8f72dad6754c8e7441683cd5", "votingAddress": "2aJYSRHKEGWPYDMexYkfiofvJ9Y3", "isValid": false},{"proRegTxHash": "38e65410afadf893c4ca3a111de4b39901c97a65d436293b84d10d089b93f608", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d52c2c", "pubKeyOperator": "1140e36593dcc105308430b58379cae0b97bbe44ef99f1b702ad9dece81c7b3f27e2b2e4e0867c2180d98832a2ab5a12", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "888023c633ed03d48cc7586416187f6ab3e65961157e32eb835c01eda3c805ea", "confirmedHash": "21efae7911020fb3d8c28dcd3e9062eb83ad279cc1ee3f5b0600000000000000", "service": "00000000000000000000ffffb23ea1b0", "pubKeyOperator": "129c33054216010cec4f2e48d3e102587ec7a6ecd87f90c18c85cf0f935bf294a7d0af5a4f93ea06b1191802c2d9cb66", "votingAddress": "kGbi45cP4MWU5wCUH7wJ19iRw6x", "isValid": true},{"proRegTxHash": "37e7ab08021d3cd900e74b77f3f543c1c806b6a98f7010aaa14ff5f5d420a5bc", "confirmedHash": "6266fe2e2b621e0cb4b997f2c50dd9fbe859e44d509770b50c00000000000000", "service": "00000000000000000000ffff2d206a21", "pubKeyOperator": "18f1aa2eae57eaeb498d0023b59dfbc25ff1fe27b39a4dfb8b819234433c9449713bb4ff48d4562720484c960a9e8abd", "votingAddress": "4YgwAqsq5pqTcUH6vrBnrmSBWPyV", "isValid": true},{"proRegTxHash": "1b9d48442bcbdc681e4d6af03defbeca068ebc361aa1653fe6c541dcc1b82921", "confirmedHash": "f142219d724bdfab00024f3cbed54a68a5d2e022ccb528120500000000000000", "service": "00000000000000000000ffff6deb4567", "pubKeyOperator": "156eae7e848468f553c84ecd05227fdb8e6fcbe4a579bff5378958668b5c80cd96f44878df00f67886605b9beaa1071d", "votingAddress": "32BYfGrWKPSRmvqpramMG5aG574m", "isValid": true},{"proRegTxHash": "a771972c82232f914ce2584ddcd842241b225d249a55514dcbf78f2d3f7b942d", "confirmedHash": "0a88e616e07dc85c38dcf305709a70b226aa2b6c37d650ec0600000000000000", "service": "00000000000000000000ffff5fd86d87", "pubKeyOperator": "0f2e0654dd35a1880709d1e346058a6370492151ab28ddb76d15810027a405da3017942defdbb6070a08fd21d2561f01", "votingAddress": "2oY93F2MTdz8ircdghWRdnY2pVvP", "isValid": true},{"proRegTxHash": "234acebe2c8078f89dd811032b590dbc455f5d290e4f3fa0ac7eca8bfdc2f1c7", "confirmedHash": "823623b132b8fdf457c038880fd0b879501afdc11fd684ee2d00000000000000", "service": "00000000000000000000ffff6baaa54e", "pubKeyOperator": "95c0145b9ed64de16520be36e899de2d5451e308a63fccd1bef0f92deb93109dff6681fb5733da1c82dcc0d640faac84", "votingAddress": "uPiNxLTKwBUXcXkyjNPvJtbDWfy", "isValid": true},{"proRegTxHash": "d0d32f95f863ac860b9ff9f4e0dd6ea3d563e730e3f50f3b5814aac6e950c2ac", "confirmedHash": "1a3ec7ccf60845d2a548401471dc1731352ca5f1c65a73ea2100000000000000", "service": "00000000000000000000ffff8d5f5be4", "pubKeyOperator": "95ebfa6401023810ad9db0689cf0681538229f9a16aefabd5a8d68eed34b1747d154afcec60cba853ab950a18f87fb5c", "votingAddress": "3E5G8sks5nTft6BNP14LiYAG6ZUW", "isValid": true},{"proRegTxHash": "7003b52f22a2a25c2149f8c274de0ecdc3188deed9d1c20834972d28ca42b3cd", "confirmedHash": "ea43b054194b39c2cb18b7e56f47819ee3c37d30192e139d1500000000000000", "service": "00000000000000000000ffff05b5ca10", "pubKeyOperator": "0f5b84f578a002fd6205ce995220cd1c9d9a5b0d904eb729067ffd4023e748c336597e2f88fed420401cf57455a0b32b", "votingAddress": "2KB47UnBfRkbky6m6iZtyw3H1R8g", "isValid": true},{"proRegTxHash": "b506e2f521574ea720f302209ad705e4eac2d5cfa0d76fbae194a85e1158c95d", "confirmedHash": "a90f779cebfac63d530d1cda1f59f79f28814a868b9bc2d30700000000000000", "service": "00000000000000000000ffffc0f891de", "pubKeyOperator": "87a26e03d7b10f61dc37b7b27aec5b18d788ddb243d98e6051c492aa43bd3ead81d8d9145ed5fa1fccaddfab69b8b0ab", "votingAddress": "4DUqj2qo9dkDecYcSMphFYE3BqH9", "isValid": true},{"proRegTxHash": "d4bc111e000202e785901e4b91ecb8312c3b4cbcef8754641dce83895fd0f9d2", "confirmedHash": "d2ab9aba862d6e637fe0ada3cff9911e3c5cc72abfa85adf0200000000000000", "service": "00000000000000000000ffffa5e32f00", "pubKeyOperator": "0d3b3b723123646b7e24d1e22d74cf50637a3863c0bc2a611e24bf26d16ece72ca8bbbb1883549db0c5836730c6e7bef", "votingAddress": "2M4MdVDikgFYBUpSpV6WUPnJKiAD", "isValid": true},{"proRegTxHash": "5d35aa0574b4f020d779cfc6880846e0d762951a1077bce9bf454ada4e8626e1", "confirmedHash": "ed3ceaadcbed4ccfbad35e539b87ab9be15558293788b1110d00000000000000", "service": "00000000000000000000ffffb23fec74", "pubKeyOperator": "04e6c005eaaf61afad64e28ec3c9096ae5fc3ad23531642dc2fc3dc74ead78ba785cf6a7c22c965a127b9ab4a13b317d", "votingAddress": "3STN9vXCh2Bg57mLf7fNb1Xu7xaU", "isValid": true},{"proRegTxHash": "494323f2cb56c82ffabeb7c967002f8ef5c72cacb46e91dbf3d4ed4688fcd354", "confirmedHash": "6b48f49ba90003cfb90795dbd0a15fa6e36935f8deccc2d20600000000000000", "service": "00000000000000000000ffff55d1f224", "pubKeyOperator": "917236f9c9872745f732b2dfc6a9f665774d8b58458a199d9eb7c198aee6bec92f4009a7510267533d6104cb29b7acf4", "votingAddress": "ufWM13ABsB2vhCnRmUvXQVgd2Jb", "isValid": true},{"proRegTxHash": "c7af41ad017c5cf98d9edb2bc9539a9dd26c3d74505268f3a88f5f7ebdf859c9", "confirmedHash": "a634a834e528889e74fe148dac01b2ba120e66c6c98822f20000000000000000", "service": "00000000000000000000ffff92b99f79", "pubKeyOperator": "11656b89a270ae3ccdf3dcfae8fb46b2d1012017441432545657d849e4e79ffdd8b57389a2040d45efb34821c20ac172", "votingAddress": "3pZjYxiEzV8aM9cnMUpJvB2okZCz", "isValid": false},{"proRegTxHash": "20237dcf46578f5d65ac88d171f36950ec9cd48a4be21253c09c2eec230d3ca5", "confirmedHash": "cda29b67ce0828b2618f89f898b47f3c596f0c080b42260c1700000000000000", "service": "00000000000000000000ffff50d0e30b", "pubKeyOperator": "901a5ed166138134b34ffe9a2f54e3394b48726849c498d23cb7d96da9400b1d754f2241ff892c6f3a859ee86dc82aff", "votingAddress": "iXDZm2UQ9446TCzW2mZYvFrGRkK", "isValid": false},{"proRegTxHash": "1bbc43022d497b84e5b600943b5b460751d4ce1a6a3ada92b330bdc7b3492438", "confirmedHash": "f67d46ded8044dd724b2fc54cb3e2e9935e5503b1530a7531800000000000000", "service": "00000000000000000000ffff9f459b5e", "pubKeyOperator": "06b22ad4aa5e96e4dce8dc84e0984e4aeb0e35ac47d548319ecf325b8d3a471cfeab135395fd7989f89794efcb982e3b", "votingAddress": "JqXAzyLBRXJivh67jLM4VTiS5n3", "isValid": false},{"proRegTxHash": "b5e808182ac295e7bb2940bed843eaba2cbeb491e7c5e1368191ec7de24f28a0", "confirmedHash": "3ee7e968fafa186c9aa6711b39eb8bb9bfb1c6eb3aedf1393300000000000000", "service": "00000000000000000000ffff8b3b85f5", "pubKeyOperator": "8e48139b8f928cb31a930db3f6dc0f4d6a1ca0bea30ad905033f01276df4d365044b92b840e64c50c17b8bd8ea3fdd4b", "votingAddress": "2mWm8DnfVkhtBMU8CiobmnwV5G6t", "isValid": false},{"proRegTxHash": "f87d004afc3f3645ce9feed7421bb6a54a3c1ba24f7c71ef8f0ac5175da0d37e", "confirmedHash": "f963dab0511dac061dede98786bc38bbc2eb75620e4e22670100000000000000", "service": "00000000000000000000ffff5fb3a4ea", "pubKeyOperator": "0274f1eba753b1c32773fc56e626658c3ad0565ab4a35ca667cb9a455b7d758225e21baac003fec28cf75ecb56738d60", "votingAddress": "hTFBRi5Y2SQpV9YH4oMZ26S1mnL", "isValid": true},{"proRegTxHash": "e524fbdf53c44fad5414f0ddb2850e5971f25eb795fa87453a2dc509129a7e16", "confirmedHash": "0af85f472932784ec1b4bd6b6077765be28d84d4b0b1bf040900000000000000", "service": "00000000000000000000ffff87b594df", "pubKeyOperator": "92a900242df760005ce9486cabca694344738f44e9e0dd8317c1048e79e7cd2a9ac1823140f3101c14097e02592affcd", "votingAddress": "4MNaVaRiSHeC2sBoDZWgYpG7fspW", "isValid": true},{"proRegTxHash": "f71a13525ee8412b22012da3a224da2981ab592d5d402996ffd18313b527c2e9", "confirmedHash": "9f4b523a2e605b7a523465957f23e243bf1800c64244b9270d00000000000000", "service": "00000000000000000000ffff55d1f1d5", "pubKeyOperator": "02f0f1c753db37d4abcd4aafe89c8da8ca63e4993445735d8fed0d5d6568dc98fe12860a031cbbbb6d022a254d87fe74", "votingAddress": "DNAoi3p4js3J218mbVbTNqVU65V", "isValid": true},{"proRegTxHash": "3b5d809ebca0720ad2adfae6448cc006383a2947dc1c14b596572d9bd3c13b61", "confirmedHash": "950cd4a4dce11b5f93b087d4c9b122a210d79d3e91bf1eba0300000000000000", "service": "00000000000000000000ffff52d31522", "pubKeyOperator": "8ac93d0666114589f61181016f03b8a795c33482fab5877888e122bd4395073b3ad3156b9ab7b6267bddc2d6f9481efc", "votingAddress": "43WGgkvYK7fp15jxHfcck5UZRmuU", "isValid": true},{"proRegTxHash": "0b85b6029b1a545c14774c4b77b73b929a6503d1c7041e2fc54ece16e983282f", "confirmedHash": "a0e53065fb0ad7f34a800e6f762e9ed22fda7ebf12ea3e360900000000000000", "service": "00000000000000000000ffffa2f33be6", "pubKeyOperator": "8320ea89f6698d5b6bd988cc8d36d36622bd1b697f412f21dc41d2d319115aa2f56ff1f6c1f1a052b5935664511bd0e4", "votingAddress": "GLaPMqQVyFWWkTpUZeqJHoP4Q5n", "isValid": true},{"proRegTxHash": "194675ba71bb52cf2b5ef6ef37d3b10a26a756dbc3c60fe6d7a99a663d814af9", "confirmedHash": "a65b2e04e704510552b4ea5aeb2935517deb29be907e45531900000000000000", "service": "00000000000000000000ffffd418645b", "pubKeyOperator": "8df70018970325f062d6b00f35ecff0318e7ab357664100302abcea5e86b2f199525d54cec89da48e338ccfbff3131ec", "votingAddress": "aG4U3A27cB283mhzNcyW8zpSAgk", "isValid": true},{"proRegTxHash": "e7017e7a09dff9ba1bdebdc4adb15e1b99b1e4262001352568975c957439b740", "confirmedHash": "41d77e4b163698c485815f74b2d12be8f89a7b08367dd5f41600000000000000", "service": "00000000000000000000ffff951c1fc6", "pubKeyOperator": "12dfc9061822fa4869c9434ff22db18d13225a8f7d2ef8181e19b25fb999d0e7d9f0afc0ab7b5d9493690474db58dd83", "votingAddress": "4FQUqExRKo7KQdERoEaiXKfPACoz", "isValid": true},{"proRegTxHash": "c4d209fd9d0e8c38bdd2227b120469514ad3d2155a035a9f2ed984b00c1e0dcf", "confirmedHash": "3199902101465ae4a41755d0c5bc36fcaddbae59e2de860e0c00000000000000", "service": "00000000000000000000ffff6baadb35", "pubKeyOperator": "18d8de48c4ed2bf8a8947e71bf3d442145d2b182479a3d83b6648bb7e387ecb5231a06c3097df55c4c87dd378e4fd3c8", "votingAddress": "4ZDkMRUvmanFa43cZSanuzU5LnuK", "isValid": false},{"proRegTxHash": "53daacc8736af6d980ed524a766e0c1fcfd2d0b4d9748bbfa1b301bfce39ad12", "confirmedHash": "691a684d858a733b277462506d2ff788fb1656e9dd2f0a610200000000000000", "service": "00000000000000000000ffffa76349f7", "pubKeyOperator": "8cb67d8b46258c91f6a8da1dccc5b491ae21b8dd7fb755d509d6eb4781c41f41c4fe2ab7a0784bbaec1f0f0c99df0a16", "votingAddress": "43o6zNjr55is7wpa1nENu6NhKG69", "isValid": true},{"proRegTxHash": "f197df23eefcfe8a7954c4bf2018ef65e447d703f6d60de0ef625a7b3d3dff5f", "confirmedHash": "2de93631ed66b67a87df8cb83c8ee318f59e3bb2962114350b00000000000000", "service": "00000000000000000000ffff9e65a81c", "pubKeyOperator": "0eb61cf4062fd54f9f785c8286a77f849671c1653de2a0bb61f4a877eab3deef188019c7e9e3629eb3a5ceb286583845", "votingAddress": "3jZgNyDy9p8kZf7YBNKp26GVsshE", "isValid": true},{"proRegTxHash": "6c4fd7eb02d8a99351e47c1a20ad37182ba4491bc375f6346d1c85804e88b7e2", "confirmedHash": "36073487dc3e0fdf1b318eb15c89a2ea335fbbafb0cf92ac0500000000000000", "service": "00000000000000000000ffffa45aa4fe", "pubKeyOperator": "151aa1488f8afd24e2a999c1cb2eabe39bb09a8f006dcf486702b3a07e4810724711c2a39ee356ab64db2e7016705b57", "votingAddress": "33JkE4JK6pKtbWekw6CZvp2dWPVR", "isValid": true},{"proRegTxHash": "8d49866cfbdbb2aa0379f475a00a4b855d1780d6d270be5bab09c91d476f675a", "confirmedHash": "220ac0da13b2371555447b02566ff3d2543b5a5b13efd19d0400000000000000", "service": "00000000000000000000ffffb009d217", "pubKeyOperator": "06404560ed609363fd1ec4f371a7769655f701a20dbfeb3d4dace8e99b4c96ce918d5ee1a5c09fca2dce289f7248c352", "votingAddress": "4HbrZcxe3otRvXHPP3d3naEgBC4z", "isValid": true},{"proRegTxHash": "56195db565e832489d6dbefc1eb5efb28fcf638ec890072d75ccd9d51b4473e1", "confirmedHash": "3a98afcd4f76e62a7dfcff6f27ae9c084d9fc139dba24aac1900000000000000", "service": "00000000000000000000ffff52d31540", "pubKeyOperator": "191c007bd3e08359f39960071587442910b74c3bbf3f032a508583cdcf0d400f253760d3c8392377da87261322222a32", "votingAddress": "3z4AexJSCaC2oaXNUNUxhkxbHzM3", "isValid": true},{"proRegTxHash": "4336dd64f4ce1c2a0a9ee7a2c31aaacfb666d230d2608896de33ee7ed52168fc", "confirmedHash": "35702ad0eeec9b15bb4c3976f1e61ac5877337acc9cab5260900000000000000", "service": "00000000000000000000ffff33c35a07", "pubKeyOperator": "0a9548d4fbf623812e7528d291b7c5efa33beda374d812966935ce8f50a133321f6b4aff61d6571906e55e22274d36b4", "votingAddress": "3KG4Vy2mgCrAx2NoUtSG2RVNc7vp", "isValid": true},{"proRegTxHash": "c2bda1e3afcea737be2f346c940a50be5c2b08b3ef137cba1f5a83c6bdb76a93", "confirmedHash": "5a2d6bcff90b5d381b69ca0877071155f3f1230d6fabd8170300000000000000", "service": "00000000000000000000ffff6c3dc640", "pubKeyOperator": "910870aa292d7517ff492686ba0d289aaae63d5977a305422fc8db7c2e31cf9ecce512a50d34320b87bc5a7dcb64186d", "votingAddress": "2kU8o72m9CZjJkxShqudGML6qj4X", "isValid": true},{"proRegTxHash": "45ecb56436b8e029c7e775114de6178eb8b29d5a6b860fa06c7849f814d35a90", "confirmedHash": "1348daadd20bcc11b3a2094e3d74d8ed214383d3c70035760e00000000000000", "service": "00000000000000000000ffff68838629", "pubKeyOperator": "8f119742ce6c0ee1f7f7b40a9dec2db6ffa42ec0eabfc0adaa2fff298d5284f05abc79ed716697007b1382b78fea1936", "votingAddress": "43YniWe7fvyjhpr77NisgXXtJ6uA", "isValid": true},{"proRegTxHash": "721accd3e701d4a0c50ada30f9f925c9fb5f876f725f9160cc9e58b7c291b853", "confirmedHash": "fa6ba515c3c0196c176327f50039a5413d8a7c222f50ade62600000000000000", "service": "00000000000000000000ffff86d19870", "pubKeyOperator": "8c10b4020c630351db359d1e6fca75e81aa2db7931bc5d0bb7dfa0983627a4c4c762af250e8ac28f238bc8da40deabee", "votingAddress": "2TSjN3Exj5tAkUbYRbXtbXVvnVAH", "isValid": true},{"proRegTxHash": "008cedea5e05cba997a898c83cce07b10ea7b3a1471b1b3ef610dac2c001348f", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96889647", "pubKeyOperator": "9551951b4b12a240fc862b614425c32e5126f1901a80fb0933572609895a9c6fc81ec5a1df11e146cd31fd7336493223", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "22c1d2b5bcff1cce1346c1d120f0b6c7b9f1e22f8bc102f79a7d5c2a03733754", "confirmedHash": "8938fe0dfd96bf2ad426255ce9fe93625585a178cd8859be0100000000000000", "service": "00000000000000000000ffff68ec3a83", "pubKeyOperator": "85c417521186888df0177c8208d2aa1f61d191eaa178e2e63f959c7ffb4af1a46ce31c5770d539dbb8f159c2c4eb1ea6", "votingAddress": "AMQC13HRQvrMfQbFuce8d5m3csb", "isValid": true},{"proRegTxHash": "b7063cf24ff8a6b993277fa39c74d78dccbe4c520a64ff252e8d2c03eb0325a0", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0aa", "pubKeyOperator": "8e1010bc973e88fefcbc99a547a319a4c6b7fda0a4bc81e31c7310f562a2695baf439c3337765a568e8245daec10fda1", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "975a81cf92a33467e5e3f91e9421f265d797bcacc719e69044c5ce661d6e22c8", "confirmedHash": "6bbd38d1387140c4922190fa812e6520284ecb271799a3510100000000000000", "service": "00000000000000000000ffff5fd8c838", "pubKeyOperator": "0d6ff73a4466a4dc30f4e69b945b765a1c67e92d3cff6e30b0a08ec6acd16ab070fb1408eb70ba119902b83f89173d57", "votingAddress": "49pAa7ESDtwrQQwUiC42DxWCXECj", "isValid": true},{"proRegTxHash": "3c2991464d02b5f4d1dbafc646d5b56c8a2cb66e0dae5e37af594832ffe0afcb", "confirmedHash": "333945d6f1a1aa68cffa842a56252b3996b925a3247828731100000000000000", "service": "00000000000000000000ffffb009d205", "pubKeyOperator": "018cdbd7e89a3b0f51a72c418b11ff31552fd5aca89bb5832085bfc6f8f46632297b0721eb206c508be8279369775646", "votingAddress": "2j5hbkfopMubs1P3YpF4WMGN4oeA", "isValid": true},{"proRegTxHash": "a25e119803dc7fda40f1873ef578f7e398a6e7bc753052288ae5ac4edc251426", "confirmedHash": "59480079ef251d169baab392fd32109aeb8446a1fa9f61930200000000000000", "service": "00000000000000000000ffff8b3b21e0", "pubKeyOperator": "066fb1c2ebb62a57af93d79df8cb511b9ca1c9663ca9ecf14e04f4edcfda2f2db401053c3f8f44b29a5b84fd50987889", "votingAddress": "3ZodixgAB7GgFGfCTmxCXvYgtXde", "isValid": true},{"proRegTxHash": "cab56c50d8eb23582f7400654af105f73867a08ad7d47c4fcc0d3a4bd719ca1f", "confirmedHash": "7d3cf2d675690981a689072dca56c7c076fffa4c16d274071b00000000000000", "service": "00000000000000000000ffff87b5c8a0", "pubKeyOperator": "85466e40f04220def01723630e35fdbb108358ce905affe0e1e50891ddbeb4ba6b4eb969423c65a0bd862b7c2e2f6563", "votingAddress": "3v176z9xdtyQz4HxuEXxcQCy7qn8", "isValid": true},{"proRegTxHash": "87ce03eaea9149a81b583de8b62c0616baedf55598f7ab8fc118e806238ee5a7", "confirmedHash": "943c502f65cf5b2b662a583eab9d47b7446f741a53d2601a0e00000000000000", "service": "00000000000000000000ffff2e04a274", "pubKeyOperator": "82a3b0d4901e2ea3a4db94debff9e356580e224a999f626861d3306f271421d8dd329c87d31c80336f6986f7de4c1ba1", "votingAddress": "46xcovTakDaXV6n5PM584Lrvyp9p", "isValid": true},{"proRegTxHash": "f09fe94e7c393f809ae137d7fc659200ce8a5ccdb2435054ea50a96b1a2ef544", "confirmedHash": "9b0c1106a5b5121f2265f99fd2490fe642d0ee47f3703ffd0c00000000000000", "service": "00000000000000000000ffff5e17abf3", "pubKeyOperator": "9647f0e57f7f66bfa91bb8cdaf0a3ad65cbe5aaf98c1ab4b26d39f5340e7a7261ea189ddfb44fb01daa5490904988469", "votingAddress": "3u19CNE5VrvPs9AmtQps9gY1xCsU", "isValid": true},{"proRegTxHash": "b8bb3d9c7d9daf7698a6bc0c30f9b191545eaa3f12e8a361e8ea5282cb0d22b0", "confirmedHash": "b2b75f9be9bb29ef0202d60df5e458a9a6798a0cff6f10f71200000000000000", "service": "00000000000000000000ffffcf9afec1", "pubKeyOperator": "9817ae341009a546618cec5b5676dcc4f7aa76e6cc5b57dec45efdbf63347f169a57d1873142fbe6143feca7f36d570e", "votingAddress": "jKCasprCU5urFKhiJp9N4ch3mDf", "isValid": false},{"proRegTxHash": "0b761ac2f42dd3996ffbfc4166d64eaa3359cce57422e459f1856d2471838972", "confirmedHash": "2e410595c9cec9c3a95116447b663b01749c9a921009f6050900000000000000", "service": "00000000000000000000ffff9b8acea3", "pubKeyOperator": "02d5291cec3c3acfce9bdcb513c5caeb6a6951f05a045de8af7f6d1ac85aba525471804ca5a170dfe98599883123eb5e", "votingAddress": "3cmNLXhQ2adgw7gEjpKaAsJAkmW", "isValid": false},{"proRegTxHash": "b88bee00cf81eac7fdc75f431cb2a31d3a030f89a615808f0b65cbfcaad162f2", "confirmedHash": "d859d0e28325b51762ac7694bb9b4ac0d85667c170dede730300000000000000", "service": "00000000000000000000ffff12e8c0ce", "pubKeyOperator": "80b78d443e1346f6a0fd26e0e9c0b89b9a18ba47890b84eec770150de25f3db9ec4445718bcdced790eca58ea44f3a77", "votingAddress": "3ihP72KLrnTiGYggFD8PomUFW1Dk", "isValid": true},{"proRegTxHash": "27a9d98cfe35fd91f1b34d45c31e22d3b537cf624a864a3330508a05aba2e0e1", "confirmedHash": "0e1cce6204c59f944268d69febafaaa49cf890ce535d4a230700000000000000", "service": "00000000000000000000ffff2d3f5f32", "pubKeyOperator": "887fdbebdf0969e5470acb9115b4e3231783b5b9ba9e4b80e8873f7183da216e3f562fabd056e437a71292cd21c8e5c3", "votingAddress": "XmVBVp5ysFJCkevmUgSkRhEG1QR", "isValid": false},{"proRegTxHash": "8353a7858f2bdfc64629630d3db1709b29e6dbdc60cb78608ab27981e381acde", "confirmedHash": "dd0aab5011df09ef765d1c85f2f4d103c868e391fb049f3d0e00000000000000", "service": "00000000000000000000ffffb23ee343", "pubKeyOperator": "8dcc42086635d6bd863d149a573294868a64df7f4a94f8a78cb68b5ae43a54cb401fccda2da6698b63448e787465f54d", "votingAddress": "NXzoDYP1AYrtBYpB8VJxNhDwmWz", "isValid": true},{"proRegTxHash": "2dc0ea4f39c17c0e2bb6ffaa945cba19febcbb56dedfc7f41c2d0adaf6ded88d", "confirmedHash": "b60c2dbbb213c99a236e1f30c1d9f41b204f0b13b294c83d3300000000000000", "service": "00000000000000000000ffff52d3192f", "pubKeyOperator": "05ee12ead9b2fcbcd20e028acb74226fd75ec271ad8daa431fb9e6fdeea0070aeffb080c21edca34385060a1c8c05bdd", "votingAddress": "3im6c2PP1vq62zNWRnoksZ735od3", "isValid": true},{"proRegTxHash": "63667ea5c78f0e0af0715104e78898b572d38bc1f3b7aacfa2050c1545587ab5", "confirmedHash": "82d016c2735659fe3b89a20aa8b3e0c65a724676dd3c6c850e00000000000000", "service": "00000000000000000000ffff55d1f1d4", "pubKeyOperator": "19f3e47e2a104b7e196a2fdf0186902676f6712f323bc03deb3726fb45af81e2e328a3ce6a3960fa521eba13a90225f6", "votingAddress": "3vVnL7QDDeuU9S1iP4BqeFRFYuQM", "isValid": true},{"proRegTxHash": "a78bd0b07343edbdb851106ac57ebd14300bbd573d16143db0c52b4dababe517", "confirmedHash": "425f91d2ce584b231e9e0c1bbd639aee5f63fc18a67c985b1200000000000000", "service": "00000000000000000000ffffb0df8d40", "pubKeyOperator": "883898fe6177b4040f0640e91f8f896678774ea5e1ddc9ba836321391953c97ffa8c10c704531d3b7cc0670f72a6922c", "votingAddress": "AbKmfSDEm4QPa7n3NpUZnCENiMC", "isValid": true},{"proRegTxHash": "b405f585ba44cb0a6ab9e87cc0b0cdb42fce49a1fdbdef5abe8e6a881adb2a5f", "confirmedHash": "69004b26d29cc127a368576b153319a3c2aa6fa8ffa7e54d2500000000000000", "service": "00000000000000000000ffff6c3dd12f", "pubKeyOperator": "15e2d2834fc3178d32928366c7073298f8b5245b34b2da62b79b6cca0af152344d26bdf399d5f7226b8cbf37756587f7", "votingAddress": "2rvYftJWw4Lvxyn8CkuMoWTKvtu1", "isValid": true},{"proRegTxHash": "83661832b5612630d0d24f8698d3af176f89ea8c1c7bfc9363da4a89220b300e", "confirmedHash": "cefddadfba5072a35afeb066df12359d4dff0d26e32ed33b0100000000000000", "service": "00000000000000000000ffff44b7086d", "pubKeyOperator": "847c21638356ce9eda48508363a2341105e052c0b8b8d90e574761cc0d83474680e2483230594ffcdf423a044fc382aa", "votingAddress": "3XzP6vwgtJawiLP3HCbisfDD1Lxn", "isValid": true},{"proRegTxHash": "fd41f706fe4efb0d77d8719ee059c0436c81ec88ca24657140f5ae64e657f83e", "confirmedHash": "c094a4293c280ec9bed757ef401c5dc672c2ca014ec017181d00000000000000", "service": "00000000000000000000ffff3eabbe8b", "pubKeyOperator": "0d21f5b8f44057b2d6e48d91a70232f255a004a1a3bfee81ce6e7ac4e22f127b95114f38953b36685c2a6b7fcb75569c", "votingAddress": "3YaoEEuG6okXvkyYEVTAkwnSykDG", "isValid": true},{"proRegTxHash": "3a75e3044745c925cdecba9813d31def30e1d20811adfcdf726df0e2ad544d44", "confirmedHash": "9f5b4fb62448e008e63ef94e9fea57ac59bd584cbb7fe2581900000000000000", "service": "00000000000000000000ffffc6c77732", "pubKeyOperator": "19ad7e616e60e6c5d21ebcb4aa5e26b265b74fc529d8cbfb58e8e0c2043df3102461c2eab5864a3317c8a7e19778cd35", "votingAddress": "hLHBoUammDSdG32zfgbQWDQg6t9", "isValid": true},{"proRegTxHash": "8b4ad7f8a7d86a384a4f05b89a2210fedcd497d72e24b31738293ab68dcb38f1", "confirmedHash": "c532fde8b85e0719ef803b34f91051ac4f2c5d9126785c791b00000000000000", "service": "00000000000000000000ffffbce2c98c", "pubKeyOperator": "96996dfcd70b7d48bea5a0a0bb0278b1a2854a9bb7b987e729ec76d7efdb120698701be2d9c16e9a961fbdf4ff42bc84", "votingAddress": "87h6wqBajqguRqw4zS95G8u38Gk", "isValid": true},{"proRegTxHash": "759616c2ce5e32c9c3f62ac08ed25184c6156035bb5ba1a2528b450c963321aa", "confirmedHash": "d0d5d77f71dccb2f23977864f27e7e4085538bf758f2cd8d0f00000000000000", "service": "00000000000000000000ffff44b739c0", "pubKeyOperator": "88dc8ebf0ddb164c5f3d1e53153e5c14f47173db5b1d9177f127cb5daa31e5c9f614e78687bdd73cff7c396ed4389f67", "votingAddress": "3wxP1ewPmDnzXK22c5ic1N8HyNjv", "isValid": true},{"proRegTxHash": "5594dd59b6c89ba56d3cf96658862c5753c3f3897baba9bdd241f8bba73cb2a9", "confirmedHash": "e0d5838a81d0ee7d1d848e4f8f2ebf70272b2149acb177860800000000000000", "service": "00000000000000000000ffff55d1f112", "pubKeyOperator": "18e47e316ca8c33fcc1dd8e0d6be94b8a3144440d4b702c3d0102cfbbe2ea54380904bf31b29042fd8964bb3fcd3ae94", "votingAddress": "37YjRDmD98vLy4kc9zTA3C8hsSRU", "isValid": true},{"proRegTxHash": "d1744c64411f086e2ba216ae3f556ba81fdce32572acf09115b8825435257607", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b078", "pubKeyOperator": "9393e1ab799bce795360dc53d1501f678d4cd9b6476d3d222616fe3ca1b33b0ad1d5fc82cb6306029ad94f586b0c2598", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "3098d70f9f404c18488eaebe6865fcfa1715286d3fb66d2ad2228267ca4648ac", "confirmedHash": "316e3992d6b6d5c4c0854964138faebb395076f7247a3a390a00000000000000", "service": "00000000000000000000ffff95388e11", "pubKeyOperator": "82b15ccf7ec3ba3fcabb6ce045cf831b78b9494257e3d8c96dbc74c5233b81fa790743b49c4b5c626b0230f326021d58", "votingAddress": "2tcbHwzEAcFNCjMf3NzEvGBPDHMp", "isValid": true},{"proRegTxHash": "a79870e20db767a6814ecc24c6cfd50ffc79072e99815f7ebc79fe4bdefe51e3", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0d1", "pubKeyOperator": "81e3069908dad3fa81bfaf619d5d7860e5728f1c3ce3143f1ec31d0c4732e3ec2c42ec653cc594d9ffaa01852c5917a9", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "e4aa70d5a59b742f26b4c08a39f40529e2bbccb6201b272c88a00d6e1a308d4f", "confirmedHash": "8248dfe923aa60ab5d0afb57d2d74d462f11835c35e2876b0400000000000000", "service": "00000000000000000000ffff80c711c8", "pubKeyOperator": "8422fa54f8839b8c3c38b8c2e0fe006d435eb7ef4724b414787f7eb448a7cde184e73c8e0dc74d3f75185cf5f769c3fe", "votingAddress": "485DrBAeghjw5LkQhMix4qyQwgLb", "isValid": true},{"proRegTxHash": "d053b35022c96cdd44a5d267af88f9c04d912fa31615a4dcc0c4a0939556cec9", "confirmedHash": "bd16d1c8b774a499c7a7b599445cf672ba00aa5a47e1ef071800000000000000", "service": "00000000000000000000ffff453d6bf7", "pubKeyOperator": "8bec98457425670155fb4c6eeed65fef115bc587265f129bc26c63bfc44d310fa12ac8b8abff27c625a40e6df1f32f96", "votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", "isValid": true},{"proRegTxHash": "08b44a599da0595020e2153abcca24867193684fa7202502f13b0d072fd6cd48", "confirmedHash": "17a667d95355eedc5070dd64048d2e3cbede2b87ea98172a0900000000000000", "service": "00000000000000000000ffff3625c7eb", "pubKeyOperator": "0a5a3deedf52f0ea6775d3caceade48e4d0fbcdfc090b9696109690bd0584e6722bb9688a1d35749325998370e86c0bc", "votingAddress": "2WX9uYWQP9GuYY1EzJ4jAka7nQCp", "isValid": true},{"proRegTxHash": "b8300a29c0ec3d8bbb32097371bbc910e5ce93b26fb67a6f6e968c6501fa2151", "confirmedHash": "212beaa7b850c185a75eb153da366b256e65c6c812e951160c00000000000000", "service": "00000000000000000000ffff923b9666", "pubKeyOperator": "84da6e979ba2b1b98560425c9ea31069ca9f37c2206450a9d2f51040b003e3ce5d5f4ea0469bc79933017e38d45ca372", "votingAddress": "2Ymgm7T6me99PS53r1bWckVGanT", "isValid": true},{"proRegTxHash": "3062e4abb68cec66e0fb0c929ce059aabde149d778d4c18f4c2c9b536543932c", "confirmedHash": "85e6e140a111c0f0a598c4cb9e4053c85fa38675ea5ff9980900000000000000", "service": "00000000000000000000ffffbc28b6ca", "pubKeyOperator": "84fd915c296cddc8583e47ac511afa1a1082c90083574e479caadef0309b5050b5f0ba6d664c969dc619d33d840f1fb7", "votingAddress": "cRgZ57km76e7AqBJvZJfBVq2ur3", "isValid": true},{"proRegTxHash": "7813c83554028f4328b67239ae7fb7e5bc470b7233f7fd816a8fe6f1efcef4e4", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff849196fe", "pubKeyOperator": "0f52bee47520f5f352f823377e88f25d04ed48236373b41118d9ff4cc3cbef91569ed5b0c69da0f8e9d3b46555f8e47b", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "e963f736f1a9ddaad5e79d079bc131ee2de8f5003c1deea47fddd8b063833965", "confirmedHash": "c8fac7c25511b02ef6f8cb743098492c6b65d12e7f8611830800000000000000", "service": "00000000000000000000ffff55d1f1db", "pubKeyOperator": "0724bae1831f14a1ab7d90745c63cc681a63d5ba9824960836613ee56f26f00bdadd8157447a2d6b535f3a78d04e5e99", "votingAddress": "3TAgZNswPme2zGkv1Mex3vdea3YQ", "isValid": false},{"proRegTxHash": "846feb2ef1784b8d82d3aa687a21b03f292d01c53e2e5c79f96633bae5348da6", "confirmedHash": "026dd3d58da7accf3c4b7d2be288e6603d5f2358aef70a2e1a00000000000000", "service": "00000000000000000000ffffbca627cd", "pubKeyOperator": "0ff866fed6be4a754484603f2cc96b43525cd8ced067edeca9f288b28d8a9f4b836006430b3ede7f22da3294013a6918", "votingAddress": "34EW3LiPt7aUYGBRXVx9kMLUX5hL", "isValid": false},{"proRegTxHash": "2fe9628ece203b44d612725d0b5857c7063058eee10addf4117336a744707712", "confirmedHash": "4b5b5ecb79049b5ed60fa29cd8bded7df3f44e49e2419b930200000000000000", "service": "00000000000000000000ffffb23eab3b", "pubKeyOperator": "0d1ab7438c6aa71a0639fb14c14304eb9936f682651a67fa5acc3fe14fd5693b13b137554a9d23b44956aa3ed82f6060", "votingAddress": "4HAaJwvmABzBprrs38RPHEbpgkGh", "isValid": true},{"proRegTxHash": "8afd3cd80083e5e5ca9f1be502e706394cd46fdbd69a66b64d39f657cd6f62e8", "confirmedHash": "46b0b34c1973d8d970b4b7ef450247e79a8cdf8f6f72c8051d00000000000000", "service": "00000000000000000000ffffd8bd96fe", "pubKeyOperator": "8745ac28c712e3253e23fbcd54ba6c69f0c9ff88add838cff601d22f22ee986aaab2347a6e1862a031212274523dd758", "votingAddress": "46MqhHNkuuS1XjbsvomeE3PbBoJz", "isValid": false},{"proRegTxHash": "dcde5c6747ed3d01ad4eb7c3ec166d0a294ef69c49042fe114fcda64b00b57db", "confirmedHash": "a698aaa06fe7a363ec0640a853b189470209949734fbb8ce0200000000000000", "service": "00000000000000000000ffff55d1f28b", "pubKeyOperator": "9400c8761784df75e418265ba4dd1d63452b0fe99bec6f813237098137251583100ff5d58c1d30868b68ac8c03d1c541", "votingAddress": "2ZtABXm35rnLUEhaXMMyZRB6xsSn", "isValid": false},{"proRegTxHash": "41d0af16395a58e8ba8e5128606b0eb862553ccd341fac687bb0eb94c3dbadb4", "confirmedHash": "39b34bf0a13f3e303e7716a187db528408b7ae77144bd1050300000000000000", "service": "00000000000000000000ffff038e49b1", "pubKeyOperator": "915ae8ad725828d58c1d5867994d050d4dde52f7917292e53041692c1ca2cad59a0e2ecbe509358db8f01cdf5249ce04", "votingAddress": "2PUP4dUWK828TWDxkRE2TwAbPtEY", "isValid": true},{"proRegTxHash": "6a0cd8097c156f0a77d9ebeda052aa36e02cdf6c9334270bfcac98007ce76ef4", "confirmedHash": "693720c57ca0772b4cddc3efa1db6866553d2827cfbbe9480700000000000000", "service": "00000000000000000000ffffa516ce29", "pubKeyOperator": "986dd89ef653717cac967efd74380fc593f6d6f28cf4386a778e5e0991a398a2e2fe15fde624fce157c551f400402b70", "votingAddress": "3CTXgn9DbSfMBfUtJyVGXmL7MwVP", "isValid": true},{"proRegTxHash": "b257d9d3584d2f3bebafc7d45b3fdfc0b9cd6d20a5d30d47102b195b7d1212a1", "confirmedHash": "8af5d3b975ac8df708c2ee4d7124f8012ccf7260490165a60500000000000000", "service": "00000000000000000000ffffc040538c", "pubKeyOperator": "18f02562d64aea94061fbfbc46e5f83c965341bb4fb4fddb6685d22a40ccb64726101b24ee323b1e91c9d0414b720bf9", "votingAddress": "4ArF3VKRawyefeadvoKRZ7BoWZ2N", "isValid": true},{"proRegTxHash": "919f440458bcbee743bc32869753e2d247963139f6fbb22e8e7fd944915e1f2c", "confirmedHash": "6048c11aab4d4ae9537215faf389d741ebac6f1b3d97636a0c00000000000000", "service": "00000000000000000000ffffc0f1da24", "pubKeyOperator": "842197264aa83c06a1270f4dda51fc9bd0f25bfe33bf7257fce40c1f04d782e3aba4bcac84c3899bf3a032f1f5dab1a4", "votingAddress": "4JheTnaJYGbKxP9acbe8kehudsTo", "isValid": true},{"proRegTxHash": "834e3cfed88a59430c5a66b0269bac528d7c7b6ea82f7e2db982d572eef83279", "confirmedHash": "8926b05e70d38110b544a0982e55b63f5534d370f8d7e1281100000000000000", "service": "00000000000000000000ffff3625c7e6", "pubKeyOperator": "059fe567e8e59449935eeb6869f3b046a63f09858408d4eaaf8ac4b6d703796a296c1aa8cc942e3bb95bcc7e401e8de0", "votingAddress": "m685dHyAo8bUskQHV71NTPcVRvb", "isValid": true},{"proRegTxHash": "6034b5264c6a78c8ae1497a9bab55bfd562cc93779765883ad4b35594ba2626e", "confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", "service": "00000000000000000000ffff92b9afce", "pubKeyOperator": "01ce2549ef8a6f9bf537bf478c886052a9e932558bbd540504d26a41480d9608e8d5e2e4a60b31b8cea8d63fa19c1fce", "votingAddress": "U5KmEdoGxBBTEL7G7i3GRgC1KSJ", "isValid": true},{"proRegTxHash": "c3d016673b102ed723960128748b397fdaabcb4e0a46ad6948bd51282fcb94ef", "confirmedHash": "72385fd5764f01b5126f2e03a547e4a7d59f31729ddd87801200000000000000", "service": "00000000000000000000ffff8e5dadf2", "pubKeyOperator": "98d9fa77bcabaa560d00e1bc720c42dbfad99e075c81fd8a753e01b301a0cfe4c1e548d3902515b89e2517ee31f3c96c", "votingAddress": "3og2LeSH3pCXhUrgXZVmgiDT4Eff", "isValid": false},{"proRegTxHash": "b48d69e1533955c7134c68ce081253f29e1e8c5bdee3fb0a4022ed9aa47b4a85", "confirmedHash": "8671a2dc7b25a9eda75312975fec8cb56bbba8a27ecec90e2100000000000000", "service": "00000000000000000000ffffbc28f173", "pubKeyOperator": "0734b47a939738a70e1fb310d04a2f9a049606a6028f48dfd59c69c0dd0eda986342d63132e0df02862a4d3c5347ee88", "votingAddress": "2X9Yza9NA9uqDExw38zASxYnxXCd", "isValid": true},{"proRegTxHash": "22b9643398b34d64b435717435713c7be5e6bf04bed7cbed24c9889437d37987", "confirmedHash": "d6660baf81add7ee5cc97f544918e3e931d9c2249ce8c1c61600000000000000", "service": "00000000000000000000ffff6883c107", "pubKeyOperator": "8869aa575ce3388fb20974530695b2bc83421386ccf36946af0d3e5ddf16cac886c1c60452fe74943760620f03265dba", "votingAddress": "3N3Uqihd8UZE2c62Fb1nXVSeigq7", "isValid": true},{"proRegTxHash": "57be735b3cb9b15103dc59681fd3ed5e064f9a92dd286ae3e9326c16941a6cae", "confirmedHash": "7e39d91bcf27b516ba37ab518d8dc02615e8f5f184e3ad491500000000000000", "service": "00000000000000000000ffff74cbc5fb", "pubKeyOperator": "8a700d909c3d625b906ec4b380f733169d3255f49076a9f66b1ef66f53245bdd591c1975e38bc9dc0d0b8ea1de026725", "votingAddress": "2PnetAwNcm1sG6y9TuQfSXWWd9Q5", "isValid": true},{"proRegTxHash": "c577d7c951cebfa2b0f9e9a5f832959fc60bdcf746974268aa1e69f21f7d9bc0", "confirmedHash": "43f47442d6a4ba8a1f5297bcf1cb5a65eaab3fb63c1156490e00000000000000", "service": "00000000000000000000ffffd4813f26", "pubKeyOperator": "026de5a2ceaaaf5cd3b89d67b2baf6097944549895a8bf7d13a011587d3beb3e05f1f94735da1116bca5b80d8828f79e", "votingAddress": "f7XURSVZvnyLf8DRPLTPsKDHfuk", "isValid": false},{"proRegTxHash": "df3f7e1d6cb953a740727d14b1bf2ce25311a067f190cb173da9ee8ba9673c8b", "confirmedHash": "ce2f39873d313aedc2c1fdc691750baa4389315312183b751300000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "3cYmVjcCsE6JxfuSPEodQd2b9j2G", "isValid": false},{"proRegTxHash": "6335e4012bd687154935a3ed74e34d041b4c91d9ddb4a8df70f2077f70e4ae2d", "confirmedHash": "f6bf2cf0f8ec4fdbdd197cda7ce0a659141791dff62e16ac0c00000000000000", "service": "00000000000000000000ffff59280049", "pubKeyOperator": "05058767da13d592ee4ea1cebc1cb4dc8e56aa087cc6f9f7ee8ee2df112a8754a96e1c3002040f8c752619f5a2225bd9", "votingAddress": "2qm2HyJswyxX5Jnj4ZVjVPnGin5i", "isValid": false},{"proRegTxHash": "6b67a330e5ee76dc4652ce99ceec97194fc806646626005aa0bcf2143009f9f6", "confirmedHash": "fec7df99100810bcf607e4b9fa33a610dc73666cf2f57b4c1400000000000000", "service": "00000000000000000000ffff55d1f15c", "pubKeyOperator": "94262164e7e0d0adca2cc1e2d2c17b8aa5027c37d4e1a853fa16f884fd1bac2544459d4084716e8981be6a40c9017364", "votingAddress": "2XFmcDctZgaE4VHgU56deEx25Sk6", "isValid": true},{"proRegTxHash": "fc9c25f3cdce8cf8de57b2955263753cffd19edf65d018705ac36397304fe595", "confirmedHash": "2c15e8fd5c91fd7870fe32553376d8cf64c8da5d891a0c0f0e00000000000000", "service": "00000000000000000000ffffbc28b6de", "pubKeyOperator": "999cf5f91e03b7475470463f4b803a71654dd31c9c59bc6ad4a06b9414e03c87020ab3f76007bab5e9ce9755e1d6708e", "votingAddress": "24gDmQJ1cnyDTVFzwKCqpkbxkvTy", "isValid": true},{"proRegTxHash": "b3e0943135be96a87f18061d1036561915783b960666de2af9ccc9dcc1ef8d73", "confirmedHash": "26bf3662d50a841f4a2f0048f02299a071afc0f06da6a9ca1600000000000000", "service": "00000000000000000000ffff95f81402", "pubKeyOperator": "839dc50698828477261e7a959f39a8146fb866bc9be274a56f270725e3750ee2e3b1d5dde522baf4a2bc8ce18fd0e938", "votingAddress": "2zeXYYXhsFYH24hut9iapMCbdRXE", "isValid": true},{"proRegTxHash": "b1c5d7a7c5e09a921eab5a51e369ede5c6be0a0ca05166ee9320db02d8b379f1", "confirmedHash": "402c0548a87320f6b26851267192c8c17a1ac03ee95939b10e00000000000000", "service": "00000000000000000000ffff52d31957", "pubKeyOperator": "184e80194b518478d570fcd661f331d79d2a21e742064301d8148b52be40f00088f02c17acab4816cf40063115eb9202", "votingAddress": "dzrenNbNfPd7R8tqcyHRiRaBpfQ", "isValid": true},{"proRegTxHash": "c1fd613ace96c2f7a02796ee2a2d7e1a4e4fe7d2dc5bd002aa4b3782508667e6", "confirmedHash": "5bb99cf5079e52d10d905e2dad81aa4f6c78e2b576ba05190000000000000000", "service": "00000000000000000000ffff55d1f208", "pubKeyOperator": "105c0d003778b3aac38787eb0a00fb77233aad77e0daadac4bb6ce35e3750d9db0eeb9c7e04218529f1d3f54a99376b6", "votingAddress": "yP2HQ1PiUWpUFEBRaoBhW7FvtZg", "isValid": false},{"proRegTxHash": "d26783184d0c2998b895c4fbd93ef6b32a31d9f54254443752dac8bb0c93c63e", "confirmedHash": "fe0745f86dd38b82f2fefdf60fbf8a925790726d32b2c2f70300000000000000", "service": "00000000000000000000ffff55d1f239", "pubKeyOperator": "19641adedcc86f4752177d1128873b14c296a0a7bfb3582410bbcac7744daf1b0e1ac11a2d9c09b15cd5dbba1f9c7fe9", "votingAddress": "2SSMqybwvAkrGWBRedGakW4aU95b", "isValid": false},{"proRegTxHash": "b98375939b6822023da68cd115bccb22dcc2ec9dd42ee0631fa832fcff476ae3", "confirmedHash": "09498802523b671c74004b91acdf755e022e4118af1639841100000000000000", "service": "00000000000000000000ffffc0f1cef8", "pubKeyOperator": "94e2ce74b9241ad6ed5c072226c5b1d38792d4f28fb0de90adc7d4edc764e845335122bed789152cf73eb4faba1e5dc0", "votingAddress": "4HXPKY1PSyeHMw7EADC4BFfoYdsw", "isValid": true},{"proRegTxHash": "c945ac42a47f2b8057479aabfab8112912b9d08ecb33efc1d89fd8ebe5fc17dd", "confirmedHash": "030f93c6b0a2bf96390b8f40732fff807621555f325bfd900600000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "2xwdZYjj5KUqPFYNDEhNBHxrcaMN", "isValid": false},{"proRegTxHash": "f9b7ec4cf383efdd2b3155e1cb3effc197d788fa44612335cafdbaed2dc7b502", "confirmedHash": "20402a552c4b91fe7280c71403bc96820f8aff8709f8d5a60e00000000000000", "service": "00000000000000000000ffff5f550dcc", "pubKeyOperator": "8056aaed739fa3d97507cd02c46fa60dbe8df1450834dea5cd5ee8c910ce1f20f79f61792a3034b1507de2800edc8a95", "votingAddress": "ADUZU1ru2T7bKrd9Dz8MEpx7dwm", "isValid": true},{"proRegTxHash": "b79d71486b38851ee900bdd1bd865a3f2c84bdbd4d5e55125719946a9c28524b", "confirmedHash": "ce7b2c59b1eb21d5be961df3685adc6af36e822fe40d089b2800000000000000", "service": "00000000000000000000ffff87b53228", "pubKeyOperator": "83756ed527e6e4d9cbca633104e5a70a844c2e64bde151f066b06d5f7d48c1732c1003f4214f6bac52433cb6a5af997c", "votingAddress": "23aKftGb7w47U9Q4UQMMD4q3fZC1", "isValid": true},{"proRegTxHash": "ab04ff6997e1090770c49a0efc1d58c835d1abfe237dfeb021015be2fa36bbd8", "confirmedHash": "c7ad62af8e01db5f4e139caaba77405518931cf0cf3a65c81400000000000000", "service": "00000000000000000000ffffa8775783", "pubKeyOperator": "867543095fbe15135c514a5bab688153395f79fc326c78ad73f9061cbcf29031e9b7792e441348572f7fc39ca07d81b4", "votingAddress": "3wtW3PtfYp6djKqeKtCDdvVDhLYN", "isValid": true},{"proRegTxHash": "cba1e647dbee34984d5b669820ebecb97ccdadaa08e52e36a464890446c6cc8f", "confirmedHash": "53796f544e46454b379efedc2b903773a4165dcb6fc4ce9b1000000000000000", "service": "00000000000000000000ffff92b9b223", "pubKeyOperator": "04b228825a6df4cc4463431204c894ffc3da2a3c68dc9d85b861f9babe071fdff25c59502f097a5075493ec899fae3bd", "votingAddress": "3XCs255kUAApriKspiQDCoFCyHVY", "isValid": false},{"proRegTxHash": "a73b3f2f2b10c8481b8821f939a3d506be26e73e1e3af71d14b306f92338f4eb", "confirmedHash": "92b683438f3e5e5d94bbbdb09159ea8ac752d0ae4b5aaf641400000000000000", "service": "00000000000000000000ffff55d1f270", "pubKeyOperator": "03be3a96b5e30af8f3b790f5dd4208dbad6e488ab3fb70c793505b60ac318e079d2ec21b7b22153e83c9cab18ca6e0e2", "votingAddress": "23tscNthGXzu6bxZ1deiE7KgptZ6", "isValid": false},{"proRegTxHash": "504b47928fa801dd72e6830478e55aafce3c2648e8e9979f2fbdea66b8f55d4a", "confirmedHash": "53210e5af36af566cdba264466bc84bb23247f87db30fe451100000000000000", "service": "00000000000000000000ffff9f59c14a", "pubKeyOperator": "046a802b6616001c770b07f4a73875e5279d004391948bab683d17edf289268da04ad880ea51d3d30e14b690f451cf16", "votingAddress": "NBj9v1BGAe43By8iU6kfvfvgRR9", "isValid": true},{"proRegTxHash": "95124a3a912fe806e583c8cb54b0702f20dfc9875d834e4432519efd5714b361", "confirmedHash": "6e7cc8bbcc11ef5c72e7cc082fec9cf10fe908cc13e7616f1500000000000000", "service": "00000000000000000000ffff2e65ea64", "pubKeyOperator": "86b1ca6f600d8e7579b4b2ddbd3f28b280c86bdffb92b17e3bf0dacdddf381adf8f02d9cc220a9a5651f5888e23aec79", "votingAddress": "46AuEV55iAqnMZvWnVRNGm1Xv8RE", "isValid": true},{"proRegTxHash": "f8f8246349c1a16e0f248e754c5f7b7a55bb410f2800104e5b1ea86c732a190d", "confirmedHash": "4dc6aabac12b80ee6ada50d539e84eee392ba6b46b4e46ee1400000000000000", "service": "00000000000000000000ffff9f591ccb", "pubKeyOperator": "8426736e5bd2a26634790bba15415d880163b9c28b7cf4473f204d108d350525cb8ff0c99f2fc074e16c6ffd2299b809", "votingAddress": "2tB5yrbDkHqohajo9JYLcDm6NUjv", "isValid": true},{"proRegTxHash": "4d4f3c1c4a31e3fe1538e82baf05eaacc5b650782883ce848b6dc192bd6eb20a", "confirmedHash": "562026df7e5451d0c27aaa84351611b7f2c56703f530e0b30500000000000000", "service": "00000000000000000000ffff55d1f285", "pubKeyOperator": "932de4f38830c7654f9152c52b2635a61dc57821ed97dd70774a4b907644f1955c29922bf105d7adc2e076286758add3", "votingAddress": "3HzHran7iNTbNqHvxnfkQaWGGsXn", "isValid": false},{"proRegTxHash": "cef88692fcbc11913dfaa45f5ea8ef71a6677862b45efe5a48c4b7b0f05b6a2a", "confirmedHash": "50117a8a1a53621b1db3b397a60d0578b55410297d67fa7b0b00000000000000", "service": "00000000000000000000ffff334dc20d", "pubKeyOperator": "92b18f58b3ecfb75e2906fe2a9f154b56162e1bbc9ba1cc91af3feb5657baaedc08542f7d8bd03a644af046f66108e94", "votingAddress": "4AmWLbGgU42i1romSXwfPb8U52Fp", "isValid": true},{"proRegTxHash": "4b2b7c4c80f658823b80402605c2b7f67f6911c9cbf6915080b4793a22ff36a5", "confirmedHash": "d47e4a21dfa0a3dcac619bf15493e0825db2ef84288985be0400000000000000", "service": "00000000000000000000ffffb009d218", "pubKeyOperator": "8a70ec61345aab1b2ab12f92d561aae2f2710f506b20db7836bf3df0c5da9fe053778a9728e0e7285ec477ceaf14c343", "votingAddress": "483wcrfmuSDMwzKfSBKQauTQWBQn", "isValid": true},{"proRegTxHash": "a6e475527c4d4634da8e8c833736b201f0ebdc824872e33f690096c2fb56616c", "confirmedHash": "3e0e828a20821c1bf4f9a2b5d182e3284adf891568fd0df50000000000000000", "service": "00000000000000000000ffff36b87d57", "pubKeyOperator": "07f59bb96d8d32ba51c7c77907ffaa2ec52078295b5427f275a771134d7ed1cee36ef9825743124c76125f2b9b3e1028", "votingAddress": "34G3nNtqhoTeE7Ctzf36TdkhsLCq", "isValid": true},{"proRegTxHash": "7231de7eb9b3306af6005e310952153537e36d240d933820cc4af7619258cf2b", "confirmedHash": "506283b810b169f9bb333594f5becb64103496e8df9d85fe0000000000000000", "service": "00000000000000000000ffff334f4555", "pubKeyOperator": "818e8125c94a940ba4f39ff5f31e8cf8eb4738d4703eb75f3e7166b179d6659e3ec9776a1ddeb84005c2f7ac51c5e46a", "votingAddress": "2PfoyYMuUikXUUa9uC92tRhED6CQ", "isValid": true},{"proRegTxHash": "72295bef4981cc0faa3bd3282f28cd0f386fcf08e7637f6f06544ddc9691e588", "confirmedHash": "58c288afb926c7bdca09ce0288c2aba3d480870b4cf34cc81f00000000000000", "service": "00000000000000000000ffff258b0af9", "pubKeyOperator": "01c4544e585b744e2bbfad6997f5063db2df8cbfe97c9652ef7e973079efec86f83fdc06755d91d4db50f4e72cd6e694", "votingAddress": "2ujSbPi4E4TzvTqRzxygztBgWzRF", "isValid": true},{"proRegTxHash": "6b5ca8906107419cc137b0336ef71f1adbb1ad2de71e693c7601a8f619daa6d0", "confirmedHash": "151f056d849b7ffe0a485bddcb906437178a7baa7dc3afa71000000000000000", "service": "00000000000000000000ffff0feb3dc4", "pubKeyOperator": "93a86e5817b5c38f880be037390261fa232c04594dd0343a78ae510b6cd9cf44e3ac6c94d82cf8cca989a3bbc50f742a", "votingAddress": "45JisGvRFDzSDYVHnXiLoBbrGqit", "isValid": true},{"proRegTxHash": "6e8fef03057c521b06a275b20c7807ba058aec8e18a6eee9fb930f3f77ee00d2", "confirmedHash": "1ba7ca3be0b58d713db473a341dcae9bd3fd67ef74c98fd81200000000000000", "service": "00000000000000000000ffff5fd88c97", "pubKeyOperator": "1678a03234ac2192d1f4a39fd151aee1d41b214664acad63d1a36c2f319654eb5e43c31d8e09985ca5314446c85f3e73", "votingAddress": "2w2GvA8rKFrGDZVM89RKHkkRSQqN", "isValid": true},{"proRegTxHash": "5a795109e1e2b2e5d06343c2dcee1b83957006985d03740b16e93b930968f198", "confirmedHash": "508ede28f5ab920703c7e10990c537b4c3442d828eef7cfa3c00000000000000", "service": "00000000000000000000ffff36575171", "pubKeyOperator": "86e4248635c837eb48c07b63aa63ff013e3c38e0aabe7e0ad7cc64524b4f04ed1892ad2525704c7d1ac3461f3c64e93e", "votingAddress": "mgZVX2uTsAdtYCyB1jNBxAsSRZv", "isValid": true},{"proRegTxHash": "48991a9968caf8446450217ff73d7d7ce0d0e331e7220c7ee19b0120d9f3b804", "confirmedHash": "e1d20814013dc14f5a7f4bdcf69600be62209753402e1cdf1300000000000000", "service": "00000000000000000000ffffb23fec69", "pubKeyOperator": "11d3f729e18d03589e5795565318007ec11675fbcd970ff72c6d8534f0a9e582f00d6254d897e5563e90286a5ab2197f", "votingAddress": "2sVdie9vcW2F1YMKPb7BKB4VEmvx", "isValid": true},{"proRegTxHash": "0367a9705de387fc34d6aae1b7694e05b1b10bdb4b2ff8457bbf84d59e42e0dc", "confirmedHash": "de62cbb4b61a568e01108cdfb9db65023c3d21d792558f450a00000000000000", "service": "00000000000000000000ffff52c4097b", "pubKeyOperator": "8f9cd0b79911cecb08328a506412927e6dd105edc74aa45ff24c0fe06e37ef81b608956b09e726b36ac9996b00a3b284", "votingAddress": "aPgwpFLwRftH6tSxFUxE4yVNAjQ", "isValid": true},{"proRegTxHash": "cb48b5a65bf62c7fa3b99230f3b314b8ac524e79d65ef21183f580e66641c158", "confirmedHash": "6fef410c140bc00f7679369f7fa2d4b2ac556c9b5411ecf40600000000000000", "service": "00000000000000000000ffff55d1f20f", "pubKeyOperator": "946f7b51f48b0b878db98f0f7977af25918b20bc90559d516bc84658b63521cd0a5c0939db4eee3942b0ffbcbce9b174", "votingAddress": "2kAA6azz4rgwDx8ANm3d6C2y4cGG", "isValid": true},{"proRegTxHash": "403bbded5353faa123de58535ecf3cb81ffa5a85f07a47ddde3fb54d663a9e5f", "confirmedHash": "8168b3ad5d59fd1fda68340a2cbaf9d24f6a8cfc01997b5e0400000000000000", "service": "00000000000000000000ffff8bb48128", "pubKeyOperator": "9428b71d10a6d7cd8956c8fa25e6e0a7cac2ae9939963b387164e31be7988b5d273f447de130363108e2147aa449be1d", "votingAddress": "2PBoev9VmUqUU1hZJDMgx96DDnkh", "isValid": true},{"proRegTxHash": "964e342c90fc79f12d3a64d9a6b594e60afc42d5598606184a3683b0ee5c541f", "confirmedHash": "591c5b1d605fa69dca213764b2a1974510a3f18e1711cbea0f00000000000000", "service": "00000000000000000000ffffbc28a306", "pubKeyOperator": "99017bf12011c9eca2f0c061926fd93cb49ef196fc9d41046fc86b9cd0fa2fbe509b7bb13c5457867f7d641f983dc44f", "votingAddress": "2rn8RmuARyr36YGX9a1GAEidxD7v", "isValid": true},{"proRegTxHash": "3d8285261666672419f5b6e3e4a818da60a37ff62acb04ed6a6bf7391f25693e", "confirmedHash": "de4988f658a51b5ca94696ddf559bc73f42868522ced8f001900000000000000", "service": "00000000000000000000ffff5fd8e661", "pubKeyOperator": "02bc83832ed8ed9b6aedef8b81257ee953464854537273d6273eba7abcd7ecee1e1db1c3f696eeaaa623c39142b6ec3f", "votingAddress": "2eD5Vp8or1UHVCmyMAJ8cct3Qqw5", "isValid": true},{"proRegTxHash": "9836111bb72e75207d810c5fcb3b6a7560ff5d6cfefe922e787989fa0638cae9", "confirmedHash": "c3e117f56322bfbc9b015adb0901db11cf9aeab2ea7dc7a41100000000000000", "service": "00000000000000000000ffffb23e158f", "pubKeyOperator": "0808b0de7e28b525d34b5a28a2c995a93c616b118c5d05b5f8dc2b312d9e0cbec5e08a4ddff6e5fdf8877ef58d4a5d3e", "votingAddress": "3299ixQFz1GRMFBQNCZte14QGLis", "isValid": true},{"proRegTxHash": "5a721870048c31eab233b4c28b54839a0f5bbda2763fd6736b2be7caabae52d1", "confirmedHash": "858bc7aae0ea400f7041e301522aa1ea60ca89f641f4f9980d00000000000000", "service": "00000000000000000000ffff40e37082", "pubKeyOperator": "07b06ca95922aaba39ab04e9ad4ca92d82a0102a32c071ed1363a3b83630f29736760e1ea6c32935fa92e1b6c1c40818", "votingAddress": "eYJLfVDbK7ESLfCrsK9ADoPoPj6", "isValid": true},{"proRegTxHash": "82e50b620736dbef082438fa72dc14cfc937d810d7d39610f5f4f6dd7c0d967f", "confirmedHash": "8da6d003e4e72fc21a08d4e49ea2143628664f6b7becb3060300000000000000", "service": "00000000000000000000ffff5e82a9fb", "pubKeyOperator": "06d02f31dab13411c4802eb1cafde5ef0bca19438f0589f04ff58fd458a0590d1e21629c012adbf8b194f44e429c7b65", "votingAddress": "2kctaAc18fhcDJfuSV3QYq14otpM", "isValid": true},{"proRegTxHash": "0acccb78bc055351845f5c54ed12acc0e442bcd0f634840ee40993e64cbeae51", "confirmedHash": "04d9fb327561e31b9683ddc353f3c6928d490099244f1ffe1600000000000000", "service": "00000000000000000000ffff2f6e9cb4", "pubKeyOperator": "96a56f24087ede2040d83cee463a76477eb2e7089110b37397c3b93172cd64ab6ffab9c6a77791e771fa79ed4e104147", "votingAddress": "4U7VgLNdFPTutpUeJadXtqP4yCZD", "isValid": false},{"proRegTxHash": "be4c725b12c1340f212753efa03ed4ee730accfcfedaa3869e29bcacf1c90052", "confirmedHash": "885d42570aa964b74056996d7ab04a1182a5d994d0f2a0270c00000000000000", "service": "00000000000000000000ffff55d1f205", "pubKeyOperator": "83d089f75468f6547a590ff60611ea417b6c1062255de4f2b02a128c00e19661bc1ca14489aaabdad80bad9892ca675c", "votingAddress": "2HtyMe4CSbbeqGrSEgEMcufFViKs", "isValid": false},{"proRegTxHash": "c432c3ec21164489e27437c5966f41ef2c3f901365195343f9038fab2cccf9e9", "confirmedHash": "1404d994518f5f1e5236fef3c9e7926184ab14c6aff33c4e1c00000000000000", "service": "00000000000000000000ffff592fa01a", "pubKeyOperator": "97e90621815fa98b62e0c644856b8a51b9886b81e21259e5468d1cfcca332b3fdc08ad4f2e35753269ab320500bc65d3", "votingAddress": "xTLYyjRgaYHSaAFmK5iFikNstFZ", "isValid": false},{"proRegTxHash": "6660377604c62bd3a460416a823396e969c657491d218a3d6ef68a90f5ebcdc5", "confirmedHash": "b13718249496d9612aeb030e1df2628c49bb3e9449a7a0411000000000000000", "service": "00000000000000000000ffffa87757c5", "pubKeyOperator": "8b20e275a0829e2328f0a0b0eadcc2c23d7394fcc23ae11e1f8135bb58126577ca85d775f379a60a3b90c20eb2d3774f", "votingAddress": "2fbTDau4vre2e2vcovoSM1whWDG", "isValid": true},{"proRegTxHash": "6c725a233dad2bafae8a47ad3dd60d69379108ef84f23674b81703af001d3d2b", "confirmedHash": "e458571e9663789965c4a8ea410d5fb4625e18d37e4114f90c00000000000000", "service": "00000000000000000000ffff2e65cc9d", "pubKeyOperator": "198f6ea9b19fcc972f2c8abcff89410ac8fd829d971d9647743f6b464d7e66a9c4c35db9ff07523fee6e408b8a391ad6", "votingAddress": "2DY6pYr3cFAJMNjwxAwRpzZqBXqJ", "isValid": true},{"proRegTxHash": "a287889d227b5d3a9b3c411eca8c37631f9da1f48aee912f7f67ca5c6580f25b", "confirmedHash": "762f4e4693839ee498a1b76069a9b9db8b29985e70c55f622a00000000000000", "service": "00000000000000000000ffffd4186d6a", "pubKeyOperator": "10e16be447ee472c60d1b8b885a6efb8131471fae250c7fc581fb537fdb7e6353dfa901dc92befeeec420cf4ce936df5", "votingAddress": "Z6fMtWhzic2xy97Hze4jvegrmoz", "isValid": true},{"proRegTxHash": "45dad6e458c12a3799278872264fef5ea25bdfbc6548566a8be3b4f362444c9d", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b091", "pubKeyOperator": "88f80766980d9d33cc75968cb1945bf408d18bf0504837246eda5faaf01dd4804aa8cb5db3e82f924c8fea2f200ce097", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "1da860ff4af4786dcaf560961c2f908e47bf9316753a0ac1cb534e59db19eaeb", "confirmedHash": "f25a692d1d1e1190f4cda6af874db0b0cbe59bd4e84caef62800000000000000", "service": "00000000000000000000ffff5d154cb9", "pubKeyOperator": "098c579177d294eea2f2f7ea7972365e80fe6abc12a876222ebf6da31bdc4e8768a50739af2eae4bb961270874a8cdd0", "votingAddress": "297MEk4PAyH6jejpLFsKAGkSVWRp", "isValid": true},{"proRegTxHash": "9921ce50a9209a2e5318e281bc4bbe315247a89445f5f3605308a4b6988c67bb", "confirmedHash": "c04fe1e4ba1779334f014e2c2e988aca2147fa7b30176cdd0b00000000000000", "service": "00000000000000000000ffff9f410207", "pubKeyOperator": "944eaf6d0e477f99e6c02149bd980859e6384f662272dd371018c5a46c7b9aa8f5956ffafe3461b9adac4b917c949b19", "votingAddress": "3McSDeELW1Xtijixkdm7AUjSmNA8", "isValid": true},{"proRegTxHash": "0ad5e86d150a06dd3131a81da86c98f28f2182ff075685a482503ea6cb3d26d4", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688b066", "pubKeyOperator": "8ea96cbebf2a15c75de32bab12552a878ff84b8280bdd89dad5a52c56f3f03e99df5dd05e2661b8715842ec05263945a", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "a684e5747acb6c0ad82d2c1d400ae98935dfcc591320fdd930c5b8d79e502d69", "confirmedHash": "a60d3ab71c1c8502209c70a62da5a320370c3c1759cfdf110700000000000000", "service": "00000000000000000000ffff55d1f203", "pubKeyOperator": "95f2ece44a5b012e3dee7e137c3ddad01e1833afef84bfede31c7d4dbba4d250330f1967712433bdce38304843bbe307", "votingAddress": "GhupFREWn3E43VaFQnN1zYTwQG4", "isValid": false},{"proRegTxHash": "5f0ec49d330c91032cbc9522820c2eb0b14a9bb3269429b5ed774ff93b42ed73", "confirmedHash": "ff51f276f799fb621dedbb67c195e1bd755ac7066caea2d01800000000000000", "service": "00000000000000000000ffffa7636d8b", "pubKeyOperator": "99b6ccc349e902351785aa7fe2277c2eb94c5c0a24bb9745b78537d761c70bb1c10679a8d7f0b970dfe0113c4e50c145", "votingAddress": "3MH2h2aoMgbXnKkrfZ7yh8x1mmk6", "isValid": false},{"proRegTxHash": "87777b1215bd58f0a5d03d7cbf66ce8dc22397f24688123f7ccee00e6fe24905", "confirmedHash": "508498ca8c5d3ee002a692d76d337308cd2273ad3f49c56e1500000000000000", "service": "00000000000000000000ffffc7f712d8", "pubKeyOperator": "873b4ee245abc5fd26188adce52d88b66430804b5c52a68a3038bfe5f8efe78b4e5db3045a11ef00c1809880c4e5647d", "votingAddress": "294evPe6fV4pv7UVTV4q85hPebx", "isValid": false},{"proRegTxHash": "abf62de3df00b1e0b4d609c8de466a1e75b0cab94fc2164f6dffdd1a42c24ede", "confirmedHash": "a3dba9f8c6ef76eef1128001dd671e2462fd49ef40ed379f0600000000000000", "service": "00000000000000000000ffff52d315b1", "pubKeyOperator": "926f2a61ba75c2ecd369692848e138d8d18b2474422eb1865e044b1078baa361cbad5250760bda6c5470d5181ab6c84d", "votingAddress": "4AVrYgZ2ghczcgnXfZJnA7NfGDph", "isValid": true},{"proRegTxHash": "33a2ddaf908b5744870d0d2989a34df5267b608d823feb668a3db98fef4f932b", "confirmedHash": "2361df2cfb3dbd626bff6a20f35d1ab801a740bd10e5a7c31900000000000000", "service": "00000000000000000000ffffb9e4538a", "pubKeyOperator": "935bd0031efd4505f93c96831ab577ee7f4379bc4319a4bc0aa47452ae2b42c96911f3147c4a8728c8b3d04bd2b5e119", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "afe8ebf993d7d1c13ca5383c4ed401fbc7068ae43685eb15cd71d6bd5d31fe6b", "confirmedHash": "270519d3d841e4836b7b6d692a42d8e30b4282d095f213e52b00000000000000", "service": "00000000000000000000ffff52d315e0", "pubKeyOperator": "001c576e670ade910cf3e69e4eeac8404daeaabfccb702d3ae53efa2d851e55dc734061a9d9cbb3f19d1dfc52f8ca095", "votingAddress": "2yZ7Uc7jcVoEc112ZLwjJsoZPyMW", "isValid": true},{"proRegTxHash": "9468947a28eeb1096390d129f5c64bf088f597b687ba49decd85e1e98bc15add", "confirmedHash": "55a81fde90c8b44ff12656b158ad1571fb7e99cde73dff0f2900000000000000", "service": "00000000000000000000ffff6dcdb485", "pubKeyOperator": "90ba3a3979309a2afbe6d7ec700f68a69b2b428cf595145e8ecdd10a06c051d933f42a48f5b7c04ded3e80138c3187b1", "votingAddress": "2nZ9riCbD4hjrMbzgvbdEb9fpAif", "isValid": true},{"proRegTxHash": "5d392eab7857f88766da092d603c2f547c248c12ad0702d3de2a23b246e70ab9", "confirmedHash": "dd42ee0de9d241d0939fa2daf0609dc872c8ea8f8d2321851400000000000000", "service": "00000000000000000000ffffb98d1b7b", "pubKeyOperator": "8ef162a8be4bb5e75ec5a43c5ee3e4f7bb82e6914a96851cb38d866699326f9372e95664dee8a4e4edfb89761606cf01", "votingAddress": "2oLPXF2JxYmmf5cEtEK8bw9SMBnR", "isValid": false},{"proRegTxHash": "9f312b7f1a31b4ffda3446c7deb7c7c94a334acab26b402411da6559de6bbe00", "confirmedHash": "6a5e15a6654babe6fea0a9fc4bd0b704b270dbfd80a776e90e00000000000000", "service": "00000000000000000000ffffb945375f", "pubKeyOperator": "10c914dcdfa76c2da0a5ec3eeeef4555d9569325880fa712a726916ca451cdbe81cf6c8a8ab7f9a6fe236dd76a7aa812", "votingAddress": "3ynAxV8asCrmr93ynnbrQiWhLd5U", "isValid": false},{"proRegTxHash": "4a6a6b1e7e714fb2ac58266132eb47316c23aeeccb037f792b7d0bf51e5cb0a0", "confirmedHash": "74f025dacfb0c4a00ffc935f117697792ae2a0057c8674591700000000000000", "service": "00000000000000000000ffff12ebcd06", "pubKeyOperator": "9635cfc14674b0a5b8fb3ae0147cab173332fd753ac9b2ff2f5ae93f92e604a08424c7806bc80ac095d8dd532994ca5d", "votingAddress": "3AMRDpWBn92FKUfm7G9kqFW5vgR8", "isValid": true},{"proRegTxHash": "0165f33db0b96c37e63b79f78cb1e590d6d097d6aac72dc421c43953c489bff4", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b088", "pubKeyOperator": "108e9c3b8b2d430bd38530cd5d4e947c9e2e6dd2488a2f1f9e56a8038a5a0fb03ca0a493debef66a7969f9f5b9f43393", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "bdcaa8636cf6968fbf5324778367875edfc4639d4cbe38426f7d5a36579366ff", "confirmedHash": "efd5db6a8e5340a465aef98e8fd50c9f5457bc33f30de3690300000000000000", "service": "00000000000000000000ffff3e4d9907", "pubKeyOperator": "006e4247038cc4d83029fc1b8167826e5de776db40067774839141f8ef29cbf35b15d40e08644a1e61b9c30c34295553", "votingAddress": "4UGBPncnqXYv5R1sVMQPXaMdqhs6", "isValid": false},{"proRegTxHash": "e79a4f9c36626fe1c835bcb07104598a64ccf3a396efe0b3c5b69dd25a9e2811", "confirmedHash": "36ffd83b863fd3f3919f4d3343aff81ffae1a83932183ea42000000000000000", "service": "00000000000000000000ffff5fd86d85", "pubKeyOperator": "8d5a98a1caf912eeaa1a8d10e8817214584b05cbf1189ff236d2291ad3830ac2362c27d1c07dbc2dcc8c621ac6adb6b3", "votingAddress": "4Bxzm62M15whBhcMdeqPvmQbhtX3", "isValid": true},{"proRegTxHash": "420cc1e1f66bb0938fc61da63ed5be99567b31785767ae103bbdf1bdc895fac8", "confirmedHash": "668c8a3a4cec681c9119422ead12f254dad5adefba94107a1200000000000000", "service": "00000000000000000000ffff5eb0ee0e", "pubKeyOperator": "85c58fb16ae0e4730de15b237ebb1f88e93cd4c4002666872dcadcc50186edadfd0434163079f8365e77a7e373da46f2", "votingAddress": "4CFZWBHdYvkhYFaw4kxuoqQbDyCF", "isValid": true},{"proRegTxHash": "994bc909eb5211c8c344fc66cc4d8433e9dc075768b6fd2515b5781cbcf05311", "confirmedHash": "5ae7191732b01d7f85ec0a9305c62204d359511d833b3bad1100000000000000", "service": "00000000000000000000ffff05bd9150", "pubKeyOperator": "1539a0e3d7d5c9ad1e654361bc86579221b6b54fb524565333ce8d0f4ad6760b57ad552762dfc5da6285aee79c3b37dd", "votingAddress": "3aKpkyXaow1xeyZhYEdnns9jt4ej", "isValid": true},{"proRegTxHash": "3b3a8f3f683f9259d5f5cb957dfe57d6b194eb235f8dbb999688792bf0e2d562", "confirmedHash": "58e240a154a0ac48dfd26143fb8ac7413aa11d8f10f16e622700000000000000", "service": "00000000000000000000ffff87b5322c", "pubKeyOperator": "0a6e3ccb6390c37c13a291a0be6e98a83e464673e403d9fee0033eb427c7686c56156e9a6298f597037dcdf450b51a0e", "votingAddress": "2QwBoMu1a3cCjcM5JU7aYqYt9pMr", "isValid": true},{"proRegTxHash": "68db95cc62ca4c1946d6a8d2722634ddd8ef80ab44caa9fd6fd993320fe8a903", "confirmedHash": "f279fcd2dec72085547622188a21d7ccbc972257a74cc4173c00000000000000", "service": "00000000000000000000ffff2d4c5e9c", "pubKeyOperator": "07ccd40d342520f61e88fa75fbf2dcdfc522117c79ff174e903e81ef68bc712b137ee8613415bb7ee4ebfc55b2b3552d", "votingAddress": "4PyBwX8XLfeHFsCGsZrmVGYLXFSN", "isValid": true},{"proRegTxHash": "5cf5572a61c72e18534d7d0390a2b0df2c640ff00b5b0ffd22d5475b18aa7648", "confirmedHash": "8ff653f659d4478ea4257cf726b06155732e6ac3913d54bf0e00000000000000", "service": "00000000000000000000ffff52d31966", "pubKeyOperator": "8991ab154c52c83e62da2387cdf4b39ff9dfc72890b37be3b498e1daa547411f2b73a459ec58a8e6dc5e37a8b37e131e", "votingAddress": "2ss4xhLjCwMsoK7N52yG3qzQGfHS", "isValid": true},{"proRegTxHash": "b3be924fb3e81e9d3f8edf062bbbba7fd72ef31bfec6c13a72f9886e11883ec9", "confirmedHash": "9c34734ce9eda0180ca8301e11c0910e7578e18ff44e24720a00000000000000", "service": "00000000000000000000ffffa516e409", "pubKeyOperator": "13c2f399e09ce5d8f98b88aecc6b4b54dcb1575686db34d50f9cada6f48aa7d146644473b9840f3c6f7e379923e592b7", "votingAddress": "2jWTRx87AtJQQgXRbccaQm2i22eB", "isValid": true},{"proRegTxHash": "0ec6526da685353c09eb573a04f4969eff370c9c088c57e6c6f8a9d7fc23071c", "confirmedHash": "d82bad0030563a5b669480b1989978c8a45566066a194d3f1e00000000000000", "service": "00000000000000000000ffffa2f3dd50", "pubKeyOperator": "1828b848d804b70eb3a5a3ab22c308ce41fdbab673ce3b546c133789017b985657c1f78a93c6d17191b3aac84656d8b0", "votingAddress": "4SKvZCF8oqyM66bMRBoSq2YstJD3", "isValid": false},{"proRegTxHash": "506ff6b2ee629b59e2ae6f1b26a76ee2d843e0af27d96c6137b922bd4bc70167", "confirmedHash": "fb80e8675092bbe6941feb1d09c92cdc7d90c9ce50d9b30c0200000000000000", "service": "00000000000000000000ffffa5e82358", "pubKeyOperator": "8b2c822a369fc46b7aedb4a1f3740ea76b58242fd5749b2d6463267897c2e2ebede16e61fce20586c91254fb4b340acd", "votingAddress": "4UnHZV7erjRrpGZmHrzMHf94SVdw", "isValid": true},{"proRegTxHash": "d79f66e39adc0b665c51ef2a5a4494d38e65e883fb7c02236bffb203f106778d", "confirmedHash": "1272078e91251e3ae739bad8061aed34663c177a23debf6f1400000000000000", "service": "00000000000000000000ffff2e1ebdd5", "pubKeyOperator": "958ffc2a6a2af98c4d902deebe9d946c477d901b1fd1d812e3f9ea5cf622762ecb74d9ca67e165719d0b01e1db5ff4df", "votingAddress": "yfNhNpna3djiUJhqcwLp2rF2je", "isValid": true},{"proRegTxHash": "66f960150752a9b5def4c862e3dfa94041cf7b065f2211974ffba6dd289a4432", "confirmedHash": "ea3fd9fe48a5560c48ce197ff9ee4715200fedb0b683274e2b00000000000000", "service": "00000000000000000000ffffb29d5bb7", "pubKeyOperator": "0eb23a52722515dd063625d525b251158fad69445a7a6f3efd920dbcbbba559dd4832576b8fa685a3450e187bd0c0da5", "votingAddress": "2KHd5YmKHUHwa9LaMZVFXwi56eUA", "isValid": true},{"proRegTxHash": "b053f826aa00d98ed74b088d32b3baed9399f04721158dd0471e8728a1383ad9", "confirmedHash": "ea286269e2a6c2d405bb9ae0dacdbd2ec24782915f88f49f0a00000000000000", "service": "00000000000000000000ffff55d1f254", "pubKeyOperator": "91fe68a3d4802050347e772d07d06c028a3c5165b963829750af9696cf3b778d371ffbb5b74cab7968ad8498bf3f7ed2", "votingAddress": "X2KBhthDZQhaTFNLgMWAyQ34Zer", "isValid": false},{"proRegTxHash": "23daa1c11aa3e4b9026ec4e58aa9c3c9b2692aef437c35be689e78d5166c5b19", "confirmedHash": "ec1dd95a7d88d970e9e4494e46deeec559645274561ffdd42600000000000000", "service": "00000000000000000000ffffbc28b845", "pubKeyOperator": "11bed9c2c16b0ea08dd385976e6522ebca5e946cfa7824a7c8bad20a3f63a4f1eb40ae7d1b85f8b3585e1211fedc0d6b", "votingAddress": "ciHNqKQwkR8kfGwWtS51dMJo8DD", "isValid": true},{"proRegTxHash": "7014a9f44ba0871ce36ed1ab28d019eeaa9a0cb3428a64127050ccf4c14d5835", "confirmedHash": "653ff76c915d5127c22ca3cad18501ee06969070d27315763f00000000000000", "service": "00000000000000000000ffffbca6043f", "pubKeyOperator": "8e0dcecd1714f2750aced229ba283106c948525a15215b00fab94b1717738ed61a65a95ec5d66c7fa0d2fe6a478ace97", "votingAddress": "3vbKK9rQ4tAYpY1wmHzr8aDeEL9X", "isValid": true},{"proRegTxHash": "4daba3a6a198ea631870c8a6d0140396e03d4336babad971b898be23bc1f9885", "confirmedHash": "e1c816d5704d50b21668be468f49700739b97ca9a9d183dc1000000000000000", "service": "00000000000000000000ffffbca605ca", "pubKeyOperator": "0948346a4e6f6bd810ba461a820546234eca6ff321026d100549da1d83cdb323ad11f657d7cead22259d92d8d5221088", "votingAddress": "4NjLHx1FgS89Xr1Y4bvFzBBBJrZN", "isValid": true},{"proRegTxHash": "fbbf8e3dd5061f13bc86b363f6061fcbb795c07f7e035e72b3ee4ec3757300d6", "confirmedHash": "663022ffdef021e0ae832b5e24896fecf35ba91026b241d90800000000000000", "service": "00000000000000000000ffffa8775312", "pubKeyOperator": "8d27644c984938ca471fb8eebae76114b17ab43bfa1e726cf50b335f26f39d2d5faa0aa3db3bb2c6bb94e2c027d25f3a", "votingAddress": "3repZrFZTfU2fUMoEbabzRCNcoBP", "isValid": true},{"proRegTxHash": "7f87163baaaaaff16fd3cdabc002c9b66ca85d5a935f254f83807c3e94e454bc", "confirmedHash": "5f3d1cc0f4ac66e78d503704aeeb91ff712b98a2c189c76c0a00000000000000", "service": "00000000000000000000ffffb945366d", "pubKeyOperator": "0980de89ca42fd8ed2ed784f5b3c9adc49d530b160c7f0281494b4559a62d91a54c592d4c81dff76cbde16f4b969a1bf", "votingAddress": "41779h8a9D3PFLJK8WBeHTUdBVeH", "isValid": true},{"proRegTxHash": "48f16eee7a5a1860c043eb7ec85783d00fe69bcd518f921d3bb1d18ff34bf64c", "confirmedHash": "91a6595f7fb53f1f09f9df2e741120864738144ed1f9572d0f00000000000000", "service": "00000000000000000000ffff55d1f275", "pubKeyOperator": "977d3b02216975c423abce6ee1929182c50d1a169826976e300678f971232cf1d0befa17e8d410e284f0c31917be735a", "votingAddress": "2NfA5mLZNymZF9VMomPwbnxuUf3H", "isValid": false},{"proRegTxHash": "38832ab77a5136787be5f1adf4672a3c6aa3f41ba3eb6312cfb542d2060cf713", "confirmedHash": "ca155287a92b44a951d16aa6e598e05c4051a48b9cb284081100000000000000", "service": "00000000000000000000ffffb905349b", "pubKeyOperator": "137dc44b89a3f0e4ddc6918482488e19563e50aed91427d716f629a7c384487a476c9253077169cfa1e3334f8293d27f", "votingAddress": "3np3hvz4umPa1iGzfTwFVft9abKb", "isValid": false},{"proRegTxHash": "40ba966959869a01af361c346dd1a07117c94a2c2dbf23e4d226cb65d79e41ce", "confirmedHash": "992f62a5109e217be7b10722091d7241a0b55872b44338321600000000000000", "service": "00000000000000000000ffff92b9a1d4", "pubKeyOperator": "08b9db7be4182a1c691f72b2ddbf5a269a7f34411c783da970bfeb7edbe92f1d9c345b681cf4e8e605747d9eac8deaa9", "votingAddress": "3UjXKsGFjfutce33epDoRettcvRL", "isValid": true},{"proRegTxHash": "935de6d5887591b7ee0cff5500366f8dd8e86bed92a2a63f8262aaf254306c80", "confirmedHash": "d7466451b56a3a8d1acd5d2e03dcdc511865212790cdce6a0300000000000000", "service": "00000000000000000000ffffb23fec72", "pubKeyOperator": "1892e6796ce60c17dd507f18afdbd203581ecbeb71b5fb445154792d670e260149e27309ede29ca63456d9146e60c52d", "votingAddress": "46vQU7SzyMRXfNgEx6Q4ejwo68Vy", "isValid": true},{"proRegTxHash": "43a76834feee290084ddc50a8956356363994603e6a02d1c992dacd2e5b5ef37", "confirmedHash": "c88aa18f4a7057f170fe52e61d61a12d6cebf92c23e3f5b60600000000000000", "service": "00000000000000000000ffffcfa74019", "pubKeyOperator": "916bbb30e0757055b7d8b8f946aa95c8b8a766d597b73d6606f50fa10213a73dedfb39e1068a073db70d7fe72b523c7f", "votingAddress": "Bp8rZz13xBzxMCmna1m46UD76zA", "isValid": true},{"proRegTxHash": "53788a670449ba1ea3c4dc16d9bc84029c91d4b0a83f31b45f96729b679ac81e", "confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", "service": "00000000000000000000ffffa8773e5d", "pubKeyOperator": "82183a1017b7b4a7ee0cf6394fe18bac9ffc1bf55da51895480c5c1305bb1bc47c12f61b116c37ca75175d0a6fd87129", "votingAddress": "4TXJpBdBPQQsVbkoW9AtqWh5VXiV", "isValid": false},{"proRegTxHash": "8fe60b78738e24a98c2c83ae8c80a7c143e2d68039f912a2b14c96914ac16a48", "confirmedHash": "e1126d826d7310273d73610a8430dca512afb7c552958eb40500000000000000", "service": "00000000000000000000ffffc0f1ea40", "pubKeyOperator": "825d12abde419cf6a70eb58a136b7dff662f920bcba7bc7608b8e797f59bb11ff1511badf927aaf7aa8258d23cb2143c", "votingAddress": "2aAhbdgpqP3fmUzLL1LJNicXUDtj", "isValid": true},{"proRegTxHash": "95fcdbe6bbee7fbd99528037f7345dbb6deea09a056560d8bb9faeb6dcd02950", "confirmedHash": "4be6c94b95dd1dba42386a8167c8c4a6897f3c41b6c15d741400000000000000", "service": "00000000000000000000ffff2d479f68", "pubKeyOperator": "82382fb5079153b39e1b629247f1c5888a74604ec1127be575d988fe623af0e7894967e71db131c8a274661777f82f8c", "votingAddress": "4FQUJHjPBwTQ4Dw4YmnWtzNkToKC", "isValid": true},{"proRegTxHash": "b2301c33e7ae50d39a245027d4a659cf158c5a0e1a39ce10bb0be073502dc969", "confirmedHash": "64c7a7db676a03a89cacb89424829ea71bb4d28df09ba5130b00000000000000", "service": "00000000000000000000ffff55d1f210", "pubKeyOperator": "861a58f6d5495874ccb6fd78943b106f9078cf8ac0854b67d2feec6716569570fed7fdc569b160a882ab182f8237dda2", "votingAddress": "4AvZDw18QR48iGtA92j67hN4VE6q", "isValid": true},{"proRegTxHash": "a5b284d6929a0fb726f1e060495036e455017b12d1d5a0f4fe84c48ed4ba31ff", "confirmedHash": "ffec47b9d9e23f092441f227090f93b748027499fe0b56e40400000000000000", "service": "00000000000000000000ffffbc28b849", "pubKeyOperator": "1725872919f368be810a91ab90c9de8980aaa032ac202d615e1f12031671f4a9a408f4e8936e4041f89a3911bd71bbb9", "votingAddress": "2EXMN31R6BiS9Zw75c1bMeTnb7XB", "isValid": true},{"proRegTxHash": "b7b7010e4824c79a92336d249edcfd8a46d9f6a3ec812335f256b70ef49062e6", "confirmedHash": "f21c36f9de929bfe132d251096aedd0b778e12d37c9bfa1c0f00000000000000", "service": "00000000000000000000ffff8e5da73c", "pubKeyOperator": "0d27b0797591889e4119c67fa2e985a340d0b70cab62d8d815b2df472e98debe48f2ab14ed6d0a48067089858664043d", "votingAddress": "MShUDDPUoNJoeuFPzUxJAWkWPzx", "isValid": true},{"proRegTxHash": "4239cb071d2e496744a0a97b928616d212e61a6b55c2cf463b810cd7315c9b80", "confirmedHash": "9cce9c94f0b3ce5295e804efa3a562ceb2ca1ee47007d2d70b00000000000000", "service": "00000000000000000000ffff904cee02", "pubKeyOperator": "01d0ce1659fbb69190408b8985939db957a317f1bba85632f7aaa3d234edd83d3fefe4ae2ce8a75d0e378ff23bcf4cad", "votingAddress": "GafnfTiXC5pWna7s7Mcxp3WZFyk", "isValid": true},{"proRegTxHash": "639ccad345aa82cf898a912db60c49e5768de9bfd0bfa92bb91380b40e58b0c2", "confirmedHash": "19a8f40a78010724e4208fa54abe708343748ac7e3a7d9b00200000000000000", "service": "00000000000000000000ffff95389f8d", "pubKeyOperator": "952a80d650fd773d6b986bc17c29409468e46c3b05f1433e7ed9f0039346f648481c4117d3d5d141e30c7b669d4bb64f", "votingAddress": "2JZiwwYN3nX96FcMjwav4kkK4cuF", "isValid": true},{"proRegTxHash": "d4393fd355a2682f7ba6ec28c0e443afc3845fc7e3de3543759fc0a28e7f9f32", "confirmedHash": "d3efbd7b64b0b85400d3e3737f63ec4d710f5a57882716480d00000000000000", "service": "00000000000000000000ffff68cf8311", "pubKeyOperator": "0f663f40a29289f8b3f10a82f12d5a75372b0682f9eb11ddba4b82150c526002490ee9ac3b2a2875283baeeb634aef59", "votingAddress": "42SLbarvkWqGDKnTzhznEzs8xhj1", "isValid": true},{"proRegTxHash": "c4b374875e523bb2968ba748ae569eeb532a998a8647f641f5e5e4c9141da12a", "confirmedHash": "2314096ef49c237f6606b31ecaff2b853759efc5bb122bc52900000000000000", "service": "00000000000000000000ffff9f5971ca", "pubKeyOperator": "8b8e4eb655a930f9fd22e68a8d985631659d06f3465ae0ecec620622fbf78833467ebeb3e1c5aad6da0b3ad14b3f5b1b", "votingAddress": "4B1yddNQ1956miarwXc7FBVJDCPy", "isValid": true},{"proRegTxHash": "b807d5601c429c1259fac4bad809c727c3b329d9d5c7c90873f5ebbd8a595982", "confirmedHash": "e9babebda286e2624e9ba828607a4cf0c91eaac599000b3b0200000000000000", "service": "00000000000000000000ffff9df5428f", "pubKeyOperator": "16189c260f3b93c22f06fecd1d41d3a3d479615515f7579e9323f085687aa192421e7cfc62802e9c2063d7902223fafd", "votingAddress": "3TS8Kfez6dzW5q2pKZNaDVUxQhET", "isValid": true},{"proRegTxHash": "9d9aa8c68872575489f881b67fd4d905638b594ab446fb48777b3405d73f8c14", "confirmedHash": "a7225740e6d6f64bcebc56b08e750e4348d64bc281fe91a51300000000000000", "service": "00000000000000000000ffffd4186152", "pubKeyOperator": "88cace92eda9f34f11251c1345c9e7edb85fd8932f27efdf9ceb81c4eaee03a60d11a1c256a0ebc0b86df953043ee6b8", "votingAddress": "3A41en1PMCrKZkXCNG6yBEELR5i6", "isValid": true},{"proRegTxHash": "1cc3c83a64f01fc08d1b6e320a9ec4a9e95e034cb795e73e19e779c7bb817887", "confirmedHash": "2a0465522ca98da7b298dd208cd3a7ad16becf7641f9e8c21200000000000000", "service": "00000000000000000000ffff55d1f139", "pubKeyOperator": "0d578ff1d9e092cae922eb9dc1edf2db5b64ceb4a1344487797216e7facda22dee28946c6311bb75c8db16934403c90c", "votingAddress": "2Jnr6tKVDvemxy7bHQ5Puny7QuTT", "isValid": true},{"proRegTxHash": "4dc479f8a597af81d46d35e2b0c9601a9cf08ca74a13fd4cd9795108ce5df162", "confirmedHash": "beae829de12b4541bb5f7b1b56c3112bba87218693a3409e0200000000000000", "service": "00000000000000000000ffff9de62724", "pubKeyOperator": "0da0fbae93f47952855f8c41990a5368349e8c0c006a703cd79111dc5bfbf3a2aa9736a5356206eeffaeb34b59e5a5fa", "votingAddress": "243hMLekFZsvzjf7ix28jq3HgJG2", "isValid": false},{"proRegTxHash": "bb5cf6a639ff82be47616e510c84f9e4bb61e218b6a7b4eefea14ac87e97b7ad", "confirmedHash": "a4e490f145795651d0d85d9fa5000dd90269cbd23d5ab14c1b00000000000000", "service": "00000000000000000000ffff55d1f22c", "pubKeyOperator": "941ea0173ecb2d3f924e68ea33f6487121c213c7b6620dfac2f368449738ed3bcf482fda76cfda7fe668dafaa48f0fff", "votingAddress": "3uBe63wtDeJ9AC5eMorz7vzzAkXd", "isValid": true},{"proRegTxHash": "cfbd1486ae2eea9c940b85e8f56c28b05dee0f7ad059df47e060613f6eeb22dc", "confirmedHash": "85294091ea22756205385db6ca1b5328e6fca372a7b703e40900000000000000", "service": "00000000000000000000ffff55d1f230", "pubKeyOperator": "1763f7de576c4fa8d51010d2eedcf77c9d48e3b006475e212d205f87bf176edd95c3530f5f3120295c638ab2ffe72ff9", "votingAddress": "3LezyjVrbSG13Gaivgd4BTcfhHHG", "isValid": false},{"proRegTxHash": "a174098566a4e5593952e5813d7e8a7300b62dcbf803871fdc9797f776ecc867", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff23517204", "pubKeyOperator": "086f964eabe3077b7fab05ec1cae19985f171eaac6b5e237a340cf0c4b46b3e9e6a14aad34c9d2c568b0bf57004209f8", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "e770258ab31f00b0935467b177d404060394aa4435e444102a64077073617356", "confirmedHash": "436bce0544aec1bedea5ab4a48c30165695e44f60b9c008c0700000000000000", "service": "00000000000000000000ffff0238d5da", "pubKeyOperator": "91474741cc90422121d9fa752066ed77142881a532919e12673cf5ce78155b1a56f18431bca33733409b8b5f87f2177e", "votingAddress": "2h77Stg51Aa2WtrTk3Qp2LWWBKUP", "isValid": true},{"proRegTxHash": "82736ba6193f31d30acb6f07b6623814f05292cdc15042584364f9c22b6bb40b", "confirmedHash": "8ff653f659d4478ea4257cf726b06155732e6ac3913d54bf0e00000000000000", "service": "00000000000000000000ffff52d31963", "pubKeyOperator": "958a21a0fc82be0c0dfa80b44aebce0025cfce50c4a97d69d7d37dc800501eb93affe736894bd45106b7e5d8ec9ce028", "votingAddress": "vvBsEw2FQ84PDKWMAeVRwoWji9k", "isValid": true},{"proRegTxHash": "5931dc502508c09fa63528da687d07eea8ce0bd97805fdd99ed4e5a190737f84", "confirmedHash": "e0ed41d61d118f14f628eae9c8c15507548eb8ec3e7898f23000000000000000", "service": "00000000000000000000ffff34cbf4bc", "pubKeyOperator": "93547e0589c8aea352e15765cff3a40eef88d96a9a8e28db62607b14dd81c95de775173e52e478169310c5b72e75f1ec", "votingAddress": "4MR3mivvBRpU14ShnL8dhaVXyGzz", "isValid": false},{"proRegTxHash": "86bda1a615c1d3c1f57ff42a3ea4fc4236eb9c3693350ca312729abf7c72b894", "confirmedHash": "0dd765e19d89a4a57c37af23cdcd7b2688e6a5d54d1c61373400000000000000", "service": "00000000000000000000ffff6c3daa8b", "pubKeyOperator": "1379c53e87019f8a6082ef5083f66955e65a646412721d557be40b4ab4014fa95066c4e627bbfa7bd77b4ccb8d37cc05", "votingAddress": "2ytM9HJ578KSP2tBSPQVDTS8YCwV", "isValid": true},{"proRegTxHash": "a3e863db52a98a67ec8934fd320722bb6a94f8a97f65dd424d78d098e679bd43", "confirmedHash": "111a6a938fddf0b5ba960d054455c3af7fec6909a596a05e2800000000000000", "service": "00000000000000000000ffffb23e80a8", "pubKeyOperator": "8d11a9f2bf786af55a9b47739df97293cf9a17fa7de2810b2aacf75a07241f9136e6eef9c21af52892fb7bffb35eada5", "votingAddress": "ej2GPkZzGqBRXuZMjmxDhYws1G9", "isValid": true},{"proRegTxHash": "56dd64ac3f859f4d31dde417bc45e3b71b59c6cdc7b5f7d5ee5b81ddd175fc8c", "confirmedHash": "65743b27df20ce4631ce8b80eb99e5603a082be2fda34f862300000000000000", "service": "00000000000000000000ffff68ed84b6", "pubKeyOperator": "1799536a478cfb23d2c51d6d0d8f5f041458e2ca0c8703c7cef466a9bcb7df7e167ae9071e16783b51d1456e2e594473", "votingAddress": "2UAs64SQ5wBZY4pKsuFgybTSAUHj", "isValid": true},{"proRegTxHash": "ce85832288d98c09706496ce69e5c39fd8bb3596764365ee0bfe02ea7c0596a9", "confirmedHash": "11a2ef62763e686c1298ed9d14fc43dd7725a1fb08fafb7f0a00000000000000", "service": "00000000000000000000ffffb23ed774", "pubKeyOperator": "82753af03f0f2914b4f5a3310cf0cd5e214cffeeee32b1b710c2183aec65dc707402726df2586536c7c92a5ad8c74326", "votingAddress": "kgC7s9ybjkHc8z76BULKPYn2ZDa", "isValid": true},{"proRegTxHash": "9386d636007261eb5e3b843c5a9ba9e1058d7298f59c0c4bd3e0848f60e8d700", "confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", "service": "00000000000000000000ffff689cede3", "pubKeyOperator": "865df578987b162bb9d55aa5dfa624a01bfe04ebe1118f4412365b845100505e888683cfb62c8a861fad94b5fceab7e2", "votingAddress": "o6F4596mZaUUXfir41vNZg19V12", "isValid": true},{"proRegTxHash": "aa1e631be3172af168b1dfebaba7b74b34cc007ca8d826acc095c7fd72bdfb36", "confirmedHash": "d8d036844fc3622c19e6d51c1cc824dfcf46d5160bbb753e2100000000000000", "service": "00000000000000000000ffff88f31dca", "pubKeyOperator": "06c3278cc13d1070656b04391fd16b681c5efb47262ede65115bd92f42e81807808d4643bbe9d685a3342573ef023a75", "votingAddress": "3m5Q97aogCvJXR1dqhdRzHaEmGtJ", "isValid": true},{"proRegTxHash": "b9570be492ff0d87e02f12c74f75b75d5ed68e28fc04d10264d38ad090c981b4", "confirmedHash": "f95d58e237f90d5bf906336283b059e02687a467f1ce27b71a00000000000000", "service": "00000000000000000000ffff41153539", "pubKeyOperator": "823602f80d5068f5bb47e1211e25769755fe939b2949c928444d7fcc8d6406f32989d471a4e2e70581a75b2f1b392767", "votingAddress": "238WWs78ehiQeKoBwWjvB167Ghmo", "isValid": false},{"proRegTxHash": "006bbb3833ae0082d5b6ebb3f17243de72a4057b575cd03f3b028bddd473faf3", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0a7", "pubKeyOperator": "12d8c5be6a14f3072140b54372af8a70ee9eab1436a10e9005bbe7ed1e4ee291aa5fa42c39fe617983fed10085058467", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "c369284bfa8960a2d5c16d7fac0ee11733d64bc1080232da6ec4d18ee608fa9b", "confirmedHash": "d541d866dd91ecb430137a5fbf4fa1063fd35a067378fca72000000000000000", "service": "00000000000000000000ffff03d347a9", "pubKeyOperator": "9156ab0117f3fdeedd03e28cffd6dcb755cd7b954b146105268784c9976279512a46828637bbe449fb2abfcdfc498e2a", "votingAddress": "4MSh8oR4oDQmB5tMqrkF7oP5Zbuf", "isValid": true},{"proRegTxHash": "bcf63cfabe5040858787f97acd905f7fca73be61898cb6a36a004783430e74be", "confirmedHash": "387677af545adf37b53f7dec719639b8e136f901525645322c00000000000000", "service": "00000000000000000000ffff87b53229", "pubKeyOperator": "191a2e7e564fe218dc410a01581d0a8ce057da5e0e6ccde7e5c52c46b8951c557a68661d5eac7b5f384c3c96ab369a49", "votingAddress": "23dVHtf4QPxSqnm5Asiw1Ros8k1T", "isValid": true},{"proRegTxHash": "60cac414f2aacce1912e1565b9fc6d56e040634cf624dc322fa0bd4b884d0450", "confirmedHash": "21dfed1196950ed8722263b78717136479562260dc535f4e2e00000000000000", "service": "00000000000000000000ffff52c40b8c", "pubKeyOperator": "87fc2ad7d676541c1ad5ebc34833dcaf0f8cf1f2b2756aa59a912456c50b92c9501d58760c41047744cbf6f20126051d", "votingAddress": "vafQqysRUjAgo2U4FyvAmDVU8pD", "isValid": true},{"proRegTxHash": "9babe0481a7d6be6a56b9260a668b5189950b05d3fa49e01a3c4e344e301fbd8", "confirmedHash": "2828f9560b0a085b43e5d45d26966358393a3c5cf1be8c010600000000000000", "service": "00000000000000000000ffffb951a7a3", "pubKeyOperator": "96356f33205c9162f29d2e57f1de1edd13962f3558a105b97fc805774299d4e3f2a1ee65ed0cc351d99dff524770a75b", "votingAddress": "2nNMPRcDSrKvu9WMXRuHx5arRtp1", "isValid": true},{"proRegTxHash": "42a5f1076d8cc03b126da5126e660776960096f1f39ea20749ef704c1ab9cf68", "confirmedHash": "343603bafc9398885bfeafc55b1f02286a6b5b28894b89171500000000000000", "service": "00000000000000000000ffffbc28b6c1", "pubKeyOperator": "9101b9f4c6c6c76c0996ad0826f1124d12301e5a0b3216ff93a76327c16362d644fe6e01bffa8b2b37cb980ee894b70c", "votingAddress": "6vUsuMouxZ1TGT8ZNsLJAbr3oCj", "isValid": true},{"proRegTxHash": "957cfdacbfd9024396fa429d704f43ddea25427589c36203b16d540400c42062", "confirmedHash": "fd9e4c4e00d0406bf847d4e122a27fad240db204ea2149211800000000000000", "service": "00000000000000000000ffff9fdf3df2", "pubKeyOperator": "095dabbe6572c5b3b4d5d595506afd871647c6410db9c6259f931f86c0f247cf6ac1552f8626ce6f8f1e30b58c61f731", "votingAddress": "2xE18R5RKjJrYdjiYfGkRPn4MhK1", "isValid": true},{"proRegTxHash": "ac7082cdcfce171e027fd52fc0d3b750e5298b36514a330cd287fa3170d2c076", "confirmedHash": "3cccd6882d6b559b7fb2cd5c906d754ee1cc391c0c699be22000000000000000", "service": "00000000000000000000ffff2d55752b", "pubKeyOperator": "13ac7aac117b86a492afae9fdc430dc2f47824e529039159a15ad580cf610eb564783e1c9f7cbc22b3816e518c6291af", "votingAddress": "iYMVLUPck5YnqnTJxmVUz5S9jcu", "isValid": true},{"proRegTxHash": "310e0a4e84a5f61f95f922e4ed805c030c2157761df520f82eab02deaebafd6c", "confirmedHash": "c58971671ff2e5b2629c64cf449fb208b7215008b0a2aede0a00000000000000", "service": "00000000000000000000ffff52d31529", "pubKeyOperator": "8d2c65e0f5ebb43978706a51a6fe37248a6fa866bf4bb8c848393ff722157724746cff578847273f9c2d658692088695", "votingAddress": "3LeTWLdV4jqisnUsYp144sxbZ3fL", "isValid": true},{"proRegTxHash": "19f5b9c1a969c9804ce0b8b651c115bdd7b2e86fd26524723540a15b8e783eed", "confirmedHash": "a4da8060d9ff639f8f5826e8dca765032e9825879da82d5f0d00000000000000", "service": "00000000000000000000ffff2cc4b7db", "pubKeyOperator": "0ca1dca95b134471db1929e0cd2f93f065885ca008a690039f34f358ef8b5e28c65fe1839546e5ad78dad3d7aecfb30b", "votingAddress": "9e59G3ttFEdeAHzowCNeAxk7HjJ", "isValid": true},{"proRegTxHash": "5d2b13510c802bb64b71223463a8f63ccb143a48d711aced0920c0fddcb20850", "confirmedHash": "a7ac6a808dc69a25e873cdeaaab5129b4b1dba7a1e89a3db0500000000000000", "service": "00000000000000000000ffff23ad9b2b", "pubKeyOperator": "0b5ed2fc7f727a875bab7339ac571b0857e75806577b8de56b643e461b9837d49d32d68ef1d0678a4a498c4625c3311b", "votingAddress": "PoFDuGaq9GfDyxqeQH5iq5Sf4HK", "isValid": true},{"proRegTxHash": "6c8fd279b395507673965c1f4ddfa33ec8df2bee3152b87d079ba95564e84740", "confirmedHash": "3b1f89f7978fe02771144efa76b4453ff9168f091631055e2200000000000000", "service": "00000000000000000000ffffc2c37423", "pubKeyOperator": "08ad73bdf32eee8335d0e960e68c924a14c04cd13a07f61f8fd878d4b0c87bc560a239af342c50416d1e0bded2eff300", "votingAddress": "2ts1eAKfifUMzhiZcsjwrZdAQp2k", "isValid": true},{"proRegTxHash": "5ac62dc18afb115331d8305d70e03f2ba1f18fa3441c307bb4dbfae710130ad3", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6e4a0", "pubKeyOperator": "8b9cb9a0e6489eb2e282a580e44e6573461dd0eb410ffe4eacc382ebdc010f72fd13bb66a30afa90340750129cf75ff8", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "b252cb35a8f133a6019ad25f655ca7a092862e3a4fc23b41200d60eada73f79c", "confirmedHash": "f475109160142b7a3c9e88937ee42dddd0daeaf15eea728c1b00000000000000", "service": "00000000000000000000ffff5b849234", "pubKeyOperator": "0a01423925a83985f216542b8af424de7af819ef7afa2dafa81b2ab03e7ce16d9b072997451a67605848f03ce3400bfb", "votingAddress": "41BreyfFQDQkYrnhRb7eweXhRAoY", "isValid": true},{"proRegTxHash": "b917552cf4f459d3299176d1da75e091eb3c158aca9b9581afa2363b6311a7a3", "confirmedHash": "970eccec7c36eaae36d4c7d9486bb43a7021267b1ccd22123300000000000000", "service": "00000000000000000000ffff12d9ec3f", "pubKeyOperator": "8c2f35ee7299492d71386e452ca4079fe5f13b3937afe1ffa4263e52432dfe852ec60a3863cd475b52fc19fdc48656d2", "votingAddress": "iiD11HC1LiUgiqvmVJytbyVHRX2", "isValid": false},{"proRegTxHash": "ded4de2df12ccd687f63ade1ad21d16108b08b83875476ae59b47b98b4ef9f55", "confirmedHash": "b04a67d17dffc06f56abc567dc62ea7098b3fe1e9110b9000600000000000000", "service": "00000000000000000000ffffb23e95a1", "pubKeyOperator": "098c388a5f354f52eac658dd37d3acbf8246d1bb91830036b8184bb843817d2c8eec62146d37f007e8e2d947a5aafbc4", "votingAddress": "eHYfuK1nM87CqDYWrTtrZaNPngD", "isValid": true},{"proRegTxHash": "3270574fc8a5b8b8d9fa854ddf0e85017fdd1e6e731357fac1a75d9f541dc1ec", "confirmedHash": "201717f8fa6df443e3658fba8c41565fab0fd68ecbc97ba51500000000000000", "service": "00000000000000000000ffff68c818c4", "pubKeyOperator": "0e3bbb9d03379d5505d06bce036d084ea6bf3e8805ba68e240233b9b24d4ed3bc2ebc0afb07d959cd8d6ca842a4df158", "votingAddress": "3YeMszhLS9uXX2UddfEXwrf2gX9A", "isValid": true},{"proRegTxHash": "7ad6f9f58d16bc705c63fe27876f6ef5b461f9817264c149b8923281562fa021", "confirmedHash": "75a4ff971de6e0ec1f1ff63b10ad711467e1a19f7e64f5590100000000000000", "service": "00000000000000000000ffffd4186eb9", "pubKeyOperator": "17aee628a4e6baa6f7080d6a29f9f54a69708dfd19c25ae12438f35a0979f6c18e763474aa5b70987540f30e15184170", "votingAddress": "dngFwac3cxB77rmfRiJv5QKnvKT", "isValid": false},{"proRegTxHash": "027b157e53ebed53a59f3d0caa054cbea35302ef975cfd289cea4e4e15991a78", "confirmedHash": "93bbb8d553fa3ba25eda0bee1885488151949757b830f33c0600000000000000", "service": "00000000000000000000ffff2d4f2e47", "pubKeyOperator": "0d36cd1b487f82ff30d8fbdb545ed393dbb954f365bd2b3ea9fa1b0dc47b29e1f132d89379b5c275400973a6d98d19d5", "votingAddress": "3irb8eHFreWhHijWahJV9RCGxF5s", "isValid": true},{"proRegTxHash": "286ba669f0a6603053eac9f27621789512890a644e32f41e88c1c83c321d9690", "confirmedHash": "24de7b01e4ef1e9d941f1b1c2f895102b99b37fe9376e8d72a00000000000000", "service": "00000000000000000000ffff6c3dbe7c", "pubKeyOperator": "84818cf01dfa27ed02572f02acf837bce264fa15aa38a19c1081468315f969e5ef424ea03ee30eca6537a78c587983fc", "votingAddress": "qbzX1NXUfLaJP2kZcbCVMjLgpg8", "isValid": true},{"proRegTxHash": "b94a3a64df26f1a4761e65d53f2f47d97850d071b580590648734ca4786f0065", "confirmedHash": "5c66aa7c35e0357a60d0dea3eb21bf370725bbe8799a1d700200000000000000", "service": "00000000000000000000ffff86d1f781", "pubKeyOperator": "82be1e77cff2e5eb2614b9671df476601368c07257ab431fd12e0431ea1b1ef24f2406d0744e016c0f335d49d85a40b3", "votingAddress": "ZMTFuhtYTCTMu6vx94Th9oVK8m4", "isValid": true},{"proRegTxHash": "4e7b946a7819e2f1120afdcbeea95ba284f92af0fffa1ef0621c5fed5b36bb14", "confirmedHash": "3fbbcf9fb8e39060278db4d494d4aafce586cea0f3a180db2a00000000000000", "service": "00000000000000000000ffff03e25984", "pubKeyOperator": "8c145e948de285649a01184aa2690bdb8640761fd0eb64bcd2862d39933233175212b750957d04754e63bbac070da222", "votingAddress": "rDQK7dyT8E9xsqRqiCdCtjJwqny", "isValid": true},{"proRegTxHash": "eb47790f8c248e1c794cc29649f5a7d022f60a4cbdc08da2a9c7035f86e403ad", "confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", "service": "00000000000000000000ffff453d6bd5", "pubKeyOperator": "08693aaa528e5d7fd07da8356a2fcf95b233d193663596437ea730c147eee40a52af4571064a3a3ad3b337be5d33ace1", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "4b97b902ab67654e956cbcdd58e49ca6fe5d441d638abf05008232a011275b6d", "confirmedHash": "54b1326c6bc695a1b6fa4ed28960e001b84e8d0dfa70ef740f00000000000000", "service": "00000000000000000000ffff52d319d0", "pubKeyOperator": "10068f152fbb1cce0092ea35083e27ceedc5a25c3a0095a9bd279e3b396bc1df9323a45fef2c08a34a6a9ffa9b4a160d", "votingAddress": "4EtTDHZELMhwQwjMgcwXc3RXZccB", "isValid": true},{"proRegTxHash": "169c19876cb44fa9b2550140d485c9cbeabaf5fd1783f26b46224891f1d5237f", "confirmedHash": "980af5e950dce6c87657a8d459aedfcdf087e395370552491400000000000000", "service": "00000000000000000000ffff8b3b165f", "pubKeyOperator": "0112e706a68f8eeb72617366b7ba7bf26bda65cde6c9ca7ff2a43a458e468a01a3cf86be865c74419f3b3d3253b78b37", "votingAddress": "2smmiiNMQhY9zTmH5gQFZCQvnVBz", "isValid": true},{"proRegTxHash": "56583b3cbca2a1177351ead45c7ee623d5b8f4eab37d34d7799d03356f7b98d5", "confirmedHash": "08d83331ceaf20ac921fe42c759e6f027888a0eeff7865991300000000000000", "service": "00000000000000000000ffff688386b7", "pubKeyOperator": "8b87e8cbcefe0b5ca633bde11f0c0d7cd2215321758cf43595feb529428489eda20bf804a40bb2dfda82abe654d936b4", "votingAddress": "4PV6aVMBekzu4qLTUenZuYgjpEb9", "isValid": false},{"proRegTxHash": "ddd2d9e25abdeaa42cf15016b7eb060a9aa5ffbbc83d59001a07bce23731d60f", "confirmedHash": "0e565913d3fa361efc3688f508f93b30f3f489202d8f183c0f00000000000000", "service": "00000000000000000000ffffbc28b242", "pubKeyOperator": "96ed97caf750564962f5a847a877c9a01ebbba36ec0f4483a953e8ee5d44a5776cddcfba3d3ca3608ae549bd9ebf6845", "votingAddress": "4WTVCeFoWrVCb2Qz2ps2UoBG6VP8", "isValid": true},{"proRegTxHash": "a005dbf4898121924b9e43348d731ca8e638155ffd60d1e8aed7141944860136", "confirmedHash": "297a7c380c04c5e08b3955f569779e4574c50efc96b9d7d51800000000000000", "service": "00000000000000000000ffffd4186e80", "pubKeyOperator": "138e5f79e82fdebbb194bf87a43093330f628beb4211d35d217e2f745df3c33b9684bca2374b8a16b7cb963827841fbb", "votingAddress": "2SZGEUcFRCX4PS9EMN53BxPbjwTe", "isValid": true},{"proRegTxHash": "cc3d09c62cd2ccaab8812e279c865c41f95ee0d46afa1cae8dbe50bc7cae1c66", "confirmedHash": "89824dda0433a95431b122b47a28ead691fa51c6398091300d00000000000000", "service": "00000000000000000000ffff80c775f5", "pubKeyOperator": "8b65028f0c2f14b3fb6d716a3d4e5e7c05d38fe39bcc45a9e255c6b57d487c969ebcd003bf7691db9fd999f1d821fbfc", "votingAddress": "23KuPmnCnET8qztSVXihjUszgfFJ", "isValid": true},{"proRegTxHash": "56e6bb0d819c9fd6366353ae7a9beb4413936d1a8f083a418f1674df4c4ef706", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffff80c7716b", "pubKeyOperator": "17060f42bd45bd22f0987c9a9ea4ba27d5ee9e290b4839eec76e30f61058020201dff07ba599004f8f9c6f95db761d41", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "e67682b83861161e919e7541fd901cb2bf229cd076966a78e9f041264083cb6a", "confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", "service": "00000000000000000000ffffa8773e5a", "pubKeyOperator": "13dc8ce848d91bb7f7deefd982752b6ca76bf20b442dcb30635cbbb6258a232e0c8c241e8c90e81f426b2544c13158a3", "votingAddress": "iN17jb2drZgaLaWTzhLm9boWNdS", "isValid": false},{"proRegTxHash": "a5861be49e05ff88c1824bc3aded1f56b9cdbd17025bc10c48e68dba86b5c46f", "confirmedHash": "ce4373a8a04c4f0097c7f66a6d99078b17229a1b695f546d0200000000000000", "service": "00000000000000000000ffff55d1f1b4", "pubKeyOperator": "065b8e2356a635908075f2d0a973c005a5428327eb30cc39f87e5d0b500471f8eb40a42156b5d6ebe9b4c87b452ee21a", "votingAddress": "2zZDvMAkAUUUe7dzRRmaGFC8XBAF", "isValid": true},{"proRegTxHash": "c8faebac6471123aaa9da79f5f98e1d2b356758744b356bbd861686afa34a0a2", "confirmedHash": "16eb954260162f93d136261303efdb1c9b124dc2d18c1c3b0300000000000000", "service": "00000000000000000000ffff14d02a9b", "pubKeyOperator": "8bc8e915933fb920ed9fdb8385688134ce74bc6de3f9e86b576edcbb7acb11c2da5a186a36c5edeac0f065fda8f36d02", "votingAddress": "2aeQCoFQvoSyDBnfacr7CJqjP78m", "isValid": true},{"proRegTxHash": "417a8fd828e8cc3066ea0740e66280159ec333dab6cf32029bc4c0309c4b73bd", "confirmedHash": "772f3d1556b293194f3898274545b9a9a2f1271fd6cd5b630700000000000000", "service": "00000000000000000000ffff55d1f179", "pubKeyOperator": "83f5edb88d2ca16a2717d354482604d7717758151e57365f56194d3e13b91aa07795d589ca314ccf2c5b20680ea0deba", "votingAddress": "3tAf9ZLitYxP2W9MQrbV9ZBgGtBT", "isValid": false},{"proRegTxHash": "695cd376989e9e09197b0ca1517e2220684991b3bb342d8af93fc622d9e988de", "confirmedHash": "d270dadbec554c402e3431a8209591971b1dae1351d857f30700000000000000", "service": "00000000000000000000ffffb23eab39", "pubKeyOperator": "16154ece2ef98c16a49cbfda2071ac663ec2cd9989505a4530dda0c2b338d2c02cbfb2200b72afbf1838baa2d6c0d582", "votingAddress": "4Ut9RT9YVoR8AiocYw3cDh2gnNS9", "isValid": true},{"proRegTxHash": "b5a6e7adc57620b8aa7f501d2d13ae7a4901df1f71e763f4662f72d1b965d3c0", "confirmedHash": "2d80f08d00f69d649ff6e05cf1046ad2ef35b598e7c8c2840200000000000000", "service": "00000000000000000000ffff32740244", "pubKeyOperator": "0f5949e8d4a92e27762486377abd7866eb0907087fcd4c668629c4fc66a27c2f425c909c547bfb14a43a783de6db2391", "votingAddress": "5K8yLogmnNQBjd9YM22jL9CvxpC", "isValid": true},{"proRegTxHash": "b7f46354854484552ce04a14f961428b968977d67508e984ac8fc2e77b3cf066", "confirmedHash": "08ceb54133eb59d824cb8faa2a8b3e0893830156e53ed4620900000000000000", "service": "00000000000000000000ffff8b3b4f87", "pubKeyOperator": "98dc7fe8e2f138ceb08bf0833c02bb1c7a5d28b6c36ed33b6f586133629d6c4fc7d6cd656233c712325b99da0b4d7dfa", "votingAddress": "3Qb9QEAVU8dnRBWEhHY3mf4QWsAf", "isValid": true},{"proRegTxHash": "1433610c017f343277ca99da9b6946d03bf1f5a0ae61305787be7b075ecbc2a1", "confirmedHash": "3d60e8706565118e284dbcb1a219a32b00478ca9cb5dc52d0f00000000000000", "service": "00000000000000000000ffffa516e946", "pubKeyOperator": "0f632192b8c313743474a20ba23c22d4b93c69b38090bf43ba1571651f4ab5eb0842341ae14a33aed5a66814863ee725", "votingAddress": "op6o4vVRffrJL8zCDdGwKyzPQQB", "isValid": true},{"proRegTxHash": "d3fff1ed4711e3192562fd385b64ce1fe84c346260fde8c5c5511c3b1ec66e40", "confirmedHash": "f108569a85b2b9d5b783cd92cfd2907448495a20899302ab0600000000000000", "service": "00000000000000000000ffff4f8fbc79", "pubKeyOperator": "0797e6a99362c379c95b77f69ba2ce8a460aa1069301e40c7a562e3323b68529fd056e60f3c5eb2e960e5d4b85b2b6d3", "votingAddress": "R4TyWVY9tT9f6HaHZrfcwvXWAbi", "isValid": true},{"proRegTxHash": "4766f8119ac209c337ddc15c49ce541868cfa942a35a9a40d0d83769ccda634e", "confirmedHash": "2245df7bc198f12e4914dc8ea3cd9908a4c86aed7fcaeadf1600000000000000", "service": "00000000000000000000ffffb2806ba6", "pubKeyOperator": "08ff9920aa7391cf47e0a1a816ab4c67e037a5d448d2cf28b4d8c7c4008c459eadbe5134f7176804046521ec0b49341e", "votingAddress": "4X6inihYM1F2fDSAGTphcLFW6tBb", "isValid": true},{"proRegTxHash": "1c230c6e945f8477968c09c36088951274b1e29a602a0a03ec5437d989060b34", "confirmedHash": "3bfebb11f7c1f49fbedfa5eba3669111628f897ac5a397672400000000000000", "service": "00000000000000000000ffffd41863d3", "pubKeyOperator": "91acac9cfe17c21769742ccd1dd3ef72e22b287cf4d4982abf956cc314cf34839f424fb5a8e48caa98731f581ead5b3c", "votingAddress": "4QdBxrRfUaQ5TtAeWMnzgDpY1Kw3", "isValid": true},{"proRegTxHash": "84eec51050956e972cb888545450d18dab7c0c480a3a0ec3505b32ae755834df", "confirmedHash": "90d0ca5bc6ac856b927c07f754ef3f846d1aa4ee28ddba251a00000000000000", "service": "00000000000000000000ffffb280744d", "pubKeyOperator": "16314c5dbd7b305dc1776587c1300736afe93462578321c6960bd42117e6d3e5b8d56f2e0b08312428cb9f8698ad26f5", "votingAddress": "4Z91gZKEWuSXTPUQds7HP6DQHJ6K", "isValid": false},{"proRegTxHash": "075fcdd4c0ffbe393ca1d2e98f5486fdf65df04e4cfdcbb2c9a894cf0d76dece", "confirmedHash": "3901399ff21548ac6181e4147e08594e63bc410a472570050800000000000000", "service": "00000000000000000000ffff52d31942", "pubKeyOperator": "98656ff1ffb118fe64114628aae464cbee7904150aaab906e1538bad8213c88a3f7388a060e0204f19a0bea32b4bd243", "votingAddress": "3oskV8uSrpFm193cLxWsPpqkK4vr", "isValid": true},{"proRegTxHash": "3e936c7ed59ef226dd049c75cdc9256771080fbc4b20ba64b7ba1224755982fd", "confirmedHash": "a72879e817682cece2e019f2360d2a451aa648628ca620e51700000000000000", "service": "00000000000000000000ffff592fa651", "pubKeyOperator": "920215fc2de496055cb000274ba807e55856f0ce30b45b3a6828d0db84e326ed356efbc82f339707b42e3977688d0c9d", "votingAddress": "3TgLWFbpivzmTzmjwfbMHXCZAMm7", "isValid": false},{"proRegTxHash": "7c360e180505002c6316b94493abdde4075e5febbaab7c1d557e42e582abaa52", "confirmedHash": "fe0847fb25a6602c6ca1519d7ff37847993640020f91660a2000000000000000", "service": "00000000000000000000ffff17e3a317", "pubKeyOperator": "0b2ccf81348c6e6976ee595fb3041297f4db9c63d1e0180d5ee9268a7f8b7d2ae28108c7a7586da530b27c7a25c1ce4a", "votingAddress": "4W4HC9aakmjjwUJDm6En3tmMUWtK", "isValid": false},{"proRegTxHash": "31331ee3ff169b420700b6188f43ec7bf28fe7280861d6fa2252fe10e97406a5", "confirmedHash": "9129c82a932fff630ff46a80cf992a6097a450221aecf4720100000000000000", "service": "00000000000000000000ffff55d1f228", "pubKeyOperator": "142b110f767094403169c1abb1502b85e8cfcd0c8a71110b7ce05fa832f8dea88a37d008c53b6374a7d4852dd9b5ae81", "votingAddress": "3pZQfYuFDdxyBqLV94BgQeAa63L3", "isValid": true},{"proRegTxHash": "3b3a49788a0459c297d53b10b131e94fe0749097cf01c176426b9a3029e5ee16", "confirmedHash": "8f1364d8ab2ac8f3197a6a8f58366e32649be6c2e594bf2b0500000000000000", "service": "00000000000000000000ffff58630b11", "pubKeyOperator": "81cb0f34d9ecdcfa8036ee9d59c3631820742c04fde6fa4106fe025d2a5fa771665f4e908b3a67f3a53691099268495c", "votingAddress": "iEGKvgNG3eyUR2i9r8oZ2Em261K", "isValid": true},{"proRegTxHash": "26c5e6df729bbecede45438e73e1e113e1b701323fb7d7e2f69a1261bcce646b", "confirmedHash": "2cc119854cb51f755274d6aca2c6c3f6578c8db48abfc1821100000000000000", "service": "00000000000000000000ffffbce29932", "pubKeyOperator": "08cf33b2c3e1e7c974cf0ed4248f645d97df22144d3b0bcf375d7857c95d429c3b6bfe01568cd7983847767fb3a47ef9", "votingAddress": "2yGHhyfTw1g1NrG6MgWemoaax745", "isValid": true},{"proRegTxHash": "808ef8607b51c250e7650cd7823cea6bff1e4d6228094bbbb63838f7a23e44c0", "confirmedHash": "10c7777e0cf6e800667f4aa17e85a7ce8720facc6b91ae071400000000000000", "service": "00000000000000000000ffff52d31587", "pubKeyOperator": "141d662ba01691ab25332200f2f3a32223c7cbe2404b466968004ef176f59f7ee462cd908f6b5d2924fe73aa65cbe8f1", "votingAddress": "49VEtkXvMUeP7iDSipPndx3Z23hx", "isValid": true},{"proRegTxHash": "3a95f4d00f7747f67cf0754032546bd32665c7d738a7d4ef37a9f5f58940627e", "confirmedHash": "b9e9efa20b0b195d420b99a4c9b78362efad266cd73a86810f00000000000000", "service": "00000000000000000000ffff5fd97d69", "pubKeyOperator": "06f100f6b16e642c29c16c28217cdb08bd34e6ece955486b87b4c34f51eda2c3f46d2b9691fb415a22e518eb842181f6", "votingAddress": "4GN32AVhCZSeF6Pk5EZZP3Ke3fS8", "isValid": true},{"proRegTxHash": "dc6323e5065adc29ec32260cecb0d65f10e7cdca52b276761c39adebffe9548c", "confirmedHash": "3aab4c873be808354754f9f3b3acc20ea36bb91e3297c87a0000000000000000", "service": "00000000000000000000ffff8ecacd5f", "pubKeyOperator": "186915bd82a97bb01c521b24182110e9a59eb22db03428afba7ebb36a0d0ff338283aa41fc6655cc7d1374ea565fe8cf", "votingAddress": "3bgdD6NMQ4a8LK7f9fAYwi39bHoq", "isValid": true},{"proRegTxHash": "6ac9ef2fdec5ce00b361bc8e8d5c7f71eb6cd34ae36ff3f9f4b2e05513a24b56", "confirmedHash": "833c825648b6fd05affb43296a44f07843188c10dbeb77770e00000000000000", "service": "00000000000000000000ffff87b50fec", "pubKeyOperator": "16457be150622cc9fc4058faaf96e1207693f05b2498197804355c7c7bb426b9dc5786392d6265f3b406d5567d374227", "votingAddress": "2w7ozffMnfte2aVf3McJJ4F7qXRc", "isValid": true},{"proRegTxHash": "965d4b2587378ad6c399a483dea6e333e6f01d05d4635921518943556dbe0d84", "confirmedHash": "cf632082a1ca1ded8a7e946fa5ea5c76dd8213f33bed27e30f00000000000000", "service": "00000000000000000000ffff5fd947c4", "pubKeyOperator": "0ef62bad0b0f6711d40eaad7289c710b45b280ccca734218f01bdd9d890b6bb4f0e37d45a9fbce453a64bb8af15df6d6", "votingAddress": "3Za4vaescentazr3dTwwSz43LaSG", "isValid": true},{"proRegTxHash": "dff99e8316c4dd40e498e7f1d7c48452598adca2a58e494952ce48d08e700975", "confirmedHash": "cf632082a1ca1ded8a7e946fa5ea5c76dd8213f33bed27e30f00000000000000", "service": "00000000000000000000ffffbc28be34", "pubKeyOperator": "15676776334c1715632b3004247804dca135addadc304b546a3b4e23446a835e5739e9c8fec0b6e525330dc94057835a", "votingAddress": "2zKK5XrktAfx1AKQKLhXJHATevTS", "isValid": true},{"proRegTxHash": "637580bde0312a4b8d930e0398072d400bd7ee7314295bf318081cc2eb4c6458", "confirmedHash": "74eeef8df9323115d4c6150616ff4f8836bb3cd60809df920f00000000000000", "service": "00000000000000000000ffff55d1f1cd", "pubKeyOperator": "015ef78d18f60e816e77316dd096c1f23d2081fcbac9a14c0cbb47f6a8afdaa5dd6d99820bd154db0d3fdcbe7d94c141", "votingAddress": "2BF4wtUQH1pHccuQBGpfWGYRePcN", "isValid": true},{"proRegTxHash": "ba20f593953ec40555aeb9e71d68fb7987f45d1792e329af6a1e9b4180bcab3e", "confirmedHash": "3812a8b97590c43189bbfbfd317ff0b9344fc015fc9d6b091100000000000000", "service": "00000000000000000000ffffa5165c5f", "pubKeyOperator": "0fd51e63c642d820b0f997dfa6c0d36cf7fb32b15be030844ec3bad492c497c017b25930f09185a60893dc633d95554e", "votingAddress": "3CGVb65DPMFLKfbgwJuCGavUAmwQ", "isValid": true},{"proRegTxHash": "122ada4c84909e37eabda85e311c5ed71b83b24b736461bc8f444307144d8b11", "confirmedHash": "4ea289843f970dd4bd810fbd9e2a221e64a302721397208e2000000000000000", "service": "00000000000000000000ffffc28755c2", "pubKeyOperator": "88ccde570a9ea7e025b050f5286aa8291279f0f4b2e2c9e0b1f3d6529ad5e26f18ff1e2a56c6a621fb0fd272f1359d8d", "votingAddress": "2vcoRbEUR2kxJpoYuny5Sm8LDPEF", "isValid": true},{"proRegTxHash": "6e7ef7f5c0bb58f991fd325686afd643c3ec0ed7d4224171c6a81c89e65de515", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffff80c75fa0", "pubKeyOperator": "098d39575c70d571d926e5726adb08af99bab833c7210d198c02a42f2f9bc7200ee930db27385fdafe886c3af5982087", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "5eeedb46ce5efbd17b00a67199aaf359a9fbd619eb14d2e5aedd9b617a6b41bb", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d521fe", "pubKeyOperator": "0967f1121f51fc39aafcae775c86ccc69a483d84b2b6d23f8b2f0337c25d12c303b4b83099ed0da8744c3683efb2abe0", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "b25530bd916c1ae0d08d784fb5dcf2a51b0029f1be1915ee62d38138c6451d1e", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9e656f89", "pubKeyOperator": "1484a9f27b3916995b986e261d597a243a27b90b129682d20a5f4c5865d42cf431214d8b3d185271c54f25bbc7cfb874", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "0e598443f42e6cbce3a83665ce02a31930c75aedb8dbe37391376e9b7e0c0db9", "confirmedHash": "303dba0a3629e1e3012386c30feb876aef34c3d4bb4e52b61000000000000000", "service": "00000000000000000000ffffbc28e713", "pubKeyOperator": "07f24a32519fa1c806fe3e65844f6ba12da482dda4515e54bd7d5e69f60c5bdfca345ead350b47f833ca31031d13a437", "votingAddress": "YFY3bzdvnyhRUEsWAWLjx7eAjQH", "isValid": true},{"proRegTxHash": "db8087e3968bdc2595bd0e285f23dc072c9520b0fb2edf09782d9bfa40820c60", "confirmedHash": "8e0fb9cddd12fc84c7a3c699d545450fa85153d16c5934672200000000000000", "service": "00000000000000000000ffffb23f7980", "pubKeyOperator": "84134dedbd138f7cf498f664dabf26db61fdf6cba819a802d9e071ba194bda24df4ef33d754a2c812cfd47428b89225e", "votingAddress": "3m8CQWYEVVAhv1nrwjX5Wt6nBFsn", "isValid": true},{"proRegTxHash": "03d23740f993ec471efac548d9bad30c360e239fef526124a10d922f547cd90b", "confirmedHash": "49b7e5b723d639163880c859dd9f078e59a8073424fdb6f20100000000000000", "service": "00000000000000000000ffff52d31914", "pubKeyOperator": "04713054fb14b3815a39e194c497fd21a0caf4725ad561e5124735a0a5aabaf64a1d059da0697040282a3f6d5d4226f1", "votingAddress": "2bvSxBL2LYPRZf7jec7hR4jKJn5V", "isValid": true},{"proRegTxHash": "76d1c62ec4a2f49c5ee79774c3b7f90ce293a23696358b18938395833c133049", "confirmedHash": "a1c4e4958182fbba80b3177bca14b06996e592fc29d32d414100000000000000", "service": "00000000000000000000ffff52d31915", "pubKeyOperator": "99e62339847d6d36b0eee5ffb927f1660debdedbaa9ae0ad6b748159c91436ea5a5da6c75900b2e96304b5c10168dded", "votingAddress": "4BjzHsrUicdqyLtfB4eCDNStXqG6", "isValid": true},{"proRegTxHash": "6acaf0a24ecfe53c0959f85b8fe46948a88e57e2bcaaa82c175cf16475bcd962", "confirmedHash": "3961dfafd0cade31fd364e56c124da7272f3e451186353aa2700000000000000", "service": "00000000000000000000ffff80c71363", "pubKeyOperator": "19e73d954d34567950b5d35f3e28f52a395d69dd34cbfaa9c0d8d51f6c2a749bba5597b9bb6b9c40291b6394578f6636", "votingAddress": "NQgXntiAhQWCY2wPynXuvJ4MniE", "isValid": true},{"proRegTxHash": "b2d0f5ec73e3328a65a61f012219da83a36d2ef000d46be8977567d2eef56b62", "confirmedHash": "0db86003e7b91e3b54ae01aa7c3824aef4a41cd82675e6921600000000000000", "service": "00000000000000000000ffff2d56a299", "pubKeyOperator": "09573d20a655148a4bc3c02e1fc83769b187b5d8d4bb1ccf23ae0610d610ecd18d650144a7d96518b9ab7f9167865de4", "votingAddress": "3FTzLd3V1Upokzu1EjMFoxjyr7Aw", "isValid": true},{"proRegTxHash": "45a3c62974a712c12011d0ccd008cded066e18574242d7f450901e7387787024", "confirmedHash": "c4f9c0612247f0ab1f0b5950a61aede0f4a65047c399924b1600000000000000", "service": "00000000000000000000ffff9f59a508", "pubKeyOperator": "16aae8c5cebbc2110668bcb21d63e2f3ddcfdc78c5e9a31f7e7f10c20d2e4c7fd59ceb139a9903a88d6639711faec849", "votingAddress": "26H8TFuxsXSu2drxBP8TjwQ4RZEa", "isValid": false},{"proRegTxHash": "6759a77298985fe77097ccb0ea2a97c75864c285d13cfb68e4d4145897f7286b", "confirmedHash": "8f69b3f5f45b3f2c0fd8e8cd663e7d430f4c98da4b1cbeeb0d00000000000000", "service": "00000000000000000000ffff8a445444", "pubKeyOperator": "097fef72eb75c48c03d0915d77babe347f2b391b4a3d32b927ebf1cb9006d0633a1d28201948d6d7e04cd98c796c85dc", "votingAddress": "2mFUFMtj2CcnbeJw4RgJJqmMMYZi", "isValid": true},{"proRegTxHash": "e0c7ed329482c23eee65e318e3da888b97ef55f0bd406e9981f5f7344eee3685", "confirmedHash": "38f8d595e248954f4c46d6d4b26517a28a01a792c4612ddb1200000000000000", "service": "00000000000000000000ffffbca669ca", "pubKeyOperator": "002a3fa656afa782d83c7e7975d79ab7c72ed1204095b32356817a527ccb6bd9ab0f8c4d4014847d26567ac68c11fe3c", "votingAddress": "eYEmZGBtmS1zsh2e5gmG43J5nYN", "isValid": true},{"proRegTxHash": "fb9c323b7950553ca4575f7ed8a780f3c911e31b10279897bc9de15504bdb491", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0e4", "pubKeyOperator": "955d12f249a21dcdcbfcfd6a2ebefd567d5899190e6b78d1465b24da77ad8d300c7096dc93b572353229c00da1a86072", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "1be5b4b0b8f7323764e4fe2da7c3aef2ff8d8eaee62126f4f84d8fb25116eff1", "confirmedHash": "563d1e28448e78647e4f314fca555f8ba8194497c75265ab1500000000000000", "service": "00000000000000000000ffff3625139d", "pubKeyOperator": "8236f36607b7f422a1432200aba1737e8119a9771d903e6d7f5c0f9b28db18fe14cc5448e3d8579d176a118cd769c4db", "votingAddress": "DERAw7rCieLtFrNrs7ZE7F5sivD", "isValid": true},{"proRegTxHash": "16b6a25280969455b15b6b90ce664411613a9cc7ccac94a89447f0405b262299", "confirmedHash": "7cda8921938c300240120da22ce849420a62e494a23a22053000000000000000", "service": "00000000000000000000ffff92b9ad51", "pubKeyOperator": "8afa6e489c1d3b16f9343b6c19fe6783cd44801c481d906e0ae86766ef40df0e86348d0ae3a972a05b5d854e54de9708", "votingAddress": "2zWcqwXHY9Ch75oryehk6MscyWaa", "isValid": false},{"proRegTxHash": "319890e005f6512ca029403480d16268da0f6f10ee983db19963550af2473402", "confirmedHash": "f7835b1f88f36b56b34124c2bf93240946b44558c45564ac2700000000000000", "service": "00000000000000000000ffffbce2e0e9", "pubKeyOperator": "00779888692fbaec343f42b0e9b552956f705f690318fa3f5a6d5451b893281575c7f8051e1d4db7703d5856b782e0a6", "votingAddress": "45tAoB9bedKTxut5prseNpZecQct", "isValid": true},{"proRegTxHash": "f0cfe746efd26ddda55d10b516908fd31bff4ea80eb5ee176e2d236bc9d8a8c3", "confirmedHash": "15409eee633be949ac015f328e434352d470299d9f6413141100000000000000", "service": "00000000000000000000ffff55d1f196", "pubKeyOperator": "8c4e43df4d923e91514afb7ac2e8c75dee8c0c6ee7e5dc1f58943793ef019ce64ce6452efe86742ee56e7c28302469d1", "votingAddress": "2TXQk1StfV2mTemZbyoankir9p52", "isValid": true},{"proRegTxHash": "680ff0949a7855ced334ac6819884357ac996c446ca2d38683835dba0321666d", "confirmedHash": "90664bc6ebb348ccb0d7337716838040f0f6e194339a667d1300000000000000", "service": "00000000000000000000ffff5bdbed6c", "pubKeyOperator": "0774b68ca6b96a5a7cfc310e2a55fce5e5f7861d4964d3cd09649bb0701e55e9cbed651e4c8212e6a78475b071cc74ef", "votingAddress": "2dHTGKrCmi1dkVVeFya8ZTgubW5n", "isValid": false},{"proRegTxHash": "0438fc079088936b4424c741a569c97ce234592775c6bf32677646e6aaa4d2b3", "confirmedHash": "b50d30e38a72d85e16a26a43b7de5cbce94d72d9df7958410400000000000000", "service": "00000000000000000000ffff32740eb7", "pubKeyOperator": "02e2dc7a4b6e50fa3a6bc62d5825b44c59497e8a07faa9aeab496d67c662f8733ec2a98261b240c69083f30ba32ae4dd", "votingAddress": "38ko2D3TLskGnDwvJCcVwyWzGTiE", "isValid": true},{"proRegTxHash": "89b7025e55ba7d67f1a85178f23bf5a76a234269d589ce827d3cf63d126e4069", "confirmedHash": "4510928dcde4a89c14ee6a8a2c9723ebe1be3d1a865597921400000000000000", "service": "00000000000000000000ffff4e2fe5d3", "pubKeyOperator": "859427ad712ed724d22de6898a28f20af5fa57acfd638924d3582733768609b443a2ca593ace129ac261172448f7eab6", "votingAddress": "3USJvZGGzECUXPQP133YRZzLRJAw", "isValid": true},{"proRegTxHash": "17c46444fc040b172a0ca53f790e22b6065b468eb0a8c96f9af6c6b92a067299", "confirmedHash": "b25647cbfff6076c91131ed01cbc30688375d35348f064730c00000000000000", "service": "00000000000000000000ffff55d1f26e", "pubKeyOperator": "8620aa1b0ccf6d98ca21513fe526c4952671a2b94646f86da687705043405a37ef8e4a74b15ef49390ae084d4464f616", "votingAddress": "4X9AaoGR7zLzTiD8aZX3NycxptDc", "isValid": false},{"proRegTxHash": "31016565146a94d8e0416c5a367024b2191d2bf84e37bb5ba19aa68b01419f95", "confirmedHash": "926bafd5d8b19230ed4284d06829edf1b46dee2530f001821700000000000000", "service": "00000000000000000000ffff52d315af", "pubKeyOperator": "94d4d6e6c595e69345155c0574e96e892d3eaa9dbf49ee921e0801d18d8c34c641ff65fcd7977ed83c453f5be7a6a8e4", "votingAddress": "2Rosmj66miPYU7EnRjBbFF3BcSJf", "isValid": true},{"proRegTxHash": "e20f3c79c6b253bc72a40feee60aa318eed520907797e20ec308ca2c6037715b", "confirmedHash": "3f6d46495ba55a3be22a0b01f1c6c53d558c1819b9d854160a00000000000000", "service": "00000000000000000000ffffbc28b984", "pubKeyOperator": "8faa31a7580eff598220407c338075b3051667c90e1ad28ef38394cc1b085eaf8f533f7a6131f255670d37858f41b5a5", "votingAddress": "6DqQzUiNSUGW86kJfUfMJepBczK", "isValid": true},{"proRegTxHash": "1d530a9bb94b2ba98be444382ca15d539ee5b9c876cb25b075b4de9ac175a3b8", "confirmedHash": "4f8df20618bab9c096e72d16ddc8adc9e3577c78cc77923f0e00000000000000", "service": "00000000000000000000ffff8d5f356e", "pubKeyOperator": "166b47689d98951ecf1ffdd2434daa265b8eb65ed73b71e8258a5f89930eb5fcdf782b95a50b4b1b63f1e75a16900ca0", "votingAddress": "4855pPDdp64pmjhz7QwgD7YXY4N7", "isValid": true},{"proRegTxHash": "5145a9f07a12b01936b8bfb48d093625a9b8252d83794dd1e1d558dc3836492c", "confirmedHash": "6b15936d5ceb69b27148a1941a81548ee2a1649d572202a52700000000000000", "service": "00000000000000000000ffffcf944d2a", "pubKeyOperator": "93963f48e49e92d2fefeb56dba1b1655021d7c093c47cd2de9f06affe6069d17e2d41e5bc700467ea34ff78c36197af0", "votingAddress": "2RnNUbGATKf1wWJiVN2wY8aDYLpU", "isValid": true},{"proRegTxHash": "4cb678f9d7ac070aae428dfcbb4f6eddf13e17419a8a72129272d54c3f6d68cf", "confirmedHash": "06c362fa2f8b33335aafc47782d24ca100c89b4af6c45cd20b00000000000000", "service": "00000000000000000000ffff2d557573", "pubKeyOperator": "19ed0a7bf7697ab9328ec3283305d5ce8216ed4b69d5eee05334e56b0ddeb851e61195336d5434a6ba9f5dabf35bb854", "votingAddress": "3AZfS8VF9jb9rvt9XnHnu2jGinBJ", "isValid": true},{"proRegTxHash": "9fd835e6b82c0a81ea0e3f893635c0dcffbeea17405d4b469d02d4a0c0c80c5b", "confirmedHash": "24a2f21ecabb472f0affe870eb8d345a5df1819c198b0ec30400000000000000", "service": "00000000000000000000ffff55d1f237", "pubKeyOperator": "8cad50b59d1883ce0447e2e59c9aea69aa7a01f2c6e913d7aca0a2bea8be23ca2e8e8e7f82983cc2fc403e1fefe8be34", "votingAddress": "y2QwjnT5ib8ghbVcx1EUYA3Bong", "isValid": false},{"proRegTxHash": "820c71ae604e5913673386cf0c0baad6be70b1a7e1b39e5e22fb1aefba101fdb", "confirmedHash": "5f3d1cc0f4ac66e78d503704aeeb91ff712b98a2c189c76c0a00000000000000", "service": "00000000000000000000ffffd41865d1", "pubKeyOperator": "0a2079c37278cd66d10f197f13e06e7d88556a087176b14e69ea08df2f6873c5dfd5fdd341b9c17e075db4a19f7ccc3a", "votingAddress": "mnmjKnQN8isPpRSdwBpBPHg6iLk", "isValid": true},{"proRegTxHash": "1ce2caa930df3c412b49d5b5e751f55528fc0acb7c91f69f756eadb250f06952", "confirmedHash": "dc393349b8ad9e42d38333e39f47f6a81484edc1f8da72540b00000000000000", "service": "00000000000000000000ffff8ecacd62", "pubKeyOperator": "0e71b65128c7badad38f2c1a73ddebbdb6c66adfdcc82bd72c4325163acbdc2d4bf25b3536bbafa9e9302bed3dcc35f5", "votingAddress": "47hNuoy7zrNgTSWgL6Yrc3AWFejw", "isValid": true},{"proRegTxHash": "9583cd64737d2a82bff9b70ffc272d3a69fc8865a085970d0f4234ef333b5c8c", "confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", "service": "00000000000000000000ffff68ee9051", "pubKeyOperator": "9560784efa88247112d561086c189d771b3ee93b28e64324cb882265ed7def3d928ece0a2b489a59bbf22187211bdaca", "votingAddress": "gqT2pK4nEv7ryEShNpqvwaLZaAb", "isValid": true},{"proRegTxHash": "a5bb1bddbdb955e7a558a6bacd795afeb96dd6e233f6b3769becc95ec425c718", "confirmedHash": "3a7b4ef744c146072baa40642f3c956bbf942bd76c10492b1100000000000000", "service": "00000000000000000000ffff05bd9160", "pubKeyOperator": "0959b63d573c72076e1f4f4e1cb25e1143ff2eb618b2524e8d1425d1f33b91642fdf6f9c1fbaa1aa0611ccdf2e073553", "votingAddress": "4TKdvNsVenAa1N85aPL4McDi3hHc", "isValid": true},{"proRegTxHash": "8b0cf5d1c8b9ac3badfbd3145bff1b3db9610eb76c0680c22aa5425b23d7bd3f", "confirmedHash": "229b82d62329317491eb7cd03599ca081f030acd0bbaec480c00000000000000", "service": "00000000000000000000ffffc7f71ea9", "pubKeyOperator": "95459d0b72decfbeee5b001349d003e66a42e38c06d353978346ff7abd418c18977d0bc3acac8a5d5da7bee352b22a3c", "votingAddress": "AQXNU99RDBxrFExyiHoLAxQGzS1", "isValid": false},{"proRegTxHash": "9c3c2aa9d840b45d246217e5bab7b50764805534bcf95a6d7b85a4e2204c95ef", "confirmedHash": "13907d5f457c3a3086d3ca496b28eb8a2351dbed207272ce1300000000000000", "service": "00000000000000000000ffffc11d3b60", "pubKeyOperator": "8e7f2cb0d0900f4311f364233c869100b97de3875694cd3f23b0ee6d3fdbc91989477dd1e24fdbed9200b49efe6a9a5d", "votingAddress": "g5dxHC84D5joDh9kBqAtztQQNUR", "isValid": true},{"proRegTxHash": "c253aeffcd605fd80536109602991d085e4b21e66fe578360b3af6c87593b817", "confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", "service": "00000000000000000000ffff6c3de021", "pubKeyOperator": "9387923f6c61dc011d4e39dfed45b404bd428be63a8da540886244e1ae652292edbfe0be0b764a3ac16f3f3a3ea44f0e", "votingAddress": "251yffr6Ux3C9T3KZ8RAVyPkEyuw", "isValid": true},{"proRegTxHash": "740300d846bddd75d439ff93031c42715a708c2dc5ef4dbdfd18c8525bcf6839", "confirmedHash": "f356b11e74a39cb98c8a0d85938986738df7a5f876e878e50f00000000000000", "service": "00000000000000000000ffff3353ab00", "pubKeyOperator": "0c773e3710340ccf022df4782b8abde420028e279fecca79933d2bd4978ca76ad401c51031a1d5f4c63e83f69e59d413", "votingAddress": "2rdEtCmhY1FX2xWCGzCQvnoCXWuX", "isValid": true},{"proRegTxHash": "2c6a0e3727fcf42f529e41ee9a037fc7aee8a74489a6d93380daeffbc58b562d", "confirmedHash": "be00c5a26e72241064fa29698d317dc3cb545936fca608dd1000000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "2sbuTSLMe52g1F6QcuAT9Heb5hby", "isValid": false},{"proRegTxHash": "99367c384b91625d68da8816a5f818ca7e87a2dc38ce3eb82574d0af81f11f97", "confirmedHash": "f829d4e82261d098b40a67fcab1d043025abb79233795e221100000000000000", "service": "00000000000000000000ffff03ee6fa7", "pubKeyOperator": "035b113ecb41758150c06c8fc43ee890d93aa3496e01681b870cd73bee6b99bd17a3708d9e09cbc0f73bd77dd89563c3", "votingAddress": "3MuaU5pXaicvy23pVN7JaUn6HaUW", "isValid": true},{"proRegTxHash": "8accd79b26fdcc6b5b87d1e6d1589fdf370ea2f9b3ad49f2219087e4e3bbb991", "confirmedHash": "9fe2521aadc8bae65c6ea64687b6e87462e3eca2ade89d511200000000000000", "service": "00000000000000000000ffff2d4cb3bb", "pubKeyOperator": "12d61b2a6017020f8b91f9afb209afd52204255faef1fda3c873d657e90634fdcba895213b0f9a4251275f2137095d25", "votingAddress": "2UDwVCZs8veR5sjGNPFbSJzGMjPU", "isValid": true},{"proRegTxHash": "9d285e15494e56b675b4d5971ccffe00cebff8b0f61c4582b8a9601eab823f70", "confirmedHash": "4eb2b4a294ca439cf74146c19d2c8d00155e5cad28447ba20600000000000000", "service": "00000000000000000000ffff0238d5df", "pubKeyOperator": "19131fc7e22c69c2b2194c7ad3f22f931d5cd61c277fcb901b236e4a1eadc5a7154e4330789632b9bfa3bd4d6af0c61f", "votingAddress": "TcfKqsXDypiDBvgGTeMPa2caHda", "isValid": true},{"proRegTxHash": "faeb7b718db33eef9758d7dec05fbe04d4672c272666c376d895c830f8a53be2", "confirmedHash": "f048bbdcf31239fb1ecf9cae01afd37cc897fc0164ae1e240000000000000000", "service": "00000000000000000000ffffd4186177", "pubKeyOperator": "115a1a5288e99db2fe833389af563a4c4eda8f87f3f8038bf8ff0d4ccc3d1f2da6b0572080d73ac1f7a012828c958d38", "votingAddress": "2gpNE8wkZfgHzRpMFQrQ8Uyxy8qj", "isValid": true},{"proRegTxHash": "8ba253541fdf8f3b714099e9448149b16703a752f4421eee4f4d9f68204542f1", "confirmedHash": "51516f243e3c1cd3b01461d8ad9ac0f1d164b42b5c539e8a0000000000000000", "service": "00000000000000000000ffffa12352ab", "pubKeyOperator": "0276cd51fc20b811d0ea732ce890b86be07b86e9a9e7ec52ff597f428277389cd4ed1e631a32f9883c8f010e7606593b", "votingAddress": "4HSmkbqAopNTS7arPz5GvMkr6qzU", "isValid": true},{"proRegTxHash": "e406f03c6f9344c5572447aa4c858bf2209b44f47f681451d04f875ced04ed91", "confirmedHash": "eadcd25a1e89b9a9920d0f3e54ff03355a95999e588e31a50200000000000000", "service": "00000000000000000000ffff3344892a", "pubKeyOperator": "156d3c3d1a94d8194adfebf404d8834851f0258c6a591dfd7b9f8ef3a929ad1bbbb018a4214f0d0cda90b2b31571acb2", "votingAddress": "2SKkQeumpVYaq3nYeFkyKmVocVgE", "isValid": true},{"proRegTxHash": "e2c7471a29f5f646cea973c5d073f01588807e67c2b7c2ac7bd3817c890d8526", "confirmedHash": "b32e33bd8ad609af490fc9e4b31cb919a7477ddf94e5614f1500000000000000", "service": "00000000000000000000ffffa123447f", "pubKeyOperator": "95a894e4112c2e77ea7a4fa61a4a63f4599746c3fd7bf515d9cc1d2924032625d3c63625e91ac2b8f67e2cb6905dc2ef", "votingAddress": "3ztPd3E8N3yyLKxpXC8wF8hNC51N", "isValid": true},{"proRegTxHash": "89756f6117b6ab29e248ed8ef2eb2984e33114e2fc3a8b46cb8dad76db05f86c", "confirmedHash": "7723fc3c5c009470d185d8704d192da5faa2dde0137ef2f41600000000000000", "service": "00000000000000000000ffff2e04a261", "pubKeyOperator": "07c060a9c8f6e59fc7f0667e4eab86610786cde7ab20625067906ae8ac6f693048f05b9f3736de96d8e496d7e0418044", "votingAddress": "3VyNTrYa34QrwTYu3EikEu3RXinT", "isValid": true},{"proRegTxHash": "ab2a6b9ef16c8a1da1f78ea7a23834468c120ff97bfa6b911074854699c5db70", "confirmedHash": "0d335e73f914f0e1af976387b6538a562e5344700f1c86751100000000000000", "service": "00000000000000000000ffff52d31910", "pubKeyOperator": "02e789569394696be01e4d9deaf1d35a659a48f6d913cd8483854f5a9d581019169ad0636bc283a1974f610136772aa7", "votingAddress": "edY1c52EZSVFw2zFpt9gqc6kaxE", "isValid": true},{"proRegTxHash": "ca72d8b16532ec8e767fb8198a1efcfd2c75f8c7fede21c9ef2cf737922d8acd", "confirmedHash": "a9548ee86466785ff2795949a498e9e083d1fa9abf3e9a791600000000000000", "service": "00000000000000000000ffff55d1f18f", "pubKeyOperator": "0c0af194fa3fbc41df022e033f283f4f6d4dd747398380ee3ce3274b4d0576a49ab553308769d61acc9259e47e031ac8", "votingAddress": "2FhKzoaQqwdrmcudYKU2sRyNZuoR", "isValid": true},{"proRegTxHash": "6356dbff00efcaa84ad51384e02f942277316f34476e044eec8ad073c7544298", "confirmedHash": "95ca7b9118645dbd0535c649dea5f61af9b6276969ed682b1800000000000000", "service": "00000000000000000000ffff0391795a", "pubKeyOperator": "0390dc81232410e0cc707e966e42e8fe48c46e8218cf65867ed64594129398b84e738fb6fbe5398a80dcbd69bc57aa26", "votingAddress": "3rai9f8Sf6udgsK1AmEH6QK8uGmh", "isValid": false},{"proRegTxHash": "0eafa30e8e7577990822c58792d84f3850e36f42808fe86f329316853974aea8", "confirmedHash": "34d09c7cca1bad76a8d4c20610972ce7787695678e618c472200000000000000", "service": "00000000000000000000ffffadf906a9", "pubKeyOperator": "98e400fc2430edf8724a1c4c23ea1d20187ecdaa27d32f41ee51c74151da7c1ca9b95e05c8bae79f1ce6fa6404b5916a", "votingAddress": "3s9TF1RWtQJs1Qgoed9wmsT8xzUL", "isValid": true},{"proRegTxHash": "9515009b6bbe70293f58a1b75f48303fb018040aa1bebdaf88a3968dca180dc4", "confirmedHash": "3001eec6eefc78b4157d5bb2d71a2b968a5ab664221972c60d00000000000000", "service": "00000000000000000000ffff40e160c1", "pubKeyOperator": "8a63101d62c713df7359bda5ad4672d38824dd59fc553198bd7d5a66b5c7a9c81aedb8922e5b29de4dca1da4e502d44b", "votingAddress": "p2reBmwwLCnPZzKeKmNWhc7CtDs", "isValid": true},{"proRegTxHash": "9250ba08dd0a65f793ff0d98c9df6f5ee6762552ba0e560decd41b4cf91cad64", "confirmedHash": "dab715aae3b97199e6d3dbdc3eb97788e92fb3707474819d0d00000000000000", "service": "00000000000000000000ffff5eb0ebcd", "pubKeyOperator": "0e90ff8b3f40247ed57bc4e92abafeaba14180167b79a264d4f2174441367faf27cf66c2020fe18d3f42fdecff2dccac", "votingAddress": "3k9gnL3HznGSJQ8o458vajmcpaan", "isValid": false},{"proRegTxHash": "2c84267342d7c806cc527d77a0ed62c15c3f8f4042c31c56fc655ffaecdcb5a9", "confirmedHash": "e02a4511366c158ed387f88a329a72e3a924862966d8d8700600000000000000", "service": "00000000000000000000ffff74cbd66a", "pubKeyOperator": "0793e4a0062da1111b667ca05511b2aeeab9fd74096b889ae778b4b8c8a8f2a7b31b1be6b60e1af539568a4fce81bdcd", "votingAddress": "2Qs6AWraiMiHgF71CJbCkcdioB4P", "isValid": true},{"proRegTxHash": "509f9bea5e70fcf766a9513e3c10059f2fa3279cd570c9a7e056da3d7812b9b8", "confirmedHash": "17415463615ab5911377882fa2d05bf09acedec78ef5e99f2500000000000000", "service": "00000000000000000000ffff453d6bdb", "pubKeyOperator": "97d53778858de64cff480f1e681e8791d1ff03321272ccf2ea91798073cd3c94d8593b803080d70b9242dc33f6bcbbad", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "15aa9280c9fb1296fbbdeb2e19aec312e304ebe79c28a518e0a28950dbb30c49", "confirmedHash": "adef6067a058f6739750dcc7f741cb8def27d8a4ff1fb18f0f00000000000000", "service": "00000000000000000000ffffc7f716bc", "pubKeyOperator": "809c0ef7a847295a5fda3850cf60ddead94594ee763e816d2c13d02938baeacabb8156859e418f972f55e30b736d0fbf", "votingAddress": "48AwNUZMuVEcRN324FjQjCo93cdj", "isValid": true},{"proRegTxHash": "85db7e5bd4c75934f2ef3a095364273a9e61ec06681b5fb61e5dda151ed3e06b", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff634f0867", "pubKeyOperator": "85354e07c6eaacd17adac90beecf005476dc0fb85811850880a9bf162653af5f7ae03bf2dfd97dc09f1a5eb8e29554cc", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "edaf8c3bde8f6ae8e85a9a38ad79f9e87a114df2247fbceeb782bb41ec1b859b", "confirmedHash": "1d6fedff169df03a36a10c4c834acb785692ec120538e2770f00000000000000", "service": "00000000000000000000ffff2d206a8e", "pubKeyOperator": "878b65e703a3b309c1a7bf9ddc5742602e5682ba44855af4641034802669d9f044ad63f401cb33a9c6acc58338401c31", "votingAddress": "3tRxuQzKgu59RV1A3pucN8U1rVE2", "isValid": true},{"proRegTxHash": "430f755ce7d492eaa36ab473914a40c6d309184604ecbc181517ded80a7bd18d", "confirmedHash": "f8cee2ebbd094e52f1e6a97fc5c891fc859ba0508a42ad251600000000000000", "service": "00000000000000000000ffff8a44a0a3", "pubKeyOperator": "08e8249d271621ebf0b38c83285e519bd73e417f61f4e059eecd6410d1f001ed07862749f6c7fe2d91afe2c94cc024f9", "votingAddress": "3LD1bajxK377dC5wXA1Uyxzr581D", "isValid": true},{"proRegTxHash": "aa390bced9e90baf945d41dff1e3b77228f583628dca606b31685296e93ed499", "confirmedHash": "210a64ab8f481ef45ca73b16683dc91ad1d64bd899df5cbb1000000000000000", "service": "00000000000000000000ffff03e49476", "pubKeyOperator": "05c26281a9ef2585204a23ed1b57b86c9e977c846ab3c0c650af0a1a5a3ac049698ed8f597bef45847ce2e2715b7efbe", "votingAddress": "3AzBe9LQh4ryeXWNYajipSqbgj21", "isValid": true},{"proRegTxHash": "c8064ea9cf12b02b73d5e786213c658d670dd29ea179413ee1a28c06607623a6", "confirmedHash": "2492ea3b729d90f88b5f842cc4991378f8944e4375a696250000000000000000", "service": "00000000000000000000ffffbc28be37", "pubKeyOperator": "14af3978b5ebbca357feaeaf936708d7a99d7698e0a1309bb1e99fc9274659ffac55c8da8e83f1ad76d176c7f83ad4a4", "votingAddress": "49t1p6oYA1cq86ia5JvEAYEi4GLr", "isValid": true},{"proRegTxHash": "efd9d04332436c16e6ed0bbf0e0e5923dbbd0598b5f0cbe7db8685f1ff36f40f", "confirmedHash": "e70b13255e4c476a0892820b06a490bd23f9fadfa921f07c0200000000000000", "service": "00000000000000000000ffff5fd947c0", "pubKeyOperator": "9089fec1f173a60beaf32b52cbc915b68cce33aa663f1f597e449a4e86e2d1bd42eafbcc6045c59cba624d780483c7f7", "votingAddress": "3GooKKmP86KMr522kZVdEy5wDKbX", "isValid": true},{"proRegTxHash": "2d6d5a3603a30a58a4faeb9d455a96d677f9b21628354275c8c6ea10857ef032", "confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", "service": "00000000000000000000ffffd418605c", "pubKeyOperator": "8d149192f5bbe1e3684840a05ab3704041e2d0476fe99079febc26134da525f5f22aaaab5c89cbdbe6d5c4f9fce28d89", "votingAddress": "2FEaCTrMUqnfrTqY27f5wi81C8fK", "isValid": false},{"proRegTxHash": "b52832395fefc3368fb3c4d7ff1f7343a40837dbc9e7565786b8defccd36daec", "confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", "service": "00000000000000000000ffff52d315a8", "pubKeyOperator": "954b5017998fe8a16d3946ed13ffa255c546a1dbd478e5bb3a2657de4d331a6abda1587ee83a8c6954bcad8ee43bb16c", "votingAddress": "3XhohE8Hq4g153Nf9DUp2gArEXgU", "isValid": true},{"proRegTxHash": "9b2020d4cdda41073383d6a9b0ca0c8792eb077e7285c40a546330d98926d82b", "confirmedHash": "8716cfa9d169394eeae5a2a3371200078a609d8c90a2e0020800000000000000", "service": "00000000000000000000ffff17587b78", "pubKeyOperator": "118780088aa190ec6b383cb622c35b06a7538134e3d3f7b7afba3702c81a399b41d2e95a82c743ad583e42f32408d1dc", "votingAddress": "evcHpYJJfSe6PUbgxdPJBqFRXov", "isValid": true},{"proRegTxHash": "32ee4bbfe7d19de4ab9ef960dd8a8ccbd92994f4677a1756226df804c02e7515", "confirmedHash": "7bff4f371c94a24bc8bd45d996e8e1e504972248543b91fb3500000000000000", "service": "00000000000000000000ffff87b50848", "pubKeyOperator": "0e31f54a719835d7ffe767908b6da7be762fec82d92f6abb61d477e81b9d1f62e7beae24aa889e091993ecba0062cb7e", "votingAddress": "3HwAGfy7Wyq7Fv11u8zXqvyRhaVt", "isValid": true},{"proRegTxHash": "14a58bc65b63ac4c0442a8b5359a98a3388f18b94bf5087a860366d71701bbd1", "confirmedHash": "7d9607ef96daeadc0ffcf361e1110c0bc620e2b9802d61483c00000000000000", "service": "00000000000000000000ffffb23ed295", "pubKeyOperator": "01d01956ecf7ae766812f2cddde45062887e12f68288b19d5c55b7016f9d8957da86655e4f3f4f569b626586cd2fcdd9", "votingAddress": "3v3LMsf3TzYwmNUwTiax8kAEr8bs", "isValid": false},{"proRegTxHash": "e1395447432d77a4c41ec92a9697fdd58f62cb8b05159d3d5d1b0841b218b7b8", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b089", "pubKeyOperator": "14177be53010ef0e937279a4e52bf4eea02376b03f607a236d2d9212b934857bc594ee4b49b14667a2df56d396fd4278", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "272bf7e5b4bfa4d2c87af09647d8117e5edb5e9e4843dabe16f3dfe42e61c4c5", "confirmedHash": "960cffe0dd7c1e3710e3804bbd1acab302ef47ef4928be221e00000000000000", "service": "00000000000000000000ffff52d315f1", "pubKeyOperator": "96a49f41704cb6a365aaa537b23ca8592db9790df76a65f2a8fa45e478a5fd8075fbc842e98b738174d8ac16061bf7ae", "votingAddress": "23uRR6AVNxugCbkTXn3hvmndGm4", "isValid": true},{"proRegTxHash": "00f80d61043bf718f301fba8953a0b950381215e312b8f1a9acb2d97eaf08940", "confirmedHash": "ae9a90064ba06ff8847f0523c19cd11b2269566a02e9c8241700000000000000", "service": "00000000000000000000ffff52d3156c", "pubKeyOperator": "8641281cb35d748c72e4c631f9bf7a1e006340c3ca2e7452b1c262c9b327fe508ec6119be160dac4b7b6392dbe02e857", "votingAddress": "MR9CxJ1tgu8x9At3VBjBvkAvQ4F", "isValid": true},{"proRegTxHash": "538aa9d521a00edccaa807c8ae2adb1f5033cb5f1eecdbdda3cbde881cf83f11", "confirmedHash": "a0a413fa6babbd35ed3b17faefa9ab85a95cfdd357f528ee3d00000000000000", "service": "00000000000000000000ffffb280ddaa", "pubKeyOperator": "10617472da90bc1c3a2792c26740a54c135c4ae12543d6a834f7f1fc1ea02bba5344eeaba1129910081d544fa90195a1", "votingAddress": "2BdXmJHxqfgmhp5ELLn4Rw7vkKCS", "isValid": true},{"proRegTxHash": "cf3844d8c604b162414f7d931eb7b2aef67a8d012c03423d43dfc41c5dd8f672", "confirmedHash": "790acc3c6e44b61cdcd205c64c13672cd701e4553e6a85f82f00000000000000", "service": "00000000000000000000ffffc2a3bdcf", "pubKeyOperator": "8e2f82c9db5fd189fed4dc656a698a013afdb7fc6de00a7d3a9072dcc40569498df54b79a065ce050c64796467b05abf", "votingAddress": "4Tvdb2p5e8gbcKbKi4454rDn4CVP", "isValid": true},{"proRegTxHash": "867a9629dde633170584a1f9f2073bdc83c5dbd2b26dc7f32d61f02ffa620e3d", "confirmedHash": "c303e1c745790600243bc0ca76860d3a50907564e8731f670c00000000000000", "service": "00000000000000000000ffffa516dd5e", "pubKeyOperator": "85872772ff7959599fa7c40adb867f524ed012cd3175387ee5c69d5c1dbdadfa3e68f4a5d8494bc98d0cb2e58079bf6c", "votingAddress": "3bBbsY8AvDKKxWVWrrX9YwunEmcP", "isValid": true},{"proRegTxHash": "fcfb743e5fb8c1f613719f5f0904874a223324194d7cc2252082e66ab649e496", "confirmedHash": "f7a0c802ba127e47a6b4ed521467e5dba4a4eddee32230760200000000000000", "service": "00000000000000000000ffff89b87aa5", "pubKeyOperator": "114cb1b02f8e636f75a1f3a1313dfddfaba9e11fcb91cad5fe30cecfb85f7e06f9dce0c49adb2700d696d1e4e19518cf", "votingAddress": "4SeqGUT7CcuCNuyureAo2sxifEDE", "isValid": true},{"proRegTxHash": "1cc1a9199fa7df3ebff4ee14852388e59b8075ef5aab9275aaf60a842ada3de7", "confirmedHash": "befe73474933bc7b3c0550758c5d95f83f7ef48e91951d110b00000000000000", "service": "00000000000000000000ffffbc28b489", "pubKeyOperator": "925db3ba8bd676624e29582f0cc8e6d9e60141a8f968719f786891f942b54b00e468da95151faac75db158cc2c36a460", "votingAddress": "2uC8gCtuBvCnYXbXb3R6MwBuFojq", "isValid": true},{"proRegTxHash": "fba2d3c2e57457c31152e2779b8dd6178e80f9c9d766896b3ad39b1b0ae39f52", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b06e", "pubKeyOperator": "10d9f66c670ee6498bf66680c28cb763fa79bf8b30b17492e4a597697cc9044a058365fa2d5b20416b3d4641735eefa5", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "d2da0df281c0a1a7528b63960a0a48193dcd38113fa413e76683553d685643e2", "confirmedHash": "a226e69a5bfd401292470fc800bcea75413cc4fc48c292550e00000000000000", "service": "00000000000000000000ffff52d31978", "pubKeyOperator": "1077c446ac94daf3be46af0d8bb666335542ff732e9e24ac9c3c3940ff45394d67c60c5adc24830651b7ddbc0dae82c1", "votingAddress": "4RLYc8s2jCQ9Ts3ZQDRTPV9Zhcfw", "isValid": true},{"proRegTxHash": "3e5de5750422cb477e00fb25f6302b15f09de8d6e9c3b77f6272ff53f43a3518", "confirmedHash": "02e80ca17e63b8d41d5663d143848ad5ab7c017fc228b2731600000000000000", "service": "00000000000000000000ffff2d4da07a", "pubKeyOperator": "01c1a1887ff5366dd7615786db7047d610e1c62c0f50b3ffcbbbc2e165a9aae2cc71fb81d4d7109e490625cd6fec71a2", "votingAddress": "4BxM1mVv9GGWC1r598pNN2bGZjVi", "isValid": false},{"proRegTxHash": "9540433f62e906218b6b6b8c696d4485fe3fab9945779cd0c56759d9eca81726", "confirmedHash": "8e2613758a21fe691646e7576fb0cfe6196e6ab15913df740a00000000000000", "service": "00000000000000000000ffff2d20fa36", "pubKeyOperator": "8ec331c99935d3aa177de8a8a6e58bc1d226f6a4a43eb6daf372a69a850397136f244bf41791ad062b9020b27ef704ee", "votingAddress": "2CVMdW3vn1cvrxUJsxBAPzNB3KBA", "isValid": true},{"proRegTxHash": "87e9f512062f7d73b5fef671dfd3341bbdaa6a0a4262cea3365ce41f41cb9829", "confirmedHash": "966346da385a620e18cc86215c041dd37ba70220f2ab9fc31700000000000000", "service": "00000000000000000000ffff52d3152e", "pubKeyOperator": "0e59dab5b75d959068dee8d7625e729ebc1400be49cef0430a2aee3d6477cf5f895da10e2d7551ca7de26ba4f366b2e3", "votingAddress": "wbLf9tjkh5ZLpyvfp1joWQqf7ir", "isValid": true},{"proRegTxHash": "e102be19660a502e95c0289bbf460ed1fe244000daf91ee07984d44b56aa0e0d", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff84919ffe", "pubKeyOperator": "09e3b6f8ccb9dbb9e8b2975235f49a81f65c74c0f07030b2698e5ff23356a7e23a2aa3b674c3e7acdc2c438ea612b4a1", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "b88f7bb4f930c51b6236627f9653d6cb742395a95394da09d51037399a6c2bcf", "confirmedHash": "e15a2e8f8c892fa45d314eaf3d3ec57592e01cbce6cca1990500000000000000", "service": "00000000000000000000ffff339e1b40", "pubKeyOperator": "10b0293bff68aba431036287b89ec04dcd19334e82839f4f64fb43c691b255e84544f45c5bf3e5f4b7ec3775f2d8905d", "votingAddress": "3AH82HiWQ9boTHF8qxDcTZDWwdad", "isValid": false},{"proRegTxHash": "7700d023df8e9e28201e9e6a25f7718f11a0523cc8dbe10adffa5fe17c1870e7", "confirmedHash": "7956e60b45a05161b3f2f5a9ba20de36f0b8caba4161a30d0500000000000000", "service": "00000000000000000000ffff92b98e10", "pubKeyOperator": "971f2f49a459dc1788e2ca385acc59edea7c77ccbb38485e4bd2ab9c94caa388dfa080f916b400c034123c65ee284884", "votingAddress": "231wpx3ZVCMsnWZmuVMxzPQh81Rc", "isValid": true},{"proRegTxHash": "4494a1246ca7322b9833473d1b588bbf0b27da14356065126109f5c248de694f", "confirmedHash": "28114ab15a2348386a961aa30558697f39bf066561a30bd12700000000000000", "service": "00000000000000000000ffff8bb4da68", "pubKeyOperator": "12d204cac127c64988bdd46ea845a61751ac79d5afe61e2f0baf08b79a73c09c3a84fe6683be69c32235e186f339177c", "votingAddress": "RDwKub957KYyBGkDuQn2ot1Ggv5", "isValid": true},{"proRegTxHash": "53e8c0290c3f1d4b749b0ac98f0b6d40349a617ad571fd2192655586614b74c2", "confirmedHash": "76353e87592f1df03d253c7b07c8e36ec7c01f046cad49871b00000000000000", "service": "00000000000000000000ffff8b3b9aff", "pubKeyOperator": "063a22ed8a0caa934107af52d7fc5e1af558069b81a71cdc28b1ae0c6db41091432e750de0307259d78958e0a68f0936", "votingAddress": "4MVsFbHE2hVTYcuJ8cGjPARcgefS", "isValid": true},{"proRegTxHash": "3c5aaa0f246465c6e8c1a1ecd4bc6f722ea5f3975beb7326ce32244b64de92d0", "confirmedHash": "8adcb0136fd6756ba1b8066eff9c4ab1b37c229ce446be730a00000000000000", "service": "00000000000000000000ffff88f3738a", "pubKeyOperator": "874d06b9b71272e5173298474e72e4811a6fe7624b595837af224c022ffd80193346cd03c03d0bdb637c2bee683baece", "votingAddress": "336aNGFC4s2PTAzzxFiKFZg5WZSn", "isValid": true},{"proRegTxHash": "c5ed02ad5c1e540a0a7ec48a33722a8c9ac0cfbe9884e737f38f749449ba8b63", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffff80c79e04", "pubKeyOperator": "12931488e490cafae2e8446ca9304d4e3a040f4a5fac4b0824630d587e247237a27b82b57f0d6e4a545175be1f372698", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "23818bd91235014d48cafc12d159a7aa684a2de4c810dfe1f9d4f2557995ff6e", "confirmedHash": "2d4253260c85d3f8a854c229dd60c7d307738136e3efc37b0200000000000000", "service": "00000000000000000000ffffa516ed2d", "pubKeyOperator": "155ca5407e534ef30487c93f9efdf3a73bb79682bbddbbb611529aa3264402780a18475d2e976b552a83dc5b3bc1cd69", "votingAddress": "3ZYS1Jyf1m8Qm1PWTC5A5x66YVBf", "isValid": true},{"proRegTxHash": "3d90036df95a27b85a9a6c51f4546eea70e02326af9ef33afb63f24160e09458", "confirmedHash": "a655276af5c649d39818ba7a2f57205fe355c7abec91ad7a1d00000000000000", "service": "00000000000000000000ffff6c3dce86", "pubKeyOperator": "9963db90fa12fe05a1363e3aa087b38bf5faffaf8ba348e92571c459cdd478eca1512e2c3005e642d0826e10a46031d4", "votingAddress": "39JHDhxL5gTRAd6GxYaU6FrG6ngh", "isValid": false},{"proRegTxHash": "18c488fdd5969bf249579827cb706cda0816e5a9649894a848c4416d3a815160", "confirmedHash": "e823832311715abf7805a6f93cb7f6602a202d914c9299fd3a00000000000000", "service": "00000000000000000000ffff2e1ebdbd", "pubKeyOperator": "91a36deeebf527a07183c8d4d6408b0f39b72a032f9967452de650729e9e4d1999cd56beb2d542b4305f6d73ce344108", "votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", "isValid": true},{"proRegTxHash": "6e825c28c424de79fc325a7aee24bb60c9edd06b5bb2ce140b5edd14055dbec5", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b09f", "pubKeyOperator": "97e2ff2d938fc71b2109ddff41fc756e9cc21c5ef9193a9b77c363c0de6e9e72533c1d9abab56d551613ec1e8eafafe3", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "56e42c10a9ec3e91fd66f077333a20c63383a4806f134f18ec34f4e571b6e430", "confirmedHash": "0c7a7d9bd96a468b82a404014224a3b4df86a3beda224f180c00000000000000", "service": "00000000000000000000ffff2d38527e", "pubKeyOperator": "92ee9892be1809fffb65b39a1e7fecc9b433828fefba2084102e42336f56d9e505a4379203c65b6c6625533e4dc5d027", "votingAddress": "41egnU5zDAvzbeKooFZyfMV2tzJG", "isValid": true},{"proRegTxHash": "eb137f962c32102b7bc00d6779c886ddb72a015f8c8d0c68e7846129cbcc59b9", "confirmedHash": "b8313b991523e33c7d13da0141251035902d7794bd9578234200000000000000", "service": "00000000000000000000ffff55d1f141", "pubKeyOperator": "0a03adb79bb7ebd6f06002a5b4f124981da67cdf9c59bc7d9df434240c19eb9fa32c52c5581b170a2fd618189edbf217", "votingAddress": "oDUq2g2UXVUf6SAFbytg5T6cPr5", "isValid": true},{"proRegTxHash": "aab431349c6d654b3e5f2e4841cbe778d7bbf6779b06529ec25eacb5d86749db", "confirmedHash": "b4992c640010ee4b12d3f250160c84d1751d8806ce84b90f0600000000000000", "service": "00000000000000000000ffffb951a4a2", "pubKeyOperator": "813e8bd1efa30fecd9614245169cc8b5f55592b8840448463d568277923dcb2922909e3eaf96e4bfb38fbd7cb0510c50", "votingAddress": "3ZQfTeuZ9n7WbpsWRFj5n8b3WZha", "isValid": true},{"proRegTxHash": "3e429ddb0fb12d621d0e7a9eac621a8dd1d9ac209a12487850d52327b579edc5", "confirmedHash": "17680126cb1d4b8e6bef23fe471626a9c3f0a1e6f8576f551c00000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "3mbgyPoqfr7nt5RXmUc1vKQW6EMp", "isValid": false},{"proRegTxHash": "556f8386270a9d45640d3c09dd8d46a9b6cd15366d6f9c35624ab0887f942f3c", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6d365", "pubKeyOperator": "06a92da63d6c213c8d6431f8aaa2e01c4bbaa363b7c04aa3716abc0cc7c4514ba937d722cfb668b9c3735d853d7ad891", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "b7b8a2945a2e69c983d168922607009362c60633211f15bd36e7795c786541c9", "confirmedHash": "157bed99bd3d14f0e10c4cfc94f8f9be2a003e693586f9290b00000000000000", "service": "00000000000000000000ffffc3b5f37e", "pubKeyOperator": "06c91d5b8eab7539e726d6745ecfdf69b250d299173a6d3f946b1a145454946993e3f0a62767c914264a5265876242c1", "votingAddress": "fM1NBLdViwd32ErZE7LMU3VcwiS", "isValid": true},{"proRegTxHash": "b2938148692ece2c0d2a342efc7c3704b1549cc8e95945912f8e32b029c77ef3", "confirmedHash": "60d3af83b270df45686cdbcc85fb7a23d6982bdd7c0e7fa35400000000000000", "service": "00000000000000000000ffff52d319a3", "pubKeyOperator": "0332993c6c856c34f0c4c98ff848d5fdfc5468b8a07e71cc78cb22545f57b81d51d7cd5295bbce3ef530476cefc2f361", "votingAddress": "HuTkGsmeWeidajqogdQ1HAbLBE7", "isValid": true},{"proRegTxHash": "43c45a4a2f2e77c0e9c2c3d48d8908c5ee131ccb0ab21a23fc9e13bac64956cf", "confirmedHash": "b30249989ad88d3052aa3a317100f092bf229d2c9929c0632f00000000000000", "service": "00000000000000000000ffff9a553279", "pubKeyOperator": "93d686e450dbf1fc6ce876043651ba7bf07e5baa337b25ab650017efbf7f1dce3d2f8e952905e6e0dae75d4d70093ff2", "votingAddress": "4VHi9LKY3RaCqHs7GE86CDUDn515", "isValid": true},{"proRegTxHash": "51e887c3a42097e4cf84c7f2c46d943ee4596fc6075f3bac3b0445280788baf0", "confirmedHash": "b5562dffb0791c9a97f6a862aea43bf42a8ee69e5000c5da1b00000000000000", "service": "00000000000000000000ffff68ee9e8d", "pubKeyOperator": "8f00020804935c6b866af404c3e885885341877ff48c8e8b9144bbc578cdfeb142dc25b89c67083738dc3a2d24228d32", "votingAddress": "32dJHLg7EHmEBiMEkJebvsjwMHbi", "isValid": true},{"proRegTxHash": "52d664c557f3f47dd8a8a180169d87c6797c9e3e852900eaf428ee192551b23a", "confirmedHash": "92b683438f3e5e5d94bbbdb09159ea8ac752d0ae4b5aaf641400000000000000", "service": "00000000000000000000ffff55d1f273", "pubKeyOperator": "1302b0ea9b0644e48190ec2e7e4dec6cdbafb70af19bdc576d479c7217926b527438ea723bb10208095e295226d9732e", "votingAddress": "tzq2NUmgApWAm9BsPv5t2zfrzMA", "isValid": false},{"proRegTxHash": "e319c3a5c327e745c26a4c2ef5aec72b1a469100c9ced5c4b8bb87fe0db11f43", "confirmedHash": "b8f517b027ed16d27856678e57c0b6bd853d02dfcdfe64832c00000000000000", "service": "00000000000000000000ffff55d1f190", "pubKeyOperator": "14e214f55ee8d991b947c42ba29b73db70270e294c7290a7c84c4490e7a80a9bf0f0876ff6bd8137a5fa869f8b35c083", "votingAddress": "4TT7WNLLBc4zq7AiHSVUByLhSC3x", "isValid": true},{"proRegTxHash": "94a66987c8a5ad2c68cca5900e7644bb7003dd858c7743f7f7b3cd508da87675", "confirmedHash": "ca155287a92b44a951d16aa6e598e05c4051a48b9cb284081100000000000000", "service": "00000000000000000000ffff50d1e388", "pubKeyOperator": "0e6159fa6e40816162c8463d362b5b5d5d3654d4b67e0c507807ba8ece62a4c5179dbf4a0b53b346b013039d1f31c6f3", "votingAddress": "fa62xPZiZASf7sz82TjSH6wadm9", "isValid": false},{"proRegTxHash": "063adaba34a64d22029b89ff0de2cdcaf366f6a9b3e0b73a036c5fa1a04965f4", "confirmedHash": "0e16f2827da5d9d0a494e4c4c828e3a9a34f23b8eef552dc0100000000000000", "service": "00000000000000000000ffff55d1f234", "pubKeyOperator": "0912a1ece9b42c554efe5002cd0364ebeafc47bab21392bb944b518cb4a425d2bb675702cfda7b23f1d056a820dfc10c", "votingAddress": "V8w2MrVJLCZqaFHrS2bT6Umi1r1", "isValid": false},{"proRegTxHash": "a78c174a28b0092fae068a984ebf7424ac81b58fa304fa59088bef04f12dd346", "confirmedHash": "92e88e8c6db10d1940f2ac18144fe08855106086164582001d00000000000000", "service": "00000000000000000000ffffb9453790", "pubKeyOperator": "9244b9ddd8dadb5a727117eda62734a561d3ed8de6a11c0878c7bc04de3e53e4c040ec0783a0190603f285caff54e5a9", "votingAddress": "36547pMwE7P5wQaPWDuqs8mKfkou", "isValid": false},{"proRegTxHash": "870d07f1697c8e559e093a3b2c1f778f137ea6f193a54012fe0765f3e8ce774b", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b04d", "pubKeyOperator": "0d0d8dd20168c5d3e78688faac248bae99db5414c898ff9b02047a6beaa261d877f9c6dff71158dc4ae5804f470a203b", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "e1ce1b741433e78e2da19e1f52f4bfc22f94a9468f4e27b0177bfc093ee09164", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff968808c3", "pubKeyOperator": "062103c385d321d7d9c79f3ba836dcc1c1c9eafcb1f48010a4c96420688b50b20ba09b38f22eac003cb7e24ef6f42a37", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "81708b5e8b3cc8d15b0093e19015750e43236b8fe32184b5110bb2c25521b8c0", "confirmedHash": "c160fef94394b3621fdf35067c4497062d35e05d7a1f9a220a00000000000000", "service": "00000000000000000000ffffbc28cd06", "pubKeyOperator": "0db49d800f34b5d4a5ae60b2e4c58b6d5711042985f637504740ac0a183c0938fc27fbd23c0b09ea6d12f328205ce58a", "votingAddress": "3JtwLoWbNxcgq3FaGU31wyYuB7Hk", "isValid": true},{"proRegTxHash": "adb4189800b83e66560cc3bbf07ab1e9afedfb087b6b0c2955b99925f2a07fef", "confirmedHash": "cb849b00457dc91e0d89f6d647b200db3807db7b83d5992a0100000000000000", "service": "00000000000000000000ffff9b8a96a9", "pubKeyOperator": "88892b797b1a9b9c414acb8ee59317b280662747be8348e2221e0730824a2c9b76718645d994a22c63ce97294a92de4b", "votingAddress": "4GnSqK2svjRrQ5AMESJC7gK8qzcx", "isValid": true},{"proRegTxHash": "e9f81526f4edfcb4e326ec16336fdd104364b71695b79f594c712d02bf372c54", "confirmedHash": "7a36a932af7733ab788a8b9c66b7369bf437352fa6d236e41900000000000000", "service": "00000000000000000000ffff8ba283c5", "pubKeyOperator": "139799cff261e45118408dbd9d70b8f4c9e0944c5f954fcda731a8050546951bf7cc8dddf1375e773836e146649c2841", "votingAddress": "2k3dURxwtd9sKaPXtGVs9Htc8vcs", "isValid": true},{"proRegTxHash": "b7a9a612a6ef5d1f93bfe00074506c678ab4e69d44a0a0eab61d0d6aea03a4c3", "confirmedHash": "168ed03cb03abd1ff75950e52fbee27a3ca7c348ccdd67e32600000000000000", "service": "00000000000000000000ffffb94068dd", "pubKeyOperator": "030ab5f00c2c79f5b3c6b5c81f9b6fcc787e4efe34b9bcfe9cedb6b996fa0c132cb0323eecb5ea161d0e01fec8786ab9", "votingAddress": "59cTf9tLNG9Xnos3QGadY6YFZzy", "isValid": false},{"proRegTxHash": "5195715ed5324ce1f6ec1e6c0f3131479ac13573957d22946fab810745f3e046", "confirmedHash": "dd89ca3dddedf12f89eb24bd1cd804062a4c7dac8c2073581100000000000000", "service": "00000000000000000000ffff2d4da321", "pubKeyOperator": "08661995d7e3f1fc02b3a8db83e38aee1500673b186cc57a434cbd3d9c5687703c698f451f1bee137f090e8481a3f29d", "votingAddress": "3pk7K4hDWXZa9HYaVqs1epn7YCMb", "isValid": false},{"proRegTxHash": "7e28364b3af8c06d4982b8cbb1ef927e33a3896dacb98ed31c3bbf09bdbe76ec", "confirmedHash": "f0a9ae121a231c1c5ccaab343d8f3358a8ec0a02594297350b00000000000000", "service": "00000000000000000000ffffa7ac22f4", "pubKeyOperator": "96bc691772bb2daf96256aa83e162458c27640069cff2e43be8f2346adfe3f6ca9e9786e01825b098d5c502b8d52db81", "votingAddress": "4UUe3XfLGcWzBBeqdWEQSwvpV5N5", "isValid": true},{"proRegTxHash": "13af8bed104b3e698aa463c6efcf80f29af7a0a9e6d122c7369aaee3c6242328", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d56885", "pubKeyOperator": "05f9d5a07a826cf5e88643b4cb9f490c0726cdff5372dd7feb3c187f55f8a0f2bb9e55d74023a9497def3ce1b6b07dba", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "76ebaae24cb0fc7c0365cac229d6dd9b17cc50a62b46d99f4c9151a4315ab9cb", "confirmedHash": "fb1ccf7902c6ab753a271dac524796ff009514ebb7aa23982800000000000000", "service": "00000000000000000000ffffb9e45371", "pubKeyOperator": "05fa562a0470028da4df4a35186787680ebd36c995c0da815abd2ddc6ab9e95769eef7cedfbf1640a5b3c16b119a4ce6", "votingAddress": "24eA8akAh3ovaqQ7uVrLpkkfyyM", "isValid": true},{"proRegTxHash": "54703fd73044c1753726567994c035b899edb68dd49f859064bc59f9d2ad8743", "confirmedHash": "b9d70d4631d6fca8deceeae206b4071be4a35f8a231d26bd3d00000000000000", "service": "00000000000000000000ffffbc28fbdb", "pubKeyOperator": "89a4a96fc7a23ac3de06eb2c55dd2d8e24057e77abfb72bbde744dfd8b8a002460cd07dd19692ecbc89021be39117389", "votingAddress": "3gVTTRdLBp9xxpUbzjFVK8krp7ji", "isValid": true},{"proRegTxHash": "8249bde92990c3e27ff69aa3145d13fe19fc100a61178f7604dab441f1d89747", "confirmedHash": "8c30f68f4131396e1ca0d479a0ae2fc58ac4ec9d1d914ad63e00000000000000", "service": "00000000000000000000ffffbc28a315", "pubKeyOperator": "15a3705fca8ac9bd074a25e0fc09fe5c9ba31aa6a0e46e8e4254a1549f0fa3a91fc566df1ea071d16d3141792feeb07f", "votingAddress": "WNRNDhD37mnRfDTT1e3dwxqmBkV", "isValid": true},{"proRegTxHash": "cc4e3033bc6a6e364959188ec5b02110ee7f2f35d7ea91a22e198b691c45fa15", "confirmedHash": "ea3f2ba72a7cab717f64e807d5d870e4e84629404f73280a0b00000000000000", "service": "00000000000000000000ffffb23f7989", "pubKeyOperator": "01dceee5bf0b6d7801f5217d704a287b22985f3a933897d94ea390a6b426459160019ea9dd9e0d989bdda4422d32ce4a", "votingAddress": "2UQPqPdwML5wPTd8CM4C2TrWyauE", "isValid": true},{"proRegTxHash": "45c33ab3d6987666349a3d9eaafa4250b171dd82f157084916599e41f0c6de2e", "confirmedHash": "6a9ffc97a302872b729f442c3af0f7299cc451f0ace0db371200000000000000", "service": "00000000000000000000ffff2d4c50e9", "pubKeyOperator": "91a8b62d84551b83304248b3bc2419e55534d875fbf53ebb2024fdef4ab821959f01ec5686fd0c859840542acfb5517f", "votingAddress": "txbARaXHgopb9KPXZhBvdKoSbYT", "isValid": true},{"proRegTxHash": "81fee0179196eb60aa54ff7b50b08ebdbbea490842ce3ff8858c6356c1824b6b", "confirmedHash": "9aae20659005ddbe5cd3537fe055c12701472029d6c74fed0a00000000000000", "service": "00000000000000000000ffff86d1fac7", "pubKeyOperator": "0c09397bd8727278de8dbd3881025904701184ecf2b266099465566c0adc2345d66bb04c9e1b69156365ab967600f8ce", "votingAddress": "3r3kmQY2wGodp8iMRL6mcwhyEQwF", "isValid": false},{"proRegTxHash": "18b8a6bdabd69b49cacc5f7b357981d0d378d192055ff957b6684b2215c36e93", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d520a1", "pubKeyOperator": "8d65ac8fea3170c8a2f85cba0f2ce863db83bcbccc0b9e2090421c33ff8dc8e94141b55680b69e3fd9bdede6857b4c5d", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "46f79a21c5f03e60dfc69caa61f8a840e0a22f059572ac7c1de404f91bed35f7", "confirmedHash": "ff2739e301dd6cd53330b02a1a227fff693744e0b8b4cf5c0e00000000000000", "service": "00000000000000000000ffff5fd8ff4b", "pubKeyOperator": "07cad522fbcfd0cd25f00f42c1ebdb53cf586e5b4e06318759c73e2b2b4d9f9db0ea237504f876563bfc059b3156e104", "votingAddress": "JoJnaXhzbihkRmQJVEUTyAp9Tp8", "isValid": true},{"proRegTxHash": "86c7280b3719ef0146dc2f9085b663928185b4048388c8ee2fd6caaf66a405ff", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff3459d3f0", "pubKeyOperator": "84b20249313060481eaf28a7188d44ab96458c50be1dcfaa389d22af3845353441c3252e0f90d715e848c2a91b2db074", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "6f20999f745580ce9bb235f324090b05626695b848e5327466cc73b72ad2d6ff", "confirmedHash": "960cffe0dd7c1e3710e3804bbd1acab302ef47ef4928be221e00000000000000", "service": "00000000000000000000ffff52d315f6", "pubKeyOperator": "90571176dc000c4372f51d9603c93034cf37d8254ac4ef6d7aabb7ca5fbca03f47b02184c08e04160d976a9e177ab50a", "votingAddress": "3ei33Enggvhm9eJz8AgjAKREYmHe", "isValid": true},{"proRegTxHash": "c54f034490adf80da96a35713ea7f8f52c2b1a6bf84fc8c39e56d6151a56afd8", "confirmedHash": "9c22eeeb389f9558040b02d0ab619cc71e1d09dd74f276151d00000000000000", "service": "00000000000000000000ffffbc28e704", "pubKeyOperator": "94f79f0167e904ef130639e793ad191bffff79f410f89a8fc65c141a9a16f5e48314fdf1e10ab76979d79f8a5203abfd", "votingAddress": "kQiUcWpKiL4QYpSpoRv9jJFZ5Cd", "isValid": true},{"proRegTxHash": "3279d52cb33d0919bdad1fc38cb1800a034c1e8935de5b9c72f65a896fe65570", "confirmedHash": "88ff62118bd21384338b5b13968c737c338d3805842d24f41300000000000000", "service": "00000000000000000000ffff8a44b81c", "pubKeyOperator": "89ecbcfa0c70392cb31ac77c74f1607f93cddc2a014ea6555b5e4e64d2f6b8f6e0786a4944036631d9acf437d3118a6f", "votingAddress": "2ZVnqEKBEZbCxPkHe7Bg3WZSTfZM", "isValid": false},{"proRegTxHash": "e08e1f8ad5b14c14193a6fbe0f8ef01a91fbdb6fd894e766a4cfd40491e4e767", "confirmedHash": "8a3f04057656583098bd0df71112f88ff005cb568d60c6230400000000000000", "service": "00000000000000000000ffff55d1f1bc", "pubKeyOperator": "00bcc2d4e727073b91aea52b786c220ed86aad729d74f64d4cff23eaf6db5867a1adbea869c72a1dcf32d889c7a5677d", "votingAddress": "HK6swtjSUbUtvYd9pdAhMLXUCz2", "isValid": true},{"proRegTxHash": "853a5d55f88c5a3af7ed7f8d437886d5ea2dcd2f5b5197f31546b01d66d48a93", "confirmedHash": "400c20c22ef9d9ee5140ce3f96fb81d6596a2a7eea485d1c0400000000000000", "service": "00000000000000000000ffff4115fee7", "pubKeyOperator": "99b1710f8b4edbe35de42d26a3bd02589a4c4ea038243f86f298480220b9858ea4e25a7ef2e2510c352bd6b1e2b12f86", "votingAddress": "24rKRftJpJiLoXcTyKFCabRkFgvY", "isValid": true},{"proRegTxHash": "745df32bbb9d45d380812d4331991d2bdf68f664d69ec9d9f924d17a5540d016", "confirmedHash": "1017b85cbd15cbc6c391faae360be15319ecfa664347ac5e0900000000000000", "service": "00000000000000000000ffffa7ac6a49", "pubKeyOperator": "82a6d7f5810162b56f0f46e48615a7330a24ae2d68ab4d886062d915e0da5c165090da9a928f2b68f4e4620e1e055064", "votingAddress": "4FwGdWQqUdCMCwWYnPHmX6pB4zSJ", "isValid": true},{"proRegTxHash": "7780cc45b89d27545904c29bae74c3ede5d705e9ac995471da90180c9ddca33c", "confirmedHash": "6330e1b93c8b162d288cf0ff4618c32931b1afaa73f7f8d90a00000000000000", "service": "00000000000000000000ffffc0a9061a", "pubKeyOperator": "058093726e73ae06184e4303e169e05f5e6e2b51305330bcadf92386c3aac9e2906a7b6b3b4c9cf9c13c9a8a1f311d3e", "votingAddress": "25AeKPhJNg77CPKqAKKfqpDLcpX8", "isValid": true},{"proRegTxHash": "0e569ed26b20680c2ea14bf32949833036f8b0d0dc61d44fb9ea4e5b56b22f4b", "confirmedHash": "16356f04b77a1aa06d6609b9de667d2ee38143e1edfdd9f10a00000000000000", "service": "00000000000000000000ffff68f85e65", "pubKeyOperator": "8b55e174dbb670fbb1a9f2c71d99bbcb27d3b69b4021012a7287ef34e0bb4481e194177cbf5949dd6be29276b78883ff", "votingAddress": "29xmfyyi29qUWYqdeM6CydVvjQoA", "isValid": true},{"proRegTxHash": "56420398efbebc30257e0835a135e5d1faf12b39917cb1c0781021d7a26e0863", "confirmedHash": "546ca2ef99ffebdc41853fc79f0e9644c260ab7854295d431900000000000000", "service": "00000000000000000000ffff52d31523", "pubKeyOperator": "052126c34be6750b3a87a0a7241fdaa9d638c6ce4067573b8b5313bb24bd4c5b9bae39f046b682d4b3525490d7e01ee2", "votingAddress": "3piFnC4dghMLYnKgp8xEuJB4bjrb", "isValid": true},{"proRegTxHash": "40ef5b72b0ae133b76d15140141da920d7fdd0dee844221ea6be4efd59a09b6f", "confirmedHash": "6a1ef35b95f14c2d10ebe700f225283b64c8cad80500fc601000000000000000", "service": "00000000000000000000ffffc2875eaf", "pubKeyOperator": "804543507ae311bb478f2171308449aa11c3175b3381e8671d770b703c46d8ca51f45b61317be0ce264d9a620da2695d", "votingAddress": "2fnmRLGjjvKrQHvoCA4SAqGwVRfh", "isValid": true},{"proRegTxHash": "4472f925c242d04f4e5a2cdc2a97627c4d7ba8460f1d6dba4b6497d245d635e7", "confirmedHash": "43b3caf59cbc5331ce20c7c1be57c84ded106d611d049e4f0000000000000000", "service": "00000000000000000000ffffb07b39de", "pubKeyOperator": "83ae1be57b8b0337519ad33a3543c3ce9647caa71f4851ab1e6004a04f789017d2093facb6fbbe3613f1ffc770796be1", "votingAddress": "kMD57f1vvELwxBy8YvtPjw7Kys4", "isValid": true},{"proRegTxHash": "17e71ab3880e2c66204c2ce074734adf107cc6fffe7c5ac33ab5eaa11abcabb7", "confirmedHash": "97a83aecc1a51786d3cf8e6a0a00121ef9ca46d041c9c3df0e00000000000000", "service": "00000000000000000000ffff52d315c2", "pubKeyOperator": "118b2bf21cffff4781a54b5e9f3661d47a87927618de7444fefc9ad9890e28f48ce3e428e7ef06895aa7eef63ce657d3", "votingAddress": "2etM9LwnqskZaHCnBk1jwUFtEAeR", "isValid": true},{"proRegTxHash": "6da398c4f7afb0b5d6d49c95e1af6e75cbb126ed2034bb23181ea1593d5dfe29", "confirmedHash": "6293371443b72347ef9220b3c2dc95204da20f205271ed060c00000000000000", "service": "00000000000000000000ffffcf9449cd", "pubKeyOperator": "029879ce12262b43f98bd93b75b9841edc7a593355da1c7704056eebd4a6e6470f048fa50af33c2c7ea125e552c5218c", "votingAddress": "2poZudc8cQd5C1hYLLeu3QAC1voX", "isValid": true},{"proRegTxHash": "f856bb047fc076d55a535f7352fe64071eaff7b57408d57bdea3fa24d2d26704", "confirmedHash": "a1b24fe0539c59b6da78060e02681ef88352a291d5219e291800000000000000", "service": "00000000000000000000ffffb28050f1", "pubKeyOperator": "1991f093a3057f008924813c1e1823e5c8631c9f8823594be545bb65b9cb58321fa65990170f32b22c7ebb0e1f95d3e6", "votingAddress": "ndjxmjGmSEQiYSmqH6tEwN1AABZ", "isValid": true},{"proRegTxHash": "b8851588d8b3acf88b60583a255c41ff5b7b5b0689cd3fa874bd8e308d31d7b4", "confirmedHash": "5c68f7975db4d7563096158223fbe30e048dc59fd41dbae20b00000000000000", "service": "00000000000000000000ffff877d9d20", "pubKeyOperator": "198c76f24683541e8251af471f1566d456c502205d97d1a5e0d4f2773e602dd9618559c264efcb3ccf191f548c31d8ed", "votingAddress": "4RgCk1r3j6D44E2ikgQEUHZ8ju7g", "isValid": true},{"proRegTxHash": "b6a913cab763b0b1affd793996d2785db515dff14422c98df97a6879c53cfa0a", "confirmedHash": "06a2867e36d150643de89d87c53c9b6b9c6a195f78ed8a580500000000000000", "service": "00000000000000000000ffff52d319d6", "pubKeyOperator": "02da0211ee786876d97b0aa7815e12311fc3d3aaab535e1b2201e178d389ef854a9262ebc58d4e88a334af53f5ceee64", "votingAddress": "2La1MAuUZiSVsEZpQV3rQMneq6kC", "isValid": true},{"proRegTxHash": "960d683f7bb41198cf7f07d13a33c1cabb1314052fdc1dd9c9ae09780a1cf1b2", "confirmedHash": "635eda11ec6eaa35f268baab3264b860f5e863c94bc6fb3c1200000000000000", "service": "00000000000000000000ffff334d71d8", "pubKeyOperator": "8f43c5106346dfbe1f136e3f56840cd6a2042a010f16f6400f027f38a989c31b66c0049dc2d8dedaddaccee6b8083934", "votingAddress": "QaJF2wbLRbasfCBm8rTFXR1kB2g", "isValid": true},{"proRegTxHash": "bd4fd2121be508042bca116f04aa5c9d75317c8338b2701e3dd0c77267cf12df", "confirmedHash": "bad347d35fd3fd20ad64f89a242804819202f576a01d1b3e0700000000000000", "service": "00000000000000000000ffff2d3f4edd", "pubKeyOperator": "83947541b4242ca819613d058e91f5395fcd869defaee6acac650ac7f5906823cbb1d18515f70e385624555a0fed5a47", "votingAddress": "dheojm86EtgrxDQz9eg3zmK5iUH", "isValid": false},{"proRegTxHash": "ba76e5f17ce6346de479579ca45b77e7b9b2832f4b32044f3407f3c0c67fa38a", "confirmedHash": "bf7836f14f048030378739c788e77d2516b544de8482af2e0f00000000000000", "service": "00000000000000000000ffff8b3bafa2", "pubKeyOperator": "0f618820b7e469f4a37b832a074d3a405031300faaca39985371875e64612a94000a7455e2f65a4b0b23b1652e5f081f", "votingAddress": "37k2zmwnhzkL1kRb9aymyefpLnH9", "isValid": true},{"proRegTxHash": "80e5eaf65a04e1f2fa507a0634c4ea13265c31ff8eab2159e709141fa17e1eb7", "confirmedHash": "2ddb17fa9d6717d30131ee3ee178628b9d5359f8e0fc69f20300000000000000", "service": "00000000000000000000ffffbc28be35", "pubKeyOperator": "8cd6ffe314cfd1654369070dc969654fbfd8894ad4de5fe860d79c09d315dd6b37679b2b56406df4d70c08e585bc4ef6", "votingAddress": "QNPZ9wxstf4UbNMseDfUwHxdcAS", "isValid": true},{"proRegTxHash": "fd90219278db5a6f618e10e092233ba98cc9c1be9d1c78482e75444dcbf10492", "confirmedHash": "a29c74fb3479bbcc74497d6602c50921f2f28889b72c7c733a00000000000000", "service": "00000000000000000000ffff52d3195f", "pubKeyOperator": "84ae61a283c1c4dd6667fecfa8a963362d9747f43b2942bc48e9bb93c6de51ef9e7925a9c6adffc2492318dd7ffd10d9", "votingAddress": "vivaVB31DFXE9d7R5ij3fS5Qx9m", "isValid": true},{"proRegTxHash": "c9c4df6080f4e54caf2b582a58d6b70785a61c6dd8f1136bc3b8bf8f8475591a", "confirmedHash": "af224a8bc037c90774ec68e1d630961ef2121d40cece4b2f1100000000000000", "service": "00000000000000000000ffffa5161957", "pubKeyOperator": "061d3df63e8339b4c83a5a08d800c24020e02d4b34783bf1dbb58325beb3702c4e7ac26a8a6c57c46d6c5b84d088db0d", "votingAddress": "288H2eS9Ly2KQt7S83a94MaXicrP", "isValid": false},{"proRegTxHash": "490d901c397d5de7917bc0a89474ba72f1f927ceb999725e8cfcbe906c4ce283", "confirmedHash": "b59ebe90a9acf1a683c62e484a51ed8c108ae43a2580f5542400000000000000", "service": "00000000000000000000ffffb23eab3c", "pubKeyOperator": "81a4c0e55e7257e9bb761829dcf4e727e1a440d63dc84977754a52f685651c270c5060c609200c1c09a4c9c673609bc1", "votingAddress": "3hmnwv6AARG4Ju1cJRuGBq6LRdss", "isValid": true},{"proRegTxHash": "8133464e06d880c262a0adb863b94d20d2c6835189e4fe8462cd25a13c9c7476", "confirmedHash": "0fbe5b79fc8b8e719f17afaf044bfb393d80e60c1eb6ff961500000000000000", "service": "00000000000000000000ffffc0a9070c", "pubKeyOperator": "1663364df7db9bebbab82c4ca285e70195f8c1e4e6200b5d6e389569880ac24f7ddbfdf2c0902d57778bc61ab802d944", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "ef4494bad86971a02e89ec46e046d26fa56a11b5251e24f6a714ecb9f0078fdb", "confirmedHash": "0e6d2fc436266c4ab3a74df0668e019bdd52421c711101030d00000000000000", "service": "00000000000000000000ffff6b157215", "pubKeyOperator": "1428df14a684fde7f07cd3a8c7cc4a10068a6fc5989def942b064d318fe77e8df9249c847cdec790b3ced2428cfae8cf", "votingAddress": "3VEB1DpUephFDTFCXL9C6Mdd4tiW", "isValid": true},{"proRegTxHash": "9efee0b691adb7a36b731e572149c3a6ff84e9706ba964c71d88df2ee52ba674", "confirmedHash": "57c4c1632f801dc664e0298968fbe0b72498dd93827fc5d80000000000000000", "service": "00000000000000000000ffff33c3d9b2", "pubKeyOperator": "143d8f943843ce2c38b43fad1ed3460b6b88b8a9bdb4dfce283f90889a747208bf3864ade1c785d53a65b3f150e0d3c2", "votingAddress": "2PSvnXP8Hjes85yaYqaqDeppoiBw", "isValid": true},{"proRegTxHash": "9cee9d64b09c81075392c109456fbbc7ad5f3ff3c819805345fb66dab84dd4ed", "confirmedHash": "de25bd120d1d74f9614666e8d1311ffdf6d9ae71b1436f1e1100000000000000", "service": "00000000000000000000ffff05b5ca2e", "pubKeyOperator": "0e9b9870f23a4723e742b91faea5b96e15b0d6a71748ce8c499aed773bd2971696341233b4cb0975432dad5b66cbf2ff", "votingAddress": "4Q9zcAGSE2EPNFUpcewtek6sHwRx", "isValid": true},{"proRegTxHash": "489aa8a896d5cbf32df6a9a2db9271514007b51cb9506a52dd05f69079957a12", "confirmedHash": "922d906ada388f8514131410e21994136debfb50a4e3a64b1300000000000000", "service": "00000000000000000000ffff1753850a", "pubKeyOperator": "0a0973a510a4da8b4fba3560208e368d32bab2baaf2687be0e8b15146ee958b14f8f25d0039bbd19cf409b3a129f0384", "votingAddress": "3JbTx4AwmJjc8ttxQjaNupE7bqtV", "isValid": true},{"proRegTxHash": "f9e26fe7eb5ca7f9ea8a904e7339ec4cc46d3ae78706a234af10717ef27108d5", "confirmedHash": "496354ed47b8f8233302cb68da28c574993c103f0e5669d71a00000000000000", "service": "00000000000000000000ffffc7f704fb", "pubKeyOperator": "846f6438be8b64563d8b87ce73497143c10b1c6e248296b408d2c54f1e1a9085ae7181b7f659e19498b96b15059b52d8", "votingAddress": "iv7urC1w98bviKvinnax8Wt8RUv", "isValid": true},{"proRegTxHash": "7ef9699f854d6278eb083eb75b084b698cfefc61932eafb5f764af99ffc972fd", "confirmedHash": "fde8ec15f707c69c527cb9043c67be7c5f195b71698c59160600000000000000", "service": "00000000000000000000ffff17a300af", "pubKeyOperator": "839040bb495424dcd07def14c4a193c24bdea7b678bc64ba6b265c2f1d5c018519162202127ab8105a5fdd651844cc0e", "votingAddress": "2mD5wdXRbfS4KD1K1Xw5YYWJ4oE2", "isValid": true},{"proRegTxHash": "347f0d11e31355d442be12568e7215ea47b8a7e84cb954ef82c5dd81cb8db358", "confirmedHash": "dd00148e7f6a7fdd7eb196fe4951d63f90c3323998eb07312900000000000000", "service": "00000000000000000000ffff52d315f5", "pubKeyOperator": "0c5e523c4be2c7acda6b71d52fee336131e133cdfc1272768a16e87c28d5c9a0778a9b44cf16e6a0b043382cdcb82d68", "votingAddress": "3BD1GqRpziupjAwoXFBQCbwS5LQc", "isValid": true},{"proRegTxHash": "0f70910af580a7fe2746edb9a7b1b8d5f5b1a0f5f2f7420e2b9a50183957f265", "confirmedHash": "b36ffaff2bce54c8b1413dd9649b87fb382c9f6b0164502f0e00000000000000", "service": "00000000000000000000ffff2d4c21ea", "pubKeyOperator": "066dfca307bf25ae1211d9b3a6d679925fd1d92a926dd5ead240d56f5f5b0665de8c3951dc937ff69168dd6447b279da", "votingAddress": "42sevRwgFyDj1edkyxhDok4vgzu6", "isValid": true},{"proRegTxHash": "9b87891f54f4e5453aac654af1e36aa6e622bdaa8ab08876cbf9c0eac74a5964", "confirmedHash": "a4e9373b7f1c36a2654e6fafa6d494933d2110a1ed5860071500000000000000", "service": "00000000000000000000ffff8bb4be9d", "pubKeyOperator": "11e2e0a92c3e8c9a700efe73c60f567ed26781875836a858f1a24998c676604b63e634cf8fcc535538635565e6b52a81", "votingAddress": "2n5ftASsf7F32ZTWDf5ayxC61pcg", "isValid": true},{"proRegTxHash": "abea730ac64147042775b6e51eb62333101bdd4d64cbcc436a1fd83c06e90427", "confirmedHash": "5d84b6e1726a08aa032fd3456f32bdff99a972d433eed9712400000000000000", "service": "00000000000000000000ffff41144a1d", "pubKeyOperator": "09826c490514422aa90b27878795961fa29fe9be9e256335bdfb17168ddbeed694fb6a3e8e2b2f98d9a3b0ed4b2ac532", "votingAddress": "JC4EAKe5XiH1TMqMFLhifMhETEp", "isValid": true},{"proRegTxHash": "4a5e374025228a46ab983af125317897bca556d245d16ca569fdaca79e18b988", "confirmedHash": "77058055c2f190d4561aa0159a2642445b532e285282cfd00100000000000000", "service": "00000000000000000000ffffcebd2cbd", "pubKeyOperator": "856d148cf32e840793ef20131ec2b8344fc048d830fa0c3c5c7d2513e7af1fdbb1775b312d6132c7f5a404e96cd81f99", "votingAddress": "hzbxWn2yabFPdP6TYK48crMSFcL", "isValid": true},{"proRegTxHash": "c0daaf3e8550ad6712fbedb2481e3a882c6b2ffe719766c3851b5cb6a4569671", "confirmedHash": "8a4f60af92180e80d2a73b6bef7116cf8281000345077b262400000000000000", "service": "00000000000000000000ffff9fcb17e8", "pubKeyOperator": "141956157604d454e86756b7285e39d81947444eb811dd90f0215034b5705c00673cefddb93f9388dd890a208e776276", "votingAddress": "3E3GfVKELDT9f26A8ZxpLPfsw1Rk", "isValid": false},{"proRegTxHash": "ae6354f71676f02a36df052bbc6b356ffe3e30bb68c9bd836c2e8acced84859d", "confirmedHash": "2d87a251ceee74a5a51f6ea456f6930949de9b3db0d0ff770300000000000000", "service": "00000000000000000000ffff3e4d9da4", "pubKeyOperator": "95cd959075a6ebbe7ab265593ab7b781d768ac165af7750875dd4db01fb88b80ab410d85d4bde82dab3f5d9c4757d4a4", "votingAddress": "uTrXZg2bXSYRromuvXFoMLorzNK", "isValid": false},{"proRegTxHash": "84f32d918ec5d93a499e33da87bea7e8a2920f498ad2192b384666d80eff71bd", "confirmedHash": "256314637a9b4349b2ffd536823bf65770332ccc131bf4e90600000000000000", "service": "00000000000000000000ffffa8775796", "pubKeyOperator": "10dd17d1ce48ea34e1d2b23ee1a2ca3db0a81424a36cc3bf45cd844e7b6ff8b1fc7086ee3eb9800e77fe9ec7b4a4d60c", "votingAddress": "3LjY98mnV6rLujcpfAagMNi3bN5N", "isValid": true},{"proRegTxHash": "375289644ae6af657c6fbd1e28d9b96e8dbf178e75eae274481671ec8ef27d48", "confirmedHash": "834e9e6b307d52f98b459467939ced7f3f97c8effc114bdc3b00000000000000", "service": "00000000000000000000ffffd4186ea3", "pubKeyOperator": "8eef990620fbf5fe968295f41458cb68fcb6bc354988af6d58f73884a92fcd32c8e78a84b57d235d62153bc5f43594fe", "votingAddress": "7ryhbDMMrTsEAtweKqpfH9wiCG2", "isValid": true},{"proRegTxHash": "99ed4697b9cce928a66d153ce095156bc75d168c11361908b4bc35dabdca9e36", "confirmedHash": "4113cfb08ade9f1b5d935bf2d7223e28d8191bb01a7808d80400000000000000", "service": "00000000000000000000ffff88f31ddc", "pubKeyOperator": "892bda25e986cfdce112814bff6bb7f01b5bba267f503902d006ed0c30c4c27b782bf3cdfdb761514fba52129e45f76f", "votingAddress": "3M76XkziJyksS5WwKLmSq7j2KKAh", "isValid": true},{"proRegTxHash": "802d4bb1ac19cc7652b6fa72b2bada47327e7a5d991d50f6d211e403c16e714c", "confirmedHash": "b3a1ebf713fdd1ae9b9662698d9433859aa5fec8a7cae4511e00000000000000", "service": "00000000000000000000ffffadf91a14", "pubKeyOperator": "169662b0ecddb0e2d8bfcee23f0df825c97a4b5f5d3c91579c9752bf741135e93ecd7b0deb9c9cf4cfe76af42bbb9dfd", "votingAddress": "3ooRrAsPio5u16mnnfgyUussFSvJ", "isValid": true},{"proRegTxHash": "fec00bcafad7457c6114d282db8e5d8d5934d8aa0f4c7006d8c0fc4ae8a29ccc", "confirmedHash": "e78398ce8e394ab4a518b5659d7be9873962f2f6ca834f8d2400000000000000", "service": "00000000000000000000ffff2d20e95c", "pubKeyOperator": "14c66f75ffa61ab89a05d1a481cd38aee3b7b0a0586b23f81b7ee7c77f0dc6399c477f9631fcd5937bbcdf5309ec408b", "votingAddress": "BSs55vdmdpgr5yWVF4ZLFUm1cmc", "isValid": false},{"proRegTxHash": "7faef4541e13625c867f06b65314e248a98ec6a26a49d42ed2ca4cba71c17b0f", "confirmedHash": "13d658a0e54b7a6b6646795c54508026592c299d51283d0a0900000000000000", "service": "00000000000000000000ffffc11d3975", "pubKeyOperator": "829c943f21b5bda506a141161e9737408975e8ac23c89353995df42aedc0d5137b92ebbd9e413dc7dee318ce9351c19f", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "4e2c286b8274302841725adcdb0ad2bf6cafa1315455a4392ebc2e9886caae62", "confirmedHash": "c34900949216dd09b3ba0680a78f038943362bd0569f2cf52100000000000000", "service": "00000000000000000000ffff416cea92", "pubKeyOperator": "8f9031be564284d5680e840e0dca4fa1afb5d7e88fe864a7d17d845cbdc7495e92baa52c990f81f7d4c43c9980475982", "votingAddress": "qwstA9oo8L5Tie88HFNyoRMHc3x", "isValid": true},{"proRegTxHash": "33db7fe01a34c2b5ef0c1f1ca13d7a15444f146e7b1f01e7ccd2e289b0a276d9", "confirmedHash": "3e5a42a3c906c40d6d354d1ec01e03605a37e59218fc59883300000000000000", "service": "00000000000000000000ffffb9d8b121", "pubKeyOperator": "00b912b17016e939c0afb72a26360032cf986c61b0f2d69d3f20c3872d6fb8913e482d95c10e904f5cf0f88bc5e35a8b", "votingAddress": "4YWHgQUCbmRvUXQFM3h8PrmSwD7d", "isValid": true},{"proRegTxHash": "d923fc7a1fd6a082a04629f95b342313bc5215d7b93f376b09a7e9e492d3524b", "confirmedHash": "8d16e11b316b1725713ed5c4cf218e2577c92964c6c577123900000000000000", "service": "00000000000000000000ffff2d20e84d", "pubKeyOperator": "099db4360aa11016807138c1d6ff7dac78e78f40ce8d0f5920fa8dcf916fdb5cc542740a2e6cfb368a3e45618908aa8e", "votingAddress": "4YQp8dTKq7bLTQHccjMXEDgbsQmk", "isValid": false},{"proRegTxHash": "4c443a47ba9e42b447c3fef5fbfeeab266decb0a180d55ea55c9c72ea914254b", "confirmedHash": "86db59de2516f225210a10867e40541ca66c911efe9c30633300000000000000", "service": "00000000000000000000ffff9de61682", "pubKeyOperator": "8b73b8c9dab4f99ea7e6fbab3f3d7fecf84dc3089a7f78258ef12e8878567ebc1bcd964e4640875d2ab6a87118883fd4", "votingAddress": "2t1brEjKH5CSv2QhygNz2aCPKRJS", "isValid": true},{"proRegTxHash": "7f33ab3b913a0a5804db8c74e7e1bd08002538340f3d399c87a185fedcedab71", "confirmedHash": "a707c8839cc6dbe320ace8c84a53269b1fdde773b2c708250400000000000000", "service": "00000000000000000000ffffbc28fbcc", "pubKeyOperator": "89b1aab3b76ccda3df40b73c9cc911e8455679a0b613fd41f22675332439d9980ce0b867e91d2a040f293b147dc1b88f", "votingAddress": "45GvkoNLknCH4CnpdcPe6obnycuX", "isValid": true},{"proRegTxHash": "0513b601be80783c55aa6c18fd370e0e069020b34ea7dde0ea60889bc73ee550", "confirmedHash": "4a14ef166adc6b8e8520492b8e3068fb8de1e7b4dc5224dc0800000000000000", "service": "00000000000000000000ffff5fd85427", "pubKeyOperator": "8d2b1c58d70b229f2cc2690aaf33df0aad227fec7619ed1c2295f704fc7d73ff7bb97e3013f7c8211620c4715d18147d", "votingAddress": "44HojAiPtLoZJRDPMYRfK4Wjfduu", "isValid": true},{"proRegTxHash": "2e641bee4844d62d057ffe444411c5d23d64861f600795d3da539c0bca0132ee", "confirmedHash": "521a493e178f27c1ca11304af014ee6c8faffe75c9c5b7d30800000000000000", "service": "00000000000000000000ffffb2806d59", "pubKeyOperator": "8e6f4590a198f0b5c3251aa40bb333e33947814c39febcc46117078230519a73f58dd94f000fc99c05599aad8772807d", "votingAddress": "475EcjsJ4nTgVLEHPREyGWJNCrRJ", "isValid": false},{"proRegTxHash": "f07dbbda13d54b646a25aba249c794bf8361cea2237a61021f96c56dc784f890", "confirmedHash": "db6d0a972ceaf21666ebc5d0f86af63f11eb23d2ffbcb5f92100000000000000", "service": "00000000000000000000ffff128a4294", "pubKeyOperator": "0390bea817577ff49f6b0524aa344130e3645e319507b40173485bdc2ecc58faf091a2508e53fd346bd02ed590883ad9", "votingAddress": "4ANa8vdTVCnxnmLqxhP6SgNd7oW6", "isValid": true},{"proRegTxHash": "467f112cacc590cec74c53c3da6f078699e887ce72de409db7c515fe66f87e21", "confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", "service": "00000000000000000000ffff87b558c1", "pubKeyOperator": "11c0a0e84255dacf100803da7b19d4c66a4cc83082850fdc2e4e613686576fc5330956356a7eebbbe82551c966b25b80", "votingAddress": "3PmKM7NKF3jaZKwoNurA2deBJSHU", "isValid": false},{"proRegTxHash": "17ad49ab0af1d441410b0128ab7e5c5fa7b217e0380566fc84786563bed73e51", "confirmedHash": "633222e03c2305653a68cfa80a5cc8b749bd78e965f29e130800000000000000", "service": "00000000000000000000ffffa8eb5535", "pubKeyOperator": "952cd22012a638b771d91c24636d48b9573463ab9f09fcf0744371199fb5e0454b05255ce6d4252876e3c58f51cefd24", "votingAddress": "JbDH3FThCTMZCkX5DwNqyHC9Jfb", "isValid": true},{"proRegTxHash": "65fe28c85fd091c4235b2dddd1994dfc025ab1c59439fb1ffc2388129b7683cd", "confirmedHash": "59848223d313f1eb2f10aa2bd7d5b64875d7a8f74bb69b2f0d00000000000000", "service": "00000000000000000000ffffc0a9069e", "pubKeyOperator": "961832ab240c21b9911130c5952de2340177c4725c18ce8ae0bf520cb6c387500bb75eb3f682c41a1009fe53b38e85d4", "votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", "isValid": true},{"proRegTxHash": "3632965d9959155d4b8f270d94140917d908cccef1b9aaab6b715a403c37558d", "confirmedHash": "d4d6cabead7ddbfd03c09cb5d38f89bfe8fcc4be61b955d71c00000000000000", "service": "00000000000000000000ffff52d315b4", "pubKeyOperator": "008dfafcb95b4025b41ed94c02413d7c1e150f3031347fa1e6fa131c5823aa9cce2670a1cab2328be162b343225ce499", "votingAddress": "6HwGddFgzPNUP2ci54PA7dxzkE1", "isValid": true},{"proRegTxHash": "3099225260b854f6861d1326e3d01e067c9b5a11460fa754e11f3beea78848de", "confirmedHash": "0b3be649eadfdd5ff8c9c91727d42c09164e301eeedb51542300000000000000", "service": "00000000000000000000ffff2d4cbedd", "pubKeyOperator": "8526ae55259f588847f8c2fc4c793a74571e801fea690ce467b2e355a88c9d25cea289a0ae724b5af1f075b3f4085391", "votingAddress": "2G93ibbgqMhz18b9F8cHoSaXkBvF", "isValid": true},{"proRegTxHash": "e984b5e67d0b95f92c264711ad9a8c1a819a3a94f09a554559f13c927d8fb96c", "confirmedHash": "5a19cd92353030d1355cd7a7b01ef434cb2f9bbeb95eea620300000000000000", "service": "00000000000000000000ffffb23fec60", "pubKeyOperator": "925668eb37b4b0daeb7c03ce1767f4bf4d1477a2708239b9536a787bb6569a1da5ead28f01ae62697f3eefa28e019113", "votingAddress": "3d5TJLWWabickpyLJkto2r99CvaQ", "isValid": true},{"proRegTxHash": "17906f53423ef2136b141648b581e7568d3cd9e0b6c200f17f6141f75afaf06b", "confirmedHash": "ac14b8f32e610520583a5e21067b0e6119908a2edce0de070900000000000000", "service": "00000000000000000000ffffc87ab504", "pubKeyOperator": "87720be55784363f05eb83fe3660feea8da9c3e22245568d5c61e03ad55a58350eb3175b400c3d0428d14318e08e1f93", "votingAddress": "3zz7ZDa6S4mt81bJcvNFCxFzPnkk", "isValid": false},{"proRegTxHash": "41d4315160ed4950babe1b62400d3424c411840c78dea248701cd125b12c4a21", "confirmedHash": "92d718081ad7d98a77f15bd77879cf99f96715d805297ca61200000000000000", "service": "00000000000000000000ffff68ee90c8", "pubKeyOperator": "878b5eda4436f4365b7d56324176e260fdc5074582e9f683e529fed601eaa0171a2fed89ad1739f86386bd72672732bb", "votingAddress": "3bxbKJiVvYNArsfeySSZewAMQ4C7", "isValid": false},{"proRegTxHash": "cf39de0e1e371dff5b81c3d2edf2ff1dc22531ae6c5a665534aa920299c3fa30", "confirmedHash": "4130b5dc087f489c12277f886d58978ccf05fa57e694729d1400000000000000", "service": "00000000000000000000ffff52d3151d", "pubKeyOperator": "90d533885a7607f41f49095983563db64dd9c0973d2b5b369f527abad7fade38ca923f83146dc3c56fe1c7422d00a2d3", "votingAddress": "26usy5JorX13YBQSSw6PKVp7b3ZQ", "isValid": true},{"proRegTxHash": "94591a877d348c853772b90713f67348137471c463d2de1bd49017d187d39a9c", "confirmedHash": "3bf84883e02fdd972c1de4fb57bfeb92250a7935641025ef0900000000000000", "service": "00000000000000000000ffff4e2f7714", "pubKeyOperator": "8d02779cd103bef2f9933a2520b71c9d685554b2802f42b0b0edb107d2c6792e6e489d3b8e05486f2a8effb3788ab766", "votingAddress": "4G1ZngDgp4zFhV5h8fKpibXVYGuB", "isValid": true},{"proRegTxHash": "e89314aa7fc933ddab8644d6f95e31da1a09ba5f3a6b0e216ba1349dab51e146", "confirmedHash": "e3726a21938ca6c855a6f129a852216f2629eaf4b6caa2b31400000000000000", "service": "00000000000000000000ffffbca621b4", "pubKeyOperator": "81b4ec0edc8d50490f363560d59d3a79b3631a3c67c8e8f42190347465d62caed3db532ca42d2ad9a0e3915a7f06bab0", "votingAddress": "3c6r4EjJi4ZG6GSNmTnr8DMtc8xx", "isValid": true},{"proRegTxHash": "b7ecf968520c09351286ffabba6316ff38b1282fd463c3552d4306a8981dcd37", "confirmedHash": "1247b6b7343b369c10ea19d8926ba415ea0b673cd5331d8f0200000000000000", "service": "00000000000000000000ffff52d315ec", "pubKeyOperator": "109ba1e7736fd311758fe471fc7f4b91d522524ac2b56eec73b5c3f988c61584fe2982de7809278d35264e47a1eb68a2", "votingAddress": "ZU32wNJzEa4qATj8poKfSscagox", "isValid": true},{"proRegTxHash": "29a5744122b2ef591c562a976add6cbdabe9b96972ebe84670da531a5e71d937", "confirmedHash": "00bb2dc1d2afed01d31f456db92285ea6fc7a54b98c936720800000000000000", "service": "00000000000000000000ffff55d1f1d0", "pubKeyOperator": "077b399a384a27abc124a310edb645738039bfe7ebe0a516caae13f0bfb6e3485abb9b57e9c975c9270c6839e747c34b", "votingAddress": "3CnoqWX3vDVojkvjSdhjtzUNz65K", "isValid": true},{"proRegTxHash": "7de779d94dee647f14b33f54364695ea187da875401ab9fada6101230c016eb9", "confirmedHash": "9cc3668dad851396b4c797c11e890cc21ab91e1a2c0015430300000000000000", "service": "00000000000000000000ffffa747e49b", "pubKeyOperator": "0816f7c89635d08714fb09f03a620ddd67ea2579608f115f8aecd6e7f443a141300ed4e5c5b4ad9d00e8aae6cf358880", "votingAddress": "42Lyuuwgp996cKx3AZWwpWZLwfFk", "isValid": true},{"proRegTxHash": "414e1d6c450bd4ecbb46ade5b65ed5d77856e76618523474d522f61604ea26ae", "confirmedHash": "fcc2390dd6f767ffa03204bb796825a486bec661a48e0f640900000000000000", "service": "00000000000000000000ffffa763853a", "pubKeyOperator": "16fd7716c91f35a18f48f9dc33a3e95e0b7fe37be2b315ba9397e99fd284f46180f9b6934184bf785b7680c30afb178a", "votingAddress": "gUuB8bu2vLwu6cktFyY69i5R1Sw", "isValid": true},{"proRegTxHash": "eeaf2bab723f3ec8250175b0e8a3b0bac80dfcbb8addf63cac32c4c7856b8495", "confirmedHash": "de512f9b5c98115670d3c97c7515532743b690b67869d7f21f00000000000000", "service": "00000000000000000000ffff2e65f318", "pubKeyOperator": "0011a5934776cf04777470cf460d0008a5b4c2401425642e264b6e84af4aad745b4772b604da503910337d550afcfe23", "votingAddress": "3SU6VMGLjTYc2FU53pDRyDPr3rH8", "isValid": false},{"proRegTxHash": "86cb37a039dfaa3e286dbe1180bbc7f7bd029e11eee7a76da14d7f20e1373574", "confirmedHash": "eb7ffd4c49bffcd69760298ea8dc35283b455ae1b939b7c70b00000000000000", "service": "00000000000000000000ffffc0f1dec2", "pubKeyOperator": "848bd673b9fd1fb4efdb143ffdeb5cc9dc52583c3373df42f9a48846f8afe4ea545cd0d17153f00afa257cd6bfc408d8", "votingAddress": "PuvtjpAyjUHqfXeom9NuZMGKFSC", "isValid": true},{"proRegTxHash": "06325ead55670954edc32a04bcf4cf2b1616152a52c83d71a327b3af9498605b", "confirmedHash": "7882da67f9fade8445d0aca345a4a182a72ec566dfb3f13d0e00000000000000", "service": "00000000000000000000ffff4115fdcd", "pubKeyOperator": "8006121d644a45a9b95e9ef6660d0024a75f1f5888205e5c7234eb0bcfaf37e748ba620ec5fec31f26f1d9b860dd2f02", "votingAddress": "34j7XnMePQ7qn1yGaiGyF29YyRWU", "isValid": true},{"proRegTxHash": "5eddcc29c91a2ee0f22a8c7388ab3db7a69e25b834cc22799b908f2eb0fbd8f9", "confirmedHash": "46e34f43963540ff760bf310f0bc96fd51f1e2f5a6b765fb0000000000000000", "service": "00000000000000000000ffffbc28b482", "pubKeyOperator": "09c6ec183d9464e2d78ca7e33c0c9891b500b9f06b473e3d3b26584819dd58e8fc091371a076afe08ba0ebe900f3a317", "votingAddress": "46XnNs25DHZa74WjVCDo4gW1TbQJ", "isValid": true},{"proRegTxHash": "19208b27c9bd0d2b8342af1e41c537b4a874eb8c9e9b56461331482f8347eac4", "confirmedHash": "d5156219a10f493bb81e918e8fa8acbfbc58157206bdb1f60300000000000000", "service": "00000000000000000000ffff8a446a3f", "pubKeyOperator": "938cf6f56db45a6fd9885f1c0ce17536bf8b8b37fcf6e9b417dd5385d307f1d81466b689b36e40dd23180e961968b93f", "votingAddress": "PhhBub5xeDfBSbDpxoxC8Q6zzZT", "isValid": true},{"proRegTxHash": "8198de3a8cd4d152c6a35da228186741c6ca05f60e66e266c69c6a05782b8986", "confirmedHash": "94405d4fc981d54d640dd5eaf2b41ef8f4c0f7541e1fe0960e00000000000000", "service": "00000000000000000000ffff8b3b99f1", "pubKeyOperator": "18bc6963ced6cdf7add0ef3999873f1ba9b654a067e7038b0146dfa4ad0ee378b5f51630e67e53f8bc20e74a280298c6", "votingAddress": "3MkoDhgveH2iVs4Ak3XmSDuP5qEr", "isValid": true},{"proRegTxHash": "9c9a8867ae1b126b452c3d82b800c51e65b098ec60fbadd8df7335be47774152", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96887d6b", "pubKeyOperator": "11c8bb8b632288baa7bf695a1a27c08fe3769630a3998b857ef74fe521b16ab5c6ef2278f26568822480eba4935a66c2", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "b84dfe001e1ce6e351b3ccd0ea74576dcce4ceacabc6ddf9e807b4385e1d2d67", "confirmedHash": "deea24e962fac02cf223dd40dd3f1d84e4375d0d51276cb70500000000000000", "service": "00000000000000000000ffffbc28b98e", "pubKeyOperator": "10d8faa490c6dc9eab971c7fb6dc5d3bb24e9cb9957fd09526504840813ebe5464cce1b28d72397986919b627df8f48e", "votingAddress": "2saHNdMmFkxzTBQJ9BSaYbVxQEH7", "isValid": true},{"proRegTxHash": "0a4d204ec9ff523c0e48459bae41f1f35634a4b451983a095b20e30b3074565c", "confirmedHash": "fe73472c7776ba0335f76108760d4f0ad5f695b290ed771f2a00000000000000", "service": "00000000000000000000ffffa877500a", "pubKeyOperator": "848407f696713c7e4ed6453ab04eeec7c00a34fae01a6cdd76444acd3a3039698aa9a282cf2879a9aea0018599afd44d", "votingAddress": "wPUkJbq1yXdLAMbRqjmi6W3ALSD", "isValid": true},{"proRegTxHash": "d87d092a516243d5bed4dea3489b8b0e6eb9db2fde7ed95e046f1716500ae41f", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b020", "pubKeyOperator": "002705e95a6950a4b6ebe0b28a53ddc513ce484b0bf7bdaa435317ad758b871b1ac0c5ded506a8555c8a447670b7f64c", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "5e253fb84a641b1165d3f3daa0c70033b9882d04af8135d46b5d13c0dd23f6eb", "confirmedHash": "34320ba7fa4a5da7b862e96b95194c3f49dcbb9d38e51f221c00000000000000", "service": "00000000000000000000ffff05bdfd42", "pubKeyOperator": "8b683dbdd0b4aa879e91d0e9702744e6cfd71277fe4fe362e69d4edd4bb291d24c50613d42a6eadf1f2cc4682fe26e27", "votingAddress": "vYVSF8DnbEfwKqDQ94F5eEaLngM", "isValid": true},{"proRegTxHash": "aeef7174ade91c392cbf9b12f589de9e3a7fdc2ca19b9ddf1d434701bc1cc589", "confirmedHash": "ade6e48f6e6bc86a5b5bb7ba9647586e127bc537547ab8e10c00000000000000", "service": "00000000000000000000ffff2d20edad", "pubKeyOperator": "8fd15a143dcf5c58545e81388b94605dd408da1b6431c6e54e229c6b259112ebf5d99fa6376d96f9f125456b3a6e6722", "votingAddress": "3JrTagCx6Vc9tBiMBAwHPjmcg11c", "isValid": true},{"proRegTxHash": "97ea65bb19384fc00f9f7955456153da0d18a65947747ff4b0cbc8dd9fe669d1", "confirmedHash": "940b37038967c460d991890c6a11903d87231fb714ade2073500000000000000", "service": "00000000000000000000ffffbc28b6c0", "pubKeyOperator": "0451e9a20d07707519322559cd12dd32a1c94180b53eec0d3bdb27e87405b2d26c0fc4f1abcd5502087d6a0dd1ee13bd", "votingAddress": "JjYUHLANHJpaAJRPuPdhijSjooR", "isValid": true},{"proRegTxHash": "80dec15c986f4c21339754c28a59ed2a1bcdd906b3b4ce1fc6b5a05304983ca3", "confirmedHash": "274cc025def904189fe9a5e9460f4669ddbfcb885ed787051b00000000000000", "service": "00000000000000000000ffff4f621f3b", "pubKeyOperator": "91e97a5459b1a1e42688a1dd0b81e57a97a45b2b767e447c3054ffc51a14a487f4ce3f041a4838554a2ae139cbcb9049", "votingAddress": "4A2Hj5Y7QaC13GjVj9UsKEiPqAgp", "isValid": true},{"proRegTxHash": "b9f487eec5262cffc0e2ff0e8ee4c65811bfb3b7803d41e15712eb430b209749", "confirmedHash": "22bb1d80391f9af77b673853517d8e9ae38a8563714b03b32d00000000000000", "service": "00000000000000000000ffffc7f71a5d", "pubKeyOperator": "04df32ea77a47c15c0c0262f9e601a7918288e18f161da04ca797dfd613b58d29e2c1107e9d223d9dc57e0b90975b7d8", "votingAddress": "36FuRKbKvuEaP4rv8KV3uqTMkEqL", "isValid": true},{"proRegTxHash": "910558fac40abfc74712260108621f408323af0986ba250e3260430fcf2d85b1", "confirmedHash": "bbc33a876db66f415bb3ff72eed982339f62cd435fa0dc231100000000000000", "service": "00000000000000000000ffffbc28a31b", "pubKeyOperator": "94a2c229ff64bbf5f5a6bf99ff7f28d3d48b373b8e8a091f73532dac66ea1f7f3bfec077d39734e82e511cffd618f5c3", "votingAddress": "4RexCdVUSuCsYwJmxFdk87vaB3BW", "isValid": true},{"proRegTxHash": "598d079b604734d8d1505c0b0d01c40b6d15aa13ad4e1b50c73b73c85274a731", "confirmedHash": "82e94c9fe5593982c4999be1df2e329db045cc40372137cd0f00000000000000", "service": "00000000000000000000ffff05b5ca16", "pubKeyOperator": "9269d4fd9d09a4ef113779ef1276f937c837638e5cca99ae8ba60dcb2dbfcfeddfb9b300b70b353b998697b2afc0127d", "votingAddress": "3RSqtuXCAoKHVuLfu4RKv4tXQWtE", "isValid": true},{"proRegTxHash": "e60eb8d55efc2442e8365ed49e0ef6fe44939dfa9322417448338e480b3facfd", "confirmedHash": "3d75bb899edc3b8dbb9c25b2d877704c764a2fda6f4eca6c0700000000000000", "service": "00000000000000000000ffff4e2ea277", "pubKeyOperator": "01d446917a9198530cd0ea3910363878d7549636f85984b6082428fa23b701658e7b69ba96cb181bd81866c3111400ab", "votingAddress": "Nanm43HAKrK4fG21pxoz9SA3cb6", "isValid": false},{"proRegTxHash": "7cf94bfa50d8dc6e87386eff6f6926bbcf353fa482ee069b1facdca2fc4a85ef", "confirmedHash": "8f526a67f561825fcd9b8694293107c77fb7bbc9268215d41700000000000000", "service": "00000000000000000000ffff8ac59e2d", "pubKeyOperator": "98a344cad6a9060af4b3cd5867773f4b76a78adeba927c8c876020c650c0367808ad34e8f3aeb6b709cc962f71c77408", "votingAddress": "d3Cusfy6nmknTnCokWHL4YWf2v6", "isValid": false},{"proRegTxHash": "2bcd398d2c82e4d035a4ab55b99a16b67f0b181796ca0f3b2449b4d38f07d643", "confirmedHash": "7abe463414e45de8da88109e709007bdc0903489c8d493380a00000000000000", "service": "00000000000000000000ffff5fb39735", "pubKeyOperator": "0fd85e12d16c12faa663161c9125e6334f1943cbd00beb2800c9ab35842b43e526138b775d35c842f9213baf847aecc4", "votingAddress": "Ji4YF9L9HrwWnLYujpKR6CnRq92", "isValid": false},{"proRegTxHash": "5b6fa1448eeae5d13033ec81b9cc5cdcdf5f1dfafc62d6289a8c5929a8e0e486", "confirmedHash": "085cc675037b2128240bb74e756953c4de44b21afc89c27d1600000000000000", "service": "00000000000000000000ffff36270a6b", "pubKeyOperator": "82bcb7be79a10a50e0956e0ea0584afe89cc02f110c3274d35201bfb9e1d3d154d1933dcb92760ea4fc594a622439fd9", "votingAddress": "yXJgpa4995s9Ntuwc25psRVMNzh", "isValid": true},{"proRegTxHash": "95a749d15901691dde6569f88e7e8b2d2c99863acaaeb8a9af0209673d849821", "confirmedHash": "85518800e57ec823d44a71028c78482b9c449f950eea636d2d00000000000000", "service": "00000000000000000000ffff55d1f157", "pubKeyOperator": "82a0ab8b2fb3526c0b9eb9c074daea315819e74e93ea981e76cba364661deb0c0c57f835ebacd9c1b73d060d343205ff", "votingAddress": "2Tp5UkNAJeFkgmYMoABRL82uxkck", "isValid": true},{"proRegTxHash": "d048fac849b904923362f78d768d335c28c439abd9c370d2c5afb300680f31b1", "confirmedHash": "d4d6cabead7ddbfd03c09cb5d38f89bfe8fcc4be61b955d71c00000000000000", "service": "00000000000000000000ffff68cf8236", "pubKeyOperator": "06950874b973d4567db300aed5340399f1372945ef09d7f47b2000ac697a262c038eebe443321db9a05d99789e77fc9f", "votingAddress": "2knaEJeWaai1782TLktN6Ck5s3iw", "isValid": true},{"proRegTxHash": "e83e5e3cfd67de684a19db5458f611240ef7616b0d60d2ec4b17c9334edc00d5", "confirmedHash": "970e2080a4bdde56cbf6abe9dc611320b681e922c11af3a30500000000000000", "service": "00000000000000000000ffff55d1f1d1", "pubKeyOperator": "92d2d3f4b05754fe05f0b9ac68a08681568a76d6f7b108babcf6bc00fd1db7595b1e0608630264761e9ab693507ab3b0", "votingAddress": "2arvRPDqzxf2Hs5sMouzxLW2HC7z", "isValid": true},{"proRegTxHash": "5e0ccfd4c7d70c39f22e6012086acec0cc8af19a90bfaee08198a11766c3de9a", "confirmedHash": "2c5ba6d60308ffe90ab3cdd41c883c717cfc12719d5e2b1b2600000000000000", "service": "00000000000000000000ffffa4842aa2", "pubKeyOperator": "0fa45210a8697b53a01fbaae4f27687f5ca8840308c366f02b796415c13b3ee19f1b4827e36a4a1b092a5d180560be19", "votingAddress": "36XJFEZ8rfbPEUUvLttgMNJGnFZn", "isValid": false},{"proRegTxHash": "06ad1fb6a5edf0c74123c53df34bebf7ffd2a4d62f2e3538c5202431bb418a85", "confirmedHash": "fb059e4162128b600c1a3c111ff2f5c0f6224de310bf419d0600000000000000", "service": "00000000000000000000ffffb23ec65e", "pubKeyOperator": "99ebb19ea556546d8027f33615cad6ae7c1f2cd8bb602f56ca082090a2a7f5b45ab1dd87e6623062bf83d52264889834", "votingAddress": "3NZeozz744V2he5x4VeKCTKUa2TE", "isValid": false},{"proRegTxHash": "8fcfda67d4713276b203df75f06edd717cf05b8a38787580a499501a3fce0af8", "confirmedHash": "0bf210b5eded9f6eb1088f8cc88f41c6b7df5247950070d62d00000000000000", "service": "00000000000000000000ffff44b75c44", "pubKeyOperator": "952a626f6d528d5cdd45a6e2259af1a8b35521404cc2c1b26c0457fca3df2b4e8b3f4d419bcff424efbc8347c75776ff", "votingAddress": "2MScfMJNTXL5aFwNuiXKBypck7SN", "isValid": true},{"proRegTxHash": "104f5d4213b543926ea781202d690169f0640803f733ca869904fe01db16c962", "confirmedHash": "0043d0f5c90932ef64b282a9903a5ae994e9a87423fc78b80b00000000000000", "service": "00000000000000000000ffffd8ee4221", "pubKeyOperator": "0b072fa1d9fbec27614cc1676f52a971e848b40ba82f0e735d0d0f15ab6a1355f1fe51cca74af47b5d9291d3f3042b30", "votingAddress": "j7Z1QVczYT4xonT5UjxaVGcESDe", "isValid": false},{"proRegTxHash": "0023f8df6ce17facff4d3f3459f679ccec23a6c06ee4b11e0fa34cfcb74fd5e2", "confirmedHash": "f9b8e1fa38844ddede7d0dc1edf98dfa14cfa1850acb8c570000000000000000", "service": "00000000000000000000ffffa123529b", "pubKeyOperator": "1234af4a3a329f8bdccce386617c85ce47cfddb5dab17dbca04ec95900946ad9bf0082a7d3f0df83019ff8065eebec29", "votingAddress": "tvGwRBFT1jqn9b1kD95doZCGRtn", "isValid": true},{"proRegTxHash": "76d2803c7db1990df86a3dd37349cbefd92ed0ac75556e6eaf779886125f495c", "confirmedHash": "d70f5bee9b84a7c75d9578d3e374077a3078f46ec38ee1a60a00000000000000", "service": "00000000000000000000ffff58630b13", "pubKeyOperator": "8f199bac676465c83f018e27b3934cc12cf8d63ea32ecd147cb814846888eecc16d17ad6a4cf1629e3d52398ae28720a", "votingAddress": "24Dcirds2eagacfiwsVukFVeZ63E", "isValid": true},{"proRegTxHash": "8557de2f7b6d95e801c45127c87c7221dcbc603b0f7e2f0465c0fd7a555db1d5", "confirmedHash": "91a6595f7fb53f1f09f9df2e741120864738144ed1f9572d0f00000000000000", "service": "00000000000000000000ffff55d1f276", "pubKeyOperator": "02b0c862969e728a3df648f795eb3fbe8271ac74246b4232c40767efeaa12477cf774aa021abcb7f949ff17d4e74d057", "votingAddress": "2PVrGdrESAVX6Mg19GfLVKvpqGeo", "isValid": false},{"proRegTxHash": "248056d052d5b0e796d297af0a0163ce918146bb4ec7dc0f341ce1c5193b9925", "confirmedHash": "d4d6cabead7ddbfd03c09cb5d38f89bfe8fcc4be61b955d71c00000000000000", "service": "00000000000000000000ffffa87757c7", "pubKeyOperator": "968a0ed3c5fdbd18799d82cbbd70cf870a29f16f718c4969dddd64cf54bf9d7677d16516e8515a07b3a2ad01baf09594", "votingAddress": "2vEtqS64Wur8dRDdRdXbRE2XvRp7", "isValid": true},{"proRegTxHash": "a03e737762446ab4972061ebde400a3abfb55e3f3bfc7c0a3de4d4d14233564a", "confirmedHash": "89d564eb63a1cad6af949b4beee8b66cecf6cccef428d26d0b00000000000000", "service": "00000000000000000000ffff2d206311", "pubKeyOperator": "85a101655ac3740dd6607de492f9912925694f13f9699e8416cf63894cf5ec131eee96a6e9e2f57f89437412d7fafbde", "votingAddress": "FMhAiTLFSvoZGy39xb1NQ3RUji3", "isValid": true},{"proRegTxHash": "e76744e6d17d48bb441ef8b58b63460776beae63e61d0bbd9673626e5859939f", "confirmedHash": "1be758139421063d44b2265542b444a4f070c57b18ee01821100000000000000", "service": "00000000000000000000ffffbc28be20", "pubKeyOperator": "0c886a216422dc63e24f3d88e7e0742590c0d07d0020668c7ec4cf7f7781f3c851d748e38308a4a4e657325b03dfdb51", "votingAddress": "2j2kS46iyDknEBF8WF95wSgMyq9P", "isValid": true},{"proRegTxHash": "7c653de8539227e955d3abc7c92ef2aebbed5d862ed88efefce5f642222cbac1", "confirmedHash": "cd6af43f567dbc86fe03a7b905972a249dff15af8aaaea811000000000000000", "service": "00000000000000000000ffff0feb8c78", "pubKeyOperator": "8361eb1fb71bb65e15feae965ed0efe09e0fe8efcab324e75409db9fd0188a1d7aa07a052beace8f0dc274873ca905c9", "votingAddress": "3LU9Vm1h3yNiJEQaKYonwrjEoiMu", "isValid": true},{"proRegTxHash": "d930726be7e4386b75b321002d2a5ec69c0faf8c61c98b24c3de37ee95c68e14", "confirmedHash": "255d1e3e9fb9e79a7d177951b7ba424de00d2910e6e9792e1600000000000000", "service": "00000000000000000000ffff3624a628", "pubKeyOperator": "16b3774a7e9ab12867577e537f7c58658833b966444ea75f265f535d628f28ba2379e82ab26425b462ffb5098281bdad", "votingAddress": "2LmhU38gVkXVhdF9ufnHFChrW5rn", "isValid": true},{"proRegTxHash": "a84321642e421a44369d1e75c4e34a0a0bd5df7db9ab4f5a8d6c825d1e684ef7", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff036304c6", "pubKeyOperator": "95e0932f51d58f42b57c76d76635c2514e36c13f9f7fe381653b5d996c5ce37c6d64e93aa1aae8aecbbcff2c3dbced52", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "7018eca35052bf196b17fce6ae694f6c5f505f8957a0b4d47547c611858a1f02", "confirmedHash": "fe7dfa4890215028e93637471a8e7265c228f0c004f7f1190600000000000000", "service": "00000000000000000000ffffa7ac32ba", "pubKeyOperator": "82f57f3bb6a4559303d734a7b0ca0f435c92f810fada3ff165fd98fce7b82d3721fcdc9c0605c448c11ffd416df7b704", "votingAddress": "1YBf3pWGg9e886CsPJCLjwzctqi", "isValid": false},{"proRegTxHash": "bd6a8225a24ca083bf584ca166baa71e6e696969c34696e3cce2347860df9a80", "confirmedHash": "daeb28d4cee6639a1ca6d52d009dd946e4a24b510086cfab0d00000000000000", "service": "00000000000000000000ffff87b50feb", "pubKeyOperator": "802c0e3c24631d68a0c90cdeb23f5389b31bed81fd545724291f62d2468ea44ee6d457285c70a2eb9937ff98ddf03438", "votingAddress": "YWWArhxFgfhQEtA7V1jBEy2yXNq", "isValid": true},{"proRegTxHash": "e13afbd7b58a04d52f3c1445a912996074851c5762b681bc4099d0cb7d9726a8", "confirmedHash": "92b683438f3e5e5d94bbbdb09159ea8ac752d0ae4b5aaf641400000000000000", "service": "00000000000000000000ffff55d1f26f", "pubKeyOperator": "15461bf76858b112b6fd1a7654a4ede044f3fb5b85cfdb2a4f10c505e6a2f5354ce8ef8eb6d166f51a6d2bcb4a5b6d0e", "votingAddress": "a3PFfSbQgbqAv44ZWWnwknHHr1F", "isValid": false},{"proRegTxHash": "2e6ee529b55737b2b6b80e10bf42423ba2d2383c83758f171093523da8ff662e", "confirmedHash": "a303a49480c3ebb4b1b66d10cead6b05d9c956d352ff2d6e0900000000000000", "service": "00000000000000000000ffffbc28b843", "pubKeyOperator": "8f62e02914fdca043c5ae3111a62b26b4369b4addde612aa20c3c1b608caf43e375286874977c7444dd8e4654adf2edd", "votingAddress": "46p6MGzD792SKSLdbn232XrpV64X", "isValid": true},{"proRegTxHash": "11b89bd18f560f2779ff14c2f333b3d409a28e651fce1a0c263f0c5a37af421b", "confirmedHash": "8032a73c0f4f4cf95db23188177e4f077bb0f95fa60e36941800000000000000", "service": "00000000000000000000ffff2e04d9ff", "pubKeyOperator": "11190a114c1a71448556f9c2729d9516b6a4a6c91d8e4cba6faa3ab8c6a8ad28081f555e87b14d3e19e329e62712fe2d", "votingAddress": "3dQwg36nvxLgp2P5omGdL88rN72U", "isValid": true},{"proRegTxHash": "8a46463a0c6b890d08c003cfc7c62e117d179f9bae0b9280919a6b4c29669914", "confirmedHash": "4c6fbeed25866e48fc5ef727433ce25b0eb65477beb1869e0400000000000000", "service": "00000000000000000000ffffd418609f", "pubKeyOperator": "0778e947f5e87fbf713c061829dd0d7c926cdc502c8dfff5d53a7d746f0ab7debccec5bba6b81d4495c1d90e30b71fbe", "votingAddress": "FfcjgkHwH53vEbHXkV9yY5dNbe3", "isValid": true},{"proRegTxHash": "a329196cbf38ad984099a17d9e32110696399bf1a29008d2b22ee15701cc58ff", "confirmedHash": "58e240a154a0ac48dfd26143fb8ac7413aa11d8f10f16e622700000000000000", "service": "00000000000000000000ffff5fd8ff48", "pubKeyOperator": "80113626b7a736c08fcd2d78a280757c38974ddbf907943113c5613fb78a0bafd31aed2399b8743e2e11ebb6380db33a", "votingAddress": "5iqTojycKGEwS41VexVQ2YhL5Ed", "isValid": true},{"proRegTxHash": "216283c8488447cca2c97ad8359f5268ed2df1f543f08af1b6f7d6246a01ec6f", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6d745", "pubKeyOperator": "812cb2d0b8db85eb44b7c8fc6a3f8e72b75c87b4509291397d7a6c4858ff7f1fbdd7282357d21bcff9d8df22929a9734", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "679a8c7e82f9cac6e72d992b18065e92b10febaa5c14d48f4ef98024e0df7fa8", "confirmedHash": "96c4ea2c4487e3486c40887966879cd67508a2d435099b8f1a00000000000000", "service": "00000000000000000000ffffc39ab3f4", "pubKeyOperator": "87c46e6dfb175e34d1b2bb999424c19e92780a017eab0bd15ca61f4efed103a385ff807ae1ca4b6f14d105801a6082d4", "votingAddress": "2XiNcGZqStBWAzEjoFNg1DjN3woa", "isValid": false},{"proRegTxHash": "40b665c36354729eef40c01fd68299099627ba65edb5dda1b6b5acd2ea3ca11b", "confirmedHash": "b1d85829d008a920fc08625f68dbc8083f24b41aad66e7dd0400000000000000", "service": "00000000000000000000ffff5fd86d80", "pubKeyOperator": "03bd90a09a7eaffdb1c64cf43ffa099b667ae863e9c4522b8201c89ec8f3c5baca18757d56f752ff6768217a27f666d5", "votingAddress": "dDVegpeL6yCijB7MB1ity5nxAp2", "isValid": true},{"proRegTxHash": "0a08639b2a1e534977d5ef9546b8ee2af4b165e65e1124f82f26fcdddbe4d1cd", "confirmedHash": "e0dc9e6adfc37796d7d713fc85b404734448ce7353b4e2861c00000000000000", "service": "00000000000000000000ffffbc28a30e", "pubKeyOperator": "81d5704120f893bb967df853beb7d0efb1f68480b3aa8550aea6b97a5b40ec4fa6bf08d329c27c6ea06ddd568d05481e", "votingAddress": "32k7nmcawiWKEfPqTwR1LJk53Xrh", "isValid": true},{"proRegTxHash": "8e28b2f13e6ed6fcb8e6da16c093f60f78bdec98508967f7b8b782ceb012ff87", "confirmedHash": "f41993b1f67681a12ad2f4633fced0268d56473297ff9cb50300000000000000", "service": "00000000000000000000ffff923b0632", "pubKeyOperator": "11547d19e1d1ff4de0b675fadbdcd40b5d2a2f2b93689e5290cdb974b315d016307104e8d658c7263c994c6b07f925a7", "votingAddress": "3fYm5FGxNMpuNm3zUmWutEkr9aBE", "isValid": true},{"proRegTxHash": "87032b75b3d89bc84f223ba81dc4984f913c2ff3f682cffc9cb6a0335eb9b961", "confirmedHash": "56b5fb807477a8dba68456dee12fb3118706b592e85c1f841500000000000000", "service": "00000000000000000000ffff8bb4832d", "pubKeyOperator": "9412f798bca41e20b91e27292cdeeb36e27a0097f37fe53fe27a0d7ee443fa4fd0ac1b0957f3e021b78220a6dc4fcdff", "votingAddress": "6zQ7Vu8VBf2wEUkAXgPpdM2JkfA", "isValid": true},{"proRegTxHash": "084c674e9a23c3a65af777c2e773542c1db5a7fccbd9485bbb94a7fc97d669c0", "confirmedHash": "1ab1c3e058f597da53f7797c09136a66358a9102ee04bb371900000000000000", "service": "00000000000000000000ffffc6c77c32", "pubKeyOperator": "9845f051390bfd3e39f1051ccbb8997d569ebdb1265d304c688e18731c3d072d60596e91be1d9e4aa210b075ad63c30f", "votingAddress": "25gAhoFeFPj1kipHwhbr9YMeyUJe", "isValid": true},{"proRegTxHash": "0affb2fc3c9d7dab512629535fc1c6f5a1827472802b3c6afc84d33d777147d4", "confirmedHash": "62cada33ada87aaadfc09250fdc8a35a1af2e53291d92fa40e00000000000000", "service": "00000000000000000000ffff55d1f19e", "pubKeyOperator": "97f0ad66870855f38f26abeefd92577f6ec2050d40a93f715ad9f4c0bbd25551aef37b96e2811a679665f64062020a47", "votingAddress": "E4pEthG1uPRP4hzqZcr3fEYL3Kt", "isValid": false},{"proRegTxHash": "c0bfadec1f8310dd82540b74cf9f1ff6fa4c7440fc3aef656e6b9b47527a0885", "confirmedHash": "7dd645495201d93bd6900396de3e6beef93871983199fd850d00000000000000", "service": "00000000000000000000ffff2d206dda", "pubKeyOperator": "99190c97478967d9706bd44e01525057c4fd2ebe8351de65768526aed90e9ff2f7e22244c67a7fa929def1254c430e1e", "votingAddress": "3Qxdtx3CsZm56mbNZ997emsqkmPu", "isValid": true},{"proRegTxHash": "e40f8d60e5463c211cc8ccebc4dca281273f909dbfd6eae453b9a483d3160a45", "confirmedHash": "daec1bedd20b405a59a32888650cc0a384f5f5b42856076f3800000000000000", "service": "00000000000000000000ffff55d1f188", "pubKeyOperator": "95df01deccba5f8ab1b7517108fca9b85da5f92c74dfbef05d7c3f1cd6b07afa49ad9ef2745ce689f09f07f770f82a2c", "votingAddress": "2Yk8WtdD6rssTMsUmPVHNpsFv2RR", "isValid": true},{"proRegTxHash": "fc948bde51153911e54042f3e0143301887a8ee6de4e89dd8c968acf320f5508", "confirmedHash": "1e9fda5bb5be9898ae2f0cba53fc83346a1f7117a941d4081500000000000000", "service": "00000000000000000000ffff05093dfd", "pubKeyOperator": "19b5c9085d451ba2a86e22ed071a183968ace44164e2851c77062e59d3dc88909a5b2c20516bb1f34be8e91565247c9a", "votingAddress": "4YWhN4d3WgdXmJ28pmkCMuKSzjVM", "isValid": true},{"proRegTxHash": "bcd0f822acb7c764ec518d6447d7730d35c2f2e9558f4586ac1d71b30bd0dd20", "confirmedHash": "de6739592b59fed6716eaf418b5ba1e5366da03ca48bfe0c0600000000000000", "service": "00000000000000000000ffff55d1f1bd", "pubKeyOperator": "99d28fead930db0fc25e5d23eefdb6aa51d0e7dbbc3247a211751ef42e0e28e882ffe04599d140f1d554caf1d8636b89", "votingAddress": "36KgBAD1EgKzYwizd6ChYfMfjDW6", "isValid": true},{"proRegTxHash": "01b53cc51fbfc164178e8c7108e94edc9b70df6303bf0bb07824aa99e345e5e7", "confirmedHash": "995950cebdec9608bd544fe715a95acd996774d10c73036f0200000000000000", "service": "00000000000000000000ffff34ca8d3c", "pubKeyOperator": "04fcdb4c68b6822949058a6f9395dc7fb31709ed72c96a6122cb77baa011afa5e29f60561a7ac0b8185adc686ebe4e46", "votingAddress": "2qokNyoQmzYR93SHSyJWTawT6VnQ", "isValid": true},{"proRegTxHash": "d6e2a6ddca4a5b2c628a8e799327c67d495418ed01e95a16e665f6e39fc44df1", "confirmedHash": "cc12ca4ee0d2ac8230d702969ae5de1342e44496d6cacec70400000000000000", "service": "00000000000000000000ffffc051dd4c", "pubKeyOperator": "119cf857f13ccb50e0832a4a3ed0a609391d9bb5fede006b80a1b7dddd61391fcef1755963b9517409109cab4183283a", "votingAddress": "33dVy6qE8WczZZhTHiwb6c8WJhWY", "isValid": true},{"proRegTxHash": "9a65e13d157edd8b4c0c1a973a5b0a40c2534d2c04b85dbd91a0ba8718595d60", "confirmedHash": "601e6145d82c195fc7662679985dc885fabd2375357b0bca3000000000000000", "service": "00000000000000000000ffff34ce8e82", "pubKeyOperator": "0aa401c833e3edf504dc338f67cec1cc0d94eb5d5a0d6b1b8d1e989a63638cbb77415637ecdc9d3bbf0335907c485d55", "votingAddress": "UA1UgZyt8RV1v6LcDTk6EkToeff", "isValid": true},{"proRegTxHash": "e6613c209aacca72457f26ce8ad47b4b1850faf27f7a157c3643fd8777f8f2ab", "confirmedHash": "9abe87be222cab18addae002c3a974e1b05e398493ebee3a1000000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "47Dt3JnTNrr5gJux3WyNkoe4NKUb", "isValid": false},{"proRegTxHash": "68b6ce2f4295760552a60b66b0eded8b71c977c29514c520e14fd251ffaa85fe", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff968896ae", "pubKeyOperator": "08cfdeef1a4bc730e9ae2c2c537572442ce123df1b608b6fbaf0c85fc8c854e2d522052dd1508627c94a54227dd06187", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "f1965e31d1628228c4913dda8ecabdcfc50d0f308a9335f8fa5105f3b56ae965", "confirmedHash": "a87f1cc3ed708b2e267af3049562c90ee97d6af728f362000b00000000000000", "service": "00000000000000000000ffffbc28cd0a", "pubKeyOperator": "0d8839b8d7b4cb1bf79851ea6ac572c1d1b8a6facba5583da1cd57741b1b4528d0da6a7f3abc2d7296458d20b6059893", "votingAddress": "2Bisg2sxnFoCZkvBreBRPWMhAH9Q", "isValid": true},{"proRegTxHash": "25561202391061db3e4815f319aebf4b203cf4cd6589d3ce4181b95459c242c9", "confirmedHash": "6f0ad2423f11a9a9d0935956979411cd72434e5e360c4bb63400000000000000", "service": "00000000000000000000ffff2e1ebd14", "pubKeyOperator": "83560c4e3eb95a0ed4c549bd59b1f6a2f01b13f61adafaf75a442e57825852d330dc4a4163c02da408bdfbd8896a7c43", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "7399c3cc4ee74540d88e176a7ca83f87a4ead97899658661054c68370f0a8683", "confirmedHash": "78beddd755293d10ea0e5075820182fb9597525056c947681f00000000000000", "service": "00000000000000000000ffff52d3190c", "pubKeyOperator": "0d2ae1bf3cec9715c02ae4214bfa051a55466eff01ffa2fa01265989de7e1c671e8fe0efd121377245becbc7f62fddce", "votingAddress": "2rGBU2YZmpyWQqGb5RYxfuvaFhja", "isValid": true},{"proRegTxHash": "3dbf4adbffea13a29c340d65518fe7380d48fdf4994c95b504b8212345da8a4a", "confirmedHash": "91dd8d38a8c9cf054976c25fd0acb21c7cd65fa9e2ebb3712200000000000000", "service": "00000000000000000000ffff23ac41b8", "pubKeyOperator": "81784ba13545043e708f8107dd859d370d31aea5a6a7fd567237d0642c38ee2a0ff304983d9446c1b1ae7b0e45c45543", "votingAddress": "hMtdzA9CtomGXFMwkmgZHzkdjUg", "isValid": false},{"proRegTxHash": "18ca237e699af437e740a7484ca5ae01c9c5a4aaf7de7fc3fac6b9b3f4065d13", "confirmedHash": "bc89e1d3644686850509ab46fd9b972e457d12ccac88e56d1600000000000000", "service": "00000000000000000000ffffb97516ec", "pubKeyOperator": "98e819fb14b83ab5ff41d7fa67b319791ff36528225b7018d87a9ec3fb57de3f56eebdbe7c15e1d930e77f7f698514b3", "votingAddress": "2ogrjPp6SaVHusJLGwqeCCg6Fs6z", "isValid": false},{"proRegTxHash": "a665023825e91fe574a22df9c18597c4341098ab56fe6f72b64e5f8237f3dc82", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff84919075", "pubKeyOperator": "0cb5d40a06ddf5220f48ef1ff1b130b4c342f6ba82a49beaca3570a662a75bb231dbcb665e4ab7514f969a317c898868", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": false},{"proRegTxHash": "4043cc0e1f17bbf21879a9cafc4fb906c455e0162c14135ca7c0a17bb998faf7", "confirmedHash": "42e8b8913740c3dbb938334f4f057ca2d1e49bf9b66f7ebf0400000000000000", "service": "00000000000000000000ffff90ca4f8a", "pubKeyOperator": "9594083950d65f3b520f05abf973a0c4c78fd6df4586cf01b307dc81e671fc72ed541f3f93f295c742d770b0fe76d09a", "votingAddress": "EyzoMJGJ1cLHVJcPdkkC9tVmcFs", "isValid": false},{"proRegTxHash": "1ac1a3799e0d622908ffb49cd152fee231b74d224070da63ac360769a42323f8", "confirmedHash": "fd4904b79f40ed3e1d4f36efb712e3841acd80397fd3dc550f00000000000000", "service": "00000000000000000000ffffa87757c4", "pubKeyOperator": "0c106348d6b3000c8d41d80f2a3ceecb5ef1791fa4b490d439737baec101ca11baf3ab53c27503b808f367f9988c9ff2", "votingAddress": "3QpKER1dG1EdkMrdXypZiYNAob5D", "isValid": true},{"proRegTxHash": "44415e6ff0f164ce52bc6d36031bca0b56b036faabcce9a7117df1101412c0e7", "confirmedHash": "1a8f890ab7384594be16334c0d8d0c47184c7e1020295fea4b00000000000000", "service": "00000000000000000000ffffbc28e70b", "pubKeyOperator": "80de6f6b2b9137fab1fa8dd8d61de04582a42deaf8c6879f62d8d48dfae9c71a2129c23e3de354b21de76b4f77c014e4", "votingAddress": "4LK7xSe893NnZtZSu3zTBYquCQn2", "isValid": true},{"proRegTxHash": "fb0c4cd72e99ac5e0ed1d3173bd14e3b7e9c02bfb6545388d1fdd2cd3998e11c", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96880d86", "pubKeyOperator": "0dff79434278d0fc382843906f79d6285d28755e887a96561e900b2c56554116b03f826a6b56d9d3eeada1bdcc2367ac", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "5631403f71432a61f786ccc4f573f1f4005823d62b26e17c5a834fc22b5e4bb5", "confirmedHash": "92e88e8c6db10d1940f2ac18144fe08855106086164582001d00000000000000", "service": "00000000000000000000ffffb0df8508", "pubKeyOperator": "8c3e897f918f6645f8a6fe6f5b71d7e0bd9a86a8f1bb8b07b1df4aae04e86a428c69cbe9237564fba35f773bff44333d", "votingAddress": "2nx2o2p27vmvbVFjkzgtWa9vop3V", "isValid": false},{"proRegTxHash": "d844b865493b34f33505f4e7b643c4d087f6544245d07a96674ac69672d00ea2", "confirmedHash": "60e0f3fdcbc47cd038384cc747e163d00ad92e094b2ca9712200000000000000", "service": "00000000000000000000ffff52d315ba", "pubKeyOperator": "8e0487b120a7787f4c79ca8d669d86400276439f396b648143d7285fcc771d2e2fe941ac8309a77fc6ad14ae0b86831a", "votingAddress": "28mdJhqfBsmhRtkrJPDiNqk1f2hc", "isValid": true},{"proRegTxHash": "1f800d072f188325ef3211dbd529bae044d151145e040a06468d2b7d0be3b4bf", "confirmedHash": "11a8c8a8e63dd7564218f519f64c2e32e5e52ad3032d23150e00000000000000", "service": "00000000000000000000ffff2d20930d", "pubKeyOperator": "0ca6c2cfef46803dfff341f7a4319d3e6e2f2abeb0bf4a976f95298b1a343f073ec8e5d83e58f1014fe690a7066b1a66", "votingAddress": "3ViZgD9e9UWTJ4kCWM7jatXnT4JH", "isValid": true},{"proRegTxHash": "978ed5fd71a5d275a7c7f0f1cc82dee009f7f218b9c2d49ed0cfb082d807bb8f", "confirmedHash": "685398a98d3c34390a78b85b4682300bc07c0806c39f9b320e00000000000000", "service": "00000000000000000000ffff55d1f116", "pubKeyOperator": "0d010e41d82c46af766e55184354919f888ed9f768e2b098fd3fc5954265edc394976c01e1378ddc76970e3bca5982e8", "votingAddress": "4RKtwmNjPBtCkujArGfYNUq2Wu7J", "isValid": true},{"proRegTxHash": "ff0370d95c2371641b271ffb228d9bebb7d95b5633ce10fd720be7c8bc3dfd02", "confirmedHash": "00787909c9b5eba48f1473f57bd3114b2b1262a7ac3e74831f00000000000000", "service": "00000000000000000000ffff55d1f117", "pubKeyOperator": "06ae7797effdf07080c191285de378a54abc70a6c1f1dd574e5c03fe25d5f41c74ffbbccbc48c3c74d96e0cad31375db", "votingAddress": "2eJvVQ2Vs77jfgpReUJ6RhzEhuYn", "isValid": false},{"proRegTxHash": "ce9959fcf0919eca0839012481fab0c1b9aa9414033f7dbf3b0048385c86c04b", "confirmedHash": "32cd85e933a08ed5036c45050497f3ba60e70f2fc72f87931100000000000000", "service": "00000000000000000000ffff2d4d81eb", "pubKeyOperator": "86b4c161539aa8643d4328b8f09f185ba4851c99b08c3ed14cb3b8a6bb932b7be2fcad59df90bd3f3710aed2f44d7eca", "votingAddress": "cXGocxqUckPJsHiH9kXWsUdiohz", "isValid": true},{"proRegTxHash": "0762ca74db0b39f6c0096caef33c94a939330fad228cd53cff38405a0715f225", "confirmedHash": "30bd8c4479d00d94505fe080ca944a2111b3865b412eb9bd0c00000000000000", "service": "00000000000000000000ffff80c76acd", "pubKeyOperator": "072af371d942c038e44b0c64a0b1928bf41f6cc5cd1cdab3788384097e3d6ff029f59cf02d553ad406367a480f187c7c", "votingAddress": "9gtN3RQHVyz9v6gYFso5JyquyNn", "isValid": true},{"proRegTxHash": "bd72c11234f7c0f006b7c19e5b75d45f47d9debffec782d0378f5afb305bd02c", "confirmedHash": "ff2601341ae00a42839c23f79a8f6284d06dcba41f70fa871100000000000000", "service": "00000000000000000000ffffa45cae2b", "pubKeyOperator": "80d1edbb907c3fcbf8d06a1c1738093d185be9fbc0abd5541413922568aca821fff4d6b6c2018db30592ba01e486d237", "votingAddress": "26htyC48F4oswK2pHeuSrFmrC93i", "isValid": true},{"proRegTxHash": "c21328b5e9a273800c39f5e94d950b5aba1ccf8214fd9e37d9998e774d7329d7", "confirmedHash": "a443ab7cced073607a6038d11570af1affe2525583f034dd1600000000000000", "service": "00000000000000000000ffff52d31996", "pubKeyOperator": "99aa3c041280376831237e7294afc4f30febefd201dec29cc282a483c608933ccac630ea6a38defef2cf7e4dd03170e0", "votingAddress": "2z89eK4gxavSQPbsZe3VhKgU6Di2", "isValid": true},{"proRegTxHash": "6b9bb6f912c39e21c4885b5a022309137d8fc74695b04fa1f430217d41b9a2d3", "confirmedHash": "be07ee55e45e7ac1585c923f114ec777b10b9fbbd76231c40c00000000000000", "service": "00000000000000000000ffff55d1f16f", "pubKeyOperator": "8c120589e88547cacde9bcbc81d3cdd328aa3a6dfe99376ca7ce958faa5ecc39da21b79c72750a14d20f9f0950a814e2", "votingAddress": "3mhgGQuwnPKLgpngkTkRPRbM8X3s", "isValid": true},{"proRegTxHash": "81dd56fdd72e2d6c6ba8d9728b7d80ff3dc1cf3284d62df4a8731ffcbe345195", "confirmedHash": "9eb1a344d22d6b65c3e3e9fdc70d778310d8fc3646cd57111a00000000000000", "service": "00000000000000000000ffffbca6be49", "pubKeyOperator": "98dbf87f36237b7bdd84398d00d75243b6990dc3434310f404e1745a0298b422d6054bac40fe4bdb97bb54626f59f0b5", "votingAddress": "4Md7M5xFQp2QWqGkb9jbATY4mEbX", "isValid": false},{"proRegTxHash": "145a2b8e4528ac412a1518ef8c7ccab35f49f4198fb77a0f5679bd4ba4245b7d", "confirmedHash": "b097f3b415f40922a3621239067945aea491d8d4e16698b03500000000000000", "service": "00000000000000000000ffffb9f27015", "pubKeyOperator": "0ddf4a7a54d8a7b7ea72831a41963e5abd1e8684bca2cdcdb807d6beb60180455c232ca866c6b6d7ec1e8d3de31faa6d", "votingAddress": "43xB467b6EJ4vc6NYaFo1NcXbg3z", "isValid": true},{"proRegTxHash": "8cdd2315f157ce0dd4e235a16696329fa6cfca24fd34ed6b77921b1f0fc9428e", "confirmedHash": "c740685ed7d9cc8f73abc1055004795cd24a53c91e908aa70400000000000000", "service": "00000000000000000000ffffac6891a6", "pubKeyOperator": "87d8c370da8ddbf24a569ed074f4084cb7f1fe81c29ac2b4df5362630d4308f4ba44e2e286e7837e8b83762306e3ad71", "votingAddress": "5oyyzjmoz9Y3wGvD3jRwD3jrWoU", "isValid": true},{"proRegTxHash": "eb5ea1ffd824de4c70e616f36c70f5ff56ca180c595e899aff26f632db0315f2", "confirmedHash": "997b9d1265c1505ef096ce662fb781952eb3962613a52ae70500000000000000", "service": "00000000000000000000ffff5eb0eba1", "pubKeyOperator": "8d6003ab7efac23db55d28dc10b7c79b38a7fade2e79676d6962e108a4aeadddd60acc45ae24d089b31a5e46a8d94189", "votingAddress": "3MUNo3WqT3CHQRgmBFc7EANYSy4T", "isValid": true},{"proRegTxHash": "12c52f2424847bb103a200b21fc776d45c0f83b3b6756a8536422d033967347d", "confirmedHash": "c4a900494867cbfcd7af39b3d63b2d8a4af0c6acc1e51b320300000000000000", "service": "00000000000000000000ffff34cf0709", "pubKeyOperator": "0ecbad499c7d2745633699c199bd28b6a71aa9ed65e89cb16c71c51ae7e1fd2ed6502c13b673cfc4468cd3dc70d4f594", "votingAddress": "4Yg1nQGC2dCJkbnWtYMxgdqfnwVR", "isValid": true},{"proRegTxHash": "fc9b67e4352ba8df9d4eacd085ea13973148d72fe0ec842c0c357290f1b3fcbb", "confirmedHash": "cf632082a1ca1ded8a7e946fa5ea5c76dd8213f33bed27e30f00000000000000", "service": "00000000000000000000ffffbc28be36", "pubKeyOperator": "937775dbfb88dbb7f11494699659734dafc6841a029c2ae8b2f910f1d9858e54c03e6e72830cd5b524d8c300c41ba54b", "votingAddress": "3MK2M2W5EHYYkDHvHVuBxG66XeT6", "isValid": true},{"proRegTxHash": "e826673e8ec827a01a7e184ba9ab2b061c458e58b4c4b65216b80eec3ae031a9", "confirmedHash": "3c09794b8aaff9f3acf5898dd7b3e5ae5a4fc2f606cafd122300000000000000", "service": "00000000000000000000ffff9ef7c242", "pubKeyOperator": "8ee8a098e6b61cf12e5fffaa123353c37114df175582d76a34c310fa9f0cc3184ab160d3f9adf62fdc2f55fe259e1d14", "votingAddress": "UkUMjnKGXNzFzPz3pitiTW2Yhyq", "isValid": true},{"proRegTxHash": "7e15c8e2417c6e18632175b6dfee1415beaf375a188379de08cb56e06982ef81", "confirmedHash": "c46bb6d198adb79c74cd68d669482ab592efb1566f8b91a52200000000000000", "service": "00000000000000000000ffff6c3d75f9", "pubKeyOperator": "137ca75d4e22a6b7d7b7a965a5df5861c1f1265f2b3136d9dba34cdaa982f30039ac7103f48da9e713943a3996f1b2c2", "votingAddress": "PJiyvDcNMjjijw72vKceUxSSnVK", "isValid": true},{"proRegTxHash": "cb063759da4235a78cf9792e24da07cbd230609efc67415712763c52be213bf7", "confirmedHash": "27bb10154e24763cae815355accb8337820d012b020b14a10000000000000000", "service": "00000000000000000000ffffc3b5f527", "pubKeyOperator": "85c1c2e1f309cb617c4fb3bd91d51ef713689f3255ba946e43a10bb366603ad9e244a6f08fc34e01a877e0efc48d04b2", "votingAddress": "m78FjWbyCixSdHCt4LHJXeZjnUd", "isValid": false},{"proRegTxHash": "a72cbea9daacff91577983d27b5affff4d57def3b7668fdde5fbf7a2e0e202ad", "confirmedHash": "2361df2cfb3dbd626bff6a20f35d1ab801a740bd10e5a7c31900000000000000", "service": "00000000000000000000ffff453d6bf3", "pubKeyOperator": "822d261eb1db4422e0ea1cc33c6d8b12afcac3eacaf3da4edb8f293c19872ab011075b6823487d8df7ab787339218ac2", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "6e5e291f5553b351337cd188283ac7bc86d243db5069127d0c073054ee5867bb", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d52b16", "pubKeyOperator": "0cb3a71648e6e4a458e86868f9b3098c514dcb0e153019befa3276f4cf6a949e07e8cda2b4d2930fbc81026dbc78bc59", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "b821e1b16fb082d334b9b47f17b1d1470af4eaf66409480b201e617e7e825f40", "confirmedHash": "9ee592017d4fbffe964f902b7f8fd7944803435feb02454f0900000000000000", "service": "00000000000000000000ffffa763f281", "pubKeyOperator": "9014e4ae92c2e54681aed1e2dbdf4a27a41ec7df93e430bfab091f3402382753c7034edfa8de8adc82e04bb6c6a461a3", "votingAddress": "tJLSVKq2tuEZsS4rPswrabahMLd", "isValid": true},{"proRegTxHash": "160286969e063c5c60b1207eee560aa1003d5d396b26de66dfb9cf0d06d36641", "confirmedHash": "ba8617fb19121b6abdf5a7330efb926c72fce3cbb5c086822000000000000000", "service": "00000000000000000000ffffbcf4750c", "pubKeyOperator": "0a5fe8f7f28eb4d8ed9290b7280810953d1548d19277b24bd63a4f6e945e909638b3bc6f2cc0075496edd18718c0f3a1", "votingAddress": "2tP36tr7shzRRCFed3H6tPmg1yUu", "isValid": true},{"proRegTxHash": "3bde92075859d77210dcfd5cfe4657d4365a9239f8fafda5d3b5f182259f2810", "confirmedHash": "c220b274f451628bd1edf145da08343c678f298a9d8032330700000000000000", "service": "00000000000000000000ffffcebd64e1", "pubKeyOperator": "8eccbe7fdae5137565fccfcc85d24c8a8fe2d29bf364b1b4058feed5e4cecfa2adb0b53beaaac5fb1e8b44221390ff4d", "votingAddress": "45odf5RZWV4Q1x62MisL9y4GxPWA", "isValid": true},{"proRegTxHash": "18e92ae6a5ceb79afba297c2344e05df1f01c647085f9224dc9334b7fe8117c2", "confirmedHash": "00621e6e6aab329be700c700ed704a90a6f88144ca7ad55d1700000000000000", "service": "00000000000000000000ffff22c0bba2", "pubKeyOperator": "8beb9ba50de265e67a9fb758ef45ea99b4e40bd021f95e226c6db1e57c2b3aa9a42008d08620a480870e43762fba5396", "votingAddress": "42QMFJbP8C9oyzowWF4wth6sGEKC", "isValid": true},{"proRegTxHash": "66ac85c516c9b399b87de890a66d7d95dcf55eeef547e45ff143d2e2a7467f54", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688b455", "pubKeyOperator": "80606066510cdb67bcf83826b526a0f985cbd3a64e610f77530fa745e8d119d4f651b941caf332fa049ddbdb742a1e57", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "e982122585d24812cdb6446485e98d9bb717ee3d130e9630a3c868adcc6c7851", "confirmedHash": "c72c90c6ee2109934ecda45311220d9d4774b97fc4c778b62400000000000000", "service": "00000000000000000000ffff52d315c3", "pubKeyOperator": "97172eb4f02800554682ef87d7d02cf882c37e6a7630b1ff03f5ff7cc38d9296f4bc74a5f5743275653c0335ea17103c", "votingAddress": "4FLrZeJV9uLzTkYMfT7FcZoG38h7", "isValid": true},{"proRegTxHash": "b6024c842158d069102538fd544b8ad6b3fa657eda1f252d7b9253fb0757f49a", "confirmedHash": "49d32b6c845d993d7f8d22a5f94d9d1a3f6ba197703295d10800000000000000", "service": "00000000000000000000ffff80c7c29d", "pubKeyOperator": "06f972ae1ad09d8b0594217ebaadbd2df561866ce90d2da26f18f678b40fe0f26b5061fe73824416c8f05081c1a962f1", "votingAddress": "pj9XTN151rR2JTb1XwGEGLJ3SsJ", "isValid": false},{"proRegTxHash": "ad6851d89de10c5a32003167b3c776d7bc64072f28daae78fb3e875169c4c3b9", "confirmedHash": "07233fcc88292b431f76355f74ac071169aff8ba466c8cea1000000000000000", "service": "00000000000000000000ffff2f627b6a", "pubKeyOperator": "0b40057db27aed533187cfc8df35606898b52abca254080c5fed191e6e604d2fbd0a2c61200789fb84678803efd175ea", "votingAddress": "3epFCKFzu8UvzHqLzcHrDy7vc4N8", "isValid": true},{"proRegTxHash": "6d52e155bc1cab72b816521b2f2454b1641bb5b93cd67d2d5b48a8354a736b7a", "confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", "service": "00000000000000000000ffff52d319ac", "pubKeyOperator": "11ef5edb5e0c995b98590623555b9521a99085f335be167299564957dda5ba5a8cb49d2dc436e4b4ce7effd05677b7d0", "votingAddress": "3E1NYN5gzXafs9g5qiC8cva8NdjC", "isValid": true},{"proRegTxHash": "f9c204569ff72e80718cbb43edb3915b8142e72300c0ea7af0db30b574404693", "confirmedHash": "93e838c746ace260dbdfb95bb17aaee5ab516a923b7a7ef11600000000000000", "service": "00000000000000000000ffff52d31544", "pubKeyOperator": "0c2817934ed1f6b00c7eeb4cd58603d7745e7f5d4d53a2116b424ac839b48a8ba4633b75729fbb8c1e200faed41c27b1", "votingAddress": "34NfV23r3f5xfWWzAHhxyKiKAkqN", "isValid": true},{"proRegTxHash": "798e44264630a411e6f8e12eed51060dabeab18af0c86ee24ea450d129054a78", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0b4", "pubKeyOperator": "82b7e5f1e68ac1e8d1981c41defd50cf416088bb78c0d463212b96ad1c9fb49ee097363beb678f0f572896fb165a3820", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "f3b057185a4ccf321440250c2c30b8550f8034dae0a88b2a9a55a9d3f380f0c9", "confirmedHash": "1faec17bc0dac1fdc58c8b501dc126354e9d6b2f20c549cf1400000000000000", "service": "00000000000000000000ffffa8775788", "pubKeyOperator": "93173196369c204fe1dd28515a92971496141616af4b9c4486fd50cdd2ab4393bd641ba4763614841eaecfce20d45209", "votingAddress": "2VRgtmn1BFJ1qgRyAqEBVdL4jUJ1", "isValid": true},{"proRegTxHash": "1f0f40d52a35fd8f02321dfdba0a47a64a86b8260dc74fdab30220554a84a444", "confirmedHash": "2492ea3b729d90f88b5f842cc4991378f8944e4375a696250000000000000000", "service": "00000000000000000000ffffb23fec6e", "pubKeyOperator": "9834170a604464e3878387c8b2882c435a661635bf31b48e2d8a7aa1f08b6ed5ea9c45efea20d8aa189b8711f80cee4d", "votingAddress": "4MNV1o4D1Bxopp9sTpteHxWvJV1y", "isValid": true},{"proRegTxHash": "9040fdd7cec2cd9a221dcababd9994a450a0eb4a18ee5c357b6a03a71163bcaa", "confirmedHash": "cc12ca4ee0d2ac8230d702969ae5de1342e44496d6cacec70400000000000000", "service": "00000000000000000000ffff55d1f129", "pubKeyOperator": "893b13f8dc01ac57ef61a1fe07b38486f199e7255b8696d91e00bf8121a4b1c4d7d73ed35743fedb0fe3cf24a2b4e4a2", "votingAddress": "29Wb2MZZaT1WERRcvWPdLWJkRJPe", "isValid": true},{"proRegTxHash": "06d94d859115ca35ab8af6536d78f1820496e6d196945eeb70445f191e6e026f", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffffc17a88a7", "pubKeyOperator": "19c671908bbd8f5af14f76b70c1a7073b30d76cb025dfb26fa7410ae4ecfbbd79ac0de83ebdc022f1b0f4520ae034e66", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": false},{"proRegTxHash": "7e08bcd24f51cb5be1e31fe5020a3f165d22cd509768f1e2a71abbac02a3ebe2", "confirmedHash": "c1807e4a90e320c0e14d055b0d38a79eb0895381f3d841d31000000000000000", "service": "00000000000000000000ffffc7f70f28", "pubKeyOperator": "025ddf52d212941e118f2123ecf2a26eb1c8098a4771b75af86e6a61c1d7d4d93a4bfe9e330647e9363aed979d3b3c3b", "votingAddress": "PVWhAztQaTcaEELTbyBu3tebQun", "isValid": false},{"proRegTxHash": "0a7e0908d31878cd61969f51688189d16d9236d3803c795c55e4c4d56d15fa32", "confirmedHash": "8e3b15fdffcb6c2117bd4ca4868f17ed344cf428c29c24b51000000000000000", "service": "00000000000000000000ffff9ef7cdc9", "pubKeyOperator": "82b5d30b7898b2bf9c3e21fb3ed6360a3fdf201ee9d73bd808ca46d23d7f97f13cacc43a867669408f4e57ba75fdff91", "votingAddress": "kEQbYS6mYULJi3ShFZwj3Jd92kH", "isValid": true},{"proRegTxHash": "76990d5ed3cf34a1b020fdeb7df2c36912d66d649350bc92a99c46a8bcbed76b", "confirmedHash": "be07ee55e45e7ac1585c923f114ec777b10b9fbbd76231c40c00000000000000", "service": "00000000000000000000ffff55d1f1cf", "pubKeyOperator": "0139176c8f1f195ca77284dfc7a5313717c4beb6aec5001f4cf804a05b8d9e391556d93f447325d40b2bb8e536d61f9b", "votingAddress": "3rG4cJ5aGmxAaMqV5khwGsViVgBA", "isValid": true},{"proRegTxHash": "dd5b974e1dd1a5b13eddeb7322e58e93862c94aa48b47d8d49e74d7fdd9bdedc", "confirmedHash": "bb0b09b67dbebed5edd0f20545de767da3db476c66a4570d2300000000000000", "service": "00000000000000000000ffff5fd85425", "pubKeyOperator": "0581aa4fa0b84c39aa920f538b92d7e0680d88776cfec9d41f6f599d32cdc4d53d7976e92fcfdb8e0a3a1ea5a9650582", "votingAddress": "48HmcE1hUkAcdgUA8xCwWamgVcXm", "isValid": true},{"proRegTxHash": "89c08f6be23aba8e32fbbe8180df37e338df8b70ef0476ee6746d51d67cbb626", "confirmedHash": "4fd6c3a09452879e4614e4430c74eb0029e38445383ece232000000000000000", "service": "00000000000000000000ffff22e9085a", "pubKeyOperator": "99b025716bc42057f42ba9fda9c7dbf63199d2207d122d8caf7f49d12f2d00f8d9ecd90d189ab3029d6546b89ff23a85", "votingAddress": "3bx7HLKfDTg5YKra6GAYx3BqxgwC", "isValid": true},{"proRegTxHash": "8c9a24a50fc17ac9ad6419668831610eca195a49b76038f983b7007c6ef164c3", "confirmedHash": "02480155e7acf82afa5eae3263f0d683dc1a85b1712e29c22600000000000000", "service": "00000000000000000000ffff52d3153d", "pubKeyOperator": "0e54c1c514f1efdc21e556750231c9a216d8069cb8953e9060b7688883966833e89da374d453e76d334b29a06558348f", "votingAddress": "4XpVWt5WGwoi1ob4tM7Yte6ysBfM", "isValid": true},{"proRegTxHash": "745cef58595f5e22ee6f1eb632357b4b580209dd24f7b373727445b9575654a3", "confirmedHash": "c930dde92a4fd037920a0c8d5354e0266ef6dc58dc176bdc1b00000000000000", "service": "00000000000000000000ffffbcd47d35", "pubKeyOperator": "0aa220ae52d16b19ba888aba4d9a0e9b3df165e3bf02d1f15c880011519d687bc065dc70582f45b155204a308d489204", "votingAddress": "24ttq2dStRzXVqVwc7iAXTBinEWn", "isValid": true},{"proRegTxHash": "8fd1dcfa084bd91a59a2cf2b1b1c3afad6abb2b7bc26a86c00be0eff32422323", "confirmedHash": "97fa3bf9eeae1f90cb53e7f8f7c5eb3d3321a1b53974049b1f00000000000000", "service": "00000000000000000000ffff52d31537", "pubKeyOperator": "0455f9526d443b2e8ec751ac98ccd06ea4c19bc908c56a3f11ce9fe4288e67eccc1016419c9ea08dbc5fa1201c79076a", "votingAddress": "zKmHnEZ7o8hWgntNejqWwXr74jb", "isValid": true},{"proRegTxHash": "2a0d781c89546c9923e03f7d771ef1c8eca2079d524ce74ca30683e449e50827", "confirmedHash": "edcab1b0eb8d5bf56c74c6142d7867cb031c2f41b217587a0e00000000000000", "service": "00000000000000000000ffff9750f4b1", "pubKeyOperator": "0cbe6802bcabf08a382901aa2cf58f017cb0bb865d23d98b511eba0206052c7dfd390128d052b6ad3c3071ef081871f0", "votingAddress": "3zmSxR9eEAMECmNA9u782ENgG8UV", "isValid": true},{"proRegTxHash": "4f81f3b35d8b16eeab4789ddac3658fb0ebc5f2e4cdf7960ae230059ac471b66", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b01c", "pubKeyOperator": "8268bd6caf4cf7aa48147e3aff22937ad5b7bf54ab75aa8955f295ca1733e7da2ee7f64b8fafcee12dd03a5d469e9025", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "8bcd63620d0624e5046f817f18e3dc609fe5dd897dbab1c46bfda83cf9856bc8", "confirmedHash": "8039fa0a2b82b4dfcd068b700005359cc0778f4aa73d1e8b2600000000000000", "service": "00000000000000000000ffff05bdfd99", "pubKeyOperator": "0e4539ce2b39915d0c67951124f40cac409663e911775e1e72694b81016491d6e54906139da75f2cd4a385b589b92c21", "votingAddress": "3HuLS4L3fMLRspdussAhFSTmAFVM", "isValid": true},{"proRegTxHash": "df49a036d2cd845022d025640e999664bb35cd32c26a3f97ca6bc600a19699e4", "confirmedHash": "652edec87f4e9f62a5823f8bebe784801d2ac6daa174151f4200000000000000", "service": "00000000000000000000ffff3625c7e0", "pubKeyOperator": "01da056d3b253e6660c98771aea644191640f179dee3674f0c720ae896ebc9a4614f707c6809ad8f33a7226abf65d549", "votingAddress": "HfQaqpjgcEhM9pgQnRsDnyXqM18", "isValid": true},{"proRegTxHash": "96221a3a4b8e2dcc307f0b8a78b2637030fb020fd81e631de9bab51da36a92b7", "confirmedHash": "a1e6a81c221aed68d0e640d6581eb47941aef0a4afbbaca63100000000000000", "service": "00000000000000000000ffffb945352c", "pubKeyOperator": "858fe01440b3803b8344d9c5371cf6517bf205f24746ef71382f3febb8a0faf02558eec51da965834a832a0d87a1f7bd", "votingAddress": "uC7fjiTHANTUoYnNH1wz287e6nV", "isValid": true},{"proRegTxHash": "82fb3242f0ea7813d67eb92e7cd7b4b191a3f99301460f99613ea735749b53da", "confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", "service": "00000000000000000000ffff4e8ddfe4", "pubKeyOperator": "0005ef95afc9acd78f7a82842626cf882b36390c53429384fd29ec4b27ee774dc1761faefb0035c208a22f4a129788ca", "votingAddress": "2TN1ZYbA6txqevvaY9PSNXCNiGds", "isValid": false},{"proRegTxHash": "0e69795090a485ac69d85f3c66241f7ce4a6dae7fd2a3def1a784100a5fe88c1", "confirmedHash": "c1de190dd8a55b62e75b091686f2c6a7ea4ec64a7f095f3f0900000000000000", "service": "00000000000000000000ffffbc28b6d0", "pubKeyOperator": "97f8811b21f69638d9b0a44fd42c092f1717282d38cfe86035695417d3c85d1ba07a7057cd7653fc795912e1f1617f67", "votingAddress": "2PgKQKWicunUUb9oTvY4hZWr5YNe", "isValid": true},{"proRegTxHash": "4ee53bbfb17d925b58e66f7ee9e4829b96640014a42883dcb49a54791fece0b8", "confirmedHash": "6cf3273bedfe063a3fff390434c1a2717f9782e4fe380d520300000000000000", "service": "00000000000000000000ffff87b502e2", "pubKeyOperator": "8ba6a5acb68dd933373207c27b5cc011137e3e301306dcfd6a34eae7868e48ffea6db9e821e7fb1b5917858beffc4911", "votingAddress": "5qKe3SeMvHDbkG6TZfRkriSbNi3", "isValid": false},{"proRegTxHash": "1eecc3b36a4a4174478fe18e743b7fdc0fe7b1ccd2d7b5cf6fc31bf0f3e90814", "confirmedHash": "2119ef7410329e38a031777ad1259d6c43210ec610f78d263100000000000000", "service": "00000000000000000000ffff8a4498b9", "pubKeyOperator": "0f9505e11a16730972cc26658e4f9e2f95bd77d5512598e8a33942c15587b5e97e820490316a12a65a716d0dc6880987", "votingAddress": "XCrqqBKpsrGNSDSDXqumQUn4MQh", "isValid": true},{"proRegTxHash": "92c1bc378081a2f645d315cd8e4cfefe7e93eb110fcd340a02d36cab7a846f9a", "confirmedHash": "0e206dfe982b368c7ca2ed153b71850e0b63b5ba3614ff561800000000000000", "service": "00000000000000000000ffff88f38e25", "pubKeyOperator": "135f788485120d02424d1dc1bc9469d0c2f910dfe4cfda67fb62bf3fc5f17d80f6a6c23cf3bebbaffbdf7b89f4e189b1", "votingAddress": "2Q65zNQzdFdZZV9uToVHhoqPm53w", "isValid": true},{"proRegTxHash": "3514c665556215b7a8635f963f3d3cb576fde583b1c7ad8e89ef7e695da2ca57", "confirmedHash": "8ec1b8173046e570e05641a1ff650136977dce685b32c4370500000000000000", "service": "00000000000000000000ffffae22e9c9", "pubKeyOperator": "91be2d40ef86ab5fbd03f362f81061aafa2e1a6be860cf4747e8a73b69f62b22f5c78771b82c1d9e78e55cf93b0755bc", "votingAddress": "2r2c9jKq1iz58Pp6LV1nnCYBcWEw", "isValid": true},{"proRegTxHash": "11da760175b6a38e82310d45b97e4486926832470ccf53b74ab0ec38ad265c25", "confirmedHash": "9ee6ac0bcfb85475eaf82a0f5eb7617be4322c5c7adf78280000000000000000", "service": "00000000000000000000ffff5928031a", "pubKeyOperator": "85984416876b3c4bb2ee3f7eb2b80bc69eeb2de32c94d18b32269717d6c823056457f63b1ba1fcaa62690d4c7aba42c0", "votingAddress": "4BMXAraGDbhoX4wLM3dLAv1mSEbV", "isValid": false},{"proRegTxHash": "bf459d7eb2c831a3cb4e0964a7f5d27f9a4592711f6c6d55bf71632360e21b1e", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6db5f", "pubKeyOperator": "8be2a79bfeee8b9a61ec237b4462f2352abced4c980786da36336ec3565ad2b59ea42dabe110f832af0abb8cfc76fc3f", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "ca3a16976c4bf44a4e0abf34980fe417002e38a45d3824a9508ca9d2e1abe700", "confirmedHash": "938edd68ebea4294a8c497ea6cea6838dc8c8b483b8ae00c1700000000000000", "service": "00000000000000000000ffff55d1f14b", "pubKeyOperator": "0ae6ca9e838f8b55b9d1c1d3cda0ad0fe0413673eef0d0829ad1425d463632e8da59aba6e389c6b68e163c39156bebd4", "votingAddress": "3DxBkHJgvuyTsuTgLwa8MBXAJ9A1", "isValid": true},{"proRegTxHash": "6cbe2bf4495e4a188d30a6891648366dff98328e81b9d390c80c8e3fe555cc31", "confirmedHash": "b36ffaff2bce54c8b1413dd9649b87fb382c9f6b0164502f0e00000000000000", "service": "00000000000000000000ffff2d3f7229", "pubKeyOperator": "172c645665f6742c2226cc815a2c735908e0b20f949f42f7a6713b6613e17250242f6a6cd8d75ed46f335e8ee6abb22d", "votingAddress": "2pU2agePYgJgKLptjBa1FTgstfKU", "isValid": true},{"proRegTxHash": "782f4cae14a6068866093491b5a12e0b19ce5e84d5e606ef00d0bf67bfbf8aeb", "confirmedHash": "92312c3ae8b47bb1d187a90c6fe4e1d96c3eb5db73c7ad041700000000000000", "service": "00000000000000000000ffffcf9ac040", "pubKeyOperator": "92873ba3952351992735a11af7b85ee9c4637552cc2effb1a2d69fe70c0760302a822b2a12b12b9f4819f5b22fb9d9a6", "votingAddress": "46R5JmG6A8mfdVYqG5b3pXnR8yjm", "isValid": true},{"proRegTxHash": "e84016bad0e0d01ed04280fbc4b5159a5fac4038cfcd977da80ada844211a946", "confirmedHash": "213046aafa482fcf6ca01a3f9cb16e47fd1f77a73db409261a00000000000000", "service": "00000000000000000000ffffa5e32381", "pubKeyOperator": "013eef3f6f7ee1f67b89331f83566fc611ada0168bd540408f5d12b321d2c9cfae916a5dc70b3e77a4ed4701129213d5", "votingAddress": "2HNGhWoCQkgWwE82A3Fz64Yo7j23", "isValid": true},{"proRegTxHash": "dacf960abe50f6a96dd4f3811bbd829325beec0a1eb420f58b9ade6870c8be8b", "confirmedHash": "ecda33d1862d7dbc4402269d972249391ed0b9af59456f664600000000000000", "service": "00000000000000000000ffff88f4699e", "pubKeyOperator": "02894a6102dc137b8ef2fb4bf941f7d7dd9e1c3843481fc284736f8480f65725084b3ac886b0411f5da0868b75075fbe", "votingAddress": "2jc4RzpPyTUgVweA43AKNqm4jofX", "isValid": false},{"proRegTxHash": "88f86985654021e01814e291032b4caf976e5d948546585c0cd39d91de338a05", "confirmedHash": "11a8c8a8e63dd7564218f519f64c2e32e5e52ad3032d23150e00000000000000", "service": "00000000000000000000ffffd4186c7c", "pubKeyOperator": "8997607e87d3364b12aa07dcb3b58530c4fc0b8043c1b1d50f0c9f7c06e75803cf14fc61ba3fba4290cf6adf5e3eca87", "votingAddress": "3DSqCy4xQ2s4mK1XNdRfsRQNmpSt", "isValid": true},{"proRegTxHash": "e7ab487e74360eb813f451a40a23786af5862da4b23830e5bcf260faca3b4237", "confirmedHash": "b01a87d98628f4fc6d89d9903e2d58988e07c24ea6cdb16e1900000000000000", "service": "00000000000000000000ffffbc28b6cc", "pubKeyOperator": "8e164ed81a614f6c4ffa3fe53b54cadc0ae111b8f851ce7253a962f35dcec93bfd789db2d7d762eaa76c23213702a7b3", "votingAddress": "22vim4zW7yaMPWxpotzjfemso6KW", "isValid": true},{"proRegTxHash": "b2b41e2f15c6a72ec8e4b7c069e64851622a7867568e1e3533df6a259ab4b444", "confirmedHash": "f475109160142b7a3c9e88937ee42dddd0daeaf15eea728c1b00000000000000", "service": "00000000000000000000ffffc2a3bb48", "pubKeyOperator": "94c7d3ae0cdb8bbb02950121f0c1c8a2605e86a79061bdffe84a913daf66232b253968210c9d172ae188551d69aa495a", "votingAddress": "2LVFe4tTckhayREseHCD2LgSrHUU", "isValid": true},{"proRegTxHash": "6f1418e77192e57f2ef5668d888443d28d32bd948926ed6afd6c2f821710aef6", "confirmedHash": "7dba5dd997f8f0827d4d891db1cda82e1f7447b2b5b8fb712d00000000000000", "service": "00000000000000000000ffffa1235eb1", "pubKeyOperator": "840f19fb021b6691e1a86901cae6e0d90cdb66f4e1ca30d999587cad53fa38711f828271102d6ae479376b9aba081229", "votingAddress": "2AiAkECkjoY53u6wcjGvqJx2KZmc", "isValid": true},{"proRegTxHash": "f68f0e952a6e822787c288f29087e765828e11abeba08658f70324eb5b5634ab", "confirmedHash": "cb196f61b9cb8bb7a18d6a671b8271ed62270512e7f91c7b2c00000000000000", "service": "00000000000000000000ffff68cf82ff", "pubKeyOperator": "06935396bc1e4a84ef5dfc56fc0f27bebb5d784d2b7eabdd6ed1ffa9965221e01f8f25571525fd4f6a8e339819e784df", "votingAddress": "3Qp1Ks1WYXYgufGgSaZTqxgXBgG", "isValid": true},{"proRegTxHash": "56c5e2b721758a0c56b7fda3c31213f8a97c0511f62b3fee0ce9c332196fd5d7", "confirmedHash": "b3ee13734164ee6ecc081d91692d2a2dec5d03dd59ff171c1300000000000000", "service": "00000000000000000000ffff55d1f1e5", "pubKeyOperator": "07f058647edb22e21fe481fa473030c58733123e77a9588241d08ea703f5040915c1a369b82bb606c5775446cc306fd4", "votingAddress": "43qHTqr3gsNtS1XpbECDRSUi1DV6", "isValid": true},{"proRegTxHash": "d5716cec437eb60a75878231c2226560d85973ee99316209147e39b56a5ded1a", "confirmedHash": "aef6ce4203bc3d19e0ab00bf4f1ea1178ad5094bf30cb7052200000000000000", "service": "00000000000000000000ffff17a300ae", "pubKeyOperator": "8a8c4e4c4bec3ab0088ad7206a4144ba40ff51b47b16152298ee708a312150efec7f10527d74373b2a6d8cadc0967c2e", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "a06dbf594811131f366af652b29b3351b234406f910f0dd5c1139494b975e5c3", "confirmedHash": "aad03704ed728de13c38412354dfd1fb80bec10abde18f461400000000000000", "service": "00000000000000000000ffffa12311d2", "pubKeyOperator": "045f9bbe218ec47a12c22ebe4a8660a256be7b1bde3fc703a9a3a79d2b28b3f45b2e92e4502d3af7bc3ed4da181bc890", "votingAddress": "3gguNEA1zJ55zDQztQHbCmwyJ7t7", "isValid": true},{"proRegTxHash": "1f77da0b649bbfadb1e1f29b91ba0b783cfbe6dae8270d17bdec26d749f5200a", "confirmedHash": "6c06c7238a59b02cfffa6df275bb263cc492b8a7576c5aba3600000000000000", "service": "00000000000000000000ffffc38064d0", "pubKeyOperator": "933d07b682629d89f084467aad80deff182f52f5e6a930f184a9ce747cedb732178be7a8cc0f65b5905dc7020ea4aac1", "votingAddress": "4HEyEzxBmYHR1WHY7au54Gz6r1wF", "isValid": true},{"proRegTxHash": "ab81dbdc5fc02a4452b9a963712b97b3fad75dafdd3d13b028536d981f96aaae", "confirmedHash": "11a8c8a8e63dd7564218f519f64c2e32e5e52ad3032d23150e00000000000000", "service": "00000000000000000000ffffc287515f", "pubKeyOperator": "0937df6a7c7037fb37fbee0a0740e35bed81ad2b0adf6dbaa2410917e585515097df9ca430fa249886648d5b3387a64c", "votingAddress": "47LFtXdPk7gCV1Y524WTcC2dpoSq", "isValid": true},{"proRegTxHash": "ab7e2eb85c5cfd0c81af834c41963873fc6f191180f7bbf23a36eb7756700581", "confirmedHash": "15ff1d4366a805145c25dd614d4b9b7cecdc1e8943e255390100000000000000", "service": "00000000000000000000ffffd41865d3", "pubKeyOperator": "89a051ed06275c645da83ed250f0b2e19f296f3d289ab5cd6592fe0241fad049dc4ed647c97881ad8f23e5c68ca34a8f", "votingAddress": "39r874RCS3Qj6MxWCdWAVBRaALgD", "isValid": true},{"proRegTxHash": "a9ad51251528cdbd5db74111ab3a334cb976ea6aadf5886f8f73b532839d351c", "confirmedHash": "c3f26b080798292b644b1b85a1872d11778465c267367eaf6100000000000000", "service": "00000000000000000000ffff2d201774", "pubKeyOperator": "118dbcd6639452652c1a10e618c2432d709e7d055c6234be02e144d9904df36af1163dd13acd6ca8f694427d9d1ff436", "votingAddress": "3ueg6TKbPnre49ZMktomJce3SG73", "isValid": true},{"proRegTxHash": "91ca2ca7c2f678fd9fa61236e4c728eba32e08785a233415418b185e25c201f7", "confirmedHash": "1ba7ca3be0b58d713db473a341dcae9bd3fd67ef74c98fd81200000000000000", "service": "00000000000000000000ffff9f451f82", "pubKeyOperator": "85354254d1148542dba06798a36d4f6e3a1bfc5318ac9e00d819a51088a9e97873179f4a46ea877b8ae21837dfd879aa", "votingAddress": "4VUqNBYvCR6Jnu1rS5NLhgAZLcPb", "isValid": true},{"proRegTxHash": "0339c6576c665de36d8f2045ad30caf6875e2fd4a2e363bd1d19129a060f34d0", "confirmedHash": "95ca7b9118645dbd0535c649dea5f61af9b6276969ed682b1800000000000000", "service": "00000000000000000000ffff0391770f", "pubKeyOperator": "0341c7a10085db0e1c48821aee03cd96aa2b3fbc3fa05a62cb533e30c7d51147426811d6b988d19922546427048f9eb5", "votingAddress": "3kajz2nLTLwx5goLtNjKyc8QQ5SW", "isValid": false},{"proRegTxHash": "44138dbac132b06dc8b876d10bf12e61432094db1b65a5e001e1ff37c36cb5a4", "confirmedHash": "e4c822f9bc57e2e5e3c22c7f3143258f501218c3bbc786951f00000000000000", "service": "00000000000000000000ffff52d3192e", "pubKeyOperator": "09c0ee0fa20fe6355e2cf84ca77799f3a39ca5794bcfc7dc4c78b747f7cad5d18dc54fa7963462bafc8565e92a8a0472", "votingAddress": "jsiM2uaeBjRQuge43D5MJyGnUA3", "isValid": true},{"proRegTxHash": "a9516b174399b471bc46bbfa93dcd21a1be34b2569fa911bfbdd7631b951d88c", "confirmedHash": "460f4bfcbd475b87cfffc76e1393f9f00ded622b245402eb1900000000000000", "service": "00000000000000000000ffff9f597122", "pubKeyOperator": "0a41525e00cca2b8830788e531bbea0a84d2d9078bd997f8482625c17cccbde09d5b300458c6576082edb7f48c83ddd1", "votingAddress": "2pU4R6eAeZmfWQNyJMuDfM2YKR1H", "isValid": true},{"proRegTxHash": "d883de6600a9ea008c640adda00606559f48e2dd14b562d5d9452d7269a8a8e7", "confirmedHash": "de80aeeaa2398036f29eb659bb42c43299bd844a67fb0d8b3a00000000000000", "service": "00000000000000000000ffffbc28b987", "pubKeyOperator": "8720cbc63e2137dab1807375a574b383220194a317b52f74e2460dbab4b2884d2a1bfab0474ba629232d5fde52c3132d", "votingAddress": "2bf8Ewr5arPHbfzRzfggsXeWHmZA", "isValid": true},{"proRegTxHash": "052b309c67ae34f1d2bebfec4684c49347ef8123071bf0aedc9f8a70bc89c01a", "confirmedHash": "6d50c164872f58879b819faa4f5cdb391afe005b5ac59ba83600000000000000", "service": "00000000000000000000ffff052d6e8b", "pubKeyOperator": "0e99d91b38205317fcc7ba10b1c5760420a0f4b6252bdb50418a9189197b5d69ea7e71d8193a564e0f4b6b5a99481d95", "votingAddress": "2Fyk73Smsa6A3B7gXVCWhKBKMiGu", "isValid": true},{"proRegTxHash": "6dd518478b18f187da5aed8cbea527704d180848e47a6287e20abba952cbc657", "confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", "service": "00000000000000000000ffff9f45cc77", "pubKeyOperator": "8cfc1799ba05b318d1993933d8c7d3d56c899660cf9d8bb578118459713ae0482882ea423a9b9e104cba12621289503d", "votingAddress": "3PRKhkfRfMvxLbnLQpjX4Sku84uB", "isValid": false},{"proRegTxHash": "e6df427c2625a0d9db5e1c79707f583a5d86a2c1bd9f2301940df59d2db5fdd7", "confirmedHash": "d77945ee94907d1a9917b92934447c642b29b313c7e33de41e00000000000000", "service": "00000000000000000000ffffbc7fe628", "pubKeyOperator": "9958dc78de85c9d511fde3184cfa664623ef78c52367e29fb88ab40e83ee8dc843947ef51e1d0c32d1b4b2cebe4a74c3", "votingAddress": "2uaq1ywdDHRqfL92GGSUmRKUUyGa", "isValid": false},{"proRegTxHash": "c6b772b6c59ce2c84f3813cbfa9c256e14ffad0c4d46b8cecb3b52a5a8406db4", "confirmedHash": "c8cfd5fa851a786fcf6a0fa04ecb750ad7737e1ebbc654ab1100000000000000", "service": "00000000000000000000ffff55d1f282", "pubKeyOperator": "8003d0ae963a976ff9918d9cf43734a8265abfb10d99d68b0ef1bfb11877f0a41ae74953d1dd780f5155a5682a570898", "votingAddress": "2TA9MGLyfpQZiLU1g3TLUZJUzgJk", "isValid": false},{"proRegTxHash": "b9902ec2f7af8cd59fc5da5e6b3c86f7bf5eaecbfadb4025ebe6306a200f5e67", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b069", "pubKeyOperator": "99c85c681c04c4b8e3f229e189826d1b30ada27b8b0b585b683e73270e6037b72320edc6bf067003c9387bcf0655c13c", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "85988299619715e7e5079914a06554bbc178dc0f706396ed52d53e5ee667bea2", "confirmedHash": "a230db350a0d6cf720181303831d2316eba4d5166f7ce8ec0100000000000000", "service": "00000000000000000000ffff55d1f1ee", "pubKeyOperator": "8ffd8f80001444c581754ffaf1c9a55f87da3ab3fd45775f6e847735fbf05fa26f0053e0c70a9e5360c075962513e87f", "votingAddress": "JnpXjHRekK84hQkp3UYxYpfNKiD", "isValid": false},{"proRegTxHash": "0c677fc7879b958dc7fd442d88c3189570c820b6055dd2f524c890a0af656125", "confirmedHash": "d3fafeecdf80c4776d95fbedd6177ec482e7224a93db9d934100000000000000", "service": "00000000000000000000ffff55d1f1c3", "pubKeyOperator": "001cd0af904558e7267b5e9fda1715e6b225ee6d3c677181034f50f28f8a794edbeaaf5a8285efb70269ea95c7521ac2", "votingAddress": "vTyK9coZzQDDyPbi9u915Cs1XEt", "isValid": true},{"proRegTxHash": "519fbbe048f2d7e0e4c657ecc2c37721638eab35f37dd8d6411f284b8eb500ff", "confirmedHash": "3071d1f893d5f8daa7b7dd9d7aa51cdba7e38834ec9a23ad3700000000000000", "service": "00000000000000000000ffff55d1f105", "pubKeyOperator": "95715cd801a40df05a5a09e769b2f0c7268639eda22d99691c466d3d6bb4ae60a89e04a0f5d56c3a145007c41b520033", "votingAddress": "2BvuWE2NUdv92yjG1NpaNiCRejJy", "isValid": true},{"proRegTxHash": "a2e252ba1cbc997ce2c548a0d6e1b5e04d2ab85ffa71567d414ec587e742c82b", "confirmedHash": "cf632082a1ca1ded8a7e946fa5ea5c76dd8213f33bed27e30f00000000000000", "service": "00000000000000000000ffffb009d204", "pubKeyOperator": "00e7b1e2c8e2f7c4187100fe2ce9f326a2956e1025059a77d6f313f6ba6a60522f8113d56b1fd1848a7ac56696694f72", "votingAddress": "2c9FZkgPq3iZjswFEiTrne3gC3Yt", "isValid": true},{"proRegTxHash": "480cd627ee9c4fae07c533c72353c3a577099bd3a25911219c1ac7b6f0a21e9f", "confirmedHash": "efa2074c63059739c2e8d597f216834c5df32f203bc4ff640800000000000000", "service": "00000000000000000000ffff58630b04", "pubKeyOperator": "0affe572d329da1a133b74491f0636191842d849cd4faea74cb4504d4548a4a807f7069f59fb2943b3e599dcebbe57fe", "votingAddress": "3G8kyjAM3v7v8a2xM6zDhyavqc66", "isValid": true},{"proRegTxHash": "7a0d68ca5bf51724bbcb85150ce9e2e241285662f2465b5b8af0f677ee57c427", "confirmedHash": "0d08d02b7b6ead43e6b14a9139bc7b5b36bceb5eb040c1ec0200000000000000", "service": "00000000000000000000ffff88f3738e", "pubKeyOperator": "860f9cb0bf8fa775877b412b336b752e373b26b9ed9ffd3d6694ed4ddc6f0ef2c1cf90a2755abbc23bfef904ed83ce17", "votingAddress": "hJ1aTJKTDtkbFf7bp5FKP57yFXX", "isValid": true},{"proRegTxHash": "cad2de3a61ca47f267f7afc1fd0b3e44b235ad07d270a55cea6f006795deb92d", "confirmedHash": "9b36c0f08956a724e8c0507e2db8ad350e855d1aed794f4a0b00000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "gJHuVMQoDp9Kz2zPokMQLHPYWi7", "isValid": false},{"proRegTxHash": "e7ded9271bc33434aa2524fd6a35aa2950a51232a0349a6204e0d4e80dbfa445", "confirmedHash": "9a1179e9009a17b9b4b8c574a07b758c82f58a79f95dc0781900000000000000", "service": "00000000000000000000ffff2d5575b2", "pubKeyOperator": "0e046234f0e3ab7f1414db86dbca1d15edbc39ce474e7c19c0301ea5a4df64c2efaad3bd903edf8f45fa356c16115f21", "votingAddress": "2Fygfq5z4XBbWGC5ocAM9TokgUjG", "isValid": true},{"proRegTxHash": "35206bdfe780bcfaadd5d305b9048bef9e5ac2c4ed0a0054112a18f3e68259d3", "confirmedHash": "f6886477772eb17c02ec52995917dc1d471f8c54454888331a00000000000000", "service": "00000000000000000000ffff36270a60", "pubKeyOperator": "01a2645e2c6cc942f935f080984341eb6eb21317d48dca302d6bc1abfd0783361227f20c14d560e66577fed10d1e73b3", "votingAddress": "fYi81ytnhm6ShDpR2Ju5BHL8gvv", "isValid": true},{"proRegTxHash": "931114e579a9d99be55e536b8b60a5a0b70874063af6e5e5f5f63c315b4c1ce9", "confirmedHash": "0e16f2827da5d9d0a494e4c4c828e3a9a34f23b8eef552dc0100000000000000", "service": "00000000000000000000ffff55d1f235", "pubKeyOperator": "8031591923ff6b10863787c821f86cf42c541f0eee5df3eb6d6cf1df97162f5b73c5fdbea03dcd5775983c494b094370", "votingAddress": "2ScfPv61Nokaj1EnAdo6TPjRhsaA", "isValid": false},{"proRegTxHash": "b87469166a829cbbe5ab48c46f6f5b233a55b90ad6136b2a3c8480921c219626", "confirmedHash": "ba7525f20234b744a36084cf1a229e776d660a8d9ca8e9f50900000000000000", "service": "00000000000000000000ffffc7f7034f", "pubKeyOperator": "89d6676d3216dcb7c2c182bf6d2b084fea7c65f127c3ede775e470c57162c339f17638f9188ddde661b66de84720fc68", "votingAddress": "nugHSAjMPLS66R1Ayb7gGkj1z31", "isValid": false},{"proRegTxHash": "a381bf3b2dd1631e24f02ca7f5990d7565da9219b5c1bac4efec3308df1d808c", "confirmedHash": "384705056af13a71965c968f8440f70435560c321393559d0300000000000000", "service": "00000000000000000000ffff4b779605", "pubKeyOperator": "0e6ad202c6b18075f1de8128cca7fd8a851b3bbef05fab46c59a43f05957e1fc0aa5362eceb7be10116c9c0e2c098bc5", "votingAddress": "YrvvR9zXppd3QLofcgZhsUdB2Ev", "isValid": true},{"proRegTxHash": "75989e8d42a97fd7e92667926bb52832a38fb04911825f608934e8630da16234", "confirmedHash": "f1457b74fb1c9b099faedc8dd40c2e4c977bd0c95d4f33ae0100000000000000", "service": "00000000000000000000ffff179800f6", "pubKeyOperator": "02824fa74eeb348eef665cffb5dd1dca9acf2ad40bd5b694884efa48242898b4ec82a7903f2c25097e117ff3528eb0e9", "votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", "isValid": true},{"proRegTxHash": "10221e23d970f1d1a027428aa5813784b133d41ca2ed63fed058720a914c8028", "confirmedHash": "2b6b007fabf0d8f66f6e9dfbfd422e590e284c4ef3c021211b00000000000000", "service": "00000000000000000000ffff9de67684", "pubKeyOperator": "86fdddf4f38a0bf9e196293e31fdcd369cd035477ead4f86fbd6d4482954a5a37575505e60d2ea7ee929743311b0f422", "votingAddress": "FpfEnngBAqhah1MJR7cZj6wtxN7", "isValid": false},{"proRegTxHash": "a8f31aef49b37a06bd23a7e192334f4836796f362a8ceca0e7af279367573030", "confirmedHash": "10b46562d32fae592b017ba577d56a2c4c6e8a0492ef443f1c00000000000000", "service": "00000000000000000000ffff5fb3f729", "pubKeyOperator": "984617501997000add41580cd262d74660fc6fe8d1045b8eef5c3096a5d302b895fffdacb3ac45f4d5cc41c8935a38cb", "votingAddress": "AEoBWn9jrCGUJ4hGKyYUS2K5x2k", "isValid": true},{"proRegTxHash": "f71e250401702f0bd72cb3dea3e3c8b77acfce917868f27fff7132b7a133d14a", "confirmedHash": "e4ab7811973cee2ef52719a6f0ec6d76654da3e5f198df140200000000000000", "service": "00000000000000000000ffffb07b39e1", "pubKeyOperator": "0fd996fd993eb06737bc7615e259be8af67499bed37b3b7a9c8d375f003201d624169aac89e5b4dfc43e370df0f2c898", "votingAddress": "3uLFkdqGuYfZ7YxRn5H2ip3BNnFG", "isValid": true},{"proRegTxHash": "6a42dc07e555aff41dddf8c6cc9fdcbd6dc7c4e4cc75848be91e70496c428915", "confirmedHash": "f142219d724bdfab00024f3cbed54a68a5d2e022ccb528120500000000000000", "service": "00000000000000000000ffff55d1f13e", "pubKeyOperator": "98a60127616c0009ed3526cbbeede28aef5e99a544a98598a924f86677860a6c26fe9016a1d761006e0415f5130dafc4", "votingAddress": "3fvWmkgYsXtM4T1AYyGBNUnrwaJk", "isValid": true},{"proRegTxHash": "980bdfefa7e249677cc9a9defda7d2120f4da50a7d3d13b5d79a89da56ac0c32", "confirmedHash": "29ced6e37b3d18639a203801e9a0cb5b4d0255de544a779b3800000000000000", "service": "00000000000000000000ffff55d1f158", "pubKeyOperator": "97c5699299c39b29e4a3b8c3791b7f263cc540fe2930df4f666bd5ecb2c54e5833b9a579dffc3c1b4a81e5b25caab66b", "votingAddress": "3SyoHshXaVmf1ybMnLKkjWhJv651", "isValid": true},{"proRegTxHash": "b44a195475f345fb99d9548ef108f2f6b9ab125382b665930307ba2bfdf991fc", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff23a6a238", "pubKeyOperator": "099fad034089a705c0ac19b7834c6538307b419dd41f239c009589120183c11daaf2208e09ceffb7faa0fc6eba58273c", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "c4737611b6c7b87e45293581ffd5ddcb329f6c6f1f7bf6faf815fa3d817a9dcb", "confirmedHash": "56eb474b73b0a3867ddc8c79da70fd27925535061b3f96362500000000000000", "service": "00000000000000000000ffff52d3195c", "pubKeyOperator": "135a40bdd844419f6ae4947a19a3a16e0fea3ef0e25eced627c25b93616e1a28d5ff2c67a9f1bc8290c54c962df9e976", "votingAddress": "3Kv4QNsoHXJrUFQcGCLMMwkwC827", "isValid": false},{"proRegTxHash": "e74bf16374c13b2248f9d2d7c9c48c1ae8e75aa1c4fb330bce7176c568a5d6d2", "confirmedHash": "00816d8a179d1e70ab5c7f004612cfb95f516ee272d4b5c62100000000000000", "service": "00000000000000000000ffff74ca1362", "pubKeyOperator": "8a7fc4c58356d50bc4d9c122cd5d34a99c0ea4703c6973e404d8b75c01f8240e7f66ece5103366f76134faaadff06d3b", "votingAddress": "25YwqXSwUw9g2vJ94MaqRFFe8e8b", "isValid": true},{"proRegTxHash": "4557613502239ac5e5945ba05576d4dacfd71439b270c95483edc9c8c5b4d349", "confirmedHash": "ee4b0fc2e092160032f46359fffed27fa9b2ad87a293cbc21000000000000000", "service": "00000000000000000000ffffa7ac2082", "pubKeyOperator": "82909c20b4e35416d3a6f3da080d1d3866646a31415c9e72adec44a826041b6568269d48dfc19378c8c9005115c87776", "votingAddress": "Qp6Vi1nYFQKGnXpui39wTiv1H2Y", "isValid": false},{"proRegTxHash": "37f2461152ed1509063683d1dbeaae9028dd1b6918e6327f2f161c5fb52dcef5", "confirmedHash": "54280dca43a70dbbfd2ad17bfd4ad3f97a20887a27af7bfa3200000000000000", "service": "00000000000000000000ffff5eb0eecb", "pubKeyOperator": "99d2c6dc526bb7bca548c8cab821c5071e671030146deccf2c3db59252791f5d0df8ff3c49d0679811c8730f83efeb07", "votingAddress": "3Xd2q5kRg6MsfR2LMz3UP2CYmNBL", "isValid": true},{"proRegTxHash": "70fea2c3f7bfe1964fdbe065c7f64c1d27d5da1d382f9c0efeafc2d32e60a386", "confirmedHash": "0ad045dc2a92d34c023e419ebd6d57c7faff5ec898d6eb511000000000000000", "service": "00000000000000000000ffff52d3151f", "pubKeyOperator": "0b18b79f40b3e7fe4b16ef532e7aad60305feca9851141d91e008dd4a6b432c499396dde36b95b82423030009c617927", "votingAddress": "43FtZVKvt1fqW2yHMWUiW5qDQq8K", "isValid": true},{"proRegTxHash": "258feb8cc04832799aacaa904b059a0364c5f68f730c90ea6b72e68a9a6d9524", "confirmedHash": "fd9e4c4e00d0406bf847d4e122a27fad240db204ea2149211800000000000000", "service": "00000000000000000000ffff8b3b15bd", "pubKeyOperator": "16439399b3f2d66fe071ecf6f1f4b2026908abb197f25025252b1609df48b6f37879926d78e2e807cc30df617711c1f7", "votingAddress": "fCRA4xASCE84bP4qXXEVJfM4LR4", "isValid": true},{"proRegTxHash": "fc7db87833ab49a94d2e66491ab44153d30f73c22330b815650ef217ab7dfdc2", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff03629a4e", "pubKeyOperator": "03281d2b8bd30d9823fb61ddba22f997230e55dbba5fa1be7d5b434d86bec28af73ac359dbc9070049a0e77017176588", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "61fdc954f0fd50569ce5eb9da3e4544c4e9e7da4097fc3b411e94195103443e1", "confirmedHash": "3e6ba1e6e972fbdd7279c2d1e1ae9a253ea1eac692836a801300000000000000", "service": "00000000000000000000ffff904cae16", "pubKeyOperator": "191526ed6e2d3bbd38967db79022fe7a430e30959d580d799cb387b4f6ec4559a320dd08872bc643b19637b92040c28b", "votingAddress": "3ZxAqtivUM9vbW9g6S9dhvkuUSz5", "isValid": false},{"proRegTxHash": "d82831188e3f2945b19c05247c07d170c8fc08ac76460063538fab00f44b624c", "confirmedHash": "77a9ca3a74cbe0e070d1cb53b02f4bce6662b330c04a70ad1800000000000000", "service": "00000000000000000000ffff5fd72de1", "pubKeyOperator": "049fdeb04bac8e284c74bd872a29fc901d3d299142fcf18d12f5b3cd6564dbbe0012db7bbd42f6447e0f3567981d1129", "votingAddress": "1LJNSDfUe1Y2o7GqNAkStDEWvkD", "isValid": false},{"proRegTxHash": "c6a928a67e14a7e7c3fbac9dc9d1ab882ba3c2ca848ceb91d572ffef41d25bed", "confirmedHash": "02c1cf11a6c0cfe503da074c32f1c1f45fa8ab21aabd72720000000000000000", "service": "00000000000000000000ffffcab6695f", "pubKeyOperator": "17ce83abd8254cc965a97aecfae7133dde5d5e7c51d7dca4094bc9f63b6dbce846e5b4c682ea6efecb235d623077db27", "votingAddress": "38URK7oxJg6qUeLAAMTu3BgL2dSq", "isValid": true},{"proRegTxHash": "948d15320286709ada93708110c0bd7cdc020cc88caf046cb85d198f06f6c96f", "confirmedHash": "84580fc296439b4958f6c5317e5d50f5261e7ba0ea0b52440300000000000000", "service": "00000000000000000000ffff86d19cef", "pubKeyOperator": "0efd290d21d161fadd1a4f4f5f0cdd55f80eeaf819f1f3a3130b0a405fb8a1d04984bf951286018cbdd5bf0650580101", "votingAddress": "JdrPFD3V4ZCXabh4LM64ZoFp1cC", "isValid": false},{"proRegTxHash": "56d491b0b3ddd8d3d3c53920c5365687eeefd950a623b8a0d5ccd0f4cade754c", "confirmedHash": "35a25929c6c23f758d7e72388aa97ff9bb80097bf26969ea0700000000000000", "service": "00000000000000000000ffff923b99cc", "pubKeyOperator": "10694a217916dc239879d350ac433595248d8ffab0a98f105c79f1f9ef2d616096705a954b35b616c01d75fb4657154c", "votingAddress": "47CE6YUmBc77cfo3WHmNBWQhB64B", "isValid": true},{"proRegTxHash": "64650f3607114ad887fc55f7367b1d9ab2f9466f43be2038db4e1aec3f6a5647", "confirmedHash": "b9aad072e3c96d236185221cf6f2cbf00262b02df0d082e50600000000000000", "service": "00000000000000000000ffffa87757c2", "pubKeyOperator": "81bd2ff57e3bb3f1ac171ecc4ba9e72b3196a9d0bee8fa6cc8fd5d340cc620b10ac916b2f586cd9f1011b8134bb00bbb", "votingAddress": "2RY21wSmhjHCwEhChYTzeX7TAMWd", "isValid": true},{"proRegTxHash": "c251b571c1e0c216eee5e2f701e6e0ac5b28d167620e39de3ddebdff110e5653", "confirmedHash": "c1ec7a2720821ab6952c9785b30cc79a8c2df7cd52d490901700000000000000", "service": "00000000000000000000ffff2e1ebdbb", "pubKeyOperator": "0c82d19581261559e55dcc6008249fea598abf602e0ff9246c08a6564c35ecbccb736f655997152c1b1dd500ffadb14d", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "f2cfa30ba9e258b8e3d897abe2cf9d80b0e56ea0c8adc0a32ac82f675b06af69", "confirmedHash": "fe096963ac6afafdecadf238e470fcb612534d52ef43c3671000000000000000", "service": "00000000000000000000ffffd9a31ed2", "pubKeyOperator": "01b5a48af111c36bcea7c6a0a6a613837441b8e82d274bc7b5f907670d02ea3da7505c10ff685c601a96989d2cc97bde", "votingAddress": "2xUK5dp7ukWC5p43HbMyPW8sNhzM", "isValid": true},{"proRegTxHash": "3f86b34ec34963c83c272624b0041953f3f492514e7f2981773b0858625d4559", "confirmedHash": "dae21056be7be38f03f3c8df1f9b0302e2fa891d4a26b0121800000000000000", "service": "00000000000000000000ffff59280445", "pubKeyOperator": "8b9370b416d4bd0ab9009dcbf4472ce241686dcd88fe8a0f57a093d2ed8823711a712f059d6c71303b26e5f73f293f64", "votingAddress": "4L2YP5da8awVdyXudpKg6JfMMBDm", "isValid": false},{"proRegTxHash": "fc3ba00a2aa4284e747bf266926c129c7d6fd8fe1a05cc24767e4da1381c1313", "confirmedHash": "f66bc377dc9859e6873f467e5de6e333bfc040fcd8d058fa1c00000000000000", "service": "00000000000000000000ffffac689c0b", "pubKeyOperator": "8e2c3b1b98e45c78c9ccd7934064da30b18f6891417a7915d8dd7ee3dc5be76baa6e164e3dc0ae7185e9a3b449bfe813", "votingAddress": "4WB8y9UeibjXtJdFcyfxX6Ak71Th", "isValid": false},{"proRegTxHash": "f3e29d0e37c77dc5e86dd2b0181edf422d3e74adf6b1a3489c2fa8f04d391ce1", "confirmedHash": "a6e3d8167e2e6fb7ac1b5d70db5e621dfd004ae101116ffd0900000000000000", "service": "00000000000000000000ffff3449e87c", "pubKeyOperator": "16853c781a3c83a006730b24614aef7e0bb082506b93794e73ebd4a5de6995167824f63b63c83750d2f61c44eaac6947", "votingAddress": "pPerX6iA4AwJgbt9nBxPJt7odMY", "isValid": true},{"proRegTxHash": "12463b03a15c9fd2394bf5b4f83f6953cd21623fa127a4d4b7ca43dfa3b59441", "confirmedHash": "8551a1d375cbb794a501676a5bd37d436d20645d6f4e3d972300000000000000", "service": "00000000000000000000ffff2d202ba7", "pubKeyOperator": "8182de8f0c3999c3c88cfe6bdbdccc2e3a2e21afed2816c150cfc95ce823749eb7a8592f1e23d736eb3b00aed0c599c7", "votingAddress": "3WciGUdVuMZWm9bupRadPU4qLq3G", "isValid": true},{"proRegTxHash": "31b5394a8780a2605496136e30a356366158a4c11302885f18636e0df372f78b", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b08e", "pubKeyOperator": "0e11201b87d762286646f1933894fa9829e9822486a842df1f776b4da2ec48ea41f4f0a61dfb2c861583a6a9c49a106a", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "faf19dd8d7ab73fb243e0752fc34a90300aab699745c4a49cf895ef857d6dcfe", "confirmedHash": "c5ebbd21a6484428cbf8a49151944485387d3619dc2ed34a3400000000000000", "service": "00000000000000000000ffff52d31929", "pubKeyOperator": "08f3849e4b3daf140178f0fcfb8d824d4df50ded2966e4f1c372ce98c8d47d522bd7f17c6fe2b2de63898106978c7719", "votingAddress": "4EQcNSejVr9tTvSayFGNRitnAzWA", "isValid": true},{"proRegTxHash": "aa388688c2906cfa9217711dc33128804fe6d9bba8a197aa1be65db044422012", "confirmedHash": "58e240a154a0ac48dfd26143fb8ac7413aa11d8f10f16e622700000000000000", "service": "00000000000000000000ffff87b53223", "pubKeyOperator": "98d478849bb1cc57b40c6dcea5a7f2bcbc2f821a78880a214aade78d68a5caad66a4c0ea1f4576c55d2f17e27673c4da", "votingAddress": "VwqnNEpQjhQFfiRcEArTv6REY8L", "isValid": true},{"proRegTxHash": "f034d20a7e0e88000e46993a0bc46c991accdb59a3ae805575659a9d772a4969", "confirmedHash": "584b1beb46a2faf83b6f9cf834b3c91ee88df41075d72bf61700000000000000", "service": "00000000000000000000ffffb952ca15", "pubKeyOperator": "080d3a267bb43fa72d1c65b0168925cf68dabc3ab7700c05a73d587bc40a47a812c56281ff85e445e82b6ff8ddf0dcba", "votingAddress": "WmLJXg7dHYos1JkJqrZFS2My83s", "isValid": false},{"proRegTxHash": "715f800accd67ff9880e52853d22f2618c4f8fad94d7f0517c85fb4772504b60", "confirmedHash": "533993f2fca3592f11227528ccb5eba7591188b706acb7630f00000000000000", "service": "00000000000000000000ffff8c5234b8", "pubKeyOperator": "138f21d388656fdd3ecc30ec37e57fabc2787de93c2efed98ca4189d1dd9ea56c2dcd8a31beee58c0bcdb245bccd53c9", "votingAddress": "2JfHYxqDNBRGCfzrfu49U8aVeE6H", "isValid": true},{"proRegTxHash": "23dfba977fbd30bcd1824d6f4edfa3869ade21568e733e965b5fe8eb7325d1c1", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96886346", "pubKeyOperator": "98b370a89992025998d954e765e1232a3d40dfe5122fce2476aea66dcd7ac2ab6d73ad13a0ccb4e5ed791b306fd45d7d", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "b9c2e8e908c5420dc7eb46303d4408f6e5de138dc0560e532e9c9609a2e0bfdf", "confirmedHash": "6d4c77891849cc8c4305e5077d4fefe8f048a8f3e39f073e2200000000000000", "service": "00000000000000000000ffffc28754be", "pubKeyOperator": "83c208a32abf4742dfab76577c5b125424c4c831e02963200c11b584ccfec01fbd575ee0c96d77de66c122d4feb997c0", "votingAddress": "3m5Xx9D7QLnhVXjE8XWkMdutuodH", "isValid": true},{"proRegTxHash": "fd40f6cb35431ad4da64b9eaab1b028fbc60ca8fc7513d7f20e408798791748f", "confirmedHash": "5b0bb62006908b98a8d895f1f75e5d449991ca23e02562e70e00000000000000", "service": "00000000000000000000ffffd41867ea", "pubKeyOperator": "0914cc132312f1e7f1089d8421873eab2dcdb59f6ac2bc82fc031ab3d27f408a4b84e6c901410afbf2cfa58d1d5a8495", "votingAddress": "6SEp9Bd35BFBW5F76XTRYr1Q6Ng", "isValid": true},{"proRegTxHash": "ce051ace6ca325709ddd58e159e559aacdd97fc49b89dc1b108b193ec34e8be8", "confirmedHash": "d8595be6ab78fe3d264d46df3aaf4ff6dbe810c1fbb7ea261c00000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "4FoHgfTY2K7zkyE91DhLiDAFhKtS", "isValid": false},{"proRegTxHash": "94132d848dc5b54b23abe0165c140494c4119daea80d7a8fefd13d50dd43b9ec", "confirmedHash": "7b12031729b85a2722ba35ce485c022efe96956c7a550d310200000000000000", "service": "00000000000000000000ffff36270a67", "pubKeyOperator": "08d0ed0f88b50c87adb4b6e45dd0f72f0cc1613345e72aa716ebbcdb5d769faf1735ad041a161bc92599266c4d2db36e", "votingAddress": "NXgq5NaevG2r7mAaAUMmLXAALpH", "isValid": true},{"proRegTxHash": "80254943ca28863e5a0b805f5efdcef50395bf1cd57b74a2c290f7e64889d723", "confirmedHash": "517f9abe98a7b32ca1b016fbf96d977865a7802e7eefd8431900000000000000", "service": "00000000000000000000ffff2f5bccbe", "pubKeyOperator": "8b0175b7fb77e9f03f8c7bd8e757409455be08bef16212f2ce265a7be2dac3f11222ef880fb52bb73f2a4923514b1243", "votingAddress": "naL8MY316y7xeBYyAt5Q8ZPHvKX", "isValid": false},{"proRegTxHash": "f73753d4fa35362e32b183f25e93e38e4bc154ec314e28622cde46f0e02ff059", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b062", "pubKeyOperator": "08fd72a2e32e7096be21ab42307d1086554f44b5fd1bbe04493d31db12691b740e2559359773f0198aba3b62d259a69a", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "4601062dfccfb70f2067a8dd98a6f823e358d5d54f90f759f3ba02a458741a0d", "confirmedHash": "174d0311b328961416002ac532559f358485df6e61dad1050100000000000000", "service": "00000000000000000000ffff05b5ca0f", "pubKeyOperator": "98c7239fbef11743af468e572c9b1cd77e70e9da72158131f10d91306a6bdd3f69b0b9e6c045a3a88b46d830c3727502", "votingAddress": "mMYDtKUdmdY2Dh1VVTgZDdh4P5Q", "isValid": true},{"proRegTxHash": "59b1d504db66341c33fa6793f9996d688c05dd40d9a6fab47233dd02933dd9a9", "confirmedHash": "84a319dd0f49988002a434e002fe35be3557f3a5133396d90300000000000000", "service": "00000000000000000000ffff2d20bc6f", "pubKeyOperator": "0425d25f15161fbd3829ed32832b4bde75037b3a309acf15ff850bf577d4a4736b4ccddc17d370a0c5acaff9ab459dbf", "votingAddress": "wp2sFybNRp21xjpQLqhwCVXtRdT", "isValid": true},{"proRegTxHash": "f93a236d2b4ccdf8ac949050d950a0e356196610ce3d9101e51b8f79a0a4c083", "confirmedHash": "aa67a8913594b0e76937e55a14cea827dbba76943a76d9961200000000000000", "service": "00000000000000000000ffff40e37853", "pubKeyOperator": "13a3aa65a213d6ad160a75308dbc6d38a0f060b2478bf4486f5a15ba03541ace45141cc32b29faad01330bb0e8232f57", "votingAddress": "34TUsEsApC7gWvzCdCNctei4pZcV", "isValid": true},{"proRegTxHash": "e6fe716baf4776d197faeda4aca6699b2111f2cacda17133e2d5eb20e9df5578", "confirmedHash": "205868c04c3602ad74a67b6fc43c286786c7308f0aa5dc9a2700000000000000", "service": "00000000000000000000ffffb945346f", "pubKeyOperator": "9728366710f2a3c9e93dce594fee43182fbddd7006438860f333a17d814c65ef43691d02183efc8c1205b789ddbc708b", "votingAddress": "4D9aDF1zUXD5ZAgm1tQno8DDEj6x", "isValid": true},{"proRegTxHash": "3a68945a9873025818c8b916ef4b63bf0ad1fa97acbe3518fa8e5190808fe689", "confirmedHash": "2a0465522ca98da7b298dd208cd3a7ad16becf7641f9e8c21200000000000000", "service": "00000000000000000000ffffd4186078", "pubKeyOperator": "19519254e4f572bdaf5bcb23f2d6c10ef0e592ede20b58b5bcb9227e07f2bb4a24c5f4ed3dfd398c95138aa0cdc12797", "votingAddress": "2qE3abY8pB3ZwymG1jWFCP8jEuuM", "isValid": true},{"proRegTxHash": "b7404dcdf0532826f06585decd51e050a437d804cfb03bbdcfa286f00caaee97", "confirmedHash": "47247948e618e1b287d9faa53f2b8342a5ac6b656e94d9600500000000000000", "service": "00000000000000000000ffff2e04d9f1", "pubKeyOperator": "163cc87ef2a1c76cefddf4fe93eb5fcdd92153a9f799b038956320675d4cbf78086a79a75e04fca3d8ed5f39563ff556", "votingAddress": "4Tc8wfHtHB2Q8xaZkdiTwUAu2TC8", "isValid": true},{"proRegTxHash": "09c32d1340ce359d9252ee5f953a0409135f509fe25cb5c59783f505ac2d3008", "confirmedHash": "29ced6e37b3d18639a203801e9a0cb5b4d0255de544a779b3800000000000000", "service": "00000000000000000000ffff55d1f113", "pubKeyOperator": "86726fb96cd80712d4b86e1365aa284922284c84c157d951b01b7ed4a596fd4c2ed37ba8c6cbcf9440457e86782967cf", "votingAddress": "3GWdUNysPF56wL6u7XKwL5EgZuCu", "isValid": true},{"proRegTxHash": "1fd69ae8b7d73e2c9fe36f125edbf7b052361bd35c35868413f4d33e3584f42e", "confirmedHash": "2d15f4ff7b8e6db5159168da6717119ca444dad99d2437471300000000000000", "service": "00000000000000000000ffff9df527e8", "pubKeyOperator": "033a5e7324cad62fd373fa5bfaba13dd6ba04ebf7ccd587c263f2c36931a9bfeb6a1a60584d58bfefff9ebf4bbec2582", "votingAddress": "22ep98iSscWnuzb7QRdr5sKoVLFQ", "isValid": true},{"proRegTxHash": "9909d2643614308efcf9841617f06f4a51aa10390e8f664ed9834b6c57b78ac9", "confirmedHash": "5ef20d351f40cb2164cf7e7fed56aa9a56d6c5fc723ecdf71c00000000000000", "service": "00000000000000000000ffff68f85be7", "pubKeyOperator": "97010e4419c38d06ff811a439406a4a01359442da308db2ef00c9f3d708e15bd37af5c6cba28ea0932f04006944e0954", "votingAddress": "4EnAU8KbsyUM1cjARp3XJyHWkYYp", "isValid": true},{"proRegTxHash": "a2f52df7d68dbd0c00a136518ad64b91fc8735b4c6ed3e3b1765b80e836d849c", "confirmedHash": "a6933e964f900db25b692801dfcb30556b6d813b692ba7b20500000000000000", "service": "00000000000000000000ffff310c014e", "pubKeyOperator": "06aeccaa4b6a4e7f5e4aec6ce969464a881123f933d3e5d08156615be58c5db7a3a41b4f159e94c3420661f29edace1c", "votingAddress": "2W5uAmEKTUY9UNBXi39gZLxzWHS5", "isValid": true},{"proRegTxHash": "b151b48ed45b390acb40a56c79c30e32c41218e11c12a61e2429cc2f2049270b", "confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", "service": "00000000000000000000ffff68eebd3c", "pubKeyOperator": "115bc709f4a650044a105fcb6637378e35c039cbd9833ae2b4661f65d16127676c19e1a7176e87e28d7e85c0d87b94b6", "votingAddress": "3Y4LKxyFGBabepsdQXDToUjR1t28", "isValid": true},{"proRegTxHash": "eda8aa464a94f7c17196c35c084d88883a39f5e0aa93ed2916a06cc2999a4337", "confirmedHash": "475079864a19c77db93b62085c662d1f4810fda1e3088fb70500000000000000", "service": "00000000000000000000ffff05bdfd43", "pubKeyOperator": "891433d784b40b96c2b49973ac68379c4cd4dbb2a6e7a29b1ca8a3000bdad04a1f3aacd474862fa2409615a1926543b5", "votingAddress": "B3XAsuRcxU93zV5P7U35PRPy7u2", "isValid": true},{"proRegTxHash": "1334ad7617c9ec53a04da0c067079f7fa12540d02e6412ac61b420724518f422", "confirmedHash": "00c192ccb42a1f5ee3153ec2acf5548a7b734eb373d472560700000000000000", "service": "00000000000000000000ffff55d1f249", "pubKeyOperator": "80ae6afcd54195691e8080a03c729b9ca5091a4267381d46dcf53b3f30f35f6653dd29073f63b28af9eb723639da2281", "votingAddress": "4SevVWrBPUwJzDryBywfdyZEkhC5", "isValid": false},{"proRegTxHash": "a9e317bb5507b2dca7dab81ef3810828196912ad11f4ff027bf94f953977e55f", "confirmedHash": "9692da48c4e0b1e7e88203bb8a7760c3d00d5fde1601286b0500000000000000", "service": "00000000000000000000ffffa877578a", "pubKeyOperator": "967bf9a1e161c578a21c1744cc1c8ec14e20280d6cf93839c529556a5ed6534e8897cb0c9416b788a8ebc7536f46cbaa", "votingAddress": "NxdxH7M8PsK5Na9gHQWf97ju8Pj", "isValid": true},{"proRegTxHash": "0731bc4bee47428adbb3f74b5dde318a712d21764898a369787943301aa59612", "confirmedHash": "238906ab2929bd7c43f950e1322831ccbf730da87a39c2f21900000000000000", "service": "00000000000000000000ffff9f59a4bf", "pubKeyOperator": "0736a61b0d5c6f0eb40628751c5032b12b3a73cfe9c1f6c22cc3329238eb99e1a1e43d127f8bf90e1a4bff8e9a6f7268", "votingAddress": "EKsRR5BHZuC5h9cbsHvUQGZejio", "isValid": true},{"proRegTxHash": "6fa5a1800199fc38691eba9fd14a2acd9ecd830bc50fae11a00b2b669cc91b77", "confirmedHash": "ab25b4d2afe1c56f9b33733608b170a3b2b23c76b6e934012900000000000000", "service": "00000000000000000000ffffbc28b98a", "pubKeyOperator": "150e2ae109c979bdbd1380a22bf9866a7e816d991b1d2cbe1fdcf43abc702389a35ec7af4152a4ded2bbf13a294f0c8d", "votingAddress": "AM8Zun3fRqJJvECU34i3gmiN5RR", "isValid": true},{"proRegTxHash": "835876532ac9a11f3cbd010248717048150078712fc42941f78af19789cd3d51", "confirmedHash": "bf1a566076fdf55155febd6a9cbc1f1b8ff94414459ea1be0600000000000000", "service": "00000000000000000000ffffa5e32627", "pubKeyOperator": "0da28402702e0781cf605769389f1f5bba9d0b872ab21ff3f3f0b4a46e707e96c2fbe16496b29d07d72a6760b5e09dde", "votingAddress": "3BcPRCAME2zHbh6nyojVW3SVYjmL", "isValid": true},{"proRegTxHash": "50f13f6f5f6578ef0a12c522c7c2b4a90f03b786452b8c5f4bdb11dcffed73de", "confirmedHash": "c8de078a0c3365b251d3ae316158cf54798142de866eeb091b00000000000000", "service": "00000000000000000000ffff9f418079", "pubKeyOperator": "110fafe1303bdf36aafe9baf9400d46c16f86a1a18255c47ebcc92757e3dd28e4152e5e2772de1bfb6c47b67adf0288f", "votingAddress": "2Cr9o9693bAcyEMyD16yVFFEnmwf", "isValid": true},{"proRegTxHash": "2cf838bd1fa8413f7f318c0e2cd4e80eb80cf0f53620b4feea8a76a392982b05", "confirmedHash": "cae72c75dc3ef5515c7e4a6519eff78ba482e7ea84a4726b2a00000000000000", "service": "00000000000000000000ffffa877578b", "pubKeyOperator": "02ce4a6041c4eb9b1bcd4eafc68c37b84b7dd3173e0d8ce76f439754b63c185cac6e8566c1444bc9542b85952265e0eb", "votingAddress": "2XTBpmKA5pFZKZmeNFNQW1qLH87K", "isValid": true},{"proRegTxHash": "53e09139fd7478c5fc515b74044c6cb75613ba1e031fefebd65dabdc438f8895", "confirmedHash": "47c7377cc561e015de56c0a854a144f252d004786ecb220a0400000000000000", "service": "00000000000000000000ffff55d1f1b0", "pubKeyOperator": "0f98a83303b029c4952af145923c101188928c95e424e52a0f5784f25ff8b9d17da1608a55219ecb4ae895454322bc3e", "votingAddress": "3Ac4Jo8ui9ey5JtMSceN7tcnNzPY", "isValid": false},{"proRegTxHash": "d89cb6ccabd0b4b4240cd42f92add887f293de13a09c2967cb063cd34f25d8f5", "confirmedHash": "d79eb2a5fb86119062da73a715853bf558cf3f7f0623f4df1600000000000000", "service": "00000000000000000000ffff2d209aa4", "pubKeyOperator": "030f383beef3c5cf77f34f77db500c055575e59955a6b6f57c1b791d8d96fb2e67e1af5f45351ab7c09ce616f7addb97", "votingAddress": "3CbTK9xuVCKVsKFETexpseT2NSqJ", "isValid": true},{"proRegTxHash": "9b4e5f3045055dc43173ced9aaa81a8436f1918820a12cf4e20e638d8ed57c0b", "confirmedHash": "d4e390c62128e89f492a9bff3a44321903de7ea51efdcee21c00000000000000", "service": "00000000000000000000ffff1fb20432", "pubKeyOperator": "87d729dc929df0a8b67db31ed01108c0be9b3f8371ebe1f742f54af0065802b55fc52b4e3e2c0e4d447cee0c205b6d94", "votingAddress": "7tGXkuGEwKZvfAJSMyPaogVJoXE", "isValid": true},{"proRegTxHash": "5c840d3d0ba4f7b8f5aa3c8162102b5ae7f8cfb4855299e54e044ad301128481", "confirmedHash": "d50c15fae30f655954934cf7d8d36a36d272cc1e3f8c6fa20800000000000000", "service": "00000000000000000000ffff2d56a254", "pubKeyOperator": "827f56310721fc15b5ae2b96c9bd8626d97ef38a708f8e15650c5010e330922349e225a7cdba90443a589141f9be1895", "votingAddress": "3BDAaSMRH4NsrgQQKyi9A5oogizv", "isValid": false},{"proRegTxHash": "9ea499507be1f57320e1efad2e334e9e3c7d37c726162d08b363ecb300131a32", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b054", "pubKeyOperator": "87dd99ef73c084f3a21c8cbdf2bf7364deb8f08077f4c1e6acffec4f4ca8f6a64183ddf98ec184a667f83e0f804f0b5a", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "711267ebb4b42ef7501e2dba3dd4872edbd8c4c50239f7a50dbc27fda1da660a", "confirmedHash": "997a923fb08d9be700b58a3b6c2ee40d92e874a7bfa5b82a2000000000000000", "service": "00000000000000000000ffffa8775301", "pubKeyOperator": "866bd6ca78a45c3bed4da4a72e73e6d7043d7cad98614b7a3de188abb2ca425cbd3f2c0a55a3b1044fdb9463fa034660", "votingAddress": "2RBiGjxGsjGkTL5taRN95c9WPU98", "isValid": true},{"proRegTxHash": "cc76e4b0e2f60b14bb630a958b9080bfdde110e4106559dba95f020d1283f22d", "confirmedHash": "bca8906795ef930e22c2083f2582bf9811c8f82c4dd899f41100000000000000", "service": "00000000000000000000ffffadffc8c5", "pubKeyOperator": "8429dcd197ff2c69d7c9ebc0f262a1c5fd9ef0b213b29456bf8072b83e7e496a98c134a0c1cc3fa0fcd77c5ddc0528e3", "votingAddress": "2geLAT38FMcvNrDEg3hMkysWWGfp", "isValid": true},{"proRegTxHash": "958d11857c1a8c425da795854ce9254f5957e2430ab7abc6248ab1d24861bd8b", "confirmedHash": "90d159e84b29b02e205321df8c0a01d4f7b057c21ea4c9270e00000000000000", "service": "00000000000000000000ffff5863215c", "pubKeyOperator": "17f852291517ee880eb460880af3ba44adf35aa34d56154fa48b87b8d5f7038e9029a5e37c11b99c4747e6fc37864bba", "votingAddress": "4NqBWfdKBpibCC4QVFUoZdz11fvJ", "isValid": true},{"proRegTxHash": "0cb4728cfc76ecb59472b138d2453ceef4763a4ec343af06aa4ac0a9ac7de259", "confirmedHash": "b3bd0f4d91647bd069ffed7f23e3e8f1bc0ad53451fb35c90d00000000000000", "service": "00000000000000000000ffff3652d427", "pubKeyOperator": "1304e0ba600854e47bcba269c8d35a5115c4e2569c72d3e1df64a0ee92f22c0efde55a75a73e2a3a1510389bd62b2234", "votingAddress": "p4D4VFz9tf6UYRhTLHmV6KZim2K", "isValid": true},{"proRegTxHash": "96c95d2198b61016fede2f39a0d16745c10accd83709e2ef0c3a8c9b7269c89b", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffff80c7448d", "pubKeyOperator": "06ca3e322263142ea0fc001a162c20f147c3f874ad67a5239466b5f61231165d2d5f84a73a47465bb583508cfaedca34", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "51f5505ace40d3f6a35f1239af0191dafddd23d5bafc0361d0fead74f765790b", "confirmedHash": "dc1c1c5f539ea09699d84d5d74aa1a89c738123c32aad4140700000000000000", "service": "00000000000000000000ffffbc28b990", "pubKeyOperator": "0e747d8a79dff0d1314cb7fa581e63082f28fdb7eea30e083f2b986d0c5de4d1cb80bf2a86de35a6f902bfd7085d6f67", "votingAddress": "meRSXeQoEz7ozv9kJKqfMp1FzTi", "isValid": true},{"proRegTxHash": "c4a930d93f80191f65278b297c9c6448ae0bd7a4553bb3f9bbfbfe1b2f67a029", "confirmedHash": "15409eee633be949ac015f328e434352d470299d9f6413141100000000000000", "service": "00000000000000000000ffff55d1f23b", "pubKeyOperator": "87ad5f9b4a281a092eebdcff454bd821aff140dc5727d478ae1328057540b61cb8bd98ec05528311346d9f64052a9b8d", "votingAddress": "pnZBNzMibfnZuTvYhYpWeMcNKiN", "isValid": true},{"proRegTxHash": "da28935f20428ea021c7e6e99e712586922d2181c7e832f2fff15efcc5d0feee", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff03633adf", "pubKeyOperator": "808fbfeeec4c0a805a6c18f845a8d6166addd99a8da3cd3c319f2224e17e6b754d8235497bc8e5f7a62ba8d94abf8a61", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "d94bbf6fd31008fab9fe9558e541fe7bd383e7bf5afe64634d5704e6903c89d7", "confirmedHash": "d117824eef4155d979434fba3ba7e972dea3e35045fdff972500000000000000", "service": "00000000000000000000ffff951c8cdb", "pubKeyOperator": "087f4df82477c4ae9fa7992bfb1cc713895f03b4f0fe8d658a6184778f41420035111dfd2efa282b93a9aaef28a35cc9", "votingAddress": "3KTNuqrDFHDHN7SprGssXdvUNBDf", "isValid": true},{"proRegTxHash": "6383faaa75529010c229362c9898017c8c3582795563ea8d838b4450c7d8a403", "confirmedHash": "d82bad0030563a5b669480b1989978c8a45566066a194d3f1e00000000000000", "service": "00000000000000000000ffffa5e32f34", "pubKeyOperator": "9716c115140fca3fd9c6ceb86357425d21e54adba1773ae7fbd00664065983835dc7c5c139c5cef476c0e7bb0d793c8d", "votingAddress": "GNahnJGoVqZ6VygyMTsTuMh2yhp", "isValid": false},{"proRegTxHash": "a12433b9fb4cba87fbb591fd78563aa44d2dadc6dba162869b86eeae5c2a1796", "confirmedHash": "395079fa0773b3face28f85016ac347959f939263ba13bb90d00000000000000", "service": "00000000000000000000ffff87b50842", "pubKeyOperator": "94bfa631b7421ee9db633af657f9d51f2ef3a01bf9025d6759ae01aa03ae9e27f3748474355dd9114fe65966948300d7", "votingAddress": "4L3HT8YyVBBgbauKTiPLGwLBMoY6", "isValid": true},{"proRegTxHash": "17a7b56c0f2e957552498dcbc8635c9a5534b6dd6719d736e87f7308933b488e", "confirmedHash": "ec8d7116601fa908fd7dc58677950532f18bc3d616ba88991500000000000000", "service": "00000000000000000000ffffbc28be22", "pubKeyOperator": "1113e6dada64581e5e358d28e3c8c20269ec5a6d0b01bded30bc988ebfc816cc04ca2cec66b120306209ce738f0f10a5", "votingAddress": "2UoxyrsJY8aLacPdw7SwrhNqm5Dh", "isValid": true},{"proRegTxHash": "623c0eae21d4c171194cbaa87c1000806601aeb2899b96645cc04f6ee99f0c96", "confirmedHash": "084aabebd797cd2aab6cbe332280e061a61a8a4243f41af71d00000000000000", "service": "00000000000000000000ffff5f552e52", "pubKeyOperator": "02e7397e035a6d91ada3beda82cacd9fb3055e6c95ac1ce6652471e5c3e853fb6734502e81d9931b6c37650d7e7eeba3", "votingAddress": "3qxXXnHHTuMpm8sQq8qEUXPsjbfh", "isValid": true},{"proRegTxHash": "9cecd0e3f26c34e19a18d0b79820f587938057e5971dbb47213b743964fac7c1", "confirmedHash": "bae115d2f1e828abd3000e84110700613eaf8571052f3b591000000000000000", "service": "00000000000000000000ffff4e8dd411", "pubKeyOperator": "04aab9472c9f1e6a397563d3224f0d91b50f3a25dfa3aaa8f5d4862b90a117fb109bd070f896945c2812cec6b5f7e931", "votingAddress": "ofz1TmiNhQqHoCGAyGjgH8jJbwT", "isValid": true},{"proRegTxHash": "1733b7da69e041491936c35644de611f9c88836dca1d8a2b134d530ee8bbf10d", "confirmedHash": "d3406fb72d6034764586b788057c70f440663e574ea642df0500000000000000", "service": "00000000000000000000ffffb23ee6d1", "pubKeyOperator": "01f9689156159a0589ee46b12549b81b6d95aa67265d2c6d17f8f08c6ddb1eced316c3762f519bc1caa7007d63a5f619", "votingAddress": "3v9nwZXkxzWGUc3fuF4mPw8Nfjfo", "isValid": true},{"proRegTxHash": "9648a1beac5462311b6ddd07e3cece12976b891863515576bd5dd3e949c0e170", "confirmedHash": "2f5046ee0582eb0b24eea5c6e28d29b82beca1709565f8661400000000000000", "service": "00000000000000000000ffffb280214a", "pubKeyOperator": "99650c6f0b401e1ffd2f63b9489bec67cff47d0c8da20276116f02a98de5dfb000be84054d3fc82b032d1c92378ce7b7", "votingAddress": "2aXnahxNdQJZ5w7ZS3wh2PNtM24H", "isValid": true},{"proRegTxHash": "ba42b2da236981811c1e16ca4da467d7d636629c430518f7983b15e13dc9688c", "confirmedHash": "2de93631ed66b67a87df8cb83c8ee318f59e3bb2962114350b00000000000000", "service": "00000000000000000000ffff4e2f72e9", "pubKeyOperator": "1767cefd2a49a4bee661234d9298298a125d670f52789ac3ee0f19c08df60f3bf241917a51d10e1157702c107bf31ff2", "votingAddress": "8aN9eY2WG3fHwYGVn5HrCAmWrTC", "isValid": true},{"proRegTxHash": "04437a7b1e1b94766d9cbcee38a2db753b00685c7a887c57d471c38b2daaa600", "confirmedHash": "614ff80655dd3d6aaaf247334763e5e4bfad4927f0380cb62e00000000000000", "service": "00000000000000000000ffffa8775794", "pubKeyOperator": "0511a3fd6483e847ec3743388a0b27d6e06ec4fc5aaddbef55be1dc0ed8b18dae49d3090157bdee6e0ee14ae100deb46", "votingAddress": "42mh6Q8BzaerWD1Gqoe4sfb7a7x9", "isValid": true},{"proRegTxHash": "a389edcd1a85e6256f9fc1f5b3326c95c69e6b3d01169cbb4e95acd58fda2639", "confirmedHash": "ece571bfcc6e952a594a823a9524158728d0b64a85bde1e31800000000000000", "service": "00000000000000000000ffff5fb3fa72", "pubKeyOperator": "023f5cbeeaf1cce563b864937c96d1109a086637106021d009aaa33aea1d8ee817055abd53213ab8700ae4c03c8234c6", "votingAddress": "2M6XYvvjFwi58TLQMWqbE6AEADi4", "isValid": true},{"proRegTxHash": "6694e717e836919728aed0147a62c0b96574cb7a8607333ce60071e5943b7c1c", "confirmedHash": "fb7e29390cec688709e50a139c679135bb0b80e6f0fba8b80e00000000000000", "service": "00000000000000000000ffff55d1f1b3", "pubKeyOperator": "1806a42e229d86e223a26bccc700667c8df250bfcc69d01359afe6839dd6e933efc328b2879837fd9eb456e221324426", "votingAddress": "4Ns8p39JCQ5bWwUvAxYrkDtLrQty", "isValid": true},{"proRegTxHash": "800a38f2d7b9f0f099ab3faa30b32a85e98464000ddca7cad1b7e2687588ba2a", "confirmedHash": "635e82d5edc1ed8210db7e0a5fc2aeaadee08a78450750d41100000000000000", "service": "00000000000000000000ffffc3b5f2d5", "pubKeyOperator": "99aa6df6df1b3aeda096fe2a2d8e4c9ad75ed4a8a5589970929d8568bf96ebd5d07b95ef90c9bcd398dbe19a7ec55b55", "votingAddress": "3kkyeS4n5qhZGWZvTmWF2eLM1mCA", "isValid": false},{"proRegTxHash": "15768d7aaabbc7cd7616e89a44adc95667c13143ae818e2d44a1f0b78c19915b", "confirmedHash": "31ebf6710a6a3dd68e70b09cf32a38db886b9ccf863ba1200700000000000000", "service": "00000000000000000000ffff310c2870", "pubKeyOperator": "00639daa57f4ff567ed0c386637852078d8cd959d99192d778d9eea2ed882bd7b40268fc92ae2de5944056ece8181ed6", "votingAddress": "38xkg68cXfWbXe5tzWzRwfmGuoVU", "isValid": true},{"proRegTxHash": "8bc7efadd38344f0388a43c1f30c84651cfe85a6b8ae6f5ed09d38ad870249da", "confirmedHash": "30f214c3f2ff973b0d3b16d45558d1f1b9ecb9bed5ba40191900000000000000", "service": "00000000000000000000ffffb23e8033", "pubKeyOperator": "89647f7632aa1d2c39469658ef7fb9046a2dc64dc2002a4d0b282b59ccb2547aa42a0a3b68b19dbbb1a994e41d9b424a", "votingAddress": "gfAK6oZVdxszqwnfKvLEJESC1QG", "isValid": true},{"proRegTxHash": "a2557ccbdc16fb95560f03a2f4b6a354c306aef3d9c15c7c4fbf209046ef5472", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff22d9a538", "pubKeyOperator": "178eb83d956c633d57844a4d4e2d215d61cdc7098fa644d2b96149c4601d59adada1fe6f854f6c34d1f2f4e96e63f6f9", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "ac3c8ba0b3055e68aab4b43e16df997395303194c5de3b81ed593c8bdcad6a2b", "confirmedHash": "52f26949ecb8bb58212184998dfcb2cd3ee891bb0c08fa300b00000000000000", "service": "00000000000000000000ffffa8775302", "pubKeyOperator": "14cccc0d63a1cb8b5e434442cd1983d8a19d31ca5bb0e32d1401e4fab9b6919363dc7674faf5a854b92a60c1a615471a", "votingAddress": "Pdmjmhwa73BHod9tUvStxHM9Gas", "isValid": true},{"proRegTxHash": "c0792f1d3468bfff6b447352e37039c603b814ead6badb2f32271300e35a68b8", "confirmedHash": "0eae423e379ac702458bee8fb8599fe3a36665aabefd66540a00000000000000", "service": "00000000000000000000ffff87b50847", "pubKeyOperator": "8cccf6acec961473f520849c69a346a706a65ab23785e1e08921c98336165328a2c7624a5d5382992c78ea6af8c25313", "votingAddress": "2T4deUp296NYjfEcqNgYEXfBoWnF", "isValid": true},{"proRegTxHash": "09cbbab8900a7f2ab24a641f3f75586b1e32ca1d1b93a9ff626df85606c026c6", "confirmedHash": "67950de3f1acf43fae8687a9c80d93ceeff400badbc1aeea1500000000000000", "service": "00000000000000000000ffffb90537a3", "pubKeyOperator": "877b82c0a8ebe03131f9e45c84d7cd5d21972cef7ad87265a4b94bbf2a68e13ca03f39d0edacd594334ab51f1587f27a", "votingAddress": "3Vv3QdHTaj3MGSWiKUf4aASi8PLd", "isValid": true},{"proRegTxHash": "583a83d0542d2b30d8eea963b2eef126e6720313595c55ff13e8025b9c5cd262", "confirmedHash": "401d53a076b0316c86e2fcfd13917f25efffd2e763bb354d3300000000000000", "service": "00000000000000000000ffffc035a45e", "pubKeyOperator": "94d26cce828fd4a2beec8e85f5a50f3d936368b9c8a3bf879ed3134814178e69856b123c33eb15dc8772c86b172033f8", "votingAddress": "4HdmDJ37qq9wjQTrozesCiAq41eD", "isValid": true},{"proRegTxHash": "4840d93f6168feb64d97adab6b2dffb89ecf715727c062b336375ffdb21936cb", "confirmedHash": "584b1beb46a2faf83b6f9cf834b3c91ee88df41075d72bf61700000000000000", "service": "00000000000000000000ffffb92dc1cf", "pubKeyOperator": "12f087a271afe203ce9ecc07c43fafc26c751940dc66384f5009243cc79cc7aecd75d64ca6ca223106e23b5d53b5204e", "votingAddress": "2MVZDMz3QgToDFqDCzfGnqPFD7dH", "isValid": false},{"proRegTxHash": "dcd5e7b6631ac34e668841aa5a7f9dd6ff3176df49b01dbc9643b09aebe261a3", "confirmedHash": "ed8a54a40f9d4a8d059b898de3ce46533d010e3f1ecf4a490600000000000000", "service": "00000000000000000000ffff2e1ebd74", "pubKeyOperator": "19fb7e27e4a0184b7e587e16b34557329f2a3605907c91a0e1fb976a89dc91080dddf3eac5e740200f68f046882747e6", "votingAddress": "2woJDUnNy3Uo17nVeNRcEAnor6nL", "isValid": true},{"proRegTxHash": "2f9b6e470b9bc38e1ca9baeed6cd1f76dcdf612baf05c671b3420cb733f9d3f4", "confirmedHash": "019705effb4c7068f62aa8c6cb0bb10ecda5818b604130201e00000000000000", "service": "00000000000000000000ffffbc28cd0f", "pubKeyOperator": "0a58c16b128340a67e3b7c880e72920bd1f46a49360ec513bbbec35bfc1e12ebd68f18e67d0dcdbab6a024f8a38b6d73", "votingAddress": "42sMUpSu8ssDw4Fn1TACNXM8BUyu", "isValid": true},{"proRegTxHash": "726640d47bd59fc0567bc290e734e87619d5908bf83f04c3f1c0f72ded33c608", "confirmedHash": "107e4f231472a69e18cbb93851b75d146ad7fe844b0112240700000000000000", "service": "00000000000000000000ffffa74705dd", "pubKeyOperator": "975ea42b1f247c58cd7549623d5df3b4a121a28e9433d1350693d151e06f76e7fd61bf63c811fbac504069857cef58a2", "votingAddress": "4ByDRz9ovbZh6J6XsapYMqB6AFTt", "isValid": true},{"proRegTxHash": "17e81fa5c464c117f29ac34cec5a6e7d4888aec9dcf9890d5f23a1e6f3540c62", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b058", "pubKeyOperator": "84e1a8e8d3daa0e20c0baf92a65eb54be3dee4368a91532a55ab7fb506f186874f15b9328558c6db03ee8e7cc725044a", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "0e8f23d5fc0de036d6e2d55f1342152a4fab954b71dcfab30f3d6e08395767c7", "confirmedHash": "9801721fd00d9b5e20e757693e7c19651c2d2e500ba9a1f01400000000000000", "service": "00000000000000000000ffff5fd84fe3", "pubKeyOperator": "960575d830cd21d09d1ea4ac519cb2214a491276441440547472a06eb1ca77604878e10084f3a9b3be7f3c6ce49ad771", "votingAddress": "SX8KiRPsckpqFsZgBVtPTupgC2K", "isValid": true},{"proRegTxHash": "601864174ae7ddd855a02eebfbca8fa1b7992f1128b55e451593b6146fe72530", "confirmedHash": "5388ec12e2dee3d8083af02983d4c6940c314c4b1dd6fd300e00000000000000", "service": "00000000000000000000ffffbc28f167", "pubKeyOperator": "99e775e172f90f9ce00ace38c21498a3c502f435715546ef313a1f0a465afa44340e73e7efe7f18a2999cd3a786708ae", "votingAddress": "3vC541ZsySmYTh6RvTmQ4pZWxB3r", "isValid": true},{"proRegTxHash": "f75a04ba63b6aad7839346f2db0fa4a2259f1bba58b2b5e062822b561535da75", "confirmedHash": "6a8703a7407c29d75e2157311a1edb171da1e7e07e47cf002400000000000000", "service": "00000000000000000000ffff9df52d9c", "pubKeyOperator": "92bcf26bde60eb54669ae77da34f1d29e1676d6899833a17adef30f5c892c98c27f0c981c734c10f3553ff2a82505c87", "votingAddress": "vMhY5CnJ15a4i5CE9JxAJquN5Fj", "isValid": true},{"proRegTxHash": "5cff16cb2c9e17ec31b79dc0cf5e6960a8abdc4dc3f60ff1bddc39f73d617aa3", "confirmedHash": "ac4d1a75b7f869c4d2c23070934b1f88999158fa90c126b40200000000000000", "service": "00000000000000000000ffff49ebc8b9", "pubKeyOperator": "06c5b2eee5be479248822e1bdf23a97c5a0ad90c17620e9aaea10d088e52121f2330778c2b57bd4f66410e94d329866d", "votingAddress": "4WyMB4zTmtMqJfZUupanHp4cszax", "isValid": true},{"proRegTxHash": "5602d473af5f173ba3b21736c860500b247e5932521a9173052352062bf7d67b", "confirmedHash": "203b420d0f94416a61ace28aa860ca47487b444368664fc90d00000000000000", "service": "00000000000000000000ffffb07b39d5", "pubKeyOperator": "0e8bdf116c2b03725e19c394f5ce13823ead0c68f67058da012bb6553b2fdd27d3abedd7053c60430f780f1eaed82843", "votingAddress": "4ZaVi4bvkJJv4eujJDuT4wUgPoye", "isValid": true},{"proRegTxHash": "dc610d75f2e7846d132c5cd143bad5d157b002e43e165aa8ebcbf18a9a630849", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d564b2", "pubKeyOperator": "1256ba1b27452eeed9804ac1837728585448c95c5f39d9c88b78241180fd87f02478fc211c6edc5c9bd2ea2b8a16dcfd", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "16e4947896375de29537398e6070aed0ca976ac183617e874c1374f80bacb416", "confirmedHash": "0ec6d6325724fc332bbefd1d5d001d5f1112aba67589e73d0f00000000000000", "service": "00000000000000000000ffff86d1c71a", "pubKeyOperator": "8900f1e2e7495edd19292196e88414ca62c27ed4b241322e1b5ab2a5c9ec6bf83031a07958c723612e1264cdeac54127", "votingAddress": "6yCuBvQUwUBrMwuTQV2sCTyLeeb", "isValid": false},{"proRegTxHash": "6f5a3bc247e0e26364991ab37706e838aaff047fd3247c9531158109b0e8d30b", "confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", "service": "00000000000000000000ffff453d6bdc", "pubKeyOperator": "862f5f544f7716c79f1400996b984c391e0e250f2ee15836c70ff8f11f61bcc69b5453370a8a86c2495f65260a897ff1", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "1d25850c28db8aa9a6def5c89ab0bfdeb691a0013f7ad92f60312c5a19dddbf5", "confirmedHash": "e53e170619f2a2368ca442448697f12921071258a1e119cd0200000000000000", "service": "00000000000000000000ffffaa4baa87", "pubKeyOperator": "187cbb120c1a104afe1ea464a65ca0717eeb5770887ef94fce97372d0ca4564288ec101e2ec87d365b8b0d1aee047115", "votingAddress": "VUjiJhDBPNtvdigTk3Ue1Jjaq7r", "isValid": true},{"proRegTxHash": "2fd8fa0aab4f2d0bf6c967daacb7d863bde05d0fdf4377f8ec85f3a57d4cb1b1", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b096", "pubKeyOperator": "8bebcaad243b4350c08e9a448a5999835dca4aa8a446b41822ff9a6ed87733d2a47d8b5a54c9fba46f3bc9c15ceadd59", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "b3cb2ad78cee1794fa2a52ae54877f88de32b601cd3b4da07d82b8baf08b04a4", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688e024", "pubKeyOperator": "0ff648d7858662b49611a92cac234f87fea7689cc701147fcdf3151286c60c1f8a2b3b4dd5ed08b29721a3eabaa0e2fb", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "2b11e1b97ec06dfbbda5099596cc2d205ea7facf6db585cbb972686d550366b7", "confirmedHash": "a232f9797268be1ac3fe32b6f691e237c646838a09509b0b0d00000000000000", "service": "00000000000000000000ffff8b3b45f9", "pubKeyOperator": "8285cdc93e77a1267f24839dd08e177860268583167290bf60fcb3b92913fc1d37bdeafe42cace0a0c754fe5d4fa6370", "votingAddress": "4CpVjgKcGsXWs7r4rb3SRfUBwdVX", "isValid": true},{"proRegTxHash": "cd55b7af38a34231a5a8f9d2e67d07fd46237298de5ce8841dc4c5d44e765e17", "confirmedHash": "fe096963ac6afafdecadf238e470fcb612534d52ef43c3671000000000000000", "service": "00000000000000000000ffff2d4d377d", "pubKeyOperator": "10e9e13d0057178e95d6fb9c7ed3a69986cb6528d538e67e8abd7fe742b637069ac8b14eeadcb6ba79c96f1039cc3483", "votingAddress": "3Vya4WLLuTKa9Ux1NnGd7n1xPiUp", "isValid": true},{"proRegTxHash": "554fb6c3eaa11a7e1500180e80c2714a3168881079038509cbcb244d7879d3fc", "confirmedHash": "6a2c8a71716ca7c2c73bfcda5ae4940e49af9e5bef2301801c00000000000000", "service": "00000000000000000000ffffcebd8862", "pubKeyOperator": "14b0ced7bad21b25ef76fbb7dd656a35fa513a9cf1cb82aa1b04d8e22035ba8ce0961a8f671aceb0b0681395ff8732b2", "votingAddress": "WhJMx6nHAkf9Yb6BktDjNJ441QJ", "isValid": true},{"proRegTxHash": "3c9c0b1240e375f5bb846d467396741c27c3b08abaccaaedfe3467151c38a008", "confirmedHash": "be37393507fafd0162b5f76836d66f1169ed76304cd99b391f00000000000000", "service": "00000000000000000000ffff87b53481", "pubKeyOperator": "145b47c422500660c83b9f5c119146130a31a3b6548f91ce209c4e0867f1ee1e39696f05b4c52404db9fe92c3e79cbc5", "votingAddress": "331kQoYg3zuoVVQszR88mMiv25KB", "isValid": true},{"proRegTxHash": "2c65edaf906119ab09262441a900cde2ddc61381ca0f39f563838b1f924dcd16", "confirmedHash": "cdd3539940e9a3c9bd86855bf6ab39bdac7246ee33b86afb0e00000000000000", "service": "00000000000000000000ffff2d4c219c", "pubKeyOperator": "975fab0ede49d9763ffee98b70c96bb99952c6d09a7eea9237b64b1b20cbf21d0f20bddcfd1bb4897504cc01c37533c3", "votingAddress": "2zUC2vAPiysJZA1xxNFVhMFFfd3A", "isValid": false},{"proRegTxHash": "29e200a83cf91d5d11a68a2c24c2f21affacd7f1d561e571e330320ce1f15d56", "confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", "service": "00000000000000000000ffffd41868fc", "pubKeyOperator": "0e18210c8961d0b7183591548651ce6a9f636329ab836118150bafb9b1f078a404abdf969cdfe51928fc75355bb3e222", "votingAddress": "tt38SBNkQ2jor3LUonw883mcj3P", "isValid": false},{"proRegTxHash": "c6b23489f32afb601d64316348d21a4ed211c1dfc54a41df38ebe9b7ddf20a2d", "confirmedHash": "0466836740481df381aebafccf63b9738cd756311b9de9b01000000000000000", "service": "00000000000000000000ffffb9453549", "pubKeyOperator": "18414acbe920fbfc67453ef055b6863e4a727c30564b13041eac509a9865dcc4f2eec63cba3a95c8974a437a91d19560", "votingAddress": "2tq1aQMP3vsVG9g1yvpTtapxPqNC", "isValid": false},{"proRegTxHash": "bb5a8915c2702dd50af5a60c70a7648ad2a90eeb39e412b3499ba8e614f0eb82", "confirmedHash": "d4439fb0db8b3c5319e0e6f7d27ea3e4c10a9a13e779c4a92600000000000000", "service": "00000000000000000000ffff951ce136", "pubKeyOperator": "0ab19babf7810bbbf6fc0a0d8f54408bb2637f9762983c953bc90405bb92fc00bd69d3c20c54dc62c797a589c601b5b8", "votingAddress": "21hPZXXHgZzPkr4cbwj8RPVVjWhf", "isValid": true},{"proRegTxHash": "d4414b942aabdfac216cadddd9daedb12a3d5987fbb291ecc120782aedf5e6b2", "confirmedHash": "95a5e79b6995ab3b7024607d10ad6d60e52d2c87b04899270200000000000000", "service": "00000000000000000000ffff8b3b462c", "pubKeyOperator": "8d7c56fefa1bcad04484bbfd8d8884a0536e34f035d186494fd5a84f481992d796d44f9c2e148b71e8150fa48f3969c9", "votingAddress": "sL1MBHdMWn3xQbHhPyFCLxmyk9k", "isValid": true},{"proRegTxHash": "85244daf8f8157316317b3c4e8076a0c00082a70fb3e345b5db060ca96782b33", "confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", "service": "00000000000000000000ffff55d1f266", "pubKeyOperator": "94702961f88076c8c2b40bcd1de5b5c25e85304fc3bac4ec5d593ed008efab94855a5582415edd06a619a3097f59d833", "votingAddress": "hEtHbDpGP5MDaFRrZWqxJqgprVg", "isValid": false},{"proRegTxHash": "89c8d4ecb952afa5aa828cc84cbf26d78c7288ae6ed842a8f09c8b6750b37108", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b050", "pubKeyOperator": "068f996ce6802597e3668e126b9881364aae7de3242740ab70f2e26edf230b63c7b39ac482995a95373bdbd89efcce3a", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "08c3ab5e6d1367e74e12bfa922bb0dd1f40bf50fdac97a044705c412c6a4dc9a", "confirmedHash": "bd26eb25b1be6fd434c12c8096f353f754441e25864a32c44000000000000000", "service": "00000000000000000000ffff5f553773", "pubKeyOperator": "85125394fde796f328550d89404783f072126322392d42e2e37357ad6046bdf65b384017b440d23a0380adc537bd95dd", "votingAddress": "3rWxY8ZBgUNVtPJPYSsor9GTn6LJ", "isValid": true},{"proRegTxHash": "0aff198e5116faf0925f294267ef0c5d998052a795cec81f8ad6d58bd4f8d96d", "confirmedHash": "ab4a5610c7d928235460834c9a89f609605c5420c488a6fb0100000000000000", "service": "00000000000000000000ffffb23f7983", "pubKeyOperator": "9922820ca2bd0c8e3bc31c9250e4f7e3e36281ecab55ed5a9d9970fb61a7cc6bcf858a9b6e2a54071a36ec0a067296aa", "votingAddress": "2jRAErVr2QDx92H6VbPiQo5dCnNY", "isValid": true},{"proRegTxHash": "4bf68a07b41d5112ad35c9888c4ca1eb7cd85e704875de23dccbc07e75539867", "confirmedHash": "ddf518d83483a5e8fc92c1fc1d140cf5d82c8d6114a283990f00000000000000", "service": "00000000000000000000ffff05bdfdfc", "pubKeyOperator": "16aeb534e52b519d559aad95e3b7c805d29cc903c61a614b01c271f9c0a73e7ecbe3e8974c3c31b6d36072bd4bf46ee5", "votingAddress": "45PpoLJ3z6Bjnuyfpy3TVsKrZaUR", "isValid": true},{"proRegTxHash": "7c2a5bd38544e706e4cb5827fb179f9fff646041e01c5d552917dd0b7b89794a", "confirmedHash": "36f4894162d743238ea16030176398f40e1baf170d2f8cc82700000000000000", "service": "00000000000000000000ffff5fb38836", "pubKeyOperator": "10e0500917ad83165dd0c49fac6081a7ea56b20c5ba5ac67c99cd4e6fa7427b6867310ad877827f5c1071b44894449f4", "votingAddress": "4FFnAETib3qQwTC3qpJYknUBTYWA", "isValid": false},{"proRegTxHash": "cdfcb520e99fdd4d8816588bb8c5d6400d1b9170a9360a43e66d0f29bedc863e", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96886317", "pubKeyOperator": "06662b677531561104465f191d691f79227b4d231b24ca5e1de164330b249c11a91ffa76d4d55ae935bc9501069b6e69", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "82e54d3df0d5a0187bb99a9ca3378d78abcb866a640e6f61f03cb8a75cbb55e6", "confirmedHash": "b7d01c9b5db3aae40d4a003590faf956421dca32c4a63a8d1000000000000000", "service": "00000000000000000000ffffa516f81e", "pubKeyOperator": "0fc0ce5a9968a6d62c0b0c0f34aa332973c757fde6f62580f259988e5115b694614a036e336aacd1f4afa7623a6ddcb2", "votingAddress": "2YqSgAJFENYHvy6uv24t4kG2LgAj", "isValid": true},{"proRegTxHash": "603920653dd6dae1de4da4589c061d014208315afacecc1879f7dd4dce463771", "confirmedHash": "a72879e817682cece2e019f2360d2a451aa648628ca620e51700000000000000", "service": "00000000000000000000ffffd4186837", "pubKeyOperator": "0364fde0e35de869e381106a333a0535b28145e2647932c310a498d0f7f56fc834363dbd0cdf1135c8c8c56b6208a29d", "votingAddress": "ibQVhcDwm22yhNQUYupzBMSexkY", "isValid": false},{"proRegTxHash": "f9d7abe44c0e27b614dbb78a5dbbaf6e770fda427c5979680003aa0dbe73f7fb", "confirmedHash": "6041e97da41fbade6a71aeb65f5dd9392a6c972ab0e0f4a21700000000000000", "service": "00000000000000000000ffff58630b09", "pubKeyOperator": "8d770d2a5bee896d43cd58e04092ef951875c3ce27aa766cfa0ef3fd66c648131762ad676320af0455d9bd4d63643123", "votingAddress": "2EcoCKf3j581iBbk2LjToazosq5q", "isValid": true},{"proRegTxHash": "c7e1dd1f49ad5d86e7579c3ff3ee0acfa7df901f26fee4bc19ed4f1ea8fccd99", "confirmedHash": "96bb8c1fdb7d475eca88967c0685368c89ad6fb9d73baa320100000000000000", "service": "00000000000000000000ffffd4813fc2", "pubKeyOperator": "8647f609c4d9a35da1c262531abaf99022dfec3bd6bdd379265f7674b2e314fc1bef866290f19f87edbb6714b3715d49", "votingAddress": "3zLeJZpKbqP39JZR594vXjboLBnE", "isValid": false},{"proRegTxHash": "79067784238651776b18f9a619efb7684c9cd49183809f95b0e348558b8a6be0", "confirmedHash": "66f0fb7e2e463b7ac91f66e527268ab97c0cbbbd3e371c100f00000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "3GKH6UPKsvwVABSXHJYR8FTQkMFC", "isValid": false},{"proRegTxHash": "b0410530490e2033da8bda62636d6e79b5bfe7ac901ea6e400e44022269631af", "confirmedHash": "9025543fe4a36473fb179166caefedae676b3b9e3cda4b270100000000000000", "service": "00000000000000000000ffff5fd84fe4", "pubKeyOperator": "97570fa507fcd502b39c81f969083ea35cfce99abbc6ea97ae39147afdbcc03853c16b5aa69283c72864f62809c6dfe6", "votingAddress": "3gjw4TBfPgfSTDbL5ZKbLbcsc37S", "isValid": true},{"proRegTxHash": "3ead7762ff7c768b08af858d1d792d8681daa19eeb74bde43d225b6d0285eac3", "confirmedHash": "d428e559a9ce058c11a4658baae0bdbb80fd1b8cc7cd81a51100000000000000", "service": "00000000000000000000ffff6c3dc6f2", "pubKeyOperator": "0a5769895f3e51b37567be9cf22f8ea076aa51a9eca878a385d3721ef72804b4472a5e9808f274bded67c4d5ddc6c8f1", "votingAddress": "3axWqxrgUrEFGZ1p1rXuQrDh99Ka", "isValid": true},{"proRegTxHash": "a570476458478db57a040abb1744b2c1e1e2d7e43d5dc807de37f2e6e94ed21f", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff23b6b538", "pubKeyOperator": "8d4b3d39f5aa357fafe8b61111ed7db533b2f1ba7a493bc5ac8411e38763a35e8d24d61c4363be327d736c2bdd6678b0", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "fca91a0f0b5be216cda996b8840194eda702f327a0428f8647341e6dad0a4586", "confirmedHash": "44bbcc917450905c4c682062c4212c42797c62fbe8da91de1400000000000000", "service": "00000000000000000000ffff5928015c", "pubKeyOperator": "88d230430eb9b8e3c8e2f7fc2bd633f408c46f5f838a96463502a48a597e2c730195d5c754da5bcc6718e382a6a0c709", "votingAddress": "3r7kc6ZqocUKxVmJVcqPHrLgh8R5", "isValid": false},{"proRegTxHash": "318ae59f0ea723eea7825da8d259fea3c243f67c89dbd4963f0b1f4486c526fd", "confirmedHash": "4113cfb08ade9f1b5d935bf2d7223e28d8191bb01a7808d80400000000000000", "service": "00000000000000000000ffffbc28b6c3", "pubKeyOperator": "0a3c17c3f4ab83254cc4a2b9ac7560356740e2c77849cb9e033f41bf195efb2af67637d2d0109a5ae4f5667d770f5bed", "votingAddress": "43RXaQeJsm2d9UfeHMuPjWyFFzzm", "isValid": true},{"proRegTxHash": "61fe9a9d0ec391e3f1bca74c03c97e1b091c918133cbcd2e664a452c629bb1af", "confirmedHash": "2065c1586d5a0dfb968925b694d080421c506e136cfb62ea1900000000000000", "service": "00000000000000000000ffffa45cc1da", "pubKeyOperator": "9479c49a885d0dec2e28b96e3e25756bc5584cf7d218020df720b1cd927a6cdfe5c8387dfcf1502b046ed4bdbd50b7be", "votingAddress": "gmf3QKaazxATaYSb4VbxsMmwFcN", "isValid": true},{"proRegTxHash": "e068ee22d2d631167c00614926072213ed148e128b0727b84a4f5e096a090af4", "confirmedHash": "dde91a1d171ba9d3ccee4056b1e26fa53abb9dc5f144c3211500000000000000", "service": "00000000000000000000ffff05652ce1", "pubKeyOperator": "8c8440a82f2fa19bcf1a1324de03db6beba690da39c79c7e09835728026c46a59475e2fae6d0fbe20c01a128e796aac8", "votingAddress": "2frshiNH3wVvYoA9txTAVRHmAnRj", "isValid": true},{"proRegTxHash": "c408221fce4242e7e76a72dcd749020299159a5ef9ca555e010d2d0ff5ad96ca", "confirmedHash": "0d18fa86f9cec03ad82c5bdbf248d9a85d71ba13ffbc87320600000000000000", "service": "00000000000000000000ffff52d31516", "pubKeyOperator": "98e0eca7ffb4a5c43d970d94627ff1ee1e15b748b0e6e4bef58b2a4539288f1d19d4a20352b29a89e83e5ddaad5558f8", "votingAddress": "6qXGePa7WoWEWePNGiqc4Y1Zg1L", "isValid": true},{"proRegTxHash": "8c198a544881eb68cf7fbf3a92cdb97cbb4ba221045c8b99595e551746b4213a", "confirmedHash": "62421778726db0236408b19116aa7c77ddaef53e9152a0b52400000000000000", "service": "00000000000000000000ffff258b059f", "pubKeyOperator": "8218f9bc0e0b0ec8a7e41b23d6589df6cac287d2ae80bfe1b975483fbbcd42bab5b1a3e48943b09cf449c3db27594e88", "votingAddress": "6gmtSwALbmU8KPWftp6WWTkvQUV", "isValid": true},{"proRegTxHash": "6099e08bfeca80328e0c1e3c2acc1ae5af9efb6ee93a9b62f2bc46828380f237", "confirmedHash": "47247948e618e1b287d9faa53f2b8342a5ac6b656e94d9600500000000000000", "service": "00000000000000000000ffff0509ed20", "pubKeyOperator": "0c444238f832100e48fb1fe51ebe73a6ba04f9c1d6d577d47465aca39f8a3e4a584547c4ad676cda8b4ef06105225550", "votingAddress": "Kp1Hp2zmrihwYjgCJc5poFCPVjg", "isValid": true},{"proRegTxHash": "e73d740e55d799f059ae6e370664cd2b8731b23f25da3e6a50081a5266eba990", "confirmedHash": "bd31f35c5cedbf07c6ffa716f2a3acf8f725ab42af8758740500000000000000", "service": "00000000000000000000ffffc034a645", "pubKeyOperator": "8f22732d2660bb55ef7787c78352295829c47f8fc90fc0985c6f342a7d38a8364345c631581a6e66ef9661595c485758", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "3c00e07eee9c7b7c4f5bf6240251a05b7c8d75d9b8d1cc9ef5dbc97b8b1ce46e", "confirmedHash": "0254ce2d992582b91e7111b382cb6e1f775d0632d422f1ca1900000000000000", "service": "00000000000000000000ffff36d3030b", "pubKeyOperator": "8c217e39c20497d0ea77334c26841b15db531839655c7887ee504b5f9dfb559ffcf475c945a0da86bc46107877e0652a", "votingAddress": "2mo3ZH4NKkgVwF35u2tg9qpbCeEv", "isValid": true},{"proRegTxHash": "0286d9458cfcf15b549a1c0eab27f13f0f889d706791587f52e6cd4121ffd0ba", "confirmedHash": "403a412bac6d4ee54eab4cc9511c82bfa31bbf28b84384420300000000000000", "service": "00000000000000000000ffff2e656c44", "pubKeyOperator": "0eb811dc1ce20c14407b252919d8b3b23ae93f4bc8766fbee3389696e7a9c78e297dd2115447b065f42900e35f789944", "votingAddress": "WwJcVUB1JhpGHP7Z83EBDvXZnMb", "isValid": true},{"proRegTxHash": "5729eee0ae8c532d64186606199e65af8b6068526111acb575379f0a46f6bd81", "confirmedHash": "67d290c14597bf72400ecbf2016e6baf4c7bc940e6f269331800000000000000", "service": "00000000000000000000ffff55d1f120", "pubKeyOperator": "97be43a4bc7759b59b4c1f59e0b132d1222cf4e2370a48ad0a3a4d58672706baa5e5f49630203ae5aff521258532643c", "votingAddress": "2XjwzLFJfYgrrgaYYrPqpYTa8SLr", "isValid": true},{"proRegTxHash": "d7ebc94dcaa5695d242a8384189a9f2698c49b61a2b7597a4f85a9dbc75a4c71", "confirmedHash": "5c2a3666e475fa89462b4b7f29cfaf78bfc6c7a0c6d309980900000000000000", "service": "00000000000000000000ffffa7ac2deb", "pubKeyOperator": "919fd573b70f6912ca41230ade0e73b15bd52b00fea4e24318ba5e032bcb2bb07442bb2a3db5aa1a56f9ca5bdb7797e0", "votingAddress": "2NUKbJV3J5z98Bs972fmF5yhBVH", "isValid": true},{"proRegTxHash": "db2318300e43c39121ffdd7925ebb6f7006ba929790e5c3ed6a1745e480ea64b", "confirmedHash": "68100529972aa198fc8ab479241afdefd5eef7aaeaa9537c0700000000000000", "service": "00000000000000000000ffffa2f5d808", "pubKeyOperator": "8a234562311fbff8b06f529329c630b568c34cb4c572b3e2a851febf593c8a8a1e5514dbf9d3d1db33dd56522a5e3063", "votingAddress": "2d3vkHCQ7JjGHqomtH2AGUrKFXZX", "isValid": false},{"proRegTxHash": "8d3f8e794f3cd0a1668186b8463a98ed463f9e13aad6ab05cf4e6c827c523400", "confirmedHash": "db6e24accfb09c81ac4539d366f24cc3b163af5701dea2a50c00000000000000", "service": "00000000000000000000ffff87b50851", "pubKeyOperator": "98cbf2ee947fa712d81cd50582b8f3fd4cbc4024caa78d3bb2c763f0848afac2ca663fb045e7341b127fee38e702cdcb", "votingAddress": "2tfQnbGW1KX5WbEKYHrNcowRuXWG", "isValid": true},{"proRegTxHash": "be39c240e3ee8c18aa8bd62ddaff666b6d3a4d5eff642ada6e8fa77b76bf2a52", "confirmedHash": "dae21056be7be38f03f3c8df1f9b0302e2fa891d4a26b0121800000000000000", "service": "00000000000000000000ffffb0df87f2", "pubKeyOperator": "805040c9c15be97cc441cd59862ca72ae36821225e63a661ff69a97019e25417c490b80878e17f9998a931c40be17e78", "votingAddress": "3vYZmev9ZWqYjm2VrGc3jdSmNtw2", "isValid": false},{"proRegTxHash": "16b8e2eb5db96f16f103d885963f24f8f3e622c7880dd24cfbce931d68380ce5", "confirmedHash": "27bb10154e24763cae815355accb8337820d012b020b14a10000000000000000", "service": "00000000000000000000ffffb0df84ed", "pubKeyOperator": "9217b9d2baa591901c94b2f77426a7303d97d4174f53fd1f0f1f48bd6016672aa7d7ccf6e098b4ebdbc266b8e7b6af22", "votingAddress": "JNoeAToWAnCC7eWZiPxti5kuz3M", "isValid": false},{"proRegTxHash": "eacacedda2aa70ef953d323c8451c93e5b2c270b3f7e8c314c2197a4d4488ec5", "confirmedHash": "fa5fdba71d179c9635ccaabd94e38ba4b43fa033ff51bb9a0000000000000000", "service": "00000000000000000000ffffae8a070e", "pubKeyOperator": "8ca8e8f55d00f09df0e309233854a3e44d58e24b63b915602071f83b45b28407f6a144ed9fb2712bfa207420591ec431", "votingAddress": "3n7LhVW3Me5D2fag2NffcyhpzijF", "isValid": true},{"proRegTxHash": "08c8e44eabe823972bbc2c68fcc656847fdf5a7c9e34a4333699c0b72bb28636", "confirmedHash": "e907ee0cb2c65d9e80161a49bf5961a02d1bfca0b13c7da01800000000000000", "service": "00000000000000000000ffff55d1f19f", "pubKeyOperator": "0e1298596b9f68dad898dbc56e6eacc4e21c1133955884dfd46d8bbffc0f541c5a48811354d7de780e01378531f988f0", "votingAddress": "NgaQt4srcCSVWvdAyZPJvQqX7bY", "isValid": true},{"proRegTxHash": "44368a7c79abf605c3a518610a3f9802f649ea2aede88ad2b1e96c9a5fc5e656", "confirmedHash": "2dee9be557bd155ebc62f82fb4195e5290ce5ab04fffc76c0300000000000000", "service": "00000000000000000000ffff5fb395ee", "pubKeyOperator": "90f0095d280dbd4323df1a1aae6e1e02b1978c5f3d11ea381d9b4fd55638db9c55ba8a8337bc9072d7f638343bee0479", "votingAddress": "3GZJCpdig3FzzphPjNCqscCbgd9z", "isValid": false},{"proRegTxHash": "e22b02d520874b33ef1a1611df4ef1729ff6afab7c66fec5987b6d92e8512a6a", "confirmedHash": "50a4c2e17790cf4b393eb396ba5c55c7f68d3b5a527d3f590f00000000000000", "service": "00000000000000000000ffff12cc45a6", "pubKeyOperator": "8039cdd4d81d5f4512b5ee455d968d01533a037b10f014a3d2830da1666cefc990c4f0e1fc2804a34d461c92bf6313b2", "votingAddress": "3SF3nUTQdg5pegpyKJKAyD77xWR", "isValid": true},{"proRegTxHash": "c41809e62657f5e83ff0f4cd9aac7942a11e87896973f862b53e4e1575ac1d48", "confirmedHash": "178db0208d5dbcf9dd983faf84666974ecf8b86f0ded4bd90f00000000000000", "service": "00000000000000000000ffffa5166304", "pubKeyOperator": "8cf10b800d0c53027d5462e8440cc1444f46ab580ddd4ceeef18e0e971aec6ed3060721ed4a750e88900bc04aa7599c4", "votingAddress": "47T7RcqDouSU3MRgVEJCB5XEVt67", "isValid": true},{"proRegTxHash": "ba7a3c0d3a183c354f55d009babe16dd55d4367b13d36f11a129917e010c08f4", "confirmedHash": "7af6aff9716e7fa4c736ad101268bf455811ecd76f449da10800000000000000", "service": "00000000000000000000ffff55d1f183", "pubKeyOperator": "96fb112990633eb3b82ae2c403334e1ace3c95b5eee50327f025950a7cdd84d21b7822b2330cb57c13bd5243cfffe5fe", "votingAddress": "4MYbYFW1jggAKyxutgEpW4XmN3Ys", "isValid": false},{"proRegTxHash": "eb4aa3369a548d9a76964aee1dd6a876aaec4e53dc71ec1b8ab5bbfdaafe3239", "confirmedHash": "18213c34e143bbee47985874fe9983481ccc1d87f65f21404000000000000000", "service": "00000000000000000000ffff03d0d90c", "pubKeyOperator": "1409f4f9e435ea5de1bd248f77334743a705e80833cdf3c84f05176b2f6f71918aa91aadd597ff97bc7a012ae1e8d09a", "votingAddress": "2rdNpNEcZEsAvoXs5sWjdJQfEVSZ", "isValid": true},{"proRegTxHash": "30a4573e142e3cbd5fc0c288a37f8d55f49f808ff168422f228dd190d4750117", "confirmedHash": "7a7f9a5aa49205219f02e7c07e0821c0d628bb2af409febc1c00000000000000", "service": "00000000000000000000ffff3e4d9fa6", "pubKeyOperator": "9873d4e8cfdb8a6d3e3e3a75705b67416cc18d538b0f502958b1e29e7d28a9e6f1174b922321d5d58a6adeb3d676a2e4", "votingAddress": "2Z7Y3f93bYqaTuhBUV4bmMavwabg", "isValid": true},{"proRegTxHash": "18c97283016766be5357bbf9aea97a434c652cbfef608e6d9ed7b4ce441ec26f", "confirmedHash": "0af85f472932784ec1b4bd6b6077765be28d84d4b0b1bf040900000000000000", "service": "00000000000000000000ffffbc2298f1", "pubKeyOperator": "828302a9021161ec153a7cf02e45565c0d11a67367af968d58863650fc4e76ad938fbff818b84e18f3f2475c9a96f238", "votingAddress": "498ytELq74g3saAzWnC8HjBYpZse", "isValid": true},{"proRegTxHash": "decb4d1c50fb653946383a722d2d2bc673c1274817ac29488a8003b696505233", "confirmedHash": "f9b11fa0a82a0cf059b9fe87c082ab72bd082e887f53f4570e00000000000000", "service": "00000000000000000000ffff68eea7b1", "pubKeyOperator": "988f7d1dcad4b9982ba92ce775d5e6777cd306d0ddead5cfcdb410cdc50483a099c8d811b45bf1028b06af8a3572e8b9", "votingAddress": "366as2z9MShP25yAEdjBQ1bkirEg", "isValid": true},{"proRegTxHash": "e152722077b3dab94a3b9d98df715441455314882537cf6c415dcd6e1881f817", "confirmedHash": "de322506894ecb8fbc89e3fbd01dfb816d924da68d24575d1200000000000000", "service": "00000000000000000000ffffbc28a30b", "pubKeyOperator": "911aa9e1b6dbede04d776f1b6f4b754103d6c1b16f5ddf7d13ed88805bea49a4b62e9ade423b442126e34d1d66b344ec", "votingAddress": "3A2VraPB8nb9vPSeCmqrXeRxWJQ5", "isValid": true},{"proRegTxHash": "eba9c0d70444c6843228eb256de4e71d7c524e98276e0d1ba64563bcd235bf7c", "confirmedHash": "38cf81b856b76f7a5f92cfce3fe05936841e81b2b500c6f60300000000000000", "service": "00000000000000000000ffff89dc3057", "pubKeyOperator": "812d420983b73ac05fdc009d9ff9d21a71283888ca9bb31102dfd850804d4602d9f44de83a5de54220c076c23065e97b", "votingAddress": "4KqMCbEFyZxL23pfwhVgTEpkozWd", "isValid": false},{"proRegTxHash": "93119ad8d6130c7f6a3671e54c58dfc7aee83750e0a12bc406e6f24484fb98eb", "confirmedHash": "e65a255507dc57d15253bc9393ebdcb4a97d860026ddb9331d00000000000000", "service": "00000000000000000000ffffb280a18e", "pubKeyOperator": "94191310963f2471a45c78bab177a309baae5f6928eeccfce50743c90b4c79b6f42c1a0e3d0af4c047bfca81258a5469", "votingAddress": "2kW8ZzWAVztmBTywzVHH3Lk7TCt3", "isValid": false},{"proRegTxHash": "5519745eeb984dc2be491e77b09896d037f94ad6add5b534a5a96622e5eb84ab", "confirmedHash": "8d9a83b78446f9ca2cebac29f132e97cf33f7cefaf1c8dc91c00000000000000", "service": "00000000000000000000ffff592fa53e", "pubKeyOperator": "0bba5dc0e216fa128d8701d0ce4de39e2dc39f16a0a3ceeced7fcc89d17b65cee32362bc68b712bfc9cc5490c334c6e6", "votingAddress": "ydQSudjW92YkMtymYQyhU2n7Joz", "isValid": true},{"proRegTxHash": "1a4f01158785977ac3c3d2f56b2190b434e0e4b8964176f07fcdeb956d7e59ca", "confirmedHash": "e62c7d71e26715d3297cefcaa62955cbf012965a942edae30300000000000000", "service": "00000000000000000000ffffa8775003", "pubKeyOperator": "072671c967ec6f0966e953a3a77d62ade443fb7e0790e5b27c3aa6bdc5ccd34b5b4571250d57d052c30b8ed5ccb1a045", "votingAddress": "35ShUbi1tsEeXehAWwRmsVMC1qYz", "isValid": true},{"proRegTxHash": "8a381ae9b503df8b768c66a2e313df049ca8c9000adf6499c445cbb41a2aadf8", "confirmedHash": "db6e24accfb09c81ac4539d366f24cc3b163af5701dea2a50c00000000000000", "service": "00000000000000000000ffff87b5084f", "pubKeyOperator": "16a2aa386afbc4ab3db010008d07b5a2bac350774d5e434bfd43a55e80e9653a15e0ef5b4a9a2fed1ec62ae7587c9e32", "votingAddress": "3h4Q5XhfJNJe23ufC6ksDzQQWJxa", "isValid": true},{"proRegTxHash": "67112f6e261f9d01d340c2093e6177ffaf062e0a7799d7f9a52ace30ad854275", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0c5", "pubKeyOperator": "0396b11c000274daa8208d2dcd7081b01e738c3c582c072606e4a9aef73fc5327dffa9418d92f7b81585d6d848c50e5a", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "efe8e8a385e1f12a7d7ade8dbcf27c3205d11497e6c8d26470ae93e2d2b480a7", "confirmedHash": "8ea8a983a910008e88e550e913e5ce4ff04ab6e008813bf00800000000000000", "service": "00000000000000000000ffff52d31503", "pubKeyOperator": "07061624325afae759b764c97f2a37b657c4e9cc0c372beaeb6ef76afa6fd1101eb9264c3607b39329bcb43a86172134", "votingAddress": "2G9xsyEf2Sb3jRQii8gjyW6iBU9m", "isValid": true},{"proRegTxHash": "a86c87fdb77d225190dff982ebeeb5d992316c638ff9a0569b2d29c45e3915f8", "confirmedHash": "31e7e6a2b7772cb4e1fb14053ec2129833b0b84d85476d9c1000000000000000", "service": "00000000000000000000ffffbc28a303", "pubKeyOperator": "81c2930296ea5e57b926fe2aba02cf1673edc19f9a461afaabd9d9b4e5c087c64874d664c38b1581ec070e316879d21e", "votingAddress": "2XXTNcpxYFhA6zKMrRedDauxvoyV", "isValid": true},{"proRegTxHash": "cb6a307acfee9eeca0a6aa1d938536b5192bb07d8919ad80926ad38a56c51996", "confirmedHash": "ff7491851e886f68eb2f2e3f126684d1a91156246544d1bd0e00000000000000", "service": "00000000000000000000ffffc2875939", "pubKeyOperator": "0950406157c3cb41093880b09623ac71a5a7332c32d7685e790d713bce0fd305ce5e179c85cbdd03efd0a6a027c7cbd8", "votingAddress": "yz8n8n9uk6KwwSZF57q2RS1gvTW", "isValid": true},{"proRegTxHash": "fffeb0d868f12ea975ce46d44e17ea13b05820ea7f455c078f957681f4177bc0", "confirmedHash": "bd31f35c5cedbf07c6ffa716f2a3acf8f725ab42af8758740500000000000000", "service": "00000000000000000000ffffa7a02454", "pubKeyOperator": "059aa61878c313f95e696f8919bb5809fc5fe41dcf64d7ac7e569ef13a5420378846dad9a7ad24f64079d139005eca49", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "e88228a37a0cbcc344f8259c147fd40ec1ae88c2d5c2cfd6836a670d25a6793b", "confirmedHash": "a4704f2c122258a7bbaae5171c68f41bc781c4a2961bdd422e00000000000000", "service": "00000000000000000000ffff9fcb1483", "pubKeyOperator": "897e34f490c59673f0f845139b80859a21e12a4a1f1aec6dc2c1d7757244a7b0fdf6ef61575dbf3920a6557801452423", "votingAddress": "2jhAUKBf9hWSg5QmheH2PBC8SwDT", "isValid": true},{"proRegTxHash": "fc654b6f559960bfa555654d2e4c290a193b8b39e08b63525482c961984ff1c0", "confirmedHash": "0d37520b4af5c6cc6fb863dacf056ebd2ebe5b924cbf17322500000000000000", "service": "00000000000000000000ffffb23ef411", "pubKeyOperator": "08f2df3680e05aaf7b66fe3990860a43550523cf93647cff5b0123e51608a4d2a2d209311672acc00edd6737e29cbd3a", "votingAddress": "3k9YQCrdjrtjpssaLYxGN4HDYGfe", "isValid": true},{"proRegTxHash": "34c05580a2896b8ef2c6d0c4a6370b673c6c7569527848a54577313be647f070", "confirmedHash": "9df584102e353ef1eef606c093908b01e334e2512294eb1e0800000000000000", "service": "00000000000000000000ffffbc28cd05", "pubKeyOperator": "0a65770d24e13200868c50b97bed2d7f30c927620a9c44a94f5d91517e7dc6c780a7a50daffad2409f853cc4a6d542d8", "votingAddress": "XhM2ZnEBuJtqUP7JUY3vVTjgsxT", "isValid": true},{"proRegTxHash": "baa65888d9d441e979a2bb41f78a000ee41fb65976281e70623c0f8ae34dd6f2", "confirmedHash": "e3173fa067eb14fe7bb31fbe4376e4ffeb20d0f30c5dac660600000000000000", "service": "00000000000000000000ffff3eabbe90", "pubKeyOperator": "01329232202ff1a76ae600141506d449b83d32cd19888245414c540147e12efc1e3ac5dde7a11135667e8fb1d5f959ae", "votingAddress": "KwTU7QcBqZU9DvSMJopHesGQdpb", "isValid": true},{"proRegTxHash": "c9090fbd541a845e80ce40c2ad4909f606f0bec730492fcfb63a810b05ee39df", "confirmedHash": "ebb5290fb66575dd7505cd31769e9261f63eae621355bddb0800000000000000", "service": "00000000000000000000ffffc7f709ec", "pubKeyOperator": "8183b4014e1f9baabbc63c20ca6c93bf9aaa4e1abe8002a9e010b5caebbdd829b9d2942c3fe5209c46a9467de2df351b", "votingAddress": "3tnHAGrcSCs9DqLgBxoY28Q843MH", "isValid": true},{"proRegTxHash": "f6487be5dec544271d36ae9f3d2f585c27010ecc889bfea27f94481d491f7ed0", "confirmedHash": "93753db7416691038cf0b54cba7b358c1a31d993a50535780f00000000000000", "service": "00000000000000000000ffff54f2b3cc", "pubKeyOperator": "09ac57c174a9bfafa23f81d38223b342e51cf6bf59a9145c69b6098665b4c2d105de10ad211003a3114e06684a21a16a", "votingAddress": "Coip2vKNsa1gJA12Neijfcc2o2g", "isValid": true},{"proRegTxHash": "2eea859bb26e6aa8fdacb3f6f259d7c61720bd7f51abe90af033506232305355", "confirmedHash": "4e6ba29bb1d894b0bbb1c037cee60a472ba52aabf67e10d31400000000000000", "service": "00000000000000000000ffff55d1f241", "pubKeyOperator": "07031d4edbb5ba350ff5175b3355d57d119cfe6918b2e28952865da96d286bad9b5e4e79e9dce40be5d02c786e688fe3", "votingAddress": "FZNejhm1quS8BXmeqPvT4Dnaki4", "isValid": true},{"proRegTxHash": "46e0af88e0ed025f7ac1f904a3313ad989c7f6930ad8ebbfc4b3289f00ee1c6f", "confirmedHash": "15686e11eb2b3e42eef678d81576dc064779accf83eb8b180b00000000000000", "service": "00000000000000000000ffff6c3da7c1", "pubKeyOperator": "8b4a1e567eefcb128a7a1099d7771033aa09189c98e18bd9b2cf2b9e1cfaf9fa473f22248e6bb07f784ca48f99da06ba", "votingAddress": "5ESdH3Kvpjp8d5QLqbs4Mey4rgg", "isValid": true},{"proRegTxHash": "746f50665db7e3bca1d4d53cf75cae41a0597909dc8ffe21a638726fc316da68", "confirmedHash": "f162d14bba72a06cd4bd5b072c777a1ba2714d2578833ae80100000000000000", "service": "00000000000000000000ffffc28754b7", "pubKeyOperator": "1122e1e4d72e2547c928c772644cbc5eabc057d49f2b1a447971b6bd124e7e1b56e3483f2a26e227ed535bfc76a88298", "votingAddress": "363DbrJ6LxFF2wniavy6umYyDBRm", "isValid": true},{"proRegTxHash": "17d696dbd4af142ebd401481efeb54e55997d2383b8c886fa37a61699c5fcccd", "confirmedHash": "6da297df3f5b45a1496735a0fc735adcd85f322d778531c00400000000000000", "service": "00000000000000000000ffffd4186f24", "pubKeyOperator": "02a33ecae053566a75d558f5f5c2c0f27b9f7e63a2dca180ad6da297c77300e6481e1b4b83823ff0c68405a4d818b2c6", "votingAddress": "FkzhazUR7aXp9JENe3R78EzGBak", "isValid": true},{"proRegTxHash": "68937842cbbb6a89ca4e297c784b42c6cc9d986838be94b31e3bb46047558952", "confirmedHash": "1f50fbfac0aee86ba0eb7e62b961cf8118424a358b15883d0300000000000000", "service": "00000000000000000000ffff03e9a0b1", "pubKeyOperator": "8fe4460916201f8a2714d16f518085567ca2c2fa6176bb6fb2132f7324cf3e808e558f8af99c34ebb5fe71673f9c6bd3", "votingAddress": "3Ckv17Yd6f4MsiD6YqG55B8WeSL9", "isValid": false},{"proRegTxHash": "e98a241fc71108b95ed7cd74f65a95905deaaa2250d564cc76cb9f6c7ca54e1b", "confirmedHash": "686ea17ad5aca3462ce5dceec96b8c47ca9dab3daaf8ed2b0300000000000000", "service": "00000000000000000000ffff55d1f217", "pubKeyOperator": "8b8a1e964dc9f995974a63201c007954d73bc896c4599b249f67640bc0b19bcf2601a20ed9761cf8d3aeb86d4c418c64", "votingAddress": "2GbH2fuxBo3gnAWDwoaUvNPBjimS", "isValid": true},{"proRegTxHash": "9b0949dee7d584c00e1acb009053e3658d46b3a50c12aa0dccb4e611352378c8", "confirmedHash": "db6e24accfb09c81ac4539d366f24cc3b163af5701dea2a50c00000000000000", "service": "00000000000000000000ffffa877530a", "pubKeyOperator": "119a646d120b5a5131f9beceb30ddb22ea126ccbc2c97b3d3e654a442b25de51cbf50039e82031d0ea6cc2e570b6bbb6", "votingAddress": "FtVv2NBJ4gUeaRCnnnu7iQwRSHR", "isValid": true},{"proRegTxHash": "7d673aaf5c1c1ff19a6917a597c6a0ddac9d56dfa3ee896071308cf886d35995", "confirmedHash": "095332066dfc288e0df4f6a7110325c199a17eb46798089b3900000000000000", "service": "00000000000000000000ffffbc28a31f", "pubKeyOperator": "8486990b25a946043c74ef87a1fd6b22b2e5bf1bf800976e948da5a649610f6974c54d684a0675a685d4a80b10ce0b1e", "votingAddress": "23q3PhwaDG492dStaAHLR4qpc6E5", "isValid": true},{"proRegTxHash": "d20721e943f67ab913f83797d053c693083e892923588e175cc38fbcf630f64b", "confirmedHash": "82659a0a8a30fdfc6af7cc8fb5f8dd3eacb54d254a1902f80300000000000000", "service": "00000000000000000000ffffc0f1d43e", "pubKeyOperator": "14eafeee61a0fb6687f630879c084dee11186918c4a55b3c69e3cde038191dcef12aa8ae7bca0d6850b31bb8da6f1f9f", "votingAddress": "UDUmrt9HjnkZwZvNM7b58UasnCX", "isValid": true},{"proRegTxHash": "4f2dd6877394aea8a9e1a0ccd4d97d01b89e16f3ab5487a8311768584c31f065", "confirmedHash": "ab25b4d2afe1c56f9b33733608b170a3b2b23c76b6e934012900000000000000", "service": "00000000000000000000ffffb23f7991", "pubKeyOperator": "864cc66573cfdf5599f83c78bfc0d7358f0c4e92d130a300363c9b0ef59ab59101e83a77941ccaadf2f8d1ecf8e777e7", "votingAddress": "294xy1PqBuBWgnMZnp9a52G1ZJiu", "isValid": true},{"proRegTxHash": "b0bee45bc09259533925e469be9be7ef1150f9d3d479e4b4005a69c655f4d661", "confirmedHash": "88ff62118bd21384338b5b13968c737c338d3805842d24f41300000000000000", "service": "00000000000000000000ffffbca61f08", "pubKeyOperator": "10f1db75fb5ff7344feee8301f92ace8a4083cd31ae65d873f759986a0b3c60552d98de733804ac79ed5613a56bbd936", "votingAddress": "4NKunvTNu8ME9e6ZrTzxYefEdKt1", "isValid": true},{"proRegTxHash": "709c6046694a6b72ee77caafd338d4f18d62a615b771e2aef5d02e827f7332a4", "confirmedHash": "38e69570bc387ac788dd5ae4a658aa2e23c076053e00391a0100000000000000", "service": "00000000000000000000ffffd41868dc", "pubKeyOperator": "07826f15148e1dc0e0a2edaede3e8429ae3c5718c478f3ebd13f915c137db315bfa2d43e42aea74e8c6126ba238699ac", "votingAddress": "2ugJhxprtboQT2T8aBpkFLp337mN", "isValid": true},{"proRegTxHash": "abe7fea37b169075f0988fb6dc4e920f5337e5d9760deaac3747c0b7f2523793", "confirmedHash": "6053284d7f9c4640ffc8b666d8cbe20fa585000a2f33db331800000000000000", "service": "00000000000000000000ffff9df53b4c", "pubKeyOperator": "80adf67fb1bbfab62a4833370f04b3d41d21ffd97fdf42890ccca72eebae21e48e5507fb0af67f4b9fad047a5b7bbcc3", "votingAddress": "MnS5iAXd1A8DcC6vT7zbo7gJ7hQ", "isValid": true},{"proRegTxHash": "e9c464424c5ea5d83c60b93dd5632c305dfe53cd07eeabff00676de4d3cca56b", "confirmedHash": "6edc9fb2f4437b9a0227c7c8b118c8e3f421438c26a72d050300000000000000", "service": "00000000000000000000ffff87b53491", "pubKeyOperator": "05d020d5e00e9adf06802c53e2e3a9bc059d41a171da9d763d0b907796aed2133a944913bd7f6721aa0653fd9490f5ec", "votingAddress": "2i3Mr5yUV4g4bMVbU22eqZ6y8qJi", "isValid": true},{"proRegTxHash": "e458269db3be50df30a492df58d8c23005bb8f5b9075e56caae014af43423ece", "confirmedHash": "7ca4ae9b4068b62543cfc959a121c8963be0cc58f59853f40a00000000000000", "service": "00000000000000000000ffff6ca08806", "pubKeyOperator": "000a9e6ea91c589cad5dc6d4b018ff236d0b7bb6732e91747437192c9a9b07112b8b53e9ded06e0b642acdd7302d055a", "votingAddress": "4CMozVB3NGEcoqjvhtnn1a16Gbse", "isValid": true},{"proRegTxHash": "beedeacee220e9e67f86c7e2fd6ec51e5dfefee1e0177eb2a232f461f2e73f4c", "confirmedHash": "3caad1709620bfbfa9056c2a476c34f3ebf498804572ea4e0c00000000000000", "service": "00000000000000000000ffff40e14890", "pubKeyOperator": "0b222b3d49a64a27c20605015382fb8abbd3d1efc035ac418c19bf1df8a3a6c9c47eeb385fa7be8d309bce0f37dd7315", "votingAddress": "4SeQCXgsA7WtgDM25duDoR12HhaA", "isValid": true},{"proRegTxHash": "d0c5b7acf465c9468066f7d87ded1f79997730f134166c127c081f9ce8a80077", "confirmedHash": "4761a33ae8950b4d4a8c6fb75e8259ad63a6bd58e666ffbc0c00000000000000", "service": "00000000000000000000ffffbc28f165", "pubKeyOperator": "13a2e9b12eabfa116a1a3474200c2ec6d31708788e9325abd9849ea478c62694ad2b40755587b9fb964e3ff874b3e0a7", "votingAddress": "34QgvBQG1AHaRuDy7sZfcunqyM9G", "isValid": true},{"proRegTxHash": "73659e9779982d81870331c03e2df219478333d2c434b58705f05b82b4c8a1fb", "confirmedHash": "219da3893e56f102f326a471dbae4d7821be1522a93637810600000000000000", "service": "00000000000000000000ffffc034a6db", "pubKeyOperator": "12e77f704dc7d48cc6c7f3a572f491d8be390f3ed35a96d05ba5dee6580f00c5628f1744afb57a49b60c34c675b1594a", "votingAddress": "25AeKPhJNg77CPKqAKKfqpDLcpX8", "isValid": true},{"proRegTxHash": "cdbb02882847d09d7cd88cc3ded1966c361489e59c6a184ffa0c91ee3f3477f7", "confirmedHash": "2aae32ee56ec940e210633fe5fadde85169f164313e286670900000000000000", "service": "00000000000000000000ffffadffd6e5", "pubKeyOperator": "90caabaea72e98a546d9ce934a57ac80f40a5f256b220e48dd3bd5644eb70ae5791067effb5a83ad1775032d1e0e54f7", "votingAddress": "spDZMzjUsWeziDRD83oVyAHrW71", "isValid": true},{"proRegTxHash": "5093bc237af546de978f70b37dc9cda6f3655818db8144f2e5f8a62bb86eaee9", "confirmedHash": "60f0c15b1c6c2580b9b2d4b92c865a92b63844de6cec0ace2700000000000000", "service": "00000000000000000000ffff2d4c2d60", "pubKeyOperator": "16689fa24ea34f08ac639f3adf4d907e0c73c067efca6b54268c28730cc7514428bf48cfa8294e41d015291bb61b73f2", "votingAddress": "9XWuPN1sHD7jFLtaWCTmR4HkhKJ", "isValid": true},{"proRegTxHash": "5b382be4158044b1030b1380175245b57ff47384cbd14fba7b64351a827088c9", "confirmedHash": "736dc722b479e100125e85c103955726a30dbe61f64554e32600000000000000", "service": "00000000000000000000ffffbc28b6d4", "pubKeyOperator": "0cc6225a6f31ed99e0e1fcb8bf7552d7aa42ce338a442d400d42de0fd6f05f923e3f69a84e0feeca504919b4696b201e", "votingAddress": "2EvpoAaBbiKocueUXKkTtvstXBY6", "isValid": true},{"proRegTxHash": "99f68c4812aaf77711910e37d62553bfa112c01c887c8c32f398db12be6f36cb", "confirmedHash": "fd59ceb4bbdee628c0f43c2496066cc96ba32bd5a1bc8ff50d00000000000000", "service": "00000000000000000000ffff6bbf65d4", "pubKeyOperator": "80c6c570b01b56b81345d397c2291a3f5822e3496c9464be05c91aae55f1ac769f68849b25fd1a86530dc084c9be2f31", "votingAddress": "3VFQU3bcaE3Lk1RogHYKAHpf9Dm9", "isValid": true},{"proRegTxHash": "4f63b981356878fa8cdbd34d00af19be5175429813c59dd8b5049d338561ab01", "confirmedHash": "92b26210bca9d60f9868d289a95e62d50638e8f2e886ff7b1400000000000000", "service": "00000000000000000000ffff5fb3a0a9", "pubKeyOperator": "99110c031bb9e8fe28694bf8319b01ce3e76189a8f5ea6ad16d7c50b0bcc4da8e99f72a1044bb122ab3738044b6952c5", "votingAddress": "2Fkut6Ux7KcUKeiegaKCFa1ymNmu", "isValid": true},{"proRegTxHash": "ef0b94a3f480d33f359fb8d88ff9d882487da09e747f638db77bd99c9bd59610", "confirmedHash": "49189a3e10fe63ab112496e2386dbfa294618a4ebf9ee98b0600000000000000", "service": "00000000000000000000ffffbc28e705", "pubKeyOperator": "95eb3c7143fe51328b0a1604d0d874f0eeaa080d49b9ba1adebbda5b6ca089ce46d15005777f7f836ac04eebddb35851", "votingAddress": "wVXfWTN3XBZGZ72PvBmdSHpTPef", "isValid": true},{"proRegTxHash": "3f9478766e864c47404e41774e1e06ddcb84e5265eec3fcb23ad358f27aa3344", "confirmedHash": "a1e6a81c221aed68d0e640d6581eb47941aef0a4afbbaca63100000000000000", "service": "00000000000000000000ffff52d319a8", "pubKeyOperator": "83eb08385008ffadca58d6643209e6a0a46bb5f249ddc07d1a801cf112d69e81d5e9dd1af34ef732fef787d77ff8d42a", "votingAddress": "yXkqrSLE9TScRXShAFy2eLiyKtx", "isValid": true},{"proRegTxHash": "ef4edea4a58ad8a36086cf3a884d5a6068f9498020423122e86e1eedfdac0ada", "confirmedHash": "ed0363bcc33288ca9b9c593b1710210e51f6f6608cfdf0450500000000000000", "service": "00000000000000000000ffffc2875af6", "pubKeyOperator": "95e53a9f5f0074b0ba9cf69926bd3fce169b1830d063d55b80e9723e80b2d616a2ee046feeae354a2a9a40e30c4d447b", "votingAddress": "3L8Yp54LRXRD92RgvZpURzAQxuHt", "isValid": true},{"proRegTxHash": "c153d4d8e9545b139df547e9b2ebc5009cb2f69eebc11f91d904d80f49abadc1", "confirmedHash": "44bbcc917450905c4c682062c4212c42797c62fbe8da91de1400000000000000", "service": "00000000000000000000ffff592fa7fc", "pubKeyOperator": "1343384d16a30464ff5a4f8137e4cb0480ffa5e7285bf069d82359ea1c3f79364d1c2bc5be343b20b30299faad10d7d2", "votingAddress": "2prDiFK1aFmJeg4vRXLBLRcRVWx6", "isValid": false},{"proRegTxHash": "87bd11f78c22a04fd551bf18afe96f6c2ed5791e18ed1f00603654bb0da177c5", "confirmedHash": "6e536cccbcd4ee52c421bc42fd8e2722276de1bd7c0382c51c00000000000000", "service": "00000000000000000000ffffd1faeb11", "pubKeyOperator": "8a6fd134debae8b191837067f8913891e13c45dabd3ac3db92a52586ccee40c8ffbf20ee8370945f47260a42a285effa", "votingAddress": "3jzRnyHp7hXpUc381ia1hov2h6PP", "isValid": true},{"proRegTxHash": "a31fcbd0c4680673d93f999a93d6e9c14ef2fa36619abb066235de1a16f78f63", "confirmedHash": "ad507aef88e609ff8a297f370f026e0218d8fa3ab64ad20d1a00000000000000", "service": "00000000000000000000ffffcf94788b", "pubKeyOperator": "945a0cfcf67e868b4ba34c18943549472b17cdd60a2dc93739fb475fdd0e80d7b93cd148508a54f1e4f3802a1bf7c505", "votingAddress": "2Z1wCvpV7eM4R7bcFbtzyxbqDqXh", "isValid": true},{"proRegTxHash": "49fe03bcb8847448e2b91428fd702f92561f5b07a47c11a407a4d50d7644d63b", "confirmedHash": "79a059838be7f0c9aee2280162e7b6c36d6a037d37583c7c0100000000000000", "service": "00000000000000000000ffffb23e2d0d", "pubKeyOperator": "9780b81e61a4d3704abc5fc9a82864bde6831fc104cc6d1d382b993cf79d2933431dce71ac5b0150a9cf89ddf6a101cd", "votingAddress": "2vrQu3J5226n6bzUhzQUD3ZJwAUJ", "isValid": true},{"proRegTxHash": "d997198e8bb26ebe104c532f8901171123f32c663672f998dbf2a74a507cfac6", "confirmedHash": "ba1fb51ff239c701b47f62c1c2acd9b35cd765b45e7ce8440000000000000000", "service": "00000000000000000000ffff55d1f187", "pubKeyOperator": "86184f3395ec8b5dab247e45b9db290dbb943826adc2fe883bd23d975e2cc6be26a08a69e3085dd1715e72635b18d3b1", "votingAddress": "21pnD9cVXfWbRft57mkmDRfD6Zrw", "isValid": false},{"proRegTxHash": "a0287af5b0c865acdb1d1b3327a308cff216d1d650b2821dd3358b9af099ece5", "confirmedHash": "0c16652f1a661f34a628bbcba7dc5b069c7892648cbb2c9d1600000000000000", "service": "00000000000000000000ffff50d1eaaa", "pubKeyOperator": "87949f59c5620dee96a63e1068eca40743cc6ac472a8077b296c59f7ab8003c88d8a0d21ce4082c1180309c7da5502cb", "votingAddress": "EqGUX4mmwdDbDkQBtuaiW6VKFeM", "isValid": true},{"proRegTxHash": "623162a18e9b697e05f9b4c23281397cbda559ae19df91ec0ca38580ba9f91b7", "confirmedHash": "8c30f68f4131396e1ca0d479a0ae2fc58ac4ec9d1d914ad63e00000000000000", "service": "00000000000000000000ffff8b3b278e", "pubKeyOperator": "0747c6caca6ca007a52231e7747938cf60e6b49f00e2cfc8b222883b7c86304474add2748b1cce7d9fb1a49ada8a4fdc", "votingAddress": "67cKdVfYhy8JThiNueLf8HiSk2A", "isValid": true},{"proRegTxHash": "b5d15b05eb1d644185d49e6f665cc4a3f8129b626e54d96ea253573aa6bb025c", "confirmedHash": "0bd0b6e25dbb511814084fd886522b81a34fbabd17724f1b0900000000000000", "service": "00000000000000000000ffff2d4df08b", "pubKeyOperator": "0bb8a85c44a50c814b4243718dcc8adac99e73db9f0f2b2bf03a45d98ff7df33b285cbf4ac616a397022d5673250aae4", "votingAddress": "2HQLpyXdZM17Tej585ChEEYVyiBZ", "isValid": true},{"proRegTxHash": "04d7c1f9699497bf897e995fc903a4c554995b36a7616b29dac31310736b0e39", "confirmedHash": "b9d70d4631d6fca8deceeae206b4071be4a35f8a231d26bd3d00000000000000", "service": "00000000000000000000ffff6deb41e2", "pubKeyOperator": "84fd5da5261b56788c935066800808476498160ab5e5e2a27a4b69d433f3f64e0e6950b440c9bb27831581276ef7f861", "votingAddress": "2reMV8YkiDHjza3hoj88tvuAFqf8", "isValid": true},{"proRegTxHash": "c7e55c56d691db1f81d2ab73f967404370572e849c951aa9801ea719031cdda1", "confirmedHash": "d82bad0030563a5b669480b1989978c8a45566066a194d3f1e00000000000000", "service": "00000000000000000000ffffb23e7ec6", "pubKeyOperator": "96644bcef0e2d7e03a76a6307b249055ec483182be69b93531c25a65558b57b50f4207dceac367ac4fcd9d5ad965750d", "votingAddress": "2XyCEBFpqqJLWjv9g2R6sQ92PtYz", "isValid": false},{"proRegTxHash": "ed5068245fa3054b32fb517346726f2fac8381f53de077f533b3d57512699ead", "confirmedHash": "61e8668f336a19cae0a6f7a1d8a3d315fc7e5dbd9e54903d0f00000000000000", "service": "00000000000000000000ffff52d31534", "pubKeyOperator": "96e2a9e4d6662ed9e2fad55e475e226509dfa5d7f61435cbdd8f83128c0f0389c0be82ae2a228ee0c41c4558d920202f", "votingAddress": "oZe1WQahXFmkBcvH8ZJd1Wa2U5E", "isValid": true},{"proRegTxHash": "68a5c9cb1008bea274a7451c85c790f0c6456297f74f0f6fc9858fc25e8aa1f7", "confirmedHash": "e6a44b335d556552a28a82e936103f2917af881360a08a9a1300000000000000", "service": "00000000000000000000ffffc2875ac8", "pubKeyOperator": "040e691eda59ec5458e7156b2d9c1a6875bb52b2580eaa79adc56fe03693a012d5e2668ea9ec177d40b2afe920454d1d", "votingAddress": "2on8qmQdxEYCCfQRmSnWia9F579n", "isValid": false},{"proRegTxHash": "4921342fdfd9a4c78529e78c1bffa2469fa04d290c83b46702948a39a4d0e5b5", "confirmedHash": "2e2914ed0aa9ca555a054f82940d78bb865058df1f8f02741500000000000000", "service": "00000000000000000000ffff55d1f1a0", "pubKeyOperator": "04d3b228e3c7d4e9b4630fa48418bc7eadcd112849860351c5bde9c2f2ccda789fc519eab5690e3ba6e70e97aabd4021", "votingAddress": "2u2T67EWh5FxqxMw6qTVQesoDmma", "isValid": true},{"proRegTxHash": "cc25aeddc4847415892bf1d883afe7728b6c29f7371a0d0e5ef62daf162012b0", "confirmedHash": "8557f5da5bab9dddd6457939e1eb66fabbe901b71c34b9591b00000000000000", "service": "00000000000000000000ffff87b5348b", "pubKeyOperator": "887bea916a51caae2a6e71982e2d86bf82e4fe3b00f3759e7d2fd58da6974eb60b8bc239d804b82c42b1ca495d62fd1c", "votingAddress": "2UAv3uDphSpSXWszYtS2DQiA2guc", "isValid": true},{"proRegTxHash": "5aa3ba7846887e28dc3470478cb8478f8b8128d651dbfb794113985d677018dc", "confirmedHash": "db0308cc0e8caf0d3ce00020824c55bae564c5352215f06a1100000000000000", "service": "00000000000000000000ffffc1ed51e0", "pubKeyOperator": "05acfcd35b54cc7683d363817bf80bf5298e6a0d058d225c10e34540bb607cb90fc8b95bdb3268929a0f953dca325cb9", "votingAddress": "4JHsQEUQkVUwmdvgHHdhh7FgYQ8k", "isValid": true},{"proRegTxHash": "317d6e921db894f4b22e2bcd8aaa18614b859c4be1026d6ef6e381f0d8677091", "confirmedHash": "f142219d724bdfab00024f3cbed54a68a5d2e022ccb528120500000000000000", "service": "00000000000000000000ffff6deb45bb", "pubKeyOperator": "170705c77e379a4629cf10f6c2ef0f1dae9daff746f65adecb8642ff059926a514eef64435712f2fe489ae4e12949411", "votingAddress": "2t6Q8tNxq6GMfTtVcPLZghQZR976", "isValid": true},{"proRegTxHash": "d3fea89e96c6c1263839db65e4a5d15d05e9155b0d9542634638c06a00f17e8f", "confirmedHash": "0af85f472932784ec1b4bd6b6077765be28d84d4b0b1bf040900000000000000", "service": "00000000000000000000ffff5fd89e08", "pubKeyOperator": "0d9dca6235c5a6f0f8d1946d5e2619eda87fafa96688da8d2e314e46747ed2922804616b946b7e8ea00f9d9c8c433b44", "votingAddress": "4Q6wU5s2RToJ5AkWHuwFFCjZS8hJ", "isValid": true},{"proRegTxHash": "38b6484ef3f14499ca2b8e8d2b216f21be6f467396e3924ced60755ad7329b21", "confirmedHash": "4da6bbdfec861cef8a449a4af66e09753b2dc69ccd49fd4d0700000000000000", "service": "00000000000000000000ffffa7478c1a", "pubKeyOperator": "158ba09f8c28c1cde3122a82ad0262cf3e6855b7258a4a032a18fa3ad5dc64095badd801f8b5c1d4c044b45de05791ee", "votingAddress": "4ZiwZhuQmviFq6jRch8UtDvGwMHU", "isValid": true},{"proRegTxHash": "15c33c7d004137d75bb9b6b595d183ed4f0a3f86f0684876ceb362c895ffb2e5", "confirmedHash": "2246eec2e04551f0c73502e1b39cbddbebcb475d818e81de0a00000000000000", "service": "00000000000000000000ffff2e654ae7", "pubKeyOperator": "98a6a87ad1ad8596ab094d259ccfbb3a0c62ebba6fa52711319e7a24bd338ccc4c3225e2f9758e65552c981f58e27438", "votingAddress": "3kuSZ77PBEL4ka42dGKBsMhuBBWt", "isValid": true},{"proRegTxHash": "5843d6cd95c1dbcf6f1b977092eee65e83cbc076b639bb60378c0ed10a0b1752", "confirmedHash": "699d1feac6ab0dbd94623f468bf5962dff088085c9e737681600000000000000", "service": "00000000000000000000ffff5fb3ea4e", "pubKeyOperator": "924b1b4aaab3f45ca10b31e5df6b85c38a64c239db3d9970a4a226a99fb10829fc2e30f98e12b74ba25983b579de43a5", "votingAddress": "4Q61T5N4mVaWVDej7pPAWtUSWXaM", "isValid": false},{"proRegTxHash": "b8d5faf247317ad4716dff60c1aaeab61b8bdb72faa1d730e9715342b94818a8", "confirmedHash": "c3a7d4aa7b4dae13bae0c9ffa1a6d121dc70caf2dfd623e30900000000000000", "service": "00000000000000000000ffff2f6e9dbb", "pubKeyOperator": "0d458ec2ff9ce1b7116fef1f5ee4281941a74f30ebae82c3eddef81c11087c9758c06239177eb36202270a1832493cc8", "votingAddress": "44kd3uWAuCafn8h6dSb1W51Sj89d", "isValid": false},{"proRegTxHash": "4cd0a97e9fe40c6a28382d3af812303f71dafbfd99af2a159882aeb8044c60e8", "confirmedHash": "7ee046d0b157b697315b3033344c1dee69529c951fa17b3d1b00000000000000", "service": "00000000000000000000ffffbc28af47", "pubKeyOperator": "19338bd0218aad8d0cdf8c1629a695df3491163a2ca827a33c03f2c4aff08a3348b027bb6a0f9ba4095c3da7b6819e4a", "votingAddress": "UPpkErV71wZmNgdKZJGT6ymbMFL", "isValid": true},{"proRegTxHash": "92d49ab558c9785c5bc1495d56a224dccc514a3be251b8622b8b5b5de492f61a", "confirmedHash": "37664cdd13ca52f96c6b7c96f722f7a52107c4463984cb470400000000000000", "service": "00000000000000000000ffffcf9aeb2c", "pubKeyOperator": "9699bbb4ba24b6ad92e8816112baa87ab4638bac785fc234e9de82312fc85dd80bcd91debfb5b43cd42f4e9e53320ed2", "votingAddress": "3sp6c2Mvv2ybuW355NPUdLf5BEL3", "isValid": true},{"proRegTxHash": "27f2b65cbbf7647175659e020ca115c4ef835b2ab63e4a24286524d37f58bfce", "confirmedHash": "fbfd504b4864a79ce011b3e447dea84fe79519ba3eacbdae2700000000000000", "service": "00000000000000000000ffffbc28f16c", "pubKeyOperator": "8f130e8fdc93ca464c87efd0f42046012898b557d4a205f70cd319ca6e4da3e19b279411d9b3ea49795600a8654c06dd", "votingAddress": "3f3QivDxFMH2Spw6EaDnnNAF8HUa", "isValid": true},{"proRegTxHash": "169fd370db4bcd372ad93867dc1e8062f5051f81bd8a1052aea4fa2e8c7a76f7", "confirmedHash": "6f35661eb995439eb16d1b4189ab525a849a1fc6fb71d9d60400000000000000", "service": "00000000000000000000ffff369cfa45", "pubKeyOperator": "058c5759c9b90611b496c9faa71a528267226781ab9c27b0ec1ec0996da72cad745dff8f80dbce636461eb44cfa31706", "votingAddress": "2J5KhjRpJ1wnGMeF8GwHe1km6rgP", "isValid": true},{"proRegTxHash": "58e529b9d33da0cf64688e7dbd36906ecf0cafaa0d5001275b3bfa84b271491a", "confirmedHash": "844395881da36233c34c6e4fdecfcccbfb6f073d5c0c91290600000000000000", "service": "00000000000000000000ffff55d1f111", "pubKeyOperator": "01c43f660a321e1ddbd9ad6390fc44bf54dbff19bafbdbcb8c7291c16fbb3f0b57574a01dcaf6f5a90910cfd822ea499", "votingAddress": "KPEs5B4mJL6gr49WB1GPtuQutXe", "isValid": false},{"proRegTxHash": "443938b68ddd990babb688cb6eee0e343b5e1ffd827e869fab301f9cbc0c9a16", "confirmedHash": "f94ea6f3829d036f926bf7df88a3dfce19d2a934c19874380100000000000000", "service": "00000000000000000000ffffbc28fbc0", "pubKeyOperator": "86b79ef2c5d3012a2d5c537ba0e1c05232e0580187f6f867d4e03dfd232caae11a6863a253eb3d248eab2ede3483d147", "votingAddress": "fPeWwM6rMSjb7rxKvv5vYbdh9xB", "isValid": true},{"proRegTxHash": "126686a2bf5f35b88fdb7f42a00223bacd2d08f808e5e049fab1d797b001343b", "confirmedHash": "b3f9cd3ae9dd2c256fd3dd5b4fafa8658c73996b92295d403600000000000000", "service": "00000000000000000000ffffbca62cd3", "pubKeyOperator": "076f7d1ce45ce82200acfaa2ba45297ec22ecb2c784ea8b2b0e85ebcd3d60c30bfed5661c2d5069ea0cc839a167870fb", "votingAddress": "ZTuVxiykNw6Zxtv74w9JGoHFNmZ", "isValid": true},{"proRegTxHash": "9fd648eb3acd529d783d91fbea40b9b531ea6d7aec739ef3d147ab604dbf64f1", "confirmedHash": "0a210ac920be82792b6db4d66aaea9c06e9483cd945ef51d0900000000000000", "service": "00000000000000000000ffff2e04a262", "pubKeyOperator": "022a9bcfd0e60bc3ad5a7d14ad8d46ef79d16e0132ef7c743fa55edcd4b454d633f97f7ce2570ea52c993efc98075efd", "votingAddress": "4CVzY4RfP2eT8XuSsrTaQbxvKxHB", "isValid": true},{"proRegTxHash": "366310125ba3f7faffff51376f7e5a472edc9ed38e7e8fca1cbccee62baaa70a", "confirmedHash": "71758d4ef560db239292abc002e3d9e7be7d1a84d4259e093800000000000000", "service": "00000000000000000000ffff2d4c02ad", "pubKeyOperator": "008b37007fa9c5b63ff53cf4a0e04ca3d87c4973875778ff09c4c3293d6003f84e02c018dc6bd4a9453b65d3bcb78238", "votingAddress": "DfDJRZHza17JY9DKk81WBSYmPar", "isValid": false},{"proRegTxHash": "a4f14c081108d63dccb812d9d8fb6c09b92a6472973c43ed6eee5792f50ef0d2", "confirmedHash": "00f0bb07a0dca0b315c0838e934d8ac5e83c93b7de407c8b0b00000000000000", "service": "00000000000000000000ffff8ac5856a", "pubKeyOperator": "869a2ad6a59f191831c79a993b77380e14eb4db25002c29b665e048bcb65876155ca11a86a232b46910776bf9dc3b772", "votingAddress": "bJ4vD8DGwVWzMtM83RtLsqorgcr", "isValid": true},{"proRegTxHash": "d4f3f70bf57793480efc39494d2753793b006b19d6a8237e8223fead1f9cda47", "confirmedHash": "7753fbf7505b8e58b38832f199a21989dd08b7ee4f07ce0c1f00000000000000", "service": "00000000000000000000ffff92b984c9", "pubKeyOperator": "134b5935bc85f101fc59e98885a2d62e907bf1735b1aad9c7056630a8e1804f5ff8f133790898d4f0c0b11f0fa78fea9", "votingAddress": "3amMYEQS2FgZWfuG6EiQHLEZRCjs", "isValid": false},{"proRegTxHash": "37a46fdfbe451565cbffc597e9d51f57638a8fda3335ef9174a276ff86b2e915", "confirmedHash": "123c178a777beb3e3c812443d07be17a42deeb7b9e27a2090800000000000000", "service": "00000000000000000000ffffa8775786", "pubKeyOperator": "05610de73f6b4ade43ba892997acf90950063e40e3aef7d0c0ea7b5d325a830e3273a88071190b1e325b1af47bdd8f57", "votingAddress": "4T9pfuLBShVhjXTLz8vopmMiiczv", "isValid": true},{"proRegTxHash": "0684f42ad8fe4d74e9d3f18b791816c8749ba4cab23f1ae0ceaf70fa32c95199", "confirmedHash": "8ff653f659d4478ea4257cf726b06155732e6ac3913d54bf0e00000000000000", "service": "00000000000000000000ffff52d31962", "pubKeyOperator": "972935cb28ac518159a9badc53452c65bfa45566c8f15250f7c3b456d7ba8010233104fa3f6efe85146e778891655513", "votingAddress": "3CM77NsGrq8QJsf4tPZCruoNghL7", "isValid": true},{"proRegTxHash": "ac6b89fee0f58ff6b23cc60b24391ff4e2fc5e8b9a58eba9ef4d3909c3566a1f", "confirmedHash": "daa52437d85d8b77dccf8a31760e0be2a83844e3c476ccd21700000000000000", "service": "00000000000000000000ffff6baaf0ac", "pubKeyOperator": "816d2fc2829e3242c49d0b143116650110a2d10fd230f3e5e4ef5a9ca11f350d75727603a3f5b8d88ea90c6c795f5e26", "votingAddress": "gHDxae594kfCikKM311c5rSiBbP", "isValid": false},{"proRegTxHash": "02036ad27d50c067d1def6f65ac6487e6d8e49c77f7531e260b7faa3f7c6de34", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688b0c9", "pubKeyOperator": "04975699dccb947b5bdb8351b5c85b26f8feef305003caae0879a00fa9cc4dc813364efdd846cc57cb033601efeeca04", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "f1ae99b96417e7f45ef2f9ff7dbd70970c74eae0bb6a7f7c6d7cb054a7266fd3", "confirmedHash": "245d2aa1f746068da867c375cda4d963bb09e0fd9621fb752e00000000000000", "service": "00000000000000000000ffff55d1f132", "pubKeyOperator": "096a12aa606b61b29b4bbc66ed3f05d5796dc61c5cd0963d9c70fed5d194c7f85cb0df0f06d5fcb629c7c88d951bec7d", "votingAddress": "4BMigCE45cBViqUwtNt7UCXXFJ9r", "isValid": true},{"proRegTxHash": "f92abdebb64260cd25451330458ede213e992df270578e23666c2a64e1deb926", "confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", "service": "00000000000000000000ffff17e4e84f", "pubKeyOperator": "8d6f7f97193db95fb1b6f7bc3f4a142ea8ba4802bd4028dd45254467f38ab6bfbf31881cf0651420401311530035cf29", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "5273fdc82f2f9d78b642b8f4d7a02d1e28d97e090b460f7de2e4a971de6ab041", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b01a", "pubKeyOperator": "93da0cce18d1f400b99401fd0ae4457f5c088a530d8682364a135fac474e3534125d5cad995bf55eef7619f2854f55c7", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "358b36fde512ffedf0cc2df0ec939ac10710200e9f38c1b5aa3b2b65974d7ef3", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d52aba", "pubKeyOperator": "92f1695370af48f7c9ea7411e7353ba53b18b87055b688c59282a6bc6b435cffa7e155d4aac479591c39ea9936041b6e", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "c5936fa7501127bfbdce35a3c14b2eb95f9128ace8af54339ecd4d348008a308", "confirmedHash": "abb61c49bdf891abfc384c94052e246638012058ad1002241600000000000000", "service": "00000000000000000000ffff88f37387", "pubKeyOperator": "111fe05542f047b6dcb270d49b6cf7bb8e159af2ce8870117458f73f421879f127091008ffa5ada8541c35c249e5126a", "votingAddress": "23CbUjMFgn5nhNzrSwWx4Wqwagb", "isValid": true},{"proRegTxHash": "e19189d6acd1b153bca2e64768e8fa07f9e381730994505d2070f475bb2ffdd5", "confirmedHash": "b39a4821807326c4276b05b27e45b111d61214ec7dceb9ae0a00000000000000", "service": "00000000000000000000ffff2d55752d", "pubKeyOperator": "92aa421218fe8cb728c0e767ba9c396ebb4a7bb22ec2f1be6c3f4e26b097a7c9710bf7bc276e5b8cf21aa2d6c7ad0cf2", "votingAddress": "3N2j9ZsizikND4rDXeCujAJ6wttG", "isValid": true},{"proRegTxHash": "2f0fea2e5e389ddfac30762ce213ffc1b5b804df92b6db717ea11466a1aad5e6", "confirmedHash": "245cd90a17cac504eeba8c0a12efc069c3e64bb42971ca2d2b00000000000000", "service": "00000000000000000000ffff86d150bb", "pubKeyOperator": "94bc6c08afd8d1ec5bb8f346dd695b06c04e53075e307b36c66c93da0013fda60a13c978f98cfd771b82ee5b7b03e6f1", "votingAddress": "2WG9HqdpBDmxLnnXSzPmLHdmyBWM", "isValid": true},{"proRegTxHash": "56962ec2e080e8ac076ea4df00447b16fd256c3236b4f8d447d771b832b35952", "confirmedHash": "de0d1d3671937cbde0b09c0fe4dcf4e702744c4cd21e30b51800000000000000", "service": "00000000000000000000ffff6523c5b1", "pubKeyOperator": "8c74f387fb4364dc040680e5245edc22cce380a089499dbcabc5fe758561f91f57f2b503b58831c71661a0ecbe63b437", "votingAddress": "2nsDoNG2mu7qcttHbsT12gnEYLwm", "isValid": true},{"proRegTxHash": "65eb4e315f02a7fc415f94e97a16e15979c578d84b52ee9b067d49a28ea08533", "confirmedHash": "384705056af13a71965c968f8440f70435560c321393559d0300000000000000", "service": "00000000000000000000ffff2d093ccc", "pubKeyOperator": "8acdf96162269d0f2528631f6a32486180e9d57531995a44b2237800878cd29e473fa31edbe14cb5d9128940727d9c85", "votingAddress": "2eCR56GYnBCnhHJktmrwhiSTnqTt", "isValid": true},{"proRegTxHash": "96b7d8fcda8ef01a5eda4d91da1f1699192f2d445d45c816c89c4f337fbff42a", "confirmedHash": "37789aa83c9109039298afb192661810ff561d9620ba6b3f0b00000000000000", "service": "00000000000000000000ffffb945352e", "pubKeyOperator": "13b40f47c85f38c7e5e9374d252226f0478bfc147450030f0dce1b2643f372ed71790a056dfdb535b9f3cea59257603b", "votingAddress": "3riJpym6TW5tBh3yzzHTW8JcBisJ", "isValid": true},{"proRegTxHash": "c9ab2ce8267dad48872ca520b5554db04b504608395cd9bc4b30324ca457449e", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688e74e", "pubKeyOperator": "890eba38616632b5e88a5d21b5056dc28ab45482b36352e4da17d2fe7ece594e4854094ca7158c2054f720d0ceb954f2", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "3d527afa22cd37b235ee9b89fd57726719ad2463c2ce37aa844d8b21fc53661a", "confirmedHash": "c31afec0ccaac8914e8b1e1bff725ca26155fcf4d88e77ae0800000000000000", "service": "00000000000000000000ffff52d3150b", "pubKeyOperator": "165bbde7aecebab8daa93458a43d8c9335e0991e29449b6121b43ff842fc3575e9cc7227950e451ec57cce8d5379090f", "votingAddress": "2yL7n7kmsjCCZg79WqaGeuiTZhWT", "isValid": true},{"proRegTxHash": "ef6fc5fa1237fd2c0aed00d920276a18c24dec808dd73ca8266b28d13fec4993", "confirmedHash": "716607dcc2024f4d671964af327f1737e61f96ef101d5f132100000000000000", "service": "00000000000000000000ffff59280fab", "pubKeyOperator": "848357c01992894e44b8a6d04605824f5e70a5071d3a1f58c62e941ecb03ab2b26d9000485936af8c7331ddcb3485cb5", "votingAddress": "AyTb9xWnfvMrNYqvUEdBHVcbKMK", "isValid": false},{"proRegTxHash": "d79b39521820e06b784ad7b1fcd43ffd438e77f393036d806a4415f8293315b3", "confirmedHash": "c733aebd97dc38f9052e0251dd2c9615b2ced052786920491200000000000000", "service": "00000000000000000000ffffcebd88da", "pubKeyOperator": "10a65e71faae33d9d167b20d271f9d5a50bea0a711b2601b1e40960e7197c4b3cf4abe760893c16d8e4f0cd6d10571b0", "votingAddress": "2JbNaQUR9wk2gwxAEiECEfW98BCu", "isValid": true},{"proRegTxHash": "18b0334cd1d4cc1d7ed9f484c772051abbefa71aaa40159f7b83bd2169800978", "confirmedHash": "4c65bd1af82c19ecda08ba079660e2c89b1ca9a26c8847d03600000000000000", "service": "00000000000000000000ffffa5e39ba9", "pubKeyOperator": "13d525fcbcd03d6f8cba238ec5874f40671afd2741f9ed151fafcdb5275de937bd2b1d769465c73fe4bcd10b58e5b19a", "votingAddress": "3zbg268X4AxLTei42HmVBwC3dG2s", "isValid": true},{"proRegTxHash": "8faeeaa9566b9599c4690a48b3ac2d791d39af405ba2f3a2b39e43772dc074dc", "confirmedHash": "6cc125bd4d5279f7533de23af12f3e677ac7cda66bebcd341d00000000000000", "service": "00000000000000000000ffffbca64934", "pubKeyOperator": "863a1a8c8928fb3a0b9c1b16475ecca90b979f2b0a7fd0b850ebb873d54e9a5052a82378b59b063310b5cb77b093f0d3", "votingAddress": "3YiU2XJtWhciAswrvURxDgam2jfm", "isValid": true},{"proRegTxHash": "d16ece260e421e464c133a8bbbc9a8c1fb222b0a907aef89f99a317e42950726", "confirmedHash": "d345ec6cc15e4a746db45b2a6d5ca02b783a51ad785667eb2a00000000000000", "service": "00000000000000000000ffff5fb7326b", "pubKeyOperator": "8cc32fbab9e79e403b234dd9ac88d59044cacf2e9df4bc4940aa515d854ce705014fd5c0d10579d94f4f0f767df370aa", "votingAddress": "4RTWyb6129ToS6yfLV499Q5YbwJy", "isValid": true},{"proRegTxHash": "ee9565f9530078fcb21d4d0a61c68879a6a461be69e16a30483c6085c035795b", "confirmedHash": "abe1d69cd4591d0795ef305f5736655c56cbecebd2a38e670f00000000000000", "service": "00000000000000000000ffff8bb492d5", "pubKeyOperator": "01ee49f6a43f6e80d2b2268b89a2c160b02522a52364c7d67723df38817d6d2a8c4b62ed4156ff1bcfcb59ccfbc354b8", "votingAddress": "4KhoS1b57bfKF9VkJv8ebK1T6s3m", "isValid": true},{"proRegTxHash": "0c0fd6478c7af5942c7422c762b7f20a92cffbcd2513ca165f6846709aad3cd8", "confirmedHash": "ac6aca4233c5049175915e5d9aa355293e71d127f6826c9b0f00000000000000", "service": "00000000000000000000ffffc2875bc4", "pubKeyOperator": "18c0956ff452a873b46e7280bebf3a0d7025e554bcc4691abda16296d2fcf74af6a83c509f3cd844fd6b4149f914ced4", "votingAddress": "26DyA3bJdwWY6RsML6iQV8zquKLf", "isValid": true},{"proRegTxHash": "7fe1c5d40d962fe9055ba0ff2d0acbfe026bb28d32b9a60ff77f87c1618adb42", "confirmedHash": "0ab7c7b5ff128228c69ee7c7beb45a194efdbc2e17dd3c3f0400000000000000", "service": "00000000000000000000ffff8b3b4d96", "pubKeyOperator": "0c8860aa3c05a9bfb80e26b49dae338eccd1e846523bc7e37cbbd270c2324b28ccff19f5a2db31b9d48e7d9cb6ff9e02", "votingAddress": "4ZMEerBpHAVPR3tYkD38rj66KnCj", "isValid": true},{"proRegTxHash": "b0e6c14a0b4a28f56d4473aba8bbc767c865687e95363d5d7ee2c5e3d6a620e1", "confirmedHash": "6efda471cf862b9d6d9cdf69abe97242e311868854e608c22c00000000000000", "service": "00000000000000000000ffff2d20b84d", "pubKeyOperator": "8f975dab40eafa9c91cef7b22b11bf7eaffdce726e0c12539aea7f13690e3afc816e5f3fd21014629b3ff5b63af2dbe5", "votingAddress": "2soPuRfFnxNSDenPyXPSQTV2eXed", "isValid": true},{"proRegTxHash": "33161df3d53dcfd1e2f23fb615ce048d93ba72635cd5a43b9fc4de6e12750044", "confirmedHash": "495a93de937dd0cfff0761cec6e3f20928acdd82471232dd1200000000000000", "service": "00000000000000000000ffff8ac5931c", "pubKeyOperator": "0f83c8c7338db8d6614a2b01080aa1dbb9dec6be43254a0a000876a95c0c9831d2fc7dcdf3f7afbac0820762563a61cb", "votingAddress": "3otB6hiXj6m8Z7G2GMSBHhDmG7KN", "isValid": true},{"proRegTxHash": "f035cf0f8aa371a3ccf4e2c06f84553c7d0e024cf26e3b0b2aa52f42c33c95a9", "confirmedHash": "f2862c2e0834896b8d60de2591187c67212a92f0fd8839cf0800000000000000", "service": "00000000000000000000ffffb280e6d2", "pubKeyOperator": "16b3b5c84cd0ab4ff85afbf36d0fded2e21a0925d23ede1e41d09a973183c6b4daccedfa05fad43b935776d696c62249", "votingAddress": "47beDoMAEWWwM9cAr7gRkYKDp1KA", "isValid": true},{"proRegTxHash": "eacbc293f0abff757b927930e01dd185f907a1b88b0727d58faa78d53b4e8fd8", "confirmedHash": "a8ee8387f3066af1326d7212a20826c6c4f436deefe1fb241000000000000000", "service": "00000000000000000000ffff80c76e2f", "pubKeyOperator": "026d828e39ccb5d0ab5c374fe8753bdb11d183d63d56e6b5a9ab62d505e3fee87065b6c744df59b0cc7e9fcd2b2fe71d", "votingAddress": "44h5RY5LXuBRTH31j9uEf3tdp4Cy", "isValid": false},{"proRegTxHash": "838efdd9fbd55d8f2c091eb151bcd885d447db7d059f544bd287303af97e404e", "confirmedHash": "82efe7ffc72de8b4dac0b64d205bc2cb9a5dac37f80e6a630200000000000000", "service": "00000000000000000000ffff8b09c7f0", "pubKeyOperator": "8a61a4026a6177677aafc9115c419cdc478761393aed8e4a5ace54ed63e33321727ddb6cdf30636b5b74ee874bcd16bf", "votingAddress": "iiSeWofZpDNAQkc3x3GxYp8ZtH3", "isValid": true},{"proRegTxHash": "a2efb0ff9b395c2edf9a9f112139a42d286ebda5a215349f8723b18c64334646", "confirmedHash": "926c92598103e4f12bfa8fd8fe95737dc4e6303d12a67ce61300000000000000", "service": "00000000000000000000ffff6deb4685", "pubKeyOperator": "021c8bbbeae8dcdecfb981bce45a72f6b3921154e772371ad266613785211307754232581cb314c25493a9d23a26cbab", "votingAddress": "3PxNi1C3oYz3oEwQ9ywt76N5eYeu", "isValid": true},{"proRegTxHash": "354ad30699e5561d6e15ff143ebfcf6abf3524804fc2a2af1874f300b41ee24e", "confirmedHash": "d72f45345dd0473919608f03503693e163e6b2f99d74621e0d00000000000000", "service": "00000000000000000000ffff50d0e44c", "pubKeyOperator": "9760aeda6aabeb6c3ff20065a87d2de59a5d44e5b371df2064cd48c211c9f395b9166f7b05a92725be8c5414e1d92fc2", "votingAddress": "At1me4mRreQiU2KM9KDotoijcru", "isValid": false},{"proRegTxHash": "727b0980a480dfc853783061b0474d5146affb55077ff9eb602ce3f4d39adb8a", "confirmedHash": "794fb9c2de939f0e278e20be3dcb5175e9038dc3ee52ad3f2300000000000000", "service": "00000000000000000000ffff52c4010a", "pubKeyOperator": "0ef3cf908081295bbb09e6d46459cb8297a820e1e00eb6ec5da3a97d33e87abc858d9f28224ae3c72302b2bbd1d704e9", "votingAddress": "URYTELaUmi6rhYBx6cziWdpVavx", "isValid": true},{"proRegTxHash": "8a540769fb7e8beae5ab4574916fa05e371085c822a806f950b374ee4f2c6f7d", "confirmedHash": "39b576e1cf480ced1b7f6822d3d7768282e7591f24fbfdae0000000000000000", "service": "00000000000000000000ffff2d4ca1aa", "pubKeyOperator": "0b14072c3a03543886de0b0c344669bce4c707c13e626b0de62f15b4aecf38fe91595be641f9c12df945483907904d2d", "votingAddress": "3cKhu9xPCSE9nLBL6KLC6iPwYv1M", "isValid": true},{"proRegTxHash": "cbc6fae8f8a2c6aea6a7906ae792ac958043cd205a927a0ade818f239b0014bb", "confirmedHash": "163736cc38b125b096dddd68dc686b230cf8f9417dcc7c6e1900000000000000", "service": "00000000000000000000ffff5b868a58", "pubKeyOperator": "023b1033f2d13be0799d61dc591a7087c3adda1f991bab5f27d45751ea3729dbb1a294f288875694c652a64bb5471708", "votingAddress": "351fWwQToDnRK9fHVBygRFWpfgTk", "isValid": false},{"proRegTxHash": "a4291ee9ae75de6b333333ba55983584bf7967baf0c01ec8d3c692bd98901af8", "confirmedHash": "53762dc241899840b2c2c5fdaf4168a2a4687ed00869399d0800000000000000", "service": "00000000000000000000ffffb07b39d9", "pubKeyOperator": "17b5527b371746b62db3d625d32180fe4b65e1abf6bd4a6bfb036c7d2df9cae37b6a0751eaa4931c8f3c7cabe8729c3b", "votingAddress": "3sWMLvB4rRsdvbvGPsPAkU6Xh615", "isValid": true},{"proRegTxHash": "c67f351952bb3eda335b9ae72547e03985e41c177da109fbb5d48bb20f31e217", "confirmedHash": "b4d03025e4f6bd73f89633e008bc6b586315551da906f29d1c00000000000000", "service": "00000000000000000000ffffb23e8032", "pubKeyOperator": "1948d392912320b0636748999a2c2e64615e0587711553123a013089d369501ca9353d0c05732ba18dfa2952043ffa1a", "votingAddress": "3PGifdKw6syRJ9JCey1MzxCCM4Kq", "isValid": true},{"proRegTxHash": "38b840702c313e4087d2fba191236646e221e36db4d2b56e2792c7602c83432a", "confirmedHash": "b74c8d0079e8c45c145eea7839fd99bc1799a960fd5758772100000000000000", "service": "00000000000000000000ffffb05e11dc", "pubKeyOperator": "0246206a3d0e141c65ae8c080bc23f7bbac58b46f49a973c4cda75364f029a31e0345016a88d8b03cdc386bc5cc5ab2f", "votingAddress": "3toSTodP17ixPeNBBshQRoSecz6b", "isValid": false},{"proRegTxHash": "288488f00a40113c05745d0b2f72f22f3e09bfceeca90eb2863a83faab8c61c7", "confirmedHash": "2ac75221a701fa672c78084449528d8a8ad36aabb7e8add90900000000000000", "service": "00000000000000000000ffff5fd87e29", "pubKeyOperator": "0ab5ec94ef680cb73479942fdffd0f95e5331f498dfe9d11496538b34097a4118c759d48a748e23680d0abf80460ebac", "votingAddress": "4UAa9JkWe6hNTKXKKdZCiweLQbMU", "isValid": true},{"proRegTxHash": "8df28b5173cbabbdc8098b08632b09d8922710bf69f4f62bed4d5b475aa44e36", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9e656d05", "pubKeyOperator": "08c43714be0c3413b8dda4aeb1eb7e86682cd1915a584e90c34941a826b453f4b2461ed43e28decaf5ceeea02583d748", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": false},{"proRegTxHash": "36167b67e77eb5ea9110cfde927841a3033a52a3d235dac3aae6153c259d1019", "confirmedHash": "24f9c918c22b1d7149aba315be289f9097be8ee0ad3944700500000000000000", "service": "00000000000000000000ffff8b3b00a7", "pubKeyOperator": "81fc5bd96b82e81bbba5e4f4fb24450cb8a101271114294a817e35b38091095962a4527e2ae53a06587a4e1b6bdd9511", "votingAddress": "3QLowr7oJWA2jENgrFcEuUxKF5ry", "isValid": true},{"proRegTxHash": "0a28a7fa7cef4ebe4b7662ac47c5a75c43a56cb8d30623698fba6bfde01f2305", "confirmedHash": "9014a378e9b2f398987f5dc0a13f43ad88d994479c0756540600000000000000", "service": "00000000000000000000ffffbc28b980", "pubKeyOperator": "858ecee9d4152ea6902a1c32950041fbc0463612d77477a8b05a28c4936c1f79372f9eeeffdf866bbfb3c394355bf454", "votingAddress": "3K9SukdozPU4N11YhMrYzXdbHWdY", "isValid": true},{"proRegTxHash": "c0b7642bc875890eba961dee764cdac9aa2d36172ce790f94a6c98bedb697d60", "confirmedHash": "44bbcc917450905c4c682062c4212c42797c62fbe8da91de1400000000000000", "service": "00000000000000000000ffffc2875164", "pubKeyOperator": "96d3a2402fde9194525d56c1795bb4d01e02a780ba561997291c53a5b296f7d302b2b3d129702cc2c6b8a1fb3242438c", "votingAddress": "45aq8LUs8HDoruRgxCmLexa5nscp", "isValid": false},{"proRegTxHash": "2305f33b8594dad2e11319341496afd362ceef22676297e60b73316aa43d2e81", "confirmedHash": "402c0548a87320f6b26851267192c8c17a1ac03ee95939b10e00000000000000", "service": "00000000000000000000ffff52d31947", "pubKeyOperator": "09fa1d68dac314ba471385f2e9c7dd22632b1699098ea21cf1478caff4dea93786ac1884de7794ad8974416da56335f1", "votingAddress": "NF3VY9Snr9Za112rZby6CNCxKCU", "isValid": true},{"proRegTxHash": "38d838432fb80a899c6697555a6fefc615a28667d3eb251c0b46c8b94e8d20f6", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d59a0b", "pubKeyOperator": "10a9a686c2d9203901d3146932ebb3a170f81b09562bf57c4ee7e6e91e6d64912c9bbcce03f0fd739b6c9b2bbf5a2169", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "17c75964ff9437fa38a3b6b96cb5896288ecc3d5d6620197c41e53e756996a14", "confirmedHash": "71353673bf5455208c75ae2947848fa8bc664c85c1ed5a2f0f00000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "SKr1h6FWZW1f5ePXNewwrDRu2ZX", "isValid": false},{"proRegTxHash": "549eec35d083645f94cad64425c692a0e2b266e32fa68d1fbe94a723155b8856", "confirmedHash": "758ef98974307bc57be30ac0db22a3116db3b9b08fb5a7211d00000000000000", "service": "00000000000000000000ffff68eebcbb", "pubKeyOperator": "00a332582d27709c345d02565c05776d99671cea0a9dd107a5f715a66cd2a423deb3e896b086bde130cf17e0b47942cd", "votingAddress": "ZjqZPGBG915zU2SQEdtYZfWfZpj", "isValid": true},{"proRegTxHash": "9543f479b0f02c86bfde3e743a1bf5a3219cded22ba7b436314a888f7a032937", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688b7b5", "pubKeyOperator": "08d1b7dfe005baf958b487a4b72609e949ced0367e1a2cc803d311a25a9eaada0b00568b385b595b214312704cfb643b", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "dfe87bc2339904d0c2b4ebd36dc72a35f853cddf8c1d30e153b73ffb83de0545", "confirmedHash": "3804a47be25c1fc40ed031493ba020cb0747675aa7e340740700000000000000", "service": "00000000000000000000ffff33d26907", "pubKeyOperator": "131fe16c12f4f88d6ca5b95f4670fd81f8c15fadd7cb1aa9ff5a482131a4a4f9e1be19bd07b24fa91f9ab1f469c2587a", "votingAddress": "4Qq6pRPX261LpjMXqkY6QLZnmGat", "isValid": true},{"proRegTxHash": "4174506f522f4a42f3ff99e7a50aee0a7cdd06ecaae3b6191b273146de1720e1", "confirmedHash": "24fd11326f27d79a3f436bae9b2799f37dbef46af9893a960300000000000000", "service": "00000000000000000000ffff90ca14b4", "pubKeyOperator": "09e6c73bcff33190705364cc73b96ec2fad4903b7226b25cdf8d8777a2148a38a4e3c84557b9dda208a2bba295e2e3ef", "votingAddress": "quiM8D7Lo24YqnwhRy95g5Cxy4d", "isValid": false},{"proRegTxHash": "35a6f7333f4512dd289fb9bfce90369b14fb002b156c1738277d486847c4e19d", "confirmedHash": "e689aeac898e471003c4315a8c32bf22a00211e3afd7e8820100000000000000", "service": "00000000000000000000ffffc21ae8c3", "pubKeyOperator": "975b83237f00d119fd7c9b6d05052009bef91432e68582fd63298cebd1fee6892bc418759e0d39a769444468440ca931", "votingAddress": "4Rr4ndpzQ7z4QtxhE7YV2CYofx17", "isValid": true},{"proRegTxHash": "e0a95e087a43eaa2333441db3a837f9e7742c6468e76178b73d085fdab3a771e", "confirmedHash": "f2d0382907b7f9d87e7555fb8023542f3f2bcd72fb32affa0e00000000000000", "service": "00000000000000000000ffff8ac5af91", "pubKeyOperator": "85aaa1b03e2cfc46924d6ebf492af8ed1c05c619149980b61569f579961e1e070b71b272e7b63db5a7a162b0bd36f0f0", "votingAddress": "2eSpyvpPtqL5gb7mAFGuZxC43Y92", "isValid": true},{"proRegTxHash": "094d2130a7ba9738cc0c3ea0d761671256ed8f243f549b9c53e5b06467bb7cd5", "confirmedHash": "3f46552e5ddce2c4549965109f0727b07f064ae5fa42fe830500000000000000", "service": "00000000000000000000ffffbc28be21", "pubKeyOperator": "0b1919bf6c40d6b63459a78e8e016f100003fdc9ab6f5af3aa4c0969b00afb070a43c4eeeda71f345f505ae51ff0b23a", "votingAddress": "agd9QFLrpFpmS1uBQyedWcJSoo7", "isValid": true},{"proRegTxHash": "0493473479ac920ccb09d3360f5954295004e2d0f20cc3d6b27f4084d076e2f1", "confirmedHash": "ea2237283e375670e8116e14eaeeeb282488a5b76acf3ebc0b00000000000000", "service": "00000000000000000000ffff877deeef", "pubKeyOperator": "92378cb4bcbebab22b4841f96fd4b423983eccc5671d650191637d8e9223c5da773b0711b58ca420eb647e0684a7929a", "votingAddress": "46758aCBfkgRP65oKMYqizfYvTMw", "isValid": true},{"proRegTxHash": "71997244db51c2582e3eaffd6c20466e5e0a3a03d004f4f6395b61e92b701dd4", "confirmedHash": "640298b997f797cd6986eca2a4baf2b276392f8cf49c114b1800000000000000", "service": "00000000000000000000ffff2e1ebdfb", "pubKeyOperator": "0cbac651211c5fa694ac0dfab9682eb396eeedbbeefc37014c5790fd77b42b08fb43859d85851bfefc1cec377f9de15e", "votingAddress": "3BNm38njBSGFJne9RQ5Sxh1jJMww", "isValid": true},{"proRegTxHash": "3cff78ca75412ca5115b9826436dfd64363de4b627762ff38f2862aa160c0355", "confirmedHash": "7829239591c0754b91dc4ab5a92d505f13a515453d7db2151a00000000000000", "service": "00000000000000000000ffffa8775793", "pubKeyOperator": "138cb0a07838ea7c5332ef532d81985076fc6200ac5a87175298661766facb850f7aaadd32fd7363dec2fd1b6f828d30", "votingAddress": "3X2mb4qrMxANLrwPk19SrRfojZ8c", "isValid": true},{"proRegTxHash": "25f7fd34a45c7b3e54285c324b98bf1e7bf8b2f47c2c1b201a3f6f01018cb8db", "confirmedHash": "41574318b3870010f419c1f36bc89bdc326b8e3089b143de0a00000000000000", "service": "00000000000000000000ffff2d213df9", "pubKeyOperator": "8e18bb44f5297984e6030a13caeb4b2452a9e749ceaee6c2567df6c9b8dcb2f8e6cfe64f4f0a73d3c0d3a0364ee94357", "votingAddress": "3td9UeLRg15SZMUXL5ExDa8JCvDE", "isValid": true},{"proRegTxHash": "a655932f064a806f584b08065b38c5d6c30cd29bb929ab8d201a7b9a25cce5d7", "confirmedHash": "245d2aa1f746068da867c375cda4d963bb09e0fd9621fb752e00000000000000", "service": "00000000000000000000ffff951c33a2", "pubKeyOperator": "86de437a3adf49b886960eb95b230cb1ffe05e7f8331edc6c1def87b6cec95d1e65d9bc13945bcde644e796b7cb1178e", "votingAddress": "3h1KE5swUB7L98R67riAQutGpfRd", "isValid": true},{"proRegTxHash": "272231f882280a532b568b11a694977f37290877c9839d0658dd313a976fc8f1", "confirmedHash": "f897c846d0af4d2f9d20712d66ff920ffa266717187048390100000000000000", "service": "00000000000000000000ffffa123967c", "pubKeyOperator": "85a14150f54d08bf8c1c6c6cc418f5b652351e50f2bb00af02dd7bb98043f81ce9e5abc38db952af25b6d656f5d4ff2f", "votingAddress": "28ogn6iy6cW1zRJDYEKoW9GrsGoP", "isValid": true},{"proRegTxHash": "605eaaa50f4f4f48db75fc2c33a27204e9ba86d7eff95ce40501dffcfd23e465", "confirmedHash": "a10436edbf04db8e17d5c8898d087ffcf6a713ff34c0a4352e00000000000000", "service": "00000000000000000000ffff52d315b3", "pubKeyOperator": "85ff78e51f591b465456a2071c0d760a3fbab350a8914701d07e369edd92bf4db71320bf9a572f991070dd936a45129e", "votingAddress": "4ThWmEkYBUjGSmMoXj1tfTiaejGb", "isValid": true},{"proRegTxHash": "3701c5abc2a9cd0e9bfaf697d469ce3c129b3e0a4a3acc03113983b872ad962b", "confirmedHash": "13fce728126e6025dfa369e8747777534def53737b82c0c80b00000000000000", "service": "00000000000000000000ffffb28057c2", "pubKeyOperator": "0f7077767b2cab9e436dca9c6e9ad8b4d5c5aeb24c0278d48fc2f0bb111115d0e5f4a3bee6322268aee7eaa47ab0044f", "votingAddress": "2hg8eREJRjaZVtee9v8AgGx8PZxa", "isValid": true},{"proRegTxHash": "7a7257100138704ef0e8feb5107d7b0343f597309fdb20b0c68d8eccf4e18743", "confirmedHash": "e7d30fbf7921823b1b907fc28fdd3895f780600df176d3f12200000000000000", "service": "00000000000000000000ffff9fcb078c", "pubKeyOperator": "00c71f5af3fe54de474405ea1de62a112c6f348f68b0a88d4f801e91ceeae235a50c340cd9bcf221974827fcd19ea113", "votingAddress": "5PGEHXyPAxmhaAUERAb8kQyTNbh", "isValid": true},{"proRegTxHash": "7c000a525e75b53b9846e454587932a5fe8c63dbb1ce5f25b48b82ecfe795fdf", "confirmedHash": "0c36dfe7e9d9bf332caa00d5b0442e5daa38f250bf9d08f90000000000000000", "service": "00000000000000000000ffff8ba2d34c", "pubKeyOperator": "80222b8057fe7bf86a84e7b0ad2db56c391193a40244ef24c15c9363c12ce6485231312396313e33efc3f7de551bd266", "votingAddress": "8mLmCB8Bpc2kMU7b7eKVHXxVYJ2", "isValid": true},{"proRegTxHash": "f418cad19b5f77458c0fc117df6ddc89bf9ff801c6494d11a2c1c5556480a258", "confirmedHash": "2b21ecff8cd8cabf30a8d419114c22a11a6b3f8b00548f7c0300000000000000", "service": "00000000000000000000ffff6a3479da", "pubKeyOperator": "035e208fa98d424dfd8f86b5151a74c57981478341f7e66b69b21416f09e010d3448aecd4a51a2a055cd978383b4e098", "votingAddress": "2jqHo23EWQZ8kHXKY8aNt2zJw1J3", "isValid": false},{"proRegTxHash": "46a338609bdaec6183c6804ad65fbd8680021fb100f4c752d6010e1b20c56215", "confirmedHash": "25e116baff45a873c2c5cbbe64d3c331a8778dd5c7f93ed22600000000000000", "service": "00000000000000000000ffff5fb3f57d", "pubKeyOperator": "13f341029d4b7d868749e77f8acf5962e1c3efe6994eb4d4999f92fc54a2eef2fd3d21bfc27460d7ffa7033b3506bdbb", "votingAddress": "3WkQEUhHw91is3ic9ZWpNr33HvLz", "isValid": true},{"proRegTxHash": "9f4ce4838c5f47375b6d3722e78c85a9debbabb07f4f722595853a989bd1a903", "confirmedHash": "3d7c37bfd286c8e716b2f1fff9ea61d5a82f5efa57e5f2680800000000000000", "service": "00000000000000000000ffff8b3b4a99", "pubKeyOperator": "850c8517b234dc315b2abccbd8c7553f9928dbfa53feaa985a19168f1e9681691273801a0ae2c31b58820c8347127d37", "votingAddress": "25vAvZpts9ARFJcEWqhhupSaLJgR", "isValid": true},{"proRegTxHash": "ea32ac0753309b9cb43674cb7cc13a5b47234c53587f945e66a93ae1724715b5", "confirmedHash": "58e240a154a0ac48dfd26143fb8ac7413aa11d8f10f16e622700000000000000", "service": "00000000000000000000ffff5fd87e2a", "pubKeyOperator": "8e55894085ae8353096780a38bb32b6e6494e63ec6f339f64b3c7f55ae942293af103ac3f2e78d78dcdaae3a589ff60f", "votingAddress": "4K9cQp6xhdNQp6N31WFgUbb6Lj4Q", "isValid": true},{"proRegTxHash": "feac9d7d804eadab30dfc10ebe48be090e8ef736f6380c1bac9500bebccb132e", "confirmedHash": "9f274df387d1066e3f1257f138c8c02900707c22887a77ec0800000000000000", "service": "00000000000000000000ffff5f551c0a", "pubKeyOperator": "98eacba4f1f6fc5c85cf51fe6afd92d9d414874f608eba623f7f557a1b06491d52d2cfb2b72944d294ccfb8ac8e71147", "votingAddress": "3GiMFoMEWhCvFbRwV7wW2nCY2gNV", "isValid": false},{"proRegTxHash": "b4cad71e9900c0e5ea84ca7a3ad9082ddcef7391d49cbba34374e870dc3ce4f6", "confirmedHash": "8b763d49a209ac48f25c176ba9869924ec3992fe76a273c10500000000000000", "service": "00000000000000000000ffff55d1f185", "pubKeyOperator": "0a0476857827a43bb0aa33b979990c2ad40bd03c02352e4d66c1a57b38c3ea3488e54654824acd36cbe0415e0cd7f16e", "votingAddress": "42CcR5wi3qvbfBLmRNbwRnzdttNr", "isValid": false},{"proRegTxHash": "2f0161d32b8f61dc47da204bf2cda3f81ab7d1c349c7cf80da1306c2879f789c", "confirmedHash": "908e44c7c7b12c9706c4c8c44cd11c996954c4150963cf9e0700000000000000", "service": "00000000000000000000ffff877dce13", "pubKeyOperator": "00ff823676c7ffe09bcabb4f5ac2973b5111aa7e3b6c494e2c0cbee2352c053634f0b10982ac709216856fa286c8aa7c", "votingAddress": "4AoSbNouFooKYLjErutujfnZxk8m", "isValid": true},{"proRegTxHash": "a9301055b6a4894a4c914188160a2998956301b81cf027ff4f6be33b0b14c6bb", "confirmedHash": "deea24e962fac02cf223dd40dd3f1d84e4375d0d51276cb70500000000000000", "service": "00000000000000000000ffffa8775006", "pubKeyOperator": "08d6e9001222cabdee144454b5b4d5df2d5686bb6b3f44ffb684fcfd8e05b113f157b7256f024fd9031137d467ed2803", "votingAddress": "2b1ddzE2EvsyoFG5guVfrCeHdVKA", "isValid": true},{"proRegTxHash": "f1c577117dd33bee24d58113931257c560c41a23072ccd608e0c44b75a432590", "confirmedHash": "b5ea2e43d14953f8df398d10630bbd5eaa28c26c3a4d1a141e00000000000000", "service": "00000000000000000000ffffc287534c", "pubKeyOperator": "1157d9ee4b37f3576973e6ac237328474b5650a61b4a1d7a4c59ff77c2568906a9dc5592aac64b4f27e719c0efab3ca7", "votingAddress": "3QjUJJjzsvXmhaiWrg1gJxNQQ66c", "isValid": true},{"proRegTxHash": "a34bfc4ff42e83d29186bba888e3a2f9bce3a6a312b1d0ca3d5315d38fd3bec5", "confirmedHash": "7235ad5a45f3a0a4b5efa01fe2f67e72c70e3a5d69b8c3710900000000000000", "service": "00000000000000000000ffff2e04a27b", "pubKeyOperator": "10eaeaefefc70f275896756f8dbf8df5205118ea03265aa4a31236c5d4825f6d7fe6a29ca6606158df096f9f8b6a36fe", "votingAddress": "2XwFXX7o75FvyU6y4NmezUHC9h7q", "isValid": true},{"proRegTxHash": "13760933ec7b4b42d1813ba675a264bf17def4545b90cfec02b9e71f1cd310c4", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0d9", "pubKeyOperator": "8dd1a0cd750775641e714d2269c471acc78b8f1529035954afcbee56a1144bc7da09b7c965eb75116102bba05d338d21", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "cc5513b058348d34cad2a11752b296b71df1379ea78cbd31ea5477550b43b46e", "confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", "service": "00000000000000000000ffff52d31589", "pubKeyOperator": "8249ab30805035c3f8d6cf36bfa1271e20d19145fe594374c4f0d91468759ef56cd06de1acaf8d2d0c5f0cc131dcfe27", "votingAddress": "2zTJhdxjcWWsQGwji9ZTxso9KxgU", "isValid": true},{"proRegTxHash": "e600976ca50b10f1d175283c76543997e92879ac51329917156230bd744bdf17", "confirmedHash": "b42a1ed6e2e9212a2208c930fc23b7efdcd97daebbe2c2591600000000000000", "service": "00000000000000000000ffff8b3b38b5", "pubKeyOperator": "11c8147072418f7406cab944517233d6d7ae02f01775b0cd18af340f4c35a206d2e8cce23e6ccb00c0bb969760144a3b", "votingAddress": "3bhxAWGp4VXg77ZAXjf13PmkKXR2", "isValid": true},{"proRegTxHash": "688ee7e8f13ad19ba94e10b08adc2a5d364c7860dd3527529e87384644413d61", "confirmedHash": "e1c772e91ec80962275560fa2ccf8568e33a71fd86d60f5e0d00000000000000", "service": "00000000000000000000ffffb23eacbc", "pubKeyOperator": "8ea809bc1e9e662056c8ba667ed50b87c6e5760edb3961673a2a20830c536a79e8ba6ac29484086db49086ec583e11fc", "votingAddress": "2qSP7DtXu4bEEsFCRBb8gGCRWwYs", "isValid": true},{"proRegTxHash": "1858e4064ed6f9002e38c7e96664ba93472941ed72f891d9827f8cf51b9900f6", "confirmedHash": "7663065cbbf7902677a10c967298014391747c792a5b04163a00000000000000", "service": "00000000000000000000ffff2d4c5410", "pubKeyOperator": "19fe4d72ac1393ea67b44b4a91c09600e42404059bd853e675ef59776b25f3aa705ed1d7127f3e82dfe0e0e4eb7d9e13", "votingAddress": "23biWu1aT1HwgAAo4Nexka9ZNhz4", "isValid": true},{"proRegTxHash": "a7861cccce4b5451f066540ebfc78f23a5e51d28205118402297b6160e9827c6", "confirmedHash": "b4e046d76ffee5e7f052dd5232094f0c8aebcb838bf22db80400000000000000", "service": "00000000000000000000ffff5fb3f781", "pubKeyOperator": "109d8ab86471aab37b4804c2adacfb5fd901634a9d5f9975c1e19d12c0ed00856aa002ef1c9b47f2bec20a0e6178d981", "votingAddress": "28qLHVMgTZeQxfrn2hGKibyP5t6Y", "isValid": true},{"proRegTxHash": "1f8cdcfbc315cfc4f351d0fd76e947c021624197ad3962413465ff9632f7efe4", "confirmedHash": "e1a087a733727100bc5e5baa15a078bd0f37d7eee4d5fcd03100000000000000", "service": "00000000000000000000ffff5eb0ee0f", "pubKeyOperator": "0d820da6d08020dec68114593ce7ee23bd2bca7b2e178b20ab6ecd03994308721295356cf53b2d02d1401f193ac56ef8", "votingAddress": "2rzCWTFW2Hxo5exmyeMbZGKy7NSJ", "isValid": true},{"proRegTxHash": "a5ed605b135bc523202df6c4bf3ffcb8edf03e5d9a822a6370dfe8c5e1a1da12", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff8491ce93", "pubKeyOperator": "83a1d3695942e714b4647d6f96ed334b69f6229d17dcf9c4279a2f9d475f9ba8a724ea5a0f87710265a174b7cbf8d4bb", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "0372c093b2cd9e0eb6785eba4e7a87ec07ff669df9a80b9e5c8f87fa9d3d600a", "confirmedHash": "eba3094b1ca62cb094500873c745e0f55354317bf1a030360100000000000000", "service": "00000000000000000000ffff2e04d9e1", "pubKeyOperator": "9966a0a4c568273f275890c748dc2e2fddb392832c44eddf6a13e4b7f4dac94ce709d2fb077a205ff6ec320cc451aa9a", "votingAddress": "CVPJq8SLr3atieVe46Ki6MEwfjZ", "isValid": true},{"proRegTxHash": "32ae2b1c7715495579aa4dfbf8c31ba6bd2aed13594683a5abd204565354750e", "confirmedHash": "437fe12c7a81236f7d123290f0d3886037d3ce90baf5e4961600000000000000", "service": "00000000000000000000ffff88f31dd0", "pubKeyOperator": "80a0cd078b56fa811d346656cf0f0de1832e4108b150d8afb74dfd4cf1b0838524606e0b23361f784e64bb9934e0be73", "votingAddress": "4T4eNTeqfhT4MLasAAB5bXtnq44c", "isValid": true},{"proRegTxHash": "50a1951249dc067444f96aff0982dcdcf23daaee83511280b10c282c9fff9eba", "confirmedHash": "4eb09dba76634f8ea98934dba9ed53d07b6680bcc83bbe310800000000000000", "service": "00000000000000000000ffff2d3f152c", "pubKeyOperator": "01e8d309c0129592d2c320a99695b8cf465a0aaa9d82f1fc278be88ae9faa2a8491faebbe9d368e5fc013db721e025fc", "votingAddress": "3GVy7ii39ajEo2UiJnZrvU4Wx1Wx", "isValid": true},{"proRegTxHash": "a4fdb5c9d4a5d13dbebd9fa693e37aa284708d2ab2d8d0393cf0795e20e1d4c0", "confirmedHash": "b34dfe65eb519e1589c1a299b0e7773e898c4240c22c9f9e0e00000000000000", "service": "00000000000000000000ffffb23f7984", "pubKeyOperator": "03565607ad3493fe5f9b7d97e44a68d0326db3e486be171e4f56a6d410b7b0a8a12b0204efaaa59cf0c6542926350f17", "votingAddress": "5cFiFmhZ1At3hEpRAFER6PhcjqL", "isValid": true},{"proRegTxHash": "c37e8ea9f67b9f8553c5a9bdd61ed401aa04903be85c84ed2d9824e764edf6cd", "confirmedHash": "825ff51efd7ed0fc1fc428520486adf4d7acec61b83d33cf0b00000000000000", "service": "00000000000000000000ffff55d1f256", "pubKeyOperator": "970a32304abbae577ac975048a496a78596183a86984c402d958fe5985dc6ead8e0fcf88b92503699b967e40056c6602", "votingAddress": "2RyCPyNzYdojsv14WKzZ4k5f9iyi", "isValid": false},{"proRegTxHash": "0aeffdaf00901e28c69cdac7c25b46926b66be9e1e78e151c443c7308a63afc0", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688ec40", "pubKeyOperator": "8d2458c7119ef957201d5c002ccaac39449c3013549df89b637e913bc423a3562b0c30e32ba02d688441e816bb1c65c9", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "50601a404e1001d5a77f7e6a4748fa408d832e1240461729a1031731dc451a75", "confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", "service": "00000000000000000000ffffb951a4e5", "pubKeyOperator": "184431511192571fae3dbf024bbe78653c53706cdae6955bbb4e482c241b50a29d512a305cc1414aabce031c8b23bd3e", "votingAddress": "2NEm9hFMCe8AFiHioJxQ14sA3tC8", "isValid": false},{"proRegTxHash": "627812bbf6a8dc0d58a18cd439b55a61379d06496974e36994ae90ebb7c3b70c", "confirmedHash": "2839919c8bfcd2ef4a2fcb6328e1e5899d6850b4f1c960df1600000000000000", "service": "00000000000000000000ffff422a5ec4", "pubKeyOperator": "9034dd53f7353a528e2b7c1a59122309f384222543cafaf89041fe92885a770564f5e414543f1b324b0ae0389b8a3b95", "votingAddress": "4L7KTxAs2ngXS5iQbp9smAkN8YHX", "isValid": false},{"proRegTxHash": "7ac3dd2d11f7b79d3420f7fdc436b6c72acd647c2e6b6d866e6049cec80b17c6", "confirmedHash": "fa295bd0c1ae0e67926baee1ef37aabc41c46addfde2f9fe0700000000000000", "service": "00000000000000000000ffff86d1c8ae", "pubKeyOperator": "16f592fdab35ffd533085d8a08a155cc5e3b51bb6516c5ec1ffe556c75b0b230ecbbf47fb1b17fb6d6b49719ddc930e3", "votingAddress": "2Xk8J63Fsh9XdtL9Y8AyhXpJM9wz", "isValid": false},{"proRegTxHash": "cbd7990c8b50244187289cf6880dd3e79c0111f53da8da65ec08319974920bf5", "confirmedHash": "3c4ca02f81aff688e0714f613caa39e2835d133d419393260900000000000000", "service": "00000000000000000000ffff52d3150d", "pubKeyOperator": "832ea16f666430d354cc9009d6cd9257aa213066de55f757b29dc14b90d4b8b8bc195b060b7b7e25bc6d0e033deaf19a", "votingAddress": "3mSv56TVuce6BpoCxwxZEf6GKxcR", "isValid": true},{"proRegTxHash": "052e735a4831386528d511862cdfa7489448e13e84e398410d38855ff07f5ba5", "confirmedHash": "93a6f7d256d0cc693cec52642d87b8a62f1b37fc3b6485600100000000000000", "service": "00000000000000000000ffff55d1f242", "pubKeyOperator": "15e27b24c9b2a6c6ddb92b461b786a53ac6b7e6e7aa5cb86a895abb7bf68cd78c5bad1fa2775243df1686d408308b5f0", "votingAddress": "4SnitaazHwmCXoiHaXoT2TDMcqWt", "isValid": false},{"proRegTxHash": "4af860fc536d66cc33e179ff36ed60e1458f6072881d38097a4ff1b58cb62615", "confirmedHash": "3e20ba21c5e5e26dfa536b7e1b1c2c016b254de9402c642d0000000000000000", "service": "00000000000000000000ffff55d1f279", "pubKeyOperator": "999b87d7fbe4a95a7bc46de231e7a1662f75d18e91871d12bd6a6e8c161a809063c5f1b16c4142524b3dfa400cf2974b", "votingAddress": "4VDDXUezKRF88daRN4XbzXHSREgW", "isValid": false},{"proRegTxHash": "df3b9a0f70abe17f3a7817b0e4a2e0839eff9c00e402800a9dd8fd4291af5458", "confirmedHash": "270519d3d841e4836b7b6d692a42d8e30b4282d095f213e52b00000000000000", "service": "00000000000000000000ffff4a768945", "pubKeyOperator": "8c7dfede41933a8b77b8e281fb36b88c9fa52e60fd087ae17dfcfb0a74d4152657892404082adc2ed28734403251bbcd", "votingAddress": "2h9z1NfZcxeL4d8RWjKgj5vepbT4", "isValid": false},{"proRegTxHash": "88175e45d6097007250ed0d42819dcbfeb43d01b982199a96c2674030b8fea81", "confirmedHash": "84d9a83951c34a9679aaced7d80561cde01e8891b1bde00a1900000000000000", "service": "00000000000000000000ffffd418683a", "pubKeyOperator": "135538431b4d6a5af03f97eb4a45f9a95b424a43f2b0d52d60eee1e05a3223901bc190bbd79d4b6f9fe8911b2ce4a479", "votingAddress": "3scku5mBYr3NZiQxNnmpykHRJrjC", "isValid": true},{"proRegTxHash": "c393125f5fdd36e6a5549d8d7f811a15b3caae45b69ec12f932328b06610dcb1", "confirmedHash": "c892ea4fefd95c776952548dc5aa12cba1a95a3103b084411c00000000000000", "service": "00000000000000000000ffff03019ffd", "pubKeyOperator": "141e23fd67b1ef003d01fdefbe67af0146739e3485f465f0b973088ce6cab08ea5b008d6ab9f0ad76514df46f7edbde1", "votingAddress": "tQrTA5hSeByay1vdgvjdyMtMFgg", "isValid": true},{"proRegTxHash": "5cf85718840c95aebaf3f7d75c4182ac4e03cda889687988afcc8fcc349f21b0", "confirmedHash": "e99fe9a8cd2ab6c9cf5e7986d4afd52219279c9d462e950a3600000000000000", "service": "00000000000000000000ffffcebd627c", "pubKeyOperator": "974b0b9c7cefd7da6c3ea08085c70c35af190d9b923181aa22707fe9245454c8eb9b50036ba21220379963f4ec758f82", "votingAddress": "254kEXEnnQ2bBRCpF5hwNAoALs5X", "isValid": true},{"proRegTxHash": "747f5ce7b886d01b1abe3e0c75d847119443c9712b92eff1e16961e60c73ee9a", "confirmedHash": "b14b2fe2f0062c5c84cef75dee3a8d509d22337eb1c1c6920800000000000000", "service": "00000000000000000000ffffcf9adb53", "pubKeyOperator": "0230d84f4743a01f8dce761ea578d89b20676f9c0e91bd0dc751132bdcaa9d3543df117d796252eace4adaffcc21e4d7", "votingAddress": "2cBMTn6GoubR8SEZfaKHi4icCeDm", "isValid": true},{"proRegTxHash": "e093af3b711ac9b464d94b1c2b0f731ca9a84d3514aae700a25ff90aeb188857", "confirmedHash": "0739464e03b2b0bd0fd7c81b70af0bc0f8a2f94db280e7a81200000000000000", "service": "00000000000000000000ffff05b5ca12", "pubKeyOperator": "92b2f67111d75bd9288a97958c38418e8b105ad9952b87ff8d6c19ee1b921acef438527a22aa274db8ddbae3546549f2", "votingAddress": "3nCJwC5pZa2vhvvk5Y3bt8pd99mo", "isValid": true},{"proRegTxHash": "e18a380f4f4af656e04b44f9286df7c45918a903630056f1c2a70f1ccc8c42a6", "confirmedHash": "c1ac28dc895b46f0c08d7cb62ddc416c9eaccc0af8a2a0400500000000000000", "service": "00000000000000000000ffff88f3738d", "pubKeyOperator": "93bae38b4023964de331820514a151e4a6b4be1f30189499933dbcaf1b2f29c67cb67f68aebf1567d13375ec94a38387", "votingAddress": "kVqZ8T2e81EUfJ92Jr5yD5gyjBB", "isValid": true},{"proRegTxHash": "0125ac117afce41786c38a40ef4b20711818930c60a5e8cbb472854bc3589025", "confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", "service": "00000000000000000000ffff2d4cebe6", "pubKeyOperator": "0414c98fb057057c6d33ba3ed1ce95311c42fe30b41686359c2940937ab558ad13ca2533b125fe626d87c6dc080a12dd", "votingAddress": "3LHKXrSrJK82jYsqPch6rps6hpKZ", "isValid": true},{"proRegTxHash": "f4b08fab9136879accc42709d73fef9cf329d9ce0cbc744575f69b0512cbe643", "confirmedHash": "9e41713f398ab611481e83516be6cdffc09373d980b165da0000000000000000", "service": "00000000000000000000ffff87b53222", "pubKeyOperator": "86f9f8c4738f1e83450f785017b983c6036ddcb23d16ba08735c51c531347dc3aa5ee8471ad883d2b1dd0873f6e18a70", "votingAddress": "vf47b41A68HBeHMyTAbq7E3jgt", "isValid": true},{"proRegTxHash": "f1237e9189460e45eeec7c06f274c47d30b45151babe8ddde0c3c2eb7459ed74", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96880a10", "pubKeyOperator": "05d8e31c785f94dd46691bad7a4f67243d154c629492ebdbbd6add75e4a683f09bf59158f4c82081b1803ea67d7739a5", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "443ed5577d556d0674acbabe60500b276310319499ed64f56abe160c6183451d", "confirmedHash": "2b401a45f10f95af236b32f5a9cc91f6e2b606dded0e0b092000000000000000", "service": "00000000000000000000ffff5f5501c5", "pubKeyOperator": "0bc736e83a785770158e9639f91f4c4a4ca71795ba9205bcf3b6ce4b2ca4a69971b214586c0fbf1c57897f515b90f641", "votingAddress": "4SK8ANxzfvTLcYZEcBKFRdtS9134", "isValid": true},{"proRegTxHash": "4a7ccf09dd907d8f4929be7032d4dc94a09a938b9255221965fb8eadee3e468d", "confirmedHash": "1950ba56254b70b82de9b15a502cbbf2ab497e9eec9b32282700000000000000", "service": "00000000000000000000ffffb9a375ed", "pubKeyOperator": "0f7416f6209bf61fb415d1e86e5f0f4bf944a9cd2acc6749c3f6b9e92775fb14a4d5ced1bc9f976facc87daba9438bff", "votingAddress": "3CQeCtTUR8CpBXRbqLbreqvx75Kq", "isValid": true},{"proRegTxHash": "cbb18a041bf6646f69454564d843d49949a6fb615a8fc6c12e9005dfd1a38fa9", "confirmedHash": "6bb1e425e59548ac9afe15d7570a8cde3ecffd968e19aa560000000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "3kZDwaT3e8a3cFHpcMuDcASL4tKJ", "isValid": false},{"proRegTxHash": "cfd40991d5ade1566b9f31e330b939687d08bd0ccd7d9eeffa9bcaca1aad791a", "confirmedHash": "1e42a1c5e2e49dc2de62049615a20b491ad0414ffe3841f80c00000000000000", "service": "00000000000000000000ffff923b2deb", "pubKeyOperator": "81166a917f9a6838fb25b79e396ba9bad521dc3bb2d3e5630fd0e01431a250e8a15a9117ba17476e023a02ab7503a767", "votingAddress": "3CRQanLydTtDuuqWkwHr6JKdxMTL", "isValid": true},{"proRegTxHash": "6ba04fddc971d5c7efdc39fe65a338682b56856dcc469557e0997e472d449693", "confirmedHash": "90708d9f21f50603858b126267e6f1a36fb907d4e96ffac10500000000000000", "service": "00000000000000000000ffff2e04a26c", "pubKeyOperator": "1774fd2b1c9dc5ffb09f07bd05a90233be64e3bb17f218f26704322a1ac273d05b3e4e2a020baeee7f54a8249a3b4fa1", "votingAddress": "2d3SQmCQ6H4zsjFBfHJJSp6uYUEV", "isValid": true},{"proRegTxHash": "c4123b477dfa37097d9de6cddfa742ee256c87b93b349baaf8263064f51bb1c7", "confirmedHash": "a62da66b98d15f43a2de812a9f0ff42e6f248d393f2d1a1f1800000000000000", "service": "00000000000000000000ffff2e04d9f4", "pubKeyOperator": "95fda0c1ba69360997f205027fe88936e8c2409127ddee8b5d153952974b5bf5b866edda9dede1ea701ca7ed140e42ab", "votingAddress": "gExAPQoBtsV8nPYDgLcW5zKxsL5", "isValid": true},{"proRegTxHash": "d105b926a1d1d2c8585dddde6e933e2c8598a80170347ae9dd5512d76272f326", "confirmedHash": "f195216e9eead79ff764f4be74383cb8e557eb6626b1339a1c00000000000000", "service": "00000000000000000000ffffc0f8bdad", "pubKeyOperator": "8b817dcf0c4233d3c71ceae42db90a1b630f1f97285b4ffd265387a088a7d38400cd705ca090bd9c0f4619a225e16c73", "votingAddress": "15Hw9RM9K6EMuRCKJeyU39Ww2iB", "isValid": true},{"proRegTxHash": "d9301107dc3426d257476530bf23530ce691a17bcc6eae736101126a6e3fa69b", "confirmedHash": "1a27964919999d8e2598d7b5edd62d008f1feb3a2e0dcb960100000000000000", "service": "00000000000000000000ffffb23fec62", "pubKeyOperator": "81350747c54fe18bbbb92ea1f81091a569451a89d850dadffc0f4aaf8d9cbc6e35460fc8bfe8d222a55c44d127a60c92", "votingAddress": "3DnF6E3fKaxrNhK5SYm4SJYtcbQU", "isValid": true},{"proRegTxHash": "b6f1d07faa63c7a4a9365639db4a05cefd96b2e06b6c4f2b64aa19bd96daf004", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffffc17a9c1b", "pubKeyOperator": "941346168a93179db28bff78fdb5690d2d6e1cc2576e91d3a3b2143826d55419f9ebfea338c3261a5583be92fe30f9d3", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "427251f4d6b520fcc20c32c05e8c590b1b2f56ca47fdae50f39bbe6182b4bd2f", "confirmedHash": "978a10f8500a193c625472b89c1621eaab4d1d56e8a4a4780800000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "aF8DEBAaw9jjw1ko2Yk5Kf9neuq", "isValid": false},{"proRegTxHash": "bdcb83f1a0ae94bd53f627563944f150731b1a8ef0363326b601d2d12e2d078a", "confirmedHash": "5b2a2743584f33d293806bef3f74b94b34b83905a48e72a91200000000000000", "service": "00000000000000000000ffffd945029f", "pubKeyOperator": "8a3cace221e892071b5a21f9f52cf6cffdf588feb485e3a21427f96118383afc523cdb47675d49f6d3a0fa5da38131fc", "votingAddress": "4K4VmvaYwK6pPzAjvdjfNV549rYh", "isValid": true},{"proRegTxHash": "ca8aaa1761e2adafe4242edabb5cb20092bf5ba7ef141bc500c2803ec5c5c9db", "confirmedHash": "1c6ddb714d43962db232508ea5165965bec98519f2f1fb651700000000000000", "service": "00000000000000000000ffff9ef7c82f", "pubKeyOperator": "85f651895ad58017a0a555c48fafa9c08abfa2bd4ccf45af8e7e9c180194e2d22677ebc1af602fa6b9f148a3398a6bd4", "votingAddress": "2KMkA2Qq3H6NTQjr3JiPssfShqnr", "isValid": true},{"proRegTxHash": "7a7dc3b3ef4b2afe5f7faefb6809e068b5e454f1553fcb9674d411efad7e2786", "confirmedHash": "af06dd926b4f76c3c650cd78e4a5b2938e090162bd6df4560300000000000000", "service": "00000000000000000000ffffa8778726", "pubKeyOperator": "07fba0a4a13ac0dfdf329dc103f7d5a0b4b4a1412282527cafd00aa95d241fd18c16edb67815e3d5bef13334b4086ab2", "votingAddress": "j8E5aj5xhicWGL7AdoUMoCZC1aa", "isValid": true},{"proRegTxHash": "0bc536468656979c66bdb8784b1c3b37f59aaac1bea236b6e56f84820fd4a831", "confirmedHash": "7dd29cfea495586063cf4e1b16ac509620a2055cf3ce62193700000000000000", "service": "00000000000000000000ffff2e1ebdc8", "pubKeyOperator": "0a57e187de4e7193a111e3b69c6d972ea882e9c3517b47fc06637d5af9be0ee10fae7b62e2eac9553dafd82b3aee011d", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "d6ac556e92c6df76f4b620a3f629fb7580c19a2cdd0dd886ecbffe7f48284ae4", "confirmedHash": "d72f45345dd0473919608f03503693e163e6b2f99d74621e0d00000000000000", "service": "00000000000000000000ffff55d1f1ea", "pubKeyOperator": "0e7d8330ef5b709d7c17c4fde3fdeb13fe05acdd757b03ef536d4314a51b174c61f6c278aa2f32d522fdb47cfb00ba02", "votingAddress": "3icGEzmV3MGHpTHbVuGX5JrVQYks", "isValid": false},{"proRegTxHash": "6ba91e3f30bb9552bd8ce4eb737ffb7952ca51a8ca5514153a27fd1a2772eacf", "confirmedHash": "049a1b9c525a3c6f37cb5c45d88e0b3eb2223ae38dc008340c00000000000000", "service": "00000000000000000000ffffae8a1819", "pubKeyOperator": "02413e750846394205583ac8545c9e0d4e639e8bf4570d9a29eed1be09c311e8cabe7d79e7d08bed43c3c8ec03a0543f", "votingAddress": "451uxnuRMMPZUpAtxv2ZVU1kU4qn", "isValid": true},{"proRegTxHash": "81de53ab5feed9f78c84da02bc87e00ae38899316206e182909b16473bcbbbc4", "confirmedHash": "b9f0abb87d86c484e51d4bf5cad1a09823a4fcab61213b170000000000000000", "service": "00000000000000000000ffffd4186561", "pubKeyOperator": "83686e7dd5210cf140cfd41ccebcede0f41dcb4c1ce613b2dbcdb6de4cbde71732dca04bd8c9a81c1128ffa0756589b0", "votingAddress": "3VCTa2VqTHvtoBW3TRTLYq6UUPat", "isValid": true},{"proRegTxHash": "c088fda0a29e74c170777957844ea17205dd1f1df85254343da2ebdf3c6fec22", "confirmedHash": "8cde549019656e50e05cf3819d32aec26d4c9a28e67b397d0d00000000000000", "service": "00000000000000000000ffffb23f7981", "pubKeyOperator": "15abed675f69ce1204d715b1ff44d24c3bc4b067ac2db6b2baac5e000347d0a9d95b17e8756aaea097df51fad68cb575", "votingAddress": "2zGuZ676gKoE7SLF2gNgGH6Urvdk", "isValid": true},{"proRegTxHash": "c04af5d67a436186ed33aa2ece01e576821fef99c012019a5cb889877848034a", "confirmedHash": "7cda983d2dd8a2fce5cf6141c48cfe13ed4c9c83d43f2b4e2900000000000000", "service": "00000000000000000000ffff5fd8542e", "pubKeyOperator": "89b8787b9d9c057522ce517cff5e6909ce8cda77d0de446896d0e27909e41c5b494c2e764b2936c673ec8e2a3f0dfb94", "votingAddress": "3yXqbbz8HG2w77CiTfxFZ7ZaLgtT", "isValid": true},{"proRegTxHash": "99733f08b579bff0cd777c53a25333e370deb0edba0d19bb34d01ea7ad1426e7", "confirmedHash": "538ee80ad9ffa7f7a024d24a593ae7c8a434cfa9394b14ef0800000000000000", "service": "00000000000000000000ffffc11f1b04", "pubKeyOperator": "16d9127c9802fa2cb736438b9d30732f2995e131c34854ad0ec216a8742bc3ed6b83703ac39ada93fd72dfe5e801738d", "votingAddress": "oi9uThaTo62ifKSuejPTW64KuMs", "isValid": true},{"proRegTxHash": "3e1682f13e2a86332076b4bbfa06a9f2e846c32e9e966b7b5b5d80946cfa5a4e", "confirmedHash": "0d9bd1f59e06932977a5228d3f29a98c1ef7c2ec18c40e3c1400000000000000", "service": "00000000000000000000ffff411470f9", "pubKeyOperator": "026fb56144bda6ab2bd1d7d68c1c7dfc217319676957da9ffd5164b4ed881f5fc795780f98f764df304c3c3bb48c6e35", "votingAddress": "2zKBHjq67ZZvqPjF5ejuvdcPNc1S", "isValid": true},{"proRegTxHash": "8bc9373ff958a7a7cf06d194e13db6ffd1f2ea89a2e8ea52c1b5cc5767499df3", "confirmedHash": "bfd4044a4ecac10c0981bdc0237be129475ef8e1f3f6d5390100000000000000", "service": "00000000000000000000ffffcf944152", "pubKeyOperator": "9133d87df0d3c1f69ca2b685a54bfa500c58d825feafdbc34cd9c610d1c1adce4d0c9e79a0a59e60705578d1ed690588", "votingAddress": "4HkDxFM3yJgBkQWYyX1WvcehYFGb", "isValid": true},{"proRegTxHash": "f1b2714afd342d9ba6d23d17acb2de904a73024320579b0368d30b4ed33a3541", "confirmedHash": "2707c200de1cb445372cff46fc3957446c45b80b66f490db0300000000000000", "service": "00000000000000000000ffff9f597c66", "pubKeyOperator": "8b38e70e0c6a61db26eb26682f9f8864db17c045b68a0e62b9fba995ae07d72cc2419f3b2f82fd4c9a0803306b8208ba", "votingAddress": "3CG4T3P1HyFbVc1x4ybrASX6D9tK", "isValid": false},{"proRegTxHash": "9c1f95bd555c5e16eba89ceaf7bba9dbcec136378052d6174a2beb4ec16b234a", "confirmedHash": "9ce4c3ecf6214b5f88c42daddf0b33f26e7136bf311cd4581300000000000000", "service": "00000000000000000000ffff9f417669", "pubKeyOperator": "8e455a0aa618a09c846ab7a10ed992bf14eab8f3ef025750d94b0bb41e01c7c3c825ccde1097178e834f2743751c8cb8", "votingAddress": "2TBvSdS9Cz2MTbuVkddV8qTjcLQq", "isValid": true},{"proRegTxHash": "2eb69b5f24680434af1582fe2b6e4706c2851e8a150bb76e1a08927c846cd63a", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b016", "pubKeyOperator": "1459cc9a53df15fb70f64268372cebafc62c7f65c0e7752e3825447076422b892d056c1abb54b4143b0939d9410ecaa7", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "de178725c03a3ad15fce05082cf373ac6886199c0d24dc0f7da0d47025afc4cc", "confirmedHash": "c3f26b080798292b644b1b85a1872d11778465c267367eaf6100000000000000", "service": "00000000000000000000ffff36a5e85a", "pubKeyOperator": "87bdae98dde492e8a1b645a440546882c1f798cc90c10d3c97fd31030ebbb57ec2b2b8d90e7bae0e062263868431e748", "votingAddress": "kiJQX3H6DM9R3bYtkGXVPEAYDk8", "isValid": true},{"proRegTxHash": "e5b5a01f94333f901fd2f562b3ba644132e2919f870d314155c916cec67919e0", "confirmedHash": "86c51030a9e8c82b7c49a35c5b07275bd9d8e53470f4a2561600000000000000", "service": "00000000000000000000ffff2e04d9e2", "pubKeyOperator": "853bc3ec16c7647b42bc36ccae05dcf5fa2b980cb762b85a6316365d237c6c989240032f5d4e250866d41e444eb2706e", "votingAddress": "49QyMiEYh3bfjqh1oM9XcxCVz41h", "isValid": true},{"proRegTxHash": "30bb16484ddd59155295b81c311b5e85ca7b646c78fad8261b6ed7c82dc7631d", "confirmedHash": "860eff821c1577f6b1c7ca9a04472addb92c67346b1dff5a1900000000000000", "service": "00000000000000000000ffff55d1f12a", "pubKeyOperator": "83966da2a9c241fdec5ab59e6a343f9fcbf4e4f320bda2389ae7c4c54c58e13cdceb5e10334fb11cb701f370273089eb", "votingAddress": "34dNRWMw8Zi7PZZpatSdFQKghn4f", "isValid": true},{"proRegTxHash": "54206e01cdad5690efe39a5df4739b8576b26b1931273f95133ee53ea8023ac9", "confirmedHash": "b8a19babcf3aa5275e719fcc0d09de155b3648f32f80d3e20000000000000000", "service": "00000000000000000000ffffbc28b98d", "pubKeyOperator": "16ab972c5cad3cb0b1ef5487ef5b94fbd4142f1d65c3438cb182ad61f312cbf94a77848f71f973826ec9c446bdc817c5", "votingAddress": "4DsdBkHxXiBdTcZabf5sAPdFFomg", "isValid": true},{"proRegTxHash": "c2e7a456f7bcd6a07c9d94b3957666358aad35afd3ec9ad33692c27f322cd63e", "confirmedHash": "b845cb366ea283e330d861bf5d982b9ec674112201f7d4330b00000000000000", "service": "00000000000000000000ffff5fd8e666", "pubKeyOperator": "950aae502cf77b9345485e35f9b53ee0427a2545a25451d47d0da918d24124f079918e211c8a07bdf91b3ff1b031553c", "votingAddress": "2AMU4CQBa2XNfPGfAjSj98QJhXUQ", "isValid": true},{"proRegTxHash": "a45f55832fb25bcd6f779cc8f98cd512c126b41833e31827e190987d8f6bda5b", "confirmedHash": "18fc8d671100a132d44f5d81172ecea186576b13ff373da81700000000000000", "service": "00000000000000000000ffff34562b82", "pubKeyOperator": "8dec91f24ee2352d49f980984b43824f4cc4e7e4df80a644139d24c1186c6e483af686a40a4eb39194abedf19ab0dba9", "votingAddress": "3cneLp5dipn7MTCWYRHswtrkS3aN", "isValid": false},{"proRegTxHash": "dfec22260ac27960d39b0692339782732459aaec8e77c026ddf954f37c2970e3", "confirmedHash": "8a032333dadb2c9fdf1edcc3689c2a30e3f59c51f8ce97db2d00000000000000", "service": "00000000000000000000ffff68eeb136", "pubKeyOperator": "1122a10e5f7ff50e9d0b3d5cde8cef1a3e5e4f880be7a4970b9bc7b0b556c913abe07466a959076ce8ffb6c297ba7562", "votingAddress": "3MUrbXr8sTj2dHMNeqLPE7PCEvFK", "isValid": true},{"proRegTxHash": "b8ca87a347af32d75b3341ffb83cea1b1a0a601c354a4bf0ad5c51a9ac8ed88d", "confirmedHash": "984671fc89c282b4c317406d7bb0d0a2959a97c5df39960b2900000000000000", "service": "00000000000000000000ffffbc28a30a", "pubKeyOperator": "806e4d40fb802c6494e6bdc4e5b157bad3ec20937d5aa28a81744ddaf85b71f5c58f26f8969775ea6a86ec34dfa8cd5a", "votingAddress": "5UVRyz1CQg7yCWwMM67A6e9NMQx", "isValid": true},{"proRegTxHash": "4e169b7e21b42917918cc4514bd6367cda87dc814f0b3371213f1a80cd1a58be", "confirmedHash": "0cdde10dd907cec295e3c7d810f2adbc2cb4c6d76b908d220a00000000000000", "service": "00000000000000000000ffffb23f798a", "pubKeyOperator": "8eece77e56e89f541da75590ca674ef41195678a5c024071fb07d190fd6b1461d91f538a45bfc4e1b049f44e1feeeb97", "votingAddress": "4LCF5L6SmmseELG6vxexMZvCdXHE", "isValid": true},{"proRegTxHash": "b8dad99b5b73c3af78670e18ee652f7a51d5ab6f1168907f9094fde1fd4c2aaf", "confirmedHash": "950cd4a4dce11b5f93b087d4c9b122a210d79d3e91bf1eba0300000000000000", "service": "00000000000000000000ffff984345e4", "pubKeyOperator": "83a6be612097e0facb6d5874f59ecf6f86d85f2048ec694bad69713815a31b091226e38227df013d4d9b20781b241178", "votingAddress": "9RrT7NCYBvJHJgby4kS7aXJ861D", "isValid": true},{"proRegTxHash": "25441297f74ec2cdc1a0b70eedde62e90d614bd240cfd30bb2f27a4454c24574", "confirmedHash": "7eed24a156c8624d890853c684b0be4b10c23606ac2e6caa0000000000000000", "service": "00000000000000000000ffff42f4f345", "pubKeyOperator": "9048f5ce2d0235802d727ddd800114d817f6cef225a9ebb2f5cd0eaf6cf3f2ebeb65c3bce5239a156acea6bb5edad3be", "votingAddress": "6J1AcEeFGZya5BaQWciWpdD9Y42", "isValid": true},{"proRegTxHash": "df52ab39ec922bb4f563837d11ba2ce99dda214a60e70477eea7865318507014", "confirmedHash": "73ebb4ca1f9e7d83ae7f9530e460c9fb34e31e8a27a736822b00000000000000", "service": "00000000000000000000ffff52d3152c", "pubKeyOperator": "02775b810f03b9e1a1031abbd1e152ffecf8da7ff48e1fbb7664c219cfb1222ddefc6e2c5c89b45e03bc9e4ea6fcdb3d", "votingAddress": "2rNjYkgv7SeTUg41EperNjeDgBwR", "isValid": true},{"proRegTxHash": "4dde81622af5719c2eb68037d084aad4b03f4064501ce256e6873b3dc95fb8fc", "confirmedHash": "92b683438f3e5e5d94bbbdb09159ea8ac752d0ae4b5aaf641400000000000000", "service": "00000000000000000000ffff55d1f271", "pubKeyOperator": "11b999e112410e68f9450b732b12b99cf3e0bb60006128185addb5ba7b0ce98df2c7a0794ffe8ea23f8a4f34d45c5138", "votingAddress": "2vdCCxL1kp96coLaT9LCGnE6xqhS", "isValid": false},{"proRegTxHash": "5308f09b2ddd34c0345161233767486ba0e189cebcfefd1bb9d0071a1ef0844c", "confirmedHash": "080bcf451015f30edf0ff605b17a5a127b00b5f4492518240200000000000000", "service": "00000000000000000000ffff8ff483b3", "pubKeyOperator": "82b54467c7da75ad857d04a9ee6a7d1a9a1850dcc5138c53ce86fad4a3d4826d6f3be73f5033b21bd1f0929ec038bdb2", "votingAddress": "3ef5JxVx9gT5yJsuh4PVFT3F9ZNp", "isValid": true},{"proRegTxHash": "0264f24f74a9c0c50ab18eee57781308b8914e2b96d0c32cdbae012c275b1919", "confirmedHash": "79fd6c21d0ed942c0a2705aa4e62696fc5ed9a368842e4530b00000000000000", "service": "00000000000000000000ffff951ca189", "pubKeyOperator": "815dea8734d1b3c43122225a97b56f334306b3bce5c9b79dcce676756aebf01740c6b35fff18c6950ee8c72940cbf9d7", "votingAddress": "331ATrJG46BrtS8ax44LnomqDaTh", "isValid": true},{"proRegTxHash": "b6686aa2096ed07e478f72bc737784c61b8c8622147dc859a3080c7aa4cb2af4", "confirmedHash": "bd31f35c5cedbf07c6ffa716f2a3acf8f725ab42af8758740500000000000000", "service": "00000000000000000000ffffc0a90792", "pubKeyOperator": "082e86f00cece842aac187aadd48a7d4b87480e81221a39d900cce863b83f1eedd614171c77c068e45c53131cfc307bc", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "5a43d5c55623dfeb2de0eec0d33d166abec66913b06992281838398ca41c1d07", "confirmedHash": "143a074dedad38c879393a6d443834dc309f3a0ddb68bf570200000000000000", "service": "00000000000000000000ffff8b3b8fa9", "pubKeyOperator": "97c749ffcd49142ad760c4ca6309b27ad5b86421fcc14d8c5a63f3c08b789450dbd2d86106f64dd5e6e84c96f10914a7", "votingAddress": "24PXVEtzT1srNfPih1qTdRTNxJCe", "isValid": true},{"proRegTxHash": "c9b3c04efdd74fa8b885b086578df1827b99429b26342fcc0037e027bc34797e", "confirmedHash": "b32df72121037dc8110a8ccb4ea37af090e1b66f400486320400000000000000", "service": "00000000000000000000ffff4e8de2be", "pubKeyOperator": "81f759a8ec7fdc6a7e93a6f7bbcef5c541e41060477a353302d7ac5328ad88a32d79d98c9e3529b93ead302065065a69", "votingAddress": "aTZ2JTaS34WT4Usufyg5ZsZdPSy", "isValid": false},{"proRegTxHash": "9c1bc3dceb17447a44edcd2370fe4cf38aff637b5ef9eaeec90a50b91ca900b1", "confirmedHash": "245cd90a17cac504eeba8c0a12efc069c3e64bb42971ca2d2b00000000000000", "service": "00000000000000000000ffff68f889b7", "pubKeyOperator": "84c091f7f87b0b4e336582648ce4ccdba6ea496c566275fabe064fcc9ec632ad0d75b68ab34d19a359c25662dca37ba5", "votingAddress": "2mxrMaN5tnHFT9qnmraH7vHCyp3W", "isValid": true},{"proRegTxHash": "c0502e793ea3e986bd131f653cadc87efd07acda55c8581791f0d9c1b9f71c15", "confirmedHash": "ffc3cf168c86bb1665c3f654be647d58b81aee86f7d781000b00000000000000", "service": "00000000000000000000ffff2d4db1b2", "pubKeyOperator": "1054ea32cecb7bdd26e30bc44a55da95f7a0ef53a7bf4ce3d3247428323e01513ae2fdb3656cbd7e6605310e086dd1a7", "votingAddress": "RMkEdMZhWxS3zqrJByGqh6cG6xi", "isValid": true},{"proRegTxHash": "ee27eb5dfa519c35a3e8ba56486bcc01431c6672d1d7cbf95b2b2580b0d66705", "confirmedHash": "da3ec30fb143b4e085acf4a62b9aa49e713a86b5e2db89850700000000000000", "service": "00000000000000000000ffff5fd947c2", "pubKeyOperator": "03f58b9aed0e08ca3394587b9157de9cadddebfc6d85c71f5edef61522fde5dbe0711cc1023894c0ef7d0f382c398c2b", "votingAddress": "4S7n1LcwH6S2DUp4vmi1UbtrJYHR", "isValid": true},{"proRegTxHash": "e468a2ae9cb32c9a442d2a9c936bd391f037be672c82f693eaefa7a44d160694", "confirmedHash": "44fe152605da583fce90b922711d4fd92ab126201d72f3520800000000000000", "service": "00000000000000000000ffff55d1f114", "pubKeyOperator": "917d4210f07d8849807e4f8479e52c02d27cf251807a32fdd806892493dd6b7f6d08131f32632a1ff141ef605d09ed8a", "votingAddress": "j78mWghxjh4rhDmGYYyWvyQWYty", "isValid": true},{"proRegTxHash": "a514d78d67c4fa1fb4059c0f8659bb8c70e0936f43b93a94841e29bbe2b39928", "confirmedHash": "29b61e7734f41c62ce870ee61dc1aab6095d2dcaa4bef6991c00000000000000", "service": "00000000000000000000ffff2d4d2437", "pubKeyOperator": "1885de5b2ee852b68daad7cf289c7b7283a4895469317dc685704629cba1c9d0d4072db5f740d923198948c448306db9", "votingAddress": "3yFRAbjwh3G7KDhUzG28TaAZvio8", "isValid": true},{"proRegTxHash": "1679e10c43f185b4d1d558e6ca78bbb80e2902479edd67fa1809299395895d8a", "confirmedHash": "95f0a2365548e8274e68cda2429773162501058f9f11f84d0300000000000000", "service": "00000000000000000000ffff9ef7cf8b", "pubKeyOperator": "8e4e9a96f8e92d1c59004a9c41d2ab9fc1e4917e50c5d6a5316a3a016557d5f56687f4098ff3a095c0478bf6dc541df2", "votingAddress": "32csECZfbhH3dDqj2jpb4d75Xtb2", "isValid": true},{"proRegTxHash": "9603335ca5a6019b10ab44b1479cd5afc52876c3c43bd55ce45dbf2dc63c3793", "confirmedHash": "926bafd5d8b19230ed4284d06829edf1b46dee2530f001821700000000000000", "service": "00000000000000000000ffff5fd8e660", "pubKeyOperator": "091a31faf6a67349a0cb1590663d1f8c3fde7da93c97a4cef677b1da52262149dba20c2eabaefd5623188828c8c64c01", "votingAddress": "2AUe8mXapcceWgZNZd7bxQTYRTfP", "isValid": true},{"proRegTxHash": "668e7a474f13aae8b448c206408fba8c3eecbb8aacc5899401b2c81dc9c6f9f1", "confirmedHash": "c7ad62af8e01db5f4e139caaba77405518931cf0cf3a65c81400000000000000", "service": "00000000000000000000ffffa8775784", "pubKeyOperator": "8cf05f4253dbf94737a88ddf4e39cc0ba63e455722ae64a79c5149da743ac4d13c6aeafe4b336acf26d144effb34de9e", "votingAddress": "3R777PxhJifrCpKcRb4P366LvQNT", "isValid": true},{"proRegTxHash": "2e7e7bb6c8c8f4b656f9654d8f830c6dc4ee95debc381e08fc72116fe114bec5", "confirmedHash": "3001eec6eefc78b4157d5bb2d71a2b968a5ab664221972c60d00000000000000", "service": "00000000000000000000ffffa7474c2c", "pubKeyOperator": "0dd6d54d9c42ed7a31bff23134084b2356e2dca415a5440fde65a6389a72c8cf7ca71aae8bd1d07ae4feca207147608c", "votingAddress": "4SasRTi4tuhhuNKuyMg9tKquRtVZ", "isValid": true},{"proRegTxHash": "6c22084d4e644d3a22a200e056045147c09896b8da678199ea184ba59679235c", "confirmedHash": "e0af7137934c27ae3fc632d098ab854afdf1a844fb7db3941d00000000000000", "service": "00000000000000000000ffffa45cf940", "pubKeyOperator": "88738969075cb51b6cd31d5ca494f62f0cdeb5e2473a60b54101fc24a72b4f3fcce8f4edced23841ebb342187c8bab0c", "votingAddress": "2f769KL5NLx3eoWGhdxqo96g1j5e", "isValid": true},{"proRegTxHash": "7b2afe9503f3d95f57f1ac7357ac9f406b4e7bb7033ced6d25156e42a418380e", "confirmedHash": "413bb72ff2ff34c43a4e536675ab3e68437683daaa94fbf20300000000000000", "service": "00000000000000000000ffffb23ec899", "pubKeyOperator": "8e4a291d349abea0736de2af4c047c40d8569b7a9bc2ec2917c87ca73bbab2a213bca86059ddf40e99bc1f8a3f230e28", "votingAddress": "2vDNtLtCiGJHLtkVqukHL6q3GiYv", "isValid": true},{"proRegTxHash": "d5cf112f3413ad170cc6e1abdaf3bafd86915b78e39677fe249c313bec70d78d", "confirmedHash": "b79d573ef18953289c178ba33bdd7409378296e6061c83dc1200000000000000", "service": "00000000000000000000ffff9de62404", "pubKeyOperator": "1720d92f31c9001ceaaa7132d7a7a1031cfd4b38bacba9b2a448f214104d5433ebe317a30658738fe774a14d4b62299c", "votingAddress": "4BbfSqYdnUpPz52oL5yJpwJ5HRnk", "isValid": true},{"proRegTxHash": "25f62b576562ecf7db44f0a623403816af6147c59d7c3f658ac91866e79961bb", "confirmedHash": "6e010d9401d844ca55e42021a5a39b59cfe67c1eb19897610a00000000000000", "service": "00000000000000000000ffff6ba1185a", "pubKeyOperator": "05bb77da867f173038ba6718e1a0bfe7ca728fa54c529f99a442c31c6db6e6872ac49589a558fc6a3ea1c13f3fa46a3e", "votingAddress": "2gxopJHzXcGVvndwv4LUuisF4yMr", "isValid": true},{"proRegTxHash": "7a7c9b55f1a4d90e4257119b18ed41363573f35e016d1ab767fdebec4776b09d", "confirmedHash": "ed45409b57075051199357ef15848bd098aaf6aecabb68d90d00000000000000", "service": "00000000000000000000ffff5fb3fd14", "pubKeyOperator": "90b0d61808377eac02d62986d8a384729d23ea23afb9b241875bc7aaa7119668d459c559726b902f057dd65ba685c42d", "votingAddress": "2t8BpAccTzFqhhekBPW8S4TnxQRT", "isValid": true},{"proRegTxHash": "b2b6957b22b944a6405ca379a7ce57f8a3d9fe3313f4c18035ae9a1aaf927e2b", "confirmedHash": "02a38ab90921168e4a5c30dc96e3825d79bdbe47ae11db310200000000000000", "service": "00000000000000000000ffffa8775300", "pubKeyOperator": "8a2b36d444c587683d833a555faf2395b42b71ea93798ee01608b4d054b8d27d9ba20f642678d2ada8167e507ffaa01d", "votingAddress": "2CoAtPoMCo2BpY9CpVm9JGR7RprH", "isValid": true},{"proRegTxHash": "da44aa378313c7e55339e23a40d470f08a0a20ed136a2f2f772fd802114c0741", "confirmedHash": "926c92598103e4f12bfa8fd8fe95737dc4e6303d12a67ce61300000000000000", "service": "00000000000000000000ffffb951a592", "pubKeyOperator": "15becf08436079ba7c612a8dc96eefda1e306078b317784af0ed282f288bccdfe5e4f822a555cc97332869c7b0adadf8", "votingAddress": "r2f4qbaZViqkenWvoZtqdYsc6Qs", "isValid": true},{"proRegTxHash": "017ad1fb9a73c636b960ff2fbb6779d6924d2c03f24dbe39f6b227042bc9750f", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688b1dd", "pubKeyOperator": "192924d5b2f401ac83fd527e7a36d3833bdc4116f67b71fba860ce32675863d67525199d36003ea2e17bbc3d668efc24", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "1b3745fe41f0d8c7b0ac350a6ff79c09a8e88e9f2673ad719a429cd1cd23160d", "confirmedHash": "c3f26b080798292b644b1b85a1872d11778465c267367eaf6100000000000000", "service": "00000000000000000000ffff23991586", "pubKeyOperator": "161924eedd5b03210f09243c5d86a3fc613c20cfec0894b47fe5536e1f7dd9bf7d622bbf2609c10ccc8ae95b5f342ce0", "votingAddress": "b9G2pkZtB3oBn9aVMJ4CMfrLbge", "isValid": true},{"proRegTxHash": "a3382ae262475aef60317ad2560e85d227f271d829b9d6f7105aead1536fd92d", "confirmedHash": "a194348e192780b6d5e1850bcd400deb64d997489784c4e73100000000000000", "service": "00000000000000000000ffffb90534b2", "pubKeyOperator": "81f959819c777c71f7eb860a5bca5d8198e4f604466b9a54be094efb5788f7820a33de1361edbec2a05e2ab6058a14af", "votingAddress": "2BqXewFgWzewoFqZUspdPSPCmWDk", "isValid": true},{"proRegTxHash": "56aa079cd596f4cd69d9bc5dd0f7d8cb948dcc1f60c9f02030651740f6ba73df", "confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", "service": "00000000000000000000ffff74cbe43a", "pubKeyOperator": "829f0431b39ee129f44b59e13c3a8bf323275c6e5b9db252d5ebaf933c375558b9c5a6f2e8edcc04d64892329ff9b584", "votingAddress": "3mLDWiTL7wBSmvZRHBM2XUHKM3jq", "isValid": false},{"proRegTxHash": "da194f2f7f18a8405179ad4186ad3063ff35981cdc7d2f8aac13f060458eee66", "confirmedHash": "0d335e73f914f0e1af976387b6538a562e5344700f1c86751100000000000000", "service": "00000000000000000000ffff52d3193f", "pubKeyOperator": "835340ee087f26f79447f3a7fe297279ef8df88c43cfd659088ae6a1c7bfa9f5788947ad8c2e0cc3ca4a59e5d1b19609", "votingAddress": "3TZimgiB499KZwN5F1C16c9xKnjm", "isValid": true},{"proRegTxHash": "1a48fa44100405ac62ae93b9fb5ebff3b3192e0773e78f0c0f829d42846bc3a5", "confirmedHash": "dd4e4c655d4cd47fcf67002a8a021624bc01e9244c5422372c00000000000000", "service": "00000000000000000000ffffb90534ef", "pubKeyOperator": "038558dbedd58a7d9278e5ae9b89786aad10d1f6b6cbcdad906d22b9be59cc7e757d34a5279b4606b222d49993a5e1f5", "votingAddress": "4FPbNoNvfEdDoz31at6aGuoNi6q8", "isValid": true},{"proRegTxHash": "17a9a660a5ad85deea796b80b80df6664e23bde296384fd7164d76f5c1df596d", "confirmedHash": "402c0548a87320f6b26851267192c8c17a1ac03ee95939b10e00000000000000", "service": "00000000000000000000ffff52d31951", "pubKeyOperator": "85fd317689c64e445d19d4382b4726e36b113459afe198aaf4d88aeeb5b4c6b255300364f127a3fdb90bb93b6d79393d", "votingAddress": "oEvvwpahqvhtAp7UwEnQiwsEjac", "isValid": true},{"proRegTxHash": "2a7289b2b5e9bd3d0a2cc72274c3773afb2e72d2a0be3c1e178a441f94e7187b", "confirmedHash": "5ed4f5fc30e936bcc9c149e0495d75962417f1653c1a2ce71f00000000000000", "service": "00000000000000000000ffff52d31912", "pubKeyOperator": "82ce1d6a7f58a0f82af51ce99209555d7b43c3328036deb0c01f645dd4c2e4631135900937b8b18c3ebf5192fe215616", "votingAddress": "UHwEkePhizGrDxmXev2VknFLAz4", "isValid": true},{"proRegTxHash": "d58eb713711077c1ddb26a708186f5b96551c8c6fe6349d766c7070ce59faa9f", "confirmedHash": "6c06c7238a59b02cfffa6df275bb263cc492b8a7576c5aba3600000000000000", "service": "00000000000000000000ffffc0912e3d", "pubKeyOperator": "9838f7da1e48fbc21268fb59409aff497ca73f8266eace69db5c1eff5cd02aa49b2a2b048231a7c1893669b0e19240b3", "votingAddress": "iXBgnxmXJUz1QYRrDEUVP3xRgsd", "isValid": true},{"proRegTxHash": "e588e0e54fe8d5aee45cb010b768136fb400043a92531a11c1b71b0413ec402b", "confirmedHash": "75186cb23c27d1b5ee4e62d18a3385e5306a5395d9f053e40500000000000000", "service": "00000000000000000000ffffc3b5f342", "pubKeyOperator": "9555f97d16e75a135d98ec2f52a8881a60c790673cad6d9f0ef0e52bca3b0607aaa19cfec7ef4512e85b7fc687d0f3e6", "votingAddress": "3ZaLnbRBwq15kmeVDNGr1qCVRh6S", "isValid": true},{"proRegTxHash": "a2ae7acf155d071aa2480965b1ba3919c45f681d23f13089e5307f7fa78791ee", "confirmedHash": "1b696035e379c7ad09afb19f8503c5b67da8d1cb14a0b1790300000000000000", "service": "00000000000000000000ffffa8eb68be", "pubKeyOperator": "9546e20a10f07e3db40f0e56bee117dc7c363c1a8cab6299b7324bd2e2796f756b003909f8150d3624457faf3e78b09b", "votingAddress": "euWqN8LsSwyPg9Vd8nU5byd9XeL", "isValid": true},{"proRegTxHash": "e2ebff3219f5a1c8a2fc1cb2b7284be4c85074d340ddc7833f318d3c54f82ade", "confirmedHash": "2a31ab28a5623f3c71cbfd29b3467b8f2d9636d1efb59e1a2c00000000000000", "service": "00000000000000000000ffff52d31945", "pubKeyOperator": "98677ae518a1045cfaccde7e436f5adc3dd739729a91efad0173bed69b4225cac42d2a92af63b8b252e8fa94ccd12e49", "votingAddress": "3So2kR9L2KDjkqmxsUaKETENPhZc", "isValid": true},{"proRegTxHash": "672a6ecdfa5e37bb60677821daeb64edb083549d3c9d430b9accd624ac2eddaa", "confirmedHash": "b69708cd9b610e3eab02c123c599999241f850c7f667fc8a0500000000000000", "service": "00000000000000000000ffff9f597336", "pubKeyOperator": "88995ec4d65e3ce501d80d992a9bf9b6c6578811d14a2af776bdcee17fbed7a6495f9de40f29ab5b4f40c841bef45cf2", "votingAddress": "3wmujvZpHkA841pZ2Vg3DMBABpAR", "isValid": true},{"proRegTxHash": "3aa91ab296db1f04c008082fa5dd252d5673ebb91169ee0579af350852f25b11", "confirmedHash": "ae49e9a106372f47703242398810be425290c6d627814a5c2200000000000000", "service": "00000000000000000000ffff3449acda", "pubKeyOperator": "97c5e67ed061038f9fbcb94035b4b868f682dc8e54703317e29cd310cc0cfbee500909d66dffe8fb1ee7af15774453e6", "votingAddress": "4PA724wiPRyYVQWHXuEeZT6UfQVq", "isValid": true},{"proRegTxHash": "b38976764263c7362a95b2cbe88b208c67ef00d442875156d6ec4cfef4c504da", "confirmedHash": "d6dc30dac321759a5181348dd82024ea7601e85bf407a1051300000000000000", "service": "00000000000000000000ffff17582a8f", "pubKeyOperator": "08bc72845f6103eabdbd87701ad7d80b495fd1a8c64b1dab8ecf40fbee46882df1b84bbb2f4e875da25c78bb1d6d25b4", "votingAddress": "GXTJv3VoJX5BKHsEQrZvXUppVQc", "isValid": true},{"proRegTxHash": "0dc2eff7fec7c4a9dc3efe6883b2b2396bfcf239be0884dfba4567da5f14ade7", "confirmedHash": "c4c8e7b830297e839c2d3cf83eb3e4a67b6b5db15e0058910f00000000000000", "service": "00000000000000000000ffffb23eee50", "pubKeyOperator": "07fa1f8cf2fcc7e688706003fe0287efcd3ff0806243ee9858974f8872985a041ac23117d345aac747c58e89a4aca219", "votingAddress": "2kZyB6LY2aMxBV2EM2WJErh3vcdq", "isValid": true},{"proRegTxHash": "4535fd8d7dd94c0266b8a9452b64e8da7ff0dad61143e44b49a879d796a7010e", "confirmedHash": "bab458b2fa385a93d9aeca67fe88e8e1d5bba10f10119cac0500000000000000", "service": "00000000000000000000ffffc034a6d5", "pubKeyOperator": "0b65238ab1bae0999a1e202bc8e0cbdb994f9d20e61bc9bd8b17afc3157142727f486510c745ce66bbd96d3b70e078c8", "votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", "isValid": true},{"proRegTxHash": "c190f656e812cdd966834f80d2fa784e459f87fff734ba70e4817d15ea2e3b91", "confirmedHash": "ece2c76c0b711c449c467ad5c9756e7df826b32d20ec69401800000000000000", "service": "00000000000000000000ffffc0a90619", "pubKeyOperator": "91100fd8165bfdbf92a165cccd86eb449af2d63a27db1e396f97a2ca674101ab6273d2e7ca789a53bc75a47eb56e2fae", "votingAddress": "25AeKPhJNg77CPKqAKKfqpDLcpX8", "isValid": true},{"proRegTxHash": "a23be5997975271540770ed6948e6809b4da132b765906727fc097d7e7de520a", "confirmedHash": "e723a8ec69d76b21ed258ebad5c3d5e31273d5fa64ca80220f00000000000000", "service": "00000000000000000000ffffbc28af46", "pubKeyOperator": "06a0942a00ae691ea0e54dabf1819c4238e8e0ae3b2d4cad3dc8dd2e498308b909d498027df24df9cf0c52be34417c08", "votingAddress": "4K2M14v1D5m5XWVf2MfikYg4noHw", "isValid": true},{"proRegTxHash": "3d28071c09a747da16b6972618879969ceec410a2400805b9b5368db364e867e", "confirmedHash": "c5302037d91a1117d2b07ab66223a60eff868d3fb54c61a61600000000000000", "service": "00000000000000000000ffffc2875bc7", "pubKeyOperator": "88a5e1926ec1998c3d408bf1db126f5a6b649f434870a20b50e4e7a19451ac7819477e0295affd95eafa813c9d244c0c", "votingAddress": "298KhjGPjsS5aXvnfS8C5daHXTy2", "isValid": true},{"proRegTxHash": "24f1a03ccf8b432eb3fb0cd824b58da8da32efcbf5554c27144734e40bf0f911", "confirmedHash": "d14c70c70106d87958e6a301bce622f792c0abf3688d97cd1300000000000000", "service": "00000000000000000000ffffc11d3942", "pubKeyOperator": "0c80c198d0d1cb628f08af4f229bd9846ff351159a911ce37ee145db6372c8975ca4d34577d549a2e8019599107f784b", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "4dc354cbb0e04b8125f04a6bf5f962f84dd7f38442a596ee194a7f1ac14a023a", "confirmedHash": "cbc712dc7ecdad25256befc942adf6a4627f8ec38ca820fa2000000000000000", "service": "00000000000000000000ffffadfecc50", "pubKeyOperator": "0aea6eeac706d844af01bc879ce720368c0731bc419e120fc8fa70b5442a4f892c107eb15d5085924cd464741da34da3", "votingAddress": "bghuAi21S7ys4jVRAk6MkM6Xiim", "isValid": true},{"proRegTxHash": "5c7da63dac43228a4bed4ce16878f8fa17eca6d105198934e661321f06cf28ce", "confirmedHash": "e5a9e5c645a067ea29c0c6c411c40c565be8659f1631864f0f00000000000000", "service": "00000000000000000000ffffbc28fbc2", "pubKeyOperator": "01850725a2f231030ceece4b5833d7474e294743dc8410ff4349bafd49f7dd0e1d03c0ed2bd0c838f8b076f4627de659", "votingAddress": "424xpoEPpdAjxQWQqNdhohoCeuJz", "isValid": true},{"proRegTxHash": "0f3ad247e0af2debcbe46cb87fda8441f65ac663a7471c5db66f1ce8c39849a6", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b099", "pubKeyOperator": "0edc94cc79be298b47bcaccb4632e890f84b5aa8773f1f90c454943a8b1feb6b312f369bc519a202bc8579fbc6c93705", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "de3f549ca6819667dc65afe4a97de6d8427d5dcb3712ec63f2056a97a4a90215", "confirmedHash": "9a07a7fbfc11094f0c7737a370ba453bc2e27d697b1bb8240f00000000000000", "service": "00000000000000000000ffff05b5ca2c", "pubKeyOperator": "8b384d3574f88e11fad868e76001e73bc752cf387984228cd111c2883e6f6f5405f81c426c9585318858793fe7c628cd", "votingAddress": "3pr8q1Z73iEWGHqby53Rqzu4X3A7", "isValid": true},{"proRegTxHash": "367657bff2d5959a70792d0ec15a94c0a570a809233f30399cf37c58c79351f5", "confirmedHash": "cf149558a3ced2b29424b51c9fd5c8fc3506e96f0df7c3161900000000000000", "service": "00000000000000000000ffff55d1f1ca", "pubKeyOperator": "0933c9280553bdf898189d3dec95419262433defd4bef9e90611ffc05376e582fe41f57d4b0547852928da79171e29fa", "votingAddress": "4Z8dHmu5S2y97gpWcjungfhC7aa9", "isValid": true},{"proRegTxHash": "e70c35ab8ebcc6a7a8e2f1a77ddd5e3dbaa49deb2e3882d3f2b36c758c211770", "confirmedHash": "86fe97c6d499991d67591bb54a1f3f777b70d06646d6373b1200000000000000", "service": "00000000000000000000ffff98e4ad1d", "pubKeyOperator": "1314ae82003c9e3b94f7b60c94befb7444d1fd9b2a52865d8fef14b5fad27440904d3f9f281240b0d2fdd979353f07d1", "votingAddress": "CeyGBU3FMMkdyxDegQvgzrRDQPL", "isValid": true},{"proRegTxHash": "7f471107ce6e1a1b6ba7b0dcb151663beb3c5b8b28966f2b05d3a95f042813fc", "confirmedHash": "9fc048af1f552101fbf2666384c0294b252a1ceda05c4d9c1300000000000000", "service": "00000000000000000000ffff453d6be3", "pubKeyOperator": "0ca6c70e9ba66c9f4c88b624bf8ef23813c74dc2f2a18c8614ad1f06dc8ef02b6895e0e98e6415b6c05d23b1ca8c3314", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "7aa4842576d2bf0b2acacd8b092a16cdecf05c125e3813987b9896754ff75f67", "confirmedHash": "14a05c9c74a5bffb74aa82c7283782dcc911b783aeca46e11200000000000000", "service": "00000000000000000000ffffcfb4e446", "pubKeyOperator": "1580d7e67846c41eb2f7d72a75719860f49eedafc4bfcc8dab9dafff0041cfdcb54e148dad5c2bae3ef46688d833b4ad", "votingAddress": "2FzbFSVf2iR92iL7PLHAAGDJjMFA", "isValid": true},{"proRegTxHash": "6eaba25f5e2b1d457cdfe1167c1ffb74c8a5ab1dc2a94f2f5745f088333c36c1", "confirmedHash": "fbace435f615e28fa2e7023ec5da17a54f0dcd8628153ff11600000000000000", "service": "00000000000000000000ffff5fd8e669", "pubKeyOperator": "0bf423beb454c45613716f55e0af97969245690b62e9ea3bbaa329a7eac5be646606a33ed23d0a5912cc9ec2fef660d2", "votingAddress": "39HLxK58C42nVxds19ZVj6ZkoiHH", "isValid": true},{"proRegTxHash": "be91f72a321da95e279c16458d928c1481f8701672cd042fd4baa3c3055fd9e2", "confirmedHash": "56292ac742513bbfbde7009a639f88f6655e48d1c9d59de90600000000000000", "service": "00000000000000000000ffff2f6ec7fe", "pubKeyOperator": "0647626af51f2b18060f0fee441e00d28d4a5a34b0546376bc0cdcc07dcb18df943a64d5ed478649cbebbfbd04c39d17", "votingAddress": "avPFVJStcV4Ksim8pe45sooUrc3", "isValid": false},{"proRegTxHash": "2dd22d96fea46122daf717f1eccee2aa40b14ac186ffb4865a3a08e7bc7336f4", "confirmedHash": "84d57f4d9fbc794141541306f975f29008679baaa6fa6b0e1500000000000000", "service": "00000000000000000000ffff87b50844", "pubKeyOperator": "03cd4b1bd8590c86cf187759c3a7368d0cde6defe95bb4b373e2479275337e67d3f95dbed9546cc137faaab86f2b90c5", "votingAddress": "4SjXnu33BjRLNyFa9bidXk23FXqP", "isValid": true},{"proRegTxHash": "4d8586133956419e3acd497ffc34aeff246cd277db004594f28a79474bde36f0", "confirmedHash": "3432138ffe620e535149d2f8e56738a7979f40f2aff8e5081a00000000000000", "service": "00000000000000000000ffff6880e248", "pubKeyOperator": "0911947ac6412374c3822b0261c89dd591aa6af13e147639c2bc25578ed03c544e44eae9df0eb5ee1f274033a97088bb", "votingAddress": "awVtS5SB2r4Jjy61ocwre972WAz", "isValid": false},{"proRegTxHash": "73725bb32df2d60d79555431849aae53986c79da721eb6f3d1ab114e7fa15e9b", "confirmedHash": "bb0b09b67dbebed5edd0f20545de767da3db476c66a4570d2300000000000000", "service": "00000000000000000000ffff88f37382", "pubKeyOperator": "944be5269df80a87677dd9c7f6202c58d7b8eeeff712b2581b96956e823f02b7095a0fa27d12f8e10a426fa666abe7d2", "votingAddress": "43omyYknJ1wmLwKZzisggpKZM4o1", "isValid": true},{"proRegTxHash": "3505c95b135692adacf3fe3f9ad499d65a49134d93f7eb9f99a2aa310d30dff6", "confirmedHash": "9172f32573ddd9047abc03a58ab8e2b15b2a953edd2091f50a00000000000000", "service": "00000000000000000000ffffcebd33e1", "pubKeyOperator": "086b74a35a60a05d0f35f19646b400db2562fde70a9b294cf25ec6650d764bec35ca9c3deb6608b89c2f4c2e189bf8ed", "votingAddress": "3XGH1MgkyNPueWrnjMSLVSB6Vd8u", "isValid": true},{"proRegTxHash": "7f03bdb894f7041bf0d63f3a52a680f39c7ba9bb3fd3844debcf19104886d7d3", "confirmedHash": "7dd29cfea495586063cf4e1b16ac509620a2055cf3ce62193700000000000000", "service": "00000000000000000000ffffb9f3722b", "pubKeyOperator": "83f644db7244d5caf82c381dbdbeb968646dc1b36d24155c7b53591e4dd53a1cdbca5c9f890f54687e95ca289317d2cb", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "7fbc26bad8e6b6791ab0658eef7095dc8161ab162d81842361c4184b8b575303", "confirmedHash": "328bd6ae22ed6bac02813a18a44295322acec6da263c5b550700000000000000", "service": "00000000000000000000ffff5fd9755d", "pubKeyOperator": "96dd8dbdf035b6dce254f4bea8351978b458ce95f31ebf9d91adfc4c476e54107b24bf3f00d116fbe13ac2e8031dfa8a", "votingAddress": "3PHh9xWfKtBAj8yzXcgUfnE39jru", "isValid": false},{"proRegTxHash": "24ae87c489187ef609edcb1fed6ac314475fe87c8124626d1dab5a7414309142", "confirmedHash": "bfc39b398fa6d22bbec34a3194f7827dd943d72a0a865cc70200000000000000", "service": "00000000000000000000ffffbc28be29", "pubKeyOperator": "85b387f463a57ed1058fab53767ee2fdc48b72a09b5626ca62eeb00394b3e9a7401b7d3ea4d6190b67d923fda58c0a46", "votingAddress": "Ay7rxsLD1mSNiHLEVytiwGTFRm4", "isValid": true},{"proRegTxHash": "b56d5e775903d17967d1156fe99b515b12c5f67795e374995a391221cb3ca604", "confirmedHash": "97a83aecc1a51786d3cf8e6a0a00121ef9ca46d041c9c3df0e00000000000000", "service": "00000000000000000000ffff52d315c4", "pubKeyOperator": "945f6ded4626c20a8afd236ee0f205c3b88f4547f10579b13e22bbf691871327807a1871e450e5188672b98d4f06b24f", "votingAddress": "YWnq5oPjf6xejtRPL7vF7FZRRFm", "isValid": true},{"proRegTxHash": "b39350cef69484f8ec2308ee86502687a3b383d63ea8e554a4863abdb9ed395d", "confirmedHash": "58e240a154a0ac48dfd26143fb8ac7413aa11d8f10f16e622700000000000000", "service": "00000000000000000000ffff5fd97d60", "pubKeyOperator": "069ed54549336e189918cc87f3c0de838953414926ebe87899c5d88dd9786d4c7745ca80cdbea51f294ead89e383b570", "votingAddress": "9NqdQKWFVuJdWXANjMxzmWYB1Bd", "isValid": true},{"proRegTxHash": "a1394246acd89d4ae94697f122c506304457070fee1a63c67e0a7f86b6e1f81e", "confirmedHash": "5d7447f976f163823995c83e58677d59462d41e4644374951600000000000000", "service": "00000000000000000000ffffd8bd975e", "pubKeyOperator": "090bc093f584554e5a834d228c540d781d82de9fb0bacd296dbfc213d6e84feebdf69ac73e2a5bdbc85d90a38a517c4c", "votingAddress": "3xEZdx7YQZwu2KhyixBi4yyMg43R", "isValid": false},{"proRegTxHash": "a01c6698e8e0239ac68ee5bf226f2b63f37f1999fcb2a3bb2c952f3caa9b0037", "confirmedHash": "9820c8acc77100ceaab045c8792dc7d09d4ab761dffba0ff1600000000000000", "service": "00000000000000000000ffff59280d2c", "pubKeyOperator": "08687fb3c929f51ad3588903f73132ea0ead57bcee0cafc69f742a46513b6ad0f708233b7ee2aa943059696c4696faef", "votingAddress": "3dw8Nu8tFLLZenoXPCQprFGgXDuh", "isValid": false},{"proRegTxHash": "4f16426e0a19f073bfc380c873a16628a4f47a7d6fae3b470c08e53e3ea135b8", "confirmedHash": "672d3ecec79ab6b63f0f8483555ca51b6a834e050f3b6b6e3400000000000000", "service": "00000000000000000000ffffa763dd64", "pubKeyOperator": "86cc8e4ab543de3ab9dc1bed4a4491d9440ab73b1680c4dca3c663a66eb13462c076abd1a0f2ed4a5caa6b1fd1649774", "votingAddress": "2tN6YbgLhK3ycf1EEnCLZsFcigme", "isValid": false},{"proRegTxHash": "9648e3b19b42bf7c7fbcfc7762b21f0247c4e68e090c3071c3ee7df7cd5b745d", "confirmedHash": "afc7b0848d52b0ced781f5d98bed4cfa0ec6821071d1f22c1200000000000000", "service": "00000000000000000000ffff5fd8e663", "pubKeyOperator": "86f503c2c5bd3e2226235667301ecb412929de80aecb5bae12c1d5c4f6aad3f7e70b7100b881e88e2bc1a855f53039b7", "votingAddress": "4YxFCiW2TyvizVyfajEo5DmuKFqC", "isValid": true},{"proRegTxHash": "40754b06326ed3f6b8da2f93630a73caf694f0ed7b1666e2b8e654ac9420a2cc", "confirmedHash": "501782a4d1453cbaa105a0d2fc9eff96ccd4d80501978e191400000000000000", "service": "00000000000000000000ffffbc28b6db", "pubKeyOperator": "91ee47fda887127e97c87cc788eb75ad593e22eee29c6ed36d271c2d5eec849fdd86d960132fd4f4ed83775e9eb29503", "votingAddress": "225WkjrsKfsHtaBdJ7P2iubXhoTX", "isValid": true},{"proRegTxHash": "528a3c0bd851257b4e396b3c637a79e4eb707e7f2cab2c772a35d18afc88b611", "confirmedHash": "3c7d553d0d5d8b122b2704124f08b8ba7e9241022b90db400000000000000000", "service": "00000000000000000000ffff8b3b57d9", "pubKeyOperator": "8cad8af1d4ea64ccf2528c2f629688d24017b214ca04b02b218076e6441b1e42a08e80c44e1489bad951dc8c38180600", "votingAddress": "2ESuUxyXGwK2uizTV3u4TgAkTa27", "isValid": false},{"proRegTxHash": "d556770fa35979984c74fed6209870656af9cc71a94335ddc572cb87615aebab", "confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", "service": "00000000000000000000ffff58c66e99", "pubKeyOperator": "1095f7c7962a925ed870e04c1f60fdb43f3ea733ac5d802fa9dda54a0ab2a69bdd209efe6b74e5769556e4b3eaa025ab", "votingAddress": "36kjdivYNdnwp2RD7BXyREMoSLQW", "isValid": false},{"proRegTxHash": "a02621c243c6dde1c28e407a1de3c412d8c0d1a6968eccfe949cb5ad0d760d21", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b079", "pubKeyOperator": "9710294871d99ad4d6ed0c7bf4a43a43054413e4ab0bd5873291352895ffc5fb6a5ce877f274c1b878a4068dcaeae66d", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "a5b8877c8219f06b8cce63760b33aaed5a949c2fbe773f2a24308447e39f121e", "confirmedHash": "30303601a4851f2e359ef0639b081706cfa2c652d72cdad30b00000000000000", "service": "00000000000000000000ffffbc28a310", "pubKeyOperator": "854d74a6ad83619af4a82f9ad811ae7af16e0920dd0b9ef278df3d448dd39a79e93fc7f1b75557c68fd8953a884b183a", "votingAddress": "41jWW6LW9uJLRvaBa7PhBZB9KE3b", "isValid": true},{"proRegTxHash": "06bb4693f923609dd9df7bfadc454eceb69568a9d6647cdc7d883b45f7c68413", "confirmedHash": "cff614cfd3d5ca6fafcc5ae87c36901a91c45d208bd76b9b0600000000000000", "service": "00000000000000000000ffff8bb4b97f", "pubKeyOperator": "815694faf9b834bab2f7627cadc845095af8c0319bcf5af5e0cf952734f775da4b619c3a008549ed45171a55a6f40e2e", "votingAddress": "46wfjCas5CyEJWNM78njQU5LActu", "isValid": true},{"proRegTxHash": "4cf5e230cf857d397062c6f466a3f55072cdae64e77ce0f49399d5d8d5c8aae7", "confirmedHash": "fb70df4b4d4f4deef3e3489ffdb1135e7037623b39be17c20e00000000000000", "service": "00000000000000000000ffff88f37384", "pubKeyOperator": "9709c20d9803cff128468642c84d6462ad70382ffb583f9df8da41e0b6f755f610d69117de23c00466b47988013a66a0", "votingAddress": "3KYLoZ13aDzT4yZqxre7qYB4pYea", "isValid": true},{"proRegTxHash": "6e8fe40dcb1c14d310988d8c3e4a44c81c61aa1948c999df6cd0d73560360793", "confirmedHash": "cbff416d9f9c0cb427e041d3a2444fb6a2b63ad51ebec17a4400000000000000", "service": "00000000000000000000ffffa87757d0", "pubKeyOperator": "95fd5eecc6cfa13c38947e8b7058974f3c2f02b416ff8162d204db3a404e12c30f5b50a9e5a236f18420c67964295365", "votingAddress": "zrht8PL2NZXt3MbCUarnFQBeSNp", "isValid": true},{"proRegTxHash": "d4c8fa8093595fe27c45dec5b7c95aeab20442d4061a9612f124c65618a44f36", "confirmedHash": "0ca69b4db63a96e139ec9381ac930152b74b21a3f7e0f11a1500000000000000", "service": "00000000000000000000ffff52d319b4", "pubKeyOperator": "0f136f1f6c0b95d4a84b18559e486ad766f3dda272b88cb896eea64688ccdf4c80a920d8fd3ec9705734f238a8240e9e", "votingAddress": "2vYRrsuVkPUbc2CKhEVU35WSDpey", "isValid": true},{"proRegTxHash": "98d0b285a6b825800e5f644f2bf88a4039707674a9ecd445052858cfb5706985", "confirmedHash": "e82f064de1984c7d8212e63ba8f5e6f5414a1607f371ceb91f00000000000000", "service": "00000000000000000000ffff22c1da21", "pubKeyOperator": "913e80cf4caf776787c0e5c12f171dbddcc8cb8c501f472b205ee096e47a9434a1d5e832fae02f8d0249fc8ee40e488c", "votingAddress": "2mHvoP4cTA5y7eg6hdZqbTQ68sZU", "isValid": true},{"proRegTxHash": "caf779c8b9b2430c7b308a2ab673dc0fc0dfa2ae01895e8902a409bff7419101", "confirmedHash": "051b53482c37c7a2c952b7643015e51f96dd4df42d4afcb50600000000000000", "service": "00000000000000000000ffff58c66c90", "pubKeyOperator": "05468cc956e87b1e0aa6cbb6d4babc81310fceb3515016b904d2b77da02466e1ced9a8c828a6898431a8390e61747cae", "votingAddress": "45atPpSmHyPHDonnkZ5D3syChRD5", "isValid": true},{"proRegTxHash": "620010d0651ed57b093e7bead37e766781c2bcb7c3cea73d402bf390e8e3fc9e", "confirmedHash": "9fd8650f3baa8ef3938d7a45a2ce5b96b5fe3baf5ac357870a00000000000000", "service": "00000000000000000000ffffb951a62b", "pubKeyOperator": "8a3b05ca38e56c18b924284d7ab86be01cc4f5231f660236eb4e767a5397ca838c9f843199dfb8b262e6ebc61ba82f45", "votingAddress": "2pkRgK8VCpVCjVeGdXLvHyAcExh6", "isValid": false},{"proRegTxHash": "0e486d51959ea4c77818e5305b4b1cc5eb140e25a5115b902fb248b01c8bcd40", "confirmedHash": "0e477eb1f69d7e5b1556ce5a7dfb6f7b99574c931b7b7f6e0b00000000000000", "service": "00000000000000000000ffff52d3195b", "pubKeyOperator": "99e9a924c7c67cbb77945393fed3193d7bfd18d410394c6dd8f02a2e1e2a8b3dfbb6a33005d4da2a94cb370b1ffa9f12", "votingAddress": "33xWbFzLzYycqqy6ru1Duegss8gp", "isValid": true},{"proRegTxHash": "6565c9114263a114ad734928b67844e7b85a0076c9a8fae406fef3db30214f84", "confirmedHash": "497ecf3f4bd3753cc67078abd07fc598463a1189bc521e460300000000000000", "service": "00000000000000000000ffffcebd1c6d", "pubKeyOperator": "99197e05673f1d21dbb09c5db0fbd44988a7c567beb8350f6461d3c3027368a00a2cefcc74005f37d4fb8e0ab7284a30", "votingAddress": "2JSqELwVue7SEW5psfTGfyHtYMLW", "isValid": true},{"proRegTxHash": "bc3d20652d107280c208110c3fec666408564b93d4acadf4c1bbbe3f05fea167", "confirmedHash": "06a5292f0675f5eed2a40febb915f7231408e222e217b5680200000000000000", "service": "00000000000000000000ffffb93e97aa", "pubKeyOperator": "88932860b18e2d699a695b34b96dc4c43f7d48e4dcebf3ccddc3f4967f01ce74610f50260287f3c0489aa813a4037bfa", "votingAddress": "sXVM43ZXymV3oeTkWtNE4oTdJ56", "isValid": true},{"proRegTxHash": "fe4a37e47d83ad23207eb875f20156339650c13b5f3eef92ef0fdd918bfc4f4a", "confirmedHash": "7ec7e05832166cad716ebd64052499af0637acac695e1e761100000000000000", "service": "00000000000000000000ffff2d557529", "pubKeyOperator": "9035651106f8fe73fc65208d801ac0d86467fd6eaff3ae619e6abf0a6940d21d04edac051fd849303becb16eae100def", "votingAddress": "3yokC3SuLvVSsFYuXY4i66GVpS9V", "isValid": true},{"proRegTxHash": "23a17ea5690f60083e6b7766e06cf2ad0347df0519b5d80dc19594ec91629b70", "confirmedHash": "4a80e998a85a33b2251bbe69b753de482fd033dddfadd57d0900000000000000", "service": "00000000000000000000ffff2e653c0d", "pubKeyOperator": "9542513908972b9c0c9b51243982af52d502604dae52eb08a5bc67f8dd94d0795479598a88299384726d01347ad6b3c1", "votingAddress": "NgvhWgsvSbkggKBeKAUe7cFmk7M", "isValid": true},{"proRegTxHash": "e7fc694f00dfadcf6a75c991a176cfabe31066e7ff97639339d09b2cffa9aab3", "confirmedHash": "a1a1c5b91d27b9820f46f9dee023496d0b38c7eea64f251d0000000000000000", "service": "00000000000000000000ffffcebd27bd", "pubKeyOperator": "0621b9d52fa46a12958e07b7030002a7470e0db4d530a9f3b8ee6f8bbdafac881775b3c5ecf95c4e086fb8af2369323c", "votingAddress": "2J4U6SbvVcokXgbLC4aQxS6qyiHx", "isValid": true},{"proRegTxHash": "d7d41ff9c9739f2efebf7a6c929d2935c102dcd533fc84a967dbc499ea9cf2fc", "confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", "service": "00000000000000000000ffffb9453402", "pubKeyOperator": "84f3401ea0fe72242d7cc5b555160b3376882bbe33a247bb9961d3171aa50042b6ae6ceb2281b9e0a717d867ff917527", "votingAddress": "2K42P9VHEyaWgNbr7S6npSMmCzJ5", "isValid": true},{"proRegTxHash": "bf4e8b2eb5fa116080179a6c878dbcdc5d3aa82732d2f5c199207d32f1014a3e", "confirmedHash": "68ebfa15ef45416104956064166366ddf9cac18e82fb91812500000000000000", "service": "00000000000000000000ffff5fb3a77e", "pubKeyOperator": "1298b68b42b2ad95016cc870f9685439b93e321d3d725e305ef0697616f55758cfaabf69d27816cb6198410ad1390044", "votingAddress": "255edNvC1t9Q237CHX53mNwgF7za", "isValid": true},{"proRegTxHash": "5fd1ee4df32d5158718918c4eab6f3f1c99b1335c5056461a9fbd6fb89079bce", "confirmedHash": "a58940634bb729e6cc43ce12b0df35854b6f91de511407381100000000000000", "service": "00000000000000000000ffffbc28f164", "pubKeyOperator": "905096907c1dab513f0716727183b476a929fbc9f9a2a423b97ee99abd9a3302406da1f25e1330c7b53f7617ea93fda4", "votingAddress": "7VKBeda4sFhABfBJ6tkm3Xq8Xyf", "isValid": true},{"proRegTxHash": "9a86fc300cda8c2ad196e9f6889d1dafe254a2c596a6bbede71930cb4602ab58", "confirmedHash": "bf44d48543a9033b017a8badb7651cec9889b7eb4833546c2600000000000000", "service": "00000000000000000000ffffa5164144", "pubKeyOperator": "980851dab0ec93f06bf3bab4c265da57624d22d2035f5f2aed317af367471b6b1adab594d4fd63c171d2d02e748c9930", "votingAddress": "Ry7jioL94jZyZXhcPSVoDLDXtJ8", "isValid": true},{"proRegTxHash": "7854c20ad9e0fd232bcfa01e51b8fb9a9f4a5e07506c5c1d34db8e005dece032", "confirmedHash": "cb690a5471cbccafca5fdefa4fd6b3b54222d80f1eeff4c91600000000000000", "service": "00000000000000000000ffffbca616ab", "pubKeyOperator": "905196683e604bb26950da6f634780221130b58708db48b373e5e8356b2e316166277d0fc1d6a60c1402626fb6c75117", "votingAddress": "3EkdXVDfNJ7KwX84AaBANbNpo3VQ", "isValid": false},{"proRegTxHash": "11925c7e5678800cb473f3d759a492ba6b93d94fa5cd61386b0bbab3876d9d75", "confirmedHash": "eab7db400badb4dd37f4fe7c1c53f3768e87a6b1f059df4c0700000000000000", "service": "00000000000000000000ffffbca6da4f", "pubKeyOperator": "1937ca0b1babc0240cbde3895b7375df6d4b4b782d6fbe50c1f85dd00342c851a6a8134d211045283c12ec0e842a01d0", "votingAddress": "2gjTkR6MrgAnyzVnra6ueaC6feFY", "isValid": true},{"proRegTxHash": "cb9ee76886f1d8b772418c34c7534cfad6bc15aa0458e37caff38a81934766ff", "confirmedHash": "186d438a06f27f5576287d69aebe9a5c28f89eefffe8e7651000000000000000", "service": "00000000000000000000ffffbca60127", "pubKeyOperator": "99d59a1243fec52fb84cb982b27133c8ab5aeca16edc7b17307b490c8cc6710e29e97a41a454f14934a8ecd5c00df855", "votingAddress": "2qpBq4BvTcJEqx5ym92KaWVsaisv", "isValid": true},{"proRegTxHash": "3aab7dae217feab0e80a67ce1dcc650b2f4ac0f1a240543f12901a9680beab96", "confirmedHash": "9749bb7922d7f062720b42704ce0758275c7d0c77c22ddbd0000000000000000", "service": "00000000000000000000ffff87b5348c", "pubKeyOperator": "0ed16955a9eb5bed4548606230af5a5b18c5a363c2416b965bc0492d0c7057f99bd846e52be9b82715954a015303923d", "votingAddress": "3vsFDg5P48sJRtPM8pfRtjWZrogp", "isValid": true},{"proRegTxHash": "d0643120f6bcad7b1c318dc893d1ee016d377553fa0578d0a69e1547b252d8a0", "confirmedHash": "1ee87da7347ff803f27e49aeb179234aac7113d8463cedd03200000000000000", "service": "00000000000000000000ffffc2875ddf", "pubKeyOperator": "0df3ca85bd5ee978c261f0f338ed0e51011ed25ef0f649ed7b6d186df29284251420f8251b97b397245a76adbb9b3aaa", "votingAddress": "4E4E8dMjw3U6aCpTrNJtbazN1Zei", "isValid": true},{"proRegTxHash": "45e7b3b4fa090e455c4790bcc35e2bb485dc0f15b39f2f6297cdf283cdbc4de5", "confirmedHash": "e52f8551426c75c73ffe0406d882b474240051c48da36e2c0700000000000000", "service": "00000000000000000000ffff68f8234b", "pubKeyOperator": "8b313d110459fd6a69c67ab5a9ebd1e8cd36f11c1cffd7ff0a4a424f06922e6f474275fa0a260d8e8f14ad73ae79ada8", "votingAddress": "3rYY7APevsNf65sPJ2hscVTGLXzY", "isValid": true},{"proRegTxHash": "a5b45eff7fe21ed7c5cac10383043f5ae22d66f4223a7d704a9a0ef5b78d610a", "confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", "service": "00000000000000000000ffff2d809c96", "pubKeyOperator": "8123766ae4752999080d6bc838989d86dace876d1b8aa084e5d35d24716ead96fdf2e2826c651e1b8c17080d875f93c7", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "01f997852c74f7a239a8fd7382817be54cb1acae53ae095f9e731c0143a75b6f", "confirmedHash": "384705056af13a71965c968f8440f70435560c321393559d0300000000000000", "service": "00000000000000000000ffff6dcdb483", "pubKeyOperator": "99b6f8383d9ed1ef1c6c7fe921bdb5d201d5857726b36dc5685d84a1b39f27f9c8c1a4c4672b5070f4d7483a0d55fb40", "votingAddress": "2nxVdvfqpTzbrLp5M7mD7WDj1SUb", "isValid": true},{"proRegTxHash": "07a4bd00669e5973d13ad61757a32eb302e4b483ef362ab5a7810f1d9f8d914a", "confirmedHash": "7c4ad5ecfcb0b50aae1c2c57c9fdf5db608ad12c0ed919a10400000000000000", "service": "00000000000000000000ffffb95cdee7", "pubKeyOperator": "0fae7a82deb2f9e95adef3df9b56244119fe73eb694d01a0003d8d310ac17df3d8eb1d106aec9d3be432d6942f1f850c", "votingAddress": "4MYzTnLKdao6Xi8BBTqtiwVL7ph4", "isValid": true},{"proRegTxHash": "0e3b2eca7010d0c9068855179454a3f46f992e759f632a0be79fb625aea0a758", "confirmedHash": "2df46462f970c7e4aba564ed4914a5154b6bf573239dab962000000000000000", "service": "00000000000000000000ffffc2875b1c", "pubKeyOperator": "09aabe15385a514de9545d5427baa08b311f2280ff0cc008e3edda19a0283c508efb6e7cbf56f92dfc09690375356667", "votingAddress": "Z81Qr8ptba1rcY9AQwJNMSgybnW", "isValid": true},{"proRegTxHash": "757df214269c4f98fef4a7966e3e5d0b457d5ac364768dcffbe28e3801d3a962", "confirmedHash": "92e88e8c6db10d1940f2ac18144fe08855106086164582001d00000000000000", "service": "00000000000000000000ffffc28751a9", "pubKeyOperator": "00b4d2f35d74b8c68e626d3505514abda2105640492411dca22c7f713e0f2697cd0bed28c357c8f83eb60024db08c7e3", "votingAddress": "2NTGFrFddLGtRcxt2HMpkhn2tuK2", "isValid": false},{"proRegTxHash": "b5c28a88d8774f9947b03b12107057e960e8ad2a4981e2614d92753ca8756fd4", "confirmedHash": "18dadd01b9d0861e1a2c0c137aedd5c026be5771a491b2920b00000000000000", "service": "00000000000000000000ffff8ac5aa50", "pubKeyOperator": "1289d52d5f8ef304c05286114a3d54f14aceb45c5449edab613fd4a0fe1d44d265f12f18840fb15465c7359b90dc0a18", "votingAddress": "34deXoD8V7gmVEHwxeyZwrzkAp8C", "isValid": true},{"proRegTxHash": "72cc3f0b44b8670174767fd8d83fb709b3346a91d55d5978045a089591f92f8d", "confirmedHash": "59b2431de04f756ce518861bd541e30f2bda064228546b630000000000000000", "service": "00000000000000000000ffff8e5d992b", "pubKeyOperator": "0c9e264afa7ea9571245e35c279c47b4e2761fa348108b37bb8ab03876e7c95d8237c675e80f46a73ec6315adc4a1a8d", "votingAddress": "3Suh3Px7hvatf2CBnQuHBfwNgxG8", "isValid": true},{"proRegTxHash": "146fb86649211806d914fba84e334fc4418b677236e36ca90931fc90ec368a23", "confirmedHash": "d56fa840a23ec20122b1c62bea934e5c6de1e8d69a8556281000000000000000", "service": "00000000000000000000ffff68eea7d3", "pubKeyOperator": "8ae0877a3b3d4594ca7315863ca78e87e5fccb2cd9a7954d1dac64b93f7a6fe9e9a28a860c84e1a1b52b6c2a1ebdcc4f", "votingAddress": "2AoqX8Br26o5oZjJt8dnJxFy2Xo5", "isValid": true},{"proRegTxHash": "17e84dd5b6f51f12fa04e23f03d1c00c4295b286b39a4962d0c835374e961009", "confirmedHash": "c338b6c11b3b40f146525759c04df6b90e990ba7aff2517b1d00000000000000", "service": "00000000000000000000ffff2d4f126a", "pubKeyOperator": "0efcc95a818dc29c962c1ac31348272ebf6726db06545b7e057c822431906cb7161218c42bbb4aa382d1b21af7c2d6f2", "votingAddress": "3VKY6JjTNpNsRUMywzw872BDCXaJ", "isValid": true},{"proRegTxHash": "7a0202c3c2e41e99a5d93c503fafacaf0552476cb4f28d55113dc6c738367f72", "confirmedHash": "8bf5ae495ba24b16acd899b090c9cdf39ff7c8a8cb8744fb0300000000000000", "service": "00000000000000000000ffffd8bd978a", "pubKeyOperator": "8443841e14569b06c45b024ea99979951ef498e4a072d29b8b9f5c6f75b279043087b5ceb03f03e66eaff62e05dec805", "votingAddress": "49TcQ1LTNisq84XrqL2w2oZ11ezg", "isValid": false},{"proRegTxHash": "f28535fba7637bd4a008195578ae77872d90f80060817f91c53b69691dbfad15", "confirmedHash": "54676a0c5c89a1959ac67f8d10da4cf38f43b547bdd699472300000000000000", "service": "00000000000000000000ffff92be1862", "pubKeyOperator": "0c6d6d9055847419cb118dfcb410602539e4ca252b2bc956244f55116a8a012b62ac9d01bf98febe031907b86b5e1183", "votingAddress": "27xoLQWc5F8ojMAbhG6zd12kty1", "isValid": true},{"proRegTxHash": "3f313a1cb124e3b94ea3645320c0f130c63bf22b520f733cdc214a425a6bbc13", "confirmedHash": "cfee43326f2d3a01da7204e9859cb98dd59e530ff419afc70600000000000000", "service": "00000000000000000000ffffc0f1eb6b", "pubKeyOperator": "805e0ffcc5cbbe58f22809b05863bd444183c397db383e48068c95401f8f647176426c93c39254d3652b21afa5e95640", "votingAddress": "2R31d28nfd9sPaXMNBR44XLqK23V", "isValid": true},{"proRegTxHash": "27ca5e3037cf4223919baf2fb988592237521bc698e9aa1df574f5b7ec7bb37f", "confirmedHash": "a635fac4fcc7c553d6cd0669946f0f67c9df69f02882d4d50700000000000000", "service": "00000000000000000000ffffbc28cd0c", "pubKeyOperator": "0e389807328355fc40c7a9c8e1e8736068a8095057137d2a5afbd44f0d4c75e818354403259863ea234f6d8a0796e3fe", "votingAddress": "2dTHTt9KdSC9rKWn6JpJ6UUYx7eu", "isValid": true},{"proRegTxHash": "18e408729b30da08231a5361d5f7d44c6a227e30d287b2700a9370969b92b567", "confirmedHash": "f77cb67424255330c9190a53cfcf578dc90645bd04cbae2b0400000000000000", "service": "00000000000000000000ffff2d4d63ac", "pubKeyOperator": "975fc6e1bc890bef30e5f8c84d2d36c438018569ab38ca037757d1c6a3e6d22722d8b82dd20ab15d700f42b226b4bfba", "votingAddress": "c6AF1JjjcSJeZVpj2hjTcj1EShD", "isValid": true},{"proRegTxHash": "e887fe5e747703f414cbc041a8850d119eb71a668c2217eef56632912128284f", "confirmedHash": "8aab433e9e24757ff39d85db83deac1369a93457b99fe80e0600000000000000", "service": "00000000000000000000ffff5928056a", "pubKeyOperator": "091ae720dae474d1bc86fd177db8e0a5f25201a4ce04c663b3c6138495292fe8f483c8e5fbabd5bd960a4b442daf41fa", "votingAddress": "eTQprxxVXKQzbAECvXXni8k2xDb", "isValid": false},{"proRegTxHash": "962f7b5b829e2f6c4a80e7a9b1e7700a9b60b30997bee2813e6b1b7eef69ab74", "confirmedHash": "ffe06f3f73385cc64301a6425188360a8155b63d72af7ef03000000000000000", "service": "00000000000000000000ffff6baaf26e", "pubKeyOperator": "01385fe2e2c58eb01c318fef83aacf8b4f7cdbf8df7642ebb24388a54c31b18159ed75aefbf1494334d22491e45f3aec", "votingAddress": "2eZXA7aMJJonXZjM5jLPE9jJDndu", "isValid": true},{"proRegTxHash": "f8a64d8d318d1bb929a134addd79fdab010b61c80f3eccb7b245a8cfe8a94fb2", "confirmedHash": "80c370ebe620184268960cb65a50136875957b202a66314c2300000000000000", "service": "00000000000000000000ffff5eb0eec9", "pubKeyOperator": "040ba3cb165c2444aad28904f3f1416798fa814c0c2a06764ebd5e0d0baa123e7725887be2d8af99fded5791470c77b6", "votingAddress": "4XH9Ygcb14tiKLx3yyqESSieC73a", "isValid": true},{"proRegTxHash": "383c722576bc7b8cabc96aa3d8acf4f39bf9e69deed554f9ff960fe1af45413f", "confirmedHash": "037507fc2f0d55d042d2253867c88b97eb8b8bd4b7fb07ba0700000000000000", "service": "00000000000000000000ffff40e3138f", "pubKeyOperator": "913b88c887ba8281d2f47f80521c67cde1e76df12601336dd3d8b3a06d0e4a9fd683e279f1838b2d3853000524f188c2", "votingAddress": "213zYgs3c1iP9KBFyRM4NpXhM8kW", "isValid": false},{"proRegTxHash": "4692df827d0f6b86f34067325c90393c3643ffa347c88bd51fb5298ecd77d698", "confirmedHash": "95c5715e0a271eee00059fdd92a41916cf1bdedef69d60c80600000000000000", "service": "00000000000000000000ffff2f624260", "pubKeyOperator": "8e67f0f0db9fa56a28f28d8940d5c463072f5db6bcede4927c69cc5d6b969d3145accca6e1d3981cb1ae725b921aef34", "votingAddress": "2kkFLsuo6H8GjQk1svjsD9UADjoQ", "isValid": false},{"proRegTxHash": "745cfbb5115a56487b76f3f6eed7436bb224ed69b02ef69daed92f5a82d81961", "confirmedHash": "7723fc3c5c009470d185d8704d192da5faa2dde0137ef2f41600000000000000", "service": "00000000000000000000ffff5fd93063", "pubKeyOperator": "95d6dc5f338498292b3fcda4d10ed7893a4c8b8a01308dbad95faa90b98191f5bf2a971242aa1b26cf8154455ed9bb5f", "votingAddress": "2NhQTfMcWLfY8vUtVJjfRT23sVJv", "isValid": true},{"proRegTxHash": "79021b92e07b79b1d330e00af3eff95b209ad8d7d2df45a036cc429d8d43e559", "confirmedHash": "60a2ebfd6c888dd1f0c12019b164d2d7b6c2b27034685ec70900000000000000", "service": "00000000000000000000ffffbc28cd12", "pubKeyOperator": "0ff373bac90753ebce13ab140717c941a07879494f2fde97950b7493f8af78b35dd80c840301c1c39ed4d2e437bed8ce", "votingAddress": "2yG3P68TWeTmc5gEpC1p4thd3VBu", "isValid": true},{"proRegTxHash": "44a934fbf7ff8564066d59936b179e14052c0cd7ea094d89482af3fccd82cfd1", "confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", "service": "00000000000000000000ffff74cb1380", "pubKeyOperator": "00755788e80357e99062b2de07500282d7f4f3ff2452009ad308dc6ed3f15f09ecb4b65a4d8f1158fa04414a985fc0e9", "votingAddress": "4AVLhxKvLVBAzWTwuDceycbEbh6m", "isValid": false},{"proRegTxHash": "e2a00aacf1c5761e21df9ab74fb1a9223400119055ee94a2f9bbc592b86e5175", "confirmedHash": "ff25bc286455940d4f4911b9542adc448384ee6839fb51de1200000000000000", "service": "00000000000000000000ffffbc28e714", "pubKeyOperator": "8e7e86676d947eec52fbc53fa7e02b589b77b2c46e5f9b8f7de0c685dbd1f820bf6170315e1f896562293871c52da00d", "votingAddress": "3seF742LwkB5G8Kh9E9QH427epNV", "isValid": true},{"proRegTxHash": "0b913bc4feb7a870f82bc0deda7afed659522b77687622753ab629bea46ffe7c", "confirmedHash": "d49518a7249e79a3d7579087117a16708dc1c898e980b4082800000000000000", "service": "00000000000000000000ffff92b9b428", "pubKeyOperator": "8fae5c02eb0c39c4c401608b3986d0c10e82ec7aa9eec319f50dad9c2a3826b90e71da7983838c13e3d35d24f774e5be", "votingAddress": "2rBqQe9bkEHU92mfWraJZ7TCxAqb", "isValid": true},{"proRegTxHash": "f5b87a08007d1132f3d40dc4a1c80bc57755e11aedb8a28b6cb351a71d4c13c6", "confirmedHash": "9aa955fb57ac4b3c694e5525093c3b8295f4af905adb80131e00000000000000", "service": "00000000000000000000ffffd418699e", "pubKeyOperator": "17177a81cb7725cc731a2e8293b75d03594f9656f949f5e7efcf4a82051ecb7c6fb732f8f8630c63a3f065c74c44bb15", "votingAddress": "BdRZgzBemMNqeQ8m47vNcg7YviA", "isValid": true},{"proRegTxHash": "96240706ec052ad79bebea83477850948670e8ea064c365cdac97f76d02551af", "confirmedHash": "45b436f25267c3fd57d69492da366d6e7a15115a6ace147d0b00000000000000", "service": "00000000000000000000ffffbc28a30c", "pubKeyOperator": "13471625bb93c15bb12dab530f395adc4cb57a997bf7d41cb0ae22e2e7fec688798e2feb114fce01e0a42dc889187769", "votingAddress": "qgeoF1eEYz6xRJLq9Ax4Huu2dr4", "isValid": true},{"proRegTxHash": "0e9894ab7c79ae8cc1a179e9a7e6271c865bb4a4bfb03892aa05cad18199fe6e", "confirmedHash": "1ab06894bb16e90982fb76a07bcf3e942d63d7d88d7a484f4600000000000000", "service": "00000000000000000000ffff91831c75", "pubKeyOperator": "15d89cf75759e403ccf6b2a5c1243a5e42c350f282963f7202f1814e4b0e6fb4256f1abd1a80043e2a57b459a015f743", "votingAddress": "43yM2oL2djeXgshb6yqt6TrBAv7N", "isValid": true},{"proRegTxHash": "db45b4c5713208797d2fa7573b32339bc3f79a2d2ad01a1d612dce7dd802c37f", "confirmedHash": "2361df2cfb3dbd626bff6a20f35d1ab801a740bd10e5a7c31900000000000000", "service": "00000000000000000000ffffb9e4538c", "pubKeyOperator": "0d8902d7a992bd1241e6a71c82b1c32cdfbf666fe2706e0028d3b8f082223e02776ec76b8cde689f70afb84618ab2d00", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "18435697ee4aa090c918739fe373ea8964b2b73c2bf07a9686fcc728e1c74e61", "confirmedHash": "de854e32d1a96c9a01230beccebeb8c811ba081a7d0bfea61200000000000000", "service": "00000000000000000000ffff6c3dddcb", "pubKeyOperator": "88494fa5fee653bc859371979f3c2765927eccd2757acabd276fc515f51f0574970ed629810e672d88c56cb3a0151f46", "votingAddress": "3F396KXiwVJQJnaCv74efsSGuhDf", "isValid": true},{"proRegTxHash": "99046c0812aba87d3d2d735bb8899d9b84eba7184a40ff6e4389e8872f07bf4c", "confirmedHash": "9a1d301a18559dc1aa20644fa3b6273224ce13f37e3b92b14400000000000000", "service": "00000000000000000000ffff342cf905", "pubKeyOperator": "9129febc527355775f0b4ffb985fc81b0d2c0067d65f3447ca2d66c760abd4ca614c33201f9c320c6b0bbc975c06ca1e", "votingAddress": "3DnH3m5pVV7aJNp7bvL7Bm5dvjtn", "isValid": true},{"proRegTxHash": "59f8e01b9d223a97405be927439442f1c91339efd7ff573f5b00b080f33cd277", "confirmedHash": "12687a2c291cdf0465b65fb9d57a97314059c49cc7bc21ef0200000000000000", "service": "00000000000000000000ffff52d315ee", "pubKeyOperator": "07ed43e3d431820ee3b36c7cfc76273df658e23cbcc97e77c287b9567dbb696810d23a493bde66b95489081949cbb3a9", "votingAddress": "3tk4MydUQ8R6iH17edc4HDqY9f5S", "isValid": true},{"proRegTxHash": "9363b00ed5467020c43faf1d02488713234eac181fec161b5b71218c2daa3a62", "confirmedHash": "40155ff704d511d70f5b8b3c907ec547acf8365a719edc681a00000000000000", "service": "00000000000000000000ffff55d1f181", "pubKeyOperator": "98e4def8793e3961cf171972f5424258cae8b98948c711f39dc5bf25e51b0ae0918884bd389dcb95c6fb315f7f7a678d", "votingAddress": "2Rb2eatark4tpgVTW7RcNipjLn9y", "isValid": false},{"proRegTxHash": "4c4c7d34141d9d6cb16294e810bba5fb427138d7432afae9c17ab7f13d76fd7a", "confirmedHash": "ec84a1e12ab195cfcd24c51b633c983d68589a80d411a9570600000000000000", "service": "00000000000000000000ffff2d20311f", "pubKeyOperator": "906f2aaba6e086e7c0bdf8f96231256c5b8c275a85553f8495bc855c4b25da8fcd8f508c3d40f98d023753488a254220", "votingAddress": "2Zu6DBHzpXj2kCzqd2oZx8cm55TV", "isValid": true},{"proRegTxHash": "f32dc016fea9e16ed2f5657c528af66d022e867bf7a95a95c6bbd11615d14a0c", "confirmedHash": "c5ebbd21a6484428cbf8a49151944485387d3619dc2ed34a3400000000000000", "service": "00000000000000000000ffff52d3194a", "pubKeyOperator": "82274c5298b39512a355d0debb027ee7487f84c72371b69275f4ec61eb51bf699d18ee0587beeb57e0981642315fd925", "votingAddress": "4RhbDPEu5jvnQjPC7GamGX74Av4t", "isValid": true},{"proRegTxHash": "44bb179b5ff05edd46d7eb2fd16e328a55e0764cf4688fd8270660b50a852425", "confirmedHash": "b9f0abb87d86c484e51d4bf5cad1a09823a4fcab61213b170000000000000000", "service": "00000000000000000000ffff55d1f18e", "pubKeyOperator": "1487ce9fd2001fc3d30496fdf73ce521369123db23a52f2edcdee20615a4c1ef320a8b166d6a8967776aa988e3f7f6bc", "votingAddress": "qcxUCkBdyWko6T7x2jMAp2UywjX", "isValid": true},{"proRegTxHash": "d94f23431f33d7d035de5a6b307ea344c714646f21dc8dcd9dd4c9c8699a50e1", "confirmedHash": "abe1d69cd4591d0795ef305f5736655c56cbecebd2a38e670f00000000000000", "service": "00000000000000000000ffffcf9475aa", "pubKeyOperator": "9713722d853bb680ffbe2fcc8c37fabc21f7ee748846baf3409c4a787486e73baa9238a913baa46772f7a777b8423aac", "votingAddress": "4DnUZvpJgkqpi2EpMsHnsBCGbpeb", "isValid": true},{"proRegTxHash": "c25dc29125fe24f8b8c1ed6b270880e85c2529b56660d1056a151d56a6f2e460", "confirmedHash": "82ab4b63fa3970a636ec7a713b585558e79935af9cb3ab092100000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "4NAn2Lq3vvgS5J9M4K5ELka4gnKJ", "isValid": false},{"proRegTxHash": "ca73ad1638a0a6d3c111a99ea7da3ef03589c5bffce6424879f94230c7b3af91", "confirmedHash": "7c98fa9d74b035b7f4b64e9133f602e8a0e14dfabf9a51051600000000000000", "service": "00000000000000000000ffff55d1f21b", "pubKeyOperator": "8c2131d2d4d539d0f2df1fbebde2e06d223d02f6be75019866fd8de1078bbe3772d5ff4346daeb28495af6f3c40fba6f", "votingAddress": "2zUs3Ry9y7rajkAkSKK2U8A8tRW7", "isValid": true},{"proRegTxHash": "07e68559945cf0ea9616c5d392023ddb091b8f36b6611e11cd127be16210e9d4", "confirmedHash": "278d92502f43e657c9b68c0b4595402bf2c104bf39f092570600000000000000", "service": "00000000000000000000ffff2d4c5dd8", "pubKeyOperator": "18d3c143ff890572b1daf50d57a1fb763255a5fec0e8b654897a474c7028a0508744b2eb3fd885d79d9445eb8711a1fb", "votingAddress": "seCxE9t4qVrCKycVAvCDpNonELw", "isValid": true},{"proRegTxHash": "eacc857d73fa7f1da0a318dfc4e405b66a6af00a112543a87e051383d647ac40", "confirmedHash": "1444f5640a4eb6d1503487fa4055bc3fe98464002687133b0a00000000000000", "service": "00000000000000000000ffffbca655cd", "pubKeyOperator": "9863f0912e32557ec8b6a0b5eff622be87f2b6c2706e16afa0a55ef7f33f712b851ba989f5fe469cdb2b3fda96e75559", "votingAddress": "2nJG2c3adK4dWksMZriqXyGzxtbn", "isValid": true},{"proRegTxHash": "c1aca98b018a32233caa9c34a04143ebd5430ce8c6566375c35920ffe2899b85", "confirmedHash": "30dce32be3dc8bf04cc4ed203703d3b7834b75ceedbd8cbf1d00000000000000", "service": "00000000000000000000ffffbc28b6cd", "pubKeyOperator": "001ff51d23830ab64aaa2032b5a299b0ce64a78751091380a2efb53a0fb6c12dac7d7b33880b18e413dbeb0207dd0e62", "votingAddress": "4WpRsWnh5oizKGBu9J8kku4Ny9mK", "isValid": true},{"proRegTxHash": "18d4536457c3fa2ec0f77eccb6402e848f8f5f5ef3b11365d552fb6fddeccd7c", "confirmedHash": "da25a7624473b503e918a91656c033e9ab9b5123413794543100000000000000", "service": "00000000000000000000ffff52d315bc", "pubKeyOperator": "9315bf078b52bc1463fd5741950912751944ce133d04ccd48ff8a7e82fcce2f5b751c4985cf5acafb0a3b02aa4a66a45", "votingAddress": "4CzuC17Ayg8K3nmJg2aK2Cf1aQzb", "isValid": true},{"proRegTxHash": "112bd147646f2813bb53c6966c48cb98f18b0045e3d5ed9aaf3c2c1e5abf8519", "confirmedHash": "b39d9fa5abaf178713b63c00ad578d07cb637dba096513942c00000000000000", "service": "00000000000000000000ffff55d1f11e", "pubKeyOperator": "8114d8bfc924bfcf87843755439127ba70a199662ffccf03ceaa019e1a2f9801aed7ac5c318fe2e4a2ca54c07db79ab0", "votingAddress": "3geq2bWifn8yUJbWVrpXYQ1JocoW", "isValid": true},{"proRegTxHash": "f4e8fd31b13b5079bf9c4faf339ed329842ca6a3a71f1d25af9d1dc7e256feb4", "confirmedHash": "b9f0abb87d86c484e51d4bf5cad1a09823a4fcab61213b170000000000000000", "service": "00000000000000000000ffff55d1f1e0", "pubKeyOperator": "85767af5c1598737292569382eec3374c8701814348ace4e78c53b44077bc5921a3641920c62bc01ef4ed8ae23fbe818", "votingAddress": "jur23o4VYgBn6afpPfCqpwoc3qW", "isValid": true},{"proRegTxHash": "f56959a3016e9e67d4099e4b8a3d4ae8ef9a73ecc9703d64ebbd952ad256dcb4", "confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", "service": "00000000000000000000ffffc2875cd9", "pubKeyOperator": "8efa9a85020ca81d28e070290c059d1dc4883143fccd319263c6285f0b84c234e823a49245c496d9ca45821f3bd3fc66", "votingAddress": "2r4Hk3q7YfcwQ2jHGhXHxRgV9nLL", "isValid": false},{"proRegTxHash": "da08fc58f3895e7fc2c5a8d89ffb2e3a2d627607f9667000c04b24e1fb40f64f", "confirmedHash": "6ed8f22c66a07a06751e7b0912dce887ca348bb5b313188f0a00000000000000", "service": "00000000000000000000ffffa5e8bb16", "pubKeyOperator": "0dcc882f15743749ae6ddbef9e1be822cfd51a10a353e9184182d02628ea251d0f0d52f545b80271f83edd3113da0144", "votingAddress": "4FrMsTMoKWqieGXR22JrR6z3hXdx", "isValid": true},{"proRegTxHash": "3a6fdbab2410fd69df6fca04a397e5d312d7a55fe1f89e7c27b5ea9438e8da69", "confirmedHash": "82798e5115aec2e59026b59db34305a63fb933a8ea04a22d0500000000000000", "service": "00000000000000000000ffffadf917a1", "pubKeyOperator": "8b58f9e617257fcab3930ac16fd3192169877a8e3198406a7c6bd338af63b26056c6e7689049f128c668d47f349fa610", "votingAddress": "48YgPF87pLM8faWpZzheH77AUt6G", "isValid": true},{"proRegTxHash": "11b22d068caec0c3fb0724dd58ec8933962ca94441760a6dc21d61b68cc40776", "confirmedHash": "8374d2ace557171995fd2b8bc319382290194b6998c6edb10500000000000000", "service": "00000000000000000000ffff87b53494", "pubKeyOperator": "8545e33839d9f789e6c2a915b6a6f347d77f8542078dd0b7d23612cc7c2b56ee6f7fffd33f2eb281555b9fa91a6a0c92", "votingAddress": "kekSxBYrm6NeE5fvtJL2zZ4xAZk", "isValid": true},{"proRegTxHash": "030f708fcbaddcb4927c9d633d28320db7211ab9af6924830f233b9de7f3e7cd", "confirmedHash": "684178c25a5de77b3efb75710995a5c3319618e51c6cd8d51600000000000000", "service": "00000000000000000000ffff951c9ba0", "pubKeyOperator": "935d526683f7ed8a27fcc304e08c8d83cd07a9a2b0061e07ef7bbee4af513cd7cda1f88f583b702b482488f9644d0403", "votingAddress": "whwBVxyirvPQykXT2Jo9QEejSg4", "isValid": true},{"proRegTxHash": "8973097f8faea67bf3c8be3be70d8e43eaf5aa05361cf545e48b427f264bc336", "confirmedHash": "64edd0516c6ed1a619d13e66f98317d2b7c95ca8d12da2a81900000000000000", "service": "00000000000000000000ffffb9053587", "pubKeyOperator": "1368eb397a4d35305d2ce94f0d78db381978636403e04fdc011f15f43e2fd07801cacb3c2a2fc613c444cf9d384c0c0d", "votingAddress": "2fZSnba7VW9LyqbktQNQuvZU936z", "isValid": true},{"proRegTxHash": "2f4a85d3e2e9ced162e56ada64894927038dad754d949dacf7c527f7ae6f7e3e", "confirmedHash": "a6cc583734a8dedb1a3a5470eb7524f260a2c7b579463f511600000000000000", "service": "00000000000000000000ffff55d1f10c", "pubKeyOperator": "87b5b9fbc61c9d07c70b7acd57d8d6419e29b8fe3a587313697002f8ca5d14f3d5f8abe8ccb4fbee585795a9cdde0f0f", "votingAddress": "2DETa939JT8pXeyfhxPkVBTShkDz", "isValid": true},{"proRegTxHash": "acde2126dd9bd0ca4c11246ebcdba487e0e7d0090423bde31a22834f070fe905", "confirmedHash": "91a6595f7fb53f1f09f9df2e741120864738144ed1f9572d0f00000000000000", "service": "00000000000000000000ffff55d1f278", "pubKeyOperator": "074006142a7496cc0278c175db7765944e2caec5d9faec09856d8bb107e56dc7dfeaaaebfb7342bc3005e387ba123075", "votingAddress": "39AuJw5SMXsiMjPxDCXaFT2WUmcn", "isValid": false},{"proRegTxHash": "1e683c0b90432927600d70f9099ff3f59a2ca742e418d6fcc3f4d21bacfb9b3b", "confirmedHash": "c300a7458668f0a1f4351b591d1a6c3e8519722ba2c9e1831300000000000000", "service": "00000000000000000000ffffc0f8b12e", "pubKeyOperator": "023b711647399f1eca2fe7387d8e024500f623e4d24906da6fc415fcf4d4d0bf484b1d4d31f34b528f9cecf3d4e500f3", "votingAddress": "3gYxkydYhUZ492xUe9K2ghYjvAXn", "isValid": true},{"proRegTxHash": "ec2717b17cf52785d886ab216a4ba96d31219bc2436562df7f80c1f1d124bd5d", "confirmedHash": "1e0bcd6303782632a9367291d9129f86b9dd053c091e023c0400000000000000", "service": "00000000000000000000ffffbca638dc", "pubKeyOperator": "8b0e1fea4cba93bd50c49ff110baded1c90d8e4e3c52115e1a23678f133fbbedbebbde20c6ebb964b88c1b5238b9ef71", "votingAddress": "vwnLZuWB3Eg4k13wCbmP2L5rGnb", "isValid": true},{"proRegTxHash": "f6b15a4bfb661400e8944ff85ed2445c1025ecf3ef8a8887b2375c3259d64adc", "confirmedHash": "c39601ae20ba4e6a597cbc1bddb326acaf7be26af9f3b0381500000000000000", "service": "00000000000000000000ffffa763b24f", "pubKeyOperator": "08c52e6246c5a86a28eed5567cc8371da9d990c062015d3754cf2b2eb50f9ad40082b42c177bf5def7c510e879de8c9f", "votingAddress": "3xe7BskzWRkfFQb5zPX9Y5kxvxix", "isValid": true},{"proRegTxHash": "3549d09bb90349e60fbecddbe4e970cb1f69712dcbc0ab6e1337c0c5cd76d0c8", "confirmedHash": "c61e2ae74231ef41f78e4eaac1d6e6064c624766d3bcdf7b2d00000000000000", "service": "00000000000000000000ffffb23ecbf9", "pubKeyOperator": "8309e90bbd4ec2363f9990c42707e05d45a0faa5f8e80e0f854e5c81bf18ea1e0fe00133e2cdf430634c1596cbdc6ad9", "votingAddress": "2TAJPHcBW8EpXNLS83hdTLwCqyjE", "isValid": true},{"proRegTxHash": "ce81a5ffd8223aab3547e9efc967a182b06efa26a801eef8e8562144cfc01d5c", "confirmedHash": "c23e258631884923d43f264eaf58db10351f2d9eff7990103500000000000000", "service": "00000000000000000000ffffa2f34c17", "pubKeyOperator": "99d92edca932191dd3cdb966d3b9a78c8ade5b7e5a50dc3cdf9ecb57d2a5941a749c7ff25f8bd6d3d69a5bbc2e9d357f", "votingAddress": "4Py5kcx2JJGEKM3VQPvfWydN7y1y", "isValid": true},{"proRegTxHash": "261160462b90ccd1c7bbe784243d030eb20a18dc208fd318307e34d7fd7d66fe", "confirmedHash": "237a8f30cf852a367b602316e2a045718db4884c3c6814180100000000000000", "service": "00000000000000000000ffff3353445f", "pubKeyOperator": "085cd1a7133f5d4db797b76651e903c047840e27f8326390bf72cc78c6159e06485cef8e167edfdd87e8d44beceec1a8", "votingAddress": "2sEf4PW1Lr3zQb9h4yBMA5LU4wnJ", "isValid": false},{"proRegTxHash": "91f3d9d3b6a0eef530aa8a633da56a59bd6d0e9f4972cbcced87e19bf601c97a", "confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", "service": "00000000000000000000ffff9f45cf01", "pubKeyOperator": "02dd45745f2924b271224227c808c156ea4a4f3723e30705268258e7db47eaf102f78b0ab0629c875172b47ebc6c378f", "votingAddress": "3oY4Enr7qztTMP9TX9GAoJ4z1kYU", "isValid": false},{"proRegTxHash": "b9a7da3a702b969904cfba410cf9a679fa7b32e1e08ea3b959616701cf5e0771", "confirmedHash": "99b3d0f943aa2807a2f0f30a375efbebf6ef1e51aa5c2a862200000000000000", "service": "00000000000000000000ffff4e8dd6d1", "pubKeyOperator": "01ef09ec0ed788980da4eaa5ca9aa0546005f47ffe31ab6e4a5e48e190a57677cfd0195d48e0a9ce9097f483b97f938e", "votingAddress": "2A6AwRUTd7dvT1kkeWLvcj3PoQyU", "isValid": true},{"proRegTxHash": "1a03e0ded674defcc460ebd91a16d07e75b6d2ee074fe210971f0d7c234d45bd", "confirmedHash": "5e959522e57e68c7534a7b9751c294cc57208eeaac340a171300000000000000", "service": "00000000000000000000ffffbc28e70f", "pubKeyOperator": "114c1e474aadae7281a7a2965edd5c6215dbdfd3e64f5de720780fb036d52104c2ee69f3aa1fad0dcb9b46bd4e02503b", "votingAddress": "2ojiTe7USAhfsux9aUFT1FjPNAjd", "isValid": true},{"proRegTxHash": "3d5469b9d1e6db16e194186586b3c3a39ade11b1b707ceb9341e817054ddd064", "confirmedHash": "ca003e8266fb378c8681ff23e7fb711ddbc3ec557c0440f63100000000000000", "service": "00000000000000000000ffffb444bf4d", "pubKeyOperator": "16b95507213d3a58b351b89c50481a167485009b2be7c329d9f9efb4399695e0ebbcb084943df079b258001e077f55a7", "votingAddress": "3PYSaeBHpqGM3Gb2hktiVR5oRarN", "isValid": true},{"proRegTxHash": "0aca87dbc523171d48efaee53bdbf5e21990b084a4f190a37dd36868b2f4521a", "confirmedHash": "342a09b33d14a2714438896434f9c34aa033641002d9f9610900000000000000", "service": "00000000000000000000ffff8b3b90a9", "pubKeyOperator": "05e9f4bfb9205bc92bfe74019f685762ea5be1b61837535e95fe3fe2bb596ecfcb87309b0909bcd4c661e07d7bf73440", "votingAddress": "29kEVaMpPtv6XTrYgPwKM19JrcVg", "isValid": true},{"proRegTxHash": "4e9b7e40aceee411b909c8ddaa5e21ae995305abb5f5eb220a8991e98e9271ab", "confirmedHash": "25ced58d2e810e9a09f9a3268e01de5dd0d6642a800a507b0500000000000000", "service": "00000000000000000000ffff2e65bb48", "pubKeyOperator": "07eab26747a7508a27fe8478bb5ccf7f69744fd4bd1bc60a32176aef120d433bcd13361a0ac62a7de75c662663507211", "votingAddress": "2Xh9CaTcAd5gsjA2bxbrcNWFCzDb", "isValid": false},{"proRegTxHash": "f80b6d244b4e6cec6ee583d7d23b411738b922f198a1b4fca2012b7bfb84185c", "confirmedHash": "1ee87da7347ff803f27e49aeb179234aac7113d8463cedd03200000000000000", "service": "00000000000000000000ffff55d1f13b", "pubKeyOperator": "014c7a2be61cd173fed07b97a75835580cf6f90ac27caa334ab8719ac7a87fd0e0aee6b2a8491a880e68a9c1c562fc20", "votingAddress": "3Hs74KiFboGdH9g83Srmdr4RSFFj", "isValid": true},{"proRegTxHash": "e47498cb620f332aa953e5d5cb85f987f3ba4e25970679ae9d9562028700e66f", "confirmedHash": "a4dec54f19a3a576557ff8a021913be243a4074be6f757ad1400000000000000", "service": "00000000000000000000ffffb97a3ad4", "pubKeyOperator": "9077aedeb974b24aadd4bd6a51acbfad01e245d1ddb703a1a0ee58de0317a1df4d7ff753bdcfd18919fdd40a7b635320", "votingAddress": "3ZdkfUH719jtz6MTH2GMziWyBdD3", "isValid": false},{"proRegTxHash": "c54297da1882365fb010cf69089feb4a4b03818c6d6edb43f9f764884b0bc41e", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffff80c74b51", "pubKeyOperator": "86760997ea6eaaf5aafed83570f82dca989f588884798154649f249e8c1b182def2d00fc1ab9097fdb3349f817a4724a", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "66a9908f91f7a53b2210d21fdf529b46d014b87c5bb036883da4ff8042303f50", "confirmedHash": "744c42d778846371e0a9e94e22d163e88d8fe52ce689df5a0300000000000000", "service": "00000000000000000000ffff40e34c80", "pubKeyOperator": "91601e7e9c3b421654398f2c78ce7884836fb14e0e3beeb31ad97895e7893964b52f20357ee8e2d99df5753ed2c3a630", "votingAddress": "2fVYr1WAXG13esvaQhdxJMQGRYpQ", "isValid": true},{"proRegTxHash": "db876f79ced4dfc79e9bab1ede2a2fb64341224630267aabdbd23aa7085173e6", "confirmedHash": "deea24e962fac02cf223dd40dd3f1d84e4375d0d51276cb70500000000000000", "service": "00000000000000000000ffffb23f798e", "pubKeyOperator": "1732371c6ccbfe8629ae3538e037a533e34195570cc6869637a3b746a8397d6ebad17a127121ffdd9b3fe3220183ce4a", "votingAddress": "2hEF9oGq1cdh9LYCLM323DQLLREj", "isValid": true},{"proRegTxHash": "d038c169deb1bbd26d6c83a0f535530348d05f7bc79457c31bda66c0f51f36d5", "confirmedHash": "dcf4fa1724dad676ee2501b3570c3cb8fd26d347eb0b43151a00000000000000", "service": "00000000000000000000ffffbc28b6c5", "pubKeyOperator": "0f5152dfcc39ce31dc54006b914b07a1dd6d03b5717ca35e054da9e8ff17bb009f819b82196cbc8446d730a77a5ab53d", "votingAddress": "3uUrbwX7AdSh3iLjXfrses7LGojw", "isValid": true},{"proRegTxHash": "2884a85dadc971a2f06419a641f20dfba2b1c906e452a3bb055e7127325e0609", "confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", "service": "00000000000000000000ffff55d1f26d", "pubKeyOperator": "0ade39c629ac44f65e3f084673c2f5b3f4a219c617469e27f0d1b6d187cc86b84cbdad82163d2f839023fe84f7858c54", "votingAddress": "23bikaKWXbNFCq8cWHoN7bCBJq1f", "isValid": false},{"proRegTxHash": "a667d465021bc1eb5d9d4cb80e2c755bffec85e2856cb330250e5c8471e5c336", "confirmedHash": "ddaefcbf01fa3bdcf36b9349e435cfcacac9a5f826eb38761800000000000000", "service": "00000000000000000000ffff2e04a26d", "pubKeyOperator": "16efee009ce1d239049e97dcfaeb2a5bd8e6a956bc5fbb0b158b11ad60150eaaf9af8a0e366ab4567cfc1bc36878198b", "votingAddress": "1GgmVZofPsMzZm9WaERtZwwSLtd", "isValid": true},{"proRegTxHash": "93ef149ca038359a925ebf16e17fc2b7c8781fc5943b3db3c884ce27e31066bb", "confirmedHash": "2f4fd4de5f760f387a499b84056003cccd1e7503a81e17201a00000000000000", "service": "00000000000000000000ffff74ca177b", "pubKeyOperator": "0c047bbbad93963043cc92d9fc9f70e5dddd51548f016b9da00e7231de59a1b98ab859cd13420abf66aa4c44c4326bf3", "votingAddress": "35kXS3ebuieyne7DHiaxxpVoEXWR", "isValid": true},{"proRegTxHash": "ea44cd5acbb1aec1543853369a144b0bab5ca855d3edb608c1ec31983fb2858a", "confirmedHash": "00960cca1bd93bdfe38eefd8f7c17d3856f416e84a85b5c63500000000000000", "service": "00000000000000000000ffffb23fec6b", "pubKeyOperator": "0c261f446b125fd803d4cde523eb5e94d0d43f264e2808c52e389053c2e2825d275669b9d6fa622311ee1ca0e5b0e254", "votingAddress": "2QqBLA9X4bGs9iYvsuJ96XFcPacd", "isValid": true},{"proRegTxHash": "58631b25972a62e6d809e307509a3262199c76862fa0840b8b1b1ca449ad2d4c", "confirmedHash": "a6f3e3fbb42ea187b710bfeb657c49d5785abfaaf1c323870700000000000000", "service": "00000000000000000000ffff362511df", "pubKeyOperator": "0e0b56133000c0b2ad6f357cd04afdd7cedcd083f248f1f909f8598217532a769324c352c21b8e7a8d85923815d7e080", "votingAddress": "E7xvWQp8Fj1PYuUWPCS3V4BAF4N", "isValid": true},{"proRegTxHash": "d1310d31557a7d68c23211f1fa6e07d2e429983767e1afe575afcbfafb5341ce", "confirmedHash": "a1c4e4958182fbba80b3177bca14b06996e592fc29d32d414100000000000000", "service": "00000000000000000000ffff52d3195d", "pubKeyOperator": "8c2c18d0a8125aaa8f5fc6ac2f1885292149ec5b3137cf9e856613f1eeddceccb95c01d654c2649e864e8e6b0f16ada6", "votingAddress": "2yrK9WjFj33HGUgFC8qabsxheoU1", "isValid": true},{"proRegTxHash": "e6b2b85626ec4d6ccf69ffdf306831b90dcd876e386dd4add1d47172937d6c68", "confirmedHash": "e8a3d59e79c0d510e8c71f5f99176e9567a2bcf87a6676000200000000000000", "service": "00000000000000000000ffff9de676b1", "pubKeyOperator": "8d10d31ba0a70f200761b7f437943484948e74d0507b9ccd1b162eb0056a12765bd283af7ddc2bee71fdab7ccd639ad2", "votingAddress": "2NpWF2PqX2v9Nu3fwq1ra5ieFShY", "isValid": true},{"proRegTxHash": "9b69baf056618b305903354eea7fbf488cd6348c37f73c32225c5f31a9381883", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d586b1", "pubKeyOperator": "050e809e276d9e24b72e06ecca26a9de5fc47663c851b819a3bc64a21323e8f806c5859bf14477747a4b0474379fc5ee", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "da3eba7ebb559ff7354fcd5cc67b040ee83fd1afead745d1cfa6eb12470af8ae", "confirmedHash": "e3dbf70717f745c72f584edd07d178d603e3f3034c5c46961800000000000000", "service": "00000000000000000000ffff9b8afd4e", "pubKeyOperator": "93bdee88449d333acf4f27ead5c68af1a6bbd577eac41087c277fdf2e3a9a93e1a77a1c62e67e2e6a3282a3d3da73266", "votingAddress": "2v9fqesoheXjtHEcw5TTsNCphNKD", "isValid": false},{"proRegTxHash": "8975b32b9c8fb3f7212f7150d62bd32836a6dbaac3ee4db3e551f3007b742822", "confirmedHash": "8878f8c4f0890a4d52aedebea2e4e3a7590c84094a1fda9f0100000000000000", "service": "00000000000000000000ffffd41868e1", "pubKeyOperator": "9860dd6725d8888d317c3e0d905fd60fa4dd10b5edef93c942853713c4991614aff4d4cf776d2d33a93d57cb11d581db", "votingAddress": "44w3zS9RiruF4bHkrW3weaKFQaZh", "isValid": true},{"proRegTxHash": "42ed3624e76c2fd116c716157459dd19cbad008c4c61d3fddb3c9c802fc55ae7", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96880cb7", "pubKeyOperator": "85b8b319c8bfa98483c6a084445fa0d57ce112af7f8eb3242b3f7cf65e0436020b0602764ad5dc1ff832e3143ecae66c", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "5fbce54bf1b3452d10c4e81c43b5b3c2f1c8fa42956bf2f4eb062332acfc9bd1", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d56e5f", "pubKeyOperator": "08dcdb1624c0c260b9bc3f9853eb1467318b237c307fc15bc45d58db8b9f12181163b7b6e3a2947b3ef3ea2646e365e7", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "6abbf0597a33fa0473dc86c26ffda7d0d9d55fc7b707a42819d24e214a96efe5", "confirmedHash": "0b1e5b8b6bcc735291d0e1e280d15435833406a6f35ed5ab0900000000000000", "service": "00000000000000000000ffff2d2072ec", "pubKeyOperator": "00619ee97cdb2c47ead9f0a311a82ef6b25aa7d84e7da872d164ab0cac0b87d6235e30305d5f5cd00de72eb3571f8729", "votingAddress": "4H7QtMtwWVcu9EsAbjBe3LpcWgGw", "isValid": true},{"proRegTxHash": "03b05ab6aa5ab27adf6388436dc8bb2726b3a973b710b42e927e12628ea84332", "confirmedHash": "a2a6e88258e80c36011d892008fea0d155f740cc43a798eb0b00000000000000", "service": "00000000000000000000ffffb280aa6b", "pubKeyOperator": "95bf391ca77be9afa17b6aa436b060514316bdee279144667d9c6c8f263a84863192752e18f3dc2cfba339744daf634a", "votingAddress": "3JcA1tKmeUZpfAYxst44fPUMkAQs", "isValid": true},{"proRegTxHash": "8d08b244760d29a9fd9d60a1518fc6d0aeeba57eaf9d43399dae9245a9cc4b47", "confirmedHash": "2a483889905a2a85a8831d16ffe562f05d7c4e2e61bb455d0300000000000000", "service": "00000000000000000000ffff55d1f1ac", "pubKeyOperator": "16fad841f101795433bd16d9eb44f18270c93aab9d4c899800119161d3d06caa2268780aec6cf53efc7b5b258e7abbaf", "votingAddress": "21qCmpPZJHVBoQvK841xYrLdjzqC", "isValid": true},{"proRegTxHash": "d44f28c4833b6bb01fe09606b20ae315853baf5a7a0263e23abc40cd3fbc9855", "confirmedHash": "d4cfbcdca20f9690dcc9ca3470d55b1a7263bc5af32c39781d00000000000000", "service": "00000000000000000000ffff88f46346", "pubKeyOperator": "18c187875a78f71e3435943e135a75fd792bc8fed19cb121f18b9b1423ec00bf2ea65dcc6dda1a6ad9c9a90cc1ef796c", "votingAddress": "hWAxP61Tfe4Azt7uDyi1UcjepB4", "isValid": false},{"proRegTxHash": "c104435b3717172f889dd4cdcb14b6eb6649522109bb5c41cad12947078f2d18", "confirmedHash": "24ebcd978a7eae98ac746a74ba422e7a01d325f11e4b5a4d3000000000000000", "service": "00000000000000000000ffffb29d5bb0", "pubKeyOperator": "11d42d5d527b0c969fdaa6b697bcfdd49821774ce78e77b803cd54b46f07a6153bab6eae4fcfce0f3396599466cf719b", "votingAddress": "2pE9DhUfivMdnyXprrF1rMZfVk1t", "isValid": true},{"proRegTxHash": "487c01aa5969dd91956a0f28268e5a3db462a0be0ebf215cb4ac9d6c2e7035ad", "confirmedHash": "2361df2cfb3dbd626bff6a20f35d1ab801a740bd10e5a7c31900000000000000", "service": "00000000000000000000ffff5f553640", "pubKeyOperator": "0b28584f67853b6d542189a6ce71697fd41eafd04e548712897c3dda2b34ee734f97a5476f54037af81bbd05bc2176d7", "votingAddress": "3cK9Zz4rHiXqrQZpk2Ai1BwjjiEe", "isValid": true},{"proRegTxHash": "2d34df681821a0e560a9b655413d39efe72ec33e0e9af5b25234974179bcc500", "confirmedHash": "8a0360338b0fa88b42a3d89ad51f37082e05cf8ecefc80e60e00000000000000", "service": "00000000000000000000ffffa2f31c30", "pubKeyOperator": "9207067c11683eabd3b86882557d64b9665a99b1fef07d6a58088904477da335215c619b0a65eb394f73e613dfbb9ad3", "votingAddress": "3Um5mi67NpGVNQRh2qvrmYiiPQ1R", "isValid": true},{"proRegTxHash": "6a06c9a633c33353edf73f23c484c3579cf64584b180c4df572e6a2d2e58ce15", "confirmedHash": "d4d6cabead7ddbfd03c09cb5d38f89bfe8fcc4be61b955d71c00000000000000", "service": "00000000000000000000ffff2d209ea4", "pubKeyOperator": "09dfe6992b73f1fe8e0a47077996e731ed1abe3c40be21eb68b8fc42eac6b3fc088ccf0a61d45ec6c041ca3cf9d5d90a", "votingAddress": "2t8AurggsC1ZQ6KQKfoaqMrQ36u4", "isValid": true},{"proRegTxHash": "88b872ed8779d27a0445cec22c92a333857d14bdf7c76c84594727e94e7bb83e", "confirmedHash": "ffd4c4464f3652bdb66a7705e86eaf56f1f43359ac6f65d41d00000000000000", "service": "00000000000000000000ffff58630b12", "pubKeyOperator": "0d869948bb27b0f119d27f45f3de6f7c13d29f366c3dcc73938be5fd35d90ca72e68b0c58fbe42927bd65818b292be72", "votingAddress": "2B7jezA4Hh8tnHL2YfLPqUkDXWx8", "isValid": true},{"proRegTxHash": "63748d40845ef5edb657246da014e6d6c47ed612cceb7681209f505dce87a576", "confirmedHash": "c68271b30a9c3780d07917d65f3d3832cbe787c71b8ebc130b00000000000000", "service": "00000000000000000000ffff2d2172b5", "pubKeyOperator": "91b5a307c0c1bf497ef6ae27ccefb5deb5dab266c5859f84d36741d73dfea4900ae620677df154e07799e8df1f25abc8", "votingAddress": "2b62HheyMXm74Jt4xWokd7ukreyM", "isValid": true},{"proRegTxHash": "f5ed786b0dd49cebce1d2577ea36886bda31a1204249e33bc42a575a8bc0e82e", "confirmedHash": "d62b0cad4466579c6a69de94327aae76a473145a1169e4703200000000000000", "service": "00000000000000000000ffff2d4c84e3", "pubKeyOperator": "19989351bc2b76c112f4fda16dc4f7884693df7be88a5ad8d659404ba71fdbbf4f1716e3bf4cdbe8d7a35c1f79f0de3f", "votingAddress": "21Ntgmwf3VF41vFWJg5TXxkXNwMC", "isValid": false},{"proRegTxHash": "4d9c7c77dada5a92fda68b04ae35a6fe4a299e460a526ff830dd83567b722821", "confirmedHash": "c651070dcfd5d95b9682ada0ed11cc352e05fb15969ebbe70d00000000000000", "service": "00000000000000000000ffffcebd94c9", "pubKeyOperator": "0d34f34b2965e56761b22b1a090d73e69d8dc6bc87997b9ed044ac1ad4d3078e0b6bfd9c045721d4d78121e49e5fb6e4", "votingAddress": "W92rE3qbYus3z8hxBcMvgmEKahv", "isValid": true},{"proRegTxHash": "bfac08d4182121db56b331cdf1d4e069ea9c30236f247dd337ed44d8f4d8e10c", "confirmedHash": "fcaac8899d2cba9dfdac0c945ba86965eb9a77c8c154274f0700000000000000", "service": "00000000000000000000ffffa87757cd", "pubKeyOperator": "87f46e7cd0147b3bba57b705c2b5b6f3bfda0a05b952d9b2ce6f03bfbd3bd73b22aaa9e6c67c24231391e3f9f6802e43", "votingAddress": "2f7zRVrovPqcTKKDeuXiP55sfNc5", "isValid": true},{"proRegTxHash": "a6c76c9905bbc6983a2ae733f0b9b52c571fa83d571bf2193cbeb99fcdb0d7a1", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff03636547", "pubKeyOperator": "8edeabacc2b40d516a45e266bd48b05d90bcbd669be9e845643df880adb34df95f8a40213e9b0e77d99409f26d1ac166", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "c1803063ee5ed56405ea3691321c93adc15312b4bb30c94f633b1e8ebdcb1eb1", "confirmedHash": "796d2cb520af4584d5ee4062b8e57e1450ed4c20661874eb1100000000000000", "service": "00000000000000000000ffffbca615b9", "pubKeyOperator": "081e63cbde87a6b88041b47ae65b35ac74c63d4819c9c3e491802b338801fb0a0ff9a66aed78270f7da09c6b8070a43f", "votingAddress": "3YRJRhsV45bh148bmLZBfjLDkX9h", "isValid": true},{"proRegTxHash": "30d3925e06d69b1cdea859bf775704f65b2a8517ef55aff4be29fbc91620687d", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d562f0", "pubKeyOperator": "8d6d4980448bb8934f8401ddb830cf30d0f331d62e04c38bf22df0471444a60a1ade3418d2be5e4c131da86252f783fc", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "586d4af389db354c828ccf37fd7a5f5c96c753cffc52f2fd3953690a03409236", "confirmedHash": "789e72f67c0d635a72770ddb09f4824ca5d78675a69569aa0100000000000000", "service": "00000000000000000000ffff55d1f1de", "pubKeyOperator": "99ade51ca556e24dc6ab49e63351fc28f045f27e5582df36c2ebe1a309426cc8ad797198f4a27fdea8c9b6ddf88d9fb7", "votingAddress": "4Dku4w2FiScsWkWw93Lf6cf4CGRz", "isValid": true},{"proRegTxHash": "90b559188e712b2773cc4c2683752e31fdf3947d5cf033729846150f1ac29f3d", "confirmedHash": "a3e43c05adcff93d62c4c6011b7031345c56bd4f789b68ac0900000000000000", "service": "00000000000000000000ffffb07b39d0", "pubKeyOperator": "06e5fac9463e522f6169445a7af1b70acd41a3397067c724ae6a177ad243db82873690cbf1eb6a826f61883e91a1a5bb", "votingAddress": "2oRviqV5rXNdFAGbcPVohCAjDgQe", "isValid": true},{"proRegTxHash": "3fde0c69ba5db530444f43b1e7b4692ad6510d262e39bfb2e1df7550fb447f02", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff343c49ee", "pubKeyOperator": "08d0e5f84c370d8d4586204de8f604cb7231c776419880fe493957edec4dea94ed3505ff60c0d1ea507d2888eb5235ae", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "c46753565e2afb596c64ac4959c8f208caeb760d3c67b6f02d6f66657991747d", "confirmedHash": "33eb6522541bdf29a72b5fb370c5da44a458c85f535cc15b2400000000000000", "service": "00000000000000000000ffffbc28e70a", "pubKeyOperator": "8021dcf2cd6a65b8c99b91a85e2d6f4f7590a908c1b31913d9ed769fb875f045135140d30c70baf61d93185a386d5808", "votingAddress": "2kw2w2CRheUknT4qnD5jjsE59t9c", "isValid": true},{"proRegTxHash": "493b8143a48f1cf17a90eab651ce2213c57392c69063d79193e3b841ec36be29", "confirmedHash": "54ca220dce6177184e60d8a3194e7046c2aad4e4adaf83190f00000000000000", "service": "00000000000000000000ffff52d319c9", "pubKeyOperator": "8b63f059b1e8dcd492a86f9512af2208fde1c99f4c13007f2a6a358f5d5ba2c2090ba19621825144367e23ddc10bc6de", "votingAddress": "4Qg8miJXoxa1SzX8nBNPPJxcJ7qe", "isValid": true},{"proRegTxHash": "a74f61c0bcae74b3fc9f2f01be4e1fe9ced2ff94cd50d556222fdfe101e40298", "confirmedHash": "3831b4c6e723d8d7a91691a94bb17b932e04ad830041e52d0800000000000000", "service": "00000000000000000000ffffd447ef4b", "pubKeyOperator": "098c4f7e8c28dcac4c13972728cb28cd38a6c5db9f2db8d377b258b225e4f81478f6172fdc385d9d4a5077412aa7d95c", "votingAddress": "ANVNDhv53oUUe6ys3XDEYMNCT6D", "isValid": true},{"proRegTxHash": "d705e6f97905f618daef586460b2b63c195df704f7fe7eca21c69663fb0ac6e8", "confirmedHash": "b82ed978839adc127fabe7e0937ae10a92e1af1b172a72ff1800000000000000", "service": "00000000000000000000ffffa1618ca8", "pubKeyOperator": "8fcb43f8ae9f9535ab38b62cc78a266f70f90fb6dc0cf59e6b3c07796ed0829555f935ac62650409493eec4ec7981a2b", "votingAddress": "4MzwVE2fvoS9HUfq8P34njCxnZ9v", "isValid": true},{"proRegTxHash": "0c92d33d6f0671ffac18887dde689850673c9680f8b899edb7449a1d55f1be08", "confirmedHash": "1b524c336c98c3672741abf52d9e5b4197a6db9a218d78db0400000000000000", "service": "00000000000000000000ffff52d319a5", "pubKeyOperator": "87533414b8dd916a726cd11ef2b2c3f5be32882991908f917f354ec5ed39eba2101e5552011fde5a41a0dc59feb9552e", "votingAddress": "9Wxek9kJXMe4NW5MGYzULJxU4fH", "isValid": true},{"proRegTxHash": "cfcbf94521e342d2d5f4a205a78ab1bbf3c3ec865f2da2dd4460a82f44e034f7", "confirmedHash": "02d7d964cef6ea8cc2aabf070770450c4a7ce4d48d653a0b0400000000000000", "service": "00000000000000000000ffff8f6ef860", "pubKeyOperator": "13aed912609fd287cada72848ed03d3db607173c30254672c01e4c998a2f0a93636cee444e3ce78a5e74936cedc064b6", "votingAddress": "FT6UnaHGohFReRNSMiifG24zLCQ", "isValid": true},{"proRegTxHash": "84428769381147abde93876c9325a87425d2aa38765a8577bdaadba0b0fa1b19", "confirmedHash": "4da5c6fc6a01ff072916b7f835414dbc0ce665133f3ad42a1e00000000000000", "service": "00000000000000000000ffffbc28af42", "pubKeyOperator": "04030d614315516dcfcf2a0be426603c4e08bf33574ae3afbc3f9a0a90f2cb4bc6735b0430a5d084175c261efb0f4544", "votingAddress": "4TiakXxEXVhsMAMSNiYs3fCauWfm", "isValid": true},{"proRegTxHash": "23f1661c09681bf30be6547a260f9526eede6665cf3aa8b265af54d36990a511", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff968860a1", "pubKeyOperator": "136253a562fa4000148b90be87bf96c61af46a23fa715a97c8c8a5208a4b14a41144a70cd2e92670448fdec1a44459ce", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "2266a85a937b644edd2f7d0fa708cde55b08513e5b06452bb744b08ce9f651ab", "confirmedHash": "99b3d0f943aa2807a2f0f30a375efbebf6ef1e51aa5c2a862200000000000000", "service": "00000000000000000000ffff2d3f4e72", "pubKeyOperator": "9947cb689ad8d8d400851e1d54808317a0e2c932faf7e8c20041292f959f4a57e6e8336278326193dc5b5e1a38932524", "votingAddress": "bzK9gzcoVwwUFkHsW4Kq79WquL8", "isValid": true},{"proRegTxHash": "5469c7209ec9f7707d94af94129be273d9deee925a1be69a11dd92d3f48fcaaa", "confirmedHash": "78994400be76144202a1da8ceeb7793d24ff007dff555ac22300000000000000", "service": "00000000000000000000ffff22e086c7", "pubKeyOperator": "13d5d0bc417a6de61c54447d7fae9419749cb7c5615ef0521b5a2928d1a62f713bb59eff0e572274f5aed5358f89f191", "votingAddress": "2SJ88HiKhbic78PXTHwMfCWBiBQU", "isValid": true},{"proRegTxHash": "1d2ff4d3a3bf1bd572c153d00be0616061b4f3f2c1c5f3e8a255841a084ccaa5", "confirmedHash": "1bf2b90cf5f3b9b0cfceb34045b33a357315dfd2fe4384860a00000000000000", "service": "00000000000000000000ffffbc28f168", "pubKeyOperator": "927d0053ef18f1ae6c0a2b3fd5368f315dc44ab246df97edddb5b662af91c8b80236c6e15ad7bc365bcf6fe3eb4c5355", "votingAddress": "4AvqAKFYvPNRps5rjAuFAr2nJqvF", "isValid": true},{"proRegTxHash": "e06ea2af60070b4b5bbffe90cdd3b15c3dc2b0352d018a361a5307f87ce13422", "confirmedHash": "fd7d68be7b4393f33d67bb486d3a1f84ddf24896e266485b0500000000000000", "service": "00000000000000000000ffffa877530c", "pubKeyOperator": "807946b5f660f13521902feca7674c106eed33b89c3cf8dcf4368fc3608b0e93e031eda074ce47218b400107a1016abc", "votingAddress": "hmL5ZyFtNjncpDR6fnHuPJ9MwNd", "isValid": true},{"proRegTxHash": "43f0625263004ac4bedb0edc1fe2fc158f805e2d277d98b35160a8f79a078a9b", "confirmedHash": "3e7141b3b2e001829317b1b0acfa85ad223589654926a2382900000000000000", "service": "00000000000000000000ffff52d3155f", "pubKeyOperator": "91d3bd3a83c25b6eb25d70af6f31743fb9280a2019444320d8429d9cc3ccdddca73ad916adcfb8c0bbdaa58668bb7ba9", "votingAddress": "uESc8oZPV4gWyeQawd3qNK6x1wx", "isValid": true},{"proRegTxHash": "e3a3152047be59f4c6fc3603860aef17533f64b298912d3c13db262f851fa4fb", "confirmedHash": "23a447703fb5acc020259309794341219842c96270a8e8d31c00000000000000", "service": "00000000000000000000ffffd161bc28", "pubKeyOperator": "130b1232750e1745f96d6424a4ae8f5002350dfd55eea9d9dee55d2b6ba238f3533fb3a9b5ed72651439c17406f27462", "votingAddress": "3FYWst3gVdwWuxjX6uFYgGQdZw2j", "isValid": false},{"proRegTxHash": "519a01a634b78bffb09e55b6928080ce078c1d73a12ff5b48744f57a763c8845", "confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", "service": "00000000000000000000ffff2d4c3a71", "pubKeyOperator": "02fbf0bf5a79918fb6678d76167f9461e94e2402e8427f143a807257e440de888788c45940028a3d8c841ea39721b52e", "votingAddress": "EcGryp4yR1LawZVmRCpbGuT4f6z", "isValid": true},{"proRegTxHash": "8ea916eaea4652b872828da7c1c80bd8b0d90b62c10a89ed7a9571ae5f4d8427", "confirmedHash": "b8a115a64ce184dd2d3d7d73bf1447b756d4d5076d519ba10300000000000000", "service": "00000000000000000000ffff9a7f393f", "pubKeyOperator": "8c3f897ffe8cdf46adcf24e0d839232a83b45909256785002aee9390dfb4520e21e66e73755dabb9a9dcb38da83d550e", "votingAddress": "3sepmd8XD2um6LnCCULtXvrVU12y", "isValid": true},{"proRegTxHash": "05b24739786ab0e8810f26f5c9d0337626f3781067c8e84d7bacf34f1bcb9930", "confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", "service": "00000000000000000000ffff52d3191c", "pubKeyOperator": "9944f7c4990a45f0597812400cd3db875d312d4c4f5c180a276cc6a8e3851f2f32baef0148ad5158375950211c5bdc5c", "votingAddress": "2h9BDDLTKeXXJyYNSccBrGvegFyr", "isValid": true},{"proRegTxHash": "d4b580fe518168941c010004e5199e1342c6ed92c7e9f1da14bc2d1980772e52", "confirmedHash": "cbcd952a5a40c5190752711c00cac71c583c25719a9bff170f00000000000000", "service": "00000000000000000000ffff2d20e934", "pubKeyOperator": "0735dd3d91fdbcb36764733c55ecf71a28e76221ce625ac76d059c1834d56e44f94d33af03c4b331c7b1eef23302311a", "votingAddress": "331ixzePUPaGPBcRUbT6FwTYjiqg", "isValid": true},{"proRegTxHash": "96ac036d425b197f0201c979c60e30c28bdc140f4d344bd461686c75e3410b5b", "confirmedHash": "cb69a7283bda6001000c944f8d97eed30898120f07f7e8a72200000000000000", "service": "00000000000000000000ffffb23eacc4", "pubKeyOperator": "86edc104d6c17fd2a739c272e3251d6bea449bf24937a78914e0b254e22dff4fb11d5cd4d18e2df1ac4957369e05822d", "votingAddress": "4FZimwdWs3pA4qK1i6eUGXfqndTT", "isValid": true},{"proRegTxHash": "d0f3f5fc86b3d319260217276fe14a8fca7574c79d0c0abe704fd2f19ae74a8d", "confirmedHash": "a8711c4c379c28552edf389fbfa83c0718ccb547713c777d1e00000000000000", "service": "00000000000000000000ffffd8bd96a3", "pubKeyOperator": "8a941a65f890b179824f4d9fdebeb598e57d79adbd2faf1ae48dd536d1ce8e274c68ca5d27850bfbf36eddb03b25aa55", "votingAddress": "kzL1gQjtMgosoUhXvghVwgKSE7K", "isValid": false},{"proRegTxHash": "90bf9aabddc6cb3382450c16828d25686272686c9ddd24917ea5eac27306a9a5", "confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", "service": "00000000000000000000ffff55d1f197", "pubKeyOperator": "8f9bb3d7ea19782b1488ef520545ba0545566c3eb414b32a39b8fec92ab7032b24285d0eafcc4023a0f4f321d9f289f2", "votingAddress": "XT3Y9cqRGsfnT1pWx2kebFa5Gdp", "isValid": true},{"proRegTxHash": "5b57de15611c33e418a39880f6dd830a36bce8a59b0f486fc24c0ae989fc5350", "confirmedHash": "14bdb36fd15f2b32b424d37dbf58c86342f670fd5badacef0600000000000000", "service": "00000000000000000000ffffbcd47c9b", "pubKeyOperator": "17d9ec4aab07430c2999dc6c574925f6160e2ac56098fc7be730600c70b35fb07b5e3d214f495f5d1dbf549a80aa87f0", "votingAddress": "3ArSEo27A5hvAseXF1Cf6nbJnaU1", "isValid": true},{"proRegTxHash": "7c2128330067e93f1c43d1f09308854bbe0bf24f530f730fabe82ddc7a0dcc25", "confirmedHash": "cd451cd35ff9de9e9a5d70156c0b7ddcd16157daa6619ff33800000000000000", "service": "00000000000000000000ffff2578bfa0", "pubKeyOperator": "8b50292b8a41705511e979d32c976b6927ffe66ada963fa0285daad9cc6c21c1ce6c060f3923f168b396833445742365", "votingAddress": "4HoyzaxpM27qpL9NqybPgeBgFGZT", "isValid": true},{"proRegTxHash": "d24f6fe4a40f205a0a5a18660af422783c68f9a8874d7737fc3ee8abd0718315", "confirmedHash": "cd1e9a0715f8168ddfda57ec446a907741af4bdbe3d946b60900000000000000", "service": "00000000000000000000ffffb23eab45", "pubKeyOperator": "8321e91b3a474049237d9b6238c7476618fe9e5c352b140e3f399341bc8954151da5738f7fdecd6cdaebc044ff8223e4", "votingAddress": "3QamSvDDzqy5fdkPBE5oAWD8orM9", "isValid": true},{"proRegTxHash": "74ea93bb5b2d6bea7031e8ed18e8c097749beab183d03a070efd76560319335b", "confirmedHash": "bde1aac66e556a06a363b94846352fbf6299b142bdb2392d0b00000000000000", "service": "00000000000000000000ffff8bb48dea", "pubKeyOperator": "0e6007b8598cbac2076c0f46087322ce506200cd2e12d5ed1c36dcbcf459077a5700807dc4923237a57259c70871ff1e", "votingAddress": "4Qy6PsfdUMqgE52BpUv9vTpbKELq", "isValid": false},{"proRegTxHash": "720c7b20bbcedd475063330e84b72aea228c586aed9dd552b2f92af470a0ccd8", "confirmedHash": "4df208776c9af2fff8ce3078d0de87e1ae3dd70bd2c8ba7e3200000000000000", "service": "00000000000000000000ffffa87757c6", "pubKeyOperator": "0e062962a5c47095b11224f1c88269937832e2660f3d165d216ab03ba6442e92fd60a4eae834a2de05c45a40f06e5d4f", "votingAddress": "2p87ndkRj1PkUnX8ibU7Tcc9FkpT", "isValid": true},{"proRegTxHash": "18390474dad5325d548cc280c6c276438cec84b6697d22d1339ce3e685ad250e", "confirmedHash": "55c0ca77c9cdec9f6efad6566e5914f881435ac8152069af0700000000000000", "service": "00000000000000000000ffff55d1f24f", "pubKeyOperator": "8ce2af3bcd4984357f0567fb054659643f05bb827fe12ada575c9d64b682a019b96483ba043cc707460c1ad27e575a23", "votingAddress": "4CtbustbaUn5e98Jh3ETmAAJbPUB", "isValid": false},{"proRegTxHash": "e993e47d4f42bc68917146b2bc686447599504cdc694a29e7bc1ad1205ba595e", "confirmedHash": "04d29a080ebccf66ca562aeccb08cb0e245c6e676a2c1e630400000000000000", "service": "00000000000000000000ffff52d31990", "pubKeyOperator": "0f20a3d0ab081693970e0a3db27b11db6ec7b1d57d30b150ed3577e1d70aa2cb085a0eee62102123b96392f4428b4dd6", "votingAddress": "25ap2MwSodjp9ppFFWTNoTvxdGzf", "isValid": true},{"proRegTxHash": "f6f14cec10195fbaa15b8b94021ac102cb2c73deeed3c4d81306c4f8077f2e10", "confirmedHash": "294459769bd9ed84a87b270a49e1a837a35a3d2a52db01260c00000000000000", "service": "00000000000000000000ffffb2806778", "pubKeyOperator": "03f1c15a32c89cbac9277ff9b243e8c6a5b4267181e7e0800776efd8d9993873232eef1587ee8e7702289c99d5a11de8", "votingAddress": "3ctXpRQgT3SFwauWugHTkEpK9BQ5", "isValid": true},{"proRegTxHash": "7076139d1fd0c8cf1e012b9acaf90e29ddb8e4b0fe6a863024bfef604a387a10", "confirmedHash": "ad2b57e7b5e84facd2e0dde845bc01cc29e2f571421f3db61300000000000000", "service": "00000000000000000000ffffbc28f162", "pubKeyOperator": "087d2baa556e449aea300e61721d9be6a6f00243dd3475c5e5a2da4a8e6ccc6d2bcf6f48365512fcab8b400b5a9ab951", "votingAddress": "31YbVNeT3gwrb67ZgdvDYPxBLGne", "isValid": true},{"proRegTxHash": "763138c622ac9c9807ecb5d69bb882dd4ba2690deac24675cd4e9124d2a4f493", "confirmedHash": "fd15be3922495f07baf6b0cec05286b08e01bbd1b0ef74b70b00000000000000", "service": "00000000000000000000ffff86d1c50f", "pubKeyOperator": "93eb6685495987279171cca7537c7a41554ac8b791f75e1c2decd8a80125cb3d8fb08745878b763e81625991bc37f6b2", "votingAddress": "4DZpTavTb3u3Xte14gcSMJuUFCc5", "isValid": true},{"proRegTxHash": "61d0df9abad847210c3d285186a3d21f649cf42087a008b432eff29d1321f2cc", "confirmedHash": "b1216f9453e51773579e24ff71c24a896d36d803d605c7b10000000000000000", "service": "00000000000000000000ffffc28750cf", "pubKeyOperator": "829c3680fd40b82c231e7dc12342d5012234aca8a597531d0c77d720896b08de8b6f1d8fc9b91513389743793d31bfcb", "votingAddress": "3kvoiyUgn5ab3g3XhB4jrnLC5xBb", "isValid": true},{"proRegTxHash": "33181c70746034cc5f3086a22282dd61f54aec958f257c64480ed1e0cf557568", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b064", "pubKeyOperator": "8e62a98da16cb5c3a9812e4705599dec5fb24e838bc391ec14cb3990a3ec33777a6eb36d22b3b603e6073252c0efaf06", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "5f3569a8ceb8ce3fd7891a91854242cffb63aac80076af4875e9a1bd98d7fb7a", "confirmedHash": "68100529972aa198fc8ab479241afdefd5eef7aaeaa9537c0700000000000000", "service": "00000000000000000000ffff2d3a3840", "pubKeyOperator": "80f476c5fdfbe9fa41c814baab634281ef7aeafb2d0c66e07760de09a2865aa8d06fb221bcfe1b8bd19b548a1c3f31b9", "votingAddress": "2Bc3C4hwH7eaGrK8mRfzbodxaybQ", "isValid": false},{"proRegTxHash": "3001ec8f87dbf6ea15ac1a7ec9a26b2282ab3746d339f95294be80b2825535a8", "confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", "service": "00000000000000000000ffff9f4148a1", "pubKeyOperator": "85e216e58ae3ffa72235597fa7f0b24d3ba8761a3a2608ee82e0e4d1daafb02f6af103acd32fc90af7b06ccd3994b4fa", "votingAddress": "EdNeUqnafFm5x6hKbxhReDScdsa", "isValid": false},{"proRegTxHash": "8d893093154110193f9c62eeb9e8d3a6d6cc04267cb72ba6cbab8283e690cdb9", "confirmedHash": "719044bf2a2e5443bb0cce0acf1573c7227b832e036fccf41700000000000000", "service": "00000000000000000000ffff55d9aace", "pubKeyOperator": "121b048e191eb0a3c98a772f762535ab7925b875ca1d5cd95f3b1bea269dacf09e51bae944146b676d853e8284f86171", "votingAddress": "36QYnFFJqawtM81uLcSryz4wECyt", "isValid": false},{"proRegTxHash": "5011dc1d30e29f41014317384efe724439f4cc6e89d00c94a627822d3c052783", "confirmedHash": "579010d59365c9adde11f5b8998ecfc5bab15a3a64339fde0b00000000000000", "service": "00000000000000000000ffffb2aa08b6", "pubKeyOperator": "89fc17b7d4bb817f413f672b7344c82491bf67410d8046b5ac89a310dc3f8f1862e608261c2d83ef3ad51ae7c0c50964", "votingAddress": "cz7DjKvnKbS7BpfhGU84KGkKxR3", "isValid": false},{"proRegTxHash": "17078ab4abb09c859909139a02098fa665a41b68a0c7483e1b924b116fa16bd6", "confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", "service": "00000000000000000000ffff52d3158f", "pubKeyOperator": "0da94600ae2577f3cebbb9f919d91438831a9d084a4153155955bdb56109c29c12a299e3263f74cbc25c9cde3e4285d4", "votingAddress": "oB3t4vfojJrra1duLX3RcoVjCXe", "isValid": true},{"proRegTxHash": "e5e4691a7b2d0f716b1e735d5510bf7404df1915ef807efeb88ad1463cbf3fff", "confirmedHash": "940b37038967c460d991890c6a11903d87231fb714ade2073500000000000000", "service": "00000000000000000000ffffbc28fbd5", "pubKeyOperator": "1239c5879818919fa29176e44c3d58e2f0005121f0623919a88fdd3eda9889f0c3f0c69cc2766a09e0647020b53f0a6d", "votingAddress": "371iAfz73gRkTs2JBvUduKJwTC4L", "isValid": true},{"proRegTxHash": "52579e4fd3d57354ba3ab1811b404f6e58f6994cf561d3c9cae0fa783813cba4", "confirmedHash": "5df3dff3a11e5bcdab1de4dc5265b981179ba134c24e3daf0700000000000000", "service": "00000000000000000000ffffb23fec75", "pubKeyOperator": "00b813a012973396cb8bc298ff0ac9a135f0aeaa9d9527ae5ca1cba54c4ccae278dc2e704252fe18eb19014c51030850", "votingAddress": "PZ7xVGBBb57xZuSdZq6T1ex76mQ", "isValid": true},{"proRegTxHash": "038cfd5596cc38d475541d83bdf9dd460cce01b0bcc6ef1e1b8ad74461e0ce65", "confirmedHash": "1c226461af3dabb0419564e810a5ef14e658acd2b7165db62000000000000000", "service": "00000000000000000000ffffb951a5fa", "pubKeyOperator": "8ffb090fdcaab7c1f3957109611076fbd9f398b8cbc543126782cdcb68c3f20748f83293cf6d625973736194dbc7b12c", "votingAddress": "u4SVJhsFQWWULxJogpVLe2Sfke5", "isValid": false},{"proRegTxHash": "80f6c2f44a6dba8d96b5539c32bab5d46ccb8a4c3068d40a952d4b98a2fb9bee", "confirmedHash": "39d98cf19afeecf91293a93ebac66018148daa2e5cb6dd810c00000000000000", "service": "00000000000000000000ffff9f597a80", "pubKeyOperator": "16eef97df9e7c18e15533b0beca29a08fe41bb8e796a5594fed2d8f9f436e6809c66ca9c55362830804756ff478db166", "votingAddress": "24jQQmrgC34KEevZrDLaPV6KjRwZ", "isValid": true},{"proRegTxHash": "7b830da2e7208c3cf2807ce6357615314764abef32c03159223e15c0c389be3a", "confirmedHash": "3b9fd28a64c92441ce8ffd3578e3c836d0a9c50f75de85cf1000000000000000", "service": "00000000000000000000ffff92b98b6d", "pubKeyOperator": "97fa07e5b67c33de9eb8fa01b2e06e849c9f73da4840c8f037c15e3eba29791bbd47e2be5f67abd566b13223ed9e4e51", "votingAddress": "2yPjgFXH2awXk2jPhgQAQkCoNLfz", "isValid": true},{"proRegTxHash": "7bc3c6a919f408689b999337ce808c85761302815d1f9cd50819119808dc85db", "confirmedHash": "d82bad0030563a5b669480b1989978c8a45566066a194d3f1e00000000000000", "service": "00000000000000000000ffff9fcb0639", "pubKeyOperator": "0c4fb6ecc45234157e999b97c22f732f53c5740dd8207185368e6df8a4a1dedaa225d1275ebc9d917b839b675f6c9581", "votingAddress": "42HoMQ46cZfrwCpcDsLgV5v595Cy", "isValid": false},{"proRegTxHash": "062a2fea635baca91c9aa27ea33a7f934bc313fcf5315042864e326de302f5c9", "confirmedHash": "5ae9f7431267399d34583435a95eb7031ae432ee945c02ed1100000000000000", "service": "00000000000000000000ffff4b7792d1", "pubKeyOperator": "04bd84c3816d8fafe44f04dd44ed8d4934d41d291299cd92d65f18b4ed47f413970a426c48512ffebcd464ad4909f9ec", "votingAddress": "3z9PvpwedrXzW6q2SRf21HDGZbc2", "isValid": false},{"proRegTxHash": "b45e5fc7f2fde69cbe48b625eea27ef3d7c400289e3ff348e9a2ba2870ed911d", "confirmedHash": "e1ab267e65848e0233fba14efecc4bec5c9d113b157d13503a00000000000000", "service": "00000000000000000000ffffbc28a317", "pubKeyOperator": "888235aba8065bc59620a2b1a1c7ee79538471797745c0039b76dbcfeb08eeb4a93a61c8d9dd2dfdff4d194bf766212a", "votingAddress": "aPy1p9KcxjHCpQ8LxyaznsdYPHN", "isValid": true},{"proRegTxHash": "c6258e7cf8e5b1140ccf14ca89b747b01dd9915ecf32f4bc6cee895b1803e5e8", "confirmedHash": "679e32677c876032d14954ae3209314292cf57c37491077c0900000000000000", "service": "00000000000000000000ffffa8775007", "pubKeyOperator": "82e13971c6b3d19b0fb7e204689e2689d5f793c15e0e29b8b9447c1ef7a9b194bb7cebdb1e2b7c3e9372cd710f6a7158", "votingAddress": "ahHw3FLJsFEAn4fusLwzbPHzGzh", "isValid": true},{"proRegTxHash": "12d4d0df8c1015d6746520479626543c7d48e312cfcf62fd882e7669bf3e2480", "confirmedHash": "4a55fc9e9ff114fceb4e07b839e5b87320542046f5684e9b0500000000000000", "service": "00000000000000000000ffffb280e3fe", "pubKeyOperator": "838c52bbca910d0630def7b25fa2ee9addd27dd13d33f7b4b0022e1c2dfe8c2e08d6be527402043d1151fd086d8e9107", "votingAddress": "2RkxSAmc4QexwKjAXcP5V3WHDfRM", "isValid": true},{"proRegTxHash": "a7273132dc89f8a6cbc407561937575506adcaf9510ae1ed1a04e888081b528c", "confirmedHash": "485877cf2f72faf5748fbef2250d08152de9de5622573be41100000000000000", "service": "00000000000000000000ffff5fd85428", "pubKeyOperator": "00134ae1a8f98fa2c78159f65168f44acd171f31f0ed80d9e167028e21b1bb1aa6a30afdfc269e4c3ccf65360ecb61b6", "votingAddress": "3BikzYMtAes9vuYNaBNrP3gjZh6P", "isValid": true},{"proRegTxHash": "1b8135a14fb8eeb9a3f40339ce692bdca8368759400c93ec39fd8687a7f47ba5", "confirmedHash": "ea0932039dcecaa090930907a7e6a9382f406d9c1f2228381e00000000000000", "service": "00000000000000000000ffff8bb49d3b", "pubKeyOperator": "091b80abfd9336488e3a3e39721175b8fd6577f711baba65a636ea39fe609c385ba35222d1c85c7f6d03f782647ddde4", "votingAddress": "2UaJR9saW3DRxMgweG5bscJptjGt", "isValid": true},{"proRegTxHash": "0227d6ca5a25a8ddc24bd32ef82ecd3fc3a32b24259ad37abf7e5eade306409b", "confirmedHash": "10825a0263176fa838aa56de0d873ea86afcb7fd26e93ad65100000000000000", "service": "00000000000000000000ffff34042536", "pubKeyOperator": "91b73d91e9dba4748e148aea48e442cce2494fcfc0e7ba0a8526258f7789029810228a417e7311865098c1c0292f1fab", "votingAddress": "4GDVLQ1nDx4L8TMtYBeW2FgDX8xS", "isValid": true},{"proRegTxHash": "372b32a407d6fc4a14b9d9d01c25d9c17a73c488f273c7e564b4a072a12c09e5", "confirmedHash": "ca6c0d66e8a4593f09d57ac6f6eb5982818617083e1b95221e00000000000000", "service": "00000000000000000000ffff2d2094b8", "pubKeyOperator": "84bbcb6b0663c6242f2ffd12247bb41994c1a1aa901d73197ef9339cb84d92c57a70e97310e0b9d6fd75937c99b627a6", "votingAddress": "42vdqw6YFQx5vVLedamrmJPgkjbp", "isValid": true},{"proRegTxHash": "39bace8f9742816feb277ef747b97b5afcd8ab68bfbe42c018568bbeace4279c", "confirmedHash": "201f45c23ff6132d799a2cfac57b97b1f9d0068cf87e19c61300000000000000", "service": "00000000000000000000ffff2e651a1a", "pubKeyOperator": "812b8f074c269a55730852964448dfd380908d5b2cf21051b6be96869ff98d0ffee50a6835f116520840e6a06e75f6d4", "votingAddress": "2iTtcGhKbfcJBYqG6Q4rqpkMswmp", "isValid": true},{"proRegTxHash": "afa3fdf532c1c0eaa5139ab8f8c6341cc3970972b6cc75535e0922e6430cd71c", "confirmedHash": "f5c598d003096c5d33f4506fb70b54420ab2ef20be5994292a00000000000000", "service": "00000000000000000000ffff2d4c4006", "pubKeyOperator": "9475f1d8d73159c6e2dfff3c10d4d3a5a0c6963845dc8c6ab80deb7ee44183608304b4d4bdc7385dfb5ee48609bd4f1f", "votingAddress": "w4haWmkdotGJQnqY9DiyenJMdMi", "isValid": false},{"proRegTxHash": "ee50f85100fe2041303b961daf08ff17b3c957d0c9b4a95973c0a70327252bc5", "confirmedHash": "498242c34b98e36311e1436de20095da610b3dae6286ff3e3600000000000000", "service": "00000000000000000000ffff8b3bb2a9", "pubKeyOperator": "861327a26cd0b6fabb50faafbe6b80bef353f4d8ed05cff74e1ee8f47db490ff766729a5564c71408fb8a2be14831c8a", "votingAddress": "F94drjJwaAgTjM1DpBR1xicQJvm", "isValid": true},{"proRegTxHash": "adbe65ab9a47d36cc54c198eabc1d480a5bcc3ae5bfc9eb9a9986b109d0d8088", "confirmedHash": "dae9dd7ecc43bf8db0fbcce63b81b5a539d8e9cb21edd9bd2400000000000000", "service": "00000000000000000000ffff334b8fac", "pubKeyOperator": "17abdf552b7da89744ec9ebed5f8b7b6fb96742e3a3f7af672c2bcf57c98b7433b349b7d4f814c083d766dfaadb3d35a", "votingAddress": "3ziqjSD19EizadvAm45QVRXxRgcX", "isValid": false},{"proRegTxHash": "67860e4cf1a6f5d8788dc76e16842e9d3ed2927d819d92ed4a581b35945c36f4", "confirmedHash": "dd992594bcd84a8f934768ebc50f652e4dad9f96cccf0e551f00000000000000", "service": "00000000000000000000ffffc3b5d340", "pubKeyOperator": "078b3cecb3e253a1f6f0a0d3e7f792ad6bcde8d2518e6c518fbdfb18c71e6741b5f3a605620dc992a2bac69b4e47b4ca", "votingAddress": "4RZXT3RKnrBD3NdHYVNKF12YWxuv", "isValid": true},{"proRegTxHash": "61383f52869d466a9bd5bdc640517f83e9bc4c8337db78b4408e7c800f31593b", "confirmedHash": "45e8390346d4b25c3f16bd2860ad07fc063047038a52951c0b00000000000000", "service": "00000000000000000000ffffbc28be23", "pubKeyOperator": "08224ee6b96586f5b004ed5d8fdaaa6c9b144736b84190961d949c6f4ba3d922657a9317bc8068ac3af818e7fbcdf6f3", "votingAddress": "2QfjoVHW4SvssTkFEifwmqSd8Yit", "isValid": true},{"proRegTxHash": "09001418e9e3828401bfb35d08def2207cc9b61bb46e4790ea0e1fb4d8c3cc5a", "confirmedHash": "0ed9b5e580028f69036729daef703041c88e4c4987b6d0bc0400000000000000", "service": "00000000000000000000ffff6c3df688", "pubKeyOperator": "9615aa59e05d93d037461b039b437f0eea85d5adb962eca38f2e9b3bd0e6742e0fa2ffc1c778621e802d4cfc556f8506", "votingAddress": "He14rGP8zD8VdoQ4M4TZZwYvWB5", "isValid": true},{"proRegTxHash": "6da28a61568bec277b50190af5b1a09fbd7fc0aa892ffeed5e1347ce538b3882", "confirmedHash": "2e10838a2d1455c63958566cf2e7ae11fc2473183f93597e0300000000000000", "service": "00000000000000000000ffff8f6ebf0d", "pubKeyOperator": "9029f581eb30513f6df061b721a47f51976ff4f620294bf32f968aef2ac61af8c8cfda5d126db097e3a275cfda5e26be", "votingAddress": "3FkA5QWaVzYs4PEwXBmoxGHcAf4C", "isValid": true},{"proRegTxHash": "37cbd812dada1897447c0a11f27e3dbdf81161e80b593a9dd1e2a5f2f2efb882", "confirmedHash": "9f5b4fb62448e008e63ef94e9fea57ac59bd584cbb7fe2581900000000000000", "service": "00000000000000000000ffff5102fc13", "pubKeyOperator": "8f7cb7f065f202adeb0a0528e24f836d29a2382aed692ad9dccc352d9ffc683c9cde0b251e521b52b4f3ddc08c5ce34b", "votingAddress": "Zgf8zVenfq1iGouCnngtJ5VxLU3", "isValid": true},{"proRegTxHash": "2b03ecca19863011a6c91a6f68f49a043144adaaa2bcb07ecd39205f18b62884", "confirmedHash": "109b09659bc086b3581be21781cb1e31615dea0d581958d40400000000000000", "service": "00000000000000000000ffff5fd93061", "pubKeyOperator": "86461897c1e6def4ee73393a3d3d08751db9a8effda0926a00ffcf533f06c4c072b70da8a7a96dec177467b11184d7c5", "votingAddress": "2Zc3VENskxFLbThx1fc4Y7Xe46cC", "isValid": true},{"proRegTxHash": "961303681d8529e32af9120e3e1ff6d88acd607936ca91d5ab58bc7cf66cd210", "confirmedHash": "14110c73216cb1a49dc205a5fb0d3594fc776855b18aa3e12800000000000000", "service": "00000000000000000000ffff68ed8b29", "pubKeyOperator": "8d483f16de820a60cf56970b444b4626dbaaace4669b82fef4ba1995e4cfee2cd302b8f88e00fa246f8d10ae88c59f41", "votingAddress": "3n8XvAgzRAqTczknwS9cbE17oHaM", "isValid": true},{"proRegTxHash": "707c447132d5e5d05bc97f5785af3d993a47e3b11d27c8992bb53405e69aa474", "confirmedHash": "a9e009544142e44972f27788f2344011df4fd63e3a8858e11400000000000000", "service": "00000000000000000000ffffa7acae9d", "pubKeyOperator": "856d08dd4d5ae93c569da1000084920039b87fab682f7a3e5d3017d5deb5a7719f43ea1e019acc2346b519e97833a235", "votingAddress": "2no8QU7TiXjs3ZkYC5GZ6WD6gPdF", "isValid": true},{"proRegTxHash": "2062ef68968842880e6741d6b532438fe9e2acc23362eb694c41124188c549a8", "confirmedHash": "a316123262c76a535a9e2900b120717132e500c5cc1f9db72c00000000000000", "service": "00000000000000000000ffff2d4c5733", "pubKeyOperator": "968780ef211f70dadf38a5f4746c19f2cbf4402aff0c8e525c09834af2aa531f3a5e712d2b05c9b57bd152e09ae12867", "votingAddress": "2qipxTMd7HfxahKpagnwgrp4nU91", "isValid": true},{"proRegTxHash": "627b5df7ecce658c4bbef8767e1aeaa6fde8495b668e3dde33d817145fedf5d5", "confirmedHash": "3845e61195b22b362b38fea85eb3aee5610ae09030e7ab260700000000000000", "service": "00000000000000000000ffff6ca08178", "pubKeyOperator": "14cb9dbe909af26a278b06d03ccdf7e708140f5e063f2848944fe20175d1186568ba1983e75ef7912c0b6f3ed0329b68", "votingAddress": "49dKbbSfgtsARpFL8YQu16fdCchC", "isValid": true},{"proRegTxHash": "913d0f5b060a2ac4ba93e57f8b1508cd37ce3618b6a54cd22a2e48658e4d0d21", "confirmedHash": "2f185e2e5fe5737638d7fe3576326e5fdab60dc8bbe9ddfa1100000000000000", "service": "00000000000000000000ffffbc28a311", "pubKeyOperator": "8c9e590379dbe1b1a16fc19348179df85f7f828e3f1902271cb0ce89d1bb4ca32cab62dcb69be6bc328c09aeee4ff5fb", "votingAddress": "2uefcmNLTJNdPxNe8oEmiPfFgJBL", "isValid": true},{"proRegTxHash": "71979d9ecd029e0015dd03e02d70e4e998a63c1f76ad8cc51203d13d293878fa", "confirmedHash": "9edae6e1e5077893a1c73242819f13bc23f3e51e74cd3ac80c00000000000000", "service": "00000000000000000000ffffb23ec79e", "pubKeyOperator": "969ac25a41f9183f107b815931a3cdc691e085efe0165a8a2cb690ef2adc06b2bf45deebd591727c469b0765bca35027", "votingAddress": "4PCfthQRF4GdUW59UZ23vEJ88BQ3", "isValid": false},{"proRegTxHash": "aefe678846d2459f559fb953c0e45a2b29a7d3c7594e9005720bd0f8d2afd340", "confirmedHash": "461fb6e17a3778a7e6f1f2571257b2afa332cdcf7294b07a0400000000000000", "service": "00000000000000000000ffffbc28fbca", "pubKeyOperator": "16cc649c116390369c3eb30d72494e1be1c86375d7cb97de85443e3f5f0f8415e4750dc9c6d855de76278aa15296de44", "votingAddress": "4SQwjhAUjmQzEp8ZfzTLVEfWxFhU", "isValid": true},{"proRegTxHash": "c0544ca1f99a4e3a0d59d8e51a295552e787f6bd1f6df36ac572a63f0c1f0b23", "confirmedHash": "c3b534373db00687c67636de6eed1ddb62cff6ef7b4986421b00000000000000", "service": "00000000000000000000ffffa516ea87", "pubKeyOperator": "86b941a0a057cca4334b435a9a005026fb69b1126636ad2f82ad068eb24683b85456ed2f45e90049e30af642efff27a3", "votingAddress": "3LhsZZTySv7adZXW7crbTjd3r936", "isValid": true},{"proRegTxHash": "7fd398989b81507ae3d7c1d47f99b6af3a98381b1cbc1955342831925e58e1d4", "confirmedHash": "b7de66377ac2e6b87d77c94d6af5874ceb5fd823caba70131400000000000000", "service": "00000000000000000000ffffbc2815f4", "pubKeyOperator": "8d2acc170798aed2360777c9f48f48195ee3f5c8d071c44a195fbe2e44be40d35f4435f23ef347a842e194b85ec00534", "votingAddress": "42QGA38pgTwY7nEd8zFjDxAT7qR4", "isValid": true},{"proRegTxHash": "748cbdad29c297ff4cdbd0b3e5ddea3bcbdb0bfd4e4cccc47390d27b51317726", "confirmedHash": "d32ee03198087f6d4b8534a45c431b228f60f764486e0a330900000000000000", "service": "00000000000000000000ffffce511d1c", "pubKeyOperator": "0f5b1505ed46e9855bc7c1591d3a86652f226be839e51fa2d0d5b285d84b738801329022f3bd5f561c6344bf4a357071", "votingAddress": "tybAx1TPXLYwZGyQytzWjDpGC6P", "isValid": true},{"proRegTxHash": "4cc21a1153886651c408e134c40c2807bea95c1cb2de49ac3b9d0806944b3f0d", "confirmedHash": "fa531e762ff787cb31fbc72d9d7d24d6da417ba0ec049ad40700000000000000", "service": "00000000000000000000ffff58630b1c", "pubKeyOperator": "8643390fbe3b49eb18457bc45c6f81fabf39e6e4809e9e1e1d3213c30d74274afe44fd8a6db348087ceed7d303f8f5b7", "votingAddress": "3MbdwocHFHs81TEtRCdGCAAT8vE2", "isValid": true},{"proRegTxHash": "1ccec6b37bd5e4fcc95e8d01f86cab976038c01f16b08b1d2ff543058ceca2ea", "confirmedHash": "5cd1aa4754b4450f944aa2c0152da08d452698e9b86ed6b51400000000000000", "service": "00000000000000000000ffffc2875b51", "pubKeyOperator": "938ed4bcacfdeee802c2a294d18352169f9361fc030a69c5ae6adc7a87c7082d0ef522add1884a5ed2decb9cfc886bf6", "votingAddress": "2QArxiBTVd4TBzuLC1gaZsrY3ZVa", "isValid": false},{"proRegTxHash": "422db80f47c9480455871d1de86144c53136b3def4f1bcc766c244984c805a35", "confirmedHash": "febd7cf2dbff136eac5a7846e14a825bd5906aabfefa26030800000000000000", "service": "00000000000000000000ffff2d20f5eb", "pubKeyOperator": "17be119dd16bd6b141fd715b34f143809b66292f93a0b726a929898d6a1e2579f3864ef020b27185800a95ae50c057b1", "votingAddress": "2ShY7JFdSyqHs44HY7UC2Ng3h21E", "isValid": true},{"proRegTxHash": "dfc1a51511896dc6a6b27076b367534399bb5fd0959eb94110f208e39bb55b24", "confirmedHash": "9fd8650f3baa8ef3938d7a45a2ce5b96b5fe3baf5ac357870a00000000000000", "service": "00000000000000000000ffff55d1f1f2", "pubKeyOperator": "08d62584c492ade4aee2173b0bb43fbfa30631317bf12c344d7f38fe9d048a747ec7a3c128074bb84d5cb7ba465c7e53", "votingAddress": "2zRTCnCjcuf6ti6Dq4Pe37KKQG79", "isValid": false},{"proRegTxHash": "b73d4571c4c8e2e1c7ef9e3c8b00f8dc186bd249f0ceaf43874990add5798199", "confirmedHash": "efd5db6a8e5340a465aef98e8fd50c9f5457bc33f30de3690300000000000000", "service": "00000000000000000000ffff55d1f201", "pubKeyOperator": "9666a3c9f5eef640f96d3eee59b8f6498bdd055c7ae4b68a046477a908b032c01fb58f0e8e29eae6c04ddc9b51a54dcd", "votingAddress": "2JVwKbxXBdPfSZEahrNR5mcXfyLS", "isValid": false},{"proRegTxHash": "db8867960073de49c314abd10c65e799c32b35c6552ac28d32464227dfd3586f", "confirmedHash": "8f2470f14efa67b45f15a9bc900a58628ec6a907f35a82ef1f00000000000000", "service": "00000000000000000000ffff93b6d261", "pubKeyOperator": "894131ba8b284fb90ead5db09ac48f412ee4ac5120c77f84241960861bcb7bb2a457af4d6bdc94b4a6b4ce868f8194d3", "votingAddress": "ZpVWzzfzV3H4DbZzGxknwqAxBGS", "isValid": true},{"proRegTxHash": "9ef1316e7189037ba0dd7863cae1b3f590bf26516036e2e612277120b3866a07", "confirmedHash": "96d8bf1cc05bdb5ce749b2f4f99a704dbe6e2e54ddf857371b00000000000000", "service": "00000000000000000000ffffb945341d", "pubKeyOperator": "8794b2e818d32974e727fd4b766a52a22468792fae65d4d37b78de0b986469d2b3ff80d5200ac3ae50ca6b8f13af12a5", "votingAddress": "4UCBjZLHn9WyM8rTj9SdRPAXq1iJ", "isValid": true},{"proRegTxHash": "17c5c6a014a1b04020c3a5ee4e50af134afa2be0bcf4347806fad09d20914858", "confirmedHash": "a5b5da9c7f3fe19c97d5e516b081f3acb90c02e6102bfb1c3200000000000000", "service": "00000000000000000000ffff951cc290", "pubKeyOperator": "085b45d987caa2b9b0301286e46f3c8203376c5a40390216dc27c02e02645a2739404c00ea258d527610a34b64dda301", "votingAddress": "2n7MxoxWVPHWbHtuazXQTwevipDP", "isValid": true},{"proRegTxHash": "28368890652ab39ec57eaf26fb9f844101c84d493c329f90d3057fce3d926d61", "confirmedHash": "a3219d36fd87140b7d2e96f61f07c271faf2b259461a08a91400000000000000", "service": "00000000000000000000ffffb9e45384", "pubKeyOperator": "0d1631266a1dda98c7ecead10d4fb3cefde865eefa1c11fdd6a820a3e2f5b52cb634ac91a1a9ffab35275f0a74d9c95b", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "0250cb92e0e80402fe293710c7ebeea576bbe90d288c88c53e02b2cb07208afa", "confirmedHash": "1cbe72176b16d5e607a0202406ee3af2407d6f4a80676cf00900000000000000", "service": "00000000000000000000ffffa516d38c", "pubKeyOperator": "0fc4f74bdc5b1c646cf6851308b85ee14e0feebdaad64087121ada27157218a7ea2dcd30d10b8ecdd3232fcc097cb999", "votingAddress": "2hNErnPFuTEXaVSpgQw8HpAoJKyM", "isValid": true},{"proRegTxHash": "37e8cd0289deed8338168872a5c9ce3511080ca7debadbd91ff8d3f332b31e82", "confirmedHash": "42d3424fda9caf91ab59f404e82ebbe3180aafb239cc4c380700000000000000", "service": "00000000000000000000ffff67a05fdb", "pubKeyOperator": "9568d0e92c50e6071312d8b415fdb2d53113cf17820ccf91d7c6cb181061ba461ddac2af6ada58d7fa27454c90101879", "votingAddress": "2xHAor5JWWTn9MUjLFkCnsuzFCQy", "isValid": true},{"proRegTxHash": "510ea5d5fac3203946921b0d2c1b96c8a54da67a44bb1429240d3f2ec61ae4be", "confirmedHash": "daaabc32013ee5a6da1abad52b8e5ff55cc03b5a62f0a0670f00000000000000", "service": "00000000000000000000ffffbc28b6ce", "pubKeyOperator": "887f0f980a9619cbc1c3c180c93a1d2c548c144f3145060cd2b820ab0441818bd435188b068b876ebe1434274eb2ab4f", "votingAddress": "2CYjnFjntpoE5WaEySXoZ1JD4UeE", "isValid": true},{"proRegTxHash": "7fe1f199334a8ab3cf9f78d9eabd41ec751b1e8e4c43dfd1a63cbbff29d5cbbb", "confirmedHash": "6a5e15a6654babe6fea0a9fc4bd0b704b270dbfd80a776e90e00000000000000", "service": "00000000000000000000ffffb0df80db", "pubKeyOperator": "071d9e58b9926745a116859778bf631fa4f0f1e97fdc604dc23362e9025daea64821199d68c985469f164ab693f02102", "votingAddress": "3yEeg9LeAtTxJyZjVrv5J7y36S5S", "isValid": false},{"proRegTxHash": "f999c81f5138caaec23b2aac2a6d3a2237635e531a4c3fe2e2034fc5f8f57f85", "confirmedHash": "4139f3754fe9986d93d164f0b368eb7411331fd0e0a8d1931500000000000000", "service": "00000000000000000000ffff2e1ebdd6", "pubKeyOperator": "0689d6578dd9cd5b7ff0fbb80705bbe797c151d618ec22a6d98b8667fc33560957ac508d5f057d019423c29d98f97efb", "votingAddress": "cPPfjY8H1aFfxNuT44uWh3p711o", "isValid": true},{"proRegTxHash": "b0976377eeabc5aaab4771929a78c971872e9fa9ff7acbd4baa9372554a636c8", "confirmedHash": "69797ae9ea4dbf5d4cae00b345be22986b6f810b9ad5dc5b1f00000000000000", "service": "00000000000000000000ffff05a17823", "pubKeyOperator": "9470fa786bab4e5ca50c9ee7bcb8847e03320f1d9c04ade66798c8616ffa908d37b534d21a1f08e07c22e62d41052ede", "votingAddress": "42TjhPa45NvD3bbEcXoJ6GGKb5Mt", "isValid": true},{"proRegTxHash": "f652b375eac6991ba5e03a5d729ae1b7a4ab9382d9025edb4cad6b53fd528859", "confirmedHash": "cda29b67ce0828b2618f89f898b47f3c596f0c080b42260c1700000000000000", "service": "00000000000000000000ffffb9453439", "pubKeyOperator": "14edcf6db72c6cc4a80917aa9ff31a2ab5f28c8a2669d64cf4e5c0b7768512e6314dc3dfed66110c7154e4e09c05a1b9", "votingAddress": "2BSbNKzkzPCdaFZxXDWbbirm5BfT", "isValid": false},{"proRegTxHash": "74e6422890f60e48d238ea606290b47f7e9c28d2aaa980b4de47d406ce2faff7", "confirmedHash": "1362d2583cedc185be1a67aa8c9094baa4d72c94c46684ff2b00000000000000", "service": "00000000000000000000ffff68eea766", "pubKeyOperator": "8a9b6271675391e46e2bbfd963590e5f5a88929d586256a3608385a423cd3005d370ba8835eba8fa4df101824de3f670", "votingAddress": "2fLa4AUx2hX77YT2abtCGrW7jwcE", "isValid": true},{"proRegTxHash": "dbb9c62adadb9f08f3d069820b22b5c38654ecebafc2a7244dcd5c52cfd917fb", "confirmedHash": "43a006e82dd3a21e7979f73d425fe82bb5b541b3e9de30fc2f00000000000000", "service": "00000000000000000000ffff3eaba72e", "pubKeyOperator": "9550b8f6a4f16715237071f1217b573c362a7d204e95a5e261011a364f1b5ac4749317a6063677a0949a5ea2459d335e", "votingAddress": "RxedhxXXqw2cLZLy9Ct1ZZuKwWv", "isValid": true},{"proRegTxHash": "127d904cd14ac64ac9952097c1de727aa2542e1c048785d1c864f2164add122a", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0cc", "pubKeyOperator": "98cc856eaa8a0e0340d8eb405bd124d254488b7133dc824347530ce20dbad7a92b9d7e3afd5e2c328c81452895b55b99", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "aafa0d040fc53ab3f1249cbaa0964347e2b6ef758d484f512d70dd4472aa7e64", "confirmedHash": "87a8bc7d8e26c3ec42e5405811af1d93ca3474f4712303452400000000000000", "service": "00000000000000000000ffff3417552b", "pubKeyOperator": "0c265e0bfe8a6fd13930dc4afe475c06b920e971dd5e01497c8e37a49c2c6e47278da5ab0bcec637e72a87965961898b", "votingAddress": "2G1kNrMD6rgvPVjZ1xaRLaN9mCp8", "isValid": true},{"proRegTxHash": "180cfc3cc1559e5fc8e45c588cceba0483296268f4b022b210a96f8089706e53", "confirmedHash": "ae2ea5adca34c03014cd2bfd8fae2533e828ffbe8cb819111000000000000000", "service": "00000000000000000000ffff86d11407", "pubKeyOperator": "12dc03ad9a001387194186f711f86e8218e0239dcf4bf3db50e25d6c3a0ba29bc03a2f26a111181069bc83da62bb4eed", "votingAddress": "3gJjC4rXTsqe1wD8quaouuzksfr", "isValid": false},{"proRegTxHash": "446bab631d518594365930d5f25821804c85a419d25481277a4139edb151acc5", "confirmedHash": "72b294c899e711b1b4d7be920f7f4f8ab9e4b775a3ce0f850b00000000000000", "service": "00000000000000000000ffff52d31592", "pubKeyOperator": "8430f7093ab6d1430ac11b829875f561f48d664c8137935e56c8a3de0951f1496d4999be7823d7a799943498c573af41", "votingAddress": "49MweeTBHXkhmSkr94Ykt8HxsLpZ", "isValid": true},{"proRegTxHash": "2860f260d3a1a2117fcbccf3e69c796376b51ff07d4d2d030f4bfd2739fc4481", "confirmedHash": "1fb9b67e5f215080841fc9a6fd5e05597c532228cf11a65e0900000000000000", "service": "00000000000000000000ffffb9053630", "pubKeyOperator": "98a55cf6a78f36ed6013589363e6a32aae336f0ae8281596bb6fd077fa1c3c72282fc68206f0e550aaae307fe45ec889", "votingAddress": "2PmAkkWi35iF2V4JYzn9B4vBrzxC", "isValid": true},{"proRegTxHash": "f5815f5993994366f61e69cce059be589352df7a9e067e4cab989e41ae16c260", "confirmedHash": "55c0ca77c9cdec9f6efad6566e5914f881435ac8152069af0700000000000000", "service": "00000000000000000000ffff55d1f24d", "pubKeyOperator": "8d3fdbc68517ecb04f8a056e31a979cf0d0f72904b962ef24a60dc84afef10c03a02404fe16571b2de843dd030e1fc86", "votingAddress": "aSM3C5zNVMSUy3fpqWXaMPk7c3E", "isValid": false},{"proRegTxHash": "68528ba4b8f06c9be8cc8677aacd3cb84cf3b505d4ddbf78f8594e1ba8058aee", "confirmedHash": "7c46ed57b3ae67e83970a3f0fc47e892fa4419cf2f2437630f00000000000000", "service": "00000000000000000000ffff86d19a26", "pubKeyOperator": "8a0871ddf98e12c9bc00c50bf1330624a8eb7465adec62aa7a7490eda3d8f6758aaa652ed8bb414a64655393f50d3772", "votingAddress": "3pTjagn6a79sDPg2g1shijLGFzkt", "isValid": true},{"proRegTxHash": "acfe81fe5e966699b5caba3b03eaba17a48c1522a42c0f4e1da2f069bc3dd3c4", "confirmedHash": "2a22ae19d9135cc05324f48db8b45a9c85f2ea2839995a0c0c00000000000000", "service": "00000000000000000000ffff2ac1b28a", "pubKeyOperator": "09e79b8be90b307760e33f83f79365614622605359e4d55c555dc6a6b994fd5af62c7afaf1a28d66624903adc59a51f8", "votingAddress": "2NRMKKe2nwT5hJz2z4XsEhtbaLSL", "isValid": true},{"proRegTxHash": "e693a68e69e52d376eadfe83bf29a71ae252986ed3c391abb9f77229ba565502", "confirmedHash": "4e8f8471ceea06cec11fb02d4b7e14869ad5e004c6aa4f412c00000000000000", "service": "00000000000000000000ffff2d56a296", "pubKeyOperator": "02d232f32f9624e9aa94161ea74b4e03976d01123338e08168b68bc1256131f36e9f07f5441dc283d844c740b3d92d7c", "votingAddress": "2ECY3AKKwnojdoRi3iPEH2jU3RYt", "isValid": true},{"proRegTxHash": "687231517c349b28ee124127057df9ce8650db8b66bd11fa774121d9317b2fac", "confirmedHash": "f73359056beb3c7d570a24aaa7c540bf28c02da6e8992b3b0d00000000000000", "service": "00000000000000000000ffff05bdfddc", "pubKeyOperator": "96a21bcf5b87350c9a66473c9fba4b9d9d69864d822499a3a9092b25ef16b3903b419a39f136794bae2955e2bd0079cb", "votingAddress": "vVKPS47BozWSubJ9C5QfWGRbZnY", "isValid": true},{"proRegTxHash": "52e00c35c6f553c8d8858a01f5a3a80c0ecce4d5d4ccb1b48d5a2d4562ac848f", "confirmedHash": "18ac8238bce08ea5b37cf23692024ccd657f58ecc854c1ec1900000000000000", "service": "00000000000000000000ffffd5885b7b", "pubKeyOperator": "034f2055202ff3be03ebc5a34b9aaebd16e8b85dbe6c681076558820a46a86a25be154393fa48949ac58423268cb02e2", "votingAddress": "kP5VA6W9ZNdbxo3x3k9eV3NB9At", "isValid": true},{"proRegTxHash": "e9bffc313c15e988bae6bebb7b86aa12bbce1a1ffaae9dd24c9e38a1e60a0576", "confirmedHash": "8aa0d8add96bc58884db5daa19af031400ca0e44d65ad8f11000000000000000", "service": "00000000000000000000ffff43cda570", "pubKeyOperator": "8937f1d863512d2f05d878f60e44cd8ee13e3e8818799ee15d87accf4dc76ac27340804415fd8f8c6d43c12cd5ab743e", "votingAddress": "NvFcvhAFmi2CskuHjvhXWutYCnC", "isValid": false},{"proRegTxHash": "e59d6022cfaf1415671284679cb3636e7408f8513d8b2dea4b2c697083c00064", "confirmedHash": "3b972669fd147c77198f97e03135962ff4902c0efd1405021700000000000000", "service": "00000000000000000000ffff52d31506", "pubKeyOperator": "0ccb7f4c1de8c75d8bc761fbb46d0d625fb416a416b22dcabdbd47becc821b80437f351abd48bb334531c92966ed3e61", "votingAddress": "HwK6wWkgUd8oqNf4yve4FjuNWfs", "isValid": true},{"proRegTxHash": "f97f567618379340dcf6a2fc662570a5d7f781ad198236930ff401e6e11e462d", "confirmedHash": "1ad56fb945ed05f99bf30c03f70b6d8ff9002f8c40533b7e2100000000000000", "service": "00000000000000000000ffffd8bd97cb", "pubKeyOperator": "928b150960cb3dcf82caad93511aaa7f7df2e7f6395acaeb56ce1fbf1fb48ba6b699454333e31d6f66dc25b11d5126f4", "votingAddress": "52RmHticjUyyb1uJU29QXYEvdct", "isValid": false},{"proRegTxHash": "883601149671b1debffe98b0543dd2af1979c5a1a62ea50c5cf720bcf4de877c", "confirmedHash": "67d290c14597bf72400ecbf2016e6baf4c7bc940e6f269331800000000000000", "service": "00000000000000000000ffffd4186bfd", "pubKeyOperator": "087f56d7536d593fc271143eb28d26c9a7c4152f7b7b872dab97865742097abfb381fc50d5035c7f0a21118d4fa231a8", "votingAddress": "2bYbegTF7QGg26Abmqr1Kjc5iA5S", "isValid": true},{"proRegTxHash": "8267e020de39cdd069c037e480a8b6d88c6dd03cb66674dd61769801070a9ed5", "confirmedHash": "778ee3c994635430f2f59b915b1484e8eb079afe1a344d0e0700000000000000", "service": "00000000000000000000ffffd41867f7", "pubKeyOperator": "93bedb9b8377f3838284d0441e34676e5f2a1b0b179bd0ec55580af31b35b692eef328e74613abfd41ae710167f4ee85", "votingAddress": "2r6gfTYpKfQxm5bUavUEih7gD3Y", "isValid": true},{"proRegTxHash": "f6bb9e3e9cdc73b1c9d5173a174f99ad3efb8deadcb8c0a9866471e55a3dee1d", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff84919f92", "pubKeyOperator": "8262ebb3ab3feff634bd9e9e4530fdd18b9ec6e9d67133ff0cf2d4c08e6b403631e19b666d8dfcc07d8e71155c704fcd", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "dd209b4d5f173fd8a5c8948a2aa17c60b46f2a869c1d4fbec57fb75c57976e25", "confirmedHash": "72f4d1a0e90ea9f463709b73beb93d2f7065fab8926d98111200000000000000", "service": "00000000000000000000ffff6baac423", "pubKeyOperator": "922d0d3d98e321f23e726f219da0e1f401c899a87434d068822134e0dedbff40146bb7320f313d8fe2a2158304d41479", "votingAddress": "23V6iyhs1JFAQxbcK7Mxe3uL3WdN", "isValid": true},{"proRegTxHash": "5aaf98d40ce3bbda72a66a21d6a81d73939a767bdb95590900bb18cdbd34a128", "confirmedHash": "c3f26b080798292b644b1b85a1872d11778465c267367eaf6100000000000000", "service": "00000000000000000000ffff03d171d5", "pubKeyOperator": "98978b5906bfae8082e5ef49ac5735fe817e870b1b483ef4ef9dca5a02d77b76dd1a873dc0baa6e5923b08e9d69b7c34", "votingAddress": "7AYqNaryfyYqcBwEkwrpLuJGmVS", "isValid": true},{"proRegTxHash": "ceb26940e39de0edd8bdcfa2d6b428293a2bda57883c1fecabcbaba2cdcc1e5f", "confirmedHash": "6fe9f107bb213e578ec82888fe6948e6ce30b9132776d8460200000000000000", "service": "00000000000000000000ffff689ce6fc", "pubKeyOperator": "17d623a88814eee98a9daea391e3b799a1caceb8f0e3553ca9c2cb86826a4c9f680cd9d40e3e0a3a63e1e4f2d9fd210d", "votingAddress": "41hNo7Hce9QJgXNyCU3mE5ws1Dcf", "isValid": true},{"proRegTxHash": "4fea4d3d0bcdf08535ce71412565dc6b828d412332595d97ea5ea740dc2cb5cf", "confirmedHash": "8a3bad37f6e9fb02ecfe8e377163ecdf0dd8acb18e2c83b40900000000000000", "service": "00000000000000000000ffff55d1f13c", "pubKeyOperator": "8d6e5c267726d72f19ab9f29747d56500f31f45e3fb9591876eb6d8aa6522f255688bcdcfa1377fdea106106542b0045", "votingAddress": "2AQAUSMbJL6ejMTVoHUZEbrKfRj2", "isValid": true},{"proRegTxHash": "e0b2efe5f8051d223f7be3bede1609f07cb2b7ef98f68274175fae13a6088bff", "confirmedHash": "6b0b7096147be77aeb538b83ca7bfedea24969c7bbe80a271400000000000000", "service": "00000000000000000000ffff52d31517", "pubKeyOperator": "83be89a7c5f82e7607af4503753d8a50699246035c6c9be7c7d10048ff03382739c8de8b7b158a8935554e3983971d59", "votingAddress": "32QhGnu928a45Y6xWGDdrEGK8RPB", "isValid": true},{"proRegTxHash": "91185b1ee75bfc9da3a977da52040450fd75110b392fc00c1a580ab0bc703ed4", "confirmedHash": "f88fc5ebcaa5e5815158333cea0d9a8445e8feaf3402a0cb1000000000000000", "service": "00000000000000000000ffffb0df8f94", "pubKeyOperator": "84b9c7a6cd4636c371a361cd7a72eba72fc727606772d010cb98fd92054ba7bb014153f7bb85b26021df93be18f9747b", "votingAddress": "p9NWKLhTFjpnFCgr7Q6MJrxKZbC", "isValid": false},{"proRegTxHash": "4de6217ab66f95313613655d3e1e9ff2f1c6398a117870e313fc0ec2744dbbae", "confirmedHash": "67275c22573f09678a0f91dd9a3d1275714d2a6b9b7132072600000000000000", "service": "00000000000000000000ffff453d6be1", "pubKeyOperator": "82c44b0e655780ae0b1d4e96eeb49e6a7c48d5d5c00d112cb8822e2fcde9d9cbc82a64f8c5f4de6223c775295e446543", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "82e58d3aef7b808050fbb2779a5750f1e97fe60f8f198f57b9d3f40b34e115ff", "confirmedHash": "c8b728559f26a84d2ac1f1b51c91351c9b94a96f1d06f2962000000000000000", "service": "00000000000000000000ffff2d384671", "pubKeyOperator": "06e14aa6deb99ccc974eac00392c9e4430d46e79dde5b3806a57d27fee436640dc56a66a0a883d82be8ee4eb8aa24b8f", "votingAddress": "3oJK7gqxLpKutx6jrQnQQLJvZxEG", "isValid": true},{"proRegTxHash": "b279f59400f7c3861e3baed64b5abf6d65fce51b1863c7c86137e5e0facf5541", "confirmedHash": "68ea281b8abe5dece729829410c8b20bb5119246738181122800000000000000", "service": "00000000000000000000ffff5c3c2459", "pubKeyOperator": "1935463522df77ade2c6857041ce0bd9dd4ded6a343b93c423764fd244793ff03b251f8c9a0ac2f552be9784b63973c6", "votingAddress": "3fgpexMuwLuBFBs66k6cdX1JesHy", "isValid": true},{"proRegTxHash": "e83082cd169edc321d9b332262404677d2a0c62994886725d8d0dc08cc5586ea", "confirmedHash": "0683218fc3e112c0474b4a60df636de6ecd8caba7bf4770d0e00000000000000", "service": "00000000000000000000ffffb29d5bb8", "pubKeyOperator": "0c1fd0bac18bde80961c2c86d0a892f7e4887a2d7f728905f207581a75e91319c1c6d166704b8a8c0abdb7e2a56a8d3b", "votingAddress": "2isJ9YN75NjzMparGn69v2VnkRmY", "isValid": true},{"proRegTxHash": "ecf9a8d3481d083a42c71436a6372fced49168a401818379fdac79a7c0e3483c", "confirmedHash": "8d073243f0996900ca6e44c171a1a7b5450c4aaa4cc72a380000000000000000", "service": "00000000000000000000ffff55d1f1e6", "pubKeyOperator": "0a36c5473648614cb2e256039c04471e69240007ac00a2a5cbc047fc7782622c0d9cbb0a740067d21b39cfd89380b6fa", "votingAddress": "3C1xdJ1wDDBGuEhy2dvPgS7ds4EK", "isValid": false},{"proRegTxHash": "b365f0e363fc9b75dac173ba229b25406024eea8b1814434c14c031d1c13367c", "confirmedHash": "65f006d9a571d5458871861814c95b21f29714ec6028fbd92400000000000000", "service": "00000000000000000000ffffae8a0ba4", "pubKeyOperator": "8604ef894df6ab2663104682381f04212eba519872d098906e33b247d67ff2d5e4e029a3203a9980ee00d4fd8c21b296", "votingAddress": "38MwABrYsCgXe38VcbgvJXfZQREQ", "isValid": true},{"proRegTxHash": "0a601149236fdc7b80c96b64820ce397bf601b1280d2a9030224d5bd3ae941d7", "confirmedHash": "bfe5e427916b840a6a4af564bbdbecbfa67d8fcddee5f5711600000000000000", "service": "00000000000000000000ffff8ac58364", "pubKeyOperator": "0739a591b180aa8ee786eb945ddb4b5d738f62402c4c41214b2b8b545297ae4d661299dad524d6bfb3e43b7d2fff412d", "votingAddress": "38rKAG1u28UBxdYwH98Lh6mYByQ5", "isValid": true},{"proRegTxHash": "ba5b538b28e00968a4e0f0cac6ecb6f667d50d2ba30296e6e52bebd573c0c64d", "confirmedHash": "790acc3c6e44b61cdcd205c64c13672cd701e4553e6a85f82f00000000000000", "service": "00000000000000000000ffffb9e96af9", "pubKeyOperator": "89438c8ab2f1f4b20c907ac57b1dbbecf58dbf95e3a81b58ba9b1d5dfeaba99eb227003c526ac74a630b2326865b1ecf", "votingAddress": "33Ce9hw89kZumsiX2v36F4sRYMPB", "isValid": true},{"proRegTxHash": "f63fdf395cd83bdbdca4736063ad3146ec7ff51f8a7c88dbd0757f164fbd722b", "confirmedHash": "f36c0b10c6ffef57e9a913f8966432d5d836ee748d44ac1b0000000000000000", "service": "00000000000000000000ffffa8775792", "pubKeyOperator": "82a99e70152f034b7601b354929065ecdbc259cc9e1873cb90c79d2c75dd84f98bffa4cf7d67c535d7b8785553900536", "votingAddress": "2zufigPaKj7tewtZ419yu2T29uVG", "isValid": true},{"proRegTxHash": "b2477ee2da0a3bd728c0fd75dc9b628ebdeb141fd92610f22134530477ac49eb", "confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", "service": "00000000000000000000ffff5e82b943", "pubKeyOperator": "83db4876017ceb38b75f352ceafa06daf01e3b7094096c70bae86b5c52ae9a8e5550f0996876398337b44c76d6096bb2", "votingAddress": "9eKVbZp3d1cke2nemRkuL9Gdfua", "isValid": false},{"proRegTxHash": "63c1cff069275eb0c0b650270565aa41cc963784e9d2f734f941e442c6c9c643", "confirmedHash": "1930115fcfabe8035a4be3aa3f9777dcbaf40b16211e81020100000000000000", "service": "00000000000000000000ffff03e42bf2", "pubKeyOperator": "89097a4c138519bfeb4828ade49a92c7970960a6f897776d639cc90e22d939f07ba3c3e55cc3b64b46c189055bddf812", "votingAddress": "4ZG4wy6kDPN4bnqwjyEQUnnbtN3o", "isValid": true},{"proRegTxHash": "d698bf5e89974e18274273e6933214a3965e457180cd9790dbedf4e4a7160d11", "confirmedHash": "06a2867e36d150643de89d87c53c9b6b9c6a195f78ed8a580500000000000000", "service": "00000000000000000000ffff52d319d4", "pubKeyOperator": "18ae95b135aa06e06975923b1225b05379f951ecc8ce587d3684b5594c9466ff5d072263d233620790b4be9259373809", "votingAddress": "3HJwZzTqms4Sihwf2ruZ5n53D8Fu", "isValid": true},{"proRegTxHash": "e2366fe22f2e727a99d92caf85295cb25e60472c526c85c8433a63105f32ea20", "confirmedHash": "bf081b40c04fed91c3ff2e1ea01a9c9fac44335c8f16af190000000000000000", "service": "00000000000000000000ffff80c71110", "pubKeyOperator": "0779e2d9b0c9b593ba28cf8080c3846a520aeab7db857c4d776535cb80b7a4f6b07748153be64f114bc11ff2722fd519", "votingAddress": "zFixo2oU5rpDm6A7BQjUFbMXpBx", "isValid": true},{"proRegTxHash": "480af30ca3fd8853399e69048519691106e27f855eda17dfa6100783ed5ce16a", "confirmedHash": "7741806d51f836c928f24eb05a46d13782763d906212a5a81d00000000000000", "service": "00000000000000000000ffffae8a1b4a", "pubKeyOperator": "0ed31d4ac649a2ce7ecc893217ac29f0b882458fce3c8501ff7cbe0602325bddd102cce8c17e02fff6f818d81649ffdf", "votingAddress": "2CvJF1VbLKQaN9L3owpUaKX18tq4", "isValid": true},{"proRegTxHash": "fccdda45fc2675347c4aef65b2ed93ed5f620691f65ad4200497ea501fe2f3a2", "confirmedHash": "fa89579841c8f4e2cc66bd70d9c26cf67a13a35d0deaa55e0700000000000000", "service": "00000000000000000000ffffb8485ee7", "pubKeyOperator": "056023e136911e7f0508d885bd7a78a9b90e558985c958c4cb9f90b1866ec4cd6c177ef37f4c83f08f657a62ed53b193", "votingAddress": "2jpLpjvq3GzYfNVjTAEajxLpAhbR", "isValid": true},{"proRegTxHash": "4de27843e177b2e913aaeee216b35b57241d2b662843e4ef22e4a001110e2533", "confirmedHash": "044f3bc29d0a6a7cb9f140f876a8bc2255ca6472a29561471000000000000000", "service": "00000000000000000000ffff59280ad7", "pubKeyOperator": "0ad905fa61e89e4ad5b1d0d2bec63443d923a25f5046ef69200a6bacda3ccda84d1df93e9174cfbdffea34ef3481bdce", "votingAddress": "Ao9qusHG952vxxVjGFeYeJr9HWn", "isValid": false},{"proRegTxHash": "2ec2525a08ff1165afce5751c8e48ebcdbe763f1ba87569755b25a3abbde19f9", "confirmedHash": "8b75e1d92b43457ab4f815f57311318f7d104d523d5ae54a2900000000000000", "service": "00000000000000000000ffffc2875b6f", "pubKeyOperator": "8a0c1329063ad724e5db06dd336dc9de43835048d3aca1440127fb655bbb9caa1baef555a854a7acc2d35d3493f6c6b7", "votingAddress": "4DDvRa5vrwhVnoapcS5G87LNPtCB", "isValid": true},{"proRegTxHash": "c3a2713526834cd1a465b1fa09db3e385fbd61523fd335cc16ce355d935d9ddb", "confirmedHash": "8027e58d935037bcd93c6713a3e1ceed8226deda2c5573d31a00000000000000", "service": "00000000000000000000ffff52d315b8", "pubKeyOperator": "00a225768b92fa5bbe0a29dc4f4eac8b1ca7fc157c8c398d7ff9358e35ab71fea5dc7be34f8bd971ca33272295bcc0ec", "votingAddress": "348QYveUZkhYKkJLzb1EhBr3aZ14", "isValid": true},{"proRegTxHash": "9b43826a88b845deb8e62c782c1bbb67879e8b14996b88c2e0a9c87a32480032", "confirmedHash": "a5f91008437c87074bfa7f208f35eacacc60446d62500f221500000000000000", "service": "00000000000000000000ffff05bdfd92", "pubKeyOperator": "99f583fb7247f769418d81740e8e79ad7e175f5eccdd889d6df375fd76b7c6cd772ded9c1510fc85fa84f60ac5b4787b", "votingAddress": "2bQwwvw7Dhe43NzuYc7f2JQEQ4wS", "isValid": true},{"proRegTxHash": "d05ad2b7c26f501975afd46dedef717c187522aa95c1851f228f4fbe791e579d", "confirmedHash": "679c820ee63ea237625da38937987f98a5ab313e9851e7be0700000000000000", "service": "00000000000000000000ffff12d5ecfb", "pubKeyOperator": "18d6a75b4094cf54a1df1d37932020c9a23f28a79bb3dcb8e34c5058f891db8b8696986fbdc1c056617dc8efaf1e5973", "votingAddress": "2vzYGavXBdTy9p5Crz2qdQzWLoFx", "isValid": true},{"proRegTxHash": "ed7de882f6176c9de474e7c592fc0faae686734184896343fe8fce9906715301", "confirmedHash": "542acea0b4cbd2ffbbc9c755b7f633b53a38694ce6c7bc701f00000000000000", "service": "00000000000000000000ffff58c66bc2", "pubKeyOperator": "9908042842319b1641157cdd53f9bd250e9eda52e19bdb747b871015ae1a000303400875f162ff9a01f3310a3e5b2faf", "votingAddress": "32Jb8qCCBN6BCkhYvkK5BPqtMv9R", "isValid": true},{"proRegTxHash": "9a87ab75f4964c65e0c54eefa4f03c1e9005061a7bd1ae020ecf9732c8f23674", "confirmedHash": "c2ba243ad64bf9658a364cf315e960dd277924388c3bed3a1f00000000000000", "service": "00000000000000000000ffffb23e8107", "pubKeyOperator": "1723a4af1180517b7b2a96a182ed3d1f19e1426ea84cfc1b42ddf4565312b5c597e5abe6910eb1723072329a091a0fab", "votingAddress": "2tQV4cdr2oE8kHqSkR7ziTak15qA", "isValid": true},{"proRegTxHash": "4672ec6c6dfdd72eae5573ed5bcf26c9c68966bec23932e84bb03d3ed9a3481b", "confirmedHash": "c2b553131ca62e703a7f5bd5add8168c6db4fe5760c5e0df0a00000000000000", "service": "00000000000000000000ffff9f413a46", "pubKeyOperator": "8330cbceac6b4eee305dce288dc62e4699da2700a53588de85a8f0601f5fa76bf739e2cb28f0894ed1cd02e35341624f", "votingAddress": "3jWkSBurw4YfBfE6QQcAAKmjqV2h", "isValid": true},{"proRegTxHash": "c3aed9407c9b39ed9756d89b2c5bfc4cb0f6d16d2e19d32044007b0900ca3f67", "confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", "service": "00000000000000000000ffffd4186cf7", "pubKeyOperator": "05635cc96fa48ca6237222a8bf2a7d467e7b3d9c9e9a1d6839f0365940f5695331a4432ff765b0f9fbb3565840a26a42", "votingAddress": "BovVZhURrALZV7wjEPjXw7eaKKy", "isValid": false},{"proRegTxHash": "11cec3ac8c1546aab3aa436853ea9d30f899df29bf1dec81945b9a5f8ae490d3", "confirmedHash": "ed33f8e400c801386d8cbbf896d57966548452a6b8372ccc0400000000000000", "service": "00000000000000000000ffff343274ec", "pubKeyOperator": "84aae670612ba9376dccfe91a214982f83c7d0010f09d37d13c6662dbdc4c5bca6be76fa7aa845d888f9e8cfebd7ef3b", "votingAddress": "4CUZtsK5uEFpUsgwhPPc9HAZSSKZ", "isValid": false},{"proRegTxHash": "0f81fee4998571cfae57265aa49eca1616af70077c1d348ffbd0d27f5645ba67", "confirmedHash": "cda29b67ce0828b2618f89f898b47f3c596f0c080b42260c1700000000000000", "service": "00000000000000000000ffffc3b5f42f", "pubKeyOperator": "972cb82b7e16bb3c4cfde9dc38a2f04711613ff6cf887bafc5f394d753f8dbaca64459bb0a815fad3e057cd2846bfc13", "votingAddress": "2knPJGikj2ibQrqHzg1X247jhaB2", "isValid": false},{"proRegTxHash": "6e7a2580b3435ec46b7cb98512ad7ae7adb45e449f509126be0d43f65d2aa166", "confirmedHash": "b7de66377ac2e6b87d77c94d6af5874ceb5fd823caba70131400000000000000", "service": "00000000000000000000ffffbc28f16d", "pubKeyOperator": "0198e4bf3f807b2a731b8d74e977ac4269de63b5b6deba8cf399aef87a44365685db7eca12906e1ee07eee7fbabef64a", "votingAddress": "3bMneJ3x7rG99vB7tswa6CbZt5XE", "isValid": true},{"proRegTxHash": "0e88b1375a32ed49aa6be310e7a3e31414d8f4b758f645b51ce208feaa0a6883", "confirmedHash": "1a883b80109bc4254866e9eccca813caa242eb1d3e1702c20e00000000000000", "service": "00000000000000000000ffff9fcb2ffa", "pubKeyOperator": "95467379b1e5474254884d990765dce13f7d9cbc9d439fbff77db113542bc4cfdaf3142e364f394ed05a1c46d2e04ddd", "votingAddress": "pyVNhDeH1bGmrPJM7Jq4fwqHbNE", "isValid": true},{"proRegTxHash": "37b357e320872eff5d94d387c7109795875a971653dd97a15f163d66f3912a8c", "confirmedHash": "d56fa840a23ec20122b1c62bea934e5c6de1e8d69a8556281000000000000000", "service": "00000000000000000000ffff03e27526", "pubKeyOperator": "0d5ab7879f6c53f8dd9e91987395d48e308f92bc35b66b2253ceb0bfcac73e58721308597c0d61f605a6ad55b5512979", "votingAddress": "4MLKgomaxcHts4rw9w3gPCtZ2Abg", "isValid": true},{"proRegTxHash": "f05eb8af2c8b7e7fefac728d1512c16365c0f9c170653b2c2346fdf3de1b56e5", "confirmedHash": "b97c681f1dff6db4f7a9a0593a66230eea90a81be8817a3c0900000000000000", "service": "00000000000000000000ffff4622d114", "pubKeyOperator": "155659aa39843240bd160421fc49bed1fd4dca35c21036a8db44088060cd5665db8bcd6bcfb983424e75e5578abcecfb", "votingAddress": "4CBSLq6nqmJwrxBkyBxiXpJogVWr", "isValid": true},{"proRegTxHash": "4c939a0e937259d89c88b70524e8887060766666f895d4ae2957e81a219184f0", "confirmedHash": "db6e24accfb09c81ac4539d366f24cc3b163af5701dea2a50c00000000000000", "service": "00000000000000000000ffff5fd87e26", "pubKeyOperator": "8d800a2878621ce612ef2fa906713c1f20a023379d720b0cb0a2c7007747096b59ba1b69e160c6b9e5568f58b982c6c9", "votingAddress": "pnNNBsUedX9CwmrBuTCd7gEkufN", "isValid": true},{"proRegTxHash": "1e9684c22ea915efed5b3b746dbcd1417502a559ba1a4c60300128a1b9e427c3", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff8491c95b", "pubKeyOperator": "14ddabb7d1657d526554c4840c3280bbd4000b6632f14459959fa0ebb1c0accc2d02e5fc9e77e1c5d3f018b443f5416e", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "7e775b8cc6c5c895e06521e9864954a18608b4e7962245e5a26314a7db41419a", "confirmedHash": "a1ed15906c5a9646646035a30606d4095cab51fae876110f1200000000000000", "service": "00000000000000000000ffff8ba2e80a", "pubKeyOperator": "17f6c78c50c09145c698859a10c8295daceff779a661dfeabfd6fc704d47884070bd4d307b270eec6e18a1b314ce24d6", "votingAddress": "bJ4qjsQuSQL7AvvvxzAuxugpnqr", "isValid": true},{"proRegTxHash": "819d79681b40db9d66cc58b4edf594378e0a42ae09927ca19d5ef7b4fffb4827", "confirmedHash": "91a6595f7fb53f1f09f9df2e741120864738144ed1f9572d0f00000000000000", "service": "00000000000000000000ffff55d1f277", "pubKeyOperator": "05617be621344ce33d35187b4fd23edfce92fbd419d771da4854fb3ef3dac035eacd88150e44c15628e45d0cde6de5e7", "votingAddress": "4A2m6f3bKi5MYWVKQqEEneLRUKa4", "isValid": false},{"proRegTxHash": "c024e031b20383fbbaadf87354661234a8723987c074df054a4db7debd9eff4b", "confirmedHash": "98a6656ac7a5c081026695ee6a11fd800a74682f1eba4c020d00000000000000", "service": "00000000000000000000ffff2f6e9d93", "pubKeyOperator": "19ee293f91b928d2f956c9542b763e61301e850de9124b4379db5b35e56704d5fed6d9ec3bebf826e175eaa3bed39289", "votingAddress": "B1zNmsPTUDG3a4CEQfDUMErs3st", "isValid": false},{"proRegTxHash": "8b5f5660ee44e07e7dfe90b42efdcce3c74eafaec84bc6c84eb0038ec7c27dbf", "confirmedHash": "64b416cd9399bc1885fe1b660d1c1d6a383970a6c5a45ad50100000000000000", "service": "00000000000000000000ffffb07b39c5", "pubKeyOperator": "18091ddfe032f3410d089578b6955492e23c696098d005a535f7feb1509536dd0dcdc70000ecb50087892677bab2bc28", "votingAddress": "2Jdcppm3BMWRqfpHHeAmB7LzSY61", "isValid": true},{"proRegTxHash": "ca5898c4fca31b117dc32b75b165b1d43b5aa9819d09c5840ffc5e7fd3eaedfe", "confirmedHash": "9a1d301a18559dc1aa20644fa3b6273224ce13f37e3b92b14400000000000000", "service": "00000000000000000000ffff52d31582", "pubKeyOperator": "10ce6efcf8b83d3308d8c6ab03dd10bfb20e177fa1953605baf9ba160bbf2361841eec0afd69b41e9e7763c81f651da8", "votingAddress": "45sdSB2wGL71dMa6Bna73NbLHv9G", "isValid": true},{"proRegTxHash": "e86c42cf18330be3e90f19c0f6bf979e44dc7172df727ce23dfe6d4ebdc81b33", "confirmedHash": "d9ed28cdb018ce6e3d8702b566a315f92979f2e666d43cf91000000000000000", "service": "00000000000000000000ffffb23ef185", "pubKeyOperator": "89c4e707d2c2ed3f2796b8de0977c71871d485f2809401872267441b6cf8670da7210988cf14cbc66579e4cd44204e7c", "votingAddress": "38jpxwPxwuT4kRHFaDtp1cAWMCCC", "isValid": true},{"proRegTxHash": "bc185ac06ce342a9b578340c249095f5666e93151b26a90f18ec77c88974380c", "confirmedHash": "dd4e4c655d4cd47fcf67002a8a021624bc01e9244c5422372c00000000000000", "service": "00000000000000000000ffffb94534a3", "pubKeyOperator": "8348c6520760ce5bb0fb1ba8090a81d8e2ee4591373ee3cdd3ded56d8690d14dee4d4bd36a8f292473f7260081ce485f", "votingAddress": "2oTLvqKbHLY6EsKrAq9txxJxgcjR", "isValid": true},{"proRegTxHash": "2052636dbf1dd0b8bd404338ce02ac7ba581aafd1a61d906c72a731ab66a6881", "confirmedHash": "deea24e962fac02cf223dd40dd3f1d84e4375d0d51276cb70500000000000000", "service": "00000000000000000000ffffa8775791", "pubKeyOperator": "1562afa1f0192f7d8bdc216dee8fa3aa46ba25394aba7406ddb3707779b29ce7fac4f2502dd301da732086951a6004c1", "votingAddress": "48y62aN6WEDRSzJxCSU5hnUzGtoJ", "isValid": true},{"proRegTxHash": "8c4f2f0c45770d4a30a5f38148ee827c28994cf64b142e94f06efe078af19d6f", "confirmedHash": "63de1e6019a10059f1857dc3da5462de6bad8a21e05d4bea1400000000000000", "service": "00000000000000000000ffff9df59e0b", "pubKeyOperator": "010be267da8548d79d1c80759838d477d38bfd1092acbebb4c29f812060b80212218a55a048f036460e0f1f79ead57d6", "votingAddress": "21wjuU9Uiw48EuTWAwcpS4NSMBfB", "isValid": true},{"proRegTxHash": "628c7708872ea4c844629b8416a9e17d24d0b7549d1005d79b1fa6ec97bc5154", "confirmedHash": "70563ac26665b76215866ec173788740234be601af81388b0500000000000000", "service": "00000000000000000000ffffa5e326f3", "pubKeyOperator": "0d85498c66f70f541f1b248146efed7691234acec6b942cf5e83a1c4c2479031b57a520f309e3327777cc1630b2c903d", "votingAddress": "nHx2UufT9ntxiNtMBZTu73dzKL9", "isValid": true},{"proRegTxHash": "61fbf1ce92219d327b3b72cd3203bd5be8ccd76de3dfffb3d8181b482f9cf4e8", "confirmedHash": "21c8fc132a85c3fc970e80efad1966e14c243c31df0fb98f0d00000000000000", "service": "00000000000000000000ffff867a6845", "pubKeyOperator": "8b2164e07092a82a5862be11d6edc1d7c6109393bb9e7b00f8f0157ec1eac096b1331b8c2ad33a0c911aeef194a85a3d", "votingAddress": "38YypwQ6kXmQ1ExNvjxZRfCBosHy", "isValid": true},{"proRegTxHash": "dedfecca61269046d00716ddcc06976e6d6fbcfa39846af108c4002fbcd0620e", "confirmedHash": "8ece6073d810443e6f88c84b99ad59392a58f75b64e8abe00c00000000000000", "service": "00000000000000000000ffff5fd97d66", "pubKeyOperator": "06e871fc5733d7d63d096a8bccb13912df15262536a66d449c68cc1a25994e173be87f3dce28d1698c9fad60b50f30ca", "votingAddress": "3RMXHqHF2FsUkARMLa39FnFne8qm", "isValid": true},{"proRegTxHash": "1e25d8243886ac0b6f75ed2906e3f4e7cb5edc64baa71445d493c9457e71517c", "confirmedHash": "3a98afcd4f76e62a7dfcff6f27ae9c084d9fc139dba24aac1900000000000000", "service": "00000000000000000000ffff52d31954", "pubKeyOperator": "8111e4a1470fde201e1f4f7d116ada6846d6e5c150e6c5fa27ed37f73feaaa70dd76781799a2bdc01868e7a2e983b470", "votingAddress": "3ZCijTZSdBCGMyJtETXTuBTtq1Vi", "isValid": true},{"proRegTxHash": "f3df79d49d3f7d7a457399adf392fb55e13aa32eb795bf58dc929fba3e07cfec", "confirmedHash": "3aa49f131dd6bc72ee2b92a5b6d81da0fc83a79c0f5830381e00000000000000", "service": "00000000000000000000ffffbca6603f", "pubKeyOperator": "1192bf3e4f9cc5fb440694459efcb266a3dbb34945e6baba6b149b0e8149d3704a3076bf2893405267283c18d0a8fe21", "votingAddress": "4DGtmr5qK6WTLtzDobbFy1L8StJb", "isValid": true},{"proRegTxHash": "2b0d2b5644727c30245782ec692b7d5799e051ef8b7e99d32705d4cc87dd09f4", "confirmedHash": "36aee65149168ae43cc0a721d33fde1675799e508181b62b1000000000000000", "service": "00000000000000000000ffff87b50fea", "pubKeyOperator": "06228163e7d371e2004bd4c65e949743ebb93b407e698d0b11d1b381af14f8089f0366a233ea3051ab8e3c018598d17c", "votingAddress": "coQshEj34WVSuN1GQGmK5ijcShL", "isValid": true},{"proRegTxHash": "098125b569e8f04a32ab202390c62cf8974964603d92b7958d4018a378ed1911", "confirmedHash": "dbcb94681afab19e589abe1ba391d14b756bbaa599c6bdb60b00000000000000", "service": "00000000000000000000ffff55d1f283", "pubKeyOperator": "06d2d4eb28da39b36af41c22e363c0814ac7a45082881085ac83b649974f8f772c4d8a43deb4a5aa94c95deb126fd8bb", "votingAddress": "4ZR8qHZBUksmGxcGWbK1iCRy4N9b", "isValid": false},{"proRegTxHash": "d14c458e3c6ac57dc60202f2a193ba57b04b9d4e4a0a630d380310e2c8d680ca", "confirmedHash": "83e29bca9d5dc1970812bd72b85481600af1502712d0cf5a1400000000000000", "service": "00000000000000000000ffffc61b45be", "pubKeyOperator": "17a144620d5a27d6a091ae728b7cecd271549ecf2dcbf8475589ea7d49b34d080854c83472a829b72887b3623847a1ab", "votingAddress": "SZPRtFLMmqTmJoBwLmMnoxxVpPz", "isValid": true},{"proRegTxHash": "e9c4dffe6bbeaedad52f6a5dd29796a51eb084d486062a00167dcb870235471e", "confirmedHash": "1a8dc93654f44327d7ed1d59bcb436d88e082b3d4f9c6d362e00000000000000", "service": "00000000000000000000ffffa3ac80bb", "pubKeyOperator": "145333fd34cbaef3c5e911ef3fb401448da0e3e831d72988e33757e6ec53e82d4d64456ee6ed54a66d64a3e4c5c6af5f", "votingAddress": "4TzEyLCSexkE5DAKWE7XEarFS1EN", "isValid": true},{"proRegTxHash": "31c7377d7e856ddfd9508358d2cf9f050552338c94ceee6970d4e2d748df864c", "confirmedHash": "be9ce9ae7f0e7a3488e99a5a0d48e54e446144a90f1a12e30900000000000000", "service": "00000000000000000000ffff88f38e29", "pubKeyOperator": "9790cbd1c2d248c788ef3561022791ff06fbfd28ebf85dc3d97b05d7da02a6e1800f4c32c8a639c3379ffa525ea56f56", "votingAddress": "3Gqkb5kRkXNLPc2aPaY6MnJLqLzz", "isValid": true},{"proRegTxHash": "baf26adb499a67f46a79d98612809154ba47971035535ede90f42b1606cfc705", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b082", "pubKeyOperator": "191122d7fd5941dca12b2aac1dd6fb525154ef6da47897ac8de2cb6fa3112a11e74ba5be1eff1d72deeeec9a1a7fee86", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "c84cc21bac9145cb89990b86128462238475c8012d96df91a6ddad266849eb85", "confirmedHash": "d591ef5e91d38bf4165b7dcd0383e309de3cc1579acb2bf10800000000000000", "service": "00000000000000000000ffffb905378b", "pubKeyOperator": "0a9f5212745d6b5e202fc859657ee413348a692c409124a22551d78a86c7ddfa261f75c9f1781d3e43283072c6c603a9", "votingAddress": "rVjaMcZzP9AUiUspbMFUFSmnask", "isValid": true},{"proRegTxHash": "5ca5ba38794d59b23d6ef4b9c3f73f4d5aea6aeda09a84ec7bf3e7a2a05c2c74", "confirmedHash": "4801b7641f4b4280f67145338d230eb20205cd7effdfd82e0f00000000000000", "service": "00000000000000000000ffff9fcb01fb", "pubKeyOperator": "102b3fba5930dc93d488fdd8b2e1280a82fd30b5f0ae08d1cc428df03aade154f5ca979a1d44b7f81d82cf7bac32b891", "votingAddress": "2p4pzotdba1b1DASf7iFe5y48gXz", "isValid": true},{"proRegTxHash": "6fb61c991557cf4c832665e3a961f7049bdd791aac7971f1bd9a30edcb85f2c0", "confirmedHash": "051b53482c37c7a2c952b7643015e51f96dd4df42d4afcb50600000000000000", "service": "00000000000000000000ffff58632556", "pubKeyOperator": "94a5a52650b032d14dd00a591ae9c5718419190b7ff7e56abab9889e874facf1f2f8233e22310f760bd8ddda8df45e14", "votingAddress": "RUqst2kQb75ga6X6wrMhGG8y7eJ", "isValid": true},{"proRegTxHash": "c3bb7d9aeab8974849a519b1e67a99d36466b743ca4b13cd155ff45134d1e3ca", "confirmedHash": "54317e0f9638e80793cef6f500031972e70191d95967f51d2c00000000000000", "service": "00000000000000000000ffff55d1f138", "pubKeyOperator": "8ccef098e3bd942906ebf19e58a5022960018de619446459c515b1c6d294d07681e8c7d09458a7dc54c9c561e96a845d", "votingAddress": "DHhcYspW2qzR3W23VFGVrvQqEVS", "isValid": true},{"proRegTxHash": "c29b367ba181adfda63d320a9b97b70eeca170f1a9373e23b1644350cb65579f", "confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", "service": "00000000000000000000ffff55d1f267", "pubKeyOperator": "0bb40348ef34d50ac96c72b18abfcb8792c44a8b05f2fc31c621042c2fcd34204b6748b5574d36b0076f612e479e1cc0", "votingAddress": "2VDLNFSLbxQdXQ9Xt8cqqSvZ8KLC", "isValid": false},{"proRegTxHash": "8bb8ac98762a023a85609a6d4c5bae7a4fc229e80ae56183de6963b48e3b07b4", "confirmedHash": "4e7a454736fbbeb9bb4683a6b460d0dae2169ec0dcbfa6c70b00000000000000", "service": "00000000000000000000ffff8b3b8b17", "pubKeyOperator": "8b7bbdf6e8b375d798e14cfc1f72fe5064bf8f618fb4163fc71f30dfee2d7c9e27275aa416141468ef412c567c41cd1d", "votingAddress": "3EcFcMSvezvRov16bRQ9JQJDxjTP", "isValid": true},{"proRegTxHash": "5a28945c3113275f07bb78bb5ac244dc7c0aa29301fbb8ef76def68e243a4c5e", "confirmedHash": "11a36e70664892fc613416fe5ea780f7ae33ed10a68cfef70200000000000000", "service": "00000000000000000000ffff52d315f3", "pubKeyOperator": "157ceade87a403a3bc127d8f7f849d5d62e1e7dd3ebc9b71d4521f9b5085a82fe0ab3c8d59010a4289bbab3362472cbf", "votingAddress": "2YTL7HvNDuA8jBPS34CMYmsSgiWH", "isValid": true},{"proRegTxHash": "f1331fe6a50d7278b11746027bf08b72abfe6ebfe0365cbc59ecc4d4e8b55715", "confirmedHash": "20e47a84ef67ffc13cc5c5c7d3c9cc84d46a5274b8bc86ce2300000000000000", "service": "00000000000000000000ffff52d31907", "pubKeyOperator": "84a033cdfa229da8970d3abed657321faf0058b3b7c960fe3656b4951fa709ed32a11108fc2a200c0e6338a04a044a3d", "votingAddress": "4F62cexhucWFpyHwuFeRcy2NVE8Z", "isValid": true},{"proRegTxHash": "23d4ad18177b1d4097a622c98f6686560662d0afad0c22d0294329c19c0bea10", "confirmedHash": "afe8aeeb1f705da55d606c17384989c1f6df2a9bc60bfe2c1300000000000000", "service": "00000000000000000000ffff55d1f222", "pubKeyOperator": "16a15d6a9fe473976195c83a0a9ce69c00529852b484da2f84d38fb8b5d570b685b3a5c55f49583c4caa10d1366b7ae5", "votingAddress": "2T5XZtLVKU3X5zmXLBgjW9SfGv51", "isValid": true},{"proRegTxHash": "ea41ae9beac1d9283e4ea2f91b9fa6586b74cacc6deea5477a2956ee49aa9200", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffff80c7e1d7", "pubKeyOperator": "8e00d2d4a39542893170569af159f32902996627666e690bb4ef490eaec104642bf188de0b52f855d3fe4a3556e79641", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "276c3ca348238399d4e1aaf9e38910005b96992e86dae0f179c8d42cfc08e009", "confirmedHash": "50a4c2e17790cf4b393eb396ba5c55c7f68d3b5a527d3f590f00000000000000", "service": "00000000000000000000ffff52d31940", "pubKeyOperator": "9605492b344aa5c9701db30973af52c67559e4faa6f799e0cf27f812c15ff6bc7024b620dfa0a2d93ee03928d120694b", "votingAddress": "3NwyDPV6si7vmYNc2QRB6cgsWmJ2", "isValid": true},{"proRegTxHash": "61aab3dbe121569c98f12afc7db1ced3024522dfa3eae10222bb399c72a76f47", "confirmedHash": "2601cab7c66d3ce80253872068872812688214b0ce018e110f00000000000000", "service": "00000000000000000000ffff2d4c5363", "pubKeyOperator": "13127d14f1d8416f3bbf8776d53f6f15a2e4a7a723c52ced623cd117b87f1038d4d11dd7fb887bd1ec85561aede3bce8", "votingAddress": "4Wo5JvqqwYFJ2nMimuB7sjjSZRef", "isValid": true},{"proRegTxHash": "25c3e5aa673fdfb21c05413c128206bafd143420f80d0a14487ac414e25b9333", "confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", "service": "00000000000000000000ffffc3c91893", "pubKeyOperator": "8d1da9e568eec1d0e382710fd90bce2d61ed708493eca78f7a75daaa3d3de7b38c8dcb6b46f877bcd8d2de60f5852164", "votingAddress": "Qs71UrUKGNdSWwQ2nf25K18YfSP", "isValid": false},{"proRegTxHash": "72b88aa9fbf47818d002a8a929cd02702bf5c0394c79bac6a549334537f63539", "confirmedHash": "e582145fa1d275d93a5fa598586bc9545295db1a018b002f0500000000000000", "service": "00000000000000000000ffffd86bd93e", "pubKeyOperator": "106909d5b222fa38512d5b83de23ee9a851d99fa509ec09b78950983e2aebe6b7782e7d2dac8231aea9b490c19b1f269", "votingAddress": "3TGkRv239hvA8h14zR1LQtjWNyxe", "isValid": true},{"proRegTxHash": "ebe5c8c70fe8d048c43362b20066bd2f7da0df2d62d84519ed94dab4ff190361", "confirmedHash": "3ce328630634bcf2986139bd70bc529dea85e49860e356c40900000000000000", "service": "00000000000000000000ffff6deb4517", "pubKeyOperator": "8f03a4bd3c33f232efb54886f48b914a050261dde23f47c2a1fc22d86a662d612db1d26a3eb0492cdead3dd98240217f", "votingAddress": "48sh3mQ5xEvQYWomXq9GSKWfTven", "isValid": true},{"proRegTxHash": "b51ba07063958fd20341145ecfe630e290edb81a96aceefb7769b7bc5c1242e8", "confirmedHash": "90f46ff7476503c26e0188a371937926b1ab8c3f91943b390600000000000000", "service": "00000000000000000000ffffadd4c6d9", "pubKeyOperator": "12ab20fdca6e15fe2141b81e5dc4c6d70195a8e69ba0ee72e13b9a0750457e2b920d8ec676f5f112bbf4e0c87b0abca8", "votingAddress": "1fv7vHWV26zaZNFfU7xLjo96FvJ", "isValid": true},{"proRegTxHash": "fa862f23a72cb2173892d35137683f562f8492a3296ce4b6e5347ba52e3ec2a4", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffff80c76357", "pubKeyOperator": "81731d9540648368800cdbb2822d03c70d8a205b2a4a3367e75484fa3045b7bfe0afab89b849a85600ef7692e8581028", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "1584c371d70256958703bbd524819840bca11519b441c7ed8251f790a5c87da5", "confirmedHash": "22d2a42fb06daa5ff823afb42bd2fb51d7f06f242150b6b01300000000000000", "service": "00000000000000000000ffff2f7628ce", "pubKeyOperator": "9517ad625b923ca5c64f737181380e95f6904852f17f2fa6c4f533dc259c2ac49a3e243c3532d8654f60d0656ef3a7fb", "votingAddress": "DAM2m964XK2nL67PE2vxr9CLde8", "isValid": false},{"proRegTxHash": "ffee764038b12af6020cd86deb0a65618b744af986e051873ae4f91fb11ae961", "confirmedHash": "3b348cf08fc46abd4f8e1902e5d605903bfc49875f465d611100000000000000", "service": "00000000000000000000ffffa7565fd3", "pubKeyOperator": "0c5c803651e54ec9c3f97bb20a9f5561409c7a94b269e0a2dd12c3450ea9673d803e47a662943aff0d976dbca6c68b60", "votingAddress": "66H6f9RyKUqK3RTtK1UcJyEdELQ", "isValid": true},{"proRegTxHash": "4f193e69be3697d773b73be50ac6d7351112ad375c4f36df354d2eb48df6bd32", "confirmedHash": "b04556cd848640dd9d43edf69837b88d4c164414b2b3eb500200000000000000", "service": "00000000000000000000ffff9de6719e", "pubKeyOperator": "85884a7db5e461c0b4677810dd314b24cbba8706b2728559d651f672ab422d6e807def498ab9f583f97c635cf6f819e1", "votingAddress": "vbXYM1JcXFvYiTYJyHaiYm7RGk7", "isValid": true},{"proRegTxHash": "97b45690ab1643cf585f32eb913404729a1a770fabd064ad76f09f9ee282b2ad", "confirmedHash": "3a13df80bd92adcc443ec417ae856d82446b8aa7796ba2722d00000000000000", "service": "00000000000000000000ffffb009d206", "pubKeyOperator": "10e4d6931b757e4363852dfed588374c4436df06a5c6f91bdafa3ac805adf8ca0ccb1b53ed24ae652273562b9f48911d", "votingAddress": "2UDLRxcAHDrsn71pHocirdRMZWdn", "isValid": true},{"proRegTxHash": "8bb1ca6ccad5565ada515ea6dce618f1436e9d5b2c69b9a3d793b2731c509fd1", "confirmedHash": "0c2d3c516227ae0e4c42b1e7cb8202547548ca99987bc7be0600000000000000", "service": "00000000000000000000ffffa877500b", "pubKeyOperator": "8ee1fcc181f3eaf1001438772d16eed138597b7db4d06fad5ad834fc4e6400bdb59269cb265b815ab9f6cdb7fc059b72", "votingAddress": "2LxPwNq8JNnG35R6NJqwVJ8ZJrJH", "isValid": true},{"proRegTxHash": "de042c02a329803fbf19f401010b283d5a0bde7c55c623555f60b9001e1af79e", "confirmedHash": "48c3081aa1d0ea15b2604aa8ee1467a107d36ed447896aae0000000000000000", "service": "00000000000000000000ffffb29d5bbd", "pubKeyOperator": "939a849f1241a1e8967b649928a19a117b681a50a66a1964bbc9aaa0cf497ad6106b953b20f083f4a930bdb88082ce11", "votingAddress": "2SkYy3iUmxp6166VprjuzJxs6Zi3", "isValid": true},{"proRegTxHash": "90b7e5838d7d3e02f5491c6c99f5e406024357ff19b93e5e07a3a43ac3df2a33", "confirmedHash": "0a3a4aa732749df7d1d4b564948d1e02ab35071ad93f22380b00000000000000", "service": "00000000000000000000ffff3625ea79", "pubKeyOperator": "0694644ed1987e82aca044e8af5437d4640581be6b101f17da306b2c21ab0c5097c82f1ac625e85e8b993ba74faac4fc", "votingAddress": "2sd56LxqbPAePX5PsnYJTdMiHA84", "isValid": true},{"proRegTxHash": "7966de098c8b76389bfe58be8e9e58dc1917e76341606ac3d955a02cb67963a0", "confirmedHash": "f9112f96cd322382fc5291ee2a765f0d517ac10bb766447d0100000000000000", "service": "00000000000000000000ffffbc2815ed", "pubKeyOperator": "08f5a78a23063d060534bb4e90929362b984cf95f496068d8fa75fdc59c1f8d272a668b976bc553bac7c63d8c59ee40c", "votingAddress": "2ExeHuNsSAFKZaMQgjPSyeWKvXnr", "isValid": true},{"proRegTxHash": "df94333eea6bfbd1604962c058d0b884cbb2d7a916846141e6b99700534ffcad", "confirmedHash": "b9296b1e1bf34b20c382a8d34628c540fe75e20b7773ebcd1a00000000000000", "service": "00000000000000000000ffffbce2e458", "pubKeyOperator": "9019df7c4b31fbe3f1d898cb92cc7685b666987de8593a8469936934cddcc71e5af5d89f499d26cd221052631bed803c", "votingAddress": "qfR1NMLSFJKdq2QrVj6QxXnrHoa", "isValid": true},{"proRegTxHash": "eb9919576ba51cbc84f4b2fe62dba49c35b326286bffe45f0eb7b8ae70aaa3bc", "confirmedHash": "de46d996809648d9f064fabe2e2cc37d32f8289f65fddf280d00000000000000", "service": "00000000000000000000ffff1f946368", "pubKeyOperator": "977754b575cb9e4bad0edfe7868c83a561f9e544d355d94ee6e7904a2d02785efc24b82c501642f3154130df37c7d9a7", "votingAddress": "niwmGvC1nVHVnZfRR91UPKdR1t7", "isValid": false},{"proRegTxHash": "bc8066e5d2b6628dfcd3890f5d9e9eac71082899137173df7ab088109c05c197", "confirmedHash": "60e0f3fdcbc47cd038384cc747e163d00ad92e094b2ca9712200000000000000", "service": "00000000000000000000ffff52d31975", "pubKeyOperator": "02e918a68c637fff171cb3ebcb32052a91698ab6a11f88ac034323cb711ea91efa93bdff00c7f168f3777813738f91d1", "votingAddress": "21ba2iiR8igkcXxmNn8EXp4oX2Pp", "isValid": true},{"proRegTxHash": "f41e205fe7f16483ddb5496ae422dca13073d9e39b42ae4afcf265b53447836d", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff3425ebd3", "pubKeyOperator": "83637fdb30967e5a89c02413167235e0062decb01e663218bea1eaf2353c4cfab25476a18c4cd6de218314b1415b44c9", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "3dd5a9ea94765eb4778fe9c4961f8db18de37dadd507cd80455ce473f531dad6", "confirmedHash": "270519d3d841e4836b7b6d692a42d8e30b4282d095f213e52b00000000000000", "service": "00000000000000000000ffff52d3192c", "pubKeyOperator": "99b3ac59ac16b5b40da703406b29bd7fa072bc3f77c5f1c93ddc34b3af93a715697c9d1001cd2e22806871059fb28eeb", "votingAddress": "2Q5iMKG8y8yoyYXjZoEuhHH3h8SP", "isValid": true},{"proRegTxHash": "7e03321590b4037748deebb6ab9521117236ef93154a66a2b78671ec8260165e", "confirmedHash": "d1658f5bc7d6e0ba1e156140beba27bbd16194594c5ba7a80e00000000000000", "service": "00000000000000000000ffffa7632e3f", "pubKeyOperator": "1828a7b9c782f9db2ad2ea2858d8634a7bc3420595821418dfbc7a1b7439a5981136fcf74e271767e6889b7ee0a466d4", "votingAddress": "Ry7NF3M21u7hik8uJrjtRRXS2GP", "isValid": true},{"proRegTxHash": "d2679ab405721166d336b3a05427576ddb9599911ef55de8b1b7a3974008f7e2", "confirmedHash": "728cd1420be8662c2ef121919211e07cb590610a76b5b5540200000000000000", "service": "00000000000000000000ffffb23f7985", "pubKeyOperator": "0968219ba8b3d07f6ca8033e06b99bacdd7b9dd8d0d919d2bd8e3f3fff50fb0984d91b63feaa4311ab2da984590b4068", "votingAddress": "4FbcUzDP6SfwznwYUNtVXMNhDHj1", "isValid": true},{"proRegTxHash": "90ae3de2e64b60bd0a91fa41c32531ae790bb8beca0bd7d68bf9a3693df25559", "confirmedHash": "0f07293743ffccdd1bbdfda2bf273ed2ceb2f62d7a6eb2160e00000000000000", "service": "00000000000000000000ffff2d56a393", "pubKeyOperator": "0adfc5961dd6b09d937c355fd0fcaaf689f80bed76e5a2e78ab2439edf146941686e36b791dcc53be90ab7a87bba7b07", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "21f4170ddc64758f67744989d1036e06f9e1c405abb289cfc76df5b17edfaf3d", "confirmedHash": "dc5245912803de3c700e27b99f434d37037394beda1ca41f1300000000000000", "service": "00000000000000000000ffff5762fd56", "pubKeyOperator": "03c8d2bd19af500faa7784e6ecad662b37c021d915da4cbdca48b2d8fe360604dc361262fac9f1c92e6e271d6f87d97d", "votingAddress": "5HW4TMGTVfaq9HZJZgkLKLyGQwH", "isValid": true},{"proRegTxHash": "ef1204365964e88c16265531874b7f8f1304d019a695b5a5b4ceeabf117b5e34", "confirmedHash": "966346da385a620e18cc86215c041dd37ba70220f2ab9fc31700000000000000", "service": "00000000000000000000ffff52d31948", "pubKeyOperator": "8d4b18757b438e1a48b2109d52659f1ef7413c21e5365c5136552b0e0631408cb8083bdd73d7888ab41a81e38817c3d2", "votingAddress": "4RtfTDozfQtKxXpLQQzLYL3S2rh9", "isValid": true},{"proRegTxHash": "84b895ff4ba7481e4f3f6cadb4693f57cf677105e59b9807f45a239f52480064", "confirmedHash": "a7dd54aed81a16d4ed60a0028f73abb981a853cbb184753a1500000000000000", "service": "00000000000000000000ffff5fd87e2b", "pubKeyOperator": "075170a72edfa53053be14a409fe30550bb39e258638e4e6590ddd74a217ac5416194cc62b7c7407b53f122d06345aba", "votingAddress": "4NAKtPwr6njTdAxVxnRssjMwAMth", "isValid": true},{"proRegTxHash": "3e167c82bdfde35da9ddec4295f72fc6bf0089ac009387146dfd60b7f18ec294", "confirmedHash": "2de93631ed66b67a87df8cb83c8ee318f59e3bb2962114350b00000000000000", "service": "00000000000000000000ffff74ca1aae", "pubKeyOperator": "0d9bfabe954a2b41026519abb9c671acd1b7960337943898a60b84c6c3dec8dca3b80fdf59b80bbbf76db4c3dd84cc16", "votingAddress": "3WuQtqKocUxyStZtjhCLPNJ26JEQ", "isValid": true},{"proRegTxHash": "ee6baf6c8f8bbc0912a94fa5ecf62b7cfd4401c14076e51d68b94e3738698b0c", "confirmedHash": "06b3b30a61682e2d1f11bd15b52df09c3f4e8b51d2bac3e10d00000000000000", "service": "00000000000000000000ffff9de628ea", "pubKeyOperator": "8b208972e17c3e71021f040c458370b8a46b1606d7856b3abb47d53d2a7aee4738f48819d4bbca4063614fcb57e7deef", "votingAddress": "SGWVC9vFgcjN5HrVqSj56TgqYWi", "isValid": false},{"proRegTxHash": "065fef6b979f88a139f51d87326f7212d58a7d379344fdccb21785c316a32468", "confirmedHash": "24de7b01e4ef1e9d941f1b1c2f895102b99b37fe9376e8d72a00000000000000", "service": "00000000000000000000ffff68ee9754", "pubKeyOperator": "8840c31c80282700a5f19343ffbeeaef0286080237786af17dfff6f5a9f9f9ad3566b206303d840a8f870c7f355075b1", "votingAddress": "u7B8iUGoc2vfBeysEwVDx9zVUJc", "isValid": true},{"proRegTxHash": "413cd8828c6d14cce9af420602c9f67f08a16527618033225f4f86f554225dce", "confirmedHash": "30349a475b6caa74ce1515dccff52ca5332d4c225a308b8f1800000000000000", "service": "00000000000000000000ffff2d384581", "pubKeyOperator": "148ce39e3f81e37c199eed706694a3fa97ca480c9e24941628e7b792d43290dfcff5d8076fe584f356e27813eaad0266", "votingAddress": "3btE2NnvAqJvzJvKqRRo1JTHJVv7", "isValid": true},{"proRegTxHash": "1ad58c619597fa040eed81d197c74d8a9ca1c6ca0bcf2b6f8e6ac86b7ac0b68a", "confirmedHash": "87bdcdcd0a07fc25f40e2d2a575ca232a2969874700b73510500000000000000", "service": "00000000000000000000ffff03d31480", "pubKeyOperator": "860e14ef405e0c2c6924057741eb5eb418fa57ad0ac6027dafe90e617dcb605a5c28693eec4f1e842cd164114be8362d", "votingAddress": "3brgW5qnEWNcbWbYQ77XVziatUAp", "isValid": true},{"proRegTxHash": "ba76105a2c23edd8051153ec0cf6ff623ff52dd3ff6bcf154188f29137a1208b", "confirmedHash": "edb00c39e125efb94fc2bd4cfd2241eefc7b1b5d781045b92800000000000000", "service": "00000000000000000000ffffc2875946", "pubKeyOperator": "19007eb2c7d68ff79bfa085d0fc937350a975210f852841897c9c494244705cea9f2abda864f4500dd3339052185a239", "votingAddress": "Dvd2kgxLRGi87KWvfsrWSVptKTj", "isValid": true},{"proRegTxHash": "dfc0e863db86ca11d9f69433e180b0435f2427a57c96f34ed2d69df662d6656e", "confirmedHash": "b56179857026948008d5234efc6861dfaee47a98e938c68e1800000000000000", "service": "00000000000000000000ffffbca61ef8", "pubKeyOperator": "17e8231646f0b4706100e6394434a9a1d6a53478ac7ba31fbda9d4c2e3bb0b43fe0670b581b1506194a03e8cbdf1b706", "votingAddress": "3Nnd47Lc7V6ez7iAGEQpqmXEetkn", "isValid": true},{"proRegTxHash": "39b16b6a5bfca0b940062290da89ce63b169f34f792f0503891e115a1da92e18", "confirmedHash": "75eaa44d97f10f493b1af7a2b36eb48563601c1e0aae79621f00000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "3VadYCa6A53U5DyYAXAS86rppLSP", "isValid": false},{"proRegTxHash": "814896e48b5f09b55ce6b084ceeeb77c453d2956196842976c59b8c155438956", "confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", "service": "00000000000000000000ffff4e8df088", "pubKeyOperator": "04abf0519b7114fd86b3f17f536888dbf93d0619f87e7f0a41c71a49caec9a619752a56d78dd2d0374cea38e557213e7", "votingAddress": "GFdHn2cSjR2a4xUvGgkYEoxp8Mn", "isValid": false},{"proRegTxHash": "763f43fb970358000d76919f67cadf97afdd9d1d22bedff4883b3b263114504f", "confirmedHash": "2637304a36e8705f512c6a6022293a681d68ba521ffe083b0d00000000000000", "service": "00000000000000000000ffffbc28b840", "pubKeyOperator": "03759eb3b6176c922a36460f2e596f81a8cf4ccf162ef38b3fef4a8de98f5c7c818947030363db53226411d34f42fe34", "votingAddress": "oJjuuphwqNN1kctGZXYLaQDc3AG", "isValid": true},{"proRegTxHash": "e64f5b807ab593f0eb2957fa48295afc7ff9e3382a55b899bba90b428772b146", "confirmedHash": "1efe5b6ca37694c20a32f18223839acca385528a5c69a9d02800000000000000", "service": "00000000000000000000ffffadf9358b", "pubKeyOperator": "88f2b9eab14254c32472a56476c8a044c4f07ec9cc650db8c6d725b1650835df444f196b08d9557260df4d849bad73ed", "votingAddress": "PgoC9JfPVoC1ENrWRaMi6uE4oGy", "isValid": true},{"proRegTxHash": "70d22542fa3bb064aef22626cc0aa2503cfc7169d1d0534958a5eab1b63a5979", "confirmedHash": "38ff66636a5af1276e1cf73fb9708614daed5c81cf959fe72300000000000000", "service": "00000000000000000000ffffa763cfdb", "pubKeyOperator": "8a92e76686b968b87250110b0a411ac934bdd2c0ca0040b7ea62e114a889a76a5debdac80b641bbcbf29c6aca4f514b1", "votingAddress": "4QQU1ZEBBjXieahMwMcQKzfL7t28", "isValid": true},{"proRegTxHash": "d76e6527b6c9b91b7b3fe133185afc8eff1f6b3d07e4645b0d92ee22d2dab74f", "confirmedHash": "5d5663de2e407152eb464894bd54475efbaab9f9d5f63e391f00000000000000", "service": "00000000000000000000ffff22e9be54", "pubKeyOperator": "1386b49b2129772f9befe0be790841e420ccf534f421c13c49c241695ca65da6337af8d30d718e4733c925bdad29b6d5", "votingAddress": "47Qe3HkqjTWHC1Uamou38MUzWMXQ", "isValid": true},{"proRegTxHash": "ea955d02431c90f442dc62f77f839a8dd40b95487f02c57ed33a9ce6ea47f78a", "confirmedHash": "35fb0f4a01350e54996631d8234ae8032ea83aabd6a8b7080600000000000000", "service": "00000000000000000000ffffc0f8b39a", "pubKeyOperator": "96dac75fb5dcc05ff4e3aeb453f2b0387a5c471a92b6a5f04ae62b7beeb024dbe069852b42aaf1d0f84ab3973d1009ac", "votingAddress": "4Y2n8aPBNxVqM7UiXuE6MADWuraq", "isValid": true},{"proRegTxHash": "20337991630bfdba682d97095115e5d134cb799eb2a6365ef19eb52b9bd6ed81", "confirmedHash": "007e7675351a0a443670972003502b9df4ff2ef328f199ab1300000000000000", "service": "00000000000000000000ffff6deb415f", "pubKeyOperator": "8079a57f874ade8ea0f255627eda01847660a312b39e411b02c5130ce4ff3bb1326e15484373fd5b19ffa10fbdd6c773", "votingAddress": "2auKCQwkj82jZcn3A5E9io4XPkPw", "isValid": true},{"proRegTxHash": "a1238863f97ae93b21f76cb4745a5d331d1745fd65d7b22ad64dc375f8d53a04", "confirmedHash": "5f3d1cc0f4ac66e78d503704aeeb91ff712b98a2c189c76c0a00000000000000", "service": "00000000000000000000ffffd41861ab", "pubKeyOperator": "0c4171ce41a0358a88aefcac1e5e96c7235e0642d1370996265375aa605608c52668199c83fe203c30e6f7ef5fa1db20", "votingAddress": "UNMTRBQAKUfynwXvWeU8xsD9XQP", "isValid": true},{"proRegTxHash": "8077971005fd2eb00ecedaa724abc52b39d3e4ec9b3881a43bdd75816c06b31f", "confirmedHash": "75eaa44d97f10f493b1af7a2b36eb48563601c1e0aae79621f00000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "3zkYzmE7k3qn4Y6xdvUfuNH4ZEcV", "isValid": false},{"proRegTxHash": "258456d1acd8e635d1d6f3f7d3ab1b5321dc3819f79ca4c5b182522175631f0d", "confirmedHash": "eecc978bf8d02aa2c9d7f765a32010bb265c280fa566d02b1400000000000000", "service": "00000000000000000000ffffbc28b6df", "pubKeyOperator": "042cf882f0ad42f0973cd779b9f434d072ff1e238a5a1f9b61e4331485569bc6ec435b9bcd5047ab275a10c7aa0a36f5", "votingAddress": "2FYC9Sd9PfLrDiYZuf3uxj2VqyaU", "isValid": true},{"proRegTxHash": "0bab3d23e4d6e99bee1ba298e4e23705be016b42d04c82f44423547b39f3cfbb", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688b185", "pubKeyOperator": "14f553b2a430d226fbd9fa0767f9f97080e1690b7d947e114f23eee03d59e5b293ba5c484758fd40d4fb43e615cb3c25", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "298d082cb3d520339cd6aef69f07ada6fce1a9a9a659a887ad717f27fb515362", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff84919933", "pubKeyOperator": "0e84fe5993ff071c823b56d0dcab880b1ee55d1ab8de23db5df0c4e2eccd75fe63775d41cc93e8db186a6c9fc5a2d2e9", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "c66913fa59e3763fead3e4b4e578c550805f51a25343e7c97f21cafc778f66ee", "confirmedHash": "8a4f60af92180e80d2a73b6bef7116cf8281000345077b262400000000000000", "service": "00000000000000000000ffffc0f1d9a8", "pubKeyOperator": "1462e6045daddb0a71c6f8ff6c0d42cc4a3713fbe2c433d28300e6e45b0a737963735cc63c63cd7f2d28373a5c4426a3", "votingAddress": "2vCiYD1sEhZqgtRrLMCdzqQYcEzX", "isValid": false},{"proRegTxHash": "854bc561a12c7efe0abf346b7e27375f4f1c18ac04dd0c861edfa26c24101083", "confirmedHash": "7dd29cfea495586063cf4e1b16ac509620a2055cf3ce62193700000000000000", "service": "00000000000000000000ffffd4533df9", "pubKeyOperator": "08235417c86abd28912797aebf48b75daa5a925da3fbfdf7cc8bb25d963a894d49ef55abdb17a175fc6ad9880d7019fd", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "329e123a68f73ab3827c270a8123fe83a8d8287dfd25cb9804bfb76455590fb6", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96887c02", "pubKeyOperator": "012988b74ecd7c731c06993b458e17c43b2407c4b7e7907951e05bd0a74f46b28f688df332a81dc9ace54cc25743a3aa", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "99a4e4aa0859148777c4e6852d47f9b06e2506b8d59b6eabdf8f329f0e4c7940", "confirmedHash": "9129c82a932fff630ff46a80cf992a6097a450221aecf4720100000000000000", "service": "00000000000000000000ffff95f8344b", "pubKeyOperator": "8469de272c7201e91ba31cb7f1f057b925c6b157bf6d95b36eb0910d2bc6cf6c9c5845bf20664fac1d660b714f47f52c", "votingAddress": "3qDVkTvP6H6u6tzw8yFqmrm6b4DW", "isValid": true},{"proRegTxHash": "45d589ea1ed13e98e7dd64ce0ba5ebd8b6d915ff2e6f843f84611c26df71baa5", "confirmedHash": "38b17deace3b1c32081f9809e47e169c80f56967d1514c7a1600000000000000", "service": "00000000000000000000ffffb280e2da", "pubKeyOperator": "8a153b20bd3fe16489aa947822dc1785aba42da5d40e5429d092d36ea01cf2cf0e6ef10cae7cb7137664cb845da4c4f9", "votingAddress": "2ywAY1fZs299Ug7sm3xVqfZ5VxQh", "isValid": true},{"proRegTxHash": "3cdffc6f14634a73769740a4ed59453b97d71186cb58e67bc9a058bc716619d5", "confirmedHash": "5502a337a99cb0aef3a6e1b2a5209d3a17eed87eb4b9c9010200000000000000", "service": "00000000000000000000ffff8ecacd61", "pubKeyOperator": "8026e875b15645e8821481ed4e76e67b42b08c9a587cbd9bd4f6c84244da4f5cdbb9792ed27c59e2e6c370842a195251", "votingAddress": "2mtEPDErpLyTCXW5pKSfAcDEGvj7", "isValid": true},{"proRegTxHash": "0ed6e740a1195cf2da8fb81c376d88101f9b143240e8dbcfd2d9126d4be209da", "confirmedHash": "97a05b392d7a20a88aaba0fc6f711e59cdc8324875aaaf3c1600000000000000", "service": "00000000000000000000ffff2e04d9fe", "pubKeyOperator": "81e5be7fe18fdc06e177cc33b8cf84f1a2edb2e7facb70c46527761598b46c5cd611ce9bb1fef7faae46d4b939bffd74", "votingAddress": "XuGhZEejaVT6sqZZk5DG9fFa8TM", "isValid": true},{"proRegTxHash": "ed640e298247e4b8cf4f791738f34e0e5ac85ec973bed3ce01c581f9f57428d4", "confirmedHash": "c8fac7c25511b02ef6f8cb743098492c6b65d12e7f8611830800000000000000", "service": "00000000000000000000ffff55d1f1c0", "pubKeyOperator": "913bfe0cccf30484db71b6a7f24122b1d96d18f641353e1f5d9370c8d2bb673d53277b1b66edf7fab59dc98040117e66", "votingAddress": "2V7hawmQBgmLUQk9DAKi7YMQTPzz", "isValid": false},{"proRegTxHash": "9e9f6b830b958faefefc2119f6fdc226982dad23c09451c929b60a1678b446c3", "confirmedHash": "4e7d10ae56955054ae64d9c343097fb29fc272c81fb051f50d00000000000000", "service": "00000000000000000000ffff88f31dd7", "pubKeyOperator": "806266f5dfc6ee2463ff58bbb94baca161e0e65c505395d6b76ea141297c1c0f5ccadd1da46a638b219fdb6c10626500", "votingAddress": "u8fc4k8RT6TMN4Rj6oDcrXEBXYa", "isValid": true},{"proRegTxHash": "65cbbc2d18d7342974f6cf08e75236764fe6c849d48f914da9ddb81338f52438", "confirmedHash": "42e8b8913740c3dbb938334f4f057ca2d1e49bf9b66f7ebf0400000000000000", "service": "00000000000000000000ffff422a5fb4", "pubKeyOperator": "957e9b7190a6161337c0a7d91edac17a1e6ccbe3406ea695bb5f4adcb34c1dc3e5b4ee04692a38b8f37463885a6f63b0", "votingAddress": "3aThU8FGktfBB5ZuLRHep6ZQMazV", "isValid": false},{"proRegTxHash": "51ba70040a6e49429e75dfe53d409848d772b0bbb48cf906b077a1c4282ef24e", "confirmedHash": "0be20380f11bacbab818886c36ac98c962f8ef9a359ca1ff0000000000000000", "service": "00000000000000000000ffffbc28f174", "pubKeyOperator": "024e4d2b401eeb2d4b1bd4cb59f3d0cfdd6583ee35383a3ec347d692aae0cfa3ac4725c0fc8998fd2d836b22c2159750", "votingAddress": "2k2qRSiWqWhdsJG2HjnkeVpWj6Aj", "isValid": true},{"proRegTxHash": "3fcbf85896c7a9be000eccf983cf95c2204337e6e11480a8d9377a7b782a417e", "confirmedHash": "825ff51efd7ed0fc1fc428520486adf4d7acec61b83d33cf0b00000000000000", "service": "00000000000000000000ffff55d1f255", "pubKeyOperator": "83ee3c0f33fbb7fe29564eb5464055bf05308085bdd7de44e43133341649612cc402998788ad81502a310a3cccac112b", "votingAddress": "spbU8kjLYwJMGkx35RuiHKyXkSe", "isValid": false},{"proRegTxHash": "a0a40f3cd5e73d6786ec4f78ef5c622f449c9bf466e0382e731a25ac38ad85b3", "confirmedHash": "ef549ef959009fd972941368d6e806d38a3df6b45c39bb481000000000000000", "service": "00000000000000000000ffffbca6b62f", "pubKeyOperator": "1608402a6abb96704f6dbe808448e9d89ece60c8dd6794bd790840f119e6b15bce54f6c4a75f5c7aaada35ce53778897", "votingAddress": "2KK95VuwuZJFFkBoP1uty34kyJWi", "isValid": true},{"proRegTxHash": "e184fd4dc246947b91c54ec8d4980380a4e5dc7522ed8345821001f21b307f85", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d56788", "pubKeyOperator": "08353ce1f38420b9a4936d8db7fbf2b6d235ca0d7ffc9684dca6c00e97ec84a6a0e654a22603a362fa9d3f1fde99cf62", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "521b63a1f94aa700e1699cb147651fa4e177803c4f8df750ae5289382f740a97", "confirmedHash": "428205264e57387a62e70223d80b4ad733b4c809135f766f0c00000000000000", "service": "00000000000000000000ffffb8499886", "pubKeyOperator": "10d8f104c2f4b521a822f3c81ae8e44225d397975e19677b53192cec5661daf94b9dd9f1dfe2cdbdefa17570ae40bf5f", "votingAddress": "4BZ7XaXaRJre2W1cWaQayxkgMs8M", "isValid": true},{"proRegTxHash": "89b2e28f55cc9931560e0c0a826c0858a221cc9a53f4b1613e10beb542c4fa62", "confirmedHash": "ce2d1bc48482a03c27d32183e358405f76851febd55916720300000000000000", "service": "00000000000000000000ffff951c9ae9", "pubKeyOperator": "0aec0d7af1fa531702f43c2010a776fe2d7e7a3255a2afbfad94880defcb17c757c16558f1ea1c37623e34e81c59dffd", "votingAddress": "2DNtFQ3pFtn7tRpWS2gBzLm1LwDG", "isValid": true},{"proRegTxHash": "625b18ba449d2cf84d2d27d8bbf33a6bf9d7c04f3842c5b0250095a9b3b3a214", "confirmedHash": "db1c1e19f81cf7db869cd53732684ce0195d0c8ef6dd87b11700000000000000", "service": "00000000000000000000ffffc6c768f6", "pubKeyOperator": "87191a65cacf250829e28d871e2ac88df401baaac06773bd68a411d69da9eb24563e1bdea27f54aae3efd228ce6dacf7", "votingAddress": "275LoKWCiz97mu98wp2ceGD3aTb6", "isValid": false},{"proRegTxHash": "de97605ae820c6147e085bdb1b7509ccab0078a212f368a2d0b2b170c9bba772", "confirmedHash": "1ccdf3ce19cc438cc702d0d3625ddf56c63fcca326b6ac5e0200000000000000", "service": "00000000000000000000ffff2d20eeee", "pubKeyOperator": "9501fe76f1cbe74db71b4312b98c4e743b2d7f669361beccdfcc11e2bbceba54dcb7c4500284658123493cb9b8c1dd01", "votingAddress": "2F7YoiEPFXZCEge9T25ufmZDbEqW", "isValid": true},{"proRegTxHash": "40b1acacb3176515aca25474ef4cf17b0f2007aceea9a4a4778f76d194f1bf0e", "confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", "service": "00000000000000000000ffff52d31583", "pubKeyOperator": "04bbbe07d8c16a745d07f8e30f341c1994c9fa9c038dab1d32823d5d7c30a386f0f176620d8cb1e5889e2ca5ce018a39", "votingAddress": "4WSeyy8BYaw6FCZ9EZtjF74qcQSu", "isValid": true},{"proRegTxHash": "20853c4c23dd8d08bc8cf70b1fe2e6a27b10d225def45f78357b223830bfdc54", "confirmedHash": "66a234d002d5f607d14c3ef991cf9a4e22dec00c5c809e561300000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "3CzY9uSLJAY8ibQfGLpEArTmb9m5", "isValid": false},{"proRegTxHash": "7f8d5105b5d51c28c90d24b9a8f57339a3421dce4ceb4c870bbe603f04fbbda7", "confirmedHash": "a74500fb95eead4161c1d96b1bf682b2bcc4fb3a288211220f00000000000000", "service": "00000000000000000000ffff2f6e9b57", "pubKeyOperator": "8f689439a97c0e566ad8eebb7b5ea7998c09c45fb23125226f3eb66f66e88525cacc18a05f5d7aff770daaa68b69e728", "votingAddress": "4ZkKnXmAJtxQ4GtJvRjGzpKbcLzb", "isValid": false},{"proRegTxHash": "196f57800192da742384992e1c709ee57d48330e83ea4b5eea7ce54261fb11c3", "confirmedHash": "4442849453753388cb443d528d1068a6520ecb8c9500b74a1900000000000000", "service": "00000000000000000000ffffb280ef16", "pubKeyOperator": "8119468325215d90aab89da6cfaf2862e9d899304dbc754b9659fc6465b28518545cd1c6b046d0ed06ff80823e13be2d", "votingAddress": "C5Pt5iaUg2qs6pZqMBefAc5pcdn", "isValid": true},{"proRegTxHash": "1747e2d7bdf16c9b40a6e6e4e469ac2cbe3c4e8796f9add5ba8372af6109cc31", "confirmedHash": "c93bb7ef013972b6359bae93a568fe33c22e42fc047cb7530900000000000000", "service": "00000000000000000000ffffbc2815f8", "pubKeyOperator": "185b08eb785e8bf19b36d1756d05083f559310c7e51b0a2204270ccdb8c01b3520a3c5ee4cfc9a9d77643342acfe6f5c", "votingAddress": "TYMz34cLkh4sdMWD5kEwXzd5UJh", "isValid": true},{"proRegTxHash": "21176cc438ec4cdb7fd4478d8231a697fad30a459bac788a4210dddbfe7a149c", "confirmedHash": "3a3bfc908d4610b60236aa0c34541f39313854b413aae1780500000000000000", "service": "00000000000000000000ffff9df5c181", "pubKeyOperator": "8d78e2ee57dfcb7021ba583e7e37c03173c58e36504d2f428a7ca1dfb0fe5542acfc02e435783885b169af383fb3a532", "votingAddress": "248hspwR9EDQAxeu7n7m2fJiczsy", "isValid": true},{"proRegTxHash": "8d5989be3b55ce810021f5193dc2be1ea3faf3f9917b1add95c63f8a86a4a105", "confirmedHash": "a8f1e9a9d42e3af5bc29f9263d61fc554cfd8208f8e38a311200000000000000", "service": "00000000000000000000ffff50d1e0c9", "pubKeyOperator": "011b72b829cb14ce83ea451689dccd4f4726412e791999a5feb9759088dc578d1c888fb9a85a00effeeb33cce7f0263c", "votingAddress": "4VTceVNKxfhK7WydJC9uDBDBdvE8", "isValid": false},{"proRegTxHash": "f68bcced2938564b30421998421c70ec4fc56e1535d131d33b33aa22a7b5ce6c", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff03636397", "pubKeyOperator": "8c0bfe2caab30a3dd77b7cbe257af4d38bd8aff5f700071d76e94f4e3980a37b21388d11edf2dfa8acaaa41387754a76", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "50104f8e7f59d5b2dc72f2cd2d87913ce9b2e878b765d38ebcc0f1bce07b73aa", "confirmedHash": "9129c82a932fff630ff46a80cf992a6097a450221aecf4720100000000000000", "service": "00000000000000000000ffffbc28b6dc", "pubKeyOperator": "928156d91fcecaabef3471b803c87069e7466ca8e0cb686890700bf11ba88e7dc701daf6f1b4344f6d48b537c5cc2ee6", "votingAddress": "Wzfw5HjoEXJsAbtSvSFbqr9JouU", "isValid": true},{"proRegTxHash": "45c6ee91c09ed198389415edeaffc47d278736190c92e8c92c49fe8d89708dac", "confirmedHash": "a9c6a6b6cd293de50a2965afb537ac36387b9ef8939508c00f00000000000000", "service": "00000000000000000000ffffadd4e3ba", "pubKeyOperator": "0bfe7d128087e9dae0e26ba08b77eca84f9ca53b530b3bac19251161946bc164dbc33c810e7d6d539ef5981864aa8e62", "votingAddress": "2tEpwzcCAcU23eG9dqGaFpEinB6R", "isValid": true},{"proRegTxHash": "9723be061bf39f495bffe942dc78777b0f1f916a873609410284efa7a3ab6ea5", "confirmedHash": "7503016b8e21e9d101b40d6b75b846755c063b77e3107b970600000000000000", "service": "00000000000000000000ffff05b5ca17", "pubKeyOperator": "99986012419b3e1cc56e9da60609193ac4afddbe4223244afaf2099baa8c3df21e90a172471f98a2b56592b171cb32c5", "votingAddress": "3z5fWWGhQp1tWgPEWCGdm3pzWEMP", "isValid": true},{"proRegTxHash": "7b8f87800f9e5e63c4101a81f3badfbd9d8890453765d8f09c85f0e44d5ef633", "confirmedHash": "a5a3513596c6be2381496a1afba788891ad77da924ecb94e1600000000000000", "service": "00000000000000000000ffffa877530d", "pubKeyOperator": "157ce7a10d31e0941c2f01edc703a689aff04349378ce5872e1a4f92158a22e6b2945f2d0cfc6ebee171f2e9cd7c1c79", "votingAddress": "2d7zG2CzzZkwTKcPCrcbS9xbGYGo", "isValid": true},{"proRegTxHash": "8651ebff3bb689b628f1bc1a290c492e26ea7f7bf5ae5ae8067bcc1f3add7e72", "confirmedHash": "42afa1ac40ed916b098186218b144804dde703eca20c3b0b0300000000000000", "service": "00000000000000000000ffffa7632acc", "pubKeyOperator": "95a6e2d1fb30575ecab28005e666ddd5c206c28fb9fd89add9b519e4715b258d98b701985369f6af517cbc83e1363ba9", "votingAddress": "3dWq7LUxC7dUZUReiq4M37rUkmYa", "isValid": false},{"proRegTxHash": "2fb9696890847dea37970695c95fbc1e7d44c61998452de9b00f0cff1815ade5", "confirmedHash": "a0c5fc8359622587ee670c2f4ee673fb44aff2950ac5bb811800000000000000", "service": "00000000000000000000ffff55d1f25e", "pubKeyOperator": "8b369f1c14b10c6a9b0091e2eec3a47bafbbd25d98886683e0ebb999934897458a272dbf071aed2958c16c1e576656a1", "votingAddress": "495eVdHxRKb4bDagGrAwgwKX1CED", "isValid": false},{"proRegTxHash": "d800eefbdbce64c7370051de96170480e83acb194015226e4eb3ed47c827b9ff", "confirmedHash": "eca5ed7bffb2c38e32206c2a21117018325474441e7fb6370d00000000000000", "service": "00000000000000000000ffff74cbefe6", "pubKeyOperator": "9185f8a9cbbe4a39084f37ab9326cb82ab3224ef962b332a5ba9746ff16845ce34c2e9337d4c43d1acf87269d83a40f7", "votingAddress": "49SFCEjX7SJoxeQqeibvr599YUT1", "isValid": true},{"proRegTxHash": "f556c2f00e4500ba612361eb74c0c699d838bfefa9e3351964db07c8bcc6bc21", "confirmedHash": "41b18cc251ff63c4836061cf2362c73a36e3832e9ee33f1d0500000000000000", "service": "00000000000000000000ffffb951a6ba", "pubKeyOperator": "9495fdb61a8efb0f52a2f7c0ca0869096244deec58d8c246c3baa31193f52fffe87463f824c51a91c9e4957587c5efd1", "votingAddress": "qFd4jRr8BTtaCWLwkck6TWEPMZY", "isValid": true},{"proRegTxHash": "edaebf3474de97595175dc902d51ecb68a0ae8296c2e1e9d8f4497e974b42f4e", "confirmedHash": "e59accf123796e0e7dfe26f4fd3dc8a76244603294deaf201300000000000000", "service": "00000000000000000000ffff52d319b1", "pubKeyOperator": "120b14f4629acf7b553f8479253baed15cc9297f4e31998045928b9f35353df3ef10064e1fb6b929da934461babc9701", "votingAddress": "Vgh1jgMYUhEyefbkXkUVJ1PtE9v", "isValid": true},{"proRegTxHash": "d7c0742ff5feecdf9ba16028cdd20ce6d740e8134e726967b472e57c4e80e50a", "confirmedHash": "4db5b3aafc6e597aadbb5e13559fcf29f3e03f3e79374ff50600000000000000", "service": "00000000000000000000ffffcf9476c7", "pubKeyOperator": "980d9cbfe63468e27b06bb20224f9f5a443a3a8d31fd4e7d52412121c5b7b2f6036089eae3dbbf36a1a7fa2fc1de654c", "votingAddress": "2jiR21jiqjEBFFx2U83q6cak6zDG", "isValid": true},{"proRegTxHash": "ef9f8d8b86726caf9d682ce4e79c81e912e05718f4201f6b9453ca5493d51846", "confirmedHash": "38726b2cdbd3518b9e715cd8127730057afa6417e0fef6760d00000000000000", "service": "00000000000000000000ffff93b6bfb6", "pubKeyOperator": "064451f17b5898826ba2357f3428ac823a3afc065bce3852ed5a3da151aa35838ddd55993ccaccdeee1bd84c8fe2d66c", "votingAddress": "FEKoY7ZSqyVGdn6UJ8VpSvPe2hB", "isValid": true},{"proRegTxHash": "9789091a504052e310683be65c880ffff00cf6fd8a0ce27d4e165907de5fa1c4", "confirmedHash": "5728ba9f116069a39373bfc02d429588c3bbe983212c94573000000000000000", "service": "00000000000000000000ffff9f41ca25", "pubKeyOperator": "99845ba07218cb70ad5779f7c70fd6bb5d1f807df3b772c4551b9a79c4b1ac39e3e46379fe2209cbc940f8e798314712", "votingAddress": "2hknGqdyomwjT4dXaVschHAS9ptR", "isValid": true},{"proRegTxHash": "d7de9d7226e3e161a79e8947e811f7f0a5936a7733ce413cf71fc8a6b81611e6", "confirmedHash": "7705e9072b7a77fca4f0cbed0450aa274670dd6c956503820500000000000000", "service": "00000000000000000000ffff88f31dc9", "pubKeyOperator": "8d15eee82c135d0c79cfd61e1dd8c16d5165f70e04a545bf005d3b00b688d90d260babd985dcefedbbf957558a1a970c", "votingAddress": "bDVCkJgXX9TgPLsmNm5CA9ztgsH", "isValid": true},{"proRegTxHash": "5f36c6b5619bcef5e3610737ac251a6a0b85b07e98e13f8a79c6001b0fbb5795", "confirmedHash": "9ffe472f95dabd7e478c3dd1718d90309fd83a6d522fb59f0c00000000000000", "service": "00000000000000000000ffffbca62235", "pubKeyOperator": "8c876ecc080ee3ad79fb7e2e06d04927eaa1911e7ad366264781f949274680cc83cbf16d64fdecefd852b6d9d5fa719d", "votingAddress": "PGFYJPWNZ2UuhsQHiLre8iCZMY7", "isValid": true},{"proRegTxHash": "f36463740e39dd10b24a2f200ebb57831b5c9dbb814e05bb751dc04effde79a6", "confirmedHash": "a25fca447f26d77e82b7298ea0a1a22f6b5777d46faad9832400000000000000", "service": "00000000000000000000ffffa747d1cf", "pubKeyOperator": "89414e42fec1e274e153c51d1983cbbd4eaf0861b64ef110378331ad43a00889f4633bae28f833cbb1f4bd4234f359df", "votingAddress": "3EsVZEGHLXZK2ka71jSkH6mb3sJt", "isValid": true},{"proRegTxHash": "1ae6c1ef3b3708c6f35226b144704a2ba5b3e158a21496adf98aa469979c92be", "confirmedHash": "65849ed3af8fd99c51d3ca1cfc41de02955b98c82b9e76db0e00000000000000", "service": "00000000000000000000ffffb2d1321e", "pubKeyOperator": "9033402150102018f415c3339341fcd4a4485be1c5586f3e8031dcddbd54f2ed1bb03896178ee49509d826c3d4abc551", "votingAddress": "4DmbwVUTG3qibFVrVKRbfw9rchFg", "isValid": false},{"proRegTxHash": "4efba2e97af01967165f51dd89da1c205812621c71a72b95740a98be0318ea0a", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0a2", "pubKeyOperator": "98fbe1a9193f559bea7361cad65739f8192e549ad69ab78556a22fba3e1d48c79864143200ad4d98580ac2d9b23391c8", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "1dae0562add412b8ffc20aea22daeb376f0628d23727b0816ad2a47f1daaa8af", "confirmedHash": "560b3944219febad69a69fc4039b7bc9af1ac86dbe2050ed0200000000000000", "service": "00000000000000000000ffff55d1f23f", "pubKeyOperator": "1236a311ceaaf7ec1db7fdcae75db789a407e182b66056e6d2446e4e824a57b2aa0f72deabcbc29ad8897c75f3bf76e1", "votingAddress": "2iH3x2yyrqocCYfcWKjnWXotSELc", "isValid": true},{"proRegTxHash": "89fb384125ea72f1e387a55eee051e1604f13167bf700d53057d5db1052e7560", "confirmedHash": "47930554e5bb3de32a1491ab4af492fb4f53dbf2fdf961590c00000000000000", "service": "00000000000000000000ffffbc28cd01", "pubKeyOperator": "0c980e091913b2c7bd4ec9cfd4ac7144c7e5cc46eff8ee1c9f67018fc2b20e480b8a931f6caf56609cd96959098d0edb", "votingAddress": "3oH1W9gE7jdDhQsKnpFQQvyVqKMj", "isValid": true},{"proRegTxHash": "06adb3d7951ed7d26f6c62de82a4dd857567588ff532abd15f60563abe40b093", "confirmedHash": "2783fa912f5f0fa082ec966816f4427bb0cd2c7d443df0d92900000000000000", "service": "00000000000000000000ffff2e04a270", "pubKeyOperator": "135f473c23f97d9b930f6e257a1602105c4ad4cf5a9f81a8f875777462cee36e3a3ed1eb6082d1c4c1a41165b67878d1", "votingAddress": "2mJGzer25BA2UaBZMmZL3DsjAh8s", "isValid": true},{"proRegTxHash": "9b88b67dbc0ef8ebd58dbee599a3d919a5e62ba631c54193bb2c0ff87c1f69f2", "confirmedHash": "dcb88c91bde9761b7e712537e7a17dfbb7c86bbb819f0ec91200000000000000", "service": "00000000000000000000ffffbc28b6d7", "pubKeyOperator": "81d27d965d9a1ff8eb03e8dacad42b5efeb33c61f63e239f8836bd56b3c008736fbae2241dba2a05807d7456a4370278", "votingAddress": "24u8AHcH1PZf9bQ7zoPQaWd6dd15", "isValid": true},{"proRegTxHash": "9b717731712991492358523921e8c42eb13c0b70c727d30a2518214f29a667b6", "confirmedHash": "16e2e22744c91f027f70373a14a6c3fde18c58fe34c3de301300000000000000", "service": "00000000000000000000ffffd1fafbeb", "pubKeyOperator": "817f9d639052dcfff63fb3b6d74da3a1fc9197ef920fe751e6ce4f363ecedc529c425eb9c6b0ffae3aed473f62f23e1b", "votingAddress": "2uVo4mk5VLi2MGZsFauN5WyKYpQ", "isValid": true},{"proRegTxHash": "0a2c94206cc91a7819d2a58910e99291400f9705792870ccabf31dca87d2ff7d", "confirmedHash": "635e82d5edc1ed8210db7e0a5fc2aeaadee08a78450750d41100000000000000", "service": "00000000000000000000ffff3e4d9bba", "pubKeyOperator": "11fbb3a0119175a6538794b27c224f5ca1c9a233a38162c0a318d4247163591f14c89cdc167cf417cbb0584633c7547d", "votingAddress": "3GfteG3zM9Yc14Q5GTBLroeLWE96", "isValid": false},{"proRegTxHash": "469a25ebd6429157ab6d0daf57aad8d26a92e2e114fcb48da7bf0366417e7cd1", "confirmedHash": "59923533474ab9296e6f2a3a207f5b688b367eb1492a249e0300000000000000", "service": "00000000000000000000ffff91831dd6", "pubKeyOperator": "190325e47a12b20446c64214b41d8b50d1e1574e303adb5fae4a57aaae2f9737053e1aa8c7b25e9d068be6d8f25b7e5d", "votingAddress": "3FBXGrqBAgbURwxmDPgabDiz9ncd", "isValid": true},{"proRegTxHash": "2bba7d3b6b09f09c6a1ad3039ba3cafff6230599cc64de9bb8176a309fbfa04a", "confirmedHash": "8d2cd8dc9b6e5acf9b5ee1f2032fb3611de6c9fe2eff54930200000000000000", "service": "00000000000000000000ffff6c3dc771", "pubKeyOperator": "114923b2ea69b786b8dd5ae2b95f726903735714890b923d42288f8a46d894009749f5acd47340de1a3a4d33d80a3258", "votingAddress": "4Yqwd7ShyvGYToBCqouFd1DtYxZD", "isValid": true},{"proRegTxHash": "064f7a4f913ecf179b4f50f7f87bc56165a22e010bf0920b0087739caa9e657c", "confirmedHash": "d3129d623c4cbc8cd76e6980acf34e6343c05c3ba3cef7d50200000000000000", "service": "00000000000000000000ffff55d1f1e7", "pubKeyOperator": "14eca2afc599c450b0029ddb12b811ac6c43070bc29dae0a53b91a1558f2376836be9c40e33feefdc65fcab666f1ed5c", "votingAddress": "AM2x7qVLdcudaRdPwUkEhUNp2mb", "isValid": false},{"proRegTxHash": "39e27a375df9aff0a0ef46206c8ebf7822206672d375e8e6de60dee044654f30", "confirmedHash": "87a8bc7d8e26c3ec42e5405811af1d93ca3474f4712303452400000000000000", "service": "00000000000000000000ffffd4186d11", "pubKeyOperator": "907f4c7b05da845889f4a6dbe33dcf2368f802c38b53c88a570b445c70a6f8b220816d2c5d70b7c240e49532bac3e4c0", "votingAddress": "3JrfTJAmbHyomysMVrPuhmmLob7a", "isValid": true},{"proRegTxHash": "fb58cecc6470e3d1c1b438db2b41896dd424dcca435e908c6a0576d099ba0ea2", "confirmedHash": "d96f7b66d5cc2048eaf5d9af511f712f401ec6f330afb63d1a00000000000000", "service": "00000000000000000000ffff52d31525", "pubKeyOperator": "8cf37ed30345238ec307a3d9730da91632350cd4ef1bb7436e697a0dd64f4e6ebe6e3a74e5c127ff4bd5953f1f67603e", "votingAddress": "3MszzPmoL2WAq58MPDJGng7AuZ4b", "isValid": true},{"proRegTxHash": "ded36f1ee6eb2fbb6e72c00296b886dfccc971ae68cd9ec81f62a0e63cb12462", "confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", "service": "00000000000000000000ffff55d1f26b", "pubKeyOperator": "154afd7f7aebfb6a9b7d864beed1a6ec4f49469d3e38aabe1205469cdb9931201e37249a94e7b801dd93a450f66c9276", "votingAddress": "31vP9DarDkwFYP9TSfD8KtojiQss", "isValid": false},{"proRegTxHash": "bba85252b1954f8f635f874b4862d58f7f17c16f05851123e03390ef94986f18", "confirmedHash": "44c3f82f3b933fc6fdeb91b02f72f644bc9ad82ac7d4ac501700000000000000", "service": "00000000000000000000ffff2d3f5375", "pubKeyOperator": "839b27bb711b188ebdf1c4f63ff34c840cf2f36e06ae27d6d4eb9f37904e4efc6b333a3a9a20780a82f66a6799777cb9", "votingAddress": "3Jn89oCs3oZeNhqXf3ktd6QhsEvf", "isValid": true},{"proRegTxHash": "b779ab348b91f57a2c836222f361203a5eb8bea1071061e43447ea3a659f1032", "confirmedHash": "b60c2dbbb213c99a236e1f30c1d9f41b204f0b13b294c83d3300000000000000", "service": "00000000000000000000ffff03e15bc0", "pubKeyOperator": "0653e9d25cde2e63efee0baafb59989f374b82bf37581bf5f6d87453b745313d9c4fe6e709f68f01951d416fe9ecebd9", "votingAddress": "4U67CfA5Uxy4t8tv7tbHcx93ygyJ", "isValid": true},{"proRegTxHash": "6d6b5a64374b288901f7f088dadb2f34e0276436b99e7c3602e61f9174167241", "confirmedHash": "f11877f5f49b003550ebd4da3c8d9c81a9ab3a3a95b7c9770400000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "3T4y7sR64QmJXSFecDqtgfJPHkiH", "isValid": false},{"proRegTxHash": "e690612b66f1745c520c61df895482575c2ca62b619c8866e2415a4b381b5a98", "confirmedHash": "1d9ff09039214650f8aa0415c35d0306514d5b40df2a19ef1b00000000000000", "service": "00000000000000000000ffffbc28fbc5", "pubKeyOperator": "0781b348cd3088aa77198356bbbd57ab6451fa98a383642772356fc852cc5a4fb1dde0e59159965dbc9a62983a7f0b40", "votingAddress": "5qvQnWw5rNh1PRHBYzdxiC67qSF", "isValid": true},{"proRegTxHash": "ae19402ee0b474630b79c88d491d365088720f58fd76c6f4dd20f9a77926d7a9", "confirmedHash": "635e82d5edc1ed8210db7e0a5fc2aeaadee08a78450750d41100000000000000", "service": "00000000000000000000ffffb0df8283", "pubKeyOperator": "0f2c9884e8c06f79d75d5cd70521523ae222fca6c437824723c8d40b1116bc990e5b105c668fc027f3a9c5fbd8ac6d78", "votingAddress": "4od7cYqZNJqKKqyCUu2xRneAhiS", "isValid": false},{"proRegTxHash": "74666343b23460671d0081ea590f40a8b689b0b3ba55c0f1c9cdc41752ca8482", "confirmedHash": "e86f8e166e56b8b2a53e33664f859862b7781bf5437040e40900000000000000", "service": "00000000000000000000ffff2d479e3f", "pubKeyOperator": "96ab699e6e9d4664cb77a22230aa308ea6d468920b23431e07626a6e017ea252f51e33c73fd08fa132ad96d2a7882fb5", "votingAddress": "2x9wfnQZsFKnhWEjLypQ8DU8A2YT", "isValid": true},{"proRegTxHash": "d96dd0b0d473a621db021b0813d1bd32c78828c3ce8d34ce5cde23b818ba65ec", "confirmedHash": "6839133c4d9bb2c0ba09c272a845d32163fb4044b59171061400000000000000", "service": "00000000000000000000ffffb95cddd8", "pubKeyOperator": "924b44455c65e2fe45827232dbc3bd709b7c16b568e516ef6809b1fc0d425ba9beae7342df62dd46241acceee2425be4", "votingAddress": "2sH3CzycYtAvJ6vhtrmKMPV8GVWP", "isValid": true},{"proRegTxHash": "e012ede4b7cf53cbc66113c9759c552c96342140c1a68506d9d6b08f0bf9e84d", "confirmedHash": "da13c89ddbca64ea1aa3b2d4b9dc18b5564b26bc8d3d027e0600000000000000", "service": "00000000000000000000ffffbca63c89", "pubKeyOperator": "90213c1d2da13cdd6ae6c0366cec94897091e50d951720ba21ecc6a07e021171326186ccf8d12c7621c0e7c8e56ddd25", "votingAddress": "buextPKGqGEjTtgCb384x2mherg", "isValid": true},{"proRegTxHash": "a32fa0b8967cc6e5e16921150ed127ea3efd81dd6157d9453588a2b603389a17", "confirmedHash": "32a33fa3a045c16f81c1b885a86c621c59dbc0b078634eaf0700000000000000", "service": "00000000000000000000ffffb23febc6", "pubKeyOperator": "8c4e37fe05b1a46d8bc097514a55e1345e93d526734ea04b107f47710df6d189af04ccc7461d02e57ea56b749cb68873", "votingAddress": "z7bygvsErmPL5C8Da36UewXX237", "isValid": true},{"proRegTxHash": "0259b1be8167fb6afc3125133023971f9aea6c65c67d5c851530e29d9f7fafeb", "confirmedHash": "ef5c4419ff85c107d03909e43abca9291e4b7774e617db5a0400000000000000", "service": "00000000000000000000ffffa7478f03", "pubKeyOperator": "8f9b67b255037449f13ef5b1ef930932db75c7abd6f55e23c3b1125bebe56ce632c013774c2c2583dfe786bdc998e02a", "votingAddress": "8ofMnxccm5TfpGoby9eihhhRvUP", "isValid": true},{"proRegTxHash": "308a2413816f2b37ef6b0558134a37749f8df2803d83710da0c867f5293f08f9", "confirmedHash": "b7f44fd324837d991e4ae30f9bbe6ba3823416d2c27f4f950f00000000000000", "service": "00000000000000000000ffff1751f62a", "pubKeyOperator": "0acd3360823f74af45279e80e4d19d4bc8eec61edcb4fe0baf855a97ce7e72341705a5a83860a8c14b60150b1d65079f", "votingAddress": "23zLS8DtvAuSi1Ptwet6s1wfeyaj", "isValid": true},{"proRegTxHash": "74719bb7b61da3d2c4690e4f0444081118c99c0713972631b0912ee3d4137295", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d52c0c", "pubKeyOperator": "0b7fde2ceb2b49431f11da130953289173be626a132a86510389d1920ca576102d203787fb2f6027245397a42b9e1752", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "93f97344081209765c5908941fb116b07bc218e80e6c53bd576bd831ec28defc", "confirmedHash": "56be1287457142eb6191a9bdbfe89e1b1faee72868d87ead1900000000000000", "service": "00000000000000000000ffff52cae653", "pubKeyOperator": "0d6f95b3f2e522a21badac5569b62a09fbe860d302cd7389a35511c0211cdbdb0cb623c0dc40f8577fd172a62ec569ae", "votingAddress": "3nEAvUR3LYR8t97ruXMp3tcBHBuc", "isValid": true},{"proRegTxHash": "e30f32fea12be1a44f227633a06b82741603c0ff10ea81467eb8ef03aa262012", "confirmedHash": "bfda2bc9d6201590a97fe04b3d3158846836ba1e6d62ba410500000000000000", "service": "00000000000000000000ffffb23ec266", "pubKeyOperator": "8e69d42122899fb8a8cf922bf17a4f5d239e885c24caf0ac8c1c6e20bf404ca1cfeaa364108d547e3a1e2190bc704312", "votingAddress": "3FoKMcMPS7yLnvFN197Wbzfvhy5s", "isValid": true},{"proRegTxHash": "d679eb34d4efa9556434b75ee618532bb38ee035ac0e8f9b5435f21919eb60e0", "confirmedHash": "f517850c04a0d7e780e5dabca65ae052f318f6773bbc93790300000000000000", "service": "00000000000000000000ffffc2875b19", "pubKeyOperator": "0bf4cd80c095ecb28a5d9c6473984a19af49e471bfc8a5882767354d69167136752277b1a7a7a6a9e638027885c2f09e", "votingAddress": "qUHXDZKr8aBu48JdqZD16YbVwaQ", "isValid": true},{"proRegTxHash": "ba91b8d0261cf5e1118e27ba4bd93e61d0c1f06431ba8eb03f8b9a48f3f91690", "confirmedHash": "7ac821d6ca52a76af85e19daee7e19889b3a952b01da71a51000000000000000", "service": "00000000000000000000ffff3359547a", "pubKeyOperator": "9192b3d1187090e19fb7aa5e575a6790d1812f2846a01a6c675d829ca8d0bc5b3ca5aedd355d213f6df5a5715c0e242f", "votingAddress": "PpEiU9ULs4uWkqXU7qoJoRKvQpf", "isValid": true},{"proRegTxHash": "4a001d44576d10313fb8787addb101964e1777675d4391dfadb684dd3954b8db", "confirmedHash": "6ed6a400b9c9b65d4da63626648be9e0bf7bd2b07a8e1db71300000000000000", "service": "00000000000000000000ffff50d0e15a", "pubKeyOperator": "91d878b5c0b780ca9e6a1969768a8fdfb7cbe9e70d943e8d6f4b6b050de21f6eb87dab358e2d71c5a47dddecf0079eb4", "votingAddress": "29Fi9z4WHoqrJvEM4pcyheXPwhff", "isValid": false},{"proRegTxHash": "7edb77dd1cb0efff828ba9947aa2a4959f2deab64becaf69593d862d8062e2cc", "confirmedHash": "cf379e822fd33e12c0ab82057ece03b77f7e23dcc99e3e4f0000000000000000", "service": "00000000000000000000ffff3eabbe8f", "pubKeyOperator": "8ee79dc467686e32e699539006cede36abda352f69772337d9abcb486850a9c8674689da1e9d221f615c01fe2cefd19b", "votingAddress": "2qg8cGq9YWb47Mt39D2ZqsqDzjim", "isValid": true},{"proRegTxHash": "556c08d4962bc7da0ed101165133f2c3fa6052c8a88d176ef9cd07fd23db7b41", "confirmedHash": "b1d8147276265a35430bb73787d6e76c229b3e63282f7ea61700000000000000", "service": "00000000000000000000ffffd8bd93f8", "pubKeyOperator": "18c2fdebabcd8c5880cc06a4d422f28b945de5ec64a8e25de81074c2fb44cad52eab55926d1a18b073e6a064a01e0435", "votingAddress": "mXztN7tvKK8U2X6qu5uKrTbAQJ7", "isValid": false},{"proRegTxHash": "a81bb26d39f868c4af6fd46e771219a791227f2550a240e76c808cef61a38a28", "confirmedHash": "41ab00fd542d308240d8661ba11a4d8e9fdcd838374deb543400000000000000", "service": "00000000000000000000ffff58630b07", "pubKeyOperator": "04e1a7f7560a9422ab86988b8feb56d3b81e3e4d7fc2877c0611ca624ade53e239b9a7176542333375c6edf7ca9ce044", "votingAddress": "Qr9c8GvzgahAkkWf8GNG9K8nHdY", "isValid": true},{"proRegTxHash": "e0e45d58d6e540d174a63e772f1954d2a2b7b529e211fab355c67c4434b26bfe", "confirmedHash": "a60d3ab71c1c8502209c70a62da5a320370c3c1759cfdf110700000000000000", "service": "00000000000000000000ffff55d1f204", "pubKeyOperator": "8655b8786232b54ed3c781ceec558bb267bd629c84166c77973ec247390a4a639ef95d36a1e8e00ddcbf6eb3abf38e11", "votingAddress": "2ZydN9B2dybXnZj759kbWrRYHv9D", "isValid": false},{"proRegTxHash": "1893b61ddf42bdcb5ffbe215cd9bb13f91c86737e25f4241025dee23b9bbc008", "confirmedHash": "08d83331ceaf20ac921fe42c759e6f027888a0eeff7865991300000000000000", "service": "00000000000000000000ffff9fcb8df2", "pubKeyOperator": "19e4b3b5514033c270af532180a261be57c77e5ce8e1b87e9fe9b6d7e83ed2879f3059d30b822f3cfa03929c19229fa8", "votingAddress": "3TcWitWAxUArj9QHF17A1nouB31K", "isValid": false},{"proRegTxHash": "03895d0a4a00498b8bf0741b6c2481c820c81fb78f9803a42c9624ea53a1f663", "confirmedHash": "65696c960bb8b682a20ec21a5ca18a8b8823c8569375439d0c00000000000000", "service": "00000000000000000000ffffbc28b241", "pubKeyOperator": "1352dc502f30a76e8975fb779a58b0587229befaf5dee6d3943d2840288b286fed33ceb79871ed3490c1731f129252c9", "votingAddress": "JbYg8fUVZZE9KadEyBkwHHaGgff", "isValid": true},{"proRegTxHash": "49adad01c0e01aa08b6b30f5e46e832b5642532529844530e68d4cc56e8bddcf", "confirmedHash": "6fa9763e17e0362f96b3a480c379c53c561fcbecf92080181f00000000000000", "service": "00000000000000000000ffff50d3cf8a", "pubKeyOperator": "0d65d37d38274bf00d14bb57255ebe4d940f4f09888ef5744aa7e16d40ed73391bc70d671ab654c28a4a0ed642ec37ff", "votingAddress": "3fo4TNBTMCsfvZLGX9jsckvb7ny3", "isValid": true},{"proRegTxHash": "d6120a808dbe17dacffa5a201150d246d788911d7ea07cd830edb0a1786b278a", "confirmedHash": "0335ae53e370bf027f1bf8e91067f51e0e004a03797f4ebf0900000000000000", "service": "00000000000000000000ffff3e4d9fe9", "pubKeyOperator": "0fddb7945c0bbfb34769dd049a99f839948cd527397da7dbb9498c8cbcdb82aef4e3ba2131af5d92f5419f81a85735e0", "votingAddress": "44mxJcWWia1pzk7o9FKnZWX8eux3", "isValid": false},{"proRegTxHash": "a7da1ba846343c4d60e3cefac0c28b64590b37992bf1de9f426e021374493c20", "confirmedHash": "654e3a3a90ebf48dcead6f0d1b54d4ba504cda3bd71289e42c00000000000000", "service": "00000000000000000000ffffb2802afd", "pubKeyOperator": "95d520e9d616f8b487fbcd5e03eaa5106148065a01c4500489ce117dafb3b964f3068ba158203bc92a4ed1c141d9cfcf", "votingAddress": "3vnDgQdDy6Gn6o8HDBxLcqNyJYSX", "isValid": true},{"proRegTxHash": "a9077bcab81476da275e0fa96b49f38cda221b5cb1bf577864128bd51dcfdf7c", "confirmedHash": "bc89e1d3644686850509ab46fd9b972e457d12ccac88e56d1600000000000000", "service": "00000000000000000000ffff22ea0f83", "pubKeyOperator": "0fffae96cececab8ccda50bc3e166711bb2a8ae385ce4af72ab9b499ebd62647c5ab5a5c5f67419652abaca2b5ff0f7e", "votingAddress": "3McvAzUee8MkDQApEHtTTi388HLr", "isValid": true},{"proRegTxHash": "4e75d31abb61e38e54912ebc1141ad3d2d35ca4d1d5cdf30722e5041d7cfdf5c", "confirmedHash": "fd9647a6ed06a8af19228060fa5374b2b727d9622f1715b93400000000000000", "service": "00000000000000000000ffff2d4c2154", "pubKeyOperator": "81041d5c61339bca6fc592980103720bc8e0ee1f186589545e22acc255ef48100910aeb4991d7a550c9869b79936776c", "votingAddress": "2AUST9FdhyAn1gh4zs4JdznSxPWh", "isValid": true},{"proRegTxHash": "e607018cfa0afb019cb35f4941bd71dc3ca09fedd55cd20e24e0db3867f57953", "confirmedHash": "f8799cb7b743f84eb1ba62abf62b868f406304ad3b7d66d41800000000000000", "service": "00000000000000000000ffff2d3f29e0", "pubKeyOperator": "83d125a67695bdb454096730767064b48073152f74cb232972ed135e631708f7de73d1587eeb8eed1b20d6abf45d7fcb", "votingAddress": "3wTgJc9nFCHbgTXzSp9X54ZFXscJ", "isValid": true},{"proRegTxHash": "54fdf99b69bba4d81707b71281b4f7522b510e388c1ca056b81787af1bb9b8c0", "confirmedHash": "62d121838ab3a41dc59a1321a5d1429c6f26e3fe1f85c2a80800000000000000", "service": "00000000000000000000ffff52d3194b", "pubKeyOperator": "88b17567669a7e19652458151d32ca20c1ed5d9cefc567a344390631cbe65dd0a965e8c9ef7d9463fe2b3203d86b802c", "votingAddress": "2f9E2bbHT3ypFWY33gQfZuqTJ5Mv", "isValid": true},{"proRegTxHash": "7bd48abce293b673044182aae82d857c6c62cc64da7efc45a9081028f29d0b9e", "confirmedHash": "e71f7998d05350425afc2ddaf65969ffd5afc1dc69723b581000000000000000", "service": "00000000000000000000ffff55d1f1a4", "pubKeyOperator": "8734d4d2ebc8bc83ef298b70e27336697cf9e38e8c075fa753997090ece2484c77538f8e4b1aa71b5872e8ee1415b544", "votingAddress": "2wWn8q6WnNUjv1Xaj7kn2aemP8NN", "isValid": true},{"proRegTxHash": "8c16658fa28373dceacd83a951ae14c2867ad554a5f3bc16b6f26c6cd8e4b70c", "confirmedHash": "cebce183b00d82b1518e0660b076ce73c2e4c13b34fdb69f0100000000000000", "service": "00000000000000000000ffff33c3dd28", "pubKeyOperator": "0b29fd407e7fd0160c43415bf94734e2e49537a533d41424e096f87dc93f5729b42aac44dde6ceedfdca7ed6184ed3ea", "votingAddress": "Gfpo8d5MxbDLH8LkLPrteU4iacB", "isValid": true},{"proRegTxHash": "8a0442656ae7858a61108b90ecf0c9958272041819a3902518e8aa93f2de0091", "confirmedHash": "9912cbfdce37565f7f5143f49ae62e551b454558dca14feb1a00000000000000", "service": "00000000000000000000ffff55d1f261", "pubKeyOperator": "00b2164ba39ccf332654286ecbfd32b15c271d3f982529aff556f897cc44b8e523c358041e4b8347d41253a490796691", "votingAddress": "TJVQXx1D8fih3Rbj3SfXxLQPpWP", "isValid": false},{"proRegTxHash": "05d7ba86565bb9c8305f67b39d40ffa6714f8df086f21fbfa551204102f79d77", "confirmedHash": "7f67a3907a4cfce4bfbda67ab9bc676864eb320e4c71eab60b00000000000000", "service": "00000000000000000000ffff6c3da45f", "pubKeyOperator": "04aba2dcaaa958481633411ff00b99ac7dc38441a539eb4f140aedc4f6b0c804e6c177a8df508025d457e05355eec1a1", "votingAddress": "324D74EomfcA3j6WgLtMmQ2mXvCJ", "isValid": true},{"proRegTxHash": "36454fb232c571e21e1ea7bdffadedbc3aa5be89e4c1c5cd09962db57b7f08a3", "confirmedHash": "563d1e28448e78647e4f314fca555f8ba8194497c75265ab1500000000000000", "service": "00000000000000000000ffff3625c7e5", "pubKeyOperator": "07a0f318a396cb601aa225bc2a431e2a34486894b89d325ffb997d223f1a7b39d30c7599770c7a7986728307d3c6060c", "votingAddress": "9FAUFmmnKsBNVYriSKvmyDjUN9C", "isValid": true},{"proRegTxHash": "49b4aeefe0e05667a8c8b4d410c1223e95017411e8dddf0eba45756d54b97c50", "confirmedHash": "be7fb7b8aa55d7df4d39a443c06623308da7cc950cf2465f0200000000000000", "service": "00000000000000000000ffff55d1f23d", "pubKeyOperator": "14abd5d3c502052d20123e40718bd677d852f0f8e9546d6dd239997c90c0aac32dbfe417e65fae947219e235e4ae8499", "votingAddress": "2ocptXDFbK8uhzTjTftsJ2tT7hJo", "isValid": true},{"proRegTxHash": "48b9347dad23673d4f1491aae45625e3f5a2ca2a596483faadaf42f8a90b35e2", "confirmedHash": "f81b002bfb781819e3cda2623aae1d1d0f63ebea4c3e81120700000000000000", "service": "00000000000000000000ffff55d1f1bb", "pubKeyOperator": "08ba60669c3b23142dd0fa6b5668ef336bad9844e6f776b99fb9ebb9880428dccc2dae8eb7f13c20179a1ce2bd0e280b", "votingAddress": "VLBoKoxqsM5fhkzhc9zYdP6etev", "isValid": true},{"proRegTxHash": "09a1efebb34a785a6c6c75017211222134793148d250911e45b6141d2cc341ca", "confirmedHash": "375d09587ad404960cfa6435fc4e66f7d3a2b7cd01bff5980300000000000000", "service": "00000000000000000000ffff9fcb705e", "pubKeyOperator": "04fd810daa90bf95606ec3a4c8e4720d61fad8c78d45749d4c4a6f84725e38d71fbee62125b762ca42fd7ab32dd01347", "votingAddress": "2x4qEeDCUK3KuVYfaZniiBk9hkZS", "isValid": false},{"proRegTxHash": "0035bb863622d659753e2a9714ff2633b6a662cda874e38f85fc31f6514f6a0c", "confirmedHash": "704143a9483468f494883a37e05832de74dca2e019f32b670b00000000000000", "service": "00000000000000000000ffff8d5f356b", "pubKeyOperator": "81345a2488b3a0c06a02699b78c9e5e125c9eccf6316f84da3e72d1a12bc9364a3e8a277674b61a451f8b9937c4048a2", "votingAddress": "2o3sRDgZtcrgg6DU9Vs2VQsYZ5Qu", "isValid": true},{"proRegTxHash": "2e9667db1dca1cc1855780671826cd0705a0ec243c0276f6fb56dc554975689b", "confirmedHash": "90e88205283ff3baed322a108a3c5c13921a8ce2c49940e91000000000000000", "service": "00000000000000000000ffff55d1f12b", "pubKeyOperator": "0b793415699c9e5e7e1f850776d4d729410d025062ef4ae742cc16bd27d5263c9e774cdcb1092b85fdcff26f0a48c694", "votingAddress": "4Nn2dU1buiKZVvzJyMYmYVWYFuWL", "isValid": true},{"proRegTxHash": "dc65bd7b65f62a0a56f39bda6d6f076bc441390da41c05b8b7af018d863eaae9", "confirmedHash": "e3f36e336a78f155bdbe4c704a1beaf22c1463ac43d7cbd60e00000000000000", "service": "00000000000000000000ffff5fd85421", "pubKeyOperator": "9536f24afd13901ce410a7905e0a29cb19b249247c8a78205a2b1c7abc096c292d617e6ee826c3782a4758655d49f49e", "votingAddress": "3xtmAogzw5Y4XUGSSFmx4NjkVH84", "isValid": true},{"proRegTxHash": "97be420c22cb232a116e3fd0fb3df354bdd69af8326ab768127a2fc4fabc55cb", "confirmedHash": "1a918a975e01b329d29557486a4342fc40967b10b21e71b50800000000000000", "service": "00000000000000000000ffff2e04d9ee", "pubKeyOperator": "0119a1e146de74493c5584f6ca9fba59e094a86ab0973034f4279c79f0a2813555049ad74e6319995d5d4c9d1542d35c", "votingAddress": "24BtvMU7WPCpUNxT6vTXNQzZJA4U", "isValid": true},{"proRegTxHash": "448d6d404ee38aa57fa1de46550f3e4aa3c8b865a1397ac2a0116c7d30440a97", "confirmedHash": "1cde1253ba534b618baf3a256741b40c82c161debae58be90000000000000000", "service": "00000000000000000000ffff36e195ce", "pubKeyOperator": "16a61756fac438d47d5dd3361d1f8974a0898f87908f4b6d497348bae9eb1c0fdd16d7741bab7dff3d7d7f49e6052404", "votingAddress": "2qcuGXZ87S3vT7gF9Wcd5B5NzUsE", "isValid": true},{"proRegTxHash": "cb124bd4ae8da11cebcf32dcbe97662025e1f396666642ba1d6314fe05d2d356", "confirmedHash": "d805f53e0335d0bf1aaa426283f13da7485562619addc97b0000000000000000", "service": "00000000000000000000ffff91efed4d", "pubKeyOperator": "9135ea25c7e9c4e8651c856ef39c51390ec7f2d206e0cef29801d1eca7b5a10912d85ba9589553f870207c74edb769bf", "votingAddress": "JUAaDbrqYhJjEqF9PRQ599sm5tY", "isValid": true},{"proRegTxHash": "c497b5e11426e4e03ccd11baac5966b87d59852cce3c4e828be21f58befeeb40", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff84919117", "pubKeyOperator": "128f90ac3db65b27594f7f1fad59249d75214bf25b543b75b34b28b830eabcf2f1f191b578eeffaa55e740d46bb30189", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "b963e527a0e8c7297b295a506e055cf48575fb546e629ca1bb4ca690a2a21c00", "confirmedHash": "8b9804111660b0f9c5ef35cdb717e74286cd40a70c584e1e0400000000000000", "service": "00000000000000000000ffffc2875859", "pubKeyOperator": "06e242ed07ba66b5e5482601170d360d2a6bab140b18d6f3937148c2299863dbb90a05d14605a410d38da13deac1e50a", "votingAddress": "2iPMiiJLcPy6LQBLa2u5tA8aGKoF", "isValid": true},{"proRegTxHash": "a99e42beec1856d4cf65744376d08aeb2efa6b20ca9f35c12d3f047f7f150ed2", "confirmedHash": "2a7eb17aef9b972138edfdb6960219147b2d9514262ca0d02400000000000000", "service": "00000000000000000000ffff52d3152f", "pubKeyOperator": "80150be0739c08ecee54c83825cc1ba076095245d6b9c28aef0e7c7473f124ea97ca8a48fb1a07a010aeafe5232232cb", "votingAddress": "2eRgVxgYAWZzajd2S8QrtT4ZHH9W", "isValid": true},{"proRegTxHash": "a710763700fc54ec689ce9e774a92adae2982153220fd4dddbdd7d9b3b1e0492", "confirmedHash": "52c0accebe3f4e66b4f66da99a5e846db496300e3878849e1700000000000000", "service": "00000000000000000000ffff41144bd1", "pubKeyOperator": "8f2342baed5a3de149d43a29b3f9bec534303a82f76967b0680e36f991e54e384d224e7ea467abc06e2718c1a784ea6d", "votingAddress": "33UfvANecHdrmjxgVLz7KMRUd6qD", "isValid": true},{"proRegTxHash": "bea489e87dab589e97aa5b9019ea96fd0223eb076b66dfb7f87ba1d2d5831996", "confirmedHash": "a72879e817682cece2e019f2360d2a451aa648628ca620e51700000000000000", "service": "00000000000000000000ffffb0df8378", "pubKeyOperator": "09e7ed78b64d8ea7b4157c212ed34b166beb0c1a7b392fdb99dd7b0a17d677b4db085624bc0848094a6ec6dc1fa66a53", "votingAddress": "2esgMRnpmGEenG2CxL4USirUru7P", "isValid": false},{"proRegTxHash": "c843c0a8d05883c4dde1a306cfddfec0e871fc2bacb9399af2664c9ba85b8d4a", "confirmedHash": "02890514e43c27f714f2741fda07c2b4be2128fb89315d152200000000000000", "service": "00000000000000000000ffff89b8a0c5", "pubKeyOperator": "93d6f16676e57c4b677efb04eaba1072d74b65f963f5251c941300dedf0db88894d3f92ecd662c7671f1108dc771501f", "votingAddress": "Jo2LY5Qq1QRMUhdAdqLzfzcM58D", "isValid": true},{"proRegTxHash": "22fde5e198fc1eefc648aab4464e8d0d1fbdd7470fd98351f9a11ba16f32bc73", "confirmedHash": "29d50d332e6045bd910fc81a55f983ce051dd49cf14957450300000000000000", "service": "00000000000000000000ffffbc28fbc6", "pubKeyOperator": "956bdf934f2848cfaf505e628fe472413493f34083791663d23f7fd2ead6cd54ae81348cfd2a20f1d15e03668bc34517", "votingAddress": "ebcKDkZnXgD6Sh2Uo3MgQDmGsu5", "isValid": true},{"proRegTxHash": "06cf4c1443c0187917142546dd6917840c62df9c7b86941df7536fbe163fb73f", "confirmedHash": "6288673a347fc2bd0860ed0bc23b6aa7ed6552d53a0d81d85b00000000000000", "service": "00000000000000000000ffff91831c42", "pubKeyOperator": "939d56fc8eec2a13205aad4a99c716ec60e1b1c0ff535f2011cc482d171936cc14c88f9e78c19b1c6f1763630095aba6", "votingAddress": "igKY8ZwhFEC4dAC2LZcH86Dv3iz", "isValid": true},{"proRegTxHash": "d7f46d32e7e7a1bf701354fd4a571dc955c5176102acb09a88f6839f37567d6a", "confirmedHash": "5ed69af5b62eda9d9719d56d8b9ccab49a86c5b1d21beac91800000000000000", "service": "00000000000000000000ffff55d1f104", "pubKeyOperator": "05003fe4d02540a14cd269085adff09cb4797e538f0461faad8b19c79b0e96b5d5ceea02f303a9c736112a2b04a779c9", "votingAddress": "pnsJ9Kd6tQmPsSSqqmUri8qHCgJ", "isValid": true},{"proRegTxHash": "e22282b7cb07ba297ec952660200549a5e282c1d2851d290b55b684c90958d17", "confirmedHash": "eb873913d23c0d84b8c1bd06e91161d35bb3618f2c34ce990800000000000000", "service": "00000000000000000000ffff6880efd6", "pubKeyOperator": "95684d387c1c2d453ffb7b80fa4c6660f378a1d9aa43933819cd89c0061465f8ff4fff93bdc40c09c64eb42f5cc9ef38", "votingAddress": "3iCLkD3cxegJ4nm4g2zhMFMpwYGE", "isValid": false},{"proRegTxHash": "b6814b14c063d89d3518af53aadcfb7fe9d5e779c481b8270cef56bc3439db2b", "confirmedHash": "b563e10430ea5fa58ebdf7dcad3220be8283890bf74218930b00000000000000", "service": "00000000000000000000ffffb23fec65", "pubKeyOperator": "94c3c84106bdd231aa8810cae2e8f3b8c011af1243af838c43b835fb075d3336226ed8e6983cfa314e92b33b9507ed3b", "votingAddress": "3Hx4wzmeZVUp8LdvMcDxLfM5Wcf3", "isValid": true},{"proRegTxHash": "98f052749af3f321fcae92bd0ed9848a58f0e991a5873b493686ae2876ee4b38", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff84919fb1", "pubKeyOperator": "020e6b2691b4eaf0f47e5120b761a4eb4315011a2de12c1048da979ea15f84a8598fd94ea9551c44d4e63160764b9b25", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "b287026c5f4538efdef553576b05da32e48d29c5217ece2cc508430aced33658", "confirmedHash": "e841f6b965a3b864e2c18dc14848ae4ae6f76d79aa2f46f71200000000000000", "service": "00000000000000000000ffff2d4d0334", "pubKeyOperator": "154c4685fb95685c5ce3c12f53f6f0d10002fb1bbe3fa74e6cf980eaad87e3b9a1ee28263cdd9be0f229d60fea0945e1", "votingAddress": "3qLdQN266bQBCDcHSxA4xZcrsyJA", "isValid": true},{"proRegTxHash": "d6e3aa345d2f53e8906be8e600e524acfd93617e56f2a141558c61d4ce0cc7b6", "confirmedHash": "60928db5ba3ff8888739bf8915bdd0dea56a47c80119c9812100000000000000", "service": "00000000000000000000ffff55d1f14d", "pubKeyOperator": "8e3dd52a79e74d851ec4a5c3bb602bccbfe0f5030eed89b8407f9b8950bc7b92be3ac506e5ee811ac2b34b26580ecb1b", "votingAddress": "3eaZ6rcs4a1ZJ5jkiwmVoEgeZX6i", "isValid": true},{"proRegTxHash": "da23e9991abcab51e571829c32696b79c489af2be887dbcc231df954fe3305bd", "confirmedHash": "111e672359382fb2f2842152fb25255926ccbf13fceb0a100b00000000000000", "service": "00000000000000000000ffffc2875eb6", "pubKeyOperator": "04325f99631b5f2212f5cc355bb22e6d9e6256d513171b10211252c6275ecca162bdfe711311484f021aba4d280fe6c1", "votingAddress": "3prze8gjDebJ9ay854w4Xaat4xEK", "isValid": true},{"proRegTxHash": "cb527f7f39f7aed4c471049b4b2f64a248d087b6576dc3ec426813c5f5ca34ad", "confirmedHash": "93cb3907841c1471d07b4b277b27a794c9799cb54741f1952d00000000000000", "service": "00000000000000000000ffff55d1f199", "pubKeyOperator": "97507b1eb0fe5044aae8f3c038301009add693a5245999ed2c0a459a62dc98c4e7fa4303aec475a83b60c2cf3a62d573", "votingAddress": "24HP5h1yMnGL2SzGrJvf2myKBqa", "isValid": true},{"proRegTxHash": "ac7eb7e63d1647d57c1e19e0af6cda6659ca4ce97346c3499922b610ee3d89aa", "confirmedHash": "06c45659dde3aa5dcc76fdb0b0ab6432695fda4cf54bdd350a00000000000000", "service": "00000000000000000000ffff55d1f18a", "pubKeyOperator": "8f3a813aa68a07fca73c616ea60d0dfbc81667c24a8ac6e6d4c9a64c6d162d5738808c5eab7138742a3d17c814a8bf94", "votingAddress": "arcwAPtXKog2CwoRG4gMAAFSDsc", "isValid": true},{"proRegTxHash": "2049043b3d1c6e93cd9c5a8e9ecdae0e6304ff6acfcb305bf05ed4b8e7267056", "confirmedHash": "6413bba4fbe144417bbab39151a4b1d2157cd318be69c2260f00000000000000", "service": "00000000000000000000ffffbc28af40", "pubKeyOperator": "055434e8fd19b819fd407dd6472cf97c9d386e4d479a55f96e07668f749769e5a1dbbdcd288e46fe512d3bdcc04a3c25", "votingAddress": "7pAr6RJdL9QuPCiXQFaqTncMGx8", "isValid": true},{"proRegTxHash": "b28fdca8731bfbf78bc20ce5f83e1e4920997954160d1b1969177d48c75b4ad7", "confirmedHash": "6b6e06a0fb720cbe0459d6e9b92512bff2d202712de32f5b0300000000000000", "service": "00000000000000000000ffffcebd1c72", "pubKeyOperator": "1008f0eec44fe519caf3a9287bace1d8289463289382629c3e0759366883b82c560acd3e4504518be535a6f3a9f75803", "votingAddress": "33xgktuzCLNSWRKBJHso2jDVQwaf", "isValid": true},{"proRegTxHash": "498611f0f96709742c7e10371bfa4a99821cc1cd4d55e3ca431f2f2badd77725", "confirmedHash": "d9150094d210bcb410bcbf69ff51315acf61c933f536d9cb0200000000000000", "service": "00000000000000000000ffffbc28b48a", "pubKeyOperator": "80232d48622bea7b2a07e496d4978dc8cd2289ec7f7ca5e70aae0efda7053a4153785ec573cfd26fd822b03f8310d98e", "votingAddress": "3vgDaaPB5Y1y6quXynJ9HrA4Bpex", "isValid": true},{"proRegTxHash": "0b9ddd8d6c9a844ae9e1f7cc17dfa2f9ef3ec9dca07c95fd97a111d0f23611cd", "confirmedHash": "051b53482c37c7a2c952b7643015e51f96dd4df42d4afcb50600000000000000", "service": "00000000000000000000ffff6dcdb481", "pubKeyOperator": "0f2a121e37f4e514aaf6db8c81c9a9ed4fe233b45fda842aced60d806de00cbb9d818a4869dd319f5e86b29c724ff405", "votingAddress": "4SQ81mRHNx4cjowajPHvrgVJe8pU", "isValid": true},{"proRegTxHash": "9e281e4403a80127b44b612c5228d86239432c6820d23fc52c3304423779445e", "confirmedHash": "979433323edec36b65871f66835c4f746a68b2fe0a819e630000000000000000", "service": "00000000000000000000ffff2d4d8549", "pubKeyOperator": "18718e7b9265a29402f2d86b1ab8491f3cc984e6e017e196ea32ad45dcb62c5563e01f42bc773b4be3065e7764047700", "votingAddress": "22cibqtLQGqXJ3NuwYuDnz4nGQmj", "isValid": true},{"proRegTxHash": "856ca1f6e8ae4b467a49fb5ca2b267f228e4ba1e5110469227fa4c61751b4fca", "confirmedHash": "7bff4f371c94a24bc8bd45d996e8e1e504972248543b91fb3500000000000000", "service": "00000000000000000000ffff87b50fe4", "pubKeyOperator": "04e4796ed2ce6c2a19f013e4cfcd6551278410da94970b001112913a4a270a3e83ff17a78ec4519fa180f0b74f3dd656", "votingAddress": "3ykffH6GG4NPfd57bz1iQGoC4ZGH", "isValid": true},{"proRegTxHash": "b8efb0523a5d489dea275e2943faf6f39e1dea58956eb97499cb62f22f44e7b1", "confirmedHash": "409e1834888d28f75ccb6a042f0271486a1044a10e38f2c40f00000000000000", "service": "00000000000000000000ffffa516d092", "pubKeyOperator": "031e4ea7caed924b2513909729ffb9bb7e8fb9e53f19fc3912f1fcc1734dcc0c79134ee0e1ab154707be88788ee411c0", "votingAddress": "W9SywXvHAuCmZfp27TS1M2RDrUX", "isValid": true},{"proRegTxHash": "ddb7d8a53c6ee97134e222f1f6360e02f3241cb53db6b52a581b5fc83cf65697", "confirmedHash": "89529e58998969fa8d330efbe5c89cdb1c21be9451be46341700000000000000", "service": "00000000000000000000ffff36270a6d", "pubKeyOperator": "8f3afdb034f58069836f5209c164e4677b59f47a4cbca79ce2f840fa898694585e4a8701649a118de61edea9d76a87cb", "votingAddress": "2ALKP1DyHNtrHx56U5D2FcZgrKGh", "isValid": true},{"proRegTxHash": "92d8c3c91d451118b70609bc635846ad49462c588bf088fa27e41f557cfec8ca", "confirmedHash": "11a8c8a8e63dd7564218f519f64c2e32e5e52ad3032d23150e00000000000000", "service": "00000000000000000000ffff5eb0eecc", "pubKeyOperator": "0af18a77709f059861df34e66f3b01a30255330686b77b5e5768261e4f902e9598fe8b0f4d919d2b768a5705ad743718", "votingAddress": "22hCM7Ap58yq7Vrg3RJftxKizzbP", "isValid": true},{"proRegTxHash": "7d714fa7a87fe19b4681807e719c5051a9df6234a07b6dfc545d13530db58e41", "confirmedHash": "bd130084e15d4b496ac7a2d319aaf9e6f88e8c8a58bcc90a3200000000000000", "service": "00000000000000000000ffff88f38e28", "pubKeyOperator": "80736dd02c69071ef4b70c76db7252196988e0808f4f5a3c887117acd7526f60339f177d59368c6414d60ef596eebc35", "votingAddress": "qzivuffyrAFEd6rB5nVi7Ym5j3", "isValid": true},{"proRegTxHash": "ab42124366a3aca399910ad26c4889b5b463b61bda34dee48d96ca63c984185a", "confirmedHash": "e0e0d8cefac235d0be210dfe987bd47ed70f5ba460f42f711a00000000000000", "service": "00000000000000000000ffff12d203b1", "pubKeyOperator": "95234af9f50e54705a8fdae2cdf1b277c14c3ea53970bd861872d6c87e287a37e9f249fdd1dfdb275e4905535af3ad14", "votingAddress": "3XRQZfWU8rNPYruCQxCqjgQWttMp", "isValid": true},{"proRegTxHash": "0ae259224a6366150671d7234d1e3d25caf3899b94b64ba713e5966dd779f204", "confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", "service": "00000000000000000000ffff9f452eca", "pubKeyOperator": "922ac77d7736a3d6c87f16312bcdb541e135dc8808d7bd0ce13ef272e619483501b223505ea3033efbe6f447e31ecbd7", "votingAddress": "3z1ZLeEoryDFhjJUmJS6CVJNgD9m", "isValid": false},{"proRegTxHash": "91c3f5d4118d6602ce4acb0c33c439e6b7daa61a60cfffa9191bbc733aae1445", "confirmedHash": "fd6b675df4e77c90a51f08f012a093c51749586d2f2c3e850b00000000000000", "service": "00000000000000000000ffff2d4c2ee2", "pubKeyOperator": "8ce1b3bd04c1f83847be2360920943cf1bbac7d111f3bc38179b363f10fc5a5b604a452100519ea62598c741ab15253a", "votingAddress": "4YWc3bGqAFyKpz6vFP2mohXKnGVj", "isValid": true},{"proRegTxHash": "26a8f4e70563ee633e57830460dbeb9e24ae31a5eaceafae5abeded5056e0809", "confirmedHash": "5f4df001517869f07b1e81d8b179499d85c6e62ba7f2d6fa1d00000000000000", "service": "00000000000000000000ffff52d31937", "pubKeyOperator": "02b6650f6595eff3000aa02c79e93622d843a76492b868a3d7730ec5055c7dd6c1f687b74932a0956a1c54255a852234", "votingAddress": "3HviDm5AHY4BPh9uGdj9kXdPbYVo", "isValid": true},{"proRegTxHash": "575691d05cb0b7dd6252091d9bf246dd53c95ae8f6cff3a7be00404e8ad94f87", "confirmedHash": "971d111019ef62e92dc6d90ba95deaff44586f1965e5877c0f00000000000000", "service": "00000000000000000000ffff58c64b4f", "pubKeyOperator": "08707e91b2e21dcd1921d0f7750ae8a8a810d02c4699f9fe270b4c95196e7a158589c545037140c0cc9f2ac395a8d8f2", "votingAddress": "GTcbqFp5EZqTJX7bRhrzN1xmhus", "isValid": true},{"proRegTxHash": "8a60279162b2458764e9c5e4a9f5d3437cd0c18c7f9236dab1a6c3887684b072", "confirmedHash": "bdfd414cf84bb441a1feb6ed57757e990f05964a6a68bf660800000000000000", "service": "00000000000000000000ffff2d20c71e", "pubKeyOperator": "19703377a21f82ab91afb0d0ef77ebffca765704eb31e3df0b23f9bbc3f75b1edd2e88deb9f40d394cfa6472a3180830", "votingAddress": "2FRYY1bs5x5L7NaUzeY5UTiseK3x", "isValid": true},{"proRegTxHash": "745f6b674116f808f079ee9ceb24d05e8a35d7f85ce96acf29979829cbcca9cb", "confirmedHash": "6f5b4771a0a2679f12153f0ce89b03d78822d78b51fe4d720e00000000000000", "service": "00000000000000000000ffff87b50853", "pubKeyOperator": "8e2059a6b70f39edd27a905c356c723ffd670699667e49899c11bdbc7785a6bcf5438c32c70854f7fd468ae7f7fa42a0", "votingAddress": "2ZrSaDjURpaJFscc4DF9QBVpt1Uc", "isValid": true},{"proRegTxHash": "ae969a012daf539fd9605a9a759e2fba1b6708d1572d2ea3dd69a7914ba7d803", "confirmedHash": "c587b3f1eb9fab25618134ca0661f3bdae35611cd2d729141c00000000000000", "service": "00000000000000000000ffff453d6bf4", "pubKeyOperator": "9520c21e08d7889f7ce539b1eb3b1ed06dbabcf3772bfb2ac0a093376e803e31afbc18422b02de47aa5437567f8885d7", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "69ad3a2babf32242b7df4ebd5e56ee6f56e88f27fc0ff80c6f2a7d0bab694c5a", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff0fdea466", "pubKeyOperator": "990731f9ac28618bedae021edd7088ae11e154027fe81095b4cbe324aeb7a49867234c6d387a7346a422c83313880be8", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "bc4ce355dc30b3455c1b3d42ac2d97b478ff590416241e90ca9c6c15efe05893", "confirmedHash": "40155ff704d511d70f5b8b3c907ec547acf8365a719edc681a00000000000000", "service": "00000000000000000000ffff55d1f136", "pubKeyOperator": "10a69ae70e28b32af854825e74b596592cf6c9cc1918305f6989a821b59929732f1ba29fc549fda4ea8495cdb8178ae1", "votingAddress": "4CVxrR6arM1kT6P5JTJPnuU5vdgk", "isValid": false},{"proRegTxHash": "6e5c78177641b5032830231fa527f903001e31750d9992c9b1f329b67999cf8b", "confirmedHash": "296b5d7c669b839352f81da8cc0b86e65a9167b54d73129e2f00000000000000", "service": "00000000000000000000ffffb009d20f", "pubKeyOperator": "962a0f67457722f3b35a77a232f14f5af6577d003496e3fd5869808cc5f4c78beb4f96db30b20f64af523bcc4e195d0e", "votingAddress": "2JygeZrUAgP9h98GR5EMzwEG8q4t", "isValid": true},{"proRegTxHash": "5d16ab03c9bbcd74615f3cb9ec6ea6b3e4bed419430e107c1c1764fb3122408e", "confirmedHash": "a8182b12f9493fe4b85285db933b18d2bcec1ac5628f80932700000000000000", "service": "00000000000000000000ffff88f38e21", "pubKeyOperator": "8419772c954f39e4d77bab646e9665eaf2247f5c438c4ffee7aa8c0258d6a6ba8b7d86cfcaa3a845a4a3dcd20687ec3d", "votingAddress": "2Pjx7x8RfHhFgFFjXozS2vQRWSJb", "isValid": true},{"proRegTxHash": "65744b796afd16b2a3138a2cc5d910ffca89017bc581a2abb07806f650b8ac82", "confirmedHash": "5e63b4971d59089bb96cee513232545a4c6c6671b0102d621f00000000000000", "service": "00000000000000000000ffff87b50fe9", "pubKeyOperator": "141bb94ce6a696e88d709006a651476299eec65948b5237f03dbccf26f4fcd94d73fb98cc950f5a0695afc1ba81f4d7e", "votingAddress": "s8pHH2KTP5iZ64Suu94NijxTPEM", "isValid": true},{"proRegTxHash": "936dae23e3f03f50b1da60e47094d89d3b17f6b831a1828c6db2faf24d444474", "confirmedHash": "4bfe6b55ef91ad25c42b0d1c1ca65b5dec6da53cd199bd3c1300000000000000", "service": "00000000000000000000ffff2d4f2d1d", "pubKeyOperator": "834331795e12e80e4e48d186d6f7acccca160e5d05cc247bf33fde6612153118b91aa66664d9ff1c7383132b42c953d1", "votingAddress": "33SY5kSJKrGgwtyGe3LcQLPTFyfz", "isValid": true},{"proRegTxHash": "e26974661731fca6b3cd2e25af14c6cca3f5ae912b044f955063ec5f5a53c410", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff03621fc9", "pubKeyOperator": "0a870fb975429e254eede36ad18bc390a9161fb3f1bb04790f4466837407ca72642b61797bdb81f80a6069b9ef556ceb", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "3b7f3d8de3aee510b039a41aa6af26664e26a08588a0fbd26a51ea771e34b9d8", "confirmedHash": "2129394c91b217fdeab80141d0b5024877d99faf13d75dc41000000000000000", "service": "00000000000000000000ffffb99b60fc", "pubKeyOperator": "0734c697a8ef0588b1478e4818d6be76ff51d2a882e5578d3c4956d9261747c563ca9a4f2a6e34316bf93cc7c56ffe1a", "votingAddress": "4UEuAjiTfqqeDXbiV6mWyaPuQj6z", "isValid": true},{"proRegTxHash": "12fff42218768797d6b28a535ddc0744e7a6fcb4bd824abf52215449a1f21048", "confirmedHash": "bde77381e7fffa50e73f6eb81bc9573153fb92547449244a0600000000000000", "service": "00000000000000000000ffff0509ed24", "pubKeyOperator": "873cfc8d9dfa57d67fc147d91faafd8bc6753b95367dce674c0f91e59f5680a50d150182b98479444b6cf96b2cdd1db6", "votingAddress": "3bxEB1K8cw75JL9WiCRMiWwoMdU1", "isValid": true},{"proRegTxHash": "3c692bb4714af9754828cfac9b018326da8a9aeb12d6d247eb7479d2b02608ff", "confirmedHash": "5512cd13e1c291b98cda75c1cf90ddb7da9e1f2eb5bbb5ff0a00000000000000", "service": "00000000000000000000ffff5fd86d89", "pubKeyOperator": "921495b6d6e0219864a51e2416a3bea84b7ec5fa0b3d50fe48885d6f6d8881196e35189542588d6d65fa8dbaa5bb10af", "votingAddress": "2J7T4v5B8FmW7FLdxFN9iaYnwzwz", "isValid": true},{"proRegTxHash": "b8037a8367046e68f4d8f3bee292e63ddaca4fb73026a6a5b064b3155234422f", "confirmedHash": "8600cd3efb1280c53942db36186ac5d553628af552b634a21000000000000000", "service": "00000000000000000000ffffbc28a31d", "pubKeyOperator": "0fd0b0f287381d6c3203182d8824484e13b627bdfa1ee3fa80da5d15e4e5e19ea54186419c3af3e366432c95d5aab19d", "votingAddress": "268npSVi67oo3HfmDtsLN7Eir2yc", "isValid": true},{"proRegTxHash": "2c3de063bcec12035401b176ce02677d22a592e7d8c98d6b422d46a9d33dd767", "confirmedHash": "3c8d882b34df066d0c15f6519351ca28c0a28f3fa51b02291a00000000000000", "service": "00000000000000000000ffff80c7b8e9", "pubKeyOperator": "8360606734511b836679cb34f6f166c707db3c76e88968edc7d95e66ec233560d6fe916a49764ec56965618f6b19cef9", "votingAddress": "22j6QMvwxJzumjaKKzdKj2VoDCYi", "isValid": true},{"proRegTxHash": "c9e15742a1faeaa339ad927bdffc12d0627197d5fed1abb34eb01cf262269f92", "confirmedHash": "317bc082302794ab135862f83c66f9c203f31c31246d97721400000000000000", "service": "00000000000000000000ffff2cc3f773", "pubKeyOperator": "0088ae8ecb692be75b1d19d6c67cd3905ada2e5c300ace0fed239027583dd9f0c8ea07af09d3d03ee605e949b7b7d7cb", "votingAddress": "Vi8pXNDvvkLRPFAMAWG4fLUtkR5", "isValid": true},{"proRegTxHash": "c7a1874987f0e5daa843cc754c8520e339509728824d1537b10c373e6ed2dd39", "confirmedHash": "78e832b31093826b7107572ed5c9a9beadb92e77b6fdd1a40a00000000000000", "service": "00000000000000000000ffff2d211624", "pubKeyOperator": "0218fd1df55c117d7cbbbe7d5534dfde5aee6dfc25051b313e8b2ee329ab210a7a0b497a237724bd64ee66bbdf6c778a", "votingAddress": "43VRseB2EiZtJbuF4cnncf5CzPyB", "isValid": true},{"proRegTxHash": "77446090dde4a38478fd71f91d23f72819e4367e3bfdf6f983821e9cece99782", "confirmedHash": "ee87ec3926b1b60e4708c1ed59145def26d843dd923d70180200000000000000", "service": "00000000000000000000ffff2e65d311", "pubKeyOperator": "09e70f206e2d6b25e9ecc4f4c54f0d7d2656aeea0cf2d78e18aba78ebe950da87dcee01652440b045b2ad4e00ccafc14", "votingAddress": "Bx7qCwS6F6C5pCtgMckVxRmUKY9", "isValid": false},{"proRegTxHash": "fb6795948d442e850f5b62f8dc6c30e2d82d6fd67036c3bb1283ad871ebe6a05", "confirmedHash": "79851288a8a17a1e253a6a699b633fb2cd496416f90bfb5f0800000000000000", "service": "00000000000000000000ffff34465f7a", "pubKeyOperator": "945f816931a252acab5aa0722fb71092219425e3a08f63cef72de4a0b4aaa6185665f5016c0a897d6320d8cce7c04a4d", "votingAddress": "2m4e3juaWvTPPPmP1UsyrZxgCkMF", "isValid": true},{"proRegTxHash": "09378beb6885aa0a1056611ed48bad71456faeb653dc8823cde7ee105c0f909e", "confirmedHash": "4c8d5b7d4b001b2aa5049aa29a59add6c35fb809caaff3ff1100000000000000", "service": "00000000000000000000ffffbca64d41", "pubKeyOperator": "1861b0db13f83ca3fc414b17861be323d56fa5adb4270908b259c78551f8cb43f60b35fe4b178f3487da08d060638ec6", "votingAddress": "3KuADaXjZqVHKsYmMe5qovTXLVxV", "isValid": true},{"proRegTxHash": "43272a9de42acf763bb0cd429f70d785b54394c957fceb08b8a448817fbdb86d", "confirmedHash": "59dedcb564479592f8a803c8bdc8a26d2df3e34c0d03b8171000000000000000", "service": "00000000000000000000ffff55d1f1c2", "pubKeyOperator": "11b56323fddb754b36edf950f217fa32b934bb9c936cd3de7598142249c151c9a65798debd8727517e046c3b0e521e97", "votingAddress": "3YhBuuwrwtFrX3VcxWRW3VNUCoip", "isValid": true},{"proRegTxHash": "82a92de29b4cd6c6ecf0c4540126725ebe1a1fae3a6980ccd468ef36c4d32777", "confirmedHash": "a040f70d86919cf216e6f353b3534e7122524e5ed0f38b412800000000000000", "service": "00000000000000000000ffffc28758c7", "pubKeyOperator": "150386fac7dc6da722d54f788f86ed39dd9a1b63a5b66eeecd9fe9edbbacbea2ffc1e7e324f8dc4b6a35dc74d9b2a46b", "votingAddress": "TA2frF29jiY4AdkXQYZFFUiF3zc", "isValid": true},{"proRegTxHash": "34113a95cd69dc94f988526dd8ad905514bb5b0054639c8b68ce6fea1b88dd39", "confirmedHash": "90b328fc25e0e96a593ae46cef1f6d95bd113d9b5a49855f1700000000000000", "service": "00000000000000000000ffffbc28fbda", "pubKeyOperator": "02b7784e757764a048f7a0b4edbd89f6293352cdac2ad4d4331895b08d48b6880c8ae548d852a88641106c9c0712782f", "votingAddress": "4HQW3uLbKTLYziKBaFQcp7HYGBG7", "isValid": true},{"proRegTxHash": "75a6392672a151c6258b46c956dd93dc6ff2f099ec55f9595719045b8d202e54", "confirmedHash": "34b21e18e8cda9b93c22ddf66d9c3efd0884937d8eaa3f8d0300000000000000", "service": "00000000000000000000ffff42afdd48", "pubKeyOperator": "156501a4ff7fc29cfe8087f6305fe269fee1dee006e88bae109411be85cdd2df53f73d0e9081decf869d894348b71da7", "votingAddress": "3nD4vMVeve7WfSUTwXgMCGfUxqPS", "isValid": true},{"proRegTxHash": "c3d378358464a16cc050ba1257128a2d0c870aed5839598a7211527ce52b1c86", "confirmedHash": "c4633a130c4806b00c60ce0543643dad4bffa08bcd42d95a0c00000000000000", "service": "00000000000000000000ffffb009d20e", "pubKeyOperator": "15935b0419c40273877e132ef3c9fc6f661ffd04be329cf4c9b5d4034323d02e7e56bc1001ff29d59222de1dbf3cd960", "votingAddress": "9uGyz654YQ6V1YaLtxH8SQkQaEG", "isValid": true},{"proRegTxHash": "e9e1dcab2137cfb21b662b939cf75492f0a53cfc819caea7a2bdca77134403ab", "confirmedHash": "b8fab3df4b50b10fc1d5078b9a748806b0b564ee84ec42501e00000000000000", "service": "00000000000000000000ffff88f31dc4", "pubKeyOperator": "995e4d5677bf72a9728dbf0b586c39bbd6ba9fe6f1a8c4eb5c8f4abbf64c57f7b73ed76b4d859a5cc9a2e91d2261b952", "votingAddress": "348zfWLU8yRQ9PpQ34B8hZUUyCDS", "isValid": true},{"proRegTxHash": "f6e3af8f5b2829f8490e765a896325ba279fa6d8a27e6dbcd9eee4f5921bff37", "confirmedHash": "d72f45345dd0473919608f03503693e163e6b2f99d74621e0d00000000000000", "service": "00000000000000000000ffff55d1f1e9", "pubKeyOperator": "15e7d26dd073e1ec33c48d13b9b7b937f92c91b7aafa200498bac4e17292b28a219eb52f75b34f2cbb66f0af33fec3d9", "votingAddress": "2XzHc5BriJkMF8nuya6AZ1gYYSEJ", "isValid": false},{"proRegTxHash": "772c9bbd1cb4d1f3b9facc8c566c6a4e8a00fd861ef1f472e1825ceb6e72ee67", "confirmedHash": "a5c437298164758b321416d1c3b489cf5ea94307d96e32280c00000000000000", "service": "00000000000000000000ffffa7566eea", "pubKeyOperator": "01e1d7f2b9bce8d9260d4c6e224b2b9c9ad844dc182e4cb41074da2337a5a3103706f1467dbf420f88d5f21199536499", "votingAddress": "g6ZrJ48QzdBmNMJxThM2ivWmrjq", "isValid": true},{"proRegTxHash": "0770f645353eb6b6e212827220720504527788c735963400491191e9ad65d648", "confirmedHash": "45cef9eb3d5091bd4f979e1aa694cabc7d6edf9280752b5c0a00000000000000", "service": "00000000000000000000ffffbc28e708", "pubKeyOperator": "8120ef95db77b48af0db8159e1b2a38c1f671b8c998acbc967b304c84e94bab52e6866c0d360fcbd23d5ee14a2cd5629", "votingAddress": "3PBXDZrmEx99fCLyPkDr4UzMx3oy", "isValid": true},{"proRegTxHash": "9ca246ea1eb4185460f2815de061e02efd5ee43f32408dbef01bf5f837c6cb11", "confirmedHash": "0f07293743ffccdd1bbdfda2bf273ed2ceb2f62d7a6eb2160e00000000000000", "service": "00000000000000000000ffffc11d386d", "pubKeyOperator": "8d823bdc8565b89bd28e0ed991436863eae499850899d4c9f06a7d5bc7f2af5a0f26503814fcb3923e06049647405da5", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "537224e0191505b228fe84f2f2bcee3d299479d24a7bc6714938886c719b8ab3", "confirmedHash": "487178a0fed8e9554b06e56d4454f9cd929f7310fb1c6fb60400000000000000", "service": "00000000000000000000ffffb23e9fc4", "pubKeyOperator": "814cc55c662b55d7f6801ecc16a93ca2ed2bdffa85fd3561a9d6506afca72ba9af9ab4962916e38852c6c8f9ad52b137", "votingAddress": "3bM4W8drGVxMTkPWfqXvZuq1WPR9", "isValid": true},{"proRegTxHash": "50dd8f3dcc283357866511bc265d44aa22816a6fb681012cb3a08308a19d22e1", "confirmedHash": "7e6b9fd42b246f657fd984064bedf1c6a0028b32533359971b00000000000000", "service": "00000000000000000000ffffd8bd93ae", "pubKeyOperator": "85c5393238d7c21a3276040813bb801f76a0c9918653fca4f80b8095cbbf1e0559ab82cb02ebdc4952cfc694e6b45abc", "votingAddress": "4JHFYeGELLKJ8pnmKrssxu3AuxXo", "isValid": false},{"proRegTxHash": "1e50eb5010d425f30e14e7e4ce6f8df182a0abfa29395cecef7cd770d4c741cd", "confirmedHash": "566131c4543b49f631343e6dd196f2f5acac9226856fbda61300000000000000", "service": "00000000000000000000ffffbce29cdc", "pubKeyOperator": "95e7c2398e85daf544e2d10bc05b42918d3499526ac9bb93a1a2733a1eca5f08ed654a6236b0f6e44ed7771959222a45", "votingAddress": "4Qan2AK9jJoqMpZdNU4ZzMHHaNHa", "isValid": true},{"proRegTxHash": "b45d015fd3dd796bcfd39ab7fd9a72f993ce408861978c718d3879083cdc83d0", "confirmedHash": "392c6c05b721befb4e74979f9d4b2b54fb4a507c6196b5af1200000000000000", "service": "00000000000000000000ffff2d207f67", "pubKeyOperator": "15ae4e4f9205dd27e6f162356df01d50117c0b53af43495af739251d532272eeb9ad6dd58ed235bdafcc823d5565a948", "votingAddress": "3f3XMiRS9RzNeWvEtw44fdsSybBr", "isValid": false},{"proRegTxHash": "09f8e355c5e47cf85a4b241a203d7e16500e5da4123fe700e0c191c20e45358b", "confirmedHash": "99bb3fe48c31dd74cfb7596a604be13575547b8feaa249fd0c00000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "4NFkDvpTVVTQF3uUE6kCFmLdBckF", "isValid": false},{"proRegTxHash": "65596ba2bed41104ded4f51997c372d0ad634b8c22ee8cdcdfa9ec8d9d2f9e99", "confirmedHash": "43b3caf59cbc5331ce20c7c1be57c84ded106d611d049e4f0000000000000000", "service": "00000000000000000000ffffb07b39db", "pubKeyOperator": "8f20fee6cb44b0e442d89a78b6ee51c673e7bcd56f244eaba575d0752ce5eb05af5cbfcb7d7525263ab775f08849370e", "votingAddress": "abBKVJTNyjV5rsbmsZyAd6bc4RW", "isValid": true},{"proRegTxHash": "d4f79c859843cc6fe198eca1b46a5cc451974582a2711846142aee4f91f8bbca", "confirmedHash": "f5d425113eb85e5897c53565ffd0f90b815be6b18d4d331d1100000000000000", "service": "00000000000000000000ffff90ca5261", "pubKeyOperator": "959c204df3fc74ef9ea14a803371d3cefdb58e333dd84cf884ea02f41050a65cf1947969dd4982fd2b34bda65a0919cf", "votingAddress": "372mCGWeZxo1c5xqMLaktrUizk4R", "isValid": true},{"proRegTxHash": "5e577ad0bc6cc70238af8b9e08614c224dfd241d856e068d1feec0bdad629b72", "confirmedHash": "68da12896db9bd8e23dded4e265219650a9473ee392a18aa0100000000000000", "service": "00000000000000000000ffffb9aad49e", "pubKeyOperator": "8e24d43fd77f9debc73bc365f024d2a729b234265f9707cd03b9d4927e34026254c90784c3606568d8b3ca1659ccb5f1", "votingAddress": "3iHo2ut8Z1Cdcwd1JyEBSqnjaQBd", "isValid": true},{"proRegTxHash": "435df7434f31c070c81686191f2d471b0924112db9a1d2a02a8dfcded6d4a330", "confirmedHash": "eefa2327ca9e07fde972f64c2c7e477a2ea16a7b9acc55681300000000000000", "service": "00000000000000000000ffffc11d396c", "pubKeyOperator": "0abc9b9ee35465c024cf4c72ed60dcb600c8657e6deff6f4ad69400b5f3a9d5140bb7c09c5262cd1265c093a7cb6c184", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "6532449205321aa8c5ac6e31913e3fc05b7c8098605e4be2c65084e6abdcdcc9", "confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", "service": "00000000000000000000ffff453d6bfb", "pubKeyOperator": "89faf73c85baa460d8301ec0fd96eb880bd78fe416a38a99519e1c9e354c70db7cbfb809d418a213810098e8c33fd69f", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "f4194dc7db6d6d746bb592a33b3ae58684abf9fbf628e97d9c03fc044b4b30fb", "confirmedHash": "58e240a154a0ac48dfd26143fb8ac7413aa11d8f10f16e622700000000000000", "service": "00000000000000000000ffffbc28b48d", "pubKeyOperator": "854cba983fe6f307b7e0ff3bf53a6af7482c5bf0dc2f0f0ede920c35b70bd08a956718e9affbab2ea4e9afd2ee0e51b0", "votingAddress": "3b6S1DSRCSRtZ6CkxMvVp58FXDd7", "isValid": true},{"proRegTxHash": "5dcc2da60644432987c053dfabdefebf59cf7ae312216b36ccf03b9e844c211e", "confirmedHash": "c19cbff16be0b247e1b9d6ba0c322b7c419f11a7ab2706cc1400000000000000", "service": "00000000000000000000ffffa8775790", "pubKeyOperator": "0a15e85214ae491857bfbcf953ca556a3a5aef842c27ed49cd7d9f9ec4bac6680d2eb90d316eb9aa217ca00e03e9ff02", "votingAddress": "2doMKJJ4ttQZQdj4qgSr22CsaQE3", "isValid": true},{"proRegTxHash": "d67d6546866cab6d12c44a9816245a120800f568b1f718bea6c29390d78cb2fd", "confirmedHash": "6bbac2ae6fe2ad70673ffc9e2efb40d78f90ec30f510f79b0c00000000000000", "service": "00000000000000000000ffff52d31923", "pubKeyOperator": "8a2c376ae40d217b5c7afecfd18493ef29ee32716d66c7901cf6d70c978ae62f6ce37dc0b30f603fb6c097dc9e7dca20", "votingAddress": "4EWKyPC1SRADEqEPM3wkdgVV5zGv", "isValid": true},{"proRegTxHash": "f22300359451df26094691d625f0e087054551d053180d684125e5347678d391", "confirmedHash": "cd0ae20790fb93fa8d751f6ffdded7b72e11c4ec6c7c451f2600000000000000", "service": "00000000000000000000ffff52d31946", "pubKeyOperator": "8f8532a66eccf1575186b8378c2e4bc40f5a4bcf0f41bc625697f0bdd2ef3137883c3250c7b0dc4edcc92d0bdc99de9d", "votingAddress": "T6ma6PWw1QNZ8PMMcVXEMCNrcAk", "isValid": true},{"proRegTxHash": "caf2402548b5c475d08d337f282fcb266084b8ee4555f9a7759b4762a8883be0", "confirmedHash": "7c5317ae3958ab7d91df79368391f7b76d162d924f6aebcb0700000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "3fjfw7GzqS4JRC82fZjw3tgi4rvy", "isValid": false},{"proRegTxHash": "b26f112eea1d2ddf912548a59479a52e5549829b3213866826f43756a9de7924", "confirmedHash": "c2e4dc291db1fca58c9a5da356842368374bf57a34bae0f21900000000000000", "service": "00000000000000000000ffff480eb7f9", "pubKeyOperator": "9531a02fe2e63e91ee2f6e3e75eb78b2fa91878b9d65854b053376441a969a216376be2b61fe5f34e246b8039c25dbb3", "votingAddress": "3WB5KaXUzKakCEonZoFTYwoqu2Cx", "isValid": true},{"proRegTxHash": "3e8356395c80157d914381178a9356c1c03975f464c1742676406cd134045c47", "confirmedHash": "c5e42ee8bfb800b803e0cf8adb46da214ff1fe9ed4b825a91200000000000000", "service": "00000000000000000000ffff2e65f022", "pubKeyOperator": "8f0d0e77c43734579c9cddb79d7c1f1d37248b1327bcb24c065dd36989338dd1cb5417f12ae8d06bc351713279c8ff2f", "votingAddress": "eUkU4gH4qVyLMv2A4kJuy1MUY8f", "isValid": true},{"proRegTxHash": "6e934885143fae275e494dbaabd43f11fe54e79d3c70b9dbd60f89f7b26b536d", "confirmedHash": "0cb36e4e1a00242957072fe188e1c98b9e81113f1da01da51700000000000000", "service": "00000000000000000000ffffd41860b2", "pubKeyOperator": "08bef74b62a5b6de1f088c9b2044aa444dcec42158586ab0be4d053f8e83327e1a44ee6a865b48626ade4978f52d80f5", "votingAddress": "2GWdRGnH6W1apJyffLLbj4CSAN7t", "isValid": false},{"proRegTxHash": "e3ec32cf11aa52a2ac12255d48b5b05849ccd41a14a22aef8a5f24d90e15efdc", "confirmedHash": "c0acbbf549617a4bca5bc2ee4de641bbf41c3b2bab6703d72200000000000000", "service": "00000000000000000000ffff5fb3b781", "pubKeyOperator": "02ce2d141c450d4cdb9c25885ec856129c25c7ceb9d29ed9a6c74a6cda74b18d65c55f7effaacfaa1222855dd3c3ef83", "votingAddress": "3vs8ZYd1QBFH4fvhW2QRBY3oowqa", "isValid": true},{"proRegTxHash": "f9bac52fb65d94793d0a852be073407bea1ec2171b53a834fd144d9f2565f9d1", "confirmedHash": "36e255211b1e72382e078b646118ddbf5ac4a0e35323fabe2f00000000000000", "service": "00000000000000000000ffff9fcb21fe", "pubKeyOperator": "131bf345f5b24b2a9894775cf4d9c636235d83178c7a4e747de30b31005fe240104a0ff953a4ab62fac1b87495146890", "votingAddress": "3NgmUTiTh2XbjtR256v21NMGMmJi", "isValid": true},{"proRegTxHash": "ebfac0c1883f3cd1fecc44040d9fd57a705a97bbd5b39a15587d3efa4ebb8fd7", "confirmedHash": "9c8fb9b63c3ec2f37dc77e7ddf62e2a2affada46e73cffa30f00000000000000", "service": "00000000000000000000ffffb23e1292", "pubKeyOperator": "8fe224de3de77625a9b2d257d07ae0b048f55029b0a1e1addd634b6fbb5ad7cb1a97bc967927293875427371e8860978", "votingAddress": "3nSs2gGFe6tZy9zyiCc11pwSbat3", "isValid": true},{"proRegTxHash": "bde38f2cc04ce2ec05ef4785ede91afcc48cf434b48c48e2bcdd40a8c1d4522d", "confirmedHash": "7dbe72efca5b046e0b354280a6ab940cea182355f4c24a432800000000000000", "service": "00000000000000000000ffffa747850a", "pubKeyOperator": "8d711f136df824e8c61a86173a5e46914beca88dbbf70d4967c5b4d113c64ee30374c293e4910441f216a4c8f7f37b2c", "votingAddress": "2De7vSunmKTKaA3jWwnSxgQtfTxp", "isValid": true},{"proRegTxHash": "ca57d93cf8523f2d6cec84d045a58559773809acf4d3e46e56f13050008c2971", "confirmedHash": "89c0e3a8d7d60fb6d07199af27d55326b210afb47b1449802d00000000000000", "service": "00000000000000000000ffffbce2b477", "pubKeyOperator": "11035ba8560e243c2a9226753be62675450b1ce4b1daa784b455b795dcd747b38802b573a661cb987057e5d3d08505af", "votingAddress": "3pd7BujKW4Q424FYBfs1rUrE1SYJ", "isValid": true},{"proRegTxHash": "038691e838d1879433a971367370a10760c8723627c206cfd8cc291f62125b8e", "confirmedHash": "99d78221fc4c388fb540094803b63443c8ae9d4710f3c72b2d00000000000000", "service": "00000000000000000000ffff05a157b8", "pubKeyOperator": "1174d8d574063f0351f6c22fa1adf93eca447cb7ad26af44568d845ad9dbc4a634280bd056dcbdf5b22fa74eb81b837b", "votingAddress": "3SDj9cn3VyYYgbQYTDMo5CFRQXGG", "isValid": true},{"proRegTxHash": "fcbf0bac9a6e60937d6637580d774f3b9fcbab5490191d84306dfcaf209b4dde", "confirmedHash": "0e6c903e9c10b023f35e0b972dd5b2d46628478eef6971e41100000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "2AD2CXYoQXp3rpX1MJXPvFpm67W7", "isValid": false},{"proRegTxHash": "d85f376aeda177cf16180a91d8300038a202f6f2cedd2e47bc0969db7ee620eb", "confirmedHash": "a0e1e85694aac7a859beb26152237e33edb07c6ae5811cfd0400000000000000", "service": "00000000000000000000ffff2d55755a", "pubKeyOperator": "185372cb1787ebecf41b8a6110cb6bb88e2213f3dfd3a02159d5b81bc9f9ef023544a1057fe04e88e8b162d6c878f6bd", "votingAddress": "wsZapL96s3yz15LJdxAhBaLrAja", "isValid": true},{"proRegTxHash": "77e42738f8701d8a0ddf5b20fc269172d4137558e9f332bb722d03e20aefb46d", "confirmedHash": "51866b4392ef638fbd2e1b4fae91e3d8ee93d2f10a28b5b51a00000000000000", "service": "00000000000000000000ffff5fd90670", "pubKeyOperator": "1130455b00034d7cbcef899d3ca03ffbc44c361e950db2c04de3cad0cb49d7004a832e85ab7f5773ecb13282ebdb422f", "votingAddress": "2sxnQed9RGt2t84YwKSQbMoYqhyC", "isValid": true},{"proRegTxHash": "0dd5b6471bf65757b6a86ebde9a0d372d871e1bc419b82f8e2f39615751ec165", "confirmedHash": "91f453790a4b844650e410d4bf0ab9d8791499f40a6aa1800c00000000000000", "service": "00000000000000000000ffffc2875baf", "pubKeyOperator": "026184d68ce55a58f815c8c4ca7696a26773e0494fa0e79326eded8f9abe713e71fe5cd32ed2b2cb9782547adb9ec844", "votingAddress": "3TiqytAKkyndedn9YMfanCg4wtWx", "isValid": true},{"proRegTxHash": "6ec5a38784700fa945678a59a02da9d9cc49290d1dd7a7f6184d5ce8c93e11e5", "confirmedHash": "37b6b4e14d27cf2d37e2ea82a837e1bd359533fc503c746f0b00000000000000", "service": "00000000000000000000ffffcff66938", "pubKeyOperator": "907e3d4b42270b8e439a4af9d8ce00fbf338bdb7f661b79556743e340d266e39574c3eec4aa3701b021ddff7e0321a08", "votingAddress": "4UfiMdwqz9iZpY9QibBGCmhKWkAW", "isValid": false},{"proRegTxHash": "3a96677e5cb230a15c1458158be3f911013cbe615a12c7417954fb237caf8846", "confirmedHash": "0e2dfa280149a2a32652a9d82e93fad32c38ec8bb1f4a6b11b00000000000000", "service": "00000000000000000000ffffb945348a", "pubKeyOperator": "16288965b8b7e3227b5cf49dc1b1e51f11895f178d1bea390bfecfbdaaff35885f8a77e59609ffd13a506e3839da9391", "votingAddress": "LzoJ5D3V7H9MDnyZJudyw9iSUft", "isValid": true},{"proRegTxHash": "cea93e0f83c310ff150429ddadec5fbf22bac26ee2fb91f63fabf1c5cbe234cd", "confirmedHash": "46542746e75feced73dd534d2dad33ff8500c8765256fe351d00000000000000", "service": "00000000000000000000ffff9b8a9a8c", "pubKeyOperator": "95d982364bdc99625f4d98d111db2230f3e8ece6dcda59b2b775ae19aad9b2d2d70a66feeb6ae42c0424d92670c22973", "votingAddress": "43brgDsjJrPvwoAjoyLCJWwHYYfz", "isValid": true},{"proRegTxHash": "ce2e89e0e9e7e07b8d4a660f99b86eb258133ad42208af37b373773f909ffcd5", "confirmedHash": "0cf60a3c2210bc2cc15c30e9a90e2e780398a5000c72906b1000000000000000", "service": "00000000000000000000ffff2d4c9a4b", "pubKeyOperator": "8a957547288a50adffc379e5e6b8bd5f96a595f86e4f3bd59494a7f44df86277e4f104518936aacd24e1016b2a724644", "votingAddress": "2YKgwwxopGXZABbbCfZFtZmiGcvE", "isValid": true},{"proRegTxHash": "30b1650bc44de8e2e969b292a2a60a1c5aa99e17a46f1f64fde669c5a66168e7", "confirmedHash": "7a429def2e82482fd425d39cd6a21f46756c9c8dd42207261d00000000000000", "service": "00000000000000000000ffff2d4d4132", "pubKeyOperator": "904bc5cd0adece35b381e8d08fb2ae25a16d0a0ded2571b09906885c945d76d51e642d916dee8f0eff1d61c5f6cc9c75", "votingAddress": "SSoUHaSfFN549iuKngGncKLBe7h", "isValid": true},{"proRegTxHash": "1a04c3dda6d48427413004d49a53c8c9779df3958b05a4ddf672813be20ba3f1", "confirmedHash": "f307b3f63a7e3705c01be98a712b2ba2623858b2b4f41ecd0400000000000000", "service": "00000000000000000000ffffa8eb5569", "pubKeyOperator": "80c13ef76f7ba1c6209a0ef055bb1aed7e0d9dec8200accef43933114f29352972141d58ceadadc291c3044b75615e90", "votingAddress": "WEqW94iGzYPnst8g8FZg2b9BKAK", "isValid": true},{"proRegTxHash": "fbf5f8fd5cb05d5ce774f56cb8790c0d58ad4398d936e66bd02964df42d0aa44", "confirmedHash": "e46907423e8b46cecd8e269521ede064c9e6b7117fbbb9721400000000000000", "service": "00000000000000000000ffff50d1e574", "pubKeyOperator": "934658f5f0cb4aeee211bad65dbbf51c04296cf838217045067337252bb8c13e7ad6ee3739e3cb809072ff335cd36bef", "votingAddress": "saEopSDvtWwMRJBL3QJUPmXVmA5", "isValid": false},{"proRegTxHash": "b99909ff1034009f607ab77100eb1f202d56f75f8428860e5e422f03d4bc94bb", "confirmedHash": "d7a8679c1ab75f76956048bb1a9134be7ff3a2a4e2e5eefa0400000000000000", "service": "00000000000000000000ffff55d1f240", "pubKeyOperator": "99a3fce408715f91a3ff0bb694a6c752ff37f5fe8ab1c6a7698b82558a40c8bd82f4e5e585154d1f2e45f3aa926797b9", "votingAddress": "St45MDRrBz6YnSjfZRDekEgiKsj", "isValid": true},{"proRegTxHash": "2afbb1b78cba298e9878084c0e80daa974b55b977e9d91696c0cf137ee28ec4d", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0d7", "pubKeyOperator": "16385c34fbd86e200df9a40bfe18bbe0c6851207e60c2f6432e4fea940acd421629f2beb1bd2e542d6a3b2d4b7d5eb26", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "61b5c9ab03878e601b9831bd39cb5c00468c014404b3072eb13e83ef146542a0", "confirmedHash": "9b5bc5f246bd929d5d85fc0a4dc95df780c83751bb96832e0e00000000000000", "service": "00000000000000000000ffff55d1f27f", "pubKeyOperator": "93821a532696c5e89f0d23eee272b0dae597fccb179ccb6e4dac3524779b315e7277d952f2787a96029cd47154627d18", "votingAddress": "wJVMphugPxWjrqPTS7pJzjgLtyw", "isValid": false},{"proRegTxHash": "60a0faea533fa3ef898a7ebd2b2e3c40c62b62428ee0ff391c853f97b4f13eaa", "confirmedHash": "7ff088d3dd533f0b0b22c3e42105ca6d68cd00f2ef3fbf4d1500000000000000", "service": "00000000000000000000ffff52d31969", "pubKeyOperator": "086f5c0d57ac779daae188eb2e177f49ab2dfe26114889fa0a7af5dcfca25cffad47f2b4e1cee0d90736aac589a46283", "votingAddress": "g2jcNHUTGw7aRoZWRT2aPvJLrn9", "isValid": true},{"proRegTxHash": "6c1324b3dcd67770a7aa28b094f87f5a843f365f43e944fc56de99c02fb36418", "confirmedHash": "54245fed9148aca16f542f50528b7fdbd879c7cfece81edb1d00000000000000", "service": "00000000000000000000ffff86d1e383", "pubKeyOperator": "84bc8f3035fb990da87576645130944ef0a5124eb5a68844b145ed35f1819c99e0ed121e4ced2c3328c55851145a2dd4", "votingAddress": "2e5FmJhseT4jBs6PJns5a5mmio9b", "isValid": true},{"proRegTxHash": "6a8c07b2bbd6dafc267f61734ce28e8f314cec02bf92cafbba7c980f174207bd", "confirmedHash": "76093ea374c5a831a7a84b2b5a8fb2628541cee7895e088e0a00000000000000", "service": "00000000000000000000ffff67a05fe1", "pubKeyOperator": "8ed5c4bd85ac9faaa2b8a8f005c7182fd147456d00b32c72cf4de50cfc695beaeb02b07ffe8f82d07092a4cff13eacc2", "votingAddress": "2F7QF4f2wntH8UhYijexgFzPbSPa", "isValid": true},{"proRegTxHash": "445f2d6b09c630e1e02a80d0f1652164a1a040aa51de3da7a789b711236f91f3", "confirmedHash": "3645aa68fdad4843821b3af31fae486e01276e3a78f026ed0400000000000000", "service": "00000000000000000000ffff4f621f2e", "pubKeyOperator": "0639c6cf5ba22aef415c65e88c2be0a52d8e1bd5cac208eead430593f0a87df2e790becaac7bd9886bf6fc5c030cc099", "votingAddress": "2m5TYQ9MyQCbWCXa5kkdcy6mkmeA", "isValid": true},{"proRegTxHash": "21c5aa821fd9489499c7d9fd2227df9e0ebc7de763aa27d7d1a429a18c935021", "confirmedHash": "7776681cc38a2ba2293a1570e0ecfab576a36c446fed7b2e0200000000000000", "service": "00000000000000000000ffff33c37513", "pubKeyOperator": "83b6cec7dcda1e67f059743677fee65e0328997f32e8ed7d214371b93b464859c55af3488353eafaa86182105a964d5a", "votingAddress": "4RXdrGVavmhC5uZkJoEXVAk74mxC", "isValid": true},{"proRegTxHash": "48f06f0cb24c299b042173462b0e7b2e3cfb275adc71dfd9339c97b1805967e0", "confirmedHash": "a3dba9f8c6ef76eef1128001dd671e2462fd49ef40ed379f0600000000000000", "service": "00000000000000000000ffff52d315be", "pubKeyOperator": "065c796228b9e6a444c21a5376fa18f94480d5c71dedf481d6e27907e26db7aa0ec4d1faeb216744772fc662315df85c", "votingAddress": "3h4LP9YrnGunk4HnUmjrLKRtQx1", "isValid": true},{"proRegTxHash": "aea39780c925a043e9c66cf3943af437975ce0acb419d21e5c54f012c548529e", "confirmedHash": "4895c7dc69ed2216c351dbc1589543cea71bfd62eb4b1c360500000000000000", "service": "00000000000000000000ffff8ff48051", "pubKeyOperator": "0d2be51f5eb98454b2a4358c80b0ea3c88ae5fbffc48d9e931c0ade2c4d8e84f83164a194bb08e30c4df97489f7fb9c4", "votingAddress": "GV949i8bMXEBCQEPpfhq4QortEf", "isValid": true},{"proRegTxHash": "411f8863b12a79e10e92cb6dd91d26c4554154307499bed47dfb4f6c2bca56d4", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d52448", "pubKeyOperator": "03dfc8f214dae21ee2513e3333e5892dc748458a306800c92a7e9dcc777f960139e02e9b1259cf48adb3e03efc0e352d", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "47b1110c3e291f3f460b7aa3775cbb54d37649202d6816381c04886b326fc54c", "confirmedHash": "fdda34fbc6ae4172459fdbc246505763b7fcbf976f38935f1200000000000000", "service": "00000000000000000000ffffcf944f68", "pubKeyOperator": "8c018026a7cafc6e0d37f00870fe21ce8004fa151f4857463cf8e5061dc196e0ab567d73ceef84875dbdc451677fa5f0", "votingAddress": "2r84pbGjtrw9V2XQJE8TmGiWxrn8", "isValid": true},{"proRegTxHash": "c12b33c5df02e2376bfefa50289a071ecd23f8a1c0c8a10444bc03e44fd76cfc", "confirmedHash": "9bbfab2d195be007fe7754188693ee2e5df965e6807967f70300000000000000", "service": "00000000000000000000ffff8bb4b884", "pubKeyOperator": "00d469ebfb69187e3b73f5b808ae1f33c563e49b5fd871fa5c0cfc47e5cc6c7b8d28100b7f2364888ed1d2f59d71d50f", "votingAddress": "2HioNRjE96jQ1CkC8FY1CTgXw8vr", "isValid": true},{"proRegTxHash": "7b7fa97f58dc557bfd0b672169be26211c8efd4ea221d034480b13c8b92f9286", "confirmedHash": "de947d5e297594025ccaf6f53c80c5e1ac4bc17213365fe02300000000000000", "service": "00000000000000000000ffff5fd97d64", "pubKeyOperator": "0fc0abc65510e6c1b17b06f3ccec240889cfbbcc0c96e1136f8ed42c4e9f8a28fc09f5671425d66efde55d4260f37bde", "votingAddress": "2X8ou1GZDm8FggeJEUT1efkSUk1y", "isValid": true},{"proRegTxHash": "7f23da146861af2af418bce4884bc21e2843c116abb2f230c7bb4e9a7bf7c9d0", "confirmedHash": "9b49c7ed0db3a99b7b72578a2b7eca7ce841263991637bba0000000000000000", "service": "00000000000000000000ffff55d1f1c9", "pubKeyOperator": "8d5387e85c8b7ac50607f03f98203b934514454fd3808acaaf7d5d1d2d4bf2d9ac3976f98b61d688962c8a9e3598b13c", "votingAddress": "4S89UKQrXKf8774S5mwbuhmjmrER", "isValid": true},{"proRegTxHash": "5f3d92c9527aa4f441c8c9b67fee4d498ddffdd78da142e29d96cc9da0f663eb", "confirmedHash": "f3d6075d23b86a44e3ffafcca06d9126362dbcd0033ed3a82900000000000000", "service": "00000000000000000000ffff2e04a27d", "pubKeyOperator": "8c46ad5720fd370f39f126838c0986ad9f1178188a4fb16d9738494dc1c5730da7d36458acee3ffd620bfe392e361b0d", "votingAddress": "3QVLxYvRscJiF8XTYzJaa45DSPXA", "isValid": true},{"proRegTxHash": "c3b56f01d6c15b44ceab3c003e3cf9cac770811eaf68bcd1035d57441b02e72d", "confirmedHash": "cdbeebc4a3580b1d894014dcafb37c7472a5131b33ac100e0100000000000000", "service": "00000000000000000000ffff592fa09b", "pubKeyOperator": "0026473ccdb7d656e30e909d3906542298151a40327a78e7fd0844cbb3c490bb08e868745a02781855ba42b75d9ede4d", "votingAddress": "3SJBgorTk6LmD1FQyTGQNcXbASfN", "isValid": false},{"proRegTxHash": "de88453ad75da68d33163349ca9cec0abae8e2bf01941826da8127c8da0c649b", "confirmedHash": "b71e8169ed6de9fb0ec90afcc499edbadf0e8e42b815aa6e2200000000000000", "service": "00000000000000000000ffff8ac5854e", "pubKeyOperator": "938b7cef541e9c70c1904f39c8844fb9e8f0376e618200abf2998512ed136e4613fb3abacd6d382bbef74704a26cfb19", "votingAddress": "35vijYisNr8YsP8kCUtedKuK11kd", "isValid": false},{"proRegTxHash": "c83e99762485a4102563a029e6d1d934e04a56a469837b927224fca98e70d1ac", "confirmedHash": "7354e0b754590a6f368930952fb51e38cf1a724019cb24520b00000000000000", "service": "00000000000000000000ffffd41865aa", "pubKeyOperator": "0f47ecec2079ea4c3efc1f6e3f753056ed2761610d5a18f4007a67d82d38231a1c2645a081e3f26a349717b54d9e1900", "votingAddress": "3krbv2cUfyZJbd789ei9N6aZCUkc", "isValid": true},{"proRegTxHash": "c1bb9c4fabb1ebde8278464235940a3368a722d7b61d76db92b4693ee4f5234d", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b060", "pubKeyOperator": "937683160d647c8f81d4e114c3e625ec07cd998756f39798bfdd8a0a0d45cddbd69f5296e178a09bb966269835603a35", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "fb97b415a05c24879896391445e9401699c22d52fe35b051af19134fa1668c10", "confirmedHash": "d57fbac48102742cecb076cb448a36962e291769ddd8735d1300000000000000", "service": "00000000000000000000ffffc2875246", "pubKeyOperator": "01fe1a0409821e0497e7895ab375c0c3b4d636d733d6f78384a6c1de4a8f73c04095c5555461d32471907e820b3037e8", "votingAddress": "2WuoSNgRBKSvbwfJv7rT8yvHdy1v", "isValid": false},{"proRegTxHash": "caf34d3c47d8d52c8134a10af3fc3f1b8fcd9acea225e319ebf131242746df08", "confirmedHash": "cdea5b6d9ef9aa881da82580b584e27881ab2850cfba730a0300000000000000", "service": "00000000000000000000ffff453d6bd9", "pubKeyOperator": "0030e6a5a104c5c4521e150d761c1d99a1034eb9587fee3d4796e7fbf015a95cac8c8c6fcccb9c500d1f65271423e3df", "votingAddress": "PTK2f7TNsPfCu4WgEZDeADCEgJE", "isValid": true},{"proRegTxHash": "ae15c35efb8d638f227ed294035b58b1d1c78e1bbbd284716fbc157dc57d63ef", "confirmedHash": "381564ab934566b10a4575635c3cd3e2b976a5b8b7a2c9911200000000000000", "service": "00000000000000000000ffff5fd8af80", "pubKeyOperator": "1063d558d66383f8b7d1542aafa1e0330748a63cedea6f30947f86bad9caba906c75b5eb358acf9d5c35f3e623d55513", "votingAddress": "412umGz9xy7ta87U9XxF6Rr9sR1N", "isValid": true},{"proRegTxHash": "f385b92654787b376cbae633adb3cc8694c195ec9f3b9859a274d6c3aa6ab2d5", "confirmedHash": "e3f9e323f3407111f4cf5923989966e329d2fe28acc52ab90500000000000000", "service": "00000000000000000000ffffbc2815f7", "pubKeyOperator": "923e457cda98d65db8e2088fb7dd57277fe272fd5ee2930586836030f98d762c59861e71c8a6b0a749262d5823471bad", "votingAddress": "2WYKJSJyJEpTepeU94DrXLHUtw8w", "isValid": true},{"proRegTxHash": "23e38bddbb324122aa35a87ad0d3263a9425d37fd866c0aed23989d3a6ce19dd", "confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", "service": "00000000000000000000ffff50d1eb03", "pubKeyOperator": "81a2733e45eba76282fa365c415815338a2c8e1da3a432f7860bcc9e891b36a23e5590278e13eb0b998b8ed5e9b56009", "votingAddress": "2ddUj2E5rMqhzaDEE72uMgykJRsA", "isValid": true},{"proRegTxHash": "93d731c50434fc6fea1ff83bab8ce8bfcbd85dcb7e11216843c1c199f9009aca", "confirmedHash": "bde35805d37e1e3b109c05ed15d2d746b5f48cb9c3d928b70100000000000000", "service": "00000000000000000000ffffa747300d", "pubKeyOperator": "0438b088dbd4dec9a408065b9af39c7be958e422578850902329b01789dd910b3bb4a74be927bf6b1471772ade653164", "votingAddress": "ZuEnAg6W2ac3eiN3WNVfWgfxdMV", "isValid": true},{"proRegTxHash": "6f421dd822c1da0d0474549f1b45dafea4efe6347344aaea688706f5ab8f5869", "confirmedHash": "abbf2a18662e8198b1323df1fe410d303c074c242c1d59f50300000000000000", "service": "00000000000000000000ffffa7a024fc", "pubKeyOperator": "939274fa4bab538fbcacaea351c698e04d4322af5b47cf70266348c2bf5879dc03f2061b9ca0a003efbe279ff896172b", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "e51634a3b9f3eeba7d3df90891cbb40225453f7cc8d470a99372fada5214ceaf", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d52f67", "pubKeyOperator": "95c3ddf8b787512402f34d27bfcb36961f41a3ac9351fbc53c6cd95371deaec83e68ee78e18a341df9e2dfedfc8677b2", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "fd3c74c20b256d467ea42f4305aec45e15e78915d524607cd9188a3a141e08df", "confirmedHash": "c20154f0dbc19fd257943498f393b7ed582bd1272c13b3351100000000000000", "service": "00000000000000000000ffff55d1f140", "pubKeyOperator": "173d4634a262da6ac07bbcffcb14e64459a21be680b43afc787ddd0c2410ef136ae9bc2a4bf03aa0a9c3795f33ecd044", "votingAddress": "4Mo644vhLdbTcFCwCCZhhhiDwAnR", "isValid": true},{"proRegTxHash": "bbc5b4426c51206dd00f826090f52149dbadd4ace0818b278940eafa4c47f954", "confirmedHash": "619b2dbf50ce8b7a549c8584b5d19e0c920c29d90e40f9600100000000000000", "service": "00000000000000000000ffff2f63e5d5", "pubKeyOperator": "88a421f0ca2df3a6246505509d68652ed253d192a58f5177b8acf796a54c09f452297ad1d76a00ae0ee42eefbae2b1a3", "votingAddress": "4XQwg7NWYZagnQnTD8F1jrVVPsTM", "isValid": false},{"proRegTxHash": "e1940ade0fcde1830075bfd8851fad7ec6ed827ce3c49316eaf0f7de7c20d2e4", "confirmedHash": "783fc6a233e0854653c8c3a22cbd0188b6cc25063cdabe750700000000000000", "service": "00000000000000000000ffff52d31997", "pubKeyOperator": "9992af3223442ef25f2f751f968f27e381b58e68a8d4f65402f178609df5d59428502521cd2731f2be92b392b1001ab6", "votingAddress": "2KRvjXKzMWwXwkhx5JzhtrPg2QyG", "isValid": true},{"proRegTxHash": "7c6efbea01a00f05b2e81f3c3afb641684fcf8ce3b43522d31c19c5d34399517", "confirmedHash": "159d6c679927f79aca6561e0d43e0edd42b592cc3d3cf0b42100000000000000", "service": "00000000000000000000ffff80c78492", "pubKeyOperator": "96ee0bcdbb56de936eda06b4a39fcd958cb48d7fd2a2e25abccd88248738fa2a8950f37e7706a4e175805f6fd7322f1d", "votingAddress": "XBWh9o67jyY2yknMPVU3So897Tw", "isValid": false},{"proRegTxHash": "9310711e11cbe8243cf2e521a8323f86f042abe3d5bde9d44ad9c012d4d01665", "confirmedHash": "0335ae53e370bf027f1bf8e91067f51e0e004a03797f4ebf0900000000000000", "service": "00000000000000000000ffffd4186805", "pubKeyOperator": "890b17ce0c227be23fb6acc60e15e4fcd39abdac5677de2c35325e92df5e5a335f08b2e082fe4d22e21745abf8d17945", "votingAddress": "2V9c6XS8VnignpJ6Ui5ASe4XFaSD", "isValid": false},{"proRegTxHash": "790447325b6638c6bcd9e13824dd0ae6e0191a28f4722d395728a711d7260da6", "confirmedHash": "7cda8921938c300240120da22ce849420a62e494a23a22053000000000000000", "service": "00000000000000000000ffff92b99ee8", "pubKeyOperator": "8c8d0a69104d2538daa07862f91093e9a00e3278aeb71dfd1aca7ae7ba9ee7adbe440ef48b45a04dbbbe913623df43a4", "votingAddress": "3Bmx2XE5Sa6n3WqDHEax4V7wExBs", "isValid": false},{"proRegTxHash": "919e4294fbfc324c543e258ebb512933a67ac3f28923afd0e28dfe07ab6c06d0", "confirmedHash": "af5e202e7753767e4a15b2aea5fb5663e825cd8eecdd17ba0d00000000000000", "service": "00000000000000000000ffff9f418312", "pubKeyOperator": "8856299908dd3c820fb18a051e32f1a6f3bcab996413b6d91c9078ec12b79979539007433d5119bfe9074dc14718ee53", "votingAddress": "494DLUnSwxAd2VFQ6TdGdkCoFVXD", "isValid": true},{"proRegTxHash": "c63885d3230f5c7d433141c1229d4eb10d3819f198ceda2fd2407a5ab3cecec1", "confirmedHash": "f9393c9c05e71e5738e3abcd7eda0f3ee40f88870dd28d841000000000000000", "service": "00000000000000000000ffff9df5453a", "pubKeyOperator": "902d868ed84654f0182761a00b45cf637696027caaab99fabbfe32673368cde7508a185988a739f72ef1ee1e222f7752", "votingAddress": "5fo6wsar6WqNfdBsQ2uXhAf4DEz", "isValid": true},{"proRegTxHash": "f8e015aa449e93b44e9cfdca9108d61099a5c644ebc9814907343743d41db6bf", "confirmedHash": "5f4df001517869f07b1e81d8b179499d85c6e62ba7f2d6fa1d00000000000000", "service": "00000000000000000000ffff68f89fa9", "pubKeyOperator": "83ce55d1170f9ecaaa7a7a4bc5aa676c2b3fffeafbc814f927a2ed3c98e1362f0e9bcfee591415638c386c0278fc94aa", "votingAddress": "45hhNU3AykEKaq51Pg4YUHaFhvaZ", "isValid": true},{"proRegTxHash": "0486731b7ce036b1107b2c709e64cdabeef4117142297db98ac50dd5e944ee89", "confirmedHash": "ff1547d878725eff3c31ed8b522fe6dd4b40263aa5d67ed80f00000000000000", "service": "00000000000000000000ffff6deb41cc", "pubKeyOperator": "103841432370309d07076f3f4c1711149a650a667b77d35464661866c4f5d44fe3478929b1bfd4c2bcd9786c179043e7", "votingAddress": "2S6ujy2TNANnJQm4LZgcvMbBkPgs", "isValid": true},{"proRegTxHash": "2982cd538fa984761b6c9f0e9e1e123d8e170ecce3ab5aa8459d2c8d5d15926b", "confirmedHash": "43d6d86e68a2894f3b2eb86ad08f68444925f05e2062535d0f00000000000000", "service": "00000000000000000000ffff2d3f6b77", "pubKeyOperator": "10e0a78d79ab94874dce8ee74a96c4d73bb2a1f4a8d4b1a0547a96f1c127c10aea4ca58088c7a264726a54ed32250b1f", "votingAddress": "32kc4goxYLSsaeZTZN1omYxzPxCY", "isValid": true},{"proRegTxHash": "dccb0dc5e22b676b4f336be9712432978993a83a4e643492ede7b94b9536d45d", "confirmedHash": "55a81fde90c8b44ff12656b158ad1571fb7e99cde73dff0f2900000000000000", "service": "00000000000000000000ffff98596bc8", "pubKeyOperator": "0f605202b84530283f829f0f320161a31bfd9bf0702d287fa4ac05c7ee1c192c1e17558fe8c1566cdbae431f048ab025", "votingAddress": "3u6vPD2yfZnhvPd4tjkJeecFs2FG", "isValid": true},{"proRegTxHash": "292a3488fad1840abe752f3edf9442a6ccb258f6b60ca1658f80cb1335c2c4f1", "confirmedHash": "8eeefdc83572dcd6a48cdf185e3651a04fdd009fac74b10c0000000000000000", "service": "00000000000000000000ffff55d1f20b", "pubKeyOperator": "981ac36a850aa1eed82957ab100f707a6da909a5bd0bbd6c8c845eff6c8b12be4f146898c7ecfcd32299d0f54998a46e", "votingAddress": "ZVxVwdRND5hciGgd6uBZpPQkM6n", "isValid": true},{"proRegTxHash": "f445b5e0ba1101c0b70b3397fc0913e06e8fc4d45f67a6a4a4372bafcd658f1e", "confirmedHash": "d522a586924d0dfdcc0fa3fb3ae24f2df3ce9f6c416ae61c0a00000000000000", "service": "00000000000000000000ffff8ac586a7", "pubKeyOperator": "854c49d2d5f22a24035f184c72492c92707a6b85cdd2fa9b15ba4977bb936aa29ee3bc5f093ac2ac1cda79be1abc2da7", "votingAddress": "2XUKxgefPbPS1uYimAw1zxQ2wfaP", "isValid": true},{"proRegTxHash": "87210e3511b2a35d31475f02d8d3271763671c1586f3a1f69518c01d1e4cbdfa", "confirmedHash": "2364b3585545abce8fe7207a0c89554e0cbb68d40ccb48221b00000000000000", "service": "00000000000000000000ffff52d31998", "pubKeyOperator": "1232235225905ae0f2f765dcc3908e2e40d241bf9783ee7e39831bf76b620e3c019fdb522900563dc06a0494b036c27e", "votingAddress": "44MtCuXS9LzgoQfd8uFsPKKiUx2e", "isValid": true},{"proRegTxHash": "f7e4352557dd7c0239dcf23ce76f9bb4a7b5ee9cbf0e6ee2fe8d5b2514ff2f2f", "confirmedHash": "6a4665ab71fd3be72ef78d374d3bd8d9ec742bfd576438382700000000000000", "service": "00000000000000000000ffffbc28fbd0", "pubKeyOperator": "8642a83ed1024f881df4abe2a684ef3518e928eb2b9225dec76a860518aebde6e3cf6d2920253c88fcf53e1345cc2b1e", "votingAddress": "3bU42ejFJm9iLkfwRwLxq1cHLuRq", "isValid": true},{"proRegTxHash": "b90e56813f4128c71bf47661cd43a13bec0141e77e554e9a1ea1f186599b58fe", "confirmedHash": "df74ce8aa3740ad816a3f57884f174a5691494cdb935fa4c1700000000000000", "service": "00000000000000000000ffff3e4d98cc", "pubKeyOperator": "912eeb4489a00b9a1aa9aafaf1d077ccf47f482060173c275c3b4df469346a6d27c560d9bbb773c6a98ca5b0ba9d6d6a", "votingAddress": "3iTapz8yfShKd1qgTzswwYU6MF66", "isValid": false},{"proRegTxHash": "79a3eaa056952d9c139507e71f15c25cad4d422106655e6a678da96deb81a19f", "confirmedHash": "fe75f459bae27485294ea62df2d7f7bc0e90d9f0f337ddeb0e00000000000000", "service": "00000000000000000000ffff9f419b5b", "pubKeyOperator": "9525a9a3eac9815d12fbbdb23ba6f73e476873032e928aca5e95130722dbd01e9f12fb2a2538c99048a645cb4ce3473c", "votingAddress": "K4yDcyLLzeny5uCWKAFtMmcwSuz", "isValid": true},{"proRegTxHash": "84dbc999f027e5110dba00256f98e49642500b26950452f2fd2bfdcc32972bc9", "confirmedHash": "b4992c640010ee4b12d3f250160c84d1751d8806ce84b90f0600000000000000", "service": "00000000000000000000ffffd4186b16", "pubKeyOperator": "92444a5a3bc28642379d0e50f8846b21cbdbb5808449d202fa328306719fe4a6491ba0185922bac193efed595c341a58", "votingAddress": "Us8HSP7dW73mAYTRqjtLnnMriSe", "isValid": true},{"proRegTxHash": "6018819fa74ddaa68bcb65a75ace4bb36b594ea9624929ef539a08931a114400", "confirmedHash": "861ed98622270761e60ded88bc6250b489a023f8c4f0324b0800000000000000", "service": "00000000000000000000ffffa74733cd", "pubKeyOperator": "8955c7f86c05cca0f5562a211e3316589f1e1930e890f7cb4167c5db0d3af44f3f649378d993c6f97b652c95d752e208", "votingAddress": "2qGzNKTZdByJPfCiSkH8boWZ2jTC", "isValid": true},{"proRegTxHash": "b77dd27865e3a18833c2f911b0d3e3c938a05310e987c62ce873ff47a0a22f1e", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688b673", "pubKeyOperator": "97111f4f8717c24890ecc9b0f51dc2a603760541030cf8350175fc2152929eb08650b3027c2192598f13e553c5a14ba0", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "79a7197155375ffcaa9d49bff0521672a3d22ad3e0751de8b0166dafad3d6d8a", "confirmedHash": "1c4217c3578b3f33da0fd45c2ff6feb654f740d46686d8a20600000000000000", "service": "00000000000000000000ffff68f8104a", "pubKeyOperator": "8b485020ae19bdf073466ef6289b5a590c80780af7e55966ad536d2278481e0bdab1dc3c9bc4e898f7d89e217f60db66", "votingAddress": "3Fcd5XCn9Bu3dpSBfHmYSg3NfD5", "isValid": true},{"proRegTxHash": "357a64fc33d7abefa72fd46d6b31ec33cd7a3b34586bd5caab1d6d6cf1f0251b", "confirmedHash": "827907875dedd22cbc59d7e780b4f4f51da96675db5ab85c0100000000000000", "service": "00000000000000000000ffff9f417915", "pubKeyOperator": "04ab7918725a0d96790cc1471e69be330b90f555f8a5299cfe1521ff00e2b8bc575eb62ddcbd60572043f5873cc30baf", "votingAddress": "292V7N4oRe1uMciQg5MHSrhzwwzJ", "isValid": true},{"proRegTxHash": "e398e35434b46bc66a0d709cb86aab9745ab204d3adbd01a07d6f774f389d03c", "confirmedHash": "f95d58e237f90d5bf906336283b059e02687a467f1ce27b71a00000000000000", "service": "00000000000000000000ffff87b5cd83", "pubKeyOperator": "8d1fabb183eda9bbde1ae67ebec745c8e87eb05ef53cb823af51b2601aff0c4671691186d9e2ea5f2963ccaf5ecd0c5a", "votingAddress": "24BUDigjKRk7QxbgRUSXEtae9aue", "isValid": false},{"proRegTxHash": "34689bc96274e335273043923ff6d3942ed1be84c673e7efc5295fd167dcb6eb", "confirmedHash": "1bf14944a1bddd12ed07cd544012c9c51e6d4b29e17a8d7e1900000000000000", "service": "00000000000000000000ffffa1814078", "pubKeyOperator": "189484281e47280822485760df6e5109296f6b74e1f30d0e050556ea3cf43a8ad4218d1e5acdcfe6a75e9a08fde7e0c4", "votingAddress": "2ZG66mxomiZHbfFc2cfmmpXBc4Pf", "isValid": false},{"proRegTxHash": "4ce7d9b828ad80ecfcc763bf67f110003dd768dd3f923b044800824c13ef6eff", "confirmedHash": "5834ca2d6a2507ff808db92999bab17b6ea51eae5256e12a1900000000000000", "service": "00000000000000000000ffff258b0b52", "pubKeyOperator": "9034d1c46b1e7b171eaaf2826d1ff8a4c4d925a5e3013ec7d8d741ee06a33ac682b010e425d07bb15fe7d9d951e3e5cb", "votingAddress": "3WtnXMPQuSmwmAn4FmiQFrcWTd7z", "isValid": true},{"proRegTxHash": "2756cac97eae03d3088b0537fb46ba154acc09390306f7156ad2b8947358e1a7", "confirmedHash": "24a2f21ecabb472f0affe870eb8d345a5df1819c198b0ec30400000000000000", "service": "00000000000000000000ffff55d1f238", "pubKeyOperator": "13fd0f80c39ea8bc50ec6cf90a431e08e7b3254674f1396bfc20b91053baa7670e8bcd20a308956e7b6d5e122f26e472", "votingAddress": "8Xyx983pdGWQ4RbpdQo6nt4L7sT", "isValid": false},{"proRegTxHash": "21777b4350a7701d752e99eba8bfa5dd911866f359eb983191174632ab176372", "confirmedHash": "5712585b659d56786a36e92fd75e5b40c0713062bed3fd730c00000000000000", "service": "00000000000000000000ffffbca63f3a", "pubKeyOperator": "194d16858f84ac09bfe6c66f37ca42d5ceaa25b24b9938cbbeafa96e5799336ccc5011f7a2279345e75a974a6b9e27a8", "votingAddress": "L4AStWrc7FTY1as9eY9W6iYaJ6m", "isValid": false},{"proRegTxHash": "0ba81865a8c55a3f6e3acc212cf0e1435b9cceff056e3cbdb5b480df4869c0da", "confirmedHash": "45aee12dfc011937a96163ece045e9183243700ded54be610400000000000000", "service": "00000000000000000000ffff8bb4d459", "pubKeyOperator": "0aeff4606a736a0fe438c61b0c5cbcbd6728738f6fe8a36751a2bb43c936ececdf5daec86d043b1aa25ac577b48cd9b3", "votingAddress": "2KVig5ha4Xu1pGAm7GQ9CtCzxN1w", "isValid": true},{"proRegTxHash": "6d64a112b210e859213e3a38340e1c2d061afdc4ba6c1aee724ecee035e1f848", "confirmedHash": "9ae261172387333462a7fcd93cbd61d91dae8ab426ec6e8b0d00000000000000", "service": "00000000000000000000ffffb23eba17", "pubKeyOperator": "0dfee4b7d411b998155923ea5eedbace2c85d2d4a7088b6b2ddcd722a2d9eddc11133c2ec87ff89d46d3607a27dc9a88", "votingAddress": "4U7opxxkKifgRWLnanqMrDkVzr6Y", "isValid": true},{"proRegTxHash": "aa4c16d1ca94becb9a698a6ac29b863692c961df9f63f899c1fe53a2d33b5ab4", "confirmedHash": "34e19b60aca9eb0e7815503de513ea081442c6fa6415823b0600000000000000", "service": "00000000000000000000ffffbc28b6c9", "pubKeyOperator": "893f790d4fd99bcb6381419934a918ab7ec9c20183da200a336cfe2c5dcefc8148fdbe9581002a1beede9a24e265da30", "votingAddress": "KvXE6bTXx3RqVPbxLeSC7b2yJkU", "isValid": true},{"proRegTxHash": "f6ee68d60fa691506891371f26a4583cb4bcc7e7b7a66f35c45422adbf9e2227", "confirmedHash": "69818d0c82980ac690c2d399445c5833a9b617f73ad0a38e0900000000000000", "service": "00000000000000000000ffffbc2815e1", "pubKeyOperator": "9602c47d1581e4e45dcd95beee88249dc3f5b19a5df67490043e0161864d22dfd409bf503443b6beb5f893c630450b00", "votingAddress": "2n1poe6YTTsTQwMftFSFujy483z9", "isValid": true},{"proRegTxHash": "99aab0611cc5286b8ee6f141949b1407942a5446093a6542d177b699fc82a239", "confirmedHash": "a1e6a81c221aed68d0e640d6581eb47941aef0a4afbbaca63100000000000000", "service": "00000000000000000000ffff52d3197c", "pubKeyOperator": "83a8e612ccd3c4cf7554ba4c9e5090c9a15a4ff70b9a8cc742745891071e30904b171f59ee473fc1104483229453c659", "votingAddress": "3GYSL1fSYKSbm4VTjxKbjCv12p4", "isValid": true},{"proRegTxHash": "7674c189fc22da827677b965326a5e4aa8bd7336fb08ef15a432e8c97da1c30c", "confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", "service": "00000000000000000000ffff453d6bf9", "pubKeyOperator": "18ea2d3b6f64ea54e10f24dbf56df0615e4264d870afd4aaed6579e48ab53b00a3419e4dda48decee8ce04fc9628f72f", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "b26d891389cbda5871e45ff987815c375c3275ad3ede272654596cd29a0f4ca2", "confirmedHash": "194f1f7afb2162e282d7fff31e5b1cef3f82eb1c03944ca50a00000000000000", "service": "00000000000000000000ffffb009d201", "pubKeyOperator": "8573bf0bbf0d372ab6a2d8e88ca7b0f3008be8b77ba30e86610ca19ef7718a5f31e1a7d1e07ad41697594cdaadcfbead", "votingAddress": "p1Pe7vzyUX94NmxJxwhVoXdaasQ", "isValid": true},{"proRegTxHash": "e2c6fb3f8cd42d2acfb58b3f198047d12b9be166d9059e1747a1d3e674aefe85", "confirmedHash": "5ed2b9822cf25ae908f964aab669c638faaa6d80875a7ab22900000000000000", "service": "00000000000000000000ffff6c3db34c", "pubKeyOperator": "05ac3e0e26eb52d86f1f033026689a39639ee24d4cc1737f66a5aa9b57d4c9216136475d93204b3e4189ffd733921881", "votingAddress": "2mgCLZeuW1LkXYgGMj1ioA23YuSR", "isValid": true},{"proRegTxHash": "df9f9e2458bb8920c33f121b855ad7f18cb244e4563fd59b746e251f6eec3328", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6d9a8", "pubKeyOperator": "8dbc5b95cac2f4c293ff3de5da731c88bb8081faa856e751d508253381ab3447b864822edfb8625db74a883219bf4e33", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "a8898d0dbde9d8d7f2cbe091d859cc144d5453aa9b07890498854d71854e7d77", "confirmedHash": "48596f1a3aa00732ef463f857e58c8eb19c6519bd9a1cf1a2c00000000000000", "service": "00000000000000000000ffff951c7066", "pubKeyOperator": "0955d7333857d203addcd8ef15ef9660177eb29bee1b1357e3926c1a0b6a100fe9ada7d7f2820adf2800e0d11750d55b", "votingAddress": "3Enmb19vf4dffhKHKxqiSsk5bgms", "isValid": true},{"proRegTxHash": "32b62aa16f1695eb8af3b57f0786b76dc1efb7b3f1b6452f704b34d326f29532", "confirmedHash": "3ecbed5f482966008c86d316d6cd7f1bcbdf7ce2c93b0dab0300000000000000", "service": "00000000000000000000ffffb07b39c4", "pubKeyOperator": "8b815ea7d6d2b4ff03825529ff16afdfaa5a7c1796cfa565552f4b608e3db8a9537e5c8c973779a6834ec3878da1e64d", "votingAddress": "37UMNWTxHFAxq3mKAx8WWF6P6bTm", "isValid": true},{"proRegTxHash": "1268fe8404db5c86687e16993fd841211373de9d519102bf631be0d2af4d73b2", "confirmedHash": "fbf3b6c154e7b7321d577c42999fbd2266c25ef5214085350100000000000000", "service": "00000000000000000000ffff55d1f122", "pubKeyOperator": "00070d689851b893a35593a2c3fa99d0ebbef7595fffa75db4548337bc9f8333141853378c6009584a05a9467dcb8393", "votingAddress": "3RY2JZA35Q9hjvQ7zyJsanpcvATB", "isValid": true},{"proRegTxHash": "f6545196ad4b59123e3c5e7290e922e383a6dbb0aca3c1ed018e2be05734c5e3", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d59a66", "pubKeyOperator": "8ce4fd7ba94f508b87287fa10cc3a2bb5686c477ebf7fef509cedbd9fea43bcd1d34f27db3f38a20dbc5b9b8a3986a2e", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "516dd021e55950640cbebac8e4d76a0e3301b058585d68e3ce4dd896362c0254", "confirmedHash": "83fc51b2c593a1659161bafc65098629e7e8c9e044fa6b0a0800000000000000", "service": "00000000000000000000ffff87b56cea", "pubKeyOperator": "08873848ec595afc2f468792fdc757a299efd8158697a39740486cde19f6a893c4ec7096f43927349ffb22a5e75855b7", "votingAddress": "3qMG2KkdTNxgmCa7UrhKzd9b5m5P", "isValid": true},{"proRegTxHash": "0a3473c00fd271c6695ea48cef73552b30ea380022eb7ef0eec1cea1569c4cc6", "confirmedHash": "b1ac7cc05018b4c8a6c8529fea3ab3037b868d961adb7f932400000000000000", "service": "00000000000000000000ffffa5e8a978", "pubKeyOperator": "04092098a289effed7012d77de7fd8d807be3a0fadc3aca90e3904e985800e9b19f1c9123a3467b96dcbd11dd9b66c7e", "votingAddress": "1gKvrLEYVxwJ2S6ujQn4GgGYYCu", "isValid": true},{"proRegTxHash": "85940b96521e85267424a3ff1b5938808162b0eaaca71301351942b88d95def0", "confirmedHash": "cbd76d65ade9965ad92931a5e14f60a5c102fb56aba0f20c0500000000000000", "service": "00000000000000000000ffff6deb4573", "pubKeyOperator": "8d69cab32f3c8224d716a09eaf1d0c8f7b8fd130dab3be728ddc925516789c2f545da14224f07ba845e4876262ea0580", "votingAddress": "27ZY4EvJbJuC3QzEXVyTd8aFhQWh", "isValid": true},{"proRegTxHash": "124d7c03778e01d17ba0845b84f5591a934e072e94792b7c5c756778748529e7", "confirmedHash": "4e31698f857b0be336ce787db3c6c7b50e41fcb444d1cb8e1c00000000000000", "service": "00000000000000000000ffff9fcbc8fd", "pubKeyOperator": "17778641dc419de6e1d9c85dcaed2ded3e547e1c25f6837fd2dc98c3e14711e9e4432f45b3b49e5cad4688f445a125e6", "votingAddress": "Cs4rERDmEY493cyE38Ep4kYqJsw", "isValid": false},{"proRegTxHash": "0cc1eafe2e31fbcb2a37af0850dcf10eea62a8cde0a03a8a2deed1a190cd9838", "confirmedHash": "6f29f54edc221e2d49e9fea2f2972ea898a7e859860223101200000000000000", "service": "00000000000000000000ffff86d1c554", "pubKeyOperator": "9638f67ff2a81f60c2d600cc5a7c84c3ecf4472a7a91604dfc4f9e7cf86d04f0d074ef4bd6cfdc7e71138d94ddf35d91", "votingAddress": "3BVuH47RcR2brkJGMwJt1VGt8Tq3", "isValid": true},{"proRegTxHash": "b9603155041389e7a80c976ad9baa15ea0162127060de14a8a29ae74d6b523cd", "confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", "service": "00000000000000000000ffff87b558c9", "pubKeyOperator": "955a2d40978cc548863ad4f57d772690686e9799c46c4166e78d8536d633f709acb27661024d38ec0efa620699e476f2", "votingAddress": "2aLk5ytrLRrD9UxtWoRRoCHx8Bed", "isValid": false},{"proRegTxHash": "ae9c2cd9a999a2752380a8760a4798004f4b7ce417aec3c9d85918bc24ff8904", "confirmedHash": "f02053715b362716e051ba6dee3c67716386f84b40b210910400000000000000", "service": "00000000000000000000ffff175385c4", "pubKeyOperator": "92087bfea2b65b808c9c070733dc06b32142669cd2164bd51e6afb016e919ab4cf92a6a1fe058063bfbeeec29b72c7fb", "votingAddress": "3QyQagR5TqmuK31nfJPDtG4eWrJv", "isValid": true},{"proRegTxHash": "5a9cdda6be215601f63723d1ce7953d70c00b5da8361d2175e95efeda7480325", "confirmedHash": "dac897742e89bdb8da293f1ce6536b3af38702ba8fbac6d20d00000000000000", "service": "00000000000000000000ffff175c1e6a", "pubKeyOperator": "1515a96c5c683a70e816a281c551563534bb530b8696909e57b62a5811f6a0d7663cb5f9f6489ff712ddc199735f6e41", "votingAddress": "2EfSm8Aspg5BwtfjwxVSmUX7eXfR", "isValid": true},{"proRegTxHash": "c7e3e5b98fc775986a31eb0fa4c010502245b798628ee36073aeb2cd36c4af87", "confirmedHash": "abf4fc8ba0d4d2713c316b981351e29e0c75bbde504b4d4f0e00000000000000", "service": "00000000000000000000ffff3449b676", "pubKeyOperator": "119ad50b870527b7bb063fdf1ff5c59e93045d951d7dc67574762901455ec12523510732b79201d177b1519ffd9e5a42", "votingAddress": "3b2sP651NgLVivy2WTwodZy2d2V5", "isValid": true},{"proRegTxHash": "c4729e854a887453a97c2152ffdb38f4d4b5285792281fc09dccb9ebd90ef1c4", "confirmedHash": "4a5df15417aa299a7c4b88dde0dca1cc21c634b56473f3321400000000000000", "service": "00000000000000000000ffffbca605b3", "pubKeyOperator": "0b11359c950e99239880598b0c68843085ac409ddbc7699244412c4e7d29a2d5e793ea1182943c5d2740b75b3098d662", "votingAddress": "3DgYcbiE7EdhswG9f14hhrT4CBTT", "isValid": true},{"proRegTxHash": "e052bd95e31c9596d2b431dfebb89fab1ebc0a70d499413f7b129c2aaf5a5bc7", "confirmedHash": "79be1ac86a7432a51fcca6b157caef62826877ae21f0143b3000000000000000", "service": "00000000000000000000ffff6883a077", "pubKeyOperator": "0416ef5bc840ee36ee786fa6194edb5ae0c34dd97d024b89e48a55c3438af59d47f560147ee206e71cfbb5db16e1e4e6", "votingAddress": "46o31yQX6GLrH4472zaEsFKJU6GV", "isValid": true},{"proRegTxHash": "53f455729912ddcfc1aa65945df64ee03838b5067243b0a85922a7e485ca5fa5", "confirmedHash": "9b69f17244d21881d47dfc9dde03b5c7edfb25042bb5a8950000000000000000", "service": "00000000000000000000ffffbc28be30", "pubKeyOperator": "080edda84b2967075cb549ee9ba38005cf80a6123f2d5f058d2662b4335842fe3e908adba367e1b2c61e1bdc858438d3", "votingAddress": "47hhM7x4i3vr72wPJ2TWFYLvkPxm", "isValid": true},{"proRegTxHash": "2f7076617993d1405feaaf73da954bb5e20faeb4ca25217557b579d64667dbcd", "confirmedHash": "dd4e4c655d4cd47fcf67002a8a021624bc01e9244c5422372c00000000000000", "service": "00000000000000000000ffff3625c7e2", "pubKeyOperator": "94229e3fb5fee9e2e7e53d0d96b0c40e77e1a1598a87b91b90444a699b71b6a8e425b54f05927f8ad2086765f681ff5f", "votingAddress": "3Gct4DYqmMVAzWivwQ5o4JLD37fo", "isValid": true},{"proRegTxHash": "a3d57d21c5de112681f0d305617fe79e179bc1d2aa330e3902e44e6b476ea884", "confirmedHash": "4b80f79bd5adacc9894c5e62fc8a2c41f2e4a92afb3e3d5a1200000000000000", "service": "00000000000000000000ffff88f3738c", "pubKeyOperator": "91a35bdd9e4eb9179194d4de456723e6caaa4d477f512910fc92621ce7f6f9e328ac7836be3c4de558f734676dc52c4b", "votingAddress": "qQYshRKwApZicYEt8ppzz17VaFu", "isValid": true},{"proRegTxHash": "a44065e7ca7e0a9f2cc3d075266b7b34be1c409c731c7210bd1dc093d05e9296", "confirmedHash": "e689aeac898e471003c4315a8c32bf22a00211e3afd7e8820100000000000000", "service": "00000000000000000000ffff4ddcd4b3", "pubKeyOperator": "041ec20475b5b05163339c1aa87e9e43196246b13cbd91f3bf032414d37b38106452d0a7d866ccfb92d3c1fc0034ad56", "votingAddress": "3VkEkbrNgDeudhH66gVadqkrVo6N", "isValid": true},{"proRegTxHash": "2d6955b834ed83ca61dfd0cb70d0494b3bfd0bfe088d9ef4e009c67b15cb4d8b", "confirmedHash": "29ced6e37b3d18639a203801e9a0cb5b4d0255de544a779b3800000000000000", "service": "00000000000000000000ffff258b0844", "pubKeyOperator": "85e0d5cc7ebbb159f4b0cdc6592868c1548246886c1d0155d66f24f232c8c85fe434f616734998615efa76d12101ea6d", "votingAddress": "2udLZmnhy8HGDTwZcKtpawVMWTm8", "isValid": true},{"proRegTxHash": "0b4ca0cc6dec6f77146e9cfddcc04960967010e92f55a97593e4eae6c6020b8a", "confirmedHash": "a0c5fc8359622587ee670c2f4ee673fb44aff2950ac5bb811800000000000000", "service": "00000000000000000000ffff55d1f260", "pubKeyOperator": "90083414abbc414ecd6f269999720dda713a9ca8276e2fa6d8d1be226481272be2fbb681831f46a98c9db981771a3e1a", "votingAddress": "44HPHkR9feGUrMsNAVDCBGYerXEy", "isValid": false},{"proRegTxHash": "2106ebe16b10b1e76a9c60dee10b015f534bd14da3a82732619a222d8995b857", "confirmedHash": "c3ccd1c09eb4531a593cab057a4f09567b66c758d4106dfd0800000000000000", "service": "00000000000000000000ffffbc28fbde", "pubKeyOperator": "1615684fa3034e540f0dfe5e3c27385f088fbf5d6aca097db89354614176e70449f6d0d425c3a04344c25a800b03e482", "votingAddress": "21XEzjnHS8JqsnpXAk9XKYfZtjJ", "isValid": true},{"proRegTxHash": "34066d3345f94301a533209cdc76606fac210526ca696c8a3874f2f05a95441b", "confirmedHash": "c9ba311c95a8e32e0c914c394dcc18673fa01cb5f0c399641b00000000000000", "service": "00000000000000000000ffff951cce2b", "pubKeyOperator": "0396f9ebb9a42a6af2a5d0f422ea29511c0098a685fe5031b202803d886e54ecd3ad7d0da79faa10a0c56c33cd8d1668", "votingAddress": "4EdosDB7EU4zEDNBRuvt6CC8FeAq", "isValid": true},{"proRegTxHash": "1aadcab6faf2426f9fe3190e4f2743ca203c63bd8b7cfeb6dae1b09165b0ff07", "confirmedHash": "eed6ef72b86d8ab3d17914c8d0bf567432a6747515661d301100000000000000", "service": "00000000000000000000ffff2d4c73f5", "pubKeyOperator": "88eedb890856782b1e7df3a553716a714ce610530c222a4a5ba270cb2f63810a78c3183cd7e5d8008e2281659857467c", "votingAddress": "31RBsPSg4BVFGSrim6HcSRG1PCES", "isValid": true},{"proRegTxHash": "ec07ae843ce2cb4f74074d5b9134f56e23ab24f8a452f21b6a7074a0b2396de3", "confirmedHash": "084ea9ff0e548dceaf816ca317fdb65c13f058e8a48ebaba0f00000000000000", "service": "00000000000000000000ffffbc2815f6", "pubKeyOperator": "983973552e3bfd4c3ac7f95ed310cb58b0e73127fa9f01a3c49399c4f99bb3f58cdb7792e0eb7c38f3ecf84c08ff43cc", "votingAddress": "RdHLdEXB2TFoEfMC4Z8SZ2VvqtY", "isValid": true},{"proRegTxHash": "3f8bf158f4e853883cd91e9e8363da8f941c4d02f46648ed0edc5727194fb22e", "confirmedHash": "165f36f304ee8de0dd497b348ec3641380af330c7d0abc022600000000000000", "service": "00000000000000000000ffff2e04a278", "pubKeyOperator": "904f600095419ec53d31f728bb1bf96e5798a4fff823e228e9f99c922b297ac573ae67bffe57d0a35bc6470071ea3a7e", "votingAddress": "2sEvqLe2ntetWYoUFrVvYS5THZY6", "isValid": true},{"proRegTxHash": "27659da5608041e494e578a009fa46d5777e5fa2132fb06ec458ee28afdb7c0c", "confirmedHash": "a85fca9079c952dd736505bcd851a91aad44499894f4f1fe2800000000000000", "service": "00000000000000000000ffff340ea38b", "pubKeyOperator": "07137f495581296910b3a5d589367d7051f9836e8319e8e125e2dc8d1fbfe0cb43447987e21f9466369b61682427eded", "votingAddress": "3RjibPMYUcJPbndKoDX817U3rUe1", "isValid": true},{"proRegTxHash": "c6bf8dcfa5b24bb405f15f9bde8ae9aa364d6668aa52e6e98bd36a4f05d3108b", "confirmedHash": "cb8ca0d926213dc7caef369c925041c695a723f0d8f46ab51000000000000000", "service": "00000000000000000000ffff2e04d9fb", "pubKeyOperator": "83ad1cb271216141b0a66a6db8627c2055f3c8e344d51cdea36bd2dd0bfdec3a80e7cabb3e61163d6067d822b300eba8", "votingAddress": "4DsPCaKGCGCn9XPbYbVxP24ezRix", "isValid": true},{"proRegTxHash": "58f636564c8419d0ba7538aa89013519b2bc2cf87f8b410500037da3f9b2f119", "confirmedHash": "80591cd31e93b0f5a8bef612e9a729f06aec959c121dd1360b00000000000000", "service": "00000000000000000000ffff58630b0f", "pubKeyOperator": "84e5818f69a36f429538f50b5dae83da2315e58532a5130493337b2ba9974b38a630bd7f94c69288cb4fee483393bc48", "votingAddress": "rwG5CZrBjzo4WJmZKAfmaq7H9rg", "isValid": true},{"proRegTxHash": "d46cb80cff7e9a14e181b48b44ec31286436a7707caccf0d55f2f16a623c794c", "confirmedHash": "9c816f737175c6ec7cdbfd27cedfe7d511ff9c63c15bb4320700000000000000", "service": "00000000000000000000ffffb07b39c3", "pubKeyOperator": "1106584da9ceda3220bad41b432099399b94cf3abdf92a9097721691d71d1449b9749833e85f0dc1d032e4a43f0df756", "votingAddress": "4RyGAJUodD8ErQwJNABhhXw5jC77", "isValid": true},{"proRegTxHash": "a7311dd857d17c6233e84f0e6dd81cbb45b007b91bd0f1a18dcaae618f62cdaa", "confirmedHash": "5f912fe95f1bb35834c79cac28821d94cd8598c593ae424b1500000000000000", "service": "00000000000000000000ffff258b0f6f", "pubKeyOperator": "0a91c22e6e084e373f3c2645e1a2d5ccc0ac6c4323e57825ebc97c66e98aba5e3b15ce54f500420289743f3e3f2cc50b", "votingAddress": "2vEC8zwXcUbUGkq5KZcyFBBGWkfu", "isValid": false},{"proRegTxHash": "62506abb2808931423a51a80d36595abe0687e29ba684ba10809b23e87402759", "confirmedHash": "d4d848af90f32f2c8bfbed9b4a386f03e1065a3857f87eb92100000000000000", "service": "00000000000000000000ffff6deb45aa", "pubKeyOperator": "00fd436c07c921e463447b1671c72f2cf0e087c255a66dd9f20ebebcc381f2d593ef069c50b7e817dda34d39842279d8", "votingAddress": "2rkGw6j5iJF1JWafYfzQt4cbpVbd", "isValid": true},{"proRegTxHash": "9ec86c78eaf3900593ebc0afd3c07a63a7b12778ba427825a2c3da137eaa524d", "confirmedHash": "e46907423e8b46cecd8e269521ede064c9e6b7117fbbb9721400000000000000", "service": "00000000000000000000ffff6deb416f", "pubKeyOperator": "8931579cd94f895e85d435d4f3e4fc6c2ee9d3b64b9ff56215340354653303ee272aa794c0737c611930640d79287079", "votingAddress": "2HVy7SzaDEpGqfqoQvDfzo18cimt", "isValid": false},{"proRegTxHash": "a84aceecae90e1ab4bab78ce3add599ba173a3b907a922017c6fe1cce0a3d149", "confirmedHash": "964113d3730b3cf7658af43a89799acb6da4c8a2ebf6e8020000000000000000", "service": "00000000000000000000ffffc2875ee5", "pubKeyOperator": "8fbe9701924454912de9372e576c8ac8766c99cf1189909e84fa532c1b01372f9198c1dbfd37d7febfbf73d320d11991", "votingAddress": "2pThAZAPNRpdKfhnUzF7J1GFK1Ku", "isValid": true},{"proRegTxHash": "6c8c17a2787b15793b9eecbccdc69991dadceac693b0d58a9f51a47abf057447", "confirmedHash": "e17e82f9f7316c3b56df30101d7feef8e8a1f3c1cc622c761000000000000000", "service": "00000000000000000000ffffbc28e70e", "pubKeyOperator": "09813e2f13ab9028effac9a07ac9bddcc2de431941acef67aa68878d95cfba49415b43e20ea76b031a49362219e2cf3b", "votingAddress": "kbC5yAufBXWbsgyrrjcAJmUUDSY", "isValid": true},{"proRegTxHash": "80e847aa0269602f087217300f426da681a374ebe5001b003ebca8115b70c0c8", "confirmedHash": "6f0ad2423f11a9a9d0935956979411cd72434e5e360c4bb63400000000000000", "service": "00000000000000000000ffffb9f372ee", "pubKeyOperator": "8d11628045ed7318932dcda1e7ddd8fcacc87a602f918b51422594cf2597ac9de9144a16904b8a6708f8e3ab453fd3cc", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "266ce8c5477b858ce0a548af2661ab9339629ffc1c98a07679eb6014891f3e3d", "confirmedHash": "8d9bb1b652535b7d9bac62ad5e289c8d3e763d484a988c373200000000000000", "service": "00000000000000000000ffffc2875b4c", "pubKeyOperator": "8e7ebfb9267f353deaf448957bf0878cc4105a91c50c6ad5282daf268e1b9d5a630668ec1e6041a089837ee33656ba95", "votingAddress": "zppvkxLvxq1UYGReapxAVHLZLuf", "isValid": true},{"proRegTxHash": "bf33926046a0567ecf77b66f790c3a8e485d09a403d466c31ab296107a413cd2", "confirmedHash": "5ed4f5fc30e936bcc9c149e0495d75962417f1653c1a2ce71f00000000000000", "service": "00000000000000000000ffff52d3190e", "pubKeyOperator": "015f3d46d905c60ca66f8c305b81426877607eacc79332005545494ea36a74e7500e67b2b70aace555abcffcdfb9eee7", "votingAddress": "GXT2e2EN88UmWf7ZRP4JGqyUFTv", "isValid": true},{"proRegTxHash": "81e60f00d2d50e2df68cf2185ed7a65966387b9bd2fd3b3056ff70e5cde32f9a", "confirmedHash": "9f303cec54a5e460299fc55dfa000c6a25e109f88c95264e0e00000000000000", "service": "00000000000000000000ffff8e5ddb9f", "pubKeyOperator": "855b7cd85793437732071f47c678d891885ecb4d2577b444de28b454ec6ddb4712ba357dc156b57406e0040f44147620", "votingAddress": "33ZFyencK2dKLZRj2P5NkfrhtSxW", "isValid": true},{"proRegTxHash": "7f82a39da53d1a79eafcc17338c20b9a447c494ddee171d3e444a153cb830b81", "confirmedHash": "ff9569df7299cbf1859bc35f8d36d1e34f8c0a3398c637450400000000000000", "service": "00000000000000000000ffff8a449d0f", "pubKeyOperator": "961d9dbbc97357537d6b0007f037903e6c1a9b56b3e9ee79489a14ba65780a783a3964d50fb33a5e5569e487d4552be1", "votingAddress": "4HCUyJ9vt8MExFWN8YuzKYgcuP3V", "isValid": true},{"proRegTxHash": "cf7ea38b4cedfa96d596eec99bfbc789c99479c34002bb83ad8e7460f9327147", "confirmedHash": "6f69270581eae87b3e5240b2357a51e657d56f47c5ab16fd0b00000000000000", "service": "00000000000000000000ffff50d1e3f0", "pubKeyOperator": "0a66e3caae115aa6f6a2869c6ab064e9a0b6a671e16933944fa52819a47fd2ab688958e844f90880e4a21eafb527d60a", "votingAddress": "m3qSiGvaHPJPyCNF7WXyLME1Nyp", "isValid": false},{"proRegTxHash": "e3574bc9b9291a3f1cd662a7dd2539e7023c87aecb950eae3e4abb6297a9565f", "confirmedHash": "ca451792b3a3f0a84e3cb7d581ee42b0a83cd51378d588491300000000000000", "service": "00000000000000000000ffff87b53487", "pubKeyOperator": "0e665985142bcc716a3b0969cb7ef937eb3db29e83e3dc98ab3a4bd4451e72a5d555e38a5621c9a3528307c68b667c97", "votingAddress": "386izay1rjkTfceoLNcRPSiiM1yX", "isValid": true},{"proRegTxHash": "0f8fa2c71c1cf9dac3487a109e846547a8740a7952ae707a16f25d4998712f64", "confirmedHash": "e79bdb8d253c9235dcc313e7413c5b6c5fc4838ac3adc4891c00000000000000", "service": "00000000000000000000ffff36d5824d", "pubKeyOperator": "99fb490d639cd5075fced46b1c84dfb0a6da40d14c6cd7cbfd84ed553f5d37f2501c1edd438aaeb1b1a3b4b3f7bb9424", "votingAddress": "3BXihP3rkjomVQ91c4ZuY9rPkRp9", "isValid": true},{"proRegTxHash": "0f2320a45a6912bbfc1b7b7cc2232a67be361b00df3cde064e1b2471ea962b24", "confirmedHash": "db62cc78db294caf8be3132fe96d3bc2c195091d8066d8d81200000000000000", "service": "00000000000000000000ffff95f83675", "pubKeyOperator": "8970172905368d1cb8443df6f5eeabcf5a9dab77f6c069067cd42e6fbaaa9ed5d1fa4d3a38ed199df44903b9e37efda5", "votingAddress": "3k7seQEtSW49zdPbg1qMDkWTDD5o", "isValid": true},{"proRegTxHash": "f2a43c9feb8f2589b39581daf04f023b2dc8b352a04f142c600cbc84a22ea8d8", "confirmedHash": "80f6ed208a88c29718f0fc157cce94c95ce6df42291b7b2b1700000000000000", "service": "00000000000000000000ffffd4186bd5", "pubKeyOperator": "85aa8746efc8856389631763fc0db0e00a174408986bc156e0cc724a231aba24d3e8136e360137189b55f90f3e0c239a", "votingAddress": "3RWrSigF5xscF8LFJdKrTThDLsYg", "isValid": true},{"proRegTxHash": "e12a2524b8f213f14238804d48902dd836812e7600040fe7c9d46ee7a85db01e", "confirmedHash": "0ae923366fa1812f377bf9649b6e8c644782c354494480090c00000000000000", "service": "00000000000000000000ffffb23eb7b7", "pubKeyOperator": "8c4dc56ad1bd61e55b7006548a8a7762e6228069c70e1f35c560854be2b6724c9fb29f0d0416af18c3e7a99a761aede0", "votingAddress": "Duf8BWwqxMWBe4G9NDWaYpXGSdt", "isValid": true},{"proRegTxHash": "ed4cc165d484cc63465822e9962e6a351c4e7933a9356580de571a07e4688c28", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b017", "pubKeyOperator": "18627aac9de77e3657fc72b08da421660e9bda8e1ab315c9c416bc1824c131fe9ddd4d2401739aaa318b31fd88aacced", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "82d3e3d2fd7143e186d2438ea8c7dd6bfabffac5369e9cc6a1b24e4816c36e46", "confirmedHash": "58ea1663a064fa5f1dd20ae159cabc3d7956ff6daebc00c80400000000000000", "service": "00000000000000000000ffff339ea9ed", "pubKeyOperator": "0f7fda2aa1f2abf90551503e5f292d594fa8a31e0840286b345f181dcf4c5693ddad3c48cb8a6dce6fa6c6d11aaae89b", "votingAddress": "zi8yU6p5SH6WFHpUozgC3jUWo3x", "isValid": true},{"proRegTxHash": "bcef6b51a492d2a28a8be87bc096cbdf164cddf53cf427ba3dc40abf657969fc", "confirmedHash": "9d57c789aff42463501d4629cd39a5ec9922be676a86504f1400000000000000", "service": "00000000000000000000ffffa8778728", "pubKeyOperator": "854df9ddf356ee56e2ca089175afab8d223f9177ac8268fee8ac1f328ac620e64479a05bff6bf4c160f9e8c4a404d8e7", "votingAddress": "3gjmHbopSyZCGZenxEtqqzXPCN9S", "isValid": true},{"proRegTxHash": "1d20ab8c31de6039867cc8f253cf3fbf8c5050d8947766da864892f06c5960f1", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0dc", "pubKeyOperator": "1408e5737f04d6c4c31d8aae1e25b9da31d1d7ee97d615534d10bdb721109e579a423e74c8fb054b393b07dfe2f8561a", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "7aeb7e770a2b788754bfd0b92e98ea394aae26620b46233955d5c5899a191db7", "confirmedHash": "54687245820d86ad38f571c8d41bf578a640e20550a8a14c0200000000000000", "service": "00000000000000000000ffff52d315e5", "pubKeyOperator": "8be9b7504bb89ad6530a25478f0310027e3f5bd8f62ecabbd725458f5352f6050bb2038ceada3346eab15227bd3a6e43", "votingAddress": "41GN4LTnxRefgHBqpEdfWyzQoPiD", "isValid": true},{"proRegTxHash": "0fa3eea42503c1b9ca7edf51d4179f15183a66da49bd500f33e5289109118b0e", "confirmedHash": "e5a9e5c645a067ea29c0c6c411c40c565be8659f1631864f0f00000000000000", "service": "00000000000000000000ffffbc28b6c6", "pubKeyOperator": "894e7d16e29ad44b63e2d3666b5f5efa99183fda85518c28fefbbbac8488e8c2d6b4c3cf55caf8cc45dbc5ad9c40783e", "votingAddress": "2j7JmAhkyrLifFSywZ2FeuAUao4L", "isValid": true},{"proRegTxHash": "84f24719682c088064b6f44d463b46d0fffd267909d39b1a88fbfa92809c6a64", "confirmedHash": "f7c76c969ef5cca2713baf6acd2857724489cbfebd086f393400000000000000", "service": "00000000000000000000ffffc6d3777e", "pubKeyOperator": "1491de9f4e77a225d735a0d479b7d76c58c3e5f08a33f0fc0565f7823c9d548d1cebffea5139272f70c49f8f8bc1ce2c", "votingAddress": "3DPcrrYLfrAaJB11ddCP82qYwWiE", "isValid": true},{"proRegTxHash": "d10d39bb6e78b384f8c73f8b773e210cf6f5dc885b9be366c383e35d6151b89b", "confirmedHash": "a575c47df45f33e3d0cf9912cac9a6b0a54ecb3941b949f00e00000000000000", "service": "00000000000000000000ffff369890c6", "pubKeyOperator": "179052b822871dc0e88598f889ce5e6210b8202713c551801d9b425c67307306d5eac44911e8d58c695f8798e58b9d75", "votingAddress": "BeU1ZtWyVfm7bdf5zxsrN9qfXtq", "isValid": true},{"proRegTxHash": "5a61f1722ba484b4dc70101bd1aeecb235c63d228cfc217034229353e6cff125", "confirmedHash": "5ed2b9822cf25ae908f964aab669c638faaa6d80875a7ab22900000000000000", "service": "00000000000000000000ffff951cc616", "pubKeyOperator": "11dff5b9236fdda7b03b90f2498a4094e855c835f6d9461bcdd17d0a702f70c2a40f688e8259733353192499d2d22c86", "votingAddress": "3AVpGf2BxwYxjWNTBS2fTASGiPch", "isValid": true},{"proRegTxHash": "7151a3c5a11b3ef4cf2bf3a11f22d70dcd042fcec936d0c891df45e10e608c13", "confirmedHash": "6a716502551de56690db3d6cfaee25b3a441c52c948035f30700000000000000", "service": "00000000000000000000ffff867a54f3", "pubKeyOperator": "84d23a8cb80ea76901a3386537d605042c599645842ff97ca86ca764421ab76d261b24d5326edb739d98cb5b45409eef", "votingAddress": "5DrJVbwjtcHpyDDPb1TnraU58rb", "isValid": true},{"proRegTxHash": "a516df3b8e39c5189ea4f15e6931a9e0875b2e334076767bff86daf74a79cdbf", "confirmedHash": "e5332b21aba9e4ee0c4cfb77b86ef34ccb48b0b03571213d2000000000000000", "service": "00000000000000000000ffff0358f3c0", "pubKeyOperator": "18a8368bbe54b5dcbc8c7e05646d62880716e8e8175b0bc31bafd7318fb28cec489ed6fd73b984cc4f4235e85363a1be", "votingAddress": "2K9jQ2nVHdaE7qTbDQNDadNYpRQx", "isValid": true},{"proRegTxHash": "88df84aea98de080fc557884db57ff1f4be303ec35e6d210fae7ae3d44dddfab", "confirmedHash": "9bfa9a03e826cc43582482c443d0cc686f2a867793233c981100000000000000", "service": "00000000000000000000ffff2d4cea93", "pubKeyOperator": "860413b84c02b5bfd97f44a2737dc4bd20404614d74e63da02d3dd91fd211d7c5b4ffc9caa23b277b53b96ec50bd7ff7", "votingAddress": "3KKj1UNAztFdLwttyXcqT9BhsYSM", "isValid": true},{"proRegTxHash": "bd4fdb6783036a67084b37802f7275d7d61e2a2c0fd8392ecd7ca8a21533674f", "confirmedHash": "40155ff704d511d70f5b8b3c907ec547acf8365a719edc681a00000000000000", "service": "00000000000000000000ffff55d1f182", "pubKeyOperator": "0cf23d45e299cfc73c9ee3bb79405c7a399e7ba06b0a7b6abe1504f7ad4604380948cd7c553c508207c2f7f26b6a871f", "votingAddress": "K4PU9RwgJS4dQZnr4dZ7akHpjAg", "isValid": false},{"proRegTxHash": "9287f33661d953c969c565e815dbc97eecc28fa761e74f62c4a505c4a20232be", "confirmedHash": "1b524c336c98c3672741abf52d9e5b4197a6db9a218d78db0400000000000000", "service": "00000000000000000000ffff52d3150e", "pubKeyOperator": "9788958acdbf8e8b738c055caeb615d1b5ab0be2ec70fbb6537d83b51b2c02954c1879f38c8aed67db9bffb4570f1745", "votingAddress": "38kNGtwVvmAUz1r3d23u7ctaK47J", "isValid": true},{"proRegTxHash": "d18a08abb177673a408fcb200aea9b828805a35e8a8330e065ee1e3ec0fa4162", "confirmedHash": "f8e23de7efa28a7dd264f1a8354f4eedb069231f7d12bcbe0e00000000000000", "service": "00000000000000000000ffff0502493a", "pubKeyOperator": "134dfbd79285df62a29ce2632a477678874b8723030116299f7069d1d8e07108303a2173c3413ae9618ddd5e65eb0cce", "votingAddress": "2gj7gG4uRS172WihJTVWo5TQWgFH", "isValid": true},{"proRegTxHash": "87692b1421f0992d18bad8d7027b859cf62a37f0d6fdb55ddee1395fbdba80f8", "confirmedHash": "9e62127bf7a53d467c9a96f4971d196a57363e948c964b380b00000000000000", "service": "00000000000000000000ffff0509ed23", "pubKeyOperator": "8e43583115f280f6d167fd0f6d41605c8d6c80d0a5fb38b642bb281f8d4459a8bf2886f384c634d8bc944e8844098837", "votingAddress": "fCuQZZmAYjDhrtfbBjighhGJ1kR", "isValid": true},{"proRegTxHash": "b2e9e6ec81075f4f4b02ce8016a7b590c70ae83140be8d1a8f0f5ee8fe3c7a51", "confirmedHash": "c8d52e6e30df9133d3197c5154298f09f202bec2258704ab0f00000000000000", "service": "00000000000000000000ffff2e04a26e", "pubKeyOperator": "815fea036e6bc60ae2fe0b447efbd8720b562bdb29312add8aac4d47380f80aaf1050f7fd0bc7d9711787b29301fb034", "votingAddress": "2ATyDsVdrZtpbjEUeqtLzB59U5wD", "isValid": true},{"proRegTxHash": "bd1410b8e43cecdbe9afea54481a2f32325c999dcd2d881db4ebf36dd20400ca", "confirmedHash": "da78ec582892813874575e00b6bb3ae986d685a88e06ad301600000000000000", "service": "00000000000000000000ffff12766e43", "pubKeyOperator": "102bbc0bab9a3d62aaf7394db1d7bfef244dc7c4ab5d5352397422b3b100065515a8d9bd10bff881ecba0c100bf148ef", "votingAddress": "2KuFy1PFJYKeNoQBrhRpxhJpNiFC", "isValid": false},{"proRegTxHash": "ccbd670e85dd338a5a50f91116924d317d2c7f1696f6543e023e790de590a9b2", "confirmedHash": "54e94e5a6b2b19d4a0fb500e3fee1ec61713e0c4e96e629b0c00000000000000", "service": "00000000000000000000ffff03d0b72d", "pubKeyOperator": "8ddc7592a0faa7e37e8fd48cc02ae543f5cd796be26a87b8aafdd6f3e8f9e974c08646f52e2d2800883f35e48e65c0e2", "votingAddress": "25xXoQ4eUbhgRZYRPWngKqPB9Jw7", "isValid": true},{"proRegTxHash": "601ecf6a5064f03bc582fff987bf73a52bb96815df4cfce33ee578a3fb081c14", "confirmedHash": "388eb10960de2a54a47b11141e82f9e9884d8f08d7223d2b0500000000000000", "service": "00000000000000000000ffff4114704c", "pubKeyOperator": "975c9882d26ef179281a19411410dc7132b2feaae08d46d26865ec58fe1fdd10ab4de0de8b2bfee486c77e3fa3224112", "votingAddress": "3t1cT21jQW6WQ5YufhpKgjp4WTos", "isValid": true},{"proRegTxHash": "04fe8b85a65b69501aa6cfddcb9df9d3cef6be01011c3095fa0758ec66936214", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6dd87", "pubKeyOperator": "849faca1f36b6a3eecf204bfd95785d6cedcf617eee22e75b23de5b3ddf9dc9a7a742604eb23472f84dff13bd019fc88", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "512442df6ed8eabb6f7d972f6a19626d33787c0a9161caef80dfa663d6711650", "confirmedHash": "f11c91c84a4f57d758a21410022090f0c4a0995d93015bee0b00000000000000", "service": "00000000000000000000ffff87b50fee", "pubKeyOperator": "92baba2876e4bc6a6f34356ff5741a5ada3decb3ce973ed265aa419b625a6d3389fdbccd0bf9940d7e9344a9d1a10320", "votingAddress": "4AvTVf29wUSsfwirBUtaY9Bb9WCX", "isValid": true},{"proRegTxHash": "fb5c464785fcb03bcb277013a39ee2aa8ccfa80c9dbff3468d18b68ed8c7f792", "confirmedHash": "a4d0727acfe54988331804b5612cc489f5edc8823a6d2e420b00000000000000", "service": "00000000000000000000ffffa516483a", "pubKeyOperator": "90342bc7230108ded7d0c9ca248d2caefe956886584f53e8e98e4cf5ca56383674846f04c2b10f45f80938e52551d865", "votingAddress": "4WXKHakUWf3HDy7tLygicc4XWNUo", "isValid": false},{"proRegTxHash": "8dd24ff90c049388f448b2d5fa58a131a57e2fdedce2c23dcd6f2fcd17cd12a9", "confirmedHash": "ff3e716db971a24e2d9c6144df5f9b16d66aed3e3cb688780500000000000000", "service": "00000000000000000000ffffbc28af48", "pubKeyOperator": "0c288bb4f232cf6d93f5e9a7739b5c962afcc49ec285f2297c457f7e41146159b94b3cbbb8afccd9637650b638f826b9", "votingAddress": "3p2yHGWyjQ5kgawDRN5pru9r7LCX", "isValid": true},{"proRegTxHash": "e2a82c40b75e18a9f75424ab5f9df2deefffbb47ab6c0f17301b5e8fe80f7424", "confirmedHash": "62395b222f40543aa619c42cb9eb1793a19975bb8277054e0f00000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "EAZCe61a3CBSk8ex3pkqaN4F6fy", "isValid": false},{"proRegTxHash": "ae6df28da8def855fe77f3a22f2f07eda6409cdf008cd13d4b504d9a786bda77", "confirmedHash": "ab1dc6d92a15b9b4d7e748d5d6671b7009f40713967c09930e00000000000000", "service": "00000000000000000000ffff951c100a", "pubKeyOperator": "894f52c9b37249ae3e9bd60d21103a46a03328f0a2954e3245131930794065b57a1744dbd8d5e16fac513d3421538c96", "votingAddress": "4Y6QHjhVF7gcWdQQqjdaHQ4jxkB6", "isValid": true},{"proRegTxHash": "bdf95656dfc80537c9379a688be823cb4580a91a9e7cdfaafb4c071d17b28f6f", "confirmedHash": "d117824eef4155d979434fba3ba7e972dea3e35045fdff972500000000000000", "service": "00000000000000000000ffff2d4df111", "pubKeyOperator": "0b8fa237857f6c5972c6312c2c7472dfa9aa2d289ea9aca623a80476c6f15fa84c6f9b8d736be8ac7ab06a008d496b37", "votingAddress": "2YcTr7MFXTZfGjvube2domBwQF5m", "isValid": true},{"proRegTxHash": "51d95ee508a381a1694ff61100230f89895c8088b679f20ebb1a0412f88d035d", "confirmedHash": "107ad82681c710901106a2880cce2e79ca3032669c3ef1ac0500000000000000", "service": "00000000000000000000ffff823d3425", "pubKeyOperator": "174393687f94dd636460f28288f598dda6930f4065a6e80eaaf600d98fb00842cb67d352652f52ee88ca245eb31ed2e3", "votingAddress": "3pcU6LcgHikSQBLh6B7F7qauSBw5", "isValid": true},{"proRegTxHash": "e24eb6f5bd3039aa8af8a1d17a67cd4ca047b49a70fd34709e29918b312747d8", "confirmedHash": "6da297df3f5b45a1496735a0fc735adcd85f322d778531c00400000000000000", "service": "00000000000000000000ffffd4186a33", "pubKeyOperator": "93ccf65844dd5a459204e80be764061a8ab39ab2ac9a16c11072a5d55a594bde67b18dc0c3acebe1935554aba9b62c46", "votingAddress": "2aHVeUJL6E4H1ZtDdH1NoEsCQhdx", "isValid": true},{"proRegTxHash": "6fc8e88fa90532eb0d4fb7c47847ef7a1a2a84fd6d0e5a8befb6d6b8740b7694", "confirmedHash": "f475109160142b7a3c9e88937ee42dddd0daeaf15eea728c1b00000000000000", "service": "00000000000000000000ffffc3b5d75a", "pubKeyOperator": "13e6578f575c681f159b019fbc7d425f6e9cee2a4bfc98bad504026418d351aec1f0e91a66de53ef8899ab6fb66a1bed", "votingAddress": "2VBe7T9DZpW2xLaFiHz7teUwEAJQ", "isValid": true},{"proRegTxHash": "4f680cc01636847ff9dd45b47d8bee38da109475d9ad1389790d5c993d9e5aed", "confirmedHash": "00c192ccb42a1f5ee3153ec2acf5548a7b734eb373d472560700000000000000", "service": "00000000000000000000ffff55d1f248", "pubKeyOperator": "03be57c6b32e95e22c1af58ea75a11308e812316cac1ad4920a639df5f3e8667deda7f5f179b18aaeeb733f557445688", "votingAddress": "2tTvGaL3bLqLx7ujXtXRcJqzEK9U", "isValid": false},{"proRegTxHash": "e32e07210e91f2d582db709aa82164ff7aa7b8e658744bde0931a800e6022e7e", "confirmedHash": "b7ae2fe1253df4920d1daeafd5c9d1be9359253484f569e30900000000000000", "service": "00000000000000000000ffff5eb0ea6a", "pubKeyOperator": "01ae87b6c776f2dbfcd0b418ee21a5bc36e689191b7a084d89cf3e63fb4ecbfeee3d0494b74be4d842163db75ac5b864", "votingAddress": "2V5RjkBZjo3JX6eQ2iovEk5uscsG", "isValid": true},{"proRegTxHash": "9a44b8dc65a4ecd27eee3bee0746eb0bea0559e6e014354aab1acb553a7f1cec", "confirmedHash": "244ec6b2b9bc7645bccc79e83704e5c5f3a241947e3d12f11000000000000000", "service": "00000000000000000000ffffbc28e70d", "pubKeyOperator": "0a5979049a6c484f931bbdf2dde0a051223d8294c68d4d7323ad09a852a01b40621302381dd3c9d2604ef35733a5456d", "votingAddress": "4BXsacCrKWuw4efs4i4i6NjGLAm6", "isValid": true},{"proRegTxHash": "30aebbd76b2b038027fc3e4344190aac1d1f900d7c49dbfdb145b7c7290be36b", "confirmedHash": "f048bbdcf31239fb1ecf9cae01afd37cc897fc0164ae1e240000000000000000", "service": "00000000000000000000ffffc2875831", "pubKeyOperator": "191e943f6881b1ed7a0f169fbb9a80cedeec0f2c14b66de428bf897e695ee814995aa65fcaaf8b86db30a9f9a3daefe5", "votingAddress": "vUNy757AEqSu9jEd2qrGfVuNEjo", "isValid": true},{"proRegTxHash": "da27bbd66a51ab2053f0aa2b3d18212dac4598159a7ffdcaaf2229a0e489c3a5", "confirmedHash": "7bf7ff15c9ed74d9c04d8dab0148f7fab3c90c5adc24860d1200000000000000", "service": "00000000000000000000ffff55d1f1ed", "pubKeyOperator": "1957f91e6ff7bc3e1434b563ba3824e109a83f590acb5543427a227e91687d7091487ea59b2ac90e748d8bcf1cabe960", "votingAddress": "uYocKadpZTvXtTTsk4nxmkJX9Z9", "isValid": false},{"proRegTxHash": "a52203c7d078f5ad16b79ff3376e2ccf197dc625cf8a6a2d1616f99118c3753d", "confirmedHash": "a635fac4fcc7c553d6cd0669946f0f67c9df69f02882d4d50700000000000000", "service": "00000000000000000000ffffbc28b48b", "pubKeyOperator": "105972c7be3c93d66cb0c6932d85c4aa0761b5c653996761ddafa3732a9ab15cf0edc1441a3248a62ce1ae53832bbfe1", "votingAddress": "LwgTp8SnVMKYEJvKj7eesTJaCXF", "isValid": true},{"proRegTxHash": "1687d0970e383eb51f7a2706f743f4689438114d60993316c96c1d02b89a3880", "confirmedHash": "5b808153a76217309aa43155b072787ff5cbaf145e6074731000000000000000", "service": "00000000000000000000ffffc7f71d6e", "pubKeyOperator": "185adf651c23d0b51170e83494333624d39ef56c3b7fdede54af8b90ee313e23e4790fb4a4e305e590e3d3d17a4c30a8", "votingAddress": "2Yi5u3KJPzX6LACTzyMxuZJeE3j8", "isValid": true},{"proRegTxHash": "cd831227bc7704cd9f302bb71144e3854ca6c6918d65bd1334629f80b662b000", "confirmedHash": "5ed4f5fc30e936bcc9c149e0495d75962417f1653c1a2ce71f00000000000000", "service": "00000000000000000000ffff52d31943", "pubKeyOperator": "8dbb1e4f1bbaff1b496157a8f9d5ecf998d88fe5a2a6011bbe59178990efc6fdaac429ac1d090fc7d3879571426aadba", "votingAddress": "4KK2whfSmdkbEgLLbAQ6LGdVmi3G", "isValid": true},{"proRegTxHash": "eb9d1e8c9bc8c5d6d5ff79da56bfa6fe4caef9b7223fae346c5d51f0d664167a", "confirmedHash": "ab5d8290124e5fca0fd048c8ca1f4feb4772cefae8feae0c0b00000000000000", "service": "00000000000000000000ffff55d1f287", "pubKeyOperator": "8d778120232cac1ce92d7fcd4d44ce21b07a98a38fc8bb8c8213c37889d9c2aeef6fa9ad9a42d340e0d3f8098e00e674", "votingAddress": "3GiR7a1pXpQECyrYeGm3MJsnf6YV", "isValid": false},{"proRegTxHash": "914f2825db0c6e35c7377972c61594415b70b3fa069d590e2aaa6fc05256ea9b", "confirmedHash": "2f0a2f4489bd8c74b6b070e2bafbb25ee4aeac61ebccc66f1a00000000000000", "service": "00000000000000000000ffff52d31543", "pubKeyOperator": "9923ff9ed880d9f6dea24b461c07d99bbe24f9cc9fa51c0832ecc4b6364c05edf719b45c0cf382ac7f5cdb629506015d", "votingAddress": "41MKvyv1QXnu7vTHQP2z2xTUB6x6", "isValid": true},{"proRegTxHash": "958358e75278fe514c86658f6f942bffe06d6ffbabf954d84ad4f9835529c03d", "confirmedHash": "6a5e15a6654babe6fea0a9fc4bd0b704b270dbfd80a776e90e00000000000000", "service": "00000000000000000000ffffb0df8cfa", "pubKeyOperator": "163ac973265a9226eee0b4f98c227c9fcb59dac9a594a8a3e793afd9b8c0f274f82307bad941babd90daaea2208d66e2", "votingAddress": "8jhyoB7P5roUvxWYMQBK26C1uxp", "isValid": false},{"proRegTxHash": "88bb5bcff1522a07c2ae5da947d553f6e5bec7c585372e1f687890fec346f79c", "confirmedHash": "fcc658c152d3947275907da046e4d043128e97563be506140200000000000000", "service": "00000000000000000000ffff88f31dde", "pubKeyOperator": "9520ec505eedb8884406ef7c9e664206081397d247cccad8815ef002ff9ea141332870b6d9ecefa3ca0360cb06c11cc4", "votingAddress": "9xdY8jsBWCMTgxmtPRRfpnhQ1ks", "isValid": true},{"proRegTxHash": "c93f0a89824fc0a0d888e3b7cbbd2b9d6fef20dade7663ddda087cb600b48737", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff84919323", "pubKeyOperator": "1479cf5e10344f95dca53c7a8db9220c2c3e27205fccd392d46de1a45eca6af31f9dbd7215a94368d8d26f2115166dbf", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "1de9a2c4bac1dbf9e9e38406681143167ae755e4681ea7bac0b4e94f1e865d44", "confirmedHash": "297a0950a76db5e0e361b471e3f7b5f411af0cebbb1fd8af1000000000000000", "service": "00000000000000000000ffff6ca083c0", "pubKeyOperator": "8b8dcf64dddb0338bca3d6fc483d15ce4a5353ebb7cdcaaa5ba50d762e9c1a3dca6ae5dd323f2389f454c6016a431c79", "votingAddress": "i7i3uAmiHYmmtjahAad89rNMREi", "isValid": false},{"proRegTxHash": "4f1ff8c0934b28f61d2d1176244089317f98fd87fea8ceab3fd3ef18d2769992", "confirmedHash": "a29c74fb3479bbcc74497d6602c50921f2f28889b72c7c733a00000000000000", "service": "00000000000000000000ffff52d31961", "pubKeyOperator": "02ab52425100d319bc1b5e1382c4eba074f73f2ae94f6e1713ffd9a0f513b541f44d9a0879f48fdcaf3521ebd3b734e3", "votingAddress": "3k1RaJ6UUDq151UTmGYNseDZTd2M", "isValid": true},{"proRegTxHash": "c2c1d2e68b9870b74bddd064846eec55ce51f90897f9abd496df1edb135aca0e", "confirmedHash": "460f4bfcbd475b87cfffc76e1393f9f00ded622b245402eb1900000000000000", "service": "00000000000000000000ffff3a6ee0a6", "pubKeyOperator": "8fa877e3a3c898d2324b3e4575d63740ff293357cb7c7a9413b217ae64cf8ae1e13aceb54205dff91ef5d3b9746a33d3", "votingAddress": "3SspsPUukP3F6qW3qSYpLSiwvXVd", "isValid": true},{"proRegTxHash": "aa0321a2f9d48bcdfd1e4eea308f7b62380151c1603f95ea4cecd5e5d453ef47", "confirmedHash": "03d1d943a5fdb894f34fe0ab2ff94f05c91bfb9a70b51b5b2900000000000000", "service": "00000000000000000000ffffb951a487", "pubKeyOperator": "16a914b3225dd0205c7bec5678b72bb1fba4dd24b656c5190573e29ff3ea8613cd9c2bc24254aec541a25b7dec324eac", "votingAddress": "2Yo44yGcisx1LXLMh578VNKMPpnk", "isValid": true},{"proRegTxHash": "206f8f12d520769ec471ac030869ab40521002b5edc42699cff5a9a647c87afe", "confirmedHash": "8168b3ad5d59fd1fda68340a2cbaf9d24f6a8cfc01997b5e0400000000000000", "service": "00000000000000000000ffff2d4d253f", "pubKeyOperator": "92d350bbb22a1e63d37e4c4f0c6134aca64cbc05fa6d6eba12a32c613a743e6b63b8933ebc07551b1a9e5be700171233", "votingAddress": "2GnQBv5zUC5qDinmNn63ERYJ4Kso", "isValid": true},{"proRegTxHash": "ba5274b1130a681ea13ca19c873426c5e5fa7d9907e53734662649a4fa56be1a", "confirmedHash": "a1e6a81c221aed68d0e640d6581eb47941aef0a4afbbaca63100000000000000", "service": "00000000000000000000ffff03d73437", "pubKeyOperator": "1596e89064cd632e53869ba34d3011d373ab693152215f35673059317d0c975e2174683082122d74c14ede953f26581d", "votingAddress": "3Pav5WgWwYRQ3GzYqbmzBp5EuZ2a", "isValid": true},{"proRegTxHash": "5d227b2bf7d7aa08f4b12058c5581bade4addf9813b81c781df50b7f2eb65e1f", "confirmedHash": "996c87085136d281a63e9ee527b094f5e7e64282c1db17060f00000000000000", "service": "00000000000000000000ffff2d56a32a", "pubKeyOperator": "166a22563e0a9f5d8486a39c81137e17a64446d1772ce3891ad6f372f86fd46ddf8f6f4eedf38b718414de99ab90d9f9", "votingAddress": "g5dxHC84D5joDh9kBqAtztQQNUR", "isValid": true},{"proRegTxHash": "50ad1da36acf2d271cc0f294a55ec20072ccf7515b0001ff8d1e261e6fcf7ec4", "confirmedHash": "63169833e187bcd91cc974d0644359b0b87c9f3f735e74940400000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "3ZbXkhiWKECUGzSjMfNGzemUyjs3", "isValid": false},{"proRegTxHash": "0b6dac40b15761aaee64c196668a0a6fd37f84519bb9b2e5b8a721f7c4d8bf15", "confirmedHash": "50a4c2e17790cf4b393eb396ba5c55c7f68d3b5a527d3f590f00000000000000", "service": "00000000000000000000ffff52d319a6", "pubKeyOperator": "0bbd97acdd5fe47f71f05b14fa9d885db5095b02f20edf4212eaf69efbd31aaa957c272501dd328293fc892b685fb571", "votingAddress": "mbHR2vhGFnsi9y9Uh2XMToN4q1q", "isValid": true},{"proRegTxHash": "37a1020340494d2e0a791c8ff5b3a20c20ed373a9e923e803cadcdea74fff1b0", "confirmedHash": "9c99f5aa3fedc7e0812d6a7bf8f2a9a4e8f12d20b8a7b4900d00000000000000", "service": "00000000000000000000ffffc6c761df", "pubKeyOperator": "13576ac8c1f35b8d0f89fd3b20f9c72879f465911919aa4eb1ec5d858954f28dfd4d4f40af852c57454e6e9900a4f778", "votingAddress": "2MCe9r8bsusWX7RiUraUjpP5pmX4", "isValid": false},{"proRegTxHash": "05b4588f17e21c5f7847ea4d7947d6df465cadb911ecf0f45c2b4dce65d50ebd", "confirmedHash": "2492ea3b729d90f88b5f842cc4991378f8944e4375a696250000000000000000", "service": "00000000000000000000ffffa8775798", "pubKeyOperator": "0207579c663392f01ee6d367690df6c5a002a1f414e77149119b56e6ef435f00052d5d4a4c7d8b6f882e9e5fe15519f9", "votingAddress": "3EkBWZ2hpTvrASJhHm9LvnhLX8xX", "isValid": true},{"proRegTxHash": "45bd3800df2332aac023b9e6df2c94201db331f874591da18e9ede6970648fb1", "confirmedHash": "8bb58bfae51b6118f60a6dfe609376f24ab9c1fb084a945a0d00000000000000", "service": "00000000000000000000ffffa763fa70", "pubKeyOperator": "860494418667420fe50dc48f68e4bf3bf0fc5267ecb23df80c169cc65b812e0b174e8d86d670be195f1926b4d5666865", "votingAddress": "axeqXG6jC2V7ic2PEJSxv1WaDpv", "isValid": true},{"proRegTxHash": "2fe5eaf41c3339989bb977e977fb3719f0fb5711952f6ed998c007f4ddd82ae1", "confirmedHash": "60d516206b686f4383141d1a541f9b16d5ca4b9037f4cf6e1700000000000000", "service": "00000000000000000000ffffcf9afe2b", "pubKeyOperator": "102ddc9d3ab31f65216693ae969e4a910a7aaab92cb963ebec6842c2d0498cc7505e1a31fd082a660ea3ab09c298f7bc", "votingAddress": "3BSiu9nc3cNc9ADQVbtEiRx18me6", "isValid": false},{"proRegTxHash": "bbaa9a0e4030588612914d40ae88b159e055f595ab45f234000164fe6fc1ebce", "confirmedHash": "60928db5ba3ff8888739bf8915bdd0dea56a47c80119c9812100000000000000", "service": "00000000000000000000ffff4f621b77", "pubKeyOperator": "8bc2eeaee64447c4ab172dcbbab711f34db98f8e9b4fc55a7ad4bb5c8521d7ff671d70196392f9192cca96ea7f47f88f", "votingAddress": "4PS4QsjNownY846t6NZLrUk974mm", "isValid": true},{"proRegTxHash": "64c1b7513030f62c02d2b92dee5d885034e260c35bdfa3bc29d69b8dc04240ee", "confirmedHash": "3469554c8b6b3959b40e342b8e1140db9bade038c473c4af0600000000000000", "service": "00000000000000000000ffff6c3dce08", "pubKeyOperator": "85fe58a69d7c5bd301ea70a1b38c42453cb598d21ec38de63b710c0a136fbbf0a1ce81a2fc0d4b164fa046d126191999", "votingAddress": "2jPYfAgsZcpPnsCj8bhXGfZLxUmh", "isValid": true},{"proRegTxHash": "12523cd97510074c575acbb5bdb2f2151615425f346295adbd0009fbfaa75d8c", "confirmedHash": "50a4c2e17790cf4b393eb396ba5c55c7f68d3b5a527d3f590f00000000000000", "service": "00000000000000000000ffff52d31911", "pubKeyOperator": "0bc60b15bc8666e9a1b8a5810c175d3e10db057b2a679863221434a7cfd0ac59a80a961457fe080a84fb9c988fd278bb", "votingAddress": "3WQVLbYeJNBxdrJeVUMjUwUmqRdB", "isValid": true},{"proRegTxHash": "d61588b08baf444f594c8f004ce68eb4ecfdfe66332eb7a59843b3fa06b384b8", "confirmedHash": "32520b0a55f8a8cc04a0f405da173f0bbd62b28cb0e0fe862300000000000000", "service": "00000000000000000000ffffa7b36f8e", "pubKeyOperator": "90fd360e0eb6a2906a7413200f5315a9effdb9cd1da74e6d8b9bcf9712b176d364d33af2fe10e0f28b3f6c84b48b7e12", "votingAddress": "3K5WWnugpd1QEZd9vfeUnkkvcZXP", "isValid": true},{"proRegTxHash": "6fb450746dc3b05b5878e656c322ac7aad407ac92ded65b7e9c5050fa3948314", "confirmedHash": "97fa3bf9eeae1f90cb53e7f8f7c5eb3d3321a1b53974049b1f00000000000000", "service": "00000000000000000000ffff52d3153e", "pubKeyOperator": "832ecdb7db558ed15faf7c3559a8ef8e8c5592c458a607dc469a48a732ea245790613f48e8c2cc0adaad8ee88037005a", "votingAddress": "ntQ3QEDnJzVHfAGW1tkvvpZbvcv", "isValid": true},{"proRegTxHash": "0666a79aa713ec00eef20bed7427c91adac72134cc16bcc2c5a204fa21556109", "confirmedHash": "b15d9f41a0270b23a153cd181485cff86b6543638f69eddb1700000000000000", "service": "00000000000000000000ffff55d1f16b", "pubKeyOperator": "19d3d2acd66d363faa6429e5ea3d050212e2e52ee443fc13dd0e2b069b37d099cfc5de8afb3f5d3cf1ea25fc78cf78c1", "votingAddress": "3tADu8CK7fWycrHm37RZQm537qjj", "isValid": true},{"proRegTxHash": "d2deb4bb4cd725fe71be4e59f1201844af5203ca19c176d33d14e614f3e77ae5", "confirmedHash": "a72aeb78c333186139bd0f64e428cba2c79c2f489f56dcc30400000000000000", "service": "00000000000000000000ffff9f41189e", "pubKeyOperator": "0c6708f4b6c45d22a00755f1be21e1292f37ad88ce931d5e43c80e6c2b3c69ea896e6e36fa51e9403b2cc7c6e81aab19", "votingAddress": "bZdanRy5qvDNR8Qvp4gb5HRCaqc", "isValid": true},{"proRegTxHash": "82e4626cdade95d292fc2c8275dc92ad4203fac014b1a94eedc7cc0fd8d65a44", "confirmedHash": "5e4fe311eb5177ebbae47fabe7af53b66dece60ae6de78671400000000000000", "service": "00000000000000000000ffff332651d9", "pubKeyOperator": "18f679a0aa83600c6e401ac4f8558700148202be41b10e963c60f4b308e726c6ad9e1c78508cd1e4a410969ac3ca1808", "votingAddress": "2YuVLLMEa5MPueQoYCCmcAwnAzsJ", "isValid": true},{"proRegTxHash": "b464febf8e6ef01b208bf80f2d357ef160afe151031bfcd23e7f259a08552371", "confirmedHash": "bd76f4225290c65e069a89d6fc8e52c45cf68b518df1d2ea0600000000000000", "service": "00000000000000000000ffff5f6ff51e", "pubKeyOperator": "8963dc9920ca57fde67ddb71f6496a76c5c02f1737282ab57a0a5acaa76d2eca962c5ff64c23233f3502b5b7c9d3e60c", "votingAddress": "3v7LqYW6H195HNDksT8skhXh1179", "isValid": true},{"proRegTxHash": "80a4711b9fa549f2b93930d809c785dbd27aafcd1fb3605efdb529ada7c297d4", "confirmedHash": "f95d58e237f90d5bf906336283b059e02687a467f1ce27b71a00000000000000", "service": "00000000000000000000ffff416cd9f2", "pubKeyOperator": "0025af02007de457012315d050188176ca2384e71755c1ca4ae340860c3c4820baf84fd28e3b47b342eab57e7006f5e5", "votingAddress": "4Dsci7nKtGaZ2wAWHDgNHbxExRNw", "isValid": false},{"proRegTxHash": "90a498168c523bd4a02ba9bdb8a6ab37333d825c09fc578444390daa99de5e79", "confirmedHash": "a1e094010857a009c83d4ef8d94b2fb2cfd6864e61a80efa2900000000000000", "service": "00000000000000000000ffff340644c9", "pubKeyOperator": "02f3969f2c6199e30aba289d6a40c3a22b8663b2d0119208973eda58e1a820320830e47a4a6cf7559dfd81e61bb145db", "votingAddress": "3nJVqkqTvZoBPjGERc3ivdPrJDL1", "isValid": true},{"proRegTxHash": "6dd66a1b79ca9c36dd0eb343c6134d40f1d402b2e871e978173e053ba990afa6", "confirmedHash": "f475109160142b7a3c9e88937ee42dddd0daeaf15eea728c1b00000000000000", "service": "00000000000000000000ffff05b531e7", "pubKeyOperator": "82b7ab63c944e822b45c33b1a98e5dbab7a2636298b7856e826cd1358d07cd0d125a02ec74b26349034a2ab0f6ca3cf0", "votingAddress": "sn7MKjRiYLnHx3hqSH47zW36AnR", "isValid": true},{"proRegTxHash": "7403638ac6849855fcb5d01046ac66303f2024701407e2a700168b9966baf8ba", "confirmedHash": "270519d3d841e4836b7b6d692a42d8e30b4282d095f213e52b00000000000000", "service": "00000000000000000000ffff52d31597", "pubKeyOperator": "01b8b2851b07ddd90b37982e4d98b96cb3f1e895563b5e11dcd747be08de556b25b85230c682c76caad2d05ae519918e", "votingAddress": "2W1EZYQMhv8DaYzHhgYzdVCqcotX", "isValid": true},{"proRegTxHash": "5642a2f7d0c337ad5da307f50ad0c8dd85500cc05713790d88d9afaecfba6c77", "confirmedHash": "0411d017b7ee1560505499d5dc738aeaf18746b14de85aea0d00000000000000", "service": "00000000000000000000ffff867a261c", "pubKeyOperator": "1769513e403a05c4f59c065cf69dab2ecdc2c905f21699ce6826a8ae1fd64bc3459c151331322f3112e41af14ad548fc", "votingAddress": "4RJkU4ohx6PrVTM5trRxH6Xo49f2", "isValid": true},{"proRegTxHash": "4515530f5944b4744811b9baf6fd6b1f4d07ac2393e95b5d388e4f0d9c3cf293", "confirmedHash": "accb884a9b7c0dda94751cd0d688bb3ef8d1783660fa5db00c00000000000000", "service": "00000000000000000000ffff88f3738b", "pubKeyOperator": "0b5eaf284bb4022bf4e6a4f23f1be4b26163bfd7d11a170a63bc62d5fa28c8ac1fc8a4a680baf7e89e9e8e14170c97be", "votingAddress": "4EFiRsCnbnj1Y5SnhiMeBJNGS8gL", "isValid": true},{"proRegTxHash": "7e0f4aaad17f29ec35a19195964604b29c86310b528150e20c85aa0c4cce427f", "confirmedHash": "98219effba4619f33ab26e27b5259048ef184f8e06f80d881f00000000000000", "service": "00000000000000000000ffff23ad3f51", "pubKeyOperator": "0a354bd6de479dce0864fced9cc8e3f7ee39f1f77a69b28d75745907a7e76e6565d6b5b12bc7cd64284d910650f8ccb1", "votingAddress": "32Smtpe7n3yqWUr7hFoRRhj2boWz", "isValid": true},{"proRegTxHash": "3e5552c00ba07c5db57f51c032ab3d72c5a17a5ea5f0744721184681cbb015b9", "confirmedHash": "2dfeb7f521a8d437f2ce0ec1a2b93bf12920919c45b8f0cf1600000000000000", "service": "00000000000000000000ffff310c2af9", "pubKeyOperator": "11100e8d65f8bf098b06a4515b0e4e9df313afa04eaa959477f9fbcfefb2ad46e80e1d0cc06f4cd7bc16a777fb172224", "votingAddress": "R9jweLQ6kSV5ngAV6XSTMQL3Pad", "isValid": true},{"proRegTxHash": "863592c736c280fbd5749fd2388b8fbb02425292fa9a7ee22421727e11cd8e9e", "confirmedHash": "0187594ab5fc9618c9c8bb94bbd75290e7d4362bc021a5770b00000000000000", "service": "00000000000000000000ffffbc28b480", "pubKeyOperator": "88b5c294afddaf031a291fef7b536c3811a9b62a4d2ae3e4abe6d97bf2b4f0961d3b9e58c9bd944d2b4d2af726f0874e", "votingAddress": "3BKqSVHT2Q2xNYbJPqPusMEjJp12", "isValid": true},{"proRegTxHash": "ec302784ccd06da51cfbdf8703a98f9f40fa93cdead84cf46f39cb2f70061a9b", "confirmedHash": "e3c35885ac9a51cb683c576ee4c036a9b2a4ba467a4270f70500000000000000", "service": "00000000000000000000ffff9df52ea5", "pubKeyOperator": "97d13322ec0fb5a12fd3cb8fa6c68d7aaff5a60b81eb4d446c532bbdbac94622ef1c6bfcd053f64d2dbff5aee2e81a61", "votingAddress": "rhfj3zLk2AHLDRr1xzFRNjHY2Ge", "isValid": true},{"proRegTxHash": "bb60afe9c1e514a1426c19ab2b8da37479c9c0851ceb9eb39fa9a526f20d3be0", "confirmedHash": "c3a922dbbf7eb555ecc973b9db982669fa0f9333a1d5e95a0300000000000000", "service": "00000000000000000000ffff58630b1e", "pubKeyOperator": "8f76091ec6d2dc7da0893a3616c4e5bb779e9524ea62cdb3509b1083d6dbfdc3e76c88878d4df471ae2d34604dac8d45", "votingAddress": "qo5qT7JjZX1HFDRTMxQsApFbQK7", "isValid": true},{"proRegTxHash": "42551d2ca42abfe9434107fbd6f199d75b37373c83bafad53994fa2cdc3f54cc", "confirmedHash": "705768dffec5170cf129905675002e3050904b5fe58616841600000000000000", "service": "00000000000000000000ffffbc28f169", "pubKeyOperator": "12585cfaac58c81f37ef716c449476f14e1f3c3a8a91a918bb15a72cc4ae957e8e7109af86f858ffe91899e1d29a1812", "votingAddress": "2Fd3hGjGEm1g6XtpDWPo3bEEJjDM", "isValid": true},{"proRegTxHash": "915eb08b1cd1a731db5c9801154221845437b143ed586b09626a3a7a66428152", "confirmedHash": "9e83dc070fb3848efabec30efa4b8a4a93d2b819b08a471c1400000000000000", "service": "00000000000000000000ffff894ae7ac", "pubKeyOperator": "88972c91feb8db66a6c32da61fd1986a37939469841a20b88be44ba6695cec48db26c0da2c8ce62063f3fadd001b3ff6", "votingAddress": "3j5a98kGAYDxbgAypw2XMXmvQiGr", "isValid": true},{"proRegTxHash": "4ee2ce5a5214eee4a9d40da3f2133d00e395b5b1871ea112ef191ef02b89b480", "confirmedHash": "76c9fff6e1588782de63f2517714fd5c370cdfe837f99f390000000000000000", "service": "00000000000000000000ffff40e3a54b", "pubKeyOperator": "14a25d333ceca6a28752e60ee2e862c7b4fed111074d1c73ccdfe7dc22f999536c6f8b59080dd1c1d397fbd5aa200954", "votingAddress": "7cGt6ee6TfScPfpyKCwHsNjrJuv", "isValid": true},{"proRegTxHash": "cbb047514322f815ac068a43f5ed0d80c94d27aa15908ea6f58078da875b199f", "confirmedHash": "d117824eef4155d979434fba3ba7e972dea3e35045fdff972500000000000000", "service": "00000000000000000000ffff2d4ca0bf", "pubKeyOperator": "0d1ee01d8a3f1c4e3e18b1c7e6e9f4161e245bdf3178d09742e81e6113d67ac173edd7dce17c0828fad95568cd565c6f", "votingAddress": "3DDWkbGqVZk3UbkueK9cM62QhMn1", "isValid": true},{"proRegTxHash": "0847fc9d98fd704255afe13422b15a8458d6f09e2442609d8d7137826e418df6", "confirmedHash": "4130b5dc087f489c12277f886d58978ccf05fa57e694729d1400000000000000", "service": "00000000000000000000ffff52d3151c", "pubKeyOperator": "8525b86bd5524720e62ed1c9d3a84b4dda822697925f78df6d0a84f5248b611325d0bfb81fb03c3b2008ea0e7839e1fd", "votingAddress": "3iFQsfFTSc5HPihsC9e91wMR6Hjq", "isValid": true},{"proRegTxHash": "e33619b5e53c84b7144590959680d3e0512121ee01bdad6b9120a88ccd7af8ef", "confirmedHash": "c8cca8413a51f5fc94bf110489298874f3c0e3741131ec252b00000000000000", "service": "00000000000000000000ffff2d4c4713", "pubKeyOperator": "8c04177be0682d8cdb6bc92463ee86ef23b00abc6cbedfaaa8787d5e15944bb53e21f727009fb5fb206c3f4d2690c710", "votingAddress": "23R42dYThfa56SNFVXkA6wvvFKTf", "isValid": true},{"proRegTxHash": "b43f414a5c3d3c22b66b7498939b7c4a795e393900fa938c9fd118569477bdc8", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96887fcb", "pubKeyOperator": "0bc247797770d29f9c97f0406a7a8f00a520b2d4e5fa43c2b4b372264488e7a22cc9fa03446a585ebd0b9a9b40c8d684", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "4931256b03422f58a06099d0885a86a877bc8fb6d8d7e0d2da3b2eff21f70d87", "confirmedHash": "0152820c4a0298ff8aad088ffac5baf291590d27881157a70700000000000000", "service": "00000000000000000000ffff052d6c9e", "pubKeyOperator": "8e69c4f1b3d047d340025f266b3c44749c4bd8db41f7d40330dac1b88013c440c14126627e4be18918b1c86dba4f7fb7", "votingAddress": "2hba6g4zNPNCSGpNwqKyEmTsASi8", "isValid": true},{"proRegTxHash": "01b833348f20e247c49478193fc7f30fe63b4a6630a4ea1b95362b29f46d9cef", "confirmedHash": "728cd1420be8662c2ef121919211e07cb590610a76b5b5540200000000000000", "service": "00000000000000000000ffffbc28f175", "pubKeyOperator": "96f8953f1b1a7b788e77166535d3c9181e017dfef052f1b09eaef4c4df71769439e305c0f920fed626501e6684b62014", "votingAddress": "3adagxsekfJjnhVptWofTYkxvyUp", "isValid": true},{"proRegTxHash": "b6ddda3cf879b97f4aa045c9ce373806c438197c6f5b3f27112fa4bfca51c391", "confirmedHash": "5275090ce174ecf6044bfa6b49a5885bcfc699786530838b0f00000000000000", "service": "00000000000000000000ffff335380f5", "pubKeyOperator": "0216d13d9309c6699995801167fb0f15c804c91f2411f8d5fc27f44c50d955981e3aff9f9fc2fd1f830f07d52fb5dafd", "votingAddress": "31dz6rEUgKxfosqbc36EfiZXv3vF", "isValid": true},{"proRegTxHash": "b9d48256859ab4ecef6dd5f5e80575b1e19830c3c2d5549f1c2a6aeda501506a", "confirmedHash": "74eeef8df9323115d4c6150616ff4f8836bb3cd60809df920f00000000000000", "service": "00000000000000000000ffff55d1f1ad", "pubKeyOperator": "98e222de6a6c29bb0bcff15c79d28bc17e65923c30fac8ac5f416dc060dbd8141c4662e64b538aa662b97e6bd962353d", "votingAddress": "WQKG6At8gLqfi1tJ2Qj886nF5K3", "isValid": true},{"proRegTxHash": "e0234236e15f68b046fc0fbfdffcb24080273dc824a9831a36f1f54b4969c142", "confirmedHash": "e1866ccb731bfe585911e690984e398c7b281e06a9e98b281f00000000000000", "service": "00000000000000000000ffffb23ed3ab", "pubKeyOperator": "8d8153f2619ddcddf9c5f340e59d8fa06ae53ac4ac6b98e3d3c3b00f916bd987313dd64c347764cb20083c5015c762fe", "votingAddress": "4GdL4yHyTat6prALaGm8bbvzE1nB", "isValid": false},{"proRegTxHash": "e5bf315f529d0214508400f04e541cb95e6072a119d54227484666a9dfd36610", "confirmedHash": "8df74760d612e08c1c733235b18d774270830d59d72b0bf91800000000000000", "service": "00000000000000000000ffff50d1e4eb", "pubKeyOperator": "0a9074a6c313eb0b4f90d7ba2152837a60f61d18333d2a3bc60dee27ff3db15ff0e25114993e763f021558caa89beef1", "votingAddress": "34CagQUqd1kdkoFTouTkj1RrQ16w", "isValid": true},{"proRegTxHash": "454bce26dde61cce5a8190928ed2af0f95c5bc053c88170b1a653028b36a29a3", "confirmedHash": "8027e58d935037bcd93c6713a3e1ceed8226deda2c5573d31a00000000000000", "service": "00000000000000000000ffff4f621e37", "pubKeyOperator": "04c4952bba25bc5f87212d46254c5988194252157d921bbf0c771c6afa1e45219f20fa5c7de1f62edf43e232d3d4971a", "votingAddress": "3ouPmkDyu2Qu7gGRkQ5ViL8rpDie", "isValid": true},{"proRegTxHash": "b5dd7cc47d7086d5d237f3aeffb9558e90a12e9174465f62540d16efd07131a0", "confirmedHash": "c0ca797189180c2ab8dafbff6bb181468540efda5ffaac3b1800000000000000", "service": "00000000000000000000ffffbc28a309", "pubKeyOperator": "0a62a57ff1ff592dc3dbb0c1155738c7cd2b6595b803c12a8be0b8f9f0f1e3d4d8ea286d9dacd54dc1ce0102530b1085", "votingAddress": "3XcmMPXpbDS7NtDt6VF5RcLNdinM", "isValid": true},{"proRegTxHash": "d1d59cedacada0a18445429e573a9ff857a1963ec20b65d9a6017b35bf4e729e", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688b3de", "pubKeyOperator": "011650a25773b4560f105ad785f52deac558489d167926e4fa3d609c592f7a5d37a2072fccafcd787fb2f0c29d9f9fa9", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "83c7b372f0a2dcbcd9d6c97dbac0702e96497de45e6b399e8deb858b56b57cce", "confirmedHash": "0018e4a1da2d5dfbe0bdd08e6f600e2373817ee9d0e4fa870100000000000000", "service": "00000000000000000000ffffa516b0da", "pubKeyOperator": "00907db7464352121e2d331a9779a1319d0fcdbe923001f11477a53e0216af1ba5d54038e631581c1d535d72a0cf5a68", "votingAddress": "Pg6aoyffXqgnpihZDG8UPf2kTtn", "isValid": false},{"proRegTxHash": "120d42da4318be807422413cced534cad0a2a7cfc63085ab1062148c9e0230c6", "confirmedHash": "83cf241cbb05076e5a891a8965f9c9dc5332f8eaf75d811e1300000000000000", "service": "00000000000000000000ffff05bdfd3a", "pubKeyOperator": "809edc3107bebc0b7886d0e659f9e0c9a29e18f8cf891007b19878ce99f9f88320731e2a09f123c102a643a74765ed78", "votingAddress": "3qUmhW8H18MdrRtp7xfy9N71wCRM", "isValid": true},{"proRegTxHash": "544b6a7abd6d2e128ff73f40ff0fe06226019d6e6922c50dd77c3fac84af93ff", "confirmedHash": "deea24e962fac02cf223dd40dd3f1d84e4375d0d51276cb70500000000000000", "service": "00000000000000000000ffffa877500d", "pubKeyOperator": "0ce19d67ad90e118ae51b46c7ae6e75d4e0d0bfb647436b7d4109694eed32a895678bc6e6ecbe82f49b05ce687955cc0", "votingAddress": "wrzQMy47jduerneN3RzZRxJ5Hws", "isValid": true},{"proRegTxHash": "86c9113eb3248ed242e96165fe94a94f96df277ab9c6e1d7e35e5dd2d8a95b4f", "confirmedHash": "e6a7b2759861c7c24d90aca496dd830b25f1b92dc7d221400e00000000000000", "service": "00000000000000000000ffffbc28b844", "pubKeyOperator": "0dde690e9bc610f5a655f485a47d778bc7151436ed48ee907839957b027afc753f665009122109ef348e9b6a6c907e59", "votingAddress": "3DgepA7PrKp3WWUEfmgsBcUKKfqD", "isValid": true},{"proRegTxHash": "971ff15f424e2fc13dccec59ff918fa2aae1c1a9c45a4f5a58da38fd247813d7", "confirmedHash": "ae06cc22cc46401855349ed291205288b41759c66e2eeae40d00000000000000", "service": "00000000000000000000ffffd41865e4", "pubKeyOperator": "0d11b4dd0dfc4317513ac6b84472955f5af61fd0b3e75948ded3cd79eb22bf64759f4c1965885828db6d37c1c290ed47", "votingAddress": "4BrHwjeEQ6XuLkSo2KSK4tvkq22B", "isValid": false},{"proRegTxHash": "24aa1adf52fca0d0c2c60690c09ad3552ae4a3fb057347e6612cd4ed3c0616f3", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b085", "pubKeyOperator": "944ac12350a42282175a0d45517ae57b3bba09c2c2b0ea42fa98861606905f1a9b4538d435110d421ae07a2eb31434b7", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "c8f7fd8d159b7bfb9601989a43cb6ae51bbab785e208c1c601e2e6617b0294b4", "confirmedHash": "940b37038967c460d991890c6a11903d87231fb714ade2073500000000000000", "service": "00000000000000000000ffffa8775795", "pubKeyOperator": "0cb2b49919a26c6323c83acd4df737cc91c9c8beda9782b2b3a28f8614f175e89a2eb5c388c17b650b39459d7e267c98", "votingAddress": "3xzaS7fUF2n9TqpAZDbo5hhmHVYs", "isValid": true},{"proRegTxHash": "3c7d9e77682468bad282685ea4ad5d67e96fe09417dab52d4d956ab811ef5468", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d52f33", "pubKeyOperator": "979835f7a69d67d9be31ebc08b0726fca58e5c440713af349afbeb0c10da9c1da55ac9a838ccfa0c0644964de655cbc8", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "8aaac1fc11b09fc720c84f7bd1c7101c90edcbd6949acd122b65faa7ee2b0437", "confirmedHash": "2711e067b461154ddfca9475a2ec2db25a6bc15aa10f9eb90100000000000000", "service": "00000000000000000000ffffd9a31d3e", "pubKeyOperator": "07e292587fc1ee01a93e9df0b7a65733ab0c8734b6ce9cc262489cf48bd276359c176cac98e3c2d1c6a0ee0a681ac871", "votingAddress": "2RVpFN2ySTShf59bumLzyb6p6rDg", "isValid": false},{"proRegTxHash": "28b43412bcd3eceab5f72c8c2ea78a7ad5a66df0b79ffdcd7bee5ab637ca1a80", "confirmedHash": "7da0d880d2d36c3006b6e7b4f503475b36d5576761894e391400000000000000", "service": "00000000000000000000ffff6883ec72", "pubKeyOperator": "9872e8bb61bba997d32cfa81934d442f2de0e9645fbc6d4d90f0632cd33c719901ec6e6d64d7109d3b3491c3b0689199", "votingAddress": "2tsTRUq5h84LbNM9W88jt7sSu3a5", "isValid": true},{"proRegTxHash": "af8572301ac8f93a2ef23e4f91fa2a24de3d54e999287c5730b31e91c1087d7c", "confirmedHash": "1e59f2ace7ddb0baa2eee8a2059c2bafe7a818ed6bbf0cdd2d00000000000000", "service": "00000000000000000000ffff4622d320", "pubKeyOperator": "0e021847303e8568f35351c9d1d24c2743629ab3119d9431ae57f4ae94a0db4ad157bbaaa48a132afbe21c2df4447e1b", "votingAddress": "q4XRSeGxuYV9Zqr5eDws1TdJzLE", "isValid": true},{"proRegTxHash": "7b8de8942f04777494f45c9ac76e6cb1f2bc0d5a20f5e652978f740ef149afd5", "confirmedHash": "9a1d301a18559dc1aa20644fa3b6273224ce13f37e3b92b14400000000000000", "service": "00000000000000000000ffff52d319ab", "pubKeyOperator": "8ac239ac08f991893623917b242d9791dfd78de9b4f5c23c8eaf5b1399c118f38a00cde3c67c3805a200a04e87509b3d", "votingAddress": "2fgCMoDF5VhTLMzBhpr81tHdz9AB", "isValid": true},{"proRegTxHash": "e65fc346548b55db5c87e942cfe3412b0ac8d9c91cf939bf5ddd4b15ad5767eb", "confirmedHash": "7532053b4e14c8c710eb5055d9a759516394a9fc1cb28feb1d00000000000000", "service": "00000000000000000000ffff9de67449", "pubKeyOperator": "0fe76d859d3b7307feff2afdb0c32880a15164bd63e7b83031efdb9afe98cbf9934aa51473597f345c7f18c83128a2dd", "votingAddress": "2p58EQFQJMUqThMhknsXzKBA4TQX", "isValid": true},{"proRegTxHash": "010504bffb69250f78216e47cefc449fc85d1c0d0e41b9dde755aab820bfe8b0", "confirmedHash": "d5156219a10f493bb81e918e8fa8acbfbc58157206bdb1f60300000000000000", "service": "00000000000000000000ffffb0664191", "pubKeyOperator": "1319bd8c3c5218e4a0af65b83e9ae46d01e5a9f54229a2803e737720191f2b88a66dd938ef30cd49c15421cc59c538ce", "votingAddress": "39ttnFu1r5x7V2hWMoLLsgSLjhTC", "isValid": true},{"proRegTxHash": "98cb04171e8e0eea1c539e4f6ee0f0ac21b64c3b9819f068dc35e6c818730fe1", "confirmedHash": "6106bb7d2ecc3112486c419fc7d12c0a6bdbc931c8bd21390700000000000000", "service": "00000000000000000000ffff2e04d9eb", "pubKeyOperator": "83c1bb7356aff376449f398b86799ff4bbd6a987b9484a5848bcd229fe78987daf7b8fbc0d2b51ab4499f9b7c116f045", "votingAddress": "2Ae34giTkQ16zrEM2Y3z56VqRgdV", "isValid": true},{"proRegTxHash": "e5e5171d152f4a3e03327618163ce7603063c1d5deb3ab779cfe008d687e2ca2", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff968896cd", "pubKeyOperator": "8975631415524f95dab88de305b4691e8c4e378acde9c25bfd33b68fe8677495863611a1051755d9c1b126f1f2e2ff93", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "5b06c05babdc0c8fbd3c2ef809adce1f59e1e03a46f176a0376c929fe3314c27", "confirmedHash": "9e35388448e3d466ce41dc232c0a5ca8871ca17f441ee8280500000000000000", "service": "00000000000000000000ffff5fd86d84", "pubKeyOperator": "15c5518378129acedde8882e52bdef6079cc0fa0aad26c9db0332bfc350331c0d04d1b9d5cf12944033a0247f95bad5d", "votingAddress": "4XHCG7oasF8KhBDeHhKEEQ95rbdh", "isValid": true},{"proRegTxHash": "b2291aefd8c89d61f947bbfaf9893157b4d0192153eb75f333bfecd95ac2a23f", "confirmedHash": "c0d5d9692f06db34d33ea796e927a57b6137a8bca5a2ee491900000000000000", "service": "00000000000000000000ffff5fd93064", "pubKeyOperator": "80bcf418f20eefb21665ed150960b6d09718b323a5766b17888e90964a48d079e24637e1a8082ac3698aa880f1b09d0e", "votingAddress": "2DziBfFvU3x1VywGwofuRko5NAtK", "isValid": true},{"proRegTxHash": "4c50bafbbffed43fd731224dbc0478fbc63fd425594275493ee99eb49e05bcd3", "confirmedHash": "7e809adc9f3622c90236370edaa018f64e02377b6a467b661500000000000000", "service": "00000000000000000000ffffa7567254", "pubKeyOperator": "12c82ac61c469e1bf54ca40625693f64f673f452f669f6305beb43a9f60bbce2c43d0238d493ad68cdfb2b80147dcbbc", "votingAddress": "e4sB2HegJH8MfyLDFDrD4fY9YpM", "isValid": true},{"proRegTxHash": "62781657b13992b825d6969f3bc71dff506cd5394dd013c330beafffd95be158", "confirmedHash": "54687245820d86ad38f571c8d41bf578a640e20550a8a14c0200000000000000", "service": "00000000000000000000ffff52d315e4", "pubKeyOperator": "07ad3633714ee3ebdf1ba552d8b121af21a7146f9188bc392391f8709e82b0fb39507100e20476ea33032d0e01991c47", "votingAddress": "4PiNvAu7CeYWdktsQHiEfXq19ANu", "isValid": true},{"proRegTxHash": "8f024ca1c43236525a60f35ec34fc474400fcb45683ac82b6c2ac3fce7ddf644", "confirmedHash": "7c9da1f69b527ade6730a2fef4bde7b012ac78e286c292891500000000000000", "service": "00000000000000000000ffff8b3b5628", "pubKeyOperator": "147060478ba25f392f2274aad80178a64fe5fa038bf4ebfc4af1ecb119ffb9de236b25ccf8e472197c2a0495e6c285ce", "votingAddress": "3mSHz8mZJRGjqcHDVqoZj7jD7ay9", "isValid": true},{"proRegTxHash": "a1a4968964591829a7ae36397a03d403af0ebbd6b4ddcb77bffeee371c62a1c2", "confirmedHash": "345cca872a8575598b6897bd7f024a37abc74e71d3ade1a10300000000000000", "service": "00000000000000000000ffff8f6ef2da", "pubKeyOperator": "912498832a2fa34467b226770de76509bef6737ac3a0b13e77e03848bb4f7c8918c7683f5eaaa62369b88c1f5ab17e64", "votingAddress": "JzGy6MKVr9hBh6nceFCbC8z9tiL", "isValid": true},{"proRegTxHash": "8594f93d0565cf9748cb4d907e3e11a4f7600140e8f287cbbc58f6c7ee73fc4d", "confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", "service": "00000000000000000000ffff2d4ced06", "pubKeyOperator": "93e5b0fe542d997292f14065d7b1af07ee2382419c8f7ace4f030346b36c88f21b6b12171d148ce03ee908066c9564d4", "votingAddress": "2jmE3Knv67JDTJsRqdSVw8UJoSp8", "isValid": true},{"proRegTxHash": "8f736f0ff6cde8b6463e0cd9c601879ed243670044d103098d980721dc07ca85", "confirmedHash": "e59accf123796e0e7dfe26f4fd3dc8a76244603294deaf201300000000000000", "service": "00000000000000000000ffff52d319b0", "pubKeyOperator": "02948eaa492197367edfb0605592a7aaaf0058bec71b090af483dfc0f9bde93b4915a9cb8decf2d85eb692b50959b649", "votingAddress": "f7okey9xgkbiLJeUgVspbboi2DR", "isValid": true},{"proRegTxHash": "7405484980717b77b8143db15e0836d311cc93ab949be0b2d86a98b683ccf72e", "confirmedHash": "bd5645ac5b6552d0199a9ab99ea92caa85fabb753817b20e2f00000000000000", "service": "00000000000000000000ffff2d809c50", "pubKeyOperator": "963a5684158950188d214b4597a9a960b233eb7735a4d8876d6731f3c169bcc22ca5921c5178ec4e3fd68fd12c0e8395", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "c11a581b367ad8b0026fbe1d30a399906c8d524cf9c554a0b6f581ef9c071084", "confirmedHash": "c500f85a4db9b6cbca1e35ace18c9614d1e84d2eaf6304a10500000000000000", "service": "00000000000000000000ffff52d315e2", "pubKeyOperator": "88403efbdd1fbacc498d5cb83b380591cbb18d9189e1900775e2595d608660a53a5428339f4f98d9dfb2ea6246b0ef71", "votingAddress": "3cRgoFQPY5osH3nfyvbTjqdTER5u", "isValid": true},{"proRegTxHash": "70842f1c88b999f6ad578d67f9af4d612d5a55da3fe3b448952539625c565af4", "confirmedHash": "0208682f37b199910eda6d0fd05e60cdc29660aa1d74ca871d00000000000000", "service": "00000000000000000000ffffb951a467", "pubKeyOperator": "0da914b67d250b8f86b961ef105e60ea2e7348653db783c2ab0d8505c343c63f7d3149b343c968b836729362e71593cf", "votingAddress": "3QuFDpaYFeHr4R5H9P2Tdbf3rzQZ", "isValid": true},{"proRegTxHash": "b7aa06e2adeffcd554ac1b9fb07c8001f8e02d62b7ac10f695e2f838e23e77ac", "confirmedHash": "5c68f7975db4d7563096158223fbe30e048dc59fd41dbae20b00000000000000", "service": "00000000000000000000ffff33c324ce", "pubKeyOperator": "8b3f1009c4e3504253f11609b344fd72d6863af96b8dac50bf9eaaaca24b6fd150c85d03c53f9dd5682660e631e5742f", "votingAddress": "2DAcLiao1SZxoTzxBNcLpM6qeBnj", "isValid": true},{"proRegTxHash": "e710eb9cb66333d72ad763bad407805dd7ad9c8b098eb3a2eb87249acabefe06", "confirmedHash": "fb70df4b4d4f4deef3e3489ffdb1135e7037623b39be17c20e00000000000000", "service": "00000000000000000000ffffb23f7992", "pubKeyOperator": "90f693c31d7b9c2970044c81b29488a33892ae75bd2a38d47dc4807f0a2fd8ea2f2e6c4d9619a01fa00112a44242ef6d", "votingAddress": "4FwyESjYoSKRM8b5frcDno1sm4Vv", "isValid": true},{"proRegTxHash": "cc3cc55f181cb72b09293eaf5ebc1bc7edd2d6e3f36a85280b9693b4cefd4271", "confirmedHash": "6aa0e3c267c20ef7ad09be90827ab19230a9a0275f1833fc0100000000000000", "service": "00000000000000000000ffffbc28fbcd", "pubKeyOperator": "81fb652a973c46dbf657dbe9160f6f8e191c13f09c46a4f713978f8df026507bc5f6cad725dd2a1969b7fcb2a93d2e99", "votingAddress": "Z2jVm4M6B3UsFW3iz4gvb6iWuub", "isValid": true},{"proRegTxHash": "7dbc3e85be1bfe094530df1effb0c44cde6c79bae5d81cdc050feb6ddaaefb4c", "confirmedHash": "61035eb65070f42fb24400d08c281e263b1c57a5271ff4901400000000000000", "service": "00000000000000000000ffff55d1f218", "pubKeyOperator": "15481386bd16a61ebbeed4234901867750626f49b520c4448b9e050a81e7a370ef3e33788c40bd8431ad457477093b64", "votingAddress": "3db2r2TahWhqF5Tccj1M8gmS2dDm", "isValid": true},{"proRegTxHash": "ea4236623c46e2a47e275b5c448cfc27416ef5ed556c7315d6d42ac86c211a52", "confirmedHash": "cccb7fa2e1cc84becb79ee894428dd72fa53cf25d78a525c1c00000000000000", "service": "00000000000000000000ffffb29d5bb9", "pubKeyOperator": "999ab9ab5cefd6fdfd7d55c9940e4a44c5408472d8582c4ecb68838b1f3917601eb69646933864de1856dbf71c1ad996", "votingAddress": "2Z5dXrsmUc4CAGZvAX6AXi4u78Vy", "isValid": true},{"proRegTxHash": "b2306e3ac3b56fee749f08944d1e179c3b207ff052b3878b62344e103c26f4f8", "confirmedHash": "f8aefcc229abe2bfdbd76be6346797b9c52d4ce58fa1a6c71600000000000000", "service": "00000000000000000000ffff2d2024f0", "pubKeyOperator": "012823cdf4620526c1731b00c0b7f5eb6d4877be661ee629d00cb47c71e4a7ca67f5c481c625d3d07c94093c9b6bad2f", "votingAddress": "2JtqbTQGmpPMtqYwvNBFXvDDtQk2", "isValid": true},{"proRegTxHash": "0cbe31af6d534473394cab067dcf1f6da6eac4ada0a0f9c3b938e990e846b81b", "confirmedHash": "b9d70d4631d6fca8deceeae206b4071be4a35f8a231d26bd3d00000000000000", "service": "00000000000000000000ffff5eb0ef9e", "pubKeyOperator": "06dfca6812726aff821fe27eabe48051ed218a0f43948a902c97a348bc44473f3e347d1390ceb65b7ec4b2d4e7f90b25", "votingAddress": "3ajBwRT7Sz6wVfgpU2ixPsGcAPsM", "isValid": true},{"proRegTxHash": "57d9999f86b8dc5360f40121cb7d91790657824000eb66683ea50d0e043080d7", "confirmedHash": "ab9a0bd9ddd2f49191c1153fe1efad0ddab4585be8427f400700000000000000", "service": "00000000000000000000ffff3e4d9c99", "pubKeyOperator": "098278320a3d3eaa665a35511e23138a03466a40e59108dea02b350cf84578582e04a278c7843f4fece154a9fe11c585", "votingAddress": "261CU3Us4zxE81J6e2VJ3ZDUcXtu", "isValid": true},{"proRegTxHash": "02ff4f13d76949d65e7dc5da0548a6c0b2d0afdea0fa1ef222f4c08be70cb9c8", "confirmedHash": "bac75e5353a0b47bd86748ef797e821f2c8b05fb6ed340fb0100000000000000", "service": "00000000000000000000ffff369e90a0", "pubKeyOperator": "89b184d9cdbbe192bb2c29a500c69cae4753069cf145fb8372adc1150cd17a655624bcae36781486779dbaa78357b72d", "votingAddress": "Duuohks7U1t55VD41KuJpao6iHi", "isValid": true},{"proRegTxHash": "ccde8ecc279bfee8127476c7460ac72eace93731c3fe9c430f25499dc98a3288", "confirmedHash": "8e15d3391f962a2c8dbb47c3cbbc6543a35cbb3c1f8aa0bf2d00000000000000", "service": "00000000000000000000ffff12ce3f8b", "pubKeyOperator": "057a1d863155d794140900e8035e93d9ed01d52c51f5fedf3742c9169ca65738129d3bd220004e1f7ec82bf55af7c179", "votingAddress": "xeURxE9MMbSscrySBH2bvc3ASNW", "isValid": true},{"proRegTxHash": "59226f896db385fa056c6e903d061cc3b35d63f4f32600c8df93d221534cc604", "confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", "service": "00000000000000000000ffff52d3158b", "pubKeyOperator": "840ed2ddbd922234a83ad3df0327f824ca54486edcb6ec5da9c0e3fa53ba20b0c5f4349fc0072ffdfcbe2d40af6fcb8b", "votingAddress": "22AFHG1fjxfR3YZB8qaxXF3TmYSv", "isValid": true},{"proRegTxHash": "36debfe0f9efea81c85f9c4332fa191e3a551de6647b5108ad33ae814bb03bbb", "confirmedHash": "33edb9326ec9af8fedaefe8710dc9e584fafec5b88cc7cc21200000000000000", "service": "00000000000000000000ffffbc28a307", "pubKeyOperator": "91842e9bb2c8fd2f75be0b4d5b1771af6adbdb016150bd50e11f67fcb411be2ec52a6c8ec2ce2bfd3f0de609733f0e5d", "votingAddress": "2AEZ6jTqHz2nQ8gHbv5WfhetSU6c", "isValid": true},{"proRegTxHash": "f19746a32e01e65a5d51b81e6e82de08b76f62d9c85b405f8efcfc94aee083fc", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b072", "pubKeyOperator": "8e32b8ea553c1d709cae533aded96c9c598460b20ed8c251653160abe5bbec8f3aead4ee710fbd3994e8eb5b8948ed80", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "2ddec2412bc02db7c05d248a161995d125e6cfc80c706398ea69f77de9ef94f4", "confirmedHash": "66b5c50b732a142b4d5f03922b554592d76379eec314715a1700000000000000", "service": "00000000000000000000ffff55d1f101", "pubKeyOperator": "8159c2b4af66d035fa194b42fe48c33ae384606a22b217f74fbcb837caedeae27faacb1cbc049a1fcaf75bbbdb1e170a", "votingAddress": "2ge4yNedV5mq9htfpTS655avWrSp", "isValid": true},{"proRegTxHash": "0b94a8feeaa0e480811ceebe97d606d9a54caaa27947a0ce6e1dd372d99868dd", "confirmedHash": "1739ba773f37f199a5b11dcd31a61c69012f6814ea6a72c01600000000000000", "service": "00000000000000000000ffffb07b39cc", "pubKeyOperator": "97a6e789aab752baed572daeb9b86e3f0a8e3275f6b1e6e818e3ab7a7765e0056c5707301d906f26038f1f2523fc63d9", "votingAddress": "3f9cNe6vkXib2QEx2FJcvgZhA2iB", "isValid": true},{"proRegTxHash": "99181b90953b1017a4a186f97e8de36185c77e38825ce5ad5f4e9924c8b0c2c7", "confirmedHash": "c719c39a576e1720471f4cec3f0f5deeb1d13c9c3d636f871000000000000000", "service": "00000000000000000000ffffa8775309", "pubKeyOperator": "11d66319a4dc5138f44d665d0e9dde063896a0968e45df99617aed2b49684c9489247e06b32f4c141b67e3fb03d498d8", "votingAddress": "2FKizkbFLgj1JFKv2o6GBxJAJHCk", "isValid": true},{"proRegTxHash": "584584c5e395c9c2eb779d2301e7d2b70383fdd252159c964b8d94fdbe9cd9ab", "confirmedHash": "7b9024235350a14263b9b202cc5e6fbbcebb28f13518fd990f00000000000000", "service": "00000000000000000000ffffcf9adf37", "pubKeyOperator": "11b8700e7618003a3726aa6743c99e65a4291d003a602d35cf0db4436b1e5ae853af491a6422a05aec046503bb88c4c6", "votingAddress": "3K8qm8WPzXQWhrvsPxvEWbM1Axh7", "isValid": true},{"proRegTxHash": "0bd78dd52a0c09554229eeb6e13f1739d0db75b785446f8646f89c3f7753bbee", "confirmedHash": "d4899dab6b06800a378b7c92893fcbfc26fd28db51cd05b01c00000000000000", "service": "00000000000000000000ffff3359b3ac", "pubKeyOperator": "14868d4f9ac7d957e68ba076627936b963368f28163addabc4eb893b76f1f1c11c3353e1614842b47e9e1631830a504a", "votingAddress": "qnHzZm2HzYFJ1L2JbfoSxR4vGxb", "isValid": true},{"proRegTxHash": "244120349b14b76b033c64e728d668a9f3eb4a3b4a5e27c2078f41cac46e205f", "confirmedHash": "beae829de12b4541bb5f7b1b56c3112bba87218693a3409e0200000000000000", "service": "00000000000000000000ffff9de6f6dd", "pubKeyOperator": "83f7ac19ccd71ba0e7fc2829f647ca77d693dc23f41981ca06bc4d33bdb719b119677dd990e27fdbf18d4fa59d4c0280", "votingAddress": "dQMRyrHDaojXkyczyGUJVuqqaB6", "isValid": false},{"proRegTxHash": "b7dcc40ceccfae5da86e908ae4aac4ae6cbb1e483b16f0e989527cf844fcc4a9", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffffc17a8d9d", "pubKeyOperator": "14406c68de1ea82685e497878c79e00a806f4490635f033b537ed7d92d459cf9c223c08474855cbd44da580395215935", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "b71ac4792e561ee0013f48b5c83aa352f1a962c38cfc9233860112dc710f04a5", "confirmedHash": "1833f90de23ce9bbdbfc14da4a62a8e539555eb3c2aa62011400000000000000", "service": "00000000000000000000ffff8a4483cb", "pubKeyOperator": "15e27f5e2ec65d69fe1c635fcda88ac4bba9fc4a1dbb7b3381dc82bb1cc9a47ff4d44a46c764218f3e1d3b2b0db732df", "votingAddress": "4JwE1NxLRgMNqsxu8e5Bdr8yR32M", "isValid": false},{"proRegTxHash": "aa756c3001e989e05a5fc8a043576e7a5b366cc44ba453f8fb9c6dfed7cbdce2", "confirmedHash": "628ea80c3b64650726b1268b22919a9a9f7bfeb7fe8310172000000000000000", "service": "00000000000000000000ffff68f8210b", "pubKeyOperator": "83d00e7af2d54c63aba51844b8a2f6aae57f9d48a4c8d6f003aaabab187b17dcf58fb2ae61781fb07c65bc09e89b6a05", "votingAddress": "kshWQgr85cG3yyCfb6RQDVzmy9y", "isValid": false},{"proRegTxHash": "f771b896eabaf2e29b04237b1874401d604d141e548c5e530d04ef561a559222", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b077", "pubKeyOperator": "821157f2021495b66afb9dc1da2e10da30e779a72c854c89fd04652e86d65879ca88ba0332dede0af819a976de367ff7", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "37558d5ddaab688041ca326c61fd3f5d8cc3e03437bbc29483a93cf82b21256e", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0c9", "pubKeyOperator": "86a80a008fbfe8467a3c898b5886ec5fd874e0b9355a63774f29e72bc5e15bab25fbdc1b4a71f2360d712198d30aeb4e", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "503026c206ddc800157cfca7512b851c80976c9b27c9769de3c1eebe60d511c6", "confirmedHash": "2361df2cfb3dbd626bff6a20f35d1ab801a740bd10e5a7c31900000000000000", "service": "00000000000000000000ffffb9e45386", "pubKeyOperator": "8a645ce4308da24e5aac11967873935e1369c16425c8bcede5ec6c135ac4379062aecd24e07d4d7b2ce4df1259548738", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "79431c8e463a17ce739f779bea465d1f992fe8b4ff0c7002e3a3bb04b5627c1e", "confirmedHash": "947bb755902c8b40ec3102424069e972ee7e82886f37b48a1400000000000000", "service": "00000000000000000000ffff5fd89140", "pubKeyOperator": "98a63620636ee2fa407a2185e02f63a33708f4942e1935797ecaf439247f03ed3ea0466e4ef195f513059f2544fe7704", "votingAddress": "2akGmhJyBj7VFmjXnuQuTKSXTmxu", "isValid": true},{"proRegTxHash": "5328dc09b89e75030952c33b78a06699a93d3dfb5b1933eb176ba2564b649020", "confirmedHash": "bff0de52557d2827cc474c1fbc47b134a74d37f00023de091400000000000000", "service": "00000000000000000000ffffcebd35ec", "pubKeyOperator": "1689613a4923d60d70356b49af78bd4885d8bae458dabc77607fcf39c4ef70574348872180d4a98b8d81747e8cfcbdcf", "votingAddress": "EWVmiVJQTmGwwoGcVgq2ErYzK5J", "isValid": true},{"proRegTxHash": "9cc395fc0ae3cbac1354c83b590885a55c01e867b2e7d18eac73d69bb8b1a0f9", "confirmedHash": "1be758139421063d44b2265542b444a4f070c57b18ee01821100000000000000", "service": "00000000000000000000ffffb23fec78", "pubKeyOperator": "88fca7746d7f736a8e883c55ff8a189ba50bf625275e7d7f36f661e74bd918ab66641483e7ad65f91f76ea28144dae84", "votingAddress": "Brd8SzLMUHNkeMg1cQQb67P94G6", "isValid": true},{"proRegTxHash": "6f9deed73f465fab7dd21f47229d40a1c2a50dfe88a13ba072f480ac4246fb23", "confirmedHash": "4131a2f9109b8dd8c42831820062000b4784614cae2b4f4f1400000000000000", "service": "00000000000000000000ffffb009d20a", "pubKeyOperator": "11a9eef723a9ceb07de94eb0f59c75812a5f35a77fc9d115dce7b457a9c43d8294cad4df1691762368d0ee5b27555c6a", "votingAddress": "7nd8dfyTRu3cyjTccksPYBZgxyX", "isValid": true},{"proRegTxHash": "1facf62ca82c7547a68d363d71d32d0c89d951ad24fe57e339be75fff428aa5c", "confirmedHash": "c830d3e64b1dfe74fc95407bbe46f8fce9e0d719e75d911c1a00000000000000", "service": "00000000000000000000ffff05b5ca2d", "pubKeyOperator": "12cee758cde13d1ff376163c23c266cd18c7c7ee2010c6d7990d7e6df6c66c3ce490f6d8ff9957705889e095d829dd1d", "votingAddress": "4Fgz5dbdRmsV3BDUJwa9r3vgJ8D6", "isValid": true},{"proRegTxHash": "95ec8902a9325ecff5e94f71c25da31d53d6e134243089ac673b09a0ee473063", "confirmedHash": "f6c82f7ceb24ee9008ed51fe4e494b3b69bf9a5e70b7b44c0000000000000000", "service": "00000000000000000000ffff68f8c248", "pubKeyOperator": "11e57eaab33b0fc9c10ecc23159274b26f4610dfaf30ad7a1ffb23e664eadad377151a82d5ad3a493c5031c36f8ae830", "votingAddress": "35vApNoruM41JkDqvKrBaGvjRLn", "isValid": true},{"proRegTxHash": "fb37a744afa67856ef1e6a951c737157bcf42f2eff194a4706db617d1a913a1c", "confirmedHash": "80215437f577c6850855a6cf2699b2388884d11a999722e30e00000000000000", "service": "00000000000000000000ffffbc28f172", "pubKeyOperator": "839affb7e92629c88acb210dfba4cbe77d97e15faddfdde5d41bcd66aef6c976471a4d53b8b7a4a75ac2c90cff1dac66", "votingAddress": "4Hq6ptPhDRNNb2iqZhWv8EzYPX3j", "isValid": true},{"proRegTxHash": "cc682b30da9915f6efd689522f1e2049d625f7b0ef8595bf49a15317604e3578", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff36be22e2", "pubKeyOperator": "0b900a2391151f003415bb24bc0542e87206453026c95c41a91c2329e0db4a656db8f76d82ac5e250ad1960edb0851ca", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "1424334a16249d10bb989e2ffb5167a1ad62bec68935bc05149d9e0bf119dd55", "confirmedHash": "594c6c569985d30aac5c8e0855f24763ffa2355399a5ad040300000000000000", "service": "00000000000000000000ffff3353eacb", "pubKeyOperator": "8d59f1490ef664cc4967205bb1803f0cac5705c75bc06ad3fc45a4bb28496b191c362d3a084d852fdf5d8309cdef9ab1", "votingAddress": "WZroqbchqsgpkCHz6VBu3U3qzKu", "isValid": true},{"proRegTxHash": "65b3281b0cfe4a852580dceb0c55241349082e2a9295ace462374a0bd7043203", "confirmedHash": "05a0259454e52c948991c8497aeda443c38d4d33f238c1820700000000000000", "service": "00000000000000000000ffff68f89068", "pubKeyOperator": "036d1235afdd64db599ab40d62559c84a4951fc82ffe65d2ec21c2a4026edacd5033093febe3bc5dcc915a5791e9cbad", "votingAddress": "42fTaFqE7Dyf1yz3xNsCWmJx4XGc", "isValid": true},{"proRegTxHash": "eef5b17be49cae0040e3e8347a3bbb6815d446c59a6282ed2a7f4042f7855be9", "confirmedHash": "31083b47c4d85a181f8091cff0e74e5703ef52f513a9e75c1800000000000000", "service": "00000000000000000000ffff2d4c803d", "pubKeyOperator": "143de01e9690228288e8ae2d465fca4a164ef8bf3c2eea2d18dda2972ce7d637014c8db285259fa3b19c94b54e0bf645", "votingAddress": "4Qzv6PC1Qq7cHoxmLKSCCUEL6Ejt", "isValid": true},{"proRegTxHash": "ac868a405b3ffd5858fc46ddd91fa32bfc607b619a96707488efa3a422e5eedf", "confirmedHash": "6e0d9a7d2fd6b6b5fd66aca47c693713f8c2864509f703491b00000000000000", "service": "00000000000000000000ffff5fd87e25", "pubKeyOperator": "03bee7131abba3abd8af6ff80002bda74732ef3b1bedd3459f8fb8f2ece4fa78a5553f089b7ced1db231963066d3d387", "votingAddress": "MZU4CcdFjrJHubRqpGXVAEv9Sq2", "isValid": true},{"proRegTxHash": "674d74f30979f288bf8a9245276d8133db2e7a6e83c2543f3060db0927658ca2", "confirmedHash": "47247948e618e1b287d9faa53f2b8342a5ac6b656e94d9600500000000000000", "service": "00000000000000000000ffffb23fec70", "pubKeyOperator": "8d371be988812e3d35769b5fa47d9a4beb69a0ae20531fdb5998eaabfc31bdf2c0553c7906c4674744b3be8814afbde7", "votingAddress": "3ptGJEVK29WL31E5c3cMcbX6YQVN", "isValid": true},{"proRegTxHash": "7880c4325994f5b0b9ec6de4ccbbf571365a56858d5aa7c7db0936f4ee28ea71", "confirmedHash": "4d7c7b37588d78cc460e6f3c49e67bc5f4a5c8c1986404650500000000000000", "service": "00000000000000000000ffff44b7eb9c", "pubKeyOperator": "9142e8c95a9cec5b2bc0ae034030b0f8fcfd4818982184a79d5d29d67361e04bd6ccc98247c4642710f599833fbfb796", "votingAddress": "3qJL5eCd2eRHLB3SYxJ1AifGYtci", "isValid": true},{"proRegTxHash": "06be2fb6221d5d5eb0940f019e4bbc544ffd86deb6f5f9d975dacaf68a3f341a", "confirmedHash": "e45f49bf01c8b278168678fa6095506edc09937ad19bad2c0c00000000000000", "service": "00000000000000000000ffff55d1f27c", "pubKeyOperator": "00386e3964926a23ed0dcb286779576dfb2f104f0178b7a1b835da1923a885ced38195eb6d09600360f5cc495a4ed778", "votingAddress": "2oSHVFZr8aMxyhQfJGWBPGLFxMji", "isValid": false},{"proRegTxHash": "010972486f02f7e98aec53f4d02a87c525cd3f7defce6bd2a96cb6d364528639", "confirmedHash": "576225f0f7898d3e067a9d3e800bfc841f8de821567f99561200000000000000", "service": "00000000000000000000ffff91ef14b0", "pubKeyOperator": "1089ece5f54e1ea1eac7c293b54f92fd4f74f11f75af3d9eee16f52fcf3c7c05636de52b3b4d1a07fdc78cd76e419f1c", "votingAddress": "4PceJLxtra51vb1sor66DATS1Jtw", "isValid": true},{"proRegTxHash": "422e9585ddf738ab2114b1d1f6446741c3b350955897a80fb7ce39d4ab6da6af", "confirmedHash": "5100e4f7c2eacc3f3832e6feb4c44a38058a941d565483e00000000000000000", "service": "00000000000000000000ffffbc28f170", "pubKeyOperator": "01c4450161c3e980cd43dd30ee7125c8082037867d5bdca8552e5c3f5c300ec303989c28e99bbe056a2d88860fc03d56", "votingAddress": "2J6WrLwphQErQcsy2uFdpNFZzivR", "isValid": true},{"proRegTxHash": "8cd29bee02323eb99f2d17970fdf9e507af677417a08f95299974cfbdd33b426", "confirmedHash": "fa8f328521f1ce3fd4ffe0287af0aba6811fdc2febfa34e32800000000000000", "service": "00000000000000000000ffff258b154d", "pubKeyOperator": "84f7056258a524d02a64be8d31e41b1f6d8f19040113f66e8aa0daea481cfe0039bdde9a2d159041d727cf2231d2c57a", "votingAddress": "6DSEUM7rHr3Y9qVU1bEfKe33KCL", "isValid": false},{"proRegTxHash": "020b7703208b20128b9f09d8ad921c91dd9826d4629cae26a2c769c2b8828980", "confirmedHash": "153921b11a59503168ce1bf1d45e760d7b2f4ad06d75650a1a00000000000000", "service": "00000000000000000000ffffb23fec6c", "pubKeyOperator": "15873dda0f87d427d16b990c62b7e788de2ef79bfe0c5aa81938b6f36d727a12e87a2354463c15f12b532e7b40034360", "votingAddress": "2zfQWYJJ2F4G7ZTqkWxtqLMovh5L", "isValid": true},{"proRegTxHash": "6b0e980ea7a0d19bf4dfc5bef5815c8e86c0da80902bab44171def8dfe5ec825", "confirmedHash": "c05989676e136f916572c15c134552fe44a6e0915f4911091300000000000000", "service": "00000000000000000000ffff2f6e046d", "pubKeyOperator": "0d7d8965100cd11473a61e9fc3bc1a95d02a36cc264e71e285ce9fee1f2a974d46e7111d994606836a3a78c5485a63f4", "votingAddress": "4G5TYrtV12h6gvhCLdJtYPyxHckY", "isValid": false},{"proRegTxHash": "69c738cda53fab943e5a9e714a6f8a3ef5e795eb182b7570f0ac29b47e6d7172", "confirmedHash": "a6deb021d8cac8cb9005cc530686fa7868f8c0c0db28ddc22b00000000000000", "service": "00000000000000000000ffff52d31926", "pubKeyOperator": "99aa464e4fddfd1174e3048acc5be97251539b4289d6f42582ca85866fd5c71a9292577eb4ee534459dbd147115a4a8d", "votingAddress": "wAPAxEvumvuFQZwc2XN2rLdcyn1", "isValid": true},{"proRegTxHash": "e16be9c1f0cc0c6dedf2ea27b8bac332e2bc0071baa63f80cb107cde064c0e6f", "confirmedHash": "e46907423e8b46cecd8e269521ede064c9e6b7117fbbb9721400000000000000", "service": "00000000000000000000ffffb0df87fe", "pubKeyOperator": "14c33ef4a2d20c132ac7988d26534d80e974e02bb62ec46fb1463fb9c702c74fb898eda359012f2ff9c195fad9125b13", "votingAddress": "2chBwnKPEUF8K94u5ndBnEY3ANst", "isValid": false},{"proRegTxHash": "9b8979bf8547f2f5e831f3b1103fdbf25ae4d02a23ed7df41ff9782eb1fceaa2", "confirmedHash": "353b68a234c373a1ea9ba6ac5676311ec9ee916b281f86921400000000000000", "service": "00000000000000000000ffffa877f1ab", "pubKeyOperator": "085c12a75ec818b23d38337f58a962a6c7145c537d8859e65561bd8ba92e81ef45e1cd2431408476b69512b6b72bf96c", "votingAddress": "JA3n9kAKude3puCti7YGheAMLQ2", "isValid": true},{"proRegTxHash": "2cea12115b89b77495d0f805bb8b1bca8474f92d80ce764784731bba75f9e74f", "confirmedHash": "fe262375a8ceddfd2d764b03895f7a14c0f42124a8a330550000000000000000", "service": "00000000000000000000ffff88f31dc7", "pubKeyOperator": "0255962eaafdf2953cad2c012a5109fc7c162b1f656859e1cd40d8511a03c911792477551f2aea8d5466cf7b3a744d63", "votingAddress": "23PQka29A18E8pTNBXz64mBcGTCu", "isValid": true},{"proRegTxHash": "83c1b91031bf3f067a31a67ce74662f50b6c5e69449d8ad928389d4f432bd672", "confirmedHash": "1d0c3666ee58684d185a9f46a59918b6931810e22cd450d42c00000000000000", "service": "00000000000000000000ffff2f60deb0", "pubKeyOperator": "95d98d66e9f925958bbb969cb882bdbf43450e06b9ec7ad51c114153098edd73c0c68c8b4d17ca1001964e03098d2f64", "votingAddress": "3stv714ScAnHCDU5wkiTr7ahTwnR", "isValid": false},{"proRegTxHash": "ed110c05096d2f445d631a44743b11f867ac67070e5f77865c9f7e0a98d139de", "confirmedHash": "8378483759aef44963d5f1ba880a698aaf8fc435c0d367822100000000000000", "service": "00000000000000000000ffff4622d269", "pubKeyOperator": "13d0fbbe1a6812c94aefc2e34d517652115a09de4695deac39a7d34b34f1de302414456352f589de243544bf54adfbca", "votingAddress": "3EXEdvaQCQbRYR3Z4kD8HZ3ayztr", "isValid": true},{"proRegTxHash": "4214e898a1680b35e0c76b38db64fbda1af01c299a21c28ac533d11c80d6a27c", "confirmedHash": "4868cba3843088b95b2374e9f15e35c0421e321fece45ebd0000000000000000", "service": "00000000000000000000ffffb23fec67", "pubKeyOperator": "8cf96ffb6230fd9a4072970b9f1c3eb172ef9e88ec9aaa173130fd25aef55002d2ecd49758673ab07b1e99e1c102e8b7", "votingAddress": "23FRKDMXqFY6y4s8a3aqe5VFJUqn", "isValid": true},{"proRegTxHash": "4b55c19dfd7bd9ba8959aaa0e1d477e9f611e9afba5cfe9d77d59dcffbe36b4a", "confirmedHash": "4c14a7a1d8d419979df8cfa1fe4c4613add7bd6dd61f3c360000000000000000", "service": "00000000000000000000ffff5fd84fe2", "pubKeyOperator": "8abad7540a8e2e6d7f8eecf45ebb2dce95d8b2634d2b86ebbc7f5f9e6f86985a7ffeb175b5ccf2db664dfc5276bbc2cb", "votingAddress": "3FmWAekScx6fSLyhvu51pfqGvs2L", "isValid": true},{"proRegTxHash": "c5839a39b0f83abeae8b3ae1f31eba95bcb82188e3b84f2fffa6191d26deb82b", "confirmedHash": "8bce56059cf3d708cc94cd579c7f700ddb13d89d3c73176e1b00000000000000", "service": "00000000000000000000ffff2e65752e", "pubKeyOperator": "99cf32d54f9f555a4ffd6205172dff7b9008b0eacbcc703f188e8a230679865692845589b0f1d1a29b1847a6bf9774df", "votingAddress": "hFD6VLdgTg4FkKGAR1S8YhxWv8Z", "isValid": false},{"proRegTxHash": "653338f485a87ffb5be5bfdf0564e212cb7f0e9afa53a166311f5e30fd455f3b", "confirmedHash": "a87e1624f172778eaed20c96a60f60c813aae3682aaff2b00f00000000000000", "service": "00000000000000000000ffff9f5905b5", "pubKeyOperator": "819ead3a9b551a2a167ea80adfded7d739a99f0a06bc13c18c7333c2af67d27e77258a1c6d31e33019439f8c73903f73", "votingAddress": "Ra5hA7FvWDEadroPU6FXGbnhb4q", "isValid": false},{"proRegTxHash": "684ae97f6bd6441500b6b4d79fce21f393583c59c590ff67aedaa0c32840c44b", "confirmedHash": "57faad271b8d8b45c343e713c0c35f0391258a69e8588a2d0500000000000000", "service": "00000000000000000000ffffa8775306", "pubKeyOperator": "8e964968e6a1eaaa1acf8687bcce43d4b116a395f7cac4338f7fa44c446b5f18aab10b0d342ee3709f79cdb2527f6ad5", "votingAddress": "2mCCnWys8BAAFtbJbHdA7vqXzTQb", "isValid": true},{"proRegTxHash": "258d833cc3391ee4cddfa4cb508c0025ca0055ebbacb07abe8b1941392a51109", "confirmedHash": "36e255211b1e72382e078b646118ddbf5ac4a0e35323fabe2f00000000000000", "service": "00000000000000000000ffff55d1f108", "pubKeyOperator": "85abe7166acc5fa57890138913bed8c3fff0d98bd0c4d055dd83b1efa4edd13a056952f67386fbbf6793556785bf3727", "votingAddress": "2AjiTCZ916RoLQEyoGtBjqxa4Dq1", "isValid": true},{"proRegTxHash": "f3a4ba763a895885d86d1a7a60344a4d1aed04deef95227dc884ff6c05c11a57", "confirmedHash": "c4856ff79eafb7662e09200d80e02976ec21da091d8dc0880600000000000000", "service": "00000000000000000000ffff9fcb28ac", "pubKeyOperator": "0c34186b0065b0d608d85c73fd1c532243b3cbf9c4e7a6cde281913288ff3ac15cf63837ca14286d89739fd2452a5126", "votingAddress": "2WH2tSnz5J4rCfBFt6jsWKZw2sfM", "isValid": false},{"proRegTxHash": "c692806d1bf16d685172b496a430203a2a138367047c0226ed8a469001f934ec", "confirmedHash": "0cfb317980922dd907501f332fe630e70e11da96457434d41400000000000000", "service": "00000000000000000000ffff05b5ca2f", "pubKeyOperator": "109931166a4cccf85f7fd58a98138b9f7004767c26f9f48964817e75b4b46200c7cb00f64b1668982508ede2e9797dea", "votingAddress": "2MPxP7AD1bZ24Vzd8XLCpR4oRT6G", "isValid": true},{"proRegTxHash": "2a47205f5ae298d4830eb9b2a03b6328e2722041cba72787f61f9617eb54d38f", "confirmedHash": "075f378284b1912da7466b912f57e7908a2a9899c32a83b43500000000000000", "service": "00000000000000000000ffff7928d46b", "pubKeyOperator": "1337395e125eb36aa25a43fc337261869809f62a5adb925dd2b7f3bd7d37508e57f20e743c133d5e54d3257ab18de38e", "votingAddress": "371Xeg2KfSXEfWGrnVEoWF3hCXcQ", "isValid": false},{"proRegTxHash": "98b5a94c23a506f1c2b74b6c2c01ac6c4cbb03e44f1cf4ef3cb82b360dedf1dc", "confirmedHash": "bef2d06a3dc30e9a0b480078ac0b1cabe70e7fb1594d84410b00000000000000", "service": "00000000000000000000ffffb9b13b25", "pubKeyOperator": "859d3eefb432a6dde5855501752d778981a92de08b6a0882581251eec62111dbf950594404bd873b6c53ba7377af87c9", "votingAddress": "22M9RHJfcKjGAAYtBd3mVuv2JMSB", "isValid": true},{"proRegTxHash": "385e7be8dc85dc20e6051fef517fe65cd79aec46d2489383c43341110a5df3ec", "confirmedHash": "2d5d2cdf0f1e52003af966b536eb2ceee73565fb5ffc748d0900000000000000", "service": "00000000000000000000ffffa2373604", "pubKeyOperator": "101a0f616d0848dabfe12d5694ca420232a64def35a08782d17218fa263d9415f5f2bd8b5e2fc2ec1f4627cded81ef1f", "votingAddress": "4ST6PNZMPoR5wiEL6N4brqHdfNDK", "isValid": true},{"proRegTxHash": "2a611ab3104414b985ac6de9cc2411465739ba09f8218dc6e435a0758a726e86", "confirmedHash": "7bff4f371c94a24bc8bd45d996e8e1e504972248543b91fb3500000000000000", "service": "00000000000000000000ffff87b50fe8", "pubKeyOperator": "10ea71b10574820a89a5b4b2eec685a82be18aa0ebeeaa49e2077cac013ee3e3bb955f2c7323b880c568368a579d98f0", "votingAddress": "2ky26QYkWDSfpvMEGdQdzeEiVL1N", "isValid": true},{"proRegTxHash": "32fb377f12efe177e54dc4d1d0dd4a8c8a9b2de64ad29f4b3d97b0a6dcdd9e21", "confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", "service": "00000000000000000000ffff55d1f1e4", "pubKeyOperator": "052768279662dde58004c839fa200f66d7ea94cc15d8ac3b835290b0a28f892c936978c320872a1e673056f839dd381c", "votingAddress": "3mqUYxV3yttwwU4kxGm1xiVh2Hoz", "isValid": true},{"proRegTxHash": "45bda7682be5f16744fd9cbe12f360227b0803b214da3e88693306dec1da5973", "confirmedHash": "d0974d81bc4e43ff15feaf30a660a56beb90de2ed64d7cc90400000000000000", "service": "00000000000000000000ffff9de624a4", "pubKeyOperator": "0e75caa4c87c3ce627aa938c2985a733d659c481cd49e87bd70122d23252aeb2c222470320747858900af9e41b63f94f", "votingAddress": "yA6gWwTUhFasihsU64mT6DB25ph", "isValid": false},{"proRegTxHash": "8b40b4150198a80883ea6603a43d4bd1472d22cf0db5998ac7dedb3caee7403c", "confirmedHash": "a6873a5c3509b76014febd72d67def5ab45fae75f6586b101800000000000000", "service": "00000000000000000000ffffae8a02bd", "pubKeyOperator": "82daaee2f7693028dd02369f4494195d1368ede9cc16691c40b5b04d793948b85b89554f011b8de683a68d07e692b7bd", "votingAddress": "3HaXgsEeg9Uuy8wCQ1xiKuarBF7Z", "isValid": false},{"proRegTxHash": "3cdf94bc511fcbe91bfac953628a0182df703f3133b72b036b0b598689a695d1", "confirmedHash": "a02627addd9ca0c6b6df724e1c61e9cba8d6b717159794222400000000000000", "service": "00000000000000000000ffff2d809c4e", "pubKeyOperator": "93532b6391c75c94ac83ec94e18327e1d88548f8c62066a1cb6f82161c26790a84c97e5ed02f845d4967ff1ef34e4dcd", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "d7870634db1cff0478ccf3fe987ef4910d2826f83487722f9d684127dd125686", "confirmedHash": "b28a1830a2bef6889f27a5a7092684d9ee25f614c61dea2a0b00000000000000", "service": "00000000000000000000ffff88f31dc2", "pubKeyOperator": "95fbf469f07a77d77c7c3c89f8b9991f5343090ec3a4633a8e02048cf388f53ad38ed76fc53563ea255fa6303c56da1b", "votingAddress": "3mURktye8xfKHqDvgWJx7YedSbAX", "isValid": true},{"proRegTxHash": "f41588f6750af838c98c8ad91fc2d058b8e9718a60c123d518541e4f95e5c835", "confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", "service": "00000000000000000000ffff87b558cd", "pubKeyOperator": "143fbf88434d2fca7a1bc83a840de40e35663d32f27438e3314bc057f9fa685fef06c0ce3c233c95898b58bb03cc5957", "votingAddress": "3WjKdJEWLUo62dXNPu27xLSRazL6", "isValid": false},{"proRegTxHash": "05df5985916a31cb33a8a2346665224bba70f8e632efbd982d440e3c8f0e9987", "confirmedHash": "8f035dde1561c32197d4c8c57d8b913acee537dc442367531b00000000000000", "service": "00000000000000000000ffffc60d342f", "pubKeyOperator": "1641e02bd394169ffc582c2bbded13599a1312574641d61a3b559be849a5267719d03b6a488eae0bfbaf9c4953bdb393", "votingAddress": "44wxJLoipYk27C9QRUDPHGGbVt5Q", "isValid": true},{"proRegTxHash": "5a5c7f0f3a842472857757325f2a8ceb7e75ffcbc23de2a5c931f53bb3982dee", "confirmedHash": "d14c70c70106d87958e6a301bce622f792c0abf3688d97cd1300000000000000", "service": "00000000000000000000ffffb9e45382", "pubKeyOperator": "996ec2dacb64ea4ca23ad01d53d08fa418cf32f7765e14bb0af87b92263d7afd690efc3a2586601c98683068016be2ab", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "16c8e7ea0f7eca56c0cb39d4aa76c86115b9210cf3124edca844beb0e237509a", "confirmedHash": "16c939a656540bec874aac641205a573fc55e949664cac860400000000000000", "service": "00000000000000000000ffff2d4c5d46", "pubKeyOperator": "060d1bc2f821b7faea0b545352d88c1a465581106613cd5e9a30f2396de78361e91e8cda5c61f006bf67064ca5a1ba94", "votingAddress": "YTrdxKLXyLQQcMue2BR8MddL6A5", "isValid": true},{"proRegTxHash": "49b919ed47b4e63646815a986fc0bc34230b44a5fc72b904b677fac498a0d0e4", "confirmedHash": "1340bb233072a7c53e8e83731c5d8ca3bae8feb9068acf544000000000000000", "service": "00000000000000000000ffff3625c7e1", "pubKeyOperator": "82ee2a9db8dc0aa59497b655e9f0adb3870fd6dd7c079c61d280fd5b535fd894c905a21406ce580a670f00a8dc393f5b", "votingAddress": "4HZXGP8mdFXmLwKCQBxru5zsE22P", "isValid": true},{"proRegTxHash": "b32e72402aa24da57c411b2cab68129ba405387685deddfd391647bfb7088875", "confirmedHash": "e27047e73eb11796a53485437d789a5b4a60649850b232fe3200000000000000", "service": "00000000000000000000ffff55d1f19b", "pubKeyOperator": "0c806f4177024555fe4e9c63c3eb74f9bdd42c4e4359ee3209b6c72d91f6e14e4121c5c004ffe2595132cbff65dc66ac", "votingAddress": "3htCoUWh8kxydsWStQVJANXXJACC", "isValid": true},{"proRegTxHash": "4a314c124db4d340ba8c856c61b30178116bac22d23a71cb65ffbe099673a460", "confirmedHash": "3d7398ec65985287c4b81cfb181f9386100bfbd47912ed2a1e00000000000000", "service": "00000000000000000000ffff55d1f12f", "pubKeyOperator": "9848f22fe0a090f83683ff6983dca9d10a73e27223d5d5f9964e5118f6ad0230af889508198d7bd65e3cbd1597e2a88b", "votingAddress": "2AsC1P68DmeEwhPWjdrSWCEHpZCQ", "isValid": true},{"proRegTxHash": "01a2769f65b96bfc84dc8fa13f5efd97cecdd8241c3cfeebc027bfda5e7ac04b", "confirmedHash": "8c30f68f4131396e1ca0d479a0ae2fc58ac4ec9d1d914ad63e00000000000000", "service": "00000000000000000000ffff340e975b", "pubKeyOperator": "900f9553cd77d98b6573f7d086f908473af47cd71284e305a7be144d5f080b7e14c45b29cb5ec76d5d8ab138cdce89ca", "votingAddress": "3CbTA41nnuKSPQXgVQrUnf2DoMbf", "isValid": true},{"proRegTxHash": "6fd715a9ec15b71c8062e9852dc3967bd704d359c76566e4b39f4b57a95da01e", "confirmedHash": "9b5bc5f246bd929d5d85fc0a4dc95df780c83751bb96832e0e00000000000000", "service": "00000000000000000000ffff55d1f27d", "pubKeyOperator": "94de8577ebc89dfcbd3800065a8684ffead2b02b67363fe7fafab4e8d7bb7287838014b1002bd14f7572245ed22d02e6", "votingAddress": "KZ3yG1DTXCQsQ6K1kMPWQKWrE3i", "isValid": false},{"proRegTxHash": "0f5f6ca34dcf9d7e687193cc4bdf8a690e13f3d733c2d344bc6f46ba8a4375f4", "confirmedHash": "8c6add2e7a8f2a416a912b032743c3c4cf98fe5c606e34123900000000000000", "service": "00000000000000000000ffffc2875145", "pubKeyOperator": "00549d47d26428756d26e0e3fdc4e388dcaf059b5b8ebd2b19997a594be501f7ab6db70ff9527e61f036cbdbdd411422", "votingAddress": "DtAJSE2K2BfZS9WYCjnfbbZnxw6", "isValid": true},{"proRegTxHash": "9ca812cc2902f46bc2d412eaa558dcd60113061c25b7821a69ee4b148c4d6a4f", "confirmedHash": "c61e2ae74231ef41f78e4eaac1d6e6064c624766d3bcdf7b2d00000000000000", "service": "00000000000000000000ffffc2875a41", "pubKeyOperator": "0a7f1103715af39799693715a29e4f66b1e9d91b84a5590af9e33c9717d6a1e7aafa3bbaf80f558345123901c5d7f6ef", "votingAddress": "349UgPkb4qF3gA6u5Gx5eKnv8s9R", "isValid": true},{"proRegTxHash": "d7464ba61440e03748b0a10ae09df4a69c0d1535b55875e8a023197068c136fd", "confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", "service": "00000000000000000000ffffc2875c32", "pubKeyOperator": "91541d25faf702aadb2de5520561f6445873b9fa07a5cbf2c5c4b0a01e182fa9c597c2876fac063eb1ef54db0f4f9f0f", "votingAddress": "3HKdDdeJ4zm1EWGcABhpLN8o8xG5", "isValid": false},{"proRegTxHash": "d3fff8c7bb913766ad3e98a1d36586c843dee91550063c59f917d96955b341cb", "confirmedHash": "de4bfb134d277724e36535098b0629380483fc74bc95bf0a1300000000000000", "service": "00000000000000000000ffff55d1f1b6", "pubKeyOperator": "80da66d80b43fe9f94dbcae9ffa30a05aeaf5cf8044fc5899abb4294e4b32ad1e1b5917f69dd8676ab85a41a1a12fb4a", "votingAddress": "mMQQ6ymEdKbHTKEMCqAoJGXfND3", "isValid": false},{"proRegTxHash": "64affb9089c8857635e937c78e4be2bf983d0bc49250f4c3e84fcf6588b9a017", "confirmedHash": "bfb93d26c990365439d4a32b92f45fa580c0674dcaa63f170100000000000000", "service": "00000000000000000000ffff55d1f1f1", "pubKeyOperator": "05c0d63020ef3fc8c7ba920a72c5b06d06069bbab4644d6fa0cf27301cc18e752f197701ff407b5cecd1da9e55a7e563", "votingAddress": "i1rxwdu8oC63Kw1DVpJ5Q2gw8U3", "isValid": false},{"proRegTxHash": "4526711909db55c30944f6fa3c03581a072bfdabfeb49fcad9e10be1cd20ff9e", "confirmedHash": "de99165f362db3ac1a63790190b1776ea7e7abca3fa304671c00000000000000", "service": "00000000000000000000ffffa516169c", "pubKeyOperator": "8a931b27331f51698045a2c025d5249ea21d02e5e48650a3c92a015cd43e0fffded4da40b9791c165673d8880cd46f4c", "votingAddress": "42oEdRDQ2VdCSQER4qCTPiTGRCcG", "isValid": false},{"proRegTxHash": "4e2bfe95f352565b59a4dc9dd9dc20795a847a90255e99cba846aaaa97aac9f1", "confirmedHash": "b9eabf3b9ab8ec3f0a2cfe50266b92c39a4aaf32335633b00f00000000000000", "service": "00000000000000000000ffffa8775304", "pubKeyOperator": "099d873da5bae1d45df98612a94410450cdf0d2c7d65e6a8dcf85b96d8a945d76cec48f9820c91248bb7cd08c8bf6953", "votingAddress": "VSXhqer3s9mSpByLZ9WhPPaHum3", "isValid": true},{"proRegTxHash": "47d33f6acd62d4ccd0576cd179a03e75ce643fe2e009ee05fbc614d3b1d6f79c", "confirmedHash": "582c31b4671dc01fcbf76a9a1c2dc62b050149f4ba5f244d1900000000000000", "service": "00000000000000000000ffff6883863e", "pubKeyOperator": "88d1143861eefb3c6edabe2933e1af5356fe6f8cb63e9f92b42b676a72652d4c6e889079b8a7a3b83bd54afb5967779c", "votingAddress": "229cRJVbouMSckLDUwboad9nNHed", "isValid": true},{"proRegTxHash": "179429fd62c2c36f65cbd0970f958d30061946665bb84a7d281b1b1914eef747", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0ae", "pubKeyOperator": "80e8a84293ceb212f30ae22f198bfc3f708264160fdbf84ef5d81b4623f4c80f212a263d1923c73a911e81401c383844", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "481425803ff1643aea575f9f41a39b58d4ea6f1270abc307f440e7df44c9c779", "confirmedHash": "7cda8921938c300240120da22ce849420a62e494a23a22053000000000000000", "service": "00000000000000000000ffff92b99e08", "pubKeyOperator": "164b73f253782328b9181457ed4b57b8dac1ec4a8331cab230b48f88c6ad66fcafadc8ac10ef77cac7c8724e4e2c5d72", "votingAddress": "3c2NEcvy11KUeGE34DL9mQMXFDU9", "isValid": false},{"proRegTxHash": "315e9e924eff5e9eab29fe097a2b6a1fe1375f5a42f5d866fa7f43df3cf9d86a", "confirmedHash": "a22b43fc14cf89f4250ab26b4d9707b09b4cc9cdc8e2b9c10700000000000000", "service": "00000000000000000000ffff0301f9f7", "pubKeyOperator": "91d1be870ed2b60fe5ef61752a1c54299a2d5f3485d81d80b05913c774bf83c9c4bb4980da5e88de4d091bc52e4d433c", "votingAddress": "4Z6c4eXPU7WyZf3oFRzZAtu7nEiB", "isValid": true},{"proRegTxHash": "74145b0442e1b04ae787b4f38c69bb4cd6800e0ef2a2b217bcae31952586efa7", "confirmedHash": "203b420d0f94416a61ace28aa860ca47487b444368664fc90d00000000000000", "service": "00000000000000000000ffffb07b39d3", "pubKeyOperator": "167ac97e2a62d1a7ac5058b4739407fa052891bddf6a09c78fae0ab145bb9f04101c137d4b2733b4735e18c1c3e0c940", "votingAddress": "4RJZryx16fifLhSTm2uLh2KXJHJC", "isValid": true},{"proRegTxHash": "0ba0d5e7ab29879d55395242a1c62317c0590c7e987ef5dcd84fd9451eab766d", "confirmedHash": "0e16f2827da5d9d0a494e4c4c828e3a9a34f23b8eef552dc0100000000000000", "service": "00000000000000000000ffff55d1f233", "pubKeyOperator": "8376522e774720779dc375cc1026ef8b17e24399eeb27ec5c0f644189c419bbcf91ea5142fbe176882c451184f7f081a", "votingAddress": "2fgn1tRsdYxLxj7ZPPqaWwQTbrkL", "isValid": false},{"proRegTxHash": "7b63fc176e8d3c7b768999c70bbb13b241b422ca2aa0c669f2f1d86f94a6d2c5", "confirmedHash": "0238f63ab8326fcf0ca20201e404c3ade3e518852b06955d1000000000000000", "service": "00000000000000000000ffff867a379d", "pubKeyOperator": "972469f45fde362d563c3fc80a3ed5f3a26bcc3799eadad1ed0e8bea2e324e19c7c1d31dad7f8566cc9cfa06bdced2b6", "votingAddress": "bUDDqF1JFPhcTd7nL8yENTjNMRJ", "isValid": true},{"proRegTxHash": "222a0b24d8477cbde28a97a6c9de1cbce9cc9b63d8b8716987b4d00d31eca1c1", "confirmedHash": "1f95d2d3592dbf85f2b0985da6a63d7fee60c8c1b436c0830100000000000000", "service": "00000000000000000000ffff58630b14", "pubKeyOperator": "156f42daf3f9f79fb626f80fc99e3aba159a92a46f8ed0cf150f5891520fbe01a02d9f1fbc834465101e36635e34e8c5", "votingAddress": "nM9kR38H8sB2urid1H6CvGERPJP", "isValid": true},{"proRegTxHash": "68e18490e3b16d0152baaa129bfc1240fc22fcf245ef9a1fe5e8885f2c6b3b43", "confirmedHash": "c58971671ff2e5b2629c64cf449fb208b7215008b0a2aede0a00000000000000", "service": "00000000000000000000ffff52d3194c", "pubKeyOperator": "16568919752dc933c2d29f91e6ac476d2c2f5c7b48891f32ef2c2f5746dfb3393b5394c24ab4f4cde44c5b388509d849", "votingAddress": "3YPEUZT4gfv5v6cbznHSyNBU7JNV", "isValid": true},{"proRegTxHash": "914f36334b0b7230282819c1ac785b4e743343778896dbe4355263f3a1620615", "confirmedHash": "29709d2f229dd657ceafc32b893cd9ec223ed6320bbfb7b71700000000000000", "service": "00000000000000000000ffffb94068df", "pubKeyOperator": "95a5e2f352479fc32553b07b20f0a8861867ae6fa86b1ce74aca455c7c03397fba30e9c958cd71fc986b0beddd1a7442", "votingAddress": "3M1fc9Acy21PJHGteCz9i3jYdoxu", "isValid": false},{"proRegTxHash": "7ea3664e841fc15e82802403ea3069d22ebe101f55d34a71282d2789c422ede4", "confirmedHash": "1ac1125cc980723b882960b69df10c571e477185bcf684b81000000000000000", "service": "00000000000000000000ffffbce2a180", "pubKeyOperator": "119086d0021daac6851edd6276eea8ceeac0ddaf6b11a284908f644879449de906ee2cf37d50757047b67919f8f95ab7", "votingAddress": "3eQ1ri8Buku9wt3hAVsawsGpqM2x", "isValid": true},{"proRegTxHash": "6a0ade75f691838503ea4dfe12229c6440926effee5e92331d8e78deb67d1861", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffffc17a9f8f", "pubKeyOperator": "08432040c2327d48745860a5941208ac19d29c6e3ade37e47b3f26f2967bca708a2fd554cd66f8291de5bf2956c6a0df", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "cc45201a81bbaa97913ddd7b0d40eb56a713bbb562f3fc9bb2b60f08f9d873d9", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d5623c", "pubKeyOperator": "90384273ace180a71a497a3993508cb5467f6fb7f70f0c5fa9790b2fd317bfc746711c453b62d4862be5e7b659c52407", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "a79f0ca4e20463ed06ed1e2defb17d6ebaadae62173f477fa36efd9f4239941c", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d58512", "pubKeyOperator": "093087fa7159428e8f07ca8543f63d858d6ec61fee8d1ad87f141c453546afb53ec3306498c4a3a6d8c740cb0957badc", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "377e6246356ad6b35a533dc94ac5fc7caf2ddefa91b7431421a34c82305ad2ad", "confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", "service": "00000000000000000000ffff92b9af9a", "pubKeyOperator": "94ad6780fad71ac61ec7cff84cf68ca7be50bf5531175a4bbf1e6e9ae501ed747ea5c7868042d653e482b3999d3b4f27", "votingAddress": "iBms6KCaYTzMvMbtEehfKdvigbd", "isValid": true},{"proRegTxHash": "8da64b88c61ce867ed1185bcc3ada382a03c7a307a4acc11b809dc3fa3c57f86", "confirmedHash": "f4683f80166863bf0eec734760aca2a311aeb0d077d65dcd1700000000000000", "service": "00000000000000000000ffff334dc245", "pubKeyOperator": "85272f97036a1176acbc24ce67551c44c5e4fd543b68408212365346927d9ba038eabea87e9189255bbf8172defffc1a", "votingAddress": "WJwgb5sjkmkosq64MYbUseV7QMP", "isValid": true},{"proRegTxHash": "cee65440f39cafc81aa2702690880a751021805ce94731b67756f3896973ba24", "confirmedHash": "3001eec6eefc78b4157d5bb2d71a2b968a5ab664221972c60d00000000000000", "service": "00000000000000000000ffff86d1b918", "pubKeyOperator": "8c4bb5f02613c2504d3b305e9b9acb29b36d2da2df3dafc975b6f2d849c650ce099a25b861d2309cd6919f4dbe645655", "votingAddress": "VtpDXNYXMeYYVJSHwgmi8m9DRt5", "isValid": true},{"proRegTxHash": "64cd19d4d4800ce83692bee8c9ff948eccac6f4d2ff33883d60f18fc68dfb29b", "confirmedHash": "54b1326c6bc695a1b6fa4ed28960e001b84e8d0dfa70ef740f00000000000000", "service": "00000000000000000000ffff52d319d3", "pubKeyOperator": "0ec3cc07abc9478105452505767dd850dae2328e43130985d5e1051fcafa9641ed27c1b3093aee1dee39ab36eb6789d9", "votingAddress": "2Rcs2WJVkCrwT8yLhtfppcxLr6h7", "isValid": true},{"proRegTxHash": "136876d864064b8e5c65806262e9abeba73944f6e986a08ea9799dc3346ee2d8", "confirmedHash": "5ed4f5fc30e936bcc9c149e0495d75962417f1653c1a2ce71f00000000000000", "service": "00000000000000000000ffff52d315e6", "pubKeyOperator": "0662ce293367288a2a20709a8e602919bdb529aad4a3c2fe68b0be06b26d71010d8aa98cf23af31973e7fa7f2c4a4868", "votingAddress": "2R13PiPDNfX5NnuD7LuWyZkwuoi4", "isValid": true},{"proRegTxHash": "39bc6315d3b7b17410e05cee799943ba8ba31ee7b05ae3e78b29126d950b1ee3", "confirmedHash": "9a78f25de1aa064251c64080334698f87d6d7b87a618cee41500000000000000", "service": "00000000000000000000ffff5fd87e21", "pubKeyOperator": "08248896f11e4d6cefc7d13e714f66d5b58c33e53348c71462fa2519419fb12f2f806eb3ebeb950482b7eae9e9caaa4f", "votingAddress": "2JSUfnMbWEijwaJyrDomfToJxux3", "isValid": true},{"proRegTxHash": "3bdb28366138cc6c65730d71c31a8afbded20fd5e98e767ac07b2029b1b6e5e4", "confirmedHash": "d8e25e5d4581c1c387012a714f499815651f684b301bf3071200000000000000", "service": "00000000000000000000ffff52d3153a", "pubKeyOperator": "86630fbbd90156acc362aedc9fa48f95c461ece5139f69c4e612cc0efa2568a2a8685e13c42c18ab177b4faeedc55532", "votingAddress": "36wMXh5tzLp74maEctnqePbwuGVM", "isValid": true},{"proRegTxHash": "a68cad97327f0b6faba5965c1f4de11a36c1a24547f504fc8da8327184176dcd", "confirmedHash": "c2d2bc0436c1e5c916fee275944adb042da2aaf63ac2e9db0700000000000000", "service": "00000000000000000000ffff4f621fd8", "pubKeyOperator": "1015988b03c2739576338484f5bc78babbe64dcf6dde9e10ca4e6a41ea7a0165b8019dd56e2190dbe7385256ed574dd5", "votingAddress": "a4vBXsWZiQMFBxWCkC2FxFfFqrE", "isValid": false},{"proRegTxHash": "67a332c57c9195e0e336fc878de6aa0c56c81f50dca8acdbde696d9f8cd2f6d9", "confirmedHash": "bd31f35c5cedbf07c6ffa716f2a3acf8f725ab42af8758740500000000000000", "service": "00000000000000000000ffff453d6be8", "pubKeyOperator": "8a27109ac57caf6b510ae5d29e4052fd55cbdb02685d0334dbea3bbb0017d06cc4e6852874d0bffaf1a2262b3c44134d", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "49cb8577501b7c6d3a1a595f1e035c639c750c2cb5a9ad65befa1d6a515a9cb8", "confirmedHash": "cdbeebc4a3580b1d894014dcafb37c7472a5131b33ac100e0100000000000000", "service": "00000000000000000000ffffc28752f3", "pubKeyOperator": "10cbbc457e5e05005674b160ade10f75c736661ccff1a14f94764d07b214278d5a06cc23cdbb364c40101573ce3576cc", "votingAddress": "UpDBq1crudyw7vLW6Te6YnSAyvS", "isValid": false},{"proRegTxHash": "9f86a07f5623dd011bd2dde55682b7c018870a6e9551d0e3a9d10e10067e1aad", "confirmedHash": "490688752ea417d09a6ed12036998c9731e94bd520a2b27c1d00000000000000", "service": "00000000000000000000ffff2d20f39d", "pubKeyOperator": "91e4e803d5f0a9a9043bc314995f0561f6fee65ad56346ee9a3681bdc90e8fb5440aef04a0a3616757b30e2b19729af5", "votingAddress": "3pT4RtUcdtQdF3umHFkVBFxCc6ep", "isValid": true},{"proRegTxHash": "b19fe8c03e0c6ea98b52820df54480ef782915667ebe5d8984aaac89fc96aca6", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d52b9d", "pubKeyOperator": "97c6b6aee44c6f82a09cb521d64eb26b2ff10c1cc8fe78cec386e253a15ac38e47102417ed9fbcde751065de3a795c26", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "d5fa2bb1607983f610c589f60b511bc3a6b100dc363d6f6e715949ae7d563dda", "confirmedHash": "79be1ac86a7432a51fcca6b157caef62826877ae21f0143b3000000000000000", "service": "00000000000000000000ffff6baaeef1", "pubKeyOperator": "15587add8368454379447eb74e2bad91dbecee73430b6dce96eb6487cd37285a8959aa58a6fdf37c17592b4892d84687", "votingAddress": "3RbGSi816dai1E6B6fHrxgcCm1LV", "isValid": true},{"proRegTxHash": "aec256435f8de2fe27a68822638cacc6bacd07aea2fd357512c690dff2711885", "confirmedHash": "65043c4ed9e6c9a6ae5ea00bda39dff568f6fc7659651a381c00000000000000", "service": "00000000000000000000ffffbc28cd02", "pubKeyOperator": "04a019f629360436dcdf88117b9d636b1494bc4b20e9aac77f6f62eb2f99c06bd18b713d23e005e405bbaff26bc34022", "votingAddress": "3jLD6zxow7eXaQDHZ6eHGE6Eo3Z8", "isValid": true},{"proRegTxHash": "d79f638b6e9f2088f68438e00a7dcb247e00e6cb47e809b4e7ad25578e40c44f", "confirmedHash": "fe73472c7776ba0335f76108760d4f0ad5f695b290ed771f2a00000000000000", "service": "00000000000000000000ffffbc28e710", "pubKeyOperator": "995f45b6dda000c9b83a92cfd8101a54eeb57b54bb71bb2ab5c990ecc21c5759aa2cbf185116de81d0aba9bf03bfc0b0", "votingAddress": "2VUmfsbsAPWknqR8qMVQv9Fd7Edc", "isValid": true},{"proRegTxHash": "1a36f7c6acca78004c8c013c3de55849f5b73a7b6df3fd752b8d4b5984e15f12", "confirmedHash": "bf666921ed37fcc81ccdb385da84f4770dc21325b6605c280900000000000000", "service": "00000000000000000000ffff2cc251e8", "pubKeyOperator": "890bad1082bb7110f5369e491e45713a2638ee386152857832618b0133c0e9309541bc949afa57b7ee044203c94e07a6", "votingAddress": "37NrBhhxwQdHohij6ijPxQJgijd8", "isValid": true},{"proRegTxHash": "87a6b560c10f7173dc67187fc42c61f3dc04cafef3f03aad03ce0e9c0e64a202", "confirmedHash": "d37537c157819963bd3da465273de69de05acba3e13520620200000000000000", "service": "00000000000000000000ffff26f2d079", "pubKeyOperator": "9180f2a6ae3d415ef1ef09f418e400400fe4232b436a8465aaeb4cbe57868afcce03115254c6e947279f0c93657d4af9", "votingAddress": "2Tkhr6s6bvqMzFkU9eWXHBVwdNcC", "isValid": true},{"proRegTxHash": "23f895bf5fe79cf12302606d4f8e2b2bd46339483d67e17e2217af63c8b1e5ea", "confirmedHash": "68485f6aec39ec1c77d9cc4652aab2038dd647c64318f2f31700000000000000", "service": "00000000000000000000ffffadf9157a", "pubKeyOperator": "901e88ee4dae968aae87fa1fb6155eab7c579ee044aac262932bbda42359ae40ec6b521f07b5d0ca728e89bd1198178c", "votingAddress": "2hLy37KtuNJbdixwboUCt7aQ25BV", "isValid": true},{"proRegTxHash": "c2f3bccd4841197470594ac4c79a1289b32cf553a2d1bd2a5f627dfb1dab6116", "confirmedHash": "52502956d738ee41e8484c743823965a093550655a9f12991100000000000000", "service": "00000000000000000000ffff92b9b3ca", "pubKeyOperator": "173e5dea1b6912cf5cb2bc55d1aea98736de787dd1379743899669a1774f3025d72958a34ca95086e0824948ada109ab", "votingAddress": "3D2N7sGprwLa76w7nap6uq44R6s2", "isValid": true},{"proRegTxHash": "b8a16b9c962117c963b688a10e4e1dd38223ff485cd70a2b6480494f86bcb1d5", "confirmedHash": "59797c6fff57c50e70e71a5655ad0cdaf5bc7283f4bce31b0d00000000000000", "service": "00000000000000000000ffffd418658e", "pubKeyOperator": "030fa94967533bb1dd6d143b8d7505e187a783d25e0a40ea167309d269ac47f02c66f095bbc6c9d60e9828b5f1427414", "votingAddress": "3KrD9PDU8Jndn4CTGphoTWGiwnwu", "isValid": true},{"proRegTxHash": "3e413fdabf9db96d3bb3b38799065a748efe055e0cb52f47958dac215f4ca742", "confirmedHash": "8122871448a28f5bfc20ee0b4842cf2f3422c9b2ff36e9181200000000000000", "service": "00000000000000000000ffffb23fec76", "pubKeyOperator": "8e9a70232918b481c957deffea7cac231f29ddd6f69f532ffd9fabccbb844aff9abbacbc6267326605e06ad778cafbba", "votingAddress": "2CYajWs3BMGn1UNXFQiDCJvvPhCH", "isValid": true},{"proRegTxHash": "e9646c8964f1f2cb64b6f60c02cc8d34abbb221327f4bab5c264f2b13897011b", "confirmedHash": "00960cca1bd93bdfe38eefd8f7c17d3856f416e84a85b5c63500000000000000", "service": "00000000000000000000ffff6dcdb54c", "pubKeyOperator": "86a43e0c7464e74cd849d72abc2e7447b6199823da795911cb5d65b3cad258d31a95b574db2928ce7b732214be1cfd0d", "votingAddress": "SJDYGp5bkdV91dkj3NtcjWXwsMo", "isValid": true},{"proRegTxHash": "0e88f5ff3e1dcfdda069b3541ba9e187f6047055fb62d8151e24db192fdeec7f", "confirmedHash": "2f4139d6295c83fed29f11ab206ac74df0be81dec1b3468a1400000000000000", "service": "00000000000000000000ffffbc2815ec", "pubKeyOperator": "0629e1d0da6f4763583b18a0c18ba75cad207b83df86e3cd3fc92ffb57ded80bb65967ff3ed686b19a1f4cee5cd170fb", "votingAddress": "gn4AQs5AWARige6WquGVB399Y6w", "isValid": true},{"proRegTxHash": "90a5f22ee04653eed7595862ea8d33c0d1f18f97f07e6e17cf21c8ab5d663396", "confirmedHash": "d067be8dfa0245856da4004315371999e0bb6dbf69487d040400000000000000", "service": "00000000000000000000ffff416c61e0", "pubKeyOperator": "818b26a5a922a09807f2bbc29f263c7bf226cf46929d3e19ad7e710c9fbdbc6456bbc90cddaaf05a2c6c26e6717bfb9a", "votingAddress": "2KjL6NHkzb2C1HBSWtkMW6Mw18vy", "isValid": true},{"proRegTxHash": "2a590f2648c7a6979e689b1010e04e46e49544025ff1b221328347cc2aa5b201", "confirmedHash": "a3e43c05adcff93d62c4c6011b7031345c56bd4f789b68ac0900000000000000", "service": "00000000000000000000ffffb07b39ce", "pubKeyOperator": "0d17b849d19bd79bd7266f8311afab266545e71dd67f543308c7e33dba6dec2ed9b09aae023a12573974e85596ec93bf", "votingAddress": "EcaPN8ngasjA2Wzk3diSPfaeJu8", "isValid": true},{"proRegTxHash": "621d2db5fd34a5905e94569a6078e014589142a162316d5de80c02a408e9a086", "confirmedHash": "92e88e8c6db10d1940f2ac18144fe08855106086164582001d00000000000000", "service": "00000000000000000000ffffd4186c7a", "pubKeyOperator": "965d7e6950ad79667e9c014dc519e78e27d741f83c467ee17ab1ec5b8b681a56139831d3a345ffb9a1a55a365416c4b0", "votingAddress": "PyRM7zvQXMqc1U1EFoGu3qCkArL", "isValid": false},{"proRegTxHash": "d62abd21e17feb8d3d962a8d2174a4bf6a450089bee9c1628d3e2bd29b1dbcd1", "confirmedHash": "c6f1252272a54a4e7af7879f4c2961d8c4247d2d937b990b1200000000000000", "service": "00000000000000000000ffff33449b40", "pubKeyOperator": "147a0e2a372f5e854da2f7a0e12118cd42a432d8ade725e8b1e98f1f2aee05f30db654182e28cdea4f84839e651c4402", "votingAddress": "2toCRZVVo8ab91UNEqspkP7fc3Sq", "isValid": true},{"proRegTxHash": "ac227bf35ea5116d73898afa8107264165faf03faff704872afe5c7f99121775", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff03614b1c", "pubKeyOperator": "148205533dd66621cb8a7967b659fe974e8f77c8c3a3f0b3eb27304cabd5203384f18b3d0dda78fb3cb2bd838c8473df", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "7be65d9b954727c036b569ad8470ad9e80b20f9fe2cbb4b377a20333924b9d57", "confirmedHash": "e31060b0169a43d5a9e3f57266cf1c3c6585add0ed47dcec1a00000000000000", "service": "00000000000000000000ffffd4186c19", "pubKeyOperator": "082c7baab4d70ef64d1f558324edc631c53c630cc69e4d0bb51e49ce62f7d97549068a27ba4d483cd5db3a2422c6e357", "votingAddress": "3wXM3NywNB24KMUvfVYnwufao8a4", "isValid": false},{"proRegTxHash": "7fc5136b3a3c4fb872e737370c39c689e705934aebe3b2527ff44aa21d2746d9", "confirmedHash": "edfe6438f8e62521a1fdcb2a396192ad6fc14e2f35fc9e720300000000000000", "service": "00000000000000000000ffff3353a61b", "pubKeyOperator": "8e4503aab4de081cd09212d4c25357e4253e37ea4cd57b6b6304a4d27fd8a04fd97d3a6030e7117019958664924fa28e", "votingAddress": "4Xr7nMDAqQn1gh3bvQaqDCMv3DxY", "isValid": true},{"proRegTxHash": "fa2c039e379e2deb83b774d46d2da85b908d1f23a4ed8f9884b85cd7bcb424a5", "confirmedHash": "c3df4caef07cbb037ae647ab9b2e7512740198342e933af00800000000000000", "service": "00000000000000000000ffff9a103f70", "pubKeyOperator": "11a087c5a1f58d3b8a44fe9c0356d079653fc7fbd27665582810cb3d775bb86f74d08075749090cc7a2916bfc7babfbc", "votingAddress": "3QnXmdPWY2nang3ndPJeViZUSgdf", "isValid": true},{"proRegTxHash": "508380578461da7c0b142b5059ae36dd8f87777f3b36e023c56a82ab49f1d173", "confirmedHash": "265ba3b55cac5759716b916acd01f6d96c16a70fbd715d252e00000000000000", "service": "00000000000000000000ffff951c622f", "pubKeyOperator": "93c43ce5875255eb5ea922f3df479f3053f6c4a4927f4f365a8ef63718244a76f8eda9c14202363f5ab4c1a45548696f", "votingAddress": "2byKqv2MVaBcJHcsF7pcBWKiCUmJ", "isValid": true},{"proRegTxHash": "f231843b9619b98037baa25b284c60dbda0a1a898433785227b03d74f36d0e2b", "confirmedHash": "6a4665ab71fd3be72ef78d374d3bd8d9ec742bfd576438382700000000000000", "service": "00000000000000000000ffff58630b0e", "pubKeyOperator": "94c4456a3c5a2c60c97b738802998c25457dbc6a69e14b00923a3cf9a2698b65b905a19e47bef0df3f30f1af92be90d0", "votingAddress": "wJ5r2nvGBzQz9xnBUmfEwC28qQF", "isValid": true},{"proRegTxHash": "164fa2bcf29e97b757cbcbfde38969521f6e8a644a06bbbc2e2e3c63d2936850", "confirmedHash": "44a505550c28fe08cfe1f23f7bb0b1b804d9cf1847b14fda0700000000000000", "service": "00000000000000000000ffffa877530e", "pubKeyOperator": "8185f607effcc9dc41a09ae91df98d64c6f143d76b2424eef9133c455934ed8bbeef1563bb8c0d30b434c60806333654", "votingAddress": "36wRrmqEfJDraYU5UbELrih9UyVb", "isValid": true},{"proRegTxHash": "678103f5e26906aa39d5c1e337f8e139fee7a57c989f303651d5856986e19454", "confirmedHash": "3232e0dcc78501b173a5b848a66180bf927d78cebd6a31aa0a00000000000000", "service": "00000000000000000000ffff6c3dab55", "pubKeyOperator": "0e46393d91ace04c99e110e49155d8edec31f731ba5897a48190023262a452d55ebdee43972e458cc622eebc14255a99", "votingAddress": "2SzgXtsnaERJdFF8AHxy6HwVnnSW", "isValid": true},{"proRegTxHash": "fa5ac466e5c2f460236cb10f09907d276cc7fabcc729631a8fcdf2b644a2a93c", "confirmedHash": "8b9804111660b0f9c5ef35cdb717e74286cd40a70c584e1e0400000000000000", "service": "00000000000000000000ffff5eb0eb5a", "pubKeyOperator": "175f77984b7e05d5c01da3eb5ce1a65d0eeeb6cee3a395ce70c53b14237da2ba8b04ccc9a490e3e340fe371e67c75e69", "votingAddress": "tKbVPNvmje6EobcEWAbbpZeZKBy", "isValid": true},{"proRegTxHash": "26037c868df7dd000a0194377b625360d752318cab8d49c18b7b25f4c2a3c7b8", "confirmedHash": "e92510d8e25c34169594aacdeaa3a5f4b837fe85e679e6560f00000000000000", "service": "00000000000000000000ffffa2f304c3", "pubKeyOperator": "8f5926e70b41783a8cb9ae3351082d867ca292570076c7cc6e4f0d8a09da2b82569e13743af725d32639ec41cc87bc2f", "votingAddress": "2CRr4EymJFvTjMUvaR9PwPbvtqF3", "isValid": false},{"proRegTxHash": "4a475a4c930360fc5483158aebb76b114b7a601688e6c632557d6e593ece7513", "confirmedHash": "e65a255507dc57d15253bc9393ebdcb4a97d860026ddb9331d00000000000000", "service": "00000000000000000000ffff5fd8ff49", "pubKeyOperator": "8d9549a74a5dfc34f1849175d785f3c0a40d49d8f82f275ac41c49937aeaf7da77e9e28e99645763abfb9461036766bf", "votingAddress": "uNjxijWKDLzfzizkuHQMpnZvu52", "isValid": true},{"proRegTxHash": "29e40dd17ec53d70b6ffbbe5e1424a7a503651c7a7aff56acbe914cb05d88993", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b07c", "pubKeyOperator": "0cd5b8658045be39573d1c4f72322a070305a3fe068830e20d5e8c72b63cd2ceaacf741183c1f8b09df75f4f269824cf", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "67e3d709b387c484f5a034f1783e2ec31cdfefcd9f48bf738069ec195f6561c6", "confirmedHash": "46edeee37eb94d6f07a405f8e641a0aa3fd9264ecd3461c01600000000000000", "service": "00000000000000000000ffffd418652c", "pubKeyOperator": "09bde6accc506b129fbccb8b9aae25923385defd2ae2e3e77760bb9a41bea488d1b9d097740a8a2995647ec7b13a31f7", "votingAddress": "3gAfcqcybemZrsFHJj2vTXnkApyG", "isValid": true},{"proRegTxHash": "1f20b1feb355f6982c808de39f8b203749e33d1102adb619385404d899162cfd", "confirmedHash": "d82bad0030563a5b669480b1989978c8a45566066a194d3f1e00000000000000", "service": "00000000000000000000ffff5f550b4a", "pubKeyOperator": "872d9c008c5ec085c397625f4a291967799405454d67c542f5c70298eee19aef25c660042b1a7a43c42238b581726fa4", "votingAddress": "24eh1VYmy7ecNf3YY18wgyfzLTny", "isValid": false},{"proRegTxHash": "6ca6c258dff799a3b5315c8bd75e93b1c1cc6eff2b88d25c53b874383a6c112b", "confirmedHash": "73ba318388d425cab96a72a3a1bdfefa9f663da66d9946a30a00000000000000", "service": "00000000000000000000ffff14cbf844", "pubKeyOperator": "0e7da123321a4458b0e70576f9abb6347e704e7f3faed1c58f11d3ed03b3522f9e4cad9ce18867129ee335313aa83abd", "votingAddress": "2XNS8rKFL45uNXJbZ3EeZW2YFKsm", "isValid": true},{"proRegTxHash": "c4a66954c75d96ade565d554b835836e911ac8dddb997cf3b1a7c24827038713", "confirmedHash": "db3537ce759f8354d1933e24423b85281046a522c7a95c9b2100000000000000", "service": "00000000000000000000ffffc11d386c", "pubKeyOperator": "16095b1a2e9cd1a9d1d459251977e90533d7ef11766880279b57651718026d7428d6961d2cb2b669da89a8bfb24e74db", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "bef4e937f171a9b4105551e70e993a67fedae2494ea18c5fcaba602b8a402463", "confirmedHash": "77f221c01c05015690d328e30ec7272930e53e072126fac50a00000000000000", "service": "00000000000000000000ffff58630b17", "pubKeyOperator": "859c75005f6be0cc73463378bce3d17e7d11c04d0898a5ab529c16a0537044c0586f9c48b4d856d2d1f6e29b7ece76d3", "votingAddress": "MUNffNxpbMyJ7KwrB1vDEfFP3ku", "isValid": true},{"proRegTxHash": "c8827337b81a9dca64ef7ed98a5ecf15ebf1bb4931e8c72f7ef668ff5a8a9f81", "confirmedHash": "d103aa45a2f5b965b73bac6caec3c73508cc3a2a188e083f1300000000000000", "service": "00000000000000000000ffff327409fd", "pubKeyOperator": "16ad3bbbde95a6f23fc72b1f6a243b37bdfb09675e8e805c43e6bfec8073bbd217c30dd11673f1f59b5a688322594071", "votingAddress": "3TRdX81JV7DzsN8KfUSm1Jq6E8S8", "isValid": true},{"proRegTxHash": "45d676a90b877e989395103d32c67e054a5b7229d01ac0f1aefe39dbb0c17611", "confirmedHash": "7e62152957c9a29d845fd76156204df5d6b8e0f7a82bcbcd0a00000000000000", "service": "00000000000000000000ffff2cee7681", "pubKeyOperator": "06422d3304066184bfa0b228262c1878a2f5703f4d440287987e3e94c4408f3107e4ac8e96bf8289a37dd9478c1cf750", "votingAddress": "runuMjXRC2uiR9rS5dE2yc5fNdY", "isValid": true},{"proRegTxHash": "fa59af7c667354187b34f1146f2f648deca39f8aac409ccdcc6e0632aa3ce843", "confirmedHash": "7723fc3c5c009470d185d8704d192da5faa2dde0137ef2f41600000000000000", "service": "00000000000000000000ffff88f37383", "pubKeyOperator": "1945650561f8094bb42a9b7abc17e0566cf8c2a99ae7a280e0a4ef8495b7e1736789805f6c507cfd837df4bea949d044", "votingAddress": "4WYMnAKgP8PHpynWYc8YyKDrheP8", "isValid": true},{"proRegTxHash": "7b36420336012ead7d99025415692e380ffe7eb9923d99038c69c82e572df37e", "confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", "service": "00000000000000000000ffff50d0e7fd", "pubKeyOperator": "935ce9c9ef8973ad16bb824ab76e49d921fcb9dc4abc44e15d9dcd2d6af9633c1d5a3072c330bed5a91a12b707e34203", "votingAddress": "4G8gHd23R3TYChKMp3bkLoVwfEji", "isValid": false},{"proRegTxHash": "61e0d51702b70109f2986e0b77a27f330ac9e322eb910862f5fa6835129e9f22", "confirmedHash": "8cd4137a3dedb0f3b934c48c7d687f1378315742f7ec21011200000000000000", "service": "00000000000000000000ffff95f827fc", "pubKeyOperator": "12de0d4849606a3e6bdd4bd145bbce2058f0f793169509d839b59c048b92881586fe768a79d59285dbbfc007a3e1eff0", "votingAddress": "25L11q1FJgAAjBidTCzNLFe91rJH", "isValid": true},{"proRegTxHash": "6bbc1778a14e5674ea696223e78d6c994ae8fc9b3d5d2a76cf268a882bacc222", "confirmedHash": "a90d13b04a5a55f8f0c1c6e2a0030edc649a555a2550fe320100000000000000", "service": "00000000000000000000ffff95f83b32", "pubKeyOperator": "995d6e73e9247c8300049b052fb5aff52dabdb9663618cc035dc9d61913895eff7b277d339b245af121e8abdbde2a707", "votingAddress": "3ynENntc1xPzCVV3yuTrtLg86hiW", "isValid": true},{"proRegTxHash": "7265b9b36926c076a5039e92c964d3c6510f4f0529602f9824d3c61cd7297e9e", "confirmedHash": "53887337f5b4256a58850856ae5fc5c6e302b4ea03ea0be70100000000000000", "service": "00000000000000000000ffff453d6bd2", "pubKeyOperator": "893dad324bbb343664727294a820cfdd33b5051209bb3e73e10054bd3eb2d20b28c39ad77c19a3a90a2b2ee3fbaea067", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "cb4bb1266f276a5a2090333f7d99646524613a27f227b89bf18aecacd575ad24", "confirmedHash": "ffe3bff72be3bd4349140c073a1e0f3dae3b4c0619f364c30700000000000000", "service": "00000000000000000000ffff334fa07c", "pubKeyOperator": "99e05be022253ff4ee73f5fadfcf231fa4a347ab1e78ff1f911a200763dcaaf5f104b35ce0bae3891cc353b241cefad2", "votingAddress": "3aWWQFJCDF1nV5iLp5cUfz2YAzpk", "isValid": true},{"proRegTxHash": "565039da41c2a1f1cfa8cebab48255cec66d05f0f684f779147daac014dd0d2a", "confirmedHash": "33edb9326ec9af8fedaefe8710dc9e584fafec5b88cc7cc21200000000000000", "service": "00000000000000000000ffff2e04a26a", "pubKeyOperator": "107ad8e650a58958aa8057e4f3bde21c7b09cd1753241ce14f0ad4474c9ab5bd70d065e9b4bba508415f3b40cdd4584c", "votingAddress": "3zJhvKXJHFsbJ4oThRZq31cLpEj8", "isValid": true},{"proRegTxHash": "4e3d76696332e2c6f37e8ad43df34c117ca6fb00d6baa04645d493637923d093", "confirmedHash": "84e7ecd6fbc4c0a23a022bba10c53ca9123b68eb278fe0e10a00000000000000", "service": "00000000000000000000ffff2d200ab7", "pubKeyOperator": "165117ad2eb6b271b8382eade8c983b9c717cbe8d48cd0c25d063bfbcdaee76657fd808c9c13dfa413daa4fe8a355d86", "votingAddress": "3GJBvVjT6MJEbAuLZqBSofNBhGwP", "isValid": true},{"proRegTxHash": "382075f3159a82efda6729fd6d1d7fe3fd0cbc9ee7d147faaf37b0002d65f334", "confirmedHash": "d802766deb5089199741561bf44297fadbf713524a6de7590800000000000000", "service": "00000000000000000000ffffbc28b484", "pubKeyOperator": "1999fca81b0b7d831db434b9ecab31a7f0dfab37050af79d8aa93464e1a3f6946bf0c4f36a0dbd506d6ae65036741c3d", "votingAddress": "E5gG1HjasmFthz3YerWeN2EzbUn", "isValid": true},{"proRegTxHash": "51a90a2c35c3b42635afb52cfccda0acf026343624b554e5777eb9fbf2df484d", "confirmedHash": "2361df2cfb3dbd626bff6a20f35d1ab801a740bd10e5a7c31900000000000000", "service": "00000000000000000000ffffb9e45388", "pubKeyOperator": "0585c3ac3e1b907acea9220f43f03c318db14186a2c2177c96b8e356ab8ec97fdbdab7b2e9410c5f64c37679a0c3b169", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "ba70d2023e1d7881ba19d788552a9ebb317f7e536a7c6a16f2a398f1f28e330f", "confirmedHash": "9394a8f1816349aae9420c213ed0e452392b7813baa6840e0200000000000000", "service": "00000000000000000000ffff8ac5a1d0", "pubKeyOperator": "0bd3a0ddf2d6ac04ba5ad0a39cd857d322400d7d3a5661bace08bd41afb14c256d18c6f6643d22a46eab81903d601f8e", "votingAddress": "4TfGXQVK5FTVtWDgE7wTnQF52twA", "isValid": true},{"proRegTxHash": "cce1ba3f2476459b6d202592224bb5281ea44a1499d3079d85ca8b3c930a7c8f", "confirmedHash": "f9adfd26b1aa55b6285181762a243fcb8488b1f3070d41e60800000000000000", "service": "00000000000000000000ffff2d479e6c", "pubKeyOperator": "86fdebb2ccb9970b69080c89cb1feb881719b47c1296b43df975c07ef9a4b8424875c82b30951e6b57d8d8ac4d7fffb0", "votingAddress": "3tbpASAJHVetYAKJb9DG1HVm4SZp", "isValid": false},{"proRegTxHash": "dc4cf5e20fe6affaafb7678d4f38221ca2f4d5ff255c40503a6bdcddbb43fa23", "confirmedHash": "455dcc7c436a1303d238205a384827e2baa70df5808c609b0e00000000000000", "service": "00000000000000000000ffff8ba2d7a9", "pubKeyOperator": "1124b4769c30899425583daa686308bcf49d5507d6e922167c012fd3337fc455fcf3899042bec74c51bdd9d0bc29e5db", "votingAddress": "vPB4CcaQRVDrzYuhHuV5cnTtz77", "isValid": true},{"proRegTxHash": "dffa47b93f1a1f0da70174ba1a1028e475b4031b396660ce934b54572729e373", "confirmedHash": "0c76487adb739b08a7ed7e11e4a4e8d788bf269d11622be10300000000000000", "service": "00000000000000000000ffff55d1f1a6", "pubKeyOperator": "05def59e7f05a2fcbf90983a7e9c5785d68480612b7aadf284f75a67a21305d80e6a4f3741b3b16f5c0d126096c8fac2", "votingAddress": "2sPBFyenRNSSqYaebxrQRtRNGz7c", "isValid": true},{"proRegTxHash": "63c2e3fa76c5e3cc8f777c6fc670f47c3d9c55c4c4ade90fbf57ef739ce9bae1", "confirmedHash": "7ae69f82576c98918cf6bd5702e943d27c1c4c9cf7fb33cf0a00000000000000", "service": "00000000000000000000ffff55d1f191", "pubKeyOperator": "8a96d801db37cd893225ab9ba2f050ff29bcd77eb35cd8ea43978a8315aadf747aec9d365e95a5c3619bfa95111f5703", "votingAddress": "2YSjvpAeAKjBTJuYDqStEkk1wqMo", "isValid": true},{"proRegTxHash": "a0b7c359af4904aabb9b7c3f74d6b8dbce82037c0e3afe94252a64aeea04ae1d", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffff80c7db4c", "pubKeyOperator": "9344fee70f898489a569284c66010c92f389ae2b91f94d5ecdd647689c0650b10c703321a3621e570b3efb112c6ea909", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "f0ee31cd964779e1e2efd65666e6f59a8d52da6038df120a11a238de0de7d88c", "confirmedHash": "d8e25e5d4581c1c387012a714f499815651f684b301bf3071200000000000000", "service": "00000000000000000000ffff52d31924", "pubKeyOperator": "11cd5837b5c4654d177b351f0ee4e0be2a5eef0bff037a544c2f95eaf662c2c23d9ec59b366322ce59bccc8b3eb33104", "votingAddress": "xaL5SdBiYiQpMbDpUhtGbqjL43R", "isValid": true},{"proRegTxHash": "8cdfca8bb64a41ae903f2e3b744cf77da49da286ba76018b369309d79bf23b5f", "confirmedHash": "eef33d38a2a2d5c8a5de26e257905c50ffe2fd0810f6b3610500000000000000", "service": "00000000000000000000ffff8ecacd65", "pubKeyOperator": "9060db21247566c26bb484bf98ef9deca0b0533918cff8de97ec57c050af9c606184fcde0ba9150be56b80e6b4b1b4a0", "votingAddress": "44NDCrYVwwCjdwXcLLagRC9MWyT", "isValid": true},{"proRegTxHash": "8ed9670254a73ea3749d2e55b7fe4668845ca2f6d4410aa32555df7526fad76c", "confirmedHash": "7069b2ebd0fc225cc6667038265beef0a2351c56057b9afd1a00000000000000", "service": "00000000000000000000ffff55d1f22a", "pubKeyOperator": "9578c54eb841e88045c1cbcfc66b506fb56cc356b4e93d0777cb476f810136791e2e58a7331d9f8149ad6d32685907aa", "votingAddress": "2pT7WbGarFSXx4UFMvd3oDe6JMbm", "isValid": true},{"proRegTxHash": "c513cbba4ce87b6f70e57ab917f9f3f2cbf8c27ea608a04bac48c260b7759d02", "confirmedHash": "31580715034740dedf4c6cc1199883578964dbc6c3c861132700000000000000", "service": "00000000000000000000ffff36270a62", "pubKeyOperator": "8e6b6717dd7f7109ed37a2ee4e6885ccc27c8a588c33eea400882857b2f9e0f5928393e161ceeb59754a914252dc57b4", "votingAddress": "25PtNbZRdTEqczmxCFFQszW9LWJd", "isValid": true},{"proRegTxHash": "5394e7a17a9bebb76ffac3096c7c2cd91ea53dd614679e8525b386790a8301f6", "confirmedHash": "bd4c6b8f86c302d3c846d22b2260224d6997652428de294d0e00000000000000", "service": "00000000000000000000ffff4acff4c1", "pubKeyOperator": "8017a43a2e80050f13e241610bb8221677df653f849086fd03808ca6483b26e413b73639363b14d5b6a055e9348c747f", "votingAddress": "4P2Wktej6VyqCjhyym4bZP4XqSnB", "isValid": true},{"proRegTxHash": "b37fc5b4613da03e2c0ca25a478f9e135017ac983cfe15307a5c04baa7d8bfed", "confirmedHash": "33142bfbac0cd0a9c218e1934d72f98f4789db576c1a60c21500000000000000", "service": "00000000000000000000ffff68ee9fa3", "pubKeyOperator": "15d1d295a04f7b8b66955d93c490105638418b6369e8f92fdd09fd4f96e18dcd794abaef343ebd010d746fc740993f8b", "votingAddress": "4QJymzLKC5omFJ2ZnVaKZ8CYTmxB", "isValid": true},{"proRegTxHash": "89b7609c9903e4fad200cfbbbcc2fd2478f6c8c8cdfdcc997e55ed84829d4a66", "confirmedHash": "cc12ca4ee0d2ac8230d702969ae5de1342e44496d6cacec70400000000000000", "service": "00000000000000000000ffffd41860b4", "pubKeyOperator": "8757590e3b6d21d4f6b6331f4d831e089514e52bc8285f3dfa4a842359e2f74a1d97dd56edc8e3286bf8ca7cb000eef9", "votingAddress": "mg1gAE9w6tw53Eyz6JVHsYoLChb", "isValid": true},{"proRegTxHash": "089da7bb2257dfd094985253a0e82829bdd28f324e2d28e660373543525e3317", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96886151", "pubKeyOperator": "0d00607fa9258617a4212eb24155b4e63c2260b82861638485158e45f5496f749e18faa9b77e49485b53a30263a16dfd", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "deb6b5904a4d73bea900fa8f8359558a8812832aeec83fbde78216c0a0e80e06", "confirmedHash": "58e240a154a0ac48dfd26143fb8ac7413aa11d8f10f16e622700000000000000", "service": "00000000000000000000ffff5fd8ff4a", "pubKeyOperator": "185449a148e6f53635ce8852adf978df942acdfd95b0f0deb0cea86ac5cd728c319e1557629e8257af425583ef99f5da", "votingAddress": "3V4P4w6SDW6611dcGyEQ9Z9zMLSM", "isValid": true},{"proRegTxHash": "897fddd647a9c79e794b9b3cbb3a54eab7e38f8be3f9e3afbb89abb5c76f3869", "confirmedHash": "fecb8ca6e39f79a283fee58baceb791e6066e551b51a6f8b1100000000000000", "service": "00000000000000000000ffffbc28be24", "pubKeyOperator": "1053fe7f087d571a864a5a7408002f0ad786b33f06db9b719f39ed37af60270eb0c9e494833b6d2d1f029ec2700d3e6d", "votingAddress": "NzPxLv8mWq1UWSrqMUPqD576zPm", "isValid": true},{"proRegTxHash": "1dc7c6b0318a7a01864c834c3f6f577985e79c56f17fc12f502ce204f98aa5d6", "confirmedHash": "560d299a6fe8bca9767de9ef70d11b84472cee7abbde7f7c0500000000000000", "service": "00000000000000000000ffffc11d3915", "pubKeyOperator": "006d228373d45edc9dc163ae9a0ae9c23c7c3e6b15eaa93a73d145891d77ed0088ddf44594075428a5aaa3dbd05b607c", "votingAddress": "B2QC63TCXYsHi6Hz7GW6LzRm239", "isValid": true},{"proRegTxHash": "8a5c1131b7bd0b31e7c9a7c6b0dda40836eae8281de5bfcfd847bb18b0b1eb09", "confirmedHash": "651fdead0f24e7fce0765ce7fdf778e58f8a0b5f61ddc54d0c00000000000000", "service": "00000000000000000000ffff327412c5", "pubKeyOperator": "19da4a96d87fa276ea02e08c0e9dc544a980d0d267b2ffab4de1702f9788366b57c7bdcd2f0b7469d3b75e43302365fd", "votingAddress": "WMtBewEda8cxBqUAmxYPHjXtLEJ", "isValid": true},{"proRegTxHash": "1eba9e1e35e8f5e2fd96bd0aa3b6861964b2c674a5db927f6523d1ee9066fabc", "confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", "service": "00000000000000000000ffff52d3158e", "pubKeyOperator": "8f0343607b479bb9a910909700e0824e4c223fe0dfc4c43a9f9d4ffad4cb2a3e44071f4e22af03003e2aa7a8c99c0cc5", "votingAddress": "3gQ9vUvXQyVemuZfUrAjBwpxnesz", "isValid": true},{"proRegTxHash": "9f268e26fac9082c039e0d939d0e7f0ace2f043a8be200596dd479c7dd85185c", "confirmedHash": "60ab2a3f1aba0233175ea5d5634e0c94ddd8c6fa22714e571d00000000000000", "service": "00000000000000000000ffffbc28f163", "pubKeyOperator": "11111ca3a2cfe06e26c15ed0114215078933b5182c48844973b7564e6611bd4252918a9655394597c94eedb43b93ed6e", "votingAddress": "q2x2WE6R7ttXTYdfntT7vgRc5jz", "isValid": true},{"proRegTxHash": "86762ec82b6aafe8798588711bea6ee47929dabba1557954010d041aff01e256", "confirmedHash": "df7bea7167ebe645e16025183614c34ea48669fd276e7d672600000000000000", "service": "00000000000000000000ffffbc2815e7", "pubKeyOperator": "17f381a36eef472d9baffffaae68977d127dca2d41a604bd86bf7e53028eae808b759a229df776da7143f06e41c28222", "votingAddress": "oPJZzmSFCskeEtLB1fSsx7tEdkL", "isValid": true},{"proRegTxHash": "deb7dbe9774d1264f5f0b418fe461bd36f3195893b3bd05490a8b1555381bb1d", "confirmedHash": "8dd7442cd7bdbcf8f786677f301ad6949746cea193655f640c00000000000000", "service": "00000000000000000000ffff9d5a97aa", "pubKeyOperator": "124ea9a1fbb701b31bc9a3a3651598123b0a49f1ea290be0781dfb2cb6272885f7ea0daf3a22583ed2239a20fed75466", "votingAddress": "F7Snqnx3ZUMNSocgnCp2htzA1Aa", "isValid": false},{"proRegTxHash": "8b451c050b025e9633daf2ae8122ecc4bbdaa26db31b8ec3c2cc8958ab85f04f", "confirmedHash": "75941ff18d3ccc6095cd699c90ebf0f910706b3c7086d1852800000000000000", "service": "00000000000000000000ffffa516d3e5", "pubKeyOperator": "0243e154d13fe89267457567948ff51629a22b236f4a66679b38467a46aa0bb4b10d1ddce61e4607401bf9aa7830c112", "votingAddress": "2guE7rAzQHEJ4CoiDRtSu8oSkVnq", "isValid": true},{"proRegTxHash": "67fe749ba99c08cf1bd323a44c12b15d29fc372f839cde391ecd8cc1eae48cae", "confirmedHash": "c83ce6f8232852a1bc0f0e025d9403340a553862f752e43b0800000000000000", "service": "00000000000000000000ffff3353ead2", "pubKeyOperator": "91be3192663fd168496a8111a03feb58197d0c86d90d7d27da09345f77bdf9025aaf8acd0684157a6a9c239d2e370bb8", "votingAddress": "43TDfYRJiBzA2nEPpdeydU6hU3nK", "isValid": true},{"proRegTxHash": "2c80f829f296d40d265ed8e4adf9d32c3d68e3f4b913889753ee77b26f53315d", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96880d6c", "pubKeyOperator": "8c1b89610002349aeb66ed2b739bfaa9cd3474e6568d7a5eec4419e639268cee16f2417d325a4515bc394bccbdca7c6b", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "cbc56f65eb2cf46ad2aa7c7b94cc80a16eed8e46135d0c0365235274cee7c365", "confirmedHash": "adcf4e76e1aa6f2eb1cb34f7b91c8b521ed65c853e8f6a570b00000000000000", "service": "00000000000000000000ffff92b99f37", "pubKeyOperator": "8ea0d2b4fbc9da0949bbb03282a2d3f5c37328733bf1549120534ec64708e2ce2270afeb1f5b1e97a0804e9f6398a763", "votingAddress": "D3Ugf7QiY2x7ZPJpdBjcGd3gsPj", "isValid": false},{"proRegTxHash": "829b95500a42ecabb24e01faf4ee4985e534e15f1114de3d509c77586194d1af", "confirmedHash": "fb3f50926d7d98f88a139e71af31de2f6504f036b6dac3090400000000000000", "service": "00000000000000000000ffff5fd8ff47", "pubKeyOperator": "831f28b865947288147686993519eba402ad34276db0e375bc53c0b61162f392ef3f1a13eb9227ad26c1743b32a9f341", "votingAddress": "44bwwxahtSs7RaqNBzhgPBA5vaBB", "isValid": true},{"proRegTxHash": "69f7e34dad25f8652023f1b7aacc866b5afbcef6d9c107ee6debca6e6ea3398a", "confirmedHash": "2f30968271f0df5619d491a677ede3485b969b79ecace0775500000000000000", "service": "00000000000000000000ffffcfa7401b", "pubKeyOperator": "8182e46d13375b00e97839260a75a230936e8d84543fc0f293cfaa244c102dcf8a591bade2d034f9c6af7344e94692b6", "votingAddress": "2n3VdndVWiq2z7EdHnXcSbkW62vY", "isValid": true},{"proRegTxHash": "a880db1ece8ef12e0f43bab83daa81bef9f2d0611ac21a091ebd971185ce9593", "confirmedHash": "25b255bb1ed972a1c09ab82118592e697cbb59b8375f5fac0700000000000000", "service": "00000000000000000000ffff55d1f1dc", "pubKeyOperator": "9814638a2eee2709b8e027f5a61fea10a84479dc37c1f0e9ea1318c2c48489ea396ec75b6d82a83b0222dc4fe70684a8", "votingAddress": "4StCN4XyCiBiXX2KKefeXvsXvBLm", "isValid": true},{"proRegTxHash": "3fcd6520a1cef81eca0cd90b1d567b6c414dedd40078eb835bc2d47e0e5a7aab", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d5232e", "pubKeyOperator": "1153b7c2564fac05a04e37db5ed21c26e3bc09fe30ac1ccd61b397f5edea329b51998bb0f1d71cf6b590bbc0e37a9a58", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "4fe088a8e51a00d9fa8250147eb908d5a1b3c74b19ea7ea7323a2acea9fdecf1", "confirmedHash": "68f9eb6752246386767f1e431b82ac10940fd2ef752ac4580900000000000000", "service": "00000000000000000000ffffbca600f2", "pubKeyOperator": "8c325d92cfcac55587a0c610f24ed0c0fba7c6ed4ecd9f49f787b1c50cff4cfcd7d88c44a2a3efb12608799046248e84", "votingAddress": "38scAP9m2LKa4EWGVJAkK3Kq7pPR", "isValid": true},{"proRegTxHash": "1bccc4910e194970ddfff8888c1f5eee3796c948fd50e2b0df4eac274cddc9d3", "confirmedHash": "fbe8291ab6d032ccf688e35400ef212499be6e6e985efcef0100000000000000", "service": "00000000000000000000ffffbc2815e3", "pubKeyOperator": "163ef59611d144854ffab3adf30aadda7426f67458823577e42506ff4a5428497e9ecd70f692f27fc319ef3573268556", "votingAddress": "2qLmQKKbcvRmJGMCsqKipzv3xguv", "isValid": true},{"proRegTxHash": "8aca44aed73df5693e48957960de7cae3d1e8f759711e56822231e32711fb8fe", "confirmedHash": "ddd4eb50398dca46db7978266a4dc8c789b6cd2b04a859d80400000000000000", "service": "00000000000000000000ffff55d1f1c1", "pubKeyOperator": "8c494ae1b8e7dbdb2d53ed11a4fff4a55f0ec8f9b6e5d64c5b5fd75b289fff15a619bded655e09a44e67827d87431848", "votingAddress": "u1LbFzLay7nKiTor2pYZUkpfyra", "isValid": false},{"proRegTxHash": "937307c0313b96639e5eb9507dab16003cae9de4a5f29041de9b967533e5c29f", "confirmedHash": "218bddd1ff95090b58999584522ffdb7034140b6209742c40c00000000000000", "service": "00000000000000000000ffff52d31921", "pubKeyOperator": "898a2d37e7816ae89b5e333999cebf87855d1b423ccb66c0f530eeacfea7d56b1e37bffb8f506a35243e2b2269c95fe9", "votingAddress": "4GeyApb5xghoA5V3HqRF6GVdLDbW", "isValid": true},{"proRegTxHash": "6f57957bcde28b9172e70fa4782de4f6b91a90f54d64407aaf9d985be3d8d1cf", "confirmedHash": "c5ffb1465276b9ab1edeb92c1b10ba9ad63e367adde1d2f62800000000000000", "service": "00000000000000000000ffff2d4caecc", "pubKeyOperator": "8a32be69f09c68d9cc38fb5f8ef3e027933bc29cc67425d89e6247e169d158eb6cbd87eb762f88fe14826120693cf499", "votingAddress": "3m3ZR9ZDmoPD5K8dUmtVfhvJGvnQ", "isValid": true},{"proRegTxHash": "956c0bcad4de07e3f47a581c20aac99323453308d57317526f5d032203dd2066", "confirmedHash": "70d7c6dd1354bbd7cd90ecf1ed03a25f1d8fd40b077617c40e00000000000000", "service": "00000000000000000000ffff2e04d9ef", "pubKeyOperator": "106af896b24eb96e44f7e41394ed695d66a17bda2a7a153e4cdd0cb197e31c8372142796b6531ac141770de5b3b43447", "votingAddress": "qiMo6NyaVe6WNj37sW4RHCqC5cq", "isValid": true},{"proRegTxHash": "1b6aaa8de8e05b870b4de4348994d9c71ee45df11aa892c97ef728f2e5327ffe", "confirmedHash": "45911d0ee2f28306d0ca21165d09a60900ceb9b4da26aad81600000000000000", "service": "00000000000000000000ffff55d1f18b", "pubKeyOperator": "890be480fa81540a59819599d8ff477277baad5dc9557016b5f82599bb72949f8d558f3934e6f35904164075dbd71080", "votingAddress": "2jmyrmcFjZsEwQEtjjX1YBaNKB8p", "isValid": true},{"proRegTxHash": "7b8f8b6f4c9761dbfe217e078cf6ad6eea8182c7b856cbd0654fb23d7fdd6899", "confirmedHash": "e4ddd6904af8810099779a4fa1c13221eddd1a7daeb8cec20d00000000000000", "service": "00000000000000000000ffffbc28b98b", "pubKeyOperator": "0e646209a68a0fcce7741f0030b290cd47559ec757820c1e82f6baa62e28408ce38aff3c34de5f85ef84837bb1f67ba4", "votingAddress": "KeEeVaeigc1rNW3ZhXamuZ3HHd8", "isValid": true},{"proRegTxHash": "db6173089d0d77e4ec29a000e637ed2e999f9a3484440031798c269e1ea78dc8", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b006", "pubKeyOperator": "8add2d567705dc20ac0fece29a6f0b82b32ff33e339a107ea1cdaa770cacd2ce6756e4d13267bec8425b124a73be5449", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "0dd54e93b54fdedc57a6a5befa278ff1239fc4783fcc218a40e3fa1e490a1bb0", "confirmedHash": "e1684286bfad667c1880bccf36a93a1570c93a14402723921e00000000000000", "service": "00000000000000000000ffffb07b39c2", "pubKeyOperator": "04a5ff46aaf9a699d25ff3e76ba77fffd8bbef57edc5e4f92683c1185cd739e1ebe4d87b25789f5c8300ee91031e235c", "votingAddress": "3i7xBQWq6cTnVAnuRZsJHexg8jAs", "isValid": true},{"proRegTxHash": "fbcec29b99a114e5af96561c45294b2ef6532240f211fef093fe7769e1d6176b", "confirmedHash": "245d2aa1f746068da867c375cda4d963bb09e0fd9621fb752e00000000000000", "service": "00000000000000000000ffff9fcb3dc0", "pubKeyOperator": "129327f57de0d6a08ac4418087d355e106ef091a11d88ec88dd4f9b2acc1889e500713c739b4c2cfec0e1d1d9cc25375", "votingAddress": "3fTDjUhET8uudEaBUQgP1KbkX3w3", "isValid": true},{"proRegTxHash": "69b0adde6b886f06d51b8f1e8347211fa461cce8cd0e02edc269d623e96f6987", "confirmedHash": "945ebe52c628a538785c41597b1c847b27b13bcaad74ffb00700000000000000", "service": "00000000000000000000ffffa75646fb", "pubKeyOperator": "073177c2e868234909c28709d8fd295bc8ed941aa5e4d25a77374369bc11bb5ef7b71ab6eea526e68e2f7a2ccf577228", "votingAddress": "4Kp3JTkiceQSMze6FKSE5qzUwGmh", "isValid": true},{"proRegTxHash": "adb9079e4a9971734e5808bdacb2293e29171cf4684cb125cf5cc0c5eb9fd1b2", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b059", "pubKeyOperator": "8dc3e7774b85393bf92e021ba950ffd0e8069af1680b9efe9580ab8db03c5937ae34e3c9e7e901791f418999864262ce", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "b56773b9ef0f147874c82aee73d2c793067a76ad42fc9f47c13c024835a3bb6b", "confirmedHash": "0a3424ccd1d4d1beab23b417ae3ceb3bc221f8ec14d216f40800000000000000", "service": "00000000000000000000ffffb951a469", "pubKeyOperator": "883dab52e19ce6158357283a120d3e898a90c40546741b52dfd265fb284b8ff5c563ef7ac74c419ce8a46440fce40d6a", "votingAddress": "3YpbtaYaPaDdmgpkTmaaJdgwjJKR", "isValid": false},{"proRegTxHash": "792838d279b063cdb91ecb5457d6008ca5f3af28549cb24efb0528d08366f19f", "confirmedHash": "816a43cb8d71a340b5af39e2915301bece1bcfc4414e7d680e00000000000000", "service": "00000000000000000000ffffb29d5bbf", "pubKeyOperator": "98403abb1dc9b7b0ecf3de0de934fa3e2a296ddf452eab0732c55a38752820018dde02dfddd316d4bc9f4b4f37f936db", "votingAddress": "3fhnpX9w8FDSV3Q56xVo4sn3HogP", "isValid": true},{"proRegTxHash": "4a112c4476fa2bf81fdba852974a55e6cac9578dbd7234d49ff56487c2f66a8b", "confirmedHash": "9aed39f99594cf0a4993f30d0b1cf0a8754c4a3f8588e6921200000000000000", "service": "00000000000000000000ffff2d202213", "pubKeyOperator": "8a09b4c47cffc9614d165e13d8cbc8837f8cf3a0eec2cfd8251b434dac89d347f0b1a7a03a23468a0659f4485d0a20d4", "votingAddress": "xqQ4sejPQDxpw7u7PPLUpyYDK3d", "isValid": true},{"proRegTxHash": "cbe18c55edaabd4f0a365c87a7d1e6fb06d9d276035d5df61cf50fd73a40df86", "confirmedHash": "d8e25e5d4581c1c387012a714f499815651f684b301bf3071200000000000000", "service": "00000000000000000000ffff52d319a2", "pubKeyOperator": "93715aa9fdd42f796ce3b726d01254fec10647479db0fa7775304d540ec608a3040f6a5aa1326164ac70bf7c5634303b", "votingAddress": "2rydPqhYs7sCcT2aD54NRDxvy1LY", "isValid": true},{"proRegTxHash": "119a45b6e05a4f6de2dcc24a5225dd30e62dbc4635b15b564bc95adc6af4a47f", "confirmedHash": "587a3db12575066750bfc79382791e8d8e337b66657798561200000000000000", "service": "00000000000000000000ffff68cf82f6", "pubKeyOperator": "11b70a4e4c15676a026dd333c75a3e2b19daff4dfb8744cef911450b55d1886c4ca116c65203662476916e6233ddf239", "votingAddress": "45W9x6mbbwMYcfBC3NJMFwRVSTbh", "isValid": true},{"proRegTxHash": "a84138c0b3b0b4b80b7efd2751cd341206dab733bd427a56c7ed3cf4b82fb106", "confirmedHash": "5f3d1cc0f4ac66e78d503704aeeb91ff712b98a2c189c76c0a00000000000000", "service": "00000000000000000000ffff2e04d9fa", "pubKeyOperator": "81fcdf5adfb8f48190226e707fa1bbcb3350c597026c339203ce1d3d29cc1b1e134a1e7e1adfb59fe84a82c8f918f553", "votingAddress": "413mQ1gwGyhEEVTQfSwU6J9FhUWW", "isValid": true},{"proRegTxHash": "5e46d27005a8f27e8e31d0b9899de3af05b429c3814ac252eb3fb4367e4a4621", "confirmedHash": "7602dc636d2cc1afaaf64b15090dd7bc16893ac16c595fa30400000000000000", "service": "00000000000000000000ffff55d1f17d", "pubKeyOperator": "0c24bbdd53c81581d21c40a88738489d6c349bc08d3d3f183e10db840f44e2318f31e7136864ac791173b33640274016", "votingAddress": "2gPEiJM7nexj3y9VHYGFJsUPg7Vb", "isValid": false},{"proRegTxHash": "133bbe19f248ab48429829101ea75d81eae71fe6ab564bf9e42fe2643f95a910", "confirmedHash": "dd7e24c15e87d7e71471fce17fda12fa2307977e7e437eef4800000000000000", "service": "00000000000000000000ffff68ee9f0d", "pubKeyOperator": "8e10923c85e4251604b077a05f28e3f18c576a81010425245f77268b3e10e38502cf46efb75be368670539666938be6c", "votingAddress": "jb9LC1D8Sz9Qtk3YnEbcpByAEj9", "isValid": true},{"proRegTxHash": "c692df869f78e733473c607a2cd26653f60ef67d03ae4ff2c8d8beb158bcf6eb", "confirmedHash": "716607dcc2024f4d671964af327f1737e61f96ef101d5f132100000000000000", "service": "00000000000000000000ffff3e4d9d87", "pubKeyOperator": "92e95079b572beb3ee66e65f2b0fe3cd8468805228b33f9ffa687c4666353ed5ad4e47eba130ca246c7cc42373cf0b79", "votingAddress": "D7giiDhiCbCduP42MQAMSFYa31M", "isValid": false},{"proRegTxHash": "36e32c4cfe8a469f8e0069fd22164554ee7ab8489e6cbadaf33b4e2161b4e690", "confirmedHash": "2f610aa717d6b1fc4bfbd6c6a93b5a3bc268c8d5bb0b8bf10e00000000000000", "service": "00000000000000000000ffffb0df8dad", "pubKeyOperator": "8b174269baa3334401810d7638ec638351c8405c449424756d119f54b2014610073830c6353bc0170fb00a46e933ee17", "votingAddress": "5gAYv1sA5cgRKTz7qKgnugD7FJH", "isValid": true},{"proRegTxHash": "b59eec89c4deffa4b2c6cc775c398e72e50bf800ef96814b3d3b06b6dbd75a16", "confirmedHash": "8fdc8edede3f77653deceeea54a5e3ff2767cc2f7abf646e1300000000000000", "service": "00000000000000000000ffff5fd8e667", "pubKeyOperator": "81a5c8199317dc83bebfa4b00c3c50c3c3ce9e1af8271016c44821dcb3f4a8181a35c21e3914d765f5a4e2059ebd5bbb", "votingAddress": "G4gpZbaXmZRhTELuopJNiFFVquy", "isValid": true},{"proRegTxHash": "6a44e0fd3e4d4c2ec452ea57f041159f26edc3a019a2f125732fdcda16b67552", "confirmedHash": "9cf3b5cdfb42230344745a4670ccc70a9a548444e711004a0400000000000000", "service": "00000000000000000000ffffc28753bd", "pubKeyOperator": "916706f1a80232c0f81c904cb29037e1803d77e8d18520b6986dcd0bceb18dcdf8c7fad9068e8c2e4326a530ff879c0b", "votingAddress": "3mjTH4mYH9aMtc5N9H88YejZJcw6", "isValid": true},{"proRegTxHash": "ad24d2e61a7b688b6d8a3ce85bd747e42aec7f3c9016da2c8a0591251bc776da", "confirmedHash": "a29c74fb3479bbcc74497d6602c50921f2f28889b72c7c733a00000000000000", "service": "00000000000000000000ffff52d31960", "pubKeyOperator": "100a733c6eff643d68f8af2db4ae89f4b191b042b5feda21ea7237a99583a51fe904c57b3d6a7d998b6278537bffa4a4", "votingAddress": "3RaEGya4Bv4nNbe1fAirzWZ1gJ66", "isValid": true},{"proRegTxHash": "fd633beabaed18e65ce83e66b3a70a7211bf83348c2114836b1e0f6c47607279", "confirmedHash": "5f3d1cc0f4ac66e78d503704aeeb91ff712b98a2c189c76c0a00000000000000", "service": "00000000000000000000ffffd4186d23", "pubKeyOperator": "04bec73de1a696cd1ca7fb54d9512a6716c37739e8866b2369bd065e48e65f485624129a040108a6fa08d9ab00969aaf", "votingAddress": "tmXxbuDNxbYcYLkNXoqLM3R5hA7", "isValid": true},{"proRegTxHash": "87379937805e29fcad0795f36a57d3645f38964640f926fd289ed7988bf6aaff", "confirmedHash": "a19d103fccfeab027fec8a296b846de333cc87f6e08e740b0c00000000000000", "service": "00000000000000000000ffff52d3196a", "pubKeyOperator": "17f9e6c9ffed21ca3d3357f31c18cbc541d95c232025b705a65d7a32be10227c804454b690b28ebeaad910478559cbc2", "votingAddress": "2R1YaQh8PQHPEQaDPtGQ93mSTokK", "isValid": true},{"proRegTxHash": "fbb85b39fd8dd81985f7150788a30396d31e7c1346222b9fc3886896b67081d9", "confirmedHash": "790acc3c6e44b61cdcd205c64c13672cd701e4553e6a85f82f00000000000000", "service": "00000000000000000000ffffb9a2f90d", "pubKeyOperator": "143e48c8cd85f239b970e3e03504c7d70d207096dba1649abf4de16958e2ccd9c5ab01946ab310408acf787b01ca04d3", "votingAddress": "pMNFos7KRQXo8tjMQT92xNvG9cn", "isValid": true},{"proRegTxHash": "ba69b2ea01dc621a0483811d71316c1a5fd11f68fef0e8b93126a8773162a676", "confirmedHash": "889c4a1efcc4b8ae4737bf798c12637d1a44b702cee58ccf1d00000000000000", "service": "00000000000000000000ffffbc28af43", "pubKeyOperator": "982c5a74b3cf68e5958396d54a3992f7fc694fb3bea46cee74967ec0fe8777a6545ca5f7eae148e93602614964970d87", "votingAddress": "3Rg9g9FXf6miLB14wKYdwFcYsaC7", "isValid": true},{"proRegTxHash": "d93a3bf431308de83b261da5508e87aeadfd8397e43f7a25b4827728aa9ea41f", "confirmedHash": "f03c5467532ea5cd4ee0b19e89971b8744bfdf695d9555531400000000000000", "service": "00000000000000000000ffff877dce07", "pubKeyOperator": "05b7a94d24b917df09edea7fa8d2cc82f60fe63e4a73a0590d739350e3749db979d118392cc04b9c526b2f878f27b070", "votingAddress": "3yCk6i7nLrytYarkF9r8AWNjkQZ4", "isValid": true},{"proRegTxHash": "b716445f1bede7604d29c2f96ca36053e9ecb88186f10202ba89c0e79f7692a1", "confirmedHash": "8742eb4ae3b7f37baa068331a65b1ed532b0b9d70330daee1100000000000000", "service": "00000000000000000000ffff9f418c9b", "pubKeyOperator": "0af7554d7bfbae333c973370d2d3bf93b8ee122b083a721fdb4fff11483f2ec22657bf88a02731daa697c6fb1ff48dbc", "votingAddress": "2AUyxj9CHaExjW1qyCGwFWYjAdi", "isValid": true},{"proRegTxHash": "e2c85c287b09c25ec544da6f0e66abd88d80190fed0f909dca53a4d361843181", "confirmedHash": "3550b4f95ade9743bd2f22972f090033a4d43ee28b3309941d00000000000000", "service": "00000000000000000000ffff453d6bd7", "pubKeyOperator": "91cf78e72aa5f2c07018b92feb6f33e2a2aac6b16e592df6797a83799f0155327d07fce524f25e09482aa4ec6d069a25", "votingAddress": "eY7vWhHJyr7gSEaEx9UZJnq9xEV", "isValid": true},{"proRegTxHash": "0f4a76a306ee6de7a6553e277be0a3a3a123b57e4a267827c823d72488367ca6", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b09d", "pubKeyOperator": "90f3bec018fc2f3db3aa0ff57f40e7fd869399417fc3fea18229a120a0c2542a1bf62aa985eb39a24f1a1cc229e0985d", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "ffed9423a9e237ac34c29ac6c677b9c56b50da353ed9634ce0b16d59d356eb76", "confirmedHash": "02b6d3510a4e053b487e6ff42a0c289b526a0619f3bbb9851100000000000000", "service": "00000000000000000000ffff9f415427", "pubKeyOperator": "8c1c732ca137bdf31932dafd19efe56e7155d256db9544ae27f590fb62017f0f32536c7de15cd830704b07f9f52fc9f6", "votingAddress": "WxhHkgUxRuUzMgZuYxfNULkaXJz", "isValid": true},{"proRegTxHash": "1d74df3f1426ae1f3d845556bf5aeebdbedcdbc58ab701eccf84ad323a8f898c", "confirmedHash": "7b5f7c5ae189b2f3745c2ea820f393ca50c828496f94d3870400000000000000", "service": "00000000000000000000ffffb23eabe3", "pubKeyOperator": "0849e224037779c2c0972462899be8973a0bb64d81e7f9d499d3d75e77391baef6469ccffcbbaeec012888a2cfd3b278", "votingAddress": "2Sxx21py8Mk4PwhwyBwyrU8oBmNh", "isValid": true},{"proRegTxHash": "2f5da5033fd1857996757a350ef4b136f9e3a216c3322a9216a8f3e1a5bca7ab", "confirmedHash": "32bf714fd6305ff7cb44acdc7d144ee60a3935d558f6867f1900000000000000", "service": "00000000000000000000ffff2f5b98e8", "pubKeyOperator": "1379579d243fd1d8c314164685e014bd4a5dba02c2254fd3804e844151fe1cbb60a63897c014560e09be87a3fb693ee3", "votingAddress": "2XsfJXkcrXok8B2eeuuQTYLJTnhc", "isValid": true},{"proRegTxHash": "517004936e66d1e1733450bb3edcef5b9a359535e054697c710f90a3b89c049e", "confirmedHash": "8168b3ad5d59fd1fda68340a2cbaf9d24f6a8cfc01997b5e0400000000000000", "service": "00000000000000000000ffff951c999b", "pubKeyOperator": "984ec473d5a429ba2f57e41cb31c1cd37c64360b5cf5841f8bb4d7056788ed25fccb934f7946e79a9ec6ab8f063d09f9", "votingAddress": "37gRM3WSXTtThXibQFmXvZqDkSfG", "isValid": true},{"proRegTxHash": "e668934e0cca21845b6e5b511e4b015cc08b3238045f128c3b68f7b2b056357c", "confirmedHash": "d75b97df3fded2dd3a1c0adb86b3a7d0966a6ef6228db0fa0000000000000000", "service": "00000000000000000000ffff5fd97d63", "pubKeyOperator": "950b07c2e95b0b8caef5b7b8a64a51fe660696a6433db327b6e0b325c0f26ea21cd527938d54233d338a27604f321e57", "votingAddress": "4HC719B1pXtcaZUqwS1ouNzcH82o", "isValid": true},{"proRegTxHash": "b13382e2dfc811ee6f2407ce1f0eadf48b5bfe6516ba7cb8ffe6abcf6abb2cbb", "confirmedHash": "abb652df07bf08d2d6418a3999603a9b76a4ad9da4f98ecf0600000000000000", "service": "00000000000000000000ffffcab66617", "pubKeyOperator": "88d65bd9edae3402672a71a75815655ef9da4dfcdbce6cf152bba729dcfa4757fe8bbc518d9b20b7d3bf0993b8e78ee5", "votingAddress": "2KJpAEPAYzcqoFHhkAZEXX27PCZx", "isValid": true},{"proRegTxHash": "3cdb613ee658430926045133365f96e121bc6a81cb61b338f10bf7db74fdce04", "confirmedHash": "a35c21ce54611f395898c4b9159fdc7075fa16810ff247210500000000000000", "service": "00000000000000000000ffff22ea7824", "pubKeyOperator": "079a442c2ff2eb6f1266eb758ca27ff588c5d66f21c7f1d16cf89bd5e0c9da50b680b47c1fe723adc44525bb3b3d9750", "votingAddress": "qii7HrQteWQvubPPPknFkEyPRhR", "isValid": true},{"proRegTxHash": "f0361409531d2194303483c2751812bb78318a2a2c237d46af2a18384ac1eac0", "confirmedHash": "11a8c8a8e63dd7564218f519f64c2e32e5e52ad3032d23150e00000000000000", "service": "00000000000000000000ffffc2875bac", "pubKeyOperator": "962f4706a58b95212c03bf8f4b8fe8e7e8198f23b33ed49cd68f806cc95bf9acbedb6d95a03033522c1fc715a47b5784", "votingAddress": "4BcDz9Y3RVudJ6jjXpWxZtj8sdHL", "isValid": true},{"proRegTxHash": "dbfb2866654da7786d3d3bb4dd2568f22b4458c8c9cd93115917ee07f871025d", "confirmedHash": "cdbeebc4a3580b1d894014dcafb37c7472a5131b33ac100e0100000000000000", "service": "00000000000000000000ffffc28752a0", "pubKeyOperator": "0e1b2a76538601b875ec97b372d978f440438ec6b85e52c7356e1b5d7dd9772195e0a63247f996bc7ea628f9740b30ff", "votingAddress": "2aXpVcsK3XvM9Ajz7oFbP4FQsfVx", "isValid": false},{"proRegTxHash": "e51b9b0ca335239d97c17c0988c019890cbaad651926878d74720fb71c17dd51", "confirmedHash": "83e8d031aa57141161697f1b9b564bb171864273f4006e671400000000000000", "service": "00000000000000000000ffffd16182f0", "pubKeyOperator": "1629dc433fb8e1e313f805ad3d09464aabca59f61d47b44d5dc63d7861d4dd01f94fa2a6f7c1f0330a11c1f24d9c83f5", "votingAddress": "f3gPNh7jmzFgp5fP1aNUXpHLsHa", "isValid": false},{"proRegTxHash": "25ccf8e288572d11c0f4d8832cec7d8fb472845056888cc5310dbfa14e7c0d60", "confirmedHash": "82966730973b79a051b031201909853dee52dad0a63352330200000000000000", "service": "00000000000000000000ffff14d029eb", "pubKeyOperator": "160ccf7e952074a6ad4ee725628a8e55cf7ca705d3536e7e8dd985f179c48a3917aaeec7fff29c804c37daf3798b3d47", "votingAddress": "3D7srGVNkdu6MQJ3gi2WKQuyoqDq", "isValid": true},{"proRegTxHash": "801bcc8abbf25dfb1ee30ddbb4729f6faa775e93115815133a31f71899c0c969", "confirmedHash": "c9a6e400e15df067dbb63273b0855033a0a3e0c8f8ccfaa10900000000000000", "service": "00000000000000000000ffffcebd84e0", "pubKeyOperator": "00981465243fa69c0b5186b5506a9a62a7c9ca300bb343739965b2e90919fe5686c8af022bf428c92a7752e7bf6133fa", "votingAddress": "3cc28z34YAjC9j758eYL6xmUwJXG", "isValid": true},{"proRegTxHash": "048251b5324f7b1e524a4b22a37b673695e6bd45d5770cdb587c3f921e439246", "confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", "service": "00000000000000000000ffff867a520a", "pubKeyOperator": "9954763d7ca61e6b2b76a12b3f2731d7e706c055acbc3636ecf0feb37189f0ed3aad114f368451dc622827e600f32dd7", "votingAddress": "2xXS2ruqLnXbuKqb85UBL5zNHisr", "isValid": true},{"proRegTxHash": "93b107d928e44dfa31dbf37777aa0c474878c15faa156558ae0acd6719ec9814", "confirmedHash": "5ed4f5fc30e936bcc9c149e0495d75962417f1653c1a2ce71f00000000000000", "service": "00000000000000000000ffffb95cdddc", "pubKeyOperator": "11dc8909b45bbd0eeef4f37ec415e2d29c8678b151ae61a1fa4844c1b0beea1428deb5c214b6389a914e30ce733d9c44", "votingAddress": "2DsVrceVYLLpLjxcnJAqqDj61Rsy", "isValid": true},{"proRegTxHash": "88d8448c90014f395c8b4fc54d14ba1f246238b06fc8f2933eeb506d4ff8e375", "confirmedHash": "042a6a6df3b7c1751825c10b1105af08c045a054c651e8c21a00000000000000", "service": "00000000000000000000ffffa1614068", "pubKeyOperator": "94744c25e22d5dcb3bb44b5597bc86d212d9a72c6f7da9a591e7026293b6af123623ef9180c50f845b4ebc620bfdbe9e", "votingAddress": "2nUMc4ufnUePVNXeXTZViyEDY4M2", "isValid": true},{"proRegTxHash": "afe7976208c8e4e48038eb1bd913e31c0d150275e9ee378d0232066757ce577b", "confirmedHash": "0a1b5ff60a979578f1e4c9c0472f369da0bab9a3fac104d10400000000000000", "service": "00000000000000000000ffff33d2b5e1", "pubKeyOperator": "8c5b2915e2d9c0f137dfcb5475647122625350d9aaaa994ff3ddbb12cb53e0f3cfff73446f47458eaef405297dfb77ee", "votingAddress": "4YB4NsiDHpD5iQJ3y8U8RKYnfLhz", "isValid": true},{"proRegTxHash": "47d7eb1542a9447af30b28cc506a117e84fd827c4ee974a14aaa1a3a6b313040", "confirmedHash": "ab25b4d2afe1c56f9b33733608b170a3b2b23c76b6e934012900000000000000", "service": "00000000000000000000ffffbc28a313", "pubKeyOperator": "104761b17c066b81f49cd1bbe38916574a196e65024e18e1bab47c647b11b5a56987d538f6b7b26caa49512dd4c373cb", "votingAddress": "46JfFmy2KPFF6HtzbH7VshcBy2Ak", "isValid": true},{"proRegTxHash": "480af4db162acd00beac48c7071971b6964f59e72e88ce37a8f447ca04eb08eb", "confirmedHash": "db22593e36ec7739e08bca1a55f2edd474ecb0cae88648980400000000000000", "service": "00000000000000000000ffff2e04d9f0", "pubKeyOperator": "083ff7d46ea23b6aa454ab4be3dbed4970eee62851e5e627aa92d160d6ad7dca29533a5411803f2e3c27604946f5395a", "votingAddress": "351qTdcu1QAmZ5a2oNmpiRCEV84v", "isValid": true},{"proRegTxHash": "cc906750fc5b8952d8869c8cd1fdb930c0152a949a98f747855389a9173ae617", "confirmedHash": "afa057701b719b4e26cef7b11c8f601f7ee10f4cf0517e651200000000000000", "service": "00000000000000000000ffffa763c73b", "pubKeyOperator": "1720d00636d5a9555d66cd7d1459ff8ad9a5ee9f8d31c748f7258064d0d89def6aec6e777abf9c702cb45733c6bd03e4", "votingAddress": "3g6p7LWCv76Mh6K8K1JnYtqAW5mE", "isValid": true},{"proRegTxHash": "219927af315d61d59de191af022ca2bd7cabd7e3ff643c0ee28beffa2d2cb5f1", "confirmedHash": "57f90584b295ee6bb36b83164fc8836b6dd1da5e7bca745a2800000000000000", "service": "00000000000000000000ffffcfa7401a", "pubKeyOperator": "03435a8e4d6f4b382cf9d34a5bbf7c75798388444e661100fadc0d6ca7d0035b3b0891f3348236365477e0ecd7312b94", "votingAddress": "44DCF2M1rW55mBqJxWHgJfpmaLvj", "isValid": true},{"proRegTxHash": "e48c0a18b4a173e338fc0667d1ec15a167402749195282da1d69957974523359", "confirmedHash": "72b294c899e711b1b4d7be920f7f4f8ab9e4b775a3ce0f850b00000000000000", "service": "00000000000000000000ffff52d31526", "pubKeyOperator": "0b87469f21c89d603a8da15bc4947899350d607ee5c56b0d620d4972b1657f165e7f3cbe91dd08cea762135716acbd74", "votingAddress": "3EJwS4zbcZbgx4kFaW63XvbfKLGi", "isValid": true},{"proRegTxHash": "18acf3db29b692ea86718f1cfb8a3d3f83e99fe29a1a7e5164274b6883f83470", "confirmedHash": "4eeaa083e11dc3e3043d039c227192fd62f58c917f6ecd3b0a00000000000000", "service": "00000000000000000000ffffbc28b243", "pubKeyOperator": "935a536da04326da4fc3ea1b62925437064fc13622b0aaed789e5fd877ae8dd65c8ab35ce52ac85bb2afcbeb1d2694f2", "votingAddress": "WdJBVQmL2vgq7YjonHQb463d4L6", "isValid": true},{"proRegTxHash": "ec56e6d2dbb1b2a6b216e4fa43946232002e9fa3db9373037980b78456f57c13", "confirmedHash": "102b003b633da78cdd3e61f5f9de757099f4436c1eca5ad40900000000000000", "service": "00000000000000000000ffff2e04a275", "pubKeyOperator": "82ae4069165bda602920cfb5df733bc0905ccb4760450cce81e7eb38f160d5c996bc9bffcfbc6aa42adc21718d91acd4", "votingAddress": "2WaSFCWmZXtdxk3YEaKAu7QAWYnk", "isValid": true},{"proRegTxHash": "6852b277a6cf54d5285a4f391583c7ba7ef9f9884eefc2381d0582a76a8b23dd", "confirmedHash": "5f5128f4a6fcd15d38804078b365265dca1a207e922098901200000000000000", "service": "00000000000000000000ffff05bdfd78", "pubKeyOperator": "8ddd053b9e5a3c0353c7512610ac52458c5b8c11f5595c1e3f65814791a91e65a447f7765bf300ede603cde9562d9e99", "votingAddress": "4A1Rbwi7e8A5JWoLvEyZULL1SS5o", "isValid": true},{"proRegTxHash": "ca83dbe697dc4aa123c7570b4f22351b7eed2e58365cd82765e391edf00d6722", "confirmedHash": "0149bd29426bb8a07e7b5b958a7690a2aa5fd7e8a5958aa22300000000000000", "service": "00000000000000000000ffff50d0e566", "pubKeyOperator": "90d35d216da01be147648c2ea2cd8db99038752d3c7f51ef0c6d698ee5c29c4feee22516edb7987ed4e842f420cdf18e", "votingAddress": "3qJsxD2Wh7zdXr3eYwwRubXDmWjX", "isValid": true},{"proRegTxHash": "b5c1d50c066741d03b2bba66b4682a8b13ebe1403a05b8ab25348a17e49a6fb8", "confirmedHash": "b16ca98235908de7c923862b2fefa145223df293267847400200000000000000", "service": "00000000000000000000ffffc2875ebd", "pubKeyOperator": "919843847b2bbefe80c6e33621509fa9f1f88654c8dd153bb5aa5f3e300ef59e8a65e2da672718f69e5fea51d078a6b4", "votingAddress": "2H77kLnMFZtCygT9Wq1LZo9mmDLD", "isValid": true},{"proRegTxHash": "faf1929200fe0baccfe14b82fd0a59ff3cba5b7a4a58ff6c468072c9c4bba08e", "confirmedHash": "e59accf123796e0e7dfe26f4fd3dc8a76244603294deaf201300000000000000", "service": "00000000000000000000ffff52d319af", "pubKeyOperator": "17f503d6cbba6a52216176aa05eeef22964ab41ebf96da0d0473e7b506f3a19da06521793cef82b438b08fe3b31f72fd", "votingAddress": "4N8HH9e9qCNuWaxidBgoeJj6DPuF", "isValid": true},{"proRegTxHash": "f5abfc8fb41875be4ffd614ec57e61efcdbd879a9442599a26c699ee434132cb", "confirmedHash": "0bd0b6e25dbb511814084fd886522b81a34fbabd17724f1b0900000000000000", "service": "00000000000000000000ffff2d4d2a2e", "pubKeyOperator": "8dfe9e8b0fc154eb50cbe674fa6b6533b4722b2d6653e4664b49165e8fab7d2e50f0161c9ef344f3e0918e28a812225e", "votingAddress": "2rHm7xCPoou4n3dkE4tRo8JJGn5t", "isValid": true},{"proRegTxHash": "5c88914208b024d888912ffa42429b34ba4bc52a1c5eada0fb0cd800e55cec7b", "confirmedHash": "c59097ea83dadd5a9cd8f16e7d40bdc9375a72c1fc1dbc542f00000000000000", "service": "00000000000000000000ffff9fdf3c79", "pubKeyOperator": "906fbe029aca39fc2b529db0e6adfa53ec82c82bf9a627b457f4ee2d5fd104f293e1aa1334c74ae47a7925b230a4847b", "votingAddress": "2EefhM4AsfUgfHzC8ZENWYMuMjSV", "isValid": true},{"proRegTxHash": "9f2488933aa2ada7f1663397bd17119cfe32ab43a163c495ca2b69e203efbe99", "confirmedHash": "657de99cc61915e1d2fb21e671918a02464a41c1ecb815d82200000000000000", "service": "00000000000000000000ffff55d1f1d6", "pubKeyOperator": "063ad45b1dab6bb712caeeda4aea34ebe7a48d2516818f46109956700819671967ea7938e5002842ccb01c877769c1e2", "votingAddress": "wYs1pTGZoUPn7aa1rYNKMWkxt7p", "isValid": true},{"proRegTxHash": "65e77711edc8124a51431534f7bd1b72959743421d4560dcf6ee1d50434b6eef", "confirmedHash": "c88dff642b627c0b4c0b1e8c4ee66de6ea41220c077229831700000000000000", "service": "00000000000000000000ffffc0f1c29a", "pubKeyOperator": "90bceff9d9fb7a1bba76750a97c02a3ceaf54626252d95ed172023c5810b6a4c1817c0341d6787ebba1957f1ac2225ea", "votingAddress": "2qQRaj9yeMtKk8FNN1CV5WNPkX4j", "isValid": true},{"proRegTxHash": "f8722249e6aa85451561065f6f35c740718da0b03749e8a746073771a8b35a75", "confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", "service": "00000000000000000000ffff55d1f1af", "pubKeyOperator": "8a8e8be29c61ab6d1574df8e04af7b7f3262624a4abbaf1dd60e7f9bbf88426062823d850951fd7849ae577e29506dc6", "votingAddress": "feBABkkrkyjGoa1gHt1XcazRbiV", "isValid": true},{"proRegTxHash": "e6f0bf327b407704686488760b632e4962ec2680c77566632ed319e3ec49091a", "confirmedHash": "fa15dc9307399039b9020dbf49ad9dd7c7e7d5c94a73bf410d00000000000000", "service": "00000000000000000000ffff3353f629", "pubKeyOperator": "117245f06688cd5d300e3fe27620d0c6e202265f413cc0ccf7b720c29c6c4a3349780c203f38f13bdec69f375e61b8dc", "votingAddress": "3kEHVjDeXrH9zNVAzFwzgNfAHQdW", "isValid": true},{"proRegTxHash": "a4f2706b3a8529e1927f73198e177a9437d0e335bbf6ae3bdaa038ee3bb42269", "confirmedHash": "bb2c8d3c64ac1cb1746d341f3ef8aeb883242dab52fb7df61300000000000000", "service": "00000000000000000000ffffb009d200", "pubKeyOperator": "87398223d0ef8ccb7457f15ac29a89d2fec0a6abad6e0c60753aa174a08b958d2eba9496ab301aeea2cec559b53a806d", "votingAddress": "3hpAEBYsoPaCiLNqfGFJZVXNsZUV", "isValid": true},{"proRegTxHash": "2ca367a209b187204b7bf500783f04eb2edb7bc7cd106960caf280cc439f0d48", "confirmedHash": "559d6d23d11c5bda0e05afe1cff7080ae89bb5f16f0299cc1300000000000000", "service": "00000000000000000000ffffb23e6613", "pubKeyOperator": "0ff76c386f174097287e7de5181d894ec60fc2fce77b64cb17923285044b0ea71a336e28800660cced6e0fa848291670", "votingAddress": "4UR7UVHGJqom2RkMe7vmEkXwDaFa", "isValid": true},{"proRegTxHash": "d77ce9f5f2f38dcc6376aef747642340365bcff42052a4c372e18293657d31ca", "confirmedHash": "7df9928918243251b61949ab3d08bdcf910bfa66d20750531b00000000000000", "service": "00000000000000000000ffff86d1cf47", "pubKeyOperator": "84c0119e582c6d545c78b1e8289f4333dffcb104164efc490baeb490f63535ee3b1e6e6621298f2befd92911f2e423e3", "votingAddress": "3Btdc1Lotzg9LZ8YDCcmqgd5fcU8", "isValid": true},{"proRegTxHash": "2946e1f5c72010e7969b41de32aa644765269bd1d8e656d8bfdff390a47669f9", "confirmedHash": "b0b6a5fe8ed4f98b68453acccefd9172bda6fbe23454c6c00e00000000000000", "service": "00000000000000000000ffff2762c9f9", "pubKeyOperator": "0be2b60d45505fe64fad7cb9991394d3ea29a7383e8952e40343db0cc6873735f22b21eb0e210d89bd981a82d9a07742", "votingAddress": "3UHtUjGUwQpon6n8NwuV8UEPnGXM", "isValid": false},{"proRegTxHash": "7c6d6eb4511f2df5c580cbbaa021b03d09837b56c92807d1f49582570fcc6551", "confirmedHash": "dc352e177f0fc11e3b8ce55fa685b6379c222c382900b6ca2d00000000000000", "service": "00000000000000000000ffff55d1f19a", "pubKeyOperator": "0eda3c087f9a593efe4c8fa7fd4ce02c587952b1bc20a49b2d21d573213c4f47a6db3494b1a33a0749518ba3bc0002d0", "votingAddress": "3knApAApg5cZJ8ikRcnzdzieLTr6", "isValid": true},{"proRegTxHash": "a8f4c7aa384de6b59b4303d9fa0f96101ff02a64aa44254708bdc158404f8ce3", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0bb", "pubKeyOperator": "124b5e49fd7a3a98ed9abecef8c90d9943408e90961ab48d285e146825421dc4ac0cd16b2e3131473f68ffc0d2a15578", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "4e5f680997d38172c28be9ec8b7dda2fe4c58a65c19393105a835aba8c408091", "confirmedHash": "3dec8e7d2e81639ba08c09afe9a48874d331f212148437f72400000000000000", "service": "00000000000000000000ffff867a27df", "pubKeyOperator": "97c029164f02ed298fc001ea31041b5d5770f55a7903f1188792fe426f3c32bf873ec8e7216735b8bb25729b5dbed4fe", "votingAddress": "KfLXxx7Xe5docsNpzcZxntt7VDA", "isValid": true},{"proRegTxHash": "caa08d9ada18ea679d6c2400971efb21a14f2fcb8a27864725fb6e2821841906", "confirmedHash": "71a4826418d5f73ea88d0f40fb501f22e1f21d6525c547090e00000000000000", "service": "00000000000000000000ffff2d203588", "pubKeyOperator": "1669b3ff2748861473f72f3cf92091b934820f340b646227a9c2c936ac0a3304af3a32cde25806ccb12d89c1adc0e1b2", "votingAddress": "3qPzw1Y8uX8xpvUogWgjfiVsDH1J", "isValid": true},{"proRegTxHash": "77a97f7cac8a142da61f63006263a4dbeb11ebb14341d1ba8b768c190da3ff5a", "confirmedHash": "1033e7622144db4dfa155a51cde5baf5b0744be0a8475a5d1100000000000000", "service": "00000000000000000000ffff55d1f1c7", "pubKeyOperator": "835f8aca7b3a8b31857a58d1c04badf2ccccc9e6f42009edfeaa857921ba1657e73c86396486649e47a45e1b7ed184ee", "votingAddress": "H7LRTGu2NA6kzZXgYRHyG2eZgPf", "isValid": true},{"proRegTxHash": "87111ad44a43a108e3a7d46153881cb359af56b627469654b7047779caca1d33", "confirmedHash": "6edc9fb2f4437b9a0227c7c8b118c8e3f421438c26a72d050300000000000000", "service": "00000000000000000000ffffbc28e701", "pubKeyOperator": "0bbbe5b660800086bc5b60a2100501ed7ff4dbffcacefde6de62a377cd85d1fafd5fe35c3cf2b8f64da01e636bfb008e", "votingAddress": "3YudWhCpQWrSpyWUFNcChMzCDiGU", "isValid": true},{"proRegTxHash": "5698ef05bcb330da7a54c8b7d3f47aa43f938dbf7fc960e2ce24a58e98660240", "confirmedHash": "a3e43c05adcff93d62c4c6011b7031345c56bd4f789b68ac0900000000000000", "service": "00000000000000000000ffffb07b39cf", "pubKeyOperator": "86ff342646a89bd1a1b2d0a91884145d97e61e54fa7ceadbba383b6f2c3e044952de3fb5c5527630ac3a18f1fe1a7d00", "votingAddress": "2tzYBAJpyJ5HPbptZrfAbq9Zrh9G", "isValid": true},{"proRegTxHash": "b62eeb5db1177e99e6f76abd10c77ad1fa5cfdfaf57cb867a326a0ce54c3a7cf", "confirmedHash": "fb2d7772619d06e6b9b986e4a8d311ed126767c76aa729592200000000000000", "service": "00000000000000000000ffff8ba24931", "pubKeyOperator": "91eb8c308ce3e53e56f55258f406157ba5f9c069925908e7911989fab17439b615e75ed12cf9a9291e851e14daa8befb", "votingAddress": "3DUwgcL9jwf1W9cDVBWg3G29YGEd", "isValid": true},{"proRegTxHash": "e5d43140455c2e6c66ad6fd4fbe0553583ba033875e9a9a8ed74675a470592c5", "confirmedHash": "00476112cc95846f5406a66b9334245353c1adc670148f8c1000000000000000", "service": "00000000000000000000ffff44b7c075", "pubKeyOperator": "150f85dd97cbef73c72aa8bb0dcfcb0dcc4089a3f5c3a54fdc9b4a6e64047800db76f71e82d4f8b36496bb7ca6d485ee", "votingAddress": "4TUvJC6XHNB8ZRJZRLPPJjt5WrPR", "isValid": true},{"proRegTxHash": "b5494d7add77845988f61297dd0e1c2114b885e0fb827068e9f53011510cc0c7", "confirmedHash": "a917cb9c0568c72f22ea0d63651c4e153c93ca8eeb94c68a1800000000000000", "service": "00000000000000000000ffffa45adde9", "pubKeyOperator": "8a7fed582772bd5b1bd5ce18cd6647103ac7546ecb26788669d59ce1d20d5c23622615181a0267da600b56180afb4a59", "votingAddress": "3GMRFtrdao4TPMGgXEaL1Zx5vhWH", "isValid": true},{"proRegTxHash": "cd4287cec16c861524cd74794dcf9ef107af79e958c7dae22fdfbff0ebe2bf78", "confirmedHash": "c6c0f09e49f2c43051404a562f9d3b8cef9c42b41a2cb1cc0300000000000000", "service": "00000000000000000000ffff9f597dad", "pubKeyOperator": "070bbd1ec68dc81d3adaa861b621f834739fd478ad04b2c59833987ed5cf6a980046f90c2191f1bae993f9fe1613d4d8", "votingAddress": "3geK8hmzycchF9WW2GfMPTojgDbK", "isValid": true},{"proRegTxHash": "66307f72f006ff03720776e4980359ebddf00e24c63b906b3123daec35ebca99", "confirmedHash": "75d5fa513ec1fc7047768e44e059092a272f174c2791e7ce0a00000000000000", "service": "00000000000000000000ffff2e04a269", "pubKeyOperator": "102e40fdb4264af0632597336bd6eb99f7d055165699985bcf66253053371b93716dea5c432878c99d83be6301afd530", "votingAddress": "YHFirvozEJYTEdYXoMqDaBJdYbP", "isValid": true},{"proRegTxHash": "07da8c6d38b76833422abae2dc034b611e1ba858d38280b2b9ca4d2052a3871b", "confirmedHash": "fc65462593661c035ceee33fd9e0e0fd94f9eb3cbd40eae52100000000000000", "service": "00000000000000000000ffff2d385ebc", "pubKeyOperator": "095df90102e6f63dc58f4a8910e8ab145899f53c7a532c8fcb28eb24724a4cdd7b7fdcd15d3539e4fac36690a020a409", "votingAddress": "3N9JtgHNjTD7iYBL8wyRnfjuUnTe", "isValid": false},{"proRegTxHash": "82fce8e09dc6049d20ec6b7a14e0463152f0b1241a7e9c5eed7fa1eb5e43dc76", "confirmedHash": "e6a0c67ce953190bc0633bb329a02b555c03cd750e0c924d0500000000000000", "service": "00000000000000000000ffffa763b0e2", "pubKeyOperator": "154d0cd99d28a6332c5c54db4ae84f77e0ea42f56d01d94b94f9e500f91e8bd115e0043335e3d06eb1b77fc4d9b4944b", "votingAddress": "8zDeGnyosucfEGNTfTvucjfdACy", "isValid": false},{"proRegTxHash": "3fac883277b2ab93c7464ac4027e2958c50bff3307322b1fb99f6d98994e58ed", "confirmedHash": "55c0ca77c9cdec9f6efad6566e5914f881435ac8152069af0700000000000000", "service": "00000000000000000000ffff55d1f24b", "pubKeyOperator": "0744dea6314068a060c38515bb32adb44ae0a37b9a053c3a5b4c83acf7b7b254a82fc6b8689c1fd977a6831f5b9dc00e", "votingAddress": "fzoupydjyP9oAprMXDPY4oAmFqY", "isValid": false},{"proRegTxHash": "978bd108d10c78a85366465e6e3ae8ddf4c8af93e41aa7e45fe07aa1a4c3e8c0", "confirmedHash": "233fcaac404865f90cf8a1b15a81593f66333cd8eec11ecb0100000000000000", "service": "00000000000000000000ffff2d21236b", "pubKeyOperator": "966aa9dd1923ad4239c067711b3b57a0606bda397b8475e3e9870a5c8455eee5aae726c3e00919c923b2cc2bc3199250", "votingAddress": "4EXA8q4tgZKsR5meoaCxMvB7TMPf", "isValid": true},{"proRegTxHash": "6bef280f98f9931fa0d895e3316110595180b9121ada7536c96e71228a573d43", "confirmedHash": "2e115147995347c6126d77ddf798968424ff7d94232e19251900000000000000", "service": "00000000000000000000ffff2d5e3ae1", "pubKeyOperator": "994da6e7a26a96a36f61c55d3eb47093c7f3d02c008862de637a58ca02d73360c6cc4c1a9f8f76f65a6357353e3466fa", "votingAddress": "2kFB5P6UzL8b7KNrMC7Yo5z3aQvX", "isValid": false},{"proRegTxHash": "c962f8349d34dfd653a8a6f6eb15d62768abda892ab6d26c67c01a8c660ff518", "confirmedHash": "72b294c899e711b1b4d7be920f7f4f8ab9e4b775a3ce0f850b00000000000000", "service": "00000000000000000000ffff4f8fbcb8", "pubKeyOperator": "98c45b4a3713049d0aab546cca14b6bb05c0af0a78823d1f7cc76047eebf7b1df78876e7f6eb5a5fa9e99280a1e23345", "votingAddress": "2pGJDSYaPCWhVkZGAcjVPXM9VWNd", "isValid": true},{"proRegTxHash": "b2164aeb4a3fa256806f0991501dbe1c52bd95ec88a1e1e32b60237323e382e3", "confirmedHash": "1f9505f86fd424d14b134ccfed00d1a15565d352b8af55181600000000000000", "service": "00000000000000000000ffffb009d20b", "pubKeyOperator": "932ca1198068be682ab4dc8262f81771c260eb3ea06103a50ef3f38582f061e8e0778ea087f5efc6a26b9ee97ca81e02", "votingAddress": "47RUUgHFmiVsAQxNxLwUqB27fEcS", "isValid": true},{"proRegTxHash": "bca9bf9b9be9985a7db7069bbe83064a8b23fb5dbc9ea6ef4bdfd6f093ca4165", "confirmedHash": "13e442840d46dcb13953e1c3ba674cdf8a977825d00102211400000000000000", "service": "00000000000000000000ffffd4186284", "pubKeyOperator": "0e3746eea400ccaa0563d0aa14ddf9f0b0cf0de118da8b699c7b595eacce0eb90f66af27d67864f8d52ad1b5a59bcfc8", "votingAddress": "43RffAnL5moFxyKZovAEaspSuaD", "isValid": true},{"proRegTxHash": "98ba2a03ddaa8e6ae57e9848c85b9d136622bf7b5c015441d208b28a5763e683", "confirmedHash": "b07655ffe1c7e3e32f0de6f24a6ec2bef8751a0fbb92f97e0900000000000000", "service": "00000000000000000000ffffa516e929", "pubKeyOperator": "9382f2408fb93272b89aaf7b9f6de6a0a0cd998c4d52be8477916c6b0218bb2966044d71df52c9fb5104fbfa33a4b4d9", "votingAddress": "tZqSsLSYkZUdDRCjGkg2STsapzZ", "isValid": false},{"proRegTxHash": "996db7e60b71a512d6ca611171e9cbfa6ab5c40f2ed5560030e53aadf35333d7", "confirmedHash": "1ececfe5422c21527254f2a95716eeb248a31f3f14d87e6e0100000000000000", "service": "00000000000000000000ffffa747e95c", "pubKeyOperator": "8fa4fac376405404d3e673d2770d6829b87c5fea976a6d40d9e03bce9d6c4bedba3ebf4bf9e719c3cc46bd378e2bfb06", "votingAddress": "3z6cptfm65vGqW7mYj8w8DoQow4b", "isValid": true},{"proRegTxHash": "f5239338bfd82031473bd260de7291c1bda3fc537db5aacc11aca568ecf679b7", "confirmedHash": "8fed963798c51a4a5ff609784659223652b6c88634a819ec0500000000000000", "service": "00000000000000000000ffffcebd51b7", "pubKeyOperator": "9744634deb600c9c0066c329658ca0284e04be92fd1f836b3b0682568b1b711640a6fb5850734c18db3ca579e54a5b82", "votingAddress": "3Xox136Lt56tdadxR3asWeKE8EsB", "isValid": true},{"proRegTxHash": "91c68407d60b6392b0a2e14e5375e41f6936af6853d801b18fdf12c11cbff994", "confirmedHash": "ab67f0c5685b557cc2e06bd393474b457a54a2953dffda0a0700000000000000", "service": "00000000000000000000ffff5fd99fc9", "pubKeyOperator": "95dbfcd1280543bcfd2bf2becf6ada535936a4fb60d8d6139dda2e51b14b35afb79747cebaf1a8fca5a815897657c3a5", "votingAddress": "3PZAmwyHPTcvzqKRKWpUqcTVq8rx", "isValid": true},{"proRegTxHash": "9ecaf94a6e744189e5427185a68aea6372364f83ba233a21f5b1717de8b42ac1", "confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", "service": "00000000000000000000ffffc28759ae", "pubKeyOperator": "85783af3e12e16fa3e314079c568894577956f294dfe7b30368829c3f1384cbe08980993fdf0963702fafb8aae19835d", "votingAddress": "ysXPxpt2jk3DPqqGCsVvmQadzff", "isValid": true},{"proRegTxHash": "f6e088536d238538b99b5b5ce363557393fbd6722af270b55e6098203f64cff0", "confirmedHash": "73c94dfa220029d34677733240de5f85024897e63d43412f0200000000000000", "service": "00000000000000000000ffffa51616a7", "pubKeyOperator": "0ba7c48c6a4b5dcc06f9d965d51c12750575e73b58344e50f8a302abb1d43eb7eb539f85d7b1d25e1640cfd7970a9f83", "votingAddress": "2XNVekxMNR5UQHCWfRkiR3Kv1wmr", "isValid": true},{"proRegTxHash": "958d832df563ffb3afe37d9c31ebc35d305b8da44005ad9d5209c56fff39f1fe", "confirmedHash": "0d16cfaac1d5162efbcacdb6b5dbf1ec761731ad9afecf5c0900000000000000", "service": "00000000000000000000ffffb23fec71", "pubKeyOperator": "88d77d2bd90c952551fc88443f637b3ed3fa49dc1da446fae6a3cee7dff16152d4e141f492d4edc967f357f97efd4dcd", "votingAddress": "21Xr1gYTxvrDfKSndJejfYrCCVmT", "isValid": true},{"proRegTxHash": "35accea122b21af808813baf297f548abc80bc353ba6fd6e26daf12efbcf0c20", "confirmedHash": "d44620c39da278571f22fad10a0945561e343b67dcc72e021200000000000000", "service": "00000000000000000000ffff33b2aca6", "pubKeyOperator": "00200857ea7c8e1e897697d338bcdc9213edf7c338ac8260807f3586bd949657f155f6b9bbd9710eb2a8285cac1f4396", "votingAddress": "2cSzr71BmUvqKqMog6wQxT4Ax8AL", "isValid": true},{"proRegTxHash": "2d21b27fa8a629df3df81f2091b0b58e86690852cf8391a34547bd50b016d2af", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff6414b240", "pubKeyOperator": "80c91e5ddaff7a4ad4a0b29261a6237713d5fba6ec71ce327e266960433873b954b48a2901924daca27d8c84d536ec2f", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "638b1acfd8016b9d40e130e282db86b4ee24d79ee80ad8fd0eb78c5ca3e4ba09", "confirmedHash": "3708505a0d4821cfa720b98c5c2ae0d548a40be68df4d6320400000000000000", "service": "00000000000000000000ffffc034a642", "pubKeyOperator": "947f00161f9cf1c48ffb31fac106d3ad05c294291e053786f9699bf475f534a0d3494f508b9ef5aa30cd2f1f26c96a82", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "f28d165f4a874583e2990b055f205e6077d8649a25e59f03ce47962612817472", "confirmedHash": "2fa5c5a63f389f2d98943024cbdeb95212cfc8f09558a1983800000000000000", "service": "00000000000000000000ffff80c726f6", "pubKeyOperator": "1651dbc60c9b1a39e45d946624233898d0a458f9f18d322846e522c0066c92b03d7b5c8d73f8e21930e41a4b011e88ac", "votingAddress": "2GoG16KgZ5LjnF7qVTU2PdKKmc3Q", "isValid": true},{"proRegTxHash": "e49af7fd7ac4cca63ef529953beafcc5e0b207185bf7ab8bec223a022c577e0e", "confirmedHash": "1a6d530e589539a0427b29d42e7d0b522424525d8c487a633000000000000000", "service": "00000000000000000000ffff035dd6fd", "pubKeyOperator": "19e934ae4d713f689e2f33303c210005d769e8bb16134fcbb6611a67f110076e6e674a99bea6e0f77bac632b45c46d32", "votingAddress": "Lfj6yJk9ui3NH6q8VeQ1bSFyasr", "isValid": true},{"proRegTxHash": "97eaec5b64c93771df4dca4229ffada5ebf57606132646786fc4130722da34de", "confirmedHash": "60b29b478b0489c174bdd8b4ff5d6193154b8cedebac4ab80300000000000000", "service": "00000000000000000000ffff55d1f137", "pubKeyOperator": "87556b5813c45771f48424642b0f9e3af894d9ddb7f1d8b8b78f1345a4004e75caf796f63e6a9543f0426c05931859a8", "votingAddress": "2zHfPVKk3Pe3Z2YQ1VTCXZZbYFet", "isValid": true},{"proRegTxHash": "1c67dcbcbe4f6e71b5b9b9a2d3379f09dd543f30bb963fed45adb69e1bb0b689", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff8491c84a", "pubKeyOperator": "0eb2441fde9acc9cd176400647afda91aa655319baf771d65b2a559632218179ba571098263a66b8a8f2da28d56ab168", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "30cfc7a2010499b5d45426627039b1351b60d38a9c5bfb539c8cd5601031e6b0", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0bf", "pubKeyOperator": "9704e9167a1b4e19698730cee4404143c04064f01cda1d0e403c826003ae8d1e270d3c4db214d7a6c427400097d32e50", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "46d1ec7bb29e28637f994cf0afd26c2926388a133680163aa79a4600447e1e8b", "confirmedHash": "38333c20f176c81f733a3e2c4770dbd1fccd5721475ec31a0100000000000000", "service": "00000000000000000000ffff55d1f207", "pubKeyOperator": "91c0527bfca9236b1d2897eca512b629dc33d1d043952d89b31ddd51b230e2e045afc520d53bb7da87bc12eda8fc3441", "votingAddress": "3VGH1crxxeTZKe6HxiyVcx16zzXm", "isValid": false},{"proRegTxHash": "027cda713ee40e73e23b3342c4b3600d595f3b4f902c36a9aa2ff573ea320db1", "confirmedHash": "7c98fa9d74b035b7f4b64e9133f602e8a0e14dfabf9a51051600000000000000", "service": "00000000000000000000ffff55d1f21c", "pubKeyOperator": "81bf020988b3260177826ecbd2d0ae0dcee620372adb2b732940f2dbb566b5f4e7fd71d90cc12c3714d3088b0ba8ae98", "votingAddress": "hgAAP5oVUftbx35MGTDj3NzwhBk", "isValid": true},{"proRegTxHash": "b5f7d8d370848eb07aadd1b70e2fd95ef2dad03175cf3aad80833fea41b90808", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b074", "pubKeyOperator": "8e2ffcc88d3946525de3b6d426a32a1c275e2c9355b36ef2080042310adb62278ed73a6cfbcbffb56fca91f84a912218", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "23b842af04929d3c2499a26cb332f9b556b890d97b8460e43074a7e757ef8a6c", "confirmedHash": "689665ed21cc0b691813545cb26cfe3fc85a004764e9fb270100000000000000", "service": "00000000000000000000ffff55d1f171", "pubKeyOperator": "97a8dfec2a6e27489a87604adb34993fd0ee9562ce1d16022700ae945c706ae8902da38294c15372766d72c2bf43089f", "votingAddress": "2H7VseY7dpbDRybjR7YHoyKyUP3N", "isValid": true},{"proRegTxHash": "69210afd87786a439e142022101d1877fc0ace9c692614a464332711e686a325", "confirmedHash": "431eb049710a6f2427aee9eff2c4796cd5bbc2c759748eef0b00000000000000", "service": "00000000000000000000ffffd41867ad", "pubKeyOperator": "0d613c7614addad529c356c2da4284bc5214b944571ac1019c0aacd5a62c25b63f65b25797376d83d8a4c63c783f626a", "votingAddress": "2ZWyUgqFKnT12T2NVie9nmp88dPD", "isValid": true},{"proRegTxHash": "6d879aaf764e028a14002277cb696716de3174b163f67864226863515b491072", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b05d", "pubKeyOperator": "12def622424de9e5b79682514a9dbf796021b92f537b1c0ec7e723c123eeac5f7c64e229bd4dba87fefb33d287d3cdb4", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "4b6292585d58a50973993bee51bdc9e5005eaeec5814cbbb314faa0be967218b", "confirmedHash": "49f41388e85f05827f1c85b0c982bbb7215c36a5b13ed2271100000000000000", "service": "00000000000000000000ffffb2802857", "pubKeyOperator": "0b07f41e61e9454499e93a7a5ca68e036f8b45be43326f3236493244a119d1274392925b666db499ae09485c142ada10", "votingAddress": "4nuopgE1S8Z5HQjCzmoUNbSmggL", "isValid": true},{"proRegTxHash": "18b70669fc482f5804cd102afe4b7160d896016f105e66847a0db963e4b7696d", "confirmedHash": "6b0b7096147be77aeb538b83ca7bfedea24969c7bbe80a271400000000000000", "service": "00000000000000000000ffff52d31519", "pubKeyOperator": "08d3f26462607a856da1766fd97a53955540f41ac630f7ec7b93e145c6eda8ba1272b8fa92fc4ed622e646568751ecf4", "votingAddress": "3MS12BjayRhN381HKBgpXrqd5FEE", "isValid": true},{"proRegTxHash": "d007e146023fc8f26b7ae396a61ad84e1241a00ed90dbff3af292482849a52e0", "confirmedHash": "da5e0ed8ead369cf9ba21fd59357dc5d46721d9b5be963db1500000000000000", "service": "00000000000000000000ffff12d32ebe", "pubKeyOperator": "028896c466cfa29ef4a9e47570c373a1895d9563ac08632a761b48fba47b3cfdda463a1faa8e05a1166aab7c90b52412", "votingAddress": "4JjvvHdCDBNu471cjC2VWehYK4ji", "isValid": true},{"proRegTxHash": "b5082eec91475a095869e9ac46857d22357377ab7ac4d9c2a2c21b8397bc4b66", "confirmedHash": "e6a44b335d556552a28a82e936103f2917af881360a08a9a1300000000000000", "service": "00000000000000000000ffff50d1eba2", "pubKeyOperator": "8e67efb5efb4c8745084aac784f83378681092acf9fa91d102c6f7dd8468608c1132decffedef349fae3450310f589d2", "votingAddress": "4NXNYfYq7J6ycHN87zGLVLHVa8jP", "isValid": false},{"proRegTxHash": "575e379196c6766cddbde119fbae664e66e936d03d8d03f8465f9dd782e98e28", "confirmedHash": "17e1df58e23a97163e65fb80442bbe1e9a350a010263c0de3100000000000000", "service": "00000000000000000000ffff90ca6ba4", "pubKeyOperator": "92513d2e70eb0fc6dbd990dea0f8a7733088247baffd0dfbdc76160d97b75ec09b0e021e17e79777c9f22fc998e5f357", "votingAddress": "49NZXPtgLSWqWqUdSU2KADWVSknj", "isValid": true},{"proRegTxHash": "15c8e0f6cf41eca63a6ddfd8a3d9a8f40df89b1a8399843f832b91acabdaf9b2", "confirmedHash": "cff5d70d321c85cb8c24252eb26e6d8df8a4b41fff66b9571300000000000000", "service": "00000000000000000000ffffb23febc9", "pubKeyOperator": "9474a5a74e85a79fa0dc18bf3b5e6f0fdb017ad958fd37f52c572e778ccd77e3c316f5676f5999f692e22ec87b3189f0", "votingAddress": "2nhZQ1ujyDvqeEj3DQZsUndgDbJT", "isValid": true},{"proRegTxHash": "485abe1c1b7df608ae0831a716c10cc2fed6a0f2f9a186c76561083d104f0fc0", "confirmedHash": "b8b6b155a1b903c10bd70f25192f443c64fc274c662a7c212200000000000000", "service": "00000000000000000000ffffd418682b", "pubKeyOperator": "9902be85f98231e82278aed9d23024e2f7bd77c24d4e92582f912e3abe1458a34c7edb094c2042260b3b67e9d8b3c3a1", "votingAddress": "27yPLH7H5ew7WzeGQ6VUub4JgKHq", "isValid": true},{"proRegTxHash": "8eb4edbf70458339c3d940b03981a22a3fa57a09100b2f5e9f81ff476d78770d", "confirmedHash": "5b1b1896eeb9b18d34b3c73c2a2583dc936b9c0b8ad8bcf30500000000000000", "service": "00000000000000000000ffff951cb562", "pubKeyOperator": "99028efad9c7fc080172965eab01cf95d7047a56f9778874878fe8c02d70478b4aba6d4510ff0d6b584ee94683f673e1", "votingAddress": "2gnVja8Myh124Ygw1jzGATyA1fpq", "isValid": true},{"proRegTxHash": "7b659678abfa1d848e7ea80205456796278c17988c18c10c6a1e8a2704a5d07f", "confirmedHash": "918a19bf0146d10e7751ce0910318f8c048c12440c6f21901000000000000000", "service": "00000000000000000000ffffbc28e711", "pubKeyOperator": "0140c6cce1152085456b44c005042fa5b19048e23e7ae498b831dbcffd8fcd9360d26ac8c95db2c6f41b419791915e74", "votingAddress": "mUMMqs8g2Yj5871HGKYXqPauqso", "isValid": true},{"proRegTxHash": "61a958bb499777b329d60c95aeca4df37e04c38caf74f15fcba7ad18e56e7f7d", "confirmedHash": "dd095592f0cc859cf81f40d811b2d6ee5ea9f02bc9624e972200000000000000", "service": "00000000000000000000ffffb92dc1d1", "pubKeyOperator": "0a3257473ecfd41bccc8f80da18c72f77cc33d9b1e74058b675837be3dcb7ad7d2840fec73311ab1b2e619f9ccdb78f0", "votingAddress": "4Y3yad5CqQLxnSQot8bBR7u4xfJc", "isValid": false},{"proRegTxHash": "295e00e41d92b6092568a1e64edc1d65407691b9939e57c8f15fe67e0f1227c8", "confirmedHash": "74a7e681f40c0ed3da984741bb702716e6e278b0ca94442c2800000000000000", "service": "00000000000000000000ffff6deb40cf", "pubKeyOperator": "1311b1fe2547c1c2e21db4f55cfa0e25c01d486b6da4c0a7a07d79b2e043353e895a45206d66dfb646075b17f55bc4ca", "votingAddress": "3FtxttdnrqSTTq5R9ReWo7VGwUv", "isValid": true},{"proRegTxHash": "b6f1f3bf25eab079b939c032cea47fe6e2e522d3933af61d6a02ae87486548eb", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff84919e91", "pubKeyOperator": "91108f57509ba0c415093840e2448efb62af23998e79ff96e815e7967576e3374708121f578b391a65a4e9f18082d828", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "4438fc7432417719a88cb485276e5ab603d912ef8dcf0ec5dac5fa2951b8de38", "confirmedHash": "1d6fedff169df03a36a10c4c834acb785692ec120538e2770f00000000000000", "service": "00000000000000000000ffff9f45c2a4", "pubKeyOperator": "01589a6f197ede4aa7c1f944254cf7cc545f752a7e7be81e5d8625b5e23585ffb0d488cc5ffa592037f5ad3b0952c3fd", "votingAddress": "Ea9WeNVMKdMhEF63HEnMToVgQuz", "isValid": true},{"proRegTxHash": "a151b657958ac27a2f235af6c1d77088ca9e88b1bcff194bc9703fa2c13096fc", "confirmedHash": "54ca220dce6177184e60d8a3194e7046c2aad4e4adaf83190f00000000000000", "service": "00000000000000000000ffff52d319cb", "pubKeyOperator": "19cf33257deb1470a58f294123788239b97d46456db54f61a437a2236646ff75192f8b84cd0a69c17d9e203dd008eaa3", "votingAddress": "2Kd8GzSCi8wdQKqBbqtaAnxqxnED", "isValid": true},{"proRegTxHash": "93c83f915d010abb8ca4fbb57f8fb1d4ae37738a7092ec9f84bcea29d4053904", "confirmedHash": "b490a8fb1562341dc352613c05b8b70e7dc4a789106fac061e00000000000000", "service": "00000000000000000000ffff5fb3e8d9", "pubKeyOperator": "82d34a72d41d963d6b6a98aa09080a8f98ed2cc0acfb7b7d4204de14cf89f120f6f144f3fc30c415a375d79bd40b9fc5", "votingAddress": "xws7fBTcyXv2gsygHhBCYJid9QT", "isValid": true},{"proRegTxHash": "8cd213b53f2f510974b33bbeabb09bf8142b5f138d504e911d981c4b9fcb0942", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffff80c7f649", "pubKeyOperator": "0b33e2ac6a785c09a6d93b7a2d873f0551b5cad6d4537f90851b07223693368b4fde44ba183417682b511e594e07a9f1", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "f54728cdd98651334769948f848edb7e6422c5a1543c250fcecad9c20c9b3813", "confirmedHash": "da43ae173edaf99fef186791004da1d26b4f0d169bb15b771300000000000000", "service": "00000000000000000000ffff55d1f22f", "pubKeyOperator": "133d06ff13da98fb10bc6bd84958b6858e21449bfc88c30fc69e206708513bd84958191d65b79547d28e704e7c710ac5", "votingAddress": "3UyyF16zcB7FceUz5pTYyfYwYp55", "isValid": false},{"proRegTxHash": "dbac37526379c6128b067cee85ec7e6d0e9e40d486e48909b785437e8ce5f2ef", "confirmedHash": "c90a956d18c843bc7ea69c03f2af09765f733b263f1f42bf0300000000000000", "service": "00000000000000000000ffff87b56fd8", "pubKeyOperator": "84b8dd4ac8fa5b11d6966dac8b62b05d9042d0d24b7714bc45fd7890b7fa1814587f0d67b1d060a9f11b6acffbd58da9", "votingAddress": "2a7eAjEpCg9dfrxCnwYRrvrDEMkh", "isValid": true},{"proRegTxHash": "e638bad78c5e5a7ad4be072e85e08ee2cccd25ae24b011d688e301f135be7dfd", "confirmedHash": "1435ee2c7a90f1d4b52b7861810792f9225680ddc6d4a3390f00000000000000", "service": "00000000000000000000ffff9f411648", "pubKeyOperator": "01034ce52d7afe41e8ac056f29fced37e7a26fdada475e2c23b2b03b6395f763e64503d1d9fce87284433f8dfbb1e05e", "votingAddress": "2ekxENniRF2Mw9nm5s85TpNnVpd5", "isValid": true},{"proRegTxHash": "23b06a5931c47774355d29424a1e8a8b76b7e07feabffda67aef191a05205806", "confirmedHash": "8a4d3d020a27d25ff6ad22ce8148b31c9d9481ac0f3fb2e70700000000000000", "service": "00000000000000000000ffffa7aca53c", "pubKeyOperator": "18e1ffba070b3500b9dda800f5e86cec03dfe2f3ce090d8ed2c05756d8d7a45e35cc2f2208ccd095d28d51f7a658c572", "votingAddress": "nPqTMV5v435qfiGAkrBCgXKZU7j", "isValid": true},{"proRegTxHash": "14cfe539dbf5f1c2c94a239e0cbe8ed1149978dcc34e22f13f89e832cdd34a13", "confirmedHash": "b8f090de12271fb326d66fdb1dd5b663c75d7e1568ebc37a0f00000000000000", "service": "00000000000000000000ffffbc28af44", "pubKeyOperator": "082ee6bf5a47cc14ab839b81e3dad4ba8bd0ac74f68514536108bacb16d3d49181c9086c2da6ea3dd52ae5d1871121c2", "votingAddress": "3X2dsBLoxYxXF75VXpgh3mT3HNUu", "isValid": true},{"proRegTxHash": "db0d8f070a87e2054e0ac8886288cf27a5cc6b6a0ad0a17d41e3590038402bd8", "confirmedHash": "2e7b06d30161b60ab32b857a444852547795ec8adf4840701f00000000000000", "service": "00000000000000000000ffff2d3f7842", "pubKeyOperator": "94de03921db225779ee4dbdc3c73efd2c043559c8b23a291264a52a0ae7d19ead392d89ca7cc981f96b52666bd3b6f15", "votingAddress": "7oVbECw6LUJPKo1LfUhNuXNhjwR", "isValid": true},{"proRegTxHash": "6063ece82c1c983507aedfec86900687056d18d9190fbd6403e88859b6f47d63", "confirmedHash": "4c4db90e7429aad0713555360724f008b19abfadf98209eb1900000000000000", "service": "00000000000000000000ffff2d4da9cf", "pubKeyOperator": "170551fc9efdab34d3133855294d4cb0c0225cc128651e24697d2e149ec6f988c0bffa078209d8d9d2902aae3dc58037", "votingAddress": "4UpHwETgqjnrA9DH1G9cwu4rxkPw", "isValid": true},{"proRegTxHash": "66f5d760c87a0b95ee3e5253b381aaad8acf1b6c9e63d4e87b3e48eb14fdb8a9", "confirmedHash": "bbc602d9f3ee5c67c5907786e8fbd75146adbad750754c500600000000000000", "service": "00000000000000000000ffff55d1f174", "pubKeyOperator": "917a8933d88d390e95f39cc1c128e38384e62e1fe6c5ae25dab9179621687cfed8ebf8d4fd2b9d99e221fdcdd1e46e40", "votingAddress": "z4zQbmog95AE9U9j2iTWBZVZJKd", "isValid": true},{"proRegTxHash": "ee16c50b7663f15394777edacfe1edba45f3bcfa220a0d8a0d5478fc1a169344", "confirmedHash": "46d128c7f11ac98ca9af6188c0d2988bc441ad28ffb797ec0a00000000000000", "service": "00000000000000000000ffff17a300cb", "pubKeyOperator": "1703a5d74f7af7db6073a7d5f541ac178119945831985f6474535e0b50367db40431ac7667581bb52203567e22eafec4", "votingAddress": "YtBr6ixXTsQQC9vq52vQjaiQbsF", "isValid": true},{"proRegTxHash": "023a541bd5884f1088630fe46ff9e51a6a9ee10e769474c1af91d0e967ec713c", "confirmedHash": "171467fb1f9af906bd9a10e74c3011ad0ad701301185067a0200000000000000", "service": "00000000000000000000ffffbc28fbd3", "pubKeyOperator": "17ac04dcbe4572333decb848d4dcea1c2e5edf24a1e774aa1c1c6f31dbc3261883ad27cacd2efdd2ab91b24a77390b3f", "votingAddress": "2Z9McoGDmMfh3dF9XEWqPBi75qFQ", "isValid": true},{"proRegTxHash": "8a1e63992097afb8bec74bdbb463009992809135b026ff5c6864c4c9414ebc83", "confirmedHash": "a84fa36e483261903ecfb33dd2b0ec404cef4f5ed4e4b6e90600000000000000", "service": "00000000000000000000ffffb9b928fd", "pubKeyOperator": "8ecf3c4d52fb97afe3da53c0357d07b4c4d5c4b4982995a9482fb5e80afc32515d961d1bbade51d656613555d1327856", "votingAddress": "3XefEw34H5JF4oXUXV8LypdRnFJy", "isValid": true},{"proRegTxHash": "77f157cb75dee0536dd3599c51092ea4d2b82d6eea801e658b488ecdc21d280b", "confirmedHash": "03f0845cc725e095b9b80d99484904ba1b9eed996f1db2d12100000000000000", "service": "00000000000000000000ffff80c786eb", "pubKeyOperator": "93007b4957419ce32723d1d515ded2e9783e845d4e579baee001f503dd4b6e031122ace43ccfc6890cad6170423d57d4", "votingAddress": "4QYHiLhTkb6v4fMfpWkW9eggAQSy", "isValid": true},{"proRegTxHash": "c61cc60706d09ac93d47c9d7ed6e4d2157774b09770cdff45be02cbe86420812", "confirmedHash": "392a6651b0121f2a18afe461f6d45df496df2e81a06eda650a00000000000000", "service": "00000000000000000000ffffb951a53f", "pubKeyOperator": "1683b17d82e4889eff360b5dba28321e0f90c7b6eca5f752cd8be55e5c8bb0fb9ae2568ce3b902e42e81843544dc8018", "votingAddress": "2GmaUzBmUxpDYLiaUJ4cx1CBhNdM", "isValid": true},{"proRegTxHash": "585fb629147ef7b4f3ab7d00575c3b7ffb8fde511d22904a8aa77b7286512e29", "confirmedHash": "159d6c679927f79aca6561e0d43e0edd42b592cc3d3cf0b42100000000000000", "service": "00000000000000000000ffff92b9af70", "pubKeyOperator": "96dee0c6313f961f06c60f901c6d8c3b67de3adc8cd52d866bad26f10c7453104ab6c7a5666f96432d8cddf97b7bd78c", "votingAddress": "2fm2NR59eWZLE83PdKeHcr9gFnGS", "isValid": false},{"proRegTxHash": "aa75044ebd8acaa4a83a4b700cab10df1ad04e08e639e9fef588702538d6bae4", "confirmedHash": "03a7d38af9140e2d84ffe3347c50d18dbf35aa5cb8f820b20e00000000000000", "service": "00000000000000000000ffff55d1f20c", "pubKeyOperator": "13cc3e33604630e3b215f7cdc4362728e9fb9ad8345b3f4e7378f28585c5310e02103c17431036faf42f9636861ca95e", "votingAddress": "2d5MbnKDwShLZRDfPmphM6PXQ755", "isValid": true},{"proRegTxHash": "4c2097fff4b80170b2b98be08ce8d8b5a6f8c0f8b735cdfc30cd69b2bd7032f6", "confirmedHash": "ea2d17d87513b047bc8f94c214422fa3b62fc5dc190d01900800000000000000", "service": "00000000000000000000ffffae8a199d", "pubKeyOperator": "8b647b4938c0ae8187fbaa3c32518cd63d88f228677db76cc638513f2ce4d2c459539b743bd67c85ca280b2ae0b9478b", "votingAddress": "21tGmYq1r6LhteY2w8bh22W1cXko", "isValid": true},{"proRegTxHash": "09a59ac2102ca2517b50917b94b5af03a338e7562a32da66abfba8d9768b4b83", "confirmedHash": "a29c74fb3479bbcc74497d6602c50921f2f28889b72c7c733a00000000000000", "service": "00000000000000000000ffff52d3195e", "pubKeyOperator": "9132aed3d970adfefc2f560555fe99c0535c1ce2913f91047e45d6cd815cb1273208187a86ec31be6b0f8e1af62b907f", "votingAddress": "49JumJaxQtevsG5EDLNeKmF7jjLS", "isValid": true},{"proRegTxHash": "e5a7e9f4389e74e7f7150483c35b762dd332336d3c672d9e2939f6d30faad6d8", "confirmedHash": "5d90b68937c1359931b9db0413e9dae27943a1f6dfb09f4c0200000000000000", "service": "00000000000000000000ffff9de61137", "pubKeyOperator": "8939f949047e3fdebda01fdf0c6b16b4b616e86ca9af56e208018da8a9916744fea13dca548e6e38f5f284af0d3a1cf8", "votingAddress": "WtRxx1mu7qpFjtJytvEqrZMu1JU", "isValid": true},{"proRegTxHash": "a5a8f26ed3978a1e1db40cc4e279b60a845f36897fbbd7be4d5b792b083e56e5", "confirmedHash": "10e4ae87d49586f5a853c4930947b75319f5455b84cca9281000000000000000", "service": "00000000000000000000ffff34054037", "pubKeyOperator": "0bd0b465f8bc59f7a509caf35debc0f7701c6102a80faed3766960d1342b46e967eae52557cf12fdf437e6ec5c395925", "votingAddress": "4D28LiaG7rH2nJDwuKRQ2CuTUEZV", "isValid": true},{"proRegTxHash": "4f2d4c3e9791653d44a094e434d28046435f41e44b0a37aeed82d5145cec0d88", "confirmedHash": "879c0e5bd3dc054d1c6a20d2c21744aa819e9c9e9d9529bd1200000000000000", "service": "00000000000000000000ffff5fd8aabf", "pubKeyOperator": "96216ced02ba44e1ddb354e2f5e666c9b474ee516e1dea804d2427f4961766eec0ef43ce6b5ffa06dc852f679feca9ed", "votingAddress": "FCFceGfFLNPQwWuLrNVqd47DqNR", "isValid": true},{"proRegTxHash": "f8bdab38e258f30533b3e7ea5a0f1dfa597938e89ddd6b25c2abc8c21de9c5e3", "confirmedHash": "675f179e40f20ce1668b53a9c802e691276b6969372fc50c2900000000000000", "service": "00000000000000000000ffffa7580f61", "pubKeyOperator": "821b3d3efbbdca25dd80aa992d765881edf9a3e3f151b8edd483c2cd87683bd8eabc35b9aec11df821fe5e9751c5be8e", "votingAddress": "25AouhFBszj8fmirftgE6hY2GUgi", "isValid": false},{"proRegTxHash": "89f546a469a5800bd62a205d225bb99087f5a8cdb0b43bf8c75e7b81d6d7783f", "confirmedHash": "e5e97011ba21127c6f32380a40fe0af2a8d21696ed0f27001200000000000000", "service": "00000000000000000000ffffc0f1c034", "pubKeyOperator": "147218ff18c69df6d28b8cff4335a2e1e2b2ff48a2de9b2ffd5b8297247f90e3b1cb8ee5f1cf9f3e5b2fe567ac435201", "votingAddress": "39ooT95X8se9whCiZyQ2zrWJMqW6", "isValid": false},{"proRegTxHash": "06d7a561a975ca236ed339d1a292b062e1d2a2d4e31c5acb583cfbc1fe61dcd1", "confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", "service": "00000000000000000000ffff2d4cbfde", "pubKeyOperator": "9694dc353353d256f8000d3855944699c6ce4431f8a754219ee56583e2bab6bd11e670bec2841a161e04f9cf0d61426c", "votingAddress": "G8pEyukgrNcXdRjzvAWR3ABY7M8", "isValid": true},{"proRegTxHash": "0bcc411f324f4d4a39da9f3468e708d16678380a8e876a257897c123f31386f1", "confirmedHash": "2b246d4ca41abfa41b63d68b13afbd786cf6bc1e2c48c85c0300000000000000", "service": "00000000000000000000ffffbc28b983", "pubKeyOperator": "934dccdaec10c23dbb5e2e42de4c78ee3e1d7b2628e686ab79c6fe693c4fdaa81f85302c01c4d579f2255277da284a35", "votingAddress": "3sn2Fy9ebqsyRJrCuSTm39TueS5r", "isValid": true},{"proRegTxHash": "e6a0732c37271e45a283376ba6ffa79cc6ca2e740366aaf3ba99b6d31107fb51", "confirmedHash": "123c178a777beb3e3c812443d07be17a42deeb7b9e27a2090800000000000000", "service": "00000000000000000000ffffbc28cd08", "pubKeyOperator": "8f56421336a81d1ee94331cbf02d1608fce384dd805f4523d8ee195f7c1ffb501e8686efbc7b2e0835194168688d8563", "votingAddress": "2N5TA86bM6mVfBREGK2kSbNfwzcx", "isValid": true},{"proRegTxHash": "b95a78d8b414f26e9e4512bcff1839605f0d4a597c651949bc5bcf254d1b35c4", "confirmedHash": "7ffca7cab172ab63e626d33f3ae09441edbe9f8e166adb872b00000000000000", "service": "00000000000000000000ffffc87ab54c", "pubKeyOperator": "98fa2cedcd560fc1002eb1b8be180a6e405d372fe50caecc6de1decacfe481d71bd0d9c329079c139163497dc69198a7", "votingAddress": "2uCWcchy3xzmvYptoCMVJmsm5YMJ", "isValid": true},{"proRegTxHash": "0a460ac31b54571ea3eacd2b8a192105ab3b126337a59593f1df861970b2c1c7", "confirmedHash": "ae43de3cb026a605377bf7ba620e86470f98ad06740c704e1400000000000000", "service": "00000000000000000000ffffcf9aee20", "pubKeyOperator": "11f539666e7544218b33fc866bdb1ee13d2ab8c179b2be25ef6f0005d9d59852a69d8942ba67a76dae78827f18912941", "votingAddress": "2UPt4HJGKVGjuei4oi8cKfHrLuQT", "isValid": true},{"proRegTxHash": "195b396136bdae1a238eaa97202b9744cdeb33e61632f3553927a7ac08085648", "confirmedHash": "dab715aae3b97199e6d3dbdc3eb97788e92fb3707474819d0d00000000000000", "service": "00000000000000000000ffff50d1e5bb", "pubKeyOperator": "0b6f313ea23b06b04026a5dbb9f4d300588dbb941ce52df8ac009de67732ef3c891b919a2771ec16b78c04ab5a90c347", "votingAddress": "k4STzL1Cfv9LHhzC6BwhgxQXri9", "isValid": false},{"proRegTxHash": "153b25e9b47161106d534ea9fdaeb8dd82461f2192ec17c24a41c8566d929cb9", "confirmedHash": "8ff653f659d4478ea4257cf726b06155732e6ac3913d54bf0e00000000000000", "service": "00000000000000000000ffff52d31918", "pubKeyOperator": "8eb3e59c661e5a525935d21dae4baff0b9950bb0d4dbc8b522d77d0246651b31c9471d31b233ef7df37cb401e350be8c", "votingAddress": "3SXnPuh7x2wHELF9EhWRezumGogk", "isValid": true},{"proRegTxHash": "0064905e761777493f95da916430da55bd345e151fc1bba9c0f57b4b9a15aa63", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688e116", "pubKeyOperator": "8ad2449de0fab6e0c222a6da6ef16fa0ba60ab5ee2e34faba1907274f48395664392238d9841e5bdf4d1970e27f28f5c", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "ca5f9d7d1c6460ff1b743096e49a978e2994c6cec6ac7bab50a6fb3e16f36513", "confirmedHash": "9fd4d82d72070635c3ff9438543beda49fe55a509db01b9d2600000000000000", "service": "00000000000000000000ffff88f38e27", "pubKeyOperator": "01f33463bacf8fb4a85b5a1f6bc9c993223d88bf27ce22c462001d88caeb7bdbe398bd66f85ad733c7b2a0dbfa00f6c5", "votingAddress": "331Von8wKEWBf4AcARLu5JQT5Xa8", "isValid": true},{"proRegTxHash": "fe5bba0811a028fab52f76b55c2403aa68002860eaa8071513f92c9d9087d530", "confirmedHash": "507dfcc32d06a04caa3c691707691aebe98b16c83a4b95e10200000000000000", "service": "00000000000000000000ffff8f6efb22", "pubKeyOperator": "8ba2aec38aa3e4189094a81922d05f9a556d0f6cfa09b6de3aa2746d790ce3fdb3b4d491b22ecd0aa9e3c63e4065cd1b", "votingAddress": "3gDXi7o8UDAVVKN7bcdxroz8LU3R", "isValid": true},{"proRegTxHash": "16ac47566ca37dc46c885302407ef50a27689ee7436e45405afa405c0616d5a4", "confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", "service": "00000000000000000000ffff55d1f1ae", "pubKeyOperator": "819165fefffc7afb12b2daac999c3e0e92972f8711d5d7e34e9d8f2cfc5d364805e2c55a7547830a3d80e7e2e985384e", "votingAddress": "3E69GA8SCSLmmBEuQYEt8JzhQ5ce", "isValid": true},{"proRegTxHash": "4f9676bc5f0567b79508496d378f45833d9a4adae2dc28958a39716702ba6565", "confirmedHash": "ea5d362358acd55cac9d9b7c5f5535e1cbcec1b1b68a54d30d00000000000000", "service": "00000000000000000000ffff2f6eb833", "pubKeyOperator": "8ac125290efdac9652f5b41b5b97a4f560eebe120463cd8afeb3a036791cef97f24c742c8913e0b71cc7eb93aa45bbde", "votingAddress": "39sUcoMQ5oB3dSsv9pRqQVJWD2D3", "isValid": false},{"proRegTxHash": "7cb34983d9120918e8d79c4ac4dc09d779d76203bc100e0f392f5f8403387c70", "confirmedHash": "8783a5a0525dacab0bfb8a9292bc96ecd3be6d5291db42020a00000000000000", "service": "00000000000000000000ffff5bc25a35", "pubKeyOperator": "90967cd0bbfb5ddfaecc46a489bcb98a7c1da700dab856913003da586366e2eedf93da57f7b6e69bbafe72eebbce56d2", "votingAddress": "4YycSDwMUzg7SmQ6EfDoKht7VfJi", "isValid": true},{"proRegTxHash": "5de66f4b59046663075bce1da4da4737a70c54f1a5844f941a5d610ddec31bb6", "confirmedHash": "435bd9d644015821e0666f4c7df48f6de41490f6e3b033ae0500000000000000", "service": "00000000000000000000ffff36270a6f", "pubKeyOperator": "10dd771f793deeb9846d874a3ab9229abce89ca83e8882de955b98e4bba6989ec10aadc10334f0aafbd76fc033b98ca5", "votingAddress": "4798vX5iCQ2NjwojXoguVrEnHZhx", "isValid": true},{"proRegTxHash": "3c72d80bfdc92e4455d253fc00e6a3de6d49fb9c41c4d6e709136f00229f4482", "confirmedHash": "60d516206b686f4383141d1a541f9b16d5ca4b9037f4cf6e1700000000000000", "service": "00000000000000000000ffff8b3bd5e6", "pubKeyOperator": "87a119ff2a2824f75fe6744aa7beed4ccdf88a3cf279ef5c8913f653a378e5c2a31add49b11de361576089bde6f6c9e7", "votingAddress": "2SxF9jJACgJk3UpAU72opbTaJ1sY", "isValid": false},{"proRegTxHash": "e6e68d25e0e5fbd0149afcb48e9465f202a0bb9cbb8d968692977e093d8e7298", "confirmedHash": "918a19bf0146d10e7751ce0910318f8c048c12440c6f21901000000000000000", "service": "00000000000000000000ffff87b50fe2", "pubKeyOperator": "142272c0e15731b92bd5a25c66fe9a571f8f5fbe4f249559f2dcc25daf042f79f4d0395c173b504f9732f3a9e7fb4d05", "votingAddress": "3mkKfyvT8PNc8SoowUgJY62P1aby", "isValid": true},{"proRegTxHash": "06b4c99e2bfffd9ece73951503f8309effab547fbe34f483d59ae68f382177d2", "confirmedHash": "47930554e5bb3de32a1491ab4af492fb4f53dbf2fdf961590c00000000000000", "service": "00000000000000000000ffff87b53484", "pubKeyOperator": "03d6e88cd45b7923700c1261d92f6da9dcfa0155ea570f83ce636b6793ce7c9775577699f6421d00983d59f985ca0e35", "votingAddress": "49tzfNy9kZfU9yJGHJzvt96yZUrX", "isValid": true},{"proRegTxHash": "1d144176a74ad62d188af325ee0b4c328f63a02910a94f5bb418b7c67a10ed16", "confirmedHash": "5cb0b5e64164d00bc3a78f2deb79290fbed2e8d97ae20d860a00000000000000", "service": "00000000000000000000ffffc2875cd0", "pubKeyOperator": "04ffb202b88a2add5d5b5a3db7dc1eac1e600cbbcd5a27f8e60cb63de0ec676e36672efcf926ac78cbd20ec5190142b7", "votingAddress": "2VPVevm8tvnz5VgQzokEAVEXeJ45", "isValid": true},{"proRegTxHash": "939e638971db1279c1b3e3b10475056739d25887f924e0068662edb381adca6e", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0b3", "pubKeyOperator": "993a7f81b63fac5bad4c0b43a9aefc69b140dbd6b09415171b5dd1be0fdb779c4cf445cf7d24afb263b13c8ee158bb3e", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "210ef411bf7ba841737fc2ad06e60ac40c86ee6c949b4c60f15548778b7ffdec", "confirmedHash": "460e64610ca33bf6a36adaba0ed1adc01d108b63197c70fc1800000000000000", "service": "00000000000000000000ffff88f4577a", "pubKeyOperator": "81bf34de9c88dadfbc1410c4186bc4ff82bc81989f4e0b974858ff047f9b026794bddd535c1b1ce87185ae67d2b9ff78", "votingAddress": "3vMak6hqVq2sLLqgBD6JS8k97pZw", "isValid": true},{"proRegTxHash": "58faf82ba22dfdfa157631028e33bde6d3eea7c261779655c18524458b059108", "confirmedHash": "44c170d8bd6e6218dfd1fe014f946241eb0948c2b971a53c0800000000000000", "service": "00000000000000000000ffff8e5d8986", "pubKeyOperator": "033642761bd30db319bde5318ef18410de4559ca3aac3d7e4f5255c116a6f06c1477d9e08fbbe8a7b0541d6dc4c26b03", "votingAddress": "41EtHYkRTjdUpRwx8N2fC1KBY4v6", "isValid": false},{"proRegTxHash": "556d57e0943201121e3baaa5cfcbbd3f271b5a97435be1a5dbfcf0c88e188654", "confirmedHash": "a3147cafae5cccc0a1f2e62855588a35db9891fc111a9ec30600000000000000", "service": "00000000000000000000ffff8bb4d4ed", "pubKeyOperator": "0918aa09e732aa263c78799a811b31230ff591807b50f93e955cc0692d6a418d1ba0609b5c46f1709d2a2c9216872c2e", "votingAddress": "EcjqvuwuDB62Rb9EPYY9URxKhY2", "isValid": true},{"proRegTxHash": "dbbfa06a12abdcebfaf332235af1b394e206a498d5f06305b2eb3aa240ff73ad", "confirmedHash": "ee946b044e550aeabc0b8b415c9feff30c4a023163ef22873100000000000000", "service": "00000000000000000000ffffa747eed6", "pubKeyOperator": "8c8b20f919482cf576c172d33fcafefce72314df252ae9fc2487104c35ac5f89b8d1e390d239b478ba3b859046274833", "votingAddress": "2xJwekiaimprN23Y2N6TUmqcBc9a", "isValid": true},{"proRegTxHash": "ea56b3c3b056be544a6034d6b063a7dd2ce4a0a28cb3d33afb207fca04e3cbc1", "confirmedHash": "fd3bbfb712a1cb133364c4e8a16bd1547d7673cb5c348a361300000000000000", "service": "00000000000000000000ffff55d1f231", "pubKeyOperator": "0be17900f82709c6ad40c051e008b2e1abfc8b70b6369c83f5fa657f44eaeb8e91824b1c86d996bd520f2a3c7805048d", "votingAddress": "2PKDDgmKdcVUh6wqtPuGcpGZCXSh", "isValid": false},{"proRegTxHash": "596601f2f9cb516f3adf2d6b6fd478ca7775bcc013a0d5427f1fd7fa2423abe5", "confirmedHash": "5144c5fa452363e31469517fd6cf1bc09f803abb48d4982b0600000000000000", "service": "00000000000000000000ffff55d1f118", "pubKeyOperator": "044c0ef6e7282befe897dc54dafcf72f632b545fde010c20444fff239ebc86e2a5d3b9d6dac2da7aa383bdf8f1590f97", "votingAddress": "JcocvydJ6EyHqge5qzUH7qyMKHb", "isValid": true},{"proRegTxHash": "7c5900da885f79df89caf17a6f6ca06a669d2e7ede33a372a2854d8a2b62e7bf", "confirmedHash": "a3219d36fd87140b7d2e96f61f07c271faf2b259461a08a91400000000000000", "service": "00000000000000000000ffff453d6bf1", "pubKeyOperator": "15e792aa936209e1cef81f57261e005e11c0c9758eca86f2e93cca13a3227ade8ebcbf52011830837cb5a0ad50ac48f3", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "ee4db87ba9a7b05fd12c5adeb74237ad810da139bff407139baae95a84d1f06e", "confirmedHash": "d3adbe50c1c1372798b588037dee89040cbe53763c3465131600000000000000", "service": "00000000000000000000ffffc2875034", "pubKeyOperator": "8fb64db88d29bfec13ab005a3aaafba4d320cd44ed898adf45920859d020d7ea965a3cf41303bc060da3b7c717332e01", "votingAddress": "zY7cVHtXQeHAUYXkAayxK3CG7jX", "isValid": true},{"proRegTxHash": "7931ed4036b4bf840791ef05f973fb94bf1895da13b0a24439128d191e1b0d6c", "confirmedHash": "b9cd57c8f28b525e1e057fc7c615c8c80645f4be0e8638090500000000000000", "service": "00000000000000000000ffffc0f8b390", "pubKeyOperator": "959e8bd506a9eb15e15f818524a79992320f7a19ca58b559be27aa3b4d2a2593b6672be5aedb45801d9147123ed9702b", "votingAddress": "8NKJ8jAWBW1U1LB8fxJQPT2dEuc", "isValid": true},{"proRegTxHash": "eca8f996f529c3a1aaf1ae7e69af13929eb221da39844f81e58aab3dacaed7e0", "confirmedHash": "bcec0aa44882da7cdc9c489be89a85b5fc82ac3b3e859f060500000000000000", "service": "00000000000000000000ffffa8775782", "pubKeyOperator": "869b17941379bb7efc0c7cdc51958df66e6280c1a12b7f17e14f3ec7562edb8d7e7f32bb0a3f93d3da5326560d61cfd7", "votingAddress": "3rzXLausxAPzcxnMBrMMEpiuqr32", "isValid": true},{"proRegTxHash": "2f643807797cb8034db481e61702dcb75b802345219f8b6b627fc7caf3102a76", "confirmedHash": "fda9be7b86e6ed97e12dc5dca123afdb8300e587bb697b620400000000000000", "service": "00000000000000000000ffffbc28a312", "pubKeyOperator": "8b66f89b81a1fcb5afbe00d5b454d0c5595cdd8af9ffccfbca91114d178e47944f7e573667a369169c68d8c097f5e7ad", "votingAddress": "cQjNkACJbSBPMhVhzzMXXw3R73u", "isValid": true},{"proRegTxHash": "f4d3bace94ff6e182f5534a2d1124a4b1fa0844928becf71b900cdc89d6aae15", "confirmedHash": "315e2575be7caaf8f60a671c103f1de1e8a7a9d875f6b4770500000000000000", "service": "00000000000000000000ffff52d319b2", "pubKeyOperator": "12aab2ccf75f3e5e0e545f97cb4423d14a2c7dbc5ed52281c63b8ed4e3da3561f0f1ad38b78ed184558303525a19b79e", "votingAddress": "ymNzjptN5Tqi85cWkJZdtKQZJ5E", "isValid": true},{"proRegTxHash": "5ba672b82cd3db2876df9ffa152495fbe4b2b6654bd51d4e6b527eb07eed8ab5", "confirmedHash": "b95d9082e57c7597d7dc4115e85be111d841360d298d85cd1700000000000000", "service": "00000000000000000000ffffadf90706", "pubKeyOperator": "99779d055a193094efaf52983171a337a6090d3ddf6c47dec0648a31d8cac8ef88f8248ff38880fbe88faaffccbdded4", "votingAddress": "4LMPsmR3XZKMnC9ApXNokEF6mYFr", "isValid": true},{"proRegTxHash": "8813749d32138564367c2163ce64f1883520a181cbd99eee616ae1940192c4da", "confirmedHash": "f43628e23dbe228ac0eec76204dc6c5df132f9c75238dbc31200000000000000", "service": "00000000000000000000ffff36270a68", "pubKeyOperator": "11d1192451af867f8378cd5036187eb569e39f83119913645e62e6d529b30227ded65f9c9fc58695b4055b52ddaf9d10", "votingAddress": "6MN5MVGvwnHpvpwCFjzAvn4135x", "isValid": true},{"proRegTxHash": "c2db122c0c3149b2d5dbd7726455c376b3cea7294be120ae037e306d21cc7094", "confirmedHash": "43b43a4de8eae4222c8de76fa6e2862ac5dfbfa5d856f5df0e00000000000000", "service": "00000000000000000000ffff2e04d9fd", "pubKeyOperator": "064d4f6c743e8151c939a0c9def80176fb98da73077a63482f78e3cf371d18138d343a2614e002d1ad65f72bc01e019a", "votingAddress": "29JoDsqPeZxQeXUbWfmx6RPEyeu5", "isValid": true},{"proRegTxHash": "77fb3f94bb971ca614bfbad69230d6f6aa14625bb8970f10f05d7502d9aba0e6", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6d37a", "pubKeyOperator": "93e38b5afa021b5f2826a4a9577c154f8f63558521636053d74297a7e7030ec86792924513dfd923bd8f9e25d09a2244", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "3a426597ce88c223a59da68e102b27bbce9c0ffdfe46c814802bec8fd7920fcc", "confirmedHash": "af6fa2334cd1c207fe01cf95fd34e8bcf64694d7b1a219470700000000000000", "service": "00000000000000000000ffff422a222b", "pubKeyOperator": "8ace0a17031c204156d87703b572a71625d6d56d2df4bfb31a74851d3d24de9a30391021a85e8283681c678048fffcc8", "votingAddress": "3v6pXEUZJ7YmSSemY9aEGPKPjTis", "isValid": true},{"proRegTxHash": "bfc0ce9ac560c60c8a726d3223dad66d8ce719fc9f06dc7627108f35b9eae907", "confirmedHash": "27abfbf06166e169729ae12f45e738192b4b5277b00234270f00000000000000", "service": "00000000000000000000ffffbc28be2c", "pubKeyOperator": "12802a897140b80f643a4d54a9e3b5029d88d07ed55112de660d1d47bd82f58d86551780932244422daf30a63bd22df5", "votingAddress": "FVkEr11X9m9eRCg3UcyeJyMpSHz", "isValid": true},{"proRegTxHash": "61e3f54ac672e1f6546b53e6bc025f8d2001c632bdc6ddb6337803abf024d5de", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6d3c6", "pubKeyOperator": "96bdd4b47b44bf0ef8f675e0a01991a13a6ef21285a16dcbad201037e2522e20b983f27152a6a790aaf154b85fc33391", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "a905073f9258654067b656488ba08280f4633d2cbca5600df0d1fa82022f87e9", "confirmedHash": "9be5a7f5dd673258f1b061f19eb4db77c16a7aa2c1b25bb30a00000000000000", "service": "00000000000000000000ffff58630b18", "pubKeyOperator": "07319ec88d7bab2df77fe2b7c30944161316423e4c4f3d07504351308cc0103dba47fdbad6e50ef4057b9b12137a3bd2", "votingAddress": "mPrUZzeBkuAtxNb7LKCkoaKJF7j", "isValid": true},{"proRegTxHash": "c007c02de283c82e5b8daf5ed326d2fe410d9fdcb8b046b85bb27af25773fad4", "confirmedHash": "86181408c408946c0e781a56cfd74aeccd0a4cb0c6e53bb30800000000000000", "service": "00000000000000000000ffffbc28af41", "pubKeyOperator": "933cc681dc65816eed170f54af4b133a08153593646c06af72b1f1e2dfb238bf29516e5e0e36ac7ab7397385b5644019", "votingAddress": "3ujz1qsPQ1v7n9YW9V2nsLVCApYH", "isValid": true},{"proRegTxHash": "a564411271db3966e09cd17348d1bfb09f45a090a9864fa2ea89f2beb6531496", "confirmedHash": "167bd6abac19405803e371f5a508711470e7005dbb70b7be1700000000000000", "service": "00000000000000000000ffff5fd8e662", "pubKeyOperator": "16b98fcda35c9469d00b633e5c249f84858b6bf15fd672f62397a86743c44616277720198f59c63cefa0fbfc0839b615", "votingAddress": "urwnbguGXBGf87SpuuSUKLuz54S", "isValid": true},{"proRegTxHash": "3064e4ae65fc7ad2863c864197232d02bf0148c13553b8079ae00b83ef786c77", "confirmedHash": "df358be594a699f74f61ead168b7a5cd4477e08f1c38eecf1100000000000000", "service": "00000000000000000000ffff91ef00d5", "pubKeyOperator": "19464314a1965abee3fbfc50a85ae1a2dadf3251d629ad61a4156755b9c748a1cbacbe111de01a289b9ee5bc66b18a2f", "votingAddress": "2iQqwrHjTEDTpuU2dshoCkMeWEc2", "isValid": true},{"proRegTxHash": "62eb42284e9a82f9745306f594b485a59cf5555c6ee2467e2fcd8f90091c30ca", "confirmedHash": "2492ea3b729d90f88b5f842cc4991378f8944e4375a696250000000000000000", "service": "00000000000000000000ffffb009d213", "pubKeyOperator": "82a604157069a745a3055025e33858c18da6f54410c77dee30c82db829d356e549f06d132fc32c7cd7e26d7ce204843d", "votingAddress": "4MG67NrLqzSAtGRtxmRac2kTZmPU", "isValid": true},{"proRegTxHash": "99e5c94a224e16bd2c219178d007f7e3a1fdbe0b1d2366e47a9c16ddfcd5b0b4", "confirmedHash": "babe79b1dedecfeee33868f2cdc4fdea04e9a241dab1a1520900000000000000", "service": "00000000000000000000ffff55d1f17f", "pubKeyOperator": "919d5511a6bdf776dc7d6345f5259f167a44e53564f53552789062fb04125ffb606334b9e6cd4ee59a3b9f71756e72ac", "votingAddress": "31JrLjvHtJaM1YU2aCHPifnYWuxu", "isValid": true},{"proRegTxHash": "3f094f0c79f8d9d4e0c364d072d0fce6c6750be326fe90184c0c24428893331d", "confirmedHash": "7a81ab3fde69b6db477edceae28c3c6fe16e8e72077aca130000000000000000", "service": "00000000000000000000ffff2d3a34b7", "pubKeyOperator": "8a31883bd3edaca27f0c8d49d0c06f28165c1a9c3b46d1b6fcdc5b53310dba56c57a8537cbe61ab43fa3015d87efd238", "votingAddress": "efg9HPFVKMfWYvMomACXvC9Hqf9", "isValid": false},{"proRegTxHash": "57b25e797cff424a1d7850d862e03528327fa5c17f403ade4087d7d5bd2921c1", "confirmedHash": "5062d44f2c7fe0785cd8933c882af4941d96b1264044452b0900000000000000", "service": "00000000000000000000ffffcfb4fc3e", "pubKeyOperator": "997568ae59a6446cc5eba7a8066253e7738da12b1c6c99cff13b3143d1863de3ecd6e9c295e1c365073b143f5e74c978", "votingAddress": "2F53U7mj4hA7enSXWNvKA84twN4L", "isValid": true},{"proRegTxHash": "56680b6b20b268c3aacc43428e0877f9ad27da7e62227c922615faeda0d189fe", "confirmedHash": "f3127cde24b6ac768dcbc6771124f769f1e68cddb2c83e8a3f00000000000000", "service": "00000000000000000000ffff9b8ae97c", "pubKeyOperator": "0f4514acb0563ad48420c257c8b71b91e8be3015917b0b2c582c6dba47c50b2cce8ffbed276f43e8337aa0f2b97bb9b5", "votingAddress": "26SGTZhU6f6gzEHy4Xytxrbugv7m", "isValid": true},{"proRegTxHash": "d6791f0bebda5d74cae3a2d66184d6d00fe09924b871556a627b69f3de5d24e6", "confirmedHash": "5c728b83e12f67dbf5ca845e9660f9c5b68da657e8f953700c00000000000000", "service": "00000000000000000000ffffbc28b244", "pubKeyOperator": "0a4bb155e5c2c3fea641f46a6510ef23d1f9d2813e61ae1e6a983978491013d2337e1715578c9c451b9b411fc18c13b4", "votingAddress": "B4HRxToprArrcUKRwsFbzb33xdF", "isValid": true},{"proRegTxHash": "e2557d31e7382391956771858434260dc6367370e1c5c93c7ffd47bb1f947447", "confirmedHash": "8b799f3478e8a0501366f35e65db7a072806b15d8499127e0700000000000000", "service": "00000000000000000000ffff2d4d01d5", "pubKeyOperator": "9182ac5eea3b80e79789b67bba02a4d550a95286014344b945d210d3ed862f00829985d3f6af2e7f1ee6ed1ca9f40e80", "votingAddress": "2yufFZAZ68yEMQwX7wYp9oXgXjc1", "isValid": true},{"proRegTxHash": "23418e325a0ad1d5a534b912a3500161ecc1ebb20f39d7375b664ad556844312", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d565a1", "pubKeyOperator": "83634d9486727a98fe9f5e04231ea55b21056165e1b50253832b40e608ccc8560c354b5dfc1a2632765cf4f91240cdce", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "fba33ff2c4a5a6c9440474251f065251ff07aed821b2e37591340ddcd3b68fef", "confirmedHash": "b27955cc587b361e909ebaf732e7a90f9e8560e085a04b5a1f00000000000000", "service": "00000000000000000000ffff41159cd7", "pubKeyOperator": "8893476e96a2a9659348125f5f0c73bca407f847ff951e0804c8da1c95285571fee700c5aa85f6b69d9bb79f3bf17a45", "votingAddress": "gjZkRBCSKZdzvnBGfuN3SnuB28v", "isValid": true},{"proRegTxHash": "495c3299e2fd519e88d3a6424f552243780a45d2833c43dfa2e74bbb1f38a122", "confirmedHash": "0f3885503fef04b99a8099f0a610a390b7f034eb961a11f70e00000000000000", "service": "00000000000000000000ffff34c8ab91", "pubKeyOperator": "85cfb3cc9086f3e3524a313aa3fa7b8d3ecde9d97d074a84424449b9fc9520831a6aac629345b08fac1134820e8cbd40", "votingAddress": "2F3XYKYDG8Rj2Xn6dxhsKgfArspa", "isValid": true},{"proRegTxHash": "de8e7858154401edc9e040ce89da62e8ea3fb5d3260bd843d206a6eed8cb45fd", "confirmedHash": "835714a60793b1f2efd5edf17065227dfe84d64a3c37d98a2000000000000000", "service": "00000000000000000000ffff22d2c245", "pubKeyOperator": "04ad092fd778ce8e5717b291ebf79149a002854e90b4f050a101b5c7848462171e79252c928dc91024b4637fc72aa8c6", "votingAddress": "48ffiVhqCBiB676TcVh27VFGk6xd", "isValid": true},{"proRegTxHash": "c3a687c176cd30e01e6fddf98becc8a19eb24b58ac01c33c6d0aa94fecf4cd5a", "confirmedHash": "22fe2a0485e0ecc0771e573f8e57550fca6573e062cf7a221b00000000000000", "service": "00000000000000000000ffff05a17e07", "pubKeyOperator": "0f9336c7a3e6318c2476a86903025e399cf0420a6e9aa9d1aa03b311cc343b01d51dcaa940205db81229f8fd272d4d73", "votingAddress": "3rCdGxMrQCZpVZGkoVMa71H2N556", "isValid": true},{"proRegTxHash": "c1fa59e0670aba6e441f29cbb7f473e1b6b7c6df2d28e76b1bbb510d0b8c451c", "confirmedHash": "c19a0fa55f40a5197ec1a65cad6e6c6a54313fc8a12643c73600000000000000", "service": "00000000000000000000ffff2e2428f2", "pubKeyOperator": "8d90fb5d80d4ce47fa3d46f4eb69c516d7ffce5974938cda8a0055d4e1e4f445251c86b75327e5d776618e29b9c26ddb", "votingAddress": "3UgLvXbiYzaQ9srYmojMVLE1N885", "isValid": true},{"proRegTxHash": "fdf15eb50729482b68b829bdd0de379c6e0c28a10542c49689fc4a848220a298", "confirmedHash": "d57fbac48102742cecb076cb448a36962e291769ddd8735d1300000000000000", "service": "00000000000000000000ffff5eb0ea9c", "pubKeyOperator": "86e4213e6799b87eee71b325c749940b27610ac4557650902150a4a78c625ff0c07ce758cd307a923dc0d9bc5562c01b", "votingAddress": "2kcH9bPgPXecUMJ87UCZM1SGhtBT", "isValid": false},{"proRegTxHash": "761bfce9a084d7960c776c46f9ac4fe1cca099f147ea7251859e9edfc97baaf0", "confirmedHash": "299d4eaee9faaaf602580079ddf218479e5708a78ef2c01c1900000000000000", "service": "00000000000000000000ffff88f37385", "pubKeyOperator": "0c86cebef43bc0e93014ad2d38cda55085af4bbd5d7191e7728ec50733ae6a21a42e2d598abfd4e6298e4d263ecaed75", "votingAddress": "aVtFXzHDhXgHMHKeK89spetR3Jo", "isValid": true},{"proRegTxHash": "17c32fb2e1eb16bd914f9f4ea1a18fbec52d0502b77ec0634665965cb41ffe89", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0ac", "pubKeyOperator": "076b7b554d2dd63e8db0fcf786fab7288d44e517ee813f02beb2114fbeed4f1563bd816bae55d2931340033be5d1a0c9", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "cb3385d42cd728b5637040a6a66a80ca67a7f57e57d4a10207ea8991a3af538f", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b00e", "pubKeyOperator": "9223b9db1eb8282414ae231d944a651eba3932cf87d43de3944bf5b3ce423a68b26686a9d7b89b6b61d2799b7e664b16", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "eab7f461245a2a762bdab66315d94fa41be1de7b709811dac6ff5428c9809b25", "confirmedHash": "89780dacce6ad662d4725aa873340c01b7f80745a26e97760300000000000000", "service": "00000000000000000000ffffa7a02433", "pubKeyOperator": "184a33a0cb0ad766ad16d6ebebb3d1c429e023f25c9791189ea29537ebef7a7413b4281184bbe86c2d627ca6e8456e77", "votingAddress": "2kcSbrG8XHZH1sWxiXDri3ts3utf", "isValid": true},{"proRegTxHash": "4670264f943990cb83711077625231ddfec2984dd38e529e8958f2b4b9c4a3ec", "confirmedHash": "53a78b0c6cacf1ac96b3879798fa784d5c58addd6c4eaf660b00000000000000", "service": "00000000000000000000ffff592fa5e6", "pubKeyOperator": "0a9a261174a2e8e77cfc66a43215794d7fce1346faa579768a5a6f78a28854d8ef6dda8aa3609c3a2b9fe7732d945ad8", "votingAddress": "2Jbjoz8N5jnpp8ggrUMBfGTmxozL", "isValid": false},{"proRegTxHash": "12b3100ea7b9212fcd1a28c58a650e4a71898f42cf9827a7f63bd5070bcb5ff4", "confirmedHash": "9b5bc5f246bd929d5d85fc0a4dc95df780c83751bb96832e0e00000000000000", "service": "00000000000000000000ffff55d1f280", "pubKeyOperator": "17f8f1d02909a41ae9e7e004b6137ef4a4ea93834285e1ea685d4c46d290672260559322bf5845f6c44f72d944bf5a28", "votingAddress": "4TbseDsTD4yTUD9W7YWQVoap7kv7", "isValid": false},{"proRegTxHash": "9540510cedf73a123a3b3d60ae7fee657838ec6f2acfe5601dce04b587ae531d", "confirmedHash": "b9c573b69b84f0a4e828619c445d5181031978f5faaeb7250400000000000000", "service": "00000000000000000000ffff88f46e6f", "pubKeyOperator": "0065a7a560b657f11abdd17d7ae00b0504fa8cb82f8fa2d4e66b50cef9da5047bc7db201da4deafa56148ec801e3fd7d", "votingAddress": "4XVdE8MphvXjZuxXZnjuvo1WHG4w", "isValid": true},{"proRegTxHash": "0ea47e0a691855014dee4721ffe1e007fa83fba1d3a46d701df0154b620e3fcd", "confirmedHash": "ea20aeb6f97e066cb67d4c2ae32dc1977568e1d87ba470661500000000000000", "service": "00000000000000000000ffff23a2cdb1", "pubKeyOperator": "95dcff1db35a6ee3cb98517e07e9b03d286192747c5bbcef4b6f21907db6988de1ca5dc243ad97c5f917c1fa63237d77", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "7678d387e33ef3daa25c4e7c3e62d8df6daf4b2afaa2958298ad8f5ae0f07898", "confirmedHash": "e75fab773b13bdd2713c24ed210153a77206e59b738a72991100000000000000", "service": "00000000000000000000ffff4622ccbd", "pubKeyOperator": "875d313d2197e822a866a414a060b8033cca3e711a709622eaccd1d59dcde44e26ca14227e5deb36573c2eecd382ab0f", "votingAddress": "uzPrng1WJXZuPo1ZATBwwV2bT6k", "isValid": true},{"proRegTxHash": "7c22cd7b1d64c62abf584f50ab27900a56545c25b47b29a7667f1905f8b4c34b", "confirmedHash": "59355905449f8ae451482389be94971d01661f6512b537ce1d00000000000000", "service": "00000000000000000000ffff03e6f092", "pubKeyOperator": "81bfb3855a76e38220063cddc67f2ce04867b7dd1b75137835b7cefae789a79b5bf94142ccf4ae26d8667852a7746a37", "votingAddress": "Z3PZ4cB1sftRPwuM4XLoTpW2Mvq", "isValid": true},{"proRegTxHash": "f9d2e83f6bfdd9931dade361a1c97e7c34e0818ef86b7ba34a995c7972910d77", "confirmedHash": "9efbc2aa809cf12e20e81b6d2f9f486fed62c0bc92e2b0633500000000000000", "service": "00000000000000000000ffffbca660db", "pubKeyOperator": "1002cf69f3525acf19e77f766ed5038dec74fe86851729fdf398b4a95b14b5d1df03e16c09520f9da5f4b846afe1b38d", "votingAddress": "4ZFVBMJmVxaj1h1DMYH6YQoWirpd", "isValid": true},{"proRegTxHash": "0790f394be8fc2c3cdf870871843a84c6eb8633eb090ddc0bbabfa6893de9b25", "confirmedHash": "1cde1253ba534b618baf3a256741b40c82c161debae58be90000000000000000", "service": "00000000000000000000ffffbca6414e", "pubKeyOperator": "99d55a54d3d8ee3572501fd8f6536f02c1a550eac904e356fc683b5e453c08602629d260010265e0a3608b69510b053b", "votingAddress": "4BaxgbWg7yKvwd99UGBfCvDmCcnB", "isValid": true},{"proRegTxHash": "8bc3250460d2ba4fc1a48aa92f922a3fcf74f520238c02d9d660421790136292", "confirmedHash": "656b5bb14b84a0a9d8a0b3361aa677ebea7fd828d41888f90300000000000000", "service": "00000000000000000000ffffadf90fe4", "pubKeyOperator": "123155aafdecf440a1bb50fa250e659941ca753c24c20eb8f7c853f2707ce7a9d3e6257b3cbda75aef0776d947d1daf4", "votingAddress": "3dwcKwx7ZDbw14ppSf5H3L5RWw7U", "isValid": true},{"proRegTxHash": "fdfe9e0c5747fba117875d319582a467b24c7e202cd797a07e1299a89013f2fc", "confirmedHash": "8168b3ad5d59fd1fda68340a2cbaf9d24f6a8cfc01997b5e0400000000000000", "service": "00000000000000000000ffffcf9475b5", "pubKeyOperator": "10930f4664f86c40052cb77af3bb7a1a0b39327dbacd93e93bbb22bacbcb58b0845ff6f51cb28a923e95168106b4775c", "votingAddress": "3pejjVcppLsHGb3M4PHEwWAxPqFB", "isValid": true},{"proRegTxHash": "d367e045c3c4587d5cc85815416f2ebc62453b06bf9669fe04fe23c7aa9b2080", "confirmedHash": "e54c00dff9e89b2cf50846f47b2a7cc910dc46cfabc8a2d00900000000000000", "service": "00000000000000000000ffff58c6e419", "pubKeyOperator": "0fe5a54aea4f1bbb2b7d13891359f096afc900443af3fdcdb45ad4a03090ad4857ab45de0d6b914c915d38c2611e1172", "votingAddress": "3ayQRHFSuNaANdLz3XUFMsXp5qNu", "isValid": true},{"proRegTxHash": "8fc3d2036c283b75dc9a83ff5f8edc6516c2763d1a659db0314941ee22406b3a", "confirmedHash": "e296a3dc9a286780f38c976e6a42e7b9ff044bd7401d2dd23b00000000000000", "service": "00000000000000000000ffffbc28b6d6", "pubKeyOperator": "94d877c6c8efd85862a0bebbe6e342e562648b27216e65b10ca4180e2d315979cf6cb572c033f4a786e9121afc9be3c9", "votingAddress": "3AaLvZdb9xbXEsMQQtJQijwQFJFc", "isValid": true},{"proRegTxHash": "b3f57d131ac73c219e62a327814c1b8f4a3aa1d5499a62a2cb53327325abd21b", "confirmedHash": "13d3fd85b30fe86f2fa97e8cc7c69407d35e94fa2e898d660400000000000000", "service": "00000000000000000000ffffcab67693", "pubKeyOperator": "0fd517ca7b750d3c815d4228e2b7641aca9d05afa0e9d3264af29047d434e61a8444ef3332055d60d95fbbdf1c9860e2", "votingAddress": "SDAGzsWk84tVCptBCJQnNbazVfp", "isValid": true},{"proRegTxHash": "cf2ebb2b02f35f589b4cc6b9ec460f2059d1ba3dd1acfaae2a22c773951c1efe", "confirmedHash": "f53336f5b4ae3112a1dafdf08a3f840d63af51639c059a570b00000000000000", "service": "00000000000000000000ffff5fb3f834", "pubKeyOperator": "87c3af5eb4b01e84fb62c3552efecc18d4ab74d11e0342bf8fe7e2e0cb08dda550141c2516a3dcf936b7aca6da2d8530", "votingAddress": "37MDhVpwzgHEVQoWneaNVk2QQCUs", "isValid": true},{"proRegTxHash": "b77410ce67823a67d25bfd17fe35e72b86c98407186fcfc1ad82ac78072d2dd2", "confirmedHash": "4ab4d287596ce2a0908923696ee4cb20df34e0999fc9a9660c00000000000000", "service": "00000000000000000000ffffbc28fbcb", "pubKeyOperator": "0b6abf17b6d3e19533a2d248bf6ae924e30996eb1e015808914772eea21ce3585977331b22631edf553712b774aea011", "votingAddress": "a3yyzVP5fN4SkYPbe7jtSJf9cUN", "isValid": true},{"proRegTxHash": "4f7272eeec602e0b730c157334dd6f49c8b7a3deed90e21392ad2361b9247edf", "confirmedHash": "d30f7fb359ec43fc9bd81a0ffcb9910d4ae60038f52c30240c00000000000000", "service": "00000000000000000000ffff6baa0dde", "pubKeyOperator": "83d28d667a3c25b02c85002103d1ea4b414722fecc8ba0c7096a032c2b2b967b8a364a93edf2ac987a00c816b735d469", "votingAddress": "4VHiXme1qRGNC4FhQGyNuDrsyL74", "isValid": true},{"proRegTxHash": "a4337d544a6bd1a34490e4adf7f8117865f19bbf4a31c020fb359cd93830fba3", "confirmedHash": "f4e56ed87cbf5c6439e89e656c3b7002d1183258e869aec21400000000000000", "service": "00000000000000000000ffffd4186809", "pubKeyOperator": "17e26dc2f3aa80354cf191333030900af4e4a339f32a59cc79a5ecc0e3b15d3f9cb2fa8a6203c8417d95edea56211b03", "votingAddress": "267iSAcpHca7uEgCjbZB9rrppaF", "isValid": true},{"proRegTxHash": "9bc4803359bd3f1298cfe2094895a1acd717b30737723955162ee327f4bb37ec", "confirmedHash": "90dd4f5b03b1b587e8fec794379900814f60825e815f86242200000000000000", "service": "00000000000000000000ffffc2875417", "pubKeyOperator": "07f365f676c358acb01754b3dc9351e9a00af5b2981458f58c6edbfa40c28160a8b1c4210634af5ad65cbd6362b89c59", "votingAddress": "tSg6Q918uqhtVG1euwbHywd6YC3", "isValid": true},{"proRegTxHash": "9f371abf0064d63e01bf4d86eff9710fdb733000521ff9601914a8d60f41a19a", "confirmedHash": "090d13c932dcae92a5895a73e077a144520c17d058fcbe1b0100000000000000", "service": "00000000000000000000ffff87b53226", "pubKeyOperator": "82254b850d993a09668ced032eea4e6959dc352f8caa781405f7eb94099a970b0edd773ed6b154551653cdab70e6552b", "votingAddress": "3vbqPo5nctdxVyJN2uxnpwuzLg6J", "isValid": true},{"proRegTxHash": "60bd57a1ee801b421c18bac2e3a4fdb31ec7b29951854a5c51b41304cc92feb1", "confirmedHash": "f1457b74fb1c9b099faedc8dd40c2e4c977bd0c95d4f33ae0100000000000000", "service": "00000000000000000000ffffc0a90688", "pubKeyOperator": "8e9cf7e29754bf925c679e0bfdd2c2dce969907c52c726017479265023d0532b2e901ef4d9470f467b0662b511056fc6", "votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", "isValid": true},{"proRegTxHash": "b7c024832759251e45612ee669eb0545d69d4b79b8f561868770619a453f5823", "confirmedHash": "92b683438f3e5e5d94bbbdb09159ea8ac752d0ae4b5aaf641400000000000000", "service": "00000000000000000000ffff55d1f274", "pubKeyOperator": "98ed06e5445ef8d5e509fb399ecb28503a4c45ae264d5b8e92e62a8d21a2ea8e5bee6e9a972abc9a8dd15c62de9e2bc8", "votingAddress": "2gGjPKpPkaCotyxkpiakn8NDJYvY", "isValid": false},{"proRegTxHash": "b0fc6b606e6a347d2232b1efcab0e7f2ce46b8a4759cf801f0b8c2b8b7075219", "confirmedHash": "bd31f35c5cedbf07c6ffa716f2a3acf8f725ab42af8758740500000000000000", "service": "00000000000000000000ffff453d6bed", "pubKeyOperator": "101969411b48fd4df4bcb349e7b285453e7bf4eeda1977571be2fc4bcea98c5f1e65196ddbf11b4bdfdd5f979a637dda", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "2804ad85ed8fc5b09436495f791a1319dd9d29892eda874682d5d49153047f05", "confirmedHash": "40eb226bde6acacc89fd5f27079c0541d1127e4d79d63a361700000000000000", "service": "00000000000000000000ffff5fd8e664", "pubKeyOperator": "056a6247e6eb81dd59ca27cee263d06adf9ab29a85a15833a32e1554bb43bbe7a40d07f8db2296d0ca5c8e378c1af243", "votingAddress": "2Lb6YR21x8hWcJBCAy9V2zE8nM1o", "isValid": true},{"proRegTxHash": "8092fd126de5e2e48943596e9e048c8b2904d289a1284abb717cdb998f076eb0", "confirmedHash": "7c5317ae3958ab7d91df79368391f7b76d162d924f6aebcb0700000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "3buZorGDjCuYP3Km388j1usRHC1Q", "isValid": false},{"proRegTxHash": "19e08bea98acaee744011fac8db816c47f12aa9e859b81414b6bcca608f6346d", "confirmedHash": "51595bcb1f368f956cdf33cbd3b4297e4de0a26bc922049e2f00000000000000", "service": "00000000000000000000ffffa747479d", "pubKeyOperator": "91181aa31939e9a0017e09d6a9774b69f61cbafabfb0bb0bb0d039f91d6132213d70e94e411c13eb1d35eae206bce33e", "votingAddress": "3vVg4o7r7VZxjzWE6RMTvWtgCLvQ", "isValid": false},{"proRegTxHash": "ac7a8dc2fc36c5abcd823d2d152c3872bcda6c1114d1702f974fde08891f9716", "confirmedHash": "44f841b78b6edc3c277afcbc0a1538d99c76a03e0baef2c31700000000000000", "service": "00000000000000000000ffffa5e321da", "pubKeyOperator": "0171ba1031155b9c25b156794c2aa5fa7716c754318f6bc500c7f59bea8a04f41326277c4469ef7d35c39007a53c227a", "votingAddress": "3SVBfzG1Supjiqdc3Roq5dVKHkEq", "isValid": true},{"proRegTxHash": "5e8fe358d64f0439467396f16386adc7d4960bde5c94d6534877e2a59c20f5bc", "confirmedHash": "a1c8001dd25067b0880162983c5d23d29791c6b30b2739e80100000000000000", "service": "00000000000000000000ffff2d4d37dc", "pubKeyOperator": "8f2d54ffb351acc9fb8ca90726b02320832dda589a83fae040611d96a0a6917a5fbac2841232e18312f675c6a5aee670", "votingAddress": "44c3o8zC656T8kJkWQNyA3sk61DJ", "isValid": true},{"proRegTxHash": "843a7835ab0cb23898f0d0705e60568becc879ea0fdd08d3b299cb450d632d49", "confirmedHash": "f023921d7c4aeda96479b61f592db0d9a90720b2982b298b2100000000000000", "service": "00000000000000000000ffff2d4c0131", "pubKeyOperator": "05f9dd24230b08bdea768f1dd9533568b16e6ea08b56a395148cae02c76eb572a5f4d2f28eb4c1e8ea3bfb2e93b92dd8", "votingAddress": "48Kh6NnSMoWytS69RrSbAsFTFozE", "isValid": true},{"proRegTxHash": "08f078090b57307ccfa0a19cd262647da2fb67bc27ff0d1c30ed88f46ebe54ae", "confirmedHash": "9ffc42b0e292a697f35cd28c295e4cf9f6fd99e0241e35f40000000000000000", "service": "00000000000000000000ffff5fd8ff40", "pubKeyOperator": "8919000eeb1880a2faebee67c37df14bcc296b8fa0bf2766cd78c929f082f1c6798614c38cff68a26f8b007174b3ec04", "votingAddress": "2AY8wmsNn6y7MrZALfpb53PnNFWV", "isValid": true},{"proRegTxHash": "7202fc07ccff347252c6518f2511f1c758c671272086b7b020c511afa4f16994", "confirmedHash": "d82bad0030563a5b669480b1989978c8a45566066a194d3f1e00000000000000", "service": "00000000000000000000ffff92b9a97a", "pubKeyOperator": "0d1e98d3645b6fb5728b0a9cf6adfede25ed1656496b37edc728f59045800b7aa8c56c605463a996ec8f9178448ed12e", "votingAddress": "Ax6JXWWM7jDsvAYcNDnMqDZrRqV", "isValid": false},{"proRegTxHash": "c7a41f4bfc062f25490a9e54d01bd46bf337696d64b917f4abd3345cf1f04f12", "confirmedHash": "17d4a07c092888400f80b97491904fd7b136d07d47e7223f2200000000000000", "service": "00000000000000000000ffffa5e3f07f", "pubKeyOperator": "0413fbfc3e4d16cabab735194e5e3a851f3e3e4664f349e9c41118b838453b79c0736444cf05ace86867f2c6caa6cb43", "votingAddress": "2W1JK5q5yh1Hvq7nASpRQLDemVKn", "isValid": true},{"proRegTxHash": "a7d52fe409be2361e6a5e152c3a92254294e8f31a33815faf631936196fe9671", "confirmedHash": "5a5e80ca22e84a73e6b199887a96d93bf560fadafdd4a9980600000000000000", "service": "00000000000000000000ffff867a5cfe", "pubKeyOperator": "8ca1bad23afdbbd5df2697a43f7e0513c66655ccf366a425774110429b5560f89ff4c928b7cb75795901048e496fc208", "votingAddress": "2vVoJRzLE3vxKfP7fzvdwJvVpozk", "isValid": true},{"proRegTxHash": "bb5a080b01ba6beee70f477b72dab03a99968ea5db3113229e06e31755cf723b", "confirmedHash": "b27a4452447b20825d8eeed5618e68527c2699fa87eb459c0c00000000000000", "service": "00000000000000000000ffff707c25d0", "pubKeyOperator": "92f60c4006cf5167c877abbc87f516dd40fd2a9e883e02fd06870c4ca04881e5ccc6c87cf45f6a06e439bfaa1227f0d3", "votingAddress": "37s9txSYJxyy9mwDDzAjw3ivbJPo", "isValid": false},{"proRegTxHash": "7c29ea74900bf39b150ef51310f2195c8aacf7512618c643529dfd24dc0eb2bf", "confirmedHash": "04d0aa7e2191e996084dbdf7ccdd5f752a6977f7c185b2c41e00000000000000", "service": "00000000000000000000ffff52d31977", "pubKeyOperator": "19d82bc06233508f85ce52152a7af304fe4661ae48f69315c8bda08c5b652914cc19b7efb138e3d96ed0553fe6b84e38", "votingAddress": "2w3axdhobV4fcxtrXkS5iZZkA3dD", "isValid": true},{"proRegTxHash": "4a9cbb51bd2e8dbfb87ddb3298418c7719e9892beba6d3ff8d89ddd2a8c9deb7", "confirmedHash": "9883332531dabbbbda88650767ebc43475ea3fde749e36a60b00000000000000", "service": "00000000000000000000ffffbc28e707", "pubKeyOperator": "8c05f87268f92ede6507d10d500b14c1146c77c1d57c14b27eb73463cf34f9e0ae199355e895479fa683e5abb60c6259", "votingAddress": "BvnHV131eipYhFJkrCdV6tfJHo9", "isValid": true},{"proRegTxHash": "2cc65938d4d969fc66aaf3d51a33c82a52627592397c6a2e7478c775c6294cb2", "confirmedHash": "8f1364d8ab2ac8f3197a6a8f58366e32649be6c2e594bf2b0500000000000000", "service": "00000000000000000000ffff58630b0d", "pubKeyOperator": "8fe2ad7c32edc48d036db921b771227ce1e001b5342df011c730fb7548f8061ebccd25a29cb93a19447d034bb78774a7", "votingAddress": "3SPkZpjheuZTR1dWK7oPrPQSxdVb", "isValid": true},{"proRegTxHash": "2eb0477974e88d1d9c4b6e0dc249c94e63e649446bb64e60bb32d971a50cb72f", "confirmedHash": "9fa66dfca9bece0e2942a828a60cb33a713997d81f778b280c00000000000000", "service": "00000000000000000000ffff5fd87e23", "pubKeyOperator": "156cc529279e3fff8ecc8490ec62da2510077373bc8332857f9d9b352044f33f462db837345f28fd51f9bb99840c9dd9", "votingAddress": "4WatHTZsDYxrqTcPLNiretxessjU", "isValid": true},{"proRegTxHash": "21e9c0bd151b4a6a36b844a9b23decc66a91195463752c537ffa4e947dbdabaa", "confirmedHash": "896d9997da836470423dc8109dd8c257ce872bda7083a5b71000000000000000", "service": "00000000000000000000ffffa8775311", "pubKeyOperator": "98fad613b8a7d0f8fb178c52d63b80b0439f495d62a2b095431f101505bd8e624ca5e053f8c70ec59a0ae4ad2066d5e2", "votingAddress": "4ZZbHzjcQimxuAQYRbmhfH4XdbXm", "isValid": true},{"proRegTxHash": "3d565de0031d6de415bd8a45c52d11476bb1cdb6ee420d016b974145840cdae1", "confirmedHash": "aa5ed19ccaa063b986cbd2d30e4768146c40e39aa7f716232000000000000000", "service": "00000000000000000000ffff2d4cfcc3", "pubKeyOperator": "856c272f34f4017db0cc20f3bae6cedee8446fb4bf2447c9a77a3cf487494ffef7b42454de18fbc703d9a1f26d5fae32", "votingAddress": "Ku8UQwDoXLka96drut1b9RjHU57", "isValid": false},{"proRegTxHash": "fd56eba1a6240eb5e98fcd894f1408776129ca27ed4619f42bebd7b6c90e6ad3", "confirmedHash": "7d976be35bcec26192c33f2342772e769a5a67ddafb6cb0f1300000000000000", "service": "00000000000000000000ffff55d1f14c", "pubKeyOperator": "0eace8a0201ea79ac2cd7d654afaf5ee02d49394d416f1cd9fd0b935cf0dd9da2b375e744c38bfaa42ffe9e47353db7a", "votingAddress": "2w4HHLgyMZNdTZFwGhLG7s8jy9CW", "isValid": true},{"proRegTxHash": "89ffb5e9522ac112c37dff98350d4131f706bff20d86f47d38f3fed052e9cd89", "confirmedHash": "91934e995730d6c27406d8cd713b98ca5b9b890b7da74e7c0a00000000000000", "service": "00000000000000000000ffff0feb48f8", "pubKeyOperator": "9696d7b4f3375e640a697d66e0920ef31b13bdb98856d819165c64cc9db917cb4022c34943da08984393a161075bb330", "votingAddress": "3SfYuUb8DRVqqfFeZD6tehYcCAhU", "isValid": true},{"proRegTxHash": "d7c8eca7be08b31fc2a0792949dd614db3d925cbc58152aac6dcbdfb360192ea", "confirmedHash": "8f2a42dd16742cc010251e848b6628f127ba6c9a770bd5052500000000000000", "service": "00000000000000000000ffff55d1f107", "pubKeyOperator": "097d130b316f998ea1c34157145162b729521e62c04855ad044da9242f49e4f5b7a37bdf522aa06eecfac7874698ab70", "votingAddress": "2hcgNuFxqkDQakG3R1u1RJ15Ava4", "isValid": true},{"proRegTxHash": "b8484931fab1425217f83070cd9514d0a96bf9b935672b7244658ef9d78ed0ea", "confirmedHash": "f53cb68eb93481deb7965a1ddc993e7f33ca76bfc60603e80900000000000000", "service": "00000000000000000000ffff55d1f1f9", "pubKeyOperator": "1708b4710ab7b53bb037e30292955c3e01e7d58452f0c687f2207ed5304de4df41c466dc97f7383648e5bcef98b2b847", "votingAddress": "3fzhkXRe74CMxsgdprSXaiLjq46N", "isValid": false},{"proRegTxHash": "a859cacbbf696f33c4897f3672660d152372c48420fbeb8cb77895a08fdc6ace", "confirmedHash": "c8ed8258d269bf5e391071d53ed4a4aec43b71985fa177b10400000000000000", "service": "00000000000000000000ffffb9453648", "pubKeyOperator": "8810edc7d69618ae615d7fd5eae65b7c47db55e7a85db5e9b3ca2697eae1c6acfa3b7407027c5b91be79ff8cb37837a4", "votingAddress": "3oTR2TYHeC5Mi89Giyk3yoPqoqFM", "isValid": true},{"proRegTxHash": "5cc4c6c57170c4571df28746932d55ad9870d30637c1d734037e9c7b8fcd2dc6", "confirmedHash": "c8a3d66ba682964becd5a2d4fd404b4ddbcb6eb7ff740ab00b00000000000000", "service": "00000000000000000000ffff80c7af46", "pubKeyOperator": "093b5f909582eb062f44d2402a8465aab545d2fb36adfac3c18be7c67f885d9d1f017544d26cfcb18354d74282a8581f", "votingAddress": "4YzSBzyVZQ4Fe9mzkJd1Cj3j5Z5y", "isValid": true},{"proRegTxHash": "80d566dc8dececa2c202c36864a7f58701f07c0e90209c3fed15eafd60fe4557", "confirmedHash": "76f407e03cb8fba7f5f4b72b3b7d7976aafd15215536b88d1500000000000000", "service": "00000000000000000000ffff55d1f1ba", "pubKeyOperator": "00e2a1ad31054049cdceda1354e25e030bd48c8abcc30570c568f2f462e94bbdb8ee0facb2fc99d0ef5c0a850891b10a", "votingAddress": "W5FUX3Fx2iJYWB7aZ5awYqcQkEe", "isValid": true},{"proRegTxHash": "8dfcfa42e8cecabc3b5c28792dd46eabb61a87d056b37174a31cf80ab682fb89", "confirmedHash": "45118cf828a48115633ebaec125f4ba33c70f29ad0d4f7870f00000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "4UiRt6MnBtSeuLVbWouYm7Nd84xB", "isValid": false},{"proRegTxHash": "98db1ef6cf096a40f05b52de5039a0ef04ce1dba5b50121c709d059fd1967d12", "confirmedHash": "1b211235c3a6f158daf32dda315733ccf7505374eb82c1b31200000000000000", "service": "00000000000000000000ffff52d31542", "pubKeyOperator": "816347185cd3b450676ea00a006c2703491f679bee6936a3a92300e3dbb078d48c4d6cb9a7fc7b5028bec7d9a1afa2f1", "votingAddress": "2dE8X8Ucez87U7HxLuBBxSZ4nt6w", "isValid": true},{"proRegTxHash": "f36c62267e3becb85274a29adfec75e0920872455565341678bd23ac9b4b312e", "confirmedHash": "fdfefef66f65d12465158241281ebbb40c685199b96656e53900000000000000", "service": "00000000000000000000ffff9fdf5418", "pubKeyOperator": "1023b2675c9f972861c5ae4caebbb5c7b13e92ce38d08769b3df915b2162f11581913916cef1f282c19e90dffff166cd", "votingAddress": "3Rhw47hw6DDXhN6eXD9kq5VtfXyY", "isValid": true},{"proRegTxHash": "71d2b9ddd8bb474d3d9b48a6fcfce10cc2c91182c584dc412e6bfa02f1de668b", "confirmedHash": "1b09c83c0db97075d29d5ab48d334d231b0eb97f5741047c1300000000000000", "service": "00000000000000000000ffff74cb3687", "pubKeyOperator": "997f1910c464cc390ea3627861c5b8ec33549f72fd98b582098dc23a27a893e121a97efdec49c1e602dfaed661e103db", "votingAddress": "25sAzVzHskqxo311WYddfsUXCikB", "isValid": true},{"proRegTxHash": "56a74d934575e840d741a7e59fe8584c71f72a647f0ae5f8c2bfc1944064c3b1", "confirmedHash": "a9ce9c38b81ef341276d3224aaf42cacef1bee740d7a09a20c00000000000000", "service": "00000000000000000000ffff86d1c783", "pubKeyOperator": "0fcea3c0eeb8827c43b564c5167f35e0cc3292dd568121dde064ee7b281188c0f55c9b6560438eca7058f2944f46b5f2", "votingAddress": "427pK49hNRrdEDkBiuTJe2Uteyqd", "isValid": true},{"proRegTxHash": "f8a6a7c7f3e4214c1a37c389fabb1a337a92008200344b67c4d29f7fbe9c5b03", "confirmedHash": "476abe365e99d73a35b2175aa1de6fb57e3c4876a516c9640c00000000000000", "service": "00000000000000000000ffff2d479e36", "pubKeyOperator": "88258d708024ef91d4f8e43a9f1a43c46efa5e49834eec4ed43f041c7bbcb3c1467c4398cb58ed4801a166b98f10c8c2", "votingAddress": "BToYz19Ze5qxnLeecSxAEYLUubQ", "isValid": true},{"proRegTxHash": "ebadd2bca6f772a88935c249ee752074337ba1cfe307be57f16a1c957ee26ff7", "confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", "service": "00000000000000000000ffff592fa5cf", "pubKeyOperator": "0f6fd70127eb7f9d190bc2127e7720e0aa7b73e1beadbd6a150c9b0ee4e00cbe9160ce698b2debd2b0dc7461f27557f3", "votingAddress": "UXfsVZcckiZsuuw6zoaz5qvU6TP", "isValid": false},{"proRegTxHash": "aa619b0b9232a46311ec238231efc351a7043f823a1dfbaa72be6b86c292bed6", "confirmedHash": "db6e24accfb09c81ac4539d366f24cc3b163af5701dea2a50c00000000000000", "service": "00000000000000000000ffffbc28b992", "pubKeyOperator": "878a04280103f8fd7c0e5795a5642dc4bbb64ded64440d87c81f2e10d1dd0db696c99b228ca80860ed9aab6d13fdb224", "votingAddress": "24UkpXTJWE95VT1zMfGRHoq54R7E", "isValid": true},{"proRegTxHash": "24ee1be70797969c1edb45c164d8aeb77ffaa69130432796f410478c5cab256f", "confirmedHash": "27bf81c9962b2f05e0f950120e68bfae23f450cc6cad05851200000000000000", "service": "00000000000000000000ffff55d1f110", "pubKeyOperator": "05c3db4533948337ca2043e87599bf2389f456f673981704e7ddefea7f27375056d5de2e2fb89242e7d511b75442aff5", "votingAddress": "3dwtg6HkUpYk5jRhdVcM579qQ5nk", "isValid": true},{"proRegTxHash": "64e4d4f28083af15c1c625e65065a6452a43171fa775f85ea8507bbaf418f03a", "confirmedHash": "d08e629e93616e373ee7e1fa30725c6617dc3c6caa7287200700000000000000", "service": "00000000000000000000ffff5fd87e2e", "pubKeyOperator": "14cd3c7a237cb46694ce76cc8b9981b6737451845a0feeb3f4ccf572e9b908d4a9d38ba1e4691315785b93ed2f5ba33d", "votingAddress": "2fEfN9w4kanuCqkDRktZ5RRqrEDp", "isValid": true},{"proRegTxHash": "1fb2c0297c0fa3bfe9e94b88e119091deb94e70d8dfde5916541be753a2b1287", "confirmedHash": "e3fd755a487a3fb4f9b2fd3271b5dbcba437312b371101e40000000000000000", "service": "00000000000000000000ffff8d5f356c", "pubKeyOperator": "05b4849a4225f6b57ee74053720435b191428926b9e674cbc53fdfc4921313a7ac18ceda67125d87d7824d214fe291bc", "votingAddress": "36NE3YQAwJruw8tn1Nrz4icCaoqS", "isValid": true},{"proRegTxHash": "dde0260f1726caf7753fa0958f54a27856a08304ac689ad6b8ba3a0528b9ee89", "confirmedHash": "03f0845cc725e095b9b80d99484904ba1b9eed996f1db2d12100000000000000", "service": "00000000000000000000ffff58630b1b", "pubKeyOperator": "85ecfdb728604eccb835cdab7773910025d1a9234f8fc0e6d8d7811a2a84136c6370bd92db4c07a6e77aebeed54f7ac5", "votingAddress": "QxMAEQdrQVoMjn4hp3228Tqe89W", "isValid": true},{"proRegTxHash": "46fe341891983b58806095018dfd864bd35062c96343bbfb8a77ea801aa46759", "confirmedHash": "08b6ffd119adda6bb3b9f6d9b178864214c0f39ccbe31fa52100000000000000", "service": "00000000000000000000ffffc0f1d97e", "pubKeyOperator": "13bedacf1de90ea514674decc7c03b582296da44e271673a5a18b06f4d29409188865100ead59b25691a0ce6fa01db4d", "votingAddress": "44ri7izTS9DkjxYasz3za7og33Cn", "isValid": true},{"proRegTxHash": "a665bdea60680c766f3626d7a6708b0cbeba291589126accf1aaf76675f3dd65", "confirmedHash": "b1b65685df374464908db94f3b25ac42bbc46f7a16694d9a0b00000000000000", "service": "00000000000000000000ffff8b3b1e95", "pubKeyOperator": "961294cbb05f3f0083cd1ea5af384bd23d3f323cfa3e70f7e62a26dfdd6a06457827ff4c9531839db23657635966d4e5", "votingAddress": "2xR4NGEJCh6evHviU7MTEEBHSBTo", "isValid": true},{"proRegTxHash": "7f64bab72c121b345ae7cb56692d815ff0233d1f4837fb95dcd50291d4e910dd", "confirmedHash": "beae829de12b4541bb5f7b1b56c3112bba87218693a3409e0200000000000000", "service": "00000000000000000000ffff44b7b2f4", "pubKeyOperator": "8fe87a428eb924d06602a4690e49304843bf5c24459f6dd50faf587f93e6b4785bdcfcda48754c787f0339796df8e6d8", "votingAddress": "4WstnK7GkRWE9THEttP1z8ncBvBf", "isValid": false},{"proRegTxHash": "6222eebff4944f12cdc73a74a4d774961db61cf8bef5559307a18bdaf4f67147", "confirmedHash": "938b9267a8797eef53318eee82daf4f03a3fdbc68b31f05b0300000000000000", "service": "00000000000000000000ffff9df542f9", "pubKeyOperator": "076a1d6aa885ac0a312e25b5dca83d6e03aa79cbd9e79bc9cfb77e05abcfc34ab8a778aec2ec812257064504fd9ce4c7", "votingAddress": "22qrZs4NJE5x9f2akvXmyGVTVePL", "isValid": true},{"proRegTxHash": "3cae2c4152c650396eccbede8c3fa9594855a753a2e1a7947067af7c63262d64", "confirmedHash": "79cb39cf897e24a65d55df4fa831110cb638bacf3c7510a42c00000000000000", "service": "00000000000000000000ffff453d6bd3", "pubKeyOperator": "8d9c49c673b8a295e668af0d77e9f9b95231a1732d784869fdb02602eb210fed53e7061d4ae909493a3e9b3b8c41c01e", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "b8127a3ed32c3322626ac069f0b86c0c221f98350754129796133c0a93b38313", "confirmedHash": "55c0ca77c9cdec9f6efad6566e5914f881435ac8152069af0700000000000000", "service": "00000000000000000000ffff55d1f24e", "pubKeyOperator": "0524ee2bf5f1c465708b1888fead930d0e5e87025b33286d8cc0561a02d7b010f3bb3e60037895240a1f92dbf6467c91", "votingAddress": "2E2TphsqVjBZ5onFdJZerfitFTrz", "isValid": false},{"proRegTxHash": "d6fea0675bc5aa9cb6a4b33f20c6ffd8ce3d5a86143c443a0822e2b9b22720cd", "confirmedHash": "089f43e4b31161cdd6e167a44000c40bf8042b184c335cd52900000000000000", "service": "00000000000000000000ffff9fcb00bf", "pubKeyOperator": "1892abcd14b73cd9d8bc9922f2bbb1ff1073c84d27cec49bf53bb5c8a8bbc32c3179011ab9c7551d1548baeff23bf079", "votingAddress": "sCduQxB5TpXjTrW2kudySbfnqD7", "isValid": false},{"proRegTxHash": "f39db6659488d079ad1268b9350ab7822d0b837f5d79306fb58ef33c82733611", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6d747", "pubKeyOperator": "85ad14e96d0397bdfd2d654c4ad56dc39027ee946501d6ff66e4981d75a59d9bed8dc04ab79a320a4ed8c8cf2120e2c2", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "4498b6c815057319b846e5e6ac645e0cd8945a50d21e4dd262a4f43fc741be89", "confirmedHash": "69d9e9003c1193e74ff2e13604950c83d171c99c76624b3e0900000000000000", "service": "00000000000000000000ffffc28755df", "pubKeyOperator": "05d648843d98dd640821baaeae3a2a02af241dd0e7b84ef4d07b5e6eeeadb5cee0d3be8a9b67f5fa92744796077d6a53", "votingAddress": "3YdNQTh2SzKytwDbQkG5ioV3zFy4", "isValid": true},{"proRegTxHash": "fffb1e4d4c4184b797aa06ca817df7c2474509fd3e5b100556bb3f33f2527baf", "confirmedHash": "9fc048af1f552101fbf2666384c0294b252a1ceda05c4d9c1300000000000000", "service": "00000000000000000000ffff64184efb", "pubKeyOperator": "8f8097c423ad5bccc3d631bf518a1f28ff60b31841e3c7b0d44e578f94d33b96b9fb485e1690b72608423f3e926ac8c7", "votingAddress": "2UJtLrigWnBYh6DJUJpqWdjVZqvV", "isValid": true},{"proRegTxHash": "6353ba32493d8c1938c23dedb6bd98c7ccc8d5e75ee34f9cddb47c4f2c16675b", "confirmedHash": "f8bcb94ca0d3f4726ceccfc9c891713c192adf1ec64de6d40a00000000000000", "service": "00000000000000000000ffff90ca5f12", "pubKeyOperator": "1115e533c0dea77e10cb463f35a34fe653c1676f4a201abb029ff7801095735fb5d5730d3231d444205947e400f47eb2", "votingAddress": "qcyeZzG7VyqdbHAdYuqJkMnrycH", "isValid": true},{"proRegTxHash": "fb1f37866314d1cb069095cfdad2e6731d23fe795a50b61fb9e77d81c785cf95", "confirmedHash": "cba6abfb3e07e7c0d4799aac5b5ee18e58cef668b510c1182600000000000000", "service": "00000000000000000000ffff55d1f1a7", "pubKeyOperator": "836187d7b4f467a7a4cdbcc621bced9777c22fddd17015a8226cfdb1ecd4f89bba333bf4076a70d9b6de550bdf425b0c", "votingAddress": "36EQ8ZqDPxfq31JMESX7nWVQgetV", "isValid": true},{"proRegTxHash": "faa56dedcc0ed1912ea7f9c0c5b09fac9c5ba73172fcae4769ac475bae90c0d6", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff968897b9", "pubKeyOperator": "043e742f9fb2555cd4eb9c89cac9f3de6be40348186b19fefee049ed4e3de268dee7da06086c5e3d74d72ea9a125eedd", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "b7c3b7824d3e08749d1be5a99c207bd42a1d471508383597a5a23be02cb7018d", "confirmedHash": "40155ff704d511d70f5b8b3c907ec547acf8365a719edc681a00000000000000", "service": "00000000000000000000ffff55d1f180", "pubKeyOperator": "0f11500f1efaa5513e67174154df63a7aa7e79cc945ed7f5ef6fab03e834f42cb8fb473ca5686c6e70880ec34c7c012e", "votingAddress": "3P3kQA23BQjW3cAo96cCZ4WRKvkV", "isValid": false},{"proRegTxHash": "ec480cdac2a7371b2413950192d8b9486160609ac8ab8ba269eeddef5bd1fa06", "confirmedHash": "c2b5efa4c80cbe1c1bb2b84d4336fd4266bcf518102e1b671200000000000000", "service": "00000000000000000000ffff2e6591a1", "pubKeyOperator": "924ca0b525be99e73f210ca0c802139b3d1faf79e5781583aa82c6608e29d681da30b830ea0dfc584b695450a8f07ad2", "votingAddress": "3hsvC1LY3UQpwiP46ea1rQVBdheL", "isValid": false},{"proRegTxHash": "3c012fccfae6df3c00da68e07dc69c2378b165e2dd74773d57a2430bf007cf54", "confirmedHash": "06526f0d1be1241cd22a37e03e17ddf4f73a839aaded90872e00000000000000", "service": "00000000000000000000ffff44b72457", "pubKeyOperator": "995dc0aed6a30b13e5c0e5c238ab7e28759bf1666a8754c50f13286600b8ad872ee5a7f5daebccaea9f81b8e7ee18d7f", "votingAddress": "sceEK9UpixxUoXaEzFJh16GNE4J", "isValid": true},{"proRegTxHash": "866ce85709a1203c1c7bc64374a5753452543e110b95ccde2cbaa569e577567e", "confirmedHash": "9de63ffc5cc4b7e774efd8f279873a05a8d97738ce9026b30800000000000000", "service": "00000000000000000000ffff5fd86d86", "pubKeyOperator": "0f29cc50c304445f746daf284b985b85ea51570757e1a45bed0c2cbdcdb865453f05eb474cf0445f4e2e0c85b34efc24", "votingAddress": "3xhgoMBAWPCWqREeeeevvVNRHTmR", "isValid": true},{"proRegTxHash": "cc9fda7764004877bd332a552b7dc5ddef1011d6d45ee9d8924fa972b8b6f200", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b09b", "pubKeyOperator": "19ca46b2ee631b735c7684c80b1070c71e36a2a181c76780bf79e64de0c866657601d900005753caa71884e57943b9af", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "b2519a2165ac9856655edd0466419a0482208c34df883f7c8f75b1e4eb233cd3", "confirmedHash": "4d07fafc641840ecd726017a0fba6370c7ada3274e6a34b40900000000000000", "service": "00000000000000000000ffffb07b39d7", "pubKeyOperator": "14d911cba663ca942de47cf3b0e482def94e7bb2bb4077643cb12bc9598cad477c306199a56fb7e6d9edbce693bce1f5", "votingAddress": "2aGQzptxnxY43ZaWJVJ8u9swXqXU", "isValid": true},{"proRegTxHash": "e3a44ddcea7e1b1126a00db9f6857132daa126c899b3051205feea201ef315df", "confirmedHash": "deea24e962fac02cf223dd40dd3f1d84e4375d0d51276cb70500000000000000", "service": "00000000000000000000ffffa877578e", "pubKeyOperator": "97fa308b2dc7974c408a78cbd7cba0f6bf6410718ea19e60b7e826391324184cc4878598707773639ebcea330ede8137", "votingAddress": "vFZzLrVguVF2mXcksBK2iPBFQ8L", "isValid": true},{"proRegTxHash": "8fba1cfae793bf64c6eab40fd8ec53eebe93064cd3dc734a94eccd1df4509dee", "confirmedHash": "f95d58e237f90d5bf906336283b059e02687a467f1ce27b71a00000000000000", "service": "00000000000000000000ffff5fd9a041", "pubKeyOperator": "93be51339f5d94ee76b02e2bec0d390555836a0c456b1724710107d5910648e960d4462743ac57417d995ade8d8b8be2", "votingAddress": "2Gpu5JjJU1Kbvd9CMjBhfAXfTQBD", "isValid": false},{"proRegTxHash": "f360636dde6cdd371d90cd4385968a3a03582f8f2c4f825271cc3b631219c1ff", "confirmedHash": "ada66f1d4116adaac681dd6be7a782d0ce392a6376e94ac92400000000000000", "service": "00000000000000000000ffff68ee9e1f", "pubKeyOperator": "038414dd91ee6c3036b491d3d84d3aa7f998ac25644715f972e7ab06877670165e6d5d3b013faff354a23ca0d193141b", "votingAddress": "21vJNQEDZCm6QoZbJswqNdhXXeMC", "isValid": true},{"proRegTxHash": "cc0bcd3338de4f4768a72482fe1f41ef3f128bf798f2031b1364f4953de84bf2", "confirmedHash": "6a3ded3b20b98d15395610cedb3ac176a4d17f51c740436a0600000000000000", "service": "00000000000000000000ffffb23f7993", "pubKeyOperator": "05d0d21b347b8350a6d9dda539790ea91dd128dc8cbe2b45af51c023b4e7d8b8e31b9f06028fcd98a1451831015d0b29", "votingAddress": "3ZBbzzABdD4GefCANEmtyhrPudxH", "isValid": true},{"proRegTxHash": "9e7c18b1d82c270936da87c2f5501df1db3fe3f087acdb80d421d519985397d2", "confirmedHash": "a8f1e9a9d42e3af5bc29f9263d61fc554cfd8208f8e38a311200000000000000", "service": "00000000000000000000ffff50d1e932", "pubKeyOperator": "8b3db9077dddb7d7950fef38e5e43f88881051668d96e65267b821afa41cce9cec545685b4b0558ea7ce4f19a69a8a6b", "votingAddress": "22RBDjFWEk7NjTeieKkCPFcSK9rC", "isValid": false},{"proRegTxHash": "f3ec8c9cc4ecb1fa3559e21d94eb50f4a0b3a95dcc21a6f6eb0de499e8a6c27e", "confirmedHash": "dc560d2e0da95659ba2b9b3a66f78af86639f76a6ab4c2bd0800000000000000", "service": "00000000000000000000ffff88f31dc3", "pubKeyOperator": "8918be5c7c8814a658c44bea6864d19c60b22f58cef6dcbb13ebeff07ae4a0ff8cb7511ca708a855e9e9e5974f704ef8", "votingAddress": "3NsiLMVSu8VpTRcyNUrZ2NK5rRep", "isValid": true},{"proRegTxHash": "7c9a449fe5d5e8cbc0d8ef6a509ee6cc3e13ff81ee8de1089c8eceeca173123b", "confirmedHash": "ba55cb4616d8414644fa469951f136092282262cf02dc48a2400000000000000", "service": "00000000000000000000ffff9f41c604", "pubKeyOperator": "1543fcd8129a1d7d84707aeaad034d0653c23829cb130ad51abb305cbb6438cefe2d9068cbe1d3fec0d6d5742d8e8961", "votingAddress": "339bZ51HtirLw45qBLiaG3Fuoz3K", "isValid": true},{"proRegTxHash": "996cdfd3461dabe6cc28c90e6637a04f0377b5e5558a12168875adb36f9c01e8", "confirmedHash": "8168b3ad5d59fd1fda68340a2cbaf9d24f6a8cfc01997b5e0400000000000000", "service": "00000000000000000000ffff2d207c80", "pubKeyOperator": "815e9ff86d1b057931b695a7950daaf1859b7f20a2330be8d41be0819e45f213df07c71fe3aa0b18e44fa2c907300ada", "votingAddress": "2u5i47puSZnzUp4hFg83UqQNfQge", "isValid": false},{"proRegTxHash": "0bd490e50c0d4e9362ddd138290edd0de34d2be34c18b4e89bd468474ed8cee6", "confirmedHash": "f958c5510aa21abf608ad2fd5da8fb48f79b424951cc1ded0800000000000000", "service": "00000000000000000000ffff5fd985aa", "pubKeyOperator": "80953f9f4970e0d93d871a4e81b1848d1f4774624092ea1aedd22f91517bf14031257e2dbd66ee6d022b587baa21b52b", "votingAddress": "hmF3CZZvyTLVVP79czy9RYxeVEa", "isValid": true},{"proRegTxHash": "1a6d84085a4656f99e2a2de0fae336aeec574c0e226b79b5c92225ec4a865306", "confirmedHash": "7bb58de830bb7849b7e9f2886d0c81fa9c35e4728437fddb2f00000000000000", "service": "00000000000000000000ffff2d4d0f21", "pubKeyOperator": "91ff2270b496261b8b98cec7e539ddd9c80a40012b5ee95879d3370e5b3f2d1ab4cfe9f5cb39c7c58d3ef5bb8111fde8", "votingAddress": "475xm3iTofqehxBEXEFmdJvZMgNg", "isValid": true},{"proRegTxHash": "e8cb4e5990ed76efae830538b4387efce7fd67802a4ccf3e6fdb23a6ccbb67ee", "confirmedHash": "bc9b39db19d983ab874dd93272e8700545f3034f330b28bc1a00000000000000", "service": "00000000000000000000ffffa763bd0c", "pubKeyOperator": "95325ca37c3faedbc11f2bfd772069e2a757f5e45dcd376a187cb461ce4609c5545253df78bf033c908c80f650594ea0", "votingAddress": "wcwj65CfShW7SXHpRMNGK5AGUX2", "isValid": true},{"proRegTxHash": "a3bb6091ba0f441d4939e01f05013c99d38e2e384d6059228d43f1ad2865be58", "confirmedHash": "d60a5882deff2062abbe5bbcd43d25581ef685c56881fccf0e00000000000000", "service": "00000000000000000000ffff951c1984", "pubKeyOperator": "965b070145fd09b66f7b4e7a8144ae5db80f1c22cbe43de23131a4ccc3cf7631cef1cdf95502b8225edab6b040e2e4bd", "votingAddress": "4739FWRKdVGv6mW6HG9GWxwfkNSL", "isValid": true},{"proRegTxHash": "5947e3ade9f83db22e4292741aabbb89dc801443913db23451be5dce0a3f7a66", "confirmedHash": "c93c0db762d33e7d9ccd1e7029b57440cedf3816bcb0273b0a00000000000000", "service": "00000000000000000000ffffbca6a1ec", "pubKeyOperator": "8b39813c08ee55ae426fd8117a648a0726971937a97d7a202948929816abc6c651973abd7eab5774574efb5be8b2e49d", "votingAddress": "3dXY1iyXTks7hoY4NRto6a2Gf4dN", "isValid": false},{"proRegTxHash": "a56c2aa1e82b30dd361bc9e64a566c4b100be017f7a31f76f351b87381c185d4", "confirmedHash": "0f07293743ffccdd1bbdfda2bf273ed2ceb2f62d7a6eb2160e00000000000000", "service": "00000000000000000000ffff179800d6", "pubKeyOperator": "0114955296802340f9f67e4dde4a6cf1b5d6f518fe09fdf61600aba3b27cc1dc36dcac48c638389f1a63f4f53171cd35", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "6353318258b4b6f7a16b9b01e4439516ab16c50a234100b8336f0b5929870a51", "confirmedHash": "601e6145d82c195fc7662679985dc885fabd2375357b0bca3000000000000000", "service": "00000000000000000000ffff23af124b", "pubKeyOperator": "0cce61077da47806b211fc9410bcedd33a3920ae337e8590167e36ae995d6a928c696bb9d26a71fe6bac12d15d9b1c82", "votingAddress": "2SoqnzBszN6tdKQXeAzDDt8k4EhH", "isValid": true},{"proRegTxHash": "c035221ce1048a1a40f761b7930964c9414bf6827d354347c2e3d8fdc23046aa", "confirmedHash": "7b02d941c2baa90a79552effc05ae78dc0e308b9c52142910800000000000000", "service": "00000000000000000000ffffa7564f3e", "pubKeyOperator": "8028848112a09b5af93334ff27bc5a7b868f8b28f8bda2e5ca9948fbee5eead2f0dc501f845ae94e8db69fe1fa652fa0", "votingAddress": "2DTEko6F2bPeYHgNFXY5XDxGNos3", "isValid": true},{"proRegTxHash": "d009dabdc4097f120210ff7aa55f581934d8699d1f4253e320ac998541ac0776", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688b0be", "pubKeyOperator": "85dd0a758fce958c6aa9065348e8f4229be30fe387e33985160c82c68f22f773ee92d3f965627645421640590ff24f8a", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "6dbeca68cf4cc98f6080eb70b168b23986ebfc754e573278ed43a93c8a2d0a67", "confirmedHash": "4ac24e873b74478c967fb18c36422565d84927594218b1d90300000000000000", "service": "00000000000000000000ffffb009d211", "pubKeyOperator": "824836d360be47f9d7eb5dd32e33a49a91e095affc5f976390fbe9cd27aacb6832c5674da01dd769eb53a91e7e22839d", "votingAddress": "4P7WzaHVu1Ws1xVN1UpZyAmBXp2R", "isValid": true},{"proRegTxHash": "394dfed61442d803b63fb59da628a75521bf10736e031e69d6d6211ce02e86c2", "confirmedHash": "a60d3ab71c1c8502209c70a62da5a320370c3c1759cfdf110700000000000000", "service": "00000000000000000000ffff4f621fda", "pubKeyOperator": "8a230be692b80a33aab4ace9ea1b2e0487890badd9dc4003d3df452cbfce9a472c9a98c49e069b43e0392832a17596a0", "votingAddress": "bq3iJDvj22t4cbzr8m8AQmXUErX", "isValid": false},{"proRegTxHash": "b20ed000b9bebbe2e4fbcea122fed24a165a202981ce448908beca2668557d39", "confirmedHash": "0af85f472932784ec1b4bd6b6077765be28d84d4b0b1bf040900000000000000", "service": "00000000000000000000ffff8ac99962", "pubKeyOperator": "98a5ec9f5ab8ad29addef07d7d4730b26827dc7166c123bb4f686a6a9c741d6a76a97f70c382f7b1a1ce0cb336527092", "votingAddress": "psYm8NcMJiJTsUD1f4r9thoyW4n", "isValid": true},{"proRegTxHash": "c8864e8c20278b26bf069821240ea9344beea9b965184fae8d80cb77b2f05ebc", "confirmedHash": "478fd5c93be6c1d1b4bbad510d1e63e9c2118724d506ce6e1300000000000000", "service": "00000000000000000000ffffbc28b481", "pubKeyOperator": "8f82ef9890b22c894c5ddfa4222cbf048b3c557cfaf869757ac4c570601851fe23632124df53879ddb72f4b6f22abca9", "votingAddress": "XVbcy18cm1nmE8uwFqcb1mUh2dC", "isValid": true},{"proRegTxHash": "a86c226501125fa810ec509068fcf684645bf2606b65b847f953c2cb15ab899f", "confirmedHash": "e39532b9932244197a08b693832457a76ee1851b0edd1ff70d00000000000000", "service": "00000000000000000000ffff2cecaaf7", "pubKeyOperator": "19e4882bcfa6db4dcc00bdb40fcc854f1ef8188570b2285fc3b348adc63196a602f54d9af0a6ce76cd97f27c607ae6d0", "votingAddress": "jx21AJJvTvmJCGFS2KNjdsjc5Xa", "isValid": true},{"proRegTxHash": "25ea5a08b150b5de70aa892e8306c62cf94d02a46883695ede7c9e9cdba95ee2", "confirmedHash": "fd6b1568e3ec897a4394cc7dfa6d81f5005b84421636fd5b0000000000000000", "service": "00000000000000000000ffff50d1e03f", "pubKeyOperator": "8c0a5c2a45599abda21deeedd1d012b9df8ea2e5b604786d6fea32f77d7964db50da34fad2200e8c87bbefb9dfb37ec6", "votingAddress": "4GiQuZbueK2UvQsoCgjGdo4JhQzy", "isValid": false},{"proRegTxHash": "078d98da88f67fb020f02f103ee78640df4ca129179f7a5c849424b7945e96f8", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688e1d7", "pubKeyOperator": "0edfd6b70b20aff9663cfbb06cd211d8fa9c09c80f79e52aa1ee3660893a4c701d8c298ce9cf291515382ae30fc5e419", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "6add8c3b259259416c89196e1f4b236727826d9c8d0bc843b1ad1714f006de84", "confirmedHash": "bfa79b0e7e94d9cb04aa82a74f7083b6cd1227ed40db86501400000000000000", "service": "00000000000000000000ffff80c72686", "pubKeyOperator": "0e11c28093fb02ed98ac4df3944b2b25102c3b8ce85e6908edceda4abc558ce4ab76b773776d5889f2dd8cd43b2a1d24", "votingAddress": "3bUDe9DcaVVjt8HVyWfF9Vn8QEfV", "isValid": true},{"proRegTxHash": "4dc6835769e7f5242cb4b29b24036c7dd7e83bf50f4975edb60a11a5c6ee4208", "confirmedHash": "b842bf6e76d8029c5466ac745334ee024820d345e48820322a00000000000000", "service": "00000000000000000000ffff55d1f143", "pubKeyOperator": "0ad5a3f7a1fa7b6de79958bd97449f7d1f4de19b7c3e122349c3bb79b3609b4779954cad8b5b5092a96db59702063fd5", "votingAddress": "3LitsUoj1DCsZpKaPhL9Ltm5dtRS", "isValid": true},{"proRegTxHash": "fc8b26852af348642c9e0b369518dafaf2836d22fec3ea388402c26c88beb40e", "confirmedHash": "0e31529a6dcc0d3ff657dfbe0e5554bf61a8114caf90f69e0000000000000000", "service": "00000000000000000000ffffa7632ab5", "pubKeyOperator": "154e843d63c26a854dec9b47d8ba75fc38d4e9cd2f1472cf7c37789414749af8555e64d7bef2502f1fe4fc3a35c89be7", "votingAddress": "3tYoEEj7gitxc6cQwxS6s8GeSLHV", "isValid": true},{"proRegTxHash": "e6e9b72419080c3337870b7faf0a8adf5679c4a6b8e1a03eb1c00f8680bd04c1", "confirmedHash": "4a380d4f4f9530227e7417a4cdd6cdf1d2c5706ac22436540900000000000000", "service": "00000000000000000000ffff55d1f20e", "pubKeyOperator": "85b8d6ef90f26bb4bd34e8c33bf3072b717adac558803ae2170e54a5f1c053bb13f28dd1942213fd7717479e24264f8f", "votingAddress": "3pTMGeZfjZbdAu2cmrdztiucfsCm", "isValid": true},{"proRegTxHash": "7d09601eae66f963be6e357c05ab2205ad4ca1b41d48bbaedb331d247514d1f0", "confirmedHash": "0f45057180ebad4b73fbdb7c849c44734faf90dcff0d06291800000000000000", "service": "00000000000000000000ffff58630b08", "pubKeyOperator": "8002c5969e474dea5e48d1ca8babe9127649f3ee26c0317d80de247b02c451df3c8b6ee054c4ac71635e55bcbb832e3b", "votingAddress": "j3uGUCVKCy56xPTTG11UExXf8LR", "isValid": false},{"proRegTxHash": "4d294cedb88725e803846d29b2004b11c11a4b8ad0b6a98de344514d62be7f2c", "confirmedHash": "26c936503c70f635f78d0ccd98be52ddface800b190c66442200000000000000", "service": "00000000000000000000ffff0238d45d", "pubKeyOperator": "110fb6e27a9dc136619c138a22d9d3821f4ed10955936801744ec325e2d0c4eeb2048ddf403b34399eeae26ec889dd32", "votingAddress": "3WcQCgGkpsWgmLSFyJrMbubCWhC6", "isValid": true},{"proRegTxHash": "cdf8687309e6471bc962d97b26dbd3e2e431859e8bb2691a8f3377ff1923f723", "confirmedHash": "8bf5ae495ba24b16acd899b090c9cdf39ff7c8a8cb8744fb0300000000000000", "service": "00000000000000000000ffffd8bd932d", "pubKeyOperator": "14cc707e20d4ea6ec5b1de796a53e5d6dc7b8047a6a253c74430c61dc8a34d6f880a91a4be10ea4989e6accf50443eb7", "votingAddress": "4JTyVg4JGNhyZFsp1SxNZK4iKSoY", "isValid": false},{"proRegTxHash": "6cdd62b5e1f6fb86a6fe59635469546d8b6436c5f38c95fbc7b9ce82903d74cf", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0ad", "pubKeyOperator": "958f335c5dd5d0f59362a04c16c31f8caf717930d3eda1c13971b05e26fe8c51713532f9e37f2d35c271e94bdf9e0734", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "4f8c151f7b1e855ff6263505f4682d0d73575837d35de0d306057af2bb1281c9", "confirmedHash": "2dda4425ca27af1f422983224c33f91c770c2f800359b0a33a00000000000000", "service": "00000000000000000000ffff58c66bf3", "pubKeyOperator": "0666e1cc4759c01564c2be71677d1c1597ff877d39d1d4a29bd3b0fe8a8e224004ef40270d2f4d7b8879b00f30e35969", "votingAddress": "jD3T3jsX8zzqArrQMRv7JcT3rLG", "isValid": true},{"proRegTxHash": "62c5b4770801001a5e2f26981280087d6ceb1c82d6da5ef44589af94605047c0", "confirmedHash": "dab715aae3b97199e6d3dbdc3eb97788e92fb3707474819d0d00000000000000", "service": "00000000000000000000ffff5eb0ec14", "pubKeyOperator": "847944e6d22048898b7565d0467d0160aba93a0ca3c12ab389d4abbf9d7673a5491d7e4eca5147be9537ac86d79e2cb0", "votingAddress": "3YDviCZ3Wzngex1XSUmLBqLgxpXb", "isValid": false},{"proRegTxHash": "24b040ba667d8370d0f66265dc636796da4352ed77b84399dd2d95aaefc87e33", "confirmedHash": "f512ae6b54cd16a361b2d6c465316863d8d405bd1893adc11400000000000000", "service": "00000000000000000000ffff2d56a29a", "pubKeyOperator": "92c8c06c8244dbf098d6994d4ebfea5144c08b9b9a7752e225128e1d70c47bc4f6dccd3c235c16da54914ba11276ff96", "votingAddress": "2Kx44or39sc3We69cLeSCohpEvc7", "isValid": true},{"proRegTxHash": "cbecbcd219d856ab2afb5289a3f60407cd100e8b9e340728e9477c70c507b2f8", "confirmedHash": "164aa229770a66fa4efc368462c15dfc806719704d23f5fb0900000000000000", "service": "00000000000000000000ffff92b99a7e", "pubKeyOperator": "0d50185ee48e24145ad7090cd288e01fdd94b2b85a1543d6ade1b3a8331feb9bbaf0666e2017f9365ca509ce4cd9e38f", "votingAddress": "4TokTFUvJoojWuB6sqNvxjHmwB8R", "isValid": true},{"proRegTxHash": "986fb41129f1ba8d76fcbafd1f9b4eb472a1b199184a3f1b8b75faed7bbbc8fb", "confirmedHash": "f8cf813c9973b6ef05eb5782f7edc07440266677470ce5451300000000000000", "service": "00000000000000000000ffff52d31507", "pubKeyOperator": "156ddf23707994509b9a544e503d396440b8a7f45749bf8d2d02ced744b2a47f188844d284ba1a15cc18372bb564e314", "votingAddress": "kyMyjuzTVSxYrXASH3v4Lkvmk1M", "isValid": true},{"proRegTxHash": "0ae2c6ebc3303b45b4bea24fc846d7df29cba00b8c2f363fd223598701d2b98b", "confirmedHash": "d7e4e3a543881de246bccb327d2398f98449fb22505c13da0f00000000000000", "service": "00000000000000000000ffffb280dff1", "pubKeyOperator": "9362cc23d7b0eeb9269476fe525995f1b9a4dad8483979475ba800a6adbb1237cfee8015aaa9f63044b1591e075a04ff", "votingAddress": "4U7YF4bJiiRrwZRM5eSdHh6CjXoF", "isValid": true},{"proRegTxHash": "85e150a2b19ae9d21e31405b017f1345ad9250a061a4ba0624e869fc037cfbd0", "confirmedHash": "58233a675d86acf7f39d8b5b39747eec4671dc662c6529c30000000000000000", "service": "00000000000000000000ffff68f88acc", "pubKeyOperator": "8104a0c7a9924a716b96640ed40e54065c1aa1b04e8f9a7f85a0a8654e722de8fb1e4ae3736c9be84f8be5699e21f677", "votingAddress": "CKpoYuti6xGxkLVr97d5xX5Ub7U", "isValid": true},{"proRegTxHash": "a6d200cdc5bfc82b2cf13000f9b433bef4e29e8789ed7912b1a8035d2db629b1", "confirmedHash": "cdd3539940e9a3c9bd86855bf6ab39bdac7246ee33b86afb0e00000000000000", "service": "00000000000000000000ffffb95cdc8a", "pubKeyOperator": "02e3463c341e16bc8237e15889a3fc82b69118acf13e44f706ec909a177acea3199ccdce496fdced6a2e363d0267dc9e", "votingAddress": "AKbZZA632MFmUCGdMYNW1Rd4XZr", "isValid": false},{"proRegTxHash": "adc54ea371307a8a74819a4f27075e64968aafb80807842b2ff2a13adf03c39c", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff343cd2aa", "pubKeyOperator": "837532fbc77f37e87615d0667aea3b91f6955b5081532733cedcbb7e7659dc5eb2ab74f66f5edb5b81ea3b31bf9de40c", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "c48e7a98d792d997ecc54165520ed0cf120f35e903c2cb2d7b8f1ccbec6582d4", "confirmedHash": "cac1de0a8ffa1c750ff892ac848c2e583fd528e40cd3b2360000000000000000", "service": "00000000000000000000ffff2e04a260", "pubKeyOperator": "999d132539c6918859ad505969ee740a268ee42008bfeccc441c41f06f384880dbc0992739ea7cb71d56b233790aedd7", "votingAddress": "3XakCgotbpncXCXfefti3ZcXCsPZ", "isValid": true},{"proRegTxHash": "5f4e4a55b9b5005c2653702dba02a62013b64b2e5940b27e2cc70b69e427d1a4", "confirmedHash": "7bff4f371c94a24bc8bd45d996e8e1e504972248543b91fb3500000000000000", "service": "00000000000000000000ffff5fd97d61", "pubKeyOperator": "0697b4c9d141bd48173f029cdec979c03f96e38916918cb147f0d219fba6d9c2d347940076fa359b19044d9b93c50298", "votingAddress": "6tjmaY5BP45kqhGhmNyLWcEb5VA", "isValid": true},{"proRegTxHash": "2353faa6151894845becc3da378d60d49a0460ee25088465858ba68cc390d583", "confirmedHash": "f22f9890b9dfe1ac18173ca1e72721a3d3726f412cd104d92300000000000000", "service": "00000000000000000000ffff2f6ec51d", "pubKeyOperator": "0562532fa0497079bc0a858df816a6315cd58d36d13cc2777307d764b8cf6f4c5ca8ca803193a52a4596a468c74a77b3", "votingAddress": "KYDKPkMkD2CyMJYdKeAeHDR9eSX", "isValid": false},{"proRegTxHash": "b9a403a77b7c7acb2bd7b204dea1c98d664067aec1d8986774564b320201287e", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff8491c912", "pubKeyOperator": "8e8cd9050e8fc58aefd538ee0690049033f2a80a95ef36fa8fc41b57f2e5a03ddcb4a7ffa70839bffb370b86085a1ad0", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "8f945fce534b71dd431fee9e9dc29670bef87fd8c86298fa803c47bb2887ad4c", "confirmedHash": "68100529972aa198fc8ab479241afdefd5eef7aaeaa9537c0700000000000000", "service": "00000000000000000000ffffa2f5d8d1", "pubKeyOperator": "91e6be78a4ac75dfbbd4e02a5e1e75b67c6a00c6757522fa30563606698295fec402c9031424f5d1fae829aaec77d139", "votingAddress": "4HygP9pCekYjks2eArUPkxSPqzYj", "isValid": false},{"proRegTxHash": "c076d7154e3a4ac1c84befd82ee3b2582a8c35135e415736af77ea5b1a48d92f", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6d7ff", "pubKeyOperator": "14a1afe3f5367e9b007f004668385f981844af7ab105b33293e5aef00277c03e447034b5472dddf2207640d42a502467", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "3b18f41bada2f23dd0666328c8ea5759022888232da785d3979fcf80f9d00ab4", "confirmedHash": "9e18b4c3fd7248643d3f9c74594090fede326d084b9b55e40800000000000000", "service": "00000000000000000000ffff341a8748", "pubKeyOperator": "01d10492093eb50a085af1eafbe60bcd97d626ec6a6eab0b09fe76bb3118507ffb554e4b1720c4a98c2de13dd235a020", "votingAddress": "3wubdUX23NmvrijNSSqvsbdYeR8P", "isValid": true},{"proRegTxHash": "8724fd587ef2534a806004b3c552afa0c34cd8b7f091d923e466458e0a6a522a", "confirmedHash": "3c7d553d0d5d8b122b2704124f08b8ba7e9241022b90db400000000000000000", "service": "00000000000000000000ffff8ac5a478", "pubKeyOperator": "9448860253791aa67094e92c9e7a85c12f6f59a9ce689bd37bce9c20ae618658a496484cd07a7e1c79c4728fa983621d", "votingAddress": "3dV4e2gEFvnkRW2DeYuL1S2wzRsK", "isValid": false},{"proRegTxHash": "1d8c32ccf3dab98f0f7da6d51f7c4f5b3a45e994c4e04d2d0ac8bba54e66149e", "confirmedHash": "a8b19aa14d697f8f5259100cc4fec4118a77dffa8c6bfde32100000000000000", "service": "00000000000000000000ffffa8775009", "pubKeyOperator": "85b29951c7b78191e7361494b579188e02c02f80109baf06ba140249c331c28123e67ba122b44a5c7082316ae9e0aaaf", "votingAddress": "3cQxhih6WeKeuM8uFtcuMJEHwbqd", "isValid": true},{"proRegTxHash": "a2fbcc28d9e4abc94d84f3e03e4bdae5ba2b66560674c5ac5b81fcbdcfd037ae", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d56069", "pubKeyOperator": "12e53b9b0f93bdac4d25e78fb5610aa4a10d12906586b1e162598a31718af93d015162ed7bb1d21daab9aa85e164afd1", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "cce91d755b5aa5a8e93495efabef5772fb749b06f2c02380ae5c2e7d1de85cf1", "confirmedHash": "c33eeb3d92455c61f8eec72f33cfa3bb2f1f9023cd1466482f00000000000000", "service": "00000000000000000000ffff2d99ba64", "pubKeyOperator": "0fa657db0b8a05ca9980898e94d7e3a2e4b044918af5a139781417b4db7b470dd6fb6c4ff26978f4730993de9804c85b", "votingAddress": "2ScMaVnCyGDSXtcY1AKPiXjRd57z", "isValid": true},{"proRegTxHash": "a79e5ce2b959c4ee5b2bad7c1897da317d5f0d2d9669c952c1415a720db50460", "confirmedHash": "02480155e7acf82afa5eae3263f0d683dc1a85b1712e29c22600000000000000", "service": "00000000000000000000ffff52d3199d", "pubKeyOperator": "11892259faa5fd0a6e7a60e4e9b922081a338c28bffe9b9546af8cdda29b05d933f20fb8dcf48e2e50478c54ec02b1c3", "votingAddress": "3RpeNnqmYX8b4ti9fWECPvrWuoBh", "isValid": true},{"proRegTxHash": "9c67e114d30586d76c09de32f7155554a4c564777274b252463cbbaa7a85dc0c", "confirmedHash": "3071d1f893d5f8daa7b7dd9d7aa51cdba7e38834ec9a23ad3700000000000000", "service": "00000000000000000000ffffd4186827", "pubKeyOperator": "1096dcd0d7678f2fcf94ac87b3d535849d607fa2042b066c97303e81f3adb3a9fa660b26d1b993a319e28802aef1b895", "votingAddress": "F3mk6rjqKxCA1EvHbQwp5LaFJPv", "isValid": true},{"proRegTxHash": "62a53d165ec13bcfbe87c220f0cd3584dfdc71c5b7896a36273aae47860bd8a1", "confirmedHash": "eee41e1d66b0a6363ab6d8bad75b65fc4a790dd398c812ea1500000000000000", "service": "00000000000000000000ffff2e04d9ed", "pubKeyOperator": "82b481578bdfed7dc7f5c95f25f93c0462342ceb3e9f0d9f74a1f99c57ec53529ba6d21bb99d5baf395facd92bfc361b", "votingAddress": "GvpeqLypR7ma6cgzTJt6SLG6Jf2", "isValid": true},{"proRegTxHash": "e6ef61625aab4c7ed4e45a4619e939651a8823b1f2b8cf90b8ee4480085e67b2", "confirmedHash": "9173177a2174d0c2c9349acc4b26adf9cfe1ace1c1150d4a0e00000000000000", "service": "00000000000000000000ffff88f37388", "pubKeyOperator": "83c8a71347921096a86254804ee8c899d1ab964aa5ba0330f65d6eb93755a5f07148cc9e213f57e11563ef7ff06db642", "votingAddress": "2aG2TiY4nPnAo7VTMedbouhUTBYH", "isValid": true},{"proRegTxHash": "4ded06f783634f11316839b1ee2fb96b78a2bba5ab649cc9dbd028a4c9d49e61", "confirmedHash": "584636afbae66d53f15a9af4bf5cfbfd33fb46daf4a75b590c00000000000000", "service": "00000000000000000000ffff258b0b57", "pubKeyOperator": "944b04e280eca3170d5b62253df16ee2cbd90dffc3ebb581fff7ca765663f619989dff2188fbebdc804da7a93eb31e48", "votingAddress": "2khTWZoKWH2RW8j5CmPsUCxfm3SZ", "isValid": true},{"proRegTxHash": "7704345c0c5ee9f05adca8d92e657d9c654299709328ad832566b44aee248915", "confirmedHash": "7bb58de830bb7849b7e9f2886d0c81fa9c35e4728437fddb2f00000000000000", "service": "00000000000000000000ffff5fd88d94", "pubKeyOperator": "893c4eb6f038140fe0a0e3715a18e386a54c1ac58fb9478054a0f4297af72bf774e925acee99733c7c101183d504c5a6", "votingAddress": "3nvGdW5eTcxk25jjoNRNh919Zacp", "isValid": true},{"proRegTxHash": "6342e2b3e0e71f4dda149609e7d8c96b255c66ef1a9e1d70655afcc646d7f531", "confirmedHash": "74c1e0a44a431831ca7a6f4ec65c5da591081c00f51907bb0300000000000000", "service": "00000000000000000000ffff92b9a35b", "pubKeyOperator": "850b054e9d20729f96beed3724d30d3a323fbf01eca1a1742c3f3066548ab94670b671347e20a4a419409ba6c2f27ec1", "votingAddress": "4BSNvj8yZBKGSoxF7DePcXeQABkH", "isValid": true},{"proRegTxHash": "f6b134bcc3d68c64414dae749d75f203233365d66cbd11395631172b858e3d79", "confirmedHash": "a67e44ae9ade671df28b3f486f240af120caaa065be956780200000000000000", "service": "00000000000000000000ffff8fc62ba8", "pubKeyOperator": "8474139725c4627f2f0c47e20af6d8926216a21da0d4d9c7e898665d5e378e86b215284de9c9d25d98845131668c810a", "votingAddress": "je5q1H6goVUFpi21REyyFu6pe1h", "isValid": true},{"proRegTxHash": "c19f7f1f81c17b042d334c25b4f50204f2256c6f70a5de93e365ca3fab138de8", "confirmedHash": "4611b050e9fd3800c494445b88992e330891ef79b3c535e72700000000000000", "service": "00000000000000000000ffff52d31520", "pubKeyOperator": "9676aadf1bf29bbb705ddbabfe6813d5def89e8e8d2735c4f95864e942e2b46fbb55885bf5aa2bccca9b7d54ac39c510", "votingAddress": "47iqpnmBr7XFgJrKRwZaKbd2eEoB", "isValid": true},{"proRegTxHash": "6b8423d7b15e651bf1854149c63384dc26b9c2de02370ad57e5c832605b24a1a", "confirmedHash": "a00a795b305289dbfeeb8c945c0d7e7feb84270b1865a5570a00000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "4U1evmiitWvFEobDHkTCRjYzBrUQ", "isValid": false},{"proRegTxHash": "f5c920a61833f1098cfc503150a6cc043611a446ba07c4d2b5f00d0478b7c326", "confirmedHash": "2ad54c140e221735fb05c0a71843f49ece6852202c79be5a1f00000000000000", "service": "00000000000000000000ffffd41862a0", "pubKeyOperator": "0dd178dc2bcd994f11e29a7d23a7d4e9b6bb852517a316e37a3e5187f8b58784db5c2a68219598054da5c0b3ae8d5337", "votingAddress": "3mjTgdpnLQaWubNnvbkwCNrLjZpy", "isValid": true},{"proRegTxHash": "2aa5ff0eecd5432967b443111b003bc3ca3f072caf09b786458b5c2c57edd8ad", "confirmedHash": "a1e6a81c221aed68d0e640d6581eb47941aef0a4afbbaca63100000000000000", "service": "00000000000000000000ffff52d319a7", "pubKeyOperator": "93dff5c9562913643ddd819960e2e20014f8cf5fc8a006f2e970e6b884b297de84a6d1b47724a0055a1b92ee406234e3", "votingAddress": "2RvV4mJnWWVSxibjctucZYfLkGrf", "isValid": true},{"proRegTxHash": "fe50ac20571e98ceb508c72f004e09a09a2586b05760dffe9835e5451f667ab8", "confirmedHash": "c847134417733c77d4fefe2e3f4327ebf766e442dbc7018a0200000000000000", "service": "00000000000000000000ffff8b3b29dc", "pubKeyOperator": "01ac46a75e307602f69e6d1575519bfa8c58ba87971e74af10a15c75fcab40a28609436131f1efbeda37a004a64c29b8", "votingAddress": "2UNQcrgaeDiKSwpjWU4bh8hzWiCG", "isValid": true},{"proRegTxHash": "3674bbfbcedfb2f567ff4bee945dd19075a21043486199fd03515bfdc99ddb9f", "confirmedHash": "3654d11d84dcc72154bff7a8b75b5912c4e70edd3aae35511a00000000000000", "service": "00000000000000000000ffffc28753fe", "pubKeyOperator": "9337bb13f2aabc53e50f054f4cc6abd7ba5923903eb47b49ff29ce6a1b90a917d172fd8e31b20f479b309cfaecd5f139", "votingAddress": "48pxGc2Hx9q9DB4sfnr9D4u3241w", "isValid": true},{"proRegTxHash": "f3888b9379e57057f65997f81fd90d8a1d5a996cb1c2dc9237b4e942a8e21751", "confirmedHash": "0feefcb236394c1601bba2ea9d7818f0971fbe8e7d0d56331d00000000000000", "service": "00000000000000000000ffff2d4d7ff2", "pubKeyOperator": "16fb877c4362f4b04965e8f6938f561544b3d2798567767fb23f12edf26c25cc94914aa25c9f9a86b6231acc33e06302", "votingAddress": "28uXF8VYAqzXU65XjwkdtgaZxxeF", "isValid": false},{"proRegTxHash": "4564db355ed612d0091b0fcd74d08343d743a77dbacadb8b1d72925cab2bf4d8", "confirmedHash": "41eb25b3705258852abd5844a302f8bf2abdd35ba9e124e50f00000000000000", "service": "00000000000000000000ffffbca69c3a", "pubKeyOperator": "8549db09c96c9130536d179a35f3e055d5b717606225597df5c5543197aa282b9f7253d3999935ad39e7201a1010f905", "votingAddress": "XPdwWSZ8HSLvT8LdjNq8in8MMqm", "isValid": false},{"proRegTxHash": "3f1b84fb06498e2ff54cb9d2b2182ffa3258674fd92e2ab29bb6251036de8fc8", "confirmedHash": "04d0aa7e2191e996084dbdf7ccdd5f752a6977f7c185b2c41e00000000000000", "service": "00000000000000000000ffff52d31535", "pubKeyOperator": "94215ef8ad5e1eab8de0314688897b772c3b4fcdb9115c1c3702fad8be017e8fff174944352edfa1a177b3f5a8e0692d", "votingAddress": "hVMVJLZJWpZf8ttGwpQL52DNouP", "isValid": true},{"proRegTxHash": "bcd3b7856e823156c8f5abcad2df4f8a8c67e3c6cdbd0c480b137563f018d620", "confirmedHash": "35fb0f4a01350e54996631d8234ae8032ea83aabd6a8b7080600000000000000", "service": "00000000000000000000ffffc3b5f39a", "pubKeyOperator": "146498df1effdc4028d4aaa0d0ce53ef3f205b940e1755f03e8e56be572264e62c2beda6cca69efe00ec3385bfd46a48", "votingAddress": "qccFmVaa7HwqCGcaUySG6Svso2p", "isValid": true},{"proRegTxHash": "54442b122a56d21e67d434b83145d4ba48b8853e85bebd70bf5dab31b37308e8", "confirmedHash": "bfb93d26c990365439d4a32b92f45fa580c0674dcaa63f170100000000000000", "service": "00000000000000000000ffff55d1f1f0", "pubKeyOperator": "81d3b795a529120c4abe4ae8abf29f29de0a5ff56bd4f3ac65f66b8179b326a4fdd2711d9992dd6aa792333954e3af69", "votingAddress": "TC9vYvKi3GgwEo6vnjcxGr65XgV", "isValid": false},{"proRegTxHash": "d7dd13977d5a2856f5a10cc9c471d4476c2f1e24e967c575a5c7e89192bf976f", "confirmedHash": "e26a8a53769aebeb90776fc9c725b6ce3fbf45981e02349d2500000000000000", "service": "00000000000000000000ffff9df54ec8", "pubKeyOperator": "149942ce40c0a10d71c4a6400f99eab0398f40cefc8e1fa97df0d28c25cd50cf394173a528885b0449da1f90e05b601d", "votingAddress": "23yiFrENxfBZJJrJ7DRaKMfhyCCi", "isValid": true},{"proRegTxHash": "1c13cf9989aaec99da381e3dac54e4aeb20c589afacea0dc811cd0106f3534db", "confirmedHash": "3a9a394f942e27b6a8753b1a565cabf9063f3bbf568a5de90600000000000000", "service": "00000000000000000000ffffa2f38842", "pubKeyOperator": "0f60df6e188e15f35fee974f8c24fba8ccb743738d3c948e6a9b45dae4fb15e6ec3d9864ba80b9ee54be10bc749e43ec", "votingAddress": "8KTvmUkr4o8jtFdaqHJF39fofVJ", "isValid": true},{"proRegTxHash": "05582c74b05e3c8853f74ee4275d68bf283fc6d1446dc9db044469751d4cc130", "confirmedHash": "60e7d7c67f7159d1139a6c3100a01fcf669ea20cd4b1c91a0800000000000000", "service": "00000000000000000000ffff22c51ca9", "pubKeyOperator": "0c293de5ea9435bc341b7c5f40075a178b683fc56caf97264960a91f79732454d235b96b966c58c7fba1dc9989f735e0", "votingAddress": "3bAPmZcJYtvQSmCZm7HawVkeVAH8", "isValid": true},{"proRegTxHash": "b9dbad38ad6836eb17dcfbdcbb43b709fe0cb679187c27ddadba35d4a1176ea3", "confirmedHash": "cfda47d69cbef492a2afdf53e7e4a1a51182e3f7674ebe290f00000000000000", "service": "00000000000000000000ffff2d5575e7", "pubKeyOperator": "91c11ac3a020acd7cc2c469d825f39e38023d17a9eff00b38c08538d17a7a268194ab17658c154a5f34b1c435eefe78b", "votingAddress": "4YCherdijREUWuTdqdMw2412ssS3", "isValid": true},{"proRegTxHash": "1776a80f071d695577eb3cf797eaef881b4bd34044ed7de47c3b1d1b55fb1f3c", "confirmedHash": "d22f81da6cbd1adccf2514cbed13eba5458566548c2edc4a0300000000000000", "service": "00000000000000000000ffffc2875e94", "pubKeyOperator": "89523c4a937195ac22fe5b77863b141ba148e9a50b528579a32aacd7a2115dd7438f2ac739bab253397c1f623ed692cd", "votingAddress": "eNzkXhw65ZeHCVjomBGi5cTv957", "isValid": false},{"proRegTxHash": "71474b3017851e4f4c2cbb7cb20f395a24e0403729bdf74f471cfc414f60b924", "confirmedHash": "e99212ad9045f52bcf74227a95a96458959dc2cd57bfd1c20300000000000000", "service": "00000000000000000000ffff55d1f20a", "pubKeyOperator": "8501a9fdaa2a1f21c71cdf608362f2a0cf06ae5dec7a07a21fcb176679ca558374bfcb7a38fa4fdf63ff0787ab0dc367", "votingAddress": "2MDfuK2UmkTaYFVatseCeTjRQp6Z", "isValid": true},{"proRegTxHash": "24bc0d1c9206aee3ea3f48472cf4cdd2d06931a0e0d464182a0b936c205de783", "confirmedHash": "1404d994518f5f1e5236fef3c9e7926184ab14c6aff33c4e1c00000000000000", "service": "00000000000000000000ffff59280090", "pubKeyOperator": "11feaeb2f6cdb8e5e0bcf0057a14039d56ff73b16e029122398485c9f7ac445e8a55ad086d738c117d56c04943173aa0", "votingAddress": "4Lz55gJCKxxogpN7tRFLhRJKswN7", "isValid": false},{"proRegTxHash": "837903dc54d941e7fd2c7f01f2f65b5d5555aecabbfb159228ce313c8f00e4ef", "confirmedHash": "b0a18272eff3581b59e8f98ba54c72cd907567c1c2068df61600000000000000", "service": "00000000000000000000ffffc7f702a6", "pubKeyOperator": "81c9b5a434b443ed584c9b2d528a5325d9d9b6e9e18ee342c3ca221a921c392ec81834112cfe9df2939cf1ffd7be7c42", "votingAddress": "2Qo7Z1Y3mHcEpewV1yhP2RkKtQJ4", "isValid": true},{"proRegTxHash": "c5f987a5dc0d7432f75cc4426025cdf6e752f9782d76cc61530c361e05de6f75", "confirmedHash": "636f43a19b0f15b36cec06fb2fcb9087031110cb695f311b1100000000000000", "service": "00000000000000000000ffffc0a90657", "pubKeyOperator": "86a792124c063eee2a2813bde9dd185eb934276ec9f9634c424685c225aebd5d6551564221e2ac418ba31631212fe98b", "votingAddress": "25AeKPhJNg77CPKqAKKfqpDLcpX8", "isValid": true},{"proRegTxHash": "fed5f6bc47222ff50fcddca126905f856bb3a80cfe543e90291dad0a3698b5e8", "confirmedHash": "5cd1ffc9d7cc86bfcfb2d344bc10512fd86ebaca41bf4b5f3000000000000000", "service": "00000000000000000000ffff52d315f8", "pubKeyOperator": "946e8e0b2e12135d5d32407e984962b87c1dfcc7189dee8921a107874c1845e8262381ccfe33a03f0d7de7834fd811fb", "votingAddress": "41xpqScm5meJwXfRjQb91m1DWu9n", "isValid": true},{"proRegTxHash": "a0cce85814193ddef0cf11654b018b6e07ff82c351d356625842f776331bbbf2", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d52643", "pubKeyOperator": "9442b1286adfac7dcb1ac129c3a347f6fd617e14a18fe52988ab3acfa15490c2c3798fc04148402777fca86e453e0570", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "50962897c23eb628b8cef9c6947e19610205ee5c6d4d48e17c172ce5ca81472f", "confirmedHash": "dc09fc7949f9cbbe722849d440533209f497e25934ff73440800000000000000", "service": "00000000000000000000ffffa7b348e7", "pubKeyOperator": "84e656cab14e9605ae2538ff1e58e6497ef593dc633b35dc017b4e2431f49febdcf793bdbb132fc6d8fb30ed83a730c3", "votingAddress": "2b3wshVnT4t4qEjPQNULJcGnD7Yd", "isValid": true},{"proRegTxHash": "42dc02b4f96b2a3cfde0d5836c780f6945ea8be8ee4dd80b843e8d36d38b9c57", "confirmedHash": "d91a967289b8ad3885e7065fc98ba1e8936b323625ec28023400000000000000", "service": "00000000000000000000ffff80c7890a", "pubKeyOperator": "8e63f2eb4a5f457bfa462456e7bd0929e3adaa2c567dd8814a597b4c38e654ea8ced746c78cc1b4782f081f0b3bcb8d1", "votingAddress": "AockazRxXZetR5DitjzcJBEfMCu", "isValid": true},{"proRegTxHash": "6680b0e45be647b1269b3ee1861b5071529b2b90188e5ce3666db78fdd324e3f", "confirmedHash": "32e456780b04bc60800b8d8a783a14e53a0fe3ae891685720f00000000000000", "service": "00000000000000000000ffff74cb9fef", "pubKeyOperator": "08797b8fb78aae163127347675af842c593b120543131be20bded384d10874cdbbccd03be635fad4738683aa36a42f7c", "votingAddress": "2ZohiFdnjrsoMvbHDKoayuuTEWVS", "isValid": true},{"proRegTxHash": "2e9a4159ed5f20a7f90dae9fa09a1d31149ded671d037b3cec4cb65b92907236", "confirmedHash": "b8c8b4fd946e6336801cfb9ad7f03893516520c9d72fd64a1a00000000000000", "service": "00000000000000000000ffff36ad3eea", "pubKeyOperator": "0874f3208517c03cf54edb6e7243caa865374abf7daa2068ad0db5305cc7f2d091b9c043f56ba580782fb12cbe9b0f2b", "votingAddress": "3iADeJqrgj2irhNbqpbSd6dLyxuC", "isValid": true},{"proRegTxHash": "79257eb728f2ffe03debf77bad4834fc58b01d36c6691773d930aa7f5b0c454a", "confirmedHash": "16eb2b4ba60eba21f8c09b26dcb88aa00619c98f01d60ed00400000000000000", "service": "00000000000000000000ffff3326732b", "pubKeyOperator": "8d28ac0d906364061f85878b5842afa164e76e982ba0cd31735abe614d2af9ceaca3cc3f83636285d088443826b284be", "votingAddress": "rcAdSF8xA7F4V985LbW4jYHmpPB", "isValid": true},{"proRegTxHash": "ae060187402b064b705e7e522f3d287619c80dd188f0aab7eeffbd0321945cf8", "confirmedHash": "a0c5fc8359622587ee670c2f4ee673fb44aff2950ac5bb811800000000000000", "service": "00000000000000000000ffff55d1f25f", "pubKeyOperator": "193dc42a026bd53f772bc5478ebeb92bb65e2278bba3e5651096ed08a98128491b93b1bc0119618340355ab6ed33e594", "votingAddress": "2sTfnCK6Tx2YQjjqVamLouSUwyVG", "isValid": false},{"proRegTxHash": "1e98492bd0c0ecb9a09c568fd24e60868467ad8cf4e5d571c07fa9f708047075", "confirmedHash": "710559b6a9e0f5222af0758ff0b58cba3d33fff34dc293001e00000000000000", "service": "00000000000000000000ffff5fb73392", "pubKeyOperator": "02d25f24c33455868d248d18b5cd6f8b32726cadc994c9cba1ff1780dd07aa93c14a45a6d5dacb38055fd46e1ba39739", "votingAddress": "3RhdynBMCwQehK3fL1powPxECtt5", "isValid": true},{"proRegTxHash": "e67b05a5d11239652dee71a1411ec1ee141337c97f55793d4eecabab0cf61a4f", "confirmedHash": "65c74853d8056f72a4f7dd85289a22ecd157e7baacf839a82b00000000000000", "service": "00000000000000000000ffff5fd97d65", "pubKeyOperator": "8c05c7233fc90fdd6897b3c1f166d1009b2b586057f8f84db2a47d7abc8cae9ff3212353a1a44ae3555903a275d5e96d", "votingAddress": "3UcExvnMAyWm88aoyrVpX4BUEkAK", "isValid": true},{"proRegTxHash": "f2aa5086ef4f714dd4e7ad522d26ef2471f85a0ad97c40f8519df90169e0f0f4", "confirmedHash": "92cedf893f54efbc50bdc2f5e205a3326ab687e27c353c351400000000000000", "service": "00000000000000000000ffffb07b39d2", "pubKeyOperator": "162812ec7b931ab980f2b17fe0e686ef6e3e5bfaff9fdb4f62da81879f2235409e25b4b2d2c39146266a8fa189bd1fab", "votingAddress": "ubvGnqifxR21o2hVYuBQXWx66FR", "isValid": true},{"proRegTxHash": "73e89b427f159b75afa727b8d13bcd2c6e73a21c498e1bdc1d4fc8579aa3de74", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b01d", "pubKeyOperator": "0ea292e690735a1b78cd7acdfade389c10594ef31048a3cd8fb6e4747a5a7aeadf221b49e398d23e696d81d1e3c4e73f", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "05558befa96b10761effa2228945f74e983cfb2e12a56e0a2ea8ed408cb8f9f3", "confirmedHash": "7dd29cfea495586063cf4e1b16ac509620a2055cf3ce62193700000000000000", "service": "00000000000000000000ffff2d56a398", "pubKeyOperator": "10f5fd3cbec286dd3197288ef7f8c3c071315cf8bc8ee44f7bc63aef16e2e462a53dd4944e1d6a014c499386e5fbd2c2", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "f0535c6e3fa1478d84647f22983a692ea72205c330fa6effb9c1f106e12d822d", "confirmedHash": "fd3bbfb712a1cb133364c4e8a16bd1547d7673cb5c348a361300000000000000", "service": "00000000000000000000ffff55d1f232", "pubKeyOperator": "99ba64bb4ea2ec9c02e4b7bbd27b8112f08d5a0daea9741d40de61cca30bbd84db026ce3e4cd467f84c0e08f1fc0501f", "votingAddress": "gb6bk2xUDh1TvtRpSGDeKc7bxfc", "isValid": false},{"proRegTxHash": "ca5e85627414b0c16c9f88a0787f5caa90a42f661c4358185d2cd805524072b4", "confirmedHash": "7cdb34df2dce13e1a86194dc947f28720bddd38c8fc69f920f00000000000000", "service": "00000000000000000000ffff5fd8e668", "pubKeyOperator": "91b95aba8f4ece31d8339814e8e4ea32023ac0292ecb30ecf4318006b5240fe10613335b8e60aba1d39cf4b002136d13", "votingAddress": "2GPGcxMK4HNUKFCCpZyH8rPZiNPd", "isValid": true},{"proRegTxHash": "381f0d1a164122a918c48a6828f212ee8cb80399a2f7c33aff223c572b337a4d", "confirmedHash": "562d29d7abeaa6f6649e7c9d60b4d31bbb684e08c26560912e00000000000000", "service": "00000000000000000000ffff52d31976", "pubKeyOperator": "83d5898507d546e0ce42770a89a5f7c10029db95bbf0c6bd1d6124d356c4dc15f0cae993fd4684a1584a997a411f6ad6", "votingAddress": "3m5Je7LWgHWhfK49kwAoV7UdLyJt", "isValid": true},{"proRegTxHash": "49e035eacb78a020bc95e217a2dfcf44195f9888e1b93d142fb7d45f9fcd20a5", "confirmedHash": "6415f0621bef2e358a347c2e77d68483407e9f6d05d336851000000000000000", "service": "00000000000000000000ffffa877530b", "pubKeyOperator": "04222bb30a1c9927711979ffeae540ff872cfcdd520e156f6e7307965abdff230d37ffa9cd6bd0e6d5252bb2eb8bb307", "votingAddress": "2M4fi93gbzKHCyqFbcxMv7ccgvb5", "isValid": true},{"proRegTxHash": "34071fc6534e2e0b8e409d5dff0c18cf83fd5577ba22d7a80dc70ceab9dccf2e", "confirmedHash": "bbcbb21d4ce40eb3d7827da681e571b07eccd0b100d264c81600000000000000", "service": "00000000000000000000ffff55cea55a", "pubKeyOperator": "889b874dfaf663c9304f38d94739969ebeb928c2168ec3a3a5da198805bd8bf39762c88267b4092f2395a3897eefec95", "votingAddress": "2zzyRsnsaMi56VLF1jVGRxtScCae", "isValid": false},{"proRegTxHash": "2600f5242996efd5c5550bd9f209437ace77d8ab327c23d62bcf80b0b95d9961", "confirmedHash": "184c5b4a54fa33ea611870d7e6efd7b6646ba5f550e78fa41900000000000000", "service": "00000000000000000000ffff5eb0e927", "pubKeyOperator": "8f6088282a99484a19029b68ff5869c966b914410dfcd90103c5af39c60cd9549ce1b16dd076c6c57e79c20a0cb09e71", "votingAddress": "3DXSxt2QrHP27P7Va4YcZZ39w3cj", "isValid": true},{"proRegTxHash": "dd8f1bf2dd0005f88911852e319cdaaf3392e3870735c9c9963b3be45b8f2dfb", "confirmedHash": "5573722cbba0e84c69d8fe24872d97409f7ced7b8e5163212000000000000000", "service": "00000000000000000000ffff92b9b6bd", "pubKeyOperator": "14d41586a98cc8aab22557126a655be437946455dccbafd215dcc1ccc9dce6d2444ea6ae94dd1685d44e00199bbafb3c", "votingAddress": "uU8uZ35Honrz2UGFFA8PLMerjw2", "isValid": true},{"proRegTxHash": "f7ec7fd9b4059509766f51b486aef19ce68bc8b27294f6ff2bc1dcd199892355", "confirmedHash": "4be05397bd28badf1860e31f7b82f4910f3f8c737c1bf7e50e00000000000000", "service": "00000000000000000000ffff5102f076", "pubKeyOperator": "81889e861eebc69cfb407b552574e6bd9e6fc1eb881ede67df20d93ea2450395ad662f390123a2061444f7e5dfbf3d70", "votingAddress": "2xMU96aUZx2sL5yWQMvx92BcqBVA", "isValid": true},{"proRegTxHash": "703fcece4c7279eeec2d09577ea96967f1edf8c1cd270597d536a66dfea707f2", "confirmedHash": "0cb36e4e1a00242957072fe188e1c98b9e81113f1da01da51700000000000000", "service": "00000000000000000000ffff4e2f9442", "pubKeyOperator": "1484b4e5967238950b1b23f837cc84988fdedde93e4300fc878e63c3f864d347e993ac9b25354d89415509f9a8a6bd21", "votingAddress": "34Eccfx8n3aG5XN7fXFsuykrLzAQ", "isValid": true},{"proRegTxHash": "026b816abea9209a8e045a8beba834033de944f1f8c0586956b78d1264a2c85b", "confirmedHash": "12687a2c291cdf0465b65fb9d57a97314059c49cc7bc21ef0200000000000000", "service": "00000000000000000000ffff52d315ef", "pubKeyOperator": "8192ba0ed679cc7bbd23925efd48a79ee17146136465456d5ae3f8f644ffd7baa0b9ced3fe88fa2d35fdef807952b592", "votingAddress": "4CBDa7d47QGq5ZtpSQcnFieyKfL7", "isValid": true},{"proRegTxHash": "5e658fc6fa3c1a7fcc987994650ebc5545011372626c1cceb3ae6a54e36208bd", "confirmedHash": "32cd85e933a08ed5036c45050497f3ba60e70f2fc72f87931100000000000000", "service": "00000000000000000000ffff2d4d0bc2", "pubKeyOperator": "05566f23c4f47a83cf13d43d035309e43a01351127880e73446784e2046ccf723a49e15e78f8a9b330a5bb429e990340", "votingAddress": "2sfBU1ATn1Re3yAgt2UvxZwoiU76", "isValid": true},{"proRegTxHash": "5ea5192459bdc8f83bda6381ac12e9436cf4c09bf5d60883f135713f658e5484", "confirmedHash": "d4d4db9d3c198a0abb21bd048984472423b7a29763ed30e21e00000000000000", "service": "00000000000000000000ffffb9f3d681", "pubKeyOperator": "95a7a310a157f3609db71a894cbb6ba6a56267a680dd0254e6d0bc04ea4149a3ee7f2ec2027f623dd97515b46db72f35", "votingAddress": "D8SZuYPMArwcVTXh9bpErFnpazt", "isValid": true},{"proRegTxHash": "886c3cefe0e51cdadd3cbf2b0b228c6830e8afe408bce7d24ad7a96b396bb91b", "confirmedHash": "e49ea04b06c912021d8ecfbf5c27a0bb2377d9ab31fc22b10500000000000000", "service": "00000000000000000000ffff36afd275", "pubKeyOperator": "983d5dfbe31d96b2c6af08911d1482cf3ff5723d361f8c20a382d241439d91159955074d0dd8d5186a03595aa280a2d6", "votingAddress": "31BPVrj19ZcXQFBuBi4BetyHRE21", "isValid": true},{"proRegTxHash": "cb6efa30bb0439250342c6ec07991dad4860dc87e4372e047aead210a0deabe8", "confirmedHash": "dcbaaa100c7772cba7e8dbd9566b94925c892293a5b6829b0f00000000000000", "service": "00000000000000000000ffff8b3b383d", "pubKeyOperator": "8f02fff5a80e2175d528c6cc97ee90e1d41f23f3e54398031d4db68ee6819413bc525522360f4095d862dc6850b246e2", "votingAddress": "oKbxrW1PygLD2gmhAtMK8pQuNLt", "isValid": true},{"proRegTxHash": "b7d12cb27cd339c02243157155b76db01f42e7e2f46213ad51fc6b93f2470e58", "confirmedHash": "f88c351744c7e2eb387d2324acf57223279ddc80a7c315520600000000000000", "service": "00000000000000000000ffffa516e1b0", "pubKeyOperator": "8517609d2c36c83d66b006aade2d5d4378c7daf527e3cf513952ee6b0d024bb442ca9853b53f78b1bfdc6b1ee37704f3", "votingAddress": "2i3LaCqoepR8jwSe4sRyugLvbi9x", "isValid": true},{"proRegTxHash": "9d12b93893360abb97215d3ca9332ad10a08949a7170da96fa00a13e014ae228", "confirmedHash": "80a9f392e099a10581be651ea7e9fda7a0d4f92a57a26b261800000000000000", "service": "00000000000000000000ffff2d4d364b", "pubKeyOperator": "82b4b2e1a673d3403511898dfdf66d0b00e275194d6ac15ba09fc0468bb63050fe97948a9440d4a5ac82c16f1435910a", "votingAddress": "R9rCXBS6C53VPMNLe4EaxbdRQsZ", "isValid": true},{"proRegTxHash": "d99eb9beb66d4e51f2ddcd4fc6a2184c12fa5b07cda025ba64812451b66298e7", "confirmedHash": "90b328fc25e0e96a593ae46cef1f6d95bd113d9b5a49855f1700000000000000", "service": "00000000000000000000ffffb23febc2", "pubKeyOperator": "17df002fe2e3f8775d6f102a94d6e3b3d5351dd4c8469fb7dc7611efff26d974e3aab9a0c583af40f8775183296c592a", "votingAddress": "27hc8f1FTPswB2UeDrG8yKx1XfJW", "isValid": true},{"proRegTxHash": "78cc99a190d7d098309caad5b798d11efd6e0aec1a4d4f216dfbd659e617c81b", "confirmedHash": "a2af6fa1a713a0fe0783bdc07a12102b5ea79c3fee06bf390f00000000000000", "service": "00000000000000000000ffff9fcb2ebf", "pubKeyOperator": "94776712b0bc5289b4ed1f8de34d8a5cd132f4393c36f035d73afab1f800414474f7d4f743ec8a2e9c650d58ca5437b8", "votingAddress": "4Hmbm4xJx6hVY7uEFKBRmwyMGm3R", "isValid": true},{"proRegTxHash": "f39ed8d291f69e3f9ed5e9920dd09b625847ecc4e2aaa2d90f049d0555b1ea32", "confirmedHash": "cf0dbf89bad6ee558b5394c36e0183150ceabee9fe40bd950b00000000000000", "service": "00000000000000000000ffff87b50843", "pubKeyOperator": "092283db11f10ad072ed256aea0bcab7ea617f7dd8f7758d5ab16e3d09c76c3c3218d274b2c1a8266f3cbc209a32c4cf", "votingAddress": "3jJvmQcfYwRpxzjZ1kpu7Busqi38", "isValid": true},{"proRegTxHash": "e24b5d4dc77573d6532ca39b97e47e0965ab484727936b50e4ae7b57334dd162", "confirmedHash": "9fb90c690dcadabac129a6532e0d158b4e9d25ad5fb14da10600000000000000", "service": "00000000000000000000ffffa8775305", "pubKeyOperator": "873688f214b494cf7015f31562d3bb865c5d1eb214f57771276feffce8a037cd7967c367f932b53d84671eae8bf39336", "votingAddress": "4HQgjPw2uV52m2j22NKRExrCapaR", "isValid": true},{"proRegTxHash": "ccf6b7e677c3e2dfe28b011ff70d9c82486a0434ddf79c10e80159c6427e984c", "confirmedHash": "e7a59b30df0e27fb8799e129261b4be4f1d56cf3a44d83c80300000000000000", "service": "00000000000000000000ffff8e5dd85b", "pubKeyOperator": "0c7cee2443fb67f0d5b39959cfde7353cb938bbc814adf270997ac85504cf681f727076809e99b380ba2211deb4e3095", "votingAddress": "2C2cp2E3AeMSWtFDgm994pEYzT8b", "isValid": true},{"proRegTxHash": "6428453267df84892e504e569712041d5fa395e8fe55758d0f4d24031b29582d", "confirmedHash": "e422434b744dd7df01ac384970db8e574c692431ea4bd2070c00000000000000", "service": "00000000000000000000ffff4e8dd8f7", "pubKeyOperator": "098d6a358ebdf7bd3e5a22c5784f4a3c691788ece395d9312b36274274f1e2c9d47206041f194e49ea41afd211a594f8", "votingAddress": "3P1Mo8pEaVKGSe5zirPFnHtf5SvV", "isValid": true},{"proRegTxHash": "7823a83f83ed586e33ed2bbdf3fc8f4be28e0971943bfee6a910dffd1294c7f3", "confirmedHash": "2c5ba6d60308ffe90ab3cdd41c883c717cfc12719d5e2b1b2600000000000000", "service": "00000000000000000000ffff6baa0792", "pubKeyOperator": "949176a302960e4b71cdc8e661b9f1c5336fc8c9e9937cc8a1b1a10a55056408f6cfa346ba88a11a26ec9ecbdca592e5", "votingAddress": "45QnYjZWhuLffBCg1N6btoTu3Bt7", "isValid": true},{"proRegTxHash": "8c6e5ceb43bebc84b5db98653f7a1a9ee4b0d664ae7ffbae55fc74ed9ce16ea2", "confirmedHash": "3b972669fd147c77198f97e03135962ff4902c0efd1405021700000000000000", "service": "00000000000000000000ffff52d3194f", "pubKeyOperator": "8f4fad4d3a38c662b27390ef799c39de12533575e5267dd34d81b97b3916832fe6d0eda5aea8b6f4db9e43b820908813", "votingAddress": "2Rq2GNPk977sJ3g3nRXspiCiaFez", "isValid": true},{"proRegTxHash": "1db75fc8dd1d2c9e4a40267f377ffb950c41ddc60ce6ae03ba85a99c55eebc8a", "confirmedHash": "7c98fa9d74b035b7f4b64e9133f602e8a0e14dfabf9a51051600000000000000", "service": "00000000000000000000ffff55d1f21d", "pubKeyOperator": "19caf6e624b23863cf713d186cf4b8dcecea8e3054fd355253105885f06410aa4c866165d0d1bd924890ebad0c4fa5ba", "votingAddress": "HVPLtBgXc9Rt1zK4AP6tVh5DJ8Y", "isValid": true},{"proRegTxHash": "474401cc8e10d7f7d94433511f24762d844d422bd49e5dd13ace9bbf60830c79", "confirmedHash": "76543df94eb354497d35d0d666ce9b284e06b51bec46f84f0600000000000000", "service": "00000000000000000000ffff50f08753", "pubKeyOperator": "033ac9737b62b0bf5f1b424cbca290ab153cf91a1cc1ec62b62c3bef715c71e6ef1d65e3ffb9152d233a40fde1513c3a", "votingAddress": "BhptPwKSBes8H9oqLogEc7u5fKN", "isValid": true},{"proRegTxHash": "16b94e1c88788deca4875df92062a935cf8671b39a7dfb969ed6c3f8b196c679", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d56521", "pubKeyOperator": "143340acc6193015729f285054cf2a34d1fe52c3b36169eb1c249914d14d29c76dd3d4c0b980fa95c75589c627516433", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "7ddff352d3bfcb9a027838ecc213e305e5718c912cb7e8313b51e61b0d8c3b63", "confirmedHash": "15ef8467ad1b46198c1c4c279656312da563c1b1a50649b11400000000000000", "service": "00000000000000000000ffffb23fec68", "pubKeyOperator": "83dec5736314426062a0c8e70fda26fce7bd4ccb52384e5518ec34002d0f68114f3aab87735fb5fe7da4ff736d2e2844", "votingAddress": "35e3eMmgarNZhW11uZ6GFjuhsWeb", "isValid": true},{"proRegTxHash": "b49f18aea7595c6f1c90e87be46171ed5ea57eee872051408c7f7be97f055156", "confirmedHash": "4130b5dc087f489c12277f886d58978ccf05fa57e694729d1400000000000000", "service": "00000000000000000000ffff52d3151b", "pubKeyOperator": "8b3f00590d0f05443def6a67470e71de676d462d8dfa902505c21d5056e8f3c94eb9d9893130f9bd0ff3f7243c3fb530", "votingAddress": "4QXtNyFfQHeJzDhnTpKEd9wj1qer", "isValid": true},{"proRegTxHash": "23a809d3949d6f77fcfd8d5094ff50660583cc25b266d9ae9b91ff6ea5f86e11", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b052", "pubKeyOperator": "87338315a4794ffd29295cde1a8cbbe5da5733cad3b0dc6f76419e88f58fef0d4bf0f95ecbcad5389d8256c9ddf2fec4", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "a4d420ea35fda9370cc3572e737c6ead21b12fe07fcb07da5e256ecf281622fb", "confirmedHash": "a1e6a81c221aed68d0e640d6581eb47941aef0a4afbbaca63100000000000000", "service": "00000000000000000000ffff52d319a9", "pubKeyOperator": "85c649e189357b57c9f7d2ef0afb13b3f9ff2c68492553f435d09df5174bea666a0d621b6e7d96c786ca915c71c2d5b2", "votingAddress": "3ZNJpqgL4fShAgMV6LVRVCuL3P4H", "isValid": true},{"proRegTxHash": "e2ec74a2cdb9f171474760bdb7daad1fba79e197eb89542257f86a7609b4e2fa", "confirmedHash": "a44a80152a626176474b1cbcee57e4f2dd2b33c1f349b8970300000000000000", "service": "00000000000000000000ffffcebd8f6b", "pubKeyOperator": "15929f046b419e3392ad5af212173010b35e32e588a3bbd1dd68496eba77817b6cafdf55d41792cfef3040abae42b50d", "votingAddress": "wjZj8FnBwatR4GFwhXXSP6Z7QMG", "isValid": true},{"proRegTxHash": "219e54e3eca13ef2ac8efb769968f8ac717b2fae1fb8a5dfa168be6422699a3a", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688e9cf", "pubKeyOperator": "98a331269f6acfd894960acb97c36037e817923455d9727f6524cb71ecee674eb98d897c3bb3247e85cc5dbfb49541b6", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "022cf6929e950a9cca214c729a98e2420087ed6afa6f0236b0f6ddcbbd38c24d", "confirmedHash": "84f7379e68d9155b515a16da59d058dfd5fca46d85cefcda1c00000000000000", "service": "00000000000000000000ffff3359d8d2", "pubKeyOperator": "141fa79ef1f690e8720b7c7792784470c8dc6726f2c771539faac540690f3b65c2d9d1802e5fcf759b6ced385fd2b228", "votingAddress": "wNhk1moStECYqCZ7jkvwFTemzri", "isValid": true},{"proRegTxHash": "09a783ca65c63900d2b0aa847551fdf6b937090da360764c14b9ebef25bca39c", "confirmedHash": "76030e439bd9e1ac924f7601c57dfcbcdfaa03200f51270e0100000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "5o1Qfpre1uXcVrZ4NVAtKeuFtJf", "isValid": false},{"proRegTxHash": "8930ca5891f5eb3a4c0833e48041a97100402c70459303dc0d61b0098cce00f4", "confirmedHash": "5cd1ffc9d7cc86bfcfb2d344bc10512fd86ebaca41bf4b5f3000000000000000", "service": "00000000000000000000ffff52d315f7", "pubKeyOperator": "81cdbbd0611cf9807ce5cc15b4cef322bb02615d4291e6c68138e97e1d3383d6f54c2a2a9573728633e7f7c4c4984e3e", "votingAddress": "3KPwJrfqhBeuzsRys9aSQ6axdJN5", "isValid": true},{"proRegTxHash": "f109e3f44098446ccfe719666cd75a645fd4461d6e126a2afc3dd4ced3c32888", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6eab3", "pubKeyOperator": "131c94dad302899484b4383425a4a0df7aba81161b9ea099d83b3b716bc01be0ab7c3d12b39222d0e23985925ff4dba0", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "c6d46898b5b8f05e0bcfb414a98fec3b5782881affa74089fbd6be990bd57f3a", "confirmedHash": "a040f70d86919cf216e6f353b3534e7122524e5ed0f38b412800000000000000", "service": "00000000000000000000ffffc2875b1d", "pubKeyOperator": "0d8c32551c50fbdbfbb6df3f3ccdacba9f1e028fd994588ea4add23f2704a9d8cceb34bf7f29ada21ec59a489aeabfd8", "votingAddress": "2JhtSHWXCxRkeRHWMNrsxupYJmKq", "isValid": true},{"proRegTxHash": "33b889367d47535b8a0f28ccc19cc34f545fd4280422889bf30d4dec698b119a", "confirmedHash": "538e652b4628573d6650586c4442a38ebc687a92b98184c71300000000000000", "service": "00000000000000000000ffff33c37449", "pubKeyOperator": "87ce4d01307712b3c4b1679902bbb5a1ed51750a123faf387938ccb8b3e520b4d45229de8654cf89008280ad2f7185a3", "votingAddress": "msQJuM88cTbaBFSyBSXZSdX4zSV", "isValid": true},{"proRegTxHash": "ccae041348126528f5956dd10eff970decc0b31ab83d8835d949aa82020c43a3", "confirmedHash": "825ff51efd7ed0fc1fc428520486adf4d7acec61b83d33cf0b00000000000000", "service": "00000000000000000000ffff55d1f257", "pubKeyOperator": "04d679a06eb3b8358ec55ccbfbafa36996d6b541b82319498cfdc00cb3d397a8d92d057db360f0d5904ade5ed0db9537", "votingAddress": "2WshGBeVZf2uruCtrRV5m8Hk8b2c", "isValid": false},{"proRegTxHash": "3d883e1e85b9f320c81709591196a75feecce8a74586beae40c260fd5c49a25e", "confirmedHash": "292f899d509561b053052ef4949600e61942501ec15f634f2000000000000000", "service": "00000000000000000000ffff5f55152a", "pubKeyOperator": "97ffacf1baf25eddaa9266957870f5109753272f6b34a5e768de869af76f21fb158920eb70fab0514e684ae19123b856", "votingAddress": "3AQaY3f82cbaw9PUVEMaXuvTzT3X", "isValid": true},{"proRegTxHash": "26c734f72d63a8b402afb99a6a87527777de8388c2311406ae0a6e2367b5b67b", "confirmedHash": "8c1344b92d97ab3c4218ff44faa689934cee6633dddf40c22c00000000000000", "service": "00000000000000000000ffff6baa9da6", "pubKeyOperator": "93b5cf532924f0a4693b4552770ca20e73fd8eac1e6ca1e410297dbb298920b297a3ba24adfd0370258b4598affbe7bf", "votingAddress": "strpWV75B6X59zfVNj8brfTS4vH", "isValid": true},{"proRegTxHash": "2ca0cf4463afa12abee6955bf1bff0bc3378c2f12486d51a1cdf5ce21b26ef27", "confirmedHash": "2ac9c96dbe5588ddcb985ed2808f78575fd88d6777535ffc0700000000000000", "service": "00000000000000000000ffffb23f7988", "pubKeyOperator": "99896f79a9bcf505d52e72b59fd940302de0a62fb686f0ae5f58cfe282bfeb251099ab4edc25a46866bb82aed24af35f", "votingAddress": "pnLZmvehVHSp2BFDUNiSgAvaH91", "isValid": true},{"proRegTxHash": "f25b8727c5df23e4e3fdc8d734aae2580ff582c14343599d3b45007c677c8fc8", "confirmedHash": "99839c5cc34c214dcfe6286a7f5ff5191614bd0cdfa248430100000000000000", "service": "00000000000000000000ffffadd4dd0d", "pubKeyOperator": "84f742ddd41e354e1b1cd431ea58fbceac7730ddc2e5ec66aafc3735e76d7051c3c1328d6446ca2bfa7cf71c86bee185", "votingAddress": "295Zir4ycpgm2ugVKqz2H76gnZuo", "isValid": true},{"proRegTxHash": "9827295d7cc70b61cb2de5cdbd345eec302d8585c6cac6c10ce14f80f56793cf", "confirmedHash": "2839919c8bfcd2ef4a2fcb6328e1e5899d6850b4f1c960df1600000000000000", "service": "00000000000000000000ffff40e37f74", "pubKeyOperator": "8886fb72e56112680ebd62f61b0e5b01a2532ad6026f5850460c13ffd94bafc26f1d2fd621650fedd3f197c4eaeb5675", "votingAddress": "uKwrveAtT3AqpHRoqdGC1EwNXxA", "isValid": true},{"proRegTxHash": "15d41220a8e8a539344da8d6735a70e2fd84eb1c734a2194eaf10428123a199d", "confirmedHash": "be00c5a26e72241064fa29698d317dc3cb545936fca608dd1000000000000000", "service": "00000000000000000000ffff592fa7bb", "pubKeyOperator": "942f33001848783d2f9c9185fd4342c58b717969019515fc5329581075c483bee72d4bbcd18067cda87de49a4c5e86de", "votingAddress": "4FBzrUcgJG9Nfs2szMyH8iubi8By", "isValid": false},{"proRegTxHash": "35d70ce0e9d7c5290ef358c06d0c0763a2271c8905a52f1cc33ab30f1cd8b44b", "confirmedHash": "b4582a6ffea2851e6581de5cf5799d7a1e8705159979b9a31700000000000000", "service": "00000000000000000000ffff2d55752c", "pubKeyOperator": "8f51f9d4d53e11887694930871b64d44f1ec9b92870bc717ce21c6bc252cecb2254adcb0f322e1921e3227c2fe837fc8", "votingAddress": "2ExHhmwKJD63D6TKhavmknKge7iW", "isValid": true},{"proRegTxHash": "1058208572ec7c45390183bdb3b6b3edbd1e0195a7270ca75daefd44c6f22652", "confirmedHash": "2347fb1c4fb53c46e40dad9af625da912150a762f499247a1a00000000000000", "service": "00000000000000000000ffffb280f15f", "pubKeyOperator": "98bc1002db19780ff9494701224c3464d83bcd72ac41f2adc7914d5a8c56a503cb3d565809ba22e3d3ad64becaaf9c1e", "votingAddress": "3kSoooTWhs6pERNJ6ew4LRGsPkKW", "isValid": true},{"proRegTxHash": "8fd6ec87cfaa25f9d04206b337467fad8646ee0866e64c8c19e1314422037e15", "confirmedHash": "2941ecefa6699694bebccc7c93c1bd55e4d0dbd38707e5e51000000000000000", "service": "00000000000000000000ffffbc28be25", "pubKeyOperator": "849af320b667c2d90761112cb85d84214b57c4571c512c622b8b07b33f7d597ec887df47d38abc3c325c55db7ebbe5d2", "votingAddress": "2iXrpjAZcdT9LEqWVFMzXjA1Zjp2", "isValid": true},{"proRegTxHash": "ebc7e036db9b8ca52a3f5c42e45f76d8599a2d69595389ef5e7ea4044b779e56", "confirmedHash": "1092fa613eadbeee091d38909cb14a661e7ca046ecf488e91a00000000000000", "service": "00000000000000000000ffffa2f3cdd4", "pubKeyOperator": "8e808d14dda46be0f918e58e1785d935dd03b0273b0bb9dcb4ca21b9b9e76f0ddde2110f45863873a48e8fddba9fe5c4", "votingAddress": "GZo2mK4DwSukKtfdGL4EXme4rHL", "isValid": true},{"proRegTxHash": "8f670864a49098ea2a2c1e404c0b6b78ff6e7b93fad95fdebd12040242c73b58", "confirmedHash": "460db5fee51577d118e0239952e818f0b7ddfdb6eb7f2c651500000000000000", "service": "00000000000000000000ffffd4186a6f", "pubKeyOperator": "9529bea50cdf659a5706abf0d8113f328fb8d7c4f9126c0026bffe6a159db99e5d304c22e6ccc0f7bf689aa1b959c36d", "votingAddress": "3RWpCH8Kagz2ztoBBJ29fLomS9uR", "isValid": true},{"proRegTxHash": "3e1871c16a359e163486277f17cfbc42cbf5a28f935dd59105e325c319cf6a68", "confirmedHash": "fbe7bc38b0a8ea8e8d5dd29c50d97e3610d15da02dfdf72c1400000000000000", "service": "00000000000000000000ffffbc28b842", "pubKeyOperator": "87f6be0d9918618faa3e4c6fed71ae7e403fa96d8ba1612490091f4cab5d9cab6aa922adad289194bf0597c8c4a31076", "votingAddress": "419ktmcESYyHkwSr5qbWnxfmGpbL", "isValid": true},{"proRegTxHash": "cdc2536f33f4663324ef2f85f5625b2eb5dd87c6b89ba9846547f008c3e7063f", "confirmedHash": "a29c74fb3479bbcc74497d6602c50921f2f28889b72c7c733a00000000000000", "service": "00000000000000000000ffff52d31917", "pubKeyOperator": "83a556ddb1a3ce59a3d2d08ffc03cd291efa0d163188932c766b0326dc15eb73472f26eafc1edf5cca2db5745a932611", "votingAddress": "49k2YTuVS9pVGNY6ZmiRMGctfBpb", "isValid": true},{"proRegTxHash": "f6a5859f32f237d0f7ccdd3fd72b4450b51825101fe0b4fc94b4b24832d58586", "confirmedHash": "7cda983d2dd8a2fce5cf6141c48cfe13ed4c9c83d43f2b4e2900000000000000", "service": "00000000000000000000ffff5fd8ff44", "pubKeyOperator": "104eed39725245d4cced9a79f28058b99b051568481e55c55b018a089521e3e615d79765de42bc9128ae75e5f58299cc", "votingAddress": "2adTPyVyrZmXS96pBSZys7C2V3dM", "isValid": true},{"proRegTxHash": "ed2ee2fa9d6418994a424d936f8ea6ea040adf38a860893c3bd2934c5877c425", "confirmedHash": "cda29b67ce0828b2618f89f898b47f3c596f0c080b42260c1700000000000000", "service": "00000000000000000000ffff59280fa7", "pubKeyOperator": "99899c2ae93d0308c3c5cb8c707a47e03bf0756e6a38e65cacccb0382166efa7662d994c116eb148ab4c3b56f044a640", "votingAddress": "UqJ5bbWnTReXeycyswWVeuH4C2u", "isValid": false},{"proRegTxHash": "f8c5d9f51954fe9a8c64028c41cb25cab9e6db1029579a88d540c23b455bbe5f", "confirmedHash": "802b4d0c28a6dfdef309f4c6f95cc25553875b4677c14be40d00000000000000", "service": "00000000000000000000ffff9fcb085f", "pubKeyOperator": "195f739639909ab3442965065f1a1fe189f3fe9f10d50408a2785e356ab7b2f6120600cc6ed3179f7f5d27b1703461c2", "votingAddress": "3fnSRvBBPWXkNShPWNd1CQveK3Tc", "isValid": true},{"proRegTxHash": "86c5d265c6c5f7cdd2720b57ef75fd46f212b9f36d5cb8d785c2537d37afdb7f", "confirmedHash": "57cb4287e9538befeede71aee1cfe0729d20caee761d7f840700000000000000", "service": "00000000000000000000ffff8ac586b4", "pubKeyOperator": "92bd8fe4aff7e7da044ee3e0e1a0fa4bfd5a8e8889cc0005e2aa5d8eb632fc3aa907e4d5b3250bd607dba0705168b083", "votingAddress": "21xACf16eff2KSRyQeBiFJ8CRAC1", "isValid": true},{"proRegTxHash": "bc47b0c3b5d5ebc81e751252faa112ec8172d5cdfb4e6407522a67be6917c7e2", "confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", "service": "00000000000000000000ffff55d1f26c", "pubKeyOperator": "024f7dba28393cc57d3278d25b16cc05775fb0ab5a4944f5ed41679d0b9850725b57e8df4f61ec2caf480657020c8a0c", "votingAddress": "28xkZaeFgmXx6DDWFHYbgKRN2ZBt", "isValid": false},{"proRegTxHash": "a9308985d69703a7724f3cac839755bf595399e91f918153bad77e01450b25ab", "confirmedHash": "58e240a154a0ac48dfd26143fb8ac7413aa11d8f10f16e622700000000000000", "service": "00000000000000000000ffff87b5084d", "pubKeyOperator": "05b5ee76547484ffdf8228943b16114a933b0494e3fc797dd98216fe3832c004e4ab79aa67b7da21b3f7af81ecb93315", "votingAddress": "4L6BAqREjFFzTSjksdezAjSd6QhG", "isValid": true},{"proRegTxHash": "ff5ba0b3f1529e10d7afc8fa4c22786f5a82c3f52a7bd14f1137c179a8b7c99b", "confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", "service": "00000000000000000000ffff55d1f26a", "pubKeyOperator": "13405980a4774dcf15b719af42467d2fecc76aa7be0aaa6eabee7911cc673f449ffb7e4ac03ca8acaa8ed2a582a96d1f", "votingAddress": "ymrqdRXdNxF5Gpcsor7V9zoeazr", "isValid": false},{"proRegTxHash": "3fd286839c0849b89ef2d9a43568fb6203bb3ed216c56f5f45bdc76bfe0a339e", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b08c", "pubKeyOperator": "8c8c7e70d9fa3b9db4ab764cd610cf832d98b5e736ca7945c8c38cecfd7e2b0d40337113377ce351edfd04153fa5f856", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "96fb3d26a7e4d57168e1c37e5658e6e624562c28be5094d5171e385a71af016d", "confirmedHash": "1a28b076391fa94aba3f1cd78bab9ff89f97368362b374950200000000000000", "service": "00000000000000000000ffffd8bd931a", "pubKeyOperator": "00474e1bbf9bba49f1f3ad2b1065b1b5162fe84ad7a43e7d28ce7920b3d2947f3e0ec013786a442f768ac13ff29f2177", "votingAddress": "sCMcm3LaFxNf1crXPnCV2L4ParE", "isValid": false},{"proRegTxHash": "007f9983e81d7b8237167849db0b3d4998e7578e16492079984a99afcbe95391", "confirmedHash": "1449053906029c60397eba6a82784cbded60aa3933af92811c00000000000000", "service": "00000000000000000000ffff55d1f151", "pubKeyOperator": "9038b0daf9a04c432d857d229b188d5cf942b5fac522694a2ced48147aa86535b99f1b77805486bca52b770c2a2939c7", "votingAddress": "33sBRjBUdecgAwRV8xy4LESq84T5", "isValid": true},{"proRegTxHash": "cd6ede80d10ceeb05dc3fd82b08ecb047bf4dfd076e6113fbb23bffc9a0d764c", "confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", "service": "00000000000000000000ffff55d1f215", "pubKeyOperator": "0af5ba9e5e26056eb3c1a4c5397c9ed7e5ef5f422f6125387eb5170f878dc6ee9748cf72a223b65f0861bf80d9724b1d", "votingAddress": "3nEJcy6ZpzZRRNyHZxK5sa8TopAB", "isValid": true},{"proRegTxHash": "be7bd16da980df7458690762f93f997df0a830c3a3bd88132696b372987bc4f2", "confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", "service": "00000000000000000000ffff52d3191b", "pubKeyOperator": "85109cff7f828ad34b1e3c44604aa9a639035ddcdc7856d59c22067750fb1843b63d87e1e61355938385046c902a5a07", "votingAddress": "gFshByKi3uUqxiMsxsxNh7MvJEY", "isValid": true},{"proRegTxHash": "872f5e6dff0493ebf2bdd6931b980650eb6d331c4fcd8d96223d79e4532e2fd0", "confirmedHash": "b440e778fdc880604afc42b4b52d020cf4ab52209d16f4c91400000000000000", "service": "00000000000000000000ffff8e5dfd1f", "pubKeyOperator": "045b847f198def97fbc0ff6fea10b257430bf64e4725273ab7cd5a3edd21b4203ce006e841fd601b9673eac5892631c0", "votingAddress": "2tRy55TeWYT1cKaYo1DSKuEUtHnf", "isValid": false},{"proRegTxHash": "5ada67b06f37974c60a61c2eebfb1e4766e1c4f07d6a3b2a4be71f3c0680ea25", "confirmedHash": "e02d84b4077164744e348de10d26ce54a3125ce272e534e41200000000000000", "service": "00000000000000000000ffff310c6a93", "pubKeyOperator": "97a8fde133a1c870f981d0126b7eb41ee94b4d9b1a5114447fbd08779e201b12f49767c65f99e7c52f4848ccb1c7a9c9", "votingAddress": "36VossMqkxKr5QKLqXNkgbKJf8e5", "isValid": true},{"proRegTxHash": "983e978391aee3e6c207f5a45f338f6acb7c1b873af5a9b7c50bef64311ad7a1", "confirmedHash": "4066173b3bdf7669a8a01995d3c1b85ee08147b916062aff1300000000000000", "service": "00000000000000000000ffff2d4f3861", "pubKeyOperator": "10e1d8b5df46a6d4347f273952368039d5981d12099c10420d87e79bd1304f55952dcd0abd88981caa4abf25788ea25e", "votingAddress": "h13bFeXcvkipc3tDhXdLcJjsG8B", "isValid": false},{"proRegTxHash": "41f4c5cbbc471bd592d4d865f975672d8892afb95f9c3ed7f0e70e978f5ffafa", "confirmedHash": "08540ff0c09bce8d2f577a0051a7dee96a87c5f14688a4ba3e00000000000000", "service": "00000000000000000000ffff92b9ada9", "pubKeyOperator": "81aedb392d173e88e79ff8be168835ae2a59d42ede627973c1ce7f583d33fe06bb473c204415fccefde374b14dbfaf8e", "votingAddress": "3LvSiJnUxA43eWQbzh6aM3TuWKkE", "isValid": true},{"proRegTxHash": "ac309f2d10c49cd9d04c71a832365de56f7fbf9d3b62ad2ef6ca1ecae5b84458", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688b031", "pubKeyOperator": "9433d4e9da7f05fedd0fd22c2be56c0b42d0532acbd72353aa9e6526af6f2b3dace983f993f2ce8d54f418b2cd653a15", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "7319c62f6e9a5c82788453dc05bb35c5763f3a78c5673503133a6c854a1302bc", "confirmedHash": "88a32fe101b93734a14c14cf54c7b312cd9d4022f7d67dc83c00000000000000", "service": "00000000000000000000ffff8e5d6792", "pubKeyOperator": "9251e04a08caefb48c1139482a2e5f0beb695b2b2d0b2250f05af240106fe368b28e96f86a2831858626605856acc1f9", "votingAddress": "3JWJ6g9fgRcUADGjermEHL7AhZS2", "isValid": true},{"proRegTxHash": "33062bab7965a6bb7a097d58362f7e80bc0e1bd2312f2cb23e940697fc93ae00", "confirmedHash": "10fd7e1313262af18eba1a5bce33f2fd7d6527a8d55d58723400000000000000", "service": "00000000000000000000ffffbc28fbcf", "pubKeyOperator": "8c2a7d1210e4f70f5a3f4dd0bd346303e67d75e204e37d3cf84bd26c0231d53bb8a979ce6134bfe84e8dcd4ddb41a9a3", "votingAddress": "3CWq1tjFQQUoLAhXELzYQMvimAVJ", "isValid": true},{"proRegTxHash": "ca9319669df364eecc82bdde2df9dcb15a43b200d834c2381f231cafc9cb9748", "confirmedHash": "ae06cc22cc46401855349ed291205288b41759c66e2eeae40d00000000000000", "service": "00000000000000000000ffff5eb0ebba", "pubKeyOperator": "0a08360b4777ce240cba85b184e214ccd27d712d09f065824f4c9d599a16ae96f248eaa8b46204bf4266a6f27436ade0", "votingAddress": "RUaWKNtAN1ecBppLnU3ZBnTVaov", "isValid": false},{"proRegTxHash": "61c6c16b8eb4712270c025d954ee99106ba1101ba0a55b50c4be2fc29de3a147", "confirmedHash": "8001382290ef7977a01692156b3b206d5a5b96f0dc839a600100000000000000", "service": "00000000000000000000ffffa763f259", "pubKeyOperator": "0936107afd59a0433113ee3d77ef0ed7bc48790f70959460fdcac663f7050b4e48179c68228fe15f91dd6c19c702d0c8", "votingAddress": "2L7S5Un8v4yRPwmS8GKb3pVTyP1s", "isValid": true},{"proRegTxHash": "e77db4c1474ce655e6a7e595f3262ccdd46eb38b7cc8b479156431459d1652e7", "confirmedHash": "46e54be4a94d8d36c0028a82ec824d6247aed6e9349072892d00000000000000", "service": "00000000000000000000ffff2e04d9fc", "pubKeyOperator": "002795bdb9c708229f4b3fdffdc0a079a101e7dba7f0b4c5a57f91081ce1e9978008b47c63129502f4ed06046501d11a", "votingAddress": "Hsff41zuHjiykKmHBuKDLr1YXVw", "isValid": true},{"proRegTxHash": "25e415cb0d38b4d6c4b086e3af08034eb8d8a2c1a8b49e16e8333dcc2b81a106", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b07e", "pubKeyOperator": "0ce3a14571a4f84121526fe37d63660cb3d7640f39b8b3ab6411206b163fb2d3b65f166fe29b30ebe05c99579160b627", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "af86ef600d83d05cb5c673c363b0701a609ce5db7d8d2c15386ad82dd57d8ad4", "confirmedHash": "d57fbac48102742cecb076cb448a36962e291769ddd8735d1300000000000000", "service": "00000000000000000000ffff592fa09f", "pubKeyOperator": "81b32e793df2c5f34fd11de39d2b0071f6e03fed973245fb7ef9dc8755528a50e3310b5ed719a7cff0ae7f55f925d92f", "votingAddress": "4ZkBL2tfDAAnUhGJPm6K9UrBs6w5", "isValid": false},{"proRegTxHash": "419a9769cc1fb0e922bf50a61327dd55d24bef344e2ef7faa2613fb12845327e", "confirmedHash": "92b683438f3e5e5d94bbbdb09159ea8ac752d0ae4b5aaf641400000000000000", "service": "00000000000000000000ffff55d1f272", "pubKeyOperator": "19f684099747288eee8cc152222b0290b16ac2da3504f5c2b2db78a0727cdf5ea92496392674a8a49a9a5bf9ba0bbbaa", "votingAddress": "4AZY6JqKLoHgk76yn6tSjuMC4bqY", "isValid": false},{"proRegTxHash": "23ebb7e579568ad2ecff443e915a51b40c2268bbf405995ea6701e93a869cb0e", "confirmedHash": "fde0ccec59465bfb8d33d867ee82fea34e17639e96c73b761600000000000000", "service": "00000000000000000000ffff87b50fe7", "pubKeyOperator": "0d866b6b063097bc127d227eb19e6fd6a99ddbab999dac56be1b366570cdccb5a0ad477e699ffc20924d79b44de0c9f0", "votingAddress": "3VEGMCbushDh6m6czpq1JDhxq7aM", "isValid": true},{"proRegTxHash": "58af9309f5f002fb065f19fbd4137922f472522107a65191721ab30603e5872b", "confirmedHash": "83ddb9d8a7d6b5f148e04bfa6ed74db12ad505e4027d2a950f00000000000000", "service": "00000000000000000000ffffd8bd9352", "pubKeyOperator": "0bb0dea2d65f9a8a1d635584dd2f7ca3a16231ff9d0573400ec4f273406e85cef2b16e6c405a3e9d770bb98ec2e9cccc", "votingAddress": "3YXYTq2Sok8mDe84VJpWghQvVpJN", "isValid": false},{"proRegTxHash": "190b548b5b78d4b34a684f617b4515cad3588d647d6721d64f71e3c51e04679b", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688eff6", "pubKeyOperator": "1928403891cbc7ee5e9c8f8e6bef62b7ac125cc7c5ef0edba47f8cc6ae5c5b11dc2e6c057a0a55ed583b301ec260457d", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "ce69a8b2089b860f08d2aa026f5323de982de1bb53791b69d13d805b49f12e4c", "confirmedHash": "40626efb6eb8248c253fafae7e84fa5a667395b4af4e05851a00000000000000", "service": "00000000000000000000ffffadf9058d", "pubKeyOperator": "8b3b7d92a0255ffed6f6294aa62abcd1c7db6003a2112c9dcd56b633484cd2fd1ce00c77a1bc291048c5e0ce8206356f", "votingAddress": "2zeW5QjbxVMua61ofJZzQeFdtgEE", "isValid": true},{"proRegTxHash": "2efff1f818d98ee7b6b3ecfc75ae6adf1b90f34d5effdf433a5aafbcc486ea8b", "confirmedHash": "c8de078a0c3365b251d3ae316158cf54798142de866eeb091b00000000000000", "service": "00000000000000000000ffff2d209704", "pubKeyOperator": "1054b3cb64d47501632d239ed4d97d8a0f6a9485d6c46253b57989074544963ac6c38248c87f9b832517528b1cd15edd", "votingAddress": "2JK9qvpNyzwUwSruGmkUbscbQkGs", "isValid": true},{"proRegTxHash": "43eee71f9820d17e8dc30e6017e11995d857f712456c08d2a0d8ae3999eb1b61", "confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", "service": "00000000000000000000ffff52d31591", "pubKeyOperator": "13180f0ca3ba7a83b7079269b06a2ed78e54157cd8fa69a45549f01e0edecd72eb29b27fbbaada27c36b52f110ee4b41", "votingAddress": "4MjjNLFZj3bTfyppT1NAYLRrab4Z", "isValid": true},{"proRegTxHash": "474c50f5a4ffd379854fe21c18e02c8e23b396fa4889998f35d8cb569b90bb85", "confirmedHash": "b05da548604604d278b0507db4abd7583b34d32314b2cb2d3200000000000000", "service": "00000000000000000000ffff52d31588", "pubKeyOperator": "88f60d4c5fbe261711d755224fe19d4661bf94b5f9d8f656267ed38b4cb632795540512390a6f105af4c1f43bc61e2ff", "votingAddress": "4JhhhB5tj54wAHzFQZEGpd4XMxqR", "isValid": true},{"proRegTxHash": "8a6c50d08966564b695c470c5cf5b13bea300b25b64f525ad61337d122bfd652", "confirmedHash": "781ecb32d578f3ede70eb6110fe4833adca7459f416dbc741600000000000000", "service": "00000000000000000000ffffb280dfaf", "pubKeyOperator": "14783f28f2abc7cdc97988f403b71a065b1ca12c627ac35cbd2183d7a38bf47f7986393f3cb6b7b998100ef639ffce65", "votingAddress": "wUpwqHEgRM6kni2BT8QGw7ZS1Yc", "isValid": true},{"proRegTxHash": "832a465779429e0af62bc42c15e1cd64cf78a1fb0c08ae7699125b8c83c7018c", "confirmedHash": "16aeb38ada50ca68624dcda46b7965d844994b336cf249d40900000000000000", "service": "00000000000000000000ffff86d1f789", "pubKeyOperator": "89a965eed764c05994e6bf123c0a23faea7d459d8d6005f1d31aee31258e96a0393fdb29032f1221abafa0d7297274ae", "votingAddress": "2p2hiyxe1BsVTmHmRmFRehv6d9Uz", "isValid": true},{"proRegTxHash": "6945abbdfc37d383dd97da84a59db0ca8b9ab94d999eb9e5fbcd8c7588cf40f7", "confirmedHash": "14bb828d7b93a516bee79c2a5880ef8d9f61d46c3c81d0590e00000000000000", "service": "00000000000000000000ffffa516eebd", "pubKeyOperator": "87f2dde33b6e1b95f5cdf54e4b515256b592b3c102ef5a4f3247d0fa188d656edc17118a991d5310fe2b6b21cc4fca4f", "votingAddress": "3TFSAWt26VAvJWyaF6v6FQVMuTtK", "isValid": true},{"proRegTxHash": "88f12f2a677bb0e272a899c9476778891f7964e800ba3ef9434e4ea52b19913a", "confirmedHash": "6dd690f2a489fe0e3ad95165c5a67d4a0bd6cf598818cc920300000000000000", "service": "00000000000000000000ffff8fc62946", "pubKeyOperator": "10085cd6070ba1324e6864a32d2ab940278a3731411f9f11b0d02da64292f734bf6b18411353f82a8e8542fb2a9d872d", "votingAddress": "3sEYp6uvqzEaSD8bgYaYGVJRDHGB", "isValid": true},{"proRegTxHash": "11e865b0d157b8ddd090c29dad2e1bc3cd018040423db395919c88b9fceb77b1", "confirmedHash": "5b5d8cbe673c7f196095d728833bfdf6c506c7640ae7bc3b1c00000000000000", "service": "00000000000000000000ffff2be54d2e", "pubKeyOperator": "92ded6c54955f8703d83898d4acc3f65edc3defe09f346cc70d8d6e558211089a505e05b18d92ee05c15ebfcdaca7f06", "votingAddress": "4VE5oZqWRAt9VurUkb3naKJoVKfK", "isValid": true},{"proRegTxHash": "81ca961a0cc61717a63ae76292429fc6a121853b2a246ff3cc23a034a9ce57bd", "confirmedHash": "db01e980238400270aeab96ff84edb5e47e0cbbedb00a2431200000000000000", "service": "00000000000000000000ffff2d56a255", "pubKeyOperator": "99c4f345718b89f6801d5bb277233bb18b6f384e048f46cc9769767872428c18fb0b47b1e51c5eb3f1d07d86c3ecb43d", "votingAddress": "2L5efZHtPswugyrFp58hhYmpAzKd", "isValid": false},{"proRegTxHash": "ab1f7ccbaa13d461a39e3086b9cd4584933b9d58fe2bfc755e0041bd64c9086c", "confirmedHash": "f6c92124940cd5268753b926110fcd176ebe80fa80762e200300000000000000", "service": "00000000000000000000ffffbc28fbc8", "pubKeyOperator": "10375da59be88b6faea37e77238a1c83d0ce1275612e0999088a1a9070d12bc9db9893f104571410b5e240538b69d88e", "votingAddress": "TiXje6RHGpdBqfMqQagN8dxGTFT", "isValid": true},{"proRegTxHash": "0a8a387d0bb4631ae8213e9cf2c8c612654a1552942d8a475619b05ae85ce46f", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688b578", "pubKeyOperator": "058d71cd7291de5776e4b8494ebe8e05210d4b27b27b42789e7b171883c813d52e9076a0c451fe40495d4b53b9ff7012", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "6d1185c4df4c5d856fd90d2979d8f2b1a2fbcc0a0eb82cda76d09ab24e427b85", "confirmedHash": "73d9aa935f7e609099a422e0a0cc206f9136b8e6aa9fe11c2400000000000000", "service": "00000000000000000000ffff5f55209b", "pubKeyOperator": "8c981426a2daea29fc4fedb5923b58180a6cd323fce27661a8cccc943fc72e508cbcf36a9361ef59b8fe9afd49a68259", "votingAddress": "3c3nTEnKeFL6YaDVfueebhMPLnxd", "isValid": true},{"proRegTxHash": "a13766e1f6815e3b2d77e1cde68477bb6896e0614ea40d7dd7bad02f549f46de", "confirmedHash": "ee56a186b7e39ada68a7160f36070fc4ddce38125177441f0500000000000000", "service": "00000000000000000000ffffa8775005", "pubKeyOperator": "15c8c598528fba3c0f91f0ee236994bb313139742b00353f426a1454a57f5d225454e4f405af421470fdea93bca64728", "votingAddress": "3jVsKcvpg1ctmnUi618LyR2AwNdp", "isValid": true},{"proRegTxHash": "596d3db643284c80a3b477328ad96673aeaa462c26c8000ff62abf2d94a61c96", "confirmedHash": "e45f49bf01c8b278168678fa6095506edc09937ad19bad2c0c00000000000000", "service": "00000000000000000000ffff55d1f27b", "pubKeyOperator": "0c64500a98caf59af93e3711e818ddc1054dee3fe9c09008fa95c819bfaf36b05333ee6461250ed2e9f988389c7fea83", "votingAddress": "3j3cxV3Gj2bvTAuDYtHumUB5Qhfp", "isValid": false},{"proRegTxHash": "c0aadf25b1416b1331d0b0208f131c2cd24264a6d20d94db397fb51915170445", "confirmedHash": "cbd76d65ade9965ad92931a5e14f60a5c102fb56aba0f20c0500000000000000", "service": "00000000000000000000ffff55d1f147", "pubKeyOperator": "89ca05f9970f3d9343b3665ab400b86129cf2f9e96cb7d68ce5503fb54df468dcee09778fc5feed87a0105493d208d6c", "votingAddress": "g8aVaDDwUtzyvnUCUd2zzQM3pAG", "isValid": true},{"proRegTxHash": "1780037b814aed2df1211e99092e75e0e1a06cec5a3a1d3b19c99fa49215633c", "confirmedHash": "c8a4c02b005ce10b461495f8ab55cb05f568e0d3724948c30900000000000000", "service": "00000000000000000000ffff55d1f15a", "pubKeyOperator": "0cd65d60de99950802c094fc694688d18cb47d41c4ca22e4426467b1325a08cdabab9e4d1b63372608466ff42faed6a9", "votingAddress": "bUEKvsu2jEgq9w2J9ZFCWpU4ABL", "isValid": true},{"proRegTxHash": "ea7d7257414a024b5dce0c10ce62a9abf9421f14b379f096a3b150cdc6affd19", "confirmedHash": "5e2d07e4cfbc772a242f7b14f88a3825a2472711dea038231400000000000000", "service": "00000000000000000000ffff6baaab73", "pubKeyOperator": "949dbaca92b7afd18b7a4e778f063f5debf85cc8b7d91a674765b0f19802fd571c87b4b224db59e368a730b8240815c4", "votingAddress": "9MQwnz111zzXtXj1ChCTwormZwJ", "isValid": true},{"proRegTxHash": "b55d829ca2c8d7ce89a46ee3a8abf13be9520a04bb8308167103886829c683d4", "confirmedHash": "6a5e15a6654babe6fea0a9fc4bd0b704b270dbfd80a776e90e00000000000000", "service": "00000000000000000000ffffd41860a1", "pubKeyOperator": "93e5fe684f64d343c7d2caec33a7004a9517f17f58b0db343bd08823ce4926ddfd424caf4f14a07d5aeaf38523bf3fe5", "votingAddress": "2o6Qc4vVncL7nq2rZ6shqdRjNvSP", "isValid": false},{"proRegTxHash": "54482b56fb9b3be7b17c521620e6fc1e4ebbfcc6e99b84a5570eee1be6c23120", "confirmedHash": "2840bd224b85106cc49a9b090324f00b652d98768a07b8d10c00000000000000", "service": "00000000000000000000ffff2d5575b5", "pubKeyOperator": "85c1c4356318b7f276ebf93b8900d058c451151e70575bc9078e746cb572cc93498ff0d03c0f4d1cafc954befc70c5e4", "votingAddress": "DeP4zVob9gQWSeckD9C4PrKGM3v", "isValid": true},{"proRegTxHash": "e4f6fefeae2edba199c1e858c82556f496d514aa0498fb6a5011bbcd1716b024", "confirmedHash": "69b0d7dd749eb755347ccc6b0b469f7bdfad817ffa2ddc4d1e00000000000000", "service": "00000000000000000000ffffb2807587", "pubKeyOperator": "02344720b330cc7158d4e3f6db7ccba83389aa512aba8179cb1066ef40c5b57f7c39c5a427238033217d53a75014bfd5", "votingAddress": "3ZunEGqFdNwKZGDMCcHokvaC3j2F", "isValid": true},{"proRegTxHash": "e12de3091b743c4add8e21f2c0b06bdcc5382709979f1267129e2749b132d474", "confirmedHash": "926c92598103e4f12bfa8fd8fe95737dc4e6303d12a67ce61300000000000000", "service": "00000000000000000000ffffd4186b62", "pubKeyOperator": "9770a91e47e983c4526d905f37777954a6ee409e345325a39c325a86f2635caed5096d7e3d2dfadf8acc293cd3b1c126", "votingAddress": "4Kzp51HooAP8BeQco9W5ALtJjHmD", "isValid": true},{"proRegTxHash": "7251a2cd116346b816f36d16783babe7b8bcfce584a25114f0b3b151646e6b3f", "confirmedHash": "cb048e1db696a741a4f47b181284b44b958febd9d4ec5a980800000000000000", "service": "00000000000000000000ffff8b3bf38b", "pubKeyOperator": "0675351a17730e04c1a0078d1dd93be4d5bf3d81af4e6bb8f933619a6228381a768613e99ee6f95672809c7c223be894", "votingAddress": "29Y33pXqijxsaq8wGo65YPQ3Wz3m", "isValid": true},{"proRegTxHash": "4379017c5dd6a639afeda48cfb59fff46979f94a4a3f953805579c126a73b3fd", "confirmedHash": "669191afe763e69cb15f46cb2d4cdf08e0316cf02a76035e0500000000000000", "service": "00000000000000000000ffff6c3df746", "pubKeyOperator": "086a99752a3fa409f8fe635124950456337622d04df22e005b32db00c1c5febe2d42e3c33ed384c672d2015f5b7dd2d7", "votingAddress": "3Z589tFzuCAXjE5NMJypNp5214KF", "isValid": true},{"proRegTxHash": "23d09d71fccd176f36b2676c58fc25df48a8536e843e78ea352a4be7dbb27bfd", "confirmedHash": "3b7db457c52714e1fb4ad0c6f29a2d17582eda83fbda5d8e1c00000000000000", "service": "00000000000000000000ffffd4186227", "pubKeyOperator": "9052e9e4e80d67e19239d64c2b90af97a18b71fd7df91e27ecd4b44e1c4988923ca20d808877a9251ce27a7c3af2db75", "votingAddress": "2BjUWobhymCCRR7Pzf9C7e1mbmCr", "isValid": true},{"proRegTxHash": "d1c460f164d911fd8ac051c0aeb4e49a09f2445e59f2fc8cd9a08c54a5cdb0d4", "confirmedHash": "e42ba254551de787a267a90dbd5ed3343e1041e93eac2f8e2900000000000000", "service": "00000000000000000000ffff33534654", "pubKeyOperator": "0e27d7b1ac0a47ee73b58dfcb3740c16a5b9be1d5098b53e7f94e0537511499918d8c229938626fe91b61eff8aa739cd", "votingAddress": "3MjFJGWJ6sy4ipQ663Ubc5wJnXpm", "isValid": true},{"proRegTxHash": "7785fcc344d236b85db1f2450580bbae739059bfed03b27175dd1cdef535a623", "confirmedHash": "2cb2c9d47e145965a4ea9e6cfa6080633971ab8a8727d92d2900000000000000", "service": "00000000000000000000ffffbca6480c", "pubKeyOperator": "99f538adcd12ea1556ee9f590192e35a79bfa61bb4e414f52a14231367384ec442a436fbfc716394fcd241977c28773b", "votingAddress": "pXW4K7H8iDzPTtwSpUQRB8kQkrc", "isValid": false},{"proRegTxHash": "e2640b38229b6afb5ac73a0d798e6dda2dc5ff7d48bf3d6513eff0917f2be545", "confirmedHash": "9493d47aa88d1800be01bb6f771cdded51c02361c006af2a0b00000000000000", "service": "00000000000000000000ffff43ca14e6", "pubKeyOperator": "987161f93802127a3b0fec3c104b4af700ef79955819b611e34a88e5093e84a0a72da5c196a0173e0a884d2f02c885dd", "votingAddress": "2rd9QWQ37e7U672vEUfV11oSTbGy", "isValid": true},{"proRegTxHash": "aff1ecd6e6f0e2b08a5c92c60ca63bba712e3d0728f4fcff241666a36215b9fe", "confirmedHash": "538ee80ad9ffa7f7a024d24a593ae7c8a434cfa9394b14ef0800000000000000", "service": "00000000000000000000ffff4b779606", "pubKeyOperator": "02d5f6028ff306cdde2110649283eb80f49812f8c2be06cf6f8e2be2b87a91192d97d633d667b9364a0a83116dcdcfeb", "votingAddress": "2aehp1voi9T5GGa8T5JV6JqPUV78", "isValid": true},{"proRegTxHash": "b0d306e23183a3f5d6b5022970fc5aa17112ee8eec9c17f50b3af97e3aea09ff", "confirmedHash": "0f1063de0e5fb4f2fcb031872920062b146c76942ad979ec0b00000000000000", "service": "00000000000000000000ffff2d4d3ea5", "pubKeyOperator": "9282ee6e8d024d57683da3638732a5cb30482e6fb72659b3eb4c1a2ebe2f6f7c757259a310fca324cda6540f21617a85", "votingAddress": "3iFcsY2gbmjFAx3Q43x6wWY4AwKS", "isValid": true},{"proRegTxHash": "e23abec439cfe559485880fe21fb862d9747088908fb867f02877910ddfb298a", "confirmedHash": "2eda4ac8508b71bbbe59d25082860812789672f549b538db0200000000000000", "service": "00000000000000000000ffffa747e91e", "pubKeyOperator": "86e5dfba6909a35a123015436f6c07dac86174241b7bb1cc07eb991999d0f47688d29d61f8eb3200182837ee93c448ee", "votingAddress": "GSXWiDQkPbeTBM7oLGJmLR8P8Bs", "isValid": true},{"proRegTxHash": "444d84488aaee6388d85c04fa3f730fd7122a5e2387aed23197699003cd4dd17", "confirmedHash": "add6206aa6ebfe66875d4af4c33bbeab02195617063a748c0700000000000000", "service": "00000000000000000000ffff55d1f1bf", "pubKeyOperator": "15363b4c5aa192e62bd88af0dfd1a84f9da681065aec68c98b44d25319acd283af95700cd273a5c3f5e3d0dae31535e2", "votingAddress": "GhDcjatVKiQ843BXTMDHKZ4LwzH", "isValid": true},{"proRegTxHash": "cd7be284d24ffd03bc93a437738fcfd0941336c5f33f9cd6083eaeb2df2fb48b", "confirmedHash": "fad6eced7f30d897ccf64d8e18304a413c1c933dc83c10b41e00000000000000", "service": "00000000000000000000ffffb23e75ef", "pubKeyOperator": "8d49dc40a0a97feba0254a916278e14a0b8b21e72566adbf8eab368c52ee754f237d49b4a8381dc121df9c64dd6974d9", "votingAddress": "7NbFoUY77tmkKP8ESgUECUJ9FDQ", "isValid": false},{"proRegTxHash": "88e98c65e977519f152f5574ab3d5f074bbb5a858bb0c4c2687cdd465f8b4898", "confirmedHash": "635e82d5edc1ed8210db7e0a5fc2aeaadee08a78450750d41100000000000000", "service": "00000000000000000000ffff50d1e3df", "pubKeyOperator": "86b91b5fca24594a1a4b67259f40f53ace0467d4ea1bbfa35517a8783f14aad8dcdd89d9ee382bfa7024d1491ce2cedf", "votingAddress": "44qu55atoBbVnkVyD1qgMfAc5AtB", "isValid": false},{"proRegTxHash": "8303bb82bd79f1e6721c0c5623ebc4ade5d45b854da2615c54157801cbd7dbd4", "confirmedHash": "1ef43ce5b52196943bb4fd44eec12c2a95155172350bd5120e00000000000000", "service": "00000000000000000000ffff88f31dd5", "pubKeyOperator": "841cedc2796b7e4a2b6d34e39e5cd0dc50336fe558d7f379ad9d0e956ae4803be00b725e66a56e28b31e1003cdd130c8", "votingAddress": "3z4yRuRDFaGsLjBcAaPaE4G15CcU", "isValid": true},{"proRegTxHash": "6e1da5cc5dbcdab2a4b46ae6730643b157a5c50da0db28e45fa719f2baff3625", "confirmedHash": "825ff51efd7ed0fc1fc428520486adf4d7acec61b83d33cf0b00000000000000", "service": "00000000000000000000ffff55d1f25a", "pubKeyOperator": "169a11c1e3ea589125bdf812e700dde3075df32ace3a85417db884054eed84df4d83fbddc30258d45acd3aad574cdc6b", "votingAddress": "3MHbTUHusc3jM98SENBgGsPFZKmo", "isValid": false},{"proRegTxHash": "eab8c4daa2354ccdcc0fc991d9d5a0d4c4457b5be4496faa57b1b76ab24a3609", "confirmedHash": "d9cceb169a1c0f7213fab2f41d2ce1185e8da9bacf40c7200500000000000000", "service": "00000000000000000000ffffac688eb7", "pubKeyOperator": "0cc8c79955858573aa17d280e0f9513f05cc1ba40c9df964d411d68f87c626d28dd9989d8b80c7ba4b8dc8790f8d4862", "votingAddress": "3AwPCfx4b27NjkdQZtVSg6DqXg7Q", "isValid": true},{"proRegTxHash": "0c2679ddf6978a22d4591900eb8e2d9a64185b933750ec2eacd9d234c5c23700", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0a4", "pubKeyOperator": "8a92796edb52333dd8d5fa739d549404dbbb8e6befee983802855516544785c2ebc481bbbfd657e605f45acc6b9c2ff0", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "9f4f9797d22f255c21d5e466372380d652c183cc1db18b39edb9260e18f3a1d1", "confirmedHash": "8bce56059cf3d708cc94cd579c7f700ddb13d89d3c73176e1b00000000000000", "service": "00000000000000000000ffff9fcb1dee", "pubKeyOperator": "0a06e6025fe67e6a21cf0b9a19608a891aff1cfc2baad41bf85477897c569daf5b60ca99abae205fecc34ce5d34498ae", "votingAddress": "2sVSFbXcYSj4nbt1RT6CtsWQSjvV", "isValid": false},{"proRegTxHash": "03cd66f063719954b26eb7774ee6c7ec2c20fce5238b4f52efc2d9e99d7c47fc", "confirmedHash": "2db50aa143655d2cf608f57c758916871e2701a67d34b25e3100000000000000", "service": "00000000000000000000ffff52d31973", "pubKeyOperator": "128d88fb4112df42cfe027cfa0e63185e8d1521e1088ed8e0a93b98b38a2b489fc2563448f80a9a52e09afbff8a66588", "votingAddress": "2GNEUekNPuvi5cxmtT6HvR7iFo1F", "isValid": true},{"proRegTxHash": "7e9b04e13b54a116cec72b496ddee0d8dd38333f5842617fc5847fdafbb3ae17", "confirmedHash": "44a8b66ae650a39e808c8ce4c5037afccbb221da70a587f60c00000000000000", "service": "00000000000000000000ffffa5e31c5d", "pubKeyOperator": "90646028ddbd14cf1a1ce82ad08041f5348794dba8ac6a3a96f2010bcf8d3f75a259348ccc1f2ff96dbf3d35d7c2492b", "votingAddress": "3fFi8ogcJZkkYQvNe2RdBVNi74TN", "isValid": false},{"proRegTxHash": "9ae0f826e32f593de9b3ff2b8de9a1a264e69756fcdcd698d4e64640ae7866a4", "confirmedHash": "9df376d216b7146f91715b110da64623e2841dffee92427e1600000000000000", "service": "00000000000000000000ffffb23febc0", "pubKeyOperator": "86a43c13aeb07f359bdd56a7a6eac540b1d6daf022f6a1695f35dd44a1e19fdfb6756cb8be59700198bf095cf919172f", "votingAddress": "32wZsgipyXcmye3gyrd7THDPMBns", "isValid": true},{"proRegTxHash": "5a028acf7e54f3a68e94e8ee06ad81b227c42d49b5abd14ad16340a23a8cd0a4", "confirmedHash": "3adc4817e389a6d06afe3aeca70c61b3d8cc3452fce7b17a0e00000000000000", "service": "00000000000000000000ffff2cc1beb0", "pubKeyOperator": "82940f5ece9be208a6ce86c0a2bf27c40e697a26899e1ee2b8e5d4def3c466fd3a2e471503507e33e36e2b3d89025a1c", "votingAddress": "xo2o6A7wNRyBm1jsj6gBP9giX3p", "isValid": true},{"proRegTxHash": "727ba01db566513549271bbb964982dd829921d4d049242fae7ab1de13cafb85", "confirmedHash": "5cc50d30ddeb3465a323285d5a847a41ea6d4989a68d206d0600000000000000", "service": "00000000000000000000ffffa123447d", "pubKeyOperator": "8d13ae8c9c881751c934766fc707e48eb04d7b4afcebe7f7c6674ba294565a109c0e247da5ed7b9e6413be7f51ba8bc3", "votingAddress": "3dHYoUhoUYEm9cfHJuiXGSXFxAhB", "isValid": true},{"proRegTxHash": "a9cd51ef1e8da77cda90acbd87e4198e1f9a28f381d62a8f4519879f2f4d5af5", "confirmedHash": "4027797ee4c5177a9cf5209b80946189f5ae598d960711a40200000000000000", "service": "00000000000000000000ffff05bdfd41", "pubKeyOperator": "147c4e31362a6f9460af4c822ca8b32dd365579c4d5975b0782e8ca6f97bb27a9c322c1fca74421eb24b20006942eea2", "votingAddress": "nz9PGQof59wQDim2tDjHfkthL3o", "isValid": true},{"proRegTxHash": "a4ed6468ca713ea3752c37701eb1bfc3afe8445d37d3be6bf364ab42d506c1d8", "confirmedHash": "4625271a9c1ff80c4a0349516c47ee5d0e68daad4a28fa780300000000000000", "service": "00000000000000000000ffff36524cdc", "pubKeyOperator": "86fc525c0846881d1c5035451e9955bc6493718273acf5b8a31cc90a7bb0f2cedde667954855f1904042d743784fbaa2", "votingAddress": "BVfv9n6BuE6cthptpdAUz3dWJ6T", "isValid": true},{"proRegTxHash": "22ce2e5fce17c631de6baebd11533633a12ae980e15fbc5e527883cc4d822d00", "confirmedHash": "6fb26b20cd97d93522d3a22acd575f7cea3394180f72a6f61000000000000000", "service": "00000000000000000000ffff9fcb04b1", "pubKeyOperator": "029f8216787cf28e5bf9b1ccc1dc439dd1f6d381e029d1b432d083b1e46870f14f1f831c0346c41a280b3e1e5a883db4", "votingAddress": "wH2cgQy3gqRvppidyh2mEH4nwRe", "isValid": true},{"proRegTxHash": "606665885c556b6b42b07cae28de6b86749a0dc60e99d60687b1675550e6efa6", "confirmedHash": "4625271a9c1ff80c4a0349516c47ee5d0e68daad4a28fa780300000000000000", "service": "00000000000000000000ffff2d209f30", "pubKeyOperator": "88dfa4b1b0be528f687d516a76a8597fbfcd2bbb787f45160608d0ea1b103778be1fb65bde20ecc8d6dad2aed52ddea8", "votingAddress": "FT5mXXoGYx4MxHE6k5zyJCsGkoG", "isValid": true},{"proRegTxHash": "670a15894302f0ac76aa2152ced98372a463a20ad09daa8bb8525e78266a2e9c", "confirmedHash": "c1ec7a2720821ab6952c9785b30cc79a8c2df7cd52d490901700000000000000", "service": "00000000000000000000ffff453d6bf6", "pubKeyOperator": "88eddd803b13ee7c00ca3b791e10d8423009a1655b562d59fb5a45c3c2cbb133c0e18047049718b1a6703c89b7e09364", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "d4fd1a59e1e98f81dfff6beeed50297867e5577c89f432eb1a3c02a4767808af", "confirmedHash": "42877aa643545c02cc6dba2ea7192b576e94a6ea12093d0b1c00000000000000", "service": "00000000000000000000ffff2d20e4a6", "pubKeyOperator": "1917a7f645d164261da286b035bb259351889bd142d9279ab8ea27c311f0333fe6f201e86c9197cf39af987a07090d71", "votingAddress": "bFLpk5dr4xiLgDqhqKp46gLNq8C", "isValid": true},{"proRegTxHash": "c378498e6801bfe113b75c205c78edf5eb2dc6f15424273dab33c5141fef0383", "confirmedHash": "11e67de627963b100a96d5825518281af8c9c75247d3f29f1100000000000000", "service": "00000000000000000000ffff8b63ac05", "pubKeyOperator": "0f9d45d32da4cfdcb65e36d51db82c2f10a59a3fa5afb3ff8468657cc933d6df1ef20d04b32f12a01c0351114258f38e", "votingAddress": "4QGdH7tpEmzPdBYaYXax2ic7SuLf", "isValid": true},{"proRegTxHash": "f18410d8a2a36d411b8a9ef60d26e3ac96fbd5b0353f2342d681f47ae896a907", "confirmedHash": "c7751d2b69f0a1a69ef1d34eb4f77ccbae7c56503552bf811a00000000000000", "service": "00000000000000000000ffffd4186c1c", "pubKeyOperator": "82745da7c370aa420e03f4a3d4e3959e1a42bffef43ae3cc00c6618838d6c6cbd973e4a30ddd7a8b8a0cdfcc41166fbf", "votingAddress": "3A53DLbK7NnbLB7RuNQE5LfX5Wvh", "isValid": true},{"proRegTxHash": "089335652cc1395f6638a6b91f0e63622ddfee94e823988846f5e8a1c4e83bf0", "confirmedHash": "d5871241afcdc83cd4015a9c7a5b6ebbfadc0ee86b59cdcf1500000000000000", "service": "00000000000000000000ffffd4186b8f", "pubKeyOperator": "07f7fe2fcae18e6e300ee6ebb74137047cd096acfec984a7342324f42bb8e68915ec9e340df1e76c36ab31269ce10058", "votingAddress": "24hH99AfYcrrYTGV2RCd2ta4gddH", "isValid": true},{"proRegTxHash": "526de93462e2f55c0aa65a6e8bbc3b8be670391c03ba3ebf1ed6b772c3b28aa6", "confirmedHash": "e3c35885ac9a51cb683c576ee4c036a9b2a4ba467a4270f70500000000000000", "service": "00000000000000000000ffffb280ed83", "pubKeyOperator": "11f5d323116406d76c56a0cc333e34583bde4a5811842c0c3435963a69b51124c05eff85ebc2c45674d00c0cf392f2a7", "votingAddress": "3u99QETF8c9cjhGq5A1ADR5UmNc8", "isValid": true},{"proRegTxHash": "132bdaa7c11cff5e7c02d2a7c42bb3dba80a2a13ad9bd3f7e838696744680693", "confirmedHash": "aaea3443f7e3bcfe882e04f996e5a78c2451cbe0bd8bc9710300000000000000", "service": "00000000000000000000ffffbc28b487", "pubKeyOperator": "18d67c0d8d34d52453287f952cb486e67d053735e54b9dbf5c7f8800c438dbdbb6649fc012e01dbaa9afaafb6238bc6b", "votingAddress": "2PxBJyNdrW3j29EPqcQeG995b4fF", "isValid": true},{"proRegTxHash": "cfc172d6fcdc17cf098dd3a59c1d4d4fa296f413946424b6670b7fc340d1c0c8", "confirmedHash": "83b4d3c9aa2503f44f202247be69202816f45498cc2040950200000000000000", "service": "00000000000000000000ffff05bdfd3b", "pubKeyOperator": "0022b5b5eda7f67a6f9e48433f3fbcd11c513d48d7d43e163b55b5dd632bbfe45608cc525e0216c60a38cbe23f208008", "votingAddress": "c89ZpectfZSva74Gc4E6Cvn7poG", "isValid": true},{"proRegTxHash": "8441ce08b8d4830d2bb2d75023dac2a3dd339a14bb2c142e355758aba9553a58", "confirmedHash": "7f20729c0e154be68709cceb13e0c4bba3fc93baed9d49590c00000000000000", "service": "00000000000000000000ffffbc28b48e", "pubKeyOperator": "896534a7f0035c819d1dd226fbe769f24ef62d15cebe9cc1a28a7509d4a8c9970ab3aa8a383f18a7c48d056b54dc6b63", "votingAddress": "nY9oGF7GSVTdCu8MMRoPfQU5BVU", "isValid": true},{"proRegTxHash": "cffd24a8c7560e9b6748020d986593a88c99b3df87837b59ea47d5e0a5887c32", "confirmedHash": "966346da385a620e18cc86215c041dd37ba70220f2ab9fc31700000000000000", "service": "00000000000000000000ffff52d31974", "pubKeyOperator": "0203df62c526c1fbe7f260f2b3af2b916fb937922a0937def904a24c2780a028949050c8afba849c71d238ee659da341", "votingAddress": "3DKP8SwEoYyKP3WpwknbgxyCumdc", "isValid": true},{"proRegTxHash": "fb597c77c0a273a67868c82cba50411dc206fe6f186db0363141b9070b6fbde1", "confirmedHash": "94a6ff7ca0411c6b5e5127183d0592228c2ee34cb94afc0f0a00000000000000", "service": "00000000000000000000ffffbc28b848", "pubKeyOperator": "10c0c9c4f91e5f1289875eefcba39727d29870ac9e8cb955e9d7f4a4e5e86a4f47af57214a21cffcc6e7c8781f87630f", "votingAddress": "3p3sS8cpLB3uqDF2w6bngF7x2xXc", "isValid": true},{"proRegTxHash": "1a0e52d0377f1d795aa5dca06ec9962c86239a7b87096f3f75b0b561845db434", "confirmedHash": "4250f5c24c0dc71af36d2980c920b6853f6792d2a8b826c30700000000000000", "service": "00000000000000000000ffff87b50fe6", "pubKeyOperator": "0bd6a63f121ed0de1eecfb76f637056eb9cc438140f31c87a36cb510fce475f9b0d2fd9da6e2b99ba267a146ec67eb4e", "votingAddress": "31B4Hiy5gVL4e9jnCDSSHSsUZLPF", "isValid": true},{"proRegTxHash": "bb6b9d92aa4eb6c7ea108a18093b5e52343071f4506721f75d05953aadf9500e", "confirmedHash": "0991a439c9688207a7bf3e8186d9cd189bc2e33c47a637fb1500000000000000", "service": "00000000000000000000ffffa123f74b", "pubKeyOperator": "16d48d6a7b565eaa2054ea3e1a2b8080802308c0c019d25a2c5d1b5014d4ee455d7fc240be4a542809d768509d449615", "votingAddress": "3Dq61AYwzexDixpGRZcztuJuNGyS", "isValid": true},{"proRegTxHash": "2fdd0466e65539a82e224c2ee16162552e96aa553d699aab904a385f00e73977", "confirmedHash": "e231abdd51ca5fc496cb155db8ff65d65bee197cfa4fff7b1800000000000000", "service": "00000000000000000000ffffa5e382c6", "pubKeyOperator": "8a6be7837e2dc602a8187de21c44925b81460b6b4c44b85f9fb5fb95ec456098f946144f59daa4e6eac3122ae2b858bd", "votingAddress": "2cVeMXvfDzUXSwbKTdgRUzEtzypr", "isValid": true},{"proRegTxHash": "010a98007db226da77b9aca4f0c1a1306822ff0656b24810faa777fc29a22649", "confirmedHash": "18890884c84e798819fe59260a9e65d8f6fb413b8f006d440b00000000000000", "service": "00000000000000000000ffff59280e9b", "pubKeyOperator": "14ebd8d9d5b9798375c879f9fae5326834f74fbeae476e9a852df44d91a9fb102b46dad7d66b2579b2207678675e2423", "votingAddress": "35mcQS7owE2ACtBXHvqb2vZWZicm", "isValid": false},{"proRegTxHash": "b03a90d529e77f3b042f3b48196615fd8b390c1c95dac0232796d645eba4cb8a", "confirmedHash": "8bee506d011c02745cd92c841f29443a5fcb6561c880c7090000000000000000", "service": "00000000000000000000ffff951c9323", "pubKeyOperator": "0f3afae8c4783163fe2d04ee024fef55edcdf4af529c39f9212cb6173687d2ecc15b99642e9cbeabda5d81d0d30d99c6", "votingAddress": "2TJmcbY5ReAVzjYQhrLq6T1MdjLh", "isValid": true},{"proRegTxHash": "7bcb00b6e1b01df18f58d6a4195eb220d07c6b981f9314e7ba846c875dee6a60", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffffc17a8ea3", "pubKeyOperator": "82a244a844ec983825090a3a8e6deab6df728b8ad39c86e05d3301af0365aee21e91662a494b50d8190a2508ba4c8f14", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "669af58246bdb628f927a12d4491e9bea673f412f04a85bdcd246c592b244645", "confirmedHash": "aef6ce4203bc3d19e0ab00bf4f1ea1178ad5094bf30cb7052200000000000000", "service": "00000000000000000000ffffb9e4537b", "pubKeyOperator": "05b998954c2682f4d1e7aa164e053f965eb20567565466d124691f16b9d7ca438195558fbf48ecdd2c53246a84fac79f", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "d8544a2d24b3eadb7a5af2517f72d802c3ca8ca737762fe2ccbc8d80a0a95dee", "confirmedHash": "0f8bcc059b44030dbb864989e2b139b063259d60db4b65860f00000000000000", "service": "00000000000000000000ffffb23e21a2", "pubKeyOperator": "11a17a6b6f599c0f083840a5241a8f0dd4e33e0dfbd57b79d47f58892846989293904c1be7df0829e55e56d681b74399", "votingAddress": "2PMCXEuwhsnAfBXWfpQTXsNWMkth", "isValid": true},{"proRegTxHash": "102b20e67ed2d18eb05e039c24d300b11bc025b3b876c91deb980fd5705a3839", "confirmedHash": "b270c666cb15f8ef460233c933b212241eedd1812df6968c0900000000000000", "service": "00000000000000000000ffff22e3eddb", "pubKeyOperator": "81d82ca38fc62f61549ea713437308af3e25b7ccac3cb87d1fd332ec22a65113c11723078d3f0159f8cf8c4b3e0728d1", "votingAddress": "2Bt9cWyh5YtJ4TdL2oK4oroqsJzS", "isValid": true},{"proRegTxHash": "7d34fc7a4022520c3c7a756799bff1ec1d8750d4bc7e75406237b20508b4de2e", "confirmedHash": "74986140e7c627c32a6324c5606cdd5a828b4f52d24c1ee20200000000000000", "service": "00000000000000000000ffff36270a6a", "pubKeyOperator": "0d704e15b519dd73ac7e7e6ac1d1ab07126a6c40dd432b984c9c3cdbc2352a941022b3bf769a68b4c4fab45697fbb655", "votingAddress": "ZSSm4CbSnnActN6RUT91CmN3Mbg", "isValid": true},{"proRegTxHash": "3b622231ec1460d17244b1e9c640b622f28141f06baa6f2627a3d7f97ebfc2d9", "confirmedHash": "dca043a756c49462f3609604abf66e55ea501c19fe956abb0d00000000000000", "service": "00000000000000000000ffffb23e8105", "pubKeyOperator": "965a7414e82f6f5603c0def8fc07eee3012e35a325398a0e238f16dfd98ab57301133135def3bcb68d2c2b2499c34674", "votingAddress": "33EsqrbJfnVzskD3iSfJn1myLL3", "isValid": true},{"proRegTxHash": "20b498d4700c2670115ea767e67e57e0fbbbd90ba8533b4767d02df84d1dce4d", "confirmedHash": "b305e3e1b3425d5b6d4560873a7dcb3f66df0bed794dbb920900000000000000", "service": "00000000000000000000ffff44b7c8a3", "pubKeyOperator": "844596fbed3dac8cc117603980e7929af1c06e6315559c2ef166516e4fb7c019d28c10a155bd3075aad8e12603c383b2", "votingAddress": "3iRQGfhk18T7DisSJ6w9L89FiimA", "isValid": false},{"proRegTxHash": "3592b5dc7ef3a06159cd6830b1c65e0c6225e4f5b4316706751e5910d588c559", "confirmedHash": "57773d0f254e4bd82c9b97d37b4c8cfd45a27eb2cb4feba70600000000000000", "service": "00000000000000000000ffffbc28a318", "pubKeyOperator": "9603f5ba6cd2d13ca3d031c93f3b8dbcdbe4003c7c9d553ea6fa58b92b8bf1630f6d7d6e956a59f58951f0e887c8a71a", "votingAddress": "2YaJcZPJXmkf7e1X7TPNkKuixN7A", "isValid": true},{"proRegTxHash": "43c2c6bcd8e3773ec51ba8db24fe0dc731fd9d9f245518c6ee18d0619175c3f8", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0c2", "pubKeyOperator": "03c50d169a9f36561520147b7ea90b2277e038e5a1b60b34fc6339355ba112295b1c0e4b065d9dd29ee41abfae6298f7", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "480575dc91812ed38f08f138eca5d79568c27bc859298b69007284778463ef10", "confirmedHash": "9ffedfbb72a276b6a1d6d076250cad8920a9664dd4dbe35f1700000000000000", "service": "00000000000000000000ffff68eeb4b2", "pubKeyOperator": "0e0ff20903fbf97566ae53d3b2f7988d94d65acb786ef4437ed8b51aa78f0578981f9d84bb9d7465f7524588efaa3b9a", "votingAddress": "4Yse3EFySdvq3jf8iSX2tCZJExif", "isValid": true},{"proRegTxHash": "7fa948a3e1fa27d292f7635c82d5cd5f69350c75c6a0e057061a045d7294f0bd", "confirmedHash": "deea24e962fac02cf223dd40dd3f1d84e4375d0d51276cb70500000000000000", "service": "00000000000000000000ffff87b5322b", "pubKeyOperator": "93d761efc4656d60dd3fa6d7632ef67c13211afae37508e3a89b4e5ab487b680a94624b915dce1a407c372cb317cf69a", "votingAddress": "3xa5wVyKbSFVWe3q1tMcV6N7hvjv", "isValid": true},{"proRegTxHash": "243e6ad48e20997e72eb9accc92691809568b03b0215399314ccf5d9bbc35b85", "confirmedHash": "76024936649ee232a118dbffddf6e40a2f5218b46b2eb7561200000000000000", "service": "00000000000000000000ffff330f60ce", "pubKeyOperator": "16f53e3f647722ec64a75fe80ef6c3914343e627af6ee67b181a8c720dc76014ad77b387b68c445319d7fa2dbcb9af49", "votingAddress": "mwzmGe7xkkFwTS2VQ77J7FDjnPc", "isValid": true},{"proRegTxHash": "1344929a0a7de169c8d48acc39e1bc129b4f995f3b85e471d81b0442ca6a413e", "confirmedHash": "f50a3d1017b4c38182daa544d8681fc33f9872208b1995213e00000000000000", "service": "00000000000000000000ffff12d66cff", "pubKeyOperator": "084b68d0319dbd22123507936a5c19899ee2efc190bd50b21c012f83d2fa31bc35fce12da8c904191764ed253caceacf", "votingAddress": "2Z775PP9gddCaA8m3HxyiRv58bUL", "isValid": true},{"proRegTxHash": "864c27314fa7a5221ee2fc4b2d196368129d883c6d7ce21ee2cb3ea79d29e9a1", "confirmedHash": "2b9d059a224545188853cf512691fb6281dc6d5bdbdbe8ad0000000000000000", "service": "00000000000000000000ffff5fd8ff41", "pubKeyOperator": "08484b078a720aed2000a1272e133c6ee6f36b059e70949271ec04d6ebc87970bd13c288f2905cffdd44e2b32d388504", "votingAddress": "464MciR1d77tkfU9DNkrvBPonRzF", "isValid": true},{"proRegTxHash": "81f3061926db4769e846cfdc40ba43a95df91e2a1244276c404687cdae83996a", "confirmedHash": "dbe229922504c8112cb382f386efa537412b37447e1ab6481c00000000000000", "service": "00000000000000000000ffff5eb0ee10", "pubKeyOperator": "0e7e5a1f72524c3bab4d7990a27af8d4451a327109549d876ec522e22305cadf80c9ff0f74d1a200dbcdb1376afd34e5", "votingAddress": "3Lzp9kESQTd8pv7ZNsfWUj5w1mk", "isValid": true},{"proRegTxHash": "062165823445bc0a31a3d126adddcc74bd95e04f86896c09109995da83f982ce", "confirmedHash": "67d290c14597bf72400ecbf2016e6baf4c7bc940e6f269331800000000000000", "service": "00000000000000000000ffff55d1f109", "pubKeyOperator": "02144e2ce67e304df7626768ba89a71f5e7328a5d5c3b511f4e7d3f557850d25db6cc0de9d10b54b7ad9096e882f95d3", "votingAddress": "4Eyn9QAHSyTaijk1BS5UrwsbZc4X", "isValid": true},{"proRegTxHash": "7d1bb1e605e305054b9128efab8a05d7cc418354247efef8e8ad2fbf76e2535d", "confirmedHash": "960cffe0dd7c1e3710e3804bbd1acab302ef47ef4928be221e00000000000000", "service": "00000000000000000000ffff52d315f2", "pubKeyOperator": "03437877af6b89c0305cb891dd31d009d8257572628c1da93b2e2f9b4ee5eac1924613d43409f8b3d267e24bca63ddc9", "votingAddress": "dBDdGKMAEhj12mUjQ8bxEL6dmmn", "isValid": true},{"proRegTxHash": "c23609416deb364adc181d002f0505ca1f3a0f4f57fb5e7ac60cee41984db97f", "confirmedHash": "d62e3d418e6b079e8c4251f619b40ba73bf3dbac672fa0481000000000000000", "service": "00000000000000000000ffff5fd85426", "pubKeyOperator": "8b1ddf47783f55e312acff4428ff2f4e8acdeb03dc954f96add8024da46f3e29aed8f06e9e86cec65e0cbdbf04878325", "votingAddress": "2CFym3buNEhLJpbq9DsRQ3PwxgrN", "isValid": true},{"proRegTxHash": "7e643fb6e9b2c5bf3daeba00c3975ad8284295d8d6ab39e7cecc2054c0d6f85c", "confirmedHash": "a6873a5c3509b76014febd72d67def5ab45fae75f6586b101800000000000000", "service": "00000000000000000000ffff9f410491", "pubKeyOperator": "0a9772dfbe8584e3d37461deff4c156153e4b77f619fd39577826ebbec2e6fad5eed12cde02467f5a490caee6900652b", "votingAddress": "1fe4pcrwVry25CWbmCQnKViSnBw", "isValid": false},{"proRegTxHash": "96694ffa70b9b9620a3b87e52fbef2c13cf1bd89f65ae5a306cb5071234c0a20", "confirmedHash": "21fa64eb92df4a915214be071ccaee5d6994cd7a005201050200000000000000", "service": "00000000000000000000ffff951c8fac", "pubKeyOperator": "11d7824e73537c60562754312232d19c98a0a9a593e541388ebc0b3b58cde406edb77dd333b8f15330dee009f3270ff1", "votingAddress": "3441EXcPi6qnDCSAKzQMV1BBEiP6", "isValid": true},{"proRegTxHash": "f1e2bb62ee31cee9b1dd1c497bed14e3fce85063db87b6b596bf84c9a62a82fa", "confirmedHash": "34893aa3efd639e79544d7e3150976135fbae9078d33c4270e00000000000000", "service": "00000000000000000000ffffb95cdd3e", "pubKeyOperator": "8619d08dcf93e3973224ea54ca73ca3143558d8198e6f99407bda828faf006c8032ec89786b3d2c658ae841a02f796fd", "votingAddress": "3ZFFqzEHWgqzJv112CouZXKi8wCG", "isValid": true},{"proRegTxHash": "b924f4586ff85a5dc17f26c2070125f712fed720b313800cacf0a1f67ecf01e6", "confirmedHash": "0971cee696fef9a1024366606831d22cdcf29265d1a200d10700000000000000", "service": "00000000000000000000ffff2e04d9f8", "pubKeyOperator": "8e4a4d29010b289dec82e4fa0be6da08c11c11001cb67423387f98b93376c2d7bb5532177bfca35cb446d9efc55a1e81", "votingAddress": "pB3FLsjYPQW3xoee1R3JJFTQhFH", "isValid": true},{"proRegTxHash": "75aa565b159bc0ab20fa68ff5d2e4b7fbdef3d0ca53176718a319784c478d5e4", "confirmedHash": "1f2a5435c84bc3d574ee7919647a94eaec4088b82fde19821a00000000000000", "service": "00000000000000000000ffff95388ea6", "pubKeyOperator": "841ee3b939d93e89226cb383d8605c50653632c6f55f12ea6b6bf00e9a366e2693b31fa761e06dba9863ed2f9e3f5704", "votingAddress": "32WhWMpc8i6WLpXkW4gfc5a7nN2d", "isValid": true},{"proRegTxHash": "77196a2479a9d16375162b6429201098753fe4673dca5c2a42c01900303470ba", "confirmedHash": "ae75017fb84c29becddbf1a44cc66fd8dc1d203b3f476cb72d00000000000000", "service": "00000000000000000000ffffb63d2081", "pubKeyOperator": "0549f540785a61e28422f3f9834d089d912ad87d20f7ac363f472e9e81a5b0cdda7865cbcc693aa5e44afc655b579479", "votingAddress": "3JiptXYQ1oCoXLsMf9bPA2rXdpqu", "isValid": true},{"proRegTxHash": "6ab0bb6290e526fbe1291bfa0a0a8db829937ce68f48195494d2c4ba668ab8c8", "confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", "service": "00000000000000000000ffff59280b5d", "pubKeyOperator": "0b45d48101cff48b30639f3a7925df8d350e704d34117836ef92b1b314aab0330496ae481983294d6d064bc2682894a2", "votingAddress": "3Zf2rTYEyiinXqFHvxQRPpgSo44Y", "isValid": false},{"proRegTxHash": "7b4dfca69f28e0c92afa7759f9f76d52418ee8117a795dc04318f24e486dc891", "confirmedHash": "c4ba48288cbce8e7429586f8d6b4acc8538933c771151f900f00000000000000", "service": "00000000000000000000ffffc034a6c9", "pubKeyOperator": "14a8170894c742076a13cb8a7257920e138858c1b40b9a0f255cd5a36e822172506f60933f79a88909511e78afddcde8", "votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", "isValid": true},{"proRegTxHash": "da765a67587274b796687c0282dcc715386a985b696bef5ca802200bc3f00da9", "confirmedHash": "f95d58e237f90d5bf906336283b059e02687a467f1ce27b71a00000000000000", "service": "00000000000000000000ffff8ecacd64", "pubKeyOperator": "801c23720228845c52efa1bdc9a0fc0273014cc2c6b5bebeeef04447792b29cb4096ac6ea85714ad1029dc3cf3745a64", "votingAddress": "22qtbvUZz9LDpJSdpS3ZZxV5YkgR", "isValid": true},{"proRegTxHash": "031552341ac7dc146e22054984d5427fa7e565a0812887bb5db9b3d056cce977", "confirmedHash": "f89df141473b15efaaad9ef3ce8a222defabdaf194de820e1300000000000000", "service": "00000000000000000000ffff87b5322e", "pubKeyOperator": "8b8b3ef3d6cc9cea91c2733dbe3559c81d831ed55002e0cec5befa6fb47cb80f465efda003b8a994eb24f818db0288e0", "votingAddress": "2vM82HhkC6QM4R7scVtTHdSdJCcb", "isValid": true},{"proRegTxHash": "003cb71151e04f66b5f11ceb43d99846d75334974056b4b229698a48f7fd980e", "confirmedHash": "46e54be4a94d8d36c0028a82ec824d6247aed6e9349072892d00000000000000", "service": "00000000000000000000ffffc28755d7", "pubKeyOperator": "10a06fdd00f1d15e7399e77aeb9baf5a1a37ec8da37bfb104fef4a95523a78052b29994b08c34e5f61b1264bb9f73c75", "votingAddress": "4MLQpYCt3ZXypETwZxdq5hJmF64M", "isValid": true},{"proRegTxHash": "ce7c1e27374f2d4dfb734d8fcd1f4994defa00e2446814158036cf7efde3a356", "confirmedHash": "3a7cf5edf1a73e23173fbaa885a6ac1ca1b33c0d306511022700000000000000", "service": "00000000000000000000ffffbc2815f2", "pubKeyOperator": "96ee4ab7bfd67ba1a334ebd6960267bfd765f8e115f04cf58007c9c94bba56114c81a4a7be4d62d55d1a160aa3db29ab", "votingAddress": "4grgajzs9pCpVRDL741KHNAVHSX", "isValid": true},{"proRegTxHash": "fde007b734439f877e9e0cd5d0f5137ca035545cfad2d4b34ba49c30f775efbc", "confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", "service": "00000000000000000000ffff87b558c4", "pubKeyOperator": "952767e9cc72a34897c8e2b6ac4edd115cb4399af1fb7cbc01b0d1290a37b4ebe8ea2d12784d43f3213fa79c10f8c191", "votingAddress": "3TyqPwKQSgaF2gnEzQgGMNvB21JE", "isValid": false},{"proRegTxHash": "c913fc8d3ce65bcd5ec631553d89b35d5965f35f1f01e6d8a2c8a697257002d8", "confirmedHash": "d789c2e8f6c781ed98d63b3df186ad83c8baa18fa3e391180400000000000000", "service": "00000000000000000000ffff55d1f243", "pubKeyOperator": "174c80f78058076fe35a61aa1c1ce6711907415b8978e079112a9e6f7cea22cd504d9271e07aaffb42dec63e6b00cafc", "votingAddress": "3rmvjDzqi5gJ2ezGTkkmJE8YDFFr", "isValid": true},{"proRegTxHash": "5f25bf5c2fa7e6b7a487ce292d6009aa91ab5a2efe086032f6fa9295aacdfdb9", "confirmedHash": "ba2d8dd2bceeb3e6ed4225bb97b91a71893385f8df2892a90e00000000000000", "service": "00000000000000000000ffff2d4f1abe", "pubKeyOperator": "8d0298b226be199f548c2f6ed008c3890db9623645b8fd237068e3bc92e83930dac9e11d29685664e63614cc290572b0", "votingAddress": "4J4ftLTfwN3XvhDhGGAAaJyf9qQE", "isValid": true},{"proRegTxHash": "f09fdd4b3ccf46b2ac5df9e3f4b85c910a3bc9b0c5ca61a5b295953012a42435", "confirmedHash": "38b7762f9b7e4a5d4c0e5fb1ebfd85642ee257f6d9e753be1f00000000000000", "service": "00000000000000000000ffff05b532be", "pubKeyOperator": "024ed6b915a98ae15353188e9112f8b8eb9bf23c8d930072c27e2369432816413c6dc85110d595dc891537a133542584", "votingAddress": "hLE9Ki7XGejCGdKYVBa1XnWaQVc", "isValid": true},{"proRegTxHash": "b001cb96503c5b3fd7d3182626dd5a69e32946d1519119a980fa9888333bdd7b", "confirmedHash": "93ea7981cc47a40e2b3a3096f688ac70c4ac96f89b2d24e90a00000000000000", "service": "00000000000000000000ffff2d9b7944", "pubKeyOperator": "0d92c800c4c52cff9e056e512927919586b7031dc97fe0444f0497d246be30ca28121dad81a4e442633bc6ccbe07b625", "votingAddress": "Eau1gSu4Mi1PGgRYZY1KsBkSp6b", "isValid": true},{"proRegTxHash": "0bac0343a3cb8e70dd9b039b29e88a2e131a0ec95e1bbb90453fb8212ccc0fd1", "confirmedHash": "97fa3bf9eeae1f90cb53e7f8f7c5eb3d3321a1b53974049b1f00000000000000", "service": "00000000000000000000ffff52d31545", "pubKeyOperator": "921958278157241233fe7e816d06c4bba25583a108507c691d3ee45e3a7231a5606c31161c1c32614f74deff608690d9", "votingAddress": "3eKcfiwfuFsKkQ6qn4YRyFzZoNwn", "isValid": true},{"proRegTxHash": "312601303508e3e96f2a96ef98b8ff3e8752aaa85fcb09e967411ba3e1ca954b", "confirmedHash": "59acbf2f5757ab5c7f7588df0aec32b58542c06df1b91aea0400000000000000", "service": "00000000000000000000ffffa763489c", "pubKeyOperator": "829276b104d078f3a89a34bd8ee7623fdc9d246cb90ef450936d9654de5d2f20a5ba7b9a70bb0deb23dfce3d6d863eca", "votingAddress": "3sSgEF3ej7tyMJqrkBFZ5iyp1dtF", "isValid": true},{"proRegTxHash": "b640c1694443dd9b88f77c039b728006a9a9222d009be222f172ad2004123ae1", "confirmedHash": "2707c200de1cb445372cff46fc3957446c45b80b66f490db0300000000000000", "service": "00000000000000000000ffffb2804888", "pubKeyOperator": "8a7c7022cd1a6f185374cf3282cce870b3a76654a2e2edbb671d41c686a83a7572902025a13545b30ffc8c17e664782d", "votingAddress": "4NCumrcdbNVAbWiWh9sTBLchGTWR", "isValid": false},{"proRegTxHash": "bf2bbbb76ad5db221fa808b9150e1dd24bb43a627959e5550c8703bb516bf22a", "confirmedHash": "aef08871a04045fcef00e8f9608a5ca6f1883997893ce9030600000000000000", "service": "00000000000000000000ffffa8775000", "pubKeyOperator": "92036164965e17bc10032da7cb016c97bb62bc243e3b9ccc8937e831d1e586796eaa49d6926b6173ec5f14fa1289be93", "votingAddress": "2SyixpuKVLgCAvV7QPAAHjwxhXvD", "isValid": true},{"proRegTxHash": "297c59cfeb4e328d3bf1cd8d6c69cf04959a976ec737a0d560c16104750e9289", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffffc17a8e78", "pubKeyOperator": "0d756069d906c09fde56f3fb21b6b9fa7a239a7588e4ddb75598dfaecb01ae54471d2606cde27cb9d04e370e8ca22faa", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "6c5052d17baf59551c6b4964d87440b66ac673fce4fb9a6528cc00618ada9b6d", "confirmedHash": "1de8d7c8bbe698d9db5afd58109692a1a83a0c5d6df508f71a00000000000000", "service": "00000000000000000000ffff505588f8", "pubKeyOperator": "99ef849f6a67d3e46234c591abf681c11c18839bc6c9d197cad071168d75397cc51eb6f9fb0a655929567e2818b1fa71", "votingAddress": "2LqfU1DreWeedyPT3ioqmVJBGfcc", "isValid": true},{"proRegTxHash": "3791dc79bed603c8f8da835f24ae9b10cc51c317590f273892406e7db831fb45", "confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", "service": "00000000000000000000ffff453d6bd4", "pubKeyOperator": "044865e19ca6e71089f1801e4605eb509581bcd6f051d03ee03872826652c2c803693d27399bf84f1e16ffb3aee09d94", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "72040d81a7d0c9f5003559ddb4ea1cb7a6443ba20e71d624f55e1e0a4cbe82d6", "confirmedHash": "121e2cb539803edb691b4ab60a0246d83ae15a30cc1a496e0700000000000000", "service": "00000000000000000000ffff951ca135", "pubKeyOperator": "14767b1f7f31df252d31f6873c5f6fd0b6642068369b49644a9d239a28d4f1ef86f00ed252a2c44b405a5c79fa2d4dd8", "votingAddress": "4B1WSUy8HSS2Eb55K7pdpC5Xnsjz", "isValid": true},{"proRegTxHash": "e189ab8f46aefa7a3a42629eab4b7b06ab223b1c7631987e238045a5820d8802", "confirmedHash": "077fb87f35d4a50e17f2a819265bd39409f44b736381f3e91200000000000000", "service": "00000000000000000000ffff5eb0e9a8", "pubKeyOperator": "8056afbafca7d229c08df70b9f96b9d10f98fe1032f65afd1bee423cadd3a3d92175d4fd0dfcafbd919d7e099880fdce", "votingAddress": "2fcrhcTPUCvHRbBXRpUzHB4Uxs6n", "isValid": false},{"proRegTxHash": "ea855921eaed2505f0994e4b39121456c3bcfd520a134f927776e6402ca7502a", "confirmedHash": "0703bec0555b357c97cce1f89b0b1b4a91e03093b21eba4a2700000000000000", "service": "00000000000000000000ffffa7634a20", "pubKeyOperator": "1186049198a34d1044c4b4454e5533bf4304a75be48400b21d5ffd353bc9e4f08b71a8ed6fc41edfdabd3672ffa66772", "votingAddress": "3e3msspPVmwymaLy6Es9kMheHVyr", "isValid": true},{"proRegTxHash": "812edd1faf8fd8f515e95a45ffd7c34c34f51aaadb5fed1b50b6fea69e0252d1", "confirmedHash": "42e8b8913740c3dbb938334f4f057ca2d1e49bf9b66f7ebf0400000000000000", "service": "00000000000000000000ffff689cfe29", "pubKeyOperator": "03be1094aaee9f8f423b6ed39fa4205777a3799327c27fed7d15f2e036e6f62efd336d87e0fbd9d2456b651da8e27e81", "votingAddress": "2NCA4xYFohrvB6Epjonf2LWNW1DV", "isValid": false},{"proRegTxHash": "6eb16558c0a223b83b11f42ec7ada623a020b9b9b501951c45edbaddf4645765", "confirmedHash": "74eeef8df9323115d4c6150616ff4f8836bb3cd60809df920f00000000000000", "service": "00000000000000000000ffff55d1f16d", "pubKeyOperator": "19ef9f66937b2ca5a0d8f4fe73c52a3ee62e0dd1b8885cff3ef1193c4f533432ddb431d91ad1fceae1de1431ab13cd98", "votingAddress": "4Gmqnheet9ERWnvs5TmghPLy75cX", "isValid": true},{"proRegTxHash": "fa4f341855c666fb4334da0c55a53a2655ace8b0e9cc5b1648b5cab15ff7bd53", "confirmedHash": "b570dc971ffb9171a73b9890ca9a7661b2dba7fd1be072a62f00000000000000", "service": "00000000000000000000ffffbc28cd0b", "pubKeyOperator": "9637e816739b6be5870c190173e5ea7eaa9d0dc34c316cbaa06038397fbf3711dd7b9903dadfbfbd00dff5a8af5ebdde", "votingAddress": "URTnRutkLsEjRz2zDPYEtUMLmBd", "isValid": true},{"proRegTxHash": "e723a2fe20b8a01b8ad4ef9c40bc80871dcdeb92cb449abc2c1dd2a305d64708", "confirmedHash": "b5f833d97735e67a90c9aec5380a99396a31d7a17eb35df31600000000000000", "service": "00000000000000000000ffff335b3828", "pubKeyOperator": "0b97db92494afd98a12e07d24463cad10594adb348577c1acaf8da6ce073d4282aecfebbc7d7773d53d254cd7f3b904f", "votingAddress": "39eW9DGKQT2pBDGCkD8t7KVqoqSW", "isValid": true},{"proRegTxHash": "06028ef5a0cc879aa113f21800348cb27864e81eefc2a5357567d6243b248dc3", "confirmedHash": "a22210c4dfca393502da27017f561efa9480f65666f237a60c00000000000000", "service": "00000000000000000000ffff55d1f1f5", "pubKeyOperator": "0b7c2a1d82cac9ff211d5d4cfcf11b0a5915581fe5cf5e8a34342489e7f5f02eaf67f8b9123deaf3a6f3f71508c50dce", "votingAddress": "Qr96nYaEgAQmjB9ZhN7FnzTCbpA", "isValid": false},{"proRegTxHash": "02116afb298bfe595e09841081545d9a46928d298d6f03e78b3ac3976e298d43", "confirmedHash": "3550b4f95ade9743bd2f22972f090033a4d43ee28b3309941d00000000000000", "service": "00000000000000000000ffff55d1f126", "pubKeyOperator": "06cfc8655eedd59cfc4145fbd2c0d2790215efaf07e315dcb1b9808be64e980dcdd2348cefe84641e047ee56e7153981", "votingAddress": "2jxJE7c5Sx1DBLejvgDvDfRY9qtq", "isValid": true},{"proRegTxHash": "675d1c374f60200fbf86ea05cedb88739c3190dc0a040b290e67b0e00c9db23d", "confirmedHash": "a7e1aff3e326dd4c567799cf77763ceee47478e48989f4e10f00000000000000", "service": "00000000000000000000ffffa87757cf", "pubKeyOperator": "8af1e5b8428a4a2e2cb2eaeb84917e6825505c9f825b4813e2182a2224a5fd617a65dc32e9717703c8b8becbde41b178", "votingAddress": "Xyk5vtf9233PMcJ2M4Nza4JmBgC", "isValid": true},{"proRegTxHash": "2932be5ea146a783e2b72de2a7acfd910bea72e0569d10262778d8152c9a0aab", "confirmedHash": "41d5d6e5aa2f293501c33ae1b44af7339cb679bdb978a63d2b00000000000000", "service": "00000000000000000000ffffb00991f0", "pubKeyOperator": "015ae9f1e5392a9952a6af37cc548a604d67a3e1b777126c3bd8e44b48c3fdc0525fd435e9bbdd193fd946ea0647bbdf", "votingAddress": "4XgDM2dU7hyurt1Jo6DHPnLyZtWp", "isValid": true},{"proRegTxHash": "0af4666a3e5c993088a8b95877df6c6295c59c16ae4d3cb64040bf7f0ece4b94", "confirmedHash": "751371617b1aa839cac0a5d9058049a56ad51b00f759b36d0700000000000000", "service": "00000000000000000000ffff52d31920", "pubKeyOperator": "831c6466f7e0ad472bd63e53f93319e3adffa4b532616cad710a3f0d2ae887de19eb9ba79660de3b2127452640a6e8ea", "votingAddress": "2DZFkyFMJo7iLRjeqhiTbXeYrHQj", "isValid": true},{"proRegTxHash": "c7df8d5aa07707f016948cc9d3eabc6b0bc8f453fff350e0264a16fa113d51a4", "confirmedHash": "7d3cf2d675690981a689072dca56c7c076fffa4c16d274071b00000000000000", "service": "00000000000000000000ffff4e2f1387", "pubKeyOperator": "865bc562957a1596cfbde13bd70612ccbad3da974b9976675fc624e1901e7bb33277814fa52d0cd18f2a3efa66293c93", "votingAddress": "Kffi4uuq6kfsX11Mz8wJZggm4Jn", "isValid": true},{"proRegTxHash": "0aa747290678c0d3870103e6af6ac374aad9e9bfb7db8a293082013d3205dc2f", "confirmedHash": "f8f6aa34b0c1a353a33fb563c32644a660b2096bf80fe1220900000000000000", "service": "00000000000000000000ffff2e04a277", "pubKeyOperator": "859c0cc88a932df47185c330daca3ac904f8a19821a2301a747636fe5719bb6f1f7c0f9542ecc5a1b8948cce970a01a7", "votingAddress": "iLUUe5KMEq9GSvz9VCXwqxToUMe", "isValid": true},{"proRegTxHash": "314475d988b687ee017bacc16f48b35dd53e0d18d0fe4bc50dcf1e274a2a3444", "confirmedHash": "e0eddac88b7ecfd267ed21318e2a0828e8a66d3457a41bae1500000000000000", "service": "00000000000000000000ffff90ca126c", "pubKeyOperator": "85c39b2af43349b27e832666a35c1161acb94df5a3e07bf7de179bf5e9377fe655ae05752f0663503ca435e0f958fd8f", "votingAddress": "NdCHcAEGt9mUmZSxfeC7PBTQy5c", "isValid": true},{"proRegTxHash": "b85a3dd53453a3fb230c9b19495e6a67a67b3885044abc828203b8dfab075f93", "confirmedHash": "7e5a35aea596c0581201b0a8200a02428d9f9a357a57f11f0800000000000000", "service": "00000000000000000000ffff88f4746e", "pubKeyOperator": "89f214868176a6719445f91395542a2669b6625d6d16082e7917492b39c638637129efaac9c9d6f73e7368a2794f9b65", "votingAddress": "xXNoRq2rz19N7DuhVaB1173iJpS", "isValid": true},{"proRegTxHash": "8045ab9ca2f4781a245ac5836f3f1ff65a863f7573dd7ddb7b85a2b4c4f3dc17", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b07f", "pubKeyOperator": "904795005d1e6c07d5c18011a5c65fe476d0255996fd66cfd74868ecffa1bcb813b751e44322d710a7d0270cedb1ad42", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "c3213d7c651b1769a51e93b8d7c4953f9e67875587d2c1ff90f2047046b17c88", "confirmedHash": "e8f9e4cb3e2e5cad2bb1e594fa88d8b6899d49370f3054851100000000000000", "service": "00000000000000000000ffff0509c113", "pubKeyOperator": "0c999de70d3024ac5b0b5ad53c5d7a5a74c4cfbf476122a017de8e74514ddce4eb2db32c011968410554ab556d474f81", "votingAddress": "2tqmrx2oRUkASEkqzn7cgUcp9ZLA", "isValid": true},{"proRegTxHash": "bbff9f9e4b321a7a5b98567d79adfdbbe5edc745c6a59e7ea97b9b02c3817627", "confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", "service": "00000000000000000000ffffc3b5f316", "pubKeyOperator": "86b752d572d64afc7a166602d2ecfd347bcfe16c3281a25010ebc847b7e777ae2264ba8b1540948f23673310546e75ef", "votingAddress": "3fzx5hGCnFR44niw9NFninqS2V7", "isValid": false},{"proRegTxHash": "b557ba779a7c20598a9624b91eb2f3117f31df7d88911ffdf68815c1d8e1ae36", "confirmedHash": "5cd1ffc9d7cc86bfcfb2d344bc10512fd86ebaca41bf4b5f3000000000000000", "service": "00000000000000000000ffff52d315e3", "pubKeyOperator": "07cbe435b4b9a5c2a35d6935edcae152b74cf4690b67167ab6bb3bfc968713b421b3396c45b740f4f47e28ad63651b68", "votingAddress": "26dwEErnq5bb4n3fudRSMwAFSo64", "isValid": true},{"proRegTxHash": "f9f1943aa8a075bab06794138341c670fc3824b2859631fba79b5d748d0faad1", "confirmedHash": "fd93a79e5d8810ab428eb7c62bd1db2045ec5c569c6f2e0b0f00000000000000", "service": "00000000000000000000ffff68f8587b", "pubKeyOperator": "972d111d87b5d8944e0afb393eacc0a48ec72d06fa542c8bff2de6160675c06e6c2341a201009bb0ae4496b28bd2dcc1", "votingAddress": "3DL38kY568VNnAVbh394sN4NjvQ3", "isValid": true},{"proRegTxHash": "9f4d6eff8f716521dbfdc7c63489e32faf6dfe77f80e80d94b8938df8234025b", "confirmedHash": "b66ba86a783f8d88a44c9cea9f9835cdb3ce2d3a097a52002700000000000000", "service": "00000000000000000000ffff9df54514", "pubKeyOperator": "87e115a5297a48d001b4fc5d8c48d05c4b113cf5515d7f7bc05075e78f649525b54b2404b5848fc439bcf2454855d82c", "votingAddress": "LAn7MTbfkLBLQTJAcTWF3rDxaYZ", "isValid": true},{"proRegTxHash": "e35787be4ed5c90ac4403ea10b995dafa59c36c76b6d349b54f921d7231f4256", "confirmedHash": "89a5e884fe8b3c35a14bb699c14d6d7e4d19b50e2a7dbe2f2500000000000000", "service": "00000000000000000000ffffc11d3858", "pubKeyOperator": "01b4867eee9ed04800e70c252db0939d527e292bf50f9fd19df74aad13e28407f4766e5eb7a24f5b99c2e2c34cec087e", "votingAddress": "YG5LQVY2BA7oHKVWgeXjksRAVQo", "isValid": true},{"proRegTxHash": "584c7d913db9c3631fbc742f6224e4fcc082992407be8b28ad0b3a62fc4f3707", "confirmedHash": "65743b27df20ce4631ce8b80eb99e5603a082be2fda34f862300000000000000", "service": "00000000000000000000ffffc63a706d", "pubKeyOperator": "18a8466d872a84dfec8ce27271cc91f9ca110619ba0cca3d9e9140c04039d21407424f56c8b8b98296b748cfde8224a6", "votingAddress": "2Yh6yCth5KETpFwCNMuhsv6swasG", "isValid": true},{"proRegTxHash": "c4424164c2c5ff91f44e4f1bd2f23c777938e1cccbaf68d2581cf2016f3b899b", "confirmedHash": "17a667d95355eedc5070dd64048d2e3cbede2b87ea98172a0900000000000000", "service": "00000000000000000000ffff3625c7ec", "pubKeyOperator": "80019ea038772fdde3381ed817e1ba45f3d5fffa341778e4dfc46bfbbfc7e982fcb7fda44fd453bd2830a3f2426600fd", "votingAddress": "1SRWsvRssX4JGrjTBmToJbpV97n", "isValid": true},{"proRegTxHash": "6bc153e16c0ed0db8f5a41d9a37ad73412b66dfb7766c443f49d5c9b85597f64", "confirmedHash": "34b4e053165dfb24cacd599aad6ca3a7fe25cd1f11279fa71d00000000000000", "service": "00000000000000000000ffff68f8f2c6", "pubKeyOperator": "95be624f32605164ec295964cc5ae5ccddf620dffeccc4950f817fd0e6d9fee8bce225759115210091d7e01e5c8c8e90", "votingAddress": "3tBPnWoAqMJd3krMks2jGiJHqHLL", "isValid": true},{"proRegTxHash": "3efe58eb42310477062eb56ffcfd5b7e69fdab90faeaf2d975fefb04342657f0", "confirmedHash": "9b1437956a47f3920e3ccb2d34f4c472f0307da4c1250c571100000000000000", "service": "00000000000000000000ffff55d1f212", "pubKeyOperator": "1393e79951b710e946a52f6522e648fed778bbc27a1e033f14e1c0d4d55273b177557045e0fe3aec35a4274a6a9388b8", "votingAddress": "3RNKyLnuLCBeTdPYZ1JHvi2zjKES", "isValid": true},{"proRegTxHash": "b9e05bcfc6aedb3ccc2a110f4ce8764589fb52fce1d758eb95dd2dd5521989ae", "confirmedHash": "6106900c56c85ce9949731c1793c868f6f1a30c55a7f3aa51f00000000000000", "service": "00000000000000000000ffffac51b332", "pubKeyOperator": "080195c4e047ae0cb057312cf56b918ed7b9c0a9b1f52afede33c785b7e2ee29a7d753bf9423aca2495d259f9fc57727", "votingAddress": "tzHjdjivLGaubnqEqfDjqUgbRYS", "isValid": true},{"proRegTxHash": "ce5fc449370a111d0572b0cc10ec351a817f8cd0f1307bad64734b18c457040f", "confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", "service": "00000000000000000000ffff58c64a62", "pubKeyOperator": "96869f5ced98e1e398c39f7bb877326913e171b10b3407540c431cfb7cd00162d36fc4984c98254577429925b3356c5f", "votingAddress": "uBEJwFZRUxcgVViBGxJko2Z1wT6", "isValid": false},{"proRegTxHash": "0d306c758533e50264561f3b76f2f683a95772572257aa69e96a75eeae9d40d6", "confirmedHash": "aec964de277a8c626aa187d3588320bf0c8f7fbc9c421b780c00000000000000", "service": "00000000000000000000ffffbc28b6cb", "pubKeyOperator": "06cf0339aa9ebda590f609c7b18e2ee9889294badbf15b717560c212509e7220d775150ed8dd3adccf153d1240e74ea7", "votingAddress": "2RKtEUSfD2yEwjy9MUReL3aUU725", "isValid": true},{"proRegTxHash": "91fb600867468a4e9bf46b1d7a84913aab587b940ef7af26573c3085403c59fc", "confirmedHash": "778c1334054e72c185a81b6830a7bfd168dc9c9561cba4290700000000000000", "service": "00000000000000000000ffff52d3155d", "pubKeyOperator": "193e78ba9b0c1ef361accd5fc495a287161129bc6267293d7adde0071846acecbcebbb6cd68f7107d20906aee81051fe", "votingAddress": "2QcaCiFBqMH83X355qdJ8K8okAQ8", "isValid": true},{"proRegTxHash": "545d9ae4e7c52b43d01d962ae0767b4e75fb125d9c39723d808750e5328e44ab", "confirmedHash": "41eb25b3705258852abd5844a302f8bf2abdd35ba9e124e50f00000000000000", "service": "00000000000000000000ffff052d6a39", "pubKeyOperator": "82b5a00e64efd19e471421de24ad6e06fbfd3ca7eacf6997f45f9bb5387d8a5130be272e259a82db658fec9bbf353031", "votingAddress": "2hYLMR8JA3yQGB7mqm7W9Z3vmccH", "isValid": true},{"proRegTxHash": "ead54ab926124c79892ce859a5da21aea7e8b472082ac1656172883753ecaba2", "confirmedHash": "c2d2bc0436c1e5c916fee275944adb042da2aaf63ac2e9db0700000000000000", "service": "00000000000000000000ffff5928051a", "pubKeyOperator": "997799b4cd7a341bc837f63a9ff671223540d4e54364d4d7a079d32e11bac5eb7ca1a48f9686b0a8d3b4ef0e7e7c6702", "votingAddress": "2DatWug4R2ubLHHx9PLA1zdHSEQg", "isValid": false},{"proRegTxHash": "8109a45edd30a1ae81d58e252ba97b59f178e13d300438b414f2bfdbb03dcd54", "confirmedHash": "c59afe08483349291bcd8ec6e4393bc68591cfe7f34c5daf0700000000000000", "service": "00000000000000000000ffff52d3155b", "pubKeyOperator": "8619b50af257879345158e0d307ed0960005cac50fe04c21f12f393972a68773daba7452a448ea013ecea15629b5387e", "votingAddress": "2esqSc9kuELwQn9f2aENShKrr1jF", "isValid": true},{"proRegTxHash": "08e7cfb6ebe16b09a55e3408a02c8026c54618d0e7d99984384493721d50c4d0", "confirmedHash": "308fa7849ac62ca91bab3274d4a32894b5711cc093140f2e0c00000000000000", "service": "00000000000000000000ffff8b3b9f7c", "pubKeyOperator": "8fc484542f56114de472aff2c3423291616e9a810ec4c03fe45e03f73ad287cd729a48c974fcdd9f8c1be192c8688d8d", "votingAddress": "2nmHAVcBFTr2hTiVKHbNfgWuV4ZX", "isValid": true},{"proRegTxHash": "c6416fa09ee4f12064cf15156607ca2676fff25f6f0853e6afd6d7f563b522d5", "confirmedHash": "d4d6cabead7ddbfd03c09cb5d38f89bfe8fcc4be61b955d71c00000000000000", "service": "00000000000000000000ffff68eeb121", "pubKeyOperator": "03352c3615f1daa6a09405767570f89f19e8c58b2422ffe291f0b10587f1b490a05e65d842afa328838c8ff7b213f41a", "votingAddress": "4dyYsrXp4JyBRh7fHvp6GKd1XjR", "isValid": true},{"proRegTxHash": "d0837b17369460077b8bb8c4bc9373a9e1a8cdf55712ac6c6ebda6ed68ce31b9", "confirmedHash": "db69e315713004a5e6bc6a6a758c56941bf9d14061a290370a00000000000000", "service": "00000000000000000000ffff14cbf8e9", "pubKeyOperator": "0ae60885cbc901c59ede34ea2cd77657b85cc281abf3684ad44794c36ab31f9ac0a96347bb24be4ca2ed938d210eab45", "votingAddress": "Q4M6hwfeNxhSF2Wak9kR7fhws1u", "isValid": true},{"proRegTxHash": "ddb0a30b62522e99c0b63c3b861b77aa4bd8e127e1d4c9aa8ea96f112ba1b576", "confirmedHash": "255b9f49ecd9e189d09f6f9e98a15e34d5f5d1c065a2cd613100000000000000", "service": "00000000000000000000ffffb9e4539c", "pubKeyOperator": "157e360dbacd9f8a4db15ab03fe5f44d4c6f019258753a86ae8954040b23dc048eb0b12332353d61de2625e896922fba", "votingAddress": "2ukkxNsj5UJnhBu8xgJcfr4zhKby", "isValid": true},{"proRegTxHash": "bdfab693444d9df3c6070057b2f7491d306a773f014626ae1831ab5c2b1f1088", "confirmedHash": "a2c8443f7fd10ce3203255c34731c678d1cd9352ac9b29ed1900000000000000", "service": "00000000000000000000ffff422a541b", "pubKeyOperator": "196a70caabe830ec87293614566f7c1728920f4c9857701ad0a06d0fb698db10e0501e1664af8916613a31c2f851d273", "votingAddress": "3bWrkRMAnkwxsriv9d5yaUN2XoYR", "isValid": true},{"proRegTxHash": "f3aed142c529898f2f355d1bc2d068a2afd80c5a1b7871c52fb8f12e0e511640", "confirmedHash": "2a0465522ca98da7b298dd208cd3a7ad16becf7641f9e8c21200000000000000", "service": "00000000000000000000ffff55d1f144", "pubKeyOperator": "85e58d8451258559358b93cdbe4f168a02ab2873440d120ecac5ead724f83988515cf534bd28afa7b49506969f6ecfc3", "votingAddress": "35Wu9Xbss8DybiKSpwNkc6E59nQg", "isValid": true},{"proRegTxHash": "f23b433554ba28ac2532825b376c27172af3cef422acdca8f246baea86f7b976", "confirmedHash": "e296a3dc9a286780f38c976e6a42e7b9ff044bd7401d2dd23b00000000000000", "service": "00000000000000000000ffff68eeb0b3", "pubKeyOperator": "0f95b011360bb2109c7ff95eaec8ac8cf3f703c3cb74d5f28d738ea5e4b417063a252825e0749027ea387be76e880be0", "votingAddress": "2nNAkpQnBLrSBRxTXHxof5f4q8ab", "isValid": true},{"proRegTxHash": "8a4bd0493037b825e3b847265a3e45fb2cfbbc31676b5dc4368b51584be4e730", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff2ce14835", "pubKeyOperator": "1819b73743acb304802817b524d78609ce7f20a1d575b9058b25380bf73d3883c2898921ebe1a1f47ff5a49874237e31", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "d0deaf00dd4aee54bc24546c292efa347494a031c232cd2266ece05527ebe762", "confirmedHash": "a2c71e1823ebe0696c61aeaaf362d8ff344500f19f55fab82100000000000000", "service": "00000000000000000000ffffc0f8b29a", "pubKeyOperator": "0b8e0f9fb4e37f04475f36fa62a3082ee5dd4e80c29d8a4ace110d44e43221fce353412210f58a91d3be8f2b9bbc72be", "votingAddress": "22ek35UWSMrmYpsGKPq9FR6urY44", "isValid": true},{"proRegTxHash": "c1eef08477428969635b26f5af4795204f0b5663dedfb0e3959823e36572b2a7", "confirmedHash": "c58971671ff2e5b2629c64cf449fb208b7215008b0a2aede0a00000000000000", "service": "00000000000000000000ffff52d3199e", "pubKeyOperator": "15542155f42275fe73def38cb1f946b8f2fcf8758ae1c1683004663fd0055251eab006fe5edfbd28c1d83ae9a47ec7a0", "votingAddress": "3M5wZN3EW5nWQm689J67of2GRDLc", "isValid": true},{"proRegTxHash": "f5f8436e793dee783991eba61098b9a6e64678df608dbd94b78072bc7e24e6f5", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0a8", "pubKeyOperator": "18e30d26526a097d7e21c0324f17927b42eb260c4cc04a25f5acbd00f3be4c6f0716ea281dac58274afe266c634cd25a", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "14530119550346ff134e0e58c1e89907afc167f1084eabc4c9bbdd45b9c8cc8c", "confirmedHash": "29ced6e37b3d18639a203801e9a0cb5b4d0255de544a779b3800000000000000", "service": "00000000000000000000ffff55d1f159", "pubKeyOperator": "82127c28d09808f3d8ff5e660e83d2d2f0499c6b710318847c152c47ab402a3bdd436489dd740e27b37e0f350d5f3f2c", "votingAddress": "34NVcdxWYQaMR52M2MoYqbDq99Zr", "isValid": true},{"proRegTxHash": "8d5c3c03af76fac66a57338f3f8d730124a3e3bffd5076a7c859dc5bac027c25", "confirmedHash": "b0d01b8b71e0eb9468dd7439e7d1f10a125625b9e33a1fb90b00000000000000", "service": "00000000000000000000ffff2d21335d", "pubKeyOperator": "8576b0e84c3039365af0c922a5f77dd181b6762b3794a308281604895131e029e9b5897cbd40c4cf389729ec45eb04ff", "votingAddress": "3odocNggr6Qa17DgQUsKi3VLTuW8", "isValid": true},{"proRegTxHash": "841c4a5a3b67ef0472e082bd5e7b374c4c1e870af33d7a20d01203679692b7a0", "confirmedHash": "deea24e962fac02cf223dd40dd3f1d84e4375d0d51276cb70500000000000000", "service": "00000000000000000000ffffbc28a30d", "pubKeyOperator": "8ae998064c71231e031d1d63e8a9fdbd3dbea69993f5f54c885bce0b8c70a4711a55926b04aece8ab994e445a95deb55", "votingAddress": "SNzFerAaHuBjsq92KN8taf6buvc", "isValid": true},{"proRegTxHash": "4532be8b515ed837e94c60726907d52f5eb75bd3c8e2468e41a678f205384780", "confirmedHash": "fa8f328521f1ce3fd4ffe0287af0aba6811fdc2febfa34e32800000000000000", "service": "00000000000000000000ffffc0f1b94b", "pubKeyOperator": "85fd44cda179c823628ed28e5672ea5d7317b919454f584648258799ab32371d8ccb6fc2b6940b9d37c36477129da5e8", "votingAddress": "3ctc7akbuxKZ9N3FuJj1KhWjHaPM", "isValid": false},{"proRegTxHash": "dc8915a98ee198fc8f5b1e7876c172f69a5b41720ca79f830f3fe33848d57626", "confirmedHash": "eb009d69bdb226deab3c01669671b8fec93a1cbfb89b31d40400000000000000", "service": "00000000000000000000ffff2d4d055c", "pubKeyOperator": "13261c7e21a7f4264c549e0f0a6b5fad5360b6c03c2207a677118ec2fd2f35038e2e2073caafae6e6f516b1b1119fc7e", "votingAddress": "4NZYANuHJ3qmtvKP2YDdxyuHaCUA", "isValid": false},{"proRegTxHash": "05be0f146826f32a7088da5e50530e598bdcc5d04534c236dbc3317ccef3959d", "confirmedHash": "b326c3e8716290edb18e4540809500d8a42a03025d16f2171e00000000000000", "service": "00000000000000000000ffff55d1f1b2", "pubKeyOperator": "0a65bf4d7e3226e211e22b0b8726bf7abd8e16cd92aeb6872a22c94c45c69acd4b53cc00f973436210c548646555372a", "votingAddress": "3edwSyuDNF4fopDzwQzkuWVU1Xmh", "isValid": true},{"proRegTxHash": "ae873617fe6c18096dc8f8dcb8f2bd31941a7ac781d25a6d3575997666a90fd2", "confirmedHash": "add5bf5a6fc9799f64dec133f3c67eaf07135418adf3fa8c1100000000000000", "service": "00000000000000000000ffffbc28fbc1", "pubKeyOperator": "8898a39b22fc9e23db59fcc00efb970866f947f289cc549e3ef0c96f017f599447112c28bd26b43bac36aa0dbad4ccaf", "votingAddress": "25gpHgv7HiofJuNUK4rdcufYcGct", "isValid": true},{"proRegTxHash": "da26785ac01401c934f2d0f18f3202f492aedf63f52df895be8512aa9e76a748", "confirmedHash": "c38db702d04a6961923eff369ce27b8a26b1040c00ead55a0a00000000000000", "service": "00000000000000000000ffff5fd85429", "pubKeyOperator": "842f68bacea08f9534d06747402cac9a1bb8cb184619dda260a274631974ce51b0cebdd0bb83f0376770e0735221c87e", "votingAddress": "4Wc9GHgsUPkBNHz2K4tzJp6NfhHy", "isValid": true},{"proRegTxHash": "40ae763d3def3dd09f77370ac1373aedb6b360ef351c44740f6484c059b7258a", "confirmedHash": "080ab597d475fa1db5fe18a512525e0a655dc289362c610d2200000000000000", "service": "00000000000000000000ffff3353bfd2", "pubKeyOperator": "025802d8886798d9188e65010b63674793d3f1e02c31ffd2cfb5435abeb8a727200ad752b1353f5a753e05128ed71e8f", "votingAddress": "2pYgKnMPdxXjMHLKwrW1LGGwSmC5", "isValid": true},{"proRegTxHash": "006dd6fbe65e898087f8c53b6cc4527e4ed6296606e3c77cf2f7720268ee5855", "confirmedHash": "4bbc862ccff2ab868534a8ef750cbc6296320d1e4733cc1f1700000000000000", "service": "00000000000000000000ffff52d3154e", "pubKeyOperator": "99372011283d7156f60ed0c494f94ddfe24980449e8d105624084f1d37dae864ccaab2345f8dbe27c3215393b092a385", "votingAddress": "2nr6EwjXegC91UYgpgoiwGRtVtzR", "isValid": true},{"proRegTxHash": "aea196eaf3a69788f49ea361e503799860706825c05f1c908223b154975c87ba", "confirmedHash": "e5a9e5c645a067ea29c0c6c411c40c565be8659f1631864f0f00000000000000", "service": "00000000000000000000ffffbc28fbdf", "pubKeyOperator": "139781ac59f26b0717a57089a64920a38a6b8ac690e17ac564b0d6c0c9274db92ee4fbc7caa13007f380bc39d392b169", "votingAddress": "p289xyfKK6tD3cL68WerFYyf9qw", "isValid": true},{"proRegTxHash": "f7eee371ca93216d2985d75df9d3a9fa33dbf56b0b2850192b85f90903ba6ddf", "confirmedHash": "8ef9c6166c5acd39f94a0527a0cc4887ceeb0040e96616710200000000000000", "service": "00000000000000000000ffff55d1f1d9", "pubKeyOperator": "9099634c1e85c8ce991557ae51f0ed95b3bd2d650474658b19ec2ce76fb4b5507b7f4af54b0a4be50ea9a67026e104f5", "votingAddress": "331udvK9rwKqdVoRdg6s6rgcczDt", "isValid": true},{"proRegTxHash": "ca1f7f49c3ffc856d110141c88cacddd54302d24ecd5826d940f143b8d3ed126", "confirmedHash": "bf99b819652d499b7857b5784f4c0a707aa19be75f9cdc071900000000000000", "service": "00000000000000000000ffff2be023a3", "pubKeyOperator": "907bd17319d581c8b76d5ec69028b87a5f6d3778655525a609847d275efd97ae3d80316b205a31a889efa0cc9afe495f", "votingAddress": "2uTUm5mmGK3LkdjzNQeACnDuUTXe", "isValid": true},{"proRegTxHash": "c2067225a31e3338a42d3914c0c8f23e8c893fc3c3d061f6e957e9d1bb0a7e64", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b092", "pubKeyOperator": "0c2afb6c6543dc6ac1850aa27d615b065ec5d28220f7e4db5e7016af925fcec531a3c1566edbbe34f903b9ba4046c8fc", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "76d9b8631b3dfe0392447dc17469df1659091da47fc2739ee65a970f11ad783e", "confirmedHash": "e17e82f9f7316c3b56df30101d7feef8e8a1f3c1cc622c761000000000000000", "service": "00000000000000000000ffff88f38e24", "pubKeyOperator": "8318f8b40a577512a8d507e8b72855103371e238b34c8cb1cabbc6f9b2da021676e7ebbd7c27133f1779c65821ed64d6", "votingAddress": "HeSWpDhoq7H4D4WS3uS4iHhxUMG", "isValid": true},{"proRegTxHash": "b498443e5a6fe89475e5e6664435db2047be30ea3bf87d87dddcde868dba61cf", "confirmedHash": "6ea04653a54129afd53763b48bbd0d65ec62282ed2570f4f1000000000000000", "service": "00000000000000000000ffff74ca666c", "pubKeyOperator": "02025da22b4c39a1843ac6fb08287dea4c8c8b2ece873cfb215d2d9ea4500cf9fc4d152ad0cf7754af2eb63277f90156", "votingAddress": "3F2fWqMe5kp3cSbP562FPNKm8hHi", "isValid": true},{"proRegTxHash": "3392f588b723e8049e4248fb2ed3beebf589130b964ed54415a3010eee041f98", "confirmedHash": "aa454717731fb3ad9052bac062ca4ab5003e46518c4b17040300000000000000", "service": "00000000000000000000ffffbc28b6dd", "pubKeyOperator": "8d49addc10bb10d8b1bd3b394b80b03f42219553ca6e1e123fe86566d5380a1624b17aa8bc239e9b394f676a95546245", "votingAddress": "2z7wM4u5Sb33ECMZSuVbDreiUjiV", "isValid": true},{"proRegTxHash": "5a89bc37f27526bc664af0182293ba6b5f90dd48f53ab396f9d293c89a8223b9", "confirmedHash": "ae4c8977fa346c7a1727783073b3113830a7250ee288752d1700000000000000", "service": "00000000000000000000ffffcebd2061", "pubKeyOperator": "0e256024964c16533fe3ae75abbfa173d8f116cd7265bae361dda293e847f2e3e20838f1d1ac3f189767501ab47b7336", "votingAddress": "caiAuKZSKzrpjLPkJv5NDh91S2x", "isValid": false},{"proRegTxHash": "2a4cbd95f03a38fb74e0ddff505b9506004c5b4c37dbe9d99a10cd9100fff445", "confirmedHash": "8ef9c6166c5acd39f94a0527a0cc4887ceeb0040e96616710200000000000000", "service": "00000000000000000000ffff55d1f1d7", "pubKeyOperator": "861c1efe8e2f4348c2708926ba9d5ec7eecc9803c2fe380aedee31843df5739c3011cc20b9f46bb0b4a001599d75a745", "votingAddress": "29yvrq1uyWTSjhXNPNwqCPtZKPfq", "isValid": true},{"proRegTxHash": "b8340a4ceefd0f19e95c9174bb844bbc7478d81c1fc47617b06034b36df15dbd", "confirmedHash": "f2e20f5d2ad9629eb04d5c0660b8f197b9e1b52f713e12012300000000000000", "service": "00000000000000000000ffff9df52c5f", "pubKeyOperator": "8fa12f021a83179120cc032a09a6e55f8da13d7c72ddb3a1ef334aeabdc18b5887e3fcd20fbaf787dbd9bb88a42eb53b", "votingAddress": "266kqEENyg3KmZ9CGotWgTpTWteV", "isValid": true},{"proRegTxHash": "a64c9409f2a2859affc7eea116c054d2ba7876aa345c27548f7495e290bf98f5", "confirmedHash": "fb2178dd40e1cb115974869a1f0ab0e4d73c60896c78bfbe0000000000000000", "service": "00000000000000000000ffffd418625d", "pubKeyOperator": "00e98eb5033eb9df70460f3869c8851d3bfcca4b66ad17658962eec74dec6afa4694d6f8a9fb331c79d0e0bf680e94c3", "votingAddress": "Qp7J15ZUpckmFFgrY7ajRnQJARY", "isValid": true},{"proRegTxHash": "13baac83019de3225e986f91d4d66d15baa6d59c9681a557b0d92ebf9b94e0d2", "confirmedHash": "9897a486bcb6335a22a757cea4b46e2625ddef3c01a2b8da0600000000000000", "service": "00000000000000000000ffff55d1f172", "pubKeyOperator": "8ff24404ab95e859267ff8a8b6c199d0a0aa91d12d36bdda27a877a62bc0c11d602800564319386454bf2f3d655d4ea4", "votingAddress": "4B7yB6TN96F3pTzvW2SNTMZ3TNW3", "isValid": true},{"proRegTxHash": "dab10fbe91051a9c170bcaaba33463e490fb0c59909fa5dadbdac3ab4f570569", "confirmedHash": "f9936f68235ad2a83aedbce5185772765b6830953596fbf02000000000000000", "service": "00000000000000000000ffff3625c7e7", "pubKeyOperator": "818e66a69f7a338e911bf71f0cf39e8f8bd0b935c4d20a854213750fb7954fd71b458ee0dfe84ad8e80934c9a17c8084", "votingAddress": "2wU6rgehWrqJZFtfJ3wsvgBAywo7", "isValid": true},{"proRegTxHash": "86ea1b0921a8081c6834cf99e6cdeaef484eaec7436bbcb520f335421561b817", "confirmedHash": "580c397b1da34b7e2af73d305225bd9f5ab1c0fb4fc971763a00000000000000", "service": "00000000000000000000ffff5bdbed6f", "pubKeyOperator": "80f5d6a72d57b10d8773280b553583f69c183c33985a7aedeff63ed7d3d2124ec1551c6b9fb11a45c09351769107e7c0", "votingAddress": "3MFJG3p2oq3ihGB4jV4SSeHzU6xw", "isValid": false},{"proRegTxHash": "867571dc23ca484ee8fa879055679ae9c66a7fad4224da40d937d7d69a4a0f8e", "confirmedHash": "b60c3308ddc3ae8eb3ec549eb9806e008df1f543f6f1a5d41700000000000000", "service": "00000000000000000000ffff592fa350", "pubKeyOperator": "8ed990cad89b129f6c88f33f785fbc014345faddea9ca4b793eb875c92ed95904f3dc54c6706ddcb17fa57cfae5a92aa", "votingAddress": "2uTGMHcEBwtANthccvSjyD1PW67s", "isValid": false},{"proRegTxHash": "2ad99753a5039eacc5ac957bab999395a132dee10b2c3126d835eb9ad0f4f8e1", "confirmedHash": "9a04f269bd9d44c982eedd17772bcf383616064d329a58cb0b00000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "2ypBJ6SUws4HTT6VdAhBkkRZ2xqb", "isValid": false},{"proRegTxHash": "8fb634965415e8ac6af2766d2530f6ca6820233debddc25f74ab60e020652858", "confirmedHash": "d606c868e2ec81aab7cfc744fb55f859a805315a687421780700000000000000", "service": "00000000000000000000ffff2d21066c", "pubKeyOperator": "8aa7388a93a2bb0ebbdfc9a9d6abca9c2b8054bbae24aabc608e467448c58e269797743fc6e7b4fe5c5cce2587388e3a", "votingAddress": "GfVmFckRpBkSsCVk4pb5BAECgML", "isValid": true},{"proRegTxHash": "43793673dbc447854fc0e302bd930fae7f6d56952951e64170783b3267417bd3", "confirmedHash": "be4c14f2c71810077d414567a5f814aca7e45ac9ad1a931b0d00000000000000", "service": "00000000000000000000ffffa763b6fa", "pubKeyOperator": "165401322ce721b07dd1f97b15916c537870b1211e2023f897671a1fffef29ec8ba252569b99d97ae154257be1744ed2", "votingAddress": "28rnw2zNgZ2fmAJNq5D3m8Rg9AiF", "isValid": true},{"proRegTxHash": "5b3e4c964c06eb4f5d0e843114c245a5078a7b59ac7013809234400095f698d4", "confirmedHash": "8d073243f0996900ca6e44c171a1a7b5450c4aaa4cc72a380000000000000000", "service": "00000000000000000000ffff55d1f133", "pubKeyOperator": "117206aa332de05a73e0c573660c0786501485d24e26bffea2680bbc1046ad407ffe6c52e5a3b6128b1162040a977eeb", "votingAddress": "3AyVZc6DTK16KT9p5akrTqhzzijf", "isValid": false},{"proRegTxHash": "c22486b838f89e5d2b27931776f3381b6f60386feb786f1eed97ad71aa877981", "confirmedHash": "1739ba773f37f199a5b11dcd31a61c69012f6814ea6a72c01600000000000000", "service": "00000000000000000000ffffb07b39cb", "pubKeyOperator": "996f8bbfe935e8144e5472087ce84d0f601b115e51b4ccdb6a6cfb6e2e5654a9bee349b03020e4c2f6b23b06c3703d66", "votingAddress": "3MSHyrNH5KdMj3eweXxhbqz5KuSE", "isValid": true},{"proRegTxHash": "f8e30680ea028c80af8a1faababa25bb3b71bd89cac9f2a4c6b32b6302876aae", "confirmedHash": "7fea303b0adef49ed5e5faacf0b804110bc7e12ffef677d92100000000000000", "service": "00000000000000000000ffff8c52218d", "pubKeyOperator": "93d3ad755e1e56d8168f988ba61e2d034a8b746685a9286e1e2b6ccf5124c6c3812a98d06b49f1835f41a2a35018861f", "votingAddress": "3tv4NNPMn3t4FXH9SUNLpgLcaVTY", "isValid": true},{"proRegTxHash": "39dc316d08009d6a89c0edc2ce9c94d2174fab20e7555ebf6ecd47ca32355ad0", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0d0", "pubKeyOperator": "966b287fc9e1872ee6275789adcc58142eaaa6e81cac7603f03377c192b7a550088e2540f24595dbff547503ab025095", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "7dea4face7bb9b6b9554c38a77a1d57aeaf315c1dc4d45caef4c812565478513", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d568c6", "pubKeyOperator": "187ad4a8a1400ffbc755ae1688a18fb3bb540799729ca405f900ed490d8bfeca8f1e4fad67c3d7377433d9608ffdb3c8", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "f9ac1d693f3801b6b9a7f69e7e15606e0fe87d6bdeada37ea1290f9cedc1b93e", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b06d", "pubKeyOperator": "10f24ebf183e159bb80dbd66b54ba52933212eb70124def47ee601b2edb974fa24ece5d802d430efb662207f53e7d82d", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "0ce250b22ec3d30aac444e331fef568b5dd15db7cffbe117c2bf3bd88d2d6256", "confirmedHash": "997a923fb08d9be700b58a3b6c2ee40d92e874a7bfa5b82a2000000000000000", "service": "00000000000000000000ffffbc28cd10", "pubKeyOperator": "99f201f1669edec75bb254ab7cd0fb84c1a2dc28d0c3ded1fbfa3a2d5e4a235d04189037b38b88190003c3b00ba8d160", "votingAddress": "WiPf5hZ6kNdgtJC4bDb4RdEQSiE", "isValid": true},{"proRegTxHash": "0dddc645d101d00b195c8c06a471042ce1416f79eb261ac9b20d3b6b2afc07ce", "confirmedHash": "71fe8f8b531155a6451d0923de0bbd0db85bdd31ef9900e10800000000000000", "service": "00000000000000000000ffff58630b02", "pubKeyOperator": "0fc3b77c30f2316538d4d8f876592e03b15b424929a1d4b0044102d9861120b28c329ad2a80d0bea62cb0ecbed14f99e", "votingAddress": "2CMjHVpmNH6WMeoYH3m8PYivpQmJ", "isValid": true},{"proRegTxHash": "8f3e927e449cf5d4ec9045d6c55d7f8042934faf15a71ec56e7f51cf913e29e4", "confirmedHash": "44bbcc917450905c4c682062c4212c42797c62fbe8da91de1400000000000000", "service": "00000000000000000000ffff59280d63", "pubKeyOperator": "14f9ecb9b7025abab3e0d27d03c21b5c56f915ebb684b48f438a71c95339804430a1f7969a22ec2e22e268bd6b9abdf6", "votingAddress": "3r3M8KDTjnUMjKLaJubG8En92CL4", "isValid": false},{"proRegTxHash": "37aa5d0a4fd0c1966cd37601631c33fc6e59e37fa50745916c043d929e38a870", "confirmedHash": "37a7e2c6169ec49b43f544fa4e9c0b845a3399abe13f4db61800000000000000", "service": "00000000000000000000ffff80c72a63", "pubKeyOperator": "9433046a63f602c228e38397782875c2ff342b0ee9eab23f0b93fe794463191518fae65cbc9cb1330f043e0004ca16ab", "votingAddress": "wX4ySTPbCBSBxLhmgpK7rEJ9Dc", "isValid": true},{"proRegTxHash": "f11de06658f05d7fc6f2a5669c979617a8b485eba0492399e9d4e7c289f48054", "confirmedHash": "42f78cff3eb87de2b5ca49e394f17fe8ea0a47f4e6a03edc2000000000000000", "service": "00000000000000000000ffff92b9996f", "pubKeyOperator": "155fae7865fda947df9153b306f23913ff242b0f067b5a4d6ec37b5ef2ab54061d0661a86be38065e96fbf992ba88916", "votingAddress": "9WEvZrLngTZA6qkN7AExj3Q5twe", "isValid": true},{"proRegTxHash": "1e8882016dc4eb672b92fe2ca5cfe7a77df98f86e9795951ab659891919edab5", "confirmedHash": "dd00148e7f6a7fdd7eb196fe4951d63f90c3323998eb07312900000000000000", "service": "00000000000000000000ffff52d315b0", "pubKeyOperator": "00451bf80050d40a9d7c2b23f0bbac25d82581e08d74eaade0fe44f280abbefb843e4ae8a3316f4667ad20ec8b032f30", "votingAddress": "NBJ3jwsFsBLbr8DoCoPtUztkiAo", "isValid": true},{"proRegTxHash": "39e154d9ff095cc8b3f59b2fc83c3fde39dd12c977df4c1e88c8e6d99da5401c", "confirmedHash": "b87fb87fe9266eda6da7869c72bdab91c35d15d04d186fde1100000000000000", "service": "00000000000000000000ffffb23febc3", "pubKeyOperator": "0cbf371e765389b10d32aed7273f9339feccacb0e0b496d83a68fcf794c935913eb9654bae8269ab44fe497859c81f21", "votingAddress": "2WfiaSHZ7Lx64744t2AJ8DHuRiEJ", "isValid": true},{"proRegTxHash": "bd35ce3b19a2afbcdc4f9b67993e7ba950c1ce1168fe66e75e85b61f65da3485", "confirmedHash": "53a78b0c6cacf1ac96b3879798fa784d5c58addd6c4eaf660b00000000000000", "service": "00000000000000000000ffff59280dde", "pubKeyOperator": "0c95e057929ea1413c497b7127b3e71dcfbfc7ac8b64999a4a0f210244b67f57d8d722a8ee0169ba5be5e3081ca88d44", "votingAddress": "2owwV5AGZYPA6iS9sGefWcJTcs94", "isValid": false},{"proRegTxHash": "910fdc8cff0b0133f65c57609c77d468c2e8a8ca74053b635bcb8f61fd1ec90d", "confirmedHash": "0466836740481df381aebafccf63b9738cd756311b9de9b01000000000000000", "service": "00000000000000000000ffff50d1e3d2", "pubKeyOperator": "192623baf4dc55eec387a2c1838e6c8c96d6c78ea8cddbc2aa850b446315f26d982af314565c525a2a43b3e90b88fa90", "votingAddress": "JyNxBf5fG42B72SzAcA3VVdmCaj", "isValid": false},{"proRegTxHash": "bd7b43711f45ecccaa96fedbfebb86afc99984b69ba529ad63f67ddab81546c2", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b097", "pubKeyOperator": "8bc7395f8b50f568378aca10b33691e81b37bf3a941f88f79459dfa6a19f9de043e64fcbee62785d3361818def95c335", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "a9be8c3befbca8138b10cdcbfee30a395572022597a96e159486b246db6340e9", "confirmedHash": "34895d6e99aa384c60ff26bb6e3c9db017af1f186944acd90f00000000000000", "service": "00000000000000000000ffff8b3bfd16", "pubKeyOperator": "09323211468f05f2e3080374dc7e065efa7250cab6a016ca5a4e789d03ff2ba0be32799f3ab803e8fe1c9b112a3d9f7c", "votingAddress": "5iQZRNbwMcztzzLaYYuqd5XZ69W", "isValid": false},{"proRegTxHash": "86bc308d5dc7b0b693eccaf51d7ed8bfc6c41afd20f2cd091c309e5dda64347d", "confirmedHash": "70451cadd967a8d6bdf525268abeb2cc273202a7e882d41a0d00000000000000", "service": "00000000000000000000ffff9f59ecba", "pubKeyOperator": "0d91778b799bbcefe540e5ecf387214e109424aa1fbc6ac358f5da225cb4766ca3d293bc071bdc44d3f68836050d402d", "votingAddress": "3BKXkix2CLtmNbwPMMAdR2Rk6pMc", "isValid": false},{"proRegTxHash": "57154a60ddfc3be7e2d30663833d267a4e645b5b5fe722620e62ebb75dc5672f", "confirmedHash": "772f3d1556b293194f3898274545b9a9a2f1271fd6cd5b630700000000000000", "service": "00000000000000000000ffff55d1f134", "pubKeyOperator": "099f26af24e3e293fc8b35355cbd478f446940ad04f2665586eea7fac2f0701ac08d9293e30ac97c4da79aafe6571e75", "votingAddress": "4SiFert56ymZtK4egqqiPU81o5Kn", "isValid": false},{"proRegTxHash": "57236f2235d351b8c6c0bca1b854db0f6c8245439344fb461272c42ab9e9a358", "confirmedHash": "cd1a15d309777df3d60408715cb525e2f5945b412fc864602600000000000000", "service": "00000000000000000000ffff5fd816b0", "pubKeyOperator": "04c25a639f1d660989db103cbbd791361480efe5ba50f5ae3fa0a723c6ff362ec253204da513cbea997670db3a703eca", "votingAddress": "4Gh4zS7cLJEVYcKgbAUmSntKz2Bk", "isValid": true},{"proRegTxHash": "af53b49f21832d9fe49e9e23a151b4b41e35c2aad2036c380c2dfed3898a08d3", "confirmedHash": "9129c82a932fff630ff46a80cf992a6097a450221aecf4720100000000000000", "service": "00000000000000000000ffff8a449d57", "pubKeyOperator": "1907533f2668b03af9cdf495ef52dcc8f936f7f9c736b299915789db0b81df165f47cd8588b4a11ef6204ac28bbff8b3", "votingAddress": "4RRtnfiamfk5QFDvXqMwnZqyTiXq", "isValid": true},{"proRegTxHash": "cb292cf1312b195bdbd7f5a1774dbab20ce65a330b52ee6c31dd6c500c700bd1", "confirmedHash": "06a5292f0675f5eed2a40febb915f7231408e222e217b5680200000000000000", "service": "00000000000000000000ffffb93e97ae", "pubKeyOperator": "90348f51fc68516b375d152f1d9c8fd90631cce1cb8f6b1e70d9db35bc0a4587a4c1916a331bf53c9605259744e41bb6", "votingAddress": "3EWdwxexQqojUbe185M68uMoj24M", "isValid": true},{"proRegTxHash": "1e2bfd5611895dde42e3c634185ed69803819f464586999b49ef8810588c3ddf", "confirmedHash": "6075bb41dde2b01a88899a598b842c881c4f0348a679bedb0000000000000000", "service": "00000000000000000000ffff2e04d9e9", "pubKeyOperator": "11c34092e69a3022a74aede93adeefafab6e098a57779f13489a6a3ca13c05772c41b89394dfa0214f1adb08a29b1b6f", "votingAddress": "3PxpHSYD2rCF4So6Kqm7W1mE7bHd", "isValid": true},{"proRegTxHash": "ea1faae50e8731dc9bf3e0670af307031b202542d43bfe7d247b251cffdf3150", "confirmedHash": "7da8b65c65004105703b406c9faf3a362d9ed70b165683ed2600000000000000", "service": "00000000000000000000ffff4e531300", "pubKeyOperator": "8bbc611d1742be42ee82306630b63c91f96cb3e7cf129661a8145c5b285c752ecad7198d57f588408c413af3b93aea96", "votingAddress": "45rPHtAusr6VLwNDVq1pwN8uiKfx", "isValid": true},{"proRegTxHash": "49b402ebefe6dfde187725f6419a452e9d1af59ee5c855a590f2cf8285d4dc48", "confirmedHash": "a02627addd9ca0c6b6df724e1c61e9cba8d6b717159794222400000000000000", "service": "00000000000000000000ffff453d6be5", "pubKeyOperator": "10437a7914b8bfebfe8df83274d6c43e369ba7c47d6f004a353748059498d83acb98f21238f022f3daf1017469459b42", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "af5bf05536991739e118cb83768e132165e3b3cd28e078787f70f4108faf14c0", "confirmedHash": "7fec7569d4486b6929fb6743d11cd827425b0153794d79511b00000000000000", "service": "00000000000000000000ffffa51676cc", "pubKeyOperator": "99dc46b3b77144740a64f5dc1ca597424ac998d2a00e1eea6b248a02a5a53f9db0e122e598ad93d83b046ba3105d2f1a", "votingAddress": "4EyJqdUrrdo7bo83tiZPE8poMJ85", "isValid": true},{"proRegTxHash": "54089561505962b18f7e2c48a2e4cd6a93312a5322dd6db82b8aa97ca6c35e89", "confirmedHash": "37fe61bc28ee3d6c4b185d326a546d4e563975fb0740f6161400000000000000", "service": "00000000000000000000ffff8b3b899b", "pubKeyOperator": "0a9ebc4d2c51be3ffc133a6e678980e13390e680d24dee1a4cd764489bf0f002f641d5eddcc6b45ff47da505e9d9e971", "votingAddress": "42ntwiTSy2fnrSQ7dkCVqUheunZy", "isValid": true},{"proRegTxHash": "9d95ad44d35ece7b5893a4184187d89b4101b1ac14db835b544923abfe758d75", "confirmedHash": "4c612ac9472761cf6afda87a840fae1a3384e669ac8b3d390500000000000000", "service": "00000000000000000000ffffbc28f16f", "pubKeyOperator": "804714598db3cdd43ffc8e8d66a36c382ed0a73af6868164edc957cf54ab28095cebf6a3fad7d23e86c7012ebb20bf0e", "votingAddress": "2khGYuipXM9LMX4mQkyTuebT7eai", "isValid": true},{"proRegTxHash": "6f7065960c0f833dcfb7b5dc291109bf44e2cda91eeb4240587ff13f7d7130e0", "confirmedHash": "59521143091d862188a8ffabb65f3d681258a2e005d3089d1200000000000000", "service": "00000000000000000000ffffbc28b6c4", "pubKeyOperator": "997fffcc425c17010af921231ba103d967e524f6aeace2f67e29326b95a8f60f1efafe9cb737fbebd4d5b0f9d5538420", "votingAddress": "yVRfxEoffjTxX25Rwg2qWfSWuAx", "isValid": true},{"proRegTxHash": "204153e0fb3e79bce33350ee551312ec6bed5bbf0cb89cccd895ad6e504e39ff", "confirmedHash": "b3f9a9fe2a42b17b814d7ca1414091f3c86f8deb703a580e0000000000000000", "service": "00000000000000000000ffff55d1f1be", "pubKeyOperator": "11a8341633a28a601078f0b157ebad5785218f99f0719d13a81b3296013c5aeb5881e27e4f2104fead2a04c0b33206c6", "votingAddress": "3rAnd5bn7Ccugnejqyg6E8P3eb7E", "isValid": true},{"proRegTxHash": "6ee31a56669a0cf0e4c4e6194bb18ddb832c5c78a341d3a2cb51fcdd60c01403", "confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", "service": "00000000000000000000ffffb0df8c3e", "pubKeyOperator": "90462758468bb4dc500b2674fa26ccf7ca584280ae00e6babd5ca4d050b8c33c4f600d67ff5cabb26db8886efd747f9e", "votingAddress": "3t22r3M75RzkK5YNUdJ17EY1HE8Y", "isValid": false},{"proRegTxHash": "c08eb53b66ba197a02b6f9f3e4c3abdb13aa014f8087559c2bc84adf65e0fe29", "confirmedHash": "a530c477318398eeea02faf1515ce96efe68dcc61f703c751800000000000000", "service": "00000000000000000000ffffb23eab10", "pubKeyOperator": "17265cc742e4d32af05ce85072eb16bdbc8a7041d3699c8af0074e7b67d69f1eb50bad9461e6a87d37aa42a4ef2dffcc", "votingAddress": "4QCM7vZjHBhvW1KKKAaTDXpikjne", "isValid": true},{"proRegTxHash": "1121230deccb336c885abe3e40b80f5dd9df6f0fc5fbfdd0edf41a10ee6dde34", "confirmedHash": "300a51c3b1e8d60cb83790e2f2cfea4e645a3cf88862b3521600000000000000", "service": "00000000000000000000ffffbc28be2d", "pubKeyOperator": "948124318d42651ddda44b84d687e9b93389e008813a9c1aaf186c1284ce592f0bfb36862825b2c0d855c36a2f9df307", "votingAddress": "Zqd2Pdw3Q5Bbxx8TeEYTxtEbxLe", "isValid": true},{"proRegTxHash": "e51e4dd36238520f4ea448cbb2a2d3f66faf22b0b7864fccbd1c3d108bd91df2", "confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", "service": "00000000000000000000ffff87b558c5", "pubKeyOperator": "9185aa462f67e977f55f1f70aa7cc7f5f48951e84391a6773ead2bdcb4e7d2dbc522bffa6960c9a651b80233df52436b", "votingAddress": "2WUD9BSZ9rLvTKumvYYq52maW8ga", "isValid": false},{"proRegTxHash": "bda868a2935f6ce036ab894eedfc4a4537ae2257717cc1ceb57ef6c838a3e0f4", "confirmedHash": "3213a4b9e655d7337357665861c427485ee9ef7a81dd48fe0300000000000000", "service": "00000000000000000000ffff8512e540", "pubKeyOperator": "186b99c8a1c6bc2e2c27ad74b144a7ba08e3bfdec8c6252b25ec5c3fc46f586bfdea368fef33538ce1a9636f1d8d2f34", "votingAddress": "2BAABKqGieVH6PDfzHccC8iUoaoC", "isValid": true},{"proRegTxHash": "43d8ff3f625fbfe97a582f43393087ac3b391b7cee437c506d9c1b35b1cb95b2", "confirmedHash": "4eb09dba76634f8ea98934dba9ed53d07b6680bcc83bbe310800000000000000", "service": "00000000000000000000ffff3625c7e4", "pubKeyOperator": "80389e6d198ac2e5947153a4500d3ff4684eccaa111941660d83c6871dbedbf4878eeb46587f37ee4e57fa048f69f09e", "votingAddress": "ww8ojystceEWuU6chp4Qk8ec2JG", "isValid": true},{"proRegTxHash": "7461e5483b6e513d8c02904021a5f81da1d363d8c1a2b9b166263612d2614ddb", "confirmedHash": "fae327edf957a91323b73e18c3cca7a196bc99786ece70800d00000000000000", "service": "00000000000000000000ffff8e5de711", "pubKeyOperator": "0adbe29fc3633b567d4dff52c7383825441eb119d01983333f012cff6edf087476f08fa40632da50a98b4153e7ebc0b6", "votingAddress": "2MUPkiTKm3ij42XCjgyMV5MRXV6j", "isValid": true},{"proRegTxHash": "6fb1bfff66702cad3ef80c3b9d264561bddc03471d09d16cb415397a24de0f9d", "confirmedHash": "495cef89ed35e3731f50e9833a553da00083e8589abc76e11600000000000000", "service": "00000000000000000000ffffa87757c1", "pubKeyOperator": "866e11816a58fa73fcd819b9aaab09a40646f6e71470dcc794b0cf8c1c036d3ad5db1569882762a65d2d29b45831d82a", "votingAddress": "36h3aEaVC5Ly8kUxySpMKP9Da5Ui", "isValid": true},{"proRegTxHash": "a024468069b197fdb8934febe2819fff1a075fc432850595bb47609b8e89bad7", "confirmedHash": "a9c6a86d3dc16147f2f91eee91d59de7ff8e4f2f6eee3d050b00000000000000", "service": "00000000000000000000ffffbc28f16a", "pubKeyOperator": "93a83f3957f4350565c7138089fa9597cfdbfb440b0ce1600c59e1ec2fe7039917edb2e91aa46f2de6d174ccb26a4a83", "votingAddress": "UsQS82byTuJo4A7MZTtYBMfrkRd", "isValid": true},{"proRegTxHash": "851ed9c13979340a044611304a1ab096433431b7fd86547d06b9607e6be0dbb9", "confirmedHash": "2b9d059a224545188853cf512691fb6281dc6d5bdbdbe8ad0000000000000000", "service": "00000000000000000000ffff88f37386", "pubKeyOperator": "8614b12d8761ef8fffe132725a9a6b511abe7823df3c0022ab3e4dec221cf8ce2ab6589cd617779023a54056d87f997b", "votingAddress": "4KSx6xYiHoYs6TKeZ2Visks9ZKN6", "isValid": true},{"proRegTxHash": "87f992962d9f3d6fa390b4258ce2c1725ffc7ae43132a06d30d68af5fe926c14", "confirmedHash": "125da14ef27f8eaf1f27141208d75aa4b3ec3ea7d685ba2a0700000000000000", "service": "00000000000000000000ffffb28021bf", "pubKeyOperator": "0f9a71ec6f7434cddb53401b5957b0c3f67ccb94f9b298dd233bac50b30dc482cc04b0b11273bcd22e2b0cf9f094ded4", "votingAddress": "4NVWv2pSiRzUiDKhUccZB2PQ7GvT", "isValid": true},{"proRegTxHash": "8fada88a41daa24925466e373eebfe76c3b330cf5d8ec39814ec42327797ec97", "confirmedHash": "a95556df31bf329ba60a9a32516505a0c5830668f6b13c490200000000000000", "service": "00000000000000000000ffffbc28fbd8", "pubKeyOperator": "81d89b79b719e75a0b1d343ca1ed9c5ec7b0aaa6ca52ea24097ce382ef592f78c54944da001b77d78ad1a5438078d9cf", "votingAddress": "4V69VbSKCLELL9vbGWpYfZzganAH", "isValid": true},{"proRegTxHash": "dc2926376ff63fd284591b371aa87c6a2e1969629698e5e51bd8db582c5abbd6", "confirmedHash": "43d59585cf74cdbd3b1b916e6cb6dc11cae4bb4d024dc35f1700000000000000", "service": "00000000000000000000ffff9f596529", "pubKeyOperator": "12e98d2a2ca1471871f697c00209babd6b1d12b1dfe0efd3d65a0df5486f5043df2a0490e3188926a2fe553dff6c895e", "votingAddress": "tkGmxT78JjhCqrppCco1SzpJAtG", "isValid": true},{"proRegTxHash": "60708cad0e2da8422de031544cddb2d7c9702a60cf5b78e5989c5c5571e64099", "confirmedHash": "97a83aecc1a51786d3cf8e6a0a00121ef9ca46d041c9c3df0e00000000000000", "service": "00000000000000000000ffff52d319c1", "pubKeyOperator": "8e7b5534ce6613403233070c0fcbd57143dfaf3c24df08306c02356bc227072208a58309e68b520321953540e89dab10", "votingAddress": "5tvKJNMLndMvW7AMFpZKJMA6Es8", "isValid": true},{"proRegTxHash": "4283b756bbe5e4148ad51bebec76450eff9c6cda3d84599685f9eb113369bcfb", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff8491996c", "pubKeyOperator": "089be36c7dee6f9e35bbfa1b06d73831b68252e6648c5a99c749331c51a5b6c0cc910a09f410274db4ee47175df50395", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "8011b1648a0fb125f33ba647c0f54bc46cdc91caef4cb98f3c425645a0c9adf0", "confirmedHash": "127d171a09c5262bac4d859ba0022dcfc34e343807554a5e2f00000000000000", "service": "00000000000000000000ffff129d8194", "pubKeyOperator": "0c3bbdbbe64a575bdf57efca0e4cf20afea2926e1367c30b1ddbefc68c3269d835f1a4c21dd6e397270a66f20a973ee3", "votingAddress": "2Dh6qQc2gE97Twt7FbD8vfrjYEzo", "isValid": true},{"proRegTxHash": "bd64ea95f93edb4f93d6fc288e48309cad615cf762bd8a16349c18b6c08dcf70", "confirmedHash": "6a486b118a4e15ac5701607a362e990b9ad3d3fb1795834c0600000000000000", "service": "00000000000000000000ffff310ce464", "pubKeyOperator": "8f65a38090287ab7994b4d391887aee032231c5636b7a2ca55aac58ecddf07ebd5f2364cef06d0663a78adfcc96f755c", "votingAddress": "2ULBELguvhvyHENVP8KN2WXSUkNT", "isValid": true},{"proRegTxHash": "5514a8fba9f041706211ba35a785fce355c6941f5a0b72759ec5a4cd10b97f31", "confirmedHash": "5ed4f5fc30e936bcc9c149e0495d75962417f1653c1a2ce71f00000000000000", "service": "00000000000000000000ffff52d31908", "pubKeyOperator": "0e9f4273233170e5d0d42786b15eca7fbffb801927b533537652c5021505010256260adc130b8bf47ad154b18f181522", "votingAddress": "2cELzyYkR8t7Widzrzkfwm6oAh3m", "isValid": true},{"proRegTxHash": "83e387292f7b40ad8f903f1dc0570489163da1f1b8a94b2d3c401dfefaba0057", "confirmedHash": "2492ea3b729d90f88b5f842cc4991378f8944e4375a696250000000000000000", "service": "00000000000000000000ffff88f31dcd", "pubKeyOperator": "957ad9c8945a8e9dd96953c4251e296b68af247d5109ee3dd63de0800f0c890f98c1fb8c72c175abaac9abde3addffd2", "votingAddress": "xL5vR7fHnKjFPWCYz1qTV64aAMD", "isValid": true},{"proRegTxHash": "c8e0cdfe83de11cc8b389aa8d5df3a5e1acb25a833b677666852943ee782b5f3", "confirmedHash": "697331339a89d8ee4c88a89b518939b96dae16c9f74824430600000000000000", "service": "00000000000000000000ffff58630b05", "pubKeyOperator": "037153c3ff281bcc6d154b9981e4e3945c98715a9765077d49a1902a952ba66699c0132411069692a83d18e6aaa83c2a", "votingAddress": "5Hr54bi5gDsQFwyC9RKG9Hrbg6B", "isValid": true},{"proRegTxHash": "6d2b0440292a88169576ee44b063ff196153e0632260a47141898d5447779627", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9e656af1", "pubKeyOperator": "885d1b78dd4086a4baa0d55f336cf641e85908110367e2c2acef960aa760b45b7f3cf2396fc9a3177244fd64258371bb", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "7d32819ae34f5442c3a661fe383dafcbb10f085fe82d77fde75ee1ffa95c0926", "confirmedHash": "d6c7210afc625c9c69fcc318a1ed234b3f8b7086cf1996082a00000000000000", "service": "00000000000000000000ffff68eeab9e", "pubKeyOperator": "172f16ef1c9f219a8e55c5cbbd47545dc3d771232ff69e17c627ac80948517c7d1677e918b5bce752550ab4cea9c9bf0", "votingAddress": "2ebh19FoJfp3Ce2VYVCUTXbtR3Gr", "isValid": false},{"proRegTxHash": "f1a83b3327a1e38a6b909c73d194c00b05df30f1e596e416006e122264907757", "confirmedHash": "0466836740481df381aebafccf63b9738cd756311b9de9b01000000000000000", "service": "00000000000000000000ffffd41863f8", "pubKeyOperator": "84702c66861692421f22ffea9b39ce09c9c596136f9e3271e5fb2e236c6466ca0fa1ac9bbf078f4088beb9c198c1a8b7", "votingAddress": "3CzAwdpvkUejCp5n6KcK32UrGEDk", "isValid": false},{"proRegTxHash": "ca274b43a2fdba30edd26b29b2fc2d8c7a7b6099f26494b9569aa441e5d4e6f1", "confirmedHash": "562d29d7abeaa6f6649e7c9d60b4d31bbb684e08c26560912e00000000000000", "service": "00000000000000000000ffff52d31952", "pubKeyOperator": "87ebc29d0036dcd356431a855d4e6c20e8ac3a8164f838cee3e01e47b1d8b4fcfee5cec5ed23964d90c02bcb64f732cc", "votingAddress": "2LhuXa8JUGrFkRZaWJMKmCpcaekM", "isValid": true},{"proRegTxHash": "fe943a33bc611c1029b43ddacfe53f4a6852be1ab5ea3acc1e61c2fca4369ba2", "confirmedHash": "4ac01de697be6488f5825ab4d8b95716bd829f975f0b5acf1400000000000000", "service": "00000000000000000000ffffbc28b6c7", "pubKeyOperator": "13274c2e22e9e9881fd5132ebd22d59dd02959707553975e6ff602b2422f37675c0aa54de399aa92e24da378fcd1c5f7", "votingAddress": "2BEy1GBt7rHFoaVYJx891m8G6fgd", "isValid": true},{"proRegTxHash": "53178b5ecd359dc57c4122c6928366f359d878338e7bc20a8aa5c3f5af939b2f", "confirmedHash": "fb591861e58a6a106b999e02a097c47dda1fd663a3115dcc0600000000000000", "service": "00000000000000000000ffff416cea93", "pubKeyOperator": "0de0ef0a751ec1963e95c42d595003a5dccc0fd9a4c7ba136f2d72f64a6b958b703a749524fb9b01cb0048f3879d4899", "votingAddress": "yRGLFfitymPDtBMn6KsfaeJpbSM", "isValid": true},{"proRegTxHash": "15aa09d7322a59f9aa9709c97e5caa3f08c90bf9878a28978253b6c58b2320c0", "confirmedHash": "789b8d3e5b23ebeaa0055f38c01a2265a2e0b48fc3b557280200000000000000", "service": "00000000000000000000ffff8b3b56b8", "pubKeyOperator": "86a62357537d9ba76de24aad053f2f13bce88ca763ba7431ee03f1a125db1806ac1767d135cdaebb6792bbd9c9b285a0", "votingAddress": "J9mGQngRWfKUT5jwPJcXDEPYAY6", "isValid": true},{"proRegTxHash": "36bef0a23c7b1e0a9feb6234684cd7d05ce3825e36fd6c48745e5db8001c2f9d", "confirmedHash": "e34a62c185ae55604bd2271c06c2d47146c46224b7b770ec0a00000000000000", "service": "00000000000000000000ffff87b50840", "pubKeyOperator": "07e89830e79f4079d20fe14fc69c812b70bad81624b65b57e645910ccf6e56688e2a886bb3b73d6eae7e71f8b30ea9e1", "votingAddress": "3GXGd7vREZvJxvuVrfznc1wGmfnN", "isValid": true},{"proRegTxHash": "b887f16491ee2092fbf8f91709315dedb08c37a3226e31320b67e5a76ba9ea1d", "confirmedHash": "2dda4425ca27af1f422983224c33f91c770c2f800359b0a33a00000000000000", "service": "00000000000000000000ffff023863f4", "pubKeyOperator": "12a2526d415622f43eb8cce626486103f9326cfa4bf4506b534cd43e06ff0037271bf59153a51740503780c7e5711a2e", "votingAddress": "2NbLYmCTumNyxVwEWCE13uTfubzr", "isValid": true},{"proRegTxHash": "bf76fe1faad3fe87191721e722ee5350a17a29f950da5779c1f4037f47648fc3", "confirmedHash": "6aec913a27489fbd176e22aaaff5aa652eeef98a9ce8689a1800000000000000", "service": "00000000000000000000ffffa51677d5", "pubKeyOperator": "00b8c8c70ff46e0a33ce7c9054cd4d00b56bed0081c02b44c2d9406feedf577288cb19034099fe6bdb50a11ced1123c6", "votingAddress": "tojv8XRkEpLRtnEK8kZh4255kX1", "isValid": true},{"proRegTxHash": "e2f91f40efc7f58f13bebc756f9fd63abd948891dbc9495a2982832dc563bd91", "confirmedHash": "f413e1ceeb3b268e7f75b329a4c05fe9f3ee4294e1be93f70600000000000000", "service": "00000000000000000000ffff1f9463f2", "pubKeyOperator": "15d01403bee9e589c2621b671fd6d04f7822843713746392235e0fdfd61fe0948b60f395b788701a5b9838529d570d35", "votingAddress": "2StBsUm1wfK2qsg4zQfc84kYGaPn", "isValid": false},{"proRegTxHash": "fe0b95356aa77dc36a40e416914a2ea9203aafcfad5d832c8343b77238109204", "confirmedHash": "943c502f65cf5b2b662a583eab9d47b7446f741a53d2601a0e00000000000000", "service": "00000000000000000000ffff2e04a267", "pubKeyOperator": "95a6a48086fdef688dca66133dd52f61ba97a445e1fd9f3a21c46a88bc385e294fb4da05c164c71164c7d31b60d58e98", "votingAddress": "32v92158umLBkpzdDASRqKnUoN87", "isValid": true},{"proRegTxHash": "ace08ebb6f568bc9a2822c4aab80d9b6c2d5ecf0a10464839053b7993907179d", "confirmedHash": "4c87b9728c173c6f0aec2b91d9480c8617018e8939fab8540200000000000000", "service": "00000000000000000000ffff9fcb154e", "pubKeyOperator": "8d553575dd735bd246b599929510ac4dd86cefd19569942cae6496bb229af8964a3a4ecdc39e02afab30b1950b112497", "votingAddress": "3Q9Rih2YQXhA1pZNeVzazgXhtNbY", "isValid": true},{"proRegTxHash": "993ea1af214cfea4b28a7d0e9601854a23a9b539b460995d770e688e2e79af58", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b083", "pubKeyOperator": "0bb9d078338dd7bc80eda98075aa794ff359c04757baa419ba42aeee0f18df4be10bd7600f81ee0aa9d2b53ee68dc602", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "2aad8a44cf2fb879412fd32d006b4b198c7eee2f70e36144964a2faae4ef41dd", "confirmedHash": "730033b7a304f0b4a3f7d738d282acef2d9af6de336503ad1800000000000000", "service": "00000000000000000000ffff52d3190f", "pubKeyOperator": "072cb994335d33e96df25d2cbbfd213298de7d5d60036786cf99fe658658b526fb5d03bea5a6e49e3d34ad015103ca2a", "votingAddress": "2iG7A4VXkpvbmjXoc891LxfPio69", "isValid": true},{"proRegTxHash": "d9eea8fae2ff4f3ea4e9bf71ea486415b085861dee322c446d15ea584afbd8f3", "confirmedHash": "0da2626c4a15b011875b416d2bc02e9fbf58b12a1866fd0b2000000000000000", "service": "00000000000000000000ffff80c7f611", "pubKeyOperator": "86b2fb052f9a85e0d1b43a2ca63ffbff23f5dffa2a17c14c0645eec3d18f38955ba13eb53f0df0402970ef83b8f8b135", "votingAddress": "4DJz1TvLQCAsDFuMyKFKXyNAN1pA", "isValid": false},{"proRegTxHash": "6f234f97c20a2897227c6fd23a136763da1153a26d72dd8ecc721629bd18cbb5", "confirmedHash": "841115bf308a1bae2b3ef26ef80aa6212cd9c3f0b131f8551b00000000000000", "service": "00000000000000000000ffffcebd8c53", "pubKeyOperator": "984da01196c4a97cca255f0635922abe3a11919d07e9b21854207d7b6a499965b887dd765eed1b6b4db15c1cd0351a7a", "votingAddress": "2XpcHeo7e4bMWwg54pNQAJDX7F9A", "isValid": true},{"proRegTxHash": "036997f226be8098d9a306528860d6697174800823ac41b0cdb3873fe48eab6b", "confirmedHash": "d323910528554677895312a22605c1ffdc62a70788ea651b0f00000000000000", "service": "00000000000000000000ffffbc28b485", "pubKeyOperator": "070a6db18c2debbb06f24e092f02066901cdd644017d9d5faf2e7dd2a75975f9a8e79bd3af8e3463d5fb9ccd91960b36", "votingAddress": "Py4hGFF41qQL7qK4x9pXmQANHW4", "isValid": true},{"proRegTxHash": "c8c908411d6fb150ae5745eadc1abf7090309b8c5813cfe8352ab8721d0256ae", "confirmedHash": "4113cfb08ade9f1b5d935bf2d7223e28d8191bb01a7808d80400000000000000", "service": "00000000000000000000ffffbc28b6d2", "pubKeyOperator": "831691e51184b59bbb130aef9fadc068ef877faad9fd7db92fcea7383fc798d1b4bceed4163c43eebf9a44f2faccd522", "votingAddress": "4QwhdqDowJH1XxVKsM9kym4wd9bR", "isValid": true},{"proRegTxHash": "390c6f8c78f1b10f63062edf565b3cbde64160c02a1bb38ec6ea969e32c06526", "confirmedHash": "80e3f386c4d0a873584dc60537f4c3c35daef139c313c4ca1400000000000000", "service": "00000000000000000000ffff9d5aaa6a", "pubKeyOperator": "91c6f626afbe62a70e7fd82348929678a043fa38fe6755ae93a33103976147142d09e2f15a8ccdf872b96e7b375568a9", "votingAddress": "2YYSQMkt6cghyZGLps6afVyHFAiA", "isValid": true},{"proRegTxHash": "5cd9c2fdf67c117417b428cec4ae7d409d2d5beed56503d1a4f7bf53e5723dd6", "confirmedHash": "9bb3498cc81905422193540bcf8eb4c829ce2a501d9bc9840000000000000000", "service": "00000000000000000000ffff4acfeb66", "pubKeyOperator": "95d178516e3f67672a8231fc2a5241fba103b2392fcb67125be07a7c2bee53c1d5a81f81d1d681c2ed066236858c2d69", "votingAddress": "2XojY4rBG4EsmMNdVbtcNfyFoFjq", "isValid": true},{"proRegTxHash": "70531d66c9cad1dba749fdc659dcdfe2eb55a81718d38a9ae6e4ebec394d7d65", "confirmedHash": "47e16c22ea1d25788a00a7fe840024fa5221712b5e742eef1400000000000000", "service": "00000000000000000000ffff33c32ba1", "pubKeyOperator": "8b82b9a5402ffd038e0f395e305dbcb81adfc2fbff861292dd91d89cff973fb06bee90fe7fb516f20dfeade9d94d30e9", "votingAddress": "2kDdkwrdcQ4XdNnS9BaSEcwj8Gh2", "isValid": true},{"proRegTxHash": "b6d04d10cb3550728ab5088aaeff385fd6865aedcbac2472ca29235a16d8a416", "confirmedHash": "00787909c9b5eba48f1473f57bd3114b2b1262a7ac3e74831f00000000000000", "service": "00000000000000000000ffff55d1f148", "pubKeyOperator": "998048093321e9d6653d17be9c1bfa274520a44dc01f36c163f1f5e731f3b83e862f936fa9858b57501c6083e4ca0cd9", "votingAddress": "3uUfiiTbM5UFCL6f9m4f1oXSK4Fq", "isValid": false},{"proRegTxHash": "800266fedeaa565364d18791658c3d7ec0efdd9dba9383ea448511b9e12bee00", "confirmedHash": "885d42570aa964b74056996d7ab04a1182a5d994d0f2a0270c00000000000000", "service": "00000000000000000000ffff4f621e9c", "pubKeyOperator": "1394ab2c4d0a6dad9459a904cdc4376be83a124499e3a827d90ed8d4ed6e308a36d395a6eaa02e91aa23cbc589bfb56b", "votingAddress": "3JwHeUNeS38TzPBWmPSFvbDM52m3", "isValid": false},{"proRegTxHash": "5f7f4e4918ee12892b035268db4be4bbd345b4f1d8e30ed4afecfab0bd8cd4f3", "confirmedHash": "6bde92970a7ca5a89f8f403510095f4d7373fb1a6c6e83831d00000000000000", "service": "00000000000000000000ffffbc28a31e", "pubKeyOperator": "825b93492ac36df028e64173b8f7cf6d30eb2f388b493d46d8165be84db52b5650f73b64929f0013cda868c5b6a984f1", "votingAddress": "3TmP96HUNr8CxaebMENj4zoDKbRU", "isValid": true},{"proRegTxHash": "263830311bc8345d3022db0fad309dc4ff8ed66cc8a88832271d8eba11ed8658", "confirmedHash": "e97f7332fd9ccf21cde389d5ac4e3fa80f2e016fe0b732d10300000000000000", "service": "00000000000000000000ffff5fd87e2d", "pubKeyOperator": "1584fdcf2f9f60f65f6b3313f3e2b7bcba9b6744f52b464c1460ddfec710d1b3b5719827cfec6c1040f2e53895d9c796", "votingAddress": "42keGc6RPYoRQSBWt3Dt9Eg6SmDS", "isValid": true},{"proRegTxHash": "13eecbb98f2aba83d7d3ead1cc0fd36e89186590a2ef5738bd2e565d342d04d1", "confirmedHash": "c58971671ff2e5b2629c64cf449fb208b7215008b0a2aede0a00000000000000", "service": "00000000000000000000ffff52d31953", "pubKeyOperator": "990250f8722ccb412757c3072d8343c1fa0007c239bed107881bd30f1117623bb6c5f9520fc8dac794563d87c5286d35", "votingAddress": "Z3gBnY5hFnEJjqXaAYv8XXgzdyw", "isValid": true},{"proRegTxHash": "42a7268cee0a28b615a2925c3534050b7693bab9d340e4232087ed7180c67fbc", "confirmedHash": "5c9dce81616ea651b1b98c79ad2f12bf06652528bc11b3051600000000000000", "service": "00000000000000000000ffff951cc6c6", "pubKeyOperator": "0d403ce898d35db78be1ce0a1b91bacf98265617e5715b72f6f11ddbeb4b95c7204fb826a65f7a75753a98e7ea3ef99e", "votingAddress": "2dmTX9eTLZLG39uSs3WjsCVmveLa", "isValid": true},{"proRegTxHash": "dce35ea6018b865551eaedcff00b43873e78c9f98a0582527e2c3b56f0b1bc13", "confirmedHash": "5ed2b9822cf25ae908f964aab669c638faaa6d80875a7ab22900000000000000", "service": "00000000000000000000ffff22c2f6d9", "pubKeyOperator": "8d32736d4499041e5f850c47cd945f967f6b47669656870dbde94c652fcf073742480cd5cbf0aac1686ad8f8660fe6b3", "votingAddress": "3eRCqVCcwHv2nLMsKTUXQgnZjHjT", "isValid": true},{"proRegTxHash": "567b9613497ed9c109da3baa7ce10feeee4f80292f166a3490c1e30512a3b968", "confirmedHash": "dcb6280e4ddf5e65aea2297de13fb39657f7e44b40b5af420000000000000000", "service": "00000000000000000000ffffbc28b488", "pubKeyOperator": "8137a7322efe2d2f4c73ce35bd7619f1af20cac29f209d353dd9e34bda4066e0ebaa823bc389498d0799c7509d5f3d2a", "votingAddress": "2B2gfjRorFzhyoQGakhLSCqJ43ho", "isValid": true},{"proRegTxHash": "ef755026d0cd264e4c700a1fe5f17ac173b221fb939fc5fdf08fb55a8730e259", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff8491bd7d", "pubKeyOperator": "0ede0dd262efc3f287c56b1f38d916ac1f5afa0c9d11593d6bf967e628a58a15f634bea8423382f5f4b63018d2e88e1e", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "1dc5b8d653bbde3055b53e7ceb11da4d855f1d1e12dfa77eb1963b220dd6269a", "confirmedHash": "6553207e58103eca9007534929f052171998055f21bac0410800000000000000", "service": "00000000000000000000ffff2f6e9241", "pubKeyOperator": "8f68cf708e3d6cd60f65f07ed9c5c6267da9177cc2238ec91d667916186bd31710cbd25da85b60d18a665712c05fb000", "votingAddress": "4J4KpUisTo1sk9YwEwBG3JChG83x", "isValid": false},{"proRegTxHash": "e94dcb8f9b76170b808c5632d26adcfca2b426ed908d4640f9187a51068d0808", "confirmedHash": "1506920cbe243649637f126b78fe5889bcae8b58e36d5aa01400000000000000", "service": "00000000000000000000ffff2e651a4a", "pubKeyOperator": "1318868f45b29ab99e7ea4c07067685ee41c4f24f6d2019b8e6b0dc59f04299e8da1e9c116ecf17a8cce95d7ba69b87d", "votingAddress": "bV6Rj3sJGy1XPK6Rx4tbZCuSCuY", "isValid": true},{"proRegTxHash": "278a764b546cba23464a9a281b371a3cdf302485fee4012c2ff8016a902b040b", "confirmedHash": "1aba6509f5366eeb36347f06e368584c78a58381c79160711000000000000000", "service": "00000000000000000000ffff6c3dabf6", "pubKeyOperator": "0e23e5d17a7fe3b7db4c9e08b55eaeca07b0cb61463be669dc808f3a5c4fa43833d33f633800dbe34d982ae75addaa39", "votingAddress": "2bikfe4oh2rT4sAYUiYpp6CE9oVC", "isValid": true},{"proRegTxHash": "bc82889b996340bc49748c17ab906515a9263452f56a75951daf0512900d03f9", "confirmedHash": "48c3081aa1d0ea15b2604aa8ee1467a107d36ed447896aae0000000000000000", "service": "00000000000000000000ffffb29d5bbc", "pubKeyOperator": "0d6ee003522c47dfa15e0f32af4747c2cecdee33aedca1a4e5d7a6e39e71ab4a14719d628c24983a39f7b13212f484c7", "votingAddress": "3v1D8JDedktsY7aiSMeLLuaBN6oR", "isValid": true},{"proRegTxHash": "87759299a08d03009cf535cfc37ed81841f8fe092660f793a17e0ae714f7ed2d", "confirmedHash": "c20e9d7d6d393c4225365d706383a96582f97ac4c4d604590a00000000000000", "service": "00000000000000000000ffff86d158b5", "pubKeyOperator": "99a107fd4ca280c5b3f022e0919c92fec3510a44c4f873e3f8e7d4fed63caa7e5daeeca7291127756a5e969e547bfeca", "votingAddress": "8ScHCq3jHuQ2nnPi35q7PGx4uMH", "isValid": true},{"proRegTxHash": "0261668a5f2b7b9bcca34b40f2677cdc95f5aefab7efc92f217cef86e7bd8307", "confirmedHash": "7bff4f371c94a24bc8bd45d996e8e1e504972248543b91fb3500000000000000", "service": "00000000000000000000ffff5fd87e28", "pubKeyOperator": "81d1b510f69385082b942bb502109de9d3cd6cacc6f5b1802f1e7f3254234fa0ce2cd98f23a47e82eca11b05a2dc662b", "votingAddress": "2frNPcVNZH2TrhJBMnk1TczLpPk2", "isValid": true},{"proRegTxHash": "86966a96ac934f5c2eceab8af0325767c24b26e4280b0c6495c1ea63aac7b2cb", "confirmedHash": "b5412cb77f23027f18811c8dd4d4cf976b6ec9b5a4bd93790000000000000000", "service": "00000000000000000000ffff9f411ff6", "pubKeyOperator": "0e29c12205334287ecf4d450f78696dee880263222ac07c4c0aa2c51063b5b4f0c308c114b500c0ddb56a7c80d32e66d", "votingAddress": "WchuXGe6iYQSDGus9UUQPNpGAUp", "isValid": true},{"proRegTxHash": "24db3094ee0f980ca28d3fffa1889ce84d6ba35083ebc118e203fc82cfc6a28d", "confirmedHash": "34f56a8bf7ada589e93793ff74ce7feeed89ae23cd3a052f1d00000000000000", "service": "00000000000000000000ffff2d557571", "pubKeyOperator": "1599dd169884bb1967a682499472469aac12506a98bcbe6df44e1b19ff4ff4839ce687e7d2dce079947f5e15ac875486", "votingAddress": "3UDZJ3rEQZrzGbDZqgMvziAUzhfp", "isValid": true},{"proRegTxHash": "be09e20b91f1f1a20c1cfc3af40a02bb51ba5df4c32b64a17b47f944f986aca8", "confirmedHash": "74ea5ffae1df79185accdcfbb5cf053363292034066cc7872400000000000000", "service": "00000000000000000000ffffd4186bdf", "pubKeyOperator": "83a480435b72d91f5e279ba5f8763fb26db5dacfff25409cbd1544ad4dfd35d8182b83594d5d641e9fc66b3ad1f18783", "votingAddress": "3B28S43FZLN89PtjHaiTE93Lz2wr", "isValid": true},{"proRegTxHash": "aa79beecddee2076b781d13f42af0b614d8b186ebec9b283c35fdb28a5f9ca26", "confirmedHash": "9232d9c64a0317d3ef5f58b6b7ad8ccf3d0506dafda9def32400000000000000", "service": "00000000000000000000ffffb94535e3", "pubKeyOperator": "8511c450f6583c51769f955331fa6404822e9fb9607958337e9b023ad5b7b8d189d313391608e3e42434d417356a104a", "votingAddress": "2pzYSdiMEfC4nvUDMqGhkh25zfMn", "isValid": true},{"proRegTxHash": "e06216c5895a8f1378581ebeb64b482aa2bc94e1ca07fe52c42ef7a1db6b59a9", "confirmedHash": "dbc0b455ebfb0409d4ea38e6e500bc48e4de626437fe6b042100000000000000", "service": "00000000000000000000ffffc2875218", "pubKeyOperator": "89348c4f4d65726d828311082a72676a55f35d79b3aeea184fe72dec907bde1d2e5457bbb738d59331c244c4fb9b6f65", "votingAddress": "3EEGW2bsnXjQqwEDXNXTWmk2BJQd", "isValid": true},{"proRegTxHash": "d6de0cb09fc4f070a0d85d8c73ee396e305d51cc9465fc152cf3b56fbc21d7ad", "confirmedHash": "6ad63bfb28225e407665c92cf032dbcd97acb3ea347c666b1600000000000000", "service": "00000000000000000000ffff5fd93062", "pubKeyOperator": "187aa3d3eabc56120307ab676e6a07f0cb9149481fc9fc3dcc7e3dd96f203e0f1ea799b12c842a42584a06fe1a5533ca", "votingAddress": "2GHRjCrhsLmY3yRFdYvv3FRn6KL1", "isValid": true},{"proRegTxHash": "50b39ff4e2b686649f8e57972a380fc575e772881fad2a5bc049920a5a8ae2a2", "confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", "service": "00000000000000000000ffff52d3158a", "pubKeyOperator": "83de36664a58d7d4683411e57a62a2929b2914ecf2c1e93216cb7a6d5f59e620f7ed94c5ae5fa6bb1b1c2cddb7a495d7", "votingAddress": "3gMtqk6SYAKhZrtAiYBsDULvRBje", "isValid": true},{"proRegTxHash": "14224ec5971a2e43da8b9a2b77d007e9e4afc20821b3e4b988e952756d89e21b", "confirmedHash": "2a0465522ca98da7b298dd208cd3a7ad16becf7641f9e8c21200000000000000", "service": "00000000000000000000ffffb951a76b", "pubKeyOperator": "164f0ea56a96c158c2ee7f509c5dfce2689cec060c772b7106e9bf80a3943a6164baf984c4ca88979a35527f87b77ae2", "votingAddress": "6CT5egERXWGQSMmJ2E4vF3p7QAz", "isValid": true},{"proRegTxHash": "a172ccb14281eb63e9ddd8ef2eec13bdb58d27e565743bdfd93a42b81944e9b9", "confirmedHash": "522b03635f67191653f35490a2c2ef0936b88832eddab26c1400000000000000", "service": "00000000000000000000ffff55d1f1b9", "pubKeyOperator": "89511b7f44d81a748038f01d29d507cfb09c28e17b30da1a7d2087502b35e7c746fc8ab745201eb47c88cceadb0f9e6b", "votingAddress": "3yASuvq2TPdABfeTRmnwRLLbk8Ke", "isValid": true},{"proRegTxHash": "56f940dbace43327a54105bb5ae72d85c2a1f448d388b0e644405eb1673b312c", "confirmedHash": "394d40f25efd0571871436692f022b0c5646f6ca94a1c4831700000000000000", "service": "00000000000000000000ffffa877530f", "pubKeyOperator": "925cf94de37b2b2fe06e520974f2b810b63067922a6b841b1764127aba09f05ed7b80b090c209c95c2a65297f1e691b8", "votingAddress": "KNXQYH3DAmRdKvwFryEjMX51uaJ", "isValid": true},{"proRegTxHash": "8426fcfe43787af77df7c4d9f9eed426574bd817f0ecf5cd7792ff9a29a565fb", "confirmedHash": "3fcf5dd320f918b9f6f73e13e081ec05e5283a661039f3022600000000000000", "service": "00000000000000000000ffff2efef118", "pubKeyOperator": "8de67e0c9d35ef698720bafd4fdb1eaba3939c5b3a943541585a32747c5cc032566d9e5737f93d0deedb824b9a217f82", "votingAddress": "3dqbKCrhJXuDgyogB8MU3C47bCPZ", "isValid": true},{"proRegTxHash": "d02320d2261f420be782812b8c15dca72cd33e2a44b0192b1cf09d426d93454c", "confirmedHash": "d08e629e93616e373ee7e1fa30725c6617dc3c6caa7287200700000000000000", "service": "00000000000000000000ffffbc28e712", "pubKeyOperator": "16ec8fab6eeb3b4f2dffd2346d1881764a1e5f8e9f390360891eba63872d84dc8d7ac0ba41006ec618fa6e1246194cda", "votingAddress": "3Hh5vouGgjVTcujqiDNvvqWSncWf", "isValid": true},{"proRegTxHash": "fb97824ef769946c8c3d9379f4e6dab008724bfd258d7212e7a5cb00e279a2e4", "confirmedHash": "c1400a8de9bdff4ffd5467cbe13312e6c6ba858c100562070b00000000000000", "service": "00000000000000000000ffff707c0471", "pubKeyOperator": "08d7fee0b99dcf25b3b5adc09d4eecff9b818f3d3f07a0cd3c2289a69ee798c5a1a2e7e20c1d9acd2510214f0419ed47", "votingAddress": "4Z7MMMeqpuaiXJgZB4i985rdKtvC", "isValid": false},{"proRegTxHash": "d76799da738a6bbedfd6b87a750c2b607016e52d52446938f27911dcd2915d86", "confirmedHash": "545ec730c74a19cfbdab4474d3373d168aa0d97f903852741100000000000000", "service": "00000000000000000000ffffbc28be31", "pubKeyOperator": "1706555176f9d70a201193d0c65e896927e5bfa4a7dc37ff6f7877017199d5d1da6da309d123f00dfc92f8c4c433e86c", "votingAddress": "43BpP2tePuEdYArevr2hLHiDrxXv", "isValid": true},{"proRegTxHash": "45d8f7817f7df12e1ca38664b71a5d75473f26330656eeef57625aa0b1f926b1", "confirmedHash": "4130b5dc087f489c12277f886d58978ccf05fa57e694729d1400000000000000", "service": "00000000000000000000ffff52d31968", "pubKeyOperator": "085a3b6f1e747579c963a6a02c9877513e0ba7ef31bc522dcaaa413a41216d71dcd47ea163aafc4ac33fd1959c9b5e6c", "votingAddress": "2VYvWK2CUqjKAF2d81jLLPVNpdoL", "isValid": true},{"proRegTxHash": "23c191dfd2b3a41ff89320f3602eb9ddc59e7bf9f1b6e5f28e5813596d294163", "confirmedHash": "cf91c3cb7f2b6f8831f101b89ef27e879665a43668b17a730400000000000000", "service": "00000000000000000000ffff3eabbe8e", "pubKeyOperator": "830667cc5e30323037fcbd3da8a893c6440b0058238c0272760a3efb4d3758adb56db6273ca64ab55636d87289e34935", "votingAddress": "BK3fyXDiCMFSyqAyUd6obgYgwsY", "isValid": true},{"proRegTxHash": "81f430add76cb476a97847babb98e1520e1d52e6fc5e9c7f7e75cbda1c54e057", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff84919103", "pubKeyOperator": "1284a6938cc410bcfdaf8af9e3092c1be0e7734ff3d1a5e1cdf6f9017922dcc69880ba48bdb26dd398cf3e2308661079", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "9f473bbaddfe59cdf1b63af58fe7212dc97f7dbb16519ae9c04356ef0d1ab0a9", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d52415", "pubKeyOperator": "02ee6571d0bbcb7fa9607144751429c2e5a8d353ac5c9548c007aaebcf9984d4a752992b04cc210fc59ec79a8e7bd8e5", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "e1aa3dc0bca40d7d7858d5954fb079d553806e1aac2f29fa67cf5f563258922d", "confirmedHash": "d8e25e5d4581c1c387012a714f499815651f684b301bf3071200000000000000", "service": "00000000000000000000ffff52d31504", "pubKeyOperator": "96c1d00f49b8a17dd7704a99bfdc3cc55561be2542a495007dcab3c0287bcb32dcfd4fea2e1c0c4e64b25bbdf690cf31", "votingAddress": "4Ygtb2RFezU98kMEMKFyUgkPYUh7", "isValid": true},{"proRegTxHash": "e0c03d4b6eace4c25b21c56f489577356d9dd40c6fea394160b6dfdd5c56d59b", "confirmedHash": "cdbeebc4a3580b1d894014dcafb37c7472a5131b33ac100e0100000000000000", "service": "00000000000000000000ffffb90534e0", "pubKeyOperator": "0f0fa3cc5976ea5442d527505ea2afc1ec6e829ae94e66ea50fee83122d12d554d60cd4652170c554fe19495a81d78df", "votingAddress": "rBjxk5gGwprYVsGcMYvhYr5P3Hv", "isValid": false},{"proRegTxHash": "dbf9622014529c28893710944c5ee8629672cb5f64cdc66354d41412d6351091", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b005", "pubKeyOperator": "131315d1c2bc8d7c55b25d6d3745d32912243d04303fa684b85c2ccb0b858a3d0422b63fa560096e80a605018a48b0db", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "81c4f802edbf2de0de29534b688e90d036748e4173edb64e0994da92ebb11fd9", "confirmedHash": "54ea191b304da1ffad9ce66cb9f960f7c80683a1bb33df031100000000000000", "service": "00000000000000000000ffff8ff48495", "pubKeyOperator": "01f444a45f32c21ae048627996cad12b9a7b327d2d52652b0107391d008261ff58bd632c794bcd5aeadcf09a81542482", "votingAddress": "2snrZqKJqpzw3Uyej88maZeHcUx9", "isValid": true},{"proRegTxHash": "bdd11779fdf6c538a8d64096bfafdb0de8e8d74b62aebcf2b6206305bdd99e47", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff84919bf8", "pubKeyOperator": "8934a6b95ecd6642e5224209a4e45ad4276c5fa2c28af76e8dea75643cd3372318b3daa5de7242a9f5bf7a05f9d7554a", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "109fc098c3c1f8b823efaf48e85c85d4538b0e6bac633065c9c805c72568524f", "confirmedHash": "772fc57fd3999c00dca348b913d050205326086030cd546d0000000000000000", "service": "00000000000000000000ffffbc28b246", "pubKeyOperator": "0ab28ae6578fdcc2b43ea15f0c760e826be36f40ad6f057aeaadd6cce85953c99c66e698747db66b56c359aff261697f", "votingAddress": "aJ8ryrBuRREu2BFpVH9vXFwZoYR", "isValid": true},{"proRegTxHash": "8a766a154b1801a85adf75834ef705187878d0109563bc1cda7c16c8a8f6bbd5", "confirmedHash": "6d4c77891849cc8c4305e5077d4fefe8f048a8f3e39f073e2200000000000000", "service": "00000000000000000000ffff55d1f195", "pubKeyOperator": "0f59a05f22dea58e69a6c165f74b30a7c9aa35508a3e70fbe48b7ad378d3ccdfa42267fec6c10136d9711508d8a9fa95", "votingAddress": "3PFtyaK1tiuuz3KRnwPTyuUysaz1", "isValid": true},{"proRegTxHash": "0d8c1014469ab7c0008012e82054520da9c71e9748eeb059dd38279d9a50032c", "confirmedHash": "1739ba773f37f199a5b11dcd31a61c69012f6814ea6a72c01600000000000000", "service": "00000000000000000000ffffb07b39c9", "pubKeyOperator": "0db290f1b2d6630dc5c2e2e3f37a6972ab7255dd78dbbb665a8e01cd0c79a02f00ddaac85020a09761bfe4043e3621f8", "votingAddress": "2xnbmSeNVa4qSMuV2JTz8oR1qzDs", "isValid": true},{"proRegTxHash": "6a258ca6006c13c0b4ffebc75d97578ead869237e2c5e95c5a9b84af4b1b495b", "confirmedHash": "310c73e95714516b464d28b024c61acff9b53c33d72886df0700000000000000", "service": "00000000000000000000ffffb23e1fe8", "pubKeyOperator": "033fdbaf1708c5d22738dd86873b0ae0add9eac211ab716b3185bf29dd043f66ea9bce85615413ece7511fd3a0a52b51", "votingAddress": "2nhphg6KDwyZvjf9K6TZmjK6N1t5", "isValid": true},{"proRegTxHash": "0a5cc31fbe46c7bb1c5476059768ea3fb23b938f9337f65c041e461ffe0f32b0", "confirmedHash": "e29d54b844b63bd5238c1312a26421120880ce7ac718a1040200000000000000", "service": "00000000000000000000ffffb009d203", "pubKeyOperator": "1471b214f594a26e2b17785b17c1b275990d3ffc14db46a4c1149ed7d7f77bdfaee1334ea86dc6de4c97ddde5959d7e8", "votingAddress": "43k9EooJd3EjBtby9Muoc9R1romG", "isValid": true},{"proRegTxHash": "61fa2ec243c272f408d41a78fbf68a7e8174dfc42d83241072480a049749eb98", "confirmedHash": "1f7adbc5629a32c806cf9df53c137bf3c046fc6ecfcb02d80800000000000000", "service": "00000000000000000000ffff59a38001", "pubKeyOperator": "8fc335d21f4706f4a42f247a5107fe4c7c8b41a0b46a0dbf3f23838f4dd0d4946894ca28187c96cac2496c338225b0d1", "votingAddress": "3RQGwcBpUyPqU6rPgrn7HjhcsNg9", "isValid": true},{"proRegTxHash": "b8721221983bb408a5fc9cae4b9b44efa0374e4cf7bac3dc703503da72bbaa81", "confirmedHash": "0e477eb1f69d7e5b1556ce5a7dfb6f7b99574c931b7b7f6e0b00000000000000", "service": "00000000000000000000ffff52d31513", "pubKeyOperator": "1983508d97551b8821aa657d8913e1daecbeeec0965b1c89f11d14357706f4015201483d3dcf9cb130d8b2af4a40680a", "votingAddress": "SyMyrkzJsfoXMLR3NZefRZJL3cz", "isValid": true},{"proRegTxHash": "461e76a1bb17d65ba8ac7c8df664b8a249723d09f9ac2a1398d6c9cadf80bf7d", "confirmedHash": "8f082926cedcd44baa4f39e221689c1697236cf11fb1375d1000000000000000", "service": "00000000000000000000ffffa877fc5c", "pubKeyOperator": "8389539ced0efa7ce978a4bc6f0bc4cb2c3a8c72246f5321b3d3d7e37fdc8b2f2b251cb32b7b06a2a4b893c8d3ae3e46", "votingAddress": "39AVav9rUusMaqqaWW16heKtjvDT", "isValid": true},{"proRegTxHash": "d4ca3cf65f937ae07a72a2752e1c9cbe96f545d9af2ecc18872a6331e7068ecc", "confirmedHash": "230fea54ae5a22a74d07216909ff204fc0a4cf53bcf076250a00000000000000", "service": "00000000000000000000ffffcebd8344", "pubKeyOperator": "110672099d2ffb65023efb3db11bdae6a63528af875c4f558372f4b4113c3e4be20986590127d3751a50d0c839a70b8d", "votingAddress": "V37bdW736vk8j4PwnRXtvVPQZaT", "isValid": true},{"proRegTxHash": "49de2017b1337efd58a3f1b95b6c8461fcf60547d8278c418b4925e4bce92c07", "confirmedHash": "36ffd83b863fd3f3919f4d3343aff81ffae1a83932183ea42000000000000000", "service": "00000000000000000000ffff2e04a26f", "pubKeyOperator": "03d131265e97e2247436c7dc1bc7ac7e00b57cb5f2701ed9b6596f535bf50395f11f00b7bd9dba646de93ad4d2dbe587", "votingAddress": "XbCz9YSPdtw9ofXr6iFpxvyiZxE", "isValid": true},{"proRegTxHash": "fdd5839571be1f5d3feaeab217bc5ea367e95189bfc8c8345cab785bd61945d7", "confirmedHash": "5a19cd92353030d1355cd7a7b01ef434cb2f9bbeb95eea620300000000000000", "service": "00000000000000000000ffffb23f7982", "pubKeyOperator": "85a828004c31b3887dd508da2ce76c9933c258f5e6107b30b8edeb8aed87e9aa3d17cbfa235148e3036d324556653d8a", "votingAddress": "4WWg2sjuDHnPPcMQGBZsKr6jYrG8", "isValid": true},{"proRegTxHash": "a81fb572abd601564de7045b99dac0ee98b77d4c0789248bd9360f732dd5e36c", "confirmedHash": "d12bcae20a5c2d7163ea44c721d74263cd120f48f28d880c2000000000000000", "service": "00000000000000000000ffff52d3196d", "pubKeyOperator": "16d199953d53feea6b685455f0d9d6981a78f166ba2fbb4b693f512d54d970c095b44f9a5a04130dd880e48e00b99a9a", "votingAddress": "41y83znWdw64EkwvxYensskPmSzr", "isValid": true},{"proRegTxHash": "7c941e819e2e7ef73169820ee97e56d9fb715c952191aa97d78205a35d5cc4c3", "confirmedHash": "5e29d0a7449fdaea23355de545eaa5b36622f3a06d921bb61a00000000000000", "service": "00000000000000000000ffffbc28cd0d", "pubKeyOperator": "1483b412ee48de18356f53673eec8bdfbd43c311d1bc7d36f9744e8d184d506b2342631edb55bafbdba33cac2e230d3d", "votingAddress": "2Dda3BniBUhCEcMftbWqPJUhocxK", "isValid": true},{"proRegTxHash": "ce4bd4a46a650339531b830e691351ecd4110606d75b0179d4598e249fe51b02", "confirmedHash": "e6a44b335d556552a28a82e936103f2917af881360a08a9a1300000000000000", "service": "00000000000000000000ffffc2875bf9", "pubKeyOperator": "98ff6b963fa2d2f2e17c8c268721775dbd9b5553f38eef1df73f2956a432a808597a551474bca7e1f22b5ca34d371a2e", "votingAddress": "ovui1WFsTs9yZj69WHhWdqLkPk4", "isValid": false},{"proRegTxHash": "563809e19affabcb2eeb076e49f6889ebff4419b675fb32c8fa2e7de86a5fa19", "confirmedHash": "649852c1a5999e39889b89e7baa05866242f8a65c05f185a1800000000000000", "service": "00000000000000000000ffff87b5fe3d", "pubKeyOperator": "16a5c6f69b8f1f6a6f5dd58b5e8d22de258b0822f85274c4fa965866cb5ae5efb270ae308dde556f34f0cbdd6ce9452e", "votingAddress": "KMbgWMMnXJzWyfmfQgA61977peo", "isValid": true},{"proRegTxHash": "5c34309ec55add2fc9297c8cb9f78414abd5a205ee885d9022f5bed55c9aec7d", "confirmedHash": "d82bad0030563a5b669480b1989978c8a45566066a194d3f1e00000000000000", "service": "00000000000000000000ffffb23ef1c1", "pubKeyOperator": "81eebeca7afe5337c07e5ec48af06bca9a859215e3532277b5ffb9b5537167cf2c4a5855648268c651c74c24ec71d0ac", "votingAddress": "FWjVHFUacYQdKmaaRA5XU6RZjF4", "isValid": false},{"proRegTxHash": "a6b50abd2dc4282f72f391f0be883463260ff89b5e8f3fd2d1e6a2d6593fd04e", "confirmedHash": "debe86bfd2bbec1b4887b60f4e939babd229361b8fc89a630f00000000000000", "service": "00000000000000000000ffffd1618115", "pubKeyOperator": "03304f1b028a308e17e4c3423fb57aff6611226af54631b2c0f7e3184d2e695aec8447c105e7a5446f21207a14320f12", "votingAddress": "3er5GYE7xUrVJM3RvKCfCxZiJ7fQ", "isValid": true},{"proRegTxHash": "d93a6fe0a7e2392bf5f058cfc199f440fefb1ce909c8e7a6cc6ea7df82fcf38e", "confirmedHash": "2995ee2c6db0df3006c1f6ad6786740baa14e983674e60e30600000000000000", "service": "00000000000000000000ffff6880e228", "pubKeyOperator": "99dd7e1273a1f3aa77c5e513182187e0b4e7754858b1ac5087eb3170211cac368ce7f3955220b527a1125593b9655ddb", "votingAddress": "4QTigtYTrYe8ehyHMe8n9DpQdbES", "isValid": false},{"proRegTxHash": "624bef2c9de75dfe09e6dc0ae84858704efe3efc5e06d10600897c8f3f2f0218", "confirmedHash": "bffe0d825eb950822d7e312bd8849b24d8044065949eac4c0d00000000000000", "service": "00000000000000000000ffff951c9ecd", "pubKeyOperator": "93236879193f2fd572297b3c1ef5710b89386946a0baa0effa35919e2e577c92b591232184847606c72a44bf6aea1473", "votingAddress": "39hnELvPSoo8kN8zAXSo78jjg9Ds", "isValid": true},{"proRegTxHash": "6e4cb62a0f33f89e4c582e25fcb50048d054f36185bfc1299cdba563bfd25a50", "confirmedHash": "dce08f081d740d8d59e56798d050d7bf7414eeba0b802a751400000000000000", "service": "00000000000000000000ffffa877500c", "pubKeyOperator": "0c4413a24083833089921969bb7c32b7216b1908c04b9bf4685f49badf171d4930d19af0bfebfddb96bee1dfe799839b", "votingAddress": "3TmW8DPMWqYyHx9NP7uQpyoRKzFL", "isValid": true},{"proRegTxHash": "629b4678a27d887bf1607a17e58728f0fa6fb59d97d8841e34a15d9c4dee1c1a", "confirmedHash": "7e6b44b80fb4ca556cb10a7af22ce8374050f63f2bddb48c1200000000000000", "service": "00000000000000000000ffff36270a6e", "pubKeyOperator": "86812ba3112a27c63881aaaa21edbe32165c8e0b99c67e575559256ce66670f297bbce3147178719a7ac568597713b74", "votingAddress": "z8yfKEB4iV3fX7FK9hXd9dJY2JM", "isValid": true},{"proRegTxHash": "d5e6e668de9449f13aa8639aa5b129d77b39440a0baa56b17ae5443079e2744b", "confirmedHash": "50bc30e9718919f4739ad5f6041d4dec0fe45e93b95641221d00000000000000", "service": "00000000000000000000ffffb23fec61", "pubKeyOperator": "0b6d0e7d52f618d3c9c4531d5033aa057a6608e01de4d529062f3265477f7256a039b3abd972ac2a69cf975fc4285921", "votingAddress": "39FYuRuR5ZexWv3L8fAYe2jpR68n", "isValid": true},{"proRegTxHash": "b1d7058a896c4437163d87f49a0ad7a1d5fcc1aa2ad2eb6ab3c0ed1dc2ccb6dd", "confirmedHash": "34b32e4a6c20ab8e15fcab875ed6f64bf18aa791aed0d8420b00000000000000", "service": "00000000000000000000ffff52d31502", "pubKeyOperator": "94af9bb09fb8915a31d5177afa031ab50e67a9a3027e8a298797d9e5c39a4c3586c7b2204d506b042de3455d19130453", "votingAddress": "v4DZfSB3joVhUxFfdjNNRY41kQj", "isValid": true},{"proRegTxHash": "516a200da673b9e0a13088c08c68a58d60240011b16cd8f2974510a9d07b648d", "confirmedHash": "b0593b2d2ee49c79af8a051223c89bfd53ac45c105432da91300000000000000", "service": "00000000000000000000ffffa7473c46", "pubKeyOperator": "0fff87b7faee5abbbe03c40e3f71be48205b78500f05b87a201d7b9c7fc783c49f508a59a94ddf59804da0e0afe3a41c", "votingAddress": "EFBsbYYJxzk5fVX7thXZaaJbERG", "isValid": true},{"proRegTxHash": "a870c9d8d2e0cb13cefe3e437ffc8b8bcb460f0d3b268c0185fe991a32456cbc", "confirmedHash": "a87fce24e4a8f75c162ebe2b3a07157759ec196ee8fd48ca0b00000000000000", "service": "00000000000000000000ffff12e83645", "pubKeyOperator": "194750b73777643ac8d170cce18f17d6504d790f2108fe204192b875a8222d08f3e1341ee490c9650945a4c238d492b6", "votingAddress": "3Tunpo4KRvBXZ8MnVTW59z52WiVV", "isValid": true},{"proRegTxHash": "199661ccb181bdbc9f4d15689f3e295392e4e73dfc351bd678d58ae1765a4c49", "confirmedHash": "294288135bd6e432d04d208f6de3d04cc9f2e788bc731f2e1400000000000000", "service": "00000000000000000000ffff6c3daf3a", "pubKeyOperator": "9966ea5585240a1b4e84751181c978d807804979dfaf635c211a110eab968f9fba63b5fa96930eaf8c94dc8e03b30dae", "votingAddress": "4L3D2e1MC56iuXd3NBBne8vw9ty1", "isValid": true},{"proRegTxHash": "916185e4c3743134ff46ba26a240c5951f1367d458bcbb11a6a803ae549965e5", "confirmedHash": "e31cba58d2d812e8575163c9c5006112dea102ec43bb5b6e2000000000000000", "service": "00000000000000000000ffffb280e54c", "pubKeyOperator": "0dbf57604a3dca1f55b6002374429c35600c1401fc327bf89bba798dc2d5e3a66868570929b05de2991ca3b477134eb3", "votingAddress": "3BufFv8RMs5wE7eiLKC3xKKn7QHU", "isValid": false},{"proRegTxHash": "1e353bd659275d47c94ceed14d634a07330f77d8ce0781bfae46aefc9f138fdb", "confirmedHash": "9e617a8bb57b237c9d1273971e81d810358ed6fe9033de920f00000000000000", "service": "00000000000000000000ffff2d3f085a", "pubKeyOperator": "0f6d5df49c15bc66a46699eae85efecf9eb91b0b571dbcf3684e6ca9a898ec9290fce2011ebcc070fca5252c21bf5057", "votingAddress": "4XqXTKd7Q511Y4sYurhx9S9gUvVM", "isValid": true},{"proRegTxHash": "98ec4addb064afa20ff6261b503e4c1ad61920aef992e589aeabf2e02163ea55", "confirmedHash": "10c7777e0cf6e800667f4aa17e85a7ce8720facc6b91ae071400000000000000", "service": "00000000000000000000ffff52d31585", "pubKeyOperator": "81f0c114a7feabaa2581c19eaf1008545546bdb83d9808a11296aece37f07d3528ef95a348f1f3a66a6daeb888e2c150", "votingAddress": "2m8Ue9ZpLNQg4U8As3FTztzDyN62", "isValid": true},{"proRegTxHash": "6443d0bc3197bf596f7d082696c82aca58c04b001ce64d074d098600d94f89af", "confirmedHash": "3ff15183a0e0066480a5000c0b452f3a40d995a5ea56a5910c00000000000000", "service": "00000000000000000000ffff907e8ea7", "pubKeyOperator": "8be8f2210aeb29eccf9934ca3c2c74dfd08ebd34685268f7b90f5eb06d11522f3310197332cb90f749ba69cc560c1b6a", "votingAddress": "GBekiA2mtM1V8kZRtj2XjLWGj7z", "isValid": true},{"proRegTxHash": "e1896a5ea4f5412bf9fbb2335757c838c03a79561811367cce9f943388d03d96", "confirmedHash": "0a67ca85777b8aacfacbbef6249f41264d79baf41602348e0e00000000000000", "service": "00000000000000000000ffffb29d5b7e", "pubKeyOperator": "0d23bce24db82fdd9a41b5e4438d19558f01652b15d972b61b1fee4efb365e910a671fd2306f51d397ff798a2218a44a", "votingAddress": "qtQ9piq98kSN5thJgTdg4Gh6kzS", "isValid": true},{"proRegTxHash": "a8a99af3804f1829002744c44a9189638e8ae1384ac322a5356250116824b0bd", "confirmedHash": "2a0465522ca98da7b298dd208cd3a7ad16becf7641f9e8c21200000000000000", "service": "00000000000000000000ffff55d1f12e", "pubKeyOperator": "0c1f9416046277897b1c558b2bf029635f428d5f96b05d1d22abc2928ace712c5ad4b272deaa3c78e12adf5ccb4d76df", "votingAddress": "BSrXM52nJvah9x92anQhbZ2go7a", "isValid": true},{"proRegTxHash": "21bbab0afd50e2abc26dfe835e7f7c9b7985173e2de5f92591d2756c32aea1c6", "confirmedHash": "142e887113669ab870200cb0acec5c3985255defb5bd9af42c00000000000000", "service": "00000000000000000000ffff55cea559", "pubKeyOperator": "96427db7ac84ee40c82e4680baa4185518ded1891f38282745f070fff577c006cfbc5db3d7d76d20bed3ec0e1e696d6a", "votingAddress": "9Ce7224NgS6Rq3SfRfQAbQXR3mY", "isValid": false},{"proRegTxHash": "bfa49d129459174c95dc7bb0cb849352579d78e1a4769810bf80ec140fd24024", "confirmedHash": "a29936d738b44010fb5bf2fd6b7de033361cfb1eb53683ad1900000000000000", "service": "00000000000000000000ffffbc28b6d9", "pubKeyOperator": "851f035b074d16ab7d81a0d357f73d42d42b474ff472d7dfe02a7571cc557a7f9cf69f6e6e1f5cec01f3e2978011370b", "votingAddress": "2ccfANAQbjCdeWCHJ3SFxdxhKtEi", "isValid": true},{"proRegTxHash": "8e87dfae4b634d44c1f68d823ade7ad7ba24f41bf612c593451f45b0beebb15c", "confirmedHash": "9dbc1963c8a90da02b6de7e493f5e1fc789a908124dc181c0c00000000000000", "service": "00000000000000000000ffff58c6b8e2", "pubKeyOperator": "0380e0c6d7e915fdc21b53c65ac3d7525abd42ed0f72fe8bccf9dbfb60df2656f400af23c066f171e60d425c84e1644f", "votingAddress": "2LARc9VDYJs5eetN8QTVqZXxu6EZ", "isValid": true},{"proRegTxHash": "39bdc9d32d600d55cfdf1e86bb82b746e17def9393678e7cdbd744d2ad52d45d", "confirmedHash": "00787909c9b5eba48f1473f57bd3114b2b1262a7ac3e74831f00000000000000", "service": "00000000000000000000ffff55d1f17a", "pubKeyOperator": "91024e6f76d6e4f249b9a845739c55857dc2f2e31e188d1298273aab86b6e8fa280ef08d62119ae2e21724ba9fcdca18", "votingAddress": "jouUnjpB4Eow6S25ZH8D9tFcsXL", "isValid": false},{"proRegTxHash": "92c11db601fc571f71afce97d15a258f74cba3c82e4f6380ec732ed0dd4c8e12", "confirmedHash": "b4e2f15d392d98344323c3664d592056d0cdc3ce6ccb485c0f00000000000000", "service": "00000000000000000000ffff03dd3df2", "pubKeyOperator": "00cb4a969524e8739c403fe8cb7a571a375602ee6d69190442a8cf60ab9f24829ccbbb2397d2931a929316024508f19e", "votingAddress": "q75h1bdU7N8XoU8fpoSpsmoJTy7", "isValid": true},{"proRegTxHash": "d848779beba0dde88b04d11a3a73ebbd0adfbdb870fde5cd0b793fa68f70b861", "confirmedHash": "e349ebd2bc41819c9e2eb26b8efb58e5bb5d42321b7d92881b00000000000000", "service": "00000000000000000000ffff411472df", "pubKeyOperator": "88a594073c12b9966a99488e2cff9666c4e89ca316a4da205959abaac34cf16e675436d3ca4939fec427ca782383c8f3", "votingAddress": "2rbYe8Gumj9Wb58yY6fxAdRp3RR1", "isValid": true},{"proRegTxHash": "7a0bc02a7f950d3b51c2e625e4d64d02b93ba4efb2a0e2c9be64092dd073ebc3", "confirmedHash": "968c8e69e2ebeca1df06fb812c76c867c3d5a95e333fcc542a00000000000000", "service": "00000000000000000000ffff22e25bd2", "pubKeyOperator": "109505f60bfa1f6998ead9876164163c649fe06959da797667080d486b26576d9a739eefa22e29ae0a46d4919833b17e", "votingAddress": "2WjKZiNV5WF1wkbHRcU7pFXKQ7T8", "isValid": true},{"proRegTxHash": "9978d45fe107d57e935b3387b4f27f19fd6b315eca6789236244fe2c6a16290f", "confirmedHash": "562d29d7abeaa6f6649e7c9d60b4d31bbb684e08c26560912e00000000000000", "service": "00000000000000000000ffff52d3192a", "pubKeyOperator": "064cd7b508ad623a51d79c8557a667499383e8d723ec79792d08bfce5fb96a6a898f502b74ab79761fed79c652c081d9", "votingAddress": "3AZQwshMabqZP1UJbBDs2yEgX1xb", "isValid": true},{"proRegTxHash": "006794d1306e00b42faecec6c962d95eb99bc5dc2ba6182ca749ff16f8ac69a5", "confirmedHash": "a3dba9f8c6ef76eef1128001dd671e2462fd49ef40ed379f0600000000000000", "service": "00000000000000000000ffff52d315f0", "pubKeyOperator": "1861fb12213ec53e74b34a189a89594f24c670e21ecdd2246bbdc1bb95c00a02191579e8c841cdcc9d58ff82692970cf", "votingAddress": "3qBeCrynd9HSBRYnzJhNcLskGR3P", "isValid": true},{"proRegTxHash": "b28583e53ed251010789a5a67fb3de47fc4aae75c98c61ba97f3baba09d5c4c5", "confirmedHash": "ef5c4419ff85c107d03909e43abca9291e4b7774e617db5a0400000000000000", "service": "00000000000000000000ffff52d31928", "pubKeyOperator": "10d2aa07a52ff502940e4fdc7570d91edc5c31b031ebb505b7e63147d1d1910c92ad597cdc8df63ec1b36bd8de8ecd90", "votingAddress": "3679wFgDqhdT22rFcLGtNJdrBSmK", "isValid": true},{"proRegTxHash": "e77eb131911834b6081a8dd4e0c158f58ab990a558e865503ed4b60f0696c65e", "confirmedHash": "5abb282aef9efc154fbf7b5840526c3649c109f1371245bb2100000000000000", "service": "00000000000000000000ffff52d3153c", "pubKeyOperator": "0ab7b6daca1ed111c3c557f4553cdf36fb61d05a6ab4fb51fee489277bdf35fdecaaad0f0f6ba6e7daa4c16f4e3651f1", "votingAddress": "3WMVnveC22ZRcNH5ztfPuycdKPPb", "isValid": true},{"proRegTxHash": "25cc10b1347ab218b03199d02126bb626e658a0ead6aba9666bf021356fa5e20", "confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", "service": "00000000000000000000ffffa8773e59", "pubKeyOperator": "0a6efd9f8ed3bd22b11bfe23b1688f13b932a2679a8c6a82666eb1b31011df12234a024ea1e143a005c9299eec64f104", "votingAddress": "3pg9jz7WqXuKyeHXW6xAigazRbmb", "isValid": false},{"proRegTxHash": "e07b6381aeb4a8775b80a19e8272a204c9bf2eb34f654d5254e0c139029828c4", "confirmedHash": "1435ee2c7a90f1d4b52b7861810792f9225680ddc6d4a3390f00000000000000", "service": "00000000000000000000ffff8b3b6467", "pubKeyOperator": "0756cb7f3fef1dd9c4363f3dd5670543d1a8100bc0f40419951f97816ab24f85983ae8c5d5517509cfa7e076c5df9467", "votingAddress": "3aBq1WbVDJN1tTDFwJmTAd1aS8ju", "isValid": true},{"proRegTxHash": "7e8bc95d796b0e3ca2b3c003f38012fd4a5cd6c949fcd7e061243891e948c1f2", "confirmedHash": "f37b30f8ecbd294d20fb7a8706834b3a92f9bc0d5b22884b1b00000000000000", "service": "00000000000000000000ffffa87757ca", "pubKeyOperator": "152bb93aa256bc1443ad514c7c571241fe31d5093c3f48c68a3bbd5030d18e2079f7b0771165da8699c6ae35fee04f1d", "votingAddress": "Vt12os3FwLXW5s5B87VLnNY5fNf", "isValid": true},{"proRegTxHash": "29b825815eff60b23ebaa2236b8bf9f46a825a5bf93de2c162a08ba604d6675a", "confirmedHash": "b4389bdad3d95c0ee49fca8ce81ab9ba6068e8be3c68a6511400000000000000", "service": "00000000000000000000ffff2d5575be", "pubKeyOperator": "0584bf83ac4cb511b79c982507947649727c907074bc9232c3baea91e8b8159e5678a479cda6c9416fa1198ab453e92d", "votingAddress": "2uSP6TencLC6iCqmnCGVGpwjVAUJ", "isValid": true},{"proRegTxHash": "b91aece28e840053b6faecab4a8573a130a93b77cb9d3a8e54184e71b50be08a", "confirmedHash": "e4eb0bbdfbaf9de5afb5454505a283623f653c15604e93f40700000000000000", "service": "00000000000000000000ffff2d206fed", "pubKeyOperator": "1924596ca96e786bcc2ea18949459327bbe82adf362d96e035c4cc9e189b8ab3bd265ac462a0e7766cf7f4555b2640da", "votingAddress": "2Ryi4MSd7xqjbWNCtxKi8SoBefzc", "isValid": true},{"proRegTxHash": "c6ecf10ad0d4c6b129c388c4b006574543ffd5cc207bb7211b0ce91173ae99ee", "confirmedHash": "491c506eec8238a9b841aad159f0072805127270d97aea691100000000000000", "service": "00000000000000000000ffffac691515", "pubKeyOperator": "18070fd83caca402cc4cc26ecb9b2eb72f3979fba63db849fef91ad7eee26fd5aaec5ef46dca9375517222e720cf48ea", "votingAddress": "CW6v4z9aY7p8VeSs2kZGmDq7ern", "isValid": true},{"proRegTxHash": "8084a5ef61b6dadba2e0d304779d18225c91fb68f5ebf0b91771debff9b5fd43", "confirmedHash": "49da7158f6a69ed01ee225532c4cc4f64b0b2e4a5056cb531d00000000000000", "service": "00000000000000000000ffff50f084e7", "pubKeyOperator": "0dcbe6d96872279cc7b4b186eb39b9dc5c2dbf948eacb5a8c9aaf40d2365e5e4bc280b3b8b66624b8fd0ee4b4d7f930a", "votingAddress": "2GAHHJmZcQGKegRi4w5yXWBJpm49", "isValid": true},{"proRegTxHash": "7220a5a44f1a6b0cfb3b40bdbbee9d02ea7d1c3fe1a22c328fd87472b8b2abae", "confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", "service": "00000000000000000000ffff55d1f263", "pubKeyOperator": "8ba14199d07185760958e42620879fe402db41e8bafa8d6c78c45cec9e805e95d4ecb6f132362b8af35d0bd3b2903270", "votingAddress": "3g71iHYRCMbXwaa818TmZyVprYPT", "isValid": false},{"proRegTxHash": "b32b72d86266b4e465814d56c0e7738e46a8efa2c071f4a0536472fcd37a5e21", "confirmedHash": "f612dc63578d79cf6342a79e99d72147d99d840e12b639350800000000000000", "service": "00000000000000000000ffffc2875911", "pubKeyOperator": "12e7f67ca7efe9bb0c9b8aa199468a69de65d1468acfcce57686cb061c7bf1d9c0bfcf45d955d8c23205301bb21ee0de", "votingAddress": "24vntBZC9uDBeNc9RsNdxx9tiQyG", "isValid": true},{"proRegTxHash": "85984116ded6a89a7cb33ad1806885809ec194b0b6d60f1fe0a85cf76d7e5d29", "confirmedHash": "67d290c14597bf72400ecbf2016e6baf4c7bc940e6f269331800000000000000", "service": "00000000000000000000ffff55d1f127", "pubKeyOperator": "986b42909e7afb9250d591df2c33e11929e7a6b45d897ab85593b03d82099e91a524f391b05a653d46b0efab5eb090b7", "votingAddress": "hAfXv21HygJ11TyLjL79xSkg7PT", "isValid": true},{"proRegTxHash": "35a9731f3a1b483764fb0a57f9f141a3dcda80c36e43b77d12ea385ba788ba41", "confirmedHash": "95f0a2365548e8274e68cda2429773162501058f9f11f84d0300000000000000", "service": "00000000000000000000ffff9ef7dc7d", "pubKeyOperator": "973c8b5dfd0db09f34ba03e8a7f781c9d1fec1d66775773a1cd5e0a5c14a47ae72222f0d805328d91a61e7a67c1e730f", "votingAddress": "2HeRMkmbkBu558QMYYc7fWB9ihLK", "isValid": true},{"proRegTxHash": "fcba41d87e3c22e83b1c50c89de5b2af4d9e6dd041d1b0310582d5862478747c", "confirmedHash": "f475109160142b7a3c9e88937ee42dddd0daeaf15eea728c1b00000000000000", "service": "00000000000000000000ffffc2a3bc63", "pubKeyOperator": "0bddfdb89b525e49efdb1b091b6187431847cf16f76c0e4544adf434c7d8846d74acf714b9e4d3622fb93b67e0f22cf2", "votingAddress": "4ENsbC1w5R3GmgcaEzmw9JTnV4Lg", "isValid": true},{"proRegTxHash": "277928e0fd563ca739e5b015bd13fa825e78b75bbc775d2134daff08b7ed77ba", "confirmedHash": "81f093493201442e11c4f7a475b5ba400311a79c3d0587b52000000000000000", "service": "00000000000000000000ffff8ba2699b", "pubKeyOperator": "0aceb6394d7af002d15a436ac9ae94e6e438e114c2ce30fd2858130ed6951b7304d30a6f0ccd86377d9193e2bbad2a9a", "votingAddress": "3GcYVKoA3JmHjj6oRFEck3u3ezHD", "isValid": true},{"proRegTxHash": "40fe0c5442569b81c23e5c905df5fba1c9e2b88969500ab2902e5445733cef0a", "confirmedHash": "dbd9755748a8ca6bc0fc84dd1aab2ee6945febe2dd4522230d00000000000000", "service": "00000000000000000000ffff8b3b3a52", "pubKeyOperator": "8535c2febbb143cd042c15a743280c767908a5ed10285ef3d238e207fad0ebcb976a9c6acbbb34fc2f8c043e9522ad35", "votingAddress": "26KHmeXPAi5wKtFEKLMGQ5dD6VWH", "isValid": true},{"proRegTxHash": "876054c543fc77b70bb5f8a9714e9508d223fd517fc2cccf741cfff657b1579a", "confirmedHash": "6ed6a400b9c9b65d4da63626648be9e0bf7bd2b07a8e1db71300000000000000", "service": "00000000000000000000ffff55d1f1ec", "pubKeyOperator": "8207d9cec67f3e5c81184e8cb36f14156b3f5dacb5dfd133fc667d6ba1cc14800625d368ab83c5f70b879f5a96bc3abd", "votingAddress": "3WPuwJCgWTv9PEQNhVgSmC3w5U6o", "isValid": false},{"proRegTxHash": "59a7f709f5f6afd8c1003c89eada60e6025cd25409e6cdd02739ac9384e4b8b6", "confirmedHash": "92a79904c818d28c8d4199182b44a8b6b5ee7cc4e91b207b0d00000000000000", "service": "00000000000000000000ffffb951a48f", "pubKeyOperator": "935527a3597597464ebc11e1c6cbb227902452c1f5adce861e778542c86f3e17442733f81fc91b5d6aa58b0a2fbba8c9", "votingAddress": "4T1HZD5CDW2Xaebxso4fHreUd6uz", "isValid": true},{"proRegTxHash": "9f3941585426c04720c5a4fdb7a5ff453477e4f83af159404682ede83e42c548", "confirmedHash": "d9609cd6c5269670776c3d9cdebccf53bbc1171d72690fef3800000000000000", "service": "00000000000000000000ffff88f45ba6", "pubKeyOperator": "854fae4ddc13776784a04ae318d45067c9f2a5cafb823170717da3a495c2a661a67516a5e146391b009ab792361f0aa4", "votingAddress": "2kaeeUSdbneqmPuFERuTDJDBpPhb", "isValid": false},{"proRegTxHash": "31723ed35ce626da3a964708d8b64d723a9ef9afecd5192e7e659c53fa6153fe", "confirmedHash": "cfb5f538cbe1bc7d6e9a0b05daaf076734116bdfe4d2e0850700000000000000", "service": "00000000000000000000ffff2d4ccd8c", "pubKeyOperator": "170790a29d8f0b0489fa16c6962d8d55b8fba2168c891696d93064d540bcb3851f21edda80086e0e680c884533be33e8", "votingAddress": "39pqsdtHzqd1Nt7UZ7VHhyQ9wZxg", "isValid": true},{"proRegTxHash": "7af91a141038c282c9fae2a83d74f89401e0ba8a27bfe6ef38c41db89477fa45", "confirmedHash": "7ece306e876a50564e474dfb04c25b111b017c165e8aa3861000000000000000", "service": "00000000000000000000ffff8b3b4454", "pubKeyOperator": "0a7a2b0254d27b5e6f142d66f11087f8a6dfc9ad035ec7c993faa3bac78057afb6c87c151b78ae7bd8243c717ff8659a", "votingAddress": "2WnHFhEzxNe9EAMvPB4FCmk9yBjH", "isValid": true},{"proRegTxHash": "2a9a20598957d79f667065421a31e788b7e7f2dda81eb261499863031593c475", "confirmedHash": "5d4a289f37dd6b2d4925fb0280834f89fa8729ce073e6bce2800000000000000", "service": "00000000000000000000ffff17b68015", "pubKeyOperator": "9175b8913f841b806272fbfb8fec7fc88fb7c856890c907d679c359847af42a9078b5f351364a13552fad206b9bbfb72", "votingAddress": "2QQkdMPYMi5KQPrZfq6D4RgVBZ6v", "isValid": false},{"proRegTxHash": "168815dd8f08954cc6cb34a9ab5a187a2e45fe3a94d1d0ab8f190634cb2e6336", "confirmedHash": "8065060354a9b7f656aae230522c37a5d8c82514a46b88510c00000000000000", "service": "00000000000000000000ffff951c9a33", "pubKeyOperator": "8da5f8c2edc89cdcb0bbef9a0cd815f77aa51e6af66ac3aac4209cc22873d924b43b4ffe8930f510918fb46ac8c096e1", "votingAddress": "3m7tqjCpJxjD1nLkbK5MA6GNnVZc", "isValid": true},{"proRegTxHash": "6781474b23443ba1d3f651e5d66ae4d4eb27d8344e8f47cf82c1ce2dc78bc4b4", "confirmedHash": "c31afec0ccaac8914e8b1e1bff725ca26155fcf4d88e77ae0800000000000000", "service": "00000000000000000000ffff52d31972", "pubKeyOperator": "93bfb50497fcf03e8e1c308e68a0e3315850c410ba0e2ce3e3afbd7b16503e1cc9842e20e82774cea017c01aad21f526", "votingAddress": "LmEVsMhKSb1gpgMQk6oUednvTy5", "isValid": true},{"proRegTxHash": "cb1002143ac5db461791432aee2d8dea8a5822ec1f194e21948e48b054af1c75", "confirmedHash": "037f27d4cd63d0e499d849a06b3416b8a6a3eb3e52a7415b0700000000000000", "service": "00000000000000000000ffffa87757ce", "pubKeyOperator": "1605332608578ee8b5af3e5c79bf7b190584c7d0be3ff43e5d8b9075350cbe74e66068ad7eeceb3b90bf4c4b352cc426", "votingAddress": "32EHzS6d3nDpkh4QWavyRuRaGiuo", "isValid": true},{"proRegTxHash": "2ceb10a3aac3a825f9614cadda68c11524b735c93e5dbe98513a4b63233b8ce0", "confirmedHash": "3616b77aa899df1aae99939ba0d5fe8514eae9936146ea4e0400000000000000", "service": "00000000000000000000ffffd9450d24", "pubKeyOperator": "11e6c75b99a4fa9b92d3c1c93490dcd11fdc4d7fb539baaaefa1571f2ebb734858df118d0ad0d1ee8b66a306169a2869", "votingAddress": "3AuGtAjgzhqpVVM2fjYEKfHuyRc5", "isValid": true},{"proRegTxHash": "f96a55dfe67b678369726916ad11770cac644a912f6a35b45e04b4783dd44065", "confirmedHash": "a709770b238c4ed9def6059562a4c5612f98d7d3912962f80c00000000000000", "service": "00000000000000000000ffff2ce74f92", "pubKeyOperator": "809ba9d7c91eda6747dbc893d0b4e8e8e9a15e51c48d769cdf71115ede41c45cf64298096ca9ab11848213ce26ab32ed", "votingAddress": "YjQtqNsJJ3fhbY73aoYnsP24tBP", "isValid": true},{"proRegTxHash": "aec4bf07bef409d4b053545de6a330e492bdcba988c9b7ecefa66d9197e05299", "confirmedHash": "1b1cf4cc348cc176518851f03e28c77ad658bf8bd42453772500000000000000", "service": "00000000000000000000ffffcfa74081", "pubKeyOperator": "95ebcadd2203812d74f1bcb96331e925376aed547bf9d93d09035e30956289763aeace9e0ee48862c4b9bfe91ef28e05", "votingAddress": "3xLHgTjqfZLkG1UXCH8Db138wUVB", "isValid": true},{"proRegTxHash": "1f676ede3eddd2189fd7ee3c1039f5614a77246a6714fba2c969442b38fba451", "confirmedHash": "436016906e68ec8344afa403a6489e8251f03835b10f3e532200000000000000", "service": "00000000000000000000ffffb23e3b3e", "pubKeyOperator": "00223eb86a92c58d7d528bbe7c5ad99e77b51ff5ed81425a8a460916d068bb42fd7d8e26f0ea475150de79cf20ca8ee7", "votingAddress": "2TNxEpmkfr4MJXssog22yUrAEACc", "isValid": true},{"proRegTxHash": "4ef104d881f9302526a152e510ea3c13330a3d7e6fc8a426ed9ade0e2d2f7bd1", "confirmedHash": "55565f71dfc18a3218f7eef9683104cb16d3f534c70c890d0a00000000000000", "service": "00000000000000000000ffff52d315d8", "pubKeyOperator": "8a76dc8591f8a8cb7cf3b50452b1c1da9b650703524b335add719e543a6caf4bcbd8cdd37413c2028f74775672fab928", "votingAddress": "rnTUsHYDeE4J6msz5sooaK8ajNz", "isValid": true},{"proRegTxHash": "1bc5fdea218ce5afed4c2c204347372669cffb89d1fe0df74a5f3a90ea80cee8", "confirmedHash": "083f69e510e7b9d047b788db292f6f0dffc5110edb5828ee0200000000000000", "service": "00000000000000000000ffff87b53224", "pubKeyOperator": "0ec1cb67584a867884f0ed7e6e0885b021f3f56e3ebae4258603010884d495964243669841a20db2fc071ce479047774", "votingAddress": "2teeeGwfW1jaxbhCi4bdKkFARwH4", "isValid": true},{"proRegTxHash": "296f7722af7dc382a7b29042b48c12f34dad44b65627157458b1c817b3d73515", "confirmedHash": "21fa64eb92df4a915214be071ccaee5d6994cd7a005201050200000000000000", "service": "00000000000000000000ffffcf9477be", "pubKeyOperator": "9799709b1f7d39da3b24df0190ed9a49b17d6d26210508c2cfd1a4a19b7a7776e5ecb71c8f909d06fa596696513fc9d7", "votingAddress": "C4j4hkBicr7RCotrdCv31KLL61S", "isValid": true},{"proRegTxHash": "2b98a9d81db625248d37a121c72f402d0b87218b761ce4af95e2c863e4db0d31", "confirmedHash": "aea7e78817e38080cc59e041d60839ee1bcdce5a45b9b4ec0800000000000000", "service": "00000000000000000000ffffa747859d", "pubKeyOperator": "062918bb98ed21a7d9421049224c66a183cdcc868f5ef46a3b6689d986fa750e0227981bdb4c15c2c3331b21451e08b9", "votingAddress": "2dHuir9wdmJ7uWYvZNJ6geAmHQdR", "isValid": true},{"proRegTxHash": "ed2d776fffed62c330f5ba4b1add32031c249b395ad3d01e939e9a8427b1bfcf", "confirmedHash": "680dffc42bfe2476ac2a1f0ef164bf274f5b1167e381d2982b00000000000000", "service": "00000000000000000000ffffaa4baa78", "pubKeyOperator": "14a2602eb1ab92786232cbec13c7aa73f8485d06b1907bad1f1a59fd98aad8ff6f66ab1ba767c5e75a5f99011ee87615", "votingAddress": "3dP7ijSRzHxEGGxDqKKnvgn4YTyC", "isValid": true},{"proRegTxHash": "cd18b8ecfe4a3a9f8e4ae6ecad145c621c0de767eb785e6c594a522c3f860d2e", "confirmedHash": "a8540a8eb77addfc7c32ef7b417d978c6f5dc28e1243be5d0300000000000000", "service": "00000000000000000000ffffc0b85acd", "pubKeyOperator": "8561e8939b55cd83a1e52cf31760d33f19dc6f890b7b528e8d76d56227cbdd52631aa2ed1752d9a0be8d54b4aca9266a", "votingAddress": "dWeTnoTw9P7d7gPggyxQoi3xUbS", "isValid": true},{"proRegTxHash": "fe060349a4a38fc056b9f9301091906d8589b45415252b2f8e363af535cfec6c", "confirmedHash": "abd05702b7c9ee0018d3dd997ac27296acb2fa7ef02fb3ef0600000000000000", "service": "00000000000000000000ffff68838f09", "pubKeyOperator": "126e7b3b2ab146ef271e53faaaedccdcbc84ef145e8e35b39d8c1f32db6833e1734df89604bd99bdec5825ab5bf10dbe", "votingAddress": "VMoHUobJqrYcwBM4BvUnYDBqe2H", "isValid": true},{"proRegTxHash": "c0287a0ef607c787c2b86435bb58dfc09f0a4c4d5d0299c68bf555c2880b4c97", "confirmedHash": "dcea58f5fc4284e77e2c032243880a0fe7689f412810266b0000000000000000", "service": "00000000000000000000ffffbc28cd03", "pubKeyOperator": "0c656645c53c121834d6d055152dd1251d80bdc12c88f6e032d9f4f4b4f395b2ffb24278cfe6dc83fd0f591419b31f2b", "votingAddress": "39K9ue2VQeVCbK4DYYG5pKFbZz72", "isValid": true},{"proRegTxHash": "54624763485fee83a71dbbbe0210f58f26ed179d7aac7f7da2898a22c526bad4", "confirmedHash": "aee06378e9e6fba48a1b7f9ca793e66e4c309aca92e68efb1000000000000000", "service": "00000000000000000000ffff2399efb8", "pubKeyOperator": "027c38f653802b7f62b2923cbe5053914eb125396cd218c940037925185f6b26121019cc95be48798e7bc45ff8483777", "votingAddress": "2zvmrWMV73KfuGBTNaVXsxEFwD18", "isValid": true},{"proRegTxHash": "ca0a4a7d708b745d4fb500ba6380822e188e11edf02a828730a99b769cacb9f0", "confirmedHash": "db4b89252155240a5761c42d062cb2b52b7672b1accbd5cd1200000000000000", "service": "00000000000000000000ffff55d1f252", "pubKeyOperator": "933a0df1c426a8b3000db129d0ed698a85aca314eb4d00cf7c7410647693ecaed0dca71f071250b7ab993fc9b869a56f", "votingAddress": "2VPW9NNpFafLYUoejCMgX4UV9BiQ", "isValid": false},{"proRegTxHash": "77898628fe6ebd3a2ef9d8ead0ec963f0c28e979fd129c1961091813a45ff544", "confirmedHash": "5ed4f5fc30e936bcc9c149e0495d75962417f1653c1a2ce71f00000000000000", "service": "00000000000000000000ffff52d31909", "pubKeyOperator": "0c802fae7c97ee388645e447bd980112271176aa746b483c2b0aa21b96168066b99fb5ae137fe4c94bcee9a981db4a29", "votingAddress": "3x48BTGdzXxp8wyyHvYgUvaDeKL2", "isValid": true},{"proRegTxHash": "63984fa186fa217ddbdfacab90e9c084c53e21dfe38d7490caead5c6173aa0fc", "confirmedHash": "1a423d6286575fdcdeba5e43f7ec9acc119fd9ee71f3cdfa2700000000000000", "service": "00000000000000000000ffff90ca652d", "pubKeyOperator": "863a2e21dc3626bcdba681a915122897dca90b6d3b1378c997d5ddbe9c434a27780f2728120c4dd06047912eb8d41a16", "votingAddress": "3wQo9Cwp2zSVJYhBwPwyZoVqpviC", "isValid": true},{"proRegTxHash": "0267200e3b16858ec2e48272395c373f1668bc541c07d6cc1aa17d7ce88ce03e", "confirmedHash": "ebb33dc05bea0a8b204bad88b73e00990d3cd975a63b4f080400000000000000", "service": "00000000000000000000ffffbc28fbd1", "pubKeyOperator": "997bbe6e645433cd1bb49621fe12a7d75770b071be7b4397a97604c5eb66c0538fe7b301bed65ddbd1c916cf46c12e12", "votingAddress": "22QNhtzNwDbW1WMmFdAi5r7L5zD4", "isValid": true},{"proRegTxHash": "7458f8e9edf25c9114817002e3fc772e707b0ad3dbe1f05a058de939d03e669c", "confirmedHash": "10dd459ed2a61b3047509fc58829ce0413ab2b8e535ba22e2400000000000000", "service": "00000000000000000000ffff68f85f68", "pubKeyOperator": "0505cffc69beb642ff54726ff52139cc18014c6cbc603d46a706ecaf9668db058e7532a96aae6d476ce474c7b122aa71", "votingAddress": "3DHbEK8JojVicWWDH4D7w4YFhabW", "isValid": true},{"proRegTxHash": "6d4476e1956cabb0331ead7baea1fba9e347aefe10c27681aaee1f3702af59c1", "confirmedHash": "e45f49bf01c8b278168678fa6095506edc09937ad19bad2c0c00000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "Aqv6wsnjE1GrJ2BoJKjaVnDmok2", "isValid": false},{"proRegTxHash": "d72afb60fd9f2f3311ffe60f723a589bdf3a0c8322ec51f97367de6871a4ea5e", "confirmedHash": "50e454f08503f295b7f9470a0d1860cb8532a8e183d77c4c0500000000000000", "service": "00000000000000000000ffffb009d215", "pubKeyOperator": "0e10de0ae11b77f8efcb08db3c241b01cde3e3b01366fa6acbdc9192898e5be952a636b0ae3db2dedf8d51347465f4c2", "votingAddress": "yknHXMQ3yP9AyWErBX3z6ufbccq", "isValid": true},{"proRegTxHash": "5706252c3f735708d3e7431508b046bc2411a97ed2bf0060b38a1e44174e9820", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96889702", "pubKeyOperator": "963a9d2d639a415573018f362e0d18b5c99d47f81b451e96fad1bb1a0ba480153b29d1b19cb9f65452183162f96d6224", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "39f7a132605c9a655f6d403755343885267c4ec7314788de20243a2fe30ff327", "confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", "service": "00000000000000000000ffff74cbeb84", "pubKeyOperator": "8f75ee28da1d7001ca5ecfe8ccfade6968bf22ff18180b99c9a9984e68d0e03ec92cf1b0d0a9fc93584023bd01def800", "votingAddress": "43ai3ssuZ9h9RGZnVJUvFVJ2CcpF", "isValid": false},{"proRegTxHash": "e6aba75049b40bb1c7cdd418d841c5479e7ffe354ca34c23c610cb50c3f0231f", "confirmedHash": "216c2caac8540339b8ddd0f6a7fc5ccbdcfdda3a2353d2eb2600000000000000", "service": "00000000000000000000ffff55d1f1da", "pubKeyOperator": "89718b0bcc8233af8df3eab1f3d2003282506e6babe096eae072cb8a435431fb3ca0359ef7ee8bfb3fbe981debdf9c0f", "votingAddress": "4L3XhFnZTLwUCbubEwPrWrWCHYS9", "isValid": true},{"proRegTxHash": "383cd2e1319b4d99ee7863852263a97e3fe8ec3747c465af8d07d3256358c0d0", "confirmedHash": "c14af2a10a903726fed1cd86f38cd660334bf6bbfdbb199c4700000000000000", "service": "00000000000000000000ffff55d1f150", "pubKeyOperator": "0ac64b2c70fa1a37615aee3b3d312b7ce79991cc80e16d9d203d5cb041221dc4e9d9af5591ac2e06f07ccf6a6d4079ae", "votingAddress": "Zt4GtiS2rLs39KBYHM5oUGrNeNQ", "isValid": true},{"proRegTxHash": "c3e808e71cc125c7c2fbce9995e1f3f812da54d9cbca6686de17023c3f174461", "confirmedHash": "06f810f80be78925514e3c241e44e082e959920a0fd8346b0300000000000000", "service": "00000000000000000000ffff453d6be0", "pubKeyOperator": "93c119570fb8f6217336c1baaff0cc3c1042843bae6057399359774f17cd4ac966a7bd6d75191e5d80c50bf8dca0f925", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "6e824f952ef9ce839f6249c7a0be7d4705eefb16e120bf9dd422af9a3cbbec04", "confirmedHash": "3001412e5fdc9742f710544d53399c7b00ab9e93f610ece82e00000000000000", "service": "00000000000000000000ffffb29d5bb2", "pubKeyOperator": "834e0abbb2943831301ddafdf2428fe59d57b8628758b24d82089ac83b7c603dc6d30c120912d3ae7c0f50fc2726a99b", "votingAddress": "2RzdLzYUajJsy9AvPsg8pfTRY5mN", "isValid": true},{"proRegTxHash": "0df96434de71859a5a4a12f891e159a5cf8aa9684369a1d10b788702b0bd0bd3", "confirmedHash": "ca9157e92756c6d39972ca24d6bf5939b97c30ec1b242ca70100000000000000", "service": "00000000000000000000ffff50d1ec4c", "pubKeyOperator": "022a15f6c1f3af9376cadbf2e99684de157ddcdd0966fac9fddb9772867213b867994bdcb55c8ea30e41b19c385f9fe4", "votingAddress": "ddoyCk5sj2kBBwTEHBzVaG6KTJF", "isValid": true},{"proRegTxHash": "bd7189a8e1b267b6a28d9338d3dbe9a24d1334737fce424530940bf9570562ed", "confirmedHash": "f53cb68eb93481deb7965a1ddc993e7f33ca76bfc60603e80900000000000000", "service": "00000000000000000000ffff55d1f1f8", "pubKeyOperator": "82c04eed017d277987d5e69403daed89879e3a5cfdcfe64c49a08aa17c8e837923dcdb67db84ca1811df0f62fdbaebd8", "votingAddress": "2K7yJsurnWQSTyNKWKnGGfesoGex", "isValid": false},{"proRegTxHash": "d81238c8a775c79a54e5b3b1fa639d815feec6c3d5d6deb7ab4f19213f9d5c69", "confirmedHash": "90cdbb1eec9ba3cd1db48af27cb35ae9510605f9d67b90fc0800000000000000", "service": "00000000000000000000ffffb9a5ab75", "pubKeyOperator": "1246f3d669e8e003114e172d6ac0dcc2e35a59797834907ccdbdb0f76e01c06766cc756e7d0a39b15961df18add026d4", "votingAddress": "2TDSSbpYX2t4CwX5mMsCgBt4Cbmb", "isValid": true},{"proRegTxHash": "5ae1bedfc459e43cb963123c65a20c8ec65778be5ec5572c1584a16a9a4f1b4f", "confirmedHash": "69eb4b186cb63b044546f2acfab8d619f4cf5c97b242b9641100000000000000", "service": "00000000000000000000ffff54347434", "pubKeyOperator": "830df13277a4268c064e1bd8e146509d7506871911548f1840e816585fea3dcaa6e207e79693c4750bcc850745c2108f", "votingAddress": "ZUFPTiB3MZ38Bamiv5cv1qoSm5H", "isValid": true},{"proRegTxHash": "8aff552067646f4bf4163c26aad814081da2ea538be53e18233be88a9f473f33", "confirmedHash": "5bb735ae377e6da44cb78b3335a40aad1b15aea25a4b085e0000000000000000", "service": "00000000000000000000ffffa87757c9", "pubKeyOperator": "8330c94f45520e911610b8fb17c7b4cf4b5c2cf14be8b3f242b6b80e5581f8d4c64828cd4d385ee3f2e2546d7bc7f178", "votingAddress": "djSjUgVJrfQQqGwMnEiK89DDTCc", "isValid": true},{"proRegTxHash": "23fe617cad7af17e7790aedf82ff8b989be1ca8483d84fbae1fcb61a6ccc0e46", "confirmedHash": "b19a72c1301cd50e2f6cfd8cc74edef864b06743f3179bf90900000000000000", "service": "00000000000000000000ffff51e2df99", "pubKeyOperator": "889c18828eb661ee9e3a967e2e05864d39de3666f57065ac1c6ccc14cb1bf22633117197bb18df78516f4c2b16f8070e", "votingAddress": "392Q8U3ywruFrTBoE7LiYj8UWpzW", "isValid": true},{"proRegTxHash": "a30c8962a31ca0f3751dc8c939c0d34dd3db5e80e9bc9a9d1a015c311b830a1c", "confirmedHash": "adf8083298f7a82d83beb9d3cd22ef9a32a7305355a5946b0300000000000000", "service": "00000000000000000000ffff9d5a9963", "pubKeyOperator": "14ca8945b89347cf44591ee2babaef8b20c1f2c9d61f5b9e3e5962c898526838fe28561ae0d689a21b78be6688dacf39", "votingAddress": "2WcCGqwMf7ibX4kYexvBG7rqdxA7", "isValid": true},{"proRegTxHash": "5e24394ee833bea0878a29f85ebd5807b40e25790dcb95041a62f24e0e3ce0ad", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff84919bc1", "pubKeyOperator": "95e755f67d3b04f826fd0b065f058296f5a4bdfcfc831559e3406ee8020c73f7330b82058a571be9cf75685027c92d82", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "123015b5453a4a2b36427ee1cdb2a68af9eafed6b14d7f0b43088df1d168255c", "confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", "service": "00000000000000000000ffff87b558cb", "pubKeyOperator": "139e8513a6197c63c2993a9f59d581dd3ae2c4ee50f9e4a6554b28d15c74bbdc58f21542cc10c7576052ca0fb08166ae", "votingAddress": "yL8KRno7nTPof1PUBXr18YGRbLC", "isValid": false},{"proRegTxHash": "07325df1be923555dbc84544004beb8c6bfb0ae35943de3b4a852f5cdbb87c69", "confirmedHash": "50a4c2e17790cf4b393eb396ba5c55c7f68d3b5a527d3f590f00000000000000", "service": "00000000000000000000ffff8ceed222", "pubKeyOperator": "069007d36c2dc95d510ec27e74aebca0adcc2d0cb9ed33dadb862a7b5d0dc9bf1a41209a967084022e06cf510610b086", "votingAddress": "3Y93CBddy8ELwtCwBaCf1c4Aah7Y", "isValid": true},{"proRegTxHash": "ef9dfc8b8ede77eef0e0b99048bac7f7695d9c5f645005250a70a6d0ebb06bab", "confirmedHash": "17177af6ff9a06c4ea86a63e14fa9bc9d1f6b88e0b00ca640000000000000000", "service": "00000000000000000000ffff923b0dec", "pubKeyOperator": "113c86b25c47a8bb2ef9fe649877d03be9d8894b49500bf5fd8b8e1f6aec9ec1672466c9c5c8e1d1de4dae49aaa27783", "votingAddress": "2onfWeSiFNt6Bnuu3sUhTztMgooq", "isValid": true},{"proRegTxHash": "150a9869263a1cc86e7b04f4b971f4753033485f19a3062a691fb8d415c8d924", "confirmedHash": "d57fbac48102742cecb076cb448a36962e291769ddd8735d1300000000000000", "service": "00000000000000000000ffff50d1eae8", "pubKeyOperator": "0cc1efde07d031b646ffa5f7ff5bb659c98854efd79d272f584dd3746e3b5e2b3632d55062f9501609ade137c568216e", "votingAddress": "g3wK1f4vV7qBHEf9JmeU5dKGQyu", "isValid": false},{"proRegTxHash": "4fbf860d72b20e6f14400af9484d1c416264e03a3c74a7c18d6811124926d24c", "confirmedHash": "e71eca5c9baca1c48461c6e2ab24e5d84b0f9f99ef3f5ed71000000000000000", "service": "00000000000000000000ffff87b53499", "pubKeyOperator": "1534b67ae4a1e083e92080711f4ddb633e827a0003a0c8a6ceeb7fcb50aa2ac1f21e29cdc1c8d084d624f68e0cc557fc", "votingAddress": "sQCcZnnL82FKnqBj5Fn4aVWiAKu", "isValid": true},{"proRegTxHash": "840f70d800910d7f9cf52ca0db47e10d7b4931042eee5e234d2b4fde85438825", "confirmedHash": "016132a43f95f3f84ec970411940f9c072d206e11fda68860b00000000000000", "service": "00000000000000000000ffff9ef7dc76", "pubKeyOperator": "85939625559c69bee630a5cd42fcc0e31f09c91908abb7b8e546dff81ce3da2c4552ae7faf2784bbba35771f3290b643", "votingAddress": "38EgQNwxniFhNWgkHWavkMUzBGzT", "isValid": true},{"proRegTxHash": "9c450c2e60fc90f52bd35506f63881375a8e4e6a099760a75ba48d6b4985483f", "confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", "service": "00000000000000000000ffff55d1f268", "pubKeyOperator": "162bf310af40c5babe39a0b0f0a00adcc1ad2d6fcc50a68210d8515f05dcf6b7ecd6010bed5b421ea54c8e46aa7abcc7", "votingAddress": "2LPXj8iQLaX1Ncj2XV1e6Hysygc7", "isValid": false},{"proRegTxHash": "143004a817007b774433a0915dae65c4569779780dc7718fecc0691b47c2d605", "confirmedHash": "12687a2c291cdf0465b65fb9d57a97314059c49cc7bc21ef0200000000000000", "service": "00000000000000000000ffff52d315bd", "pubKeyOperator": "146de9f1bdacddddd3161dc2bca21e0f5432290b761967edc92e670df9fcbdf1e476f81c4c2f4d3146fff6c361c40631", "votingAddress": "fgKodGT39bj1PkzgYScEY6qitwc", "isValid": true},{"proRegTxHash": "2a431aefe5a7db5f21a6e97e299fef701831678a5b9b7c4a641fe526d314ba47", "confirmedHash": "42144adcece51c1b20e7e04e67b26dc09cf2ef144129260e0f00000000000000", "service": "00000000000000000000ffffbc28fbc4", "pubKeyOperator": "14637f80ffbe549b24b66e2e19e429dd60c70c741c9f394c1bb5b3e75b67b7e0ea1c557559580f19c4def136bd237c96", "votingAddress": "3ZDpQuCN5Vz1sm8zQHy2ncNFDWKg", "isValid": true},{"proRegTxHash": "86ae422004169e0e917198b889ea03a605d206862783187def96d04177276f80", "confirmedHash": "4db5b3aafc6e597aadbb5e13559fcf29f3e03f3e79374ff50600000000000000", "service": "00000000000000000000ffff2d4df83b", "pubKeyOperator": "0d578c6cfeeae596ccce10d2093820d8270eff64c093fd92c0fe832fbf9f08f765ba64cf97c18405deb9b6e4e7828fad", "votingAddress": "4TqutGiR762EpewAp9m771S73thg", "isValid": true},{"proRegTxHash": "6fccd9da29f3cba0d30da7e42738bf96dd3c8a4102df9b19c382ecb035409d9b", "confirmedHash": "771f8b7dd0e0b0807b290bcc5827a8db8fb457c203113fe51b00000000000000", "service": "00000000000000000000ffff416c3bdc", "pubKeyOperator": "037d812689cbcb1fa0a712d6b8ad4c43dbceb71a56894935b09d01a054b991a4dd4e7e58ea4c4ceb5d9b76228a8ea66e", "votingAddress": "2WEv2TofNSFDqM5ZX27uq2YfUexb", "isValid": true},{"proRegTxHash": "1f66595d39ec5df33317d4005440d49c1013b08113a1fe758657bad9f329fec4", "confirmedHash": "34e19b60aca9eb0e7815503de513ea081442c6fa6415823b0600000000000000", "service": "00000000000000000000ffff58630b06", "pubKeyOperator": "91c8ef2de16f7794006f9ce423fc8d5d71269fa480b67a6f2076eec399eb7a890bcb306ea42c623a2f07e4eeaa264581", "votingAddress": "2UMvL8bjTyzD5beGwsYbL2nEGhHt", "isValid": true},{"proRegTxHash": "e90941a2ea8a1bb9f13bfef7dc2d78262ebf149a131f8d0439b239e7cd3eb272", "confirmedHash": "33fc5b8e0ea1d8e5f9b7f16d16dd0680c6b6eb715c9b1a2b1200000000000000", "service": "00000000000000000000ffff5fd97d62", "pubKeyOperator": "0dbc615419b2d17bb63496a1608c65a5ec5b12310bf7e00162fb9fd017ad1f83cb43776036e9588c3ce8f0c738a61324", "votingAddress": "4GuyDZGN5mk5yXFqRzkjFy8frYmM", "isValid": true},{"proRegTxHash": "99f25b604292885445e11a43e988a510f03d87e236941f7e03c8fffd70e164a1", "confirmedHash": "6b0b7096147be77aeb538b83ca7bfedea24969c7bbe80a271400000000000000", "service": "00000000000000000000ffff52d31518", "pubKeyOperator": "98a9d9bf82b6dcb5afb63b863fc45c91065d0354297fe25060ce827e9f0d1af25eccb91cf15318f425cb5da27aab2f9f", "votingAddress": "32An547NTThdZDPZb1AgGuMHoQ45", "isValid": true},{"proRegTxHash": "a19b6ca0c14fdf3965a03d38177f74ce97f2ebd4f216e0b2400fa03517625834", "confirmedHash": "ab6c9fd60408a34200fd8a4c0a00f7215b9a31120dc9b95b1100000000000000", "service": "00000000000000000000ffffc2875fe1", "pubKeyOperator": "00141a01c1f7775bc4b7f1cc9e665cee6c59b8f817ec325c7236367a1b17a238e146a38329adfa2e1767a5c54a5dc73a", "votingAddress": "4GEamFjWdEeAQYSGg6y4uFihuRUD", "isValid": true},{"proRegTxHash": "2d939b33138eb2afd87a5e00822867c7743a368e22238b944f538002b5ac9125", "confirmedHash": "54b1326c6bc695a1b6fa4ed28960e001b84e8d0dfa70ef740f00000000000000", "service": "00000000000000000000ffff52d319d1", "pubKeyOperator": "04c122ca613caa9b37e75cf2eb58d35eabb623537412ac3500070595911b9184cfff5bb59fae19953516ee018a2bfe62", "votingAddress": "3JKWFiAJQ37PpVkvm486ci1bjPjt", "isValid": true},{"proRegTxHash": "94918ddb6c34be085c8920e1b5409f08644552e1c593216305c1e8e0c5131c1f", "confirmedHash": "f76b7f8ede2e12ffb1b9bb9363d3a93082ce76db399dfef20100000000000000", "service": "00000000000000000000ffff58630b10", "pubKeyOperator": "9635f7e075a86dd389dff73e36e266319b64779a21aa2055890ce90b8f16af75d1c7ed4ca309ee76986985e646cc4778", "votingAddress": "4WCb9XY1zjHXzybNj6wi15qnDoEL", "isValid": true},{"proRegTxHash": "7b87e28d4d1051c0bb261eafa0e3fcae6b29249ad7b3882c2f0f4fa89d4e153b", "confirmedHash": "6ae1fc97f35f12bcdbc795195e82d45c822437c0a18c9a702f00000000000000", "service": "00000000000000000000ffffb9053788", "pubKeyOperator": "9201a6b39c9976bbb4c7c11168493d0afa5f5ef73e8e140c7c359b8ca8f63b3a70ff1aab941b21ca750ecc002f9bc27d", "votingAddress": "xfv2vxae3dCQnYaDWSeyreXor47", "isValid": true},{"proRegTxHash": "164b9f5d824e0265842f05302869d5f1c6599c5112cf51d7901712f833dad726", "confirmedHash": "6e801e80ff1e9b5a1ddc82625666c97778c98b8d553645b41100000000000000", "service": "00000000000000000000ffff80c7360a", "pubKeyOperator": "89ca6cd16f8be95689b4d37a3cb279180ca543007fbf24f8f026f51c7340539be24d95be325bdafe99dc27da44b0b743", "votingAddress": "3PPZX7aH8L9FMc2whWV2ud5B94d7", "isValid": true},{"proRegTxHash": "1af27e5f413b8b879aa61850e0b8e7d1f3241ed91d7aa376725f55d78f58d811", "confirmedHash": "ad4696c375e9b7cff59b8d1926125a3765a3e6a3d753042c3200000000000000", "service": "00000000000000000000ffff5f550c21", "pubKeyOperator": "8c77c140c1376380b9457b542eef5d0bf8407497d5ee298332ea35136d314e7664e86f1391b868a79052bbd29939e642", "votingAddress": "3zjFXq3XkvYTCfpwz5erHBjeeWup", "isValid": true},{"proRegTxHash": "723e3ff77030446f5f0bed787a59f273f56d5305a015dd9886489dbb9119da25", "confirmedHash": "af830de6218c8069e3ebb3f4c3f72653585491bbe1d2ef081600000000000000", "service": "00000000000000000000ffff9ef7ea20", "pubKeyOperator": "190cbbb53cbfd66c04f337dcaf1bc09aa122626fcdaa07253eee7273194e681132497917072f0a81682e0e19fad946f2", "votingAddress": "2RPQrKXimaxJAqDFPJdEmacKC5Nh", "isValid": true},{"proRegTxHash": "17a5f554b97848a1af0bd215f9a6c15128f08639d7b6e2559c40e071627bb9d0", "confirmedHash": "f6bf2cf0f8ec4fdbdd197cda7ce0a659141791dff62e16ac0c00000000000000", "service": "00000000000000000000ffff592805b9", "pubKeyOperator": "13ee663bd2f2e456acdfd7eed3e9c537ffee8e41f445b506d5a54f2bae60e81ce417c99b42819271eb5da6a8f7aae696", "votingAddress": "2mZSb27JEmzLmisGdycy6ZG4o2P5", "isValid": false},{"proRegTxHash": "6e428fe66fd72691379f143fcfd865a8ab4de2fb343e8df4e989429bb06edfa5", "confirmedHash": "d6331a8532f770f72e6c1b680ea837e6839db4ae3ca8b0bb0f00000000000000", "service": "00000000000000000000ffff9fcb2cd8", "pubKeyOperator": "00c99f7ebb9acb5eb4d30d6ed5515bb0660994c130f8bee6f70f180e2f3c71198fc7e180167c2d811c4f0c3d2370ee31", "votingAddress": "3FxG2pcTmmGEJt75XXsMscWmLBvg", "isValid": false},{"proRegTxHash": "e09fbacaeb982168f3dbb5bfee7d507d54b6e8c5d2b79c0d77101d108885bedc", "confirmedHash": "825ff51efd7ed0fc1fc428520486adf4d7acec61b83d33cf0b00000000000000", "service": "00000000000000000000ffff55d1f259", "pubKeyOperator": "136a5dbc00e2f4abc99e9252613c82adb0cd0a00da1f5aff39e54abfb11bde0bbf3be10c460418128ac4d1611d5716cc", "votingAddress": "49kFqNJFcAPrFU5kEdQrLruNkXri", "isValid": false},{"proRegTxHash": "054f9f730a280bc03b7b03213c5fff07774655da504694dfbf2720c1dde8317d", "confirmedHash": "ddf6da66d5619afc294a0279214e2712050f2479e4d5fe4b1c00000000000000", "service": "00000000000000000000ffff6c3dbd5c", "pubKeyOperator": "90a2f2b86f04a57ceaad39354f87417d1eea55e561eb4e480a8bc7e2a10d91f799ea8e7131ca215adda9e92198e3120b", "votingAddress": "3FDfe3DajB9r46Yxny6Ty9wN2Y2W", "isValid": true},{"proRegTxHash": "f2d9c18a4eef97f3bc1c33c1ef329f9297d6269d29ae41702cbcfc7e920eefc7", "confirmedHash": "b3a3ca58664b71d9f5f0c8e96898b59dd3a603ea69aecaae1700000000000000", "service": "00000000000000000000ffff8b3b176c", "pubKeyOperator": "8e5452da011b90ce4fdb98f5e3be7d796028776d242c6ddf45d6ea604796b1bcf4e4499ed39178c27c196e93d3eeed4f", "votingAddress": "2nbRzKn1nWAVhijqZvmWeejmEYTE", "isValid": true},{"proRegTxHash": "2239515ac2dc3fd2f81ae0fb7abf59a2ff778264094d59b0f3061241ce905b1d", "confirmedHash": "082ad0c1623b5b4f767158ef626336363e711175b7a491f30c00000000000000", "service": "00000000000000000000ffff50d0e1b6", "pubKeyOperator": "8c6b86b209e906e01149c9e36512b3dc891a84a2babb7c26abafb5c13db98e31001863838215f864926fdee713de7b20", "votingAddress": "nj4QoBPXXJyj287y3MYj61GygiL", "isValid": false},{"proRegTxHash": "900bc7f9bdcbd359c8376d2cbe68f9bbba5dd72584b453102bd2695477e87b91", "confirmedHash": "f783b1bbc9cb65279d4f05ed95ffb26e27b8665b2731f3150100000000000000", "service": "00000000000000000000ffff6c3dc42f", "pubKeyOperator": "0fe9273862c26faf25d57dbf1af09b950c0cc0b6614c69f4c01bc57b15e30c4e140fd8a7adfeab66dc43825e0abb78f9", "votingAddress": "4GHViQUg4kPyVABz2NpcwpRTXsdo", "isValid": true},{"proRegTxHash": "99e75b5594213232376e35d9d7f636fc4e2ed66b197f2618501f785d1e1767de", "confirmedHash": "ed45409b57075051199357ef15848bd098aaf6aecabb68d90d00000000000000", "service": "00000000000000000000ffff9de6fed7", "pubKeyOperator": "0c00e62866ee89a0484b5cb405c94396e564abd1d17658418251e765dad9a6771e882cbcdfd80d1a10f1085ef11a9c24", "votingAddress": "2CsHdgscdLvT944d7unSp7hDAxNW", "isValid": true},{"proRegTxHash": "98c7f9c4fdf48af2f42800f477c5ae2d7fae8e3340e3a4eaabf9862d2b42a23e", "confirmedHash": "a885767b56b47e7ef45149385e625395a5b59240622b78f93800000000000000", "service": "00000000000000000000ffff8ac5804d", "pubKeyOperator": "96f63f2ab3c0ea487282e37b7a31ad46b047566932d7d920a981d738616518ecc63d81bbed100f49642eb7a3f7bf6342", "votingAddress": "4DPamtpgYk86HnwW8t8qbzyThoNa", "isValid": true},{"proRegTxHash": "41232f0cd59a4eedaead45f6931a6d9545891b245e3e3c8daad7584599b77e8c", "confirmedHash": "362036a706f6269c686ea3d97f044c6d92937f5e547f93200000000000000000", "service": "00000000000000000000ffff894aa636", "pubKeyOperator": "8d9eef9a28caec5eea751979522218a96fb7696d4d63649cb3792230eb67a5c2038045ad3dfa2a1e077941cd029689da", "votingAddress": "4Bq6z5sj9HVpnLhL3JpJRtdU1EhC", "isValid": true},{"proRegTxHash": "d5ad063dc64c2285076bb63b9a8a0295f6d51ba06d37b954fd2ada1c4257d28f", "confirmedHash": "31ae48fa744fd80bb3e56363f9946d2d73d262145c0a9ba42200000000000000", "service": "00000000000000000000ffffa5e3e45d", "pubKeyOperator": "8e0949c9bf4dece21c2c7eb78de4e50792db36de04592033da38111be5726931ce6252c9cedddb9f2df775a557d6184d", "votingAddress": "3bDUqgtF3SqHzELr4xJVG1Tb5B9k", "isValid": true},{"proRegTxHash": "5239900fc5ac8d996464daecd04a3d8dde2d243ea5fbac182e2fbeca8106da3f", "confirmedHash": "a3297f41dc7322cd114952e1a6b0da9fce2d0b227faf73b60900000000000000", "service": "00000000000000000000ffffb23e9fda", "pubKeyOperator": "1707aba1961543fed6a722a33301360e0f6ee5276b5990914919f251ba168b71c2cc20edf7e78fc223820850ac03740c", "votingAddress": "4Ahb4nhR4dDxfqJxG4vrtjCgdBw6", "isValid": true},{"proRegTxHash": "368d5dc2a3da2dea49b55dae546471445819b71d2c5f3e1017bbef00a4f1ccb0", "confirmedHash": "c98b13a97b6da1a05e3eacedd67fda9660a49977eadd82df0300000000000000", "service": "00000000000000000000ffff9b8a8ea5", "pubKeyOperator": "09e10743a71fa17c1607bd84474d4ce2bed9a949fdec5f0e2cc99af82e12519282c969ec102328b04178308c5a435e68", "votingAddress": "472FUW5HAhCVcDtvM9qsJNZ4EjbW", "isValid": true},{"proRegTxHash": "9ff54d5d4c07e9f01ef3b781af2e6244422ebc440d2ef803ea20259b631017d9", "confirmedHash": "b69db6b2110b4462c4e0ad25ecad25e2c0ec2ae6d438f13c0000000000000000", "service": "00000000000000000000ffff55d1f121", "pubKeyOperator": "0679aae1aee676a210905956c0a230dd1abd38e078bcc7a0b92761bfea4c8da3a046fa906c2dd820493b60aae21929b2", "votingAddress": "3oCLEd4JRnettCn8tSD5MwzNdD9v", "isValid": true},{"proRegTxHash": "04f73b3edccdcae9f07090463c548e040e25c68921f2688f9a7358dbba9a57d7", "confirmedHash": "e0c7214e3bd155ee69d3f82a02db734bf78771b5dbcc05f30f00000000000000", "service": "00000000000000000000ffffb23e6e2a", "pubKeyOperator": "13a5e92a16d84647db903a6e19d7a4f2f15f54a63e6e62cecd26444ffb09df975b72f4cdb8c4af08dc6f42e93e9a136e", "votingAddress": "eWZEA8LGwnugS4rUDgSx2VGko27", "isValid": false},{"proRegTxHash": "53efd75489b83182544491d435976260e9759ad68501ce0203df6a960ffc2b89", "confirmedHash": "9129c82a932fff630ff46a80cf992a6097a450221aecf4720100000000000000", "service": "00000000000000000000ffff68f88614", "pubKeyOperator": "09d89f976072d00dc7ca80ef0f18e4a973ad4a5f131fb91155139580f1294828b436ec687e926990567854737426f7a3", "votingAddress": "3yv9HDeeFzR9Px7QcZexyQmwEpfE", "isValid": true},{"proRegTxHash": "a03d090a505a55e142e918fd9819df77bd5e5f0e4707338758d358e1d87eb868", "confirmedHash": "dfec50654c7b3bb9e3453d460909bf5940542da59afc41f30000000000000000", "service": "00000000000000000000ffffb280fecc", "pubKeyOperator": "835b5a112c0132431aab447edaed938c6224e6895d0b57ff847c86d602ef0752c62b1179e586670684eacf6ec420d858", "votingAddress": "3TgzJ4X7LFEdMDp4yHsETUUhsxXk", "isValid": true},{"proRegTxHash": "f7b9291d64b9bd92d60872f786655997eef0bf3b7bd937485e368c355be0ffb2", "confirmedHash": "fb61e417360af76322ac0c6213c210b145b2616a68ba6ecc0a00000000000000", "service": "00000000000000000000ffffbc28b982", "pubKeyOperator": "016b46776eb3719de5c4a00bf30b0933db62ac6a65f9364a6857ac35adf9570a50ebc72ae462e59ed1cb7ed58bb0ff81", "votingAddress": "3t2PcqzUdzX99Y9A11GYWTvRTQM6", "isValid": true},{"proRegTxHash": "208773e026ba75bbcba6fab5b64173cdb06a68eed57a7095258338b08e9e099a", "confirmedHash": "7f5b467c3df33548c1b3befb6a8b6c10a5df4d79fc4ac8c61000000000000000", "service": "00000000000000000000ffff2d209814", "pubKeyOperator": "181b4ef28372a00f773183b80e99e4737e773fdbdc84a40f0e94fa1f99c37666396c0e2577d0914956285132b2173dc0", "votingAddress": "Kr35UctogUZ5QmVZ8U2XL6M3x5m", "isValid": true},{"proRegTxHash": "1168b4eb595cad5b7246c320a378d026de0d9e5f534085416da35a53ba32489b", "confirmedHash": "f04e953c276b87b99921ce226d8c018a500b4a9ffedecefc0700000000000000", "service": "00000000000000000000ffffae8a0574", "pubKeyOperator": "14796c0a93d0c8d8cbe971416f44c1714b5d091b0edf73c412293a83e77f70978b9e6b26e60d54efa7528d7b3eede3c2", "votingAddress": "2njbzmWD9PneuvdQFLT46dkJtTXR", "isValid": false},{"proRegTxHash": "7b8fad5e0d27d6eca25a09edbca337459221b8c9539603459e2647bcee4ed06c", "confirmedHash": "f08a74e1f52223e37bf6cdfdcb4912e64544c09d06b628260f00000000000000", "service": "00000000000000000000ffffa21318d5", "pubKeyOperator": "06e239220c117dc05ef81753f2d43da7346304fb34d52de480e3e55847b36fca17c2bc725bbedc28e3dbf9d2a3ff7d5c", "votingAddress": "2TC4G6RLukrnRisjnWLZ1nKgqBRb", "isValid": true},{"proRegTxHash": "8fab970beccce01015e4886c36094f5da64a4dc53474764b5d8783e2410e5600", "confirmedHash": "6b06fde259e79484a47cba5d0af075813f8a878415be60bc0e00000000000000", "service": "00000000000000000000ffff55d1f209", "pubKeyOperator": "13a7a86d18582ad597e70c986b198ff4be6ca2201deede22ae508f0fa98e10f15fb6a394c07f227c5fc9b96be278afcc", "votingAddress": "uLUYKsurmLxWBj8pX49E2GjbKjC", "isValid": true},{"proRegTxHash": "a02fb88dc34cb563b47035fac4ff7b163bbc695e0da39efc67ed8ee9a75a81f0", "confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", "service": "00000000000000000000ffff2d4c3977", "pubKeyOperator": "85489e9c712519a18ff58c2196cab0414430e8984756fd883ef016b954ba3098738020aa84dcd746d4168d3779779a0e", "votingAddress": "2ET97zXchBxDkYw2gvW7PyTKFkhg", "isValid": true},{"proRegTxHash": "9367b83fc9f0c127fc1a82f5242a13c1bfd95ec136d0f165006b5be70644344d", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff8491bc19", "pubKeyOperator": "944e6af7490001ab212250926d80aef74e4821305cfff71147786b2788cb7957ab3d6deef136131eaf43dd17f14f0a18", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "4ca3ae342075eb5af641df2050ca290606b8b2c0b99f1345d7bca48941970b70", "confirmedHash": "11daa2e0875e7ab11c01b8810cb211d3383d95f31fbb56f12000000000000000", "service": "00000000000000000000ffff9fcb2243", "pubKeyOperator": "8a3e7eb7d80481750ee7df691e8404f4f9b09e4f03f7736473a088aa964de1c143398a7594c7b6394e7760a373180154", "votingAddress": "4FJYm4E2HxsxnrnyTaQtihtetyM9", "isValid": false},{"proRegTxHash": "3cbf87a798390b3c3ff0d4e6b11c435a0f99c8781aa28b3364a5a46076e8be50", "confirmedHash": "89a5e884fe8b3c35a14bb699c14d6d7e4d19b50e2a7dbe2f2500000000000000", "service": "00000000000000000000ffff453d6bd6", "pubKeyOperator": "0384ef8f71933b9656ad2b3af67d4d71afa66c970b82606276dc8dbe20c03d505bba627aa29965d84153bd2ff9370e18", "votingAddress": "2PMKAqJVamunGX8GJjpYj94cXzu3", "isValid": true},{"proRegTxHash": "b00a876194f8e6c3a407f3f4ce1ee8758b7ec070a1e0c133122a1b0c27b0e4e4", "confirmedHash": "05ae26e27de86a881c26d7863161b0f13cf4d24d0f0ceccc0300000000000000", "service": "00000000000000000000ffff8ac592f6", "pubKeyOperator": "0f9f5901f3617ce694b117ef3a6c691e30e452a38bba01793e603e90f08859187beec4a7b8cc3c3c3f58a7b7b189a7b9", "votingAddress": "2N85eaf3zAYvbDoVHW6PsX8ATU1Q", "isValid": false},{"proRegTxHash": "33fe3de47886108f1748ecb278b3166dfef723b06ebdc8cc9e3c124d6ac6bec2", "confirmedHash": "a218da0910c8618cc258d19652859b5ab3c6ee6762a412680200000000000000", "service": "00000000000000000000ffff50d1eee9", "pubKeyOperator": "8c5cb6bbb6c28a8257d8a6dd12359782d5617f384ab575f0003e68a1fea595a7b45d76faf6053ec3459f749abfc60f76", "votingAddress": "2ZWKEVCPjFWkCmaxxQPFdsVaj5yE", "isValid": false},{"proRegTxHash": "03c539a49357f143d064e58e63ad9e442b91dc780749b0a19f0a48e7db49e81e", "confirmedHash": "50a4c2e17790cf4b393eb396ba5c55c7f68d3b5a527d3f590f00000000000000", "service": "00000000000000000000ffff52d31967", "pubKeyOperator": "8a487057ecf758df9969d847d33536590fdca1a3fdfc7ec14a0f37bde880be5aa51b848602a66b6962ac0575f47a26d7", "votingAddress": "4VAuXkHr6Zz1uMHysdNmV1bjB5c6", "isValid": true},{"proRegTxHash": "085815fddd9e131c2052a53e71d83b451a4e2cd570e55138062e4a7803acdb58", "confirmedHash": "fff6ef30237c258b64419a0c661e946f0df0fba3b21e04141500000000000000", "service": "00000000000000000000ffff0509c111", "pubKeyOperator": "134e8547014bc334ac7ab1ee65b9aa106f041c556182ca5833b526ce2d722740c1eb4f93944fe9ecb3ec342da9744d7c", "votingAddress": "2C36u1Q5aX5APzjY3XkXPWCz6yJZ", "isValid": true},{"proRegTxHash": "674c252672beae4b8d84255dc2dcf5dc319fdae742ae402b7302cbb7aea8cb48", "confirmedHash": "48f5a1a9e186baf5938872a2ebf03ae0a2e2e5fb3f246eff1200000000000000", "service": "00000000000000000000ffff58630b0a", "pubKeyOperator": "17a2313835fe45a640d0c4120f1e55a7c719aeb815ecb15cc013f70290b5f98e7a9b7fe0b671dc86d512b447610f9b3a", "votingAddress": "YRFGsVZzPXCKsyseq4Z6KbrNgbG", "isValid": true},{"proRegTxHash": "515a175f01e66ebb893b702dc7c1e3396bfb4f03450376cdaca2db42ea16a50e", "confirmedHash": "8b18a1a8b596d3992e7a0b89c2c88bb7f5d02ff68330285f0f00000000000000", "service": "00000000000000000000ffff50d0e3f8", "pubKeyOperator": "9125105d67fc994b282d59db48bb699e169f722aef252d467ebc428b57e4e31d5a409ce6e05d1d6958be2eff16a2a276", "votingAddress": "2BQdUdxZXXriA17mmqSuCDYMWR21", "isValid": true},{"proRegTxHash": "efb289e0a7ba26e4ad1541bf320a100587e4a04610c2925a4fecd3856ec5f413", "confirmedHash": "302333fb8017dafa1179c975baf3893cff64151d88e1b6b11c00000000000000", "service": "00000000000000000000ffffa763861f", "pubKeyOperator": "8feb773c1e828f84ddb16bcff6560994f795faf77e269a990940096c3477d4264b90eea8d2995a726ff3398d9d64acac", "votingAddress": "hHoYFEwfyUeHwypgnrXFTggZXQT", "isValid": true},{"proRegTxHash": "f957d656f304096dbc1ea268bb7eeb384ffc4464eb319ef3cb61e87528bfdc54", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96880c90", "pubKeyOperator": "113adc6293c3e03ed587de7811a6d1af5fb4e28336924b6efd95eb1d0b78b3333501de67393fc26dbdc666df81b24464", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "97a48fe36e0ff0b76ed750eb802fce1161cc80efc52f42ecd94637e9c43ecf62", "confirmedHash": "5417cc5ed3c09f7d1a6e655710463fd89fb20985d01309102800000000000000", "service": "00000000000000000000ffff8f6ebb10", "pubKeyOperator": "126ebc95427c7d9c3fe24cc98528dd15aa60c175ed6184cc0fdb2290bba23dd64b18002fc54cb27d53f59aad911d2e98", "votingAddress": "YCAWDhthtyegTwAxT6DdmTdyct8", "isValid": true},{"proRegTxHash": "a5d0af51d7e64900f2bcd3085dfe34a151085f208bfdc0b90d4fdec213a1e802", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b010", "pubKeyOperator": "86374b08f04af35e872e37c5e1317ba99cbbdc28ce80ba68a4e9a1bb7f85d07df453ff259a9f409b5a57f93201899e6a", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "c61a9d05cfb09df0b2e1984c5f105e13203042158828fe1cac0d178b2eb4454f", "confirmedHash": "32c5be379f3a6d875f40d83a83f3a8219680a17289fb096b1800000000000000", "service": "00000000000000000000ffff2d55756d", "pubKeyOperator": "90f8a3838241ebd9740f90cfe084f6cd028b7b3d18dc599902bb5fdece9266e70a6a62f2cf3ddf95bf9ed769883ddb31", "votingAddress": "3cwYaTjmMAxNWREfDMA38cJ3saH2", "isValid": true},{"proRegTxHash": "a2edfd56b54993024def3604c76dbdb7d120e8f789d1203ea942be1142fcb8e9", "confirmedHash": "3839c4ec5df1f70dde8da276dc5c3ba83feb14bba00555ed0e00000000000000", "service": "00000000000000000000ffffa7ac9ef9", "pubKeyOperator": "8383a101f490e7ea949041ffa95fb66ac7eee7ac61ff3db87148f7819622de89592f98cbfd4faa37641bc71fc959bac5", "votingAddress": "9EcQUPtmZXFBf2QA7QBTLfwCr9U", "isValid": true},{"proRegTxHash": "c7ef2f1795e2b1e4ebe66ff2152294ace7b677cc304b1c3b9d90b74634bd3962", "confirmedHash": "c438d7e4f19f1b1f98a929cfd6c546d8244901a91ce496c01200000000000000", "service": "00000000000000000000ffffa8775002", "pubKeyOperator": "962f5eb3cf8845aa025088c171ae5dae648c0926bcbdd62090f6ebe0ee29c55a5b37f5d1494736061729f165296bd43f", "votingAddress": "3fqDCP5Sce1ruEr7FhTCRV4K6fqP", "isValid": true},{"proRegTxHash": "235b3bc0ae954ba79c8ff825c40f34375be76d7488fe0c3021523c7aa09cc386", "confirmedHash": "43ef503a95c7a9190d4e906828998ebeefece4beec35521e3100000000000000", "service": "00000000000000000000ffff55d1f12c", "pubKeyOperator": "06c9f110042ef9981090b08578c2a472ba32cc69b4b73c3ec54c7f095be4919f2c11d5250cd003aa910e2d2429d8c83f", "votingAddress": "386i6ojYzeRCkMrydU18xWttLx5F", "isValid": true},{"proRegTxHash": "64c5727883b0ff7593949b3fa6372b7e243798f146809f25d69382faec1c10e7", "confirmedHash": "136eb168b7687d3dc34c9631794b002c1219e1b61186c4220000000000000000", "service": "00000000000000000000ffff2d4d7526", "pubKeyOperator": "10232876838b752c949f73e2226cb28e1d1a9981479fc88b767304c2e76328320f9507599a6fb4e25f456535429d093f", "votingAddress": "2rNQ9VvFT4nmAq56n8NkpX7NezvV", "isValid": true},{"proRegTxHash": "b6c3e66e87f31a18fc1f81f4f9e9bea984c6eb3bd535c416a244d6ab1dc25504", "confirmedHash": "b0484086b619626c486a13b3787192719fb31d3e2f2e2e3b0600000000000000", "service": "00000000000000000000ffff80c71005", "pubKeyOperator": "87df66ce1ddbcc132355fab4b18e118868b9e028d2b89139ee203a67560d330f4dd07d1f82fc8990cebeeaf52aa3b2de", "votingAddress": "2h3ucTb9dBw3iChdD2nFrsSSo4mn", "isValid": true},{"proRegTxHash": "7a6b6dccbaa9240a36794bb8bc114931c611977eab4c6d643537a56c87825ab7", "confirmedHash": "02480155e7acf82afa5eae3263f0d683dc1a85b1712e29c22600000000000000", "service": "00000000000000000000ffffb009d209", "pubKeyOperator": "9960db9fc45026ebda9a04c04cfe6b4a5dc9238848bc4f9487e7ee53197d3fc804753c83f98d9bc45024c5604b2d49bc", "votingAddress": "2Pe2RBnoSeGcyiCSkY4KGCkRjAdz", "isValid": true},{"proRegTxHash": "8fda80b494911310d083e604d7a038e80f55c10994f032c308bcd5edd13ed799", "confirmedHash": "1b09c83c0db97075d29d5ab48d334d231b0eb97f5741047c1300000000000000", "service": "00000000000000000000ffff586324f4", "pubKeyOperator": "093c2b6d096933f7ff7f4d7e2831a3325d262ac73929e4e39b40e045d5136c93455d0af0fd51b0acc212895299820b24", "votingAddress": "2HZJcfFkQMb2NATruzfcjNWLFsa1", "isValid": true},{"proRegTxHash": "571b92dccfbb311cee9b04aff42d7e93ecd39267ab2b3604dd3ed9f8c227a607", "confirmedHash": "c6500b6b74a8d83974f0213d55dbd387ff735f109b4a9e8e0f00000000000000", "service": "00000000000000000000ffffc0f1c6f8", "pubKeyOperator": "84188a0e1e8ad3759108edb6086e597face6de945ab12193dbf70c63f093b87b41f453f8940acb8ad9d1b42638c6f4aa", "votingAddress": "2hpQp1RULuJ2z1PepVdDoXqrZ7zW", "isValid": true},{"proRegTxHash": "925fa97d15ed80c872ad6f1ef785459315144025a668a0cea3d6f87a4716a5ff", "confirmedHash": "6e536cccbcd4ee52c421bc42fd8e2722276de1bd7c0382c51c00000000000000", "service": "00000000000000000000ffffd1faedbb", "pubKeyOperator": "05ed616c3b2a4efb56f998c8c692e6345bd3287fefcf083989452f5269a34dc38ce2e97ebe3090c6822817055b3ef10b", "votingAddress": "4LoSjLM6Hp9Wiswi8HJ5iUcbxzUP", "isValid": true},{"proRegTxHash": "26e8bbb911a81aa19134407015531f07fc3050ef4e27aa1a4840940721f001be", "confirmedHash": "d88c725471f0fe3b5a1d4b46e9d01fdeb794947d3bfd2bfc2d00000000000000", "service": "00000000000000000000ffff0238d5dc", "pubKeyOperator": "8ad3b50de0d05f07fb533e122fb2a6ad4829fced48e51ca9a03b91f49a0cc11834050777f60434176e96385ea8ca4954", "votingAddress": "4J8xPqPJkjhsR8fJ5xxK8gWTsqWf", "isValid": true},{"proRegTxHash": "ce189282a8a7ad44427e48a988870e87b6f75636de4b6a70906665b35723cc6b", "confirmedHash": "c1fc7fee0aa49c5adb998245ee5f82e35eb6b6e2b593d2cb1700000000000000", "service": "00000000000000000000ffff2e04d9e0", "pubKeyOperator": "0d3542d7db03699ac3492fd4b90ba27c7d19a92216388137fc579e67bb2d6c850925b5a46c722eb1a8d6cf76a677ec58", "votingAddress": "2UpufnuXYXw7Wdy7wtvoAru4hTEM", "isValid": true},{"proRegTxHash": "21dc6e6696a4ce7d1b271f7ade022924831b670af4fae9438467fe291358013d", "confirmedHash": "5c08f07349b5a37cd801bf822c8c1e5c0926fadae502de3a3a00000000000000", "service": "00000000000000000000ffff5fd9d6f7", "pubKeyOperator": "805bf6ad300bda4b469fc3c7e2ab871314578a24b1c1f199f6f17eef19ab6f616109a0fac6d2ed14c661c7b04f85ba7b", "votingAddress": "3EP416rqCJbvMxkrY8uufrhJ2Gao", "isValid": true},{"proRegTxHash": "87b56907f1eb2f1afe50470934d1b27560886ad18142ff6e381177baa46ec5e0", "confirmedHash": "93bc6d1d29ce1cf1360aa5b26a246e58148db7f3714cfa6e1a00000000000000", "service": "00000000000000000000ffff33267d19", "pubKeyOperator": "95daf2ae16bbfadf7d900daf1cc563abdb409582ce3a990596a98ab3f4e1aae9afc9bfb977cc80f636487f790da471f5", "votingAddress": "eBLMXDheKhLeiLGUB9NZFS1nD6y", "isValid": true},{"proRegTxHash": "ba4d6d0805ef92e5b8131d19df7dce0b92036d8969592240aca7564adc6bce9e", "confirmedHash": "4bebb70f3ed8caa5a87390496a28043a9971eafdef0648d11300000000000000", "service": "00000000000000000000ffffbc28a30f", "pubKeyOperator": "89e56f286de2ff7a72c19bbd7d234bebafdfdf520f62b19a6fb4219fc70608da2bee99e11b146bdc6dee47f36be7c315", "votingAddress": "43EmyVJLW9AE2jzAmzbAZpddezCV", "isValid": true},{"proRegTxHash": "e25dc69a128c979fcc6928053f01d3f64f6e0a73bdc0c99f499730b52c3e36ab", "confirmedHash": "3291bc67e68117007dcf1f70f1664a967b6c98542a314a0b1100000000000000", "service": "00000000000000000000ffff2d209483", "pubKeyOperator": "8fdcfbf79ba282ec7f172fbf8e66b52eb2f433964bafde92e89c3ce0972d5522c70658f91b78918f592c44f2a52c4a9e", "votingAddress": "cd2tUndGVgL4XdS8wcS5CdRudCy", "isValid": true},{"proRegTxHash": "97bc63c5253a037d1f890b6537d36c1c12e4bf1ba0f136567a9fc5f103f6cd29", "confirmedHash": "35c9dd1b52f962350d63689c7e2f43bd9acb55861d0c6f941100000000000000", "service": "00000000000000000000ffff8ba2845e", "pubKeyOperator": "8ded9b3f13536dff84151aa775762b893f74c6105094725493b9b668dce2e6f2bff3344578755f8e4685292d9378c312", "votingAddress": "3FjHUehbJzZfVTiDHUHigoa6nEfT", "isValid": true},{"proRegTxHash": "129780df20ac9f1d3f547e5bcc289faf0a74232569c2fc5be4c6920edde0dfa6", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d521d6", "pubKeyOperator": "03bce44c953eb027b9f4deb6d0f0ae7aeaaa7e138dc83a2b0b7afa6fb49e74daf5cd1eb72ff7bb10de28a1f3905aa1bd", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "fe40143cdb01d37da2848916d0f4c82e68c8d3d8dd92d1782b295859367ef59f", "confirmedHash": "7763ae7c7653ca4abeb37d54397759c3f0e27a5045694dd90200000000000000", "service": "00000000000000000000ffffd161bc5a", "pubKeyOperator": "1440a13fc1b87362afba5c5777e8ce92fd3f28d5981ca1ee5c11b5119a677905651b3bebb4dfe6c7c3780384728a282d", "votingAddress": "AnHnWnBSaLZRJzE7E2gNNu5vfAK", "isValid": false},{"proRegTxHash": "41054aac0befc2ac0b71f5d86158d1af77703b401c574c42dcc409e4a26df9ef", "confirmedHash": "b7e1413b1cae81f9419563b23dd5a4ca6286dfd12c11a0e60100000000000000", "service": "00000000000000000000ffffc0f1ea7d", "pubKeyOperator": "8f7baa1d385a93041e2236d0fe0e48d159ead6304004617f262364da03d1cd6268cc50be0b98c41c5cad37e84994ed45", "votingAddress": "3pcxxSHFUTrmWUWRyZSD7JShf1ZU", "isValid": true},{"proRegTxHash": "9bf2a39306d429260089e445ea209116d8357e64730df761059ee7917efac82c", "confirmedHash": "5d667618d36a2c2ca6110a0f6db337e1c5094e3c640b2fba1200000000000000", "service": "00000000000000000000ffffc0633608", "pubKeyOperator": "90e5a0eb24d334e87eb15e1830dfbc22803bbead1b00c13150af1f1518b2574cb7b7bb4883fd5144d4dce0192016fe0b", "votingAddress": "2MTyv3c3J9b3Bg1uCng8PW7Mmn8x", "isValid": false},{"proRegTxHash": "cafff970f8aa3c91a37aebd023fecddd1c4ca720de9b598c947dbf7f7f740245", "confirmedHash": "20bad3722e4e10972be1ef117635aa6fc91d4732e02bc5250f00000000000000", "service": "00000000000000000000ffff58630b0b", "pubKeyOperator": "91008785993639ba13e4e20981c89ed9a64a0e561da60e7e286f25c397d6e0db06acdded783b247fe26f2f2ff6665184", "votingAddress": "281qU8Qbm6Gqjjac1EDnmXTKFFhz", "isValid": true},{"proRegTxHash": "28b847cd11fccc2f83b5aa04195a5013ca62ba3703e239544a7a51a279156b26", "confirmedHash": "a698aaa06fe7a363ec0640a853b189470209949734fbb8ce0200000000000000", "service": "00000000000000000000ffffd41869ab", "pubKeyOperator": "0858608933686b9a7f750ae0502deb891866b723a86e0740e168506963d507fda042569939423fe2605b338a61720fee", "votingAddress": "2sguFBbgMT6hWj4XRoTCS4j5BS56", "isValid": false},{"proRegTxHash": "0172a2f7c47902e9067f85d9d8d1f5a91f07d5ea73c199f3361602f2f6d17ae7", "confirmedHash": "591c5b1d605fa69dca213764b2a1974510a3f18e1711cbea0f00000000000000", "service": "00000000000000000000ffff2e04a264", "pubKeyOperator": "031cd04275a457d06c77f466d48d19a96c385aec7f1926e6ef76675d84ad2edd377a94bce3bccb1a0d8ca1529dbb0070", "votingAddress": "2ZTKwZ23BZ1QMC8i68wtPNfEdKc4", "isValid": true},{"proRegTxHash": "1fc8a88b78f530e88d1708b957c50af994e442b1ea5d2cae4f9dc6bbdb5ac2f7", "confirmedHash": "8d99bfd2015f561ace1ebee9d522cb9102a3ca9de62c03370400000000000000", "service": "00000000000000000000ffffbc28f17a", "pubKeyOperator": "132619e2a85f960c4d643cdc1d8433d0469a2b17931a117da3f1a33b38d8d307cbc21b9439dd43f14ed6113b05ebe8d0", "votingAddress": "3QKmKAQs93Eunuko7QWeVPNCie2T", "isValid": true},{"proRegTxHash": "648fff2aa49a26ae191920ed53f88e1d65cf9089f887fe9a4ff310692248b6ff", "confirmedHash": "afadcb4e77db3878bbed1972202a4fb21532f80186c4b6551c00000000000000", "service": "00000000000000000000ffffbc28e702", "pubKeyOperator": "0584cade63658358147fdd565bf76c9dd7eb4c13e806ee49ca4b5486f01aad6b5ec8ae34efca35f103e6da13d6c5482e", "votingAddress": "2NqKa2e35F4kURSaeCj96XzGnXwZ", "isValid": true},{"proRegTxHash": "b773fe18582092d56083f6b05fb2b24043d7940b04d379d2a07163f14f44ab3c", "confirmedHash": "49f51c19e41821ec97a3744bccbb3c719814c1a4aba75c7c0600000000000000", "service": "00000000000000000000ffff14d02ae8", "pubKeyOperator": "80a01e71a13507fcf491160f83a2cb079b2f78cf3393a810a9d6ca42292d480d98e774a376677db531b5cb9bcf99fa0a", "votingAddress": "3KJtaUihaGFEzREJt7ve9aSE5XKu", "isValid": true},{"proRegTxHash": "407f64127d18146a7356a2a629c6572bd7ef3fe7eeddf889533bf9fee2328552", "confirmedHash": "743ef4e4694a6ef868bc3cd125c8dfeeb31d7ea11bfb6c301800000000000000", "service": "00000000000000000000ffffa8775310", "pubKeyOperator": "054050c90a8a4c342aa1a64da8218779db1e474433ec11798f8b2961522d338669f33441c44233ba2597dac127070aea", "votingAddress": "2xruWpPhHRcG4bS6FnG42rWp1Udq", "isValid": true},{"proRegTxHash": "aa55b7e412b85d7ce34ac516fc09486ac7a0ea9c50b057d732c34e96201a36e6", "confirmedHash": "dc5f503940089d9fdb01ebf5dbde775ee607b5bb383114dc0000000000000000", "service": "00000000000000000000ffffbc2815e2", "pubKeyOperator": "82b394d31373cb987fb6854c86b39642847d27bc980674e3f749a053c1faefbdbd26b5e2287ed4ab952cdfb26d7882c2", "votingAddress": "2ujtCT1Dn2CiPDiwewbH9FPR7T16", "isValid": true},{"proRegTxHash": "34fd5abc4a7efbc6b5e9d3579945d9ee5c32a1252482489ac42656f20bda3f6b", "confirmedHash": "f7d879342bb45071699d3cb95351033ac8798d02b7231b3a0800000000000000", "service": "00000000000000000000ffffc034a6cb", "pubKeyOperator": "0d82678b8200ea48eb4d4467cc7c9115848804a7528e303e6cc1988affa481a555e8fa37afec366ee658b28c830a343b", "votingAddress": "24NsbbH1sDGEvXkwfpX3MQDrx1d7", "isValid": true},{"proRegTxHash": "9997e6a4c9c38fb1962a91bee132cb83a6f063d6b31b8682ca4784f36cd4a0e0", "confirmedHash": "00960cca1bd93bdfe38eefd8f7c17d3856f416e84a85b5c63500000000000000", "service": "00000000000000000000ffff58630b1a", "pubKeyOperator": "8bd7376e671d5084f86067ae219f7c6408bd3f021c7915823ae5159685acca255d837c9d7d303fa42462afa0be3a7076", "votingAddress": "4Tt5Vfwvgn8d36XedHRf8sQVfK6s", "isValid": true},{"proRegTxHash": "91505bd631127f5824f6acaa72e65bcad8caf520a4d715b636f72cefb5b228b6", "confirmedHash": "1cf9ea24912e3b2dc250d3bfe4c28b8d2e0814e463dbecbb1000000000000000", "service": "00000000000000000000ffffd1fae058", "pubKeyOperator": "91aa8d82cec81be207aacc128947994cd3e625062b4fba5e8ec560683ab4436856e825e5a2021f9d6831489051b09649", "votingAddress": "48D6FErFQtHWHGE4QPajSYjaExpB", "isValid": false},{"proRegTxHash": "252506cae70f8bd48bac48c19d72cb276feef4fa890f42463a6e31dbb1b21e01", "confirmedHash": "9d4ed0cc8b8d1aa7c55e20c41c2747c66ef80b0b30293f7b1f00000000000000", "service": "00000000000000000000ffff3625ccff", "pubKeyOperator": "8b6df84975324519a4dcd80175230469b22070e57a53588dfedb7e4b48c736cf41c474ffa7f0b73e91a0c30c5382ad20", "votingAddress": "BVohGgdYkbhv9tX5pfuPv57xRF7", "isValid": true},{"proRegTxHash": "25f76637ed7d30707e65e03d6179e2bdfa8e9d73c6a55c0f6f04a0d2ed5f857f", "confirmedHash": "a73b352f876b5ed8a852bea21c0b07009cba2eb83052d7571700000000000000", "service": "00000000000000000000ffff92b98c16", "pubKeyOperator": "806dbe23ac86a9079a805bc3199f0371938f072bd7303b59869e2493e5c6d1794ee806fdbbed5f548f1b5609a7b50e56", "votingAddress": "XZ4Gkn4MgSFv9SDk3EBVdGqNvJr", "isValid": true},{"proRegTxHash": "9d91505ad728352be02664aa384091b8f67317a64b5573478ab2d67df78dba55", "confirmedHash": "0c4a9c32f3fbed8562479b6425ceffe802a73f72cc1c91820100000000000000", "service": "00000000000000000000ffffc60d2047", "pubKeyOperator": "0da62fd5fe94c7d237715e22f14a8e21e132a7d59298e98367784e60d85e2c08145b44444f2557f01e18346ff7568623", "votingAddress": "2dXRefQmBZYxYQwtKwZuB3q8U2j7", "isValid": true},{"proRegTxHash": "3a666edc89a0eaa17f4782ce1b5be5bd880029ec489a68d75eb658e23e176bf2", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0de", "pubKeyOperator": "138f9dc559700133ca1203b3083f139c36365d9e6dc638718ae578ce934c9e8684d43c83af1bb5eb056fbac179bc53e4", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "ae14af0958c31de42abb11108bff03dac3ba35e0518b4e4ef5334280b20d3474", "confirmedHash": "63fcf0201e6ec592a47d1b463b986a7518775dd2269fbc370100000000000000", "service": "00000000000000000000ffffd41869d9", "pubKeyOperator": "1441cedddec825f995fbfbb4f23079f585973a5b03f8c82998c189d7ae84ea5e2a06dec943535c2814b090295ee656c0", "votingAddress": "6C8cs3FhrQpT76cHUGw5dZaN6Er", "isValid": true},{"proRegTxHash": "c3f120b5ec51009acc8a526146802617d64d61f66675b653e82be08a540db6dc", "confirmedHash": "3907ba73d32775b2e1d91a0015836b8d4b41f51be7be18171400000000000000", "service": "00000000000000000000ffffb23fec6a", "pubKeyOperator": "0d9e1a41f75f1f6f24060d8cf629c50b046ce56fe0bfe9d1afa5dc36cd22b5c2557e3146fafe8088ceef2b90c05916bb", "votingAddress": "3KbprQhokGfYXdscwTevwhwuUdZ5", "isValid": true},{"proRegTxHash": "a8399c65215fb3c0d006dbdd3c4a84df98d2630fd85f7f25515d14a72b27673c", "confirmedHash": "1b09c83c0db97075d29d5ab48d334d231b0eb97f5741047c1300000000000000", "service": "00000000000000000000ffff58c66bc1", "pubKeyOperator": "0b635cebe199de35ef85395095161339be276a67322c31ce3928b0ee44be35c84d9ab20fb31d833720905b11bd7101f3", "votingAddress": "puU6TDcygw7CqyD59C1z5Np7GvN", "isValid": true},{"proRegTxHash": "dd0fd8e1f9424b9ba92fcfe0e72cc9b442d6fd13cfbffd777afd2928548a2f5d", "confirmedHash": "ca9209490a660630edbeea0f51e33032f888760ad032a6571c00000000000000", "service": "00000000000000000000ffffbce2c4b6", "pubKeyOperator": "07f43a2b4a42a476de6173552247f14813a8f1a040f9565fd305d7e1329af6a7e4147d188cacac518025cda1d683c176", "votingAddress": "3LoNF82UHrbe25XLJ2XGXjv6FkfU", "isValid": true},{"proRegTxHash": "c7286590eb52a08d1b11d85b1fbcf705081f22b360901f47df1105f32547fb1b", "confirmedHash": "da43ae173edaf99fef186791004da1d26b4f0d169bb15b771300000000000000", "service": "00000000000000000000ffff55d1f22e", "pubKeyOperator": "8a66f2dfa7ae5c4a27e1aa83a5470fbccd68d1860be2783316b944398f87b871e8da6897ab8c1a4475673254694ace93", "votingAddress": "3bpJw4MrDj6PQcuExRChcqHzpeh", "isValid": false},{"proRegTxHash": "98e263fdff245ea15af4e55ad6a1eea1c731192143c37b8b98962cdf5677fb49", "confirmedHash": "6b0b7096147be77aeb538b83ca7bfedea24969c7bbe80a271400000000000000", "service": "00000000000000000000ffff52d315f4", "pubKeyOperator": "0cf8c54eccd8568d4d04663628d3d4f177a4e80559758af495c085c6c8c3c8440654d3c1458f4390ef0128d042581c3d", "votingAddress": "2HXyZmdxZFvWKgo7kCNCyfqyjf5p", "isValid": true},{"proRegTxHash": "3a88a8fe4aacd3a71b641213b6191ec20fa5563f0b12406a0962d501334700a5", "confirmedHash": "5886572fe2497cbb14272f32c0ad54197842320f9b027c231f00000000000000", "service": "00000000000000000000ffff4581506c", "pubKeyOperator": "8a34b76006315608331e5c163acba719f916776a79a097d04766ad53f0e90792745c4032463102ed619b9eb5e3bf8d98", "votingAddress": "EtkgXE8jpvfad9CKGhbYVzfByuD", "isValid": false},{"proRegTxHash": "35cd0bef98c468619130248a64ad79654778c5f36a76d7762fc686d25009c0e0", "confirmedHash": "8571c846b034755b3eb507ac5d5902d96da64996cae2e2395400000000000000", "service": "00000000000000000000ffff3625c7e3", "pubKeyOperator": "12c02530dd72a031f56d16ba1f4be9022180ca358339229b98446b7700471b9daffce843f815f2e875c4416248ee6525", "votingAddress": "JUentiExQb3i66CP9Ez3mqRq6f8", "isValid": true},{"proRegTxHash": "470fc7c6eb860d82858bfc79dd7e634e43dec979f85a4c94e2c279cc0e40f0f2", "confirmedHash": "c2cea37bda34125667cc2da9c2eaf2f53c09b82ac937e0711100000000000000", "service": "00000000000000000000ffffbc2815e5", "pubKeyOperator": "107e60cc3d88348b88beea950d440a3227b4db6434ec818e7b829ad9c1f3431e1d3056408eb535a64e1122440428c641", "votingAddress": "2VHXyMgmtbeW5RiKpTbJCVZqxHpb", "isValid": true},{"proRegTxHash": "2a58d71aea5958a041b2374c3704254d994d05c5cbee5486a3593d213ba813d8", "confirmedHash": "502bc00dd9a8908603f7032dcdbea86ef0c535d12d9ac2cc2100000000000000", "service": "00000000000000000000ffffb29d5bba", "pubKeyOperator": "04c04d35847b9ff0d1ebddc0c9f45905a134c0c0077d2322da3de2fbf328207cb65ac44009a3022b83d86e6164dc7a61", "votingAddress": "356JDWVTatu61FgF593A7Buomsfv", "isValid": true},{"proRegTxHash": "a8e7fdb3a128b5c056a10491e3ba0f939caef12724984883557bfdd843f9fb7f", "confirmedHash": "a0b0b5f69c8e2ae44d9e35f906635ed03cbd5f3f4a21f6e11200000000000000", "service": "00000000000000000000ffff2d56a257", "pubKeyOperator": "19bf26f406c51c9053662b935268d7a6d63356a78c6485d52316ebfe4d7f310da301861be169ab91d0fbaaafa86c4cda", "votingAddress": "4XGA2HKwroh5syrZ7DuVBp8UzYpv", "isValid": false},{"proRegTxHash": "4405aabb62e1b8b3e27d433bf91fd065daa76982d0db1ca8cf9bd679c0990b01", "confirmedHash": "80dc74a7e1eb3f19955c08a61d95eab79d939eae155e80120700000000000000", "service": "00000000000000000000ffff2e1ebdfe", "pubKeyOperator": "1461ef01a4a5a962c7f171addb292d751602f5b308741597bf343852a58f0bdb52b9007d8ed82f5e8638fa317ecb44d1", "votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", "isValid": true},{"proRegTxHash": "d18cdf0c8ad824ff894742c2fbb2b4c8487df5b96677831c5f3bf3aa5ec6c1cc", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffff80c79eaa", "pubKeyOperator": "92cbd4d603e7022a4acbd3a90d9918897ba4c227ab3d3e2351d72e4da8da6b8eca92703d5630b7e3bf1a1ff62dae4446", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "4daa44743818c41a077e913848f8ba594c1642791d1cdc2761e307a256f7d7d7", "confirmedHash": "c8cfd5fa851a786fcf6a0fa04ecb750ad7737e1ebbc654ab1100000000000000", "service": "00000000000000000000ffff55d1f281", "pubKeyOperator": "094fc3c03e9e30849c210bf41a8914a264e8b22d70f71536f61f04a046b00c563dfec9fe4950f8ec35a2e19e7ca525ee", "votingAddress": "2VvtDfchUFeRMv8W8w3ebuYmXGvH", "isValid": false},{"proRegTxHash": "00b731b5806a3aaee2fee5aa1f2273ad4d3ccccd7b40c47855e67c77eef78a4f", "confirmedHash": "bf44d48543a9033b017a8badb7651cec9889b7eb4833546c2600000000000000", "service": "00000000000000000000ffff340e7175", "pubKeyOperator": "875c486a7d71307517489eb5dd157ef6fe19e70bf55366daa6e864d56db7db948ceffa21a09afd8340661f38500fbb28", "votingAddress": "gPT6hFiDVd3teWiLx9Wf7PHNmie", "isValid": true},{"proRegTxHash": "8e1bdf6b91186a10da2985c506817b0421bb48fa5d9ccf8d088e3a9dc4930aeb", "confirmedHash": "7e993ba36783c1b5b07333fb0ab03ac2fa1d4e17d8cf11401700000000000000", "service": "00000000000000000000ffffb009d212", "pubKeyOperator": "10f116340f4159ccb144f89ba2fba539ee99fd95657a12cc04b59c510c3b03ac6f72fb2b099e001b69dc78060c9c8bd7", "votingAddress": "DZtzKyxyGaVNfApvjTW4EwuD6LG", "isValid": true},{"proRegTxHash": "49c8bafe5c216c2494b75fad8b079f66e967e1f95ea863209335868e4d1eb3be", "confirmedHash": "37bf59f1667155e639566431e4153fe1aa2c4e239db724a01f00000000000000", "service": "00000000000000000000ffffbc28f171", "pubKeyOperator": "82ac4e849033c1ccbe5c628a786e9e44cb39ed6e61919b02dc5d0d8e51ea4323349f51fdd8816e690dfc347b4df3c335", "votingAddress": "BbUaFcW2LF8chHvxHuwrrUURVkp", "isValid": true},{"proRegTxHash": "91661cef4d7d11385719ffc1faf32e3733c457cb06c3fc7812b8df3e026f98e8", "confirmedHash": "7494db8847ed58e48ab06b6c1dbbb766e4b3fd6f1f8d2e911d00000000000000", "service": "00000000000000000000ffff86d196f8", "pubKeyOperator": "912d7fb96fd23512406e178e5ddbba9beddaa5ca3de925232ecf11af80db1fc85f513d21146f1e09a296c718d85e0261", "votingAddress": "xYQafboJkqNaYuAC7ewuq2qqymv", "isValid": true},{"proRegTxHash": "a8ad1ffc7dba3f26df28095cd992de838cebc8bdf4ff0a63a33a3f620ea5cf8e", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0d6", "pubKeyOperator": "824d13f6a08c4c33b0a75b67e64c8e62455fd2b1f24f13d10c8680e33be51e3e9290104429ca503e2046d5c9884abb10", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "656f8dad08641a352f7c3f01fc60dec21b8a73721cd98b64486edc4f1d3e7a08", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96880bc5", "pubKeyOperator": "986a5c0abedef127b34476d7a430c61a7d3c5b902d9b673149afab4df9b74fc78ef95531e4861c0938adb6bf1d1f89cb", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "9244ef7b961c370f4c1e2fe019292743f5aa159dbae9ec4060dbeeeed9ae910d", "confirmedHash": "f81b002bfb781819e3cda2623aae1d1d0f63ebea4c3e81120700000000000000", "service": "00000000000000000000ffff55d1f226", "pubKeyOperator": "82cf5bfe103ac8af531dc1d2875197420b841241d038e2536a5bdad0437b02d62391c767d159c5dbde9dffba68432d9d", "votingAddress": "243hkNatamrvG96j9Cm7uj8mRNsu", "isValid": true},{"proRegTxHash": "e27c3854e29cc72f560c03df15bb70a960a46cb7f57e29774843deec7c58da70", "confirmedHash": "64b416cd9399bc1885fe1b660d1c1d6a383970a6c5a45ad50100000000000000", "service": "00000000000000000000ffffb07b39c8", "pubKeyOperator": "9944c5bb2bc25033a0fa951dee3ceaf74949bbf18f9c4a37402272f816040e6f8f0b979d6da40e14d580a4b12fae8177", "votingAddress": "2TycgBHTLy6Siue9gh8z1wA11AoU", "isValid": true},{"proRegTxHash": "a409648cc1254d478df94f0030de79ef7101efe95807322fb6904edae1d81954", "confirmedHash": "74eeef8df9323115d4c6150616ff4f8836bb3cd60809df920f00000000000000", "service": "00000000000000000000ffff55d1f1ce", "pubKeyOperator": "8218206632966da927f6ba85dca38631f4ca860c0f61c9d856ffbd36f61acfb65d87819338ecaf675d6d86d4f04060c9", "votingAddress": "3tyQ22CgZwnyhsAVNPTgsS5A8qbh", "isValid": true},{"proRegTxHash": "78a5a7662cb4c791a38d774a1685c278fd96f49ce32935a3167a15a1e1d71585", "confirmedHash": "7cda8921938c300240120da22ce849420a62e494a23a22053000000000000000", "service": "00000000000000000000ffffa5e3920a", "pubKeyOperator": "85aeb2b5f50f4afb53011ece89b36a8118ebfca94c4bb2b66bf003a4e74659e2e31755cfd6c5b6e45eb480268c02c9c2", "votingAddress": "2Vr9S5RUAn46xtHRZD3VdrdydsKo", "isValid": false},{"proRegTxHash": "fa98007920c17b0e4c880a3788bd510c3de53003a62fd5a9b550761c9ea7acf1", "confirmedHash": "790acc3c6e44b61cdcd205c64c13672cd701e4553e6a85f82f00000000000000", "service": "00000000000000000000ffff55d133c6", "pubKeyOperator": "801105f27dcd746e77fc7c60c20f9cbe715b910899ea8189f0005cd634b7cfe3d9428e2cc67ecbcbe640b5ef61978ba8", "votingAddress": "2bg7BPCYVGNGwidkrVCqHzSTRUMu", "isValid": true},{"proRegTxHash": "88a4a1be94737cd891782988d968aa24ee3c72ec16389c25e2890850a3fa139d", "confirmedHash": "3c23548712f2b23de7fce7edc21b544f3256850ac6b306703000000000000000", "service": "00000000000000000000ffffc2875a21", "pubKeyOperator": "08b4bb316e712645d9df9b20675d0118cea2e7eb9513f8c04bc1b34f0d23e0378c4bd27274e350af32974f6e063c9287", "votingAddress": "3NRUbnxNScQMQfY3Yi1S4SHzWJdF", "isValid": true},{"proRegTxHash": "555797b8e677a7f1d94cd4595caba290b0498cbef49183a71fe8f789dc7b4355", "confirmedHash": "0a3424ccd1d4d1beab23b417ae3ceb3bc221f8ec14d216f40800000000000000", "service": "00000000000000000000ffff50d1e5e5", "pubKeyOperator": "1735b6a94448fc5b926d4bf33a568ec0563ff55f199bd54bd11ee479c1c4787cb513be6d9b76adafb1cb52d98b5a396b", "votingAddress": "2p1oey2vdSwYrE52wm5Sm59w7meD", "isValid": false},{"proRegTxHash": "dca794b7999a648670bd46956c25b80f1717493ba8f942f9e3b352db65dc84a2", "confirmedHash": "8ff653f659d4478ea4257cf726b06155732e6ac3913d54bf0e00000000000000", "service": "00000000000000000000ffff52d31919", "pubKeyOperator": "96a5b6ed9dd5a50d3bbb1b184368258ed8954c42beeef72c8c52deb5a44faf598a1da8cbf7130906c7b613f030b5d8f0", "votingAddress": "Qc6Sfy2uWWjNnUrAwvBjDB3TKp9", "isValid": true},{"proRegTxHash": "424d69c46e0c64d506a43765f1f51c785d05efea7c673e84fa99ee56db02195e", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6d7fd", "pubKeyOperator": "0ec78a198dfd16c2b4704f11b010216c5373992acf3bee71f6d66e9e8f50eea1204c0cbd6db661f7af975fab7ced9225", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "e49d092c39df4333c05763524d624f30ab1f713dbc31ccf33d17028d61122ec0", "confirmedHash": "adb93b350fa1085a2fcc8d29335c46f7050f88d0acddb9011e00000000000000", "service": "00000000000000000000ffffa516ed24", "pubKeyOperator": "036e2f29590814790a6f45558e75a5de35ac4d48562b86eefe27ffc76f6609667070dfa9a7b5a32a3b115e913ac588b9", "votingAddress": "3Jzcju9q4Jx3LBqwjotnp3Jw8Pug", "isValid": true},{"proRegTxHash": "f63ce988cb833a899dc061649defa58aea62124b41d54b11a752081deb910e2a", "confirmedHash": "d45ae45bfcfb0170a2215dbe1113804500767000e77c3f3c1900000000000000", "service": "00000000000000000000ffff80c71aa8", "pubKeyOperator": "82c3ba10c6a11e4e22e60cf6310676483b59119327778fea20026336287be76ea95da0512670ecefbb9af71ab73f2398", "votingAddress": "3dmrBN79veYmfZ4WKLevQFkTDMYi", "isValid": true},{"proRegTxHash": "8282dae87a58d7ca03eeb0c56379c058c9c78280c21a86cd49f44b0952594221", "confirmedHash": "fab597250c536e8e692ce234ac465942b2b8a2df183305651800000000000000", "service": "00000000000000000000ffffa8775008", "pubKeyOperator": "1800b53a9a2ba98c84a6b389456aed7db2e657b377b80280f0cc7a090e027f346d7953ed81b84a862e95852fba63a7a3", "votingAddress": "4RSNy1TcoyjftZMMuCkQ29332j5x", "isValid": true},{"proRegTxHash": "8a83ba1961a49282ef4251af8c324a151b3f71219b989949001a265f9669d01a", "confirmedHash": "102256ba771250ef0888164793863fdfd3f11410c595c8390700000000000000", "service": "00000000000000000000ffff23aa706d", "pubKeyOperator": "8c3b085660be8ddb3bb1b6589399291d13c28a87079eef10f0969b17f5b0c2ac3052768514473ed9b708beaa99aac79b", "votingAddress": "3muEsqZ3Hr6G7cefoDgXFuHdFMdR", "isValid": true},{"proRegTxHash": "09d7914574ea5e9707270b21af63fcc5c1af82c86f989cacf7b9deeeb028aa02", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688e0b6", "pubKeyOperator": "98a8d676eff6a1b8e0e19143a8547db180bc4a6385bad8f15125e28814fa04fc80a08b5573de574aac25fa70d88e5ac5", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "6e176920bfb6f6604020384e37a84573485b853940a5a1088152a9b56be56d71", "confirmedHash": "58245ba2b9adabcd5f9db23a0d3d83230260218461cfd13b0100000000000000", "service": "00000000000000000000ffff0de45cf2", "pubKeyOperator": "07d408d7c3bbe521b761329b718a1da951cb9401c86b1265cfe4df70050c2af988bd6b3cff0891195487a328af1b6ee2", "votingAddress": "2CZX24H2rKoeZeer6jAVc9eUFRYz", "isValid": true},{"proRegTxHash": "cb79e219e9a6b78ddafd87875d27044279bb6c8b27c9511614da136e08a858bc", "confirmedHash": "f3a2f0802494d1401b21b243792a6ac397aa0342ac44a7b21100000000000000", "service": "00000000000000000000ffff33d2703a", "pubKeyOperator": "94f251c8ee0e9715c11586747e9e026ab8f38f5ba337170b388bf9251aee8f1124fb50c6e1d7584ce42262932ba88b64", "votingAddress": "2ZLMG6Uw5DUEMrFeoTvH28EanLDs", "isValid": true},{"proRegTxHash": "7ddc02e1904703f899d1d12c51bcfcfae6764878daa6fafb83dfc0ba61b52c1b", "confirmedHash": "94f09390c9bd30a8ba70cae1751942ffc70bf9a6e8d184420c00000000000000", "service": "00000000000000000000ffffbc28b986", "pubKeyOperator": "8509c49747ec23783a5f2de68901126407a1a68ae3a28e9e3bf8ce8313200380591c8e7fc860232cc9dd67ae9f1c2737", "votingAddress": "327ZYzNKfnDQqLpHMcoR6AuWEibd", "isValid": true},{"proRegTxHash": "1e6e60552e888619e56540bc26ee4ec84737e80ec359176e8dc461e650ad73ec", "confirmedHash": "53d52c2711c42d389e6745d5cdb5a707603a4844c9f113820500000000000000", "service": "00000000000000000000ffffd4186eed", "pubKeyOperator": "172a3ce3331c443ae0bc89da37a86d52856654cf3b81fa304b75b399b71052a83d040be5de2aa7cd896337764c76cd46", "votingAddress": "t23CurqYJNev3Z5nGPDpHGggDnn", "isValid": false},{"proRegTxHash": "4501f377150d7053fbe88ec8ed0782d3cb589c914e56c5d4046f4be4a4db4390", "confirmedHash": "e36c97ee6a64d6516bc4a04a68c914929bd1ae6746d339880800000000000000", "service": "00000000000000000000ffff40e326c4", "pubKeyOperator": "0784248b3ef562bac4a470e34364d4d032666ac3fcc1a4c12d794a1c8499be9449de76253a77e2c5f6f977b291a85c49", "votingAddress": "2t7LxVBMLbmNKhrHkNV4khUbZGYi", "isValid": false},{"proRegTxHash": "7a5046522d95c239a78305fd9c82fd724aeeabc2b05911fb7213509f4d833052", "confirmedHash": "53b1055c3414ee24e5fad1ea3bae333b9225f5757b1dbaf30100000000000000", "service": "00000000000000000000ffff58630b03", "pubKeyOperator": "13c30f2a8aece636acc66553accc0b6c08b238f30818bdc3b72759e5829bf2efc76f65cae4792e3524b3d642cbc44e72", "votingAddress": "gW51KgNyavvY1z4vcQYpJE31Y2t", "isValid": true},{"proRegTxHash": "45b0e5b6454e8ce0285983a68bb307ec353f93e58744f9a9ee5f015979b24a86", "confirmedHash": "27545a09117ee9b9ec3b24114d908c24fa33bd30479c124c1700000000000000", "service": "00000000000000000000ffff9f4168ef", "pubKeyOperator": "19655ca742ccd62f9baf230f6fe9f73406c197f6b05246ef51d6ad53d65c733aa918f111fa2e44a6ad415bdf62283ccd", "votingAddress": "uwGpLZDL9LfvJXNHmcLqc3WirP3", "isValid": false},{"proRegTxHash": "b655645f6c280db4143cec923c81a36326c16dfea0d39976a7a1e0f0c84b9488", "confirmedHash": "7c13c75dca54c44f63772fa8385e6756b886361e9e97aada0b00000000000000", "service": "00000000000000000000ffff88f37380", "pubKeyOperator": "0d6720db1bd4f71cf46d17427444545f7eaaa066fb43db7087fbfb8d7c0dfb6a9ce2ff5f36cfbbd5a9edb19b32ff8eb3", "votingAddress": "3iRyzkZc2WA9WuqRSCq1bgfzp6ze", "isValid": true},{"proRegTxHash": "58694dfa31b09710080e78e007b1b1ae7a84a5281696eb84ba5cf82435502983", "confirmedHash": "c383415f785c14405f704c1f5b0616fdeb38b87e126ab94f1900000000000000", "service": "00000000000000000000ffff36270a6c", "pubKeyOperator": "89bc356c055721fc417c9dc72c906f83e7e3cec2fdaf0424866fecd03691aa7611aa2f5d565a2b15c08d0b4a75a5491f", "votingAddress": "4Z8bBtEzQe9Hz6E3NC34RSJ3V19X", "isValid": true},{"proRegTxHash": "53216ea0aa03d210935a410efaf936114ee8d2cbed85e775230e1c12286e66c1", "confirmedHash": "cdd6aca742f4eab144ccf7345f309920d34684f42f74b0582200000000000000", "service": "00000000000000000000ffff52d31510", "pubKeyOperator": "9726599e7345a13abebe4ebc75531c45a1b17e90c23d294f31fdc154ca49a8ed6e4fca9f0ab3e7a2898c7caf1067fd7d", "votingAddress": "2wCAEKne2dCYfUH21NDLBAqEBkdA", "isValid": true},{"proRegTxHash": "e4a5f4b0839abf4f106a5d653aeb49f82f8921dcddfb74b29e4296b3c9d7c33e", "confirmedHash": "8969e58915f57538e8f3735b5198b5079655b3a9f3c46e760b00000000000000", "service": "00000000000000000000ffff36270a66", "pubKeyOperator": "8256981dd2693339298432517afe97ddb8a778ec25cdfcd09118ad2d09ce2bb59eb6ac663ea58644e7047276674f172e", "votingAddress": "49cehp5ujGJTjfR8VJdJwJv2QjRF", "isValid": true},{"proRegTxHash": "1bc49833733de1ffdb87b0176047b312516e27505086f60600b55508d11c717d", "confirmedHash": "0eeb81d6bdc589a1ad4e1de86fdd971a48e86dfe8b0405a60700000000000000", "service": "00000000000000000000ffff9b8aca07", "pubKeyOperator": "8baffbeaa23a4eef900472a009543da5be697255fa3272c38440ab6093d4c09df9fd9df2e84ff6bce66ccf7f2fb0e85f", "votingAddress": "3qGMLuKG5oYze8Hj2PDcaewSV7u8", "isValid": false},{"proRegTxHash": "dba91fbb4df0486e89f084d9513e6354f7994b8b177464621088d77168ba9868", "confirmedHash": "23c996172e44cabbb21984a5a39423f01d973c73239308ed0e00000000000000", "service": "00000000000000000000ffff877dc9cb", "pubKeyOperator": "09bac597ca754aa666eb48662d0df6de90def37daff871746b6cb22c87a7e2d1081a7ef7b823889bdba53c742b972cc5", "votingAddress": "27zEe5TeMmNzGPVUCDxP8C5UJLJV", "isValid": true},{"proRegTxHash": "b8a7858eb809dba5572a5abe0c36ffe135203b7a49498e3fe22c0996eb55f4db", "confirmedHash": "b3ea31903b9e8160d9a18c3720cf6e93c1584ef2a9da097f2100000000000000", "service": "00000000000000000000ffff330f4496", "pubKeyOperator": "0b2f4fc568fc9a9527423b931e0baa8d81e54edb1d2f2188deabb6ba64d3f09b2baa68d17402be7da0b8a4bb608db473", "votingAddress": "3obo7U1d41jbVPdKv7i8DuRF6vtS", "isValid": true},{"proRegTxHash": "3590e6e5af0c4a9cb547be2aaca5dc060709a0ae1d8f74caffacf3cb0ac4f553", "confirmedHash": "4466b25e0224380579ec5dbc6cd9c5bf0f9e6ecabb5245900c00000000000000", "service": "00000000000000000000ffffbc28b991", "pubKeyOperator": "077c46c2b0aef32126a586f21c1340f5fd336adcd2b3a60ffb87dc3c4882c35c189135bddc620e6cb5743a6fd9588930", "votingAddress": "G9LE3fBweeWfDjEMnFZBBKvdYvq", "isValid": true},{"proRegTxHash": "cb0e9b6d3c59f16392d571616e742862485dde763c6ad124c476baa96528140f", "confirmedHash": "b9d70d4631d6fca8deceeae206b4071be4a35f8a231d26bd3d00000000000000", "service": "00000000000000000000ffff5fd8542d", "pubKeyOperator": "02fa0b5093d9182bfed82e93771965ba43ed61a7b19ff5e98c97a01122342e20e77ea2ce54fa1af38718511192ed27a4", "votingAddress": "4HVmHejuSMuyf44JCzDjHhUyJMWx", "isValid": true},{"proRegTxHash": "c99d45a64e9baa678370ac304579559f0300d80e77ca9bc9cf67cc4d8a7c4702", "confirmedHash": "7705e9072b7a77fca4f0cbed0450aa274670dd6c956503820500000000000000", "service": "00000000000000000000ffffbc28fbdc", "pubKeyOperator": "004486148fae6a36ad24c5aa63de4d1563aab1a7f29d7bebbc0724c426cbcc8c7d05c161ca67147da5e2cc552e408348", "votingAddress": "c3oRFisyRqDWifeet697DykYedk", "isValid": true},{"proRegTxHash": "b917eb73f807ccb81510a2e5e01ee6f809735d11ed049d8559cf4f82ce903538", "confirmedHash": "f4bf489ab24824e05ce0195ed67c1838e2d3efb8a56fb0f61900000000000000", "service": "00000000000000000000ffff2d4c8cab", "pubKeyOperator": "144c069d591281f9c27ebf3dd5395e7287e6c911c8967cd9cf0abf5c3aac945dc295053b0400346d9200141e2cf9db20", "votingAddress": "4JdcX946XHu6y9QNryfcwZThHEat", "isValid": true},{"proRegTxHash": "2f3ceff09aeb4203d6d6b0a8d794725a48966863bce4ffbfed06ef85ca53b4ce", "confirmedHash": "ed94e7a69a9eba24a97d0511987122b3d0a9939254332a501300000000000000", "service": "00000000000000000000ffff52d31527", "pubKeyOperator": "8d28d4167f5853852d34d61f331e6730e34b8633433282e47f973b3b5bbb1e08f68868dd97e5d21f4c712628414331da", "votingAddress": "iAhE3qZfp8rWayijft5zAMQhmnT", "isValid": true},{"proRegTxHash": "cf865d8d612b9e7c9aea97e07483ddc585550f563875f04a36f8d79893d5b922", "confirmedHash": "31906c52ba237fb114c3780eceaa77e0bee1d4a52e8cb5010f00000000000000", "service": "00000000000000000000ffff55d1f246", "pubKeyOperator": "08e07c516d431f48a75658363dfc36510e991370e3789087d05d600ebdadd18ba0972508e42e4eb3b21a475c12188894", "votingAddress": "3WAWNL8mDWP3qyCX48bf7khziG39", "isValid": false},{"proRegTxHash": "4d1e17b082c79d508895cd73a355d58ed97d290a8616bf44eae1dff4a16f9bad", "confirmedHash": "6e5db10a02e17802c56603794ba2b3c34e877a547e36bc001f00000000000000", "service": "00000000000000000000ffff8b3bfe0f", "pubKeyOperator": "8b31217a8ab7531df96f2af7c3e5d986b2f42600b75ee93f636c1431c5f0d003b0486dc89366b9ddfa8fbbdcdff81541", "votingAddress": "3xJXRFd9Eti1jhFint5keEFEgLjo", "isValid": false},{"proRegTxHash": "566493c67e9d2ce45e2171aab29337b5a30e0cfd5a394847f96be9b8519822ad", "confirmedHash": "c14af2a10a903726fed1cd86f38cd660334bf6bbfdbb199c4700000000000000", "service": "00000000000000000000ffff34cc43db", "pubKeyOperator": "92470b3223d8e59eb5f1678c5fe1e6e45a78aad63df6c7d5f4653dcdd0e5538c13a9b0a0348d82e8ed98b221985b2ceb", "votingAddress": "2pNWo1prQioubWJEBS3DgpRPs7Gi", "isValid": true},{"proRegTxHash": "05e2ac6cbb917a29c96f0c6cbc774faed3788a39a0b8e4ff2100cf43fb92f7a4", "confirmedHash": "590e3b36e1e5ccc18e4948f79f45ec4d4cde8d1463e578381300000000000000", "service": "00000000000000000000ffff55d1f236", "pubKeyOperator": "97baee2cf9aa2d81ca53ed4aa649b32ce51a66cb186f8ab7a9e39277ffcb7603b2be1fb221eda03298f372be4cb7235b", "votingAddress": "3iWePJtEDKGj5GST8fSWsCaDdceV", "isValid": false},{"proRegTxHash": "7116dc88a2fc60f8776946eba1ceb9d3f51b0902eba33bcc0301b84e4c1e2954", "confirmedHash": "cb48c2362399430844632a5447e50a46f69e09b5d2b264212b00000000000000", "service": "00000000000000000000ffff5fb39561", "pubKeyOperator": "99636087a4322e58e02aa7115f98292fe3d3ba27caeedef85410e53e64fb46826ad5bdc5fe8a350d237317a650ea543a", "votingAddress": "3pfK8XZhBaRmhJ8M6FXb9eWBnDBJ", "isValid": true},{"proRegTxHash": "2c88299b383cb00d77eede9a9cc53123108a50166cce1fd22460f75a36d2f0b6", "confirmedHash": "ec220c4fcbe784255d464d9925944243a7ae474a8b3ae37a0400000000000000", "service": "00000000000000000000ffffa16153e5", "pubKeyOperator": "18e2c0b58aaf7a766d0b32c0d7ff7f7891751060d9e3002821d3c8d9bf0d9243a0399179b18074ac4ea80c4a2f92a54e", "votingAddress": "X9H5AhF2FiqV96v9oLyGSGo2C5E", "isValid": true},{"proRegTxHash": "0bf9f1848d77bd95e098889182e5994ae88a862e3cd8f4bd41c153fb82f79163", "confirmedHash": "f6275110d2c705b666201d9c400a57d34895dc2df584c4170500000000000000", "service": "00000000000000000000ffff2e04d9e5", "pubKeyOperator": "167e40d53092c459223f2f4eb3c68ad9ee8452a61ab303ac35e071c331bee8656128538caa3be34c8f23d271984f7d4d", "votingAddress": "4Q1B4N6CyLJiXup9yG7kkNNQNdQr", "isValid": true},{"proRegTxHash": "9ef20acacba451734c3b3d7db9386a44b0e18e2a8651debc49ebc2d7a1afc3b1", "confirmedHash": "bb940d494ba773f21fdac7da67d892497c34f1fb67ed5f891100000000000000", "service": "00000000000000000000ffff36270a63", "pubKeyOperator": "8a3d538b20ae37531a78b4b4f908c612f7572313eece8aa41468671b85786ab709367c507f4f72d90ed42de86dc0ff0e", "votingAddress": "qkSwcqBVKFyq6brry5F7qJXG2dT", "isValid": true},{"proRegTxHash": "93dc54cdb8c9b4b4d803acccc67f53d14935411b5ac25b17f3b27b80c1aba5e5", "confirmedHash": "2a0465522ca98da7b298dd208cd3a7ad16becf7641f9e8c21200000000000000", "service": "00000000000000000000ffff55d1f1ab", "pubKeyOperator": "8fab22b80cd7c9a238b495535719ac1c99c9bb8a2fd0c989080f706213f09663212b51ab0e0d1b4bbb60c950caf2bf77", "votingAddress": "3sW6jQ5ngrEU1Z71YuEKcmGKtVV9", "isValid": true},{"proRegTxHash": "e803457d0bd6dc0e55e8cb5a7c00b43760e07d12684dcdcb68ca0babd0ba3fe1", "confirmedHash": "f58e4232c187265296cd88e85bc4540c71b0a78263026b771100000000000000", "service": "00000000000000000000ffff8ba27eb0", "pubKeyOperator": "8c19a3f6df1ff3d9399d010e5307e04b9b38c4384bb08dd31509a884550f7fe377112050b34c5a533f2ace6f08a83fb7", "votingAddress": "2zNUiN74Dkftn9m7mzy4cetsp7H8", "isValid": true},{"proRegTxHash": "1238341973dc668d3bcea0834c6e7eeb08c8b76c5442deb04fcdd9e464819064", "confirmedHash": "bc5e39af9be4d279ea91969a7df14c882b791a64dd6e1e971800000000000000", "service": "00000000000000000000ffffbc28b989", "pubKeyOperator": "1789561e022918ceca82561b6192b288ed638d4de7794fdd60e42b6d414ada1bd4864faa433e38a9e5b948811d28881f", "votingAddress": "WMv32U9YPmogfYatpQn8nFxV7Uw", "isValid": true},{"proRegTxHash": "ca180140939a4689dfbdcf3634cdeea123c045b2724ee463f80c413a30008e49", "confirmedHash": "6190ca0e3af420c8578bb89b2dd6ba8e10a9fa6abf0239091700000000000000", "service": "00000000000000000000ffff50d1ea04", "pubKeyOperator": "026524cf6dbd08727749b1452f0dc27eee8490ccf4dd9d07c6403ac3fc222924aa178a40aee96ac044dd3d34727e4080", "votingAddress": "37XmmtKAPfYtSozcwvDnc6bqAFh7", "isValid": true},{"proRegTxHash": "f390d8da830f3a376ca4333e1e8535a565273d53d6260a8fe6e3210985b7930e", "confirmedHash": "796a84733b0b77de086faaefb69cc41a502251b7775a09981800000000000000", "service": "00000000000000000000ffffbc28f161", "pubKeyOperator": "0e18b20f9b0ffb9c485d1fb4dd6de43350bb3c80d708920268220f04aed87fb583ac7c9a9f04756524f3927590d7d804", "votingAddress": "ppXkUakXrB6wtMh2g7BFLdWxUo8", "isValid": true},{"proRegTxHash": "27c54dfdbf6dcd26e5cfc97ffea6ef2cf4c45e808c4af05370883fa5936bd288", "confirmedHash": "fed4e2a4a4315f393da23cca31ca4af92af22d728141b6142100000000000000", "service": "00000000000000000000ffff52d3158c", "pubKeyOperator": "0316c4a4cf715c858d53b3bfec7cdbe285c6cb145545a42554b45784aa8b2763fe3ec0dcf7366773948f190992631799", "votingAddress": "Q1EK7uKnstTdhecfdeju43oo7n8", "isValid": true},{"proRegTxHash": "46da06275411de4be6fea1b75828b36e312f35460b9aec2a36ba745305157cf4", "confirmedHash": "aca42be97e504bdcae055b4573521c1eeacae8eebb0825d81a00000000000000", "service": "00000000000000000000ffff5eb0ee08", "pubKeyOperator": "18e1b4bd8c05893191217db3ee5fff732ca9545d7c2ef4d21b9bdc5d9b19a63b4452cc5b3424daafce0d30aea3d2dfb2", "votingAddress": "2gBd5okerUXjnibXRf6tEXU5AmF6", "isValid": true},{"proRegTxHash": "d84fa8992f9393146bc1a38fc6c19295038d5cce4a9ae71706d177318a503fd3", "confirmedHash": "52443f4bb1700abf0eb5528ccc27698123ee95e8acc05e243300000000000000", "service": "00000000000000000000ffff33c32f76", "pubKeyOperator": "91b405667b3d64c0f7075acf20e10d1f9363e8656d322e5636f5eda3624143beb59e0b9cd97b7bdc84ac24bd86815c77", "votingAddress": "c6FzwNQGDuQceY8ktQwetPnQ4eR", "isValid": true},{"proRegTxHash": "3f3615cecb2ece8bfa3839fd8c0125d9c83930afc886b67ed8babc1d9ab1b151", "confirmedHash": "45f2e1d6c3127156f305cb3ac9efc5befcd5bea88ba020e00000000000000000", "service": "00000000000000000000ffff9fcb3e4f", "pubKeyOperator": "056c7559602bbd54032281323cf6b8b8290028013d192579013b63c48153b0c901943c5fac39566913a66bd1f7029a5b", "votingAddress": "3W2bhJckRPyzmhQzX23J2TbvEGLx", "isValid": false},{"proRegTxHash": "f68e0dd8b1a2479e7176bb57ee77c6265f4210f6fc319dbe3176a0d422f93294", "confirmedHash": "6df57bae29b97d4a98f911c0e2de1ad861f78ac86c1771a41800000000000000", "service": "00000000000000000000ffff2d209edd", "pubKeyOperator": "0dcc4b041abf281886ada11f2c6e14a5834175a8dd0ec6ba56414c872474b296f5317fd0bd2589ebd11deed920e1a1dd", "votingAddress": "3T1pmwApmwQ7YHYJAJ1C1WfpMVxp", "isValid": false},{"proRegTxHash": "6419b54e80ca53b47f24525723655f468389493d339418ba92faf4b4a32e3f66", "confirmedHash": "10c6137641a8acb597231d0e0a37cbd40e670bbdcda483771400000000000000", "service": "00000000000000000000ffff4e2e7b60", "pubKeyOperator": "8cc006b5f51a5d5c9281b5e276858a4c1c0c9f036f821ee2023aa56cdd340a7c950f3b2ff54b0fbb9bc85aa0aa20a560", "votingAddress": "3AdmBtFHjKUbcsX4xedTG9GN6cm3", "isValid": true},{"proRegTxHash": "38c698575ee88faa889885aeae0a82a73de126af58cf23a25c8a05809834a721", "confirmedHash": "c5fd4de91cd374b3eb743db795149065c382c45e67c8927c0d00000000000000", "service": "00000000000000000000ffffc6d37a13", "pubKeyOperator": "8e34b5f0a500a3c31d7ffd906328bc486cfb56c1fef5b9da6ca6618a3e3efa0d495279f5fdef585a2cb2945d77b3115f", "votingAddress": "32PRfErpZu8Fo4veVkXLZhjoyjDf", "isValid": false},{"proRegTxHash": "77bf59e9902c4e0c96ee55d56c176ec3fe6d2a3040faf208e2f0d1b68575d06c", "confirmedHash": "c0e16a3ad830af9164ddb8e805277d70eb44c3a50cce6b9d0100000000000000", "service": "00000000000000000000ffff8bb4d2f9", "pubKeyOperator": "11bcb3266c44d3dc0b3e2f0e4a684f07b27e53dea63959b437bb56f6b13e7dba9a8d9c1481cb0d48b72a65f1488df4a9", "votingAddress": "2tPC51zRGo11YqrTiLMBoZkLGthF", "isValid": true},{"proRegTxHash": "fa1664948fa1d0fee23633dcaa0bdf97203223745ba3364b16093c827558a4d7", "confirmedHash": "7ee01063fca25b0eb55e3da95a43450dd828687e080c4baa1500000000000000", "service": "00000000000000000000ffffbc28f176", "pubKeyOperator": "12129b24f6b0d22e810f80dd34005ba7abe1fcfbccda733f34dec1072c5abb3b0623096100491e01bbe3937ce91fd16f", "votingAddress": "2nALqXDroECe2gbd5cu8LTv44YND", "isValid": true},{"proRegTxHash": "98d9bd6b3d54eff2a7d0cf1475d5baa80618d23230c99d23c36178672ce2ebbb", "confirmedHash": "bd31f35c5cedbf07c6ffa716f2a3acf8f725ab42af8758740500000000000000", "service": "00000000000000000000ffffc034a648", "pubKeyOperator": "0092d65510e47eaf0103b7f110c43fc2f39c53228269e2b4418be107be39edaaeb6c47fe2416b8a10a5683b657296e94", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "d6ecf2d6521286d672c89fb3224e0e8964384a23ebabff2a306e518a7b1ecbd0", "confirmedHash": "3125c76ac696bd20d9a9cf683699b05b8ec56181102b12471300000000000000", "service": "00000000000000000000ffff52d319b5", "pubKeyOperator": "00394c1240672607984ca3eb991d456691122f6d7a416d97c6ff7776e4154cf56a002a795e0e179ef6df19785e596da0", "votingAddress": "2J84UKqgQw4ySpTa9z11xiSxJpDE", "isValid": true},{"proRegTxHash": "f60fe539ad99bc80622800bba3ef9f514e830babe5536539d2acefb5f5392924", "confirmedHash": "87282afc382ec3de9012c908fa235e019fe5cb3359472b7c1000000000000000", "service": "00000000000000000000ffff50d1e750", "pubKeyOperator": "034c0aac6724aee5fc45b5d89c1f6e434814f78249374d7f71a7587ad952b830e9aa7f2fc4c26e7a8cf2bc2d06761ecc", "votingAddress": "2E4LsfkLS9FvSAguhCZq5JB1KebK", "isValid": true},{"proRegTxHash": "06b2bba9e952be2b56fbdfe63f508fcf5c42df777c780b8f521b055f520a7fb9", "confirmedHash": "557bc90620a09fc9d1433b5dcc9ae5bd6f1fdde1c6c022cf0c00000000000000", "service": "00000000000000000000ffff52d31938", "pubKeyOperator": "076ce48c21fd6041e304afe8ba7b80397866f55b7b4b1057cdd138834999a30ef10483a646ac6353b479c5ad684b82d5", "votingAddress": "2J23TpgsSju9JhMtcqD67RWo13BL", "isValid": true},{"proRegTxHash": "53e231220d0dec5dc6db1c75b972c9f88b525cb138a1b9d79c3b8103870ec83d", "confirmedHash": "70fbbfc076d088af4df094e5674825ae0db1056364dd6faa1f00000000000000", "service": "00000000000000000000ffffb23eab3a", "pubKeyOperator": "05ec321a51ebee928fbdb79f4b79ecff9b5a492f397bfe4daacb4ac60461013865d1009f8fcd1aeab49adc93c49516cf", "votingAddress": "3QdgBFqXBCjB1LDgodd3PYadCbK6", "isValid": true},{"proRegTxHash": "ed421f5ae04a686826f54361e49b5d207b004686d018f95f49d374154e7d3d9c", "confirmedHash": "60e0f3fdcbc47cd038384cc747e163d00ad92e094b2ca9712200000000000000", "service": "00000000000000000000ffff52d31528", "pubKeyOperator": "0865d48f4197c2f15e00ba916dff206a57e5174002773a7651b36677522b1bd5b5a09d421df4c21283647aedc45c7754", "votingAddress": "5xxbQuHCYCNi7xWa29Wc28Frtcd", "isValid": true},{"proRegTxHash": "8e7e542c69aeeb228d831af1aaadbf63ab507c1b6d5810f394afa5908447ff4f", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff84919dfc", "pubKeyOperator": "86a7fd8b5bf15adaa2f3dd12db64722f8afb477bdd94808fac525b4162c276ca80e0f80c6418c4940a512e76705eeeee", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "41d2d8ca7651f329595208b2ec4e5dcaa1c151e16b37a3ee42645a8861c6b6b2", "confirmedHash": "825ff51efd7ed0fc1fc428520486adf4d7acec61b83d33cf0b00000000000000", "service": "00000000000000000000ffff55d1f258", "pubKeyOperator": "88062af20293f657edb7dd810a003ca0988550b12bcf8d7b9bd52e5d1c06cf2ed55516ec0a37004a07aa7053c2948d35", "votingAddress": "3v6UD3Qk1XYZtdagFVF97W5tTfk4", "isValid": false},{"proRegTxHash": "2a3ea74c2229d74d8140aa11e0c3df1d87fbb2860c2fd5d553227ff27f26b877", "confirmedHash": "b54c258faae6930b2310e5ba33b358011ba81a265fa00ff70700000000000000", "service": "00000000000000000000ffff52d31548", "pubKeyOperator": "112e9e269ef8a76a221121e7b01b2f130049ab5f62b1e57cb38a811044211d2ff1e2f2a7ceb61093a6842c307b327424", "votingAddress": "292UQGom5kQPjU8Jrg2MkzjFRX6k", "isValid": true},{"proRegTxHash": "7625e427de0ada8b7af434467b650ca1db49e7aa9c2bdc5559946934722a67b8", "confirmedHash": "057fbd4b8a854e3970381e832b1fbd9607ca752b1cd5b31d1400000000000000", "service": "00000000000000000000ffff8ac58870", "pubKeyOperator": "1352aae3e4c34031988f0a4fa04916d6346b594c625e5bc432bc5a298b1605fe6bb25aa44189194cf61de01f1178b6c8", "votingAddress": "2iYNzK8q8vBa5EH7x1AjWwik3ARQ", "isValid": true},{"proRegTxHash": "0bc533850d908fe0c6c5e97f932290ed7ac0c2e7552f6c3804d105d89f466935", "confirmedHash": "451e4884efea2829f151c7fcc6b3617c4ad7eed462bf50292600000000000000", "service": "00000000000000000000ffff5762f675", "pubKeyOperator": "8b1595e880dd49339dcdbbd32db7b47b78999f9d08043499ff4460d7f644c0f4a2b058bf2f6024e7f0e9d83790d72f8f", "votingAddress": "3rk2Qhy2i1RaUTswnLFBdeWz25J7", "isValid": true},{"proRegTxHash": "a84b19c33a65670f1d9349acee2fe669efcd9e3d48809aa77f600d8f5b2b9ccb", "confirmedHash": "b60c2dbbb213c99a236e1f30c1d9f41b204f0b13b294c83d3300000000000000", "service": "00000000000000000000ffff52d31971", "pubKeyOperator": "0e8c28dc73af06e5ebc82254aecc13e6c8773fe5c2be1c1ac5bd5ec93fac8ce1e6a8893b9929a1f50f02ee8d287537a9", "votingAddress": "4VKyeYLeNy62HuEU79QphvN637n4", "isValid": true},{"proRegTxHash": "7a387037835fd0f335854aaf0240a2c9def18dc2c1b582ea3984a2ece7df08a3", "confirmedHash": "39c74fe7727d3e8294a081a8be782573c3d832741bc738f00b00000000000000", "service": "00000000000000000000ffff5fd8ff46", "pubKeyOperator": "11a611ce072ae57c207374b27936546ba144b9a415d20737e1ca25a14978edaccf8f7ded67f917f6d1a429e3447bba12", "votingAddress": "33udootJ9h9oJFTKjQ2h77QrDfTV", "isValid": true},{"proRegTxHash": "04d7f92070c222fd6802e276daeed3bc4414a6ff2987a14ef54262399c99c2f5", "confirmedHash": "ed4b1a65274caa270a3b9662a84749ade6555b2ce41be33a0700000000000000", "service": "00000000000000000000ffff3359875c", "pubKeyOperator": "1705903f719a157657932ab8f6ad59dacd05e8cac1771afe952bd1a578fed3218493f3211bdae4360f5db0be602bfa12", "votingAddress": "3LK6iaEkN97NfKuKygvqB3zgAoEC", "isValid": true},{"proRegTxHash": "3def886e91be9e9724217a53cecb8542c3fdf07c9257114a3ed7da2319ff753e", "confirmedHash": "6996246f6ba0f684b31dc588051275fc8d5177037986213b1c00000000000000", "service": "00000000000000000000ffffbc2815e4", "pubKeyOperator": "98ce9c84b63272020f00349e8597b489ffebc939cb293b6423f0407563f83c2a95ea917a1993763fa017b8c419bf4c0e", "votingAddress": "ax96RjrvyxcjKKQWJJnYtQS4C5E", "isValid": true},{"proRegTxHash": "ad06358c7c350ecda66c5e02e47a12c6ad662a4e02402c30b462b0883d40e610", "confirmedHash": "1fbc3947d68fe60b4c049519c2bc07148729a9d7a5d0ce8f0900000000000000", "service": "00000000000000000000ffffb23ebf0e", "pubKeyOperator": "97c96120ed607837530a071729c7ef1f89fdf0707bfe41d63d33d4720e0a0359e664d5e5775572cb6da3eebe81faf811", "votingAddress": "KNEChRK7ctWm2nWaYCpHQoZ7756", "isValid": true},{"proRegTxHash": "05e61a332e4b85f4f8e685f1fcf64892807c92110e440d6b13e0e0fd3615925e", "confirmedHash": "2e42482a9a791e3abce8934ebb9e66eea6c497c6a0eb3b030700000000000000", "service": "00000000000000000000ffffc28754c9", "pubKeyOperator": "1934c039b55b5077b09412fed6e13ee5799bd388d96f28ff85dcb844419e717e04cf42d9213887f55f0392150639405b", "votingAddress": "4G7kZiQzk6wu3BXCNUBZta5AbjdH", "isValid": true},{"proRegTxHash": "67089c79225497cd7b24a2fe32193fda38005426e5e0886e8dfef0e55a5091ac", "confirmedHash": "3f16b9b9d664619a5d665aba3e96c3b404ff8a1d3445ee561400000000000000", "service": "00000000000000000000ffff8e5d95f1", "pubKeyOperator": "0c553457ce198e1f9035b0da29690d02e6eb1c067594d602060459d8085aabd5a2ca01a308a74f39597123c7a00e6c6f", "votingAddress": "2SC8Br6dk6BNnBJrtjTzL5B4zXJX", "isValid": true},{"proRegTxHash": "7887d242066518b86d0dcd112ab6c1eedf57c6548969182a03e88e33b39c470b", "confirmedHash": "ae0b8465c432c9b464fc4a034dedb35a451c1ce7a56da78e0c00000000000000", "service": "00000000000000000000ffff52d31511", "pubKeyOperator": "8b6b3df1c2bf61a0f4b160154afbd15826f1e6fedc2eb2d53fb998597de44a096f427b7aaffa2564b0d2ddbd9ba774b8", "votingAddress": "oqtChYro4eqyDBnUSnDS5f2XaW1", "isValid": true},{"proRegTxHash": "f96d666c518fc94056bc247dd2dcf47f19283c4f815ab253554e3480d22d5241", "confirmedHash": "1672226fc7a88ecd70f5573858d81f2a20d7f4d4c1f9538b1200000000000000", "service": "00000000000000000000ffffc28754f6", "pubKeyOperator": "08d902f9a1ee366fa10d260544ea7f73f5ffe1346de55d4bee9b9cf8c625ff42e23b4856333a145a5ac728535e8f43d7", "votingAddress": "pn7zGnnF5Gezb7Sv98D2wAdm34Z", "isValid": true},{"proRegTxHash": "f13fd1e652e51d53e6882e4ee2b1eaceed93b34c5b3ede6c7a5b97b8d3aa0ac9", "confirmedHash": "085c87a168adef427bad38791dce86b3e81ee4a5bbb1b08e1800000000000000", "service": "00000000000000000000ffffa7634175", "pubKeyOperator": "195347d007ccb981ea0b9f941eb5ca7e704670b4cf0eac354b14ce5c6ca52d074433ea96d343790ef9389346805fa13d", "votingAddress": "2N86NpPFKQU6zq5uyVycATkbBWai", "isValid": true},{"proRegTxHash": "339fecfb62ec842ffb2ef4795e02505207ade4117447498ffa2721215ab5b128", "confirmedHash": "538ee80ad9ffa7f7a024d24a593ae7c8a434cfa9394b14ef0800000000000000", "service": "00000000000000000000ffff6dcdb6b9", "pubKeyOperator": "8c2c32d372da27b47004ce327c4db9384702de158a774418a749773b926346deb983fd9233fa906bfc174e401ccd2b81", "votingAddress": "3655LmDHAT1Qgbt4U4A6jk44vrqu", "isValid": true},{"proRegTxHash": "a5fc0201630936ec865e4b829bc7ec076e3c1c069703ad2ad63a4d4662c85ed7", "confirmedHash": "64059bb0649b1bd8f6a765ce2b45c83838543af0f5f254560e00000000000000", "service": "00000000000000000000ffffbc28cd09", "pubKeyOperator": "85d2d0b3be918c0356acc24fa49b924bda9efab78f7c32ea9326b4cbf4a204b601807d0ed106e6432001c35799247a98", "votingAddress": "35LZbvLrDQXZ9YAtrN9KdYfu5jth", "isValid": true},{"proRegTxHash": "268da2ac4e46dd35b7cc635aec413a906d7ee0080a90d9cab7151d194fd3f0e8", "confirmedHash": "5fc76b926a355b2a6be2d3f5adf7515d2d4b6a5fb90750a01200000000000000", "service": "00000000000000000000ffffa5e8a9a5", "pubKeyOperator": "0d8600b12d59abb7a52f0c73082c535c170aa86e8ebf64955d9f00f208f0df81fbebdbcfad5d7e439b48e7a2146e3ff7", "votingAddress": "3TqPME1FKxeSPCi5ZamXTzEc6VUq", "isValid": true},{"proRegTxHash": "13361f56a7a6b91d31247bb0468701f0a2d5eb7e2524c7bac4921ee739088dd6", "confirmedHash": "dcb34c133584729ac26604362c8d0e45753104c82d803c491800000000000000", "service": "00000000000000000000ffffb9453692", "pubKeyOperator": "013422421ab39675687372b53cf1578e7ff2ab291d9ecfef65baef1a18a9d057544fefe5a382f2b1ce79d3d8b612ab3b", "votingAddress": "LprZu6rJ2BQgMdTHxM7dHsXncgM", "isValid": true},{"proRegTxHash": "cce4d427410ca13d4508de5f74f62bf0a1f25a1ea400fe59f792d0cba7036cbd", "confirmedHash": "35fb0f4a01350e54996631d8234ae8032ea83aabd6a8b7080600000000000000", "service": "00000000000000000000ffffbc28cd07", "pubKeyOperator": "907fc66aba6719f1b58754b631b70d302a025673a703632d58b5618d1a280a20dcec84249d1f59c278ce3704c29331de", "votingAddress": "3YbGkEbKPh6dceKmt2nu1VsKRUSg", "isValid": true},{"proRegTxHash": "f3da137adb24e0f53ff2b380f4d22965ec6c7af53071f99717a789184f448fd1", "confirmedHash": "2b6b007fabf0d8f66f6e9dfbfd422e590e284c4ef3c021211b00000000000000", "service": "00000000000000000000ffffc6d37fcb", "pubKeyOperator": "195564030c3a7eb94d4cdd3c97db3d7fb7bd94d8d5b2096416f1368c72c5ecd051fa889ddb3f638aa310b3ff886835c8", "votingAddress": "39B9TWeu6MhL6gbL1YKqmVqstpEz", "isValid": false},{"proRegTxHash": "3c2220c7cfe3ff4b555d078e6a05249a39c746d24235a89016dfcbb0ec7dc73a", "confirmedHash": "d2cf92ba34e725a7b8b2d3647c0087004e44f3e4b621755e0a00000000000000", "service": "00000000000000000000ffff80c7969f", "pubKeyOperator": "043b0003dc221a22d62b50be90d91d4153ad05a53a0d5e5020090a68a56ac45d60e18520910246dc874e28c06b58f45e", "votingAddress": "29oN5JyKEcrNBgfPAsNtcnDs268G", "isValid": true},{"proRegTxHash": "0ee9c00456f6e2f76959fed638b5ed8d3e25d097b254251caab506336f88e01e", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff968865bb", "pubKeyOperator": "87900d5f2515b8223c6664279a0ac8a3878107cdef27689732427bdb0daafe79b581173838d99f17d95264e64bbb8b0b", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "42af00b2ea557276fdd850c385c85235628c72db849d6994ec6e4523b75e3a50", "confirmedHash": "b25d547dd3f4ef9947aceea7043c87a38aa12370dc114f001200000000000000", "service": "00000000000000000000ffff50d1edca", "pubKeyOperator": "0a07d9ae599cbe0302d1880e888e570d9bea6e4aa99349bf3cf8dd0d73a4ded69f116942507678a84790dd0d42feefc3", "votingAddress": "4C5Rcy3GaCjuHUFhKWKtvQ8t85YV", "isValid": false},{"proRegTxHash": "02692840a924ed34cf1535a294b7130db34b984a5c1d32455332fbc2c5588cbc", "confirmedHash": "54ca220dce6177184e60d8a3194e7046c2aad4e4adaf83190f00000000000000", "service": "00000000000000000000ffff52d319ce", "pubKeyOperator": "8669034d1d188d96eaaa33affdc2983890a33e4f07dd3fe02ca837c2feb2d53b73ec5378dfa6edf180dbe2117591c8f4", "votingAddress": "3hnfp1M261qUKfcdPAPxZgujbRi5", "isValid": true},{"proRegTxHash": "5d21f444b29f069f0e1528eead74244b91c69e7647084651bd45442da518fd2c", "confirmedHash": "6ff9bc2a28fac8857dfaf3dba0bbf8b128aeb9ca38c3b2ed0500000000000000", "service": "00000000000000000000ffffa516e53f", "pubKeyOperator": "81188ea3d14e0610b01c115f42f334cfaae9264b3652b1a14d7fe69640e7f9b2e9a9ec659436a8b586f1f7bce946e941", "votingAddress": "bFUDhAeAqPBbU6DS8v36DanjHhQ", "isValid": true},{"proRegTxHash": "fe585e7560c09da6c46d28a555255b9345a3ac67f63d66568e2e0f94b5ad3673", "confirmedHash": "e296a3dc9a286780f38c976e6a42e7b9ff044bd7401d2dd23b00000000000000", "service": "00000000000000000000ffff55d1f1b8", "pubKeyOperator": "877d2479c5c7f591d9b4ac5acbb9c4c36b7255bced57efbf1d10fa7aab110bdff3a6d143ee111b0cd5e70603c5f00bf2", "votingAddress": "2ghgvkNWYtahzdoLCZshYDtrqjrM", "isValid": true},{"proRegTxHash": "3956be9edb2420afbf2e33f6a281114d1d15c7e91553f87ec527ceb007f267f5", "confirmedHash": "13a1b473a244a2e0464eeaa38ce95ebb758a928c002aa9332b00000000000000", "service": "00000000000000000000ffff6deb458b", "pubKeyOperator": "116eebf165e1ec36c828437bea04152c1875deca27f0af2e81cce25d178b7d523f29545875cfaadbf768853385d07639", "votingAddress": "4SdK17EVHJ8vdHtCMeX4F7sNtpLH", "isValid": true},{"proRegTxHash": "28f4bea57aff2360684812bfd83f3808b2f09cf4c413fca813b3aedabc72e649", "confirmedHash": "db21fc7c32b05f30bd46d077d2073e32bcdef78b555580121100000000000000", "service": "00000000000000000000ffff58630b16", "pubKeyOperator": "9624a52f9f4a0f623af60e23ba52c46a8768e7fddff5f7e551f6da3c3f0f5b2a02988118493ac71dfa19d8f36a4a7fdf", "votingAddress": "3NUBd1cPuLZuN3XP9ewQerKtG2wn", "isValid": true},{"proRegTxHash": "c5b4809e101bc55fcb48f586c2959aa368f222126766fc5526afbf5ef578b34a", "confirmedHash": "7aee39311ef01bb309e5c9c3fbf0ba8f10080084b8f14dbb0200000000000000", "service": "00000000000000000000ffffc2b64b88", "pubKeyOperator": "86ce58a515bf4b115bee6fabfbd43ce82014baa96e80caf55327c16509e542808521913d31830a1b784a5f9cebe78859", "votingAddress": "CDpYFjsrc2kSYaUZzmDgpRKmyPu", "isValid": true},{"proRegTxHash": "85a25c89c490ad87312518cb83097dccbf2b43d4a04d9e78413d54e38cb4bf0f", "confirmedHash": "25c09974e24c508a126a916900319bf7dd02e507b655f1411a00000000000000", "service": "00000000000000000000ffff90ca48d3", "pubKeyOperator": "898b75fb300e58b24455996781407973fc0e7fb8c64104e2f79aa560df4d2f6ce5c7067f6a7ce17a931bf09a498d3fa4", "votingAddress": "3MqmYACgyUNSizZBSsR3JPfNMPbY", "isValid": true},{"proRegTxHash": "78e3b02e05391adb953e15d6bdb3daae616fde0c1a014d456ee010483e58f300", "confirmedHash": "e6af515e3e1d9f79147a96f98fb29e8f690f1bd6332337042c00000000000000", "service": "00000000000000000000ffff52d315ed", "pubKeyOperator": "8766cec62bc40cc9b83f395627514d94780ffaf2c5cd8f8d5abc09a99b89c3009783c48f35b6063e7ec0ded6f14b04a4", "votingAddress": "3DtLDrCCfHeG4MrJGXP8RenDJNxy", "isValid": true},{"proRegTxHash": "1ced11c04c33b02d954032e6a5e54cf73711cfb3d3698ec2f4bceab3544d7e85", "confirmedHash": "6bcbc95739934227ff070c39a0f52370036c46ac6abeef330b00000000000000", "service": "00000000000000000000ffffc21ad582", "pubKeyOperator": "8aa642dfc6b3b6104e8f0d460ed3a0be33281fae7c7e48b2b9746910d887e910c6beb3001492e806007581b6bf9bec21", "votingAddress": "zCeztvHCUccn6wNa61SyTRfCY6n", "isValid": true},{"proRegTxHash": "1bbe8176f52d0e1a7b61b6ee1faecdec19507f6e8e84ac2f18fc2edfc7322e97", "confirmedHash": "44a8b66ae650a39e808c8ce4c5037afccbb221da70a587f60c00000000000000", "service": "00000000000000000000ffff86d16f71", "pubKeyOperator": "951897ba1a0fa5e9cd6e3da4734f46c8cd9b2fcc9b1e08343e105a2ee133faa8f2ed7728d95e81708e9badd555ba88f6", "votingAddress": "mV35ve3LWnFm3TH1MNas2HAJKmw", "isValid": false},{"proRegTxHash": "c5493c72b0a9cbd568e8c45564366f781a02982c09e6703e907091a4350c9d95", "confirmedHash": "ca7e56406845e9dd508141f6a43276d412a2a8e0a9aa5f960b00000000000000", "service": "00000000000000000000ffff52d3154b", "pubKeyOperator": "8bbf66826636558d315fc6c42887624bff805e0d042bd7046799ae34c711b824c263502044a7d1dbcd3a3fdf75d23a3c", "votingAddress": "3FvXYhDnvpwUx7pUG6ACoKp5LHgV", "isValid": true},{"proRegTxHash": "dadaca459d1c4a5007549a7713fa863ba733a14a787271cdc699b132d0a7e120", "confirmedHash": "e796e68f64865fe4ad58afb9703676638a00b1d98c477fee1c00000000000000", "service": "00000000000000000000ffff87b5084e", "pubKeyOperator": "96475713ea0ff74395eaf02db9f9f3a4c53c28d6013b1301af9b469b476352f576699ddbeac55d4383399f3b8f16cb61", "votingAddress": "eieHz5PeQnjCtme5NwpvVFJuZ4H", "isValid": true},{"proRegTxHash": "14c7cdc1e8355c367ba162063ca70c99ec0042304f9621f5da9694563c8b8f6c", "confirmedHash": "546ca2ef99ffebdc41853fc79f0e9644c260ab7854295d431900000000000000", "service": "00000000000000000000ffff52d31541", "pubKeyOperator": "88e0b78eb3fb3407deeba0aa867d5adca36fee9ebb15bcefd7098e691f489e2df95eddcbb9f1c8d52f63573e5802c74c", "votingAddress": "3Y9kATCFgrk2SnwE8kohsXeXWKHR", "isValid": true},{"proRegTxHash": "7bd2431c2bc28936b0f1f26dc3ce81e52f310e60f0833e54b0d7e8500cd0bac1", "confirmedHash": "a633649a9c11c9a7edcfe37fb35d8474ca706367dcc9c34d0100000000000000", "service": "00000000000000000000ffff33595efe", "pubKeyOperator": "1048309853f42927428042dbe14dd973d2e78e18afa830d64e60258dafd460b318ce0b610e6b731b0077cb8440aac5f8", "votingAddress": "2XwhC3BNqh96RmScAc4LxDveQMmn", "isValid": true},{"proRegTxHash": "15084b977d008db93a3a78bac5f961b6e8a4ca3b51c428c203dacf63658bd4ad", "confirmedHash": "2bc65a9788d57ed74f7de0d0cddc4791b3bb336b931f40ca1900000000000000", "service": "00000000000000000000ffff33442f53", "pubKeyOperator": "170430dd59ee0e543863b7ae7eb323b6cb53e55648f389d3fb5d9156aca0788c1abddb8a749e59c3f352b92371a0fdc5", "votingAddress": "2pM7NNWPWnjrV9WyY8cNdcZPRrQj", "isValid": true},{"proRegTxHash": "daeec7d54ef55ae169a2cc00294c5eda9bcefeaa1e379ea4de98672edfbb905d", "confirmedHash": "a635fac4fcc7c553d6cd0669946f0f67c9df69f02882d4d50700000000000000", "service": "00000000000000000000ffff88f37381", "pubKeyOperator": "16e810f1e6f3ee8617572ad61d4bbc70da8f7a4a8fdc9eabc8fa7d917ec19cba563160aac270a1256911caeb5963967e", "votingAddress": "7iYF2ZoF3wzMejjKN1xZX2Fc8sz", "isValid": true},{"proRegTxHash": "e8ef15c480b528880a537caf61e80df2dabf32fe6fb4bc8fe7f081313f2cd431", "confirmedHash": "d83a48540eecc7c919bec40eb6a5ae333c2f1a0fa2b00b870700000000000000", "service": "00000000000000000000ffff52d31941", "pubKeyOperator": "1142ecf857558c08f443f2eb25dee6a083f0827d033797ecdf0f4877343896c9be9e23727c9a1acfadc00c0de6268315", "votingAddress": "4Vo1qLHRf8UN9it7CbQ79oXyw7Fx", "isValid": true},{"proRegTxHash": "f8b5c45908641dc4aedc66e9258750de6784d69786675f7ee904d21dc2a541b2", "confirmedHash": "64b416cd9399bc1885fe1b660d1c1d6a383970a6c5a45ad50100000000000000", "service": "00000000000000000000ffffb07b39c7", "pubKeyOperator": "0c6bcdd6c407cbb2d68b907d0b144fb0c6488df46c146d47be1f67f3f8e4fb70d2b099950a93cd2fd027afef69bc41fe", "votingAddress": "9NHFtakW3JBCCTHRUFpN41ntqVi", "isValid": true},{"proRegTxHash": "5e302e07acf6b08439d466695ecdb176c123edc357267f97d12e2eeae33346c7", "confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", "service": "00000000000000000000ffff2d4ce869", "pubKeyOperator": "8447c9d7bca898292ec0de34ed6180fa2dc30afb760a00e677865d8ba1e1223efaaec632e55dad65f10c50fe1d144bb7", "votingAddress": "4455UUNLmoHY4M9eGnZcPaZAmuKM", "isValid": true},{"proRegTxHash": "e58d505fcc53642a2d164e55b45a9b1a219684065196d5412cb626777d30d887", "confirmedHash": "4171e9c7bafcb1164879ac9550c2fc5de3b5a52452d2f4440b00000000000000", "service": "00000000000000000000ffffd5a8f9ae", "pubKeyOperator": "93ad20042e89ec74c299b961592cbddf108022ec4742742b7a86edca6b5db105ca715bece550f73142b0ff80978c9076", "votingAddress": "3amt47xcVQ9NbrKYBQFNLpSfkyQC", "isValid": true},{"proRegTxHash": "847623c176c792eea7353b856f638468e4b20b4d0326cc477e755ffd7cb69a20", "confirmedHash": "8e45bf03c8478990f4f9a896ebb87caf17377492b443b4290300000000000000", "service": "00000000000000000000ffffae22e9cc", "pubKeyOperator": "80f1158da31f8c805f6249486d0dc1b57b1bac6e1d9f9f0faba6c2cedd974e20d4c5335bd991d0fb9c7df862d1edbc01", "votingAddress": "4MgDet3uzAxZm1YrpnrUEMkiFJbA", "isValid": true},{"proRegTxHash": "3389fe9931099e973dc0fc36e67f259a973bd4ee00a4d9331d0dd729c84f23b9", "confirmedHash": "c0cfa5afb4a8efea17a2668971f2e2569e68897f5e6203e92200000000000000", "service": "00000000000000000000ffff9f410ac2", "pubKeyOperator": "96d8fe4cf07e4543d3378f4de9c33637f7a3ae2e012fccb88fefbc31d0a809ed3f7c34c2c7b71a39c8035c9b8c00bf08", "votingAddress": "4FtXZaCNKKCJXKohi8aCmcTnBH3T", "isValid": true},{"proRegTxHash": "2b2e0a2b80952d6505635e0a5dca2b118fae892bf9a77f471ae8a0fd49dca491", "confirmedHash": "46170f4227b9ee59dfb04c0e445a9300a3ff5b4e8ef9abae1400000000000000", "service": "00000000000000000000ffff5fd86d82", "pubKeyOperator": "9966620130d6aace3d9745659617e4d9c7c0c1e6e2d184881e5d8402da2fada1ee5b416236a85e8fd6fead8d36ea2407", "votingAddress": "ujzYDMqTdQi99K4Xt9sPgDrLCj1", "isValid": true},{"proRegTxHash": "219597fc9a324f55587ee3c1859d5ef9a6b877200d930ad383331e49709dd6ab", "confirmedHash": "b02029cebf0649caf6b15aedf0ebb3e5796980373f121a9d2400000000000000", "service": "00000000000000000000ffffb29d5bb3", "pubKeyOperator": "14251215fe97a17389753a0b45a1a4e826ae3fd8f5c01d3d495ec2f7d6cd2b6d401521eb9284151057397b377dc1c011", "votingAddress": "X4Aobfs4awXWjEHLeTwZmAJNnFW", "isValid": true},{"proRegTxHash": "c893667c286e7a3a3b00a5aeb2fd44130754e93ed61ed01c0b667accdc1beb81", "confirmedHash": "c58971671ff2e5b2629c64cf449fb208b7215008b0a2aede0a00000000000000", "service": "00000000000000000000ffff52d3150a", "pubKeyOperator": "8ca7e57072ab96602fc7d15f735320d375a6d7979645be2e9f9a0332ef3dd2cfd1d95c88490106b5550b0a2017833b4f", "votingAddress": "4Lq8HbFnXPP3eaWK3CXdtZra2MdA", "isValid": true},{"proRegTxHash": "32f3c79dd990cff32c236941da8803b84e79f3cf424440c81e8a0f27aca12064", "confirmedHash": "c722ae4b0ad53087f1c54ef8bcaab18a53400b38fc093ed90600000000000000", "service": "00000000000000000000ffff877d4709", "pubKeyOperator": "84c7528a05c1ab8cc22f29c17adaea5c61f80cd649353e6c388bf0af438fbf7565a0cfcdbf1f87b187d08ffd5cc05e24", "votingAddress": "4Mb9V5BMYyobUTH8wjtGhtKTt1a4", "isValid": false},{"proRegTxHash": "2bcf790720a5f494a6904e1341387c431a157db74fc925e9db3310e2a41b6c20", "confirmedHash": "546ca2ef99ffebdc41853fc79f0e9644c260ab7854295d431900000000000000", "service": "00000000000000000000ffff52d31531", "pubKeyOperator": "8fd97561bdccd9900317a20f83d600d119abafafefb3d04ac5365911a57664c729cec9076f75c4a0abc24b997c719b5a", "votingAddress": "27rZCpms4oLnF4r7GHpjJw1L4BHi", "isValid": true},{"proRegTxHash": "bf9ab69f6a85f8e93e6b3484073e984e6d8d54573090af48d1e214f27a98f115", "confirmedHash": "3de275cbb8621d43e156ab1d8d52a55dd276792a7ad1636e1800000000000000", "service": "00000000000000000000ffffb23ec477", "pubKeyOperator": "07e8332894a61db65efd48f3e9f4400f14b0e904e9f55c13d7ea45275cc4ecb25627a3a5b33b0ff851d65fd20c6440d6", "votingAddress": "2393V62ivZvvq5EAQTCkFm4qFY55", "isValid": true},{"proRegTxHash": "a8e16a90621bb199b4fe40ff439dc0013e4417ea9f9c6500238c2ee932974ff6", "confirmedHash": "b0e7a319813e46540fb90415f6abbb4c28ed51e204d1e4a40b00000000000000", "service": "00000000000000000000ffff5fd87e2c", "pubKeyOperator": "967b31d50939221212d327ed0cfba612e26c439661ba76a81ef32fc77ef97a81a85b124461f235c310efee5bb1b63c4d", "votingAddress": "3cYUU8CroBvpmoXaaXvf6CbgDZe2", "isValid": true},{"proRegTxHash": "9c6df419c4e7bc4ec7f4571f3a1b32df356f6a4396236b6c655db4d9f7a3418b", "confirmedHash": "fecb8ca6e39f79a283fee58baceb791e6066e551b51a6f8b1100000000000000", "service": "00000000000000000000ffffbc2815e6", "pubKeyOperator": "975abcbc8e685fcfb31057c7e7f655bdbc15e1b52c4c6c22021aa9beb53b4e5743aad1f83d2a7a8f887d7b9b42a7c77c", "votingAddress": "46GwZ3pdngLjmRvSYecsu3J5Z1TB", "isValid": true},{"proRegTxHash": "201c568ac5f758c1eb8be4a5356dee778009ef032ddb39d47fd7645bc7ef0943", "confirmedHash": "ce3dab9533319410fa9b597588d703b60430b292f1fefa170a00000000000000", "service": "00000000000000000000ffff6ca08674", "pubKeyOperator": "8c59300831aa194b99c05622503b0406874efc2542e74054b3f6a16622765649fac27d2a462f3ae58abcea95f6094861", "votingAddress": "gxHbDcZtZhC5r1urpUf5fhqDUoG", "isValid": true},{"proRegTxHash": "d73c48c9bddf5bd67c916dd20c6bfde12e5745d1002424d3a722be0f71f50d84", "confirmedHash": "fd807e51b9044ed8945825467b7151afad3d89734540054a1800000000000000", "service": "00000000000000000000ffff9f597b45", "pubKeyOperator": "86ce2f9310595679e57443f4e594768148acccebb3c5a77a50b73a78c561422da0d19effaf16e646af96b35ffd13d17b", "votingAddress": "2N2rcuaTc3swTZQieKAwyRAKuJaa", "isValid": true},{"proRegTxHash": "9cddb6b18126479fefbad5593ac63735924a8a532ff52b4739a3d2702db46d7e", "confirmedHash": "d36bd3f1c20f4aeca2bd91abc9803e34584e44f2b6056d010000000000000000", "service": "00000000000000000000ffff2d2081c6", "pubKeyOperator": "977060b250023b86c9cfda4fe5441cd83d4c41b29c680f9e36638de73492c4c25696a4951506ec4d7b89c4f0c0210992", "votingAddress": "o7Lfjkp7XkaUrxDpVHSivZ6Ax3r", "isValid": true},{"proRegTxHash": "a3e0f48636c3650559f7b5212c118005198b2dfd1b24a5ba2b68b624272b4d72", "confirmedHash": "00960cca1bd93bdfe38eefd8f7c17d3856f416e84a85b5c63500000000000000", "service": "00000000000000000000ffff74cb3673", "pubKeyOperator": "0c9ab1e12e07140f42977cb0d0c43c8b9c8f3ae8ca53647b464bd8c2642cb85abc1e05b1bb9445b3ce859881aec7015a", "votingAddress": "P4dvA33xNFgtE13mJgyykNPY7dW", "isValid": true},{"proRegTxHash": "512c1870efe0552dd3539a39c3b209ee09d7c900a45bfee33f9efd272c819187", "confirmedHash": "68ceea9a651b87975fcf47ca389d350df610570fa7e64bdb1500000000000000", "service": "00000000000000000000ffff8b3be739", "pubKeyOperator": "14ef57b0e1c761b0fe0add1d6b761d0775d979b9f5c84faa95f82cd7d169f2d9130995df5135275706a81426819cc849", "votingAddress": "BgsGcWiioDrBmCqMQVHqoaRBrwG", "isValid": true},{"proRegTxHash": "bda19b0623addbc08a8de0cc3c3b374d11e182a52f6ea96bbdc21ad929464b6d", "confirmedHash": "340040bd464f166bb1cf95ab34f897a684015bf65de80bc71c00000000000000", "service": "00000000000000000000ffff52d3155c", "pubKeyOperator": "947454db34e75e8dcde293ac1a983ed851bdc70aff494c069aa63f24a45644c1e9bcfe393196ba51d5f7d49079216ef4", "votingAddress": "3crM29qT3uEcTkxtCn7Qpu19RxAi", "isValid": true},{"proRegTxHash": "5cde42a4429c831c1319a4cce52cf7de0b52b1328bed5ed33deb1329d23e8037", "confirmedHash": "c389c5950c59d7784d58bfb5431a3de88c7a34bcd66d621d0500000000000000", "service": "00000000000000000000ffff87b50fe3", "pubKeyOperator": "91c1f9d7befa8f2902b6fd51a553593a33f7b847d455d909297acd47bd10db1dcae7d91203bfac44d00a86553e3d3e5e", "votingAddress": "2TEAGRci5RBEDDKEVWmQ32zZE2ax", "isValid": true},{"proRegTxHash": "1c384a91ff261f66f449f34ba0dc73df8bd5ae7dd89cb8a88c4ab0a1929792a4", "confirmedHash": "4bcd83619ca8580df81c5d5761e8236224c615e3c2e354be0100000000000000", "service": "00000000000000000000ffff2d209a35", "pubKeyOperator": "940821ffc45143cd4b8fb70024dbd266fa77d4d8afe3aea504fb6108726d04b093d21c894cf8dec8fd776dcb85bd2e92", "votingAddress": "2UrmCYvS56V1XYQENJvUt1Dt9No8", "isValid": false},{"proRegTxHash": "68af8c49da4ebe117166771a32b2ddac8c7cdc6fcfc1590a4876026fa383a685", "confirmedHash": "9c799fcff3f7d095a4a075bbc7f60eca9eb0b1a78a0d1e4d2a00000000000000", "service": "00000000000000000000ffff33442f88", "pubKeyOperator": "8b9b8da833ac8f33a25e13a3694a7aa7b3f2e951983f9cea09cd9d902416dc9cfe3c205110090ce7b1fd64051ed4ebc9", "votingAddress": "4DTtWj2FkoW76nShfy6HkydekZkh", "isValid": true},{"proRegTxHash": "5b6d1ac71916c6ae9b156e7207662f1cdac1f286ee98b13697a45d0f95c296cb", "confirmedHash": "1efe916458516e9a3a39804a6c79bd01894b38dc1d2758861a00000000000000", "service": "00000000000000000000ffffa7ac62af", "pubKeyOperator": "893ca6db027085d59b780cabadf3fe0c7315320445652937f490c6f2b0669379f2c79502ed159804027169551ebdb67e", "votingAddress": "ds5z3uWbwkf35ybgppwGGxyXTqx", "isValid": true},{"proRegTxHash": "8b25c1fe863d61ab9138f29428b3e3d6037adbdeb9eaf485b5bd394aeab00968", "confirmedHash": "b225b2f15a25ec3a41ac55dd37b2879762bdbfe098aec16c1600000000000000", "service": "00000000000000000000ffffc6c77c47", "pubKeyOperator": "97c24f32399689a22323cb3ae63bd90ac35a9fb3f083f430040004711c9e55575a61f3bce809e7e3d8db0fc7b0b9f0f2", "votingAddress": "mXesMXjkVfwstw73urY5X3Rxbpg", "isValid": true},{"proRegTxHash": "c800f1a9f772b3e9912c5431cb304a4fee03d7232ca062abcfde6f6376038b01", "confirmedHash": "c72ca5eae961f97e5856bf2580c435aeda0904fc4026b2d51a00000000000000", "service": "00000000000000000000ffff9f413bf4", "pubKeyOperator": "94540e1aeccb7d7a7fef992e73935baf67a0f7c32bf9b7cdcca9d26b3a8e65cec1c8fd9ded6e7273280d7e9d8f06ee9a", "votingAddress": "3hkbhwnvd63ctNcDCy3MEkg5wEaA", "isValid": true},{"proRegTxHash": "8479a34c379d3d3cc560ff5b94ff971d636d193dbbb96f9b7e3f2dea94e15142", "confirmedHash": "36c4e846dacc626b7619355804ea4f3bfcc94419c17f0c520400000000000000", "service": "00000000000000000000ffffa8776a1a", "pubKeyOperator": "8e5c63f4eba8a05fe10c4fa383c2e9388091ecc16f3a228f7621b737b2bf9074d13b11127f69db5f018694427aa60675", "votingAddress": "4VeuUhvTBuEMghQtArDv2xi87VgK", "isValid": true},{"proRegTxHash": "ac898a69e4260ddba3b76dd722bfd1f0ce92d2dd680adb150bf31b07511d6188", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b067", "pubKeyOperator": "0c1344cb79e5f6f5ca566d6e28a4fa89a43a37d06af20f58bad3f699a55eedb470d2f29a8e73f0fc5d49bb9cfea4913c", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "4590b804030da31d9e4138a76b9db2c78bf1e86d9dabc0cc31e41739707e35a9", "confirmedHash": "4b2df05a1194aa98d7d37f3d43175fa3066aebcc77cef5b51400000000000000", "service": "00000000000000000000ffff8b3b483f", "pubKeyOperator": "074f109089daa0b2d90ce44ea34142a346bf8021511b1a2ade5375a129033fe0a63afa04b8add17e63447c6207bbe7e0", "votingAddress": "hhBcaY3AsJ5HoRJMZ7aPWNnaSJi", "isValid": true},{"proRegTxHash": "f6a4b1d979b02549d180957f14184e0aee5bc332b06f65ca83b98cac5a178951", "confirmedHash": "dd66ee0d17df93afb07f246c44fc92ec13314f5f2a184cf10200000000000000", "service": "00000000000000000000ffff330ffee0", "pubKeyOperator": "073c7b9f6d5a5c120e1b4e041fd891ccff9ff48feefedea76b35be6e2c59ed8daaa1eae813af20322f13717f144e5646", "votingAddress": "3NbnzgmAWUjTuYwKHCYAKjB6BH4L", "isValid": true},{"proRegTxHash": "134352df7446c2c4a9f3a6e6f11c548e9eb142497a06debd096507e271c8b9cb", "confirmedHash": "2c7b8af4bacb17e6df6460ca5fc7c6d34712740523a4b8131400000000000000", "service": "00000000000000000000ffff52d31512", "pubKeyOperator": "0918bec88fa7d05ed5d20a706336d30a3f782ceed752b165ac9d3265e2fa1ae0badd6d4e87ce6fb3e513250258257ad9", "votingAddress": "3JctyCG2j2CcjSSvXzEqqxTtk9hi", "isValid": true},{"proRegTxHash": "f13efe83ff909f1d5556c3312681828b6ea4cfd6f251ec58ddc91b283022d09d", "confirmedHash": "0a3424ccd1d4d1beab23b417ae3ceb3bc221f8ec14d216f40800000000000000", "service": "00000000000000000000ffff59280081", "pubKeyOperator": "840163bdf18afda0a01927cb38d08003fa1fbe16fdb99245a6c11942f034c2c9297140de86d707f01d09c8f46ddd1572", "votingAddress": "3WDbQkDaRR7zWyujyUvFi2eyBgGC", "isValid": false},{"proRegTxHash": "846bb4773c61d9d4a18a714a0e4d5991dbe01df7247450467e9ac5c7de67520f", "confirmedHash": "9c41ba6225e8223fdf9bd5a3fb9f71741b4c18b3e52245520400000000000000", "service": "00000000000000000000ffff335385c7", "pubKeyOperator": "84330d8f802cd6d3edb49e3f45cffcdd270fc38c230d26e47d3fe52d94cabc154254557fd93cb0498f0c273214c0180a", "votingAddress": "2rX79x8FRmQCLRrhv19qDbgmnPdh", "isValid": true},{"proRegTxHash": "b16b0929f634d5563806744d51d0fbc9a3dacc0bc8c3665abb75e1e9ad1d3968", "confirmedHash": "7cda983d2dd8a2fce5cf6141c48cfe13ed4c9c83d43f2b4e2900000000000000", "service": "00000000000000000000ffff5fd97d68", "pubKeyOperator": "08915a5164a39c40a66491b04b44c89d5ac0122b3e733f1c7310f5b5df71b3b46e2e73475e80a67f37d52113c325ce4d", "votingAddress": "4XyJsBf2jAHqvDkbXhsGaVM7NHpd", "isValid": true},{"proRegTxHash": "8ba95d610c7c142e092e3037296a3426cb6478b35f0168fb9cabddbca42c8a0e", "confirmedHash": "073922a7245e8ef88c4248127ff95c9725b21266f6d4c08e1100000000000000", "service": "00000000000000000000ffff8e84baf0", "pubKeyOperator": "0920e97811838905eeb7d7a448ca90cdc0e64316aafe584c71ae3b6d74dd0ad6e653a6e3c8b41bced546ad6933966d16", "votingAddress": "3WK4EwcewCaD3wF979AbHv43Cy3w", "isValid": true},{"proRegTxHash": "b34f50541a418716dac656ed6a82c9bd8a1611227ec10eb0f668a5910eb69a48", "confirmedHash": "0991f3e8aa2b2660343d779120935a3d27d8c73c342ef4a22d00000000000000", "service": "00000000000000000000ffff68ecb71d", "pubKeyOperator": "09621d91610823d2676d9e19f8230406a27bceaf2f576cbff13fe46aa33b8d3d651ec39ac3e83206c4f8aefd4d340bdb", "votingAddress": "2oxdGoxwmBqvjpanRMMnH68Ai1q", "isValid": true},{"proRegTxHash": "1611619fdf3a4c910de9ae663580a3a8536299aeacf10f7716700883a72ba292", "confirmedHash": "b864eca89e4e628c9cd3b40ba6f50257b644d9d3a8d4b8d40a00000000000000", "service": "00000000000000000000ffffbca62435", "pubKeyOperator": "963f1ae1eba2e5802c082abb1afe43c073ca86f6a9b1bc64a16b894640b4525daa58dce3d9c552aa175e05f56f84a83b", "votingAddress": "4V88qoSahxwKa3Y3r8fqtUXvMyW2", "isValid": true},{"proRegTxHash": "7ccf6225bb10c0db3b2964cb375027d4ab105cde00516302b7769e1be3c3208b", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0bc", "pubKeyOperator": "9424f4bfeff28f897e59ca7f9ef439c39ff444d9b5dc9197a6f3d1a9127e49e09a3c83491c496597c0c017d577410e55", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "0e22287f984866f9840ac7ee73ca9621a1e58bc2715467c7d86d3dec13b49b5b", "confirmedHash": "d9d8b021c1082a1f76c7ed3950dffdcd7e3a4b13020320ef0200000000000000", "service": "00000000000000000000ffff23ae3d7f", "pubKeyOperator": "8d0b146d056b8682e1142ddaa2923c6844a8128c4ed359845632c062ebf311d8b429c5aedf3472252cfe41b1b9c08537", "votingAddress": "4LJSgdfsBLQHBsFj9cPBBdWuXv4e", "isValid": true},{"proRegTxHash": "e2e2cb4cb49da8487639ec62cc2b7b6dae4a564d2a8a98f1cc4c51a40e49e4e4", "confirmedHash": "6dd5d1fbeffe7fc6bce49f6b211aa122a5c5c2e666963e0b0c00000000000000", "service": "00000000000000000000ffffd4186795", "pubKeyOperator": "95250437011019d5969299b5f727e3f2a61c6831eba6cce7273fbe51c45495543041c934e71461cddb124353bb7423f6", "votingAddress": "3bBVfTtfBFqVEoQ8KZfm1jkydbjv", "isValid": true},{"proRegTxHash": "a45341b7f6897088a763ca634a245db99e15a2e1c7aa476002bd346e45c4f627", "confirmedHash": "051b53482c37c7a2c952b7643015e51f96dd4df42d4afcb50600000000000000", "service": "00000000000000000000ffff98596904", "pubKeyOperator": "8614cae212b36a0218d1ebcdb2bd682a8eddd4a6e5e33ee7a7815aee9b1f009bf627b63f0194e0f2d14530144d83fadc", "votingAddress": "2DT75bFFGkPv6n5G12qkt5jL8tLE", "isValid": true},{"proRegTxHash": "798572d9040eb21054a8713e1726c963056c98025442c1c8e0d3320c21b16aaf", "confirmedHash": "f4bf489ab24824e05ce0195ed67c1838e2d3efb8a56fb0f61900000000000000", "service": "00000000000000000000ffffcebd145e", "pubKeyOperator": "88c1b96ae1de1c5bb4189b8404afe7726342f4f06fef707f8ee8752b2154a677aced08d6354eaead10a01bd30a30510c", "votingAddress": "3g7uidaivawpPZAF34amqZjo7yEP", "isValid": true},{"proRegTxHash": "63b07fdcb2776a76b900aa6f3731e0cad7146191ea363236c9f5b438761548b9", "confirmedHash": "af47b91d5e6ce3c0ee6b846630f6cecaedc27a09d5cd13661f00000000000000", "service": "00000000000000000000ffffadf93c0b", "pubKeyOperator": "06544fdfecc56016c4006f9db68b50e9f358113507af563b779bbd9c98770acca167070e68fa801392e0bb63085302bf", "votingAddress": "pA8Rrc29DPxbTc2EKaXqujGyg9d", "isValid": true},{"proRegTxHash": "b28ea985d1bef21e19d813b5d8a0d3af6483172cdf49570b90699b9ee039735d", "confirmedHash": "7f20729c0e154be68709cceb13e0c4bba3fc93baed9d49590c00000000000000", "service": "00000000000000000000ffff88f37389", "pubKeyOperator": "021a1d0c02cd64b524865611ebe1a64f574e010a059d52bc4dd1ea3a533c83920a03361dc7613ca1e77f5bc528c143b9", "votingAddress": "3QfFpQ8tS45ko3HfVWHwzh9wu3g6", "isValid": true},{"proRegTxHash": "4c8b2b3a3ea7b7136a692d8ba7796e35fcc241348d128227b68e35a6c40ab0b7", "confirmedHash": "2db16df27416abf699feeb09ce094ebcafc8834b97f9e2bd0100000000000000", "service": "00000000000000000000ffff14d02ed2", "pubKeyOperator": "85bf2ec43c031e6dff2aaea80261950b1946e6a66958dd7a104db58037f84db3656cad3a52473ad9e91b24e71b5fe2ac", "votingAddress": "PHdF888g4xWmqLdMbsdBdFjdRHD", "isValid": true},{"proRegTxHash": "6fa4518023afdc8cde042a1f736080455ea548e8233ae0f7bf81fc5c7942fe23", "confirmedHash": "a040f70d86919cf216e6f353b3534e7122524e5ed0f38b412800000000000000", "service": "00000000000000000000ffff50d1e1bc", "pubKeyOperator": "0e69ce091ce490c59b8ae7433e5619c547aeeb1b0f7cbb9741538997e561bc09f5071ffcc5e6815bb57ba0be5ab38290", "votingAddress": "2iJKWnVCUe3YKfnJzSAcS855V3ff", "isValid": true},{"proRegTxHash": "ed40ccbc606e06c2d7d44b3a46ba05f0157c8a2c33e989ff2cbed039694bd8b0", "confirmedHash": "0f33f6dc8abd0b0667b33ddfb22ca6fa426601e3780023a10b00000000000000", "service": "00000000000000000000ffffbc28e703", "pubKeyOperator": "8a2d0ffe84bad9f3bd378760adb04627e8d62423e64aa4ca333eedf4b63c1202a3b96c810426dcfde237441797b57b98", "votingAddress": "3eKDSuZZ2iqSHXxS8xkY1FGx7Puk", "isValid": true},{"proRegTxHash": "79d2fecd250caf359ae2bfa0d019d21df2c2433f42e361157c7238b44214a925", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96880b05", "pubKeyOperator": "921f01e290f762728cefed331e9c25ad3e60816d1e14fef902f70834408418077324c09ec683891d4ac7207c22aff2f8", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "8cefa6c3a812263bb18a6f910222b709797d40f6215ec32c7d3073c927c890b2", "confirmedHash": "aef6ce4203bc3d19e0ab00bf4f1ea1178ad5094bf30cb7052200000000000000", "service": "00000000000000000000ffff17e4e84c", "pubKeyOperator": "0efd93b586af7f7e5770085ffb7acbfbb1e405bb1a20f76e8dce797316d17e6b161d0e84c1743c9ea50bf7852b171aea", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "acfaf1f336a659b9f679ad9bd51372056c03305f435638b79f3bc1328c6ef5c2", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688b733", "pubKeyOperator": "0d013d8df9eb3a635d22455c5d830eee1afcc8a877cfd9b7812a5644e6a4a7fc90759a695a804238c7896f4516ba904e", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "8c09e857bc7d8533f00922604199ecbc8d96005d23b23736052b5c80c4e6ed20", "confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", "service": "00000000000000000000ffff453d6bfd", "pubKeyOperator": "0da4291303a580de7499d81e72fcbdd923a724c3d7c3d4c7d86362ca5acd8785101c282b40ef663c343d8e764726641a", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "9a626410f5d25b52ff599d0e0a9abb38f0c73cc01522bc8feee72c210a04bad3", "confirmedHash": "55e091faf587d8cc457c5d91d1b8a7e4b1890c2c3ae9bddd0300000000000000", "service": "00000000000000000000ffff7bc140a6", "pubKeyOperator": "088dbb700890ba2af40bae1d4e8d174616ca7228bb18dcb969c7bd0ef13e93a18a4dd82bbdeb6251edc6be28c7f4db3f", "votingAddress": "43gPW4AYmgz2jrzrTKxUZqpaCg6C", "isValid": true},{"proRegTxHash": "c1aac3b1edc3b8191bc5e7cce6232cef3c3b0d5a97affaa6312dfc2d0c30e6c4", "confirmedHash": "b569c8ee47629d8f158aa8411fa92d0d66c02daa5dd3ba620200000000000000", "service": "00000000000000000000ffff03f81ef0", "pubKeyOperator": "04d54d147a3ec210a9ef4ddb6d1b78487362871ca14b17d70588b04ac85807da55d7443e807674b29fe5591c50154b8d", "votingAddress": "3KAF2Uy6mc73gTEeYeRTJNQXNm12", "isValid": false},{"proRegTxHash": "9e67c22c10a93db1493ce00537ba99b6aacae2902e4e62c6d8f81ec7aadd0c9f", "confirmedHash": "94357db17459022dd2ba43832186000e3a67c542801781e30800000000000000", "service": "00000000000000000000ffff05b5ca11", "pubKeyOperator": "1932f4e5772e7afb06fae86a39f694e77144fc3b825422c523a1ff574189212ab4ec03a98cee6bda7aea2754fa5a40b2", "votingAddress": "gx9Q7TEpJgcTbShr33f45YF7RqG", "isValid": true},{"proRegTxHash": "e84646026ea058e229954d7766d27a68ef260e6422aa91af3b7431bfb94e8f01", "confirmedHash": "477a71877adb59bc0cd9fea935496b58e7b62de825b3abab1700000000000000", "service": "00000000000000000000ffff2e1ebd19", "pubKeyOperator": "90908933bd97769966d74a7a85fad9ce894ec6dd943b71678a2ec87a155a9a0a390707e64d384a6452fe478771262504", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "c0b021b48d70b1a94beba0280ef556728c04a97318db77a6ab3f1d4c976c9307", "confirmedHash": "020997aa670986188924bea1410bf2cace5880fce18b98fc1900000000000000", "service": "00000000000000000000ffff33c35b07", "pubKeyOperator": "8b140a0cc9bce087c3e79eac1ba80c38f8d0b6e7543de276b51def0bb7965a6eea266564b6cf9aea4f8c7a2f5e3844cb", "votingAddress": "bfwQrPZsWX83WZoPCRgWLEs7MF8", "isValid": true},{"proRegTxHash": "527277f0cc8cd5ca95c8ac0a051ea9b4d5d902c95ae6be76b39996244a7c3f52", "confirmedHash": "fe096963ac6afafdecadf238e470fcb612534d52ef43c3671000000000000000", "service": "00000000000000000000ffff2d4c59ee", "pubKeyOperator": "0f6581f3302a9a03f2723aef76e376847562f8965797609ea2d16cb8b2f6bdc544f03bc6a9ba3dbd307903cb29f53ee1", "votingAddress": "227Eon8NGrSwnEA3c8vcAQ1AYUMz", "isValid": true},{"proRegTxHash": "92a478b7b9b5ac75b240bca086e673e1943cdaded82662502a768b6045138f38", "confirmedHash": "2b920610d29a8c71bea4235a0972279eec843c02dad91cc30700000000000000", "service": "00000000000000000000ffffbc2815e8", "pubKeyOperator": "99c2216a5682c8270e8d18042d775bfdcbe1a740ba00a48df45c5e7969fa6db36ba570cd99553fff265d3843fdf7625c", "votingAddress": "Dbqgxc9LgHHvvKCJR3WvqjXuice", "isValid": true},{"proRegTxHash": "5ed1869b180cf705599b93eddbe400943304676757a2b9fd1f6ced90780486b4", "confirmedHash": "663e48a0c3034568ea898380ba313e2d9046e51f5ca41b240900000000000000", "service": "00000000000000000000ffff80c73a1a", "pubKeyOperator": "07209331a05a461ab486cc6b5acc8f99eabbfbdc0bfdac93e2c79b2dc681b8a6770fbcc967ea1cade250dbf15854814b", "votingAddress": "yArQbnVFfN4xeDnZWTri7Jyvvkg", "isValid": true},{"proRegTxHash": "7fa6eac12366390f6a4dc497cee62f796363d8541b01964f62457b9d44cb0b0c", "confirmedHash": "cb6b8b5cf5be300920fd2c39f8f6215c22f34b55148c46351500000000000000", "service": "00000000000000000000ffff2e04a266", "pubKeyOperator": "8ceca4ef8b52fb6cb9f356c0b234e84aac925457ea7e922bf5256b2226c3e9cb42720f0cedcfe36b10cfc4d538c5e345", "votingAddress": "2cwUL9corjtmeQdotHjYsAesdDu9", "isValid": true},{"proRegTxHash": "7adb6d135814a57634924e392587fcb494f7de8aa5ae89eb38c4621faab30ee2", "confirmedHash": "083f69e510e7b9d047b788db292f6f0dffc5110edb5828ee0200000000000000", "service": "00000000000000000000ffffa877578f", "pubKeyOperator": "01b3a8a2639257027a59be8d5290e20233e36ec6dd0f5fac51d75eca9f58a60954651c041341273e4d3cdd5b0fc785ea", "votingAddress": "3xRgbHj5F68SETTNdLbsV7QRo8To", "isValid": true},{"proRegTxHash": "b20860dec6f7f3fa8783fad1963f46e52e0c99e23e6a915d804ba7fb47f92cee", "confirmedHash": "4cdd3333e9d7fff1e7797ca9c6b5ab4ae2b72ad8294b108a0700000000000000", "service": "00000000000000000000ffff8f6ebf87", "pubKeyOperator": "111739137a8c124cc564d21f57908dabf1e04de2a14afe607b3c4244d1c8a00a5e959eb40764023d74d856b213866dec", "votingAddress": "42scbhBSTd5GU64GgTMmr4xP1AWA", "isValid": true},{"proRegTxHash": "9cc96d04a055730f14d927b22ded033e4eb17a26222eb6d4530b17dd6bd815ea", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0df", "pubKeyOperator": "02147da4662a69100c4687425a2778400ca518c0d68f787b2b646692ba37ed7dd7c15650ac07307d3fffa309cf2facaa", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "93d4f56bc5389f499a84ac196fab1bed84dc22f2b6bd58153e9a846e13d77e5a", "confirmedHash": "08540ff0c09bce8d2f577a0051a7dee96a87c5f14688a4ba3e00000000000000", "service": "00000000000000000000ffffc2875248", "pubKeyOperator": "98f7a1a04f247db7bcc84bd0241614c2e7525d9ab4643e44dd8fb8a2fa8cbad4adc742a9f38311e3d7a5010f00b1261a", "votingAddress": "zCnVyZkJx4Nbp2ieqKLvPLXdeNY", "isValid": true},{"proRegTxHash": "4990ba72cb94dd8f262cc7a5038a34dd5f6e06f1d0772d35ec8f3ddd34c499c2", "confirmedHash": "751266519683a79ca791eccdc587a5c108aebda8f3ba62f70d00000000000000", "service": "00000000000000000000ffff2d4db93e", "pubKeyOperator": "10d7c7ec4784397f375b856d12d19de6d0295fd251f29657531b905998bf9b796b09ee9e78120e107dabc8f16af25e53", "votingAddress": "2FXPUAc1peqPJRgWbbp6LpN4avTA", "isValid": false},{"proRegTxHash": "183f20fe7111a961a68ac7a008f5113f7ab17a18a72dd6300323242b788c0cc6", "confirmedHash": "47930554e5bb3de32a1491ab4af492fb4f53dbf2fdf961590c00000000000000", "service": "00000000000000000000ffffa8775001", "pubKeyOperator": "88d5436c56b01b7c44c4b15674badc3993927e316e1ef516a733bf8d53612bed7d14162519df0b6a3ce5d27487568444", "votingAddress": "LDCWCph8SFMUj6zLEKj5qjZfTQM", "isValid": true},{"proRegTxHash": "832c1f35c975d1fd84be526438287a0e15a0d98d3509c65669955f7307a67c8a", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688b34c", "pubKeyOperator": "855abc96cd5f5083eb345d812fcafa0d671d4f62bd3af21f70230d34401560950464ed07560393aa4dbe6d6808706f13", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "c7a9da428d0a35acb099b391ae16b89fb476bce2ab65197992957810cae49da4", "confirmedHash": "741f1fcb39adb524db7569e5d3392314d45dd3772e37dc9c0700000000000000", "service": "00000000000000000000ffff86d1b77b", "pubKeyOperator": "8daa6657c46359986cf86576c85e11e6625e361d2296bccc9e3791ee56311006d2ec88a0f8ede0b96333357efe11063f", "votingAddress": "PPSgQyRorSK7ahiu8AYp8QfdBvd", "isValid": true},{"proRegTxHash": "e1cfb56d0fa5eb5d26c852464ca8d4fea196911316c64402fd78b55f545791bf", "confirmedHash": "1ac13b6abf4405006a58d05aff36433a8e4203910171970a0600000000000000", "service": "00000000000000000000ffff2d20a2e5", "pubKeyOperator": "8b95b261e894469a04dba34f008a5fedfadb768ca5b861b2c0ea2da0bb301c5391d09966e7d07a82b8b2b2f1f41d5ea8", "votingAddress": "2V9RuWffpWyMuKi6XPkXd625VHpA", "isValid": true},{"proRegTxHash": "bb3fae201193ac1ee4f6491545351ac63894c84b0a585fdcf0fe13748cb4d7a5", "confirmedHash": "710559b6a9e0f5222af0758ff0b58cba3d33fff34dc293001e00000000000000", "service": "00000000000000000000ffffc2875c4f", "pubKeyOperator": "01342f4e06ec0a9af80eab0e000d4985757a00350d23c53ab04e53113191905dfeb69ba4c2978d645f7dfc9283c1ec72", "votingAddress": "4PT6qbYzLSNfqm4WRTfEmQXqXcke", "isValid": true},{"proRegTxHash": "08e690fc01befeb03da3c629120f7d4195527d666f277f7eb23d5bb2574bbe27", "confirmedHash": "99f081e28074e9ebe5b90250e69017a251b3ce74ddf3a12c0c00000000000000", "service": "00000000000000000000ffff6c3da981", "pubKeyOperator": "8b58e1cae888a64a6ec0f999b49a8595b6b469e13819ca7efb104005ff77cfa3bc687fd82be07dcb3debfe7dada1c935", "votingAddress": "32wenCjG5yKfCbadXWR5TbWPKRgD", "isValid": true},{"proRegTxHash": "acafa57859c9bef3f843a7047ffc7ba9d0f26615b707c031bab5ecf004646532", "confirmedHash": "0c685c8c35c653fbef53de6b97af1085fe0e01dca66531660100000000000000", "service": "00000000000000000000ffffbc2815f1", "pubKeyOperator": "88b9eb49c9f971a529312c127cb0367e80e7c549510771faa35fdd31777bbce1c185dc78b0b80114f2365213fa968c7c", "votingAddress": "2ZBeFBaq9PGaUCbFK5tp4conzxB5", "isValid": true},{"proRegTxHash": "d4b09904c9f89cbf9067fa558b57e9dd2195e5d6c40269f02d53861171045bf3", "confirmedHash": "80494b9a7b0699e7713b8878c59610d2c9a811a93896c8262900000000000000", "service": "00000000000000000000ffff2d20b81d", "pubKeyOperator": "904effe5d2e320f8f2143295c973ed4c384d71e07c428c50f5f0ac6f1b7fbb94c906d349713423c210325fa312a9494f", "votingAddress": "oNoBBJHQA9pQSFLLbw3zbHDuYs5", "isValid": false},{"proRegTxHash": "50ce931299a70a701b387af9fa16f6c5c591648706f436705d189aefdaa1215c", "confirmedHash": "9edae6e1e5077893a1c73242819f13bc23f3e51e74cd3ac80c00000000000000", "service": "00000000000000000000ffffa763b78c", "pubKeyOperator": "80a77ea8638391e40396a4b898d0debefef5487ed555640951d599e50dfb0678a98fc07e0147356b2ef0ff2e3ffb587c", "votingAddress": "CkXZxyuiXBazmpr8ysJ3fknRoww", "isValid": false},{"proRegTxHash": "9c49a61d7d271a5f6f1a799339adb31b92ed4935ce42f2b512a9f82ca842072d", "confirmedHash": "9150b583afdc35454426fdee6afd8aded622421e127fdbd61300000000000000", "service": "00000000000000000000ffffd4186c9e", "pubKeyOperator": "8606c4f9d1142896a625390b1716aa47ba42127c99d89c391cf0298db1ebc141b9a4a33acde1c16ea940a2c00d900745", "votingAddress": "3nU114wMxeSyvTgMXPCJsMztTPN1", "isValid": true},{"proRegTxHash": "cf18bb4eff04ba1af5d6003cf0eb489e39f10dd674222e6c7c65a4cc76309aba", "confirmedHash": "9dd1af2f2d2acd280bf13812f6c2b8499a702b9a8bced7260c00000000000000", "service": "00000000000000000000ffff951c4ce9", "pubKeyOperator": "0dc9614c2e85bd43c1501d61eac50b42ab0de6858d4caa52a8c63e9ea8124c0300e5c7b351c3d160cce94a19be05996a", "votingAddress": "FTZojTkmRyqf6F5pg4DA1bbWpkp", "isValid": true},{"proRegTxHash": "6aeaa874d8cad16a404136df7c2f9179d40348bc846a1a105f0c3026c4191062", "confirmedHash": "2912e274a985d65dbda317c83c86d3d5da84a6ecc837b1190300000000000000", "service": "00000000000000000000ffff14c7bbb7", "pubKeyOperator": "915f355ad71bd99c646df3e62662e5071750971f91e771ddf2438bd4579dbdaba80358b9f0566632d6c8c495696bf932", "votingAddress": "4CH5Ccv6wuXQMHY9aoSv5fnrMAmi", "isValid": true},{"proRegTxHash": "18cf3d59113c3e29fe9a044ade3a6efcbee94b25742b1f4d75c59700d2a6bb7b", "confirmedHash": "0f07293743ffccdd1bbdfda2bf273ed2ceb2f62d7a6eb2160e00000000000000", "service": "00000000000000000000ffff453d6bde", "pubKeyOperator": "13e63365465ef3c4fab41da760892f8164f767d27a3df4e44d1470704b43ef2586c32ef36de555638df0f09f890d0d62", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "95ef3ae3e190f4ce02f9f5018a778ca318fb2ced963efea90fcebdcadbcfb230", "confirmedHash": "159d6c679927f79aca6561e0d43e0edd42b592cc3d3cf0b42100000000000000", "service": "00000000000000000000ffff052d6ba8", "pubKeyOperator": "1593087a0740ab5a449f48ba14a64ea2c69b5955bd49d18171f27bf3efab1c054c4b2555a3a5e227a5c9a2968e09a189", "votingAddress": "g9UyZHtWmm6epavCdnnep3Xuh9q", "isValid": true},{"proRegTxHash": "efbb35622871c689c528ec7d8924b6b6d8f9476c81542e59f6a8e76176b8e7ec", "confirmedHash": "ce947f47495edf68202ecc7e18f5c08d7b8d5bd7bccc550c1f00000000000000", "service": "00000000000000000000ffff36557797", "pubKeyOperator": "8ca7edc3702c0d85b68a54f6a5ab29373611cfc533b926e2fd3333b10f12d2e858433f4a5977c8afc5b1a7fb1c58801f", "votingAddress": "3b4N4HYe33yUV3gbH5Sng31RZDq2", "isValid": true},{"proRegTxHash": "fecc44f34dded06573d4d9ee79d74e31e64199a711a73db987b5bf0658a49eed", "confirmedHash": "66534ad2921b399e55c6b1414ad4c2e926e794567964d1ed0c00000000000000", "service": "00000000000000000000ffff17582865", "pubKeyOperator": "170425aeb69290d2aa84ede41255efcedaccb87d3861ded9ab32faabb8c7207159fbe2899f07a8a0f8aae3fdde083a11", "votingAddress": "3GoFyC4ZjvMyXutjoH1yemZagbdD", "isValid": true},{"proRegTxHash": "3471141cc407b5e417b024a7f02c28cfe0b4dc98510d2ad958353737fbaea876", "confirmedHash": "b4c7f4880fcca0200ef9d50e9068a5ab43256900c7f54ec40300000000000000", "service": "00000000000000000000ffff88f31dd8", "pubKeyOperator": "93706c75a4a02f6fbaa1e3c361b4d9f570cfef0bdbd20a23cc0e2b14cdce4c040c0e926e19ee4c4185b855d85795ebdf", "votingAddress": "2sq8BCFNbxsK23vPCwzyC4hm4xdc", "isValid": true},{"proRegTxHash": "2a21d306c4c4309a4fd839487ce36645ed06705ad9877700e562c601264e888d", "confirmedHash": "feeac88e40847ee1da5b04463bdd26de999f47adaa768ec70100000000000000", "service": "00000000000000000000ffff5fd8ff45", "pubKeyOperator": "9780c17b0520daf7fd8fbfa14511d70d4490a2835db916d8de573e4cfa0b4095d23286593ea93ae0a21c993b90d66a50", "votingAddress": "smhHvDVYUgtiyo1qbvyeoUKC4HT", "isValid": true},{"proRegTxHash": "3816b3543f2d6c4d99f133737876a018dff7ff80817bc0bc1a279ea6725ca539", "confirmedHash": "cfe210da8d7c3a5801390e79cc2f54382d291b89b5e8a32e1300000000000000", "service": "00000000000000000000ffffbc28b98f", "pubKeyOperator": "83be8c255835d66ec58fadfac3a6cabd4c400973650e46d0d0c4434788b63f4c1ef74db64605699191e440c76001c1e1", "votingAddress": "LzGT17ne8ggBZaaLrxMXCkfvJSo", "isValid": true},{"proRegTxHash": "96d1eb2f0f3e74da5f283e896211d17911fc11e8a16ac5b73c2c81f11a911a81", "confirmedHash": "252649e5b9be0b57ee08e09025bcd6235d4986f1fa23050d1100000000000000", "service": "00000000000000000000ffffb23febc4", "pubKeyOperator": "85d94b0d3dfa98255b55ec2f4cd044cf3ae8ef1762577d8aa9b4afa1c6fb10bc10343c381d77a9b94e7fd4b96d0e8140", "votingAddress": "j8sLPjKNKMDBGft5CqciTLpo5za", "isValid": true},{"proRegTxHash": "ecbdd14b71655bc4b8640dcdc67c2c2b9922033d8bbf958c99b443d3e82b2655", "confirmedHash": "31906c52ba237fb114c3780eceaa77e0bee1d4a52e8cb5010f00000000000000", "service": "00000000000000000000ffff55d1f244", "pubKeyOperator": "15268cc721082ee6e26ddc8fda8cb9d784f9a3e243fabcb18d6b9ea203bb81a6a19d7852e6f976f74345221b889a50cc", "votingAddress": "36fcwygfnJAHoCihWeH7NhgA9tni", "isValid": false},{"proRegTxHash": "0fadadecd1f391580dc23a05d1201d443b16503beb3e4630cdc3ba473f92cd1d", "confirmedHash": "72ace0b4126462c51bef0e2c304514cc5de0e82459150a9d0b00000000000000", "service": "00000000000000000000ffff2d557572", "pubKeyOperator": "864236fab08dc2483a437869930591ad8f3813d588bd85e1d64c28d0217b881344ebc9a394ba63d24908cfbd1501c9c4", "votingAddress": "QfHKcdJYcZduLsCgNYgxEdeL3pB", "isValid": true},{"proRegTxHash": "b749c443ab0f64f158b6b16cee79a3d39083c8345f8305b68d05b297c789c212", "confirmedHash": "fb1921fe3c188a5b13a156613a98bb072aa411f3edbb43b90500000000000000", "service": "00000000000000000000ffff55d1f289", "pubKeyOperator": "82d03091f1210303f63629eeb7f698e8c5fdf6f59ac600d648b52c74ead39ca3223e68827dd1d280082cdb6d3c7367bb", "votingAddress": "2YHQAGdC6tHS3ShcPF4nx3NNtUYu", "isValid": false},{"proRegTxHash": "ff0dbe05e73bde46cd905054ef0db63ee0c2cf84ad323695961eb6519c906055", "confirmedHash": "aa0a4c59daf86f7808ceaa003d923d6da6ec63ad5c01c2f20900000000000000", "service": "00000000000000000000ffff5fd86d88", "pubKeyOperator": "1560709717e114e9904c5bad932ae9c0c3f873bd745c4fcc2291b6034746d12e1ee8da90cf30fd8deb7e3bc9f85e96d7", "votingAddress": "tCLMvoaqLWsQNpbkApiC6daEzCA", "isValid": true},{"proRegTxHash": "b2d3e8dea42b9c8331472962bb36dea7b684b0f6dc8f5869c80fc24936199a04", "confirmedHash": "3bfebb11f7c1f49fbedfa5eba3669111628f897ac5a397672400000000000000", "service": "00000000000000000000ffff34039462", "pubKeyOperator": "934e4e541c310c2d17df7b48040d6ae9446fab9530abcbebdd1b46d847a5b4f8898057060143436dc7003e1e6fd9bf45", "votingAddress": "2oH6Tg9eMSyTE5gxZqikqYB1rbfJ", "isValid": true},{"proRegTxHash": "2ecd83631d213c06ba70c126ccf82f4b9c8e7b43ba9ec89ce1f3ebdc0a36d47d", "confirmedHash": "f536336aca5420ad5f4c2e4f28732ef763839f8dc3c512a90d00000000000000", "service": "00000000000000000000ffff5fd3c422", "pubKeyOperator": "1704c4823632b0c810789f8ddecccc49492a73b499036ac972358d2d68983fa716b7f4a6407ffc465334d172b5d222b2", "votingAddress": "q1uEPcU3aaxcV99boYwrvNWZJKH", "isValid": true},{"proRegTxHash": "87c4461b9854d69b2575c0d8d7034ea98df350929cc5b7a1d9262df3666cee53", "confirmedHash": "aef6ce4203bc3d19e0ab00bf4f1ea1178ad5094bf30cb7052200000000000000", "service": "00000000000000000000ffff2e1ebd15", "pubKeyOperator": "962a9e9ea0437968f1514f8267d6185062b0de15009fe812f70d38f8f24bd6e3e23ae4f8f215bf4c8a4ee1ef951f5997", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "032c960716bbf1413bd892e947dd799190e523bb491af38122635782b85b11d7", "confirmedHash": "56ab17fa8c69944aa79cce50ddff5df8ddcb2371c855e11d1800000000000000", "service": "00000000000000000000ffffc2875f71", "pubKeyOperator": "0501066d8d2535899ce4eae83e5836d8996ebe7fa72b998da0b603e66cf3a332865d5b4218d4d4aa1eb709b73bfaf055", "votingAddress": "3rsmNobPpM1XnsnLFbvE5tQEf8tD", "isValid": true},{"proRegTxHash": "5415712ad19d7987b261b7b56e677cc3f2b80e230a7bc1a213f3f258e12b22ea", "confirmedHash": "751418276ee74c7516c64ca83c7893cbba7efa2237ef5c970700000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "37jhVdmza5ta4cnbZTqi4kX1QWPY", "isValid": false},{"proRegTxHash": "3a5c586c0fdff96063c0e2078dccd0f03960a1ccab8aa6a42417660f309d82f8", "confirmedHash": "c1ec7a2720821ab6952c9785b30cc79a8c2df7cd52d490901700000000000000", "service": "00000000000000000000ffff453d6be7", "pubKeyOperator": "08fcd86f63506de6087315e04d685d32cd2ec79e79fc4194702dadbb9cf3efa1d8069b3e10ed44280355443f02ac7fb4", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "562876316e3128a22110a46286bc69821e50a26d9c8c0d480b2694006662a9fa", "confirmedHash": "99cf86a2b6d76eb9683b3b8a5a1ef15eaabbcdef1df82df81000000000000000", "service": "00000000000000000000ffff33264090", "pubKeyOperator": "19f40e9ad2cd64e81b3c4a5cae64d58ff5a14be8c92b2f4cd69eb014761b711c464a120356ca04c8e7160a375c624b9e", "votingAddress": "2wfbGWc3Xvf7NMVW8nqt7GTa9vjp", "isValid": true},{"proRegTxHash": "4ec3c8e648f212e02b15730b7cd1b399d0ff24277a0cde9acd32cf3d0240ab23", "confirmedHash": "89a5e884fe8b3c35a14bb699c14d6d7e4d19b50e2a7dbe2f2500000000000000", "service": "00000000000000000000ffff453d6bf2", "pubKeyOperator": "9241d87621c137b8f81433c78cf60423a6d370279fc80650de04d87f0010512fbc29143697b749924fe0c71ce8294a79", "votingAddress": "3ZEuzJP5u6ipTFYfDU4dj37BhPE6", "isValid": true},{"proRegTxHash": "30efafb42d93c11225a5811bd45a3d06b5b434baeeeac6796b59033bda6c72eb", "confirmedHash": "2a14acaf007c65c5e81e70378f250640766f748c1bc4612d0000000000000000", "service": "00000000000000000000ffff05b5ca13", "pubKeyOperator": "8c6b03f0e3a8cf81f25bedc1016daa4e5113e16024b152d05f2cacf227092cc41bdf1cb71e9bfd09432d00a8c8ad933a", "votingAddress": "3hyzpcLj9tatCNQhnTfSvQampjrB", "isValid": true},{"proRegTxHash": "67b509d3689fb1b5a6af30a8d56ad6465c1fd0f542dfc4df6827e77f34b766ef", "confirmedHash": "1b211235c3a6f158daf32dda315733ccf7505374eb82c1b31200000000000000", "service": "00000000000000000000ffff52d3199a", "pubKeyOperator": "90c9bd1a25505e49f23ae45376559461f51c96b10017d961f33c1f49649c212f47c119e972e30be14fceb1dab0d9b3ad", "votingAddress": "5KMuFvQNXpRWVxuVBSsJ2waDSgs", "isValid": true},{"proRegTxHash": "3717b5c3632c8003d3f7be987535f1a64fda1c0a47d3610b1572a9e7cd2cd51e", "confirmedHash": "473e7a4aa43d959619358cd90cce0827ef39ce6b985d1b4d1100000000000000", "service": "00000000000000000000ffff4f621bf4", "pubKeyOperator": "186826fece48f49313a34de368864a41b05cc07134e18ccdb488ebfe0e4c1c1ec527e129f4c438e88c4734e400c5ea03", "votingAddress": "2uKpkvp6x6PhMuLJCN11GbdBqHms", "isValid": true},{"proRegTxHash": "5a92a7e2d89ae8be4c5191765b67541c0f3f48bac6568f9b90848dae26913c80", "confirmedHash": "623ddffff4e8e1dd7e08e4e415254dbe174ba2a263692f8b1c00000000000000", "service": "00000000000000000000ffffc0f8b5df", "pubKeyOperator": "0c6fe1fc008af58db22b868d2b0302aa1f46b5833439fb53ca7a54ececfce437ee806418f636172fcdb2ed80864650a4", "votingAddress": "4MaR5VdzdgdfbKF1npFe8pvX3RoG", "isValid": true},{"proRegTxHash": "bdcdff4476fa726c176448ba0ad123d3049a0b542bb2b65805604e41a2b11fba", "confirmedHash": "b3f9b99a51b81b93b4249de0f1fce18ed0aa9aa7263563560a00000000000000", "service": "00000000000000000000ffff334fcf44", "pubKeyOperator": "95e8fbcef6f5275b3c6c0d4b1ba9630d438d21435d38e1a7cbc6d44dc36d44598c002632e0bf4ddc7cc63cfe13950969", "votingAddress": "1ZN3jabjZDvMYAhoCGHGQbpDgry", "isValid": true},{"proRegTxHash": "03d76b6fd27ee3818c186b4b377c89e0f23d2e4eba1bf0866197dedf33688a2e", "confirmedHash": "f938d7b65b1dabc9742b652c5d9bb7361e1d6d497a8442801f00000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "3W66M8GgUvCnLYe7bgn94WZpkXy1", "isValid": false},{"proRegTxHash": "a2dd5425fd5577c1c01ed0ae8221b8c4c0956cafb0bee1f91b63103e0f0715f9", "confirmedHash": "41caf6f971031a6bae14cfa3a1acb82f0e80696cb218d05a1d00000000000000", "service": "00000000000000000000ffffbca66a82", "pubKeyOperator": "120f721cab43774a50bfa47f7623b87ec0b430fe90fc942733fdf6d684a1341f963daf2ed719774dfca01bb4cd814575", "votingAddress": "3CRdqUVw2eJn7EwoZApXpPbNWbkA", "isValid": true},{"proRegTxHash": "76bc9e02f9d0ac7d988fd00abd037e138aaf97a3dc5a195f0150b763ddb612b2", "confirmedHash": "4f72923f38ede41adc77a8519b51900ada60bc6593b1788c0700000000000000", "service": "00000000000000000000ffff4f894754", "pubKeyOperator": "8c52702e2dd0cc2332d21ae4091c4d5d959d78d4304a296ff22cb4e4bd4c65d5a865679c4cae370b9b8b1d30948ef44e", "votingAddress": "2VnNPamwgMwv64p82Pd2PqZhJpse", "isValid": true},{"proRegTxHash": "76a44a4121bb1e43fc4373302c27ed8e2386864613710e4a363336d2b26264ba", "confirmedHash": "06b3b30a61682e2d1f11bd15b52df09c3f4e8b51d2bac3e10d00000000000000", "service": "00000000000000000000ffffb23e6ae7", "pubKeyOperator": "15921cfd46dd0335dbb1edebe4806f82399f3d98622c44b4b8901ad9150916a27e07a24618c05be7d2ca8c4794b77558", "votingAddress": "2GSkE7FGQjdv2rqnZgmcNHnx9pC4", "isValid": false},{"proRegTxHash": "fdccb394c86d82ddd85229f7c931a658bead9e237ff305dcb52d29ab477621b5", "confirmedHash": "773dbfab3bc3864dfd33cccdb6287a8ed07d9b9d2c662ce50a00000000000000", "service": "00000000000000000000ffff5fd86d83", "pubKeyOperator": "1766892617aa44a9a2d8bf267edf099bebccdc7e1aaaf44e0dc3c1e9de3c0a4cb214dc1848f456308b9bfeefd0c8c1cf", "votingAddress": "3Kigb5W9LCaoLDGYkEq4QN5itj5A", "isValid": true},{"proRegTxHash": "5a8b22d542a45b2d36edb3c09798df5219f417e399c2b073948f734552dc990e", "confirmedHash": "9fd8650f3baa8ef3938d7a45a2ce5b96b5fe3baf5ac357870a00000000000000", "service": "00000000000000000000ffff55d1f1f3", "pubKeyOperator": "916a3931740ab4aee86889c43af2f96eab9c1fd02c8c1a411201ee1661a6f66944711d4620b4f5211ea1f890b92713cd", "votingAddress": "3ws7fR1xkECuqr8PGqsdBANCZpd2", "isValid": false},{"proRegTxHash": "bdaab61d9203a6e8acbb4e1b5c8db8461aacbfce878a34214d8aacf0a514e8c7", "confirmedHash": "062f1ca4df9ba56eddb5019999a770296c76bea1ac81d2fb2f00000000000000", "service": "00000000000000000000ffff5fd88e4f", "pubKeyOperator": "86d655c7ef98fcb277c4b5a2fae2d704f41f4c7fe3954bdf6f65ab09815377f1bee1703b85f1f40655a91882ae86793a", "votingAddress": "AwkRmMqpsedjtreUnfta2zRCJ17", "isValid": true},{"proRegTxHash": "8d28fd9dfe89009da17c9d24d35568ef1a033773e53fdde9213bbba22fe8c8d0", "confirmedHash": "443b013ce16375bdb5df6bd6380a3c42ce54a305ad4704d50100000000000000", "service": "00000000000000000000ffffb94068de", "pubKeyOperator": "0c8695a5c73ad1e6aace39970c16064275460631879833fe5a39f9ba23f17c6c79277cb304b9b56325568c6e628ee7e5", "votingAddress": "3oMFWSb6KTDjSJQ6SQuWwBEdEpcW", "isValid": false},{"proRegTxHash": "03e5cb5ad662e9f98b8d114cdf7e3b14148bd468b5cdcad28a2f7612300ebcba", "confirmedHash": "9a14ce8ae438e50bab6410c645122e2efc9ddd186d5ec9c31200000000000000", "service": "00000000000000000000ffffa1234826", "pubKeyOperator": "999d43dfcc43333f9c1cef2df7bd60a92198b63f2e3fc0d1e683853227ae5223e2d9456fb2178eb53dc54dc1f3649d04", "votingAddress": "2YqFab7H1zFWJG41cqLwJYH1HtK", "isValid": true},{"proRegTxHash": "86075908ebbc00da03cdd14b337c3a7bef27e90853c5bf62903075e7b1198095", "confirmedHash": "9349e41f8d2a3694f3cd78d668e75544fe476e9681d7d1fc3200000000000000", "service": "00000000000000000000ffffc2a3bb28", "pubKeyOperator": "1121049c0a682381f89230e7b9e0254967e54079f7b21343948e83979d6470c3dc1147f27486048aad1ba31aadc0b036", "votingAddress": "2usfWEbFYYerJMNqpBxby7YiyqdA", "isValid": true},{"proRegTxHash": "cd8d1509ec1e449687a98957bf33165d0dbb7e56c3df0a8ebb1b2e0e4811636f", "confirmedHash": "6d37ff4e931275a5dea5b6e4d9aa11456f5e02ae7b9d8e173000000000000000", "service": "00000000000000000000ffffc2875dd7", "pubKeyOperator": "0f396fa4c452d8c6eb1eb993bdea8af98f96c65bf0cc37ef5048c895af4e89aa8babaa95111157a0d0aaefe1809282a1", "votingAddress": "2Xo3TLkW4VEpUFbK2sfzJznzkcEH", "isValid": true},{"proRegTxHash": "c18a0d4a475e6dd83835e23327966f32c7319bc9f488e5d0abc8bf7a29dc8b08", "confirmedHash": "7e993ba36783c1b5b07333fb0ab03ac2fa1d4e17d8cf11401700000000000000", "service": "00000000000000000000ffff5fd85422", "pubKeyOperator": "008df8d312d282e65f5d803add748676e6b6024e6b9801e775a2ab42c7123f228094dd08adab86095adf7c6ea75a33d7", "votingAddress": "hQR3bJUJ8PabNcFttdsQxMTvuMS", "isValid": true},{"proRegTxHash": "b1a8dd5c1e3c75d519db0fce42534d014c56a9246fe864a6434918aa8a27c4d8", "confirmedHash": "5703b38c4d7a118f71c837a9c9d805f9f8f851ba15cf59510a00000000000000", "service": "00000000000000000000ffffbc28b841", "pubKeyOperator": "8ead062a742da3d2322a6a3ed20be25ecbb32545787eacdefb8e6502c95a911df13ac8399fe3ef0090cafdaa76af1129", "votingAddress": "2EZf8rfETJCTGtCoHN6TfXGakREb", "isValid": true},{"proRegTxHash": "914aa40641af1f34f5020092c2e70affed6ca20f71575c495f55b14067a035b4", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffffc17a8f71", "pubKeyOperator": "872555ed85005bc922968bfec3b7fa517535dd6c6546476c154837a27d1fde771dc9b686854e536ad9f962d9de546649", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "38570f54b36e8b4d5649054be31b62875c0c26a23417b72f3e467f602f70800a", "confirmedHash": "f52c681728e1bd0df02403be017466731a92ea52f0e1589b1200000000000000", "service": "00000000000000000000ffff8b3b1d27", "pubKeyOperator": "0c62a241647ffe7be4203e45588854e294994166538bb97b4a6b856c33996a81c3cb91e70ffb57418ece7e1c1ab91b93", "votingAddress": "2F4Wdi81ap3UPdeiEbYgkuKk2Pi9", "isValid": true},{"proRegTxHash": "5f51d8ffdd514eb877441315d8214d2bf10462287eb5787b1c1259062eb0b83f", "confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", "service": "00000000000000000000ffff87b558c7", "pubKeyOperator": "01820a16bce71b2374f71384f29dd4e445adcb99e7e48ed75333a7b7441fc60137c240be087b3d7b660cfd3d5f9dfd4e", "votingAddress": "3hBn7JYp6uy2DkB2vnLT1PD6EjnH", "isValid": false},{"proRegTxHash": "e90b44c8ae2732aa69fd8387d9096ddc49576dcf10d0bad0a1fb668722ed097a", "confirmedHash": "16393b0bdacfa0a283573a23e689a1a1908edba646460d540200000000000000", "service": "00000000000000000000ffff8bb48d0b", "pubKeyOperator": "03b810b5fe540ac892498eee075e3e36467322999175ae81ccf7c863f90310ea3a1bd4f5fcf0536aca87f03f5335c66f", "votingAddress": "1bgQhZZ29FF1YuSQ7iGTqZDUpDB", "isValid": true},{"proRegTxHash": "910348b04a10fe0aeeff2719dbeed5c3c8d679fd4e8281e2f7f2fe21a388d9fc", "confirmedHash": "6efe41cdab92192d89429c5478030b6e3daa91b1bc61b4910600000000000000", "service": "00000000000000000000ffffd161a061", "pubKeyOperator": "07b044b5d048e038461bc96d7d27aaf7c6bd907da81ebb1c4a25bb947944913e7f14c1925b4c287061929ae50b77dde4", "votingAddress": "26tyuuD1dgtzMieUUzNaT4gFg5Tv", "isValid": true},{"proRegTxHash": "318d1155ae542954c4127524ead72324dd29f1033434d6124dc2b1dadf230233", "confirmedHash": "5d06bf055e70c9cb02728d5cbe8c5e2f7179e4748d56011c1400000000000000", "service": "00000000000000000000ffff8d5f3625", "pubKeyOperator": "8469d3d6096ddc26637d5487382ca41bc535d11203514dff3556d94efda9591cd6349e38630e3cd8893ef44e2386cda0", "votingAddress": "GyE7db7evuvfYTcypvyMTMGzpp8", "isValid": true},{"proRegTxHash": "a0435de50b59f7b04e167ab2b3f3e5c1a039703575b6d7d1b60845c291de896f", "confirmedHash": "413fcf7d45d2eb7a7d7e70e34b61972da362bee0c22b13cb0e00000000000000", "service": "00000000000000000000ffff3eabbe8c", "pubKeyOperator": "810a58b0aaa29a78d673ee65299ad3a267d88efeffd93f1b314502303a9cfea44c5cd86fa539f24afe33f948923063b3", "votingAddress": "qNfW7646z7gakYaApuE1owdQ8sQ", "isValid": true},{"proRegTxHash": "77476fd1846d5ac18d0308da3cc5f1fe8d3ebc0ec76b0bb285535fff571c993e", "confirmedHash": "77fc33252e0c313724bc1b8cb41103a0bb16125aacff11c22000000000000000", "service": "00000000000000000000ffff2e04d9f7", "pubKeyOperator": "838f0d9d3c3ed05b49a19ba5141ddf1e67d8188f3b63101c97d413dfb8675268c41561a04a15c3e9e7834769e68626e3", "votingAddress": "AJoDvb9Ln5VRr1hDgpQaFTj7rQ4", "isValid": true},{"proRegTxHash": "3abd7c735401e43d9e9a0ad40ef420225ca984caa98f96f375d141cf82fb2d69", "confirmedHash": "6821a4b4231f907b3d34f38bc3018d056bf60dab6f110c141800000000000000", "service": "00000000000000000000ffffa8775313", "pubKeyOperator": "07953996505b6b9a0abc839585f3a467f1fc4de30e39db193744c66f43d2edaac8d04509c88c2b20a831645f46e0b7c7", "votingAddress": "2EcYbswQ4XDmhofUcH2v7BEEafwj", "isValid": true},{"proRegTxHash": "c318cf6984a4edb4bcdce588284c7e058cf52d8b8f52a80186aa0c182a50d4ac", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96884ecb", "pubKeyOperator": "03a09e975f6d4a5b214b5b3778cb680dc1b8ca66fa926ed69a133638998c6a4aee3e7c2b6e75411d76f2bc5d60af07b5", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "9165203e6d4375397a0505081653b859049d9515fbef097d46ac7b73003e1721", "confirmedHash": "97d5e6de71b3a09ed93314db18339c1e69cff11c132045040800000000000000", "service": "00000000000000000000ffffc0f1e05d", "pubKeyOperator": "06751fce6e44b11cd84d31f8842f2f104d0a40b42654a62f0a245525280b4a6599714e2d4fcf59151adf99cb11456db3", "votingAddress": "EZw8iSQWkn74mzZgFXVCzCYk7Ww", "isValid": true},{"proRegTxHash": "ab7fbcfea1add2f13a5e0c8afdf0afcf516a9ebe5aa7777da1e09ee4d8cbeb00", "confirmedHash": "626c60b9606d99b89f28c7065461de8961b536394c526b680700000000000000", "service": "00000000000000000000ffffb07b39d6", "pubKeyOperator": "90cf782bf05ba0ccc65e098cfee09e4e2e6bb47c9bcbf2c275d39382e2390109165354cdaf011939facf709560aba56a", "votingAddress": "2KrvyDUWCJkTkWCP1Lojwyx9uhJA", "isValid": true},{"proRegTxHash": "f13ec28a4c50f48f2ed8c56fda1ec4a4ae915e2d682ee15ae52a51152655b439", "confirmedHash": "b3ee13734164ee6ecc081d91692d2a2dec5d03dd59ff171c1300000000000000", "service": "00000000000000000000ffff4e1f4071", "pubKeyOperator": "15cad8b86ce3e416e97c18945ef90202e4fb249c657d1e810d1500791b3660036f2ae9ea6bcbd4fb533bb23bcba09f07", "votingAddress": "3VW5NFRKxFVFznUev1gxhqD5PT66", "isValid": true},{"proRegTxHash": "617e643aa070031cb3ba5ff1b67366fe00c8d3e7a73cdca7a62280ec2146fc4d", "confirmedHash": "f81b002bfb781819e3cda2623aae1d1d0f63ebea4c3e81120700000000000000", "service": "00000000000000000000ffff55d1f1c6", "pubKeyOperator": "02a30458526be178e80dd1c8693764a9c38b0c4f796ba6a81f5a55add8c601b701ce5f19f48fadffb91a0604f672a8ec", "votingAddress": "bqwBKteCccjwK4DmkAMdmTt2BPj", "isValid": true},{"proRegTxHash": "24baed676659776c809b798465ad85a663de5c98fd7ac1e22fa5ace36bd642a9", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff8491c80a", "pubKeyOperator": "9401e203c7956ea0d8d515c27e8308cf3fa057574842c4d9a0f585ff4985b0199455ce331f374ae23f817fa7e2e26730", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "3d197640cb94f383ef08bb4111cad9c777958d214d86297e3b187c9327b5c972", "confirmedHash": "356cd1ffc13ea167b56a81a1a552d79e2fe780cad28c92721100000000000000", "service": "00000000000000000000ffff2f6ea5b1", "pubKeyOperator": "18b87296a7085b457e57daf87f450a0373ef2c50844099ca33500a52ddf274bc84608652be9a5efb42d24d395825b0b2", "votingAddress": "2WBVs82n4CQnJ9NEZ1RqpgK9PHkS", "isValid": false},{"proRegTxHash": "3e8f714bf03db3a6e9746b42e991eb39d190409569d65a38122e983258c530aa", "confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", "service": "00000000000000000000ffff55d1f269", "pubKeyOperator": "9111d7ca5b82cc2bdfe2ce1156a661a697d92bb5fa49c83e3fb7d9bf2bb43710788a0db59b855a5145df8325d02ce9f0", "votingAddress": "CaBkh3RTbqyC5hLfRXEU48yiVbV", "isValid": false},{"proRegTxHash": "a714713a83a4c74cee6f189f293fb9bdf4e6aad3b471cce7c91d41a148b07878", "confirmedHash": "5ce2c405fdf145a4cc84f1b5d088260838b3150f411d5dc60d00000000000000", "service": "00000000000000000000ffff87b54ca0", "pubKeyOperator": "0150fa9ad3fcb32bc15b8e4dcb6257b699b45eb46e32117271ff442036a02af314a2f5d48eb363259cba400f88382db1", "votingAddress": "3jEckZskzvJJPpBS5xk2QYuLNKs4", "isValid": true},{"proRegTxHash": "2641bc3aade9c71c93006892f7b1f7530c9d0d23f408d1ea6d06ecaf24de640b", "confirmedHash": "c94a9d5588a5ea2c85763b4ba3d782e4367ddec66dbcbd581600000000000000", "service": "00000000000000000000ffff23ac6135", "pubKeyOperator": "826b65fe631a3d7a8c8efaac2cb5e28a103e26bd1983170541110e07953c681e791e5803ae4c481a0ddb9c90c820b1cc", "votingAddress": "3QNo4E6ncLZiSizn9cUqKVWt7TmF", "isValid": false},{"proRegTxHash": "6134bc6c82a891c62d6b7a675f997069a0edb54df9dc6a605c4d724d3f12c465", "confirmedHash": "2f85279967d942a75ae499321cc4ccdd8cd52ac3e6c78bfb2500000000000000", "service": "00000000000000000000ffff03df9a64", "pubKeyOperator": "8b3982fefc2e7d389eebd968d85f8ff558152a84653519ccd35fa85eccb5b4c97149d6801dd7c9cea998827bbdcc9497", "votingAddress": "3wYtNsHPLfbwFbNEKxZPVCsugLD6", "isValid": false},{"proRegTxHash": "eaa62a35c6ffb927f8032bd1627624026df1524d965e2fbd453777fbff0535b3", "confirmedHash": "4748b5aecb9485a57b0973f56dde48948357dcea4cc9bf4a0400000000000000", "service": "00000000000000000000ffffd4186889", "pubKeyOperator": "95062a8bd73faccdf02385e0081963014cc51c805da2233abece6ac0834a7547e2467ad4a09ddc9e71b8e71a37b1a6f0", "votingAddress": "34dSTcMtfw98xwGWrfLcNxYR3T7K", "isValid": true},{"proRegTxHash": "39efffc3e6b9eb4025e339348699c5ddb548420a5024e95d251488cb1112328c", "confirmedHash": "da43ae173edaf99fef186791004da1d26b4f0d169bb15b771300000000000000", "service": "00000000000000000000ffff55d1f1d2", "pubKeyOperator": "064c9a15bdb907619319bfc2b6799c59071de3fbc44b79a2a5223e58ad3a4c4cacfe2924daf8ab884d88e98f130fed08", "votingAddress": "237jUEqQ8F6WRHVZWYYdSMukd43r", "isValid": false},{"proRegTxHash": "6b61ff9178ba13c019e9f92e99fe31a3efcc93ec1451f9c99a54522aa134dcb9", "confirmedHash": "1ad56fb945ed05f99bf30c03f70b6d8ff9002f8c40533b7e2100000000000000", "service": "00000000000000000000ffffd8bd97ad", "pubKeyOperator": "857158644d4a92e5fa66ecefd68172759060d7ded97352469a85bc9e7f3ad1870ef26653eac8303d25dfd6e6d9c6d41e", "votingAddress": "3LjiiR4LxhckhdoJyqhZTAyFy5Bh", "isValid": false},{"proRegTxHash": "22bc5e3dcd8d101dfa3eb8fa3ece16229a550553d456acea23e83d0495483c07", "confirmedHash": "57ff2858929e501901e5f0ed184b424e16c51d6b642b22bd0200000000000000", "service": "00000000000000000000ffffbc28b486", "pubKeyOperator": "04d1b5d52326d730fd60145752dd039a440292f9375bc96dcaecbee5eb21e8d89197391e1e96d9676ed1316d0239fac1", "votingAddress": "3oUeqSC3YjcX7mbmbhSCNr4pF8Rh", "isValid": true},{"proRegTxHash": "cf047e10622eb9307de523f4810c27647999a57f78948b1bd5da6598ca0a5705", "confirmedHash": "60f9b61782c44aa9bd76f86055dabdc3cf1ab6632d24b8172600000000000000", "service": "00000000000000000000ffff2d4d8f35", "pubKeyOperator": "19d45ade931917dffa5b26023c07140ce733e5e340dec434ef7ccc9522dbbc533677972c6236686fad153a00e38643fb", "votingAddress": "3vX6vdVU4cbxxfJSqyAdFPV6ACE9", "isValid": true},{"proRegTxHash": "da9c3c1e28e9d7f51447366aca6351d022d2be0412ea28ed71c6a4a6e7d142c2", "confirmedHash": "aef6ce4203bc3d19e0ab00bf4f1ea1178ad5094bf30cb7052200000000000000", "service": "00000000000000000000ffffc11d3985", "pubKeyOperator": "877b82bce5884749ac054a52466302b5b854835615c1d0b6c6d818f7b64eb207b8098768a03fc2738f80ff9bedcef061", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "b776baa83e6d17f7b502b6dd1d57ab99cadc8a37d8101e4bb81db356486f9b0e", "confirmedHash": "6415f0621bef2e358a347c2e77d68483407e9f6d05d336851000000000000000", "service": "00000000000000000000ffff87b53220", "pubKeyOperator": "09b9e4417ac9fc8361be0c5bd30485b4a2c0f5e52cd6c685dbdff7a3e6a0e77a508d4772abe8d9ddca6eac5d5a18625c", "votingAddress": "KhdUXGCXkJmLUwcP6Xxm5X77zwi", "isValid": true},{"proRegTxHash": "5ba0db736c18729ac68eedf0c893f68f30b2f5edfaa607aaf1f43fbbd2cc3620", "confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", "service": "00000000000000000000ffff68ee91b8", "pubKeyOperator": "0e91ef36a8c0fb926962ff9fbf742cdc498bf242730fa1e8251ad8260369862f45ff397f1c551f2cafe8767394a93306", "votingAddress": "DdmSHA9S5pKpmG6TddXJRWsNjhZ", "isValid": true},{"proRegTxHash": "a4caa5f10f4eb529961f24f21c3f810bb7972232ac34a1576e5a1ea4abac6f51", "confirmedHash": "b85655ffd9645ce6c2d5474efea205519233872b31d491690600000000000000", "service": "00000000000000000000ffff5fd8c984", "pubKeyOperator": "98efd9b5ebb90593d36826f73b55773ad79750d0e6eac4be164b2498f4f50c806b64fd856c80eebdc59a179f6ec3572e", "votingAddress": "3SwgdN2dDXYbWJVFLkj4YNC14w1k", "isValid": true},{"proRegTxHash": "4f96bc33d7ce3f046574a23d24b28472b508e93e3332fd51705ef48cd1721609", "confirmedHash": "cd0bbe0ed8ff725f4692b8aff20358327c7936775e72d6ef0900000000000000", "service": "00000000000000000000ffff592fa289", "pubKeyOperator": "817549010ce7badd6baf063914b6d582fd57b19c6e440c023098ed33f93a02fbc3961246ef3a3e794580586a2dbafcf4", "votingAddress": "3r5KPzBgPcBYZR5GwcWYRs19vT4s", "isValid": false},{"proRegTxHash": "73d13ed64affce33b48adaf9a1f49651e946b0715e017a277bea0c4966804b87", "confirmedHash": "38333c20f176c81f733a3e2c4770dbd1fccd5721475ec31a0100000000000000", "service": "00000000000000000000ffff50d1e711", "pubKeyOperator": "8f4e3a2204677875871520fb371758e3f6d9ab16bd23b46d49c114b820397343faa9952c9d50773800879da1c2b2cfbc", "votingAddress": "2xgwQnBBREXjXifXCuj1bkEFhTzr", "isValid": false},{"proRegTxHash": "9d509c1d9d7a2fd77fe9e7b950c5f79e81ef76fc7161eb91936839d863d91b96", "confirmedHash": "f03c5aed22917a52787e8ea5d3c8ee3af7f829ce7327a6d10500000000000000", "service": "00000000000000000000ffffa7634095", "pubKeyOperator": "13ceace978199ed24704deae275a4c05239b5b23e85c81854ee11eeb00406ab9da42de1959e2d223ff978e90ab0e13c5", "votingAddress": "3MGkehTEMEGfkuSyeizDJFTV8EZd", "isValid": true},{"proRegTxHash": "58efa5296d1d20893f3a1b771fbc2144576bbb3788ced84637d99f77731a8a21", "confirmedHash": "3a01c727e654ffdf8951126974929f99c1cd84147d8c4aa30200000000000000", "service": "00000000000000000000ffff22c29e0c", "pubKeyOperator": "955f490dd5e9e6ebff08b35718eff63f62b711a64556319d1c82729629da3700f8b122b2dc26fc63ce867bada6fed806", "votingAddress": "35iVmRMetJQqGupdF5qpFB6aYcLF", "isValid": true},{"proRegTxHash": "4bb0ab5432a3c3857131081f173086e9ede37006bc176dc237f138459a739bc7", "confirmedHash": "1b524c336c98c3672741abf52d9e5b4197a6db9a218d78db0400000000000000", "service": "00000000000000000000ffff52d3150f", "pubKeyOperator": "85cdfad1dcfd2c1c6c55304d2b8a658449602d5be60357b28ad593350bbd76d71e2552b395f97e59a93f8bdc81353ae9", "votingAddress": "45bN9PuqWebKQ9o12oPY9azDZGe1", "isValid": true},{"proRegTxHash": "1f8ba844f5b61ff6e703dd1939bf0d1f470cb71df365c40efb07180659e9935a", "confirmedHash": "8b763d49a209ac48f25c176ba9869924ec3992fe76a273c10500000000000000", "service": "00000000000000000000ffff55d1f184", "pubKeyOperator": "8b478f6dfef6bc8f05856226ade3e75d6dfa35f1821d18ff6e3aa75f4efd87d0ecb0da60d312d52b33c6c24835671614", "votingAddress": "4QHMQZabHE7RntW9rCVEzRAugTXJ", "isValid": false},{"proRegTxHash": "d83ffa427925b148ce33c301932ba5b8f6223fee954acaee054330ccf9c0d929", "confirmedHash": "04d0aa7e2191e996084dbdf7ccdd5f752a6977f7c185b2c41e00000000000000", "service": "00000000000000000000ffff52d3199c", "pubKeyOperator": "9786545fe4a83b3faf64f742f4b7756a20b27f1fbd08463a49721018b5e16a312c263ba8e13e6824d4ea92824deb4817", "votingAddress": "2iRi2e86jsc5KX1SufEMZcpmeC6K", "isValid": true},{"proRegTxHash": "5e7dbaf80c99977e0633faed4f76c545901640162147d75e4c5a03fb15c716b3", "confirmedHash": "6aacd1b79e78431520bedfc2ee9e7edb9408cb4ff21aba761900000000000000", "service": "00000000000000000000ffffb2806fd6", "pubKeyOperator": "82c7000c7554c384d80dbdab33196873d51e4a5a130bdc9d378856ac9462c6becc57293732cd22ea572934f7cb6e6745", "votingAddress": "4Qwh3nTceomDMxNBznWdkr5M9HYv", "isValid": true},{"proRegTxHash": "66d1ce93b1c02ee38aede3812a7d8016d90f448e4cbf09c9d500f01328614146", "confirmedHash": "bdb5e6281775a33960c66f73cfbee569ce1dc019fc8074da0000000000000000", "service": "00000000000000000000ffff0dd43630", "pubKeyOperator": "0a7ef2fdda56890012de58eb5358cf574e0b7769dde86ea94b3b809bf4b64ca86e09f288faedf45655906e153c8563ee", "votingAddress": "Sn3a6zN47EKmd53F67Q923YVYHN", "isValid": true},{"proRegTxHash": "2d9dded1cd1ce89e4394c2d64911924431b04592eef8d9914372d76d600ea600", "confirmedHash": "3b7721183113093cdfd9f3fe93726ccaacef9bd3ca9f669f0b00000000000000", "service": "00000000000000000000ffff87b54c97", "pubKeyOperator": "8de4c1eb0e21131c3815cd2c44041562861d7343605189e777ed39d7182376398a410efc6fc7ddb002cf62d6d5697937", "votingAddress": "TQYBxGWmfMR9zhigB42rcg58R9x", "isValid": true},{"proRegTxHash": "61f2d4a53bfdff0475379c15fb88f98fdcd4b05f4b3a11f7b645f2a3894622c2", "confirmedHash": "f91c106c5aa7fb92dab9f7c19354ab3aacf5488f1533ada11600000000000000", "service": "00000000000000000000ffffbc28b6da", "pubKeyOperator": "10611c18a4ed0a8d81adb5dce519c73cca3dcc6755989cd33e86a5b9a895ef8af2363fec1e8ac1e3b23825ed5840fcf9", "votingAddress": "3NiY4EaWhhG3WmYXN63Xk8ZSknD6", "isValid": true},{"proRegTxHash": "e8b78a6dbfc00871ce1fd89375e7cffc4815438953db26c0b7102e8c398fc870", "confirmedHash": "402c0548a87320f6b26851267192c8c17a1ac03ee95939b10e00000000000000", "service": "00000000000000000000ffff52d3153f", "pubKeyOperator": "129510c201cb53de1e3f629db58533af792e46a4dd8e9fbd8b43592ea19d30037561a9132b06d0eb820b74b7eadfc67a", "votingAddress": "3uqPM8kH5PTBsUaGu1oHnR56uzEJ", "isValid": true},{"proRegTxHash": "cf18872a9275b5ac3324311eb15889d4858983bd881e5148d866a0f3de26b771", "confirmedHash": "9e0716929dbcd18f3bd770e0faab334a747c94d9e29220b50500000000000000", "service": "00000000000000000000ffff55d1f10e", "pubKeyOperator": "15091576b33e393e8f15c531bc7019b783a9c6cc740365cddb40dbbc5bb71df71564e6114ca30d2a1aa5f453e0cabdab", "votingAddress": "2vrUxVGEvrmXKnJY28J6P2kZmuFG", "isValid": true},{"proRegTxHash": "951758fc766f7111c3f613d6af1fc9fcd66d4ac481fd23661c3a877c201813ca", "confirmedHash": "42cb0a719758b9ecf39637ffedff1af9e1bc0f15e7ff1edf0b00000000000000", "service": "00000000000000000000ffff55d1f192", "pubKeyOperator": "16809c908d040c3752a78315e20c092256f97bbd274dfd4a2bdf1a25500f8f4a20b389d9897b109bc5c1acbd14ec85ff", "votingAddress": "2uKE1weR9d3B1j4qcAprAuEwErYK", "isValid": true},{"proRegTxHash": "13ed9455b20b89afdf991ee62eb8bf36deeeb547d116efb2f32a3dd74e76b087", "confirmedHash": "e251de0be85e8a41ee2edfe982a7d8c7c878e7be8b4e087e2f00000000000000", "service": "00000000000000000000ffff5fb3b585", "pubKeyOperator": "924f4bf8a3ac575c77ed08a0737cf81d3ab36d263158b252dc58ed3b4bb3ac34f1185e501245b87bbbf4a69433e35509", "votingAddress": "2wB5ZfBi3Wi5g1yQD13mrN1gJoGq", "isValid": true},{"proRegTxHash": "01ccff7a8246b1f38631e2df5e90a193e7b771ddad2e5ca908c73ab59eb7c17e", "confirmedHash": "ce2f18598a65a7c8836b2763f1a018ea95894ad3ffe9f0a41700000000000000", "service": "00000000000000000000ffffb23e95e9", "pubKeyOperator": "976b2c46d25170251ab4c372ff5b8c2f64078201c150e3dc9f4134cec69bf23221fc168876348844afb245e733cd8d4a", "votingAddress": "3pEPa6G5a3K7QSCDSHHsqgP9xMLc", "isValid": true},{"proRegTxHash": "b8c56fa02c1267b6ba8be4f52d984dd9ed04c9d0a4cb879d812f1ce14334df68", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff8491ba3f", "pubKeyOperator": "022a155794361726a3105ef0ae0977f81faddd7bf47140a8afce88170056d5992120ebba55737c554fd0a6edc386f353", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "7891ed71c52397c2474fbda2866f2631c925f12d88e7baa521d78e1464eae8ca", "confirmedHash": "a10436edbf04db8e17d5c8898d087ffcf6a713ff34c0a4352e00000000000000", "service": "00000000000000000000ffff52d315e7", "pubKeyOperator": "0e70519ed62505531e3dccfc8b463ff6b1fcdcb908ea0080934f966eb33af63d37e3906a07766d632efe990a25142765", "votingAddress": "ELXQhkDP4sfp3Sg4YcjmizY6UMh", "isValid": true},{"proRegTxHash": "a5dd1fac1fa185063a992ed40b443855505f6fa5b3460a9ff6cb8529a546b1fe", "confirmedHash": "a6cc583734a8dedb1a3a5470eb7524f260a2c7b579463f511600000000000000", "service": "00000000000000000000ffff55d1f10a", "pubKeyOperator": "0ddb912c6e449e1b7dc4c0e4277dbe3a5ead08026d08c408bd359065c190840ff1fa69b08de02d3d121d8f4baf5cbabf", "votingAddress": "2SiFm4Qjgqq4vYvEyffepPVsGMX2", "isValid": true},{"proRegTxHash": "7492bfed47cb703d8287badbc12d77076d5b26f92d1a073293cbe204140faab9", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96887cfe", "pubKeyOperator": "16cefee911d4779ed8e043d4b2713c3bad940f02fa6b7beb789c0c0a744fe3689c4f5a95b3a64178d48cd1ad3a79810c", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "124ddf4418ff6e1f5cb726d666c0d7e5fec7a3e3ec87da50d11b81529c9ab069", "confirmedHash": "05ae26e27de86a881c26d7863161b0f13cf4d24d0f0ceccc0300000000000000", "service": "00000000000000000000ffff8a44a066", "pubKeyOperator": "82fc4ff44ba0aa80c1113c4509c5f18c70791b63b369fe6f8b5b23939abf351203c2151efa49999d405abab63baa0d73", "votingAddress": "LHRG7nf3VBhxJevio9mmPcKZHKK", "isValid": false},{"proRegTxHash": "9ee0e43a3420f70d325ffa37d6aafef2d0d174682cbdc2e752f09cd76e564d89", "confirmedHash": "4244abd22a6bf1a18b30786a3795d59d5fc69fe16bc55fb91900000000000000", "service": "00000000000000000000ffff334b42eb", "pubKeyOperator": "1962c244e8f944308664920e3aa715ccc4939a1625bc1602545a51b5d9123c6f7035e01ca796d149ab7fbf557604a817", "votingAddress": "34cuVjiB7TtGHEbCMkawC1YEDRsX", "isValid": true},{"proRegTxHash": "3aa54475d394681702cee3ca21674665449dc486056a3075fdabaa2957cf364b", "confirmedHash": "713585b2193c4700656910eac0e0ba089a24821588fbd9d61700000000000000", "service": "00000000000000000000ffff2d56a39b", "pubKeyOperator": "141841a1557abcd30d6cf3d05e018e1107dcfdceb5227cc61029ae2c2596db15c08c7ef04ac569ea828b79f4dc63d442", "votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", "isValid": true},{"proRegTxHash": "66af3646d86115ca3c0d6bbf46897e16c32923bcf2e3b88223a63929b3fb5ae2", "confirmedHash": "a1e6a81c221aed68d0e640d6581eb47941aef0a4afbbaca63100000000000000", "service": "00000000000000000000ffff52d319aa", "pubKeyOperator": "94a7a29762d8a062b7099a87de24edf6ca7ba3154980f7450c83efea486b909e0605b92e627960846e1153151d0c10d4", "votingAddress": "3uMV2mzKHEX7hWtoF7qZKYuLZGnp", "isValid": true},{"proRegTxHash": "b3fade6a0306792d3fbc1e592bb1a6382fd6f2672b222c06b7df2f00641f4503", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b063", "pubKeyOperator": "92e106914d3a53e9aa2ef264aac0eeae725d6d2e6aabb6ae2247f2346a7a950b1a71eb2cd5a65c70a18ba2aac79f2528", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "1c05a7d0ff4768985eb00156a55102b65fef1238603097c0bafccf6eb1353695", "confirmedHash": "adcf4e76e1aa6f2eb1cb34f7b91c8b521ed65c853e8f6a570b00000000000000", "service": "00000000000000000000ffff4e2f9443", "pubKeyOperator": "8ab6f7dfd0e003b3bb9b4a20fe59065347d41c2ad25f8d38bd79c16d5f07f875d78f47ece6da3c3f3fb902f9522b8186", "votingAddress": "4Pvuzvp8L8TkP7q1oFV1xbEnAHYy", "isValid": true},{"proRegTxHash": "ee437be3b63125c50c910a5d877ddbf035519d92fe30220bc6065a32092028ab", "confirmedHash": "ba5f9ce7aacd9d19ff98f27df46e93c41a5fce20e630bde32100000000000000", "service": "00000000000000000000ffffcfb4c725", "pubKeyOperator": "968c94c346b0f3d9a09ffb6638d0e0dc13ece73e909a442454f513686912ef6dc818e87383e70db190bd67949481eff9", "votingAddress": "2oyEpm9s5KwQnS8McSUpL6uVC5ps", "isValid": true},{"proRegTxHash": "b4e44e9b059153c161ef427f3d653ca1d3a255e87568fc9a09bb542545200265", "confirmedHash": "e96d46f900cea916af80c4f272f42c951af74271e8a8e0322f00000000000000", "service": "00000000000000000000ffffc7f716da", "pubKeyOperator": "0b8d1d3355a0f37a365d9e0e42410ebe6442e36a0f1ea3c74467d68145870b2c68177867bdbe11b138303482da470e7d", "votingAddress": "33VtQeoVhKYn77fV5VZZjkgfSUeC", "isValid": true},{"proRegTxHash": "e6b11c09b2627b9c60f3026282bfd22f7c2c3a15b95f7eb56c826ec7c61da28c", "confirmedHash": "0dd00654d71f6ade7207bd00d1b6ba26087f9e368ae42dfd2400000000000000", "service": "00000000000000000000ffffc2875021", "pubKeyOperator": "94f22ab54c688ae79bb1754e03b42e86f02395205e4f82e4c7d45f5324a20c2c41eaf03d1f61d16ef5ae40e79a75e0e4", "votingAddress": "35vFfyD25Guw6R1irJ67ihXyJ6jh", "isValid": true},{"proRegTxHash": "2122b6cea38ec8a9e59402f7767fa9d9b4bfce7bd2a36af47b51f41b67125f86", "confirmedHash": "cffa8f30490ff678412d82497e295453409d2f539759280a0800000000000000", "service": "00000000000000000000ffff88f38e23", "pubKeyOperator": "8b259a2844167d2c85a41eff924d755b02900d0843841cca926c16e39dc1b8c59870d2a39300a99bbe04a4d2e75f481e", "votingAddress": "Q3pNuJwzKzEJXaeYj7qrxU8tvU4", "isValid": true},{"proRegTxHash": "e2f31226919b54154d911639a994a191d6bc742f988a73263b784074c082eeb7", "confirmedHash": "b178e99c0d848b2117da0032ba14d6d9be8362789509a5231700000000000000", "service": "00000000000000000000ffff55d1f13f", "pubKeyOperator": "87271f6b6c951e8b86f4aa96abe4a7d034fd9931bf8089964083768a1f6c76e03f414f706b968f023b2aca968d152923", "votingAddress": "2drCt36jog6pY1DdUsjV6aPYaXgN", "isValid": true},{"proRegTxHash": "52698f87ab75b52ae6028019e0b456272b21e3319578bd2cb0951408af141266", "confirmedHash": "755e879941a65d55f4b61ce3d63ba32e55f240f0eb7282470900000000000000", "service": "00000000000000000000ffffa763bf69", "pubKeyOperator": "83f583cb54e728c466a39bbacb5094cd8f87aa95997cd67b70ed4087c19ee392d072404e6c41c888a62521d2e6b04fa6", "votingAddress": "2oWNg1FfUSQUncNp6CQDRZF7QNmK", "isValid": true},{"proRegTxHash": "b092d58986ae4f2bc5c548bedbf5bad45878adf112920cc2b5c0b671a6dba4b1", "confirmedHash": "1f824ca64d7add3ac60ba8c71f8a3a0ce60eb24330bf87bf0f00000000000000", "service": "00000000000000000000ffffa2f315f9", "pubKeyOperator": "1347434b853f1eb87263d8ff036a946bdc0e38f81242c3533c3bd2752df5da957e37b3fcf5c7a380446960847da5bfd0", "votingAddress": "3QHJ8mTrNnW8MeCQWKVaTVThhJia", "isValid": true},{"proRegTxHash": "0b54ebb6efb670592b0fd59c504f62622f5931d436380066e43d1783a02ef138", "confirmedHash": "a00a795b305289dbfeeb8c945c0d7e7feb84270b1865a5570a00000000000000", "service": "00000000000000000000ffff55d1f1e8", "pubKeyOperator": "8b8446b832411f2f530c8af1b5fa5110be48e796893415ad5e874ea562b1fa88c380c6656f0781b39590827955ff8911", "votingAddress": "3fMJ1g9kZ712nZEb9f9jTe2SAaRZ", "isValid": false},{"proRegTxHash": "d81bd477aad6ece8db69360563ad8305ae8852b93bba55da3ac6ff1c6ece21e4", "confirmedHash": "aa448d6b9b9fb9715189c3f26d54886688f3f889732044390e00000000000000", "service": "00000000000000000000ffffc7f7036a", "pubKeyOperator": "83e6e1774ce004b57fa3e76bbcae76768a77456f73249eb4eca4f9ace3abd5c7432a399772815624bc00c303ebd76a61", "votingAddress": "28XFBLwem7qjgegUwvB4FnHbeom8", "isValid": false},{"proRegTxHash": "0b9fc375cfbdc6cf076e5e9a4652adb7b33ced132259dbb1378882bd23efeb34", "confirmedHash": "b7de66377ac2e6b87d77c94d6af5874ceb5fd823caba70131400000000000000", "service": "00000000000000000000ffff2e04d9f3", "pubKeyOperator": "0fa4c0334aeeda3cf366e0305f6c8c44ce3ccc1a88182b6ad712f8659efee6011da77369b5c4f8e8cb82624ca572d1db", "votingAddress": "sMKChf6XV1oaiKBA8yvWikHyvfc", "isValid": true},{"proRegTxHash": "c39aff826b65f0b3e52fe26721dc15ada89ba56498c38afd5748933e698560fd", "confirmedHash": "bbf7c3c06e2ea9f891ae0b919c34729d46da6d8870b3f3060f00000000000000", "service": "00000000000000000000ffff95386d24", "pubKeyOperator": "8384e89d76e23a6403f56030f34b10e4b9d2813d3bfe73c8ec92638b0229ec1951e956c68be86d3b2407903fb9532a98", "votingAddress": "nM1p4H3x7Biy12dsrtUR8er6ANp", "isValid": true},{"proRegTxHash": "c7fe3b993cb5b138351bd46aece95de692d8c9dcbc7826f3aa0b26c7f3aaed19", "confirmedHash": "7d1dc4db1172dc8570254f92327b156712724ef4496818b80f00000000000000", "service": "00000000000000000000ffff2e04d9e4", "pubKeyOperator": "17f89cfc141a0f5326fb804efe0bf3693f6281e06ef51c908db1d81094577d7cd734aade70766cc45f433efb8d397601", "votingAddress": "3u3n87u9dazCTXjxvPm8Ag4qZ8Ve", "isValid": true},{"proRegTxHash": "6d379c567a68ee29e69b0d895f5e2548311fa29d5dcdaf863309bd8a48e67ad8", "confirmedHash": "2cc96bac6eb742c2dabaf7978fc807414485cf5e03ddf97c1d00000000000000", "service": "00000000000000000000ffff95388d21", "pubKeyOperator": "8e99e0a433ae044c7b2bde74c2ebb460c536d69e2d8bb287370d7dfc52d78f5147935f02a2209e3d15adb0364ea969fe", "votingAddress": "5f65rjhgfhkLu3koRUnWMkz4B3w", "isValid": true},{"proRegTxHash": "513ce43b61fd14bbd112b9f90626b030926510df5a6098a1db06422cfb13fddc", "confirmedHash": "2b80a6724faf3cc58c90cce7554aa9b2f84d33db79bc86921300000000000000", "service": "00000000000000000000ffffa516d98f", "pubKeyOperator": "0a2faa5f3498d09d4c7edfa08c4723406f003853dbbfd1328b8b02f10b78fa16ae931e13de8fc4d44824f4b279115bc1", "votingAddress": "2RvGYT5TfoKZ4TiwTSvs4ckMWL1S", "isValid": true},{"proRegTxHash": "3bba887d56fd047e73bb94168e6b39d91e712c07d4519b5d5ae8339871558e59", "confirmedHash": "85a28301afc91d30b5825ac7c6a7c494d29ae8b8bed4978d1d00000000000000", "service": "00000000000000000000ffff9f591ccd", "pubKeyOperator": "81a1e26e63b86e57abeae3627032e26956bef19348a99719035e6262c14d953b00ea0ec8b386e0192c77397f06f73b9c", "votingAddress": "31FMfzstUh9Dk8HQnzX4qMFoVz91", "isValid": false},{"proRegTxHash": "4e15f813d0b58d6b4420a9001f75aba3a0cc8023edb2d0db101f92926403f769", "confirmedHash": "210c0555a0c56f58e17fdeac32ac7fe0f62f45abda65798f1700000000000000", "service": "00000000000000000000ffff33d26e6f", "pubKeyOperator": "8151a003a6a3bdb0fd20f2b668425e6e8b8ed13d23eee81241a30a14bda85b7d880789a2b9edf0452609661baf7d8290", "votingAddress": "3Jdcvb5SrGSjSF4V44fpo8oiF2XL", "isValid": true},{"proRegTxHash": "6578d6cac129b9183c8759a1f75cce22c3327b40d4f65fb2d1d44697270057de", "confirmedHash": "8b5b114844c450dffd0ad2c5055cc9368bde11425bf297d22800000000000000", "service": "00000000000000000000ffff2d4c2a2c", "pubKeyOperator": "03d970dd8d7b6909bd5d6511159fc38576a8d4553e1ad357b3d97b27d06a97e55747e413b93d4d3b1f843ad8a24e9a67", "votingAddress": "wHKrpMLtoG1uEw525JAGgmFGLPD", "isValid": false},{"proRegTxHash": "8ce8f1e5dd8fa5823ccb3074e3e4ecf1c7d7882a842be10ff0c8d27f409f62de", "confirmedHash": "f987264e5b21a263cba3d0981b29dcd11cd81b19c5112cfe0e00000000000000", "service": "00000000000000000000ffff86d1c61a", "pubKeyOperator": "187315827c2b7bc79a4fa1acb4e9590a8948402af1df10e41869c8099f69898fe62bee94cef8566cb18705e5254fc0d3", "votingAddress": "3m6vwsrAHSr1AjhtqQFwJ83gkyzW", "isValid": false},{"proRegTxHash": "195571791dc6c2a0441f204fd845fe0ced274eee22397e4f78604ce3dfdd50de", "confirmedHash": "ef6b14afc52a502abba8c64046079424c0ef0d185facc7470c00000000000000", "service": "00000000000000000000ffff9f411afc", "pubKeyOperator": "05e93e39c257c4ed59e7cc53b795b35f688b3a453b31a923c748b9e7167a05ef1500c45c946310bb34d9d6efbb255147", "votingAddress": "3QGJamP1uBjm7GgFhZ4Qur5hYy2U", "isValid": true},{"proRegTxHash": "e0cb3934d25c07f053379b9470d06ba99a7348bce3da2f04971cb4b195a910f6", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d59919", "pubKeyOperator": "8195f39e4b7b77edb99793c414b5ab8632798a5f31e30da3593710d359704dd47f3c4eae8755c2f9523cf6ab87799f3b", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "e0855675e7b30e7bf84f7debaca76102ac939bc2606bd15f37b5fdf35abcf9e1", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff235573a5", "pubKeyOperator": "0941fefb0b93dba5b6c6c545b9be8a31ad56e9d03f61ac4a44b4035e95247c66b7dea5c509c2ab394318b0affedee1c4", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "b0d2548649d63e46da5bf131b5eb44f8af2b24a43bddc6affccd530ceed098a3", "confirmedHash": "1ccab49bd887168c25eef17865d97bdefbe3358bc5dc6f710800000000000000", "service": "00000000000000000000ffff87b5322d", "pubKeyOperator": "86ef5b591905e1c2437ba419f3f921b0b7ae71941cde7b423dd00099866fae178a90cb93d8b6dc0054b5e0706ee7150a", "votingAddress": "48AjikVRN2w5rXN3YyTEsWandc6h", "isValid": true},{"proRegTxHash": "9e13a3da2bdbd312a4a4fd4f49e2f13189671e07f2a38df6577126b20905e9c9", "confirmedHash": "a6cc583734a8dedb1a3a5470eb7524f260a2c7b579463f511600000000000000", "service": "00000000000000000000ffff9fcb2103", "pubKeyOperator": "890f64239dec329b2d251bd4172cb6b751c5b32e90dd1e032a3130d78197559937d7491a32d28e0732c1b1c70887c9b3", "votingAddress": "3n9D41GuGmFCjTULyf7r8pLV5DhZ", "isValid": true},{"proRegTxHash": "cff385c8a986589ae0ff58da89688260f413b2b7625bbd2e786b44f5b1deb0bd", "confirmedHash": "aab4c8bce5e55d12933fe55601a9febaf7d40d4c675ad3ff0e00000000000000", "service": "00000000000000000000ffff52d31533", "pubKeyOperator": "961ffce055ca01cfadc65ea4fb98411c75c001d5f0261440be6732bd56bbab216d74b8b014c0375914cc7b04eadc4f1d", "votingAddress": "3oik7jyDoJMu8FkDZ4Dq4K9WmiY", "isValid": true},{"proRegTxHash": "5b21e590a5d0bf3e87771819dc3a122c8a5469f90a094cd22dff4eff69090900", "confirmedHash": "641df81ce9a4c9a208c61140006c805538f18db4a39a04d41300000000000000", "service": "00000000000000000000ffff68a02a23", "pubKeyOperator": "152442f601a1ca90b00dc71803531946e1218231bd1cac58bac0f7146fcd50d17789071a74296352169c518d51d94830", "votingAddress": "2egWaZwQUoFjRPV5cdpw1xzJuXit", "isValid": false},{"proRegTxHash": "e2e19b9ed691f5c84927dde6fe19026c388698670bc8101fa8ba180f1d1a0188", "confirmedHash": "8e45bf03c8478990f4f9a896ebb87caf17377492b443b4290300000000000000", "service": "00000000000000000000ffff52d315cd", "pubKeyOperator": "0d073450ae604f003f17e182d7653bf90da453744839bb123990f1abfeaa07b021438d460e8eaac144fe98994b7af432", "votingAddress": "3iDz3qMRVA4etVP4NT4Dqv2U7TkG", "isValid": true},{"proRegTxHash": "f0c1e2a7e016ac539b77b6e6d4c45267d6ddada999a0fc6cffe2387fb652027c", "confirmedHash": "885e180c8115dad4b873513ef082fd2fd44542475fb358731000000000000000", "service": "00000000000000000000ffff52d31573", "pubKeyOperator": "0fbe3891b05ba2676b118525be531f33e5ec197a846b23fd6aaef74eb1b8b50c40c7808b594c29b0cbe483aa7689f49e", "votingAddress": "G5rsHNGudjJpA1Wp7tBxALuNqFp", "isValid": true},{"proRegTxHash": "a340d4ea298469484b6cbd7336f4a26be4f1344f02739d3fea6e7dac5982771b", "confirmedHash": "8b5ad19b5267fb7bf4e6a5ef5ba3224298252fb9778dd51e2b00000000000000", "service": "00000000000000000000ffff58c65a96", "pubKeyOperator": "140b1ce29a2462138a48d8f31df635d457e9aabd558cde4ae2140f69931bf451765078b1e05acaa61eab749711b2a2c7", "votingAddress": "YdYhgiafBytJq7vDA9QP9d55u6A", "isValid": true},{"proRegTxHash": "22b899b886ffc4357476bbd34c2f67d69a34dd2e7811fb6075bb2753f9e99461", "confirmedHash": "94a0cc8e41384a956ecd57a12c69b7275442c9952a33a46c1200000000000000", "service": "00000000000000000000ffffb23eeb75", "pubKeyOperator": "883d4365469217c34c33e8430850cd7aaeb0cc07fee25d95b9149ba87b9948579bc486dd870a77b2c6500965e5de8477", "votingAddress": "4695DKqZCeLBs82RFsFnc95VaWVm", "isValid": false},{"proRegTxHash": "882b642db570153595aaf1b175b1e19f530077a8412e2aac1a725ee5f1acaf77", "confirmedHash": "5b0bb62006908b98a8d895f1f75e5d449991ca23e02562e70e00000000000000", "service": "00000000000000000000ffff3624eef7", "pubKeyOperator": "054aefbf6622ed71ae2c86fa04dbaf2ba786c2b697a51cdd2aac8c14fd05e72fb47cd28c5f966d37a5254186b5c8dd32", "votingAddress": "BcPCYmUK4Vrmn4n5mgFZJe48p6r", "isValid": true},{"proRegTxHash": "51ed044c17ba86d781b2302bf75ed4bbac471f89fe8b867bda99db145868fa44", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6e95f", "pubKeyOperator": "04abf5548abc72627a3ee1e73473d7fe202ac331c3cbfdbf1d605d474988613bc2aeca42d14302e3c3141816da461e62", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "2f5ecc18a02e963b4e7aeee208a830daf198dff365e75c33da53c2912c19155b", "confirmedHash": "ec220c4fcbe784255d464d9925944243a7ae474a8b3ae37a0400000000000000", "service": "00000000000000000000ffff87b50846", "pubKeyOperator": "1183d6cea53a83d3d1ed3a4916fd23e191717a08a24a7c6ade5065c4cad8b00757034e966983e74d3c29bedb441fcede", "votingAddress": "28A9kVnFhzJUkwFJogbQXAhnf3PW", "isValid": true},{"proRegTxHash": "2c31bb178ba1c798042400f362fb481eb43626f265eb228a95833d2b02bd5585", "confirmedHash": "aefb3f636134edc8bd513369a1a284e5b97a286dd6fae4e01300000000000000", "service": "00000000000000000000ffffb23f7990", "pubKeyOperator": "8dc6bb3b660a0ed0663e2aa5585a16b7d803ff721d08c6ccf9479e51ff7a80e24ae61443440b87650beabcb0fa6d8a8d", "votingAddress": "hwteSLPuVd95VoFC1mvVC8bKemu", "isValid": true},{"proRegTxHash": "8fe3b8b8c55e9a8481382dd30a97727e012111bcb6f9843a3398b81e4f7ba431", "confirmedHash": "9d9ec54b8ebd647102670208f100cfae52cb915c05b309280f00000000000000", "service": "00000000000000000000ffff40e16c38", "pubKeyOperator": "8e3111abfab23379dce77250e97ccd912f35a00cc190c52e6c383b48f14a5085a79dd54e567eb64d0a7f3f4725fd2485", "votingAddress": "NuEuGjH5gdvUCWfsBmChDAjhvwr", "isValid": true},{"proRegTxHash": "1fd0af3b82e4700b8290e06e1b0507c45c28233bef9773665ee773389f98396a", "confirmedHash": "43b3caf59cbc5331ce20c7c1be57c84ded106d611d049e4f0000000000000000", "service": "00000000000000000000ffffb07b39dd", "pubKeyOperator": "84e18901a924ed0509f5c10205dd71a11be4fdb4252050624eb5d9727f0901be3c4aef399e14e0adf3427df9798c5586", "votingAddress": "EybkGoX5HyinzpsmDQBu4cSQ5At", "isValid": true},{"proRegTxHash": "9c216813f12c7adc5814fb422beb1e9b8c743ec4a10f20cdd9bf6d548d7dcf5d", "confirmedHash": "dbcb94681afab19e589abe1ba391d14b756bbaa599c6bdb60b00000000000000", "service": "00000000000000000000ffff55d1f284", "pubKeyOperator": "8d07f33e08c10b0ba7495125f0001a931239be5951ec917b51d2ac56f2cd5a50552b5c7dbdc50f5d87b8710d27ae1a43", "votingAddress": "3UBf5hmaKCXL9jDgXdgUTKcPgb1y", "isValid": false},{"proRegTxHash": "92c024c2905bd117ee91edb5007de74cc485f671bc0c4a8593709934e4043578", "confirmedHash": "2f85279967d942a75ae499321cc4ccdd8cd52ac3e6c78bfb2500000000000000", "service": "00000000000000000000ffff344785be", "pubKeyOperator": "0797cbc34a47ebf45c6328651de835db1e5cb58721b6f27b752228210227be6d305de7915ccffde924c540c3529950a1", "votingAddress": "3derPdHBzdHL9TpgKuLeh5TvdBW5", "isValid": false},{"proRegTxHash": "e2079a45240c26899c9f621835218eb2b207b5743844d8f2fcb1ac37c9f5d8c9", "confirmedHash": "997e1c281b502c8b330fff8619b6fdaf51a10b55912993001100000000000000", "service": "00000000000000000000ffff2d9b7814", "pubKeyOperator": "89677f39088db009d31008a4aaffcc1aa1647512f78091c10ca24c0de9818f53dc2f636d140fe080433adb77b10d6022", "votingAddress": "uFvy8suqsNpZm9LLvSWuLAhTghY", "isValid": true},{"proRegTxHash": "c38cc946802a2d732b95fa1d73e24920a7fe5a18497f14ef4a4c2dbec71b5ae7", "confirmedHash": "d9d3e36f2146f325292c140570d2a642c1ec83574d6dcce50200000000000000", "service": "00000000000000000000ffff41144622", "pubKeyOperator": "0c3cd2a62cf315fb5c34615d8fda0d032d88de74d8100e85c4c07bb636ab609b699e1d593506eb160d4adfcd9f86dad8", "votingAddress": "2G3vsmk9tHnvmUCCNMzFRQ7pGMAc", "isValid": true},{"proRegTxHash": "21b34005fb878b04a137e98c30aebcf207978a1e8a46e1886d891f3e2a432c3b", "confirmedHash": "61e3feb820d0f859ed98ed4ab40904b04fc0e213c89ce1723000000000000000", "service": "00000000000000000000ffffbca62e21", "pubKeyOperator": "11d46b200414caa15a92df34febdfe0fb4b924ed61bba6cb759023ad2a902cc3b5baff3e056d5bef2805fe40826d15a9", "votingAddress": "386MBnzhW34SNFmyUZZV1pZ8HUXW", "isValid": true},{"proRegTxHash": "de5fd7a9afd07d331fbf5a6fe00a871ca5d7816ad2b326813dcfe1e69de67367", "confirmedHash": "2061eb607c60cf7a2d0d748c973af3467df57ed67efc1db01100000000000000", "service": "00000000000000000000ffff55d1f194", "pubKeyOperator": "1250b4c913900f8e3f9d8d662fdf4c54fedd466927d4e109dbfdae7106c5b923e9ddfd031b290e3943de4f2e36935a74", "votingAddress": "3emuhzebde6otpuvWKhWWKndaU4G", "isValid": true},{"proRegTxHash": "8bfd43e9ddff7a0c9c2ef6dda536753ac41ec688dcfdd7e4f63731cace67f4e0", "confirmedHash": "c14641d19f521f1153ae688c345dd13908bda7c7cf27efa20100000000000000", "service": "00000000000000000000ffffa763cd91", "pubKeyOperator": "0420b5160aa3deb742d4dd3d079f5d798a3c3defd59a34ae25b1637cde754a4b9642a380012729ca6810e97899c04fe1", "votingAddress": "2DhuHvAnVcPUuFmtzRMPKf9u7LEi", "isValid": true},{"proRegTxHash": "d97f0376406e1e6dd399e791797b2472f8cbcb57c2f5b7c84ce49c4a47a5fb0c", "confirmedHash": "c4ec88afee462e135f61c442f48fe0010a80131050edbffa0a00000000000000", "service": "00000000000000000000ffff55d1f1d8", "pubKeyOperator": "82e5e0d30cc5e50a64423be2f9707c0e3eb741854bae99c6a1dcf24092ce94e263283fb6bac425d60e0d3a4437421224", "votingAddress": "YsVXL4gUw11gEfiaidJA8b6KHA7", "isValid": true},{"proRegTxHash": "44b5f36328b282eecc5c6f61d784537320990d099f410f8766dd1d57a1ba9b85", "confirmedHash": "9bfa9a03e826cc43582482c443d0cc686f2a867793233c981100000000000000", "service": "00000000000000000000ffff55d1f1ef", "pubKeyOperator": "8c6f7128339f9e6a84153d51a2570559f8c12f8a2abaa0b9d9c7fb7206c9c04b93582333c739131571585faf7ca54935", "votingAddress": "orKH3yTmPZM3pyowJ4vqhTtBzJD", "isValid": true},{"proRegTxHash": "21cf6eb52cda70f381af747a152f56518e55fcca20caf62891bb8f29e95b24d9", "confirmedHash": "a62fed9dc0dfcf3e42dee63bf2ce9d01bc19824d596f21af0b00000000000000", "service": "00000000000000000000ffff36a4b960", "pubKeyOperator": "134736f576779f9503a4562a6c4416b4f73f7aeccbe47cbdf3ce93628323e7dedae21c5efed8577c38596a879065e6ce", "votingAddress": "3xgLSArygB4tSpKsjD1s7mDufoUK", "isValid": true},{"proRegTxHash": "5294f46bd0b6b1b9481a5da304e4c8a6e4a84b802f4f99182ee355ce15e1584c", "confirmedHash": "bd31f35c5cedbf07c6ffa716f2a3acf8f725ab42af8758740500000000000000", "service": "00000000000000000000ffff2e1ebdfd", "pubKeyOperator": "0c5340af17ca7054208ec335e7758c62804fe96534209da0fa8823ae80046e6e58719312a73085cdc65be737ad8ada65", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "38158bfdf914866d526ebc6784e9f11f64c452185a79bab98b177e2f00380b08", "confirmedHash": "4db5b3aafc6e597aadbb5e13559fcf29f3e03f3e79374ff50600000000000000", "service": "00000000000000000000ffffcf94779b", "pubKeyOperator": "14b568d3c0441cec9907bc9612fcef99108470e99c901f8f04051aca12ebc2a08596b7561d83154f6fe582794c284fb2", "votingAddress": "uZ19AmNZWnS1F3hVV7SrgYdyrpr", "isValid": true},{"proRegTxHash": "442c9e20e80ad58ab531fdd549c22aad5b035bd74c3c97d9487d4f7607e043dc", "confirmedHash": "9a38f751969376060709bcbc6396ae1da7bbf8acaa95b1f40600000000000000", "service": "00000000000000000000ffff0feba75e", "pubKeyOperator": "8b915f7285c29ad644781d285ea2abbca183bc1504f3b05fe9f2f4646d97947decfe7c9dca0e3c1998c95e69a5598a8e", "votingAddress": "3aKLyj6ETX7hA83n1KCWRsGtxNhr", "isValid": true},{"proRegTxHash": "200cc99b8b394a88053172855e7613c8f0c7548f0e9470524c1053dedd2edbb8", "confirmedHash": "216d183bd47cda67fa56d26cb038061b60f9d5166d123fec1300000000000000", "service": "00000000000000000000ffff8b3b4d87", "pubKeyOperator": "15ee7e20aca17a9aec6ea834fdb290a705785f180e6578d3a6b95ab4d81611c914b6d15898a9da2f0992ce57e1ef8632", "votingAddress": "3Nf4pbnwsJTeWanoyFXKRmdRBW19", "isValid": true},{"proRegTxHash": "16d1d4380b098756db27b4125ef98b97698c5934f1a80237343f102c654ef087", "confirmedHash": "05084e24a136048e19624f24d3a1932047bced480c99c34e0c00000000000000", "service": "00000000000000000000ffff40e160bf", "pubKeyOperator": "12a0b19965212000e3418b98be89a0a51d24624201ea3fd6541dbbc659eb8996fad1e5e2092b350a27c3aa2cc101c3fd", "votingAddress": "T4e9cYMWQBfFgswve8Te5BjHcyT", "isValid": false},{"proRegTxHash": "220c7aadc96ecd9c184ba969432d965ba5e6486050fff64ad6129a7917ce598b", "confirmedHash": "3277f1ffb00af0bfdad228d19db6c801531bab00a736e05d0100000000000000", "service": "00000000000000000000ffff2d4c59f1", "pubKeyOperator": "111bbe6f546af4f84bd3188f771ecd15f09e14a3c818b39d5d354cf84b409785772a135cce87c0a5a52b4574c4181d04", "votingAddress": "3sbxTaTroXfzWRZzsmWFkFiBfBPd", "isValid": true},{"proRegTxHash": "05580154d0279d50eca8febd12b99725b57c4c52fb0f1aae0a3f39e275cd1ae7", "confirmedHash": "53ad34fa4b3bf1c4fc189448a8dc3d3cd5288d13494d192d0d00000000000000", "service": "00000000000000000000ffff2d38501b", "pubKeyOperator": "8dd634b816918780e82cd4e6bdef548e8ebc0ba92877c45629d6b0ed27fa04dc2303b934fc46e8c033a6a58ccdb4ae98", "votingAddress": "4VqdtprncVBdjUaKprgun9Tmeib6", "isValid": false},{"proRegTxHash": "bfcbbb7c645e7af7eac666b3f3762617f7a4fbcc9eaa8674ea93e87d14ead233", "confirmedHash": "b4d40f9f07aa0a5c0a63148c90004cc5eb9e36293113d0441100000000000000", "service": "00000000000000000000ffff2512e338", "pubKeyOperator": "810fb34e96ab1a3c37b6ba2872730e3d3eb1cc2ee9ac82265540adc1c113e4a18e89d80de9112e235326969444ce48ab", "votingAddress": "2ppgKsZWv7fwHvhiiziCzsHCUchg", "isValid": true},{"proRegTxHash": "d52d8adeaa92b3cddf652195c82d8623f8e7906527c202e86ea204565439c5f6", "confirmedHash": "bd936997a77919a79dfb1ce246e1067dbf92f329782f3dfe0000000000000000", "service": "00000000000000000000ffffbc28e715", "pubKeyOperator": "85637722af4cd44b479d09825c683199b39ab79c87fcbd36bf5c5c0b5e467e8ace7a22c9b0dbd629dee781dc6640f777", "votingAddress": "e4dogMZ28pfH1UbNDJyXzvGjxH8", "isValid": true},{"proRegTxHash": "219c36f96c0e682c11c62c3f024ada780497f15b2ed544305fddd73e39e75f40", "confirmedHash": "97bbbab0d22e6b58206b21bd85755cd6f7d30cd1699826901b00000000000000", "service": "00000000000000000000ffffbca658f0", "pubKeyOperator": "03fc5835287a18f628a7843a0c6c1886e61f1c4ff4ac0551d44c94d1e78f9b8e105b74d91a501251b96b79d9fe79ba23", "votingAddress": "28aJg31AcYYrnW5RJnxZGYRV2KCs", "isValid": true},{"proRegTxHash": "f9a68d76e0c151a8c347705e2c7f2f6e12ea6d85cb7b4fdc8c86fc06a92e18e4", "confirmedHash": "710559b6a9e0f5222af0758ff0b58cba3d33fff34dc293001e00000000000000", "service": "00000000000000000000ffff55d1f1a9", "pubKeyOperator": "96afe5414b242b18048bbb8d8283cf88b2a6ec6c2051866e43d5323688ef484e3eca29683c68f160d17926d848e6b1db", "votingAddress": "2UQPX48zvJo5vaAq9oVPP8emSDHV", "isValid": true},{"proRegTxHash": "f8ef4df2dcbc5c07f62e6b49e51763620843050f0900202b24ce3b907ae7df23", "confirmedHash": "90791bf5da5aaa3c368f7d87c409003934b5eeb7e9bd32c61b00000000000000", "service": "00000000000000000000ffff8b63ad42", "pubKeyOperator": "98586f525158f4b4b79e532fe163187fb3fbe1f69d3e8ee1905e370b02e23fbd8ac31ab83f15bd6d6094221b1cd2a981", "votingAddress": "Kdm3ymuD3WmnwmiwFAJ1p9QtTQe", "isValid": true},{"proRegTxHash": "31802116c1029c1705b2728e3a75b680a4e27610c282e9f021402df852a05195", "confirmedHash": "197cf351ef97de2d859532c25c3586027f586a0d5676288e1700000000000000", "service": "00000000000000000000ffff2d4c8d65", "pubKeyOperator": "0e2123b2d5b3a8df7c4e76afc3d2dbcedaefd6b29d2e534e7f07e8ffa305e10febbf9a2b29c982c79bbb5c7b022e98e3", "votingAddress": "3uNy3LaDMoRCzXvAXkJv4rgSMLUF", "isValid": true},{"proRegTxHash": "659118231c2e63d10518ee4ce8266667e56f174096d3f7728af5b594ab78ff73", "confirmedHash": "beae829de12b4541bb5f7b1b56c3112bba87218693a3409e0200000000000000", "service": "00000000000000000000ffff9de6f175", "pubKeyOperator": "03d81b6295466acb3b3a07ec3d663f1111c6bf0341b42fc833fbc6d9291d8f11bd8c62cfe585b3ba77aa1398f2b805ad", "votingAddress": "ydprZsbuFtKfwnEWS9RcZDj3bma", "isValid": false},{"proRegTxHash": "f42faca44e9f99063758f324a8438718f7343714da59f721234eb08605fcd907", "confirmedHash": "e0197dbf426357ef1b224a7696a7cd6e80137d8d9ec61bf91600000000000000", "service": "00000000000000000000ffffa516edeb", "pubKeyOperator": "0f2fb231425977234f6c7c726798d41126cfbed2b82c51241a93f85751b40bcdcbc3d001bd5c2afc06ac03cd21637c86", "votingAddress": "47ow3b6CrS6B3cSYG33cDP6d1VqQ", "isValid": true},{"proRegTxHash": "5c0531ab80876c379891b3e709890ab13faa82b1aa6644f62931f673c546591b", "confirmedHash": "ae8822e3c5136aa711e1b33ef84dab59a61d38aed65def580000000000000000", "service": "00000000000000000000ffff2d4da82d", "pubKeyOperator": "1727dd7c52537110540f73532c873c89aeff256da538a93b67a7a3717adfe92baf8f2a5caa4d50a32fe7d65b28974215", "votingAddress": "CxuHvicnfqtKNaZvZq6WX5E9nW8", "isValid": true},{"proRegTxHash": "65c0fa59da600ea1da6de5c4b4f03d1810862f4666384034e965075e990cb52f", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff0360ffe5", "pubKeyOperator": "15e54e5e50cd0b271eb3f2bce37e3b149879db6d2afc870acbd22b449986b7bf0ef87af3ec7ab487a33adddc9972e46c", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "c17111fc9c9e3c07c2f4b50c534054b862c64857bc367502490ff01d57313c8f", "confirmedHash": "b00ee3eaad6959b29009c0fbdb8655e91e85f35f45e765f00b00000000000000", "service": "00000000000000000000ffff128bf409", "pubKeyOperator": "125c7c33baa0ce81c1ffdee23d5b7d7c07d4dc3a80ced2563cb647dcc83126d0a686857d7930dba5e35a8c65dd5fe465", "votingAddress": "26bFYkce44eDHGvVVY9gmP3LGdGp", "isValid": true},{"proRegTxHash": "e09a2e60a7c2b9ffb72d23cdb2dc2a6dcb6255569f360c1b8c2f39668a84d3c5", "confirmedHash": "f2e44ee6709b40cef56817fe7481c0a5bcda2e0967ab63ae1400000000000000", "service": "00000000000000000000ffff2ac28577", "pubKeyOperator": "041ed7aa6667ff44539bd796c8728da0cf7d1d2b32d193dc4b72013a29c0a8b4c0c2545b853e76105b269ff43f98a5de", "votingAddress": "4Wbe9aArZbN5PQgAmY2hLuMdrqic", "isValid": false},{"proRegTxHash": "b98350e7fe7bf0b3ae31a4937efbc2e4d5b39e2465a6b6ea4e50c0c1c31fa14e", "confirmedHash": "d30dbe759fd87f783253f34758645d4fa396f70b3c57a5300400000000000000", "service": "00000000000000000000ffff33c35b09", "pubKeyOperator": "0c861ca1fb26b8ef66ffd76a8b287574aacb748a0f306f6512e24fd38d6db5d179101921a8c734bd9653f379e9ef2d01", "votingAddress": "FjpaoMQXgVcEiMDQhuggeWG5Kka", "isValid": true},{"proRegTxHash": "dfb7bb47711266726767c9e65e4653968a7cc7477e65e588487b8d36eca803bf", "confirmedHash": "8c0bafb8d370641a342eef10896db4eea2f94c976d9829420d00000000000000", "service": "00000000000000000000ffffc11d393d", "pubKeyOperator": "0690575022c79783703d7405864927296abf0d90994441fb856e644a880d73d730db62e66f8552527b45c3e62b48a7e7", "votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", "isValid": true},{"proRegTxHash": "a4b3775739f0a05c79ea779cf208706b9cb385012f88d39411dda5de1d0991e2", "confirmedHash": "7b62c55954c53e68b7bbd139da5d9e3cb56cce69ea01fa9e1400000000000000", "service": "00000000000000000000ffff5e823bc3", "pubKeyOperator": "8bdac12950b4f93d4b18699b6e342d1f4f9d959049d1d80f5eaadc6eaa739b370c52a769c103c2d8ebf86ec4ffd07f2e", "votingAddress": "3C1BfFWwFFFeoTu8MoK5ygL8JUdE", "isValid": true},{"proRegTxHash": "b242c24a448adebe86e1e1ac1b82d8894cd9704a95b4364a90e8c2c85525aef1", "confirmedHash": "82397dd4d201c3238099ee971cfada44535db19a6bd104833100000000000000", "service": "00000000000000000000ffff2d4c1013", "pubKeyOperator": "04cef17d24336643be9f72bc91fb8ccc890b9b69c2db87e23f4b9e8a462be5530c3cd6c9ff337ec919148b21c8038a31", "votingAddress": "pLULHag98Wd81ve4dJ7iwJjXwJf", "isValid": false},{"proRegTxHash": "fffe1b7d5b2808f7927d1fae033d75dab7f602e04c1786d7cef54664b0a6e2f2", "confirmedHash": "4df3dcce2f17ed639a44b93b1358260b32b2c0f99ded0acc0600000000000000", "service": "00000000000000000000ffffbc2815ea", "pubKeyOperator": "90fa1a223be7089a366897ba0edf1af4ead03a1f43bf2312b0ba420d148cfe63aa222aa64565ba2d660f88795e36d0d7", "votingAddress": "27pXbFSGugBk2Aa75Ny3fTptXcuX", "isValid": true},{"proRegTxHash": "bbc2b1714b62b455b537df37ef78f850f921d89cd92a53df4595a7356e3269fd", "confirmedHash": "4463c0f1c718479578cfab09d0fc2a1b9a266b65f0bf0d3a0400000000000000", "service": "00000000000000000000ffff87b50845", "pubKeyOperator": "0abfde7128087fe355e845eba02d78fdb03f704853de0fca9cb45796d843d5da29c2e725b979294b739cad9f3f848029", "votingAddress": "3YS3refsBt4RE5hbkbaNtSXUqDru", "isValid": true},{"proRegTxHash": "c1c54705df7bc9381de6ac0fcad060b508052195f8c80d6a43150a7090b3c1ac", "confirmedHash": "bf610db7a292e9a2f83c409b20fca812e5eef48c09c45ef51300000000000000", "service": "00000000000000000000ffffd4186185", "pubKeyOperator": "16811b6a847f74f4c32e49311f9edf8ebcd7a7341e15013acca5637dfad63bf6e567c94a66cb75868e16ff5688eb82d2", "votingAddress": "3oyvMgpY3GxReP8mVKtRKpqPwnBr", "isValid": true},{"proRegTxHash": "74c95fd74434be1950b1c364d3dc58ec350c8295d49f28e624617bfdd49f2fa2", "confirmedHash": "983f9c8550d8f7b204deddd2903d56a70dc6777af90321bd0700000000000000", "service": "00000000000000000000ffff877dcbaa", "pubKeyOperator": "88c3a8a8b20e93ed7bc017f2768c1cdb123e2926a88e1013615c19cb0014134cb5aa293a6d43da75c5b9f5fd7d3faaa8", "votingAddress": "bVDvyd3vVnGpuQhmN35ApeL1HoS", "isValid": true},{"proRegTxHash": "253192e9a5b1a79c7f107abd0fe9082e44f94c879e639ecc53bf01101004815b", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b09a", "pubKeyOperator": "08351bc01f104d1538552ae1ff3398b18589d2abaf2a2eeb3b0e28554b843a44c96e63afbee7773507b18bde798e6dbc", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "6699b8eec27031ea5d666b63bfd2dbeeb0748bcaec89d9df6b17483c91ea515a", "confirmedHash": "8f0e38376d4a0f7ba454d7c496f888dbdc3553d68d6590623800000000000000", "service": "00000000000000000000ffff2d4c2e06", "pubKeyOperator": "92c34ed70b3b186a986a12c56c2af3088717dd4770ccb02913092249a990eca46f0f0c11d70315b59cab907b27484283", "votingAddress": "KJB3mBsNZvatkyCr2RQZvoW5gz5", "isValid": true},{"proRegTxHash": "5e06d3b6a27128e609aa1b5f69ffe054e01bea2d77fec9233f678aff4625ab4c", "confirmedHash": "2d27bda104ba76d022581ebdaeff6abcc49bf568137e72841a00000000000000", "service": "00000000000000000000ffffc0a907ef", "pubKeyOperator": "01fe2e0a77d6b65fd2c4a7e0c9232bd9dd9b414ca22d61247a262737ff5205a6dc442d7b9858d6380ebfd5fb86dead26", "votingAddress": "3MmYGHD4HAppHar6wWGh9z4faqwT", "isValid": true},{"proRegTxHash": "aac7f3dc2181213ccf723de5031213b177470b63ca7035fc21ea95f7dbda1b4b", "confirmedHash": "300cf6bd0c054034187f06f36c43cd04d3367a4d409430770000000000000000", "service": "00000000000000000000ffff2efef11c", "pubKeyOperator": "98ee9ca1e404e565ec2ddeeafabc0b9c98e8be83abc6212c91b94e7f50a9aff028841b6cb432d5e591acccb7eea3bf80", "votingAddress": "DrfcDN7sYaXVRg6GEEAxmWZFoCt", "isValid": true},{"proRegTxHash": "9bf2165ddacb6c14a33a400a719ec4b5da343a31bc6d9e7441526e72301b25e6", "confirmedHash": "3ffd6c0d3805980b5e7023f51667aa3a50dcaa9caff2ab120d00000000000000", "service": "00000000000000000000ffff52d3196e", "pubKeyOperator": "01a8b787cf3ab2b23131a3db682eee7b1ba81439b1e2e26dc009b61d6026eacdaf9a640b4c59ea93a9398eb64f3cabe9", "votingAddress": "2v2KrQsnMBEQjakUsNmtm3Z8KLPi", "isValid": true},{"proRegTxHash": "2bbc1ef46c4d5100ec356d31120d3a237df1f9f790ebe560ebd7ea0a57bd8899", "confirmedHash": "69004b26d29cc127a368576b153319a3c2aa6fa8ffa7e54d2500000000000000", "service": "00000000000000000000ffffbc28b6d1", "pubKeyOperator": "86347ae62dd2f50a21c362307a08fa175873700ff6b4487c6bf7c23feaf408508808d6a27a9cb74dbdbbe648e35ad762", "votingAddress": "3DeEqDccuXHAKuP8zEZV2H5WtZL4", "isValid": true},{"proRegTxHash": "e6c48a6bbefbafa18f7f564a653a151022638f908e95747d6ed00c28bf1749a5", "confirmedHash": "a50bf87562efa2654901452a319566baf44bf091b9aa3b900a00000000000000", "service": "00000000000000000000ffff80c7ae59", "pubKeyOperator": "0a1a2bd59ce188d8e33e61ae6ac8a017b0f4c36f8d0d1623c73ad431a9bf58e705e3b733211dda121afc28b715827d2e", "votingAddress": "2mnBDvDBD3BZ7rWEf6ymRRikL7x9", "isValid": true},{"proRegTxHash": "6fa36b1272a405939f9ad118452013f8501aeaa60e05a011bfe7fcb6dd45db71", "confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", "service": "00000000000000000000ffff50d0e2d9", "pubKeyOperator": "0fa167b43e2fa464fb1d3575841622de5b39e7e514e87a33706327186a30559ca61e7439df007cd0d3082df359c4ddcf", "votingAddress": "3vid4H9s6UHwdPTsV2giKVgNm4zb", "isValid": false},{"proRegTxHash": "a02838ba671b92d407780adbd7a52c4366ad5a8d76174bffeeb2acd2cc711701", "confirmedHash": "626b75940727a42a3ff86ca338d360377bfca58b10c2caf10600000000000000", "service": "00000000000000000000ffff175c35b8", "pubKeyOperator": "0f9ad05ba34e6b50485c055069fc10159d1134d1d0ae5cc40e639700a81757c748e146872147016bb659b0a1c856dd34", "votingAddress": "2osgkTHLT8QeqUjYKMijmoMTgRNP", "isValid": false},{"proRegTxHash": "174747cfb25de3b935d58d558d2928343e18eee50edb7bbf97aa2fb6f057f800", "confirmedHash": "d1b7942dd1c2a7cdf8b9e0a644ee6c605f87388a5e91bc7e0000000000000000", "service": "00000000000000000000ffffc2875840", "pubKeyOperator": "11bb080a4f63376d41dcc49ef2f298d44a273129ab6218c3f97a4cad31fb0354e6f12ae36b9862819265a104d468272f", "votingAddress": "2NLMsfaabsChx5cqVxTdKHuiDAs2", "isValid": true},{"proRegTxHash": "a107af811f521219baebe831836994710aafc77ba6e183005f6b503b2bd44db4", "confirmedHash": "ecb04c3af37751c64f5a9640de0f979645dfbb600d1d0a6e0600000000000000", "service": "00000000000000000000ffff2d20b35b", "pubKeyOperator": "8caa8081c2329a9b4ced52bde825dd77aa8ea753a32319f9702640ebbb697fdf9f27e0f19278cadde05ab9977d700da3", "votingAddress": "SUHQ3ZaXbxEhgXMoGqUYc6P6kf6", "isValid": true},{"proRegTxHash": "25e50a599f3b655b9a71e3accfdcf687289472d7b3b4e45cdd2d7f0a74aecf8e", "confirmedHash": "2ce317ce61c7751e827abc118c9b909bfcec97f530ca758b0b00000000000000", "service": "00000000000000000000ffff2d4c24f1", "pubKeyOperator": "8d84c2ee7b2b3053a7ac9da9db0f8bdf6c74d1d1f3374bab8e4efd0a1bbe4abaac040a47dfc9e954ea53a8e115ce748c", "votingAddress": "3TKXD1sUsC2pB7wrxtzGHSD9uBK1", "isValid": true},{"proRegTxHash": "be1cd49a02a271e67b02828fbda1f157e2199202f7d545988f226192cbd2a810", "confirmedHash": "b381121d729333671577b3a98afcfeb73f6825d226880f860500000000000000", "service": "00000000000000000000ffff5fb39821", "pubKeyOperator": "985a629d10599e6c0a383d3c81be3e78d863b84d6ccf362a94f1dcc1574317ce93d33347fb70ee5c550083a1e757f7b3", "votingAddress": "4R8caxXTr9GrJ1kVZc9J9PsGNqGj", "isValid": true},{"proRegTxHash": "ec1eadf879ad880ffc27c1cc019b1b72dad605004d1194b885e22a7186a62704", "confirmedHash": "5673b695accad539ce8112ddfcb3e54a9c3b3de90db128320000000000000000", "service": "00000000000000000000ffffb23f798f", "pubKeyOperator": "0d7d181671e80bbf5a99138174fc7f566fe884bfbc781d552cceb34c6c17f33d81e6b5f72895961903fd8ac17437ff1c", "votingAddress": "49GV2vVomkvNQoM2TkLPtPKod9ey", "isValid": true},{"proRegTxHash": "aa5324d5e64276bc46c63e96160e5341925d81eb2773c8bb684ba610e963015b", "confirmedHash": "8f03f0966b3925e2b815aeed8d6b9e8d61d7ffbada68d8c63100000000000000", "service": "00000000000000000000ffff55d1f18c", "pubKeyOperator": "0f3c5db4d829b4279d3970f628e7567b79063019f722217e9f3ece39557e5626410990629a53916d8797fc772c7cf1b5", "votingAddress": "3eGUMcNTqz6QjwaEnVFLwHN2EiQo", "isValid": true},{"proRegTxHash": "0c571578443bb27eb1aaa51d6a9998bd62bcdfa3eac47d0552448d1649b8eccf", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0cf", "pubKeyOperator": "96e9e5444c3c7b894ab6d4ed893c9c92ccacad63c4ea8dc784908b7a23ab14d1b45b2fd2e638946da2d7efc29c4ba26e", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "55e08f5196cf0da956b8803a06b766aff7414719b3690c44e509d84c540087ef", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d5209d", "pubKeyOperator": "0f80b205639ca3e8308260bf3c0ec5a9ce728865d4d26ab0a60ac61c5c5c5df91f717bbc29fe7b7d61aabe8c1ae8786b", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "a5c376bd4971f5f3dac956b275b7014705a8ae76478c803821e8567d3ce8097b", "confirmedHash": "a3e43c05adcff93d62c4c6011b7031345c56bd4f789b68ac0900000000000000", "service": "00000000000000000000ffffb07b39cd", "pubKeyOperator": "004b6db94ee1ff607d47abf37358e8540654c239d92e2f90b8c062b7efccc99eb96ceb48931d065e0ee48ba6ccad8158", "votingAddress": "oGhxDyqvExkx7gJkBkJzAFKDRBe", "isValid": true},{"proRegTxHash": "1a61080328789e3d4d026eb7c548ddf3696be3659fff826e8e21f5c80650531a", "confirmedHash": "be9d13082d16b5592ddcd122e903d8237887f8d3f06a12aa0a00000000000000", "service": "00000000000000000000ffff90ca6270", "pubKeyOperator": "976d2bbee9e630af2e76500145a6f659af32596f5e2ebaee1f59b92fdd249ce0c68b60501e807b6ad320e2443b43d02e", "votingAddress": "49P3qDc22DdrK4aTUjmnWFiNgfuN", "isValid": true},{"proRegTxHash": "2c9c0101c4b3c9f4ea9d75b869e6442c716211a07e4bfea1b238e37e5994b13a", "confirmedHash": "6307987dec498fd9f0831775e88490724ace2bc62804ee110400000000000000", "service": "00000000000000000000ffff2d4d5ab2", "pubKeyOperator": "038f5802b7399ab3940f5ea1f9cbd9549018de1303f6d5c672f8c982abd49472a7a81342700259f4c3d77fdac148c90d", "votingAddress": "4Z2ngv5Rh38KNrtJSt6rg1MadHuZ", "isValid": false},{"proRegTxHash": "2ec242b1a7b92cd630a665dc63b1aef6523ce9fa622e8c2197ccedc61fe51aea", "confirmedHash": "b3ee13734164ee6ecc081d91692d2a2dec5d03dd59ff171c1300000000000000", "service": "00000000000000000000ffff5fd86362", "pubKeyOperator": "891316d5b60aff94028d8459bf1f2a44f434f9788a3757706c8de8b4014af05e4621bdf09f0ea2635415c72e35aefa3d", "votingAddress": "2h52hE8d3zgoT1HrvrYRieSakvSt", "isValid": true},{"proRegTxHash": "49c2ab8245747358358cd4b54bebf85d59dab80accdd16a3ff8c9f695c924da5", "confirmedHash": "9ce1b6e471acb55342af2b9e13e04c0419ccfd6bf05a8b4b1000000000000000", "service": "00000000000000000000ffffa5e8a9f6", "pubKeyOperator": "8df043d04e0b031da58a99182235dfc471197dfabab87f4850aa8960962c7f9d572d7e20945e35f491b5570bcd59a009", "votingAddress": "3DtSd358Vg7Rsxzerrykz4waSvF1", "isValid": true},{"proRegTxHash": "9ba1f4ab1797de800234b7a242443aac5756253a5954b3170a92fec6efeb97d9", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffffc17a8da5", "pubKeyOperator": "001ba48ae3dfab528113e96b210fee15e0ccb9dc5f86cd2112224a98b005c9100e5eaf98945e4318120020f811eed4e2", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "dc71d3cf2c06dd189b4a3f2816c6c7dd10f43b89e2f2a256069d8b6dd5c36c47", "confirmedHash": "f81b002bfb781819e3cda2623aae1d1d0f63ebea4c3e81120700000000000000", "service": "00000000000000000000ffff55d1f12d", "pubKeyOperator": "8127f7d4e1f05981f37255219ef9bdce0b1d90218777e1e0ac336f57436ba83a47d9af9a16747871c46b2b8a8ef40715", "votingAddress": "4foNAhAQa7Kiy2W91t4DFJy7Y7u", "isValid": true},{"proRegTxHash": "a70869164490abe6ec0dbe414c9d45b335d59c35230075cdba8be983a8ed2d14", "confirmedHash": "d21144639d9fc7eadb6fd009e4124ca9aa0498b740aa93880200000000000000", "service": "00000000000000000000ffff55d1f1a1", "pubKeyOperator": "853a7f3c70508e21d5f95c1d12f50c62bd01b1d9dd83a632ba97427122dd24cde9160e75c8f055cb4133036c469c4939", "votingAddress": "TnQteS6wYKbGJ9QZHE8Qc1Ma5L4", "isValid": true},{"proRegTxHash": "d3bb2b83870b3549e65dd900249a9887fad81e80359ad4067486751650e47911", "confirmedHash": "946deb0023912f5f3049f88a458c8de07dbb2b4b1ec317bf0800000000000000", "service": "00000000000000000000ffff8d5f356a", "pubKeyOperator": "932386d091ad07fe18167772ca84a09ad6b8bbda0cb5eaf11cc49d792de46b3b794c9d14f669fbf4e319071dc1b92b72", "votingAddress": "5TfuArqKW1WVJBRuw2k3ca1C9Hx", "isValid": true},{"proRegTxHash": "c89f7c7e71b8d904d780ead8495cdd0847beb78bead5eed856175a4273dd12b7", "confirmedHash": "0168d103810144f5b44acb20a85dd50c1574003ba53032821b00000000000000", "service": "00000000000000000000ffffa747e371", "pubKeyOperator": "00f8d070885406a6421f378067ca65a7df5c33835875fe23c756f989af5ca7487d681edfb6d7e13661d46c7affee1aba", "votingAddress": "2baqxfjtzgTtfCYhJNYGATpyKg6z", "isValid": true},{"proRegTxHash": "b83d635daabcf2562447086a1277d00f96d4bcd68fb623695945f664795765a1", "confirmedHash": "42189914507dcd7d37ad8a5a524cdda6303f686de6868fc80800000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "266eQenZPJyqzqp1g4njsKx83oUg", "isValid": false},{"proRegTxHash": "2c73160317e6701cbeb3deb19eb1942e117a3268ba6a8bdefc8f7283d26c05f0", "confirmedHash": "6b501d85a5a8e6f22fb8598823764df4f198e94c49d159191900000000000000", "service": "00000000000000000000ffff59280423", "pubKeyOperator": "893095a58f70dc56f1452cbe37ac1235e41c689b08215080a8c79fb636dbdc5676b28a1dfd3c92bdd72363df563af664", "votingAddress": "2a4dnD5nSoE94hgza2zhQ3QJWyft", "isValid": false},{"proRegTxHash": "ca05c0074c3bbbc901178fc968e5936bfdb96a6a6bcb6252dc7831a76012f438", "confirmedHash": "977dab223a5cf55554baf7c2a98d1132b2ba8ac44ea56a511700000000000000", "service": "00000000000000000000ffff3353bfd0", "pubKeyOperator": "102ebcca1868bffb4450a4b683b55640bad85c7ec4993332dae7566bec8559805f05200d868aea614e666c4b8526f8cb", "votingAddress": "pw3G4kFJoRrTropzKudhhMimiHW", "isValid": true},{"proRegTxHash": "d4955f6dca73c839d64640fb3d0014288dfaf0df4c2cd08630a3d517209e0b18", "confirmedHash": "b6f653632fbd544a2d38b2d5040bb9fa9bb89a02c89c43401a00000000000000", "service": "00000000000000000000ffff2d4d2876", "pubKeyOperator": "10d4a334b9f032f196660052f911cbbf6a847744df83481ccd833b0e40e55ab4f86be22979ef4f69541d45a8719e27e1", "votingAddress": "3Qs1DD2ttwhmmVCcEdDKrp6CnUen", "isValid": true},{"proRegTxHash": "d7cc6503ca24169190034953c21bb38589a76f1473bc641bd6bbcd76e7e6e61d", "confirmedHash": "bf1c10af69a3614ffaae696f4153ff0b74bd6b71d5eee2480b00000000000000", "service": "00000000000000000000ffff0509ed21", "pubKeyOperator": "874a4030ed11f5b0e8da01c74828befef03fe961c7141e2de5ae1d76a7199571eefd7935201b17bed667a88b3e107da3", "votingAddress": "3iumGo9SKnzk5MoSctiSU3Bijgkm", "isValid": true},{"proRegTxHash": "db2729044341c32852bf809aed9909094348cd1031a14b1b9448cdb2faf64abe", "confirmedHash": "147e19c4f9babb98defe321d226afff4c3254c83bb993b411400000000000000", "service": "00000000000000000000ffffd4186e20", "pubKeyOperator": "8b87fb684d432b19f583f0a3c1f52fa5ecaefe4690190219eb44e2150fa1f9fce4ed0951ddb2b82d25a9116b0f792026", "votingAddress": "2mPCYQWhqQGXJa15L42ceqLTrcdu", "isValid": true},{"proRegTxHash": "e7dafb650ea92b6bcfcefe1b827d55bbbd95bec46f48674b044a09542ec0088b", "confirmedHash": "203b420d0f94416a61ace28aa860ca47487b444368664fc90d00000000000000", "service": "00000000000000000000ffffb07b39d4", "pubKeyOperator": "8459a408b35e5094f210d9acb79835095aac1b4bb8bb652320ad5143636c7b7ae768a1a363e5caf96ce0cfe14518a81c", "votingAddress": "2jekj3dTGFshmuExhFnNGLojMRCW", "isValid": true},{"proRegTxHash": "65a155fdc7d936365eec5a9b3c084840378d4dc82be1e29ea2176372f99cec94", "confirmedHash": "6d0dd7ad91b4487d52698d3da54b944edee3dfc934a3b80b2100000000000000", "service": "00000000000000000000ffffbc2815e9", "pubKeyOperator": "105fa81b3df254a135b3d5a03476e5129cf5aa032e3a2aefda9920deed648a5ccd96999c270edabda333d5f4a98f0e29", "votingAddress": "YBPDrAc7Pj9q1kE7LwdgdeyoMEh", "isValid": true},{"proRegTxHash": "d35c6f9212c5d81d506ac9114f30b5ba5fd125f54205968f65b9086eaa1c3ac6", "confirmedHash": "60cd0b3dd596215d8df49cdfef863f3f5e2f1dd23bca021a1400000000000000", "service": "00000000000000000000ffffae22e9cb", "pubKeyOperator": "88b4342a1c9996f56589cf46fdb7372b37a0dcb56252acca3c56e17b87eb21d6d2bffb3a27fc641bc98f2574762f6bf4", "votingAddress": "8uPPM86NfowQsHFMEyyy5mEGX8y", "isValid": true},{"proRegTxHash": "bd5b1299cce29340e1dc80671118c08ace7077d24a1a818b304001334902644d", "confirmedHash": "8ed3ccdf0270eedc54c860fe76c6f3ed5e05ce964c0312a10100000000000000", "service": "00000000000000000000ffffbca67237", "pubKeyOperator": "976420a5027143213de79e620093b01e5188d27fded352a472a97c653048d67ca6fbd649ca3b52eee37fb11525a9004f", "votingAddress": "43oSB1wBSZaso5P7SgZBUp3NsNYc", "isValid": true},{"proRegTxHash": "d0f0238f26414de57916b0657b3df0309332167b3b1dd65cfbd060890ee36f93", "confirmedHash": "e11b6319ba1c8de44128e93cf56d6f8b954cd0214ace17122200000000000000", "service": "00000000000000000000ffff2d4c5c56", "pubKeyOperator": "0abd4263bbb51f5036789f40a93e959a7118858e165ff455207cfaf431063df02cb1ad9997790d19d37c797d4acd0f8e", "votingAddress": "3DRyvSP7Bef2FzDWvAYS5A5n4Ctz", "isValid": true},{"proRegTxHash": "2937b5b87be3d826063145e644fb130b25c9d8f33858da5f625eee6f541b8b15", "confirmedHash": "8f6e99eb86aac24eabf82bf70ef5634b567ad27599267aef3800000000000000", "service": "00000000000000000000ffff22e7de60", "pubKeyOperator": "11b3b0cdcba3109509204ee0b8a1634bb42c668c298b3581d09acbf9481f70cfa42f1f76670002168c2f58a0790b3e84", "votingAddress": "BdDuqeXZWjxBW3RF4xuixsbFfXA", "isValid": true},{"proRegTxHash": "aa20f9d22a66f1f5873020518c0f83260da0fa9e4dfa214d383322971f4b57c2", "confirmedHash": "c7ad62af8e01db5f4e139caaba77405518931cf0cf3a65c81400000000000000", "service": "00000000000000000000ffffbc28e700", "pubKeyOperator": "86fab62ae04e96b7e79ae7d0b60ae0efd9354fdf2bca740de0a1ba6f13b92f847bb224467ed485ac1eeb7367d60e9457", "votingAddress": "32WyGCaQysdQavK5uiiP1Tdfd4yB", "isValid": true},{"proRegTxHash": "ca8df1c1afe7ca84ee68c4fa41b875c2d417cebc59864c4f4e52aaeed7a6b7dc", "confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", "service": "00000000000000000000ffff6c3ddaf5", "pubKeyOperator": "0cc3e63623d7c4141109f63c0ccd7e4cb24c5743e2eb349a8ebe2b78d569c99b9796740192168dac8a2509733c803bbe", "votingAddress": "3ipNbKcPkvbCMkL4Xqhph6wHGq5f", "isValid": true},{"proRegTxHash": "aeb500ccc63a61d190031c2b70c9dd935cd95f1b68a155c6e620546835083f1f", "confirmedHash": "3ea62fc353bb2141f7140b1acf6b5f9e59d097698249973e1400000000000000", "service": "00000000000000000000ffff2e04a272", "pubKeyOperator": "8b2f6ff23b65c7754580b8f847370164bda07a51e240c336e1177ac594a22cd667e4a827dac2552f147f5af9cd3e0d14", "votingAddress": "47qstSVJupP1JY4iKWeAGgTHp4by", "isValid": true},{"proRegTxHash": "52caeddf8063ae2b139654f9859330418f4827718964d6a8697c6f81ab4974f8", "confirmedHash": "c58971671ff2e5b2629c64cf449fb208b7215008b0a2aede0a00000000000000", "service": "00000000000000000000ffff52d31508", "pubKeyOperator": "95f907ffa24d7af57142fe3bcb144dd8d21ecdfbe9f67842a3308d32c18bd9bc11f2c8b259dc1fa659193ce78cbe9ce4", "votingAddress": "3Yfq3fqRp3m9516YrZ7QWcRZSHx2", "isValid": true},{"proRegTxHash": "baa893809afe8cf282a52e132017fd847a3ba59c847b6c5a8cbc988cf336bf3a", "confirmedHash": "3f7fb551c4c07dbf6557a4d08f8bca91312848c61c3e60031a00000000000000", "service": "00000000000000000000ffffc2875b1b", "pubKeyOperator": "1070a8587e86e512e56d191453a4a4a6f46b49c437d8ebeecdc635c419733e9fd6dac549d98f0201183ff1dc368dc612", "votingAddress": "2VnZY8ArUscSqT2d3FfKCMhYwc6s", "isValid": true},{"proRegTxHash": "e6d291673a34b691b55a49f8372d8a8927b0a02937fe6376afcb482a99c691a9", "confirmedHash": "0bc078ce428be1535fec76e3a92fb10ddb7fabff74d740b72b00000000000000", "service": "00000000000000000000ffff422a7155", "pubKeyOperator": "82f028672d3def392c8d983a1f27166cd22e3aa8be11cee7640f1ab6e64ed036b1bbe34dfb1651be1e6128ce5edecd73", "votingAddress": "36zPLZ5RpNwhvZDkzDMxobbYN7yo", "isValid": true},{"proRegTxHash": "c371510abf39a977b3f6c8f4e05fa63d3815ef06c2ef0344320bf57da9a787ed", "confirmedHash": "7a7a3ac281148516372fde4bf9c7f599c3c9318c7f85f1a21b00000000000000", "service": "00000000000000000000ffffb23ee220", "pubKeyOperator": "871817d8735e89d425a2955c042368a055f3e553cc2fc978db8d4fe342eec48e0ac2e1210ad6a1d47dca30b7e671a8f2", "votingAddress": "2HhJd6bpirJB8ZH61CE7VqoZbC8p", "isValid": false},{"proRegTxHash": "bc507708fe200638e3cb7b028065c3dd3194a720347ffc9378f27fe414abf0b6", "confirmedHash": "176dfeddb0af0af859adce10b1eee08d4369bdf4a8b60f390c00000000000000", "service": "00000000000000000000ffffa8773215", "pubKeyOperator": "83b9710f107574854701a31b3ccbc858589884b2650a578c4358a86b8d3e9b41e945b5a0988a49db474f14cec6d0392e", "votingAddress": "oWhSY1GCSgvCPYpZ7qSMnkCeEsK", "isValid": true},{"proRegTxHash": "17b5ccb13bcfb7a7fa9e0f7b1082f49f4df66d5c6e7dac4c1513450de8cafd34", "confirmedHash": "ef5299eb5bf09512e43079670c161a0cdb643765c46b88f70a00000000000000", "service": "00000000000000000000ffff050243be", "pubKeyOperator": "0384b638a81ce65256e30a33b9cb2639c7a78c4d3db49672f15990c78ef4b4ea9785556d72123177ad596747e998593c", "votingAddress": "K6UYjKpKBEfSemGAAAY3gQGTc6w", "isValid": false},{"proRegTxHash": "4f72ac36f7baad7092d1f5bcbe4e2777b251f38193ebfde5abdd7434ca8ae23e", "confirmedHash": "2b71581efecc19b740131639246f861b2ef579ff71cee1fe2200000000000000", "service": "00000000000000000000ffff52d31590", "pubKeyOperator": "862494f2ceb4836e7854b3f52db016e3df370df31836d2607e592fbb47ef46b9f6b54919f15347355063694a9b94bcc6", "votingAddress": "oGs5WxLwrWXf4bnwAqG6qospy2E", "isValid": true},{"proRegTxHash": "59e814f2f2267ff288a5ffc6c47a8b20727a7ab4a47ce512d308cdf609701c6a", "confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", "service": "00000000000000000000ffff52d31584", "pubKeyOperator": "9464a73e39e0fc49e40e5de652848b74cad859c21c61311bfc366044fcaa5a4af5884547b9ba2ff80e32995c6443f30c", "votingAddress": "2sYU5hcZyEt1DMkUSBppCR43BUCV", "isValid": true},{"proRegTxHash": "5f2c5e99f8cda2ba075c100d0310d3be126f4ffd80dbaf919c25a2984ef10915", "confirmedHash": "911983b695ac84e65c7c2eacef81c22da70aab1b0567c2030500000000000000", "service": "00000000000000000000ffffa87757cc", "pubKeyOperator": "8d630e590710227707903890ebb933e2c12cacd477f689a258cc2bcefc481ada7513b9e8a11878481f8aae36fc278fa8", "votingAddress": "3kSk8rHi9hWgzEYDKFtAGmNZFzfd", "isValid": true},{"proRegTxHash": "c7dc08177ff574de485f53033728e31156dc6aa009f646fe4801e99d653eef11", "confirmedHash": "f4ac87e59d7042e134390ab9ab4d5e0d2e7ded03af7638d21600000000000000", "service": "00000000000000000000ffff2d4f1b8e", "pubKeyOperator": "91c6bb97621b71419539818e3bfc3362bc152621e4fd4958eb3b3446672474df1ac0df314e6dbddacbf2076b4d53130f", "votingAddress": "4B66SLA36Em5oiSha3HJZHdzFCoX", "isValid": true},{"proRegTxHash": "581697c05930f900013ccf74d208dc347263797ccaae7c31c95c2b58675b8b0d", "confirmedHash": "5b4ac203f78fd66cdd775fc4861d430dea72d7e1cd6981381c00000000000000", "service": "00000000000000000000ffff2e04d9f5", "pubKeyOperator": "815c11b25df82a3d2eaa39ad2fc11fb59f40069eaa9666ab019080f078551a0ad92ec0ee156b4ee7f18eb914343f6aaf", "votingAddress": "3rPKky76WvAWaHk6XFf84BpEJX6g", "isValid": true},{"proRegTxHash": "8e2c0e730e6d11555e75d0406e794f99cf71a3d903ad25e8907d68e67a1beedd", "confirmedHash": "b66ba86a783f8d88a44c9cea9f9835cdb3ce2d3a097a52002700000000000000", "service": "00000000000000000000ffff2d4c2b57", "pubKeyOperator": "13ab17fe8cf037cdbe142efbf26f07fcaaae27a9248cc797edf6b09851258160d06d67450ef784f94b890c9eeaf1ee08", "votingAddress": "2yo2pZP78c3imgveHv1Vik4fjidf", "isValid": true},{"proRegTxHash": "50a17eee7f2fa90c1fc806d73999cfbd97079669c11d89ee64b520ad22e6d574", "confirmedHash": "83e1d3406fbd19bdbd0ef441a5e820c0be26f1c748125fd61300000000000000", "service": "00000000000000000000ffff90d9f711", "pubKeyOperator": "0c5e83da7a4c4438220127b6b2ba97b028cf6c8f1dd5855b2cd59181a939043fa3076ec149e38129864e13511336aae6", "votingAddress": "2x5VZNDLk77r4hngnxG5cp9pcdVX", "isValid": false},{"proRegTxHash": "9da2495b13474fac49f9353e82e4e22e0fb26174095a0692dc5e15358e640a5b", "confirmedHash": "ab5d8290124e5fca0fd048c8ca1f4feb4772cefae8feae0c0b00000000000000", "service": "00000000000000000000ffff55d1f286", "pubKeyOperator": "03dd8e4c604e3e02813e94612a0b1a7b70e06366a3dd588a59563ee0cc6af804d308c2028cb9f50a5e142f05c01ccee0", "votingAddress": "4X1UiMnJM6GpwD7RQpL3BTUQ1ABq", "isValid": false},{"proRegTxHash": "73d198799f25116c8d0b7ab59063698e7537c87c1240e408152e3240ef16100d", "confirmedHash": "b60c2dbbb213c99a236e1f30c1d9f41b204f0b13b294c83d3300000000000000", "service": "00000000000000000000ffff52d3196b", "pubKeyOperator": "97970798364768872bdef29bd6cb817ab10392e52dfcce325c95e4ba63012f8a45a2a005b7eafdb6ca689c444c3a8218", "votingAddress": "qFiviwWJMqsuhCa1XHuFuLpNmDv", "isValid": true},{"proRegTxHash": "45286e38031c2532eb04d709459f337310b1881f85a89e14b68fbe6c2a53ca32", "confirmedHash": "fe6ecbe1ff264210211859eb146ef81d02b104dcf23c878a0200000000000000", "service": "00000000000000000000ffffb23febc8", "pubKeyOperator": "0fa2f91a2b95f5ed862cf739fe01848e530697a430ca79af994c0f09be5a741324da97ea36739b579dec9510328a365d", "votingAddress": "1Kq2B3RsNuyYSSqGsCWS1iTq546", "isValid": true},{"proRegTxHash": "c809c5abe9f96212c4aaf801c886550d382e3807f20db6883db14960faf174cf", "confirmedHash": "ab2c38a7dbbfd122777dc31eab0f33187a760579985809181300000000000000", "service": "00000000000000000000ffffb23ea612", "pubKeyOperator": "054447bea5723e76328040f50b74897e6b34a2b28fe547675a3b068553f3536771f0af89069455d69d1850192a7b193a", "votingAddress": "34Hfimq9uFYifJxoD7FDJbrhUZpr", "isValid": true},{"proRegTxHash": "4e85069c819f2338b84918cc333af4f339f83d07dfab0f2d7ceae0ae3c153617", "confirmedHash": "6e536cccbcd4ee52c421bc42fd8e2722276de1bd7c0382c51c00000000000000", "service": "00000000000000000000ffffc7f716ea", "pubKeyOperator": "88784ac62ed07a457d0cc4ebc7359365442321e5fad0d124cfff4539a13f6f3d571fd57345202714b968dfb00ce3a8cb", "votingAddress": "2PBsiayuFVpDK4FKXM45Pa8LUfBb", "isValid": true},{"proRegTxHash": "6a71cf35ce9926ce932af217f2adfe2fbbd90b62b159d1530f52ce1bc99b0b68", "confirmedHash": "4d0632573d258c4528713a8b662dad1d972be056bab0b5180b00000000000000", "service": "00000000000000000000ffff5fd87e27", "pubKeyOperator": "994c10c2b3fe48e78426d11fd7e03162e7d69a55a2e09c28350b0f2c54c4719eca03cb0f761f96aea67ef7e20308d9ef", "votingAddress": "45CdhnDZoibRYK9YnCTaoQUB3nZx", "isValid": true},{"proRegTxHash": "20d596c88f6d42360bc218eb4ab2b82df3ed5ebf4f1c1d77959c90f0838acd84", "confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", "service": "00000000000000000000ffff55d1f262", "pubKeyOperator": "17e753432df9c2d6db0e3d6e0876a2f5ccad0650f1e7417040526c5e72958ebbece4612902566c7f846a4f003e28d9d7", "votingAddress": "3vH3UDKYszCXdKf7Smj73tDeiBFm", "isValid": false},{"proRegTxHash": "57a32576dfcc8a89f75be0e55dafeb82db65eff7137538b737f29d75222e8090", "confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", "service": "00000000000000000000ffff036187a7", "pubKeyOperator": "07a117fdfa831be028c1c45ca642b058b1b5cdbaf757a0630f677e14a2cf382a12475862109335657a55f296b69221f5", "votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", "isValid": false},{"proRegTxHash": "a14f13f53eef00a0b4305b5c6c6d5eb464b82320de00802558136b64436aa324", "confirmedHash": "bb22347348008ace5e364d38cadde18ba3aabc5571d095ad1800000000000000", "service": "00000000000000000000ffff4622c61a", "pubKeyOperator": "88224ae1a2a6ed639730e76969d8ca970cbb28e257f1b9e59f8b3c6d9f10e11184036e77bb3b017cafb0c9dda6c0c4e1", "votingAddress": "4RxZuRzL48NFw5XzsT89qY3zMdT5", "isValid": true},{"proRegTxHash": "98c84e663bd5371c615e6a008f335a38c400bb7cb3bedd5a88b43a61ae5f021a", "confirmedHash": "562d29d7abeaa6f6649e7c9d60b4d31bbb684e08c26560912e00000000000000", "service": "00000000000000000000ffff52d31999", "pubKeyOperator": "893da39563a94759c7acfc7b02d0f4c16c9bdb503c10888550360c54e54d72cdd531a9be6a4161b128d7ba641bf3c165", "votingAddress": "47cP53MkzTWp1Hf84pKCkmQcqT8e", "isValid": true},{"proRegTxHash": "2114d548fc9c760e1821309edd3da011cf26ecb75b8f485118dbb481e770368f", "confirmedHash": "7349f0ddc83591e1f854e794dc2cd575a671f0ab66b81f522c00000000000000", "service": "00000000000000000000ffffd1faf267", "pubKeyOperator": "9750bcc80614ffdcc61516e2bda13b5d9f2e925935794c91ed8a6496cc84409ffec86b56709aae0073486270f204e2f7", "votingAddress": "sEUPrei1xj92b5Ttko7tMruwunA", "isValid": true},{"proRegTxHash": "a54e79fb00dcc46a97414b16c30582e7a99f52670b11af1f9d59d7700056322c", "confirmedHash": "6519384cf40a3ec445492ac64c0dea401893a0c3935115880200000000000000", "service": "00000000000000000000ffffd8bd97cf", "pubKeyOperator": "07ed79266f09323a5bbb05fbdb145224d2b1395cb3a12b4141d92e721199cfa52c2f2f5f2af72df436896dbd86d52fb9", "votingAddress": "3zmjWKr65fZ6jQgEuG1pYD57rP38", "isValid": false},{"proRegTxHash": "e770ed50e9ca85e366220f38b713cb77dce34d3d97a757d2245b525ab794345e", "confirmedHash": "4060d58ba59311d494c41bfd495921b6168ab067e675814e0000000000000000", "service": "00000000000000000000ffff8b3b26b3", "pubKeyOperator": "811e7e9fde3ed78cf846ebceeac941e26f8e022c532cc2e09b7261183ce5fac1243427d1b0178fb32e989152751a31e7", "votingAddress": "3LCwY6hPzeeLRzt7gQxnUjKhbPSs", "isValid": true},{"proRegTxHash": "d1b8067c9206ec3798c7cb127825f220d86f98178ba7d419d27d2b6eb058cb57", "confirmedHash": "ae79d2df536d7e5cb14e79a89a4f8d31e9b8662bfb79e9300e00000000000000", "service": "00000000000000000000ffffa12352b0", "pubKeyOperator": "892fc0e02bff6e41f119ddb6f7f0d475a2721f101a26830db026681383fbbfab0cfa488473b51f511edab979ed915b28", "votingAddress": "4MTycn3aPkP1inHzzMXCP7u7TTf5", "isValid": true},{"proRegTxHash": "dbddabbeaaa8dcfde71f3744b05ad18860ede670b8c47acd402683295c8fad45", "confirmedHash": "547d8591d3346ed972218911803b7e5670de5bb5c5379df70a00000000000000", "service": "00000000000000000000ffffcf9ad69c", "pubKeyOperator": "822299ae6dac2edfe9aa7aac1fecd15d509f6cdbe174a5bcdcc206e6c7465a34ff148dcde6678684b5397bb3139fd928", "votingAddress": "384u37RLW4AuZ7e7HeVyuztES7e4", "isValid": true},{"proRegTxHash": "437ecf5befa6d0f52da209f5a313825dbfc93c178f9fe66ac881d85a74785754", "confirmedHash": "b5ee91701b4de55eb4e6b46220a0e2cb88c64321f941a1941800000000000000", "service": "00000000000000000000ffff03d2a99a", "pubKeyOperator": "9585bbe7eca3096bab622c63e2b16723b88dd76a88c42eab8a10aebd26ce28c4a75acec6d3bf7312e88521d80c25b2a7", "votingAddress": "dWXGX9b85jsUTzQNVwrbXknd6En", "isValid": true},{"proRegTxHash": "493af3fae2468d05b8486ac3a9736f01294216fa1eb8647431e63f6ee455c698", "confirmedHash": "35a7b631fdf897f6c4456ffddd21cdd31bf21f3110c5866c1700000000000000", "service": "00000000000000000000ffffb23f798d", "pubKeyOperator": "069abe744f936865dca1f880dd8747a48f42e4eea01e55c37c549656d2b66b0d21c5d9f9cc8233ea84209f1b38938a8c", "votingAddress": "yuSBmRgEXhbUMui12nuESaGPTwV", "isValid": true},{"proRegTxHash": "a5561398a03769782b09c660df3ee9bc48641171a648bc75bdc0f127598385db", "confirmedHash": "57192262bf57f47e2e79923fba884a66817c00ff3f3df1cc2400000000000000", "service": "00000000000000000000ffffb23ea3cd", "pubKeyOperator": "96b8cb78267ab6d966f514aab91fe25110b1c5b8bcac6542a1f622152d289c9ba347dd75581b2ce6bebca24c30cb8990", "votingAddress": "3NXJj8VqYUtt7JfTe3gNQ49YzEtY", "isValid": true},{"proRegTxHash": "5e287849bb0ad19f632b7ad5d30f4de6d01ccab4e858b6a86c1510f51816ee47", "confirmedHash": "8e121e649f62b6664a4f6250cb35458426a19dd4809e31870b00000000000000", "service": "00000000000000000000ffff5bdbef52", "pubKeyOperator": "1203d660407aa2e3a1226759cfffaed6c126172ad97fb4305ee88a897c1a229b32b0d12808de21a1d049fa15be2a3b8e", "votingAddress": "4Qw1k1qBCFJExh1kR4qKHCLwued3", "isValid": false},{"proRegTxHash": "02f92ad24c92da6ebed71e1b50677f9844842e3f16ba20296b387cc4d46e3e83", "confirmedHash": "64d13aa784936400ca89aa252c7a462cf8e0eff18138fb231400000000000000", "service": "00000000000000000000ffffb945359e", "pubKeyOperator": "8fd05eaeae8698a2d2f0af1a578297ca6bd61bcb1c41ba1dc06db364cd79905eeb646c5a5bd3ba31f30a3b94fc0233de", "votingAddress": "2CEtBybRhm1tkSvQBJPiHzm92hKd", "isValid": false},{"proRegTxHash": "50789b280852363ebb0c01f4cdc17644b8ba608485ab952f9b5b0b8d4715bcd1", "confirmedHash": "e903a1ffb26fcaf72cdca21daa975ebc08f57edc97aacec61e00000000000000", "service": "00000000000000000000ffffae8a03bc", "pubKeyOperator": "86b1366ad8e29883a76591b6cad43e3c6448645c485f499405dd8d908cbdded4e0b73fc3a85f8f8de3a2ba418c87aee0", "votingAddress": "24HdWBzjtHUdw9u5vPBdNCQeuww5", "isValid": true},{"proRegTxHash": "e3e860f2bb79a41bb04bb2dd85bde44af710946a5bd6f13625d31764fc75e0c8", "confirmedHash": "93269107efd05ef732da33a4e7f6dee1c0c5ee01ca472bb21b00000000000000", "service": "00000000000000000000ffff6deb4172", "pubKeyOperator": "914ddd3e0982cd0354263f64dcd38e66a1a9e1d31d32a003795f0943d082e258f0777d03d0faa2f0d86279a0776d67c6", "votingAddress": "2iX8xVWwtKkgBfjFrwgVzsN2bNdU", "isValid": true},{"proRegTxHash": "ba2fb4a4ddad1d882ec2539de8c6f76f31dbef42c174ec93f20d72a6b8e4bdc5", "confirmedHash": "13e7185f32bcfa90b166165040737ff2db49a23c5a7abcbc0e00000000000000", "service": "00000000000000000000ffff2d209742", "pubKeyOperator": "9794c3d93ee613e7f0e546700e25e4ef8eb004c986c25731ac489bccdad0873e7ca86d86a1e4fdcd50c7035f0c722ac9", "votingAddress": "4TQ3kdv3ytTGVsPt2YnafeBVbvZ8", "isValid": true},{"proRegTxHash": "1cf0519aceec51ee479ad5e66f45b57b873793d9c08cdfde3d844666a5ce6196", "confirmedHash": "1cd63232c5aefe7a0039e0d8b7511121f867ae1c2bd1c3dc2500000000000000", "service": "00000000000000000000ffff55d1f219", "pubKeyOperator": "03d85dd2c2b6f5cd282faea6aac7b1e7b4a18f81fa5e0c42fa6ea9cbc4d3c2a504261961c83bef688bb7d13e0934a32f", "votingAddress": "4MnThcM5Zjra5PCPeQQGfj9UY5GH", "isValid": true},{"proRegTxHash": "a6e372b920b6a0a9ad8d9cc6de537186edc987c02c6112fdd1f00544de1e554e", "confirmedHash": "b2756b2180695f6554186d3c6be2580ac8bbd341490768141f00000000000000", "service": "00000000000000000000ffff5f5525e1", "pubKeyOperator": "929735a2089ea090d847ba6a337a8a87942462d4081931c8ce98348b6020c3fbf7a3fda2d373e2371752c4f22fc6191a", "votingAddress": "4Pgq2KnGBsxeuvWZzVvioG46D122", "isValid": true},{"proRegTxHash": "b5f5007bbae4bd0a0597fc2597ea69454fc94d0e397b1b2d16b77cbd9c87c48d", "confirmedHash": "43b3caf59cbc5331ce20c7c1be57c84ded106d611d049e4f0000000000000000", "service": "00000000000000000000ffffb07b39dc", "pubKeyOperator": "0abaea100e1ff28236f777cad46cfb80d5f2d60703fa0add5aeaa9d86f4a59be1b9c36b50a52b42f1c5990bb1dbbf22c", "votingAddress": "3o6AsQNsXWstWKkvU6hpS4r1j2d7", "isValid": true},{"proRegTxHash": "40eab264b2c9d3ec92d04fdf2657d0ff6a833e21500cd5b34237a32b46de115d", "confirmedHash": "7472f73f953a7a4371d524dc5f968d9991c186812496d4090400000000000000", "service": "00000000000000000000ffff2d4c9f72", "pubKeyOperator": "90db1eab3e75dda82da4b6d4ac3a8f4222f3fcedc849e92fe48d43a476fc030b57d7761d35bad591d422b1a013df1263", "votingAddress": "3c1ayv715re17cUn6VuFjKFcsnMp", "isValid": true},{"proRegTxHash": "2ad6e11ec3edd12357c121ace2b420fcabb2dbf50e869e422be0bdb720add38f", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d56d08", "pubKeyOperator": "0d1d89f1303897e493828fc09f0761f1a6da9ff1c9c9dfa537818c8f2dd3134dfc2fefe34ff438110d59ad6e3133a3e2", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "c822d376e9342b8ee34306dd50b570f78f65c5cb108c104e8b9396dc3cc9e73a", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d52ea0", "pubKeyOperator": "836ee8e039fe69ad6154c3a338ff5ce1d3094fbd2de2f517b79ac7eedb413d5e490d66167812588167e5f00ea6273ef5", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "c8a29c530f60f99c4969bf424e4cfcb472936677135272081b45b597b0fbccb9", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff81d525a1", "pubKeyOperator": "178fcbc9dd04c3f1b33e644dfa3ce9149a13f617be4846050e53c4e766f23d0cb74e698ba9d453f898028dc6a38bec2c", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "f025af72984e7b8c61f9e8311b3148bca6de8157290a52ee372e37a295f2bbe4", "confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", "service": "00000000000000000000ffff52d319ad", "pubKeyOperator": "01a4d3ca13d2576d7e85c3caaddfcfe77afe2a2248ef1ff87ec04cc58197b53fed435bad566c1e5264a70535412af647", "votingAddress": "2NL8pZxUJrfqFhCgDL2znYSTdmfr", "isValid": true},{"proRegTxHash": "b83ac5fc629b9d3a5edd4719f84fc80da3afea3d9fd151d15a08c1f6a7b93c28", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b018", "pubKeyOperator": "8a4a3a769c8346d7afd56e3cd2d91c5f71d5ed4fea107c85b88646cb412b65021415978d78508b998fc598084d351338", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "839b422eaf6d2a82265026d7e422ec98738687aaea862effe97f8a234715ecc8", "confirmedHash": "c1a888053c6f9193f87a2ed20a5f646d86d126aa91f0c3302500000000000000", "service": "00000000000000000000ffff55d1f1e1", "pubKeyOperator": "8d5d305afb360dd8b71a27fc25838624fa4ea1e5f6e3537946ccb65a6e266a41f208043019c40073c942e99438f2396f", "votingAddress": "em8ZArz5UDtYGhwCPJR3KEaEQoM", "isValid": true},{"proRegTxHash": "71924fe4875a3a0ba96fe101a8f7a4749490f3251fb41c1b3ea0827b84d43c90", "confirmedHash": "8a8cfc6076e4d2ae09ebf9f7a1978a5b9bb65d7d31f536430300000000000000", "service": "00000000000000000000ffff310ccbfc", "pubKeyOperator": "1639838c878a071f4a8ed9c1d381113b342a310508ee09b22cf34fac28857964ecb3490ab1c7e4df5b0e8b3342a235aa", "votingAddress": "34FatX8rfEud433PNudFrMb7NsMM", "isValid": true},{"proRegTxHash": "67161840a217ae1d79ba88b2ab207dada37152e67ff92673b99c5b4930117aaf", "confirmedHash": "3a84a96964f12b3df7f32cb9d3cb19ed1e3a5906ac937b632c00000000000000", "service": "00000000000000000000ffffbc28b483", "pubKeyOperator": "8d5b958452e5545919b574f69d11fa5d5450e7ec1094fa1b255f6c1c514b91d90751a1f779af5cce8453b15f5ccd6786", "votingAddress": "UpwmBcvXtju62ydPXiBZkn6MG7Q", "isValid": true},{"proRegTxHash": "c9ab99b679fd59214772074654617b2ae376cc0f1761c8fccb339237c620932a", "confirmedHash": "5ffdd2bb7d64319b9039ec2956e41d4e8698d60773913dc02800000000000000", "service": "00000000000000000000ffffa8775307", "pubKeyOperator": "877c8c09bdcd9d216f4a56dc3eff1cd1e9d8b912ca41147e1005022c8256e1dacba830312cefa5e25d74c5ba8ba1e8cd", "votingAddress": "32rtVBnz7AX63x8YfiZgDXUz7ADp", "isValid": true},{"proRegTxHash": "41f92408f7bb98bdde7ead3d9d48aaa70b4de2b097ebf77d39b62f6795a97899", "confirmedHash": "a0809ed2802d1e0e86020b46febe3f5a5145e96d188a78b90200000000000000", "service": "00000000000000000000ffffb23fec73", "pubKeyOperator": "0869d8fedf9732a7c72548b6598e4c0b12c9403b7a149ec062ccbd2256bed946c6195a80f2df71144545eebb07ee6491", "votingAddress": "26AYNEFn31kQ3QykyjoMQjT7GGTz", "isValid": true},{"proRegTxHash": "dcc429a5a3fb3cd6a95a8dbf4ee0eb1b61367e0e0b0875aed346796ccb05f69c", "confirmedHash": "29a154080b19dd46f4fc2600da3ca1f77ac83b0d96c7a6d11c00000000000000", "service": "00000000000000000000ffffb9248f0b", "pubKeyOperator": "919ad9aa930fc2cdafed3db371eb52dede4d14c9d170d1a75714556da791bc6973761ac975163488f258b988eb19d487", "votingAddress": "35u2ruDgN4TQ8v5jzue3L24Utiai", "isValid": true},{"proRegTxHash": "3c17376da9a97fe0ca0ac3e5c2fb437f84270d07f1652d936977d155016db571", "confirmedHash": "ae5f4abd5029b28c730d903c27198499c242300d5a6c412c0700000000000000", "service": "00000000000000000000ffffa747cf5f", "pubKeyOperator": "909c25cf25362aa298fded3f80ecc874526fae7438a681db092dd020aa83ffe3a929298247ec881a8adfadf790b0bbf5", "votingAddress": "2T74V2gKCnYGBAYGvMXTFycTshw9", "isValid": true},{"proRegTxHash": "376f36c233cc7fb330ae73d46a661c39b2342c36ff4d6bace593058ad772dfb4", "confirmedHash": "d257815db496ef0641eadc83297598ee298a5711365f6fc01a00000000000000", "service": "00000000000000000000ffff55d1f227", "pubKeyOperator": "14f950f3cea6f2cfbb8b701607e7ce3cc60df79be9bffae68af2bd3885443287a846da0247a7bf74f5840ac95b7bd9e9", "votingAddress": "2BFsp8uEWYwUDLLhM6zy2jfLeCm2", "isValid": true},{"proRegTxHash": "caa613c8e7b8370dad0d48f2998379f15a9b74d2ce097bc4adceeeae5daf8b89", "confirmedHash": "6ae1fc97f35f12bcdbc795195e82d45c822437c0a18c9a702f00000000000000", "service": "00000000000000000000ffff91831c44", "pubKeyOperator": "0d16fd9603bec8fabaa6ce2c304e39607af9563d3d52f1adfbe0cd5c7ba27fdaff402cfa16e5373896e88a5a4a08ca50", "votingAddress": "2PwFZBfYUC52PfjqHrrvQ9HgsPYP", "isValid": true},{"proRegTxHash": "259faa6f4d14568e7c334db6b33ba0d5ae105ad9d39fcae4bb2a36b72ab72454", "confirmedHash": "f6062d683050ed5ff55a87460dd2e79f7eaec0542a3dc7740b00000000000000", "service": "00000000000000000000ffff87b5084b", "pubKeyOperator": "022a44024a4c38cc690e2f9cef86a0feb2c94d119533822628ddfded2a5336cdb1a1a9dcb5b08dfed6538ca3f270338b", "votingAddress": "4JJqfu473Lz3TwESUnQ2YKX9WtEk", "isValid": true},{"proRegTxHash": "b50007d4f9ca53118cf5b6cf9d9daec5baf01a2213f1d32e68543d839d368542", "confirmedHash": "0c51cc801772f13eec460b2838fc07bdd4b37d91a23833050600000000000000", "service": "00000000000000000000ffff6deb4717", "pubKeyOperator": "8f72577c3f4fe70c1ed0880bf478de03b123928b38b44ba23e8447cca6bf73e0248a2a5ff15f5c2f09ce118717c8cadd", "votingAddress": "4YVfjM32a8FmmaH4BYdsqu8esiQp", "isValid": true},{"proRegTxHash": "c9c522b5a5484848a731e2ace15e5ae8fe1091e5a2ef7cb94ad8080983bad754", "confirmedHash": "288ef161a94c88c7d1b38c4cb691da7367845a1b61f0c8a50a00000000000000", "service": "00000000000000000000ffff4f8fba40", "pubKeyOperator": "80add6432eb38388f184df5ecb940a1c662c9203010a6820e490a21d34ac31cc084207e08e7f9cd1167882a6fb4b504b", "votingAddress": "XWg5yr6ojjdj2juqmgC4Mjz1eqx", "isValid": true},{"proRegTxHash": "6a0ede67cf4e31a99f3fabdffc8d09940bc0337a23c5dc9cfa4a9440a4a0ab17", "confirmedHash": "34e19b60aca9eb0e7815503de513ea081442c6fa6415823b0600000000000000", "service": "00000000000000000000ffff58630b00", "pubKeyOperator": "02f0d44432d1209e8ca102d33a900e89b023d0b934c25c8094f1e8c31f2815c73aec56a820d37dea31b2337433712c2e", "votingAddress": "3AgQzHVD3muY7KGfSEpzrfanoL9U", "isValid": true},{"proRegTxHash": "e4c19f3f143d4d95cfb7318f5c0cc98ad97660c97b02c3214afba4ba86dc65a6", "confirmedHash": "208e01f5b6cee5777f2395b622eec95e547875b11528498b2d00000000000000", "service": "00000000000000000000ffffbc28a31c", "pubKeyOperator": "902f6767a0b069c892b182802bd2a49d351effb615df49786374b68b278c4607722d07900bbdaa7e0776eee7024461f1", "votingAddress": "aiBGyTfF54mKdmytY6nwU4SBT5E", "isValid": true},{"proRegTxHash": "482d44751836db516f03c997682934dc762a13b79760ff506f38992a97885c15", "confirmedHash": "3c61ae16952c8d186402d85265698f3769d6c401cd41bad42a00000000000000", "service": "00000000000000000000ffff6baadf4a", "pubKeyOperator": "116555e6c331eaaa8433063e72a156db6abc745a89b366af0ae6e1a737a69127d5e18967d3fba4a72349dd04a0e754bd", "votingAddress": "3E9oTP1V5Jzh4Y4Txi6DsiZJhZmY", "isValid": true},{"proRegTxHash": "e19e308d4c9a801172b7194b6893092a9fe03b519f0b2801e5e161d4ad9c2bc1", "confirmedHash": "688ae93cec1678e70c18e3b1662cfbe909a7f1ca4ed829741c00000000000000", "service": "00000000000000000000ffff9f411530", "pubKeyOperator": "11cdc4aab0fb071345a2f0cc16d3421be26fdcfa1272dc4e3134a651de646952eaf2ce6a60f23f1264382bf981641d28", "votingAddress": "MTgwuEsSKpUTkPK22zX4KifZjwi", "isValid": true},{"proRegTxHash": "7bb6d912d5823807dec99584972a7b67e72146a49a63df9ac91fc4c6e4f1556b", "confirmedHash": "a60a6afa17cd22d28220fe527001b2f4fc0d1bc2b4573e191100000000000000", "service": "00000000000000000000ffffa747e193", "pubKeyOperator": "044f8182e26e389c83fdd19de9b0ae320f383e559725443e81930df749e30e98648527aacb98c6cc65732f5bbf6a847c", "votingAddress": "3cicynbnSzD5PKLaaWvGLgjKxsk7", "isValid": true},{"proRegTxHash": "bccb4fe22c4f27d09fd7860ae450f4bbb2874d5e32668593578ca4f9cff93252", "confirmedHash": "25bd785301c9628f6780d9e2975cd55541d1b060c370f33e3600000000000000", "service": "00000000000000000000ffff88f46bf2", "pubKeyOperator": "8075beee6ecd754cb8aa8dd07b8a60c7e9fc9e0e249ac11177dd75c64ecdc935f2be23f1f2acd71a1e669301c0378a2c", "votingAddress": "3xxseoW57pP3FWzGfPm1P6G7ijNX", "isValid": true},{"proRegTxHash": "9435fede7f31ceb50e4fa160448eab4308b869f3870f67c9fd45c93246b124cc", "confirmedHash": "b435ac1f7f74e1dec94c0cdd35b533db45344e6127c241ef1d00000000000000", "service": "00000000000000000000ffffb90535fb", "pubKeyOperator": "88ae98e67255dc20e1d13e716dc630584d65f675313f5580d4c50afad0fd9342d9a3cb76fc6290cb7a495a6bfeeba9b9", "votingAddress": "3v1n2CfNHeSUUBGyRRkRqKq4jK6n", "isValid": true},{"proRegTxHash": "c97c08d7d29f7d4e508ed4a968fd542ab5bc40cf1f2425ba64fdc7a4ae39778f", "confirmedHash": "a391fac6bc3f259ea9180b2a0e732cc68050565e5b7dd51b0500000000000000", "service": "00000000000000000000ffffbca65b39", "pubKeyOperator": "074d5f33853b1385b84bf6fb44d7cef81d593f3c0b640ae53adda1d28eb5770233d7fc5cc2c094c8fe454045e4af234f", "votingAddress": "3pZaGqZcYNDGYqGKXZSbzmmUSw3g", "isValid": true},{"proRegTxHash": "abee725dfa4fee7a7c2f917574685048f134e868a1dd0c7897e987191d0185b4", "confirmedHash": "8571c846b034755b3eb507ac5d5902d96da64996cae2e2395400000000000000", "service": "00000000000000000000ffff5fb7338d", "pubKeyOperator": "10afb4018f009b5700d7ba2f4a840c70accb413d5c47fe39db25ebbdedc7c6b2a2ad2ce36b1b12c5f2b74342d1e913fb", "votingAddress": "2CewdCREvrwaNpg4h46wiVBziH79", "isValid": true},{"proRegTxHash": "feb38d7b5c7e9306d7ba73536f44f3ff02f567c8f6b4d95f011272b4b1176f4e", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0d4", "pubKeyOperator": "012ac932e4d5203a8170304db0c0eb8e912feb86a9bd2900ae09d0e3db977de521d2d555b8d246111f2b8a17899e9165", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "8c3012a0489396c487d2cc33bd13337b61fb4db4b00c4858cd26264678a9ab3b", "confirmedHash": "089f43e4b31161cdd6e167a44000c40bf8042b184c335cd52900000000000000", "service": "00000000000000000000ffff80c7b59f", "pubKeyOperator": "8d288f79116300b43bc20a76282bd69f56b7ea8ab315c7efe65befc1054cc20e6dbc553344e8f2f26452c6f3fa81e665", "votingAddress": "3J4J2ZWmqF7UoEV6KrjT64gydSPg", "isValid": false},{"proRegTxHash": "6ce6c6edd904510d43c5bcf35004a5bc6a411300ddcd9314266a909094b2b7d5", "confirmedHash": "e95d32902bc5559381ffc9210091fb6a50cac040627e8c660d00000000000000", "service": "00000000000000000000ffff2e1ebdbc", "pubKeyOperator": "9447d4217603ef9879fa30427deaabe4b6d41ca6f3ea1e57e48e948f4c540e75263a4fa9e38f80f4d49cab5ba39df78a", "votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", "isValid": true},{"proRegTxHash": "a234144b8d8a5b5001b434058846546b99c6fdf2c30b567ba578e0d24ca21d1c", "confirmedHash": "a8f1e9a9d42e3af5bc29f9263d61fc554cfd8208f8e38a311200000000000000", "service": "00000000000000000000ffff55d1f202", "pubKeyOperator": "9268cd50f785153fe1d6c8ba91d6beb0bbaaec427ce06e2d03849a20b8c04c41ce04df275431a1f67d0f29c0ee414bc2", "votingAddress": "2cV6qV9YErcGqYEWZpMaEhLJfTMR", "isValid": false},{"proRegTxHash": "821e2c1b035cfeedc9a5f8b254e6e21a52f75adc86359defeeea1ddb1c553d3b", "confirmedHash": "8b76eb30d80f242feeb89b110b0e4c2217fa10d6f8e90d5b0700000000000000", "service": "00000000000000000000ffffa7acd1b2", "pubKeyOperator": "06a5488f4cd08f3e893b92d31030df6eedd3fa2cd2a0d061b0d0c4102ee5ec1e8063f02bf647fc570f4ec25b5a65012e", "votingAddress": "2JsRyf5PEeotYm8L5yrXLrefdZoJ", "isValid": false},{"proRegTxHash": "3fe6be7f8fc4a534655d04c0d0182d69d17ecaed99dc48e632c13d899d5f1c1e", "confirmedHash": "92fa2a77f8db22d00f00d8b8016c58ebba5a43c5635f5a090500000000000000", "service": "00000000000000000000ffff5e1794cd", "pubKeyOperator": "8f0f2886fcb55d4dfe40bd5f7e4e2b9d0993faae20b4dc4a7f18452e94f03b5eff80ad2035f929c32d0f0c3dc9865eae", "votingAddress": "22UDi4ansiX46SsgyEVNRUMZDdKC", "isValid": true},{"proRegTxHash": "5a853fafb04324c2cbdaa1be8b7723d5f9d28db5f93905b7851a9270b4ae196a", "confirmedHash": "907e6a35987aab166cf99ec298e0235f4c301cf570f4720b0600000000000000", "service": "00000000000000000000ffffa7635b93", "pubKeyOperator": "04a7b96075c675eda9595dc7d0243da8797e1b3948d396b04863cd03394fcc3aae73c956bdda3658a594f46f317794cb", "votingAddress": "2etMHGTwpKJbBSrNAeH2nr2dnc4E", "isValid": true},{"proRegTxHash": "3ea302c582aa589462c69cc527fb3e674a3b635fb13fd672e924258dc9585748", "confirmedHash": "f142219d724bdfab00024f3cbed54a68a5d2e022ccb528120500000000000000", "service": "00000000000000000000ffffc287533c", "pubKeyOperator": "0b0b692b968506c9bf38b44b0476e27967e95a660f2e786848dc8bd7a219d47a6af8de540df0d0981a990ec0aaffe22a", "votingAddress": "sgjsiJMwymE3XvhoC7KQDktbnZh", "isValid": true},{"proRegTxHash": "11edacbf9d2bb8621bed87fce943198117645cad10fbb52c346ff864b2339629", "confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", "service": "00000000000000000000ffffa8773e5b", "pubKeyOperator": "0707b0b0bce751f4db44a757ddf926ca00abc149f059360c06153ad68ea32c6c913fdc63d7b93ed4a1a05381cfad67fb", "votingAddress": "59YGJ3TEepjUZMzwjFQwSaBsb1A", "isValid": false},{"proRegTxHash": "dc2a2a7ac28085b0ee73e1dfe9ad6dd06cd89969e0b20b1706564f9369477bc6", "confirmedHash": "dc5ff6eb181a9bd7d34dc50462baa49f50e63210f36bf3551600000000000000", "service": "00000000000000000000ffff2d4c62a9", "pubKeyOperator": "190728b902d62d361f2f274baa3a1a11426a6499df61aad6abf33b4dc5c241e8aeacbf75c9a2af8891840c40a2fb5796", "votingAddress": "25Fq6UUTezZRH9174kpBrkVK64qD", "isValid": false},{"proRegTxHash": "24895bf77965592414bb9dbb170101ff4a630c2056936641d677435fd3bfa669", "confirmedHash": "1e9fda5bb5be9898ae2f0cba53fc83346a1f7117a941d4081500000000000000", "service": "00000000000000000000ffffa7b36dc0", "pubKeyOperator": "0b332f07d7ccd8f1b7346032a3247f832abd44cc9952eb0b37ccd3f4a1207ee6d26d0736a08528be05d2ac79c73b1777", "votingAddress": "4S6WmHLDw47g4SFCu9qHSsAefSEK", "isValid": true},{"proRegTxHash": "d70cf8ca85f804625a50e98d6e15dfc05247947e97d1dd8612ad618d7c723848", "confirmedHash": "18aa9110e74d54b5f1c77a38a7bad0fa4788e56deccdaf2d0500000000000000", "service": "00000000000000000000ffff55d1f1df", "pubKeyOperator": "02e4f3e0e47d11ee58ae58f9619f6a4b64fc34d4676b038d39a72a20d1e5f8465f2032b34d3196fa32f4eb6f40af1ec6", "votingAddress": "4fAVA4zdCU1hsih5kBpHfxMhNDP", "isValid": true},{"proRegTxHash": "b01be9add1b4221a54442843591d5edce7b16f86600a436e7cf409427d188136", "confirmedHash": "0baa995f52c1bcc104d0aa5b97430dba1e5085ab15d6cf682a00000000000000", "service": "00000000000000000000ffffa87757c3", "pubKeyOperator": "0b6b0ee296a3785d5374bbcd830dbb0285ea6eaacaf859b42468d358d427e1a48cb00e2be3e3c6c8a0f41958491ccd5a", "votingAddress": "3YESVAKrMSxJBqCSgfwxfKheifWr", "isValid": true},{"proRegTxHash": "96cdb3b866c8d64f8a8696bd590550777d3e1c8dc17e2b0e125ae7cc8d5c0c46", "confirmedHash": "7d26752c75ca92d8b13db175ff041164f54c4706aa9796422900000000000000", "service": "00000000000000000000ffff22e150cc", "pubKeyOperator": "15d90775bdbec51807e336402b7e08fb07fc2e3f8f58a38b66847a63cdecc055da18c5da60089206d6d80b3de55b7fbc", "votingAddress": "3MMAndpmkDZox6av1S6p7nNH3WQy", "isValid": false},{"proRegTxHash": "3a1b9380032eaf9b9691d85ad453c5dcda93c78dbb9f3d6e2ea6cedc6548c0b8", "confirmedHash": "0d6ff825887ecdd03bd039ee1a3ecd4b25f9e55e0d33b4361600000000000000", "service": "00000000000000000000ffff9f411149", "pubKeyOperator": "0f0eb755c6e3bd61943bdc8042d3f7bf8cd484ba2133b14c60c414d6d903c09bf1382899bac306281f190f3ecae9623b", "votingAddress": "3pfsqkQrqhZxDYXNYxbpDVaSdtJo", "isValid": true},{"proRegTxHash": "aa3a0dce554a70e1374cb9654bd4a2fe2be2cdaa1a9c423ac64c8026efe1d78c", "confirmedHash": "dd4e4c655d4cd47fcf67002a8a021624bc01e9244c5422372c00000000000000", "service": "00000000000000000000ffffc2875ea2", "pubKeyOperator": "9783b7462412dae70f3851814b19a12f334e123c86872d4988a5225641d6f621835c2774ef811a5352951399dc261d80", "votingAddress": "3vWRaPJwWL3rAKVCkhF5JV7VR3yj", "isValid": true},{"proRegTxHash": "81a59675bf8ac45f67822fd2056d4e8d0c606517b949b4739f0b2f3ca45d259b", "confirmedHash": "91081bd458a4062893b90e91df4b063730ff6aca504ad2230500000000000000", "service": "00000000000000000000ffffb280cf55", "pubKeyOperator": "1008b5cc5ca907c6aaa246fcebe7a4634e675ce8f618d24ba120ff5dcd92777808eeef3c977241564cf21e992eb670c7", "votingAddress": "WiWn8FBAMH8XV63HqnU2ueYhuzY", "isValid": true},{"proRegTxHash": "f95d78126785e8830e33ddc43b158360bddbc8f2f7c0352690ad9a3c225a683e", "confirmedHash": "c8fac7c25511b02ef6f8cb743098492c6b65d12e7f8611830800000000000000", "service": "00000000000000000000ffff55d1f17e", "pubKeyOperator": "0209765ae19213f5dea2c20c760a3948b51d8d8d4e78ce7c6b15f014d8546501f972986bb93d4f4cbd78b299749d1221", "votingAddress": "3AtcoofgfDdHdpCXuxgfUVdR98uD", "isValid": false},{"proRegTxHash": "717dccbace8307f4cd5272591030023a90e1e5170299a759c5ab995ecbc95aad", "confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", "service": "00000000000000000000ffff87b558c0", "pubKeyOperator": "0465d0bea81594f2b1b0920b6b13e756337c4aa1c8cd474a2da02ef6a9c689fcccc5d0765a791ad393d4fae3045c39d4", "votingAddress": "3EZwuBCAJfD7623Q3XSEw9Qd78U9", "isValid": false},{"proRegTxHash": "b29486071834a43b694fe7a91edeea62ede1230af7d826c12b5a103f4a149151", "confirmedHash": "da6c8f990b2b12a0fcc1be91739d72c981f0106e9575bb290e00000000000000", "service": "00000000000000000000ffffbc28b981", "pubKeyOperator": "14adb9dc7ba9379f76fbb3a221be50dc9841895f9d5d126712c9592ac42d40739cf1990f1252497d7db689c4a23c0b06", "votingAddress": "2Bwwz4eWigqjnbYtXZNSg2nJw4fA", "isValid": true},{"proRegTxHash": "e25b049dcda03cd9e6f76fd3cbd67a256a8eb25b5b67aa0c5e5a369120cb929b", "confirmedHash": "00bb141fbf1550492e724c4768b3b45da1a2430d84c2fd1f0700000000000000", "service": "00000000000000000000ffff2d4dfc79", "pubKeyOperator": "8088fddab2f572246b7e95dfcd497255779e567dfaa25099460c108b2cbfce7c1158024b25c2248b21deb85d457de129", "votingAddress": "ynob3PXWnrqdUdq6PzzSFq9A8uw", "isValid": false},{"proRegTxHash": "5c60def421324fab43218e450d89a38e9d21d3db3ce6b6ba3029a2c5465c13ad", "confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", "service": "00000000000000000000ffff87b558c8", "pubKeyOperator": "0c8abf222448ea8e62b75c22f2a3b8bc035862cd59c6140ce5992b7ccbf5e1b7a4053ef9fade4378f3e44e8ca32177c2", "votingAddress": "4Em9H4gMcAz85nhHjDu5iRGAHZ5j", "isValid": false},{"proRegTxHash": "204c5733526bceb68c4346f8c3b3fc386b274cba6949d7b9ed0f0c854ce9c164", "confirmedHash": "cc12ca4ee0d2ac8230d702969ae5de1342e44496d6cacec70400000000000000", "service": "00000000000000000000ffffcf9ad37c", "pubKeyOperator": "99df6b0d8513bfe63525039dd249a414b124cfa8c1b4b8b31f618f14e268477286b1e215abcb12c3c8f342543f563cc8", "votingAddress": "Ap8EtFDKe9NPXdn4ueF7t14V5du", "isValid": true},{"proRegTxHash": "658b676a4af96be2e2811d4e902aac82f012e33cc139e30c651614fafb598200", "confirmedHash": "8ba0c7b3b4cdd8902ddf210478eb89d6735236e2d8c239b23000000000000000", "service": "00000000000000000000ffffcfa74082", "pubKeyOperator": "87b9c5196071dfd0e8c08c0cba5cf50f07a2f6de8e9f6ca82895dd9ccca5bad1d8d76048f3cfe83bc2c43646476dea5a", "votingAddress": "3rSmNjWFzfUzBiEjYGjEs8v9vby8", "isValid": true},{"proRegTxHash": "b49a284d0a64ab178189e0e759af345905b5963084281d4a815d73bdfd820060", "confirmedHash": "85e9ffaf88c80930b22ad1042ada59a751879e549629cdf10a00000000000000", "service": "00000000000000000000ffff2d557548", "pubKeyOperator": "071f9c1cc27b7b7db4c3bbd3bb46e3c03d45c292ba681c50a48f73b0e7d6a55953b50500a63f4e272e28fb1db038f42c", "votingAddress": "HdU9u3Lp1tZj7h6WWfXioCiZZ5P", "isValid": true},{"proRegTxHash": "19df2d9d3e240cd1bde127d228c631a636a766c2f3569099a48a6a5103235123", "confirmedHash": "dfa1dd9c53ce5af9bf0e3a130f2c54504350080ce92fc1be0600000000000000", "service": "00000000000000000000ffffc2875146", "pubKeyOperator": "105d99b8e61dd1ec8a58ef97626c33dc298a711df8704a4b9e36b96e640e3bd1db58e464f724a43f1dc723e1d29c5954", "votingAddress": "Dgwgz62S4LAk41CW5bM1a4ayC3C", "isValid": true},{"proRegTxHash": "fc1f985d703d5f4c517386b9c45690934001d7f6934b43a2e6f0445b8a661a48", "confirmedHash": "a5ccf38b6d82e9ca0f9b35be3fcc23c7c5868528d2ba622d1700000000000000", "service": "00000000000000000000ffffbc28a305", "pubKeyOperator": "8423478ef4819061df464c896549ac53cbf1194c45f5f5486f2428ef5cf34b2cc7b62adde8267ae8964771fc70f6c1ef", "votingAddress": "3cyd19bM1VLUtDVKiAzisqACHzo5", "isValid": true},{"proRegTxHash": "ab0d40f53a3c83ba1f4c9428daf083c8989e43478414a41d68c340373ee61874", "confirmedHash": "648d18135ce0480df70fed2d2ff1fb1380f94a18971624a30f00000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "3NKo3PtyxUstRTMvZJyL9RYWahfM", "isValid": false},{"proRegTxHash": "657fed9e6a22e2807d4d1652dd92910cb7c87f3440530cf093fe42aeb56cc265", "confirmedHash": "f4b9bcc2fbfdd0f2c715805c4ef701899a9ac0d103ae9b4a2300000000000000", "service": "00000000000000000000ffffa772996e", "pubKeyOperator": "0919ead5cd20ce4b0871533e72505d424ac4cb6aab22a61806cd4561deb1c6a26ebd2a823a12f5aa5942906549a1ca12", "votingAddress": "37tun6chxteh5n31ZVPi6Aef7Lob", "isValid": true},{"proRegTxHash": "1e9baf39ffa35fe6b47e7a48c770b733355a109765ea9f3efb1f77feae90fbb5", "confirmedHash": "27d96ead9ca4d56e2571e0186b5739d490a81c8801a618040700000000000000", "service": "00000000000000000000ffffd161b1f3", "pubKeyOperator": "0570734faff85cd48adf45379ebccdcf41ae4fe84db10595fbec58d8c0b948a896cccf8f2753680c8161c2b19fffacf6", "votingAddress": "yA7aFMUypBUL4uycwVKU62M3wsQ", "isValid": true},{"proRegTxHash": "c2b0d0dfd094d13950406c25e7990c074da0523b6fed04f13948f44cc36495e4", "confirmedHash": "3e4b8fc55df1c2fa8a38079debe814c831e436f21919d3610500000000000000", "service": "00000000000000000000ffffc0f1cd5c", "pubKeyOperator": "10b3e2935ae876ea27a3f40efc90097dcc06dd7b50b62609c068aef28b97e6bd94f59ba4ea418690547ed1e6261143f9", "votingAddress": "9m3X6zuB7Lefobj98BE4coh36YP", "isValid": false},{"proRegTxHash": "829dfacd5706aac8b6cce52977cbe800f79551506430e119ecb7a23b6cc8167a", "confirmedHash": "e676ee9159478de063d33f2eb36225a245950583ecbbdf471400000000000000", "service": "00000000000000000000ffffb23ea550", "pubKeyOperator": "813da9abd4f93fd325b582f872b9551edcc2d3069672624f363641d87fff41f53d70bd0fd6ac0956813578eabfe9ffd4", "votingAddress": "3vpm7LBRDHRV6QfBJQ4AcucnUgrA", "isValid": true},{"proRegTxHash": "bfc568149fa07352b8103aea373ab7484a3cbd920715949158a2b6f87349303d", "confirmedHash": "e4b12b8ecad4b062ecacb27186f3980a1e9407fa1dba0bc10600000000000000", "service": "00000000000000000000ffffb23f7986", "pubKeyOperator": "99530de1a0be3dca5879f2b441cf3dd992f359b747a708dab8b39a293d081d86c38232258bf1fee72ad1a13e9582b0c5", "votingAddress": "Rber6cRdM3qgzuMfZQk5mABw2Db", "isValid": true},{"proRegTxHash": "e2edc64926ca60ef4ce4188b4481d681773384cf0ca498ca9b9cf04f34fceac1", "confirmedHash": "35a7609a3a6c5d85265dd3e7432412ba2bc7918c12920f650700000000000000", "service": "00000000000000000000ffff36270a64", "pubKeyOperator": "8f720886cc28ae3548c3fffa36d5991faa3876811134900ade3f18dc9f512716d267f16fbb258c1c2faf7ca603ec01dd", "votingAddress": "2vuoUD7qNM9abHKFGhdMnqs5EZ1N", "isValid": true},{"proRegTxHash": "e25f2231a7963517aedfa70b8d08c4759b55f0cd99f3f1864740366e15fdd4a3", "confirmedHash": "017a433576a8bef6ec115ba2e788213d89d5267747fe68ee1600000000000000", "service": "00000000000000000000ffff52d31930", "pubKeyOperator": "11134c0c1f13dbdf4ec30bc054f0c974dfb3d85d75a03e2002f4e5b7a6eb18df79d135277c0f6fda5a1cfefaf6855636", "votingAddress": "C87wuSvEqw5w7sk9ofbJnykJZvx", "isValid": true},{"proRegTxHash": "d6341057715ad87b8b20f3165665d1e076fb7db2684247edd0ee62b0855b1457", "confirmedHash": "37f03c4ae27ce385faf2873c3274e45dcde6b7fecee55fc42f00000000000000", "service": "00000000000000000000ffff9f59a3a4", "pubKeyOperator": "874514e51f7bd2b198968b768ea71128e5be6a2c3b721affd477ef7e387faef4e1713fe1e2180f3f4a0910f4a6532875", "votingAddress": "fswHkVyjug1WY5jW6ALrAfMcZ7c", "isValid": true},{"proRegTxHash": "a762d550cd51ec151ecea5fbe28c2a453f08d5e0d8c76c06b9198fbff8cfedad", "confirmedHash": "227b4353d46415ba9af59fe5017e5c3846ea58d9097d9c244400000000000000", "service": "00000000000000000000ffff03de32c1", "pubKeyOperator": "947d51f5684bb142714a1f26186db7f1408dc4617a2bce7c0901d497dd3f8f794da2c0a68679dc4c62d3118d1ca45fa8", "votingAddress": "tRUcQWwWy2EfN3L8WccD6EAUGmx", "isValid": true},{"proRegTxHash": "074ad0a70ee5ffec2e9d4a3c58687a49afad8c07619e631558f1c94b71190462", "confirmedHash": "c0f840762e3a03edb6b3380ad61eab32847b04e2184c246b2b00000000000000", "service": "00000000000000000000ffff52d319cf", "pubKeyOperator": "14ac9897775ce9f14e1c791d22114d527d8909f26c053fbdab39d91d035601c2e4be0e4daf7d6550155d9735a7fb4719", "votingAddress": "2y9inDwuLQ8g2H36TzbjoAEi8Jbo", "isValid": true},{"proRegTxHash": "a04d556bc7e9be9c639aa558cf44aea70e911cdad6257766c8625fd9db0d6344", "confirmedHash": "9129c82a932fff630ff46a80cf992a6097a450221aecf4720100000000000000", "service": "00000000000000000000ffff5fb73527", "pubKeyOperator": "0006e6a3bd5fb5d94bf385d944ae4bbb16a9fb01cac56fc47390ff24a50cb44effe43d4b5a72b7d5df87953abffa935a", "votingAddress": "Mb9mWYCERAcxm8dj9B7o2Q8AFtu", "isValid": true},{"proRegTxHash": "baacbac791d403c1e11da7e344f54d1f81db4f03e31227a86cb4bbe5cd3e4818", "confirmedHash": "ad36faf2ca19073976f226d9f64490b06e63f93d769a3e521100000000000000", "service": "00000000000000000000ffffb951a45a", "pubKeyOperator": "83f9617be4f5b62c536009097e3dc13b37e0692760f960866a83175f2e7e68cdd04d9bd7dbd224b7f19d11dccea4f787", "votingAddress": "4AmdS5bhuK4JknWpkWUeH9UBLXRx", "isValid": true},{"proRegTxHash": "07a8756b664a2883a8d8567a34aacdfe3dcb7a948fb76e0b43e6e5bf5f5aac6b", "confirmedHash": "54ca220dce6177184e60d8a3194e7046c2aad4e4adaf83190f00000000000000", "service": "00000000000000000000ffff52d319cc", "pubKeyOperator": "8e5dd8d75927752b6aea7ee31c98819cfc5526a6e3ba84ce88c07982b8111c0129cf2f0e95a09d02146fc888a4ca1d79", "votingAddress": "QKgfMR3qXqsuUmmxt7J2tge4U5u", "isValid": true},{"proRegTxHash": "e617931c0022a9a03e27b040f575d852add008d4e4550832027aef4bec2f45e9", "confirmedHash": "672d3ecec79ab6b63f0f8483555ca51b6a834e050f3b6b6e3400000000000000", "service": "00000000000000000000ffffbca66508", "pubKeyOperator": "055d1815b8f2f700ded2378dc28f380477a0a5aa08b204139082d1f69eed99bf002baf3e67b4ed1afed724bb18ce9bc1", "votingAddress": "38dZCND8uaDD5bek7EV5HbYJanao", "isValid": false},{"proRegTxHash": "d45948e7048513a85c8c8437218f4155024e552c69dc276767630409db266536", "confirmedHash": "465975bf50a709322f5c74b28d3db7f32a0f6dadebae52330000000000000000", "service": "00000000000000000000ffff2d4c5ead", "pubKeyOperator": "099b8b1ab3831be8d0ba705426ee55809c61f6b16ff9381aa5d76daa312f77ca5d1b055d7f5794201c7b049e35836f46", "votingAddress": "2LZDSrWp5jpWcboVrWYBnDPZzFzm", "isValid": true},{"proRegTxHash": "f4212a1dbac1f4dfba164030eacbd7c2c2b92f0ce34b8b24febff6554a3c40e1", "confirmedHash": "5b9f81cd364f3aa515893a023e12d7c6572c6f3321addd1d0d00000000000000", "service": "00000000000000000000ffffa763b952", "pubKeyOperator": "03080346326dfc221ba7dbf049e706e117e7bf9279e85fb001c92cf4e91a8cd1a5450e087b786c1091d0c3a181d11997", "votingAddress": "2cvY3hKxARjid2AgnZJvjFw49nds", "isValid": true},{"proRegTxHash": "f491ef2bdb0377703153d5c139580a4eada6e7fb2b79349cd19438535e498775", "confirmedHash": "04904d1c759366ab6d9c16b4ae02739293741b9461a1eadc0e00000000000000", "service": "00000000000000000000ffff5fd84fe0", "pubKeyOperator": "88b137ada027288e75a33ce3309ad5d50267aaa180825f12c87d23d104a54e6570a2972c75d800660d6eb7b55fe29480", "votingAddress": "4PcU9RDSAmB9xeBCFe1D4zdDnAtX", "isValid": true},{"proRegTxHash": "58bbb0cbed2eea3a57abc014d272b08dc0b9e171a3875780777bf952c7ba2459", "confirmedHash": "b60c3308ddc3ae8eb3ec549eb9806e008df1f543f6f1a5d41700000000000000", "service": "00000000000000000000ffff5eb0eeae", "pubKeyOperator": "11958c572289ef4437404d84c021425fe5bbf503ad5240523ee6af0aada4bafcb31a9dec1ae3c4815ed7bcc8107ebe53", "votingAddress": "26yeN7E3ciVqxvgk7UrtjZCFpenA", "isValid": false},{"proRegTxHash": "75a918986b023206109ecd505e638df542ef83480f7d4991d83b4a4029747839", "confirmedHash": "c4f6fd056144cf38aacbe88d99c845e6c784bbdad01310c01700000000000000", "service": "00000000000000000000ffff2e04d9ec", "pubKeyOperator": "87aee21636298ae98fd149a65cf5a239d5469832f430bce0a04da36f9a0019aec7d76dd80c5652c7ff0e4374e19e45ce", "votingAddress": "2ADteVBiho8cpzvgpekdSV9sna2J", "isValid": true},{"proRegTxHash": "98a084da273cd773060971f04a86c104505b2deb4f4cb939c010941b57692071", "confirmedHash": "437fe12c7a81236f7d123290f0d3886037d3ce90baf5e4961600000000000000", "service": "00000000000000000000ffff5fd85420", "pubKeyOperator": "09d6153afb8a0b3049cd247914a7132dcd8b1cb48aaaf9f84e0dacb2d65927ee38a167d088bf15de91c7ea59b3663745", "votingAddress": "3vX1y8zKpxz63JGQYTPgmDdMZsZ3", "isValid": true},{"proRegTxHash": "004840156c485fe9cae44c808bed054f5186c6108545caaac5049c1484d7e4b2", "confirmedHash": "41b2db1fef27ca5b2085a44914e9987ba462e6653cde42b50400000000000000", "service": "00000000000000000000ffffa8775004", "pubKeyOperator": "82027b2f0b86356e54ad9f6f9d09cc6b9397b194f01efa72cc9fcc15101014c7b870c7787b082c7ed08aaf3a1a9a4134", "votingAddress": "4JAFE7DiKBF6QdehdgZRcmacgiwV", "isValid": true},{"proRegTxHash": "fa3b3fc7f63a17e30fc21006b5653798f42f3afe1a206a2901cf11d93dd527c2", "confirmedHash": "332e67efb372e7a0d99ea84342931c84a44e5829706a4cf60a00000000000000", "service": "00000000000000000000ffff05873348", "pubKeyOperator": "1072b0e75f13644d58714e04a7485620ea7855eef14a49901a7e0c90c47793b671ead02dfa11b3b6c06c3ac0cc9b2a99", "votingAddress": "3QkBu7k3sUGRMk4zUdyoZ9f43QJh", "isValid": true},{"proRegTxHash": "37e4cdba03024a51e2ca94fabedb8e24bab17363a5207162116d12144ec6ef71", "confirmedHash": "5dbe929ea5aafdaac78c1cc778b3ab725bd92f2c4510d3090c00000000000000", "service": "00000000000000000000ffffa8eb55b9", "pubKeyOperator": "0ce9ee0275ff80d2fd1e44c387ddfa1c07b9c8f7863fb59782020abb35f40468fc59270afeee85000a2c0b2fa9f5d11b", "votingAddress": "39CXJwTeZGMheYRAKuDCJB62BXp", "isValid": true},{"proRegTxHash": "cc57f6f2507e99b5fdb4641b6795519dc8b5a8334d66b26e5ceb6d0b0f6edac2", "confirmedHash": "9f8adf34b060b0bb93232da356a01c4a6ef3cf3ff21003500a00000000000000", "service": "00000000000000000000ffff80c73028", "pubKeyOperator": "139ea5b4b383aa96aaa50979e864d5e7e7718be81952e3187788b48fe0ca7bd9fb3eb0ec52057381111bd7c6cb5437ee", "votingAddress": "K6pXiSRrJP1GdXYkWMZFdf2BfZi", "isValid": true},{"proRegTxHash": "f16e163408ead7b352244a419f2a0e7e293f4cf6bfbc89b6b9eb9e1f168cf1bc", "confirmedHash": "af5940bba49a025693d16a108340bf9935e7785c754704611000000000000000", "service": "00000000000000000000ffff52d31546", "pubKeyOperator": "143878b64993f280b9d3c96168c32d7aa747a3ed5b042850cd541ef3ac4c58f790182b4bdfef5d79accd5fec2230c8c0", "votingAddress": "2rTS9WRFpgcFh2F2B88Acrnu7Hpf", "isValid": true},{"proRegTxHash": "65b38c39153e2e0929969c8fd7854f52c16c488d8082b4e7082b358b4441d0c6", "confirmedHash": "8f3932a04fc1cd5fe465fb07e7fb2e1fa9bc27917cf20e9f0a00000000000000", "service": "00000000000000000000ffffbc28b248", "pubKeyOperator": "09ab1f817e1f40ea193bc9d3167c1c22ac828a99fcd21843798f3256498ec2b465175069a80aa5c466891e11d4cfeae7", "votingAddress": "26pySUYjeBViZxxBos69MtMzz17C", "isValid": true},{"proRegTxHash": "b30e389d4ce391d1827a4a3303929926c76368521bbe1bf1fda4dff3aa58be3d", "confirmedHash": "26a6ae86c28349c7c34fb9b4412d58d4ac00e739b3f9ea941200000000000000", "service": "00000000000000000000ffffbc28be38", "pubKeyOperator": "99594c3fad26bd02a952872b3df5bfb33299c434f57789d80e6390a875d0116bdd0200870db3710363c5d301c5fcc92b", "votingAddress": "N4Zdjn424AvTkbcuMQS9BNogkcY", "isValid": true},{"proRegTxHash": "8277556e2c7b2be37bb7277675959335b91ee08a4aa5a5ea5613a3562d7af11f", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6e38f", "pubKeyOperator": "13280a689acd96d3431cb7c5f1956f88e31c40a3d6260e20987dd4b896b03263e53055d5b6ba035be03637f2ab39841e", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "eefd78b85369e52e3e0290059a4e92a14941a269afe670172ad7489b0f161167", "confirmedHash": "c080d488982716ee367745c26a8f1b420b4826e3ba8415e20f00000000000000", "service": "00000000000000000000ffff8e3bb080", "pubKeyOperator": "88a503dd9d96998aaada1a63ab0b00b2623f82bccf0e0bcf044689b783b5d5e08c371c78f26571fcef2a172182b9e061", "votingAddress": "25g91ynsesnM26fcfis5hD4z87QN", "isValid": true},{"proRegTxHash": "68063b25e78cc45fd61dd4c55b47e33f6bbf138c76c61afebe42e2519e1dfb6b", "confirmedHash": "5be2992154bcdc7fac8efc0d431ae34e077761726bd95f150f00000000000000", "service": "00000000000000000000ffff51ab02f5", "pubKeyOperator": "12725a99e571b5d3758b5ca34d9882a1299fb94de9db982cba4408655a86294e2742e4cf9a877b95acfda943fbbf30d8", "votingAddress": "QMcRrSzfiN65JRupBBQaa2RnAbE", "isValid": true},{"proRegTxHash": "aa63496f63dda016938f392c839d0dd99233c0530676108863351695ee210150", "confirmedHash": "017a433576a8bef6ec115ba2e788213d89d5267747fe68ee1600000000000000", "service": "00000000000000000000ffff52d3196f", "pubKeyOperator": "8b5c641ffb86a31d3fb524c60005ded2467b2438ec9aac38752a0c53419cd0951b2ea864d7edaeba7b5b40c54f732e77", "votingAddress": "3ScAALbE5pwBRdupyMVxcuxd6Kp3", "isValid": true},{"proRegTxHash": "7d5ad73f88275eda875e12708c48789bb376da319d9ffc310c4b1537904290e8", "confirmedHash": "eac420c49ece296370d739705e10dda9881a7d60fbddcbed0b00000000000000", "service": "00000000000000000000ffff2d4cb11e", "pubKeyOperator": "17021b94b4976e9a6028b0371ee5fd7a5a2e4bcbeab011744281cbce75182aa6fc8979dba4735009295b03253f4663a9", "votingAddress": "2bAE2o1xdJek5XnzfJ1TngFMZJyv", "isValid": true},{"proRegTxHash": "50a3d70ffd687f0a2d4ecf65ba726b913c9a9076305cf3a0ae642c0928b5a5bc", "confirmedHash": "3550b4f95ade9743bd2f22972f090033a4d43ee28b3309941d00000000000000", "service": "00000000000000000000ffff2d4c8088", "pubKeyOperator": "8f73d820e1d4b2fecb4148c699026aecd4b8bb2314cb7d299eb0cdae44001f63fd56dc6d5a2545b9163c36309aa5615a", "votingAddress": "3NoiUAYeuaNcEdkFQJhhFT7D9Eix", "isValid": true},{"proRegTxHash": "3a943d6bbe29c1d0e32e3ef885016981ea87ca04b90021d3ea977bc7fc8de355", "confirmedHash": "f142219d724bdfab00024f3cbed54a68a5d2e022ccb528120500000000000000", "service": "00000000000000000000ffffd41867a7", "pubKeyOperator": "13b1d080ed0e48dfa304fd03e8b3cf6e4308aff94577b965493bc4f89285046d9e94e1ec981e0ea68fc4f1bd09a2945f", "votingAddress": "3MsdCMsBjNq4cmEFbg8GdT3YWmQQ", "isValid": true},{"proRegTxHash": "3569439a952c29b1397458720248d5ae67eddac4a9662a667fad335aa76593b4", "confirmedHash": "e29874bfdef8eddc05a617850587cb51893f6e006ba65caa0200000000000000", "service": "00000000000000000000ffffa45ca082", "pubKeyOperator": "0a5b0c62d8550ced8e2d876c6b123dc358a3de5eb5f4effb69afcc20c5f6015fca99054457e248972fe3662afb80ec9c", "votingAddress": "32gYo1j7Un71uZDzKQj8AkJ4Ddj", "isValid": true},{"proRegTxHash": "e1739a0a688890faf75c92da20b9f720603674aa846c5a666f16aca95aa8a93b", "confirmedHash": "dbdd85fd06fc4d32ed6b414faf5fe7348fc8daf76655e2520300000000000000", "service": "00000000000000000000ffff8bb48ae7", "pubKeyOperator": "98a2f9bd508a236de9a3f654277e5f5382427c94a25385413356dbbd5add4373603ce40bae08ffae64776c5407625dd2", "votingAddress": "21DokLYYafVupAJ7CS65yBokgbi2", "isValid": true},{"proRegTxHash": "dda2cbfd9329288578a4f1a535456662440f443ec8b55d3f4aaae7155d74e76c", "confirmedHash": "dd72df45c4cf4c514a838bea2c024a05a053d77a9ca23b670900000000000000", "service": "00000000000000000000ffffb280a339", "pubKeyOperator": "98f81e2bb6e370667cdf50cf4b12cebaa7d86a7a1b391ab3164efe10a8efa80c849aa197a9d8b20119926c0988eb6509", "votingAddress": "388ay3myz9QppsNoSpsJRJeqKBum", "isValid": true},{"proRegTxHash": "0f2992ca000921bfa22f6da660fdf91dbd10441819e19e81d1580bbb8cf5a0d6", "confirmedHash": "9de1ad1d7f5c178931067fc69b42d4e03f22fa014d7523e80000000000000000", "service": "00000000000000000000ffff12cf4897", "pubKeyOperator": "8580cb364986c0e4d40e6bef560df5642347a67729ac742290e4e0b5aab86370db87f6b397ef6d66d6f5d135155705c3", "votingAddress": "3SYhG4JmUm2JBtsX6cyYdMAyrvFH", "isValid": false},{"proRegTxHash": "15d4bd7d0a119a596016517e9fa4853015144674413acc6ffb96fe121b1b4ba1", "confirmedHash": "ff037fca01b9ed831f56ef55062431b58d50802fa4afe7dd0b00000000000000", "service": "00000000000000000000ffff9df5659b", "pubKeyOperator": "174c58538dd8ce6acb94a4c6b924134eb62c449b9a424f4a363c4953f368e984549ab9c66cc2bbd8abba1a4c68fffd5f", "votingAddress": "345PRJeD2gLWX3NuwbMoEyUUEN9n", "isValid": true},{"proRegTxHash": "895067f588cab6c9b7a7eec02ce9f5669b96de8f322570e69d7be577bf56260d", "confirmedHash": "3f3125f33972010b7c9dd7a0faab52b1a15a6a5b4c5510940800000000000000", "service": "00000000000000000000ffffd1faf94b", "pubKeyOperator": "0a1a88512a3c41e57ad762f3ef20337d40b8d2b91b0b4e48910a2ffc799523120998be35fa7877f8b0a4353acb342c56", "votingAddress": "24LBPyMgGu9HakvzU9PHeCfKiozc", "isValid": true},{"proRegTxHash": "888ce9aca3f92bf90719d68ef9d1de7e572b7d0083718d3c1a152f96474b6fec", "confirmedHash": "9b5bc5f246bd929d5d85fc0a4dc95df780c83751bb96832e0e00000000000000", "service": "00000000000000000000ffff55d1f27e", "pubKeyOperator": "90359b829f4acf51dd3a74ea2a5c62d1c051b1abafca5e75b4236bad5ecc615dea9e0d3f20f333810b1a6cbfb3d7cf48", "votingAddress": "2gARzXYkzAqXheAsTxqZN4DhcA5i", "isValid": false},{"proRegTxHash": "228220bcea538e901447e467bc0fbe83fcc63c76b96800ddc0a13da0dd65c6a3", "confirmedHash": "940b37038967c460d991890c6a11903d87231fb714ade2073500000000000000", "service": "00000000000000000000ffff877d470a", "pubKeyOperator": "8763a1ed5b2767c01966e12274e2caadb55d2ed8dc08f2eb5b28d3c380da89507e44918bc97631aafaffdfe0b282e7f9", "votingAddress": "2XT8eUSu2pMLEwXNfGH4dPLg1Vb3", "isValid": false},{"proRegTxHash": "fc7089e88efccedc35132a44b6a3984b6c014a4d698468548c6cfcf011481298", "confirmedHash": "73cfbcd7c5618b79b5323972292ce4411beeff15731a1d3b0f00000000000000", "service": "00000000000000000000ffffb94068db", "pubKeyOperator": "8b9edb13b82e54c5b284b14869c55f21e83b44fd64932c2089f6aca8fdfbbde9145cef47b3e0d42c7bb53882ffab6639", "votingAddress": "39pi7Z6NZLa77fD68JHcvXRwefyG", "isValid": false},{"proRegTxHash": "2428136ce4df70f41842775e1b4de652c9586eef3299d28bdc4b36a1b203f4c5", "confirmedHash": "4265a647f68d88a8cd52ca697cbd0553b1042ce12247ac5b1600000000000000", "service": "00000000000000000000ffffa7638ff5", "pubKeyOperator": "18e4ec6908c3c2fc2e04d18afaf42ce87e8becac6dfb728aefb96c36ddee55e1e4c42538a0ecb45613382a7c563ec580", "votingAddress": "U764Eo6fSbc7J78AyZ7fBvDNBbG", "isValid": true},{"proRegTxHash": "1f916d2a811f834a97c28b61eaf2f94b3a10d6307bb5d6b54193014304d023f2", "confirmedHash": "830a3b1221e4d8796fa83cd3b04dad77db0635da2397222f1100000000000000", "service": "00000000000000000000ffffa7b3459c", "pubKeyOperator": "112e294ae54479b7758a31ce38c979e730187efba725d68863a661af2f22f1eeefa662d00cf48327807a20e2bfa09bb7", "votingAddress": "3bikWr8W1spheaSxXVzzMAiyEshR", "isValid": true},{"proRegTxHash": "baa64fec4280e1de7f84563959b12725e342eb6dadbef24b4ab2073844655ca7", "confirmedHash": "43e1d99b344042b4f89db14f456260745c6c6d4ba1bdd9790800000000000000", "service": "00000000000000000000ffff2d4ce295", "pubKeyOperator": "8aeea29ce50d5a5612ebb89bbe631387412cf8a4ea06a4d3583aed8893eb56f53f3939da688fb251733b8655df653b18", "votingAddress": "2RcnTNrt9soHeL8bhQc6AFyZN8S5", "isValid": true},{"proRegTxHash": "6a70e14d8b20eee6ead6f7383e8729defa39856abf1655c0d3d594e0bb3243d3", "confirmedHash": "26ea4ff3c2b6bc1d8f4899c75bec62c6460aa7cef00b463c0b00000000000000", "service": "00000000000000000000ffff2d4dae3c", "pubKeyOperator": "97fdd7854592b486f9076e6dd927317d7bb95c12cfea1667a31360474fed331915f286946c4a664dffe007cd1b779d17", "votingAddress": "4KyttoL3VzfRRZNfi3vquF4BEy8j", "isValid": true},{"proRegTxHash": "1670931d5a5550535440f5a23f012f2343471c7555a324890aec37fbb42ff2d0", "confirmedHash": "00960cca1bd93bdfe38eefd8f7c17d3856f416e84a85b5c63500000000000000", "service": "00000000000000000000ffff5fd8bff9", "pubKeyOperator": "88d3eee36d99164b00019886e84341645f28c8022fb72d9ddbc46649d97146f3bc645bc333b4c2af69f5e6f4e9cf22b4", "votingAddress": "zSkc3bLpt6fHJUrdxDZJEKC5yrP", "isValid": true},{"proRegTxHash": "693c5af9002ef89e454649023a804404f94c1b4c2b5de87566b7b5dd1ba5a7a0", "confirmedHash": "8e97b5dbfaabf460a957bcf17aa08673d1bb4108cb3684922900000000000000", "service": "00000000000000000000ffff6bbf3d6d", "pubKeyOperator": "80257d33f8594714f634869effe7d3f6d8c45121df4f54aba7549fca8220317fdef692229b0c319d2508c66411fbec98", "votingAddress": "6cxqcgSxBoZKnsVhFBQFJCrLWb6", "isValid": true},{"proRegTxHash": "30ba42821a7610a2179439a9aa9c3dd9a0209d637d78775090a9b844e4b5e2aa", "confirmedHash": "77fc33252e0c313724bc1b8cb41103a0bb16125aacff11c22000000000000000", "service": "00000000000000000000ffffbc28be2a", "pubKeyOperator": "18b87dab75ef68961ca33873103cdff771aac88da53bdf8940f5872bf9d17dc0923f31d8991b7167ac5ea12078589645", "votingAddress": "ejiaLRFKTkH8Xt1gV6k1B9AzLdP", "isValid": true},{"proRegTxHash": "5cee58842255e2645b9210e9d90282dbbf9ba261228ac1c47cbbfaf6f92854f3", "confirmedHash": "43ef503a95c7a9190d4e906828998ebeefece4beec35521e3100000000000000", "service": "00000000000000000000ffff86d192bd", "pubKeyOperator": "959dc707ea3fc22028a74953ec5d7fa3e4c6b038155af23ed8100b6a9f0a46899c58765db66a2f869202dc446e33da40", "votingAddress": "Y8CWpxYQMLD5wPgiGcHfbnPEnZf", "isValid": true},{"proRegTxHash": "9c640edcdceaa9ff2265de31b79b8fd5569fb83515352e1aebb7cc9fc67dba70", "confirmedHash": "d7c1cff6165ca88a7dad205b5d5ff767cec2a1ca8c6633290800000000000000", "service": "00000000000000000000ffff5fd84fe1", "pubKeyOperator": "89be3d6605e78dee6b2873f0fb3db02e808eb47b52efad4166ccf47e6542f43e2df5c3aef6fa0d616637b140bcfc81a7", "votingAddress": "3UFezpW3DdnFEmoC9F1MVmnL3u7x", "isValid": true},{"proRegTxHash": "d8f84657ed1236871c9204826e528224fdd2c543aa7734f37c277387def7aac6", "confirmedHash": "99ebeafba5db971d8afd88696e82b37efcd201f743c679261400000000000000", "service": "00000000000000000000ffff52d315b9", "pubKeyOperator": "029537994896c7b0a0d904c430744795a5f26e1b3884ed5ec3fab75303c2e711bbfdc6dd95e3cad265176ec01d81e8ab", "votingAddress": "2G6j2egSh62ftcdvuonYQoMNmqTz", "isValid": true},{"proRegTxHash": "1901c9d58038a1ddabf7fc2ba157115e78d500ba7ddcc511e56f9e1fc407b165", "confirmedHash": "92cedf893f54efbc50bdc2f5e205a3326ab687e27c353c351400000000000000", "service": "00000000000000000000ffffb07b39d1", "pubKeyOperator": "040c2eeae85eda1dd8b800b2d119f482a55fa771991edffa8f95785bfdacb836709dd169a003eab1fdd15d20209d5aef", "votingAddress": "jor2JAX8NoNQacYqpyg22nWRPP6", "isValid": true},{"proRegTxHash": "3adb0d652b74773936fa9243828e9af77266e3577c3e1b06f6528d62083f88f3", "confirmedHash": "601e6145d82c195fc7662679985dc885fabd2375357b0bca3000000000000000", "service": "00000000000000000000ffff34161977", "pubKeyOperator": "0c8679ac013e8af92a88e836d566e3a46d4155e8affc443e2e8fe6bb477d3dc9bbd429b9a45f401452d77645e3f5828e", "votingAddress": "265ji6a7MDjVPXcFwj9Sx5Am5FuH", "isValid": true},{"proRegTxHash": "3af0d1b116d613968ac006864ca777cb87f773c36b4202be99482a3c3179e1f0", "confirmedHash": "52c47a30afe45e37d8fbce042ec998d2d5456e698796ac210f00000000000000", "service": "00000000000000000000ffff2f6ec702", "pubKeyOperator": "8c64e5f4d8a024d6ef1fdae24a7c51c5616c7ed72857db37fa49bdf6aa2757ef7eb3df0dd1dea75d6b1bb4781db09143", "votingAddress": "48XXxjsAjAhxKQNxGbTtSLyqTAaX", "isValid": false},{"proRegTxHash": "e31e0b3eac95530d3da2f03a2aad02ceb70342653a72d275e9fe9377b82b1351", "confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", "service": "00000000000000000000ffffc0a90759", "pubKeyOperator": "1040cb11541ba3ce31f18ebcb87478297d1c45110b9a5cd82a229283527e58797592705fc1364c0ad4ad83dbaccc4674", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "244456a5d7d55074a2c84e9f0780efaba564e0697885fe64d62e63162576b1c1", "confirmedHash": "ed94e7a69a9eba24a97d0511987122b3d0a9939254332a501300000000000000", "service": "00000000000000000000ffff52d31532", "pubKeyOperator": "9142db81a7ecb73137a6546b5cf6747168a79afc527ff86de020e9a20a65f957cb0da2587028a21cc7498d4db60ad9b2", "votingAddress": "2pQ9cA1xsmXhmyoSHzA6HnTLqkxb", "isValid": true},{"proRegTxHash": "4d68a3ca7c215e34464f64f1b728ed6a3785f6019c80ac8ed07dbbc6ecc58205", "confirmedHash": "2075cba9aa3c8d1f80432b34aba2d2eb7b7eb8aaf98446f20400000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "votingAddress": "3wGgFmDLrvnfmy9fC5haxqztC1pi", "isValid": false},{"proRegTxHash": "c939a281bdeb454c6037675f187c583f5d632e06fed1b2782d5a3309151df3c1", "confirmedHash": "97c200f2715c4a96134eee08f5796e653591b575a16e6b111400000000000000", "service": "00000000000000000000ffff5f550ce8", "pubKeyOperator": "0c728d74e2a5e822e878b4933cbb10961d5c69b3da3ac2289d411cfe5ba5461b55eb020f04bd09c93214344ae7934b61", "votingAddress": "TdUh3M67kkkHkWKhg8h2nynhbTQ", "isValid": true},{"proRegTxHash": "de07c3808f2f462094c99c66b218cae5d5aaf45cf283725646375a7c7328c53a", "confirmedHash": "27da25ef2fc43fef470d5b5195fd75ac3ee8a63fab85d1150b00000000000000", "service": "00000000000000000000ffff52d31550", "pubKeyOperator": "0e2f6959b65c03a8f9417f274f92e13c40238ffade284dbc5099f3b0e8d3ab961cfc9f5e24302edb64583e2d7d71bb18", "votingAddress": "36DJL8qkJSe8D4XAxDxu9Vkd3TKF", "isValid": true},{"proRegTxHash": "e776974691f1b81504ec3d7845407495527b182fa628185d7be593ff4adc313c", "confirmedHash": "5059b1665d64b94231dc9e078e80f83485a0fe50edfa8f4b1500000000000000", "service": "00000000000000000000ffff258b066c", "pubKeyOperator": "8b50fa71806bd8ed129eb2ed0893c32d1c51631c8e65ee5880da6a4621e0a16dac3329d66b5005cd8229719842620a51", "votingAddress": "rKVV9VkjpcidWeEQSpqEd8PzRdE", "isValid": false},{"proRegTxHash": "59264492ed4bcd62a74f42a6d2161d7b75ecb04b131fe3275bc13d137d6d9d7d", "confirmedHash": "e6a7b2759861c7c24d90aca496dd830b25f1b92dc7d221400e00000000000000", "service": "00000000000000000000ffffb23fec66", "pubKeyOperator": "93ddc281861460f7521c5e5dd292d21a04ed54e659b610a8110cf576b66f7d77178ce6a4d64e89e2f06946f4a24dfe39", "votingAddress": "3GeLisRUXEsWiYqc4Qrnj1smzwJy", "isValid": true},{"proRegTxHash": "668262467335358886ad9cd6cec983fae5f980f93067fcb60e9a1c05646941d5", "confirmedHash": "6ee4685bea6ff3b0f9b425133af5481350f6da84730544621700000000000000", "service": "00000000000000000000ffff330f752a", "pubKeyOperator": "19a3e5e4aa74c81aab2f5f8f829cd9b3517375664a6b565ab4f6f2e639b053397b3ccde011fcdfaea849f554e6cbb08b", "votingAddress": "2hNDst58xgU3EtZvGXG4n9iUP6hQ", "isValid": true},{"proRegTxHash": "b18c1724cf0ac7d5d5a3ba41bb96a077417a8bc410f9e6512ed160eca3a918d8", "confirmedHash": "92e5288316c0a8898b4a961f38b2539df010d5a58cc49c821e00000000000000", "service": "00000000000000000000ffff2e04d9e3", "pubKeyOperator": "0bfedc15ab70e2cd12e556670e83e44c4b6a6c03b48165b59d002eb5e4052ef5b3b0b16660a67dd6c8a58804cd9cb008", "votingAddress": "EarUzjNZnJ4C1P3L66Dm1Jumh6G", "isValid": true},{"proRegTxHash": "3cf90b9513381347f32c763290c0723605fb8d836bb58ed2db6a42e83fbee79b", "confirmedHash": "65ed58faa0935e58bf2e7f827a3682c64c842950124ceed12900000000000000", "service": "00000000000000000000ffff341748b0", "pubKeyOperator": "96b450ada07d7b4a100b26c7bd641d34ab3bf8508a9328982dbf6cccebde8b0b790cf7a59f3039b52448b448a291cec0", "votingAddress": "4VdpJmzbEyeyUYFYS31oG9jzJY4w", "isValid": true},{"proRegTxHash": "e56e81f5acf8901c59bdd99a338e4ad4bbb21b591b9df2dbf5f71f8a6ecaaabd", "confirmedHash": "8c61196c0def0f67929e6dd321a62bad2bfd1c005a1df9211c00000000000000", "service": "00000000000000000000ffff92b9951c", "pubKeyOperator": "83e560d476d6d6fe9f2239b50f9dfc20e90668faa40cd6e07e9dbbe8fb13add5fb99070132b1da6bada7945d4071d89e", "votingAddress": "4F47YxDDTNB1CyaHVxRCVtZtq1W7", "isValid": true},{"proRegTxHash": "727f3281ef16235a2ccd473c2353fd3384b459b002cb2ab9a7b9b2142cfcd122", "confirmedHash": "950cd4a4dce11b5f93b087d4c9b122a210d79d3e91bf1eba0300000000000000", "service": "00000000000000000000ffff52d3196c", "pubKeyOperator": "9747b402f2fd5610f37c10ff032d8b51ebd8f6dfda97a5a0c0d09e69f55c22da9a30754e4f727a6e90266cc91efbb807", "votingAddress": "e1MGKDKn1vrritjS3NRbXoNHJL4", "isValid": true},{"proRegTxHash": "506f8952e3b35e41f191d445707d07ee8782afcb3d0418be109e9de74b39721a", "confirmedHash": "563d1e28448e78647e4f314fca555f8ba8194497c75265ab1500000000000000", "service": "00000000000000000000ffffc063f4dc", "pubKeyOperator": "94fc7e0f97f5c4d46310bfa784603fa7e6961831c0f28f7f4083715d15b972fd31f2edaed55adb60cd0d608b529c2106", "votingAddress": "vhejVfWnteY74DJrv2CaDs2oKB9", "isValid": true},{"proRegTxHash": "37500f05660d0f1369de82ebbb504d069d774f213749cae24c1d30c5f9280a8d", "confirmedHash": "260168708e6144224580403829f1475ae1c60d9b6c0c39991500000000000000", "service": "00000000000000000000ffffd420f0e8", "pubKeyOperator": "873f7d0659e3a13db11c2e3f487675685c8c3e76ba74d84afb3fdbb2eb1c96829f94220e886602acf6e3846d327d5343", "votingAddress": "334cMXbx8waFXynzMaDvQ9FdNLrK", "isValid": false},{"proRegTxHash": "e050090ab6475a72ad1f1eeaf60f0ac521d9f6f27f808efa97e0483ea811b244", "confirmedHash": "fa295bd0c1ae0e67926baee1ef37aabc41c46addfde2f9fe0700000000000000", "service": "00000000000000000000ffff80c72362", "pubKeyOperator": "823c32351789fdd47048a8a37c048b7e5d35a0e8fc88ce8d66670bac0394c8bcdacef801270e88d137bfbf657edf20bf", "votingAddress": "2R1mrVuKV9BZQomVQ7sp87HYpqF1", "isValid": false},{"proRegTxHash": "2090f76a6ac7a449ed3fe06d9d31079d717f9d14240488ed03ff2ab5f81ee2df", "confirmedHash": "3e2b8e3606640788f94cb14d16793268bf56a59402c85e0e0f00000000000000", "service": "00000000000000000000ffff3625c7e8", "pubKeyOperator": "16fff273840b16a50c04fbb60524964ca2cd349020e5b0c40c9a2f8defa0fba624f6e0d965855bd4bd82df8d113f215c", "votingAddress": "31P11LV5MSZ6gtunxMRzUSEg9Qy3", "isValid": true},{"proRegTxHash": "dd0aceea981dce9398c81f08857f0e276b55eb56332ebc43d7b293b46572df4d", "confirmedHash": "64b6ea9f30c19a77df7a68f27b9d0b5849ee04893ab2177c1500000000000000", "service": "00000000000000000000ffffbc28af45", "pubKeyOperator": "91cc6ab669ae1565067ec38bdca464a1e4fc1c44f6957d85d46fc66968fb979818361eb2f0243a30d5874dafa1b54b75", "votingAddress": "3rTNkAwkiWK445cCA1phbhGXRUhv", "isValid": false},{"proRegTxHash": "a2065375ae2cc21ddceaacc3d6b3f42c51872b51a09ee74bcb1c5432718e80dd", "confirmedHash": "6ed6a400b9c9b65d4da63626648be9e0bf7bd2b07a8e1db71300000000000000", "service": "00000000000000000000ffff50d1e36c", "pubKeyOperator": "17f96b4c40cff391d6a2048ab456339991aa22c12d4a33f0fc94b82cb3d1f1bd347f9d0c6a7875cb81c611e7f6d03478", "votingAddress": "tS9HNuvUgSMN4R8YNRXpQfzcWew", "isValid": false},{"proRegTxHash": "6eb9fdc69bca24ba2c6aefbbd070fb8f271fb4a83423b0aaab7838cf70830e28", "confirmedHash": "c871e716d4c992edded6a86eb35386c8664cc7b48a3245e33000000000000000", "service": "00000000000000000000ffff5fd8542a", "pubKeyOperator": "007599fae96fde3ae14a0ba4e94a6fae85e38898e1ca812442ef75749535241ef54c62ba0996186c0f80339593ebffee", "votingAddress": "219W5a22Srzf74vZ4d6D7A5cnyaB", "isValid": true},{"proRegTxHash": "1df872a04c29de4154ad0ee4976481d49110a8713654eddeec02de7fdd707dde", "confirmedHash": "29ced6e37b3d18639a203801e9a0cb5b4d0255de544a779b3800000000000000", "service": "00000000000000000000ffff52d31970", "pubKeyOperator": "1354b3a46ed641c54b00b9365a602aacce704ddf0a7c3b492f56cc7694be19022f50360b3d88ee41c1d0fe25e37c2ee2", "votingAddress": "47arJ2bXma9QbQRNHy31U6L7taut", "isValid": true},{"proRegTxHash": "dbbc8eedca7cbcb61c4abd50073ba961265e6d89dab39664a7585f4459854511", "confirmedHash": "b3b64ddd4d2bf03dcb0d23c3f9211239e79831d8ca8b0b892900000000000000", "service": "00000000000000000000ffff87b50852", "pubKeyOperator": "93ce6b5cec263f0cdf19e817398ab4f7a142e1346b1641d20e251d5095086acb701d48fafca05cadd6873c5b60099bf5", "votingAddress": "J6AXnf4gnjFBZduAXrfHxpftHSZ", "isValid": true},{"proRegTxHash": "ffe4d77dc10b191a21dff834b4258e5c251637559f5d502bd5acd675dcbe6fdb", "confirmedHash": "9391d1f7f24f0966a680f0264429b214f13901c4759987290300000000000000", "service": "00000000000000000000ffff36263007", "pubKeyOperator": "073bfaf7732da66b89c1794590873d10bf85640b018e1ab43017fc5777f2c891cedf29584aaffa0b68568b256d49a8f9", "votingAddress": "KRWxnGxeKqPTotGjceqpof9HnQW", "isValid": true},{"proRegTxHash": "5d5eb4120c93bb89f2efc57c22269b084c990b6f8338c29339b96b5a05352f97", "confirmedHash": "c74220b8bddf28847da637c25d10fc69cbbd7d99b5475bb20200000000000000", "service": "00000000000000000000ffffb90535e0", "pubKeyOperator": "99d62b48218e801e3669c888c8090644b677377b50fed6db99c2dbcb983e9647366b13a4542aaa1eb46c077d7533f6d1", "votingAddress": "2NWE7Xn9SoYNdfNG4GxXLz4iwv7W", "isValid": true},{"proRegTxHash": "bff766a0846260b1bdc718930da6e7d94ed17308ce0b7b0cd42732246e5e02ec", "confirmedHash": "33c43aae90c06b2962396a72275fc568e5a386a837e649210000000000000000", "service": "00000000000000000000ffff6deb41a2", "pubKeyOperator": "87734c9e0550fcf06a146c207094ba025aa1249d98eb692a425487c4c34a2b4c1b3a077331c3213f160eb382a94df9e9", "votingAddress": "ia9xR3RWB5G6xpj86QtWagVRZ4k", "isValid": true},{"proRegTxHash": "6d4b0978f9ee5fabd86273702df4531b25ffcf00a961649b23c58d975ae8ba6d", "confirmedHash": "f95ab6f315951ac74cd5cb30d83693c0d18790677468e2c50500000000000000", "service": "00000000000000000000ffff2d4c9b37", "pubKeyOperator": "911d5f45e4451d1fc4ff2b1d818ddf52015f87e6c1ea147398ca75a54dc1e3f7b76e1aec8332a82bf21c8dd832fbda68", "votingAddress": "2esRcXA5LNrwNaV8Wn3XC5x18r4w", "isValid": true},{"proRegTxHash": "efbb423002f9a37829df2501acb6c3ee4ff4c08900a614cac77e9f780c9aa720", "confirmedHash": "d4ab6758424a22a051c631e6e463755297cd1de706afd1a80000000000000000", "service": "00000000000000000000ffff2d5575ac", "pubKeyOperator": "0b5a252a2677912f866809ecd4e4c40fabe5071a3cc1ada7543fb1f3659176ddd732caa657ba8151002744c323265f57", "votingAddress": "z2QT8Rdud4Cxr7jkqDJTB3ozHxz", "isValid": true},{"proRegTxHash": "deb2d809330f20642adef45cbe63a8ab469b263e03ff3c3b9b3230f930c0d287", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffa7634026", "pubKeyOperator": "0bff671e8d1fef0205d13ffdf690beff70205d509f0150f53e5b59928f92d28825184abd59162a04609829ee5c2a016e", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "6720b1172fa728a3115a7d53340bc4b4947d3e336e067ef35a13f1ff9da99d9e", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff9688b58c", "pubKeyOperator": "16e47f3a26f2c30698bf32a44a137079c729dfa5cb93fa617a544975c2e54b0f809304da649ad131fa26e7e16682a7df", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "130dac8148753ae84b2baa8263ca567c6a05a426117d61f222d61035cc7ca161", "confirmedHash": "59dedcb564479592f8a803c8bdc8a26d2df3e34c0d03b8171000000000000000", "service": "00000000000000000000ffff55d1f14a", "pubKeyOperator": "8624a671b7eb6111e53adf55806ac01d6c0af6da23fe3e964650ed39b017585291cd6e2b3ff20a1f658aa26b4836abf6", "votingAddress": "3USo3jUXTCAAZRY9yLY4sEbgkkxY", "isValid": true},{"proRegTxHash": "9103a3796483da758919c7e2eb5c5104f73d8916a6f860ca6ecb0eeaa6c46d39", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b070", "pubKeyOperator": "13c7b524997766eae487d6523fd23e1c7a98486fe95f0a9b34b8869e9007e75096074cdfc87467ec62f141104f72f473", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "0c878ad4159e417a8922dff8782fe03f8aaa3ff57260b31d9683abd528b9209f", "confirmedHash": "971d111019ef62e92dc6d90ba95deaff44586f1965e5877c0f00000000000000", "service": "00000000000000000000ffff5fd88d92", "pubKeyOperator": "9102cf7f539b2412a0e1079a291098f224c1237881635a51354f999d8c4d268e214bbaeb9d5290dc05f2c9638af42496", "votingAddress": "2fLueG3hH9A46LA6cyBWQvhQFDNm", "isValid": true},{"proRegTxHash": "c093ce0756b052e0f4d8526b84f6ffbd618616dedcbe1435bb6df7c4063f6073", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0a0", "pubKeyOperator": "81d000bbc586ce6fe6ef3ca597c9eb4e99c9b3515ddc357154fc8c2da671d1dafe5e8122b96e2525a53a3a275dbcf595", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "f42933c336cc9e5bfba8d3ca4e4c290e7268e26639fdcff5348b180cd75ed888", "confirmedHash": "ce7814a3312ac5af111025976578301cfa84df4f547255ed0500000000000000", "service": "00000000000000000000ffffbc28fbd9", "pubKeyOperator": "0faa336da3734104005858a6c7ff07236089aac8753afa34206ab00a4eb85bf6390e9fc9d8847c2815346a98c4f57369", "votingAddress": "2tqZCzSZgNV7JyVrfVdwGah6x7wH", "isValid": true},{"proRegTxHash": "42bddbfa1687875465664e4a81703c29ab75ca0eb420d79b6f66b2519d211bd4", "confirmedHash": "170e70342e7f798161db75060154e57b8b80479b77a25f210a00000000000000", "service": "00000000000000000000ffff52d315bb", "pubKeyOperator": "14a49eadd093b3b508ff43fd7e0950a6d151acaf8e188ca84b1d981ec0be689afbfcfad8a66740fa49c4934457e08ea6", "votingAddress": "KL8aeMMWELFg6tA3C4jsZ6tdmRM", "isValid": true},{"proRegTxHash": "2eccf5b4e63d999712c98f5f0043977d9c3699cea0197fbfc633ae0fa8b5be1a", "confirmedHash": "9f480bcbb83d32c9fa05d5ee527ba6f3af122b942cada2390e00000000000000", "service": "00000000000000000000ffff9fcb1cef", "pubKeyOperator": "884f2eba134a3dd6b2d8a5036e8f8e6b52d7abf0819913d42023047022d96f554889492bf5e6df2d29e4cc7e4e0c1759", "votingAddress": "6NSittTuMGLruH18sw5juncPeQZ", "isValid": true},{"proRegTxHash": "3362c7aab2b2f3891dbec5904f0e8fa305f016f0722c986ebca6e3ad59278eb8", "confirmedHash": "9224b1d98b28c263a926a21dade7b9fcab00aa52f5ccf5971c00000000000000", "service": "00000000000000000000ffffae22e9ca", "pubKeyOperator": "8318710d26fa031e5226c18a650760aaa8f845c00b0d027ea9c81d687bdb6573005cd2c9439746e834e3dd5220ab7652", "votingAddress": "3bbw7wDbqzrgqXmPkehRsNgs3cJj", "isValid": true},{"proRegTxHash": "88c22a70cb80c1c75bc1e70690e65a996803966bdb323a4346488a418d2eab3f", "confirmedHash": "b225b2f15a25ec3a41ac55dd37b2879762bdbfe098aec16c1600000000000000", "service": "00000000000000000000000000000000", "pubKeyOperator": "1411d7286bb4da9f96e4f8a8b5fa04c602df92f7176f4c2491e6b0d52c24ed9fafc41ec8dbc5cb8ceefea5208bcd4fab", "votingAddress": "3FDuAz4owQ1nfbo9nDrRwD1a5osf", "isValid": false},{"proRegTxHash": "ae8890373f2639fc20f46e727264f5dc2520f74444f773e2f296cd4489bfacea", "confirmedHash": "54ca220dce6177184e60d8a3194e7046c2aad4e4adaf83190f00000000000000", "service": "00000000000000000000ffff52d319cd", "pubKeyOperator": "07c5655490e676566d7024cc967a0c9de1a74ed0eb23d09735f3c6084ca45e89de36ab916be5b45276b178b77de17c39", "votingAddress": "2okFX2N4Y1jub8zvSvgTe2yZRP2a", "isValid": true},{"proRegTxHash": "21963df05c0f6c01d2dcaa6457d61891bb1e25670e26705a7925f20ae4faa23f", "confirmedHash": "61d7ec171f3f531ae5cc044798059c056a70245e832d25d11100000000000000", "service": "00000000000000000000ffff175878f7", "pubKeyOperator": "122217249e43fe5bb46ece26b2e4aa986eb9ce24802875e05b4e0ae7f70b456a993b877692d9f37d28566ce3fe43fa30", "votingAddress": "4JszJTA5rsPLSc8RxabQhXy9McB6", "isValid": true},{"proRegTxHash": "2490f94bd82761a3f87af449091f6eacec9d9f99107b6f00c88195bfaede40af", "confirmedHash": "cdc14463eba5585162232db408d57e09abcb146aa8d2578b1e00000000000000", "service": "00000000000000000000ffffbc2815e0", "pubKeyOperator": "991ffe06346a3652cb5f26e614ad9c57b2651405c64712beb45c0b8c870e86fab7fa47a77bb66d1d6d79ce95c40150fc", "votingAddress": "4EzAeKRPe6cMmFn5r71Mnh73yYPg", "isValid": true},{"proRegTxHash": "86f6432ea509c76c6e7120cc84a13c15a8a99a3dffe378586aaf5a4d5651ea44", "confirmedHash": "1be79351e66c85c15d3a65cc1dbf765992777b8e58dd04970f00000000000000", "service": "00000000000000000000ffff5fb3f2e3", "pubKeyOperator": "04908e06e8d0ca24931ced1c961384a95771ab5559383de7a7e8f98578400adce942062019843bc90b9a5183b9ee460f", "votingAddress": "3ofb5g4F8m138E4S7yvevAWsDgiP", "isValid": true},{"proRegTxHash": "091cbde854a42236b1775646c77030916585e76cd135e2db5996da0b400d6145", "confirmedHash": "6c9f3b3e067d487b20d5806b1069599928c3b7d4cce71f860600000000000000", "service": "00000000000000000000ffff55d1f221", "pubKeyOperator": "985eacd343723c3225239694b54aea3617db134ebea57245358bdb85fb187e32326bf3747a3410d0605a279dd7da0908", "votingAddress": "EGfcDpJ9QjE35DgV1C6kJzHJoKT", "isValid": true},{"proRegTxHash": "45078eb575f1dc41ee3ffbb5c264de54c2aa0cdedb020e124e2d900d257b1486", "confirmedHash": "1cd63232c5aefe7a0039e0d8b7511121f867ae1c2bd1c3dc2500000000000000", "service": "00000000000000000000ffff50d1ebaa", "pubKeyOperator": "83d6a79d6a5d006cac96816b47e17d473350537e1736fda22798bd7a3dcbd51ff2cb315c7517450b3a9a795057e07362", "votingAddress": "2Y6ohank8Uxb8LkMfXGouBFUvijF", "isValid": true},{"proRegTxHash": "7ca995ca5deb85d82e2e80d62c5979ed5b6765504029709b85e47d98d91a6e85", "confirmedHash": "960cffe0dd7c1e3710e3804bbd1acab302ef47ef4928be221e00000000000000", "service": "00000000000000000000ffff52d315e1", "pubKeyOperator": "04d6645744e7bcc14b986de35930162452a5f7229a46bfad5f1d39da7f9205ef56fcddefd2fb14f8ee7f7f340aecbacf", "votingAddress": "eL6ypPzEHko3FXmjGjMfkAPxovT", "isValid": true},{"proRegTxHash": "85e7d15fe2cb1ac456b73605ff571553663aaeb05a7ec5e975933a5a2b0eb691", "confirmedHash": "3a8b374200a29951f17c0364d10ff9a4e34aaf000d514d601d00000000000000", "service": "00000000000000000000ffff55d1f161", "pubKeyOperator": "049dcbe44b8a7193f15011e17eddaa851b102e33cad6713bd10003fa32f218cc0678502de217b57bf8ae70dcfa030a98", "votingAddress": "QdL2tB1Hv5T2TxHZVvjX1cSnQLQ", "isValid": true},{"proRegTxHash": "f6efb0ec5c6423e586042426639bbcc2b15da1832ccbf4f40f8c01cc457c8bf4", "confirmedHash": "c8de078a0c3365b251d3ae316158cf54798142de866eeb091b00000000000000", "service": "00000000000000000000ffffbca67e59", "pubKeyOperator": "8a007d192694253167bb81f6befa7d6497de93865f727724d8de15324b28feb8384d3b382ad67aacea1b0898eec5cfd2", "votingAddress": "3L1rd17yTntPoH9E7SrBJKSbTfv8", "isValid": true},{"proRegTxHash": "9efcc6e1da00691aa4acfbd572c5d620ecad2875b79b82bd3e45d7524c424c80", "confirmedHash": "34a77f4291798d1729e442517862606ed54bb9910d34d4611700000000000000", "service": "00000000000000000000ffff8a44ac05", "pubKeyOperator": "8f4c67af009c42736e955413756afd7eba6fcf3758767844e9debccc17fcdd68af6df491309e990f5e63ec46c8db5d57", "votingAddress": "2fKeBiobcvWWAue1Fh8h6N4Ct9yW", "isValid": false},{"proRegTxHash": "b8913c1c4622b6ddf437d0a90227a3149e07b96140ece9759435a929e3c345ea", "confirmedHash": "1cf99c4811ea6b7b80fc99ad7225cafe34f5ba8c5a73be5b2b00000000000000", "service": "00000000000000000000ffffc2875dec", "pubKeyOperator": "9486bebd700269260370c32a7e5e69a6c9162cb152082db15d7e7f4a8f1488cf5d604849fbc6634ebe2eb979edd6cdf3", "votingAddress": "2GZfuMQnbt7gXCJM5AEkeGm7kmsN", "isValid": true},{"proRegTxHash": "7ecf32547dbec9de4957f2fd4b9e5389626fb53ffaca325a7dcb83b1dab7d645", "confirmedHash": "6d4c77891849cc8c4305e5077d4fefe8f048a8f3e39f073e2200000000000000", "service": "00000000000000000000ffff6deb45f9", "pubKeyOperator": "0e60023919707944d1abb6876114974db62e4d6e36b50aea44fc9ad06ff105dad76b1edb27d0734cdb24fab8b306cd8e", "votingAddress": "iSb4LwHv8j3FRCiWftVYWKRJEKk", "isValid": true},{"proRegTxHash": "b7e66d7fadcd2e7fa6155b425e8b9a8ccfc30b1c6d37bd7a9c1734511aa29bb7", "confirmedHash": "e87cc1b3203d201e3fcd0be31b37d48303a33f705ec9b8490d00000000000000", "service": "00000000000000000000ffff0888f098", "pubKeyOperator": "93d3c2288c9ac70860ff657f74f08a2a1a4b463a65fb86460172f559c84b4a7c15d63b39f4eba69ac009529ec00f23d6", "votingAddress": "241JnoKcqAD1QUmdKkQP6i3XrZEY", "isValid": false},{"proRegTxHash": "30a11b05b66bc597971b3131faadea9a6a5b588f566a6c8614c8623509ae8e55", "confirmedHash": "b9079b921a5116bf73eaab299fb4394d5e8c24dd0279b8a80300000000000000", "service": "00000000000000000000ffff44b7c47a", "pubKeyOperator": "106fd7b5e94b40b1a37a1a6a6a0b0fe78924927712903e7233aba3d27d4ba69826649894c0a1f6a0f81de3bff59f3d02", "votingAddress": "3rNTnys87p4eTk45JrPztrjvddba", "isValid": false},{"proRegTxHash": "621823e4341f6836431b97262a851b3a44c6adfb9ac88085af0cfb639598412c", "confirmedHash": "5ed4f5fc30e936bcc9c149e0495d75962417f1653c1a2ce71f00000000000000", "service": "00000000000000000000ffff52d3194d", "pubKeyOperator": "83da4cca499eff56909809acfc4a79c8fe3ca901430b71952599dbaaa5bcd103761f9d38de6bbe5775037c0e7c1ce373", "votingAddress": "TYoY1BxzPeCofBD7ktXxG6FpiTq", "isValid": true},{"proRegTxHash": "d3c0114082e4bef506496d8cbe592cbc00b377d136b59ec544b783b2d21b9f99", "confirmedHash": "dcd116e71ac014d4da07a300ea21d78ab02bd302e9a053771600000000000000", "service": "00000000000000000000ffff55d1f216", "pubKeyOperator": "095bc8350a2eec2a9582f82543e75d9f6c6dc12655028c84b0d1082223ffa8fa0d4385d605f8f1c6466517f8c7508951", "votingAddress": "qjwk3zmc4CkFUpsHE4Zsb4c5gWP", "isValid": true},{"proRegTxHash": "1879bc1feca8a3edf379adf076270dc233be4395e546157b594f68639f4e38b9", "confirmedHash": "3e48195d02871ae8c402aa9d83dbc35aded6fb610484d1561700000000000000", "service": "00000000000000000000ffff035d779e", "pubKeyOperator": "19ba302e363bc1c8fcd284e1beea3600336ded9b1773f8c962a5edb25e13daa26180d037544b0510f9979728c2b3e656", "votingAddress": "2gEBJrHv6KjX2Zjsdp1C4xAKNs8L", "isValid": true},{"proRegTxHash": "788e13cbcb4f6ac00548be5d8da1c7346a7e9aa1d03cb4fa6129bd49f3628116", "confirmedHash": "ebff57945452011813c8be51358fedd2bfda04daad27d6be1200000000000000", "service": "00000000000000000000ffffbc28a316", "pubKeyOperator": "0f3259ec4809c32a0f73923c19b549ab2bb22ef7b3af8ae279876e66a103702adad4c5630bd13ad5d369420d54fc6a75", "votingAddress": "3AJX8VP6cJX9xKZbfNnSN9xVriMD", "isValid": true},{"proRegTxHash": "8b59c8abd28b5b90b2908fd5d208b568260423ed44597dbb70686df8261a2771", "confirmedHash": "773848c23e29e01cbd78aecd1f126b4be4ade9f45335f03c0100000000000000", "service": "00000000000000000000ffff68f88436", "pubKeyOperator": "0ef12f22ca3261ce4b323f31b7729eccb74a047c82d70860e6fe5b864b2cd8b003af6b4b966b8094fe83bf1855f3f965", "votingAddress": "3sLnPFDenF4VnbTGMaxmFqSqUrYZ", "isValid": true},{"proRegTxHash": "feca8f779d1ea5ddb16e7f9d4434e1f2389f339abb244cb36d0948f27d89b832", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0cd", "pubKeyOperator": "8c0555e3899039524187df65f4b84c4f6290fc6a79fb431fa9aa7d5ba19befccbba17634d1cb761f085ccad11106ad93", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "773dbcaee69467dae564c92d0db6858088a123345fe048edaeed2faefefd574a", "confirmedHash": "5a99eb8b7b5a85dc1c779e71ec42beb4d37d2ca3195bec540c00000000000000", "service": "00000000000000000000ffffbc28b247", "pubKeyOperator": "8a872082e84fd098e8143f07a4a9a4d2db96bc33b170fb393ae7b9017d44427a69e39350751b15f6a72ad6e60914a670", "votingAddress": "26MK9LGcJvMP31h2jst3CEFUTqcj", "isValid": true},{"proRegTxHash": "8272a832af23c02ee87574ef8d095afb87582fc341a8a0e7780e2858f2c7de30", "confirmedHash": "39d7019f5e3d481b38b158cd1c5bbeddb82de8da679d854c0700000000000000", "service": "00000000000000000000ffff904cded7", "pubKeyOperator": "897d8b730aec69e22e2d388fbcb8009621cc10e015aef9d002fbbd0d315f6d2e58a0f143d6770c280ff5440caf549b3b", "votingAddress": "3cCKHaSMBFPyXXxi2g4Kjp5RatBQ", "isValid": true},{"proRegTxHash": "bc3bfcdcb48a9531a72f98381b7e78c95eb03940259e9e3b49a650058e2d9e64", "confirmedHash": "a6a92d2f4aad11e17a864a5bf226ec7df128d81cd060a13b2900000000000000", "service": "00000000000000000000ffff2d20cf11", "pubKeyOperator": "148981c5441e28f46de2b869ccf3fda025ac917595b32662cc7d4977f839a6486e3689110d34fff4f1f54b75d55fb3cc", "votingAddress": "3BPc8fedpPLro2s7huvAN1DuD4it", "isValid": true},{"proRegTxHash": "432090b9a71a2ba9468b33f1cb9495e89f0639c97f42f98825d6989facbf1b07", "confirmedHash": "1ab7c2de8064fce0873c8f0aba50af10681414d40853d0932d00000000000000", "service": "00000000000000000000ffffadd4da82", "pubKeyOperator": "0b6c8f838104d5e8d25914be92ceea07dff3357c4f0ee1b93d236b27d2501bc213b030dd72fdcbe2c1a3950d51894bda", "votingAddress": "2VVAnLEkrsTZMyBx4eaHZuz6PJoV", "isValid": true},{"proRegTxHash": "b8e29d10a04417d406486679ccd71976ec50a44918f677b88dd9decd8abe3179", "confirmedHash": "d971dc606d8bcb809389729cd35a7eac5217d27a28e553e40800000000000000", "service": "00000000000000000000ffff88f31dd4", "pubKeyOperator": "83ab5065cfa45d68930044517c05aa4d06d9620cf92dc1e256ed1f836accba622e25707317cf94c367cc7296fe387766", "votingAddress": "3LPwEYsiWHupXy7fgHH3rYwBNiFc", "isValid": true},{"proRegTxHash": "ffa12518d3226e2972688d5e05f53698ace40925c54ff94df42bafdce87aff51", "confirmedHash": "64598508924d6c3eebf28ee25d77c897010219117fc049ef0300000000000000", "service": "00000000000000000000ffff05bd9f5e", "pubKeyOperator": "0074a43322d7c92ca3523b14f4eedc97f1b083977ac21d7483d9b34f32782e76b3e3bfe2bd089794f927d6443796d05d", "votingAddress": "49rd5z8eJBWDAiDFBvaqTQjdZFJ", "isValid": true},{"proRegTxHash": "d43b490f0fac02d942436a4355d875092b5b7c23482b31f88a96a7e192fd5d7c", "confirmedHash": "2e1ee4815ccceca4dc587703c377729b474ecf5d9abd24ec0800000000000000", "service": "00000000000000000000ffff8ac97572", "pubKeyOperator": "0302bcdeb5bf4a82e7771f9cb165765e7b2fcf2605311103414dd5ac0c1581a4dc1b3c00772eea7d417f268f15ccf31e", "votingAddress": "2VEKY3cBJMHmqJLaFAu2pFdJU6iL", "isValid": true},{"proRegTxHash": "8e6f8489227fad9bf703b89cd59d067b5d80067ceba359100fba2668b35ca18c", "confirmedHash": "5ed4f5fc30e936bcc9c149e0495d75962417f1653c1a2ce71f00000000000000", "service": "00000000000000000000ffff52d3190d", "pubKeyOperator": "0cf547563bc2dc6c4622e6232f8865f27c8f3339bddeece6ab053207dc56e0ef318ba737fbc3bca03b298fad3f93e775", "votingAddress": "REqz47ik4BCFCaYgptYZYSKg57r", "isValid": true},{"proRegTxHash": "a0f491326fe01dd88a93fd4a9a1ee4220473c3f9a84c8cf7c83719e2af9cf9fb", "confirmedHash": "bbec52c7768c0a1e6e6b662dd37e0b94d61bdc277e76e92f1700000000000000", "service": "00000000000000000000ffff2d5575ca", "pubKeyOperator": "16a4b53c6feae23a1b23150e4621714c70c2f38665ff5aa1625aa9e18b5c16522fd48e7df15680340cb972fc9b031f55", "votingAddress": "2MLExNhdopFJkFwDARARXHruiayN", "isValid": true},{"proRegTxHash": "ad637133f2779b2d554432a36597c325b05ba57c398898bf9b1f56ea97fe2928", "confirmedHash": "f2912fd7d670becef535b9390874cf32da419847410665fa1500000000000000", "service": "00000000000000000000ffff87b53221", "pubKeyOperator": "8aafb5f1da52d4c5fe2a9d4a1da5eeea801911c3ee1dddc63168e68e94ecb48ddb9dafdc7c1ab16267cead406808e965", "votingAddress": "CVVpU25BN7JhYDymZ1xj8knf71y", "isValid": true},{"proRegTxHash": "714300dc3d1321bb6dcc6ac9de98a37b4cc16059f8afa46cfcb0f9dcc2c01d0f", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0db", "pubKeyOperator": "14e3855dc440dc617e3f4b05851f4152ed7d8c7324ae3080af5b5171ff8b723ed207127103e6680ad6639cbc651ab3c6", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "9744797b712c0078fcfde3087f8f4c73a92777f5c8d2c96e21b130fa89206ae8", "confirmedHash": "d198ce9334def440cf28458cd6bde8f2924eeca6388f52110700000000000000", "service": "00000000000000000000ffff2d4d5c4d", "pubKeyOperator": "0c9e8f7f160e7c001834daf5966431ced934782898ec2042395be576b667b12d99a5076d68d0de076a581efa35f06110", "votingAddress": "A9wQXkP2ZxAeKmtkyd8jBxn8qbo", "isValid": true},{"proRegTxHash": "a3899813007e7cbebbe559e30f1ca75e287629c5bb82c34f4201220d4c09654b", "confirmedHash": "6ed6a400b9c9b65d4da63626648be9e0bf7bd2b07a8e1db71300000000000000", "service": "00000000000000000000ffff3e4d99e8", "pubKeyOperator": "8d4e9a85694d0b1460921838774e48de2426a4c0eecefb54a8ebd4e8b1047fa15abf4ec93bf214a3b2cea5c6584c380b", "votingAddress": "HNT8UVtcNxPYHcngicqbafWxYbz", "isValid": false},{"proRegTxHash": "3ffefea47db2a4f942f32a74a5cff1a3fd5b23c38c5bec6d21e69e06c8ac36b6", "confirmedHash": "63120ad435a1aab914ac2e0a6abe0b71768ed7c009fe2cfe0400000000000000", "service": "00000000000000000000ffffb23e0a7c", "pubKeyOperator": "809e7c99bac3cf36111a3bc56044144fd6fad1275545a8934a5a0049092b5fe2a3bd6f8e4cebe7524ec9aaf56dad7b6e", "votingAddress": "3rinMwNRRGHr84A8RWL3ayN1S7C", "isValid": true},{"proRegTxHash": "ed22b08d6cf0084e88e870d98c49ccfb45b390f44e707f5a4af6a7563fd2b548", "confirmedHash": "173e8a4b4828bf9ea7b41ce176acafdf2c03ffaf5afc61c72700000000000000", "service": "00000000000000000000ffff86d19c8d", "pubKeyOperator": "162eeda188efe32e6da82da383602c0f34c0f002e52aa8ee21413e6cb564dc6d8b0b13465c5c0e23e257bdf3f9dd0858", "votingAddress": "3MS7CxBwxGDwes1jCszn6M2xwMEe", "isValid": true},{"proRegTxHash": "2e1513aaacd76427d397886888615665d1eca69c4d3b352d875b5a6f50139e28", "confirmedHash": "542ea33935d1f4194385acd42b51e2524e1a682a61f180120f00000000000000", "service": "00000000000000000000ffff52d31906", "pubKeyOperator": "0bd169e16e6280f31adb132f21926bf36f12bceb4f86611727202b1856a1c64dec9c2b8285bad7f2defdfe3663f7a685", "votingAddress": "2BunJrouzE1Qc3H82m4cj9YtKUqR", "isValid": true},{"proRegTxHash": "e2319e82e9b75c1ba2b733cbec509d9b1c4d6145c791f2ecd5b3121f8ce32d6d", "confirmedHash": "c58971671ff2e5b2629c64cf449fb208b7215008b0a2aede0a00000000000000", "service": "00000000000000000000ffff52d3199f", "pubKeyOperator": "190dc556fbd56e3d80e25b78306955c26ffe93e49eb3739a14001dc703b0a52b6d2223bf984ab4cf8557fcdd08d46d89", "votingAddress": "45zEWDPo4m6nJJbHb3sKiFL8KdhW", "isValid": true},{"proRegTxHash": "1a65f61ba8f614a14fbdf1dc9102aa80b09dbdc92562fcdb15381c0f000a4339", "confirmedHash": "bc98bea07a6825c7ea9c65878a35114fc540e0e32a3ebf8c0900000000000000", "service": "00000000000000000000ffff5fd85424", "pubKeyOperator": "009972d27351d6194fece0a4657be2c6a7f281e2ba1d3e787c8d4d84347ecc2749f44835b5518775d3aefebedc02f244", "votingAddress": "367ZakobLLYZnHCKVHcjhiS1Mxmd", "isValid": true},{"proRegTxHash": "4c3d1e8ed3808950fd34af4515cc16e94a16596271ff1a6de6767445f7d2ac82", "confirmedHash": "014b58ebdd34f2992b71fb9f0d20567d49dd1c0ac0aa57de0d00000000000000", "service": "00000000000000000000ffffa8775797", "pubKeyOperator": "8cb92c0f072035b86268154918f87aca3cb74e00c44a51340818191560831e076a79c631de9ff4bca502be78ddf7bf67", "votingAddress": "9nYRqF8A8XVdpj3F49dR45PEvi2", "isValid": true},{"proRegTxHash": "4da5223cdc7a34ac8b6d6659f3a788cb4e77ad5e47ae49f86342c713d47e3a4a", "confirmedHash": "b1a600310c0137b3e6653a9545e4954a5f5219c04ed160160400000000000000", "service": "00000000000000000000ffff87b50fe0", "pubKeyOperator": "88715892d243906750b659756614f121182aecd4b9922e31698d57d32cb1aa1267caece27fe55e10ceb4ac409fcc1f3c", "votingAddress": "4UT7dHFRzaXikkigEH4Sw6Zrm1YV", "isValid": true},{"proRegTxHash": "9e34edd6c53f0513f5bb37e7eb0cec3d7ef96c653ffa0f7a0a8cef84984525e4", "confirmedHash": "3f6ddff9bef373efef8e131e78b8d296ce55c28b8020e4a71500000000000000", "service": "00000000000000000000ffff92b996cc", "pubKeyOperator": "85bdb5dc93193e721d3ce515cf543240782a4338b4cc865df10d8517e88d01c3bb7ea00344a37a29d343870e90446dd3", "votingAddress": "3xVNQynPYCaB85uxyZin6qn7J3CC", "isValid": true},{"proRegTxHash": "de156d2a38b6c2d82c913eb958449026c0c87f3a27a3a7538bf671f72ea2a883", "confirmedHash": "dd864760e53b44b13b01d8309a955a9b8bc324c74508287e1200000000000000", "service": "00000000000000000000ffff55d1f193", "pubKeyOperator": "947467e12c51e0dd596b1c54e368586f89580649b65850f76b60e351bd836d1294d35018fd4f8a14ae48f1f277753dc9", "votingAddress": "461LJHoRH8kLoduFSyEMwAiHCQ1u", "isValid": true},{"proRegTxHash": "6162907af7ad2cac4759f1f97a94e85dfb455742d0165a2a4cbdd37b8aaaef72", "confirmedHash": "1d9a405cde7bb8c603331803f8377497a146ca61722ed48e0b00000000000000", "service": "00000000000000000000ffff8a4495ef", "pubKeyOperator": "1269474fefd10b055edc4d942be8e6541af6ba620481502d4c280859439f68067ffa9d4a00b3e66864d3507e6659f402", "votingAddress": "3qg95qHcpbXGUajoXdrGNBic64tF", "isValid": true},{"proRegTxHash": "f2d317663b8cb77a562cfe30fa8212d8734c86129ae4fc9d9f9730d5f12579e5", "confirmedHash": "542a013847f0be52924d4dc57e2678c4415c8bb4a680845e0b00000000000000", "service": "00000000000000000000ffff8e5d81ab", "pubKeyOperator": "8563ec9a7e9946e7bef95b70cf9dff3691f8e9431a78988f1125b564c6367e3503abc16ebfebe87e0007ef40a2339b6e", "votingAddress": "41pXkWppWzPuTbUzEDpJdwcpVqqi", "isValid": false},{"proRegTxHash": "ebc5d912d4997fc3924967d15e94ba92d518e97e40fd408752132026d041e230", "confirmedHash": "216d8236dff6f44e759636e1982476cd4a8c0a4bac75eeef0500000000000000", "service": "00000000000000000000ffff2d5575a9", "pubKeyOperator": "0acfda38540401a550d8af1963a3024904435d977cdb6c70341c8b29f6efcd616b69463d63bb1cc741dd25dea3e8a6c3", "votingAddress": "34CL6aH6eMADX5psPwbqGtxo2Pfd", "isValid": true},{"proRegTxHash": "6bab1f2f45e65413ea756afa2d8157824bb6b9e9c8dace23216b6722b567958f", "confirmedHash": "5d2aef7e8adfea5ecf416a03b38260bf0b686a4470bee5e12300000000000000", "service": "00000000000000000000ffff52d31538", "pubKeyOperator": "0f00f5c4d7e6e37256ae539b189d0dc8f5c2954267a97a2a86b0c45df9971e2e1daed83b3081874e4a505c67773c2816", "votingAddress": "3psnCi2c9BEXdsd2Q6TkreuYzcq3", "isValid": true},{"proRegTxHash": "a7a4f9d5e1938e45202ebf994023e10ac83cfd7547a8c821bb7d9bfadfdb4eb4", "confirmedHash": "d14c70c70106d87958e6a301bce622f792c0abf3688d97cd1300000000000000", "service": "00000000000000000000ffff2e1ebd17", "pubKeyOperator": "983660eb7ea5caabbf2423e39d06d1b3099519e8cff8d515dc6799e32799a3e64afd9a60486e856f4265087021ce0265", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "e7d7cafa0efad415fbb0d03bb024c7e07321c74d4812b2710aa28c11b6aa19c5", "confirmedHash": "aef6ce4203bc3d19e0ab00bf4f1ea1178ad5094bf30cb7052200000000000000", "service": "00000000000000000000ffffb9f37009", "pubKeyOperator": "8517ec69eed245311b92d8373ca234feef7ab1195a86fb9fe080026c9a6178e47535f8b169f579f1b4229a678816d486", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "041fbc173eb11c57f60d4b25047eb8a8ce3187a1c08746d36e0a8c8b2f6f5978", "confirmedHash": "ee5164ef34b6cd281798838361914fd0586074ece8e9f42f0f00000000000000", "service": "00000000000000000000ffffa8775308", "pubKeyOperator": "069fdc47b17e21a2c12eb27e81ff4c011f8088b3525cb1e6140a6f7db38123232ede01ee4fb2b7be143b756533a77ef6", "votingAddress": "kD5xuadDbuCXA2YxkRnNRKxu3VA", "isValid": true},{"proRegTxHash": "9720da9e087811a8e497eb37b73a982ea05b4bfb6cddc24c60b7c96bf3bcfc1c", "confirmedHash": "28e154b8717fc27938929763d0338a846c054409a54938c80e00000000000000", "service": "00000000000000000000ffff2d9b7946", "pubKeyOperator": "949cb9e8ba148f4df223b68f2112ed485be58d3b3e02eb73a90b0065b4b93279871b38abcefad53dd0f59f94645aed4d", "votingAddress": "UdzK1fGg9xs6e9MkkHMS45VNqAL", "isValid": true},{"proRegTxHash": "9ddc7b5b7f3b76ec75b73543f6e96094a6f667c8acdde228de98ae63fe98cb71", "confirmedHash": "0bd3bd0ba039bfa8c829775a1c3cb3500fbe2361648049951700000000000000", "service": "00000000000000000000ffffa2f3888f", "pubKeyOperator": "0ebf2fc1d6a9d7a892ed5f128bdf351e0f6f397b3aeb81cf4aa9f6701980f7e3b043c603c5220991f6af1be41d047aec", "votingAddress": "3XNkkjpP12v4uT7MEaSeSjBp1uxA", "isValid": false},{"proRegTxHash": "fdf6bc0d4b97c9078f8f363c72eedc361d12717c69d01cd71c11300bd4d0f17e", "confirmedHash": "53abee519a03da4b6e373dff6a9c329a16b68b25291d6ee30700000000000000", "service": "00000000000000000000ffffbc28b988", "pubKeyOperator": "06dc2b594de7772241ecf4b9e2f7252a45e7e76f5004b4016ed524224f1019f0364010d06645ca55dc26fa880565466a", "votingAddress": "2KmbtfRYFWy1miNP822FcBhpJsPq", "isValid": true},{"proRegTxHash": "84a69bd062b70aa73d9a2cf1fee774f667fce93e9f8c1d2933ed8da6db4d07fd", "confirmedHash": "91c68e2107de93924e19f7c924673507ee4d6f9a828225ef1000000000000000", "service": "00000000000000000000ffff2f62425f", "pubKeyOperator": "037680c3fff10413886588356c6af930e9c23827ea221c9d72307e8f54d671cb9ba8a97cea7adbc114867a05714bed5d", "votingAddress": "rB7Vhsm3DZqm1wCBJERnvcin6CW", "isValid": false},{"proRegTxHash": "50bef677a59ca0eb4b6870ff9d95e3fa63e54d12938a48035618af79ee20c2ca", "confirmedHash": "cd90b0c8def4411a79709127681937f5c3abd06f8be1b4830e00000000000000", "service": "00000000000000000000ffffc035a451", "pubKeyOperator": "09950ea874dd86c72c14eab1ddd22b7c257a6eb112fa3f4cd27f9b9fb0d08fd374454747579c0edbb8ae9a0875275e8a", "votingAddress": "4S5Py7ugYWX6v25WTJLkF7Shf8pf", "isValid": true},{"proRegTxHash": "a7bbd26207e1cf2aa31d8d469c3c67c543e30b0d40b6c356a179f2b6037cc5cb", "confirmedHash": "fed8e2433fad0a29c2731b3b3302cb3953202b8cc92447ba0400000000000000", "service": "00000000000000000000ffff1798005e", "pubKeyOperator": "19bd2d1afd6d7d77769212294e875beb5c3df6cc389a54ae79eb275a05d4af074059c9b536b672cfb366208aeedaa2e5", "votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", "isValid": true},{"proRegTxHash": "8a78f30a002d833fb6e013f360fe7c301db18e71221dd8b20038bf2ff90186f2", "confirmedHash": "86f25f4c26e5154cde5350d042f8df35017ac45bfba8281b0500000000000000", "service": "00000000000000000000ffff0363a5fc", "pubKeyOperator": "819b06c0c3b7b7f48373244aff72171ec3fa982cd5b8c8f57e411cc1e6463ba260280cbe4d3e3a31d4c6d24be6d4f584", "votingAddress": "6aqBohAVuBbuAVQnLjV85roykzC", "isValid": true},{"proRegTxHash": "64b813bdcb598f202f1751fc74ede9e62b61aa1e72e049cc4db80dd794a9654d", "confirmedHash": "7b9f7b1cd4b904a23effc461fbb53bebeb25bda847a5d8092000000000000000", "service": "00000000000000000000ffff90ca6aec", "pubKeyOperator": "95c20f00ba4c656905f52ffb613195906152492ce2373b7b0c3679e0fd46736da75447f336fe0ff5ea171c25461c7694", "votingAddress": "24TTjykkmJwRTHJndK4Aadrw3H55", "isValid": true},{"proRegTxHash": "8682fc71be2a2fc4ef4b7ff49ef573f241e2aa840d0fefd5bcd586748e1efd52", "confirmedHash": "4b1d58573ae691d7f8341870eb8c734e152c233435d7ae021700000000000000", "service": "00000000000000000000ffffbc28e70c", "pubKeyOperator": "90cddc1fdbb24b1300a01abe4d24161e51d629b0b4e1a99729da557a51208ccf118c8f1e2cd059753d9ca1f8aa6f7551", "votingAddress": "ghNcq9cnvLHXzh2SoALn8QJFRaQ", "isValid": true},{"proRegTxHash": "65947ce579c7b7c5d0fe3dd86757e744a13dca96e02e4ca35756f84fc44399ad", "confirmedHash": "86cecc3f2abe030bf155ff9118ac40d31a8cfcf51c43fda51900000000000000", "service": "00000000000000000000ffffa76355d0", "pubKeyOperator": "8992660502dc70a9e3c457ac1b288c2606679297d631201a96fe645c7b7ba83d11ac540889011ad865094e9e337f5277", "votingAddress": "aY63v2m2MfqAzbTKU6wRVANt2Av", "isValid": false},{"proRegTxHash": "dbdefafd979556ecdbced80afdf775fd6f285958483dad6e154f8f51365f6b63", "confirmedHash": "05ae26e27de86a881c26d7863161b0f13cf4d24d0f0ceccc0300000000000000", "service": "00000000000000000000ffff2e65bcf8", "pubKeyOperator": "999db96d4f53ff5949a4a1bc6e64255f8cafe31632e9c38fd04b9b6531b3b929e553569702ae515f8b84334195e7434c", "votingAddress": "wMLdEehxtMqJQ9qQC17G8rAT1t8", "isValid": false},{"proRegTxHash": "c882bb971b49b6345206fbc2a1b7f81eb2fddfb1399bd03a5a5303f26dbb481c", "confirmedHash": "2762075589a7a5cd19fdbcca2c5dfb68cd86d630137cce340900000000000000", "service": "00000000000000000000ffff50f01dc1", "pubKeyOperator": "0916b53091719bed602ded3dfad60b6f3c6615d32b37322dad7ecd2d235c8a50fbaa74993790a339a90f14a9d61cef2d", "votingAddress": "3vuyEC3gBKAGbMUmGekFBVKpBgsr", "isValid": true},{"proRegTxHash": "f54f6cee7b3105ac7362e564890112646f61b3582d326c797571a504561c6278", "confirmedHash": "a6afe9eb784fd656fb041cea44ab81f984f3b02724e7dacc1700000000000000", "service": "00000000000000000000ffff50f01a9d", "pubKeyOperator": "041e82a4c3541cde0a7ee58cc97f644e2f2806e6443b11b26ab9e5de35e2279e723fc8c4439a93a053cd49ecab43f4a9", "votingAddress": "Nn5hJqbBkLx7GqbLaT6A6hTbb8a", "isValid": true},{"proRegTxHash": "f486dd32a6d2042181bf2616bf5d661721aee31dcaf32c69376f4c77a20f9ce1", "confirmedHash": "fef5135139f41355ae12bd323292e7425873d8eaa8321aa81a00000000000000", "service": "00000000000000000000ffffb23eb408", "pubKeyOperator": "8b67f5adea7d9dcfe965d8e3d82409f7f28bf9c1b3c258eceb04a29ccc28660f2c72d0e61e970f3594e4699aa8a3f317", "votingAddress": "48MDGzRCj4JaBZnFrVoZkf2r4eTV", "isValid": true},{"proRegTxHash": "1d4aeff3fa54ddff317a8859f7be019f267eb048badc9ad8755adac73c5ac199", "confirmedHash": "74eeef8df9323115d4c6150616ff4f8836bb3cd60809df920f00000000000000", "service": "00000000000000000000ffff55d1f18d", "pubKeyOperator": "983a8ac061341935281b7a570641a0e278824da1ffb32b70195446261572af118f987823371a8c693985a0e0c3167bf9", "votingAddress": "4Y8xMbo4ViwieNuYqnmHSSKCsoAM", "isValid": true},{"proRegTxHash": "c94b66c7ec1fe64ec1dd85b270e47335b0f95ab6aa45f80a2d9c6ec24ea748cc", "confirmedHash": "c387b98e35baf58ffa825db4209e30f1c7f1a1b71f1251e50300000000000000", "service": "00000000000000000000ffff80c72ab9", "pubKeyOperator": "06e0549d2f9559231a48853aadea12b15bd947feac1cb28df86defe34880d62809ea818983645e34893c1d2b9d5395c6", "votingAddress": "2ygfP2pWsYWJf6xA6t3dJkmVSJtK", "isValid": true},{"proRegTxHash": "1dc2d226001a42d676b9d6d0cf9389f71c37fc68d85d223f0fdf7a9f1251769a", "confirmedHash": "93c12705f98a0f2820aaf1e1475f2eac7ee1d326bd5860ed0e00000000000000", "service": "00000000000000000000ffffa123528b", "pubKeyOperator": "1786f8a7d83b21e2667c8ac1712d64db7d64df60f465cf9540839f9e7c3d0bb3d2e5b382930aa4a2a6f3432a55c1b8e1", "votingAddress": "F3BhCDY6aSFeD5C61NpBTmZdM3m", "isValid": true},{"proRegTxHash": "5ab61f225e6f280ec7e93e7b8f7add585d0c342ec2644c5a0d1949cb43a7e879", "confirmedHash": "b37f1b20408355ad250861e716ebfc4e6b18c3b8429207af0a00000000000000", "service": "00000000000000000000ffff3353bfd1", "pubKeyOperator": "03c792f02d4258ca2a5c13e7f90e268a50fb4d482248137070f51993ae9816c82328b1719a94d6b273970883ffd7c8cf", "votingAddress": "2c9x65KoZxLVUcS2nsSZwPYR3mao", "isValid": true},{"proRegTxHash": "be22e4eb57f163f8e7daefc106e2adc95416f686559c9729897a816aca85dd12", "confirmedHash": "ddf98840b3390ddae52ff0b397ed2f2bfeeffce3f7138e180b00000000000000", "service": "00000000000000000000ffff8b3b8639", "pubKeyOperator": "84a526b91dcdbfbdc5ec380a6cbf16ada7dae75c4719f492cfed0706d2be53aa7a5261feb87376d752ad48551fc80006", "votingAddress": "4UBUVBmxsEAExU2psTR3QvXLsnhZ", "isValid": true},{"proRegTxHash": "7126cfe49bc13c09d5d39c6240fb37393ecf9894634d506ecce95454cab85331", "confirmedHash": "0ae74dcb9a58af513a23ab2ecda5646b6182ac8a0a370ae40000000000000000", "service": "00000000000000000000ffff688309d7", "pubKeyOperator": "10ee3f30ed8385ad2e3d687d703443b906ede0b998220a8b039a3312c4b6a6e2b4810b42811ae07b92a9c424a050f35e", "votingAddress": "Yjdkgb6ecuMknDJyUkRjswevpxi", "isValid": false},{"proRegTxHash": "4296e7244261690395407a50d40ade878ddb9d296df6358f73b41691ae35b569", "confirmedHash": "a85fca9079c952dd736505bcd851a91aad44499894f4f1fe2800000000000000", "service": "00000000000000000000ffff340e4da8", "pubKeyOperator": "00d670c4641725f45285182a77b799ce2e7cb9d9d28ae6d16fce6491bcb266162484f79d41910263b6838feba6728742", "votingAddress": "28cW54W4jbyUctiVyqPLbMkDWtrK", "isValid": true},{"proRegTxHash": "b5b9c0c07007b3a3e4eb44171d4e669c5de1c5f0aa9f2b393290a0c356217049", "confirmedHash": "4fed360464befdfba9c36d625ab5899541838aceec4a54ea0e00000000000000", "service": "00000000000000000000ffffb91c6591", "pubKeyOperator": "0e9fc0e6b20e95e0d898fd1a9486cd31a5438581dd77ac5347a9a94c6cc5d07b1d7a9d670a037a45a623d7b537b94ed1", "votingAddress": "4SnwozvKndoNGMTSMHHGB8rWjMVs", "isValid": false},{"proRegTxHash": "eedd2229c4e9855f00b469adc05b5e8e2f3a8ac557faa769c81bb418d49c35f2", "confirmedHash": "c985dbd25e02152ea6645feda28ba34504897d0a0fbd3a2e0100000000000000", "service": "00000000000000000000ffffa763d603", "pubKeyOperator": "0385fb505a74eb9262d192e5e4c9fe54672f5bb4d9ec2c55628ffeee6a8531e466999ec032e5e0cb124926430165d1a1", "votingAddress": "B2vCJoxgScWXKsE1fjorTcVJkqN", "isValid": true},{"proRegTxHash": "2346a03b1d137f4e4c73528128580e9764fb34d6b0970cdde6acf08f8678d4aa", "confirmedHash": "c2d2bc0436c1e5c916fee275944adb042da2aaf63ac2e9db0700000000000000", "service": "00000000000000000000ffff3e4d9cf9", "pubKeyOperator": "8694ed09e5851479eb4b29cc41adc6f865b0c26a05468883d84369ff1824f687aae7bdd37185474e52a9e16483539074", "votingAddress": "3Jg7hTZcnHrcWpBjksYmrccvUfRk", "isValid": false},{"proRegTxHash": "0907e26959f30841dd462e2dd84f24b3b7f6e5bb5756805e008087d0bc991d73", "confirmedHash": "9343aa69e17683fdcb96c9cd878816c3e3e47d23afaaee941100000000000000", "service": "00000000000000000000ffff867a28ba", "pubKeyOperator": "8bbe3fcfc4a1d2cef01b05ab66aae131d000d0577cccd68452061ef24e143cfedcc033c2fc47d8f9a2fd60b07f0f135d", "votingAddress": "2zjXYWpEqpFUaS2MhoNXewxXtpET", "isValid": true},{"proRegTxHash": "45c28c6916ca7df7174c50370b74f1bd161e0de9a6953f9f46f6e4dd1ba459d6", "confirmedHash": "6ac41dde4c0f7816ec7e36add6c93465e418d12ec7cc1fb11c00000000000000", "service": "00000000000000000000ffffcfa74078", "pubKeyOperator": "0d87c6c8fc6707b20762fd3833e8492c7b7710520ec7a9a4d1fa015b7ac4861ed48288f7b5e10e0fab50e68d2ff81fd0", "votingAddress": "48sbpts9pbsCQb1vUaPdvLavvRR6", "isValid": true},{"proRegTxHash": "6eb330fb71c985252172d4028a18be4d1815c9f4b7bd6cd1e56e07f30be0683c", "confirmedHash": "e320cb9e4da9b807e9e4a65812ce0a2292896e5c00625a960600000000000000", "service": "00000000000000000000ffff6baaf839", "pubKeyOperator": "09f7ca5ef72abea2c573785b0d928f843fbea872083ce3e785f3e326997c3a28b0f6da1a0de80126193bc6908f38cace", "votingAddress": "4WGgJGTMCWwhFRctMFBr3FSgk6uu", "isValid": false},{"proRegTxHash": "3cf3d04d9ddd7ad15d0fc2d9271fbe55f3c7629d631443d3116e3bd864caed5c", "confirmedHash": "59760957f2cf5485d951c048c27b7317d8434c2067e5868b0b00000000000000", "service": "00000000000000000000ffff52d315b6", "pubKeyOperator": "967740ef7542035d097822a80648998181edc5f86b7a85a10febc5b52cfb2e86c94fd1851892ebca4c0b3b071323e051", "votingAddress": "2VtFMwBrFBcHewEwYxuaQjk2rDat", "isValid": true},{"proRegTxHash": "45c4d7d274f8e47bba8eb3d2b06e581884299c032e1a5a67ca0098a999586be4", "confirmedHash": "54b1326c6bc695a1b6fa4ed28960e001b84e8d0dfa70ef740f00000000000000", "service": "00000000000000000000ffff52d319d2", "pubKeyOperator": "92918cd9276bc709337022f262a45feb93750793f78d292fe51774672bca81cf9c092c35d9800278b4ca249a685bb617", "votingAddress": "26Nor15yJixLkYtUNKUfk7wDGgne", "isValid": true},{"proRegTxHash": "93aa5921585eb831c4601bd2f0b031c5198f10df4dacf918ebf7370edee39ced", "confirmedHash": "6105df555dde45aa7fe0d83bc961c0c919ba16920b6b188d1400000000000000", "service": "00000000000000000000ffff87b5fe75", "pubKeyOperator": "80b84cff0c18d98c9aa2c0323d72d79a91344683594b5657f7ac3bed74797b400e8800367eaa2c8725085faefcc679a6", "votingAddress": "38y47MwHG7ripDNwNCg7SpTNEjKm", "isValid": false},{"proRegTxHash": "bf89af8f6265520491825fce34fd7d7e8f09386b5da8eec1c280c666ab234ac9", "confirmedHash": "d005e0de1b4c5e6aec26114e017655c063f515c444c1265e1e00000000000000", "service": "00000000000000000000ffffbca6b249", "pubKeyOperator": "8691fb4f452f71ba1c094eff79d749afb2a058ea6fec5c4affe39fac08c4e1ce7548a41c536c30c1573e98ce16387de0", "votingAddress": "2mbHKYgFL6GCquL2jdb4S66QMaSi", "isValid": false},{"proRegTxHash": "b322b84c040179116c5a5a9e3e1956283a1df80998fc6cfe2876e2d0e499cfbb", "confirmedHash": "aef6ce4203bc3d19e0ab00bf4f1ea1178ad5094bf30cb7052200000000000000", "service": "00000000000000000000ffffc11d397d", "pubKeyOperator": "06f68ffa7fe87db7cc2279a43ed1b156e3f9654b910cdea162407d738ac23d6292ecdacd9fdd0b2df52add3c8e615359", "votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", "isValid": true},{"proRegTxHash": "98fd3d5a8db072827c8d23274e78b7384fd429dcc0fd8d971ceddb4546f1fe62", "confirmedHash": "6ba5141ef7fa05e1ba188c0d80182c6390deeac528f447411000000000000000", "service": "00000000000000000000ffff3456962e", "pubKeyOperator": "1902d4fdab22cbacb6c840f84c66c522a0e261da7772ea0e600069ff976f0083fd2f9cf3f942fdc885f82275f21423e9", "votingAddress": "2SFWWWLwGnLfvVqgocMmCzBRg2L9", "isValid": true},{"proRegTxHash": "13eee2768ce9ddaba62fbfd7e41620a7e0666f675de20f250fdc2975bb6d7fc5", "confirmedHash": "646d2c6f77057abe5bdf3a3978c842ebe5d8840a3c189be20300000000000000", "service": "00000000000000000000ffff2d5575aa", "pubKeyOperator": "96ef023dd79cdea35b0d67871af8ae49c43e44877ab2417ec0cb65c8bbe2406052fa4ef93b742d7e88d6d32877ac702a", "votingAddress": "3E3m92CCfxknq81XJchUSFTznmph", "isValid": true},{"proRegTxHash": "86abad867be91d3f687892d4533230d132590cedd8406e779370a46be92e8fa6", "confirmedHash": "a218da0910c8618cc258d19652859b5ab3c6ee6762a412680200000000000000", "service": "00000000000000000000ffffb9053533", "pubKeyOperator": "0139973020a8a710a85d410956b6b1245244d7b8a9cb1bfdc44932542996622918d039fcea45346f0af3495d38283461", "votingAddress": "3Mq2rhnyJ2Mnh8Vm78CWQwz7Dmse", "isValid": false},{"proRegTxHash": "9d38693d6dad63428c6497367e4c8c5dc443dd19908a175a2deb73320362fa53", "confirmedHash": "e500969f06327c73c173c2b1b7dbfb8b1ddfd76708c1818c2200000000000000", "service": "00000000000000000000ffffb29d5bb1", "pubKeyOperator": "134057c09733f406ba830414a436c1473f7382dd76d4a5c5fd73ff9a569af3b61e59feff1f5a17eef9f7cde976853f6e", "votingAddress": "2e5ikQWE1RwFANiPtQjZE2RUEkfM", "isValid": true},{"proRegTxHash": "114facdc4d6116d041f60447740ee56be962c3d49a14f3f500b914e79c0e3fef", "confirmedHash": "44bbcc917450905c4c682062c4212c42797c62fbe8da91de1400000000000000", "service": "00000000000000000000ffff50d1e1df", "pubKeyOperator": "1166845dc9091c83533bfbe240850a2f8df0a1e55c734cc69dc9f546bc71effa4244723dd10f3f1d5dbca7f8a97b0b85", "votingAddress": "jRHfk5x1dLhQAf5DfCKebdmtRfF", "isValid": false},{"proRegTxHash": "f9996287cc1b8081d27aec6a89bf59d7ee1a0ffeca0537ea1f77b508dac88d8f", "confirmedHash": "a040f70d86919cf216e6f353b3534e7122524e5ed0f38b412800000000000000", "service": "00000000000000000000ffffb95cdcb2", "pubKeyOperator": "952312664fe7cce377da1ff950b3b5d1b93bc0660f65aac43e96b46fb39dc449abf9cf882d3597a1c7b8cd5a126943d2", "votingAddress": "ByMwyZumm9Uo8ohL4MUfaifmmiw", "isValid": true},{"proRegTxHash": "a0f414ed746d471b8c35ae2005dd3831b724367aa5217987e79d8ac0719ad239", "confirmedHash": "940b37038967c460d991890c6a11903d87231fb714ade2073500000000000000", "service": "00000000000000000000ffff2d3f6b5a", "pubKeyOperator": "81b6d9c7821984cf77b423a0b10d842378e95cfbf9b85fa287c48e2e798862a5735950cafd26d5f84a9fc0af0fc6796d", "votingAddress": "okZBPc9LT5MdbYzuJ4oRnZwRNcD", "isValid": true},{"proRegTxHash": "31cba3475905773e0bf6559d2137d2fd92eacaa979616303d33f181b584626ac", "confirmedHash": "0bd5607d210b55f517251720d5f98e856e295625f0a0d9ad0500000000000000", "service": "00000000000000000000ffffc0633893", "pubKeyOperator": "0657e122d672c773141d46667596522186ad3d131f10c5985a0751dbc5ad1cdeb690894f677eb8ce9bf398b7c5f5b228", "votingAddress": "2Z7JoX2dfRAMBJ4NnDC4Dbjey4dD", "isValid": true},{"proRegTxHash": "7852785a31cdc762b63905eae6da4da940eb84d04de405388d4eb525f20f61ca", "confirmedHash": "6b3ebb3eaa279e9d8bb3014cb7ff271fb6fc32faf65d9e081c00000000000000", "service": "00000000000000000000ffff88f38e20", "pubKeyOperator": "850938aa1888f8db7426e2737c40a1dafe88678cfb3e94d6529eb0d9805bea38af95421bca2d40f8dfd521f981f0e4ba", "votingAddress": "8hbJGKGrEA36vbKCsX7b46D8TUc", "isValid": true},{"proRegTxHash": "b3745f9361b339116302e8415c4e02d3863651a06631b0416aec9194b57b644e", "confirmedHash": "919ca932c48b8fe9c5e9e819f9dcfa004587f4bc0cb398630200000000000000", "service": "00000000000000000000ffff2e04d9f6", "pubKeyOperator": "930dca2ee94e40e737abd9a05748df2da21050959484f3b3b3146d3f5a39a1686275c2beaf4088c7b80a82c80bb2d725", "votingAddress": "2mrACjnyR7ckaXExNX2uwkUzxW7q", "isValid": true},{"proRegTxHash": "b08d552f9d3b2e176fd3ea37f67d4f505daf3b2511ac6d5fc0bdeebdc6770dac", "confirmedHash": "c1574dfd0447c70df53a4dc66f56eafe89b9842e0019e52c2900000000000000", "service": "00000000000000000000ffffbc28b6cf", "pubKeyOperator": "8e2093d9cbd082705ea17d1062dcb4f457c1914260ce5898842fd072c26ca9c868e2f8127d5d7ef7ac06ab168b89d912", "votingAddress": "4XYHXufrpBq5GFwrgJ6Gs7DsdGSU", "isValid": true},{"proRegTxHash": "b1aa4e4e08cd0c4da01b2f604991372674d50c0924f88d8095185a18f0041094", "confirmedHash": "71f4e3d88823258b050403e979604e5055a19491e2993ae20b00000000000000", "service": "00000000000000000000ffff2f6e9a4d", "pubKeyOperator": "8780696d74836e851ba55fe9a351976338da5c28d18f2404aef16f898ff6362982264cf5ea4ebe3f4bcfe845841b0212", "votingAddress": "24zvBjA2Ro3Agxe6PyEwMNmgkD9S", "isValid": false},{"proRegTxHash": "ae715d4590e4c3ce6577f1ca37098480918e19bd4827288b6d0af9cce2b4c159", "confirmedHash": "90a77c0f96be31ac4b73c5706f5b6f398f947073b0885ff21500000000000000", "service": "00000000000000000000ffff8b3bf55f", "pubKeyOperator": "97c5728c37f74e27b0164244b6fbf9291029477286e1885e4ae37dcda9176587697dc1d7cdd8f1191602fc5b53d56af3", "votingAddress": "3kty7jTSdFQ12xUQKRyFcxiRXcd", "isValid": true},{"proRegTxHash": "54e43b016d1707a0b813e4dc59426731ee8fb7c655c7bbb61ccb2827818d5731", "confirmedHash": "09b5533b5beb65bb3659602a838bbfec098fc792126e32d61100000000000000", "service": "00000000000000000000ffffbc28b98c", "pubKeyOperator": "1047f1590485b0eba8f8babb76f7e84b9c515007ada131e2239ff546d097aae35dca6cec9e378092088b3f62f722ae66", "votingAddress": "3mMfWy1ZtALHGAzeQumuT5Ze6CbF", "isValid": true},{"proRegTxHash": "d337134df6e1a69cfca7af57bcf5d706d43932f40a2e53bd799cbc23957ad7fa", "confirmedHash": "e029cf04446b721b2239e9bf0f1bdfa6a6f11badb6ddd76c0f00000000000000", "service": "00000000000000000000ffff36270a69", "pubKeyOperator": "170961004043c26b4be55e8da64d60357e72cbbbdd693b45ba218e10e05a22b63776b631ca80064e2baca6e144b44a4a", "votingAddress": "4EjtV5HnKxHCdWNtExQnzEzzE1z2", "isValid": true},{"proRegTxHash": "fca247d0967b61a62e91f8e2b29f20567c4fb8cc8658c4ae7b3f158cd4554dce", "confirmedHash": "db6e24accfb09c81ac4539d366f24cc3b163af5701dea2a50c00000000000000", "service": "00000000000000000000ffff87b53227", "pubKeyOperator": "94dd833b270e582e2feac2516a364db26a6e8582fcd0a0c3779c709a1355f770ac1ed03e812fe767746d98f53ab468aa", "votingAddress": "4e8z2WV1M9QnLWunB59oahyK6yT", "isValid": true},{"proRegTxHash": "3c07a39126f926c85523591fe8c953b01906e2f0d57bb23a5dea6c0b2fbaea24", "confirmedHash": "812b0e5b37a80dad9c43e43458afe77bfd3bd1b92d64d4841200000000000000", "service": "00000000000000000000ffff9b8a9fa9", "pubKeyOperator": "1640d1b593d93e6b5899e3cf91057effe2b5fe147bc10770f90ba19666b505e60d4a2c9fc904c588baa25a962f30c371", "votingAddress": "akocbgMfTGZfphVeQjMH2LbhDXn", "isValid": true},{"proRegTxHash": "8c3fcf6657c209516211370e438c204cbf68f1dc85eb559d7e5fd951b171fcad", "confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", "service": "00000000000000000000ffff9f45cb11", "pubKeyOperator": "953d2de39b5bbaff78103c01600519c88f0dd3de67d2282b01b0f08335355d90977c04f39f8ef6aaeb06b415ff49b827", "votingAddress": "3sNFfxmQktawwHBpqUsfMKYHWpen", "isValid": false},{"proRegTxHash": "6e478da3ed786b37c7020d2f5b2c2140aef3f22035a0e1b9edea0392f5c1f708", "confirmedHash": "008cdb30d435ed0afbecfa38322547bfc699002d3f2abf1f0100000000000000", "service": "00000000000000000000ffff867a5244", "pubKeyOperator": "032523e8bacfa9a47ad6831fff6cac66b47c57befd7988da48e1d0acc1bddf412fe75492922946e66600dccc970a7659", "votingAddress": "2oh3VYnJfZMqPVHgARfP7815RdyX", "isValid": true},{"proRegTxHash": "37d967ddf4270650d5430bd184ce71461ee7ac461756fd9ecbcd6287e3adb837", "confirmedHash": "9d06a09d654a2b8c9288b3b80aa6d4c2203a1580147b24fd1b00000000000000", "service": "00000000000000000000ffff5fd8542b", "pubKeyOperator": "9479533493363fcee7c3cccc0ad3fcf7808f100935f1b122cf2e8bf12a2bfb75efb7910539230a716f2a1a00ab2f5888", "votingAddress": "AFBnf8qo8nBPCTSKMtWB3rmqCJb", "isValid": true},{"proRegTxHash": "58e394bebc2a48007f6aded454da3547801de04c3b22e1fdae287daaff73687f", "confirmedHash": "952e6c88e297bcad575869b0984e4df11b4e2402943d8f422600000000000000", "service": "00000000000000000000ffff74cbf4de", "pubKeyOperator": "81b447e421c7d3c785432a253849a15baec78246a53bc89c1bf0526a89d8b4cb0470f5954b979ecd5c52c0366127371e", "votingAddress": "4NCPTk6pEbZoikG1ZLKPomCAHqE1", "isValid": true},{"proRegTxHash": "c8edc0ab954fb201a4702343177a94dc08530f0fd5685d8356d0926ca1f21c78", "confirmedHash": "0dd765e19d89a4a57c37af23cdcd7b2688e6a5d54d1c61373400000000000000", "service": "00000000000000000000ffff3625c7ea", "pubKeyOperator": "103cec76e609c17911c05d5c41722b209a0be70bb8bde4537feca19bb72ec79afbd45e2567efeb41f942766e1edbbd5e", "votingAddress": "39fVG3PMBYerLy1QG7MPfNTRfe2b", "isValid": true},{"proRegTxHash": "b876a155d9ff191902d303c861a451f5b177e398dcaa4dd1ad3ba9a3b3d1d42d", "confirmedHash": "4e5de03b15b0060634afb1203a0a26ca0c0a3b8e2694f0820900000000000000", "service": "00000000000000000000ffffc0f1d3c2", "pubKeyOperator": "8e896a676903dc7c18cd00b33c3b1738260144760269a810016e210cf97ba7d9a91199416ab0671500315dfa626ca8c5", "votingAddress": "2FQQQr8Rtx44j4DdD8ffhg9tZskc", "isValid": true},{"proRegTxHash": "9c2009afaf92cf604cca30d677248236600405d110dc9a3d7d659536642bf27c", "confirmedHash": "65743b27df20ce4631ce8b80eb99e5603a082be2fda34f862300000000000000", "service": "00000000000000000000ffff2d204ac9", "pubKeyOperator": "867ed2f432f2fa93d2b9b340a9c176a47ab70da12caa97bffe12ca8d863ea5d258bc04cec1c0229c9389d443c72cc30e", "votingAddress": "4TKGSAyaU59VAh9vgHcjosZvKwSb", "isValid": true},{"proRegTxHash": "4b68b654ed6615db319a9748fd75407efd2c4c7e3df8801bce77becff02241d6", "confirmedHash": "73f7681b7a8db65c6170aad5af1bfb51ef73c6a43bc95dcd0f00000000000000", "service": "00000000000000000000ffffbc7fedf3", "pubKeyOperator": "0260dcb73135557becbbd7b42899c0d85060a883ed24004d4365424b0f7c859929f39d74cf397ca8c93964f8c229daf7", "votingAddress": "2QYGy12AeUdA5pi9aBj93fNUMKCg", "isValid": false},{"proRegTxHash": "51c86f17b63137ea0eae5b269ee643ea8c097f14f83e76f045d7fb815a8e38a8", "confirmedHash": "627106f1dccc691e3652884d3736584df8df012a19205a3f1300000000000000", "service": "00000000000000000000ffff2d4cd1dc", "pubKeyOperator": "062c0319fe4bd266d2021df324f18c710d6fbbadbd0aa8f3755bfbbfef02f920972362f9465644337b0d4e0758aaecc3", "votingAddress": "3Jiy59kNj5fbvDxptijXNCsfkBux", "isValid": true},{"proRegTxHash": "f8d23e55fc63e251fb25682c29e0a4864d99233390768f70f2fdc320ae727ef8", "confirmedHash": "82ca96e5f6088c66caafa258bf4f11ec1220ee6be5088ea81600000000000000", "service": "00000000000000000000ffffb280ca62", "pubKeyOperator": "17370dd45ca5cba60cdfde187fb4ce37dd19c5acb9d2d7cfb9fe9997476eb503a10165f6fa8f72d866f4a0a1102d5658", "votingAddress": "cnPv5Y4mA3BK4GL5jk5V4ZgynRS", "isValid": true},{"proRegTxHash": "b81f7e33fdf5df093c089669891d9890020e1785505f113ba0ab4696e12c86eb", "confirmedHash": "139e95da9437fdad47acd43037e872ae08f682f69698d2390d00000000000000", "service": "00000000000000000000ffff55d1f1a8", "pubKeyOperator": "92cf219768bf95e594983a850da2ae975e98198f83c8c1eb114ce1ac8fcf1ff8b60b9593a4da3b71f236ffb49f73997b", "votingAddress": "3oqc31sTmeF5WFdLNc2LTChdMfrW", "isValid": true},{"proRegTxHash": "4c406d58dede843e0672ec995681a51e2a2ef3a30640f1da6f98ce4dbe20bbae", "confirmedHash": "6e5c529df5e3caa0c61e8c4d769b04616343986d4a8394a71100000000000000", "service": "00000000000000000000ffff87b50841", "pubKeyOperator": "82875932bdc1045d699f9b9342b4c778e2df8cd50cd2ad3ae717ca7e10d6f7d29b690a7ac8b8f601466895c28bf44bfa", "votingAddress": "4D6qWsuQxoiMBu3KCw5ikjmjmePa", "isValid": true},{"proRegTxHash": "26951c0e75dd6696a45e517f9a56b530d6fb1585e2a9d9b122ebe4d4ac5411e7", "confirmedHash": "9b69f17244d21881d47dfc9dde03b5c7edfb25042bb5a8950000000000000000", "service": "00000000000000000000ffff87b5349c", "pubKeyOperator": "187fd173a8e91b430c4797667fd6432594247190b503575a6614704be0154ac9074d3c148fe6a3dead5bff96426d22fb", "votingAddress": "3GdJMRb5W8mesSbMdXDmjJmPPaXQ", "isValid": true},{"proRegTxHash": "b280a9886aab8584ee5cc5ad606f102fb27ee74b07cb7ee92979682ba8b0a69c", "confirmedHash": "20d19d9a388609537d7f6bf7a43b60243e5401f3764ba17e1800000000000000", "service": "00000000000000000000ffffbc28a300", "pubKeyOperator": "8f64edd9c2524b40ae50a9046e4d096fcee995f57a73ae5101ccb0d6cfe92ae11401341e85f51e7ced55652458d370ca", "votingAddress": "2UdqWK7UJwsFassbGoFUhertUopQ", "isValid": true},{"proRegTxHash": "2783c3f3adfe5c3a8673884161878f01cd8b75985438906a47a7c936dc7a989b", "confirmedHash": "a7d7dcd1662bd17a3c41369714b2655f0b0aac88f80866640900000000000000", "service": "00000000000000000000ffffb280ebad", "pubKeyOperator": "0437f6841cb41267d16c587518c66fde7706590124400ccb18b60c392b93e9cfe829733793f640d965ed38957b5b4725", "votingAddress": "3FB8sFqW6C3S2u6d3eaeoJekCurZ", "isValid": true},{"proRegTxHash": "af75c0ad393cb55c998df3721e673d4a852d56726258185b3c06c57ac1169878", "confirmedHash": "2637304a36e8705f512c6a6022293a681d68ba521ffe083b0d00000000000000", "service": "00000000000000000000ffffbc28fbdd", "pubKeyOperator": "0535b2dc13276aaf4f301a16f3c2f4d81e46f3ef5a8f7f56f372e2555956682d74f0c8dd652e49d7da7586842850975d", "votingAddress": "3shTCWDJKunNLQrhidvbtZGJ9T7G", "isValid": true},{"proRegTxHash": "813fedb5472b5ac57ba6f9f194cf010c44e2b65ff4f89f4cc76f0c3e05ecd41d", "confirmedHash": "4130b5dc087f489c12277f886d58978ccf05fa57e694729d1400000000000000", "service": "00000000000000000000ffff52d3151e", "pubKeyOperator": "932d5453579dd2ba979738389cba46a9c4930be8d41266204acbd28bdc01931aaee32cbbe98bdd0976e07fe7a7e33ab5", "votingAddress": "28wwrB65P2BkxgTtTszNJp4MB1EB", "isValid": true},{"proRegTxHash": "32e4e192e55cce80bac7d46f45469ee5b67f38d83fbe79f93342eef97a1c2602", "confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", "service": "00000000000000000000ffff55d1f214", "pubKeyOperator": "843ebb4bcc51d9207c3aa1765f45a92c0e2a43a1fdfdd710e45f4ea80700e465550d4b07ea3194296851e74a08eb4a2c", "votingAddress": "2KVNcmSozJUE3HWkFjw5xxs68gpJ", "isValid": true},{"proRegTxHash": "5d01430c851276ac6d6ec6a0c3a91e7105270674b08a5f361cbb5fb4f5f99ae5", "confirmedHash": "265ba3b55cac5759716b916acd01f6d96c16a70fbd715d252e00000000000000", "service": "00000000000000000000ffffa45cd5d0", "pubKeyOperator": "03568ec3f6aaa956d5846d3a4b94e713c26b1af733effb4a00c18d4a8498be891877f48f159e2df1d8e75368ff3107ee", "votingAddress": "3p6szT8T9mgUUvctdFuMKxq3uFLi", "isValid": true},{"proRegTxHash": "1ab8e96806531a8573c1baf4e0b214346749db6357b7dc0233dada1f284e25c6", "confirmedHash": "78beddd755293d10ea0e5075820182fb9597525056c947681f00000000000000", "service": "00000000000000000000ffff52d31913", "pubKeyOperator": "12ecaf7a3c45c5b9408b5a22043d3c0bacd51b8c8d7f671a888463966a44f54fc3578eb6e91e37bef6532ca05c2cda18", "votingAddress": "zp4V2x2E7Q22zTdzx9JN169bX5q", "isValid": true},{"proRegTxHash": "54f1a7f134b5f23464bfdd4a5b41bb09847935cf8230775d186cedd271033e69", "confirmedHash": "5deb2f6281c6aa19ec3a8e29e74f3d5ba059400e946ecaf11000000000000000", "service": "00000000000000000000ffff55d1f1fa", "pubKeyOperator": "14047194114ce6fcc94df6cc5befd1b99a8498464034b56c18818498ec20e43a3bbd181a4ca9d45860f376abd36ed8a4", "votingAddress": "4GiwQAgLVWMqHDCyTHQA48V5YAvc", "isValid": false},{"proRegTxHash": "4b963a0d43c6649610f16d9908257189d37fb92b409454dec0af9584e9285aad", "confirmedHash": "7d7ae09372b1b4e75a752e57d36530e9cd6827ff375b7d360000000000000000", "service": "00000000000000000000ffff951ccc93", "pubKeyOperator": "89aab4cff13ef750042451785d61b8a6965f309605456f0c251558818eabd274b5aabc7d42b37ea5c8f790d401bbbdd8", "votingAddress": "xbNFFscBiP1tM17is9Rs9tSbi7M", "isValid": true},{"proRegTxHash": "da3dfb94481f169b78b8076cdf03c3b78afd4daffcb702d4a39f0cae9f941a9c", "confirmedHash": "0d05878b4d490d6f3a4c2aad1c0b5af8ccb0b7e5bde54bc92300000000000000", "service": "00000000000000000000ffff86d15c39", "pubKeyOperator": "90f1cdbcc85e2b5fe6913f362290ab9a1d6c959f9afb8017b49d3781cfdab286c9b17df4dbb19c6dc45a31dc72f30069", "votingAddress": "3TJ5ediqSWw3LwP6FYsThsCtvR4m", "isValid": true},{"proRegTxHash": "b3d828376387057e6d487ee46dff5ceee98e25aa9b3dc171e7fd91553d3257fe", "confirmedHash": "984671fc89c282b4c317406d7bb0d0a2959a97c5df39960b2900000000000000", "service": "00000000000000000000ffff87b5322a", "pubKeyOperator": "03f5baab255f987e274ea19b1b51c9dd06ae739477b6c4ad3a2f207967e469cacaf66ada2a59bfd90acad1bb0d9d117d", "votingAddress": "Ve14LnKwjmYyKfFdHN4muKPa7Jx", "isValid": true},{"proRegTxHash": "5e6e4b22c5e58424e29e830d378dcc5846cec3c1771646b698cecedf8935dcde", "confirmedHash": "38bad08a12a4090524ee260344f5c8d538140abdb94f4ab81200000000000000", "service": "00000000000000000000ffff91ef5ad6", "pubKeyOperator": "0c696645d03d31edf1184227b023e1df7b699bd2206b2f23df6222cff6ec8d454770ba7f518310b5d342618ffb83204c", "votingAddress": "2X2e9FsxJqUSSPPVYxdYeLcheDcT", "isValid": true},{"proRegTxHash": "a3e6857316ee4b3b861c90b261b9abd5de049f5c3de879a2aceb0356742b72df", "confirmedHash": "bd3206ddf481a91490f5e6a2f4f6b4810504d9c7ea64abc90400000000000000", "service": "00000000000000000000ffffb23e98de", "pubKeyOperator": "858b723abd9fcd44f34c78196d6800baa4ce6122b2df0c870877e30838fa8507fd2a60b1f714b801a07f4d42b62c3797", "votingAddress": "obUWFmVuFZPJejTCpoKKKumPHgB", "isValid": true},{"proRegTxHash": "a213e7a9dbc11e41f9fa532062558153464434e0a718369679ca47a8665bc12c", "confirmedHash": "48b5849ac27029fff865bc4fa529106dedaf250de70978101b00000000000000", "service": "00000000000000000000ffff68f8cd92", "pubKeyOperator": "93e133fa8afc56132063d68d4f836b1d7da3eb86702dd77707d84d677f5671e42386840023ebea352dd96f312ca18989", "votingAddress": "3eq2vEdy83tsb3TYNoa2kmjakzPv", "isValid": true},{"proRegTxHash": "2c0085b1017e725ca816bb9d24f2e029f4c6722f50e5624fe516fc707203c992", "confirmedHash": "2a3998cd33149501caddb276edf15e3304f4038f0447ae5f0900000000000000", "service": "00000000000000000000ffff42ac0c56", "pubKeyOperator": "098b2c2f1ad59ed60b2c25e648fc4e50898143cbb1afe80f140f21d69a5739e41c3356d47bf9c9da89c3c434133e6d78", "votingAddress": "XoPxCbTh41BiyKYtHyxAReAQRxZ", "isValid": false},{"proRegTxHash": "b88ac8c35a9389f866cf1cace1b1b749dc4aee851b68b575a31b4e10ffd72190", "confirmedHash": "cc273218b9567eebc91b19aef589f31c7fa93a72060b3ce72100000000000000", "service": "00000000000000000000ffff52d31931", "pubKeyOperator": "0b5c5550eb44e27331639842a8c328aab9f285ac8814364a044ddd3a8e24deebba42af12b1893f41d35cae54bad16c28", "votingAddress": "4GU1WZm5h49JdmdZWJWAVPC8qhR1", "isValid": true},{"proRegTxHash": "c73b5e5baa66bff102d8482d6caa3611bde8905e1c12d115ff94e247245fe814", "confirmedHash": "218b67c8b120b8159271c0062aad57d1f4bda8f4507c65e21900000000000000", "service": "00000000000000000000ffffac685af9", "pubKeyOperator": "18c315f500fc82b7f5814694bb31e2b59f706358d88e0fcdf1758c85d8077fe447b171615a4d684806e6efd9c51b229c", "votingAddress": "V3bSqNoWJ2Gd9JVZxerkaoPBZ7M", "isValid": true},{"proRegTxHash": "4e3d1aef0eb131e756b3b0099ee19955662dc30fb6b022096f0aadcd8857db3b", "confirmedHash": "ef22b3c2694ff2f45301c50054a8f967a77c1953bf5922500c00000000000000", "service": "00000000000000000000ffffb009d207", "pubKeyOperator": "1710624a2dc8bb266e51f76d4cfdc1f3b1199b271841658270849a74668d0694ac9cf2a6ce0117973e49b163af7e025f", "votingAddress": "2HHqHZqFUAeGaySMZi4nhhDWBydA", "isValid": true},{"proRegTxHash": "935e3e3a37d4adb5bbf3723423300cbb647e88cf31bf9f9b69b9805942adaff8", "confirmedHash": "2dfeb7f521a8d437f2ce0ec1a2b93bf12920919c45b8f0cf1600000000000000", "service": "00000000000000000000ffffc3c96016", "pubKeyOperator": "872e88ab15ac663ba9aefff28a7e4b17270f9d4b62bff63f16d9a412c5fad040286f4f6c49e9965ae79696bf847446dc", "votingAddress": "Vbb7aZcALEUouU8npMK2GMsrWwH", "isValid": true},{"proRegTxHash": "c978ea72d30e1ba04b7a60c0b55a5ed37b357bf5881f66399865e9bd31c04043", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0c4", "pubKeyOperator": "8a85de1ed29713a65225b85c17e7c34e39657b61a65a77659674b0c4dcd532cd328a83ca38b1aec68ca4ae83bf49ec25", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "34fa5fbafd4df980a9f998fcb7998e087a8a02d6866c9428d4a0acb06b619bd1", "confirmedHash": "c8fac7c25511b02ef6f8cb743098492c6b65d12e7f8611830800000000000000", "service": "00000000000000000000ffff55d1f1e2", "pubKeyOperator": "0958d0ab1f083f5383f0b5e1dc673780eecd5853c398acbff890e96c11f4eaefd28a55e605da2ec1c33f87120ee5aa0a", "votingAddress": "2c63PiBhLViEysPMWbiP7H4o96s4", "isValid": false},{"proRegTxHash": "fa7a234ebac051cc2664eb618596d9986eb431d8c7f78c62f9e673c138ac68e5", "confirmedHash": "46b0b34c1973d8d970b4b7ef450247e79a8cdf8f6f72c8051d00000000000000", "service": "00000000000000000000ffffd8bd9764", "pubKeyOperator": "120fd7e57ac55c7bc1cf816355aca7c641537e102e126017228d2c9e79b9ad898c127782af9a95e472a7d6ac521136c8", "votingAddress": "2rr4NeBV6Bu4zRqJxuk2E8AENybX", "isValid": false},{"proRegTxHash": "16ae4116122ef65baff5bf0e4f8149138e0f14fd9a85c3cd9a42071a83927334", "confirmedHash": "03db3b05137d1e6d9bfd1b3b142bcdcfd5c12597bb6c547d3600000000000000", "service": "00000000000000000000ffff52d319a4", "pubKeyOperator": "108e03fd4b6af6cdfd223f90f33a62ac84783a28a5a43f366eec81a6870b0e2c8a406b8a23d59df926365b94048c27a4", "votingAddress": "2kzHcwrQkYACvJt4LsTVoYDf23J2", "isValid": true},{"proRegTxHash": "69e4a0e3807b6f99bb699700ce5334ecc3ba158c2d48ed9b8560822f1f239ed0", "confirmedHash": "783fc6a233e0854653c8c3a22cbd0188b6cc25063cdabe750700000000000000", "service": "00000000000000000000ffff52d3191d", "pubKeyOperator": "8bc6ba8268d61c6799652a96e4649c66b3df17a666ec2aac5825f73c7792674784006994ca87b497f6c8cc0a08675161", "votingAddress": "Ns1zV4gEocJiRWvcCHGkLHHdZHJ", "isValid": true},{"proRegTxHash": "807d4132fd8d9cb5a38e306f178b81c67278a040e95ecf7fab7559eac23e7157", "confirmedHash": "2e76f59997f2c48595691472c108ec64b11bed25232771ab0000000000000000", "service": "00000000000000000000ffffbca67df7", "pubKeyOperator": "185d36f99b9287a2d152ea2d5ae5a9fa9686107004a50625569fc3ebd5f3bb487ef8fefe97d2fb317e507c79b332f12e", "votingAddress": "2E7GKfWbQMYdVGKdeZURRX5RR9hn", "isValid": false},{"proRegTxHash": "6c491118f2c40f9d3fd59213708867ddd09f7c320fdcbf988ab036044aa1dce8", "confirmedHash": "4f47d5820812006c18a4f28d5e17f4992ccc82850bf319b10b00000000000000", "service": "00000000000000000000ffff2e658eb5", "pubKeyOperator": "0b7d9eb0b24edc9ded01631c88751da9b1844e04e821756ea07a49582e61577568db22cfe43fa51163000ceb610947fb", "votingAddress": "YMbXpU2NtCYPamCFiWdjd979MFj", "isValid": true},{"proRegTxHash": "81affea01b4de70e31e3c509d8060f5334c06d30aeae6ba90431dde34028701e", "confirmedHash": "4895c7dc69ed2216c351dbc1589543cea71bfd62eb4b1c360500000000000000", "service": "00000000000000000000ffff2d4c6f6f", "pubKeyOperator": "8d7f760f2686e42d85d29b4a0b45da294beb0f52a2c6c93a717532515354fc846e3028642e02324750a5beceee6c685c", "votingAddress": "42TtryJhQ1KmNasWXb39PQ6dju8y", "isValid": true},{"proRegTxHash": "a0a6386f0d11f2d40121521aacb6ef91e12ced461d1162c9ba9b3d4213bafdc5", "confirmedHash": "23fba4bff175751416253c813a0ea17199a799945174c7120700000000000000", "service": "00000000000000000000ffffc28751d6", "pubKeyOperator": "12df58db5cde038a10fbd85c2f5fc855ba2542354a6214917e11a64504726031c7c0e4d70249c42a8e53aa97d6423592", "votingAddress": "FXGYPsiF1cKZLDCSMJzXXm6ZfKP", "isValid": true},{"proRegTxHash": "85bdf4d408893f664d4a45b1616261ece5230075436cea2456375bce2303ea51", "confirmedHash": "9caa1f77c24a2cb0eb4c6c33698a40bf9b4fc1dc614610451000000000000000", "service": "00000000000000000000ffffb23e3253", "pubKeyOperator": "831c24961094e89848ce909b7848c23e703a3737a20c48cfac24652f067b63491ffaad50636415ed9b5ea35d0cfeab06", "votingAddress": "3zTKJUvwGftYYvHrKH91PBE52tc7", "isValid": true},{"proRegTxHash": "cc3d5987abedc602f3cbc925b5d5d1a491502fa7122f6153b64bfc501d8377a4", "confirmedHash": "fed377a131622738e69830603d64fcf0cc6913d61ee901fa2100000000000000", "service": "00000000000000000000ffffca3df8d3", "pubKeyOperator": "95ef2bde3eec8f748814743b9961e4fb2175b51bf54f2c2331da906508bf99437be95a1a69e171347c6d1b405435c968", "votingAddress": "2Govh7AVY9mv9b7ukWnC7ycKHyzF", "isValid": true},{"proRegTxHash": "7484bfc3a5a99af7e76829037682037f563222077ac42756bd56dcc295394480", "confirmedHash": "5711bd842f9bd6095729c413a0e2e71677713fa8929fd7341000000000000000", "service": "00000000000000000000ffff08031dbe", "pubKeyOperator": "96666cf3386555bd9fd6001f09b4ff6d40e5e4d0388e0bda8af6c264901993d3ffb8580fc366f4729d15fbb04df7b10e", "votingAddress": "HXp2GpuPNX5AqEgheE97JPiGdQD", "isValid": false},{"proRegTxHash": "7d031ce1c6379caeb5e140b91ebd03088043b957983a06c762a503fb78601bd3", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b0a6", "pubKeyOperator": "99c2439b1ea08b9b6fe4049d1b89186224bbc97d901399a939d3832ce61144eed5db8afc5c1a27e2855d964ef16eba39", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "03186cb95dc423828be40259ea5bdef5a515f19c01ac5a2ac5622c149f5cd959", "confirmedHash": "5c91bfbdb241a60eda938fdadeaebd9ca63967bd6a53f6e50700000000000000", "service": "00000000000000000000ffffb23f798b", "pubKeyOperator": "8f4d2430f981939b6ef492e4faf52a1beb7c058e6d39b9925e1005cd23902d872993649029149d9f74c446fcd01bfd81", "votingAddress": "4ANBTBkKkU6qa9ePk4fT93sGhNUa", "isValid": true},{"proRegTxHash": "2f56e2f7e6865d3db2c23a2768f602306ec12499ca5c311df9d1d3523b998c9a", "confirmedHash": "cae076ca0b778593362119aa35eb6a68c8c0be3204da5b900e00000000000000", "service": "00000000000000000000ffffd4186a82", "pubKeyOperator": "8e42e5ce2b9ca9ca65ac42838fc016f976cb35ed622026156a9d0b19ef8d7f4652296810607d174420c6702759a66b01", "votingAddress": "3zt8k6auK8axsbaLFQDcsT2VXmsj", "isValid": true},{"proRegTxHash": "7ac2b87851aac99a13fae0a01ec371111a6081687ca0d67d01afc19da1ccf1c7", "confirmedHash": "1ad56fb945ed05f99bf30c03f70b6d8ff9002f8c40533b7e2100000000000000", "service": "00000000000000000000ffffd8bd97b8", "pubKeyOperator": "0485f93cb1c4a7780d9154b6e850e6a29294e6315c2985200720a4c96a4d75a592ae4e5047ee5efb16f619495aec1ad8", "votingAddress": "4FTApGGckqNtJBDDBob5rwuFi9SE", "isValid": false},{"proRegTxHash": "0bee5c1eb36e26a9cda5ffeb1140aa97c17ff8b8f6c2b10e4471cc36663ca9f4", "confirmedHash": "9844dd2b49b1acc3d74eb5efad4b046e4bdcbac67f95422d0200000000000000", "service": "00000000000000000000ffffbc28e717", "pubKeyOperator": "8ccf792016ce52a83c5df329645358da511e1ba3630fb5d54083c97902032f2b353b4ea3bc0583ef6d59f7c32125e9d2", "votingAddress": "46L276cdRqYZcoCAUgHagUiCDjDS", "isValid": true},{"proRegTxHash": "3f5286614484f5979ea919dbfa935745c14648bd7a82c0d8bb33226d83d71ebc", "confirmedHash": "8dceca79d013ac2897593246c8038e214260f17a27ad97970300000000000000", "service": "00000000000000000000ffffb23e9f49", "pubKeyOperator": "80a0b3f21a61f1834c593a21ef1b87d09f3bd961fd7b86a65362c9494bcc189e5eeb590acde2dfe0f2d79b74e040766e", "votingAddress": "yeiSvWymzsNcwYdWtTD4oe5pJ9c", "isValid": true},{"proRegTxHash": "36ed871611bfa0299ef1418777be30c58a63d326b291c56bb530387743f5d0d6", "confirmedHash": "9e459517cedc72f52ff94754c9ade0b231f85be5eb5beb241200000000000000", "service": "00000000000000000000ffff80c71292", "pubKeyOperator": "0090963a2121a507bd1a886689e294494b66723a695816e00d65887f7055fb055fd0ba7379588c88fe3f42d92ce9144d", "votingAddress": "4NmQNH4UU4EM84H6iJrpmLkjncXV", "isValid": false},{"proRegTxHash": "96064da1c6ec83628fd1044d0aefc972f23ea31d1c9295097a3058d0dc3f0f53", "confirmedHash": "4e87fc311dee6a194b5b22b80c5b635dce3c24760bfb072d0600000000000000", "service": "00000000000000000000ffffbc28b6c2", "pubKeyOperator": "18dfc021b2606889e42aa018082f8f79fbe0e71b69ac16e6af64b84ae05547586b91c0d7296ed9a82b64af13873df4c7", "votingAddress": "Tx9LVwkRkQAGpcpnELEdieMiUWC", "isValid": true},{"proRegTxHash": "2b442b161893bed093c7e07d019cb1fa41161109965dd99c928bf88d2802d327", "confirmedHash": "b93e3edae7c6717e3d503510b69e999fa689fcbcf17d97de0e00000000000000", "service": "00000000000000000000ffff80c7a91e", "pubKeyOperator": "8e0239e05f012639f6cb37dd2c4cb8527ef94def158b67b43eeb01d0cf570dd77db67b66f0cd47502df50ce0c270b885", "votingAddress": "4LeZZ4mH8Unpg29QBgzCHaqVKnuV", "isValid": true},{"proRegTxHash": "e20c4bd9a145f2eb148d333dc76aae9ee0bd40d6f5eec538473a3228c605162b", "confirmedHash": "0a7ea8bcf5d426e26b0e201dddc41b84cc01ac1805d4868e0000000000000000", "service": "00000000000000000000ffff2e657660", "pubKeyOperator": "8f436f1f27afd7c3c1294d6b4532413abc281f17dceaac2be1569c995f4721fa22ec9c4b5703967d968a9c815ba81e32", "votingAddress": "LJqbH9QS8rJ43kNcpo3erd3zNyc", "isValid": true},{"proRegTxHash": "8ad7a6de146dc1b88f5ad561498e12cd65fb9cc470b913b332409b9ad29b07bd", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff96880e42", "pubKeyOperator": "0fcfd0799308529584a2659db6d79f30537741a17e9711dd11070e3210212717ee89dced9bc58ff8ed47f6db20687f8a", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true},{"proRegTxHash": "75a91112757f8d397eb7795cd92ac72bf8a7249d91ac78370ba5e8b28475ca16", "confirmedHash": "fe2af33d4f88298679cb3908eabfc19ff30bd907775b159a0100000000000000", "service": "00000000000000000000ffff52d31944", "pubKeyOperator": "85cdfd7367bdf06e8fe870d98bb071f731b1652c63c643800aa59adad12f360291d40361faa1d463708a01afae1c1496", "votingAddress": "3rm1xF4E51XeaJ37kGmSCsi28EHR", "isValid": true},{"proRegTxHash": "dc0665c83f51edc73c7ae9d69a37c2e22f9cca15317150e996f4a81117972024", "confirmedHash": "83ddb9d8a7d6b5f148e04bfa6ed74db12ad505e4027d2a950f00000000000000", "service": "00000000000000000000ffffd8bd9341", "pubKeyOperator": "8bc2ae680da0fc2b7721e907b093eb951221bfd614ccc6759750874ca867aabf8e98cbecdc0e0f25a292f93591fd505f", "votingAddress": "bCyJjFw98MMwN2D2uqyYGAAzERJ", "isValid": false},{"proRegTxHash": "c6b0d5a734f95b4b4fe9c174ad351cc261db0e5c038adac7e47013bec48264ff", "confirmedHash": "80591cd31e93b0f5a8bef612e9a729f06aec959c121dd1360b00000000000000", "service": "00000000000000000000ffff58630b01", "pubKeyOperator": "0a5baeafe7f1a57efbdfd649765699dbb5a2f9874ca6f85bf4460bbff208eddc7ed26a8cff55f5e079935ceee9c85308", "votingAddress": "28i4oF2R75LG54xUy63Dy45oqZ5u", "isValid": true},{"proRegTxHash": "110e5ed94a881f9c67d755cb8aa752d86fc4679755c662eeade4cb71219286bd", "confirmedHash": "696f8f5624c7245c38a3795b78a7085ff74a070db1b24c8f0100000000000000", "service": "00000000000000000000ffff5eb0eb99", "pubKeyOperator": "9796c4c25c8269f93d86cc9ace3595aa2d76349177b53340dcf4a9af634ef9d843e68d58919992982711c16e7932c7b1", "votingAddress": "3tbyhUXnWEHnAUgbaujMcYpbsbBj", "isValid": true},{"proRegTxHash": "370d45c373c480d9fd77785792440ce6036e43ab256f98558d198f7c9845530c", "confirmedHash": "f929398c44720715346f0b8e6047d93047e451107b6878451c00000000000000", "service": "00000000000000000000ffff87b50fed", "pubKeyOperator": "8783c2451d046a9cd43800d64232b82915519730c8773ebd845d96c688e576cb11d30227700a63231a0c3f78116c5bf3", "votingAddress": "3AJgy5nMD5RmP9SppTMW65RksJdk", "isValid": true},{"proRegTxHash": "b340e80f21927060d024318d95e06ecec9bc29c76416dd6af90d81f8f9cef10a", "confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", "service": "00000000000000000000ffffbca6b05f", "pubKeyOperator": "007b06ce9c06e9f41c21b37e422b736a68901dbe6d3bc40ceffa40934c973dfd55d0e592c22b6636bc21c4783c505ce7", "votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", "isValid": true},{"proRegTxHash": "209262a203bb076d0fbe419db3c4de11c489c41baf9335572d2889b8fc37a1e4", "confirmedHash": "5ccb46ae656de413a6692c562bbf78b5fb84711526712eed1900000000000000", "service": "00000000000000000000ffff36dada2b", "pubKeyOperator": "01962dad63fc3c29a20c245767385b568ce8eef1a74ad1512cea3d1e90f255a49a96e282275cabd8ebec9018980a90ca", "votingAddress": "3ambWo6tsmsdVXLC8TJg6e3qNGD3", "isValid": true},{"proRegTxHash": "b784055505c58cfe16a08640d5fa0927bddf204176e829256941d03f68669c51", "confirmedHash": "8c60e5dfcc3fc4b6eca5c8f6d068a02e48761c7cd8e825011200000000000000", "service": "00000000000000000000ffffcf9ae42c", "pubKeyOperator": "0af6ef429f3cbd3e2aea47c8174a94cff9bdb5299aea277df2d5244860b201ed81eb5718a3c7e630eb5ffae375b70bc4", "votingAddress": "3ULJo9ERiAtGmF5FKkatcgt5nveD", "isValid": true},{"proRegTxHash": "7b4830d4e69ee32febfb89c048b7d2abda4291ebf665d2adc85f7be860af7458", "confirmedHash": "15409eee633be949ac015f328e434352d470299d9f6413141100000000000000", "service": "00000000000000000000ffff55d1f23c", "pubKeyOperator": "95b2a0916e9b59bc2ab649b0648bc3d4defafed9b5309dcf91fc72e06b3fb79e6cf955d55896d02b09696cfae628def6", "votingAddress": "3ZEWpgYWFY4vLnSu2nSMuBL3nExk", "isValid": true},{"proRegTxHash": "7ab6f091810584b2deb7bca2682dd20c7528340f27f78f4f701a1546114ffaf3", "confirmedHash": "daf12a45a88bae03aee38773d16bbda1ece34181041933640e00000000000000", "service": "00000000000000000000ffffa516345c", "pubKeyOperator": "07864345d950dc891a4364acbfe98651ec66843146453f26e181bbb612af170197cf9f72daac2a65ff46707ea01ac734", "votingAddress": "2Cf56S6pik9futp4SS5UjjiLqF7N", "isValid": true},{"proRegTxHash": "82573bb43033f33c42f7697e151a9aa7583a8b085250cf6c742ec0a3ac0bcca9", "confirmedHash": "60e0f3fdcbc47cd038384cc747e163d00ad92e094b2ca9712200000000000000", "service": "00000000000000000000ffff52d3193d", "pubKeyOperator": "10ee7ad7f595691af1a77bf6bf27ddc8478581c0bb035cd24b743dd0415b336a214c0d079e75454f7624c7e58df11f42", "votingAddress": "2Lhc5fk6q9BtTqHATjSzbg8HBR6Z", "isValid": true},{"proRegTxHash": "6399c7276fad3ff4b5d7ca47090bcf47e10df2e73ee53068c670b013443272e6", "confirmedHash": "ba1fb51ff239c701b47f62c1c2acd9b35cd765b45e7ce8440000000000000000", "service": "00000000000000000000ffff55d1f186", "pubKeyOperator": "96e17dd6fd9ced0e1e625345df491393870a748d8dae2eac7677793d3f569f2f3434f5b621d790819ae82736c30414e7", "votingAddress": "4GAoPhK2ZkV76NddPFhC2hBpmPBX", "isValid": false},{"proRegTxHash": "4b36ca12862a7b9525d09ea036f559f4d47b46ab3a6620ff584e80c786ddbaca", "confirmedHash": "31906c52ba237fb114c3780eceaa77e0bee1d4a52e8cb5010f00000000000000", "service": "00000000000000000000ffff55d1f245", "pubKeyOperator": "8096ba65270d7a9c888775884fdd47a91296af3be40213a6b33e51607df26a89876ac55fe8b11ab48c2160de01c6a1dd", "votingAddress": "65MCSyDAk7paWvzPW43JZDd8MAA", "isValid": false},{"proRegTxHash": "ad05691c206055ed4f272c18b3491940ff5bf8eae222a368da35e9aff34c2dfc", "confirmedHash": "ca65c0760a3d6be9213e9d1f24b151bc5cb552cc721122903300000000000000", "service": "00000000000000000000ffffbca66740", "pubKeyOperator": "19fd0bd11d717857e9f1abd50dbaf3d54000b9fff555c8135dcf77e6026a8262265020df8c0baa03a83c0ae32fd56416", "votingAddress": "VzTgopzSqTWfB3ccoHjnHecdcYw", "isValid": true},{"proRegTxHash": "f457893c2925f2054e06bdabe136ef99e2c9e780c016abe55316a320bbe0e4a2", "confirmedHash": "725fb0f087522de6f7f3cdd3e3e728f6852d1c104563e0290300000000000000", "service": "00000000000000000000ffff8512e553", "pubKeyOperator": "10493b877ddc57792d8edc30d1a822b2b31077d279f169f51889930ccd44ff75ba75c96a59561f8c81fc3aeba0d3f380", "votingAddress": "KCm5YPEyGtRFS7WCwLva9PJ6Tcz", "isValid": true},{"proRegTxHash": "f1c285374b1c9f0f9a914f9277acec3ab65274a047585d1297e7624fed77e035", "confirmedHash": "f536336aca5420ad5f4c2e4f28732ef763839f8dc3c512a90d00000000000000", "service": "00000000000000000000ffff054f6df3", "pubKeyOperator": "8e0d9217090b33752c5bdd2bf616817753deeda438e8dcaf5383f24b8be6fd0e61eae00432dac24f787dc6a8b504b9c2", "votingAddress": "3PjzgjDjyPdAMmp6TkALKoJQWjzh", "isValid": true},{"proRegTxHash": "f11839ae78007e2a265b901b3dc360030481d15d4c002d3b431acc75bb0450da", "confirmedHash": "a4fb36819956efa2313e1628bd4cc6c63c93cef3d68eeebe1700000000000000", "service": "00000000000000000000ffffcfa74079", "pubKeyOperator": "194c65a0502c0498f7999912565260cbf7efece2e97b49daf8c351fc39f38b3ebc4a835b7761e8d6035cf0596c71f5db", "votingAddress": "ThcxJo3RhYW2EPdLdL6PDBpTgNS", "isValid": true},{"proRegTxHash": "ed0458983dbe82e481149312606da7c29d9489764bf631c5f6adca50bf3b2473", "confirmedHash": "0cb8360f47acf4d83f52985b96888a60e8a13f408478b5ed0300000000000000", "service": "00000000000000000000ffffd1faf239", "pubKeyOperator": "090475e3bc3464514e6df3ea579fea5b69c825c4b43af35efcea1e81b8ede2695a487b0186300ec9648f06eefabafcbb", "votingAddress": "23Fr8LJQdT23PAjAMqR6nr2zQQFH", "isValid": false},{"proRegTxHash": "321a1d5e901f5557499c0f16c4e32485a785545c9a7fe36e163c6129d0bccc51", "confirmedHash": "a5f0c1ae375f7457bb35ab6dde23ec75b11fb0a991bce4f01000000000000000", "service": "00000000000000000000ffff4622dc1e", "pubKeyOperator": "1112026674ac425ad312b368903b1bc60101928719b4e51bd821746c5dc1094e6e0cb057b4a5e17578fd278d94780248", "votingAddress": "JtGKmHnWCgytTuxktgiQsNaBPPr", "isValid": true},{"proRegTxHash": "f86b0488ff22062adc188f39f2a7400ac7272e9233e9b78be66eb4634193e0d8", "confirmedHash": "a0e8b21324b5facb852a48afe634c20c68a170add6c7c3fb1200000000000000", "service": "00000000000000000000ffff52d3152a", "pubKeyOperator": "8b1e8daee774fb2fd5d5fcb2166602847f2af32e28ee4351617037ac213d00ef11a15fe758dd8160559f9522233fecb8", "votingAddress": "UHYWiHh4cCKqWhQW7zNVWjJzsXC", "isValid": true},{"proRegTxHash": "22d9edc1a15165ce364e089d33d84668757fdbd1c17aebf71f3249f388a75d2c", "confirmedHash": "9fc04149221b72f129d2063421cd0471877850356f0df5df1600000000000000", "service": "00000000000000000000ffffbc28f166", "pubKeyOperator": "955ec2ad6a33bf6015192e10fee066a503135518a2a526939c2a71a82bef5b9b919d731fe042b118ff4e1b80dd0771de", "votingAddress": "3ebs86fo9cb1sBNaWZ8B73v5smuk", "isValid": true},{"proRegTxHash": "91cf88eca6a9481b4f94d36b9da6ffa6dca15509eb4a674fafd7804c963b55b2", "confirmedHash": "d57fbac48102742cecb076cb448a36962e291769ddd8735d1300000000000000", "service": "00000000000000000000ffffb0df8863", "pubKeyOperator": "8594c7a27b83d703d11fd450a8a492d642c6f5085b63ce2da1ec738db90567350407242d7827e824b411f0ac11a6439f", "votingAddress": "hiuaMT3Lk8rR56dRPLJWU1xifws", "isValid": false},{"proRegTxHash": "1dabe1d32b66a8da4bc8a3bb483181c164d60662602fdad92025df481b1aaf5b", "confirmedHash": "6d9fc30ebec8be0593103aa0a211a852f86e496432e78aa30400000000000000", "service": "00000000000000000000ffff2d20986b", "pubKeyOperator": "861cc1f7901e70ba1f8a3e994ffecd96a4c49441c3c770e00242fe64f2aaa53336f4393ba6b7e825e656f12e37f62653", "votingAddress": "3BHsqHZo6hStYjZPU6AxbthV6HPH", "isValid": true},{"proRegTxHash": "996defe8a91fb3db6840066c1fb98e9ab4c083a784f936e4a5b0738fc3614091", "confirmedHash": "da4d6d71bb3783f1045deb428ce96eb9854768af5b630abf1300000000000000", "service": "00000000000000000000ffff330f4ce0", "pubKeyOperator": "824b3da399a3f6ae25869a13e26e776d761fc26a9567534c07031bc0e7ebb5473f26a25f9a2b3d72360d9d9b83d8c76b", "votingAddress": "3Vv6bRBVYWKXnBZnzMsU7mUqAemD", "isValid": true},{"proRegTxHash": "dd6041971a0d42cfd7376e47cefe26be245a3bd5b20ff82881b7d285f36a9dcd", "confirmedHash": "284bcbbfe7d6aa21461eac4d5c104676ae6130bfb674eac90c00000000000000", "service": "00000000000000000000ffff5eb0ee0b", "pubKeyOperator": "92da697f18081244ff2abac7537e1ce323ec95946c538c837b44fa69ce7eda9824d1f0df0bf7484af441283a87940590", "votingAddress": "XheoHuG8t4dXdzkfWmuvPdyfDFJ", "isValid": true},{"proRegTxHash": "f333e90fbf73dd863d6de5ca4d4d7a3398edb84b2a6e8e0ee0afc9b75f002934", "confirmedHash": "0db90adc32f76250bd1ebd8500aba1cf40129b387128bad60b00000000000000", "service": "00000000000000000000ffff335387da", "pubKeyOperator": "83c3f51da81168d5c7791366a28ec717994cbbf7bb92d1916015999d9b37237305e8c4a2399a53dcba9481fbca9cb0e7", "votingAddress": "MVLqJqfCmrFF2FmYXZmsZzsKLjm", "isValid": true},{"proRegTxHash": "8ab179742a22761ed6001499a56754ff8690082a6f86d7047d1c1c9a2e0f6c4b", "confirmedHash": "f4e56ed87cbf5c6439e89e656c3b7002d1183258e869aec21400000000000000", "service": "00000000000000000000ffff6deb458e", "pubKeyOperator": "09addc90a12fee075945d41aa170167577d5812c1224189462d74988f4f2df2b10619912067a0d476c776f531cffb9f2", "votingAddress": "3vYajXGoUJ2nxfKNqNBdEBjBCiGi", "isValid": true},{"proRegTxHash": "c68860d5b570d6ccfa7907a3dd6788c86dd3eda68443da31b65da244ec0823b9", "confirmedHash": "3c40422b8eba051031e2c044745f28a634914a46bfd2ce201600000000000000", "service": "00000000000000000000ffffbc28e718", "pubKeyOperator": "8e2fe44a60d6f7a8a8be22cd1356f27343c669aaeb23de43a97b5631d842034dd2983ee3d2aef6b0ba8a131e66d69d26", "votingAddress": "qH4wmGfUpbHEhqTQ2ZLn4Pq21ee", "isValid": true},{"proRegTxHash": "8de5050f93912775dcb2553d7954dfa5d3923e5f19dd35aebc474bac453f84c7", "confirmedHash": "c93bb7ef013972b6359bae93a568fe33c22e42fc047cb7530900000000000000", "service": "00000000000000000000ffff2e04d9e6", "pubKeyOperator": "07f2622bc0845f771838838425c8390126e0c930f311d53ab22ce90a661d8b99f4131770e9777d077f23b7c07dee82fe", "votingAddress": "2YwTybWbQjNadQNUsEvy2FEqb4zr", "isValid": true},{"proRegTxHash": "2e156162b61eec7945c3b63660b3a9706c98fa4d35f07ea902242ce874c9b440", "confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", "service": "00000000000000000000ffff5e82aaa7", "pubKeyOperator": "1847993c29f7a5116c07737242ce5e7f40c31a49d2f7dd75ab5289fb2425f882fcc5ad7fd108456698ef8c09b8dafd1e", "votingAddress": "3FdQqmNkZ5w463MoTZ8ZB9iMy4zX", "isValid": false},{"proRegTxHash": "9a3b5dfcf7a699e05bbe0f875361cb24b8598b9124d0da8d6274687bdf05d69f", "confirmedHash": "987a268e6c37eed17d3a3a43cf4e0a49bc7680d2410aec320800000000000000", "service": "00000000000000000000ffff55d1f264", "pubKeyOperator": "08a9693b3a9a6186a7632749c6d33867a8a5a586f205565f5f8f2be8867331736d5a37de1f3b397ff1ca6abdfff79b73", "votingAddress": "qyu2pPc7ejGvMQyN7TFEsf6Qzja", "isValid": false},{"proRegTxHash": "1b50abcd42c9f5b6807729ff798d4379170ef6a4124382be2c204d5ea220d132", "confirmedHash": "3071d1f893d5f8daa7b7dd9d7aa51cdba7e38834ec9a23ad3700000000000000", "service": "00000000000000000000ffff55d1f103", "pubKeyOperator": "835bfe604b2e633573e97f8717051aec81eea1445c6a671de0a11a7030cd359007a5de28877ba8ab88ca62b2eb372726", "votingAddress": "3nasv9Jz1cWcbf99Wg5Dh8rtQ1MH", "isValid": true},{"proRegTxHash": "16439c4b0c097e0e3ce51b49ec1929ac9f41c177acfac21966feea07198232c6", "confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", "service": "00000000000000000000ffffc3c915a3", "pubKeyOperator": "91a313e3872e5591486efe4dc41425d4591cce36098758a32851b3461ff2fedb4d81f909fb258f35eceeec2b40672e62", "votingAddress": "2c3ZMq4LUTSKY3iqY3VX5JjpHy8w", "isValid": false},{"proRegTxHash": "ed3eaf14ab2280f3a99d2f7bc96fb303eaebac568fa64f0a21c306ba5cc09636", "confirmedHash": "d990c9d1e634afca8e781636893b018f634538ad7dc5bab31e00000000000000", "service": "00000000000000000000ffff12da0750", "pubKeyOperator": "8592a96e021116214ebdc03ccc9e89ea9cc47d322826b4f45293ada3dde18a038b84da7a2972c683222bfb2b1354c11a", "votingAddress": "4UfenT1Exnw5mSQT6q23pFYSrrah", "isValid": false},{"proRegTxHash": "89d0e7c1e0a8073324a40ed3e5a1c0ec79d1d540d134298fa036837a2b3019ab", "confirmedHash": "1c3de208859f0b702201022e91db373994a1edcba206886d0f00000000000000", "service": "00000000000000000000ffff5fb3889e", "pubKeyOperator": "8fddf1292eeee439fa5c33bcdab880a31f8ecd7e33149c7f426554d330bf532c1daf942bc39c98279900829e75371343", "votingAddress": "2E2fSAw6aD4Qk3syiNDckBXRPLHU", "isValid": true},{"proRegTxHash": "854ad0c1e8af1d4f68af767b488d235feb90a01621fe5f7dbfcccc6dc828ec12", "confirmedHash": "d9ed28cdb018ce6e3d8702b566a315f92979f2e666d43cf91000000000000000", "service": "00000000000000000000ffff58630b15", "pubKeyOperator": "17e39d0d0d0ce95e48f8c2fb7cb7aa88e59062ba4c51d8c3b01d593cea0d22f4f5146d0c8ca9a31b9cb887d0539d35e0", "votingAddress": "2vzNTUPjqGq18CJ5ywz3sw9SntoE", "isValid": true},{"proRegTxHash": "22bf27b829141dd6b86c66c185a121edbbc17ab88a15866f6d120b074507604e", "confirmedHash": "ce4200571bcdc3a8eda49c681c8b2cd6b4084f3297f411731300000000000000", "service": "00000000000000000000ffff9d5a9bb0", "pubKeyOperator": "93e4b579580c98e3607511fe9f199b3eb5b17a57123ddf7f87413705f2c5006c0207a836d51cc01f47d333ba8e1cd349", "votingAddress": "2Gwz4FGE7DS1cw2Pm8i1h2VtVdC9", "isValid": true},{"proRegTxHash": "22ecdb20690d5c90875f6eabf2532e2f821ad2d7d269efcfd8361642118b8c8b", "confirmedHash": "5b6af25603558aa7d53495ae40bd797b48ccdbd06ce4c2970100000000000000", "service": "00000000000000000000ffff2d211818", "pubKeyOperator": "84d8a01d39ec079c94573bba3b376d9c909cab7c10985d7b9557aa47906d552a662adf2a533c08289a8b3a1de15b715c", "votingAddress": "3zXVkaBCf4J1yromo7CLDb2N23z6", "isValid": true},{"proRegTxHash": "2851a68dabaae28f25708cf4f392f5ceb90104aff139d009e7169978631171cd", "confirmedHash": "deea24e962fac02cf223dd40dd3f1d84e4375d0d51276cb70500000000000000", "service": "00000000000000000000ffffbc28cd11", "pubKeyOperator": "800169d58d0084a18067e77cdfa23fb38f6231c1c961608e66d8c3523560a2b1951c1e89a836dbe9c5ed9ef6a3d550da", "votingAddress": "nkuKs9AV2JEkgPAQvE8cnU1Y3wL", "isValid": true},{"proRegTxHash": "ec107450308099bc9c57146795dce2d055e5b9684b5b57fb6886ab17f2dcffef", "confirmedHash": "b408109ca6bfc6bde19797c0e7b4270a4e5d397c3424a1780b00000000000000", "service": "00000000000000000000ffff8b3b3b83", "pubKeyOperator": "0bf4f5ff2c81fd949745ac6b7d3a4727266d2f72933c1ad936ad555df6f0bdd9cd7f206836a667c648981de212ffce97", "votingAddress": "3GBc9e69zjCkp1t1nDV5APFPnkuf", "isValid": true},{"proRegTxHash": "f0dca3c7c4ee9e8cfc75b79c51d7c1c4589df78aec5c9efe9abe53990e1e65a0", "confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", "service": "00000000000000000000ffff8491bc52", "pubKeyOperator": "986aa44d21a38f743712d2ce721bb11083ac4aa338c630602a58f46a42db9c8b20ef01d6108aacd4ca43cf83721ae25d", "votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", "isValid": true}], "newQuorums": [{"version": 1, "llmqType": 3, "quorumHash": "c7b70306db885418730277721e6812116810919d0168d3761700000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "98f6d0141f89fd523fa0190a44e24b4ed67b84c82c5e83b4824abdd4b31dc3668357f4523495426661a3196389e5e1bf", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 3, "quorumHash": "9435e75f4dadb24af87d56b5b57e84e9d6606c094214ca560c00000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "19c59301edc2c841bbc42caf80fe74ee8cd65b41e81862cf4ac6be5e773113e8cc59950bab15be83a6e08170366b5025", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 3, "quorumHash": "deaadf6746853c8a1925147a3d756803dad2ca12f27263440200000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "86172365349fdcf2505f386c36087ee5cf092dd59b60e43b1a468475bdc7bf7de7e8443201b78127c5d06dd7c39da18f", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 3, "quorumHash": "da6791c5dc5d1274f15a40124dc16c5bd1936034d0b04c2c2200000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "9383d4ade27a93cb0af3c83a7b88c4af227129919becc904d9d5a34bb723a4c3d214724fa878fc3db02e89a2d11018ad", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 2, "quorumHash": "9435e75f4dadb24af87d56b5b57e84e9d6606c094214ca560c00000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "16d5a9e302e604dc6bd9dade26b006ed8d84a8e38d4df612d5a81a57bd823d6b9ebc98171c136276f34df7bb4356b49e", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 2, "quorumHash": "33375a571656c22fbec2e3dbaa841e59ea97496d4aec6c250600000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "831ee16c320e0d78ad0c87922886596de2ea3db6183bd5b8d41a03812e2264379b21cb66419ad097941ffad62f7ca545", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 2, "quorumHash": "da6791c5dc5d1274f15a40124dc16c5bd1936034d0b04c2c2200000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "124a849c91574e9bb620d275fc80bec8cb0c69dcc29d207cbff82a07c5f9260ce14f35679f2a89fc2e1aae774ee1f69b", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 2, "quorumHash": "d94a635896636eeff0d8afdbe941f5a928a77b07d896dfa51100000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "90d14d415a9ce100680c6ad0177377e638f1691250ce975807f6b1b62257ee4686f8c07b97b96cc889418c22c1002be9", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "6c77d2924d9abcb85b78dbd5db155a22be56eebe9b2e04f31700000000000000", "quorumIndex": 2, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "99274e1fcb4a0dadb1862827f392d400fd6f0732461561692390342c63d70d3cceb11bb1da83ce00afa79ad475eb12ab", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "d85928ed6b2b64f63e70d2e932b3fb94172643f8bd849bc11c00000000000000", "quorumIndex": 5, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "073794a60941b27e25a0ce13c2f60e44f437516a0e26648b874956d87fa3ba8884a800e521643ba30d94d4d1607a8096", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "965baa44cc8435f1495f570583d82e3d381f489457ad08562d00000000000000", "quorumIndex": 15, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "0a0a3e8a74dd17970b386e72760742df59fdb6a1b115989c87345f8aef36d86865e3d2ed4201f9fc5c257ecf75a0bbbf", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "73cc61c30c53c4ceb6c15599483f4267d90398317f5403903600000000000000", "quorumIndex": 25, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "03c315ce81731bd5f9bced0aed7b75a2bf507dc7e8620f869c83448d339e45beb2e99064af2a07c3de6b9e667c3493c4", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "05437c8e8eacddab7d14689cd4c1199c5dadcd261b680e200400000000000000", "quorumIndex": 11, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "0c8c4c76bef9a60ec7f8c22f9fdb573a2f13305486bcffa926c964f990edf5df4a9da248e331ecfee73f27c139b3b682", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "b0948e4b13bc8e6e76aad46ced517590d84968c051585fcf4300000000000000", "quorumIndex": 12, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "03844b86570bb6d333b8ee573a513f849bf00342b49f7f40dca061bae53704dfc205a8442ba0c1d61d1a8793fd91e31b", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "f4974949d8e2c3b585084fa7dc5eef44200049cb4a9164691800000000000000", "quorumIndex": 26, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "12b24f201a32db88f34e58c89ed03f0c770167344b99ddc65b772c605f4c3a9f5c120adce9d24b7bfa4bab67a11b9bfd", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "59870fb60dc8d4de2588d7cfeaa283aa10f601178074200c2200000000000000", "quorumIndex": 27, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "0fb8246ddf186a1d091577aba1eb1a36869294fee833da0ad8b0b27133f5839719dbd499d19b7ad0dd925283c5fd49b5", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "685212a646af45c68deb01075a37e52243c136f334c4bd5f3300000000000000", "quorumIndex": 17, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "8d37f7c13c13d198ff09f0f6dd3af3ee135085e1b4a43d6c0ac0413bba36cc753032c590312eb58168f2c7e17d1634a2", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "4faa40806daff32a095ffa843a42d57aa1815d99320633962b00000000000000", "quorumIndex": 3, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "174764c34f75a9e5742235ee93c56371040755d6184128c94b4e423d702f76d45ae42fcc97df577639455e25d9d478d4", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "255f0d5681d9ff18a0d0a096e3c94863d89aab343661a0022100000000000000", "quorumIndex": 28, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "0e00dbdfbcee6d4367d66bd0ede70e0a7e84a94c63a181a68c5f3f58dcfd941cc2057b3435de0396149c90e7eea6f52a", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "94f20f555c8999ce1d541fbf8ef946d7396ab1d346edf0122600000000000000", "quorumIndex": 29, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "97e7e156aa249dbf88aec8a4c1bf8353f1dc65cf65f30f59ec629113bb2850cacf31828c77237610eab7b8edb80cec62", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "526760f75d226bf98ec9a6ce3657bc1bfe8f254bc00769d61200000000000000", "quorumIndex": 4, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "8a777702ec37cbe89c732798708cf3f3cafc3ae186512924325a54f164baf13c86c12ec5f7e999556ff26f4f87d9ded2", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "4fd14e846a6c33d8df6977e5f8472a5ebdc5e3ab9955b5912300000000000000", "quorumIndex": 8, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "9442651af62117ddf72eedd9902e62ba0d03c66af438ca9b403f3cb98184a4a3831811a365573d70b783c417aeccdb40", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "c893e84b0eeb8eb356ab8093184a28de4b6e2e6ce4c3a7b53500000000000000", "quorumIndex": 22, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "82c866bac18a0925335c71cd49951dd7f15bff984f9584f2d549b2e78ab40b999687b1f1803f3d56191c01fec9d2275f", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "fab72a76c99e2479dc997a6a5fb9b105343e2612dae6c6d31900000000000000", "quorumIndex": 18, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "8d196d2898cb51953ea14a55e49827b914150709856d53a7cd206011a676cfd06feed17b57de5235130af4215cd0a206", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "152e629e5a52d8b298b12b9de8041641a1377987a459b83b2d00000000000000", "quorumIndex": 31, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "8fc78e57f286c4313eb67c9586e3e470e3f5dd65b04ae09680847fcc5243c8cf8c54f332b44fa53bae058de100894b64", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "a96c700829806e74bdd601013d3b16cda884fe3544027cf52900000000000000", "quorumIndex": 10, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "0d1e256333a21d8a5af9e706f17f16b69ebf6a42d12b49a19adbf018b9f3f59787913a677474d52f0e04e08d8a9655e6", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "1e42b210dd115caddabae53ee0fc01494cee4ed780af3dda3300000000000000", "quorumIndex": 21, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "945c1179f1756b8a5230b3b11025a9b5ef571faaa651c9e544994d79ba71daf04aab531fc8eca6209a37e74f29368596", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "96902231c83a5adb16a38275d4d3658cde9b8fff3e7b3cc13600000000000000", "quorumIndex": 20, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "1065458d69a77430259d8503a4dc377319d29631c1cabbbb4a6b6fe86f19738786985dbc6a0ffd30b82345ec7a1db461", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "54097eeeb81f94073c4de71808b2c088232052278d5a71b21500000000000000", "quorumIndex": 13, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "17cc17e57b1a75524af3dee6e472e51683fa042beb41062bd75a6a341f90baf0ff1885ad8adb3db383eab510db114d4a", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "de77b2c2ddde16c79ebb35a900f5280c157511bece97365b0100000000000000", "quorumIndex": 7, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "820037b3121e96649d57ea96965c52b8b58439c10554368b9fa66517eaf97ebefe864f7ace146e871d25ab17811e736c", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "9fea04295808909cc19de03a3de1358f0b401f2cf7f0de4e3300000000000000", "quorumIndex": 1, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "838c44e2cd0dc97b61285f003d200d9ac84f290d8b13b35a62ecdecaa58cee622907cdd999f8cd0f6448fe2fae2c5125", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "e16aaaf59b82c1a284f6199cde6fec19d8f877d8798377881e00000000000000", "quorumIndex": 19, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "89db51addbec9baf64fa61694eb03c08575931e3b2826c1bdc3e963726913d9e1a2c6be7abbdc9fd223192bc3a4d40b4", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "34230d8b7e637645f903ee192c9e2d4376cc804f3558daa70d00000000000000", "quorumIndex": 23, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "13a435bf6741001214c77066d5c765818a681b42eee710ad827d1ee25d1fc34291d6eb7adfdd11168d76c432128b161d", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "d68ad97a3b9c49e12a536789ced57fad99e33a6d38fafc6f3f00000000000000", "quorumIndex": 14, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "85b05c240efd664581447b8d0db9764e2eaaa84d42353b9865b07a34e7460934e8b9279ce157b33b61e1861f04284ffa", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "451b482a142055fa33038fd20757ad3f97407bbccc5d36f13e00000000000000", "quorumIndex": 6, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "805b44d9e33d048748535483671adc84357425bc2862d8f29469748a101c567b131b23848e12d7082f13ffea2fb6903b", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "0291ab11d235869e58cf63a4e5caca0a3e5fd7e47d61931e0200000000000000", "quorumIndex": 9, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "8e75347b4297d7398c3083dc822e9aa6dea3aa3969823249c0514f96d0ec261ec8111f3848be266a6cee5d716426d230", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "28722adf3b78ebe2b6cb8aadd45b35bc6b54271544d89ef73800000000000000", "quorumIndex": 16, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "09423461889a83e7ac3fb6e4c13f01f4a4e2d5b54bc261fc6f25f2394a4c1684c2f97e4082793e75e540bb9ce0d03b92", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "2296666a83b5f7742fffb3f49700699c3469fd2dc6a5558e1b00000000000000", "quorumIndex": 24, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "9748a726d82fb235f712b5b2ca38562a3533cc2ef6c304e34bc6b8ad8a4d2a54626623351759cafcd118162b6530847d", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "d94a635896636eeff0d8afdbe941f5a928a77b07d896dfa51100000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "041f6b50d9d004c812c36ff6e8c17915a2c3f27c99f4c8589c7c9cf7d9713e840b16411e6679d435f228bd971b7f48bd", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 2, "llmqType": 5, "quorumHash": "4e1559a32fc0c3fb2318aa33cdec4f2a6ff5946ad86c283b0100000000000000", "quorumIndex": 30, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "8a83103b6d1c99b070b0b2ee7b6c0e271bb569d9d5fd09e82e6a787fc0b8c1d1884747d9a80e3ea12488a467f5c17c11", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "59b943c6676121a789b0e6b68954fb0fd3dc9e48eea1dc071a00000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "99dd1a25360dda4c6cd3140c5fcdcfe985e964c11e1107adb32511c7e41514f8d9dd498dd0d8708d2314147f93f428e2", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "db23aedc038db1a944c48dfb2fe25240554c7d3db440539a1e00000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "0b78e735b55144e613f1307f4c5265be1e3dd82f022906cc146f30ad5f1f4e7e8acf06407d9341dfb06344bb2ce52fd4", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "34a267d4b52cb3f8b59c79f517c63b87fbd305cae517ae5d0000000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "15a5bf10323c4f7249d723af9636a5805d2b9aca90913c1f34a9177357f405ef12c071c8f278540a474f874199646e50", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "d4d5a3cb0d841c129a4ac5d966145d2184e21b6279d6474d1500000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "01172a780a5413778be5f981d52174a553a8bdac2501f8a1bb0275cecab011bb1494fad291411cd392cd0203a499a42a", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "e1bb4e2d35c61d8ba3556e355d9c9d5f98d3e961e5fc76402500000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "16fca4ad250ee62af583757e8b72793b44ebb329d0a9ddbed9cd28c875ee4c00ce75372b5c6219263c5f144cd9d1ff16", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "5295347878c50648e4c907128d3611aeb8d1ae5dc2ffae240800000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "856933004bd4aef45729bffcd75e47968b45166ae1fb8b046e7889920f72bf93820d7ed842463fcf80909532b5185612", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "ce74e9b65af0d7f6274f02bd88802683b288a7cf1a70a3cd1000000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "819ccbb76b630320f0efa3f35973fb25278840afb6be90845cd8532a6c17286cc41c5ff8d2ea65c4a67237a2f6497175", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "8e2c02ddcf6c7e52b7415bdd04f8e7e018be6e60631284601900000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "037fd19a24fa153a23c601f6dd64d05dae99a7dc78ff1e4f6d100e72fa07378ce9eb27041b9f409b19a1fc8e5c1b1a75", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "c61cea38dc6c4e54aee1fd7d0ef7825814c0df1dd835fc0f0b00000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "0a45b459c514be06d2cf1facdebb1ae0014a76156a07d85ea3a83583c8f8508687403ade6efd05bcf8d9e8e6308c81f2", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "96a39a5988f3bb466b3f44dbd7baf79c2efe2d2ce57c7ed92200000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "8e0b3349f3b8a72ba134b36e057d6266199516564b09e3b4e9256f837b0707883a57a7cd06e04491a2a061cdcfcb06c9", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "adff9b073d816687168c2183036520e2f756af0a22e4cf090100000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "8f288fb7758b8b1c5e7b3b871ad219e2b13b4135539c3a986af86ecc6deb02dea28f57848b3bbb080a9722d26e6d7dde", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "c41a4b3ca55690f634b6737cae3efcfd86727b6d69fbc2a62e00000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "98ad2e73f15c242a20969cc0be85c8ce98d2f32cb4ebe361dd090faf08bf7c3797c98f51008ece48832924b23b61387a", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "d70ec61680b7540aa208d97c1a54d1732ff197f46cb2f5c50c00000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "183e1227ac2da0887112574e56270e63f66a4234c60f07b48ee592429ba62fcd712dbf18348fe817ccd027de24ff8891", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "7871b5e5d7db5ffe8c8e292b63d25bdc5230a3f6b464a5a12200000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "8bb03226aae0d68c38fe38a7577f114a05f8da533e45066bff8847b3649d791d7a96296bc79a0438924bf20b23e49cae", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "78deacd33e7d3543384303adeb0790df4342f1ef695273db3800000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "90dced6100925fc3690f02636f6b1d0fbb67de94c435d37b272aa1d9898e6a406f56419a66b8ce876fac070bb6d6f0d1", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "ba46d0a5295b88ae84e6bc89afae243e0d4bf1c7de2df6a92300000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "175c6ac4b4fa5090df5bd9fc53aa41152aaf0e26c40848f5519867b1f44fc87978b081c04c69eef35c023105d01975e2", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "c4b98b363b598802fa8071c45e776eea53d2fc75a33fd23c0500000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "0521a686889e1cece1d11d92c701799c9987c1eb5d05fc533bace2926b08a1af1d656672d32b455d8ecbeefb8381c2e3", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "f146ca29bfd199fce51b284ebf7d5855a97df646f8a1c9b30200000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "8e7f2df27380d59ce8e17927ff8a2c30b64ace011775b9f9ec37dff3ce1d0676b58dd42ca8aa4bc68e8cb658019d485b", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "3a0dacebd3204ee69fbe8e2ea851a458b9057c81b1d41d1d2700000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "89912b5b1ee926a490292e257eeda9b9f7d3feb3dddaa5ece23dbd39158abafecb06e56bd489d7588c3bbfb858bb8c40", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "2b417e73d81a13fb504011a643875d0131439855e434e8ba2100000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "95fe73edf8ad685d5a88de81d05fce88bbb74abeefb2a682a80ef03d7ebf4d5120ceef85061a87df5c9b088be68edf66", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "0141eaa349a457ef0e18facd727bcf1a2774d4d322f9e2522000000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "8e3b657d1cd297351f5fc4198fb088c5b40eeb0b4a3875c72a3889f7a29f1e9434888b84e35eecb5981aba861e217735", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "ff738c0b7830212f56b82fd67d7d63c15b2f1ddcd8bce51c0e00000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "137ebad13eb259643176b428c7ea84eec3915c39144e8107625ab1fa71ef6ad2cd0b4277cf2db0bd28dea1d63599c068", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "2f9c97603b61feba1c0bc0b31c0a1dfc0aa8be6f6fbb5c970100000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "0bd5dc529db0fb0f2b69566ccc7e32f0142ce3a0ec356871a0661bf9208d439447c26e944ba2a541ad6f4f572dcc02ae", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 1, "quorumHash": "1ce2f4a1e18733983bbe07959deb418c9dd32331967829c73400000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "81eedd8f57c8e1f18ee1d84fe79af5cdc183a77d8d6ab58a3103d920afcef6446ee2599530ce641615cfdba6ec836271", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "1f70bdd3a235e424b1f41d1f81130aaf8e409d20970dda610900000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "84a34e38ede34eab136c05b923d2b928a3e725e72934b07723edabc43994290963a4028e98fe306e0d6c70392e5ef956", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "a80b83802ca6973c60cc508780e9dc608c964d8b29dd170a0a00000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "85b9230f31e11c6e9a6d6b12be9be37aa0b982fab96cbddf90dfb2ce5dc16c3c4ba576f5b8220444538ed732f8544a6c", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "39c574f4923f08efc094f072c063e45905c1ddd16fca6d7d3400000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "11680af961f90126267902480c6cc32d5389fb5e4a056f75a285f2f55e1f7727f0fd37ecfeee6b1023738da02332cb36", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "296b25b67a6588b0fad422d14bc0edea06f0fc20c771bd8e0300000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "8b7c6e4ab48df06857e9e4dfc436f6b93034616ea9098f35d98c6301c61104b82d3fe80bdfed182b928d7618b68bfcf4", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "93806a34a9fb7e9bd924dab0bfb7df2504dee648520736d12c00000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "02d762532c6833dec3845a6f0555a4f267aa8ac1a8e198bd65d4b9de2891c4395801dae0442ef7aeb1d4dfb47afacd8d", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "0ef23a620a01fef04a4c7931010347d744e5dc18694873620c00000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "81d95baba69a3eae4cbeb4dc9a385699a614a06f75d03835bda6139a6a5a54ad82df5d331da80fced5a680729840c138", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "c0df6dc8df91027788fcae728a358e5e506fda2a032636ff3400000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "0c8cb8b7974306402e3ba84af3ec4b51cda15d42d3a9c580402133d3aa97810430d6828265528518a2c8952b73fb29ba", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "b32b9bb326c366885d61692a54efefffac1230ae0c22182e0700000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "86d7931d664aaca1e64f4de90436f6431bfd1bef8d01fe6cde9671142364acc7e822165358b996bfff9228b61b0c2b81", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "10de6289a4f9672bcf40078d556a5557feff0d4f004501790e00000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "04a4b7d730c4881604bebed04c72cb915aaee582c970cc42ae7040c6c8190408d6e1a5bd02c1d9acaa43c5a66891ef75", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "6e6b03ec4edf01e2e790f4aaabfd354fe4ce2e4ee6ee21b93000000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "90f3a23c9242d74aa35f67a76bf0770e56b2025251239411b310ca3f74af5d680ab180811fff6816bd920faba408dd80", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "f1a61497ff5e8ae9767e5213db4b89499a12f171e24bafc80400000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "18255db84fd758e142a8b6768a9de05ddb3bf868c93b878f183c26b6eb85d8287d8da82a3ac3b234e93de3f7f10fa50d", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "562e27a229bfb1ae9b76cc4196a954557c3e2226dfc8b78c0800000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "846f34582877ef72a6b51cd502c00aba3e7d181f6cad5f79abcfd5911486e2f63b083679384a73d9b8283e29eee4a4ea", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "566dd288f516184f24c132ffe04cdecebc2aaea4f7eaad0b0700000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "0ea367c6f2d35d1233ee52770e595bcbe39a91057ca09652907d6cffc72d1a393310faf66d99b6bd3266869d0402294f", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "f56835bd78af73d1a31a240cbd9cc495c249652b39366d280f00000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "8b038f50500d0a06511dca1239a706aead3c81242425f1d8d5f6413ab950f148699989ef33f18d80149ffa53eb1994bc", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "a8ce300f71ea089702e36e66bf59aa8574cb40be0beb0f441800000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "09c00968e1df3440c6d32359fa1f150638fd346550c66618d14014e9f41fc8082537193004465cfd26511b77e23fa59b", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "86465fd9415f874e4b542c02f2f2bfd767ab199aa11e37311600000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "8fc5589ae839278979af4042e144ecd78db799be6c0f84e3254bdfdeb1fbecea3852844debd69f920c2a0c804e891c5a", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "a39e43bbbe8f7dd5cf46698c0f9d37ee00a69f527cd7a9990100000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "8fb3e41b765a4dd89260c2f605ea0414daaa27bb93ac4728f77e71d3e9bd40b0957371d11ce57ee964761646a969360f", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "11079a62681ab5ac01ce1f815fc8df18f04f230f959e09372f00000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "10d55698adf48024d42fe98257d1074a0b40a64891c0e44bf7ed4633e69d0435040838953663bcf2ed86e4ccd52412b1", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "ae37e8703147e33543a7c25b8322ad3f4a41aed3759a9be42700000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "91c332bb9581e7e48d042bfb3d5ff225edadd7bee7786d5c3f42f52920b063d83d8b7043773d9fecaa9f061f4d8be0ec", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "d94a635896636eeff0d8afdbe941f5a928a77b07d896dfa51100000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "83ec36561a0526539744100b0167dccfc5c159a38a9502572000fb25f90d8f077c532dfb4e3d3433543cfd36c5cf87b8", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "775876dfb432ead7e71090513866158c112223d9eb6c1ed01000000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "13e30aa805184369fc3a535e6cd02779af05989f5f66aa094a4d5a1cd01e921d40bc912c8e51e17614b4e530951e1afd", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "2296666a83b5f7742fffb3f49700699c3469fd2dc6a5558e1b00000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "974580a92d7e224d7221710f2764fe1b7c48c8aafbf37f19cc86e5bd0854ce9f599927202dea76f56d5f7b2bbbca8887", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "fbf05d06bbb0e2eb9e4b1b718661f832ba5b1fad0d6a7d670200000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "03403bb07645cc758d31b8b3a780c62fbaff01a9c2262978c840779f8efef032e66961035671df1a5cf048a61f4c1fed", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "quorumSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},{"version": 1, "llmqType": 4, "quorumHash": "da6791c5dc5d1274f15a40124dc16c5bd1936034d0b04c2c2200000000000000", "quorumIndex": 0, "signersCount": 0, "signers": "(null)", "validMembersCount": 0, "validMembers": "(null)", "quorumPublicKey": "0c88099696fa503dd9cf45e2ce65238587ac91513a00af14834e077adab167fd64a44b562369d13447601136f5763206", "quorumVvecHash": "0000000000000000000000000000000000000000000000000000000000000000", "a": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "membersSig": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}]} diff --git a/dash-spv-masternode-processor/files/MNLIST_1761054_1666773442.515519_loadMasternodeListsWithBlockHeightLookup.json b/dash-spv-masternode-processor/files/MNLIST_1761054_1666773442.515519_loadMasternodeListsWithBlockHeightLookup.json deleted file mode 100644 index 5d7691ef..00000000 --- a/dash-spv-masternode-processor/files/MNLIST_1761054_1666773442.515519_loadMasternodeListsWithBlockHeightLookup.json +++ /dev/null @@ -1,41384 +0,0 @@ -{ -"blockHash":"f94801e0b2c9d55ee26501f4dad3cbc976ace7681872b7b80300000000000000", -"knownHeight":1761054, -"masternodeMerkleRoot":"cd83175408c0e6dc7a5d17be94ce796b8be31d97296521a0181ac5e57e517523", -"quorumMerkleRoot":"783006ef11578c647db9ff2d2c63bd2e8d0ff6ccdb590a9d46235e9c4e2d24dc", - -"mnList": [{ -"proRegTxHash": "0008858d870b0aa7967c39a551fc953e4e7fa602f19ba1fc805c218f87f41cb6", -"confirmedHash": "8d187f99d4101de1d04d780a63e3b2935d5856dea9e205191200000000000000", -"service": "00000000000000000000ffff12d65407", -"pubKeyOperator": "04b672fff1708458c82de630083c8950cb826143e98c7cf4b83082c1bf1f6d5b69460c9f0f93f249ae97e0a235a0dc10", -"votingAddress": "tK4dLLWJKLbWHb29gNLatTkPoDd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0023f8df6ce17facff4d3f3459f679ccec23a6c06ee4b11e0fa34cfcb74fd5e2", -"confirmedHash": "f9b8e1fa38844ddede7d0dc1edf98dfa14cfa1850acb8c570000000000000000", -"service": "00000000000000000000ffffa123529b", -"pubKeyOperator": "1234af4a3a329f8bdccce386617c85ce47cfddb5dab17dbca04ec95900946ad9bf0082a7d3f0df83019ff8065eebec29", -"votingAddress": "tvGwRBFT1jqn9b1kD95doZCGRtn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0035bb863622d659753e2a9714ff2633b6a662cda874e38f85fc31f6514f6a0c", -"confirmedHash": "704143a9483468f494883a37e05832de74dca2e019f32b670b00000000000000", -"service": "00000000000000000000ffff8d5f356b", -"pubKeyOperator": "81345a2488b3a0c06a02699b78c9e5e125c9eccf6316f84da3e72d1a12bc9364a3e8a277674b61a451f8b9937c4048a2", -"votingAddress": "2o3sRDgZtcrgg6DU9Vs2VQsYZ5Qu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "003cb71151e04f66b5f11ceb43d99846d75334974056b4b229698a48f7fd980e", -"confirmedHash": "46e54be4a94d8d36c0028a82ec824d6247aed6e9349072892d00000000000000", -"service": "00000000000000000000ffffc28755d7", -"pubKeyOperator": "10a06fdd00f1d15e7399e77aeb9baf5a1a37ec8da37bfb104fef4a95523a78052b29994b08c34e5f61b1264bb9f73c75", -"votingAddress": "4MLQpYCt3ZXypETwZxdq5hJmF64M", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "00450f738658c1310401b1a5832b74023f58183462293bccf9b35527dae15a32", -"confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", -"service": "00000000000000000000ffffb0df882b", -"pubKeyOperator": "01f64f042dd46b9d1631a68a7453d634af7f1ad9afa2b7d02769cdc509293211322a44a69263d70ca195129a4e1fceae", -"votingAddress": "CSyMtGA1nkQVYHbkkaTVwVDGwXR", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "004840156c485fe9cae44c808bed054f5186c6108545caaac5049c1484d7e4b2", -"confirmedHash": "41b2db1fef27ca5b2085a44914e9987ba462e6653cde42b50400000000000000", -"service": "00000000000000000000ffffa8775004", -"pubKeyOperator": "82027b2f0b86356e54ad9f6f9d09cc6b9397b194f01efa72cc9fcc15101014c7b870c7787b082c7ed08aaf3a1a9a4134", -"votingAddress": "4JAFE7DiKBF6QdehdgZRcmacgiwV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0064905e761777493f95da916430da55bd345e151fc1bba9c0f57b4b9a15aa63", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688e116", -"pubKeyOperator": "8ad2449de0fab6e0c222a6da6ef16fa0ba60ab5ee2e34faba1907274f48395664392238d9841e5bdf4d1970e27f28f5c", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "006794d1306e00b42faecec6c962d95eb99bc5dc2ba6182ca749ff16f8ac69a5", -"confirmedHash": "a3dba9f8c6ef76eef1128001dd671e2462fd49ef40ed379f0600000000000000", -"service": "00000000000000000000ffff52d315f0", -"pubKeyOperator": "1861fb12213ec53e74b34a189a89594f24c670e21ecdd2246bbdc1bb95c00a02191579e8c841cdcc9d58ff82692970cf", -"votingAddress": "3qBeCrynd9HSBRYnzJhNcLskGR3P", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "006bbb3833ae0082d5b6ebb3f17243de72a4057b575cd03f3b028bddd473faf3", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0a7", -"pubKeyOperator": "12d8c5be6a14f3072140b54372af8a70ee9eab1436a10e9005bbe7ed1e4ee291aa5fa42c39fe617983fed10085058467", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "006cb14c68d011267f8e29aa5475f18cb255dacc82ca0f22dbf2651a597c7dea", -"confirmedHash": "aafc5a908ec32fa1f1600ee2e9bdb02fc4d99728dcf096201f00000000000000", -"service": "00000000000000000000ffff2d4c593f", -"pubKeyOperator": "0812499df5a01647ab95b13d3495e3fa60125a68e435e7b3ef8c2edd11172d768bd331d4b64101dc9b37a03b30b73431", -"votingAddress": "soR2yhuefx7pgFkVLYy4YX1msiE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "006dd6fbe65e898087f8c53b6cc4527e4ed6296606e3c77cf2f7720268ee5855", -"confirmedHash": "4bbc862ccff2ab868534a8ef750cbc6296320d1e4733cc1f1700000000000000", -"service": "00000000000000000000ffff52d3154e", -"pubKeyOperator": "99372011283d7156f60ed0c494f94ddfe24980449e8d105624084f1d37dae864ccaab2345f8dbe27c3215393b092a385", -"votingAddress": "2nr6EwjXegC91UYgpgoiwGRtVtzR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "007f9983e81d7b8237167849db0b3d4998e7578e16492079984a99afcbe95391", -"confirmedHash": "1449053906029c60397eba6a82784cbded60aa3933af92811c00000000000000", -"service": "00000000000000000000ffff55d1f151", -"pubKeyOperator": "9038b0daf9a04c432d857d229b188d5cf942b5fac522694a2ced48147aa86535b99f1b77805486bca52b770c2a2939c7", -"votingAddress": "33sBRjBUdecgAwRV8xy4LESq84T5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0081a4615a1517a37d418ff9bf733e709e11c8de2e99133d8009585b289d84c0", -"confirmedHash": "1fc7cddee389a2ddea4e05579c43fafa5e418f691f550bce3300000000000000", -"service": "00000000000000000000ffff2e04a27f", -"pubKeyOperator": "8e8e11b85e39a3bae5f7ead09f7b5578e7eb6d9a2c23524b2768351698008bcef29e93123f8fd4e03e638fbbd16e7339", -"votingAddress": "3k1QuEakEBNpDj5cVji9C5K492kY", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "008cedea5e05cba997a898c83cce07b10ea7b3a1471b1b3ef610dac2c001348f", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96889647", -"pubKeyOperator": "9551951b4b12a240fc862b614425c32e5126f1901a80fb0933572609895a9c6fc81ec5a1df11e146cd31fd7336493223", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "009815e5fc174885308178910fc859e48317825bbef27a3bd9760aa91df3a5a1", -"confirmedHash": "0d59948b0ed422b5770ab774ac1b08218b856a61647726fa0800000000000000", -"service": "00000000000000000000ffff2d479e3a", -"pubKeyOperator": "1335e1ec72de4cb59ae213dc0977d62dddf0bcae1674ef71a60c8f5b1516055673e9e294b88faaeff4a01c485ad56a85", -"votingAddress": "2ZRGt9Bj5Smww1FzZAT5n4YcLDM2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "00b0b50b180a969882e680a5e4e35b26f5691d006ef1f507f193d772548edb8a", -"confirmedHash": "7f709f9b86421a3315772708ea430551eda93ecbda6dfc2b0500000000000000", -"service": "00000000000000000000ffff0509ed22", -"pubKeyOperator": "88f3e08f369c2329c799df091a20a67969a074e214f73fdad597ff6e83b180ed09bbcc966d310861462adc0bcebdbd7e", -"votingAddress": "3kfjawv5wWohmU7Dr5cCb7jK8Tji", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "00b731b5806a3aaee2fee5aa1f2273ad4d3ccccd7b40c47855e67c77eef78a4f", -"confirmedHash": "bf44d48543a9033b017a8badb7651cec9889b7eb4833546c2600000000000000", -"service": "00000000000000000000ffff340e7175", -"pubKeyOperator": "875c486a7d71307517489eb5dd157ef6fe19e70bf55366daa6e864d56db7db948ceffa21a09afd8340661f38500fbb28", -"votingAddress": "gPT6hFiDVd3teWiLx9Wf7PHNmie", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "00ddaaf8c9f348105a8e89945f37b79d974c6203dba4d7ff8805ef5f66cf10db", -"confirmedHash": "64b416cd9399bc1885fe1b660d1c1d6a383970a6c5a45ad50100000000000000", -"service": "00000000000000000000ffffb07b39c6", -"pubKeyOperator": "87ba9be473c243bb72644e32db0fd2635b1856e9cde503014681b6a6549ca87ba7c061772b5a6ed10a4c19adb2c7cf9d", -"votingAddress": "3XdevvqwupjWE3KQ2rKvzbWZ2pkr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "00f80d61043bf718f301fba8953a0b950381215e312b8f1a9acb2d97eaf08940", -"confirmedHash": "ae9a90064ba06ff8847f0523c19cd11b2269566a02e9c8241700000000000000", -"service": "00000000000000000000ffff52d3156c", -"pubKeyOperator": "8641281cb35d748c72e4c631f9bf7a1e006340c3ca2e7452b1c262c9b327fe508ec6119be160dac4b7b6392dbe02e857", -"votingAddress": "MR9CxJ1tgu8x9At3VBjBvkAvQ4F", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "010504bffb69250f78216e47cefc449fc85d1c0d0e41b9dde755aab820bfe8b0", -"confirmedHash": "d5156219a10f493bb81e918e8fa8acbfbc58157206bdb1f60300000000000000", -"service": "00000000000000000000ffffb0664191", -"pubKeyOperator": "1319bd8c3c5218e4a0af65b83e9ae46d01e5a9f54229a2803e737720191f2b88a66dd938ef30cd49c15421cc59c538ce", -"votingAddress": "39ttnFu1r5x7V2hWMoLLsgSLjhTC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "010972486f02f7e98aec53f4d02a87c525cd3f7defce6bd2a96cb6d364528639", -"confirmedHash": "576225f0f7898d3e067a9d3e800bfc841f8de821567f99561200000000000000", -"service": "00000000000000000000ffff91ef14b0", -"pubKeyOperator": "1089ece5f54e1ea1eac7c293b54f92fd4f74f11f75af3d9eee16f52fcf3c7c05636de52b3b4d1a07fdc78cd76e419f1c", -"votingAddress": "4PceJLxtra51vb1sor66DATS1Jtw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "010a98007db226da77b9aca4f0c1a1306822ff0656b24810faa777fc29a22649", -"confirmedHash": "18890884c84e798819fe59260a9e65d8f6fb413b8f006d440b00000000000000", -"service": "00000000000000000000ffff59280e9b", -"pubKeyOperator": "14ebd8d9d5b9798375c879f9fae5326834f74fbeae476e9a852df44d91a9fb102b46dad7d66b2579b2207678675e2423", -"votingAddress": "35mcQS7owE2ACtBXHvqb2vZWZicm", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0125ac117afce41786c38a40ef4b20711818930c60a5e8cbb472854bc3589025", -"confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", -"service": "00000000000000000000ffff2d4cebe6", -"pubKeyOperator": "0414c98fb057057c6d33ba3ed1ce95311c42fe30b41686359c2940937ab558ad13ca2533b125fe626d87c6dc080a12dd", -"votingAddress": "3LHKXrSrJK82jYsqPch6rps6hpKZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "015621f056e0e7f85ea1321e8245ec1cc53290bd01b6ce47f09d3f1e96b8e623", -"confirmedHash": "9bfa9a03e826cc43582482c443d0cc686f2a867793233c981100000000000000", -"service": "00000000000000000000ffff68cf94dd", -"pubKeyOperator": "87c5fa8399499943a8053cc0abd333d7de887494abcf610a3bad844345745c639d4b649a6e28f1bf14f66dfeff361f97", -"votingAddress": "4UQcamMSfMiBDmrCa2CGP4t7xH25", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0165f33db0b96c37e63b79f78cb1e590d6d097d6aac72dc421c43953c489bff4", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b088", -"pubKeyOperator": "108e9c3b8b2d430bd38530cd5d4e947c9e2e6dd2488a2f1f9e56a8038a5a0fb03ca0a493debef66a7969f9f5b9f43393", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0172a2f7c47902e9067f85d9d8d1f5a91f07d5ea73c199f3361602f2f6d17ae7", -"confirmedHash": "591c5b1d605fa69dca213764b2a1974510a3f18e1711cbea0f00000000000000", -"service": "00000000000000000000ffff2e04a264", -"pubKeyOperator": "031cd04275a457d06c77f466d48d19a96c385aec7f1926e6ef76675d84ad2edd377a94bce3bccb1a0d8ca1529dbb0070", -"votingAddress": "2ZTKwZ23BZ1QMC8i68wtPNfEdKc4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "017ad1fb9a73c636b960ff2fbb6779d6924d2c03f24dbe39f6b227042bc9750f", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688b1dd", -"pubKeyOperator": "192924d5b2f401ac83fd527e7a36d3833bdc4116f67b71fba860ce32675863d67525199d36003ea2e17bbc3d668efc24", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "01a2769f65b96bfc84dc8fa13f5efd97cecdd8241c3cfeebc027bfda5e7ac04b", -"confirmedHash": "8c30f68f4131396e1ca0d479a0ae2fc58ac4ec9d1d914ad63e00000000000000", -"service": "00000000000000000000ffff340e975b", -"pubKeyOperator": "900f9553cd77d98b6573f7d086f908473af47cd71284e305a7be144d5f080b7e14c45b29cb5ec76d5d8ab138cdce89ca", -"votingAddress": "3CbTA41nnuKSPQXgVQrUnf2DoMbf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "01a9810a299263b05ba5a1bb9e14e2c191d69266674830be9bc8fe721224c101", -"confirmedHash": "920937bda7136ac1501889e859206df65452f8b309cb278a0a00000000000000", -"service": "00000000000000000000ffffb23eece9", -"pubKeyOperator": "059d940595f7e275f2a2c64b55b4e29c99b9db41c6cb949bb57d86a6890c598f9cccdca3f3e8bb4bd482d3621322ea9e", -"votingAddress": "CxcRQFw7xxf2Egy9GCeVHYx8mT7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "01b53cc51fbfc164178e8c7108e94edc9b70df6303bf0bb07824aa99e345e5e7", -"confirmedHash": "995950cebdec9608bd544fe715a95acd996774d10c73036f0200000000000000", -"service": "00000000000000000000ffff34ca8d3c", -"pubKeyOperator": "04fcdb4c68b6822949058a6f9395dc7fb31709ed72c96a6122cb77baa011afa5e29f60561a7ac0b8185adc686ebe4e46", -"votingAddress": "2qokNyoQmzYR93SHSyJWTawT6VnQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "01b833348f20e247c49478193fc7f30fe63b4a6630a4ea1b95362b29f46d9cef", -"confirmedHash": "728cd1420be8662c2ef121919211e07cb590610a76b5b5540200000000000000", -"service": "00000000000000000000ffffbc28f175", -"pubKeyOperator": "96f8953f1b1a7b788e77166535d3c9181e017dfef052f1b09eaef4c4df71769439e305c0f920fed626501e6684b62014", -"votingAddress": "3adagxsekfJjnhVptWofTYkxvyUp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "01ccff7a8246b1f38631e2df5e90a193e7b771ddad2e5ca908c73ab59eb7c17e", -"confirmedHash": "ce2f18598a65a7c8836b2763f1a018ea95894ad3ffe9f0a41700000000000000", -"service": "00000000000000000000ffffb23e95e9", -"pubKeyOperator": "976b2c46d25170251ab4c372ff5b8c2f64078201c150e3dc9f4134cec69bf23221fc168876348844afb245e733cd8d4a", -"votingAddress": "3pEPa6G5a3K7QSCDSHHsqgP9xMLc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "01f997852c74f7a239a8fd7382817be54cb1acae53ae095f9e731c0143a75b6f", -"confirmedHash": "384705056af13a71965c968f8440f70435560c321393559d0300000000000000", -"service": "00000000000000000000ffff6dcdb483", -"pubKeyOperator": "99b6f8383d9ed1ef1c6c7fe921bdb5d201d5857726b36dc5685d84a1b39f27f9c8c1a4c4672b5070f4d7483a0d55fb40", -"votingAddress": "2nxVdvfqpTzbrLp5M7mD7WDj1SUb", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "02036ad27d50c067d1def6f65ac6487e6d8e49c77f7531e260b7faa3f7c6de34", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688b0c9", -"pubKeyOperator": "04975699dccb947b5bdb8351b5c85b26f8feef305003caae0879a00fa9cc4dc813364efdd846cc57cb033601efeeca04", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "020b7703208b20128b9f09d8ad921c91dd9826d4629cae26a2c769c2b8828980", -"confirmedHash": "153921b11a59503168ce1bf1d45e760d7b2f4ad06d75650a1a00000000000000", -"service": "00000000000000000000ffffb23fec6c", -"pubKeyOperator": "15873dda0f87d427d16b990c62b7e788de2ef79bfe0c5aa81938b6f36d727a12e87a2354463c15f12b532e7b40034360", -"votingAddress": "2zfQWYJJ2F4G7ZTqkWxtqLMovh5L", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "02116afb298bfe595e09841081545d9a46928d298d6f03e78b3ac3976e298d43", -"confirmedHash": "3550b4f95ade9743bd2f22972f090033a4d43ee28b3309941d00000000000000", -"service": "00000000000000000000ffff55d1f126", -"pubKeyOperator": "06cfc8655eedd59cfc4145fbd2c0d2790215efaf07e315dcb1b9808be64e980dcdd2348cefe84641e047ee56e7153981", -"votingAddress": "2jxJE7c5Sx1DBLejvgDvDfRY9qtq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0227d6ca5a25a8ddc24bd32ef82ecd3fc3a32b24259ad37abf7e5eade306409b", -"confirmedHash": "10825a0263176fa838aa56de0d873ea86afcb7fd26e93ad65100000000000000", -"service": "00000000000000000000ffff34042536", -"pubKeyOperator": "91b73d91e9dba4748e148aea48e442cce2494fcfc0e7ba0a8526258f7789029810228a417e7311865098c1c0292f1fab", -"votingAddress": "4GDVLQ1nDx4L8TMtYBeW2FgDX8xS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "022cf6929e950a9cca214c729a98e2420087ed6afa6f0236b0f6ddcbbd38c24d", -"confirmedHash": "84f7379e68d9155b515a16da59d058dfd5fca46d85cefcda1c00000000000000", -"service": "00000000000000000000ffff3359d8d2", -"pubKeyOperator": "141fa79ef1f690e8720b7c7792784470c8dc6726f2c771539faac540690f3b65c2d9d1802e5fcf759b6ced385fd2b228", -"votingAddress": "wNhk1moStECYqCZ7jkvwFTemzri", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "023a541bd5884f1088630fe46ff9e51a6a9ee10e769474c1af91d0e967ec713c", -"confirmedHash": "171467fb1f9af906bd9a10e74c3011ad0ad701301185067a0200000000000000", -"service": "00000000000000000000ffffbc28fbd3", -"pubKeyOperator": "17ac04dcbe4572333decb848d4dcea1c2e5edf24a1e774aa1c1c6f31dbc3261883ad27cacd2efdd2ab91b24a77390b3f", -"votingAddress": "2Z9McoGDmMfh3dF9XEWqPBi75qFQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "024045d9489c0b38b7af50b8bfbf704887bd0bd257af5ca3a909e0101ba3d7c8", -"confirmedHash": "a3545e8cfcbc399c36b37eaa89eb70fa80e14f4ed055b50c1000000000000000", -"service": "00000000000000000000ffff4f621a44", -"pubKeyOperator": "8356748ac871602e89f16c58d862e32a194d499a355b43dcff378000a4c0cd091a3e4edecdb78711fc9e04b081033f38", -"votingAddress": "2quWhpRegsCcy4TjvSLUGRWwfJYG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0250cb92e0e80402fe293710c7ebeea576bbe90d288c88c53e02b2cb07208afa", -"confirmedHash": "1cbe72176b16d5e607a0202406ee3af2407d6f4a80676cf00900000000000000", -"service": "00000000000000000000ffffa516d38c", -"pubKeyOperator": "0fc4f74bdc5b1c646cf6851308b85ee14e0feebdaad64087121ada27157218a7ea2dcd30d10b8ecdd3232fcc097cb999", -"votingAddress": "2hNErnPFuTEXaVSpgQw8HpAoJKyM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0259b1be8167fb6afc3125133023971f9aea6c65c67d5c851530e29d9f7fafeb", -"confirmedHash": "ef5c4419ff85c107d03909e43abca9291e4b7774e617db5a0400000000000000", -"service": "00000000000000000000ffffa7478f03", -"pubKeyOperator": "8f9b67b255037449f13ef5b1ef930932db75c7abd6f55e23c3b1125bebe56ce632c013774c2c2583dfe786bdc998e02a", -"votingAddress": "8ofMnxccm5TfpGoby9eihhhRvUP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0261668a5f2b7b9bcca34b40f2677cdc95f5aefab7efc92f217cef86e7bd8307", -"confirmedHash": "7bff4f371c94a24bc8bd45d996e8e1e504972248543b91fb3500000000000000", -"service": "00000000000000000000ffff5fd87e28", -"pubKeyOperator": "81d1b510f69385082b942bb502109de9d3cd6cacc6f5b1802f1e7f3254234fa0ce2cd98f23a47e82eca11b05a2dc662b", -"votingAddress": "2frNPcVNZH2TrhJBMnk1TczLpPk2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0264f24f74a9c0c50ab18eee57781308b8914e2b96d0c32cdbae012c275b1919", -"confirmedHash": "79fd6c21d0ed942c0a2705aa4e62696fc5ed9a368842e4530b00000000000000", -"service": "00000000000000000000ffff951ca189", -"pubKeyOperator": "815dea8734d1b3c43122225a97b56f334306b3bce5c9b79dcce676756aebf01740c6b35fff18c6950ee8c72940cbf9d7", -"votingAddress": "331ATrJG46BrtS8ax44LnomqDaTh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0267200e3b16858ec2e48272395c373f1668bc541c07d6cc1aa17d7ce88ce03e", -"confirmedHash": "ebb33dc05bea0a8b204bad88b73e00990d3cd975a63b4f080400000000000000", -"service": "00000000000000000000ffffbc28fbd1", -"pubKeyOperator": "997bbe6e645433cd1bb49621fe12a7d75770b071be7b4397a97604c5eb66c0538fe7b301bed65ddbd1c916cf46c12e12", -"votingAddress": "22QNhtzNwDbW1WMmFdAi5r7L5zD4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "02692840a924ed34cf1535a294b7130db34b984a5c1d32455332fbc2c5588cbc", -"confirmedHash": "54ca220dce6177184e60d8a3194e7046c2aad4e4adaf83190f00000000000000", -"service": "00000000000000000000ffff52d319ce", -"pubKeyOperator": "8669034d1d188d96eaaa33affdc2983890a33e4f07dd3fe02ca837c2feb2d53b73ec5378dfa6edf180dbe2117591c8f4", -"votingAddress": "3hnfp1M261qUKfcdPAPxZgujbRi5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "026b816abea9209a8e045a8beba834033de944f1f8c0586956b78d1264a2c85b", -"confirmedHash": "12687a2c291cdf0465b65fb9d57a97314059c49cc7bc21ef0200000000000000", -"service": "00000000000000000000ffff52d315ef", -"pubKeyOperator": "8192ba0ed679cc7bbd23925efd48a79ee17146136465456d5ae3f8f644ffd7baa0b9ced3fe88fa2d35fdef807952b592", -"votingAddress": "4CBDa7d47QGq5ZtpSQcnFieyKfL7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "027b157e53ebed53a59f3d0caa054cbea35302ef975cfd289cea4e4e15991a78", -"confirmedHash": "93bbb8d553fa3ba25eda0bee1885488151949757b830f33c0600000000000000", -"service": "00000000000000000000ffff2d4f2e47", -"pubKeyOperator": "0d36cd1b487f82ff30d8fbdb545ed393dbb954f365bd2b3ea9fa1b0dc47b29e1f132d89379b5c275400973a6d98d19d5", -"votingAddress": "3irb8eHFreWhHijWahJV9RCGxF5s", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "027cda713ee40e73e23b3342c4b3600d595f3b4f902c36a9aa2ff573ea320db1", -"confirmedHash": "7c98fa9d74b035b7f4b64e9133f602e8a0e14dfabf9a51051600000000000000", -"service": "00000000000000000000ffff55d1f21c", -"pubKeyOperator": "81bf020988b3260177826ecbd2d0ae0dcee620372adb2b732940f2dbb566b5f4e7fd71d90cc12c3714d3088b0ba8ae98", -"votingAddress": "hgAAP5oVUftbx35MGTDj3NzwhBk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0286d9458cfcf15b549a1c0eab27f13f0f889d706791587f52e6cd4121ffd0ba", -"confirmedHash": "403a412bac6d4ee54eab4cc9511c82bfa31bbf28b84384420300000000000000", -"service": "00000000000000000000ffff2e656c44", -"pubKeyOperator": "0eb811dc1ce20c14407b252919d8b3b23ae93f4bc8766fbee3389696e7a9c78e297dd2115447b065f42900e35f789944", -"votingAddress": "WwJcVUB1JhpGHP7Z83EBDvXZnMb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "02b7661861dd6f14e551ded2ff84d70fd285b21657348e08bc0de8751c3cac14", -"confirmedHash": "7cda983d2dd8a2fce5cf6141c48cfe13ed4c9c83d43f2b4e2900000000000000", -"service": "00000000000000000000ffff5fd8ff42", -"pubKeyOperator": "8896af29cd715936bc3810902ac87341e966a22793bd566be50e6ecb6a29d116a82399d03c85607d2f8e0fae4f97fab0", -"votingAddress": "2wWyubuT3xPmAiU3cdqMsqBGhCvN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "02f92ad24c92da6ebed71e1b50677f9844842e3f16ba20296b387cc4d46e3e83", -"confirmedHash": "64d13aa784936400ca89aa252c7a462cf8e0eff18138fb231400000000000000", -"service": "00000000000000000000ffffb945359e", -"pubKeyOperator": "8fd05eaeae8698a2d2f0af1a578297ca6bd61bcb1c41ba1dc06db364cd79905eeb646c5a5bd3ba31f30a3b94fc0233de", -"votingAddress": "2CEtBybRhm1tkSvQBJPiHzm92hKd", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "02ff4f13d76949d65e7dc5da0548a6c0b2d0afdea0fa1ef222f4c08be70cb9c8", -"confirmedHash": "bac75e5353a0b47bd86748ef797e821f2c8b05fb6ed340fb0100000000000000", -"service": "00000000000000000000ffff369e90a0", -"pubKeyOperator": "89b184d9cdbbe192bb2c29a500c69cae4753069cf145fb8372adc1150cd17a655624bcae36781486779dbaa78357b72d", -"votingAddress": "Duuohks7U1t55VD41KuJpao6iHi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "030f708fcbaddcb4927c9d633d28320db7211ab9af6924830f233b9de7f3e7cd", -"confirmedHash": "684178c25a5de77b3efb75710995a5c3319618e51c6cd8d51600000000000000", -"service": "00000000000000000000ffff951c9ba0", -"pubKeyOperator": "935d526683f7ed8a27fcc304e08c8d83cd07a9a2b0061e07ef7bbee4af513cd7cda1f88f583b702b482488f9644d0403", -"votingAddress": "whwBVxyirvPQykXT2Jo9QEejSg4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "031552341ac7dc146e22054984d5427fa7e565a0812887bb5db9b3d056cce977", -"confirmedHash": "f89df141473b15efaaad9ef3ce8a222defabdaf194de820e1300000000000000", -"service": "00000000000000000000ffff87b5322e", -"pubKeyOperator": "8b8b3ef3d6cc9cea91c2733dbe3559c81d831ed55002e0cec5befa6fb47cb80f465efda003b8a994eb24f818db0288e0", -"votingAddress": "2vM82HhkC6QM4R7scVtTHdSdJCcb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "03186cb95dc423828be40259ea5bdef5a515f19c01ac5a2ac5622c149f5cd959", -"confirmedHash": "5c91bfbdb241a60eda938fdadeaebd9ca63967bd6a53f6e50700000000000000", -"service": "00000000000000000000ffffb23f798b", -"pubKeyOperator": "8f4d2430f981939b6ef492e4faf52a1beb7c058e6d39b9925e1005cd23902d872993649029149d9f74c446fcd01bfd81", -"votingAddress": "4ANBTBkKkU6qa9ePk4fT93sGhNUa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "031c41d232f5448efb502ac36cf7aef7b350d6877097ca22cc63c9fe069f97e9", -"confirmedHash": "245cd90a17cac504eeba8c0a12efc069c3e64bb42971ca2d2b00000000000000", -"service": "00000000000000000000ffff8b3b04ac", -"pubKeyOperator": "0cb72d4dd0ee253474f0d9435850ffe3fd7b94b2fdfa6a91072d0d5aa859d831b3e429244023c618ab82bc6b5cd154ad", -"votingAddress": "SvZ89xYrADXVyaZ1xHUCeodWRUS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "032c960716bbf1413bd892e947dd799190e523bb491af38122635782b85b11d7", -"confirmedHash": "56ab17fa8c69944aa79cce50ddff5df8ddcb2371c855e11d1800000000000000", -"service": "00000000000000000000ffffc2875f71", -"pubKeyOperator": "0501066d8d2535899ce4eae83e5836d8996ebe7fa72b998da0b603e66cf3a332865d5b4218d4d4aa1eb709b73bfaf055", -"votingAddress": "3rsmNobPpM1XnsnLFbvE5tQEf8tD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0339c6576c665de36d8f2045ad30caf6875e2fd4a2e363bd1d19129a060f34d0", -"confirmedHash": "95ca7b9118645dbd0535c649dea5f61af9b6276969ed682b1800000000000000", -"service": "00000000000000000000ffff0391770f", -"pubKeyOperator": "0341c7a10085db0e1c48821aee03cd96aa2b3fbc3fa05a62cb533e30c7d51147426811d6b988d19922546427048f9eb5", -"votingAddress": "3kajz2nLTLwx5goLtNjKyc8QQ5SW", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "03541dbbe0b75087039c2681767571ba5cd7b5ad0e574e77513ca6c2642696f6", -"confirmedHash": "e6f8029e47019962c4211a7d62ab875a7fc269ae1bc43b3f0600000000000000", -"service": "00000000000000000000ffffa8775780", -"pubKeyOperator": "8d15658d294b55063031f5a6d5291f00b4446b52afa3b26f27f8e0057c27c13f894ed5028ff0b86fcab3408517737bcb", -"votingAddress": "4AMfG3nzkntFFABfWJVo3wQjL34w", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0367a9705de387fc34d6aae1b7694e05b1b10bdb4b2ff8457bbf84d59e42e0dc", -"confirmedHash": "de62cbb4b61a568e01108cdfb9db65023c3d21d792558f450a00000000000000", -"service": "00000000000000000000ffff52c4097b", -"pubKeyOperator": "8f9cd0b79911cecb08328a506412927e6dd105edc74aa45ff24c0fe06e37ef81b608956b09e726b36ac9996b00a3b284", -"votingAddress": "aPgwpFLwRftH6tSxFUxE4yVNAjQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "036997f226be8098d9a306528860d6697174800823ac41b0cdb3873fe48eab6b", -"confirmedHash": "d323910528554677895312a22605c1ffdc62a70788ea651b0f00000000000000", -"service": "00000000000000000000ffffbc28b485", -"pubKeyOperator": "070a6db18c2debbb06f24e092f02066901cdd644017d9d5faf2e7dd2a75975f9a8e79bd3af8e3463d5fb9ccd91960b36", -"votingAddress": "Py4hGFF41qQL7qK4x9pXmQANHW4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0372c093b2cd9e0eb6785eba4e7a87ec07ff669df9a80b9e5c8f87fa9d3d600a", -"confirmedHash": "eba3094b1ca62cb094500873c745e0f55354317bf1a030360100000000000000", -"service": "00000000000000000000ffff2e04d9e1", -"pubKeyOperator": "9966a0a4c568273f275890c748dc2e2fddb392832c44eddf6a13e4b7f4dac94ce709d2fb077a205ff6ec320cc451aa9a", -"votingAddress": "CVPJq8SLr3atieVe46Ki6MEwfjZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "038691e838d1879433a971367370a10760c8723627c206cfd8cc291f62125b8e", -"confirmedHash": "99d78221fc4c388fb540094803b63443c8ae9d4710f3c72b2d00000000000000", -"service": "00000000000000000000ffff05a157b8", -"pubKeyOperator": "1174d8d574063f0351f6c22fa1adf93eca447cb7ad26af44568d845ad9dbc4a634280bd056dcbdf5b22fa74eb81b837b", -"votingAddress": "3SDj9cn3VyYYgbQYTDMo5CFRQXGG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0388e087d8690c9225dfe588307c1acbf1bdfbec61efddb08a3e9e4253abf694", -"confirmedHash": "0dfe8ac685e2609de0c83996e9e10eb4cfd57090854bca980f00000000000000", -"service": "00000000000000000000ffff55d1f1cc", -"pubKeyOperator": "929bac089e6ae093ed726ed8dea16ce4b9428b119cdbedbccbfe7b6b6072460e804b07470ee60fa2cbd8c9140a310489", -"votingAddress": "4GjtsLDDAErz6dfPwkuWoYPe1xY1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "03895d0a4a00498b8bf0741b6c2481c820c81fb78f9803a42c9624ea53a1f663", -"confirmedHash": "65696c960bb8b682a20ec21a5ca18a8b8823c8569375439d0c00000000000000", -"service": "00000000000000000000ffffbc28b241", -"pubKeyOperator": "1352dc502f30a76e8975fb779a58b0587229befaf5dee6d3943d2840288b286fed33ceb79871ed3490c1731f129252c9", -"votingAddress": "JbYg8fUVZZE9KadEyBkwHHaGgff", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "038cfd5596cc38d475541d83bdf9dd460cce01b0bcc6ef1e1b8ad74461e0ce65", -"confirmedHash": "1c226461af3dabb0419564e810a5ef14e658acd2b7165db62000000000000000", -"service": "00000000000000000000ffffb951a5fa", -"pubKeyOperator": "8ffb090fdcaab7c1f3957109611076fbd9f398b8cbc543126782cdcb68c3f20748f83293cf6d625973736194dbc7b12c", -"votingAddress": "u4SVJhsFQWWULxJogpVLe2Sfke5", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "03b05ab6aa5ab27adf6388436dc8bb2726b3a973b710b42e927e12628ea84332", -"confirmedHash": "a2a6e88258e80c36011d892008fea0d155f740cc43a798eb0b00000000000000", -"service": "00000000000000000000ffffb280aa6b", -"pubKeyOperator": "95bf391ca77be9afa17b6aa436b060514316bdee279144667d9c6c8f263a84863192752e18f3dc2cfba339744daf634a", -"votingAddress": "3JcA1tKmeUZpfAYxst44fPUMkAQs", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "03c539a49357f143d064e58e63ad9e442b91dc780749b0a19f0a48e7db49e81e", -"confirmedHash": "50a4c2e17790cf4b393eb396ba5c55c7f68d3b5a527d3f590f00000000000000", -"service": "00000000000000000000ffff52d31967", -"pubKeyOperator": "8a487057ecf758df9969d847d33536590fdca1a3fdfc7ec14a0f37bde880be5aa51b848602a66b6962ac0575f47a26d7", -"votingAddress": "4VAuXkHr6Zz1uMHysdNmV1bjB5c6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "03cd66f063719954b26eb7774ee6c7ec2c20fce5238b4f52efc2d9e99d7c47fc", -"confirmedHash": "2db50aa143655d2cf608f57c758916871e2701a67d34b25e3100000000000000", -"service": "00000000000000000000ffff52d31973", -"pubKeyOperator": "128d88fb4112df42cfe027cfa0e63185e8d1521e1088ed8e0a93b98b38a2b489fc2563448f80a9a52e09afbff8a66588", -"votingAddress": "2GNEUekNPuvi5cxmtT6HvR7iFo1F", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "03d23740f993ec471efac548d9bad30c360e239fef526124a10d922f547cd90b", -"confirmedHash": "49b7e5b723d639163880c859dd9f078e59a8073424fdb6f20100000000000000", -"service": "00000000000000000000ffff52d31914", -"pubKeyOperator": "04713054fb14b3815a39e194c497fd21a0caf4725ad561e5124735a0a5aabaf64a1d059da0697040282a3f6d5d4226f1", -"votingAddress": "2bvSxBL2LYPRZf7jec7hR4jKJn5V", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "03d72df4e1298f0471665f7cf2f498b2373995af149e51e084475d06535c30c4", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff968867b3", -"pubKeyOperator": "81b1f0151edf35e001385496b0b18481d4293eb1218f8105be8068d7864c535825d134f70177922a1c64674c87e10829", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "03d76b6fd27ee3818c186b4b377c89e0f23d2e4eba1bf0866197dedf33688a2e", -"confirmedHash": "f938d7b65b1dabc9742b652c5d9bb7361e1d6d497a8442801f00000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "3W66M8GgUvCnLYe7bgn94WZpkXy1", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "03e5cb5ad662e9f98b8d114cdf7e3b14148bd468b5cdcad28a2f7612300ebcba", -"confirmedHash": "9a14ce8ae438e50bab6410c645122e2efc9ddd186d5ec9c31200000000000000", -"service": "00000000000000000000ffffa1234826", -"pubKeyOperator": "999d43dfcc43333f9c1cef2df7bd60a92198b63f2e3fc0d1e683853227ae5223e2d9456fb2178eb53dc54dc1f3649d04", -"votingAddress": "2YqFab7H1zFWJG41cqLwJYH1HtK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0419e8a7f344b4c480c89c4e28cdb16b104b39bf1c939ce5cba932ec3b697c6e", -"confirmedHash": "be03f2f6cb2fd672e6d543d4eba7f3f27326baf5279f57222f00000000000000", -"service": "00000000000000000000ffff86d1cc7d", -"pubKeyOperator": "87bbb9da251ce598c8640ff9df28ebaf2bac76aaa78b80933a89b9f09facfa3bf84f6a16b4244430c153eea0f7eb2f6f", -"votingAddress": "2PL2R774RrfZR8o9FXC7NGNwcZ3B", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "041fbc173eb11c57f60d4b25047eb8a8ce3187a1c08746d36e0a8c8b2f6f5978", -"confirmedHash": "ee5164ef34b6cd281798838361914fd0586074ece8e9f42f0f00000000000000", -"service": "00000000000000000000ffffa8775308", -"pubKeyOperator": "069fdc47b17e21a2c12eb27e81ff4c011f8088b3525cb1e6140a6f7db38123232ede01ee4fb2b7be143b756533a77ef6", -"votingAddress": "kD5xuadDbuCXA2YxkRnNRKxu3VA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0438fc079088936b4424c741a569c97ce234592775c6bf32677646e6aaa4d2b3", -"confirmedHash": "b50d30e38a72d85e16a26a43b7de5cbce94d72d9df7958410400000000000000", -"service": "00000000000000000000ffff32740eb7", -"pubKeyOperator": "02e2dc7a4b6e50fa3a6bc62d5825b44c59497e8a07faa9aeab496d67c662f8733ec2a98261b240c69083f30ba32ae4dd", -"votingAddress": "38ko2D3TLskGnDwvJCcVwyWzGTiE", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "04437a7b1e1b94766d9cbcee38a2db753b00685c7a887c57d471c38b2daaa600", -"confirmedHash": "614ff80655dd3d6aaaf247334763e5e4bfad4927f0380cb62e00000000000000", -"service": "00000000000000000000ffffa8775794", -"pubKeyOperator": "0511a3fd6483e847ec3743388a0b27d6e06ec4fc5aaddbef55be1dc0ed8b18dae49d3090157bdee6e0ee14ae100deb46", -"votingAddress": "42mh6Q8BzaerWD1Gqoe4sfb7a7x9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0454318f501f206b372af5cac4d4d46cf64b996f58dededf29c70c7c805954d3", -"confirmedHash": "7da4e61f8c0cf90937c9f3e277658c4c75f07a82276282b20300000000000000", -"service": "00000000000000000000ffff9f591ccd", -"pubKeyOperator": "85e6ac34bb6b68da7edf77d16046215835f71c0bf67e927c72d3c43441a4f09ecf127bd6b46bab80cce4725bfe008f26", -"votingAddress": "aRcTLXGJPJ4ytr4juda424P9skf", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "046b6ffbf8bb38c97ec7eafefa418edc9e80b57a6091cce967b0002d6c2f4c99", -"confirmedHash": "d8e4ecd6bda743b827bd115d041172410ea18d63f15e1f530700000000000000", -"service": "00000000000000000000ffffbc28fbc3", -"pubKeyOperator": "8b4bd11a11b940eb75110e0c5bd4f53e3774fc6b089d4812abf0fa944b91028d1f4161491801828bce72b8e56758755d", -"votingAddress": "2NwSZ7TuQTLygGh6Fr1jKM86B1EL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "047a8905f617ef27cb6af22d0dadaf92dac9d44416d2acd75ff36775220315a3", -"confirmedHash": "73586ae9fb558c8e399319a4c0afc58003d8c9c93c18a72a1200000000000000", -"service": "00000000000000000000ffff032694f1", -"pubKeyOperator": "148f7badefec781ed0e5c28985362dba230e471b358bba795422d352d654e9029d598981f2ecdd068460c5fb1cf67dae", -"votingAddress": "27R55b51oUD47d8ceXoS2RvLz1kD", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "048251b5324f7b1e524a4b22a37b673695e6bd45d5770cdb587c3f921e439246", -"confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", -"service": "00000000000000000000ffff867a520a", -"pubKeyOperator": "9954763d7ca61e6b2b76a12b3f2731d7e706c055acbc3636ecf0feb37189f0ed3aad114f368451dc622827e600f32dd7", -"votingAddress": "2xXS2ruqLnXbuKqb85UBL5zNHisr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0486731b7ce036b1107b2c709e64cdabeef4117142297db98ac50dd5e944ee89", -"confirmedHash": "ff1547d878725eff3c31ed8b522fe6dd4b40263aa5d67ed80f00000000000000", -"service": "00000000000000000000ffff6deb41cc", -"pubKeyOperator": "103841432370309d07076f3f4c1711149a650a667b77d35464661866c4f5d44fe3478929b1bfd4c2bcd9786c179043e7", -"votingAddress": "2S6ujy2TNANnJQm4LZgcvMbBkPgs", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0493473479ac920ccb09d3360f5954295004e2d0f20cc3d6b27f4084d076e2f1", -"confirmedHash": "ea2237283e375670e8116e14eaeeeb282488a5b76acf3ebc0b00000000000000", -"service": "00000000000000000000ffff877deeef", -"pubKeyOperator": "92378cb4bcbebab22b4841f96fd4b423983eccc5671d650191637d8e9223c5da773b0711b58ca420eb647e0684a7929a", -"votingAddress": "46758aCBfkgRP65oKMYqizfYvTMw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "04d7c1f9699497bf897e995fc903a4c554995b36a7616b29dac31310736b0e39", -"confirmedHash": "b9d70d4631d6fca8deceeae206b4071be4a35f8a231d26bd3d00000000000000", -"service": "00000000000000000000ffff6deb41e2", -"pubKeyOperator": "84fd5da5261b56788c935066800808476498160ab5e5e2a27a4b69d433f3f64e0e6950b440c9bb27831581276ef7f861", -"votingAddress": "2reMV8YkiDHjza3hoj88tvuAFqf8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "04d7f92070c222fd6802e276daeed3bc4414a6ff2987a14ef54262399c99c2f5", -"confirmedHash": "ed4b1a65274caa270a3b9662a84749ade6555b2ce41be33a0700000000000000", -"service": "00000000000000000000ffff3359875c", -"pubKeyOperator": "1705903f719a157657932ab8f6ad59dacd05e8cac1771afe952bd1a578fed3218493f3211bdae4360f5db0be602bfa12", -"votingAddress": "3LK6iaEkN97NfKuKygvqB3zgAoEC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "04fc65386aa7e2e2203a67e4478657a0204a1dc3721b11eb718565d5e72ff22c", -"confirmedHash": "4edac6cb9bbcfe9deb7c2ee3457b06622ee4d6c73359a11b0800000000000000", -"service": "00000000000000000000ffff867a20e6", -"pubKeyOperator": "8c4326eb13a57102f4634210c25c162a3edc87eb9520b241808d1edd227d3a3a14d3a61a4a08a44266d4e5fdb95e5eee", -"votingAddress": "yB6ujN75WGJ68q8KcqdNc3ePgaD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "04fe8b85a65b69501aa6cfddcb9df9d3cef6be01011c3095fa0758ec66936214", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6dd87", -"pubKeyOperator": "849faca1f36b6a3eecf204bfd95785d6cedcf617eee22e75b23de5b3ddf9dc9a7a742604eb23472f84dff13bd019fc88", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "050ccbf1da1cdbf591bf01f10a7f0de778f75c6ec053077b83916058f3963bcd", -"confirmedHash": "9a1d301a18559dc1aa20644fa3b6273224ce13f37e3b92b14400000000000000", -"service": "00000000000000000000ffff9e65a24a", -"pubKeyOperator": "81978e429266b97b5d9c73ad4c6b0e11e65a84f4f2ebd6b3e38acbf5dc4749a11a7a8daf5e46ad3f1e5b75387a0fa6c5", -"votingAddress": "RHbpXfKfDR9YMwzZzXZtSE8K2YA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0513b601be80783c55aa6c18fd370e0e069020b34ea7dde0ea60889bc73ee550", -"confirmedHash": "4a14ef166adc6b8e8520492b8e3068fb8de1e7b4dc5224dc0800000000000000", -"service": "00000000000000000000ffff5fd85427", -"pubKeyOperator": "8d2b1c58d70b229f2cc2690aaf33df0aad227fec7619ed1c2295f704fc7d73ff7bb97e3013f7c8211620c4715d18147d", -"votingAddress": "44HojAiPtLoZJRDPMYRfK4Wjfduu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "052b309c67ae34f1d2bebfec4684c49347ef8123071bf0aedc9f8a70bc89c01a", -"confirmedHash": "6d50c164872f58879b819faa4f5cdb391afe005b5ac59ba83600000000000000", -"service": "00000000000000000000ffff052d6e8b", -"pubKeyOperator": "0e99d91b38205317fcc7ba10b1c5760420a0f4b6252bdb50418a9189197b5d69ea7e71d8193a564e0f4b6b5a99481d95", -"votingAddress": "2Fyk73Smsa6A3B7gXVCWhKBKMiGu", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "052e735a4831386528d511862cdfa7489448e13e84e398410d38855ff07f5ba5", -"confirmedHash": "93a6f7d256d0cc693cec52642d87b8a62f1b37fc3b6485600100000000000000", -"service": "00000000000000000000ffff55d1f242", -"pubKeyOperator": "15e27b24c9b2a6c6ddb92b461b786a53ac6b7e6e7aa5cb86a895abb7bf68cd78c5bad1fa2775243df1686d408308b5f0", -"votingAddress": "4SnitaazHwmCXoiHaXoT2TDMcqWt", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "054f9f730a280bc03b7b03213c5fff07774655da504694dfbf2720c1dde8317d", -"confirmedHash": "ddf6da66d5619afc294a0279214e2712050f2479e4d5fe4b1c00000000000000", -"service": "00000000000000000000ffff6c3dbd5c", -"pubKeyOperator": "90a2f2b86f04a57ceaad39354f87417d1eea55e561eb4e480a8bc7e2a10d91f799ea8e7131ca215adda9e92198e3120b", -"votingAddress": "3FDfe3DajB9r46Yxny6Ty9wN2Y2W", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "05558befa96b10761effa2228945f74e983cfb2e12a56e0a2ea8ed408cb8f9f3", -"confirmedHash": "7dd29cfea495586063cf4e1b16ac509620a2055cf3ce62193700000000000000", -"service": "00000000000000000000ffff2d56a398", -"pubKeyOperator": "10f5fd3cbec286dd3197288ef7f8c3c071315cf8bc8ee44f7bc63aef16e2e462a53dd4944e1d6a014c499386e5fbd2c2", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "05580154d0279d50eca8febd12b99725b57c4c52fb0f1aae0a3f39e275cd1ae7", -"confirmedHash": "53ad34fa4b3bf1c4fc189448a8dc3d3cd5288d13494d192d0d00000000000000", -"service": "00000000000000000000ffff2d38501b", -"pubKeyOperator": "8dd634b816918780e82cd4e6bdef548e8ebc0ba92877c45629d6b0ed27fa04dc2303b934fc46e8c033a6a58ccdb4ae98", -"votingAddress": "4VqdtprncVBdjUaKprgun9Tmeib6", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "05582c74b05e3c8853f74ee4275d68bf283fc6d1446dc9db044469751d4cc130", -"confirmedHash": "60e7d7c67f7159d1139a6c3100a01fcf669ea20cd4b1c91a0800000000000000", -"service": "00000000000000000000ffff22c51ca9", -"pubKeyOperator": "0c293de5ea9435bc341b7c5f40075a178b683fc56caf97264960a91f79732454d235b96b966c58c7fba1dc9989f735e0", -"votingAddress": "3bAPmZcJYtvQSmCZm7HawVkeVAH8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "05865e17ca8e378ad265f69939ffa3d04eee88dfcb550a717cbde4dcc9672580", -"confirmedHash": "528a4c8cf4caecac9122266ba8f0b1501f29d540449976740a00000000000000", -"service": "00000000000000000000ffffa2f3db19", -"pubKeyOperator": "885dfb06a6b7021e54f8ceee0c8d903b232f9113857b762e9ea846be256767203abe809463dff90116b7c397f81e1fa3", -"votingAddress": "9GunK33UoSrPWapt8wyjfsDji7d", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "058a645ad3c0f571a35834056e6f7b103efffb6edb05c6b04435ea9f9ede8122", -"confirmedHash": "a73df3c6a9633ca016170335ad8c7c1b3f42cc131e70a5bf2500000000000000", -"service": "00000000000000000000ffffb280e58e", -"pubKeyOperator": "87e9c1e89bb1960ddfaae8e26b9ea3ded2ca5aa5790968e2a9b3a08764f9888e7f2e628a88915b3e350d8ebddcd2692c", -"votingAddress": "3Dv55bPwN18GuDE5eGUHxk3y26Tc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "05b21e1d0cceb56cfda12b87c48b302b29202c405a17a08e78bf3ae4ca51be78", -"confirmedHash": "7bff4f371c94a24bc8bd45d996e8e1e504972248543b91fb3500000000000000", -"service": "00000000000000000000ffff5fd97d67", -"pubKeyOperator": "1089d208fa0d3ab7ae7a980e07915717ae69c7d59404beefff37ad2b4c90bac6c9df112b3d04272629b1e3480e9334b6", -"votingAddress": "3tDqNhWcp85jQMuFvrzYBzzU6prQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "05b24739786ab0e8810f26f5c9d0337626f3781067c8e84d7bacf34f1bcb9930", -"confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", -"service": "00000000000000000000ffff52d3191c", -"pubKeyOperator": "9944f7c4990a45f0597812400cd3db875d312d4c4f5c180a276cc6a8e3851f2f32baef0148ad5158375950211c5bdc5c", -"votingAddress": "2h9BDDLTKeXXJyYNSccBrGvegFyr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "05b4588f17e21c5f7847ea4d7947d6df465cadb911ecf0f45c2b4dce65d50ebd", -"confirmedHash": "2492ea3b729d90f88b5f842cc4991378f8944e4375a696250000000000000000", -"service": "00000000000000000000ffffa8775798", -"pubKeyOperator": "0207579c663392f01ee6d367690df6c5a002a1f414e77149119b56e6ef435f00052d5d4a4c7d8b6f882e9e5fe15519f9", -"votingAddress": "3EkBWZ2hpTvrASJhHm9LvnhLX8xX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "05be0f146826f32a7088da5e50530e598bdcc5d04534c236dbc3317ccef3959d", -"confirmedHash": "b326c3e8716290edb18e4540809500d8a42a03025d16f2171e00000000000000", -"service": "00000000000000000000ffff55d1f1b2", -"pubKeyOperator": "0a65bf4d7e3226e211e22b0b8726bf7abd8e16cd92aeb6872a22c94c45c69acd4b53cc00f973436210c548646555372a", -"votingAddress": "3edwSyuDNF4fopDzwQzkuWVU1Xmh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "05c23aa25894627e4681474a3eb214d0d37c26f3d8357e7095a77a8dbe90ab98", -"confirmedHash": "af5afb3f440f561c2ed8cf8b32b4c1823ca3fbfec89a8cd11a00000000000000", -"service": "00000000000000000000ffffb2803510", -"pubKeyOperator": "178b023e26b90e620f993d1923acd84bcbe82afd5a6f4a65db073883a9d091e4573071aad5d0721cae04705531f6dac3", -"votingAddress": "2W7Rc4B8EyJVBP8kG1wiFRho8dXi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "05d7ba86565bb9c8305f67b39d40ffa6714f8df086f21fbfa551204102f79d77", -"confirmedHash": "7f67a3907a4cfce4bfbda67ab9bc676864eb320e4c71eab60b00000000000000", -"service": "00000000000000000000ffff6c3da45f", -"pubKeyOperator": "04aba2dcaaa958481633411ff00b99ac7dc38441a539eb4f140aedc4f6b0c804e6c177a8df508025d457e05355eec1a1", -"votingAddress": "324D74EomfcA3j6WgLtMmQ2mXvCJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "05df5985916a31cb33a8a2346665224bba70f8e632efbd982d440e3c8f0e9987", -"confirmedHash": "8f035dde1561c32197d4c8c57d8b913acee537dc442367531b00000000000000", -"service": "00000000000000000000ffffc60d342f", -"pubKeyOperator": "1641e02bd394169ffc582c2bbded13599a1312574641d61a3b559be849a5267719d03b6a488eae0bfbaf9c4953bdb393", -"votingAddress": "44wxJLoipYk27C9QRUDPHGGbVt5Q", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "05e2ac6cbb917a29c96f0c6cbc774faed3788a39a0b8e4ff2100cf43fb92f7a4", -"confirmedHash": "590e3b36e1e5ccc18e4948f79f45ec4d4cde8d1463e578381300000000000000", -"service": "00000000000000000000ffff55d1f236", -"pubKeyOperator": "97baee2cf9aa2d81ca53ed4aa649b32ce51a66cb186f8ab7a9e39277ffcb7603b2be1fb221eda03298f372be4cb7235b", -"votingAddress": "3iWePJtEDKGj5GST8fSWsCaDdceV", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "05e61a332e4b85f4f8e685f1fcf64892807c92110e440d6b13e0e0fd3615925e", -"confirmedHash": "2e42482a9a791e3abce8934ebb9e66eea6c497c6a0eb3b030700000000000000", -"service": "00000000000000000000ffffc28754c9", -"pubKeyOperator": "1934c039b55b5077b09412fed6e13ee5799bd388d96f28ff85dcb844419e717e04cf42d9213887f55f0392150639405b", -"votingAddress": "4G7kZiQzk6wu3BXCNUBZta5AbjdH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "05fc291080dcfcb3f2a804c545e6a0b1ec8a9c25e483a2304dfb17913bafc3c5", -"confirmedHash": "6b2f6dcf4da20faebabc2062b527911741b7a546abb3d3cf1300000000000000", -"service": "00000000000000000000ffff5fd86d81", -"pubKeyOperator": "95f94b5aa41a9e9dfc99de48581ceb15b3bb9d9ee8a8cf8239a1f331526c77bbfb6f0d9e69fc2278638f854f4d6f7cf4", -"votingAddress": "9tTDygjqZYnzj2PEjRDCXvgcYyU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "06028ef5a0cc879aa113f21800348cb27864e81eefc2a5357567d6243b248dc3", -"confirmedHash": "a22210c4dfca393502da27017f561efa9480f65666f237a60c00000000000000", -"service": "00000000000000000000ffff55d1f1f5", -"pubKeyOperator": "0b7c2a1d82cac9ff211d5d4cfcf11b0a5915581fe5cf5e8a34342489e7f5f02eaf67f8b9123deaf3a6f3f71508c50dce", -"votingAddress": "Qr96nYaEgAQmjB9ZhN7FnzTCbpA", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "061bf5ea3fdfbf566c02032a4529762624295cde752a240a80a86593ae5de0be", -"confirmedHash": "6adc93a648cf4470b930bcb290bd8549ee6add5235c6db0c1600000000000000", -"service": "00000000000000000000ffffbc28be27", -"pubKeyOperator": "136fc66c1b9dceb468c5e95aac34e83464ac6b885cbf9f0748ab833f35e6300c55e9aad03cec19015915c17e43ec03c2", -"votingAddress": "2vtQiLhfNNx82jiRWmtpS7buLNyT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "062165823445bc0a31a3d126adddcc74bd95e04f86896c09109995da83f982ce", -"confirmedHash": "67d290c14597bf72400ecbf2016e6baf4c7bc940e6f269331800000000000000", -"service": "00000000000000000000ffff55d1f109", -"pubKeyOperator": "02144e2ce67e304df7626768ba89a71f5e7328a5d5c3b511f4e7d3f557850d25db6cc0de9d10b54b7ad9096e882f95d3", -"votingAddress": "4Eyn9QAHSyTaijk1BS5UrwsbZc4X", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "062a2fea635baca91c9aa27ea33a7f934bc313fcf5315042864e326de302f5c9", -"confirmedHash": "5ae9f7431267399d34583435a95eb7031ae432ee945c02ed1100000000000000", -"service": "00000000000000000000ffff4b7792d1", -"pubKeyOperator": "04bd84c3816d8fafe44f04dd44ed8d4934d41d291299cd92d65f18b4ed47f413970a426c48512ffebcd464ad4909f9ec", -"votingAddress": "3z9PvpwedrXzW6q2SRf21HDGZbc2", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "06325ead55670954edc32a04bcf4cf2b1616152a52c83d71a327b3af9498605b", -"confirmedHash": "7882da67f9fade8445d0aca345a4a182a72ec566dfb3f13d0e00000000000000", -"service": "00000000000000000000ffff4115fdcd", -"pubKeyOperator": "8006121d644a45a9b95e9ef6660d0024a75f1f5888205e5c7234eb0bcfaf37e748ba620ec5fec31f26f1d9b860dd2f02", -"votingAddress": "34j7XnMePQ7qn1yGaiGyF29YyRWU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "063adaba34a64d22029b89ff0de2cdcaf366f6a9b3e0b73a036c5fa1a04965f4", -"confirmedHash": "0e16f2827da5d9d0a494e4c4c828e3a9a34f23b8eef552dc0100000000000000", -"service": "00000000000000000000ffff55d1f234", -"pubKeyOperator": "0912a1ece9b42c554efe5002cd0364ebeafc47bab21392bb944b518cb4a425d2bb675702cfda7b23f1d056a820dfc10c", -"votingAddress": "V8w2MrVJLCZqaFHrS2bT6Umi1r1", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "064f7a4f913ecf179b4f50f7f87bc56165a22e010bf0920b0087739caa9e657c", -"confirmedHash": "d3129d623c4cbc8cd76e6980acf34e6343c05c3ba3cef7d50200000000000000", -"service": "00000000000000000000ffff55d1f1e7", -"pubKeyOperator": "14eca2afc599c450b0029ddb12b811ac6c43070bc29dae0a53b91a1558f2376836be9c40e33feefdc65fcab666f1ed5c", -"votingAddress": "AM2x7qVLdcudaRdPwUkEhUNp2mb", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "065fef6b979f88a139f51d87326f7212d58a7d379344fdccb21785c316a32468", -"confirmedHash": "24de7b01e4ef1e9d941f1b1c2f895102b99b37fe9376e8d72a00000000000000", -"service": "00000000000000000000ffff68ee9754", -"pubKeyOperator": "8840c31c80282700a5f19343ffbeeaef0286080237786af17dfff6f5a9f9f9ad3566b206303d840a8f870c7f355075b1", -"votingAddress": "u7B8iUGoc2vfBeysEwVDx9zVUJc", -"isValid": true, -"updateHeight": 1760952, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "066393d7fffca543a2c335cc4effb5aec589ca079789c6a219aea45843c7230d", -"confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", -"service": "00000000000000000000ffff55d1f265", -"pubKeyOperator": "141c6bece5a4e61ca697029ea7d2234ae581fe730f20f5fe788a7d982085d7b96f31ba534ec83a981e674cdd762d123d", -"votingAddress": "2dj6cvWFA9UCYZr1bT5C8meibDRc", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0666a79aa713ec00eef20bed7427c91adac72134cc16bcc2c5a204fa21556109", -"confirmedHash": "b15d9f41a0270b23a153cd181485cff86b6543638f69eddb1700000000000000", -"service": "00000000000000000000ffff55d1f16b", -"pubKeyOperator": "19d3d2acd66d363faa6429e5ea3d050212e2e52ee443fc13dd0e2b069b37d099cfc5de8afb3f5d3cf1ea25fc78cf78c1", -"votingAddress": "3tADu8CK7fWycrHm37RZQm537qjj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0684f42ad8fe4d74e9d3f18b791816c8749ba4cab23f1ae0ceaf70fa32c95199", -"confirmedHash": "8ff653f659d4478ea4257cf726b06155732e6ac3913d54bf0e00000000000000", -"service": "00000000000000000000ffff52d31962", -"pubKeyOperator": "972935cb28ac518159a9badc53452c65bfa45566c8f15250f7c3b456d7ba8010233104fa3f6efe85146e778891655513", -"votingAddress": "3CM77NsGrq8QJsf4tPZCruoNghL7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "06adb3d7951ed7d26f6c62de82a4dd857567588ff532abd15f60563abe40b093", -"confirmedHash": "2783fa912f5f0fa082ec966816f4427bb0cd2c7d443df0d92900000000000000", -"service": "00000000000000000000ffff2e04a270", -"pubKeyOperator": "135f473c23f97d9b930f6e257a1602105c4ad4cf5a9f81a8f875777462cee36e3a3ed1eb6082d1c4c1a41165b67878d1", -"votingAddress": "2mJGzer25BA2UaBZMmZL3DsjAh8s", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "06b2bba9e952be2b56fbdfe63f508fcf5c42df777c780b8f521b055f520a7fb9", -"confirmedHash": "557bc90620a09fc9d1433b5dcc9ae5bd6f1fdde1c6c022cf0c00000000000000", -"service": "00000000000000000000ffff52d31938", -"pubKeyOperator": "076ce48c21fd6041e304afe8ba7b80397866f55b7b4b1057cdd138834999a30ef10483a646ac6353b479c5ad684b82d5", -"votingAddress": "2J23TpgsSju9JhMtcqD67RWo13BL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "06b4c99e2bfffd9ece73951503f8309effab547fbe34f483d59ae68f382177d2", -"confirmedHash": "47930554e5bb3de32a1491ab4af492fb4f53dbf2fdf961590c00000000000000", -"service": "00000000000000000000ffff87b53484", -"pubKeyOperator": "03d6e88cd45b7923700c1261d92f6da9dcfa0155ea570f83ce636b6793ce7c9775577699f6421d00983d59f985ca0e35", -"votingAddress": "49tzfNy9kZfU9yJGHJzvt96yZUrX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "06bb4693f923609dd9df7bfadc454eceb69568a9d6647cdc7d883b45f7c68413", -"confirmedHash": "cff614cfd3d5ca6fafcc5ae87c36901a91c45d208bd76b9b0600000000000000", -"service": "00000000000000000000ffff8bb4b97f", -"pubKeyOperator": "815694faf9b834bab2f7627cadc845095af8c0319bcf5af5e0cf952734f775da4b619c3a008549ed45171a55a6f40e2e", -"votingAddress": "46wfjCas5CyEJWNM78njQU5LActu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "06be2fb6221d5d5eb0940f019e4bbc544ffd86deb6f5f9d975dacaf68a3f341a", -"confirmedHash": "e45f49bf01c8b278168678fa6095506edc09937ad19bad2c0c00000000000000", -"service": "00000000000000000000ffff55d1f27c", -"pubKeyOperator": "00386e3964926a23ed0dcb286779576dfb2f104f0178b7a1b835da1923a885ced38195eb6d09600360f5cc495a4ed778", -"votingAddress": "2oSHVFZr8aMxyhQfJGWBPGLFxMji", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "06cf4c1443c0187917142546dd6917840c62df9c7b86941df7536fbe163fb73f", -"confirmedHash": "6288673a347fc2bd0860ed0bc23b6aa7ed6552d53a0d81d85b00000000000000", -"service": "00000000000000000000ffff91831c42", -"pubKeyOperator": "939d56fc8eec2a13205aad4a99c716ec60e1b1c0ff535f2011cc482d171936cc14c88f9e78c19b1c6f1763630095aba6", -"votingAddress": "igKY8ZwhFEC4dAC2LZcH86Dv3iz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "06d7a561a975ca236ed339d1a292b062e1d2a2d4e31c5acb583cfbc1fe61dcd1", -"confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", -"service": "00000000000000000000ffff2d4cbfde", -"pubKeyOperator": "9694dc353353d256f8000d3855944699c6ce4431f8a754219ee56583e2bab6bd11e670bec2841a161e04f9cf0d61426c", -"votingAddress": "G8pEyukgrNcXdRjzvAWR3ABY7M8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "06d94d859115ca35ab8af6536d78f1820496e6d196945eeb70445f191e6e026f", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffffc17a88a7", -"pubKeyOperator": "19c671908bbd8f5af14f76b70c1a7073b30d76cb025dfb26fa7410ae4ecfbbd79ac0de83ebdc022f1b0f4520ae034e66", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0700c643612d915766b84f92acab00dc74c925a7ca1b0c0ab46dff9b20e9f7f4", -"confirmedHash": "ce9e030a46c9101431a31e578a808dbb7c4db909ba1530431200000000000000", -"service": "00000000000000000000ffffd161bc5a", -"pubKeyOperator": "8afda462e236cae44645a1bb141b54c6ee67572fb00c21eae835246ebebe7841d116e17fab456da15c22e99a0277833d", -"votingAddress": "32R4LD2NGzcFCpYvYSppYcXxN8Ez", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "071ea8fd1fe9b421488b7dbc84b8131376c07bb91129ffd15b8443ed28259aaa", -"confirmedHash": "f872e405e00cbf74dbcea854da56553c8d4edf09bbbd06a80a00000000000000", -"service": "00000000000000000000ffffd41867c3", -"pubKeyOperator": "0efaa416b97d55c0dfb1361d378e6797c75f932722729e702706d1e1226f3ab53b3c05d13c36e972cb043dc6be36280d", -"votingAddress": "3Q1r5UiJDfesGcy4jD2CRtZfAD1N", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "0731bc4bee47428adbb3f74b5dde318a712d21764898a369787943301aa59612", -"confirmedHash": "238906ab2929bd7c43f950e1322831ccbf730da87a39c2f21900000000000000", -"service": "00000000000000000000ffff9f59a4bf", -"pubKeyOperator": "0736a61b0d5c6f0eb40628751c5032b12b3a73cfe9c1f6c22cc3329238eb99e1a1e43d127f8bf90e1a4bff8e9a6f7268", -"votingAddress": "EKsRR5BHZuC5h9cbsHvUQGZejio", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "07325df1be923555dbc84544004beb8c6bfb0ae35943de3b4a852f5cdbb87c69", -"confirmedHash": "50a4c2e17790cf4b393eb396ba5c55c7f68d3b5a527d3f590f00000000000000", -"service": "00000000000000000000ffff8ceed222", -"pubKeyOperator": "069007d36c2dc95d510ec27e74aebca0adcc2d0cb9ed33dadb862a7b5d0dc9bf1a41209a967084022e06cf510610b086", -"votingAddress": "3Y93CBddy8ELwtCwBaCf1c4Aah7Y", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "074ad0a70ee5ffec2e9d4a3c58687a49afad8c07619e631558f1c94b71190462", -"confirmedHash": "c0f840762e3a03edb6b3380ad61eab32847b04e2184c246b2b00000000000000", -"service": "00000000000000000000ffff52d319cf", -"pubKeyOperator": "14ac9897775ce9f14e1c791d22114d527d8909f26c053fbdab39d91d035601c2e4be0e4daf7d6550155d9735a7fb4719", -"votingAddress": "2y9inDwuLQ8g2H36TzbjoAEi8Jbo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "075fcdd4c0ffbe393ca1d2e98f5486fdf65df04e4cfdcbb2c9a894cf0d76dece", -"confirmedHash": "3901399ff21548ac6181e4147e08594e63bc410a472570050800000000000000", -"service": "00000000000000000000ffff52d31942", -"pubKeyOperator": "98656ff1ffb118fe64114628aae464cbee7904150aaab906e1538bad8213c88a3f7388a060e0204f19a0bea32b4bd243", -"votingAddress": "3oskV8uSrpFm193cLxWsPpqkK4vr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0762ca74db0b39f6c0096caef33c94a939330fad228cd53cff38405a0715f225", -"confirmedHash": "30bd8c4479d00d94505fe080ca944a2111b3865b412eb9bd0c00000000000000", -"service": "00000000000000000000ffff80c76acd", -"pubKeyOperator": "072af371d942c038e44b0c64a0b1928bf41f6cc5cd1cdab3788384097e3d6ff029f59cf02d553ad406367a480f187c7c", -"votingAddress": "9gtN3RQHVyz9v6gYFso5JyquyNn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0770f645353eb6b6e212827220720504527788c735963400491191e9ad65d648", -"confirmedHash": "45cef9eb3d5091bd4f979e1aa694cabc7d6edf9280752b5c0a00000000000000", -"service": "00000000000000000000ffffbc28e708", -"pubKeyOperator": "8120ef95db77b48af0db8159e1b2a38c1f671b8c998acbc967b304c84e94bab52e6866c0d360fcbd23d5ee14a2cd5629", -"votingAddress": "3PBXDZrmEx99fCLyPkDr4UzMx3oy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "078d98da88f67fb020f02f103ee78640df4ca129179f7a5c849424b7945e96f8", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688e1d7", -"pubKeyOperator": "0edfd6b70b20aff9663cfbb06cd211d8fa9c09c80f79e52aa1ee3660893a4c701d8c298ce9cf291515382ae30fc5e419", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0790f394be8fc2c3cdf870871843a84c6eb8633eb090ddc0bbabfa6893de9b25", -"confirmedHash": "1cde1253ba534b618baf3a256741b40c82c161debae58be90000000000000000", -"service": "00000000000000000000ffffbca6414e", -"pubKeyOperator": "99d55a54d3d8ee3572501fd8f6536f02c1a550eac904e356fc683b5e453c08602629d260010265e0a3608b69510b053b", -"votingAddress": "4BaxgbWg7yKvwd99UGBfCvDmCcnB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "07a4bd00669e5973d13ad61757a32eb302e4b483ef362ab5a7810f1d9f8d914a", -"confirmedHash": "7c4ad5ecfcb0b50aae1c2c57c9fdf5db608ad12c0ed919a10400000000000000", -"service": "00000000000000000000ffffb95cdee7", -"pubKeyOperator": "0fae7a82deb2f9e95adef3df9b56244119fe73eb694d01a0003d8d310ac17df3d8eb1d106aec9d3be432d6942f1f850c", -"votingAddress": "4MYzTnLKdao6Xi8BBTqtiwVL7ph4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "07a8756b664a2883a8d8567a34aacdfe3dcb7a948fb76e0b43e6e5bf5f5aac6b", -"confirmedHash": "54ca220dce6177184e60d8a3194e7046c2aad4e4adaf83190f00000000000000", -"service": "00000000000000000000ffff52d319cc", -"pubKeyOperator": "8e5dd8d75927752b6aea7ee31c98819cfc5526a6e3ba84ce88c07982b8111c0129cf2f0e95a09d02146fc888a4ca1d79", -"votingAddress": "QKgfMR3qXqsuUmmxt7J2tge4U5u", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "07c8977a41dd7cdfa198a9e69e071b79966a544ded14ac33f9ccc21063bbde00", -"confirmedHash": "f191aa2b95dfeec165c3111cd3b6edb1c76c4e5b24e606810900000000000000", -"service": "00000000000000000000ffffa2134aa2", -"pubKeyOperator": "0f7715b39eb2fdb6313bf9afb999c87645ff17da5125abc79e067ae7348dbf680a712aa59cef1d095de95f4a038d46af", -"votingAddress": "2V3vpGVHqAuNpXbfDTV7nPDv9EWx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "07da8c6d38b76833422abae2dc034b611e1ba858d38280b2b9ca4d2052a3871b", -"confirmedHash": "fc65462593661c035ceee33fd9e0e0fd94f9eb3cbd40eae52100000000000000", -"service": "00000000000000000000ffff2d385ebc", -"pubKeyOperator": "095df90102e6f63dc58f4a8910e8ab145899f53c7a532c8fcb28eb24724a4cdd7b7fdcd15d3539e4fac36690a020a409", -"votingAddress": "3N9JtgHNjTD7iYBL8wyRnfjuUnTe", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "07e68559945cf0ea9616c5d392023ddb091b8f36b6611e11cd127be16210e9d4", -"confirmedHash": "278d92502f43e657c9b68c0b4595402bf2c104bf39f092570600000000000000", -"service": "00000000000000000000ffff2d4c5dd8", -"pubKeyOperator": "18d3c143ff890572b1daf50d57a1fb763255a5fec0e8b654897a474c7028a0508744b2eb3fd885d79d9445eb8711a1fb", -"votingAddress": "seCxE9t4qVrCKycVAvCDpNonELw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0847fc9d98fd704255afe13422b15a8458d6f09e2442609d8d7137826e418df6", -"confirmedHash": "4130b5dc087f489c12277f886d58978ccf05fa57e694729d1400000000000000", -"service": "00000000000000000000ffff52d3151c", -"pubKeyOperator": "8525b86bd5524720e62ed1c9d3a84b4dda822697925f78df6d0a84f5248b611325d0bfb81fb03c3b2008ea0e7839e1fd", -"votingAddress": "3iFQsfFTSc5HPihsC9e91wMR6Hjq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "084c674e9a23c3a65af777c2e773542c1db5a7fccbd9485bbb94a7fc97d669c0", -"confirmedHash": "1ab1c3e058f597da53f7797c09136a66358a9102ee04bb371900000000000000", -"service": "00000000000000000000ffffc6c77c32", -"pubKeyOperator": "9845f051390bfd3e39f1051ccbb8997d569ebdb1265d304c688e18731c3d072d60596e91be1d9e4aa210b075ad63c30f", -"votingAddress": "25gAhoFeFPj1kipHwhbr9YMeyUJe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "084f781c911532c3ff8b80a0e69ba82298fa7711df01905f2aae580db549259d", -"confirmedHash": "493c9d0e14d7ee1655189f849c08cdc1d21df716266837db2200000000000000", -"service": "00000000000000000000ffff9fcb705e", -"pubKeyOperator": "8647be48b9ad09ca9f1f906e7a43a69daf33f0713ee77e11ed68b2c80eb4d3d1dad0f7cde0c1c6743705bff810542f38", -"votingAddress": "4EpTdagX2Wm17Qh3CS7aH2CTUEKo", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "08549fa80a8fad9c9ee6a197b43929c5afc6bf6dc5700349edffdaf0b4960e98", -"confirmedHash": "36bf32e3d1a1e73e21f37d942926b61f17bca1725c4e98be0d00000000000000", -"service": "00000000000000000000ffff3eabbe8a", -"pubKeyOperator": "959f007b2b1614208f12c2d439bf2537299f0cb79e4d42a7ee31d2e2fb3c25b7aeb3248491010f69f34b259503224d1b", -"votingAddress": "2Ny9GEwNGxbj1HdrRiMDRsVoW7EU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "085815fddd9e131c2052a53e71d83b451a4e2cd570e55138062e4a7803acdb58", -"confirmedHash": "fff6ef30237c258b64419a0c661e946f0df0fba3b21e04141500000000000000", -"service": "00000000000000000000ffff0509c111", -"pubKeyOperator": "134e8547014bc334ac7ab1ee65b9aa106f041c556182ca5833b526ce2d722740c1eb4f93944fe9ecb3ec342da9744d7c", -"votingAddress": "2C36u1Q5aX5APzjY3XkXPWCz6yJZ", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "089335652cc1395f6638a6b91f0e63622ddfee94e823988846f5e8a1c4e83bf0", -"confirmedHash": "d5871241afcdc83cd4015a9c7a5b6ebbfadc0ee86b59cdcf1500000000000000", -"service": "00000000000000000000ffffd4186b8f", -"pubKeyOperator": "07f7fe2fcae18e6e300ee6ebb74137047cd096acfec984a7342324f42bb8e68915ec9e340df1e76c36ab31269ce10058", -"votingAddress": "24hH99AfYcrrYTGV2RCd2ta4gddH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "089b06f3686d7bacbc3a30de8418bdb905d5989fbfb4cef53b0cc8051f9a454d", -"confirmedHash": "0c217b7eba047f8b3baddf11c80707d924f2cd9645f2e6020900000000000000", -"service": "00000000000000000000ffff5fd8ff4e", -"pubKeyOperator": "8a5caeac98f9fbcb4c1e15734b9fc10bdcc8a3dbbe74b636095f8b218064b05beabeea0317945346d4d5017c3086a48d", -"votingAddress": "2uSgbG3tcJ9BqW6oDCddCumgTqet", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "089da7bb2257dfd094985253a0e82829bdd28f324e2d28e660373543525e3317", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96886151", -"pubKeyOperator": "0d00607fa9258617a4212eb24155b4e63c2260b82861638485158e45f5496f749e18faa9b77e49485b53a30263a16dfd", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "08b44a599da0595020e2153abcca24867193684fa7202502f13b0d072fd6cd48", -"confirmedHash": "17a667d95355eedc5070dd64048d2e3cbede2b87ea98172a0900000000000000", -"service": "00000000000000000000ffff3625c7eb", -"pubKeyOperator": "0a5a3deedf52f0ea6775d3caceade48e4d0fbcdfc090b9696109690bd0584e6722bb9688a1d35749325998370e86c0bc", -"votingAddress": "2WX9uYWQP9GuYY1EzJ4jAka7nQCp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "08c3ab5e6d1367e74e12bfa922bb0dd1f40bf50fdac97a044705c412c6a4dc9a", -"confirmedHash": "bd26eb25b1be6fd434c12c8096f353f754441e25864a32c44000000000000000", -"service": "00000000000000000000ffff5f553773", -"pubKeyOperator": "85125394fde796f328550d89404783f072126322392d42e2e37357ad6046bdf65b384017b440d23a0380adc537bd95dd", -"votingAddress": "3rWxY8ZBgUNVtPJPYSsor9GTn6LJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "08c8a4f0ebf00eb7b37a684a33adce18404b9f9e341f5b9a198e3fed2f3afde4", -"confirmedHash": "505e056360d9ab1396959709d513f029f2403fbd1c72e0c13700000000000000", -"service": "00000000000000000000ffff05b75fbd", -"pubKeyOperator": "081e16891117d91b712545a40b3ce436a619bd4da2ad22c797df2e333a355a2b774c898e9912e408f528c9554e917d41", -"votingAddress": "4SrYU9UWsH3ipkYNUVd7yiFWfEey", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "08c8e44eabe823972bbc2c68fcc656847fdf5a7c9e34a4333699c0b72bb28636", -"confirmedHash": "e907ee0cb2c65d9e80161a49bf5961a02d1bfca0b13c7da01800000000000000", -"service": "00000000000000000000ffff55d1f19f", -"pubKeyOperator": "0e1298596b9f68dad898dbc56e6eacc4e21c1133955884dfd46d8bbffc0f541c5a48811354d7de780e01378531f988f0", -"votingAddress": "NgaQt4srcCSVWvdAyZPJvQqX7bY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "08e690fc01befeb03da3c629120f7d4195527d666f277f7eb23d5bb2574bbe27", -"confirmedHash": "99f081e28074e9ebe5b90250e69017a251b3ce74ddf3a12c0c00000000000000", -"service": "00000000000000000000ffff6c3da981", -"pubKeyOperator": "8b58e1cae888a64a6ec0f999b49a8595b6b469e13819ca7efb104005ff77cfa3bc687fd82be07dcb3debfe7dada1c935", -"votingAddress": "32wenCjG5yKfCbadXWR5TbWPKRgD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "08e7cfb6ebe16b09a55e3408a02c8026c54618d0e7d99984384493721d50c4d0", -"confirmedHash": "308fa7849ac62ca91bab3274d4a32894b5711cc093140f2e0c00000000000000", -"service": "00000000000000000000ffff8b3b9f7c", -"pubKeyOperator": "8fc484542f56114de472aff2c3423291616e9a810ec4c03fe45e03f73ad287cd729a48c974fcdd9f8c1be192c8688d8d", -"votingAddress": "2nmHAVcBFTr2hTiVKHbNfgWuV4ZX", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "08f078090b57307ccfa0a19cd262647da2fb67bc27ff0d1c30ed88f46ebe54ae", -"confirmedHash": "9ffc42b0e292a697f35cd28c295e4cf9f6fd99e0241e35f40000000000000000", -"service": "00000000000000000000ffff5fd8ff40", -"pubKeyOperator": "8919000eeb1880a2faebee67c37df14bcc296b8fa0bf2766cd78c929f082f1c6798614c38cff68a26f8b007174b3ec04", -"votingAddress": "2AY8wmsNn6y7MrZALfpb53PnNFWV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "09001418e9e3828401bfb35d08def2207cc9b61bb46e4790ea0e1fb4d8c3cc5a", -"confirmedHash": "0ed9b5e580028f69036729daef703041c88e4c4987b6d0bc0400000000000000", -"service": "00000000000000000000ffff6c3df688", -"pubKeyOperator": "9615aa59e05d93d037461b039b437f0eea85d5adb962eca38f2e9b3bd0e6742e0fa2ffc1c778621e802d4cfc556f8506", -"votingAddress": "He14rGP8zD8VdoQ4M4TZZwYvWB5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0907e26959f30841dd462e2dd84f24b3b7f6e5bb5756805e008087d0bc991d73", -"confirmedHash": "9343aa69e17683fdcb96c9cd878816c3e3e47d23afaaee941100000000000000", -"service": "00000000000000000000ffff867a28ba", -"pubKeyOperator": "8bbe3fcfc4a1d2cef01b05ab66aae131d000d0577cccd68452061ef24e143cfedcc033c2fc47d8f9a2fd60b07f0f135d", -"votingAddress": "2zjXYWpEqpFUaS2MhoNXewxXtpET", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "091cbde854a42236b1775646c77030916585e76cd135e2db5996da0b400d6145", -"confirmedHash": "6c9f3b3e067d487b20d5806b1069599928c3b7d4cce71f860600000000000000", -"service": "00000000000000000000ffff55d1f221", -"pubKeyOperator": "985eacd343723c3225239694b54aea3617db134ebea57245358bdb85fb187e32326bf3747a3410d0605a279dd7da0908", -"votingAddress": "EGfcDpJ9QjE35DgV1C6kJzHJoKT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "092b5f8107a309538bbd7c009b0c934c83c4912a9e919cdbcd2902ac7cb7aa52", -"confirmedHash": "9379b73d17a311e77b0c92019c8f796bcdeb12978c9d88550900000000000000", -"service": "00000000000000000000ffff87b53225", -"pubKeyOperator": "0140574d6dc1c0c750e5c881ea7f116ad21b3b89f95944ed0c069bca3a91d95d1e682c46a42f71fdf570ce4de853e1d3", -"votingAddress": "21iDTh4t2TVG24rUeyqVWLUw9HzC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "09378beb6885aa0a1056611ed48bad71456faeb653dc8823cde7ee105c0f909e", -"confirmedHash": "4c8d5b7d4b001b2aa5049aa29a59add6c35fb809caaff3ff1100000000000000", -"service": "00000000000000000000ffffbca64d41", -"pubKeyOperator": "1861b0db13f83ca3fc414b17861be323d56fa5adb4270908b259c78551f8cb43f60b35fe4b178f3487da08d060638ec6", -"votingAddress": "3KuADaXjZqVHKsYmMe5qovTXLVxV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "094d2130a7ba9738cc0c3ea0d761671256ed8f243f549b9c53e5b06467bb7cd5", -"confirmedHash": "3f46552e5ddce2c4549965109f0727b07f064ae5fa42fe830500000000000000", -"service": "00000000000000000000ffffbc28be21", -"pubKeyOperator": "0b1919bf6c40d6b63459a78e8e016f100003fdc9ab6f5af3aa4c0969b00afb070a43c4eeeda71f345f505ae51ff0b23a", -"votingAddress": "agd9QFLrpFpmS1uBQyedWcJSoo7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "098125b569e8f04a32ab202390c62cf8974964603d92b7958d4018a378ed1911", -"confirmedHash": "dbcb94681afab19e589abe1ba391d14b756bbaa599c6bdb60b00000000000000", -"service": "00000000000000000000ffff55d1f283", -"pubKeyOperator": "06d2d4eb28da39b36af41c22e363c0814ac7a45082881085ac83b649974f8f772c4d8a43deb4a5aa94c95deb126fd8bb", -"votingAddress": "4ZR8qHZBUksmGxcGWbK1iCRy4N9b", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "09a59ac2102ca2517b50917b94b5af03a338e7562a32da66abfba8d9768b4b83", -"confirmedHash": "a29c74fb3479bbcc74497d6602c50921f2f28889b72c7c733a00000000000000", -"service": "00000000000000000000ffff52d3195e", -"pubKeyOperator": "9132aed3d970adfefc2f560555fe99c0535c1ce2913f91047e45d6cd815cb1273208187a86ec31be6b0f8e1af62b907f", -"votingAddress": "49JumJaxQtevsG5EDLNeKmF7jjLS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "09a783ca65c63900d2b0aa847551fdf6b937090da360764c14b9ebef25bca39c", -"confirmedHash": "76030e439bd9e1ac924f7601c57dfcbcdfaa03200f51270e0100000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "5o1Qfpre1uXcVrZ4NVAtKeuFtJf", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "09c32d1340ce359d9252ee5f953a0409135f509fe25cb5c59783f505ac2d3008", -"confirmedHash": "29ced6e37b3d18639a203801e9a0cb5b4d0255de544a779b3800000000000000", -"service": "00000000000000000000ffff55d1f113", -"pubKeyOperator": "86726fb96cd80712d4b86e1365aa284922284c84c157d951b01b7ed4a596fd4c2ed37ba8c6cbcf9440457e86782967cf", -"votingAddress": "3GWdUNysPF56wL6u7XKwL5EgZuCu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "09c40d4664fa991af5c89e9d5322f7137204c55f5bb8464a1f7d9f60dd46a11f", -"confirmedHash": "65a36180e423a120c1cf202b41c2ce7727011285c9939c3d1a00000000000000", -"service": "00000000000000000000ffff9f41cfc4", -"pubKeyOperator": "824fb68c3d8268c335884368934dfef6969f79ee93bbf7d575a37812c9e5a014f02513f9e9bbae3fee5283e9363d0e38", -"votingAddress": "25bCqeJ79hUJkvmmHv77jpUwMrRg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "09cbbab8900a7f2ab24a641f3f75586b1e32ca1d1b93a9ff626df85606c026c6", -"confirmedHash": "67950de3f1acf43fae8687a9c80d93ceeff400badbc1aeea1500000000000000", -"service": "00000000000000000000ffffb90537a3", -"pubKeyOperator": "877b82c0a8ebe03131f9e45c84d7cd5d21972cef7ad87265a4b94bbf2a68e13ca03f39d0edacd594334ab51f1587f27a", -"votingAddress": "3Vv3QdHTaj3MGSWiKUf4aASi8PLd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "09d7914574ea5e9707270b21af63fcc5c1af82c86f989cacf7b9deeeb028aa02", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688e0b6", -"pubKeyOperator": "98a8d676eff6a1b8e0e19143a8547db180bc4a6385bad8f15125e28814fa04fc80a08b5573de574aac25fa70d88e5ac5", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "09f8e355c5e47cf85a4b241a203d7e16500e5da4123fe700e0c191c20e45358b", -"confirmedHash": "99bb3fe48c31dd74cfb7596a604be13575547b8feaa249fd0c00000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "4NFkDvpTVVTQF3uUE6kCFmLdBckF", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0a08639b2a1e534977d5ef9546b8ee2af4b165e65e1124f82f26fcdddbe4d1cd", -"confirmedHash": "e0dc9e6adfc37796d7d713fc85b404734448ce7353b4e2861c00000000000000", -"service": "00000000000000000000ffffbc28a30e", -"pubKeyOperator": "81d5704120f893bb967df853beb7d0efb1f68480b3aa8550aea6b97a5b40ec4fa6bf08d329c27c6ea06ddd568d05481e", -"votingAddress": "32k7nmcawiWKEfPqTwR1LJk53Xrh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0a28a7fa7cef4ebe4b7662ac47c5a75c43a56cb8d30623698fba6bfde01f2305", -"confirmedHash": "9014a378e9b2f398987f5dc0a13f43ad88d994479c0756540600000000000000", -"service": "00000000000000000000ffffbc28b980", -"pubKeyOperator": "858ecee9d4152ea6902a1c32950041fbc0463612d77477a8b05a28c4936c1f79372f9eeeffdf866bbfb3c394355bf454", -"votingAddress": "3K9SukdozPU4N11YhMrYzXdbHWdY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0a2c94206cc91a7819d2a58910e99291400f9705792870ccabf31dca87d2ff7d", -"confirmedHash": "635e82d5edc1ed8210db7e0a5fc2aeaadee08a78450750d41100000000000000", -"service": "00000000000000000000ffff3e4d9bba", -"pubKeyOperator": "11fbb3a0119175a6538794b27c224f5ca1c9a233a38162c0a318d4247163591f14c89cdc167cf417cbb0584633c7547d", -"votingAddress": "3GfteG3zM9Yc14Q5GTBLroeLWE96", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0a3473c00fd271c6695ea48cef73552b30ea380022eb7ef0eec1cea1569c4cc6", -"confirmedHash": "b1ac7cc05018b4c8a6c8529fea3ab3037b868d961adb7f932400000000000000", -"service": "00000000000000000000ffffa5e8a978", -"pubKeyOperator": "04092098a289effed7012d77de7fd8d807be3a0fadc3aca90e3904e985800e9b19f1c9123a3467b96dcbd11dd9b66c7e", -"votingAddress": "1gKvrLEYVxwJ2S6ujQn4GgGYYCu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0a460ac31b54571ea3eacd2b8a192105ab3b126337a59593f1df861970b2c1c7", -"confirmedHash": "ae43de3cb026a605377bf7ba620e86470f98ad06740c704e1400000000000000", -"service": "00000000000000000000ffffcf9aee20", -"pubKeyOperator": "11f539666e7544218b33fc866bdb1ee13d2ab8c179b2be25ef6f0005d9d59852a69d8942ba67a76dae78827f18912941", -"votingAddress": "2UPt4HJGKVGjuei4oi8cKfHrLuQT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0a4d204ec9ff523c0e48459bae41f1f35634a4b451983a095b20e30b3074565c", -"confirmedHash": "fe73472c7776ba0335f76108760d4f0ad5f695b290ed771f2a00000000000000", -"service": "00000000000000000000ffffa877500a", -"pubKeyOperator": "848407f696713c7e4ed6453ab04eeec7c00a34fae01a6cdd76444acd3a3039698aa9a282cf2879a9aea0018599afd44d", -"votingAddress": "wPUkJbq1yXdLAMbRqjmi6W3ALSD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0a5cc31fbe46c7bb1c5476059768ea3fb23b938f9337f65c041e461ffe0f32b0", -"confirmedHash": "e29d54b844b63bd5238c1312a26421120880ce7ac718a1040200000000000000", -"service": "00000000000000000000ffffb009d203", -"pubKeyOperator": "1471b214f594a26e2b17785b17c1b275990d3ffc14db46a4c1149ed7d7f77bdfaee1334ea86dc6de4c97ddde5959d7e8", -"votingAddress": "43k9EooJd3EjBtby9Muoc9R1romG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0a601149236fdc7b80c96b64820ce397bf601b1280d2a9030224d5bd3ae941d7", -"confirmedHash": "bfe5e427916b840a6a4af564bbdbecbfa67d8fcddee5f5711600000000000000", -"service": "00000000000000000000ffff8ac58364", -"pubKeyOperator": "0739a591b180aa8ee786eb945ddb4b5d738f62402c4c41214b2b8b545297ae4d661299dad524d6bfb3e43b7d2fff412d", -"votingAddress": "38rKAG1u28UBxdYwH98Lh6mYByQ5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0a7e0908d31878cd61969f51688189d16d9236d3803c795c55e4c4d56d15fa32", -"confirmedHash": "8e3b15fdffcb6c2117bd4ca4868f17ed344cf428c29c24b51000000000000000", -"service": "00000000000000000000ffff9ef7cdc9", -"pubKeyOperator": "82b5d30b7898b2bf9c3e21fb3ed6360a3fdf201ee9d73bd808ca46d23d7f97f13cacc43a867669408f4e57ba75fdff91", -"votingAddress": "kEQbYS6mYULJi3ShFZwj3Jd92kH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0a8a387d0bb4631ae8213e9cf2c8c612654a1552942d8a475619b05ae85ce46f", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688b578", -"pubKeyOperator": "058d71cd7291de5776e4b8494ebe8e05210d4b27b27b42789e7b171883c813d52e9076a0c451fe40495d4b53b9ff7012", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0aa747290678c0d3870103e6af6ac374aad9e9bfb7db8a293082013d3205dc2f", -"confirmedHash": "f8f6aa34b0c1a353a33fb563c32644a660b2096bf80fe1220900000000000000", -"service": "00000000000000000000ffff2e04a277", -"pubKeyOperator": "859c0cc88a932df47185c330daca3ac904f8a19821a2301a747636fe5719bb6f1f7c0f9542ecc5a1b8948cce970a01a7", -"votingAddress": "iLUUe5KMEq9GSvz9VCXwqxToUMe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0aca87dbc523171d48efaee53bdbf5e21990b084a4f190a37dd36868b2f4521a", -"confirmedHash": "342a09b33d14a2714438896434f9c34aa033641002d9f9610900000000000000", -"service": "00000000000000000000ffff8b3b90a9", -"pubKeyOperator": "05e9f4bfb9205bc92bfe74019f685762ea5be1b61837535e95fe3fe2bb596ecfcb87309b0909bcd4c661e07d7bf73440", -"votingAddress": "29kEVaMpPtv6XTrYgPwKM19JrcVg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0ad5e86d150a06dd3131a81da86c98f28f2182ff075685a482503ea6cb3d26d4", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688b066", -"pubKeyOperator": "8ea96cbebf2a15c75de32bab12552a878ff84b8280bdd89dad5a52c56f3f03e99df5dd05e2661b8715842ec05263945a", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0ae259224a6366150671d7234d1e3d25caf3899b94b64ba713e5966dd779f204", -"confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", -"service": "00000000000000000000ffff9f452eca", -"pubKeyOperator": "922ac77d7736a3d6c87f16312bcdb541e135dc8808d7bd0ce13ef272e619483501b223505ea3033efbe6f447e31ecbd7", -"votingAddress": "3z1ZLeEoryDFhjJUmJS6CVJNgD9m", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0ae2c6ebc3303b45b4bea24fc846d7df29cba00b8c2f363fd223598701d2b98b", -"confirmedHash": "d7e4e3a543881de246bccb327d2398f98449fb22505c13da0f00000000000000", -"service": "00000000000000000000ffffb280dff1", -"pubKeyOperator": "9362cc23d7b0eeb9269476fe525995f1b9a4dad8483979475ba800a6adbb1237cfee8015aaa9f63044b1591e075a04ff", -"votingAddress": "4U7YF4bJiiRrwZRM5eSdHh6CjXoF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0aeffdaf00901e28c69cdac7c25b46926b66be9e1e78e151c443c7308a63afc0", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688ec40", -"pubKeyOperator": "8d2458c7119ef957201d5c002ccaac39449c3013549df89b637e913bc423a3562b0c30e32ba02d688441e816bb1c65c9", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0af4666a3e5c993088a8b95877df6c6295c59c16ae4d3cb64040bf7f0ece4b94", -"confirmedHash": "751371617b1aa839cac0a5d9058049a56ad51b00f759b36d0700000000000000", -"service": "00000000000000000000ffff52d31920", -"pubKeyOperator": "831c6466f7e0ad472bd63e53f93319e3adffa4b532616cad710a3f0d2ae887de19eb9ba79660de3b2127452640a6e8ea", -"votingAddress": "2DZFkyFMJo7iLRjeqhiTbXeYrHQj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0aff198e5116faf0925f294267ef0c5d998052a795cec81f8ad6d58bd4f8d96d", -"confirmedHash": "ab4a5610c7d928235460834c9a89f609605c5420c488a6fb0100000000000000", -"service": "00000000000000000000ffffb23f7983", -"pubKeyOperator": "9922820ca2bd0c8e3bc31c9250e4f7e3e36281ecab55ed5a9d9970fb61a7cc6bcf858a9b6e2a54071a36ec0a067296aa", -"votingAddress": "2jRAErVr2QDx92H6VbPiQo5dCnNY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0affb2fc3c9d7dab512629535fc1c6f5a1827472802b3c6afc84d33d777147d4", -"confirmedHash": "62cada33ada87aaadfc09250fdc8a35a1af2e53291d92fa40e00000000000000", -"service": "00000000000000000000ffff55d1f19e", -"pubKeyOperator": "97f0ad66870855f38f26abeefd92577f6ec2050d40a93f715ad9f4c0bbd25551aef37b96e2811a679665f64062020a47", -"votingAddress": "E4pEthG1uPRP4hzqZcr3fEYL3Kt", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0b1a26f470ac553f9ae28bc4b175623d1d8dd44c52e0e6a4fe50745914607969", -"confirmedHash": "58cd7037925233266e3829872e1b0f5dbc07207c9910e7d60e00000000000000", -"service": "00000000000000000000ffffc0b85a59", -"pubKeyOperator": "9441048591ec12d10ac463fb86f9778f79365d06058471ef8239cd20282b754b3f4be8c594dc7341c07a72bed6841a3e", -"votingAddress": "3Zf7AmWzY33he7bak9cdTq4DUUJQ", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0b4ad6d89dc0bcb898bdefca00964ff379c6bcefc9e528d38d0584695798c713", -"confirmedHash": "730d55b8b60cc639a4ada872e30036698821c18fee5817be1700000000000000", -"service": "00000000000000000000ffff9fcb00bf", -"pubKeyOperator": "069c5f62dab2aace00b082c833a6c22bf3a645af28924c4ebf3694de7bf0c1117e673514b918d5778356b2498a2ada9d", -"votingAddress": "42JB6QLnjCCQFZBhSWpXMuyeysCa", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "0b4ca0cc6dec6f77146e9cfddcc04960967010e92f55a97593e4eae6c6020b8a", -"confirmedHash": "a0c5fc8359622587ee670c2f4ee673fb44aff2950ac5bb811800000000000000", -"service": "00000000000000000000ffff55d1f260", -"pubKeyOperator": "90083414abbc414ecd6f269999720dda713a9ca8276e2fa6d8d1be226481272be2fbb681831f46a98c9db981771a3e1a", -"votingAddress": "44HPHkR9feGUrMsNAVDCBGYerXEy", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0b54ebb6efb670592b0fd59c504f62622f5931d436380066e43d1783a02ef138", -"confirmedHash": "a00a795b305289dbfeeb8c945c0d7e7feb84270b1865a5570a00000000000000", -"service": "00000000000000000000ffff55d1f1e8", -"pubKeyOperator": "8b8446b832411f2f530c8af1b5fa5110be48e796893415ad5e874ea562b1fa88c380c6656f0781b39590827955ff8911", -"votingAddress": "3fMJ1g9kZ712nZEb9f9jTe2SAaRZ", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0b5661cb5a499700a2db23b9fd9acba6d41bd669055311387fed091e9a701421", -"confirmedHash": "9626334594574a834f3d724ce9e291cd4f8d6f3e96d217081000000000000000", -"service": "00000000000000000000ffffc28759ee", -"pubKeyOperator": "966b6fe2cc2bc7d497150c85376d6df0077bc789c692c4bf4cb82f6c92d4a148ff263713eeba0e8a78fb6cbd5f54b85e", -"votingAddress": "2knyJnwRpAXz1QYTFGqPZQk6LN1V", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0b57fee5142712229d67eeea649b4a814497b4a7cb0d4d44da71dd38e23f661a", -"confirmedHash": "3ab4bd33c5eca1db58f7ff7e6306e4e220a1d293c809e8f51600000000000000", -"service": "00000000000000000000ffff68eeb0a6", -"pubKeyOperator": "8e3228798ca85d0dc88046b93ad6fb8d15565428d79bc550b83fd9aec0c1dd869d502e56dca65bb06a06118e1c83aecd", -"votingAddress": "4UKrAqzzV7tPeTypZsiCgqnqhgQA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0b607dd6d8193f498d1b9f440f7ecb38828affc0a7eb0fd50614f0186bf6fd4c", -"confirmedHash": "d08e629e93616e373ee7e1fa30725c6617dc3c6caa7287200700000000000000", -"service": "00000000000000000000ffff5fd8ff4d", -"pubKeyOperator": "016df3e0cd6196def78d6a524acb4350cae9496ed0ec9aa119c24dc1c5d6d2cfbc223c7fe51316895370650b4f8b98a7", -"votingAddress": "2RLRECv7z3An7rdwrdKr4pmHsNAJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0b6dac40b15761aaee64c196668a0a6fd37f84519bb9b2e5b8a721f7c4d8bf15", -"confirmedHash": "50a4c2e17790cf4b393eb396ba5c55c7f68d3b5a527d3f590f00000000000000", -"service": "00000000000000000000ffff52d319a6", -"pubKeyOperator": "0bbd97acdd5fe47f71f05b14fa9d885db5095b02f20edf4212eaf69efbd31aaa957c272501dd328293fc892b685fb571", -"votingAddress": "mbHR2vhGFnsi9y9Uh2XMToN4q1q", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0b761ac2f42dd3996ffbfc4166d64eaa3359cce57422e459f1856d2471838972", -"confirmedHash": "2e410595c9cec9c3a95116447b663b01749c9a921009f6050900000000000000", -"service": "00000000000000000000ffff9b8acea3", -"pubKeyOperator": "02d5291cec3c3acfce9bdcb513c5caeb6a6951f05a045de8af7f6d1ac85aba525471804ca5a170dfe98599883123eb5e", -"votingAddress": "3cmNLXhQ2adgw7gEjpKaAsJAkmW", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0b85b6029b1a545c14774c4b77b73b929a6503d1c7041e2fc54ece16e983282f", -"confirmedHash": "a0e53065fb0ad7f34a800e6f762e9ed22fda7ebf12ea3e360900000000000000", -"service": "00000000000000000000ffffa2f33be6", -"pubKeyOperator": "8320ea89f6698d5b6bd988cc8d36d36622bd1b697f412f21dc41d2d319115aa2f56ff1f6c1f1a052b5935664511bd0e4", -"votingAddress": "GLaPMqQVyFWWkTpUZeqJHoP4Q5n", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0b913bc4feb7a870f82bc0deda7afed659522b77687622753ab629bea46ffe7c", -"confirmedHash": "d49518a7249e79a3d7579087117a16708dc1c898e980b4082800000000000000", -"service": "00000000000000000000ffff92b9b428", -"pubKeyOperator": "8fae5c02eb0c39c4c401608b3986d0c10e82ec7aa9eec319f50dad9c2a3826b90e71da7983838c13e3d35d24f774e5be", -"votingAddress": "2rBqQe9bkEHU92mfWraJZ7TCxAqb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0b94a8feeaa0e480811ceebe97d606d9a54caaa27947a0ce6e1dd372d99868dd", -"confirmedHash": "1739ba773f37f199a5b11dcd31a61c69012f6814ea6a72c01600000000000000", -"service": "00000000000000000000ffffb07b39cc", -"pubKeyOperator": "97a6e789aab752baed572daeb9b86e3f0a8e3275f6b1e6e818e3ab7a7765e0056c5707301d906f26038f1f2523fc63d9", -"votingAddress": "3f9cNe6vkXib2QEx2FJcvgZhA2iB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0b9ddd8d6c9a844ae9e1f7cc17dfa2f9ef3ec9dca07c95fd97a111d0f23611cd", -"confirmedHash": "051b53482c37c7a2c952b7643015e51f96dd4df42d4afcb50600000000000000", -"service": "00000000000000000000ffff6dcdb481", -"pubKeyOperator": "0f2a121e37f4e514aaf6db8c81c9a9ed4fe233b45fda842aced60d806de00cbb9d818a4869dd319f5e86b29c724ff405", -"votingAddress": "4SQ81mRHNx4cjowajPHvrgVJe8pU", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0b9fc375cfbdc6cf076e5e9a4652adb7b33ced132259dbb1378882bd23efeb34", -"confirmedHash": "b7de66377ac2e6b87d77c94d6af5874ceb5fd823caba70131400000000000000", -"service": "00000000000000000000ffff2e04d9f3", -"pubKeyOperator": "0fa4c0334aeeda3cf366e0305f6c8c44ce3ccc1a88182b6ad712f8659efee6011da77369b5c4f8e8cb82624ca572d1db", -"votingAddress": "sMKChf6XV1oaiKBA8yvWikHyvfc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0ba0d5e7ab29879d55395242a1c62317c0590c7e987ef5dcd84fd9451eab766d", -"confirmedHash": "0e16f2827da5d9d0a494e4c4c828e3a9a34f23b8eef552dc0100000000000000", -"service": "00000000000000000000ffff55d1f233", -"pubKeyOperator": "8376522e774720779dc375cc1026ef8b17e24399eeb27ec5c0f644189c419bbcf91ea5142fbe176882c451184f7f081a", -"votingAddress": "2fgn1tRsdYxLxj7ZPPqaWwQTbrkL", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0ba81865a8c55a3f6e3acc212cf0e1435b9cceff056e3cbdb5b480df4869c0da", -"confirmedHash": "45aee12dfc011937a96163ece045e9183243700ded54be610400000000000000", -"service": "00000000000000000000ffff8bb4d459", -"pubKeyOperator": "0aeff4606a736a0fe438c61b0c5cbcbd6728738f6fe8a36751a2bb43c936ececdf5daec86d043b1aa25ac577b48cd9b3", -"votingAddress": "2KVig5ha4Xu1pGAm7GQ9CtCzxN1w", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0bab3d23e4d6e99bee1ba298e4e23705be016b42d04c82f44423547b39f3cfbb", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688b185", -"pubKeyOperator": "14f553b2a430d226fbd9fa0767f9f97080e1690b7d947e114f23eee03d59e5b293ba5c484758fd40d4fb43e615cb3c25", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0bac0343a3cb8e70dd9b039b29e88a2e131a0ec95e1bbb90453fb8212ccc0fd1", -"confirmedHash": "97fa3bf9eeae1f90cb53e7f8f7c5eb3d3321a1b53974049b1f00000000000000", -"service": "00000000000000000000ffff52d31545", -"pubKeyOperator": "921958278157241233fe7e816d06c4bba25583a108507c691d3ee45e3a7231a5606c31161c1c32614f74deff608690d9", -"votingAddress": "3eKcfiwfuFsKkQ6qn4YRyFzZoNwn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0bc533850d908fe0c6c5e97f932290ed7ac0c2e7552f6c3804d105d89f466935", -"confirmedHash": "451e4884efea2829f151c7fcc6b3617c4ad7eed462bf50292600000000000000", -"service": "00000000000000000000ffff5762f675", -"pubKeyOperator": "8b1595e880dd49339dcdbbd32db7b47b78999f9d08043499ff4460d7f644c0f4a2b058bf2f6024e7f0e9d83790d72f8f", -"votingAddress": "3rk2Qhy2i1RaUTswnLFBdeWz25J7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0bc536468656979c66bdb8784b1c3b37f59aaac1bea236b6e56f84820fd4a831", -"confirmedHash": "7dd29cfea495586063cf4e1b16ac509620a2055cf3ce62193700000000000000", -"service": "00000000000000000000ffff2e1ebdc8", -"pubKeyOperator": "0a57e187de4e7193a111e3b69c6d972ea882e9c3517b47fc06637d5af9be0ee10fae7b62e2eac9553dafd82b3aee011d", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0bcc411f324f4d4a39da9f3468e708d16678380a8e876a257897c123f31386f1", -"confirmedHash": "2b246d4ca41abfa41b63d68b13afbd786cf6bc1e2c48c85c0300000000000000", -"service": "00000000000000000000ffffbc28b983", -"pubKeyOperator": "934dccdaec10c23dbb5e2e42de4c78ee3e1d7b2628e686ab79c6fe693c4fdaa81f85302c01c4d579f2255277da284a35", -"votingAddress": "3sn2Fy9ebqsyRJrCuSTm39TueS5r", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0bd490e50c0d4e9362ddd138290edd0de34d2be34c18b4e89bd468474ed8cee6", -"confirmedHash": "f958c5510aa21abf608ad2fd5da8fb48f79b424951cc1ded0800000000000000", -"service": "00000000000000000000ffff5fd985aa", -"pubKeyOperator": "80953f9f4970e0d93d871a4e81b1848d1f4774624092ea1aedd22f91517bf14031257e2dbd66ee6d022b587baa21b52b", -"votingAddress": "hmF3CZZvyTLVVP79czy9RYxeVEa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0bd78dd52a0c09554229eeb6e13f1739d0db75b785446f8646f89c3f7753bbee", -"confirmedHash": "d4899dab6b06800a378b7c92893fcbfc26fd28db51cd05b01c00000000000000", -"service": "00000000000000000000ffff3359b3ac", -"pubKeyOperator": "14868d4f9ac7d957e68ba076627936b963368f28163addabc4eb893b76f1f1c11c3353e1614842b47e9e1631830a504a", -"votingAddress": "qnHzZm2HzYFJ1L2JbfoSxR4vGxb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0bddae6751bb3d536e89703d9a69a83567cf92eab9747bde18d539ac48e56200", -"confirmedHash": "d3d69e248c0c90abc2c61fac2e138de05a1128636109539c1400000000000000", -"service": "00000000000000000000ffffbc28b245", -"pubKeyOperator": "8e053cea8b28b4e904909e0c2d2e07c33855c518f0b7deb640d25f0b8b71d9401176eb4b72eaaff6c34761c699c8f291", -"votingAddress": "28aUDc52doWzVdUKJz6SGoHxtN6G", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0be62356fa0d42a2e04177d902427c30c9518ddd1baef4ae9dccf2f4bbac3ac9", -"confirmedHash": "37c0bf7ffd834976daffbe9e89188afe0631f0d0b150a00c1c00000000000000", -"service": "00000000000000000000ffff80c769df", -"pubKeyOperator": "1515dc7241e05a5a06a43175b73e823c54258bbec5675eef08ed5b244137d2d17e079fe17a29f9e704e039274976dbd0", -"votingAddress": "4JF6E8V9AENSpsuTVXhrPYQpwG4E", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "0bee5c1eb36e26a9cda5ffeb1140aa97c17ff8b8f6c2b10e4471cc36663ca9f4", -"confirmedHash": "9844dd2b49b1acc3d74eb5efad4b046e4bdcbac67f95422d0200000000000000", -"service": "00000000000000000000ffffbc28e717", -"pubKeyOperator": "8ccf792016ce52a83c5df329645358da511e1ba3630fb5d54083c97902032f2b353b4ea3bc0583ef6d59f7c32125e9d2", -"votingAddress": "46L276cdRqYZcoCAUgHagUiCDjDS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0bf9f1848d77bd95e098889182e5994ae88a862e3cd8f4bd41c153fb82f79163", -"confirmedHash": "f6275110d2c705b666201d9c400a57d34895dc2df584c4170500000000000000", -"service": "00000000000000000000ffff2e04d9e5", -"pubKeyOperator": "167e40d53092c459223f2f4eb3c68ad9ee8452a61ab303ac35e071c331bee8656128538caa3be34c8f23d271984f7d4d", -"votingAddress": "4Q1B4N6CyLJiXup9yG7kkNNQNdQr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0c0fd6478c7af5942c7422c762b7f20a92cffbcd2513ca165f6846709aad3cd8", -"confirmedHash": "ac6aca4233c5049175915e5d9aa355293e71d127f6826c9b0f00000000000000", -"service": "00000000000000000000ffffc2875bc4", -"pubKeyOperator": "18c0956ff452a873b46e7280bebf3a0d7025e554bcc4691abda16296d2fcf74af6a83c509f3cd844fd6b4149f914ced4", -"votingAddress": "26DyA3bJdwWY6RsML6iQV8zquKLf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0c128021f3783eb30daddb55bddbffc9984e334cd89b4cf98adb331959b2a830", -"confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", -"service": "00000000000000000000ffff2d20c045", -"pubKeyOperator": "8aeeb80e6e4a1a076fa340f4470e02f0df44f28d59c1ae42684dee368735713cfc660461dc00cf0b4cef9239712e73c6", -"votingAddress": "2fMh94BwshYYDd7iVN68M3oUr9aA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0c2082ce2b357df4ef2eab9f03b424ba6ad3d941f54c05e2eedb2316a0112c49", -"confirmedHash": "50c086eb87b5ee45c3268119a698348b93487956525cf41e0400000000000000", -"service": "00000000000000000000ffff8ac5854e", -"pubKeyOperator": "0ab0af44c72b0d62d62adb18bd4c7d23205b26b1a2ce525354f70ac07b28e0c1768765d853a48a51be10ee6099f1aea2", -"votingAddress": "2QuHguW8TAH5moKrRfkxBrGUHe4E", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "0c2679ddf6978a22d4591900eb8e2d9a64185b933750ec2eacd9d234c5c23700", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0a4", -"pubKeyOperator": "8a92796edb52333dd8d5fa739d549404dbbb8e6befee983802855516544785c2ebc481bbbfd657e605f45acc6b9c2ff0", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0c56e0cda79ab0094c357d770f769a472742d0485d1dd76d6d8dfac11c8eb346", -"confirmedHash": "aa02064b08b769543561db6f878b4c803afead5cc23b5e030500000000000000", -"service": "00000000000000000000ffff68f82e5d", -"pubKeyOperator": "93522ca61f9e798f88882916f8b1b99da01265a7a1d799ceb471cb9b4f9c4a30dfb34b4bee045ec0b7b7c9635d11fca7", -"votingAddress": "v3D8VBySJDhSSrdhiPKKbm9ACNz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0c571578443bb27eb1aaa51d6a9998bd62bcdfa3eac47d0552448d1649b8eccf", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0cf", -"pubKeyOperator": "96e9e5444c3c7b894ab6d4ed893c9c92ccacad63c4ea8dc784908b7a23ab14d1b45b2fd2e638946da2d7efc29c4ba26e", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0c677fc7879b958dc7fd442d88c3189570c820b6055dd2f524c890a0af656125", -"confirmedHash": "d3fafeecdf80c4776d95fbedd6177ec482e7224a93db9d934100000000000000", -"service": "00000000000000000000ffff55d1f1c3", -"pubKeyOperator": "001cd0af904558e7267b5e9fda1715e6b225ee6d3c677181034f50f28f8a794edbeaaf5a8285efb70269ea95c7521ac2", -"votingAddress": "vTyK9coZzQDDyPbi9u915Cs1XEt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0c687d8a0c4a95b794c72e5de2966a12b1e32642d9100f2be49d7bcff1dbc7d8", -"confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", -"service": "00000000000000000000ffff3e4d9c7d", -"pubKeyOperator": "96aebb8bec5132abd02ad09f09fa781aba64f15e27385f042328720f0b97372ead509611eeeb0339116551f2f661e53f", -"votingAddress": "rEa6bqe9ERsXVrC8qcqvhB4n8PK", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0c878ad4159e417a8922dff8782fe03f8aaa3ff57260b31d9683abd528b9209f", -"confirmedHash": "971d111019ef62e92dc6d90ba95deaff44586f1965e5877c0f00000000000000", -"service": "00000000000000000000ffff5fd88d92", -"pubKeyOperator": "9102cf7f539b2412a0e1079a291098f224c1237881635a51354f999d8c4d268e214bbaeb9d5290dc05f2c9638af42496", -"votingAddress": "2fLueG3hH9A46LA6cyBWQvhQFDNm", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0c92d33d6f0671ffac18887dde689850673c9680f8b899edb7449a1d55f1be08", -"confirmedHash": "1b524c336c98c3672741abf52d9e5b4197a6db9a218d78db0400000000000000", -"service": "00000000000000000000ffff52d319a5", -"pubKeyOperator": "87533414b8dd916a726cd11ef2b2c3f5be32882991908f917f354ec5ed39eba2101e5552011fde5a41a0dc59feb9552e", -"votingAddress": "9Wxek9kJXMe4NW5MGYzULJxU4fH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0cb4728cfc76ecb59472b138d2453ceef4763a4ec343af06aa4ac0a9ac7de259", -"confirmedHash": "b3bd0f4d91647bd069ffed7f23e3e8f1bc0ad53451fb35c90d00000000000000", -"service": "00000000000000000000ffff3652d427", -"pubKeyOperator": "1304e0ba600854e47bcba269c8d35a5115c4e2569c72d3e1df64a0ee92f22c0efde55a75a73e2a3a1510389bd62b2234", -"votingAddress": "p4D4VFz9tf6UYRhTLHmV6KZim2K", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0cbe31af6d534473394cab067dcf1f6da6eac4ada0a0f9c3b938e990e846b81b", -"confirmedHash": "b9d70d4631d6fca8deceeae206b4071be4a35f8a231d26bd3d00000000000000", -"service": "00000000000000000000ffff5eb0ef9e", -"pubKeyOperator": "06dfca6812726aff821fe27eabe48051ed218a0f43948a902c97a348bc44473f3e347d1390ceb65b7ec4b2d4e7f90b25", -"votingAddress": "3ajBwRT7Sz6wVfgpU2ixPsGcAPsM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0cc1eafe2e31fbcb2a37af0850dcf10eea62a8cde0a03a8a2deed1a190cd9838", -"confirmedHash": "6f29f54edc221e2d49e9fea2f2972ea898a7e859860223101200000000000000", -"service": "00000000000000000000ffff86d1c554", -"pubKeyOperator": "9638f67ff2a81f60c2d600cc5a7c84c3ecf4472a7a91604dfc4f9e7cf86d04f0d074ef4bd6cfdc7e71138d94ddf35d91", -"votingAddress": "3BVuH47RcR2brkJGMwJt1VGt8Tq3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0cc792351f306329b5155ce20999ab3a2b60990322a53b41c0d4a6b1537234f9", -"confirmedHash": "2628966384eee5c586f9d1a03f9cd065fbf90b01ad2d14450e00000000000000", -"service": "00000000000000000000ffffc0f8a9b6", -"pubKeyOperator": "82882c567dab1c608a4473d4f4a0a05abcb38720879ea956b3a9e1264913a860807f77c1f9addfe755f66131baa6c28e", -"votingAddress": "3s85E8ioVAjcRMQE9XDcgu3X98pv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0ce250b22ec3d30aac444e331fef568b5dd15db7cffbe117c2bf3bd88d2d6256", -"confirmedHash": "997a923fb08d9be700b58a3b6c2ee40d92e874a7bfa5b82a2000000000000000", -"service": "00000000000000000000ffffbc28cd10", -"pubKeyOperator": "99f201f1669edec75bb254ab7cd0fb84c1a2dc28d0c3ded1fbfa3a2d5e4a235d04189037b38b88190003c3b00ba8d160", -"votingAddress": "WiPf5hZ6kNdgtJC4bDb4RdEQSiE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0cfcf2d31fcd00f0c4f916d1c15037f14964ec9f00f4ebafeb63bf6bd6faf33f", -"confirmedHash": "f50a3d1017b4c38182daa544d8681fc33f9872208b1995213e00000000000000", -"service": "00000000000000000000ffff17146649", -"pubKeyOperator": "0f8bb5a7c138b70f69c96fec54ebe8101314434a1c3ede53f61739564bd5cf4accc2ac64f66f33cd1cc77470dc99f16c", -"votingAddress": "XN6zJ3EukMfnj16F42UoQ1HptGd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0d07a171d03eef04b783a8ba62e09372d117b9d1d73707e00c04e3f8091fc8b0", -"confirmedHash": "25e4ab2f5fa91d0aad78b08fe547642a6f862d16278651760100000000000000", -"service": "00000000000000000000ffff258b0f6f", -"pubKeyOperator": "87573c0c8259372234516d3082254d8d77647f282f6163bc2b803c6eda945d4dbbcc224f6df1302d8ebb2580aafb08ce", -"votingAddress": "42UmRZesANH7unHmCRMxXeU5E7kQ", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "0d15072419023012ad65e6ef5d51264a01f4c6af64486d1c71a631ca0302bf6b", -"confirmedHash": "52745b86c8db85aeacf4d338781f19f31a723b3d24f6a80d0a00000000000000", -"service": "00000000000000000000ffff22e8d660", -"pubKeyOperator": "0fc27152a0777d2c578654c8bb0e4550f3f17ca0e1eea363a4bb36b87864e390b6a7501ae6778af28d7fd4815125fb10", -"votingAddress": "2G6kEornFaHEwFFrGcgX3wHYJYgv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0d306c758533e50264561f3b76f2f683a95772572257aa69e96a75eeae9d40d6", -"confirmedHash": "aec964de277a8c626aa187d3588320bf0c8f7fbc9c421b780c00000000000000", -"service": "00000000000000000000ffffbc28b6cb", -"pubKeyOperator": "06cf0339aa9ebda590f609c7b18e2ee9889294badbf15b717560c212509e7220d775150ed8dd3adccf153d1240e74ea7", -"votingAddress": "2RKtEUSfD2yEwjy9MUReL3aUU725", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0d8c1014469ab7c0008012e82054520da9c71e9748eeb059dd38279d9a50032c", -"confirmedHash": "1739ba773f37f199a5b11dcd31a61c69012f6814ea6a72c01600000000000000", -"service": "00000000000000000000ffffb07b39c9", -"pubKeyOperator": "0db290f1b2d6630dc5c2e2e3f37a6972ab7255dd78dbbb665a8e01cd0c79a02f00ddaac85020a09761bfe4043e3621f8", -"votingAddress": "2xnbmSeNVa4qSMuV2JTz8oR1qzDs", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0dadad58151744dddefcfc0cb415438c1cb41ce168355e1a35c2c92f21ce12f4", -"confirmedHash": "47247948e618e1b287d9faa53f2b8342a5ac6b656e94d9600500000000000000", -"service": "00000000000000000000ffffbc28be28", -"pubKeyOperator": "80c21ba0f529945ea70b80a450777bd3ca3c71221e7cdafbf6336b3b4488f29c04f53cd5782ac83788e8732e948f06c4", -"votingAddress": "oA2rB8bCJwJ8LoNgY923yxkHE4G", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0dbecb4459113baa1b9971f7058abb70596d9ba384dff161c8b70bc2b4111dcd", -"confirmedHash": "d04a1be7c69eec88a22c4458a72abc903eaeced72523a83b1e00000000000000", -"service": "00000000000000000000ffff867a6edc", -"pubKeyOperator": "0079209cbcf3d3b198263250078c15ad7e6a95bbd90b0c0e31d49e8e1aaa2fb0afab9ce6e92a83e6de31bfe98f15f7bf", -"votingAddress": "yvKdU9zJwqhsRYjABL36ZJqwmQJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0dc2eff7fec7c4a9dc3efe6883b2b2396bfcf239be0884dfba4567da5f14ade7", -"confirmedHash": "c4c8e7b830297e839c2d3cf83eb3e4a67b6b5db15e0058910f00000000000000", -"service": "00000000000000000000ffffb23eee50", -"pubKeyOperator": "07fa1f8cf2fcc7e688706003fe0287efcd3ff0806243ee9858974f8872985a041ac23117d345aac747c58e89a4aca219", -"votingAddress": "2kZyB6LY2aMxBV2EM2WJErh3vcdq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0dd54e93b54fdedc57a6a5befa278ff1239fc4783fcc218a40e3fa1e490a1bb0", -"confirmedHash": "e1684286bfad667c1880bccf36a93a1570c93a14402723921e00000000000000", -"service": "00000000000000000000ffffb07b39c2", -"pubKeyOperator": "04a5ff46aaf9a699d25ff3e76ba77fffd8bbef57edc5e4f92683c1185cd739e1ebe4d87b25789f5c8300ee91031e235c", -"votingAddress": "3i7xBQWq6cTnVAnuRZsJHexg8jAs", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0dd5b6471bf65757b6a86ebde9a0d372d871e1bc419b82f8e2f39615751ec165", -"confirmedHash": "91f453790a4b844650e410d4bf0ab9d8791499f40a6aa1800c00000000000000", -"service": "00000000000000000000ffffc2875baf", -"pubKeyOperator": "026184d68ce55a58f815c8c4ca7696a26773e0494fa0e79326eded8f9abe713e71fe5cd32ed2b2cb9782547adb9ec844", -"votingAddress": "3TiqytAKkyndedn9YMfanCg4wtWx", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0ddb9f078a34ecf7e801538b8e80309c48cc1ef7c528c5c461f2effceca53717", -"confirmedHash": "4eb4f58132a52da7cde38ecf8524e97bb1d7b783ff5991870e00000000000000", -"service": "00000000000000000000ffff17a3002d", -"pubKeyOperator": "81e54db3f12baf6018ed8252548bf6e775ef0cc5ad5ab937969fb5191e80aec2cc4bc5fcc965f8a20e5084f89bb37471", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0dddc645d101d00b195c8c06a471042ce1416f79eb261ac9b20d3b6b2afc07ce", -"confirmedHash": "71fe8f8b531155a6451d0923de0bbd0db85bdd31ef9900e10800000000000000", -"service": "00000000000000000000ffff58630b02", -"pubKeyOperator": "0fc3b77c30f2316538d4d8f876592e03b15b424929a1d4b0044102d9861120b28c329ad2a80d0bea62cb0ecbed14f99e", -"votingAddress": "2CMjHVpmNH6WMeoYH3m8PYivpQmJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0df96434de71859a5a4a12f891e159a5cf8aa9684369a1d10b788702b0bd0bd3", -"confirmedHash": "ca9157e92756c6d39972ca24d6bf5939b97c30ec1b242ca70100000000000000", -"service": "00000000000000000000ffff50d1ec4c", -"pubKeyOperator": "022a15f6c1f3af9376cadbf2e99684de157ddcdd0966fac9fddb9772867213b867994bdcb55c8ea30e41b19c385f9fe4", -"votingAddress": "ddoyCk5sj2kBBwTEHBzVaG6KTJF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0e1d925207de291b0e36cc0e74c22a16065ac440762514954a698540aa55d472", -"confirmedHash": "5415871f1877b3e6d01a2711c7df33eee83f032a87f143df1c00000000000000", -"service": "00000000000000000000ffffcebd27ab", -"pubKeyOperator": "846ae84d53cb3b7b7cd73b2c7bc2f198669e6c075bdd4955c310eeb7148fe93ad953a8f15c1bbad65281142db1387aa3", -"votingAddress": "3aRLK3FvrUkKvck2v2RKRCjPb3pa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0e22287f984866f9840ac7ee73ca9621a1e58bc2715467c7d86d3dec13b49b5b", -"confirmedHash": "d9d8b021c1082a1f76c7ed3950dffdcd7e3a4b13020320ef0200000000000000", -"service": "00000000000000000000ffff23ae3d7f", -"pubKeyOperator": "8d0b146d056b8682e1142ddaa2923c6844a8128c4ed359845632c062ebf311d8b429c5aedf3472252cfe41b1b9c08537", -"votingAddress": "4LJSgdfsBLQHBsFj9cPBBdWuXv4e", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0e308cf762e1a2bce89db89e5db6e0874f99c99f3bac401a1431bf1fb87df8d3", -"confirmedHash": "632279adbc15df9709d63621a90c2d4032548fb951776be21b00000000000000", -"service": "00000000000000000000ffffa51647fa", -"pubKeyOperator": "0926540a9b2e5968c118152d099775d840f441930d9bc11eb6f21af78989ac34c51267bdc4dcdb7106cf8ce2e1380de3", -"votingAddress": "4JbJz7vvvv6xfZJcTG1e1tX1GpJC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0e3b2eca7010d0c9068855179454a3f46f992e759f632a0be79fb625aea0a758", -"confirmedHash": "2df46462f970c7e4aba564ed4914a5154b6bf573239dab962000000000000000", -"service": "00000000000000000000ffffc2875b1c", -"pubKeyOperator": "09aabe15385a514de9545d5427baa08b311f2280ff0cc008e3edda19a0283c508efb6e7cbf56f92dfc09690375356667", -"votingAddress": "Z81Qr8ptba1rcY9AQwJNMSgybnW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0e41f5bc58d05acc45d02d6d7ae00484edbbfeb8e8a5e9ecb37742ada022f39e", -"confirmedHash": "7c4bf07be0eead967af3288d1d152106dd5f186ca43b7b801100000000000000", -"service": "00000000000000000000ffff59280646", -"pubKeyOperator": "10955c9676f1cc8d71579c28289b3b9ac6851acf07f2b6c1cb110f6f34baaae69abef5ad0d143092f052d8fc5d57d1e1", -"votingAddress": "2eSyiv1ntgrR6XEDEiH6PALUoDSL", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0e486d51959ea4c77818e5305b4b1cc5eb140e25a5115b902fb248b01c8bcd40", -"confirmedHash": "0e477eb1f69d7e5b1556ce5a7dfb6f7b99574c931b7b7f6e0b00000000000000", -"service": "00000000000000000000ffff52d3195b", -"pubKeyOperator": "99e9a924c7c67cbb77945393fed3193d7bfd18d410394c6dd8f02a2e1e2a8b3dfbb6a33005d4da2a94cb370b1ffa9f12", -"votingAddress": "33xWbFzLzYycqqy6ru1Duegss8gp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0e569ed26b20680c2ea14bf32949833036f8b0d0dc61d44fb9ea4e5b56b22f4b", -"confirmedHash": "16356f04b77a1aa06d6609b9de667d2ee38143e1edfdd9f10a00000000000000", -"service": "00000000000000000000ffff68f85e65", -"pubKeyOperator": "8b55e174dbb670fbb1a9f2c71d99bbcb27d3b69b4021012a7287ef34e0bb4481e194177cbf5949dd6be29276b78883ff", -"votingAddress": "29xmfyyi29qUWYqdeM6CydVvjQoA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0e583d2291cab90920497b3e4d8360056ca32cc13a5e8f3bbe9b4f2aa887f7f0", -"confirmedHash": "b9d1a8a806fb5eb6252529b68ca5645f28a5ad74f4c295512200000000000000", -"service": "00000000000000000000ffffc0f1a04a", -"pubKeyOperator": "872d96bc091a457ce4761b54350d7c8cfdb6b2cfbf842e794c5bb53bbe89d06860ff63ab7b60f94e1b666b078435e9e2", -"votingAddress": "mYxcKcocJGMgisTLfmbkhwThxC7", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "0e598443f42e6cbce3a83665ce02a31930c75aedb8dbe37391376e9b7e0c0db9", -"confirmedHash": "303dba0a3629e1e3012386c30feb876aef34c3d4bb4e52b61000000000000000", -"service": "00000000000000000000ffffbc28e713", -"pubKeyOperator": "07f24a32519fa1c806fe3e65844f6ba12da482dda4515e54bd7d5e69f60c5bdfca345ead350b47f833ca31031d13a437", -"votingAddress": "YFY3bzdvnyhRUEsWAWLjx7eAjQH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0e69795090a485ac69d85f3c66241f7ce4a6dae7fd2a3def1a784100a5fe88c1", -"confirmedHash": "c1de190dd8a55b62e75b091686f2c6a7ea4ec64a7f095f3f0900000000000000", -"service": "00000000000000000000ffffbc28b6d0", -"pubKeyOperator": "97f8811b21f69638d9b0a44fd42c092f1717282d38cfe86035695417d3c85d1ba07a7057cd7653fc795912e1f1617f67", -"votingAddress": "2PgKQKWicunUUb9oTvY4hZWr5YNe", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "0e88b1375a32ed49aa6be310e7a3e31414d8f4b758f645b51ce208feaa0a6883", -"confirmedHash": "1a883b80109bc4254866e9eccca813caa242eb1d3e1702c20e00000000000000", -"service": "00000000000000000000ffff9fcb2ffa", -"pubKeyOperator": "95467379b1e5474254884d990765dce13f7d9cbc9d439fbff77db113542bc4cfdaf3142e364f394ed05a1c46d2e04ddd", -"votingAddress": "pyVNhDeH1bGmrPJM7Jq4fwqHbNE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0e88f5ff3e1dcfdda069b3541ba9e187f6047055fb62d8151e24db192fdeec7f", -"confirmedHash": "2f4139d6295c83fed29f11ab206ac74df0be81dec1b3468a1400000000000000", -"service": "00000000000000000000ffffbc2815ec", -"pubKeyOperator": "0629e1d0da6f4763583b18a0c18ba75cad207b83df86e3cd3fc92ffb57ded80bb65967ff3ed686b19a1f4cee5cd170fb", -"votingAddress": "gn4AQs5AWARige6WquGVB399Y6w", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0e8f23d5fc0de036d6e2d55f1342152a4fab954b71dcfab30f3d6e08395767c7", -"confirmedHash": "9801721fd00d9b5e20e757693e7c19651c2d2e500ba9a1f01400000000000000", -"service": "00000000000000000000ffff5fd84fe3", -"pubKeyOperator": "960575d830cd21d09d1ea4ac519cb2214a491276441440547472a06eb1ca77604878e10084f3a9b3be7f3c6ce49ad771", -"votingAddress": "SX8KiRPsckpqFsZgBVtPTupgC2K", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0e9894ab7c79ae8cc1a179e9a7e6271c865bb4a4bfb03892aa05cad18199fe6e", -"confirmedHash": "1ab06894bb16e90982fb76a07bcf3e942d63d7d88d7a484f4600000000000000", -"service": "00000000000000000000ffff91831c75", -"pubKeyOperator": "15d89cf75759e403ccf6b2a5c1243a5e42c350f282963f7202f1814e4b0e6fb4256f1abd1a80043e2a57b459a015f743", -"votingAddress": "43yM2oL2djeXgshb6yqt6TrBAv7N", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0ea47e0a691855014dee4721ffe1e007fa83fba1d3a46d701df0154b620e3fcd", -"confirmedHash": "ea20aeb6f97e066cb67d4c2ae32dc1977568e1d87ba470661500000000000000", -"service": "00000000000000000000ffff23a2cdb1", -"pubKeyOperator": "95dcff1db35a6ee3cb98517e07e9b03d286192747c5bbcef4b6f21907db6988de1ca5dc243ad97c5f917c1fa63237d77", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0eafa30e8e7577990822c58792d84f3850e36f42808fe86f329316853974aea8", -"confirmedHash": "34d09c7cca1bad76a8d4c20610972ce7787695678e618c472200000000000000", -"service": "00000000000000000000ffffadf906a9", -"pubKeyOperator": "98e400fc2430edf8724a1c4c23ea1d20187ecdaa27d32f41ee51c74151da7c1ca9b95e05c8bae79f1ce6fa6404b5916a", -"votingAddress": "3s9TF1RWtQJs1Qgoed9wmsT8xzUL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "0ece00bd86530554fd029d539be27b1d36febf9177ebd1a03f89a7819dbb22bc", -"confirmedHash": "9819f38d7b018acbed0467fbbb8ea2b7f4c840b1b39b13371100000000000000", -"service": "00000000000000000000ffff26f2cdf2", -"pubKeyOperator": "0b778ef7057f061e92c48787b4c9f103f37f41afdcd5b8ce9fbce2af70fcde2e700d0b289f6ba2fea9fa7df357b1309a", -"votingAddress": "4PVnidZbu8jdGPJrEuWZo9iBzezh", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "0ed6e740a1195cf2da8fb81c376d88101f9b143240e8dbcfd2d9126d4be209da", -"confirmedHash": "97a05b392d7a20a88aaba0fc6f711e59cdc8324875aaaf3c1600000000000000", -"service": "00000000000000000000ffff2e04d9fe", -"pubKeyOperator": "81e5be7fe18fdc06e177cc33b8cf84f1a2edb2e7facb70c46527761598b46c5cd611ce9bb1fef7faae46d4b939bffd74", -"votingAddress": "XuGhZEejaVT6sqZZk5DG9fFa8TM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0ee66f7f107869fa5dcb747eb7745c4207ccfa465efeaf5ce931861bcc32918b", -"confirmedHash": "88a05bf7fcfe7bb6f051421ad6abbef061895858996ad6b60a00000000000000", -"service": "00000000000000000000ffff55d1f189", -"pubKeyOperator": "02c02a53cb66b84e8da1a1d134a4c7ab92e5eb93d0db3a9efb9dd54f6d875428fac15c44a2f189461f00ed67bb41459a", -"votingAddress": "kT4YYX6f4DnxtCGGU78smxdbKxA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0ee9c00456f6e2f76959fed638b5ed8d3e25d097b254251caab506336f88e01e", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff968865bb", -"pubKeyOperator": "87900d5f2515b8223c6664279a0ac8a3878107cdef27689732427bdb0daafe79b581173838d99f17d95264e64bbb8b0b", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0f2320a45a6912bbfc1b7b7cc2232a67be361b00df3cde064e1b2471ea962b24", -"confirmedHash": "db62cc78db294caf8be3132fe96d3bc2c195091d8066d8d81200000000000000", -"service": "00000000000000000000ffff95f83675", -"pubKeyOperator": "8970172905368d1cb8443df6f5eeabcf5a9dab77f6c069067cd42e6fbaaa9ed5d1fa4d3a38ed199df44903b9e37efda5", -"votingAddress": "3k7seQEtSW49zdPbg1qMDkWTDD5o", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0f2992ca000921bfa22f6da660fdf91dbd10441819e19e81d1580bbb8cf5a0d6", -"confirmedHash": "9de1ad1d7f5c178931067fc69b42d4e03f22fa014d7523e80000000000000000", -"service": "00000000000000000000ffff12cf4897", -"pubKeyOperator": "8580cb364986c0e4d40e6bef560df5642347a67729ac742290e4e0b5aab86370db87f6b397ef6d66d6f5d135155705c3", -"votingAddress": "3SYhG4JmUm2JBtsX6cyYdMAyrvFH", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0f3ad247e0af2debcbe46cb87fda8441f65ac663a7471c5db66f1ce8c39849a6", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b099", -"pubKeyOperator": "0edc94cc79be298b47bcaccb4632e890f84b5aa8773f1f90c454943a8b1feb6b312f369bc519a202bc8579fbc6c93705", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0f4a76a306ee6de7a6553e277be0a3a3a123b57e4a267827c823d72488367ca6", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b09d", -"pubKeyOperator": "90f3bec018fc2f3db3aa0ff57f40e7fd869399417fc3fea18229a120a0c2542a1bf62aa985eb39a24f1a1cc229e0985d", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0f5f6ca34dcf9d7e687193cc4bdf8a690e13f3d733c2d344bc6f46ba8a4375f4", -"confirmedHash": "8c6add2e7a8f2a416a912b032743c3c4cf98fe5c606e34123900000000000000", -"service": "00000000000000000000ffffc2875145", -"pubKeyOperator": "00549d47d26428756d26e0e3fdc4e388dcaf059b5b8ebd2b19997a594be501f7ab6db70ff9527e61f036cbdbdd411422", -"votingAddress": "DtAJSE2K2BfZS9WYCjnfbbZnxw6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0f70910af580a7fe2746edb9a7b1b8d5f5b1a0f5f2f7420e2b9a50183957f265", -"confirmedHash": "b36ffaff2bce54c8b1413dd9649b87fb382c9f6b0164502f0e00000000000000", -"service": "00000000000000000000ffff2d4c21ea", -"pubKeyOperator": "066dfca307bf25ae1211d9b3a6d679925fd1d92a926dd5ead240d56f5f5b0665de8c3951dc937ff69168dd6447b279da", -"votingAddress": "42sevRwgFyDj1edkyxhDok4vgzu6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0f81fee4998571cfae57265aa49eca1616af70077c1d348ffbd0d27f5645ba67", -"confirmedHash": "cda29b67ce0828b2618f89f898b47f3c596f0c080b42260c1700000000000000", -"service": "00000000000000000000ffffc3b5f42f", -"pubKeyOperator": "972cb82b7e16bb3c4cfde9dc38a2f04711613ff6cf887bafc5f394d753f8dbaca64459bb0a815fad3e057cd2846bfc13", -"votingAddress": "2knPJGikj2ibQrqHzg1X247jhaB2", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0f8fa2c71c1cf9dac3487a109e846547a8740a7952ae707a16f25d4998712f64", -"confirmedHash": "e79bdb8d253c9235dcc313e7413c5b6c5fc4838ac3adc4891c00000000000000", -"service": "00000000000000000000ffff36d5824d", -"pubKeyOperator": "99fb490d639cd5075fced46b1c84dfb0a6da40d14c6cd7cbfd84ed553f5d37f2501c1edd438aaeb1b1a3b4b3f7bb9424", -"votingAddress": "3BXihP3rkjomVQ91c4ZuY9rPkRp9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0fa3eea42503c1b9ca7edf51d4179f15183a66da49bd500f33e5289109118b0e", -"confirmedHash": "e5a9e5c645a067ea29c0c6c411c40c565be8659f1631864f0f00000000000000", -"service": "00000000000000000000ffffbc28b6c6", -"pubKeyOperator": "894e7d16e29ad44b63e2d3666b5f5efa99183fda85518c28fefbbbac8488e8c2d6b4c3cf55caf8cc45dbc5ad9c40783e", -"votingAddress": "2j7JmAhkyrLifFSywZ2FeuAUao4L", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "0fadadecd1f391580dc23a05d1201d443b16503beb3e4630cdc3ba473f92cd1d", -"confirmedHash": "72ace0b4126462c51bef0e2c304514cc5de0e82459150a9d0b00000000000000", -"service": "00000000000000000000ffff2d557572", -"pubKeyOperator": "864236fab08dc2483a437869930591ad8f3813d588bd85e1d64c28d0217b881344ebc9a394ba63d24908cfbd1501c9c4", -"votingAddress": "QfHKcdJYcZduLsCgNYgxEdeL3pB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1017c402172ee82dc61647b05de38620f6c426c9942569c6da2956d0c670ad95", -"confirmedHash": "085c87a168adef427bad38791dce86b3e81ee4a5bbb1b08e1800000000000000", -"service": "00000000000000000000ffff8ac5a42a", -"pubKeyOperator": "92e9fffbaaae6c5a1ce4be59d3b8c79776b7e60176be8f7411bc577caeb5d6c0dccb2f218796b3635e1cd1d856f8a064", -"votingAddress": "3LYJAv4LjHRKmPYdrW5uR2HbJRBk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "102b20e67ed2d18eb05e039c24d300b11bc025b3b876c91deb980fd5705a3839", -"confirmedHash": "b270c666cb15f8ef460233c933b212241eedd1812df6968c0900000000000000", -"service": "00000000000000000000ffff22e3eddb", -"pubKeyOperator": "81d82ca38fc62f61549ea713437308af3e25b7ccac3cb87d1fd332ec22a65113c11723078d3f0159f8cf8c4b3e0728d1", -"votingAddress": "2Bt9cWyh5YtJ4TdL2oK4oroqsJzS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "104f5d4213b543926ea781202d690169f0640803f733ca869904fe01db16c962", -"confirmedHash": "0043d0f5c90932ef64b282a9903a5ae994e9a87423fc78b80b00000000000000", -"service": "00000000000000000000ffffd8ee4221", -"pubKeyOperator": "0b072fa1d9fbec27614cc1676f52a971e848b40ba82f0e735d0d0f15ab6a1355f1fe51cca74af47b5d9291d3f3042b30", -"votingAddress": "j7Z1QVczYT4xonT5UjxaVGcESDe", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1058208572ec7c45390183bdb3b6b3edbd1e0195a7270ca75daefd44c6f22652", -"confirmedHash": "2347fb1c4fb53c46e40dad9af625da912150a762f499247a1a00000000000000", -"service": "00000000000000000000ffffb280f15f", -"pubKeyOperator": "98bc1002db19780ff9494701224c3464d83bcd72ac41f2adc7914d5a8c56a503cb3d565809ba22e3d3ad64becaaf9c1e", -"votingAddress": "3kSoooTWhs6pERNJ6ew4LRGsPkKW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "109fc098c3c1f8b823efaf48e85c85d4538b0e6bac633065c9c805c72568524f", -"confirmedHash": "772fc57fd3999c00dca348b913d050205326086030cd546d0000000000000000", -"service": "00000000000000000000ffffbc28b246", -"pubKeyOperator": "0ab28ae6578fdcc2b43ea15f0c760e826be36f40ad6f057aeaadd6cce85953c99c66e698747db66b56c359aff261697f", -"votingAddress": "aJ8ryrBuRREu2BFpVH9vXFwZoYR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "10cebeb39f23fbaa32a76216a349ac7cb1344d842c140f0e0dae5fd27141889a", -"confirmedHash": "18213c34e143bbee47985874fe9983481ccc1d87f65f21404000000000000000", -"service": "00000000000000000000ffff12d7d054", -"pubKeyOperator": "069debfe5f2a7bc3c5b612eba442aa108d3aa9f102638c2051cd019b783bf13b449303009bdc49da39ddbb9d14ceadee", -"votingAddress": "kjyXSgugKNfULs3WKBwt84brgr2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "10f1a33a6084ac376943b568e06bce316aa00399224124048360e74bffe00567", -"confirmedHash": "0767fbb6956bb7721ef6c6f7232daf605f44331a384eb6660600000000000000", -"service": "00000000000000000000ffff9df52295", -"pubKeyOperator": "17c8942de54ad5f8184bafe0c159c7a0868d94cd384392ed56f3f60beaada261cbfca5bba336d53655f2c9c11949601f", -"votingAddress": "dhCQVDKFzdo3mPsqRVi6Lsh9NdF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "10f2d3f299fea0ff89c624c77d1859ed3c3c4b87c94e6ef02bab9be5995e1a63", -"confirmedHash": "f1b2db2b3f20ffc495763ad9e6f4a2a4205a85e5d5d5f5601400000000000000", -"service": "00000000000000000000ffffbc28b6d5", -"pubKeyOperator": "0db0e782170cd410e7968d78f31d5fdf92d7eebf3624b30e6f69f8a84907d68a1020081c4218a42e618a1bd85e768326", -"votingAddress": "26awJktMsBz6vnmNySGmwBUovBRn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "110e5ed94a881f9c67d755cb8aa752d86fc4679755c662eeade4cb71219286bd", -"confirmedHash": "696f8f5624c7245c38a3795b78a7085ff74a070db1b24c8f0100000000000000", -"service": "00000000000000000000ffff5eb0eb99", -"pubKeyOperator": "9796c4c25c8269f93d86cc9ace3595aa2d76349177b53340dcf4a9af634ef9d843e68d58919992982711c16e7932c7b1", -"votingAddress": "3tbyhUXnWEHnAUgbaujMcYpbsbBj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1121230deccb336c885abe3e40b80f5dd9df6f0fc5fbfdd0edf41a10ee6dde34", -"confirmedHash": "300a51c3b1e8d60cb83790e2f2cfea4e645a3cf88862b3521600000000000000", -"service": "00000000000000000000ffffbc28be2d", -"pubKeyOperator": "948124318d42651ddda44b84d687e9b93389e008813a9c1aaf186c1284ce592f0bfb36862825b2c0d855c36a2f9df307", -"votingAddress": "Zqd2Pdw3Q5Bbxx8TeEYTxtEbxLe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "112bd147646f2813bb53c6966c48cb98f18b0045e3d5ed9aaf3c2c1e5abf8519", -"confirmedHash": "b39d9fa5abaf178713b63c00ad578d07cb637dba096513942c00000000000000", -"service": "00000000000000000000ffff55d1f11e", -"pubKeyOperator": "8114d8bfc924bfcf87843755439127ba70a199662ffccf03ceaa019e1a2f9801aed7ac5c318fe2e4a2ca54c07db79ab0", -"votingAddress": "3geq2bWifn8yUJbWVrpXYQ1JocoW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "114533e419207be0ea97707e2f1fe99c3c6c594747122d19f30103d4181701cf", -"confirmedHash": "f475109160142b7a3c9e88937ee42dddd0daeaf15eea728c1b00000000000000", -"service": "00000000000000000000ffff50d3c5eb", -"pubKeyOperator": "10f43c01376aa322ab767f14e32f87d049c80350fb655b23998436f59ba728ca679bc26c558d3121212900316546b0cd", -"votingAddress": "4Q7rCR4LJEuMKoQr4pGLE4vdWUGS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "114facdc4d6116d041f60447740ee56be962c3d49a14f3f500b914e79c0e3fef", -"confirmedHash": "44bbcc917450905c4c682062c4212c42797c62fbe8da91de1400000000000000", -"service": "00000000000000000000ffff50d1e1df", -"pubKeyOperator": "1166845dc9091c83533bfbe240850a2f8df0a1e55c734cc69dc9f546bc71effa4244723dd10f3f1d5dbca7f8a97b0b85", -"votingAddress": "jRHfk5x1dLhQAf5DfCKebdmtRfF", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "11552020898a546f37b90db58904e01b60a7bc76bb9394db6c636731c0850541", -"confirmedHash": "9aa964552c4c30bdbab604ce89ffdc18cc79ff3e74d898821b00000000000000", -"service": "00000000000000000000ffff52d31514", -"pubKeyOperator": "96661efd681f5f89f46ac2fd55d6fd38c15d14e924b5aad7992158e8920d79e43c08115ba1f266b4386e2e6796a5046e", -"votingAddress": "3y6C8waDLdLtGU5c83Ajd2RtPZE6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "11925c7e5678800cb473f3d759a492ba6b93d94fa5cd61386b0bbab3876d9d75", -"confirmedHash": "eab7db400badb4dd37f4fe7c1c53f3768e87a6b1f059df4c0700000000000000", -"service": "00000000000000000000ffffbca6da4f", -"pubKeyOperator": "1937ca0b1babc0240cbde3895b7375df6d4b4b782d6fbe50c1f85dd00342c851a6a8134d211045283c12ec0e842a01d0", -"votingAddress": "2gjTkR6MrgAnyzVnra6ueaC6feFY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "119a45b6e05a4f6de2dcc24a5225dd30e62dbc4635b15b564bc95adc6af4a47f", -"confirmedHash": "587a3db12575066750bfc79382791e8d8e337b66657798561200000000000000", -"service": "00000000000000000000ffff68cf82f6", -"pubKeyOperator": "11b70a4e4c15676a026dd333c75a3e2b19daff4dfb8744cef911450b55d1886c4ca116c65203662476916e6233ddf239", -"votingAddress": "45W9x6mbbwMYcfBC3NJMFwRVSTbh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "11b22d068caec0c3fb0724dd58ec8933962ca94441760a6dc21d61b68cc40776", -"confirmedHash": "8374d2ace557171995fd2b8bc319382290194b6998c6edb10500000000000000", -"service": "00000000000000000000ffff87b53494", -"pubKeyOperator": "8545e33839d9f789e6c2a915b6a6f347d77f8542078dd0b7d23612cc7c2b56ee6f7fffd33f2eb281555b9fa91a6a0c92", -"votingAddress": "kekSxBYrm6NeE5fvtJL2zZ4xAZk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "11b89bd18f560f2779ff14c2f333b3d409a28e651fce1a0c263f0c5a37af421b", -"confirmedHash": "8032a73c0f4f4cf95db23188177e4f077bb0f95fa60e36941800000000000000", -"service": "00000000000000000000ffff2e04d9ff", -"pubKeyOperator": "11190a114c1a71448556f9c2729d9516b6a4a6c91d8e4cba6faa3ab8c6a8ad28081f555e87b14d3e19e329e62712fe2d", -"votingAddress": "3dQwg36nvxLgp2P5omGdL88rN72U", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "11cec3ac8c1546aab3aa436853ea9d30f899df29bf1dec81945b9a5f8ae490d3", -"confirmedHash": "ed33f8e400c801386d8cbbf896d57966548452a6b8372ccc0400000000000000", -"service": "00000000000000000000ffff343274ec", -"pubKeyOperator": "84aae670612ba9376dccfe91a214982f83c7d0010f09d37d13c6662dbdc4c5bca6be76fa7aa845d888f9e8cfebd7ef3b", -"votingAddress": "4CUZtsK5uEFpUsgwhPPc9HAZSSKZ", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "11da760175b6a38e82310d45b97e4486926832470ccf53b74ab0ec38ad265c25", -"confirmedHash": "9ee6ac0bcfb85475eaf82a0f5eb7617be4322c5c7adf78280000000000000000", -"service": "00000000000000000000ffff5928031a", -"pubKeyOperator": "85984416876b3c4bb2ee3f7eb2b80bc69eeb2de32c94d18b32269717d6c823056457f63b1ba1fcaa62690d4c7aba42c0", -"votingAddress": "4BMXAraGDbhoX4wLM3dLAv1mSEbV", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "11e865b0d157b8ddd090c29dad2e1bc3cd018040423db395919c88b9fceb77b1", -"confirmedHash": "5b5d8cbe673c7f196095d728833bfdf6c506c7640ae7bc3b1c00000000000000", -"service": "00000000000000000000ffff2be54d2e", -"pubKeyOperator": "92ded6c54955f8703d83898d4acc3f65edc3defe09f346cc70d8d6e558211089a505e05b18d92ee05c15ebfcdaca7f06", -"votingAddress": "4VE5oZqWRAt9VurUkb3naKJoVKfK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "11edacbf9d2bb8621bed87fce943198117645cad10fbb52c346ff864b2339629", -"confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", -"service": "00000000000000000000ffffa8773e5b", -"pubKeyOperator": "0707b0b0bce751f4db44a757ddf926ca00abc149f059360c06153ad68ea32c6c913fdc63d7b93ed4a1a05381cfad67fb", -"votingAddress": "59YGJ3TEepjUZMzwjFQwSaBsb1A", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "11f969a892aa28ded1de1fb908aefd0cb97cf7e55173a9a1abe8b9643fcd8883", -"confirmedHash": "617a93d3408d0f74d9b4712474856a33c05eacedf7ddbfad0b00000000000000", -"service": "00000000000000000000ffff2d4dfb16", -"pubKeyOperator": "196c5433726fc69c6f24e08f99a766790f94da5e6ba583792efe0000124789c2aabcf44df9071982f464eff943c14ff3", -"votingAddress": "47u7YD3TB89CbGZur2kWK666iPKN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1200b391da345652f1bcf7006ea6f2e48182f20992d6e5eafd6c9d972e837462", -"confirmedHash": "1dd812ea287294c706f0e9069fd425f2601fbfd6e4f1b9bc0100000000000000", -"service": "00000000000000000000ffffa1619dc2", -"pubKeyOperator": "8b9754755ead80949f9ba2acc6a638230947d422533e0364dfbfaddf9ccf86df6882ed4bada42d96e9771be6f98bc85f", -"votingAddress": "2UbwBeXX8nzd8bDa7eJCUPNiU3Sv", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "120b880ba6fa991728d1a9911dcd9c567a1a870c70b5685efc75a77d1adbd6b8", -"confirmedHash": "2d12fc6ecbcfa3b769215cd079d25819c8f89ce91117184d0900000000000000", -"service": "00000000000000000000ffffc6c768f6", -"pubKeyOperator": "176e24c69e3d1f6faecadf72b2604f104b2145304a97fb5d61953fb0f9c96d4bc3e4bd5372389ab0999c5b8aeaca42c2", -"votingAddress": "ePtBh94oey5iQavP7UMADbzaT4F", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "120d42da4318be807422413cced534cad0a2a7cfc63085ab1062148c9e0230c6", -"confirmedHash": "83cf241cbb05076e5a891a8965f9c9dc5332f8eaf75d811e1300000000000000", -"service": "00000000000000000000ffff05bdfd3a", -"pubKeyOperator": "809edc3107bebc0b7886d0e659f9e0c9a29e18f8cf891007b19878ce99f9f88320731e2a09f123c102a643a74765ed78", -"votingAddress": "3qUmhW8H18MdrRtp7xfy9N71wCRM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "121469797b4dbf379883b31bc52c73e81735e6164b317ce6989eebb3af6578e4", -"confirmedHash": "5d5663de2e407152eb464894bd54475efbaab9f9d5f63e391f00000000000000", -"service": "00000000000000000000ffff95f83530", -"pubKeyOperator": "1081e8566e74790ba82b291627d7a612e76ccb7aeb1508b78162bc543c564161754446d28b6bb07a345420b72e34de54", -"votingAddress": "3Phy6A53Byx7rQVsdygBSG5C3ZPv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "122ada4c84909e37eabda85e311c5ed71b83b24b736461bc8f444307144d8b11", -"confirmedHash": "4ea289843f970dd4bd810fbd9e2a221e64a302721397208e2000000000000000", -"service": "00000000000000000000ffffc28755c2", -"pubKeyOperator": "88ccde570a9ea7e025b050f5286aa8291279f0f4b2e2c9e0b1f3d6529ad5e26f18ff1e2a56c6a621fb0fd272f1359d8d", -"votingAddress": "2vcoRbEUR2kxJpoYuny5Sm8LDPEF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "123015b5453a4a2b36427ee1cdb2a68af9eafed6b14d7f0b43088df1d168255c", -"confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", -"service": "00000000000000000000ffff87b558cb", -"pubKeyOperator": "139e8513a6197c63c2993a9f59d581dd3ae2c4ee50f9e4a6554b28d15c74bbdc58f21542cc10c7576052ca0fb08166ae", -"votingAddress": "yL8KRno7nTPof1PUBXr18YGRbLC", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1238341973dc668d3bcea0834c6e7eeb08c8b76c5442deb04fcdd9e464819064", -"confirmedHash": "bc5e39af9be4d279ea91969a7df14c882b791a64dd6e1e971800000000000000", -"service": "00000000000000000000ffffbc28b989", -"pubKeyOperator": "1789561e022918ceca82561b6192b288ed638d4de7794fdd60e42b6d414ada1bd4864faa433e38a9e5b948811d28881f", -"votingAddress": "WMv32U9YPmogfYatpQn8nFxV7Uw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "12463b03a15c9fd2394bf5b4f83f6953cd21623fa127a4d4b7ca43dfa3b59441", -"confirmedHash": "8551a1d375cbb794a501676a5bd37d436d20645d6f4e3d972300000000000000", -"service": "00000000000000000000ffff2d202ba7", -"pubKeyOperator": "8182de8f0c3999c3c88cfe6bdbdccc2e3a2e21afed2816c150cfc95ce823749eb7a8592f1e23d736eb3b00aed0c599c7", -"votingAddress": "3WciGUdVuMZWm9bupRadPU4qLq3G", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "12523cd97510074c575acbb5bdb2f2151615425f346295adbd0009fbfaa75d8c", -"confirmedHash": "50a4c2e17790cf4b393eb396ba5c55c7f68d3b5a527d3f590f00000000000000", -"service": "00000000000000000000ffff52d31911", -"pubKeyOperator": "0bc60b15bc8666e9a1b8a5810c175d3e10db057b2a679863221434a7cfd0ac59a80a961457fe080a84fb9c988fd278bb", -"votingAddress": "3WQVLbYeJNBxdrJeVUMjUwUmqRdB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "126686a2bf5f35b88fdb7f42a00223bacd2d08f808e5e049fab1d797b001343b", -"confirmedHash": "b3f9cd3ae9dd2c256fd3dd5b4fafa8658c73996b92295d403600000000000000", -"service": "00000000000000000000ffffbca62cd3", -"pubKeyOperator": "076f7d1ce45ce82200acfaa2ba45297ec22ecb2c784ea8b2b0e85ebcd3d60c30bfed5661c2d5069ea0cc839a167870fb", -"votingAddress": "ZTuVxiykNw6Zxtv74w9JGoHFNmZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1268fe8404db5c86687e16993fd841211373de9d519102bf631be0d2af4d73b2", -"confirmedHash": "fbf3b6c154e7b7321d577c42999fbd2266c25ef5214085350100000000000000", -"service": "00000000000000000000ffff55d1f122", -"pubKeyOperator": "00070d689851b893a35593a2c3fa99d0ebbef7595fffa75db4548337bc9f8333141853378c6009584a05a9467dcb8393", -"votingAddress": "3RY2JZA35Q9hjvQ7zyJsanpcvATB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "127d904cd14ac64ac9952097c1de727aa2542e1c048785d1c864f2164add122a", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0cc", -"pubKeyOperator": "98cc856eaa8a0e0340d8eb405bd124d254488b7133dc824347530ce20dbad7a92b9d7e3afd5e2c328c81452895b55b99", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "12967da0c11a2a77aabcbb0a5ddaba2f9011a13d7524547da2d5a0b614d24298", -"confirmedHash": "4a54df7cd69fdeb9f4c99de9a89a3b5fd23ee17e3f3feb082f00000000000000", -"service": "00000000000000000000ffffa5e32f34", -"pubKeyOperator": "85c63d769a07dcf9a3e91116f3964f5d286c5628e26ac16e7ed20cb9701f41de37e9ca96b7e12c8263c13cbfb7ee6e2d", -"votingAddress": "4HH2TAEAuXWXgTHxe4Ywbzz9neoE", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "129780df20ac9f1d3f547e5bcc289faf0a74232569c2fc5be4c6920edde0dfa6", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d521d6", -"pubKeyOperator": "03bce44c953eb027b9f4deb6d0f0ae7aeaaa7e138dc83a2b0b7afa6fb49e74daf5cd1eb72ff7bb10de28a1f3905aa1bd", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "12b3100ea7b9212fcd1a28c58a650e4a71898f42cf9827a7f63bd5070bcb5ff4", -"confirmedHash": "9b5bc5f246bd929d5d85fc0a4dc95df780c83751bb96832e0e00000000000000", -"service": "00000000000000000000ffff55d1f280", -"pubKeyOperator": "17f8f1d02909a41ae9e7e004b6137ef4a4ea93834285e1ea685d4c46d290672260559322bf5845f6c44f72d944bf5a28", -"votingAddress": "4TbseDsTD4yTUD9W7YWQVoap7kv7", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "12c52f2424847bb103a200b21fc776d45c0f83b3b6756a8536422d033967347d", -"confirmedHash": "c4a900494867cbfcd7af39b3d63b2d8a4af0c6acc1e51b320300000000000000", -"service": "00000000000000000000ffff34cf0709", -"pubKeyOperator": "0ecbad499c7d2745633699c199bd28b6a71aa9ed65e89cb16c71c51ae7e1fd2ed6502c13b673cfc4468cd3dc70d4f594", -"votingAddress": "4Yg1nQGC2dCJkbnWtYMxgdqfnwVR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "12d4d0df8c1015d6746520479626543c7d48e312cfcf62fd882e7669bf3e2480", -"confirmedHash": "4a55fc9e9ff114fceb4e07b839e5b87320542046f5684e9b0500000000000000", -"service": "00000000000000000000ffffb280e3fe", -"pubKeyOperator": "838c52bbca910d0630def7b25fa2ee9addd27dd13d33f7b4b0022e1c2dfe8c2e08d6be527402043d1151fd086d8e9107", -"votingAddress": "2RkxSAmc4QexwKjAXcP5V3WHDfRM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "12fff42218768797d6b28a535ddc0744e7a6fcb4bd824abf52215449a1f21048", -"confirmedHash": "bde77381e7fffa50e73f6eb81bc9573153fb92547449244a0600000000000000", -"service": "00000000000000000000ffff0509ed24", -"pubKeyOperator": "873cfc8d9dfa57d67fc147d91faafd8bc6753b95367dce674c0f91e59f5680a50d150182b98479444b6cf96b2cdd1db6", -"votingAddress": "3bxEB1K8cw75JL9WiCRMiWwoMdU1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "130dac8148753ae84b2baa8263ca567c6a05a426117d61f222d61035cc7ca161", -"confirmedHash": "59dedcb564479592f8a803c8bdc8a26d2df3e34c0d03b8171000000000000000", -"service": "00000000000000000000ffff55d1f14a", -"pubKeyOperator": "8624a671b7eb6111e53adf55806ac01d6c0af6da23fe3e964650ed39b017585291cd6e2b3ff20a1f658aa26b4836abf6", -"votingAddress": "3USo3jUXTCAAZRY9yLY4sEbgkkxY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1310df94e54989cfd09bfbaa7440bfefbe475bbccb20b229a6f0a118b5932a4f", -"confirmedHash": "46277ba4f6612c8e65bd6fa72acb0edd4750a84764308dce0f00000000000000", -"service": "00000000000000000000ffff2d4f3392", -"pubKeyOperator": "99509654d9c8266cec156733c39dc1e049e11ef0c61b257a54b223cae5b719382d4f54cbc3bf076bd7213a37d45177fc", -"votingAddress": "BTPfa23jQaK3ykRN7tFSuhjcnfD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "132bdaa7c11cff5e7c02d2a7c42bb3dba80a2a13ad9bd3f7e838696744680693", -"confirmedHash": "aaea3443f7e3bcfe882e04f996e5a78c2451cbe0bd8bc9710300000000000000", -"service": "00000000000000000000ffffbc28b487", -"pubKeyOperator": "18d67c0d8d34d52453287f952cb486e67d053735e54b9dbf5c7f8800c438dbdbb6649fc012e01dbaa9afaafb6238bc6b", -"votingAddress": "2PxBJyNdrW3j29EPqcQeG995b4fF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1334ad7617c9ec53a04da0c067079f7fa12540d02e6412ac61b420724518f422", -"confirmedHash": "00c192ccb42a1f5ee3153ec2acf5548a7b734eb373d472560700000000000000", -"service": "00000000000000000000ffff55d1f249", -"pubKeyOperator": "80ae6afcd54195691e8080a03c729b9ca5091a4267381d46dcf53b3f30f35f6653dd29073f63b28af9eb723639da2281", -"votingAddress": "4SevVWrBPUwJzDryBywfdyZEkhC5", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "13361f56a7a6b91d31247bb0468701f0a2d5eb7e2524c7bac4921ee739088dd6", -"confirmedHash": "dcb34c133584729ac26604362c8d0e45753104c82d803c491800000000000000", -"service": "00000000000000000000ffffb9453692", -"pubKeyOperator": "013422421ab39675687372b53cf1578e7ff2ab291d9ecfef65baef1a18a9d057544fefe5a382f2b1ce79d3d8b612ab3b", -"votingAddress": "LprZu6rJ2BQgMdTHxM7dHsXncgM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "133bbe19f248ab48429829101ea75d81eae71fe6ab564bf9e42fe2643f95a910", -"confirmedHash": "dd7e24c15e87d7e71471fce17fda12fa2307977e7e437eef4800000000000000", -"service": "00000000000000000000ffff68ee9f0d", -"pubKeyOperator": "8e10923c85e4251604b077a05f28e3f18c576a81010425245f77268b3e10e38502cf46efb75be368670539666938be6c", -"votingAddress": "jb9LC1D8Sz9Qtk3YnEbcpByAEj9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "133c149087d0bef64b27a02d8fe6aa20c1bd939b65edb728b5a1b42f2d6ce052", -"confirmedHash": "3be8f57db8be3cf69e7126f705eb9f0137f58651c30af9e90a00000000000000", -"service": "00000000000000000000ffff2f62425f", -"pubKeyOperator": "0fd8a125f587dfeed858685cc3dc4723feccc13eb102f742c7e21cc86572decfcce0c54b34043f27bfad035d32070301", -"votingAddress": "MXuAhxvtPj6so6nSGjp7BgvrNxm", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "134352df7446c2c4a9f3a6e6f11c548e9eb142497a06debd096507e271c8b9cb", -"confirmedHash": "2c7b8af4bacb17e6df6460ca5fc7c6d34712740523a4b8131400000000000000", -"service": "00000000000000000000ffff52d31512", -"pubKeyOperator": "0918bec88fa7d05ed5d20a706336d30a3f782ceed752b165ac9d3265e2fa1ae0badd6d4e87ce6fb3e513250258257ad9", -"votingAddress": "3JctyCG2j2CcjSSvXzEqqxTtk9hi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1344929a0a7de169c8d48acc39e1bc129b4f995f3b85e471d81b0442ca6a413e", -"confirmedHash": "f50a3d1017b4c38182daa544d8681fc33f9872208b1995213e00000000000000", -"service": "00000000000000000000ffff12d66cff", -"pubKeyOperator": "084b68d0319dbd22123507936a5c19899ee2efc190bd50b21c012f83d2fa31bc35fce12da8c904191764ed253caceacf", -"votingAddress": "2Z775PP9gddCaA8m3HxyiRv58bUL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "134ddcb7283cd30b970249479797773d5d61478c558a95024edac5b2a43037b4", -"confirmedHash": "4a87614c3c9a020ceea38b9716b3e8fcd87fc4a258bbce4e2e00000000000000", -"service": "00000000000000000000ffffa763b78c", -"pubKeyOperator": "00f52a7a61679d080287a1daa978db8e3ba7740b0a3dfae60111237ce870b25dbd35dff99515eeff7bec1b0098d745d7", -"votingAddress": "kPgamzTdEeHauvQFaDzAbR9AffA", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "136876d864064b8e5c65806262e9abeba73944f6e986a08ea9799dc3346ee2d8", -"confirmedHash": "5ed4f5fc30e936bcc9c149e0495d75962417f1653c1a2ce71f00000000000000", -"service": "00000000000000000000ffff52d315e6", -"pubKeyOperator": "0662ce293367288a2a20709a8e602919bdb529aad4a3c2fe68b0be06b26d71010d8aa98cf23af31973e7fa7f2c4a4868", -"votingAddress": "2R13PiPDNfX5NnuD7LuWyZkwuoi4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "13760933ec7b4b42d1813ba675a264bf17def4545b90cfec02b9e71f1cd310c4", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0d9", -"pubKeyOperator": "8dd1a0cd750775641e714d2269c471acc78b8f1529035954afcbee56a1144bc7da09b7c965eb75116102bba05d338d21", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "137a67ff74635821dc08b0b4a1e3ff9fbc4c92708bd97ca0321cded3306ba920", -"confirmedHash": "fa27114050ccc1a4c4fa7c860eacac77f9d4b2992e0352990900000000000000", -"service": "00000000000000000000ffffcf9afe2b", -"pubKeyOperator": "89be84d86c294eb578972fda9bf2b931903e044d363207670691b54bffb2f3b6283a108edd8c5ba16064ab3a883f29cf", -"votingAddress": "3JijXZuKrd7hakdy8ViXZ1riaCGo", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "138a35fb7791e515b1e7728d6943979e546273518a9113988a9df695120368b1", -"confirmedHash": "3cda68535dc39a4c842983452aeeaf98609e5fac435a91440700000000000000", -"service": "00000000000000000000ffff8ac5bd6a", -"pubKeyOperator": "18fe50e7237d2a46cc23222ef757f42a356659c0797c804523e6b1fdc420eee2f643a112bd8db9674362c64be7c52c89", -"votingAddress": "3iCLkD3cxegJ4nm4g2zhMFMpwYGE", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "13af8bed104b3e698aa463c6efcf80f29af7a0a9e6d122c7369aaee3c6242328", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d56885", -"pubKeyOperator": "05f9d5a07a826cf5e88643b4cb9f490c0726cdff5372dd7feb3c187f55f8a0f2bb9e55d74023a9497def3ce1b6b07dba", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "13baac83019de3225e986f91d4d66d15baa6d59c9681a557b0d92ebf9b94e0d2", -"confirmedHash": "9897a486bcb6335a22a757cea4b46e2625ddef3c01a2b8da0600000000000000", -"service": "00000000000000000000ffff55d1f172", -"pubKeyOperator": "8ff24404ab95e859267ff8a8b6c199d0a0aa91d12d36bdda27a877a62bc0c11d602800564319386454bf2f3d655d4ea4", -"votingAddress": "4B7yB6TN96F3pTzvW2SNTMZ3TNW3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "13bf49e5de002dcd892a0c09fd4d39550705d9b640737eb1e0ff309efd3f67f1", -"confirmedHash": "1bca13297fb25a6ae5c083e0f6062308fdc3e508829e5abb0f00000000000000", -"service": "00000000000000000000ffffa5161957", -"pubKeyOperator": "01e74dbc65dc52d4ee67d618e2c81bcfe0da3b10780c7d899908faaeb9ef32d832d6ca8c4c21dcd8e4f4fe2a730f26f2", -"votingAddress": "4WHMnDw9UdJK6Fk1uZqqFkf1AHtS", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "13c6197940a105eb683107ecf668455a1a6bd526c7d497e60998d1f5fb8ef149", -"confirmedHash": "ee44ed9cea0b59bd32cb9d1740104e13b280283aa6dade970900000000000000", -"service": "00000000000000000000ffff9f41973d", -"pubKeyOperator": "922f51fea28c9c398704200edc44166fae040ceb21b4de1b57f28f52b879de44fccab9055bd68bd74c18af6165f8978f", -"votingAddress": "2uh9xELBCwHsRKj464dzMv8WTvmW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "13e1710cda6005405794086fa1facf0cc0fe3a15331949779f2842f6d74d2963", -"confirmedHash": "6789e3816f655bb354fbf6e43eaf81d33fe1f6b41839eb6c1300000000000000", -"service": "00000000000000000000ffffa877578c", -"pubKeyOperator": "03bb5c3564a9b5504b00433df5a89f0fa75d11a19e38197243b7e2afd7708405d0df79db0932c7fe6ba0a85421cea746", -"votingAddress": "NTTSWkbpJzsdjpokEJjJhT34GBo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "13ed9455b20b89afdf991ee62eb8bf36deeeb547d116efb2f32a3dd74e76b087", -"confirmedHash": "e251de0be85e8a41ee2edfe982a7d8c7c878e7be8b4e087e2f00000000000000", -"service": "00000000000000000000ffff5fb3b585", -"pubKeyOperator": "924f4bf8a3ac575c77ed08a0737cf81d3ab36d263158b252dc58ed3b4bb3ac34f1185e501245b87bbbf4a69433e35509", -"votingAddress": "2wB5ZfBi3Wi5g1yQD13mrN1gJoGq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "13eecbb98f2aba83d7d3ead1cc0fd36e89186590a2ef5738bd2e565d342d04d1", -"confirmedHash": "c58971671ff2e5b2629c64cf449fb208b7215008b0a2aede0a00000000000000", -"service": "00000000000000000000ffff52d31953", -"pubKeyOperator": "990250f8722ccb412757c3072d8343c1fa0007c239bed107881bd30f1117623bb6c5f9520fc8dac794563d87c5286d35", -"votingAddress": "Z3gBnY5hFnEJjqXaAYv8XXgzdyw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "13eee2768ce9ddaba62fbfd7e41620a7e0666f675de20f250fdc2975bb6d7fc5", -"confirmedHash": "646d2c6f77057abe5bdf3a3978c842ebe5d8840a3c189be20300000000000000", -"service": "00000000000000000000ffff2d5575aa", -"pubKeyOperator": "96ef023dd79cdea35b0d67871af8ae49c43e44877ab2417ec0cb65c8bbe2406052fa4ef93b742d7e88d6d32877ac702a", -"votingAddress": "3E3m92CCfxknq81XJchUSFTznmph", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1400d0ffb5e6ed47e8a2b4716e9b68f5db784145a96b9f10ce41d4d028bb7af7", -"confirmedHash": "ab25b4d2afe1c56f9b33733608b170a3b2b23c76b6e934012900000000000000", -"service": "00000000000000000000ffffa8775787", -"pubKeyOperator": "12a20dd3e82fa9774007bd84c9ca78c69e07416359e9e0d6bec9e3fff415d7676dad61344f7159fac27e62a6e801d5fc", -"votingAddress": "2g3UUSMjQDrSD5BSu5Ewpjkyiuen", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "14224ec5971a2e43da8b9a2b77d007e9e4afc20821b3e4b988e952756d89e21b", -"confirmedHash": "2a0465522ca98da7b298dd208cd3a7ad16becf7641f9e8c21200000000000000", -"service": "00000000000000000000ffffb951a76b", -"pubKeyOperator": "164f0ea56a96c158c2ee7f509c5dfce2689cec060c772b7106e9bf80a3943a6164baf984c4ca88979a35527f87b77ae2", -"votingAddress": "6CT5egERXWGQSMmJ2E4vF3p7QAz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1424334a16249d10bb989e2ffb5167a1ad62bec68935bc05149d9e0bf119dd55", -"confirmedHash": "594c6c569985d30aac5c8e0855f24763ffa2355399a5ad040300000000000000", -"service": "00000000000000000000ffff3353eacb", -"pubKeyOperator": "8d59f1490ef664cc4967205bb1803f0cac5705c75bc06ad3fc45a4bb28496b191c362d3a084d852fdf5d8309cdef9ab1", -"votingAddress": "WZroqbchqsgpkCHz6VBu3U3qzKu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "143004a817007b774433a0915dae65c4569779780dc7718fecc0691b47c2d605", -"confirmedHash": "12687a2c291cdf0465b65fb9d57a97314059c49cc7bc21ef0200000000000000", -"service": "00000000000000000000ffff52d315bd", -"pubKeyOperator": "146de9f1bdacddddd3161dc2bca21e0f5432290b761967edc92e670df9fcbdf1e476f81c4c2f4d3146fff6c361c40631", -"votingAddress": "fgKodGT39bj1PkzgYScEY6qitwc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1433610c017f343277ca99da9b6946d03bf1f5a0ae61305787be7b075ecbc2a1", -"confirmedHash": "3d60e8706565118e284dbcb1a219a32b00478ca9cb5dc52d0f00000000000000", -"service": "00000000000000000000ffffa516e946", -"pubKeyOperator": "0f632192b8c313743474a20ba23c22d4b93c69b38090bf43ba1571651f4ab5eb0842341ae14a33aed5a66814863ee725", -"votingAddress": "op6o4vVRffrJL8zCDdGwKyzPQQB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1434ae84822cf8cba7178fb82e768c9778989acb88775f4dfd74ff3961bc995b", -"confirmedHash": "2b65c783dec6e9411c1a9cb063ae05b0de3199c8037360240500000000000000", -"service": "00000000000000000000ffff55d1f22d", -"pubKeyOperator": "8e1fbec112bc165a30db65e2bfbde2459fad2a590bcdca6c2350355ab9920c7db88655ac6ac25ed190f8e58900cfa507", -"votingAddress": "3MXVGtLyxZBEUPdeugEhcyZJbmHn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "14530119550346ff134e0e58c1e89907afc167f1084eabc4c9bbdd45b9c8cc8c", -"confirmedHash": "29ced6e37b3d18639a203801e9a0cb5b4d0255de544a779b3800000000000000", -"service": "00000000000000000000ffff55d1f159", -"pubKeyOperator": "82127c28d09808f3d8ff5e660e83d2d2f0499c6b710318847c152c47ab402a3bdd436489dd740e27b37e0f350d5f3f2c", -"votingAddress": "34NVcdxWYQaMR52M2MoYqbDq99Zr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "145a2b8e4528ac412a1518ef8c7ccab35f49f4198fb77a0f5679bd4ba4245b7d", -"confirmedHash": "b097f3b415f40922a3621239067945aea491d8d4e16698b03500000000000000", -"service": "00000000000000000000ffffb9f27015", -"pubKeyOperator": "0ddf4a7a54d8a7b7ea72831a41963e5abd1e8684bca2cdcdb807d6beb60180455c232ca866c6b6d7ec1e8d3de31faa6d", -"votingAddress": "43xB467b6EJ4vc6NYaFo1NcXbg3z", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "146fb86649211806d914fba84e334fc4418b677236e36ca90931fc90ec368a23", -"confirmedHash": "d56fa840a23ec20122b1c62bea934e5c6de1e8d69a8556281000000000000000", -"service": "00000000000000000000ffff68eea7d3", -"pubKeyOperator": "8ae0877a3b3d4594ca7315863ca78e87e5fccb2cd9a7954d1dac64b93f7a6fe9e9a28a860c84e1a1b52b6c2a1ebdcc4f", -"votingAddress": "2AoqX8Br26o5oZjJt8dnJxFy2Xo5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "14a58bc65b63ac4c0442a8b5359a98a3388f18b94bf5087a860366d71701bbd1", -"confirmedHash": "7d9607ef96daeadc0ffcf361e1110c0bc620e2b9802d61483c00000000000000", -"service": "00000000000000000000ffffb23ed295", -"pubKeyOperator": "01d01956ecf7ae766812f2cddde45062887e12f68288b19d5c55b7016f9d8957da86655e4f3f4f569b626586cd2fcdd9", -"votingAddress": "3v3LMsf3TzYwmNUwTiax8kAEr8bs", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "14c7cdc1e8355c367ba162063ca70c99ec0042304f9621f5da9694563c8b8f6c", -"confirmedHash": "546ca2ef99ffebdc41853fc79f0e9644c260ab7854295d431900000000000000", -"service": "00000000000000000000ffff52d31541", -"pubKeyOperator": "88e0b78eb3fb3407deeba0aa867d5adca36fee9ebb15bcefd7098e691f489e2df95eddcbb9f1c8d52f63573e5802c74c", -"votingAddress": "3Y9kATCFgrk2SnwE8kohsXeXWKHR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "14cfbe06e06053ff8f57f38c361e07e801e59a32d71f524f787896c1f8d742bb", -"confirmedHash": "cdd502077934e728cddac2c8d57352b412483a0d6b81e8b11e00000000000000", -"service": "00000000000000000000ffff8ac59e2d", -"pubKeyOperator": "8de502d860403d2835d7ac31a57417aa3339f7e1de365dfc65e978967f036199711b1aad26d0f2a2a564f8d73d0d4ccb", -"votingAddress": "KNuMrbdGaWcqSusxZb8SMgT3CRY", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "14cfe539dbf5f1c2c94a239e0cbe8ed1149978dcc34e22f13f89e832cdd34a13", -"confirmedHash": "b8f090de12271fb326d66fdb1dd5b663c75d7e1568ebc37a0f00000000000000", -"service": "00000000000000000000ffffbc28af44", -"pubKeyOperator": "082ee6bf5a47cc14ab839b81e3dad4ba8bd0ac74f68514536108bacb16d3d49181c9086c2da6ea3dd52ae5d1871121c2", -"votingAddress": "3X2dsBLoxYxXF75VXpgh3mT3HNUu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1507c83298047091e8fc7b2d36798df382222fab4d2c63da55303ba0c1db79b0", -"confirmedHash": "7a37e09afbf9c8e5c006ba2d60bc9a3938766c7915ad4a252700000000000000", -"service": "00000000000000000000ffffa747e709", -"pubKeyOperator": "055080d937b327b4a8e96026fccbf94d5d0a1ce0c757a81e96b90e412c260a3d5f60d34237e7c67750dd2ee517f00e89", -"votingAddress": "4WqdugLxAPtP8rkBd39v5RWdjfLL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "15084b977d008db93a3a78bac5f961b6e8a4ca3b51c428c203dacf63658bd4ad", -"confirmedHash": "2bc65a9788d57ed74f7de0d0cddc4791b3bb336b931f40ca1900000000000000", -"service": "00000000000000000000ffff33442f53", -"pubKeyOperator": "170430dd59ee0e543863b7ae7eb323b6cb53e55648f389d3fb5d9156aca0788c1abddb8a749e59c3f352b92371a0fdc5", -"votingAddress": "2pM7NNWPWnjrV9WyY8cNdcZPRrQj", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "150a9869263a1cc86e7b04f4b971f4753033485f19a3062a691fb8d415c8d924", -"confirmedHash": "d57fbac48102742cecb076cb448a36962e291769ddd8735d1300000000000000", -"service": "00000000000000000000ffff50d1eae8", -"pubKeyOperator": "0cc1efde07d031b646ffa5f7ff5bb659c98854efd79d272f584dd3746e3b5e2b3632d55062f9501609ade137c568216e", -"votingAddress": "g3wK1f4vV7qBHEf9JmeU5dKGQyu", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "153b25e9b47161106d534ea9fdaeb8dd82461f2192ec17c24a41c8566d929cb9", -"confirmedHash": "8ff653f659d4478ea4257cf726b06155732e6ac3913d54bf0e00000000000000", -"service": "00000000000000000000ffff52d31918", -"pubKeyOperator": "8eb3e59c661e5a525935d21dae4baff0b9950bb0d4dbc8b522d77d0246651b31c9471d31b233ef7df37cb401e350be8c", -"votingAddress": "3SXnPuh7x2wHELF9EhWRezumGogk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "153bee6ebed6010ecad0b205db9e5eadbf2c6454a178e07cc981f845a6a111b2", -"confirmedHash": "58cd2211d3576b50f2b46f0d6a3745b254b75da186f62be21800000000000000", -"service": "00000000000000000000ffff55d1f25b", -"pubKeyOperator": "8486c481fb61a1f9f14a5fb2ae682e1cfa67e9c7f0069c268c849927232a1b3eac8678ae62cb8566c5c516dee02a97ea", -"votingAddress": "9h6Ka5HTWMSpXztGtnF6f3yrtaH", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "15768d7aaabbc7cd7616e89a44adc95667c13143ae818e2d44a1f0b78c19915b", -"confirmedHash": "31ebf6710a6a3dd68e70b09cf32a38db886b9ccf863ba1200700000000000000", -"service": "00000000000000000000ffff310c2870", -"pubKeyOperator": "00639daa57f4ff567ed0c386637852078d8cd959d99192d778d9eea2ed882bd7b40268fc92ae2de5944056ece8181ed6", -"votingAddress": "38xkg68cXfWbXe5tzWzRwfmGuoVU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1594de96be28afcc76a0d36991286e3e6af93f72ea2f7d4db0a61e6e21b491c1", -"confirmedHash": "c6ffc730fb709c1bc4094208723511b6e6292e3eaa5deadd0500000000000000", -"service": "00000000000000000000ffff6ca083c0", -"pubKeyOperator": "89475215f7242ae8b0d91357016ef9fb367174a2b5affec16f111112c819473931c0d298f53a88d0f52f8c8e0cd15ff4", -"votingAddress": "AxAjPe6bxsD6W5qbzbbp2JVcLDB", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "15aa09d7322a59f9aa9709c97e5caa3f08c90bf9878a28978253b6c58b2320c0", -"confirmedHash": "789b8d3e5b23ebeaa0055f38c01a2265a2e0b48fc3b557280200000000000000", -"service": "00000000000000000000ffff8b3b56b8", -"pubKeyOperator": "86a62357537d9ba76de24aad053f2f13bce88ca763ba7431ee03f1a125db1806ac1767d135cdaebb6792bbd9c9b285a0", -"votingAddress": "J9mGQngRWfKUT5jwPJcXDEPYAY6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "15aa9280c9fb1296fbbdeb2e19aec312e304ebe79c28a518e0a28950dbb30c49", -"confirmedHash": "adef6067a058f6739750dcc7f741cb8def27d8a4ff1fb18f0f00000000000000", -"service": "00000000000000000000ffffc7f716bc", -"pubKeyOperator": "809c0ef7a847295a5fda3850cf60ddead94594ee763e816d2c13d02938baeacabb8156859e418f972f55e30b736d0fbf", -"votingAddress": "48AwNUZMuVEcRN324FjQjCo93cdj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "15c33c7d004137d75bb9b6b595d183ed4f0a3f86f0684876ceb362c895ffb2e5", -"confirmedHash": "2246eec2e04551f0c73502e1b39cbddbebcb475d818e81de0a00000000000000", -"service": "00000000000000000000ffff2e654ae7", -"pubKeyOperator": "98a6a87ad1ad8596ab094d259ccfbb3a0c62ebba6fa52711319e7a24bd338ccc4c3225e2f9758e65552c981f58e27438", -"votingAddress": "3kuSZ77PBEL4ka42dGKBsMhuBBWt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "15c8e0f6cf41eca63a6ddfd8a3d9a8f40df89b1a8399843f832b91acabdaf9b2", -"confirmedHash": "cff5d70d321c85cb8c24252eb26e6d8df8a4b41fff66b9571300000000000000", -"service": "00000000000000000000ffffb23febc9", -"pubKeyOperator": "9474a5a74e85a79fa0dc18bf3b5e6f0fdb017ad958fd37f52c572e778ccd77e3c316f5676f5999f692e22ec87b3189f0", -"votingAddress": "2nhZQ1ujyDvqeEj3DQZsUndgDbJT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "15d41220a8e8a539344da8d6735a70e2fd84eb1c734a2194eaf10428123a199d", -"confirmedHash": "be00c5a26e72241064fa29698d317dc3cb545936fca608dd1000000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "4FBzrUcgJG9Nfs2szMyH8iubi8By", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "15d4bd7d0a119a596016517e9fa4853015144674413acc6ffb96fe121b1b4ba1", -"confirmedHash": "ff037fca01b9ed831f56ef55062431b58d50802fa4afe7dd0b00000000000000", -"service": "00000000000000000000ffff9df5659b", -"pubKeyOperator": "174c58538dd8ce6acb94a4c6b924134eb62c449b9a424f4a363c4953f368e984549ab9c66cc2bbd8abba1a4c68fffd5f", -"votingAddress": "345PRJeD2gLWX3NuwbMoEyUUEN9n", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "15eb6c0ebd1df95b786a8fe55cf36b928b8b020a39803f544a18c60cf42761c9", -"confirmedHash": "fb288c7061f29ce5be76ab4b0cdc7e2310fdcb8fe1be082c0000000000000000", -"service": "00000000000000000000ffffc2a3bcfb", -"pubKeyOperator": "923f4136a095533e96ec31516e1119bc8a85c0f4299b04ff7a169eea548561e25ee0cc33600ce137de8502e113246115", -"votingAddress": "Zue3eTWmPkxy5Pgx7sSADSXDuhU", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "160286969e063c5c60b1207eee560aa1003d5d396b26de66dfb9cf0d06d36641", -"confirmedHash": "ba8617fb19121b6abdf5a7330efb926c72fce3cbb5c086822000000000000000", -"service": "00000000000000000000ffffbcf4750c", -"pubKeyOperator": "0a5fe8f7f28eb4d8ed9290b7280810953d1548d19277b24bd63a4f6e945e909638b3bc6f2cc0075496edd18718c0f3a1", -"votingAddress": "2tP36tr7shzRRCFed3H6tPmg1yUu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "160944c1ef041805cb7fdf11c98483065d493ae31bb294af8b430443525440dd", -"confirmedHash": "599380850a553b01b77e357b2841c778834d35b813bdea0e0d00000000000000", -"service": "00000000000000000000ffff55d1f102", -"pubKeyOperator": "16feca1d699d6c9803448ce180bae228dc32d23ec31cc7337d97aa18c26052cd59a12ebdade1e05f0ee3528b3c11f65e", -"votingAddress": "38uDdZLUudzg4WuUQxWrsEMzkXfV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1611619fdf3a4c910de9ae663580a3a8536299aeacf10f7716700883a72ba292", -"confirmedHash": "b864eca89e4e628c9cd3b40ba6f50257b644d9d3a8d4b8d40a00000000000000", -"service": "00000000000000000000ffffbca62435", -"pubKeyOperator": "963f1ae1eba2e5802c082abb1afe43c073ca86f6a9b1bc64a16b894640b4525daa58dce3d9c552aa175e05f56f84a83b", -"votingAddress": "4V88qoSahxwKa3Y3r8fqtUXvMyW2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1613fa6f5a9151e214e34165b3d1a56e6591a94e2f96b24911314e84926942d2", -"confirmedHash": "06063039de00dca463cd44b7aba4eda9677f9e8f374e0c772600000000000000", -"service": "00000000000000000000ffff8e5d92b3", -"pubKeyOperator": "86c4c09198d62fcf414ec69eb825755722a613537a988c3f26529952164b68c3f1d71eaa7edaf0494080b9a654cf2084", -"votingAddress": "2k45xpQA3KEHYVCne1pbyUnnwFVh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "16439c4b0c097e0e3ce51b49ec1929ac9f41c177acfac21966feea07198232c6", -"confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", -"service": "00000000000000000000ffffc3c915a3", -"pubKeyOperator": "91a313e3872e5591486efe4dc41425d4591cce36098758a32851b3461ff2fedb4d81f909fb258f35eceeec2b40672e62", -"votingAddress": "2c3ZMq4LUTSKY3iqY3VX5JjpHy8w", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "164b9f5d824e0265842f05302869d5f1c6599c5112cf51d7901712f833dad726", -"confirmedHash": "6e801e80ff1e9b5a1ddc82625666c97778c98b8d553645b41100000000000000", -"service": "00000000000000000000ffff80c7360a", -"pubKeyOperator": "89ca6cd16f8be95689b4d37a3cb279180ca543007fbf24f8f026f51c7340539be24d95be325bdafe99dc27da44b0b743", -"votingAddress": "3PPZX7aH8L9FMc2whWV2ud5B94d7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "164fa2bcf29e97b757cbcbfde38969521f6e8a644a06bbbc2e2e3c63d2936850", -"confirmedHash": "44a505550c28fe08cfe1f23f7bb0b1b804d9cf1847b14fda0700000000000000", -"service": "00000000000000000000ffffa877530e", -"pubKeyOperator": "8185f607effcc9dc41a09ae91df98d64c6f143d76b2424eef9133c455934ed8bbeef1563bb8c0d30b434c60806333654", -"votingAddress": "36wRrmqEfJDraYU5UbELrih9UyVb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1670931d5a5550535440f5a23f012f2343471c7555a324890aec37fbb42ff2d0", -"confirmedHash": "00960cca1bd93bdfe38eefd8f7c17d3856f416e84a85b5c63500000000000000", -"service": "00000000000000000000ffff5fd8bff9", -"pubKeyOperator": "88d3eee36d99164b00019886e84341645f28c8022fb72d9ddbc46649d97146f3bc645bc333b4c2af69f5e6f4e9cf22b4", -"votingAddress": "zSkc3bLpt6fHJUrdxDZJEKC5yrP", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1679e10c43f185b4d1d558e6ca78bbb80e2902479edd67fa1809299395895d8a", -"confirmedHash": "95f0a2365548e8274e68cda2429773162501058f9f11f84d0300000000000000", -"service": "00000000000000000000ffff9ef7cf8b", -"pubKeyOperator": "8e4e9a96f8e92d1c59004a9c41d2ab9fc1e4917e50c5d6a5316a3a016557d5f56687f4098ff3a095c0478bf6dc541df2", -"votingAddress": "32csECZfbhH3dDqj2jpb4d75Xtb2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1687d0970e383eb51f7a2706f743f4689438114d60993316c96c1d02b89a3880", -"confirmedHash": "5b808153a76217309aa43155b072787ff5cbaf145e6074731000000000000000", -"service": "00000000000000000000ffffc7f71d6e", -"pubKeyOperator": "185adf651c23d0b51170e83494333624d39ef56c3b7fdede54af8b90ee313e23e4790fb4a4e305e590e3d3d17a4c30a8", -"votingAddress": "2Yi5u3KJPzX6LACTzyMxuZJeE3j8", -"isValid": true, -"updateHeight": 1760952, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "168815dd8f08954cc6cb34a9ab5a187a2e45fe3a94d1d0ab8f190634cb2e6336", -"confirmedHash": "8065060354a9b7f656aae230522c37a5d8c82514a46b88510c00000000000000", -"service": "00000000000000000000ffff951c9a33", -"pubKeyOperator": "8da5f8c2edc89cdcb0bbef9a0cd815f77aa51e6af66ac3aac4209cc22873d924b43b4ffe8930f510918fb46ac8c096e1", -"votingAddress": "3m7tqjCpJxjD1nLkbK5MA6GNnVZc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "169c19876cb44fa9b2550140d485c9cbeabaf5fd1783f26b46224891f1d5237f", -"confirmedHash": "980af5e950dce6c87657a8d459aedfcdf087e395370552491400000000000000", -"service": "00000000000000000000ffff8b3b165f", -"pubKeyOperator": "0112e706a68f8eeb72617366b7ba7bf26bda65cde6c9ca7ff2a43a458e468a01a3cf86be865c74419f3b3d3253b78b37", -"votingAddress": "2smmiiNMQhY9zTmH5gQFZCQvnVBz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "169fd370db4bcd372ad93867dc1e8062f5051f81bd8a1052aea4fa2e8c7a76f7", -"confirmedHash": "6f35661eb995439eb16d1b4189ab525a849a1fc6fb71d9d60400000000000000", -"service": "00000000000000000000ffff369cfa45", -"pubKeyOperator": "058c5759c9b90611b496c9faa71a528267226781ab9c27b0ec1ec0996da72cad745dff8f80dbce636461eb44cfa31706", -"votingAddress": "2J5KhjRpJ1wnGMeF8GwHe1km6rgP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "16ac47566ca37dc46c885302407ef50a27689ee7436e45405afa405c0616d5a4", -"confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", -"service": "00000000000000000000ffff55d1f1ae", -"pubKeyOperator": "819165fefffc7afb12b2daac999c3e0e92972f8711d5d7e34e9d8f2cfc5d364805e2c55a7547830a3d80e7e2e985384e", -"votingAddress": "3E69GA8SCSLmmBEuQYEt8JzhQ5ce", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "16ae4116122ef65baff5bf0e4f8149138e0f14fd9a85c3cd9a42071a83927334", -"confirmedHash": "03db3b05137d1e6d9bfd1b3b142bcdcfd5c12597bb6c547d3600000000000000", -"service": "00000000000000000000ffff52d319a4", -"pubKeyOperator": "108e03fd4b6af6cdfd223f90f33a62ac84783a28a5a43f366eec81a6870b0e2c8a406b8a23d59df926365b94048c27a4", -"votingAddress": "2kzHcwrQkYACvJt4LsTVoYDf23J2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "16b8e2eb5db96f16f103d885963f24f8f3e622c7880dd24cfbce931d68380ce5", -"confirmedHash": "27bb10154e24763cae815355accb8337820d012b020b14a10000000000000000", -"service": "00000000000000000000ffffb0df84ed", -"pubKeyOperator": "9217b9d2baa591901c94b2f77426a7303d97d4174f53fd1f0f1f48bd6016672aa7d7ccf6e098b4ebdbc266b8e7b6af22", -"votingAddress": "JNoeAToWAnCC7eWZiPxti5kuz3M", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "16b94e1c88788deca4875df92062a935cf8671b39a7dfb969ed6c3f8b196c679", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d56521", -"pubKeyOperator": "143340acc6193015729f285054cf2a34d1fe52c3b36169eb1c249914d14d29c76dd3d4c0b980fa95c75589c627516433", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "16c1edf363071ec0d6436d038f2b51b3d9ec5a0d63b7fc0cb3a5a8cbdea210db", -"confirmedHash": "fd6b1568e3ec897a4394cc7dfa6d81f5005b84421636fd5b0000000000000000", -"service": "00000000000000000000ffff55d1f206", -"pubKeyOperator": "13231af24ec3acec2d46d9818e73786cc3c74f9dba271b00e5b3bc70d057101548096bb307241215d78f49a7eb06028c", -"votingAddress": "3AiHkq8o7gZFmchk47wF6E99DeXw", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "16c8e7ea0f7eca56c0cb39d4aa76c86115b9210cf3124edca844beb0e237509a", -"confirmedHash": "16c939a656540bec874aac641205a573fc55e949664cac860400000000000000", -"service": "00000000000000000000ffff2d4c5d46", -"pubKeyOperator": "060d1bc2f821b7faea0b545352d88c1a465581106613cd5e9a30f2396de78361e91e8cda5c61f006bf67064ca5a1ba94", -"votingAddress": "YTrdxKLXyLQQcMue2BR8MddL6A5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "16d1d4380b098756db27b4125ef98b97698c5934f1a80237343f102c654ef087", -"confirmedHash": "05084e24a136048e19624f24d3a1932047bced480c99c34e0c00000000000000", -"service": "00000000000000000000ffff40e160bf", -"pubKeyOperator": "12a0b19965212000e3418b98be89a0a51d24624201ea3fd6541dbbc659eb8996fad1e5e2092b350a27c3aa2cc101c3fd", -"votingAddress": "T4e9cYMWQBfFgswve8Te5BjHcyT", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "16e7175370f12ee91a8d00d3a0671f9630a5a814a4a29e9c949b6e8594b98fd8", -"confirmedHash": "86c078eb8fe2613d573e52e70a7e8d37345148be0ec7fd5d1400000000000000", -"service": "00000000000000000000ffffb9fce867", -"pubKeyOperator": "08cb64eae0149046c2bd07922b6351c14fce5f2c1dd3113fde21dbcdb45e38629847257d9f1c22efd6ca0c04a36efd08", -"votingAddress": "eGbXhYG313xENhZ9BNAsfqRsq3z", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "17078ab4abb09c859909139a02098fa665a41b68a0c7483e1b924b116fa16bd6", -"confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", -"service": "00000000000000000000ffff52d3158f", -"pubKeyOperator": "0da94600ae2577f3cebbb9f919d91438831a9d084a4153155955bdb56109c29c12a299e3263f74cbc25c9cde3e4285d4", -"votingAddress": "oB3t4vfojJrra1duLX3RcoVjCXe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1733b7da69e041491936c35644de611f9c88836dca1d8a2b134d530ee8bbf10d", -"confirmedHash": "d3406fb72d6034764586b788057c70f440663e574ea642df0500000000000000", -"service": "00000000000000000000ffffb23ee6d1", -"pubKeyOperator": "01f9689156159a0589ee46b12549b81b6d95aa67265d2c6d17f8f08c6ddb1eced316c3762f519bc1caa7007d63a5f619", -"votingAddress": "3v9nwZXkxzWGUc3fuF4mPw8Nfjfo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "173f1edd63040f945285278d83388f134678d2c02d9b7dc1d2f820cdd183f7cf", -"confirmedHash": "df90b320745db17a6cbe6891e534b35cb6246fd4f6b3b4173500000000000000", -"service": "00000000000000000000ffffcebd2061", -"pubKeyOperator": "95a5e00847669a4dde96f3bbe4373a4451706a2743f0dbe18a4687c2595891fb01c50b08d2d4233203a025b6dbfffcc0", -"votingAddress": "K62aWkshgD1giEofb491EhEywuC", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "174747cfb25de3b935d58d558d2928343e18eee50edb7bbf97aa2fb6f057f800", -"confirmedHash": "d1b7942dd1c2a7cdf8b9e0a644ee6c605f87388a5e91bc7e0000000000000000", -"service": "00000000000000000000ffffc2875840", -"pubKeyOperator": "11bb080a4f63376d41dcc49ef2f298d44a273129ab6218c3f97a4cad31fb0354e6f12ae36b9862819265a104d468272f", -"votingAddress": "2NLMsfaabsChx5cqVxTdKHuiDAs2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1747e2d7bdf16c9b40a6e6e4e469ac2cbe3c4e8796f9add5ba8372af6109cc31", -"confirmedHash": "c93bb7ef013972b6359bae93a568fe33c22e42fc047cb7530900000000000000", -"service": "00000000000000000000ffffbc2815f8", -"pubKeyOperator": "185b08eb785e8bf19b36d1756d05083f559310c7e51b0a2204270ccdb8c01b3520a3c5ee4cfc9a9d77643342acfe6f5c", -"votingAddress": "TYMz34cLkh4sdMWD5kEwXzd5UJh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1776a80f071d695577eb3cf797eaef881b4bd34044ed7de47c3b1d1b55fb1f3c", -"confirmedHash": "d22f81da6cbd1adccf2514cbed13eba5458566548c2edc4a0300000000000000", -"service": "00000000000000000000ffffc2875e94", -"pubKeyOperator": "89523c4a937195ac22fe5b77863b141ba148e9a50b528579a32aacd7a2115dd7438f2ac739bab253397c1f623ed692cd", -"votingAddress": "eNzkXhw65ZeHCVjomBGi5cTv957", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1780037b814aed2df1211e99092e75e0e1a06cec5a3a1d3b19c99fa49215633c", -"confirmedHash": "c8a4c02b005ce10b461495f8ab55cb05f568e0d3724948c30900000000000000", -"service": "00000000000000000000ffff55d1f15a", -"pubKeyOperator": "0cd65d60de99950802c094fc694688d18cb47d41c4ca22e4426467b1325a08cdabab9e4d1b63372608466ff42faed6a9", -"votingAddress": "bUEKvsu2jEgq9w2J9ZFCWpU4ABL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "178f4f2d88f887d33491652d7a32df6874a9704c5fe0dbc5226c34ec0e8ec75a", -"confirmedHash": "7d3cf2d675690981a689072dca56c7c076fffa4c16d274071b00000000000000", -"service": "00000000000000000000ffff74ca6068", -"pubKeyOperator": "8d5a1a345350220dfb51f47a2bf9951c78a3008a321067ae7d532eafa1c65a325bc3b3ab6f6d8a1c7cecf015aebe13f9", -"votingAddress": "2QRXas49ukGugExj7arN7iNh3Y5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "179429fd62c2c36f65cbd0970f958d30061946665bb84a7d281b1b1914eef747", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0ae", -"pubKeyOperator": "80e8a84293ceb212f30ae22f198bfc3f708264160fdbf84ef5d81b4623f4c80f212a263d1923c73a911e81401c383844", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "17a5f554b97848a1af0bd215f9a6c15128f08639d7b6e2559c40e071627bb9d0", -"confirmedHash": "f6bf2cf0f8ec4fdbdd197cda7ce0a659141791dff62e16ac0c00000000000000", -"service": "00000000000000000000ffff592805b9", -"pubKeyOperator": "13ee663bd2f2e456acdfd7eed3e9c537ffee8e41f445b506d5a54f2bae60e81ce417c99b42819271eb5da6a8f7aae696", -"votingAddress": "2mZSb27JEmzLmisGdycy6ZG4o2P5", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "17a7b56c0f2e957552498dcbc8635c9a5534b6dd6719d736e87f7308933b488e", -"confirmedHash": "ec8d7116601fa908fd7dc58677950532f18bc3d616ba88991500000000000000", -"service": "00000000000000000000ffffbc28be22", -"pubKeyOperator": "1113e6dada64581e5e358d28e3c8c20269ec5a6d0b01bded30bc988ebfc816cc04ca2cec66b120306209ce738f0f10a5", -"votingAddress": "2UoxyrsJY8aLacPdw7SwrhNqm5Dh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "17a9a660a5ad85deea796b80b80df6664e23bde296384fd7164d76f5c1df596d", -"confirmedHash": "402c0548a87320f6b26851267192c8c17a1ac03ee95939b10e00000000000000", -"service": "00000000000000000000ffff52d31951", -"pubKeyOperator": "85fd317689c64e445d19d4382b4726e36b113459afe198aaf4d88aeeb5b4c6b255300364f127a3fdb90bb93b6d79393d", -"votingAddress": "oEvvwpahqvhtAp7UwEnQiwsEjac", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "17ad49ab0af1d441410b0128ab7e5c5fa7b217e0380566fc84786563bed73e51", -"confirmedHash": "633222e03c2305653a68cfa80a5cc8b749bd78e965f29e130800000000000000", -"service": "00000000000000000000ffffa8eb5535", -"pubKeyOperator": "952cd22012a638b771d91c24636d48b9573463ab9f09fcf0744371199fb5e0454b05255ce6d4252876e3c58f51cefd24", -"votingAddress": "JbDH3FThCTMZCkX5DwNqyHC9Jfb", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "17b5ccb13bcfb7a7fa9e0f7b1082f49f4df66d5c6e7dac4c1513450de8cafd34", -"confirmedHash": "ef5299eb5bf09512e43079670c161a0cdb643765c46b88f70a00000000000000", -"service": "00000000000000000000ffff050243be", -"pubKeyOperator": "0384b638a81ce65256e30a33b9cb2639c7a78c4d3db49672f15990c78ef4b4ea9785556d72123177ad596747e998593c", -"votingAddress": "K6UYjKpKBEfSemGAAAY3gQGTc6w", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "17bd4294e70c5ebe12b2de719d887c8ef3f7a980469416650706e327eb3abb4d", -"confirmedHash": "13a1b473a244a2e0464eeaa38ce95ebb758a928c002aa9332b00000000000000", -"service": "00000000000000000000ffff5f553031", -"pubKeyOperator": "96a3da1d9fbc05293e475a5195d263b13666374ddd42eaf69627cf31a50d20dd418faaeeb3fe2d16fe1a985318ad6697", -"votingAddress": "2ce9EbfwRenCKhKpHfE8cxLGRS1j", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "17c32fb2e1eb16bd914f9f4ea1a18fbec52d0502b77ec0634665965cb41ffe89", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0ac", -"pubKeyOperator": "076b7b554d2dd63e8db0fcf786fab7288d44e517ee813f02beb2114fbeed4f1563bd816bae55d2931340033be5d1a0c9", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "17c46444fc040b172a0ca53f790e22b6065b468eb0a8c96f9af6c6b92a067299", -"confirmedHash": "b25647cbfff6076c91131ed01cbc30688375d35348f064730c00000000000000", -"service": "00000000000000000000ffff55d1f26e", -"pubKeyOperator": "8620aa1b0ccf6d98ca21513fe526c4952671a2b94646f86da687705043405a37ef8e4a74b15ef49390ae084d4464f616", -"votingAddress": "4X9AaoGR7zLzTiD8aZX3NycxptDc", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "17c5c6a014a1b04020c3a5ee4e50af134afa2be0bcf4347806fad09d20914858", -"confirmedHash": "a5b5da9c7f3fe19c97d5e516b081f3acb90c02e6102bfb1c3200000000000000", -"service": "00000000000000000000ffff951cc290", -"pubKeyOperator": "085b45d987caa2b9b0301286e46f3c8203376c5a40390216dc27c02e02645a2739404c00ea258d527610a34b64dda301", -"votingAddress": "2n7MxoxWVPHWbHtuazXQTwevipDP", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "17c75964ff9437fa38a3b6b96cb5896288ecc3d5d6620197c41e53e756996a14", -"confirmedHash": "71353673bf5455208c75ae2947848fa8bc664c85c1ed5a2f0f00000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "SKr1h6FWZW1f5ePXNewwrDRu2ZX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "17d696dbd4af142ebd401481efeb54e55997d2383b8c886fa37a61699c5fcccd", -"confirmedHash": "6da297df3f5b45a1496735a0fc735adcd85f322d778531c00400000000000000", -"service": "00000000000000000000ffffd4186f24", -"pubKeyOperator": "02a33ecae053566a75d558f5f5c2c0f27b9f7e63a2dca180ad6da297c77300e6481e1b4b83823ff0c68405a4d818b2c6", -"votingAddress": "FkzhazUR7aXp9JENe3R78EzGBak", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "17e71ab3880e2c66204c2ce074734adf107cc6fffe7c5ac33ab5eaa11abcabb7", -"confirmedHash": "97a83aecc1a51786d3cf8e6a0a00121ef9ca46d041c9c3df0e00000000000000", -"service": "00000000000000000000ffff52d315c2", -"pubKeyOperator": "118b2bf21cffff4781a54b5e9f3661d47a87927618de7444fefc9ad9890e28f48ce3e428e7ef06895aa7eef63ce657d3", -"votingAddress": "2etM9LwnqskZaHCnBk1jwUFtEAeR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "17e81fa5c464c117f29ac34cec5a6e7d4888aec9dcf9890d5f23a1e6f3540c62", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b058", -"pubKeyOperator": "84e1a8e8d3daa0e20c0baf92a65eb54be3dee4368a91532a55ab7fb506f186874f15b9328558c6db03ee8e7cc725044a", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "17e84dd5b6f51f12fa04e23f03d1c00c4295b286b39a4962d0c835374e961009", -"confirmedHash": "c338b6c11b3b40f146525759c04df6b90e990ba7aff2517b1d00000000000000", -"service": "00000000000000000000ffff2d4f126a", -"pubKeyOperator": "0efcc95a818dc29c962c1ac31348272ebf6726db06545b7e057c822431906cb7161218c42bbb4aa382d1b21af7c2d6f2", -"votingAddress": "3VKY6JjTNpNsRUMywzw872BDCXaJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "17f3ef49198ad2804062eb15f4949f1779441493892888f36f7e71c28053fa4c", -"confirmedHash": "80ffbd99366128aba284394b975fd0d2f3960cbd783603f11a00000000000000", -"service": "00000000000000000000ffffbca69c3a", -"pubKeyOperator": "8b1f7f9b0f4568823ee1aeedd2caf5b25e86c49a2ea6e428e50b67d3bdaaa1d63522011cfa4581797eea099694acccbe", -"votingAddress": "3zCZmquEsy5H6atmYrTQYfFUaMgh", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "180cfc3cc1559e5fc8e45c588cceba0483296268f4b022b210a96f8089706e53", -"confirmedHash": "ae2ea5adca34c03014cd2bfd8fae2533e828ffbe8cb819111000000000000000", -"service": "00000000000000000000ffff86d11407", -"pubKeyOperator": "12dc03ad9a001387194186f711f86e8218e0239dcf4bf3db50e25d6c3a0ba29bc03a2f26a111181069bc83da62bb4eed", -"votingAddress": "3gJjC4rXTsqe1wD8quaouuzksfr", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "18390474dad5325d548cc280c6c276438cec84b6697d22d1339ce3e685ad250e", -"confirmedHash": "55c0ca77c9cdec9f6efad6566e5914f881435ac8152069af0700000000000000", -"service": "00000000000000000000ffff55d1f24f", -"pubKeyOperator": "8ce2af3bcd4984357f0567fb054659643f05bb827fe12ada575c9d64b682a019b96483ba043cc707460c1ad27e575a23", -"votingAddress": "4CtbustbaUn5e98Jh3ETmAAJbPUB", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "183f20fe7111a961a68ac7a008f5113f7ab17a18a72dd6300323242b788c0cc6", -"confirmedHash": "47930554e5bb3de32a1491ab4af492fb4f53dbf2fdf961590c00000000000000", -"service": "00000000000000000000ffffa8775001", -"pubKeyOperator": "88d5436c56b01b7c44c4b15674badc3993927e316e1ef516a733bf8d53612bed7d14162519df0b6a3ce5d27487568444", -"votingAddress": "LDCWCph8SFMUj6zLEKj5qjZfTQM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "18435697ee4aa090c918739fe373ea8964b2b73c2bf07a9686fcc728e1c74e61", -"confirmedHash": "de854e32d1a96c9a01230beccebeb8c811ba081a7d0bfea61200000000000000", -"service": "00000000000000000000ffff6c3dddcb", -"pubKeyOperator": "88494fa5fee653bc859371979f3c2765927eccd2757acabd276fc515f51f0574970ed629810e672d88c56cb3a0151f46", -"votingAddress": "3F396KXiwVJQJnaCv74efsSGuhDf", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1858e4064ed6f9002e38c7e96664ba93472941ed72f891d9827f8cf51b9900f6", -"confirmedHash": "7663065cbbf7902677a10c967298014391747c792a5b04163a00000000000000", -"service": "00000000000000000000ffff2d4c5410", -"pubKeyOperator": "19fe4d72ac1393ea67b44b4a91c09600e42404059bd853e675ef59776b25f3aa705ed1d7127f3e82dfe0e0e4eb7d9e13", -"votingAddress": "23biWu1aT1HwgAAo4Nexka9ZNhz4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "185b50dbb314e308597e5c7bf2d4c5d9a6651b22072c40736af327f4b2aa11d8", -"confirmedHash": "a6b1805f070669f7b04fc1d374872ee714a156d7f9b5ed0a2000000000000000", -"service": "00000000000000000000ffff50f0106d", -"pubKeyOperator": "0be7cd290fbe9c2de8b9314c8a5bc1345816b20508e46026a512f77d00a914ac7e9f204ceed4002801bfde238a14e0f2", -"votingAddress": "3L55XzhcBYECRkxAV4sJXDv29Mth", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1879bc1feca8a3edf379adf076270dc233be4395e546157b594f68639f4e38b9", -"confirmedHash": "3e48195d02871ae8c402aa9d83dbc35aded6fb610484d1561700000000000000", -"service": "00000000000000000000ffff035d779e", -"pubKeyOperator": "19ba302e363bc1c8fcd284e1beea3600336ded9b1773f8c962a5edb25e13daa26180d037544b0510f9979728c2b3e656", -"votingAddress": "2gEBJrHv6KjX2Zjsdp1C4xAKNs8L", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "18acf3db29b692ea86718f1cfb8a3d3f83e99fe29a1a7e5164274b6883f83470", -"confirmedHash": "4eeaa083e11dc3e3043d039c227192fd62f58c917f6ecd3b0a00000000000000", -"service": "00000000000000000000ffffbc28b243", -"pubKeyOperator": "935a536da04326da4fc3ea1b62925437064fc13622b0aaed789e5fd877ae8dd65c8ab35ce52ac85bb2afcbeb1d2694f2", -"votingAddress": "WdJBVQmL2vgq7YjonHQb463d4L6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "18b0334cd1d4cc1d7ed9f484c772051abbefa71aaa40159f7b83bd2169800978", -"confirmedHash": "4c65bd1af82c19ecda08ba079660e2c89b1ca9a26c8847d03600000000000000", -"service": "00000000000000000000ffffa5e39ba9", -"pubKeyOperator": "13d525fcbcd03d6f8cba238ec5874f40671afd2741f9ed151fafcdb5275de937bd2b1d769465c73fe4bcd10b58e5b19a", -"votingAddress": "3zbg268X4AxLTei42HmVBwC3dG2s", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "18b70669fc482f5804cd102afe4b7160d896016f105e66847a0db963e4b7696d", -"confirmedHash": "6b0b7096147be77aeb538b83ca7bfedea24969c7bbe80a271400000000000000", -"service": "00000000000000000000ffff52d31519", -"pubKeyOperator": "08d3f26462607a856da1766fd97a53955540f41ac630f7ec7b93e145c6eda8ba1272b8fa92fc4ed622e646568751ecf4", -"votingAddress": "3MS12BjayRhN381HKBgpXrqd5FEE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "18b8a6bdabd69b49cacc5f7b357981d0d378d192055ff957b6684b2215c36e93", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d520a1", -"pubKeyOperator": "8d65ac8fea3170c8a2f85cba0f2ce863db83bcbccc0b9e2090421c33ff8dc8e94141b55680b69e3fd9bdede6857b4c5d", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "18c488fdd5969bf249579827cb706cda0816e5a9649894a848c4416d3a815160", -"confirmedHash": "e823832311715abf7805a6f93cb7f6602a202d914c9299fd3a00000000000000", -"service": "00000000000000000000ffff2e1ebdbd", -"pubKeyOperator": "91a36deeebf527a07183c8d4d6408b0f39b72a032f9967452de650729e9e4d1999cd56beb2d542b4305f6d73ce344108", -"votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "18c97283016766be5357bbf9aea97a434c652cbfef608e6d9ed7b4ce441ec26f", -"confirmedHash": "0af85f472932784ec1b4bd6b6077765be28d84d4b0b1bf040900000000000000", -"service": "00000000000000000000ffffbc2298f1", -"pubKeyOperator": "828302a9021161ec153a7cf02e45565c0d11a67367af968d58863650fc4e76ad938fbff818b84e18f3f2475c9a96f238", -"votingAddress": "498ytELq74g3saAzWnC8HjBYpZse", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "18ca237e699af437e740a7484ca5ae01c9c5a4aaf7de7fc3fac6b9b3f4065d13", -"confirmedHash": "bc89e1d3644686850509ab46fd9b972e457d12ccac88e56d1600000000000000", -"service": "00000000000000000000ffffb97516ec", -"pubKeyOperator": "98e819fb14b83ab5ff41d7fa67b319791ff36528225b7018d87a9ec3fb57de3f56eebdbe7c15e1d930e77f7f698514b3", -"votingAddress": "2ogrjPp6SaVHusJLGwqeCCg6Fs6z", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "18cf3d59113c3e29fe9a044ade3a6efcbee94b25742b1f4d75c59700d2a6bb7b", -"confirmedHash": "0f07293743ffccdd1bbdfda2bf273ed2ceb2f62d7a6eb2160e00000000000000", -"service": "00000000000000000000ffff453d6bde", -"pubKeyOperator": "13e63365465ef3c4fab41da760892f8164f767d27a3df4e44d1470704b43ef2586c32ef36de555638df0f09f890d0d62", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "18d4536457c3fa2ec0f77eccb6402e848f8f5f5ef3b11365d552fb6fddeccd7c", -"confirmedHash": "da25a7624473b503e918a91656c033e9ab9b5123413794543100000000000000", -"service": "00000000000000000000ffff52d315bc", -"pubKeyOperator": "9315bf078b52bc1463fd5741950912751944ce133d04ccd48ff8a7e82fcce2f5b751c4985cf5acafb0a3b02aa4a66a45", -"votingAddress": "4CzuC17Ayg8K3nmJg2aK2Cf1aQzb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "18e408729b30da08231a5361d5f7d44c6a227e30d287b2700a9370969b92b567", -"confirmedHash": "f77cb67424255330c9190a53cfcf578dc90645bd04cbae2b0400000000000000", -"service": "00000000000000000000ffff2d4d63ac", -"pubKeyOperator": "975fc6e1bc890bef30e5f8c84d2d36c438018569ab38ca037757d1c6a3e6d22722d8b82dd20ab15d700f42b226b4bfba", -"votingAddress": "c6AF1JjjcSJeZVpj2hjTcj1EShD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "18e92ae6a5ceb79afba297c2344e05df1f01c647085f9224dc9334b7fe8117c2", -"confirmedHash": "00621e6e6aab329be700c700ed704a90a6f88144ca7ad55d1700000000000000", -"service": "00000000000000000000ffff22c0bba2", -"pubKeyOperator": "8beb9ba50de265e67a9fb758ef45ea99b4e40bd021f95e226c6db1e57c2b3aa9a42008d08620a480870e43762fba5396", -"votingAddress": "42QMFJbP8C9oyzowWF4wth6sGEKC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "18ebc689375711eac5d5ac3409af87e55a47fe87c5e7526aa92f36d79c8b4a6e", -"confirmedHash": "e1906d40a291ef14eaae728bdcca1e0efbbb787ff2ed73891400000000000000", -"service": "00000000000000000000ffffbca66292", -"pubKeyOperator": "05dd9d97e21526124ad1c596421ecbcc7ca3f23fedf7f959d39aeea5102fcc551449fb04fead325b25533e4106e0fe98", -"votingAddress": "ydRGaBmXtZA4sRoEXxizWSUtaQe", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "1901c9d58038a1ddabf7fc2ba157115e78d500ba7ddcc511e56f9e1fc407b165", -"confirmedHash": "92cedf893f54efbc50bdc2f5e205a3326ab687e27c353c351400000000000000", -"service": "00000000000000000000ffffb07b39d1", -"pubKeyOperator": "040c2eeae85eda1dd8b800b2d119f482a55fa771991edffa8f95785bfdacb836709dd169a003eab1fdd15d20209d5aef", -"votingAddress": "jor2JAX8NoNQacYqpyg22nWRPP6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1903b0df5f5e41b3ab0c348f207dff75bda0c6fc5882c7d9cab956d4314b753a", -"confirmedHash": "b37d5c6757a8accf7cc47546db0a4e9f4c9f2a526804c4310d00000000000000", -"service": "00000000000000000000ffffa45cabd5", -"pubKeyOperator": "8c3ef6a93e63e18de055f68b92f3db88e290c90bde9732b7f1dc5b187b5b788f0d430c6d848e5331595393fae53397df", -"votingAddress": "7grcZ4roEEC9rMYaN3TPEAYbaRg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "190b548b5b78d4b34a684f617b4515cad3588d647d6721d64f71e3c51e04679b", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688eff6", -"pubKeyOperator": "1928403891cbc7ee5e9c8f8e6bef62b7ac125cc7c5ef0edba47f8cc6ae5c5b11dc2e6c057a0a55ed583b301ec260457d", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "191a22dbc4cd5dc5f2cd7dd9d28fea83863aa6b2ce8068390f5cd29906a63541", -"confirmedHash": "07d63872a811e9f411c7954d2d50ab61442c0deb7ef9d4da0d00000000000000", -"service": "00000000000000000000ffff8b3b4088", -"pubKeyOperator": "8734dd6cf3888f55236757d6140b7dcef62711ba8a2c730e74c129103b3c266a875fdf7b5932684d657e4d466b5cafa5", -"votingAddress": "41DS1CGRGJJChJ7AvweiHsXXsjeu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "19208b27c9bd0d2b8342af1e41c537b4a874eb8c9e9b56461331482f8347eac4", -"confirmedHash": "d5156219a10f493bb81e918e8fa8acbfbc58157206bdb1f60300000000000000", -"service": "00000000000000000000ffff8a446a3f", -"pubKeyOperator": "938cf6f56db45a6fd9885f1c0ce17536bf8b8b37fcf6e9b417dd5385d307f1d81466b689b36e40dd23180e961968b93f", -"votingAddress": "PhhBub5xeDfBSbDpxoxC8Q6zzZT", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "19297290a8dff93055945c3e6910dde4c867facd394c7aaeb90199d9c889d828", -"confirmedHash": "84d32ff784b66b6146b703043a9b2e034fe5b22174dffb570d00000000000000", -"service": "00000000000000000000ffffb05e11dc", -"pubKeyOperator": "927c876ce3519989569c590fa851f6722e3d57a203e07f5fa860616a47c918c202557dd15e96282d2e91ab0c8b2e0c15", -"votingAddress": "2qQ1BNt2JkUcqjNavT1kkb6Rzy6R", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "194414180822ba9aae0db02f36708ac0090add7f43db6c3f279adc30de9a8816", -"confirmedHash": "f142219d724bdfab00024f3cbed54a68a5d2e022ccb528120500000000000000", -"service": "00000000000000000000ffffb90536c9", -"pubKeyOperator": "17cd31c59c1cc7a832130b97f8c650ac58ab6d39d8f412a01c939d49ad064a894bb2693108ebf7e843c837bb2bde5f34", -"votingAddress": "umD8Cy6KcQ2CYHEhJE7uQbAjfLv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "194675ba71bb52cf2b5ef6ef37d3b10a26a756dbc3c60fe6d7a99a663d814af9", -"confirmedHash": "a65b2e04e704510552b4ea5aeb2935517deb29be907e45531900000000000000", -"service": "00000000000000000000ffffd418645b", -"pubKeyOperator": "8df70018970325f062d6b00f35ecff0318e7ab357664100302abcea5e86b2f199525d54cec89da48e338ccfbff3131ec", -"votingAddress": "aG4U3A27cB283mhzNcyW8zpSAgk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "194cc367a13dd39dce1ab2caeac347eac229fe91933c4141717486bc44ca3294", -"confirmedHash": "5d7ee98cf95bb5c65f39ea26113340a2dec82d9fb2902e4d1a00000000000000", -"service": "00000000000000000000ffff5fd86354", -"pubKeyOperator": "8534b5341c28f91f160b67c7f7deb077fe8303c4abb426f44428df5a9b9add8ba3fa29ba0d1a004976df3808b7304fc7", -"votingAddress": "3g2Y7zDi4uWdXuhPaJXeBAAeht7u", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "195571791dc6c2a0441f204fd845fe0ced274eee22397e4f78604ce3dfdd50de", -"confirmedHash": "ef6b14afc52a502abba8c64046079424c0ef0d185facc7470c00000000000000", -"service": "00000000000000000000ffff9f411afc", -"pubKeyOperator": "05e93e39c257c4ed59e7cc53b795b35f688b3a453b31a923c748b9e7167a05ef1500c45c946310bb34d9d6efbb255147", -"votingAddress": "3QGJamP1uBjm7GgFhZ4Qur5hYy2U", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "195b396136bdae1a238eaa97202b9744cdeb33e61632f3553927a7ac08085648", -"confirmedHash": "dab715aae3b97199e6d3dbdc3eb97788e92fb3707474819d0d00000000000000", -"service": "00000000000000000000ffff50d1e5bb", -"pubKeyOperator": "0b6f313ea23b06b04026a5dbb9f4d300588dbb941ce52df8ac009de67732ef3c891b919a2771ec16b78c04ab5a90c347", -"votingAddress": "k4STzL1Cfv9LHhzC6BwhgxQXri9", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "196f57800192da742384992e1c709ee57d48330e83ea4b5eea7ce54261fb11c3", -"confirmedHash": "4442849453753388cb443d528d1068a6520ecb8c9500b74a1900000000000000", -"service": "00000000000000000000ffffb280ef16", -"pubKeyOperator": "8119468325215d90aab89da6cfaf2862e9d899304dbc754b9659fc6465b28518545cd1c6b046d0ed06ff80823e13be2d", -"votingAddress": "C5Pt5iaUg2qs6pZqMBefAc5pcdn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "199661ccb181bdbc9f4d15689f3e295392e4e73dfc351bd678d58ae1765a4c49", -"confirmedHash": "294288135bd6e432d04d208f6de3d04cc9f2e788bc731f2e1400000000000000", -"service": "00000000000000000000ffff6c3daf3a", -"pubKeyOperator": "9966ea5585240a1b4e84751181c978d807804979dfaf635c211a110eab968f9fba63b5fa96930eaf8c94dc8e03b30dae", -"votingAddress": "4L3D2e1MC56iuXd3NBBne8vw9ty1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "19a70056b561c7380835adde9464eafb6f76ca1e6114b489c5ecadea195b3865", -"confirmedHash": "00c192ccb42a1f5ee3153ec2acf5548a7b734eb373d472560700000000000000", -"service": "00000000000000000000ffff55d1f247", -"pubKeyOperator": "176b3fb49331dfa6338dbb876cbcb5e6fee76b664ebd95fa191b26b59b04cc08190c52a9912d11bfa395cd4977becc37", -"votingAddress": "2LgKRUG4gdhaG4SvUvWyi7SCWuyG", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "19df2d9d3e240cd1bde127d228c631a636a766c2f3569099a48a6a5103235123", -"confirmedHash": "dfa1dd9c53ce5af9bf0e3a130f2c54504350080ce92fc1be0600000000000000", -"service": "00000000000000000000ffffc2875146", -"pubKeyOperator": "105d99b8e61dd1ec8a58ef97626c33dc298a711df8704a4b9e36b96e640e3bd1db58e464f724a43f1dc723e1d29c5954", -"votingAddress": "Dgwgz62S4LAk41CW5bM1a4ayC3C", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "19e08bea98acaee744011fac8db816c47f12aa9e859b81414b6bcca608f6346d", -"confirmedHash": "51595bcb1f368f956cdf33cbd3b4297e4de0a26bc922049e2f00000000000000", -"service": "00000000000000000000ffffa747479d", -"pubKeyOperator": "91181aa31939e9a0017e09d6a9774b69f61cbafabfb0bb0bb0d039f91d6132213d70e94e411c13eb1d35eae206bce33e", -"votingAddress": "3vVg4o7r7VZxjzWE6RMTvWtgCLvQ", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "19f5b9c1a969c9804ce0b8b651c115bdd7b2e86fd26524723540a15b8e783eed", -"confirmedHash": "a4da8060d9ff639f8f5826e8dca765032e9825879da82d5f0d00000000000000", -"service": "00000000000000000000ffff2cc4b7db", -"pubKeyOperator": "0ca1dca95b134471db1929e0cd2f93f065885ca008a690039f34f358ef8b5e28c65fe1839546e5ad78dad3d7aecfb30b", -"votingAddress": "9e59G3ttFEdeAHzowCNeAxk7HjJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "19fdebdb81d4b3606bed976d91d77727f388d7c891d38a27c9506cff33d3eb1c", -"confirmedHash": "62cada33ada87aaadfc09250fdc8a35a1af2e53291d92fa40e00000000000000", -"service": "00000000000000000000ffff55d1f1b5", -"pubKeyOperator": "09eb0a97e7eb2e26829d11e3702b6f190f38a205616a209592761696589b23d283a522013c6e65e91f5da0dab353c410", -"votingAddress": "27Kq5SVcMq6vA8p3qkk4kVzcMai7", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1a03e0ded674defcc460ebd91a16d07e75b6d2ee074fe210971f0d7c234d45bd", -"confirmedHash": "5e959522e57e68c7534a7b9751c294cc57208eeaac340a171300000000000000", -"service": "00000000000000000000ffffbc28e70f", -"pubKeyOperator": "114c1e474aadae7281a7a2965edd5c6215dbdfd3e64f5de720780fb036d52104c2ee69f3aa1fad0dcb9b46bd4e02503b", -"votingAddress": "2ojiTe7USAhfsux9aUFT1FjPNAjd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1a04c3dda6d48427413004d49a53c8c9779df3958b05a4ddf672813be20ba3f1", -"confirmedHash": "f307b3f63a7e3705c01be98a712b2ba2623858b2b4f41ecd0400000000000000", -"service": "00000000000000000000ffffa8eb5569", -"pubKeyOperator": "80c13ef76f7ba1c6209a0ef055bb1aed7e0d9dec8200accef43933114f29352972141d58ceadadc291c3044b75615e90", -"votingAddress": "WEqW94iGzYPnst8g8FZg2b9BKAK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1a0e52d0377f1d795aa5dca06ec9962c86239a7b87096f3f75b0b561845db434", -"confirmedHash": "4250f5c24c0dc71af36d2980c920b6853f6792d2a8b826c30700000000000000", -"service": "00000000000000000000ffff87b50fe6", -"pubKeyOperator": "0bd6a63f121ed0de1eecfb76f637056eb9cc438140f31c87a36cb510fce475f9b0d2fd9da6e2b99ba267a146ec67eb4e", -"votingAddress": "31B4Hiy5gVL4e9jnCDSSHSsUZLPF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1a33449a6c9fb6660001233509cdb67d860383d1ade4ebda91178c0952a83c7c", -"confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", -"service": "00000000000000000000ffffc2875f59", -"pubKeyOperator": "161cb3858fee597ad5393792d70db0c8aeb4c35ded31e7c3ca42be993e7a8811459788316bcf35f77799d8549675b03e", -"votingAddress": "4WHJFzgTfrNHdeboSojwkbFp8jaQ", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1a36f7c6acca78004c8c013c3de55849f5b73a7b6df3fd752b8d4b5984e15f12", -"confirmedHash": "bf666921ed37fcc81ccdb385da84f4770dc21325b6605c280900000000000000", -"service": "00000000000000000000ffff2cc251e8", -"pubKeyOperator": "890bad1082bb7110f5369e491e45713a2638ee386152857832618b0133c0e9309541bc949afa57b7ee044203c94e07a6", -"votingAddress": "37NrBhhxwQdHohij6ijPxQJgijd8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1a48fa44100405ac62ae93b9fb5ebff3b3192e0773e78f0c0f829d42846bc3a5", -"confirmedHash": "dd4e4c655d4cd47fcf67002a8a021624bc01e9244c5422372c00000000000000", -"service": "00000000000000000000ffffb90534ef", -"pubKeyOperator": "038558dbedd58a7d9278e5ae9b89786aad10d1f6b6cbcdad906d22b9be59cc7e757d34a5279b4606b222d49993a5e1f5", -"votingAddress": "4FPbNoNvfEdDoz31at6aGuoNi6q8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1a4f01158785977ac3c3d2f56b2190b434e0e4b8964176f07fcdeb956d7e59ca", -"confirmedHash": "e62c7d71e26715d3297cefcaa62955cbf012965a942edae30300000000000000", -"service": "00000000000000000000ffffa8775003", -"pubKeyOperator": "072671c967ec6f0966e953a3a77d62ade443fb7e0790e5b27c3aa6bdc5ccd34b5b4571250d57d052c30b8ed5ccb1a045", -"votingAddress": "35ShUbi1tsEeXehAWwRmsVMC1qYz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1a61080328789e3d4d026eb7c548ddf3696be3659fff826e8e21f5c80650531a", -"confirmedHash": "be9d13082d16b5592ddcd122e903d8237887f8d3f06a12aa0a00000000000000", -"service": "00000000000000000000ffff90ca6270", -"pubKeyOperator": "976d2bbee9e630af2e76500145a6f659af32596f5e2ebaee1f59b92fdd249ce0c68b60501e807b6ad320e2443b43d02e", -"votingAddress": "49P3qDc22DdrK4aTUjmnWFiNgfuN", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1a65f61ba8f614a14fbdf1dc9102aa80b09dbdc92562fcdb15381c0f000a4339", -"confirmedHash": "bc98bea07a6825c7ea9c65878a35114fc540e0e32a3ebf8c0900000000000000", -"service": "00000000000000000000ffff5fd85424", -"pubKeyOperator": "009972d27351d6194fece0a4657be2c6a7f281e2ba1d3e787c8d4d84347ecc2749f44835b5518775d3aefebedc02f244", -"votingAddress": "367ZakobLLYZnHCKVHcjhiS1Mxmd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1a691404a69623bf53860b52c91570506660ba23dfb1134e565de8bd03416ec6", -"confirmedHash": "26abb1d402046ca071cad7bac8f1437f00c1824c2ed8f1850a00000000000000", -"service": "00000000000000000000ffff9fcb8df2", -"pubKeyOperator": "91b68a54b97d58b976f94bd27097ed317a46112cd4296d9b75cdfbaebc44616cbd1298123b9f3f07753a5e2b6b5271fc", -"votingAddress": "bUwJAxW1Rr5F4yqJXoaLzvNEZKi", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "1a6d84085a4656f99e2a2de0fae336aeec574c0e226b79b5c92225ec4a865306", -"confirmedHash": "7bb58de830bb7849b7e9f2886d0c81fa9c35e4728437fddb2f00000000000000", -"service": "00000000000000000000ffff2d4d0f21", -"pubKeyOperator": "91ff2270b496261b8b98cec7e539ddd9c80a40012b5ee95879d3370e5b3f2d1ab4cfe9f5cb39c7c58d3ef5bb8111fde8", -"votingAddress": "475xm3iTofqehxBEXEFmdJvZMgNg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1a6e1efb6567aadbf834b9b3ea9e50425ec4ec2e9476635390ba172a1379602b", -"confirmedHash": "1cc49a098f3e23ebfb82eef4c9b48bf8b64fe8a9c9a177184a00000000000000", -"service": "00000000000000000000ffff951c9509", -"pubKeyOperator": "083087e7a975f24bec3db70d7978b35d2c41a6b142714257e9ed8777e428632b587c7b5d6bb9b5d33015cfe3ae548624", -"votingAddress": "4FfPA1iq7bgnYhzCo5nAxeaPj9z5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1a7c458b7d80a9ec3c32bc7bffb206889f5a7b21f00b35668d1f84d0e1b44cf2", -"confirmedHash": "8a032333dadb2c9fdf1edcc3689c2a30e3f59c51f8ce97db2d00000000000000", -"service": "00000000000000000000ffffacf57e8e", -"pubKeyOperator": "980db8f86070ef2727d3de86604e0e3b01b5e66bc9a503cd9b9babf305fbbef7325d9a78fe80df702093aba23b48b485", -"votingAddress": "tL8uqmrCHjEwnujw5BRMvuqZfQu", -"isValid": true, -"updateHeight": 1761054, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1aadcab6faf2426f9fe3190e4f2743ca203c63bd8b7cfeb6dae1b09165b0ff07", -"confirmedHash": "eed6ef72b86d8ab3d17914c8d0bf567432a6747515661d301100000000000000", -"service": "00000000000000000000ffff2d4c73f5", -"pubKeyOperator": "88eedb890856782b1e7df3a553716a714ce610530c222a4a5ba270cb2f63810a78c3183cd7e5d8008e2281659857467c", -"votingAddress": "31RBsPSg4BVFGSrim6HcSRG1PCES", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1ab8e96806531a8573c1baf4e0b214346749db6357b7dc0233dada1f284e25c6", -"confirmedHash": "78beddd755293d10ea0e5075820182fb9597525056c947681f00000000000000", -"service": "00000000000000000000ffff52d31913", -"pubKeyOperator": "12ecaf7a3c45c5b9408b5a22043d3c0bacd51b8c8d7f671a888463966a44f54fc3578eb6e91e37bef6532ca05c2cda18", -"votingAddress": "zp4V2x2E7Q22zTdzx9JN169bX5q", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1ac1a3799e0d622908ffb49cd152fee231b74d224070da63ac360769a42323f8", -"confirmedHash": "fd4904b79f40ed3e1d4f36efb712e3841acd80397fd3dc550f00000000000000", -"service": "00000000000000000000ffffa87757c4", -"pubKeyOperator": "0c106348d6b3000c8d41d80f2a3ceecb5ef1791fa4b490d439737baec101ca11baf3ab53c27503b808f367f9988c9ff2", -"votingAddress": "3QpKER1dG1EdkMrdXypZiYNAob5D", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "1ad51306c7514a77887dcfcb1c0dc0d100faeef39b14a42ac4674bce8ab912b2", -"confirmedHash": "f5afa53809cb1fe0aa8c8cf862a63c90f318236f57728f5e2400000000000000", -"service": "00000000000000000000ffff52d3155e", -"pubKeyOperator": "887888943ad54b7b05ee5b45498d51061c1718044a0cf23320a80a3c47dea091f092b7f7e318abf7a01552c1aa3c6072", -"votingAddress": "2Z4KoSENKVfwGgzT4zexxgFnT7ML", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1ad58c619597fa040eed81d197c74d8a9ca1c6ca0bcf2b6f8e6ac86b7ac0b68a", -"confirmedHash": "87bdcdcd0a07fc25f40e2d2a575ca232a2969874700b73510500000000000000", -"service": "00000000000000000000ffff03d31480", -"pubKeyOperator": "860e14ef405e0c2c6924057741eb5eb418fa57ad0ac6027dafe90e617dcb605a5c28693eec4f1e842cd164114be8362d", -"votingAddress": "3brgW5qnEWNcbWbYQ77XVziatUAp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1ae6c1ef3b3708c6f35226b144704a2ba5b3e158a21496adf98aa469979c92be", -"confirmedHash": "65849ed3af8fd99c51d3ca1cfc41de02955b98c82b9e76db0e00000000000000", -"service": "00000000000000000000ffffb2d1321e", -"pubKeyOperator": "9033402150102018f415c3339341fcd4a4485be1c5586f3e8031dcddbd54f2ed1bb03896178ee49509d826c3d4abc551", -"votingAddress": "4DmbwVUTG3qibFVrVKRbfw9rchFg", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1af27e5f413b8b879aa61850e0b8e7d1f3241ed91d7aa376725f55d78f58d811", -"confirmedHash": "ad4696c375e9b7cff59b8d1926125a3765a3e6a3d753042c3200000000000000", -"service": "00000000000000000000ffff5f550c21", -"pubKeyOperator": "8c77c140c1376380b9457b542eef5d0bf8407497d5ee298332ea35136d314e7664e86f1391b868a79052bbd29939e642", -"votingAddress": "3zjFXq3XkvYTCfpwz5erHBjeeWup", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1b3745fe41f0d8c7b0ac350a6ff79c09a8e88e9f2673ad719a429cd1cd23160d", -"confirmedHash": "c3f26b080798292b644b1b85a1872d11778465c267367eaf6100000000000000", -"service": "00000000000000000000ffff23991586", -"pubKeyOperator": "161924eedd5b03210f09243c5d86a3fc613c20cfec0894b47fe5536e1f7dd9bf7d622bbf2609c10ccc8ae95b5f342ce0", -"votingAddress": "b9G2pkZtB3oBn9aVMJ4CMfrLbge", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1b50abcd42c9f5b6807729ff798d4379170ef6a4124382be2c204d5ea220d132", -"confirmedHash": "3071d1f893d5f8daa7b7dd9d7aa51cdba7e38834ec9a23ad3700000000000000", -"service": "00000000000000000000ffff55d1f103", -"pubKeyOperator": "835bfe604b2e633573e97f8717051aec81eea1445c6a671de0a11a7030cd359007a5de28877ba8ab88ca62b2eb372726", -"votingAddress": "3nasv9Jz1cWcbf99Wg5Dh8rtQ1MH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1b56fd3a8d5858f994d795893b2e4268226458f4773d8408c3503856df71502b", -"confirmedHash": "4eedad9ac6806e3c89972ea51184c5c94b191ca1dad7680f0700000000000000", -"service": "00000000000000000000ffffbc28e716", -"pubKeyOperator": "077ca0d495806805cf8af45c253f3f00067edee340af11f2ce7538daa92cc90bd7d0869bef767c2de5541fa7a0e06610", -"votingAddress": "2PxUAgZq5wfnEMR87x1dUGVUQ6mC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1b755dd567e281f3e61bd1d8c4250b10bbf59a7a585b4e0bef443069ab4ced93", -"confirmedHash": "b380ffb4e2ea97871e1c68170a74c3d203a333b01742f5a52600000000000000", -"service": "00000000000000000000ffff26f2d37b", -"pubKeyOperator": "149e18214bddfb810492e554e1193376702cf2f586cb4a8f7c1262d7aefad240f5341b4710689882bb6d3acaec4efd2f", -"votingAddress": "3UViWenVM3FbFo3m98eufMDAUy5m", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "1b8135a14fb8eeb9a3f40339ce692bdca8368759400c93ec39fd8687a7f47ba5", -"confirmedHash": "ea0932039dcecaa090930907a7e6a9382f406d9c1f2228381e00000000000000", -"service": "00000000000000000000ffff8bb49d3b", -"pubKeyOperator": "091b80abfd9336488e3a3e39721175b8fd6577f711baba65a636ea39fe609c385ba35222d1c85c7f6d03f782647ddde4", -"votingAddress": "2UaJR9saW3DRxMgweG5bscJptjGt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1b9d48442bcbdc681e4d6af03defbeca068ebc361aa1653fe6c541dcc1b82921", -"confirmedHash": "f142219d724bdfab00024f3cbed54a68a5d2e022ccb528120500000000000000", -"service": "00000000000000000000ffff6deb4567", -"pubKeyOperator": "156eae7e848468f553c84ecd05227fdb8e6fcbe4a579bff5378958668b5c80cd96f44878df00f67886605b9beaa1071d", -"votingAddress": "32BYfGrWKPSRmvqpramMG5aG574m", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1bbc43022d497b84e5b600943b5b460751d4ce1a6a3ada92b330bdc7b3492438", -"confirmedHash": "f67d46ded8044dd724b2fc54cb3e2e9935e5503b1530a7531800000000000000", -"service": "00000000000000000000ffff5b890b1f", -"pubKeyOperator": "06b22ad4aa5e96e4dce8dc84e0984e4aeb0e35ac47d548319ecf325b8d3a471cfeab135395fd7989f89794efcb982e3b", -"votingAddress": "JqXAzyLBRXJivh67jLM4VTiS5n3", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1bc49833733de1ffdb87b0176047b312516e27505086f60600b55508d11c717d", -"confirmedHash": "0eeb81d6bdc589a1ad4e1de86fdd971a48e86dfe8b0405a60700000000000000", -"service": "00000000000000000000ffff9b8aca07", -"pubKeyOperator": "8baffbeaa23a4eef900472a009543da5be697255fa3272c38440ab6093d4c09df9fd9df2e84ff6bce66ccf7f2fb0e85f", -"votingAddress": "3qGMLuKG5oYze8Hj2PDcaewSV7u8", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1bc5fdea218ce5afed4c2c204347372669cffb89d1fe0df74a5f3a90ea80cee8", -"confirmedHash": "083f69e510e7b9d047b788db292f6f0dffc5110edb5828ee0200000000000000", -"service": "00000000000000000000ffff87b53224", -"pubKeyOperator": "0ec1cb67584a867884f0ed7e6e0885b021f3f56e3ebae4258603010884d495964243669841a20db2fc071ce479047774", -"votingAddress": "2teeeGwfW1jaxbhCi4bdKkFARwH4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1bccc4910e194970ddfff8888c1f5eee3796c948fd50e2b0df4eac274cddc9d3", -"confirmedHash": "fbe8291ab6d032ccf688e35400ef212499be6e6e985efcef0100000000000000", -"service": "00000000000000000000ffffbc2815e3", -"pubKeyOperator": "163ef59611d144854ffab3adf30aadda7426f67458823577e42506ff4a5428497e9ecd70f692f27fc319ef3573268556", -"votingAddress": "2qLmQKKbcvRmJGMCsqKipzv3xguv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1bdda8cb5e8641e9b1e49f1a229209377d1ea8fc93fc82acb49ebe65e809dde2", -"confirmedHash": "a5d5f5f090a825f6c3b57eb1d6573a6b17ef22a8703ab81e1500000000000000", -"service": "00000000000000000000ffff88f4699e", -"pubKeyOperator": "8663cf79a3e711bc18c599db3925aa884dcd01014777486043549e17ffd08bd2131006340b15ba9a7aa2336189d33af5", -"votingAddress": "2USwW3uWDn1uCYfas7AzZ3TGjnQk", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "1be5b4b0b8f7323764e4fe2da7c3aef2ff8d8eaee62126f4f84d8fb25116eff1", -"confirmedHash": "563d1e28448e78647e4f314fca555f8ba8194497c75265ab1500000000000000", -"service": "00000000000000000000ffff3625139d", -"pubKeyOperator": "8236f36607b7f422a1432200aba1737e8119a9771d903e6d7f5c0f9b28db18fe14cc5448e3d8579d176a118cd769c4db", -"votingAddress": "DERAw7rCieLtFrNrs7ZE7F5sivD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1c05a7d0ff4768985eb00156a55102b65fef1238603097c0bafccf6eb1353695", -"confirmedHash": "adcf4e76e1aa6f2eb1cb34f7b91c8b521ed65c853e8f6a570b00000000000000", -"service": "00000000000000000000ffff4e2f9443", -"pubKeyOperator": "8ab6f7dfd0e003b3bb9b4a20fe59065347d41c2ad25f8d38bd79c16d5f07f875d78f47ece6da3c3f3fb902f9522b8186", -"votingAddress": "4Pvuzvp8L8TkP7q1oFV1xbEnAHYy", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1c13cf9989aaec99da381e3dac54e4aeb20c589afacea0dc811cd0106f3534db", -"confirmedHash": "3a9a394f942e27b6a8753b1a565cabf9063f3bbf568a5de90600000000000000", -"service": "00000000000000000000ffffa2f38842", -"pubKeyOperator": "0f60df6e188e15f35fee974f8c24fba8ccb743738d3c948e6a9b45dae4fb15e6ec3d9864ba80b9ee54be10bc749e43ec", -"votingAddress": "8KTvmUkr4o8jtFdaqHJF39fofVJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1c230c6e945f8477968c09c36088951274b1e29a602a0a03ec5437d989060b34", -"confirmedHash": "3bfebb11f7c1f49fbedfa5eba3669111628f897ac5a397672400000000000000", -"service": "00000000000000000000ffffd41863d3", -"pubKeyOperator": "91acac9cfe17c21769742ccd1dd3ef72e22b287cf4d4982abf956cc314cf34839f424fb5a8e48caa98731f581ead5b3c", -"votingAddress": "4QdBxrRfUaQ5TtAeWMnzgDpY1Kw3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1c384a91ff261f66f449f34ba0dc73df8bd5ae7dd89cb8a88c4ab0a1929792a4", -"confirmedHash": "4bcd83619ca8580df81c5d5761e8236224c615e3c2e354be0100000000000000", -"service": "00000000000000000000ffff2d209a35", -"pubKeyOperator": "940821ffc45143cd4b8fb70024dbd266fa77d4d8afe3aea504fb6108726d04b093d21c894cf8dec8fd776dcb85bd2e92", -"votingAddress": "2UrmCYvS56V1XYQENJvUt1Dt9No8", -"isValid": true, -"updateHeight": 1760472, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1c67dcbcbe4f6e71b5b9b9a2d3379f09dd543f30bb963fed45adb69e1bb0b689", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff8491c84a", -"pubKeyOperator": "0eb2441fde9acc9cd176400647afda91aa655319baf771d65b2a559632218179ba571098263a66b8a8f2da28d56ab168", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1c70b05624cc1a9a435fc3a8e0d1befaf201a14902a49f169fe55064957aac53", -"confirmedHash": "315ad97da1172ad90e2aae2932e55d5607cf25e3e823aeae0f00000000000000", -"service": "00000000000000000000ffffa2138677", -"pubKeyOperator": "063a250826accf1807292d8285b29352b2bb72797d2e416bfa31f5195d0b2caac6e7c55406b8497ba2ed4f3aea7b288c", -"votingAddress": "Zyx1Q3ZrdWQi6imwGxzVC4bQSfx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1c8b153e7bfb81a175a044b1158b9223a0f949deb3030851bef3f981b5b3ed68", -"confirmedHash": "bdc51dfbe351c2695fcbf22010b5681c7adf29ffd7cfbd530700000000000000", -"service": "00000000000000000000ffff707c25d0", -"pubKeyOperator": "041dd6560ce98b0ec15906eeb8f7d2bc49a466ddb043c995156c8e13062fb3d1fd0945496ab93f14ee988f9f9c858ee3", -"votingAddress": "3Gzuz7MmoBFyKQU8fkXPLhPx1yhV", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "1cbd63621b9b64fa0e2722adcc82dee99756eafb3c51ee37e7adefbe1aa01235", -"confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", -"service": "00000000000000000000ffffb945353a", -"pubKeyOperator": "823f10ed714c41c2007a9bc91b9528b780d3eb771887ee331cbb5d9b80defb0b4a12e73a6e7ea0d65c0234bcecb7b6f4", -"votingAddress": "3KErC4wjzM2MvkPec9Rc3H4bmj7R", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1cc1a9199fa7df3ebff4ee14852388e59b8075ef5aab9275aaf60a842ada3de7", -"confirmedHash": "befe73474933bc7b3c0550758c5d95f83f7ef48e91951d110b00000000000000", -"service": "00000000000000000000ffffbc28b489", -"pubKeyOperator": "925db3ba8bd676624e29582f0cc8e6d9e60141a8f968719f786891f942b54b00e468da95151faac75db158cc2c36a460", -"votingAddress": "2uC8gCtuBvCnYXbXb3R6MwBuFojq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1cc3c83a64f01fc08d1b6e320a9ec4a9e95e034cb795e73e19e779c7bb817887", -"confirmedHash": "2a0465522ca98da7b298dd208cd3a7ad16becf7641f9e8c21200000000000000", -"service": "00000000000000000000ffff55d1f139", -"pubKeyOperator": "0d578ff1d9e092cae922eb9dc1edf2db5b64ceb4a1344487797216e7facda22dee28946c6311bb75c8db16934403c90c", -"votingAddress": "2Jnr6tKVDvemxy7bHQ5Puny7QuTT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1ccec6b37bd5e4fcc95e8d01f86cab976038c01f16b08b1d2ff543058ceca2ea", -"confirmedHash": "5cd1aa4754b4450f944aa2c0152da08d452698e9b86ed6b51400000000000000", -"service": "00000000000000000000ffffc2875b51", -"pubKeyOperator": "938ed4bcacfdeee802c2a294d18352169f9361fc030a69c5ae6adc7a87c7082d0ef522add1884a5ed2decb9cfc886bf6", -"votingAddress": "2QArxiBTVd4TBzuLC1gaZsrY3ZVa", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1cdf5742ab5b500f35a71136993c98cf8f275912f46dc7aeffa4b66828cd775d", -"confirmedHash": "fd08563c48ed50c253350d647fa3f85e7501ee78d059f2f31300000000000000", -"service": "00000000000000000000ffff3e4d9ad9", -"pubKeyOperator": "043cf67cf2bdccb76f4289f3f8ce3cba3c01f8d8fdd9d68e87e6247c8bf75b190b08cab628a88f92eee559a41b7a7dcd", -"votingAddress": "4F1F9gwYX4AWV5d8yMYUrPg22z9j", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1ce2caa930df3c412b49d5b5e751f55528fc0acb7c91f69f756eadb250f06952", -"confirmedHash": "dc393349b8ad9e42d38333e39f47f6a81484edc1f8da72540b00000000000000", -"service": "00000000000000000000ffff8ecacd62", -"pubKeyOperator": "0e71b65128c7badad38f2c1a73ddebbdb6c66adfdcc82bd72c4325163acbdc2d4bf25b3536bbafa9e9302bed3dcc35f5", -"votingAddress": "47hNuoy7zrNgTSWgL6Yrc3AWFejw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1ced11c04c33b02d954032e6a5e54cf73711cfb3d3698ec2f4bceab3544d7e85", -"confirmedHash": "6bcbc95739934227ff070c39a0f52370036c46ac6abeef330b00000000000000", -"service": "00000000000000000000ffffc21ad582", -"pubKeyOperator": "8aa642dfc6b3b6104e8f0d460ed3a0be33281fae7c7e48b2b9746910d887e910c6beb3001492e806007581b6bf9bec21", -"votingAddress": "zCeztvHCUccn6wNa61SyTRfCY6n", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1cf0519aceec51ee479ad5e66f45b57b873793d9c08cdfde3d844666a5ce6196", -"confirmedHash": "1cd63232c5aefe7a0039e0d8b7511121f867ae1c2bd1c3dc2500000000000000", -"service": "00000000000000000000ffff55d1f219", -"pubKeyOperator": "03d85dd2c2b6f5cd282faea6aac7b1e7b4a18f81fa5e0c42fa6ea9cbc4d3c2a504261961c83bef688bb7d13e0934a32f", -"votingAddress": "4MnThcM5Zjra5PCPeQQGfj9UY5GH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1d144176a74ad62d188af325ee0b4c328f63a02910a94f5bb418b7c67a10ed16", -"confirmedHash": "5cb0b5e64164d00bc3a78f2deb79290fbed2e8d97ae20d860a00000000000000", -"service": "00000000000000000000ffffc2875cd0", -"pubKeyOperator": "04ffb202b88a2add5d5b5a3db7dc1eac1e600cbbcd5a27f8e60cb63de0ec676e36672efcf926ac78cbd20ec5190142b7", -"votingAddress": "2VPVevm8tvnz5VgQzokEAVEXeJ45", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1d20ab8c31de6039867cc8f253cf3fbf8c5050d8947766da864892f06c5960f1", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0dc", -"pubKeyOperator": "1408e5737f04d6c4c31d8aae1e25b9da31d1d7ee97d615534d10bdb721109e579a423e74c8fb054b393b07dfe2f8561a", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1d25850c28db8aa9a6def5c89ab0bfdeb691a0013f7ad92f60312c5a19dddbf5", -"confirmedHash": "e53e170619f2a2368ca442448697f12921071258a1e119cd0200000000000000", -"service": "00000000000000000000ffffaa4baa87", -"pubKeyOperator": "187cbb120c1a104afe1ea464a65ca0717eeb5770887ef94fce97372d0ca4564288ec101e2ec87d365b8b0d1aee047115", -"votingAddress": "VUjiJhDBPNtvdigTk3Ue1Jjaq7r", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1d2ff4d3a3bf1bd572c153d00be0616061b4f3f2c1c5f3e8a255841a084ccaa5", -"confirmedHash": "1bf2b90cf5f3b9b0cfceb34045b33a357315dfd2fe4384860a00000000000000", -"service": "00000000000000000000ffffbc28f168", -"pubKeyOperator": "927d0053ef18f1ae6c0a2b3fd5368f315dc44ab246df97edddb5b662af91c8b80236c6e15ad7bc365bcf6fe3eb4c5355", -"votingAddress": "4AvqAKFYvPNRps5rjAuFAr2nJqvF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1d430057552512f06ef06fc321f35a9c0ef56886ee00ff6917d40dd14d3df35b", -"confirmedHash": "d1c210b7ee2ccf8d1823160a902b7da92ab42edff77299fe1100000000000000", -"service": "00000000000000000000ffff2f6eb8aa", -"pubKeyOperator": "01fc8cbb0055dadd6883b977c513c4f34be0801a98f969b5f1ca83ef8485dae17a053440f7d407ed8822a153b9dde1a3", -"votingAddress": "3YV6MQW5D5Ef7V7xf1dFGf2f9yru", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "1d4aeff3fa54ddff317a8859f7be019f267eb048badc9ad8755adac73c5ac199", -"confirmedHash": "74eeef8df9323115d4c6150616ff4f8836bb3cd60809df920f00000000000000", -"service": "00000000000000000000ffff55d1f18d", -"pubKeyOperator": "983a8ac061341935281b7a570641a0e278824da1ffb32b70195446261572af118f987823371a8c693985a0e0c3167bf9", -"votingAddress": "4Y8xMbo4ViwieNuYqnmHSSKCsoAM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1d530a9bb94b2ba98be444382ca15d539ee5b9c876cb25b075b4de9ac175a3b8", -"confirmedHash": "4f8df20618bab9c096e72d16ddc8adc9e3577c78cc77923f0e00000000000000", -"service": "00000000000000000000ffff8d5f356e", -"pubKeyOperator": "166b47689d98951ecf1ffdd2434daa265b8eb65ed73b71e8258a5f89930eb5fcdf782b95a50b4b1b63f1e75a16900ca0", -"votingAddress": "4855pPDdp64pmjhz7QwgD7YXY4N7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1d5f4c5b1e0111392259f508dfc5511a82be2a4a29b362710ebe68a1e435f977", -"confirmedHash": "1ac3f83aac8a44de9e39cefbde45dbd290938630421069a01a00000000000000", -"service": "00000000000000000000ffffa516169c", -"pubKeyOperator": "8b3435c4974cffa8cf6e9a11d9a263c7efad367c4b22fcc75507c565027b51ecb1ba2a1602d9337eb3edb037d7c03b49", -"votingAddress": "Dr5cyMb2yeXdqAyVgWbVjSiyYNy", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "1d74df3f1426ae1f3d845556bf5aeebdbedcdbc58ab701eccf84ad323a8f898c", -"confirmedHash": "7b5f7c5ae189b2f3745c2ea820f393ca50c828496f94d3870400000000000000", -"service": "00000000000000000000ffffb23eabe3", -"pubKeyOperator": "0849e224037779c2c0972462899be8973a0bb64d81e7f9d499d3d75e77391baef6469ccffcbbaeec012888a2cfd3b278", -"votingAddress": "2Sxx21py8Mk4PwhwyBwyrU8oBmNh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1d8c32ccf3dab98f0f7da6d51f7c4f5b3a45e994c4e04d2d0ac8bba54e66149e", -"confirmedHash": "a8b19aa14d697f8f5259100cc4fec4118a77dffa8c6bfde32100000000000000", -"service": "00000000000000000000ffffa8775009", -"pubKeyOperator": "85b29951c7b78191e7361494b579188e02c02f80109baf06ba140249c331c28123e67ba122b44a5c7082316ae9e0aaaf", -"votingAddress": "3cQxhih6WeKeuM8uFtcuMJEHwbqd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1da860ff4af4786dcaf560961c2f908e47bf9316753a0ac1cb534e59db19eaeb", -"confirmedHash": "f25a692d1d1e1190f4cda6af874db0b0cbe59bd4e84caef62800000000000000", -"service": "00000000000000000000ffff5d154cb9", -"pubKeyOperator": "098c579177d294eea2f2f7ea7972365e80fe6abc12a876222ebf6da31bdc4e8768a50739af2eae4bb961270874a8cdd0", -"votingAddress": "297MEk4PAyH6jejpLFsKAGkSVWRp", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "1dabe1d32b66a8da4bc8a3bb483181c164d60662602fdad92025df481b1aaf5b", -"confirmedHash": "6d9fc30ebec8be0593103aa0a211a852f86e496432e78aa30400000000000000", -"service": "00000000000000000000ffff2d20986b", -"pubKeyOperator": "861cc1f7901e70ba1f8a3e994ffecd96a4c49441c3c770e00242fe64f2aaa53336f4393ba6b7e825e656f12e37f62653", -"votingAddress": "3BHsqHZo6hStYjZPU6AxbthV6HPH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1dae0562add412b8ffc20aea22daeb376f0628d23727b0816ad2a47f1daaa8af", -"confirmedHash": "560b3944219febad69a69fc4039b7bc9af1ac86dbe2050ed0200000000000000", -"service": "00000000000000000000ffff55d1f23f", -"pubKeyOperator": "1236a311ceaaf7ec1db7fdcae75db789a407e182b66056e6d2446e4e824a57b2aa0f72deabcbc29ad8897c75f3bf76e1", -"votingAddress": "2iH3x2yyrqocCYfcWKjnWXotSELc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1db75fc8dd1d2c9e4a40267f377ffb950c41ddc60ce6ae03ba85a99c55eebc8a", -"confirmedHash": "7c98fa9d74b035b7f4b64e9133f602e8a0e14dfabf9a51051600000000000000", -"service": "00000000000000000000ffff55d1f21d", -"pubKeyOperator": "19caf6e624b23863cf713d186cf4b8dcecea8e3054fd355253105885f06410aa4c866165d0d1bd924890ebad0c4fa5ba", -"votingAddress": "HVPLtBgXc9Rt1zK4AP6tVh5DJ8Y", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1db8f1562fc6222f785a079dfbe5971e1d0afabfbea062ba60f861adf88b36b5", -"confirmedHash": "bd31f35c5cedbf07c6ffa716f2a3acf8f725ab42af8758740500000000000000", -"service": "00000000000000000000ffffc11d392f", -"pubKeyOperator": "03b87f62f3951c32002bc926f2367d2251df0fa61a6189c72f0e1368187a953de35b0416682e0901144f1f8014ad0a46", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1dc2d226001a42d676b9d6d0cf9389f71c37fc68d85d223f0fdf7a9f1251769a", -"confirmedHash": "93c12705f98a0f2820aaf1e1475f2eac7ee1d326bd5860ed0e00000000000000", -"service": "00000000000000000000ffffa123528b", -"pubKeyOperator": "1786f8a7d83b21e2667c8ac1712d64db7d64df60f465cf9540839f9e7c3d0bb3d2e5b382930aa4a2a6f3432a55c1b8e1", -"votingAddress": "F3BhCDY6aSFeD5C61NpBTmZdM3m", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1dc7c6b0318a7a01864c834c3f6f577985e79c56f17fc12f502ce204f98aa5d6", -"confirmedHash": "560d299a6fe8bca9767de9ef70d11b84472cee7abbde7f7c0500000000000000", -"service": "00000000000000000000ffffc11d3915", -"pubKeyOperator": "006d228373d45edc9dc163ae9a0ae9c23c7c3e6b15eaa93a73d145891d77ed0088ddf44594075428a5aaa3dbd05b607c", -"votingAddress": "B2QC63TCXYsHi6Hz7GW6LzRm239", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1de8b128d9127566188557eb4703b494cc20b42bcdb9e73e44fe40bfcd1b684c", -"confirmedHash": "f320c62d8c6ba5dc78bb1701ee41cf6a73f52e0d932f20640f00000000000000", -"service": "00000000000000000000ffff8b3b9e6f", -"pubKeyOperator": "96b7e4f9ca9af7d1b881447ab40b81d1204226db7942f9ecd8631429b232f2c362817a55e691968a5ad13f5c827891b2", -"votingAddress": "D24w6vid743chv3JDMUPSZum3qF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1df872a04c29de4154ad0ee4976481d49110a8713654eddeec02de7fdd707dde", -"confirmedHash": "29ced6e37b3d18639a203801e9a0cb5b4d0255de544a779b3800000000000000", -"service": "00000000000000000000ffff52d31970", -"pubKeyOperator": "1354b3a46ed641c54b00b9365a602aacce704ddf0a7c3b492f56cc7694be19022f50360b3d88ee41c1d0fe25e37c2ee2", -"votingAddress": "47arJ2bXma9QbQRNHy31U6L7taut", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1e25d8243886ac0b6f75ed2906e3f4e7cb5edc64baa71445d493c9457e71517c", -"confirmedHash": "3a98afcd4f76e62a7dfcff6f27ae9c084d9fc139dba24aac1900000000000000", -"service": "00000000000000000000ffff52d31954", -"pubKeyOperator": "8111e4a1470fde201e1f4f7d116ada6846d6e5c150e6c5fa27ed37f73feaaa70dd76781799a2bdc01868e7a2e983b470", -"votingAddress": "3ZCijTZSdBCGMyJtETXTuBTtq1Vi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1e2bfd5611895dde42e3c634185ed69803819f464586999b49ef8810588c3ddf", -"confirmedHash": "6075bb41dde2b01a88899a598b842c881c4f0348a679bedb0000000000000000", -"service": "00000000000000000000ffff2e04d9e9", -"pubKeyOperator": "11c34092e69a3022a74aede93adeefafab6e098a57779f13489a6a3ca13c05772c41b89394dfa0214f1adb08a29b1b6f", -"votingAddress": "3PxpHSYD2rCF4So6Kqm7W1mE7bHd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1e353bd659275d47c94ceed14d634a07330f77d8ce0781bfae46aefc9f138fdb", -"confirmedHash": "9e617a8bb57b237c9d1273971e81d810358ed6fe9033de920f00000000000000", -"service": "00000000000000000000ffff2d3f085a", -"pubKeyOperator": "0f6d5df49c15bc66a46699eae85efecf9eb91b0b571dbcf3684e6ca9a898ec9290fce2011ebcc070fca5252c21bf5057", -"votingAddress": "4XqXTKd7Q511Y4sYurhx9S9gUvVM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1e50eb5010d425f30e14e7e4ce6f8df182a0abfa29395cecef7cd770d4c741cd", -"confirmedHash": "566131c4543b49f631343e6dd196f2f5acac9226856fbda61300000000000000", -"service": "00000000000000000000ffffbce29cdc", -"pubKeyOperator": "95e7c2398e85daf544e2d10bc05b42918d3499526ac9bb93a1a2733a1eca5f08ed654a6236b0f6e44ed7771959222a45", -"votingAddress": "4Qan2AK9jJoqMpZdNU4ZzMHHaNHa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1e683c0b90432927600d70f9099ff3f59a2ca742e418d6fcc3f4d21bacfb9b3b", -"confirmedHash": "c300a7458668f0a1f4351b591d1a6c3e8519722ba2c9e1831300000000000000", -"service": "00000000000000000000ffffc0f8b12e", -"pubKeyOperator": "023b711647399f1eca2fe7387d8e024500f623e4d24906da6fc415fcf4d4d0bf484b1d4d31f34b528f9cecf3d4e500f3", -"votingAddress": "3gYxkydYhUZ492xUe9K2ghYjvAXn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1e6e60552e888619e56540bc26ee4ec84737e80ec359176e8dc461e650ad73ec", -"confirmedHash": "53d52c2711c42d389e6745d5cdb5a707603a4844c9f113820500000000000000", -"service": "00000000000000000000ffffd4186eed", -"pubKeyOperator": "172a3ce3331c443ae0bc89da37a86d52856654cf3b81fa304b75b399b71052a83d040be5de2aa7cd896337764c76cd46", -"votingAddress": "t23CurqYJNev3Z5nGPDpHGggDnn", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1e8882016dc4eb672b92fe2ca5cfe7a77df98f86e9795951ab659891919edab5", -"confirmedHash": "dd00148e7f6a7fdd7eb196fe4951d63f90c3323998eb07312900000000000000", -"service": "00000000000000000000ffff52d315b0", -"pubKeyOperator": "00451bf80050d40a9d7c2b23f0bbac25d82581e08d74eaade0fe44f280abbefb843e4ae8a3316f4667ad20ec8b032f30", -"votingAddress": "NBJ3jwsFsBLbr8DoCoPtUztkiAo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1e9684c22ea915efed5b3b746dbcd1417502a559ba1a4c60300128a1b9e427c3", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff8491c95b", -"pubKeyOperator": "14ddabb7d1657d526554c4840c3280bbd4000b6632f14459959fa0ebb1c0accc2d02e5fc9e77e1c5d3f018b443f5416e", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1e98492bd0c0ecb9a09c568fd24e60868467ad8cf4e5d571c07fa9f708047075", -"confirmedHash": "710559b6a9e0f5222af0758ff0b58cba3d33fff34dc293001e00000000000000", -"service": "00000000000000000000ffff5fb73392", -"pubKeyOperator": "02d25f24c33455868d248d18b5cd6f8b32726cadc994c9cba1ff1780dd07aa93c14a45a6d5dacb38055fd46e1ba39739", -"votingAddress": "3RhdynBMCwQehK3fL1powPxECtt5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1e9baf39ffa35fe6b47e7a48c770b733355a109765ea9f3efb1f77feae90fbb5", -"confirmedHash": "27d96ead9ca4d56e2571e0186b5739d490a81c8801a618040700000000000000", -"service": "00000000000000000000ffffd161b1f3", -"pubKeyOperator": "0570734faff85cd48adf45379ebccdcf41ae4fe84db10595fbec58d8c0b948a896cccf8f2753680c8161c2b19fffacf6", -"votingAddress": "yA7aFMUypBUL4uycwVKU62M3wsQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1eba9e1e35e8f5e2fd96bd0aa3b6861964b2c674a5db927f6523d1ee9066fabc", -"confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", -"service": "00000000000000000000ffff52d3158e", -"pubKeyOperator": "8f0343607b479bb9a910909700e0824e4c223fe0dfc4c43a9f9d4ffad4cb2a3e44071f4e22af03003e2aa7a8c99c0cc5", -"votingAddress": "3gQ9vUvXQyVemuZfUrAjBwpxnesz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1eecc3b36a4a4174478fe18e743b7fdc0fe7b1ccd2d7b5cf6fc31bf0f3e90814", -"confirmedHash": "2119ef7410329e38a031777ad1259d6c43210ec610f78d263100000000000000", -"service": "00000000000000000000ffff8a4498b9", -"pubKeyOperator": "0f9505e11a16730972cc26658e4f9e2f95bd77d5512598e8a33942c15587b5e97e820490316a12a65a716d0dc6880987", -"votingAddress": "XCrqqBKpsrGNSDSDXqumQUn4MQh", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "1efb2d90c07ccea2fa3418f89c3c351bb7626f890670b7f27a6bd4239ad5b9e8", -"confirmedHash": "a1c4e4958182fbba80b3177bca14b06996e592fc29d32d414100000000000000", -"service": "00000000000000000000ffff52d31916", -"pubKeyOperator": "95d3c42c3ac01e0410c2582654579bcdd2bb2036fc2b2e880a7ce44c538d56dda48b57c8ab4d1b285b5ce64f2505b732", -"votingAddress": "2sn4xAAwrSiE7rsvPaZfYC2NSM86", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1f0f40d52a35fd8f02321dfdba0a47a64a86b8260dc74fdab30220554a84a444", -"confirmedHash": "2492ea3b729d90f88b5f842cc4991378f8944e4375a696250000000000000000", -"service": "00000000000000000000ffffb23fec6e", -"pubKeyOperator": "9834170a604464e3878387c8b2882c435a661635bf31b48e2d8a7aa1f08b6ed5ea9c45efea20d8aa189b8711f80cee4d", -"votingAddress": "4MNV1o4D1Bxopp9sTpteHxWvJV1y", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1f2c799ab6c564249f1ca0e664f0183aaffdc61bbdee8c3b83053cc6cde7d287", -"confirmedHash": "35465694ed14e8ab1990962004e7aeac367fba7e289ee42a1400000000000000", -"service": "00000000000000000000ffff1f0a6124", -"pubKeyOperator": "027e0ca0abb2cf196ed67893d2f17a1f46e819db294726fe982d99aafd9fe61ee6227fe8786bdab808355164a4f42bf9", -"votingAddress": "tZn3jAvkVhgLKzzrZnbC2DkwsSk", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1f497508d4d40a4d7bc459855a4e4d4608a54bdd4c4864d6ad19070550dc2cd4", -"confirmedHash": "38a4e4e94b69ab2bf9ee536b5db1260d2d2ae057355895681d00000000000000", -"service": "00000000000000000000ffff80c7b59f", -"pubKeyOperator": "0b687e6ebffab388cc246217d5ad0554c9d59e1351ebaa49761fdf804b91466bcb78e778f5536d1f91304a31a28e9cce", -"votingAddress": "BRjmb4ruLMAdVDf1Y9kpUKFyHsG", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "1f500cc06f846d129710883c8920a8ee60742fc35e5b4772bf33481f16ffd488", -"confirmedHash": "d22f81da6cbd1adccf2514cbed13eba5458566548c2edc4a0300000000000000", -"service": "00000000000000000000ffff50d1ee96", -"pubKeyOperator": "02c4cb497f4a7421b7ecaabb4a7aeb14da31991e2af471e3433e05ae2e880e58f96bd3e4cdc38e219e2865d692bf1edb", -"votingAddress": "49czXgFM2kSCCBD2jDvkhMte9ZZH", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1f66595d39ec5df33317d4005440d49c1013b08113a1fe758657bad9f329fec4", -"confirmedHash": "34e19b60aca9eb0e7815503de513ea081442c6fa6415823b0600000000000000", -"service": "00000000000000000000ffff58630b06", -"pubKeyOperator": "91c8ef2de16f7794006f9ce423fc8d5d71269fa480b67a6f2076eec399eb7a890bcb306ea42c623a2f07e4eeaa264581", -"votingAddress": "2UMvL8bjTyzD5beGwsYbL2nEGhHt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1f676ede3eddd2189fd7ee3c1039f5614a77246a6714fba2c969442b38fba451", -"confirmedHash": "436016906e68ec8344afa403a6489e8251f03835b10f3e532200000000000000", -"service": "00000000000000000000ffffb23e3b3e", -"pubKeyOperator": "00223eb86a92c58d7d528bbe7c5ad99e77b51ff5ed81425a8a460916d068bb42fd7d8e26f0ea475150de79cf20ca8ee7", -"votingAddress": "2TNxEpmkfr4MJXssog22yUrAEACc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1f77da0b649bbfadb1e1f29b91ba0b783cfbe6dae8270d17bdec26d749f5200a", -"confirmedHash": "6c06c7238a59b02cfffa6df275bb263cc492b8a7576c5aba3600000000000000", -"service": "00000000000000000000ffffc38064d0", -"pubKeyOperator": "933d07b682629d89f084467aad80deff182f52f5e6a930f184a9ce747cedb732178be7a8cc0f65b5905dc7020ea4aac1", -"votingAddress": "4HEyEzxBmYHR1WHY7au54Gz6r1wF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1f800d072f188325ef3211dbd529bae044d151145e040a06468d2b7d0be3b4bf", -"confirmedHash": "11a8c8a8e63dd7564218f519f64c2e32e5e52ad3032d23150e00000000000000", -"service": "00000000000000000000ffff2d20930d", -"pubKeyOperator": "0ca6c2cfef46803dfff341f7a4319d3e6e2f2abeb0bf4a976f95298b1a343f073ec8e5d83e58f1014fe690a7066b1a66", -"votingAddress": "3ViZgD9e9UWTJ4kCWM7jatXnT4JH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1f8ba844f5b61ff6e703dd1939bf0d1f470cb71df365c40efb07180659e9935a", -"confirmedHash": "8b763d49a209ac48f25c176ba9869924ec3992fe76a273c10500000000000000", -"service": "00000000000000000000ffff55d1f184", -"pubKeyOperator": "8b478f6dfef6bc8f05856226ade3e75d6dfa35f1821d18ff6e3aa75f4efd87d0ecb0da60d312d52b33c6c24835671614", -"votingAddress": "4QHMQZabHE7RntW9rCVEzRAugTXJ", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1f8cdcfbc315cfc4f351d0fd76e947c021624197ad3962413465ff9632f7efe4", -"confirmedHash": "e1a087a733727100bc5e5baa15a078bd0f37d7eee4d5fcd03100000000000000", -"service": "00000000000000000000ffff5eb0ee0f", -"pubKeyOperator": "0d820da6d08020dec68114593ce7ee23bd2bca7b2e178b20ab6ecd03994308721295356cf53b2d02d1401f193ac56ef8", -"votingAddress": "2rzCWTFW2Hxo5exmyeMbZGKy7NSJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1f916d2a811f834a97c28b61eaf2f94b3a10d6307bb5d6b54193014304d023f2", -"confirmedHash": "830a3b1221e4d8796fa83cd3b04dad77db0635da2397222f1100000000000000", -"service": "00000000000000000000ffffa7b3459c", -"pubKeyOperator": "112e294ae54479b7758a31ce38c979e730187efba725d68863a661af2f22f1eeefa662d00cf48327807a20e2bfa09bb7", -"votingAddress": "3bikWr8W1spheaSxXVzzMAiyEshR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1facf62ca82c7547a68d363d71d32d0c89d951ad24fe57e339be75fff428aa5c", -"confirmedHash": "c830d3e64b1dfe74fc95407bbe46f8fce9e0d719e75d911c1a00000000000000", -"service": "00000000000000000000ffff05b5ca2d", -"pubKeyOperator": "12cee758cde13d1ff376163c23c266cd18c7c7ee2010c6d7990d7e6df6c66c3ce490f6d8ff9957705889e095d829dd1d", -"votingAddress": "4Fgz5dbdRmsV3BDUJwa9r3vgJ8D6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1fb2c0297c0fa3bfe9e94b88e119091deb94e70d8dfde5916541be753a2b1287", -"confirmedHash": "e3fd755a487a3fb4f9b2fd3271b5dbcba437312b371101e40000000000000000", -"service": "00000000000000000000ffff8d5f356c", -"pubKeyOperator": "05b4849a4225f6b57ee74053720435b191428926b9e674cbc53fdfc4921313a7ac18ceda67125d87d7824d214fe291bc", -"votingAddress": "36NE3YQAwJruw8tn1Nrz4icCaoqS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1fc8a88b78f530e88d1708b957c50af994e442b1ea5d2cae4f9dc6bbdb5ac2f7", -"confirmedHash": "8d99bfd2015f561ace1ebee9d522cb9102a3ca9de62c03370400000000000000", -"service": "00000000000000000000ffffbc28f17a", -"pubKeyOperator": "132619e2a85f960c4d643cdc1d8433d0469a2b17931a117da3f1a33b38d8d307cbc21b9439dd43f14ed6113b05ebe8d0", -"votingAddress": "3QKmKAQs93Eunuko7QWeVPNCie2T", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "1fd0af3b82e4700b8290e06e1b0507c45c28233bef9773665ee773389f98396a", -"confirmedHash": "43b3caf59cbc5331ce20c7c1be57c84ded106d611d049e4f0000000000000000", -"service": "00000000000000000000ffffb07b39dd", -"pubKeyOperator": "84e18901a924ed0509f5c10205dd71a11be4fdb4252050624eb5d9727f0901be3c4aef399e14e0adf3427df9798c5586", -"votingAddress": "EybkGoX5HyinzpsmDQBu4cSQ5At", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1fd69ae8b7d73e2c9fe36f125edbf7b052361bd35c35868413f4d33e3584f42e", -"confirmedHash": "2d15f4ff7b8e6db5159168da6717119ca444dad99d2437471300000000000000", -"service": "00000000000000000000ffff9df527e8", -"pubKeyOperator": "033a5e7324cad62fd373fa5bfaba13dd6ba04ebf7ccd587c263f2c36931a9bfeb6a1a60584d58bfefff9ebf4bbec2582", -"votingAddress": "22ep98iSscWnuzb7QRdr5sKoVLFQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1fdd10aff65d7230126b0739f0fcc4dc2b02467e974e7993efe41b1e9247a629", -"confirmedHash": "c0c8a92523d85c7fd3eb470aa1cac8590f52b895ec2d58f41600000000000000", -"service": "00000000000000000000ffff6baa787d", -"pubKeyOperator": "04ce9678f43158ec2b2a033cef694f6fd952e945b87ab9b456348c50f479ef8f6517f3ebe200064bb45975249f5d80d3", -"votingAddress": "2fLcLjRonpZw4w4Swdcerznzfeee", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "1feefb334c7ebd26d6e5687530ffc11288f46490a5c9f20f0ebf9db7d5a2d5a9", -"confirmedHash": "f4e56ed87cbf5c6439e89e656c3b7002d1183258e869aec21400000000000000", -"service": "00000000000000000000ffff5eb0ecfc", -"pubKeyOperator": "93323d3eec97b3b02577f9406739a3636486977426cebcbfcb8253eb90876b731f8e767ea4fe40807167fd61a280d797", -"votingAddress": "2SECzJAFYsheP1iCch9fabQ2h1e7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "200cc99b8b394a88053172855e7613c8f0c7548f0e9470524c1053dedd2edbb8", -"confirmedHash": "216d183bd47cda67fa56d26cb038061b60f9d5166d123fec1300000000000000", -"service": "00000000000000000000ffff8b3b4d87", -"pubKeyOperator": "15ee7e20aca17a9aec6ea834fdb290a705785f180e6578d3a6b95ab4d81611c914b6d15898a9da2f0992ce57e1ef8632", -"votingAddress": "3Nf4pbnwsJTeWanoyFXKRmdRBW19", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "201c568ac5f758c1eb8be4a5356dee778009ef032ddb39d47fd7645bc7ef0943", -"confirmedHash": "ce3dab9533319410fa9b597588d703b60430b292f1fefa170a00000000000000", -"service": "00000000000000000000ffff6ca08674", -"pubKeyOperator": "8c59300831aa194b99c05622503b0406874efc2542e74054b3f6a16622765649fac27d2a462f3ae58abcea95f6094861", -"votingAddress": "gxHbDcZtZhC5r1urpUf5fhqDUoG", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "201ca29f932e13dec3897ecbc3cd895794e212121ca4d46989f0cad8b001ce4d", -"confirmedHash": "d3860efe92840ffed489f523633220cdc457c444a34c10fe0100000000000000", -"service": "00000000000000000000ffff52d315a6", -"pubKeyOperator": "0cd7a149effbecf74df7840d71c93d546dea6b5f4a29d80453ce73447fa28f7f61786ab27ab4d1f9a9e248e31f1ad28a", -"votingAddress": "4Vpobp7xC1o5ZdrD8KKnVN3yPomR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "20237dcf46578f5d65ac88d171f36950ec9cd48a4be21253c09c2eec230d3ca5", -"confirmedHash": "cda29b67ce0828b2618f89f898b47f3c596f0c080b42260c1700000000000000", -"service": "00000000000000000000ffff50d0e30b", -"pubKeyOperator": "901a5ed166138134b34ffe9a2f54e3394b48726849c498d23cb7d96da9400b1d754f2241ff892c6f3a859ee86dc82aff", -"votingAddress": "iXDZm2UQ9446TCzW2mZYvFrGRkK", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "20337991630bfdba682d97095115e5d134cb799eb2a6365ef19eb52b9bd6ed81", -"confirmedHash": "007e7675351a0a443670972003502b9df4ff2ef328f199ab1300000000000000", -"service": "00000000000000000000ffff6deb415f", -"pubKeyOperator": "8079a57f874ade8ea0f255627eda01847660a312b39e411b02c5130ce4ff3bb1326e15484373fd5b19ffa10fbdd6c773", -"votingAddress": "2auKCQwkj82jZcn3A5E9io4XPkPw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "204153e0fb3e79bce33350ee551312ec6bed5bbf0cb89cccd895ad6e504e39ff", -"confirmedHash": "b3f9a9fe2a42b17b814d7ca1414091f3c86f8deb703a580e0000000000000000", -"service": "00000000000000000000ffff55d1f1be", -"pubKeyOperator": "11a8341633a28a601078f0b157ebad5785218f99f0719d13a81b3296013c5aeb5881e27e4f2104fead2a04c0b33206c6", -"votingAddress": "3rAnd5bn7Ccugnejqyg6E8P3eb7E", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2049043b3d1c6e93cd9c5a8e9ecdae0e6304ff6acfcb305bf05ed4b8e7267056", -"confirmedHash": "6413bba4fbe144417bbab39151a4b1d2157cd318be69c2260f00000000000000", -"service": "00000000000000000000ffffbc28af40", -"pubKeyOperator": "055434e8fd19b819fd407dd6472cf97c9d386e4d479a55f96e07668f749769e5a1dbbdcd288e46fe512d3bdcc04a3c25", -"votingAddress": "7pAr6RJdL9QuPCiXQFaqTncMGx8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "204c5733526bceb68c4346f8c3b3fc386b274cba6949d7b9ed0f0c854ce9c164", -"confirmedHash": "cc12ca4ee0d2ac8230d702969ae5de1342e44496d6cacec70400000000000000", -"service": "00000000000000000000ffffcf9ad37c", -"pubKeyOperator": "99df6b0d8513bfe63525039dd249a414b124cfa8c1b4b8b31f618f14e268477286b1e215abcb12c3c8f342543f563cc8", -"votingAddress": "Ap8EtFDKe9NPXdn4ueF7t14V5du", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2052636dbf1dd0b8bd404338ce02ac7ba581aafd1a61d906c72a731ab66a6881", -"confirmedHash": "deea24e962fac02cf223dd40dd3f1d84e4375d0d51276cb70500000000000000", -"service": "00000000000000000000ffffa8775791", -"pubKeyOperator": "1562afa1f0192f7d8bdc216dee8fa3aa46ba25394aba7406ddb3707779b29ce7fac4f2502dd301da732086951a6004c1", -"votingAddress": "48y62aN6WEDRSzJxCSU5hnUzGtoJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2062ef68968842880e6741d6b532438fe9e2acc23362eb694c41124188c549a8", -"confirmedHash": "a316123262c76a535a9e2900b120717132e500c5cc1f9db72c00000000000000", -"service": "00000000000000000000ffff2d4c5733", -"pubKeyOperator": "968780ef211f70dadf38a5f4746c19f2cbf4402aff0c8e525c09834af2aa531f3a5e712d2b05c9b57bd152e09ae12867", -"votingAddress": "2qipxTMd7HfxahKpagnwgrp4nU91", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2067cb20825711c5d899430a246de655dfd447bfe8c6b8acad4348690dc4895f", -"confirmedHash": "61ca5a7856fd66dce5059c77c2076f96cfac0a98d01ad4531800000000000000", -"service": "00000000000000000000ffff55d1f250", -"pubKeyOperator": "12eb31fb3c5b861533c1a82a10dbc9e8d4ae6b6e47193fde850f260ac21fe8adfbe2e9dfc1e76239f09c34cc886a5a9b", -"votingAddress": "2cVWUM4DTduwQk7tX9A2rxazXjg3", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "206f8f12d520769ec471ac030869ab40521002b5edc42699cff5a9a647c87afe", -"confirmedHash": "8168b3ad5d59fd1fda68340a2cbaf9d24f6a8cfc01997b5e0400000000000000", -"service": "00000000000000000000ffff2d4d253f", -"pubKeyOperator": "92d350bbb22a1e63d37e4c4f0c6134aca64cbc05fa6d6eba12a32c613a743e6b63b8933ebc07551b1a9e5be700171233", -"votingAddress": "2GnQBv5zUC5qDinmNn63ERYJ4Kso", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "20853c4c23dd8d08bc8cf70b1fe2e6a27b10d225def45f78357b223830bfdc54", -"confirmedHash": "66a234d002d5f607d14c3ef991cf9a4e22dec00c5c809e561300000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "3CzY9uSLJAY8ibQfGLpEArTmb9m5", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "208773e026ba75bbcba6fab5b64173cdb06a68eed57a7095258338b08e9e099a", -"confirmedHash": "7f5b467c3df33548c1b3befb6a8b6c10a5df4d79fc4ac8c61000000000000000", -"service": "00000000000000000000ffff2d209814", -"pubKeyOperator": "181b4ef28372a00f773183b80e99e4737e773fdbdc84a40f0e94fa1f99c37666396c0e2577d0914956285132b2173dc0", -"votingAddress": "Kr35UctogUZ5QmVZ8U2XL6M3x5m", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2090f76a6ac7a449ed3fe06d9d31079d717f9d14240488ed03ff2ab5f81ee2df", -"confirmedHash": "3e2b8e3606640788f94cb14d16793268bf56a59402c85e0e0f00000000000000", -"service": "00000000000000000000ffff3625c7e8", -"pubKeyOperator": "16fff273840b16a50c04fbb60524964ca2cd349020e5b0c40c9a2f8defa0fba624f6e0d965855bd4bd82df8d113f215c", -"votingAddress": "31P11LV5MSZ6gtunxMRzUSEg9Qy3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "209262a203bb076d0fbe419db3c4de11c489c41baf9335572d2889b8fc37a1e4", -"confirmedHash": "5ccb46ae656de413a6692c562bbf78b5fb84711526712eed1900000000000000", -"service": "00000000000000000000ffff36dada2b", -"pubKeyOperator": "01962dad63fc3c29a20c245767385b568ce8eef1a74ad1512cea3d1e90f255a49a96e282275cabd8ebec9018980a90ca", -"votingAddress": "3ambWo6tsmsdVXLC8TJg6e3qNGD3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "20b498d4700c2670115ea767e67e57e0fbbbd90ba8533b4767d02df84d1dce4d", -"confirmedHash": "b305e3e1b3425d5b6d4560873a7dcb3f66df0bed794dbb920900000000000000", -"service": "00000000000000000000ffff44b7c8a3", -"pubKeyOperator": "844596fbed3dac8cc117603980e7929af1c06e6315559c2ef166516e4fb7c019d28c10a155bd3075aad8e12603c383b2", -"votingAddress": "3iRQGfhk18T7DisSJ6w9L89FiimA", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "20d596c88f6d42360bc218eb4ab2b82df3ed5ebf4f1c1d77959c90f0838acd84", -"confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", -"service": "00000000000000000000ffff55d1f262", -"pubKeyOperator": "17e753432df9c2d6db0e3d6e0876a2f5ccad0650f1e7417040526c5e72958ebbece4612902566c7f846a4f003e28d9d7", -"votingAddress": "3vH3UDKYszCXdKf7Smj73tDeiBFm", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2106ebe16b10b1e76a9c60dee10b015f534bd14da3a82732619a222d8995b857", -"confirmedHash": "c3ccd1c09eb4531a593cab057a4f09567b66c758d4106dfd0800000000000000", -"service": "00000000000000000000ffffbc28fbde", -"pubKeyOperator": "1615684fa3034e540f0dfe5e3c27385f088fbf5d6aca097db89354614176e70449f6d0d425c3a04344c25a800b03e482", -"votingAddress": "21XEzjnHS8JqsnpXAk9XKYfZtjJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "210ef411bf7ba841737fc2ad06e60ac40c86ee6c949b4c60f15548778b7ffdec", -"confirmedHash": "460e64610ca33bf6a36adaba0ed1adc01d108b63197c70fc1800000000000000", -"service": "00000000000000000000ffff88f4577a", -"pubKeyOperator": "81bf34de9c88dadfbc1410c4186bc4ff82bc81989f4e0b974858ff047f9b026794bddd535c1b1ce87185ae67d2b9ff78", -"votingAddress": "3vMak6hqVq2sLLqgBD6JS8k97pZw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2114d548fc9c760e1821309edd3da011cf26ecb75b8f485118dbb481e770368f", -"confirmedHash": "7349f0ddc83591e1f854e794dc2cd575a671f0ab66b81f522c00000000000000", -"service": "00000000000000000000ffffd1faf267", -"pubKeyOperator": "9750bcc80614ffdcc61516e2bda13b5d9f2e925935794c91ed8a6496cc84409ffec86b56709aae0073486270f204e2f7", -"votingAddress": "sEUPrei1xj92b5Ttko7tMruwunA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "21176cc438ec4cdb7fd4478d8231a697fad30a459bac788a4210dddbfe7a149c", -"confirmedHash": "3a3bfc908d4610b60236aa0c34541f39313854b413aae1780500000000000000", -"service": "00000000000000000000ffff9df5c181", -"pubKeyOperator": "8d78e2ee57dfcb7021ba583e7e37c03173c58e36504d2f428a7ca1dfb0fe5542acfc02e435783885b169af383fb3a532", -"votingAddress": "248hspwR9EDQAxeu7n7m2fJiczsy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2122b6cea38ec8a9e59402f7767fa9d9b4bfce7bd2a36af47b51f41b67125f86", -"confirmedHash": "cffa8f30490ff678412d82497e295453409d2f539759280a0800000000000000", -"service": "00000000000000000000ffff88f38e23", -"pubKeyOperator": "8b259a2844167d2c85a41eff924d755b02900d0843841cca926c16e39dc1b8c59870d2a39300a99bbe04a4d2e75f481e", -"votingAddress": "Q3pNuJwzKzEJXaeYj7qrxU8tvU4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2154e44a569d1a48a02e6cb5147896a31778c99c92209d31db0ba1a60e497f36", -"confirmedHash": "174545c4310aa1fc23af4c2eab1573cca7bd34b70021a5133a00000000000000", -"service": "00000000000000000000ffff9fcb3e4f", -"pubKeyOperator": "09c61b5f914fa96dfc8051944acc5524efb645202a2cca6f6820fbf678c0753359d763a63068b236e816c1b2194dde6d", -"votingAddress": "tXgwF2cKGriqWCRHAk38XRP4TQC", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "215b2514787e3adb62a17c2719f87dcaed946d3c9c571e93dbda7325c3f172a8", -"confirmedHash": "e2c0169b4cd26a9f9d3010599507625bdc255f52fa9483521800000000000000", -"service": "00000000000000000000ffff92b9837c", -"pubKeyOperator": "0f088e81ec98c75ca12f89b0ed55b3c864a16766624e3d2881771bd1874a6bf53d6b5c62612f9897fa7df4768b5e3e59", -"votingAddress": "3mie7RvCyZwRhzv9qBiReHgKu4dG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "216283c8488447cca2c97ad8359f5268ed2df1f543f08af1b6f7d6246a01ec6f", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6d745", -"pubKeyOperator": "812cb2d0b8db85eb44b7c8fc6a3f8e72b75c87b4509291397d7a6c4858ff7f1fbdd7282357d21bcff9d8df22929a9734", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "21777b4350a7701d752e99eba8bfa5dd911866f359eb983191174632ab176372", -"confirmedHash": "5712585b659d56786a36e92fd75e5b40c0713062bed3fd730c00000000000000", -"service": "00000000000000000000ffffbca63f3a", -"pubKeyOperator": "194d16858f84ac09bfe6c66f37ca42d5ceaa25b24b9938cbbeafa96e5799336ccc5011f7a2279345e75a974a6b9e27a8", -"votingAddress": "L4AStWrc7FTY1as9eY9W6iYaJ6m", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "219597fc9a324f55587ee3c1859d5ef9a6b877200d930ad383331e49709dd6ab", -"confirmedHash": "b02029cebf0649caf6b15aedf0ebb3e5796980373f121a9d2400000000000000", -"service": "00000000000000000000ffffb29d5bb3", -"pubKeyOperator": "14251215fe97a17389753a0b45a1a4e826ae3fd8f5c01d3d495ec2f7d6cd2b6d401521eb9284151057397b377dc1c011", -"votingAddress": "X4Aobfs4awXWjEHLeTwZmAJNnFW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "21963df05c0f6c01d2dcaa6457d61891bb1e25670e26705a7925f20ae4faa23f", -"confirmedHash": "61d7ec171f3f531ae5cc044798059c056a70245e832d25d11100000000000000", -"service": "00000000000000000000ffff175878f7", -"pubKeyOperator": "122217249e43fe5bb46ece26b2e4aa986eb9ce24802875e05b4e0ae7f70b456a993b877692d9f37d28566ce3fe43fa30", -"votingAddress": "4JszJTA5rsPLSc8RxabQhXy9McB6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "219927af315d61d59de191af022ca2bd7cabd7e3ff643c0ee28beffa2d2cb5f1", -"confirmedHash": "57f90584b295ee6bb36b83164fc8836b6dd1da5e7bca745a2800000000000000", -"service": "00000000000000000000ffffcfa7401a", -"pubKeyOperator": "03435a8e4d6f4b382cf9d34a5bbf7c75798388444e661100fadc0d6ca7d0035b3b0891f3348236365477e0ecd7312b94", -"votingAddress": "44DCF2M1rW55mBqJxWHgJfpmaLvj", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "219c36f96c0e682c11c62c3f024ada780497f15b2ed544305fddd73e39e75f40", -"confirmedHash": "97bbbab0d22e6b58206b21bd85755cd6f7d30cd1699826901b00000000000000", -"service": "00000000000000000000ffffbca658f0", -"pubKeyOperator": "03fc5835287a18f628a7843a0c6c1886e61f1c4ff4ac0551d44c94d1e78f9b8e105b74d91a501251b96b79d9fe79ba23", -"votingAddress": "28aJg31AcYYrnW5RJnxZGYRV2KCs", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "219e54e3eca13ef2ac8efb769968f8ac717b2fae1fb8a5dfa168be6422699a3a", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688e9cf", -"pubKeyOperator": "98a331269f6acfd894960acb97c36037e817923455d9727f6524cb71ecee674eb98d897c3bb3247e85cc5dbfb49541b6", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "21b34005fb878b04a137e98c30aebcf207978a1e8a46e1886d891f3e2a432c3b", -"confirmedHash": "61e3feb820d0f859ed98ed4ab40904b04fc0e213c89ce1723000000000000000", -"service": "00000000000000000000ffffbca62e21", -"pubKeyOperator": "11d46b200414caa15a92df34febdfe0fb4b924ed61bba6cb759023ad2a902cc3b5baff3e056d5bef2805fe40826d15a9", -"votingAddress": "386MBnzhW34SNFmyUZZV1pZ8HUXW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "21b9ef566d6fa6d5b95a2d96d790aab2624520bfc383330fe1d7766f0c1016d3", -"confirmedHash": "c05d887d39940df40d77594c3dbeded39fe833a0fbb15d6b0300000000000000", -"service": "00000000000000000000ffff87b5084c", -"pubKeyOperator": "920605a906f2093b57710c1afc3b4e9b65b322f2fb1c051d961ebdf32481051f64955b6646409cf9e7b379cfbc5b56a0", -"votingAddress": "X2jGciBycXiPtaQY78vKoGi5q5c", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "21bbab0afd50e2abc26dfe835e7f7c9b7985173e2de5f92591d2756c32aea1c6", -"confirmedHash": "142e887113669ab870200cb0acec5c3985255defb5bd9af42c00000000000000", -"service": "00000000000000000000ffff55cea559", -"pubKeyOperator": "96427db7ac84ee40c82e4680baa4185518ded1891f38282745f070fff577c006cfbc5db3d7d76d20bed3ec0e1e696d6a", -"votingAddress": "9Ce7224NgS6Rq3SfRfQAbQXR3mY", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "21c5aa821fd9489499c7d9fd2227df9e0ebc7de763aa27d7d1a429a18c935021", -"confirmedHash": "7776681cc38a2ba2293a1570e0ecfab576a36c446fed7b2e0200000000000000", -"service": "00000000000000000000ffff33c37513", -"pubKeyOperator": "83b6cec7dcda1e67f059743677fee65e0328997f32e8ed7d214371b93b464859c55af3488353eafaa86182105a964d5a", -"votingAddress": "4RXdrGVavmhC5uZkJoEXVAk74mxC", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "21cf6eb52cda70f381af747a152f56518e55fcca20caf62891bb8f29e95b24d9", -"confirmedHash": "a62fed9dc0dfcf3e42dee63bf2ce9d01bc19824d596f21af0b00000000000000", -"service": "00000000000000000000ffff36a4b960", -"pubKeyOperator": "134736f576779f9503a4562a6c4416b4f73f7aeccbe47cbdf3ce93628323e7dedae21c5efed8577c38596a879065e6ce", -"votingAddress": "3xgLSArygB4tSpKsjD1s7mDufoUK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "21dc6e6696a4ce7d1b271f7ade022924831b670af4fae9438467fe291358013d", -"confirmedHash": "5c08f07349b5a37cd801bf822c8c1e5c0926fadae502de3a3a00000000000000", -"service": "00000000000000000000ffff5fd9d6f7", -"pubKeyOperator": "805bf6ad300bda4b469fc3c7e2ab871314578a24b1c1f199f6f17eef19ab6f616109a0fac6d2ed14c661c7b04f85ba7b", -"votingAddress": "3EP416rqCJbvMxkrY8uufrhJ2Gao", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "21e9c0bd151b4a6a36b844a9b23decc66a91195463752c537ffa4e947dbdabaa", -"confirmedHash": "896d9997da836470423dc8109dd8c257ce872bda7083a5b71000000000000000", -"service": "00000000000000000000ffffa8775311", -"pubKeyOperator": "98fad613b8a7d0f8fb178c52d63b80b0439f495d62a2b095431f101505bd8e624ca5e053f8c70ec59a0ae4ad2066d5e2", -"votingAddress": "4ZZbHzjcQimxuAQYRbmhfH4XdbXm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "21f4170ddc64758f67744989d1036e06f9e1c405abb289cfc76df5b17edfaf3d", -"confirmedHash": "dc5245912803de3c700e27b99f434d37037394beda1ca41f1300000000000000", -"service": "00000000000000000000ffff5762fd56", -"pubKeyOperator": "03c8d2bd19af500faa7784e6ecad662b37c021d915da4cbdca48b2d8fe360604dc361262fac9f1c92e6e271d6f87d97d", -"votingAddress": "5HW4TMGTVfaq9HZJZgkLKLyGQwH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "220c7aadc96ecd9c184ba969432d965ba5e6486050fff64ad6129a7917ce598b", -"confirmedHash": "3277f1ffb00af0bfdad228d19db6c801531bab00a736e05d0100000000000000", -"service": "00000000000000000000ffff2d4c59f1", -"pubKeyOperator": "111bbe6f546af4f84bd3188f771ecd15f09e14a3c818b39d5d354cf84b409785772a135cce87c0a5a52b4574c4181d04", -"votingAddress": "3sbxTaTroXfzWRZzsmWFkFiBfBPd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "222a0b24d8477cbde28a97a6c9de1cbce9cc9b63d8b8716987b4d00d31eca1c1", -"confirmedHash": "1f95d2d3592dbf85f2b0985da6a63d7fee60c8c1b436c0830100000000000000", -"service": "00000000000000000000ffff58630b14", -"pubKeyOperator": "156f42daf3f9f79fb626f80fc99e3aba159a92a46f8ed0cf150f5891520fbe01a02d9f1fbc834465101e36635e34e8c5", -"votingAddress": "nM9kR38H8sB2urid1H6CvGERPJP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2239515ac2dc3fd2f81ae0fb7abf59a2ff778264094d59b0f3061241ce905b1d", -"confirmedHash": "082ad0c1623b5b4f767158ef626336363e711175b7a491f30c00000000000000", -"service": "00000000000000000000ffff50d0e1b6", -"pubKeyOperator": "8c6b86b209e906e01149c9e36512b3dc891a84a2babb7c26abafb5c13db98e31001863838215f864926fdee713de7b20", -"votingAddress": "nj4QoBPXXJyj287y3MYj61GygiL", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2266a85a937b644edd2f7d0fa708cde55b08513e5b06452bb744b08ce9f651ab", -"confirmedHash": "99b3d0f943aa2807a2f0f30a375efbebf6ef1e51aa5c2a862200000000000000", -"service": "00000000000000000000ffff2d3f4e72", -"pubKeyOperator": "9947cb689ad8d8d400851e1d54808317a0e2c932faf7e8c20041292f959f4a57e6e8336278326193dc5b5e1a38932524", -"votingAddress": "bzK9gzcoVwwUFkHsW4Kq79WquL8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "22a1f1449eb76dfd105d008f6a2ad6b13fc23aed2649fa638bb7a35c4d22a5e7", -"confirmedHash": "67cd09722973a24a5ba9f6cf3a15b13a4bb09ad883667b2b2000000000000000", -"service": "00000000000000000000ffff9fcb28ac", -"pubKeyOperator": "021428461f758ac7574e6d9dc071981526b8641e07b4c91df1676de8d0ce151682ed822ad3287755d6eb9dbdc311c11c", -"votingAddress": "289JNG8Ssd3KK3kDe8jGYEESWMjB", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "22b9643398b34d64b435717435713c7be5e6bf04bed7cbed24c9889437d37987", -"confirmedHash": "d6660baf81add7ee5cc97f544918e3e931d9c2249ce8c1c61600000000000000", -"service": "00000000000000000000ffff6883c107", -"pubKeyOperator": "8869aa575ce3388fb20974530695b2bc83421386ccf36946af0d3e5ddf16cac886c1c60452fe74943760620f03265dba", -"votingAddress": "3N3Uqihd8UZE2c62Fb1nXVSeigq7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "22bc5e3dcd8d101dfa3eb8fa3ece16229a550553d456acea23e83d0495483c07", -"confirmedHash": "57ff2858929e501901e5f0ed184b424e16c51d6b642b22bd0200000000000000", -"service": "00000000000000000000ffffbc28b486", -"pubKeyOperator": "04d1b5d52326d730fd60145752dd039a440292f9375bc96dcaecbee5eb21e8d89197391e1e96d9676ed1316d0239fac1", -"votingAddress": "3oUeqSC3YjcX7mbmbhSCNr4pF8Rh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "22bf27b829141dd6b86c66c185a121edbbc17ab88a15866f6d120b074507604e", -"confirmedHash": "ce4200571bcdc3a8eda49c681c8b2cd6b4084f3297f411731300000000000000", -"service": "00000000000000000000ffff9d5a9bb0", -"pubKeyOperator": "93e4b579580c98e3607511fe9f199b3eb5b17a57123ddf7f87413705f2c5006c0207a836d51cc01f47d333ba8e1cd349", -"votingAddress": "2Gwz4FGE7DS1cw2Pm8i1h2VtVdC9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "22c1d2b5bcff1cce1346c1d120f0b6c7b9f1e22f8bc102f79a7d5c2a03733754", -"confirmedHash": "8938fe0dfd96bf2ad426255ce9fe93625585a178cd8859be0100000000000000", -"service": "00000000000000000000ffff68ec3a83", -"pubKeyOperator": "85c417521186888df0177c8208d2aa1f61d191eaa178e2e63f959c7ffb4af1a46ce31c5770d539dbb8f159c2c4eb1ea6", -"votingAddress": "AMQC13HRQvrMfQbFuce8d5m3csb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "22cd40522a0704f295c62e2996674608ddf2d694e40ab3a22be7e8e54516ba52", -"confirmedHash": "eadcd25a1e89b9a9920d0f3e54ff03355a95999e588e31a50200000000000000", -"service": "00000000000000000000ffff95386f59", -"pubKeyOperator": "1408fb73b2b76179f4d6e1c1a7bbe5a4155269fcaf051e84288ae8dff403b30f516adb718f378d6211bb945e75ab0fec", -"votingAddress": "2USU7bVAinzEhxX622iQjo599TXx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "22ce2e5fce17c631de6baebd11533633a12ae980e15fbc5e527883cc4d822d00", -"confirmedHash": "6fb26b20cd97d93522d3a22acd575f7cea3394180f72a6f61000000000000000", -"service": "00000000000000000000ffff9fcb04b1", -"pubKeyOperator": "029f8216787cf28e5bf9b1ccc1dc439dd1f6d381e029d1b432d083b1e46870f14f1f831c0346c41a280b3e1e5a883db4", -"votingAddress": "wH2cgQy3gqRvppidyh2mEH4nwRe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "22d115f638f0bfc27779ed004484f58aadd8ff26b907af96080226a709d271dd", -"confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", -"service": "00000000000000000000ffffd4186302", -"pubKeyOperator": "8b938523577906f0038d5837f55d37f98e4f5a46dbf9ff9128f92b9f107902a4f1c986356861ac3e7392c4a2253e28ee", -"votingAddress": "2A28P8XJhy12MS3oBgEGGa2joZnF", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "22d9edc1a15165ce364e089d33d84668757fdbd1c17aebf71f3249f388a75d2c", -"confirmedHash": "9fc04149221b72f129d2063421cd0471877850356f0df5df1600000000000000", -"service": "00000000000000000000ffffbc28f166", -"pubKeyOperator": "955ec2ad6a33bf6015192e10fee066a503135518a2a526939c2a71a82bef5b9b919d731fe042b118ff4e1b80dd0771de", -"votingAddress": "3ebs86fo9cb1sBNaWZ8B73v5smuk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "22ecdb20690d5c90875f6eabf2532e2f821ad2d7d269efcfd8361642118b8c8b", -"confirmedHash": "5b6af25603558aa7d53495ae40bd797b48ccdbd06ce4c2970100000000000000", -"service": "00000000000000000000ffff2d211818", -"pubKeyOperator": "84d8a01d39ec079c94573bba3b376d9c909cab7c10985d7b9557aa47906d552a662adf2a533c08289a8b3a1de15b715c", -"votingAddress": "3zXVkaBCf4J1yromo7CLDb2N23z6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "22fde5e198fc1eefc648aab4464e8d0d1fbdd7470fd98351f9a11ba16f32bc73", -"confirmedHash": "29d50d332e6045bd910fc81a55f983ce051dd49cf14957450300000000000000", -"service": "00000000000000000000ffffbc28fbc6", -"pubKeyOperator": "956bdf934f2848cfaf505e628fe472413493f34083791663d23f7fd2ead6cd54ae81348cfd2a20f1d15e03668bc34517", -"votingAddress": "ebcKDkZnXgD6Sh2Uo3MgQDmGsu5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2305f33b8594dad2e11319341496afd362ceef22676297e60b73316aa43d2e81", -"confirmedHash": "402c0548a87320f6b26851267192c8c17a1ac03ee95939b10e00000000000000", -"service": "00000000000000000000ffff52d31947", -"pubKeyOperator": "09fa1d68dac314ba471385f2e9c7dd22632b1699098ea21cf1478caff4dea93786ac1884de7794ad8974416da56335f1", -"votingAddress": "NF3VY9Snr9Za112rZby6CNCxKCU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "23418e325a0ad1d5a534b912a3500161ecc1ebb20f39d7375b664ad556844312", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d565a1", -"pubKeyOperator": "83634d9486727a98fe9f5e04231ea55b21056165e1b50253832b40e608ccc8560c354b5dfc1a2632765cf4f91240cdce", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2346a03b1d137f4e4c73528128580e9764fb34d6b0970cdde6acf08f8678d4aa", -"confirmedHash": "c2d2bc0436c1e5c916fee275944adb042da2aaf63ac2e9db0700000000000000", -"service": "00000000000000000000ffff3e4d9cf9", -"pubKeyOperator": "8694ed09e5851479eb4b29cc41adc6f865b0c26a05468883d84369ff1824f687aae7bdd37185474e52a9e16483539074", -"votingAddress": "3Jg7hTZcnHrcWpBjksYmrccvUfRk", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "234acebe2c8078f89dd811032b590dbc455f5d290e4f3fa0ac7eca8bfdc2f1c7", -"confirmedHash": "823623b132b8fdf457c038880fd0b879501afdc11fd684ee2d00000000000000", -"service": "00000000000000000000ffff6baaa54e", -"pubKeyOperator": "95c0145b9ed64de16520be36e899de2d5451e308a63fccd1bef0f92deb93109dff6681fb5733da1c82dcc0d640faac84", -"votingAddress": "uPiNxLTKwBUXcXkyjNPvJtbDWfy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "234be551866460864d3ea51da153ea3fc429f399b6d264348045486b4f05d753", -"confirmedHash": "1b8a8b5d08ce8573533cf0daa68dba0afc5ecea9a64889a91700000000000000", -"service": "00000000000000000000ffff55d1f19c", -"pubKeyOperator": "954c04a289aa412f6b7d3a8781a50d48f2934cf8760d790467ff7b6ecc3eef00cec715e0103624a2eae2df251f5ff668", -"votingAddress": "44kCheK1vyMoFHha1uiFxTUKGrum", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "235b3bc0ae954ba79c8ff825c40f34375be76d7488fe0c3021523c7aa09cc386", -"confirmedHash": "43ef503a95c7a9190d4e906828998ebeefece4beec35521e3100000000000000", -"service": "00000000000000000000ffff55d1f12c", -"pubKeyOperator": "06c9f110042ef9981090b08578c2a472ba32cc69b4b73c3ec54c7f095be4919f2c11d5250cd003aa910e2d2429d8c83f", -"votingAddress": "386i6ojYzeRCkMrydU18xWttLx5F", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "23818bd91235014d48cafc12d159a7aa684a2de4c810dfe1f9d4f2557995ff6e", -"confirmedHash": "2d4253260c85d3f8a854c229dd60c7d307738136e3efc37b0200000000000000", -"service": "00000000000000000000ffffa516ed2d", -"pubKeyOperator": "155ca5407e534ef30487c93f9efdf3a73bb79682bbddbbb611529aa3264402780a18475d2e976b552a83dc5b3bc1cd69", -"votingAddress": "3ZYS1Jyf1m8Qm1PWTC5A5x66YVBf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "23a17ea5690f60083e6b7766e06cf2ad0347df0519b5d80dc19594ec91629b70", -"confirmedHash": "4a80e998a85a33b2251bbe69b753de482fd033dddfadd57d0900000000000000", -"service": "00000000000000000000ffff2e653c0d", -"pubKeyOperator": "9542513908972b9c0c9b51243982af52d502604dae52eb08a5bc67f8dd94d0795479598a88299384726d01347ad6b3c1", -"votingAddress": "NgvhWgsvSbkggKBeKAUe7cFmk7M", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "23a809d3949d6f77fcfd8d5094ff50660583cc25b266d9ae9b91ff6ea5f86e11", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b052", -"pubKeyOperator": "87338315a4794ffd29295cde1a8cbbe5da5733cad3b0dc6f76419e88f58fef0d4bf0f95ecbcad5389d8256c9ddf2fec4", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "23b06a5931c47774355d29424a1e8a8b76b7e07feabffda67aef191a05205806", -"confirmedHash": "8a4d3d020a27d25ff6ad22ce8148b31c9d9481ac0f3fb2e70700000000000000", -"service": "00000000000000000000ffffa7aca53c", -"pubKeyOperator": "18e1ffba070b3500b9dda800f5e86cec03dfe2f3ce090d8ed2c05756d8d7a45e35cc2f2208ccd095d28d51f7a658c572", -"votingAddress": "nPqTMV5v435qfiGAkrBCgXKZU7j", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "23b842af04929d3c2499a26cb332f9b556b890d97b8460e43074a7e757ef8a6c", -"confirmedHash": "689665ed21cc0b691813545cb26cfe3fc85a004764e9fb270100000000000000", -"service": "00000000000000000000ffff55d1f171", -"pubKeyOperator": "97a8dfec2a6e27489a87604adb34993fd0ee9562ce1d16022700ae945c706ae8902da38294c15372766d72c2bf43089f", -"votingAddress": "2H7VseY7dpbDRybjR7YHoyKyUP3N", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "23bc0cccf11566b33a15356f1f572c03ca2cb53335ec79afa3768010bde83821", -"confirmedHash": "84f908988db6fbdec293b777ba7a6106ff0f85605f6b9f401b00000000000000", -"service": "00000000000000000000ffff2e04a263", -"pubKeyOperator": "8cb859caac46e998484fc328f28abcae1a7267d31c262049b61ec93c43ba83050e62f2f3d3a7c6269a08a5b7194766a5", -"votingAddress": "2622shUBsL15eY9dRWuBwasj3GBh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "23c191dfd2b3a41ff89320f3602eb9ddc59e7bf9f1b6e5f28e5813596d294163", -"confirmedHash": "cf91c3cb7f2b6f8831f101b89ef27e879665a43668b17a730400000000000000", -"service": "00000000000000000000ffff3eabbe8e", -"pubKeyOperator": "830667cc5e30323037fcbd3da8a893c6440b0058238c0272760a3efb4d3758adb56db6273ca64ab55636d87289e34935", -"votingAddress": "BK3fyXDiCMFSyqAyUd6obgYgwsY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "23c8ebe245df46cf43f647eac80cd70898269e9ef2808691176b1b407c7d71f2", -"confirmedHash": "d8cc3ee07a3a730c8bf41c93c2d91c350cae578b0bba59910500000000000000", -"service": "00000000000000000000ffff0888fb3c", -"pubKeyOperator": "92ab846b42e50e45831b542b609c0ce3a27e4af57b60b5fd381b628c522b4b6bc2854252742e6626e8cb3b4539abad15", -"votingAddress": "2M8QJQDmyWYM6Y9iaNZ1pdrf3tgs", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "23d09d71fccd176f36b2676c58fc25df48a8536e843e78ea352a4be7dbb27bfd", -"confirmedHash": "3b7db457c52714e1fb4ad0c6f29a2d17582eda83fbda5d8e1c00000000000000", -"service": "00000000000000000000ffffd4186227", -"pubKeyOperator": "9052e9e4e80d67e19239d64c2b90af97a18b71fd7df91e27ecd4b44e1c4988923ca20d808877a9251ce27a7c3af2db75", -"votingAddress": "2BjUWobhymCCRR7Pzf9C7e1mbmCr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "23d4ad18177b1d4097a622c98f6686560662d0afad0c22d0294329c19c0bea10", -"confirmedHash": "afe8aeeb1f705da55d606c17384989c1f6df2a9bc60bfe2c1300000000000000", -"service": "00000000000000000000ffff55d1f222", -"pubKeyOperator": "16a15d6a9fe473976195c83a0a9ce69c00529852b484da2f84d38fb8b5d570b685b3a5c55f49583c4caa10d1366b7ae5", -"votingAddress": "2T5XZtLVKU3X5zmXLBgjW9SfGv51", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "23daa1c11aa3e4b9026ec4e58aa9c3c9b2692aef437c35be689e78d5166c5b19", -"confirmedHash": "ec1dd95a7d88d970e9e4494e46deeec559645274561ffdd42600000000000000", -"service": "00000000000000000000ffffbc28b845", -"pubKeyOperator": "11bed9c2c16b0ea08dd385976e6522ebca5e946cfa7824a7c8bad20a3f63a4f1eb40ae7d1b85f8b3585e1211fedc0d6b", -"votingAddress": "ciHNqKQwkR8kfGwWtS51dMJo8DD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "23dfba977fbd30bcd1824d6f4edfa3869ade21568e733e965b5fe8eb7325d1c1", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96886346", -"pubKeyOperator": "98b370a89992025998d954e765e1232a3d40dfe5122fce2476aea66dcd7ac2ab6d73ad13a0ccb4e5ed791b306fd45d7d", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": false, -"updateHeight": 1760856, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "23e38bddbb324122aa35a87ad0d3263a9425d37fd866c0aed23989d3a6ce19dd", -"confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", -"service": "00000000000000000000ffff50d1eb03", -"pubKeyOperator": "81a2733e45eba76282fa365c415815338a2c8e1da3a432f7860bcc9e891b36a23e5590278e13eb0b998b8ed5e9b56009", -"votingAddress": "2ddUj2E5rMqhzaDEE72uMgykJRsA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "23ebb7e579568ad2ecff443e915a51b40c2268bbf405995ea6701e93a869cb0e", -"confirmedHash": "fde0ccec59465bfb8d33d867ee82fea34e17639e96c73b761600000000000000", -"service": "00000000000000000000ffff87b50fe7", -"pubKeyOperator": "0d866b6b063097bc127d227eb19e6fd6a99ddbab999dac56be1b366570cdccb5a0ad477e699ffc20924d79b44de0c9f0", -"votingAddress": "3VEGMCbushDh6m6czpq1JDhxq7aM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "23f1661c09681bf30be6547a260f9526eede6665cf3aa8b265af54d36990a511", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff968860a1", -"pubKeyOperator": "136253a562fa4000148b90be87bf96c61af46a23fa715a97c8c8a5208a4b14a41144a70cd2e92670448fdec1a44459ce", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "23f895bf5fe79cf12302606d4f8e2b2bd46339483d67e17e2217af63c8b1e5ea", -"confirmedHash": "68485f6aec39ec1c77d9cc4652aab2038dd647c64318f2f31700000000000000", -"service": "00000000000000000000ffffadf9157a", -"pubKeyOperator": "901e88ee4dae968aae87fa1fb6155eab7c579ee044aac262932bbda42359ae40ec6b521f07b5d0ca728e89bd1198178c", -"votingAddress": "2hLy37KtuNJbdixwboUCt7aQ25BV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "23fe617cad7af17e7790aedf82ff8b989be1ca8483d84fbae1fcb61a6ccc0e46", -"confirmedHash": "b19a72c1301cd50e2f6cfd8cc74edef864b06743f3179bf90900000000000000", -"service": "00000000000000000000ffff51e2df99", -"pubKeyOperator": "889c18828eb661ee9e3a967e2e05864d39de3666f57065ac1c6ccc14cb1bf22633117197bb18df78516f4c2b16f8070e", -"votingAddress": "392Q8U3ywruFrTBoE7LiYj8UWpzW", -"isValid": true, -"updateHeight": 1738152, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2428136ce4df70f41842775e1b4de652c9586eef3299d28bdc4b36a1b203f4c5", -"confirmedHash": "4265a647f68d88a8cd52ca697cbd0553b1042ce12247ac5b1600000000000000", -"service": "00000000000000000000ffffa7638ff5", -"pubKeyOperator": "18e4ec6908c3c2fc2e04d18afaf42ce87e8becac6dfb728aefb96c36ddee55e1e4c42538a0ecb45613382a7c563ec580", -"votingAddress": "U764Eo6fSbc7J78AyZ7fBvDNBbG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "243e6ad48e20997e72eb9accc92691809568b03b0215399314ccf5d9bbc35b85", -"confirmedHash": "76024936649ee232a118dbffddf6e40a2f5218b46b2eb7561200000000000000", -"service": "00000000000000000000ffff330f60ce", -"pubKeyOperator": "16f53e3f647722ec64a75fe80ef6c3914343e627af6ee67b181a8c720dc76014ad77b387b68c445319d7fa2dbcb9af49", -"votingAddress": "mwzmGe7xkkFwTS2VQ77J7FDjnPc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "244120349b14b76b033c64e728d668a9f3eb4a3b4a5e27c2078f41cac46e205f", -"confirmedHash": "beae829de12b4541bb5f7b1b56c3112bba87218693a3409e0200000000000000", -"service": "00000000000000000000ffff9de6f6dd", -"pubKeyOperator": "83f7ac19ccd71ba0e7fc2829f647ca77d693dc23f41981ca06bc4d33bdb719b119677dd990e27fdbf18d4fa59d4c0280", -"votingAddress": "dQMRyrHDaojXkyczyGUJVuqqaB6", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "244456a5d7d55074a2c84e9f0780efaba564e0697885fe64d62e63162576b1c1", -"confirmedHash": "ed94e7a69a9eba24a97d0511987122b3d0a9939254332a501300000000000000", -"service": "00000000000000000000ffff52d31532", -"pubKeyOperator": "9142db81a7ecb73137a6546b5cf6747168a79afc527ff86de020e9a20a65f957cb0da2587028a21cc7498d4db60ad9b2", -"votingAddress": "2pQ9cA1xsmXhmyoSHzA6HnTLqkxb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "248056d052d5b0e796d297af0a0163ce918146bb4ec7dc0f341ce1c5193b9925", -"confirmedHash": "d4d6cabead7ddbfd03c09cb5d38f89bfe8fcc4be61b955d71c00000000000000", -"service": "00000000000000000000ffffa87757c7", -"pubKeyOperator": "968a0ed3c5fdbd18799d82cbbd70cf870a29f16f718c4969dddd64cf54bf9d7677d16516e8515a07b3a2ad01baf09594", -"votingAddress": "2vEtqS64Wur8dRDdRdXbRE2XvRp7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2490f94bd82761a3f87af449091f6eacec9d9f99107b6f00c88195bfaede40af", -"confirmedHash": "cdc14463eba5585162232db408d57e09abcb146aa8d2578b1e00000000000000", -"service": "00000000000000000000ffffbc2815e0", -"pubKeyOperator": "991ffe06346a3652cb5f26e614ad9c57b2651405c64712beb45c0b8c870e86fab7fa47a77bb66d1d6d79ce95c40150fc", -"votingAddress": "4EzAeKRPe6cMmFn5r71Mnh73yYPg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "24aa1adf52fca0d0c2c60690c09ad3552ae4a3fb057347e6612cd4ed3c0616f3", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b085", -"pubKeyOperator": "944ac12350a42282175a0d45517ae57b3bba09c2c2b0ea42fa98861606905f1a9b4538d435110d421ae07a2eb31434b7", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "24ae87c489187ef609edcb1fed6ac314475fe87c8124626d1dab5a7414309142", -"confirmedHash": "bfc39b398fa6d22bbec34a3194f7827dd943d72a0a865cc70200000000000000", -"service": "00000000000000000000ffffbc28be29", -"pubKeyOperator": "85b387f463a57ed1058fab53767ee2fdc48b72a09b5626ca62eeb00394b3e9a7401b7d3ea4d6190b67d923fda58c0a46", -"votingAddress": "Ay7rxsLD1mSNiHLEVytiwGTFRm4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "24b040ba667d8370d0f66265dc636796da4352ed77b84399dd2d95aaefc87e33", -"confirmedHash": "f512ae6b54cd16a361b2d6c465316863d8d405bd1893adc11400000000000000", -"service": "00000000000000000000ffff2d56a29a", -"pubKeyOperator": "92c8c06c8244dbf098d6994d4ebfea5144c08b9b9a7752e225128e1d70c47bc4f6dccd3c235c16da54914ba11276ff96", -"votingAddress": "2Kx44or39sc3We69cLeSCohpEvc7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "24baed676659776c809b798465ad85a663de5c98fd7ac1e22fa5ace36bd642a9", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff8491c80a", -"pubKeyOperator": "9401e203c7956ea0d8d515c27e8308cf3fa057574842c4d9a0f585ff4985b0199455ce331f374ae23f817fa7e2e26730", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "24bc0d1c9206aee3ea3f48472cf4cdd2d06931a0e0d464182a0b936c205de783", -"confirmedHash": "1404d994518f5f1e5236fef3c9e7926184ab14c6aff33c4e1c00000000000000", -"service": "00000000000000000000ffff59280090", -"pubKeyOperator": "11feaeb2f6cdb8e5e0bcf0057a14039d56ff73b16e029122398485c9f7ac445e8a55ad086d738c117d56c04943173aa0", -"votingAddress": "4Lz55gJCKxxogpN7tRFLhRJKswN7", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "24cf42a758b2edbfb55796ab84502a99a8f1ee900a87c5072de3bea39e6ece30", -"confirmedHash": "174545c4310aa1fc23af4c2eab1573cca7bd34b70021a5133a00000000000000", -"service": "00000000000000000000ffff9de628ea", -"pubKeyOperator": "11d1111d1ae522c7d45c88b016708188aed93e4642572025d27ad320c76d23dfb0af0b7999964ab761e3fb70fec5aa59", -"votingAddress": "VyZHs1fkyodEsTc622iW8iXXsjq", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "24db3094ee0f980ca28d3fffa1889ce84d6ba35083ebc118e203fc82cfc6a28d", -"confirmedHash": "34f56a8bf7ada589e93793ff74ce7feeed89ae23cd3a052f1d00000000000000", -"service": "00000000000000000000ffff2d557571", -"pubKeyOperator": "1599dd169884bb1967a682499472469aac12506a98bcbe6df44e1b19ff4ff4839ce687e7d2dce079947f5e15ac875486", -"votingAddress": "3UDZJ3rEQZrzGbDZqgMvziAUzhfp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "24ee1be70797969c1edb45c164d8aeb77ffaa69130432796f410478c5cab256f", -"confirmedHash": "27bf81c9962b2f05e0f950120e68bfae23f450cc6cad05851200000000000000", -"service": "00000000000000000000ffff55d1f110", -"pubKeyOperator": "05c3db4533948337ca2043e87599bf2389f456f673981704e7ddefea7f27375056d5de2e2fb89242e7d511b75442aff5", -"votingAddress": "3dwtg6HkUpYk5jRhdVcM579qQ5nk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "24f1a03ccf8b432eb3fb0cd824b58da8da32efcbf5554c27144734e40bf0f911", -"confirmedHash": "d14c70c70106d87958e6a301bce622f792c0abf3688d97cd1300000000000000", -"service": "00000000000000000000ffffc11d3942", -"pubKeyOperator": "0c80c198d0d1cb628f08af4f229bd9846ff351159a911ce37ee145db6372c8975ca4d34577d549a2e8019599107f784b", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "250fedd1d5875d7bc2409fc2d1c52743d736be4cffa9b8b7bb16d0dd00a746c0", -"confirmedHash": "e991ac9e5906a7a54d7e0b7672a211d4839a6a7c568c05fe2900000000000000", -"service": "00000000000000000000ffff92b99f37", -"pubKeyOperator": "082190cfc0f16242bd4afac5fc2fe2cf3147cda786f78c613994dea88d9daaeb27b09c4132c48b7658ccce16ceabaef2", -"votingAddress": "mh1GksETDjCy94PPsZXxKFHPZUy", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "252506cae70f8bd48bac48c19d72cb276feef4fa890f42463a6e31dbb1b21e01", -"confirmedHash": "9d4ed0cc8b8d1aa7c55e20c41c2747c66ef80b0b30293f7b1f00000000000000", -"service": "00000000000000000000ffff3625ccff", -"pubKeyOperator": "8b6df84975324519a4dcd80175230469b22070e57a53588dfedb7e4b48c736cf41c474ffa7f0b73e91a0c30c5382ad20", -"votingAddress": "BVohGgdYkbhv9tX5pfuPv57xRF7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "253192e9a5b1a79c7f107abd0fe9082e44f94c879e639ecc53bf01101004815b", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b09a", -"pubKeyOperator": "08351bc01f104d1538552ae1ff3398b18589d2abaf2a2eeb3b0e28554b843a44c96e63afbee7773507b18bde798e6dbc", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "25441297f74ec2cdc1a0b70eedde62e90d614bd240cfd30bb2f27a4454c24574", -"confirmedHash": "7eed24a156c8624d890853c684b0be4b10c23606ac2e6caa0000000000000000", -"service": "00000000000000000000ffff42f4f345", -"pubKeyOperator": "9048f5ce2d0235802d727ddd800114d817f6cef225a9ebb2f5cd0eaf6cf3f2ebeb65c3bce5239a156acea6bb5edad3be", -"votingAddress": "6J1AcEeFGZya5BaQWciWpdD9Y42", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "25561202391061db3e4815f319aebf4b203cf4cd6589d3ce4181b95459c242c9", -"confirmedHash": "6f0ad2423f11a9a9d0935956979411cd72434e5e360c4bb63400000000000000", -"service": "00000000000000000000ffff2e1ebd14", -"pubKeyOperator": "83560c4e3eb95a0ed4c549bd59b1f6a2f01b13f61adafaf75a442e57825852d330dc4a4163c02da408bdfbd8896a7c43", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "258456d1acd8e635d1d6f3f7d3ab1b5321dc3819f79ca4c5b182522175631f0d", -"confirmedHash": "eecc978bf8d02aa2c9d7f765a32010bb265c280fa566d02b1400000000000000", -"service": "00000000000000000000ffffbc28b6df", -"pubKeyOperator": "042cf882f0ad42f0973cd779b9f434d072ff1e238a5a1f9b61e4331485569bc6ec435b9bcd5047ab275a10c7aa0a36f5", -"votingAddress": "2FYC9Sd9PfLrDiYZuf3uxj2VqyaU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "258d833cc3391ee4cddfa4cb508c0025ca0055ebbacb07abe8b1941392a51109", -"confirmedHash": "36e255211b1e72382e078b646118ddbf5ac4a0e35323fabe2f00000000000000", -"service": "00000000000000000000ffff55d1f108", -"pubKeyOperator": "85abe7166acc5fa57890138913bed8c3fff0d98bd0c4d055dd83b1efa4edd13a056952f67386fbbf6793556785bf3727", -"votingAddress": "2AjiTCZ916RoLQEyoGtBjqxa4Dq1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "258feb8cc04832799aacaa904b059a0364c5f68f730c90ea6b72e68a9a6d9524", -"confirmedHash": "fd9e4c4e00d0406bf847d4e122a27fad240db204ea2149211800000000000000", -"service": "00000000000000000000ffff8b3b15bd", -"pubKeyOperator": "16439399b3f2d66fe071ecf6f1f4b2026908abb197f25025252b1609df48b6f37879926d78e2e807cc30df617711c1f7", -"votingAddress": "fCRA4xASCE84bP4qXXEVJfM4LR4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "259faa6f4d14568e7c334db6b33ba0d5ae105ad9d39fcae4bb2a36b72ab72454", -"confirmedHash": "f6062d683050ed5ff55a87460dd2e79f7eaec0542a3dc7740b00000000000000", -"service": "00000000000000000000ffff87b5084b", -"pubKeyOperator": "022a44024a4c38cc690e2f9cef86a0feb2c94d119533822628ddfded2a5336cdb1a1a9dcb5b08dfed6538ca3f270338b", -"votingAddress": "4JJqfu473Lz3TwESUnQ2YKX9WtEk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "25c3e5aa673fdfb21c05413c128206bafd143420f80d0a14487ac414e25b9333", -"confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", -"service": "00000000000000000000ffffc3c91893", -"pubKeyOperator": "8d1da9e568eec1d0e382710fd90bce2d61ed708493eca78f7a75daaa3d3de7b38c8dcb6b46f877bcd8d2de60f5852164", -"votingAddress": "Qs71UrUKGNdSWwQ2nf25K18YfSP", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "25cc10b1347ab218b03199d02126bb626e658a0ead6aba9666bf021356fa5e20", -"confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", -"service": "00000000000000000000ffffa8773e59", -"pubKeyOperator": "0a6efd9f8ed3bd22b11bfe23b1688f13b932a2679a8c6a82666eb1b31011df12234a024ea1e143a005c9299eec64f104", -"votingAddress": "3pg9jz7WqXuKyeHXW6xAigazRbmb", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "25ccf8e288572d11c0f4d8832cec7d8fb472845056888cc5310dbfa14e7c0d60", -"confirmedHash": "82966730973b79a051b031201909853dee52dad0a63352330200000000000000", -"service": "00000000000000000000ffff14d029eb", -"pubKeyOperator": "160ccf7e952074a6ad4ee725628a8e55cf7ca705d3536e7e8dd985f179c48a3917aaeec7fff29c804c37daf3798b3d47", -"votingAddress": "3D7srGVNkdu6MQJ3gi2WKQuyoqDq", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "25e415cb0d38b4d6c4b086e3af08034eb8d8a2c1a8b49e16e8333dcc2b81a106", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b07e", -"pubKeyOperator": "0ce3a14571a4f84121526fe37d63660cb3d7640f39b8b3ab6411206b163fb2d3b65f166fe29b30ebe05c99579160b627", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "25e50a599f3b655b9a71e3accfdcf687289472d7b3b4e45cdd2d7f0a74aecf8e", -"confirmedHash": "2ce317ce61c7751e827abc118c9b909bfcec97f530ca758b0b00000000000000", -"service": "00000000000000000000ffff2d4c24f1", -"pubKeyOperator": "8d84c2ee7b2b3053a7ac9da9db0f8bdf6c74d1d1f3374bab8e4efd0a1bbe4abaac040a47dfc9e954ea53a8e115ce748c", -"votingAddress": "3TKXD1sUsC2pB7wrxtzGHSD9uBK1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "25ea5a08b150b5de70aa892e8306c62cf94d02a46883695ede7c9e9cdba95ee2", -"confirmedHash": "fd6b1568e3ec897a4394cc7dfa6d81f5005b84421636fd5b0000000000000000", -"service": "00000000000000000000ffff50d1e03f", -"pubKeyOperator": "8c0a5c2a45599abda21deeedd1d012b9df8ea2e5b604786d6fea32f77d7964db50da34fad2200e8c87bbefb9dfb37ec6", -"votingAddress": "4GiQuZbueK2UvQsoCgjGdo4JhQzy", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "25f62b576562ecf7db44f0a623403816af6147c59d7c3f658ac91866e79961bb", -"confirmedHash": "6e010d9401d844ca55e42021a5a39b59cfe67c1eb19897610a00000000000000", -"service": "00000000000000000000ffff6ba1185a", -"pubKeyOperator": "05bb77da867f173038ba6718e1a0bfe7ca728fa54c529f99a442c31c6db6e6872ac49589a558fc6a3ea1c13f3fa46a3e", -"votingAddress": "2gxopJHzXcGVvndwv4LUuisF4yMr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "25f76637ed7d30707e65e03d6179e2bdfa8e9d73c6a55c0f6f04a0d2ed5f857f", -"confirmedHash": "a73b352f876b5ed8a852bea21c0b07009cba2eb83052d7571700000000000000", -"service": "00000000000000000000ffff92b98c16", -"pubKeyOperator": "806dbe23ac86a9079a805bc3199f0371938f072bd7303b59869e2493e5c6d1794ee806fdbbed5f548f1b5609a7b50e56", -"votingAddress": "XZ4Gkn4MgSFv9SDk3EBVdGqNvJr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "25f7fd34a45c7b3e54285c324b98bf1e7bf8b2f47c2c1b201a3f6f01018cb8db", -"confirmedHash": "41574318b3870010f419c1f36bc89bdc326b8e3089b143de0a00000000000000", -"service": "00000000000000000000ffff2d213df9", -"pubKeyOperator": "8e18bb44f5297984e6030a13caeb4b2452a9e749ceaee6c2567df6c9b8dcb2f8e6cfe64f4f0a73d3c0d3a0364ee94357", -"votingAddress": "3td9UeLRg15SZMUXL5ExDa8JCvDE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2600f5242996efd5c5550bd9f209437ace77d8ab327c23d62bcf80b0b95d9961", -"confirmedHash": "184c5b4a54fa33ea611870d7e6efd7b6646ba5f550e78fa41900000000000000", -"service": "00000000000000000000ffff5eb0e927", -"pubKeyOperator": "8f6088282a99484a19029b68ff5869c966b914410dfcd90103c5af39c60cd9549ce1b16dd076c6c57e79c20a0cb09e71", -"votingAddress": "3DXSxt2QrHP27P7Va4YcZZ39w3cj", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "261160462b90ccd1c7bbe784243d030eb20a18dc208fd318307e34d7fd7d66fe", -"confirmedHash": "237a8f30cf852a367b602316e2a045718db4884c3c6814180100000000000000", -"service": "00000000000000000000ffff3353445f", -"pubKeyOperator": "085cd1a7133f5d4db797b76651e903c047840e27f8326390bf72cc78c6159e06485cef8e167edfdd87e8d44beceec1a8", -"votingAddress": "2sEf4PW1Lr3zQb9h4yBMA5LU4wnJ", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "263830311bc8345d3022db0fad309dc4ff8ed66cc8a88832271d8eba11ed8658", -"confirmedHash": "e97f7332fd9ccf21cde389d5ac4e3fa80f2e016fe0b732d10300000000000000", -"service": "00000000000000000000ffff5fd87e2d", -"pubKeyOperator": "1584fdcf2f9f60f65f6b3313f3e2b7bcba9b6744f52b464c1460ddfec710d1b3b5719827cfec6c1040f2e53895d9c796", -"votingAddress": "42keGc6RPYoRQSBWt3Dt9Eg6SmDS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2641bc3aade9c71c93006892f7b1f7530c9d0d23f408d1ea6d06ecaf24de640b", -"confirmedHash": "c94a9d5588a5ea2c85763b4ba3d782e4367ddec66dbcbd581600000000000000", -"service": "00000000000000000000ffff23ac6135", -"pubKeyOperator": "826b65fe631a3d7a8c8efaac2cb5e28a103e26bd1983170541110e07953c681e791e5803ae4c481a0ddb9c90c820b1cc", -"votingAddress": "3QNo4E6ncLZiSizn9cUqKVWt7TmF", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "265f01f795171e655dca7b6e42f9f8dfb3d6e2b83088f1477a5000444c3a9b9a", -"confirmedHash": "f1b08d564bc40c353bd00db7a3a19332d98b531dcf6571d31600000000000000", -"service": "00000000000000000000ffff9f597c66", -"pubKeyOperator": "098f8c798448f5deb7f14f2da41bf4ffba681155d14d106f7498f1aa44e85004645e475aa0d922ed7ca02995092209eb", -"votingAddress": "4HpAwkSUgEsYFNjBjRmP9vrECtVb", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "266ce8c5477b858ce0a548af2661ab9339629ffc1c98a07679eb6014891f3e3d", -"confirmedHash": "8d9bb1b652535b7d9bac62ad5e289c8d3e763d484a988c373200000000000000", -"service": "00000000000000000000ffffc2875b4c", -"pubKeyOperator": "8e7ebfb9267f353deaf448957bf0878cc4105a91c50c6ad5282daf268e1b9d5a630668ec1e6041a089837ee33656ba95", -"votingAddress": "zppvkxLvxq1UYGReapxAVHLZLuf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "268da2ac4e46dd35b7cc635aec413a906d7ee0080a90d9cab7151d194fd3f0e8", -"confirmedHash": "5fc76b926a355b2a6be2d3f5adf7515d2d4b6a5fb90750a01200000000000000", -"service": "00000000000000000000ffffa5e8a9a5", -"pubKeyOperator": "0d8600b12d59abb7a52f0c73082c535c170aa86e8ebf64955d9f00f208f0df81fbebdbcfad5d7e439b48e7a2146e3ff7", -"votingAddress": "3TqPME1FKxeSPCi5ZamXTzEc6VUq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "26951c0e75dd6696a45e517f9a56b530d6fb1585e2a9d9b122ebe4d4ac5411e7", -"confirmedHash": "9b69f17244d21881d47dfc9dde03b5c7edfb25042bb5a8950000000000000000", -"service": "00000000000000000000ffff87b5349c", -"pubKeyOperator": "187fd173a8e91b430c4797667fd6432594247190b503575a6614704be0154ac9074d3c148fe6a3dead5bff96426d22fb", -"votingAddress": "3GdJMRb5W8mesSbMdXDmjJmPPaXQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "26a8f4e70563ee633e57830460dbeb9e24ae31a5eaceafae5abeded5056e0809", -"confirmedHash": "5f4df001517869f07b1e81d8b179499d85c6e62ba7f2d6fa1d00000000000000", -"service": "00000000000000000000ffff52d31937", -"pubKeyOperator": "02b6650f6595eff3000aa02c79e93622d843a76492b868a3d7730ec5055c7dd6c1f687b74932a0956a1c54255a852234", -"votingAddress": "3HviDm5AHY4BPh9uGdj9kXdPbYVo", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "26c5e6df729bbecede45438e73e1e113e1b701323fb7d7e2f69a1261bcce646b", -"confirmedHash": "2cc119854cb51f755274d6aca2c6c3f6578c8db48abfc1821100000000000000", -"service": "00000000000000000000ffffbce29932", -"pubKeyOperator": "08cf33b2c3e1e7c974cf0ed4248f645d97df22144d3b0bcf375d7857c95d429c3b6bfe01568cd7983847767fb3a47ef9", -"votingAddress": "2yGHhyfTw1g1NrG6MgWemoaax745", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "26c734f72d63a8b402afb99a6a87527777de8388c2311406ae0a6e2367b5b67b", -"confirmedHash": "8c1344b92d97ab3c4218ff44faa689934cee6633dddf40c22c00000000000000", -"service": "00000000000000000000ffff6baa9da6", -"pubKeyOperator": "93b5cf532924f0a4693b4552770ca20e73fd8eac1e6ca1e410297dbb298920b297a3ba24adfd0370258b4598affbe7bf", -"votingAddress": "strpWV75B6X59zfVNj8brfTS4vH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "26cddc701d68450348b9ba70b28f74aefc95a20cd9ee262392c874844eeff4c1", -"confirmedHash": "010c9b822686caa1f84f025bc0341f3d011191ad3e7c03020500000000000000", -"service": "00000000000000000000ffffbc28af49", -"pubKeyOperator": "19c6118dd36a17c3a101bdde49c633a91bc4e9540385ba413c454f70f87882a22ee2882491d948cfd1db7d7a60bc05b5", -"votingAddress": "th2wpRYM4MeLPWTaocnd6At3Hj3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "26e8bbb911a81aa19134407015531f07fc3050ef4e27aa1a4840940721f001be", -"confirmedHash": "d88c725471f0fe3b5a1d4b46e9d01fdeb794947d3bfd2bfc2d00000000000000", -"service": "00000000000000000000ffff0238d5dc", -"pubKeyOperator": "8ad3b50de0d05f07fb533e122fb2a6ad4829fced48e51ca9a03b91f49a0cc11834050777f60434176e96385ea8ca4954", -"votingAddress": "4J8xPqPJkjhsR8fJ5xxK8gWTsqWf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "272231f882280a532b568b11a694977f37290877c9839d0658dd313a976fc8f1", -"confirmedHash": "f897c846d0af4d2f9d20712d66ff920ffa266717187048390100000000000000", -"service": "00000000000000000000ffffa123967c", -"pubKeyOperator": "85a14150f54d08bf8c1c6c6cc418f5b652351e50f2bb00af02dd7bb98043f81ce9e5abc38db952af25b6d656f5d4ff2f", -"votingAddress": "28ogn6iy6cW1zRJDYEKoW9GrsGoP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "272b72cd25aac6f14afc49ce7b62e92f1866699c32b9a771ba3ee075e6cd3e80", -"confirmedHash": "cf1e8d6a35577515b38eb62254d6259f261be04f35b7fad90800000000000000", -"service": "00000000000000000000ffffa8eb5d31", -"pubKeyOperator": "0cd6ca6c7e2c9d6d100db78101c33fab5cf58239fe363bac101b80b22995749421f3c06954efa04426801388f0d9b49a", -"votingAddress": "2ZceykDzTXUMr59YKaZUwsKVWxSG", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "272bf7e5b4bfa4d2c87af09647d8117e5edb5e9e4843dabe16f3dfe42e61c4c5", -"confirmedHash": "960cffe0dd7c1e3710e3804bbd1acab302ef47ef4928be221e00000000000000", -"service": "00000000000000000000ffff52d315f1", -"pubKeyOperator": "96a49f41704cb6a365aaa537b23ca8592db9790df76a65f2a8fa45e478a5fd8075fbc842e98b738174d8ac16061bf7ae", -"votingAddress": "23uRR6AVNxugCbkTXn3hvmndGm4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "272d5c8c465670b23044e0aef895e2b8cc2e75524249599a0f3f84e48df6341a", -"confirmedHash": "addba3ec18632f8724c05d3234f91b55bf981a97b36352741900000000000000", -"service": "00000000000000000000ffff5f6fe5b8", -"pubKeyOperator": "8952a062e0374797e6746f7274aabaf9311182736ea1a6ff73ed51df3d38437b5d4d8783bc990f1be573da6b607329a6", -"votingAddress": "2uyYxombS4pHkTFGgvW3RkWsZuUH", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1760472 -},{ -"proRegTxHash": "2756cac97eae03d3088b0537fb46ba154acc09390306f7156ad2b8947358e1a7", -"confirmedHash": "24a2f21ecabb472f0affe870eb8d345a5df1819c198b0ec30400000000000000", -"service": "00000000000000000000ffff55d1f238", -"pubKeyOperator": "13fd0f80c39ea8bc50ec6cf90a431e08e7b3254674f1396bfc20b91053baa7670e8bcd20a308956e7b6d5e122f26e472", -"votingAddress": "8Xyx983pdGWQ4RbpdQo6nt4L7sT", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "27659da5608041e494e578a009fa46d5777e5fa2132fb06ec458ee28afdb7c0c", -"confirmedHash": "a85fca9079c952dd736505bcd851a91aad44499894f4f1fe2800000000000000", -"service": "00000000000000000000ffff340ea38b", -"pubKeyOperator": "07137f495581296910b3a5d589367d7051f9836e8319e8e125e2dc8d1fbfe0cb43447987e21f9466369b61682427eded", -"votingAddress": "3RjibPMYUcJPbndKoDX817U3rUe1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "276c3ca348238399d4e1aaf9e38910005b96992e86dae0f179c8d42cfc08e009", -"confirmedHash": "50a4c2e17790cf4b393eb396ba5c55c7f68d3b5a527d3f590f00000000000000", -"service": "00000000000000000000ffff52d31940", -"pubKeyOperator": "9605492b344aa5c9701db30973af52c67559e4faa6f799e0cf27f812c15ff6bc7024b620dfa0a2d93ee03928d120694b", -"votingAddress": "3NwyDPV6si7vmYNc2QRB6cgsWmJ2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "27732e4df33049b8f5aa112c78048ddad6307ec5b0cf15322a24ee94b964518a", -"confirmedHash": "152efcbac46db5c6001aec8126572d28b6d82a8adbd30b2e1900000000000000", -"service": "00000000000000000000ffff43cda570", -"pubKeyOperator": "8190e353914bdd08322597fcdf86005e761c3d30d5ce4ad385699bbde70c476705daac0d0986eb1918cd0bee91ef28ae", -"votingAddress": "2EdSNCrDC17QUL8Ma5KXXMakk4vU", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "277928e0fd563ca739e5b015bd13fa825e78b75bbc775d2134daff08b7ed77ba", -"confirmedHash": "81f093493201442e11c4f7a475b5ba400311a79c3d0587b52000000000000000", -"service": "00000000000000000000ffff8ba2699b", -"pubKeyOperator": "0aceb6394d7af002d15a436ac9ae94e6e438e114c2ce30fd2858130ed6951b7304d30a6f0ccd86377d9193e2bbad2a9a", -"votingAddress": "3GcYVKoA3JmHjj6oRFEck3u3ezHD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2783c3f3adfe5c3a8673884161878f01cd8b75985438906a47a7c936dc7a989b", -"confirmedHash": "a7d7dcd1662bd17a3c41369714b2655f0b0aac88f80866640900000000000000", -"service": "00000000000000000000ffffb280ebad", -"pubKeyOperator": "0437f6841cb41267d16c587518c66fde7706590124400ccb18b60c392b93e9cfe829733793f640d965ed38957b5b4725", -"votingAddress": "3FB8sFqW6C3S2u6d3eaeoJekCurZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "278a764b546cba23464a9a281b371a3cdf302485fee4012c2ff8016a902b040b", -"confirmedHash": "1aba6509f5366eeb36347f06e368584c78a58381c79160711000000000000000", -"service": "00000000000000000000ffff6c3dabf6", -"pubKeyOperator": "0e23e5d17a7fe3b7db4c9e08b55eaeca07b0cb61463be669dc808f3a5c4fa43833d33f633800dbe34d982ae75addaa39", -"votingAddress": "2bikfe4oh2rT4sAYUiYpp6CE9oVC", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "27a25aaeb093f178dcdb066e61021cd7bafee58d71238d287b008af396e5e8e9", -"confirmedHash": "df90b320745db17a6cbe6891e534b35cb6246fd4f6b3b4173500000000000000", -"service": "00000000000000000000ffffb23ef1c1", -"pubKeyOperator": "99d1d254f84ec7ca0c5169d7d0ad2bb84a366ca0ddf38664e950b1c4667f92f985cc6fa85f56c1b9269989652d89368c", -"votingAddress": "4WjUD2N6gVJhDjdqD72wK8rMCSB", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "27c54dfdbf6dcd26e5cfc97ffea6ef2cf4c45e808c4af05370883fa5936bd288", -"confirmedHash": "fed4e2a4a4315f393da23cca31ca4af92af22d728141b6142100000000000000", -"service": "00000000000000000000ffff52d3158c", -"pubKeyOperator": "0316c4a4cf715c858d53b3bfec7cdbe285c6cb145545a42554b45784aa8b2763fe3ec0dcf7366773948f190992631799", -"votingAddress": "Q1EK7uKnstTdhecfdeju43oo7n8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "27ca5e3037cf4223919baf2fb988592237521bc698e9aa1df574f5b7ec7bb37f", -"confirmedHash": "a635fac4fcc7c553d6cd0669946f0f67c9df69f02882d4d50700000000000000", -"service": "00000000000000000000ffffbc28cd0c", -"pubKeyOperator": "0e389807328355fc40c7a9c8e1e8736068a8095057137d2a5afbd44f0d4c75e818354403259863ea234f6d8a0796e3fe", -"votingAddress": "2dTHTt9KdSC9rKWn6JpJ6UUYx7eu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "27f2b65cbbf7647175659e020ca115c4ef835b2ab63e4a24286524d37f58bfce", -"confirmedHash": "fbfd504b4864a79ce011b3e447dea84fe79519ba3eacbdae2700000000000000", -"service": "00000000000000000000ffffbc28f16c", -"pubKeyOperator": "8f130e8fdc93ca464c87efd0f42046012898b557d4a205f70cd319ca6e4da3e19b279411d9b3ea49795600a8654c06dd", -"votingAddress": "3f3QivDxFMH2Spw6EaDnnNAF8HUa", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "2804ad85ed8fc5b09436495f791a1319dd9d29892eda874682d5d49153047f05", -"confirmedHash": "40eb226bde6acacc89fd5f27079c0541d1127e4d79d63a361700000000000000", -"service": "00000000000000000000ffff5fd8e664", -"pubKeyOperator": "056a6247e6eb81dd59ca27cee263d06adf9ab29a85a15833a32e1554bb43bbe7a40d07f8db2296d0ca5c8e378c1af243", -"votingAddress": "2Lb6YR21x8hWcJBCAy9V2zE8nM1o", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "28368890652ab39ec57eaf26fb9f844101c84d493c329f90d3057fce3d926d61", -"confirmedHash": "a3219d36fd87140b7d2e96f61f07c271faf2b259461a08a91400000000000000", -"service": "00000000000000000000ffffb9e45384", -"pubKeyOperator": "0d1631266a1dda98c7ecead10d4fb3cefde865eefa1c11fdd6a820a3e2f5b52cb634ac91a1a9ffab35275f0a74d9c95b", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2851a68dabaae28f25708cf4f392f5ceb90104aff139d009e7169978631171cd", -"confirmedHash": "deea24e962fac02cf223dd40dd3f1d84e4375d0d51276cb70500000000000000", -"service": "00000000000000000000ffffbc28cd11", -"pubKeyOperator": "800169d58d0084a18067e77cdfa23fb38f6231c1c961608e66d8c3523560a2b1951c1e89a836dbe9c5ed9ef6a3d550da", -"votingAddress": "nkuKs9AV2JEkgPAQvE8cnU1Y3wL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2860f260d3a1a2117fcbccf3e69c796376b51ff07d4d2d030f4bfd2739fc4481", -"confirmedHash": "1fb9b67e5f215080841fc9a6fd5e05597c532228cf11a65e0900000000000000", -"service": "00000000000000000000ffffb9053630", -"pubKeyOperator": "98a55cf6a78f36ed6013589363e6a32aae336f0ae8281596bb6fd077fa1c3c72282fc68206f0e550aaae307fe45ec889", -"votingAddress": "2PmAkkWi35iF2V4JYzn9B4vBrzxC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "286ba669f0a6603053eac9f27621789512890a644e32f41e88c1c83c321d9690", -"confirmedHash": "24de7b01e4ef1e9d941f1b1c2f895102b99b37fe9376e8d72a00000000000000", -"service": "00000000000000000000ffff6c3dbe7c", -"pubKeyOperator": "84818cf01dfa27ed02572f02acf837bce264fa15aa38a19c1081468315f969e5ef424ea03ee30eca6537a78c587983fc", -"votingAddress": "qbzX1NXUfLaJP2kZcbCVMjLgpg8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "288488f00a40113c05745d0b2f72f22f3e09bfceeca90eb2863a83faab8c61c7", -"confirmedHash": "2ac75221a701fa672c78084449528d8a8ad36aabb7e8add90900000000000000", -"service": "00000000000000000000ffff5fd87e29", -"pubKeyOperator": "0ab5ec94ef680cb73479942fdffd0f95e5331f498dfe9d11496538b34097a4118c759d48a748e23680d0abf80460ebac", -"votingAddress": "4UAa9JkWe6hNTKXKKdZCiweLQbMU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2884a85dadc971a2f06419a641f20dfba2b1c906e452a3bb055e7127325e0609", -"confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", -"service": "00000000000000000000ffff55d1f26d", -"pubKeyOperator": "0ade39c629ac44f65e3f084673c2f5b3f4a219c617469e27f0d1b6d187cc86b84cbdad82163d2f839023fe84f7858c54", -"votingAddress": "23bikaKWXbNFCq8cWHoN7bCBJq1f", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "28b43412bcd3eceab5f72c8c2ea78a7ad5a66df0b79ffdcd7bee5ab637ca1a80", -"confirmedHash": "7da0d880d2d36c3006b6e7b4f503475b36d5576761894e391400000000000000", -"service": "00000000000000000000ffff6883ec72", -"pubKeyOperator": "9872e8bb61bba997d32cfa81934d442f2de0e9645fbc6d4d90f0632cd33c719901ec6e6d64d7109d3b3491c3b0689199", -"votingAddress": "2tsTRUq5h84LbNM9W88jt7sSu3a5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "28b847cd11fccc2f83b5aa04195a5013ca62ba3703e239544a7a51a279156b26", -"confirmedHash": "a698aaa06fe7a363ec0640a853b189470209949734fbb8ce0200000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "2sguFBbgMT6hWj4XRoTCS4j5BS56", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "28c10a76a2bedf0eab5ecc942876939ff02ca83126b1341b51d429aa3563eccc", -"confirmedHash": "4012aac170fef2cfdc3bd3c387dcfe21aa8552c7769dde450500000000000000", -"service": "00000000000000000000ffff44b750e3", -"pubKeyOperator": "87b288fb9276d9ee276bc088d96a9b1e59917eaf74338472124dbaff2e0949667c8302933a11b00fffba399c738ebaf1", -"votingAddress": "4FLUL9thUPjSBg7vUb7zWNYjzkKU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "28f4bea57aff2360684812bfd83f3808b2f09cf4c413fca813b3aedabc72e649", -"confirmedHash": "db21fc7c32b05f30bd46d077d2073e32bcdef78b555580121100000000000000", -"service": "00000000000000000000ffff58630b16", -"pubKeyOperator": "9624a52f9f4a0f623af60e23ba52c46a8768e7fddff5f7e551f6da3c3f0f5b2a02988118493ac71dfa19d8f36a4a7fdf", -"votingAddress": "3NUBd1cPuLZuN3XP9ewQerKtG2wn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "292a3488fad1840abe752f3edf9442a6ccb258f6b60ca1658f80cb1335c2c4f1", -"confirmedHash": "8eeefdc83572dcd6a48cdf185e3651a04fdd009fac74b10c0000000000000000", -"service": "00000000000000000000ffff55d1f20b", -"pubKeyOperator": "981ac36a850aa1eed82957ab100f707a6da909a5bd0bbd6c8c845eff6c8b12be4f146898c7ecfcd32299d0f54998a46e", -"votingAddress": "ZVxVwdRND5hciGgd6uBZpPQkM6n", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "292e1102b02ece1b00222fce2cb22d341dd0fe26f6b930f90482237a6fac93cb", -"confirmedHash": "eacc60fa07dcf71b346a41e82d72b488473e463b71b4e63d1800000000000000", -"service": "00000000000000000000ffffbc28a31a", -"pubKeyOperator": "8ecc25139fe2363f0daa441c0430c08aadec3b5c59684cb7d514ec04c3ec7acc9fc77b85d3b5dabbda1d7f1f760a23cf", -"votingAddress": "2xbVHvDHXt33xVQMkmk3oVQ4SBeW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2932be5ea146a783e2b72de2a7acfd910bea72e0569d10262778d8152c9a0aab", -"confirmedHash": "41d5d6e5aa2f293501c33ae1b44af7339cb679bdb978a63d2b00000000000000", -"service": "00000000000000000000ffffb00991f0", -"pubKeyOperator": "015ae9f1e5392a9952a6af37cc548a604d67a3e1b777126c3bd8e44b48c3fdc0525fd435e9bbdd193fd946ea0647bbdf", -"votingAddress": "4XgDM2dU7hyurt1Jo6DHPnLyZtWp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2937b5b87be3d826063145e644fb130b25c9d8f33858da5f625eee6f541b8b15", -"confirmedHash": "8f6e99eb86aac24eabf82bf70ef5634b567ad27599267aef3800000000000000", -"service": "00000000000000000000ffff22e7de60", -"pubKeyOperator": "11b3b0cdcba3109509204ee0b8a1634bb42c668c298b3581d09acbf9481f70cfa42f1f76670002168c2f58a0790b3e84", -"votingAddress": "BdDuqeXZWjxBW3RF4xuixsbFfXA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2946e1f5c72010e7969b41de32aa644765269bd1d8e656d8bfdff390a47669f9", -"confirmedHash": "b0b6a5fe8ed4f98b68453acccefd9172bda6fbe23454c6c00e00000000000000", -"service": "00000000000000000000ffff2762c9f9", -"pubKeyOperator": "0be2b60d45505fe64fad7cb9991394d3ea29a7383e8952e40343db0cc6873735f22b21eb0e210d89bd981a82d9a07742", -"votingAddress": "3UHtUjGUwQpon6n8NwuV8UEPnGXM", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "295e00e41d92b6092568a1e64edc1d65407691b9939e57c8f15fe67e0f1227c8", -"confirmedHash": "74a7e681f40c0ed3da984741bb702716e6e278b0ca94442c2800000000000000", -"service": "00000000000000000000ffff6deb40cf", -"pubKeyOperator": "1311b1fe2547c1c2e21db4f55cfa0e25c01d486b6da4c0a7a07d79b2e043353e895a45206d66dfb646075b17f55bc4ca", -"votingAddress": "3FtxttdnrqSTTq5R9ReWo7VGwUv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "296f7722af7dc382a7b29042b48c12f34dad44b65627157458b1c817b3d73515", -"confirmedHash": "21fa64eb92df4a915214be071ccaee5d6994cd7a005201050200000000000000", -"service": "00000000000000000000ffffcf9477be", -"pubKeyOperator": "9799709b1f7d39da3b24df0190ed9a49b17d6d26210508c2cfd1a4a19b7a7776e5ecb71c8f909d06fa596696513fc9d7", -"votingAddress": "C4j4hkBicr7RCotrdCv31KLL61S", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "297c59cfeb4e328d3bf1cd8d6c69cf04959a976ec737a0d560c16104750e9289", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffffc17a8e78", -"pubKeyOperator": "0d756069d906c09fde56f3fb21b6b9fa7a239a7588e4ddb75598dfaecb01ae54471d2606cde27cb9d04e370e8ca22faa", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2982cd538fa984761b6c9f0e9e1e123d8e170ecce3ab5aa8459d2c8d5d15926b", -"confirmedHash": "43d6d86e68a2894f3b2eb86ad08f68444925f05e2062535d0f00000000000000", -"service": "00000000000000000000ffff2d3f6b77", -"pubKeyOperator": "10e0a78d79ab94874dce8ee74a96c4d73bb2a1f4a8d4b1a0547a96f1c127c10aea4ca58088c7a264726a54ed32250b1f", -"votingAddress": "32kc4goxYLSsaeZTZN1omYxzPxCY", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "298d082cb3d520339cd6aef69f07ada6fce1a9a9a659a887ad717f27fb515362", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff84919933", -"pubKeyOperator": "0e84fe5993ff071c823b56d0dcab880b1ee55d1ab8de23db5df0c4e2eccd75fe63775d41cc93e8db186a6c9fc5a2d2e9", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "29a5744122b2ef591c562a976add6cbdabe9b96972ebe84670da531a5e71d937", -"confirmedHash": "00bb2dc1d2afed01d31f456db92285ea6fc7a54b98c936720800000000000000", -"service": "00000000000000000000ffff55d1f1d0", -"pubKeyOperator": "077b399a384a27abc124a310edb645738039bfe7ebe0a516caae13f0bfb6e3485abb9b57e9c975c9270c6839e747c34b", -"votingAddress": "3CnoqWX3vDVojkvjSdhjtzUNz65K", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "29b825815eff60b23ebaa2236b8bf9f46a825a5bf93de2c162a08ba604d6675a", -"confirmedHash": "b4389bdad3d95c0ee49fca8ce81ab9ba6068e8be3c68a6511400000000000000", -"service": "00000000000000000000ffff2d5575be", -"pubKeyOperator": "0584bf83ac4cb511b79c982507947649727c907074bc9232c3baea91e8b8159e5678a479cda6c9416fa1198ab453e92d", -"votingAddress": "2uSP6TencLC6iCqmnCGVGpwjVAUJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "29e200a83cf91d5d11a68a2c24c2f21affacd7f1d561e571e330320ce1f15d56", -"confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", -"service": "00000000000000000000ffffd41868fc", -"pubKeyOperator": "0e18210c8961d0b7183591548651ce6a9f636329ab836118150bafb9b1f078a404abdf969cdfe51928fc75355bb3e222", -"votingAddress": "tt38SBNkQ2jor3LUonw883mcj3P", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "29e40dd17ec53d70b6ffbbe5e1424a7a503651c7a7aff56acbe914cb05d88993", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b07c", -"pubKeyOperator": "0cd5b8658045be39573d1c4f72322a070305a3fe068830e20d5e8c72b63cd2ceaacf741183c1f8b09df75f4f269824cf", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "29f05a097398d8806aa952c69fa724b0ffe53a6d7b27f8d227d4064264ab14f9", -"confirmedHash": "e352b1f19966d28a14a505caa72b4e90d844f958c91257a60400000000000000", -"service": "00000000000000000000ffffbc28b6d3", -"pubKeyOperator": "94b605541d179ffb60ad538382c986110dc35b8cb8e859d0f7288c5c594bc0dde24a2bdf4178092eee532e0240ccd93e", -"votingAddress": "32g64vkSDNYTd1RwBREojuKMqirj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2a038b8f2029c30fd01e34ce69e6e287d5917ee1ee898f69ad5da78779014259", -"confirmedHash": "6b0b7096147be77aeb538b83ca7bfedea24969c7bbe80a271400000000000000", -"service": "00000000000000000000ffff52d31515", -"pubKeyOperator": "0ccbb3fde3de721bf7797290cdbed6f5fa139b6b37bf5c663ad2d668827b52b31e82cf37e2d73c6e43ea0cfaae987ac4", -"votingAddress": "EhCBgCqUMvm3hsnCUfhPiCHB9Rz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2a0d781c89546c9923e03f7d771ef1c8eca2079d524ce74ca30683e449e50827", -"confirmedHash": "edcab1b0eb8d5bf56c74c6142d7867cb031c2f41b217587a0e00000000000000", -"service": "00000000000000000000ffff9750f4b1", -"pubKeyOperator": "0cbe6802bcabf08a382901aa2cf58f017cb0bb865d23d98b511eba0206052c7dfd390128d052b6ad3c3071ef081871f0", -"votingAddress": "3zmSxR9eEAMECmNA9u782ENgG8UV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2a21d306c4c4309a4fd839487ce36645ed06705ad9877700e562c601264e888d", -"confirmedHash": "feeac88e40847ee1da5b04463bdd26de999f47adaa768ec70100000000000000", -"service": "00000000000000000000ffff5fd8ff45", -"pubKeyOperator": "9780c17b0520daf7fd8fbfa14511d70d4490a2835db916d8de573e4cfa0b4095d23286593ea93ae0a21c993b90d66a50", -"votingAddress": "smhHvDVYUgtiyo1qbvyeoUKC4HT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2a3080e912a750f3b055513cab099173694fa79e7b1b18ec58de5840880d7270", -"confirmedHash": "421b37b16f952402223f71ca9c8c83bbcedd62e78196f4604000000000000000", -"service": "00000000000000000000ffff2e04d9e7", -"pubKeyOperator": "8708ffd0be3230df1b6d2fef8aa284437ec01cb7a40c82226ce2f0af06fc7c923d7ba8f9c87c86efc0c8bd0057aaff3a", -"votingAddress": "3xQfkoggFULWLj95VnYft6W1EJgp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2a3e0cda1b7f4c7b8a723d8986dfe3fc62ad3103584c6d91b6b63795071a0568", -"confirmedHash": "e3c35885ac9a51cb683c576ee4c036a9b2a4ba467a4270f70500000000000000", -"service": "00000000000000000000ffffcebd24da", -"pubKeyOperator": "0f070dd58ea94827066bca09659c52cd254362a5a16c6d4cc7e9d027d12981dd5975060622896caa065add997d1ecd08", -"votingAddress": "2D2zmstHkPXhFhEnpjyAKMvLMH6J", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2a3ea74c2229d74d8140aa11e0c3df1d87fbb2860c2fd5d553227ff27f26b877", -"confirmedHash": "b54c258faae6930b2310e5ba33b358011ba81a265fa00ff70700000000000000", -"service": "00000000000000000000ffff52d31548", -"pubKeyOperator": "112e9e269ef8a76a221121e7b01b2f130049ab5f62b1e57cb38a811044211d2ff1e2f2a7ceb61093a6842c307b327424", -"votingAddress": "292UQGom5kQPjU8Jrg2MkzjFRX6k", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2a431aefe5a7db5f21a6e97e299fef701831678a5b9b7c4a641fe526d314ba47", -"confirmedHash": "42144adcece51c1b20e7e04e67b26dc09cf2ef144129260e0f00000000000000", -"service": "00000000000000000000ffffbc28fbc4", -"pubKeyOperator": "14637f80ffbe549b24b66e2e19e429dd60c70c741c9f394c1bb5b3e75b67b7e0ea1c557559580f19c4def136bd237c96", -"votingAddress": "3ZDpQuCN5Vz1sm8zQHy2ncNFDWKg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2a4cbd95f03a38fb74e0ddff505b9506004c5b4c37dbe9d99a10cd9100fff445", -"confirmedHash": "8ef9c6166c5acd39f94a0527a0cc4887ceeb0040e96616710200000000000000", -"service": "00000000000000000000ffff55d1f1d7", -"pubKeyOperator": "861c1efe8e2f4348c2708926ba9d5ec7eecc9803c2fe380aedee31843df5739c3011cc20b9f46bb0b4a001599d75a745", -"votingAddress": "29yvrq1uyWTSjhXNPNwqCPtZKPfq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2a58d71aea5958a041b2374c3704254d994d05c5cbee5486a3593d213ba813d8", -"confirmedHash": "502bc00dd9a8908603f7032dcdbea86ef0c535d12d9ac2cc2100000000000000", -"service": "00000000000000000000ffffb29d5bba", -"pubKeyOperator": "04c04d35847b9ff0d1ebddc0c9f45905a134c0c0077d2322da3de2fbf328207cb65ac44009a3022b83d86e6164dc7a61", -"votingAddress": "356JDWVTatu61FgF593A7Buomsfv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2a58dcfc501fd836cfd83f3959f073453cd0f9469d81ea924b8668822c04826f", -"confirmedHash": "4a39a9f6dba557f4d1e6048c37501e0ee23b447ca112ab5f1800000000000000", -"service": "00000000000000000000ffff36270a61", -"pubKeyOperator": "04030afd2ec537dafbc383c88ed156208a2bba06214d7efaba8c8d772ff3d3a1105f4f389ff87d38f1413e9b25109d00", -"votingAddress": "4TSSmZpg2w8CskLKHuJMTgZ1kgFU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2a590f2648c7a6979e689b1010e04e46e49544025ff1b221328347cc2aa5b201", -"confirmedHash": "a3e43c05adcff93d62c4c6011b7031345c56bd4f789b68ac0900000000000000", -"service": "00000000000000000000ffffb07b39ce", -"pubKeyOperator": "0d17b849d19bd79bd7266f8311afab266545e71dd67f543308c7e33dba6dec2ed9b09aae023a12573974e85596ec93bf", -"votingAddress": "EcaPN8ngasjA2Wzk3diSPfaeJu8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2a611ab3104414b985ac6de9cc2411465739ba09f8218dc6e435a0758a726e86", -"confirmedHash": "7bff4f371c94a24bc8bd45d996e8e1e504972248543b91fb3500000000000000", -"service": "00000000000000000000ffff87b50fe8", -"pubKeyOperator": "10ea71b10574820a89a5b4b2eec685a82be18aa0ebeeaa49e2077cac013ee3e3bb955f2c7323b880c568368a579d98f0", -"votingAddress": "2ky26QYkWDSfpvMEGdQdzeEiVL1N", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2a7289b2b5e9bd3d0a2cc72274c3773afb2e72d2a0be3c1e178a441f94e7187b", -"confirmedHash": "5ed4f5fc30e936bcc9c149e0495d75962417f1653c1a2ce71f00000000000000", -"service": "00000000000000000000ffff52d31912", -"pubKeyOperator": "82ce1d6a7f58a0f82af51ce99209555d7b43c3328036deb0c01f645dd4c2e4631135900937b8b18c3ebf5192fe215616", -"votingAddress": "UHwEkePhizGrDxmXev2VknFLAz4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2a9a20598957d79f667065421a31e788b7e7f2dda81eb261499863031593c475", -"confirmedHash": "5d4a289f37dd6b2d4925fb0280834f89fa8729ce073e6bce2800000000000000", -"service": "00000000000000000000ffff17b68015", -"pubKeyOperator": "9175b8913f841b806272fbfb8fec7fc88fb7c856890c907d679c359847af42a9078b5f351364a13552fad206b9bbfb72", -"votingAddress": "2QQkdMPYMi5KQPrZfq6D4RgVBZ6v", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2aa5ff0eecd5432967b443111b003bc3ca3f072caf09b786458b5c2c57edd8ad", -"confirmedHash": "a1e6a81c221aed68d0e640d6581eb47941aef0a4afbbaca63100000000000000", -"service": "00000000000000000000ffff52d319a7", -"pubKeyOperator": "93dff5c9562913643ddd819960e2e20014f8cf5fc8a006f2e970e6b884b297de84a6d1b47724a0055a1b92ee406234e3", -"votingAddress": "2RvV4mJnWWVSxibjctucZYfLkGrf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2aad8a44cf2fb879412fd32d006b4b198c7eee2f70e36144964a2faae4ef41dd", -"confirmedHash": "730033b7a304f0b4a3f7d738d282acef2d9af6de336503ad1800000000000000", -"service": "00000000000000000000ffff52d3190f", -"pubKeyOperator": "072cb994335d33e96df25d2cbbfd213298de7d5d60036786cf99fe658658b526fb5d03bea5a6e49e3d34ad015103ca2a", -"votingAddress": "2iG7A4VXkpvbmjXoc891LxfPio69", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2accc5f2e9d01eb91a46e79a378223f37a8755fc12c0ed282feb3eb76d557db1", -"confirmedHash": "6da3843651ca77cbe80d6285bfdc9cfdeb2f7b47d9c51b790300000000000000", -"service": "00000000000000000000ffff52d31530", -"pubKeyOperator": "819d7a48c62b58caae68bd7a9d552b01cb42951bdfac8bec0ebb65a00f1523c7b81f47df307027c0688b208c5cb84df3", -"votingAddress": "3Ej9HYgtsiT9iESMJ7FUVaHR9kXL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2ad6e11ec3edd12357c121ace2b420fcabb2dbf50e869e422be0bdb720add38f", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d56d08", -"pubKeyOperator": "0d1d89f1303897e493828fc09f0761f1a6da9ff1c9c9dfa537818c8f2dd3134dfc2fefe34ff438110d59ad6e3133a3e2", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2ad99753a5039eacc5ac957bab999395a132dee10b2c3126d835eb9ad0f4f8e1", -"confirmedHash": "9a04f269bd9d44c982eedd17772bcf383616064d329a58cb0b00000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "2ypBJ6SUws4HTT6VdAhBkkRZ2xqb", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2afbb1b78cba298e9878084c0e80daa974b55b977e9d91696c0cf137ee28ec4d", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0d7", -"pubKeyOperator": "16385c34fbd86e200df9a40bfe18bbe0c6851207e60c2f6432e4fea940acd421629f2beb1bd2e542d6a3b2d4b7d5eb26", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2b03ecca19863011a6c91a6f68f49a043144adaaa2bcb07ecd39205f18b62884", -"confirmedHash": "109b09659bc086b3581be21781cb1e31615dea0d581958d40400000000000000", -"service": "00000000000000000000ffff5fd93061", -"pubKeyOperator": "86461897c1e6def4ee73393a3d3d08751db9a8effda0926a00ffcf533f06c4c072b70da8a7a96dec177467b11184d7c5", -"votingAddress": "2Zc3VENskxFLbThx1fc4Y7Xe46cC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2b05ecea6659fb2acdf8adb7803ed26700f4a5bbf3deffac4b24db3117f1ca3f", -"confirmedHash": "948d76c4c74f399a62342dfc03d0e0a9ec5843f6181a4c521300000000000000", -"service": "00000000000000000000ffff2d56a390", -"pubKeyOperator": "04bb4c7f10bb7c4afae82c549b419d1070abf43c6b19cd07b94ab8882fcf90bca2fdd26f8783df2bd4a7623229bf664e", -"votingAddress": "3U5NMLoMr1Z7czCPPNfqCKrjxLtr", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "2b0d2b5644727c30245782ec692b7d5799e051ef8b7e99d32705d4cc87dd09f4", -"confirmedHash": "36aee65149168ae43cc0a721d33fde1675799e508181b62b1000000000000000", -"service": "00000000000000000000ffff87b50fea", -"pubKeyOperator": "06228163e7d371e2004bd4c65e949743ebb93b407e698d0b11d1b381af14f8089f0366a233ea3051ab8e3c018598d17c", -"votingAddress": "coQshEj34WVSuN1GQGmK5ijcShL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2b11e1b97ec06dfbbda5099596cc2d205ea7facf6db585cbb972686d550366b7", -"confirmedHash": "a232f9797268be1ac3fe32b6f691e237c646838a09509b0b0d00000000000000", -"service": "00000000000000000000ffff8b3b45f9", -"pubKeyOperator": "8285cdc93e77a1267f24839dd08e177860268583167290bf60fcb3b92913fc1d37bdeafe42cace0a0c754fe5d4fa6370", -"votingAddress": "4CpVjgKcGsXWs7r4rb3SRfUBwdVX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2b27c774f0776b5acb7a01bde76923a77d9a4299c42a7fcd0b6ed660a8d17ab2", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96887e81", -"pubKeyOperator": "144e2de005a2aa34370866b1b083cdd838e1367e2c5796ee1eef7d027483009da3aca2d2518b9d00d40f15cbc80ee86e", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2b2e0a2b80952d6505635e0a5dca2b118fae892bf9a77f471ae8a0fd49dca491", -"confirmedHash": "46170f4227b9ee59dfb04c0e445a9300a3ff5b4e8ef9abae1400000000000000", -"service": "00000000000000000000ffff5fd86d82", -"pubKeyOperator": "9966620130d6aace3d9745659617e4d9c7c0c1e6e2d184881e5d8402da2fada1ee5b416236a85e8fd6fead8d36ea2407", -"votingAddress": "ujzYDMqTdQi99K4Xt9sPgDrLCj1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2b442b161893bed093c7e07d019cb1fa41161109965dd99c928bf88d2802d327", -"confirmedHash": "b93e3edae7c6717e3d503510b69e999fa689fcbcf17d97de0e00000000000000", -"service": "00000000000000000000ffff80c7a91e", -"pubKeyOperator": "8e0239e05f012639f6cb37dd2c4cb8527ef94def158b67b43eeb01d0cf570dd77db67b66f0cd47502df50ce0c270b885", -"votingAddress": "4LeZZ4mH8Unpg29QBgzCHaqVKnuV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2b5b6d21ca50d456cc77cf4880c0572a842ef8d9239d5428f6af0392b06e3cf7", -"confirmedHash": "3a7566155632d8cf8c396f73c723fbe4b48e5c1c630f68611a00000000000000", -"service": "00000000000000000000ffffb23f7987", -"pubKeyOperator": "903196d8d39ca96cad943b2a043031585dcbf746735b2db116620c112e2149dd309d299c6595ddc04c760157df0804ce", -"votingAddress": "kkWt8qUGjjRRV77zVq4S1JXdu3v", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2b704b632e4688509cc84a0e54af072bb6fc782b20203d50a49a04404874806e", -"confirmedHash": "ad8657687f9d47bdca3d1eb1e98914f2a973f3823f0462e71c00000000000000", -"service": "00000000000000000000ffff8b3bfd16", -"pubKeyOperator": "0b2f2e10714c36996dda6370fdcd0191cf55ed8494a8cb5ec6496eea41e899072e14dd2be892ea0cc728effd170b3bc1", -"votingAddress": "2LDw4kLuKUggq4xh4jA5Uehbg5B1", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "2b94e58c3635347c3dcd8099a13bf0792030d3801c5ea929b0b2fe62d1c2e34b", -"confirmedHash": "726bb8ebeb821069f5a5482e5b53e3ce8e345299db59c0120f00000000000000", -"service": "00000000000000000000ffff9df54993", -"pubKeyOperator": "0c97c29040ffd46dacafe8f9a659349a023562de75f04c52b028d2819dee8abb21cb7c984b161b10068be1342378744f", -"votingAddress": "2LuVcna8fQeTkzTo3ZjHvKPpCZ8B", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2b98a9d81db625248d37a121c72f402d0b87218b761ce4af95e2c863e4db0d31", -"confirmedHash": "aea7e78817e38080cc59e041d60839ee1bcdce5a45b9b4ec0800000000000000", -"service": "00000000000000000000ffffa747859d", -"pubKeyOperator": "062918bb98ed21a7d9421049224c66a183cdcc868f5ef46a3b6689d986fa750e0227981bdb4c15c2c3331b21451e08b9", -"votingAddress": "2dHuir9wdmJ7uWYvZNJ6geAmHQdR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2ba7d66ce928418150a212c6082cf24e5316ff1876fa13cc494ab8fea33fe9db", -"confirmedHash": "c8153aa1d2b9fea52a172f7d232bcc4a1b0dbd5430b25af50f00000000000000", -"service": "00000000000000000000ffffb23ec032", -"pubKeyOperator": "168a76991f852d8f22f8c38d6da14384fc10a5373f15fd345a931e51cac882c64a006ed9e01d15f61c2886aebad3acad", -"votingAddress": "UjhCQUfbw44FuC38uXGEpw6nTTy", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "2bba7d3b6b09f09c6a1ad3039ba3cafff6230599cc64de9bb8176a309fbfa04a", -"confirmedHash": "8d2cd8dc9b6e5acf9b5ee1f2032fb3611de6c9fe2eff54930200000000000000", -"service": "00000000000000000000ffff6c3dc771", -"pubKeyOperator": "114923b2ea69b786b8dd5ae2b95f726903735714890b923d42288f8a46d894009749f5acd47340de1a3a4d33d80a3258", -"votingAddress": "4Yqwd7ShyvGYToBCqouFd1DtYxZD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2bbc1ef46c4d5100ec356d31120d3a237df1f9f790ebe560ebd7ea0a57bd8899", -"confirmedHash": "69004b26d29cc127a368576b153319a3c2aa6fa8ffa7e54d2500000000000000", -"service": "00000000000000000000ffffbc28b6d1", -"pubKeyOperator": "86347ae62dd2f50a21c362307a08fa175873700ff6b4487c6bf7c23feaf408508808d6a27a9cb74dbdbbe648e35ad762", -"votingAddress": "3DeEqDccuXHAKuP8zEZV2H5WtZL4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2bcac5ffe301bdfb01f222a523c84d987dbce6474914521d8eb5b9aac69666ef", -"confirmedHash": "303dba0a3629e1e3012386c30feb876aef34c3d4bb4e52b61000000000000000", -"service": "00000000000000000000ffffbc28cd13", -"pubKeyOperator": "0a64052c9b9543ee0d8e6f19f92687cc411addd1d3103433ab002b288c061a59ad4371b96d15dc2ed1f129e5cef4874d", -"votingAddress": "23u9jwAisNyvpo1BJptRZphyNjMj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2bcd398d2c82e4d035a4ab55b99a16b67f0b181796ca0f3b2449b4d38f07d643", -"confirmedHash": "7abe463414e45de8da88109e709007bdc0903489c8d493380a00000000000000", -"service": "00000000000000000000ffff5fb39735", -"pubKeyOperator": "0fd85e12d16c12faa663161c9125e6334f1943cbd00beb2800c9ab35842b43e526138b775d35c842f9213baf847aecc4", -"votingAddress": "Ji4YF9L9HrwWnLYujpKR6CnRq92", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2bcf790720a5f494a6904e1341387c431a157db74fc925e9db3310e2a41b6c20", -"confirmedHash": "546ca2ef99ffebdc41853fc79f0e9644c260ab7854295d431900000000000000", -"service": "00000000000000000000ffff52d31531", -"pubKeyOperator": "8fd97561bdccd9900317a20f83d600d119abafafefb3d04ac5365911a57664c729cec9076f75c4a0abc24b997c719b5a", -"votingAddress": "27rZCpms4oLnF4r7GHpjJw1L4BHi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2c0085b1017e725ca816bb9d24f2e029f4c6722f50e5624fe516fc707203c992", -"confirmedHash": "2a3998cd33149501caddb276edf15e3304f4038f0447ae5f0900000000000000", -"service": "00000000000000000000ffff42ac0c56", -"pubKeyOperator": "098b2c2f1ad59ed60b2c25e648fc4e50898143cbb1afe80f140f21d69a5739e41c3356d47bf9c9da89c3c434133e6d78", -"votingAddress": "XoPxCbTh41BiyKYtHyxAReAQRxZ", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2c31bb178ba1c798042400f362fb481eb43626f265eb228a95833d2b02bd5585", -"confirmedHash": "aefb3f636134edc8bd513369a1a284e5b97a286dd6fae4e01300000000000000", -"service": "00000000000000000000ffffb23f7990", -"pubKeyOperator": "8dc6bb3b660a0ed0663e2aa5585a16b7d803ff721d08c6ccf9479e51ff7a80e24ae61443440b87650beabcb0fa6d8a8d", -"votingAddress": "hwteSLPuVd95VoFC1mvVC8bKemu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2c3de063bcec12035401b176ce02677d22a592e7d8c98d6b422d46a9d33dd767", -"confirmedHash": "3c8d882b34df066d0c15f6519351ca28c0a28f3fa51b02291a00000000000000", -"service": "00000000000000000000ffff80c7b8e9", -"pubKeyOperator": "8360606734511b836679cb34f6f166c707db3c76e88968edc7d95e66ec233560d6fe916a49764ec56965618f6b19cef9", -"votingAddress": "22j6QMvwxJzumjaKKzdKj2VoDCYi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2c4a2f73c98c953f46925e7486694fcd2e67f16df572bb5ac3e5d7ac9edc9417", -"confirmedHash": "4562da1ee45196b8dcd0b604adb1c17182f99e37221f19ba0e00000000000000", -"service": "00000000000000000000ffff416c9657", -"pubKeyOperator": "846b1ef76fbabf5448e4fe86c7cafbeaf5b1951e586dfcf0d8d2e3e27e375a92a80da82c8790c0a40d03960e36b7f85b", -"votingAddress": "3bxx3tgYSzxMWrCLnd5xiWbVoNvN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2c65edaf906119ab09262441a900cde2ddc61381ca0f39f563838b1f924dcd16", -"confirmedHash": "cdd3539940e9a3c9bd86855bf6ab39bdac7246ee33b86afb0e00000000000000", -"service": "00000000000000000000ffff2d4c219c", -"pubKeyOperator": "975fab0ede49d9763ffee98b70c96bb99952c6d09a7eea9237b64b1b20cbf21d0f20bddcfd1bb4897504cc01c37533c3", -"votingAddress": "2zUC2vAPiysJZA1xxNFVhMFFfd3A", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2c6a0e3727fcf42f529e41ee9a037fc7aee8a74489a6d93380daeffbc58b562d", -"confirmedHash": "be00c5a26e72241064fa29698d317dc3cb545936fca608dd1000000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "2sbuTSLMe52g1F6QcuAT9Heb5hby", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2c73160317e6701cbeb3deb19eb1942e117a3268ba6a8bdefc8f7283d26c05f0", -"confirmedHash": "6b501d85a5a8e6f22fb8598823764df4f198e94c49d159191900000000000000", -"service": "00000000000000000000ffff59280423", -"pubKeyOperator": "893095a58f70dc56f1452cbe37ac1235e41c689b08215080a8c79fb636dbdc5676b28a1dfd3c92bdd72363df563af664", -"votingAddress": "2a4dnD5nSoE94hgza2zhQ3QJWyft", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2c80f829f296d40d265ed8e4adf9d32c3d68e3f4b913889753ee77b26f53315d", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96880d6c", -"pubKeyOperator": "8c1b89610002349aeb66ed2b739bfaa9cd3474e6568d7a5eec4419e639268cee16f2417d325a4515bc394bccbdca7c6b", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2c84267342d7c806cc527d77a0ed62c15c3f8f4042c31c56fc655ffaecdcb5a9", -"confirmedHash": "e02a4511366c158ed387f88a329a72e3a924862966d8d8700600000000000000", -"service": "00000000000000000000ffff74cbd66a", -"pubKeyOperator": "0793e4a0062da1111b667ca05511b2aeeab9fd74096b889ae778b4b8c8a8f2a7b31b1be6b60e1af539568a4fce81bdcd", -"votingAddress": "2Qs6AWraiMiHgF71CJbCkcdioB4P", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2c88299b383cb00d77eede9a9cc53123108a50166cce1fd22460f75a36d2f0b6", -"confirmedHash": "ec220c4fcbe784255d464d9925944243a7ae474a8b3ae37a0400000000000000", -"service": "00000000000000000000ffffa16153e5", -"pubKeyOperator": "18e2c0b58aaf7a766d0b32c0d7ff7f7891751060d9e3002821d3c8d9bf0d9243a0399179b18074ac4ea80c4a2f92a54e", -"votingAddress": "X9H5AhF2FiqV96v9oLyGSGo2C5E", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2c8f34de6e4dab43606d4c57883ea99ff02f1906a1156d1998b24b57d6e6b3d3", -"confirmedHash": "dae21056be7be38f03f3c8df1f9b0302e2fa891d4a26b0121800000000000000", -"service": "00000000000000000000ffff592807ed", -"pubKeyOperator": "177abacd7dd6e9c8c04925a64678d9a8ff0b073c825fc245f7627f43f1004a7f9a341167826d562a1766358ef98e0868", -"votingAddress": "ePqNoUi96L5DCdfGTpbdwGSTc4y", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2c9c0101c4b3c9f4ea9d75b869e6442c716211a07e4bfea1b238e37e5994b13a", -"confirmedHash": "6307987dec498fd9f0831775e88490724ace2bc62804ee110400000000000000", -"service": "00000000000000000000ffff2d4d5ab2", -"pubKeyOperator": "038f5802b7399ab3940f5ea1f9cbd9549018de1303f6d5c672f8c982abd49472a7a81342700259f4c3d77fdac148c90d", -"votingAddress": "4Z2ngv5Rh38KNrtJSt6rg1MadHuZ", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2ca0cf4463afa12abee6955bf1bff0bc3378c2f12486d51a1cdf5ce21b26ef27", -"confirmedHash": "2ac9c96dbe5588ddcb985ed2808f78575fd88d6777535ffc0700000000000000", -"service": "00000000000000000000ffffb23f7988", -"pubKeyOperator": "99896f79a9bcf505d52e72b59fd940302de0a62fb686f0ae5f58cfe282bfeb251099ab4edc25a46866bb82aed24af35f", -"votingAddress": "pnLZmvehVHSp2BFDUNiSgAvaH91", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2ca367a209b187204b7bf500783f04eb2edb7bc7cd106960caf280cc439f0d48", -"confirmedHash": "559d6d23d11c5bda0e05afe1cff7080ae89bb5f16f0299cc1300000000000000", -"service": "00000000000000000000ffffb23e6613", -"pubKeyOperator": "0ff76c386f174097287e7de5181d894ec60fc2fce77b64cb17923285044b0ea71a336e28800660cced6e0fa848291670", -"votingAddress": "4UR7UVHGJqom2RkMe7vmEkXwDaFa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2cad2e9f21d6c8be5c72716e8f66132dc6ac0789f93b4969bead4fab84d96e78", -"confirmedHash": "d2d8ea65c35935567e5bb6350bdecebff76d00a0150e51171100000000000000", -"service": "00000000000000000000ffffbc28fbd4", -"pubKeyOperator": "0c90c237db66c4bafc8078df5badf04a171bd8790077570d4825ebb6be6d12fd65e9cd2390540d038afd59343dccb592", -"votingAddress": "2wCXMWdaAPRfqUF1NrmZy2a8pAgk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2cc65938d4d969fc66aaf3d51a33c82a52627592397c6a2e7478c775c6294cb2", -"confirmedHash": "8f1364d8ab2ac8f3197a6a8f58366e32649be6c2e594bf2b0500000000000000", -"service": "00000000000000000000ffff58630b0d", -"pubKeyOperator": "8fe2ad7c32edc48d036db921b771227ce1e001b5342df011c730fb7548f8061ebccd25a29cb93a19447d034bb78774a7", -"votingAddress": "3SPkZpjheuZTR1dWK7oPrPQSxdVb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2cea12115b89b77495d0f805bb8b1bca8474f92d80ce764784731bba75f9e74f", -"confirmedHash": "fe262375a8ceddfd2d764b03895f7a14c0f42124a8a330550000000000000000", -"service": "00000000000000000000ffff88f31dc7", -"pubKeyOperator": "0255962eaafdf2953cad2c012a5109fc7c162b1f656859e1cd40d8511a03c911792477551f2aea8d5466cf7b3a744d63", -"votingAddress": "23PQka29A18E8pTNBXz64mBcGTCu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2ceb10a3aac3a825f9614cadda68c11524b735c93e5dbe98513a4b63233b8ce0", -"confirmedHash": "3616b77aa899df1aae99939ba0d5fe8514eae9936146ea4e0400000000000000", -"service": "00000000000000000000ffffd9450d24", -"pubKeyOperator": "11e6c75b99a4fa9b92d3c1c93490dcd11fdc4d7fb539baaaefa1571f2ebb734858df118d0ad0d1ee8b66a306169a2869", -"votingAddress": "3AuGtAjgzhqpVVM2fjYEKfHuyRc5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2cf838bd1fa8413f7f318c0e2cd4e80eb80cf0f53620b4feea8a76a392982b05", -"confirmedHash": "cae72c75dc3ef5515c7e4a6519eff78ba482e7ea84a4726b2a00000000000000", -"service": "00000000000000000000ffffa877578b", -"pubKeyOperator": "02ce4a6041c4eb9b1bcd4eafc68c37b84b7dd3173e0d8ce76f439754b63c185cac6e8566c1444bc9542b85952265e0eb", -"votingAddress": "2XTBpmKA5pFZKZmeNFNQW1qLH87K", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2d21b27fa8a629df3df81f2091b0b58e86690852cf8391a34547bd50b016d2af", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff6414b240", -"pubKeyOperator": "80c91e5ddaff7a4ad4a0b29261a6237713d5fba6ec71ce327e266960433873b954b48a2901924daca27d8c84d536ec2f", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2d33a867286bf52639474cc6b46ae396d33692080de6d7beffa1e70505ff7ac5", -"confirmedHash": "6167adca3211b0b61b9dfe53cee38b4ab8926c8ef07bf9512000000000000000", -"service": "00000000000000000000ffffb23eab38", -"pubKeyOperator": "8001e702fcff4389148ede7c9515b5dba5cffa05160c1d17055e6f3386dec52105e0d88b3d21c86d5dd34f2c6475bccd", -"votingAddress": "45hNHNzpwtarCTuz9kcgbTdmHS46", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2d34df681821a0e560a9b655413d39efe72ec33e0e9af5b25234974179bcc500", -"confirmedHash": "8a0360338b0fa88b42a3d89ad51f37082e05cf8ecefc80e60e00000000000000", -"service": "00000000000000000000ffffa2f31c30", -"pubKeyOperator": "9207067c11683eabd3b86882557d64b9665a99b1fef07d6a58088904477da335215c619b0a65eb394f73e613dfbb9ad3", -"votingAddress": "3Um5mi67NpGVNQRh2qvrmYiiPQ1R", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2d6955b834ed83ca61dfd0cb70d0494b3bfd0bfe088d9ef4e009c67b15cb4d8b", -"confirmedHash": "29ced6e37b3d18639a203801e9a0cb5b4d0255de544a779b3800000000000000", -"service": "00000000000000000000ffff258b0844", -"pubKeyOperator": "85e0d5cc7ebbb159f4b0cdc6592868c1548246886c1d0155d66f24f232c8c85fe434f616734998615efa76d12101ea6d", -"votingAddress": "2udLZmnhy8HGDTwZcKtpawVMWTm8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2d6d5a3603a30a58a4faeb9d455a96d677f9b21628354275c8c6ea10857ef032", -"confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", -"service": "00000000000000000000ffffd418605c", -"pubKeyOperator": "8d149192f5bbe1e3684840a05ab3704041e2d0476fe99079febc26134da525f5f22aaaab5c89cbdbe6d5c4f9fce28d89", -"votingAddress": "2FEaCTrMUqnfrTqY27f5wi81C8fK", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2d6d924f91427790d0b2a384ffe8fcba5d2edde1c8f5255752f1df06ccfaf21e", -"confirmedHash": "a05541ef5b20985b98e1e66349f3caf78f7c79b0cb74e9331100000000000000", -"service": "00000000000000000000ffff6b15756a", -"pubKeyOperator": "990dc65b7d5abf15198115be73aa298abc88b692b3705ebcd76dd5ec1c233de071ff8f2c803491f4dfa4a3bd8975aeb7", -"votingAddress": "4ZPSX6qm64j2n7J7bPvrkmyQx6pA", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2d939b33138eb2afd87a5e00822867c7743a368e22238b944f538002b5ac9125", -"confirmedHash": "54b1326c6bc695a1b6fa4ed28960e001b84e8d0dfa70ef740f00000000000000", -"service": "00000000000000000000ffff52d319d1", -"pubKeyOperator": "04c122ca613caa9b37e75cf2eb58d35eabb623537412ac3500070595911b9184cfff5bb59fae19953516ee018a2bfe62", -"votingAddress": "3JKWFiAJQ37PpVkvm486ci1bjPjt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2d9dded1cd1ce89e4394c2d64911924431b04592eef8d9914372d76d600ea600", -"confirmedHash": "3b7721183113093cdfd9f3fe93726ccaacef9bd3ca9f669f0b00000000000000", -"service": "00000000000000000000ffff87b54c97", -"pubKeyOperator": "8de4c1eb0e21131c3815cd2c44041562861d7343605189e777ed39d7182376398a410efc6fc7ddb002cf62d6d5697937", -"votingAddress": "TQYBxGWmfMR9zhigB42rcg58R9x", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2dc0ea4f39c17c0e2bb6ffaa945cba19febcbb56dedfc7f41c2d0adaf6ded88d", -"confirmedHash": "b60c2dbbb213c99a236e1f30c1d9f41b204f0b13b294c83d3300000000000000", -"service": "00000000000000000000ffff52d3192f", -"pubKeyOperator": "05ee12ead9b2fcbcd20e028acb74226fd75ec271ad8daa431fb9e6fdeea0070aeffb080c21edca34385060a1c8c05bdd", -"votingAddress": "3im6c2PP1vq62zNWRnoksZ735od3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2dd02afe2e618608e7825b0968e7cc792b2895f30f939244b8c8ddb7c7df8cef", -"confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", -"service": "00000000000000000000ffff58c66986", -"pubKeyOperator": "977e5d7f837d10b95291c2e97676b92eab462f9f420d7e1adf96656ba0bf577fd010d5670c765ca820aa644cf1382c06", -"votingAddress": "3M8kRWHvS3A9tswKiCBkV4B6RKYi", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2dd22d96fea46122daf717f1eccee2aa40b14ac186ffb4865a3a08e7bc7336f4", -"confirmedHash": "84d57f4d9fbc794141541306f975f29008679baaa6fa6b0e1500000000000000", -"service": "00000000000000000000ffff87b50844", -"pubKeyOperator": "03cd4b1bd8590c86cf187759c3a7368d0cde6defe95bb4b373e2479275337e67d3f95dbed9546cc137faaab86f2b90c5", -"votingAddress": "4SjXnu33BjRLNyFa9bidXk23FXqP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2ddcee12e3cee46dd7f1b08f841f0d33825bf0b5bb4b22a987099a1bd7fdf032", -"confirmedHash": "fa859d743c98722948ee7a9712e2b10feaa32a203fceab060800000000000000", -"service": "00000000000000000000ffff3457362f", -"pubKeyOperator": "92ffe80561cbe6e3976bd332a7aa55a382fdd512e4420b08e1d63be9f7b230c6e60ecbec7e2994703ea76381a87ab1e4", -"votingAddress": "2ZfKoP9d5KDWfC8fyxiPhp9dGSwZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2ddec2412bc02db7c05d248a161995d125e6cfc80c706398ea69f77de9ef94f4", -"confirmedHash": "66b5c50b732a142b4d5f03922b554592d76379eec314715a1700000000000000", -"service": "00000000000000000000ffff55d1f101", -"pubKeyOperator": "8159c2b4af66d035fa194b42fe48c33ae384606a22b217f74fbcb837caedeae27faacb1cbc049a1fcaf75bbbdb1e170a", -"votingAddress": "2ge4yNedV5mq9htfpTS655avWrSp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2df11189fb725d056e5292a623edf61671eda04ff03792a0ce58701bbae3ade2", -"confirmedHash": "da9acbd1bf1190ccd120088a9357f3c5819c9d15a9f5b8931a00000000000000", -"service": "00000000000000000000ffffc0b85ad7", -"pubKeyOperator": "96f1c8fe7307b68794c69d7c7d9bf4cea72ff9003a6b0eb86dc04ab8cb230123a15d5c48d217efdc7c85ee7857074f93", -"votingAddress": "2K7XpTkEUSyeUfD411czrUqWDpAe", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2e1513aaacd76427d397886888615665d1eca69c4d3b352d875b5a6f50139e28", -"confirmedHash": "542ea33935d1f4194385acd42b51e2524e1a682a61f180120f00000000000000", -"service": "00000000000000000000ffff52d31906", -"pubKeyOperator": "0bd169e16e6280f31adb132f21926bf36f12bceb4f86611727202b1856a1c64dec9c2b8285bad7f2defdfe3663f7a685", -"votingAddress": "2BunJrouzE1Qc3H82m4cj9YtKUqR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2e156162b61eec7945c3b63660b3a9706c98fa4d35f07ea902242ce874c9b440", -"confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", -"service": "00000000000000000000ffff5e82aaa7", -"pubKeyOperator": "1847993c29f7a5116c07737242ce5e7f40c31a49d2f7dd75ab5289fb2425f882fcc5ad7fd108456698ef8c09b8dafd1e", -"votingAddress": "3FdQqmNkZ5w463MoTZ8ZB9iMy4zX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2e2f02ba59f40014f542c1571f810edab5b9030f50df3956b3a56ded50f22c67", -"confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", -"service": "00000000000000000000ffff50d1e5b4", -"pubKeyOperator": "197a83ffc71495608ff759914ddc23356c15a15a2e7914be34ac3e60d3d5c3371cf389be9276be3f2b1e17d1f774a6dc", -"votingAddress": "2dLkyPoTHxT7N2PSp3r9uZuRaf1K", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2e428b1a1e30aeb4c9d55935b0a42550df404037ac0a784576d3054cd86411ef", -"confirmedHash": "f4115b01a7ba530a1ec27076c7dceee2690b620439edc0610800000000000000", -"service": "00000000000000000000ffff607e73a6", -"pubKeyOperator": "16240feb905eada6fffbd75ab7adf0bd1db98c57fa79564064931623fa144aead83fe6cbf6de49e6df464472a212f02b", -"votingAddress": "3vRWU3gE4Cuqbgm4PMBAYiSbn3aB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2e54ccb237c4b6b73fd53452cd12eee9ae46b8afa17c721f798164b7325e6f20", -"confirmedHash": "eaeacc1d1a5e2183c55f4ecb27556cc119ff328e48762a660900000000000000", -"service": "00000000000000000000ffff86d16f71", -"pubKeyOperator": "031ffb5e9a0f10f1363e0baa6e4af2ac50b0053aaec5e5b06b1454cc24350f9f101bc32f0418751370c3dc6b633430b7", -"votingAddress": "guDP9v6rAj1RNdWX2RLgKndRPUH", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "2e6ee529b55737b2b6b80e10bf42423ba2d2383c83758f171093523da8ff662e", -"confirmedHash": "a303a49480c3ebb4b1b66d10cead6b05d9c956d352ff2d6e0900000000000000", -"service": "00000000000000000000ffffbc28b843", -"pubKeyOperator": "8f62e02914fdca043c5ae3111a62b26b4369b4addde612aa20c3c1b608caf43e375286874977c7444dd8e4654adf2edd", -"votingAddress": "46p6MGzD792SKSLdbn232XrpV64X", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2e7e7bb6c8c8f4b656f9654d8f830c6dc4ee95debc381e08fc72116fe114bec5", -"confirmedHash": "3001eec6eefc78b4157d5bb2d71a2b968a5ab664221972c60d00000000000000", -"service": "00000000000000000000ffffa7474c2c", -"pubKeyOperator": "0dd6d54d9c42ed7a31bff23134084b2356e2dca415a5440fde65a6389a72c8cf7ca71aae8bd1d07ae4feca207147608c", -"votingAddress": "4SasRTi4tuhhuNKuyMg9tKquRtVZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2e95bbb7431cebbef572aaa2ea7ba546458b2e742f9a242999ed931335509139", -"confirmedHash": "b5ec8e431d9255cf165cada52b256a4aad780ef6d6469ba80400000000000000", -"service": "00000000000000000000ffffa877578d", -"pubKeyOperator": "8dd61094bd587ce5c5ba9fe253321d2f9e49ff71afadd4cd7d17ba1db0596314a3be53da2b9562608d9ee00d334bdfc1", -"votingAddress": "fCPiYBstvDP93Hageo1vi5GjsmM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2e9667db1dca1cc1855780671826cd0705a0ec243c0276f6fb56dc554975689b", -"confirmedHash": "90e88205283ff3baed322a108a3c5c13921a8ce2c49940e91000000000000000", -"service": "00000000000000000000ffff55d1f12b", -"pubKeyOperator": "0b793415699c9e5e7e1f850776d4d729410d025062ef4ae742cc16bd27d5263c9e774cdcb1092b85fdcff26f0a48c694", -"votingAddress": "4Nn2dU1buiKZVvzJyMYmYVWYFuWL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2e9a4159ed5f20a7f90dae9fa09a1d31149ded671d037b3cec4cb65b92907236", -"confirmedHash": "b8c8b4fd946e6336801cfb9ad7f03893516520c9d72fd64a1a00000000000000", -"service": "00000000000000000000ffff36ad3eea", -"pubKeyOperator": "0874f3208517c03cf54edb6e7243caa865374abf7daa2068ad0db5305cc7f2d091b9c043f56ba580782fb12cbe9b0f2b", -"votingAddress": "3iADeJqrgj2irhNbqpbSd6dLyxuC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2eb0477974e88d1d9c4b6e0dc249c94e63e649446bb64e60bb32d971a50cb72f", -"confirmedHash": "9fa66dfca9bece0e2942a828a60cb33a713997d81f778b280c00000000000000", -"service": "00000000000000000000ffff5fd87e23", -"pubKeyOperator": "156cc529279e3fff8ecc8490ec62da2510077373bc8332857f9d9b352044f33f462db837345f28fd51f9bb99840c9dd9", -"votingAddress": "4WatHTZsDYxrqTcPLNiretxessjU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2eb69b5f24680434af1582fe2b6e4706c2851e8a150bb76e1a08927c846cd63a", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b016", -"pubKeyOperator": "1459cc9a53df15fb70f64268372cebafc62c7f65c0e7752e3825447076422b892d056c1abb54b4143b0939d9410ecaa7", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2ec242b1a7b92cd630a665dc63b1aef6523ce9fa622e8c2197ccedc61fe51aea", -"confirmedHash": "b3ee13734164ee6ecc081d91692d2a2dec5d03dd59ff171c1300000000000000", -"service": "00000000000000000000ffff5fd86362", -"pubKeyOperator": "891316d5b60aff94028d8459bf1f2a44f434f9788a3757706c8de8b4014af05e4621bdf09f0ea2635415c72e35aefa3d", -"votingAddress": "2h52hE8d3zgoT1HrvrYRieSakvSt", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2ec2525a08ff1165afce5751c8e48ebcdbe763f1ba87569755b25a3abbde19f9", -"confirmedHash": "8b75e1d92b43457ab4f815f57311318f7d104d523d5ae54a2900000000000000", -"service": "00000000000000000000ffffc2875b6f", -"pubKeyOperator": "8a0c1329063ad724e5db06dd336dc9de43835048d3aca1440127fb655bbb9caa1baef555a854a7acc2d35d3493f6c6b7", -"votingAddress": "4DDvRa5vrwhVnoapcS5G87LNPtCB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2eccf5b4e63d999712c98f5f0043977d9c3699cea0197fbfc633ae0fa8b5be1a", -"confirmedHash": "9f480bcbb83d32c9fa05d5ee527ba6f3af122b942cada2390e00000000000000", -"service": "00000000000000000000ffff9fcb1cef", -"pubKeyOperator": "884f2eba134a3dd6b2d8a5036e8f8e6b52d7abf0819913d42023047022d96f554889492bf5e6df2d29e4cc7e4e0c1759", -"votingAddress": "6NSittTuMGLruH18sw5juncPeQZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2ecd83631d213c06ba70c126ccf82f4b9c8e7b43ba9ec89ce1f3ebdc0a36d47d", -"confirmedHash": "f536336aca5420ad5f4c2e4f28732ef763839f8dc3c512a90d00000000000000", -"service": "00000000000000000000ffff5fd3c422", -"pubKeyOperator": "1704c4823632b0c810789f8ddecccc49492a73b499036ac972358d2d68983fa716b7f4a6407ffc465334d172b5d222b2", -"votingAddress": "q1uEPcU3aaxcV99boYwrvNWZJKH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2edb83a9d351d9ef7f87ea0e7798d8ae153d94c8849896ed04e8e6405be69641", -"confirmedHash": "1ef41db8033b96fef921a5f2e80720f653dd5991060ef0ad2d00000000000000", -"service": "00000000000000000000ffff5dbe8c72", -"pubKeyOperator": "10e71be732478e80d015db9011c8a3166f112a5da6a1ce6bc38333e0f8285285b89c6faa03a813d10d0136b061ae1410", -"votingAddress": "3mjcwhuW1p69LsxKWFkF2dLMupfC", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738608 -},{ -"proRegTxHash": "2eea859bb26e6aa8fdacb3f6f259d7c61720bd7f51abe90af033506232305355", -"confirmedHash": "4e6ba29bb1d894b0bbb1c037cee60a472ba52aabf67e10d31400000000000000", -"service": "00000000000000000000ffff55d1f241", -"pubKeyOperator": "07031d4edbb5ba350ff5175b3355d57d119cfe6918b2e28952865da96d286bad9b5e4e79e9dce40be5d02c786e688fe3", -"votingAddress": "FZNejhm1quS8BXmeqPvT4Dnaki4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2ef4f886fdd55531a8d4d9a83849421c5394542f56a7845dc4fb9a976664e2ee", -"confirmedHash": "9edc5e94b4fa57db636dd8b84f3f66ab7cec441bb7067bee2800000000000000", -"service": "00000000000000000000ffff89dc26ff", -"pubKeyOperator": "038bff1c246dabd21aa23e9de411228a89490797e70f9b7dcf331d82131018483db2976d6cffc2e3a08e696e79da50e5", -"votingAddress": "8zDZsoX9JqEEUQ6gEReNbHc6Can", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "2efec8906cd476adf763fdddf8467f6ce1493974181ee430b8d34fd6c895c9e8", -"confirmedHash": "a230db350a0d6cf720181303831d2316eba4d5166f7ce8ec0100000000000000", -"service": "00000000000000000000ffff3e4d9ef4", -"pubKeyOperator": "8547f004c5882d374ee32a2a8e5a5746f04a494b80bc12fd987ef28cfa279e1080476c6f25602b868be1bf9aed22bba7", -"votingAddress": "3XUFwbHcWyL2LE4PFmAwehaYX5U7", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2efff1f818d98ee7b6b3ecfc75ae6adf1b90f34d5effdf433a5aafbcc486ea8b", -"confirmedHash": "c8de078a0c3365b251d3ae316158cf54798142de866eeb091b00000000000000", -"service": "00000000000000000000ffff2d209704", -"pubKeyOperator": "1054b3cb64d47501632d239ed4d97d8a0f6a9485d6c46253b57989074544963ac6c38248c87f9b832517528b1cd15edd", -"votingAddress": "2JK9qvpNyzwUwSruGmkUbscbQkGs", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2f0161d32b8f61dc47da204bf2cda3f81ab7d1c349c7cf80da1306c2879f789c", -"confirmedHash": "908e44c7c7b12c9706c4c8c44cd11c996954c4150963cf9e0700000000000000", -"service": "00000000000000000000ffff877dce13", -"pubKeyOperator": "00ff823676c7ffe09bcabb4f5ac2973b5111aa7e3b6c494e2c0cbee2352c053634f0b10982ac709216856fa286c8aa7c", -"votingAddress": "4AoSbNouFooKYLjErutujfnZxk8m", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2f0fea2e5e389ddfac30762ce213ffc1b5b804df92b6db717ea11466a1aad5e6", -"confirmedHash": "245cd90a17cac504eeba8c0a12efc069c3e64bb42971ca2d2b00000000000000", -"service": "00000000000000000000ffff86d150bb", -"pubKeyOperator": "94bc6c08afd8d1ec5bb8f346dd695b06c04e53075e307b36c66c93da0013fda60a13c978f98cfd771b82ee5b7b03e6f1", -"votingAddress": "2WG9HqdpBDmxLnnXSzPmLHdmyBWM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2f22d099e71c051b1276c89bdf4394d5a62e8d049196ea3ce0f17dc205e5dabd", -"confirmedHash": "a3dc13f6b99d9dad9ce7ff9753b17c106ea258e7cbebe8360700000000000000", -"service": "00000000000000000000ffffbc28cd00", -"pubKeyOperator": "8f88c1b4f3d8f658e66aa6cd78e6b422ffd67833c14ca3e9404d66f38d9c2d588c34d799465d47f50c30b7fe06302e6c", -"votingAddress": "2wLCYchQMdovmcJ5jj2eHuBV1STf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2f39ca880f4485c4976a1d34a72fe2e387f5a6a81c4ffdd7e53c568c815fe350", -"confirmedHash": "6ae37652ab723d1428d8e5952976909e9f62dc2bd92785980100000000000000", -"service": "00000000000000000000ffff2f6e9d93", -"pubKeyOperator": "19411e11bf2ecc242485886ba220920af27177edb2a0ec95d36ac6f116be6c4769656342a54d3618129f0514c564d11e", -"votingAddress": "AxSi6sEMBcJhuDqc2Np3p7wLVqf", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "2f3ceff09aeb4203d6d6b0a8d794725a48966863bce4ffbfed06ef85ca53b4ce", -"confirmedHash": "ed94e7a69a9eba24a97d0511987122b3d0a9939254332a501300000000000000", -"service": "00000000000000000000ffff52d31527", -"pubKeyOperator": "8d28d4167f5853852d34d61f331e6730e34b8633433282e47f973b3b5bbb1e08f68868dd97e5d21f4c712628414331da", -"votingAddress": "iAhE3qZfp8rWayijft5zAMQhmnT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2f4a85d3e2e9ced162e56ada64894927038dad754d949dacf7c527f7ae6f7e3e", -"confirmedHash": "a6cc583734a8dedb1a3a5470eb7524f260a2c7b579463f511600000000000000", -"service": "00000000000000000000ffff55d1f10c", -"pubKeyOperator": "87b5b9fbc61c9d07c70b7acd57d8d6419e29b8fe3a587313697002f8ca5d14f3d5f8abe8ccb4fbee585795a9cdde0f0f", -"votingAddress": "2DETa939JT8pXeyfhxPkVBTShkDz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2f56e2f7e6865d3db2c23a2768f602306ec12499ca5c311df9d1d3523b998c9a", -"confirmedHash": "cae076ca0b778593362119aa35eb6a68c8c0be3204da5b900e00000000000000", -"service": "00000000000000000000ffffd4186a82", -"pubKeyOperator": "8e42e5ce2b9ca9ca65ac42838fc016f976cb35ed622026156a9d0b19ef8d7f4652296810607d174420c6702759a66b01", -"votingAddress": "3zt8k6auK8axsbaLFQDcsT2VXmsj", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "2f5da5033fd1857996757a350ef4b136f9e3a216c3322a9216a8f3e1a5bca7ab", -"confirmedHash": "32bf714fd6305ff7cb44acdc7d144ee60a3935d558f6867f1900000000000000", -"service": "00000000000000000000ffff2f5b98e8", -"pubKeyOperator": "1379579d243fd1d8c314164685e014bd4a5dba02c2254fd3804e844151fe1cbb60a63897c014560e09be87a3fb693ee3", -"votingAddress": "2XsfJXkcrXok8B2eeuuQTYLJTnhc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2f5ecc18a02e963b4e7aeee208a830daf198dff365e75c33da53c2912c19155b", -"confirmedHash": "ec220c4fcbe784255d464d9925944243a7ae474a8b3ae37a0400000000000000", -"service": "00000000000000000000ffff87b50846", -"pubKeyOperator": "1183d6cea53a83d3d1ed3a4916fd23e191717a08a24a7c6ade5065c4cad8b00757034e966983e74d3c29bedb441fcede", -"votingAddress": "28A9kVnFhzJUkwFJogbQXAhnf3PW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2f643807797cb8034db481e61702dcb75b802345219f8b6b627fc7caf3102a76", -"confirmedHash": "fda9be7b86e6ed97e12dc5dca123afdb8300e587bb697b620400000000000000", -"service": "00000000000000000000ffffbc28a312", -"pubKeyOperator": "8b66f89b81a1fcb5afbe00d5b454d0c5595cdd8af9ffccfbca91114d178e47944f7e573667a369169c68d8c097f5e7ad", -"votingAddress": "cQjNkACJbSBPMhVhzzMXXw3R73u", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2f7076617993d1405feaaf73da954bb5e20faeb4ca25217557b579d64667dbcd", -"confirmedHash": "dd4e4c655d4cd47fcf67002a8a021624bc01e9244c5422372c00000000000000", -"service": "00000000000000000000ffff3625c7e2", -"pubKeyOperator": "94229e3fb5fee9e2e7e53d0d96b0c40e77e1a1598a87b91b90444a699b71b6a8e425b54f05927f8ad2086765f681ff5f", -"votingAddress": "3Gct4DYqmMVAzWivwQ5o4JLD37fo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2f9b6e470b9bc38e1ca9baeed6cd1f76dcdf612baf05c671b3420cb733f9d3f4", -"confirmedHash": "019705effb4c7068f62aa8c6cb0bb10ecda5818b604130201e00000000000000", -"service": "00000000000000000000ffffbc28cd0f", -"pubKeyOperator": "0a58c16b128340a67e3b7c880e72920bd1f46a49360ec513bbbec35bfc1e12ebd68f18e67d0dcdbab6a024f8a38b6d73", -"votingAddress": "42sMUpSu8ssDw4Fn1TACNXM8BUyu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2f9bac7ab492fde8592946cf0104ec3d6b44581aa62ca493c1fcd824f7767e7d", -"confirmedHash": "16c939a656540bec874aac641205a573fc55e949664cac860400000000000000", -"service": "00000000000000000000ffff6c3dd2ff", -"pubKeyOperator": "8a29844a20a56168454bde7ab7998a9fe8e2898dbf3c22844c79cb4dbc5c7e521769359299269b1a25fae20e11f7c960", -"votingAddress": "415qRVujcetJuddDGmsdDkZhAFez", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2fb9696890847dea37970695c95fbc1e7d44c61998452de9b00f0cff1815ade5", -"confirmedHash": "a0c5fc8359622587ee670c2f4ee673fb44aff2950ac5bb811800000000000000", -"service": "00000000000000000000ffff55d1f25e", -"pubKeyOperator": "8b369f1c14b10c6a9b0091e2eec3a47bafbbd25d98886683e0ebb999934897458a272dbf071aed2958c16c1e576656a1", -"votingAddress": "495eVdHxRKb4bDagGrAwgwKX1CED", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2fd8fa0aab4f2d0bf6c967daacb7d863bde05d0fdf4377f8ec85f3a57d4cb1b1", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b096", -"pubKeyOperator": "8bebcaad243b4350c08e9a448a5999835dca4aa8a446b41822ff9a6ed87733d2a47d8b5a54c9fba46f3bc9c15ceadd59", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2fdd0466e65539a82e224c2ee16162552e96aa553d699aab904a385f00e73977", -"confirmedHash": "e231abdd51ca5fc496cb155db8ff65d65bee197cfa4fff7b1800000000000000", -"service": "00000000000000000000ffffa5e382c6", -"pubKeyOperator": "8a6be7837e2dc602a8187de21c44925b81460b6b4c44b85f9fb5fb95ec456098f946144f59daa4e6eac3122ae2b858bd", -"votingAddress": "2cVeMXvfDzUXSwbKTdgRUzEtzypr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "2fe9628ece203b44d612725d0b5857c7063058eee10addf4117336a744707712", -"confirmedHash": "4b5b5ecb79049b5ed60fa29cd8bded7df3f44e49e2419b930200000000000000", -"service": "00000000000000000000ffffb23eab3b", -"pubKeyOperator": "0d1ab7438c6aa71a0639fb14c14304eb9936f682651a67fa5acc3fe14fd5693b13b137554a9d23b44956aa3ed82f6060", -"votingAddress": "4HAaJwvmABzBprrs38RPHEbpgkGh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3001ec8f87dbf6ea15ac1a7ec9a26b2282ab3746d339f95294be80b2825535a8", -"confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", -"service": "00000000000000000000ffff9f4148a1", -"pubKeyOperator": "85e216e58ae3ffa72235597fa7f0b24d3ba8761a3a2608ee82e0e4d1daafb02f6af103acd32fc90af7b06ccd3994b4fa", -"votingAddress": "EdNeUqnafFm5x6hKbxhReDScdsa", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3032baf3de7fbad79e6bf4295fa0890cd06913996dfba0c37d4223b67dfec6f6", -"confirmedHash": "a37bc4c7c7240404a20908fe71aa0b1a20b1e396b3e7b47c0a00000000000000", -"service": "00000000000000000000ffff2d479e6c", -"pubKeyOperator": "82c7cde4248c81060606a2d1f4863e26f4709d5ad4f81a054c17af63560905f2d0870d249d51b818bd38b0497d4ef583", -"votingAddress": "2CTLDKjotSTQPJ98yKWciCYFydPt", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "30487646fd015fd7157d1f2c8c3a5aa3f62b928955e2288273c8ca928cdef65d", -"confirmedHash": "b1f1f2deac554d901442ea4a38c60e2f5384e3564330fc971a00000000000000", -"service": "00000000000000000000ffff52d31959", -"pubKeyOperator": "1812622fc6dbdf5993bef522c5f4444c066a423f1bd51e17d5099b2745513ae6fd31de968640aa719167a117eddc705d", -"votingAddress": "2WvTz9N5LRZnfZZeWyf7hBDk7QmE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3062e4abb68cec66e0fb0c929ce059aabde149d778d4c18f4c2c9b536543932c", -"confirmedHash": "85e6e140a111c0f0a598c4cb9e4053c85fa38675ea5ff9980900000000000000", -"service": "00000000000000000000ffffbc28b6ca", -"pubKeyOperator": "84fd915c296cddc8583e47ac511afa1a1082c90083574e479caadef0309b5050b5f0ba6d664c969dc619d33d840f1fb7", -"votingAddress": "cRgZ57km76e7AqBJvZJfBVq2ur3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3064e4ae65fc7ad2863c864197232d02bf0148c13553b8079ae00b83ef786c77", -"confirmedHash": "df358be594a699f74f61ead168b7a5cd4477e08f1c38eecf1100000000000000", -"service": "00000000000000000000ffff91ef00d5", -"pubKeyOperator": "19464314a1965abee3fbfc50a85ae1a2dadf3251d629ad61a4156755b9c748a1cbacbe111de01a289b9ee5bc66b18a2f", -"votingAddress": "2iQqwrHjTEDTpuU2dshoCkMeWEc2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "308a2413816f2b37ef6b0558134a37749f8df2803d83710da0c867f5293f08f9", -"confirmedHash": "b7f44fd324837d991e4ae30f9bbe6ba3823416d2c27f4f950f00000000000000", -"service": "00000000000000000000ffff1751f62a", -"pubKeyOperator": "0acd3360823f74af45279e80e4d19d4bc8eec61edcb4fe0baf855a97ce7e72341705a5a83860a8c14b60150b1d65079f", -"votingAddress": "23zLS8DtvAuSi1Ptwet6s1wfeyaj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3098d70f9f404c18488eaebe6865fcfa1715286d3fb66d2ad2228267ca4648ac", -"confirmedHash": "316e3992d6b6d5c4c0854964138faebb395076f7247a3a390a00000000000000", -"service": "00000000000000000000ffff95388e11", -"pubKeyOperator": "82b15ccf7ec3ba3fcabb6ce045cf831b78b9494257e3d8c96dbc74c5233b81fa790743b49c4b5c626b0230f326021d58", -"votingAddress": "2tcbHwzEAcFNCjMf3NzEvGBPDHMp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3099225260b854f6861d1326e3d01e067c9b5a11460fa754e11f3beea78848de", -"confirmedHash": "0b3be649eadfdd5ff8c9c91727d42c09164e301eeedb51542300000000000000", -"service": "00000000000000000000ffff2d4cbedd", -"pubKeyOperator": "8526ae55259f588847f8c2fc4c793a74571e801fea690ce467b2e355a88c9d25cea289a0ae724b5af1f075b3f4085391", -"votingAddress": "2G93ibbgqMhz18b9F8cHoSaXkBvF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "30a11b05b66bc597971b3131faadea9a6a5b588f566a6c8614c8623509ae8e55", -"confirmedHash": "b9079b921a5116bf73eaab299fb4394d5e8c24dd0279b8a80300000000000000", -"service": "00000000000000000000ffff44b7c47a", -"pubKeyOperator": "106fd7b5e94b40b1a37a1a6a6a0b0fe78924927712903e7233aba3d27d4ba69826649894c0a1f6a0f81de3bff59f3d02", -"votingAddress": "3rNTnys87p4eTk45JrPztrjvddba", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "30a4573e142e3cbd5fc0c288a37f8d55f49f808ff168422f228dd190d4750117", -"confirmedHash": "7a7f9a5aa49205219f02e7c07e0821c0d628bb2af409febc1c00000000000000", -"service": "00000000000000000000ffff3e4d9fa6", -"pubKeyOperator": "9873d4e8cfdb8a6d3e3e3a75705b67416cc18d538b0f502958b1e29e7d28a9e6f1174b922321d5d58a6adeb3d676a2e4", -"votingAddress": "2Z7Y3f93bYqaTuhBUV4bmMavwabg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "30aebbd76b2b038027fc3e4344190aac1d1f900d7c49dbfdb145b7c7290be36b", -"confirmedHash": "f048bbdcf31239fb1ecf9cae01afd37cc897fc0164ae1e240000000000000000", -"service": "00000000000000000000ffffc2875831", -"pubKeyOperator": "191e943f6881b1ed7a0f169fbb9a80cedeec0f2c14b66de428bf897e695ee814995aa65fcaaf8b86db30a9f9a3daefe5", -"votingAddress": "vUNy757AEqSu9jEd2qrGfVuNEjo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "30b1650bc44de8e2e969b292a2a60a1c5aa99e17a46f1f64fde669c5a66168e7", -"confirmedHash": "7a429def2e82482fd425d39cd6a21f46756c9c8dd42207261d00000000000000", -"service": "00000000000000000000ffff2d4d4132", -"pubKeyOperator": "904bc5cd0adece35b381e8d08fb2ae25a16d0a0ded2571b09906885c945d76d51e642d916dee8f0eff1d61c5f6cc9c75", -"votingAddress": "SSoUHaSfFN549iuKngGncKLBe7h", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "30ba42821a7610a2179439a9aa9c3dd9a0209d637d78775090a9b844e4b5e2aa", -"confirmedHash": "77fc33252e0c313724bc1b8cb41103a0bb16125aacff11c22000000000000000", -"service": "00000000000000000000ffffbc28be2a", -"pubKeyOperator": "18b87dab75ef68961ca33873103cdff771aac88da53bdf8940f5872bf9d17dc0923f31d8991b7167ac5ea12078589645", -"votingAddress": "ejiaLRFKTkH8Xt1gV6k1B9AzLdP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "30bb16484ddd59155295b81c311b5e85ca7b646c78fad8261b6ed7c82dc7631d", -"confirmedHash": "860eff821c1577f6b1c7ca9a04472addb92c67346b1dff5a1900000000000000", -"service": "00000000000000000000ffff55d1f12a", -"pubKeyOperator": "83966da2a9c241fdec5ab59e6a343f9fcbf4e4f320bda2389ae7c4c54c58e13cdceb5e10334fb11cb701f370273089eb", -"votingAddress": "34dNRWMw8Zi7PZZpatSdFQKghn4f", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "30bb946f10ddd7ce91ce0b6482b13dd69bf88969d28600025fc3cd71ed7eb734", -"confirmedHash": "a6e6a0a3e941591ab781b6ecc6d34de9f37b6796bf96ac5e0a00000000000000", -"service": "00000000000000000000ffffbca6259b", -"pubKeyOperator": "143947c7996e131a8b3bb0c969b0c9951a3e6eb97d18a75e2c76eaad04ab3598f5609f6d50ce83002c47e1716a036d6c", -"votingAddress": "2kSgRwgJEYaL4bhmxLtfASNJJVuK", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "30cfc7a2010499b5d45426627039b1351b60d38a9c5bfb539c8cd5601031e6b0", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0bf", -"pubKeyOperator": "9704e9167a1b4e19698730cee4404143c04064f01cda1d0e403c826003ae8d1e270d3c4db214d7a6c427400097d32e50", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "30d3925e06d69b1cdea859bf775704f65b2a8517ef55aff4be29fbc91620687d", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d562f0", -"pubKeyOperator": "8d6d4980448bb8934f8401ddb830cf30d0f331d62e04c38bf22df0471444a60a1ade3418d2be5e4c131da86252f783fc", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "30efafb42d93c11225a5811bd45a3d06b5b434baeeeac6796b59033bda6c72eb", -"confirmedHash": "2a14acaf007c65c5e81e70378f250640766f748c1bc4612d0000000000000000", -"service": "00000000000000000000ffff05b5ca13", -"pubKeyOperator": "8c6b03f0e3a8cf81f25bedc1016daa4e5113e16024b152d05f2cacf227092cc41bdf1cb71e9bfd09432d00a8c8ad933a", -"votingAddress": "3hyzpcLj9tatCNQhnTfSvQampjrB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "31016565146a94d8e0416c5a367024b2191d2bf84e37bb5ba19aa68b01419f95", -"confirmedHash": "926bafd5d8b19230ed4284d06829edf1b46dee2530f001821700000000000000", -"service": "00000000000000000000ffff52d315af", -"pubKeyOperator": "94d4d6e6c595e69345155c0574e96e892d3eaa9dbf49ee921e0801d18d8c34c641ff65fcd7977ed83c453f5be7a6a8e4", -"votingAddress": "2Rosmj66miPYU7EnRjBbFF3BcSJf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "310e0a4e84a5f61f95f922e4ed805c030c2157761df520f82eab02deaebafd6c", -"confirmedHash": "c58971671ff2e5b2629c64cf449fb208b7215008b0a2aede0a00000000000000", -"service": "00000000000000000000ffff52d31529", -"pubKeyOperator": "8d2c65e0f5ebb43978706a51a6fe37248a6fa866bf4bb8c848393ff722157724746cff578847273f9c2d658692088695", -"votingAddress": "3LeTWLdV4jqisnUsYp144sxbZ3fL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "312601303508e3e96f2a96ef98b8ff3e8752aaa85fcb09e967411ba3e1ca954b", -"confirmedHash": "59acbf2f5757ab5c7f7588df0aec32b58542c06df1b91aea0400000000000000", -"service": "00000000000000000000ffffa763489c", -"pubKeyOperator": "829276b104d078f3a89a34bd8ee7623fdc9d246cb90ef450936d9654de5d2f20a5ba7b9a70bb0deb23dfce3d6d863eca", -"votingAddress": "3sSgEF3ej7tyMJqrkBFZ5iyp1dtF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "31331ee3ff169b420700b6188f43ec7bf28fe7280861d6fa2252fe10e97406a5", -"confirmedHash": "9129c82a932fff630ff46a80cf992a6097a450221aecf4720100000000000000", -"service": "00000000000000000000ffff55d1f228", -"pubKeyOperator": "142b110f767094403169c1abb1502b85e8cfcd0c8a71110b7ce05fa832f8dea88a37d008c53b6374a7d4852dd9b5ae81", -"votingAddress": "3pZQfYuFDdxyBqLV94BgQeAa63L3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "314475d988b687ee017bacc16f48b35dd53e0d18d0fe4bc50dcf1e274a2a3444", -"confirmedHash": "e0eddac88b7ecfd267ed21318e2a0828e8a66d3457a41bae1500000000000000", -"service": "00000000000000000000ffff90ca126c", -"pubKeyOperator": "85c39b2af43349b27e832666a35c1161acb94df5a3e07bf7de179bf5e9377fe655ae05752f0663503ca435e0f958fd8f", -"votingAddress": "NdCHcAEGt9mUmZSxfeC7PBTQy5c", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "315e9e924eff5e9eab29fe097a2b6a1fe1375f5a42f5d866fa7f43df3cf9d86a", -"confirmedHash": "a22b43fc14cf89f4250ab26b4d9707b09b4cc9cdc8e2b9c10700000000000000", -"service": "00000000000000000000ffff0301f9f7", -"pubKeyOperator": "91d1be870ed2b60fe5ef61752a1c54299a2d5f3485d81d80b05913c774bf83c9c4bb4980da5e88de4d091bc52e4d433c", -"votingAddress": "4Z6c4eXPU7WyZf3oFRzZAtu7nEiB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3166f732ddb11992e3b442f05cfe98bf52c3b592f1a6cef81d42f2c97e972748", -"confirmedHash": "b06a94420aa80220781f4e2e88298985285d7b9166a5e9ca0000000000000000", -"service": "00000000000000000000ffff2561e315", -"pubKeyOperator": "939ec638b3a17c21d19c89127c3a2786141a8447bcad76ef25294e3287ad31a03b4e221ec2ade9c749e97ac1953a58e8", -"votingAddress": "2AZkJsgGpqejWx7BJeTGyGJ4ZVCk", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "31723ed35ce626da3a964708d8b64d723a9ef9afecd5192e7e659c53fa6153fe", -"confirmedHash": "cfb5f538cbe1bc7d6e9a0b05daaf076734116bdfe4d2e0850700000000000000", -"service": "00000000000000000000ffff2d4ccd8c", -"pubKeyOperator": "170790a29d8f0b0489fa16c6962d8d55b8fba2168c891696d93064d540bcb3851f21edda80086e0e680c884533be33e8", -"votingAddress": "39pqsdtHzqd1Nt7UZ7VHhyQ9wZxg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "317d6e921db894f4b22e2bcd8aaa18614b859c4be1026d6ef6e381f0d8677091", -"confirmedHash": "f142219d724bdfab00024f3cbed54a68a5d2e022ccb528120500000000000000", -"service": "00000000000000000000ffff6deb45bb", -"pubKeyOperator": "170705c77e379a4629cf10f6c2ef0f1dae9daff746f65adecb8642ff059926a514eef64435712f2fe489ae4e12949411", -"votingAddress": "2t6Q8tNxq6GMfTtVcPLZghQZR976", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "31802116c1029c1705b2728e3a75b680a4e27610c282e9f021402df852a05195", -"confirmedHash": "197cf351ef97de2d859532c25c3586027f586a0d5676288e1700000000000000", -"service": "00000000000000000000ffff2d4c8d65", -"pubKeyOperator": "0e2123b2d5b3a8df7c4e76afc3d2dbcedaefd6b29d2e534e7f07e8ffa305e10febbf9a2b29c982c79bbb5c7b022e98e3", -"votingAddress": "3uNy3LaDMoRCzXvAXkJv4rgSMLUF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "318ae59f0ea723eea7825da8d259fea3c243f67c89dbd4963f0b1f4486c526fd", -"confirmedHash": "4113cfb08ade9f1b5d935bf2d7223e28d8191bb01a7808d80400000000000000", -"service": "00000000000000000000ffffbc28b6c3", -"pubKeyOperator": "0a3c17c3f4ab83254cc4a2b9ac7560356740e2c77849cb9e033f41bf195efb2af67637d2d0109a5ae4f5667d770f5bed", -"votingAddress": "43RXaQeJsm2d9UfeHMuPjWyFFzzm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "318d1155ae542954c4127524ead72324dd29f1033434d6124dc2b1dadf230233", -"confirmedHash": "5d06bf055e70c9cb02728d5cbe8c5e2f7179e4748d56011c1400000000000000", -"service": "00000000000000000000ffff8d5f3625", -"pubKeyOperator": "8469d3d6096ddc26637d5487382ca41bc535d11203514dff3556d94efda9591cd6349e38630e3cd8893ef44e2386cda0", -"votingAddress": "GyE7db7evuvfYTcypvyMTMGzpp8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "319890e005f6512ca029403480d16268da0f6f10ee983db19963550af2473402", -"confirmedHash": "f7835b1f88f36b56b34124c2bf93240946b44558c45564ac2700000000000000", -"service": "00000000000000000000ffffbce2e0e9", -"pubKeyOperator": "00779888692fbaec343f42b0e9b552956f705f690318fa3f5a6d5451b893281575c7f8051e1d4db7703d5856b782e0a6", -"votingAddress": "45tAoB9bedKTxut5prseNpZecQct", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "31b0df5cfba2feb056b749b68b5016e2f78e5ba49bd58ae2288bd6d393a499ea", -"confirmedHash": "117fe9f6b27b119ca072f4d80b3a1f01887248e27210f5700400000000000000", -"service": "00000000000000000000ffffb280cf9c", -"pubKeyOperator": "9510a6f47bd4a7d08811e7d0c42a587e704ab071b71b45d61281b6c7c5a37004947638b6dc834c541fce833edc6d8a18", -"votingAddress": "3Zvs72YAt4TFFswebEuomjWqv3dW", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "31b5394a8780a2605496136e30a356366158a4c11302885f18636e0df372f78b", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b08e", -"pubKeyOperator": "0e11201b87d762286646f1933894fa9829e9822486a842df1f776b4da2ec48ea41f4f0a61dfb2c861583a6a9c49a106a", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "31c7377d7e856ddfd9508358d2cf9f050552338c94ceee6970d4e2d748df864c", -"confirmedHash": "be9ce9ae7f0e7a3488e99a5a0d48e54e446144a90f1a12e30900000000000000", -"service": "00000000000000000000ffff88f38e29", -"pubKeyOperator": "9790cbd1c2d248c788ef3561022791ff06fbfd28ebf85dc3d97b05d7da02a6e1800f4c32c8a639c3379ffa525ea56f56", -"votingAddress": "3Gqkb5kRkXNLPc2aPaY6MnJLqLzz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "32197432547eb4cdfaa89e4a0a1a75b99b1093a34de02106fca4ff03cf153909", -"confirmedHash": "62e6cefa4f13e012727361aa91736904b3dc1529440371c90e00000000000000", -"service": "00000000000000000000ffff52d3199b", -"pubKeyOperator": "98cd4ae45074ac70c832f588ebfb28961ee690fceb0be47a9be962eb8566a04406179bace0254e3ba605a3b03288ab8e", -"votingAddress": "4XEv9GZnoCmxX4du4HzAhXAKpzPe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "321a1d5e901f5557499c0f16c4e32485a785545c9a7fe36e163c6129d0bccc51", -"confirmedHash": "a5f0c1ae375f7457bb35ab6dde23ec75b11fb0a991bce4f01000000000000000", -"service": "00000000000000000000ffff4622dc1e", -"pubKeyOperator": "1112026674ac425ad312b368903b1bc60101928719b4e51bd821746c5dc1094e6e0cb057b4a5e17578fd278d94780248", -"votingAddress": "JtGKmHnWCgytTuxktgiQsNaBPPr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "32409cb92827e296d64e4898ad085bc8aed4dd545cc02ad0688f5274bb7f0fab", -"confirmedHash": "67dedf35fc15c9691044470ec6904430b76bc6c73cc4ac800900000000000000", -"service": "00000000000000000000ffff8a448c9c", -"pubKeyOperator": "9680d62bc7a6bb2c7adc65691a0c6b91a31feb28fdf00721545f83eddcce5e6d438390d4f1b127a23e8db74d0491f139", -"votingAddress": "34Mj3uEwU1dmRkSeem9B9bPN7QwK", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "3270574fc8a5b8b8d9fa854ddf0e85017fdd1e6e731357fac1a75d9f541dc1ec", -"confirmedHash": "201717f8fa6df443e3658fba8c41565fab0fd68ecbc97ba51500000000000000", -"service": "00000000000000000000ffff68c818c4", -"pubKeyOperator": "0e3bbb9d03379d5505d06bce036d084ea6bf3e8805ba68e240233b9b24d4ed3bc2ebc0afb07d959cd8d6ca842a4df158", -"votingAddress": "3YeMszhLS9uXX2UddfEXwrf2gX9A", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3279d52cb33d0919bdad1fc38cb1800a034c1e8935de5b9c72f65a896fe65570", -"confirmedHash": "88ff62118bd21384338b5b13968c737c338d3805842d24f41300000000000000", -"service": "00000000000000000000ffff8a44b81c", -"pubKeyOperator": "89ecbcfa0c70392cb31ac77c74f1607f93cddc2a014ea6555b5e4e64d2f6b8f6e0786a4944036631d9acf437d3118a6f", -"votingAddress": "2ZVnqEKBEZbCxPkHe7Bg3WZSTfZM", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "329e123a68f73ab3827c270a8123fe83a8d8287dfd25cb9804bfb76455590fb6", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96887c02", -"pubKeyOperator": "012988b74ecd7c731c06993b458e17c43b2407c4b7e7907951e05bd0a74f46b28f688df332a81dc9ace54cc25743a3aa", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "32ae2b1c7715495579aa4dfbf8c31ba6bd2aed13594683a5abd204565354750e", -"confirmedHash": "437fe12c7a81236f7d123290f0d3886037d3ce90baf5e4961600000000000000", -"service": "00000000000000000000ffff88f31dd0", -"pubKeyOperator": "80a0cd078b56fa811d346656cf0f0de1832e4108b150d8afb74dfd4cf1b0838524606e0b23361f784e64bb9934e0be73", -"votingAddress": "4T4eNTeqfhT4MLasAAB5bXtnq44c", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "32b62aa16f1695eb8af3b57f0786b76dc1efb7b3f1b6452f704b34d326f29532", -"confirmedHash": "3ecbed5f482966008c86d316d6cd7f1bcbdf7ce2c93b0dab0300000000000000", -"service": "00000000000000000000ffffb07b39c4", -"pubKeyOperator": "8b815ea7d6d2b4ff03825529ff16afdfaa5a7c1796cfa565552f4b608e3db8a9537e5c8c973779a6834ec3878da1e64d", -"votingAddress": "37UMNWTxHFAxq3mKAx8WWF6P6bTm", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "32e30ec0fed78c0ed650f7ebeeaabceaf8b34de90684e2792bd9a46a79a3d519", -"confirmedHash": "6ce54bf9302d305e275e5bdf8c6874bb7cf2e5cf8231eeec0200000000000000", -"service": "00000000000000000000ffffbc28b993", -"pubKeyOperator": "01d01a64d62004661b11485e01dda1fa9c3bbd82b87627bc30a4068f5520ad6094f2f7e3817751eb13bd67e51a395d5a", -"votingAddress": "jdorGSrBmGRumHivYZnXmbo28YT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "32ee4bbfe7d19de4ab9ef960dd8a8ccbd92994f4677a1756226df804c02e7515", -"confirmedHash": "7bff4f371c94a24bc8bd45d996e8e1e504972248543b91fb3500000000000000", -"service": "00000000000000000000ffff87b50848", -"pubKeyOperator": "0e31f54a719835d7ffe767908b6da7be762fec82d92f6abb61d477e81b9d1f62e7beae24aa889e091993ecba0062cb7e", -"votingAddress": "3HwAGfy7Wyq7Fv11u8zXqvyRhaVt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "32f3c79dd990cff32c236941da8803b84e79f3cf424440c81e8a0f27aca12064", -"confirmedHash": "c722ae4b0ad53087f1c54ef8bcaab18a53400b38fc093ed90600000000000000", -"service": "00000000000000000000ffff877d4709", -"pubKeyOperator": "84c7528a05c1ab8cc22f29c17adaea5c61f80cd649353e6c388bf0af438fbf7565a0cfcdbf1f87b187d08ffd5cc05e24", -"votingAddress": "4Mb9V5BMYyobUTH8wjtGhtKTt1a4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "32fb377f12efe177e54dc4d1d0dd4a8c8a9b2de64ad29f4b3d97b0a6dcdd9e21", -"confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", -"service": "00000000000000000000ffff55d1f1e4", -"pubKeyOperator": "052768279662dde58004c839fa200f66d7ea94cc15d8ac3b835290b0a28f892c936978c320872a1e673056f839dd381c", -"votingAddress": "3mqUYxV3yttwwU4kxGm1xiVh2Hoz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "33062bab7965a6bb7a097d58362f7e80bc0e1bd2312f2cb23e940697fc93ae00", -"confirmedHash": "10fd7e1313262af18eba1a5bce33f2fd7d6527a8d55d58723400000000000000", -"service": "00000000000000000000ffffbc28fbcf", -"pubKeyOperator": "8c2a7d1210e4f70f5a3f4dd0bd346303e67d75e204e37d3cf84bd26c0231d53bb8a979ce6134bfe84e8dcd4ddb41a9a3", -"votingAddress": "3CWq1tjFQQUoLAhXELzYQMvimAVJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "33161df3d53dcfd1e2f23fb615ce048d93ba72635cd5a43b9fc4de6e12750044", -"confirmedHash": "495a93de937dd0cfff0761cec6e3f20928acdd82471232dd1200000000000000", -"service": "00000000000000000000ffff8ac5931c", -"pubKeyOperator": "0f83c8c7338db8d6614a2b01080aa1dbb9dec6be43254a0a000876a95c0c9831d2fc7dcdf3f7afbac0820762563a61cb", -"votingAddress": "3otB6hiXj6m8Z7G2GMSBHhDmG7KN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "33181c70746034cc5f3086a22282dd61f54aec958f257c64480ed1e0cf557568", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b064", -"pubKeyOperator": "8e62a98da16cb5c3a9812e4705599dec5fb24e838bc391ec14cb3990a3ec33777a6eb36d22b3b603e6073252c0efaf06", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3331ca6c142c04d5de443dfbf8be33a53f5e339acd43486fa22348eda86286b7", -"confirmedHash": "2cc7ad4bdc66c6cd1d538dc5f99816096e0e2acbc70308ac1a00000000000000", -"service": "00000000000000000000ffff6deb43f6", -"pubKeyOperator": "08713b27318898be84732dd431be9f4c906d2c282e555ec73fe83fe748d5dca5200fca28b3e5f676681f8bf858e6c7d0", -"votingAddress": "2F9BmqjN1TbrK54W1xtY26chbMh6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3333dc26bd868508fb1beab8e5af7fcf4797b312a95d632be61e0ac234302960", -"confirmedHash": "77833bec3795fa72276cc148ff10279cfc7a534a1508ef990800000000000000", -"service": "00000000000000000000ffffa2f3dd50", -"pubKeyOperator": "80e17c1da650f420b5963597ae90cd45b658018ee8c59acd3326ff351516d1bbfe717e0e19543c77898ab9e961962228", -"votingAddress": "3T1BmT5EUar7rVX5NvvvUFVF5Bzb", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "3362c7aab2b2f3891dbec5904f0e8fa305f016f0722c986ebca6e3ad59278eb8", -"confirmedHash": "9224b1d98b28c263a926a21dade7b9fcab00aa52f5ccf5971c00000000000000", -"service": "00000000000000000000ffffae22e9ca", -"pubKeyOperator": "8318710d26fa031e5226c18a650760aaa8f845c00b0d027ea9c81d687bdb6573005cd2c9439746e834e3dd5220ab7652", -"votingAddress": "3bbw7wDbqzrgqXmPkehRsNgs3cJj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3389fe9931099e973dc0fc36e67f259a973bd4ee00a4d9331d0dd729c84f23b9", -"confirmedHash": "c0cfa5afb4a8efea17a2668971f2e2569e68897f5e6203e92200000000000000", -"service": "00000000000000000000ffff9f410ac2", -"pubKeyOperator": "96d8fe4cf07e4543d3378f4de9c33637f7a3ae2e012fccb88fefbc31d0a809ed3f7c34c2c7b71a39c8035c9b8c00bf08", -"votingAddress": "4FtXZaCNKKCJXKohi8aCmcTnBH3T", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3392f588b723e8049e4248fb2ed3beebf589130b964ed54415a3010eee041f98", -"confirmedHash": "aa454717731fb3ad9052bac062ca4ab5003e46518c4b17040300000000000000", -"service": "00000000000000000000ffffbc28b6dd", -"pubKeyOperator": "8d49addc10bb10d8b1bd3b394b80b03f42219553ca6e1e123fe86566d5380a1624b17aa8bc239e9b394f676a95546245", -"votingAddress": "2z7wM4u5Sb33ECMZSuVbDreiUjiV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "339fecfb62ec842ffb2ef4795e02505207ade4117447498ffa2721215ab5b128", -"confirmedHash": "538ee80ad9ffa7f7a024d24a593ae7c8a434cfa9394b14ef0800000000000000", -"service": "00000000000000000000ffff6dcdb6b9", -"pubKeyOperator": "8c2c32d372da27b47004ce327c4db9384702de158a774418a749773b926346deb983fd9233fa906bfc174e401ccd2b81", -"votingAddress": "3655LmDHAT1Qgbt4U4A6jk44vrqu", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "33a2ddaf908b5744870d0d2989a34df5267b608d823feb668a3db98fef4f932b", -"confirmedHash": "2361df2cfb3dbd626bff6a20f35d1ab801a740bd10e5a7c31900000000000000", -"service": "00000000000000000000ffffb9e4538a", -"pubKeyOperator": "935bd0031efd4505f93c96831ab577ee7f4379bc4319a4bc0aa47452ae2b42c96911f3147c4a8728c8b3d04bd2b5e119", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "33b889367d47535b8a0f28ccc19cc34f545fd4280422889bf30d4dec698b119a", -"confirmedHash": "538e652b4628573d6650586c4442a38ebc687a92b98184c71300000000000000", -"service": "00000000000000000000ffff33c37449", -"pubKeyOperator": "87ce4d01307712b3c4b1679902bbb5a1ed51750a123faf387938ccb8b3e520b4d45229de8654cf89008280ad2f7185a3", -"votingAddress": "msQJuM88cTbaBFSyBSXZSdX4zSV", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "33bcb57bb7b0ae8767e75ea20a5c4277892902bde5ff1a1a6ec44d1800454c87", -"confirmedHash": "c080d488982716ee367745c26a8f1b420b4826e3ba8415e20f00000000000000", -"service": "00000000000000000000ffff58630b1d", -"pubKeyOperator": "9949033f1b836cec66e675eb7d943ff04595a4e19d9e51b31d79cec9bf113e4d83f7f119201ab07488bb1f691b0b7e53", -"votingAddress": "i9smGLQUeNpxomgN4bEHLMvkK53", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "33db7fe01a34c2b5ef0c1f1ca13d7a15444f146e7b1f01e7ccd2e289b0a276d9", -"confirmedHash": "3e5a42a3c906c40d6d354d1ec01e03605a37e59218fc59883300000000000000", -"service": "00000000000000000000ffffb9d8b121", -"pubKeyOperator": "00b912b17016e939c0afb72a26360032cf986c61b0f2d69d3f20c3872d6fb8913e482d95c10e904f5cf0f88bc5e35a8b", -"votingAddress": "4YWHgQUCbmRvUXQFM3h8PrmSwD7d", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "33fe3de47886108f1748ecb278b3166dfef723b06ebdc8cc9e3c124d6ac6bec2", -"confirmedHash": "a218da0910c8618cc258d19652859b5ab3c6ee6762a412680200000000000000", -"service": "00000000000000000000ffff50d1eee9", -"pubKeyOperator": "8c5cb6bbb6c28a8257d8a6dd12359782d5617f384ab575f0003e68a1fea595a7b45d76faf6053ec3459f749abfc60f76", -"votingAddress": "2ZWKEVCPjFWkCmaxxQPFdsVaj5yE", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "34066d3345f94301a533209cdc76606fac210526ca696c8a3874f2f05a95441b", -"confirmedHash": "c9ba311c95a8e32e0c914c394dcc18673fa01cb5f0c399641b00000000000000", -"service": "00000000000000000000ffff951cce2b", -"pubKeyOperator": "0396f9ebb9a42a6af2a5d0f422ea29511c0098a685fe5031b202803d886e54ecd3ad7d0da79faa10a0c56c33cd8d1668", -"votingAddress": "4EdosDB7EU4zEDNBRuvt6CC8FeAq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "34071fc6534e2e0b8e409d5dff0c18cf83fd5577ba22d7a80dc70ceab9dccf2e", -"confirmedHash": "bbcbb21d4ce40eb3d7827da681e571b07eccd0b100d264c81600000000000000", -"service": "00000000000000000000ffff55cea55a", -"pubKeyOperator": "889b874dfaf663c9304f38d94739969ebeb928c2168ec3a3a5da198805bd8bf39762c88267b4092f2395a3897eefec95", -"votingAddress": "2zzyRsnsaMi56VLF1jVGRxtScCae", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "34113a95cd69dc94f988526dd8ad905514bb5b0054639c8b68ce6fea1b88dd39", -"confirmedHash": "90b328fc25e0e96a593ae46cef1f6d95bd113d9b5a49855f1700000000000000", -"service": "00000000000000000000ffffbc28fbda", -"pubKeyOperator": "02b7784e757764a048f7a0b4edbd89f6293352cdac2ad4d4331895b08d48b6880c8ae548d852a88641106c9c0712782f", -"votingAddress": "4HQW3uLbKTLYziKBaFQcp7HYGBG7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3471141cc407b5e417b024a7f02c28cfe0b4dc98510d2ad958353737fbaea876", -"confirmedHash": "b4c7f4880fcca0200ef9d50e9068a5ab43256900c7f54ec40300000000000000", -"service": "00000000000000000000ffff88f31dd8", -"pubKeyOperator": "93706c75a4a02f6fbaa1e3c361b4d9f570cfef0bdbd20a23cc0e2b14cdce4c040c0e926e19ee4c4185b855d85795ebdf", -"votingAddress": "2sq8BCFNbxsK23vPCwzyC4hm4xdc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "347f0d11e31355d442be12568e7215ea47b8a7e84cb954ef82c5dd81cb8db358", -"confirmedHash": "dd00148e7f6a7fdd7eb196fe4951d63f90c3323998eb07312900000000000000", -"service": "00000000000000000000ffff52d315f5", -"pubKeyOperator": "0c5e523c4be2c7acda6b71d52fee336131e133cdfc1272768a16e87c28d5c9a0778a9b44cf16e6a0b043382cdcb82d68", -"votingAddress": "3BD1GqRpziupjAwoXFBQCbwS5LQc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "34ae2b86ba5e7cf20d7c3c1b5ca4700b77a8b5939a155a08860a2561a85b27d2", -"confirmedHash": "1c8b4c37f5024071d2fd31f87f79d084309bfa2dce4c1f290600000000000000", -"service": "00000000000000000000ffff82a2e172", -"pubKeyOperator": "87c8a082fda5814f2c6760dcdb9ee43bd8058db09991c9ea459298006653d0e790825c33d9bcf4d814826621edb31677", -"votingAddress": "QuzY53u2qcZDkQMhByUifeNBZKX", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "34c05580a2896b8ef2c6d0c4a6370b673c6c7569527848a54577313be647f070", -"confirmedHash": "9df584102e353ef1eef606c093908b01e334e2512294eb1e0800000000000000", -"service": "00000000000000000000ffffbc28cd05", -"pubKeyOperator": "0a65770d24e13200868c50b97bed2d7f30c927620a9c44a94f5d91517e7dc6c780a7a50daffad2409f853cc4a6d542d8", -"votingAddress": "XhM2ZnEBuJtqUP7JUY3vVTjgsxT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "34d149a37901f1a8b71280d84cd9e41536b3b7fec9714a5f8cf3f6d18506b744", -"confirmedHash": "50a4c2e17790cf4b393eb396ba5c55c7f68d3b5a527d3f590f00000000000000", -"service": "00000000000000000000ffff52d3191a", -"pubKeyOperator": "0ec6ed06e908e1b68891f53748e3327f9e58d49b693e82ae8ba6bd40a699a66a956bf387a7342d3095419030733b43b6", -"votingAddress": "2UxKMTR1pvRbzTMMdUk5szM4PPWK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "34d9c419a02114198679b2f773601e87f05319ab8988fea1ffede780a8f5ade7", -"confirmedHash": "4aff101b03089f506fd4d071edc5eba2ae31f549c524362b0900000000000000", -"service": "00000000000000000000ffff86d1c8ae", -"pubKeyOperator": "82490ec84f3cbcabc204fe8325b23c89eef16e5223b9fcbf43696ef6c1822abc41f4e9440cf517efe77e9ea1645baaac", -"votingAddress": "48hBPHbCfDKi9WvRZeLz1xRZnfzU", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "34e95f40941eace053d038f076e489224a9bb60dd68396066611fd5d15bdc4e2", -"confirmedHash": "4d01c3ecc4c1aceb90a9b3539f833454c0d4ca9f758b71c90f00000000000000", -"service": "00000000000000000000ffff5fd87e24", -"pubKeyOperator": "89a48272f5c3d52c6e7e9b97051438143b9b86e542e4395e165fa5b8038d73d7612ff8bb438e434b60390aabda8eae7f", -"votingAddress": "4GABHUeRbqr6Kvro6d8qpaVdPf3b", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "34ec209a567e9108e38c4a1c0ae6f99f9b82f01ccf478e104fe9a4ad1508b634", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff8491cec2", -"pubKeyOperator": "81b31cc2b700ef9e1185f739fdcb8214fcd576f2384f7a066f7ea2f5d52092a16837bb2989ca87808f651cedf18cf81a", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "34fa5fbafd4df980a9f998fcb7998e087a8a02d6866c9428d4a0acb06b619bd1", -"confirmedHash": "c8fac7c25511b02ef6f8cb743098492c6b65d12e7f8611830800000000000000", -"service": "00000000000000000000ffff55d1f1e2", -"pubKeyOperator": "0958d0ab1f083f5383f0b5e1dc673780eecd5853c398acbff890e96c11f4eaefd28a55e605da2ec1c33f87120ee5aa0a", -"votingAddress": "2c63PiBhLViEysPMWbiP7H4o96s4", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "34fd5abc4a7efbc6b5e9d3579945d9ee5c32a1252482489ac42656f20bda3f6b", -"confirmedHash": "f7d879342bb45071699d3cb95351033ac8798d02b7231b3a0800000000000000", -"service": "00000000000000000000ffffc034a6cb", -"pubKeyOperator": "0d82678b8200ea48eb4d4467cc7c9115848804a7528e303e6cc1988affa481a555e8fa37afec366ee658b28c830a343b", -"votingAddress": "24NsbbH1sDGEvXkwfpX3MQDrx1d7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3505c95b135692adacf3fe3f9ad499d65a49134d93f7eb9f99a2aa310d30dff6", -"confirmedHash": "9172f32573ddd9047abc03a58ab8e2b15b2a953edd2091f50a00000000000000", -"service": "00000000000000000000ffffcebd33e1", -"pubKeyOperator": "086b74a35a60a05d0f35f19646b400db2562fde70a9b294cf25ec6650d764bec35ca9c3deb6608b89c2f4c2e189bf8ed", -"votingAddress": "3XGH1MgkyNPueWrnjMSLVSB6Vd8u", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3514c665556215b7a8635f963f3d3cb576fde583b1c7ad8e89ef7e695da2ca57", -"confirmedHash": "8ec1b8173046e570e05641a1ff650136977dce685b32c4370500000000000000", -"service": "00000000000000000000ffffae22e9c9", -"pubKeyOperator": "91be2d40ef86ab5fbd03f362f81061aafa2e1a6be860cf4747e8a73b69f62b22f5c78771b82c1d9e78e55cf93b0755bc", -"votingAddress": "2r2c9jKq1iz58Pp6LV1nnCYBcWEw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "351acc17c43e7d939309f70085e7e968b396a8160d84ec0d88e00553df0a63aa", -"confirmedHash": "7ee01063fca25b0eb55e3da95a43450dd828687e080c4baa1500000000000000", -"service": "00000000000000000000ffffbc2815f3", -"pubKeyOperator": "1960e7a8b3ae22b3332b7b8b3abc5cc973e55c57e084bb304dfa81220a4954c855cc3149856df1abcfa9097ac6fb44b4", -"votingAddress": "2sRYuDBPnk72FjHqtz1wDTBQ2zdv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "351b7dec7244afb215f2adf487c6a11e27b2a7e37a613a7151122af33fa73814", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0a9", -"pubKeyOperator": "10eeab3a590f1344b78e3c4de1bd039c68ffe57e3765b2da1d926eb8ae9914b62ce2e0179f5f7aa2f0ba7984a1237459", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "35206bdfe780bcfaadd5d305b9048bef9e5ac2c4ed0a0054112a18f3e68259d3", -"confirmedHash": "f6886477772eb17c02ec52995917dc1d471f8c54454888331a00000000000000", -"service": "00000000000000000000ffff36270a60", -"pubKeyOperator": "01a2645e2c6cc942f935f080984341eb6eb21317d48dca302d6bc1abfd0783361227f20c14d560e66577fed10d1e73b3", -"votingAddress": "fYi81ytnhm6ShDpR2Ju5BHL8gvv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "352df58598a7d7f0851cb04882460acdba43d5b8c4d6c7234309123e22bb0e4e", -"confirmedHash": "037dda2412fcceaf8828e3244d10a55cbebfc93022a36eea0100000000000000", -"service": "00000000000000000000ffffa516e01c", -"pubKeyOperator": "0704c5f35bf5e5bde34391886bd2ca1db359171c09b72f750929a4da6b8d3d6a72385f504c67d3af107ff2095129801e", -"votingAddress": "1cZnmN8kXbdSsV2gom6ejHmqBWt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3549d09bb90349e60fbecddbe4e970cb1f69712dcbc0ab6e1337c0c5cd76d0c8", -"confirmedHash": "c61e2ae74231ef41f78e4eaac1d6e6064c624766d3bcdf7b2d00000000000000", -"service": "00000000000000000000ffffb23ecbf9", -"pubKeyOperator": "8309e90bbd4ec2363f9990c42707e05d45a0faa5f8e80e0f854e5c81bf18ea1e0fe00133e2cdf430634c1596cbdc6ad9", -"votingAddress": "2TAJPHcBW8EpXNLS83hdTLwCqyjE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "354ad30699e5561d6e15ff143ebfcf6abf3524804fc2a2af1874f300b41ee24e", -"confirmedHash": "d72f45345dd0473919608f03503693e163e6b2f99d74621e0d00000000000000", -"service": "00000000000000000000ffff50d0e44c", -"pubKeyOperator": "9760aeda6aabeb6c3ff20065a87d2de59a5d44e5b371df2064cd48c211c9f395b9166f7b05a92725be8c5414e1d92fc2", -"votingAddress": "At1me4mRreQiU2KM9KDotoijcru", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3569439a952c29b1397458720248d5ae67eddac4a9662a667fad335aa76593b4", -"confirmedHash": "e29874bfdef8eddc05a617850587cb51893f6e006ba65caa0200000000000000", -"service": "00000000000000000000ffffa45ca082", -"pubKeyOperator": "0a5b0c62d8550ced8e2d876c6b123dc358a3de5eb5f4effb69afcc20c5f6015fca99054457e248972fe3662afb80ec9c", -"votingAddress": "32gYo1j7Un71uZDzKQj8AkJ4Ddj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "357a64fc33d7abefa72fd46d6b31ec33cd7a3b34586bd5caab1d6d6cf1f0251b", -"confirmedHash": "827907875dedd22cbc59d7e780b4f4f51da96675db5ab85c0100000000000000", -"service": "00000000000000000000ffff9f417915", -"pubKeyOperator": "04ab7918725a0d96790cc1471e69be330b90f555f8a5299cfe1521ff00e2b8bc575eb62ddcbd60572043f5873cc30baf", -"votingAddress": "292V7N4oRe1uMciQg5MHSrhzwwzJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "358b36fde512ffedf0cc2df0ec939ac10710200e9f38c1b5aa3b2b65974d7ef3", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d52aba", -"pubKeyOperator": "92f1695370af48f7c9ea7411e7353ba53b18b87055b688c59282a6bc6b435cffa7e155d4aac479591c39ea9936041b6e", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3590e6e5af0c4a9cb547be2aaca5dc060709a0ae1d8f74caffacf3cb0ac4f553", -"confirmedHash": "4466b25e0224380579ec5dbc6cd9c5bf0f9e6ecabb5245900c00000000000000", -"service": "00000000000000000000ffffbc28b991", -"pubKeyOperator": "077c46c2b0aef32126a586f21c1340f5fd336adcd2b3a60ffb87dc3c4882c35c189135bddc620e6cb5743a6fd9588930", -"votingAddress": "G9LE3fBweeWfDjEMnFZBBKvdYvq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3592b5dc7ef3a06159cd6830b1c65e0c6225e4f5b4316706751e5910d588c559", -"confirmedHash": "57773d0f254e4bd82c9b97d37b4c8cfd45a27eb2cb4feba70600000000000000", -"service": "00000000000000000000ffffbc28a318", -"pubKeyOperator": "9603f5ba6cd2d13ca3d031c93f3b8dbcdbe4003c7c9d553ea6fa58b92b8bf1630f6d7d6e956a59f58951f0e887c8a71a", -"votingAddress": "2YaJcZPJXmkf7e1X7TPNkKuixN7A", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "359c4adee98e722d031f4b80b43ed65b710051dbdfcc29e74f29f1fb6f930829", -"confirmedHash": "858e1f5fa0a892dd3a6e76af04d1dd988926fe2e507aa3800c00000000000000", -"service": "00000000000000000000ffff58630b08", -"pubKeyOperator": "125bd865ac3ae84bb91f31d2c6ca6feb6514c4bd48fe8becde6ba582bc1b3e1891f1016015e73002ce43ab54e67631a0", -"votingAddress": "QDmabVH7DnUQHzSiV9aTp79XiAq", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "35a6f7333f4512dd289fb9bfce90369b14fb002b156c1738277d486847c4e19d", -"confirmedHash": "e689aeac898e471003c4315a8c32bf22a00211e3afd7e8820100000000000000", -"service": "00000000000000000000ffffc21ae8c3", -"pubKeyOperator": "975b83237f00d119fd7c9b6d05052009bef91432e68582fd63298cebd1fee6892bc418759e0d39a769444468440ca931", -"votingAddress": "4Rr4ndpzQ7z4QtxhE7YV2CYofx17", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "35a9731f3a1b483764fb0a57f9f141a3dcda80c36e43b77d12ea385ba788ba41", -"confirmedHash": "95f0a2365548e8274e68cda2429773162501058f9f11f84d0300000000000000", -"service": "00000000000000000000ffff9ef7dc7d", -"pubKeyOperator": "973c8b5dfd0db09f34ba03e8a7f781c9d1fec1d66775773a1cd5e0a5c14a47ae72222f0d805328d91a61e7a67c1e730f", -"votingAddress": "2HeRMkmbkBu558QMYYc7fWB9ihLK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "35accea122b21af808813baf297f548abc80bc353ba6fd6e26daf12efbcf0c20", -"confirmedHash": "d44620c39da278571f22fad10a0945561e343b67dcc72e021200000000000000", -"service": "00000000000000000000ffff33b2aca6", -"pubKeyOperator": "00200857ea7c8e1e897697d338bcdc9213edf7c338ac8260807f3586bd949657f155f6b9bbd9710eb2a8285cac1f4396", -"votingAddress": "2cSzr71BmUvqKqMog6wQxT4Ax8AL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "35bb7d5303f662af0a416d0cbd279934d7e482ce707e0d4a2b934a970b6e048c", -"confirmedHash": "f171b075fa0d685c76e09c14c8d96e929398f606fa92cc8a2200000000000000", -"service": "00000000000000000000ffffa45cfc1c", -"pubKeyOperator": "054224f48fa7f21f704e90c19d80c8a09dbe47ec7317adccd4ac0c662854d6f02944a2f6d3f72923c20772bcea693fa0", -"votingAddress": "2NHszy4MNjL3ao7cAmXJaR6hoCaL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "35beb8e58c3d13565aae5794eee9e24a0b7eba12a87c69aa7c9d3e49bfbd31db", -"confirmedHash": "835bbd674aacfbf3a7ce35b183f2f4e12d5cf2a8c81d75581e00000000000000", -"service": "00000000000000000000ffff9f410491", -"pubKeyOperator": "1795add5cfdab8e3133b235744357ffb21d3204b99d3e12006a1471718a70f7651e91f2199ce79a16aea9f3413aabebb", -"votingAddress": "bMPqQ64LqUh28rJRjukFhvwhzB9", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "35cd0bef98c468619130248a64ad79654778c5f36a76d7762fc686d25009c0e0", -"confirmedHash": "8571c846b034755b3eb507ac5d5902d96da64996cae2e2395400000000000000", -"service": "00000000000000000000ffff3625c7e3", -"pubKeyOperator": "12c02530dd72a031f56d16ba1f4be9022180ca358339229b98446b7700471b9daffce843f815f2e875c4416248ee6525", -"votingAddress": "JUentiExQb3i66CP9Ez3mqRq6f8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "35d70ce0e9d7c5290ef358c06d0c0763a2271c8905a52f1cc33ab30f1cd8b44b", -"confirmedHash": "b4582a6ffea2851e6581de5cf5799d7a1e8705159979b9a31700000000000000", -"service": "00000000000000000000ffff2d55752c", -"pubKeyOperator": "8f51f9d4d53e11887694930871b64d44f1ec9b92870bc717ce21c6bc252cecb2254adcb0f322e1921e3227c2fe837fc8", -"votingAddress": "2ExHhmwKJD63D6TKhavmknKge7iW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "360f786cfc1eb34c28b722cc754cdc62d9d8f7c2b21cd726ab6a7957d5a5b147", -"confirmedHash": "7cda983d2dd8a2fce5cf6141c48cfe13ed4c9c83d43f2b4e2900000000000000", -"service": "00000000000000000000ffffb009d210", -"pubKeyOperator": "81bbb0dde6cd5e6ae53960f754459538ea430be443f10ceca831d8170f0813a41e53b672b53b4308e8013fed9939f7d8", -"votingAddress": "3HLakBP7zAniBkmqEhY1hUhr4Fdt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "36167b67e77eb5ea9110cfde927841a3033a52a3d235dac3aae6153c259d1019", -"confirmedHash": "24f9c918c22b1d7149aba315be289f9097be8ee0ad3944700500000000000000", -"service": "00000000000000000000ffff8b3b00a7", -"pubKeyOperator": "81fc5bd96b82e81bbba5e4f4fb24450cb8a101271114294a817e35b38091095962a4527e2ae53a06587a4e1b6bdd9511", -"votingAddress": "3QLowr7oJWA2jENgrFcEuUxKF5ry", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3632965d9959155d4b8f270d94140917d908cccef1b9aaab6b715a403c37558d", -"confirmedHash": "d4d6cabead7ddbfd03c09cb5d38f89bfe8fcc4be61b955d71c00000000000000", -"service": "00000000000000000000ffff52d315b4", -"pubKeyOperator": "008dfafcb95b4025b41ed94c02413d7c1e150f3031347fa1e6fa131c5823aa9cce2670a1cab2328be162b343225ce499", -"votingAddress": "6HwGddFgzPNUP2ci54PA7dxzkE1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "36454fb232c571e21e1ea7bdffadedbc3aa5be89e4c1c5cd09962db57b7f08a3", -"confirmedHash": "563d1e28448e78647e4f314fca555f8ba8194497c75265ab1500000000000000", -"service": "00000000000000000000ffff3625c7e5", -"pubKeyOperator": "07a0f318a396cb601aa225bc2a431e2a34486894b89d325ffb997d223f1a7b39d30c7599770c7a7986728307d3c6060c", -"votingAddress": "9FAUFmmnKsBNVYriSKvmyDjUN9C", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "366310125ba3f7faffff51376f7e5a472edc9ed38e7e8fca1cbccee62baaa70a", -"confirmedHash": "71758d4ef560db239292abc002e3d9e7be7d1a84d4259e093800000000000000", -"service": "00000000000000000000ffff2d4c02ad", -"pubKeyOperator": "008b37007fa9c5b63ff53cf4a0e04ca3d87c4973875778ff09c4c3293d6003f84e02c018dc6bd4a9453b65d3bcb78238", -"votingAddress": "DfDJRZHza17JY9DKk81WBSYmPar", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3674bbfbcedfb2f567ff4bee945dd19075a21043486199fd03515bfdc99ddb9f", -"confirmedHash": "3654d11d84dcc72154bff7a8b75b5912c4e70edd3aae35511a00000000000000", -"service": "00000000000000000000ffffc28753fe", -"pubKeyOperator": "9337bb13f2aabc53e50f054f4cc6abd7ba5923903eb47b49ff29ce6a1b90a917d172fd8e31b20f479b309cfaecd5f139", -"votingAddress": "48pxGc2Hx9q9DB4sfnr9D4u3241w", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "367657bff2d5959a70792d0ec15a94c0a570a809233f30399cf37c58c79351f5", -"confirmedHash": "cf149558a3ced2b29424b51c9fd5c8fc3506e96f0df7c3161900000000000000", -"service": "00000000000000000000ffff55d1f1ca", -"pubKeyOperator": "0933c9280553bdf898189d3dec95419262433defd4bef9e90611ffc05376e582fe41f57d4b0547852928da79171e29fa", -"votingAddress": "4Z8dHmu5S2y97gpWcjungfhC7aa9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "368d5dc2a3da2dea49b55dae546471445819b71d2c5f3e1017bbef00a4f1ccb0", -"confirmedHash": "c98b13a97b6da1a05e3eacedd67fda9660a49977eadd82df0300000000000000", -"service": "00000000000000000000ffff9b8a8ea5", -"pubKeyOperator": "09e10743a71fa17c1607bd84474d4ce2bed9a949fdec5f0e2cc99af82e12519282c969ec102328b04178308c5a435e68", -"votingAddress": "472FUW5HAhCVcDtvM9qsJNZ4EjbW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "36bef0a23c7b1e0a9feb6234684cd7d05ce3825e36fd6c48745e5db8001c2f9d", -"confirmedHash": "e34a62c185ae55604bd2271c06c2d47146c46224b7b770ec0a00000000000000", -"service": "00000000000000000000ffff87b50840", -"pubKeyOperator": "07e89830e79f4079d20fe14fc69c812b70bad81624b65b57e645910ccf6e56688e2a886bb3b73d6eae7e71f8b30ea9e1", -"votingAddress": "3GXGd7vREZvJxvuVrfznc1wGmfnN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "36debfe0f9efea81c85f9c4332fa191e3a551de6647b5108ad33ae814bb03bbb", -"confirmedHash": "33edb9326ec9af8fedaefe8710dc9e584fafec5b88cc7cc21200000000000000", -"service": "00000000000000000000ffffbc28a307", -"pubKeyOperator": "91842e9bb2c8fd2f75be0b4d5b1771af6adbdb016150bd50e11f67fcb411be2ec52a6c8ec2ce2bfd3f0de609733f0e5d", -"votingAddress": "2AEZ6jTqHz2nQ8gHbv5WfhetSU6c", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "36e32c4cfe8a469f8e0069fd22164554ee7ab8489e6cbadaf33b4e2161b4e690", -"confirmedHash": "2f610aa717d6b1fc4bfbd6c6a93b5a3bc268c8d5bb0b8bf10e00000000000000", -"service": "00000000000000000000ffffb0df8dad", -"pubKeyOperator": "8b174269baa3334401810d7638ec638351c8405c449424756d119f54b2014610073830c6353bc0170fb00a46e933ee17", -"votingAddress": "5gAYv1sA5cgRKTz7qKgnugD7FJH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "36ed871611bfa0299ef1418777be30c58a63d326b291c56bb530387743f5d0d6", -"confirmedHash": "9e459517cedc72f52ff94754c9ade0b231f85be5eb5beb241200000000000000", -"service": "00000000000000000000ffff8f6ebd30", -"pubKeyOperator": "0090963a2121a507bd1a886689e294494b66723a695816e00d65887f7055fb055fd0ba7379588c88fe3f42d92ce9144d", -"votingAddress": "4NmQNH4UU4EM84H6iJrpmLkjncXV", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "36f746007e69aa063b25d64ddfe397681061decf8039c470c87deba2690cf29a", -"confirmedHash": "c832a591b52c01ec485c4cb7f252d1ef28183d7a714a6ea60c00000000000000", -"service": "00000000000000000000ffffa5e3920a", -"pubKeyOperator": "93da55040cfb7c77bee5d4ff34d0f1bf70a2f3f24ec3463eb2f58206c06d672b6c6b3d5058f8ef7c753d4e3a87985abf", -"votingAddress": "j3uzRVuh5ELMrm7GuoMojuV9Rfy", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "36fccc2630a09bce9f649774617ab36321b41e689438be52ec3038aa42b644a3", -"confirmedHash": "6a4faf2eafb31d6c24f25b65b1fd87a65aa4425930866a901100000000000000", -"service": "00000000000000000000ffff2d4ced77", -"pubKeyOperator": "8bd2e7d42a1db3aea9dae339352051d9f174d5e5b6863eb1b2c3e32153ce09f1b12ba4136d733d1ff2410558cb1d330d", -"votingAddress": "22GKZVgSyFBgtvtF2qANknhSikvG", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3701c5abc2a9cd0e9bfaf697d469ce3c129b3e0a4a3acc03113983b872ad962b", -"confirmedHash": "13fce728126e6025dfa369e8747777534def53737b82c0c80b00000000000000", -"service": "00000000000000000000ffffb28057c2", -"pubKeyOperator": "0f7077767b2cab9e436dca9c6e9ad8b4d5c5aeb24c0278d48fc2f0bb111115d0e5f4a3bee6322268aee7eaa47ab0044f", -"votingAddress": "2hg8eREJRjaZVtee9v8AgGx8PZxa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "370d45c373c480d9fd77785792440ce6036e43ab256f98558d198f7c9845530c", -"confirmedHash": "f929398c44720715346f0b8e6047d93047e451107b6878451c00000000000000", -"service": "00000000000000000000ffff87b50fed", -"pubKeyOperator": "8783c2451d046a9cd43800d64232b82915519730c8773ebd845d96c688e576cb11d30227700a63231a0c3f78116c5bf3", -"votingAddress": "3AJgy5nMD5RmP9SppTMW65RksJdk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "37165252999edfeabf3110ff1c5d3dc51ce24516dde8b8940507a762f4461d64", -"confirmedHash": "aa08940ee0c8b88f456156c18bbc311ce17437f3a2f4828a1100000000000000", -"service": "00000000000000000000ffff2d20835a", -"pubKeyOperator": "07cabe11262d229cead36a97b894a864d22382ebf481b34aa6d1eb0553fa1f0a7e75a1543489ae8f839578058a8b28f9", -"votingAddress": "cu3VeMmgZp4NAy1oyoxuAJRUaDS", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3717b5c3632c8003d3f7be987535f1a64fda1c0a47d3610b1572a9e7cd2cd51e", -"confirmedHash": "473e7a4aa43d959619358cd90cce0827ef39ce6b985d1b4d1100000000000000", -"service": "00000000000000000000ffff4f621bf4", -"pubKeyOperator": "186826fece48f49313a34de368864a41b05cc07134e18ccdb488ebfe0e4c1c1ec527e129f4c438e88c4734e400c5ea03", -"votingAddress": "2uKpkvp6x6PhMuLJCN11GbdBqHms", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "372b32a407d6fc4a14b9d9d01c25d9c17a73c488f273c7e564b4a072a12c09e5", -"confirmedHash": "ca6c0d66e8a4593f09d57ac6f6eb5982818617083e1b95221e00000000000000", -"service": "00000000000000000000ffff2d2094b8", -"pubKeyOperator": "84bbcb6b0663c6242f2ffd12247bb41994c1a1aa901d73197ef9339cb84d92c57a70e97310e0b9d6fd75937c99b627a6", -"votingAddress": "42vdqw6YFQx5vVLedamrmJPgkjbp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "37500f05660d0f1369de82ebbb504d069d774f213749cae24c1d30c5f9280a8d", -"confirmedHash": "260168708e6144224580403829f1475ae1c60d9b6c0c39991500000000000000", -"service": "00000000000000000000ffffd420f0e8", -"pubKeyOperator": "873f7d0659e3a13db11c2e3f487675685c8c3e76ba74d84afb3fdbb2eb1c96829f94220e886602acf6e3846d327d5343", -"votingAddress": "334cMXbx8waFXynzMaDvQ9FdNLrK", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "375289644ae6af657c6fbd1e28d9b96e8dbf178e75eae274481671ec8ef27d48", -"confirmedHash": "834e9e6b307d52f98b459467939ced7f3f97c8effc114bdc3b00000000000000", -"service": "00000000000000000000ffffd4186ea3", -"pubKeyOperator": "8eef990620fbf5fe968295f41458cb68fcb6bc354988af6d58f73884a92fcd32c8e78a84b57d235d62153bc5f43594fe", -"votingAddress": "7ryhbDMMrTsEAtweKqpfH9wiCG2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "37558d5ddaab688041ca326c61fd3f5d8cc3e03437bbc29483a93cf82b21256e", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0c9", -"pubKeyOperator": "86a80a008fbfe8467a3c898b5886ec5fd874e0b9355a63774f29e72bc5e15bab25fbdc1b4a71f2360d712198d30aeb4e", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "376f36c233cc7fb330ae73d46a661c39b2342c36ff4d6bace593058ad772dfb4", -"confirmedHash": "d257815db496ef0641eadc83297598ee298a5711365f6fc01a00000000000000", -"service": "00000000000000000000ffff55d1f227", -"pubKeyOperator": "14f950f3cea6f2cfbb8b701607e7ce3cc60df79be9bffae68af2bd3885443287a846da0247a7bf74f5840ac95b7bd9e9", -"votingAddress": "2BFsp8uEWYwUDLLhM6zy2jfLeCm2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "377e6246356ad6b35a533dc94ac5fc7caf2ddefa91b7431421a34c82305ad2ad", -"confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", -"service": "00000000000000000000ffff92b9af9a", -"pubKeyOperator": "94ad6780fad71ac61ec7cff84cf68ca7be50bf5531175a4bbf1e6e9ae501ed747ea5c7868042d653e482b3999d3b4f27", -"votingAddress": "iBms6KCaYTzMvMbtEehfKdvigbd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3791dc79bed603c8f8da835f24ae9b10cc51c317590f273892406e7db831fb45", -"confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", -"service": "00000000000000000000ffff453d6bd4", -"pubKeyOperator": "044865e19ca6e71089f1801e4605eb509581bcd6f051d03ee03872826652c2c803693d27399bf84f1e16ffb3aee09d94", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3798aa3ed00d8af061a817795b59ff06ec31935459c019022b0e4bca2cb87403", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688ea11", -"pubKeyOperator": "85fdb9112302997e108897f004b8f423437f912964f6fde0f6ed891a6fb90acb57fbbe048adf1d1a47b13f3c4a5c8536", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "37a1020340494d2e0a791c8ff5b3a20c20ed373a9e923e803cadcdea74fff1b0", -"confirmedHash": "9c99f5aa3fedc7e0812d6a7bf8f2a9a4e8f12d20b8a7b4900d00000000000000", -"service": "00000000000000000000ffffc6c761df", -"pubKeyOperator": "13576ac8c1f35b8d0f89fd3b20f9c72879f465911919aa4eb1ec5d858954f28dfd4d4f40af852c57454e6e9900a4f778", -"votingAddress": "2MCe9r8bsusWX7RiUraUjpP5pmX4", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "37a46fdfbe451565cbffc597e9d51f57638a8fda3335ef9174a276ff86b2e915", -"confirmedHash": "123c178a777beb3e3c812443d07be17a42deeb7b9e27a2090800000000000000", -"service": "00000000000000000000ffffa8775786", -"pubKeyOperator": "05610de73f6b4ade43ba892997acf90950063e40e3aef7d0c0ea7b5d325a830e3273a88071190b1e325b1af47bdd8f57", -"votingAddress": "4T9pfuLBShVhjXTLz8vopmMiiczv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "37aa5d0a4fd0c1966cd37601631c33fc6e59e37fa50745916c043d929e38a870", -"confirmedHash": "37a7e2c6169ec49b43f544fa4e9c0b845a3399abe13f4db61800000000000000", -"service": "00000000000000000000ffff80c72a63", -"pubKeyOperator": "9433046a63f602c228e38397782875c2ff342b0ee9eab23f0b93fe794463191518fae65cbc9cb1330f043e0004ca16ab", -"votingAddress": "wX4ySTPbCBSBxLhmgpK7rEJ9Dc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "37b357e320872eff5d94d387c7109795875a971653dd97a15f163d66f3912a8c", -"confirmedHash": "d56fa840a23ec20122b1c62bea934e5c6de1e8d69a8556281000000000000000", -"service": "00000000000000000000ffff03e27526", -"pubKeyOperator": "0d5ab7879f6c53f8dd9e91987395d48e308f92bc35b66b2253ceb0bfcac73e58721308597c0d61f605a6ad55b5512979", -"votingAddress": "4MLKgomaxcHts4rw9w3gPCtZ2Abg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "37c8ab6fb1d6ba6a8e32b7dcde3ac3a73375195dcbc44ed3da50b435d23d63a1", -"confirmedHash": "2f9fa4fc4687282cdc023305e9a37c66e54bcb80d80150a40c00000000000000", -"service": "00000000000000000000ffff951c7066", -"pubKeyOperator": "0700e6d4e2a8c05e65ed1d1342bfa32a483e3303d9d6bac8a089db4fa5bd06e87c23c4346389145a0c85d34546673261", -"votingAddress": "Q56YrJKAzuRnDeruXkQ8pkVnYBF", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "37c96efc20bee7ccecfc4a33d06290aa7c20411f930563c5cad666de778ec341", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b019", -"pubKeyOperator": "93d82f1b54c7f375f2017da5e0b2c95851a3d60fdf0b7f72852f7cf25d5ed9b7a248055c622bfde0c5c32b42d802aa03", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "37cbd812dada1897447c0a11f27e3dbdf81161e80b593a9dd1e2a5f2f2efb882", -"confirmedHash": "9f5b4fb62448e008e63ef94e9fea57ac59bd584cbb7fe2581900000000000000", -"service": "00000000000000000000ffff5102fc13", -"pubKeyOperator": "8f7cb7f065f202adeb0a0528e24f836d29a2382aed692ad9dccc352d9ffc683c9cde0b251e521b52b4f3ddc08c5ce34b", -"votingAddress": "Zgf8zVenfq1iGouCnngtJ5VxLU3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "37d967ddf4270650d5430bd184ce71461ee7ac461756fd9ecbcd6287e3adb837", -"confirmedHash": "9d06a09d654a2b8c9288b3b80aa6d4c2203a1580147b24fd1b00000000000000", -"service": "00000000000000000000ffff5fd8542b", -"pubKeyOperator": "9479533493363fcee7c3cccc0ad3fcf7808f100935f1b122cf2e8bf12a2bfb75efb7910539230a716f2a1a00ab2f5888", -"votingAddress": "AFBnf8qo8nBPCTSKMtWB3rmqCJb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "37e4cdba03024a51e2ca94fabedb8e24bab17363a5207162116d12144ec6ef71", -"confirmedHash": "5dbe929ea5aafdaac78c1cc778b3ab725bd92f2c4510d3090c00000000000000", -"service": "00000000000000000000ffffa8eb55b9", -"pubKeyOperator": "0ce9ee0275ff80d2fd1e44c387ddfa1c07b9c8f7863fb59782020abb35f40468fc59270afeee85000a2c0b2fa9f5d11b", -"votingAddress": "39CXJwTeZGMheYRAKuDCJB62BXp", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "37e7ab08021d3cd900e74b77f3f543c1c806b6a98f7010aaa14ff5f5d420a5bc", -"confirmedHash": "6266fe2e2b621e0cb4b997f2c50dd9fbe859e44d509770b50c00000000000000", -"service": "00000000000000000000ffff2d206a21", -"pubKeyOperator": "18f1aa2eae57eaeb498d0023b59dfbc25ff1fe27b39a4dfb8b819234433c9449713bb4ff48d4562720484c960a9e8abd", -"votingAddress": "4YgwAqsq5pqTcUH6vrBnrmSBWPyV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "37e8cd0289deed8338168872a5c9ce3511080ca7debadbd91ff8d3f332b31e82", -"confirmedHash": "42d3424fda9caf91ab59f404e82ebbe3180aafb239cc4c380700000000000000", -"service": "00000000000000000000ffff67a05fdb", -"pubKeyOperator": "9568d0e92c50e6071312d8b415fdb2d53113cf17820ccf91d7c6cb181061ba461ddac2af6ada58d7fa27454c90101879", -"votingAddress": "2xHAor5JWWTn9MUjLFkCnsuzFCQy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "37f2461152ed1509063683d1dbeaae9028dd1b6918e6327f2f161c5fb52dcef5", -"confirmedHash": "54280dca43a70dbbfd2ad17bfd4ad3f97a20887a27af7bfa3200000000000000", -"service": "00000000000000000000ffff5eb0eecb", -"pubKeyOperator": "99d2c6dc526bb7bca548c8cab821c5071e671030146deccf2c3db59252791f5d0df8ff3c49d0679811c8730f83efeb07", -"votingAddress": "3Xd2q5kRg6MsfR2LMz3UP2CYmNBL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "38158bfdf914866d526ebc6784e9f11f64c452185a79bab98b177e2f00380b08", -"confirmedHash": "4db5b3aafc6e597aadbb5e13559fcf29f3e03f3e79374ff50600000000000000", -"service": "00000000000000000000ffffcf94779b", -"pubKeyOperator": "14b568d3c0441cec9907bc9612fcef99108470e99c901f8f04051aca12ebc2a08596b7561d83154f6fe582794c284fb2", -"votingAddress": "uZ19AmNZWnS1F3hVV7SrgYdyrpr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3816b3543f2d6c4d99f133737876a018dff7ff80817bc0bc1a279ea6725ca539", -"confirmedHash": "cfe210da8d7c3a5801390e79cc2f54382d291b89b5e8a32e1300000000000000", -"service": "00000000000000000000ffffbc28b98f", -"pubKeyOperator": "83be8c255835d66ec58fadfac3a6cabd4c400973650e46d0d0c4434788b63f4c1ef74db64605699191e440c76001c1e1", -"votingAddress": "LzGT17ne8ggBZaaLrxMXCkfvJSo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "381f0d1a164122a918c48a6828f212ee8cb80399a2f7c33aff223c572b337a4d", -"confirmedHash": "562d29d7abeaa6f6649e7c9d60b4d31bbb684e08c26560912e00000000000000", -"service": "00000000000000000000ffff52d31976", -"pubKeyOperator": "83d5898507d546e0ce42770a89a5f7c10029db95bbf0c6bd1d6124d356c4dc15f0cae993fd4684a1584a997a411f6ad6", -"votingAddress": "3m5Je7LWgHWhfK49kwAoV7UdLyJt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "382075f3159a82efda6729fd6d1d7fe3fd0cbc9ee7d147faaf37b0002d65f334", -"confirmedHash": "d802766deb5089199741561bf44297fadbf713524a6de7590800000000000000", -"service": "00000000000000000000ffffbc28b484", -"pubKeyOperator": "1999fca81b0b7d831db434b9ecab31a7f0dfab37050af79d8aa93464e1a3f6946bf0c4f36a0dbd506d6ae65036741c3d", -"votingAddress": "E5gG1HjasmFthz3YerWeN2EzbUn", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "383c722576bc7b8cabc96aa3d8acf4f39bf9e69deed554f9ff960fe1af45413f", -"confirmedHash": "037507fc2f0d55d042d2253867c88b97eb8b8bd4b7fb07ba0700000000000000", -"service": "00000000000000000000ffff40e3138f", -"pubKeyOperator": "913b88c887ba8281d2f47f80521c67cde1e76df12601336dd3d8b3a06d0e4a9fd683e279f1838b2d3853000524f188c2", -"votingAddress": "213zYgs3c1iP9KBFyRM4NpXhM8kW", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "383cd2e1319b4d99ee7863852263a97e3fe8ec3747c465af8d07d3256358c0d0", -"confirmedHash": "c14af2a10a903726fed1cd86f38cd660334bf6bbfdbb199c4700000000000000", -"service": "00000000000000000000ffff55d1f150", -"pubKeyOperator": "0ac64b2c70fa1a37615aee3b3d312b7ce79991cc80e16d9d203d5cb041221dc4e9d9af5591ac2e06f07ccf6a6d4079ae", -"votingAddress": "Zt4GtiS2rLs39KBYHM5oUGrNeNQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "384b748db5eda69dd923fa601bdb592963d32bad9ff7ab407326a34a0f1a7248", -"confirmedHash": "4447ac1bfb418e44b1f0614a0af6b1902994317a452ffa920700000000000000", -"service": "00000000000000000000ffff80c73b7c", -"pubKeyOperator": "115ddf9be9c29e718bb165b595b1662b32a64df6c2846c273e774357872bb2c61eed226ed160409762778b58def524ee", -"votingAddress": "3jfW589NaBDrqy9yRkda1mcepxBe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "38570f54b36e8b4d5649054be31b62875c0c26a23417b72f3e467f602f70800a", -"confirmedHash": "f52c681728e1bd0df02403be017466731a92ea52f0e1589b1200000000000000", -"service": "00000000000000000000ffff8b3b1d27", -"pubKeyOperator": "0c62a241647ffe7be4203e45588854e294994166538bb97b4a6b856c33996a81c3cb91e70ffb57418ece7e1c1ab91b93", -"votingAddress": "2F4Wdi81ap3UPdeiEbYgkuKk2Pi9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "385e7be8dc85dc20e6051fef517fe65cd79aec46d2489383c43341110a5df3ec", -"confirmedHash": "2d5d2cdf0f1e52003af966b536eb2ceee73565fb5ffc748d0900000000000000", -"service": "00000000000000000000ffffa2373604", -"pubKeyOperator": "101a0f616d0848dabfe12d5694ca420232a64def35a08782d17218fa263d9415f5f2bd8b5e2fc2ec1f4627cded81ef1f", -"votingAddress": "4ST6PNZMPoR5wiEL6N4brqHdfNDK", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "38832ab77a5136787be5f1adf4672a3c6aa3f41ba3eb6312cfb542d2060cf713", -"confirmedHash": "ca155287a92b44a951d16aa6e598e05c4051a48b9cb284081100000000000000", -"service": "00000000000000000000ffffb905349b", -"pubKeyOperator": "137dc44b89a3f0e4ddc6918482488e19563e50aed91427d716f629a7c384487a476c9253077169cfa1e3334f8293d27f", -"votingAddress": "3np3hvz4umPa1iGzfTwFVft9abKb", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "389562a601b4281d2923213f00cccaa539e035cfdbb3aed0a20cfbbf5313389a", -"confirmedHash": "ee7c8539df0c9d98ee95d7eff7b364ee1935f9c9e16bbf7d0c00000000000000", -"service": "00000000000000000000ffff2d20cf69", -"pubKeyOperator": "8f0cff595f55e28f126900c6f02fce90e6c1aeb96296967975cf836a09a63022acf488c3f688a26697fca531afae252e", -"votingAddress": "4Tj5x6AKsJv9PctLGtLFXMvud8xk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "38a28945909dcde396d94dc513c2000620c33a22b83324b3d7f61522ef69006c", -"confirmedHash": "970dd37ccec228dff3134a8937c55ce3d6865aa39d22f7d10f00000000000000", -"service": "00000000000000000000ffffb90537bf", -"pubKeyOperator": "9695958cbef0a37619497480fdc235d74c9b8dc8408a686ecc9ef310ad0a5572a41a6b3731db34b74541727dd54094bb", -"votingAddress": "3No96rKS9y9VpRvjmXWPzaof3afr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "38ab2892419be545ea5070e11be3205ed0eb89deed44e3eb408bf84b7c494a54", -"confirmedHash": "cfe210da8d7c3a5801390e79cc2f54382d291b89b5e8a32e1300000000000000", -"service": "00000000000000000000ffffbc28be2b", -"pubKeyOperator": "8903dabc4479bb21338a1911214830ac243924bc36768408e904b271c1edb9c09b610dee78f611672ed4c29043870d92", -"votingAddress": "2119hFnggDnxrmavXuMe45zhaaRs", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "38b6484ef3f14499ca2b8e8d2b216f21be6f467396e3924ced60755ad7329b21", -"confirmedHash": "4da6bbdfec861cef8a449a4af66e09753b2dc69ccd49fd4d0700000000000000", -"service": "00000000000000000000ffffa7478c1a", -"pubKeyOperator": "158ba09f8c28c1cde3122a82ad0262cf3e6855b7258a4a032a18fa3ad5dc64095badd801f8b5c1d4c044b45de05791ee", -"votingAddress": "4ZiwZhuQmviFq6jRch8UtDvGwMHU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "38d838432fb80a899c6697555a6fefc615a28667d3eb251c0b46c8b94e8d20f6", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d59a0b", -"pubKeyOperator": "10a9a686c2d9203901d3146932ebb3a170f81b09562bf57c4ee7e6e91e6d64912c9bbcce03f0fd739b6c9b2bbf5a2169", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "38d9a8e0027c2a24e80881802dc530db90af37bb44e316440b5680bb7c28a0d0", -"confirmedHash": "7b0b01497bb3943e3ecada5060932d0a0cce6546346c9db01900000000000000", -"service": "00000000000000000000ffff87b5349f", -"pubKeyOperator": "08b10c128667ddb112aef836a07fd5f6decf7c05561e5b7b049ff7c348c1ee124a7c9462ee00c074e8923a135fc020d2", -"votingAddress": "3PzHFPgnPpcvDsiVSwkYxT9ar9vj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "38e65410afadf893c4ca3a111de4b39901c97a65d436293b84d10d089b93f608", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d52c2c", -"pubKeyOperator": "1140e36593dcc105308430b58379cae0b97bbe44ef99f1b702ad9dece81c7b3f27e2b2e4e0867c2180d98832a2ab5a12", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "38ef03d91573d2305e5f36b496785c03ce5128ab9d31f95d25f1306c7cbec0a9", -"confirmedHash": "725f11f42a44255a1125c09eacaa9f592c4dbbaf2f72f5830400000000000000", -"service": "00000000000000000000ffff33591e5f", -"pubKeyOperator": "0c44ef33651ac05c4d3824028669e9822799a77e72f73c91604921e0bbef288e4e9f363bf81ee9cf6def2c570a795d21", -"votingAddress": "2xKL8bnubRs6vim3pLMZVmUS4god", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "38f6b3061deb32adb99f1d82b197e479b1c4aa9d2a8adf3297ce81f710e559c1", -"confirmedHash": "a5e98caaf2e81ac53026a628c758f8ea04679a809057af8e0a00000000000000", -"service": "00000000000000000000ffff9b8ae97c", -"pubKeyOperator": "8485305628c718566b0efa89dcf861b8bd786d4ff43a9261059899e1f131ca77ef998978ed0912b57676c488d0af75e1", -"votingAddress": "75PcXnYmKypMN5zqgKtcbrexotW", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "390c6f8c78f1b10f63062edf565b3cbde64160c02a1bb38ec6ea969e32c06526", -"confirmedHash": "80e3f386c4d0a873584dc60537f4c3c35daef139c313c4ca1400000000000000", -"service": "00000000000000000000ffff9d5aaa6a", -"pubKeyOperator": "91c6f626afbe62a70e7fd82348929678a043fa38fe6755ae93a33103976147142d09e2f15a8ccdf872b96e7b375568a9", -"votingAddress": "2YYSQMkt6cghyZGLps6afVyHFAiA", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "39162b9c48bf74bc9bd05af60de949760fc2dd1dccdce4cdd811153d9bccf071", -"confirmedHash": "d8d68860408766ae9e44f8b5069170f6db2e25702bd489a33000000000000000", -"service": "00000000000000000000ffffc0f1e7bd", -"pubKeyOperator": "0d90b0f80f7cc0616b52b6d5d2c234a65604670be7ce1999f8b05bed981eecf7117b8b7e82592486ecd99ad34628686e", -"votingAddress": "4LVd7pBx4aF73msBCiHiDZnGaHP", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "394dfed61442d803b63fb59da628a75521bf10736e031e69d6d6211ce02e86c2", -"confirmedHash": "a60d3ab71c1c8502209c70a62da5a320370c3c1759cfdf110700000000000000", -"service": "00000000000000000000ffff4f621fda", -"pubKeyOperator": "8a230be692b80a33aab4ace9ea1b2e0487890badd9dc4003d3df452cbfce9a472c9a98c49e069b43e0392832a17596a0", -"votingAddress": "bq3iJDvj22t4cbzr8m8AQmXUErX", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3956be9edb2420afbf2e33f6a281114d1d15c7e91553f87ec527ceb007f267f5", -"confirmedHash": "13a1b473a244a2e0464eeaa38ce95ebb758a928c002aa9332b00000000000000", -"service": "00000000000000000000ffff6deb458b", -"pubKeyOperator": "116eebf165e1ec36c828437bea04152c1875deca27f0af2e81cce25d178b7d523f29545875cfaadbf768853385d07639", -"votingAddress": "4SdK17EVHJ8vdHtCMeX4F7sNtpLH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "39a474f95ec34722f8592eb582c8d5a990f4d582f3e43c7cd50b19f36f8b69cb", -"confirmedHash": "31d3ac995a2ae9339108d53819c1683536ffc26da589e7e93000000000000000", -"service": "00000000000000000000ffff55d1f11b", -"pubKeyOperator": "19fa0b04474cee29e8e845a8a83db65afac0b7d0de97a2efe0dc910b5f9c0fdd6ed483eda1a4b72ce6c92c9a89d8d849", -"votingAddress": "SRuFqy9kVKuz4rHEiw4JGcNpHK9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "39b16b6a5bfca0b940062290da89ce63b169f34f792f0503891e115a1da92e18", -"confirmedHash": "75eaa44d97f10f493b1af7a2b36eb48563601c1e0aae79621f00000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "3VadYCa6A53U5DyYAXAS86rppLSP", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "39b30e8a21b9cf68d6a9ccae910cde9361bdf5b9bc0baa76e2a9fc2e7edd5e8e", -"confirmedHash": "b5d9a6fe126e4cbd806688bd744721b041572b28d71895191000000000000000", -"service": "00000000000000000000ffffbc28f178", -"pubKeyOperator": "02fce0055e7809d2a23f9533d5966f23306582ec8e845467ab2b51a0c4d1ad023d1fac365b5f672a267b5d797176dc67", -"votingAddress": "277gmZs1H8CC3YBER3m5aBoiGdRL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "39bace8f9742816feb277ef747b97b5afcd8ab68bfbe42c018568bbeace4279c", -"confirmedHash": "201f45c23ff6132d799a2cfac57b97b1f9d0068cf87e19c61300000000000000", -"service": "00000000000000000000ffff2e651a1a", -"pubKeyOperator": "812b8f074c269a55730852964448dfd380908d5b2cf21051b6be96869ff98d0ffee50a6835f116520840e6a06e75f6d4", -"votingAddress": "2iTtcGhKbfcJBYqG6Q4rqpkMswmp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "39bc6315d3b7b17410e05cee799943ba8ba31ee7b05ae3e78b29126d950b1ee3", -"confirmedHash": "9a78f25de1aa064251c64080334698f87d6d7b87a618cee41500000000000000", -"service": "00000000000000000000ffff5fd87e21", -"pubKeyOperator": "08248896f11e4d6cefc7d13e714f66d5b58c33e53348c71462fa2519419fb12f2f806eb3ebeb950482b7eae9e9caaa4f", -"votingAddress": "2JSUfnMbWEijwaJyrDomfToJxux3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "39bdc9d32d600d55cfdf1e86bb82b746e17def9393678e7cdbd744d2ad52d45d", -"confirmedHash": "00787909c9b5eba48f1473f57bd3114b2b1262a7ac3e74831f00000000000000", -"service": "00000000000000000000ffff55d1f17a", -"pubKeyOperator": "91024e6f76d6e4f249b9a845739c55857dc2f2e31e188d1298273aab86b6e8fa280ef08d62119ae2e21724ba9fcdca18", -"votingAddress": "jouUnjpB4Eow6S25ZH8D9tFcsXL", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "39dc316d08009d6a89c0edc2ce9c94d2174fab20e7555ebf6ecd47ca32355ad0", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0d0", -"pubKeyOperator": "966b287fc9e1872ee6275789adcc58142eaaa6e81cac7603f03377c192b7a550088e2540f24595dbff547503ab025095", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "39e154d9ff095cc8b3f59b2fc83c3fde39dd12c977df4c1e88c8e6d99da5401c", -"confirmedHash": "b87fb87fe9266eda6da7869c72bdab91c35d15d04d186fde1100000000000000", -"service": "00000000000000000000ffffb23febc3", -"pubKeyOperator": "0cbf371e765389b10d32aed7273f9339feccacb0e0b496d83a68fcf794c935913eb9654bae8269ab44fe497859c81f21", -"votingAddress": "2WfiaSHZ7Lx64744t2AJ8DHuRiEJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "39e27a375df9aff0a0ef46206c8ebf7822206672d375e8e6de60dee044654f30", -"confirmedHash": "87a8bc7d8e26c3ec42e5405811af1d93ca3474f4712303452400000000000000", -"service": "00000000000000000000ffffd4186d11", -"pubKeyOperator": "907f4c7b05da845889f4a6dbe33dcf2368f802c38b53c88a570b445c70a6f8b220816d2c5d70b7c240e49532bac3e4c0", -"votingAddress": "3JrfTJAmbHyomysMVrPuhmmLob7a", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "39efffc3e6b9eb4025e339348699c5ddb548420a5024e95d251488cb1112328c", -"confirmedHash": "da43ae173edaf99fef186791004da1d26b4f0d169bb15b771300000000000000", -"service": "00000000000000000000ffff55d1f1d2", -"pubKeyOperator": "064c9a15bdb907619319bfc2b6799c59071de3fbc44b79a2a5223e58ad3a4c4cacfe2924daf8ab884d88e98f130fed08", -"votingAddress": "237jUEqQ8F6WRHVZWYYdSMukd43r", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "39f7a132605c9a655f6d403755343885267c4ec7314788de20243a2fe30ff327", -"confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", -"service": "00000000000000000000ffff74cbeb84", -"pubKeyOperator": "8f75ee28da1d7001ca5ecfe8ccfade6968bf22ff18180b99c9a9984e68d0e03ec92cf1b0d0a9fc93584023bd01def800", -"votingAddress": "43ai3ssuZ9h9RGZnVJUvFVJ2CcpF", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3a1b62fac690b639bbc77b79b3a7f4bc6522afaf8b737627874d9572f970f3ca", -"confirmedHash": "60c0a7a5b23a62959cf70058577b1c220ef873fb1bf00c282a00000000000000", -"service": "00000000000000000000ffff1f9463f2", -"pubKeyOperator": "068622696e97ebbfbb14f8e644d160084865bddbe0aeaeb70cd7e834e46de57aaf2c2fcf1ce56f8bbf502456df6423ae", -"votingAddress": "46Dknuap1h3rnQxQz9urcgKBwqCA", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "3a1b9380032eaf9b9691d85ad453c5dcda93c78dbb9f3d6e2ea6cedc6548c0b8", -"confirmedHash": "0d6ff825887ecdd03bd039ee1a3ecd4b25f9e55e0d33b4361600000000000000", -"service": "00000000000000000000ffff9f411149", -"pubKeyOperator": "0f0eb755c6e3bd61943bdc8042d3f7bf8cd484ba2133b14c60c414d6d903c09bf1382899bac306281f190f3ecae9623b", -"votingAddress": "3pfsqkQrqhZxDYXNYxbpDVaSdtJo", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "3a426597ce88c223a59da68e102b27bbce9c0ffdfe46c814802bec8fd7920fcc", -"confirmedHash": "af6fa2334cd1c207fe01cf95fd34e8bcf64694d7b1a219470700000000000000", -"service": "00000000000000000000ffff422a222b", -"pubKeyOperator": "8ace0a17031c204156d87703b572a71625d6d56d2df4bfb31a74851d3d24de9a30391021a85e8283681c678048fffcc8", -"votingAddress": "3v6pXEUZJ7YmSSemY9aEGPKPjTis", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3a5c586c0fdff96063c0e2078dccd0f03960a1ccab8aa6a42417660f309d82f8", -"confirmedHash": "c1ec7a2720821ab6952c9785b30cc79a8c2df7cd52d490901700000000000000", -"service": "00000000000000000000ffff453d6be7", -"pubKeyOperator": "08fcd86f63506de6087315e04d685d32cd2ec79e79fc4194702dadbb9cf3efa1d8069b3e10ed44280355443f02ac7fb4", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3a666edc89a0eaa17f4782ce1b5be5bd880029ec489a68d75eb658e23e176bf2", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0de", -"pubKeyOperator": "138f9dc559700133ca1203b3083f139c36365d9e6dc638718ae578ce934c9e8684d43c83af1bb5eb056fbac179bc53e4", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3a68593e81537601d2abf0d6bb4f06c8eccf9fa7f4c201d15e9152e4e1bdf091", -"confirmedHash": "a29c7d55d3babd727396fc7521a3f76e984efca6cc3527c81c00000000000000", -"service": "00000000000000000000ffffc11d3940", -"pubKeyOperator": "05e2e0ff4488026ff18e1700c8378f50e4b84b9222ee46d0898ba7debe7da7121f98edca635bd167345e7904ee08330c", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3a68945a9873025818c8b916ef4b63bf0ad1fa97acbe3518fa8e5190808fe689", -"confirmedHash": "2a0465522ca98da7b298dd208cd3a7ad16becf7641f9e8c21200000000000000", -"service": "00000000000000000000ffffd4186078", -"pubKeyOperator": "19519254e4f572bdaf5bcb23f2d6c10ef0e592ede20b58b5bcb9227e07f2bb4a24c5f4ed3dfd398c95138aa0cdc12797", -"votingAddress": "2qE3abY8pB3ZwymG1jWFCP8jEuuM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3a6fdbab2410fd69df6fca04a397e5d312d7a55fe1f89e7c27b5ea9438e8da69", -"confirmedHash": "82798e5115aec2e59026b59db34305a63fb933a8ea04a22d0500000000000000", -"service": "00000000000000000000ffffadf917a1", -"pubKeyOperator": "8b58f9e617257fcab3930ac16fd3192169877a8e3198406a7c6bd338af63b26056c6e7689049f128c668d47f349fa610", -"votingAddress": "48YgPF87pLM8faWpZzheH77AUt6G", -"isValid": true, -"updateHeight": 1760256, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3a75e3044745c925cdecba9813d31def30e1d20811adfcdf726df0e2ad544d44", -"confirmedHash": "9f5b4fb62448e008e63ef94e9fea57ac59bd584cbb7fe2581900000000000000", -"service": "00000000000000000000ffffc6c77732", -"pubKeyOperator": "19ad7e616e60e6c5d21ebcb4aa5e26b265b74fc529d8cbfb58e8e0c2043df3102461c2eab5864a3317c8a7e19778cd35", -"votingAddress": "hLHBoUammDSdG32zfgbQWDQg6t9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3a88a8fe4aacd3a71b641213b6191ec20fa5563f0b12406a0962d501334700a5", -"confirmedHash": "5886572fe2497cbb14272f32c0ad54197842320f9b027c231f00000000000000", -"service": "00000000000000000000ffff4581506c", -"pubKeyOperator": "8a34b76006315608331e5c163acba719f916776a79a097d04766ad53f0e90792745c4032463102ed619b9eb5e3bf8d98", -"votingAddress": "EtkgXE8jpvfad9CKGhbYVzfByuD", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3a943d6bbe29c1d0e32e3ef885016981ea87ca04b90021d3ea977bc7fc8de355", -"confirmedHash": "f142219d724bdfab00024f3cbed54a68a5d2e022ccb528120500000000000000", -"service": "00000000000000000000ffffd41867a7", -"pubKeyOperator": "13b1d080ed0e48dfa304fd03e8b3cf6e4308aff94577b965493bc4f89285046d9e94e1ec981e0ea68fc4f1bd09a2945f", -"votingAddress": "3MsdCMsBjNq4cmEFbg8GdT3YWmQQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3a95f4d00f7747f67cf0754032546bd32665c7d738a7d4ef37a9f5f58940627e", -"confirmedHash": "b9e9efa20b0b195d420b99a4c9b78362efad266cd73a86810f00000000000000", -"service": "00000000000000000000ffff5fd97d69", -"pubKeyOperator": "06f100f6b16e642c29c16c28217cdb08bd34e6ece955486b87b4c34f51eda2c3f46d2b9691fb415a22e518eb842181f6", -"votingAddress": "4GN32AVhCZSeF6Pk5EZZP3Ke3fS8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3a96677e5cb230a15c1458158be3f911013cbe615a12c7417954fb237caf8846", -"confirmedHash": "0e2dfa280149a2a32652a9d82e93fad32c38ec8bb1f4a6b11b00000000000000", -"service": "00000000000000000000ffffb945348a", -"pubKeyOperator": "16288965b8b7e3227b5cf49dc1b1e51f11895f178d1bea390bfecfbdaaff35885f8a77e59609ffd13a506e3839da9391", -"votingAddress": "LzoJ5D3V7H9MDnyZJudyw9iSUft", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3aa54475d394681702cee3ca21674665449dc486056a3075fdabaa2957cf364b", -"confirmedHash": "713585b2193c4700656910eac0e0ba089a24821588fbd9d61700000000000000", -"service": "00000000000000000000ffff2d56a39b", -"pubKeyOperator": "141841a1557abcd30d6cf3d05e018e1107dcfdceb5227cc61029ae2c2596db15c08c7ef04ac569ea828b79f4dc63d442", -"votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3aa91ab296db1f04c008082fa5dd252d5673ebb91169ee0579af350852f25b11", -"confirmedHash": "ae49e9a106372f47703242398810be425290c6d627814a5c2200000000000000", -"service": "00000000000000000000ffff3449acda", -"pubKeyOperator": "97c5e67ed061038f9fbcb94035b4b868f682dc8e54703317e29cd310cc0cfbee500909d66dffe8fb1ee7af15774453e6", -"votingAddress": "4PA724wiPRyYVQWHXuEeZT6UfQVq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3aab7dae217feab0e80a67ce1dcc650b2f4ac0f1a240543f12901a9680beab96", -"confirmedHash": "9749bb7922d7f062720b42704ce0758275c7d0c77c22ddbd0000000000000000", -"service": "00000000000000000000ffff87b5348c", -"pubKeyOperator": "0ed16955a9eb5bed4548606230af5a5b18c5a363c2416b965bc0492d0c7057f99bd846e52be9b82715954a015303923d", -"votingAddress": "3vsFDg5P48sJRtPM8pfRtjWZrogp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3abbbb5d427f55830c2927255c3d4b25dcdcfb84217715db75286e63b0625c11", -"confirmedHash": "cb50b860aa7f10aab02fb0c1fdcb69af3fbd4c41f4c842580300000000000000", -"service": "00000000000000000000ffffbc28be2e", -"pubKeyOperator": "84c187ddb753d37409a9d11475cb7a6e80e2628ceb3d4ac29864851a402b13c69c647e86df5a14a457769c1c028d630b", -"votingAddress": "DmAf46GJddY3pimRTfHPicdjLb9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3abd7c735401e43d9e9a0ad40ef420225ca984caa98f96f375d141cf82fb2d69", -"confirmedHash": "6821a4b4231f907b3d34f38bc3018d056bf60dab6f110c141800000000000000", -"service": "00000000000000000000ffffa8775313", -"pubKeyOperator": "07953996505b6b9a0abc839585f3a467f1fc4de30e39db193744c66f43d2edaac8d04509c88c2b20a831645f46e0b7c7", -"votingAddress": "2EcYbswQ4XDmhofUcH2v7BEEafwj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3ac593115c4ff78432241258df02b146f3bc9bc87c5a16b1815051a8d01b14f0", -"confirmedHash": "5d2aef7e8adfea5ecf416a03b38260bf0b686a4470bee5e12300000000000000", -"service": "00000000000000000000ffff52d31958", -"pubKeyOperator": "0c08500f384056485306bc8ff98a26ede2d20248ea1f7ccbd3ddc8b29a0e46a8fcda6a02d7a12b6ae94207a441411477", -"votingAddress": "CsPtaifnN4CLfMZ6hkyYAdW9mxS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3b18f41bada2f23dd0666328c8ea5759022888232da785d3979fcf80f9d00ab4", -"confirmedHash": "9e18b4c3fd7248643d3f9c74594090fede326d084b9b55e40800000000000000", -"service": "00000000000000000000ffff341a8748", -"pubKeyOperator": "01d10492093eb50a085af1eafbe60bcd97d626ec6a6eab0b09fe76bb3118507ffb554e4b1720c4a98c2de13dd235a020", -"votingAddress": "3wubdUX23NmvrijNSSqvsbdYeR8P", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3b3a49788a0459c297d53b10b131e94fe0749097cf01c176426b9a3029e5ee16", -"confirmedHash": "8f1364d8ab2ac8f3197a6a8f58366e32649be6c2e594bf2b0500000000000000", -"service": "00000000000000000000ffff58630b11", -"pubKeyOperator": "81cb0f34d9ecdcfa8036ee9d59c3631820742c04fde6fa4106fe025d2a5fa771665f4e908b3a67f3a53691099268495c", -"votingAddress": "iEGKvgNG3eyUR2i9r8oZ2Em261K", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3b3a8f3f683f9259d5f5cb957dfe57d6b194eb235f8dbb999688792bf0e2d562", -"confirmedHash": "58e240a154a0ac48dfd26143fb8ac7413aa11d8f10f16e622700000000000000", -"service": "00000000000000000000ffff87b5322c", -"pubKeyOperator": "0a6e3ccb6390c37c13a291a0be6e98a83e464673e403d9fee0033eb427c7686c56156e9a6298f597037dcdf450b51a0e", -"votingAddress": "2QwBoMu1a3cCjcM5JU7aYqYt9pMr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3b559ee44ab2b275df9ffa9fe2c3aaafc949013471cfdf64e357f90f20f73b3a", -"confirmedHash": "59dedcb564479592f8a803c8bdc8a26d2df3e34c0d03b8171000000000000000", -"service": "00000000000000000000ffff55d1f1c5", -"pubKeyOperator": "16aa5621f250caf7bce28567f8279fa088a3dd4cfd69fc36a5a0ca251b286e18a9cb33631e762afd0ea1956d3bdfec6f", -"votingAddress": "vGKTSrpqfWiwdDTpnpGhCxtVGHK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3b5d809ebca0720ad2adfae6448cc006383a2947dc1c14b596572d9bd3c13b61", -"confirmedHash": "950cd4a4dce11b5f93b087d4c9b122a210d79d3e91bf1eba0300000000000000", -"service": "00000000000000000000ffff52d31522", -"pubKeyOperator": "8ac93d0666114589f61181016f03b8a795c33482fab5877888e122bd4395073b3ad3156b9ab7b6267bddc2d6f9481efc", -"votingAddress": "43WGgkvYK7fp15jxHfcck5UZRmuU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3b622231ec1460d17244b1e9c640b622f28141f06baa6f2627a3d7f97ebfc2d9", -"confirmedHash": "dca043a756c49462f3609604abf66e55ea501c19fe956abb0d00000000000000", -"service": "00000000000000000000ffffb23e8105", -"pubKeyOperator": "965a7414e82f6f5603c0def8fc07eee3012e35a325398a0e238f16dfd98ab57301133135def3bcb68d2c2b2499c34674", -"votingAddress": "33EsqrbJfnVzskD3iSfJn1myLL3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3b6721f3fa3a80e1712d90be181096448f9abe7e72fffec1dd3df131b43a988f", -"confirmedHash": "778518d6fd7c30c1ea0272141c8873b5527621c6df2ccf133d00000000000000", -"service": "00000000000000000000ffff4e2ef764", -"pubKeyOperator": "983acbc2c600a6850d4191d52fb7aaf6c2d96f5e13a5a4a3e03c7381d2167d9b9b564d5aa39724792d5bb79a16bc5693", -"votingAddress": "NuFTokdb9ETuVM7Qhk1AB6hRQo2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3b6d898a8280066d56cddd504fa7344c9b17d3a9db0196c827f41fa542a5ff6a", -"confirmedHash": "2dc5bbb936389903b565d91c7596c72851a86d1f178f3d812100000000000000", -"service": "00000000000000000000ffffb23e7ec6", -"pubKeyOperator": "099c611e04e001984c2132cbb6acacfba256bc78b568ba6ee14b807e10e2dd37cd945823d00f59d8055ae61cf451a69c", -"votingAddress": "3n1mEVcnhhQAdLFRhJTe4gn7kFKM", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "3b7f3d8de3aee510b039a41aa6af26664e26a08588a0fbd26a51ea771e34b9d8", -"confirmedHash": "2129394c91b217fdeab80141d0b5024877d99faf13d75dc41000000000000000", -"service": "00000000000000000000ffffb99b60fc", -"pubKeyOperator": "0734c697a8ef0588b1478e4818d6be76ff51d2a882e5578d3c4956d9261747c563ca9a4f2a6e34316bf93cc7c56ffe1a", -"votingAddress": "4UEuAjiTfqqeDXbiV6mWyaPuQj6z", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3bb61602562814829ae439b350df1ed837e4c306d90c29294b911fe4e29e0c89", -"confirmedHash": "28e523bfce572741fe4d09776c727ce0c07423c270cfd5841200000000000000", -"service": "00000000000000000000ffff2e04d9f9", -"pubKeyOperator": "19f17cb890786576a7e25a930289f1c71c2560490c6bf24faa2a234cf634ceef4c823145fe13712e18543b4dd9c5526a", -"votingAddress": "49zdy84Ry8qQt2Xc8nekyJE4QbN4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3bc73c35048d733c7e1239c7b5a147d9752cb627da2c7c4427fe354525861eb2", -"confirmedHash": "61035eb65070f42fb24400d08c281e263b1c57a5271ff4901400000000000000", -"service": "00000000000000000000ffff55d1f14e", -"pubKeyOperator": "1113329c269d0048394dec8b649939e3993de488e3a5b89363b2262b6aa34a9871f085a0c7e480d2104163c0e069a445", -"votingAddress": "3QtmyEX92ne4WMU9MQdWKeNBRcsT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3bdb28366138cc6c65730d71c31a8afbded20fd5e98e767ac07b2029b1b6e5e4", -"confirmedHash": "d8e25e5d4581c1c387012a714f499815651f684b301bf3071200000000000000", -"service": "00000000000000000000ffff52d3153a", -"pubKeyOperator": "86630fbbd90156acc362aedc9fa48f95c461ece5139f69c4e612cc0efa2568a2a8685e13c42c18ab177b4faeedc55532", -"votingAddress": "36wMXh5tzLp74maEctnqePbwuGVM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3bde92075859d77210dcfd5cfe4657d4365a9239f8fafda5d3b5f182259f2810", -"confirmedHash": "c220b274f451628bd1edf145da08343c678f298a9d8032330700000000000000", -"service": "00000000000000000000ffffcebd64e1", -"pubKeyOperator": "8eccbe7fdae5137565fccfcc85d24c8a8fe2d29bf364b1b4058feed5e4cecfa2adb0b53beaaac5fb1e8b44221390ff4d", -"votingAddress": "45odf5RZWV4Q1x62MisL9y4GxPWA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3bff47963510a4b1f8c56d918e95f7d2464e9cd302de0ede7cd4fbcdcf447003", -"confirmedHash": "26a6ae86c28349c7c34fb9b4412d58d4ac00e739b3f9ea941200000000000000", -"service": "00000000000000000000ffff58630b0c", -"pubKeyOperator": "0e0f7152aab56ba58ee443039f785a17fa79efcaead595679f814202ff23dfb09a200f0adf2e33cd9ec8aa6e65749880", -"votingAddress": "3kJChqkSN97ouz72MmEm66HAfN92", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3c00e07eee9c7b7c4f5bf6240251a05b7c8d75d9b8d1cc9ef5dbc97b8b1ce46e", -"confirmedHash": "0254ce2d992582b91e7111b382cb6e1f775d0632d422f1ca1900000000000000", -"service": "00000000000000000000ffff36d3030b", -"pubKeyOperator": "8c217e39c20497d0ea77334c26841b15db531839655c7887ee504b5f9dfb559ffcf475c945a0da86bc46107877e0652a", -"votingAddress": "2mo3ZH4NKkgVwF35u2tg9qpbCeEv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3c012fccfae6df3c00da68e07dc69c2378b165e2dd74773d57a2430bf007cf54", -"confirmedHash": "06526f0d1be1241cd22a37e03e17ddf4f73a839aaded90872e00000000000000", -"service": "00000000000000000000ffff44b72457", -"pubKeyOperator": "995dc0aed6a30b13e5c0e5c238ab7e28759bf1666a8754c50f13286600b8ad872ee5a7f5daebccaea9f81b8e7ee18d7f", -"votingAddress": "sceEK9UpixxUoXaEzFJh16GNE4J", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3c07a39126f926c85523591fe8c953b01906e2f0d57bb23a5dea6c0b2fbaea24", -"confirmedHash": "812b0e5b37a80dad9c43e43458afe77bfd3bd1b92d64d4841200000000000000", -"service": "00000000000000000000ffff9b8a9fa9", -"pubKeyOperator": "1640d1b593d93e6b5899e3cf91057effe2b5fe147bc10770f90ba19666b505e60d4a2c9fc904c588baa25a962f30c371", -"votingAddress": "akocbgMfTGZfphVeQjMH2LbhDXn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3c17376da9a97fe0ca0ac3e5c2fb437f84270d07f1652d936977d155016db571", -"confirmedHash": "ae5f4abd5029b28c730d903c27198499c242300d5a6c412c0700000000000000", -"service": "00000000000000000000ffffa747cf5f", -"pubKeyOperator": "909c25cf25362aa298fded3f80ecc874526fae7438a681db092dd020aa83ffe3a929298247ec881a8adfadf790b0bbf5", -"votingAddress": "2T74V2gKCnYGBAYGvMXTFycTshw9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3c2220c7cfe3ff4b555d078e6a05249a39c746d24235a89016dfcbb0ec7dc73a", -"confirmedHash": "d2cf92ba34e725a7b8b2d3647c0087004e44f3e4b621755e0a00000000000000", -"service": "00000000000000000000ffff80c7969f", -"pubKeyOperator": "043b0003dc221a22d62b50be90d91d4153ad05a53a0d5e5020090a68a56ac45d60e18520910246dc874e28c06b58f45e", -"votingAddress": "29oN5JyKEcrNBgfPAsNtcnDs268G", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3c2991464d02b5f4d1dbafc646d5b56c8a2cb66e0dae5e37af594832ffe0afcb", -"confirmedHash": "333945d6f1a1aa68cffa842a56252b3996b925a3247828731100000000000000", -"service": "00000000000000000000ffffb009d205", -"pubKeyOperator": "018cdbd7e89a3b0f51a72c418b11ff31552fd5aca89bb5832085bfc6f8f46632297b0721eb206c508be8279369775646", -"votingAddress": "2j5hbkfopMubs1P3YpF4WMGN4oeA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3c45390d87ce8b50b7375e03e153ac8f77cd82cb49d48536cdf1ee97032636b9", -"confirmedHash": "caa0f11c028ae9d0614549ce5dd0f4c601322ed9625ee54f0e00000000000000", -"service": "00000000000000000000ffff5fd8ff43", -"pubKeyOperator": "98ab1fa778b091c5816a33d99a212ffddd1a6f59595c49a3058535f009a55201504e71af6be09126ab2f8a02f7326bba", -"votingAddress": "uwJYLGQ6kUXx2169gsqYQXL6EM7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3c5aaa0f246465c6e8c1a1ecd4bc6f722ea5f3975beb7326ce32244b64de92d0", -"confirmedHash": "8adcb0136fd6756ba1b8066eff9c4ab1b37c229ce446be730a00000000000000", -"service": "00000000000000000000ffff88f3738a", -"pubKeyOperator": "874d06b9b71272e5173298474e72e4811a6fe7624b595837af224c022ffd80193346cd03c03d0bdb637c2bee683baece", -"votingAddress": "336aNGFC4s2PTAzzxFiKFZg5WZSn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3c6887b6ce7d0e80d6256dcbe37a499b9137cf6326d59e54eece6ce1c2520c9b", -"confirmedHash": "485df6ab56bcd8cc4b6992b9d703f346a789211619c87e370d00000000000000", -"service": "00000000000000000000ffff92b9af70", -"pubKeyOperator": "804380e0256b1a8e4a3d0da8e6ea37ee508081f15eaae57c274f3d19c0734336c984afcdfc047b222b64f305bade1898", -"votingAddress": "2SWb7YR9En5eSzp2WugMuU3zA27z", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "3c692bb4714af9754828cfac9b018326da8a9aeb12d6d247eb7479d2b02608ff", -"confirmedHash": "5512cd13e1c291b98cda75c1cf90ddb7da9e1f2eb5bbb5ff0a00000000000000", -"service": "00000000000000000000ffff5fd86d89", -"pubKeyOperator": "921495b6d6e0219864a51e2416a3bea84b7ec5fa0b3d50fe48885d6f6d8881196e35189542588d6d65fa8dbaa5bb10af", -"votingAddress": "2J7T4v5B8FmW7FLdxFN9iaYnwzwz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3c7d9e77682468bad282685ea4ad5d67e96fe09417dab52d4d956ab811ef5468", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d52f33", -"pubKeyOperator": "979835f7a69d67d9be31ebc08b0726fca58e5c440713af349afbeb0c10da9c1da55ac9a838ccfa0c0644964de655cbc8", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3c9c0b1240e375f5bb846d467396741c27c3b08abaccaaedfe3467151c38a008", -"confirmedHash": "be37393507fafd0162b5f76836d66f1169ed76304cd99b391f00000000000000", -"service": "00000000000000000000ffff87b53481", -"pubKeyOperator": "145b47c422500660c83b9f5c119146130a31a3b6548f91ce209c4e0867f1ee1e39696f05b4c52404db9fe92c3e79cbc5", -"votingAddress": "331kQoYg3zuoVVQszR88mMiv25KB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3cae2c4152c650396eccbede8c3fa9594855a753a2e1a7947067af7c63262d64", -"confirmedHash": "79cb39cf897e24a65d55df4fa831110cb638bacf3c7510a42c00000000000000", -"service": "00000000000000000000ffff453d6bd3", -"pubKeyOperator": "8d9c49c673b8a295e668af0d77e9f9b95231a1732d784869fdb02602eb210fed53e7061d4ae909493a3e9b3b8c41c01e", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3cbf87a798390b3c3ff0d4e6b11c435a0f99c8781aa28b3364a5a46076e8be50", -"confirmedHash": "89a5e884fe8b3c35a14bb699c14d6d7e4d19b50e2a7dbe2f2500000000000000", -"service": "00000000000000000000ffff453d6bd6", -"pubKeyOperator": "0384ef8f71933b9656ad2b3af67d4d71afa66c970b82606276dc8dbe20c03d505bba627aa29965d84153bd2ff9370e18", -"votingAddress": "2PMKAqJVamunGX8GJjpYj94cXzu3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3cca8771a750fb1792c27cf6687c97deb19ef489e4f7c51bedadcf885608458f", -"confirmedHash": "f1b618d642f5299d075387ea41298d47f14db289d57ebb562e00000000000000", -"service": "00000000000000000000ffffadf904b4", -"pubKeyOperator": "0bf8688ad63a7849a7ec45fd1354c071535ced2284f534fdb515004aef027b58e40cbc582fec9e5f12c1e32c253baf26", -"votingAddress": "28zH7mtcd43upfBxeWZX9zrfLCQt", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "3cdb613ee658430926045133365f96e121bc6a81cb61b338f10bf7db74fdce04", -"confirmedHash": "a35c21ce54611f395898c4b9159fdc7075fa16810ff247210500000000000000", -"service": "00000000000000000000ffff22ea7824", -"pubKeyOperator": "079a442c2ff2eb6f1266eb758ca27ff588c5d66f21c7f1d16cf89bd5e0c9da50b680b47c1fe723adc44525bb3b3d9750", -"votingAddress": "qii7HrQteWQvubPPPknFkEyPRhR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3cdf94bc511fcbe91bfac953628a0182df703f3133b72b036b0b598689a695d1", -"confirmedHash": "a02627addd9ca0c6b6df724e1c61e9cba8d6b717159794222400000000000000", -"service": "00000000000000000000ffff2d809c4e", -"pubKeyOperator": "93532b6391c75c94ac83ec94e18327e1d88548f8c62066a1cb6f82161c26790a84c97e5ed02f845d4967ff1ef34e4dcd", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3cdffc6f14634a73769740a4ed59453b97d71186cb58e67bc9a058bc716619d5", -"confirmedHash": "5502a337a99cb0aef3a6e1b2a5209d3a17eed87eb4b9c9010200000000000000", -"service": "00000000000000000000ffff8ecacd61", -"pubKeyOperator": "8026e875b15645e8821481ed4e76e67b42b08c9a587cbd9bd4f6c84244da4f5cdbb9792ed27c59e2e6c370842a195251", -"votingAddress": "2mtEPDErpLyTCXW5pKSfAcDEGvj7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3cf3d04d9ddd7ad15d0fc2d9271fbe55f3c7629d631443d3116e3bd864caed5c", -"confirmedHash": "59760957f2cf5485d951c048c27b7317d8434c2067e5868b0b00000000000000", -"service": "00000000000000000000ffff52d315b6", -"pubKeyOperator": "967740ef7542035d097822a80648998181edc5f86b7a85a10febc5b52cfb2e86c94fd1851892ebca4c0b3b071323e051", -"votingAddress": "2VtFMwBrFBcHewEwYxuaQjk2rDat", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3cf90b9513381347f32c763290c0723605fb8d836bb58ed2db6a42e83fbee79b", -"confirmedHash": "65ed58faa0935e58bf2e7f827a3682c64c842950124ceed12900000000000000", -"service": "00000000000000000000ffff341748b0", -"pubKeyOperator": "96b450ada07d7b4a100b26c7bd641d34ab3bf8508a9328982dbf6cccebde8b0b790cf7a59f3039b52448b448a291cec0", -"votingAddress": "4VdpJmzbEyeyUYFYS31oG9jzJY4w", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3cfc6501e61809b5738189af646019e09e45dda4297041fc6c3611dc0c0145d3", -"confirmedHash": "54317e0f9638e80793cef6f500031972e70191d95967f51d2c00000000000000", -"service": "00000000000000000000ffff55d1f145", -"pubKeyOperator": "93e30dd89474d8016a5facce14bfee27c44f4e705590278068c270c29543762e5d854fb696afb6dca9f43ec815a0cfb4", -"votingAddress": "2ohBpYKp2piKQ79gCdz4jDRhjUNK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3cff78ca75412ca5115b9826436dfd64363de4b627762ff38f2862aa160c0355", -"confirmedHash": "7829239591c0754b91dc4ab5a92d505f13a515453d7db2151a00000000000000", -"service": "00000000000000000000ffffa8775793", -"pubKeyOperator": "138cb0a07838ea7c5332ef532d81985076fc6200ac5a87175298661766facb850f7aaadd32fd7363dec2fd1b6f828d30", -"votingAddress": "3X2mb4qrMxANLrwPk19SrRfojZ8c", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3d0b2b0bc56c57a7f64c822a05071f18c0fa374599b4d30a0d0c0804eff80987", -"confirmedHash": "aaa70be69b168e87c256f3bc088994221b4dc27b965b61142d00000000000000", -"service": "00000000000000000000ffff33c3762b", -"pubKeyOperator": "915967ce1d8a0fba7a47493fefb06c49a8525c5a5e3536aa7c10d49df1ee68cc0c13f487f58d04aad3c362062fcfe566", -"votingAddress": "37yvuTsGZ8Ucn5rPMm9sVur9yEuf", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3d28071c09a747da16b6972618879969ceec410a2400805b9b5368db364e867e", -"confirmedHash": "c5302037d91a1117d2b07ab66223a60eff868d3fb54c61a61600000000000000", -"service": "00000000000000000000ffffc2875bc7", -"pubKeyOperator": "88a5e1926ec1998c3d408bf1db126f5a6b649f434870a20b50e4e7a19451ac7819477e0295affd95eafa813c9d244c0c", -"votingAddress": "298KhjGPjsS5aXvnfS8C5daHXTy2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3d527afa22cd37b235ee9b89fd57726719ad2463c2ce37aa844d8b21fc53661a", -"confirmedHash": "c31afec0ccaac8914e8b1e1bff725ca26155fcf4d88e77ae0800000000000000", -"service": "00000000000000000000ffff52d3150b", -"pubKeyOperator": "165bbde7aecebab8daa93458a43d8c9335e0991e29449b6121b43ff842fc3575e9cc7227950e451ec57cce8d5379090f", -"votingAddress": "2yL7n7kmsjCCZg79WqaGeuiTZhWT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3d5469b9d1e6db16e194186586b3c3a39ade11b1b707ceb9341e817054ddd064", -"confirmedHash": "ca003e8266fb378c8681ff23e7fb711ddbc3ec557c0440f63100000000000000", -"service": "00000000000000000000ffffb444bf4d", -"pubKeyOperator": "16b95507213d3a58b351b89c50481a167485009b2be7c329d9f9efb4399695e0ebbcb084943df079b258001e077f55a7", -"votingAddress": "3PYSaeBHpqGM3Gb2hktiVR5oRarN", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3d565de0031d6de415bd8a45c52d11476bb1cdb6ee420d016b974145840cdae1", -"confirmedHash": "aa5ed19ccaa063b986cbd2d30e4768146c40e39aa7f716232000000000000000", -"service": "00000000000000000000ffff2d4cfcc3", -"pubKeyOperator": "856c272f34f4017db0cc20f3bae6cedee8446fb4bf2447c9a77a3cf487494ffef7b42454de18fbc703d9a1f26d5fae32", -"votingAddress": "Ku8UQwDoXLka96drut1b9RjHU57", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3d5e37eae4ddc818da9ca878d0fc49e3b1646ad51a3214e85cec287092c53f57", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffffc17a9c0b", -"pubKeyOperator": "8054ce4fb7a8a54a8218cfd95773da3712d0905112049ece7ec61553f56fd90f64c4e10bb235d6d0018a6d41da047542", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3d8285261666672419f5b6e3e4a818da60a37ff62acb04ed6a6bf7391f25693e", -"confirmedHash": "de4988f658a51b5ca94696ddf559bc73f42868522ced8f001900000000000000", -"service": "00000000000000000000ffff5fd8e661", -"pubKeyOperator": "02bc83832ed8ed9b6aedef8b81257ee953464854537273d6273eba7abcd7ecee1e1db1c3f696eeaaa623c39142b6ec3f", -"votingAddress": "2eD5Vp8or1UHVCmyMAJ8cct3Qqw5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3d883e1e85b9f320c81709591196a75feecce8a74586beae40c260fd5c49a25e", -"confirmedHash": "292f899d509561b053052ef4949600e61942501ec15f634f2000000000000000", -"service": "00000000000000000000ffff5f55152a", -"pubKeyOperator": "97ffacf1baf25eddaa9266957870f5109753272f6b34a5e768de869af76f21fb158920eb70fab0514e684ae19123b856", -"votingAddress": "3AQaY3f82cbaw9PUVEMaXuvTzT3X", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3d90036df95a27b85a9a6c51f4546eea70e02326af9ef33afb63f24160e09458", -"confirmedHash": "a655276af5c649d39818ba7a2f57205fe355c7abec91ad7a1d00000000000000", -"service": "00000000000000000000ffff6c3dce86", -"pubKeyOperator": "9963db90fa12fe05a1363e3aa087b38bf5faffaf8ba348e92571c459cdd478eca1512e2c3005e642d0826e10a46031d4", -"votingAddress": "39JHDhxL5gTRAd6GxYaU6FrG6ngh", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3d97999a20bcbf1636c0adab9b53ba0657780bf0721d3c7a4665d1547ef33d6f", -"confirmedHash": "6ed6a400b9c9b65d4da63626648be9e0bf7bd2b07a8e1db71300000000000000", -"service": "00000000000000000000ffff55d1f1eb", -"pubKeyOperator": "94b13c7048f8b8c290083643d941f83bb5b5eb6517247ecc20b0da0b02c146810c8c4af0f9fdfa701a98dbdc4d15822e", -"votingAddress": "GR5Ss4KNKLzJcbNX4evH5ZBiV5k", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3dada537ef11164d8044197f8c71c012871b5582811786e7ab06d788a744f85c", -"confirmedHash": "c09da1b76e75635a67cd90f4d7fc00c1a0541897f0bc26041200000000000000", -"service": "00000000000000000000ffffb23eba27", -"pubKeyOperator": "8451624e5fbcdcf1703e9c1e80cef6e07e648ce343952f3e30c82c17c64a934870b54f30249398532e4a3e74a1e07df4", -"votingAddress": "3DJ2SyGAE7bWq8fhHxpmhRTPtD2e", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3dbc2bc5f23f59cca379475f08879f7f67982ac035494cbf18a56e270f12b019", -"confirmedHash": "f976b273ed390b990053f9fffa3e94d23aa7e936fcadbdfd0c00000000000000", -"service": "00000000000000000000ffff86d1cb77", -"pubKeyOperator": "8c60a43d99c862379cf61248807907dedf1158421c8d82bd3fb2b7a1a47f8156f91e476ffd3b70d77b1718745b8ac0f8", -"votingAddress": "c4QuyM12wBtLui8WdxGqEQf17MX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3dbf4adbffea13a29c340d65518fe7380d48fdf4994c95b504b8212345da8a4a", -"confirmedHash": "91dd8d38a8c9cf054976c25fd0acb21c7cd65fa9e2ebb3712200000000000000", -"service": "00000000000000000000ffff23ac41b8", -"pubKeyOperator": "81784ba13545043e708f8107dd859d370d31aea5a6a7fd567237d0642c38ee2a0ff304983d9446c1b1ae7b0e45c45543", -"votingAddress": "hMtdzA9CtomGXFMwkmgZHzkdjUg", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3dd5a9ea94765eb4778fe9c4961f8db18de37dadd507cd80455ce473f531dad6", -"confirmedHash": "270519d3d841e4836b7b6d692a42d8e30b4282d095f213e52b00000000000000", -"service": "00000000000000000000ffff52d3192c", -"pubKeyOperator": "99b3ac59ac16b5b40da703406b29bd7fa072bc3f77c5f1c93ddc34b3af93a715697c9d1001cd2e22806871059fb28eeb", -"votingAddress": "2Q5iMKG8y8yoyYXjZoEuhHH3h8SP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3dd8780e8d531df4ac2cdedd54eb353992cd917fa36327383d294e90654fa420", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffffc17a9c64", -"pubKeyOperator": "19fe7a9085ba63954e1ade5edd93059bb4c1ebcc9f7d12658ed1961dbe1e0ebe7ab2fce49d411c7be334d4d113c02b87", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3dd9c409e981779c1e62a3492db6110a5b501bbd1baa220ebd88010393c1067f", -"confirmedHash": "1e1151d28a57ba7dc49138117fd1222b5d17234f89f097a42800000000000000", -"service": "00000000000000000000ffff2e6524e2", -"pubKeyOperator": "0ef2f67fcdf77bdb9341dcf7bed8d0bbab76942edc8255788110b115fd5deaca0f3e58c33378dfc999fc47bd2341239f", -"votingAddress": "sLaB4LDAk8fVZBHq4BeHUuJNpUN", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "3de05527a758f4de2eaf47b70d0aa68bc432b107c608985f23253d09f81e0a01", -"confirmedHash": "9f4b3e752fcf695c959e1fe1e948acba37c95aaf1f08f51c2200000000000000", -"service": "00000000000000000000ffff2f60deb0", -"pubKeyOperator": "1112712c495c2a80110754d9164eddc72dc6f0c97925f44af1c0a5807f847fd0d56a2cea902e12848e1d9e5eea4d3908", -"votingAddress": "aWqkXQBubKqJnqvKaGFT9Szmnha", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "3def886e91be9e9724217a53cecb8542c3fdf07c9257114a3ed7da2319ff753e", -"confirmedHash": "6996246f6ba0f684b31dc588051275fc8d5177037986213b1c00000000000000", -"service": "00000000000000000000ffffbc2815e4", -"pubKeyOperator": "98ce9c84b63272020f00349e8597b489ffebc939cb293b6423f0407563f83c2a95ea917a1993763fa017b8c419bf4c0e", -"votingAddress": "ax96RjrvyxcjKKQWJJnYtQS4C5E", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3e167c82bdfde35da9ddec4295f72fc6bf0089ac009387146dfd60b7f18ec294", -"confirmedHash": "2de93631ed66b67a87df8cb83c8ee318f59e3bb2962114350b00000000000000", -"service": "00000000000000000000ffff74ca1aae", -"pubKeyOperator": "0d9bfabe954a2b41026519abb9c671acd1b7960337943898a60b84c6c3dec8dca3b80fdf59b80bbbf76db4c3dd84cc16", -"votingAddress": "3WuQtqKocUxyStZtjhCLPNJ26JEQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3e1682f13e2a86332076b4bbfa06a9f2e846c32e9e966b7b5b5d80946cfa5a4e", -"confirmedHash": "0d9bd1f59e06932977a5228d3f29a98c1ef7c2ec18c40e3c1400000000000000", -"service": "00000000000000000000ffff411470f9", -"pubKeyOperator": "026fb56144bda6ab2bd1d7d68c1c7dfc217319676957da9ffd5164b4ed881f5fc795780f98f764df304c3c3bb48c6e35", -"votingAddress": "2zKBHjq67ZZvqPjF5ejuvdcPNc1S", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3e1871c16a359e163486277f17cfbc42cbf5a28f935dd59105e325c319cf6a68", -"confirmedHash": "fbe7bc38b0a8ea8e8d5dd29c50d97e3610d15da02dfdf72c1400000000000000", -"service": "00000000000000000000ffffbc28b842", -"pubKeyOperator": "87f6be0d9918618faa3e4c6fed71ae7e403fa96d8ba1612490091f4cab5d9cab6aa922adad289194bf0597c8c4a31076", -"votingAddress": "419ktmcESYyHkwSr5qbWnxfmGpbL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3e2033a423663b8a0a500ec060dda3834fae86bc3bb14be63c28ec149a3ddb26", -"confirmedHash": "95748fb631d4f72e12c3b9a1d5736ba7658ce84e93c806250b00000000000000", -"service": "00000000000000000000ffff8a4464be", -"pubKeyOperator": "91e1e6e615eeeb15adc440cc2e74b7b12f11f6e5e6c2ba546a802f9859a5f3e081ce15928313625e64f936a5e2a708b1", -"votingAddress": "UnjXpEvb9RiYqXiXxLY8sbqC7fP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3e413fdabf9db96d3bb3b38799065a748efe055e0cb52f47958dac215f4ca742", -"confirmedHash": "8122871448a28f5bfc20ee0b4842cf2f3422c9b2ff36e9181200000000000000", -"service": "00000000000000000000ffffb23fec76", -"pubKeyOperator": "8e9a70232918b481c957deffea7cac231f29ddd6f69f532ffd9fabccbb844aff9abbacbc6267326605e06ad778cafbba", -"votingAddress": "2CYajWs3BMGn1UNXFQiDCJvvPhCH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3e429ddb0fb12d621d0e7a9eac621a8dd1d9ac209a12487850d52327b579edc5", -"confirmedHash": "17680126cb1d4b8e6bef23fe471626a9c3f0a1e6f8576f551c00000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "3mbgyPoqfr7nt5RXmUc1vKQW6EMp", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3e5552c00ba07c5db57f51c032ab3d72c5a17a5ea5f0744721184681cbb015b9", -"confirmedHash": "2dfeb7f521a8d437f2ce0ec1a2b93bf12920919c45b8f0cf1600000000000000", -"service": "00000000000000000000ffff310c2af9", -"pubKeyOperator": "11100e8d65f8bf098b06a4515b0e4e9df313afa04eaa959477f9fbcfefb2ad46e80e1d0cc06f4cd7bc16a777fb172224", -"votingAddress": "R9jweLQ6kSV5ngAV6XSTMQL3Pad", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3e5de5750422cb477e00fb25f6302b15f09de8d6e9c3b77f6272ff53f43a3518", -"confirmedHash": "02e80ca17e63b8d41d5663d143848ad5ab7c017fc228b2731600000000000000", -"service": "00000000000000000000ffff2d4da07a", -"pubKeyOperator": "01c1a1887ff5366dd7615786db7047d610e1c62c0f50b3ffcbbbc2e165a9aae2cc71fb81d4d7109e490625cd6fec71a2", -"votingAddress": "4BxM1mVv9GGWC1r598pNN2bGZjVi", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3e8356395c80157d914381178a9356c1c03975f464c1742676406cd134045c47", -"confirmedHash": "c5e42ee8bfb800b803e0cf8adb46da214ff1fe9ed4b825a91200000000000000", -"service": "00000000000000000000ffff2e65f022", -"pubKeyOperator": "8f0d0e77c43734579c9cddb79d7c1f1d37248b1327bcb24c065dd36989338dd1cb5417f12ae8d06bc351713279c8ff2f", -"votingAddress": "eUkU4gH4qVyLMv2A4kJuy1MUY8f", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3e8f714bf03db3a6e9746b42e991eb39d190409569d65a38122e983258c530aa", -"confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", -"service": "00000000000000000000ffff55d1f269", -"pubKeyOperator": "9111d7ca5b82cc2bdfe2ce1156a661a697d92bb5fa49c83e3fb7d9bf2bb43710788a0db59b855a5145df8325d02ce9f0", -"votingAddress": "CaBkh3RTbqyC5hLfRXEU48yiVbV", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3e936c7ed59ef226dd049c75cdc9256771080fbc4b20ba64b7ba1224755982fd", -"confirmedHash": "a72879e817682cece2e019f2360d2a451aa648628ca620e51700000000000000", -"service": "00000000000000000000ffff592fa651", -"pubKeyOperator": "920215fc2de496055cb000274ba807e55856f0ce30b45b3a6828d0db84e326ed356efbc82f339707b42e3977688d0c9d", -"votingAddress": "3TgLWFbpivzmTzmjwfbMHXCZAMm7", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3ea302c582aa589462c69cc527fb3e674a3b635fb13fd672e924258dc9585748", -"confirmedHash": "f142219d724bdfab00024f3cbed54a68a5d2e022ccb528120500000000000000", -"service": "00000000000000000000ffffc287533c", -"pubKeyOperator": "0b0b692b968506c9bf38b44b0476e27967e95a660f2e786848dc8bd7a219d47a6af8de540df0d0981a990ec0aaffe22a", -"votingAddress": "sgjsiJMwymE3XvhoC7KQDktbnZh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3ead7762ff7c768b08af858d1d792d8681daa19eeb74bde43d225b6d0285eac3", -"confirmedHash": "d428e559a9ce058c11a4658baae0bdbb80fd1b8cc7cd81a51100000000000000", -"service": "00000000000000000000ffff6c3dc6f2", -"pubKeyOperator": "0a5769895f3e51b37567be9cf22f8ea076aa51a9eca878a385d3721ef72804b4472a5e9808f274bded67c4d5ddc6c8f1", -"votingAddress": "3axWqxrgUrEFGZ1p1rXuQrDh99Ka", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3efa76fdada8cda2342943d2313ea81dba9962e36c1adde41da2c4e1511e898a", -"confirmedHash": "43ab2e71a9c5d9928e5d0d0765f50145e1f39783680f7ece0200000000000000", -"service": "00000000000000000000ffffbc28f16b", -"pubKeyOperator": "93c551deb4feceae6e390fec0d1b729bfe7aee6c6df6102de8ac3624b2b7d002c795f67c836a629cf5cf6886be53a7a4", -"votingAddress": "1a9M1SgHW1479H6bJ2jvDRkYYwn", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3efe58eb42310477062eb56ffcfd5b7e69fdab90faeaf2d975fefb04342657f0", -"confirmedHash": "9b1437956a47f3920e3ccb2d34f4c472f0307da4c1250c571100000000000000", -"service": "00000000000000000000ffff55d1f212", -"pubKeyOperator": "1393e79951b710e946a52f6522e648fed778bbc27a1e033f14e1c0d4d55273b177557045e0fe3aec35a4274a6a9388b8", -"votingAddress": "3RNKyLnuLCBeTdPYZ1JHvi2zjKES", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3f094f0c79f8d9d4e0c364d072d0fce6c6750be326fe90184c0c24428893331d", -"confirmedHash": "7a81ab3fde69b6db477edceae28c3c6fe16e8e72077aca130000000000000000", -"service": "00000000000000000000ffff8a4441b6", -"pubKeyOperator": "8a31883bd3edaca27f0c8d49d0c06f28165c1a9c3b46d1b6fcdc5b53310dba56c57a8537cbe61ab43fa3015d87efd238", -"votingAddress": "efg9HPFVKMfWYvMomACXvC9Hqf9", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3f1b84fb06498e2ff54cb9d2b2182ffa3258674fd92e2ab29bb6251036de8fc8", -"confirmedHash": "04d0aa7e2191e996084dbdf7ccdd5f752a6977f7c185b2c41e00000000000000", -"service": "00000000000000000000ffff52d31535", -"pubKeyOperator": "94215ef8ad5e1eab8de0314688897b772c3b4fcdb9115c1c3702fad8be017e8fff174944352edfa1a177b3f5a8e0692d", -"votingAddress": "hVMVJLZJWpZf8ttGwpQL52DNouP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3f313a1cb124e3b94ea3645320c0f130c63bf22b520f733cdc214a425a6bbc13", -"confirmedHash": "cfee43326f2d3a01da7204e9859cb98dd59e530ff419afc70600000000000000", -"service": "00000000000000000000ffffc0f1eb6b", -"pubKeyOperator": "805e0ffcc5cbbe58f22809b05863bd444183c397db383e48068c95401f8f647176426c93c39254d3652b21afa5e95640", -"votingAddress": "2R31d28nfd9sPaXMNBR44XLqK23V", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3f5286614484f5979ea919dbfa935745c14648bd7a82c0d8bb33226d83d71ebc", -"confirmedHash": "8dceca79d013ac2897593246c8038e214260f17a27ad97970300000000000000", -"service": "00000000000000000000ffffb23e9f49", -"pubKeyOperator": "80a0b3f21a61f1834c593a21ef1b87d09f3bd961fd7b86a65362c9494bcc189e5eeb590acde2dfe0f2d79b74e040766e", -"votingAddress": "yeiSvWymzsNcwYdWtTD4oe5pJ9c", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3f5b4cca9bfc0a8a2f5c532ca3c7d5883f87ecf93274b72b56ea99fb9c8d5a67", -"confirmedHash": "521719b5b9c931c726fbad7e81fd4920e1926cb908b02cfc2600000000000000", -"service": "00000000000000000000ffff7928d46b", -"pubKeyOperator": "03018ecfe4aab7aed09455a2495632834c7e3e501634cfb7cbcb11eab1a4b113ba3db22ab0ba33e81f7fa7243d0d13f3", -"votingAddress": "vF9o5bsKE1DdrjbuDo4NiJBvgN3", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "3f86b34ec34963c83c272624b0041953f3f492514e7f2981773b0858625d4559", -"confirmedHash": "dae21056be7be38f03f3c8df1f9b0302e2fa891d4a26b0121800000000000000", -"service": "00000000000000000000ffff59280445", -"pubKeyOperator": "8b9370b416d4bd0ab9009dcbf4472ce241686dcd88fe8a0f57a093d2ed8823711a712f059d6c71303b26e5f73f293f64", -"votingAddress": "4L2YP5da8awVdyXudpKg6JfMMBDm", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3f8bf158f4e853883cd91e9e8363da8f941c4d02f46648ed0edc5727194fb22e", -"confirmedHash": "165f36f304ee8de0dd497b348ec3641380af330c7d0abc022600000000000000", -"service": "00000000000000000000ffff2e04a278", -"pubKeyOperator": "904f600095419ec53d31f728bb1bf96e5798a4fff823e228e9f99c922b297ac573ae67bffe57d0a35bc6470071ea3a7e", -"votingAddress": "2sEvqLe2ntetWYoUFrVvYS5THZY6", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738584 -},{ -"proRegTxHash": "3f9478766e864c47404e41774e1e06ddcb84e5265eec3fcb23ad358f27aa3344", -"confirmedHash": "a1e6a81c221aed68d0e640d6581eb47941aef0a4afbbaca63100000000000000", -"service": "00000000000000000000ffff52d319a8", -"pubKeyOperator": "83eb08385008ffadca58d6643209e6a0a46bb5f249ddc07d1a801cf112d69e81d5e9dd1af34ef732fef787d77ff8d42a", -"votingAddress": "yXkqrSLE9TScRXShAFy2eLiyKtx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3fac883277b2ab93c7464ac4027e2958c50bff3307322b1fb99f6d98994e58ed", -"confirmedHash": "55c0ca77c9cdec9f6efad6566e5914f881435ac8152069af0700000000000000", -"service": "00000000000000000000ffff55d1f24b", -"pubKeyOperator": "0744dea6314068a060c38515bb32adb44ae0a37b9a053c3a5b4c83acf7b7b254a82fc6b8689c1fd977a6831f5b9dc00e", -"votingAddress": "fzoupydjyP9oAprMXDPY4oAmFqY", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3fcbf85896c7a9be000eccf983cf95c2204337e6e11480a8d9377a7b782a417e", -"confirmedHash": "825ff51efd7ed0fc1fc428520486adf4d7acec61b83d33cf0b00000000000000", -"service": "00000000000000000000ffff55d1f255", -"pubKeyOperator": "83ee3c0f33fbb7fe29564eb5464055bf05308085bdd7de44e43133341649612cc402998788ad81502a310a3cccac112b", -"votingAddress": "spbU8kjLYwJMGkx35RuiHKyXkSe", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3fcd6520a1cef81eca0cd90b1d567b6c414dedd40078eb835bc2d47e0e5a7aab", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d5232e", -"pubKeyOperator": "1153b7c2564fac05a04e37db5ed21c26e3bc09fe30ac1ccd61b397f5edea329b51998bb0f1d71cf6b590bbc0e37a9a58", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3fd286839c0849b89ef2d9a43568fb6203bb3ed216c56f5f45bdc76bfe0a339e", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b08c", -"pubKeyOperator": "8c8c7e70d9fa3b9db4ab764cd610cf832d98b5e736ca7945c8c38cecfd7e2b0d40337113377ce351edfd04153fa5f856", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3fde0c69ba5db530444f43b1e7b4692ad6510d262e39bfb2e1df7550fb447f02", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff343c49ee", -"pubKeyOperator": "08d0e5f84c370d8d4586204de8f604cb7231c776419880fe493957edec4dea94ed3505ff60c0d1ea507d2888eb5235ae", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3fe6be7f8fc4a534655d04c0d0182d69d17ecaed99dc48e632c13d899d5f1c1e", -"confirmedHash": "92fa2a77f8db22d00f00d8b8016c58ebba5a43c5635f5a090500000000000000", -"service": "00000000000000000000ffff5e1794cd", -"pubKeyOperator": "8f0f2886fcb55d4dfe40bd5f7e4e2b9d0993faae20b4dc4a7f18452e94f03b5eff80ad2035f929c32d0f0c3dc9865eae", -"votingAddress": "22UDi4ansiX46SsgyEVNRUMZDdKC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "3ffefea47db2a4f942f32a74a5cff1a3fd5b23c38c5bec6d21e69e06c8ac36b6", -"confirmedHash": "63120ad435a1aab914ac2e0a6abe0b71768ed7c009fe2cfe0400000000000000", -"service": "00000000000000000000ffffb23e0a7c", -"pubKeyOperator": "809e7c99bac3cf36111a3bc56044144fd6fad1275545a8934a5a0049092b5fe2a3bd6f8e4cebe7524ec9aaf56dad7b6e", -"votingAddress": "3rinMwNRRGHr84A8RWL3ayN1S7C", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "403bbded5353faa123de58535ecf3cb81ffa5a85f07a47ddde3fb54d663a9e5f", -"confirmedHash": "8168b3ad5d59fd1fda68340a2cbaf9d24f6a8cfc01997b5e0400000000000000", -"service": "00000000000000000000ffff8bb48128", -"pubKeyOperator": "9428b71d10a6d7cd8956c8fa25e6e0a7cac2ae9939963b387164e31be7988b5d273f447de130363108e2147aa449be1d", -"votingAddress": "2PBoev9VmUqUU1hZJDMgx96DDnkh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4043cc0e1f17bbf21879a9cafc4fb906c455e0162c14135ca7c0a17bb998faf7", -"confirmedHash": "42e8b8913740c3dbb938334f4f057ca2d1e49bf9b66f7ebf0400000000000000", -"service": "00000000000000000000ffff90ca4f8a", -"pubKeyOperator": "9594083950d65f3b520f05abf973a0c4c78fd6df4586cf01b307dc81e671fc72ed541f3f93f295c742d770b0fe76d09a", -"votingAddress": "EyzoMJGJ1cLHVJcPdkkC9tVmcFs", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "404428f82dfecd80d87ce7cd6d823829944f3e057366e290bee4887fa260ecb2", -"confirmedHash": "98dc052d322809046515bfed84dbc857b2cf48f1aa3ebfcd1a00000000000000", -"service": "00000000000000000000ffff5fb3e5b5", -"pubKeyOperator": "145860e681f8b96d77bf4e26352ad20a7b01674776b77404027794b36c2805ec534cda8f0d052afe23e94b6ccd48f3c8", -"votingAddress": "32PV5wZrjMGxfqgP8dCYxeyp9UJ2", -"isValid": true, -"updateHeight": 1738536, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4057df3863c18c1035b0597581290a305da1e87eaa63e6ac5e107d108e9847ba", -"confirmedHash": "538ee80ad9ffa7f7a024d24a593ae7c8a434cfa9394b14ef0800000000000000", -"service": "00000000000000000000ffffc11f1a2e", -"pubKeyOperator": "988988be5fa339b8c7e4f5bfffbc240967712e97af741bb944214462c244f9e11c3f4a1d9222d91fd0d620cc21bc6e08", -"votingAddress": "3yqLqgBkfvaPJoiahnhguV1hULt1", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4069deb6a4c8b09b75922fd4106c00fc110aea3b2bb60873c0241c0a6204f4c2", -"confirmedHash": "0f958d48eca6c6dd7492ab76d3d9b43326521f8afec315cb1400000000000000", -"service": "00000000000000000000ffff55d1f123", -"pubKeyOperator": "81b285b858e2a4221aea57bc70c7bb3d800229e6164baee7955429acda11b4281428b4e665f6b351c52cfb461e456be9", -"votingAddress": "2aC6kPpG9pnb39NmqZMgnZcozfHa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "40754b06326ed3f6b8da2f93630a73caf694f0ed7b1666e2b8e654ac9420a2cc", -"confirmedHash": "501782a4d1453cbaa105a0d2fc9eff96ccd4d80501978e191400000000000000", -"service": "00000000000000000000ffffbc28b6db", -"pubKeyOperator": "91ee47fda887127e97c87cc788eb75ad593e22eee29c6ed36d271c2d5eec849fdd86d960132fd4f4ed83775e9eb29503", -"votingAddress": "225WkjrsKfsHtaBdJ7P2iubXhoTX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "407f64127d18146a7356a2a629c6572bd7ef3fe7eeddf889533bf9fee2328552", -"confirmedHash": "743ef4e4694a6ef868bc3cd125c8dfeeb31d7ea11bfb6c301800000000000000", -"service": "00000000000000000000ffffa8775310", -"pubKeyOperator": "054050c90a8a4c342aa1a64da8218779db1e474433ec11798f8b2961522d338669f33441c44233ba2597dac127070aea", -"votingAddress": "2xruWpPhHRcG4bS6FnG42rWp1Udq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "40ae763d3def3dd09f77370ac1373aedb6b360ef351c44740f6484c059b7258a", -"confirmedHash": "080ab597d475fa1db5fe18a512525e0a655dc289362c610d2200000000000000", -"service": "00000000000000000000ffff3353bfd2", -"pubKeyOperator": "025802d8886798d9188e65010b63674793d3f1e02c31ffd2cfb5435abeb8a727200ad752b1353f5a753e05128ed71e8f", -"votingAddress": "2pYgKnMPdxXjMHLKwrW1LGGwSmC5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "40b1acacb3176515aca25474ef4cf17b0f2007aceea9a4a4778f76d194f1bf0e", -"confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", -"service": "00000000000000000000ffff52d31583", -"pubKeyOperator": "04bbbe07d8c16a745d07f8e30f341c1994c9fa9c038dab1d32823d5d7c30a386f0f176620d8cb1e5889e2ca5ce018a39", -"votingAddress": "4WSeyy8BYaw6FCZ9EZtjF74qcQSu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "40b665c36354729eef40c01fd68299099627ba65edb5dda1b6b5acd2ea3ca11b", -"confirmedHash": "b1d85829d008a920fc08625f68dbc8083f24b41aad66e7dd0400000000000000", -"service": "00000000000000000000ffff5fd86d80", -"pubKeyOperator": "03bd90a09a7eaffdb1c64cf43ffa099b667ae863e9c4522b8201c89ec8f3c5baca18757d56f752ff6768217a27f666d5", -"votingAddress": "dDVegpeL6yCijB7MB1ity5nxAp2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "40ba966959869a01af361c346dd1a07117c94a2c2dbf23e4d226cb65d79e41ce", -"confirmedHash": "992f62a5109e217be7b10722091d7241a0b55872b44338321600000000000000", -"service": "00000000000000000000ffff92b9a1d4", -"pubKeyOperator": "08b9db7be4182a1c691f72b2ddbf5a269a7f34411c783da970bfeb7edbe92f1d9c345b681cf4e8e605747d9eac8deaa9", -"votingAddress": "3UjXKsGFjfutce33epDoRettcvRL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "40eab264b2c9d3ec92d04fdf2657d0ff6a833e21500cd5b34237a32b46de115d", -"confirmedHash": "7472f73f953a7a4371d524dc5f968d9991c186812496d4090400000000000000", -"service": "00000000000000000000ffff2d4c9f72", -"pubKeyOperator": "90db1eab3e75dda82da4b6d4ac3a8f4222f3fcedc849e92fe48d43a476fc030b57d7761d35bad591d422b1a013df1263", -"votingAddress": "3c1ayv715re17cUn6VuFjKFcsnMp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "40ef5b72b0ae133b76d15140141da920d7fdd0dee844221ea6be4efd59a09b6f", -"confirmedHash": "6a1ef35b95f14c2d10ebe700f225283b64c8cad80500fc601000000000000000", -"service": "00000000000000000000ffffc2875eaf", -"pubKeyOperator": "804543507ae311bb478f2171308449aa11c3175b3381e8671d770b703c46d8ca51f45b61317be0ce264d9a620da2695d", -"votingAddress": "2fnmRLGjjvKrQHvoCA4SAqGwVRfh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "40fe0c5442569b81c23e5c905df5fba1c9e2b88969500ab2902e5445733cef0a", -"confirmedHash": "dbd9755748a8ca6bc0fc84dd1aab2ee6945febe2dd4522230d00000000000000", -"service": "00000000000000000000ffff8b3b3a52", -"pubKeyOperator": "8535c2febbb143cd042c15a743280c767908a5ed10285ef3d238e207fad0ebcb976a9c6acbbb34fc2f8c043e9522ad35", -"votingAddress": "26KHmeXPAi5wKtFEKLMGQ5dD6VWH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "41009a1c1d57c02702fceb1d5f69041189359ba709369311ac5c2cff34ed4a9d", -"confirmedHash": "54808f967a1ed78b5194c7128b4acf5adbc9ab9704b9496b0800000000000000", -"service": "00000000000000000000ffffbc28b6d8", -"pubKeyOperator": "19464f857c07c15bcf36e89130580ae44a5519fab05a031c73a11846f2809387f5ead76f4ad88c3df0928f49bec53416", -"votingAddress": "39dJQMDnmqL9RLeERocCBgv2C85C", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "41054aac0befc2ac0b71f5d86158d1af77703b401c574c42dcc409e4a26df9ef", -"confirmedHash": "b7e1413b1cae81f9419563b23dd5a4ca6286dfd12c11a0e60100000000000000", -"service": "00000000000000000000ffffc0f1ea7d", -"pubKeyOperator": "8f7baa1d385a93041e2236d0fe0e48d159ead6304004617f262364da03d1cd6268cc50be0b98c41c5cad37e84994ed45", -"votingAddress": "3pcxxSHFUTrmWUWRyZSD7JShf1ZU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4113592f3f7b13f470e4881acf7c6581cdad75f2128fe7699411079945d54847", -"confirmedHash": "16d736edc24ee9c4181a15ede336ce818907a033889b2f242200000000000000", -"service": "00000000000000000000ffff2d4c922b", -"pubKeyOperator": "022af98a939d9d04e864d89747dc64cbc61ad75da24a7d66259de6bf08216e81d6eca329289d13bbc8941f3fe3cb0299", -"votingAddress": "2vGg9H9JtrGvWVv6nx3Z4b9u42tC", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "411f8863b12a79e10e92cb6dd91d26c4554154307499bed47dfb4f6c2bca56d4", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d52448", -"pubKeyOperator": "03dfc8f214dae21ee2513e3333e5892dc748458a306800c92a7e9dcc777f960139e02e9b1259cf48adb3e03efc0e352d", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "41232f0cd59a4eedaead45f6931a6d9545891b245e3e3c8daad7584599b77e8c", -"confirmedHash": "362036a706f6269c686ea3d97f044c6d92937f5e547f93200000000000000000", -"service": "00000000000000000000ffff894aa636", -"pubKeyOperator": "8d9eef9a28caec5eea751979522218a96fb7696d4d63649cb3792230eb67a5c2038045ad3dfa2a1e077941cd029689da", -"votingAddress": "4Bq6z5sj9HVpnLhL3JpJRtdU1EhC", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "413cd8828c6d14cce9af420602c9f67f08a16527618033225f4f86f554225dce", -"confirmedHash": "30349a475b6caa74ce1515dccff52ca5332d4c225a308b8f1800000000000000", -"service": "00000000000000000000ffff2d384581", -"pubKeyOperator": "148ce39e3f81e37c199eed706694a3fa97ca480c9e24941628e7b792d43290dfcff5d8076fe584f356e27813eaad0266", -"votingAddress": "3btE2NnvAqJvzJvKqRRo1JTHJVv7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "41425a4ac76487c4cf1ba5b6ea8d79dd64ba98ff1eb7ef7184c2e45136da35dd", -"confirmedHash": "a29c7d55d3babd727396fc7521a3f76e984efca6cc3527c81c00000000000000", -"service": "00000000000000000000ffff2d56a395", -"pubKeyOperator": "03e387352258339b3f9a5c3f5353ef3dc234af947fa649bb359694b6daa43ab4d5d907e711f5de2e9ca7f6130f0ad69b", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "414e1d6c450bd4ecbb46ade5b65ed5d77856e76618523474d522f61604ea26ae", -"confirmedHash": "fcc2390dd6f767ffa03204bb796825a486bec661a48e0f640900000000000000", -"service": "00000000000000000000ffffa763853a", -"pubKeyOperator": "16fd7716c91f35a18f48f9dc33a3e95e0b7fe37be2b315ba9397e99fd284f46180f9b6934184bf785b7680c30afb178a", -"votingAddress": "gUuB8bu2vLwu6cktFyY69i5R1Sw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4174506f522f4a42f3ff99e7a50aee0a7cdd06ecaae3b6191b273146de1720e1", -"confirmedHash": "24fd11326f27d79a3f436bae9b2799f37dbef46af9893a960300000000000000", -"service": "00000000000000000000ffff90ca14b4", -"pubKeyOperator": "09e6c73bcff33190705364cc73b96ec2fad4903b7226b25cdf8d8777a2148a38a4e3c84557b9dda208a2bba295e2e3ef", -"votingAddress": "quiM8D7Lo24YqnwhRy95g5Cxy4d", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "417a8fd828e8cc3066ea0740e66280159ec333dab6cf32029bc4c0309c4b73bd", -"confirmedHash": "772f3d1556b293194f3898274545b9a9a2f1271fd6cd5b630700000000000000", -"service": "00000000000000000000ffff55d1f179", -"pubKeyOperator": "83f5edb88d2ca16a2717d354482604d7717758151e57365f56194d3e13b91aa07795d589ca314ccf2c5b20680ea0deba", -"votingAddress": "3tAf9ZLitYxP2W9MQrbV9ZBgGtBT", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "418dba7f76e69c7f84de9e3a040438518a08e541bd33b604f2f641774266c8a7", -"confirmedHash": "e00b325a4a68df8a67c70bff60f552f374b4565f51a279e31400000000000000", -"service": "00000000000000000000ffff2d38406b", -"pubKeyOperator": "8e8abee19a0cd95478d437aa25460cd677e9e1c1724709a4807d86aca1db77b83f6571a20cde97312c558a6b5cd92bd9", -"votingAddress": "2soKbCyFGKpkhjtHGAg9PfovRqH9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "419a9769cc1fb0e922bf50a61327dd55d24bef344e2ef7faa2613fb12845327e", -"confirmedHash": "92b683438f3e5e5d94bbbdb09159ea8ac752d0ae4b5aaf641400000000000000", -"service": "00000000000000000000ffff55d1f272", -"pubKeyOperator": "19f684099747288eee8cc152222b0290b16ac2da3504f5c2b2db78a0727cdf5ea92496392674a8a49a9a5bf9ba0bbbaa", -"votingAddress": "4AZY6JqKLoHgk76yn6tSjuMC4bqY", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "41d0af16395a58e8ba8e5128606b0eb862553ccd341fac687bb0eb94c3dbadb4", -"confirmedHash": "39b34bf0a13f3e303e7716a187db528408b7ae77144bd1050300000000000000", -"service": "00000000000000000000ffff038e49b1", -"pubKeyOperator": "915ae8ad725828d58c1d5867994d050d4dde52f7917292e53041692c1ca2cad59a0e2ecbe509358db8f01cdf5249ce04", -"votingAddress": "2PUP4dUWK828TWDxkRE2TwAbPtEY", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "41d2d8ca7651f329595208b2ec4e5dcaa1c151e16b37a3ee42645a8861c6b6b2", -"confirmedHash": "825ff51efd7ed0fc1fc428520486adf4d7acec61b83d33cf0b00000000000000", -"service": "00000000000000000000ffff55d1f258", -"pubKeyOperator": "88062af20293f657edb7dd810a003ca0988550b12bcf8d7b9bd52e5d1c06cf2ed55516ec0a37004a07aa7053c2948d35", -"votingAddress": "3v6UD3Qk1XYZtdagFVF97W5tTfk4", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "41d4315160ed4950babe1b62400d3424c411840c78dea248701cd125b12c4a21", -"confirmedHash": "92d718081ad7d98a77f15bd77879cf99f96715d805297ca61200000000000000", -"service": "00000000000000000000ffff68ee90c8", -"pubKeyOperator": "878b5eda4436f4365b7d56324176e260fdc5074582e9f683e529fed601eaa0171a2fed89ad1739f86386bd72672732bb", -"votingAddress": "3bxbKJiVvYNArsfeySSZewAMQ4C7", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "41dd6ff1fd10e9b89eed5faadf80bfa4f4417714ef83e2a0a2b0146b34d1c254", -"confirmedHash": "ebd42564915adc6b754b3ebfbd3393e6042b07d3cebafa8a1300000000000000", -"service": "00000000000000000000ffffb23fec63", -"pubKeyOperator": "914b6b5b8b3d95b3147ebc9a0bf9b66ffa0024839070fdf300cb3416df01e52b9f6c9d630d92350cdc992cb79bb89fee", -"votingAddress": "tAzVkqeu7Af2S11WEwt6AWk9yzS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "41f4c5cbbc471bd592d4d865f975672d8892afb95f9c3ed7f0e70e978f5ffafa", -"confirmedHash": "08540ff0c09bce8d2f577a0051a7dee96a87c5f14688a4ba3e00000000000000", -"service": "00000000000000000000ffff92b9ada9", -"pubKeyOperator": "81aedb392d173e88e79ff8be168835ae2a59d42ede627973c1ce7f583d33fe06bb473c204415fccefde374b14dbfaf8e", -"votingAddress": "3LvSiJnUxA43eWQbzh6aM3TuWKkE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "41f92408f7bb98bdde7ead3d9d48aaa70b4de2b097ebf77d39b62f6795a97899", -"confirmedHash": "a0809ed2802d1e0e86020b46febe3f5a5145e96d188a78b90200000000000000", -"service": "00000000000000000000ffffb23fec73", -"pubKeyOperator": "0869d8fedf9732a7c72548b6598e4c0b12c9403b7a149ec062ccbd2256bed946c6195a80f2df71144545eebb07ee6491", -"votingAddress": "26AYNEFn31kQ3QykyjoMQjT7GGTz", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "420cc1e1f66bb0938fc61da63ed5be99567b31785767ae103bbdf1bdc895fac8", -"confirmedHash": "668c8a3a4cec681c9119422ead12f254dad5adefba94107a1200000000000000", -"service": "00000000000000000000ffff5eb0ee0e", -"pubKeyOperator": "85c58fb16ae0e4730de15b237ebb1f88e93cd4c4002666872dcadcc50186edadfd0434163079f8365e77a7e373da46f2", -"votingAddress": "4CFZWBHdYvkhYFaw4kxuoqQbDyCF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4214e898a1680b35e0c76b38db64fbda1af01c299a21c28ac533d11c80d6a27c", -"confirmedHash": "4868cba3843088b95b2374e9f15e35c0421e321fece45ebd0000000000000000", -"service": "00000000000000000000ffffb23fec67", -"pubKeyOperator": "8cf96ffb6230fd9a4072970b9f1c3eb172ef9e88ec9aaa173130fd25aef55002d2ecd49758673ab07b1e99e1c102e8b7", -"votingAddress": "23FRKDMXqFY6y4s8a3aqe5VFJUqn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "422db80f47c9480455871d1de86144c53136b3def4f1bcc766c244984c805a35", -"confirmedHash": "febd7cf2dbff136eac5a7846e14a825bd5906aabfefa26030800000000000000", -"service": "00000000000000000000ffff2d20f5eb", -"pubKeyOperator": "17be119dd16bd6b141fd715b34f143809b66292f93a0b726a929898d6a1e2579f3864ef020b27185800a95ae50c057b1", -"votingAddress": "2ShY7JFdSyqHs44HY7UC2Ng3h21E", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "422e9585ddf738ab2114b1d1f6446741c3b350955897a80fb7ce39d4ab6da6af", -"confirmedHash": "5100e4f7c2eacc3f3832e6feb4c44a38058a941d565483e00000000000000000", -"service": "00000000000000000000ffffbc28f170", -"pubKeyOperator": "01c4450161c3e980cd43dd30ee7125c8082037867d5bdca8552e5c3f5c300ec303989c28e99bbe056a2d88860fc03d56", -"votingAddress": "2J6WrLwphQErQcsy2uFdpNFZzivR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4239cb071d2e496744a0a97b928616d212e61a6b55c2cf463b810cd7315c9b80", -"confirmedHash": "9cce9c94f0b3ce5295e804efa3a562ceb2ca1ee47007d2d70b00000000000000", -"service": "00000000000000000000ffff904cee02", -"pubKeyOperator": "01d0ce1659fbb69190408b8985939db957a317f1bba85632f7aaa3d234edd83d3fefe4ae2ce8a75d0e378ff23bcf4cad", -"votingAddress": "GafnfTiXC5pWna7s7Mcxp3WZFyk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "424d69c46e0c64d506a43765f1f51c785d05efea7c673e84fa99ee56db02195e", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6d7fd", -"pubKeyOperator": "0ec78a198dfd16c2b4704f11b010216c5373992acf3bee71f6d66e9e8f50eea1204c0cbd6db661f7af975fab7ced9225", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "42551d2ca42abfe9434107fbd6f199d75b37373c83bafad53994fa2cdc3f54cc", -"confirmedHash": "705768dffec5170cf129905675002e3050904b5fe58616841600000000000000", -"service": "00000000000000000000ffffbc28f169", -"pubKeyOperator": "12585cfaac58c81f37ef716c449476f14e1f3c3a8a91a918bb15a72cc4ae957e8e7109af86f858ffe91899e1d29a1812", -"votingAddress": "2Fd3hGjGEm1g6XtpDWPo3bEEJjDM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4263f4846443d710fb46298e2108e8de33bf98ec72b73ffc06ee0be35cd6195a", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff0363632d", -"pubKeyOperator": "918141ed5626245466e918e094b57d3bb86abf1058b3256ea909237c4285c7276bd100892fe3dff1e3f36a8c431daf4d", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "42681a9037482af78c783367ec1e1e7cc39d47a7f5ccba6dd724cd9838a1dd8d", -"confirmedHash": "345350e93923bb1ddd7da8d651bac599b27b136feb4952541a00000000000000", -"service": "00000000000000000000ffff05b75fc2", -"pubKeyOperator": "89d7dae41836e3f268b01ad2b0db8ea4a43d2d3b2f369041646d69f8fe9287020e6c8a79ca6e7ff033420c4cd42433b1", -"votingAddress": "44quR6TLsZqhJzSuXaVauTLKnx6v", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "427251f4d6b520fcc20c32c05e8c590b1b2f56ca47fdae50f39bbe6182b4bd2f", -"confirmedHash": "978a10f8500a193c625472b89c1621eaab4d1d56e8a4a4780800000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "aF8DEBAaw9jjw1ko2Yk5Kf9neuq", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4274ca51d926f6101ee57ca679154fd94b5e802a3407596e02226a5eaa9838b5", -"confirmedHash": "a957139e1bb4c820b60e2af2aa46e85cf1619b401495086c1900000000000000", -"service": "00000000000000000000ffff33c3d9ba", -"pubKeyOperator": "0721d96eea01880f0245d6b5d22bc75a663bf66bb49d22ee76b9bc59adcc9ec2cb5d88117f4ee8ce4e0ef61cf3dfd309", -"votingAddress": "3hY3oREtqracDYBmER7KiUpW2XNW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4283b756bbe5e4148ad51bebec76450eff9c6cda3d84599685f9eb113369bcfb", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff8491996c", -"pubKeyOperator": "089be36c7dee6f9e35bbfa1b06d73831b68252e6648c5a99c749331c51a5b6c0cc910a09f410274db4ee47175df50395", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "428923d65b41e87a11837f3887965a5cfb29ba1453522644b338f312a0e665a8", -"confirmedHash": "baabd814781e1e5098b3488021f389964be8e6a9f32449570000000000000000", -"service": "00000000000000000000ffff2d55752a", -"pubKeyOperator": "14fbf94255a7935f53568f8f0665ae4dbce603431b6b34db489725ba3280090dd293ab3953a3fccb8d0c51d65f293c81", -"votingAddress": "AqNKhkaKGPG4t6juBEBErJpUYpe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4296e7244261690395407a50d40ade878ddb9d296df6358f73b41691ae35b569", -"confirmedHash": "a85fca9079c952dd736505bcd851a91aad44499894f4f1fe2800000000000000", -"service": "00000000000000000000ffff340e4da8", -"pubKeyOperator": "00d670c4641725f45285182a77b799ce2e7cb9d9d28ae6d16fce6491bcb266162484f79d41910263b6838feba6728742", -"votingAddress": "28cW54W4jbyUctiVyqPLbMkDWtrK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "42a5f1076d8cc03b126da5126e660776960096f1f39ea20749ef704c1ab9cf68", -"confirmedHash": "343603bafc9398885bfeafc55b1f02286a6b5b28894b89171500000000000000", -"service": "00000000000000000000ffffbc28b6c1", -"pubKeyOperator": "9101b9f4c6c6c76c0996ad0826f1124d12301e5a0b3216ff93a76327c16362d644fe6e01bffa8b2b37cb980ee894b70c", -"votingAddress": "6vUsuMouxZ1TGT8ZNsLJAbr3oCj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "42a7268cee0a28b615a2925c3534050b7693bab9d340e4232087ed7180c67fbc", -"confirmedHash": "5c9dce81616ea651b1b98c79ad2f12bf06652528bc11b3051600000000000000", -"service": "00000000000000000000ffff951cc6c6", -"pubKeyOperator": "0d403ce898d35db78be1ce0a1b91bacf98265617e5715b72f6f11ddbeb4b95c7204fb826a65f7a75753a98e7ea3ef99e", -"votingAddress": "2dmTX9eTLZLG39uSs3WjsCVmveLa", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "42af00b2ea557276fdd850c385c85235628c72db849d6994ec6e4523b75e3a50", -"confirmedHash": "b25d547dd3f4ef9947aceea7043c87a38aa12370dc114f001200000000000000", -"service": "00000000000000000000ffff50d1edca", -"pubKeyOperator": "0a07d9ae599cbe0302d1880e888e570d9bea6e4aa99349bf3cf8dd0d73a4ded69f116942507678a84790dd0d42feefc3", -"votingAddress": "4C5Rcy3GaCjuHUFhKWKtvQ8t85YV", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "42b479cbe642b7321ce0cdeeaa35e25f23fef0eeb81435afba7507038f2881e6", -"confirmedHash": "8b0d7e904626194397804b5e090b115eab807b2fc5dd314a2300000000000000", -"service": "00000000000000000000ffff867a2614", -"pubKeyOperator": "00ca402515cc7cc8ae8e69c8f5ac398da686cefeff5ed78556cfe0ab6bc91a67164da7d1a75be2c7f1af24bcf34ce10d", -"votingAddress": "3aC6HjSNfdjeDk33WaXGT4j9Q6VG", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "42bddbfa1687875465664e4a81703c29ab75ca0eb420d79b6f66b2519d211bd4", -"confirmedHash": "170e70342e7f798161db75060154e57b8b80479b77a25f210a00000000000000", -"service": "00000000000000000000ffff52d315bb", -"pubKeyOperator": "14a49eadd093b3b508ff43fd7e0950a6d151acaf8e188ca84b1d981ec0be689afbfcfad8a66740fa49c4934457e08ea6", -"votingAddress": "KL8aeMMWELFg6tA3C4jsZ6tdmRM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "42dc02b4f96b2a3cfde0d5836c780f6945ea8be8ee4dd80b843e8d36d38b9c57", -"confirmedHash": "d91a967289b8ad3885e7065fc98ba1e8936b323625ec28023400000000000000", -"service": "00000000000000000000ffff80c7890a", -"pubKeyOperator": "8e63f2eb4a5f457bfa462456e7bd0929e3adaa2c567dd8814a597b4c38e654ea8ced746c78cc1b4782f081f0b3bcb8d1", -"votingAddress": "AockazRxXZetR5DitjzcJBEfMCu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "42ed3624e76c2fd116c716157459dd19cbad008c4c61d3fddb3c9c802fc55ae7", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96880cb7", -"pubKeyOperator": "85b8b319c8bfa98483c6a084445fa0d57ce112af7f8eb3242b3f7cf65e0436020b0602764ad5dc1ff832e3143ecae66c", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "430f755ce7d492eaa36ab473914a40c6d309184604ecbc181517ded80a7bd18d", -"confirmedHash": "f8cee2ebbd094e52f1e6a97fc5c891fc859ba0508a42ad251600000000000000", -"service": "00000000000000000000ffff8a44a0a3", -"pubKeyOperator": "08e8249d271621ebf0b38c83285e519bd73e417f61f4e059eecd6410d1f001ed07862749f6c7fe2d91afe2c94cc024f9", -"votingAddress": "3LD1bajxK377dC5wXA1Uyxzr581D", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "430fcc341c597ba01885f32667bed6617e7a3dd4deb616b44c50eeeb8e08b0e8", -"confirmedHash": "8e24590c9511b80589b8c145b2bc4a4d10fae365caf59ec31d00000000000000", -"service": "00000000000000000000ffffc3b5d211", -"pubKeyOperator": "0fa5210e16c5e58a21cf898b26ea815e6ee7afdde1e5646d2664676dd622c698e25fc74a493c1c02fb5277d4df5f52a1", -"votingAddress": "3nfziMGSrDf4yFYGCDY4WAppRqnm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "432090b9a71a2ba9468b33f1cb9495e89f0639c97f42f98825d6989facbf1b07", -"confirmedHash": "1ab7c2de8064fce0873c8f0aba50af10681414d40853d0932d00000000000000", -"service": "00000000000000000000ffffadd4da82", -"pubKeyOperator": "0b6c8f838104d5e8d25914be92ceea07dff3357c4f0ee1b93d236b27d2501bc213b030dd72fdcbe2c1a3950d51894bda", -"votingAddress": "2VVAnLEkrsTZMyBx4eaHZuz6PJoV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "43272a9de42acf763bb0cd429f70d785b54394c957fceb08b8a448817fbdb86d", -"confirmedHash": "59dedcb564479592f8a803c8bdc8a26d2df3e34c0d03b8171000000000000000", -"service": "00000000000000000000ffff55d1f1c2", -"pubKeyOperator": "11b56323fddb754b36edf950f217fa32b934bb9c936cd3de7598142249c151c9a65798debd8727517e046c3b0e521e97", -"votingAddress": "3YhBuuwrwtFrX3VcxWRW3VNUCoip", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4336dd64f4ce1c2a0a9ee7a2c31aaacfb666d230d2608896de33ee7ed52168fc", -"confirmedHash": "35702ad0eeec9b15bb4c3976f1e61ac5877337acc9cab5260900000000000000", -"service": "00000000000000000000ffff33c35a07", -"pubKeyOperator": "0a9548d4fbf623812e7528d291b7c5efa33beda374d812966935ce8f50a133321f6b4aff61d6571906e55e22274d36b4", -"votingAddress": "3KG4Vy2mgCrAx2NoUtSG2RVNc7vp", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "434f10cdbeee76167829fb1e7762f2334e4da0a897e85e20340909cf95aeec37", -"confirmedHash": "684178c25a5de77b3efb75710995a5c3319618e51c6cd8d51600000000000000", -"service": "00000000000000000000ffff951c945a", -"pubKeyOperator": "99d36aef0dac97efcfd2018b71286803718594a17bf77aba3bb9aec254da879feb6b10859abc784081d7e602b2b6dc63", -"votingAddress": "4EpepUqbQ3TtCi9GXFsqz47b1vNX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "435df7434f31c070c81686191f2d471b0924112db9a1d2a02a8dfcded6d4a330", -"confirmedHash": "eefa2327ca9e07fde972f64c2c7e477a2ea16a7b9acc55681300000000000000", -"service": "00000000000000000000ffffc11d396c", -"pubKeyOperator": "0abc9b9ee35465c024cf4c72ed60dcb600c8657e6deff6f4ad69400b5f3a9d5140bb7c09c5262cd1265c093a7cb6c184", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4379017c5dd6a639afeda48cfb59fff46979f94a4a3f953805579c126a73b3fd", -"confirmedHash": "669191afe763e69cb15f46cb2d4cdf08e0316cf02a76035e0500000000000000", -"service": "00000000000000000000ffff6c3df746", -"pubKeyOperator": "086a99752a3fa409f8fe635124950456337622d04df22e005b32db00c1c5febe2d42e3c33ed384c672d2015f5b7dd2d7", -"votingAddress": "3Z589tFzuCAXjE5NMJypNp5214KF", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "43793673dbc447854fc0e302bd930fae7f6d56952951e64170783b3267417bd3", -"confirmedHash": "be4c14f2c71810077d414567a5f814aca7e45ac9ad1a931b0d00000000000000", -"service": "00000000000000000000ffffa763b6fa", -"pubKeyOperator": "165401322ce721b07dd1f97b15916c537870b1211e2023f897671a1fffef29ec8ba252569b99d97ae154257be1744ed2", -"votingAddress": "28rnw2zNgZ2fmAJNq5D3m8Rg9AiF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "437ecf5befa6d0f52da209f5a313825dbfc93c178f9fe66ac881d85a74785754", -"confirmedHash": "b5ee91701b4de55eb4e6b46220a0e2cb88c64321f941a1941800000000000000", -"service": "00000000000000000000ffff03d2a99a", -"pubKeyOperator": "9585bbe7eca3096bab622c63e2b16723b88dd76a88c42eab8a10aebd26ce28c4a75acec6d3bf7312e88521d80c25b2a7", -"votingAddress": "dWXGX9b85jsUTzQNVwrbXknd6En", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "43a76834feee290084ddc50a8956356363994603e6a02d1c992dacd2e5b5ef37", -"confirmedHash": "c88aa18f4a7057f170fe52e61d61a12d6cebf92c23e3f5b60600000000000000", -"service": "00000000000000000000ffffcfa74019", -"pubKeyOperator": "916bbb30e0757055b7d8b8f946aa95c8b8a766d597b73d6606f50fa10213a73dedfb39e1068a073db70d7fe72b523c7f", -"votingAddress": "Bp8rZz13xBzxMCmna1m46UD76zA", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "43c2c6bcd8e3773ec51ba8db24fe0dc731fd9d9f245518c6ee18d0619175c3f8", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0c2", -"pubKeyOperator": "03c50d169a9f36561520147b7ea90b2277e038e5a1b60b34fc6339355ba112295b1c0e4b065d9dd29ee41abfae6298f7", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "43c45a4a2f2e77c0e9c2c3d48d8908c5ee131ccb0ab21a23fc9e13bac64956cf", -"confirmedHash": "b30249989ad88d3052aa3a317100f092bf229d2c9929c0632f00000000000000", -"service": "00000000000000000000ffff9a553279", -"pubKeyOperator": "93d686e450dbf1fc6ce876043651ba7bf07e5baa337b25ab650017efbf7f1dce3d2f8e952905e6e0dae75d4d70093ff2", -"votingAddress": "4VHi9LKY3RaCqHs7GE86CDUDn515", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "43d8ff3f625fbfe97a582f43393087ac3b391b7cee437c506d9c1b35b1cb95b2", -"confirmedHash": "4eb09dba76634f8ea98934dba9ed53d07b6680bcc83bbe310800000000000000", -"service": "00000000000000000000ffff3625c7e4", -"pubKeyOperator": "80389e6d198ac2e5947153a4500d3ff4684eccaa111941660d83c6871dbedbf4878eeb46587f37ee4e57fa048f69f09e", -"votingAddress": "ww8ojystceEWuU6chp4Qk8ec2JG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "43eee71f9820d17e8dc30e6017e11995d857f712456c08d2a0d8ae3999eb1b61", -"confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", -"service": "00000000000000000000ffff52d31591", -"pubKeyOperator": "13180f0ca3ba7a83b7079269b06a2ed78e54157cd8fa69a45549f01e0edecd72eb29b27fbbaada27c36b52f110ee4b41", -"votingAddress": "4MjjNLFZj3bTfyppT1NAYLRrab4Z", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "43f0625263004ac4bedb0edc1fe2fc158f805e2d277d98b35160a8f79a078a9b", -"confirmedHash": "3e7141b3b2e001829317b1b0acfa85ad223589654926a2382900000000000000", -"service": "00000000000000000000ffff52d3155f", -"pubKeyOperator": "91d3bd3a83c25b6eb25d70af6f31743fb9280a2019444320d8429d9cc3ccdddca73ad916adcfb8c0bbdaa58668bb7ba9", -"votingAddress": "uESc8oZPV4gWyeQawd3qNK6x1wx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4405aabb62e1b8b3e27d433bf91fd065daa76982d0db1ca8cf9bd679c0990b01", -"confirmedHash": "80dc74a7e1eb3f19955c08a61d95eab79d939eae155e80120700000000000000", -"service": "00000000000000000000ffff2e1ebdfe", -"pubKeyOperator": "1461ef01a4a5a962c7f171addb292d751602f5b308741597bf343852a58f0bdb52b9007d8ed82f5e8638fa317ecb44d1", -"votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "440f817cb92a7049bf0f703680b26d1abde0c40700c0b3e008ccc4c00912ab15", -"confirmedHash": "d7c09d08a000032b10c21cac416b8dd08b45682423f35c130b00000000000000", -"service": "00000000000000000000ffffb2801b04", -"pubKeyOperator": "8669cddb5fb4aca1e2c215fb8652bcee79619cb226a0d9e3b795960ef9c789b976cab8623a765e70de289ef5752f82f7", -"votingAddress": "2GVQdynPgX8n65gTgS451x5pg4Cz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "44138dbac132b06dc8b876d10bf12e61432094db1b65a5e001e1ff37c36cb5a4", -"confirmedHash": "e4c822f9bc57e2e5e3c22c7f3143258f501218c3bbc786951f00000000000000", -"service": "00000000000000000000ffff52d3192e", -"pubKeyOperator": "09c0ee0fa20fe6355e2cf84ca77799f3a39ca5794bcfc7dc4c78b747f7cad5d18dc54fa7963462bafc8565e92a8a0472", -"votingAddress": "jsiM2uaeBjRQuge43D5MJyGnUA3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "442c9e20e80ad58ab531fdd549c22aad5b035bd74c3c97d9487d4f7607e043dc", -"confirmedHash": "9a38f751969376060709bcbc6396ae1da7bbf8acaa95b1f40600000000000000", -"service": "00000000000000000000ffff0feba75e", -"pubKeyOperator": "8b915f7285c29ad644781d285ea2abbca183bc1504f3b05fe9f2f4646d97947decfe7c9dca0e3c1998c95e69a5598a8e", -"votingAddress": "3aKLyj6ETX7hA83n1KCWRsGtxNhr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "44368a7c79abf605c3a518610a3f9802f649ea2aede88ad2b1e96c9a5fc5e656", -"confirmedHash": "2dee9be557bd155ebc62f82fb4195e5290ce5ab04fffc76c0300000000000000", -"service": "00000000000000000000ffff5fb395ee", -"pubKeyOperator": "90f0095d280dbd4323df1a1aae6e1e02b1978c5f3d11ea381d9b4fd55638db9c55ba8a8337bc9072d7f638343bee0479", -"votingAddress": "3GZJCpdig3FzzphPjNCqscCbgd9z", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4438fc7432417719a88cb485276e5ab603d912ef8dcf0ec5dac5fa2951b8de38", -"confirmedHash": "1d6fedff169df03a36a10c4c834acb785692ec120538e2770f00000000000000", -"service": "00000000000000000000ffff9f45c2a4", -"pubKeyOperator": "01589a6f197ede4aa7c1f944254cf7cc545f752a7e7be81e5d8625b5e23585ffb0d488cc5ffa592037f5ad3b0952c3fd", -"votingAddress": "Ea9WeNVMKdMhEF63HEnMToVgQuz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "443938b68ddd990babb688cb6eee0e343b5e1ffd827e869fab301f9cbc0c9a16", -"confirmedHash": "f94ea6f3829d036f926bf7df88a3dfce19d2a934c19874380100000000000000", -"service": "00000000000000000000ffffbc28fbc0", -"pubKeyOperator": "86b79ef2c5d3012a2d5c537ba0e1c05232e0580187f6f867d4e03dfd232caae11a6863a253eb3d248eab2ede3483d147", -"votingAddress": "fPeWwM6rMSjb7rxKvv5vYbdh9xB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "443ed5577d556d0674acbabe60500b276310319499ed64f56abe160c6183451d", -"confirmedHash": "2b401a45f10f95af236b32f5a9cc91f6e2b606dded0e0b092000000000000000", -"service": "00000000000000000000ffff5f5501c5", -"pubKeyOperator": "0bc736e83a785770158e9639f91f4c4a4ca71795ba9205bcf3b6ce4b2ca4a69971b214586c0fbf1c57897f515b90f641", -"votingAddress": "4SK8ANxzfvTLcYZEcBKFRdtS9134", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "44415e6ff0f164ce52bc6d36031bca0b56b036faabcce9a7117df1101412c0e7", -"confirmedHash": "1a8f890ab7384594be16334c0d8d0c47184c7e1020295fea4b00000000000000", -"service": "00000000000000000000ffffbc28e70b", -"pubKeyOperator": "80de6f6b2b9137fab1fa8dd8d61de04582a42deaf8c6879f62d8d48dfae9c71a2129c23e3de354b21de76b4f77c014e4", -"votingAddress": "4LK7xSe893NnZtZSu3zTBYquCQn2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "444d84488aaee6388d85c04fa3f730fd7122a5e2387aed23197699003cd4dd17", -"confirmedHash": "add6206aa6ebfe66875d4af4c33bbeab02195617063a748c0700000000000000", -"service": "00000000000000000000ffff55d1f1bf", -"pubKeyOperator": "15363b4c5aa192e62bd88af0dfd1a84f9da681065aec68c98b44d25319acd283af95700cd273a5c3f5e3d0dae31535e2", -"votingAddress": "GhDcjatVKiQ843BXTMDHKZ4LwzH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4451d21f554ff052c2b638d23181ef3c8c2b254d937bb8b513c0e229f05b2e0b", -"confirmedHash": "bc808855527a8435db0c15489d60b04943a812cf5455c1e61b00000000000000", -"service": "00000000000000000000ffffb23e6ae7", -"pubKeyOperator": "992c2cf8a08a527c1865882097b6d37dc4dff1f898ef9fabb11c87c5340df6e797c265add4ee2a82980b282d1d74ea1f", -"votingAddress": "33KtUxMJtDgw3w5RcPBLJghN2YcD", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "44536b0436362451d9a4ad5853bf404202bb4919863079f6636865f6e89c5ef0", -"confirmedHash": "cda29b67ce0828b2618f89f898b47f3c596f0c080b42260c1700000000000000", -"service": "00000000000000000000ffffd4186c53", -"pubKeyOperator": "83e490194fb5a30747f2bea60cedfb61b437713edf8e81ebefc4ee8f30905de7e6912727298ba2036b81c4bf7c36cac7", -"votingAddress": "44KBTr9AWwoonnLvQHEFj6LgQDbG", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4472f925c242d04f4e5a2cdc2a97627c4d7ba8460f1d6dba4b6497d245d635e7", -"confirmedHash": "43b3caf59cbc5331ce20c7c1be57c84ded106d611d049e4f0000000000000000", -"service": "00000000000000000000ffffb07b39de", -"pubKeyOperator": "83ae1be57b8b0337519ad33a3543c3ce9647caa71f4851ab1e6004a04f789017d2093facb6fbbe3613f1ffc770796be1", -"votingAddress": "kMD57f1vvELwxBy8YvtPjw7Kys4", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "448d6d404ee38aa57fa1de46550f3e4aa3c8b865a1397ac2a0116c7d30440a97", -"confirmedHash": "1cde1253ba534b618baf3a256741b40c82c161debae58be90000000000000000", -"service": "00000000000000000000ffff36e195ce", -"pubKeyOperator": "16a61756fac438d47d5dd3361d1f8974a0898f87908f4b6d497348bae9eb1c0fdd16d7741bab7dff3d7d7f49e6052404", -"votingAddress": "2qcuGXZ87S3vT7gF9Wcd5B5NzUsE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4494a1246ca7322b9833473d1b588bbf0b27da14356065126109f5c248de694f", -"confirmedHash": "28114ab15a2348386a961aa30558697f39bf066561a30bd12700000000000000", -"service": "00000000000000000000ffff8bb4da68", -"pubKeyOperator": "12d204cac127c64988bdd46ea845a61751ac79d5afe61e2f0baf08b79a73c09c3a84fe6683be69c32235e186f339177c", -"votingAddress": "RDwKub957KYyBGkDuQn2ot1Ggv5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4498b6c815057319b846e5e6ac645e0cd8945a50d21e4dd262a4f43fc741be89", -"confirmedHash": "69d9e9003c1193e74ff2e13604950c83d171c99c76624b3e0900000000000000", -"service": "00000000000000000000ffffc28755df", -"pubKeyOperator": "05d648843d98dd640821baaeae3a2a02af241dd0e7b84ef4d07b5e6eeeadb5cee0d3be8a9b67f5fa92744796077d6a53", -"votingAddress": "3YdNQTh2SzKytwDbQkG5ioV3zFy4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "44a934fbf7ff8564066d59936b179e14052c0cd7ea094d89482af3fccd82cfd1", -"confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", -"service": "00000000000000000000ffff74cb1380", -"pubKeyOperator": "00755788e80357e99062b2de07500282d7f4f3ff2452009ad308dc6ed3f15f09ecb4b65a4d8f1158fa04414a985fc0e9", -"votingAddress": "4AVLhxKvLVBAzWTwuDceycbEbh6m", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "44b5f36328b282eecc5c6f61d784537320990d099f410f8766dd1d57a1ba9b85", -"confirmedHash": "9bfa9a03e826cc43582482c443d0cc686f2a867793233c981100000000000000", -"service": "00000000000000000000ffff55d1f1ef", -"pubKeyOperator": "8c6f7128339f9e6a84153d51a2570559f8c12f8a2abaa0b9d9c7fb7206c9c04b93582333c739131571585faf7ca54935", -"votingAddress": "orKH3yTmPZM3pyowJ4vqhTtBzJD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "44bb179b5ff05edd46d7eb2fd16e328a55e0764cf4688fd8270660b50a852425", -"confirmedHash": "b9f0abb87d86c484e51d4bf5cad1a09823a4fcab61213b170000000000000000", -"service": "00000000000000000000ffff55d1f18e", -"pubKeyOperator": "1487ce9fd2001fc3d30496fdf73ce521369123db23a52f2edcdee20615a4c1ef320a8b166d6a8967776aa988e3f7f6bc", -"votingAddress": "qcxUCkBdyWko6T7x2jMAp2UywjX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "44f2d8f45ff753dabbad9785919ff78a279f0e16f6834fa45fbe298ac93851be", -"confirmedHash": "c43a6a5f5da7ca9dad2077be182790c4dfa7fffb886c54a30f00000000000000", -"service": "00000000000000000000ffff55d1f1dd", -"pubKeyOperator": "88f7ae58b4e78d3909f6e648b5db7573a7d3b1d5d71ff9985e95c1466c2a4e9057450ddc810265fbab39e011d7729fdc", -"votingAddress": "33gfkdqGVExZujd5wu961KJCLr4n", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4501f377150d7053fbe88ec8ed0782d3cb589c914e56c5d4046f4be4a4db4390", -"confirmedHash": "e36c97ee6a64d6516bc4a04a68c914929bd1ae6746d339880800000000000000", -"service": "00000000000000000000ffff40e326c4", -"pubKeyOperator": "0784248b3ef562bac4a470e34364d4d032666ac3fcc1a4c12d794a1c8499be9449de76253a77e2c5f6f977b291a85c49", -"votingAddress": "2t7LxVBMLbmNKhrHkNV4khUbZGYi", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "45078eb575f1dc41ee3ffbb5c264de54c2aa0cdedb020e124e2d900d257b1486", -"confirmedHash": "1cd63232c5aefe7a0039e0d8b7511121f867ae1c2bd1c3dc2500000000000000", -"service": "00000000000000000000ffff50d1ebaa", -"pubKeyOperator": "83d6a79d6a5d006cac96816b47e17d473350537e1736fda22798bd7a3dcbd51ff2cb315c7517450b3a9a795057e07362", -"votingAddress": "2Y6ohank8Uxb8LkMfXGouBFUvijF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "450934286c73174baec6c44ae84b508d3d2908b1ddc40e32d2ff3f926df74859", -"confirmedHash": "a80045999a11bf5454dcc2663dc1b6d0e99b4d329491010a2f00000000000000", -"service": "00000000000000000000ffff3625c7ed", -"pubKeyOperator": "86e7781eb401f76e9184f5ed6ba0718700fa7e6ce84bb7dbe58d870af4559ec7fd3ec4bf85514e24177766d2c10247a5", -"votingAddress": "KhktjUmbUBrNhWxmvKgP6ZmMSet", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "45110115ad53a15daf3913b07320f51f2edef6e97ad30594798826e3a562534d", -"confirmedHash": "9f8cca2214769e23962cf39fa42fb3a0dccb30b8224a60312700000000000000", -"service": "00000000000000000000ffff334d71d9", -"pubKeyOperator": "011e3d9fb15dc40979cc2f9c845a80fa6ae91d08efe10bf91c69f304ed7b5281152f3f37e61246a2c01a58fc35df683b", -"votingAddress": "2UTXMEHsxA3PvKJLSfi9X24nvQoc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4515530f5944b4744811b9baf6fd6b1f4d07ac2393e95b5d388e4f0d9c3cf293", -"confirmedHash": "accb884a9b7c0dda94751cd0d688bb3ef8d1783660fa5db00c00000000000000", -"service": "00000000000000000000ffff88f3738b", -"pubKeyOperator": "0b5eaf284bb4022bf4e6a4f23f1be4b26163bfd7d11a170a63bc62d5fa28c8ac1fc8a4a680baf7e89e9e8e14170c97be", -"votingAddress": "4EFiRsCnbnj1Y5SnhiMeBJNGS8gL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "45286e38031c2532eb04d709459f337310b1881f85a89e14b68fbe6c2a53ca32", -"confirmedHash": "fe6ecbe1ff264210211859eb146ef81d02b104dcf23c878a0200000000000000", -"service": "00000000000000000000ffffb23febc8", -"pubKeyOperator": "0fa2f91a2b95f5ed862cf739fe01848e530697a430ca79af994c0f09be5a741324da97ea36739b579dec9510328a365d", -"votingAddress": "1Kq2B3RsNuyYSSqGsCWS1iTq546", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4535fd8d7dd94c0266b8a9452b64e8da7ff0dad61143e44b49a879d796a7010e", -"confirmedHash": "bab458b2fa385a93d9aeca67fe88e8e1d5bba10f10119cac0500000000000000", -"service": "00000000000000000000ffffc034a6d5", -"pubKeyOperator": "0b65238ab1bae0999a1e202bc8e0cbdb994f9d20e61bc9bd8b17afc3157142727f486510c745ce66bbd96d3b70e078c8", -"votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "454bce26dde61cce5a8190928ed2af0f95c5bc053c88170b1a653028b36a29a3", -"confirmedHash": "8027e58d935037bcd93c6713a3e1ceed8226deda2c5573d31a00000000000000", -"service": "00000000000000000000ffff4f621e37", -"pubKeyOperator": "04c4952bba25bc5f87212d46254c5988194252157d921bbf0c771c6afa1e45219f20fa5c7de1f62edf43e232d3d4971a", -"votingAddress": "3ouPmkDyu2Qu7gGRkQ5ViL8rpDie", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4557613502239ac5e5945ba05576d4dacfd71439b270c95483edc9c8c5b4d349", -"confirmedHash": "ee4b0fc2e092160032f46359fffed27fa9b2ad87a293cbc21000000000000000", -"service": "00000000000000000000ffffa7ac2082", -"pubKeyOperator": "82909c20b4e35416d3a6f3da080d1d3866646a31415c9e72adec44a826041b6568269d48dfc19378c8c9005115c87776", -"votingAddress": "Qp6Vi1nYFQKGnXpui39wTiv1H2Y", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "458511901c6a9a47e80eff577414daf449100a5c38d50bab68f13d46e5591945", -"confirmedHash": "d4c5106f0d969fd7a0ec148f3b56ef639b80e55fbc5a751b1a00000000000000", -"service": "00000000000000000000ffff2d557528", -"pubKeyOperator": "8538d58296efb817f9d5e6d5e685f04adc4f0d16e6a90b69fe31f8b4214de1c398bf5f60fa181557fd492ca3d8245e27", -"votingAddress": "46s7TchXVpRJN2YAFQo6akaNNZFL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4590b804030da31d9e4138a76b9db2c78bf1e86d9dabc0cc31e41739707e35a9", -"confirmedHash": "4b2df05a1194aa98d7d37f3d43175fa3066aebcc77cef5b51400000000000000", -"service": "00000000000000000000ffff8b3b483f", -"pubKeyOperator": "074f109089daa0b2d90ce44ea34142a346bf8021511b1a2ade5375a129033fe0a63afa04b8add17e63447c6207bbe7e0", -"votingAddress": "hhBcaY3AsJ5HoRJMZ7aPWNnaSJi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "45a3c62974a712c12011d0ccd008cded066e18574242d7f450901e7387787024", -"confirmedHash": "c4f9c0612247f0ab1f0b5950a61aede0f4a65047c399924b1600000000000000", -"service": "00000000000000000000ffff9f59a508", -"pubKeyOperator": "16aae8c5cebbc2110668bcb21d63e2f3ddcfdc78c5e9a31f7e7f10c20d2e4c7fd59ceb139a9903a88d6639711faec849", -"votingAddress": "26H8TFuxsXSu2drxBP8TjwQ4RZEa", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "45bd3800df2332aac023b9e6df2c94201db331f874591da18e9ede6970648fb1", -"confirmedHash": "8bb58bfae51b6118f60a6dfe609376f24ab9c1fb084a945a0d00000000000000", -"service": "00000000000000000000ffffa763fa70", -"pubKeyOperator": "860494418667420fe50dc48f68e4bf3bf0fc5267ecb23df80c169cc65b812e0b174e8d86d670be195f1926b4d5666865", -"votingAddress": "axeqXG6jC2V7ic2PEJSxv1WaDpv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "45c28c6916ca7df7174c50370b74f1bd161e0de9a6953f9f46f6e4dd1ba459d6", -"confirmedHash": "6ac41dde4c0f7816ec7e36add6c93465e418d12ec7cc1fb11c00000000000000", -"service": "00000000000000000000ffffcfa74078", -"pubKeyOperator": "0d87c6c8fc6707b20762fd3833e8492c7b7710520ec7a9a4d1fa015b7ac4861ed48288f7b5e10e0fab50e68d2ff81fd0", -"votingAddress": "48sbpts9pbsCQb1vUaPdvLavvRR6", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "45c33ab3d6987666349a3d9eaafa4250b171dd82f157084916599e41f0c6de2e", -"confirmedHash": "6a9ffc97a302872b729f442c3af0f7299cc451f0ace0db371200000000000000", -"service": "00000000000000000000ffff2d4c50e9", -"pubKeyOperator": "91a8b62d84551b83304248b3bc2419e55534d875fbf53ebb2024fdef4ab821959f01ec5686fd0c859840542acfb5517f", -"votingAddress": "txbARaXHgopb9KPXZhBvdKoSbYT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "45c4d7d274f8e47bba8eb3d2b06e581884299c032e1a5a67ca0098a999586be4", -"confirmedHash": "54b1326c6bc695a1b6fa4ed28960e001b84e8d0dfa70ef740f00000000000000", -"service": "00000000000000000000ffff52d319d2", -"pubKeyOperator": "92918cd9276bc709337022f262a45feb93750793f78d292fe51774672bca81cf9c092c35d9800278b4ca249a685bb617", -"votingAddress": "26Nor15yJixLkYtUNKUfk7wDGgne", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "45c6ee91c09ed198389415edeaffc47d278736190c92e8c92c49fe8d89708dac", -"confirmedHash": "a9c6a6b6cd293de50a2965afb537ac36387b9ef8939508c00f00000000000000", -"service": "00000000000000000000ffffadd4e3ba", -"pubKeyOperator": "0bfe7d128087e9dae0e26ba08b77eca84f9ca53b530b3bac19251161946bc164dbc33c810e7d6d539ef5981864aa8e62", -"votingAddress": "2tEpwzcCAcU23eG9dqGaFpEinB6R", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "45d589ea1ed13e98e7dd64ce0ba5ebd8b6d915ff2e6f843f84611c26df71baa5", -"confirmedHash": "38b17deace3b1c32081f9809e47e169c80f56967d1514c7a1600000000000000", -"service": "00000000000000000000ffffb280e2da", -"pubKeyOperator": "8a153b20bd3fe16489aa947822dc1785aba42da5d40e5429d092d36ea01cf2cf0e6ef10cae7cb7137664cb845da4c4f9", -"votingAddress": "2ywAY1fZs299Ug7sm3xVqfZ5VxQh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "45d676a90b877e989395103d32c67e054a5b7229d01ac0f1aefe39dbb0c17611", -"confirmedHash": "7e62152957c9a29d845fd76156204df5d6b8e0f7a82bcbcd0a00000000000000", -"service": "00000000000000000000ffff2cee7681", -"pubKeyOperator": "06422d3304066184bfa0b228262c1878a2f5703f4d440287987e3e94c4408f3107e4ac8e96bf8289a37dd9478c1cf750", -"votingAddress": "v5eALqdAo2Re3ZuEcMk1CtMhgXf", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "45d8f7817f7df12e1ca38664b71a5d75473f26330656eeef57625aa0b1f926b1", -"confirmedHash": "4130b5dc087f489c12277f886d58978ccf05fa57e694729d1400000000000000", -"service": "00000000000000000000ffff52d31968", -"pubKeyOperator": "085a3b6f1e747579c963a6a02c9877513e0ba7ef31bc522dcaaa413a41216d71dcd47ea163aafc4ac33fd1959c9b5e6c", -"votingAddress": "2VYvWK2CUqjKAF2d81jLLPVNpdoL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "45dad6e458c12a3799278872264fef5ea25bdfbc6548566a8be3b4f362444c9d", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b091", -"pubKeyOperator": "88f80766980d9d33cc75968cb1945bf408d18bf0504837246eda5faaf01dd4804aa8cb5db3e82f924c8fea2f200ce097", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "45e7b3b4fa090e455c4790bcc35e2bb485dc0f15b39f2f6297cdf283cdbc4de5", -"confirmedHash": "e52f8551426c75c73ffe0406d882b474240051c48da36e2c0700000000000000", -"service": "00000000000000000000ffff68f8234b", -"pubKeyOperator": "8b313d110459fd6a69c67ab5a9ebd1e8cd36f11c1cffd7ff0a4a424f06922e6f474275fa0a260d8e8f14ad73ae79ada8", -"votingAddress": "3rYY7APevsNf65sPJ2hscVTGLXzY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "45ecb56436b8e029c7e775114de6178eb8b29d5a6b860fa06c7849f814d35a90", -"confirmedHash": "1348daadd20bcc11b3a2094e3d74d8ed214383d3c70035760e00000000000000", -"service": "00000000000000000000ffff68838629", -"pubKeyOperator": "8f119742ce6c0ee1f7f7b40a9dec2db6ffa42ec0eabfc0adaa2fff298d5284f05abc79ed716697007b1382b78fea1936", -"votingAddress": "43YniWe7fvyjhpr77NisgXXtJ6uA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4601062dfccfb70f2067a8dd98a6f823e358d5d54f90f759f3ba02a458741a0d", -"confirmedHash": "174d0311b328961416002ac532559f358485df6e61dad1050100000000000000", -"service": "00000000000000000000ffff05b5ca0f", -"pubKeyOperator": "98c7239fbef11743af468e572c9b1cd77e70e9da72158131f10d91306a6bdd3f69b0b9e6c045a3a88b46d830c3727502", -"votingAddress": "mMYDtKUdmdY2Dh1VVTgZDdh4P5Q", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "461e76a1bb17d65ba8ac7c8df664b8a249723d09f9ac2a1398d6c9cadf80bf7d", -"confirmedHash": "8f082926cedcd44baa4f39e221689c1697236cf11fb1375d1000000000000000", -"service": "00000000000000000000ffffa877fc5c", -"pubKeyOperator": "8389539ced0efa7ce978a4bc6f0bc4cb2c3a8c72246f5321b3d3d7e37fdc8b2f2b251cb32b7b06a2a4b893c8d3ae3e46", -"votingAddress": "39AVav9rUusMaqqaWW16heKtjvDT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "465e099ba973da4b782bfc6a0380c105e789881a56e5a61712d88a735b027f2c", -"confirmedHash": "4a55d3cb84c4630d1f8424b7931fc7c632cfdc7918a03d371700000000000000", -"service": "00000000000000000000ffff52d31547", -"pubKeyOperator": "08c0bf3d78757eb6e6b4dc3a57b948362852cad3d23ba145571d1feb4a29eb5317526800ce5076b7bf61dc1fe1d1e11e", -"votingAddress": "Zn7tNUthy8ek1tuqPL5bHECVcgF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4670264f943990cb83711077625231ddfec2984dd38e529e8958f2b4b9c4a3ec", -"confirmedHash": "53a78b0c6cacf1ac96b3879798fa784d5c58addd6c4eaf660b00000000000000", -"service": "00000000000000000000ffff592fa5e6", -"pubKeyOperator": "0a9a261174a2e8e77cfc66a43215794d7fce1346faa579768a5a6f78a28854d8ef6dda8aa3609c3a2b9fe7732d945ad8", -"votingAddress": "2Jbjoz8N5jnpp8ggrUMBfGTmxozL", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4672ec6c6dfdd72eae5573ed5bcf26c9c68966bec23932e84bb03d3ed9a3481b", -"confirmedHash": "c2b553131ca62e703a7f5bd5add8168c6db4fe5760c5e0df0a00000000000000", -"service": "00000000000000000000ffff9f413a46", -"pubKeyOperator": "8330cbceac6b4eee305dce288dc62e4699da2700a53588de85a8f0601f5fa76bf739e2cb28f0894ed1cd02e35341624f", -"votingAddress": "3jWkSBurw4YfBfE6QQcAAKmjqV2h", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "467f112cacc590cec74c53c3da6f078699e887ce72de409db7c515fe66f87e21", -"confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", -"service": "00000000000000000000ffff87b558c1", -"pubKeyOperator": "11c0a0e84255dacf100803da7b19d4c66a4cc83082850fdc2e4e613686576fc5330956356a7eebbbe82551c966b25b80", -"votingAddress": "3PmKM7NKF3jaZKwoNurA2deBJSHU", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "469a25ebd6429157ab6d0daf57aad8d26a92e2e114fcb48da7bf0366417e7cd1", -"confirmedHash": "59923533474ab9296e6f2a3a207f5b688b367eb1492a249e0300000000000000", -"service": "00000000000000000000ffff91831dd6", -"pubKeyOperator": "190325e47a12b20446c64214b41d8b50d1e1574e303adb5fae4a57aaae2f9737053e1aa8c7b25e9d068be6d8f25b7e5d", -"votingAddress": "3FBXGrqBAgbURwxmDPgabDiz9ncd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "46a338609bdaec6183c6804ad65fbd8680021fb100f4c752d6010e1b20c56215", -"confirmedHash": "25e116baff45a873c2c5cbbe64d3c331a8778dd5c7f93ed22600000000000000", -"service": "00000000000000000000ffff5fb3f57d", -"pubKeyOperator": "13f341029d4b7d868749e77f8acf5962e1c3efe6994eb4d4999f92fc54a2eef2fd3d21bfc27460d7ffa7033b3506bdbb", -"votingAddress": "3WkQEUhHw91is3ic9ZWpNr33HvLz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "46d1ec7bb29e28637f994cf0afd26c2926388a133680163aa79a4600447e1e8b", -"confirmedHash": "38333c20f176c81f733a3e2c4770dbd1fccd5721475ec31a0100000000000000", -"service": "00000000000000000000ffff55d1f207", -"pubKeyOperator": "91c0527bfca9236b1d2897eca512b629dc33d1d043952d89b31ddd51b230e2e045afc520d53bb7da87bc12eda8fc3441", -"votingAddress": "3VGH1crxxeTZKe6HxiyVcx16zzXm", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "46da06275411de4be6fea1b75828b36e312f35460b9aec2a36ba745305157cf4", -"confirmedHash": "aca42be97e504bdcae055b4573521c1eeacae8eebb0825d81a00000000000000", -"service": "00000000000000000000ffff5eb0ee08", -"pubKeyOperator": "18e1b4bd8c05893191217db3ee5fff732ca9545d7c2ef4d21b9bdc5d9b19a63b4452cc5b3424daafce0d30aea3d2dfb2", -"votingAddress": "2gBd5okerUXjnibXRf6tEXU5AmF6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "46e0af88e0ed025f7ac1f904a3313ad989c7f6930ad8ebbfc4b3289f00ee1c6f", -"confirmedHash": "15686e11eb2b3e42eef678d81576dc064779accf83eb8b180b00000000000000", -"service": "00000000000000000000ffff6c3da7c1", -"pubKeyOperator": "8b4a1e567eefcb128a7a1099d7771033aa09189c98e18bd9b2cf2b9e1cfaf9fa473f22248e6bb07f784ca48f99da06ba", -"votingAddress": "5ESdH3Kvpjp8d5QLqbs4Mey4rgg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "46f79a21c5f03e60dfc69caa61f8a840e0a22f059572ac7c1de404f91bed35f7", -"confirmedHash": "ff2739e301dd6cd53330b02a1a227fff693744e0b8b4cf5c0e00000000000000", -"service": "00000000000000000000ffff5fd8ff4b", -"pubKeyOperator": "07cad522fbcfd0cd25f00f42c1ebdb53cf586e5b4e06318759c73e2b2b4d9f9db0ea237504f876563bfc059b3156e104", -"votingAddress": "JoJnaXhzbihkRmQJVEUTyAp9Tp8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "46fe156a03b458ee96e1993286d830922da6522ad1764c972932d4c72cf33cbd", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688e187", -"pubKeyOperator": "10ec395339d1f9210316a1ba9be993a42536536fd910f4d4c1636f5badbc1761ab36154ab4347bbba96fa876383d9417", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "46fe341891983b58806095018dfd864bd35062c96343bbfb8a77ea801aa46759", -"confirmedHash": "08b6ffd119adda6bb3b9f6d9b178864214c0f39ccbe31fa52100000000000000", -"service": "00000000000000000000ffffc0f1d97e", -"pubKeyOperator": "13bedacf1de90ea514674decc7c03b582296da44e271673a5a18b06f4d29409188865100ead59b25691a0ce6fa01db4d", -"votingAddress": "44ri7izTS9DkjxYasz3za7og33Cn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "470fc7c6eb860d82858bfc79dd7e634e43dec979f85a4c94e2c279cc0e40f0f2", -"confirmedHash": "c2cea37bda34125667cc2da9c2eaf2f53c09b82ac937e0711100000000000000", -"service": "00000000000000000000ffffbc2815e5", -"pubKeyOperator": "107e60cc3d88348b88beea950d440a3227b4db6434ec818e7b829ad9c1f3431e1d3056408eb535a64e1122440428c641", -"votingAddress": "2VHXyMgmtbeW5RiKpTbJCVZqxHpb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "474401cc8e10d7f7d94433511f24762d844d422bd49e5dd13ace9bbf60830c79", -"confirmedHash": "76543df94eb354497d35d0d666ce9b284e06b51bec46f84f0600000000000000", -"service": "00000000000000000000ffff50f08753", -"pubKeyOperator": "033ac9737b62b0bf5f1b424cbca290ab153cf91a1cc1ec62b62c3bef715c71e6ef1d65e3ffb9152d233a40fde1513c3a", -"votingAddress": "BhptPwKSBes8H9oqLogEc7u5fKN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "474c50f5a4ffd379854fe21c18e02c8e23b396fa4889998f35d8cb569b90bb85", -"confirmedHash": "b05da548604604d278b0507db4abd7583b34d32314b2cb2d3200000000000000", -"service": "00000000000000000000ffff52d31588", -"pubKeyOperator": "88f60d4c5fbe261711d755224fe19d4661bf94b5f9d8f656267ed38b4cb632795540512390a6f105af4c1f43bc61e2ff", -"votingAddress": "4JhhhB5tj54wAHzFQZEGpd4XMxqR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4755a854d2120d3377e87fbf7a60748adcae36ced10355711032bbca1dc39093", -"confirmedHash": "f03873b8c9bb548f2942f25edd01f83fc84b2088280faf3a0e00000000000000", -"service": "00000000000000000000ffff52d315dc", -"pubKeyOperator": "0008b41272e26df09f1949cab4ccb1612d4c2cf4b3a31a1c84eac68e7092583726bab4a3a96e5482ef79bbb74dfbfc9e", -"votingAddress": "oSitPg5CzChshvxDqasSVFiTY2G", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4766f8119ac209c337ddc15c49ce541868cfa942a35a9a40d0d83769ccda634e", -"confirmedHash": "2245df7bc198f12e4914dc8ea3cd9908a4c86aed7fcaeadf1600000000000000", -"service": "00000000000000000000ffffb2806ba6", -"pubKeyOperator": "08ff9920aa7391cf47e0a1a816ab4c67e037a5d448d2cf28b4d8c7c4008c459eadbe5134f7176804046521ec0b49341e", -"votingAddress": "4X6inihYM1F2fDSAGTphcLFW6tBb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "47685f719f7dba05e6d96f701794b748669165521b475f995551ce059012bfa4", -"confirmedHash": "9fc048af1f552101fbf2666384c0294b252a1ceda05c4d9c1300000000000000", -"service": "00000000000000000000ffff453d6be2", -"pubKeyOperator": "0aef134dce55e0add9cfbdd78801a88825f209a43afa576287ae0f2159d397c05b6f48d5898b497af3f4cc3528f39093", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "477600635ce933615e90d11cdfdc6bd2bd6f4ff91a4eac63993496aaf22743d3", -"confirmedHash": "472cd18877dea3dbc8531c5520ba6a6eaee9365e80e30ffd1600000000000000", -"service": "00000000000000000000ffff2d5575bc", -"pubKeyOperator": "8c98f23812ae5da3eeac73ee1c4384c68a755da6e25a4fc9b9562bcae4a5a6e9cab8a8a5c3e379039f5aae0804f954f3", -"votingAddress": "47eGfbFpPV1b1yGGVZ4A3C8JTp2Q", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "47b1110c3e291f3f460b7aa3775cbb54d37649202d6816381c04886b326fc54c", -"confirmedHash": "fdda34fbc6ae4172459fdbc246505763b7fcbf976f38935f1200000000000000", -"service": "00000000000000000000ffffcf944f68", -"pubKeyOperator": "8c018026a7cafc6e0d37f00870fe21ce8004fa151f4857463cf8e5061dc196e0ab567d73ceef84875dbdc451677fa5f0", -"votingAddress": "2r84pbGjtrw9V2XQJE8TmGiWxrn8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "47d33f6acd62d4ccd0576cd179a03e75ce643fe2e009ee05fbc614d3b1d6f79c", -"confirmedHash": "582c31b4671dc01fcbf76a9a1c2dc62b050149f4ba5f244d1900000000000000", -"service": "00000000000000000000ffff6883863e", -"pubKeyOperator": "88d1143861eefb3c6edabe2933e1af5356fe6f8cb63e9f92b42b676a72652d4c6e889079b8a7a3b83bd54afb5967779c", -"votingAddress": "229cRJVbouMSckLDUwboad9nNHed", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "47d7eb1542a9447af30b28cc506a117e84fd827c4ee974a14aaa1a3a6b313040", -"confirmedHash": "ab25b4d2afe1c56f9b33733608b170a3b2b23c76b6e934012900000000000000", -"service": "00000000000000000000ffffbc28a313", -"pubKeyOperator": "104761b17c066b81f49cd1bbe38916574a196e65024e18e1bab47c647b11b5a56987d538f6b7b26caa49512dd4c373cb", -"votingAddress": "46JfFmy2KPFF6HtzbH7VshcBy2Ak", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "480575dc91812ed38f08f138eca5d79568c27bc859298b69007284778463ef10", -"confirmedHash": "9ffedfbb72a276b6a1d6d076250cad8920a9664dd4dbe35f1700000000000000", -"service": "00000000000000000000ffff68eeb4b2", -"pubKeyOperator": "0e0ff20903fbf97566ae53d3b2f7988d94d65acb786ef4437ed8b51aa78f0578981f9d84bb9d7465f7524588efaa3b9a", -"votingAddress": "4Yse3EFySdvq3jf8iSX2tCZJExif", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "480af30ca3fd8853399e69048519691106e27f855eda17dfa6100783ed5ce16a", -"confirmedHash": "7741806d51f836c928f24eb05a46d13782763d906212a5a81d00000000000000", -"service": "00000000000000000000ffffae8a1b4a", -"pubKeyOperator": "0ed31d4ac649a2ce7ecc893217ac29f0b882458fce3c8501ff7cbe0602325bddd102cce8c17e02fff6f818d81649ffdf", -"votingAddress": "2CvJF1VbLKQaN9L3owpUaKX18tq4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "480af4db162acd00beac48c7071971b6964f59e72e88ce37a8f447ca04eb08eb", -"confirmedHash": "db22593e36ec7739e08bca1a55f2edd474ecb0cae88648980400000000000000", -"service": "00000000000000000000ffff2e04d9f0", -"pubKeyOperator": "083ff7d46ea23b6aa454ab4be3dbed4970eee62851e5e627aa92d160d6ad7dca29533a5411803f2e3c27604946f5395a", -"votingAddress": "351qTdcu1QAmZ5a2oNmpiRCEV84v", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "480cd627ee9c4fae07c533c72353c3a577099bd3a25911219c1ac7b6f0a21e9f", -"confirmedHash": "efa2074c63059739c2e8d597f216834c5df32f203bc4ff640800000000000000", -"service": "00000000000000000000ffff58630b04", -"pubKeyOperator": "0affe572d329da1a133b74491f0636191842d849cd4faea74cb4504d4548a4a807f7069f59fb2943b3e599dcebbe57fe", -"votingAddress": "3G8kyjAM3v7v8a2xM6zDhyavqc66", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "481dea23a70d6ff053d0a268e0fdadab5010a20f1c077a92cead1854669a167a", -"confirmedHash": "fe7717ca14978ee4f70b044efff9833ab2286473b3846e721700000000000000", -"service": "00000000000000000000ffff9fdf3cca", -"pubKeyOperator": "027207eef74d579a943a5c606c445d1616e80a46b3d0cdbe73142b4aa60c878ec8c9a940cec3fca6118a35503c3b3164", -"votingAddress": "4QZK7AXbXJ7NA1ACEmGtD9h1Da1t", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "482d44751836db516f03c997682934dc762a13b79760ff506f38992a97885c15", -"confirmedHash": "3c61ae16952c8d186402d85265698f3769d6c401cd41bad42a00000000000000", -"service": "00000000000000000000ffff6baadf4a", -"pubKeyOperator": "116555e6c331eaaa8433063e72a156db6abc745a89b366af0ae6e1a737a69127d5e18967d3fba4a72349dd04a0e754bd", -"votingAddress": "3E9oTP1V5Jzh4Y4Txi6DsiZJhZmY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "485abe1c1b7df608ae0831a716c10cc2fed6a0f2f9a186c76561083d104f0fc0", -"confirmedHash": "b8b6b155a1b903c10bd70f25192f443c64fc274c662a7c212200000000000000", -"service": "00000000000000000000ffffd418682b", -"pubKeyOperator": "9902be85f98231e82278aed9d23024e2f7bd77c24d4e92582f912e3abe1458a34c7edb094c2042260b3b67e9d8b3c3a1", -"votingAddress": "27yPLH7H5ew7WzeGQ6VUub4JgKHq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "486e5463b62af4042d94de9890c97759d5672305a7a2026ba9a1da62ed06ab4b", -"confirmedHash": "4edbce80ed33baa47a31cae2af4e2f28b1eeb6a48d814db80200000000000000", -"service": "00000000000000000000ffff8f6eb522", -"pubKeyOperator": "027ba5027c098961ebe508bacb01c2f9031095cf6aba7b9ca2a14130dca267263cbdfa5939f6a389fa93ccaf4deb6b37", -"votingAddress": "4MGx1sLMAcS2WHYL8daMkYXzXFu1", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "487c01aa5969dd91956a0f28268e5a3db462a0be0ebf215cb4ac9d6c2e7035ad", -"confirmedHash": "2361df2cfb3dbd626bff6a20f35d1ab801a740bd10e5a7c31900000000000000", -"service": "00000000000000000000ffff5f553640", -"pubKeyOperator": "0b28584f67853b6d542189a6ce71697fd41eafd04e548712897c3dda2b34ee734f97a5476f54037af81bbd05bc2176d7", -"votingAddress": "3cK9Zz4rHiXqrQZpk2Ai1BwjjiEe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "48991a9968caf8446450217ff73d7d7ce0d0e331e7220c7ee19b0120d9f3b804", -"confirmedHash": "e1d20814013dc14f5a7f4bdcf69600be62209753402e1cdf1300000000000000", -"service": "00000000000000000000ffffb23fec69", -"pubKeyOperator": "11d3f729e18d03589e5795565318007ec11675fbcd970ff72c6d8534f0a9e582f00d6254d897e5563e90286a5ab2197f", -"votingAddress": "2sVdie9vcW2F1YMKPb7BKB4VEmvx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "489aa8a896d5cbf32df6a9a2db9271514007b51cb9506a52dd05f69079957a12", -"confirmedHash": "922d906ada388f8514131410e21994136debfb50a4e3a64b1300000000000000", -"service": "00000000000000000000ffff1753850a", -"pubKeyOperator": "0a0973a510a4da8b4fba3560208e368d32bab2baaf2687be0e8b15146ee958b14f8f25d0039bbd19cf409b3a129f0384", -"votingAddress": "3JbTx4AwmJjc8ttxQjaNupE7bqtV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "48ac40058a84985d8a1269890244a12f94b2993657d917e2cc5a130fb3d48d06", -"confirmedHash": "ece2c76c0b711c449c467ad5c9756e7df826b32d20ec69401800000000000000", -"service": "00000000000000000000ffffd418683c", -"pubKeyOperator": "0adc4415ff532f35199f84d1090987573902d80d96969703a2d38f872c71daee29359162fb367b31bf21726d4d640ef7", -"votingAddress": "27WDJjdMQtmkydw68mLHCyK6EhBg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "48b7b2d7fadbda3665f48efec27732705ca41e432b48802004a95f2e70e4cbd9", -"confirmedHash": "0f1956d0b7459944820631bf91f2897829232f17b71d64f91800000000000000", -"service": "00000000000000000000ffffb9453522", -"pubKeyOperator": "159750308aad4222df384646f1473d031a2bd003c7a43d7a141e81236e896e30ae57c88efe54ab39789558340511d052", -"votingAddress": "2quEn6zgVKV4ehhBRxJ82BTSmZUM", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "48b9347dad23673d4f1491aae45625e3f5a2ca2a596483faadaf42f8a90b35e2", -"confirmedHash": "f81b002bfb781819e3cda2623aae1d1d0f63ebea4c3e81120700000000000000", -"service": "00000000000000000000ffff55d1f1bb", -"pubKeyOperator": "08ba60669c3b23142dd0fa6b5668ef336bad9844e6f776b99fb9ebb9880428dccc2dae8eb7f13c20179a1ce2bd0e280b", -"votingAddress": "VLBoKoxqsM5fhkzhc9zYdP6etev", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "48cc1c6d94baaf7278a96f80271dbf365ca0de1972e89a4fa513da841307cfa8", -"confirmedHash": "1306db74594814c484da2f366fe688d9208ac628df61e46a1c00000000000000", -"service": "00000000000000000000ffff2f6eb833", -"pubKeyOperator": "0a428050b1a3a27b95081525af4f1135b57aab95a6071a1a0b977c599d42b76831c6f8671d5f20ff3d491bf357b7867c", -"votingAddress": "2DtPMxSkmUzfXuRGsap5fRX6zMus", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "48d20131ad0b23f5f5bdabb7c1157b15b88c2aef648ff21f57e1adf6de3711bd", -"confirmedHash": "c8a4c02b005ce10b461495f8ab55cb05f568e0d3724948c30900000000000000", -"service": "00000000000000000000ffff55d1f153", -"pubKeyOperator": "83190a1c61a9fae05e75baefd649eeb2497c1beaae5df34a34cfa683093f828a1b63471b56b9204f97bc070333927de1", -"votingAddress": "3o8g3N3fL6xSJBXVi6nMJSyqc96j", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "48f06f0cb24c299b042173462b0e7b2e3cfb275adc71dfd9339c97b1805967e0", -"confirmedHash": "a3dba9f8c6ef76eef1128001dd671e2462fd49ef40ed379f0600000000000000", -"service": "00000000000000000000ffff52d315be", -"pubKeyOperator": "065c796228b9e6a444c21a5376fa18f94480d5c71dedf481d6e27907e26db7aa0ec4d1faeb216744772fc662315df85c", -"votingAddress": "3h4LP9YrnGunk4HnUmjrLKRtQx1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "48f16eee7a5a1860c043eb7ec85783d00fe69bcd518f921d3bb1d18ff34bf64c", -"confirmedHash": "91a6595f7fb53f1f09f9df2e741120864738144ed1f9572d0f00000000000000", -"service": "00000000000000000000ffff55d1f275", -"pubKeyOperator": "977d3b02216975c423abce6ee1929182c50d1a169826976e300678f971232cf1d0befa17e8d410e284f0c31917be735a", -"votingAddress": "2NfA5mLZNymZF9VMomPwbnxuUf3H", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "490d901c397d5de7917bc0a89474ba72f1f927ceb999725e8cfcbe906c4ce283", -"confirmedHash": "b59ebe90a9acf1a683c62e484a51ed8c108ae43a2580f5542400000000000000", -"service": "00000000000000000000ffffb23eab3c", -"pubKeyOperator": "81a4c0e55e7257e9bb761829dcf4e727e1a440d63dc84977754a52f685651c270c5060c609200c1c09a4c9c673609bc1", -"votingAddress": "3hmnwv6AARG4Ju1cJRuGBq6LRdss", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "491487fdf621e938dde6800434d075817a66657a35781404bb81612eedb94dbc", -"confirmedHash": "beae829de12b4541bb5f7b1b56c3112bba87218693a3409e0200000000000000", -"service": "00000000000000000000ffff9de627aa", -"pubKeyOperator": "13e991b55449d2f0280845061eca28f39d583d15b32ace75d7ab9ebfd65f17447216ff4159e898d202dcc3a10c6e4790", -"votingAddress": "2w75cXQJFqbfLBBXGkDhx8qSMUCS", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4921342fdfd9a4c78529e78c1bffa2469fa04d290c83b46702948a39a4d0e5b5", -"confirmedHash": "2e2914ed0aa9ca555a054f82940d78bb865058df1f8f02741500000000000000", -"service": "00000000000000000000ffff55d1f1a0", -"pubKeyOperator": "04d3b228e3c7d4e9b4630fa48418bc7eadcd112849860351c5bde9c2f2ccda789fc519eab5690e3ba6e70e97aabd4021", -"votingAddress": "2u2T67EWh5FxqxMw6qTVQesoDmma", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4931256b03422f58a06099d0885a86a877bc8fb6d8d7e0d2da3b2eff21f70d87", -"confirmedHash": "0152820c4a0298ff8aad088ffac5baf291590d27881157a70700000000000000", -"service": "00000000000000000000ffff052d6c9e", -"pubKeyOperator": "8e69c4f1b3d047d340025f266b3c44749c4bd8db41f7d40330dac1b88013c440c14126627e4be18918b1c86dba4f7fb7", -"votingAddress": "2hba6g4zNPNCSGpNwqKyEmTsASi8", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "493af3fae2468d05b8486ac3a9736f01294216fa1eb8647431e63f6ee455c698", -"confirmedHash": "35a7b631fdf897f6c4456ffddd21cdd31bf21f3110c5866c1700000000000000", -"service": "00000000000000000000ffffb23f798d", -"pubKeyOperator": "069abe744f936865dca1f880dd8747a48f42e4eea01e55c37c549656d2b66b0d21c5d9f9cc8233ea84209f1b38938a8c", -"votingAddress": "yuSBmRgEXhbUMui12nuESaGPTwV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "493b8143a48f1cf17a90eab651ce2213c57392c69063d79193e3b841ec36be29", -"confirmedHash": "54ca220dce6177184e60d8a3194e7046c2aad4e4adaf83190f00000000000000", -"service": "00000000000000000000ffff52d319c9", -"pubKeyOperator": "8b63f059b1e8dcd492a86f9512af2208fde1c99f4c13007f2a6a358f5d5ba2c2090ba19621825144367e23ddc10bc6de", -"votingAddress": "4Qg8miJXoxa1SzX8nBNPPJxcJ7qe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4940912ca4ac064951901a2ef1b01f45f2472ce922ae286623c6593548fe9ffe", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b087", -"pubKeyOperator": "890c460c4a57fa509297a6ddc68fd0a0d624f29b18b8beb85bc977d33215c79d118d13e08bb28754dbb7e5f5fe12f4d3", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "494323f2cb56c82ffabeb7c967002f8ef5c72cacb46e91dbf3d4ed4688fcd354", -"confirmedHash": "6b48f49ba90003cfb90795dbd0a15fa6e36935f8deccc2d20600000000000000", -"service": "00000000000000000000ffff55d1f224", -"pubKeyOperator": "917236f9c9872745f732b2dfc6a9f665774d8b58458a199d9eb7c198aee6bec92f4009a7510267533d6104cb29b7acf4", -"votingAddress": "ufWM13ABsB2vhCnRmUvXQVgd2Jb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "495c3299e2fd519e88d3a6424f552243780a45d2833c43dfa2e74bbb1f38a122", -"confirmedHash": "0f3885503fef04b99a8099f0a610a390b7f034eb961a11f70e00000000000000", -"service": "00000000000000000000ffff34c8ab91", -"pubKeyOperator": "85cfb3cc9086f3e3524a313aa3fa7b8d3ecde9d97d074a84424449b9fc9520831a6aac629345b08fac1134820e8cbd40", -"votingAddress": "2F3XYKYDG8Rj2Xn6dxhsKgfArspa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4974054f71494b916f055a816f7deaf8b159a36bf0c08f010346b47aacd9deda", -"confirmedHash": "601e6145d82c195fc7662679985dc885fabd2375357b0bca3000000000000000", -"service": "00000000000000000000ffffbc28b249", -"pubKeyOperator": "833a87a7f22d0e86c6d47c4a2a514609372c42a90c703a4f95e703d6cbbee918141e509de5e3a77b3ade3369f6c3cc0b", -"votingAddress": "FqkyiXCuH3L3hW4BH5HdhzMDeKC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "497d68b013123f9927b24d79cb74cc4b6637f63a065e94351982c83d8c6b26e4", -"confirmedHash": "066dc8e8694089cbc54d8e333185903714d2b76d136829d71f00000000000000", -"service": "00000000000000000000ffff951ccf7e", -"pubKeyOperator": "974f80efd62cc6c0f01e65ba7ccbdb99f0d8bd990decd8420aa2353f08e4e802278b76e7816a5d5c91543901f6c8f9c3", -"votingAddress": "ASw3KgpMdwuCkJsJ6yEJuByStQr", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "498611f0f96709742c7e10371bfa4a99821cc1cd4d55e3ca431f2f2badd77725", -"confirmedHash": "d9150094d210bcb410bcbf69ff51315acf61c933f536d9cb0200000000000000", -"service": "00000000000000000000ffffbc28b48a", -"pubKeyOperator": "80232d48622bea7b2a07e496d4978dc8cd2289ec7f7ca5e70aae0efda7053a4153785ec573cfd26fd822b03f8310d98e", -"votingAddress": "3vgDaaPB5Y1y6quXynJ9HrA4Bpex", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4990ba72cb94dd8f262cc7a5038a34dd5f6e06f1d0772d35ec8f3ddd34c499c2", -"confirmedHash": "751266519683a79ca791eccdc587a5c108aebda8f3ba62f70d00000000000000", -"service": "00000000000000000000ffff2d4db93e", -"pubKeyOperator": "10d7c7ec4784397f375b856d12d19de6d0295fd251f29657531b905998bf9b796b09ee9e78120e107dabc8f16af25e53", -"votingAddress": "2FXPUAc1peqPJRgWbbp6LpN4avTA", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "49adad01c0e01aa08b6b30f5e46e832b5642532529844530e68d4cc56e8bddcf", -"confirmedHash": "6fa9763e17e0362f96b3a480c379c53c561fcbecf92080181f00000000000000", -"service": "00000000000000000000ffff50d3cf8a", -"pubKeyOperator": "0d65d37d38274bf00d14bb57255ebe4d940f4f09888ef5744aa7e16d40ed73391bc70d671ab654c28a4a0ed642ec37ff", -"votingAddress": "3fo4TNBTMCsfvZLGX9jsckvb7ny3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "49b402ebefe6dfde187725f6419a452e9d1af59ee5c855a590f2cf8285d4dc48", -"confirmedHash": "a02627addd9ca0c6b6df724e1c61e9cba8d6b717159794222400000000000000", -"service": "00000000000000000000ffff453d6be5", -"pubKeyOperator": "10437a7914b8bfebfe8df83274d6c43e369ba7c47d6f004a353748059498d83acb98f21238f022f3daf1017469459b42", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "49b4aeefe0e05667a8c8b4d410c1223e95017411e8dddf0eba45756d54b97c50", -"confirmedHash": "be7fb7b8aa55d7df4d39a443c06623308da7cc950cf2465f0200000000000000", -"service": "00000000000000000000ffff55d1f23d", -"pubKeyOperator": "14abd5d3c502052d20123e40718bd677d852f0f8e9546d6dd239997c90c0aac32dbfe417e65fae947219e235e4ae8499", -"votingAddress": "2ocptXDFbK8uhzTjTftsJ2tT7hJo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "49b919ed47b4e63646815a986fc0bc34230b44a5fc72b904b677fac498a0d0e4", -"confirmedHash": "1340bb233072a7c53e8e83731c5d8ca3bae8feb9068acf544000000000000000", -"service": "00000000000000000000ffff3625c7e1", -"pubKeyOperator": "82ee2a9db8dc0aa59497b655e9f0adb3870fd6dd7c079c61d280fd5b535fd894c905a21406ce580a670f00a8dc393f5b", -"votingAddress": "4HZXGP8mdFXmLwKCQBxru5zsE22P", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "49c2ab8245747358358cd4b54bebf85d59dab80accdd16a3ff8c9f695c924da5", -"confirmedHash": "9ce1b6e471acb55342af2b9e13e04c0419ccfd6bf05a8b4b1000000000000000", -"service": "00000000000000000000ffffa5e8a9f6", -"pubKeyOperator": "8df043d04e0b031da58a99182235dfc471197dfabab87f4850aa8960962c7f9d572d7e20945e35f491b5570bcd59a009", -"votingAddress": "3DtSd358Vg7Rsxzerrykz4waSvF1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "49c8bafe5c216c2494b75fad8b079f66e967e1f95ea863209335868e4d1eb3be", -"confirmedHash": "37bf59f1667155e639566431e4153fe1aa2c4e239db724a01f00000000000000", -"service": "00000000000000000000ffffbc28f171", -"pubKeyOperator": "82ac4e849033c1ccbe5c628a786e9e44cb39ed6e61919b02dc5d0d8e51ea4323349f51fdd8816e690dfc347b4df3c335", -"votingAddress": "BbUaFcW2LF8chHvxHuwrrUURVkp", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738584 -},{ -"proRegTxHash": "49cb8577501b7c6d3a1a595f1e035c639c750c2cb5a9ad65befa1d6a515a9cb8", -"confirmedHash": "cdbeebc4a3580b1d894014dcafb37c7472a5131b33ac100e0100000000000000", -"service": "00000000000000000000ffffc28752f3", -"pubKeyOperator": "10cbbc457e5e05005674b160ade10f75c736661ccff1a14f94764d07b214278d5a06cc23cdbb364c40101573ce3576cc", -"votingAddress": "UpDBq1crudyw7vLW6Te6YnSAyvS", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "49d297cc109a5483734bfc1fdb025cf8da14c570dbf6254ca4cca76e0a1bb682", -"confirmedHash": "5f4ae1dc6498cdb33c0b060dfa714462564998cf6be9c1f12400000000000000", -"service": "00000000000000000000ffff5f550193", -"pubKeyOperator": "08af7220d9c42f6b7da6e2d301f084b915bf526d1c340a848303d92b3b57e7894d2717be6dd94a16cf4b8f94c03ad222", -"votingAddress": "3UUVhkdG4ftRNnMbLirdNHmAAEap", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "49de2017b1337efd58a3f1b95b6c8461fcf60547d8278c418b4925e4bce92c07", -"confirmedHash": "36ffd83b863fd3f3919f4d3343aff81ffae1a83932183ea42000000000000000", -"service": "00000000000000000000ffff2e04a26f", -"pubKeyOperator": "03d131265e97e2247436c7dc1bc7ac7e00b57cb5f2701ed9b6596f535bf50395f11f00b7bd9dba646de93ad4d2dbe587", -"votingAddress": "XbCz9YSPdtw9ofXr6iFpxvyiZxE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "49e035eacb78a020bc95e217a2dfcf44195f9888e1b93d142fb7d45f9fcd20a5", -"confirmedHash": "6415f0621bef2e358a347c2e77d68483407e9f6d05d336851000000000000000", -"service": "00000000000000000000ffffa877530b", -"pubKeyOperator": "04222bb30a1c9927711979ffeae540ff872cfcdd520e156f6e7307965abdff230d37ffa9cd6bd0e6d5252bb2eb8bb307", -"votingAddress": "2M4fi93gbzKHCyqFbcxMv7ccgvb5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "49e816991eda74484b969fe43a021427f260f0b94c8a22641728e6f954fb8787", -"confirmedHash": "ec8d7116601fa908fd7dc58677950532f18bc3d616ba88991500000000000000", -"service": "00000000000000000000ffffbc2815ef", -"pubKeyOperator": "827e73dae855d342fd302721310a9979d58d92e5f1817fbe2cd817892c383d72076499a3ecf6db5321b77e0ca9125c18", -"votingAddress": "ZWuhioveWFiiGc4gchuXMUSAqBj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "49fe03bcb8847448e2b91428fd702f92561f5b07a47c11a407a4d50d7644d63b", -"confirmedHash": "79a059838be7f0c9aee2280162e7b6c36d6a037d37583c7c0100000000000000", -"service": "00000000000000000000ffffb23e2d0d", -"pubKeyOperator": "9780b81e61a4d3704abc5fc9a82864bde6831fc104cc6d1d382b993cf79d2933431dce71ac5b0150a9cf89ddf6a101cd", -"votingAddress": "2vrQu3J5226n6bzUhzQUD3ZJwAUJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4a001d44576d10313fb8787addb101964e1777675d4391dfadb684dd3954b8db", -"confirmedHash": "6ed6a400b9c9b65d4da63626648be9e0bf7bd2b07a8e1db71300000000000000", -"service": "00000000000000000000ffff50d0e15a", -"pubKeyOperator": "91d878b5c0b780ca9e6a1969768a8fdfb7cbe9e70d943e8d6f4b6b050de21f6eb87dab358e2d71c5a47dddecf0079eb4", -"votingAddress": "29Fi9z4WHoqrJvEM4pcyheXPwhff", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4a112c4476fa2bf81fdba852974a55e6cac9578dbd7234d49ff56487c2f66a8b", -"confirmedHash": "9aed39f99594cf0a4993f30d0b1cf0a8754c4a3f8588e6921200000000000000", -"service": "00000000000000000000ffff2d202213", -"pubKeyOperator": "8a09b4c47cffc9614d165e13d8cbc8837f8cf3a0eec2cfd8251b434dac89d347f0b1a7a03a23468a0659f4485d0a20d4", -"votingAddress": "xqQ4sejPQDxpw7u7PPLUpyYDK3d", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4a314c124db4d340ba8c856c61b30178116bac22d23a71cb65ffbe099673a460", -"confirmedHash": "3d7398ec65985287c4b81cfb181f9386100bfbd47912ed2a1e00000000000000", -"service": "00000000000000000000ffff55d1f12f", -"pubKeyOperator": "9848f22fe0a090f83683ff6983dca9d10a73e27223d5d5f9964e5118f6ad0230af889508198d7bd65e3cbd1597e2a88b", -"votingAddress": "2AsC1P68DmeEwhPWjdrSWCEHpZCQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4a475a4c930360fc5483158aebb76b114b7a601688e6c632557d6e593ece7513", -"confirmedHash": "e65a255507dc57d15253bc9393ebdcb4a97d860026ddb9331d00000000000000", -"service": "00000000000000000000ffff5fd8ff49", -"pubKeyOperator": "8d9549a74a5dfc34f1849175d785f3c0a40d49d8f82f275ac41c49937aeaf7da77e9e28e99645763abfb9461036766bf", -"votingAddress": "uNjxijWKDLzfzizkuHQMpnZvu52", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4a5e374025228a46ab983af125317897bca556d245d16ca569fdaca79e18b988", -"confirmedHash": "77058055c2f190d4561aa0159a2642445b532e285282cfd00100000000000000", -"service": "00000000000000000000ffffcebd2cbd", -"pubKeyOperator": "856d148cf32e840793ef20131ec2b8344fc048d830fa0c3c5c7d2513e7af1fdbb1775b312d6132c7f5a404e96cd81f99", -"votingAddress": "hzbxWn2yabFPdP6TYK48crMSFcL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4a6a6b1e7e714fb2ac58266132eb47316c23aeeccb037f792b7d0bf51e5cb0a0", -"confirmedHash": "74f025dacfb0c4a00ffc935f117697792ae2a0057c8674591700000000000000", -"service": "00000000000000000000ffff12ebcd06", -"pubKeyOperator": "9635cfc14674b0a5b8fb3ae0147cab173332fd753ac9b2ff2f5ae93f92e604a08424c7806bc80ac095d8dd532994ca5d", -"votingAddress": "3AMRDpWBn92FKUfm7G9kqFW5vgR8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4a6b1c517b24b4fb2afc46e8cecdf51f120dc6ce425403e7b03543f6921b0db0", -"confirmedHash": "9a49d0a86edc09a4d0f030855bfea2449ab66fb12bbcbcec0400000000000000", -"service": "00000000000000000000ffffcfb4f0a2", -"pubKeyOperator": "9718a408c4480e70d61bbe398087131042c122f44dc2b77c3ac0ea6b93e5e096b9fc81e8fcbcf1bad669b629ee36535d", -"votingAddress": "3VAVaNsZL1N5gxdWWsEm85EUzaQ9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4a74a91637cb6be6b47fb0c14aee8f4d50c8c7aba355bfc6feab165475e8935c", -"confirmedHash": "53a8006c141cbd46f31c3af0c7a5c074d4b1bd24d1b1140b2c00000000000000", -"service": "00000000000000000000ffff2e65f318", -"pubKeyOperator": "84b25cbb4ae60529d394892c919afbd4038e699d4ff3d33ee415f9543d4da860f5cc036728f93ccd662554dd80221e91", -"votingAddress": "3RGj1SzUugAPPva5fZrfqtTnN2Wx", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "4a7ccf09dd907d8f4929be7032d4dc94a09a938b9255221965fb8eadee3e468d", -"confirmedHash": "1950ba56254b70b82de9b15a502cbbf2ab497e9eec9b32282700000000000000", -"service": "00000000000000000000ffffb9a375ed", -"pubKeyOperator": "0f7416f6209bf61fb415d1e86e5f0f4bf944a9cd2acc6749c3f6b9e92775fb14a4d5ced1bc9f976facc87daba9438bff", -"votingAddress": "3CQeCtTUR8CpBXRbqLbreqvx75Kq", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4a9cbb51bd2e8dbfb87ddb3298418c7719e9892beba6d3ff8d89ddd2a8c9deb7", -"confirmedHash": "9883332531dabbbbda88650767ebc43475ea3fde749e36a60b00000000000000", -"service": "00000000000000000000ffffbc28e707", -"pubKeyOperator": "8c05f87268f92ede6507d10d500b14c1146c77c1d57c14b27eb73463cf34f9e0ae199355e895479fa683e5abb60c6259", -"votingAddress": "BvnHV131eipYhFJkrCdV6tfJHo9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4adf9c4c52d34647e2a95f0a0726cfe64bff83d9fb2cf98616861fc74559cc6e", -"confirmedHash": "177523b58b8dd72603f7916969d8bcb53c9f4eeeadda4f940f00000000000000", -"service": "00000000000000000000ffffa763b0e2", -"pubKeyOperator": "95c4dbc9fd502d8cbbd54a899cb87f4c31da1dc4ff36ad222618050064ee17f0eeedcbaa5fc19d8dc39e34dd126c415f", -"votingAddress": "35qnxTyhvTZWaUcmWppQbbqefMS8", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "4af860fc536d66cc33e179ff36ed60e1458f6072881d38097a4ff1b58cb62615", -"confirmedHash": "3e20ba21c5e5e26dfa536b7e1b1c2c016b254de9402c642d0000000000000000", -"service": "00000000000000000000ffff55d1f279", -"pubKeyOperator": "999b87d7fbe4a95a7bc46de231e7a1662f75d18e91871d12bd6a6e8c161a809063c5f1b16c4142524b3dfa400cf2974b", -"votingAddress": "4VDDXUezKRF88daRN4XbzXHSREgW", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4af900c8b8bce5072ddc934183866d8b0e0ebdd80bb4c312174cee55c3428b8a", -"confirmedHash": "f88a0fed2337565e8b86119324fcda8715ea88a155b86b2b3700000000000000", -"service": "00000000000000000000ffffb9453503", -"pubKeyOperator": "0b8548d94e6dcd9e568baed416c0f1af986a74fb1d5dfd863f7bffa3eb3729d4089ac14c5230f690b8bf71baf8252d94", -"votingAddress": "3sEDWabyTm3R4FVX2JeSwj6V1yxG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4b23dc078154946dcb3276ba2ed02589dceab5fb24138ac82d2d21cdff9896d5", -"confirmedHash": "5672792b19e9a63f93eb20c678ccfb3f49b8432399d3b64a2000000000000000", -"service": "00000000000000000000ffff422a7f78", -"pubKeyOperator": "14e97c9e6021e3b8722c822b30b90d7378f805ecf87741847b999f0a19ef6c77db8952f0912c40f90c9ae1c43100c6a3", -"votingAddress": "cTomw4ZX4htJDoEf6tvu1eDgBfL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "4b2b7c4c80f658823b80402605c2b7f67f6911c9cbf6915080b4793a22ff36a5", -"confirmedHash": "d47e4a21dfa0a3dcac619bf15493e0825db2ef84288985be0400000000000000", -"service": "00000000000000000000ffffb009d218", -"pubKeyOperator": "8a70ec61345aab1b2ab12f92d561aae2f2710f506b20db7836bf3df0c5da9fe053778a9728e0e7285ec477ceaf14c343", -"votingAddress": "483wcrfmuSDMwzKfSBKQauTQWBQn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4b36ca12862a7b9525d09ea036f559f4d47b46ab3a6620ff584e80c786ddbaca", -"confirmedHash": "31906c52ba237fb114c3780eceaa77e0bee1d4a52e8cb5010f00000000000000", -"service": "00000000000000000000ffff55d1f245", -"pubKeyOperator": "8096ba65270d7a9c888775884fdd47a91296af3be40213a6b33e51607df26a89876ac55fe8b11ab48c2160de01c6a1dd", -"votingAddress": "65MCSyDAk7paWvzPW43JZDd8MAA", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4b55c19dfd7bd9ba8959aaa0e1d477e9f611e9afba5cfe9d77d59dcffbe36b4a", -"confirmedHash": "4c14a7a1d8d419979df8cfa1fe4c4613add7bd6dd61f3c360000000000000000", -"service": "00000000000000000000ffff5fd84fe2", -"pubKeyOperator": "8abad7540a8e2e6d7f8eecf45ebb2dce95d8b2634d2b86ebbc7f5f9e6f86985a7ffeb175b5ccf2db664dfc5276bbc2cb", -"votingAddress": "3FmWAekScx6fSLyhvu51pfqGvs2L", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4b6292585d58a50973993bee51bdc9e5005eaeec5814cbbb314faa0be967218b", -"confirmedHash": "49f41388e85f05827f1c85b0c982bbb7215c36a5b13ed2271100000000000000", -"service": "00000000000000000000ffffb2802857", -"pubKeyOperator": "0b07f41e61e9454499e93a7a5ca68e036f8b45be43326f3236493244a119d1274392925b666db499ae09485c142ada10", -"votingAddress": "4nuopgE1S8Z5HQjCzmoUNbSmggL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4b68b654ed6615db319a9748fd75407efd2c4c7e3df8801bce77becff02241d6", -"confirmedHash": "73f7681b7a8db65c6170aad5af1bfb51ef73c6a43bc95dcd0f00000000000000", -"service": "00000000000000000000ffffbc7fedf3", -"pubKeyOperator": "0260dcb73135557becbbd7b42899c0d85060a883ed24004d4365424b0f7c859929f39d74cf397ca8c93964f8c229daf7", -"votingAddress": "2QYGy12AeUdA5pi9aBj93fNUMKCg", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4b963a0d43c6649610f16d9908257189d37fb92b409454dec0af9584e9285aad", -"confirmedHash": "7d7ae09372b1b4e75a752e57d36530e9cd6827ff375b7d360000000000000000", -"service": "00000000000000000000ffff951ccc93", -"pubKeyOperator": "89aab4cff13ef750042451785d61b8a6965f309605456f0c251558818eabd274b5aabc7d42b37ea5c8f790d401bbbdd8", -"votingAddress": "xbNFFscBiP1tM17is9Rs9tSbi7M", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4b97b902ab67654e956cbcdd58e49ca6fe5d441d638abf05008232a011275b6d", -"confirmedHash": "54b1326c6bc695a1b6fa4ed28960e001b84e8d0dfa70ef740f00000000000000", -"service": "00000000000000000000ffff52d319d0", -"pubKeyOperator": "10068f152fbb1cce0092ea35083e27ceedc5a25c3a0095a9bd279e3b396bc1df9323a45fef2c08a34a6a9ffa9b4a160d", -"votingAddress": "4EtTDHZELMhwQwjMgcwXc3RXZccB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4bb0ab5432a3c3857131081f173086e9ede37006bc176dc237f138459a739bc7", -"confirmedHash": "1b524c336c98c3672741abf52d9e5b4197a6db9a218d78db0400000000000000", -"service": "00000000000000000000ffff52d3150f", -"pubKeyOperator": "85cdfad1dcfd2c1c6c55304d2b8a658449602d5be60357b28ad593350bbd76d71e2552b395f97e59a93f8bdc81353ae9", -"votingAddress": "45bN9PuqWebKQ9o12oPY9azDZGe1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4bf68a07b41d5112ad35c9888c4ca1eb7cd85e704875de23dccbc07e75539867", -"confirmedHash": "ddf518d83483a5e8fc92c1fc1d140cf5d82c8d6114a283990f00000000000000", -"service": "00000000000000000000ffff05bdfdfc", -"pubKeyOperator": "16aeb534e52b519d559aad95e3b7c805d29cc903c61a614b01c271f9c0a73e7ecbe3e8974c3c31b6d36072bd4bf46ee5", -"votingAddress": "45PpoLJ3z6Bjnuyfpy3TVsKrZaUR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4c2097fff4b80170b2b98be08ce8d8b5a6f8c0f8b735cdfc30cd69b2bd7032f6", -"confirmedHash": "ea2d17d87513b047bc8f94c214422fa3b62fc5dc190d01900800000000000000", -"service": "00000000000000000000ffffae8a199d", -"pubKeyOperator": "8b647b4938c0ae8187fbaa3c32518cd63d88f228677db76cc638513f2ce4d2c459539b743bd67c85ca280b2ae0b9478b", -"votingAddress": "21tGmYq1r6LhteY2w8bh22W1cXko", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "4c3d1e8ed3808950fd34af4515cc16e94a16596271ff1a6de6767445f7d2ac82", -"confirmedHash": "014b58ebdd34f2992b71fb9f0d20567d49dd1c0ac0aa57de0d00000000000000", -"service": "00000000000000000000ffffa8775797", -"pubKeyOperator": "8cb92c0f072035b86268154918f87aca3cb74e00c44a51340818191560831e076a79c631de9ff4bca502be78ddf7bf67", -"votingAddress": "9nYRqF8A8XVdpj3F49dR45PEvi2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4c406d58dede843e0672ec995681a51e2a2ef3a30640f1da6f98ce4dbe20bbae", -"confirmedHash": "6e5c529df5e3caa0c61e8c4d769b04616343986d4a8394a71100000000000000", -"service": "00000000000000000000ffff87b50841", -"pubKeyOperator": "82875932bdc1045d699f9b9342b4c778e2df8cd50cd2ad3ae717ca7e10d6f7d29b690a7ac8b8f601466895c28bf44bfa", -"votingAddress": "4D6qWsuQxoiMBu3KCw5ikjmjmePa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4c443a47ba9e42b447c3fef5fbfeeab266decb0a180d55ea55c9c72ea914254b", -"confirmedHash": "86db59de2516f225210a10867e40541ca66c911efe9c30633300000000000000", -"service": "00000000000000000000ffff9de61682", -"pubKeyOperator": "8b73b8c9dab4f99ea7e6fbab3f3d7fecf84dc3089a7f78258ef12e8878567ebc1bcd964e4640875d2ab6a87118883fd4", -"votingAddress": "2t1brEjKH5CSv2QhygNz2aCPKRJS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4c4c7d34141d9d6cb16294e810bba5fb427138d7432afae9c17ab7f13d76fd7a", -"confirmedHash": "ec84a1e12ab195cfcd24c51b633c983d68589a80d411a9570600000000000000", -"service": "00000000000000000000ffff2d20311f", -"pubKeyOperator": "906f2aaba6e086e7c0bdf8f96231256c5b8c275a85553f8495bc855c4b25da8fcd8f508c3d40f98d023753488a254220", -"votingAddress": "2Zu6DBHzpXj2kCzqd2oZx8cm55TV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4c50bafbbffed43fd731224dbc0478fbc63fd425594275493ee99eb49e05bcd3", -"confirmedHash": "7e809adc9f3622c90236370edaa018f64e02377b6a467b661500000000000000", -"service": "00000000000000000000ffffa7567254", -"pubKeyOperator": "12c82ac61c469e1bf54ca40625693f64f673f452f669f6305beb43a9f60bbce2c43d0238d493ad68cdfb2b80147dcbbc", -"votingAddress": "e4sB2HegJH8MfyLDFDrD4fY9YpM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4c6a635368391a26e8db31e4cb749feb25763372b8369dba030fe1144692ce7b", -"confirmedHash": "d8d68860408766ae9e44f8b5069170f6db2e25702bd489a33000000000000000", -"service": "00000000000000000000ffff92b9a97a", -"pubKeyOperator": "02d11ada1803674d9415f68884ee2969739659447fc771dba83c27b89ab392d3954e9ff1b51b45558c16389f9162c8db", -"votingAddress": "3CL4cRrqSV4aYLt6dkeEHkPdtkN1", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "4c6ad988c9a81dd79471961a8a47ba49086686245930bc231a50c77e4d790a63", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d52b1c", -"pubKeyOperator": "856c3309b2dd367b115f79abaf787082859a82501c20af511d4127fe53cdaf4a004ef2f331f5fa9879a443d080b950cf", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4c81005e4702ade5f07989ac9a631b01c4441c149bd3fb7c29d1030f9883b609", -"confirmedHash": "2d67f8dda4b07a3dd74c5fdc10d79ce37b5079a7a02cee6b0000000000000000", -"service": "00000000000000000000ffff55d1f1f4", -"pubKeyOperator": "9507d591b81df12820d546a15012f436aeb9ed8413aaf8167c8f5e8da30e6667503603bdeffa8d5a070b548bd10e0f5b", -"votingAddress": "VpQkhsZJ3Lgf9QpFQH5hRRGwmmN", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4c8b2b3a3ea7b7136a692d8ba7796e35fcc241348d128227b68e35a6c40ab0b7", -"confirmedHash": "2db16df27416abf699feeb09ce094ebcafc8834b97f9e2bd0100000000000000", -"service": "00000000000000000000ffff14d02ed2", -"pubKeyOperator": "85bf2ec43c031e6dff2aaea80261950b1946e6a66958dd7a104db58037f84db3656cad3a52473ad9e91b24e71b5fe2ac", -"votingAddress": "PHdF888g4xWmqLdMbsdBdFjdRHD", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4c8df8744a5b36d7c27fa9557daf83d8152282ec7b09a1354fba8a7646d4b292", -"confirmedHash": "768528a01a34bbb7753b9fd0cc306f1b35e58f2b95a3cb320900000000000000", -"service": "00000000000000000000ffffd1faef06", -"pubKeyOperator": "152bab1c91e931e71955ecafc575b4da99cc33a6a083897d248df6e31a6c1faa70e2d8ae46eca4ae24e1ff45d01a8a08", -"votingAddress": "3qGn3ahfxHcFZFWecv4oMjdfKN3x", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4c939a0e937259d89c88b70524e8887060766666f895d4ae2957e81a219184f0", -"confirmedHash": "db6e24accfb09c81ac4539d366f24cc3b163af5701dea2a50c00000000000000", -"service": "00000000000000000000ffff5fd87e26", -"pubKeyOperator": "8d800a2878621ce612ef2fa906713c1f20a023379d720b0cb0a2c7007747096b59ba1b69e160c6b9e5568f58b982c6c9", -"votingAddress": "pnNNBsUedX9CwmrBuTCd7gEkufN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4ca3ae342075eb5af641df2050ca290606b8b2c0b99f1345d7bca48941970b70", -"confirmedHash": "11daa2e0875e7ab11c01b8810cb211d3383d95f31fbb56f12000000000000000", -"service": "00000000000000000000ffff9fcb2243", -"pubKeyOperator": "8a3e7eb7d80481750ee7df691e8404f4f9b09e4f03f7736473a088aa964de1c143398a7594c7b6394e7760a373180154", -"votingAddress": "4FJYm4E2HxsxnrnyTaQtihtetyM9", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4cb678f9d7ac070aae428dfcbb4f6eddf13e17419a8a72129272d54c3f6d68cf", -"confirmedHash": "06c362fa2f8b33335aafc47782d24ca100c89b4af6c45cd20b00000000000000", -"service": "00000000000000000000ffff2d557573", -"pubKeyOperator": "19ed0a7bf7697ab9328ec3283305d5ce8216ed4b69d5eee05334e56b0ddeb851e61195336d5434a6ba9f5dabf35bb854", -"votingAddress": "3AZfS8VF9jb9rvt9XnHnu2jGinBJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4cb6a88c368fecc4006be92d1a496c21b40d99ac653d1e39023d4a48df038b0e", -"confirmedHash": "e991ac9e5906a7a54d7e0b7672a211d4839a6a7c568c05fe2900000000000000", -"service": "00000000000000000000ffff92b99e08", -"pubKeyOperator": "0a8dcf803dbe42047ec579110105050d1f4b84f72680727e87433273fbcb3b733bd1b89e3dd2461890ee6a8e9aa74c24", -"votingAddress": "32HmM9xKoYReZQW3LQpCEAHJ7fNn", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "4cc21a1153886651c408e134c40c2807bea95c1cb2de49ac3b9d0806944b3f0d", -"confirmedHash": "fa531e762ff787cb31fbc72d9d7d24d6da417ba0ec049ad40700000000000000", -"service": "00000000000000000000ffff58630b1c", -"pubKeyOperator": "8643390fbe3b49eb18457bc45c6f81fabf39e6e4809e9e1e1d3213c30d74274afe44fd8a6db348087ceed7d303f8f5b7", -"votingAddress": "3MbdwocHFHs81TEtRCdGCAAT8vE2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4cd0a97e9fe40c6a28382d3af812303f71dafbfd99af2a159882aeb8044c60e8", -"confirmedHash": "7ee046d0b157b697315b3033344c1dee69529c951fa17b3d1b00000000000000", -"service": "00000000000000000000ffffbc28af47", -"pubKeyOperator": "19338bd0218aad8d0cdf8c1629a695df3491163a2ca827a33c03f2c4aff08a3348b027bb6a0f9ba4095c3da7b6819e4a", -"votingAddress": "UPpkErV71wZmNgdKZJGT6ymbMFL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4ce7d9b828ad80ecfcc763bf67f110003dd768dd3f923b044800824c13ef6eff", -"confirmedHash": "5834ca2d6a2507ff808db92999bab17b6ea51eae5256e12a1900000000000000", -"service": "00000000000000000000ffff258b0b52", -"pubKeyOperator": "9034d1c46b1e7b171eaaf2826d1ff8a4c4d925a5e3013ec7d8d741ee06a33ac682b010e425d07bb15fe7d9d951e3e5cb", -"votingAddress": "3WtnXMPQuSmwmAn4FmiQFrcWTd7z", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4cf5e230cf857d397062c6f466a3f55072cdae64e77ce0f49399d5d8d5c8aae7", -"confirmedHash": "fb70df4b4d4f4deef3e3489ffdb1135e7037623b39be17c20e00000000000000", -"service": "00000000000000000000ffff88f37384", -"pubKeyOperator": "9709c20d9803cff128468642c84d6462ad70382ffb583f9df8da41e0b6f755f610d69117de23c00466b47988013a66a0", -"votingAddress": "3KYLoZ13aDzT4yZqxre7qYB4pYea", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4d294cedb88725e803846d29b2004b11c11a4b8ad0b6a98de344514d62be7f2c", -"confirmedHash": "26c936503c70f635f78d0ccd98be52ddface800b190c66442200000000000000", -"service": "00000000000000000000ffff0238d45d", -"pubKeyOperator": "110fb6e27a9dc136619c138a22d9d3821f4ed10955936801744ec325e2d0c4eeb2048ddf403b34399eeae26ec889dd32", -"votingAddress": "3WcQCgGkpsWgmLSFyJrMbubCWhC6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4d4f3c1c4a31e3fe1538e82baf05eaacc5b650782883ce848b6dc192bd6eb20a", -"confirmedHash": "562026df7e5451d0c27aaa84351611b7f2c56703f530e0b30500000000000000", -"service": "00000000000000000000ffff55d1f285", -"pubKeyOperator": "932de4f38830c7654f9152c52b2635a61dc57821ed97dd70774a4b907644f1955c29922bf105d7adc2e076286758add3", -"votingAddress": "3HzHran7iNTbNqHvxnfkQaWGGsXn", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4d62542835cf5ec5a3095d6e39b2ffe88e51258636e2e9798b583b4f79691ae7", -"confirmedHash": "4798a3ab959646478094dbad7737c9cd7f8c066bf5c2eede1000000000000000", -"service": "00000000000000000000ffffc6c77055", -"pubKeyOperator": "041b8693157d4a6b2a23dfa2c1c877cab3b942afd1fefcba9a0e63379e30850e74506472f3745c07cc2a31ca579a3042", -"votingAddress": "2yL4fzT9GkVm8BzpZxWuURc3si1K", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "4d68a3ca7c215e34464f64f1b728ed6a3785f6019c80ac8ed07dbbc6ecc58205", -"confirmedHash": "2075cba9aa3c8d1f80432b34aba2d2eb7b7eb8aaf98446f20400000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "3wGgFmDLrvnfmy9fC5haxqztC1pi", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4d850e15f7285d1ab66f30bfa4fa9f4bb715e7c093d923456cbdc676c9834f40", -"confirmedHash": "a6189f2ba70bedcf6cb7d736dc989ec8434e5ca9b05c48c32f00000000000000", -"service": "00000000000000000000ffffbca649f8", -"pubKeyOperator": "863f4a3a7672c63f967facf801f41fe961fcf26423283fa4f85ddb1acafacd776f4c8741d868631d444dc74eaf32d741", -"votingAddress": "VCm12sBqF6Fi9Q8vqGacdRfNpBg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4d8586133956419e3acd497ffc34aeff246cd277db004594f28a79474bde36f0", -"confirmedHash": "3432138ffe620e535149d2f8e56738a7979f40f2aff8e5081a00000000000000", -"service": "00000000000000000000ffffcf9af7b3", -"pubKeyOperator": "0911947ac6412374c3822b0261c89dd591aa6af13e147639c2bc25578ed03c544e44eae9df0eb5ee1f274033a97088bb", -"votingAddress": "awVtS5SB2r4Jjy61ocwre972WAz", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4d9c7c77dada5a92fda68b04ae35a6fe4a299e460a526ff830dd83567b722821", -"confirmedHash": "c651070dcfd5d95b9682ada0ed11cc352e05fb15969ebbe70d00000000000000", -"service": "00000000000000000000ffffcebd94c9", -"pubKeyOperator": "0d34f34b2965e56761b22b1a090d73e69d8dc6bc87997b9ed044ac1ad4d3078e0b6bfd9c045721d4d78121e49e5fb6e4", -"votingAddress": "W92rE3qbYus3z8hxBcMvgmEKahv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4da5223cdc7a34ac8b6d6659f3a788cb4e77ad5e47ae49f86342c713d47e3a4a", -"confirmedHash": "b1a600310c0137b3e6653a9545e4954a5f5219c04ed160160400000000000000", -"service": "00000000000000000000ffff87b50fe0", -"pubKeyOperator": "88715892d243906750b659756614f121182aecd4b9922e31698d57d32cb1aa1267caece27fe55e10ceb4ac409fcc1f3c", -"votingAddress": "4UT7dHFRzaXikkigEH4Sw6Zrm1YV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4daa44743818c41a077e913848f8ba594c1642791d1cdc2761e307a256f7d7d7", -"confirmedHash": "c8cfd5fa851a786fcf6a0fa04ecb750ad7737e1ebbc654ab1100000000000000", -"service": "00000000000000000000ffff55d1f281", -"pubKeyOperator": "094fc3c03e9e30849c210bf41a8914a264e8b22d70f71536f61f04a046b00c563dfec9fe4950f8ec35a2e19e7ca525ee", -"votingAddress": "2VvtDfchUFeRMv8W8w3ebuYmXGvH", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4daa5ac5ef4c2901aaed95c523b80697a7669e1345c5253f9098d8456c8ac0dd", -"confirmedHash": "e723a8ec69d76b21ed258ebad5c3d5e31273d5fa64ca80220f00000000000000", -"service": "00000000000000000000ffff88f31dcf", -"pubKeyOperator": "0b7a71eb4ad3e67f5a53095d2f65e78a44abd9162366061c9ff09c551a52a091de5c12b805bc4f1a02ef43bcbbceb8c2", -"votingAddress": "3HRK5xzL8J1JnYYrjKns7G3MR5Mc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4daba3a6a198ea631870c8a6d0140396e03d4336babad971b898be23bc1f9885", -"confirmedHash": "e1c816d5704d50b21668be468f49700739b97ca9a9d183dc1000000000000000", -"service": "00000000000000000000ffffbca605ca", -"pubKeyOperator": "0948346a4e6f6bd810ba461a820546234eca6ff321026d100549da1d83cdb323ad11f657d7cead22259d92d8d5221088", -"votingAddress": "4NjLHx1FgS89Xr1Y4bvFzBBBJrZN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4dc354cbb0e04b8125f04a6bf5f962f84dd7f38442a596ee194a7f1ac14a023a", -"confirmedHash": "cbc712dc7ecdad25256befc942adf6a4627f8ec38ca820fa2000000000000000", -"service": "00000000000000000000ffffadfecc50", -"pubKeyOperator": "0aea6eeac706d844af01bc879ce720368c0731bc419e120fc8fa70b5442a4f892c107eb15d5085924cd464741da34da3", -"votingAddress": "bghuAi21S7ys4jVRAk6MkM6Xiim", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4dc479f8a597af81d46d35e2b0c9601a9cf08ca74a13fd4cd9795108ce5df162", -"confirmedHash": "beae829de12b4541bb5f7b1b56c3112bba87218693a3409e0200000000000000", -"service": "00000000000000000000ffff9de62724", -"pubKeyOperator": "0da0fbae93f47952855f8c41990a5368349e8c0c006a703cd79111dc5bfbf3a2aa9736a5356206eeffaeb34b59e5a5fa", -"votingAddress": "243hMLekFZsvzjf7ix28jq3HgJG2", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4dc6835769e7f5242cb4b29b24036c7dd7e83bf50f4975edb60a11a5c6ee4208", -"confirmedHash": "b842bf6e76d8029c5466ac745334ee024820d345e48820322a00000000000000", -"service": "00000000000000000000ffff55d1f143", -"pubKeyOperator": "0ad5a3f7a1fa7b6de79958bd97449f7d1f4de19b7c3e122349c3bb79b3609b4779954cad8b5b5092a96db59702063fd5", -"votingAddress": "3LitsUoj1DCsZpKaPhL9Ltm5dtRS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4dde81622af5719c2eb68037d084aad4b03f4064501ce256e6873b3dc95fb8fc", -"confirmedHash": "92b683438f3e5e5d94bbbdb09159ea8ac752d0ae4b5aaf641400000000000000", -"service": "00000000000000000000ffff55d1f271", -"pubKeyOperator": "11b999e112410e68f9450b732b12b99cf3e0bb60006128185addb5ba7b0ce98df2c7a0794ffe8ea23f8a4f34d45c5138", -"votingAddress": "2vdCCxL1kp96coLaT9LCGnE6xqhS", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4de27843e177b2e913aaeee216b35b57241d2b662843e4ef22e4a001110e2533", -"confirmedHash": "044f3bc29d0a6a7cb9f140f876a8bc2255ca6472a29561471000000000000000", -"service": "00000000000000000000ffff59280ad7", -"pubKeyOperator": "0ad905fa61e89e4ad5b1d0d2bec63443d923a25f5046ef69200a6bacda3ccda84d1df93e9174cfbdffea34ef3481bdce", -"votingAddress": "Ao9qusHG952vxxVjGFeYeJr9HWn", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4de6217ab66f95313613655d3e1e9ff2f1c6398a117870e313fc0ec2744dbbae", -"confirmedHash": "67275c22573f09678a0f91dd9a3d1275714d2a6b9b7132072600000000000000", -"service": "00000000000000000000ffff453d6be1", -"pubKeyOperator": "82c44b0e655780ae0b1d4e96eeb49e6a7c48d5d5c00d112cb8822e2fcde9d9cbc82a64f8c5f4de6223c775295e446543", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4ded06f783634f11316839b1ee2fb96b78a2bba5ab649cc9dbd028a4c9d49e61", -"confirmedHash": "584636afbae66d53f15a9af4bf5cfbfd33fb46daf4a75b590c00000000000000", -"service": "00000000000000000000ffff258b0b57", -"pubKeyOperator": "944b04e280eca3170d5b62253df16ee2cbd90dffc3ebb581fff7ca765663f619989dff2188fbebdc804da7a93eb31e48", -"votingAddress": "2khTWZoKWH2RW8j5CmPsUCxfm3SZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4df7f04aef9575163e1f363e5328077712e99c44c5fac283b8d7e0b585ed77a9", -"confirmedHash": "93753db7416691038cf0b54cba7b358c1a31d993a50535780f00000000000000", -"service": "00000000000000000000ffff6c3dd0f4", -"pubKeyOperator": "05549383e8bd3d933e3a79ba2e7ad7bcda18b4892b658981fb962db3a199ffffe755c376ab3a45224b7012a9c63500fe", -"votingAddress": "44WfctG4wXWiTnSzXVSFin5Y4p76", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4e15f813d0b58d6b4420a9001f75aba3a0cc8023edb2d0db101f92926403f769", -"confirmedHash": "210c0555a0c56f58e17fdeac32ac7fe0f62f45abda65798f1700000000000000", -"service": "00000000000000000000ffff33d26e6f", -"pubKeyOperator": "8151a003a6a3bdb0fd20f2b668425e6e8b8ed13d23eee81241a30a14bda85b7d880789a2b9edf0452609661baf7d8290", -"votingAddress": "3Jdcvb5SrGSjSF4V44fpo8oiF2XL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4e169b7e21b42917918cc4514bd6367cda87dc814f0b3371213f1a80cd1a58be", -"confirmedHash": "0cdde10dd907cec295e3c7d810f2adbc2cb4c6d76b908d220a00000000000000", -"service": "00000000000000000000ffffb23f798a", -"pubKeyOperator": "8eece77e56e89f541da75590ca674ef41195678a5c024071fb07d190fd6b1461d91f538a45bfc4e1b049f44e1feeeb97", -"votingAddress": "4LCF5L6SmmseELG6vxexMZvCdXHE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4e2bfe95f352565b59a4dc9dd9dc20795a847a90255e99cba846aaaa97aac9f1", -"confirmedHash": "b9eabf3b9ab8ec3f0a2cfe50266b92c39a4aaf32335633b00f00000000000000", -"service": "00000000000000000000ffffa8775304", -"pubKeyOperator": "099d873da5bae1d45df98612a94410450cdf0d2c7d65e6a8dcf85b96d8a945d76cec48f9820c91248bb7cd08c8bf6953", -"votingAddress": "VSXhqer3s9mSpByLZ9WhPPaHum3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4e2c286b8274302841725adcdb0ad2bf6cafa1315455a4392ebc2e9886caae62", -"confirmedHash": "c34900949216dd09b3ba0680a78f038943362bd0569f2cf52100000000000000", -"service": "00000000000000000000ffff416cea92", -"pubKeyOperator": "8f9031be564284d5680e840e0dca4fa1afb5d7e88fe864a7d17d845cbdc7495e92baa52c990f81f7d4c43c9980475982", -"votingAddress": "qwstA9oo8L5Tie88HFNyoRMHc3x", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4e3d1aef0eb131e756b3b0099ee19955662dc30fb6b022096f0aadcd8857db3b", -"confirmedHash": "ef22b3c2694ff2f45301c50054a8f967a77c1953bf5922500c00000000000000", -"service": "00000000000000000000ffffb009d207", -"pubKeyOperator": "1710624a2dc8bb266e51f76d4cfdc1f3b1199b271841658270849a74668d0694ac9cf2a6ce0117973e49b163af7e025f", -"votingAddress": "2HHqHZqFUAeGaySMZi4nhhDWBydA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4e3d76696332e2c6f37e8ad43df34c117ca6fb00d6baa04645d493637923d093", -"confirmedHash": "84e7ecd6fbc4c0a23a022bba10c53ca9123b68eb278fe0e10a00000000000000", -"service": "00000000000000000000ffff2d200ab7", -"pubKeyOperator": "165117ad2eb6b271b8382eade8c983b9c717cbe8d48cd0c25d063bfbcdaee76657fd808c9c13dfa413daa4fe8a355d86", -"votingAddress": "3GJBvVjT6MJEbAuLZqBSofNBhGwP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4e5f680997d38172c28be9ec8b7dda2fe4c58a65c19393105a835aba8c408091", -"confirmedHash": "3dec8e7d2e81639ba08c09afe9a48874d331f212148437f72400000000000000", -"service": "00000000000000000000ffff867a27df", -"pubKeyOperator": "97c029164f02ed298fc001ea31041b5d5770f55a7903f1188792fe426f3c32bf873ec8e7216735b8bb25729b5dbed4fe", -"votingAddress": "KfLXxx7Xe5docsNpzcZxntt7VDA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4e6088df6cd761c0b518320e7ce90fa4b003a85420b1a4d9390567f722a56ed5", -"confirmedHash": "0466836740481df381aebafccf63b9738cd756311b9de9b01000000000000000", -"service": "00000000000000000000ffffd4186bc0", -"pubKeyOperator": "008f305713fd342467f2d49d9467056f558971d4fd9674dc49fc9cf849bf7ad751f00fa8d49440479e361c2aa641ff4b", -"votingAddress": "2tHk89bPP3CQvaWPrhSd8QtvLEKS", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4e6858ba6e095cccf7b2cab6294e8105e06d9f20ad15eee80550acb431947cbd", -"confirmedHash": "9940e54e5b07dc4777d29d49d4c00236b4437f6748014d760800000000000000", -"service": "00000000000000000000ffff05b5ca15", -"pubKeyOperator": "0a9cbd8c475671320ff80adde5d5132e529bec1dd904bdde9973a9896e580341a61455318cf8dbd6af7d44ad0497a8da", -"votingAddress": "4YkbK1ZMuh2qMfkchyuL9EwxveTo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4e75d31abb61e38e54912ebc1141ad3d2d35ca4d1d5cdf30722e5041d7cfdf5c", -"confirmedHash": "fd9647a6ed06a8af19228060fa5374b2b727d9622f1715b93400000000000000", -"service": "00000000000000000000ffff2d4c2154", -"pubKeyOperator": "81041d5c61339bca6fc592980103720bc8e0ee1f186589545e22acc255ef48100910aeb4991d7a550c9869b79936776c", -"votingAddress": "2AUST9FdhyAn1gh4zs4JdznSxPWh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4e7b946a7819e2f1120afdcbeea95ba284f92af0fffa1ef0621c5fed5b36bb14", -"confirmedHash": "3fbbcf9fb8e39060278db4d494d4aafce586cea0f3a180db2a00000000000000", -"service": "00000000000000000000ffff03e25984", -"pubKeyOperator": "8c145e948de285649a01184aa2690bdb8640761fd0eb64bcd2862d39933233175212b750957d04754e63bbac070da222", -"votingAddress": "rDQK7dyT8E9xsqRqiCdCtjJwqny", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4e85069c819f2338b84918cc333af4f339f83d07dfab0f2d7ceae0ae3c153617", -"confirmedHash": "6e536cccbcd4ee52c421bc42fd8e2722276de1bd7c0382c51c00000000000000", -"service": "00000000000000000000ffffc7f716ea", -"pubKeyOperator": "88784ac62ed07a457d0cc4ebc7359365442321e5fad0d124cfff4539a13f6f3d571fd57345202714b968dfb00ce3a8cb", -"votingAddress": "2PBsiayuFVpDK4FKXM45Pa8LUfBb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4ec3c8e648f212e02b15730b7cd1b399d0ff24277a0cde9acd32cf3d0240ab23", -"confirmedHash": "89a5e884fe8b3c35a14bb699c14d6d7e4d19b50e2a7dbe2f2500000000000000", -"service": "00000000000000000000ffff453d6bf2", -"pubKeyOperator": "9241d87621c137b8f81433c78cf60423a6d370279fc80650de04d87f0010512fbc29143697b749924fe0c71ce8294a79", -"votingAddress": "3ZEuzJP5u6ipTFYfDU4dj37BhPE6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4ee2ce5a5214eee4a9d40da3f2133d00e395b5b1871ea112ef191ef02b89b480", -"confirmedHash": "76c9fff6e1588782de63f2517714fd5c370cdfe837f99f390000000000000000", -"service": "00000000000000000000ffff40e3a54b", -"pubKeyOperator": "14a25d333ceca6a28752e60ee2e862c7b4fed111074d1c73ccdfe7dc22f999536c6f8b59080dd1c1d397fbd5aa200954", -"votingAddress": "7cGt6ee6TfScPfpyKCwHsNjrJuv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4ee53bbfb17d925b58e66f7ee9e4829b96640014a42883dcb49a54791fece0b8", -"confirmedHash": "6cf3273bedfe063a3fff390434c1a2717f9782e4fe380d520300000000000000", -"service": "00000000000000000000ffff87b502e2", -"pubKeyOperator": "8ba6a5acb68dd933373207c27b5cc011137e3e301306dcfd6a34eae7868e48ffea6db9e821e7fb1b5917858beffc4911", -"votingAddress": "5qKe3SeMvHDbkG6TZfRkriSbNi3", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4ef104d881f9302526a152e510ea3c13330a3d7e6fc8a426ed9ade0e2d2f7bd1", -"confirmedHash": "55565f71dfc18a3218f7eef9683104cb16d3f534c70c890d0a00000000000000", -"service": "00000000000000000000ffff52d315d8", -"pubKeyOperator": "8a76dc8591f8a8cb7cf3b50452b1c1da9b650703524b335add719e543a6caf4bcbd8cdd37413c2028f74775672fab928", -"votingAddress": "rnTUsHYDeE4J6msz5sooaK8ajNz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4efba2e97af01967165f51dd89da1c205812621c71a72b95740a98be0318ea0a", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0a2", -"pubKeyOperator": "98fbe1a9193f559bea7361cad65739f8192e549ad69ab78556a22fba3e1d48c79864143200ad4d98580ac2d9b23391c8", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4f16426e0a19f073bfc380c873a16628a4f47a7d6fae3b470c08e53e3ea135b8", -"confirmedHash": "672d3ecec79ab6b63f0f8483555ca51b6a834e050f3b6b6e3400000000000000", -"service": "00000000000000000000ffffa763dd64", -"pubKeyOperator": "86cc8e4ab543de3ab9dc1bed4a4491d9440ab73b1680c4dca3c663a66eb13462c076abd1a0f2ed4a5caa6b1fd1649774", -"votingAddress": "2tN6YbgLhK3ycf1EEnCLZsFcigme", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4f193e69be3697d773b73be50ac6d7351112ad375c4f36df354d2eb48df6bd32", -"confirmedHash": "b04556cd848640dd9d43edf69837b88d4c164414b2b3eb500200000000000000", -"service": "00000000000000000000ffff9de6719e", -"pubKeyOperator": "85884a7db5e461c0b4677810dd314b24cbba8706b2728559d651f672ab422d6e807def498ab9f583f97c635cf6f819e1", -"votingAddress": "vbXYM1JcXFvYiTYJyHaiYm7RGk7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4f1ff8c0934b28f61d2d1176244089317f98fd87fea8ceab3fd3ef18d2769992", -"confirmedHash": "a29c74fb3479bbcc74497d6602c50921f2f28889b72c7c733a00000000000000", -"service": "00000000000000000000ffff52d31961", -"pubKeyOperator": "02ab52425100d319bc1b5e1382c4eba074f73f2ae94f6e1713ffd9a0f513b541f44d9a0879f48fdcaf3521ebd3b734e3", -"votingAddress": "3k1RaJ6UUDq151UTmGYNseDZTd2M", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4f2d4c3e9791653d44a094e434d28046435f41e44b0a37aeed82d5145cec0d88", -"confirmedHash": "879c0e5bd3dc054d1c6a20d2c21744aa819e9c9e9d9529bd1200000000000000", -"service": "00000000000000000000ffff5fd8aabf", -"pubKeyOperator": "96216ced02ba44e1ddb354e2f5e666c9b474ee516e1dea804d2427f4961766eec0ef43ce6b5ffa06dc852f679feca9ed", -"votingAddress": "FCFceGfFLNPQwWuLrNVqd47DqNR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4f2dd6877394aea8a9e1a0ccd4d97d01b89e16f3ab5487a8311768584c31f065", -"confirmedHash": "ab25b4d2afe1c56f9b33733608b170a3b2b23c76b6e934012900000000000000", -"service": "00000000000000000000ffffb23f7991", -"pubKeyOperator": "864cc66573cfdf5599f83c78bfc0d7358f0c4e92d130a300363c9b0ef59ab59101e83a77941ccaadf2f8d1ecf8e777e7", -"votingAddress": "294xy1PqBuBWgnMZnp9a52G1ZJiu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4f611099dc019a5c67c4620990f76123ce4615b90d2673189d6487de005cd4c7", -"confirmedHash": "c14641d19f521f1153ae688c345dd13908bda7c7cf27efa20100000000000000", -"service": "00000000000000000000ffffb23edcc7", -"pubKeyOperator": "064c3c7d54bfe94031e5b5e547bc668f5a2826fa5623c1dc0b5a76703442203c4b063e49efe02f729611ddc890ef137e", -"votingAddress": "2JnrFVV1yBs9WubAV3bL6dYGcwNB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4f63b981356878fa8cdbd34d00af19be5175429813c59dd8b5049d338561ab01", -"confirmedHash": "92b26210bca9d60f9868d289a95e62d50638e8f2e886ff7b1400000000000000", -"service": "00000000000000000000ffff5fb3a0a9", -"pubKeyOperator": "99110c031bb9e8fe28694bf8319b01ce3e76189a8f5ea6ad16d7c50b0bcc4da8e99f72a1044bb122ab3738044b6952c5", -"votingAddress": "2Fkut6Ux7KcUKeiegaKCFa1ymNmu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4f680cc01636847ff9dd45b47d8bee38da109475d9ad1389790d5c993d9e5aed", -"confirmedHash": "00c192ccb42a1f5ee3153ec2acf5548a7b734eb373d472560700000000000000", -"service": "00000000000000000000ffff55d1f248", -"pubKeyOperator": "03be57c6b32e95e22c1af58ea75a11308e812316cac1ad4920a639df5f3e8667deda7f5f179b18aaeeb733f557445688", -"votingAddress": "2tTvGaL3bLqLx7ujXtXRcJqzEK9U", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4f6f9de727361255417f0083fcf6075c167b810976b72c56f837f3e28b80ef01", -"confirmedHash": "36ffd83b863fd3f3919f4d3343aff81ffae1a83932183ea42000000000000000", -"service": "00000000000000000000ffff2e04a26b", -"pubKeyOperator": "8d30803d46df4a2ccb9c356aa60f35f45f26b44f28b84e857c721a6215f20d8866e358110197786c85a568bf3b57ecb5", -"votingAddress": "2D2dnr5EKwSYvb9dUKte9B6zNjZs", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4f6fe7deeed014d40b8ebb1bcc71412b2224bc77946438b24db773d2100b6565", -"confirmedHash": "1a32b20a911e7b69510382c7d714dd62235a1544240d34530400000000000000", -"service": "00000000000000000000ffff17a30031", -"pubKeyOperator": "122faaabfdb1d5922b496e95419b8a13007a05a7c3396ddccfe6be729808a669ca6d525e5b6171ae8e9dc4d561bf377b", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4f7272eeec602e0b730c157334dd6f49c8b7a3deed90e21392ad2361b9247edf", -"confirmedHash": "d30f7fb359ec43fc9bd81a0ffcb9910d4ae60038f52c30240c00000000000000", -"service": "00000000000000000000ffff6baa0dde", -"pubKeyOperator": "83d28d667a3c25b02c85002103d1ea4b414722fecc8ba0c7096a032c2b2b967b8a364a93edf2ac987a00c816b735d469", -"votingAddress": "4VHiXme1qRGNC4FhQGyNuDrsyL74", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4f72ac36f7baad7092d1f5bcbe4e2777b251f38193ebfde5abdd7434ca8ae23e", -"confirmedHash": "2b71581efecc19b740131639246f861b2ef579ff71cee1fe2200000000000000", -"service": "00000000000000000000ffff52d31590", -"pubKeyOperator": "862494f2ceb4836e7854b3f52db016e3df370df31836d2607e592fbb47ef46b9f6b54919f15347355063694a9b94bcc6", -"votingAddress": "oGs5WxLwrWXf4bnwAqG6qospy2E", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4f81f3b35d8b16eeab4789ddac3658fb0ebc5f2e4cdf7960ae230059ac471b66", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b01c", -"pubKeyOperator": "8268bd6caf4cf7aa48147e3aff22937ad5b7bf54ab75aa8955f295ca1733e7da2ee7f64b8fafcee12dd03a5d469e9025", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4f87cead03be560bce6bc3234b4df8ce08d043478ad97bc8f21515d13e0bf759", -"confirmedHash": "01c48032ce79abbfeb1073329aaa7b52263e03f34f560e320600000000000000", -"service": "00000000000000000000ffff9de67e25", -"pubKeyOperator": "8040c2817cc954d06a4e0a11cfb891983794a62e7a324ce94188519e34ceb4a38a34d1305d5e65af6cc31787009763ca", -"votingAddress": "3mD5ev4THXgC2rQKzpfPqMEpRyrd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4f8c151f7b1e855ff6263505f4682d0d73575837d35de0d306057af2bb1281c9", -"confirmedHash": "2dda4425ca27af1f422983224c33f91c770c2f800359b0a33a00000000000000", -"service": "00000000000000000000ffff58c66bf3", -"pubKeyOperator": "0666e1cc4759c01564c2be71677d1c1597ff877d39d1d4a29bd3b0fe8a8e224004ef40270d2f4d7b8879b00f30e35969", -"votingAddress": "jD3T3jsX8zzqArrQMRv7JcT3rLG", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4f96bc33d7ce3f046574a23d24b28472b508e93e3332fd51705ef48cd1721609", -"confirmedHash": "cd0bbe0ed8ff725f4692b8aff20358327c7936775e72d6ef0900000000000000", -"service": "00000000000000000000ffff592fa289", -"pubKeyOperator": "817549010ce7badd6baf063914b6d582fd57b19c6e440c023098ed33f93a02fbc3961246ef3a3e794580586a2dbafcf4", -"votingAddress": "3r5KPzBgPcBYZR5GwcWYRs19vT4s", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4fbf860d72b20e6f14400af9484d1c416264e03a3c74a7c18d6811124926d24c", -"confirmedHash": "e71eca5c9baca1c48461c6e2ab24e5d84b0f9f99ef3f5ed71000000000000000", -"service": "00000000000000000000ffff87b53499", -"pubKeyOperator": "1534b67ae4a1e083e92080711f4ddb633e827a0003a0c8a6ceeb7fcb50aa2ac1f21e29cdc1c8d084d624f68e0cc557fc", -"votingAddress": "sQCcZnnL82FKnqBj5Fn4aVWiAKu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4fe088a8e51a00d9fa8250147eb908d5a1b3c74b19ea7ea7323a2acea9fdecf1", -"confirmedHash": "68f9eb6752246386767f1e431b82ac10940fd2ef752ac4580900000000000000", -"service": "00000000000000000000ffffbca600f2", -"pubKeyOperator": "8c325d92cfcac55587a0c610f24ed0c0fba7c6ed4ecd9f49f787b1c50cff4cfcd7d88c44a2a3efb12608799046248e84", -"votingAddress": "38scAP9m2LKa4EWGVJAkK3Kq7pPR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4fea4d3d0bcdf08535ce71412565dc6b828d412332595d97ea5ea740dc2cb5cf", -"confirmedHash": "8a3bad37f6e9fb02ecfe8e377163ecdf0dd8acb18e2c83b40900000000000000", -"service": "00000000000000000000ffff55d1f13c", -"pubKeyOperator": "8d6e5c267726d72f19ab9f29747d56500f31f45e3fb9591876eb6d8aa6522f255688bcdcfa1377fdea106106542b0045", -"votingAddress": "2AQAUSMbJL6ejMTVoHUZEbrKfRj2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "4ffe2cf30148e2d04f50add320c2803d5bd7d16825cd5da2fd479d9cde448b9b", -"confirmedHash": "cd2fafa2bf3c9b3f2bce962592911be2d7435ad9642b61db0300000000000000", -"service": "00000000000000000000ffff5fd947c1", -"pubKeyOperator": "99d50e2bd0f24425db66159e9bb8c92a89fd5d55ab5607aa58c3102e83f521b4344de1c47b6b47d4b0a06ba3863c9cfa", -"votingAddress": "364VeLxEGokfCoMc3KzoSfxEZBco", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "50104f8e7f59d5b2dc72f2cd2d87913ce9b2e878b765d38ebcc0f1bce07b73aa", -"confirmedHash": "9129c82a932fff630ff46a80cf992a6097a450221aecf4720100000000000000", -"service": "00000000000000000000ffffbc28b6dc", -"pubKeyOperator": "928156d91fcecaabef3471b803c87069e7466ca8e0cb686890700bf11ba88e7dc701daf6f1b4344f6d48b537c5cc2ee6", -"votingAddress": "Wzfw5HjoEXJsAbtSvSFbqr9JouU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5011dc1d30e29f41014317384efe724439f4cc6e89d00c94a627822d3c052783", -"confirmedHash": "579010d59365c9adde11f5b8998ecfc5bab15a3a64339fde0b00000000000000", -"service": "00000000000000000000ffffb2aa08b6", -"pubKeyOperator": "89fc17b7d4bb817f413f672b7344c82491bf67410d8046b5ac89a310dc3f8f1862e608261c2d83ef3ad51ae7c0c50964", -"votingAddress": "cz7DjKvnKbS7BpfhGU84KGkKxR3", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "501668bbd5cf1f42ed2d51d5f42ca6fe6db5de68ba3f52bd1edc3c56f3bdd59a", -"confirmedHash": "d1ed6016c75ec0512253ead57075eb0057c965ca910499c20300000000000000", -"service": "00000000000000000000ffffa8775781", -"pubKeyOperator": "08e54f445249015ef165e167eb8d86dd1be1fb5c430e213f51cd2b56ced221ccca9f32947cf83da6839371e3556dc2f9", -"votingAddress": "2Mqk7PMDTEjwZdGLR3D6n1vNpK9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "503026c206ddc800157cfca7512b851c80976c9b27c9769de3c1eebe60d511c6", -"confirmedHash": "2361df2cfb3dbd626bff6a20f35d1ab801a740bd10e5a7c31900000000000000", -"service": "00000000000000000000ffffb9e45386", -"pubKeyOperator": "8a645ce4308da24e5aac11967873935e1369c16425c8bcede5ec6c135ac4379062aecd24e07d4d7b2ce4df1259548738", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "504392d25b8749caff5e3e9901c8584d759f443646153558df1fde0b0c60d059", -"confirmedHash": "b60c2dbbb213c99a236e1f30c1d9f41b204f0b13b294c83d3300000000000000", -"service": "00000000000000000000ffff52d31922", -"pubKeyOperator": "0e91e6b78e52a9faaa5cb0aedc595b8d47df93fe5b776aceb00409c379cd3d84bef112fa8268656213b2619ad0f75214", -"votingAddress": "4KDfpQRiCfmKpxLbhUtHCLrC7SPj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "504b47928fa801dd72e6830478e55aafce3c2648e8e9979f2fbdea66b8f55d4a", -"confirmedHash": "53210e5af36af566cdba264466bc84bb23247f87db30fe451100000000000000", -"service": "00000000000000000000ffff9f59c14a", -"pubKeyOperator": "046a802b6616001c770b07f4a73875e5279d004391948bab683d17edf289268da04ad880ea51d3d30e14b690f451cf16", -"votingAddress": "NBj9v1BGAe43By8iU6kfvfvgRR9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "50601a404e1001d5a77f7e6a4748fa408d832e1240461729a1031731dc451a75", -"confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", -"service": "00000000000000000000ffffb951a4e5", -"pubKeyOperator": "184431511192571fae3dbf024bbe78653c53706cdae6955bbb4e482c241b50a29d512a305cc1414aabce031c8b23bd3e", -"votingAddress": "2NEm9hFMCe8AFiHioJxQ14sA3tC8", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "506f8952e3b35e41f191d445707d07ee8782afcb3d0418be109e9de74b39721a", -"confirmedHash": "563d1e28448e78647e4f314fca555f8ba8194497c75265ab1500000000000000", -"service": "00000000000000000000ffffc063f4dc", -"pubKeyOperator": "94fc7e0f97f5c4d46310bfa784603fa7e6961831c0f28f7f4083715d15b972fd31f2edaed55adb60cd0d608b529c2106", -"votingAddress": "vhejVfWnteY74DJrv2CaDs2oKB9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "506ff6b2ee629b59e2ae6f1b26a76ee2d843e0af27d96c6137b922bd4bc70167", -"confirmedHash": "fb80e8675092bbe6941feb1d09c92cdc7d90c9ce50d9b30c0200000000000000", -"service": "00000000000000000000ffffa5e82358", -"pubKeyOperator": "8b2c822a369fc46b7aedb4a1f3740ea76b58242fd5749b2d6463267897c2e2ebede16e61fce20586c91254fb4b340acd", -"votingAddress": "4UnHZV7erjRrpGZmHrzMHf94SVdw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "50789b280852363ebb0c01f4cdc17644b8ba608485ab952f9b5b0b8d4715bcd1", -"confirmedHash": "e903a1ffb26fcaf72cdca21daa975ebc08f57edc97aacec61e00000000000000", -"service": "00000000000000000000ffffae8a03bc", -"pubKeyOperator": "86b1366ad8e29883a76591b6cad43e3c6448645c485f499405dd8d908cbdded4e0b73fc3a85f8f8de3a2ba418c87aee0", -"votingAddress": "24HdWBzjtHUdw9u5vPBdNCQeuww5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5078dbe9b7faf4e34ba850e22947617a5567f443fa37146c824ec56613083b8f", -"confirmedHash": "bb0b09b67dbebed5edd0f20545de767da3db476c66a4570d2300000000000000", -"service": "00000000000000000000ffffbc28e706", -"pubKeyOperator": "8a67462d25875ef375c5a87431308d82903a4081daaebd16983563a1884c858d8c8669ba9f85bc95162e9173c4eeb3a0", -"votingAddress": "2dbwr6bZYGBiTnxMjuXWxPRpqMD1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "507f182a66edad4ec1fb35396b553c04c87b0b746fe741ddf1e54bb7a650c0a5", -"confirmedHash": "233874b4a21afe27d143d4dbf7e9b64b9d46fa5dee9177822b00000000000000", -"service": "00000000000000000000ffff87b50849", -"pubKeyOperator": "8af95a884355ebd1b0d603de448db546e5d2411f2f725742fcaecf0e155c7efb31dbb44452cb2e19e3f76793baf0b70e", -"votingAddress": "A26tSjYZVxsRXsi3VEjvCyo2tjc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "508380578461da7c0b142b5059ae36dd8f87777f3b36e023c56a82ab49f1d173", -"confirmedHash": "265ba3b55cac5759716b916acd01f6d96c16a70fbd715d252e00000000000000", -"service": "00000000000000000000ffff951c622f", -"pubKeyOperator": "93c43ce5875255eb5ea922f3df479f3053f6c4a4927f4f365a8ef63718244a76f8eda9c14202363f5ab4c1a45548696f", -"votingAddress": "2byKqv2MVaBcJHcsF7pcBWKiCUmJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "508bb193f06cd6f0b10e7f793df3a4c4c48bed1190d79cb913c15ec017e09541", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b051", -"pubKeyOperator": "8a530583287269607fa22ccf8c8d5098f58dcb95207c80f67bb7fa20c4318b1470f5cec2ab95cd1be116a3a54302d956", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5093bc237af546de978f70b37dc9cda6f3655818db8144f2e5f8a62bb86eaee9", -"confirmedHash": "60f0c15b1c6c2580b9b2d4b92c865a92b63844de6cec0ace2700000000000000", -"service": "00000000000000000000ffff2d4c2d60", -"pubKeyOperator": "16689fa24ea34f08ac639f3adf4d907e0c73c067efca6b54268c28730cc7514428bf48cfa8294e41d015291bb61b73f2", -"votingAddress": "9XWuPN1sHD7jFLtaWCTmR4HkhKJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "50962897c23eb628b8cef9c6947e19610205ee5c6d4d48e17c172ce5ca81472f", -"confirmedHash": "dc09fc7949f9cbbe722849d440533209f497e25934ff73440800000000000000", -"service": "00000000000000000000ffffa7b348e7", -"pubKeyOperator": "84e656cab14e9605ae2538ff1e58e6497ef593dc633b35dc017b4e2431f49febdcf793bdbb132fc6d8fb30ed83a730c3", -"votingAddress": "2b3wshVnT4t4qEjPQNULJcGnD7Yd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "509f9bea5e70fcf766a9513e3c10059f2fa3279cd570c9a7e056da3d7812b9b8", -"confirmedHash": "17415463615ab5911377882fa2d05bf09acedec78ef5e99f2500000000000000", -"service": "00000000000000000000ffff453d6bdb", -"pubKeyOperator": "97d53778858de64cff480f1e681e8791d1ff03321272ccf2ea91798073cd3c94d8593b803080d70b9242dc33f6bcbbad", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "50a17eee7f2fa90c1fc806d73999cfbd97079669c11d89ee64b520ad22e6d574", -"confirmedHash": "83e1d3406fbd19bdbd0ef441a5e820c0be26f1c748125fd61300000000000000", -"service": "00000000000000000000ffff90d9f711", -"pubKeyOperator": "0c5e83da7a4c4438220127b6b2ba97b028cf6c8f1dd5855b2cd59181a939043fa3076ec149e38129864e13511336aae6", -"votingAddress": "2x5VZNDLk77r4hngnxG5cp9pcdVX", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "50a1951249dc067444f96aff0982dcdcf23daaee83511280b10c282c9fff9eba", -"confirmedHash": "4eb09dba76634f8ea98934dba9ed53d07b6680bcc83bbe310800000000000000", -"service": "00000000000000000000ffff2d3f152c", -"pubKeyOperator": "01e8d309c0129592d2c320a99695b8cf465a0aaa9d82f1fc278be88ae9faa2a8491faebbe9d368e5fc013db721e025fc", -"votingAddress": "3GVy7ii39ajEo2UiJnZrvU4Wx1Wx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "50a3d70ffd687f0a2d4ecf65ba726b913c9a9076305cf3a0ae642c0928b5a5bc", -"confirmedHash": "3550b4f95ade9743bd2f22972f090033a4d43ee28b3309941d00000000000000", -"service": "00000000000000000000ffff2d4c8088", -"pubKeyOperator": "8f73d820e1d4b2fecb4148c699026aecd4b8bb2314cb7d299eb0cdae44001f63fd56dc6d5a2545b9163c36309aa5615a", -"votingAddress": "3NoiUAYeuaNcEdkFQJhhFT7D9Eix", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "50ad1da36acf2d271cc0f294a55ec20072ccf7515b0001ff8d1e261e6fcf7ec4", -"confirmedHash": "63169833e187bcd91cc974d0644359b0b87c9f3f735e74940400000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "3ZbXkhiWKECUGzSjMfNGzemUyjs3", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "50b39ff4e2b686649f8e57972a380fc575e772881fad2a5bc049920a5a8ae2a2", -"confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", -"service": "00000000000000000000ffff52d3158a", -"pubKeyOperator": "83de36664a58d7d4683411e57a62a2929b2914ecf2c1e93216cb7a6d5f59e620f7ed94c5ae5fa6bb1b1c2cddb7a495d7", -"votingAddress": "3gMtqk6SYAKhZrtAiYBsDULvRBje", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "50b8616771e99dd6d3bdf97f5767f374301419414588cbc037c3450cc703d016", -"confirmedHash": "ed446f3d7358db25281bf99280936b6c37fe5b0e397044220700000000000000", -"service": "00000000000000000000ffff05bdfd6b", -"pubKeyOperator": "898093c4fad7e15868d115dd043e593fa79f4a0307fdffbbd07fda714b03a6dac0c09efa923be07e3a46a19aafce8206", -"votingAddress": "3Sm2vovXej6Wgyw3aBc8ChEENTE2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "50bef677a59ca0eb4b6870ff9d95e3fa63e54d12938a48035618af79ee20c2ca", -"confirmedHash": "cd90b0c8def4411a79709127681937f5c3abd06f8be1b4830e00000000000000", -"service": "00000000000000000000ffffc035a451", -"pubKeyOperator": "09950ea874dd86c72c14eab1ddd22b7c257a6eb112fa3f4cd27f9b9fb0d08fd374454747579c0edbb8ae9a0875275e8a", -"votingAddress": "4S5Py7ugYWX6v25WTJLkF7Shf8pf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "50dbe5ead305c57dd8a36b94cfb10739422d922af53d8c4860fff320c2815f8d", -"confirmedHash": "fdea694d510e39493a708b6a35b976ebaa9fb667fcca4ebf1600000000000000", -"service": "00000000000000000000ffffa75662fb", -"pubKeyOperator": "874eef1c25a7000f11955ea2e4074cdd5a700038b2971ec4e0bac7911d2bbbcbf486e538ec3254ac5db7fad16f68c84f", -"votingAddress": "skLTAnU6VeCSjS8kFxvFK5pZbAS", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "50dd8f3dcc283357866511bc265d44aa22816a6fb681012cb3a08308a19d22e1", -"confirmedHash": "7e6b9fd42b246f657fd984064bedf1c6a0028b32533359971b00000000000000", -"service": "00000000000000000000ffffcf9af05c", -"pubKeyOperator": "85c5393238d7c21a3276040813bb801f76a0c9918653fca4f80b8095cbbf1e0559ab82cb02ebdc4952cfc694e6b45abc", -"votingAddress": "4JHFYeGELLKJ8pnmKrssxu3AuxXo", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "50f13f6f5f6578ef0a12c522c7c2b4a90f03b786452b8c5f4bdb11dcffed73de", -"confirmedHash": "c8de078a0c3365b251d3ae316158cf54798142de866eeb091b00000000000000", -"service": "00000000000000000000ffff9f418079", -"pubKeyOperator": "110fafe1303bdf36aafe9baf9400d46c16f86a1a18255c47ebcc92757e3dd28e4152e5e2772de1bfb6c47b67adf0288f", -"votingAddress": "2Cr9o9693bAcyEMyD16yVFFEnmwf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "50fb9e2d35c1c64e2c434c60ed377d7d0a85d884619ef34bbbd1c96f76201c3f", -"confirmedHash": "6cfb4a6e795a5469de9baec429e9c78e9c9768b09d14b2c30400000000000000", -"service": "00000000000000000000ffff2d207cd2", -"pubKeyOperator": "8a42a53c9e81ee86f6064f5cc3a53494dd7617e40dfc26a3229074824792c22041d7b9ccc9b4ec55dc6cdf3b9b20c630", -"votingAddress": "4YgZTe7ohfRZ4d8Tq1mHp2xpheZ6", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "510ea5d5fac3203946921b0d2c1b96c8a54da67a44bb1429240d3f2ec61ae4be", -"confirmedHash": "daaabc32013ee5a6da1abad52b8e5ff55cc03b5a62f0a0670f00000000000000", -"service": "00000000000000000000ffffbc28b6ce", -"pubKeyOperator": "887f0f980a9619cbc1c3c180c93a1d2c548c144f3145060cd2b820ab0441818bd435188b068b876ebe1434274eb2ab4f", -"votingAddress": "2CYjnFjntpoE5WaEySXoZ1JD4UeE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "51233f57404f07f850a13b469779462ac67b38dd4c9991d06729faaa30e09928", -"confirmedHash": "b56c2b7014ac7c8acc022746f28a05734553e68e1e9fb9ff0600000000000000", -"service": "00000000000000000000ffff8c522948", -"pubKeyOperator": "036382e6ceed79b7c8389090696ffba5e3f179aed1b7194679c9f3b9995d50eff2dbc022b464b7596a0a2c83d62f0c68", -"votingAddress": "26KMv8quLRauA4uXzUAAmP2U1FVp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "512442df6ed8eabb6f7d972f6a19626d33787c0a9161caef80dfa663d6711650", -"confirmedHash": "f11c91c84a4f57d758a21410022090f0c4a0995d93015bee0b00000000000000", -"service": "00000000000000000000ffff87b50fee", -"pubKeyOperator": "92baba2876e4bc6a6f34356ff5741a5ada3decb3ce973ed265aa419b625a6d3389fdbccd0bf9940d7e9344a9d1a10320", -"votingAddress": "4AvTVf29wUSsfwirBUtaY9Bb9WCX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "512c1870efe0552dd3539a39c3b209ee09d7c900a45bfee33f9efd272c819187", -"confirmedHash": "68ceea9a651b87975fcf47ca389d350df610570fa7e64bdb1500000000000000", -"service": "00000000000000000000ffff8b3be739", -"pubKeyOperator": "14ef57b0e1c761b0fe0add1d6b761d0775d979b9f5c84faa95f82cd7d169f2d9130995df5135275706a81426819cc849", -"votingAddress": "BgsGcWiioDrBmCqMQVHqoaRBrwG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "513ce43b61fd14bbd112b9f90626b030926510df5a6098a1db06422cfb13fddc", -"confirmedHash": "2b80a6724faf3cc58c90cce7554aa9b2f84d33db79bc86921300000000000000", -"service": "00000000000000000000ffffa516d98f", -"pubKeyOperator": "0a2faa5f3498d09d4c7edfa08c4723406f003853dbbfd1328b8b02f10b78fa16ae931e13de8fc4d44824f4b279115bc1", -"votingAddress": "2RvGYT5TfoKZ4TiwTSvs4ckMWL1S", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5145a9f07a12b01936b8bfb48d093625a9b8252d83794dd1e1d558dc3836492c", -"confirmedHash": "6b15936d5ceb69b27148a1941a81548ee2a1649d572202a52700000000000000", -"service": "00000000000000000000ffffcf944d2a", -"pubKeyOperator": "93963f48e49e92d2fefeb56dba1b1655021d7c093c47cd2de9f06affe6069d17e2d41e5bc700467ea34ff78c36197af0", -"votingAddress": "2RnNUbGATKf1wWJiVN2wY8aDYLpU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "514ee6f590daccf5e163ae4096cc1e723e1d5d73c1ed0f0a3c21283c1bddc9cb", -"confirmedHash": "3c720348c0a969c9ba11ca4266554dd95e6c2b631c5e78ff1000000000000000", -"service": "00000000000000000000ffffc2875b1a", -"pubKeyOperator": "888b5b28cb723a2260f523eca3fbbc30b85658e73d607094ea49aaa5f8be24476d1a57d7d0bba4ca6e0d18ed1e7588b3", -"votingAddress": "2AkgbEtymWNfocFTY2Q8r7hy3CCe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5157559bff47ea6e4008fb2a149337cfd71edb4b827f5944d04a6220b270e419", -"confirmedHash": "fe73472c7776ba0335f76108760d4f0ad5f695b290ed771f2a00000000000000", -"service": "00000000000000000000ffffa877500e", -"pubKeyOperator": "92166ea48c5ec892de338e306c11613126d0eae570c1b08827b91634972cce655774c40799234d3d5b8b580a2364d609", -"votingAddress": "P26hcTMmkJhLaCFrGQmaBdxrrBM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "515a175f01e66ebb893b702dc7c1e3396bfb4f03450376cdaca2db42ea16a50e", -"confirmedHash": "8b18a1a8b596d3992e7a0b89c2c88bb7f5d02ff68330285f0f00000000000000", -"service": "00000000000000000000ffff50d0e3f8", -"pubKeyOperator": "9125105d67fc994b282d59db48bb699e169f722aef252d467ebc428b57e4e31d5a409ce6e05d1d6958be2eff16a2a276", -"votingAddress": "2BQdUdxZXXriA17mmqSuCDYMWR21", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "516a200da673b9e0a13088c08c68a58d60240011b16cd8f2974510a9d07b648d", -"confirmedHash": "b0593b2d2ee49c79af8a051223c89bfd53ac45c105432da91300000000000000", -"service": "00000000000000000000ffffa7473c46", -"pubKeyOperator": "0fff87b7faee5abbbe03c40e3f71be48205b78500f05b87a201d7b9c7fc783c49f508a59a94ddf59804da0e0afe3a41c", -"votingAddress": "EFBsbYYJxzk5fVX7thXZaaJbERG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "516dd021e55950640cbebac8e4d76a0e3301b058585d68e3ce4dd896362c0254", -"confirmedHash": "83fc51b2c593a1659161bafc65098629e7e8c9e044fa6b0a0800000000000000", -"service": "00000000000000000000ffff87b56cea", -"pubKeyOperator": "08873848ec595afc2f468792fdc757a299efd8158697a39740486cde19f6a893c4ec7096f43927349ffb22a5e75855b7", -"votingAddress": "3qMG2KkdTNxgmCa7UrhKzd9b5m5P", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "517004936e66d1e1733450bb3edcef5b9a359535e054697c710f90a3b89c049e", -"confirmedHash": "8168b3ad5d59fd1fda68340a2cbaf9d24f6a8cfc01997b5e0400000000000000", -"service": "00000000000000000000ffff951c999b", -"pubKeyOperator": "984ec473d5a429ba2f57e41cb31c1cd37c64360b5cf5841f8bb4d7056788ed25fccb934f7946e79a9ec6ab8f063d09f9", -"votingAddress": "37gRM3WSXTtThXibQFmXvZqDkSfG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5195715ed5324ce1f6ec1e6c0f3131479ac13573957d22946fab810745f3e046", -"confirmedHash": "dd89ca3dddedf12f89eb24bd1cd804062a4c7dac8c2073581100000000000000", -"service": "00000000000000000000ffff2d4da321", -"pubKeyOperator": "08661995d7e3f1fc02b3a8db83e38aee1500673b186cc57a434cbd3d9c5687703c698f451f1bee137f090e8481a3f29d", -"votingAddress": "3pk7K4hDWXZa9HYaVqs1epn7YCMb", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "519a01a634b78bffb09e55b6928080ce078c1d73a12ff5b48744f57a763c8845", -"confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", -"service": "00000000000000000000ffff2d4c3a71", -"pubKeyOperator": "02fbf0bf5a79918fb6678d76167f9461e94e2402e8427f143a807257e440de888788c45940028a3d8c841ea39721b52e", -"votingAddress": "EcGryp4yR1LawZVmRCpbGuT4f6z", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "519fbbe048f2d7e0e4c657ecc2c37721638eab35f37dd8d6411f284b8eb500ff", -"confirmedHash": "3071d1f893d5f8daa7b7dd9d7aa51cdba7e38834ec9a23ad3700000000000000", -"service": "00000000000000000000ffff55d1f105", -"pubKeyOperator": "95715cd801a40df05a5a09e769b2f0c7268639eda22d99691c466d3d6bb4ae60a89e04a0f5d56c3a145007c41b520033", -"votingAddress": "2BvuWE2NUdv92yjG1NpaNiCRejJy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "51a90a2c35c3b42635afb52cfccda0acf026343624b554e5777eb9fbf2df484d", -"confirmedHash": "2361df2cfb3dbd626bff6a20f35d1ab801a740bd10e5a7c31900000000000000", -"service": "00000000000000000000ffffb9e45388", -"pubKeyOperator": "0585c3ac3e1b907acea9220f43f03c318db14186a2c2177c96b8e356ab8ec97fdbdab7b2e9410c5f64c37679a0c3b169", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "51ba70040a6e49429e75dfe53d409848d772b0bbb48cf906b077a1c4282ef24e", -"confirmedHash": "0be20380f11bacbab818886c36ac98c962f8ef9a359ca1ff0000000000000000", -"service": "00000000000000000000ffffbc28f174", -"pubKeyOperator": "024e4d2b401eeb2d4b1bd4cb59f3d0cfdd6583ee35383a3ec347d692aae0cfa3ac4725c0fc8998fd2d836b22c2159750", -"votingAddress": "2k2qRSiWqWhdsJG2HjnkeVpWj6Aj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "51c86f17b63137ea0eae5b269ee643ea8c097f14f83e76f045d7fb815a8e38a8", -"confirmedHash": "627106f1dccc691e3652884d3736584df8df012a19205a3f1300000000000000", -"service": "00000000000000000000ffff2d4cd1dc", -"pubKeyOperator": "062c0319fe4bd266d2021df324f18c710d6fbbadbd0aa8f3755bfbbfef02f920972362f9465644337b0d4e0758aaecc3", -"votingAddress": "3Jiy59kNj5fbvDxptijXNCsfkBux", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "51d95ee508a381a1694ff61100230f89895c8088b679f20ebb1a0412f88d035d", -"confirmedHash": "107ad82681c710901106a2880cce2e79ca3032669c3ef1ac0500000000000000", -"service": "00000000000000000000ffff823d3425", -"pubKeyOperator": "174393687f94dd636460f28288f598dda6930f4065a6e80eaaf600d98fb00842cb67d352652f52ee88ca245eb31ed2e3", -"votingAddress": "3pcU6LcgHikSQBLh6B7F7qauSBw5", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "51e887c3a42097e4cf84c7f2c46d943ee4596fc6075f3bac3b0445280788baf0", -"confirmedHash": "b5562dffb0791c9a97f6a862aea43bf42a8ee69e5000c5da1b00000000000000", -"service": "00000000000000000000ffff68ee9e8d", -"pubKeyOperator": "8f00020804935c6b866af404c3e885885341877ff48c8e8b9144bbc578cdfeb142dc25b89c67083738dc3a2d24228d32", -"votingAddress": "32dJHLg7EHmEBiMEkJebvsjwMHbi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "51ed044c17ba86d781b2302bf75ed4bbac471f89fe8b867bda99db145868fa44", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6e95f", -"pubKeyOperator": "04abf5548abc72627a3ee1e73473d7fe202ac331c3cbfdbf1d605d474988613bc2aeca42d14302e3c3141816da461e62", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "51f5505ace40d3f6a35f1239af0191dafddd23d5bafc0361d0fead74f765790b", -"confirmedHash": "dc1c1c5f539ea09699d84d5d74aa1a89c738123c32aad4140700000000000000", -"service": "00000000000000000000ffffbc28b990", -"pubKeyOperator": "0e747d8a79dff0d1314cb7fa581e63082f28fdb7eea30e083f2b986d0c5de4d1cb80bf2a86de35a6f902bfd7085d6f67", -"votingAddress": "meRSXeQoEz7ozv9kJKqfMp1FzTi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "51fea30f3a50a7ca5572b7e7b830df5e9db271661435a7b9155e2e448eb9d4b3", -"confirmedHash": "ef9c16922809a38c131f9ea59c085c786fc90bf7cb43d11b3800000000000000", -"service": "00000000000000000000ffff2d9b7945", -"pubKeyOperator": "8901506d5520e8ca760f1a9431777e8a1bbb3a041efd7f5b4febd03947fd1cd83fb07830a21156d31540ad85aef0cfab", -"votingAddress": "NUgc6LAa7txMPkMZAkSYtd97Jju", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "520963cb61ab5d8108b441042ad7418e2d206614bd004ef5c5b7dee658b11c67", -"confirmedHash": "5a36a108d87b142451c92901e401cbe790e7f514080bcb3c0700000000000000", -"service": "00000000000000000000ffffa45ac549", -"pubKeyOperator": "1261f9309ba4a3c38270ec4ca8a443a1b4d7f34cd499744a14a319f50bac60d58ce79fc3a9addc2fccf7324ce6742460", -"votingAddress": "62rb6ETTqp8SjUpasEo95HHZ9xP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "521b63a1f94aa700e1699cb147651fa4e177803c4f8df750ae5289382f740a97", -"confirmedHash": "428205264e57387a62e70223d80b4ad733b4c809135f766f0c00000000000000", -"service": "00000000000000000000ffffb8499886", -"pubKeyOperator": "10d8f104c2f4b521a822f3c81ae8e44225d397975e19677b53192cec5661daf94b9dd9f1dfe2cdbdefa17570ae40bf5f", -"votingAddress": "4BZ7XaXaRJre2W1cWaQayxkgMs8M", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5239900fc5ac8d996464daecd04a3d8dde2d243ea5fbac182e2fbeca8106da3f", -"confirmedHash": "a3297f41dc7322cd114952e1a6b0da9fce2d0b227faf73b60900000000000000", -"service": "00000000000000000000ffffb23e9fda", -"pubKeyOperator": "1707aba1961543fed6a722a33301360e0f6ee5276b5990914919f251ba168b71c2cc20edf7e78fc223820850ac03740c", -"votingAddress": "4Ahb4nhR4dDxfqJxG4vrtjCgdBw6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "52579e4fd3d57354ba3ab1811b404f6e58f6994cf561d3c9cae0fa783813cba4", -"confirmedHash": "5df3dff3a11e5bcdab1de4dc5265b981179ba134c24e3daf0700000000000000", -"service": "00000000000000000000ffffb23fec75", -"pubKeyOperator": "00b813a012973396cb8bc298ff0ac9a135f0aeaa9d9527ae5ca1cba54c4ccae278dc2e704252fe18eb19014c51030850", -"votingAddress": "PZ7xVGBBb57xZuSdZq6T1ex76mQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "52698f87ab75b52ae6028019e0b456272b21e3319578bd2cb0951408af141266", -"confirmedHash": "755e879941a65d55f4b61ce3d63ba32e55f240f0eb7282470900000000000000", -"service": "00000000000000000000ffffa763bf69", -"pubKeyOperator": "83f583cb54e728c466a39bbacb5094cd8f87aa95997cd67b70ed4087c19ee392d072404e6c41c888a62521d2e6b04fa6", -"votingAddress": "2oWNg1FfUSQUncNp6CQDRZF7QNmK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "526de93462e2f55c0aa65a6e8bbc3b8be670391c03ba3ebf1ed6b772c3b28aa6", -"confirmedHash": "e3c35885ac9a51cb683c576ee4c036a9b2a4ba467a4270f70500000000000000", -"service": "00000000000000000000ffffb280ed83", -"pubKeyOperator": "11f5d323116406d76c56a0cc333e34583bde4a5811842c0c3435963a69b51124c05eff85ebc2c45674d00c0cf392f2a7", -"votingAddress": "3u99QETF8c9cjhGq5A1ADR5UmNc8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "527277f0cc8cd5ca95c8ac0a051ea9b4d5d902c95ae6be76b39996244a7c3f52", -"confirmedHash": "fe096963ac6afafdecadf238e470fcb612534d52ef43c3671000000000000000", -"service": "00000000000000000000ffff2d4c59ee", -"pubKeyOperator": "0f6581f3302a9a03f2723aef76e376847562f8965797609ea2d16cb8b2f6bdc544f03bc6a9ba3dbd307903cb29f53ee1", -"votingAddress": "227Eon8NGrSwnEA3c8vcAQ1AYUMz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5273fdc82f2f9d78b642b8f4d7a02d1e28d97e090b460f7de2e4a971de6ab041", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b01a", -"pubKeyOperator": "93da0cce18d1f400b99401fd0ae4457f5c088a530d8682364a135fac474e3534125d5cad995bf55eef7619f2854f55c7", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "528a3c0bd851257b4e396b3c637a79e4eb707e7f2cab2c772a35d18afc88b611", -"confirmedHash": "3c7d553d0d5d8b122b2704124f08b8ba7e9241022b90db400000000000000000", -"service": "00000000000000000000ffff8b3b57d9", -"pubKeyOperator": "8cad8af1d4ea64ccf2528c2f629688d24017b214ca04b02b218076e6441b1e42a08e80c44e1489bad951dc8c38180600", -"votingAddress": "2ESuUxyXGwK2uizTV3u4TgAkTa27", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5294f46bd0b6b1b9481a5da304e4c8a6e4a84b802f4f99182ee355ce15e1584c", -"confirmedHash": "bd31f35c5cedbf07c6ffa716f2a3acf8f725ab42af8758740500000000000000", -"service": "00000000000000000000ffff2e1ebdfd", -"pubKeyOperator": "0c5340af17ca7054208ec335e7758c62804fe96534209da0fa8823ae80046e6e58719312a73085cdc65be737ad8ada65", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5295ffd7db4069b6d062dd5ba58b20d6ff413bc2bccc1848cc6acb6302292517", -"confirmedHash": "b486ccde27e00f68ec784e41480b60535e8138a5f73263d50800000000000000", -"service": "00000000000000000000ffff52d31585", -"pubKeyOperator": "127124074b383473ff9e71e1dfbe4764cc6263c6b54b446d4f9d86376095c88ffae6b0b23edef60925b6075a85c14d5e", -"votingAddress": "uMKxKnBdE7is2i1nrZiTR6GBU6V", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1760496 -},{ -"proRegTxHash": "529fb061d5f48018b097e5d1832a3a6f632bdbb199188d940706a3916c17d436", -"confirmedHash": "69c8d0112b90309e059bf8ea05c864bb9719cd7602d66fee0400000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "3SwcQ4gmuUKFMkpz4RFY8NfmgiCp", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "52caeddf8063ae2b139654f9859330418f4827718964d6a8697c6f81ab4974f8", -"confirmedHash": "c58971671ff2e5b2629c64cf449fb208b7215008b0a2aede0a00000000000000", -"service": "00000000000000000000ffff52d31508", -"pubKeyOperator": "95f907ffa24d7af57142fe3bcb144dd8d21ecdfbe9f67842a3308d32c18bd9bc11f2c8b259dc1fa659193ce78cbe9ce4", -"votingAddress": "3Yfq3fqRp3m9516YrZ7QWcRZSHx2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "52d664c557f3f47dd8a8a180169d87c6797c9e3e852900eaf428ee192551b23a", -"confirmedHash": "92b683438f3e5e5d94bbbdb09159ea8ac752d0ae4b5aaf641400000000000000", -"service": "00000000000000000000ffff55d1f273", -"pubKeyOperator": "1302b0ea9b0644e48190ec2e7e4dec6cdbafb70af19bdc576d479c7217926b527438ea723bb10208095e295226d9732e", -"votingAddress": "tzq2NUmgApWAm9BsPv5t2zfrzMA", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "52e00c35c6f553c8d8858a01f5a3a80c0ecce4d5d4ccb1b48d5a2d4562ac848f", -"confirmedHash": "18ac8238bce08ea5b37cf23692024ccd657f58ecc854c1ec1900000000000000", -"service": "00000000000000000000ffffd5885b7b", -"pubKeyOperator": "034f2055202ff3be03ebc5a34b9aaebd16e8b85dbe6c681076558820a46a86a25be154393fa48949ac58423268cb02e2", -"votingAddress": "kP5VA6W9ZNdbxo3x3k9eV3NB9At", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "52fbf403026739287fcb186a89b695d295060e0cfa116305dd625da34b8cafb0", -"confirmedHash": "0b8efea2f3e20cf2843aa13e49bfc02b1556f0d4012501ba0b00000000000000", -"service": "00000000000000000000ffffb280f3c2", -"pubKeyOperator": "0081e4ac02e777fb31465936e39f1257187e266a16ed0a670ee1dcd4239ae345d581fe06cf2e87a233b054907529ba9f", -"votingAddress": "MtrEpMRw8L99rCwKcqUZ4Mm6Ac7", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "5308f09b2ddd34c0345161233767486ba0e189cebcfefd1bb9d0071a1ef0844c", -"confirmedHash": "080bcf451015f30edf0ff605b17a5a127b00b5f4492518240200000000000000", -"service": "00000000000000000000ffff8ff483b3", -"pubKeyOperator": "82b54467c7da75ad857d04a9ee6a7d1a9a1850dcc5138c53ce86fad4a3d4826d6f3be73f5033b21bd1f0929ec038bdb2", -"votingAddress": "3ef5JxVx9gT5yJsuh4PVFT3F9ZNp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "53178b5ecd359dc57c4122c6928366f359d878338e7bc20a8aa5c3f5af939b2f", -"confirmedHash": "fb591861e58a6a106b999e02a097c47dda1fd663a3115dcc0600000000000000", -"service": "00000000000000000000ffff416cea93", -"pubKeyOperator": "0de0ef0a751ec1963e95c42d595003a5dccc0fd9a4c7ba136f2d72f64a6b958b703a749524fb9b01cb0048f3879d4899", -"votingAddress": "yRGLFfitymPDtBMn6KsfaeJpbSM", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "53216ea0aa03d210935a410efaf936114ee8d2cbed85e775230e1c12286e66c1", -"confirmedHash": "cdd6aca742f4eab144ccf7345f309920d34684f42f74b0582200000000000000", -"service": "00000000000000000000ffff52d31510", -"pubKeyOperator": "9726599e7345a13abebe4ebc75531c45a1b17e90c23d294f31fdc154ca49a8ed6e4fca9f0ab3e7a2898c7caf1067fd7d", -"votingAddress": "2wCAEKne2dCYfUH21NDLBAqEBkdA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5328dc09b89e75030952c33b78a06699a93d3dfb5b1933eb176ba2564b649020", -"confirmedHash": "bff0de52557d2827cc474c1fbc47b134a74d37f00023de091400000000000000", -"service": "00000000000000000000ffffcebd35ec", -"pubKeyOperator": "1689613a4923d60d70356b49af78bd4885d8bae458dabc77607fcf39c4ef70574348872180d4a98b8d81747e8cfcbdcf", -"votingAddress": "EWVmiVJQTmGwwoGcVgq2ErYzK5J", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "537224e0191505b228fe84f2f2bcee3d299479d24a7bc6714938886c719b8ab3", -"confirmedHash": "487178a0fed8e9554b06e56d4454f9cd929f7310fb1c6fb60400000000000000", -"service": "00000000000000000000ffffb23e9fc4", -"pubKeyOperator": "814cc55c662b55d7f6801ecc16a93ca2ed2bdffa85fd3561a9d6506afca72ba9af9ab4962916e38852c6c8f9ad52b137", -"votingAddress": "3bM4W8drGVxMTkPWfqXvZuq1WPR9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "53788a670449ba1ea3c4dc16d9bc84029c91d4b0a83f31b45f96729b679ac81e", -"confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", -"service": "00000000000000000000ffffa8773e5d", -"pubKeyOperator": "82183a1017b7b4a7ee0cf6394fe18bac9ffc1bf55da51895480c5c1305bb1bc47c12f61b116c37ca75175d0a6fd87129", -"votingAddress": "4TXJpBdBPQQsVbkoW9AtqWh5VXiV", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5382f4a263982e63ad6bee5e0e8b67222f65d778f9e07b948c76450237a0efc6", -"confirmedHash": "192a408e2aae4e54f0b8475e75a714dd31daef3168c5a23d2700000000000000", -"service": "00000000000000000000ffffb23ec65e", -"pubKeyOperator": "00d488174088d51882588d0eda427d13c6a8c7868303612b7f27be5e4de01431f051d071c6632656acfba11ac441c6f5", -"votingAddress": "2Bk22BPfpdz4NfTwxKefMjRgi6Gw", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "538aa9d521a00edccaa807c8ae2adb1f5033cb5f1eecdbdda3cbde881cf83f11", -"confirmedHash": "a0a413fa6babbd35ed3b17faefa9ab85a95cfdd357f528ee3d00000000000000", -"service": "00000000000000000000ffffb280ddaa", -"pubKeyOperator": "10617472da90bc1c3a2792c26740a54c135c4ae12543d6a834f7f1fc1ea02bba5344eeaba1129910081d544fa90195a1", -"votingAddress": "2BdXmJHxqfgmhp5ELLn4Rw7vkKCS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "53923843c2cb135ee47bc49ce8d8456c8cfdfe3fbc20221c2e00693af66b707a", -"confirmedHash": "b6d39591d746ddc8c5b5f1f74fb591cc33e41b018fa9f0fd2d00000000000000", -"service": "00000000000000000000ffff8a4444a0", -"pubKeyOperator": "9395648eebad762dc7ad728eec415737c9ab0a6b0b229ce354466c6398dc9301bdf8a09c33af48d50fd7e405cb23ad77", -"votingAddress": "3BHbJfNA4A8dFJUU64oZrejokvj3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5394e7a17a9bebb76ffac3096c7c2cd91ea53dd614679e8525b386790a8301f6", -"confirmedHash": "bd4c6b8f86c302d3c846d22b2260224d6997652428de294d0e00000000000000", -"service": "00000000000000000000ffff4acff4c1", -"pubKeyOperator": "8017a43a2e80050f13e241610bb8221677df653f849086fd03808ca6483b26e413b73639363b14d5b6a055e9348c747f", -"votingAddress": "4P2Wktej6VyqCjhyym4bZP4XqSnB", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "53daacc8736af6d980ed524a766e0c1fcfd2d0b4d9748bbfa1b301bfce39ad12", -"confirmedHash": "691a684d858a733b277462506d2ff788fb1656e9dd2f0a610200000000000000", -"service": "00000000000000000000ffffa76349f7", -"pubKeyOperator": "8cb67d8b46258c91f6a8da1dccc5b491ae21b8dd7fb755d509d6eb4781c41f41c4fe2ab7a0784bbaec1f0f0c99df0a16", -"votingAddress": "43o6zNjr55is7wpa1nENu6NhKG69", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "53e09139fd7478c5fc515b74044c6cb75613ba1e031fefebd65dabdc438f8895", -"confirmedHash": "47c7377cc561e015de56c0a854a144f252d004786ecb220a0400000000000000", -"service": "00000000000000000000ffff55d1f1b0", -"pubKeyOperator": "0f98a83303b029c4952af145923c101188928c95e424e52a0f5784f25ff8b9d17da1608a55219ecb4ae895454322bc3e", -"votingAddress": "3Ac4Jo8ui9ey5JtMSceN7tcnNzPY", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "53e231220d0dec5dc6db1c75b972c9f88b525cb138a1b9d79c3b8103870ec83d", -"confirmedHash": "70fbbfc076d088af4df094e5674825ae0db1056364dd6faa1f00000000000000", -"service": "00000000000000000000ffffb23eab3a", -"pubKeyOperator": "05ec321a51ebee928fbdb79f4b79ecff9b5a492f397bfe4daacb4ac60461013865d1009f8fcd1aeab49adc93c49516cf", -"votingAddress": "3QdgBFqXBCjB1LDgodd3PYadCbK6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "53e8c0290c3f1d4b749b0ac98f0b6d40349a617ad571fd2192655586614b74c2", -"confirmedHash": "76353e87592f1df03d253c7b07c8e36ec7c01f046cad49871b00000000000000", -"service": "00000000000000000000ffff8b3b9aff", -"pubKeyOperator": "063a22ed8a0caa934107af52d7fc5e1af558069b81a71cdc28b1ae0c6db41091432e750de0307259d78958e0a68f0936", -"votingAddress": "4MVsFbHE2hVTYcuJ8cGjPARcgefS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "53f203ac9cb110ad227664e6403566bbc6698bbe366c6cd9eac615cf0aa226e8", -"confirmedHash": "bc61a53731825ebcd0f4c534cdf4f31ce48c6a0e6155e7dc1a00000000000000", -"service": "00000000000000000000ffffb23ecf80", -"pubKeyOperator": "0aad1c7f45985e73450171a37dbb7a1e19e8dd39e81609878bd0c10712a8a8f95e354bde780c73da3923cfb3fc6a28ce", -"votingAddress": "49U6gndZp63nH295XmhdHrtfC9zM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "53f455729912ddcfc1aa65945df64ee03838b5067243b0a85922a7e485ca5fa5", -"confirmedHash": "9b69f17244d21881d47dfc9dde03b5c7edfb25042bb5a8950000000000000000", -"service": "00000000000000000000ffffbc28be30", -"pubKeyOperator": "080edda84b2967075cb549ee9ba38005cf80a6123f2d5f058d2662b4335842fe3e908adba367e1b2c61e1bdc858438d3", -"votingAddress": "47hhM7x4i3vr72wPJ2TWFYLvkPxm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "54089561505962b18f7e2c48a2e4cd6a93312a5322dd6db82b8aa97ca6c35e89", -"confirmedHash": "37fe61bc28ee3d6c4b185d326a546d4e563975fb0740f6161400000000000000", -"service": "00000000000000000000ffff8b3b899b", -"pubKeyOperator": "0a9ebc4d2c51be3ffc133a6e678980e13390e680d24dee1a4cd764489bf0f002f641d5eddcc6b45ff47da505e9d9e971", -"votingAddress": "42ntwiTSy2fnrSQ7dkCVqUheunZy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5415712ad19d7987b261b7b56e677cc3f2b80e230a7bc1a213f3f258e12b22ea", -"confirmedHash": "751418276ee74c7516c64ca83c7893cbba7efa2237ef5c970700000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "37jhVdmza5ta4cnbZTqi4kX1QWPY", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "54206e01cdad5690efe39a5df4739b8576b26b1931273f95133ee53ea8023ac9", -"confirmedHash": "b8a19babcf3aa5275e719fcc0d09de155b3648f32f80d3e20000000000000000", -"service": "00000000000000000000ffffbc28b98d", -"pubKeyOperator": "16ab972c5cad3cb0b1ef5487ef5b94fbd4142f1d65c3438cb182ad61f312cbf94a77848f71f973826ec9c446bdc817c5", -"votingAddress": "4DsdBkHxXiBdTcZabf5sAPdFFomg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "54442b122a56d21e67d434b83145d4ba48b8853e85bebd70bf5dab31b37308e8", -"confirmedHash": "bfb93d26c990365439d4a32b92f45fa580c0674dcaa63f170100000000000000", -"service": "00000000000000000000ffff55d1f1f0", -"pubKeyOperator": "81d3b795a529120c4abe4ae8abf29f29de0a5ff56bd4f3ac65f66b8179b326a4fdd2711d9992dd6aa792333954e3af69", -"votingAddress": "TC9vYvKi3GgwEo6vnjcxGr65XgV", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5445f1069976e3bf70ccc0565b1a8a4e779292f7719caa126fd95be63b2925bf", -"confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", -"service": "00000000000000000000ffff9f45d42b", -"pubKeyOperator": "901a882a011b70127e0e72552c0e308385d526f5d3e43fdfacb78ea52a4eee5519e00ae4e64a592202ab55972a99948c", -"votingAddress": "2fJKkD1Z1SRSVUAhSayjGPuVwoS4", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "54482b56fb9b3be7b17c521620e6fc1e4ebbfcc6e99b84a5570eee1be6c23120", -"confirmedHash": "2840bd224b85106cc49a9b090324f00b652d98768a07b8d10c00000000000000", -"service": "00000000000000000000ffff2d5575b5", -"pubKeyOperator": "85c1c4356318b7f276ebf93b8900d058c451151e70575bc9078e746cb572cc93498ff0d03c0f4d1cafc954befc70c5e4", -"votingAddress": "DeP4zVob9gQWSeckD9C4PrKGM3v", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "544b6a7abd6d2e128ff73f40ff0fe06226019d6e6922c50dd77c3fac84af93ff", -"confirmedHash": "deea24e962fac02cf223dd40dd3f1d84e4375d0d51276cb70500000000000000", -"service": "00000000000000000000ffffa877500d", -"pubKeyOperator": "0ce19d67ad90e118ae51b46c7ae6e75d4e0d0bfb647436b7d4109694eed32a895678bc6e6ecbe82f49b05ce687955cc0", -"votingAddress": "wrzQMy47jduerneN3RzZRxJ5Hws", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "545d9ae4e7c52b43d01d962ae0767b4e75fb125d9c39723d808750e5328e44ab", -"confirmedHash": "41eb25b3705258852abd5844a302f8bf2abdd35ba9e124e50f00000000000000", -"service": "00000000000000000000ffff052d6a39", -"pubKeyOperator": "82b5a00e64efd19e471421de24ad6e06fbfd3ca7eacf6997f45f9bb5387d8a5130be272e259a82db658fec9bbf353031", -"votingAddress": "2hYLMR8JA3yQGB7mqm7W9Z3vmccH", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "54624763485fee83a71dbbbe0210f58f26ed179d7aac7f7da2898a22c526bad4", -"confirmedHash": "aee06378e9e6fba48a1b7f9ca793e66e4c309aca92e68efb1000000000000000", -"service": "00000000000000000000ffff2399efb8", -"pubKeyOperator": "027c38f653802b7f62b2923cbe5053914eb125396cd218c940037925185f6b26121019cc95be48798e7bc45ff8483777", -"votingAddress": "2zvmrWMV73KfuGBTNaVXsxEFwD18", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5469c7209ec9f7707d94af94129be273d9deee925a1be69a11dd92d3f48fcaaa", -"confirmedHash": "78994400be76144202a1da8ceeb7793d24ff007dff555ac22300000000000000", -"service": "00000000000000000000ffff22e086c7", -"pubKeyOperator": "13d5d0bc417a6de61c54447d7fae9419749cb7c5615ef0521b5a2928d1a62f713bb59eff0e572274f5aed5358f89f191", -"votingAddress": "2SJ88HiKhbic78PXTHwMfCWBiBQU", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "54703fd73044c1753726567994c035b899edb68dd49f859064bc59f9d2ad8743", -"confirmedHash": "b9d70d4631d6fca8deceeae206b4071be4a35f8a231d26bd3d00000000000000", -"service": "00000000000000000000ffffbc28fbdb", -"pubKeyOperator": "89a4a96fc7a23ac3de06eb2c55dd2d8e24057e77abfb72bbde744dfd8b8a002460cd07dd19692ecbc89021be39117389", -"votingAddress": "3gVTTRdLBp9xxpUbzjFVK8krp7ji", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "549eec35d083645f94cad64425c692a0e2b266e32fa68d1fbe94a723155b8856", -"confirmedHash": "758ef98974307bc57be30ac0db22a3116db3b9b08fb5a7211d00000000000000", -"service": "00000000000000000000ffff68eebcbb", -"pubKeyOperator": "00a332582d27709c345d02565c05776d99671cea0a9dd107a5f715a66cd2a423deb3e896b086bde130cf17e0b47942cd", -"votingAddress": "ZjqZPGBG915zU2SQEdtYZfWfZpj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "54d9f0bf047cbbeb3fbfa5eb74087e95785aec058fe80f2ca936e1be3ba58c0e", -"confirmedHash": "e214b09d0f973db51d2c7e611839eecdf05f5c503e7272ae3900000000000000", -"service": "00000000000000000000ffffbce2b698", -"pubKeyOperator": "8481a153eb9c0f6a52c65c95e9f347e912ce029b56cbd3feb770fbbb6a255923451bb6d9ff48f2f3cb4413a854cb460f", -"votingAddress": "2MyHkwMxh4AA4SQAHTSasrGiGpeJ", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "54e43b016d1707a0b813e4dc59426731ee8fb7c655c7bbb61ccb2827818d5731", -"confirmedHash": "09b5533b5beb65bb3659602a838bbfec098fc792126e32d61100000000000000", -"service": "00000000000000000000ffffbc28b98c", -"pubKeyOperator": "1047f1590485b0eba8f8babb76f7e84b9c515007ada131e2239ff546d097aae35dca6cec9e378092088b3f62f722ae66", -"votingAddress": "3mMfWy1ZtALHGAzeQumuT5Ze6CbF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "54f1a7f134b5f23464bfdd4a5b41bb09847935cf8230775d186cedd271033e69", -"confirmedHash": "5deb2f6281c6aa19ec3a8e29e74f3d5ba059400e946ecaf11000000000000000", -"service": "00000000000000000000ffff55d1f1fa", -"pubKeyOperator": "14047194114ce6fcc94df6cc5befd1b99a8498464034b56c18818498ec20e43a3bbd181a4ca9d45860f376abd36ed8a4", -"votingAddress": "4GiwQAgLVWMqHDCyTHQA48V5YAvc", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "54fdf99b69bba4d81707b71281b4f7522b510e388c1ca056b81787af1bb9b8c0", -"confirmedHash": "62d121838ab3a41dc59a1321a5d1429c6f26e3fe1f85c2a80800000000000000", -"service": "00000000000000000000ffff52d3194b", -"pubKeyOperator": "88b17567669a7e19652458151d32ca20c1ed5d9cefc567a344390631cbe65dd0a965e8c9ef7d9463fe2b3203d86b802c", -"votingAddress": "2f9E2bbHT3ypFWY33gQfZuqTJ5Mv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5514a8fba9f041706211ba35a785fce355c6941f5a0b72759ec5a4cd10b97f31", -"confirmedHash": "5ed4f5fc30e936bcc9c149e0495d75962417f1653c1a2ce71f00000000000000", -"service": "00000000000000000000ffff52d31908", -"pubKeyOperator": "0e9f4273233170e5d0d42786b15eca7fbffb801927b533537652c5021505010256260adc130b8bf47ad154b18f181522", -"votingAddress": "2cELzyYkR8t7Widzrzkfwm6oAh3m", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5519745eeb984dc2be491e77b09896d037f94ad6add5b534a5a96622e5eb84ab", -"confirmedHash": "8d9a83b78446f9ca2cebac29f132e97cf33f7cefaf1c8dc91c00000000000000", -"service": "00000000000000000000ffff592fa53e", -"pubKeyOperator": "0bba5dc0e216fa128d8701d0ce4de39e2dc39f16a0a3ceeced7fcc89d17b65cee32362bc68b712bfc9cc5490c334c6e6", -"votingAddress": "ydQSudjW92YkMtymYQyhU2n7Joz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "554fb6c3eaa11a7e1500180e80c2714a3168881079038509cbcb244d7879d3fc", -"confirmedHash": "6a2c8a71716ca7c2c73bfcda5ae4940e49af9e5bef2301801c00000000000000", -"service": "00000000000000000000ffffcebd8862", -"pubKeyOperator": "14b0ced7bad21b25ef76fbb7dd656a35fa513a9cf1cb82aa1b04d8e22035ba8ce0961a8f671aceb0b0681395ff8732b2", -"votingAddress": "WhJMx6nHAkf9Yb6BktDjNJ441QJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "555797b8e677a7f1d94cd4595caba290b0498cbef49183a71fe8f789dc7b4355", -"confirmedHash": "0a3424ccd1d4d1beab23b417ae3ceb3bc221f8ec14d216f40800000000000000", -"service": "00000000000000000000ffff50d1e5e5", -"pubKeyOperator": "1735b6a94448fc5b926d4bf33a568ec0563ff55f199bd54bd11ee479c1c4787cb513be6d9b76adafb1cb52d98b5a396b", -"votingAddress": "2p1oey2vdSwYrE52wm5Sm59w7meD", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "556c08d4962bc7da0ed101165133f2c3fa6052c8a88d176ef9cd07fd23db7b41", -"confirmedHash": "b1d8147276265a35430bb73787d6e76c229b3e63282f7ea61700000000000000", -"service": "00000000000000000000ffffce511043", -"pubKeyOperator": "18c2fdebabcd8c5880cc06a4d422f28b945de5ec64a8e25de81074c2fb44cad52eab55926d1a18b073e6a064a01e0435", -"votingAddress": "mXztN7tvKK8U2X6qu5uKrTbAQJ7", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "556d57e0943201121e3baaa5cfcbbd3f271b5a97435be1a5dbfcf0c88e188654", -"confirmedHash": "a3147cafae5cccc0a1f2e62855588a35db9891fc111a9ec30600000000000000", -"service": "00000000000000000000ffff8bb4d4ed", -"pubKeyOperator": "0918aa09e732aa263c78799a811b31230ff591807b50f93e955cc0692d6a418d1ba0609b5c46f1709d2a2c9216872c2e", -"votingAddress": "EcjqvuwuDB62Rb9EPYY9URxKhY2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "556f8386270a9d45640d3c09dd8d46a9b6cd15366d6f9c35624ab0887f942f3c", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6d365", -"pubKeyOperator": "06a92da63d6c213c8d6431f8aaa2e01c4bbaa363b7c04aa3716abc0cc7c4514ba937d722cfb668b9c3735d853d7ad891", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "557d688df6137e09196a02e645ad009b7023359980e0d4ffa62915740dc3f870", -"confirmedHash": "a8b4104818ad25efbc50f0baa441a38707e40b8296217c270500000000000000", -"service": "00000000000000000000ffffbc28fbd2", -"pubKeyOperator": "806fa2fbdd4418265063e4ca1e273792a365ddb4c382ddc1445afdfa29e702a3adc5b600a8d4f013448915e054a84ddc", -"votingAddress": "3F69KuoPwkBkfWtrRd2LqLEwst1b", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5594dd59b6c89ba56d3cf96658862c5753c3f3897baba9bdd241f8bba73cb2a9", -"confirmedHash": "e0d5838a81d0ee7d1d848e4f8f2ebf70272b2149acb177860800000000000000", -"service": "00000000000000000000ffff55d1f112", -"pubKeyOperator": "18e47e316ca8c33fcc1dd8e0d6be94b8a3144440d4b702c3d0102cfbbe2ea54380904bf31b29042fd8964bb3fcd3ae94", -"votingAddress": "37YjRDmD98vLy4kc9zTA3C8hsSRU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "55a4116977946b3956febda9c287ada48004d21f9159c65a884e7655fbe5c5ae", -"confirmedHash": "0154fbb8c74a3b8dff418678e53bb4a5243df4b9fbd1d0e11300000000000000", -"service": "00000000000000000000ffffb23ed180", -"pubKeyOperator": "0090b8a58c3f1e3d2b9dc4530c06f3f7f96431d5dbc8acd40f7cdd501e6a520317162fe898f9ff0e44ee2d57643819f7", -"votingAddress": "2Fik59NgCSyhAE8yeYz7PRRfeRbw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "55af719f1c11a77e522aeb82ea436f4f434c7bb50ddc99ef61e3cf869d50a5ce", -"confirmedHash": "834e9e6b307d52f98b459467939ced7f3f97c8effc114bdc3b00000000000000", -"service": "00000000000000000000ffff91831c43", -"pubKeyOperator": "0462c1c40b802dea057e27cd564c5fbc8601122ead64b79df959d401f1f4776c1b107563fd8c059b80b38122638abf1f", -"votingAddress": "3VSktAAn73osDkfswWkRwmMJ71X2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "55d8fe3456eb9621cc2d135ca8ed9a37db59cfdadc4b37790469ae95a730063a", -"confirmedHash": "acfb51382d06fb7b23b2bb4655ccbc0cf023006d8f68d27a0c00000000000000", -"service": "00000000000000000000ffff03dfd903", -"pubKeyOperator": "108f343db65c53ffd6d4a0f43140e8a0168ed1264fd4dd5068add7bdff272daf011ac355f9b6a17b93fc3869d1b9392a", -"votingAddress": "2XNXhYiWJ5S24zeusKP3g9jqxupb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "55e08f5196cf0da956b8803a06b766aff7414719b3690c44e509d84c540087ef", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d5209d", -"pubKeyOperator": "0f80b205639ca3e8308260bf3c0ec5a9ce728865d4d26ab0a60ac61c5c5c5df91f717bbc29fe7b7d61aabe8c1ae8786b", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5602d473af5f173ba3b21736c860500b247e5932521a9173052352062bf7d67b", -"confirmedHash": "203b420d0f94416a61ace28aa860ca47487b444368664fc90d00000000000000", -"service": "00000000000000000000ffffb07b39d5", -"pubKeyOperator": "0e8bdf116c2b03725e19c394f5ce13823ead0c68f67058da012bb6553b2fdd27d3abedd7053c60430f780f1eaed82843", -"votingAddress": "4ZaVi4bvkJJv4eujJDuT4wUgPoye", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "560fed2cc7f67be44c4c81fc82e2d514bd529af0d7332ba8cadf693644618be3", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6e39f", -"pubKeyOperator": "80d8f28eed47b184a310b4511ab3fe0f268809f889b5360967db46038bd766266c6afe5fdb28893c302dd85a8679fb28", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "56195db565e832489d6dbefc1eb5efb28fcf638ec890072d75ccd9d51b4473e1", -"confirmedHash": "3a98afcd4f76e62a7dfcff6f27ae9c084d9fc139dba24aac1900000000000000", -"service": "00000000000000000000ffff52d31540", -"pubKeyOperator": "191c007bd3e08359f39960071587442910b74c3bbf3f032a508583cdcf0d400f253760d3c8392377da87261322222a32", -"votingAddress": "3z4AexJSCaC2oaXNUNUxhkxbHzM3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "562876316e3128a22110a46286bc69821e50a26d9c8c0d480b2694006662a9fa", -"confirmedHash": "99cf86a2b6d76eb9683b3b8a5a1ef15eaabbcdef1df82df81000000000000000", -"service": "00000000000000000000ffff33264090", -"pubKeyOperator": "19f40e9ad2cd64e81b3c4a5cae64d58ff5a14be8c92b2f4cd69eb014761b711c464a120356ca04c8e7160a375c624b9e", -"votingAddress": "2wfbGWc3Xvf7NMVW8nqt7GTa9vjp", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "562d83167b29e29c661130e0e70cc3aabe3dfa8ebcb72ebb0b1e560b92527ffa", -"confirmedHash": "26947752c9b552855d4ee180e6c26b8242bdb50b8abcbcfd3500000000000000", -"service": "00000000000000000000ffffadf905d1", -"pubKeyOperator": "90b8fd737e346f99c4d07f7b092f4795df54b058e4376d64800fa2585097e1514257806f75cb1c648b8e5b0ad7aa86e7", -"votingAddress": "2zBxeVFVsEZnnUabdu9buDt95HCk", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "5631403f71432a61f786ccc4f573f1f4005823d62b26e17c5a834fc22b5e4bb5", -"confirmedHash": "92e88e8c6db10d1940f2ac18144fe08855106086164582001d00000000000000", -"service": "00000000000000000000ffffb0df8508", -"pubKeyOperator": "8c3e897f918f6645f8a6fe6f5b71d7e0bd9a86a8f1bb8b07b1df4aae04e86a428c69cbe9237564fba35f773bff44333d", -"votingAddress": "2nx2o2p27vmvbVFjkzgtWa9vop3V", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5631dfae376f9c1d108d7c5445360ab85a27e2776c5e159349bb4656ac7a35e6", -"confirmedHash": "eaf2463e8a576011cf2dec6a71c7b77dcc1bc4054cc0bbed1c00000000000000", -"service": "00000000000000000000ffff88f38e26", -"pubKeyOperator": "9288eb223e2f32d7e4e381841d9b6628a830d2f19e54c79c18e163ce4a4d0d2e40160c291b8d8316a8c651a42f70a07b", -"votingAddress": "45Gi3ikCAMM34BpeZmnWGcmurzcN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "563809e19affabcb2eeb076e49f6889ebff4419b675fb32c8fa2e7de86a5fa19", -"confirmedHash": "649852c1a5999e39889b89e7baa05866242f8a65c05f185a1800000000000000", -"service": "00000000000000000000ffff87b5fe3d", -"pubKeyOperator": "16a5c6f69b8f1f6a6f5dd58b5e8d22de258b0822f85274c4fa965866cb5ae5efb270ae308dde556f34f0cbdd6ce9452e", -"votingAddress": "KMbgWMMnXJzWyfmfQgA61977peo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "56420398efbebc30257e0835a135e5d1faf12b39917cb1c0781021d7a26e0863", -"confirmedHash": "546ca2ef99ffebdc41853fc79f0e9644c260ab7854295d431900000000000000", -"service": "00000000000000000000ffff52d31523", -"pubKeyOperator": "052126c34be6750b3a87a0a7241fdaa9d638c6ce4067573b8b5313bb24bd4c5b9bae39f046b682d4b3525490d7e01ee2", -"votingAddress": "3piFnC4dghMLYnKgp8xEuJB4bjrb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5642a2f7d0c337ad5da307f50ad0c8dd85500cc05713790d88d9afaecfba6c77", -"confirmedHash": "0411d017b7ee1560505499d5dc738aeaf18746b14de85aea0d00000000000000", -"service": "00000000000000000000ffff867a261c", -"pubKeyOperator": "1769513e403a05c4f59c065cf69dab2ecdc2c905f21699ce6826a8ae1fd64bc3459c151331322f3112e41af14ad548fc", -"votingAddress": "4RJkU4ohx6PrVTM5trRxH6Xo49f2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "565039da41c2a1f1cfa8cebab48255cec66d05f0f684f779147daac014dd0d2a", -"confirmedHash": "33edb9326ec9af8fedaefe8710dc9e584fafec5b88cc7cc21200000000000000", -"service": "00000000000000000000ffff2e04a26a", -"pubKeyOperator": "107ad8e650a58958aa8057e4f3bde21c7b09cd1753241ce14f0ad4474c9ab5bd70d065e9b4bba508415f3b40cdd4584c", -"votingAddress": "3zJhvKXJHFsbJ4oThRZq31cLpEj8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "566493c67e9d2ce45e2171aab29337b5a30e0cfd5a394847f96be9b8519822ad", -"confirmedHash": "c14af2a10a903726fed1cd86f38cd660334bf6bbfdbb199c4700000000000000", -"service": "00000000000000000000ffff34cc43db", -"pubKeyOperator": "92470b3223d8e59eb5f1678c5fe1e6e45a78aad63df6c7d5f4653dcdd0e5538c13a9b0a0348d82e8ed98b221985b2ceb", -"votingAddress": "2pNWo1prQioubWJEBS3DgpRPs7Gi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "567b9613497ed9c109da3baa7ce10feeee4f80292f166a3490c1e30512a3b968", -"confirmedHash": "dcb6280e4ddf5e65aea2297de13fb39657f7e44b40b5af420000000000000000", -"service": "00000000000000000000ffffbc28b488", -"pubKeyOperator": "8137a7322efe2d2f4c73ce35bd7619f1af20cac29f209d353dd9e34bda4066e0ebaa823bc389498d0799c7509d5f3d2a", -"votingAddress": "2B2gfjRorFzhyoQGakhLSCqJ43ho", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "56962ec2e080e8ac076ea4df00447b16fd256c3236b4f8d447d771b832b35952", -"confirmedHash": "de0d1d3671937cbde0b09c0fe4dcf4e702744c4cd21e30b51800000000000000", -"service": "00000000000000000000ffff6523c5b1", -"pubKeyOperator": "8c74f387fb4364dc040680e5245edc22cce380a089499dbcabc5fe758561f91f57f2b503b58831c71661a0ecbe63b437", -"votingAddress": "2nsDoNG2mu7qcttHbsT12gnEYLwm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5698ef05bcb330da7a54c8b7d3f47aa43f938dbf7fc960e2ce24a58e98660240", -"confirmedHash": "a3e43c05adcff93d62c4c6011b7031345c56bd4f789b68ac0900000000000000", -"service": "00000000000000000000ffffb07b39cf", -"pubKeyOperator": "86ff342646a89bd1a1b2d0a91884145d97e61e54fa7ceadbba383b6f2c3e044952de3fb5c5527630ac3a18f1fe1a7d00", -"votingAddress": "2tzYBAJpyJ5HPbptZrfAbq9Zrh9G", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "56a74d934575e840d741a7e59fe8584c71f72a647f0ae5f8c2bfc1944064c3b1", -"confirmedHash": "a9ce9c38b81ef341276d3224aaf42cacef1bee740d7a09a20c00000000000000", -"service": "00000000000000000000ffff86d1c783", -"pubKeyOperator": "0fcea3c0eeb8827c43b564c5167f35e0cc3292dd568121dde064ee7b281188c0f55c9b6560438eca7058f2944f46b5f2", -"votingAddress": "427pK49hNRrdEDkBiuTJe2Uteyqd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "56aa079cd596f4cd69d9bc5dd0f7d8cb948dcc1f60c9f02030651740f6ba73df", -"confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", -"service": "00000000000000000000ffff74cbe43a", -"pubKeyOperator": "829f0431b39ee129f44b59e13c3a8bf323275c6e5b9db252d5ebaf933c375558b9c5a6f2e8edcc04d64892329ff9b584", -"votingAddress": "3mLDWiTL7wBSmvZRHBM2XUHKM3jq", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "56c5e2b721758a0c56b7fda3c31213f8a97c0511f62b3fee0ce9c332196fd5d7", -"confirmedHash": "b3ee13734164ee6ecc081d91692d2a2dec5d03dd59ff171c1300000000000000", -"service": "00000000000000000000ffff55d1f1e5", -"pubKeyOperator": "07f058647edb22e21fe481fa473030c58733123e77a9588241d08ea703f5040915c1a369b82bb606c5775446cc306fd4", -"votingAddress": "43qHTqr3gsNtS1XpbECDRSUi1DV6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "56d491b0b3ddd8d3d3c53920c5365687eeefd950a623b8a0d5ccd0f4cade754c", -"confirmedHash": "35a25929c6c23f758d7e72388aa97ff9bb80097bf26969ea0700000000000000", -"service": "00000000000000000000ffff923b99cc", -"pubKeyOperator": "10694a217916dc239879d350ac433595248d8ffab0a98f105c79f1f9ef2d616096705a954b35b616c01d75fb4657154c", -"votingAddress": "47CE6YUmBc77cfo3WHmNBWQhB64B", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "56dd64ac3f859f4d31dde417bc45e3b71b59c6cdc7b5f7d5ee5b81ddd175fc8c", -"confirmedHash": "65743b27df20ce4631ce8b80eb99e5603a082be2fda34f862300000000000000", -"service": "00000000000000000000ffff68ed84b6", -"pubKeyOperator": "1799536a478cfb23d2c51d6d0d8f5f041458e2ca0c8703c7cef466a9bcb7df7e167ae9071e16783b51d1456e2e594473", -"votingAddress": "2UAs64SQ5wBZY4pKsuFgybTSAUHj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "56e42c10a9ec3e91fd66f077333a20c63383a4806f134f18ec34f4e571b6e430", -"confirmedHash": "0c7a7d9bd96a468b82a404014224a3b4df86a3beda224f180c00000000000000", -"service": "00000000000000000000ffff2d38527e", -"pubKeyOperator": "92ee9892be1809fffb65b39a1e7fecc9b433828fefba2084102e42336f56d9e505a4379203c65b6c6625533e4dc5d027", -"votingAddress": "41egnU5zDAvzbeKooFZyfMV2tzJG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "56e6bb0d819c9fd6366353ae7a9beb4413936d1a8f083a418f1674df4c4ef706", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffff80c7716b", -"pubKeyOperator": "17060f42bd45bd22f0987c9a9ea4ba27d5ee9e290b4839eec76e30f61058020201dff07ba599004f8f9c6f95db761d41", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "56f940dbace43327a54105bb5ae72d85c2a1f448d388b0e644405eb1673b312c", -"confirmedHash": "394d40f25efd0571871436692f022b0c5646f6ca94a1c4831700000000000000", -"service": "00000000000000000000ffffa877530f", -"pubKeyOperator": "925cf94de37b2b2fe06e520974f2b810b63067922a6b841b1764127aba09f05ed7b80b090c209c95c2a65297f1e691b8", -"votingAddress": "KNXQYH3DAmRdKvwFryEjMX51uaJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5706252c3f735708d3e7431508b046bc2411a97ed2bf0060b38a1e44174e9820", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96889702", -"pubKeyOperator": "963a9d2d639a415573018f362e0d18b5c99d47f81b451e96fad1bb1a0ba480153b29d1b19cb9f65452183162f96d6224", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "57154a60ddfc3be7e2d30663833d267a4e645b5b5fe722620e62ebb75dc5672f", -"confirmedHash": "772f3d1556b293194f3898274545b9a9a2f1271fd6cd5b630700000000000000", -"service": "00000000000000000000ffff55d1f134", -"pubKeyOperator": "099f26af24e3e293fc8b35355cbd478f446940ad04f2665586eea7fac2f0701ac08d9293e30ac97c4da79aafe6571e75", -"votingAddress": "4SiFert56ymZtK4egqqiPU81o5Kn", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "571b92dccfbb311cee9b04aff42d7e93ecd39267ab2b3604dd3ed9f8c227a607", -"confirmedHash": "c6500b6b74a8d83974f0213d55dbd387ff735f109b4a9e8e0f00000000000000", -"service": "00000000000000000000ffffc0f1c6f8", -"pubKeyOperator": "84188a0e1e8ad3759108edb6086e597face6de945ab12193dbf70c63f093b87b41f453f8940acb8ad9d1b42638c6f4aa", -"votingAddress": "2hpQp1RULuJ2z1PepVdDoXqrZ7zW", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "57236f2235d351b8c6c0bca1b854db0f6c8245439344fb461272c42ab9e9a358", -"confirmedHash": "cd1a15d309777df3d60408715cb525e2f5945b412fc864602600000000000000", -"service": "00000000000000000000ffff5fd816b0", -"pubKeyOperator": "04c25a639f1d660989db103cbbd791361480efe5ba50f5ae3fa0a723c6ff362ec253204da513cbea997670db3a703eca", -"votingAddress": "4Gh4zS7cLJEVYcKgbAUmSntKz2Bk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5724a3744c7768cd4f7548d43efc7882752417367df52b77321dbdef873b4a91", -"confirmedHash": "4a54df7cd69fdeb9f4c99de9a89a3b5fd23ee17e3f3feb082f00000000000000", -"service": "00000000000000000000ffff5f550b4a", -"pubKeyOperator": "80661216b0120709bf19382e8f2b55218fa5765eea8fd1137550f734a3de5f463db353c5d392cd809c60396b958a29c5", -"votingAddress": "278qumDkk3vCSoS9VgZi89uq4b3D", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "5729eee0ae8c532d64186606199e65af8b6068526111acb575379f0a46f6bd81", -"confirmedHash": "67d290c14597bf72400ecbf2016e6baf4c7bc940e6f269331800000000000000", -"service": "00000000000000000000ffff55d1f120", -"pubKeyOperator": "97be43a4bc7759b59b4c1f59e0b132d1222cf4e2370a48ad0a3a4d58672706baa5e5f49630203ae5aff521258532643c", -"votingAddress": "2XjwzLFJfYgrrgaYYrPqpYTa8SLr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "575691d05cb0b7dd6252091d9bf246dd53c95ae8f6cff3a7be00404e8ad94f87", -"confirmedHash": "971d111019ef62e92dc6d90ba95deaff44586f1965e5877c0f00000000000000", -"service": "00000000000000000000ffff58c64b4f", -"pubKeyOperator": "08707e91b2e21dcd1921d0f7750ae8a8a810d02c4699f9fe270b4c95196e7a158589c545037140c0cc9f2ac395a8d8f2", -"votingAddress": "GTcbqFp5EZqTJX7bRhrzN1xmhus", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "575e379196c6766cddbde119fbae664e66e936d03d8d03f8465f9dd782e98e28", -"confirmedHash": "17e1df58e23a97163e65fb80442bbe1e9a350a010263c0de3100000000000000", -"service": "00000000000000000000ffff90ca6ba4", -"pubKeyOperator": "92513d2e70eb0fc6dbd990dea0f8a7733088247baffd0dfbdc76160d97b75ec09b0e021e17e79777c9f22fc998e5f357", -"votingAddress": "49NZXPtgLSWqWqUdSU2KADWVSknj", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "578f0ec6c718462b0b2e706a2e57590a9b71decd0194a1d1f45502d2c63adc33", -"confirmedHash": "2efc7c30c9237be335d66d55d91965a27c3a1884940024781b00000000000000", -"service": "00000000000000000000ffff87b50850", -"pubKeyOperator": "1719314556e198ba1e55e2b345c048cd6599019a494d3f5add734ba75f9788edacb5bccac2ac6d3443366d7f958fafbb", -"votingAddress": "2K4bMgCAB6t1GM74HGkkGoPPNvBd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "57a32576dfcc8a89f75be0e55dafeb82db65eff7137538b737f29d75222e8090", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff036187a7", -"pubKeyOperator": "07a117fdfa831be028c1c45ca642b058b1b5cdbaf757a0630f677e14a2cf382a12475862109335657a55f296b69221f5", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "57b25e797cff424a1d7850d862e03528327fa5c17f403ade4087d7d5bd2921c1", -"confirmedHash": "5062d44f2c7fe0785cd8933c882af4941d96b1264044452b0900000000000000", -"service": "00000000000000000000ffffcfb4fc3e", -"pubKeyOperator": "997568ae59a6446cc5eba7a8066253e7738da12b1c6c99cff13b3143d1863de3ecd6e9c295e1c365073b143f5e74c978", -"votingAddress": "2F53U7mj4hA7enSXWNvKA84twN4L", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "57ba33b6822bae88342105d8df5ae48865229d2f1fa09ab3800a3e19408c0312", -"confirmedHash": "635eda11ec6eaa35f268baab3264b860f5e863c94bc6fb3c1200000000000000", -"service": "00000000000000000000ffff3359eea4", -"pubKeyOperator": "152ec867e68775158c3c5821605d2cacffba7856fdceebae573d9bc5ac13b4f8a6647e3f66eb3d67b6b26760f476c539", -"votingAddress": "CjSR9oUa11Kn5eAA2Awq7J9QEau", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "57be735b3cb9b15103dc59681fd3ed5e064f9a92dd286ae3e9326c16941a6cae", -"confirmedHash": "7e39d91bcf27b516ba37ab518d8dc02615e8f5f184e3ad491500000000000000", -"service": "00000000000000000000ffff74cbc5fb", -"pubKeyOperator": "8a700d909c3d625b906ec4b380f733169d3255f49076a9f66b1ef66f53245bdd591c1975e38bc9dc0d0b8ea1de026725", -"votingAddress": "2PnetAwNcm1sG6y9TuQfSXWWd9Q5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "57d9999f86b8dc5360f40121cb7d91790657824000eb66683ea50d0e043080d7", -"confirmedHash": "ab9a0bd9ddd2f49191c1153fe1efad0ddab4585be8427f400700000000000000", -"service": "00000000000000000000ffff3e4d9c99", -"pubKeyOperator": "098278320a3d3eaa665a35511e23138a03466a40e59108dea02b350cf84578582e04a278c7843f4fece154a9fe11c585", -"votingAddress": "261CU3Us4zxE81J6e2VJ3ZDUcXtu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "581697c05930f900013ccf74d208dc347263797ccaae7c31c95c2b58675b8b0d", -"confirmedHash": "5b4ac203f78fd66cdd775fc4861d430dea72d7e1cd6981381c00000000000000", -"service": "00000000000000000000ffff2e04d9f5", -"pubKeyOperator": "815c11b25df82a3d2eaa39ad2fc11fb59f40069eaa9666ab019080f078551a0ad92ec0ee156b4ee7f18eb914343f6aaf", -"votingAddress": "3rPKky76WvAWaHk6XFf84BpEJX6g", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "583a83d0542d2b30d8eea963b2eef126e6720313595c55ff13e8025b9c5cd262", -"confirmedHash": "401d53a076b0316c86e2fcfd13917f25efffd2e763bb354d3300000000000000", -"service": "00000000000000000000ffffc035a45e", -"pubKeyOperator": "94d26cce828fd4a2beec8e85f5a50f3d936368b9c8a3bf879ed3134814178e69856b123c33eb15dc8772c86b172033f8", -"votingAddress": "4HdmDJ37qq9wjQTrozesCiAq41eD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5843d6cd95c1dbcf6f1b977092eee65e83cbc076b639bb60378c0ed10a0b1752", -"confirmedHash": "699d1feac6ab0dbd94623f468bf5962dff088085c9e737681600000000000000", -"service": "00000000000000000000ffff5fb3ea4e", -"pubKeyOperator": "924b1b4aaab3f45ca10b31e5df6b85c38a64c239db3d9970a4a226a99fb10829fc2e30f98e12b74ba25983b579de43a5", -"votingAddress": "4Q61T5N4mVaWVDej7pPAWtUSWXaM", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "584584c5e395c9c2eb779d2301e7d2b70383fdd252159c964b8d94fdbe9cd9ab", -"confirmedHash": "7b9024235350a14263b9b202cc5e6fbbcebb28f13518fd990f00000000000000", -"service": "00000000000000000000ffffcf9adf37", -"pubKeyOperator": "11b8700e7618003a3726aa6743c99e65a4291d003a602d35cf0db4436b1e5ae853af491a6422a05aec046503bb88c4c6", -"votingAddress": "3K8qm8WPzXQWhrvsPxvEWbM1Axh7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "584c7d913db9c3631fbc742f6224e4fcc082992407be8b28ad0b3a62fc4f3707", -"confirmedHash": "65743b27df20ce4631ce8b80eb99e5603a082be2fda34f862300000000000000", -"service": "00000000000000000000ffffc63a706d", -"pubKeyOperator": "18a8466d872a84dfec8ce27271cc91f9ca110619ba0cca3d9e9140c04039d21407424f56c8b8b98296b748cfde8224a6", -"votingAddress": "2Yh6yCth5KETpFwCNMuhsv6swasG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "58631b25972a62e6d809e307509a3262199c76862fa0840b8b1b1ca449ad2d4c", -"confirmedHash": "a6f3e3fbb42ea187b710bfeb657c49d5785abfaaf1c323870700000000000000", -"service": "00000000000000000000ffff362511df", -"pubKeyOperator": "0e0b56133000c0b2ad6f357cd04afdd7cedcd083f248f1f909f8598217532a769324c352c21b8e7a8d85923815d7e080", -"votingAddress": "E7xvWQp8Fj1PYuUWPCS3V4BAF4N", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "58694dfa31b09710080e78e007b1b1ae7a84a5281696eb84ba5cf82435502983", -"confirmedHash": "c383415f785c14405f704c1f5b0616fdeb38b87e126ab94f1900000000000000", -"service": "00000000000000000000ffff36270a6c", -"pubKeyOperator": "89bc356c055721fc417c9dc72c906f83e7e3cec2fdaf0424866fecd03691aa7611aa2f5d565a2b15c08d0b4a75a5491f", -"votingAddress": "4Z8bBtEzQe9Hz6E3NC34RSJ3V19X", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "586d4af389db354c828ccf37fd7a5f5c96c753cffc52f2fd3953690a03409236", -"confirmedHash": "789e72f67c0d635a72770ddb09f4824ca5d78675a69569aa0100000000000000", -"service": "00000000000000000000ffff55d1f1de", -"pubKeyOperator": "99ade51ca556e24dc6ab49e63351fc28f045f27e5582df36c2ebe1a309426cc8ad797198f4a27fdea8c9b6ddf88d9fb7", -"votingAddress": "4Dku4w2FiScsWkWw93Lf6cf4CGRz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5875bfd68b8dfc48773115d88119c606c2f440c59e01bca9e23e17fdb8f5fd71", -"confirmedHash": "ef124f2cc9b51a52b6222907037334719ea6e03a817306782400000000000000", -"service": "00000000000000000000ffff52d31539", -"pubKeyOperator": "811c329fa2ad25cef65619e9a9013e4c39e129a96287034bdeb1958cd1bd2e32f8f96a7cb0098ca2443e9fff413b00c7", -"votingAddress": "TaYpTMGyjYJDGQLhYbivWL1uZ73", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1760248 -},{ -"proRegTxHash": "58af9309f5f002fb065f19fbd4137922f472522107a65191721ab30603e5872b", -"confirmedHash": "83ddb9d8a7d6b5f148e04bfa6ed74db12ad505e4027d2a950f00000000000000", -"service": "00000000000000000000ffff9f417345", -"pubKeyOperator": "0bb0dea2d65f9a8a1d635584dd2f7ca3a16231ff9d0573400ec4f273406e85cef2b16e6c405a3e9d770bb98ec2e9cccc", -"votingAddress": "3YXYTq2Sok8mDe84VJpWghQvVpJN", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "58bbb0cbed2eea3a57abc014d272b08dc0b9e171a3875780777bf952c7ba2459", -"confirmedHash": "b60c3308ddc3ae8eb3ec549eb9806e008df1f543f6f1a5d41700000000000000", -"service": "00000000000000000000ffff5eb0eeae", -"pubKeyOperator": "11958c572289ef4437404d84c021425fe5bbf503ad5240523ee6af0aada4bafcb31a9dec1ae3c4815ed7bcc8107ebe53", -"votingAddress": "26yeN7E3ciVqxvgk7UrtjZCFpenA", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "58bc9eb488d08cdbb3a587e636d83b3da9fa86dd9b29588ed3b718af7bc77a28", -"confirmedHash": "e86cd89f13988951151d5ebd01b90caacc7baebd771715ae0700000000000000", -"service": "00000000000000000000ffffa8775303", -"pubKeyOperator": "9889e17c7dbf3ecec79f653de9ce2ce1c230d82c4b0ca18542b3b4c2dfe4ea5bd58a34122f774ba78f4dcd0eb4877fea", -"votingAddress": "2PXcjPKK7PJ6gRtyVoHxCnPMjwts", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "58dc3d12168c0aca2d33e7484994f8dd0c8ba54fc2b4bbf36cc639c3751e1f89", -"confirmedHash": "c14af2a10a903726fed1cd86f38cd660334bf6bbfdbb199c4700000000000000", -"service": "00000000000000000000ffff3407b656", -"pubKeyOperator": "956fbe8201592f5885d3013a2a5378c3de7395046b8d61c975c7945c876df71bcb583b8fe7c653dbdfffae671b2e3b72", -"votingAddress": "3JXSpizW8J5iHbvEofduXdxoZyci", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "58e394bebc2a48007f6aded454da3547801de04c3b22e1fdae287daaff73687f", -"confirmedHash": "952e6c88e297bcad575869b0984e4df11b4e2402943d8f422600000000000000", -"service": "00000000000000000000ffff74cbf4de", -"pubKeyOperator": "81b447e421c7d3c785432a253849a15baec78246a53bc89c1bf0526a89d8b4cb0470f5954b979ecd5c52c0366127371e", -"votingAddress": "4NCPTk6pEbZoikG1ZLKPomCAHqE1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "58e529b9d33da0cf64688e7dbd36906ecf0cafaa0d5001275b3bfa84b271491a", -"confirmedHash": "844395881da36233c34c6e4fdecfcccbfb6f073d5c0c91290600000000000000", -"service": "00000000000000000000ffff55d1f111", -"pubKeyOperator": "01c43f660a321e1ddbd9ad6390fc44bf54dbff19bafbdbcb8c7291c16fbb3f0b57574a01dcaf6f5a90910cfd822ea499", -"votingAddress": "KPEs5B4mJL6gr49WB1GPtuQutXe", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "58efa5296d1d20893f3a1b771fbc2144576bbb3788ced84637d99f77731a8a21", -"confirmedHash": "3a01c727e654ffdf8951126974929f99c1cd84147d8c4aa30200000000000000", -"service": "00000000000000000000ffff22c29e0c", -"pubKeyOperator": "955f490dd5e9e6ebff08b35718eff63f62b711a64556319d1c82729629da3700f8b122b2dc26fc63ce867bada6fed806", -"votingAddress": "35iVmRMetJQqGupdF5qpFB6aYcLF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "58f0a7412dddfc2e8f1cf62dbc9c3d90bda1a418233f31a73f24e0f7eaf0007a", -"confirmedHash": "174545c4310aa1fc23af4c2eab1573cca7bd34b70021a5133a00000000000000", -"service": "00000000000000000000ffffb280744d", -"pubKeyOperator": "89db376208797037a715b1723c91422efcbee7d7621521b7ca1ce16b72d40913f07b4042ee11145a882999135701f664", -"votingAddress": "wiCpSc9N94qRMRB22UZHcuVmshi", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "58f636564c8419d0ba7538aa89013519b2bc2cf87f8b410500037da3f9b2f119", -"confirmedHash": "80591cd31e93b0f5a8bef612e9a729f06aec959c121dd1360b00000000000000", -"service": "00000000000000000000ffff58630b0f", -"pubKeyOperator": "84e5818f69a36f429538f50b5dae83da2315e58532a5130493337b2ba9974b38a630bd7f94c69288cb4fee483393bc48", -"votingAddress": "rwG5CZrBjzo4WJmZKAfmaq7H9rg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "58faf82ba22dfdfa157631028e33bde6d3eea7c261779655c18524458b059108", -"confirmedHash": "44c170d8bd6e6218dfd1fe014f946241eb0948c2b971a53c0800000000000000", -"service": "00000000000000000000ffff8e5d8986", -"pubKeyOperator": "033642761bd30db319bde5318ef18410de4559ca3aac3d7e4f5255c116a6f06c1477d9e08fbbe8a7b0541d6dc4c26b03", -"votingAddress": "41EtHYkRTjdUpRwx8N2fC1KBY4v6", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "59226f896db385fa056c6e903d061cc3b35d63f4f32600c8df93d221534cc604", -"confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", -"service": "00000000000000000000ffff52d3158b", -"pubKeyOperator": "840ed2ddbd922234a83ad3df0327f824ca54486edcb6ec5da9c0e3fa53ba20b0c5f4349fc0072ffdfcbe2d40af6fcb8b", -"votingAddress": "22AFHG1fjxfR3YZB8qaxXF3TmYSv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "59264492ed4bcd62a74f42a6d2161d7b75ecb04b131fe3275bc13d137d6d9d7d", -"confirmedHash": "e6a7b2759861c7c24d90aca496dd830b25f1b92dc7d221400e00000000000000", -"service": "00000000000000000000ffffb23fec66", -"pubKeyOperator": "93ddc281861460f7521c5e5dd292d21a04ed54e659b610a8110cf576b66f7d77178ce6a4d64e89e2f06946f4a24dfe39", -"votingAddress": "3GeLisRUXEsWiYqc4Qrnj1smzwJy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5931dc502508c09fa63528da687d07eea8ce0bd97805fdd99ed4e5a190737f84", -"confirmedHash": "e0ed41d61d118f14f628eae9c8c15507548eb8ec3e7898f23000000000000000", -"service": "00000000000000000000ffff34cbf4bc", -"pubKeyOperator": "93547e0589c8aea352e15765cff3a40eef88d96a9a8e28db62607b14dd81c95de775173e52e478169310c5b72e75f1ec", -"votingAddress": "4MR3mivvBRpU14ShnL8dhaVXyGzz", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "596601f2f9cb516f3adf2d6b6fd478ca7775bcc013a0d5427f1fd7fa2423abe5", -"confirmedHash": "5144c5fa452363e31469517fd6cf1bc09f803abb48d4982b0600000000000000", -"service": "00000000000000000000ffff55d1f118", -"pubKeyOperator": "044c0ef6e7282befe897dc54dafcf72f632b545fde010c20444fff239ebc86e2a5d3b9d6dac2da7aa383bdf8f1590f97", -"votingAddress": "JcocvydJ6EyHqge5qzUH7qyMKHb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "596d3db643284c80a3b477328ad96673aeaa462c26c8000ff62abf2d94a61c96", -"confirmedHash": "e45f49bf01c8b278168678fa6095506edc09937ad19bad2c0c00000000000000", -"service": "00000000000000000000ffff55d1f27b", -"pubKeyOperator": "0c64500a98caf59af93e3711e818ddc1054dee3fe9c09008fa95c819bfaf36b05333ee6461250ed2e9f988389c7fea83", -"votingAddress": "3j3cxV3Gj2bvTAuDYtHumUB5Qhfp", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "598d079b604734d8d1505c0b0d01c40b6d15aa13ad4e1b50c73b73c85274a731", -"confirmedHash": "82e94c9fe5593982c4999be1df2e329db045cc40372137cd0f00000000000000", -"service": "00000000000000000000ffff05b5ca16", -"pubKeyOperator": "9269d4fd9d09a4ef113779ef1276f937c837638e5cca99ae8ba60dcb2dbfcfeddfb9b300b70b353b998697b2afc0127d", -"votingAddress": "3RSqtuXCAoKHVuLfu4RKv4tXQWtE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "598e30eecfe6ba84e3f4b1b060ef641e0592201fceea8c665c2015b0ae0ecccf", -"confirmedHash": "c7be87ee06cab5555cef399f8c4a4f388deb2cd8647c661d1e00000000000000", -"service": "00000000000000000000ffff36e18b08", -"pubKeyOperator": "95243cdcedf347dd77946115e77bc1250d4fabbb1a41be6ea8365b96d567c75a9f56f9ae98b4535fda8eeae405acf8a5", -"votingAddress": "22XxcENuxzciQJ9a6fLGRJ1W2Dtu", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "59a7f709f5f6afd8c1003c89eada60e6025cd25409e6cdd02739ac9384e4b8b6", -"confirmedHash": "92a79904c818d28c8d4199182b44a8b6b5ee7cc4e91b207b0d00000000000000", -"service": "00000000000000000000ffffb951a48f", -"pubKeyOperator": "935527a3597597464ebc11e1c6cbb227902452c1f5adce861e778542c86f3e17442733f81fc91b5d6aa58b0a2fbba8c9", -"votingAddress": "4T1HZD5CDW2Xaebxso4fHreUd6uz", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "59b1d504db66341c33fa6793f9996d688c05dd40d9a6fab47233dd02933dd9a9", -"confirmedHash": "84a319dd0f49988002a434e002fe35be3557f3a5133396d90300000000000000", -"service": "00000000000000000000ffff2d20bc6f", -"pubKeyOperator": "0425d25f15161fbd3829ed32832b4bde75037b3a309acf15ff850bf577d4a4736b4ccddc17d370a0c5acaff9ab459dbf", -"votingAddress": "wp2sFybNRp21xjpQLqhwCVXtRdT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "59e814f2f2267ff288a5ffc6c47a8b20727a7ab4a47ce512d308cdf609701c6a", -"confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", -"service": "00000000000000000000ffff52d31584", -"pubKeyOperator": "9464a73e39e0fc49e40e5de652848b74cad859c21c61311bfc366044fcaa5a4af5884547b9ba2ff80e32995c6443f30c", -"votingAddress": "2sYU5hcZyEt1DMkUSBppCR43BUCV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "59f8e01b9d223a97405be927439442f1c91339efd7ff573f5b00b080f33cd277", -"confirmedHash": "12687a2c291cdf0465b65fb9d57a97314059c49cc7bc21ef0200000000000000", -"service": "00000000000000000000ffff52d315ee", -"pubKeyOperator": "07ed43e3d431820ee3b36c7cfc76273df658e23cbcc97e77c287b9567dbb696810d23a493bde66b95489081949cbb3a9", -"votingAddress": "3tk4MydUQ8R6iH17edc4HDqY9f5S", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "59f920a401acacee9c5a1fec447856845deeaa7bf48731c075375298836dcd55", -"confirmedHash": "78cd059f3cd6e842f014a035a34db036d6b3c5539b69d3671400000000000000", -"service": "00000000000000000000ffffbce2d290", -"pubKeyOperator": "92d74457102672384dfddc8917d80af492ac5de5e61faab182921113e61f1b84cdc88d311c522dd3ea631b3d4ca66fd2", -"votingAddress": "41NEfXyBetcigVya5QVDXnJcjLPb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5a028acf7e54f3a68e94e8ee06ad81b227c42d49b5abd14ad16340a23a8cd0a4", -"confirmedHash": "3adc4817e389a6d06afe3aeca70c61b3d8cc3452fce7b17a0e00000000000000", -"service": "00000000000000000000ffff2cc1beb0", -"pubKeyOperator": "82940f5ece9be208a6ce86c0a2bf27c40e697a26899e1ee2b8e5d4def3c466fd3a2e471503507e33e36e2b3d89025a1c", -"votingAddress": "xo2o6A7wNRyBm1jsj6gBP9giX3p", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5a28945c3113275f07bb78bb5ac244dc7c0aa29301fbb8ef76def68e243a4c5e", -"confirmedHash": "11a36e70664892fc613416fe5ea780f7ae33ed10a68cfef70200000000000000", -"service": "00000000000000000000ffff52d315f3", -"pubKeyOperator": "157ceade87a403a3bc127d8f7f849d5d62e1e7dd3ebc9b71d4521f9b5085a82fe0ab3c8d59010a4289bbab3362472cbf", -"votingAddress": "2YTL7HvNDuA8jBPS34CMYmsSgiWH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5a43d5c55623dfeb2de0eec0d33d166abec66913b06992281838398ca41c1d07", -"confirmedHash": "143a074dedad38c879393a6d443834dc309f3a0ddb68bf570200000000000000", -"service": "00000000000000000000ffff8b3b8fa9", -"pubKeyOperator": "97c749ffcd49142ad760c4ca6309b27ad5b86421fcc14d8c5a63f3c08b789450dbd2d86106f64dd5e6e84c96f10914a7", -"votingAddress": "24PXVEtzT1srNfPih1qTdRTNxJCe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5a50cc4ca018bd599c084331bb11674f66e63c0b03fabb926290432406285804", -"confirmedHash": "af54abe982467737cd82c4953ec933e7704741c7e75c52561500000000000000", -"service": "00000000000000000000ffff6baaf839", -"pubKeyOperator": "965e29ccf50d5ce21233f70eefebd13b58f5a7890798aef404dfd9f37ed09fe12afff0b968fab5e6da84d36cf8079ed2", -"votingAddress": "41wXoLKnBFjY6TQf8JmFYgvS8x5", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "5a5c7f0f3a842472857757325f2a8ceb7e75ffcbc23de2a5c931f53bb3982dee", -"confirmedHash": "d14c70c70106d87958e6a301bce622f792c0abf3688d97cd1300000000000000", -"service": "00000000000000000000ffffb9e45382", -"pubKeyOperator": "996ec2dacb64ea4ca23ad01d53d08fa418cf32f7765e14bb0af87b92263d7afd690efc3a2586601c98683068016be2ab", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5a61f1722ba484b4dc70101bd1aeecb235c63d228cfc217034229353e6cff125", -"confirmedHash": "5ed2b9822cf25ae908f964aab669c638faaa6d80875a7ab22900000000000000", -"service": "00000000000000000000ffff951cc616", -"pubKeyOperator": "11dff5b9236fdda7b03b90f2498a4094e855c835f6d9461bcdd17d0a702f70c2a40f688e8259733353192499d2d22c86", -"votingAddress": "3AVpGf2BxwYxjWNTBS2fTASGiPch", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5a7178cbe3b812c5304216a59bf4ee2d01a9447df39a9685b98271a50514c75d", -"confirmedHash": "7402acbef2029a7d64012a36f0c3d866f374fc6a78270be92900000000000000", -"service": "00000000000000000000ffff2d3f6274", -"pubKeyOperator": "0426933a053e68888f5c52e747dae5b958035dc39bea6b54c8af86cdfa90705519f8babe8ac085fc877e2bc83c3025d8", -"votingAddress": "kvVSZEHckgxWGPgwM488mkEGui3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5a721870048c31eab233b4c28b54839a0f5bbda2763fd6736b2be7caabae52d1", -"confirmedHash": "858bc7aae0ea400f7041e301522aa1ea60ca89f641f4f9980d00000000000000", -"service": "00000000000000000000ffff40e37082", -"pubKeyOperator": "07b06ca95922aaba39ab04e9ad4ca92d82a0102a32c071ed1363a3b83630f29736760e1ea6c32935fa92e1b6c1c40818", -"votingAddress": "eYJLfVDbK7ESLfCrsK9ADoPoPj6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5a795109e1e2b2e5d06343c2dcee1b83957006985d03740b16e93b930968f198", -"confirmedHash": "508ede28f5ab920703c7e10990c537b4c3442d828eef7cfa3c00000000000000", -"service": "00000000000000000000ffff36575171", -"pubKeyOperator": "86e4248635c837eb48c07b63aa63ff013e3c38e0aabe7e0ad7cc64524b4f04ed1892ad2525704c7d1ac3461f3c64e93e", -"votingAddress": "mgZVX2uTsAdtYCyB1jNBxAsSRZv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5a853fafb04324c2cbdaa1be8b7723d5f9d28db5f93905b7851a9270b4ae196a", -"confirmedHash": "907e6a35987aab166cf99ec298e0235f4c301cf570f4720b0600000000000000", -"service": "00000000000000000000ffffa7635b93", -"pubKeyOperator": "04a7b96075c675eda9595dc7d0243da8797e1b3948d396b04863cd03394fcc3aae73c956bdda3658a594f46f317794cb", -"votingAddress": "2etMHGTwpKJbBSrNAeH2nr2dnc4E", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5a8b22d542a45b2d36edb3c09798df5219f417e399c2b073948f734552dc990e", -"confirmedHash": "9fd8650f3baa8ef3938d7a45a2ce5b96b5fe3baf5ac357870a00000000000000", -"service": "00000000000000000000ffff55d1f1f3", -"pubKeyOperator": "916a3931740ab4aee86889c43af2f96eab9c1fd02c8c1a411201ee1661a6f66944711d4620b4f5211ea1f890b92713cd", -"votingAddress": "3ws7fR1xkECuqr8PGqsdBANCZpd2", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5a92a7e2d89ae8be4c5191765b67541c0f3f48bac6568f9b90848dae26913c80", -"confirmedHash": "623ddffff4e8e1dd7e08e4e415254dbe174ba2a263692f8b1c00000000000000", -"service": "00000000000000000000ffffc0f8b5df", -"pubKeyOperator": "0c6fe1fc008af58db22b868d2b0302aa1f46b5833439fb53ca7a54ececfce437ee806418f636172fcdb2ed80864650a4", -"votingAddress": "4MaR5VdzdgdfbKF1npFe8pvX3RoG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5a9b33b42f2d2d1b47999585a32a27e7a312a3f300a14d77bd45039108775f26", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b015", -"pubKeyOperator": "97cc843d3cd856eb2ff5400eb860f7b7c00804a119b3c117db3083eca6ec67e9d46ad851def5488df8edc80ade2099a2", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5a9cdda6be215601f63723d1ce7953d70c00b5da8361d2175e95efeda7480325", -"confirmedHash": "dac897742e89bdb8da293f1ce6536b3af38702ba8fbac6d20d00000000000000", -"service": "00000000000000000000ffff175c1e6a", -"pubKeyOperator": "1515a96c5c683a70e816a281c551563534bb530b8696909e57b62a5811f6a0d7663cb5f9f6489ff712ddc199735f6e41", -"votingAddress": "2EfSm8Aspg5BwtfjwxVSmUX7eXfR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5aa34415495cebdfb9a6e24483acb2596db082e480839055bb233132763029fb", -"confirmedHash": "d62e792ed6bbc1b35bbf2b0bcaf98aa30047119d43296e6b0600000000000000", -"service": "00000000000000000000ffff52d31551", -"pubKeyOperator": "964d9ad3cb892f3ee50a570a001063fb3e9e1541032637df7201e0963b21cdd15fcad6a5c52f637276c9dd0d53c2a34c", -"votingAddress": "25mjRw3p7SwAhgaLZRSd1BajNyBS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5aa3ba7846887e28dc3470478cb8478f8b8128d651dbfb794113985d677018dc", -"confirmedHash": "db0308cc0e8caf0d3ce00020824c55bae564c5352215f06a1100000000000000", -"service": "00000000000000000000ffffc1ed51e0", -"pubKeyOperator": "05acfcd35b54cc7683d363817bf80bf5298e6a0d058d225c10e34540bb607cb90fc8b95bdb3268929a0f953dca325cb9", -"votingAddress": "4JHsQEUQkVUwmdvgHHdhh7FgYQ8k", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5aaf98d40ce3bbda72a66a21d6a81d73939a767bdb95590900bb18cdbd34a128", -"confirmedHash": "c3f26b080798292b644b1b85a1872d11778465c267367eaf6100000000000000", -"service": "00000000000000000000ffff03d171d5", -"pubKeyOperator": "98978b5906bfae8082e5ef49ac5735fe817e870b1b483ef4ef9dca5a02d77b76dd1a873dc0baa6e5923b08e9d69b7c34", -"votingAddress": "7AYqNaryfyYqcBwEkwrpLuJGmVS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5ab61f225e6f280ec7e93e7b8f7add585d0c342ec2644c5a0d1949cb43a7e879", -"confirmedHash": "b37f1b20408355ad250861e716ebfc4e6b18c3b8429207af0a00000000000000", -"service": "00000000000000000000ffff3353bfd1", -"pubKeyOperator": "03c792f02d4258ca2a5c13e7f90e268a50fb4d482248137070f51993ae9816c82328b1719a94d6b273970883ffd7c8cf", -"votingAddress": "2c9x65KoZxLVUcS2nsSZwPYR3mao", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5ac62dc18afb115331d8305d70e03f2ba1f18fa3441c307bb4dbfae710130ad3", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6e4a0", -"pubKeyOperator": "8b9cb9a0e6489eb2e282a580e44e6573461dd0eb410ffe4eacc382ebdc010f72fd13bb66a30afa90340750129cf75ff8", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5ad2090f579cd540363e97512ace931056e0bd7e720174ebb21c52f25c604148", -"confirmedHash": "3381b0181302cab2fb7faee7442e93251b622b3e43ef92ed0e00000000000000", -"service": "00000000000000000000ffffa1614080", -"pubKeyOperator": "8b3e55b882451d9b417eb85d2348fee6a65a1090842c18a5eaafb9beca95f64eb1ee611a51570a4bbb5f29bb417a80d9", -"votingAddress": "3sohcrCojtx7PdJr1GB2934tXPLY", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5ada67b06f37974c60a61c2eebfb1e4766e1c4f07d6a3b2a4be71f3c0680ea25", -"confirmedHash": "e02d84b4077164744e348de10d26ce54a3125ce272e534e41200000000000000", -"service": "00000000000000000000ffff310c6a93", -"pubKeyOperator": "97a8fde133a1c870f981d0126b7eb41ee94b4d9b1a5114447fbd08779e201b12f49767c65f99e7c52f4848ccb1c7a9c9", -"votingAddress": "36VossMqkxKr5QKLqXNkgbKJf8e5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5ae1bedfc459e43cb963123c65a20c8ec65778be5ec5572c1584a16a9a4f1b4f", -"confirmedHash": "69eb4b186cb63b044546f2acfab8d619f4cf5c97b242b9641100000000000000", -"service": "00000000000000000000ffff54347434", -"pubKeyOperator": "830df13277a4268c064e1bd8e146509d7506871911548f1840e816585fea3dcaa6e207e79693c4750bcc850745c2108f", -"votingAddress": "ZUFPTiB3MZ38Bamiv5cv1qoSm5H", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5aea060d28c994c59cf8ef25fa8907472db3af9434bc15fa553a2e3c66dbd049", -"confirmedHash": "e3a7f0f74d9c457be02646248c65bd5c94cce33fef97212f1400000000000000", -"service": "00000000000000000000ffffa87757c8", -"pubKeyOperator": "8c01f5214a256388c7d499014c1251771edc0d775678a4536a5e84680831bb86c6b2906758ee7e24ad5082e7282d425c", -"votingAddress": "2ExgoLQzkdLetBC45kfiA4JZvRiA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5b06c05babdc0c8fbd3c2ef809adce1f59e1e03a46f176a0376c929fe3314c27", -"confirmedHash": "9e35388448e3d466ce41dc232c0a5ca8871ca17f441ee8280500000000000000", -"service": "00000000000000000000ffff5fd86d84", -"pubKeyOperator": "15c5518378129acedde8882e52bdef6079cc0fa0aad26c9db0332bfc350331c0d04d1b9d5cf12944033a0247f95bad5d", -"votingAddress": "4XHCG7oasF8KhBDeHhKEEQ95rbdh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5b21e590a5d0bf3e87771819dc3a122c8a5469f90a094cd22dff4eff69090900", -"confirmedHash": "641df81ce9a4c9a208c61140006c805538f18db4a39a04d41300000000000000", -"service": "00000000000000000000ffff68a02a23", -"pubKeyOperator": "152442f601a1ca90b00dc71803531946e1218231bd1cac58bac0f7146fcd50d17789071a74296352169c518d51d94830", -"votingAddress": "2egWaZwQUoFjRPV5cdpw1xzJuXit", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5b382be4158044b1030b1380175245b57ff47384cbd14fba7b64351a827088c9", -"confirmedHash": "736dc722b479e100125e85c103955726a30dbe61f64554e32600000000000000", -"service": "00000000000000000000ffffbc28b6d4", -"pubKeyOperator": "0cc6225a6f31ed99e0e1fcb8bf7552d7aa42ce338a442d400d42de0fd6f05f923e3f69a84e0feeca504919b4696b201e", -"votingAddress": "2EvpoAaBbiKocueUXKkTtvstXBY6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5b3e4c964c06eb4f5d0e843114c245a5078a7b59ac7013809234400095f698d4", -"confirmedHash": "8d073243f0996900ca6e44c171a1a7b5450c4aaa4cc72a380000000000000000", -"service": "00000000000000000000ffff55d1f133", -"pubKeyOperator": "117206aa332de05a73e0c573660c0786501485d24e26bffea2680bbc1046ad407ffe6c52e5a3b6128b1162040a977eeb", -"votingAddress": "3AyVZc6DTK16KT9p5akrTqhzzijf", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5b57de15611c33e418a39880f6dd830a36bce8a59b0f486fc24c0ae989fc5350", -"confirmedHash": "14bdb36fd15f2b32b424d37dbf58c86342f670fd5badacef0600000000000000", -"service": "00000000000000000000ffffbcd47c9b", -"pubKeyOperator": "17d9ec4aab07430c2999dc6c574925f6160e2ac56098fc7be730600c70b35fb07b5e3d214f495f5d1dbf549a80aa87f0", -"votingAddress": "3ArSEo27A5hvAseXF1Cf6nbJnaU1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5b6d1ac71916c6ae9b156e7207662f1cdac1f286ee98b13697a45d0f95c296cb", -"confirmedHash": "1efe916458516e9a3a39804a6c79bd01894b38dc1d2758861a00000000000000", -"service": "00000000000000000000ffffa7ac62af", -"pubKeyOperator": "893ca6db027085d59b780cabadf3fe0c7315320445652937f490c6f2b0669379f2c79502ed159804027169551ebdb67e", -"votingAddress": "ds5z3uWbwkf35ybgppwGGxyXTqx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5b6fa1448eeae5d13033ec81b9cc5cdcdf5f1dfafc62d6289a8c5929a8e0e486", -"confirmedHash": "085cc675037b2128240bb74e756953c4de44b21afc89c27d1600000000000000", -"service": "00000000000000000000ffff36270a6b", -"pubKeyOperator": "82bcb7be79a10a50e0956e0ea0584afe89cc02f110c3274d35201bfb9e1d3d154d1933dcb92760ea4fc594a622439fd9", -"votingAddress": "yXJgpa4995s9Ntuwc25psRVMNzh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5ba0db736c18729ac68eedf0c893f68f30b2f5edfaa607aaf1f43fbbd2cc3620", -"confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", -"service": "00000000000000000000ffff68ee91b8", -"pubKeyOperator": "0e91ef36a8c0fb926962ff9fbf742cdc498bf242730fa1e8251ad8260369862f45ff397f1c551f2cafe8767394a93306", -"votingAddress": "DdmSHA9S5pKpmG6TddXJRWsNjhZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5ba672b82cd3db2876df9ffa152495fbe4b2b6654bd51d4e6b527eb07eed8ab5", -"confirmedHash": "b95d9082e57c7597d7dc4115e85be111d841360d298d85cd1700000000000000", -"service": "00000000000000000000ffffadf90706", -"pubKeyOperator": "99779d055a193094efaf52983171a337a6090d3ddf6c47dec0648a31d8cac8ef88f8248ff38880fbe88faaffccbdded4", -"votingAddress": "4LMPsmR3XZKMnC9ApXNokEF6mYFr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5c0531ab80876c379891b3e709890ab13faa82b1aa6644f62931f673c546591b", -"confirmedHash": "ae8822e3c5136aa711e1b33ef84dab59a61d38aed65def580000000000000000", -"service": "00000000000000000000ffff2d4da82d", -"pubKeyOperator": "1727dd7c52537110540f73532c873c89aeff256da538a93b67a7a3717adfe92baf8f2a5caa4d50a32fe7d65b28974215", -"votingAddress": "CxuHvicnfqtKNaZvZq6WX5E9nW8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5c605aaefb27a0a0d83ad71a18127487a5dc2982a16e5c26fd7a11f791e9d7ea", -"confirmedHash": "a1f586cd14bd8a4ee504785b988ec1b45a5162602152509c0d00000000000000", -"service": "00000000000000000000ffff2e6525ea", -"pubKeyOperator": "991edfec8cc1b6c732eb67959d17c493497be581402ef2d8168fa3dab96e711a37af1cd15125c3fdf951ad495d58b5a7", -"votingAddress": "2QJAp3XRGm5aKXHzakJihJizYzQh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5c60def421324fab43218e450d89a38e9d21d3db3ce6b6ba3029a2c5465c13ad", -"confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", -"service": "00000000000000000000ffff87b558c8", -"pubKeyOperator": "0c8abf222448ea8e62b75c22f2a3b8bc035862cd59c6140ce5992b7ccbf5e1b7a4053ef9fade4378f3e44e8ca32177c2", -"votingAddress": "4Em9H4gMcAz85nhHjDu5iRGAHZ5j", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5c7da63dac43228a4bed4ce16878f8fa17eca6d105198934e661321f06cf28ce", -"confirmedHash": "e5a9e5c645a067ea29c0c6c411c40c565be8659f1631864f0f00000000000000", -"service": "00000000000000000000ffffbc28fbc2", -"pubKeyOperator": "01850725a2f231030ceece4b5833d7474e294743dc8410ff4349bafd49f7dd0e1d03c0ed2bd0c838f8b076f4627de659", -"votingAddress": "424xpoEPpdAjxQWQqNdhohoCeuJz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5c88914208b024d888912ffa42429b34ba4bc52a1c5eada0fb0cd800e55cec7b", -"confirmedHash": "c59097ea83dadd5a9cd8f16e7d40bdc9375a72c1fc1dbc542f00000000000000", -"service": "00000000000000000000ffff9fdf3c79", -"pubKeyOperator": "906fbe029aca39fc2b529db0e6adfa53ec82c82bf9a627b457f4ee2d5fd104f293e1aa1334c74ae47a7925b230a4847b", -"votingAddress": "2EefhM4AsfUgfHzC8ZENWYMuMjSV", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "5ca5ba38794d59b23d6ef4b9c3f73f4d5aea6aeda09a84ec7bf3e7a2a05c2c74", -"confirmedHash": "4801b7641f4b4280f67145338d230eb20205cd7effdfd82e0f00000000000000", -"service": "00000000000000000000ffff9fcb01fb", -"pubKeyOperator": "102b3fba5930dc93d488fdd8b2e1280a82fd30b5f0ae08d1cc428df03aade154f5ca979a1d44b7f81d82cf7bac32b891", -"votingAddress": "2p4pzotdba1b1DASf7iFe5y48gXz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5cb6135207709273bd75f50980eaf184c0c1c1c0da9bb97f35bce91117a61467", -"confirmedHash": "1f8cf116dc9b5051e265e0838e9b1fd62ba32ab0a155d9350700000000000000", -"service": "00000000000000000000ffff05b5ca14", -"pubKeyOperator": "05cfd146d476d1840c523c4f024e88e35c41df552f8135cce9c81b27856d42479c6ba4772e3b4de35cdfbcddeab4e507", -"votingAddress": "3P3tj1apR9S7nKd2YdwhMsZkRvx4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5cc4c6c57170c4571df28746932d55ad9870d30637c1d734037e9c7b8fcd2dc6", -"confirmedHash": "c8a3d66ba682964becd5a2d4fd404b4ddbcb6eb7ff740ab00b00000000000000", -"service": "00000000000000000000ffff80c7af46", -"pubKeyOperator": "093b5f909582eb062f44d2402a8465aab545d2fb36adfac3c18be7c67f885d9d1f017544d26cfcb18354d74282a8581f", -"votingAddress": "4YzSBzyVZQ4Fe9mzkJd1Cj3j5Z5y", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5cd9c2fdf67c117417b428cec4ae7d409d2d5beed56503d1a4f7bf53e5723dd6", -"confirmedHash": "9bb3498cc81905422193540bcf8eb4c829ce2a501d9bc9840000000000000000", -"service": "00000000000000000000ffff4acfeb66", -"pubKeyOperator": "95d178516e3f67672a8231fc2a5241fba103b2392fcb67125be07a7c2bee53c1d5a81f81d1d681c2ed066236858c2d69", -"votingAddress": "2XojY4rBG4EsmMNdVbtcNfyFoFjq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5cde42a4429c831c1319a4cce52cf7de0b52b1328bed5ed33deb1329d23e8037", -"confirmedHash": "c389c5950c59d7784d58bfb5431a3de88c7a34bcd66d621d0500000000000000", -"service": "00000000000000000000ffff87b50fe3", -"pubKeyOperator": "91c1f9d7befa8f2902b6fd51a553593a33f7b847d455d909297acd47bd10db1dcae7d91203bfac44d00a86553e3d3e5e", -"votingAddress": "2TEAGRci5RBEDDKEVWmQ32zZE2ax", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5cee58842255e2645b9210e9d90282dbbf9ba261228ac1c47cbbfaf6f92854f3", -"confirmedHash": "43ef503a95c7a9190d4e906828998ebeefece4beec35521e3100000000000000", -"service": "00000000000000000000ffff86d192bd", -"pubKeyOperator": "959dc707ea3fc22028a74953ec5d7fa3e4c6b038155af23ed8100b6a9f0a46899c58765db66a2f869202dc446e33da40", -"votingAddress": "Y8CWpxYQMLD5wPgiGcHfbnPEnZf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5cf5572a61c72e18534d7d0390a2b0df2c640ff00b5b0ffd22d5475b18aa7648", -"confirmedHash": "8ff653f659d4478ea4257cf726b06155732e6ac3913d54bf0e00000000000000", -"service": "00000000000000000000ffff52d31966", -"pubKeyOperator": "8991ab154c52c83e62da2387cdf4b39ff9dfc72890b37be3b498e1daa547411f2b73a459ec58a8e6dc5e37a8b37e131e", -"votingAddress": "2ss4xhLjCwMsoK7N52yG3qzQGfHS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5cf85718840c95aebaf3f7d75c4182ac4e03cda889687988afcc8fcc349f21b0", -"confirmedHash": "e99fe9a8cd2ab6c9cf5e7986d4afd52219279c9d462e950a3600000000000000", -"service": "00000000000000000000ffffcebd627c", -"pubKeyOperator": "974b0b9c7cefd7da6c3ea08085c70c35af190d9b923181aa22707fe9245454c8eb9b50036ba21220379963f4ec758f82", -"votingAddress": "254kEXEnnQ2bBRCpF5hwNAoALs5X", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5cfad3655b81f5885d7cf66436658122015465da5f4b7a13583a748ebbd204a2", -"confirmedHash": "ab5d8290124e5fca0fd048c8ca1f4feb4772cefae8feae0c0b00000000000000", -"service": "00000000000000000000ffff55d1f288", -"pubKeyOperator": "981fafef2906b35c44647d4ed34b867e83eac93d5a0f24ba30dbcdd995573e4540935e3ae17e782faf87fbf60d298b62", -"votingAddress": "7aEa98p5wMzDAkrbV9B3uF1fvnt", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5cff16cb2c9e17ec31b79dc0cf5e6960a8abdc4dc3f60ff1bddc39f73d617aa3", -"confirmedHash": "ac4d1a75b7f869c4d2c23070934b1f88999158fa90c126b40200000000000000", -"service": "00000000000000000000ffff49ebc8b9", -"pubKeyOperator": "06c5b2eee5be479248822e1bdf23a97c5a0ad90c17620e9aaea10d088e52121f2330778c2b57bd4f66410e94d329866d", -"votingAddress": "4WyMB4zTmtMqJfZUupanHp4cszax", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "5d01430c851276ac6d6ec6a0c3a91e7105270674b08a5f361cbb5fb4f5f99ae5", -"confirmedHash": "265ba3b55cac5759716b916acd01f6d96c16a70fbd715d252e00000000000000", -"service": "00000000000000000000ffffa45cd5d0", -"pubKeyOperator": "03568ec3f6aaa956d5846d3a4b94e713c26b1af733effb4a00c18d4a8498be891877f48f159e2df1d8e75368ff3107ee", -"votingAddress": "3p6szT8T9mgUUvctdFuMKxq3uFLi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5d0f81eb02538fa939943ce7a7f7391ba6765267a1ef39a84bca23b71390dd1f", -"confirmedHash": "cdd502077934e728cddac2c8d57352b412483a0d6b81e8b11e00000000000000", -"service": "00000000000000000000ffff2e65bb48", -"pubKeyOperator": "98340646efd2321f6f4d19488076943e7d1c2bcc2096830eb1746aed41a8707436022bb27996a6d81fdea4e4cfb254ad", -"votingAddress": "3rZM17JCov18gMnPQJZR2tDMaDhc", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "5d16ab03c9bbcd74615f3cb9ec6ea6b3e4bed419430e107c1c1764fb3122408e", -"confirmedHash": "a8182b12f9493fe4b85285db933b18d2bcec1ac5628f80932700000000000000", -"service": "00000000000000000000ffff88f38e21", -"pubKeyOperator": "8419772c954f39e4d77bab646e9665eaf2247f5c438c4ffee7aa8c0258d6a6ba8b7d86cfcaa3a845a4a3dcd20687ec3d", -"votingAddress": "2Pjx7x8RfHhFgFFjXozS2vQRWSJb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5d21f444b29f069f0e1528eead74244b91c69e7647084651bd45442da518fd2c", -"confirmedHash": "6ff9bc2a28fac8857dfaf3dba0bbf8b128aeb9ca38c3b2ed0500000000000000", -"service": "00000000000000000000ffffa516e53f", -"pubKeyOperator": "81188ea3d14e0610b01c115f42f334cfaae9264b3652b1a14d7fe69640e7f9b2e9a9ec659436a8b586f1f7bce946e941", -"votingAddress": "bFUDhAeAqPBbU6DS8v36DanjHhQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5d227b2bf7d7aa08f4b12058c5581bade4addf9813b81c781df50b7f2eb65e1f", -"confirmedHash": "996c87085136d281a63e9ee527b094f5e7e64282c1db17060f00000000000000", -"service": "00000000000000000000ffff2d56a32a", -"pubKeyOperator": "166a22563e0a9f5d8486a39c81137e17a64446d1772ce3891ad6f372f86fd46ddf8f6f4eedf38b718414de99ab90d9f9", -"votingAddress": "g5dxHC84D5joDh9kBqAtztQQNUR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5d2b13510c802bb64b71223463a8f63ccb143a48d711aced0920c0fddcb20850", -"confirmedHash": "a7ac6a808dc69a25e873cdeaaab5129b4b1dba7a1e89a3db0500000000000000", -"service": "00000000000000000000ffff23ad9b2b", -"pubKeyOperator": "0b5ed2fc7f727a875bab7339ac571b0857e75806577b8de56b643e461b9837d49d32d68ef1d0678a4a498c4625c3311b", -"votingAddress": "PoFDuGaq9GfDyxqeQH5iq5Sf4HK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5d35aa0574b4f020d779cfc6880846e0d762951a1077bce9bf454ada4e8626e1", -"confirmedHash": "ed3ceaadcbed4ccfbad35e539b87ab9be15558293788b1110d00000000000000", -"service": "00000000000000000000ffffb23fec74", -"pubKeyOperator": "04e6c005eaaf61afad64e28ec3c9096ae5fc3ad23531642dc2fc3dc74ead78ba785cf6a7c22c965a127b9ab4a13b317d", -"votingAddress": "3STN9vXCh2Bg57mLf7fNb1Xu7xaU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5d392eab7857f88766da092d603c2f547c248c12ad0702d3de2a23b246e70ab9", -"confirmedHash": "dd42ee0de9d241d0939fa2daf0609dc872c8ea8f8d2321851400000000000000", -"service": "00000000000000000000ffffb98d1b7b", -"pubKeyOperator": "8ef162a8be4bb5e75ec5a43c5ee3e4f7bb82e6914a96851cb38d866699326f9372e95664dee8a4e4edfb89761606cf01", -"votingAddress": "2oLPXF2JxYmmf5cEtEK8bw9SMBnR", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5d424261c7da0bbc02c94a807416d13e873095ca3f67f24feb03568816aa5b6a", -"confirmedHash": "6cfff0eb40d353531b66bd7ffb849606b19b5275beee122e1c00000000000000", -"service": "00000000000000000000ffff8a44bfe1", -"pubKeyOperator": "97a0fd450d220c1a421a39ce58a8d7c519881630946bd889a3132fecf34d4e8df1d1a1a0e1f39e6c95dfe933670ecb8d", -"votingAddress": "2SyHg9vSTLUP1iZngkVLY574uXoj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5d47826dbaa643a4c4d63e36146c5ea01be03c41443b303dc9c26ea001ace86b", -"confirmedHash": "73217b876df87745cb28af44351b2121c4ce142ab4d5a4a60b00000000000000", -"service": "00000000000000000000ffff2d2091b0", -"pubKeyOperator": "84222ab9a2d1fb45ae405f161578968fd0c4835abe46de830abcde7f93bc3b6cf968c2f4c3f438859810f3e8e35c5e9a", -"votingAddress": "2q9ty8qtarywhbAX6m8odcwm3krQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5d4fe9ada415f186eb8d1a37ec2245bc8a35190d2b8d830cc156c9c1e034a1bd", -"confirmedHash": "4399b5c07e5d328f142914b88505f53720fe01a31bed65710d00000000000000", -"service": "00000000000000000000ffff32743bb1", -"pubKeyOperator": "05ee10590f161bb6d794cff8d1a3aeab2dfb620fbd74643a7131176471e8e70b140cb0abe43b7bc5ed32c158d34361d5", -"votingAddress": "bAgjET7u16RUdp3v2P8joGq4XEu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5d5eb4120c93bb89f2efc57c22269b084c990b6f8338c29339b96b5a05352f97", -"confirmedHash": "c74220b8bddf28847da637c25d10fc69cbbd7d99b5475bb20200000000000000", -"service": "00000000000000000000ffffb90535e0", -"pubKeyOperator": "99d62b48218e801e3669c888c8090644b677377b50fed6db99c2dbcb983e9647366b13a4542aaa1eb46c077d7533f6d1", -"votingAddress": "2NWE7Xn9SoYNdfNG4GxXLz4iwv7W", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5dcc2da60644432987c053dfabdefebf59cf7ae312216b36ccf03b9e844c211e", -"confirmedHash": "c19cbff16be0b247e1b9d6ba0c322b7c419f11a7ab2706cc1400000000000000", -"service": "00000000000000000000ffffa8775790", -"pubKeyOperator": "0a15e85214ae491857bfbcf953ca556a3a5aef842c27ed49cd7d9f9ec4bac6680d2eb90d316eb9aa217ca00e03e9ff02", -"votingAddress": "2doMKJJ4ttQZQdj4qgSr22CsaQE3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5de66f4b59046663075bce1da4da4737a70c54f1a5844f941a5d610ddec31bb6", -"confirmedHash": "435bd9d644015821e0666f4c7df48f6de41490f6e3b033ae0500000000000000", -"service": "00000000000000000000ffff36270a6f", -"pubKeyOperator": "10dd771f793deeb9846d874a3ab9229abce89ca83e8882de955b98e4bba6989ec10aadc10334f0aafbd76fc033b98ca5", -"votingAddress": "4798vX5iCQ2NjwojXoguVrEnHZhx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5e06d3b6a27128e609aa1b5f69ffe054e01bea2d77fec9233f678aff4625ab4c", -"confirmedHash": "2d27bda104ba76d022581ebdaeff6abcc49bf568137e72841a00000000000000", -"service": "00000000000000000000ffffc0a907ef", -"pubKeyOperator": "01fe2e0a77d6b65fd2c4a7e0c9232bd9dd9b414ca22d61247a262737ff5205a6dc442d7b9858d6380ebfd5fb86dead26", -"votingAddress": "3MmYGHD4HAppHar6wWGh9z4faqwT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5e0ccfd4c7d70c39f22e6012086acec0cc8af19a90bfaee08198a11766c3de9a", -"confirmedHash": "2c5ba6d60308ffe90ab3cdd41c883c717cfc12719d5e2b1b2600000000000000", -"service": "00000000000000000000ffffa4842aa2", -"pubKeyOperator": "0fa45210a8697b53a01fbaae4f27687f5ca8840308c366f02b796415c13b3ee19f1b4827e36a4a1b092a5d180560be19", -"votingAddress": "36XJFEZ8rfbPEUUvLttgMNJGnFZn", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5e24394ee833bea0878a29f85ebd5807b40e25790dcb95041a62f24e0e3ce0ad", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff84919bc1", -"pubKeyOperator": "95e755f67d3b04f826fd0b065f058296f5a4bdfcfc831559e3406ee8020c73f7330b82058a571be9cf75685027c92d82", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5e253fb84a641b1165d3f3daa0c70033b9882d04af8135d46b5d13c0dd23f6eb", -"confirmedHash": "34320ba7fa4a5da7b862e96b95194c3f49dcbb9d38e51f221c00000000000000", -"service": "00000000000000000000ffff05bdfd42", -"pubKeyOperator": "8b683dbdd0b4aa879e91d0e9702744e6cfd71277fe4fe362e69d4edd4bb291d24c50613d42a6eadf1f2cc4682fe26e27", -"votingAddress": "vYVSF8DnbEfwKqDQ94F5eEaLngM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5e287849bb0ad19f632b7ad5d30f4de6d01ccab4e858b6a86c1510f51816ee47", -"confirmedHash": "8e121e649f62b6664a4f6250cb35458426a19dd4809e31870b00000000000000", -"service": "00000000000000000000ffff5bdbef52", -"pubKeyOperator": "1203d660407aa2e3a1226759cfffaed6c126172ad97fb4305ee88a897c1a229b32b0d12808de21a1d049fa15be2a3b8e", -"votingAddress": "4Qw1k1qBCFJExh1kR4qKHCLwued3", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5e302e07acf6b08439d466695ecdb176c123edc357267f97d12e2eeae33346c7", -"confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", -"service": "00000000000000000000ffff2d4ce869", -"pubKeyOperator": "8447c9d7bca898292ec0de34ed6180fa2dc30afb760a00e677865d8ba1e1223efaaec632e55dad65f10c50fe1d144bb7", -"votingAddress": "4455UUNLmoHY4M9eGnZcPaZAmuKM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5e46d27005a8f27e8e31d0b9899de3af05b429c3814ac252eb3fb4367e4a4621", -"confirmedHash": "7602dc636d2cc1afaaf64b15090dd7bc16893ac16c595fa30400000000000000", -"service": "00000000000000000000ffff55d1f17d", -"pubKeyOperator": "0c24bbdd53c81581d21c40a88738489d6c349bc08d3d3f183e10db840f44e2318f31e7136864ac791173b33640274016", -"votingAddress": "2gPEiJM7nexj3y9VHYGFJsUPg7Vb", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5e577ad0bc6cc70238af8b9e08614c224dfd241d856e068d1feec0bdad629b72", -"confirmedHash": "68da12896db9bd8e23dded4e265219650a9473ee392a18aa0100000000000000", -"service": "00000000000000000000ffffb9aad49e", -"pubKeyOperator": "8e24d43fd77f9debc73bc365f024d2a729b234265f9707cd03b9d4927e34026254c90784c3606568d8b3ca1659ccb5f1", -"votingAddress": "3iHo2ut8Z1Cdcwd1JyEBSqnjaQBd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5e658fc6fa3c1a7fcc987994650ebc5545011372626c1cceb3ae6a54e36208bd", -"confirmedHash": "32cd85e933a08ed5036c45050497f3ba60e70f2fc72f87931100000000000000", -"service": "00000000000000000000ffff2d4d0bc2", -"pubKeyOperator": "05566f23c4f47a83cf13d43d035309e43a01351127880e73446784e2046ccf723a49e15e78f8a9b330a5bb429e990340", -"votingAddress": "2sfBU1ATn1Re3yAgt2UvxZwoiU76", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5e6e4b22c5e58424e29e830d378dcc5846cec3c1771646b698cecedf8935dcde", -"confirmedHash": "38bad08a12a4090524ee260344f5c8d538140abdb94f4ab81200000000000000", -"service": "00000000000000000000ffff91ef5ad6", -"pubKeyOperator": "0c696645d03d31edf1184227b023e1df7b699bd2206b2f23df6222cff6ec8d454770ba7f518310b5d342618ffb83204c", -"votingAddress": "2X2e9FsxJqUSSPPVYxdYeLcheDcT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5e7dbaf80c99977e0633faed4f76c545901640162147d75e4c5a03fb15c716b3", -"confirmedHash": "6aacd1b79e78431520bedfc2ee9e7edb9408cb4ff21aba761900000000000000", -"service": "00000000000000000000ffffb2806fd6", -"pubKeyOperator": "82c7000c7554c384d80dbdab33196873d51e4a5a130bdc9d378856ac9462c6becc57293732cd22ea572934f7cb6e6745", -"votingAddress": "4Qwh3nTceomDMxNBznWdkr5M9HYv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5e80a259a7d0826ca69b5139b579bef150956e3b8b96fa1da0481907b82354d2", -"confirmedHash": "a33a936fb8d05726f7210eae50c34a1a382c010ba02cb68a1700000000000000", -"service": "00000000000000000000ffff55d1f169", -"pubKeyOperator": "100286ddbcbee4f447e32bfb68a25f4796b67d86dd6c53f86b155d99127a788a0d591a070fb53f882d47e73611340a6a", -"votingAddress": "2dHTxvLtscvmiq3j1dJtzzhozWTP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5e84fa2e58e7fcb222a8a4f5cae3d1ce7ec36aeadc626ed00bedf4b2ef426a9b", -"confirmedHash": "bef98092b5df7da2cf10284bf279003ec55e9ff12d899a580e00000000000000", -"service": "00000000000000000000ffff4f8fbcdb", -"pubKeyOperator": "8cce4ec3385fc78a54d549c948a54c3d3c6fca1061c5699d602ec8d9c8b75323cba756bd005226dfb84fc2b1555afcc2", -"votingAddress": "36Si7FMeRyquRGFqaxiMuTD4c5Xy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5e8f0d20a19b27163e4cb531b952e8072ee2e1e397a5f22993030f10cdebd430", -"confirmedHash": "96a8f07e78991a392580a0e6384937f86d4593d419e56a470000000000000000", -"service": "00000000000000000000ffffbca63d76", -"pubKeyOperator": "075aca7e96c83fef55d198e8ee837e20ec0ea8652a3f5ebff65de8c9a215f1f9203e8d4a9cd41935b6b14557ada4b256", -"votingAddress": "2eWo4WuUBPtyzkQQXncPayi8X5Gg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5e8fe358d64f0439467396f16386adc7d4960bde5c94d6534877e2a59c20f5bc", -"confirmedHash": "a1c8001dd25067b0880162983c5d23d29791c6b30b2739e80100000000000000", -"service": "00000000000000000000ffff2d4d37dc", -"pubKeyOperator": "8f2d54ffb351acc9fb8ca90726b02320832dda589a83fae040611d96a0a6917a5fbac2841232e18312f675c6a5aee670", -"votingAddress": "44c3o8zC656T8kJkWQNyA3sk61DJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5e9736ece25d1456ceaecacd4e889f3959372637eb01395ab55c413c110f08b6", -"confirmedHash": "5d9e0af8699d67da03bd5976ab68c6e1544e9e49c62795a40c00000000000000", -"service": "00000000000000000000ffffbc28be33", -"pubKeyOperator": "0e548004b6859015c4e203aa1a6741144597beca063a2c487fda9000947deac9e94b848e135ddc9952746b02e80c89e8", -"votingAddress": "qXoadbhBg6ZMfsJnh5YShhqXEtT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5ea2f761ba274e6fa8c9de7a57525ea5b979e555b11f5ebb24175b2fc921489f", -"confirmedHash": "3df15330400acb4ef9bd476b3a3045d25c57a9dd88708cfa1800000000000000", -"service": "00000000000000000000ffffc87ab504", -"pubKeyOperator": "8cb3e21587fa04935a4340fd357a5d98084849e5a5675237b4cf74706d4b0f5f7daf116dbbc2bfbd8b576b3498fec87c", -"votingAddress": "3kjYAq4kSyWVz1Rv2pnN1TNd7DT6", -"isValid": true, -"updateHeight": 1760904, -"knownConfirmedAtHeight": 1760904 -},{ -"proRegTxHash": "5ea5192459bdc8f83bda6381ac12e9436cf4c09bf5d60883f135713f658e5484", -"confirmedHash": "d4d4db9d3c198a0abb21bd048984472423b7a29763ed30e21e00000000000000", -"service": "00000000000000000000ffffb9f3d681", -"pubKeyOperator": "95a7a310a157f3609db71a894cbb6ba6a56267a680dd0254e6d0bc04ea4149a3ee7f2ec2027f623dd97515b46db72f35", -"votingAddress": "D8SZuYPMArwcVTXh9bpErFnpazt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5eb87f19904c9faac81318866cd90ff220c732a248c22bd33a164310ecbbab08", -"confirmedHash": "0a3424ccd1d4d1beab23b417ae3ceb3bc221f8ec14d216f40800000000000000", -"service": "00000000000000000000ffff50d1e72c", -"pubKeyOperator": "0d86e2d09e786dbfa63d94d77d4d13e9589bd6d20612f8cf2e0679ed8a382a953a53cc194f778392b4385bed2860766e", -"votingAddress": "3DTwTQBQy8jJGZkxXmWutZfvDvyb", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5ebca6771fd193711c70f72f96ab1df7352714633b70368cd4d2b2964a03ff3e", -"confirmedHash": "2a0465522ca98da7b298dd208cd3a7ad16becf7641f9e8c21200000000000000", -"service": "00000000000000000000ffff44b7bcd7", -"pubKeyOperator": "036883d465c035b86818993a36eebf8b2e7c38207f62387c9eb4a86911dda983a25c21659384f99dea4495dbb56bf021", -"votingAddress": "2eLLkiS34X5JYJjZcqSv1dAZHoxz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5ed1869b180cf705599b93eddbe400943304676757a2b9fd1f6ced90780486b4", -"confirmedHash": "663e48a0c3034568ea898380ba313e2d9046e51f5ca41b240900000000000000", -"service": "00000000000000000000ffff80c73a1a", -"pubKeyOperator": "07209331a05a461ab486cc6b5acc8f99eabbfbdc0bfdac93e2c79b2dc681b8a6770fbcc967ea1cade250dbf15854814b", -"votingAddress": "yArQbnVFfN4xeDnZWTri7Jyvvkg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5eddcc29c91a2ee0f22a8c7388ab3db7a69e25b834cc22799b908f2eb0fbd8f9", -"confirmedHash": "46e34f43963540ff760bf310f0bc96fd51f1e2f5a6b765fb0000000000000000", -"service": "00000000000000000000ffffbc28b482", -"pubKeyOperator": "09c6ec183d9464e2d78ca7e33c0c9891b500b9f06b473e3d3b26584819dd58e8fc091371a076afe08ba0ebe900f3a317", -"votingAddress": "46XnNs25DHZa74WjVCDo4gW1TbQJ", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "5eeedb46ce5efbd17b00a67199aaf359a9fbd619eb14d2e5aedd9b617a6b41bb", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d521fe", -"pubKeyOperator": "0967f1121f51fc39aafcae775c86ccc69a483d84b2b6d23f8b2f0337c25d12c303b4b83099ed0da8744c3683efb2abe0", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5f0ec49d330c91032cbc9522820c2eb0b14a9bb3269429b5ed774ff93b42ed73", -"confirmedHash": "ff51f276f799fb621dedbb67c195e1bd755ac7066caea2d01800000000000000", -"service": "00000000000000000000ffffa7636d8b", -"pubKeyOperator": "99b6ccc349e902351785aa7fe2277c2eb94c5c0a24bb9745b78537d761c70bb1c10679a8d7f0b970dfe0113c4e50c145", -"votingAddress": "3MH2h2aoMgbXnKkrfZ7yh8x1mmk6", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5f2025551f5974a7e8345d6d48e035c1ef09543c46850c9210195ed6e9034aa7", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff84919f24", -"pubKeyOperator": "92e21bd56af2442a6400da3bf95404df022eb1bf9d139359dd108149bde0825d8e6c25ea2b80b9af85b8734c3e59c2fc", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5f25bf5c2fa7e6b7a487ce292d6009aa91ab5a2efe086032f6fa9295aacdfdb9", -"confirmedHash": "ba2d8dd2bceeb3e6ed4225bb97b91a71893385f8df2892a90e00000000000000", -"service": "00000000000000000000ffff2d4f1abe", -"pubKeyOperator": "8d0298b226be199f548c2f6ed008c3890db9623645b8fd237068e3bc92e83930dac9e11d29685664e63614cc290572b0", -"votingAddress": "4J4ftLTfwN3XvhDhGGAAaJyf9qQE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5f2c5e99f8cda2ba075c100d0310d3be126f4ffd80dbaf919c25a2984ef10915", -"confirmedHash": "911983b695ac84e65c7c2eacef81c22da70aab1b0567c2030500000000000000", -"service": "00000000000000000000ffffa87757cc", -"pubKeyOperator": "8d630e590710227707903890ebb933e2c12cacd477f689a258cc2bcefc481ada7513b9e8a11878481f8aae36fc278fa8", -"votingAddress": "3kSk8rHi9hWgzEYDKFtAGmNZFzfd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5f3569a8ceb8ce3fd7891a91854242cffb63aac80076af4875e9a1bd98d7fb7a", -"confirmedHash": "68100529972aa198fc8ab479241afdefd5eef7aaeaa9537c0700000000000000", -"service": "00000000000000000000ffffcf9af498", -"pubKeyOperator": "80f476c5fdfbe9fa41c814baab634281ef7aeafb2d0c66e07760de09a2865aa8d06fb221bcfe1b8bd19b548a1c3f31b9", -"votingAddress": "2Bc3C4hwH7eaGrK8mRfzbodxaybQ", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5f36c6b5619bcef5e3610737ac251a6a0b85b07e98e13f8a79c6001b0fbb5795", -"confirmedHash": "9ffe472f95dabd7e478c3dd1718d90309fd83a6d522fb59f0c00000000000000", -"service": "00000000000000000000ffffbca62235", -"pubKeyOperator": "8c876ecc080ee3ad79fb7e2e06d04927eaa1911e7ad366264781f949274680cc83cbf16d64fdecefd852b6d9d5fa719d", -"votingAddress": "PGFYJPWNZ2UuhsQHiLre8iCZMY7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5f3d92c9527aa4f441c8c9b67fee4d498ddffdd78da142e29d96cc9da0f663eb", -"confirmedHash": "f3d6075d23b86a44e3ffafcca06d9126362dbcd0033ed3a82900000000000000", -"service": "00000000000000000000ffff2e04a27d", -"pubKeyOperator": "8c46ad5720fd370f39f126838c0986ad9f1178188a4fb16d9738494dc1c5730da7d36458acee3ffd620bfe392e361b0d", -"votingAddress": "3QVLxYvRscJiF8XTYzJaa45DSPXA", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "5f4e4a55b9b5005c2653702dba02a62013b64b2e5940b27e2cc70b69e427d1a4", -"confirmedHash": "7bff4f371c94a24bc8bd45d996e8e1e504972248543b91fb3500000000000000", -"service": "00000000000000000000ffff5fd97d61", -"pubKeyOperator": "0697b4c9d141bd48173f029cdec979c03f96e38916918cb147f0d219fba6d9c2d347940076fa359b19044d9b93c50298", -"votingAddress": "6tjmaY5BP45kqhGhmNyLWcEb5VA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5f51d8ffdd514eb877441315d8214d2bf10462287eb5787b1c1259062eb0b83f", -"confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", -"service": "00000000000000000000ffff87b558c7", -"pubKeyOperator": "01820a16bce71b2374f71384f29dd4e445adcb99e7e48ed75333a7b7441fc60137c240be087b3d7b660cfd3d5f9dfd4e", -"votingAddress": "3hBn7JYp6uy2DkB2vnLT1PD6EjnH", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5f7f4e4918ee12892b035268db4be4bbd345b4f1d8e30ed4afecfab0bd8cd4f3", -"confirmedHash": "6bde92970a7ca5a89f8f403510095f4d7373fb1a6c6e83831d00000000000000", -"service": "00000000000000000000ffffbc28a31e", -"pubKeyOperator": "825b93492ac36df028e64173b8f7cf6d30eb2f388b493d46d8165be84db52b5650f73b64929f0013cda868c5b6a984f1", -"votingAddress": "3TmP96HUNr8CxaebMENj4zoDKbRU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5fbce54bf1b3452d10c4e81c43b5b3c2f1c8fa42956bf2f4eb062332acfc9bd1", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d56e5f", -"pubKeyOperator": "08dcdb1624c0c260b9bc3f9853eb1467318b237c307fc15bc45d58db8b9f12181163b7b6e3a2947b3ef3ea2646e365e7", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5fc464b615b8c054ab7a1af249045ded873002ebcb98a5fea41087c49b0f8558", -"confirmedHash": "6ae1fc97f35f12bcdbc795195e82d45c822437c0a18c9a702f00000000000000", -"service": "00000000000000000000ffffb9453721", -"pubKeyOperator": "85473f12dee8f18bd20066659629a1e24d3a3b3c78f5a18f579de575f606ac66978e4867bb50a1982e5f377633d92f66", -"votingAddress": "2FmEJxrxXKVRJ1rwmT75vfxX41ak", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5fd06cb36c8120e0a2d979159f8a20cbc6b730e493b57184e870cf9864ebf8bd", -"confirmedHash": "e8b06356e058e73f4bcc36e4d49195cb27801a564f4f18bc2200000000000000", -"service": "00000000000000000000ffffae22e9cd", -"pubKeyOperator": "91fa29c961a28f46d7c0ef9ee0e079521f2659de7da34823441565f10f7a9f44fe104d32418cc98612f5daf0413b0af1", -"votingAddress": "4RyPHXhE45KCSze27wcTZgDgfoMo", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "5fd1ee4df32d5158718918c4eab6f3f1c99b1335c5056461a9fbd6fb89079bce", -"confirmedHash": "a58940634bb729e6cc43ce12b0df35854b6f91de511407381100000000000000", -"service": "00000000000000000000ffffbc28f164", -"pubKeyOperator": "905096907c1dab513f0716727183b476a929fbc9f9a2a423b97ee99abd9a3302406da1f25e1330c7b53f7617ea93fda4", -"votingAddress": "7VKBeda4sFhABfBJ6tkm3Xq8Xyf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "5fe590dece088b80a32be5443454cb75fe3b11891127a5424ef5a398a519d884", -"confirmedHash": "648d18135ce0480df70fed2d2ff1fb1380f94a18971624a30f00000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "jDcCp3qAYiW9fEcjgRhqqYKw16o", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "601864174ae7ddd855a02eebfbca8fa1b7992f1128b55e451593b6146fe72530", -"confirmedHash": "5388ec12e2dee3d8083af02983d4c6940c314c4b1dd6fd300e00000000000000", -"service": "00000000000000000000ffffbc28f167", -"pubKeyOperator": "99e775e172f90f9ce00ace38c21498a3c502f435715546ef313a1f0a465afa44340e73e7efe7f18a2999cd3a786708ae", -"votingAddress": "3vC541ZsySmYTh6RvTmQ4pZWxB3r", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6018819fa74ddaa68bcb65a75ace4bb36b594ea9624929ef539a08931a114400", -"confirmedHash": "861ed98622270761e60ded88bc6250b489a023f8c4f0324b0800000000000000", -"service": "00000000000000000000ffffa74733cd", -"pubKeyOperator": "8955c7f86c05cca0f5562a211e3316589f1e1930e890f7cb4167c5db0d3af44f3f649378d993c6f97b652c95d752e208", -"votingAddress": "2qGzNKTZdByJPfCiSkH8boWZ2jTC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "601ecf6a5064f03bc582fff987bf73a52bb96815df4cfce33ee578a3fb081c14", -"confirmedHash": "388eb10960de2a54a47b11141e82f9e9884d8f08d7223d2b0500000000000000", -"service": "00000000000000000000ffff4114704c", -"pubKeyOperator": "975c9882d26ef179281a19411410dc7132b2feaae08d46d26865ec58fe1fdd10ab4de0de8b2bfee486c77e3fa3224112", -"votingAddress": "3t1cT21jQW6WQ5YufhpKgjp4WTos", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "602a3e0045828e1a86f8091a5154937a7f9fd7043316042c9c9480c6e6b4867b", -"confirmedHash": "0e9cbd94767002e1680aa8faf902d426c527f0efd146c4170200000000000000", -"service": "00000000000000000000ffff22d1edf2", -"pubKeyOperator": "033a892de5639d0ec877e6b1e734efab29cc48bdafc81e197552ef843ddd1e335a0d538cef6acd04a1e51025e2e33124", -"votingAddress": "KqvNGLSmFDowGeWNcXsvXeGgSZw", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6034b5264c6a78c8ae1497a9bab55bfd562cc93779765883ad4b35594ba2626e", -"confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", -"service": "00000000000000000000ffff92b9afce", -"pubKeyOperator": "01ce2549ef8a6f9bf537bf478c886052a9e932558bbd540504d26a41480d9608e8d5e2e4a60b31b8cea8d63fa19c1fce", -"votingAddress": "U5KmEdoGxBBTEL7G7i3GRgC1KSJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "603920653dd6dae1de4da4589c061d014208315afacecc1879f7dd4dce463771", -"confirmedHash": "a72879e817682cece2e019f2360d2a451aa648628ca620e51700000000000000", -"service": "00000000000000000000ffffd4186837", -"pubKeyOperator": "0364fde0e35de869e381106a333a0535b28145e2647932c310a498d0f7f56fc834363dbd0cdf1135c8c8c56b6208a29d", -"votingAddress": "ibQVhcDwm22yhNQUYupzBMSexkY", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "605eaaa50f4f4f48db75fc2c33a27204e9ba86d7eff95ce40501dffcfd23e465", -"confirmedHash": "a10436edbf04db8e17d5c8898d087ffcf6a713ff34c0a4352e00000000000000", -"service": "00000000000000000000ffff52d315b3", -"pubKeyOperator": "85ff78e51f591b465456a2071c0d760a3fbab350a8914701d07e369edd92bf4db71320bf9a572f991070dd936a45129e", -"votingAddress": "4ThWmEkYBUjGSmMoXj1tfTiaejGb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6063ece82c1c983507aedfec86900687056d18d9190fbd6403e88859b6f47d63", -"confirmedHash": "4c4db90e7429aad0713555360724f008b19abfadf98209eb1900000000000000", -"service": "00000000000000000000ffff2d4da9cf", -"pubKeyOperator": "170551fc9efdab34d3133855294d4cb0c0225cc128651e24697d2e149ec6f988c0bffa078209d8d9d2902aae3dc58037", -"votingAddress": "4UpHwETgqjnrA9DH1G9cwu4rxkPw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "606665885c556b6b42b07cae28de6b86749a0dc60e99d60687b1675550e6efa6", -"confirmedHash": "4625271a9c1ff80c4a0349516c47ee5d0e68daad4a28fa780300000000000000", -"service": "00000000000000000000ffff2d209f30", -"pubKeyOperator": "88dfa4b1b0be528f687d516a76a8597fbfcd2bbb787f45160608d0ea1b103778be1fb65bde20ecc8d6dad2aed52ddea8", -"votingAddress": "FT5mXXoGYx4MxHE6k5zyJCsGkoG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "60708cad0e2da8422de031544cddb2d7c9702a60cf5b78e5989c5c5571e64099", -"confirmedHash": "97a83aecc1a51786d3cf8e6a0a00121ef9ca46d041c9c3df0e00000000000000", -"service": "00000000000000000000ffff52d319c1", -"pubKeyOperator": "8e7b5534ce6613403233070c0fcbd57143dfaf3c24df08306c02356bc227072208a58309e68b520321953540e89dab10", -"votingAddress": "5tvKJNMLndMvW7AMFpZKJMA6Es8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6070ff76961187ac4c69bcab1f4c0707b68ccfc0942a937a7aa58dac10df20de", -"confirmedHash": "245401f903e56fecb152d4d9e9de1e8f96e97bfef2ecbafc0b00000000000000", -"service": "00000000000000000000ffff8a441c08", -"pubKeyOperator": "09555a9015f28fc8138eeda0d29e6df9722500d7b25bc6c6845ad939c9aeed0eed9676fb4a34d79867313f9982a4c715", -"votingAddress": "2LffuBvYQ51nQiBY4DLP3ZbRCknZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6099e08bfeca80328e0c1e3c2acc1ae5af9efb6ee93a9b62f2bc46828380f237", -"confirmedHash": "47247948e618e1b287d9faa53f2b8342a5ac6b656e94d9600500000000000000", -"service": "00000000000000000000ffff0509ed20", -"pubKeyOperator": "0c444238f832100e48fb1fe51ebe73a6ba04f9c1d6d577d47465aca39f8a3e4a584547c4ad676cda8b4ef06105225550", -"votingAddress": "Kp1Hp2zmrihwYjgCJc5poFCPVjg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "60a0faea533fa3ef898a7ebd2b2e3c40c62b62428ee0ff391c853f97b4f13eaa", -"confirmedHash": "7ff088d3dd533f0b0b22c3e42105ca6d68cd00f2ef3fbf4d1500000000000000", -"service": "00000000000000000000ffff52d31969", -"pubKeyOperator": "086f5c0d57ac779daae188eb2e177f49ab2dfe26114889fa0a7af5dcfca25cffad47f2b4e1cee0d90736aac589a46283", -"votingAddress": "g2jcNHUTGw7aRoZWRT2aPvJLrn9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "60bd57a1ee801b421c18bac2e3a4fdb31ec7b29951854a5c51b41304cc92feb1", -"confirmedHash": "f1457b74fb1c9b099faedc8dd40c2e4c977bd0c95d4f33ae0100000000000000", -"service": "00000000000000000000ffffc0a90688", -"pubKeyOperator": "8e9cf7e29754bf925c679e0bfdd2c2dce969907c52c726017479265023d0532b2e901ef4d9470f467b0662b511056fc6", -"votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "60cac414f2aacce1912e1565b9fc6d56e040634cf624dc322fa0bd4b884d0450", -"confirmedHash": "21dfed1196950ed8722263b78717136479562260dc535f4e2e00000000000000", -"service": "00000000000000000000ffff52c40b8c", -"pubKeyOperator": "87fc2ad7d676541c1ad5ebc34833dcaf0f8cf1f2b2756aa59a912456c50b92c9501d58760c41047744cbf6f20126051d", -"votingAddress": "vafQqysRUjAgo2U4FyvAmDVU8pD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "60ee8e1f469a8aba47e850d4fd772a871e2a2b01d55c0c39a93abd238f9bc233", -"confirmedHash": "e2cef7b9f1068384090d18f30c215f1ab018a917a8f03bd60500000000000000", -"service": "00000000000000000000ffffbc28be26", -"pubKeyOperator": "8e5e34bd4a86ae56c423f92db1ccde76386ea3f645b8d612325491f248627969220b2166ceb10713131283ebdbd0ffeb", -"votingAddress": "3MZfTbV75ccmjo1TGbZL22cqq5nE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "612bf5417c3872bc55a179e3d610f215d8a77a3941772c33254a4ceb1c289d36", -"confirmedHash": "6e536cccbcd4ee52c421bc42fd8e2722276de1bd7c0382c51c00000000000000", -"service": "00000000000000000000ffff88f45fd1", -"pubKeyOperator": "899b91f07736c40773089a0a93673e7d7ba4fc1f39f0596f32bde17d6ef982ced5706c0b9941de787bdd93a8e64d814f", -"votingAddress": "WsSjMyQMDj8x9d66NEVtnmETRun", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6134bc6c82a891c62d6b7a675f997069a0edb54df9dc6a605c4d724d3f12c465", -"confirmedHash": "2f85279967d942a75ae499321cc4ccdd8cd52ac3e6c78bfb2500000000000000", -"service": "00000000000000000000ffff03df9a64", -"pubKeyOperator": "8b3982fefc2e7d389eebd968d85f8ff558152a84653519ccd35fa85eccb5b4c97149d6801dd7c9cea998827bbdcc9497", -"votingAddress": "3wYtNsHPLfbwFbNEKxZPVCsugLD6", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "61383f52869d466a9bd5bdc640517f83e9bc4c8337db78b4408e7c800f31593b", -"confirmedHash": "45e8390346d4b25c3f16bd2860ad07fc063047038a52951c0b00000000000000", -"service": "00000000000000000000ffffbc28be23", -"pubKeyOperator": "08224ee6b96586f5b004ed5d8fdaaa6c9b144736b84190961d949c6f4ba3d922657a9317bc8068ac3af818e7fbcdf6f3", -"votingAddress": "2QfjoVHW4SvssTkFEifwmqSd8Yit", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6162907af7ad2cac4759f1f97a94e85dfb455742d0165a2a4cbdd37b8aaaef72", -"confirmedHash": "1d9a405cde7bb8c603331803f8377497a146ca61722ed48e0b00000000000000", -"service": "00000000000000000000ffff8a4495ef", -"pubKeyOperator": "1269474fefd10b055edc4d942be8e6541af6ba620481502d4c280859439f68067ffa9d4a00b3e66864d3507e6659f402", -"votingAddress": "3qg95qHcpbXGUajoXdrGNBic64tF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "61779d08b44e80c0b09166dbd96fb863263faa86d554fa18cced98fcab2ab393", -"confirmedHash": "3fe1cdc34e47206ab992f48e4f2e60e2195ad6d6c32d21d21b00000000000000", -"service": "00000000000000000000ffff3625c7e9", -"pubKeyOperator": "9050a68d5d6bbad4e7d3c53e99aa6a55ebd64261deac5ddc876f433b91a19e1d3f4723411e9c8cae42823c3511a4412b", -"votingAddress": "enXnNBHG29co27UGjFprEKRJ9ot", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "617e643aa070031cb3ba5ff1b67366fe00c8d3e7a73cdca7a62280ec2146fc4d", -"confirmedHash": "f81b002bfb781819e3cda2623aae1d1d0f63ebea4c3e81120700000000000000", -"service": "00000000000000000000ffff55d1f1c6", -"pubKeyOperator": "02a30458526be178e80dd1c8693764a9c38b0c4f796ba6a81f5a55add8c601b701ce5f19f48fadffb91a0604f672a8ec", -"votingAddress": "bqwBKteCccjwK4DmkAMdmTt2BPj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "61aab3dbe121569c98f12afc7db1ced3024522dfa3eae10222bb399c72a76f47", -"confirmedHash": "2601cab7c66d3ce80253872068872812688214b0ce018e110f00000000000000", -"service": "00000000000000000000ffff2d4c5363", -"pubKeyOperator": "13127d14f1d8416f3bbf8776d53f6f15a2e4a7a723c52ced623cd117b87f1038d4d11dd7fb887bd1ec85561aede3bce8", -"votingAddress": "4Wo5JvqqwYFJ2nMimuB7sjjSZRef", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "61b5c9ab03878e601b9831bd39cb5c00468c014404b3072eb13e83ef146542a0", -"confirmedHash": "9b5bc5f246bd929d5d85fc0a4dc95df780c83751bb96832e0e00000000000000", -"service": "00000000000000000000ffff55d1f27f", -"pubKeyOperator": "93821a532696c5e89f0d23eee272b0dae597fccb179ccb6e4dac3524779b315e7277d952f2787a96029cd47154627d18", -"votingAddress": "wJVMphugPxWjrqPTS7pJzjgLtyw", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "61c6c16b8eb4712270c025d954ee99106ba1101ba0a55b50c4be2fc29de3a147", -"confirmedHash": "8001382290ef7977a01692156b3b206d5a5b96f0dc839a600100000000000000", -"service": "00000000000000000000ffffa763f259", -"pubKeyOperator": "0936107afd59a0433113ee3d77ef0ed7bc48790f70959460fdcac663f7050b4e48179c68228fe15f91dd6c19c702d0c8", -"votingAddress": "2L7S5Un8v4yRPwmS8GKb3pVTyP1s", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "61d0df9abad847210c3d285186a3d21f649cf42087a008b432eff29d1321f2cc", -"confirmedHash": "b1216f9453e51773579e24ff71c24a896d36d803d605c7b10000000000000000", -"service": "00000000000000000000ffffc28750cf", -"pubKeyOperator": "829c3680fd40b82c231e7dc12342d5012234aca8a597531d0c77d720896b08de8b6f1d8fc9b91513389743793d31bfcb", -"votingAddress": "3kvoiyUgn5ab3g3XhB4jrnLC5xBb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "61e0d51702b70109f2986e0b77a27f330ac9e322eb910862f5fa6835129e9f22", -"confirmedHash": "8cd4137a3dedb0f3b934c48c7d687f1378315742f7ec21011200000000000000", -"service": "00000000000000000000ffff95f827fc", -"pubKeyOperator": "12de0d4849606a3e6bdd4bd145bbce2058f0f793169509d839b59c048b92881586fe768a79d59285dbbfc007a3e1eff0", -"votingAddress": "25L11q1FJgAAjBidTCzNLFe91rJH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "61e3f54ac672e1f6546b53e6bc025f8d2001c632bdc6ddb6337803abf024d5de", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6d3c6", -"pubKeyOperator": "96bdd4b47b44bf0ef8f675e0a01991a13a6ef21285a16dcbad201037e2522e20b983f27152a6a790aaf154b85fc33391", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "61f2d4a53bfdff0475379c15fb88f98fdcd4b05f4b3a11f7b645f2a3894622c2", -"confirmedHash": "f91c106c5aa7fb92dab9f7c19354ab3aacf5488f1533ada11600000000000000", -"service": "00000000000000000000ffffbc28b6da", -"pubKeyOperator": "10611c18a4ed0a8d81adb5dce519c73cca3dcc6755989cd33e86a5b9a895ef8af2363fec1e8ac1e3b23825ed5840fcf9", -"votingAddress": "3NiY4EaWhhG3WmYXN63Xk8ZSknD6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "61fa2ec243c272f408d41a78fbf68a7e8174dfc42d83241072480a049749eb98", -"confirmedHash": "1f7adbc5629a32c806cf9df53c137bf3c046fc6ecfcb02d80800000000000000", -"service": "00000000000000000000ffff59a38001", -"pubKeyOperator": "8fc335d21f4706f4a42f247a5107fe4c7c8b41a0b46a0dbf3f23838f4dd0d4946894ca28187c96cac2496c338225b0d1", -"votingAddress": "3RQGwcBpUyPqU6rPgrn7HjhcsNg9", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "61fbf1ce92219d327b3b72cd3203bd5be8ccd76de3dfffb3d8181b482f9cf4e8", -"confirmedHash": "21c8fc132a85c3fc970e80efad1966e14c243c31df0fb98f0d00000000000000", -"service": "00000000000000000000ffff867a6845", -"pubKeyOperator": "8b2164e07092a82a5862be11d6edc1d7c6109393bb9e7b00f8f0157ec1eac096b1331b8c2ad33a0c911aeef194a85a3d", -"votingAddress": "38YypwQ6kXmQ1ExNvjxZRfCBosHy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "61fdc954f0fd50569ce5eb9da3e4544c4e9e7da4097fc3b411e94195103443e1", -"confirmedHash": "3e6ba1e6e972fbdd7279c2d1e1ae9a253ea1eac692836a801300000000000000", -"service": "00000000000000000000ffff904cae16", -"pubKeyOperator": "191526ed6e2d3bbd38967db79022fe7a430e30959d580d799cb387b4f6ec4559a320dd08872bc643b19637b92040c28b", -"votingAddress": "3ZxAqtivUM9vbW9g6S9dhvkuUSz5", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "61fe9a9d0ec391e3f1bca74c03c97e1b091c918133cbcd2e664a452c629bb1af", -"confirmedHash": "2065c1586d5a0dfb968925b694d080421c506e136cfb62ea1900000000000000", -"service": "00000000000000000000ffffa45cc1da", -"pubKeyOperator": "9479c49a885d0dec2e28b96e3e25756bc5584cf7d218020df720b1cd927a6cdfe5c8387dfcf1502b046ed4bdbd50b7be", -"votingAddress": "gmf3QKaazxATaYSb4VbxsMmwFcN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "620010d0651ed57b093e7bead37e766781c2bcb7c3cea73d402bf390e8e3fc9e", -"confirmedHash": "9fd8650f3baa8ef3938d7a45a2ce5b96b5fe3baf5ac357870a00000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "2pkRgK8VCpVCjVeGdXLvHyAcExh6", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "621823e4341f6836431b97262a851b3a44c6adfb9ac88085af0cfb639598412c", -"confirmedHash": "5ed4f5fc30e936bcc9c149e0495d75962417f1653c1a2ce71f00000000000000", -"service": "00000000000000000000ffff52d3194d", -"pubKeyOperator": "83da4cca499eff56909809acfc4a79c8fe3ca901430b71952599dbaaa5bcd103761f9d38de6bbe5775037c0e7c1ce373", -"votingAddress": "TYoY1BxzPeCofBD7ktXxG6FpiTq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "621d2db5fd34a5905e94569a6078e014589142a162316d5de80c02a408e9a086", -"confirmedHash": "92e88e8c6db10d1940f2ac18144fe08855106086164582001d00000000000000", -"service": "00000000000000000000ffffd4186c7a", -"pubKeyOperator": "965d7e6950ad79667e9c014dc519e78e27d741f83c467ee17ab1ec5b8b681a56139831d3a345ffb9a1a55a365416c4b0", -"votingAddress": "PyRM7zvQXMqc1U1EFoGu3qCkArL", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6222eebff4944f12cdc73a74a4d774961db61cf8bef5559307a18bdaf4f67147", -"confirmedHash": "938b9267a8797eef53318eee82daf4f03a3fdbc68b31f05b0300000000000000", -"service": "00000000000000000000ffff9df542f9", -"pubKeyOperator": "076a1d6aa885ac0a312e25b5dca83d6e03aa79cbd9e79bc9cfb77e05abcfc34ab8a778aec2ec812257064504fd9ce4c7", -"votingAddress": "22qrZs4NJE5x9f2akvXmyGVTVePL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "623162a18e9b697e05f9b4c23281397cbda559ae19df91ec0ca38580ba9f91b7", -"confirmedHash": "8c30f68f4131396e1ca0d479a0ae2fc58ac4ec9d1d914ad63e00000000000000", -"service": "00000000000000000000ffff8b3b278e", -"pubKeyOperator": "0747c6caca6ca007a52231e7747938cf60e6b49f00e2cfc8b222883b7c86304474add2748b1cce7d9fb1a49ada8a4fdc", -"votingAddress": "67cKdVfYhy8JThiNueLf8HiSk2A", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "623c0eae21d4c171194cbaa87c1000806601aeb2899b96645cc04f6ee99f0c96", -"confirmedHash": "084aabebd797cd2aab6cbe332280e061a61a8a4243f41af71d00000000000000", -"service": "00000000000000000000ffff5f552e52", -"pubKeyOperator": "02e7397e035a6d91ada3beda82cacd9fb3055e6c95ac1ce6652471e5c3e853fb6734502e81d9931b6c37650d7e7eeba3", -"votingAddress": "3qxXXnHHTuMpm8sQq8qEUXPsjbfh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "624bef2c9de75dfe09e6dc0ae84858704efe3efc5e06d10600897c8f3f2f0218", -"confirmedHash": "bffe0d825eb950822d7e312bd8849b24d8044065949eac4c0d00000000000000", -"service": "00000000000000000000ffff951c9ecd", -"pubKeyOperator": "93236879193f2fd572297b3c1ef5710b89386946a0baa0effa35919e2e577c92b591232184847606c72a44bf6aea1473", -"votingAddress": "39hnELvPSoo8kN8zAXSo78jjg9Ds", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "62506abb2808931423a51a80d36595abe0687e29ba684ba10809b23e87402759", -"confirmedHash": "d4d848af90f32f2c8bfbed9b4a386f03e1065a3857f87eb92100000000000000", -"service": "00000000000000000000ffff6deb45aa", -"pubKeyOperator": "00fd436c07c921e463447b1671c72f2cf0e087c255a66dd9f20ebebcc381f2d593ef069c50b7e817dda34d39842279d8", -"votingAddress": "2rkGw6j5iJF1JWafYfzQt4cbpVbd", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "6252948726ef9787a07df67a2a79781c32ce0f605dfef8066db398d2ffa62a46", -"confirmedHash": "91d2b52cffbc171ba84a742ddc084d5a3e41243de5aa9e660800000000000000", -"service": "00000000000000000000ffff2e04a268", -"pubKeyOperator": "07378c528ac33788df12375d105011823eda1acc73faee6cce6d4e88c6ad80ada80258d35ed3e9807d19af9e01c4953f", -"votingAddress": "Fdby3zxs8mdK5vHogmPzNDTJAwt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "627812bbf6a8dc0d58a18cd439b55a61379d06496974e36994ae90ebb7c3b70c", -"confirmedHash": "2839919c8bfcd2ef4a2fcb6328e1e5899d6850b4f1c960df1600000000000000", -"service": "00000000000000000000ffff422a5ec4", -"pubKeyOperator": "9034dd53f7353a528e2b7c1a59122309f384222543cafaf89041fe92885a770564f5e414543f1b324b0ae0389b8a3b95", -"votingAddress": "4L7KTxAs2ngXS5iQbp9smAkN8YHX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "62781657b13992b825d6969f3bc71dff506cd5394dd013c330beafffd95be158", -"confirmedHash": "54687245820d86ad38f571c8d41bf578a640e20550a8a14c0200000000000000", -"service": "00000000000000000000ffff52d315e4", -"pubKeyOperator": "07ad3633714ee3ebdf1ba552d8b121af21a7146f9188bc392391f8709e82b0fb39507100e20476ea33032d0e01991c47", -"votingAddress": "4PiNvAu7CeYWdktsQHiEfXq19ANu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "627b5df7ecce658c4bbef8767e1aeaa6fde8495b668e3dde33d817145fedf5d5", -"confirmedHash": "3845e61195b22b362b38fea85eb3aee5610ae09030e7ab260700000000000000", -"service": "00000000000000000000ffff6ca08178", -"pubKeyOperator": "14cb9dbe909af26a278b06d03ccdf7e708140f5e063f2848944fe20175d1186568ba1983e75ef7912c0b6f3ed0329b68", -"votingAddress": "49dKbbSfgtsARpFL8YQu16fdCchC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "628c7708872ea4c844629b8416a9e17d24d0b7549d1005d79b1fa6ec97bc5154", -"confirmedHash": "70563ac26665b76215866ec173788740234be601af81388b0500000000000000", -"service": "00000000000000000000ffffa5e326f3", -"pubKeyOperator": "0d85498c66f70f541f1b248146efed7691234acec6b942cf5e83a1c4c2479031b57a520f309e3327777cc1630b2c903d", -"votingAddress": "nHx2UufT9ntxiNtMBZTu73dzKL9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "629b4678a27d887bf1607a17e58728f0fa6fb59d97d8841e34a15d9c4dee1c1a", -"confirmedHash": "7e6b44b80fb4ca556cb10a7af22ce8374050f63f2bddb48c1200000000000000", -"service": "00000000000000000000ffff36270a6e", -"pubKeyOperator": "86812ba3112a27c63881aaaa21edbe32165c8e0b99c67e575559256ce66670f297bbce3147178719a7ac568597713b74", -"votingAddress": "z8yfKEB4iV3fX7FK9hXd9dJY2JM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "62a53d165ec13bcfbe87c220f0cd3584dfdc71c5b7896a36273aae47860bd8a1", -"confirmedHash": "eee41e1d66b0a6363ab6d8bad75b65fc4a790dd398c812ea1500000000000000", -"service": "00000000000000000000ffff2e04d9ed", -"pubKeyOperator": "82b481578bdfed7dc7f5c95f25f93c0462342ceb3e9f0d9f74a1f99c57ec53529ba6d21bb99d5baf395facd92bfc361b", -"votingAddress": "GvpeqLypR7ma6cgzTJt6SLG6Jf2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "62c5b4770801001a5e2f26981280087d6ceb1c82d6da5ef44589af94605047c0", -"confirmedHash": "dab715aae3b97199e6d3dbdc3eb97788e92fb3707474819d0d00000000000000", -"service": "00000000000000000000ffff5eb0ec14", -"pubKeyOperator": "847944e6d22048898b7565d0467d0160aba93a0ca3c12ab389d4abbf9d7673a5491d7e4eca5147be9537ac86d79e2cb0", -"votingAddress": "3YDviCZ3Wzngex1XSUmLBqLgxpXb", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "62eb42284e9a82f9745306f594b485a59cf5555c6ee2467e2fcd8f90091c30ca", -"confirmedHash": "2492ea3b729d90f88b5f842cc4991378f8944e4375a696250000000000000000", -"service": "00000000000000000000ffffb009d213", -"pubKeyOperator": "82a604157069a745a3055025e33858c18da6f54410c77dee30c82db829d356e549f06d132fc32c7cd7e26d7ce204843d", -"votingAddress": "4MG67NrLqzSAtGRtxmRac2kTZmPU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "62f8d9a392e2965254f181cca1d8b1b4ada2ab6cd1fe7922cbea38503fff5a5c", -"confirmedHash": "b486ccde27e00f68ec784e41480b60535e8138a5f73263d50800000000000000", -"service": "00000000000000000000ffff52d3193b", -"pubKeyOperator": "098ccfee727d15b3580d3c2d967df7eb65fca2178b20238bc9f0daf30a298f4d4ec258004e1e9f07e09f964423821bd2", -"votingAddress": "2V4f9rv6VJXvr9h17xgCJXfj4tCE", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1760496 -},{ -"proRegTxHash": "631e24ed12ad2a6538ca25ece47f64a4d32efd963e4c32f292558854ec7c9e4d", -"confirmedHash": "cffbef032ba1ab095f15f551a29af139c1fcfa34a67491dc1900000000000000", -"service": "00000000000000000000ffff55d1f106", -"pubKeyOperator": "06461cd1cad6b0659bc9b2e066e550bc04a940dab682e3159262c6788e23b5d7636e7bbc8dba16f4d0835d598c6db2b7", -"votingAddress": "2HzAYhCYgMtsBeDNHPAcsArFbAqq", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "6335e4012bd687154935a3ed74e34d041b4c91d9ddb4a8df70f2077f70e4ae2d", -"confirmedHash": "f6bf2cf0f8ec4fdbdd197cda7ce0a659141791dff62e16ac0c00000000000000", -"service": "00000000000000000000ffff59280049", -"pubKeyOperator": "05058767da13d592ee4ea1cebc1cb4dc8e56aa087cc6f9f7ee8ee2df112a8754a96e1c3002040f8c752619f5a2225bd9", -"votingAddress": "2qm2HyJswyxX5Jnj4ZVjVPnGin5i", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "633d6fd05391ffbd17844b9500c6f2cded3f733cb82b8f354eb0c51b296ff5a1", -"confirmedHash": "a3de1313fa2f1d6abf38fb4bf36c30ee3a26d79176abee120e00000000000000", -"service": "00000000000000000000ffff86d11c23", -"pubKeyOperator": "95b51537fe3c7a446412ca9ebf8ee287e7b3264ac26648d65a86abf55df8fa314c1c2746f6157c1aca502a4674ddac90", -"votingAddress": "4BV53u2nDzKVf7gQb8FmebZoroVE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6342e2b3e0e71f4dda149609e7d8c96b255c66ef1a9e1d70655afcc646d7f531", -"confirmedHash": "74c1e0a44a431831ca7a6f4ec65c5da591081c00f51907bb0300000000000000", -"service": "00000000000000000000ffff92b9a35b", -"pubKeyOperator": "850b054e9d20729f96beed3724d30d3a323fbf01eca1a1742c3f3066548ab94670b671347e20a4a419409ba6c2f27ec1", -"votingAddress": "4BSNvj8yZBKGSoxF7DePcXeQABkH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6353ba32493d8c1938c23dedb6bd98c7ccc8d5e75ee34f9cddb47c4f2c16675b", -"confirmedHash": "f8bcb94ca0d3f4726ceccfc9c891713c192adf1ec64de6d40a00000000000000", -"service": "00000000000000000000ffff90ca5f12", -"pubKeyOperator": "1115e533c0dea77e10cb463f35a34fe653c1676f4a201abb029ff7801095735fb5d5730d3231d444205947e400f47eb2", -"votingAddress": "qcyeZzG7VyqdbHAdYuqJkMnrycH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6356dbff00efcaa84ad51384e02f942277316f34476e044eec8ad073c7544298", -"confirmedHash": "95ca7b9118645dbd0535c649dea5f61af9b6276969ed682b1800000000000000", -"service": "00000000000000000000ffff0391795a", -"pubKeyOperator": "0390dc81232410e0cc707e966e42e8fe48c46e8218cf65867ed64594129398b84e738fb6fbe5398a80dcbd69bc57aa26", -"votingAddress": "3rai9f8Sf6udgsK1AmEH6QK8uGmh", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "63667ea5c78f0e0af0715104e78898b572d38bc1f3b7aacfa2050c1545587ab5", -"confirmedHash": "82d016c2735659fe3b89a20aa8b3e0c65a724676dd3c6c850e00000000000000", -"service": "00000000000000000000ffff55d1f1d4", -"pubKeyOperator": "19f3e47e2a104b7e196a2fdf0186902676f6712f323bc03deb3726fb45af81e2e328a3ce6a3960fa521eba13a90225f6", -"votingAddress": "3vVnL7QDDeuU9S1iP4BqeFRFYuQM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "63748d40845ef5edb657246da014e6d6c47ed612cceb7681209f505dce87a576", -"confirmedHash": "c68271b30a9c3780d07917d65f3d3832cbe787c71b8ebc130b00000000000000", -"service": "00000000000000000000ffff2d2172b5", -"pubKeyOperator": "91b5a307c0c1bf497ef6ae27ccefb5deb5dab266c5859f84d36741d73dfea4900ae620677df154e07799e8df1f25abc8", -"votingAddress": "2b62HheyMXm74Jt4xWokd7ukreyM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "637580bde0312a4b8d930e0398072d400bd7ee7314295bf318081cc2eb4c6458", -"confirmedHash": "74eeef8df9323115d4c6150616ff4f8836bb3cd60809df920f00000000000000", -"service": "00000000000000000000ffff55d1f1cd", -"pubKeyOperator": "015ef78d18f60e816e77316dd096c1f23d2081fcbac9a14c0cbb47f6a8afdaa5dd6d99820bd154db0d3fdcbe7d94c141", -"votingAddress": "2BF4wtUQH1pHccuQBGpfWGYRePcN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "638b1acfd8016b9d40e130e282db86b4ee24d79ee80ad8fd0eb78c5ca3e4ba09", -"confirmedHash": "3708505a0d4821cfa720b98c5c2ae0d548a40be68df4d6320400000000000000", -"service": "00000000000000000000ffffc034a642", -"pubKeyOperator": "947f00161f9cf1c48ffb31fac106d3ad05c294291e053786f9699bf475f534a0d3494f508b9ef5aa30cd2f1f26c96a82", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "63984fa186fa217ddbdfacab90e9c084c53e21dfe38d7490caead5c6173aa0fc", -"confirmedHash": "1a423d6286575fdcdeba5e43f7ec9acc119fd9ee71f3cdfa2700000000000000", -"service": "00000000000000000000ffff90ca652d", -"pubKeyOperator": "863a2e21dc3626bcdba681a915122897dca90b6d3b1378c997d5ddbe9c434a27780f2728120c4dd06047912eb8d41a16", -"votingAddress": "3wQo9Cwp2zSVJYhBwPwyZoVqpviC", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "6399c7276fad3ff4b5d7ca47090bcf47e10df2e73ee53068c670b013443272e6", -"confirmedHash": "ba1fb51ff239c701b47f62c1c2acd9b35cd765b45e7ce8440000000000000000", -"service": "00000000000000000000ffff55d1f186", -"pubKeyOperator": "96e17dd6fd9ced0e1e625345df491393870a748d8dae2eac7677793d3f569f2f3434f5b621d790819ae82736c30414e7", -"votingAddress": "4GAoPhK2ZkV76NddPFhC2hBpmPBX", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "639ccad345aa82cf898a912db60c49e5768de9bfd0bfa92bb91380b40e58b0c2", -"confirmedHash": "19a8f40a78010724e4208fa54abe708343748ac7e3a7d9b00200000000000000", -"service": "00000000000000000000ffff95389f8d", -"pubKeyOperator": "952a80d650fd773d6b986bc17c29409468e46c3b05f1433e7ed9f0039346f648481c4117d3d5d141e30c7b669d4bb64f", -"votingAddress": "2JZiwwYN3nX96FcMjwav4kkK4cuF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "63ab7725683c38672e0074b609e90e427e9a166bd2b2522c5b49185a458eb64b", -"confirmedHash": "dda17e992efb6e90c925d967313985dfddb2aa5d0aeee9711000000000000000", -"service": "00000000000000000000ffffbc2815f5", -"pubKeyOperator": "97a412fd4cc33fb3eaeca6fcafd8951376375a0b6a2ae0652662d5f620bb68cbcfa0612419cad34d4e79ec8e2477aed2", -"votingAddress": "TRHVy9XnLibyKXYo2LXfhg54fx7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "63b07fdcb2776a76b900aa6f3731e0cad7146191ea363236c9f5b438761548b9", -"confirmedHash": "af47b91d5e6ce3c0ee6b846630f6cecaedc27a09d5cd13661f00000000000000", -"service": "00000000000000000000ffffadf93c0b", -"pubKeyOperator": "06544fdfecc56016c4006f9db68b50e9f358113507af563b779bbd9c98770acca167070e68fa801392e0bb63085302bf", -"votingAddress": "pA8Rrc29DPxbTc2EKaXqujGyg9d", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "63c1cff069275eb0c0b650270565aa41cc963784e9d2f734f941e442c6c9c643", -"confirmedHash": "1930115fcfabe8035a4be3aa3f9777dcbaf40b16211e81020100000000000000", -"service": "00000000000000000000ffff03e42bf2", -"pubKeyOperator": "89097a4c138519bfeb4828ade49a92c7970960a6f897776d639cc90e22d939f07ba3c3e55cc3b64b46c189055bddf812", -"votingAddress": "4ZG4wy6kDPN4bnqwjyEQUnnbtN3o", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "63c2e3fa76c5e3cc8f777c6fc670f47c3d9c55c4c4ade90fbf57ef739ce9bae1", -"confirmedHash": "7ae69f82576c98918cf6bd5702e943d27c1c4c9cf7fb33cf0a00000000000000", -"service": "00000000000000000000ffff55d1f191", -"pubKeyOperator": "8a96d801db37cd893225ab9ba2f050ff29bcd77eb35cd8ea43978a8315aadf747aec9d365e95a5c3619bfa95111f5703", -"votingAddress": "2YSjvpAeAKjBTJuYDqStEkk1wqMo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "63f62038548318402d45b3a7c389f8ace58368893dd5efe4f738be10967b6755", -"confirmedHash": "704dc193c7de74d518e1cb1d219805fb0e848e645674df172400000000000000", -"service": "00000000000000000000ffffbca64d5d", -"pubKeyOperator": "805580aea9d30815985c2e99e78c117999f5e8dd747d76dfe91cd3544ee0026f617596686bfaff1c2c0f6810e74aa498", -"votingAddress": "24haWSQZXQnnLVn1HMyM1ncyHJe3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6419b54e80ca53b47f24525723655f468389493d339418ba92faf4b4a32e3f66", -"confirmedHash": "10c6137641a8acb597231d0e0a37cbd40e670bbdcda483771400000000000000", -"service": "00000000000000000000ffff4e2e7b60", -"pubKeyOperator": "8cc006b5f51a5d5c9281b5e276858a4c1c0c9f036f821ee2023aa56cdd340a7c950f3b2ff54b0fbb9bc85aa0aa20a560", -"votingAddress": "3AdmBtFHjKUbcsX4xedTG9GN6cm3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6428453267df84892e504e569712041d5fa395e8fe55758d0f4d24031b29582d", -"confirmedHash": "e422434b744dd7df01ac384970db8e574c692431ea4bd2070c00000000000000", -"service": "00000000000000000000ffff4e8dd8f7", -"pubKeyOperator": "098d6a358ebdf7bd3e5a22c5784f4a3c691788ece395d9312b36274274f1e2c9d47206041f194e49ea41afd211a594f8", -"votingAddress": "3P1Mo8pEaVKGSe5zirPFnHtf5SvV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "643293e9de4078c9d48fe481b47c976d1c69c31349d8662458916232ccf88807", -"confirmedHash": "1d381079aa5e6e92d14d8c976873ff27a7ea5150a36857300d00000000000000", -"service": "00000000000000000000ffffc6d37a13", -"pubKeyOperator": "905367a9b3b724f19bfef250339bdb131ed4be6195bebf7499dbd6afcaa3be6e2ae2c77f15f0637e343dd43838555ecf", -"votingAddress": "2gCfrkEXf66jX8SZib6aYaAmqd6h", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "6443d0bc3197bf596f7d082696c82aca58c04b001ce64d074d098600d94f89af", -"confirmedHash": "3ff15183a0e0066480a5000c0b452f3a40d995a5ea56a5910c00000000000000", -"service": "00000000000000000000ffff907e8ea7", -"pubKeyOperator": "8be8f2210aeb29eccf9934ca3c2c74dfd08ebd34685268f7b90f5eb06d11522f3310197332cb90f749ba69cc560c1b6a", -"votingAddress": "GBekiA2mtM1V8kZRtj2XjLWGj7z", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "64650f3607114ad887fc55f7367b1d9ab2f9466f43be2038db4e1aec3f6a5647", -"confirmedHash": "b9aad072e3c96d236185221cf6f2cbf00262b02df0d082e50600000000000000", -"service": "00000000000000000000ffffa87757c2", -"pubKeyOperator": "81bd2ff57e3bb3f1ac171ecc4ba9e72b3196a9d0bee8fa6cc8fd5d340cc620b10ac916b2f586cd9f1011b8134bb00bbb", -"votingAddress": "2RY21wSmhjHCwEhChYTzeX7TAMWd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "648fff2aa49a26ae191920ed53f88e1d65cf9089f887fe9a4ff310692248b6ff", -"confirmedHash": "afadcb4e77db3878bbed1972202a4fb21532f80186c4b6551c00000000000000", -"service": "00000000000000000000ffffbc28e702", -"pubKeyOperator": "0584cade63658358147fdd565bf76c9dd7eb4c13e806ee49ca4b5486f01aad6b5ec8ae34efca35f103e6da13d6c5482e", -"votingAddress": "2NqKa2e35F4kURSaeCj96XzGnXwZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "64affb9089c8857635e937c78e4be2bf983d0bc49250f4c3e84fcf6588b9a017", -"confirmedHash": "bfb93d26c990365439d4a32b92f45fa580c0674dcaa63f170100000000000000", -"service": "00000000000000000000ffff55d1f1f1", -"pubKeyOperator": "05c0d63020ef3fc8c7ba920a72c5b06d06069bbab4644d6fa0cf27301cc18e752f197701ff407b5cecd1da9e55a7e563", -"votingAddress": "i1rxwdu8oC63Kw1DVpJ5Q2gw8U3", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "64b813bdcb598f202f1751fc74ede9e62b61aa1e72e049cc4db80dd794a9654d", -"confirmedHash": "7b9f7b1cd4b904a23effc461fbb53bebeb25bda847a5d8092000000000000000", -"service": "00000000000000000000ffff90ca6aec", -"pubKeyOperator": "95c20f00ba4c656905f52ffb613195906152492ce2373b7b0c3679e0fd46736da75447f336fe0ff5ea171c25461c7694", -"votingAddress": "24TTjykkmJwRTHJndK4Aadrw3H55", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "64c1b7513030f62c02d2b92dee5d885034e260c35bdfa3bc29d69b8dc04240ee", -"confirmedHash": "3469554c8b6b3959b40e342b8e1140db9bade038c473c4af0600000000000000", -"service": "00000000000000000000ffff6c3dce08", -"pubKeyOperator": "85fe58a69d7c5bd301ea70a1b38c42453cb598d21ec38de63b710c0a136fbbf0a1ce81a2fc0d4b164fa046d126191999", -"votingAddress": "2jPYfAgsZcpPnsCj8bhXGfZLxUmh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "64c5727883b0ff7593949b3fa6372b7e243798f146809f25d69382faec1c10e7", -"confirmedHash": "136eb168b7687d3dc34c9631794b002c1219e1b61186c4220000000000000000", -"service": "00000000000000000000ffff2d4d7526", -"pubKeyOperator": "10232876838b752c949f73e2226cb28e1d1a9981479fc88b767304c2e76328320f9507599a6fb4e25f456535429d093f", -"votingAddress": "2rNQ9VvFT4nmAq56n8NkpX7NezvV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "64cd19d4d4800ce83692bee8c9ff948eccac6f4d2ff33883d60f18fc68dfb29b", -"confirmedHash": "54b1326c6bc695a1b6fa4ed28960e001b84e8d0dfa70ef740f00000000000000", -"service": "00000000000000000000ffff52d319d3", -"pubKeyOperator": "0ec3cc07abc9478105452505767dd850dae2328e43130985d5e1051fcafa9641ed27c1b3093aee1dee39ab36eb6789d9", -"votingAddress": "2Rcs2WJVkCrwT8yLhtfppcxLr6h7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "64e4d4f28083af15c1c625e65065a6452a43171fa775f85ea8507bbaf418f03a", -"confirmedHash": "d08e629e93616e373ee7e1fa30725c6617dc3c6caa7287200700000000000000", -"service": "00000000000000000000ffff5fd87e2e", -"pubKeyOperator": "14cd3c7a237cb46694ce76cc8b9981b6737451845a0feeb3f4ccf572e9b908d4a9d38ba1e4691315785b93ed2f5ba33d", -"votingAddress": "2fEfN9w4kanuCqkDRktZ5RRqrEDp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "650550b29b57949cf441f1cd6dea0e20106ae58af67d59e86f0c0c0ab559a1d4", -"confirmedHash": "ac3f666fdfb2a45b8d39fc473ae9bcb707934b1393ce04c31600000000000000", -"service": "00000000000000000000ffff2e04a279", -"pubKeyOperator": "824e8d1fbc74e0b4863a78f0ec392b428153f22664241f46b770468b8b600bf52997dbd02f355d136380a25e361eac94", -"votingAddress": "riFinKcWLHS6uR5qtFdK6aMYfwt", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "6532449205321aa8c5ac6e31913e3fc05b7c8098605e4be2c65084e6abdcdcc9", -"confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", -"service": "00000000000000000000ffff453d6bfb", -"pubKeyOperator": "89faf73c85baa460d8301ec0fd96eb880bd78fe416a38a99519e1c9e354c70db7cbfb809d418a213810098e8c33fd69f", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "654e0b525e6fa5968f4f756d8a577f8f3582d2d1a8bb59615841f17f95f5494f", -"confirmedHash": "0ed2f3505c75b1970dafae2262d789378e00462404f2a2e81900000000000000", -"service": "00000000000000000000ffff92b9ad51", -"pubKeyOperator": "18ffdb47043364c2de7fd3d6b3966b973c43df9d13c3bf1fbb1a4c84a762ec75390a721f95a74e97f4552176cefaf0d2", -"votingAddress": "2v2JuBcrtCGvP2puzMoM3N7khsn7", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "65596ba2bed41104ded4f51997c372d0ad634b8c22ee8cdcdfa9ec8d9d2f9e99", -"confirmedHash": "43b3caf59cbc5331ce20c7c1be57c84ded106d611d049e4f0000000000000000", -"service": "00000000000000000000ffffb07b39db", -"pubKeyOperator": "8f20fee6cb44b0e442d89a78b6ee51c673e7bcd56f244eaba575d0752ce5eb05af5cbfcb7d7525263ab775f08849370e", -"votingAddress": "abBKVJTNyjV5rsbmsZyAd6bc4RW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6565c9114263a114ad734928b67844e7b85a0076c9a8fae406fef3db30214f84", -"confirmedHash": "497ecf3f4bd3753cc67078abd07fc598463a1189bc521e460300000000000000", -"service": "00000000000000000000ffffcebd1c6d", -"pubKeyOperator": "99197e05673f1d21dbb09c5db0fbd44988a7c567beb8350f6461d3c3027368a00a2cefcc74005f37d4fb8e0ab7284a30", -"votingAddress": "2JSqELwVue7SEW5psfTGfyHtYMLW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "656d7f6585b56dfd49be295ef4937e2eda1572dca14efa2a1f0571c03263b6ba", -"confirmedHash": "ab25b4d2afe1c56f9b33733608b170a3b2b23c76b6e934012900000000000000", -"service": "00000000000000000000ffff87b5084a", -"pubKeyOperator": "81246626f435dd8aa0e74acc82b7b98c9e7a525cc84e93f2c9d563627b40684621722800a54b0ba20f71bb252401a37c", -"votingAddress": "31DBmXk2ZwpB4oXwMAfWBjhPFXAS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "656f8dad08641a352f7c3f01fc60dec21b8a73721cd98b64486edc4f1d3e7a08", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96880bc5", -"pubKeyOperator": "986a5c0abedef127b34476d7a430c61a7d3c5b902d9b673149afab4df9b74fc78ef95531e4861c0938adb6bf1d1f89cb", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "65744b796afd16b2a3138a2cc5d910ffca89017bc581a2abb07806f650b8ac82", -"confirmedHash": "5e63b4971d59089bb96cee513232545a4c6c6671b0102d621f00000000000000", -"service": "00000000000000000000ffff87b50fe9", -"pubKeyOperator": "141bb94ce6a696e88d709006a651476299eec65948b5237f03dbccf26f4fcd94d73fb98cc950f5a0695afc1ba81f4d7e", -"votingAddress": "s8pHH2KTP5iZ64Suu94NijxTPEM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6578d6cac129b9183c8759a1f75cce22c3327b40d4f65fb2d1d44697270057de", -"confirmedHash": "8b5b114844c450dffd0ad2c5055cc9368bde11425bf297d22800000000000000", -"service": "00000000000000000000ffff2d4c2a2c", -"pubKeyOperator": "03d970dd8d7b6909bd5d6511159fc38576a8d4553e1ad357b3d97b27d06a97e55747e413b93d4d3b1f843ad8a24e9a67", -"votingAddress": "wHKrpMLtoG1uEw525JAGgmFGLPD", -"isValid": true, -"updateHeight": 1759698, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "657c068b6320997011447767e8d9ea3c6619e5513ac577a9228ecc0dd8cc5732", -"confirmedHash": "5a44ea07cc8c568ecc510aedc72aa5d8a39d271c3e55a99b0a00000000000000", -"service": "00000000000000000000ffffd1fae82c", -"pubKeyOperator": "04b9e636cab6d25b43889f80d9b4c81699574b3670ea336be7642497fd3eba1e297ee05d2b0083fb594586a1cdff515f", -"votingAddress": "7Ybab3M8adxHKvW3F8C45tPeo3j", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "657fed9e6a22e2807d4d1652dd92910cb7c87f3440530cf093fe42aeb56cc265", -"confirmedHash": "f4b9bcc2fbfdd0f2c715805c4ef701899a9ac0d103ae9b4a2300000000000000", -"service": "00000000000000000000ffffa772996e", -"pubKeyOperator": "0919ead5cd20ce4b0871533e72505d424ac4cb6aab22a61806cd4561deb1c6a26ebd2a823a12f5aa5942906549a1ca12", -"votingAddress": "37tun6chxteh5n31ZVPi6Aef7Lob", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "658b676a4af96be2e2811d4e902aac82f012e33cc139e30c651614fafb598200", -"confirmedHash": "8ba0c7b3b4cdd8902ddf210478eb89d6735236e2d8c239b23000000000000000", -"service": "00000000000000000000ffffcfa74082", -"pubKeyOperator": "87b9c5196071dfd0e8c08c0cba5cf50f07a2f6de8e9f6ca82895dd9ccca5bad1d8d76048f3cfe83bc2c43646476dea5a", -"votingAddress": "3rSmNjWFzfUzBiEjYGjEs8v9vby8", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "658c321d9bb9e6b7d56ffe0b934083da2089267d19231ac4736883b4e1374af5", -"confirmedHash": "a927cd71c585a25b3d39197012129f884443a34c794e9f9c0d00000000000000", -"service": "00000000000000000000ffffc28758e3", -"pubKeyOperator": "8fe8c0de542ebbb9cbdcebcb5076cbdc19173bcd6e1cf18aa135a9f526c9d3f73db267ca0ed77c1168cb4fc06951c377", -"votingAddress": "2366WfW86tQ9Sfa6PAm1cmV4FTze", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "659118231c2e63d10518ee4ce8266667e56f174096d3f7728af5b594ab78ff73", -"confirmedHash": "beae829de12b4541bb5f7b1b56c3112bba87218693a3409e0200000000000000", -"service": "00000000000000000000ffff9de6f175", -"pubKeyOperator": "03d81b6295466acb3b3a07ec3d663f1111c6bf0341b42fc833fbc6d9291d8f11bd8c62cfe585b3ba77aa1398f2b805ad", -"votingAddress": "ydprZsbuFtKfwnEWS9RcZDj3bma", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "65947ce579c7b7c5d0fe3dd86757e744a13dca96e02e4ca35756f84fc44399ad", -"confirmedHash": "86cecc3f2abe030bf155ff9118ac40d31a8cfcf51c43fda51900000000000000", -"service": "00000000000000000000ffffa76355d0", -"pubKeyOperator": "8992660502dc70a9e3c457ac1b288c2606679297d631201a96fe645c7b7ba83d11ac540889011ad865094e9e337f5277", -"votingAddress": "aY63v2m2MfqAzbTKU6wRVANt2Av", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "65a155fdc7d936365eec5a9b3c084840378d4dc82be1e29ea2176372f99cec94", -"confirmedHash": "6d0dd7ad91b4487d52698d3da54b944edee3dfc934a3b80b2100000000000000", -"service": "00000000000000000000ffffbc2815e9", -"pubKeyOperator": "105fa81b3df254a135b3d5a03476e5129cf5aa032e3a2aefda9920deed648a5ccd96999c270edabda333d5f4a98f0e29", -"votingAddress": "YBPDrAc7Pj9q1kE7LwdgdeyoMEh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "65a39f058db7db3798febb9fbe0873ee0b42a34310b3cefde7cd51cce72a064b", -"confirmedHash": "77e7c83993e7647717c6d9cb3b93a971a1cc49f192e387701f00000000000000", -"service": "00000000000000000000ffff68ecda30", -"pubKeyOperator": "0461e175e14df1d48eccbf0f2f826562199f5913bb2942a6e0be98da68028aec92d360cad5933cf1fb751fda13912ce8", -"votingAddress": "3BQTvZEG2wnLk2BmyE6kWDgsFcUs", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "65a49ade0346dfaaf3f6ef943771b868cccd38685f65727bac189222e81a0843", -"confirmedHash": "679536094fb62fd5f1da917c2d55f9caac98e17f5f41f5400900000000000000", -"service": "00000000000000000000ffffd4186688", -"pubKeyOperator": "0bc5441807edcdfcd7cb6ce590d25d07cf10b72ff92c3a31e134b852b01afb32d597d667a58e76af7a47febb9c099b7b", -"votingAddress": "4KSYNLVCUT3tUK6XiKNWJUAMbMsz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "65b3281b0cfe4a852580dceb0c55241349082e2a9295ace462374a0bd7043203", -"confirmedHash": "05a0259454e52c948991c8497aeda443c38d4d33f238c1820700000000000000", -"service": "00000000000000000000ffff68f89068", -"pubKeyOperator": "036d1235afdd64db599ab40d62559c84a4951fc82ffe65d2ec21c2a4026edacd5033093febe3bc5dcc915a5791e9cbad", -"votingAddress": "42fTaFqE7Dyf1yz3xNsCWmJx4XGc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "65b38c39153e2e0929969c8fd7854f52c16c488d8082b4e7082b358b4441d0c6", -"confirmedHash": "8f3932a04fc1cd5fe465fb07e7fb2e1fa9bc27917cf20e9f0a00000000000000", -"service": "00000000000000000000ffffbc28b248", -"pubKeyOperator": "09ab1f817e1f40ea193bc9d3167c1c22ac828a99fcd21843798f3256498ec2b465175069a80aa5c466891e11d4cfeae7", -"votingAddress": "26pySUYjeBViZxxBos69MtMzz17C", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "65bbe752f2df5c7bef573c15b629d78b67e35816bb0fefe0c1644ee7c8a6733c", -"confirmedHash": "2361df2cfb3dbd626bff6a20f35d1ab801a740bd10e5a7c31900000000000000", -"service": "00000000000000000000ffffb9e45389", -"pubKeyOperator": "045f64dd776b01114ec874eb3966b1f3e4d94ae53340b1d832e4a9e88727f059caa53dd75d917ab4f01d91323370f305", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "65c0fa59da600ea1da6de5c4b4f03d1810862f4666384034e965075e990cb52f", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff0360ffe5", -"pubKeyOperator": "15e54e5e50cd0b271eb3f2bce37e3b149879db6d2afc870acbd22b449986b7bf0ef87af3ec7ab487a33adddc9972e46c", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "65cbbc2d18d7342974f6cf08e75236764fe6c849d48f914da9ddb81338f52438", -"confirmedHash": "42e8b8913740c3dbb938334f4f057ca2d1e49bf9b66f7ebf0400000000000000", -"service": "00000000000000000000ffff422a5fb4", -"pubKeyOperator": "957e9b7190a6161337c0a7d91edac17a1e6ccbe3406ea695bb5f4adcb34c1dc3e5b4ee04692a38b8f37463885a6f63b0", -"votingAddress": "3aThU8FGktfBB5ZuLRHep6ZQMazV", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "65e77711edc8124a51431534f7bd1b72959743421d4560dcf6ee1d50434b6eef", -"confirmedHash": "c88dff642b627c0b4c0b1e8c4ee66de6ea41220c077229831700000000000000", -"service": "00000000000000000000ffffc0f1c29a", -"pubKeyOperator": "90bceff9d9fb7a1bba76750a97c02a3ceaf54626252d95ed172023c5810b6a4c1817c0341d6787ebba1957f1ac2225ea", -"votingAddress": "2qQRaj9yeMtKk8FNN1CV5WNPkX4j", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "65eb4e315f02a7fc415f94e97a16e15979c578d84b52ee9b067d49a28ea08533", -"confirmedHash": "384705056af13a71965c968f8440f70435560c321393559d0300000000000000", -"service": "00000000000000000000ffff2d093ccc", -"pubKeyOperator": "8acdf96162269d0f2528631f6a32486180e9d57531995a44b2237800878cd29e473fa31edbe14cb5d9128940727d9c85", -"votingAddress": "2eCR56GYnBCnhHJktmrwhiSTnqTt", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "65fe28c85fd091c4235b2dddd1994dfc025ab1c59439fb1ffc2388129b7683cd", -"confirmedHash": "59848223d313f1eb2f10aa2bd7d5b64875d7a8f74bb69b2f0d00000000000000", -"service": "00000000000000000000ffffc0a9069e", -"pubKeyOperator": "961832ab240c21b9911130c5952de2340177c4725c18ce8ae0bf520cb6c387500bb75eb3f682c41a1009fe53b38e85d4", -"votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "66078c61df7e755a351ccb488f6ff2a5389ecc25b3ea0c7f1dcf437ef0b85f41", -"confirmedHash": "60939126cb72249c0539a3eb07c40b5f26d9016df7f509121e00000000000000", -"service": "00000000000000000000ffff2f6ea5b1", -"pubKeyOperator": "0f6e769742da475f875f9afb65cd815d6f85b7b3cd87a778533a9d2bfef9be544cb2ecfb526c14a4f0f85749651cbdf1", -"votingAddress": "48N8tQ7pu31XRgTa8e6JRhVYGPLc", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "660e2f0f8b11c0e56bda26b9a421a6fddb4df008680e1831ad2311b580b5a26d", -"confirmedHash": "e551662559ec910c4dad5f0dda0696f1114ca2581ab6b90b1500000000000000", -"service": "00000000000000000000ffffa7ac2646", -"pubKeyOperator": "8fbc73bd0b34163e4bc5c9ee5f50f4c3c3aaed22d762e97d9960f1f625f511abc9a4a7ee54db6038d2da783f70791454", -"votingAddress": "469TFoDaiFxv8VVCQC4exhNghH6H", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "66307f72f006ff03720776e4980359ebddf00e24c63b906b3123daec35ebca99", -"confirmedHash": "75d5fa513ec1fc7047768e44e059092a272f174c2791e7ce0a00000000000000", -"service": "00000000000000000000ffff2e04a269", -"pubKeyOperator": "102e40fdb4264af0632597336bd6eb99f7d055165699985bcf66253053371b93716dea5c432878c99d83be6301afd530", -"votingAddress": "YHFirvozEJYTEdYXoMqDaBJdYbP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6660377604c62bd3a460416a823396e969c657491d218a3d6ef68a90f5ebcdc5", -"confirmedHash": "b13718249496d9612aeb030e1df2628c49bb3e9449a7a0411000000000000000", -"service": "00000000000000000000ffffa87757c5", -"pubKeyOperator": "8b20e275a0829e2328f0a0b0eadcc2c23d7394fcc23ae11e1f8135bb58126577ca85d775f379a60a3b90c20eb2d3774f", -"votingAddress": "2fbTDau4vre2e2vcovoSM1whWDG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6680b0e45be647b1269b3ee1861b5071529b2b90188e5ce3666db78fdd324e3f", -"confirmedHash": "32e456780b04bc60800b8d8a783a14e53a0fe3ae891685720f00000000000000", -"service": "00000000000000000000ffff74cb9fef", -"pubKeyOperator": "08797b8fb78aae163127347675af842c593b120543131be20bded384d10874cdbbccd03be635fad4738683aa36a42f7c", -"votingAddress": "2ZohiFdnjrsoMvbHDKoayuuTEWVS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "668262467335358886ad9cd6cec983fae5f980f93067fcb60e9a1c05646941d5", -"confirmedHash": "6ee4685bea6ff3b0f9b425133af5481350f6da84730544621700000000000000", -"service": "00000000000000000000ffff330f752a", -"pubKeyOperator": "19a3e5e4aa74c81aab2f5f8f829cd9b3517375664a6b565ab4f6f2e639b053397b3ccde011fcdfaea849f554e6cbb08b", -"votingAddress": "2hNDst58xgU3EtZvGXG4n9iUP6hQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "668b3c407673664dbed9621bf28a46f99e668888dc77324e1a5644754e386c51", -"confirmedHash": "cfa5c4fab60ece1bcb89c0432f69ab8551b2d0b451cee3460e00000000000000", -"service": "00000000000000000000ffffbc28b847", -"pubKeyOperator": "84b64ad2bf739f6ecfd9088d5616ae71ae96f3cda5f3a46f75b11afcb6f68c8f265b7fb83d52453af0c9eeb366139901", -"votingAddress": "49LzbiwBitxcXhkb9fBCDiQS3i3D", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "668e7a474f13aae8b448c206408fba8c3eecbb8aacc5899401b2c81dc9c6f9f1", -"confirmedHash": "c7ad62af8e01db5f4e139caaba77405518931cf0cf3a65c81400000000000000", -"service": "00000000000000000000ffffa8775784", -"pubKeyOperator": "8cf05f4253dbf94737a88ddf4e39cc0ba63e455722ae64a79c5149da743ac4d13c6aeafe4b336acf26d144effb34de9e", -"votingAddress": "3R777PxhJifrCpKcRb4P366LvQNT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "66924e751f23a4ebff4f86b947247ccd353a79da76d27b95a027ce59679cbc8a", -"confirmedHash": "8ebef7d25b5e7b8c07e3ca9b7d227edcf0ccee65a6c4156c0300000000000000", -"service": "00000000000000000000ffffc0633893", -"pubKeyOperator": "85e61673d3ae0e294fd80322cee46ef28d84e0796b6bab33439f31c0acf8ccaffa3376c1631c59c0ab9043eb58343461", -"votingAddress": "owaNnXPBLv3Bgfe4mj4aVpJgaXS", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1760688 -},{ -"proRegTxHash": "6694e717e836919728aed0147a62c0b96574cb7a8607333ce60071e5943b7c1c", -"confirmedHash": "fb7e29390cec688709e50a139c679135bb0b80e6f0fba8b80e00000000000000", -"service": "00000000000000000000ffff55d1f1b3", -"pubKeyOperator": "1806a42e229d86e223a26bccc700667c8df250bfcc69d01359afe6839dd6e933efc328b2879837fd9eb456e221324426", -"votingAddress": "4Ns8p39JCQ5bWwUvAxYrkDtLrQty", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6699b8eec27031ea5d666b63bfd2dbeeb0748bcaec89d9df6b17483c91ea515a", -"confirmedHash": "8f0e38376d4a0f7ba454d7c496f888dbdc3553d68d6590623800000000000000", -"service": "00000000000000000000ffff2d4c2e06", -"pubKeyOperator": "92c34ed70b3b186a986a12c56c2af3088717dd4770ccb02913092249a990eca46f0f0c11d70315b59cab907b27484283", -"votingAddress": "KJB3mBsNZvatkyCr2RQZvoW5gz5", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "669af58246bdb628f927a12d4491e9bea673f412f04a85bdcd246c592b244645", -"confirmedHash": "aef6ce4203bc3d19e0ab00bf4f1ea1178ad5094bf30cb7052200000000000000", -"service": "00000000000000000000ffffb9e4537b", -"pubKeyOperator": "05b998954c2682f4d1e7aa164e053f965eb20567565466d124691f16b9d7ca438195558fbf48ecdd2c53246a84fac79f", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "66a292d2d7d51b292db1eb73e7625e7d78faae5dd51ddaa9fea6558d32450709", -"confirmedHash": "6a5e15a6654babe6fea0a9fc4bd0b704b270dbfd80a776e90e00000000000000", -"service": "00000000000000000000ffff592fa46c", -"pubKeyOperator": "837c9effd48a5c411183e502637aa4a31a6d317b2a9de8a409edf28b5c11dc367719354b1102a487b3b596f6fe52e7e8", -"votingAddress": "fXaJNPZwDHx4S8VSJT82WrS7NRe", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "66a9908f91f7a53b2210d21fdf529b46d014b87c5bb036883da4ff8042303f50", -"confirmedHash": "744c42d778846371e0a9e94e22d163e88d8fe52ce689df5a0300000000000000", -"service": "00000000000000000000ffff40e34c80", -"pubKeyOperator": "91601e7e9c3b421654398f2c78ce7884836fb14e0e3beeb31ad97895e7893964b52f20357ee8e2d99df5753ed2c3a630", -"votingAddress": "2fVYr1WAXG13esvaQhdxJMQGRYpQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "66ac85c516c9b399b87de890a66d7d95dcf55eeef547e45ff143d2e2a7467f54", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688b455", -"pubKeyOperator": "80606066510cdb67bcf83826b526a0f985cbd3a64e610f77530fa745e8d119d4f651b941caf332fa049ddbdb742a1e57", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "66af3646d86115ca3c0d6bbf46897e16c32923bcf2e3b88223a63929b3fb5ae2", -"confirmedHash": "a1e6a81c221aed68d0e640d6581eb47941aef0a4afbbaca63100000000000000", -"service": "00000000000000000000ffff52d319aa", -"pubKeyOperator": "94a7a29762d8a062b7099a87de24edf6ca7ba3154980f7450c83efea486b909e0605b92e627960846e1153151d0c10d4", -"votingAddress": "3uMV2mzKHEX7hWtoF7qZKYuLZGnp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "66b6a8d2186acea6ba24b675837946e50e8e35a799977535cf059edcc134e60d", -"confirmedHash": "792e7485055a8c799c7bbc07ccc5e4eb38f121326be067d92200000000000000", -"service": "00000000000000000000ffff2f6e9cb4", -"pubKeyOperator": "0434a3a1c094d2475512408eb850925bf5f12eba54ce4ed3cc87c7cbccc8df34b383d86790a9cec77d7662f69123a44b", -"votingAddress": "4RNbh6MpTv5yEqiTA6APvq87KDEw", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "66d1ce93b1c02ee38aede3812a7d8016d90f448e4cbf09c9d500f01328614146", -"confirmedHash": "bdb5e6281775a33960c66f73cfbee569ce1dc019fc8074da0000000000000000", -"service": "00000000000000000000ffff0dd43630", -"pubKeyOperator": "0a7ef2fdda56890012de58eb5358cf574e0b7769dde86ea94b3b809bf4b64ca86e09f288faedf45655906e153c8563ee", -"votingAddress": "Sn3a6zN47EKmd53F67Q923YVYHN", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "66f43e78cf1c341f53b5464239f9031dd1f2309aa74f16b18e1aebcb4d84951a", -"confirmedHash": "261825887df3825bd970cff47164c06656b0e90dbf3adf980200000000000000", -"service": "00000000000000000000ffff8b3b1314", -"pubKeyOperator": "026ecb13e4dda694274b86fe406dfd7986da6622f273847f16c97ae16d3bdf551336e21751637c77cdac3b90fbe349d4", -"votingAddress": "5PWiYrZfGynBgGpbHq7W31Jvn9H", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "66f5d760c87a0b95ee3e5253b381aaad8acf1b6c9e63d4e87b3e48eb14fdb8a9", -"confirmedHash": "bbc602d9f3ee5c67c5907786e8fbd75146adbad750754c500600000000000000", -"service": "00000000000000000000ffff55d1f174", -"pubKeyOperator": "917a8933d88d390e95f39cc1c128e38384e62e1fe6c5ae25dab9179621687cfed8ebf8d4fd2b9d99e221fdcdd1e46e40", -"votingAddress": "z4zQbmog95AE9U9j2iTWBZVZJKd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "66f749605b4526347c4af5ad94e530102fcf2bf14a4c7172cfc981943d75a5c2", -"confirmedHash": "efc659e22a6c7e95ead4e691d04f33a4fc27ed07f9d8668f0b00000000000000", -"service": "00000000000000000000ffff40e37814", -"pubKeyOperator": "0b97cd3487a3ce1cb958093aecc532b348dbbfa0dbbc1b7037311feb75175d636ff10913472a28094d541f1952e5aa22", -"votingAddress": "i3ZWNUeKjkGaAdhu1Q1VYy3y7Bw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "66f78d2e6cff2be420bf29de7fd967b8e8460ef6c7e3e956562bfacb5d4af5f4", -"confirmedHash": "32810e38e9d2fabade099a651026bc862e71dd7caa675b620c00000000000000", -"service": "00000000000000000000ffffc28750ac", -"pubKeyOperator": "14c021cdea12da46161c1228bb6e5f3606347e931733920f2c997c25d80b01eec97a1a8d62c9403c8b3efae5aa1574a9", -"votingAddress": "2WXSSzyr7txqZDZk9x9LdPPMCc3s", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "66f960150752a9b5def4c862e3dfa94041cf7b065f2211974ffba6dd289a4432", -"confirmedHash": "ea3fd9fe48a5560c48ce197ff9ee4715200fedb0b683274e2b00000000000000", -"service": "00000000000000000000ffffb29d5bb7", -"pubKeyOperator": "0eb23a52722515dd063625d525b251158fad69445a7a6f3efd920dbcbbba559dd4832576b8fa685a3450e187bd0c0da5", -"votingAddress": "2KHd5YmKHUHwa9LaMZVFXwi56eUA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "67089c79225497cd7b24a2fe32193fda38005426e5e0886e8dfef0e55a5091ac", -"confirmedHash": "3f16b9b9d664619a5d665aba3e96c3b404ff8a1d3445ee561400000000000000", -"service": "00000000000000000000ffff8e5d95f1", -"pubKeyOperator": "0c553457ce198e1f9035b0da29690d02e6eb1c067594d602060459d8085aabd5a2ca01a308a74f39597123c7a00e6c6f", -"votingAddress": "2SC8Br6dk6BNnBJrtjTzL5B4zXJX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "670a15894302f0ac76aa2152ced98372a463a20ad09daa8bb8525e78266a2e9c", -"confirmedHash": "c1ec7a2720821ab6952c9785b30cc79a8c2df7cd52d490901700000000000000", -"service": "00000000000000000000ffff453d6bf6", -"pubKeyOperator": "88eddd803b13ee7c00ca3b791e10d8423009a1655b562d59fb5a45c3c2cbb133c0e18047049718b1a6703c89b7e09364", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "67112f6e261f9d01d340c2093e6177ffaf062e0a7799d7f9a52ace30ad854275", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0c5", -"pubKeyOperator": "0396b11c000274daa8208d2dcd7081b01e738c3c582c072606e4a9aef73fc5327dffa9418d92f7b81585d6d848c50e5a", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "67161840a217ae1d79ba88b2ab207dada37152e67ff92673b99c5b4930117aaf", -"confirmedHash": "3a84a96964f12b3df7f32cb9d3cb19ed1e3a5906ac937b632c00000000000000", -"service": "00000000000000000000ffffbc28b483", -"pubKeyOperator": "8d5b958452e5545919b574f69d11fa5d5450e7ec1094fa1b255f6c1c514b91d90751a1f779af5cce8453b15f5ccd6786", -"votingAddress": "UpwmBcvXtju62ydPXiBZkn6MG7Q", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6720b1172fa728a3115a7d53340bc4b4947d3e336e067ef35a13f1ff9da99d9e", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688b58c", -"pubKeyOperator": "16e47f3a26f2c30698bf32a44a137079c729dfa5cb93fa617a544975c2e54b0f809304da649ad131fa26e7e16682a7df", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "672a6ecdfa5e37bb60677821daeb64edb083549d3c9d430b9accd624ac2eddaa", -"confirmedHash": "b69708cd9b610e3eab02c123c599999241f850c7f667fc8a0500000000000000", -"service": "00000000000000000000ffff9f597336", -"pubKeyOperator": "88995ec4d65e3ce501d80d992a9bf9b6c6578811d14a2af776bdcee17fbed7a6495f9de40f29ab5b4f40c841bef45cf2", -"votingAddress": "3wmujvZpHkA841pZ2Vg3DMBABpAR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "67406660b363118f82dfd8a937d40e268e210986b1e96c3aa186a4de13c5c019", -"confirmedHash": "af8a5dc0befa66e85a1e8c61de6cfb3bc8d6ded549e1a4860400000000000000", -"service": "00000000000000000000ffff9fcb0639", -"pubKeyOperator": "8f520a24e987f44fe7f1136d1482d9b3cddae3a422fd1d7229b186ee1151b32b2f6e3f77107b4dddc7c82b3262c9e8f8", -"votingAddress": "2vbDDPimqGzFuRL1AbBonAx9bd15", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "674c252672beae4b8d84255dc2dcf5dc319fdae742ae402b7302cbb7aea8cb48", -"confirmedHash": "48f5a1a9e186baf5938872a2ebf03ae0a2e2e5fb3f246eff1200000000000000", -"service": "00000000000000000000ffff58630b0a", -"pubKeyOperator": "17a2313835fe45a640d0c4120f1e55a7c719aeb815ecb15cc013f70290b5f98e7a9b7fe0b671dc86d512b447610f9b3a", -"votingAddress": "YRFGsVZzPXCKsyseq4Z6KbrNgbG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "674d74f30979f288bf8a9245276d8133db2e7a6e83c2543f3060db0927658ca2", -"confirmedHash": "47247948e618e1b287d9faa53f2b8342a5ac6b656e94d9600500000000000000", -"service": "00000000000000000000ffffb23fec70", -"pubKeyOperator": "8d371be988812e3d35769b5fa47d9a4beb69a0ae20531fdb5998eaabfc31bdf2c0553c7906c4674744b3be8814afbde7", -"votingAddress": "3ptGJEVK29WL31E5c3cMcbX6YQVN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6759a77298985fe77097ccb0ea2a97c75864c285d13cfb68e4d4145897f7286b", -"confirmedHash": "8f69b3f5f45b3f2c0fd8e8cd663e7d430f4c98da4b1cbeeb0d00000000000000", -"service": "00000000000000000000ffff8a445444", -"pubKeyOperator": "097fef72eb75c48c03d0915d77babe347f2b391b4a3d32b927ebf1cb9006d0633a1d28201948d6d7e04cd98c796c85dc", -"votingAddress": "2mFUFMtj2CcnbeJw4RgJJqmMMYZi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "675d1c374f60200fbf86ea05cedb88739c3190dc0a040b290e67b0e00c9db23d", -"confirmedHash": "a7e1aff3e326dd4c567799cf77763ceee47478e48989f4e10f00000000000000", -"service": "00000000000000000000ffffa87757cf", -"pubKeyOperator": "8af1e5b8428a4a2e2cb2eaeb84917e6825505c9f825b4813e2182a2224a5fd617a65dc32e9717703c8b8becbde41b178", -"votingAddress": "Xyk5vtf9233PMcJ2M4Nza4JmBgC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "675e056805bdd08fa6b0dd0cf01d98a5dc1419c6cb47036a8169459e709590ce", -"confirmedHash": "4a87614c3c9a020ceea38b9716b3e8fcd87fc4a258bbce4e2e00000000000000", -"service": "00000000000000000000ffffb23ec79e", -"pubKeyOperator": "086c15bd8df949855517254b79ca1729d480d4d13308878ef821bd93fd9d98a328624e8e771e380559e5bae6c320dc17", -"votingAddress": "3Wj5UrhZBvBpsy5fJ44eEU8jREnC", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "678103f5e26906aa39d5c1e337f8e139fee7a57c989f303651d5856986e19454", -"confirmedHash": "3232e0dcc78501b173a5b848a66180bf927d78cebd6a31aa0a00000000000000", -"service": "00000000000000000000ffff6c3dab55", -"pubKeyOperator": "0e46393d91ace04c99e110e49155d8edec31f731ba5897a48190023262a452d55ebdee43972e458cc622eebc14255a99", -"votingAddress": "2SzgXtsnaERJdFF8AHxy6HwVnnSW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6781474b23443ba1d3f651e5d66ae4d4eb27d8344e8f47cf82c1ce2dc78bc4b4", -"confirmedHash": "c31afec0ccaac8914e8b1e1bff725ca26155fcf4d88e77ae0800000000000000", -"service": "00000000000000000000ffff52d31972", -"pubKeyOperator": "93bfb50497fcf03e8e1c308e68a0e3315850c410ba0e2ce3e3afbd7b16503e1cc9842e20e82774cea017c01aad21f526", -"votingAddress": "LmEVsMhKSb1gpgMQk6oUednvTy5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "67860e4cf1a6f5d8788dc76e16842e9d3ed2927d819d92ed4a581b35945c36f4", -"confirmedHash": "dd992594bcd84a8f934768ebc50f652e4dad9f96cccf0e551f00000000000000", -"service": "00000000000000000000ffffc3b5d340", -"pubKeyOperator": "078b3cecb3e253a1f6f0a0d3e7f792ad6bcde8d2518e6c518fbdfb18c71e6741b5f3a605620dc992a2bac69b4e47b4ca", -"votingAddress": "4RZXT3RKnrBD3NdHYVNKF12YWxuv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "67a332c57c9195e0e336fc878de6aa0c56c81f50dca8acdbde696d9f8cd2f6d9", -"confirmedHash": "bd31f35c5cedbf07c6ffa716f2a3acf8f725ab42af8758740500000000000000", -"service": "00000000000000000000ffff453d6be8", -"pubKeyOperator": "8a27109ac57caf6b510ae5d29e4052fd55cbdb02685d0334dbea3bbb0017d06cc4e6852874d0bffaf1a2262b3c44134d", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "67b509d3689fb1b5a6af30a8d56ad6465c1fd0f542dfc4df6827e77f34b766ef", -"confirmedHash": "1b211235c3a6f158daf32dda315733ccf7505374eb82c1b31200000000000000", -"service": "00000000000000000000ffff52d3199a", -"pubKeyOperator": "90c9bd1a25505e49f23ae45376559461f51c96b10017d961f33c1f49649c212f47c119e972e30be14fceb1dab0d9b3ad", -"votingAddress": "5KMuFvQNXpRWVxuVBSsJ2waDSgs", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "67e3d709b387c484f5a034f1783e2ec31cdfefcd9f48bf738069ec195f6561c6", -"confirmedHash": "46edeee37eb94d6f07a405f8e641a0aa3fd9264ecd3461c01600000000000000", -"service": "00000000000000000000ffffd418652c", -"pubKeyOperator": "09bde6accc506b129fbccb8b9aae25923385defd2ae2e3e77760bb9a41bea488d1b9d097740a8a2995647ec7b13a31f7", -"votingAddress": "3gAfcqcybemZrsFHJj2vTXnkApyG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "67fe749ba99c08cf1bd323a44c12b15d29fc372f839cde391ecd8cc1eae48cae", -"confirmedHash": "c83ce6f8232852a1bc0f0e025d9403340a553862f752e43b0800000000000000", -"service": "00000000000000000000ffff3353ead2", -"pubKeyOperator": "91be3192663fd168496a8111a03feb58197d0c86d90d7d27da09345f77bdf9025aaf8acd0684157a6a9c239d2e370bb8", -"votingAddress": "43TDfYRJiBzA2nEPpdeydU6hU3nK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "68063b25e78cc45fd61dd4c55b47e33f6bbf138c76c61afebe42e2519e1dfb6b", -"confirmedHash": "5be2992154bcdc7fac8efc0d431ae34e077761726bd95f150f00000000000000", -"service": "00000000000000000000ffff51ab02f5", -"pubKeyOperator": "12725a99e571b5d3758b5ca34d9882a1299fb94de9db982cba4408655a86294e2742e4cf9a877b95acfda943fbbf30d8", -"votingAddress": "QMcRrSzfiN65JRupBBQaa2RnAbE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "680ff0949a7855ced334ac6819884357ac996c446ca2d38683835dba0321666d", -"confirmedHash": "90664bc6ebb348ccb0d7337716838040f0f6e194339a667d1300000000000000", -"service": "00000000000000000000ffff5bdbed6c", -"pubKeyOperator": "0774b68ca6b96a5a7cfc310e2a55fce5e5f7861d4964d3cd09649bb0701e55e9cbed651e4c8212e6a78475b071cc74ef", -"votingAddress": "2dHTGKrCmi1dkVVeFya8ZTgubW5n", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "68446554db2eb0ee39fac4eef4a4f7c3445227981c6bca1dced164ae8432fb91", -"confirmedHash": "7c13c75dca54c44f63772fa8385e6756b886361e9e97aada0b00000000000000", -"service": "00000000000000000000ffffb23f798c", -"pubKeyOperator": "0af3061a6cc01178bd8ccfb7fc85303d242ce7270f46a7608c46023df765c8e01cee9cadb4b975a9c60b8c1991f890a8", -"votingAddress": "3g2ZfjRianPo9S8mrKH5de1dtFgM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "684ae97f6bd6441500b6b4d79fce21f393583c59c590ff67aedaa0c32840c44b", -"confirmedHash": "57faad271b8d8b45c343e713c0c35f0391258a69e8588a2d0500000000000000", -"service": "00000000000000000000ffffa8775306", -"pubKeyOperator": "8e964968e6a1eaaa1acf8687bcce43d4b116a395f7cac4338f7fa44c446b5f18aab10b0d342ee3709f79cdb2527f6ad5", -"votingAddress": "2mCCnWys8BAAFtbJbHdA7vqXzTQb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "68528ba4b8f06c9be8cc8677aacd3cb84cf3b505d4ddbf78f8594e1ba8058aee", -"confirmedHash": "7c46ed57b3ae67e83970a3f0fc47e892fa4419cf2f2437630f00000000000000", -"service": "00000000000000000000ffff86d19a26", -"pubKeyOperator": "8a0871ddf98e12c9bc00c50bf1330624a8eb7465adec62aa7a7490eda3d8f6758aaa652ed8bb414a64655393f50d3772", -"votingAddress": "3pTjagn6a79sDPg2g1shijLGFzkt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6852b277a6cf54d5285a4f391583c7ba7ef9f9884eefc2381d0582a76a8b23dd", -"confirmedHash": "5f5128f4a6fcd15d38804078b365265dca1a207e922098901200000000000000", -"service": "00000000000000000000ffff05bdfd78", -"pubKeyOperator": "8ddd053b9e5a3c0353c7512610ac52458c5b8c11f5595c1e3f65814791a91e65a447f7765bf300ede603cde9562d9e99", -"votingAddress": "4A1Rbwi7e8A5JWoLvEyZULL1SS5o", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "687231517c349b28ee124127057df9ce8650db8b66bd11fa774121d9317b2fac", -"confirmedHash": "f73359056beb3c7d570a24aaa7c540bf28c02da6e8992b3b0d00000000000000", -"service": "00000000000000000000ffff05bdfddc", -"pubKeyOperator": "96a21bcf5b87350c9a66473c9fba4b9d9d69864d822499a3a9092b25ef16b3903b419a39f136794bae2955e2bd0079cb", -"votingAddress": "vVKPS47BozWSubJ9C5QfWGRbZnY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "688ee7e8f13ad19ba94e10b08adc2a5d364c7860dd3527529e87384644413d61", -"confirmedHash": "e1c772e91ec80962275560fa2ccf8568e33a71fd86d60f5e0d00000000000000", -"service": "00000000000000000000ffffb23eacbc", -"pubKeyOperator": "8ea809bc1e9e662056c8ba667ed50b87c6e5760edb3961673a2a20830c536a79e8ba6ac29484086db49086ec583e11fc", -"votingAddress": "2qSP7DtXu4bEEsFCRBb8gGCRWwYs", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "68937842cbbb6a89ca4e297c784b42c6cc9d986838be94b31e3bb46047558952", -"confirmedHash": "1f50fbfac0aee86ba0eb7e62b961cf8118424a358b15883d0300000000000000", -"service": "00000000000000000000ffff03e9a0b1", -"pubKeyOperator": "8fe4460916201f8a2714d16f518085567ca2c2fa6176bb6fb2132f7324cf3e808e558f8af99c34ebb5fe71673f9c6bd3", -"votingAddress": "3Ckv17Yd6f4MsiD6YqG55B8WeSL9", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "68a21d8478560ef5974d8b741122048d088cb7f5e35cbdea216ede8e564ae09d", -"confirmedHash": "022af49a799b22889f1efde8bdb2806eef331922f7e201341d00000000000000", -"service": "00000000000000000000ffff2d4c7410", -"pubKeyOperator": "8aab605d32ba63fddedd6270a22578c742161150614885d8683c482241d475eb35e3ccc8c09d94ae455c1abee9a323f1", -"votingAddress": "3235G613GnAHi89XU543KeEdCa1G", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "68a5c9cb1008bea274a7451c85c790f0c6456297f74f0f6fc9858fc25e8aa1f7", -"confirmedHash": "e6a44b335d556552a28a82e936103f2917af881360a08a9a1300000000000000", -"service": "00000000000000000000ffffc2875ac8", -"pubKeyOperator": "040e691eda59ec5458e7156b2d9c1a6875bb52b2580eaa79adc56fe03693a012d5e2668ea9ec177d40b2afe920454d1d", -"votingAddress": "2on8qmQdxEYCCfQRmSnWia9F579n", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "68af8c49da4ebe117166771a32b2ddac8c7cdc6fcfc1590a4876026fa383a685", -"confirmedHash": "9c799fcff3f7d095a4a075bbc7f60eca9eb0b1a78a0d1e4d2a00000000000000", -"service": "00000000000000000000ffff33442f88", -"pubKeyOperator": "8b9b8da833ac8f33a25e13a3694a7aa7b3f2e951983f9cea09cd9d902416dc9cfe3c205110090ce7b1fd64051ed4ebc9", -"votingAddress": "4DTtWj2FkoW76nShfy6HkydekZkh", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "68b6ce2f4295760552a60b66b0eded8b71c977c29514c520e14fd251ffaa85fe", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff968896ae", -"pubKeyOperator": "08cfdeef1a4bc730e9ae2c2c537572442ce123df1b608b6fbaf0c85fc8c854e2d522052dd1508627c94a54227dd06187", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "68da6fc99db223f8b67510ed136b37699df7fd266e0e032ddee2e90f65bde502", -"confirmedHash": "6ec75e5b72e8d65dcb050522b7b0e917fc0b20d397a37bce1000000000000000", -"service": "00000000000000000000ffff2cf1652f", -"pubKeyOperator": "02ebbfcd0c99398cdb2c33019056418418b60dd18d5be12e23a66e0a4674655d271e107ede8727973a830375657700f1", -"votingAddress": "2zmZbWkWyvnFeZpq5Qs5rc7EMMh3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "68db95cc62ca4c1946d6a8d2722634ddd8ef80ab44caa9fd6fd993320fe8a903", -"confirmedHash": "f279fcd2dec72085547622188a21d7ccbc972257a74cc4173c00000000000000", -"service": "00000000000000000000ffff2d4c5e9c", -"pubKeyOperator": "07ccd40d342520f61e88fa75fbf2dcdfc522117c79ff174e903e81ef68bc712b137ee8613415bb7ee4ebfc55b2b3552d", -"votingAddress": "4PyBwX8XLfeHFsCGsZrmVGYLXFSN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "68e18490e3b16d0152baaa129bfc1240fc22fcf245ef9a1fe5e8885f2c6b3b43", -"confirmedHash": "c58971671ff2e5b2629c64cf449fb208b7215008b0a2aede0a00000000000000", -"service": "00000000000000000000ffff52d3194c", -"pubKeyOperator": "16568919752dc933c2d29f91e6ac476d2c2f5c7b48891f32ef2c2f5746dfb3393b5394c24ab4f4cde44c5b388509d849", -"votingAddress": "3YPEUZT4gfv5v6cbznHSyNBU7JNV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "691817c8f9a11b151a1945229488d1c3eb5252f637e0759e1468aa6261c2d8be", -"confirmedHash": "a635fac4fcc7c553d6cd0669946f0f67c9df69f02882d4d50700000000000000", -"service": "00000000000000000000ffff5fd8542c", -"pubKeyOperator": "1939ccb4f0796aa234a1f41422fd1fb1b5686628e00bce0fccb15cf643d050babe1761c2151b663b0ab1e4db9bf08cdb", -"votingAddress": "347UoQmVhBKQqx8Kk1TcEAZzjDy3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "69210afd87786a439e142022101d1877fc0ace9c692614a464332711e686a325", -"confirmedHash": "431eb049710a6f2427aee9eff2c4796cd5bbc2c759748eef0b00000000000000", -"service": "00000000000000000000ffffd41867ad", -"pubKeyOperator": "0d613c7614addad529c356c2da4284bc5214b944571ac1019c0aacd5a62c25b63f65b25797376d83d8a4c63c783f626a", -"votingAddress": "2ZWyUgqFKnT12T2NVie9nmp88dPD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "693c5af9002ef89e454649023a804404f94c1b4c2b5de87566b7b5dd1ba5a7a0", -"confirmedHash": "8e97b5dbfaabf460a957bcf17aa08673d1bb4108cb3684922900000000000000", -"service": "00000000000000000000ffff6bbf3d6d", -"pubKeyOperator": "80257d33f8594714f634869effe7d3f6d8c45121df4f54aba7549fca8220317fdef692229b0c319d2508c66411fbec98", -"votingAddress": "6cxqcgSxBoZKnsVhFBQFJCrLWb6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6945abbdfc37d383dd97da84a59db0ca8b9ab94d999eb9e5fbcd8c7588cf40f7", -"confirmedHash": "14bb828d7b93a516bee79c2a5880ef8d9f61d46c3c81d0590e00000000000000", -"service": "00000000000000000000ffffa516eebd", -"pubKeyOperator": "87f2dde33b6e1b95f5cdf54e4b515256b592b3c102ef5a4f3247d0fa188d656edc17118a991d5310fe2b6b21cc4fca4f", -"votingAddress": "3TFSAWt26VAvJWyaF6v6FQVMuTtK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "695cd376989e9e09197b0ca1517e2220684991b3bb342d8af93fc622d9e988de", -"confirmedHash": "d270dadbec554c402e3431a8209591971b1dae1351d857f30700000000000000", -"service": "00000000000000000000ffffb23eab39", -"pubKeyOperator": "16154ece2ef98c16a49cbfda2071ac663ec2cd9989505a4530dda0c2b338d2c02cbfb2200b72afbf1838baa2d6c0d582", -"votingAddress": "4Ut9RT9YVoR8AiocYw3cDh2gnNS9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6981fbaac8bf56a6203e92da512c0b344fa4abf0695b2a256bbd1118f2447821", -"confirmedHash": "7b0b01497bb3943e3ecada5060932d0a0cce6546346c9db01900000000000000", -"service": "00000000000000000000ffffb23febc7", -"pubKeyOperator": "91728b730fb7ab123bbc73fbdab23f1522033e5935b93c27bdb99dca2170e63617e4ef1e005b714a91019f4b9cc9af6d", -"votingAddress": "4A8HngCt4AGWes5EyKMqso7qirAe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "69ad3a2babf32242b7df4ebd5e56ee6f56e88f27fc0ff80c6f2a7d0bab694c5a", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff0fdea466", -"pubKeyOperator": "990731f9ac28618bedae021edd7088ae11e154027fe81095b4cbe324aeb7a49867234c6d387a7346a422c83313880be8", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "69b0adde6b886f06d51b8f1e8347211fa461cce8cd0e02edc269d623e96f6987", -"confirmedHash": "945ebe52c628a538785c41597b1c847b27b13bcaad74ffb00700000000000000", -"service": "00000000000000000000ffffa75646fb", -"pubKeyOperator": "073177c2e868234909c28709d8fd295bc8ed941aa5e4d25a77374369bc11bb5ef7b71ab6eea526e68e2f7a2ccf577228", -"votingAddress": "4Kp3JTkiceQSMze6FKSE5qzUwGmh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "69c301a7f6ca1ebb1aea91db7c99c14c176fce2ecdd85870a269f9ad34109905", -"confirmedHash": "245d2aa1f746068da867c375cda4d963bb09e0fd9621fb752e00000000000000", -"service": "00000000000000000000ffff6deb466b", -"pubKeyOperator": "8d56766dd40b24f0b4c9a19e18ff322057dbf25a9ed354fb8ae5853372bfad7086772ee6ae546239b33e7e8f78c8878c", -"votingAddress": "8bodqEMwS1vgQDVtk23Fsb4qub6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "69c738cda53fab943e5a9e714a6f8a3ef5e795eb182b7570f0ac29b47e6d7172", -"confirmedHash": "a6deb021d8cac8cb9005cc530686fa7868f8c0c0db28ddc22b00000000000000", -"service": "00000000000000000000ffff52d31926", -"pubKeyOperator": "99aa464e4fddfd1174e3048acc5be97251539b4289d6f42582ca85866fd5c71a9292577eb4ee534459dbd147115a4a8d", -"votingAddress": "wAPAxEvumvuFQZwc2XN2rLdcyn1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "69e4a0e3807b6f99bb699700ce5334ecc3ba158c2d48ed9b8560822f1f239ed0", -"confirmedHash": "783fc6a233e0854653c8c3a22cbd0188b6cc25063cdabe750700000000000000", -"service": "00000000000000000000ffff52d3191d", -"pubKeyOperator": "8bc6ba8268d61c6799652a96e4649c66b3df17a666ec2aac5825f73c7792674784006994ca87b497f6c8cc0a08675161", -"votingAddress": "Ns1zV4gEocJiRWvcCHGkLHHdZHJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6a06c9a633c33353edf73f23c484c3579cf64584b180c4df572e6a2d2e58ce15", -"confirmedHash": "d4d6cabead7ddbfd03c09cb5d38f89bfe8fcc4be61b955d71c00000000000000", -"service": "00000000000000000000ffff2d209ea4", -"pubKeyOperator": "09dfe6992b73f1fe8e0a47077996e731ed1abe3c40be21eb68b8fc42eac6b3fc088ccf0a61d45ec6c041ca3cf9d5d90a", -"votingAddress": "2t8AurggsC1ZQ6KQKfoaqMrQ36u4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6a0ade75f691838503ea4dfe12229c6440926effee5e92331d8e78deb67d1861", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffffc17a9f8f", -"pubKeyOperator": "08432040c2327d48745860a5941208ac19d29c6e3ade37e47b3f26f2967bca708a2fd554cd66f8291de5bf2956c6a0df", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6a0cd8097c156f0a77d9ebeda052aa36e02cdf6c9334270bfcac98007ce76ef4", -"confirmedHash": "693720c57ca0772b4cddc3efa1db6866553d2827cfbbe9480700000000000000", -"service": "00000000000000000000ffffa516ce29", -"pubKeyOperator": "986dd89ef653717cac967efd74380fc593f6d6f28cf4386a778e5e0991a398a2e2fe15fde624fce157c551f400402b70", -"votingAddress": "3CTXgn9DbSfMBfUtJyVGXmL7MwVP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6a0ede67cf4e31a99f3fabdffc8d09940bc0337a23c5dc9cfa4a9440a4a0ab17", -"confirmedHash": "34e19b60aca9eb0e7815503de513ea081442c6fa6415823b0600000000000000", -"service": "00000000000000000000ffff58630b00", -"pubKeyOperator": "02f0d44432d1209e8ca102d33a900e89b023d0b934c25c8094f1e8c31f2815c73aec56a820d37dea31b2337433712c2e", -"votingAddress": "3AgQzHVD3muY7KGfSEpzrfanoL9U", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6a258ca6006c13c0b4ffebc75d97578ead869237e2c5e95c5a9b84af4b1b495b", -"confirmedHash": "310c73e95714516b464d28b024c61acff9b53c33d72886df0700000000000000", -"service": "00000000000000000000ffffb23e1fe8", -"pubKeyOperator": "033fdbaf1708c5d22738dd86873b0ae0add9eac211ab716b3185bf29dd043f66ea9bce85615413ece7511fd3a0a52b51", -"votingAddress": "2nhphg6KDwyZvjf9K6TZmjK6N1t5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6a3af9896ac99b064c306544789be0c364fd06853a95662bfef96903eab23fdf", -"confirmedHash": "8459ab8181bd64c8939a4f78325484ba9d083e30df317b441c00000000000000", -"service": "00000000000000000000ffff51470da5", -"pubKeyOperator": "8cbd9f9bc445cb6ef8be1ca9840c9275313a518c0af852e4b7289aa7a03a681a7f50dd540f6f1501c3cf8134f0460461", -"votingAddress": "4UgpaXsua8FUA7buDgwmzYU9JSGF", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6a42dc07e555aff41dddf8c6cc9fdcbd6dc7c4e4cc75848be91e70496c428915", -"confirmedHash": "f142219d724bdfab00024f3cbed54a68a5d2e022ccb528120500000000000000", -"service": "00000000000000000000ffff55d1f13e", -"pubKeyOperator": "98a60127616c0009ed3526cbbeede28aef5e99a544a98598a924f86677860a6c26fe9016a1d761006e0415f5130dafc4", -"votingAddress": "3fvWmkgYsXtM4T1AYyGBNUnrwaJk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6a44e0fd3e4d4c2ec452ea57f041159f26edc3a019a2f125732fdcda16b67552", -"confirmedHash": "9cf3b5cdfb42230344745a4670ccc70a9a548444e711004a0400000000000000", -"service": "00000000000000000000ffffc28753bd", -"pubKeyOperator": "916706f1a80232c0f81c904cb29037e1803d77e8d18520b6986dcd0bceb18dcdf8c7fad9068e8c2e4326a530ff879c0b", -"votingAddress": "3mjTH4mYH9aMtc5N9H88YejZJcw6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6a70e14d8b20eee6ead6f7383e8729defa39856abf1655c0d3d594e0bb3243d3", -"confirmedHash": "26ea4ff3c2b6bc1d8f4899c75bec62c6460aa7cef00b463c0b00000000000000", -"service": "00000000000000000000ffff2d4dae3c", -"pubKeyOperator": "97fdd7854592b486f9076e6dd927317d7bb95c12cfea1667a31360474fed331915f286946c4a664dffe007cd1b779d17", -"votingAddress": "4KyttoL3VzfRRZNfi3vquF4BEy8j", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6a71cf35ce9926ce932af217f2adfe2fbbd90b62b159d1530f52ce1bc99b0b68", -"confirmedHash": "4d0632573d258c4528713a8b662dad1d972be056bab0b5180b00000000000000", -"service": "00000000000000000000ffff2e04a276", -"pubKeyOperator": "994c10c2b3fe48e78426d11fd7e03162e7d69a55a2e09c28350b0f2c54c4719eca03cb0f761f96aea67ef7e20308d9ef", -"votingAddress": "45CdhnDZoibRYK9YnCTaoQUB3nZx", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6a8c07b2bbd6dafc267f61734ce28e8f314cec02bf92cafbba7c980f174207bd", -"confirmedHash": "76093ea374c5a831a7a84b2b5a8fb2628541cee7895e088e0a00000000000000", -"service": "00000000000000000000ffff67a05fe1", -"pubKeyOperator": "8ed5c4bd85ac9faaa2b8a8f005c7182fd147456d00b32c72cf4de50cfc695beaeb02b07ffe8f82d07092a4cff13eacc2", -"votingAddress": "2F7QF4f2wntH8UhYijexgFzPbSPa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6aaf5c72fc4bc2292b3bdf92ddbec6fe1d012827ac0dc76785fe5ed828a7012d", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b06b", -"pubKeyOperator": "0c5fd6a7292351092d719632d6d6c00cadd2c69e73ceac3df9b0a7746319d7f9a41e6c1417e2c7c9b126b6220b52acf8", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6ab0bb6290e526fbe1291bfa0a0a8db829937ce68f48195494d2c4ba668ab8c8", -"confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", -"service": "00000000000000000000ffff59280b5d", -"pubKeyOperator": "0b45d48101cff48b30639f3a7925df8d350e704d34117836ef92b1b314aab0330496ae481983294d6d064bc2682894a2", -"votingAddress": "3Zf2rTYEyiinXqFHvxQRPpgSo44Y", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6abbf0597a33fa0473dc86c26ffda7d0d9d55fc7b707a42819d24e214a96efe5", -"confirmedHash": "0b1e5b8b6bcc735291d0e1e280d15435833406a6f35ed5ab0900000000000000", -"service": "00000000000000000000ffff2d2072ec", -"pubKeyOperator": "00619ee97cdb2c47ead9f0a311a82ef6b25aa7d84e7da872d164ab0cac0b87d6235e30305d5f5cd00de72eb3571f8729", -"votingAddress": "4H7QtMtwWVcu9EsAbjBe3LpcWgGw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6ac9ef2fdec5ce00b361bc8e8d5c7f71eb6cd34ae36ff3f9f4b2e05513a24b56", -"confirmedHash": "833c825648b6fd05affb43296a44f07843188c10dbeb77770e00000000000000", -"service": "00000000000000000000ffff87b50fec", -"pubKeyOperator": "16457be150622cc9fc4058faaf96e1207693f05b2498197804355c7c7bb426b9dc5786392d6265f3b406d5567d374227", -"votingAddress": "2w7ozffMnfte2aVf3McJJ4F7qXRc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6acadd599ea315d20ac2d9d98627b772e2b9b4fab214c98e5d7422bfcfa83443", -"confirmedHash": "b2c65622a278328dec2cbb46e3d3215181ad1986c6b6688f0200000000000000", -"service": "00000000000000000000ffff8e5d2604", -"pubKeyOperator": "827b37a38091c5a6a2c4d338389e7591fbb36c14b3fb5bd245fe4783f32947e8764adb58824631c8c52c50ba3bab50d1", -"votingAddress": "3ATz463tuireTrPw3JUzTcobGXfT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6acaf0a24ecfe53c0959f85b8fe46948a88e57e2bcaaa82c175cf16475bcd962", -"confirmedHash": "3961dfafd0cade31fd364e56c124da7272f3e451186353aa2700000000000000", -"service": "00000000000000000000ffff80c71363", -"pubKeyOperator": "19e73d954d34567950b5d35f3e28f52a395d69dd34cbfaa9c0d8d51f6c2a749bba5597b9bb6b9c40291b6394578f6636", -"votingAddress": "NQgXntiAhQWCY2wPynXuvJ4MniE", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "6add8c3b259259416c89196e1f4b236727826d9c8d0bc843b1ad1714f006de84", -"confirmedHash": "bfa79b0e7e94d9cb04aa82a74f7083b6cd1227ed40db86501400000000000000", -"service": "00000000000000000000ffff80c72686", -"pubKeyOperator": "0e11c28093fb02ed98ac4df3944b2b25102c3b8ce85e6908edceda4abc558ce4ab76b773776d5889f2dd8cd43b2a1d24", -"votingAddress": "3bUDe9DcaVVjt8HVyWfF9Vn8QEfV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6aeaa874d8cad16a404136df7c2f9179d40348bc846a1a105f0c3026c4191062", -"confirmedHash": "2912e274a985d65dbda317c83c86d3d5da84a6ecc837b1190300000000000000", -"service": "00000000000000000000ffff14c7bbb7", -"pubKeyOperator": "915f355ad71bd99c646df3e62662e5071750971f91e771ddf2438bd4579dbdaba80358b9f0566632d6c8c495696bf932", -"votingAddress": "4CH5Ccv6wuXQMHY9aoSv5fnrMAmi", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6b5ca8906107419cc137b0336ef71f1adbb1ad2de71e693c7601a8f619daa6d0", -"confirmedHash": "151f056d849b7ffe0a485bddcb906437178a7baa7dc3afa71000000000000000", -"service": "00000000000000000000ffff0feb3dc4", -"pubKeyOperator": "93a86e5817b5c38f880be037390261fa232c04594dd0343a78ae510b6cd9cf44e3ac6c94d82cf8cca989a3bbc50f742a", -"votingAddress": "45JisGvRFDzSDYVHnXiLoBbrGqit", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6b61ff9178ba13c019e9f92e99fe31a3efcc93ec1451f9c99a54522aa134dcb9", -"confirmedHash": "1ad56fb945ed05f99bf30c03f70b6d8ff9002f8c40533b7e2100000000000000", -"service": "00000000000000000000ffffa45cf5da", -"pubKeyOperator": "857158644d4a92e5fa66ecefd68172759060d7ded97352469a85bc9e7f3ad1870ef26653eac8303d25dfd6e6d9c6d41e", -"votingAddress": "3LjiiR4LxhckhdoJyqhZTAyFy5Bh", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6b67a330e5ee76dc4652ce99ceec97194fc806646626005aa0bcf2143009f9f6", -"confirmedHash": "fec7df99100810bcf607e4b9fa33a610dc73666cf2f57b4c1400000000000000", -"service": "00000000000000000000ffff55d1f15c", -"pubKeyOperator": "94262164e7e0d0adca2cc1e2d2c17b8aa5027c37d4e1a853fa16f884fd1bac2544459d4084716e8981be6a40c9017364", -"votingAddress": "2XFmcDctZgaE4VHgU56deEx25Sk6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6b8423d7b15e651bf1854149c63384dc26b9c2de02370ad57e5c832605b24a1a", -"confirmedHash": "a00a795b305289dbfeeb8c945c0d7e7feb84270b1865a5570a00000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "4U1evmiitWvFEobDHkTCRjYzBrUQ", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6b9bb6f912c39e21c4885b5a022309137d8fc74695b04fa1f430217d41b9a2d3", -"confirmedHash": "be07ee55e45e7ac1585c923f114ec777b10b9fbbd76231c40c00000000000000", -"service": "00000000000000000000ffff55d1f16f", -"pubKeyOperator": "8c120589e88547cacde9bcbc81d3cdd328aa3a6dfe99376ca7ce958faa5ecc39da21b79c72750a14d20f9f0950a814e2", -"votingAddress": "3mhgGQuwnPKLgpngkTkRPRbM8X3s", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6ba04fddc971d5c7efdc39fe65a338682b56856dcc469557e0997e472d449693", -"confirmedHash": "90708d9f21f50603858b126267e6f1a36fb907d4e96ffac10500000000000000", -"service": "00000000000000000000ffff2e04a26c", -"pubKeyOperator": "1774fd2b1c9dc5ffb09f07bd05a90233be64e3bb17f218f26704322a1ac273d05b3e4e2a020baeee7f54a8249a3b4fa1", -"votingAddress": "2d3SQmCQ6H4zsjFBfHJJSp6uYUEV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6ba91e3f30bb9552bd8ce4eb737ffb7952ca51a8ca5514153a27fd1a2772eacf", -"confirmedHash": "049a1b9c525a3c6f37cb5c45d88e0b3eb2223ae38dc008340c00000000000000", -"service": "00000000000000000000ffffae8a1819", -"pubKeyOperator": "02413e750846394205583ac8545c9e0d4e639e8bf4570d9a29eed1be09c311e8cabe7d79e7d08bed43c3c8ec03a0543f", -"votingAddress": "451uxnuRMMPZUpAtxv2ZVU1kU4qn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6bab1f2f45e65413ea756afa2d8157824bb6b9e9c8dace23216b6722b567958f", -"confirmedHash": "5d2aef7e8adfea5ecf416a03b38260bf0b686a4470bee5e12300000000000000", -"service": "00000000000000000000ffff52d31538", -"pubKeyOperator": "0f00f5c4d7e6e37256ae539b189d0dc8f5c2954267a97a2a86b0c45df9971e2e1daed83b3081874e4a505c67773c2816", -"votingAddress": "3psnCi2c9BEXdsd2Q6TkreuYzcq3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6bb813bfec163619745e98ef075c85c0c5f7d667de67152b955b32b6b50d84c6", -"confirmedHash": "a85fca9079c952dd736505bcd851a91aad44499894f4f1fe2800000000000000", -"service": "00000000000000000000ffff340e5c8c", -"pubKeyOperator": "19ad2818533623a9d5c5985f78128ca2b6f2d552a87677de0a9e0693fb2334b88fa11fdf779fa4bfc120a77577619962", -"votingAddress": "Czvn1pq25SXZdhM9nD6WaumfXCa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6bbc1778a14e5674ea696223e78d6c994ae8fc9b3d5d2a76cf268a882bacc222", -"confirmedHash": "a90d13b04a5a55f8f0c1c6e2a0030edc649a555a2550fe320100000000000000", -"service": "00000000000000000000ffff95f83b32", -"pubKeyOperator": "995d6e73e9247c8300049b052fb5aff52dabdb9663618cc035dc9d61913895eff7b277d339b245af121e8abdbde2a707", -"votingAddress": "3ynENntc1xPzCVV3yuTrtLg86hiW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6bc153e16c0ed0db8f5a41d9a37ad73412b66dfb7766c443f49d5c9b85597f64", -"confirmedHash": "34b4e053165dfb24cacd599aad6ca3a7fe25cd1f11279fa71d00000000000000", -"service": "00000000000000000000ffff68f8f2c6", -"pubKeyOperator": "95be624f32605164ec295964cc5ae5ccddf620dffeccc4950f817fd0e6d9fee8bce225759115210091d7e01e5c8c8e90", -"votingAddress": "3tBPnWoAqMJd3krMks2jGiJHqHLL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6bed36c1fc731cf56fbc912df88a0485f1690b39909efc98fae8396567304fd8", -"confirmedHash": "c804e578e02f62b36bdf51ec60774c43ee452f68dbfb04191100000000000000", -"service": "00000000000000000000ffff44b707f7", -"pubKeyOperator": "149f04b9b09c67ae7943ec4be07467cf248fa789ef199187f0f5a7603e61d6be7106504c643b9878b23a88e142eb0bb6", -"votingAddress": "3Ndk1c8Y1zPY1gDSMQ5gqQwPwGxj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6bef280f98f9931fa0d895e3316110595180b9121ada7536c96e71228a573d43", -"confirmedHash": "2e115147995347c6126d77ddf798968424ff7d94232e19251900000000000000", -"service": "00000000000000000000ffff2d5e3ae1", -"pubKeyOperator": "994da6e7a26a96a36f61c55d3eb47093c7f3d02c008862de637a58ca02d73360c6cc4c1a9f8f76f65a6357353e3466fa", -"votingAddress": "2kFB5P6UzL8b7KNrMC7Yo5z3aQvX", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6bf6b6e7d629037cf7982eae2ffd37ec55fa176be859959b21a13adab5d0bb11", -"confirmedHash": "c1ce2a44cbfe6bfad46f7935870599a0834ff20bdfce76970d00000000000000", -"service": "00000000000000000000ffff55d1f11d", -"pubKeyOperator": "087f31a9ce68a9de738e3025828c35a137473c209c163c46c40d0188e6a9e1a243ee343ece9a9f1bce18d586266f662d", -"votingAddress": "3iD34yiWXLYmZGCFY3cMBp6FfmpP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6c1324b3dcd67770a7aa28b094f87f5a843f365f43e944fc56de99c02fb36418", -"confirmedHash": "54245fed9148aca16f542f50528b7fdbd879c7cfece81edb1d00000000000000", -"service": "00000000000000000000ffff86d1e383", -"pubKeyOperator": "84bc8f3035fb990da87576645130944ef0a5124eb5a68844b145ed35f1819c99e0ed121e4ced2c3328c55851145a2dd4", -"votingAddress": "2e5FmJhseT4jBs6PJns5a5mmio9b", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6c22084d4e644d3a22a200e056045147c09896b8da678199ea184ba59679235c", -"confirmedHash": "e0af7137934c27ae3fc632d098ab854afdf1a844fb7db3941d00000000000000", -"service": "00000000000000000000ffffa45cf940", -"pubKeyOperator": "88738969075cb51b6cd31d5ca494f62f0cdeb5e2473a60b54101fc24a72b4f3fcce8f4edced23841ebb342187c8bab0c", -"votingAddress": "2f769KL5NLx3eoWGhdxqo96g1j5e", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "6c491118f2c40f9d3fd59213708867ddd09f7c320fdcbf988ab036044aa1dce8", -"confirmedHash": "4f47d5820812006c18a4f28d5e17f4992ccc82850bf319b10b00000000000000", -"service": "00000000000000000000ffff2e658eb5", -"pubKeyOperator": "0b7d9eb0b24edc9ded01631c88751da9b1844e04e821756ea07a49582e61577568db22cfe43fa51163000ceb610947fb", -"votingAddress": "YMbXpU2NtCYPamCFiWdjd979MFj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6c4fd7eb02d8a99351e47c1a20ad37182ba4491bc375f6346d1c85804e88b7e2", -"confirmedHash": "36073487dc3e0fdf1b318eb15c89a2ea335fbbafb0cf92ac0500000000000000", -"service": "00000000000000000000ffffa45aa4fe", -"pubKeyOperator": "151aa1488f8afd24e2a999c1cb2eabe39bb09a8f006dcf486702b3a07e4810724711c2a39ee356ab64db2e7016705b57", -"votingAddress": "33JkE4JK6pKtbWekw6CZvp2dWPVR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6c5052d17baf59551c6b4964d87440b66ac673fce4fb9a6528cc00618ada9b6d", -"confirmedHash": "1de8d7c8bbe698d9db5afd58109692a1a83a0c5d6df508f71a00000000000000", -"service": "00000000000000000000ffff505588f8", -"pubKeyOperator": "99ef849f6a67d3e46234c591abf681c11c18839bc6c9d197cad071168d75397cc51eb6f9fb0a655929567e2818b1fa71", -"votingAddress": "2LqfU1DreWeedyPT3ioqmVJBGfcc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6c725a233dad2bafae8a47ad3dd60d69379108ef84f23674b81703af001d3d2b", -"confirmedHash": "e458571e9663789965c4a8ea410d5fb4625e18d37e4114f90c00000000000000", -"service": "00000000000000000000ffff2e65cc9d", -"pubKeyOperator": "198f6ea9b19fcc972f2c8abcff89410ac8fd829d971d9647743f6b464d7e66a9c4c35db9ff07523fee6e408b8a391ad6", -"votingAddress": "2DY6pYr3cFAJMNjwxAwRpzZqBXqJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6c8c17a2787b15793b9eecbccdc69991dadceac693b0d58a9f51a47abf057447", -"confirmedHash": "e17e82f9f7316c3b56df30101d7feef8e8a1f3c1cc622c761000000000000000", -"service": "00000000000000000000ffffbc28e70e", -"pubKeyOperator": "09813e2f13ab9028effac9a07ac9bddcc2de431941acef67aa68878d95cfba49415b43e20ea76b031a49362219e2cf3b", -"votingAddress": "kbC5yAufBXWbsgyrrjcAJmUUDSY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6c8fd279b395507673965c1f4ddfa33ec8df2bee3152b87d079ba95564e84740", -"confirmedHash": "3b1f89f7978fe02771144efa76b4453ff9168f091631055e2200000000000000", -"service": "00000000000000000000ffffc2c37423", -"pubKeyOperator": "08ad73bdf32eee8335d0e960e68c924a14c04cd13a07f61f8fd878d4b0c87bc560a239af342c50416d1e0bded2eff300", -"votingAddress": "2ts1eAKfifUMzhiZcsjwrZdAQp2k", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "6ca6c258dff799a3b5315c8bd75e93b1c1cc6eff2b88d25c53b874383a6c112b", -"confirmedHash": "73ba318388d425cab96a72a3a1bdfefa9f663da66d9946a30a00000000000000", -"service": "00000000000000000000ffff14cbf844", -"pubKeyOperator": "0e7da123321a4458b0e70576f9abb6347e704e7f3faed1c58f11d3ed03b3522f9e4cad9ce18867129ee335313aa83abd", -"votingAddress": "2XNS8rKFL45uNXJbZ3EeZW2YFKsm", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6cbe2bf4495e4a188d30a6891648366dff98328e81b9d390c80c8e3fe555cc31", -"confirmedHash": "b36ffaff2bce54c8b1413dd9649b87fb382c9f6b0164502f0e00000000000000", -"service": "00000000000000000000ffff2d3f7229", -"pubKeyOperator": "172c645665f6742c2226cc815a2c735908e0b20f949f42f7a6713b6613e17250242f6a6cd8d75ed46f335e8ee6abb22d", -"votingAddress": "2pU2agePYgJgKLptjBa1FTgstfKU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6cca0b5a3b2986e9d96688c87f46da96a3a78520067007ffe57322cb73c53edb", -"confirmedHash": "a773d7618d3bac7c35da6a8f36102b48f9b154b866d311620b00000000000000", -"service": "00000000000000000000ffff5fd8e665", -"pubKeyOperator": "90056a306be3308a2a92623f1dbe6241f316c7c4a5c5be2461b0bb7eaaaa5f20218a4683fcd01d26340a42d9a69f62ae", -"votingAddress": "cCvCLSLxKJhEyND912eWyt4MiE3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6cdd62b5e1f6fb86a6fe59635469546d8b6436c5f38c95fbc7b9ce82903d74cf", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0ad", -"pubKeyOperator": "958f335c5dd5d0f59362a04c16c31f8caf717930d3eda1c13971b05e26fe8c51713532f9e37f2d35c271e94bdf9e0734", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6ce6c6edd904510d43c5bcf35004a5bc6a411300ddcd9314266a909094b2b7d5", -"confirmedHash": "e95d32902bc5559381ffc9210091fb6a50cac040627e8c660d00000000000000", -"service": "00000000000000000000ffff2e1ebdbc", -"pubKeyOperator": "9447d4217603ef9879fa30427deaabe4b6d41ca6f3ea1e57e48e948f4c540e75263a4fa9e38f80f4d49cab5ba39df78a", -"votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6d1185c4df4c5d856fd90d2979d8f2b1a2fbcc0a0eb82cda76d09ab24e427b85", -"confirmedHash": "73d9aa935f7e609099a422e0a0cc206f9136b8e6aa9fe11c2400000000000000", -"service": "00000000000000000000ffff5f55209b", -"pubKeyOperator": "8c981426a2daea29fc4fedb5923b58180a6cd323fce27661a8cccc943fc72e508cbcf36a9361ef59b8fe9afd49a68259", -"votingAddress": "3c3nTEnKeFL6YaDVfueebhMPLnxd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6d2a3078291c5d70f733363609aeeb29739a4fce1ac3f9db2d1c03d1c62c6f08", -"confirmedHash": "e607e98d6e1b3d2695b3d4e818ba6c911bd2a576a86e4f360c00000000000000", -"service": "00000000000000000000ffff86d1c71a", -"pubKeyOperator": "9574af1c06fdf7d7c3335fffff4112c1f7d8acfdf5a7b9319dda729baed98c2e1d634fded3bbd6465c959efe98e3402a", -"votingAddress": "cG9sHTkwLjLLa5GRgnsBpyZnr3T", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "6d2b0440292a88169576ee44b063ff196153e0632260a47141898d5447779627", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9e656af1", -"pubKeyOperator": "885d1b78dd4086a4baa0d55f336cf641e85908110367e2c2acef960aa760b45b7f3cf2396fc9a3177244fd64258371bb", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6d379c567a68ee29e69b0d895f5e2548311fa29d5dcdaf863309bd8a48e67ad8", -"confirmedHash": "2cc96bac6eb742c2dabaf7978fc807414485cf5e03ddf97c1d00000000000000", -"service": "00000000000000000000ffff95388d21", -"pubKeyOperator": "8e99e0a433ae044c7b2bde74c2ebb460c536d69e2d8bb287370d7dfc52d78f5147935f02a2209e3d15adb0364ea969fe", -"votingAddress": "5f65rjhgfhkLu3koRUnWMkz4B3w", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6d4476e1956cabb0331ead7baea1fba9e347aefe10c27681aaee1f3702af59c1", -"confirmedHash": "e45f49bf01c8b278168678fa6095506edc09937ad19bad2c0c00000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "Aqv6wsnjE1GrJ2BoJKjaVnDmok2", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6d4b0978f9ee5fabd86273702df4531b25ffcf00a961649b23c58d975ae8ba6d", -"confirmedHash": "f95ab6f315951ac74cd5cb30d83693c0d18790677468e2c50500000000000000", -"service": "00000000000000000000ffff2d4c9b37", -"pubKeyOperator": "911d5f45e4451d1fc4ff2b1d818ddf52015f87e6c1ea147398ca75a54dc1e3f7b76e1aec8332a82bf21c8dd832fbda68", -"votingAddress": "2esRcXA5LNrwNaV8Wn3XC5x18r4w", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6d52e155bc1cab72b816521b2f2454b1641bb5b93cd67d2d5b48a8354a736b7a", -"confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", -"service": "00000000000000000000ffff52d319ac", -"pubKeyOperator": "11ef5edb5e0c995b98590623555b9521a99085f335be167299564957dda5ba5a8cb49d2dc436e4b4ce7effd05677b7d0", -"votingAddress": "3E1NYN5gzXafs9g5qiC8cva8NdjC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6d61c1ef75aaaef1818d4cecfe04e9f8f085c128fa718ae4c978286eab7400b6", -"confirmedHash": "61b426b48193da58d341da801e065d5e4ce4393b1a4a3ef90b00000000000000", -"service": "00000000000000000000ffffb23e7197", -"pubKeyOperator": "86ed5b93457af5a8889d73338a5972229d28ea588cce7021822d7fac321b3f787096409b4dc8f2f1e29ed24fb878fb86", -"votingAddress": "DCnvwKVpLAHxbjHgNEEGmnCEpp4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6d64a112b210e859213e3a38340e1c2d061afdc4ba6c1aee724ecee035e1f848", -"confirmedHash": "9ae261172387333462a7fcd93cbd61d91dae8ab426ec6e8b0d00000000000000", -"service": "00000000000000000000ffffb23eba17", -"pubKeyOperator": "0dfee4b7d411b998155923ea5eedbace2c85d2d4a7088b6b2ddcd722a2d9eddc11133c2ec87ff89d46d3607a27dc9a88", -"votingAddress": "4U7opxxkKifgRWLnanqMrDkVzr6Y", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6d6b5a64374b288901f7f088dadb2f34e0276436b99e7c3602e61f9174167241", -"confirmedHash": "f11877f5f49b003550ebd4da3c8d9c81a9ab3a3a95b7c9770400000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "3T4y7sR64QmJXSFecDqtgfJPHkiH", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6d879aaf764e028a14002277cb696716de3174b163f67864226863515b491072", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b05d", -"pubKeyOperator": "12def622424de9e5b79682514a9dbf796021b92f537b1c0ec7e723c123eeac5f7c64e229bd4dba87fefb33d287d3cdb4", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6da28a61568bec277b50190af5b1a09fbd7fc0aa892ffeed5e1347ce538b3882", -"confirmedHash": "2e10838a2d1455c63958566cf2e7ae11fc2473183f93597e0300000000000000", -"service": "00000000000000000000ffff8f6ebf0d", -"pubKeyOperator": "9029f581eb30513f6df061b721a47f51976ff4f620294bf32f968aef2ac61af8c8cfda5d126db097e3a275cfda5e26be", -"votingAddress": "3FkA5QWaVzYs4PEwXBmoxGHcAf4C", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6da398c4f7afb0b5d6d49c95e1af6e75cbb126ed2034bb23181ea1593d5dfe29", -"confirmedHash": "6293371443b72347ef9220b3c2dc95204da20f205271ed060c00000000000000", -"service": "00000000000000000000ffffcf9449cd", -"pubKeyOperator": "029879ce12262b43f98bd93b75b9841edc7a593355da1c7704056eebd4a6e6470f048fa50af33c2c7ea125e552c5218c", -"votingAddress": "2poZudc8cQd5C1hYLLeu3QAC1voX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6dbeca68cf4cc98f6080eb70b168b23986ebfc754e573278ed43a93c8a2d0a67", -"confirmedHash": "4ac24e873b74478c967fb18c36422565d84927594218b1d90300000000000000", -"service": "00000000000000000000ffffb009d211", -"pubKeyOperator": "824836d360be47f9d7eb5dd32e33a49a91e095affc5f976390fbe9cd27aacb6832c5674da01dd769eb53a91e7e22839d", -"votingAddress": "4P7WzaHVu1Ws1xVN1UpZyAmBXp2R", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6dd518478b18f187da5aed8cbea527704d180848e47a6287e20abba952cbc657", -"confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", -"service": "00000000000000000000ffff9f45cc77", -"pubKeyOperator": "8cfc1799ba05b318d1993933d8c7d3d56c899660cf9d8bb578118459713ae0482882ea423a9b9e104cba12621289503d", -"votingAddress": "3PRKhkfRfMvxLbnLQpjX4Sku84uB", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6dd66a1b79ca9c36dd0eb343c6134d40f1d402b2e871e978173e053ba990afa6", -"confirmedHash": "f475109160142b7a3c9e88937ee42dddd0daeaf15eea728c1b00000000000000", -"service": "00000000000000000000ffff05b531e7", -"pubKeyOperator": "82b7ab63c944e822b45c33b1a98e5dbab7a2636298b7856e826cd1358d07cd0d125a02ec74b26349034a2ab0f6ca3cf0", -"votingAddress": "sn7MKjRiYLnHx3hqSH47zW36AnR", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6e176920bfb6f6604020384e37a84573485b853940a5a1088152a9b56be56d71", -"confirmedHash": "58245ba2b9adabcd5f9db23a0d3d83230260218461cfd13b0100000000000000", -"service": "00000000000000000000ffff0de45cf2", -"pubKeyOperator": "07d408d7c3bbe521b761329b718a1da951cb9401c86b1265cfe4df70050c2af988bd6b3cff0891195487a328af1b6ee2", -"votingAddress": "2CZX24H2rKoeZeer6jAVc9eUFRYz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6e1da5cc5dbcdab2a4b46ae6730643b157a5c50da0db28e45fa719f2baff3625", -"confirmedHash": "825ff51efd7ed0fc1fc428520486adf4d7acec61b83d33cf0b00000000000000", -"service": "00000000000000000000ffff55d1f25a", -"pubKeyOperator": "169a11c1e3ea589125bdf812e700dde3075df32ace3a85417db884054eed84df4d83fbddc30258d45acd3aad574cdc6b", -"votingAddress": "3MHbTUHusc3jM98SENBgGsPFZKmo", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6e381928efc27d33a283d58e81d3c917021421bc9b1a16d99de7aa8e458898b0", -"confirmedHash": "f2416ae3f22e47447fbe9b03f90053286d8408f1c10762630600000000000000", -"service": "00000000000000000000ffffbca6be49", -"pubKeyOperator": "0e9888cb825a81f22bac2d1e889dd4cc95b226fd13676f775aea99d9569394b9b50a761a8004995f3fc46dfa8a24c3f1", -"votingAddress": "34TMw3zjmXaBmBvu74W6RRbL1WKo", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "6e478da3ed786b37c7020d2f5b2c2140aef3f22035a0e1b9edea0392f5c1f708", -"confirmedHash": "008cdb30d435ed0afbecfa38322547bfc699002d3f2abf1f0100000000000000", -"service": "00000000000000000000ffff867a5244", -"pubKeyOperator": "032523e8bacfa9a47ad6831fff6cac66b47c57befd7988da48e1d0acc1bddf412fe75492922946e66600dccc970a7659", -"votingAddress": "2oh3VYnJfZMqPVHgARfP7815RdyX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6e4cb62a0f33f89e4c582e25fcb50048d054f36185bfc1299cdba563bfd25a50", -"confirmedHash": "dce08f081d740d8d59e56798d050d7bf7414eeba0b802a751400000000000000", -"service": "00000000000000000000ffffa877500c", -"pubKeyOperator": "0c4413a24083833089921969bb7c32b7216b1908c04b9bf4685f49badf171d4930d19af0bfebfddb96bee1dfe799839b", -"votingAddress": "3TmW8DPMWqYyHx9NP7uQpyoRKzFL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6e5c78177641b5032830231fa527f903001e31750d9992c9b1f329b67999cf8b", -"confirmedHash": "296b5d7c669b839352f81da8cc0b86e65a9167b54d73129e2f00000000000000", -"service": "00000000000000000000ffffb009d20f", -"pubKeyOperator": "962a0f67457722f3b35a77a232f14f5af6577d003496e3fd5869808cc5f4c78beb4f96db30b20f64af523bcc4e195d0e", -"votingAddress": "2JygeZrUAgP9h98GR5EMzwEG8q4t", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6e5e291f5553b351337cd188283ac7bc86d243db5069127d0c073054ee5867bb", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d52b16", -"pubKeyOperator": "0cb3a71648e6e4a458e86868f9b3098c514dcb0e153019befa3276f4cf6a949e07e8cda2b4d2930fbc81026dbc78bc59", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6e7a2580b3435ec46b7cb98512ad7ae7adb45e449f509126be0d43f65d2aa166", -"confirmedHash": "b7de66377ac2e6b87d77c94d6af5874ceb5fd823caba70131400000000000000", -"service": "00000000000000000000ffffbc28f16d", -"pubKeyOperator": "0198e4bf3f807b2a731b8d74e977ac4269de63b5b6deba8cf399aef87a44365685db7eca12906e1ee07eee7fbabef64a", -"votingAddress": "3bMneJ3x7rG99vB7tswa6CbZt5XE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6e7c93c7541fffed202827efcc6570d613e81199ea571f02d62aaf81595c2402", -"confirmedHash": "cdbeebc4a3580b1d894014dcafb37c7472a5131b33ac100e0100000000000000", -"service": "00000000000000000000ffff59280023", -"pubKeyOperator": "1405bd2ab5ad5dc889217ab52ae0dfb44551ea297e15cf754d4736eeacad75bece59cefeca913be43234a1b1a9411a11", -"votingAddress": "47x5XG2mMPUrCRaNNWqLPUrooZa2", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6e7ef7f5c0bb58f991fd325686afd643c3ec0ed7d4224171c6a81c89e65de515", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffff80c75fa0", -"pubKeyOperator": "098d39575c70d571d926e5726adb08af99bab833c7210d198c02a42f2f9bc7200ee930db27385fdafe886c3af5982087", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6e824f952ef9ce839f6249c7a0be7d4705eefb16e120bf9dd422af9a3cbbec04", -"confirmedHash": "3001412e5fdc9742f710544d53399c7b00ab9e93f610ece82e00000000000000", -"service": "00000000000000000000ffffb29d5bb2", -"pubKeyOperator": "834e0abbb2943831301ddafdf2428fe59d57b8628758b24d82089ac83b7c603dc6d30c120912d3ae7c0f50fc2726a99b", -"votingAddress": "2RzdLzYUajJsy9AvPsg8pfTRY5mN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6e825c28c424de79fc325a7aee24bb60c9edd06b5bb2ce140b5edd14055dbec5", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b09f", -"pubKeyOperator": "97e2ff2d938fc71b2109ddff41fc756e9cc21c5ef9193a9b77c363c0de6e9e72533c1d9abab56d551613ec1e8eafafe3", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6e8fe40dcb1c14d310988d8c3e4a44c81c61aa1948c999df6cd0d73560360793", -"confirmedHash": "cbff416d9f9c0cb427e041d3a2444fb6a2b63ad51ebec17a4400000000000000", -"service": "00000000000000000000ffffa87757d0", -"pubKeyOperator": "95fd5eecc6cfa13c38947e8b7058974f3c2f02b416ff8162d204db3a404e12c30f5b50a9e5a236f18420c67964295365", -"votingAddress": "zrht8PL2NZXt3MbCUarnFQBeSNp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6e8fef03057c521b06a275b20c7807ba058aec8e18a6eee9fb930f3f77ee00d2", -"confirmedHash": "1ba7ca3be0b58d713db473a341dcae9bd3fd67ef74c98fd81200000000000000", -"service": "00000000000000000000ffff5fd88c97", -"pubKeyOperator": "1678a03234ac2192d1f4a39fd151aee1d41b214664acad63d1a36c2f319654eb5e43c31d8e09985ca5314446c85f3e73", -"votingAddress": "2w2GvA8rKFrGDZVM89RKHkkRSQqN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6e934885143fae275e494dbaabd43f11fe54e79d3c70b9dbd60f89f7b26b536d", -"confirmedHash": "0cb36e4e1a00242957072fe188e1c98b9e81113f1da01da51700000000000000", -"service": "00000000000000000000ffffd41860b2", -"pubKeyOperator": "08bef74b62a5b6de1f088c9b2044aa444dcec42158586ab0be4d053f8e83327e1a44ee6a865b48626ade4978f52d80f5", -"votingAddress": "2GWdRGnH6W1apJyffLLbj4CSAN7t", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6ea30c66f5e43b184ef1e7f46a3d1a641a395b7e7c47be4aa77d37798e78d0c1", -"confirmedHash": "1efd979885ac1b63aab9816d1b528c388f2cecb2ba50744c0400000000000000", -"service": "00000000000000000000ffff55d1f1e3", -"pubKeyOperator": "92aadbcec7b7e611977020cb7592e47d971379e364b524c2a36389930bbd88fe532d5c22cb9811a5cfb793e0075302fd", -"votingAddress": "2vH44853Kv2ab5HjXUmxJiuTPrMa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6eaba25f5e2b1d457cdfe1167c1ffb74c8a5ab1dc2a94f2f5745f088333c36c1", -"confirmedHash": "fbace435f615e28fa2e7023ec5da17a54f0dcd8628153ff11600000000000000", -"service": "00000000000000000000ffff5fd8e669", -"pubKeyOperator": "0bf423beb454c45613716f55e0af97969245690b62e9ea3bbaa329a7eac5be646606a33ed23d0a5912cc9ec2fef660d2", -"votingAddress": "39HLxK58C42nVxds19ZVj6ZkoiHH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6eb16558c0a223b83b11f42ec7ada623a020b9b9b501951c45edbaddf4645765", -"confirmedHash": "74eeef8df9323115d4c6150616ff4f8836bb3cd60809df920f00000000000000", -"service": "00000000000000000000ffff55d1f16d", -"pubKeyOperator": "19ef9f66937b2ca5a0d8f4fe73c52a3ee62e0dd1b8885cff3ef1193c4f533432ddb431d91ad1fceae1de1431ab13cd98", -"votingAddress": "4Gmqnheet9ERWnvs5TmghPLy75cX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6eb9fdc69bca24ba2c6aefbbd070fb8f271fb4a83423b0aaab7838cf70830e28", -"confirmedHash": "c871e716d4c992edded6a86eb35386c8664cc7b48a3245e33000000000000000", -"service": "00000000000000000000ffff5fd8542a", -"pubKeyOperator": "007599fae96fde3ae14a0ba4e94a6fae85e38898e1ca812442ef75749535241ef54c62ba0996186c0f80339593ebffee", -"votingAddress": "219W5a22Srzf74vZ4d6D7A5cnyaB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6ec5a38784700fa945678a59a02da9d9cc49290d1dd7a7f6184d5ce8c93e11e5", -"confirmedHash": "37b6b4e14d27cf2d37e2ea82a837e1bd359533fc503c746f0b00000000000000", -"service": "00000000000000000000ffffcff66938", -"pubKeyOperator": "907e3d4b42270b8e439a4af9d8ce00fbf338bdb7f661b79556743e340d266e39574c3eec4aa3701b021ddff7e0321a08", -"votingAddress": "4UfiMdwqz9iZpY9QibBGCmhKWkAW", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6ee31a56669a0cf0e4c4e6194bb18ddb832c5c78a341d3a2cb51fcdd60c01403", -"confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", -"service": "00000000000000000000ffffb0df8c3e", -"pubKeyOperator": "90462758468bb4dc500b2674fa26ccf7ca584280ae00e6babd5ca4d050b8c33c4f600d67ff5cabb26db8886efd747f9e", -"votingAddress": "3t22r3M75RzkK5YNUdJ17EY1HE8Y", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6f1418e77192e57f2ef5668d888443d28d32bd948926ed6afd6c2f821710aef6", -"confirmedHash": "7dba5dd997f8f0827d4d891db1cda82e1f7447b2b5b8fb712d00000000000000", -"service": "00000000000000000000ffffa1235eb1", -"pubKeyOperator": "840f19fb021b6691e1a86901cae6e0d90cdb66f4e1ca30d999587cad53fa38711f828271102d6ae479376b9aba081229", -"votingAddress": "2AiAkECkjoY53u6wcjGvqJx2KZmc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6f20999f745580ce9bb235f324090b05626695b848e5327466cc73b72ad2d6ff", -"confirmedHash": "960cffe0dd7c1e3710e3804bbd1acab302ef47ef4928be221e00000000000000", -"service": "00000000000000000000ffff52d315f6", -"pubKeyOperator": "90571176dc000c4372f51d9603c93034cf37d8254ac4ef6d7aabb7ca5fbca03f47b02184c08e04160d976a9e177ab50a", -"votingAddress": "3ei33Enggvhm9eJz8AgjAKREYmHe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6f234f97c20a2897227c6fd23a136763da1153a26d72dd8ecc721629bd18cbb5", -"confirmedHash": "841115bf308a1bae2b3ef26ef80aa6212cd9c3f0b131f8551b00000000000000", -"service": "00000000000000000000ffffcebd8c53", -"pubKeyOperator": "984da01196c4a97cca255f0635922abe3a11919d07e9b21854207d7b6a499965b887dd765eed1b6b4db15c1cd0351a7a", -"votingAddress": "2XpcHeo7e4bMWwg54pNQAJDX7F9A", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6f421dd822c1da0d0474549f1b45dafea4efe6347344aaea688706f5ab8f5869", -"confirmedHash": "abbf2a18662e8198b1323df1fe410d303c074c242c1d59f50300000000000000", -"service": "00000000000000000000ffffa7a024fc", -"pubKeyOperator": "939274fa4bab538fbcacaea351c698e04d4322af5b47cf70266348c2bf5879dc03f2061b9ca0a003efbe279ff896172b", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6f55603a40deef09e6f24f7cd95f95979f4db23fd37ee22db549392647b9df2c", -"confirmedHash": "20ee019f6b56fa820083a711d32963fe0eba7971c8cbecc00d00000000000000", -"service": "00000000000000000000ffff2d4d5ad7", -"pubKeyOperator": "98f909298417df434ef2185fcd55569d904b61b12045bf45826a0895cd13d04efc7e69485ee2fb5c0196c831c518f276", -"votingAddress": "44WjxKyb9PTgp9GNMJo5w27THQSR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6f55d61c76ede567dc91abc9463bc3f5d6196b99934fc1f49b237f5aed6e6e8a", -"confirmedHash": "15cfd9d141b080898bac815019d2391d6c549d54f3bc20731500000000000000", -"service": "00000000000000000000ffffa74788df", -"pubKeyOperator": "8ad7e667c344704f88c306c35962833ab3163b7ba6ba53bc58b9054539ec09874948c5659c85b9e65ea2af5f259c1160", -"votingAddress": "BiSYqjky7BvbXFSiYbCMFfCLgQo", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6f57957bcde28b9172e70fa4782de4f6b91a90f54d64407aaf9d985be3d8d1cf", -"confirmedHash": "c5ffb1465276b9ab1edeb92c1b10ba9ad63e367adde1d2f62800000000000000", -"service": "00000000000000000000ffff2d4caecc", -"pubKeyOperator": "8a32be69f09c68d9cc38fb5f8ef3e027933bc29cc67425d89e6247e169d158eb6cbd87eb762f88fe14826120693cf499", -"votingAddress": "3m3ZR9ZDmoPD5K8dUmtVfhvJGvnQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6f5a3bc247e0e26364991ab37706e838aaff047fd3247c9531158109b0e8d30b", -"confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", -"service": "00000000000000000000ffff453d6bdc", -"pubKeyOperator": "862f5f544f7716c79f1400996b984c391e0e250f2ee15836c70ff8f11f61bcc69b5453370a8a86c2495f65260a897ff1", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6f7065960c0f833dcfb7b5dc291109bf44e2cda91eeb4240587ff13f7d7130e0", -"confirmedHash": "59521143091d862188a8ffabb65f3d681258a2e005d3089d1200000000000000", -"service": "00000000000000000000ffffbc28b6c4", -"pubKeyOperator": "997fffcc425c17010af921231ba103d967e524f6aeace2f67e29326b95a8f60f1efafe9cb737fbebd4d5b0f9d5538420", -"votingAddress": "yVRfxEoffjTxX25Rwg2qWfSWuAx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6f7b80c5e71c46246dd262a418f7fcdb173e8406ff9a2ad0f88f2a1319ca3251", -"confirmedHash": "69fdc8d193e5b945967ea3d2c1ac0a083466ec96e68162872600000000000000", -"service": "00000000000000000000ffffa516483a", -"pubKeyOperator": "9486e1c6a06ba62cdfef6e709f95a050aed2e706dd0451c19f601d167c1bd240bb30a3586f89e90da74e9e69fb4a1080", -"votingAddress": "4N5zu5otWM9pr5CJKV88Qm4KXi6d", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "6f993e0dd1bc9872b187611b919f60677f191d634c67273b180671f7c6c5de72", -"confirmedHash": "44135898509247d993f87776845488436c9059d11ffe2b7d2000000000000000", -"service": "00000000000000000000ffff9ef7d42c", -"pubKeyOperator": "14fce0abdda962b6064c7475470823fc7e5691ab84af61efc8d7f4c2080f13ea11aef56e97e3641018c8277239af9fe1", -"votingAddress": "4GD2g6QndHScLCn5wQVGuy5idxuS", -"isValid": true, -"updateHeight": 1760952, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6f9deed73f465fab7dd21f47229d40a1c2a50dfe88a13ba072f480ac4246fb23", -"confirmedHash": "4131a2f9109b8dd8c42831820062000b4784614cae2b4f4f1400000000000000", -"service": "00000000000000000000ffffb009d20a", -"pubKeyOperator": "11a9eef723a9ceb07de94eb0f59c75812a5f35a77fc9d115dce7b457a9c43d8294cad4df1691762368d0ee5b27555c6a", -"votingAddress": "7nd8dfyTRu3cyjTccksPYBZgxyX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6fa36b1272a405939f9ad118452013f8501aeaa60e05a011bfe7fcb6dd45db71", -"confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", -"service": "00000000000000000000ffff50d0e2d9", -"pubKeyOperator": "0fa167b43e2fa464fb1d3575841622de5b39e7e514e87a33706327186a30559ca61e7439df007cd0d3082df359c4ddcf", -"votingAddress": "3vid4H9s6UHwdPTsV2giKVgNm4zb", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6fa4518023afdc8cde042a1f736080455ea548e8233ae0f7bf81fc5c7942fe23", -"confirmedHash": "a040f70d86919cf216e6f353b3534e7122524e5ed0f38b412800000000000000", -"service": "00000000000000000000ffff50d1e1bc", -"pubKeyOperator": "0e69ce091ce490c59b8ae7433e5619c547aeeb1b0f7cbb9741538997e561bc09f5071ffcc5e6815bb57ba0be5ab38290", -"votingAddress": "2iJKWnVCUe3YKfnJzSAcS855V3ff", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6fa5a1800199fc38691eba9fd14a2acd9ecd830bc50fae11a00b2b669cc91b77", -"confirmedHash": "ab25b4d2afe1c56f9b33733608b170a3b2b23c76b6e934012900000000000000", -"service": "00000000000000000000ffffbc28b98a", -"pubKeyOperator": "150e2ae109c979bdbd1380a22bf9866a7e816d991b1d2cbe1fdcf43abc702389a35ec7af4152a4ded2bbf13a294f0c8d", -"votingAddress": "AM8Zun3fRqJJvECU34i3gmiN5RR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6fb1bfff66702cad3ef80c3b9d264561bddc03471d09d16cb415397a24de0f9d", -"confirmedHash": "495cef89ed35e3731f50e9833a553da00083e8589abc76e11600000000000000", -"service": "00000000000000000000ffffa87757c1", -"pubKeyOperator": "866e11816a58fa73fcd819b9aaab09a40646f6e71470dcc794b0cf8c1c036d3ad5db1569882762a65d2d29b45831d82a", -"votingAddress": "36h3aEaVC5Ly8kUxySpMKP9Da5Ui", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6fb450746dc3b05b5878e656c322ac7aad407ac92ded65b7e9c5050fa3948314", -"confirmedHash": "97fa3bf9eeae1f90cb53e7f8f7c5eb3d3321a1b53974049b1f00000000000000", -"service": "00000000000000000000ffff52d3153e", -"pubKeyOperator": "832ecdb7db558ed15faf7c3559a8ef8e8c5592c458a607dc469a48a732ea245790613f48e8c2cc0adaad8ee88037005a", -"votingAddress": "ntQ3QEDnJzVHfAGW1tkvvpZbvcv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6fb61c991557cf4c832665e3a961f7049bdd791aac7971f1bd9a30edcb85f2c0", -"confirmedHash": "051b53482c37c7a2c952b7643015e51f96dd4df42d4afcb50600000000000000", -"service": "00000000000000000000ffff58632556", -"pubKeyOperator": "94a5a52650b032d14dd00a591ae9c5718419190b7ff7e56abab9889e874facf1f2f8233e22310f760bd8ddda8df45e14", -"votingAddress": "RUqst2kQb75ga6X6wrMhGG8y7eJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6fc8e88fa90532eb0d4fb7c47847ef7a1a2a84fd6d0e5a8befb6d6b8740b7694", -"confirmedHash": "f475109160142b7a3c9e88937ee42dddd0daeaf15eea728c1b00000000000000", -"service": "00000000000000000000ffffc3b5d75a", -"pubKeyOperator": "13e6578f575c681f159b019fbc7d425f6e9cee2a4bfc98bad504026418d351aec1f0e91a66de53ef8899ab6fb66a1bed", -"votingAddress": "2VBe7T9DZpW2xLaFiHz7teUwEAJQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6fccd9da29f3cba0d30da7e42738bf96dd3c8a4102df9b19c382ecb035409d9b", -"confirmedHash": "771f8b7dd0e0b0807b290bcc5827a8db8fb457c203113fe51b00000000000000", -"service": "00000000000000000000ffff416c3bdc", -"pubKeyOperator": "037d812689cbcb1fa0a712d6b8ad4c43dbceb71a56894935b09d01a054b991a4dd4e7e58ea4c4ceb5d9b76228a8ea66e", -"votingAddress": "2WEv2TofNSFDqM5ZX27uq2YfUexb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "6fd715a9ec15b71c8062e9852dc3967bd704d359c76566e4b39f4b57a95da01e", -"confirmedHash": "9b5bc5f246bd929d5d85fc0a4dc95df780c83751bb96832e0e00000000000000", -"service": "00000000000000000000ffff55d1f27d", -"pubKeyOperator": "94de8577ebc89dfcbd3800065a8684ffead2b02b67363fe7fafab4e8d7bb7287838014b1002bd14f7572245ed22d02e6", -"votingAddress": "KZ3yG1DTXCQsQ6K1kMPWQKWrE3i", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7003b52f22a2a25c2149f8c274de0ecdc3188deed9d1c20834972d28ca42b3cd", -"confirmedHash": "ea43b054194b39c2cb18b7e56f47819ee3c37d30192e139d1500000000000000", -"service": "00000000000000000000ffff05b5ca10", -"pubKeyOperator": "0f5b84f578a002fd6205ce995220cd1c9d9a5b0d904eb729067ffd4023e748c336597e2f88fed420401cf57455a0b32b", -"votingAddress": "2KB47UnBfRkbky6m6iZtyw3H1R8g", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7003dbd7b6565a95f835e1d8dbe85fb5ec4d0babffbbe27f758af549bb70083c", -"confirmedHash": "85eaa1dcb4c395ecd5bafec2d53e6036e88fc38bf73a26fc0700000000000000", -"service": "00000000000000000000ffffbca6a1ec", -"pubKeyOperator": "1630029fc7638343400c24148655426a441cd6d266fa15a0ba673e84fe8119eec94a5bd92fd2a31244a5d819c5160d99", -"votingAddress": "3zyDDFxioSmvKHcA4Fy2TYWs2x6j", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "7014a9f44ba0871ce36ed1ab28d019eeaa9a0cb3428a64127050ccf4c14d5835", -"confirmedHash": "653ff76c915d5127c22ca3cad18501ee06969070d27315763f00000000000000", -"service": "00000000000000000000ffffbca6043f", -"pubKeyOperator": "8e0dcecd1714f2750aced229ba283106c948525a15215b00fab94b1717738ed61a65a95ec5d66c7fa0d2fe6a478ace97", -"votingAddress": "3vbKK9rQ4tAYpY1wmHzr8aDeEL9X", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7018eca35052bf196b17fce6ae694f6c5f505f8957a0b4d47547c611858a1f02", -"confirmedHash": "fe7dfa4890215028e93637471a8e7265c228f0c004f7f1190600000000000000", -"service": "00000000000000000000ffffa7ac32ba", -"pubKeyOperator": "82f57f3bb6a4559303d734a7b0ca0f435c92f810fada3ff165fd98fce7b82d3721fcdc9c0605c448c11ffd416df7b704", -"votingAddress": "1YBf3pWGg9e886CsPJCLjwzctqi", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "703fcece4c7279eeec2d09577ea96967f1edf8c1cd270597d536a66dfea707f2", -"confirmedHash": "0cb36e4e1a00242957072fe188e1c98b9e81113f1da01da51700000000000000", -"service": "00000000000000000000ffff4e2f9442", -"pubKeyOperator": "1484b4e5967238950b1b23f837cc84988fdedde93e4300fc878e63c3f864d347e993ac9b25354d89415509f9a8a6bd21", -"votingAddress": "34Eccfx8n3aG5XN7fXFsuykrLzAQ", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7051bcca787b52582d3b9ba73f9eda4434228e952fc266840295c1ba7e1db7f0", -"confirmedHash": "ae06cc22cc46401855349ed291205288b41759c66e2eeae40d00000000000000", -"service": "00000000000000000000ffffd418666b", -"pubKeyOperator": "0f78a9aac42dfec6620333f24c236c0f54358729e0ff90a54eec0f534bb93ee5d35b0034511210f1b23a02a1af2ea8ef", -"votingAddress": "2wTffwdRVw98T5YVYAUcNzPgAULR", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "70531d66c9cad1dba749fdc659dcdfe2eb55a81718d38a9ae6e4ebec394d7d65", -"confirmedHash": "47e16c22ea1d25788a00a7fe840024fa5221712b5e742eef1400000000000000", -"service": "00000000000000000000ffff33c32ba1", -"pubKeyOperator": "8b82b9a5402ffd038e0f395e305dbcb81adfc2fbff861292dd91d89cff973fb06bee90fe7fb516f20dfeade9d94d30e9", -"votingAddress": "2kDdkwrdcQ4XdNnS9BaSEcwj8Gh2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "70722853542be88fc3378b009054406b9329972ceed5081fb8768a0988f28752", -"confirmedHash": "69675e795d5819225cc4ea600f8c1ddacaa353c003be25051000000000000000", -"service": "00000000000000000000ffff55d1f23e", -"pubKeyOperator": "09b5ee37fec9d0cdf216499dee7350c7f0bd136bec42f62502c104f3e7819033e4c0b2b543a0b069f166761082268893", -"votingAddress": "2Ag46QjJRBLRzyqJfCc72qyrfMqy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7076139d1fd0c8cf1e012b9acaf90e29ddb8e4b0fe6a863024bfef604a387a10", -"confirmedHash": "ad2b57e7b5e84facd2e0dde845bc01cc29e2f571421f3db61300000000000000", -"service": "00000000000000000000ffffbc28f162", -"pubKeyOperator": "087d2baa556e449aea300e61721d9be6a6f00243dd3475c5e5a2da4a8e6ccc6d2bcf6f48365512fcab8b400b5a9ab951", -"votingAddress": "31YbVNeT3gwrb67ZgdvDYPxBLGne", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "707c447132d5e5d05bc97f5785af3d993a47e3b11d27c8992bb53405e69aa474", -"confirmedHash": "a9e009544142e44972f27788f2344011df4fd63e3a8858e11400000000000000", -"service": "00000000000000000000ffffa7acae9d", -"pubKeyOperator": "856d08dd4d5ae93c569da1000084920039b87fab682f7a3e5d3017d5deb5a7719f43ea1e019acc2346b519e97833a235", -"votingAddress": "2no8QU7TiXjs3ZkYC5GZ6WD6gPdF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "70842f1c88b999f6ad578d67f9af4d612d5a55da3fe3b448952539625c565af4", -"confirmedHash": "0208682f37b199910eda6d0fd05e60cdc29660aa1d74ca871d00000000000000", -"service": "00000000000000000000ffffb951a467", -"pubKeyOperator": "0da914b67d250b8f86b961ef105e60ea2e7348653db783c2ab0d8505c343c63f7d3149b343c968b836729362e71593cf", -"votingAddress": "3QuFDpaYFeHr4R5H9P2Tdbf3rzQZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "70861edad2be14f6d4fda67b19577dee33907e2804a725b9070b51bce4082057", -"confirmedHash": "0fc9a90dc7502d2c30da066b6488fd076d8882714d76f5ea0a00000000000000", -"service": "00000000000000000000ffffc2875f7b", -"pubKeyOperator": "01cb1e307d13f87133e9e06c8c320e90e7191032e7eea307c81d82ecee56de2c1a35d9cbaf0a18c96dff29274b5560aa", -"votingAddress": "3ChGom2VdcwUKM7uKWDPEfkGWeVw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "709c6046694a6b72ee77caafd338d4f18d62a615b771e2aef5d02e827f7332a4", -"confirmedHash": "38e69570bc387ac788dd5ae4a658aa2e23c076053e00391a0100000000000000", -"service": "00000000000000000000ffffd41868dc", -"pubKeyOperator": "07826f15148e1dc0e0a2edaede3e8429ae3c5718c478f3ebd13f915c137db315bfa2d43e42aea74e8c6126ba238699ac", -"votingAddress": "2ugJhxprtboQT2T8aBpkFLp337mN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "70a8be9935d5e58a98aadf7c7f36e2d16596435477220ff3d47f3d660c424f83", -"confirmedHash": "ba8e3fd3ab2f5a6251b23c19c8b05e062686e102c590fc170b00000000000000", -"service": "00000000000000000000ffff2f6e9dbb", -"pubKeyOperator": "80ccf5e8226c27a4744603ff60bbbc2aff2691682f685e8f88596892b178f54f8b8baa834d6e051f6cedebc5b242a427", -"votingAddress": "232LBx2fSeCr7k5a6Pd2a7B4rZQA", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "70c3a20bb439b427e6c5517c64dc431d188a0ffa04bcff9da1f1110250bcedae", -"confirmedHash": "b66ba86a783f8d88a44c9cea9f9835cdb3ce2d3a097a52002700000000000000", -"service": "00000000000000000000ffff2d4c2cb6", -"pubKeyOperator": "89da8f2b9e9d62cbdcf8dadf9c2e397caa1ddab2164bab477e78a52d6e5833c6b2678d00ed017f12e1cd01ad04e24a41", -"votingAddress": "4EqV3DonQwYn6rFegL2qgBx1Cd23", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "70d22542fa3bb064aef22626cc0aa2503cfc7169d1d0534958a5eab1b63a5979", -"confirmedHash": "38ff66636a5af1276e1cf73fb9708614daed5c81cf959fe72300000000000000", -"service": "00000000000000000000ffffa763cfdb", -"pubKeyOperator": "8a92e76686b968b87250110b0a411ac934bdd2c0ca0040b7ea62e114a889a76a5debdac80b641bbcbf29c6aca4f514b1", -"votingAddress": "4QQU1ZEBBjXieahMwMcQKzfL7t28", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "70fea2c3f7bfe1964fdbe065c7f64c1d27d5da1d382f9c0efeafc2d32e60a386", -"confirmedHash": "0ad045dc2a92d34c023e419ebd6d57c7faff5ec898d6eb511000000000000000", -"service": "00000000000000000000ffff52d3151f", -"pubKeyOperator": "0b18b79f40b3e7fe4b16ef532e7aad60305feca9851141d91e008dd4a6b432c499396dde36b95b82423030009c617927", -"votingAddress": "43FtZVKvt1fqW2yHMWUiW5qDQq8K", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "711267ebb4b42ef7501e2dba3dd4872edbd8c4c50239f7a50dbc27fda1da660a", -"confirmedHash": "997a923fb08d9be700b58a3b6c2ee40d92e874a7bfa5b82a2000000000000000", -"service": "00000000000000000000ffffa8775301", -"pubKeyOperator": "866bd6ca78a45c3bed4da4a72e73e6d7043d7cad98614b7a3de188abb2ca425cbd3f2c0a55a3b1044fdb9463fa034660", -"votingAddress": "2RBiGjxGsjGkTL5taRN95c9WPU98", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7116dc88a2fc60f8776946eba1ceb9d3f51b0902eba33bcc0301b84e4c1e2954", -"confirmedHash": "cb48c2362399430844632a5447e50a46f69e09b5d2b264212b00000000000000", -"service": "00000000000000000000ffff5fb39561", -"pubKeyOperator": "99636087a4322e58e02aa7115f98292fe3d3ba27caeedef85410e53e64fb46826ad5bdc5fe8a350d237317a650ea543a", -"votingAddress": "3pfK8XZhBaRmhJ8M6FXb9eWBnDBJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "714300dc3d1321bb6dcc6ac9de98a37b4cc16059f8afa46cfcb0f9dcc2c01d0f", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0db", -"pubKeyOperator": "14e3855dc440dc617e3f4b05851f4152ed7d8c7324ae3080af5b5171ff8b723ed207127103e6680ad6639cbc651ab3c6", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "71440b91191864171b1ef4dc75f521476b0aa1a8f7b5dc565c08ae2c7ff928ad", -"confirmedHash": "e56b93adfd0e0ab2161a711474a459612a41a586d350d6211d00000000000000", -"service": "00000000000000000000ffff422a6c44", -"pubKeyOperator": "0fd404da8fdb750c4cce6cf0c18686ad1c5499685a4bc5f6b55799da97b1d66a1ac4a82dba090c8fb1501575fe65f073", -"votingAddress": "2Pd3rVJCLNAXqoL2FcAAdK9krH9k", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "71474b3017851e4f4c2cbb7cb20f395a24e0403729bdf74f471cfc414f60b924", -"confirmedHash": "e99212ad9045f52bcf74227a95a96458959dc2cd57bfd1c20300000000000000", -"service": "00000000000000000000ffff55d1f20a", -"pubKeyOperator": "8501a9fdaa2a1f21c71cdf608362f2a0cf06ae5dec7a07a21fcb176679ca558374bfcb7a38fa4fdf63ff0787ab0dc367", -"votingAddress": "2MDfuK2UmkTaYFVatseCeTjRQp6Z", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7151a3c5a11b3ef4cf2bf3a11f22d70dcd042fcec936d0c891df45e10e608c13", -"confirmedHash": "6a716502551de56690db3d6cfaee25b3a441c52c948035f30700000000000000", -"service": "00000000000000000000ffff867a54f3", -"pubKeyOperator": "84d23a8cb80ea76901a3386537d605042c599645842ff97ca86ca764421ab76d261b24d5326edb739d98cb5b45409eef", -"votingAddress": "5DrJVbwjtcHpyDDPb1TnraU58rb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "715f800accd67ff9880e52853d22f2618c4f8fad94d7f0517c85fb4772504b60", -"confirmedHash": "533993f2fca3592f11227528ccb5eba7591188b706acb7630f00000000000000", -"service": "00000000000000000000ffff8c5234b8", -"pubKeyOperator": "138f21d388656fdd3ecc30ec37e57fabc2787de93c2efed98ca4189d1dd9ea56c2dcd8a31beee58c0bcdb245bccd53c9", -"votingAddress": "2JfHYxqDNBRGCfzrfu49U8aVeE6H", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "717dccbace8307f4cd5272591030023a90e1e5170299a759c5ab995ecbc95aad", -"confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", -"service": "00000000000000000000ffff87b558c0", -"pubKeyOperator": "0465d0bea81594f2b1b0920b6b13e756337c4aa1c8cd474a2da02ef6a9c689fcccc5d0765a791ad393d4fae3045c39d4", -"votingAddress": "3EZwuBCAJfD7623Q3XSEw9Qd78U9", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "71924fe4875a3a0ba96fe101a8f7a4749490f3251fb41c1b3ea0827b84d43c90", -"confirmedHash": "8a8cfc6076e4d2ae09ebf9f7a1978a5b9bb65d7d31f536430300000000000000", -"service": "00000000000000000000ffff310ccbfc", -"pubKeyOperator": "1639838c878a071f4a8ed9c1d381113b342a310508ee09b22cf34fac28857964ecb3490ab1c7e4df5b0e8b3342a235aa", -"votingAddress": "34FatX8rfEud433PNudFrMb7NsMM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "71997244db51c2582e3eaffd6c20466e5e0a3a03d004f4f6395b61e92b701dd4", -"confirmedHash": "640298b997f797cd6986eca2a4baf2b276392f8cf49c114b1800000000000000", -"service": "00000000000000000000ffff2e1ebdfb", -"pubKeyOperator": "0cbac651211c5fa694ac0dfab9682eb396eeedbbeefc37014c5790fd77b42b08fb43859d85851bfefc1cec377f9de15e", -"votingAddress": "3BNm38njBSGFJne9RQ5Sxh1jJMww", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "71b0772b39fd232aa001f51b7b87c5a676060b3662f437e44ca59a06ab820f8f", -"confirmedHash": "71c8256de8afbe4a1112098f8697462a22b8ce68fd7bbf460600000000000000", -"service": "00000000000000000000ffff4f621f2e", -"pubKeyOperator": "0e5802f41430ae7cb59a51c32e7d6acb0ee81df686bacc7c96ac2ffd3a91cedc5c002538bdbbb6d802655ad92b70b5e1", -"votingAddress": "24PxQFJE7UvjHkbS4am1Mi2uwh8g", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "71c613385de7c5732b17f720f3b0dfd17ab91cf88742124c4acc1ff501f22d75", -"confirmedHash": "20141d5bd8750b48856a349180ac2b52d3264ac4ecc737190f00000000000000", -"service": "00000000000000000000ffff9f419706", -"pubKeyOperator": "9948c49f3c5357252c0fa5355deaea37fbd1465c90f67b06108eb3db3049419b7d031d3aa0eb895b6db0762a2d39aad2", -"votingAddress": "2gonZM259gBcN9JRNkr5BJSLTM2p", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "71d2b9ddd8bb474d3d9b48a6fcfce10cc2c91182c584dc412e6bfa02f1de668b", -"confirmedHash": "1b09c83c0db97075d29d5ab48d334d231b0eb97f5741047c1300000000000000", -"service": "00000000000000000000ffff74cb3687", -"pubKeyOperator": "997f1910c464cc390ea3627861c5b8ec33549f72fd98b582098dc23a27a893e121a97efdec49c1e602dfaed661e103db", -"votingAddress": "25sAzVzHskqxo311WYddfsUXCikB", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "72040d81a7d0c9f5003559ddb4ea1cb7a6443ba20e71d624f55e1e0a4cbe82d6", -"confirmedHash": "121e2cb539803edb691b4ab60a0246d83ae15a30cc1a496e0700000000000000", -"service": "00000000000000000000ffff951ca135", -"pubKeyOperator": "14767b1f7f31df252d31f6873c5f6fd0b6642068369b49644a9d239a28d4f1ef86f00ed252a2c44b405a5c79fa2d4dd8", -"votingAddress": "4B1WSUy8HSS2Eb55K7pdpC5Xnsjz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "720c7b20bbcedd475063330e84b72aea228c586aed9dd552b2f92af470a0ccd8", -"confirmedHash": "4df208776c9af2fff8ce3078d0de87e1ae3dd70bd2c8ba7e3200000000000000", -"service": "00000000000000000000ffffa87757c6", -"pubKeyOperator": "0e062962a5c47095b11224f1c88269937832e2660f3d165d216ab03ba6442e92fd60a4eae834a2de05c45a40f06e5d4f", -"votingAddress": "2p87ndkRj1PkUnX8ibU7Tcc9FkpT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "721accd3e701d4a0c50ada30f9f925c9fb5f876f725f9160cc9e58b7c291b853", -"confirmedHash": "fa6ba515c3c0196c176327f50039a5413d8a7c222f50ade62600000000000000", -"service": "00000000000000000000ffff86d19870", -"pubKeyOperator": "8c10b4020c630351db359d1e6fca75e81aa2db7931bc5d0bb7dfa0983627a4c4c762af250e8ac28f238bc8da40deabee", -"votingAddress": "2TSjN3Exj5tAkUbYRbXtbXVvnVAH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7220a5a44f1a6b0cfb3b40bdbbee9d02ea7d1c3fe1a22c328fd87472b8b2abae", -"confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", -"service": "00000000000000000000ffff55d1f263", -"pubKeyOperator": "8ba14199d07185760958e42620879fe402db41e8bafa8d6c78c45cec9e805e95d4ecb6f132362b8af35d0bd3b2903270", -"votingAddress": "3g71iHYRCMbXwaa818TmZyVprYPT", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "72295bef4981cc0faa3bd3282f28cd0f386fcf08e7637f6f06544ddc9691e588", -"confirmedHash": "58c288afb926c7bdca09ce0288c2aba3d480870b4cf34cc81f00000000000000", -"service": "00000000000000000000ffff258b0af9", -"pubKeyOperator": "01c4544e585b744e2bbfad6997f5063db2df8cbfe97c9652ef7e973079efec86f83fdc06755d91d4db50f4e72cd6e694", -"votingAddress": "2ujSbPi4E4TzvTqRzxygztBgWzRF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7231de7eb9b3306af6005e310952153537e36d240d933820cc4af7619258cf2b", -"confirmedHash": "506283b810b169f9bb333594f5becb64103496e8df9d85fe0000000000000000", -"service": "00000000000000000000ffff334f4555", -"pubKeyOperator": "818e8125c94a940ba4f39ff5f31e8cf8eb4738d4703eb75f3e7166b179d6659e3ec9776a1ddeb84005c2f7ac51c5e46a", -"votingAddress": "2PfoyYMuUikXUUa9uC92tRhED6CQ", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "723e3ff77030446f5f0bed787a59f273f56d5305a015dd9886489dbb9119da25", -"confirmedHash": "af830de6218c8069e3ebb3f4c3f72653585491bbe1d2ef081600000000000000", -"service": "00000000000000000000ffff9ef7ea20", -"pubKeyOperator": "190cbbb53cbfd66c04f337dcaf1bc09aa122626fcdaa07253eee7273194e681132497917072f0a81682e0e19fad946f2", -"votingAddress": "2RPQrKXimaxJAqDFPJdEmacKC5Nh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7251a2cd116346b816f36d16783babe7b8bcfce584a25114f0b3b151646e6b3f", -"confirmedHash": "cb048e1db696a741a4f47b181284b44b958febd9d4ec5a980800000000000000", -"service": "00000000000000000000ffff8b3bf38b", -"pubKeyOperator": "0675351a17730e04c1a0078d1dd93be4d5bf3d81af4e6bb8f933619a6228381a768613e99ee6f95672809c7c223be894", -"votingAddress": "29Y33pXqijxsaq8wGo65YPQ3Wz3m", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7265b9b36926c076a5039e92c964d3c6510f4f0529602f9824d3c61cd7297e9e", -"confirmedHash": "53887337f5b4256a58850856ae5fc5c6e302b4ea03ea0be70100000000000000", -"service": "00000000000000000000ffff453d6bd2", -"pubKeyOperator": "893dad324bbb343664727294a820cfdd33b5051209bb3e73e10054bd3eb2d20b28c39ad77c19a3a90a2b2ee3fbaea067", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "726640d47bd59fc0567bc290e734e87619d5908bf83f04c3f1c0f72ded33c608", -"confirmedHash": "107e4f231472a69e18cbb93851b75d146ad7fe844b0112240700000000000000", -"service": "00000000000000000000ffffa74705dd", -"pubKeyOperator": "975ea42b1f247c58cd7549623d5df3b4a121a28e9433d1350693d151e06f76e7fd61bf63c811fbac504069857cef58a2", -"votingAddress": "4ByDRz9ovbZh6J6XsapYMqB6AFTt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "727b0980a480dfc853783061b0474d5146affb55077ff9eb602ce3f4d39adb8a", -"confirmedHash": "794fb9c2de939f0e278e20be3dcb5175e9038dc3ee52ad3f2300000000000000", -"service": "00000000000000000000ffff52c4010a", -"pubKeyOperator": "0ef3cf908081295bbb09e6d46459cb8297a820e1e00eb6ec5da3a97d33e87abc858d9f28224ae3c72302b2bbd1d704e9", -"votingAddress": "URYTELaUmi6rhYBx6cziWdpVavx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "727ba01db566513549271bbb964982dd829921d4d049242fae7ab1de13cafb85", -"confirmedHash": "5cc50d30ddeb3465a323285d5a847a41ea6d4989a68d206d0600000000000000", -"service": "00000000000000000000ffffa123447d", -"pubKeyOperator": "8d13ae8c9c881751c934766fc707e48eb04d7b4afcebe7f7c6674ba294565a109c0e247da5ed7b9e6413be7f51ba8bc3", -"votingAddress": "3dHYoUhoUYEm9cfHJuiXGSXFxAhB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "727f3281ef16235a2ccd473c2353fd3384b459b002cb2ab9a7b9b2142cfcd122", -"confirmedHash": "950cd4a4dce11b5f93b087d4c9b122a210d79d3e91bf1eba0300000000000000", -"service": "00000000000000000000ffff52d3196c", -"pubKeyOperator": "9747b402f2fd5610f37c10ff032d8b51ebd8f6dfda97a5a0c0d09e69f55c22da9a30754e4f727a6e90266cc91efbb807", -"votingAddress": "e1MGKDKn1vrritjS3NRbXoNHJL4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "72b88aa9fbf47818d002a8a929cd02702bf5c0394c79bac6a549334537f63539", -"confirmedHash": "e582145fa1d275d93a5fa598586bc9545295db1a018b002f0500000000000000", -"service": "00000000000000000000ffffd86bd93e", -"pubKeyOperator": "106909d5b222fa38512d5b83de23ee9a851d99fa509ec09b78950983e2aebe6b7782e7d2dac8231aea9b490c19b1f269", -"votingAddress": "3TGkRv239hvA8h14zR1LQtjWNyxe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "72cc3f0b44b8670174767fd8d83fb709b3346a91d55d5978045a089591f92f8d", -"confirmedHash": "59b2431de04f756ce518861bd541e30f2bda064228546b630000000000000000", -"service": "00000000000000000000ffff8e5d992b", -"pubKeyOperator": "0c9e264afa7ea9571245e35c279c47b4e2761fa348108b37bb8ab03876e7c95d8237c675e80f46a73ec6315adc4a1a8d", -"votingAddress": "3Suh3Px7hvatf2CBnQuHBfwNgxG8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7319c62f6e9a5c82788453dc05bb35c5763f3a78c5673503133a6c854a1302bc", -"confirmedHash": "88a32fe101b93734a14c14cf54c7b312cd9d4022f7d67dc83c00000000000000", -"service": "00000000000000000000ffff8e5d6792", -"pubKeyOperator": "9251e04a08caefb48c1139482a2e5f0beb695b2b2d0b2250f05af240106fe368b28e96f86a2831858626605856acc1f9", -"votingAddress": "3JWJ6g9fgRcUADGjermEHL7AhZS2", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "731bd21af3a9f6b9715ba6c349682ca2b06a8511f89622dcc05e0c07821d9eb3", -"confirmedHash": "9ae2190913c06c587eb25ef5c96a90bcdd8117b93b23901a0900000000000000", -"service": "00000000000000000000ffffc39ab3f4", -"pubKeyOperator": "146fa2d8f736438c6f48def476eef176723dbb53254b2fff8e739de0ce2ea2daf2c74e8123367377954f6c3dd3b2c411", -"votingAddress": "Hy5oRKHsbwijKNtwphS5B27w9Vt", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "733b756c5401d0141f1df71539885101049c6f1ad6e76631ccaf1f90de404f32", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d58685", -"pubKeyOperator": "8fc158da6ec0d5db896d01349634cd3864a8d10cc1816cead3231e884015655d5d8f5656d23b6736a758e931e8cb2ab8", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "73659e9779982d81870331c03e2df219478333d2c434b58705f05b82b4c8a1fb", -"confirmedHash": "219da3893e56f102f326a471dbae4d7821be1522a93637810600000000000000", -"service": "00000000000000000000ffffc034a6db", -"pubKeyOperator": "12e77f704dc7d48cc6c7f3a572f491d8be390f3ed35a96d05ba5dee6580f00c5628f1744afb57a49b60c34c675b1594a", -"votingAddress": "25AeKPhJNg77CPKqAKKfqpDLcpX8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "73725bb32df2d60d79555431849aae53986c79da721eb6f3d1ab114e7fa15e9b", -"confirmedHash": "bb0b09b67dbebed5edd0f20545de767da3db476c66a4570d2300000000000000", -"service": "00000000000000000000ffff88f37382", -"pubKeyOperator": "944be5269df80a87677dd9c7f6202c58d7b8eeeff712b2581b96956e823f02b7095a0fa27d12f8e10a426fa666abe7d2", -"votingAddress": "43omyYknJ1wmLwKZzisggpKZM4o1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7399c3cc4ee74540d88e176a7ca83f87a4ead97899658661054c68370f0a8683", -"confirmedHash": "78beddd755293d10ea0e5075820182fb9597525056c947681f00000000000000", -"service": "00000000000000000000ffff52d3190c", -"pubKeyOperator": "0d2ae1bf3cec9715c02ae4214bfa051a55466eff01ffa2fa01265989de7e1c671e8fe0efd121377245becbc7f62fddce", -"votingAddress": "2rGBU2YZmpyWQqGb5RYxfuvaFhja", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "73a152b0e80fda89dee36587a662e0f6668204fd07695637a9b176b187ca7f86", -"confirmedHash": "aa2970d027b9a3ba30caf7a893569484379c1ea866063dca1500000000000000", -"service": "00000000000000000000ffffa7ac419b", -"pubKeyOperator": "888fe3b956176c1299297a3ab11ffcb4dfa410b2f1b3e9a9317b3a8a287116e7ae1b952555d695c6f90b03926ea140fa", -"votingAddress": "4CdK57qbgSvhB3hywWVkwhUkbeW5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "73d13ed64affce33b48adaf9a1f49651e946b0715e017a277bea0c4966804b87", -"confirmedHash": "38333c20f176c81f733a3e2c4770dbd1fccd5721475ec31a0100000000000000", -"service": "00000000000000000000ffff50d1e711", -"pubKeyOperator": "8f4e3a2204677875871520fb371758e3f6d9ab16bd23b46d49c114b820397343faa9952c9d50773800879da1c2b2cfbc", -"votingAddress": "2xgwQnBBREXjXifXCuj1bkEFhTzr", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "73d198799f25116c8d0b7ab59063698e7537c87c1240e408152e3240ef16100d", -"confirmedHash": "b60c2dbbb213c99a236e1f30c1d9f41b204f0b13b294c83d3300000000000000", -"service": "00000000000000000000ffff52d3196b", -"pubKeyOperator": "97970798364768872bdef29bd6cb817ab10392e52dfcce325c95e4ba63012f8a45a2a005b7eafdb6ca689c444c3a8218", -"votingAddress": "qFiviwWJMqsuhCa1XHuFuLpNmDv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "73e89b427f159b75afa727b8d13bcd2c6e73a21c498e1bdc1d4fc8579aa3de74", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b01d", -"pubKeyOperator": "0ea292e690735a1b78cd7acdfade389c10594ef31048a3cd8fb6e4747a5a7aeadf221b49e398d23e696d81d1e3c4e73f", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "73f65b52ce68db79a9a2f0db5560edb6915e151cddfc5ad366500937cd268ecb", -"confirmedHash": "a698aaa06fe7a363ec0640a853b189470209949734fbb8ce0200000000000000", -"service": "00000000000000000000ffff55d1f28c", -"pubKeyOperator": "176448aa25c1887acd0871c6865b48b873b7aa531956da2b83f6d4305d063cb94898e7ce21da3e252a404a2033d46a2c", -"votingAddress": "NJQfk4tpmWFMRahuZwFcQL5X5gL", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "740300d846bddd75d439ff93031c42715a708c2dc5ef4dbdfd18c8525bcf6839", -"confirmedHash": "f356b11e74a39cb98c8a0d85938986738df7a5f876e878e50f00000000000000", -"service": "00000000000000000000ffff3353ab00", -"pubKeyOperator": "0c773e3710340ccf022df4782b8abde420028e279fecca79933d2bd4978ca76ad401c51031a1d5f4c63e83f69e59d413", -"votingAddress": "2rdEtCmhY1FX2xWCGzCQvnoCXWuX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7403638ac6849855fcb5d01046ac66303f2024701407e2a700168b9966baf8ba", -"confirmedHash": "270519d3d841e4836b7b6d692a42d8e30b4282d095f213e52b00000000000000", -"service": "00000000000000000000ffff52d31597", -"pubKeyOperator": "01b8b2851b07ddd90b37982e4d98b96cb3f1e895563b5e11dcd747be08de556b25b85230c682c76caad2d05ae519918e", -"votingAddress": "2W1EZYQMhv8DaYzHhgYzdVCqcotX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7405484980717b77b8143db15e0836d311cc93ab949be0b2d86a98b683ccf72e", -"confirmedHash": "bd5645ac5b6552d0199a9ab99ea92caa85fabb753817b20e2f00000000000000", -"service": "00000000000000000000ffff2d809c50", -"pubKeyOperator": "963a5684158950188d214b4597a9a960b233eb7735a4d8876d6731f3c169bcc22ca5921c5178ec4e3fd68fd12c0e8395", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "74120036d18b4e40112bf0be20faae4a3ca35c2cbd4112531960283379f5f58e", -"confirmedHash": "3c4ca02f81aff688e0714f613caa39e2835d133d419393260900000000000000", -"service": "00000000000000000000ffff52d3150c", -"pubKeyOperator": "9888d8e257e399507946de1fc73e45ca9b3cba7909a31fdf47c9097c9af9a2d99e0d3bdf98c675d9b1f0ff963cf59b71", -"votingAddress": "3GAxMyTCSS5gUJSwtjUamQxwd1bN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "74145b0442e1b04ae787b4f38c69bb4cd6800e0ef2a2b217bcae31952586efa7", -"confirmedHash": "203b420d0f94416a61ace28aa860ca47487b444368664fc90d00000000000000", -"service": "00000000000000000000ffffb07b39d3", -"pubKeyOperator": "167ac97e2a62d1a7ac5058b4739407fa052891bddf6a09c78fae0ab145bb9f04101c137d4b2733b4735e18c1c3e0c940", -"votingAddress": "4RJZryx16fifLhSTm2uLh2KXJHJC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "741f2653cfb0099284e60fa2547ea5a6dcd2608feba303d02c53b3cc8f75c242", -"confirmedHash": "58cd2211d3576b50f2b46f0d6a3745b254b75da186f62be21800000000000000", -"service": "00000000000000000000ffff55d1f25c", -"pubKeyOperator": "97d5c5095c9b768d45cde18b2b6b57c46852664ef9c6ed7fa3610489267ad08dfb1fbe1cb2a564e5f2279054571619b7", -"votingAddress": "49SzmQWVnYZHhFoqL5srLnpMxP13", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "742dc6ea2d54c4271b6fe2c2881152958cdd9bff4f4434a1b11aea9ca2fd22ad", -"confirmedHash": "033a40a748eb7726a06d5c5943acd2f9987bd0b8b22ef5020b00000000000000", -"service": "00000000000000000000ffff55d1f253", -"pubKeyOperator": "911255bb393c571bccb4d3ae8e83a07f16b0551451d46e8fa6ab6031c1945d69ac828db7e06bc15ffee9b1c002fd4521", -"votingAddress": "iZd4ECqswKwZajPxBKh4PGPxkpi", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7458f8e9edf25c9114817002e3fc772e707b0ad3dbe1f05a058de939d03e669c", -"confirmedHash": "10dd459ed2a61b3047509fc58829ce0413ab2b8e535ba22e2400000000000000", -"service": "00000000000000000000ffff68f85f68", -"pubKeyOperator": "0505cffc69beb642ff54726ff52139cc18014c6cbc603d46a706ecaf9668db058e7532a96aae6d476ce474c7b122aa71", -"votingAddress": "3DHbEK8JojVicWWDH4D7w4YFhabW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "745cef58595f5e22ee6f1eb632357b4b580209dd24f7b373727445b9575654a3", -"confirmedHash": "c930dde92a4fd037920a0c8d5354e0266ef6dc58dc176bdc1b00000000000000", -"service": "00000000000000000000ffffbcd47d35", -"pubKeyOperator": "0aa220ae52d16b19ba888aba4d9a0e9b3df165e3bf02d1f15c880011519d687bc065dc70582f45b155204a308d489204", -"votingAddress": "24ttq2dStRzXVqVwc7iAXTBinEWn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "745cfbb5115a56487b76f3f6eed7436bb224ed69b02ef69daed92f5a82d81961", -"confirmedHash": "7723fc3c5c009470d185d8704d192da5faa2dde0137ef2f41600000000000000", -"service": "00000000000000000000ffff5fd93063", -"pubKeyOperator": "95d6dc5f338498292b3fcda4d10ed7893a4c8b8a01308dbad95faa90b98191f5bf2a971242aa1b26cf8154455ed9bb5f", -"votingAddress": "2NhQTfMcWLfY8vUtVJjfRT23sVJv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "745df32bbb9d45d380812d4331991d2bdf68f664d69ec9d9f924d17a5540d016", -"confirmedHash": "1017b85cbd15cbc6c391faae360be15319ecfa664347ac5e0900000000000000", -"service": "00000000000000000000ffffa7ac6a49", -"pubKeyOperator": "82a6d7f5810162b56f0f46e48615a7330a24ae2d68ab4d886062d915e0da5c165090da9a928f2b68f4e4620e1e055064", -"votingAddress": "4FwGdWQqUdCMCwWYnPHmX6pB4zSJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "745f6b674116f808f079ee9ceb24d05e8a35d7f85ce96acf29979829cbcca9cb", -"confirmedHash": "6f5b4771a0a2679f12153f0ce89b03d78822d78b51fe4d720e00000000000000", -"service": "00000000000000000000ffff87b50853", -"pubKeyOperator": "8e2059a6b70f39edd27a905c356c723ffd670699667e49899c11bdbc7785a6bcf5438c32c70854f7fd468ae7f7fa42a0", -"votingAddress": "2ZrSaDjURpaJFscc4DF9QBVpt1Uc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7461e5483b6e513d8c02904021a5f81da1d363d8c1a2b9b166263612d2614ddb", -"confirmedHash": "fae327edf957a91323b73e18c3cca7a196bc99786ece70800d00000000000000", -"service": "00000000000000000000ffff8e5de711", -"pubKeyOperator": "0adbe29fc3633b567d4dff52c7383825441eb119d01983333f012cff6edf087476f08fa40632da50a98b4153e7ebc0b6", -"votingAddress": "2MUPkiTKm3ij42XCjgyMV5MRXV6j", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "74666343b23460671d0081ea590f40a8b689b0b3ba55c0f1c9cdc41752ca8482", -"confirmedHash": "e86f8e166e56b8b2a53e33664f859862b7781bf5437040e40900000000000000", -"service": "00000000000000000000ffff2d479e3f", -"pubKeyOperator": "96ab699e6e9d4664cb77a22230aa308ea6d468920b23431e07626a6e017ea252f51e33c73fd08fa132ad96d2a7882fb5", -"votingAddress": "2x9wfnQZsFKnhWEjLypQ8DU8A2YT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "746f50665db7e3bca1d4d53cf75cae41a0597909dc8ffe21a638726fc316da68", -"confirmedHash": "f162d14bba72a06cd4bd5b072c777a1ba2714d2578833ae80100000000000000", -"service": "00000000000000000000ffffc28754b7", -"pubKeyOperator": "1122e1e4d72e2547c928c772644cbc5eabc057d49f2b1a447971b6bd124e7e1b56e3483f2a26e227ed535bfc76a88298", -"votingAddress": "363DbrJ6LxFF2wniavy6umYyDBRm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "74719bb7b61da3d2c4690e4f0444081118c99c0713972631b0912ee3d4137295", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d52c0c", -"pubKeyOperator": "0b7fde2ceb2b49431f11da130953289173be626a132a86510389d1920ca576102d203787fb2f6027245397a42b9e1752", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "747f5ce7b886d01b1abe3e0c75d847119443c9712b92eff1e16961e60c73ee9a", -"confirmedHash": "b14b2fe2f0062c5c84cef75dee3a8d509d22337eb1c1c6920800000000000000", -"service": "00000000000000000000ffffcf9adb53", -"pubKeyOperator": "0230d84f4743a01f8dce761ea578d89b20676f9c0e91bd0dc751132bdcaa9d3543df117d796252eace4adaffcc21e4d7", -"votingAddress": "2cBMTn6GoubR8SEZfaKHi4icCeDm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7484bfc3a5a99af7e76829037682037f563222077ac42756bd56dcc295394480", -"confirmedHash": "5711bd842f9bd6095729c413a0e2e71677713fa8929fd7341000000000000000", -"service": "00000000000000000000ffff08031dbe", -"pubKeyOperator": "96666cf3386555bd9fd6001f09b4ff6d40e5e4d0388e0bda8af6c264901993d3ffb8580fc366f4729d15fbb04df7b10e", -"votingAddress": "HXp2GpuPNX5AqEgheE97JPiGdQD", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "748cbdad29c297ff4cdbd0b3e5ddea3bcbdb0bfd4e4cccc47390d27b51317726", -"confirmedHash": "d32ee03198087f6d4b8534a45c431b228f60f764486e0a330900000000000000", -"service": "00000000000000000000ffffce511d1c", -"pubKeyOperator": "0f5b1505ed46e9855bc7c1591d3a86652f226be839e51fa2d0d5b285d84b738801329022f3bd5f561c6344bf4a357071", -"votingAddress": "tybAx1TPXLYwZGyQytzWjDpGC6P", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7492bfed47cb703d8287badbc12d77076d5b26f92d1a073293cbe204140faab9", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96887cfe", -"pubKeyOperator": "16cefee911d4779ed8e043d4b2713c3bad940f02fa6b7beb789c0c0a744fe3689c4f5a95b3a64178d48cd1ad3a79810c", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "74c95fd74434be1950b1c364d3dc58ec350c8295d49f28e624617bfdd49f2fa2", -"confirmedHash": "983f9c8550d8f7b204deddd2903d56a70dc6777af90321bd0700000000000000", -"service": "00000000000000000000ffff877dcbaa", -"pubKeyOperator": "88c3a8a8b20e93ed7bc017f2768c1cdb123e2926a88e1013615c19cb0014134cb5aa293a6d43da75c5b9f5fd7d3faaa8", -"votingAddress": "bVDvyd3vVnGpuQhmN35ApeL1HoS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "74e6422890f60e48d238ea606290b47f7e9c28d2aaa980b4de47d406ce2faff7", -"confirmedHash": "1362d2583cedc185be1a67aa8c9094baa4d72c94c46684ff2b00000000000000", -"service": "00000000000000000000ffff68eea766", -"pubKeyOperator": "8a9b6271675391e46e2bbfd963590e5f5a88929d586256a3608385a423cd3005d370ba8835eba8fa4df101824de3f670", -"votingAddress": "2fLa4AUx2hX77YT2abtCGrW7jwcE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "74ea93bb5b2d6bea7031e8ed18e8c097749beab183d03a070efd76560319335b", -"confirmedHash": "bde1aac66e556a06a363b94846352fbf6299b142bdb2392d0b00000000000000", -"service": "00000000000000000000ffff8bb48dea", -"pubKeyOperator": "0e6007b8598cbac2076c0f46087322ce506200cd2e12d5ed1c36dcbcf459077a5700807dc4923237a57259c70871ff1e", -"votingAddress": "4Qy6PsfdUMqgE52BpUv9vTpbKELq", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "757df214269c4f98fef4a7966e3e5d0b457d5ac364768dcffbe28e3801d3a962", -"confirmedHash": "92e88e8c6db10d1940f2ac18144fe08855106086164582001d00000000000000", -"service": "00000000000000000000ffffc28751a9", -"pubKeyOperator": "00b4d2f35d74b8c68e626d3505514abda2105640492411dca22c7f713e0f2697cd0bed28c357c8f83eb60024db08c7e3", -"votingAddress": "2NTGFrFddLGtRcxt2HMpkhn2tuK2", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "759616c2ce5e32c9c3f62ac08ed25184c6156035bb5ba1a2528b450c963321aa", -"confirmedHash": "d0d5d77f71dccb2f23977864f27e7e4085538bf758f2cd8d0f00000000000000", -"service": "00000000000000000000ffff44b739c0", -"pubKeyOperator": "88dc8ebf0ddb164c5f3d1e53153e5c14f47173db5b1d9177f127cb5daa31e5c9f614e78687bdd73cff7c396ed4389f67", -"votingAddress": "3wxP1ewPmDnzXK22c5ic1N8HyNjv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "75989e8d42a97fd7e92667926bb52832a38fb04911825f608934e8630da16234", -"confirmedHash": "f1457b74fb1c9b099faedc8dd40c2e4c977bd0c95d4f33ae0100000000000000", -"service": "00000000000000000000ffff179800f6", -"pubKeyOperator": "02824fa74eeb348eef665cffb5dd1dca9acf2ad40bd5b694884efa48242898b4ec82a7903f2c25097e117ff3528eb0e9", -"votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "75a6392672a151c6258b46c956dd93dc6ff2f099ec55f9595719045b8d202e54", -"confirmedHash": "34b21e18e8cda9b93c22ddf66d9c3efd0884937d8eaa3f8d0300000000000000", -"service": "00000000000000000000ffff42afdd48", -"pubKeyOperator": "156501a4ff7fc29cfe8087f6305fe269fee1dee006e88bae109411be85cdd2df53f73d0e9081decf869d894348b71da7", -"votingAddress": "3nD4vMVeve7WfSUTwXgMCGfUxqPS", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "75a91112757f8d397eb7795cd92ac72bf8a7249d91ac78370ba5e8b28475ca16", -"confirmedHash": "fe2af33d4f88298679cb3908eabfc19ff30bd907775b159a0100000000000000", -"service": "00000000000000000000ffff52d31944", -"pubKeyOperator": "85cdfd7367bdf06e8fe870d98bb071f731b1652c63c643800aa59adad12f360291d40361faa1d463708a01afae1c1496", -"votingAddress": "3rm1xF4E51XeaJ37kGmSCsi28EHR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "75a918986b023206109ecd505e638df542ef83480f7d4991d83b4a4029747839", -"confirmedHash": "c4f6fd056144cf38aacbe88d99c845e6c784bbdad01310c01700000000000000", -"service": "00000000000000000000ffff2e04d9ec", -"pubKeyOperator": "87aee21636298ae98fd149a65cf5a239d5469832f430bce0a04da36f9a0019aec7d76dd80c5652c7ff0e4374e19e45ce", -"votingAddress": "2ADteVBiho8cpzvgpekdSV9sna2J", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "75aa565b159bc0ab20fa68ff5d2e4b7fbdef3d0ca53176718a319784c478d5e4", -"confirmedHash": "1f2a5435c84bc3d574ee7919647a94eaec4088b82fde19821a00000000000000", -"service": "00000000000000000000ffff95388ea6", -"pubKeyOperator": "841ee3b939d93e89226cb383d8605c50653632c6f55f12ea6b6bf00e9a366e2693b31fa761e06dba9863ed2f9e3f5704", -"votingAddress": "32WhWMpc8i6WLpXkW4gfc5a7nN2d", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "75b49121904e872d0ffb8be531a2657f7ff1163a02a7fe887f3e4a6af8afa2a3", -"confirmedHash": "fa1ffd063b3f985800859e12a4056b758068a740f24ef92e0600000000000000", -"service": "00000000000000000000ffff9fcb13f7", -"pubKeyOperator": "957ebd552d5244c52e9722a306af2568329fe576979f2c60c490efade6ab9a27fa93c0676a2c4205745cd0688c8f1ded", -"votingAddress": "3jEBzweGpmLDv2GBfjxVae2S3kxa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "75c07d085e9bc307feef0eece487e6d21a400c9f34fab8cdc0efcc10317ec309", -"confirmedHash": "a226e69a5bfd401292470fc800bcea75413cc4fc48c292550e00000000000000", -"service": "00000000000000000000ffff52d31925", -"pubKeyOperator": "9526af7d5e2f38025ea28720b3f515456d8f7a6e60adc1ebaa3fd96e5f7a8b6a6cabfa8fbe08e41b52caf57ed3d2084c", -"votingAddress": "2zDhx8AzkqNPUUNgAHcWDeoaSSqn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "761bfce9a084d7960c776c46f9ac4fe1cca099f147ea7251859e9edfc97baaf0", -"confirmedHash": "299d4eaee9faaaf602580079ddf218479e5708a78ef2c01c1900000000000000", -"service": "00000000000000000000ffff88f37385", -"pubKeyOperator": "0c86cebef43bc0e93014ad2d38cda55085af4bbd5d7191e7728ec50733ae6a21a42e2d598abfd4e6298e4d263ecaed75", -"votingAddress": "aVtFXzHDhXgHMHKeK89spetR3Jo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7625e427de0ada8b7af434467b650ca1db49e7aa9c2bdc5559946934722a67b8", -"confirmedHash": "057fbd4b8a854e3970381e832b1fbd9607ca752b1cd5b31d1400000000000000", -"service": "00000000000000000000ffff8ac58870", -"pubKeyOperator": "1352aae3e4c34031988f0a4fa04916d6346b594c625e5bc432bc5a298b1605fe6bb25aa44189194cf61de01f1178b6c8", -"votingAddress": "2iYNzK8q8vBa5EH7x1AjWwik3ARQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "762c5bc39597347dc3bb6a78f7433da66e6f0056a93db4bae14ad743295aef36", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff8491cb48", -"pubKeyOperator": "8a883dde54a8ed470a066b63a2715372a85e1304076a7c5211e46a7c47d38d6ecc8a872c45336e7740e784606ef9090a", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "763138c622ac9c9807ecb5d69bb882dd4ba2690deac24675cd4e9124d2a4f493", -"confirmedHash": "fd15be3922495f07baf6b0cec05286b08e01bbd1b0ef74b70b00000000000000", -"service": "00000000000000000000ffff86d1c50f", -"pubKeyOperator": "93eb6685495987279171cca7537c7a41554ac8b791f75e1c2decd8a80125cb3d8fb08745878b763e81625991bc37f6b2", -"votingAddress": "4DZpTavTb3u3Xte14gcSMJuUFCc5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "763f43fb970358000d76919f67cadf97afdd9d1d22bedff4883b3b263114504f", -"confirmedHash": "2637304a36e8705f512c6a6022293a681d68ba521ffe083b0d00000000000000", -"service": "00000000000000000000ffffbc28b840", -"pubKeyOperator": "03759eb3b6176c922a36460f2e596f81a8cf4ccf162ef38b3fef4a8de98f5c7c818947030363db53226411d34f42fe34", -"votingAddress": "oJjuuphwqNN1kctGZXYLaQDc3AG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "764b523f6b5334fdc665560205c18e043314fecec82680db26744d61fa553af5", -"confirmedHash": "11826648ec9ade645f7596c033452d78fad07213865103281d00000000000000", -"service": "00000000000000000000ffff9f411f41", -"pubKeyOperator": "847a2d9b2c0c48408164f4953284351725a2f19833da31b577a4d708824236496125c817dd9408346378ae983acebf4d", -"votingAddress": "2L7mn9SWvVSfwhnprhS7UuattEdn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7674c189fc22da827677b965326a5e4aa8bd7336fb08ef15a432e8c97da1c30c", -"confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", -"service": "00000000000000000000ffff453d6bf9", -"pubKeyOperator": "18ea2d3b6f64ea54e10f24dbf56df0615e4264d870afd4aaed6579e48ab53b00a3419e4dda48decee8ce04fc9628f72f", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7678d387e33ef3daa25c4e7c3e62d8df6daf4b2afaa2958298ad8f5ae0f07898", -"confirmedHash": "e75fab773b13bdd2713c24ed210153a77206e59b738a72991100000000000000", -"service": "00000000000000000000ffff4622ccbd", -"pubKeyOperator": "875d313d2197e822a866a414a060b8033cca3e711a709622eaccd1d59dcde44e26ca14227e5deb36573c2eecd382ab0f", -"votingAddress": "uzPrng1WJXZuPo1ZATBwwV2bT6k", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "76990d5ed3cf34a1b020fdeb7df2c36912d66d649350bc92a99c46a8bcbed76b", -"confirmedHash": "be07ee55e45e7ac1585c923f114ec777b10b9fbbd76231c40c00000000000000", -"service": "00000000000000000000ffff55d1f1cf", -"pubKeyOperator": "0139176c8f1f195ca77284dfc7a5313717c4beb6aec5001f4cf804a05b8d9e391556d93f447325d40b2bb8e536d61f9b", -"votingAddress": "3rG4cJ5aGmxAaMqV5khwGsViVgBA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "76ad8e27b02bd27a464ffb3332d91c05ceaca2aca6af447026d7a6a5b3d7995f", -"confirmedHash": "a226e69a5bfd401292470fc800bcea75413cc4fc48c292550e00000000000000", -"service": "00000000000000000000ffff52d319a0", -"pubKeyOperator": "12cd79728758a002a521a13d0542e9f1231dc0d92252814831741fcfb0773f96a10f066d5359675964ed60ade22e8eec", -"votingAddress": "4VQcdVCntjgEQkcEhBNatX7MjXUX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "76ada38fdb1aab253308e58fb57679658f0fb4851b4a30e936189f3a9c1fa23f", -"confirmedHash": "cedc00f0912b5e1a88a2a4745218334ff6f789f4cd18c1ac3100000000000000", -"service": "00000000000000000000ffff9f59ecba", -"pubKeyOperator": "920272707925853d8dc4678c5d0d804cb7415464825eb1e3a16188d4ce1b9f83ceaee600d83084171e910e9b13ac3a35", -"votingAddress": "HveL7VWpC56mqc9nArQMAijzYgq", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "76bc9e02f9d0ac7d988fd00abd037e138aaf97a3dc5a195f0150b763ddb612b2", -"confirmedHash": "4f72923f38ede41adc77a8519b51900ada60bc6593b1788c0700000000000000", -"service": "00000000000000000000ffff4f894754", -"pubKeyOperator": "8c52702e2dd0cc2332d21ae4091c4d5d959d78d4304a296ff22cb4e4bd4c65d5a865679c4cae370b9b8b1d30948ef44e", -"votingAddress": "2VnNPamwgMwv64p82Pd2PqZhJpse", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "76d1c62ec4a2f49c5ee79774c3b7f90ce293a23696358b18938395833c133049", -"confirmedHash": "a1c4e4958182fbba80b3177bca14b06996e592fc29d32d414100000000000000", -"service": "00000000000000000000ffff52d31915", -"pubKeyOperator": "99e62339847d6d36b0eee5ffb927f1660debdedbaa9ae0ad6b748159c91436ea5a5da6c75900b2e96304b5c10168dded", -"votingAddress": "4BjzHsrUicdqyLtfB4eCDNStXqG6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "76d2803c7db1990df86a3dd37349cbefd92ed0ac75556e6eaf779886125f495c", -"confirmedHash": "d70f5bee9b84a7c75d9578d3e374077a3078f46ec38ee1a60a00000000000000", -"service": "00000000000000000000ffff58630b13", -"pubKeyOperator": "8f199bac676465c83f018e27b3934cc12cf8d63ea32ecd147cb814846888eecc16d17ad6a4cf1629e3d52398ae28720a", -"votingAddress": "24Dcirds2eagacfiwsVukFVeZ63E", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "76d9b8631b3dfe0392447dc17469df1659091da47fc2739ee65a970f11ad783e", -"confirmedHash": "e17e82f9f7316c3b56df30101d7feef8e8a1f3c1cc622c761000000000000000", -"service": "00000000000000000000ffff88f38e24", -"pubKeyOperator": "8318f8b40a577512a8d507e8b72855103371e238b34c8cb1cabbc6f9b2da021676e7ebbd7c27133f1779c65821ed64d6", -"votingAddress": "HeSWpDhoq7H4D4WS3uS4iHhxUMG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "76ebaae24cb0fc7c0365cac229d6dd9b17cc50a62b46d99f4c9151a4315ab9cb", -"confirmedHash": "fb1ccf7902c6ab753a271dac524796ff009514ebb7aa23982800000000000000", -"service": "00000000000000000000ffffb9e45371", -"pubKeyOperator": "05fa562a0470028da4df4a35186787680ebd36c995c0da815abd2ddc6ab9e95769eef7cedfbf1640a5b3c16b119a4ce6", -"votingAddress": "24eA8akAh3ovaqQ7uVrLpkkfyyM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7700d023df8e9e28201e9e6a25f7718f11a0523cc8dbe10adffa5fe17c1870e7", -"confirmedHash": "7956e60b45a05161b3f2f5a9ba20de36f0b8caba4161a30d0500000000000000", -"service": "00000000000000000000ffff92b98e10", -"pubKeyOperator": "971f2f49a459dc1788e2ca385acc59edea7c77ccbb38485e4bd2ab9c94caa388dfa080f916b400c034123c65ee284884", -"votingAddress": "231wpx3ZVCMsnWZmuVMxzPQh81Rc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7704345c0c5ee9f05adca8d92e657d9c654299709328ad832566b44aee248915", -"confirmedHash": "7bb58de830bb7849b7e9f2886d0c81fa9c35e4728437fddb2f00000000000000", -"service": "00000000000000000000ffff5fd88d94", -"pubKeyOperator": "893c4eb6f038140fe0a0e3715a18e386a54c1ac58fb9478054a0f4297af72bf774e925acee99733c7c101183d504c5a6", -"votingAddress": "3nvGdW5eTcxk25jjoNRNh919Zacp", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "77196a2479a9d16375162b6429201098753fe4673dca5c2a42c01900303470ba", -"confirmedHash": "ae75017fb84c29becddbf1a44cc66fd8dc1d203b3f476cb72d00000000000000", -"service": "00000000000000000000ffffb63d2081", -"pubKeyOperator": "0549f540785a61e28422f3f9834d089d912ad87d20f7ac363f472e9e81a5b0cdda7865cbcc693aa5e44afc655b579479", -"votingAddress": "3JiptXYQ1oCoXLsMf9bPA2rXdpqu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "771d5d288c1148e6e4c80dd7ead9385e335fdb47e023a56f3ef5d9914345ccad", -"confirmedHash": "1cace12d73609b8cd6b314e0bbff0e695bd262f2315d74fe2100000000000000", -"service": "00000000000000000000ffffa5e32b36", -"pubKeyOperator": "11e0564192270ffc88307f66eb53b1ec2ce48a71844dfa73d955f021bf3c0d357781f74c1a45d28d50965ef1eb0a2d5d", -"votingAddress": "3nPAPPMycMFbFzwdXw1MBHgm6zgh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "772c9bbd1cb4d1f3b9facc8c566c6a4e8a00fd861ef1f472e1825ceb6e72ee67", -"confirmedHash": "a5c437298164758b321416d1c3b489cf5ea94307d96e32280c00000000000000", -"service": "00000000000000000000ffffa7566eea", -"pubKeyOperator": "01e1d7f2b9bce8d9260d4c6e224b2b9c9ad844dc182e4cb41074da2337a5a3103706f1467dbf420f88d5f21199536499", -"votingAddress": "g6ZrJ48QzdBmNMJxThM2ivWmrjq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "773dbcaee69467dae564c92d0db6858088a123345fe048edaeed2faefefd574a", -"confirmedHash": "5a99eb8b7b5a85dc1c779e71ec42beb4d37d2ca3195bec540c00000000000000", -"service": "00000000000000000000ffffbc28b247", -"pubKeyOperator": "8a872082e84fd098e8143f07a4a9a4d2db96bc33b170fb393ae7b9017d44427a69e39350751b15f6a72ad6e60914a670", -"votingAddress": "26MK9LGcJvMP31h2jst3CEFUTqcj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "77446090dde4a38478fd71f91d23f72819e4367e3bfdf6f983821e9cece99782", -"confirmedHash": "ee87ec3926b1b60e4708c1ed59145def26d843dd923d70180200000000000000", -"service": "00000000000000000000ffffa763b293", -"pubKeyOperator": "09e70f206e2d6b25e9ecc4f4c54f0d7d2656aeea0cf2d78e18aba78ebe950da87dcee01652440b045b2ad4e00ccafc14", -"votingAddress": "Bx7qCwS6F6C5pCtgMckVxRmUKY9", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "77476fd1846d5ac18d0308da3cc5f1fe8d3ebc0ec76b0bb285535fff571c993e", -"confirmedHash": "77fc33252e0c313724bc1b8cb41103a0bb16125aacff11c22000000000000000", -"service": "00000000000000000000ffff2e04d9f7", -"pubKeyOperator": "838f0d9d3c3ed05b49a19ba5141ddf1e67d8188f3b63101c97d413dfb8675268c41561a04a15c3e9e7834769e68626e3", -"votingAddress": "AJoDvb9Ln5VRr1hDgpQaFTj7rQ4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7769de195d5587e944f4c72af730d95befbd7cfd2038d711929322a3b4db0b8b", -"confirmedHash": "148a2b39b28bff96adcd555c992d64b4cc026b4191b4ad4f1f00000000000000", -"service": "00000000000000000000ffff8b3bfe0f", -"pubKeyOperator": "0544e6f1e582202b5a11e2af3d59e326830bdc0836817a1edeb71de6f5dff02da411c9b819488fbeaf17276652760502", -"votingAddress": "4YYK62RDu9ARyjtCwdrJEk2Crt8s", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "7780cc45b89d27545904c29bae74c3ede5d705e9ac995471da90180c9ddca33c", -"confirmedHash": "6330e1b93c8b162d288cf0ff4618c32931b1afaa73f7f8d90a00000000000000", -"service": "00000000000000000000ffffc0a9061a", -"pubKeyOperator": "058093726e73ae06184e4303e169e05f5e6e2b51305330bcadf92386c3aac9e2906a7b6b3b4c9cf9c13c9a8a1f311d3e", -"votingAddress": "25AeKPhJNg77CPKqAKKfqpDLcpX8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7785fcc344d236b85db1f2450580bbae739059bfed03b27175dd1cdef535a623", -"confirmedHash": "2cb2c9d47e145965a4ea9e6cfa6080633971ab8a8727d92d2900000000000000", -"service": "00000000000000000000ffffbca6480c", -"pubKeyOperator": "99f538adcd12ea1556ee9f590192e35a79bfa61bb4e414f52a14231367384ec442a436fbfc716394fcd241977c28773b", -"votingAddress": "pXW4K7H8iDzPTtwSpUQRB8kQkrc", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "77898628fe6ebd3a2ef9d8ead0ec963f0c28e979fd129c1961091813a45ff544", -"confirmedHash": "5ed4f5fc30e936bcc9c149e0495d75962417f1653c1a2ce71f00000000000000", -"service": "00000000000000000000ffff52d31909", -"pubKeyOperator": "0c802fae7c97ee388645e447bd980112271176aa746b483c2b0aa21b96168066b99fb5ae137fe4c94bcee9a981db4a29", -"votingAddress": "3x48BTGdzXxp8wyyHvYgUvaDeKL2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "77a97f7cac8a142da61f63006263a4dbeb11ebb14341d1ba8b768c190da3ff5a", -"confirmedHash": "1033e7622144db4dfa155a51cde5baf5b0744be0a8475a5d1100000000000000", -"service": "00000000000000000000ffff55d1f1c7", -"pubKeyOperator": "835f8aca7b3a8b31857a58d1c04badf2ccccc9e6f42009edfeaa857921ba1657e73c86396486649e47a45e1b7ed184ee", -"votingAddress": "H7LRTGu2NA6kzZXgYRHyG2eZgPf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "77bf59e9902c4e0c96ee55d56c176ec3fe6d2a3040faf208e2f0d1b68575d06c", -"confirmedHash": "c0e16a3ad830af9164ddb8e805277d70eb44c3a50cce6b9d0100000000000000", -"service": "00000000000000000000ffff8bb4d2f9", -"pubKeyOperator": "11bcb3266c44d3dc0b3e2f0e4a684f07b27e53dea63959b437bb56f6b13e7dba9a8d9c1481cb0d48b72a65f1488df4a9", -"votingAddress": "2tPC51zRGo11YqrTiLMBoZkLGthF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "77e42738f8701d8a0ddf5b20fc269172d4137558e9f332bb722d03e20aefb46d", -"confirmedHash": "51866b4392ef638fbd2e1b4fae91e3d8ee93d2f10a28b5b51a00000000000000", -"service": "00000000000000000000ffff5fd90670", -"pubKeyOperator": "1130455b00034d7cbcef899d3ca03ffbc44c361e950db2c04de3cad0cb49d7004a832e85ab7f5773ecb13282ebdb422f", -"votingAddress": "2sxnQed9RGt2t84YwKSQbMoYqhyC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "77f157cb75dee0536dd3599c51092ea4d2b82d6eea801e658b488ecdc21d280b", -"confirmedHash": "03f0845cc725e095b9b80d99484904ba1b9eed996f1db2d12100000000000000", -"service": "00000000000000000000ffff80c786eb", -"pubKeyOperator": "93007b4957419ce32723d1d515ded2e9783e845d4e579baee001f503dd4b6e031122ace43ccfc6890cad6170423d57d4", -"votingAddress": "4QYHiLhTkb6v4fMfpWkW9eggAQSy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "77fb3f94bb971ca614bfbad69230d6f6aa14625bb8970f10f05d7502d9aba0e6", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6d37a", -"pubKeyOperator": "93e38b5afa021b5f2826a4a9577c154f8f63558521636053d74297a7e7030ec86792924513dfd923bd8f9e25d09a2244", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "780de20612080bb8c6783019f0cea24d923c807b8c8f7f11c146feecff25437f", -"confirmedHash": "ddf165be06772c606f2501a8c92d42933746d44e0723da420500000000000000", -"service": "00000000000000000000ffffc0f1fd48", -"pubKeyOperator": "0c4b199545f7eaa5bed7060f4f2dd30302ae56db001868a4df41c9fe056c346da71151c58faaa4d06b5bbd4deb7d7fb9", -"votingAddress": "3TZhVrmyW5PePTAF5xvqGcH3mtnz", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7813c83554028f4328b67239ae7fb7e5bc470b7233f7fd816a8fe6f1efcef4e4", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff849196fe", -"pubKeyOperator": "0f52bee47520f5f352f823377e88f25d04ed48236373b41118d9ff4cc3cbef91569ed5b0c69da0f8e9d3b46555f8e47b", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7823a83f83ed586e33ed2bbdf3fc8f4be28e0971943bfee6a910dffd1294c7f3", -"confirmedHash": "2c5ba6d60308ffe90ab3cdd41c883c717cfc12719d5e2b1b2600000000000000", -"service": "00000000000000000000ffff6baa0792", -"pubKeyOperator": "949176a302960e4b71cdc8e661b9f1c5336fc8c9e9937cc8a1b1a10a55056408f6cfa346ba88a11a26ec9ecbdca592e5", -"votingAddress": "45QnYjZWhuLffBCg1N6btoTu3Bt7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "782f4cae14a6068866093491b5a12e0b19ce5e84d5e606ef00d0bf67bfbf8aeb", -"confirmedHash": "92312c3ae8b47bb1d187a90c6fe4e1d96c3eb5db73c7ad041700000000000000", -"service": "00000000000000000000ffffcf9ac040", -"pubKeyOperator": "92873ba3952351992735a11af7b85ee9c4637552cc2effb1a2d69fe70c0760302a822b2a12b12b9f4819f5b22fb9d9a6", -"votingAddress": "46R5JmG6A8mfdVYqG5b3pXnR8yjm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7838bb40bc802a6dc137c5505bc0de1ece9161af4b5910a8dbd9d6021da79870", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b01e", -"pubKeyOperator": "93d6ee77e7476cee3093e9592348b86e7b75262ec29208b368bae3532e98f2061f612215dad0525de00f72af813e1eb2", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7852785a31cdc762b63905eae6da4da940eb84d04de405388d4eb525f20f61ca", -"confirmedHash": "6b3ebb3eaa279e9d8bb3014cb7ff271fb6fc32faf65d9e081c00000000000000", -"service": "00000000000000000000ffff88f38e20", -"pubKeyOperator": "850938aa1888f8db7426e2737c40a1dafe88678cfb3e94d6529eb0d9805bea38af95421bca2d40f8dfd521f981f0e4ba", -"votingAddress": "8hbJGKGrEA36vbKCsX7b46D8TUc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7854c20ad9e0fd232bcfa01e51b8fb9a9f4a5e07506c5c1d34db8e005dece032", -"confirmedHash": "cb690a5471cbccafca5fdefa4fd6b3b54222d80f1eeff4c91600000000000000", -"service": "00000000000000000000ffffbca616ab", -"pubKeyOperator": "905196683e604bb26950da6f634780221130b58708db48b373e5e8356b2e316166277d0fc1d6a60c1402626fb6c75117", -"votingAddress": "3EkdXVDfNJ7KwX84AaBANbNpo3VQ", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7880c4325994f5b0b9ec6de4ccbbf571365a56858d5aa7c7db0936f4ee28ea71", -"confirmedHash": "4d7c7b37588d78cc460e6f3c49e67bc5f4a5c8c1986404650500000000000000", -"service": "00000000000000000000ffff44b7eb9c", -"pubKeyOperator": "9142e8c95a9cec5b2bc0ae034030b0f8fcfd4818982184a79d5d29d67361e04bd6ccc98247c4642710f599833fbfb796", -"votingAddress": "3qJL5eCd2eRHLB3SYxJ1AifGYtci", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7887d242066518b86d0dcd112ab6c1eedf57c6548969182a03e88e33b39c470b", -"confirmedHash": "ae0b8465c432c9b464fc4a034dedb35a451c1ce7a56da78e0c00000000000000", -"service": "00000000000000000000ffff52d31511", -"pubKeyOperator": "8b6b3df1c2bf61a0f4b160154afbd15826f1e6fedc2eb2d53fb998597de44a096f427b7aaffa2564b0d2ddbd9ba774b8", -"votingAddress": "oqtChYro4eqyDBnUSnDS5f2XaW1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "788e13cbcb4f6ac00548be5d8da1c7346a7e9aa1d03cb4fa6129bd49f3628116", -"confirmedHash": "ebff57945452011813c8be51358fedd2bfda04daad27d6be1200000000000000", -"service": "00000000000000000000ffffbc28a316", -"pubKeyOperator": "0f3259ec4809c32a0f73923c19b549ab2bb22ef7b3af8ae279876e66a103702adad4c5630bd13ad5d369420d54fc6a75", -"votingAddress": "3AJX8VP6cJX9xKZbfNnSN9xVriMD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "788eb41e3bc1d4d3114f14d23248e1d131354b638099f489011b1baf6d4f0210", -"confirmedHash": "e79a5e82f93bc9ec7d76246b2e821861700b7a1c2a4380841200000000000000", -"service": "00000000000000000000ffff2d207377", -"pubKeyOperator": "021f7f631d2e51ac71be562d8b8e085af4ab141417a29cda7400b4c0adbf39de163e232a432bd7faaad76b21e8d5ee88", -"votingAddress": "2AtUfhSTewW2LypyZ1puyhydhz85", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "7891ed71c52397c2474fbda2866f2631c925f12d88e7baa521d78e1464eae8ca", -"confirmedHash": "a10436edbf04db8e17d5c8898d087ffcf6a713ff34c0a4352e00000000000000", -"service": "00000000000000000000ffff52d315e7", -"pubKeyOperator": "0e70519ed62505531e3dccfc8b463ff6b1fcdcb908ea0080934f966eb33af63d37e3906a07766d632efe990a25142765", -"votingAddress": "ELXQhkDP4sfp3Sg4YcjmizY6UMh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "78cc99a190d7d098309caad5b798d11efd6e0aec1a4d4f216dfbd659e617c81b", -"confirmedHash": "a2af6fa1a713a0fe0783bdc07a12102b5ea79c3fee06bf390f00000000000000", -"service": "00000000000000000000ffff9fcb2ebf", -"pubKeyOperator": "94776712b0bc5289b4ed1f8de34d8a5cd132f4393c36f035d73afab1f800414474f7d4f743ec8a2e9c650d58ca5437b8", -"votingAddress": "4Hmbm4xJx6hVY7uEFKBRmwyMGm3R", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "78e3b02e05391adb953e15d6bdb3daae616fde0c1a014d456ee010483e58f300", -"confirmedHash": "e6af515e3e1d9f79147a96f98fb29e8f690f1bd6332337042c00000000000000", -"service": "00000000000000000000ffff52d315ed", -"pubKeyOperator": "8766cec62bc40cc9b83f395627514d94780ffaf2c5cd8f8d5abc09a99b89c3009783c48f35b6063e7ec0ded6f14b04a4", -"votingAddress": "3DtLDrCCfHeG4MrJGXP8RenDJNxy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "78e51477c9066ab718ed1204236c467104a8a1f2e58e87c95eab18cc883846a7", -"confirmedHash": "9ee6ac0bcfb85475eaf82a0f5eb7617be4322c5c7adf78280000000000000000", -"service": "00000000000000000000ffff50d1eda8", -"pubKeyOperator": "0bfdd6f1c7b313019a7237922b28e7de8375c690d83ff8e8ec287fd859d8fb4190e3599ab51a651a52fb6b89cabf4eed", -"votingAddress": "3MDjDRjpypE1eLVXFmFSoCL7J8JX", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "78e92a46edc47563f7c44c9b4f38d6fae76c8aa578a04b88c118447c36c90d73", -"confirmedHash": "06a2867e36d150643de89d87c53c9b6b9c6a195f78ed8a580500000000000000", -"service": "00000000000000000000ffff52d319d5", -"pubKeyOperator": "09ba528c79d06a9eb2adbd40a993315c3defcb11984ed6e2b880f4059f7704d21db555679eb7a7205662bddc0f2316e8", -"votingAddress": "2UotFMjsRXL988mvijs2mYuUknrq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "78f3de19c9f76fb85806597fd1cfc5b2c6600e762256c2b9d6bebad2bf488410", -"confirmedHash": "60e0f3fdcbc47cd038384cc747e163d00ad92e094b2ca9712200000000000000", -"service": "00000000000000000000ffff52d315b7", -"pubKeyOperator": "0756859f4ea8be341328f411b2e16926cbdf96648fa7cab5eb8ba662d6d58d917fc7688c1d9147e2390d5349b9604ace", -"votingAddress": "2n35LUJ5w8txrffbH11UNh6LMENG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "79021b92e07b79b1d330e00af3eff95b209ad8d7d2df45a036cc429d8d43e559", -"confirmedHash": "60a2ebfd6c888dd1f0c12019b164d2d7b6c2b27034685ec70900000000000000", -"service": "00000000000000000000ffffbc28cd12", -"pubKeyOperator": "0ff373bac90753ebce13ab140717c941a07879494f2fde97950b7493f8af78b35dd80c840301c1c39ed4d2e437bed8ce", -"votingAddress": "2yG3P68TWeTmc5gEpC1p4thd3VBu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "79067784238651776b18f9a619efb7684c9cd49183809f95b0e348558b8a6be0", -"confirmedHash": "66f0fb7e2e463b7ac91f66e527268ab97c0cbbbd3e371c100f00000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "3GKH6UPKsvwVABSXHJYR8FTQkMFC", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "791cc76f3890fc5be2038e39633584cc67eeea76119d93c030826676f284240a", -"confirmedHash": "5b561fd8acb73c24cef8f61c66bcca92ea73692397d3fac60400000000000000", -"service": "00000000000000000000ffff2f387614", -"pubKeyOperator": "90dc1215a8de8234ee8b2d45966781a40cafc93cd204e9eb1955d0549890ec7fcd2eb13fe145c52b7f3a81fa63edd8f2", -"votingAddress": "48tVvQnwE3R7NZEtTvsQNxYVK9rQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "79257eb728f2ffe03debf77bad4834fc58b01d36c6691773d930aa7f5b0c454a", -"confirmedHash": "16eb2b4ba60eba21f8c09b26dcb88aa00619c98f01d60ed00400000000000000", -"service": "00000000000000000000ffff3326732b", -"pubKeyOperator": "8d28ac0d906364061f85878b5842afa164e76e982ba0cd31735abe614d2af9ceaca3cc3f83636285d088443826b284be", -"votingAddress": "rcAdSF8xA7F4V985LbW4jYHmpPB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "792838d279b063cdb91ecb5457d6008ca5f3af28549cb24efb0528d08366f19f", -"confirmedHash": "816a43cb8d71a340b5af39e2915301bece1bcfc4414e7d680e00000000000000", -"service": "00000000000000000000ffffb29d5bbf", -"pubKeyOperator": "98403abb1dc9b7b0ecf3de0de934fa3e2a296ddf452eab0732c55a38752820018dde02dfddd316d4bc9f4b4f37f936db", -"votingAddress": "3fhnpX9w8FDSV3Q56xVo4sn3HogP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7931ed4036b4bf840791ef05f973fb94bf1895da13b0a24439128d191e1b0d6c", -"confirmedHash": "b9cd57c8f28b525e1e057fc7c615c8c80645f4be0e8638090500000000000000", -"service": "00000000000000000000ffffc0f8b390", -"pubKeyOperator": "959e8bd506a9eb15e15f818524a79992320f7a19ca58b559be27aa3b4d2a2593b6672be5aedb45801d9147123ed9702b", -"votingAddress": "8NKJ8jAWBW1U1LB8fxJQPT2dEuc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "79431c8e463a17ce739f779bea465d1f992fe8b4ff0c7002e3a3bb04b5627c1e", -"confirmedHash": "947bb755902c8b40ec3102424069e972ee7e82886f37b48a1400000000000000", -"service": "00000000000000000000ffff5fd89140", -"pubKeyOperator": "98a63620636ee2fa407a2185e02f63a33708f4942e1935797ecaf439247f03ed3ea0466e4ef195f513059f2544fe7704", -"votingAddress": "2akGmhJyBj7VFmjXnuQuTKSXTmxu", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7966de098c8b76389bfe58be8e9e58dc1917e76341606ac3d955a02cb67963a0", -"confirmedHash": "f9112f96cd322382fc5291ee2a765f0d517ac10bb766447d0100000000000000", -"service": "00000000000000000000ffffbc2815ed", -"pubKeyOperator": "08f5a78a23063d060534bb4e90929362b984cf95f496068d8fa75fdc59c1f8d272a668b976bc553bac7c63d8c59ee40c", -"votingAddress": "2ExeHuNsSAFKZaMQgjPSyeWKvXnr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "798572d9040eb21054a8713e1726c963056c98025442c1c8e0d3320c21b16aaf", -"confirmedHash": "f4bf489ab24824e05ce0195ed67c1838e2d3efb8a56fb0f61900000000000000", -"service": "00000000000000000000ffffcebd145e", -"pubKeyOperator": "88c1b96ae1de1c5bb4189b8404afe7726342f4f06fef707f8ee8752b2154a677aced08d6354eaead10a01bd30a30510c", -"votingAddress": "3g7uidaivawpPZAF34amqZjo7yEP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "798e44264630a411e6f8e12eed51060dabeab18af0c86ee24ea450d129054a78", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0b4", -"pubKeyOperator": "82b7e5f1e68ac1e8d1981c41defd50cf416088bb78c0d463212b96ad1c9fb49ee097363beb678f0f572896fb165a3820", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "79a3eaa056952d9c139507e71f15c25cad4d422106655e6a678da96deb81a19f", -"confirmedHash": "fe75f459bae27485294ea62df2d7f7bc0e90d9f0f337ddeb0e00000000000000", -"service": "00000000000000000000ffff9f419b5b", -"pubKeyOperator": "9525a9a3eac9815d12fbbdb23ba6f73e476873032e928aca5e95130722dbd01e9f12fb2a2538c99048a645cb4ce3473c", -"votingAddress": "K4yDcyLLzeny5uCWKAFtMmcwSuz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "79a7197155375ffcaa9d49bff0521672a3d22ad3e0751de8b0166dafad3d6d8a", -"confirmedHash": "1c4217c3578b3f33da0fd45c2ff6feb654f740d46686d8a20600000000000000", -"service": "00000000000000000000ffff68f8104a", -"pubKeyOperator": "8b485020ae19bdf073466ef6289b5a590c80780af7e55966ad536d2278481e0bdab1dc3c9bc4e898f7d89e217f60db66", -"votingAddress": "3Fcd5XCn9Bu3dpSBfHmYSg3NfD5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "79d2fecd250caf359ae2bfa0d019d21df2c2433f42e361157c7238b44214a925", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96880b05", -"pubKeyOperator": "921f01e290f762728cefed331e9c25ad3e60816d1e14fef902f70834408418077324c09ec683891d4ac7207c22aff2f8", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7a0202c3c2e41e99a5d93c503fafacaf0552476cb4f28d55113dc6c738367f72", -"confirmedHash": "8bf5ae495ba24b16acd899b090c9cdf39ff7c8a8cb8744fb0300000000000000", -"service": "00000000000000000000ffff9fdf1617", -"pubKeyOperator": "8443841e14569b06c45b024ea99979951ef498e4a072d29b8b9f5c6f75b279043087b5ceb03f03e66eaff62e05dec805", -"votingAddress": "49TcQ1LTNisq84XrqL2w2oZ11ezg", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7a049ae38bbf8cbb4fcf41510f1fb6919e037e39f1694c5ff41502819dbe7d2f", -"confirmedHash": "f50a3d1017b4c38182daa544d8681fc33f9872208b1995213e00000000000000", -"service": "00000000000000000000ffff23aa22aa", -"pubKeyOperator": "80dbc6f31d5a321f923573674bd814939a3b626f6caa5f6cecf673e134d34085df0b40500ff71c2ba5c8d7744ebd2085", -"votingAddress": "4XTQVaR1aRcM2xiJ1iK3funxJxNa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7a0bc02a7f950d3b51c2e625e4d64d02b93ba4efb2a0e2c9be64092dd073ebc3", -"confirmedHash": "968c8e69e2ebeca1df06fb812c76c867c3d5a95e333fcc542a00000000000000", -"service": "00000000000000000000ffff22e25bd2", -"pubKeyOperator": "109505f60bfa1f6998ead9876164163c649fe06959da797667080d486b26576d9a739eefa22e29ae0a46d4919833b17e", -"votingAddress": "2WjKZiNV5WF1wkbHRcU7pFXKQ7T8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7a0d68ca5bf51724bbcb85150ce9e2e241285662f2465b5b8af0f677ee57c427", -"confirmedHash": "0d08d02b7b6ead43e6b14a9139bc7b5b36bceb5eb040c1ec0200000000000000", -"service": "00000000000000000000ffff88f3738e", -"pubKeyOperator": "860f9cb0bf8fa775877b412b336b752e373b26b9ed9ffd3d6694ed4ddc6f0ef2c1cf90a2755abbc23bfef904ed83ce17", -"votingAddress": "hJ1aTJKTDtkbFf7bp5FKP57yFXX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7a2def6ca17ed92f1036841f37ee6e1ee8c17e8b38caaafa48a138ddea6d8dd6", -"confirmedHash": "f8d2586299226669d61abe756f6c6392f14c3dd1b19d11d32100000000000000", -"service": "00000000000000000000ffffc0f89611", -"pubKeyOperator": "8ca075e56916f42e4af82c309d2fd5fda01a19c566aefef77339358beba526733fa87c7078d8dfc35eebe76425433a38", -"votingAddress": "2rHYYYL979doayUsxgmcrVUytnVN", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7a387037835fd0f335854aaf0240a2c9def18dc2c1b582ea3984a2ece7df08a3", -"confirmedHash": "39c74fe7727d3e8294a081a8be782573c3d832741bc738f00b00000000000000", -"service": "00000000000000000000ffff5fd8ff46", -"pubKeyOperator": "11a611ce072ae57c207374b27936546ba144b9a415d20737e1ca25a14978edaccf8f7ded67f917f6d1a429e3447bba12", -"votingAddress": "33udootJ9h9oJFTKjQ2h77QrDfTV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7a5046522d95c239a78305fd9c82fd724aeeabc2b05911fb7213509f4d833052", -"confirmedHash": "53b1055c3414ee24e5fad1ea3bae333b9225f5757b1dbaf30100000000000000", -"service": "00000000000000000000ffff58630b03", -"pubKeyOperator": "13c30f2a8aece636acc66553accc0b6c08b238f30818bdc3b72759e5829bf2efc76f65cae4792e3524b3d642cbc44e72", -"votingAddress": "gW51KgNyavvY1z4vcQYpJE31Y2t", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7a6b6dccbaa9240a36794bb8bc114931c611977eab4c6d643537a56c87825ab7", -"confirmedHash": "02480155e7acf82afa5eae3263f0d683dc1a85b1712e29c22600000000000000", -"service": "00000000000000000000ffffb009d209", -"pubKeyOperator": "9960db9fc45026ebda9a04c04cfe6b4a5dc9238848bc4f9487e7ee53197d3fc804753c83f98d9bc45024c5604b2d49bc", -"votingAddress": "2Pe2RBnoSeGcyiCSkY4KGCkRjAdz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7a7257100138704ef0e8feb5107d7b0343f597309fdb20b0c68d8eccf4e18743", -"confirmedHash": "e7d30fbf7921823b1b907fc28fdd3895f780600df176d3f12200000000000000", -"service": "00000000000000000000ffff9fcb078c", -"pubKeyOperator": "00c71f5af3fe54de474405ea1de62a112c6f348f68b0a88d4f801e91ceeae235a50c340cd9bcf221974827fcd19ea113", -"votingAddress": "5PGEHXyPAxmhaAUERAb8kQyTNbh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7a7c9b55f1a4d90e4257119b18ed41363573f35e016d1ab767fdebec4776b09d", -"confirmedHash": "ed45409b57075051199357ef15848bd098aaf6aecabb68d90d00000000000000", -"service": "00000000000000000000ffff5fb3fd14", -"pubKeyOperator": "90b0d61808377eac02d62986d8a384729d23ea23afb9b241875bc7aaa7119668d459c559726b902f057dd65ba685c42d", -"votingAddress": "2t8BpAccTzFqhhekBPW8S4TnxQRT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7a7dc3b3ef4b2afe5f7faefb6809e068b5e454f1553fcb9674d411efad7e2786", -"confirmedHash": "af06dd926b4f76c3c650cd78e4a5b2938e090162bd6df4560300000000000000", -"service": "00000000000000000000ffffa8778726", -"pubKeyOperator": "07fba0a4a13ac0dfdf329dc103f7d5a0b4b4a1412282527cafd00aa95d241fd18c16edb67815e3d5bef13334b4086ab2", -"votingAddress": "j8E5aj5xhicWGL7AdoUMoCZC1aa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7a9b1a5016a718111d5a788335321033a1bc53ed727c907714b06d4cd9f4fb34", -"confirmedHash": "ae79629a3cc7e5fddcf76b6b5065318f344c43d8416206481e00000000000000", -"service": "00000000000000000000ffffbc28b6c8", -"pubKeyOperator": "83afab1defed083c1f840a6e0d251b37049988dba78e505f069cf4f4ee4fad1b6ce9d131ae78e258c1eadb9ae54c71f5", -"votingAddress": "kgRDakfmpRcJb1AvucchrSZsxaz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7ab6f091810584b2deb7bca2682dd20c7528340f27f78f4f701a1546114ffaf3", -"confirmedHash": "daf12a45a88bae03aee38773d16bbda1ece34181041933640e00000000000000", -"service": "00000000000000000000ffffa516345c", -"pubKeyOperator": "07864345d950dc891a4364acbfe98651ec66843146453f26e181bbb612af170197cf9f72daac2a65ff46707ea01ac734", -"votingAddress": "2Cf56S6pik9futp4SS5UjjiLqF7N", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7ac2b87851aac99a13fae0a01ec371111a6081687ca0d67d01afc19da1ccf1c7", -"confirmedHash": "1ad56fb945ed05f99bf30c03f70b6d8ff9002f8c40533b7e2100000000000000", -"service": "00000000000000000000ffff9fdf11ff", -"pubKeyOperator": "0485f93cb1c4a7780d9154b6e850e6a29294e6315c2985200720a4c96a4d75a592ae4e5047ee5efb16f619495aec1ad8", -"votingAddress": "4FTApGGckqNtJBDDBob5rwuFi9SE", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7ad6f9f58d16bc705c63fe27876f6ef5b461f9817264c149b8923281562fa021", -"confirmedHash": "75a4ff971de6e0ec1f1ff63b10ad711467e1a19f7e64f5590100000000000000", -"service": "00000000000000000000ffffd4186eb9", -"pubKeyOperator": "17aee628a4e6baa6f7080d6a29f9f54a69708dfd19c25ae12438f35a0979f6c18e763474aa5b70987540f30e15184170", -"votingAddress": "dngFwac3cxB77rmfRiJv5QKnvKT", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7adb6d135814a57634924e392587fcb494f7de8aa5ae89eb38c4621faab30ee2", -"confirmedHash": "083f69e510e7b9d047b788db292f6f0dffc5110edb5828ee0200000000000000", -"service": "00000000000000000000ffffa877578f", -"pubKeyOperator": "01b3a8a2639257027a59be8d5290e20233e36ec6dd0f5fac51d75eca9f58a60954651c041341273e4d3cdd5b0fc785ea", -"votingAddress": "3xRgbHj5F68SETTNdLbsV7QRo8To", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7aeb7e770a2b788754bfd0b92e98ea394aae26620b46233955d5c5899a191db7", -"confirmedHash": "54687245820d86ad38f571c8d41bf578a640e20550a8a14c0200000000000000", -"service": "00000000000000000000ffff52d315e5", -"pubKeyOperator": "8be9b7504bb89ad6530a25478f0310027e3f5bd8f62ecabbd725458f5352f6050bb2038ceada3346eab15227bd3a6e43", -"votingAddress": "41GN4LTnxRefgHBqpEdfWyzQoPiD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7af91a141038c282c9fae2a83d74f89401e0ba8a27bfe6ef38c41db89477fa45", -"confirmedHash": "7ece306e876a50564e474dfb04c25b111b017c165e8aa3861000000000000000", -"service": "00000000000000000000ffff8b3b4454", -"pubKeyOperator": "0a7a2b0254d27b5e6f142d66f11087f8a6dfc9ad035ec7c993faa3bac78057afb6c87c151b78ae7bd8243c717ff8659a", -"votingAddress": "2WnHFhEzxNe9EAMvPB4FCmk9yBjH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7b2afe9503f3d95f57f1ac7357ac9f406b4e7bb7033ced6d25156e42a418380e", -"confirmedHash": "413bb72ff2ff34c43a4e536675ab3e68437683daaa94fbf20300000000000000", -"service": "00000000000000000000ffffb23ec899", -"pubKeyOperator": "8e4a291d349abea0736de2af4c047c40d8569b7a9bc2ec2917c87ca73bbab2a213bca86059ddf40e99bc1f8a3f230e28", -"votingAddress": "2vDNtLtCiGJHLtkVqukHL6q3GiYv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7b36420336012ead7d99025415692e380ffe7eb9923d99038c69c82e572df37e", -"confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", -"service": "00000000000000000000ffff50d0e7fd", -"pubKeyOperator": "935ce9c9ef8973ad16bb824ab76e49d921fcb9dc4abc44e15d9dcd2d6af9633c1d5a3072c330bed5a91a12b707e34203", -"votingAddress": "4G8gHd23R3TYChKMp3bkLoVwfEji", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7b4830d4e69ee32febfb89c048b7d2abda4291ebf665d2adc85f7be860af7458", -"confirmedHash": "15409eee633be949ac015f328e434352d470299d9f6413141100000000000000", -"service": "00000000000000000000ffff55d1f23c", -"pubKeyOperator": "95b2a0916e9b59bc2ab649b0648bc3d4defafed9b5309dcf91fc72e06b3fb79e6cf955d55896d02b09696cfae628def6", -"votingAddress": "3ZEWpgYWFY4vLnSu2nSMuBL3nExk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7b4dfca69f28e0c92afa7759f9f76d52418ee8117a795dc04318f24e486dc891", -"confirmedHash": "c4ba48288cbce8e7429586f8d6b4acc8538933c771151f900f00000000000000", -"service": "00000000000000000000ffffc034a6c9", -"pubKeyOperator": "14a8170894c742076a13cb8a7257920e138858c1b40b9a0f255cd5a36e822172506f60933f79a88909511e78afddcde8", -"votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7b63fc176e8d3c7b768999c70bbb13b241b422ca2aa0c669f2f1d86f94a6d2c5", -"confirmedHash": "0238f63ab8326fcf0ca20201e404c3ade3e518852b06955d1000000000000000", -"service": "00000000000000000000ffff867a379d", -"pubKeyOperator": "972469f45fde362d563c3fc80a3ed5f3a26bcc3799eadad1ed0e8bea2e324e19c7c1d31dad7f8566cc9cfa06bdced2b6", -"votingAddress": "bUDDqF1JFPhcTd7nL8yENTjNMRJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7b659678abfa1d848e7ea80205456796278c17988c18c10c6a1e8a2704a5d07f", -"confirmedHash": "918a19bf0146d10e7751ce0910318f8c048c12440c6f21901000000000000000", -"service": "00000000000000000000ffffbc28e711", -"pubKeyOperator": "0140c6cce1152085456b44c005042fa5b19048e23e7ae498b831dbcffd8fcd9360d26ac8c95db2c6f41b419791915e74", -"votingAddress": "mUMMqs8g2Yj5871HGKYXqPauqso", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7b7fa97f58dc557bfd0b672169be26211c8efd4ea221d034480b13c8b92f9286", -"confirmedHash": "de947d5e297594025ccaf6f53c80c5e1ac4bc17213365fe02300000000000000", -"service": "00000000000000000000ffff5fd97d64", -"pubKeyOperator": "0fc0abc65510e6c1b17b06f3ccec240889cfbbcc0c96e1136f8ed42c4e9f8a28fc09f5671425d66efde55d4260f37bde", -"votingAddress": "2X8ou1GZDm8FggeJEUT1efkSUk1y", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7b82bd747a2eb9aa283848b0b533e3e6b9c3d0061487b0cc16b21d649aa1985d", -"confirmedHash": "a3aa307938d3b31bd73ae48f388836da52b5600f27f896aa1300000000000000", -"service": "00000000000000000000ffff52d31982", -"pubKeyOperator": "013229c4888095e41ce26a1e95765e7956e648e86cd85bdc357483795596b5bed52a190317fba02c3bccc1595dcc338e", -"votingAddress": "2Bof9iQvquQ2DCF7ND4pmv8H11U", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7b830da2e7208c3cf2807ce6357615314764abef32c03159223e15c0c389be3a", -"confirmedHash": "3b9fd28a64c92441ce8ffd3578e3c836d0a9c50f75de85cf1000000000000000", -"service": "00000000000000000000ffff92b98b6d", -"pubKeyOperator": "97fa07e5b67c33de9eb8fa01b2e06e849c9f73da4840c8f037c15e3eba29791bbd47e2be5f67abd566b13223ed9e4e51", -"votingAddress": "2yPjgFXH2awXk2jPhgQAQkCoNLfz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7b87e28d4d1051c0bb261eafa0e3fcae6b29249ad7b3882c2f0f4fa89d4e153b", -"confirmedHash": "6ae1fc97f35f12bcdbc795195e82d45c822437c0a18c9a702f00000000000000", -"service": "00000000000000000000ffffb9053788", -"pubKeyOperator": "9201a6b39c9976bbb4c7c11168493d0afa5f5ef73e8e140c7c359b8ca8f63b3a70ff1aab941b21ca750ecc002f9bc27d", -"votingAddress": "xfv2vxae3dCQnYaDWSeyreXor47", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7b8de8942f04777494f45c9ac76e6cb1f2bc0d5a20f5e652978f740ef149afd5", -"confirmedHash": "9a1d301a18559dc1aa20644fa3b6273224ce13f37e3b92b14400000000000000", -"service": "00000000000000000000ffff52d319ab", -"pubKeyOperator": "8ac239ac08f991893623917b242d9791dfd78de9b4f5c23c8eaf5b1399c118f38a00cde3c67c3805a200a04e87509b3d", -"votingAddress": "2fgCMoDF5VhTLMzBhpr81tHdz9AB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7b8f87800f9e5e63c4101a81f3badfbd9d8890453765d8f09c85f0e44d5ef633", -"confirmedHash": "a5a3513596c6be2381496a1afba788891ad77da924ecb94e1600000000000000", -"service": "00000000000000000000ffffa877530d", -"pubKeyOperator": "157ce7a10d31e0941c2f01edc703a689aff04349378ce5872e1a4f92158a22e6b2945f2d0cfc6ebee171f2e9cd7c1c79", -"votingAddress": "2d7zG2CzzZkwTKcPCrcbS9xbGYGo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7b8f8b6f4c9761dbfe217e078cf6ad6eea8182c7b856cbd0654fb23d7fdd6899", -"confirmedHash": "e4ddd6904af8810099779a4fa1c13221eddd1a7daeb8cec20d00000000000000", -"service": "00000000000000000000ffffbc28b98b", -"pubKeyOperator": "0e646209a68a0fcce7741f0030b290cd47559ec757820c1e82f6baa62e28408ce38aff3c34de5f85ef84837bb1f67ba4", -"votingAddress": "KeEeVaeigc1rNW3ZhXamuZ3HHd8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7b8fad5e0d27d6eca25a09edbca337459221b8c9539603459e2647bcee4ed06c", -"confirmedHash": "f08a74e1f52223e37bf6cdfdcb4912e64544c09d06b628260f00000000000000", -"service": "00000000000000000000ffffa21318d5", -"pubKeyOperator": "06e239220c117dc05ef81753f2d43da7346304fb34d52de480e3e55847b36fca17c2bc725bbedc28e3dbf9d2a3ff7d5c", -"votingAddress": "2TC4G6RLukrnRisjnWLZ1nKgqBRb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7b94b31d51517281f0bd71accf8e34cfad70346f1a938bf1019bfdf9a23d804b", -"confirmedHash": "894a1ddfa82ab3d05bfd2759e30f98886ef7fb4be12582f52a00000000000000", -"service": "00000000000000000000ffff2e04a27e", -"pubKeyOperator": "86ff372694b3421196c066b8c14d292d208e2379d0044a6d274eac5ab11fd12de7b1531ee1a6e92931145c9a77879b59", -"votingAddress": "eDjKJxKunYEuF4hh8jx266DdTw8", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "7ba5efdbc97c89a20be3b9058caa025cd1ad73eeee077f6f059f2be191cff3a8", -"confirmedHash": "e84677f96556aea73dd785bceab2845489ed3a5efba53a702200000000000000", -"service": "00000000000000000000ffff87b5c59d", -"pubKeyOperator": "8c57fa3fe905512259e1ac2af0121fe554966f95c3cd22e1c79b1f3dacf81c722873885ec7f2589cb90142c5bab21bf1", -"votingAddress": "2GqRaxZZKCWqeVBwn2GbDeuxj5pC", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7bb6d912d5823807dec99584972a7b67e72146a49a63df9ac91fc4c6e4f1556b", -"confirmedHash": "a60a6afa17cd22d28220fe527001b2f4fc0d1bc2b4573e191100000000000000", -"service": "00000000000000000000ffffa747e193", -"pubKeyOperator": "044f8182e26e389c83fdd19de9b0ae320f383e559725443e81930df749e30e98648527aacb98c6cc65732f5bbf6a847c", -"votingAddress": "3cicynbnSzD5PKLaaWvGLgjKxsk7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7bcb00b6e1b01df18f58d6a4195eb220d07c6b981f9314e7ba846c875dee6a60", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffffc17a8ea3", -"pubKeyOperator": "82a244a844ec983825090a3a8e6deab6df728b8ad39c86e05d3301af0365aee21e91662a494b50d8190a2508ba4c8f14", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7bd2431c2bc28936b0f1f26dc3ce81e52f310e60f0833e54b0d7e8500cd0bac1", -"confirmedHash": "a633649a9c11c9a7edcfe37fb35d8474ca706367dcc9c34d0100000000000000", -"service": "00000000000000000000ffff33595efe", -"pubKeyOperator": "1048309853f42927428042dbe14dd973d2e78e18afa830d64e60258dafd460b318ce0b610e6b731b0077cb8440aac5f8", -"votingAddress": "2XwhC3BNqh96RmScAc4LxDveQMmn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7bd48abce293b673044182aae82d857c6c62cc64da7efc45a9081028f29d0b9e", -"confirmedHash": "e71f7998d05350425afc2ddaf65969ffd5afc1dc69723b581000000000000000", -"service": "00000000000000000000ffff55d1f1a4", -"pubKeyOperator": "8734d4d2ebc8bc83ef298b70e27336697cf9e38e8c075fa753997090ece2484c77538f8e4b1aa71b5872e8ee1415b544", -"votingAddress": "2wWn8q6WnNUjv1Xaj7kn2aemP8NN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7be65d9b954727c036b569ad8470ad9e80b20f9fe2cbb4b377a20333924b9d57", -"confirmedHash": "e31060b0169a43d5a9e3f57266cf1c3c6585add0ed47dcec1a00000000000000", -"service": "00000000000000000000ffffd4186c19", -"pubKeyOperator": "082c7baab4d70ef64d1f558324edc631c53c630cc69e4d0bb51e49ce62f7d97549068a27ba4d483cd5db3a2422c6e357", -"votingAddress": "3wXM3NywNB24KMUvfVYnwufao8a4", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7c000a525e75b53b9846e454587932a5fe8c63dbb1ce5f25b48b82ecfe795fdf", -"confirmedHash": "0c36dfe7e9d9bf332caa00d5b0442e5daa38f250bf9d08f90000000000000000", -"service": "00000000000000000000ffff8ba2d34c", -"pubKeyOperator": "80222b8057fe7bf86a84e7b0ad2db56c391193a40244ef24c15c9363c12ce6485231312396313e33efc3f7de551bd266", -"votingAddress": "8mLmCB8Bpc2kMU7b7eKVHXxVYJ2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7c2128330067e93f1c43d1f09308854bbe0bf24f530f730fabe82ddc7a0dcc25", -"confirmedHash": "cd451cd35ff9de9e9a5d70156c0b7ddcd16157daa6619ff33800000000000000", -"service": "00000000000000000000ffff2578bfa0", -"pubKeyOperator": "8b50292b8a41705511e979d32c976b6927ffe66ada963fa0285daad9cc6c21c1ce6c060f3923f168b396833445742365", -"votingAddress": "4HoyzaxpM27qpL9NqybPgeBgFGZT", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7c22cd7b1d64c62abf584f50ab27900a56545c25b47b29a7667f1905f8b4c34b", -"confirmedHash": "59355905449f8ae451482389be94971d01661f6512b537ce1d00000000000000", -"service": "00000000000000000000ffff03e6f092", -"pubKeyOperator": "81bfb3855a76e38220063cddc67f2ce04867b7dd1b75137835b7cefae789a79b5bf94142ccf4ae26d8667852a7746a37", -"votingAddress": "Z3PZ4cB1sftRPwuM4XLoTpW2Mvq", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "7c29ea74900bf39b150ef51310f2195c8aacf7512618c643529dfd24dc0eb2bf", -"confirmedHash": "04d0aa7e2191e996084dbdf7ccdd5f752a6977f7c185b2c41e00000000000000", -"service": "00000000000000000000ffff52d31977", -"pubKeyOperator": "19d82bc06233508f85ce52152a7af304fe4661ae48f69315c8bda08c5b652914cc19b7efb138e3d96ed0553fe6b84e38", -"votingAddress": "2w3axdhobV4fcxtrXkS5iZZkA3dD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7c2a5bd38544e706e4cb5827fb179f9fff646041e01c5d552917dd0b7b89794a", -"confirmedHash": "36f4894162d743238ea16030176398f40e1baf170d2f8cc82700000000000000", -"service": "00000000000000000000ffff5fb38836", -"pubKeyOperator": "10e0500917ad83165dd0c49fac6081a7ea56b20c5ba5ac67c99cd4e6fa7427b6867310ad877827f5c1071b44894449f4", -"votingAddress": "4FFnAETib3qQwTC3qpJYknUBTYWA", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7c48e1d5eb0d22bca927a523ef47e56981253fb6f5634ea41f5bad7cfdca67f7", -"confirmedHash": "07441760607dc824d0d8bdefb3dec059d111218b0c4c2bce0300000000000000", -"service": "00000000000000000000ffff52d3154f", -"pubKeyOperator": "03e8076dab8cb1a1a70244754b23408018fdd84d09b7442b002dfe15e7e9cf7110573f5462edd4029ca7c64fd2845c55", -"votingAddress": "356Mzerec4sy31xWxYctjakJojmo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7c5900da885f79df89caf17a6f6ca06a669d2e7ede33a372a2854d8a2b62e7bf", -"confirmedHash": "a3219d36fd87140b7d2e96f61f07c271faf2b259461a08a91400000000000000", -"service": "00000000000000000000ffff453d6bf1", -"pubKeyOperator": "15e792aa936209e1cef81f57261e005e11c0c9758eca86f2e93cca13a3227ade8ebcbf52011830837cb5a0ad50ac48f3", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7c5fbaba600abd96698ebe205b4c7d4e4d2e0b8d35a35a26297fbd002a40490f", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6d333", -"pubKeyOperator": "8903f7ec225a0a04118095d41cf6dd4be37ba7cfbd1ee67d49192c7531320b7f7bdbe3b6d6ed55975712b18bc88b6fb7", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7c648f5c6f730af82d4e0d171304e0814ebcd9d4e4ca22a30e6535ea4f20397c", -"confirmedHash": "b49a2b915e6d059734b6cb21dd335268f4879897137ac9250600000000000000", -"service": "00000000000000000000ffff369efb6b", -"pubKeyOperator": "0843a3713fc6fc05a730eed3c9c6b1562a23bf5f1a1d3cec58a8334ac0d86ef4801b822b35f9adcdf66b463d9ba7ff5b", -"votingAddress": "b5YKeGtA8YD6QFeVinyjcVtC2Af", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7c653de8539227e955d3abc7c92ef2aebbed5d862ed88efefce5f642222cbac1", -"confirmedHash": "cd6af43f567dbc86fe03a7b905972a249dff15af8aaaea811000000000000000", -"service": "00000000000000000000ffff0feb8c78", -"pubKeyOperator": "8361eb1fb71bb65e15feae965ed0efe09e0fe8efcab324e75409db9fd0188a1d7aa07a052beace8f0dc274873ca905c9", -"votingAddress": "3LU9Vm1h3yNiJEQaKYonwrjEoiMu", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7c694dccd0fc9f4205f1ef7ba08d6b311df1d0bc2484cec3fc536608d469bfa2", -"confirmedHash": "152efcbac46db5c6001aec8126572d28b6d82a8adbd30b2e1900000000000000", -"service": "00000000000000000000ffffa2f304c3", -"pubKeyOperator": "0a4d967648ce4432748d508baee98189e8c99850224c619c1b025d15af87e0e8b26cff7ec3751c0449a66691cdc2d14d", -"votingAddress": "22wxjx1bVL1bm9YCkxpwYSf82X8k", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "7c6d6eb4511f2df5c580cbbaa021b03d09837b56c92807d1f49582570fcc6551", -"confirmedHash": "dc352e177f0fc11e3b8ce55fa685b6379c222c382900b6ca2d00000000000000", -"service": "00000000000000000000ffff55d1f19a", -"pubKeyOperator": "0eda3c087f9a593efe4c8fa7fd4ce02c587952b1bc20a49b2d21d573213c4f47a6db3494b1a33a0749518ba3bc0002d0", -"votingAddress": "3knApAApg5cZJ8ikRcnzdzieLTr6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7c941e819e2e7ef73169820ee97e56d9fb715c952191aa97d78205a35d5cc4c3", -"confirmedHash": "5e29d0a7449fdaea23355de545eaa5b36622f3a06d921bb61a00000000000000", -"service": "00000000000000000000ffffbc28cd0d", -"pubKeyOperator": "1483b412ee48de18356f53673eec8bdfbd43c311d1bc7d36f9744e8d184d506b2342631edb55bafbdba33cac2e230d3d", -"votingAddress": "2Dda3BniBUhCEcMftbWqPJUhocxK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7c9a449fe5d5e8cbc0d8ef6a509ee6cc3e13ff81ee8de1089c8eceeca173123b", -"confirmedHash": "ba55cb4616d8414644fa469951f136092282262cf02dc48a2400000000000000", -"service": "00000000000000000000ffff9f41c604", -"pubKeyOperator": "1543fcd8129a1d7d84707aeaad034d0653c23829cb130ad51abb305cbb6438cefe2d9068cbe1d3fec0d6d5742d8e8961", -"votingAddress": "339bZ51HtirLw45qBLiaG3Fuoz3K", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7ca995ca5deb85d82e2e80d62c5979ed5b6765504029709b85e47d98d91a6e85", -"confirmedHash": "960cffe0dd7c1e3710e3804bbd1acab302ef47ef4928be221e00000000000000", -"service": "00000000000000000000ffff52d315e1", -"pubKeyOperator": "04d6645744e7bcc14b986de35930162452a5f7229a46bfad5f1d39da7f9205ef56fcddefd2fb14f8ee7f7f340aecbacf", -"votingAddress": "eL6ypPzEHko3FXmjGjMfkAPxovT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7cb34983d9120918e8d79c4ac4dc09d779d76203bc100e0f392f5f8403387c70", -"confirmedHash": "8783a5a0525dacab0bfb8a9292bc96ecd3be6d5291db42020a00000000000000", -"service": "00000000000000000000ffff5bc25a35", -"pubKeyOperator": "90967cd0bbfb5ddfaecc46a489bcb98a7c1da700dab856913003da586366e2eedf93da57f7b6e69bbafe72eebbce56d2", -"votingAddress": "4YycSDwMUzg7SmQ6EfDoKht7VfJi", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7ccf6225bb10c0db3b2964cb375027d4ab105cde00516302b7769e1be3c3208b", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0bc", -"pubKeyOperator": "9424f4bfeff28f897e59ca7f9ef439c39ff444d9b5dc9197a6f3d1a9127e49e09a3c83491c496597c0c017d577410e55", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7cd97c56589465e3f86bf98fa41f35903e7a13f2fb744e98cd19b9f1a0bc4628", -"confirmedHash": "0eac18c848b2ef195fb05f44159f3ab249b951ed0a7945cd0f00000000000000", -"service": "00000000000000000000ffffa8775785", -"pubKeyOperator": "0e6723c137cbe0de445df186ac3955adad08977f45a2f0a660d3a12226f7b5a43ae727607f1ac072d0c80a58ca6a39b7", -"votingAddress": "2qrqAvJT7CXkgUtaEK9W8iDLXa68", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7ce54b46831cae345e3a0eccf8239ba40d6c350587cef54e37a2c335efc7415a", -"confirmedHash": "09d1f3322934b879ba7885a63fec6328829685055b2156390f00000000000000", -"service": "00000000000000000000ffffb2804888", -"pubKeyOperator": "94742eb0be26d81f2716bd80c62cac939f52d3a20c4273144cd9c9d54a0635f13ab569b023b8a94f01e1ea605f39e22b", -"votingAddress": "ahecJgZya3ouvkDbRM4GK15S8Xn", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "7d031ce1c6379caeb5e140b91ebd03088043b957983a06c762a503fb78601bd3", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0a6", -"pubKeyOperator": "99c2439b1ea08b9b6fe4049d1b89186224bbc97d901399a939d3832ce61144eed5db8afc5c1a27e2855d964ef16eba39", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7d09601eae66f963be6e357c05ab2205ad4ca1b41d48bbaedb331d247514d1f0", -"confirmedHash": "0f45057180ebad4b73fbdb7c849c44734faf90dcff0d06291800000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "j3uGUCVKCy56xPTTG11UExXf8LR", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7d1bb1e605e305054b9128efab8a05d7cc418354247efef8e8ad2fbf76e2535d", -"confirmedHash": "960cffe0dd7c1e3710e3804bbd1acab302ef47ef4928be221e00000000000000", -"service": "00000000000000000000ffff52d315f2", -"pubKeyOperator": "03437877af6b89c0305cb891dd31d009d8257572628c1da93b2e2f9b4ee5eac1924613d43409f8b3d267e24bca63ddc9", -"votingAddress": "dBDdGKMAEhj12mUjQ8bxEL6dmmn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7d32819ae34f5442c3a661fe383dafcbb10f085fe82d77fde75ee1ffa95c0926", -"confirmedHash": "d6c7210afc625c9c69fcc318a1ed234b3f8b7086cf1996082a00000000000000", -"service": "00000000000000000000ffff68eeab9e", -"pubKeyOperator": "172f16ef1c9f219a8e55c5cbbd47545dc3d771232ff69e17c627ac80948517c7d1677e918b5bce752550ab4cea9c9bf0", -"votingAddress": "2ebh19FoJfp3Ce2VYVCUTXbtR3Gr", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7d34fc7a4022520c3c7a756799bff1ec1d8750d4bc7e75406237b20508b4de2e", -"confirmedHash": "74986140e7c627c32a6324c5606cdd5a828b4f52d24c1ee20200000000000000", -"service": "00000000000000000000ffff36270a6a", -"pubKeyOperator": "0d704e15b519dd73ac7e7e6ac1d1ab07126a6c40dd432b984c9c3cdbc2352a941022b3bf769a68b4c4fab45697fbb655", -"votingAddress": "ZSSm4CbSnnActN6RUT91CmN3Mbg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7d5ad73f88275eda875e12708c48789bb376da319d9ffc310c4b1537904290e8", -"confirmedHash": "eac420c49ece296370d739705e10dda9881a7d60fbddcbed0b00000000000000", -"service": "00000000000000000000ffff2d4cb11e", -"pubKeyOperator": "17021b94b4976e9a6028b0371ee5fd7a5a2e4bcbeab011744281cbce75182aa6fc8979dba4735009295b03253f4663a9", -"votingAddress": "2bAE2o1xdJek5XnzfJ1TngFMZJyv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7d673aaf5c1c1ff19a6917a597c6a0ddac9d56dfa3ee896071308cf886d35995", -"confirmedHash": "095332066dfc288e0df4f6a7110325c199a17eb46798089b3900000000000000", -"service": "00000000000000000000ffffbc28a31f", -"pubKeyOperator": "8486990b25a946043c74ef87a1fd6b22b2e5bf1bf800976e948da5a649610f6974c54d684a0675a685d4a80b10ce0b1e", -"votingAddress": "23q3PhwaDG492dStaAHLR4qpc6E5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7d714fa7a87fe19b4681807e719c5051a9df6234a07b6dfc545d13530db58e41", -"confirmedHash": "bd130084e15d4b496ac7a2d319aaf9e6f88e8c8a58bcc90a3200000000000000", -"service": "00000000000000000000ffff88f38e28", -"pubKeyOperator": "80736dd02c69071ef4b70c76db7252196988e0808f4f5a3c887117acd7526f60339f177d59368c6414d60ef596eebc35", -"votingAddress": "qzivuffyrAFEd6rB5nVi7Ym5j3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7d94c55640f71dddcce931b1dd2fa015d6332b4c683bf375b81ec098a7e92d00", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96887fe8", -"pubKeyOperator": "07b5219d4f6f1a2cb18b215a82983477d5fe56fe34faaea0e3fab9a093e1012c555a97d0b660126860153397a96cc102", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7dbc3e85be1bfe094530df1effb0c44cde6c79bae5d81cdc050feb6ddaaefb4c", -"confirmedHash": "61035eb65070f42fb24400d08c281e263b1c57a5271ff4901400000000000000", -"service": "00000000000000000000ffff55d1f218", -"pubKeyOperator": "15481386bd16a61ebbeed4234901867750626f49b520c4448b9e050a81e7a370ef3e33788c40bd8431ad457477093b64", -"votingAddress": "3db2r2TahWhqF5Tccj1M8gmS2dDm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7ddc02e1904703f899d1d12c51bcfcfae6764878daa6fafb83dfc0ba61b52c1b", -"confirmedHash": "94f09390c9bd30a8ba70cae1751942ffc70bf9a6e8d184420c00000000000000", -"service": "00000000000000000000ffffbc28b986", -"pubKeyOperator": "8509c49747ec23783a5f2de68901126407a1a68ae3a28e9e3bf8ce8313200380591c8e7fc860232cc9dd67ae9f1c2737", -"votingAddress": "327ZYzNKfnDQqLpHMcoR6AuWEibd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7ddff352d3bfcb9a027838ecc213e305e5718c912cb7e8313b51e61b0d8c3b63", -"confirmedHash": "15ef8467ad1b46198c1c4c279656312da563c1b1a50649b11400000000000000", -"service": "00000000000000000000ffffb23fec68", -"pubKeyOperator": "83dec5736314426062a0c8e70fda26fce7bd4ccb52384e5518ec34002d0f68114f3aab87735fb5fe7da4ff736d2e2844", -"votingAddress": "35e3eMmgarNZhW11uZ6GFjuhsWeb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7de779d94dee647f14b33f54364695ea187da875401ab9fada6101230c016eb9", -"confirmedHash": "9cc3668dad851396b4c797c11e890cc21ab91e1a2c0015430300000000000000", -"service": "00000000000000000000ffffa747e49b", -"pubKeyOperator": "0816f7c89635d08714fb09f03a620ddd67ea2579608f115f8aecd6e7f443a141300ed4e5c5b4ad9d00e8aae6cf358880", -"votingAddress": "42Lyuuwgp996cKx3AZWwpWZLwfFk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7dea4face7bb9b6b9554c38a77a1d57aeaf315c1dc4d45caef4c812565478513", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d568c6", -"pubKeyOperator": "187ad4a8a1400ffbc755ae1688a18fb3bb540799729ca405f900ed490d8bfeca8f1e4fad67c3d7377433d9608ffdb3c8", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7e03321590b4037748deebb6ab9521117236ef93154a66a2b78671ec8260165e", -"confirmedHash": "d1658f5bc7d6e0ba1e156140beba27bbd16194594c5ba7a80e00000000000000", -"service": "00000000000000000000ffffa7632e3f", -"pubKeyOperator": "1828a7b9c782f9db2ad2ea2858d8634a7bc3420595821418dfbc7a1b7439a5981136fcf74e271767e6889b7ee0a466d4", -"votingAddress": "Ry7NF3M21u7hik8uJrjtRRXS2GP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7e08bcd24f51cb5be1e31fe5020a3f165d22cd509768f1e2a71abbac02a3ebe2", -"confirmedHash": "c1807e4a90e320c0e14d055b0d38a79eb0895381f3d841d31000000000000000", -"service": "00000000000000000000ffffc7f70f28", -"pubKeyOperator": "025ddf52d212941e118f2123ecf2a26eb1c8098a4771b75af86e6a61c1d7d4d93a4bfe9e330647e9363aed979d3b3c3b", -"votingAddress": "PVWhAztQaTcaEELTbyBu3tebQun", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7e0f4aaad17f29ec35a19195964604b29c86310b528150e20c85aa0c4cce427f", -"confirmedHash": "98219effba4619f33ab26e27b5259048ef184f8e06f80d881f00000000000000", -"service": "00000000000000000000ffff23ad3f51", -"pubKeyOperator": "0a354bd6de479dce0864fced9cc8e3f7ee39f1f77a69b28d75745907a7e76e6565d6b5b12bc7cd64284d910650f8ccb1", -"votingAddress": "32Smtpe7n3yqWUr7hFoRRhj2boWz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7e15c8e2417c6e18632175b6dfee1415beaf375a188379de08cb56e06982ef81", -"confirmedHash": "c46bb6d198adb79c74cd68d669482ab592efb1566f8b91a52200000000000000", -"service": "00000000000000000000ffff6c3d75f9", -"pubKeyOperator": "137ca75d4e22a6b7d7b7a965a5df5861c1f1265f2b3136d9dba34cdaa982f30039ac7103f48da9e713943a3996f1b2c2", -"votingAddress": "PJiyvDcNMjjijw72vKceUxSSnVK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7e28364b3af8c06d4982b8cbb1ef927e33a3896dacb98ed31c3bbf09bdbe76ec", -"confirmedHash": "f0a9ae121a231c1c5ccaab343d8f3358a8ec0a02594297350b00000000000000", -"service": "00000000000000000000ffffa7ac22f4", -"pubKeyOperator": "96bc691772bb2daf96256aa83e162458c27640069cff2e43be8f2346adfe3f6ca9e9786e01825b098d5c502b8d52db81", -"votingAddress": "4UUe3XfLGcWzBBeqdWEQSwvpV5N5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7e52567e3fab704991f0da97723efdc047e2e7898b6a550a9733338497557155", -"confirmedHash": "7c198f9ad635960c0cfca597dc3950a8304e843415d041471000000000000000", -"service": "00000000000000000000ffff8a4483cb", -"pubKeyOperator": "939f8e6effca068e1b0d82deac474e546588cb1adbccc6a820081c59c4229bfc9cfc22c62d27e75d9bcb0c120c6b3239", -"votingAddress": "3WpkuaXFD6hzqFVNiA4BnLwfxsJk", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "7e775b8cc6c5c895e06521e9864954a18608b4e7962245e5a26314a7db41419a", -"confirmedHash": "a1ed15906c5a9646646035a30606d4095cab51fae876110f1200000000000000", -"service": "00000000000000000000ffff8ba2e80a", -"pubKeyOperator": "17f6c78c50c09145c698859a10c8295daceff779a661dfeabfd6fc704d47884070bd4d307b270eec6e18a1b314ce24d6", -"votingAddress": "bJ4qjsQuSQL7AvvvxzAuxugpnqr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7e8bc95d796b0e3ca2b3c003f38012fd4a5cd6c949fcd7e061243891e948c1f2", -"confirmedHash": "f37b30f8ecbd294d20fb7a8706834b3a92f9bc0d5b22884b1b00000000000000", -"service": "00000000000000000000ffffa87757ca", -"pubKeyOperator": "152bb93aa256bc1443ad514c7c571241fe31d5093c3f48c68a3bbd5030d18e2079f7b0771165da8699c6ae35fee04f1d", -"votingAddress": "Vt12os3FwLXW5s5B87VLnNY5fNf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7ea3664e841fc15e82802403ea3069d22ebe101f55d34a71282d2789c422ede4", -"confirmedHash": "1ac1125cc980723b882960b69df10c571e477185bcf684b81000000000000000", -"service": "00000000000000000000ffffbce2a180", -"pubKeyOperator": "119086d0021daac6851edd6276eea8ceeac0ddaf6b11a284908f644879449de906ee2cf37d50757047b67919f8f95ab7", -"votingAddress": "3eQ1ri8Buku9wt3hAVsawsGpqM2x", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7ea804d4168b1135c7662e0a4d90880d2ea8964c12606ff6c3514bcc7ff76581", -"confirmedHash": "15cb7b5489396dc7cdb179f5401443a16f678e034946b78c0500000000000000", -"service": "00000000000000000000ffffa161407b", -"pubKeyOperator": "86b49ff47584425ee1d0c230b11972c7761f167db6c39dcaedf2151e850d499daf8fe31eca142c798fedeb2a725c18c8", -"votingAddress": "32k6ZQCmGGyQKG47KHPVWxyCgtfk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7ecf32547dbec9de4957f2fd4b9e5389626fb53ffaca325a7dcb83b1dab7d645", -"confirmedHash": "6d4c77891849cc8c4305e5077d4fefe8f048a8f3e39f073e2200000000000000", -"service": "00000000000000000000ffff6deb45f9", -"pubKeyOperator": "0e60023919707944d1abb6876114974db62e4d6e36b50aea44fc9ad06ff105dad76b1edb27d0734cdb24fab8b306cd8e", -"votingAddress": "iSb4LwHv8j3FRCiWftVYWKRJEKk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7edb77dd1cb0efff828ba9947aa2a4959f2deab64becaf69593d862d8062e2cc", -"confirmedHash": "cf379e822fd33e12c0ab82057ece03b77f7e23dcc99e3e4f0000000000000000", -"service": "00000000000000000000ffff3eabbe8f", -"pubKeyOperator": "8ee79dc467686e32e699539006cede36abda352f69772337d9abcb486850a9c8674689da1e9d221f615c01fe2cefd19b", -"votingAddress": "2qg8cGq9YWb47Mt39D2ZqsqDzjim", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7ee3827cb6ab8758e722ec6967d4be38784c145b991d1ec5d4805160f4b5d405", -"confirmedHash": "13f19794895cbb3425ca55b9a9de95259715d0fed6c989401a00000000000000", -"service": "00000000000000000000ffff688386b7", -"pubKeyOperator": "8c4c3d811c9d2577f4d1d3ea7e2f2bb29cef2320fb7749c636a43a8d1450f7f13266cfd38c80c7c65e6eeb344215a20b", -"votingAddress": "3TjM4bXtFjRX137cHgmg9sxmUx1q", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "7ef9699f854d6278eb083eb75b084b698cfefc61932eafb5f764af99ffc972fd", -"confirmedHash": "fde8ec15f707c69c527cb9043c67be7c5f195b71698c59160600000000000000", -"service": "00000000000000000000ffff17a300af", -"pubKeyOperator": "839040bb495424dcd07def14c4a193c24bdea7b678bc64ba6b265c2f1d5c018519162202127ab8105a5fdd651844cc0e", -"votingAddress": "2mD5wdXRbfS4KD1K1Xw5YYWJ4oE2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7f03bdb894f7041bf0d63f3a52a680f39c7ba9bb3fd3844debcf19104886d7d3", -"confirmedHash": "7dd29cfea495586063cf4e1b16ac509620a2055cf3ce62193700000000000000", -"service": "00000000000000000000ffffb9f3722b", -"pubKeyOperator": "83f644db7244d5caf82c381dbdbeb968646dc1b36d24155c7b53591e4dd53a1cdbca5c9f890f54687e95ca289317d2cb", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7f23da146861af2af418bce4884bc21e2843c116abb2f230c7bb4e9a7bf7c9d0", -"confirmedHash": "9b49c7ed0db3a99b7b72578a2b7eca7ce841263991637bba0000000000000000", -"service": "00000000000000000000ffff55d1f1c9", -"pubKeyOperator": "8d5387e85c8b7ac50607f03f98203b934514454fd3808acaaf7d5d1d2d4bf2d9ac3976f98b61d688962c8a9e3598b13c", -"votingAddress": "4S89UKQrXKf8774S5mwbuhmjmrER", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7f33ab3b913a0a5804db8c74e7e1bd08002538340f3d399c87a185fedcedab71", -"confirmedHash": "a707c8839cc6dbe320ace8c84a53269b1fdde773b2c708250400000000000000", -"service": "00000000000000000000ffffbc28fbcc", -"pubKeyOperator": "89b1aab3b76ccda3df40b73c9cc911e8455679a0b613fd41f22675332439d9980ce0b867e91d2a040f293b147dc1b88f", -"votingAddress": "45GvkoNLknCH4CnpdcPe6obnycuX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7f471107ce6e1a1b6ba7b0dcb151663beb3c5b8b28966f2b05d3a95f042813fc", -"confirmedHash": "9fc048af1f552101fbf2666384c0294b252a1ceda05c4d9c1300000000000000", -"service": "00000000000000000000ffff453d6be3", -"pubKeyOperator": "0ca6c70e9ba66c9f4c88b624bf8ef23813c74dc2f2a18c8614ad1f06dc8ef02b6895e0e98e6415b6c05d23b1ca8c3314", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7f64bab72c121b345ae7cb56692d815ff0233d1f4837fb95dcd50291d4e910dd", -"confirmedHash": "beae829de12b4541bb5f7b1b56c3112bba87218693a3409e0200000000000000", -"service": "00000000000000000000ffff44b7b2f4", -"pubKeyOperator": "8fe87a428eb924d06602a4690e49304843bf5c24459f6dd50faf587f93e6b4785bdcfcda48754c787f0339796df8e6d8", -"votingAddress": "4WstnK7GkRWE9THEttP1z8ncBvBf", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7f70a950a340810a7efcdb3b3218ef8cf469f04a97cb7a0c6ced9bd1259b6543", -"confirmedHash": "b98ef71f14062e1eea6c2d6ea34474cd142dcec16a63e9ca1600000000000000", -"service": "00000000000000000000ffffa76329c6", -"pubKeyOperator": "07f4ed0e7b83924c83519b09a34dae99c4d866aa3477fa838e9d9f4ea3d721062fc8b65272dafb4e16d92f2d7175c1bf", -"votingAddress": "2TcmrrVjbh4Brfrhk5cVcxFnZbKi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7f82a39da53d1a79eafcc17338c20b9a447c494ddee171d3e444a153cb830b81", -"confirmedHash": "ff9569df7299cbf1859bc35f8d36d1e34f8c0a3398c637450400000000000000", -"service": "00000000000000000000ffff8a449d0f", -"pubKeyOperator": "961d9dbbc97357537d6b0007f037903e6c1a9b56b3e9ee79489a14ba65780a783a3964d50fb33a5e5569e487d4552be1", -"votingAddress": "4HCUyJ9vt8MExFWN8YuzKYgcuP3V", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7f87163baaaaaff16fd3cdabc002c9b66ca85d5a935f254f83807c3e94e454bc", -"confirmedHash": "5f3d1cc0f4ac66e78d503704aeeb91ff712b98a2c189c76c0a00000000000000", -"service": "00000000000000000000ffffb945366d", -"pubKeyOperator": "0980de89ca42fd8ed2ed784f5b3c9adc49d530b160c7f0281494b4559a62d91a54c592d4c81dff76cbde16f4b969a1bf", -"votingAddress": "41779h8a9D3PFLJK8WBeHTUdBVeH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7fa6eac12366390f6a4dc497cee62f796363d8541b01964f62457b9d44cb0b0c", -"confirmedHash": "cb6b8b5cf5be300920fd2c39f8f6215c22f34b55148c46351500000000000000", -"service": "00000000000000000000ffff2e04a266", -"pubKeyOperator": "8ceca4ef8b52fb6cb9f356c0b234e84aac925457ea7e922bf5256b2226c3e9cb42720f0cedcfe36b10cfc4d538c5e345", -"votingAddress": "2cwUL9corjtmeQdotHjYsAesdDu9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7fa948a3e1fa27d292f7635c82d5cd5f69350c75c6a0e057061a045d7294f0bd", -"confirmedHash": "deea24e962fac02cf223dd40dd3f1d84e4375d0d51276cb70500000000000000", -"service": "00000000000000000000ffff87b5322b", -"pubKeyOperator": "93d761efc4656d60dd3fa6d7632ef67c13211afae37508e3a89b4e5ab487b680a94624b915dce1a407c372cb317cf69a", -"votingAddress": "3xa5wVyKbSFVWe3q1tMcV6N7hvjv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7faef4541e13625c867f06b65314e248a98ec6a26a49d42ed2ca4cba71c17b0f", -"confirmedHash": "13d658a0e54b7a6b6646795c54508026592c299d51283d0a0900000000000000", -"service": "00000000000000000000ffffc11d3975", -"pubKeyOperator": "829c943f21b5bda506a141161e9737408975e8ac23c89353995df42aedc0d5137b92ebbd9e413dc7dee318ce9351c19f", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7fbc26bad8e6b6791ab0658eef7095dc8161ab162d81842361c4184b8b575303", -"confirmedHash": "328bd6ae22ed6bac02813a18a44295322acec6da263c5b550700000000000000", -"service": "00000000000000000000ffff5fd9755d", -"pubKeyOperator": "96dd8dbdf035b6dce254f4bea8351978b458ce95f31ebf9d91adfc4c476e54107b24bf3f00d116fbe13ac2e8031dfa8a", -"votingAddress": "3PHh9xWfKtBAj8yzXcgUfnE39jru", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7fc5136b3a3c4fb872e737370c39c689e705934aebe3b2527ff44aa21d2746d9", -"confirmedHash": "edfe6438f8e62521a1fdcb2a396192ad6fc14e2f35fc9e720300000000000000", -"service": "00000000000000000000ffff3353a61b", -"pubKeyOperator": "8e4503aab4de081cd09212d4c25357e4253e37ea4cd57b6b6304a4d27fd8a04fd97d3a6030e7117019958664924fa28e", -"votingAddress": "4Xr7nMDAqQn1gh3bvQaqDCMv3DxY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7fd398989b81507ae3d7c1d47f99b6af3a98381b1cbc1955342831925e58e1d4", -"confirmedHash": "b7de66377ac2e6b87d77c94d6af5874ceb5fd823caba70131400000000000000", -"service": "00000000000000000000ffffbc2815f4", -"pubKeyOperator": "8d2acc170798aed2360777c9f48f48195ee3f5c8d071c44a195fbe2e44be40d35f4435f23ef347a842e194b85ec00534", -"votingAddress": "42QGA38pgTwY7nEd8zFjDxAT7qR4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7fe1c5d40d962fe9055ba0ff2d0acbfe026bb28d32b9a60ff77f87c1618adb42", -"confirmedHash": "0ab7c7b5ff128228c69ee7c7beb45a194efdbc2e17dd3c3f0400000000000000", -"service": "00000000000000000000ffff8b3b4d96", -"pubKeyOperator": "0c8860aa3c05a9bfb80e26b49dae338eccd1e846523bc7e37cbbd270c2324b28ccff19f5a2db31b9d48e7d9cb6ff9e02", -"votingAddress": "4ZMEerBpHAVPR3tYkD38rj66KnCj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7fe1f199334a8ab3cf9f78d9eabd41ec751b1e8e4c43dfd1a63cbbff29d5cbbb", -"confirmedHash": "6a5e15a6654babe6fea0a9fc4bd0b704b270dbfd80a776e90e00000000000000", -"service": "00000000000000000000ffffb0df80db", -"pubKeyOperator": "071d9e58b9926745a116859778bf631fa4f0f1e97fdc604dc23362e9025daea64821199d68c985469f164ab693f02102", -"votingAddress": "3yEeg9LeAtTxJyZjVrv5J7y36S5S", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7ff2e7deafd629dd20d97a36eb698563c05fdddbe99a5119f6bbc8a2c6ac932b", -"confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", -"service": "00000000000000000000ffff9f45d5bb", -"pubKeyOperator": "8b38eb72ffebbb44931cb580983a259e443d2f1ab9ba31c10c45b328ba9efe2a97563a1bf5a217067d341f32b0c6c0bd", -"votingAddress": "2yo6xFrH4634koU12dpmLSRCz4jY", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7ff75c69aae2870396dbbb082c9fbf817c622123bd63810cc94423ed6f70ae5f", -"confirmedHash": "fe096963ac6afafdecadf238e470fcb612534d52ef43c3671000000000000000", -"service": "00000000000000000000ffff2d3f7491", -"pubKeyOperator": "82867c36ceb8f26d1f85364c6a2fb778929019006539d49038919f3d7927bb594fa84d1cc3a655b2f552ab12f7b16bcf", -"votingAddress": "txy5qVxCW5Z8sgVbJ36ErJAcxqH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "7ffaf8351f8a58ab942e33f9755cd07b84a90e86f3143776c09583796b978ff8", -"confirmedHash": "cedc00f0912b5e1a88a2a4745218334ff6f789f4cd18c1ac3100000000000000", -"service": "00000000000000000000ffffc6c7712d", -"pubKeyOperator": "8263db72d78e057ea574ae2695da23561d22bf9d999c96d90c0a20077db7b14e90afa6b715b473e119338ecad39c6789", -"votingAddress": "3R7pLJ4CyPQSQuUiAEwCQYxjSjB", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "800266fedeaa565364d18791658c3d7ec0efdd9dba9383ea448511b9e12bee00", -"confirmedHash": "885d42570aa964b74056996d7ab04a1182a5d994d0f2a0270c00000000000000", -"service": "00000000000000000000ffff4f621e9c", -"pubKeyOperator": "1394ab2c4d0a6dad9459a904cdc4376be83a124499e3a827d90ed8d4ed6e308a36d395a6eaa02e91aa23cbc589bfb56b", -"votingAddress": "3JwHeUNeS38TzPBWmPSFvbDM52m3", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "800a38f2d7b9f0f099ab3faa30b32a85e98464000ddca7cad1b7e2687588ba2a", -"confirmedHash": "635e82d5edc1ed8210db7e0a5fc2aeaadee08a78450750d41100000000000000", -"service": "00000000000000000000ffffc3b5f2d5", -"pubKeyOperator": "99aa6df6df1b3aeda096fe2a2d8e4c9ad75ed4a8a5589970929d8568bf96ebd5d07b95ef90c9bcd398dbe19a7ec55b55", -"votingAddress": "3kkyeS4n5qhZGWZvTmWF2eLM1mCA", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8011b1648a0fb125f33ba647c0f54bc46cdc91caef4cb98f3c425645a0c9adf0", -"confirmedHash": "127d171a09c5262bac4d859ba0022dcfc34e343807554a5e2f00000000000000", -"service": "00000000000000000000ffff129d8194", -"pubKeyOperator": "0c3bbdbbe64a575bdf57efca0e4cf20afea2926e1367c30b1ddbefc68c3269d835f1a4c21dd6e397270a66f20a973ee3", -"votingAddress": "2Dh6qQc2gE97Twt7FbD8vfrjYEzo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "801bcc8abbf25dfb1ee30ddbb4729f6faa775e93115815133a31f71899c0c969", -"confirmedHash": "c9a6e400e15df067dbb63273b0855033a0a3e0c8f8ccfaa10900000000000000", -"service": "00000000000000000000ffffcebd84e0", -"pubKeyOperator": "00981465243fa69c0b5186b5506a9a62a7c9ca300bb343739965b2e90919fe5686c8af022bf428c92a7752e7bf6133fa", -"votingAddress": "3cc28z34YAjC9j758eYL6xmUwJXG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "80254943ca28863e5a0b805f5efdcef50395bf1cd57b74a2c290f7e64889d723", -"confirmedHash": "517f9abe98a7b32ca1b016fbf96d977865a7802e7eefd8431900000000000000", -"service": "00000000000000000000ffff2f5bccbe", -"pubKeyOperator": "8b0175b7fb77e9f03f8c7bd8e757409455be08bef16212f2ce265a7be2dac3f11222ef880fb52bb73f2a4923514b1243", -"votingAddress": "naL8MY316y7xeBYyAt5Q8ZPHvKX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "802d4bb1ac19cc7652b6fa72b2bada47327e7a5d991d50f6d211e403c16e714c", -"confirmedHash": "b3a1ebf713fdd1ae9b9662698d9433859aa5fec8a7cae4511e00000000000000", -"service": "00000000000000000000ffffadf91a14", -"pubKeyOperator": "169662b0ecddb0e2d8bfcee23f0df825c97a4b5f5d3c91579c9752bf741135e93ecd7b0deb9c9cf4cfe76af42bbb9dfd", -"votingAddress": "3ooRrAsPio5u16mnnfgyUussFSvJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8045ab9ca2f4781a245ac5836f3f1ff65a863f7573dd7ddb7b85a2b4c4f3dc17", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b07f", -"pubKeyOperator": "904795005d1e6c07d5c18011a5c65fe476d0255996fd66cfd74868ecffa1bcb813b751e44322d710a7d0270cedb1ad42", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8077971005fd2eb00ecedaa724abc52b39d3e4ec9b3881a43bdd75816c06b31f", -"confirmedHash": "75eaa44d97f10f493b1af7a2b36eb48563601c1e0aae79621f00000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "3zkYzmE7k3qn4Y6xdvUfuNH4ZEcV", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "807d4132fd8d9cb5a38e306f178b81c67278a040e95ecf7fab7559eac23e7157", -"confirmedHash": "2e76f59997f2c48595691472c108ec64b11bed25232771ab0000000000000000", -"service": "00000000000000000000ffffbca67df7", -"pubKeyOperator": "185d36f99b9287a2d152ea2d5ae5a9fa9686107004a50625569fc3ebd5f3bb487ef8fefe97d2fb317e507c79b332f12e", -"votingAddress": "2E7GKfWbQMYdVGKdeZURRX5RR9hn", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8084a5ef61b6dadba2e0d304779d18225c91fb68f5ebf0b91771debff9b5fd43", -"confirmedHash": "49da7158f6a69ed01ee225532c4cc4f64b0b2e4a5056cb531d00000000000000", -"service": "00000000000000000000ffff50f084e7", -"pubKeyOperator": "0dcbe6d96872279cc7b4b186eb39b9dc5c2dbf948eacb5a8c9aaf40d2365e5e4bc280b3b8b66624b8fd0ee4b4d7f930a", -"votingAddress": "2GAHHJmZcQGKegRi4w5yXWBJpm49", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "808bd2f220373b325f781829ed8866b37e3bcf7346f7b2d3187e713ccc5238b8", -"confirmedHash": "16393b0bdacfa0a283573a23e689a1a1908edba646460d540200000000000000", -"service": "00000000000000000000ffff2d4df412", -"pubKeyOperator": "92737a064249d3e8cdebdab8babe58a5d9b4d9bddf312b6d0295ae3841a36589e8ba22ea911b749790a5aae1f13bf985", -"votingAddress": "38JUzBwW9PqKpGD4DPE9cA1F96gm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "808ef8607b51c250e7650cd7823cea6bff1e4d6228094bbbb63838f7a23e44c0", -"confirmedHash": "10c7777e0cf6e800667f4aa17e85a7ce8720facc6b91ae071400000000000000", -"service": "00000000000000000000ffff52d31587", -"pubKeyOperator": "141d662ba01691ab25332200f2f3a32223c7cbe2404b466968004ef176f59f7ee462cd908f6b5d2924fe73aa65cbe8f1", -"votingAddress": "49VEtkXvMUeP7iDSipPndx3Z23hx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8092fd126de5e2e48943596e9e048c8b2904d289a1284abb717cdb998f076eb0", -"confirmedHash": "7c5317ae3958ab7d91df79368391f7b76d162d924f6aebcb0700000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "3buZorGDjCuYP3Km388j1usRHC1Q", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "80a4711b9fa549f2b93930d809c785dbd27aafcd1fb3605efdb529ada7c297d4", -"confirmedHash": "f95d58e237f90d5bf906336283b059e02687a467f1ce27b71a00000000000000", -"service": "00000000000000000000ffff416cd9f2", -"pubKeyOperator": "0025af02007de457012315d050188176ca2384e71755c1ca4ae340860c3c4820baf84fd28e3b47b342eab57e7006f5e5", -"votingAddress": "4Dsci7nKtGaZ2wAWHDgNHbxExRNw", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "80d566dc8dececa2c202c36864a7f58701f07c0e90209c3fed15eafd60fe4557", -"confirmedHash": "76f407e03cb8fba7f5f4b72b3b7d7976aafd15215536b88d1500000000000000", -"service": "00000000000000000000ffff55d1f1ba", -"pubKeyOperator": "00e2a1ad31054049cdceda1354e25e030bd48c8abcc30570c568f2f462e94bbdb8ee0facb2fc99d0ef5c0a850891b10a", -"votingAddress": "W5FUX3Fx2iJYWB7aZ5awYqcQkEe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "80dec15c986f4c21339754c28a59ed2a1bcdd906b3b4ce1fc6b5a05304983ca3", -"confirmedHash": "274cc025def904189fe9a5e9460f4669ddbfcb885ed787051b00000000000000", -"service": "00000000000000000000ffff4f621f3b", -"pubKeyOperator": "91e97a5459b1a1e42688a1dd0b81e57a97a45b2b767e447c3054ffc51a14a487f4ce3f041a4838554a2ae139cbcb9049", -"votingAddress": "4A2Hj5Y7QaC13GjVj9UsKEiPqAgp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "80e5eaf65a04e1f2fa507a0634c4ea13265c31ff8eab2159e709141fa17e1eb7", -"confirmedHash": "2ddb17fa9d6717d30131ee3ee178628b9d5359f8e0fc69f20300000000000000", -"service": "00000000000000000000ffffbc28be35", -"pubKeyOperator": "8cd6ffe314cfd1654369070dc969654fbfd8894ad4de5fe860d79c09d315dd6b37679b2b56406df4d70c08e585bc4ef6", -"votingAddress": "QNPZ9wxstf4UbNMseDfUwHxdcAS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "80e847aa0269602f087217300f426da681a374ebe5001b003ebca8115b70c0c8", -"confirmedHash": "6f0ad2423f11a9a9d0935956979411cd72434e5e360c4bb63400000000000000", -"service": "00000000000000000000ffffb9f372ee", -"pubKeyOperator": "8d11628045ed7318932dcda1e7ddd8fcacc87a602f918b51422594cf2597ac9de9144a16904b8a6708f8e3ab453fd3cc", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "80f699ce99b24443c373c871ae07db41eb27fc4497c969466f75231f83f3b2bd", -"confirmedHash": "82ab4b63fa3970a636ec7a713b585558e79935af9cb3ab092100000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "r5CJX8BrRSaLm26RW5LdTbDednv", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "80f6c2f44a6dba8d96b5539c32bab5d46ccb8a4c3068d40a952d4b98a2fb9bee", -"confirmedHash": "39d98cf19afeecf91293a93ebac66018148daa2e5cb6dd810c00000000000000", -"service": "00000000000000000000ffff9f597a80", -"pubKeyOperator": "16eef97df9e7c18e15533b0beca29a08fe41bb8e796a5594fed2d8f9f436e6809c66ca9c55362830804756ff478db166", -"votingAddress": "24jQQmrgC34KEevZrDLaPV6KjRwZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8109a45edd30a1ae81d58e252ba97b59f178e13d300438b414f2bfdbb03dcd54", -"confirmedHash": "c59afe08483349291bcd8ec6e4393bc68591cfe7f34c5daf0700000000000000", -"service": "00000000000000000000ffff52d3155b", -"pubKeyOperator": "8619b50af257879345158e0d307ed0960005cac50fe04c21f12f393972a68773daba7452a448ea013ecea15629b5387e", -"votingAddress": "2esqSc9kuELwQn9f2aENShKrr1jF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "812edd1faf8fd8f515e95a45ffd7c34c34f51aaadb5fed1b50b6fea69e0252d1", -"confirmedHash": "42e8b8913740c3dbb938334f4f057ca2d1e49bf9b66f7ebf0400000000000000", -"service": "00000000000000000000ffff689cfe29", -"pubKeyOperator": "03be1094aaee9f8f423b6ed39fa4205777a3799327c27fed7d15f2e036e6f62efd336d87e0fbd9d2456b651da8e27e81", -"votingAddress": "2NCA4xYFohrvB6Epjonf2LWNW1DV", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8133464e06d880c262a0adb863b94d20d2c6835189e4fe8462cd25a13c9c7476", -"confirmedHash": "0fbe5b79fc8b8e719f17afaf044bfb393d80e60c1eb6ff961500000000000000", -"service": "00000000000000000000ffffc0a9070c", -"pubKeyOperator": "1663364df7db9bebbab82c4ca285e70195f8c1e4e6200b5d6e389569880ac24f7ddbfdf2c0902d57778bc61ab802d944", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "813fedb5472b5ac57ba6f9f194cf010c44e2b65ff4f89f4cc76f0c3e05ecd41d", -"confirmedHash": "4130b5dc087f489c12277f886d58978ccf05fa57e694729d1400000000000000", -"service": "00000000000000000000ffff52d3151e", -"pubKeyOperator": "932d5453579dd2ba979738389cba46a9c4930be8d41266204acbd28bdc01931aaee32cbbe98bdd0976e07fe7a7e33ab5", -"votingAddress": "28wwrB65P2BkxgTtTszNJp4MB1EB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "814896e48b5f09b55ce6b084ceeeb77c453d2956196842976c59b8c155438956", -"confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", -"service": "00000000000000000000ffff4e8df088", -"pubKeyOperator": "04abf0519b7114fd86b3f17f536888dbf93d0619f87e7f0a41c71a49caec9a619752a56d78dd2d0374cea38e557213e7", -"votingAddress": "GFdHn2cSjR2a4xUvGgkYEoxp8Mn", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "81507c27cdf0b40832e6baa9f7df5fb36f81bb310ec1659e6768069a8339acb4", -"confirmedHash": "f0ec226c51ea3cbbc65ca9fdce016f1a05de2e020dc968c33100000000000000", -"service": "00000000000000000000ffff2f6e9a4d", -"pubKeyOperator": "06bf92f0a159ef39442ec3773cf0ef0ab3195d6815631a628e80a0f6c78fae24e2f9a30bb46bf8f56a3bf348c6919bad", -"votingAddress": "hBQoFyzjw3nCpCCCLV4EjbPLqRN", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "81708b5e8b3cc8d15b0093e19015750e43236b8fe32184b5110bb2c25521b8c0", -"confirmedHash": "c160fef94394b3621fdf35067c4497062d35e05d7a1f9a220a00000000000000", -"service": "00000000000000000000ffffbc28cd06", -"pubKeyOperator": "0db49d800f34b5d4a5ae60b2e4c58b6d5711042985f637504740ac0a183c0938fc27fbd23c0b09ea6d12f328205ce58a", -"votingAddress": "3JtwLoWbNxcgq3FaGU31wyYuB7Hk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8198de3a8cd4d152c6a35da228186741c6ca05f60e66e266c69c6a05782b8986", -"confirmedHash": "94405d4fc981d54d640dd5eaf2b41ef8f4c0f7541e1fe0960e00000000000000", -"service": "00000000000000000000ffff8b3b99f1", -"pubKeyOperator": "18bc6963ced6cdf7add0ef3999873f1ba9b654a067e7038b0146dfa4ad0ee378b5f51630e67e53f8bc20e74a280298c6", -"votingAddress": "3MkoDhgveH2iVs4Ak3XmSDuP5qEr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "819d79681b40db9d66cc58b4edf594378e0a42ae09927ca19d5ef7b4fffb4827", -"confirmedHash": "91a6595f7fb53f1f09f9df2e741120864738144ed1f9572d0f00000000000000", -"service": "00000000000000000000ffff55d1f277", -"pubKeyOperator": "05617be621344ce33d35187b4fd23edfce92fbd419d771da4854fb3ef3dac035eacd88150e44c15628e45d0cde6de5e7", -"votingAddress": "4A2m6f3bKi5MYWVKQqEEneLRUKa4", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "81a59675bf8ac45f67822fd2056d4e8d0c606517b949b4739f0b2f3ca45d259b", -"confirmedHash": "91081bd458a4062893b90e91df4b063730ff6aca504ad2230500000000000000", -"service": "00000000000000000000ffffb280cf55", -"pubKeyOperator": "1008b5cc5ca907c6aaa246fcebe7a4634e675ce8f618d24ba120ff5dcd92777808eeef3c977241564cf21e992eb670c7", -"votingAddress": "WiWn8FBAMH8XV63HqnU2ueYhuzY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "81affea01b4de70e31e3c509d8060f5334c06d30aeae6ba90431dde34028701e", -"confirmedHash": "4895c7dc69ed2216c351dbc1589543cea71bfd62eb4b1c360500000000000000", -"service": "00000000000000000000ffff2d4c6f6f", -"pubKeyOperator": "8d7f760f2686e42d85d29b4a0b45da294beb0f52a2c6c93a717532515354fc846e3028642e02324750a5beceee6c685c", -"votingAddress": "42TtryJhQ1KmNasWXb39PQ6dju8y", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "81bfc9040ea583204c02c2bce6e20d5e62384cbdc45d63397d34b3316eee66a7", -"confirmedHash": "3cd62439516f73d1412658700dc261b7069f5f69325968d71b00000000000000", -"service": "00000000000000000000ffff05bdfd48", -"pubKeyOperator": "17b7ff2d673357a18a31cf9a92b94ce3d45da8e130a17e4a9bf82715b2c97eb926eb39f46ec36e4c9770f2feb39cf035", -"votingAddress": "29CHPqna8B6D85RGnbBqVuo9iDFf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "81c47eb6324036423bbf3ccebb00419e272120b748aff344e55b4b490b640bf1", -"confirmedHash": "f8350e888f0346892bb90cdf45ad9793dd7355fc487a085c2400000000000000", -"service": "00000000000000000000ffffbca6df1a", -"pubKeyOperator": "153ebb7ddcd0bc70cda811cdc5fb7c4039b8f60fc9924844d8ec33db42a43223c320e9ef1cae1d53079f21ae7a29246b", -"votingAddress": "RQxKnJZvpmNVZMfv2KJUM7umLWe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "81c4f802edbf2de0de29534b688e90d036748e4173edb64e0994da92ebb11fd9", -"confirmedHash": "54ea191b304da1ffad9ce66cb9f960f7c80683a1bb33df031100000000000000", -"service": "00000000000000000000ffff8ff48495", -"pubKeyOperator": "01f444a45f32c21ae048627996cad12b9a7b327d2d52652b0107391d008261ff58bd632c794bcd5aeadcf09a81542482", -"votingAddress": "2snrZqKJqpzw3Uyej88maZeHcUx9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "81de53ab5feed9f78c84da02bc87e00ae38899316206e182909b16473bcbbbc4", -"confirmedHash": "b9f0abb87d86c484e51d4bf5cad1a09823a4fcab61213b170000000000000000", -"service": "00000000000000000000ffffd4186561", -"pubKeyOperator": "83686e7dd5210cf140cfd41ccebcede0f41dcb4c1ce613b2dbcdb6de4cbde71732dca04bd8c9a81c1128ffa0756589b0", -"votingAddress": "3VCTa2VqTHvtoBW3TRTLYq6UUPat", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "81e60f00d2d50e2df68cf2185ed7a65966387b9bd2fd3b3056ff70e5cde32f9a", -"confirmedHash": "9f303cec54a5e460299fc55dfa000c6a25e109f88c95264e0e00000000000000", -"service": "00000000000000000000ffff8e5ddb9f", -"pubKeyOperator": "855b7cd85793437732071f47c678d891885ecb4d2577b444de28b454ec6ddb4712ba357dc156b57406e0040f44147620", -"votingAddress": "33ZFyencK2dKLZRj2P5NkfrhtSxW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "81f3061926db4769e846cfdc40ba43a95df91e2a1244276c404687cdae83996a", -"confirmedHash": "dbe229922504c8112cb382f386efa537412b37447e1ab6481c00000000000000", -"service": "00000000000000000000ffff5eb0ee10", -"pubKeyOperator": "0e7e5a1f72524c3bab4d7990a27af8d4451a327109549d876ec522e22305cadf80c9ff0f74d1a200dbcdb1376afd34e5", -"votingAddress": "3Lzp9kESQTd8pv7ZNsfWUj5w1mk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "81f430add76cb476a97847babb98e1520e1d52e6fc5e9c7f7e75cbda1c54e057", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff84919103", -"pubKeyOperator": "1284a6938cc410bcfdaf8af9e3092c1be0e7734ff3d1a5e1cdf6f9017922dcc69880ba48bdb26dd398cf3e2308661079", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "81fa501159f3cdb8f57043d97888dc04a86d11e8681b042af60dee00f5be40df", -"confirmedHash": "2db50aa143655d2cf608f57c758916871e2701a67d34b25e3100000000000000", -"service": "00000000000000000000ffff342d911e", -"pubKeyOperator": "81c1765f6ca9a730f5236321f1b22f85adb3f9484de628b03bf683544567fa607f4133de509abe7e3879ccc14efeb7bf", -"votingAddress": "2u4UBeqDVjEZ42kZcPbdrCWuRfaw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "820c71ae604e5913673386cf0c0baad6be70b1a7e1b39e5e22fb1aefba101fdb", -"confirmedHash": "5f3d1cc0f4ac66e78d503704aeeb91ff712b98a2c189c76c0a00000000000000", -"service": "00000000000000000000ffffd41865d1", -"pubKeyOperator": "0a2079c37278cd66d10f197f13e06e7d88556a087176b14e69ea08df2f6873c5dfd5fdd341b9c17e075db4a19f7ccc3a", -"votingAddress": "mnmjKnQN8isPpRSdwBpBPHg6iLk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "821e2c1b035cfeedc9a5f8b254e6e21a52f75adc86359defeeea1ddb1c553d3b", -"confirmedHash": "8b76eb30d80f242feeb89b110b0e4c2217fa10d6f8e90d5b0700000000000000", -"service": "00000000000000000000ffffa7acd1b2", -"pubKeyOperator": "06a5488f4cd08f3e893b92d31030df6eedd3fa2cd2a0d061b0d0c4102ee5ec1e8063f02bf647fc570f4ec25b5a65012e", -"votingAddress": "2JsRyf5PEeotYm8L5yrXLrefdZoJ", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "823e8f2729f77d97a5989c6b4770e741de4d6505afc78c80787bd0a78663fff6", -"confirmedHash": "835bbd674aacfbf3a7ce35b183f2f4e12d5cf2a8c81d75581e00000000000000", -"service": "00000000000000000000ffff68f8210b", -"pubKeyOperator": "16018c4fb23430d6cff84335b7bdb6e210636062321e9ba483a020e762f53b3bf6a538049dce8f18cb77772818703ea4", -"votingAddress": "3z24hXTsYS499Urcc4VZjo8UfnYa", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "8249bde92990c3e27ff69aa3145d13fe19fc100a61178f7604dab441f1d89747", -"confirmedHash": "8c30f68f4131396e1ca0d479a0ae2fc58ac4ec9d1d914ad63e00000000000000", -"service": "00000000000000000000ffffbc28a315", -"pubKeyOperator": "15a3705fca8ac9bd074a25e0fc09fe5c9ba31aa6a0e46e8e4254a1549f0fa3a91fc566df1ea071d16d3141792feeb07f", -"votingAddress": "WNRNDhD37mnRfDTT1e3dwxqmBkV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "82573bb43033f33c42f7697e151a9aa7583a8b085250cf6c742ec0a3ac0bcca9", -"confirmedHash": "60e0f3fdcbc47cd038384cc747e163d00ad92e094b2ca9712200000000000000", -"service": "00000000000000000000ffff52d3193d", -"pubKeyOperator": "10ee7ad7f595691af1a77bf6bf27ddc8478581c0bb035cd24b743dd0415b336a214c0d079e75454f7624c7e58df11f42", -"votingAddress": "2Lhc5fk6q9BtTqHATjSzbg8HBR6Z", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8267e020de39cdd069c037e480a8b6d88c6dd03cb66674dd61769801070a9ed5", -"confirmedHash": "778ee3c994635430f2f59b915b1484e8eb079afe1a344d0e0700000000000000", -"service": "00000000000000000000ffffd41867f7", -"pubKeyOperator": "93bedb9b8377f3838284d0441e34676e5f2a1b0b179bd0ec55580af31b35b692eef328e74613abfd41ae710167f4ee85", -"votingAddress": "2r6gfTYpKfQxm5bUavUEih7gD3Y", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8272a832af23c02ee87574ef8d095afb87582fc341a8a0e7780e2858f2c7de30", -"confirmedHash": "39d7019f5e3d481b38b158cd1c5bbeddb82de8da679d854c0700000000000000", -"service": "00000000000000000000ffff904cded7", -"pubKeyOperator": "897d8b730aec69e22e2d388fbcb8009621cc10e015aef9d002fbbd0d315f6d2e58a0f143d6770c280ff5440caf549b3b", -"votingAddress": "3cCKHaSMBFPyXXxi2g4Kjp5RatBQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "82736ba6193f31d30acb6f07b6623814f05292cdc15042584364f9c22b6bb40b", -"confirmedHash": "8ff653f659d4478ea4257cf726b06155732e6ac3913d54bf0e00000000000000", -"service": "00000000000000000000ffff52d31963", -"pubKeyOperator": "958a21a0fc82be0c0dfa80b44aebce0025cfce50c4a97d69d7d37dc800501eb93affe736894bd45106b7e5d8ec9ce028", -"votingAddress": "vvBsEw2FQ84PDKWMAeVRwoWji9k", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8277556e2c7b2be37bb7277675959335b91ee08a4aa5a5ea5613a3562d7af11f", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6e38f", -"pubKeyOperator": "13280a689acd96d3431cb7c5f1956f88e31c40a3d6260e20987dd4b896b03263e53055d5b6ba035be03637f2ab39841e", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8282dae87a58d7ca03eeb0c56379c058c9c78280c21a86cd49f44b0952594221", -"confirmedHash": "fab597250c536e8e692ce234ac465942b2b8a2df183305651800000000000000", -"service": "00000000000000000000ffffa8775008", -"pubKeyOperator": "1800b53a9a2ba98c84a6b389456aed7db2e657b377b80280f0cc7a090e027f346d7953ed81b84a862e95852fba63a7a3", -"votingAddress": "4RSNy1TcoyjftZMMuCkQ29332j5x", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "829b95500a42ecabb24e01faf4ee4985e534e15f1114de3d509c77586194d1af", -"confirmedHash": "fb3f50926d7d98f88a139e71af31de2f6504f036b6dac3090400000000000000", -"service": "00000000000000000000ffff5fd8ff47", -"pubKeyOperator": "831f28b865947288147686993519eba402ad34276db0e375bc53c0b61162f392ef3f1a13eb9227ad26c1743b32a9f341", -"votingAddress": "44bwwxahtSs7RaqNBzhgPBA5vaBB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "829dfacd5706aac8b6cce52977cbe800f79551506430e119ecb7a23b6cc8167a", -"confirmedHash": "e676ee9159478de063d33f2eb36225a245950583ecbbdf471400000000000000", -"service": "00000000000000000000ffffb23ea550", -"pubKeyOperator": "813da9abd4f93fd325b582f872b9551edcc2d3069672624f363641d87fff41f53d70bd0fd6ac0956813578eabfe9ffd4", -"votingAddress": "3vpm7LBRDHRV6QfBJQ4AcucnUgrA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "82a92de29b4cd6c6ecf0c4540126725ebe1a1fae3a6980ccd468ef36c4d32777", -"confirmedHash": "a040f70d86919cf216e6f353b3534e7122524e5ed0f38b412800000000000000", -"service": "00000000000000000000ffffc28758c7", -"pubKeyOperator": "150386fac7dc6da722d54f788f86ed39dd9a1b63a5b66eeecd9fe9edbbacbea2ffc1e7e324f8dc4b6a35dc74d9b2a46b", -"votingAddress": "TA2frF29jiY4AdkXQYZFFUiF3zc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "82cddf55f4a057b611d276da478d17db5571db1fad505744f45282392d33f390", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688b5e9", -"pubKeyOperator": "94413f7a5ed22682cb96d0446dfdfe361c299f91598ac48552d34801cce2bdb88dc66fb5cda5967fccca400c3e009975", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "82d06229f471e35ffb9b12d0aa286b23a313e0f82ebf330f537d61d7d0387338", -"confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", -"service": "00000000000000000000ffff17a300b0", -"pubKeyOperator": "8162cb75478d2328c6af409b3ba0f4f720cd30c340d0b608e62bfb7ed72015a35f1ff5225acbd97af2a33320fe3ede48", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "82d3e3d2fd7143e186d2438ea8c7dd6bfabffac5369e9cc6a1b24e4816c36e46", -"confirmedHash": "58ea1663a064fa5f1dd20ae159cabc3d7956ff6daebc00c80400000000000000", -"service": "00000000000000000000ffff339ea9ed", -"pubKeyOperator": "0f7fda2aa1f2abf90551503e5f292d594fa8a31e0840286b345f181dcf4c5693ddad3c48cb8a6dce6fa6c6d11aaae89b", -"votingAddress": "zi8yU6p5SH6WFHpUozgC3jUWo3x", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "82e4626cdade95d292fc2c8275dc92ad4203fac014b1a94eedc7cc0fd8d65a44", -"confirmedHash": "5e4fe311eb5177ebbae47fabe7af53b66dece60ae6de78671400000000000000", -"service": "00000000000000000000ffff332651d9", -"pubKeyOperator": "18f679a0aa83600c6e401ac4f8558700148202be41b10e963c60f4b308e726c6ad9e1c78508cd1e4a410969ac3ca1808", -"votingAddress": "2YuVLLMEa5MPueQoYCCmcAwnAzsJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "82e50b620736dbef082438fa72dc14cfc937d810d7d39610f5f4f6dd7c0d967f", -"confirmedHash": "8da6d003e4e72fc21a08d4e49ea2143628664f6b7becb3060300000000000000", -"service": "00000000000000000000ffff5e82a9fb", -"pubKeyOperator": "06d02f31dab13411c4802eb1cafde5ef0bca19438f0589f04ff58fd458a0590d1e21629c012adbf8b194f44e429c7b65", -"votingAddress": "2kctaAc18fhcDJfuSV3QYq14otpM", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "82e54d3df0d5a0187bb99a9ca3378d78abcb866a640e6f61f03cb8a75cbb55e6", -"confirmedHash": "b7d01c9b5db3aae40d4a003590faf956421dca32c4a63a8d1000000000000000", -"service": "00000000000000000000ffffa516f81e", -"pubKeyOperator": "0fc0ce5a9968a6d62c0b0c0f34aa332973c757fde6f62580f259988e5115b694614a036e336aacd1f4afa7623a6ddcb2", -"votingAddress": "2YqSgAJFENYHvy6uv24t4kG2LgAj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "82e58d3aef7b808050fbb2779a5750f1e97fe60f8f198f57b9d3f40b34e115ff", -"confirmedHash": "c8b728559f26a84d2ac1f1b51c91351c9b94a96f1d06f2962000000000000000", -"service": "00000000000000000000ffff2d384671", -"pubKeyOperator": "06e14aa6deb99ccc974eac00392c9e4430d46e79dde5b3806a57d27fee436640dc56a66a0a883d82be8ee4eb8aa24b8f", -"votingAddress": "3oJK7gqxLpKutx6jrQnQQLJvZxEG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "82e638a67688eec52901e352bb2d9ecc718e8ed7e451c5e768e88cc3bd405549", -"confirmedHash": "0f90585c8f0c2a72623ec1b8ff2b8567a550689de80bfd500a00000000000000", -"service": "00000000000000000000ffff88f38e22", -"pubKeyOperator": "80dc0923f0a520938499b09e04c2d20a3eed81680726f5bca24767f710319acc9be30e22bdec38dc7e45d81eb88ffed1", -"votingAddress": "58mbgGzoGE7oATUW2L1gRSaoAYM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "82fb3242f0ea7813d67eb92e7cd7b4b191a3f99301460f99613ea735749b53da", -"confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", -"service": "00000000000000000000ffff4e8ddfe4", -"pubKeyOperator": "0005ef95afc9acd78f7a82842626cf882b36390c53429384fd29ec4b27ee774dc1761faefb0035c208a22f4a129788ca", -"votingAddress": "2TN1ZYbA6txqevvaY9PSNXCNiGds", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8303bb82bd79f1e6721c0c5623ebc4ade5d45b854da2615c54157801cbd7dbd4", -"confirmedHash": "1ef43ce5b52196943bb4fd44eec12c2a95155172350bd5120e00000000000000", -"service": "00000000000000000000ffff88f31dd5", -"pubKeyOperator": "841cedc2796b7e4a2b6d34e39e5cd0dc50336fe558d7f379ad9d0e956ae4803be00b725e66a56e28b31e1003cdd130c8", -"votingAddress": "3z4yRuRDFaGsLjBcAaPaE4G15CcU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "832a465779429e0af62bc42c15e1cd64cf78a1fb0c08ae7699125b8c83c7018c", -"confirmedHash": "16aeb38ada50ca68624dcda46b7965d844994b336cf249d40900000000000000", -"service": "00000000000000000000ffff86d1f789", -"pubKeyOperator": "89a965eed764c05994e6bf123c0a23faea7d459d8d6005f1d31aee31258e96a0393fdb29032f1221abafa0d7297274ae", -"votingAddress": "2p2hiyxe1BsVTmHmRmFRehv6d9Uz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "832c1f35c975d1fd84be526438287a0e15a0d98d3509c65669955f7307a67c8a", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688b34c", -"pubKeyOperator": "855abc96cd5f5083eb345d812fcafa0d671d4f62bd3af21f70230d34401560950464ed07560393aa4dbe6d6808706f13", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "832d7490ba2f150334fcdaa72e86a3d583bf043cff6babc1aad490dabef34819", -"confirmedHash": "d117824eef4155d979434fba3ba7e972dea3e35045fdff972500000000000000", -"service": "00000000000000000000ffff422a3053", -"pubKeyOperator": "84e3c51e50a0e2f36871b43a61fe594450b5f59053093058cc063adb71d04c12fc40400203ec0735733d768ae50ae059", -"votingAddress": "F3ECM4uXBf5MX6shhrYeXu7txR4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "834db7ac049210972b1421e8a6428a2787cfc56bda34a9eda8963209dd108ae3", -"confirmedHash": "0ce706c08c260fbea9f10c5c8187101d1051010efa3ed0290e00000000000000", -"service": "00000000000000000000ffff5fd8ff4c", -"pubKeyOperator": "8bf5dbbba95ab57ae716d6d13aeee49872ef3443946ccf296077fc106c93db76f64cd79fba907354219a9c052431c9f2", -"votingAddress": "bzNj7rEqb8Pe4n7cA1zG72M4VMA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "834e3cfed88a59430c5a66b0269bac528d7c7b6ea82f7e2db982d572eef83279", -"confirmedHash": "8926b05e70d38110b544a0982e55b63f5534d370f8d7e1281100000000000000", -"service": "00000000000000000000ffff3625c7e6", -"pubKeyOperator": "059fe567e8e59449935eeb6869f3b046a63f09858408d4eaaf8ac4b6d703796a296c1aa8cc942e3bb95bcc7e401e8de0", -"votingAddress": "m685dHyAo8bUskQHV71NTPcVRvb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8353a7858f2bdfc64629630d3db1709b29e6dbdc60cb78608ab27981e381acde", -"confirmedHash": "dd0aab5011df09ef765d1c85f2f4d103c868e391fb049f3d0e00000000000000", -"service": "00000000000000000000ffffb23ee343", -"pubKeyOperator": "8dcc42086635d6bd863d149a573294868a64df7f4a94f8a78cb68b5ae43a54cb401fccda2da6698b63448e787465f54d", -"votingAddress": "NXzoDYP1AYrtBYpB8VJxNhDwmWz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "835876532ac9a11f3cbd010248717048150078712fc42941f78af19789cd3d51", -"confirmedHash": "bf1a566076fdf55155febd6a9cbc1f1b8ff94414459ea1be0600000000000000", -"service": "00000000000000000000ffffa5e32627", -"pubKeyOperator": "0da28402702e0781cf605769389f1f5bba9d0b872ab21ff3f3f0b4a46e707e96c2fbe16496b29d07d72a6760b5e09dde", -"votingAddress": "3BcPRCAME2zHbh6nyojVW3SVYjmL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "83661832b5612630d0d24f8698d3af176f89ea8c1c7bfc9363da4a89220b300e", -"confirmedHash": "cefddadfba5072a35afeb066df12359d4dff0d26e32ed33b0100000000000000", -"service": "00000000000000000000ffff44b7086d", -"pubKeyOperator": "847c21638356ce9eda48508363a2341105e052c0b8b8d90e574761cc0d83474680e2483230594ffcdf423a044fc382aa", -"votingAddress": "3XzP6vwgtJawiLP3HCbisfDD1Lxn", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "836beb9bd19ea33b3c7c422e19f133606e1b08733533c016a3e8aed0cb27b6cb", -"confirmedHash": "fbcfbf9bce71734bc5ece837e72f05f4d98ac1e72bebe0c70e00000000000000", -"service": "00000000000000000000ffffadf906ed", -"pubKeyOperator": "96acd28d12c65a0c49fd06790d9ce7b5440051c960a9f71acd7110bcdd2a66cb15f0a1a9098c48b126d8161ac9e264cd", -"votingAddress": "4VRfsfTDvYMWYdMNqNTeSSHJYvJT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "837903dc54d941e7fd2c7f01f2f65b5d5555aecabbfb159228ce313c8f00e4ef", -"confirmedHash": "b0a18272eff3581b59e8f98ba54c72cd907567c1c2068df61600000000000000", -"service": "00000000000000000000ffffc7f702a6", -"pubKeyOperator": "81c9b5a434b443ed584c9b2d528a5325d9d9b6e9e18ee342c3ca221a921c392ec81834112cfe9df2939cf1ffd7be7c42", -"votingAddress": "2Qo7Z1Y3mHcEpewV1yhP2RkKtQJ4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "838efdd9fbd55d8f2c091eb151bcd885d447db7d059f544bd287303af97e404e", -"confirmedHash": "82efe7ffc72de8b4dac0b64d205bc2cb9a5dac37f80e6a630200000000000000", -"service": "00000000000000000000ffff8b09c7f0", -"pubKeyOperator": "8a61a4026a6177677aafc9115c419cdc478761393aed8e4a5ace54ed63e33321727ddb6cdf30636b5b74ee874bcd16bf", -"votingAddress": "iiSeWofZpDNAQkc3x3GxYp8ZtH3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "839b422eaf6d2a82265026d7e422ec98738687aaea862effe97f8a234715ecc8", -"confirmedHash": "c1a888053c6f9193f87a2ed20a5f646d86d126aa91f0c3302500000000000000", -"service": "00000000000000000000ffff55d1f1e1", -"pubKeyOperator": "8d5d305afb360dd8b71a27fc25838624fa4ea1e5f6e3537946ccb65a6e266a41f208043019c40073c942e99438f2396f", -"votingAddress": "em8ZArz5UDtYGhwCPJR3KEaEQoM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "83e387292f7b40ad8f903f1dc0570489163da1f1b8a94b2d3c401dfefaba0057", -"confirmedHash": "2492ea3b729d90f88b5f842cc4991378f8944e4375a696250000000000000000", -"service": "00000000000000000000ffff88f31dcd", -"pubKeyOperator": "957ad9c8945a8e9dd96953c4251e296b68af247d5109ee3dd63de0800f0c890f98c1fb8c72c175abaac9abde3addffd2", -"votingAddress": "xL5vR7fHnKjFPWCYz1qTV64aAMD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "840f70d800910d7f9cf52ca0db47e10d7b4931042eee5e234d2b4fde85438825", -"confirmedHash": "016132a43f95f3f84ec970411940f9c072d206e11fda68860b00000000000000", -"service": "00000000000000000000ffff9ef7dc76", -"pubKeyOperator": "85939625559c69bee630a5cd42fcc0e31f09c91908abb7b8e546dff81ce3da2c4552ae7faf2784bbba35771f3290b643", -"votingAddress": "38EgQNwxniFhNWgkHWavkMUzBGzT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "841c4a5a3b67ef0472e082bd5e7b374c4c1e870af33d7a20d01203679692b7a0", -"confirmedHash": "deea24e962fac02cf223dd40dd3f1d84e4375d0d51276cb70500000000000000", -"service": "00000000000000000000ffffbc28a30d", -"pubKeyOperator": "8ae998064c71231e031d1d63e8a9fdbd3dbea69993f5f54c885bce0b8c70a4711a55926b04aece8ab994e445a95deb55", -"votingAddress": "SNzFerAaHuBjsq92KN8taf6buvc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "843a7835ab0cb23898f0d0705e60568becc879ea0fdd08d3b299cb450d632d49", -"confirmedHash": "f023921d7c4aeda96479b61f592db0d9a90720b2982b298b2100000000000000", -"service": "00000000000000000000ffff2d4c0131", -"pubKeyOperator": "05f9dd24230b08bdea768f1dd9533568b16e6ea08b56a395148cae02c76eb572a5f4d2f28eb4c1e8ea3bfb2e93b92dd8", -"votingAddress": "48Kh6NnSMoWytS69RrSbAsFTFozE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8441ce08b8d4830d2bb2d75023dac2a3dd339a14bb2c142e355758aba9553a58", -"confirmedHash": "7f20729c0e154be68709cceb13e0c4bba3fc93baed9d49590c00000000000000", -"service": "00000000000000000000ffffbc28b48e", -"pubKeyOperator": "896534a7f0035c819d1dd226fbe769f24ef62d15cebe9cc1a28a7509d4a8c9970ab3aa8a383f18a7c48d056b54dc6b63", -"votingAddress": "nY9oGF7GSVTdCu8MMRoPfQU5BVU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "84428769381147abde93876c9325a87425d2aa38765a8577bdaadba0b0fa1b19", -"confirmedHash": "4da5c6fc6a01ff072916b7f835414dbc0ce665133f3ad42a1e00000000000000", -"service": "00000000000000000000ffff88f31dc3", -"pubKeyOperator": "04030d614315516dcfcf2a0be426603c4e08bf33574ae3afbc3f9a0a90f2cb4bc6735b0430a5d084175c261efb0f4544", -"votingAddress": "4TiakXxEXVhsMAMSNiYs3fCauWfm", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "845552ae83319641abe7b1b4483aca4dd010e14d03f9f775390a8c3f92e1339f", -"confirmedHash": "41eb25b3705258852abd5844a302f8bf2abdd35ba9e124e50f00000000000000", -"service": "00000000000000000000ffff2578b822", -"pubKeyOperator": "992e2cfe0659f5fbdfc552112925ce7709bbb2b04e2b7b45bdaa083b7658efc734194598af49149fa02ba4bdfd62141c", -"votingAddress": "4GdX7Vt37x2v8xXvJLooztXQmUyJ", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "846bb4773c61d9d4a18a714a0e4d5991dbe01df7247450467e9ac5c7de67520f", -"confirmedHash": "9c41ba6225e8223fdf9bd5a3fb9f71741b4c18b3e52245520400000000000000", -"service": "00000000000000000000ffff335385c7", -"pubKeyOperator": "84330d8f802cd6d3edb49e3f45cffcdd270fc38c230d26e47d3fe52d94cabc154254557fd93cb0498f0c273214c0180a", -"votingAddress": "2rX79x8FRmQCLRrhv19qDbgmnPdh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "846feb2ef1784b8d82d3aa687a21b03f292d01c53e2e5c79f96633bae5348da6", -"confirmedHash": "026dd3d58da7accf3c4b7d2be288e6603d5f2358aef70a2e1a00000000000000", -"service": "00000000000000000000ffffbca627cd", -"pubKeyOperator": "0ff866fed6be4a754484603f2cc96b43525cd8ced067edeca9f288b28d8a9f4b836006430b3ede7f22da3294013a6918", -"votingAddress": "34EW3LiPt7aUYGBRXVx9kMLUX5hL", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "847623c176c792eea7353b856f638468e4b20b4d0326cc477e755ffd7cb69a20", -"confirmedHash": "8e45bf03c8478990f4f9a896ebb87caf17377492b443b4290300000000000000", -"service": "00000000000000000000ffffae22e9cc", -"pubKeyOperator": "80f1158da31f8c805f6249486d0dc1b57b1bac6e1d9f9f0faba6c2cedd974e20d4c5335bd991d0fb9c7df862d1edbc01", -"votingAddress": "4MgDet3uzAxZm1YrpnrUEMkiFJbA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8479a34c379d3d3cc560ff5b94ff971d636d193dbbb96f9b7e3f2dea94e15142", -"confirmedHash": "36c4e846dacc626b7619355804ea4f3bfcc94419c17f0c520400000000000000", -"service": "00000000000000000000ffffa8776a1a", -"pubKeyOperator": "8e5c63f4eba8a05fe10c4fa383c2e9388091ecc16f3a228f7621b737b2bf9074d13b11127f69db5f018694427aa60675", -"votingAddress": "4VeuUhvTBuEMghQtArDv2xi87VgK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "84b895ff4ba7481e4f3f6cadb4693f57cf677105e59b9807f45a239f52480064", -"confirmedHash": "a7dd54aed81a16d4ed60a0028f73abb981a853cbb184753a1500000000000000", -"service": "00000000000000000000ffff5fd87e2b", -"pubKeyOperator": "075170a72edfa53053be14a409fe30550bb39e258638e4e6590ddd74a217ac5416194cc62b7c7407b53f122d06345aba", -"votingAddress": "4NAKtPwr6njTdAxVxnRssjMwAMth", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "84dbc999f027e5110dba00256f98e49642500b26950452f2fd2bfdcc32972bc9", -"confirmedHash": "b4992c640010ee4b12d3f250160c84d1751d8806ce84b90f0600000000000000", -"service": "00000000000000000000ffffd4186b16", -"pubKeyOperator": "92444a5a3bc28642379d0e50f8846b21cbdbb5808449d202fa328306719fe4a6491ba0185922bac193efed595c341a58", -"votingAddress": "Us8HSP7dW73mAYTRqjtLnnMriSe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "84f24719682c088064b6f44d463b46d0fffd267909d39b1a88fbfa92809c6a64", -"confirmedHash": "f7c76c969ef5cca2713baf6acd2857724489cbfebd086f393400000000000000", -"service": "00000000000000000000ffffc6d3777e", -"pubKeyOperator": "1491de9f4e77a225d735a0d479b7d76c58c3e5f08a33f0fc0565f7823c9d548d1cebffea5139272f70c49f8f8bc1ce2c", -"votingAddress": "3DPcrrYLfrAaJB11ddCP82qYwWiE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "84f32d918ec5d93a499e33da87bea7e8a2920f498ad2192b384666d80eff71bd", -"confirmedHash": "256314637a9b4349b2ffd536823bf65770332ccc131bf4e90600000000000000", -"service": "00000000000000000000ffffa8775796", -"pubKeyOperator": "10dd17d1ce48ea34e1d2b23ee1a2ca3db0a81424a36cc3bf45cd844e7b6ff8b1fc7086ee3eb9800e77fe9ec7b4a4d60c", -"votingAddress": "3LjY98mnV6rLujcpfAagMNi3bN5N", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "85039b5d2ca73c5ea51076367b38a9685fe7f32e18561cc4b376183a5cd9e9b5", -"confirmedHash": "f05d1db57b973664396c1ca333ba1d24f806cab4832553e00900000000000000", -"service": "00000000000000000000ffff52d315a5", -"pubKeyOperator": "0881f6f465294de57d35f1e406eddebb51d28b485ce3caee750c775f8cf76009ac8fc0e54030ddd23514a3f3daaa31b6", -"votingAddress": "2Qd9Xw1kbCa1imLEy9D137CgcndU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "85178945d6ff422046d70c985b5d826f22d3c84afdf0ca6459eb0adac5c0bb77", -"confirmedHash": "c369a1236e61c70953bd5e1dcb4afaae595e42c2ffc6859b1900000000000000", -"service": "00000000000000000000ffff923b2cc9", -"pubKeyOperator": "19424018f8ff5048fe4efe1023daf185287f254a0d3c976481ff4a2a86eefa70f580ebaa58fea036b0be7d3c12056a7d", -"votingAddress": "LmAFH4dBhGBihnzNNEM6GdMgqYZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "851ed9c13979340a044611304a1ab096433431b7fd86547d06b9607e6be0dbb9", -"confirmedHash": "2b9d059a224545188853cf512691fb6281dc6d5bdbdbe8ad0000000000000000", -"service": "00000000000000000000ffff88f37386", -"pubKeyOperator": "8614b12d8761ef8fffe132725a9a6b511abe7823df3c0022ab3e4dec221cf8ce2ab6589cd617779023a54056d87f997b", -"votingAddress": "4KSx6xYiHoYs6TKeZ2Visks9ZKN6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "85244daf8f8157316317b3c4e8076a0c00082a70fb3e345b5db060ca96782b33", -"confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", -"service": "00000000000000000000ffff55d1f266", -"pubKeyOperator": "94702961f88076c8c2b40bcd1de5b5c25e85304fc3bac4ec5d593ed008efab94855a5582415edd06a619a3097f59d833", -"votingAddress": "hEtHbDpGP5MDaFRrZWqxJqgprVg", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "853a5d55f88c5a3af7ed7f8d437886d5ea2dcd2f5b5197f31546b01d66d48a93", -"confirmedHash": "400c20c22ef9d9ee5140ce3f96fb81d6596a2a7eea485d1c0400000000000000", -"service": "00000000000000000000ffff4115fee7", -"pubKeyOperator": "99b1710f8b4edbe35de42d26a3bd02589a4c4ea038243f86f298480220b9858ea4e25a7ef2e2510c352bd6b1e2b12f86", -"votingAddress": "24rKRftJpJiLoXcTyKFCabRkFgvY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "854ad0c1e8af1d4f68af767b488d235feb90a01621fe5f7dbfcccc6dc828ec12", -"confirmedHash": "d9ed28cdb018ce6e3d8702b566a315f92979f2e666d43cf91000000000000000", -"service": "00000000000000000000ffff58630b15", -"pubKeyOperator": "17e39d0d0d0ce95e48f8c2fb7cb7aa88e59062ba4c51d8c3b01d593cea0d22f4f5146d0c8ca9a31b9cb887d0539d35e0", -"votingAddress": "2vzNTUPjqGq18CJ5ywz3sw9SntoE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "854bc561a12c7efe0abf346b7e27375f4f1c18ac04dd0c861edfa26c24101083", -"confirmedHash": "7dd29cfea495586063cf4e1b16ac509620a2055cf3ce62193700000000000000", -"service": "00000000000000000000ffffd4533df9", -"pubKeyOperator": "08235417c86abd28912797aebf48b75daa5a925da3fbfdf7cc8bb25d963a894d49ef55abdb17a175fc6ad9880d7019fd", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8557de2f7b6d95e801c45127c87c7221dcbc603b0f7e2f0465c0fd7a555db1d5", -"confirmedHash": "91a6595f7fb53f1f09f9df2e741120864738144ed1f9572d0f00000000000000", -"service": "00000000000000000000ffff55d1f276", -"pubKeyOperator": "02b0c862969e728a3df648f795eb3fbe8271ac74246b4232c40767efeaa12477cf774aa021abcb7f949ff17d4e74d057", -"votingAddress": "2PVrGdrESAVX6Mg19GfLVKvpqGeo", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "856ca1f6e8ae4b467a49fb5ca2b267f228e4ba1e5110469227fa4c61751b4fca", -"confirmedHash": "7bff4f371c94a24bc8bd45d996e8e1e504972248543b91fb3500000000000000", -"service": "00000000000000000000ffff87b50fe4", -"pubKeyOperator": "04e4796ed2ce6c2a19f013e4cfcd6551278410da94970b001112913a4a270a3e83ff17a78ec4519fa180f0b74f3dd656", -"votingAddress": "3ykffH6GG4NPfd57bz1iQGoC4ZGH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "857f5d862ce544d2259b075c0e4835e27554b1ce9171892950fe07e30e2d4e59", -"confirmedHash": "e214b09d0f973db51d2c7e611839eecdf05f5c503e7272ae3900000000000000", -"service": "00000000000000000000ffffb23e75ef", -"pubKeyOperator": "1656f57492b1d2c1f35b17ffcdc1ef37707cb5a21f1b6f8815599c568c5298f73fb52e3aa9a231808a7179a193eb7a89", -"votingAddress": "LhDy3YYXrpxKaGtjJWVDhdbGnsV", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "85940b96521e85267424a3ff1b5938808162b0eaaca71301351942b88d95def0", -"confirmedHash": "cbd76d65ade9965ad92931a5e14f60a5c102fb56aba0f20c0500000000000000", -"service": "00000000000000000000ffff6deb4573", -"pubKeyOperator": "8d69cab32f3c8224d716a09eaf1d0c8f7b8fd130dab3be728ddc925516789c2f545da14224f07ba845e4876262ea0580", -"votingAddress": "27ZY4EvJbJuC3QzEXVyTd8aFhQWh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8594f93d0565cf9748cb4d907e3e11a4f7600140e8f287cbbc58f6c7ee73fc4d", -"confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", -"service": "00000000000000000000ffff2d4ced06", -"pubKeyOperator": "93e5b0fe542d997292f14065d7b1af07ee2382419c8f7ace4f030346b36c88f21b6b12171d148ce03ee908066c9564d4", -"votingAddress": "2jmE3Knv67JDTJsRqdSVw8UJoSp8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "85984116ded6a89a7cb33ad1806885809ec194b0b6d60f1fe0a85cf76d7e5d29", -"confirmedHash": "67d290c14597bf72400ecbf2016e6baf4c7bc940e6f269331800000000000000", -"service": "00000000000000000000ffff55d1f127", -"pubKeyOperator": "986b42909e7afb9250d591df2c33e11929e7a6b45d897ab85593b03d82099e91a524f391b05a653d46b0efab5eb090b7", -"votingAddress": "hAfXv21HygJ11TyLjL79xSkg7PT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "85988299619715e7e5079914a06554bbc178dc0f706396ed52d53e5ee667bea2", -"confirmedHash": "a230db350a0d6cf720181303831d2316eba4d5166f7ce8ec0100000000000000", -"service": "00000000000000000000ffff55d1f1ee", -"pubKeyOperator": "8ffd8f80001444c581754ffaf1c9a55f87da3ab3fd45775f6e847735fbf05fa26f0053e0c70a9e5360c075962513e87f", -"votingAddress": "JnpXjHRekK84hQkp3UYxYpfNKiD", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "85a25c89c490ad87312518cb83097dccbf2b43d4a04d9e78413d54e38cb4bf0f", -"confirmedHash": "25c09974e24c508a126a916900319bf7dd02e507b655f1411a00000000000000", -"service": "00000000000000000000ffff90ca48d3", -"pubKeyOperator": "898b75fb300e58b24455996781407973fc0e7fb8c64104e2f79aa560df4d2f6ce5c7067f6a7ce17a931bf09a498d3fa4", -"votingAddress": "3MqmYACgyUNSizZBSsR3JPfNMPbY", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "85bdf4d408893f664d4a45b1616261ece5230075436cea2456375bce2303ea51", -"confirmedHash": "9caa1f77c24a2cb0eb4c6c33698a40bf9b4fc1dc614610451000000000000000", -"service": "00000000000000000000ffffb23e3253", -"pubKeyOperator": "831c24961094e89848ce909b7848c23e703a3737a20c48cfac24652f067b63491ffaad50636415ed9b5ea35d0cfeab06", -"votingAddress": "3zTKJUvwGftYYvHrKH91PBE52tc7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "85da05d606e7e62963bb89ca6596d9222d26f11be247df5d7bcb1b73edf97650", -"confirmedHash": "e5b0942409f2cd2348b7382c7124c1e79c23a14cec3a7aa21a00000000000000", -"service": "00000000000000000000ffff2cf0be08", -"pubKeyOperator": "02c6e4f8d85aa7384126058a4eb277b8cea7489bb928930011adca5add01c2cd14560d7f508d8a838d5a49e1b45953b4", -"votingAddress": "2Zz4TBGXMH8bnN3iWBfmtVdnnFZf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "85db7e5bd4c75934f2ef3a095364273a9e61ec06681b5fb61e5dda151ed3e06b", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff634f0867", -"pubKeyOperator": "85354e07c6eaacd17adac90beecf005476dc0fb85811850880a9bf162653af5f7ae03bf2dfd97dc09f1a5eb8e29554cc", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "85e150a2b19ae9d21e31405b017f1345ad9250a061a4ba0624e869fc037cfbd0", -"confirmedHash": "58233a675d86acf7f39d8b5b39747eec4671dc662c6529c30000000000000000", -"service": "00000000000000000000ffff68f88acc", -"pubKeyOperator": "8104a0c7a9924a716b96640ed40e54065c1aa1b04e8f9a7f85a0a8654e722de8fb1e4ae3736c9be84f8be5699e21f677", -"votingAddress": "CKpoYuti6xGxkLVr97d5xX5Ub7U", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "85e7d15fe2cb1ac456b73605ff571553663aaeb05a7ec5e975933a5a2b0eb691", -"confirmedHash": "3a8b374200a29951f17c0364d10ff9a4e34aaf000d514d601d00000000000000", -"service": "00000000000000000000ffff55d1f161", -"pubKeyOperator": "049dcbe44b8a7193f15011e17eddaa851b102e33cad6713bd10003fa32f218cc0678502de217b57bf8ae70dcfa030a98", -"votingAddress": "QdL2tB1Hv5T2TxHZVvjX1cSnQLQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "86075908ebbc00da03cdd14b337c3a7bef27e90853c5bf62903075e7b1198095", -"confirmedHash": "9349e41f8d2a3694f3cd78d668e75544fe476e9681d7d1fc3200000000000000", -"service": "00000000000000000000ffffc2a3bb28", -"pubKeyOperator": "1121049c0a682381f89230e7b9e0254967e54079f7b21343948e83979d6470c3dc1147f27486048aad1ba31aadc0b036", -"votingAddress": "2usfWEbFYYerJMNqpBxby7YiyqdA", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "861e46d654fc1c320e5e7b76085a0542e307744e6f30a36768bca40a79754f1b", -"confirmedHash": "ce6fedf79934accff0148c34688da77a2530f0effcf9dae40900000000000000", -"service": "00000000000000000000ffff5fd8a6e5", -"pubKeyOperator": "9961a2df5a2a1a79fb810f748961c4970a5220dd0f3e7246f55d5eece6249f67758066087b17f837e365310ea80acf02", -"votingAddress": "2kQATeQuvZsukC85bkQZu8uD9yP4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "86325940f36b5dd7d4583e27c40eeac51233178223b810563225785bf0a588a3", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b08b", -"pubKeyOperator": "0f45f06da766fc716a48644fee4dea02d40596be0f4e3588478accda99bbbab4caa0fc5b8d2b4942bbd0c2a35c6b73c9", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "863592c736c280fbd5749fd2388b8fbb02425292fa9a7ee22421727e11cd8e9e", -"confirmedHash": "0187594ab5fc9618c9c8bb94bbd75290e7d4362bc021a5770b00000000000000", -"service": "00000000000000000000ffffbc28b480", -"pubKeyOperator": "88b5c294afddaf031a291fef7b536c3811a9b62a4d2ae3e4abe6d97bf2b4f0961d3b9e58c9bd944d2b4d2af726f0874e", -"votingAddress": "3BKqSVHT2Q2xNYbJPqPusMEjJp12", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "864c27314fa7a5221ee2fc4b2d196368129d883c6d7ce21ee2cb3ea79d29e9a1", -"confirmedHash": "2b9d059a224545188853cf512691fb6281dc6d5bdbdbe8ad0000000000000000", -"service": "00000000000000000000ffff5fd8ff41", -"pubKeyOperator": "08484b078a720aed2000a1272e133c6ee6f36b059e70949271ec04d6ebc87970bd13c288f2905cffdd44e2b32d388504", -"votingAddress": "464MciR1d77tkfU9DNkrvBPonRzF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8651ebff3bb689b628f1bc1a290c492e26ea7f7bf5ae5ae8067bcc1f3add7e72", -"confirmedHash": "42afa1ac40ed916b098186218b144804dde703eca20c3b0b0300000000000000", -"service": "00000000000000000000ffffa7632acc", -"pubKeyOperator": "95a6e2d1fb30575ecab28005e666ddd5c206c28fb9fd89add9b519e4715b258d98b701985369f6af517cbc83e1363ba9", -"votingAddress": "3dWq7LUxC7dUZUReiq4M37rUkmYa", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "866ce85709a1203c1c7bc64374a5753452543e110b95ccde2cbaa569e577567e", -"confirmedHash": "9de63ffc5cc4b7e774efd8f279873a05a8d97738ce9026b30800000000000000", -"service": "00000000000000000000ffff5fd86d86", -"pubKeyOperator": "0f29cc50c304445f746daf284b985b85ea51570757e1a45bed0c2cbdcdb865453f05eb474cf0445f4e2e0c85b34efc24", -"votingAddress": "3xhgoMBAWPCWqREeeeevvVNRHTmR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "867571dc23ca484ee8fa879055679ae9c66a7fad4224da40d937d7d69a4a0f8e", -"confirmedHash": "b60c3308ddc3ae8eb3ec549eb9806e008df1f543f6f1a5d41700000000000000", -"service": "00000000000000000000ffff592fa350", -"pubKeyOperator": "8ed990cad89b129f6c88f33f785fbc014345faddea9ca4b793eb875c92ed95904f3dc54c6706ddcb17fa57cfae5a92aa", -"votingAddress": "2uTGMHcEBwtANthccvSjyD1PW67s", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "86762ec82b6aafe8798588711bea6ee47929dabba1557954010d041aff01e256", -"confirmedHash": "df7bea7167ebe645e16025183614c34ea48669fd276e7d672600000000000000", -"service": "00000000000000000000ffffbc2815e7", -"pubKeyOperator": "17f381a36eef472d9baffffaae68977d127dca2d41a604bd86bf7e53028eae808b759a229df776da7143f06e41c28222", -"votingAddress": "oPJZzmSFCskeEtLB1fSsx7tEdkL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8682fc71be2a2fc4ef4b7ff49ef573f241e2aa840d0fefd5bcd586748e1efd52", -"confirmedHash": "4b1d58573ae691d7f8341870eb8c734e152c233435d7ae021700000000000000", -"service": "00000000000000000000ffffbc28e70c", -"pubKeyOperator": "90cddc1fdbb24b1300a01abe4d24161e51d629b0b4e1a99729da557a51208ccf118c8f1e2cd059753d9ca1f8aa6f7551", -"votingAddress": "ghNcq9cnvLHXzh2SoALn8QJFRaQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8688f74bf4b062026ef582f782857bb2a8b4eb38a14cd2873bd19db911e6703f", -"confirmedHash": "fa1cccb7c38aa6459fa8c29fb93bf1d98078e59c10f97c340500000000000000", -"service": "00000000000000000000ffffb9b13b8c", -"pubKeyOperator": "041e5a1ca47fbf5f9856f2f2efee10c30945cdfba0dc88f54bd66f76e9bcf0c184386aba43af0a9401e0e5593c54f23b", -"votingAddress": "K633jMz2n3AjBYFT1a87Xj2GAyp", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "86966a96ac934f5c2eceab8af0325767c24b26e4280b0c6495c1ea63aac7b2cb", -"confirmedHash": "b5412cb77f23027f18811c8dd4d4cf976b6ec9b5a4bd93790000000000000000", -"service": "00000000000000000000ffff9f411ff6", -"pubKeyOperator": "0e29c12205334287ecf4d450f78696dee880263222ac07c4c0aa2c51063b5b4f0c308c114b500c0ddb56a7c80d32e66d", -"votingAddress": "WchuXGe6iYQSDGus9UUQPNpGAUp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "86abad867be91d3f687892d4533230d132590cedd8406e779370a46be92e8fa6", -"confirmedHash": "a218da0910c8618cc258d19652859b5ab3c6ee6762a412680200000000000000", -"service": "00000000000000000000ffffb9053533", -"pubKeyOperator": "0139973020a8a710a85d410956b6b1245244d7b8a9cb1bfdc44932542996622918d039fcea45346f0af3495d38283461", -"votingAddress": "3Mq2rhnyJ2Mnh8Vm78CWQwz7Dmse", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "86ae422004169e0e917198b889ea03a605d206862783187def96d04177276f80", -"confirmedHash": "4db5b3aafc6e597aadbb5e13559fcf29f3e03f3e79374ff50600000000000000", -"service": "00000000000000000000ffff2d4df83b", -"pubKeyOperator": "0d578c6cfeeae596ccce10d2093820d8270eff64c093fd92c0fe832fbf9f08f765ba64cf97c18405deb9b6e4e7828fad", -"votingAddress": "4TqutGiR762EpewAp9m771S73thg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "86bda1a615c1d3c1f57ff42a3ea4fc4236eb9c3693350ca312729abf7c72b894", -"confirmedHash": "0dd765e19d89a4a57c37af23cdcd7b2688e6a5d54d1c61373400000000000000", -"service": "00000000000000000000ffff6c3daa8b", -"pubKeyOperator": "1379c53e87019f8a6082ef5083f66955e65a646412721d557be40b4ab4014fa95066c4e627bbfa7bd77b4ccb8d37cc05", -"votingAddress": "2ytM9HJ578KSP2tBSPQVDTS8YCwV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "86c5d265c6c5f7cdd2720b57ef75fd46f212b9f36d5cb8d785c2537d37afdb7f", -"confirmedHash": "57cb4287e9538befeede71aee1cfe0729d20caee761d7f840700000000000000", -"service": "00000000000000000000ffff8ac586b4", -"pubKeyOperator": "92bd8fe4aff7e7da044ee3e0e1a0fa4bfd5a8e8889cc0005e2aa5d8eb632fc3aa907e4d5b3250bd607dba0705168b083", -"votingAddress": "21xACf16eff2KSRyQeBiFJ8CRAC1", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "86c7280b3719ef0146dc2f9085b663928185b4048388c8ee2fd6caaf66a405ff", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff3459d3f0", -"pubKeyOperator": "84b20249313060481eaf28a7188d44ab96458c50be1dcfaa389d22af3845353441c3252e0f90d715e848c2a91b2db074", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "86c9113eb3248ed242e96165fe94a94f96df277ab9c6e1d7e35e5dd2d8a95b4f", -"confirmedHash": "e6a7b2759861c7c24d90aca496dd830b25f1b92dc7d221400e00000000000000", -"service": "00000000000000000000ffffbc28b844", -"pubKeyOperator": "0dde690e9bc610f5a655f485a47d778bc7151436ed48ee907839957b027afc753f665009122109ef348e9b6a6c907e59", -"votingAddress": "3DgepA7PrKp3WWUEfmgsBcUKKfqD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "86cb37a039dfaa3e286dbe1180bbc7f7bd029e11eee7a76da14d7f20e1373574", -"confirmedHash": "eb7ffd4c49bffcd69760298ea8dc35283b455ae1b939b7c70b00000000000000", -"service": "00000000000000000000ffffc0f1dec2", -"pubKeyOperator": "848bd673b9fd1fb4efdb143ffdeb5cc9dc52583c3373df42f9a48846f8afe4ea545cd0d17153f00afa257cd6bfc408d8", -"votingAddress": "PuvtjpAyjUHqfXeom9NuZMGKFSC", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "86ea1b0921a8081c6834cf99e6cdeaef484eaec7436bbcb520f335421561b817", -"confirmedHash": "580c397b1da34b7e2af73d305225bd9f5ab1c0fb4fc971763a00000000000000", -"service": "00000000000000000000ffff5bdbed6f", -"pubKeyOperator": "80f5d6a72d57b10d8773280b553583f69c183c33985a7aedeff63ed7d3d2124ec1551c6b9fb11a45c09351769107e7c0", -"votingAddress": "3MFJG3p2oq3ihGB4jV4SSeHzU6xw", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "86f6432ea509c76c6e7120cc84a13c15a8a99a3dffe378586aaf5a4d5651ea44", -"confirmedHash": "1be79351e66c85c15d3a65cc1dbf765992777b8e58dd04970f00000000000000", -"service": "00000000000000000000ffff5fb3f2e3", -"pubKeyOperator": "04908e06e8d0ca24931ced1c961384a95771ab5559383de7a7e8f98578400adce942062019843bc90b9a5183b9ee460f", -"votingAddress": "3ofb5g4F8m138E4S7yvevAWsDgiP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "87032b75b3d89bc84f223ba81dc4984f913c2ff3f682cffc9cb6a0335eb9b961", -"confirmedHash": "56b5fb807477a8dba68456dee12fb3118706b592e85c1f841500000000000000", -"service": "00000000000000000000ffff8bb4832d", -"pubKeyOperator": "9412f798bca41e20b91e27292cdeeb36e27a0097f37fe53fe27a0d7ee443fa4fd0ac1b0957f3e021b78220a6dc4fcdff", -"votingAddress": "6zQ7Vu8VBf2wEUkAXgPpdM2JkfA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8704c214bc4c6f1ac70a479a01e20a47451d9762ccbb66401986090e351486ad", -"confirmedHash": "b097f3b415f40922a3621239067945aea491d8d4e16698b03500000000000000", -"service": "00000000000000000000ffffb9f27016", -"pubKeyOperator": "852f55c29ebd2f351d1bf23671c5911947ee0d4f5bdc32ab38ae01534f9a9f5a971645f3155336e759b68099dae6ead5", -"votingAddress": "3V6pgV2refmZfFAvoTXUxPCvykhj", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "870d07f1697c8e559e093a3b2c1f778f137ea6f193a54012fe0765f3e8ce774b", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b04d", -"pubKeyOperator": "0d0d8dd20168c5d3e78688faac248bae99db5414c898ff9b02047a6beaa261d877f9c6dff71158dc4ae5804f470a203b", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "87111ad44a43a108e3a7d46153881cb359af56b627469654b7047779caca1d33", -"confirmedHash": "6edc9fb2f4437b9a0227c7c8b118c8e3f421438c26a72d050300000000000000", -"service": "00000000000000000000ffffbc28e701", -"pubKeyOperator": "0bbbe5b660800086bc5b60a2100501ed7ff4dbffcacefde6de62a377cd85d1fafd5fe35c3cf2b8f64da01e636bfb008e", -"votingAddress": "3YudWhCpQWrSpyWUFNcChMzCDiGU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8719aa58faf6cd8513499e9d560acac7c0ce6a604f413a41f5ccf31d476bc438", -"confirmedHash": "672d3ecec79ab6b63f0f8483555ca51b6a834e050f3b6b6e3400000000000000", -"service": "00000000000000000000ffff52d31509", -"pubKeyOperator": "03a97b66fe20b4719d7929ec7db422afa1059703ed92a2acb13da3662f2226383c0ac27a5f7b47b1decf2187256d0ec0", -"votingAddress": "3v63CgPHHVDoJs8cz7EZp3HgFztj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "87210e3511b2a35d31475f02d8d3271763671c1586f3a1f69518c01d1e4cbdfa", -"confirmedHash": "2364b3585545abce8fe7207a0c89554e0cbb68d40ccb48221b00000000000000", -"service": "00000000000000000000ffff52d31998", -"pubKeyOperator": "1232235225905ae0f2f765dcc3908e2e40d241bf9783ee7e39831bf76b620e3c019fdb522900563dc06a0494b036c27e", -"votingAddress": "44MtCuXS9LzgoQfd8uFsPKKiUx2e", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8724fd587ef2534a806004b3c552afa0c34cd8b7f091d923e466458e0a6a522a", -"confirmedHash": "3c7d553d0d5d8b122b2704124f08b8ba7e9241022b90db400000000000000000", -"service": "00000000000000000000ffff8ac5a478", -"pubKeyOperator": "9448860253791aa67094e92c9e7a85c12f6f59a9ce689bd37bce9c20ae618658a496484cd07a7e1c79c4728fa983621d", -"votingAddress": "3dV4e2gEFvnkRW2DeYuL1S2wzRsK", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "872f5e6dff0493ebf2bdd6931b980650eb6d331c4fcd8d96223d79e4532e2fd0", -"confirmedHash": "b440e778fdc880604afc42b4b52d020cf4ab52209d16f4c91400000000000000", -"service": "00000000000000000000ffff8e5dfd1f", -"pubKeyOperator": "045b847f198def97fbc0ff6fea10b257430bf64e4725273ab7cd5a3edd21b4203ce006e841fd601b9673eac5892631c0", -"votingAddress": "2tRy55TeWYT1cKaYo1DSKuEUtHnf", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "87379937805e29fcad0795f36a57d3645f38964640f926fd289ed7988bf6aaff", -"confirmedHash": "a19d103fccfeab027fec8a296b846de333cc87f6e08e740b0c00000000000000", -"service": "00000000000000000000ffff52d3196a", -"pubKeyOperator": "17f9e6c9ffed21ca3d3357f31c18cbc541d95c232025b705a65d7a32be10227c804454b690b28ebeaad910478559cbc2", -"votingAddress": "2R1YaQh8PQHPEQaDPtGQ93mSTokK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "873bc7247d27df00f4c8d74c0e297403af0c0c07d857d127cfb1d1982feb0a76", -"confirmedHash": "b7f0de186b7ab32f07b4231120fbda2714d0640e693612971b00000000000000", -"service": "00000000000000000000ffffb951a50e", -"pubKeyOperator": "9288c0469175963758b19d606f495e4325182b4185bff755dc3f03323129e3f82638a19553adfb63b3270be245e7d6e8", -"votingAddress": "2KBcPrxwNYWhu3C22PeGkKb98YPy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "876054c543fc77b70bb5f8a9714e9508d223fd517fc2cccf741cfff657b1579a", -"confirmedHash": "6ed6a400b9c9b65d4da63626648be9e0bf7bd2b07a8e1db71300000000000000", -"service": "00000000000000000000ffff55d1f1ec", -"pubKeyOperator": "8207d9cec67f3e5c81184e8cb36f14156b3f5dacb5dfd133fc667d6ba1cc14800625d368ab83c5f70b879f5a96bc3abd", -"votingAddress": "3WPuwJCgWTv9PEQNhVgSmC3w5U6o", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "87692b1421f0992d18bad8d7027b859cf62a37f0d6fdb55ddee1395fbdba80f8", -"confirmedHash": "9e62127bf7a53d467c9a96f4971d196a57363e948c964b380b00000000000000", -"service": "00000000000000000000ffff0509ed23", -"pubKeyOperator": "8e43583115f280f6d167fd0f6d41605c8d6c80d0a5fb38b642bb281f8d4459a8bf2886f384c634d8bc944e8844098837", -"votingAddress": "fCuQZZmAYjDhrtfbBjighhGJ1kR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "87759299a08d03009cf535cfc37ed81841f8fe092660f793a17e0ae714f7ed2d", -"confirmedHash": "c20e9d7d6d393c4225365d706383a96582f97ac4c4d604590a00000000000000", -"service": "00000000000000000000ffff86d158b5", -"pubKeyOperator": "99a107fd4ca280c5b3f022e0919c92fec3510a44c4f873e3f8e7d4fed63caa7e5daeeca7291127756a5e969e547bfeca", -"votingAddress": "8ScHCq3jHuQ2nnPi35q7PGx4uMH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "87777b1215bd58f0a5d03d7cbf66ce8dc22397f24688123f7ccee00e6fe24905", -"confirmedHash": "508498ca8c5d3ee002a692d76d337308cd2273ad3f49c56e1500000000000000", -"service": "00000000000000000000ffffc7f712d8", -"pubKeyOperator": "873b4ee245abc5fd26188adce52d88b66430804b5c52a68a3038bfe5f8efe78b4e5db3045a11ef00c1809880c4e5647d", -"votingAddress": "294evPe6fV4pv7UVTV4q85hPebx", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "87883c5b3477d7ca183cb4f7ecdd929dad5f72c52bce256eff183a99d493fd8c", -"confirmedHash": "12585d5e4c1db3fbe1c44b7de22680c50538d308ec8121822400000000000000", -"service": "00000000000000000000ffff2e65752e", -"pubKeyOperator": "8480c0e83e3a5f32675064234d0d739bfca6f7bda70fc2c37d4cd7a9cc97e54a903a1eb5876e4c37f89ea4b993abcc58", -"votingAddress": "2W5SMpT6mtPhhRCXW3cfqtEyzC7e", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "87a2c65e2d1565bf0b50904c35352d5e6147a7f3c63c5db555e8198819682ff6", -"confirmedHash": "169330f0f7581b2bacbe6492967a7281947e054fc678378c2900000000000000", -"service": "00000000000000000000ffff2efef118", -"pubKeyOperator": "8aacd7bd02e2cffbc4c409427b608aa099d3bfb4b8dbd09bc11b360c6cd7cafa3245befa56a9d1b1b143777d541264a6", -"votingAddress": "2YT5TYnYVY5vMmwsjPEa9zWmPC3H", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "87a6b560c10f7173dc67187fc42c61f3dc04cafef3f03aad03ce0e9c0e64a202", -"confirmedHash": "d37537c157819963bd3da465273de69de05acba3e13520620200000000000000", -"service": "00000000000000000000ffff5fd9ba41", -"pubKeyOperator": "9180f2a6ae3d415ef1ef09f418e400400fe4232b436a8465aaeb4cbe57868afcce03115254c6e947279f0c93657d4af9", -"votingAddress": "2Tkhr6s6bvqMzFkU9eWXHBVwdNcC", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "87b56907f1eb2f1afe50470934d1b27560886ad18142ff6e381177baa46ec5e0", -"confirmedHash": "93bc6d1d29ce1cf1360aa5b26a246e58148db7f3714cfa6e1a00000000000000", -"service": "00000000000000000000ffff33267d19", -"pubKeyOperator": "95daf2ae16bbfadf7d900daf1cc563abdb409582ce3a990596a98ab3f4e1aae9afc9bfb977cc80f636487f790da471f5", -"votingAddress": "eBLMXDheKhLeiLGUB9NZFS1nD6y", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "87bd11f78c22a04fd551bf18afe96f6c2ed5791e18ed1f00603654bb0da177c5", -"confirmedHash": "6e536cccbcd4ee52c421bc42fd8e2722276de1bd7c0382c51c00000000000000", -"service": "00000000000000000000ffffd1faeb11", -"pubKeyOperator": "8a6fd134debae8b191837067f8913891e13c45dabd3ac3db92a52586ccee40c8ffbf20ee8370945f47260a42a285effa", -"votingAddress": "3jzRnyHp7hXpUc381ia1hov2h6PP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "87c4461b9854d69b2575c0d8d7034ea98df350929cc5b7a1d9262df3666cee53", -"confirmedHash": "aef6ce4203bc3d19e0ab00bf4f1ea1178ad5094bf30cb7052200000000000000", -"service": "00000000000000000000ffff2e1ebd15", -"pubKeyOperator": "962a9e9ea0437968f1514f8267d6185062b0de15009fe812f70d38f8f24bd6e3e23ae4f8f215bf4c8a4ee1ef951f5997", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "87ce03eaea9149a81b583de8b62c0616baedf55598f7ab8fc118e806238ee5a7", -"confirmedHash": "943c502f65cf5b2b662a583eab9d47b7446f741a53d2601a0e00000000000000", -"service": "00000000000000000000ffff2e04a274", -"pubKeyOperator": "82a3b0d4901e2ea3a4db94debff9e356580e224a999f626861d3306f271421d8dd329c87d31c80336f6986f7de4c1ba1", -"votingAddress": "46xcovTakDaXV6n5PM584Lrvyp9p", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "87e9f512062f7d73b5fef671dfd3341bbdaa6a0a4262cea3365ce41f41cb9829", -"confirmedHash": "966346da385a620e18cc86215c041dd37ba70220f2ab9fc31700000000000000", -"service": "00000000000000000000ffff52d3152e", -"pubKeyOperator": "0e59dab5b75d959068dee8d7625e729ebc1400be49cef0430a2aee3d6477cf5f895da10e2d7551ca7de26ba4f366b2e3", -"votingAddress": "wbLf9tjkh5ZLpyvfp1joWQqf7ir", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "87f992962d9f3d6fa390b4258ce2c1725ffc7ae43132a06d30d68af5fe926c14", -"confirmedHash": "125da14ef27f8eaf1f27141208d75aa4b3ec3ea7d685ba2a0700000000000000", -"service": "00000000000000000000ffffb28021bf", -"pubKeyOperator": "0f9a71ec6f7434cddb53401b5957b0c3f67ccb94f9b298dd233bac50b30dc482cc04b0b11273bcd22e2b0cf9f094ded4", -"votingAddress": "4NVWv2pSiRzUiDKhUccZB2PQ7GvT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8813749d32138564367c2163ce64f1883520a181cbd99eee616ae1940192c4da", -"confirmedHash": "f43628e23dbe228ac0eec76204dc6c5df132f9c75238dbc31200000000000000", -"service": "00000000000000000000ffff36270a68", -"pubKeyOperator": "11d1192451af867f8378cd5036187eb569e39f83119913645e62e6d529b30227ded65f9c9fc58695b4055b52ddaf9d10", -"votingAddress": "6MN5MVGvwnHpvpwCFjzAvn4135x", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "88175e45d6097007250ed0d42819dcbfeb43d01b982199a96c2674030b8fea81", -"confirmedHash": "84d9a83951c34a9679aaced7d80561cde01e8891b1bde00a1900000000000000", -"service": "00000000000000000000ffffd418683a", -"pubKeyOperator": "135538431b4d6a5af03f97eb4a45f9a95b424a43f2b0d52d60eee1e05a3223901bc190bbd79d4b6f9fe8911b2ce4a479", -"votingAddress": "3scku5mBYr3NZiQxNnmpykHRJrjC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "882b642db570153595aaf1b175b1e19f530077a8412e2aac1a725ee5f1acaf77", -"confirmedHash": "5b0bb62006908b98a8d895f1f75e5d449991ca23e02562e70e00000000000000", -"service": "00000000000000000000ffff3624eef7", -"pubKeyOperator": "054aefbf6622ed71ae2c86fa04dbaf2ba786c2b697a51cdd2aac8c14fd05e72fb47cd28c5f966d37a5254186b5c8dd32", -"votingAddress": "BcPCYmUK4Vrmn4n5mgFZJe48p6r", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "883601149671b1debffe98b0543dd2af1979c5a1a62ea50c5cf720bcf4de877c", -"confirmedHash": "67d290c14597bf72400ecbf2016e6baf4c7bc940e6f269331800000000000000", -"service": "00000000000000000000ffffd4186bfd", -"pubKeyOperator": "087f56d7536d593fc271143eb28d26c9a7c4152f7b7b872dab97865742097abfb381fc50d5035c7f0a21118d4fa231a8", -"votingAddress": "2bYbegTF7QGg26Abmqr1Kjc5iA5S", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "886c3cefe0e51cdadd3cbf2b0b228c6830e8afe408bce7d24ad7a96b396bb91b", -"confirmedHash": "e49ea04b06c912021d8ecfbf5c27a0bb2377d9ab31fc22b10500000000000000", -"service": "00000000000000000000ffff36afd275", -"pubKeyOperator": "983d5dfbe31d96b2c6af08911d1482cf3ff5723d361f8c20a382d241439d91159955074d0dd8d5186a03595aa280a2d6", -"votingAddress": "31BPVrj19ZcXQFBuBi4BetyHRE21", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "888023c633ed03d48cc7586416187f6ab3e65961157e32eb835c01eda3c805ea", -"confirmedHash": "21efae7911020fb3d8c28dcd3e9062eb83ad279cc1ee3f5b0600000000000000", -"service": "00000000000000000000ffffb23ea1b0", -"pubKeyOperator": "129c33054216010cec4f2e48d3e102587ec7a6ecd87f90c18c85cf0f935bf294a7d0af5a4f93ea06b1191802c2d9cb66", -"votingAddress": "kGbi45cP4MWU5wCUH7wJ19iRw6x", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "888ce9aca3f92bf90719d68ef9d1de7e572b7d0083718d3c1a152f96474b6fec", -"confirmedHash": "9b5bc5f246bd929d5d85fc0a4dc95df780c83751bb96832e0e00000000000000", -"service": "00000000000000000000ffff55d1f27e", -"pubKeyOperator": "90359b829f4acf51dd3a74ea2a5c62d1c051b1abafca5e75b4236bad5ecc615dea9e0d3f20f333810b1a6cbfb3d7cf48", -"votingAddress": "2gARzXYkzAqXheAsTxqZN4DhcA5i", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "88a4a1be94737cd891782988d968aa24ee3c72ec16389c25e2890850a3fa139d", -"confirmedHash": "3c23548712f2b23de7fce7edc21b544f3256850ac6b306703000000000000000", -"service": "00000000000000000000ffffc2875a21", -"pubKeyOperator": "08b4bb316e712645d9df9b20675d0118cea2e7eb9513f8c04bc1b34f0d23e0378c4bd27274e350af32974f6e063c9287", -"votingAddress": "3NRUbnxNScQMQfY3Yi1S4SHzWJdF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "88a89145430b9d11e700299f192fd97f64ff958a75beb01eeae2f584c77be7f0", -"confirmedHash": "40185d57a6ebf7388733c14bf2d49a26f67be0704ac89af91100000000000000", -"service": "00000000000000000000ffff2d5575bd", -"pubKeyOperator": "8beeacfaa3778883f34d1cf5f829a19442487f4a4fd60a44a4ea48ec12c5dc084c6651dcf1389a94349ba301513906b3", -"votingAddress": "LSJgkDXnJAt86vJsLfXGqQkU7F4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "88b872ed8779d27a0445cec22c92a333857d14bdf7c76c84594727e94e7bb83e", -"confirmedHash": "ffd4c4464f3652bdb66a7705e86eaf56f1f43359ac6f65d41d00000000000000", -"service": "00000000000000000000ffff58630b12", -"pubKeyOperator": "0d869948bb27b0f119d27f45f3de6f7c13d29f366c3dcc73938be5fd35d90ca72e68b0c58fbe42927bd65818b292be72", -"votingAddress": "2B7jezA4Hh8tnHL2YfLPqUkDXWx8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "88bb5bcff1522a07c2ae5da947d553f6e5bec7c585372e1f687890fec346f79c", -"confirmedHash": "fcc658c152d3947275907da046e4d043128e97563be506140200000000000000", -"service": "00000000000000000000ffff88f31dde", -"pubKeyOperator": "9520ec505eedb8884406ef7c9e664206081397d247cccad8815ef002ff9ea141332870b6d9ecefa3ca0360cb06c11cc4", -"votingAddress": "9xdY8jsBWCMTgxmtPRRfpnhQ1ks", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "88bf1c4c3e15be644f7be82ec3be2ad9a0fc4786372f064f45f0e69816e780c5", -"confirmedHash": "5226e4a97317a7d21250d60f2e36eba8883e9ac41cf51a761300000000000000", -"service": "00000000000000000000ffff5fb3f144", -"pubKeyOperator": "987d2798ccfec27ef37b49224f8d46ce311e0a1ad5aabf4e65cc8830cc773f97652f47ccba52acdc0a21516fbb40ba47", -"votingAddress": "3gd4VND8dQSYQxnRKi1vLTYWuzDu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "88c22a70cb80c1c75bc1e70690e65a996803966bdb323a4346488a418d2eab3f", -"confirmedHash": "b225b2f15a25ec3a41ac55dd37b2879762bdbfe098aec16c1600000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "1411d7286bb4da9f96e4f8a8b5fa04c602df92f7176f4c2491e6b0d52c24ed9fafc41ec8dbc5cb8ceefea5208bcd4fab", -"votingAddress": "3FDuAz4owQ1nfbo9nDrRwD1a5osf", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "88d8448c90014f395c8b4fc54d14ba1f246238b06fc8f2933eeb506d4ff8e375", -"confirmedHash": "042a6a6df3b7c1751825c10b1105af08c045a054c651e8c21a00000000000000", -"service": "00000000000000000000ffffa1614068", -"pubKeyOperator": "94744c25e22d5dcb3bb44b5597bc86d212d9a72c6f7da9a591e7026293b6af123623ef9180c50f845b4ebc620bfdbe9e", -"votingAddress": "2nUMc4ufnUePVNXeXTZViyEDY4M2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "88de6819e539bf702096e71814d61f2c35bb0fd52aaceec917b1b99ae54b9769", -"confirmedHash": "46c492242f96706f9cf03561067468ad6a221205fbbc8ca01300000000000000", -"service": "00000000000000000000ffff52d31936", -"pubKeyOperator": "0fb14c31c4140d462aeb60c48741dafbe78a08ce77640d912d0439b3b083819d751c81c426842f2246229b2574381128", -"votingAddress": "a6Ae8iNMTJActTbh4pyoRzjvBxa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "88df84aea98de080fc557884db57ff1f4be303ec35e6d210fae7ae3d44dddfab", -"confirmedHash": "9bfa9a03e826cc43582482c443d0cc686f2a867793233c981100000000000000", -"service": "00000000000000000000ffff2d4cea93", -"pubKeyOperator": "860413b84c02b5bfd97f44a2737dc4bd20404614d74e63da02d3dd91fd211d7c5b4ffc9caa23b277b53b96ec50bd7ff7", -"votingAddress": "3KKj1UNAztFdLwttyXcqT9BhsYSM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "88e98c65e977519f152f5574ab3d5f074bbb5a858bb0c4c2687cdd465f8b4898", -"confirmedHash": "635e82d5edc1ed8210db7e0a5fc2aeaadee08a78450750d41100000000000000", -"service": "00000000000000000000ffff50d1e3df", -"pubKeyOperator": "86b91b5fca24594a1a4b67259f40f53ace0467d4ea1bbfa35517a8783f14aad8dcdd89d9ee382bfa7024d1491ce2cedf", -"votingAddress": "44qu55atoBbVnkVyD1qgMfAc5AtB", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "88f12f2a677bb0e272a899c9476778891f7964e800ba3ef9434e4ea52b19913a", -"confirmedHash": "6dd690f2a489fe0e3ad95165c5a67d4a0bd6cf598818cc920300000000000000", -"service": "00000000000000000000ffff8fc62946", -"pubKeyOperator": "10085cd6070ba1324e6864a32d2ab940278a3731411f9f11b0d02da64292f734bf6b18411353f82a8e8542fb2a9d872d", -"votingAddress": "3sEYp6uvqzEaSD8bgYaYGVJRDHGB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "88f86985654021e01814e291032b4caf976e5d948546585c0cd39d91de338a05", -"confirmedHash": "11a8c8a8e63dd7564218f519f64c2e32e5e52ad3032d23150e00000000000000", -"service": "00000000000000000000ffffd4186c7c", -"pubKeyOperator": "8997607e87d3364b12aa07dcb3b58530c4fc0b8043c1b1d50f0c9f7c06e75803cf14fc61ba3fba4290cf6adf5e3eca87", -"votingAddress": "3DSqCy4xQ2s4mK1XNdRfsRQNmpSt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "89182733fae865fdc34a9c1299ce4d3e6b895eaeef8ac2e46972c8d9aa4cd166", -"confirmedHash": "5d6870115ea0c769a088c3842543416ee9f9b339a08cb77a0800000000000000", -"service": "00000000000000000000ffff2d202394", -"pubKeyOperator": "07115da81e3bf2f0c8e5d5456475f5bbf338d3b775dc192ad679f999fb8a432619f29f761bcb92ea5407a3c5c9dc2668", -"votingAddress": "32MajE7KKvyVHpvNCDURchyPskp2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "891b034d249091e59994b2a6537cfb5c8c3050008e8bbae1f80a1a01323af3c0", -"confirmedHash": "f97a0ccc5b1bee7da44c271ba5e8530cf63c1ed6a5fda83a0500000000000000", -"service": "00000000000000000000ffff9f59adb1", -"pubKeyOperator": "956d4d33f77bb5004194243ac856290a4f5d60be1217767f16f0477d30380b24aca7d51d095a04567874ffcf4f4836b5", -"votingAddress": "2LBSH6KkykRvPJ1KQm1q1BWF6NQj", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "8930ca5891f5eb3a4c0833e48041a97100402c70459303dc0d61b0098cce00f4", -"confirmedHash": "5cd1ffc9d7cc86bfcfb2d344bc10512fd86ebaca41bf4b5f3000000000000000", -"service": "00000000000000000000ffff52d315f7", -"pubKeyOperator": "81cdbbd0611cf9807ce5cc15b4cef322bb02615d4291e6c68138e97e1d3383d6f54c2a2a9573728633e7f7c4c4984e3e", -"votingAddress": "3KPwJrfqhBeuzsRys9aSQ6axdJN5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "895067f588cab6c9b7a7eec02ce9f5669b96de8f322570e69d7be577bf56260d", -"confirmedHash": "3f3125f33972010b7c9dd7a0faab52b1a15a6a5b4c5510940800000000000000", -"service": "00000000000000000000ffffd1faf94b", -"pubKeyOperator": "0a1a88512a3c41e57ad762f3ef20337d40b8d2b91b0b4e48910a2ffc799523120998be35fa7877f8b0a4353acb342c56", -"votingAddress": "24LBPyMgGu9HakvzU9PHeCfKiozc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "895ad69362288fae469eb055cfef8ee0c4ac4c680213cc138cb8129e7a0bfaab", -"confirmedHash": "fe262375a8ceddfd2d764b03895f7a14c0f42124a8a330550000000000000000", -"service": "00000000000000000000ffffbc2815ee", -"pubKeyOperator": "9211f013c78cb6b321a442bf8cc95dc3b924c2d0d94948b9939d6611e030ffc496e5fd72c61ea5070691ddda217eae81", -"votingAddress": "wtkGXxXNUwUa8gXzCdTZHShABfG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8973097f8faea67bf3c8be3be70d8e43eaf5aa05361cf545e48b427f264bc336", -"confirmedHash": "64edd0516c6ed1a619d13e66f98317d2b7c95ca8d12da2a81900000000000000", -"service": "00000000000000000000ffffb9053587", -"pubKeyOperator": "1368eb397a4d35305d2ce94f0d78db381978636403e04fdc011f15f43e2fd07801cacb3c2a2fc613c444cf9d384c0c0d", -"votingAddress": "2fZSnba7VW9LyqbktQNQuvZU936z", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "89756f6117b6ab29e248ed8ef2eb2984e33114e2fc3a8b46cb8dad76db05f86c", -"confirmedHash": "7723fc3c5c009470d185d8704d192da5faa2dde0137ef2f41600000000000000", -"service": "00000000000000000000ffff2e04a261", -"pubKeyOperator": "07c060a9c8f6e59fc7f0667e4eab86610786cde7ab20625067906ae8ac6f693048f05b9f3736de96d8e496d7e0418044", -"votingAddress": "3VyNTrYa34QrwTYu3EikEu3RXinT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8975b32b9c8fb3f7212f7150d62bd32836a6dbaac3ee4db3e551f3007b742822", -"confirmedHash": "8878f8c4f0890a4d52aedebea2e4e3a7590c84094a1fda9f0100000000000000", -"service": "00000000000000000000ffffd41868e1", -"pubKeyOperator": "9860dd6725d8888d317c3e0d905fd60fa4dd10b5edef93c942853713c4991614aff4d4cf776d2d33a93d57cb11d581db", -"votingAddress": "44w3zS9RiruF4bHkrW3weaKFQaZh", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "897e3f5a8fd41b4537fbb1c26049e85471935ea58080377afed8c287267c408d", -"confirmedHash": "a2b8b9cccdc9f07082ad189a7afec6c2663101280a2d6c623d00000000000000", -"service": "00000000000000000000ffff44b745f3", -"pubKeyOperator": "16fcfbe2b1516a2438d0dbd03c0cb3e75db7eb6b7317b692871a043217063e97ef6a769b2141cc5ff1b1b5c8613b4b0d", -"votingAddress": "5crXhuWKMRGgh4PTDcaEhZ6M2Bm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "897fddd647a9c79e794b9b3cbb3a54eab7e38f8be3f9e3afbb89abb5c76f3869", -"confirmedHash": "fecb8ca6e39f79a283fee58baceb791e6066e551b51a6f8b1100000000000000", -"service": "00000000000000000000ffffbc28be24", -"pubKeyOperator": "1053fe7f087d571a864a5a7408002f0ad786b33f06db9b719f39ed37af60270eb0c9e494833b6d2d1f029ec2700d3e6d", -"votingAddress": "NzPxLv8mWq1UWSrqMUPqD576zPm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "898dfc634f118cefb3632165c576aff98a0ec66520c7219886042efe4105df45", -"confirmedHash": "b4da35f89f198af2c8ae6b1de6441a109f42f077da6d2fed2200000000000000", -"service": "00000000000000000000ffffc28759a6", -"pubKeyOperator": "02658b865c9648b7da5b94a44d8dec3334358edd15313c9f16b37c8db979a6b73e1185f0785284cd59d8e4f0da6a2fee", -"votingAddress": "Z2rUY9cWjjqmJ9q3o7dHKN5N5Hf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8995e421fb778d088af2f951fa0b908c87cedd426cfa94b5decf69054a29e828", -"confirmedHash": "384705056af13a71965c968f8440f70435560c321393559d0300000000000000", -"service": "00000000000000000000ffff2ee8f9d7", -"pubKeyOperator": "8ad9b57824c2d059c020de10301098755d4b30b2d315897a30c550fa98789955095afb4278bef8fade659bf5b28c882c", -"votingAddress": "46mTemMud1MTPC61rZecnFpNbMgX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "89b2e28f55cc9931560e0c0a826c0858a221cc9a53f4b1613e10beb542c4fa62", -"confirmedHash": "ce2d1bc48482a03c27d32183e358405f76851febd55916720300000000000000", -"service": "00000000000000000000ffff951c9ae9", -"pubKeyOperator": "0aec0d7af1fa531702f43c2010a776fe2d7e7a3255a2afbfad94880defcb17c757c16558f1ea1c37623e34e81c59dffd", -"votingAddress": "2DNtFQ3pFtn7tRpWS2gBzLm1LwDG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "89b7025e55ba7d67f1a85178f23bf5a76a234269d589ce827d3cf63d126e4069", -"confirmedHash": "4510928dcde4a89c14ee6a8a2c9723ebe1be3d1a865597921400000000000000", -"service": "00000000000000000000ffff4e2fe5d3", -"pubKeyOperator": "859427ad712ed724d22de6898a28f20af5fa57acfd638924d3582733768609b443a2ca593ace129ac261172448f7eab6", -"votingAddress": "3USJvZGGzECUXPQP133YRZzLRJAw", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "89b7609c9903e4fad200cfbbbcc2fd2478f6c8c8cdfdcc997e55ed84829d4a66", -"confirmedHash": "cc12ca4ee0d2ac8230d702969ae5de1342e44496d6cacec70400000000000000", -"service": "00000000000000000000ffffd41860b4", -"pubKeyOperator": "8757590e3b6d21d4f6b6331f4d831e089514e52bc8285f3dfa4a842359e2f74a1d97dd56edc8e3286bf8ca7cb000eef9", -"votingAddress": "mg1gAE9w6tw53Eyz6JVHsYoLChb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "89baaa83bb4fcb029423a52d52d9e9621e61fb8dae8a2fec45f216b301c7b8bd", -"confirmedHash": "5f680c2bebccc7b722364e7e41377601c39874e2b4a7b2961800000000000000", -"service": "00000000000000000000ffffd4186d5e", -"pubKeyOperator": "0854beece2ae968a168948bdd38b1354c89de6f5b5770b86ace0b6e472896f140fadaa990634dd3e45af6e51aef5fccd", -"votingAddress": "25CVcUJ1B5tsLLjhJzA7p2TPgTXd", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "89bbe96cbb89aceee1372c112b24efb859f6dc6941fcadbe7929cdfcfe27ee19", -"confirmedHash": "6cea8c36eaaf9491fe7eb6d2055e2377d49f90e4af2641e20c00000000000000", -"service": "00000000000000000000ffffb98ed490", -"pubKeyOperator": "109982969cba295ed9cd43e908dcc3badf2e1c5397698ce611e42b404e4ecd41c752934ed6bcb07b0bcc26790688b7f9", -"votingAddress": "49JHWXTGALzau7FTigGhtH2wAUhp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "89c08f6be23aba8e32fbbe8180df37e338df8b70ef0476ee6746d51d67cbb626", -"confirmedHash": "4fd6c3a09452879e4614e4430c74eb0029e38445383ece232000000000000000", -"service": "00000000000000000000ffff22e9085a", -"pubKeyOperator": "99b025716bc42057f42ba9fda9c7dbf63199d2207d122d8caf7f49d12f2d00f8d9ecd90d189ab3029d6546b89ff23a85", -"votingAddress": "3bx7HLKfDTg5YKra6GAYx3BqxgwC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "89c8d4ecb952afa5aa828cc84cbf26d78c7288ae6ed842a8f09c8b6750b37108", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b050", -"pubKeyOperator": "068f996ce6802597e3668e126b9881364aae7de3242740ab70f2e26edf230b63c7b39ac482995a95373bdbd89efcce3a", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "89d0e7c1e0a8073324a40ed3e5a1c0ec79d1d540d134298fa036837a2b3019ab", -"confirmedHash": "1c3de208859f0b702201022e91db373994a1edcba206886d0f00000000000000", -"service": "00000000000000000000ffff5fb3889e", -"pubKeyOperator": "8fddf1292eeee439fa5c33bcdab880a31f8ecd7e33149c7f426554d330bf532c1daf942bc39c98279900829e75371343", -"votingAddress": "2E2fSAw6aD4Qk3syiNDckBXRPLHU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "89fb384125ea72f1e387a55eee051e1604f13167bf700d53057d5db1052e7560", -"confirmedHash": "47930554e5bb3de32a1491ab4af492fb4f53dbf2fdf961590c00000000000000", -"service": "00000000000000000000ffffbc28cd01", -"pubKeyOperator": "0c980e091913b2c7bd4ec9cfd4ac7144c7e5cc46eff8ee1c9f67018fc2b20e480b8a931f6caf56609cd96959098d0edb", -"votingAddress": "3oH1W9gE7jdDhQsKnpFQQvyVqKMj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "89ffb5e9522ac112c37dff98350d4131f706bff20d86f47d38f3fed052e9cd89", -"confirmedHash": "91934e995730d6c27406d8cd713b98ca5b9b890b7da74e7c0a00000000000000", -"service": "00000000000000000000ffff0feb48f8", -"pubKeyOperator": "9696d7b4f3375e640a697d66e0920ef31b13bdb98856d819165c64cc9db917cb4022c34943da08984393a161075bb330", -"votingAddress": "3SfYuUb8DRVqqfFeZD6tehYcCAhU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8a0442656ae7858a61108b90ecf0c9958272041819a3902518e8aa93f2de0091", -"confirmedHash": "9912cbfdce37565f7f5143f49ae62e551b454558dca14feb1a00000000000000", -"service": "00000000000000000000ffff55d1f261", -"pubKeyOperator": "00b2164ba39ccf332654286ecbfd32b15c271d3f982529aff556f897cc44b8e523c358041e4b8347d41253a490796691", -"votingAddress": "TJVQXx1D8fih3Rbj3SfXxLQPpWP", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8a1e63992097afb8bec74bdbb463009992809135b026ff5c6864c4c9414ebc83", -"confirmedHash": "a84fa36e483261903ecfb33dd2b0ec404cef4f5ed4e4b6e90600000000000000", -"service": "00000000000000000000ffffb9b928fd", -"pubKeyOperator": "8ecf3c4d52fb97afe3da53c0357d07b4c4d5c4b4982995a9482fb5e80afc32515d961d1bbade51d656613555d1327856", -"votingAddress": "3XefEw34H5JF4oXUXV8LypdRnFJy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8a2d36ae324b022d65a54e95bb2dc0b98e328b113bff10696900b2579c491749", -"confirmedHash": "74a7e681f40c0ed3da984741bb702716e6e278b0ca94442c2800000000000000", -"service": "00000000000000000000ffffb9453478", -"pubKeyOperator": "958f34e34c0b050cd3da0be731e40c88090ec6896581d70534334fd7de105d4b21270d9be5782ec9da634ba6e5dd85d7", -"votingAddress": "3qaG74XjYdvwn8GXUS97hBFahpok", -"isValid": true, -"updateHeight": 1760616, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8a381ae9b503df8b768c66a2e313df049ca8c9000adf6499c445cbb41a2aadf8", -"confirmedHash": "db6e24accfb09c81ac4539d366f24cc3b163af5701dea2a50c00000000000000", -"service": "00000000000000000000ffff87b5084f", -"pubKeyOperator": "16a2aa386afbc4ab3db010008d07b5a2bac350774d5e434bfd43a55e80e9653a15e0ef5b4a9a2fed1ec62ae7587c9e32", -"votingAddress": "3h4Q5XhfJNJe23ufC6ksDzQQWJxa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8a46463a0c6b890d08c003cfc7c62e117d179f9bae0b9280919a6b4c29669914", -"confirmedHash": "4c6fbeed25866e48fc5ef727433ce25b0eb65477beb1869e0400000000000000", -"service": "00000000000000000000ffffd418609f", -"pubKeyOperator": "0778e947f5e87fbf713c061829dd0d7c926cdc502c8dfff5d53a7d746f0ab7debccec5bba6b81d4495c1d90e30b71fbe", -"votingAddress": "FfcjgkHwH53vEbHXkV9yY5dNbe3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8a4bd0493037b825e3b847265a3e45fb2cfbbc31676b5dc4368b51584be4e730", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff2ce14835", -"pubKeyOperator": "1819b73743acb304802817b524d78609ce7f20a1d575b9058b25380bf73d3883c2898921ebe1a1f47ff5a49874237e31", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8a540769fb7e8beae5ab4574916fa05e371085c822a806f950b374ee4f2c6f7d", -"confirmedHash": "39b576e1cf480ced1b7f6822d3d7768282e7591f24fbfdae0000000000000000", -"service": "00000000000000000000ffff2d4ca1aa", -"pubKeyOperator": "0b14072c3a03543886de0b0c344669bce4c707c13e626b0de62f15b4aecf38fe91595be641f9c12df945483907904d2d", -"votingAddress": "3cKhu9xPCSE9nLBL6KLC6iPwYv1M", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8a5c1131b7bd0b31e7c9a7c6b0dda40836eae8281de5bfcfd847bb18b0b1eb09", -"confirmedHash": "651fdead0f24e7fce0765ce7fdf778e58f8a0b5f61ddc54d0c00000000000000", -"service": "00000000000000000000ffff327412c5", -"pubKeyOperator": "19da4a96d87fa276ea02e08c0e9dc544a980d0d267b2ffab4de1702f9788366b57c7bdcd2f0b7469d3b75e43302365fd", -"votingAddress": "WMtBewEda8cxBqUAmxYPHjXtLEJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8a60279162b2458764e9c5e4a9f5d3437cd0c18c7f9236dab1a6c3887684b072", -"confirmedHash": "bdfd414cf84bb441a1feb6ed57757e990f05964a6a68bf660800000000000000", -"service": "00000000000000000000ffff2d20c71e", -"pubKeyOperator": "19703377a21f82ab91afb0d0ef77ebffca765704eb31e3df0b23f9bbc3f75b1edd2e88deb9f40d394cfa6472a3180830", -"votingAddress": "2FRYY1bs5x5L7NaUzeY5UTiseK3x", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8a6c50d08966564b695c470c5cf5b13bea300b25b64f525ad61337d122bfd652", -"confirmedHash": "781ecb32d578f3ede70eb6110fe4833adca7459f416dbc741600000000000000", -"service": "00000000000000000000ffffb280dfaf", -"pubKeyOperator": "14783f28f2abc7cdc97988f403b71a065b1ca12c627ac35cbd2183d7a38bf47f7986393f3cb6b7b998100ef639ffce65", -"votingAddress": "wUpwqHEgRM6kni2BT8QGw7ZS1Yc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8a766a154b1801a85adf75834ef705187878d0109563bc1cda7c16c8a8f6bbd5", -"confirmedHash": "6d4c77891849cc8c4305e5077d4fefe8f048a8f3e39f073e2200000000000000", -"service": "00000000000000000000ffff55d1f195", -"pubKeyOperator": "0f59a05f22dea58e69a6c165f74b30a7c9aa35508a3e70fbe48b7ad378d3ccdfa42267fec6c10136d9711508d8a9fa95", -"votingAddress": "3PFtyaK1tiuuz3KRnwPTyuUysaz1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8a78f30a002d833fb6e013f360fe7c301db18e71221dd8b20038bf2ff90186f2", -"confirmedHash": "86f25f4c26e5154cde5350d042f8df35017ac45bfba8281b0500000000000000", -"service": "00000000000000000000ffff0363a5fc", -"pubKeyOperator": "819b06c0c3b7b7f48373244aff72171ec3fa982cd5b8c8f57e411cc1e6463ba260280cbe4d3e3a31d4c6d24be6d4f584", -"votingAddress": "6aqBohAVuBbuAVQnLjV85roykzC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8a83ba1961a49282ef4251af8c324a151b3f71219b989949001a265f9669d01a", -"confirmedHash": "102256ba771250ef0888164793863fdfd3f11410c595c8390700000000000000", -"service": "00000000000000000000ffff23aa706d", -"pubKeyOperator": "8c3b085660be8ddb3bb1b6589399291d13c28a87079eef10f0969b17f5b0c2ac3052768514473ed9b708beaa99aac79b", -"votingAddress": "3muEsqZ3Hr6G7cefoDgXFuHdFMdR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8aa869190f60cbda01cc74872d198cc4f4ef7cbc89aa5b28dcd68ff41cd1f63a", -"confirmedHash": "f021146851b7fb71746b68b65b4b4708bd3f331768882f4f1c00000000000000", -"service": "00000000000000000000ffff05b75fc1", -"pubKeyOperator": "01165905eabce47379c4485e58303b34a5a66397f316945b742d6e238aa4c68956625976a22329163099d30310489dbf", -"votingAddress": "4Qr84pMRf1C6tfeH8gizNNSAvrvg", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "8aaac1fc11b09fc720c84f7bd1c7101c90edcbd6949acd122b65faa7ee2b0437", -"confirmedHash": "2711e067b461154ddfca9475a2ec2db25a6bc15aa10f9eb90100000000000000", -"service": "00000000000000000000ffffd9a31d3e", -"pubKeyOperator": "07e292587fc1ee01a93e9df0b7a65733ab0c8734b6ce9cc262489cf48bd276359c176cac98e3c2d1c6a0ee0a681ac871", -"votingAddress": "2RVpFN2ySTShf59bumLzyb6p6rDg", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8aac31bd43b6afb8f45bba6e98cc24435d9b60d792cd0bed43582ddd3809cbf4", -"confirmedHash": "5bb106c9522047198ce45961a5f319a811f46038e35864212200000000000000", -"service": "00000000000000000000ffff325d68ab", -"pubKeyOperator": "016844c9d0bc3058e75dd52fc52486943a07ab3a19ca91ec2e4aa0eafdfb8aa8de83d94ceeddb30fc7320ad37cb27fda", -"votingAddress": "X19g8WHg6cZaSC7YXG1dspPPsWF", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8ab179742a22761ed6001499a56754ff8690082a6f86d7047d1c1c9a2e0f6c4b", -"confirmedHash": "f4e56ed87cbf5c6439e89e656c3b7002d1183258e869aec21400000000000000", -"service": "00000000000000000000ffff6deb458e", -"pubKeyOperator": "09addc90a12fee075945d41aa170167577d5812c1224189462d74988f4f2df2b10619912067a0d476c776f531cffb9f2", -"votingAddress": "3vYajXGoUJ2nxfKNqNBdEBjBCiGi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8aca44aed73df5693e48957960de7cae3d1e8f759711e56822231e32711fb8fe", -"confirmedHash": "ddd4eb50398dca46db7978266a4dc8c789b6cd2b04a859d80400000000000000", -"service": "00000000000000000000ffff55d1f1c1", -"pubKeyOperator": "8c494ae1b8e7dbdb2d53ed11a4fff4a55f0ec8f9b6e5d64c5b5fd75b289fff15a619bded655e09a44e67827d87431848", -"votingAddress": "u1LbFzLay7nKiTor2pYZUkpfyra", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8accd79b26fdcc6b5b87d1e6d1589fdf370ea2f9b3ad49f2219087e4e3bbb991", -"confirmedHash": "9fe2521aadc8bae65c6ea64687b6e87462e3eca2ade89d511200000000000000", -"service": "00000000000000000000ffff2d4cb3bb", -"pubKeyOperator": "12d61b2a6017020f8b91f9afb209afd52204255faef1fda3c873d657e90634fdcba895213b0f9a4251275f2137095d25", -"votingAddress": "2UDwVCZs8veR5sjGNPFbSJzGMjPU", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8ad7a6de146dc1b88f5ad561498e12cd65fb9cc470b913b332409b9ad29b07bd", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96880e42", -"pubKeyOperator": "0fcfd0799308529584a2659db6d79f30537741a17e9711dd11070e3210212717ee89dced9bc58ff8ed47f6db20687f8a", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8afd3cd80083e5e5ca9f1be502e706394cd46fdbd69a66b64d39f657cd6f62e8", -"confirmedHash": "46b0b34c1973d8d970b4b7ef450247e79a8cdf8f6f72c8051d00000000000000", -"service": "00000000000000000000ffffa45cfcaf", -"pubKeyOperator": "8745ac28c712e3253e23fbcd54ba6c69f0c9ff88add838cff601d22f22ee986aaab2347a6e1862a031212274523dd758", -"votingAddress": "46MqhHNkuuS1XjbsvomeE3PbBoJz", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8aff552067646f4bf4163c26aad814081da2ea538be53e18233be88a9f473f33", -"confirmedHash": "5bb735ae377e6da44cb78b3335a40aad1b15aea25a4b085e0000000000000000", -"service": "00000000000000000000ffffa87757c9", -"pubKeyOperator": "8330c94f45520e911610b8fb17c7b4cf4b5c2cf14be8b3f242b6b80e5581f8d4c64828cd4d385ee3f2e2546d7bc7f178", -"votingAddress": "djSjUgVJrfQQqGwMnEiK89DDTCc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8b032d1325378512855d6f06956bee5caa695b2382c0c1d568972ed1f101edfb", -"confirmedHash": "9efeeb9d6fbfef9754ed23812b89296b950ab15f03c35bc80400000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "CDdWa4ybQENPWtVU9e3H1DPQzcK", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8b0cf5d1c8b9ac3badfbd3145bff1b3db9610eb76c0680c22aa5425b23d7bd3f", -"confirmedHash": "229b82d62329317491eb7cd03599ca081f030acd0bbaec480c00000000000000", -"service": "00000000000000000000ffffc7f71ea9", -"pubKeyOperator": "95459d0b72decfbeee5b001349d003e66a42e38c06d353978346ff7abd418c18977d0bc3acac8a5d5da7bee352b22a3c", -"votingAddress": "AQXNU99RDBxrFExyiHoLAxQGzS1", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8b25c1fe863d61ab9138f29428b3e3d6037adbdeb9eaf485b5bd394aeab00968", -"confirmedHash": "b225b2f15a25ec3a41ac55dd37b2879762bdbfe098aec16c1600000000000000", -"service": "00000000000000000000ffffc6c77c47", -"pubKeyOperator": "97c24f32399689a22323cb3ae63bd90ac35a9fb3f083f430040004711c9e55575a61f3bce809e7e3d8db0fc7b0b9f0f2", -"votingAddress": "mXesMXjkVfwstw73urY5X3Rxbpg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8b44e8b5ce6c19f3c75f5dfad867b2bf22115fc703e7f74bbb1132d1c7cb6a22", -"confirmedHash": "778872bf1cd530d682a9d5652276770d028703936a6e11941c00000000000000", -"service": "00000000000000000000ffff8b3bd5e6", -"pubKeyOperator": "85daa5f0484a1f4e7ab6881e2a46932757f61f8424db7ce192cb95b89fd406b99a5765c39624265580ec6f6c0813b089", -"votingAddress": "mg7s25FEtkaCVUBXWzXMsT3YMcF", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "8b451c050b025e9633daf2ae8122ecc4bbdaa26db31b8ec3c2cc8958ab85f04f", -"confirmedHash": "75941ff18d3ccc6095cd699c90ebf0f910706b3c7086d1852800000000000000", -"service": "00000000000000000000ffffa516d3e5", -"pubKeyOperator": "0243e154d13fe89267457567948ff51629a22b236f4a66679b38467a46aa0bb4b10d1ddce61e4607401bf9aa7830c112", -"votingAddress": "2guE7rAzQHEJ4CoiDRtSu8oSkVnq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8b4ad7f8a7d86a384a4f05b89a2210fedcd497d72e24b31738293ab68dcb38f1", -"confirmedHash": "c532fde8b85e0719ef803b34f91051ac4f2c5d9126785c791b00000000000000", -"service": "00000000000000000000ffffbce2c98c", -"pubKeyOperator": "96996dfcd70b7d48bea5a0a0bb0278b1a2854a9bb7b987e729ec76d7efdb120698701be2d9c16e9a961fbdf4ff42bc84", -"votingAddress": "87h6wqBajqguRqw4zS95G8u38Gk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8b585291f360f894ab0e03014ec6c75a911d3d24d04a3a9168a9af959becc653", -"confirmedHash": "7472f73f953a7a4371d524dc5f968d9991c186812496d4090400000000000000", -"service": "00000000000000000000ffff2d206ea3", -"pubKeyOperator": "92ed4a9ba16d2e55fd1ba47236662a273ad29b6f2ee5150b135fc924d33cde5fe8c941bf8ddcaac598484b68bc4be8f9", -"votingAddress": "2pqkTj6W5HpLwbshjwxpT8uDaRv3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8b59c8abd28b5b90b2908fd5d208b568260423ed44597dbb70686df8261a2771", -"confirmedHash": "773848c23e29e01cbd78aecd1f126b4be4ade9f45335f03c0100000000000000", -"service": "00000000000000000000ffff68f88436", -"pubKeyOperator": "0ef12f22ca3261ce4b323f31b7729eccb74a047c82d70860e6fe5b864b2cd8b003af6b4b966b8094fe83bf1855f3f965", -"votingAddress": "3sLnPFDenF4VnbTGMaxmFqSqUrYZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8b5f5660ee44e07e7dfe90b42efdcce3c74eafaec84bc6c84eb0038ec7c27dbf", -"confirmedHash": "64b416cd9399bc1885fe1b660d1c1d6a383970a6c5a45ad50100000000000000", -"service": "00000000000000000000ffffb07b39c5", -"pubKeyOperator": "18091ddfe032f3410d089578b6955492e23c696098d005a535f7feb1509536dd0dcdc70000ecb50087892677bab2bc28", -"votingAddress": "2Jdcppm3BMWRqfpHHeAmB7LzSY61", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8ba253541fdf8f3b714099e9448149b16703a752f4421eee4f4d9f68204542f1", -"confirmedHash": "51516f243e3c1cd3b01461d8ad9ac0f1d164b42b5c539e8a0000000000000000", -"service": "00000000000000000000ffffa12352ab", -"pubKeyOperator": "0276cd51fc20b811d0ea732ce890b86be07b86e9a9e7ec52ff597f428277389cd4ed1e631a32f9883c8f010e7606593b", -"votingAddress": "4HSmkbqAopNTS7arPz5GvMkr6qzU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8ba95d610c7c142e092e3037296a3426cb6478b35f0168fb9cabddbca42c8a0e", -"confirmedHash": "073922a7245e8ef88c4248127ff95c9725b21266f6d4c08e1100000000000000", -"service": "00000000000000000000ffff8e84baf0", -"pubKeyOperator": "0920e97811838905eeb7d7a448ca90cdc0e64316aafe584c71ae3b6d74dd0ad6e653a6e3c8b41bced546ad6933966d16", -"votingAddress": "3WK4EwcewCaD3wF979AbHv43Cy3w", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8bb1ca6ccad5565ada515ea6dce618f1436e9d5b2c69b9a3d793b2731c509fd1", -"confirmedHash": "0c2d3c516227ae0e4c42b1e7cb8202547548ca99987bc7be0600000000000000", -"service": "00000000000000000000ffffa877500b", -"pubKeyOperator": "8ee1fcc181f3eaf1001438772d16eed138597b7db4d06fad5ad834fc4e6400bdb59269cb265b815ab9f6cdb7fc059b72", -"votingAddress": "2LxPwNq8JNnG35R6NJqwVJ8ZJrJH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8bb8ac98762a023a85609a6d4c5bae7a4fc229e80ae56183de6963b48e3b07b4", -"confirmedHash": "4e7a454736fbbeb9bb4683a6b460d0dae2169ec0dcbfa6c70b00000000000000", -"service": "00000000000000000000ffff8b3b8b17", -"pubKeyOperator": "8b7bbdf6e8b375d798e14cfc1f72fe5064bf8f618fb4163fc71f30dfee2d7c9e27275aa416141468ef412c567c41cd1d", -"votingAddress": "3EcFcMSvezvRov16bRQ9JQJDxjTP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8bc3250460d2ba4fc1a48aa92f922a3fcf74f520238c02d9d660421790136292", -"confirmedHash": "656b5bb14b84a0a9d8a0b3361aa677ebea7fd828d41888f90300000000000000", -"service": "00000000000000000000ffffadf90fe4", -"pubKeyOperator": "123155aafdecf440a1bb50fa250e659941ca753c24c20eb8f7c853f2707ce7a9d3e6257b3cbda75aef0776d947d1daf4", -"votingAddress": "3dwcKwx7ZDbw14ppSf5H3L5RWw7U", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8bc7efadd38344f0388a43c1f30c84651cfe85a6b8ae6f5ed09d38ad870249da", -"confirmedHash": "30f214c3f2ff973b0d3b16d45558d1f1b9ecb9bed5ba40191900000000000000", -"service": "00000000000000000000ffffb23e8033", -"pubKeyOperator": "89647f7632aa1d2c39469658ef7fb9046a2dc64dc2002a4d0b282b59ccb2547aa42a0a3b68b19dbbb1a994e41d9b424a", -"votingAddress": "gfAK6oZVdxszqwnfKvLEJESC1QG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8bc9373ff958a7a7cf06d194e13db6ffd1f2ea89a2e8ea52c1b5cc5767499df3", -"confirmedHash": "bfd4044a4ecac10c0981bdc0237be129475ef8e1f3f6d5390100000000000000", -"service": "00000000000000000000ffffcf944152", -"pubKeyOperator": "9133d87df0d3c1f69ca2b685a54bfa500c58d825feafdbc34cd9c610d1c1adce4d0c9e79a0a59e60705578d1ed690588", -"votingAddress": "4HkDxFM3yJgBkQWYyX1WvcehYFGb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8bcd63620d0624e5046f817f18e3dc609fe5dd897dbab1c46bfda83cf9856bc8", -"confirmedHash": "8039fa0a2b82b4dfcd068b700005359cc0778f4aa73d1e8b2600000000000000", -"service": "00000000000000000000ffff05bdfd99", -"pubKeyOperator": "0e4539ce2b39915d0c67951124f40cac409663e911775e1e72694b81016491d6e54906139da75f2cd4a385b589b92c21", -"votingAddress": "3HuLS4L3fMLRspdussAhFSTmAFVM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8be9cb8430700dc6acdd27b839a01404875d87f894dff0de2c953c419678a24e", -"confirmedHash": "16796389023ec085496ffdd3f6ba618430958cd3fd30e4281a00000000000000", -"service": "00000000000000000000ffff0feb48fd", -"pubKeyOperator": "0435753cd32a916ad051451ecee454139ca16cd7ef40a16d1a45b8816c53f9a7082e613b17aeafd3f2f02f31dd5d7118", -"votingAddress": "3rTuocfVHg6K8PJp22xqqrRS5y6q", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8bfd43e9ddff7a0c9c2ef6dda536753ac41ec688dcfdd7e4f63731cace67f4e0", -"confirmedHash": "c14641d19f521f1153ae688c345dd13908bda7c7cf27efa20100000000000000", -"service": "00000000000000000000ffffa763cd91", -"pubKeyOperator": "0420b5160aa3deb742d4dd3d079f5d798a3c3defd59a34ae25b1637cde754a4b9642a380012729ca6810e97899c04fe1", -"votingAddress": "2DhuHvAnVcPUuFmtzRMPKf9u7LEi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8c09e857bc7d8533f00922604199ecbc8d96005d23b23736052b5c80c4e6ed20", -"confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", -"service": "00000000000000000000ffff453d6bfd", -"pubKeyOperator": "0da4291303a580de7499d81e72fcbdd923a724c3d7c3d4c7d86362ca5acd8785101c282b40ef663c343d8e764726641a", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8c16658fa28373dceacd83a951ae14c2867ad554a5f3bc16b6f26c6cd8e4b70c", -"confirmedHash": "cebce183b00d82b1518e0660b076ce73c2e4c13b34fdb69f0100000000000000", -"service": "00000000000000000000ffff33c3dd28", -"pubKeyOperator": "0b29fd407e7fd0160c43415bf94734e2e49537a533d41424e096f87dc93f5729b42aac44dde6ceedfdca7ed6184ed3ea", -"votingAddress": "Gfpo8d5MxbDLH8LkLPrteU4iacB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8c198a544881eb68cf7fbf3a92cdb97cbb4ba221045c8b99595e551746b4213a", -"confirmedHash": "62421778726db0236408b19116aa7c77ddaef53e9152a0b52400000000000000", -"service": "00000000000000000000ffff258b059f", -"pubKeyOperator": "8218f9bc0e0b0ec8a7e41b23d6589df6cac287d2ae80bfe1b975483fbbcd42bab5b1a3e48943b09cf449c3db27594e88", -"votingAddress": "6gmtSwALbmU8KPWftp6WWTkvQUV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8c3fcf6657c209516211370e438c204cbf68f1dc85eb559d7e5fd951b171fcad", -"confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", -"service": "00000000000000000000ffff9f45cb11", -"pubKeyOperator": "953d2de39b5bbaff78103c01600519c88f0dd3de67d2282b01b0f08335355d90977c04f39f8ef6aaeb06b415ff49b827", -"votingAddress": "3sNFfxmQktawwHBpqUsfMKYHWpen", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8c4f2f0c45770d4a30a5f38148ee827c28994cf64b142e94f06efe078af19d6f", -"confirmedHash": "63de1e6019a10059f1857dc3da5462de6bad8a21e05d4bea1400000000000000", -"service": "00000000000000000000ffff9df59e0b", -"pubKeyOperator": "010be267da8548d79d1c80759838d477d38bfd1092acbebb4c29f812060b80212218a55a048f036460e0f1f79ead57d6", -"votingAddress": "21wjuU9Uiw48EuTWAwcpS4NSMBfB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8c6e5ceb43bebc84b5db98653f7a1a9ee4b0d664ae7ffbae55fc74ed9ce16ea2", -"confirmedHash": "3b972669fd147c77198f97e03135962ff4902c0efd1405021700000000000000", -"service": "00000000000000000000ffff52d3194f", -"pubKeyOperator": "8f4fad4d3a38c662b27390ef799c39de12533575e5267dd34d81b97b3916832fe6d0eda5aea8b6f4db9e43b820908813", -"votingAddress": "2Rq2GNPk977sJ3g3nRXspiCiaFez", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8c9a24a50fc17ac9ad6419668831610eca195a49b76038f983b7007c6ef164c3", -"confirmedHash": "02480155e7acf82afa5eae3263f0d683dc1a85b1712e29c22600000000000000", -"service": "00000000000000000000ffff52d3153d", -"pubKeyOperator": "0e54c1c514f1efdc21e556750231c9a216d8069cb8953e9060b7688883966833e89da374d453e76d334b29a06558348f", -"votingAddress": "4XpVWt5WGwoi1ob4tM7Yte6ysBfM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8ca0958c7045f6882846b345d6a0269a85ad02f90d9f672d2ac085d613ba8121", -"confirmedHash": "d5295d23cd670217f43ba10230cd797116e0e2a5c5c0f6821f00000000000000", -"service": "00000000000000000000ffff55d1f1a3", -"pubKeyOperator": "936f163e37740943c0f01f7a14745610198b954c0cb51d6e460e0c05cd5a9fd5b5b0217d08e9567606a5ada2f419be08", -"votingAddress": "2bCKusV7Q1ksNufkjEK933yvZa5J", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8caca9cfa9fd516d9ef05e3fbd9adb14b7e9fc237d34f8d033ead9cef8817f93", -"confirmedHash": "2f2d2f385585b5382ab01a0494199249cb53489b782f2ee12c00000000000000", -"service": "00000000000000000000ffff2d56a38c", -"pubKeyOperator": "19f3e83571346ba60d0d5a4801024ba2a6bff175853e004eeef87a4b379123e5a7a97be950ec63a12eaa5a28092971fd", -"votingAddress": "4Z4kzZLmkxo1Qh4wRdRbUZKWsTdi", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "8cd213b53f2f510974b33bbeabb09bf8142b5f138d504e911d981c4b9fcb0942", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffff80c7f649", -"pubKeyOperator": "0b33e2ac6a785c09a6d93b7a2d873f0551b5cad6d4537f90851b07223693368b4fde44ba183417682b511e594e07a9f1", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8cdd2315f157ce0dd4e235a16696329fa6cfca24fd34ed6b77921b1f0fc9428e", -"confirmedHash": "c740685ed7d9cc8f73abc1055004795cd24a53c91e908aa70400000000000000", -"service": "00000000000000000000ffffac6891a6", -"pubKeyOperator": "87d8c370da8ddbf24a569ed074f4084cb7f1fe81c29ac2b4df5362630d4308f4ba44e2e286e7837e8b83762306e3ad71", -"votingAddress": "5oyyzjmoz9Y3wGvD3jRwD3jrWoU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8cdfca8bb64a41ae903f2e3b744cf77da49da286ba76018b369309d79bf23b5f", -"confirmedHash": "eef33d38a2a2d5c8a5de26e257905c50ffe2fd0810f6b3610500000000000000", -"service": "00000000000000000000ffff8ecacd65", -"pubKeyOperator": "9060db21247566c26bb484bf98ef9deca0b0533918cff8de97ec57c050af9c606184fcde0ba9150be56b80e6b4b1b4a0", -"votingAddress": "44NDCrYVwwCjdwXcLLagRC9MWyT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8ce8f1e5dd8fa5823ccb3074e3e4ecf1c7d7882a842be10ff0c8d27f409f62de", -"confirmedHash": "f987264e5b21a263cba3d0981b29dcd11cd81b19c5112cfe0e00000000000000", -"service": "00000000000000000000ffff86d1c61a", -"pubKeyOperator": "187315827c2b7bc79a4fa1acb4e9590a8948402af1df10e41869c8099f69898fe62bee94cef8566cb18705e5254fc0d3", -"votingAddress": "3m6vwsrAHSr1AjhtqQFwJ83gkyzW", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8cefa6c3a812263bb18a6f910222b709797d40f6215ec32c7d3073c927c890b2", -"confirmedHash": "aef6ce4203bc3d19e0ab00bf4f1ea1178ad5094bf30cb7052200000000000000", -"service": "00000000000000000000ffff17e4e84c", -"pubKeyOperator": "0efd93b586af7f7e5770085ffb7acbfbb1e405bb1a20f76e8dce797316d17e6b161d0e84c1743c9ea50bf7852b171aea", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8cf6a056c81f2fdc82460a97e10e949fce759a8f082d686c2b6d4be10973d7de", -"confirmedHash": "67cd09722973a24a5ba9f6cf3a15b13a4bb09ad883667b2b2000000000000000", -"service": "00000000000000000000ffffc0f1b94b", -"pubKeyOperator": "175324b0ef4aaeec611af7992794ae20b233f558db08b8de28df4eb73f9ee98b5478d1f041cdfafa258650ecd8f762ee", -"votingAddress": "2KrbXD7eyBKSpBmkogqTMbr3jy4r", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "8d08b244760d29a9fd9d60a1518fc6d0aeeba57eaf9d43399dae9245a9cc4b47", -"confirmedHash": "2a483889905a2a85a8831d16ffe562f05d7c4e2e61bb455d0300000000000000", -"service": "00000000000000000000ffff55d1f1ac", -"pubKeyOperator": "16fad841f101795433bd16d9eb44f18270c93aab9d4c899800119161d3d06caa2268780aec6cf53efc7b5b258e7abbaf", -"votingAddress": "21qCmpPZJHVBoQvK841xYrLdjzqC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8d28fd9dfe89009da17c9d24d35568ef1a033773e53fdde9213bbba22fe8c8d0", -"confirmedHash": "443b013ce16375bdb5df6bd6380a3c42ce54a305ad4704d50100000000000000", -"service": "00000000000000000000ffffb94068de", -"pubKeyOperator": "0c8695a5c73ad1e6aace39970c16064275460631879833fe5a39f9ba23f17c6c79277cb304b9b56325568c6e628ee7e5", -"votingAddress": "3oMFWSb6KTDjSJQ6SQuWwBEdEpcW", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8d3f8e794f3cd0a1668186b8463a98ed463f9e13aad6ab05cf4e6c827c523400", -"confirmedHash": "db6e24accfb09c81ac4539d366f24cc3b163af5701dea2a50c00000000000000", -"service": "00000000000000000000ffff87b50851", -"pubKeyOperator": "98cbf2ee947fa712d81cd50582b8f3fd4cbc4024caa78d3bb2c763f0848afac2ca663fb045e7341b127fee38e702cdcb", -"votingAddress": "2tfQnbGW1KX5WbEKYHrNcowRuXWG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8d49866cfbdbb2aa0379f475a00a4b855d1780d6d270be5bab09c91d476f675a", -"confirmedHash": "220ac0da13b2371555447b02566ff3d2543b5a5b13efd19d0400000000000000", -"service": "00000000000000000000ffffb009d217", -"pubKeyOperator": "06404560ed609363fd1ec4f371a7769655f701a20dbfeb3d4dace8e99b4c96ce918d5ee1a5c09fca2dce289f7248c352", -"votingAddress": "4HbrZcxe3otRvXHPP3d3naEgBC4z", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8d5989be3b55ce810021f5193dc2be1ea3faf3f9917b1add95c63f8a86a4a105", -"confirmedHash": "a8f1e9a9d42e3af5bc29f9263d61fc554cfd8208f8e38a311200000000000000", -"service": "00000000000000000000ffff50d1e0c9", -"pubKeyOperator": "011b72b829cb14ce83ea451689dccd4f4726412e791999a5feb9759088dc578d1c888fb9a85a00effeeb33cce7f0263c", -"votingAddress": "4VTceVNKxfhK7WydJC9uDBDBdvE8", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8d5c3c03af76fac66a57338f3f8d730124a3e3bffd5076a7c859dc5bac027c25", -"confirmedHash": "b0d01b8b71e0eb9468dd7439e7d1f10a125625b9e33a1fb90b00000000000000", -"service": "00000000000000000000ffff2d21335d", -"pubKeyOperator": "8576b0e84c3039365af0c922a5f77dd181b6762b3794a308281604895131e029e9b5897cbd40c4cf389729ec45eb04ff", -"votingAddress": "3odocNggr6Qa17DgQUsKi3VLTuW8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8d893093154110193f9c62eeb9e8d3a6d6cc04267cb72ba6cbab8283e690cdb9", -"confirmedHash": "719044bf2a2e5443bb0cce0acf1573c7227b832e036fccf41700000000000000", -"service": "00000000000000000000ffff55d9aace", -"pubKeyOperator": "121b048e191eb0a3c98a772f762535ab7925b875ca1d5cd95f3b1bea269dacf09e51bae944146b676d853e8284f86171", -"votingAddress": "36QYnFFJqawtM81uLcSryz4wECyt", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8da64b88c61ce867ed1185bcc3ada382a03c7a307a4acc11b809dc3fa3c57f86", -"confirmedHash": "f4683f80166863bf0eec734760aca2a311aeb0d077d65dcd1700000000000000", -"service": "00000000000000000000ffff334dc245", -"pubKeyOperator": "85272f97036a1176acbc24ce67551c44c5e4fd543b68408212365346927d9ba038eabea87e9189255bbf8172defffc1a", -"votingAddress": "WJwgb5sjkmkosq64MYbUseV7QMP", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8dd24ff90c049388f448b2d5fa58a131a57e2fdedce2c23dcd6f2fcd17cd12a9", -"confirmedHash": "ff3e716db971a24e2d9c6144df5f9b16d66aed3e3cb688780500000000000000", -"service": "00000000000000000000ffffbc28af48", -"pubKeyOperator": "0c288bb4f232cf6d93f5e9a7739b5c962afcc49ec285f2297c457f7e41146159b94b3cbbb8afccd9637650b638f826b9", -"votingAddress": "3p2yHGWyjQ5kgawDRN5pru9r7LCX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8de5050f93912775dcb2553d7954dfa5d3923e5f19dd35aebc474bac453f84c7", -"confirmedHash": "c93bb7ef013972b6359bae93a568fe33c22e42fc047cb7530900000000000000", -"service": "00000000000000000000ffff2e04d9e6", -"pubKeyOperator": "07f2622bc0845f771838838425c8390126e0c930f311d53ab22ce90a661d8b99f4131770e9777d077f23b7c07dee82fe", -"votingAddress": "2YwTybWbQjNadQNUsEvy2FEqb4zr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8df28b5173cbabbdc8098b08632b09d8922710bf69f4f62bed4d5b475aa44e36", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9e656d05", -"pubKeyOperator": "08c43714be0c3413b8dda4aeb1eb7e86682cd1915a584e90c34941a826b453f4b2461ed43e28decaf5ceeea02583d748", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8df6e9e9f94225f24746b71311ecb5694323fc23c4b8baebf4bc747ba8eaab6d", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff84919f26", -"pubKeyOperator": "99706ace81464c2112692cb31ac0701ae4903c7000d2f091dd6e64c4696a54fc6b5f5900851dd232744db730e5b74a66", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8dfcfa42e8cecabc3b5c28792dd46eabb61a87d056b37174a31cf80ab682fb89", -"confirmedHash": "45118cf828a48115633ebaec125f4ba33c70f29ad0d4f7870f00000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "4UiRt6MnBtSeuLVbWouYm7Nd84xB", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8e0290d83fb68d6fd1686bfa91003727459635d6ae8198a54acce1205cf3d810", -"confirmedHash": "f7175bfea1e728e38ce424bd3612b79f5d8596d9b6aeada12a00000000000000", -"service": "00000000000000000000ffff05bc3f6e", -"pubKeyOperator": "8e98a4356f40afd73f3c6c7ee6be833ede633543c5e0bfba78b4ce1f43aced1cdf17212c81a48f11a09d912ed4419576", -"votingAddress": "4VZBUsxfWFjDQDyxLipu6GEoZvAp", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8e1bdf6b91186a10da2985c506817b0421bb48fa5d9ccf8d088e3a9dc4930aeb", -"confirmedHash": "7e993ba36783c1b5b07333fb0ab03ac2fa1d4e17d8cf11401700000000000000", -"service": "00000000000000000000ffffb009d212", -"pubKeyOperator": "10f116340f4159ccb144f89ba2fba539ee99fd95657a12cc04b59c510c3b03ac6f72fb2b099e001b69dc78060c9c8bd7", -"votingAddress": "DZtzKyxyGaVNfApvjTW4EwuD6LG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8e28b2f13e6ed6fcb8e6da16c093f60f78bdec98508967f7b8b782ceb012ff87", -"confirmedHash": "f41993b1f67681a12ad2f4633fced0268d56473297ff9cb50300000000000000", -"service": "00000000000000000000ffff923b0632", -"pubKeyOperator": "11547d19e1d1ff4de0b675fadbdcd40b5d2a2f2b93689e5290cdb974b315d016307104e8d658c7263c994c6b07f925a7", -"votingAddress": "3fYm5FGxNMpuNm3zUmWutEkr9aBE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8e2c0e730e6d11555e75d0406e794f99cf71a3d903ad25e8907d68e67a1beedd", -"confirmedHash": "b66ba86a783f8d88a44c9cea9f9835cdb3ce2d3a097a52002700000000000000", -"service": "00000000000000000000ffff2d4c2b57", -"pubKeyOperator": "13ab17fe8cf037cdbe142efbf26f07fcaaae27a9248cc797edf6b09851258160d06d67450ef784f94b890c9eeaf1ee08", -"votingAddress": "2yo2pZP78c3imgveHv1Vik4fjidf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8e6f8489227fad9bf703b89cd59d067b5d80067ceba359100fba2668b35ca18c", -"confirmedHash": "5ed4f5fc30e936bcc9c149e0495d75962417f1653c1a2ce71f00000000000000", -"service": "00000000000000000000ffff52d3190d", -"pubKeyOperator": "0cf547563bc2dc6c4622e6232f8865f27c8f3339bddeece6ab053207dc56e0ef318ba737fbc3bca03b298fad3f93e775", -"votingAddress": "REqz47ik4BCFCaYgptYZYSKg57r", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8e7e542c69aeeb228d831af1aaadbf63ab507c1b6d5810f394afa5908447ff4f", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff84919dfc", -"pubKeyOperator": "86a7fd8b5bf15adaa2f3dd12db64722f8afb477bdd94808fac525b4162c276ca80e0f80c6418c4940a512e76705eeeee", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8e87dfae4b634d44c1f68d823ade7ad7ba24f41bf612c593451f45b0beebb15c", -"confirmedHash": "9dbc1963c8a90da02b6de7e493f5e1fc789a908124dc181c0c00000000000000", -"service": "00000000000000000000ffff58c6b8e2", -"pubKeyOperator": "0380e0c6d7e915fdc21b53c65ac3d7525abd42ed0f72fe8bccf9dbfb60df2656f400af23c066f171e60d425c84e1644f", -"votingAddress": "2LARc9VDYJs5eetN8QTVqZXxu6EZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8ea734e1f78f803fe3f380f38f63b642ca3af76853f343265bfd7e02102f33de", -"confirmedHash": "294288135bd6e432d04d208f6de3d04cc9f2e788bc731f2e1400000000000000", -"service": "00000000000000000000ffff8b3b9c1b", -"pubKeyOperator": "105c1124139463c51caac8c9a056803166989f2f8db58a44d43d371098b845f9c5f9f4d1f9a5d169c155e5f6cf27020c", -"votingAddress": "32hke2NLbSJnnNM22DyPMJvmnaNZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8ea916eaea4652b872828da7c1c80bd8b0d90b62c10a89ed7a9571ae5f4d8427", -"confirmedHash": "b8a115a64ce184dd2d3d7d73bf1447b756d4d5076d519ba10300000000000000", -"service": "00000000000000000000ffff9a7f393f", -"pubKeyOperator": "8c3f897ffe8cdf46adcf24e0d839232a83b45909256785002aee9390dfb4520e21e66e73755dabb9a9dcb38da83d550e", -"votingAddress": "3sepmd8XD2um6LnCCULtXvrVU12y", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8eb30b22d4b47826614c481262d9916e8d509221edba3e0eb4b367725c1dac4c", -"confirmedHash": "2b697476961b405442be9c0f10cab0f6696cb1eb23082e4e0100000000000000", -"service": "00000000000000000000ffff36bf8340", -"pubKeyOperator": "84cdd7483772dac81114ccb9def87d9d86f8203379483699b2f4ac85b41549ad6aa2bbf11a75669364a5ea74fa6c59f6", -"votingAddress": "2mo9W5uLohMWadmcTr7JGnXw8tBF", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8eb4edbf70458339c3d940b03981a22a3fa57a09100b2f5e9f81ff476d78770d", -"confirmedHash": "5b1b1896eeb9b18d34b3c73c2a2583dc936b9c0b8ad8bcf30500000000000000", -"service": "00000000000000000000ffff951cb562", -"pubKeyOperator": "99028efad9c7fc080172965eab01cf95d7047a56f9778874878fe8c02d70478b4aba6d4510ff0d6b584ee94683f673e1", -"votingAddress": "2gnVja8Myh124Ygw1jzGATyA1fpq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8ed16bc59cb74e77d2d20500162c8b646a74f5d4e00e4053de7e479b3b109a5e", -"confirmedHash": "0af85f472932784ec1b4bd6b6077765be28d84d4b0b1bf040900000000000000", -"service": "00000000000000000000ffff87b599dd", -"pubKeyOperator": "0efa31b75969bd481c7b539d5e2e881c603ac7ecb4d4275e89bc836718126f422292c7961a98a8a8c489b75c76ab62dd", -"votingAddress": "3SRT6aeGuVz5kdQX57amw63XypT1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8ed8417fdb5fe6aa005a5fefa683721914feb4a37b3f6616062d878e94697f96", -"confirmedHash": "5ee22c93c8c4b77d3b6ba1d05ea02827195265ec6cdb71f42f00000000000000", -"service": "00000000000000000000ffff258b12b4", -"pubKeyOperator": "17537c9b635cc080cca1086f7e5293373443d7bc42692cafa46ce9da01f1d75190f320a9c961bf7859dc3d06cfcc9a60", -"votingAddress": "2aFbbtBkCbU1GySSoo1BCmnFZiNJ", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "8ed9670254a73ea3749d2e55b7fe4668845ca2f6d4410aa32555df7526fad76c", -"confirmedHash": "7069b2ebd0fc225cc6667038265beef0a2351c56057b9afd1a00000000000000", -"service": "00000000000000000000ffff55d1f22a", -"pubKeyOperator": "9578c54eb841e88045c1cbcfc66b506fb56cc356b4e93d0777cb476f810136791e2e58a7331d9f8149ad6d32685907aa", -"votingAddress": "2pT7WbGarFSXx4UFMvd3oDe6JMbm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8f024ca1c43236525a60f35ec34fc474400fcb45683ac82b6c2ac3fce7ddf644", -"confirmedHash": "7c9da1f69b527ade6730a2fef4bde7b012ac78e286c292891500000000000000", -"service": "00000000000000000000ffff8b3b5628", -"pubKeyOperator": "147060478ba25f392f2274aad80178a64fe5fa038bf4ebfc4af1ecb119ffb9de236b25ccf8e472197c2a0495e6c285ce", -"votingAddress": "3mSHz8mZJRGjqcHDVqoZj7jD7ay9", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "8f3e927e449cf5d4ec9045d6c55d7f8042934faf15a71ec56e7f51cf913e29e4", -"confirmedHash": "44bbcc917450905c4c682062c4212c42797c62fbe8da91de1400000000000000", -"service": "00000000000000000000ffff59280d63", -"pubKeyOperator": "14f9ecb9b7025abab3e0d27d03c21b5c56f915ebb684b48f438a71c95339804430a1f7969a22ec2e22e268bd6b9abdf6", -"votingAddress": "3r3M8KDTjnUMjKLaJubG8En92CL4", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8f60a775f1e59d7c73bdae09f70349b82aba15182c4617f5caac77190de0438b", -"confirmedHash": "b60c2dbbb213c99a236e1f30c1d9f41b204f0b13b294c83d3300000000000000", -"service": "00000000000000000000ffff52d3191f", -"pubKeyOperator": "8fe70eee8a7fae6b612a623b32546bb746132c3b23c637e7d5a1989de5a4b053caa89ba6e1300477db9e2edb8ec2ae00", -"votingAddress": "33XapapWBKuH2ng8cLMH7t8dUxEH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8f670864a49098ea2a2c1e404c0b6b78ff6e7b93fad95fdebd12040242c73b58", -"confirmedHash": "460db5fee51577d118e0239952e818f0b7ddfdb6eb7f2c651500000000000000", -"service": "00000000000000000000ffffd4186a6f", -"pubKeyOperator": "9529bea50cdf659a5706abf0d8113f328fb8d7c4f9126c0026bffe6a159db99e5d304c22e6ccc0f7bf689aa1b959c36d", -"votingAddress": "3RWpCH8Kagz2ztoBBJ29fLomS9uR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8f736f0ff6cde8b6463e0cd9c601879ed243670044d103098d980721dc07ca85", -"confirmedHash": "e59accf123796e0e7dfe26f4fd3dc8a76244603294deaf201300000000000000", -"service": "00000000000000000000ffff52d319b0", -"pubKeyOperator": "02948eaa492197367edfb0605592a7aaaf0058bec71b090af483dfc0f9bde93b4915a9cb8decf2d85eb692b50959b649", -"votingAddress": "f7okey9xgkbiLJeUgVspbboi2DR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8f945fce534b71dd431fee9e9dc29670bef87fd8c86298fa803c47bb2887ad4c", -"confirmedHash": "68100529972aa198fc8ab479241afdefd5eef7aaeaa9537c0700000000000000", -"service": "00000000000000000000ffff9f417cf4", -"pubKeyOperator": "91e6be78a4ac75dfbbd4e02a5e1e75b67c6a00c6757522fa30563606698295fec402c9031424f5d1fae829aaec77d139", -"votingAddress": "4HygP9pCekYjks2eArUPkxSPqzYj", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8f95065e62424d1cc3b65a0fe6bab64f41041ca3fcd1719b4c31e721e3bed11f", -"confirmedHash": "d4d6cabead7ddbfd03c09cb5d38f89bfe8fcc4be61b955d71c00000000000000", -"service": "00000000000000000000ffff2d4c5440", -"pubKeyOperator": "8871b80253547dc69b5562c195627209108afbfaaad5245f4aac40c3f5cc4599d8e25b221da0ba9996cc59304d141428", -"votingAddress": "34RpRU1RvvQY1UpexRHtN7SqapaT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8fab970beccce01015e4886c36094f5da64a4dc53474764b5d8783e2410e5600", -"confirmedHash": "6b06fde259e79484a47cba5d0af075813f8a878415be60bc0e00000000000000", -"service": "00000000000000000000ffff55d1f209", -"pubKeyOperator": "13a7a86d18582ad597e70c986b198ff4be6ca2201deede22ae508f0fa98e10f15fb6a394c07f227c5fc9b96be278afcc", -"votingAddress": "uLUYKsurmLxWBj8pX49E2GjbKjC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8fada88a41daa24925466e373eebfe76c3b330cf5d8ec39814ec42327797ec97", -"confirmedHash": "a95556df31bf329ba60a9a32516505a0c5830668f6b13c490200000000000000", -"service": "00000000000000000000ffffbc28fbd8", -"pubKeyOperator": "81d89b79b719e75a0b1d343ca1ed9c5ec7b0aaa6ca52ea24097ce382ef592f78c54944da001b77d78ad1a5438078d9cf", -"votingAddress": "4V69VbSKCLELL9vbGWpYfZzganAH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8faeeaa9566b9599c4690a48b3ac2d791d39af405ba2f3a2b39e43772dc074dc", -"confirmedHash": "6cc125bd4d5279f7533de23af12f3e677ac7cda66bebcd341d00000000000000", -"service": "00000000000000000000ffffbca64934", -"pubKeyOperator": "863a1a8c8928fb3a0b9c1b16475ecca90b979f2b0a7fd0b850ebb873d54e9a5052a82378b59b063310b5cb77b093f0d3", -"votingAddress": "3YiU2XJtWhciAswrvURxDgam2jfm", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "8fb634965415e8ac6af2766d2530f6ca6820233debddc25f74ab60e020652858", -"confirmedHash": "d606c868e2ec81aab7cfc744fb55f859a805315a687421780700000000000000", -"service": "00000000000000000000ffff2d21066c", -"pubKeyOperator": "8aa7388a93a2bb0ebbdfc9a9d6abca9c2b8054bbae24aabc608e467448c58e269797743fc6e7b4fe5c5cce2587388e3a", -"votingAddress": "GfVmFckRpBkSsCVk4pb5BAECgML", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8fba1cfae793bf64c6eab40fd8ec53eebe93064cd3dc734a94eccd1df4509dee", -"confirmedHash": "f95d58e237f90d5bf906336283b059e02687a467f1ce27b71a00000000000000", -"service": "00000000000000000000ffff5fd9a041", -"pubKeyOperator": "93be51339f5d94ee76b02e2bec0d390555836a0c456b1724710107d5910648e960d4462743ac57417d995ade8d8b8be2", -"votingAddress": "2Gpu5JjJU1Kbvd9CMjBhfAXfTQBD", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8fc3d2036c283b75dc9a83ff5f8edc6516c2763d1a659db0314941ee22406b3a", -"confirmedHash": "e296a3dc9a286780f38c976e6a42e7b9ff044bd7401d2dd23b00000000000000", -"service": "00000000000000000000ffffbc28b6d6", -"pubKeyOperator": "94d877c6c8efd85862a0bebbe6e342e562648b27216e65b10ca4180e2d315979cf6cb572c033f4a786e9121afc9be3c9", -"votingAddress": "3AaLvZdb9xbXEsMQQtJQijwQFJFc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8fcfda67d4713276b203df75f06edd717cf05b8a38787580a499501a3fce0af8", -"confirmedHash": "0bf210b5eded9f6eb1088f8cc88f41c6b7df5247950070d62d00000000000000", -"service": "00000000000000000000ffff44b75c44", -"pubKeyOperator": "952a626f6d528d5cdd45a6e2259af1a8b35521404cc2c1b26c0457fca3df2b4e8b3f4d419bcff424efbc8347c75776ff", -"votingAddress": "2MScfMJNTXL5aFwNuiXKBypck7SN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8fd1dcfa084bd91a59a2cf2b1b1c3afad6abb2b7bc26a86c00be0eff32422323", -"confirmedHash": "97fa3bf9eeae1f90cb53e7f8f7c5eb3d3321a1b53974049b1f00000000000000", -"service": "00000000000000000000ffff52d31537", -"pubKeyOperator": "0455f9526d443b2e8ec751ac98ccd06ea4c19bc908c56a3f11ce9fe4288e67eccc1016419c9ea08dbc5fa1201c79076a", -"votingAddress": "zKmHnEZ7o8hWgntNejqWwXr74jb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8fd6ec87cfaa25f9d04206b337467fad8646ee0866e64c8c19e1314422037e15", -"confirmedHash": "2941ecefa6699694bebccc7c93c1bd55e4d0dbd38707e5e51000000000000000", -"service": "00000000000000000000ffffbc28be25", -"pubKeyOperator": "849af320b667c2d90761112cb85d84214b57c4571c512c622b8b07b33f7d597ec887df47d38abc3c325c55db7ebbe5d2", -"votingAddress": "2iXrpjAZcdT9LEqWVFMzXjA1Zjp2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8fda80b494911310d083e604d7a038e80f55c10994f032c308bcd5edd13ed799", -"confirmedHash": "1b09c83c0db97075d29d5ab48d334d231b0eb97f5741047c1300000000000000", -"service": "00000000000000000000ffff586324f4", -"pubKeyOperator": "093c2b6d096933f7ff7f4d7e2831a3325d262ac73929e4e39b40e045d5136c93455d0af0fd51b0acc212895299820b24", -"votingAddress": "2HZJcfFkQMb2NATruzfcjNWLFsa1", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8fe3b8b8c55e9a8481382dd30a97727e012111bcb6f9843a3398b81e4f7ba431", -"confirmedHash": "9d9ec54b8ebd647102670208f100cfae52cb915c05b309280f00000000000000", -"service": "00000000000000000000ffff8b3b9307", -"pubKeyOperator": "8e3111abfab23379dce77250e97ccd912f35a00cc190c52e6c383b48f14a5085a79dd54e567eb64d0a7f3f4725fd2485", -"votingAddress": "NuEuGjH5gdvUCWfsBmChDAjhvwr", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "8fe60b78738e24a98c2c83ae8c80a7c143e2d68039f912a2b14c96914ac16a48", -"confirmedHash": "e1126d826d7310273d73610a8430dca512afb7c552958eb40500000000000000", -"service": "00000000000000000000ffffc0f1ea40", -"pubKeyOperator": "825d12abde419cf6a70eb58a136b7dff662f920bcba7bc7608b8e797f59bb11ff1511badf927aaf7aa8258d23cb2143c", -"votingAddress": "2aAhbdgpqP3fmUzLL1LJNicXUDtj", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "900bc7f9bdcbd359c8376d2cbe68f9bbba5dd72584b453102bd2695477e87b91", -"confirmedHash": "f783b1bbc9cb65279d4f05ed95ffb26e27b8665b2731f3150100000000000000", -"service": "00000000000000000000ffff6c3dc42f", -"pubKeyOperator": "0fe9273862c26faf25d57dbf1af09b950c0cc0b6614c69f4c01bc57b15e30c4e140fd8a7adfeab66dc43825e0abb78f9", -"votingAddress": "4GHViQUg4kPyVABz2NpcwpRTXsdo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9040fdd7cec2cd9a221dcababd9994a450a0eb4a18ee5c357b6a03a71163bcaa", -"confirmedHash": "cc12ca4ee0d2ac8230d702969ae5de1342e44496d6cacec70400000000000000", -"service": "00000000000000000000ffff55d1f129", -"pubKeyOperator": "893b13f8dc01ac57ef61a1fe07b38486f199e7255b8696d91e00bf8121a4b1c4d7d73ed35743fedb0fe3cf24a2b4e4a2", -"votingAddress": "29Wb2MZZaT1WERRcvWPdLWJkRJPe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "909a3df4545a01c260d3bf1d26b012a94c0ac5b7b126393c69b0a7cfb6120cd3", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0d2", -"pubKeyOperator": "1196ecf02128c5b910d0005a3f488561ce4bbb1705c59dc5252b84554fc00aac7ab29ba315f9cbbae1d5e5039e5dafc9", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "90a498168c523bd4a02ba9bdb8a6ab37333d825c09fc578444390daa99de5e79", -"confirmedHash": "a1e094010857a009c83d4ef8d94b2fb2cfd6864e61a80efa2900000000000000", -"service": "00000000000000000000ffff340644c9", -"pubKeyOperator": "02f3969f2c6199e30aba289d6a40c3a22b8663b2d0119208973eda58e1a820320830e47a4a6cf7559dfd81e61bb145db", -"votingAddress": "3nJVqkqTvZoBPjGERc3ivdPrJDL1", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "90a5f22ee04653eed7595862ea8d33c0d1f18f97f07e6e17cf21c8ab5d663396", -"confirmedHash": "d067be8dfa0245856da4004315371999e0bb6dbf69487d040400000000000000", -"service": "00000000000000000000ffff416c61e0", -"pubKeyOperator": "818b26a5a922a09807f2bbc29f263c7bf226cf46929d3e19ad7e710c9fbdbc6456bbc90cddaaf05a2c6c26e6717bfb9a", -"votingAddress": "2KjL6NHkzb2C1HBSWtkMW6Mw18vy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "90ae3de2e64b60bd0a91fa41c32531ae790bb8beca0bd7d68bf9a3693df25559", -"confirmedHash": "0f07293743ffccdd1bbdfda2bf273ed2ceb2f62d7a6eb2160e00000000000000", -"service": "00000000000000000000ffff2d56a393", -"pubKeyOperator": "0adfc5961dd6b09d937c355fd0fcaaf689f80bed76e5a2e78ab2439edf146941686e36b791dcc53be90ab7a87bba7b07", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "90b559188e712b2773cc4c2683752e31fdf3947d5cf033729846150f1ac29f3d", -"confirmedHash": "a3e43c05adcff93d62c4c6011b7031345c56bd4f789b68ac0900000000000000", -"service": "00000000000000000000ffffb07b39d0", -"pubKeyOperator": "06e5fac9463e522f6169445a7af1b70acd41a3397067c724ae6a177ad243db82873690cbf1eb6a826f61883e91a1a5bb", -"votingAddress": "2oRviqV5rXNdFAGbcPVohCAjDgQe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "90b7e5838d7d3e02f5491c6c99f5e406024357ff19b93e5e07a3a43ac3df2a33", -"confirmedHash": "0a3a4aa732749df7d1d4b564948d1e02ab35071ad93f22380b00000000000000", -"service": "00000000000000000000ffff3625ea79", -"pubKeyOperator": "0694644ed1987e82aca044e8af5437d4640581be6b101f17da306b2c21ab0c5097c82f1ac625e85e8b993ba74faac4fc", -"votingAddress": "2sd56LxqbPAePX5PsnYJTdMiHA84", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "90f9b109ac7a4d998b85c09cbe4afac534e9f3b349dd107337c70eb986f21d83", -"confirmedHash": "84d6c6da7f81ed74d5e631aee18058356dc6965410d4eff02400000000000000", -"service": "00000000000000000000ffffadd4dcb7", -"pubKeyOperator": "1638c5c7d37f1ec5e216bcc5727a198bed6484690473f33a4ddbc180a6bd4e221bff3eb9575efceb0618926cd7e0248f", -"votingAddress": "4Gbjq2DLEAVWJzvmVPzmD8PoAq2i", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "910348b04a10fe0aeeff2719dbeed5c3c8d679fd4e8281e2f7f2fe21a388d9fc", -"confirmedHash": "6efe41cdab92192d89429c5478030b6e3daa91b1bc61b4910600000000000000", -"service": "00000000000000000000ffffd161a061", -"pubKeyOperator": "07b044b5d048e038461bc96d7d27aaf7c6bd907da81ebb1c4a25bb947944913e7f14c1925b4c287061929ae50b77dde4", -"votingAddress": "26tyuuD1dgtzMieUUzNaT4gFg5Tv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9103a3796483da758919c7e2eb5c5104f73d8916a6f860ca6ecb0eeaa6c46d39", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b070", -"pubKeyOperator": "13c7b524997766eae487d6523fd23e1c7a98486fe95f0a9b34b8869e9007e75096074cdfc87467ec62f141104f72f473", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "910558fac40abfc74712260108621f408323af0986ba250e3260430fcf2d85b1", -"confirmedHash": "bbc33a876db66f415bb3ff72eed982339f62cd435fa0dc231100000000000000", -"service": "00000000000000000000ffffbc28a31b", -"pubKeyOperator": "94a2c229ff64bbf5f5a6bf99ff7f28d3d48b373b8e8a091f73532dac66ea1f7f3bfec077d39734e82e511cffd618f5c3", -"votingAddress": "4RexCdVUSuCsYwJmxFdk87vaB3BW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "910fdc8cff0b0133f65c57609c77d468c2e8a8ca74053b635bcb8f61fd1ec90d", -"confirmedHash": "0466836740481df381aebafccf63b9738cd756311b9de9b01000000000000000", -"service": "00000000000000000000ffff50d1e3d2", -"pubKeyOperator": "192623baf4dc55eec387a2c1838e6c8c96d6c78ea8cddbc2aa850b446315f26d982af314565c525a2a43b3e90b88fa90", -"votingAddress": "JyNxBf5fG42B72SzAcA3VVdmCaj", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "91185b1ee75bfc9da3a977da52040450fd75110b392fc00c1a580ab0bc703ed4", -"confirmedHash": "f88fc5ebcaa5e5815158333cea0d9a8445e8feaf3402a0cb1000000000000000", -"service": "00000000000000000000ffffb0df8f94", -"pubKeyOperator": "84b9c7a6cd4636c371a361cd7a72eba72fc727606772d010cb98fd92054ba7bb014153f7bb85b26021df93be18f9747b", -"votingAddress": "p9NWKLhTFjpnFCgr7Q6MJrxKZbC", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "913d0f5b060a2ac4ba93e57f8b1508cd37ce3618b6a54cd22a2e48658e4d0d21", -"confirmedHash": "2f185e2e5fe5737638d7fe3576326e5fdab60dc8bbe9ddfa1100000000000000", -"service": "00000000000000000000ffffbc28a311", -"pubKeyOperator": "8c9e590379dbe1b1a16fc19348179df85f7f828e3f1902271cb0ce89d1bb4ca32cab62dcb69be6bc328c09aeee4ff5fb", -"votingAddress": "2uefcmNLTJNdPxNe8oEmiPfFgJBL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "914aa40641af1f34f5020092c2e70affed6ca20f71575c495f55b14067a035b4", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffffc17a8f71", -"pubKeyOperator": "872555ed85005bc922968bfec3b7fa517535dd6c6546476c154837a27d1fde771dc9b686854e536ad9f962d9de546649", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "914f2825db0c6e35c7377972c61594415b70b3fa069d590e2aaa6fc05256ea9b", -"confirmedHash": "2f0a2f4489bd8c74b6b070e2bafbb25ee4aeac61ebccc66f1a00000000000000", -"service": "00000000000000000000ffff52d31543", -"pubKeyOperator": "9923ff9ed880d9f6dea24b461c07d99bbe24f9cc9fa51c0832ecc4b6364c05edf719b45c0cf382ac7f5cdb629506015d", -"votingAddress": "41MKvyv1QXnu7vTHQP2z2xTUB6x6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "914f36334b0b7230282819c1ac785b4e743343778896dbe4355263f3a1620615", -"confirmedHash": "29709d2f229dd657ceafc32b893cd9ec223ed6320bbfb7b71700000000000000", -"service": "00000000000000000000ffffb94068df", -"pubKeyOperator": "95a5e2f352479fc32553b07b20f0a8861867ae6fa86b1ce74aca455c7c03397fba30e9c958cd71fc986b0beddd1a7442", -"votingAddress": "3M1fc9Acy21PJHGteCz9i3jYdoxu", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "91505bd631127f5824f6acaa72e65bcad8caf520a4d715b636f72cefb5b228b6", -"confirmedHash": "1cf9ea24912e3b2dc250d3bfe4c28b8d2e0814e463dbecbb1000000000000000", -"service": "00000000000000000000ffffd1fae058", -"pubKeyOperator": "91aa8d82cec81be207aacc128947994cd3e625062b4fba5e8ec560683ab4436856e825e5a2021f9d6831489051b09649", -"votingAddress": "48D6FErFQtHWHGE4QPajSYjaExpB", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "915eb08b1cd1a731db5c9801154221845437b143ed586b09626a3a7a66428152", -"confirmedHash": "9e83dc070fb3848efabec30efa4b8a4a93d2b819b08a471c1400000000000000", -"service": "00000000000000000000ffff894ae7ac", -"pubKeyOperator": "88972c91feb8db66a6c32da61fd1986a37939469841a20b88be44ba6695cec48db26c0da2c8ce62063f3fadd001b3ff6", -"votingAddress": "3j5a98kGAYDxbgAypw2XMXmvQiGr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "916185e4c3743134ff46ba26a240c5951f1367d458bcbb11a6a803ae549965e5", -"confirmedHash": "e31cba58d2d812e8575163c9c5006112dea102ec43bb5b6e2000000000000000", -"service": "00000000000000000000ffffb280e54c", -"pubKeyOperator": "0dbf57604a3dca1f55b6002374429c35600c1401fc327bf89bba798dc2d5e3a66868570929b05de2991ca3b477134eb3", -"votingAddress": "3BufFv8RMs5wE7eiLKC3xKKn7QHU", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9165203e6d4375397a0505081653b859049d9515fbef097d46ac7b73003e1721", -"confirmedHash": "97d5e6de71b3a09ed93314db18339c1e69cff11c132045040800000000000000", -"service": "00000000000000000000ffffc0f1e05d", -"pubKeyOperator": "06751fce6e44b11cd84d31f8842f2f104d0a40b42654a62f0a245525280b4a6599714e2d4fcf59151adf99cb11456db3", -"votingAddress": "EZw8iSQWkn74mzZgFXVCzCYk7Ww", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "91661cef4d7d11385719ffc1faf32e3733c457cb06c3fc7812b8df3e026f98e8", -"confirmedHash": "7494db8847ed58e48ab06b6c1dbbb766e4b3fd6f1f8d2e911d00000000000000", -"service": "00000000000000000000ffff86d196f8", -"pubKeyOperator": "912d7fb96fd23512406e178e5ddbba9beddaa5ca3de925232ecf11af80db1fc85f513d21146f1e09a296c718d85e0261", -"votingAddress": "xYQafboJkqNaYuAC7ewuq2qqymv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "916db443bc57ac5fc24bc40f3aee69b8edb3d759bfad3f3c0729d69d4271207e", -"confirmedHash": "9b9d03adeee2e2124e29d80c907babf1860ebf222820326d2800000000000000", -"service": "00000000000000000000ffffd41868eb", -"pubKeyOperator": "14894c3ce9df9184a26ec703c21a88b362fc32453187013e232dc95a0811921b25d5372c1f22172a17c46cba5b301a9f", -"votingAddress": "4HDrxGRLB5cXKa7vJX2GgJwpPdCg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "919e4294fbfc324c543e258ebb512933a67ac3f28923afd0e28dfe07ab6c06d0", -"confirmedHash": "af5e202e7753767e4a15b2aea5fb5663e825cd8eecdd17ba0d00000000000000", -"service": "00000000000000000000ffff9f418312", -"pubKeyOperator": "8856299908dd3c820fb18a051e32f1a6f3bcab996413b6d91c9078ec12b79979539007433d5119bfe9074dc14718ee53", -"votingAddress": "494DLUnSwxAd2VFQ6TdGdkCoFVXD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "919f440458bcbee743bc32869753e2d247963139f6fbb22e8e7fd944915e1f2c", -"confirmedHash": "6048c11aab4d4ae9537215faf389d741ebac6f1b3d97636a0c00000000000000", -"service": "00000000000000000000ffffc0f1da24", -"pubKeyOperator": "842197264aa83c06a1270f4dda51fc9bd0f25bfe33bf7257fce40c1f04d782e3aba4bcac84c3899bf3a032f1f5dab1a4", -"votingAddress": "4JheTnaJYGbKxP9acbe8kehudsTo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "91c3f5d4118d6602ce4acb0c33c439e6b7daa61a60cfffa9191bbc733aae1445", -"confirmedHash": "fd6b675df4e77c90a51f08f012a093c51749586d2f2c3e850b00000000000000", -"service": "00000000000000000000ffff2d4c2ee2", -"pubKeyOperator": "8ce1b3bd04c1f83847be2360920943cf1bbac7d111f3bc38179b363f10fc5a5b604a452100519ea62598c741ab15253a", -"votingAddress": "4YWc3bGqAFyKpz6vFP2mohXKnGVj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "91c68407d60b6392b0a2e14e5375e41f6936af6853d801b18fdf12c11cbff994", -"confirmedHash": "ab67f0c5685b557cc2e06bd393474b457a54a2953dffda0a0700000000000000", -"service": "00000000000000000000ffff5fd99fc9", -"pubKeyOperator": "95dbfcd1280543bcfd2bf2becf6ada535936a4fb60d8d6139dda2e51b14b35afb79747cebaf1a8fca5a815897657c3a5", -"votingAddress": "3PZAmwyHPTcvzqKRKWpUqcTVq8rx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "91ca2ca7c2f678fd9fa61236e4c728eba32e08785a233415418b185e25c201f7", -"confirmedHash": "1ba7ca3be0b58d713db473a341dcae9bd3fd67ef74c98fd81200000000000000", -"service": "00000000000000000000ffff9f451f82", -"pubKeyOperator": "85354254d1148542dba06798a36d4f6e3a1bfc5318ac9e00d819a51088a9e97873179f4a46ea877b8ae21837dfd879aa", -"votingAddress": "4VUqNBYvCR6Jnu1rS5NLhgAZLcPb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "91cf88eca6a9481b4f94d36b9da6ffa6dca15509eb4a674fafd7804c963b55b2", -"confirmedHash": "d57fbac48102742cecb076cb448a36962e291769ddd8735d1300000000000000", -"service": "00000000000000000000ffffb0df8863", -"pubKeyOperator": "8594c7a27b83d703d11fd450a8a492d642c6f5085b63ce2da1ec738db90567350407242d7827e824b411f0ac11a6439f", -"votingAddress": "hiuaMT3Lk8rR56dRPLJWU1xifws", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "91f3d9d3b6a0eef530aa8a633da56a59bd6d0e9f4972cbcced87e19bf601c97a", -"confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", -"service": "00000000000000000000ffff9f45cf01", -"pubKeyOperator": "02dd45745f2924b271224227c808c156ea4a4f3723e30705268258e7db47eaf102f78b0ab0629c875172b47ebc6c378f", -"votingAddress": "3oY4Enr7qztTMP9TX9GAoJ4z1kYU", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9244ef7b961c370f4c1e2fe019292743f5aa159dbae9ec4060dbeeeed9ae910d", -"confirmedHash": "f81b002bfb781819e3cda2623aae1d1d0f63ebea4c3e81120700000000000000", -"service": "00000000000000000000ffff55d1f226", -"pubKeyOperator": "82cf5bfe103ac8af531dc1d2875197420b841241d038e2536a5bdad0437b02d62391c767d159c5dbde9dffba68432d9d", -"votingAddress": "243hkNatamrvG96j9Cm7uj8mRNsu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9250ba08dd0a65f793ff0d98c9df6f5ee6762552ba0e560decd41b4cf91cad64", -"confirmedHash": "dab715aae3b97199e6d3dbdc3eb97788e92fb3707474819d0d00000000000000", -"service": "00000000000000000000ffff5eb0ebcd", -"pubKeyOperator": "0e90ff8b3f40247ed57bc4e92abafeaba14180167b79a264d4f2174441367faf27cf66c2020fe18d3f42fdecff2dccac", -"votingAddress": "3k9gnL3HznGSJQ8o458vajmcpaan", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "925fa97d15ed80c872ad6f1ef785459315144025a668a0cea3d6f87a4716a5ff", -"confirmedHash": "6e536cccbcd4ee52c421bc42fd8e2722276de1bd7c0382c51c00000000000000", -"service": "00000000000000000000ffffd1faedbb", -"pubKeyOperator": "05ed616c3b2a4efb56f998c8c692e6345bd3287fefcf083989452f5269a34dc38ce2e97ebe3090c6822817055b3ef10b", -"votingAddress": "4LoSjLM6Hp9Wiswi8HJ5iUcbxzUP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9276b5d66dc0faf75b60b392beb114fb55b9445471c842a2ccd97dba9ee3d18b", -"confirmedHash": "d3784a868f2fbf7c46dc052d63b55f1ebd403028dfc4fe8a4700000000000000", -"service": "00000000000000000000ffff91831c74", -"pubKeyOperator": "166e6f2dc61d40cda2a977b84ed534ac25a32d58ad16457f6fe5fa60b1f9d453f5af33cdbc6e9ac5e579a7b737dbeeb6", -"votingAddress": "74CbxiQJhyzGwfDJmbXTjdfE2tt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9287f33661d953c969c565e815dbc97eecc28fa761e74f62c4a505c4a20232be", -"confirmedHash": "1b524c336c98c3672741abf52d9e5b4197a6db9a218d78db0400000000000000", -"service": "00000000000000000000ffff52d3150e", -"pubKeyOperator": "9788958acdbf8e8b738c055caeb615d1b5ab0be2ec70fbb6537d83b51b2c02954c1879f38c8aed67db9bffb4570f1745", -"votingAddress": "38kNGtwVvmAUz1r3d23u7ctaK47J", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "92a478b7b9b5ac75b240bca086e673e1943cdaded82662502a768b6045138f38", -"confirmedHash": "2b920610d29a8c71bea4235a0972279eec843c02dad91cc30700000000000000", -"service": "00000000000000000000ffffbc2815e8", -"pubKeyOperator": "99c2216a5682c8270e8d18042d775bfdcbe1a740ba00a48df45c5e7969fa6db36ba570cd99553fff265d3843fdf7625c", -"votingAddress": "Dbqgxc9LgHHvvKCJR3WvqjXuice", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "92c024c2905bd117ee91edb5007de74cc485f671bc0c4a8593709934e4043578", -"confirmedHash": "2f85279967d942a75ae499321cc4ccdd8cd52ac3e6c78bfb2500000000000000", -"service": "00000000000000000000ffff344785be", -"pubKeyOperator": "0797cbc34a47ebf45c6328651de835db1e5cb58721b6f27b752228210227be6d305de7915ccffde924c540c3529950a1", -"votingAddress": "3derPdHBzdHL9TpgKuLeh5TvdBW5", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "92c11db601fc571f71afce97d15a258f74cba3c82e4f6380ec732ed0dd4c8e12", -"confirmedHash": "b4e2f15d392d98344323c3664d592056d0cdc3ce6ccb485c0f00000000000000", -"service": "00000000000000000000ffff03dd3df2", -"pubKeyOperator": "00cb4a969524e8739c403fe8cb7a571a375602ee6d69190442a8cf60ab9f24829ccbbb2397d2931a929316024508f19e", -"votingAddress": "q75h1bdU7N8XoU8fpoSpsmoJTy7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "92c189d163b184d9ef1fa969c507c5582cf9c734e7c6a3d1faf8a57cea82e0ff", -"confirmedHash": "9f4b3e752fcf695c959e1fe1e948acba37c95aaf1f08f51c2200000000000000", -"service": "00000000000000000000ffffa2f3888f", -"pubKeyOperator": "0ded4b77eb62e502f5f373138e930d9df7a02e03021a97460165fa160205eabea220b881c9c9c5054647312137225417", -"votingAddress": "28g3XmBUABdGRaDm6fHeo3X7Vt3v", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "92c1bc378081a2f645d315cd8e4cfefe7e93eb110fcd340a02d36cab7a846f9a", -"confirmedHash": "0e206dfe982b368c7ca2ed153b71850e0b63b5ba3614ff561800000000000000", -"service": "00000000000000000000ffff88f38e25", -"pubKeyOperator": "135f788485120d02424d1dc1bc9469d0c2f910dfe4cfda67fb62bf3fc5f17d80f6a6c23cf3bebbaffbdf7b89f4e189b1", -"votingAddress": "2Q65zNQzdFdZZV9uToVHhoqPm53w", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "92d49ab558c9785c5bc1495d56a224dccc514a3be251b8622b8b5b5de492f61a", -"confirmedHash": "37664cdd13ca52f96c6b7c96f722f7a52107c4463984cb470400000000000000", -"service": "00000000000000000000ffffcf9aeb2c", -"pubKeyOperator": "9699bbb4ba24b6ad92e8816112baa87ab4638bac785fc234e9de82312fc85dd80bcd91debfb5b43cd42f4e9e53320ed2", -"votingAddress": "3sp6c2Mvv2ybuW355NPUdLf5BEL3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "92d8c3c91d451118b70609bc635846ad49462c588bf088fa27e41f557cfec8ca", -"confirmedHash": "11a8c8a8e63dd7564218f519f64c2e32e5e52ad3032d23150e00000000000000", -"service": "00000000000000000000ffff5eb0eecc", -"pubKeyOperator": "0af18a77709f059861df34e66f3b01a30255330686b77b5e5768261e4f902e9598fe8b0f4d919d2b768a5705ad743718", -"votingAddress": "22hCM7Ap58yq7Vrg3RJftxKizzbP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "92eb6189a69321880ecc602be9560a5877ce837988428b26a0c74a20e6cbec10", -"confirmedHash": "5235996088a9c4079890ea963248e4b924c8e964625cdefb1c00000000000000", -"service": "00000000000000000000ffff3326418b", -"pubKeyOperator": "96fd036ca360af5f4c0d4e8374ca6370987d10274cee1e853590a1f6249c4934f5cf1abe3f422fece8a4991f3c1231bf", -"votingAddress": "4PbxoEF31KNKqqWffiYpwuoV6Us", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "9310711e11cbe8243cf2e521a8323f86f042abe3d5bde9d44ad9c012d4d01665", -"confirmedHash": "0335ae53e370bf027f1bf8e91067f51e0e004a03797f4ebf0900000000000000", -"service": "00000000000000000000ffffd4186805", -"pubKeyOperator": "890b17ce0c227be23fb6acc60e15e4fcd39abdac5677de2c35325e92df5e5a335f08b2e082fe4d22e21745abf8d17945", -"votingAddress": "2V9c6XS8VnignpJ6Ui5ASe4XFaSD", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "931114e579a9d99be55e536b8b60a5a0b70874063af6e5e5f5f63c315b4c1ce9", -"confirmedHash": "0e16f2827da5d9d0a494e4c4c828e3a9a34f23b8eef552dc0100000000000000", -"service": "00000000000000000000ffff55d1f235", -"pubKeyOperator": "8031591923ff6b10863787c821f86cf42c541f0eee5df3eb6d6cf1df97162f5b73c5fdbea03dcd5775983c494b094370", -"votingAddress": "2ScfPv61Nokaj1EnAdo6TPjRhsaA", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "93119ad8d6130c7f6a3671e54c58dfc7aee83750e0a12bc406e6f24484fb98eb", -"confirmedHash": "e65a255507dc57d15253bc9393ebdcb4a97d860026ddb9331d00000000000000", -"service": "00000000000000000000ffffb280a18e", -"pubKeyOperator": "94191310963f2471a45c78bab177a309baae5f6928eeccfce50743c90b4c79b6f42c1a0e3d0af4c047bfca81258a5469", -"votingAddress": "2kW8ZzWAVztmBTywzVHH3Lk7TCt3", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "933ef3070d56780ac837a206d1088e182666bec88f5073449ebb772d52c95d47", -"confirmedHash": "ba8dfb29a3ece4bd24c6558d9c4364fa45f635117672338e0700000000000000", -"service": "00000000000000000000ffffb009d20d", -"pubKeyOperator": "964162ddec45e3dbe4e587c9c3e693661ee48a72596fac194851b71101087f830969bc33aa2ea742b119d30ea805e2f9", -"votingAddress": "2136PWHRdA8BxZN1b3AhEmue59yN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9347d330948f71c83fd638f6eef87fbfb799e5e47df5b6682901a285e45d9b93", -"confirmedHash": "5c0d915ffb49d7f0b47f8a73e6801db19af99c248440047b0f00000000000000", -"service": "00000000000000000000ffff94fb8806", -"pubKeyOperator": "9143c6bb031f65b46933a9a050352746857f5c8bb921f1e73cbd7afb816c61d898ef2f72a65a8118ebfa2ec9f42828ab", -"votingAddress": "3KJqnwp8DSzUb6nMsxww1L6XsreC", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "935de6d5887591b7ee0cff5500366f8dd8e86bed92a2a63f8262aaf254306c80", -"confirmedHash": "d7466451b56a3a8d1acd5d2e03dcdc511865212790cdce6a0300000000000000", -"service": "00000000000000000000ffffb23fec72", -"pubKeyOperator": "1892e6796ce60c17dd507f18afdbd203581ecbeb71b5fb445154792d670e260149e27309ede29ca63456d9146e60c52d", -"votingAddress": "46vQU7SzyMRXfNgEx6Q4ejwo68Vy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "935e3e3a37d4adb5bbf3723423300cbb647e88cf31bf9f9b69b9805942adaff8", -"confirmedHash": "2dfeb7f521a8d437f2ce0ec1a2b93bf12920919c45b8f0cf1600000000000000", -"service": "00000000000000000000ffffc3c96016", -"pubKeyOperator": "872e88ab15ac663ba9aefff28a7e4b17270f9d4b62bff63f16d9a412c5fad040286f4f6c49e9965ae79696bf847446dc", -"votingAddress": "Vbb7aZcALEUouU8npMK2GMsrWwH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9363b00ed5467020c43faf1d02488713234eac181fec161b5b71218c2daa3a62", -"confirmedHash": "40155ff704d511d70f5b8b3c907ec547acf8365a719edc681a00000000000000", -"service": "00000000000000000000ffff55d1f181", -"pubKeyOperator": "98e4def8793e3961cf171972f5424258cae8b98948c711f39dc5bf25e51b0ae0918884bd389dcb95c6fb315f7f7a678d", -"votingAddress": "2Rb2eatark4tpgVTW7RcNipjLn9y", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9367b83fc9f0c127fc1a82f5242a13c1bfd95ec136d0f165006b5be70644344d", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff8491bc19", -"pubKeyOperator": "944e6af7490001ab212250926d80aef74e4821305cfff71147786b2788cb7957ab3d6deef136131eaf43dd17f14f0a18", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "936dae23e3f03f50b1da60e47094d89d3b17f6b831a1828c6db2faf24d444474", -"confirmedHash": "4bfe6b55ef91ad25c42b0d1c1ca65b5dec6da53cd199bd3c1300000000000000", -"service": "00000000000000000000ffff2d4f2d1d", -"pubKeyOperator": "834331795e12e80e4e48d186d6f7acccca160e5d05cc247bf33fde6612153118b91aa66664d9ff1c7383132b42c953d1", -"votingAddress": "33SY5kSJKrGgwtyGe3LcQLPTFyfz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "937307c0313b96639e5eb9507dab16003cae9de4a5f29041de9b967533e5c29f", -"confirmedHash": "218bddd1ff95090b58999584522ffdb7034140b6209742c40c00000000000000", -"service": "00000000000000000000ffff52d31921", -"pubKeyOperator": "898a2d37e7816ae89b5e333999cebf87855d1b423ccb66c0f530eeacfea7d56b1e37bffb8f506a35243e2b2269c95fe9", -"votingAddress": "4GeyApb5xghoA5V3HqRF6GVdLDbW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9386d636007261eb5e3b843c5a9ba9e1058d7298f59c0c4bd3e0848f60e8d700", -"confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", -"service": "00000000000000000000ffff689cede3", -"pubKeyOperator": "865df578987b162bb9d55aa5dfa624a01bfe04ebe1118f4412365b845100505e888683cfb62c8a861fad94b5fceab7e2", -"votingAddress": "o6F4596mZaUUXfir41vNZg19V12", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "938da889da022fc1cee61d19158400359357b50fd2a55f09a1b28fc3cc7ade97", -"confirmedHash": "1f825ac78e2069946ae1e3babff0c25f8d6d4dc7dce10fe22200000000000000", -"service": "00000000000000000000ffff8a44ac05", -"pubKeyOperator": "817fc6dd4190a9128b095d304931f4a369e7216e5ec4bf2c8ed8792315293b27d9d6997af367c766f5453d1434851053", -"votingAddress": "25iEFFUTrABuoCrQijUvGhRaRdi9", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "939e638971db1279c1b3e3b10475056739d25887f924e0068662edb381adca6e", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0b3", -"pubKeyOperator": "993a7f81b63fac5bad4c0b43a9aefc69b140dbd6b09415171b5dd1be0fdb779c4cf445cf7d24afb263b13c8ee158bb3e", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "93aa5921585eb831c4601bd2f0b031c5198f10df4dacf918ebf7370edee39ced", -"confirmedHash": "6105df555dde45aa7fe0d83bc961c0c919ba16920b6b188d1400000000000000", -"service": "00000000000000000000ffff87b5fe75", -"pubKeyOperator": "80b84cff0c18d98c9aa2c0323d72d79a91344683594b5657f7ac3bed74797b400e8800367eaa2c8725085faefcc679a6", -"votingAddress": "38y47MwHG7ripDNwNCg7SpTNEjKm", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "93b107d928e44dfa31dbf37777aa0c474878c15faa156558ae0acd6719ec9814", -"confirmedHash": "5ed4f5fc30e936bcc9c149e0495d75962417f1653c1a2ce71f00000000000000", -"service": "00000000000000000000ffffb95cdddc", -"pubKeyOperator": "11dc8909b45bbd0eeef4f37ec415e2d29c8678b151ae61a1fa4844c1b0beea1428deb5c214b6389a914e30ce733d9c44", -"votingAddress": "2DsVrceVYLLpLjxcnJAqqDj61Rsy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "93c83f915d010abb8ca4fbb57f8fb1d4ae37738a7092ec9f84bcea29d4053904", -"confirmedHash": "b490a8fb1562341dc352613c05b8b70e7dc4a789106fac061e00000000000000", -"service": "00000000000000000000ffff5fb3e8d9", -"pubKeyOperator": "82d34a72d41d963d6b6a98aa09080a8f98ed2cc0acfb7b7d4204de14cf89f120f6f144f3fc30c415a375d79bd40b9fc5", -"votingAddress": "xws7fBTcyXv2gsygHhBCYJid9QT", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "93d4f56bc5389f499a84ac196fab1bed84dc22f2b6bd58153e9a846e13d77e5a", -"confirmedHash": "08540ff0c09bce8d2f577a0051a7dee96a87c5f14688a4ba3e00000000000000", -"service": "00000000000000000000ffffc2875248", -"pubKeyOperator": "98f7a1a04f247db7bcc84bd0241614c2e7525d9ab4643e44dd8fb8a2fa8cbad4adc742a9f38311e3d7a5010f00b1261a", -"votingAddress": "zCnVyZkJx4Nbp2ieqKLvPLXdeNY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "93d731c50434fc6fea1ff83bab8ce8bfcbd85dcb7e11216843c1c199f9009aca", -"confirmedHash": "bde35805d37e1e3b109c05ed15d2d746b5f48cb9c3d928b70100000000000000", -"service": "00000000000000000000ffffa747300d", -"pubKeyOperator": "0438b088dbd4dec9a408065b9af39c7be958e422578850902329b01789dd910b3bb4a74be927bf6b1471772ade653164", -"votingAddress": "ZuEnAg6W2ac3eiN3WNVfWgfxdMV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "93dc54cdb8c9b4b4d803acccc67f53d14935411b5ac25b17f3b27b80c1aba5e5", -"confirmedHash": "2a0465522ca98da7b298dd208cd3a7ad16becf7641f9e8c21200000000000000", -"service": "00000000000000000000ffff55d1f1ab", -"pubKeyOperator": "8fab22b80cd7c9a238b495535719ac1c99c9bb8a2fd0c989080f706213f09663212b51ab0e0d1b4bbb60c950caf2bf77", -"votingAddress": "3sW6jQ5ngrEU1Z71YuEKcmGKtVV9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "93ef149ca038359a925ebf16e17fc2b7c8781fc5943b3db3c884ce27e31066bb", -"confirmedHash": "2f4fd4de5f760f387a499b84056003cccd1e7503a81e17201a00000000000000", -"service": "00000000000000000000ffff74ca177b", -"pubKeyOperator": "0c047bbbad93963043cc92d9fc9f70e5dddd51548f016b9da00e7231de59a1b98ab859cd13420abf66aa4c44c4326bf3", -"votingAddress": "35kXS3ebuieyne7DHiaxxpVoEXWR", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "93f97344081209765c5908941fb116b07bc218e80e6c53bd576bd831ec28defc", -"confirmedHash": "56be1287457142eb6191a9bdbfe89e1b1faee72868d87ead1900000000000000", -"service": "00000000000000000000ffff52cae653", -"pubKeyOperator": "0d6f95b3f2e522a21badac5569b62a09fbe860d302cd7389a35511c0211cdbdb0cb623c0dc40f8577fd172a62ec569ae", -"votingAddress": "3nEAvUR3LYR8t97ruXMp3tcBHBuc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "94132d848dc5b54b23abe0165c140494c4119daea80d7a8fefd13d50dd43b9ec", -"confirmedHash": "7b12031729b85a2722ba35ce485c022efe96956c7a550d310200000000000000", -"service": "00000000000000000000ffff36270a67", -"pubKeyOperator": "08d0ed0f88b50c87adb4b6e45dd0f72f0cc1613345e72aa716ebbcdb5d769faf1735ad041a161bc92599266c4d2db36e", -"votingAddress": "NXgq5NaevG2r7mAaAUMmLXAALpH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9435fede7f31ceb50e4fa160448eab4308b869f3870f67c9fd45c93246b124cc", -"confirmedHash": "b435ac1f7f74e1dec94c0cdd35b533db45344e6127c241ef1d00000000000000", -"service": "00000000000000000000ffffb90535fb", -"pubKeyOperator": "88ae98e67255dc20e1d13e716dc630584d65f675313f5580d4c50afad0fd9342d9a3cb76fc6290cb7a495a6bfeeba9b9", -"votingAddress": "3v1n2CfNHeSUUBGyRRkRqKq4jK6n", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "94591a877d348c853772b90713f67348137471c463d2de1bd49017d187d39a9c", -"confirmedHash": "3bf84883e02fdd972c1de4fb57bfeb92250a7935641025ef0900000000000000", -"service": "00000000000000000000ffff4e2f7714", -"pubKeyOperator": "8d02779cd103bef2f9933a2520b71c9d685554b2802f42b0b0edb107d2c6792e6e489d3b8e05486f2a8effb3788ab766", -"votingAddress": "4G1ZngDgp4zFhV5h8fKpibXVYGuB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9468947a28eeb1096390d129f5c64bf088f597b687ba49decd85e1e98bc15add", -"confirmedHash": "55a81fde90c8b44ff12656b158ad1571fb7e99cde73dff0f2900000000000000", -"service": "00000000000000000000ffff6dcdb485", -"pubKeyOperator": "90ba3a3979309a2afbe6d7ec700f68a69b2b428cf595145e8ecdd10a06c051d933f42a48f5b7c04ded3e80138c3187b1", -"votingAddress": "2nZ9riCbD4hjrMbzgvbdEb9fpAif", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9484bef462f86954f6bf2e2d3f947140ff6a691837a4fabaf030aed2fbad7916", -"confirmedHash": "1cd0219c8a36c16f5a05a55a629daf2901a42fa7e56a67bd1400000000000000", -"service": "00000000000000000000ffff52d315a7", -"pubKeyOperator": "1380a4dd89332d2bad342f59e0237ee470a9444e5a30567ce72ca61838acedefd9a19eaccfa0c619c554e9dfab961025", -"votingAddress": "34C3u1C66Liwgp8gG6Ryhe1SCK8y", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "948d15320286709ada93708110c0bd7cdc020cc88caf046cb85d198f06f6c96f", -"confirmedHash": "84580fc296439b4958f6c5317e5d50f5261e7ba0ea0b52440300000000000000", -"service": "00000000000000000000ffff86d19cef", -"pubKeyOperator": "0efd290d21d161fadd1a4f4f5f0cdd55f80eeaf819f1f3a3130b0a405fb8a1d04984bf951286018cbdd5bf0650580101", -"votingAddress": "JdrPFD3V4ZCXabh4LM64ZoFp1cC", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "94918ddb6c34be085c8920e1b5409f08644552e1c593216305c1e8e0c5131c1f", -"confirmedHash": "f76b7f8ede2e12ffb1b9bb9363d3a93082ce76db399dfef20100000000000000", -"service": "00000000000000000000ffff58630b10", -"pubKeyOperator": "9635f7e075a86dd389dff73e36e266319b64779a21aa2055890ce90b8f16af75d1c7ed4ca309ee76986985e646cc4778", -"votingAddress": "4WCb9XY1zjHXzybNj6wi15qnDoEL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "94a66987c8a5ad2c68cca5900e7644bb7003dd858c7743f7f7b3cd508da87675", -"confirmedHash": "ca155287a92b44a951d16aa6e598e05c4051a48b9cb284081100000000000000", -"service": "00000000000000000000ffff50d1e388", -"pubKeyOperator": "0e6159fa6e40816162c8463d362b5b5d5d3654d4b67e0c507807ba8ece62a4c5179dbf4a0b53b346b013039d1f31c6f3", -"votingAddress": "fa62xPZiZASf7sz82TjSH6wadm9", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "94bce04622103c687514b6a6e5a30026b1c28081a51913ce2016be413033b40f", -"confirmedHash": "7ae41ca5b0abfad72d44d8ff279ebab168648ff29476db370700000000000000", -"service": "00000000000000000000ffff52d31949", -"pubKeyOperator": "94269ccd4003ddc0ef768ff023da06457c60b6adf7cbdb1d38a27fcb90ed59e890505bba255390170ea76d49683cef70", -"votingAddress": "4Za7tqmi4ARz3rDNvvyJhpcmdvA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "95124a3a912fe806e583c8cb54b0702f20dfc9875d834e4432519efd5714b361", -"confirmedHash": "6e7cc8bbcc11ef5c72e7cc082fec9cf10fe908cc13e7616f1500000000000000", -"service": "00000000000000000000ffff2e65ea64", -"pubKeyOperator": "86b1ca6f600d8e7579b4b2ddbd3f28b280c86bdffb92b17e3bf0dacdddf381adf8f02d9cc220a9a5651f5888e23aec79", -"votingAddress": "46AuEV55iAqnMZvWnVRNGm1Xv8RE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9515009b6bbe70293f58a1b75f48303fb018040aa1bebdaf88a3968dca180dc4", -"confirmedHash": "3001eec6eefc78b4157d5bb2d71a2b968a5ab664221972c60d00000000000000", -"service": "00000000000000000000ffff40e160c1", -"pubKeyOperator": "8a63101d62c713df7359bda5ad4672d38824dd59fc553198bd7d5a66b5c7a9c81aedb8922e5b29de4dca1da4e502d44b", -"votingAddress": "p2reBmwwLCnPZzKeKmNWhc7CtDs", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "951758fc766f7111c3f613d6af1fc9fcd66d4ac481fd23661c3a877c201813ca", -"confirmedHash": "42cb0a719758b9ecf39637ffedff1af9e1bc0f15e7ff1edf0b00000000000000", -"service": "00000000000000000000ffff55d1f192", -"pubKeyOperator": "16809c908d040c3752a78315e20c092256f97bbd274dfd4a2bdf1a25500f8f4a20b389d9897b109bc5c1acbd14ec85ff", -"votingAddress": "2uKE1weR9d3B1j4qcAprAuEwErYK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9540433f62e906218b6b6b8c696d4485fe3fab9945779cd0c56759d9eca81726", -"confirmedHash": "8e2613758a21fe691646e7576fb0cfe6196e6ab15913df740a00000000000000", -"service": "00000000000000000000ffff2d20fa36", -"pubKeyOperator": "8ec331c99935d3aa177de8a8a6e58bc1d226f6a4a43eb6daf372a69a850397136f244bf41791ad062b9020b27ef704ee", -"votingAddress": "2CVMdW3vn1cvrxUJsxBAPzNB3KBA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9540510cedf73a123a3b3d60ae7fee657838ec6f2acfe5601dce04b587ae531d", -"confirmedHash": "b9c573b69b84f0a4e828619c445d5181031978f5faaeb7250400000000000000", -"service": "00000000000000000000ffff88f46e6f", -"pubKeyOperator": "0065a7a560b657f11abdd17d7ae00b0504fa8cb82f8fa2d4e66b50cef9da5047bc7db201da4deafa56148ec801e3fd7d", -"votingAddress": "4XVdE8MphvXjZuxXZnjuvo1WHG4w", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9543f479b0f02c86bfde3e743a1bf5a3219cded22ba7b436314a888f7a032937", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688b7b5", -"pubKeyOperator": "08d1b7dfe005baf958b487a4b72609e949ced0367e1a2cc803d311a25a9eaada0b00568b385b595b214312704cfb643b", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "956c0bcad4de07e3f47a581c20aac99323453308d57317526f5d032203dd2066", -"confirmedHash": "70d7c6dd1354bbd7cd90ecf1ed03a25f1d8fd40b077617c40e00000000000000", -"service": "00000000000000000000ffff2e04d9ef", -"pubKeyOperator": "106af896b24eb96e44f7e41394ed695d66a17bda2a7a153e4cdd0cb197e31c8372142796b6531ac141770de5b3b43447", -"votingAddress": "qiMo6NyaVe6WNj37sW4RHCqC5cq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "957cfdacbfd9024396fa429d704f43ddea25427589c36203b16d540400c42062", -"confirmedHash": "fd9e4c4e00d0406bf847d4e122a27fad240db204ea2149211800000000000000", -"service": "00000000000000000000ffff9fdf3df2", -"pubKeyOperator": "095dabbe6572c5b3b4d5d595506afd871647c6410db9c6259f931f86c0f247cf6ac1552f8626ce6f8f1e30b58c61f731", -"votingAddress": "2xE18R5RKjJrYdjiYfGkRPn4MhK1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "958358e75278fe514c86658f6f942bffe06d6ffbabf954d84ad4f9835529c03d", -"confirmedHash": "6a5e15a6654babe6fea0a9fc4bd0b704b270dbfd80a776e90e00000000000000", -"service": "00000000000000000000ffffb0df8cfa", -"pubKeyOperator": "163ac973265a9226eee0b4f98c227c9fcb59dac9a594a8a3e793afd9b8c0f274f82307bad941babd90daaea2208d66e2", -"votingAddress": "8jhyoB7P5roUvxWYMQBK26C1uxp", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9583cd64737d2a82bff9b70ffc272d3a69fc8865a085970d0f4234ef333b5c8c", -"confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", -"service": "00000000000000000000ffff68ee9051", -"pubKeyOperator": "9560784efa88247112d561086c189d771b3ee93b28e64324cb882265ed7def3d928ece0a2b489a59bbf22187211bdaca", -"votingAddress": "gqT2pK4nEv7ryEShNpqvwaLZaAb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "958d11857c1a8c425da795854ce9254f5957e2430ab7abc6248ab1d24861bd8b", -"confirmedHash": "90d159e84b29b02e205321df8c0a01d4f7b057c21ea4c9270e00000000000000", -"service": "00000000000000000000ffff5863215c", -"pubKeyOperator": "17f852291517ee880eb460880af3ba44adf35aa34d56154fa48b87b8d5f7038e9029a5e37c11b99c4747e6fc37864bba", -"votingAddress": "4NqBWfdKBpibCC4QVFUoZdz11fvJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "958d832df563ffb3afe37d9c31ebc35d305b8da44005ad9d5209c56fff39f1fe", -"confirmedHash": "0d16cfaac1d5162efbcacdb6b5dbf1ec761731ad9afecf5c0900000000000000", -"service": "00000000000000000000ffffb23fec71", -"pubKeyOperator": "88d77d2bd90c952551fc88443f637b3ed3fa49dc1da446fae6a3cee7dff16152d4e141f492d4edc967f357f97efd4dcd", -"votingAddress": "21Xr1gYTxvrDfKSndJejfYrCCVmT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "95a749d15901691dde6569f88e7e8b2d2c99863acaaeb8a9af0209673d849821", -"confirmedHash": "85518800e57ec823d44a71028c78482b9c449f950eea636d2d00000000000000", -"service": "00000000000000000000ffff55d1f157", -"pubKeyOperator": "82a0ab8b2fb3526c0b9eb9c074daea315819e74e93ea981e76cba364661deb0c0c57f835ebacd9c1b73d060d343205ff", -"votingAddress": "2Tp5UkNAJeFkgmYMoABRL82uxkck", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "95ec8902a9325ecff5e94f71c25da31d53d6e134243089ac673b09a0ee473063", -"confirmedHash": "f6c82f7ceb24ee9008ed51fe4e494b3b69bf9a5e70b7b44c0000000000000000", -"service": "00000000000000000000ffff68f8c248", -"pubKeyOperator": "11e57eaab33b0fc9c10ecc23159274b26f4610dfaf30ad7a1ffb23e664eadad377151a82d5ad3a493c5031c36f8ae830", -"votingAddress": "35vApNoruM41JkDqvKrBaGvjRLn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "95ef3ae3e190f4ce02f9f5018a778ca318fb2ced963efea90fcebdcadbcfb230", -"confirmedHash": "159d6c679927f79aca6561e0d43e0edd42b592cc3d3cf0b42100000000000000", -"service": "00000000000000000000ffff052d6ba8", -"pubKeyOperator": "1593087a0740ab5a449f48ba14a64ea2c69b5955bd49d18171f27bf3efab1c054c4b2555a3a5e227a5c9a2968e09a189", -"votingAddress": "g9UyZHtWmm6epavCdnnep3Xuh9q", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "95f952bb71334a230a227b6ff8592c1153e5488d5089bfe2cb4703c23c106f89", -"confirmedHash": "e670c3630a23bbe7652ba34b74d3b24edbbd46cfeeef4c3c1700000000000000", -"service": "00000000000000000000ffffb23eeb75", -"pubKeyOperator": "012af1bdeff0497cfc6d4c6af2229cc1c4da2c7893fe43d48c48775ffb72c846ee4ec9ca93e1d1006d6df873947eb098", -"votingAddress": "Sj9Cp67UwdxSUAXBwpBYNNRfKjb", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "95fcdbe6bbee7fbd99528037f7345dbb6deea09a056560d8bb9faeb6dcd02950", -"confirmedHash": "4be6c94b95dd1dba42386a8167c8c4a6897f3c41b6c15d741400000000000000", -"service": "00000000000000000000ffff2d479f68", -"pubKeyOperator": "82382fb5079153b39e1b629247f1c5888a74604ec1127be575d988fe623af0e7894967e71db131c8a274661777f82f8c", -"votingAddress": "4FQUJHjPBwTQ4Dw4YmnWtzNkToKC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9603335ca5a6019b10ab44b1479cd5afc52876c3c43bd55ce45dbf2dc63c3793", -"confirmedHash": "926bafd5d8b19230ed4284d06829edf1b46dee2530f001821700000000000000", -"service": "00000000000000000000ffff5fd8e660", -"pubKeyOperator": "091a31faf6a67349a0cb1590663d1f8c3fde7da93c97a4cef677b1da52262149dba20c2eabaefd5623188828c8c64c01", -"votingAddress": "2AUe8mXapcceWgZNZd7bxQTYRTfP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "96064da1c6ec83628fd1044d0aefc972f23ea31d1c9295097a3058d0dc3f0f53", -"confirmedHash": "4e87fc311dee6a194b5b22b80c5b635dce3c24760bfb072d0600000000000000", -"service": "00000000000000000000ffffbc28b6c2", -"pubKeyOperator": "18dfc021b2606889e42aa018082f8f79fbe0e71b69ac16e6af64b84ae05547586b91c0d7296ed9a82b64af13873df4c7", -"votingAddress": "Tx9LVwkRkQAGpcpnELEdieMiUWC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "960d683f7bb41198cf7f07d13a33c1cabb1314052fdc1dd9c9ae09780a1cf1b2", -"confirmedHash": "635eda11ec6eaa35f268baab3264b860f5e863c94bc6fb3c1200000000000000", -"service": "00000000000000000000ffff334d71d8", -"pubKeyOperator": "8f43c5106346dfbe1f136e3f56840cd6a2042a010f16f6400f027f38a989c31b66c0049dc2d8dedaddaccee6b8083934", -"votingAddress": "QaJF2wbLRbasfCBm8rTFXR1kB2g", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "961303681d8529e32af9120e3e1ff6d88acd607936ca91d5ab58bc7cf66cd210", -"confirmedHash": "14110c73216cb1a49dc205a5fb0d3594fc776855b18aa3e12800000000000000", -"service": "00000000000000000000ffff68ed8b29", -"pubKeyOperator": "8d483f16de820a60cf56970b444b4626dbaaace4669b82fef4ba1995e4cfee2cd302b8f88e00fa246f8d10ae88c59f41", -"votingAddress": "3n8XvAgzRAqTczknwS9cbE17oHaM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "96221a3a4b8e2dcc307f0b8a78b2637030fb020fd81e631de9bab51da36a92b7", -"confirmedHash": "a1e6a81c221aed68d0e640d6581eb47941aef0a4afbbaca63100000000000000", -"service": "00000000000000000000ffffb945352c", -"pubKeyOperator": "858fe01440b3803b8344d9c5371cf6517bf205f24746ef71382f3febb8a0faf02558eec51da965834a832a0d87a1f7bd", -"votingAddress": "uC7fjiTHANTUoYnNH1wz287e6nV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "96240706ec052ad79bebea83477850948670e8ea064c365cdac97f76d02551af", -"confirmedHash": "45b436f25267c3fd57d69492da366d6e7a15115a6ace147d0b00000000000000", -"service": "00000000000000000000ffffbc28a30c", -"pubKeyOperator": "13471625bb93c15bb12dab530f395adc4cb57a997bf7d41cb0ae22e2e7fec688798e2feb114fce01e0a42dc889187769", -"votingAddress": "qgeoF1eEYz6xRJLq9Ax4Huu2dr4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "962f7b5b829e2f6c4a80e7a9b1e7700a9b60b30997bee2813e6b1b7eef69ab74", -"confirmedHash": "ffe06f3f73385cc64301a6425188360a8155b63d72af7ef03000000000000000", -"service": "00000000000000000000ffff6baaf26e", -"pubKeyOperator": "01385fe2e2c58eb01c318fef83aacf8b4f7cdbf8df7642ebb24388a54c31b18159ed75aefbf1494334d22491e45f3aec", -"votingAddress": "2eZXA7aMJJonXZjM5jLPE9jJDndu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9648a1beac5462311b6ddd07e3cece12976b891863515576bd5dd3e949c0e170", -"confirmedHash": "2f5046ee0582eb0b24eea5c6e28d29b82beca1709565f8661400000000000000", -"service": "00000000000000000000ffffb280214a", -"pubKeyOperator": "99650c6f0b401e1ffd2f63b9489bec67cff47d0c8da20276116f02a98de5dfb000be84054d3fc82b032d1c92378ce7b7", -"votingAddress": "2aXnahxNdQJZ5w7ZS3wh2PNtM24H", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9648e3b19b42bf7c7fbcfc7762b21f0247c4e68e090c3071c3ee7df7cd5b745d", -"confirmedHash": "afc7b0848d52b0ced781f5d98bed4cfa0ec6821071d1f22c1200000000000000", -"service": "00000000000000000000ffff5fd8e663", -"pubKeyOperator": "86f503c2c5bd3e2226235667301ecb412929de80aecb5bae12c1d5c4f6aad3f7e70b7100b881e88e2bc1a855f53039b7", -"votingAddress": "4YxFCiW2TyvizVyfajEo5DmuKFqC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "964e342c90fc79f12d3a64d9a6b594e60afc42d5598606184a3683b0ee5c541f", -"confirmedHash": "591c5b1d605fa69dca213764b2a1974510a3f18e1711cbea0f00000000000000", -"service": "00000000000000000000ffffbc28a306", -"pubKeyOperator": "99017bf12011c9eca2f0c061926fd93cb49ef196fc9d41046fc86b9cd0fa2fbe509b7bb13c5457867f7d641f983dc44f", -"votingAddress": "2rn8RmuARyr36YGX9a1GAEidxD7v", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "965d4b2587378ad6c399a483dea6e333e6f01d05d4635921518943556dbe0d84", -"confirmedHash": "cf632082a1ca1ded8a7e946fa5ea5c76dd8213f33bed27e30f00000000000000", -"service": "00000000000000000000ffff5fd947c4", -"pubKeyOperator": "0ef62bad0b0f6711d40eaad7289c710b45b280ccca734218f01bdd9d890b6bb4f0e37d45a9fbce453a64bb8af15df6d6", -"votingAddress": "3Za4vaescentazr3dTwwSz43LaSG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "96694ffa70b9b9620a3b87e52fbef2c13cf1bd89f65ae5a306cb5071234c0a20", -"confirmedHash": "21fa64eb92df4a915214be071ccaee5d6994cd7a005201050200000000000000", -"service": "00000000000000000000ffff951c8fac", -"pubKeyOperator": "11d7824e73537c60562754312232d19c98a0a9a593e541388ebc0b3b58cde406edb77dd333b8f15330dee009f3270ff1", -"votingAddress": "3441EXcPi6qnDCSAKzQMV1BBEiP6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "96892416e056e64b5cac472ec04a294b2229dc26354c67c52f164e47f0c89f04", -"confirmedHash": "b5ea2e43d14953f8df398d10630bbd5eaa28c26c3a4d1a141e00000000000000", -"service": "00000000000000000000ffff2d3f637b", -"pubKeyOperator": "9771552c0369ace1577640f5f5122eeb12b375458497bca88de57fd731de6b5e968c1b3128ce66fe4a1fdc654b3ff399", -"votingAddress": "rXKprebRyznsk1DX663f9vffNjH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "968a9242af444f35b2c9156578c003e084b5482ad572f9d76e86189afc97a6c7", -"confirmedHash": "d1b7942dd1c2a7cdf8b9e0a644ee6c605f87388a5e91bc7e0000000000000000", -"service": "00000000000000000000ffff50d1e0da", -"pubKeyOperator": "960f63e1c8f19381869f3da0115ef02734f1475ef9a20be42e07a8a318eccf6810e46c26c3733abb9c0c66be3fda79d6", -"votingAddress": "M55qJtxhmwbrq2k6vqCNxaMUPgy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "96ac036d425b197f0201c979c60e30c28bdc140f4d344bd461686c75e3410b5b", -"confirmedHash": "cb69a7283bda6001000c944f8d97eed30898120f07f7e8a72200000000000000", -"service": "00000000000000000000ffffb23eacc4", -"pubKeyOperator": "86edc104d6c17fd2a739c272e3251d6bea449bf24937a78914e0b254e22dff4fb11d5cd4d18e2df1ac4957369e05822d", -"votingAddress": "4FZimwdWs3pA4qK1i6eUGXfqndTT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "96b7d8fcda8ef01a5eda4d91da1f1699192f2d445d45c816c89c4f337fbff42a", -"confirmedHash": "37789aa83c9109039298afb192661810ff561d9620ba6b3f0b00000000000000", -"service": "00000000000000000000ffffb945352e", -"pubKeyOperator": "13b40f47c85f38c7e5e9374d252226f0478bfc147450030f0dce1b2643f372ed71790a056dfdb535b9f3cea59257603b", -"votingAddress": "3riJpym6TW5tBh3yzzHTW8JcBisJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "96c95d2198b61016fede2f39a0d16745c10accd83709e2ef0c3a8c9b7269c89b", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffff80c7448d", -"pubKeyOperator": "06ca3e322263142ea0fc001a162c20f147c3f874ad67a5239466b5f61231165d2d5f84a73a47465bb583508cfaedca34", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "96d1eb2f0f3e74da5f283e896211d17911fc11e8a16ac5b73c2c81f11a911a81", -"confirmedHash": "252649e5b9be0b57ee08e09025bcd6235d4986f1fa23050d1100000000000000", -"service": "00000000000000000000ffffb23febc4", -"pubKeyOperator": "85d94b0d3dfa98255b55ec2f4cd044cf3ae8ef1762577d8aa9b4afa1c6fb10bc10343c381d77a9b94e7fd4b96d0e8140", -"votingAddress": "j8sLPjKNKMDBGft5CqciTLpo5za", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "96fb3d26a7e4d57168e1c37e5658e6e624562c28be5094d5171e385a71af016d", -"confirmedHash": "1a28b076391fa94aba3f1cd78bab9ff89f97368362b374950200000000000000", -"service": "00000000000000000000ffff9f417892", -"pubKeyOperator": "00474e1bbf9bba49f1f3ad2b1065b1b5162fe84ad7a43e7d28ce7920b3d2947f3e0ec013786a442f768ac13ff29f2177", -"votingAddress": "sCMcm3LaFxNf1crXPnCV2L4ParE", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "97098a908747663c3b1c8a041443ec0e760e8d9d79ec916d7f94f14a60b07dee", -"confirmedHash": "3708505a0d4821cfa720b98c5c2ae0d548a40be68df4d6320400000000000000", -"service": "00000000000000000000ffffb9e453a0", -"pubKeyOperator": "029ea6507a40269fc508a126749236718d11cbf7b5436df67d7335b643f9f6a962d72ff3a7477b27b134639148ed6307", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "97156d5301c3c361a3686d0190b88dea2e17e2234b341bba6580d5c4befd681b", -"confirmedHash": "eb05fd67845ef3c5bbb37c2619b859a097cb9098a73def932100000000000000", -"service": "00000000000000000000ffffbc28cd0e", -"pubKeyOperator": "8b8953ea2ffcd2e552047e2f4470b52a163017f278fd24e8d79e6c80f98dfa4461b0bcb6b1614afa3cae601f55dd0377", -"votingAddress": "2VhEQzw1377YE8FWnYD8MYrbtQai", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "971ff15f424e2fc13dccec59ff918fa2aae1c1a9c45a4f5a58da38fd247813d7", -"confirmedHash": "ae06cc22cc46401855349ed291205288b41759c66e2eeae40d00000000000000", -"service": "00000000000000000000ffffd41865e4", -"pubKeyOperator": "0d11b4dd0dfc4317513ac6b84472955f5af61fd0b3e75948ded3cd79eb22bf64759f4c1965885828db6d37c1c290ed47", -"votingAddress": "4BrHwjeEQ6XuLkSo2KSK4tvkq22B", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9720da9e087811a8e497eb37b73a982ea05b4bfb6cddc24c60b7c96bf3bcfc1c", -"confirmedHash": "28e154b8717fc27938929763d0338a846c054409a54938c80e00000000000000", -"service": "00000000000000000000ffff2d9b7946", -"pubKeyOperator": "949cb9e8ba148f4df223b68f2112ed485be58d3b3e02eb73a90b0065b4b93279871b38abcefad53dd0f59f94645aed4d", -"votingAddress": "UdzK1fGg9xs6e9MkkHMS45VNqAL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9723be061bf39f495bffe942dc78777b0f1f916a873609410284efa7a3ab6ea5", -"confirmedHash": "7503016b8e21e9d101b40d6b75b846755c063b77e3107b970600000000000000", -"service": "00000000000000000000ffff05b5ca17", -"pubKeyOperator": "99986012419b3e1cc56e9da60609193ac4afddbe4223244afaf2099baa8c3df21e90a172471f98a2b56592b171cb32c5", -"votingAddress": "3z5fWWGhQp1tWgPEWCGdm3pzWEMP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9744797b712c0078fcfde3087f8f4c73a92777f5c8d2c96e21b130fa89206ae8", -"confirmedHash": "d198ce9334def440cf28458cd6bde8f2924eeca6388f52110700000000000000", -"service": "00000000000000000000ffff2d4d5c4d", -"pubKeyOperator": "0c9e8f7f160e7c001834daf5966431ced934782898ec2042395be576b667b12d99a5076d68d0de076a581efa35f06110", -"votingAddress": "A9wQXkP2ZxAeKmtkyd8jBxn8qbo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "975a81cf92a33467e5e3f91e9421f265d797bcacc719e69044c5ce661d6e22c8", -"confirmedHash": "6bbd38d1387140c4922190fa812e6520284ecb271799a3510100000000000000", -"service": "00000000000000000000ffff5fd8c838", -"pubKeyOperator": "0d6ff73a4466a4dc30f4e69b945b765a1c67e92d3cff6e30b0a08ec6acd16ab070fb1408eb70ba119902b83f89173d57", -"votingAddress": "49pAa7ESDtwrQQwUiC42DxWCXECj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "977b9d0990bed9a7acb5ba827a408e45d64178a45f53d209267c4cf1661a8183", -"confirmedHash": "ff88f26a9534b99472900f26a60359c8fbf55964bf36a4920e00000000000000", -"service": "00000000000000000000ffff58630b19", -"pubKeyOperator": "85faf5e05eea4db2c5bb75dec9bbce159ecb1dcc237fa8258cd082bed6b3ba1a62a178e22d1122a1355f1be6f8769ba4", -"votingAddress": "4U3hHqnXFQoUqBUPzv8XKog2G8od", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9789091a504052e310683be65c880ffff00cf6fd8a0ce27d4e165907de5fa1c4", -"confirmedHash": "5728ba9f116069a39373bfc02d429588c3bbe983212c94573000000000000000", -"service": "00000000000000000000ffff9f41ca25", -"pubKeyOperator": "99845ba07218cb70ad5779f7c70fd6bb5d1f807df3b772c4551b9a79c4b1ac39e3e46379fe2209cbc940f8e798314712", -"votingAddress": "2hknGqdyomwjT4dXaVschHAS9ptR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "978bd108d10c78a85366465e6e3ae8ddf4c8af93e41aa7e45fe07aa1a4c3e8c0", -"confirmedHash": "233fcaac404865f90cf8a1b15a81593f66333cd8eec11ecb0100000000000000", -"service": "00000000000000000000ffff2d21236b", -"pubKeyOperator": "966aa9dd1923ad4239c067711b3b57a0606bda397b8475e3e9870a5c8455eee5aae726c3e00919c923b2cc2bc3199250", -"votingAddress": "4EXA8q4tgZKsR5meoaCxMvB7TMPf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "978ed5fd71a5d275a7c7f0f1cc82dee009f7f218b9c2d49ed0cfb082d807bb8f", -"confirmedHash": "685398a98d3c34390a78b85b4682300bc07c0806c39f9b320e00000000000000", -"service": "00000000000000000000ffff55d1f116", -"pubKeyOperator": "0d010e41d82c46af766e55184354919f888ed9f768e2b098fd3fc5954265edc394976c01e1378ddc76970e3bca5982e8", -"votingAddress": "4RKtwmNjPBtCkujArGfYNUq2Wu7J", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "97a48fe36e0ff0b76ed750eb802fce1161cc80efc52f42ecd94637e9c43ecf62", -"confirmedHash": "5417cc5ed3c09f7d1a6e655710463fd89fb20985d01309102800000000000000", -"service": "00000000000000000000ffff8f6ebb10", -"pubKeyOperator": "126ebc95427c7d9c3fe24cc98528dd15aa60c175ed6184cc0fdb2290bba23dd64b18002fc54cb27d53f59aad911d2e98", -"votingAddress": "YCAWDhthtyegTwAxT6DdmTdyct8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "97b45690ab1643cf585f32eb913404729a1a770fabd064ad76f09f9ee282b2ad", -"confirmedHash": "3a13df80bd92adcc443ec417ae856d82446b8aa7796ba2722d00000000000000", -"service": "00000000000000000000ffffb009d206", -"pubKeyOperator": "10e4d6931b757e4363852dfed588374c4436df06a5c6f91bdafa3ac805adf8ca0ccb1b53ed24ae652273562b9f48911d", -"votingAddress": "2UDLRxcAHDrsn71pHocirdRMZWdn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "97bc63c5253a037d1f890b6537d36c1c12e4bf1ba0f136567a9fc5f103f6cd29", -"confirmedHash": "35c9dd1b52f962350d63689c7e2f43bd9acb55861d0c6f941100000000000000", -"service": "00000000000000000000ffff8ba2845e", -"pubKeyOperator": "8ded9b3f13536dff84151aa775762b893f74c6105094725493b9b668dce2e6f2bff3344578755f8e4685292d9378c312", -"votingAddress": "3FjHUehbJzZfVTiDHUHigoa6nEfT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "97be420c22cb232a116e3fd0fb3df354bdd69af8326ab768127a2fc4fabc55cb", -"confirmedHash": "1a918a975e01b329d29557486a4342fc40967b10b21e71b50800000000000000", -"service": "00000000000000000000ffff2e04d9ee", -"pubKeyOperator": "0119a1e146de74493c5584f6ca9fba59e094a86ab0973034f4279c79f0a2813555049ad74e6319995d5d4c9d1542d35c", -"votingAddress": "24BtvMU7WPCpUNxT6vTXNQzZJA4U", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "97c88160e127ae2158fa67f6ebd155f5b9014a8f859290e269bab4bb29b9a725", -"confirmedHash": "e185a107f5402e23f6f9a62e294308e623a4f183ed4b25221700000000000000", -"service": "00000000000000000000ffff5bfaf9ae", -"pubKeyOperator": "0dfabb12376408e5f0eb7ef6b00e1b7e79cd37424e8c94ec9528d71fe7af3140e02a598ce95dbcb8ebc97b51f393226a", -"votingAddress": "234sAYGktM88SLDJSVBuMKGU34io", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "97ea65bb19384fc00f9f7955456153da0d18a65947747ff4b0cbc8dd9fe669d1", -"confirmedHash": "940b37038967c460d991890c6a11903d87231fb714ade2073500000000000000", -"service": "00000000000000000000ffffbc28b6c0", -"pubKeyOperator": "0451e9a20d07707519322559cd12dd32a1c94180b53eec0d3bdb27e87405b2d26c0fc4f1abcd5502087d6a0dd1ee13bd", -"votingAddress": "JjYUHLANHJpaAJRPuPdhijSjooR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "97eaec5b64c93771df4dca4229ffada5ebf57606132646786fc4130722da34de", -"confirmedHash": "60b29b478b0489c174bdd8b4ff5d6193154b8cedebac4ab80300000000000000", -"service": "00000000000000000000ffff55d1f137", -"pubKeyOperator": "87556b5813c45771f48424642b0f9e3af894d9ddb7f1d8b8b78f1345a4004e75caf796f63e6a9543f0426c05931859a8", -"votingAddress": "2zHfPVKk3Pe3Z2YQ1VTCXZZbYFet", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "980b84a92b3040f09da8c367f6043cd8d837a089eb9a8b97bd1e0ad98d568bf3", -"confirmedHash": "a1e3df211d2c222ffdbb57c832f9aba4da95ef4a8d4580de3600000000000000", -"service": "00000000000000000000ffff5fb39673", -"pubKeyOperator": "92420af924128bb343d7ec9e8e0eb1840af2004b89e6c00cc00a78c6beebe134b441f0a2617d8595e6ca58ca73dbd397", -"votingAddress": "KY1penZG3VDSZtSFWxzu23XvUUp", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "980bdfefa7e249677cc9a9defda7d2120f4da50a7d3d13b5d79a89da56ac0c32", -"confirmedHash": "29ced6e37b3d18639a203801e9a0cb5b4d0255de544a779b3800000000000000", -"service": "00000000000000000000ffff55d1f158", -"pubKeyOperator": "97c5699299c39b29e4a3b8c3791b7f263cc540fe2930df4f666bd5ecb2c54e5833b9a579dffc3c1b4a81e5b25caab66b", -"votingAddress": "3SyoHshXaVmf1ybMnLKkjWhJv651", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9827295d7cc70b61cb2de5cdbd345eec302d8585c6cac6c10ce14f80f56793cf", -"confirmedHash": "2839919c8bfcd2ef4a2fcb6328e1e5899d6850b4f1c960df1600000000000000", -"service": "00000000000000000000ffff40e37f74", -"pubKeyOperator": "8886fb72e56112680ebd62f61b0e5b01a2532ad6026f5850460c13ffd94bafc26f1d2fd621650fedd3f197c4eaeb5675", -"votingAddress": "uKwrveAtT3AqpHRoqdGC1EwNXxA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9836111bb72e75207d810c5fcb3b6a7560ff5d6cfefe922e787989fa0638cae9", -"confirmedHash": "c3e117f56322bfbc9b015adb0901db11cf9aeab2ea7dc7a41100000000000000", -"service": "00000000000000000000ffffb23e158f", -"pubKeyOperator": "0808b0de7e28b525d34b5a28a2c995a93c616b118c5d05b5f8dc2b312d9e0cbec5e08a4ddff6e5fdf8877ef58d4a5d3e", -"votingAddress": "3299ixQFz1GRMFBQNCZte14QGLis", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "983e978391aee3e6c207f5a45f338f6acb7c1b873af5a9b7c50bef64311ad7a1", -"confirmedHash": "4066173b3bdf7669a8a01995d3c1b85ee08147b916062aff1300000000000000", -"service": "00000000000000000000ffff2d4f3861", -"pubKeyOperator": "10e1d8b5df46a6d4347f273952368039d5981d12099c10420d87e79bd1304f55952dcd0abd88981caa4abf25788ea25e", -"votingAddress": "h13bFeXcvkipc3tDhXdLcJjsG8B", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9859b2c077c31cc7dac0ae95c72ea71ba05d52e3dd049ff8a4247d2b45d11c7b", -"confirmedHash": "562d29d7abeaa6f6649e7c9d60b4d31bbb684e08c26560912e00000000000000", -"service": "00000000000000000000ffff52d31950", -"pubKeyOperator": "1105bd78d0b25be7e9cd5a84e215f9dfd7e8d93202c2f7a5185e02955ae839fb197739c495e6332dec48e5de3382cd8c", -"votingAddress": "4Y9Rmuf4WUTzC54pMXemi4egoN2x", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "986fb41129f1ba8d76fcbafd1f9b4eb472a1b199184a3f1b8b75faed7bbbc8fb", -"confirmedHash": "f8cf813c9973b6ef05eb5782f7edc07440266677470ce5451300000000000000", -"service": "00000000000000000000ffff52d31507", -"pubKeyOperator": "156ddf23707994509b9a544e503d396440b8a7f45749bf8d2d02ced744b2a47f188844d284ba1a15cc18372bb564e314", -"votingAddress": "kyMyjuzTVSxYrXASH3v4Lkvmk1M", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "989c54acab2c9b212ae13e35f7556faf69b7b9ee65d5e5c62c4fc0fc8b2403f8", -"confirmedHash": "140755755e345fa96a67a6b0ff4446c01b665529fe77657f1e00000000000000", -"service": "00000000000000000000ffffa516ed13", -"pubKeyOperator": "8799297b722648d3c661019f00ccfb30ff9aa83dd6f0de703acc03296a0682252c1a99f0b3ca56abf812dc4e52e57bcc", -"votingAddress": "3AiCpv2o1xPsmzBhpxfNjwHzaWGr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "98a084da273cd773060971f04a86c104505b2deb4f4cb939c010941b57692071", -"confirmedHash": "437fe12c7a81236f7d123290f0d3886037d3ce90baf5e4961600000000000000", -"service": "00000000000000000000ffff5fd85420", -"pubKeyOperator": "09d6153afb8a0b3049cd247914a7132dcd8b1cb48aaaf9f84e0dacb2d65927ee38a167d088bf15de91c7ea59b3663745", -"votingAddress": "3vX1y8zKpxz63JGQYTPgmDdMZsZ3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "98a746174870207b5744158be367eebb277bcb6ebcd0eb7db3cd97e739a0d8ce", -"confirmedHash": "118750a5ac82aecc299c4023e8a12b3a9a73e21575f901093600000000000000", -"service": "00000000000000000000ffff68eebab0", -"pubKeyOperator": "14b2c4ff9fc14c8f724f5c16755f5cc612ba06bb4a83473eb1de7656adb011b3e373c02bca9cd4c1f990c53992042510", -"votingAddress": "o1AT9SFsQSuAx5KQqgH7oZiU3uD", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "98b5a94c23a506f1c2b74b6c2c01ac6c4cbb03e44f1cf4ef3cb82b360dedf1dc", -"confirmedHash": "bef2d06a3dc30e9a0b480078ac0b1cabe70e7fb1594d84410b00000000000000", -"service": "00000000000000000000ffffb9b13b25", -"pubKeyOperator": "859d3eefb432a6dde5855501752d778981a92de08b6a0882581251eec62111dbf950594404bd873b6c53ba7377af87c9", -"votingAddress": "22M9RHJfcKjGAAYtBd3mVuv2JMSB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "98ba2a03ddaa8e6ae57e9848c85b9d136622bf7b5c015441d208b28a5763e683", -"confirmedHash": "b07655ffe1c7e3e32f0de6f24a6ec2bef8751a0fbb92f97e0900000000000000", -"service": "00000000000000000000ffffa516e929", -"pubKeyOperator": "9382f2408fb93272b89aaf7b9f6de6a0a0cd998c4d52be8477916c6b0218bb2966044d71df52c9fb5104fbfa33a4b4d9", -"votingAddress": "tZqSsLSYkZUdDRCjGkg2STsapzZ", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "98c7f9c4fdf48af2f42800f477c5ae2d7fae8e3340e3a4eaabf9862d2b42a23e", -"confirmedHash": "a885767b56b47e7ef45149385e625395a5b59240622b78f93800000000000000", -"service": "00000000000000000000ffff8ac5804d", -"pubKeyOperator": "96f63f2ab3c0ea487282e37b7a31ad46b047566932d7d920a981d738616518ecc63d81bbed100f49642eb7a3f7bf6342", -"votingAddress": "4DPamtpgYk86HnwW8t8qbzyThoNa", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "98c84e663bd5371c615e6a008f335a38c400bb7cb3bedd5a88b43a61ae5f021a", -"confirmedHash": "562d29d7abeaa6f6649e7c9d60b4d31bbb684e08c26560912e00000000000000", -"service": "00000000000000000000ffff52d31999", -"pubKeyOperator": "893da39563a94759c7acfc7b02d0f4c16c9bdb503c10888550360c54e54d72cdd531a9be6a4161b128d7ba641bf3c165", -"votingAddress": "47cP53MkzTWp1Hf84pKCkmQcqT8e", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "98cb04171e8e0eea1c539e4f6ee0f0ac21b64c3b9819f068dc35e6c818730fe1", -"confirmedHash": "6106bb7d2ecc3112486c419fc7d12c0a6bdbc931c8bd21390700000000000000", -"service": "00000000000000000000ffff2e04d9eb", -"pubKeyOperator": "83c1bb7356aff376449f398b86799ff4bbd6a987b9484a5848bcd229fe78987daf7b8fbc0d2b51ab4499f9b7c116f045", -"votingAddress": "2Ae34giTkQ16zrEM2Y3z56VqRgdV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "98d0b285a6b825800e5f644f2bf88a4039707674a9ecd445052858cfb5706985", -"confirmedHash": "e82f064de1984c7d8212e63ba8f5e6f5414a1607f371ceb91f00000000000000", -"service": "00000000000000000000ffff22c1da21", -"pubKeyOperator": "913e80cf4caf776787c0e5c12f171dbddcc8cb8c501f472b205ee096e47a9434a1d5e832fae02f8d0249fc8ee40e488c", -"votingAddress": "2mHvoP4cTA5y7eg6hdZqbTQ68sZU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "98d9bd6b3d54eff2a7d0cf1475d5baa80618d23230c99d23c36178672ce2ebbb", -"confirmedHash": "bd31f35c5cedbf07c6ffa716f2a3acf8f725ab42af8758740500000000000000", -"service": "00000000000000000000ffffc034a648", -"pubKeyOperator": "0092d65510e47eaf0103b7f110c43fc2f39c53228269e2b4418be107be39edaaeb6c47fe2416b8a10a5683b657296e94", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "98db1ef6cf096a40f05b52de5039a0ef04ce1dba5b50121c709d059fd1967d12", -"confirmedHash": "1b211235c3a6f158daf32dda315733ccf7505374eb82c1b31200000000000000", -"service": "00000000000000000000ffff52d31542", -"pubKeyOperator": "816347185cd3b450676ea00a006c2703491f679bee6936a3a92300e3dbb078d48c4d6cb9a7fc7b5028bec7d9a1afa2f1", -"votingAddress": "2dE8X8Ucez87U7HxLuBBxSZ4nt6w", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "98dca3a7b88299ee74c5014655181b4b3dc78f33e68c040c33671cfb5d5f51cc", -"confirmedHash": "1b0487eab9c68004a97b77f45f0cf30aec0374979adab5af0300000000000000", -"service": "00000000000000000000ffffbc28fbce", -"pubKeyOperator": "17798cdf754c24c7605528730dbd4b438f4726269d95512224a43d01a715e64373b7acd177608c0cf4dde36239d02c23", -"votingAddress": "LSFUvMFXvh4ca3RL7ePeUVxFSQY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "98e263fdff245ea15af4e55ad6a1eea1c731192143c37b8b98962cdf5677fb49", -"confirmedHash": "6b0b7096147be77aeb538b83ca7bfedea24969c7bbe80a271400000000000000", -"service": "00000000000000000000ffff52d315f4", -"pubKeyOperator": "0cf8c54eccd8568d4d04663628d3d4f177a4e80559758af495c085c6c8c3c8440654d3c1458f4390ef0128d042581c3d", -"votingAddress": "2HXyZmdxZFvWKgo7kCNCyfqyjf5p", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "98f052749af3f321fcae92bd0ed9848a58f0e991a5873b493686ae2876ee4b38", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff84919fb1", -"pubKeyOperator": "020e6b2691b4eaf0f47e5120b761a4eb4315011a2de12c1048da979ea15f84a8598fd94ea9551c44d4e63160764b9b25", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "98fada9bef7e8367fde0e62e1e6414b582ddc5d0b89f24d248ba42b514ecf55e", -"confirmedHash": "1ad85701c3e4b66899cf9614d77e7642af8f8b9a2b6e819c0200000000000000", -"service": "00000000000000000000ffff55d1f1b7", -"pubKeyOperator": "15554d956346f2ed5a908e167476c91e0fabdc5a61a910cbeb1652fb64c2acada628aca292e03992304cb37f2e17a8c0", -"votingAddress": "3ew1o3pLsquoA7JUwnvfhrJRRsny", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "98fd3d5a8db072827c8d23274e78b7384fd429dcc0fd8d971ceddb4546f1fe62", -"confirmedHash": "6ba5141ef7fa05e1ba188c0d80182c6390deeac528f447411000000000000000", -"service": "00000000000000000000ffff3456962e", -"pubKeyOperator": "1902d4fdab22cbacb6c840f84c66c522a0e261da7772ea0e600069ff976f0083fd2f9cf3f942fdc885f82275f21423e9", -"votingAddress": "2SFWWWLwGnLfvVqgocMmCzBRg2L9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "99046c0812aba87d3d2d735bb8899d9b84eba7184a40ff6e4389e8872f07bf4c", -"confirmedHash": "9a1d301a18559dc1aa20644fa3b6273224ce13f37e3b92b14400000000000000", -"service": "00000000000000000000ffff342cf905", -"pubKeyOperator": "9129febc527355775f0b4ffb985fc81b0d2c0067d65f3447ca2d66c760abd4ca614c33201f9c320c6b0bbc975c06ca1e", -"votingAddress": "3DnH3m5pVV7aJNp7bvL7Bm5dvjtn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9909d2643614308efcf9841617f06f4a51aa10390e8f664ed9834b6c57b78ac9", -"confirmedHash": "5ef20d351f40cb2164cf7e7fed56aa9a56d6c5fc723ecdf71c00000000000000", -"service": "00000000000000000000ffff68f85be7", -"pubKeyOperator": "97010e4419c38d06ff811a439406a4a01359442da308db2ef00c9f3d708e15bd37af5c6cba28ea0932f04006944e0954", -"votingAddress": "4EnAU8KbsyUM1cjARp3XJyHWkYYp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "99181b90953b1017a4a186f97e8de36185c77e38825ce5ad5f4e9924c8b0c2c7", -"confirmedHash": "c719c39a576e1720471f4cec3f0f5deeb1d13c9c3d636f871000000000000000", -"service": "00000000000000000000ffffa8775309", -"pubKeyOperator": "11d66319a4dc5138f44d665d0e9dde063896a0968e45df99617aed2b49684c9489247e06b32f4c141b67e3fb03d498d8", -"votingAddress": "2FKizkbFLgj1JFKv2o6GBxJAJHCk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9921ce50a9209a2e5318e281bc4bbe315247a89445f5f3605308a4b6988c67bb", -"confirmedHash": "c04fe1e4ba1779334f014e2c2e988aca2147fa7b30176cdd0b00000000000000", -"service": "00000000000000000000ffff9f410207", -"pubKeyOperator": "944eaf6d0e477f99e6c02149bd980859e6384f662272dd371018c5a46c7b9aa8f5956ffafe3461b9adac4b917c949b19", -"votingAddress": "3McSDeELW1Xtijixkdm7AUjSmNA8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "99367c384b91625d68da8816a5f818ca7e87a2dc38ce3eb82574d0af81f11f97", -"confirmedHash": "f829d4e82261d098b40a67fcab1d043025abb79233795e221100000000000000", -"service": "00000000000000000000ffff03ee6fa7", -"pubKeyOperator": "035b113ecb41758150c06c8fc43ee890d93aa3496e01681b870cd73bee6b99bd17a3708d9e09cbc0f73bd77dd89563c3", -"votingAddress": "3MuaU5pXaicvy23pVN7JaUn6HaUW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "993ea1af214cfea4b28a7d0e9601854a23a9b539b460995d770e688e2e79af58", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b083", -"pubKeyOperator": "0bb9d078338dd7bc80eda98075aa794ff359c04757baa419ba42aeee0f18df4be10bd7600f81ee0aa9d2b53ee68dc602", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "994bc909eb5211c8c344fc66cc4d8433e9dc075768b6fd2515b5781cbcf05311", -"confirmedHash": "5ae7191732b01d7f85ec0a9305c62204d359511d833b3bad1100000000000000", -"service": "00000000000000000000ffff05bd9150", -"pubKeyOperator": "1539a0e3d7d5c9ad1e654361bc86579221b6b54fb524565333ce8d0f4ad6760b57ad552762dfc5da6285aee79c3b37dd", -"votingAddress": "3aKpkyXaow1xeyZhYEdnns9jt4ej", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "996cdfd3461dabe6cc28c90e6637a04f0377b5e5558a12168875adb36f9c01e8", -"confirmedHash": "8168b3ad5d59fd1fda68340a2cbaf9d24f6a8cfc01997b5e0400000000000000", -"service": "00000000000000000000ffff2d207c80", -"pubKeyOperator": "815e9ff86d1b057931b695a7950daaf1859b7f20a2330be8d41be0819e45f213df07c71fe3aa0b18e44fa2c907300ada", -"votingAddress": "2u5i47puSZnzUp4hFg83UqQNfQge", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "996db7e60b71a512d6ca611171e9cbfa6ab5c40f2ed5560030e53aadf35333d7", -"confirmedHash": "1ececfe5422c21527254f2a95716eeb248a31f3f14d87e6e0100000000000000", -"service": "00000000000000000000ffffa747e95c", -"pubKeyOperator": "8fa4fac376405404d3e673d2770d6829b87c5fea976a6d40d9e03bce9d6c4bedba3ebf4bf9e719c3cc46bd378e2bfb06", -"votingAddress": "3z6cptfm65vGqW7mYj8w8DoQow4b", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "996defe8a91fb3db6840066c1fb98e9ab4c083a784f936e4a5b0738fc3614091", -"confirmedHash": "da4d6d71bb3783f1045deb428ce96eb9854768af5b630abf1300000000000000", -"service": "00000000000000000000ffff330f4ce0", -"pubKeyOperator": "824b3da399a3f6ae25869a13e26e776d761fc26a9567534c07031bc0e7ebb5473f26a25f9a2b3d72360d9d9b83d8c76b", -"votingAddress": "3Vv6bRBVYWKXnBZnzMsU7mUqAemD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "99733f08b579bff0cd777c53a25333e370deb0edba0d19bb34d01ea7ad1426e7", -"confirmedHash": "538ee80ad9ffa7f7a024d24a593ae7c8a434cfa9394b14ef0800000000000000", -"service": "00000000000000000000ffffc11f1b04", -"pubKeyOperator": "16d9127c9802fa2cb736438b9d30732f2995e131c34854ad0ec216a8742bc3ed6b83703ac39ada93fd72dfe5e801738d", -"votingAddress": "oi9uThaTo62ifKSuejPTW64KuMs", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9978d45fe107d57e935b3387b4f27f19fd6b315eca6789236244fe2c6a16290f", -"confirmedHash": "562d29d7abeaa6f6649e7c9d60b4d31bbb684e08c26560912e00000000000000", -"service": "00000000000000000000ffff52d3192a", -"pubKeyOperator": "064cd7b508ad623a51d79c8557a667499383e8d723ec79792d08bfce5fb96a6a898f502b74ab79761fed79c652c081d9", -"votingAddress": "3AZQwshMabqZP1UJbBDs2yEgX1xb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9997e6a4c9c38fb1962a91bee132cb83a6f063d6b31b8682ca4784f36cd4a0e0", -"confirmedHash": "00960cca1bd93bdfe38eefd8f7c17d3856f416e84a85b5c63500000000000000", -"service": "00000000000000000000ffff58630b1a", -"pubKeyOperator": "8bd7376e671d5084f86067ae219f7c6408bd3f021c7915823ae5159685acca255d837c9d7d303fa42462afa0be3a7076", -"votingAddress": "4Tt5Vfwvgn8d36XedHRf8sQVfK6s", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "99a4e4aa0859148777c4e6852d47f9b06e2506b8d59b6eabdf8f329f0e4c7940", -"confirmedHash": "9129c82a932fff630ff46a80cf992a6097a450221aecf4720100000000000000", -"service": "00000000000000000000ffff95f8344b", -"pubKeyOperator": "8469de272c7201e91ba31cb7f1f057b925c6b157bf6d95b36eb0910d2bc6cf6c9c5845bf20664fac1d660b714f47f52c", -"votingAddress": "3qDVkTvP6H6u6tzw8yFqmrm6b4DW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "99aab0611cc5286b8ee6f141949b1407942a5446093a6542d177b699fc82a239", -"confirmedHash": "a1e6a81c221aed68d0e640d6581eb47941aef0a4afbbaca63100000000000000", -"service": "00000000000000000000ffff52d3197c", -"pubKeyOperator": "83a8e612ccd3c4cf7554ba4c9e5090c9a15a4ff70b9a8cc742745891071e30904b171f59ee473fc1104483229453c659", -"votingAddress": "3GYSL1fSYKSbm4VTjxKbjCv12p4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "99e5c94a224e16bd2c219178d007f7e3a1fdbe0b1d2366e47a9c16ddfcd5b0b4", -"confirmedHash": "babe79b1dedecfeee33868f2cdc4fdea04e9a241dab1a1520900000000000000", -"service": "00000000000000000000ffff55d1f17f", -"pubKeyOperator": "919d5511a6bdf776dc7d6345f5259f167a44e53564f53552789062fb04125ffb606334b9e6cd4ee59a3b9f71756e72ac", -"votingAddress": "31JrLjvHtJaM1YU2aCHPifnYWuxu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "99e75b5594213232376e35d9d7f636fc4e2ed66b197f2618501f785d1e1767de", -"confirmedHash": "ed45409b57075051199357ef15848bd098aaf6aecabb68d90d00000000000000", -"service": "00000000000000000000ffff9de6fed7", -"pubKeyOperator": "0c00e62866ee89a0484b5cb405c94396e564abd1d17658418251e765dad9a6771e882cbcdfd80d1a10f1085ef11a9c24", -"votingAddress": "2CsHdgscdLvT944d7unSp7hDAxNW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "99ed4697b9cce928a66d153ce095156bc75d168c11361908b4bc35dabdca9e36", -"confirmedHash": "4113cfb08ade9f1b5d935bf2d7223e28d8191bb01a7808d80400000000000000", -"service": "00000000000000000000ffff88f31ddc", -"pubKeyOperator": "892bda25e986cfdce112814bff6bb7f01b5bba267f503902d006ed0c30c4c27b782bf3cdfdb761514fba52129e45f76f", -"votingAddress": "3M76XkziJyksS5WwKLmSq7j2KKAh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "99f25b604292885445e11a43e988a510f03d87e236941f7e03c8fffd70e164a1", -"confirmedHash": "6b0b7096147be77aeb538b83ca7bfedea24969c7bbe80a271400000000000000", -"service": "00000000000000000000ffff52d31518", -"pubKeyOperator": "98a9d9bf82b6dcb5afb63b863fc45c91065d0354297fe25060ce827e9f0d1af25eccb91cf15318f425cb5da27aab2f9f", -"votingAddress": "32An547NTThdZDPZb1AgGuMHoQ45", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "99f68c4812aaf77711910e37d62553bfa112c01c887c8c32f398db12be6f36cb", -"confirmedHash": "fd59ceb4bbdee628c0f43c2496066cc96ba32bd5a1bc8ff50d00000000000000", -"service": "00000000000000000000ffff6bbf65d4", -"pubKeyOperator": "80c6c570b01b56b81345d397c2291a3f5822e3496c9464be05c91aae55f1ac769f68849b25fd1a86530dc084c9be2f31", -"votingAddress": "3VFQU3bcaE3Lk1RogHYKAHpf9Dm9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "99f9bf4c6f3a69a3b17f5ffa4c55acc5c1c31bc2ee93dd5c8700b775d61a1a32", -"confirmedHash": "2167e261f494a72423754c17a99ea24b633831c049be2de90a00000000000000", -"service": "00000000000000000000ffffd4186b6a", -"pubKeyOperator": "8db3056b5db9406d4762ceaefe9b06ab4a6a1bec369e60afdcc07545341a0f9f0c52ff6a7e0cee6397def0afc8140f52", -"votingAddress": "49iit1urqoCFfx4oowoRyyHsCGuA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9a3b5dfcf7a699e05bbe0f875361cb24b8598b9124d0da8d6274687bdf05d69f", -"confirmedHash": "987a268e6c37eed17d3a3a43cf4e0a49bc7680d2410aec320800000000000000", -"service": "00000000000000000000ffff55d1f264", -"pubKeyOperator": "08a9693b3a9a6186a7632749c6d33867a8a5a586f205565f5f8f2be8867331736d5a37de1f3b397ff1ca6abdfff79b73", -"votingAddress": "qyu2pPc7ejGvMQyN7TFEsf6Qzja", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9a44b8dc65a4ecd27eee3bee0746eb0bea0559e6e014354aab1acb553a7f1cec", -"confirmedHash": "244ec6b2b9bc7645bccc79e83704e5c5f3a241947e3d12f11000000000000000", -"service": "00000000000000000000ffffbc28e70d", -"pubKeyOperator": "0a5979049a6c484f931bbdf2dde0a051223d8294c68d4d7323ad09a852a01b40621302381dd3c9d2604ef35733a5456d", -"votingAddress": "4BXsacCrKWuw4efs4i4i6NjGLAm6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9a4737e245962a4de0c3488f074cc4cbf124aa42468bc01d3dd232a57396e592", -"confirmedHash": "4626cbcf5a7250b0b20712ecb2779bcd1f5937592332eb880a00000000000000", -"service": "00000000000000000000ffff8bb487c7", -"pubKeyOperator": "86bef125318c66841b96feced92d4e911af82af4e0cc52973d7a6b3950f3cfa1e3af32741864397c95e6576a37f7613c", -"votingAddress": "3Cq8LhoFcb2SwFLSE2aedv6kYbam", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9a532f48c9d02dd3397902aee664480930ef79c801d0358327f9510202c8e1bb", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0b6", -"pubKeyOperator": "0156868acf3238a0a109e3bad8c427e8d442fffabb18fdafa629458255b5b3a9546c7ed1e2e78e0bc7112774f514d785", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9a626410f5d25b52ff599d0e0a9abb38f0c73cc01522bc8feee72c210a04bad3", -"confirmedHash": "55e091faf587d8cc457c5d91d1b8a7e4b1890c2c3ae9bddd0300000000000000", -"service": "00000000000000000000ffff7bc140a6", -"pubKeyOperator": "088dbb700890ba2af40bae1d4e8d174616ca7228bb18dcb969c7bd0ef13e93a18a4dd82bbdeb6251edc6be28c7f4db3f", -"votingAddress": "43gPW4AYmgz2jrzrTKxUZqpaCg6C", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9a65e13d157edd8b4c0c1a973a5b0a40c2534d2c04b85dbd91a0ba8718595d60", -"confirmedHash": "601e6145d82c195fc7662679985dc885fabd2375357b0bca3000000000000000", -"service": "00000000000000000000ffff34ce8e82", -"pubKeyOperator": "0aa401c833e3edf504dc338f67cec1cc0d94eb5d5a0d6b1b8d1e989a63638cbb77415637ecdc9d3bbf0335907c485d55", -"votingAddress": "UA1UgZyt8RV1v6LcDTk6EkToeff", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9a848fe981db0636deb03a36dd52ff67ee5583385585ae0b942eafbebdcbac87", -"confirmedHash": "27fc852b5b77a10d8ba78603119d7e491d4c11c74b9d4ee80000000000000000", -"service": "00000000000000000000ffff2d4d2cc8", -"pubKeyOperator": "8eb054fb7e6f261e1e8d0f3637767bf89295998e088f0f6580d7596b4a4ef098a0d679aeb781889219c3701e38b504a8", -"votingAddress": "2rFYaFnJrsn9vXqir1TbL6k9VLSr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9a86fc300cda8c2ad196e9f6889d1dafe254a2c596a6bbede71930cb4602ab58", -"confirmedHash": "bf44d48543a9033b017a8badb7651cec9889b7eb4833546c2600000000000000", -"service": "00000000000000000000ffffa5164144", -"pubKeyOperator": "980851dab0ec93f06bf3bab4c265da57624d22d2035f5f2aed317af367471b6b1adab594d4fd63c171d2d02e748c9930", -"votingAddress": "Ry7jioL94jZyZXhcPSVoDLDXtJ8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9a87ab75f4964c65e0c54eefa4f03c1e9005061a7bd1ae020ecf9732c8f23674", -"confirmedHash": "c2ba243ad64bf9658a364cf315e960dd277924388c3bed3a1f00000000000000", -"service": "00000000000000000000ffffb23e8107", -"pubKeyOperator": "1723a4af1180517b7b2a96a182ed3d1f19e1426ea84cfc1b42ddf4565312b5c597e5abe6910eb1723072329a091a0fab", -"votingAddress": "2tQV4cdr2oE8kHqSkR7ziTak15qA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9aa5ec5080443a6b04a9748150e6d54180dd65b773f847dfba9e0240214b1a95", -"confirmedHash": "5f680c2bebccc7b722364e7e41377601c39874e2b4a7b2961800000000000000", -"service": "00000000000000000000ffffb0df8b46", -"pubKeyOperator": "8391bbb4eb6903654ef2c6d2774cc0d9f665e12e9ae0c2775aae7acf782b34a27dc5482a415706b7dc80820b671052be", -"votingAddress": "m5HtSDWqFJnv2S3mnF4Yc6hzmmK", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9aab8c4142f378a859fd73dde6ab2f0c6833ffe4d7b8082238558a5326f0587e", -"confirmedHash": "50c086eb87b5ee45c3268119a698348b93487956525cf41e0400000000000000", -"service": "00000000000000000000ffff80c7f611", -"pubKeyOperator": "18589cef9a55b6461a03eae573870c8ba8fc34985a2adca79ab19f068035b56d9ec970b128e14abe80f2c61bf5e20491", -"votingAddress": "4nap9E1JSFiMXLkdhUPAqCdePid", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "9ae0f826e32f593de9b3ff2b8de9a1a264e69756fcdcd698d4e64640ae7866a4", -"confirmedHash": "9df376d216b7146f91715b110da64623e2841dffee92427e1600000000000000", -"service": "00000000000000000000ffffb23febc0", -"pubKeyOperator": "86a43c13aeb07f359bdd56a7a6eac540b1d6daf022f6a1695f35dd44a1e19fdfb6756cb8be59700198bf095cf919172f", -"votingAddress": "32wZsgipyXcmye3gyrd7THDPMBns", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9b0949dee7d584c00e1acb009053e3658d46b3a50c12aa0dccb4e611352378c8", -"confirmedHash": "db6e24accfb09c81ac4539d366f24cc3b163af5701dea2a50c00000000000000", -"service": "00000000000000000000ffffa877530a", -"pubKeyOperator": "119a646d120b5a5131f9beceb30ddb22ea126ccbc2c97b3d3e654a442b25de51cbf50039e82031d0ea6cc2e570b6bbb6", -"votingAddress": "FtVv2NBJ4gUeaRCnnnu7iQwRSHR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9b17917dbd88b33f9ece3f72b5eb93218efb763aecf29949051af94694103f23", -"confirmedHash": "ec3ec1b529d1bd9a950a1f1669ae8e2df3ce6d3d3fa75e4a0700000000000000", -"service": "00000000000000000000ffff59280a20", -"pubKeyOperator": "1115e417c76b0e5b3ca6511162883621699e04fb1a4543ff07f1669cc8fa2eec0f684e7edc825f684da67d7725e41071", -"votingAddress": "3pFukcDJdDyqSDLsYPjKaEGHG5E7", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9b2020d4cdda41073383d6a9b0ca0c8792eb077e7285c40a546330d98926d82b", -"confirmedHash": "8716cfa9d169394eeae5a2a3371200078a609d8c90a2e0020800000000000000", -"service": "00000000000000000000ffff17587b78", -"pubKeyOperator": "118780088aa190ec6b383cb622c35b06a7538134e3d3f7b7afba3702c81a399b41d2e95a82c743ad583e42f32408d1dc", -"votingAddress": "evcHpYJJfSe6PUbgxdPJBqFRXov", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9b425b58404fba41d0a3db0b72fbf758bee60a979867b6ca31fa0baa7c014bd0", -"confirmedHash": "db73240a45b9a9b1453d810559a5835c46da0a193f7857c90400000000000000", -"service": "00000000000000000000ffff0351118a", -"pubKeyOperator": "18a4067bf12b74a1bba8c79d36c558df418a24edf087911e84abd161df1b5e759fd921bf4498f7853aa6dac1ad9b3703", -"votingAddress": "2NFqmkhKv6v9KwRJkmDqLnNJJHx7", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9b43826a88b845deb8e62c782c1bbb67879e8b14996b88c2e0a9c87a32480032", -"confirmedHash": "a5f91008437c87074bfa7f208f35eacacc60446d62500f221500000000000000", -"service": "00000000000000000000ffff05bdfd92", -"pubKeyOperator": "99f583fb7247f769418d81740e8e79ad7e175f5eccdd889d6df375fd76b7c6cd772ded9c1510fc85fa84f60ac5b4787b", -"votingAddress": "2bQwwvw7Dhe43NzuYc7f2JQEQ4wS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9b4e5f3045055dc43173ced9aaa81a8436f1918820a12cf4e20e638d8ed57c0b", -"confirmedHash": "d4e390c62128e89f492a9bff3a44321903de7ea51efdcee21c00000000000000", -"service": "00000000000000000000ffff1fb20432", -"pubKeyOperator": "87d729dc929df0a8b67db31ed01108c0be9b3f8371ebe1f742f54af0065802b55fc52b4e3e2c0e4d447cee0c205b6d94", -"votingAddress": "7tGXkuGEwKZvfAJSMyPaogVJoXE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9b69baf056618b305903354eea7fbf488cd6348c37f73c32225c5f31a9381883", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d586b1", -"pubKeyOperator": "050e809e276d9e24b72e06ecca26a9de5fc47663c851b819a3bc64a21323e8f806c5859bf14477747a4b0474379fc5ee", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9b717731712991492358523921e8c42eb13c0b70c727d30a2518214f29a667b6", -"confirmedHash": "16e2e22744c91f027f70373a14a6c3fde18c58fe34c3de301300000000000000", -"service": "00000000000000000000ffffd1fafbeb", -"pubKeyOperator": "817f9d639052dcfff63fb3b6d74da3a1fc9197ef920fe751e6ce4f363ecedc529c425eb9c6b0ffae3aed473f62f23e1b", -"votingAddress": "2uVo4mk5VLi2MGZsFauN5WyKYpQ", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "9b819114fdc496ed983a75a0da77305e9e3d9d22e69ae242048dbec4ef3e1e57", -"confirmedHash": "ee56a186b7e39ada68a7160f36070fc4ddce38125177441f0500000000000000", -"service": "00000000000000000000ffffbc28e709", -"pubKeyOperator": "97e803ec1bdb4a8e9d6212ee41cb3c940afd5f9c89b3c6605a16318605dc73069f159f623535bda75c38e024fa582013", -"votingAddress": "apQkhWkJk2H4JdNfRGXkDJGeY15", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9b8228005822b537af1f462b33bc939bee679e817c5e79425300af6a1ab1f66e", -"confirmedHash": "1739ba773f37f199a5b11dcd31a61c69012f6814ea6a72c01600000000000000", -"service": "00000000000000000000ffffb07b39ca", -"pubKeyOperator": "92dae738ab948b027ac1cada939d0dc193d4ecc613f2101455c27d5b1d77dcf6957f1d82adcf890a1e2d9ded8567ea59", -"votingAddress": "2FreghVV5SRJSdJxjkEGtBLEAyjz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9b87891f54f4e5453aac654af1e36aa6e622bdaa8ab08876cbf9c0eac74a5964", -"confirmedHash": "a4e9373b7f1c36a2654e6fafa6d494933d2110a1ed5860071500000000000000", -"service": "00000000000000000000ffff8bb4be9d", -"pubKeyOperator": "11e2e0a92c3e8c9a700efe73c60f567ed26781875836a858f1a24998c676604b63e634cf8fcc535538635565e6b52a81", -"votingAddress": "2n5ftASsf7F32ZTWDf5ayxC61pcg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9b88b67dbc0ef8ebd58dbee599a3d919a5e62ba631c54193bb2c0ff87c1f69f2", -"confirmedHash": "dcb88c91bde9761b7e712537e7a17dfbb7c86bbb819f0ec91200000000000000", -"service": "00000000000000000000ffffbc28b6d7", -"pubKeyOperator": "81d27d965d9a1ff8eb03e8dacad42b5efeb33c61f63e239f8836bd56b3c008736fbae2241dba2a05807d7456a4370278", -"votingAddress": "24u8AHcH1PZf9bQ7zoPQaWd6dd15", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9b8979bf8547f2f5e831f3b1103fdbf25ae4d02a23ed7df41ff9782eb1fceaa2", -"confirmedHash": "353b68a234c373a1ea9ba6ac5676311ec9ee916b281f86921400000000000000", -"service": "00000000000000000000ffffa877f1ab", -"pubKeyOperator": "085c12a75ec818b23d38337f58a962a6c7145c537d8859e65561bd8ba92e81ef45e1cd2431408476b69512b6b72bf96c", -"votingAddress": "JA3n9kAKude3puCti7YGheAMLQ2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9ba1f4ab1797de800234b7a242443aac5756253a5954b3170a92fec6efeb97d9", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffffc17a8da5", -"pubKeyOperator": "001ba48ae3dfab528113e96b210fee15e0ccb9dc5f86cd2112224a98b005c9100e5eaf98945e4318120020f811eed4e2", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9babe0481a7d6be6a56b9260a668b5189950b05d3fa49e01a3c4e344e301fbd8", -"confirmedHash": "2828f9560b0a085b43e5d45d26966358393a3c5cf1be8c010600000000000000", -"service": "00000000000000000000ffffb951a7a3", -"pubKeyOperator": "96356f33205c9162f29d2e57f1de1edd13962f3558a105b97fc805774299d4e3f2a1ee65ed0cc351d99dff524770a75b", -"votingAddress": "2nNMPRcDSrKvu9WMXRuHx5arRtp1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9bc4803359bd3f1298cfe2094895a1acd717b30737723955162ee327f4bb37ec", -"confirmedHash": "90dd4f5b03b1b587e8fec794379900814f60825e815f86242200000000000000", -"service": "00000000000000000000ffffc2875417", -"pubKeyOperator": "07f365f676c358acb01754b3dc9351e9a00af5b2981458f58c6edbfa40c28160a8b1c4210634af5ad65cbd6362b89c59", -"votingAddress": "tSg6Q918uqhtVG1euwbHywd6YC3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9bf2165ddacb6c14a33a400a719ec4b5da343a31bc6d9e7441526e72301b25e6", -"confirmedHash": "3ffd6c0d3805980b5e7023f51667aa3a50dcaa9caff2ab120d00000000000000", -"service": "00000000000000000000ffff52d3196e", -"pubKeyOperator": "01a8b787cf3ab2b23131a3db682eee7b1ba81439b1e2e26dc009b61d6026eacdaf9a640b4c59ea93a9398eb64f3cabe9", -"votingAddress": "2v2KrQsnMBEQjakUsNmtm3Z8KLPi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9c10cedb74e08a7f8ef933a6bfcbf646f9006d3025b6bd3314d13b1b63e7721a", -"confirmedHash": "80f6ed208a88c29718f0fc157cce94c95ce6df42291b7b2b1700000000000000", -"service": "00000000000000000000ffff68eeb07d", -"pubKeyOperator": "86230e89575b73f17b2459324fe3eb802e2c03a354f9c050295facc1f64337226ea30ef992fa6830a3b7c17ef8ceda6b", -"votingAddress": "FQGrANPvW6h7uzKmdcPVK28XiPi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9c1bc3dceb17447a44edcd2370fe4cf38aff637b5ef9eaeec90a50b91ca900b1", -"confirmedHash": "245cd90a17cac504eeba8c0a12efc069c3e64bb42971ca2d2b00000000000000", -"service": "00000000000000000000ffff68f889b7", -"pubKeyOperator": "84c091f7f87b0b4e336582648ce4ccdba6ea496c566275fabe064fcc9ec632ad0d75b68ab34d19a359c25662dca37ba5", -"votingAddress": "2mxrMaN5tnHFT9qnmraH7vHCyp3W", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9c1f95bd555c5e16eba89ceaf7bba9dbcec136378052d6174a2beb4ec16b234a", -"confirmedHash": "9ce4c3ecf6214b5f88c42daddf0b33f26e7136bf311cd4581300000000000000", -"service": "00000000000000000000ffff9f417669", -"pubKeyOperator": "8e455a0aa618a09c846ab7a10ed992bf14eab8f3ef025750d94b0bb41e01c7c3c825ccde1097178e834f2743751c8cb8", -"votingAddress": "2TBvSdS9Cz2MTbuVkddV8qTjcLQq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9c2009afaf92cf604cca30d677248236600405d110dc9a3d7d659536642bf27c", -"confirmedHash": "65743b27df20ce4631ce8b80eb99e5603a082be2fda34f862300000000000000", -"service": "00000000000000000000ffff2d204ac9", -"pubKeyOperator": "867ed2f432f2fa93d2b9b340a9c176a47ab70da12caa97bffe12ca8d863ea5d258bc04cec1c0229c9389d443c72cc30e", -"votingAddress": "4TKGSAyaU59VAh9vgHcjosZvKwSb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9c216813f12c7adc5814fb422beb1e9b8c743ec4a10f20cdd9bf6d548d7dcf5d", -"confirmedHash": "dbcb94681afab19e589abe1ba391d14b756bbaa599c6bdb60b00000000000000", -"service": "00000000000000000000ffff55d1f284", -"pubKeyOperator": "8d07f33e08c10b0ba7495125f0001a931239be5951ec917b51d2ac56f2cd5a50552b5c7dbdc50f5d87b8710d27ae1a43", -"votingAddress": "3UBf5hmaKCXL9jDgXdgUTKcPgb1y", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9c3c2aa9d840b45d246217e5bab7b50764805534bcf95a6d7b85a4e2204c95ef", -"confirmedHash": "13907d5f457c3a3086d3ca496b28eb8a2351dbed207272ce1300000000000000", -"service": "00000000000000000000ffffc11d3b60", -"pubKeyOperator": "8e7f2cb0d0900f4311f364233c869100b97de3875694cd3f23b0ee6d3fdbc91989477dd1e24fdbed9200b49efe6a9a5d", -"votingAddress": "g5dxHC84D5joDh9kBqAtztQQNUR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9c450c2e60fc90f52bd35506f63881375a8e4e6a099760a75ba48d6b4985483f", -"confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", -"service": "00000000000000000000ffff55d1f268", -"pubKeyOperator": "162bf310af40c5babe39a0b0f0a00adcc1ad2d6fcc50a68210d8515f05dcf6b7ecd6010bed5b421ea54c8e46aa7abcc7", -"votingAddress": "2LPXj8iQLaX1Ncj2XV1e6Hysygc7", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9c49a61d7d271a5f6f1a799339adb31b92ed4935ce42f2b512a9f82ca842072d", -"confirmedHash": "9150b583afdc35454426fdee6afd8aded622421e127fdbd61300000000000000", -"service": "00000000000000000000ffffd4186c9e", -"pubKeyOperator": "8606c4f9d1142896a625390b1716aa47ba42127c99d89c391cf0298db1ebc141b9a4a33acde1c16ea940a2c00d900745", -"votingAddress": "3nU114wMxeSyvTgMXPCJsMztTPN1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9c640edcdceaa9ff2265de31b79b8fd5569fb83515352e1aebb7cc9fc67dba70", -"confirmedHash": "d7c1cff6165ca88a7dad205b5d5ff767cec2a1ca8c6633290800000000000000", -"service": "00000000000000000000ffff5fd84fe1", -"pubKeyOperator": "89be3d6605e78dee6b2873f0fb3db02e808eb47b52efad4166ccf47e6542f43e2df5c3aef6fa0d616637b140bcfc81a7", -"votingAddress": "3UFezpW3DdnFEmoC9F1MVmnL3u7x", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9c67e114d30586d76c09de32f7155554a4c564777274b252463cbbaa7a85dc0c", -"confirmedHash": "3071d1f893d5f8daa7b7dd9d7aa51cdba7e38834ec9a23ad3700000000000000", -"service": "00000000000000000000ffffd4186827", -"pubKeyOperator": "1096dcd0d7678f2fcf94ac87b3d535849d607fa2042b066c97303e81f3adb3a9fa660b26d1b993a319e28802aef1b895", -"votingAddress": "F3mk6rjqKxCA1EvHbQwp5LaFJPv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9c6df419c4e7bc4ec7f4571f3a1b32df356f6a4396236b6c655db4d9f7a3418b", -"confirmedHash": "fecb8ca6e39f79a283fee58baceb791e6066e551b51a6f8b1100000000000000", -"service": "00000000000000000000ffffbc2815e6", -"pubKeyOperator": "975abcbc8e685fcfb31057c7e7f655bdbc15e1b52c4c6c22021aa9beb53b4e5743aad1f83d2a7a8f887d7b9b42a7c77c", -"votingAddress": "46GwZ3pdngLjmRvSYecsu3J5Z1TB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9c955321ed62303fcdee813de9c6e576bc655f76a3979b0cc4fd8c19e428e15d", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d52db9", -"pubKeyOperator": "12774fccd87cd23ab50acaebc2f81165f2ba3a83225099c1e217188d70d6196b19a7f070f35e7494740d1317d86389a3", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9c9a8867ae1b126b452c3d82b800c51e65b098ec60fbadd8df7335be47774152", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96887d6b", -"pubKeyOperator": "11c8bb8b632288baa7bf695a1a27c08fe3769630a3998b857ef74fe521b16ab5c6ef2278f26568822480eba4935a66c2", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9c9ab6520c6ef0b892ef57cb22c1610d5602ee191d115110cbd8799346539f9b", -"confirmedHash": "53a78b0c6cacf1ac96b3879798fa784d5c58addd6c4eaf660b00000000000000", -"service": "00000000000000000000ffffb945343b", -"pubKeyOperator": "1684ed8b1b108409976f6ce7251cea3056248b53f30a46bb3e457bfd0b50dd0d1673408f28a717fe6492a122810875a4", -"votingAddress": "2qB58QD3rzwuFSoY8gVgvFC452mK", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9ca246ea1eb4185460f2815de061e02efd5ee43f32408dbef01bf5f837c6cb11", -"confirmedHash": "0f07293743ffccdd1bbdfda2bf273ed2ceb2f62d7a6eb2160e00000000000000", -"service": "00000000000000000000ffffc11d386d", -"pubKeyOperator": "8d823bdc8565b89bd28e0ed991436863eae499850899d4c9f06a7d5bc7f2af5a0f26503814fcb3923e06049647405da5", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9ca812cc2902f46bc2d412eaa558dcd60113061c25b7821a69ee4b148c4d6a4f", -"confirmedHash": "c61e2ae74231ef41f78e4eaac1d6e6064c624766d3bcdf7b2d00000000000000", -"service": "00000000000000000000ffffc2875a41", -"pubKeyOperator": "0a7f1103715af39799693715a29e4f66b1e9d91b84a5590af9e33c9717d6a1e7aafa3bbaf80f558345123901c5d7f6ef", -"votingAddress": "349UgPkb4qF3gA6u5Gx5eKnv8s9R", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9cc395fc0ae3cbac1354c83b590885a55c01e867b2e7d18eac73d69bb8b1a0f9", -"confirmedHash": "1be758139421063d44b2265542b444a4f070c57b18ee01821100000000000000", -"service": "00000000000000000000ffffb23fec78", -"pubKeyOperator": "88fca7746d7f736a8e883c55ff8a189ba50bf625275e7d7f36f661e74bd918ab66641483e7ad65f91f76ea28144dae84", -"votingAddress": "Brd8SzLMUHNkeMg1cQQb67P94G6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9cc96d04a055730f14d927b22ded033e4eb17a26222eb6d4530b17dd6bd815ea", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0df", -"pubKeyOperator": "02147da4662a69100c4687425a2778400ca518c0d68f787b2b646692ba37ed7dd7c15650ac07307d3fffa309cf2facaa", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9cddb6b18126479fefbad5593ac63735924a8a532ff52b4739a3d2702db46d7e", -"confirmedHash": "d36bd3f1c20f4aeca2bd91abc9803e34584e44f2b6056d010000000000000000", -"service": "00000000000000000000ffff2d2081c6", -"pubKeyOperator": "977060b250023b86c9cfda4fe5441cd83d4c41b29c680f9e36638de73492c4c25696a4951506ec4d7b89c4f0c0210992", -"votingAddress": "o7Lfjkp7XkaUrxDpVHSivZ6Ax3r", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9cecd0e3f26c34e19a18d0b79820f587938057e5971dbb47213b743964fac7c1", -"confirmedHash": "bae115d2f1e828abd3000e84110700613eaf8571052f3b591000000000000000", -"service": "00000000000000000000ffff4e8dd411", -"pubKeyOperator": "04aab9472c9f1e6a397563d3224f0d91b50f3a25dfa3aaa8f5d4862b90a117fb109bd070f896945c2812cec6b5f7e931", -"votingAddress": "ofz1TmiNhQqHoCGAyGjgH8jJbwT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9cee9d64b09c81075392c109456fbbc7ad5f3ff3c819805345fb66dab84dd4ed", -"confirmedHash": "de25bd120d1d74f9614666e8d1311ffdf6d9ae71b1436f1e1100000000000000", -"service": "00000000000000000000ffff05b5ca2e", -"pubKeyOperator": "0e9b9870f23a4723e742b91faea5b96e15b0d6a71748ce8c499aed773bd2971696341233b4cb0975432dad5b66cbf2ff", -"votingAddress": "4Q9zcAGSE2EPNFUpcewtek6sHwRx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9d114fd993df577a4f6e003ab1c09f3eac6d4bee5321eedb9bd095a1da528d6e", -"confirmedHash": "67275c22573f09678a0f91dd9a3d1275714d2a6b9b7132072600000000000000", -"service": "00000000000000000000ffff453d6bea", -"pubKeyOperator": "8fee49fc8503b54fc58b02ccfaf4bef0f801098cc565a21ada920a2c1a4cb6c9ccfe7f1f9f6989834c4d7874ba3bab6e", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9d12b93893360abb97215d3ca9332ad10a08949a7170da96fa00a13e014ae228", -"confirmedHash": "80a9f392e099a10581be651ea7e9fda7a0d4f92a57a26b261800000000000000", -"service": "00000000000000000000ffff2d4d364b", -"pubKeyOperator": "82b4b2e1a673d3403511898dfdf66d0b00e275194d6ac15ba09fc0468bb63050fe97948a9440d4a5ac82c16f1435910a", -"votingAddress": "R9rCXBS6C53VPMNLe4EaxbdRQsZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9d285e15494e56b675b4d5971ccffe00cebff8b0f61c4582b8a9601eab823f70", -"confirmedHash": "4eb2b4a294ca439cf74146c19d2c8d00155e5cad28447ba20600000000000000", -"service": "00000000000000000000ffff0238d5df", -"pubKeyOperator": "19131fc7e22c69c2b2194c7ad3f22f931d5cd61c277fcb901b236e4a1eadc5a7154e4330789632b9bfa3bd4d6af0c61f", -"votingAddress": "TcfKqsXDypiDBvgGTeMPa2caHda", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9d38693d6dad63428c6497367e4c8c5dc443dd19908a175a2deb73320362fa53", -"confirmedHash": "e500969f06327c73c173c2b1b7dbfb8b1ddfd76708c1818c2200000000000000", -"service": "00000000000000000000ffffb29d5bb1", -"pubKeyOperator": "134057c09733f406ba830414a436c1473f7382dd76d4a5c5fd73ff9a569af3b61e59feff1f5a17eef9f7cde976853f6e", -"votingAddress": "2e5ikQWE1RwFANiPtQjZE2RUEkfM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9d509c1d9d7a2fd77fe9e7b950c5f79e81ef76fc7161eb91936839d863d91b96", -"confirmedHash": "f03c5aed22917a52787e8ea5d3c8ee3af7f829ce7327a6d10500000000000000", -"service": "00000000000000000000ffffa7634095", -"pubKeyOperator": "13ceace978199ed24704deae275a4c05239b5b23e85c81854ee11eeb00406ab9da42de1959e2d223ff978e90ab0e13c5", -"votingAddress": "3MGkehTEMEGfkuSyeizDJFTV8EZd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9d785f638a4e8d4bd79cdac0ed6a90023c22fb7b2666fb1fbeea22bdc2ab8277", -"confirmedHash": "cf8bdd6305b9354d7a8cccae877393db461d1a22e6d4ab451600000000000000", -"service": "00000000000000000000ffff2d4cae33", -"pubKeyOperator": "1057603cbc0615f205dde6e7dfe68973733eef94e692aba2380a55bd0e1d179a65a1fe8f7d5b66f3168bdb62bfe60cc4", -"votingAddress": "3pce4CjCVWkfwiYTbnFFUawyokJb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9d804323edfd3fd05481ca422430672464501d599d97adaa197ca8edd674ac1c", -"confirmedHash": "65ae060848ae7f38943356e4ed531724de8b6ae14d8bda8f0f00000000000000", -"service": "00000000000000000000ffff422a541b", -"pubKeyOperator": "07e1ff6b227a32f93dc9a9a17436aa9047cecc3f277aed581e9e733c68cc6e749a10fe8ed5e036180245dacfaf181aa4", -"votingAddress": "3Bj2eNquG4sBZRQVSgwRDgwbU3kR", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "9d84a4148764555878c6c4725ac9654826e7c20173745e2fb42a7fbaa0803a4a", -"confirmedHash": "53408a699779a837116ae9e6317b1343bd222a9bad4248313a00000000000000", -"service": "00000000000000000000ffff2d209de5", -"pubKeyOperator": "88647a06f9f8f9821cc9efde02ae5404c654fb4eac958e4cd8b8f7093b70853586df3dddbb627b220f1a29645d933271", -"votingAddress": "aWBTLRGgHJ15Kneui9yiTgKzTz5", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9d91505ad728352be02664aa384091b8f67317a64b5573478ab2d67df78dba55", -"confirmedHash": "0c4a9c32f3fbed8562479b6425ceffe802a73f72cc1c91820100000000000000", -"service": "00000000000000000000ffffc60d2047", -"pubKeyOperator": "0da62fd5fe94c7d237715e22f14a8e21e132a7d59298e98367784e60d85e2c08145b44444f2557f01e18346ff7568623", -"votingAddress": "2dXRefQmBZYxYQwtKwZuB3q8U2j7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9d95ad44d35ece7b5893a4184187d89b4101b1ac14db835b544923abfe758d75", -"confirmedHash": "4c612ac9472761cf6afda87a840fae1a3384e669ac8b3d390500000000000000", -"service": "00000000000000000000ffffbc28f16f", -"pubKeyOperator": "804714598db3cdd43ffc8e8d66a36c382ed0a73af6868164edc957cf54ab28095cebf6a3fad7d23e86c7012ebb20bf0e", -"votingAddress": "2khGYuipXM9LMX4mQkyTuebT7eai", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9d9aa8c68872575489f881b67fd4d905638b594ab446fb48777b3405d73f8c14", -"confirmedHash": "a7225740e6d6f64bcebc56b08e750e4348d64bc281fe91a51300000000000000", -"service": "00000000000000000000ffffd4186152", -"pubKeyOperator": "88cace92eda9f34f11251c1345c9e7edb85fd8932f27efdf9ceb81c4eaee03a60d11a1c256a0ebc0b86df953043ee6b8", -"votingAddress": "3A41en1PMCrKZkXCNG6yBEELR5i6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9da2495b13474fac49f9353e82e4e22e0fb26174095a0692dc5e15358e640a5b", -"confirmedHash": "ab5d8290124e5fca0fd048c8ca1f4feb4772cefae8feae0c0b00000000000000", -"service": "00000000000000000000ffff55d1f286", -"pubKeyOperator": "03dd8e4c604e3e02813e94612a0b1a7b70e06366a3dd588a59563ee0cc6af804d308c2028cb9f50a5e142f05c01ccee0", -"votingAddress": "4X1UiMnJM6GpwD7RQpL3BTUQ1ABq", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9daf61b42276d0a7457d886a5834c107988de2bd205a8732c020ed7c457ae07b", -"confirmedHash": "8cec3f98fdc047c94658a4204f1a16ebcf8ebc4105ffd0920b00000000000000", -"service": "00000000000000000000ffff52d31939", -"pubKeyOperator": "04559375e90a224a76da84c3682b90349633d5e759d49561d4dd53a6bcd35cf6fcdd779671e38e8c35c4a5abf3223d8e", -"votingAddress": "3njbw2x6jqx8Ue85Ps8RGip4tyz7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9e0eeecf3a8e8be20005f0142a5960587e5755cde73335eebc885cb22f43df54", -"confirmedHash": "91f4d02f97b7ed9c20739553d4d5c9b1b0350666283706a42700000000000000", -"service": "00000000000000000000ffff2d2023aa", -"pubKeyOperator": "87b9b39c92e2a0414eee1380234658943deea458398c5908a64d297ae1179646950747435a9a26135120c81c4dc731c1", -"votingAddress": "4V3wMF6LM8b3pwTJFNSWYZSCHkgw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9e13a3da2bdbd312a4a4fd4f49e2f13189671e07f2a38df6577126b20905e9c9", -"confirmedHash": "a6cc583734a8dedb1a3a5470eb7524f260a2c7b579463f511600000000000000", -"service": "00000000000000000000ffff9fcb2103", -"pubKeyOperator": "890f64239dec329b2d251bd4172cb6b751c5b32e90dd1e032a3130d78197559937d7491a32d28e0732c1b1c70887c9b3", -"votingAddress": "3n9D41GuGmFCjTULyf7r8pLV5DhZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9e281e4403a80127b44b612c5228d86239432c6820d23fc52c3304423779445e", -"confirmedHash": "979433323edec36b65871f66835c4f746a68b2fe0a819e630000000000000000", -"service": "00000000000000000000ffff2d4d8549", -"pubKeyOperator": "18718e7b9265a29402f2d86b1ab8491f3cc984e6e017e196ea32ad45dcb62c5563e01f42bc773b4be3065e7764047700", -"votingAddress": "22cibqtLQGqXJ3NuwYuDnz4nGQmj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9e34edd6c53f0513f5bb37e7eb0cec3d7ef96c653ffa0f7a0a8cef84984525e4", -"confirmedHash": "3f6ddff9bef373efef8e131e78b8d296ce55c28b8020e4a71500000000000000", -"service": "00000000000000000000ffff92b996cc", -"pubKeyOperator": "85bdb5dc93193e721d3ce515cf543240782a4338b4cc865df10d8517e88d01c3bb7ea00344a37a29d343870e90446dd3", -"votingAddress": "3xVNQynPYCaB85uxyZin6qn7J3CC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9e67c22c10a93db1493ce00537ba99b6aacae2902e4e62c6d8f81ec7aadd0c9f", -"confirmedHash": "94357db17459022dd2ba43832186000e3a67c542801781e30800000000000000", -"service": "00000000000000000000ffff05b5ca11", -"pubKeyOperator": "1932f4e5772e7afb06fae86a39f694e77144fc3b825422c523a1ff574189212ab4ec03a98cee6bda7aea2754fa5a40b2", -"votingAddress": "gx9Q7TEpJgcTbShr33f45YF7RqG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9e7c18b1d82c270936da87c2f5501df1db3fe3f087acdb80d421d519985397d2", -"confirmedHash": "a8f1e9a9d42e3af5bc29f9263d61fc554cfd8208f8e38a311200000000000000", -"service": "00000000000000000000ffff50d1e932", -"pubKeyOperator": "8b3db9077dddb7d7950fef38e5e43f88881051668d96e65267b821afa41cce9cec545685b4b0558ea7ce4f19a69a8a6b", -"votingAddress": "22RBDjFWEk7NjTeieKkCPFcSK9rC", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9e87a7034b52e68d838de84307d69fb1dfc216f9f99ed6834fb548feb5d730fe", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6d1dc", -"pubKeyOperator": "974c08f2bb56045dfb040c22ff4f66ff86f041c4bd1c83344c8dc20656365b600826ca73c8343e995185f7954142143d", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9e9f6b830b958faefefc2119f6fdc226982dad23c09451c929b60a1678b446c3", -"confirmedHash": "4e7d10ae56955054ae64d9c343097fb29fc272c81fb051f50d00000000000000", -"service": "00000000000000000000ffff88f31dd7", -"pubKeyOperator": "806266f5dfc6ee2463ff58bbb94baca161e0e65c505395d6b76ea141297c1c0f5ccadd1da46a638b219fdb6c10626500", -"votingAddress": "u8fc4k8RT6TMN4Rj6oDcrXEBXYa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9ea499507be1f57320e1efad2e334e9e3c7d37c726162d08b363ecb300131a32", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b054", -"pubKeyOperator": "87dd99ef73c084f3a21c8cbdf2bf7364deb8f08077f4c1e6acffec4f4ca8f6a64183ddf98ec184a667f83e0f804f0b5a", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9ec86c78eaf3900593ebc0afd3c07a63a7b12778ba427825a2c3da137eaa524d", -"confirmedHash": "e46907423e8b46cecd8e269521ede064c9e6b7117fbbb9721400000000000000", -"service": "00000000000000000000ffff6deb416f", -"pubKeyOperator": "8931579cd94f895e85d435d4f3e4fc6c2ee9d3b64b9ff56215340354653303ee272aa794c0737c611930640d79287079", -"votingAddress": "2HVy7SzaDEpGqfqoQvDfzo18cimt", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9ecaf94a6e744189e5427185a68aea6372364f83ba233a21f5b1717de8b42ac1", -"confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", -"service": "00000000000000000000ffffc28759ae", -"pubKeyOperator": "85783af3e12e16fa3e314079c568894577956f294dfe7b30368829c3f1384cbe08980993fdf0963702fafb8aae19835d", -"votingAddress": "ysXPxpt2jk3DPqqGCsVvmQadzff", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9ee0e43a3420f70d325ffa37d6aafef2d0d174682cbdc2e752f09cd76e564d89", -"confirmedHash": "4244abd22a6bf1a18b30786a3795d59d5fc69fe16bc55fb91900000000000000", -"service": "00000000000000000000ffff334b42eb", -"pubKeyOperator": "1962c244e8f944308664920e3aa715ccc4939a1625bc1602545a51b5d9123c6f7035e01ca796d149ab7fbf557604a817", -"votingAddress": "34cuVjiB7TtGHEbCMkawC1YEDRsX", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "9ef1316e7189037ba0dd7863cae1b3f590bf26516036e2e612277120b3866a07", -"confirmedHash": "96d8bf1cc05bdb5ce749b2f4f99a704dbe6e2e54ddf857371b00000000000000", -"service": "00000000000000000000ffffb945341d", -"pubKeyOperator": "8794b2e818d32974e727fd4b766a52a22468792fae65d4d37b78de0b986469d2b3ff80d5200ac3ae50ca6b8f13af12a5", -"votingAddress": "4UCBjZLHn9WyM8rTj9SdRPAXq1iJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9ef20acacba451734c3b3d7db9386a44b0e18e2a8651debc49ebc2d7a1afc3b1", -"confirmedHash": "bb940d494ba773f21fdac7da67d892497c34f1fb67ed5f891100000000000000", -"service": "00000000000000000000ffff36270a63", -"pubKeyOperator": "8a3d538b20ae37531a78b4b4f908c612f7572313eece8aa41468671b85786ab709367c507f4f72d90ed42de86dc0ff0e", -"votingAddress": "qkSwcqBVKFyq6brry5F7qJXG2dT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9efee0b691adb7a36b731e572149c3a6ff84e9706ba964c71d88df2ee52ba674", -"confirmedHash": "57c4c1632f801dc664e0298968fbe0b72498dd93827fc5d80000000000000000", -"service": "00000000000000000000ffff33c3d9b2", -"pubKeyOperator": "143d8f943843ce2c38b43fad1ed3460b6b88b8a9bdb4dfce283f90889a747208bf3864ade1c785d53a65b3f150e0d3c2", -"votingAddress": "2PSvnXP8Hjes85yaYqaqDeppoiBw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9f2488933aa2ada7f1663397bd17119cfe32ab43a163c495ca2b69e203efbe99", -"confirmedHash": "657de99cc61915e1d2fb21e671918a02464a41c1ecb815d82200000000000000", -"service": "00000000000000000000ffff55d1f1d6", -"pubKeyOperator": "063ad45b1dab6bb712caeeda4aea34ebe7a48d2516818f46109956700819671967ea7938e5002842ccb01c877769c1e2", -"votingAddress": "wYs1pTGZoUPn7aa1rYNKMWkxt7p", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9f268e26fac9082c039e0d939d0e7f0ace2f043a8be200596dd479c7dd85185c", -"confirmedHash": "60ab2a3f1aba0233175ea5d5634e0c94ddd8c6fa22714e571d00000000000000", -"service": "00000000000000000000ffffbc28f163", -"pubKeyOperator": "11111ca3a2cfe06e26c15ed0114215078933b5182c48844973b7564e6611bd4252918a9655394597c94eedb43b93ed6e", -"votingAddress": "q2x2WE6R7ttXTYdfntT7vgRc5jz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9f2e31aa04b98f12ba6ba422d09b580663bac88b521d30c520fb169209ca820b", -"confirmedHash": "7e2085edeb744a65b30a7d4a00c413f1d9f581c9e1a7ecf90f00000000000000", -"service": "00000000000000000000ffff9f411bef", -"pubKeyOperator": "97a5997b82ae593a234d7b091ae4fcf0ea8aa0140aea5ab94a0b38991e5a8e025bd45b4b5d0db0292b06ae588f3ba19a", -"votingAddress": "4KBUd7c453obTrvA1cnjcuRjwfSW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9f312b7f1a31b4ffda3446c7deb7c7c94a334acab26b402411da6559de6bbe00", -"confirmedHash": "6a5e15a6654babe6fea0a9fc4bd0b704b270dbfd80a776e90e00000000000000", -"service": "00000000000000000000ffffb945375f", -"pubKeyOperator": "10c914dcdfa76c2da0a5ec3eeeef4555d9569325880fa712a726916ca451cdbe81cf6c8a8ab7f9a6fe236dd76a7aa812", -"votingAddress": "3ynAxV8asCrmr93ynnbrQiWhLd5U", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9f371abf0064d63e01bf4d86eff9710fdb733000521ff9601914a8d60f41a19a", -"confirmedHash": "090d13c932dcae92a5895a73e077a144520c17d058fcbe1b0100000000000000", -"service": "00000000000000000000ffff87b53226", -"pubKeyOperator": "82254b850d993a09668ced032eea4e6959dc352f8caa781405f7eb94099a970b0edd773ed6b154551653cdab70e6552b", -"votingAddress": "3vbqPo5nctdxVyJN2uxnpwuzLg6J", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9f3941585426c04720c5a4fdb7a5ff453477e4f83af159404682ede83e42c548", -"confirmedHash": "d9609cd6c5269670776c3d9cdebccf53bbc1171d72690fef3800000000000000", -"service": "00000000000000000000ffff88f45ba6", -"pubKeyOperator": "854fae4ddc13776784a04ae318d45067c9f2a5cafb823170717da3a495c2a661a67516a5e146391b009ab792361f0aa4", -"votingAddress": "2kaeeUSdbneqmPuFERuTDJDBpPhb", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738200 -},{ -"proRegTxHash": "9f473bbaddfe59cdf1b63af58fe7212dc97f7dbb16519ae9c04356ef0d1ab0a9", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d52415", -"pubKeyOperator": "02ee6571d0bbcb7fa9607144751429c2e5a8d353ac5c9548c007aaebcf9984d4a752992b04cc210fc59ec79a8e7bd8e5", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9f4ce4838c5f47375b6d3722e78c85a9debbabb07f4f722595853a989bd1a903", -"confirmedHash": "3d7c37bfd286c8e716b2f1fff9ea61d5a82f5efa57e5f2680800000000000000", -"service": "00000000000000000000ffff8b3b4a99", -"pubKeyOperator": "850c8517b234dc315b2abccbd8c7553f9928dbfa53feaa985a19168f1e9681691273801a0ae2c31b58820c8347127d37", -"votingAddress": "25vAvZpts9ARFJcEWqhhupSaLJgR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9f4d6eff8f716521dbfdc7c63489e32faf6dfe77f80e80d94b8938df8234025b", -"confirmedHash": "b66ba86a783f8d88a44c9cea9f9835cdb3ce2d3a097a52002700000000000000", -"service": "00000000000000000000ffff9df54514", -"pubKeyOperator": "87e115a5297a48d001b4fc5d8c48d05c4b113cf5515d7f7bc05075e78f649525b54b2404b5848fc439bcf2454855d82c", -"votingAddress": "LAn7MTbfkLBLQTJAcTWF3rDxaYZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9f86a07f5623dd011bd2dde55682b7c018870a6e9551d0e3a9d10e10067e1aad", -"confirmedHash": "490688752ea417d09a6ed12036998c9731e94bd520a2b27c1d00000000000000", -"service": "00000000000000000000ffff2d20f39d", -"pubKeyOperator": "91e4e803d5f0a9a9043bc314995f0561f6fee65ad56346ee9a3681bdc90e8fb5440aef04a0a3616757b30e2b19729af5", -"votingAddress": "3pT4RtUcdtQdF3umHFkVBFxCc6ep", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9fd648eb3acd529d783d91fbea40b9b531ea6d7aec739ef3d147ab604dbf64f1", -"confirmedHash": "0a210ac920be82792b6db4d66aaea9c06e9483cd945ef51d0900000000000000", -"service": "00000000000000000000ffff2e04a262", -"pubKeyOperator": "022a9bcfd0e60bc3ad5a7d14ad8d46ef79d16e0132ef7c743fa55edcd4b454d633f97f7ce2570ea52c993efc98075efd", -"votingAddress": "4CVzY4RfP2eT8XuSsrTaQbxvKxHB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9fd835e6b82c0a81ea0e3f893635c0dcffbeea17405d4b469d02d4a0c0c80c5b", -"confirmedHash": "24a2f21ecabb472f0affe870eb8d345a5df1819c198b0ec30400000000000000", -"service": "00000000000000000000ffff55d1f237", -"pubKeyOperator": "8cad50b59d1883ce0447e2e59c9aea69aa7a01f2c6e913d7aca0a2bea8be23ca2e8e8e7f82983cc2fc403e1fefe8be34", -"votingAddress": "y2QwjnT5ib8ghbVcx1EUYA3Bong", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9fe122c80c3a529dc7c4722d871bb7cdd604f285dc4099b1075ad37ef3c662ca", -"confirmedHash": "082ad0c1623b5b4f767158ef626336363e711175b7a491f30c00000000000000", -"service": "00000000000000000000ffff55d1f1f6", -"pubKeyOperator": "99dfb7ab2b00f53ffd983fd94aeedcbece6a6ed7e8b38c37d6cee200c32460c3d3ed3f0a5ae5e8e2c80326f001bc5af8", -"votingAddress": "4TnXw1U8XWSgFC26Z936qmLvQQwH", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9ff54d5d4c07e9f01ef3b781af2e6244422ebc440d2ef803ea20259b631017d9", -"confirmedHash": "b69db6b2110b4462c4e0ad25ecad25e2c0ec2ae6d438f13c0000000000000000", -"service": "00000000000000000000ffff55d1f121", -"pubKeyOperator": "0679aae1aee676a210905956c0a230dd1abd38e078bcc7a0b92761bfea4c8da3a046fa906c2dd820493b60aae21929b2", -"votingAddress": "3oCLEd4JRnettCn8tSD5MwzNdD9v", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "9ffdfef20a26c2355f186d3c1d2210bb5095b6d4ee527189ece28df83442cba8", -"confirmedHash": "44bd1811292f54f7da814dc227284df8e9d7c4f7eb9be9364000000000000000", -"service": "00000000000000000000ffff9df560cb", -"pubKeyOperator": "00fa62409ba4fe325bb55086f2deb25fb855974d3eaf6098b0edcc2a1f873ca82304836292b1f3a7497d729eb483316d", -"votingAddress": "SXpGz3gXDS1KVdaTa9N6pcf5pLD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a005dbf4898121924b9e43348d731ca8e638155ffd60d1e8aed7141944860136", -"confirmedHash": "297a7c380c04c5e08b3955f569779e4574c50efc96b9d7d51800000000000000", -"service": "00000000000000000000ffffd4186e80", -"pubKeyOperator": "138e5f79e82fdebbb194bf87a43093330f628beb4211d35d217e2f745df3c33b9684bca2374b8a16b7cb963827841fbb", -"votingAddress": "2SZGEUcFRCX4PS9EMN53BxPbjwTe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a01c6698e8e0239ac68ee5bf226f2b63f37f1999fcb2a3bb2c952f3caa9b0037", -"confirmedHash": "9820c8acc77100ceaab045c8792dc7d09d4ab761dffba0ff1600000000000000", -"service": "00000000000000000000ffff59280d2c", -"pubKeyOperator": "08687fb3c929f51ad3588903f73132ea0ead57bcee0cafc69f742a46513b6ad0f708233b7ee2aa943059696c4696faef", -"votingAddress": "3dw8Nu8tFLLZenoXPCQprFGgXDuh", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a024468069b197fdb8934febe2819fff1a075fc432850595bb47609b8e89bad7", -"confirmedHash": "a9c6a86d3dc16147f2f91eee91d59de7ff8e4f2f6eee3d050b00000000000000", -"service": "00000000000000000000ffffbc28f16a", -"pubKeyOperator": "93a83f3957f4350565c7138089fa9597cfdbfb440b0ce1600c59e1ec2fe7039917edb2e91aa46f2de6d174ccb26a4a83", -"votingAddress": "UsQS82byTuJo4A7MZTtYBMfrkRd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a02621c243c6dde1c28e407a1de3c412d8c0d1a6968eccfe949cb5ad0d760d21", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b079", -"pubKeyOperator": "9710294871d99ad4d6ed0c7bf4a43a43054413e4ab0bd5873291352895ffc5fb6a5ce877f274c1b878a4068dcaeae66d", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a0287af5b0c865acdb1d1b3327a308cff216d1d650b2821dd3358b9af099ece5", -"confirmedHash": "0c16652f1a661f34a628bbcba7dc5b069c7892648cbb2c9d1600000000000000", -"service": "00000000000000000000ffff50d1eaaa", -"pubKeyOperator": "87949f59c5620dee96a63e1068eca40743cc6ac472a8077b296c59f7ab8003c88d8a0d21ce4082c1180309c7da5502cb", -"votingAddress": "EqGUX4mmwdDbDkQBtuaiW6VKFeM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a02fb88dc34cb563b47035fac4ff7b163bbc695e0da39efc67ed8ee9a75a81f0", -"confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", -"service": "00000000000000000000ffff2d4c3977", -"pubKeyOperator": "85489e9c712519a18ff58c2196cab0414430e8984756fd883ef016b954ba3098738020aa84dcd746d4168d3779779a0e", -"votingAddress": "2ET97zXchBxDkYw2gvW7PyTKFkhg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a03d090a505a55e142e918fd9819df77bd5e5f0e4707338758d358e1d87eb868", -"confirmedHash": "dfec50654c7b3bb9e3453d460909bf5940542da59afc41f30000000000000000", -"service": "00000000000000000000ffffb280fecc", -"pubKeyOperator": "835b5a112c0132431aab447edaed938c6224e6895d0b57ff847c86d602ef0752c62b1179e586670684eacf6ec420d858", -"votingAddress": "3TgzJ4X7LFEdMDp4yHsETUUhsxXk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a03e737762446ab4972061ebde400a3abfb55e3f3bfc7c0a3de4d4d14233564a", -"confirmedHash": "89d564eb63a1cad6af949b4beee8b66cecf6cccef428d26d0b00000000000000", -"service": "00000000000000000000ffff2d206311", -"pubKeyOperator": "85a101655ac3740dd6607de492f9912925694f13f9699e8416cf63894cf5ec131eee96a6e9e2f57f89437412d7fafbde", -"votingAddress": "FMhAiTLFSvoZGy39xb1NQ3RUji3", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a0435de50b59f7b04e167ab2b3f3e5c1a039703575b6d7d1b60845c291de896f", -"confirmedHash": "413fcf7d45d2eb7a7d7e70e34b61972da362bee0c22b13cb0e00000000000000", -"service": "00000000000000000000ffff3eabbe8c", -"pubKeyOperator": "810a58b0aaa29a78d673ee65299ad3a267d88efeffd93f1b314502303a9cfea44c5cd86fa539f24afe33f948923063b3", -"votingAddress": "qNfW7646z7gakYaApuE1owdQ8sQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a04d556bc7e9be9c639aa558cf44aea70e911cdad6257766c8625fd9db0d6344", -"confirmedHash": "9129c82a932fff630ff46a80cf992a6097a450221aecf4720100000000000000", -"service": "00000000000000000000ffff5fb73527", -"pubKeyOperator": "0006e6a3bd5fb5d94bf385d944ae4bbb16a9fb01cac56fc47390ff24a50cb44effe43d4b5a72b7d5df87953abffa935a", -"votingAddress": "Mb9mWYCERAcxm8dj9B7o2Q8AFtu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a05d8d02e1215c6d09efc192476125935fa5426d2ff2d1b93c3c8fc73fff7672", -"confirmedHash": "787d728f5c62f1cfd69182ee8cf1c73cf8c4c6413405303f0b00000000000000", -"service": "00000000000000000000ffff2f63e5d5", -"pubKeyOperator": "86b5b899e81a1a88d8ecd72a53de915ef8f883b11a394143891f240410a8dd71c45bd1fd003f101a118a15206d076d45", -"votingAddress": "4HS342mgJeE5na3heRzP1efwTK9m", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "a06dbf594811131f366af652b29b3351b234406f910f0dd5c1139494b975e5c3", -"confirmedHash": "aad03704ed728de13c38412354dfd1fb80bec10abde18f461400000000000000", -"service": "00000000000000000000ffffa12311d2", -"pubKeyOperator": "045f9bbe218ec47a12c22ebe4a8660a256be7b1bde3fc703a9a3a79d2b28b3f45b2e92e4502d3af7bc3ed4da181bc890", -"votingAddress": "3gguNEA1zJ55zDQztQHbCmwyJ7t7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a0a40f3cd5e73d6786ec4f78ef5c622f449c9bf466e0382e731a25ac38ad85b3", -"confirmedHash": "ef549ef959009fd972941368d6e806d38a3df6b45c39bb481000000000000000", -"service": "00000000000000000000ffffbca6b62f", -"pubKeyOperator": "1608402a6abb96704f6dbe808448e9d89ece60c8dd6794bd790840f119e6b15bce54f6c4a75f5c7aaada35ce53778897", -"votingAddress": "2KK95VuwuZJFFkBoP1uty34kyJWi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a0a4bacb1f13b9babdce7c68c0029ca79b6dd6b8f0688b9101f68a0d5a0b2947", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0c3", -"pubKeyOperator": "939cfaa411d4b25095fee9876d2a9275bbf383b1be80e372f814b4b2d06b23154ac6e64153283562ec7bdcaf659e8567", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a0a6386f0d11f2d40121521aacb6ef91e12ced461d1162c9ba9b3d4213bafdc5", -"confirmedHash": "23fba4bff175751416253c813a0ea17199a799945174c7120700000000000000", -"service": "00000000000000000000ffffc28751d6", -"pubKeyOperator": "12df58db5cde038a10fbd85c2f5fc855ba2542354a6214917e11a64504726031c7c0e4d70249c42a8e53aa97d6423592", -"votingAddress": "FXGYPsiF1cKZLDCSMJzXXm6ZfKP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a0b7c359af4904aabb9b7c3f74d6b8dbce82037c0e3afe94252a64aeea04ae1d", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffff80c7db4c", -"pubKeyOperator": "9344fee70f898489a569284c66010c92f389ae2b91f94d5ecdd647689c0650b10c703321a3621e570b3efb112c6ea909", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a0cce85814193ddef0cf11654b018b6e07ff82c351d356625842f776331bbbf2", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d52643", -"pubKeyOperator": "9442b1286adfac7dcb1ac129c3a347f6fd617e14a18fe52988ab3acfa15490c2c3798fc04148402777fca86e453e0570", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a0f414ed746d471b8c35ae2005dd3831b724367aa5217987e79d8ac0719ad239", -"confirmedHash": "940b37038967c460d991890c6a11903d87231fb714ade2073500000000000000", -"service": "00000000000000000000ffff2d3f6b5a", -"pubKeyOperator": "81b6d9c7821984cf77b423a0b10d842378e95cfbf9b85fa287c48e2e798862a5735950cafd26d5f84a9fc0af0fc6796d", -"votingAddress": "okZBPc9LT5MdbYzuJ4oRnZwRNcD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a0f491326fe01dd88a93fd4a9a1ee4220473c3f9a84c8cf7c83719e2af9cf9fb", -"confirmedHash": "bbec52c7768c0a1e6e6b662dd37e0b94d61bdc277e76e92f1700000000000000", -"service": "00000000000000000000ffff2d5575ca", -"pubKeyOperator": "16a4b53c6feae23a1b23150e4621714c70c2f38665ff5aa1625aa9e18b5c16522fd48e7df15680340cb972fc9b031f55", -"votingAddress": "2MLExNhdopFJkFwDARARXHruiayN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a107af811f521219baebe831836994710aafc77ba6e183005f6b503b2bd44db4", -"confirmedHash": "ecb04c3af37751c64f5a9640de0f979645dfbb600d1d0a6e0600000000000000", -"service": "00000000000000000000ffff2d20b35b", -"pubKeyOperator": "8caa8081c2329a9b4ced52bde825dd77aa8ea753a32319f9702640ebbb697fdf9f27e0f19278cadde05ab9977d700da3", -"votingAddress": "SUHQ3ZaXbxEhgXMoGqUYc6P6kf6", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a1238863f97ae93b21f76cb4745a5d331d1745fd65d7b22ad64dc375f8d53a04", -"confirmedHash": "5f3d1cc0f4ac66e78d503704aeeb91ff712b98a2c189c76c0a00000000000000", -"service": "00000000000000000000ffffd41861ab", -"pubKeyOperator": "0c4171ce41a0358a88aefcac1e5e96c7235e0642d1370996265375aa605608c52668199c83fe203c30e6f7ef5fa1db20", -"votingAddress": "UNMTRBQAKUfynwXvWeU8xsD9XQP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a12433b9fb4cba87fbb591fd78563aa44d2dadc6dba162869b86eeae5c2a1796", -"confirmedHash": "395079fa0773b3face28f85016ac347959f939263ba13bb90d00000000000000", -"service": "00000000000000000000ffff87b50842", -"pubKeyOperator": "94bfa631b7421ee9db633af657f9d51f2ef3a01bf9025d6759ae01aa03ae9e27f3748474355dd9114fe65966948300d7", -"votingAddress": "4L3HT8YyVBBgbauKTiPLGwLBMoY6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a13766e1f6815e3b2d77e1cde68477bb6896e0614ea40d7dd7bad02f549f46de", -"confirmedHash": "ee56a186b7e39ada68a7160f36070fc4ddce38125177441f0500000000000000", -"service": "00000000000000000000ffffa8775005", -"pubKeyOperator": "15c8c598528fba3c0f91f0ee236994bb313139742b00353f426a1454a57f5d225454e4f405af421470fdea93bca64728", -"votingAddress": "3jVsKcvpg1ctmnUi618LyR2AwNdp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a1394246acd89d4ae94697f122c506304457070fee1a63c67e0a7f86b6e1f81e", -"confirmedHash": "5d7447f976f163823995c83e58677d59462d41e4644374951600000000000000", -"service": "00000000000000000000ffffce511960", -"pubKeyOperator": "090bc093f584554e5a834d228c540d781d82de9fb0bacd296dbfc213d6e84feebdf69ac73e2a5bdbc85d90a38a517c4c", -"votingAddress": "3xEZdx7YQZwu2KhyixBi4yyMg43R", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a13f8d54102bcc54c0e1b4d83c887e05bc384089a552a9492928533bee94dd82", -"confirmedHash": "d08e629e93616e373ee7e1fa30725c6617dc3c6caa7287200700000000000000", -"service": "00000000000000000000ffffbc28b48c", -"pubKeyOperator": "9650065c969636f1f2f6bb45f09d31d8adb574883480a9e0e6f7ce58090d9655265ace70271714ff9639a251d79978d7", -"votingAddress": "M2jSk3sFp2Wd3eRmJoGvRmKYkC2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a14f13f53eef00a0b4305b5c6c6d5eb464b82320de00802558136b64436aa324", -"confirmedHash": "bb22347348008ace5e364d38cadde18ba3aabc5571d095ad1800000000000000", -"service": "00000000000000000000ffff4622c61a", -"pubKeyOperator": "88224ae1a2a6ed639730e76969d8ca970cbb28e257f1b9e59f8b3c6d9f10e11184036e77bb3b017cafb0c9dda6c0c4e1", -"votingAddress": "4RxZuRzL48NFw5XzsT89qY3zMdT5", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "a151b657958ac27a2f235af6c1d77088ca9e88b1bcff194bc9703fa2c13096fc", -"confirmedHash": "54ca220dce6177184e60d8a3194e7046c2aad4e4adaf83190f00000000000000", -"service": "00000000000000000000ffff52d319cb", -"pubKeyOperator": "19cf33257deb1470a58f294123788239b97d46456db54f61a437a2236646ff75192f8b84cd0a69c17d9e203dd008eaa3", -"votingAddress": "2Kd8GzSCi8wdQKqBbqtaAnxqxnED", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a172ccb14281eb63e9ddd8ef2eec13bdb58d27e565743bdfd93a42b81944e9b9", -"confirmedHash": "522b03635f67191653f35490a2c2ef0936b88832eddab26c1400000000000000", -"service": "00000000000000000000ffff55d1f1b9", -"pubKeyOperator": "89511b7f44d81a748038f01d29d507cfb09c28e17b30da1a7d2087502b35e7c746fc8ab745201eb47c88cceadb0f9e6b", -"votingAddress": "3yASuvq2TPdABfeTRmnwRLLbk8Ke", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a174098566a4e5593952e5813d7e8a7300b62dcbf803871fdc9797f776ecc867", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff23517204", -"pubKeyOperator": "086f964eabe3077b7fab05ec1cae19985f171eaac6b5e237a340cf0c4b46b3e9e6a14aad34c9d2c568b0bf57004209f8", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a19b6ca0c14fdf3965a03d38177f74ce97f2ebd4f216e0b2400fa03517625834", -"confirmedHash": "ab6c9fd60408a34200fd8a4c0a00f7215b9a31120dc9b95b1100000000000000", -"service": "00000000000000000000ffffc2875fe1", -"pubKeyOperator": "00141a01c1f7775bc4b7f1cc9e665cee6c59b8f817ec325c7236367a1b17a238e146a38329adfa2e1767a5c54a5dc73a", -"votingAddress": "4GEamFjWdEeAQYSGg6y4uFihuRUD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a1a4968964591829a7ae36397a03d403af0ebbd6b4ddcb77bffeee371c62a1c2", -"confirmedHash": "345cca872a8575598b6897bd7f024a37abc74e71d3ade1a10300000000000000", -"service": "00000000000000000000ffff8f6ef2da", -"pubKeyOperator": "912498832a2fa34467b226770de76509bef6737ac3a0b13e77e03848bb4f7c8918c7683f5eaaa62369b88c1f5ab17e64", -"votingAddress": "JzGy6MKVr9hBh6nceFCbC8z9tiL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a1d4942bc34f11351645ee82912950f603db43c1efa76b9c02504d5ba8b403b5", -"confirmedHash": "fe262375a8ceddfd2d764b03895f7a14c0f42124a8a330550000000000000000", -"service": "00000000000000000000ffffbc28fbd6", -"pubKeyOperator": "01ec64aae06a306850bf90a0365861fcda0553f9a0e9e2b7338cfc758c4ba4cec75908e0f3c1235edb46b63ae191d05d", -"votingAddress": "3ubaGArVXccwbFfmcyV7QmzGN6Ds", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a1e61913fd0d6d73ff3f3af21eff33efddbd1ac815043bc5791031e3fe30d24e", -"confirmedHash": "7a1530acdce1114e845ce3c01f9867f8b31089d1bb9fad682800000000000000", -"service": "00000000000000000000ffff0238d5dd", -"pubKeyOperator": "0a55feeb95069c67139787e86c6ad236dfbc9160ff2d42dcf9da99be146e5618b709b26ad6b451a5d2c0d9ca81b3ee21", -"votingAddress": "7Cp8CdCEG6Av4d2qZotVmvzN2QC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a1f16c6bc0dbae7e150c85eb982fbd13de0293093c052abc5526e5f224596cb8", -"confirmedHash": "3b561cf3e493afafe781480af786f940b055c55f829b47ff1300000000000000", -"service": "00000000000000000000ffff2d4d0425", -"pubKeyOperator": "8eb745a5a1ba17da8ee8f0a5203296f5cb36a181294359f3ab318ea71942161fd7d70677841470e83d22320a21813e21", -"votingAddress": "44bZW5NrZzPisv5b866Ar7G6K6Hc", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a2065375ae2cc21ddceaacc3d6b3f42c51872b51a09ee74bcb1c5432718e80dd", -"confirmedHash": "6ed6a400b9c9b65d4da63626648be9e0bf7bd2b07a8e1db71300000000000000", -"service": "00000000000000000000ffff50d1e36c", -"pubKeyOperator": "17f96b4c40cff391d6a2048ab456339991aa22c12d4a33f0fc94b82cb3d1f1bd347f9d0c6a7875cb81c611e7f6d03478", -"votingAddress": "tS9HNuvUgSMN4R8YNRXpQfzcWew", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a213e7a9dbc11e41f9fa532062558153464434e0a718369679ca47a8665bc12c", -"confirmedHash": "48b5849ac27029fff865bc4fa529106dedaf250de70978101b00000000000000", -"service": "00000000000000000000ffff68f8cd92", -"pubKeyOperator": "93e133fa8afc56132063d68d4f836b1d7da3eb86702dd77707d84d677f5671e42386840023ebea352dd96f312ca18989", -"votingAddress": "3eq2vEdy83tsb3TYNoa2kmjakzPv", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "a234144b8d8a5b5001b434058846546b99c6fdf2c30b567ba578e0d24ca21d1c", -"confirmedHash": "a8f1e9a9d42e3af5bc29f9263d61fc554cfd8208f8e38a311200000000000000", -"service": "00000000000000000000ffff55d1f202", -"pubKeyOperator": "9268cd50f785153fe1d6c8ba91d6beb0bbaaec427ce06e2d03849a20b8c04c41ce04df275431a1f67d0f29c0ee414bc2", -"votingAddress": "2cV6qV9YErcGqYEWZpMaEhLJfTMR", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a23be5997975271540770ed6948e6809b4da132b765906727fc097d7e7de520a", -"confirmedHash": "e723a8ec69d76b21ed258ebad5c3d5e31273d5fa64ca80220f00000000000000", -"service": "00000000000000000000ffffbc28af46", -"pubKeyOperator": "06a0942a00ae691ea0e54dabf1819c4238e8e0ae3b2d4cad3dc8dd2e498308b909d498027df24df9cf0c52be34417c08", -"votingAddress": "4K2M14v1D5m5XWVf2MfikYg4noHw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a23f44a41c35c4b5276108f1018590e56613bc8b7b66c9c96a61c8dfd53432b6", -"confirmedHash": "d1e3e3f5851d5e0b42013c7e796a38edfd86d489cd9e2ab20600000000000000", -"service": "00000000000000000000ffff8a446fd6", -"pubKeyOperator": "03ffabb0588844a60d5449a29fdabf8b99be18b25ccadfa0518d44280874993ca6458a3c939631af59fba7d0c2d52063", -"votingAddress": "3bLL9oAzc9zbmU7HFkzE1FYzHe6n", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a251e3965b476296b3e34f90c96eb6fefa78385098013b2727939c891a64b751", -"confirmedHash": "d5156219a10f493bb81e918e8fa8acbfbc58157206bdb1f60300000000000000", -"service": "00000000000000000000ffff55d1f154", -"pubKeyOperator": "89133f89ff049d4da8cd3b718e7a10885aa332b31d83f102d184c3a33ab4f77b3faa39a0098443eadae470c3c5b5f9f0", -"votingAddress": "3TP5m9TvSJecoYVenQhL4QDRACvP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a2557ccbdc16fb95560f03a2f4b6a354c306aef3d9c15c7c4fbf209046ef5472", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff22d9a538", -"pubKeyOperator": "178eb83d956c633d57844a4d4e2d215d61cdc7098fa644d2b96149c4601d59adada1fe6f854f6c34d1f2f4e96e63f6f9", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a25e119803dc7fda40f1873ef578f7e398a6e7bc753052288ae5ac4edc251426", -"confirmedHash": "59480079ef251d169baab392fd32109aeb8446a1fa9f61930200000000000000", -"service": "00000000000000000000ffff8b3b21e0", -"pubKeyOperator": "066fb1c2ebb62a57af93d79df8cb511b9ca1c9663ca9ecf14e04f4edcfda2f2db401053c3f8f44b29a5b84fd50987889", -"votingAddress": "3ZodixgAB7GgFGfCTmxCXvYgtXde", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a26f38e92a836492ef8062d7a8de67bf28cfc3304bbf6657e2d64d6734938f41", -"confirmedHash": "5cf7d640b2280726bda19427ecfd76dc8e3288148a1c560a1900000000000000", -"service": "00000000000000000000ffffd418648c", -"pubKeyOperator": "962142b0a228abd3bbed3200a92476b110e59cf0e91c03be79c92203a31cb5b956a197326e14e61e6d69599e9153677c", -"votingAddress": "2nwb9wXmpvykvGk6FcM7zUq142dr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a2851e625ffbeecab0c2abdadb1755ab2b015bd7a1840841d1f538bc75d4201a", -"confirmedHash": "92e88e8c6db10d1940f2ac18144fe08855106086164582001d00000000000000", -"service": "00000000000000000000ffff50d1e868", -"pubKeyOperator": "952986c8b417ff0fb1ac11e2c6975ac52435e9cc168be7cab5dd73a3af861403932f8120c0ead5f308f38f9a0fee56f3", -"votingAddress": "4Xwn8Zxon4XsccoDkLuhwzfi5NrR", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a287889d227b5d3a9b3c411eca8c37631f9da1f48aee912f7f67ca5c6580f25b", -"confirmedHash": "762f4e4693839ee498a1b76069a9b9db8b29985e70c55f622a00000000000000", -"service": "00000000000000000000ffffd4186d6a", -"pubKeyOperator": "10e16be447ee472c60d1b8b885a6efb8131471fae250c7fc581fb537fdb7e6353dfa901dc92befeeec420cf4ce936df5", -"votingAddress": "Z6fMtWhzic2xy97Hze4jvegrmoz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a2ae7acf155d071aa2480965b1ba3919c45f681d23f13089e5307f7fa78791ee", -"confirmedHash": "1b696035e379c7ad09afb19f8503c5b67da8d1cb14a0b1790300000000000000", -"service": "00000000000000000000ffffa8eb68be", -"pubKeyOperator": "9546e20a10f07e3db40f0e56bee117dc7c363c1a8cab6299b7324bd2e2796f756b003909f8150d3624457faf3e78b09b", -"votingAddress": "euWqN8LsSwyPg9Vd8nU5byd9XeL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a2dd5425fd5577c1c01ed0ae8221b8c4c0956cafb0bee1f91b63103e0f0715f9", -"confirmedHash": "41caf6f971031a6bae14cfa3a1acb82f0e80696cb218d05a1d00000000000000", -"service": "00000000000000000000ffffbca66a82", -"pubKeyOperator": "120f721cab43774a50bfa47f7623b87ec0b430fe90fc942733fdf6d684a1341f963daf2ed719774dfca01bb4cd814575", -"votingAddress": "3CRdqUVw2eJn7EwoZApXpPbNWbkA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a2e252ba1cbc997ce2c548a0d6e1b5e04d2ab85ffa71567d414ec587e742c82b", -"confirmedHash": "cf632082a1ca1ded8a7e946fa5ea5c76dd8213f33bed27e30f00000000000000", -"service": "00000000000000000000ffffb009d204", -"pubKeyOperator": "00e7b1e2c8e2f7c4187100fe2ce9f326a2956e1025059a77d6f313f6ba6a60522f8113d56b1fd1848a7ac56696694f72", -"votingAddress": "2c9FZkgPq3iZjswFEiTrne3gC3Yt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a2edfd56b54993024def3604c76dbdb7d120e8f789d1203ea942be1142fcb8e9", -"confirmedHash": "3839c4ec5df1f70dde8da276dc5c3ba83feb14bba00555ed0e00000000000000", -"service": "00000000000000000000ffffa7ac9ef9", -"pubKeyOperator": "8383a101f490e7ea949041ffa95fb66ac7eee7ac61ff3db87148f7819622de89592f98cbfd4faa37641bc71fc959bac5", -"votingAddress": "9EcQUPtmZXFBf2QA7QBTLfwCr9U", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a2efb0ff9b395c2edf9a9f112139a42d286ebda5a215349f8723b18c64334646", -"confirmedHash": "926c92598103e4f12bfa8fd8fe95737dc4e6303d12a67ce61300000000000000", -"service": "00000000000000000000ffff6deb4685", -"pubKeyOperator": "021c8bbbeae8dcdecfb981bce45a72f6b3921154e772371ad266613785211307754232581cb314c25493a9d23a26cbab", -"votingAddress": "3PxNi1C3oYz3oEwQ9ywt76N5eYeu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a2f52df7d68dbd0c00a136518ad64b91fc8735b4c6ed3e3b1765b80e836d849c", -"confirmedHash": "a6933e964f900db25b692801dfcb30556b6d813b692ba7b20500000000000000", -"service": "00000000000000000000ffff310c014e", -"pubKeyOperator": "06aeccaa4b6a4e7f5e4aec6ce969464a881123f933d3e5d08156615be58c5db7a3a41b4f159e94c3420661f29edace1c", -"votingAddress": "2W5uAmEKTUY9UNBXi39gZLxzWHS5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a2fbcc28d9e4abc94d84f3e03e4bdae5ba2b66560674c5ac5b81fcbdcfd037ae", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d56069", -"pubKeyOperator": "12e53b9b0f93bdac4d25e78fb5610aa4a10d12906586b1e162598a31718af93d015162ed7bb1d21daab9aa85e164afd1", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a30c8962a31ca0f3751dc8c939c0d34dd3db5e80e9bc9a9d1a015c311b830a1c", -"confirmedHash": "adf8083298f7a82d83beb9d3cd22ef9a32a7305355a5946b0300000000000000", -"service": "00000000000000000000ffff9d5a9963", -"pubKeyOperator": "14ca8945b89347cf44591ee2babaef8b20c1f2c9d61f5b9e3e5962c898526838fe28561ae0d689a21b78be6688dacf39", -"votingAddress": "2WcCGqwMf7ibX4kYexvBG7rqdxA7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a31fcbd0c4680673d93f999a93d6e9c14ef2fa36619abb066235de1a16f78f63", -"confirmedHash": "ad507aef88e609ff8a297f370f026e0218d8fa3ab64ad20d1a00000000000000", -"service": "00000000000000000000ffffcf94788b", -"pubKeyOperator": "945a0cfcf67e868b4ba34c18943549472b17cdd60a2dc93739fb475fdd0e80d7b93cd148508a54f1e4f3802a1bf7c505", -"votingAddress": "2Z1wCvpV7eM4R7bcFbtzyxbqDqXh", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a329196cbf38ad984099a17d9e32110696399bf1a29008d2b22ee15701cc58ff", -"confirmedHash": "58e240a154a0ac48dfd26143fb8ac7413aa11d8f10f16e622700000000000000", -"service": "00000000000000000000ffff5fd8ff48", -"pubKeyOperator": "80113626b7a736c08fcd2d78a280757c38974ddbf907943113c5613fb78a0bafd31aed2399b8743e2e11ebb6380db33a", -"votingAddress": "5iqTojycKGEwS41VexVQ2YhL5Ed", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a32fa0b8967cc6e5e16921150ed127ea3efd81dd6157d9453588a2b603389a17", -"confirmedHash": "32a33fa3a045c16f81c1b885a86c621c59dbc0b078634eaf0700000000000000", -"service": "00000000000000000000ffffb23febc6", -"pubKeyOperator": "8c4e37fe05b1a46d8bc097514a55e1345e93d526734ea04b107f47710df6d189af04ccc7461d02e57ea56b749cb68873", -"votingAddress": "z7bygvsErmPL5C8Da36UewXX237", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a3382ae262475aef60317ad2560e85d227f271d829b9d6f7105aead1536fd92d", -"confirmedHash": "a194348e192780b6d5e1850bcd400deb64d997489784c4e73100000000000000", -"service": "00000000000000000000ffffb90534b2", -"pubKeyOperator": "81f959819c777c71f7eb860a5bca5d8198e4f604466b9a54be094efb5788f7820a33de1361edbec2a05e2ab6058a14af", -"votingAddress": "2BqXewFgWzewoFqZUspdPSPCmWDk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a340d4ea298469484b6cbd7336f4a26be4f1344f02739d3fea6e7dac5982771b", -"confirmedHash": "8b5ad19b5267fb7bf4e6a5ef5ba3224298252fb9778dd51e2b00000000000000", -"service": "00000000000000000000ffff58c65a96", -"pubKeyOperator": "140b1ce29a2462138a48d8f31df635d457e9aabd558cde4ae2140f69931bf451765078b1e05acaa61eab749711b2a2c7", -"votingAddress": "YdYhgiafBytJq7vDA9QP9d55u6A", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a34bfc4ff42e83d29186bba888e3a2f9bce3a6a312b1d0ca3d5315d38fd3bec5", -"confirmedHash": "7235ad5a45f3a0a4b5efa01fe2f67e72c70e3a5d69b8c3710900000000000000", -"service": "00000000000000000000ffff2e04a27b", -"pubKeyOperator": "10eaeaefefc70f275896756f8dbf8df5205118ea03265aa4a31236c5d4825f6d7fe6a29ca6606158df096f9f8b6a36fe", -"votingAddress": "2XwFXX7o75FvyU6y4NmezUHC9h7q", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "a381bf3b2dd1631e24f02ca7f5990d7565da9219b5c1bac4efec3308df1d808c", -"confirmedHash": "384705056af13a71965c968f8440f70435560c321393559d0300000000000000", -"service": "00000000000000000000ffff4b779605", -"pubKeyOperator": "0e6ad202c6b18075f1de8128cca7fd8a851b3bbef05fab46c59a43f05957e1fc0aa5362eceb7be10116c9c0e2c098bc5", -"votingAddress": "YrvvR9zXppd3QLofcgZhsUdB2Ev", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a3899813007e7cbebbe559e30f1ca75e287629c5bb82c34f4201220d4c09654b", -"confirmedHash": "6ed6a400b9c9b65d4da63626648be9e0bf7bd2b07a8e1db71300000000000000", -"service": "00000000000000000000ffff3e4d99e8", -"pubKeyOperator": "8d4e9a85694d0b1460921838774e48de2426a4c0eecefb54a8ebd4e8b1047fa15abf4ec93bf214a3b2cea5c6584c380b", -"votingAddress": "HNT8UVtcNxPYHcngicqbafWxYbz", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a389edcd1a85e6256f9fc1f5b3326c95c69e6b3d01169cbb4e95acd58fda2639", -"confirmedHash": "ece571bfcc6e952a594a823a9524158728d0b64a85bde1e31800000000000000", -"service": "00000000000000000000ffff5fb3fa72", -"pubKeyOperator": "023f5cbeeaf1cce563b864937c96d1109a086637106021d009aaa33aea1d8ee817055abd53213ab8700ae4c03c8234c6", -"votingAddress": "2M6XYvvjFwi58TLQMWqbE6AEADi4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a3bb6091ba0f441d4939e01f05013c99d38e2e384d6059228d43f1ad2865be58", -"confirmedHash": "d60a5882deff2062abbe5bbcd43d25581ef685c56881fccf0e00000000000000", -"service": "00000000000000000000ffff951c1984", -"pubKeyOperator": "965b070145fd09b66f7b4e7a8144ae5db80f1c22cbe43de23131a4ccc3cf7631cef1cdf95502b8225edab6b040e2e4bd", -"votingAddress": "4739FWRKdVGv6mW6HG9GWxwfkNSL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a3d57d21c5de112681f0d305617fe79e179bc1d2aa330e3902e44e6b476ea884", -"confirmedHash": "4b80f79bd5adacc9894c5e62fc8a2c41f2e4a92afb3e3d5a1200000000000000", -"service": "00000000000000000000ffff88f3738c", -"pubKeyOperator": "91a35bdd9e4eb9179194d4de456723e6caaa4d477f512910fc92621ce7f6f9e328ac7836be3c4de558f734676dc52c4b", -"votingAddress": "qQYshRKwApZicYEt8ppzz17VaFu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a3e0f48636c3650559f7b5212c118005198b2dfd1b24a5ba2b68b624272b4d72", -"confirmedHash": "00960cca1bd93bdfe38eefd8f7c17d3856f416e84a85b5c63500000000000000", -"service": "00000000000000000000ffff74cb3673", -"pubKeyOperator": "0c9ab1e12e07140f42977cb0d0c43c8b9c8f3ae8ca53647b464bd8c2642cb85abc1e05b1bb9445b3ce859881aec7015a", -"votingAddress": "P4dvA33xNFgtE13mJgyykNPY7dW", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a3e6857316ee4b3b861c90b261b9abd5de049f5c3de879a2aceb0356742b72df", -"confirmedHash": "bd3206ddf481a91490f5e6a2f4f6b4810504d9c7ea64abc90400000000000000", -"service": "00000000000000000000ffffb23e98de", -"pubKeyOperator": "858b723abd9fcd44f34c78196d6800baa4ce6122b2df0c870877e30838fa8507fd2a60b1f714b801a07f4d42b62c3797", -"votingAddress": "obUWFmVuFZPJejTCpoKKKumPHgB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a3e863db52a98a67ec8934fd320722bb6a94f8a97f65dd424d78d098e679bd43", -"confirmedHash": "111a6a938fddf0b5ba960d054455c3af7fec6909a596a05e2800000000000000", -"service": "00000000000000000000ffffb23e80a8", -"pubKeyOperator": "8d11a9f2bf786af55a9b47739df97293cf9a17fa7de2810b2aacf75a07241f9136e6eef9c21af52892fb7bffb35eada5", -"votingAddress": "ej2GPkZzGqBRXuZMjmxDhYws1G9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a3f09841930da69b44a6bf629457c60516a668e4abbe1a2f3b81fd2125fbd27f", -"confirmedHash": "41530e88e2f9d68026603a1c94f51adce763880de07564801a00000000000000", -"service": "00000000000000000000ffffcebd847e", -"pubKeyOperator": "808fadbd78bcb5e6892ed68c3396d1b0693cd4d6b12b1dba2b569968f1c1d716ddc56368e94d7c3de855a89189913cbb", -"votingAddress": "3ZYTbbqknGXa97D3guZR18rDSJCc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a4017655fda36086121dc95316e2311d191dcb8c8e983f45f27ac977a7acb844", -"confirmedHash": "02480155e7acf82afa5eae3263f0d683dc1a85b1712e29c22600000000000000", -"service": "00000000000000000000ffff52d31955", -"pubKeyOperator": "8e58385add22ea3673210e005b3aa845e0bdd8da1451e817edaf3fafca608a9f1069437b069ba58c49a3357b5e893f11", -"votingAddress": "3JyzG83xPyWgUU6Aao7PB7FMZGST", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a409648cc1254d478df94f0030de79ef7101efe95807322fb6904edae1d81954", -"confirmedHash": "74eeef8df9323115d4c6150616ff4f8836bb3cd60809df920f00000000000000", -"service": "00000000000000000000ffff55d1f1ce", -"pubKeyOperator": "8218206632966da927f6ba85dca38631f4ca860c0f61c9d856ffbd36f61acfb65d87819338ecaf675d6d86d4f04060c9", -"votingAddress": "3tyQ22CgZwnyhsAVNPTgsS5A8qbh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a41dc8d020e8833797e8ebeae5e69e58a3324601d38c1860323096d3d5eb30b2", -"confirmedHash": "e607e98d6e1b3d2695b3d4e818ba6c911bd2a576a86e4f360c00000000000000", -"service": "00000000000000000000ffff80c72362", -"pubKeyOperator": "1762447d1650cd7ca0ecf141c3a97e4d6d6cf48f7c357c9d32b3751c1c76b3d5f03e32fed3646c332f348d6be14f2a51", -"votingAddress": "2GVEZGoupn2UJFfVtAUDL2mRPCQB", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "a4291ee9ae75de6b333333ba55983584bf7967baf0c01ec8d3c692bd98901af8", -"confirmedHash": "53762dc241899840b2c2c5fdaf4168a2a4687ed00869399d0800000000000000", -"service": "00000000000000000000ffffb07b39d9", -"pubKeyOperator": "17b5527b371746b62db3d625d32180fe4b65e1abf6bd4a6bfb036c7d2df9cae37b6a0751eaa4931c8f3c7cabe8729c3b", -"votingAddress": "3sWMLvB4rRsdvbvGPsPAkU6Xh615", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a4337d544a6bd1a34490e4adf7f8117865f19bbf4a31c020fb359cd93830fba3", -"confirmedHash": "f4e56ed87cbf5c6439e89e656c3b7002d1183258e869aec21400000000000000", -"service": "00000000000000000000ffffd4186809", -"pubKeyOperator": "17e26dc2f3aa80354cf191333030900af4e4a339f32a59cc79a5ecc0e3b15d3f9cb2fa8a6203c8417d95edea56211b03", -"votingAddress": "267iSAcpHca7uEgCjbZB9rrppaF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a44065e7ca7e0a9f2cc3d075266b7b34be1c409c731c7210bd1dc093d05e9296", -"confirmedHash": "e689aeac898e471003c4315a8c32bf22a00211e3afd7e8820100000000000000", -"service": "00000000000000000000ffff4ddcd4b3", -"pubKeyOperator": "041ec20475b5b05163339c1aa87e9e43196246b13cbd91f3bf032414d37b38106452d0a7d866ccfb92d3c1fc0034ad56", -"votingAddress": "3VkEkbrNgDeudhH66gVadqkrVo6N", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "a45341b7f6897088a763ca634a245db99e15a2e1c7aa476002bd346e45c4f627", -"confirmedHash": "051b53482c37c7a2c952b7643015e51f96dd4df42d4afcb50600000000000000", -"service": "00000000000000000000ffff98596904", -"pubKeyOperator": "8614cae212b36a0218d1ebcdb2bd682a8eddd4a6e5e33ee7a7815aee9b1f009bf627b63f0194e0f2d14530144d83fadc", -"votingAddress": "2DT75bFFGkPv6n5G12qkt5jL8tLE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a45f55832fb25bcd6f779cc8f98cd512c126b41833e31827e190987d8f6bda5b", -"confirmedHash": "18fc8d671100a132d44f5d81172ecea186576b13ff373da81700000000000000", -"service": "00000000000000000000ffff34562b82", -"pubKeyOperator": "8dec91f24ee2352d49f980984b43824f4cc4e7e4df80a644139d24c1186c6e483af686a40a4eb39194abedf19ab0dba9", -"votingAddress": "3cneLp5dipn7MTCWYRHswtrkS3aN", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a471957116b6f098a3b02fbbfff987bbbc0133b5ac01dc772b01ab2623f29972", -"confirmedHash": "bbffc6e040ac9d302ad6a45c1f33c2cadc5be2445b3ac7971900000000000000", -"service": "00000000000000000000ffff9de67684", -"pubKeyOperator": "87ee22233a7bf0a311d50eaa46513b65689bfd16b809d3676f75c8c4df789088d3aad314750cf3e25f6a4fa2404a0fe5", -"votingAddress": "22nrdPvb2dCFiZTsyhrsrkNQbokw", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "a49897ed786465fc8e89f2df71d3061502e84fef2a7106fa6d23a08399056fb1", -"confirmedHash": "36b7742b6125ad0dafa80aaef2abe2e7043ba705dcf291022200000000000000", -"service": "00000000000000000000ffff90ca2501", -"pubKeyOperator": "835c33ef7379bcb444dffdac7f216144bb004b8ff0b5cf2993d810640ef5f7380a6427f7f0713ccbc69fbec8b15f8607", -"votingAddress": "2reBJkEaMsE2v7ZU3XeuLELAJoRZ", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "a49c7687574cc70f0e1a0e45e6dac9e3f19a0df1a8da6a9bd5b153fb7027c96f", -"confirmedHash": "7da4e61f8c0cf90937c9f3e277658c4c75f07a82276282b20300000000000000", -"service": "00000000000000000000ffff92b99ee8", -"pubKeyOperator": "973b267e1061df403efeb7f3da9e34b3e7c1c24b4843eca377720e4973461fed9418d370b74a58110c818a391ecd1809", -"votingAddress": "2hj2FTELfzc9F1vyzUtnPpuVU32x", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "a4b3775739f0a05c79ea779cf208706b9cb385012f88d39411dda5de1d0991e2", -"confirmedHash": "7b62c55954c53e68b7bbd139da5d9e3cb56cce69ea01fa9e1400000000000000", -"service": "00000000000000000000ffff5e823bc3", -"pubKeyOperator": "8bdac12950b4f93d4b18699b6e342d1f4f9d959049d1d80f5eaadc6eaa739b370c52a769c103c2d8ebf86ec4ffd07f2e", -"votingAddress": "3C1BfFWwFFFeoTu8MoK5ygL8JUdE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a4b5310622ee9de86b11e336bbbb0a0c98a430ab9926d92ec16690f74acffa8b", -"confirmedHash": "7a63f2fff216837c99cd7cf84762a7829688866cde3d903b2700000000000000", -"service": "00000000000000000000ffffa772ae5f", -"pubKeyOperator": "133bc1cae5a41cef7a97fdde556d1ae074bbd6b201626d52908a5fd9d217dd912668710409a52e2230d9e74fe8a1dbfb", -"votingAddress": "2YzTrA91dX5HsqN8w5J12bgxSAKA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a4b8ea67bd455f3dcebfa0261a1dbb7f2af0f9d9f9ba2ecc35138afbd1dba91f", -"confirmedHash": "5c2c7c249e17d812cc5f89e29f29998512f12aec729a798b1900000000000000", -"service": "00000000000000000000ffff5fd93060", -"pubKeyOperator": "0d8b775cbb384346567ee2632e97d7fb92c17fa7a49830aa8ddc621c87dc42e5291d52e728cb531c0413d6e7763ab065", -"votingAddress": "49Ni9tHvkyijB4jnaKLoma3dwfGU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a4caa5f10f4eb529961f24f21c3f810bb7972232ac34a1576e5a1ea4abac6f51", -"confirmedHash": "b85655ffd9645ce6c2d5474efea205519233872b31d491690600000000000000", -"service": "00000000000000000000ffff5fd8c984", -"pubKeyOperator": "98efd9b5ebb90593d36826f73b55773ad79750d0e6eac4be164b2498f4f50c806b64fd856c80eebdc59a179f6ec3572e", -"votingAddress": "3SwgdN2dDXYbWJVFLkj4YNC14w1k", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a4d420ea35fda9370cc3572e737c6ead21b12fe07fcb07da5e256ecf281622fb", -"confirmedHash": "a1e6a81c221aed68d0e640d6581eb47941aef0a4afbbaca63100000000000000", -"service": "00000000000000000000ffff52d319a9", -"pubKeyOperator": "85c649e189357b57c9f7d2ef0afb13b3f9ff2c68492553f435d09df5174bea666a0d621b6e7d96c786ca915c71c2d5b2", -"votingAddress": "3ZNJpqgL4fShAgMV6LVRVCuL3P4H", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a4ed6468ca713ea3752c37701eb1bfc3afe8445d37d3be6bf364ab42d506c1d8", -"confirmedHash": "4625271a9c1ff80c4a0349516c47ee5d0e68daad4a28fa780300000000000000", -"service": "00000000000000000000ffff36524cdc", -"pubKeyOperator": "86fc525c0846881d1c5035451e9955bc6493718273acf5b8a31cc90a7bb0f2cedde667954855f1904042d743784fbaa2", -"votingAddress": "BVfv9n6BuE6cthptpdAUz3dWJ6T", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a4f14c081108d63dccb812d9d8fb6c09b92a6472973c43ed6eee5792f50ef0d2", -"confirmedHash": "00f0bb07a0dca0b315c0838e934d8ac5e83c93b7de407c8b0b00000000000000", -"service": "00000000000000000000ffff8ac5856a", -"pubKeyOperator": "869a2ad6a59f191831c79a993b77380e14eb4db25002c29b665e048bcb65876155ca11a86a232b46910776bf9dc3b772", -"votingAddress": "bJ4vD8DGwVWzMtM83RtLsqorgcr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a4f2706b3a8529e1927f73198e177a9437d0e335bbf6ae3bdaa038ee3bb42269", -"confirmedHash": "bb2c8d3c64ac1cb1746d341f3ef8aeb883242dab52fb7df61300000000000000", -"service": "00000000000000000000ffffb009d200", -"pubKeyOperator": "87398223d0ef8ccb7457f15ac29a89d2fec0a6abad6e0c60753aa174a08b958d2eba9496ab301aeea2cec559b53a806d", -"votingAddress": "3hpAEBYsoPaCiLNqfGFJZVXNsZUV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a4fdb5c9d4a5d13dbebd9fa693e37aa284708d2ab2d8d0393cf0795e20e1d4c0", -"confirmedHash": "b34dfe65eb519e1589c1a299b0e7773e898c4240c22c9f9e0e00000000000000", -"service": "00000000000000000000ffffb23f7984", -"pubKeyOperator": "03565607ad3493fe5f9b7d97e44a68d0326db3e486be171e4f56a6d410b7b0a8a12b0204efaaa59cf0c6542926350f17", -"votingAddress": "5cFiFmhZ1At3hEpRAFER6PhcjqL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a514d78d67c4fa1fb4059c0f8659bb8c70e0936f43b93a94841e29bbe2b39928", -"confirmedHash": "29b61e7734f41c62ce870ee61dc1aab6095d2dcaa4bef6991c00000000000000", -"service": "00000000000000000000ffff2d4d2437", -"pubKeyOperator": "1885de5b2ee852b68daad7cf289c7b7283a4895469317dc685704629cba1c9d0d4072db5f740d923198948c448306db9", -"votingAddress": "3yFRAbjwh3G7KDhUzG28TaAZvio8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a516df3b8e39c5189ea4f15e6931a9e0875b2e334076767bff86daf74a79cdbf", -"confirmedHash": "e5332b21aba9e4ee0c4cfb77b86ef34ccb48b0b03571213d2000000000000000", -"service": "00000000000000000000ffff0358f3c0", -"pubKeyOperator": "18a8368bbe54b5dcbc8c7e05646d62880716e8e8175b0bc31bafd7318fb28cec489ed6fd73b984cc4f4235e85363a1be", -"votingAddress": "2K9jQ2nVHdaE7qTbDQNDadNYpRQx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a52203c7d078f5ad16b79ff3376e2ccf197dc625cf8a6a2d1616f99118c3753d", -"confirmedHash": "a635fac4fcc7c553d6cd0669946f0f67c9df69f02882d4d50700000000000000", -"service": "00000000000000000000ffffbc28b48b", -"pubKeyOperator": "105972c7be3c93d66cb0c6932d85c4aa0761b5c653996761ddafa3732a9ab15cf0edc1441a3248a62ce1ae53832bbfe1", -"votingAddress": "LwgTp8SnVMKYEJvKj7eesTJaCXF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a54e79fb00dcc46a97414b16c30582e7a99f52670b11af1f9d59d7700056322c", -"confirmedHash": "6519384cf40a3ec445492ac64c0dea401893a0c3935115880200000000000000", -"service": "00000000000000000000ffff9fdf1249", -"pubKeyOperator": "07ed79266f09323a5bbb05fbdb145224d2b1395cb3a12b4141d92e721199cfa52c2f2f5f2af72df436896dbd86d52fb9", -"votingAddress": "3zmjWKr65fZ6jQgEuG1pYD57rP38", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a5561398a03769782b09c660df3ee9bc48641171a648bc75bdc0f127598385db", -"confirmedHash": "57192262bf57f47e2e79923fba884a66817c00ff3f3df1cc2400000000000000", -"service": "00000000000000000000ffffb23ea3cd", -"pubKeyOperator": "96b8cb78267ab6d966f514aab91fe25110b1c5b8bcac6542a1f622152d289c9ba347dd75581b2ce6bebca24c30cb8990", -"votingAddress": "3NXJj8VqYUtt7JfTe3gNQ49YzEtY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a564411271db3966e09cd17348d1bfb09f45a090a9864fa2ea89f2beb6531496", -"confirmedHash": "167bd6abac19405803e371f5a508711470e7005dbb70b7be1700000000000000", -"service": "00000000000000000000ffff5fd8e662", -"pubKeyOperator": "16b98fcda35c9469d00b633e5c249f84858b6bf15fd672f62397a86743c44616277720198f59c63cefa0fbfc0839b615", -"votingAddress": "urwnbguGXBGf87SpuuSUKLuz54S", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a56c2aa1e82b30dd361bc9e64a566c4b100be017f7a31f76f351b87381c185d4", -"confirmedHash": "0f07293743ffccdd1bbdfda2bf273ed2ceb2f62d7a6eb2160e00000000000000", -"service": "00000000000000000000ffff179800d6", -"pubKeyOperator": "0114955296802340f9f67e4dde4a6cf1b5d6f518fe09fdf61600aba3b27cc1dc36dcac48c638389f1a63f4f53171cd35", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a570476458478db57a040abb1744b2c1e1e2d7e43d5dc807de37f2e6e94ed21f", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff23b6b538", -"pubKeyOperator": "8d4b3d39f5aa357fafe8b61111ed7db533b2f1ba7a493bc5ac8411e38763a35e8d24d61c4363be327d736c2bdd6678b0", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a5861be49e05ff88c1824bc3aded1f56b9cdbd17025bc10c48e68dba86b5c46f", -"confirmedHash": "ce4373a8a04c4f0097c7f66a6d99078b17229a1b695f546d0200000000000000", -"service": "00000000000000000000ffff55d1f1b4", -"pubKeyOperator": "065b8e2356a635908075f2d0a973c005a5428327eb30cc39f87e5d0b500471f8eb40a42156b5d6ebe9b4c87b452ee21a", -"votingAddress": "2zZDvMAkAUUUe7dzRRmaGFC8XBAF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a591320e5d576880dcb87da786de81720421558a6f9236ca1ece7a1979c2b724", -"confirmedHash": "4eedad9ac6806e3c89972ea51184c5c94b191ca1dad7680f0700000000000000", -"service": "00000000000000000000ffff5fd947c3", -"pubKeyOperator": "8b4253f994e44b1e241fbefa9e8148ebc1e86bc5fba5c2a75d2c852ece56c2dab7138b9e87a8dfd7a53df4e6a1103707", -"votingAddress": "3G4ioc7VFv7GyQVUxM6xW6bJWXEV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a5a8f26ed3978a1e1db40cc4e279b60a845f36897fbbd7be4d5b792b083e56e5", -"confirmedHash": "10e4ae87d49586f5a853c4930947b75319f5455b84cca9281000000000000000", -"service": "00000000000000000000ffff34054037", -"pubKeyOperator": "0bd0b465f8bc59f7a509caf35debc0f7701c6102a80faed3766960d1342b46e967eae52557cf12fdf437e6ec5c395925", -"votingAddress": "4D28LiaG7rH2nJDwuKRQ2CuTUEZV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a5b284d6929a0fb726f1e060495036e455017b12d1d5a0f4fe84c48ed4ba31ff", -"confirmedHash": "ffec47b9d9e23f092441f227090f93b748027499fe0b56e40400000000000000", -"service": "00000000000000000000ffffbc28b849", -"pubKeyOperator": "1725872919f368be810a91ab90c9de8980aaa032ac202d615e1f12031671f4a9a408f4e8936e4041f89a3911bd71bbb9", -"votingAddress": "2EXMN31R6BiS9Zw75c1bMeTnb7XB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a5b45eff7fe21ed7c5cac10383043f5ae22d66f4223a7d704a9a0ef5b78d610a", -"confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", -"service": "00000000000000000000ffff2d809c96", -"pubKeyOperator": "8123766ae4752999080d6bc838989d86dace876d1b8aa084e5d35d24716ead96fdf2e2826c651e1b8c17080d875f93c7", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a5b8877c8219f06b8cce63760b33aaed5a949c2fbe773f2a24308447e39f121e", -"confirmedHash": "30303601a4851f2e359ef0639b081706cfa2c652d72cdad30b00000000000000", -"service": "00000000000000000000ffffbc28a310", -"pubKeyOperator": "854d74a6ad83619af4a82f9ad811ae7af16e0920dd0b9ef278df3d448dd39a79e93fc7f1b75557c68fd8953a884b183a", -"votingAddress": "41jWW6LW9uJLRvaBa7PhBZB9KE3b", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a5bb1bddbdb955e7a558a6bacd795afeb96dd6e233f6b3769becc95ec425c718", -"confirmedHash": "3a7b4ef744c146072baa40642f3c956bbf942bd76c10492b1100000000000000", -"service": "00000000000000000000ffff05bd9160", -"pubKeyOperator": "0959b63d573c72076e1f4f4e1cb25e1143ff2eb618b2524e8d1425d1f33b91642fdf6f9c1fbaa1aa0611ccdf2e073553", -"votingAddress": "4TKdvNsVenAa1N85aPL4McDi3hHc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a5c376bd4971f5f3dac956b275b7014705a8ae76478c803821e8567d3ce8097b", -"confirmedHash": "a3e43c05adcff93d62c4c6011b7031345c56bd4f789b68ac0900000000000000", -"service": "00000000000000000000ffffb07b39cd", -"pubKeyOperator": "004b6db94ee1ff607d47abf37358e8540654c239d92e2f90b8c062b7efccc99eb96ceb48931d065e0ee48ba6ccad8158", -"votingAddress": "oGhxDyqvExkx7gJkBkJzAFKDRBe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a5d0af51d7e64900f2bcd3085dfe34a151085f208bfdc0b90d4fdec213a1e802", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b010", -"pubKeyOperator": "86374b08f04af35e872e37c5e1317ba99cbbdc28ce80ba68a4e9a1bb7f85d07df453ff259a9f409b5a57f93201899e6a", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a5dd1fac1fa185063a992ed40b443855505f6fa5b3460a9ff6cb8529a546b1fe", -"confirmedHash": "a6cc583734a8dedb1a3a5470eb7524f260a2c7b579463f511600000000000000", -"service": "00000000000000000000ffff55d1f10a", -"pubKeyOperator": "0ddb912c6e449e1b7dc4c0e4277dbe3a5ead08026d08c408bd359065c190840ff1fa69b08de02d3d121d8f4baf5cbabf", -"votingAddress": "2SiFm4Qjgqq4vYvEyffepPVsGMX2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a5ed605b135bc523202df6c4bf3ffcb8edf03e5d9a822a6370dfe8c5e1a1da12", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff8491ce93", -"pubKeyOperator": "83a1d3695942e714b4647d6f96ed334b69f6229d17dcf9c4279a2f9d475f9ba8a724ea5a0f87710265a174b7cbf8d4bb", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a5fa4dd26d9d7e9e5e482a4d3aa6aa559fa716a43b23ba9ab4a998829c9c6a06", -"confirmedHash": "b3567b8c7b3578d75b823f99e06051f2d809a8f8459c699a0d00000000000000", -"service": "00000000000000000000ffff707c0471", -"pubKeyOperator": "869b1257ccd7f886ad251c733de8a4fbc564e37c113f1a437b9d05c365d48e12ac275079cefa214ebb44a09d904d8f03", -"votingAddress": "21ZBT2AqPxRWoWXGX89DCCQ6jXVw", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "a5fc0201630936ec865e4b829bc7ec076e3c1c069703ad2ad63a4d4662c85ed7", -"confirmedHash": "64059bb0649b1bd8f6a765ce2b45c83838543af0f5f254560e00000000000000", -"service": "00000000000000000000ffffbc28cd09", -"pubKeyOperator": "85d2d0b3be918c0356acc24fa49b924bda9efab78f7c32ea9326b4cbf4a204b601807d0ed106e6432001c35799247a98", -"votingAddress": "35LZbvLrDQXZ9YAtrN9KdYfu5jth", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a602ead0da8d8325313836fb269a064f5d2e73fb203ab1c95f72bd99c3b238d8", -"confirmedHash": "29a009b5140be05c3e3e725befd88f27ab79726ae0567f971100000000000000", -"service": "00000000000000000000ffffb23ec02a", -"pubKeyOperator": "0842fbb05f2e52b17698e02c8c84fede045cf92ef6b9ec3cac3d83224820051e292fbaf23c029ecbbc46d9cb414f2ada", -"votingAddress": "4C8zZ9hQ2CX2PiT1pfcPWtBYhtXC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a6143a7960e2c32cb284311466a8d6ad749332919614671c1857ba8b263e2159", -"confirmedHash": "6d4c77891849cc8c4305e5077d4fefe8f048a8f3e39f073e2200000000000000", -"service": "00000000000000000000ffffb945350a", -"pubKeyOperator": "995a9d46678bb9bd1e2426a9985bcc33ae82a27dddc2b2241483af14f08a70aa66d5a56a99adbb9121f82c90084487d3", -"votingAddress": "26b3ApAiacmMMmtQsgBXNT2A8zn1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a64c9409f2a2859affc7eea116c054d2ba7876aa345c27548f7495e290bf98f5", -"confirmedHash": "fb2178dd40e1cb115974869a1f0ab0e4d73c60896c78bfbe0000000000000000", -"service": "00000000000000000000ffffd418625d", -"pubKeyOperator": "00e98eb5033eb9df70460f3869c8851d3bfcca4b66ad17658962eec74dec6afa4694d6f8a9fb331c79d0e0bf680e94c3", -"votingAddress": "Qp7J15ZUpckmFFgrY7ajRnQJARY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a655932f064a806f584b08065b38c5d6c30cd29bb929ab8d201a7b9a25cce5d7", -"confirmedHash": "245d2aa1f746068da867c375cda4d963bb09e0fd9621fb752e00000000000000", -"service": "00000000000000000000ffff951c33a2", -"pubKeyOperator": "86de437a3adf49b886960eb95b230cb1ffe05e7f8331edc6c1def87b6cec95d1e65d9bc13945bcde644e796b7cb1178e", -"votingAddress": "3h1KE5swUB7L98R67riAQutGpfRd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a665023825e91fe574a22df9c18597c4341098ab56fe6f72b64e5f8237f3dc82", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff84919075", -"pubKeyOperator": "0cb5d40a06ddf5220f48ef1ff1b130b4c342f6ba82a49beaca3570a662a75bb231dbcb665e4ab7514f969a317c898868", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a665bdea60680c766f3626d7a6708b0cbeba291589126accf1aaf76675f3dd65", -"confirmedHash": "b1b65685df374464908db94f3b25ac42bbc46f7a16694d9a0b00000000000000", -"service": "00000000000000000000ffff8b3b1e95", -"pubKeyOperator": "961294cbb05f3f0083cd1ea5af384bd23d3f323cfa3e70f7e62a26dfdd6a06457827ff4c9531839db23657635966d4e5", -"votingAddress": "2xR4NGEJCh6evHviU7MTEEBHSBTo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a667d465021bc1eb5d9d4cb80e2c755bffec85e2856cb330250e5c8471e5c336", -"confirmedHash": "ddaefcbf01fa3bdcf36b9349e435cfcacac9a5f826eb38761800000000000000", -"service": "00000000000000000000ffff2e04a26d", -"pubKeyOperator": "16efee009ce1d239049e97dcfaeb2a5bd8e6a956bc5fbb0b158b11ad60150eaaf9af8a0e366ab4567cfc1bc36878198b", -"votingAddress": "1GgmVZofPsMzZm9WaERtZwwSLtd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a684e5747acb6c0ad82d2c1d400ae98935dfcc591320fdd930c5b8d79e502d69", -"confirmedHash": "a60d3ab71c1c8502209c70a62da5a320370c3c1759cfdf110700000000000000", -"service": "00000000000000000000ffff55d1f203", -"pubKeyOperator": "95f2ece44a5b012e3dee7e137c3ddad01e1833afef84bfede31c7d4dbba4d250330f1967712433bdce38304843bbe307", -"votingAddress": "GhupFREWn3E43VaFQnN1zYTwQG4", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a68cad97327f0b6faba5965c1f4de11a36c1a24547f504fc8da8327184176dcd", -"confirmedHash": "c2d2bc0436c1e5c916fee275944adb042da2aaf63ac2e9db0700000000000000", -"service": "00000000000000000000ffff4f621fd8", -"pubKeyOperator": "1015988b03c2739576338484f5bc78babbe64dcf6dde9e10ca4e6a41ea7a0165b8019dd56e2190dbe7385256ed574dd5", -"votingAddress": "a4vBXsWZiQMFBxWCkC2FxFfFqrE", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a6a6aee8032b309ea9bfc960ea71788c8b5252e536a8e980c6eb74576de8a0bf", -"confirmedHash": "b3de7eebefb5a598ca5ddb8c12f9c94bc6bcd728ce7aa0b40c00000000000000", -"service": "00000000000000000000ffff8e5ddd8b", -"pubKeyOperator": "93b19253ddb9d5f245be4551a39d51f4fc71e6653048e7a3dbb32896bf47460bb6621ac2133b7013cfd345b7fbe8e37e", -"votingAddress": "4WzEzjX7eqYGy2xi6hphqbv7F61g", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a6b50abd2dc4282f72f391f0be883463260ff89b5e8f3fd2d1e6a2d6593fd04e", -"confirmedHash": "debe86bfd2bbec1b4887b60f4e939babd229361b8fc89a630f00000000000000", -"service": "00000000000000000000ffffd1618115", -"pubKeyOperator": "03304f1b028a308e17e4c3423fb57aff6611226af54631b2c0f7e3184d2e695aec8447c105e7a5446f21207a14320f12", -"votingAddress": "3er5GYE7xUrVJM3RvKCfCxZiJ7fQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a6c76c9905bbc6983a2ae733f0b9b52c571fa83d571bf2193cbeb99fcdb0d7a1", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff03636547", -"pubKeyOperator": "8edeabacc2b40d516a45e266bd48b05d90bcbd669be9e845643df880adb34df95f8a40213e9b0e77d99409f26d1ac166", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a6d200cdc5bfc82b2cf13000f9b433bef4e29e8789ed7912b1a8035d2db629b1", -"confirmedHash": "cdd3539940e9a3c9bd86855bf6ab39bdac7246ee33b86afb0e00000000000000", -"service": "00000000000000000000ffffb95cdc8a", -"pubKeyOperator": "02e3463c341e16bc8237e15889a3fc82b69118acf13e44f706ec909a177acea3199ccdce496fdced6a2e363d0267dc9e", -"votingAddress": "AKbZZA632MFmUCGdMYNW1Rd4XZr", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a6e372b920b6a0a9ad8d9cc6de537186edc987c02c6112fdd1f00544de1e554e", -"confirmedHash": "b2756b2180695f6554186d3c6be2580ac8bbd341490768141f00000000000000", -"service": "00000000000000000000ffff5f5525e1", -"pubKeyOperator": "929735a2089ea090d847ba6a337a8a87942462d4081931c8ce98348b6020c3fbf7a3fda2d373e2371752c4f22fc6191a", -"votingAddress": "4Pgq2KnGBsxeuvWZzVvioG46D122", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a6e475527c4d4634da8e8c833736b201f0ebdc824872e33f690096c2fb56616c", -"confirmedHash": "3e0e828a20821c1bf4f9a2b5d182e3284adf891568fd0df50000000000000000", -"service": "00000000000000000000ffff36b87d57", -"pubKeyOperator": "07f59bb96d8d32ba51c7c77907ffaa2ec52078295b5427f275a771134d7ed1cee36ef9825743124c76125f2b9b3e1028", -"votingAddress": "34G3nNtqhoTeE7Ctzf36TdkhsLCq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a70869164490abe6ec0dbe414c9d45b335d59c35230075cdba8be983a8ed2d14", -"confirmedHash": "d21144639d9fc7eadb6fd009e4124ca9aa0498b740aa93880200000000000000", -"service": "00000000000000000000ffff55d1f1a1", -"pubKeyOperator": "853a7f3c70508e21d5f95c1d12f50c62bd01b1d9dd83a632ba97427122dd24cde9160e75c8f055cb4133036c469c4939", -"votingAddress": "TnQteS6wYKbGJ9QZHE8Qc1Ma5L4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a710763700fc54ec689ce9e774a92adae2982153220fd4dddbdd7d9b3b1e0492", -"confirmedHash": "52c0accebe3f4e66b4f66da99a5e846db496300e3878849e1700000000000000", -"service": "00000000000000000000ffff41144bd1", -"pubKeyOperator": "8f2342baed5a3de149d43a29b3f9bec534303a82f76967b0680e36f991e54e384d224e7ea467abc06e2718c1a784ea6d", -"votingAddress": "33UfvANecHdrmjxgVLz7KMRUd6qD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a714713a83a4c74cee6f189f293fb9bdf4e6aad3b471cce7c91d41a148b07878", -"confirmedHash": "5ce2c405fdf145a4cc84f1b5d088260838b3150f411d5dc60d00000000000000", -"service": "00000000000000000000ffff87b54ca0", -"pubKeyOperator": "0150fa9ad3fcb32bc15b8e4dcb6257b699b45eb46e32117271ff442036a02af314a2f5d48eb363259cba400f88382db1", -"votingAddress": "3jEckZskzvJJPpBS5xk2QYuLNKs4", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a7273132dc89f8a6cbc407561937575506adcaf9510ae1ed1a04e888081b528c", -"confirmedHash": "485877cf2f72faf5748fbef2250d08152de9de5622573be41100000000000000", -"service": "00000000000000000000ffff5fd85428", -"pubKeyOperator": "00134ae1a8f98fa2c78159f65168f44acd171f31f0ed80d9e167028e21b1bb1aa6a30afdfc269e4c3ccf65360ecb61b6", -"votingAddress": "3BikzYMtAes9vuYNaBNrP3gjZh6P", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a72cbea9daacff91577983d27b5affff4d57def3b7668fdde5fbf7a2e0e202ad", -"confirmedHash": "2361df2cfb3dbd626bff6a20f35d1ab801a740bd10e5a7c31900000000000000", -"service": "00000000000000000000ffff453d6bf3", -"pubKeyOperator": "822d261eb1db4422e0ea1cc33c6d8b12afcac3eacaf3da4edb8f293c19872ab011075b6823487d8df7ab787339218ac2", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a73b3f2f2b10c8481b8821f939a3d506be26e73e1e3af71d14b306f92338f4eb", -"confirmedHash": "92b683438f3e5e5d94bbbdb09159ea8ac752d0ae4b5aaf641400000000000000", -"service": "00000000000000000000ffff55d1f270", -"pubKeyOperator": "03be3a96b5e30af8f3b790f5dd4208dbad6e488ab3fb70c793505b60ac318e079d2ec21b7b22153e83c9cab18ca6e0e2", -"votingAddress": "23tscNthGXzu6bxZ1deiE7KgptZ6", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a74f61c0bcae74b3fc9f2f01be4e1fe9ced2ff94cd50d556222fdfe101e40298", -"confirmedHash": "3831b4c6e723d8d7a91691a94bb17b932e04ad830041e52d0800000000000000", -"service": "00000000000000000000ffffd447ef4b", -"pubKeyOperator": "098c4f7e8c28dcac4c13972728cb28cd38a6c5db9f2db8d377b258b225e4f81478f6172fdc385d9d4a5077412aa7d95c", -"votingAddress": "ANVNDhv53oUUe6ys3XDEYMNCT6D", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a762d550cd51ec151ecea5fbe28c2a453f08d5e0d8c76c06b9198fbff8cfedad", -"confirmedHash": "227b4353d46415ba9af59fe5017e5c3846ea58d9097d9c244400000000000000", -"service": "00000000000000000000ffff03de32c1", -"pubKeyOperator": "947d51f5684bb142714a1f26186db7f1408dc4617a2bce7c0901d497dd3f8f794da2c0a68679dc4c62d3118d1ca45fa8", -"votingAddress": "tRUcQWwWy2EfN3L8WccD6EAUGmx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a771972c82232f914ce2584ddcd842241b225d249a55514dcbf78f2d3f7b942d", -"confirmedHash": "0a88e616e07dc85c38dcf305709a70b226aa2b6c37d650ec0600000000000000", -"service": "00000000000000000000ffff5fd86d87", -"pubKeyOperator": "0f2e0654dd35a1880709d1e346058a6370492151ab28ddb76d15810027a405da3017942defdbb6070a08fd21d2561f01", -"votingAddress": "2oY93F2MTdz8ircdghWRdnY2pVvP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a7861cccce4b5451f066540ebfc78f23a5e51d28205118402297b6160e9827c6", -"confirmedHash": "b4e046d76ffee5e7f052dd5232094f0c8aebcb838bf22db80400000000000000", -"service": "00000000000000000000ffff5fb3f781", -"pubKeyOperator": "109d8ab86471aab37b4804c2adacfb5fd901634a9d5f9975c1e19d12c0ed00856aa002ef1c9b47f2bec20a0e6178d981", -"votingAddress": "28qLHVMgTZeQxfrn2hGKibyP5t6Y", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a786988f047ba6adf30fada1bd7269360440085047ee6832b36113850af1e0ba", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96880dab", -"pubKeyOperator": "081428d736ac2efe0c2b0f82da3c07cdef998d2a1f3a78340c34dae7f44082a7eb07d654637cd0b7ba4630abdf04a378", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a78bd0b07343edbdb851106ac57ebd14300bbd573d16143db0c52b4dababe517", -"confirmedHash": "425f91d2ce584b231e9e0c1bbd639aee5f63fc18a67c985b1200000000000000", -"service": "00000000000000000000ffffb0df8d40", -"pubKeyOperator": "883898fe6177b4040f0640e91f8f896678774ea5e1ddc9ba836321391953c97ffa8c10c704531d3b7cc0670f72a6922c", -"votingAddress": "AbKmfSDEm4QPa7n3NpUZnCENiMC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a78c174a28b0092fae068a984ebf7424ac81b58fa304fa59088bef04f12dd346", -"confirmedHash": "92e88e8c6db10d1940f2ac18144fe08855106086164582001d00000000000000", -"service": "00000000000000000000ffffb9453790", -"pubKeyOperator": "9244b9ddd8dadb5a727117eda62734a561d3ed8de6a11c0878c7bc04de3e53e4c040ec0783a0190603f285caff54e5a9", -"votingAddress": "36547pMwE7P5wQaPWDuqs8mKfkou", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a79870e20db767a6814ecc24c6cfd50ffc79072e99815f7ebc79fe4bdefe51e3", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0d1", -"pubKeyOperator": "81e3069908dad3fa81bfaf619d5d7860e5728f1c3ce3143f1ec31d0c4732e3ec2c42ec653cc594d9ffaa01852c5917a9", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a79e5ce2b959c4ee5b2bad7c1897da317d5f0d2d9669c952c1415a720db50460", -"confirmedHash": "02480155e7acf82afa5eae3263f0d683dc1a85b1712e29c22600000000000000", -"service": "00000000000000000000ffff52d3199d", -"pubKeyOperator": "11892259faa5fd0a6e7a60e4e9b922081a338c28bffe9b9546af8cdda29b05d933f20fb8dcf48e2e50478c54ec02b1c3", -"votingAddress": "3RpeNnqmYX8b4ti9fWECPvrWuoBh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a79f0ca4e20463ed06ed1e2defb17d6ebaadae62173f477fa36efd9f4239941c", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d58512", -"pubKeyOperator": "093087fa7159428e8f07ca8543f63d858d6ec61fee8d1ad87f141c453546afb53ec3306498c4a3a6d8c740cb0957badc", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a7a4f9d5e1938e45202ebf994023e10ac83cfd7547a8c821bb7d9bfadfdb4eb4", -"confirmedHash": "d14c70c70106d87958e6a301bce622f792c0abf3688d97cd1300000000000000", -"service": "00000000000000000000ffff2e1ebd17", -"pubKeyOperator": "983660eb7ea5caabbf2423e39d06d1b3099519e8cff8d515dc6799e32799a3e64afd9a60486e856f4265087021ce0265", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a7bbd26207e1cf2aa31d8d469c3c67c543e30b0d40b6c356a179f2b6037cc5cb", -"confirmedHash": "fed8e2433fad0a29c2731b3b3302cb3953202b8cc92447ba0400000000000000", -"service": "00000000000000000000ffff1798005e", -"pubKeyOperator": "19bd2d1afd6d7d77769212294e875beb5c3df6cc389a54ae79eb275a05d4af074059c9b536b672cfb366208aeedaa2e5", -"votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a7c41bdf10580bf159e6cab075ba591e332a6d6b58e9ab273f8dd16fecf9964d", -"confirmedHash": "bc808855527a8435db0c15489d60b04943a812cf5455c1e61b00000000000000", -"service": "00000000000000000000ffffae8a0574", -"pubKeyOperator": "15e1c27918b9a431e429d55fa140a3ec958e5880b63cd31842c47c0ef2747630bdb798f41120cdd4000ac1ec5fbe5077", -"votingAddress": "3GsxEbBAFsTU3tHFFvxgHe1yK5Su", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "a7d52fe409be2361e6a5e152c3a92254294e8f31a33815faf631936196fe9671", -"confirmedHash": "5a5e80ca22e84a73e6b199887a96d93bf560fadafdd4a9980600000000000000", -"service": "00000000000000000000ffff867a5cfe", -"pubKeyOperator": "8ca1bad23afdbbd5df2697a43f7e0513c66655ccf366a425774110429b5560f89ff4c928b7cb75795901048e496fc208", -"votingAddress": "2vVoJRzLE3vxKfP7fzvdwJvVpozk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a7da1ba846343c4d60e3cefac0c28b64590b37992bf1de9f426e021374493c20", -"confirmedHash": "654e3a3a90ebf48dcead6f0d1b54d4ba504cda3bd71289e42c00000000000000", -"service": "00000000000000000000ffffb2802afd", -"pubKeyOperator": "95d520e9d616f8b487fbcd5e03eaa5106148065a01c4500489ce117dafb3b964f3068ba158203bc92a4ed1c141d9cfcf", -"votingAddress": "3vnDgQdDy6Gn6o8HDBxLcqNyJYSX", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a81bb26d39f868c4af6fd46e771219a791227f2550a240e76c808cef61a38a28", -"confirmedHash": "41ab00fd542d308240d8661ba11a4d8e9fdcd838374deb543400000000000000", -"service": "00000000000000000000ffff58630b07", -"pubKeyOperator": "04e1a7f7560a9422ab86988b8feb56d3b81e3e4d7fc2877c0611ca624ade53e239b9a7176542333375c6edf7ca9ce044", -"votingAddress": "Qr9c8GvzgahAkkWf8GNG9K8nHdY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a81fb572abd601564de7045b99dac0ee98b77d4c0789248bd9360f732dd5e36c", -"confirmedHash": "d12bcae20a5c2d7163ea44c721d74263cd120f48f28d880c2000000000000000", -"service": "00000000000000000000ffff52d3196d", -"pubKeyOperator": "16d199953d53feea6b685455f0d9d6981a78f166ba2fbb4b693f512d54d970c095b44f9a5a04130dd880e48e00b99a9a", -"votingAddress": "41y83znWdw64EkwvxYensskPmSzr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a8399c65215fb3c0d006dbdd3c4a84df98d2630fd85f7f25515d14a72b27673c", -"confirmedHash": "1b09c83c0db97075d29d5ab48d334d231b0eb97f5741047c1300000000000000", -"service": "00000000000000000000ffff58c66bc1", -"pubKeyOperator": "0b635cebe199de35ef85395095161339be276a67322c31ce3928b0ee44be35c84d9ab20fb31d833720905b11bd7101f3", -"votingAddress": "puU6TDcygw7CqyD59C1z5Np7GvN", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a84138c0b3b0b4b80b7efd2751cd341206dab733bd427a56c7ed3cf4b82fb106", -"confirmedHash": "5f3d1cc0f4ac66e78d503704aeeb91ff712b98a2c189c76c0a00000000000000", -"service": "00000000000000000000ffff2e04d9fa", -"pubKeyOperator": "81fcdf5adfb8f48190226e707fa1bbcb3350c597026c339203ce1d3d29cc1b1e134a1e7e1adfb59fe84a82c8f918f553", -"votingAddress": "413mQ1gwGyhEEVTQfSwU6J9FhUWW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a84321642e421a44369d1e75c4e34a0a0bd5df7db9ab4f5a8d6c825d1e684ef7", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff036304c6", -"pubKeyOperator": "95e0932f51d58f42b57c76d76635c2514e36c13f9f7fe381653b5d996c5ce37c6d64e93aa1aae8aecbbcff2c3dbced52", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a84aceecae90e1ab4bab78ce3add599ba173a3b907a922017c6fe1cce0a3d149", -"confirmedHash": "964113d3730b3cf7658af43a89799acb6da4c8a2ebf6e8020000000000000000", -"service": "00000000000000000000ffffc2875ee5", -"pubKeyOperator": "8fbe9701924454912de9372e576c8ac8766c99cf1189909e84fa532c1b01372f9198c1dbfd37d7febfbf73d320d11991", -"votingAddress": "2pThAZAPNRpdKfhnUzF7J1GFK1Ku", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a84b19c33a65670f1d9349acee2fe669efcd9e3d48809aa77f600d8f5b2b9ccb", -"confirmedHash": "b60c2dbbb213c99a236e1f30c1d9f41b204f0b13b294c83d3300000000000000", -"service": "00000000000000000000ffff52d31971", -"pubKeyOperator": "0e8c28dc73af06e5ebc82254aecc13e6c8773fe5c2be1c1ac5bd5ec93fac8ce1e6a8893b9929a1f50f02ee8d287537a9", -"votingAddress": "4VKyeYLeNy62HuEU79QphvN637n4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a859cacbbf696f33c4897f3672660d152372c48420fbeb8cb77895a08fdc6ace", -"confirmedHash": "c8ed8258d269bf5e391071d53ed4a4aec43b71985fa177b10400000000000000", -"service": "00000000000000000000ffffb9453648", -"pubKeyOperator": "8810edc7d69618ae615d7fd5eae65b7c47db55e7a85db5e9b3ca2697eae1c6acfa3b7407027c5b91be79ff8cb37837a4", -"votingAddress": "3oTR2TYHeC5Mi89Giyk3yoPqoqFM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a86c226501125fa810ec509068fcf684645bf2606b65b847f953c2cb15ab899f", -"confirmedHash": "e39532b9932244197a08b693832457a76ee1851b0edd1ff70d00000000000000", -"service": "00000000000000000000ffff2cecaaf7", -"pubKeyOperator": "19e4882bcfa6db4dcc00bdb40fcc854f1ef8188570b2285fc3b348adc63196a602f54d9af0a6ce76cd97f27c607ae6d0", -"votingAddress": "jx21AJJvTvmJCGFS2KNjdsjc5Xa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a86c87fdb77d225190dff982ebeeb5d992316c638ff9a0569b2d29c45e3915f8", -"confirmedHash": "31e7e6a2b7772cb4e1fb14053ec2129833b0b84d85476d9c1000000000000000", -"service": "00000000000000000000ffffbc28a303", -"pubKeyOperator": "81c2930296ea5e57b926fe2aba02cf1673edc19f9a461afaabd9d9b4e5c087c64874d664c38b1581ec070e316879d21e", -"votingAddress": "2XXTNcpxYFhA6zKMrRedDauxvoyV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a870c9d8d2e0cb13cefe3e437ffc8b8bcb460f0d3b268c0185fe991a32456cbc", -"confirmedHash": "a87fce24e4a8f75c162ebe2b3a07157759ec196ee8fd48ca0b00000000000000", -"service": "00000000000000000000ffff12e83645", -"pubKeyOperator": "194750b73777643ac8d170cce18f17d6504d790f2108fe204192b875a8222d08f3e1341ee490c9650945a4c238d492b6", -"votingAddress": "3Tunpo4KRvBXZ8MnVTW59z52WiVV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a880db1ece8ef12e0f43bab83daa81bef9f2d0611ac21a091ebd971185ce9593", -"confirmedHash": "25b255bb1ed972a1c09ab82118592e697cbb59b8375f5fac0700000000000000", -"service": "00000000000000000000ffff55d1f1dc", -"pubKeyOperator": "9814638a2eee2709b8e027f5a61fea10a84479dc37c1f0e9ea1318c2c48489ea396ec75b6d82a83b0222dc4fe70684a8", -"votingAddress": "4StCN4XyCiBiXX2KKefeXvsXvBLm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a88314f1a8fec789408f5bb8916430292d2865caad3b93a64849a8e66d66cb10", -"confirmedHash": "f8a4771ea950a67b16b7e98733109321c435f0fbb2a831b20f00000000000000", -"service": "00000000000000000000ffff5fd85423", -"pubKeyOperator": "90b7dd7c99d5b3110f872b63dc8bbf1f1bb94284310206f58b878c71471c843297f106022b9167ed369f3c26c343c1da", -"votingAddress": "2XQrcXaydquuWDV8MF8eitpxFXwY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a8954bf88414f94d7324701fb334a7d4e407127bc015a962bbe4b4c712fc318a", -"confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", -"service": "00000000000000000000ffff453d6bfc", -"pubKeyOperator": "03bfbe677c2446ebdd4d86e1dce20852d882c2ed0ad04870a40e4a5042abfb244c20570aec3e8553fa66002ad8cb4731", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a8a5d8481a2bab0fda97fba2c357a404894070ee6b85f61f235de3a05d8f6fe9", -"confirmedHash": "772f3d1556b293194f3898274545b9a9a2f1271fd6cd5b630700000000000000", -"service": "00000000000000000000ffff55d1f17b", -"pubKeyOperator": "0f6d37a0d3dcab2c7caef84b0919dafe52c0a85da4ea51dccc51f58d33b51f439b75c98da213311d748d2b744f791c2a", -"votingAddress": "46WLufKiSWnEzzpXhEvMoR4d2sbz", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a8a99af3804f1829002744c44a9189638e8ae1384ac322a5356250116824b0bd", -"confirmedHash": "2a0465522ca98da7b298dd208cd3a7ad16becf7641f9e8c21200000000000000", -"service": "00000000000000000000ffff55d1f12e", -"pubKeyOperator": "0c1f9416046277897b1c558b2bf029635f428d5f96b05d1d22abc2928ace712c5ad4b272deaa3c78e12adf5ccb4d76df", -"votingAddress": "BSrXM52nJvah9x92anQhbZ2go7a", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a8ad1ffc7dba3f26df28095cd992de838cebc8bdf4ff0a63a33a3f620ea5cf8e", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0d6", -"pubKeyOperator": "824d13f6a08c4c33b0a75b67e64c8e62455fd2b1f24f13d10c8680e33be51e3e9290104429ca503e2046d5c9884abb10", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a8b40f5be2dbc326795a1c847769c10d214a56c7645cc51ebc51694e8a081f3a", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688eaaf", -"pubKeyOperator": "01ee9f38c08f3cc381c7927c4077c7ecd09565594bb83a55bf088e0ef60a411aaa86368ad6610c05d079b21a85ad989c", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a8e16a90621bb199b4fe40ff439dc0013e4417ea9f9c6500238c2ee932974ff6", -"confirmedHash": "b0e7a319813e46540fb90415f6abbb4c28ed51e204d1e4a40b00000000000000", -"service": "00000000000000000000ffff5fd87e2c", -"pubKeyOperator": "967b31d50939221212d327ed0cfba612e26c439661ba76a81ef32fc77ef97a81a85b124461f235c310efee5bb1b63c4d", -"votingAddress": "3cYUU8CroBvpmoXaaXvf6CbgDZe2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a8ef4ff3a0def0f2980feecf563e284c1eaddde5fff85e57ee92dc605f70720b", -"confirmedHash": "1d381079aa5e6e92d14d8c976873ff27a7ea5150a36857300d00000000000000", -"service": "00000000000000000000ffff9de624a4", -"pubKeyOperator": "11118fac9ce2e7842334f3bd9ad51d33138f81bc864d5c2f49207fed8e4fe2318bb90b1e52a13eafeddff5969f745531", -"votingAddress": "2m5Un9XHmYqnFNXFnDrfLgLkViRh", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "a8f2bbd477245532606425d148942cb3ce0a3ea9cd4f42d6f0d8199a24e8b1e1", -"confirmedHash": "29963cf14ea51b8afd66d9082c9c29436c5f8cd2992fb7662800000000000000", -"service": "00000000000000000000ffff55d1f128", -"pubKeyOperator": "07ee1b39df315909d3a4d125534d1d74fb91e9487f562042354c4f9462003c01e85e3154de836f13e1c37acb2b83fcc9", -"votingAddress": "Eb4vFMAfmBRxJcvdx4YUHk7nKNn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a8f31aef49b37a06bd23a7e192334f4836796f362a8ceca0e7af279367573030", -"confirmedHash": "10b46562d32fae592b017ba577d56a2c4c6e8a0492ef443f1c00000000000000", -"service": "00000000000000000000ffff5fb3f729", -"pubKeyOperator": "984617501997000add41580cd262d74660fc6fe8d1045b8eef5c3096a5d302b895fffdacb3ac45f4d5cc41c8935a38cb", -"votingAddress": "AEoBWn9jrCGUJ4hGKyYUS2K5x2k", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a8f4c7aa384de6b59b4303d9fa0f96101ff02a64aa44254708bdc158404f8ce3", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0bb", -"pubKeyOperator": "124b5e49fd7a3a98ed9abecef8c90d9943408e90961ab48d285e146825421dc4ac0cd16b2e3131473f68ffc0d2a15578", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a9045cc70b62df3379e5208dc3026c63b0cf97898b50ced3c13f15414e19a9a3", -"confirmedHash": "53d3e68878e2c3cfb4afdd3a1f2180b324a120f88b5022eb0100000000000000", -"service": "00000000000000000000ffff6883b447", -"pubKeyOperator": "0d5a5bff1379e632a30a1498f0a3ab1e7a349f7ad8abb89199648bcd6edb3318f592b8cd8b4d1ef2f154aa388bd1a347", -"votingAddress": "2EmZBDoQ1a3iy1REgNv16HTREcap", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a905073f9258654067b656488ba08280f4633d2cbca5600df0d1fa82022f87e9", -"confirmedHash": "9be5a7f5dd673258f1b061f19eb4db77c16a7aa2c1b25bb30a00000000000000", -"service": "00000000000000000000ffff58630b18", -"pubKeyOperator": "07319ec88d7bab2df77fe2b7c30944161316423e4c4f3d07504351308cc0103dba47fdbad6e50ef4057b9b12137a3bd2", -"votingAddress": "mPrUZzeBkuAtxNb7LKCkoaKJF7j", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a9077bcab81476da275e0fa96b49f38cda221b5cb1bf577864128bd51dcfdf7c", -"confirmedHash": "bc89e1d3644686850509ab46fd9b972e457d12ccac88e56d1600000000000000", -"service": "00000000000000000000ffff22ea0f83", -"pubKeyOperator": "0fffae96cececab8ccda50bc3e166711bb2a8ae385ce4af72ab9b499ebd62647c5ab5a5c5f67419652abaca2b5ff0f7e", -"votingAddress": "3McvAzUee8MkDQApEHtTTi388HLr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a910289bc87ae122a9a231e17b264950b1f6954d722f13b271cb8abfe01dd205", -"confirmedHash": "43b3caf59cbc5331ce20c7c1be57c84ded106d611d049e4f0000000000000000", -"service": "00000000000000000000ffffb07b39da", -"pubKeyOperator": "11e320662da70da43d903b525358803f65e2dbf6221e0d33cc22ad0f57281879757824c6c315d0ca2600b6121594072f", -"votingAddress": "4SKsq3cLfN9UgYrFur58TyK965oe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a9301055b6a4894a4c914188160a2998956301b81cf027ff4f6be33b0b14c6bb", -"confirmedHash": "deea24e962fac02cf223dd40dd3f1d84e4375d0d51276cb70500000000000000", -"service": "00000000000000000000ffffa8775006", -"pubKeyOperator": "08d6e9001222cabdee144454b5b4d5df2d5686bb6b3f44ffb684fcfd8e05b113f157b7256f024fd9031137d467ed2803", -"votingAddress": "2b1ddzE2EvsyoFG5guVfrCeHdVKA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a9308985d69703a7724f3cac839755bf595399e91f918153bad77e01450b25ab", -"confirmedHash": "58e240a154a0ac48dfd26143fb8ac7413aa11d8f10f16e622700000000000000", -"service": "00000000000000000000ffff87b5084d", -"pubKeyOperator": "05b5ee76547484ffdf8228943b16114a933b0494e3fc797dd98216fe3832c004e4ab79aa67b7da21b3f7af81ecb93315", -"votingAddress": "4L6BAqREjFFzTSjksdezAjSd6QhG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a9516b174399b471bc46bbfa93dcd21a1be34b2569fa911bfbdd7631b951d88c", -"confirmedHash": "460f4bfcbd475b87cfffc76e1393f9f00ded622b245402eb1900000000000000", -"service": "00000000000000000000ffff9f597122", -"pubKeyOperator": "0a41525e00cca2b8830788e531bbea0a84d2d9078bd997f8482625c17cccbde09d5b300458c6576082edb7f48c83ddd1", -"votingAddress": "2pU4R6eAeZmfWQNyJMuDfM2YKR1H", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "a9681805cce223de1273e6b0f1a87b62863c7cdccd346389565461b56a25bf3b", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b093", -"pubKeyOperator": "16f034ec19f41fe1489e09820054f0ef2e393d1dbde0fe0f5d02158f886944d92e0d3c7be1a4785247caa843b00c6b4e", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a99e42beec1856d4cf65744376d08aeb2efa6b20ca9f35c12d3f047f7f150ed2", -"confirmedHash": "2a7eb17aef9b972138edfdb6960219147b2d9514262ca0d02400000000000000", -"service": "00000000000000000000ffff52d3152f", -"pubKeyOperator": "80150be0739c08ecee54c83825cc1ba076095245d6b9c28aef0e7c7473f124ea97ca8a48fb1a07a010aeafe5232232cb", -"votingAddress": "2eRgVxgYAWZzajd2S8QrtT4ZHH9W", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a9a33aa9bd76aa60f6ea0a6f88e2799c3e8349588a56b790749048edbfeae759", -"confirmedHash": "c7f2ae3721473492eca02b6dbfb92a63fbef83b4f184ec962800000000000000", -"service": "00000000000000000000ffffb23eacc5", -"pubKeyOperator": "86c83c6f3f2295e4e323ff6898e79cc25e9879dced23fe8cb17d94b3ff79c8cbe814dcaa111e7158122db5aa0b8a094b", -"votingAddress": "Lpdk5mW3hdDjVmtBTiSvTxyNP9X", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a9ad51251528cdbd5db74111ab3a334cb976ea6aadf5886f8f73b532839d351c", -"confirmedHash": "c3f26b080798292b644b1b85a1872d11778465c267367eaf6100000000000000", -"service": "00000000000000000000ffff2d201774", -"pubKeyOperator": "118dbcd6639452652c1a10e618c2432d709e7d055c6234be02e144d9904df36af1163dd13acd6ca8f694427d9d1ff436", -"votingAddress": "3ueg6TKbPnre49ZMktomJce3SG73", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a9c29948a0b78b804ffbb7ab7a3a5f23d07a1b63672d83d7ea856e16bda65ef3", -"confirmedHash": "d75c08e2eb41028f17dabb3fd83ef94f62255075ed10be050e00000000000000", -"service": "00000000000000000000ffff68cf9649", -"pubKeyOperator": "88dcb3964c55c96dfde499a9f3930fb1762c2e2d81c17baf6739e739e1f2f88f4ba79a93bd2579d6ae12aceb861261f1", -"votingAddress": "2xGSWkF3Zuvy6gnjX6e5H5ymoNdm", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a9cd51ef1e8da77cda90acbd87e4198e1f9a28f381d62a8f4519879f2f4d5af5", -"confirmedHash": "4027797ee4c5177a9cf5209b80946189f5ae598d960711a40200000000000000", -"service": "00000000000000000000ffff05bdfd41", -"pubKeyOperator": "147c4e31362a6f9460af4c822ca8b32dd365579c4d5975b0782e8ca6f97bb27a9c322c1fca74421eb24b20006942eea2", -"votingAddress": "nz9PGQof59wQDim2tDjHfkthL3o", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "a9e317bb5507b2dca7dab81ef3810828196912ad11f4ff027bf94f953977e55f", -"confirmedHash": "9692da48c4e0b1e7e88203bb8a7760c3d00d5fde1601286b0500000000000000", -"service": "00000000000000000000ffffa877578a", -"pubKeyOperator": "967bf9a1e161c578a21c1744cc1c8ec14e20280d6cf93839c529556a5ed6534e8897cb0c9416b788a8ebc7536f46cbaa", -"votingAddress": "NxdxH7M8PsK5Na9gHQWf97ju8Pj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aa0321a2f9d48bcdfd1e4eea308f7b62380151c1603f95ea4cecd5e5d453ef47", -"confirmedHash": "03d1d943a5fdb894f34fe0ab2ff94f05c91bfb9a70b51b5b2900000000000000", -"service": "00000000000000000000ffffb951a487", -"pubKeyOperator": "16a914b3225dd0205c7bec5678b72bb1fba4dd24b656c5190573e29ff3ea8613cd9c2bc24254aec541a25b7dec324eac", -"votingAddress": "2Yo44yGcisx1LXLMh578VNKMPpnk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aa1e631be3172af168b1dfebaba7b74b34cc007ca8d826acc095c7fd72bdfb36", -"confirmedHash": "d8d036844fc3622c19e6d51c1cc824dfcf46d5160bbb753e2100000000000000", -"service": "00000000000000000000ffff88f31dca", -"pubKeyOperator": "06c3278cc13d1070656b04391fd16b681c5efb47262ede65115bd92f42e81807808d4643bbe9d685a3342573ef023a75", -"votingAddress": "3m5Q97aogCvJXR1dqhdRzHaEmGtJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aa20f9d22a66f1f5873020518c0f83260da0fa9e4dfa214d383322971f4b57c2", -"confirmedHash": "c7ad62af8e01db5f4e139caaba77405518931cf0cf3a65c81400000000000000", -"service": "00000000000000000000ffffbc28e700", -"pubKeyOperator": "86fab62ae04e96b7e79ae7d0b60ae0efd9354fdf2bca740de0a1ba6f13b92f847bb224467ed485ac1eeb7367d60e9457", -"votingAddress": "32WyGCaQysdQavK5uiiP1Tdfd4yB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aa388688c2906cfa9217711dc33128804fe6d9bba8a197aa1be65db044422012", -"confirmedHash": "58e240a154a0ac48dfd26143fb8ac7413aa11d8f10f16e622700000000000000", -"service": "00000000000000000000ffff87b53223", -"pubKeyOperator": "98d478849bb1cc57b40c6dcea5a7f2bcbc2f821a78880a214aade78d68a5caad66a4c0ea1f4576c55d2f17e27673c4da", -"votingAddress": "VwqnNEpQjhQFfiRcEArTv6REY8L", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aa390bced9e90baf945d41dff1e3b77228f583628dca606b31685296e93ed499", -"confirmedHash": "210a64ab8f481ef45ca73b16683dc91ad1d64bd899df5cbb1000000000000000", -"service": "00000000000000000000ffff03e49476", -"pubKeyOperator": "05c26281a9ef2585204a23ed1b57b86c9e977c846ab3c0c650af0a1a5a3ac049698ed8f597bef45847ce2e2715b7efbe", -"votingAddress": "3AzBe9LQh4ryeXWNYajipSqbgj21", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aa3a0dce554a70e1374cb9654bd4a2fe2be2cdaa1a9c423ac64c8026efe1d78c", -"confirmedHash": "dd4e4c655d4cd47fcf67002a8a021624bc01e9244c5422372c00000000000000", -"service": "00000000000000000000ffffc2875ea2", -"pubKeyOperator": "9783b7462412dae70f3851814b19a12f334e123c86872d4988a5225641d6f621835c2774ef811a5352951399dc261d80", -"votingAddress": "3vWRaPJwWL3rAKVCkhF5JV7VR3yj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aa4c16d1ca94becb9a698a6ac29b863692c961df9f63f899c1fe53a2d33b5ab4", -"confirmedHash": "34e19b60aca9eb0e7815503de513ea081442c6fa6415823b0600000000000000", -"service": "00000000000000000000ffffbc28b6c9", -"pubKeyOperator": "893f790d4fd99bcb6381419934a918ab7ec9c20183da200a336cfe2c5dcefc8148fdbe9581002a1beede9a24e265da30", -"votingAddress": "KvXE6bTXx3RqVPbxLeSC7b2yJkU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aa5324d5e64276bc46c63e96160e5341925d81eb2773c8bb684ba610e963015b", -"confirmedHash": "8f03f0966b3925e2b815aeed8d6b9e8d61d7ffbada68d8c63100000000000000", -"service": "00000000000000000000ffff55d1f18c", -"pubKeyOperator": "0f3c5db4d829b4279d3970f628e7567b79063019f722217e9f3ece39557e5626410990629a53916d8797fc772c7cf1b5", -"votingAddress": "3eGUMcNTqz6QjwaEnVFLwHN2EiQo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aa55b7e412b85d7ce34ac516fc09486ac7a0ea9c50b057d732c34e96201a36e6", -"confirmedHash": "dc5f503940089d9fdb01ebf5dbde775ee607b5bb383114dc0000000000000000", -"service": "00000000000000000000ffffbc2815e2", -"pubKeyOperator": "82b394d31373cb987fb6854c86b39642847d27bc980674e3f749a053c1faefbdbd26b5e2287ed4ab952cdfb26d7882c2", -"votingAddress": "2ujtCT1Dn2CiPDiwewbH9FPR7T16", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aa619b0b9232a46311ec238231efc351a7043f823a1dfbaa72be6b86c292bed6", -"confirmedHash": "db6e24accfb09c81ac4539d366f24cc3b163af5701dea2a50c00000000000000", -"service": "00000000000000000000ffffbc28b992", -"pubKeyOperator": "878a04280103f8fd7c0e5795a5642dc4bbb64ded64440d87c81f2e10d1dd0db696c99b228ca80860ed9aab6d13fdb224", -"votingAddress": "24UkpXTJWE95VT1zMfGRHoq54R7E", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aa63496f63dda016938f392c839d0dd99233c0530676108863351695ee210150", -"confirmedHash": "017a433576a8bef6ec115ba2e788213d89d5267747fe68ee1600000000000000", -"service": "00000000000000000000ffff52d3196f", -"pubKeyOperator": "8b5c641ffb86a31d3fb524c60005ded2467b2438ec9aac38752a0c53419cd0951b2ea864d7edaeba7b5b40c54f732e77", -"votingAddress": "3ScAALbE5pwBRdupyMVxcuxd6Kp3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aa739e0dca816fd2b8deca801bdcfffe455e4948a1f058fb5e4729238d556b14", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b08a", -"pubKeyOperator": "14f8be4c41f0309bf562ec60ba5cf4475cd2ba9b07e9b9478178994d6c78b595ced859acd7341280a2201f0a4682360b", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aa75044ebd8acaa4a83a4b700cab10df1ad04e08e639e9fef588702538d6bae4", -"confirmedHash": "03a7d38af9140e2d84ffe3347c50d18dbf35aa5cb8f820b20e00000000000000", -"service": "00000000000000000000ffff55d1f20c", -"pubKeyOperator": "13cc3e33604630e3b215f7cdc4362728e9fb9ad8345b3f4e7378f28585c5310e02103c17431036faf42f9636861ca95e", -"votingAddress": "2d5MbnKDwShLZRDfPmphM6PXQ755", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aa79beecddee2076b781d13f42af0b614d8b186ebec9b283c35fdb28a5f9ca26", -"confirmedHash": "9232d9c64a0317d3ef5f58b6b7ad8ccf3d0506dafda9def32400000000000000", -"service": "00000000000000000000ffffb94535e3", -"pubKeyOperator": "8511c450f6583c51769f955331fa6404822e9fb9607958337e9b023ad5b7b8d189d313391608e3e42434d417356a104a", -"votingAddress": "2pzYSdiMEfC4nvUDMqGhkh25zfMn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aab431349c6d654b3e5f2e4841cbe778d7bbf6779b06529ec25eacb5d86749db", -"confirmedHash": "b4992c640010ee4b12d3f250160c84d1751d8806ce84b90f0600000000000000", -"service": "00000000000000000000ffffb951a4a2", -"pubKeyOperator": "813e8bd1efa30fecd9614245169cc8b5f55592b8840448463d568277923dcb2922909e3eaf96e4bfb38fbd7cb0510c50", -"votingAddress": "3ZQfTeuZ9n7WbpsWRFj5n8b3WZha", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aac7f3dc2181213ccf723de5031213b177470b63ca7035fc21ea95f7dbda1b4b", -"confirmedHash": "300cf6bd0c054034187f06f36c43cd04d3367a4d409430770000000000000000", -"service": "00000000000000000000ffff2efef11c", -"pubKeyOperator": "98ee9ca1e404e565ec2ddeeafabc0b9c98e8be83abc6212c91b94e7f50a9aff028841b6cb432d5e591acccb7eea3bf80", -"votingAddress": "DrfcDN7sYaXVRg6GEEAxmWZFoCt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aafa0d040fc53ab3f1249cbaa0964347e2b6ef758d484f512d70dd4472aa7e64", -"confirmedHash": "87a8bc7d8e26c3ec42e5405811af1d93ca3474f4712303452400000000000000", -"service": "00000000000000000000ffff3417552b", -"pubKeyOperator": "0c265e0bfe8a6fd13930dc4afe475c06b920e971dd5e01497c8e37a49c2c6e47278da5ab0bcec637e72a87965961898b", -"votingAddress": "2G1kNrMD6rgvPVjZ1xaRLaN9mCp8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ab04ff6997e1090770c49a0efc1d58c835d1abfe237dfeb021015be2fa36bbd8", -"confirmedHash": "c7ad62af8e01db5f4e139caaba77405518931cf0cf3a65c81400000000000000", -"service": "00000000000000000000ffffa8775783", -"pubKeyOperator": "867543095fbe15135c514a5bab688153395f79fc326c78ad73f9061cbcf29031e9b7792e441348572f7fc39ca07d81b4", -"votingAddress": "3wtW3PtfYp6djKqeKtCDdvVDhLYN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ab0d40f53a3c83ba1f4c9428daf083c8989e43478414a41d68c340373ee61874", -"confirmedHash": "648d18135ce0480df70fed2d2ff1fb1380f94a18971624a30f00000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "3NKo3PtyxUstRTMvZJyL9RYWahfM", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ab16a35db1cbdf609f8b88c173f0d2dd469f502d3e30c5381865795b0e00d9c1", -"confirmedHash": "5f680c2bebccc7b722364e7e41377601c39874e2b4a7b2961800000000000000", -"service": "00000000000000000000ffffb9453422", -"pubKeyOperator": "11e2864ed0de1ab74282d40aa026b3adbcf4899f2b3bde9b4081d39ecb8a9378211787308509daed26406e53cb34cf50", -"votingAddress": "3Tetn1JRFuMLgYSa1LhxXbUQm2zK", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ab1e7eaee845f19a6479c49ef16264056f651946ebe98a89d3d15e3e31ca1a66", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0ba", -"pubKeyOperator": "8bdd8ed011adf4dcd8a012130bac2e96b5f71a81ded67b7b335357ab2a9a26acecccf108d9bcc1ebe14e141b0ce10408", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ab1f7ccbaa13d461a39e3086b9cd4584933b9d58fe2bfc755e0041bd64c9086c", -"confirmedHash": "f6c92124940cd5268753b926110fcd176ebe80fa80762e200300000000000000", -"service": "00000000000000000000ffffbc28fbc8", -"pubKeyOperator": "10375da59be88b6faea37e77238a1c83d0ce1275612e0999088a1a9070d12bc9db9893f104571410b5e240538b69d88e", -"votingAddress": "TiXje6RHGpdBqfMqQagN8dxGTFT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ab2a6b9ef16c8a1da1f78ea7a23834468c120ff97bfa6b911074854699c5db70", -"confirmedHash": "0d335e73f914f0e1af976387b6538a562e5344700f1c86751100000000000000", -"service": "00000000000000000000ffff52d31910", -"pubKeyOperator": "02e789569394696be01e4d9deaf1d35a659a48f6d913cd8483854f5a9d581019169ad0636bc283a1974f610136772aa7", -"votingAddress": "edY1c52EZSVFw2zFpt9gqc6kaxE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ab42124366a3aca399910ad26c4889b5b463b61bda34dee48d96ca63c984185a", -"confirmedHash": "e0e0d8cefac235d0be210dfe987bd47ed70f5ba460f42f711a00000000000000", -"service": "00000000000000000000ffff12d203b1", -"pubKeyOperator": "95234af9f50e54705a8fdae2cdf1b277c14c3ea53970bd861872d6c87e287a37e9f249fdd1dfdb275e4905535af3ad14", -"votingAddress": "3XRQZfWU8rNPYruCQxCqjgQWttMp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ab7933f0b2df99520e768beda79579ac99d6c541cbc2fcb5449532c089429226", -"confirmedHash": "223ca2e8caa78a6ba7967ab622b7e865a8199e35efe8d5320200000000000000", -"service": "00000000000000000000ffff6baaa288", -"pubKeyOperator": "8fbd32ecbd54db00865c3ef6a784f12c0d070d0d69a162bea0aca0936b7706ca572de8c54e019c983b15d5b1a2429fa8", -"votingAddress": "2TfXi6XGH5inKApeskGjkRkqAYrz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ab7e2eb85c5cfd0c81af834c41963873fc6f191180f7bbf23a36eb7756700581", -"confirmedHash": "15ff1d4366a805145c25dd614d4b9b7cecdc1e8943e255390100000000000000", -"service": "00000000000000000000ffffd41865d3", -"pubKeyOperator": "89a051ed06275c645da83ed250f0b2e19f296f3d289ab5cd6592fe0241fad049dc4ed647c97881ad8f23e5c68ca34a8f", -"votingAddress": "39r874RCS3Qj6MxWCdWAVBRaALgD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ab7fbcfea1add2f13a5e0c8afdf0afcf516a9ebe5aa7777da1e09ee4d8cbeb00", -"confirmedHash": "626c60b9606d99b89f28c7065461de8961b536394c526b680700000000000000", -"service": "00000000000000000000ffffb07b39d6", -"pubKeyOperator": "90cf782bf05ba0ccc65e098cfee09e4e2e6bb47c9bcbf2c275d39382e2390109165354cdaf011939facf709560aba56a", -"votingAddress": "2KrvyDUWCJkTkWCP1Lojwyx9uhJA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ab81dbdc5fc02a4452b9a963712b97b3fad75dafdd3d13b028536d981f96aaae", -"confirmedHash": "11a8c8a8e63dd7564218f519f64c2e32e5e52ad3032d23150e00000000000000", -"service": "00000000000000000000ffffc287515f", -"pubKeyOperator": "0937df6a7c7037fb37fbee0a0740e35bed81ad2b0adf6dbaa2410917e585515097df9ca430fa249886648d5b3387a64c", -"votingAddress": "47LFtXdPk7gCV1Y524WTcC2dpoSq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "abdcd0d3db693666fcb87adacb24d768449f27787593e4adee48c17a21a033f4", -"confirmedHash": "8d4a6cb31265062c2575854738dd8bf43bbf520a87b0866c0200000000000000", -"service": "00000000000000000000ffff03d2fb9a", -"pubKeyOperator": "11a6ffd5fa0d02c3f04d73b72e20e970c1d3fc10f210ceba4129409b22160a20bf6f9b24a43742b3451582c3ca1b3e9f", -"votingAddress": "xECQRgcu5rb9vwFsx9tpXKqwU2Z", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "abe594953072b4368d00f85f58c7ece3ca8393456fd0ee04dbb366a3c9d140b3", -"confirmedHash": "b57ce736dade8b7062f0ed4ad64aa92e5bbe20f726d419350300000000000000", -"service": "00000000000000000000ffff6ca08a65", -"pubKeyOperator": "839753cb42c43ec8dfb379e251d8579cf394c0952017f27a87a1395caf152355bfbb1cbbb531938fabed9ce61864664c", -"votingAddress": "2ByACsiWuPvRsio5rpW1CfDbLAP3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "abe7fea37b169075f0988fb6dc4e920f5337e5d9760deaac3747c0b7f2523793", -"confirmedHash": "6053284d7f9c4640ffc8b666d8cbe20fa585000a2f33db331800000000000000", -"service": "00000000000000000000ffff9df53b4c", -"pubKeyOperator": "80adf67fb1bbfab62a4833370f04b3d41d21ffd97fdf42890ccca72eebae21e48e5507fb0af67f4b9fad047a5b7bbcc3", -"votingAddress": "MnS5iAXd1A8DcC6vT7zbo7gJ7hQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "abea730ac64147042775b6e51eb62333101bdd4d64cbcc436a1fd83c06e90427", -"confirmedHash": "5d84b6e1726a08aa032fd3456f32bdff99a972d433eed9712400000000000000", -"service": "00000000000000000000ffff41144a1d", -"pubKeyOperator": "09826c490514422aa90b27878795961fa29fe9be9e256335bdfb17168ddbeed694fb6a3e8e2b2f98d9a3b0ed4b2ac532", -"votingAddress": "JC4EAKe5XiH1TMqMFLhifMhETEp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "abee725dfa4fee7a7c2f917574685048f134e868a1dd0c7897e987191d0185b4", -"confirmedHash": "8571c846b034755b3eb507ac5d5902d96da64996cae2e2395400000000000000", -"service": "00000000000000000000ffff5fb7338d", -"pubKeyOperator": "10afb4018f009b5700d7ba2f4a840c70accb413d5c47fe39db25ebbdedc7c6b2a2ad2ce36b1b12c5f2b74342d1e913fb", -"votingAddress": "2CewdCREvrwaNpg4h46wiVBziH79", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "abf62de3df00b1e0b4d609c8de466a1e75b0cab94fc2164f6dffdd1a42c24ede", -"confirmedHash": "a3dba9f8c6ef76eef1128001dd671e2462fd49ef40ed379f0600000000000000", -"service": "00000000000000000000ffff52d315b1", -"pubKeyOperator": "926f2a61ba75c2ecd369692848e138d8d18b2474422eb1865e044b1078baa361cbad5250760bda6c5470d5181ab6c84d", -"votingAddress": "4AVrYgZ2ghczcgnXfZJnA7NfGDph", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ac227bf35ea5116d73898afa8107264165faf03faff704872afe5c7f99121775", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff03614b1c", -"pubKeyOperator": "148205533dd66621cb8a7967b659fe974e8f77c8c3a3f0b3eb27304cabd5203384f18b3d0dda78fb3cb2bd838c8473df", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ac309f2d10c49cd9d04c71a832365de56f7fbf9d3b62ad2ef6ca1ecae5b84458", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688b031", -"pubKeyOperator": "9433d4e9da7f05fedd0fd22c2be56c0b42d0532acbd72353aa9e6526af6f2b3dace983f993f2ce8d54f418b2cd653a15", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ac3c8ba0b3055e68aab4b43e16df997395303194c5de3b81ed593c8bdcad6a2b", -"confirmedHash": "52f26949ecb8bb58212184998dfcb2cd3ee891bb0c08fa300b00000000000000", -"service": "00000000000000000000ffffa8775302", -"pubKeyOperator": "14cccc0d63a1cb8b5e434442cd1983d8a19d31ca5bb0e32d1401e4fab9b6919363dc7674faf5a854b92a60c1a615471a", -"votingAddress": "Pdmjmhwa73BHod9tUvStxHM9Gas", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ac6b89fee0f58ff6b23cc60b24391ff4e2fc5e8b9a58eba9ef4d3909c3566a1f", -"confirmedHash": "daa52437d85d8b77dccf8a31760e0be2a83844e3c476ccd21700000000000000", -"service": "00000000000000000000ffff6baaf0ac", -"pubKeyOperator": "816d2fc2829e3242c49d0b143116650110a2d10fd230f3e5e4ef5a9ca11f350d75727603a3f5b8d88ea90c6c795f5e26", -"votingAddress": "gHDxae594kfCikKM311c5rSiBbP", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ac7082cdcfce171e027fd52fc0d3b750e5298b36514a330cd287fa3170d2c076", -"confirmedHash": "3cccd6882d6b559b7fb2cd5c906d754ee1cc391c0c699be22000000000000000", -"service": "00000000000000000000ffff2d55752b", -"pubKeyOperator": "13ac7aac117b86a492afae9fdc430dc2f47824e529039159a15ad580cf610eb564783e1c9f7cbc22b3816e518c6291af", -"votingAddress": "iYMVLUPck5YnqnTJxmVUz5S9jcu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ac7a8dc2fc36c5abcd823d2d152c3872bcda6c1114d1702f974fde08891f9716", -"confirmedHash": "44f841b78b6edc3c277afcbc0a1538d99c76a03e0baef2c31700000000000000", -"service": "00000000000000000000ffffa5e321da", -"pubKeyOperator": "0171ba1031155b9c25b156794c2aa5fa7716c754318f6bc500c7f59bea8a04f41326277c4469ef7d35c39007a53c227a", -"votingAddress": "3SVBfzG1Supjiqdc3Roq5dVKHkEq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ac7eb7e63d1647d57c1e19e0af6cda6659ca4ce97346c3499922b610ee3d89aa", -"confirmedHash": "06c45659dde3aa5dcc76fdb0b0ab6432695fda4cf54bdd350a00000000000000", -"service": "00000000000000000000ffff55d1f18a", -"pubKeyOperator": "8f3a813aa68a07fca73c616ea60d0dfbc81667c24a8ac6e6d4c9a64c6d162d5738808c5eab7138742a3d17c814a8bf94", -"votingAddress": "arcwAPtXKog2CwoRG4gMAAFSDsc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ac868a405b3ffd5858fc46ddd91fa32bfc607b619a96707488efa3a422e5eedf", -"confirmedHash": "6e0d9a7d2fd6b6b5fd66aca47c693713f8c2864509f703491b00000000000000", -"service": "00000000000000000000ffff5fd87e25", -"pubKeyOperator": "03bee7131abba3abd8af6ff80002bda74732ef3b1bedd3459f8fb8f2ece4fa78a5553f089b7ced1db231963066d3d387", -"votingAddress": "MZU4CcdFjrJHubRqpGXVAEv9Sq2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ac898a69e4260ddba3b76dd722bfd1f0ce92d2dd680adb150bf31b07511d6188", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b067", -"pubKeyOperator": "0c1344cb79e5f6f5ca566d6e28a4fa89a43a37d06af20f58bad3f699a55eedb470d2f29a8e73f0fc5d49bb9cfea4913c", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aca5b0f834cda33c6576a7f9865f7bb0e3cc3e1771f07e0a6c84fcca7b23f18f", -"confirmedHash": "f3da921eb62d6c7890d1b13db1440dc6e91e2ed301db54f11100000000000000", -"service": "00000000000000000000ffff9f590d18", -"pubKeyOperator": "0b0b2cb8233aee4d5f13a38bafe8b797bfb3c0718612645a804a181d2ad44cffb1ef552e37fb490c1965b2060e6d05c9", -"votingAddress": "74Z3BCbzUHmo3DxcP7fdWHDzivM", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "acafa57859c9bef3f843a7047ffc7ba9d0f26615b707c031bab5ecf004646532", -"confirmedHash": "0c685c8c35c653fbef53de6b97af1085fe0e01dca66531660100000000000000", -"service": "00000000000000000000ffffbc2815f1", -"pubKeyOperator": "88b9eb49c9f971a529312c127cb0367e80e7c549510771faa35fdd31777bbce1c185dc78b0b80114f2365213fa968c7c", -"votingAddress": "2ZBeFBaq9PGaUCbFK5tp4conzxB5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "acd3bfaf36079afddc4fc76db0a763f52f9c3b51fd41f70e09497ca56978a99d", -"confirmedHash": "48d5c668bac6bbb02657a2b36c0b295c347875ffc2a9da8e0600000000000000", -"service": "00000000000000000000ffffbc28fbc9", -"pubKeyOperator": "0e65e278edac9039f5ef053680a9caf350bbd328f4499891ec68249efdbcc88b04190ac01c7d1a9e638ef3bdb859c8a7", -"votingAddress": "4Moz2egUZQttwT5KGmTvFDRQkrei", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "acde2126dd9bd0ca4c11246ebcdba487e0e7d0090423bde31a22834f070fe905", -"confirmedHash": "91a6595f7fb53f1f09f9df2e741120864738144ed1f9572d0f00000000000000", -"service": "00000000000000000000ffff55d1f278", -"pubKeyOperator": "074006142a7496cc0278c175db7765944e2caec5d9faec09856d8bb107e56dc7dfeaaaebfb7342bc3005e387ba123075", -"votingAddress": "39AuJw5SMXsiMjPxDCXaFT2WUmcn", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ace08ebb6f568bc9a2822c4aab80d9b6c2d5ecf0a10464839053b7993907179d", -"confirmedHash": "4c87b9728c173c6f0aec2b91d9480c8617018e8939fab8540200000000000000", -"service": "00000000000000000000ffff9fcb154e", -"pubKeyOperator": "8d553575dd735bd246b599929510ac4dd86cefd19569942cae6496bb229af8964a3a4ecdc39e02afab30b1950b112497", -"votingAddress": "3Q9Rih2YQXhA1pZNeVzazgXhtNbY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "acfaf1f336a659b9f679ad9bd51372056c03305f435638b79f3bc1328c6ef5c2", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688b733", -"pubKeyOperator": "0d013d8df9eb3a635d22455c5d830eee1afcc8a877cfd9b7812a5644e6a4a7fc90759a695a804238c7896f4516ba904e", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "acfe81fe5e966699b5caba3b03eaba17a48c1522a42c0f4e1da2f069bc3dd3c4", -"confirmedHash": "2a22ae19d9135cc05324f48db8b45a9c85f2ea2839995a0c0c00000000000000", -"service": "00000000000000000000ffff2ac1b28a", -"pubKeyOperator": "09e79b8be90b307760e33f83f79365614622605359e4d55c555dc6a6b994fd5af62c7afaf1a28d66624903adc59a51f8", -"votingAddress": "2NRMKKe2nwT5hJz2z4XsEhtbaLSL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ad05691c206055ed4f272c18b3491940ff5bf8eae222a368da35e9aff34c2dfc", -"confirmedHash": "ca65c0760a3d6be9213e9d1f24b151bc5cb552cc721122903300000000000000", -"service": "00000000000000000000ffffbca66740", -"pubKeyOperator": "19fd0bd11d717857e9f1abd50dbaf3d54000b9fff555c8135dcf77e6026a8262265020df8c0baa03a83c0ae32fd56416", -"votingAddress": "VzTgopzSqTWfB3ccoHjnHecdcYw", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "ad06358c7c350ecda66c5e02e47a12c6ad662a4e02402c30b462b0883d40e610", -"confirmedHash": "1fbc3947d68fe60b4c049519c2bc07148729a9d7a5d0ce8f0900000000000000", -"service": "00000000000000000000ffffb23ebf0e", -"pubKeyOperator": "97c96120ed607837530a071729c7ef1f89fdf0707bfe41d63d33d4720e0a0359e664d5e5775572cb6da3eebe81faf811", -"votingAddress": "KNEChRK7ctWm2nWaYCpHQoZ7756", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ad24d2e61a7b688b6d8a3ce85bd747e42aec7f3c9016da2c8a0591251bc776da", -"confirmedHash": "a29c74fb3479bbcc74497d6602c50921f2f28889b72c7c733a00000000000000", -"service": "00000000000000000000ffff52d31960", -"pubKeyOperator": "100a733c6eff643d68f8af2db4ae89f4b191b042b5feda21ea7237a99583a51fe904c57b3d6a7d998b6278537bffa4a4", -"votingAddress": "3RaEGya4Bv4nNbe1fAirzWZ1gJ66", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ad534a71c392edd0a7bb344e44179ba8a009895f6b238dbbf6f1a0086e431e80", -"confirmedHash": "bd31f35c5cedbf07c6ffa716f2a3acf8f725ab42af8758740500000000000000", -"service": "00000000000000000000ffffb9e4539f", -"pubKeyOperator": "05a6d65c3b220b06e553331728fc43a277ac1b07762d4be76916e898fadf76563d9a9a34a8d93d43962d6e7a879d8af0", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ad637133f2779b2d554432a36597c325b05ba57c398898bf9b1f56ea97fe2928", -"confirmedHash": "f2912fd7d670becef535b9390874cf32da419847410665fa1500000000000000", -"service": "00000000000000000000ffff87b53221", -"pubKeyOperator": "8aafb5f1da52d4c5fe2a9d4a1da5eeea801911c3ee1dddc63168e68e94ecb48ddb9dafdc7c1ab16267cead406808e965", -"votingAddress": "CVVpU25BN7JhYDymZ1xj8knf71y", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ad6851d89de10c5a32003167b3c776d7bc64072f28daae78fb3e875169c4c3b9", -"confirmedHash": "07233fcc88292b431f76355f74ac071169aff8ba466c8cea1000000000000000", -"service": "00000000000000000000ffff2f627b6a", -"pubKeyOperator": "0b40057db27aed533187cfc8df35606898b52abca254080c5fed191e6e604d2fbd0a2c61200789fb84678803efd175ea", -"votingAddress": "3epFCKFzu8UvzHqLzcHrDy7vc4N8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ad7ee87a8ee8cd8aa2901d5fb2db0e4cede8a3b9a11f1a30399c4f216dbdb0f7", -"confirmedHash": "926c92598103e4f12bfa8fd8fe95737dc4e6303d12a67ce61300000000000000", -"service": "00000000000000000000ffffd41864f8", -"pubKeyOperator": "87cd1eac172b1fb108fb98ca70e58659da59fbf5ced7f1ebedf5ab838294e25814ce857daff97ebbe047d62d1f2c1ca3", -"votingAddress": "M1fP2Qr3csCfQCCsrAarsrMfpoj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ad8d7d88c9d75e0166d29a9867bf41e04e91a5d9f80ed01f4be3d46069252709", -"confirmedHash": "d117824eef4155d979434fba3ba7e972dea3e35045fdff972500000000000000", -"service": "00000000000000000000ffff8bb485a4", -"pubKeyOperator": "966373ca8bc9de6528cc9e45431f6d3806f6d352913d3a2fdd12e2962a08de74869f03e6e8d7396e8ca349227f3a0340", -"votingAddress": "3RPXYoP3N5oiMM9BRt3mYPW1Je4s", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ad906bb493e4c2db8cc757a227644f89583d720114f8d105a97fc1fc14b6cc83", -"confirmedHash": "67275c22573f09678a0f91dd9a3d1275714d2a6b9b7132072600000000000000", -"service": "00000000000000000000ffff2d56a3a0", -"pubKeyOperator": "8dd573605637b46e02e13d28188ed6bae3e34bce03951db830bbf1bf550dd5caaec34706bdfcb4274155edc222528cb8", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ad93ce538eaa7109bdbc3efa9f375470a5d1efb3c0800715088d06c4727f41ab", -"confirmedHash": "bf9d4d4a79ab909a9eca553750a2735a98c5e4ff1836292f2200000000000000", -"service": "00000000000000000000ffff867a3d8b", -"pubKeyOperator": "03906bb0d40b3f4dd62cd6a4f86e07e466206d927ec25b3341e57ee99694514a1be6fe3d8d06a18ef4b6d2e928ade98a", -"votingAddress": "2RLjriK9WG72eMGa5Rev8YyXD7xP", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "adb4189800b83e66560cc3bbf07ab1e9afedfb087b6b0c2955b99925f2a07fef", -"confirmedHash": "cb849b00457dc91e0d89f6d647b200db3807db7b83d5992a0100000000000000", -"service": "00000000000000000000ffff9b8a96a9", -"pubKeyOperator": "88892b797b1a9b9c414acb8ee59317b280662747be8348e2221e0730824a2c9b76718645d994a22c63ce97294a92de4b", -"votingAddress": "4GnSqK2svjRrQ5AMESJC7gK8qzcx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "adb9079e4a9971734e5808bdacb2293e29171cf4684cb125cf5cc0c5eb9fd1b2", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b059", -"pubKeyOperator": "8dc3e7774b85393bf92e021ba950ffd0e8069af1680b9efe9580ab8db03c5937ae34e3c9e7e901791f418999864262ce", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "adbe65ab9a47d36cc54c198eabc1d480a5bcc3ae5bfc9eb9a9986b109d0d8088", -"confirmedHash": "dae9dd7ecc43bf8db0fbcce63b81b5a539d8e9cb21edd9bd2400000000000000", -"service": "00000000000000000000ffff334b8fac", -"pubKeyOperator": "17abdf552b7da89744ec9ebed5f8b7b6fb96742e3a3f7af672c2bcf57c98b7433b349b7d4f814c083d766dfaadb3d35a", -"votingAddress": "3ziqjSD19EizadvAm45QVRXxRgcX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "adc54ea371307a8a74819a4f27075e64968aafb80807842b2ff2a13adf03c39c", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff343cd2aa", -"pubKeyOperator": "837532fbc77f37e87615d0667aea3b91f6955b5081532733cedcbb7e7659dc5eb2ab74f66f5edb5b81ea3b31bf9de40c", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ae060187402b064b705e7e522f3d287619c80dd188f0aab7eeffbd0321945cf8", -"confirmedHash": "a0c5fc8359622587ee670c2f4ee673fb44aff2950ac5bb811800000000000000", -"service": "00000000000000000000ffff55d1f25f", -"pubKeyOperator": "193dc42a026bd53f772bc5478ebeb92bb65e2278bba3e5651096ed08a98128491b93b1bc0119618340355ab6ed33e594", -"votingAddress": "2sTfnCK6Tx2YQjjqVamLouSUwyVG", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ae0d88f18965847bbe358e45c963f0c2f50385fd240e583d161e0adf386bd5a1", -"confirmedHash": "22d1e1eac1d96ce5f817a479dc991518467d0a855ff0bb1f0900000000000000", -"service": "00000000000000000000ffff55d1f14f", -"pubKeyOperator": "0f5029dde490c93271d30b303a21fb8bbf35d66508265803783626e182397aaee7edc2fb77fce6e76a6a9c710b5fb89d", -"votingAddress": "2hB6bRgC4qi3sGwUW3fDh5m83mXJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ae14af0958c31de42abb11108bff03dac3ba35e0518b4e4ef5334280b20d3474", -"confirmedHash": "63fcf0201e6ec592a47d1b463b986a7518775dd2269fbc370100000000000000", -"service": "00000000000000000000ffffd41869d9", -"pubKeyOperator": "1441cedddec825f995fbfbb4f23079f585973a5b03f8c82998c189d7ae84ea5e2a06dec943535c2814b090295ee656c0", -"votingAddress": "6C8cs3FhrQpT76cHUGw5dZaN6Er", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ae15c35efb8d638f227ed294035b58b1d1c78e1bbbd284716fbc157dc57d63ef", -"confirmedHash": "381564ab934566b10a4575635c3cd3e2b976a5b8b7a2c9911200000000000000", -"service": "00000000000000000000ffff5fd8af80", -"pubKeyOperator": "1063d558d66383f8b7d1542aafa1e0330748a63cedea6f30947f86bad9caba906c75b5eb358acf9d5c35f3e623d55513", -"votingAddress": "412umGz9xy7ta87U9XxF6Rr9sR1N", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ae19402ee0b474630b79c88d491d365088720f58fd76c6f4dd20f9a77926d7a9", -"confirmedHash": "635e82d5edc1ed8210db7e0a5fc2aeaadee08a78450750d41100000000000000", -"service": "00000000000000000000ffffb0df8283", -"pubKeyOperator": "0f2c9884e8c06f79d75d5cd70521523ae222fca6c437824723c8d40b1116bc990e5b105c668fc027f3a9c5fbd8ac6d78", -"votingAddress": "4od7cYqZNJqKKqyCUu2xRneAhiS", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ae6354f71676f02a36df052bbc6b356ffe3e30bb68c9bd836c2e8acced84859d", -"confirmedHash": "2d87a251ceee74a5a51f6ea456f6930949de9b3db0d0ff770300000000000000", -"service": "00000000000000000000ffff3e4d9da4", -"pubKeyOperator": "95cd959075a6ebbe7ab265593ab7b781d768ac165af7750875dd4db01fb88b80ab410d85d4bde82dab3f5d9c4757d4a4", -"votingAddress": "uTrXZg2bXSYRromuvXFoMLorzNK", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ae6df28da8def855fe77f3a22f2f07eda6409cdf008cd13d4b504d9a786bda77", -"confirmedHash": "ab1dc6d92a15b9b4d7e748d5d6671b7009f40713967c09930e00000000000000", -"service": "00000000000000000000ffff951c100a", -"pubKeyOperator": "894f52c9b37249ae3e9bd60d21103a46a03328f0a2954e3245131930794065b57a1744dbd8d5e16fac513d3421538c96", -"votingAddress": "4Y6QHjhVF7gcWdQQqjdaHQ4jxkB6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ae70ed71950e3fa316de93d4f9232f15ad46b0ed59e76066e8ee86c2589aa124", -"confirmedHash": "dbe92e44add5609df93297fdd82b438a3d13b6cc608b89eb0a00000000000000", -"service": "00000000000000000000ffffbc28b240", -"pubKeyOperator": "86df3cb8be2dd8ffb766330099593c5e271cee4960aa029d4d984a4dd394918348e8912e6765cdb87bd8a3ed476be8b4", -"votingAddress": "YAGS59GTv9TfoTZDPzkacbSwZg9", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "ae715d4590e4c3ce6577f1ca37098480918e19bd4827288b6d0af9cce2b4c159", -"confirmedHash": "90a77c0f96be31ac4b73c5706f5b6f398f947073b0885ff21500000000000000", -"service": "00000000000000000000ffff8b3bf55f", -"pubKeyOperator": "97c5728c37f74e27b0164244b6fbf9291029477286e1885e4ae37dcda9176587697dc1d7cdd8f1191602fc5b53d56af3", -"votingAddress": "3kty7jTSdFQ12xUQKRyFcxiRXcd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ae873617fe6c18096dc8f8dcb8f2bd31941a7ac781d25a6d3575997666a90fd2", -"confirmedHash": "add5bf5a6fc9799f64dec133f3c67eaf07135418adf3fa8c1100000000000000", -"service": "00000000000000000000ffffbc28fbc1", -"pubKeyOperator": "8898a39b22fc9e23db59fcc00efb970866f947f289cc549e3ef0c96f017f599447112c28bd26b43bac36aa0dbad4ccaf", -"votingAddress": "25gpHgv7HiofJuNUK4rdcufYcGct", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ae8890373f2639fc20f46e727264f5dc2520f74444f773e2f296cd4489bfacea", -"confirmedHash": "54ca220dce6177184e60d8a3194e7046c2aad4e4adaf83190f00000000000000", -"service": "00000000000000000000ffff52d319cd", -"pubKeyOperator": "07c5655490e676566d7024cc967a0c9de1a74ed0eb23d09735f3c6084ca45e89de36ab916be5b45276b178b77de17c39", -"votingAddress": "2okFX2N4Y1jub8zvSvgTe2yZRP2a", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ae8af17c532759b8eff7ee9d65939404465e09a84066f4523105aab4bbd7e045", -"confirmedHash": "4e2ada05da4aea661f6c17ff40e5ae9c405a8e29702e0f172800000000000000", -"service": "00000000000000000000ffffa516ec5a", -"pubKeyOperator": "8eedd2c3ba53f0cf6ad4e2a4bdf5d1b85fba8288ff16d146cc1a1c256f39b1d51dda3f758079814f4686c941bec99a20", -"votingAddress": "2SUmKa3gvmvTYuYqcEBgufcYEYkd", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "ae969a012daf539fd9605a9a759e2fba1b6708d1572d2ea3dd69a7914ba7d803", -"confirmedHash": "c587b3f1eb9fab25618134ca0661f3bdae35611cd2d729141c00000000000000", -"service": "00000000000000000000ffff453d6bf4", -"pubKeyOperator": "9520c21e08d7889f7ce539b1eb3b1ed06dbabcf3772bfb2ac0a093376e803e31afbc18422b02de47aa5437567f8885d7", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ae9c2cd9a999a2752380a8760a4798004f4b7ce417aec3c9d85918bc24ff8904", -"confirmedHash": "f02053715b362716e051ba6dee3c67716386f84b40b210910400000000000000", -"service": "00000000000000000000ffff175385c4", -"pubKeyOperator": "92087bfea2b65b808c9c070733dc06b32142669cd2164bd51e6afb016e919ab4cf92a6a1fe058063bfbeeec29b72c7fb", -"votingAddress": "3QyQagR5TqmuK31nfJPDtG4eWrJv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aea196eaf3a69788f49ea361e503799860706825c05f1c908223b154975c87ba", -"confirmedHash": "e5a9e5c645a067ea29c0c6c411c40c565be8659f1631864f0f00000000000000", -"service": "00000000000000000000ffffbc28fbdf", -"pubKeyOperator": "139781ac59f26b0717a57089a64920a38a6b8ac690e17ac564b0d6c0c9274db92ee4fbc7caa13007f380bc39d392b169", -"votingAddress": "p289xyfKK6tD3cL68WerFYyf9qw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aea39780c925a043e9c66cf3943af437975ce0acb419d21e5c54f012c548529e", -"confirmedHash": "4895c7dc69ed2216c351dbc1589543cea71bfd62eb4b1c360500000000000000", -"service": "00000000000000000000ffff8ff48051", -"pubKeyOperator": "0d2be51f5eb98454b2a4358c80b0ea3c88ae5fbffc48d9e931c0ade2c4d8e84f83164a194bb08e30c4df97489f7fb9c4", -"votingAddress": "GV949i8bMXEBCQEPpfhq4QortEf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aea6b03682c7557cea81399682d5b2c5c9e8caad9b8f62b5c969caa0018058bb", -"confirmedHash": "86e2eb4c76fdf59c4739bcfb6257f0085c5ff0db30a72fb90500000000000000", -"service": "00000000000000000000ffffb9edfc8c", -"pubKeyOperator": "87a78416052b4472cbf4ec4db9b778224bb72b589dc8d95a200a457aef47a0c62b41cddd3b737bb74b8edf9ba47171ec", -"votingAddress": "2wDGAMXddBqKmTkQ5RMDjgj8kPCN", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "aeb500ccc63a61d190031c2b70c9dd935cd95f1b68a155c6e620546835083f1f", -"confirmedHash": "3ea62fc353bb2141f7140b1acf6b5f9e59d097698249973e1400000000000000", -"service": "00000000000000000000ffff2e04a272", -"pubKeyOperator": "8b2f6ff23b65c7754580b8f847370164bda07a51e240c336e1177ac594a22cd667e4a827dac2552f147f5af9cd3e0d14", -"votingAddress": "47qstSVJupP1JY4iKWeAGgTHp4by", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aec256435f8de2fe27a68822638cacc6bacd07aea2fd357512c690dff2711885", -"confirmedHash": "65043c4ed9e6c9a6ae5ea00bda39dff568f6fc7659651a381c00000000000000", -"service": "00000000000000000000ffffbc28cd02", -"pubKeyOperator": "04a019f629360436dcdf88117b9d636b1494bc4b20e9aac77f6f62eb2f99c06bd18b713d23e005e405bbaff26bc34022", -"votingAddress": "3jLD6zxow7eXaQDHZ6eHGE6Eo3Z8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aec4bf07bef409d4b053545de6a330e492bdcba988c9b7ecefa66d9197e05299", -"confirmedHash": "1b1cf4cc348cc176518851f03e28c77ad658bf8bd42453772500000000000000", -"service": "00000000000000000000ffffcfa74081", -"pubKeyOperator": "95ebcadd2203812d74f1bcb96331e925376aed547bf9d93d09035e30956289763aeace9e0ee48862c4b9bfe91ef28e05", -"votingAddress": "3xLHgTjqfZLkG1UXCH8Db138wUVB", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "aed10edde70fda76f968cae40ec48fe0234181d2488daf677e0910c236a688d9", -"confirmedHash": "b85b50ccb6eba87a9d6292fedc95948d5ea9bbaf0612d9000700000000000000", -"service": "00000000000000000000ffff5e8294ee", -"pubKeyOperator": "948a385deb58605517148c528ce97f531df38b51726e6a817dcc79c09a4491e1a28186dacf20d95082583e8553f7ae44", -"votingAddress": "wzLLisUNUaaJ6vmgj2DJLS1CgDi", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aeedf52d7d95e689bdd8d5d9aa43174be25ca071bfe94f1410135e5d786fabad", -"confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", -"service": "00000000000000000000ffff5e82e363", -"pubKeyOperator": "0c75b044b75af0c890613a6884bb5f98a0347160e55cf210e7056cfee66f8cddbe6fc485ee525c3b43b5a4a8cbbc0fb2", -"votingAddress": "32DyXqrVkf9vXRavahAuxPmtC3ZJ", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aeef7174ade91c392cbf9b12f589de9e3a7fdc2ca19b9ddf1d434701bc1cc589", -"confirmedHash": "ade6e48f6e6bc86a5b5bb7ba9647586e127bc537547ab8e10c00000000000000", -"service": "00000000000000000000ffff2d20edad", -"pubKeyOperator": "8fd15a143dcf5c58545e81388b94605dd408da1b6431c6e54e229c6b259112ebf5d99fa6376d96f9f125456b3a6e6722", -"votingAddress": "3JrTagCx6Vc9tBiMBAwHPjmcg11c", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aefe678846d2459f559fb953c0e45a2b29a7d3c7594e9005720bd0f8d2afd340", -"confirmedHash": "461fb6e17a3778a7e6f1f2571257b2afa332cdcf7294b07a0400000000000000", -"service": "00000000000000000000ffffbc28fbca", -"pubKeyOperator": "16cc649c116390369c3eb30d72494e1be1c86375d7cb97de85443e3f5f0f8415e4750dc9c6d855de76278aa15296de44", -"votingAddress": "4SQwjhAUjmQzEp8ZfzTLVEfWxFhU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "af04d2118c16c099a106abac9d8d83419a4b3439f5db317e0a978e86a44e5717", -"confirmedHash": "fe79c6d2d1fd1c9311b52cd016f4869e644ebbd97a3ac0281200000000000000", -"service": "00000000000000000000ffffc21ad5b8", -"pubKeyOperator": "0b1e2e53a8a0a36cd78e93cf2cdb49cf92375c6ccb237684077e324e6f0ae9da7e12f7651f87a6b4b6caaf9657ae40e1", -"votingAddress": "33R5CCQkj31Gx8chdJi3RHLU28C7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "af5bf05536991739e118cb83768e132165e3b3cd28e078787f70f4108faf14c0", -"confirmedHash": "7fec7569d4486b6929fb6743d11cd827425b0153794d79511b00000000000000", -"service": "00000000000000000000ffffa51676cc", -"pubKeyOperator": "99dc46b3b77144740a64f5dc1ca597424ac998d2a00e1eea6b248a02a5a53f9db0e122e598ad93d83b046ba3105d2f1a", -"votingAddress": "4EyJqdUrrdo7bo83tiZPE8poMJ85", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "af75c0ad393cb55c998df3721e673d4a852d56726258185b3c06c57ac1169878", -"confirmedHash": "2637304a36e8705f512c6a6022293a681d68ba521ffe083b0d00000000000000", -"service": "00000000000000000000ffffbc28fbdd", -"pubKeyOperator": "0535b2dc13276aaf4f301a16f3c2f4d81e46f3ef5a8f7f56f372e2555956682d74f0c8dd652e49d7da7586842850975d", -"votingAddress": "3shTCWDJKunNLQrhidvbtZGJ9T7G", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "af8572301ac8f93a2ef23e4f91fa2a24de3d54e999287c5730b31e91c1087d7c", -"confirmedHash": "1e59f2ace7ddb0baa2eee8a2059c2bafe7a818ed6bbf0cdd2d00000000000000", -"service": "00000000000000000000ffff4622d320", -"pubKeyOperator": "0e021847303e8568f35351c9d1d24c2743629ab3119d9431ae57f4ae94a0db4ad157bbaaa48a132afbe21c2df4447e1b", -"votingAddress": "q4XRSeGxuYV9Zqr5eDws1TdJzLE", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "af86ef600d83d05cb5c673c363b0701a609ce5db7d8d2c15386ad82dd57d8ad4", -"confirmedHash": "d57fbac48102742cecb076cb448a36962e291769ddd8735d1300000000000000", -"service": "00000000000000000000ffff592fa09f", -"pubKeyOperator": "81b32e793df2c5f34fd11de39d2b0071f6e03fed973245fb7ef9dc8755528a50e3310b5ed719a7cff0ae7f55f925d92f", -"votingAddress": "4ZkBL2tfDAAnUhGJPm6K9UrBs6w5", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "afa3fdf532c1c0eaa5139ab8f8c6341cc3970972b6cc75535e0922e6430cd71c", -"confirmedHash": "f5c598d003096c5d33f4506fb70b54420ab2ef20be5994292a00000000000000", -"service": "00000000000000000000ffff2d4c4006", -"pubKeyOperator": "9475f1d8d73159c6e2dfff3c10d4d3a5a0c6963845dc8c6ab80deb7ee44183608304b4d4bdc7385dfb5ee48609bd4f1f", -"votingAddress": "w4haWmkdotGJQnqY9DiyenJMdMi", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "afe31d208168450af622c0ce07eddc7437e0a950363ddf9f197ec1308edbf352", -"confirmedHash": "dae21056be7be38f03f3c8df1f9b0302e2fa891d4a26b0121800000000000000", -"service": "00000000000000000000ffff3e4d9c39", -"pubKeyOperator": "99dfdb50df039dc411ecf477a7f49af1c02fb90326dd8463951ced0e637483fb54d4d6fb4af07e8b8e2c4b781575ed71", -"votingAddress": "3U5Faay3vkM4pr9yP5bn8a4LHGij", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "afe7976208c8e4e48038eb1bd913e31c0d150275e9ee378d0232066757ce577b", -"confirmedHash": "0a1b5ff60a979578f1e4c9c0472f369da0bab9a3fac104d10400000000000000", -"service": "00000000000000000000ffff33d2b5e1", -"pubKeyOperator": "8c5b2915e2d9c0f137dfcb5475647122625350d9aaaa994ff3ddbb12cb53e0f3cfff73446f47458eaef405297dfb77ee", -"votingAddress": "4YB4NsiDHpD5iQJ3y8U8RKYnfLhz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "afe8ebf993d7d1c13ca5383c4ed401fbc7068ae43685eb15cd71d6bd5d31fe6b", -"confirmedHash": "270519d3d841e4836b7b6d692a42d8e30b4282d095f213e52b00000000000000", -"service": "00000000000000000000ffff52d315e0", -"pubKeyOperator": "001c576e670ade910cf3e69e4eeac8404daeaabfccb702d3ae53efa2d851e55dc734061a9d9cbb3f19d1dfc52f8ca095", -"votingAddress": "2yZ7Uc7jcVoEc112ZLwjJsoZPyMW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "aff1ecd6e6f0e2b08a5c92c60ca63bba712e3d0728f4fcff241666a36215b9fe", -"confirmedHash": "538ee80ad9ffa7f7a024d24a593ae7c8a434cfa9394b14ef0800000000000000", -"service": "00000000000000000000ffff4b779606", -"pubKeyOperator": "02d5f6028ff306cdde2110649283eb80f49812f8c2be06cf6f8e2be2b87a91192d97d633d667b9364a0a83116dcdcfeb", -"votingAddress": "2aehp1voi9T5GGa8T5JV6JqPUV78", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b001cb96503c5b3fd7d3182626dd5a69e32946d1519119a980fa9888333bdd7b", -"confirmedHash": "93ea7981cc47a40e2b3a3096f688ac70c4ac96f89b2d24e90a00000000000000", -"service": "00000000000000000000ffff2d9b7944", -"pubKeyOperator": "0d92c800c4c52cff9e056e512927919586b7031dc97fe0444f0497d246be30ca28121dad81a4e442633bc6ccbe07b625", -"votingAddress": "Eau1gSu4Mi1PGgRYZY1KsBkSp6b", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b004f01c6ef0c82e658489c97de3fddca4be0d62e03bd5d9bc056f570d3a9039", -"confirmedHash": "bbecafb608014b7bcf8badf52c95d2f5a304cb2dc45722b70000000000000000", -"service": "00000000000000000000ffff3407e85e", -"pubKeyOperator": "8afbd1b3bb2e5f53552699c0302e08efd8a9aecd566a94651810595e527691a789c7c8b8301b082579ec1d6b6d0d9aca", -"votingAddress": "2p5dPiTJAPYtmxAk2rmvei7voU9F", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "b0157a7c95c0bb08347bce668430a22733875b8e8137b8ca7dcc2f361f00a865", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688631b", -"pubKeyOperator": "1429f3fdefded9a8c5716f6e8f2b3412b60a0b9b1ca44ecf57845fc9ac93dd5bb44c5c7ac6e9c076a39c2725f9814cf4", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b01be9add1b4221a54442843591d5edce7b16f86600a436e7cf409427d188136", -"confirmedHash": "0baa995f52c1bcc104d0aa5b97430dba1e5085ab15d6cf682a00000000000000", -"service": "00000000000000000000ffffbc28f179", -"pubKeyOperator": "0b6b0ee296a3785d5374bbcd830dbb0285ea6eaacaf859b42468d358d427e1a48cb00e2be3e3c6c8a0f41958491ccd5a", -"votingAddress": "3YESVAKrMSxJBqCSgfwxfKheifWr", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b03a90d529e77f3b042f3b48196615fd8b390c1c95dac0232796d645eba4cb8a", -"confirmedHash": "8bee506d011c02745cd92c841f29443a5fcb6561c880c7090000000000000000", -"service": "00000000000000000000ffff951c9323", -"pubKeyOperator": "0f3afae8c4783163fe2d04ee024fef55edcdf4af529c39f9212cb6173687d2ecc15b99642e9cbeabda5d81d0d30d99c6", -"votingAddress": "2TJmcbY5ReAVzjYQhrLq6T1MdjLh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b0410530490e2033da8bda62636d6e79b5bfe7ac901ea6e400e44022269631af", -"confirmedHash": "9025543fe4a36473fb179166caefedae676b3b9e3cda4b270100000000000000", -"service": "00000000000000000000ffff5fd84fe4", -"pubKeyOperator": "97570fa507fcd502b39c81f969083ea35cfce99abbc6ea97ae39147afdbcc03853c16b5aa69283c72864f62809c6dfe6", -"votingAddress": "3gjw4TBfPgfSTDbL5ZKbLbcsc37S", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b053f826aa00d98ed74b088d32b3baed9399f04721158dd0471e8728a1383ad9", -"confirmedHash": "ea286269e2a6c2d405bb9ae0dacdbd2ec24782915f88f49f0a00000000000000", -"service": "00000000000000000000ffff55d1f254", -"pubKeyOperator": "91fe68a3d4802050347e772d07d06c028a3c5165b963829750af9696cf3b778d371ffbb5b74cab7968ad8498bf3f7ed2", -"votingAddress": "X2KBhthDZQhaTFNLgMWAyQ34Zer", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b08d552f9d3b2e176fd3ea37f67d4f505daf3b2511ac6d5fc0bdeebdc6770dac", -"confirmedHash": "c1574dfd0447c70df53a4dc66f56eafe89b9842e0019e52c2900000000000000", -"service": "00000000000000000000ffffbc28b6cf", -"pubKeyOperator": "8e2093d9cbd082705ea17d1062dcb4f457c1914260ce5898842fd072c26ca9c868e2f8127d5d7ef7ac06ab168b89d912", -"votingAddress": "4XYHXufrpBq5GFwrgJ6Gs7DsdGSU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b092d58986ae4f2bc5c548bedbf5bad45878adf112920cc2b5c0b671a6dba4b1", -"confirmedHash": "1f824ca64d7add3ac60ba8c71f8a3a0ce60eb24330bf87bf0f00000000000000", -"service": "00000000000000000000ffffa2f315f9", -"pubKeyOperator": "1347434b853f1eb87263d8ff036a946bdc0e38f81242c3533c3bd2752df5da957e37b3fcf5c7a380446960847da5bfd0", -"votingAddress": "3QHJ8mTrNnW8MeCQWKVaTVThhJia", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b0976377eeabc5aaab4771929a78c971872e9fa9ff7acbd4baa9372554a636c8", -"confirmedHash": "69797ae9ea4dbf5d4cae00b345be22986b6f810b9ad5dc5b1f00000000000000", -"service": "00000000000000000000ffff05a17823", -"pubKeyOperator": "9470fa786bab4e5ca50c9ee7bcb8847e03320f1d9c04ade66798c8616ffa908d37b534d21a1f08e07c22e62d41052ede", -"votingAddress": "42TjhPa45NvD3bbEcXoJ6GGKb5Mt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b0ac6a2ffe9508494d705044ef7c00e42084ae33d7f6347244ca4334ff41e3c0", -"confirmedHash": "89b346f05a32fdef48b777e82355d8d71d0382af8ed701260f00000000000000", -"service": "00000000000000000000ffffa123d5d2", -"pubKeyOperator": "0a199dca868dd87071c3a5b3e29fc725a1282e0b6a8d5414bd060ced7f7c64b9d53533dee3c73a519a5864dfc42b17e6", -"votingAddress": "NpvggCF6xhPNFLTcQCp9zK2ecuc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b0bee45bc09259533925e469be9be7ef1150f9d3d479e4b4005a69c655f4d661", -"confirmedHash": "88ff62118bd21384338b5b13968c737c338d3805842d24f41300000000000000", -"service": "00000000000000000000ffffbca61f08", -"pubKeyOperator": "10f1db75fb5ff7344feee8301f92ace8a4083cd31ae65d873f759986a0b3c60552d98de733804ac79ed5613a56bbd936", -"votingAddress": "4NKunvTNu8ME9e6ZrTzxYefEdKt1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b0d2548649d63e46da5bf131b5eb44f8af2b24a43bddc6affccd530ceed098a3", -"confirmedHash": "1ccab49bd887168c25eef17865d97bdefbe3358bc5dc6f710800000000000000", -"service": "00000000000000000000ffff87b5322d", -"pubKeyOperator": "86ef5b591905e1c2437ba419f3f921b0b7ae71941cde7b423dd00099866fae178a90cb93d8b6dc0054b5e0706ee7150a", -"votingAddress": "48AjikVRN2w5rXN3YyTEsWandc6h", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b0d306e23183a3f5d6b5022970fc5aa17112ee8eec9c17f50b3af97e3aea09ff", -"confirmedHash": "0f1063de0e5fb4f2fcb031872920062b146c76942ad979ec0b00000000000000", -"service": "00000000000000000000ffff2d4d3ea5", -"pubKeyOperator": "9282ee6e8d024d57683da3638732a5cb30482e6fb72659b3eb4c1a2ebe2f6f7c757259a310fca324cda6540f21617a85", -"votingAddress": "3iFcsY2gbmjFAx3Q43x6wWY4AwKS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b0dd95b0e63491d4da90fdb6d6ed210ac2f6e1d55a15ba64dfbe5513deef5655", -"confirmedHash": "4aff101b03089f506fd4d071edc5eba2ae31f549c524362b0900000000000000", -"service": "00000000000000000000ffffc6d37fcb", -"pubKeyOperator": "0636af72e41e9d4e96222cbe996683cd3a362cd4899e47a0054efab70030e6305513b213764b641e2af59114daff3863", -"votingAddress": "2iduvgHzFkk1wubxTUERhPEnMRK8", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "b0e6c14a0b4a28f56d4473aba8bbc767c865687e95363d5d7ee2c5e3d6a620e1", -"confirmedHash": "6efda471cf862b9d6d9cdf69abe97242e311868854e608c22c00000000000000", -"service": "00000000000000000000ffff2d20b84d", -"pubKeyOperator": "8f975dab40eafa9c91cef7b22b11bf7eaffdce726e0c12539aea7f13690e3afc816e5f3fd21014629b3ff5b63af2dbe5", -"votingAddress": "2soPuRfFnxNSDenPyXPSQTV2eXed", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b0eb4926199f0be6a28ecfe8028563f2bd2e2d93f083305a26c2512290167bf1", -"confirmedHash": "39c67156615520c44c386943e04fab47ad9139324f924b730c00000000000000", -"service": "00000000000000000000ffff9fcb29d6", -"pubKeyOperator": "0352e6fa0247c53137a34e43589380c3ebdc9f9e1f7956a58382afae373a84d4839513e3a0b5ddf295219fda3d219a82", -"votingAddress": "3tMiRu9isnzZN2QrpULAnSRaA6rH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b0fc6b606e6a347d2232b1efcab0e7f2ce46b8a4759cf801f0b8c2b8b7075219", -"confirmedHash": "bd31f35c5cedbf07c6ffa716f2a3acf8f725ab42af8758740500000000000000", -"service": "00000000000000000000ffff453d6bed", -"pubKeyOperator": "101969411b48fd4df4bcb349e7b285453e7bf4eeda1977571be2fc4bcea98c5f1e65196ddbf11b4bdfdd5f979a637dda", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b13382e2dfc811ee6f2407ce1f0eadf48b5bfe6516ba7cb8ffe6abcf6abb2cbb", -"confirmedHash": "abb652df07bf08d2d6418a3999603a9b76a4ad9da4f98ecf0600000000000000", -"service": "00000000000000000000ffffcab66617", -"pubKeyOperator": "88d65bd9edae3402672a71a75815655ef9da4dfcdbce6cf152bba729dcfa4757fe8bbc518d9b20b7d3bf0993b8e78ee5", -"votingAddress": "2KJpAEPAYzcqoFHhkAZEXX27PCZx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b14b9c6ddd9c3e576acde12542dad35cbebb75e835e1012f7e2265fb35917500", -"confirmedHash": "ca7d8a6c0c47454ebd12f13bed115b0287d51ee0ce49da8e2c00000000000000", -"service": "00000000000000000000ffff8ac5a1a5", -"pubKeyOperator": "84e27615b26e52706358a79add5f0bc5ae8befe23b07b39bef8e13c46bc292e62090d62eb051e6921da72ee61a2feeac", -"votingAddress": "321A4H1jQNZSxexjL17YwXEiTTYF", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "b151b48ed45b390acb40a56c79c30e32c41218e11c12a61e2429cc2f2049270b", -"confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", -"service": "00000000000000000000ffff68eebd3c", -"pubKeyOperator": "115bc709f4a650044a105fcb6637378e35c039cbd9833ae2b4661f65d16127676c19e1a7176e87e28d7e85c0d87b94b6", -"votingAddress": "3Y4LKxyFGBabepsdQXDToUjR1t28", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b16b0929f634d5563806744d51d0fbc9a3dacc0bc8c3665abb75e1e9ad1d3968", -"confirmedHash": "7cda983d2dd8a2fce5cf6141c48cfe13ed4c9c83d43f2b4e2900000000000000", -"service": "00000000000000000000ffff5fd97d68", -"pubKeyOperator": "08915a5164a39c40a66491b04b44c89d5ac0122b3e733f1c7310f5b5df71b3b46e2e73475e80a67f37d52113c325ce4d", -"votingAddress": "4XyJsBf2jAHqvDkbXhsGaVM7NHpd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b18c1724cf0ac7d5d5a3ba41bb96a077417a8bc410f9e6512ed160eca3a918d8", -"confirmedHash": "92e5288316c0a8898b4a961f38b2539df010d5a58cc49c821e00000000000000", -"service": "00000000000000000000ffff2e04d9e3", -"pubKeyOperator": "0bfedc15ab70e2cd12e556670e83e44c4b6a6c03b48165b59d002eb5e4052ef5b3b0b16660a67dd6c8a58804cd9cb008", -"votingAddress": "EarUzjNZnJ4C1P3L66Dm1Jumh6G", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b19fe8c03e0c6ea98b52820df54480ef782915667ebe5d8984aaac89fc96aca6", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d52b9d", -"pubKeyOperator": "97c6b6aee44c6f82a09cb521d64eb26b2ff10c1cc8fe78cec386e253a15ac38e47102417ed9fbcde751065de3a795c26", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b1a8dd5c1e3c75d519db0fce42534d014c56a9246fe864a6434918aa8a27c4d8", -"confirmedHash": "5703b38c4d7a118f71c837a9c9d805f9f8f851ba15cf59510a00000000000000", -"service": "00000000000000000000ffffbc28b841", -"pubKeyOperator": "8ead062a742da3d2322a6a3ed20be25ecbb32545787eacdefb8e6502c95a911df13ac8399fe3ef0090cafdaa76af1129", -"votingAddress": "2EZf8rfETJCTGtCoHN6TfXGakREb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b1c5d7a7c5e09a921eab5a51e369ede5c6be0a0ca05166ee9320db02d8b379f1", -"confirmedHash": "402c0548a87320f6b26851267192c8c17a1ac03ee95939b10e00000000000000", -"service": "00000000000000000000ffff52d31957", -"pubKeyOperator": "184e80194b518478d570fcd661f331d79d2a21e742064301d8148b52be40f00088f02c17acab4816cf40063115eb9202", -"votingAddress": "dzrenNbNfPd7R8tqcyHRiRaBpfQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b1cecd8d5508d86a0e23a998c272da00a35b257178b377ad66c0afc682e2d229", -"confirmedHash": "7d5bdc08c7e185fd4ce0e76e0ffa22760534709f8c3d96782d00000000000000", -"service": "00000000000000000000ffffb23e9fdb", -"pubKeyOperator": "948fea6aae9145c85265710dfd17006871059c3c94c899785a53fcc0915918bdf09781a2309414355d26cbc8f067615a", -"votingAddress": "4N8pQui6RaSuJHszQRQMCDDLVxJw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b1d7058a896c4437163d87f49a0ad7a1d5fcc1aa2ad2eb6ab3c0ed1dc2ccb6dd", -"confirmedHash": "34b32e4a6c20ab8e15fcab875ed6f64bf18aa791aed0d8420b00000000000000", -"service": "00000000000000000000ffff52d31502", -"pubKeyOperator": "94af9bb09fb8915a31d5177afa031ab50e67a9a3027e8a298797d9e5c39a4c3586c7b2204d506b042de3455d19130453", -"votingAddress": "v4DZfSB3joVhUxFfdjNNRY41kQj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b20860dec6f7f3fa8783fad1963f46e52e0c99e23e6a915d804ba7fb47f92cee", -"confirmedHash": "4cdd3333e9d7fff1e7797ca9c6b5ab4ae2b72ad8294b108a0700000000000000", -"service": "00000000000000000000ffff8f6ebf87", -"pubKeyOperator": "111739137a8c124cc564d21f57908dabf1e04de2a14afe607b3c4244d1c8a00a5e959eb40764023d74d856b213866dec", -"votingAddress": "42scbhBSTd5GU64GgTMmr4xP1AWA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b20ed000b9bebbe2e4fbcea122fed24a165a202981ce448908beca2668557d39", -"confirmedHash": "0af85f472932784ec1b4bd6b6077765be28d84d4b0b1bf040900000000000000", -"service": "00000000000000000000ffff8ac99962", -"pubKeyOperator": "98a5ec9f5ab8ad29addef07d7d4730b26827dc7166c123bb4f686a6a9c741d6a76a97f70c382f7b1a1ce0cb336527092", -"votingAddress": "psYm8NcMJiJTsUD1f4r9thoyW4n", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b2164aeb4a3fa256806f0991501dbe1c52bd95ec88a1e1e32b60237323e382e3", -"confirmedHash": "1f9505f86fd424d14b134ccfed00d1a15565d352b8af55181600000000000000", -"service": "00000000000000000000ffffb009d20b", -"pubKeyOperator": "932ca1198068be682ab4dc8262f81771c260eb3ea06103a50ef3f38582f061e8e0778ea087f5efc6a26b9ee97ca81e02", -"votingAddress": "47RUUgHFmiVsAQxNxLwUqB27fEcS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b2291aefd8c89d61f947bbfaf9893157b4d0192153eb75f333bfecd95ac2a23f", -"confirmedHash": "c0d5d9692f06db34d33ea796e927a57b6137a8bca5a2ee491900000000000000", -"service": "00000000000000000000ffff5fd93064", -"pubKeyOperator": "80bcf418f20eefb21665ed150960b6d09718b323a5766b17888e90964a48d079e24637e1a8082ac3698aa880f1b09d0e", -"votingAddress": "2DziBfFvU3x1VywGwofuRko5NAtK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b2301c33e7ae50d39a245027d4a659cf158c5a0e1a39ce10bb0be073502dc969", -"confirmedHash": "64c7a7db676a03a89cacb89424829ea71bb4d28df09ba5130b00000000000000", -"service": "00000000000000000000ffff55d1f210", -"pubKeyOperator": "861a58f6d5495874ccb6fd78943b106f9078cf8ac0854b67d2feec6716569570fed7fdc569b160a882ab182f8237dda2", -"votingAddress": "4AvZDw18QR48iGtA92j67hN4VE6q", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b2306e3ac3b56fee749f08944d1e179c3b207ff052b3878b62344e103c26f4f8", -"confirmedHash": "f8aefcc229abe2bfdbd76be6346797b9c52d4ce58fa1a6c71600000000000000", -"service": "00000000000000000000ffff2d2024f0", -"pubKeyOperator": "012823cdf4620526c1731b00c0b7f5eb6d4877be661ee629d00cb47c71e4a7ca67f5c481c625d3d07c94093c9b6bad2f", -"votingAddress": "2JtqbTQGmpPMtqYwvNBFXvDDtQk2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b2477ee2da0a3bd728c0fd75dc9b628ebdeb141fd92610f22134530477ac49eb", -"confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", -"service": "00000000000000000000ffff5e82b943", -"pubKeyOperator": "83db4876017ceb38b75f352ceafa06daf01e3b7094096c70bae86b5c52ae9a8e5550f0996876398337b44c76d6096bb2", -"votingAddress": "9eKVbZp3d1cke2nemRkuL9Gdfua", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b2519a2165ac9856655edd0466419a0482208c34df883f7c8f75b1e4eb233cd3", -"confirmedHash": "4d07fafc641840ecd726017a0fba6370c7ada3274e6a34b40900000000000000", -"service": "00000000000000000000ffffb07b39d7", -"pubKeyOperator": "14d911cba663ca942de47cf3b0e482def94e7bb2bb4077643cb12bc9598cad477c306199a56fb7e6d9edbce693bce1f5", -"votingAddress": "2aGQzptxnxY43ZaWJVJ8u9swXqXU", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b252cb35a8f133a6019ad25f655ca7a092862e3a4fc23b41200d60eada73f79c", -"confirmedHash": "f475109160142b7a3c9e88937ee42dddd0daeaf15eea728c1b00000000000000", -"service": "00000000000000000000ffff5b849234", -"pubKeyOperator": "0a01423925a83985f216542b8af424de7af819ef7afa2dafa81b2ab03e7ce16d9b072997451a67605848f03ce3400bfb", -"votingAddress": "41BreyfFQDQkYrnhRb7eweXhRAoY", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b25530bd916c1ae0d08d784fb5dcf2a51b0029f1be1915ee62d38138c6451d1e", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9e656f89", -"pubKeyOperator": "1484a9f27b3916995b986e261d597a243a27b90b129682d20a5f4c5865d42cf431214d8b3d185271c54f25bbc7cfb874", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b257d9d3584d2f3bebafc7d45b3fdfc0b9cd6d20a5d30d47102b195b7d1212a1", -"confirmedHash": "8af5d3b975ac8df708c2ee4d7124f8012ccf7260490165a60500000000000000", -"service": "00000000000000000000ffffc040538c", -"pubKeyOperator": "18f02562d64aea94061fbfbc46e5f83c965341bb4fb4fddb6685d22a40ccb64726101b24ee323b1e91c9d0414b720bf9", -"votingAddress": "4ArF3VKRawyefeadvoKRZ7BoWZ2N", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "b26d891389cbda5871e45ff987815c375c3275ad3ede272654596cd29a0f4ca2", -"confirmedHash": "194f1f7afb2162e282d7fff31e5b1cef3f82eb1c03944ca50a00000000000000", -"service": "00000000000000000000ffffb009d201", -"pubKeyOperator": "8573bf0bbf0d372ab6a2d8e88ca7b0f3008be8b77ba30e86610ca19ef7718a5f31e1a7d1e07ad41697594cdaadcfbead", -"votingAddress": "p1Pe7vzyUX94NmxJxwhVoXdaasQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b26f112eea1d2ddf912548a59479a52e5549829b3213866826f43756a9de7924", -"confirmedHash": "c2e4dc291db1fca58c9a5da356842368374bf57a34bae0f21900000000000000", -"service": "00000000000000000000ffff480eb7f9", -"pubKeyOperator": "9531a02fe2e63e91ee2f6e3e75eb78b2fa91878b9d65854b053376441a969a216376be2b61fe5f34e246b8039c25dbb3", -"votingAddress": "3WB5KaXUzKakCEonZoFTYwoqu2Cx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b279f59400f7c3861e3baed64b5abf6d65fce51b1863c7c86137e5e0facf5541", -"confirmedHash": "68ea281b8abe5dece729829410c8b20bb5119246738181122800000000000000", -"service": "00000000000000000000ffff5c3c2459", -"pubKeyOperator": "1935463522df77ade2c6857041ce0bd9dd4ded6a343b93c423764fd244793ff03b251f8c9a0ac2f552be9784b63973c6", -"votingAddress": "3fgpexMuwLuBFBs66k6cdX1JesHy", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b280a9886aab8584ee5cc5ad606f102fb27ee74b07cb7ee92979682ba8b0a69c", -"confirmedHash": "20d19d9a388609537d7f6bf7a43b60243e5401f3764ba17e1800000000000000", -"service": "00000000000000000000ffffbc28a300", -"pubKeyOperator": "8f64edd9c2524b40ae50a9046e4d096fcee995f57a73ae5101ccb0d6cfe92ae11401341e85f51e7ced55652458d370ca", -"votingAddress": "2UdqWK7UJwsFassbGoFUhertUopQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b28583e53ed251010789a5a67fb3de47fc4aae75c98c61ba97f3baba09d5c4c5", -"confirmedHash": "ef5c4419ff85c107d03909e43abca9291e4b7774e617db5a0400000000000000", -"service": "00000000000000000000ffff52d31928", -"pubKeyOperator": "10d2aa07a52ff502940e4fdc7570d91edc5c31b031ebb505b7e63147d1d1910c92ad597cdc8df63ec1b36bd8de8ecd90", -"votingAddress": "3679wFgDqhdT22rFcLGtNJdrBSmK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b287026c5f4538efdef553576b05da32e48d29c5217ece2cc508430aced33658", -"confirmedHash": "e841f6b965a3b864e2c18dc14848ae4ae6f76d79aa2f46f71200000000000000", -"service": "00000000000000000000ffff2d4d0334", -"pubKeyOperator": "154c4685fb95685c5ce3c12f53f6f0d10002fb1bbe3fa74e6cf980eaad87e3b9a1ee28263cdd9be0f229d60fea0945e1", -"votingAddress": "3qLdQN266bQBCDcHSxA4xZcrsyJA", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b28ea985d1bef21e19d813b5d8a0d3af6483172cdf49570b90699b9ee039735d", -"confirmedHash": "7f20729c0e154be68709cceb13e0c4bba3fc93baed9d49590c00000000000000", -"service": "00000000000000000000ffff88f37389", -"pubKeyOperator": "021a1d0c02cd64b524865611ebe1a64f574e010a059d52bc4dd1ea3a533c83920a03361dc7613ca1e77f5bc528c143b9", -"votingAddress": "3QfFpQ8tS45ko3HfVWHwzh9wu3g6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b28fdca8731bfbf78bc20ce5f83e1e4920997954160d1b1969177d48c75b4ad7", -"confirmedHash": "6b6e06a0fb720cbe0459d6e9b92512bff2d202712de32f5b0300000000000000", -"service": "00000000000000000000ffffcebd1c72", -"pubKeyOperator": "1008f0eec44fe519caf3a9287bace1d8289463289382629c3e0759366883b82c560acd3e4504518be535a6f3a9f75803", -"votingAddress": "33xgktuzCLNSWRKBJHso2jDVQwaf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b2938148692ece2c0d2a342efc7c3704b1549cc8e95945912f8e32b029c77ef3", -"confirmedHash": "60d3af83b270df45686cdbcc85fb7a23d6982bdd7c0e7fa35400000000000000", -"service": "00000000000000000000ffff52d319a3", -"pubKeyOperator": "0332993c6c856c34f0c4c98ff848d5fdfc5468b8a07e71cc78cb22545f57b81d51d7cd5295bbce3ef530476cefc2f361", -"votingAddress": "HuTkGsmeWeidajqogdQ1HAbLBE7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b29486071834a43b694fe7a91edeea62ede1230af7d826c12b5a103f4a149151", -"confirmedHash": "da6c8f990b2b12a0fcc1be91739d72c981f0106e9575bb290e00000000000000", -"service": "00000000000000000000ffffbc28b981", -"pubKeyOperator": "14adb9dc7ba9379f76fbb3a221be50dc9841895f9d5d126712c9592ac42d40739cf1990f1252497d7db689c4a23c0b06", -"votingAddress": "2Bwwz4eWigqjnbYtXZNSg2nJw4fA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b2b41e2f15c6a72ec8e4b7c069e64851622a7867568e1e3533df6a259ab4b444", -"confirmedHash": "f475109160142b7a3c9e88937ee42dddd0daeaf15eea728c1b00000000000000", -"service": "00000000000000000000ffffc2a3bb48", -"pubKeyOperator": "94c7d3ae0cdb8bbb02950121f0c1c8a2605e86a79061bdffe84a913daf66232b253968210c9d172ae188551d69aa495a", -"votingAddress": "2LVFe4tTckhayREseHCD2LgSrHUU", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b2b6957b22b944a6405ca379a7ce57f8a3d9fe3313f4c18035ae9a1aaf927e2b", -"confirmedHash": "02a38ab90921168e4a5c30dc96e3825d79bdbe47ae11db310200000000000000", -"service": "00000000000000000000ffffa8775300", -"pubKeyOperator": "8a2b36d444c587683d833a555faf2395b42b71ea93798ee01608b4d054b8d27d9ba20f642678d2ada8167e507ffaa01d", -"votingAddress": "2CoAtPoMCo2BpY9CpVm9JGR7RprH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b2c4e1bd90ab5727342b0861f68b3267a0b8906c2fecbd8fc9d638a21d94f649", -"confirmedHash": "60b7a9415e5bd22b466b26dcf9024e6b52de0b228b818d8f0600000000000000", -"service": "00000000000000000000ffffbc28b846", -"pubKeyOperator": "95f430a5255c2fdc1127e076104cd4f0684fdf29f1f53591e6f1fd7bd54282d41796bf42061e2fe6f7c6730e43d59a3f", -"votingAddress": "2MHAsPd7TezYGsnE1HGNaCe3Hub4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b2d0f5ec73e3328a65a61f012219da83a36d2ef000d46be8977567d2eef56b62", -"confirmedHash": "0db86003e7b91e3b54ae01aa7c3824aef4a41cd82675e6921600000000000000", -"service": "00000000000000000000ffff2d56a299", -"pubKeyOperator": "09573d20a655148a4bc3c02e1fc83769b187b5d8d4bb1ccf23ae0610d610ecd18d650144a7d96518b9ab7f9167865de4", -"votingAddress": "3FTzLd3V1Upokzu1EjMFoxjyr7Aw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b2d3e8dea42b9c8331472962bb36dea7b684b0f6dc8f5869c80fc24936199a04", -"confirmedHash": "3bfebb11f7c1f49fbedfa5eba3669111628f897ac5a397672400000000000000", -"service": "00000000000000000000ffff34039462", -"pubKeyOperator": "934e4e541c310c2d17df7b48040d6ae9446fab9530abcbebdd1b46d847a5b4f8898057060143436dc7003e1e6fd9bf45", -"votingAddress": "2oH6Tg9eMSyTE5gxZqikqYB1rbfJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b2e9e6ec81075f4f4b02ce8016a7b590c70ae83140be8d1a8f0f5ee8fe3c7a51", -"confirmedHash": "c8d52e6e30df9133d3197c5154298f09f202bec2258704ab0f00000000000000", -"service": "00000000000000000000ffff2e04a26e", -"pubKeyOperator": "815fea036e6bc60ae2fe0b447efbd8720b562bdb29312add8aac4d47380f80aaf1050f7fd0bc7d9711787b29301fb034", -"votingAddress": "2ATyDsVdrZtpbjEUeqtLzB59U5wD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b2ec9be94a0eff7980949b6efaa03b387a3f9d831e2d6ac7e9bc0e81400aced2", -"confirmedHash": "7535b9cfb360df86d3a17355e38306932989bef51d3fd3a83000000000000000", -"service": "00000000000000000000ffffd16182f0", -"pubKeyOperator": "0dbfc88128f669d080cf138086bc85af478b485faeb3e230c75a688e3aa55c422f33146f258e9d59fb26acd158f74c81", -"votingAddress": "2qqQRCdVWGcV1q3Bnb5UnGVbsvzz", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "b30e389d4ce391d1827a4a3303929926c76368521bbe1bf1fda4dff3aa58be3d", -"confirmedHash": "26a6ae86c28349c7c34fb9b4412d58d4ac00e739b3f9ea941200000000000000", -"service": "00000000000000000000ffffbc28be38", -"pubKeyOperator": "99594c3fad26bd02a952872b3df5bfb33299c434f57789d80e6390a875d0116bdd0200870db3710363c5d301c5fcc92b", -"votingAddress": "N4Zdjn424AvTkbcuMQS9BNogkcY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b322b84c040179116c5a5a9e3e1956283a1df80998fc6cfe2876e2d0e499cfbb", -"confirmedHash": "aef6ce4203bc3d19e0ab00bf4f1ea1178ad5094bf30cb7052200000000000000", -"service": "00000000000000000000ffffc11d397d", -"pubKeyOperator": "06f68ffa7fe87db7cc2279a43ed1b156e3f9654b910cdea162407d738ac23d6292ecdacd9fdd0b2df52add3c8e615359", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b32b72d86266b4e465814d56c0e7738e46a8efa2c071f4a0536472fcd37a5e21", -"confirmedHash": "f612dc63578d79cf6342a79e99d72147d99d840e12b639350800000000000000", -"service": "00000000000000000000ffffc2875911", -"pubKeyOperator": "12e7f67ca7efe9bb0c9b8aa199468a69de65d1468acfcce57686cb061c7bf1d9c0bfcf45d955d8c23205301bb21ee0de", -"votingAddress": "24vntBZC9uDBeNc9RsNdxx9tiQyG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b32e72402aa24da57c411b2cab68129ba405387685deddfd391647bfb7088875", -"confirmedHash": "e27047e73eb11796a53485437d789a5b4a60649850b232fe3200000000000000", -"service": "00000000000000000000ffff55d1f19b", -"pubKeyOperator": "0c806f4177024555fe4e9c63c3eb74f9bdd42c4e4359ee3209b6c72d91f6e14e4121c5c004ffe2595132cbff65dc66ac", -"votingAddress": "3htCoUWh8kxydsWStQVJANXXJACC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b340e80f21927060d024318d95e06ecec9bc29c76416dd6af90d81f8f9cef10a", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b05f", -"pubKeyOperator": "007b06ce9c06e9f41c21b37e422b736a68901dbe6d3bc40ceffa40934c973dfd55d0e592c22b6636bc21c4783c505ce7", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b3495669ff73db19590a9de53b4304dfa01928bfed4103b5d260f6c3b0756134", -"confirmedHash": "792e7485055a8c799c7bbc07ccc5e4eb38f121326be067d92200000000000000", -"service": "00000000000000000000ffff2f6ec51d", -"pubKeyOperator": "8623e5cde73f404468539bf014d72dc2eda815172b9bb83a355537938800710e3cb4e7b9d8961b5d6320192440bf085a", -"votingAddress": "dbKrbFahMc4gR5EosCqMt9skYct", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "b34f50541a418716dac656ed6a82c9bd8a1611227ec10eb0f668a5910eb69a48", -"confirmedHash": "0991f3e8aa2b2660343d779120935a3d27d8c73c342ef4a22d00000000000000", -"service": "00000000000000000000ffff68ecb71d", -"pubKeyOperator": "09621d91610823d2676d9e19f8230406a27bceaf2f576cbff13fe46aa33b8d3d651ec39ac3e83206c4f8aefd4d340bdb", -"votingAddress": "2oxdGoxwmBqvjpanRMMnH68Ai1q", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b365f0e363fc9b75dac173ba229b25406024eea8b1814434c14c031d1c13367c", -"confirmedHash": "65f006d9a571d5458871861814c95b21f29714ec6028fbd92400000000000000", -"service": "00000000000000000000ffffae8a0ba4", -"pubKeyOperator": "8604ef894df6ab2663104682381f04212eba519872d098906e33b247d67ff2d5e4e029a3203a9980ee00d4fd8c21b296", -"votingAddress": "38MwABrYsCgXe38VcbgvJXfZQREQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b3745f9361b339116302e8415c4e02d3863651a06631b0416aec9194b57b644e", -"confirmedHash": "919ca932c48b8fe9c5e9e819f9dcfa004587f4bc0cb398630200000000000000", -"service": "00000000000000000000ffff2e04d9f6", -"pubKeyOperator": "930dca2ee94e40e737abd9a05748df2da21050959484f3b3b3146d3f5a39a1686275c2beaf4088c7b80a82c80bb2d725", -"votingAddress": "2mrACjnyR7ckaXExNX2uwkUzxW7q", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b37fc5b4613da03e2c0ca25a478f9e135017ac983cfe15307a5c04baa7d8bfed", -"confirmedHash": "33142bfbac0cd0a9c218e1934d72f98f4789db576c1a60c21500000000000000", -"service": "00000000000000000000ffff68ee9fa3", -"pubKeyOperator": "15d1d295a04f7b8b66955d93c490105638418b6369e8f92fdd09fd4f96e18dcd794abaef343ebd010d746fc740993f8b", -"votingAddress": "4QJymzLKC5omFJ2ZnVaKZ8CYTmxB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b38976764263c7362a95b2cbe88b208c67ef00d442875156d6ec4cfef4c504da", -"confirmedHash": "d6dc30dac321759a5181348dd82024ea7601e85bf407a1051300000000000000", -"service": "00000000000000000000ffff17582a8f", -"pubKeyOperator": "08bc72845f6103eabdbd87701ad7d80b495fd1a8c64b1dab8ecf40fbee46882df1b84bbb2f4e875da25c78bb1d6d25b4", -"votingAddress": "GXTJv3VoJX5BKHsEQrZvXUppVQc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b39350cef69484f8ec2308ee86502687a3b383d63ea8e554a4863abdb9ed395d", -"confirmedHash": "58e240a154a0ac48dfd26143fb8ac7413aa11d8f10f16e622700000000000000", -"service": "00000000000000000000ffff5fd97d60", -"pubKeyOperator": "069ed54549336e189918cc87f3c0de838953414926ebe87899c5d88dd9786d4c7745ca80cdbea51f294ead89e383b570", -"votingAddress": "9NqdQKWFVuJdWXANjMxzmWYB1Bd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b3be924fb3e81e9d3f8edf062bbbba7fd72ef31bfec6c13a72f9886e11883ec9", -"confirmedHash": "9c34734ce9eda0180ca8301e11c0910e7578e18ff44e24720a00000000000000", -"service": "00000000000000000000ffffa516e409", -"pubKeyOperator": "13c2f399e09ce5d8f98b88aecc6b4b54dcb1575686db34d50f9cada6f48aa7d146644473b9840f3c6f7e379923e592b7", -"votingAddress": "2jWTRx87AtJQQgXRbccaQm2i22eB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b3c0d941045099ef4d6ed420f691cbaa254dca507d41b604f4e22818afa6b7bb", -"confirmedHash": "32e74f61743caeccdc8ae0b83a6c18b1596130d3cd925ff51600000000000000", -"service": "00000000000000000000ffffa7eb9f53", -"pubKeyOperator": "13dc96c0c653e2baf91fa0907030d78aab90a8b48b8c62e783f918e92223a86a5e55a642a56bcd81ee77a33b00f9e9f7", -"votingAddress": "7zpELTUtYEmzuziBEakA3Hynkdu", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "b3c573e0db3390fe4ff0cb12d30e5011e7250f3b31d6dea167a9d8905921ad3b", -"confirmedHash": "148a2b39b28bff96adcd555c992d64b4cc026b4191b4ad4f1f00000000000000", -"service": "00000000000000000000ffff80c78492", -"pubKeyOperator": "804cbde98d429e6c4cb1e1748b6350691543fca26d16c211889beb51b48a6d32af77d7967e6c4c98b0e062cf9e7f6440", -"votingAddress": "4XAPbGiZ6QXevkQRXhkQEHdA4Enz", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "b3cb2ad78cee1794fa2a52ae54877f88de32b601cd3b4da07d82b8baf08b04a4", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688e024", -"pubKeyOperator": "0ff648d7858662b49611a92cac234f87fea7689cc701147fcdf3151286c60c1f8a2b3b4dd5ed08b29721a3eabaa0e2fb", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b3d828376387057e6d487ee46dff5ceee98e25aa9b3dc171e7fd91553d3257fe", -"confirmedHash": "984671fc89c282b4c317406d7bb0d0a2959a97c5df39960b2900000000000000", -"service": "00000000000000000000ffff87b5322a", -"pubKeyOperator": "03f5baab255f987e274ea19b1b51c9dd06ae739477b6c4ad3a2f207967e469cacaf66ada2a59bfd90acad1bb0d9d117d", -"votingAddress": "Ve14LnKwjmYyKfFdHN4muKPa7Jx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b3e0943135be96a87f18061d1036561915783b960666de2af9ccc9dcc1ef8d73", -"confirmedHash": "26bf3662d50a841f4a2f0048f02299a071afc0f06da6a9ca1600000000000000", -"service": "00000000000000000000ffff95f81402", -"pubKeyOperator": "839dc50698828477261e7a959f39a8146fb866bc9be274a56f270725e3750ee2e3b1d5dde522baf4a2bc8ce18fd0e938", -"votingAddress": "2zeXYYXhsFYH24hut9iapMCbdRXE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b3f57d131ac73c219e62a327814c1b8f4a3aa1d5499a62a2cb53327325abd21b", -"confirmedHash": "13d3fd85b30fe86f2fa97e8cc7c69407d35e94fa2e898d660400000000000000", -"service": "00000000000000000000ffffcab67693", -"pubKeyOperator": "0fd517ca7b750d3c815d4228e2b7641aca9d05afa0e9d3264af29047d434e61a8444ef3332055d60d95fbbdf1c9860e2", -"votingAddress": "SDAGzsWk84tVCptBCJQnNbazVfp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b3fade6a0306792d3fbc1e592bb1a6382fd6f2672b222c06b7df2f00641f4503", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b063", -"pubKeyOperator": "92e106914d3a53e9aa2ef264aac0eeae725d6d2e6aabb6ae2247f2346a7a950b1a71eb2cd5a65c70a18ba2aac79f2528", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b405f585ba44cb0a6ab9e87cc0b0cdb42fce49a1fdbdef5abe8e6a881adb2a5f", -"confirmedHash": "69004b26d29cc127a368576b153319a3c2aa6fa8ffa7e54d2500000000000000", -"service": "00000000000000000000ffff6c3dd12f", -"pubKeyOperator": "15e2d2834fc3178d32928366c7073298f8b5245b34b2da62b79b6cca0af152344d26bdf399d5f7226b8cbf37756587f7", -"votingAddress": "2rvYftJWw4Lvxyn8CkuMoWTKvtu1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b40dd97d26c97a3d0c737b943c3e3eed3e4350cd1b3a10b5fa44e74bce6d4757", -"confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", -"service": "00000000000000000000ffffc3c906ee", -"pubKeyOperator": "899efa9186f74b483c615db4c3eeae226d5b50fd6ba9dd7cd53a5dd794352ee1c95a77026fbd1fb17755290b9a7c3427", -"votingAddress": "3M7EEoxCQjuPQBjt2Zy3etmJXpJ9", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b43ee324cbdf7558f926b24c61331b7ca3fe324322fe48bb24db4195a816ec30", -"confirmedHash": "0b609d0979c615de550a077f44abb47b4444dfc9aaff37380500000000000000", -"service": "00000000000000000000ffff80c7114f", -"pubKeyOperator": "043376ad6a2bb51c1d4805809282fb62d43199157615f580cfb4e7f1e465877ab35df52a50eab851a19ece461571345a", -"votingAddress": "3SvapVYDQozcsN99knCakqRCTtMt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b43f414a5c3d3c22b66b7498939b7c4a795e393900fa938c9fd118569477bdc8", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96887fcb", -"pubKeyOperator": "0bc247797770d29f9c97f0406a7a8f00a520b2d4e5fa43c2b4b372264488e7a22cc9fa03446a585ebd0b9a9b40c8d684", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b44a195475f345fb99d9548ef108f2f6b9ab125382b665930307ba2bfdf991fc", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff23a6a238", -"pubKeyOperator": "099fad034089a705c0ac19b7834c6538307b419dd41f239c009589120183c11daaf2208e09ceffb7faa0fc6eba58273c", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b45d015fd3dd796bcfd39ab7fd9a72f993ce408861978c718d3879083cdc83d0", -"confirmedHash": "392c6c05b721befb4e74979f9d4b2b54fb4a507c6196b5af1200000000000000", -"service": "00000000000000000000ffff2d207f67", -"pubKeyOperator": "15ae4e4f9205dd27e6f162356df01d50117c0b53af43495af739251d532272eeb9ad6dd58ed235bdafcc823d5565a948", -"votingAddress": "3f3XMiRS9RzNeWvEtw44fdsSybBr", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b464febf8e6ef01b208bf80f2d357ef160afe151031bfcd23e7f259a08552371", -"confirmedHash": "bd76f4225290c65e069a89d6fc8e52c45cf68b518df1d2ea0600000000000000", -"service": "00000000000000000000ffff5f6ff51e", -"pubKeyOperator": "8963dc9920ca57fde67ddb71f6496a76c5c02f1737282ab57a0a5acaa76d2eca962c5ff64c23233f3502b5b7c9d3e60c", -"votingAddress": "3v7LqYW6H195HNDksT8skhXh1179", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b48d69e1533955c7134c68ce081253f29e1e8c5bdee3fb0a4022ed9aa47b4a85", -"confirmedHash": "8671a2dc7b25a9eda75312975fec8cb56bbba8a27ecec90e2100000000000000", -"service": "00000000000000000000ffffbc28f173", -"pubKeyOperator": "0734b47a939738a70e1fb310d04a2f9a049606a6028f48dfd59c69c0dd0eda986342d63132e0df02862a4d3c5347ee88", -"votingAddress": "2X9Yza9NA9uqDExw38zASxYnxXCd", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "b498443e5a6fe89475e5e6664435db2047be30ea3bf87d87dddcde868dba61cf", -"confirmedHash": "6ea04653a54129afd53763b48bbd0d65ec62282ed2570f4f1000000000000000", -"service": "00000000000000000000ffff74ca666c", -"pubKeyOperator": "02025da22b4c39a1843ac6fb08287dea4c8c8b2ece873cfb215d2d9ea4500cf9fc4d152ad0cf7754af2eb63277f90156", -"votingAddress": "3F2fWqMe5kp3cSbP562FPNKm8hHi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b49999d29330a6fdc0c3198cedc7c192153e756cde2d1d5b8b2ec0720eac5804", -"confirmedHash": "ba786af4c205544d07f5ad3643af93f6b030eabde964f3ee1900000000000000", -"service": "00000000000000000000ffff416c3842", -"pubKeyOperator": "850704c9e86fc8e98d3a809554fae81e08ef368058183cc32d7a6346da6cad2c369345edffb2879f22a7a290dabdb385", -"votingAddress": "2hMLmVvHbUXipNN9aYSrzTaboFWK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b49a284d0a64ab178189e0e759af345905b5963084281d4a815d73bdfd820060", -"confirmedHash": "85e9ffaf88c80930b22ad1042ada59a751879e549629cdf10a00000000000000", -"service": "00000000000000000000ffff2d557548", -"pubKeyOperator": "071f9c1cc27b7b7db4c3bbd3bb46e3c03d45c292ba681c50a48f73b0e7d6a55953b50500a63f4e272e28fb1db038f42c", -"votingAddress": "HdU9u3Lp1tZj7h6WWfXioCiZZ5P", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b49f18aea7595c6f1c90e87be46171ed5ea57eee872051408c7f7be97f055156", -"confirmedHash": "4130b5dc087f489c12277f886d58978ccf05fa57e694729d1400000000000000", -"service": "00000000000000000000ffff52d3151b", -"pubKeyOperator": "8b3f00590d0f05443def6a67470e71de676d462d8dfa902505c21d5056e8f3c94eb9d9893130f9bd0ff3f7243c3fb530", -"votingAddress": "4QXtNyFfQHeJzDhnTpKEd9wj1qer", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b4cad71e9900c0e5ea84ca7a3ad9082ddcef7391d49cbba34374e870dc3ce4f6", -"confirmedHash": "8b763d49a209ac48f25c176ba9869924ec3992fe76a273c10500000000000000", -"service": "00000000000000000000ffff55d1f185", -"pubKeyOperator": "0a0476857827a43bb0aa33b979990c2ad40bd03c02352e4d66c1a57b38c3ea3488e54654824acd36cbe0415e0cd7f16e", -"votingAddress": "42CcR5wi3qvbfBLmRNbwRnzdttNr", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b4e44e9b059153c161ef427f3d653ca1d3a255e87568fc9a09bb542545200265", -"confirmedHash": "e96d46f900cea916af80c4f272f42c951af74271e8a8e0322f00000000000000", -"service": "00000000000000000000ffffc7f716da", -"pubKeyOperator": "0b8d1d3355a0f37a365d9e0e42410ebe6442e36a0f1ea3c74467d68145870b2c68177867bdbe11b138303482da470e7d", -"votingAddress": "33VtQeoVhKYn77fV5VZZjkgfSUeC", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "b4e4565e4f25e691697be946c0c0651aa2589109407894d66bc441dc3840ec5b", -"confirmedHash": "58cd2211d3576b50f2b46f0d6a3745b254b75da186f62be21800000000000000", -"service": "00000000000000000000ffff55d1f25d", -"pubKeyOperator": "96aad4f424fd2be1d8ab089dbf6a9883b38835bb1c4f0efb148708f5df54b188eac863accafe509129a2247c5b963989", -"votingAddress": "3noHYHnrBLk78XqpNst3Rk8BHWd6", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b50007d4f9ca53118cf5b6cf9d9daec5baf01a2213f1d32e68543d839d368542", -"confirmedHash": "0c51cc801772f13eec460b2838fc07bdd4b37d91a23833050600000000000000", -"service": "00000000000000000000ffff6deb4717", -"pubKeyOperator": "8f72577c3f4fe70c1ed0880bf478de03b123928b38b44ba23e8447cca6bf73e0248a2a5ff15f5c2f09ce118717c8cadd", -"votingAddress": "4YVfjM32a8FmmaH4BYdsqu8esiQp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b506e2f521574ea720f302209ad705e4eac2d5cfa0d76fbae194a85e1158c95d", -"confirmedHash": "a90f779cebfac63d530d1cda1f59f79f28814a868b9bc2d30700000000000000", -"service": "00000000000000000000ffffc0f891de", -"pubKeyOperator": "87a26e03d7b10f61dc37b7b27aec5b18d788ddb243d98e6051c492aa43bd3ead81d8d9145ed5fa1fccaddfab69b8b0ab", -"votingAddress": "4DUqj2qo9dkDecYcSMphFYE3BqH9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b5082eec91475a095869e9ac46857d22357377ab7ac4d9c2a2c21b8397bc4b66", -"confirmedHash": "e6a44b335d556552a28a82e936103f2917af881360a08a9a1300000000000000", -"service": "00000000000000000000ffff50d1eba2", -"pubKeyOperator": "8e67efb5efb4c8745084aac784f83378681092acf9fa91d102c6f7dd8468608c1132decffedef349fae3450310f589d2", -"votingAddress": "4NXNYfYq7J6ycHN87zGLVLHVa8jP", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b51ba07063958fd20341145ecfe630e290edb81a96aceefb7769b7bc5c1242e8", -"confirmedHash": "90f46ff7476503c26e0188a371937926b1ab8c3f91943b390600000000000000", -"service": "00000000000000000000ffffadd4c6d9", -"pubKeyOperator": "12ab20fdca6e15fe2141b81e5dc4c6d70195a8e69ba0ee72e13b9a0750457e2b920d8ec676f5f112bbf4e0c87b0abca8", -"votingAddress": "1fv7vHWV26zaZNFfU7xLjo96FvJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b52832395fefc3368fb3c4d7ff1f7343a40837dbc9e7565786b8defccd36daec", -"confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", -"service": "00000000000000000000ffff52d315a8", -"pubKeyOperator": "954b5017998fe8a16d3946ed13ffa255c546a1dbd478e5bb3a2657de4d331a6abda1587ee83a8c6954bcad8ee43bb16c", -"votingAddress": "3XhohE8Hq4g153Nf9DUp2gArEXgU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b5494d7add77845988f61297dd0e1c2114b885e0fb827068e9f53011510cc0c7", -"confirmedHash": "a917cb9c0568c72f22ea0d63651c4e153c93ca8eeb94c68a1800000000000000", -"service": "00000000000000000000ffffa45adde9", -"pubKeyOperator": "8a7fed582772bd5b1bd5ce18cd6647103ac7546ecb26788669d59ce1d20d5c23622615181a0267da600b56180afb4a59", -"votingAddress": "3GMRFtrdao4TPMGgXEaL1Zx5vhWH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b557ba779a7c20598a9624b91eb2f3117f31df7d88911ffdf68815c1d8e1ae36", -"confirmedHash": "5cd1ffc9d7cc86bfcfb2d344bc10512fd86ebaca41bf4b5f3000000000000000", -"service": "00000000000000000000ffff52d315e3", -"pubKeyOperator": "07cbe435b4b9a5c2a35d6935edcae152b74cf4690b67167ab6bb3bfc968713b421b3396c45b740f4f47e28ad63651b68", -"votingAddress": "26dwEErnq5bb4n3fudRSMwAFSo64", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b55d829ca2c8d7ce89a46ee3a8abf13be9520a04bb8308167103886829c683d4", -"confirmedHash": "6a5e15a6654babe6fea0a9fc4bd0b704b270dbfd80a776e90e00000000000000", -"service": "00000000000000000000ffffd41860a1", -"pubKeyOperator": "93e5fe684f64d343c7d2caec33a7004a9517f17f58b0db343bd08823ce4926ddfd424caf4f14a07d5aeaf38523bf3fe5", -"votingAddress": "2o6Qc4vVncL7nq2rZ6shqdRjNvSP", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b56773b9ef0f147874c82aee73d2c793067a76ad42fc9f47c13c024835a3bb6b", -"confirmedHash": "0a3424ccd1d4d1beab23b417ae3ceb3bc221f8ec14d216f40800000000000000", -"service": "00000000000000000000ffffb951a469", -"pubKeyOperator": "883dab52e19ce6158357283a120d3e898a90c40546741b52dfd265fb284b8ff5c563ef7ac74c419ce8a46440fce40d6a", -"votingAddress": "3YpbtaYaPaDdmgpkTmaaJdgwjJKR", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b56d5e775903d17967d1156fe99b515b12c5f67795e374995a391221cb3ca604", -"confirmedHash": "97a83aecc1a51786d3cf8e6a0a00121ef9ca46d041c9c3df0e00000000000000", -"service": "00000000000000000000ffff52d315c4", -"pubKeyOperator": "945f6ded4626c20a8afd236ee0f205c3b88f4547f10579b13e22bbf691871327807a1871e450e5188672b98d4f06b24f", -"votingAddress": "YWnq5oPjf6xejtRPL7vF7FZRRFm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b581298ecaf34d471ca02dd108905aa6f28b2a1fd6b4f08f22b2b17bebb14418", -"confirmedHash": "74fa6fd5fe40482bac138b4d428a7a5ac74417698045bc2a1800000000000000", -"service": "00000000000000000000ffff5eb0ee0a", -"pubKeyOperator": "94cc2df48ed7197d479337ff9c30d374ccbfac3f6a67f81fcb96573625ee418f3249a6ede19efb2d47ab739769f091c8", -"votingAddress": "21f76RfHekV3jKstZAxPa5fJt4AF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b58c2bf4d6d3891a4dcf967f93e5e98aa1b959d36d73d5699aad4566154bf90f", -"confirmedHash": "17415463615ab5911377882fa2d05bf09acedec78ef5e99f2500000000000000", -"service": "00000000000000000000ffff3e71ff04", -"pubKeyOperator": "969aeb43c54f644029906795b5ba9113edf0eecd696a263bf94c45588097c92b93fa3147ce52c0ab662fe8dcc4075797", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b59eec89c4deffa4b2c6cc775c398e72e50bf800ef96814b3d3b06b6dbd75a16", -"confirmedHash": "8fdc8edede3f77653deceeea54a5e3ff2767cc2f7abf646e1300000000000000", -"service": "00000000000000000000ffff5fd8e667", -"pubKeyOperator": "81a5c8199317dc83bebfa4b00c3c50c3c3ce9e1af8271016c44821dcb3f4a8181a35c21e3914d765f5a4e2059ebd5bbb", -"votingAddress": "G4gpZbaXmZRhTELuopJNiFFVquy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b5a6e7adc57620b8aa7f501d2d13ae7a4901df1f71e763f4662f72d1b965d3c0", -"confirmedHash": "2d80f08d00f69d649ff6e05cf1046ad2ef35b598e7c8c2840200000000000000", -"service": "00000000000000000000ffff32740244", -"pubKeyOperator": "0f5949e8d4a92e27762486377abd7866eb0907087fcd4c668629c4fc66a27c2f425c909c547bfb14a43a783de6db2391", -"votingAddress": "5K8yLogmnNQBjd9YM22jL9CvxpC", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b5b9c0c07007b3a3e4eb44171d4e669c5de1c5f0aa9f2b393290a0c356217049", -"confirmedHash": "4fed360464befdfba9c36d625ab5899541838aceec4a54ea0e00000000000000", -"service": "00000000000000000000ffffb91c6591", -"pubKeyOperator": "0e9fc0e6b20e95e0d898fd1a9486cd31a5438581dd77ac5347a9a94c6cc5d07b1d7a9d670a037a45a623d7b537b94ed1", -"votingAddress": "4SnwozvKndoNGMTSMHHGB8rWjMVs", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b5c1d50c066741d03b2bba66b4682a8b13ebe1403a05b8ab25348a17e49a6fb8", -"confirmedHash": "b16ca98235908de7c923862b2fefa145223df293267847400200000000000000", -"service": "00000000000000000000ffffc2875ebd", -"pubKeyOperator": "919843847b2bbefe80c6e33621509fa9f1f88654c8dd153bb5aa5f3e300ef59e8a65e2da672718f69e5fea51d078a6b4", -"votingAddress": "2H77kLnMFZtCygT9Wq1LZo9mmDLD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b5c28a88d8774f9947b03b12107057e960e8ad2a4981e2614d92753ca8756fd4", -"confirmedHash": "18dadd01b9d0861e1a2c0c137aedd5c026be5771a491b2920b00000000000000", -"service": "00000000000000000000ffff8ac5aa50", -"pubKeyOperator": "1289d52d5f8ef304c05286114a3d54f14aceb45c5449edab613fd4a0fe1d44d265f12f18840fb15465c7359b90dc0a18", -"votingAddress": "34deXoD8V7gmVEHwxeyZwrzkAp8C", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b5c550dffd65ed3878b0beffd749a95c2c17135fe558aa407aa8fd5aea4a096f", -"confirmedHash": "70b80a3d17b98f1b0aa0c91e018fee29f23855031ea757201f00000000000000", -"service": "00000000000000000000ffffa516b0da", -"pubKeyOperator": "8f896698e3ca9ed379f90f34d263c5e1485a4c697c042407894d3d25c8bfe0ccb69d1eb8af054f317de002d39c771c25", -"votingAddress": "2nPfUHR7cXXpNvwhhz5mRpzBoLme", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "b5d00e0eaa49532e0f0ef21e565d246999f2184934a8e86f7fab49e9983e964d", -"confirmedHash": "98e062c23dea81cc826007b931884f048f1482b4d146dee60400000000000000", -"service": "00000000000000000000ffffb9248f0a", -"pubKeyOperator": "8e433404d5169db60433f21db99edcce1afcb548d2b0414c9dbab698148aaaf8d91e1ee94a021404e5d8d3d644835659", -"votingAddress": "2tTBQKfRsueEx3grBZQTfKuNFRBv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b5d15b05eb1d644185d49e6f665cc4a3f8129b626e54d96ea253573aa6bb025c", -"confirmedHash": "0bd0b6e25dbb511814084fd886522b81a34fbabd17724f1b0900000000000000", -"service": "00000000000000000000ffff2d4df08b", -"pubKeyOperator": "0bb8a85c44a50c814b4243718dcc8adac99e73db9f0f2b2bf03a45d98ff7df33b285cbf4ac616a397022d5673250aae4", -"votingAddress": "2HQLpyXdZM17Tej585ChEEYVyiBZ", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b5dd7cc47d7086d5d237f3aeffb9558e90a12e9174465f62540d16efd07131a0", -"confirmedHash": "c0ca797189180c2ab8dafbff6bb181468540efda5ffaac3b1800000000000000", -"service": "00000000000000000000ffffbc28a309", -"pubKeyOperator": "0a62a57ff1ff592dc3dbb0c1155738c7cd2b6595b803c12a8be0b8f9f0f1e3d4d8ea286d9dacd54dc1ce0102530b1085", -"votingAddress": "3XcmMPXpbDS7NtDt6VF5RcLNdinM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b5e808182ac295e7bb2940bed843eaba2cbeb491e7c5e1368191ec7de24f28a0", -"confirmedHash": "3ee7e968fafa186c9aa6711b39eb8bb9bfb1c6eb3aedf1393300000000000000", -"service": "00000000000000000000ffff8b3b85f5", -"pubKeyOperator": "8e48139b8f928cb31a930db3f6dc0f4d6a1ca0bea30ad905033f01276df4d365044b92b840e64c50c17b8bd8ea3fdd4b", -"votingAddress": "2mWm8DnfVkhtBMU8CiobmnwV5G6t", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b5f5007bbae4bd0a0597fc2597ea69454fc94d0e397b1b2d16b77cbd9c87c48d", -"confirmedHash": "43b3caf59cbc5331ce20c7c1be57c84ded106d611d049e4f0000000000000000", -"service": "00000000000000000000ffffb07b39dc", -"pubKeyOperator": "0abaea100e1ff28236f777cad46cfb80d5f2d60703fa0add5aeaa9d86f4a59be1b9c36b50a52b42f1c5990bb1dbbf22c", -"votingAddress": "3o6AsQNsXWstWKkvU6hpS4r1j2d7", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b5f7d8d370848eb07aadd1b70e2fd95ef2dad03175cf3aad80833fea41b90808", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b074", -"pubKeyOperator": "8e2ffcc88d3946525de3b6d426a32a1c275e2c9355b36ef2080042310adb62278ed73a6cfbcbffb56fca91f84a912218", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b6024c842158d069102538fd544b8ad6b3fa657eda1f252d7b9253fb0757f49a", -"confirmedHash": "49d32b6c845d993d7f8d22a5f94d9d1a3f6ba197703295d10800000000000000", -"service": "00000000000000000000ffff80c7c29d", -"pubKeyOperator": "06f972ae1ad09d8b0594217ebaadbd2df561866ce90d2da26f18f678b40fe0f26b5061fe73824416c8f05081c1a962f1", -"votingAddress": "pj9XTN151rR2JTb1XwGEGLJ3SsJ", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b62eeb5db1177e99e6f76abd10c77ad1fa5cfdfaf57cb867a326a0ce54c3a7cf", -"confirmedHash": "fb2d7772619d06e6b9b986e4a8d311ed126767c76aa729592200000000000000", -"service": "00000000000000000000ffff8ba24931", -"pubKeyOperator": "91eb8c308ce3e53e56f55258f406157ba5f9c069925908e7911989fab17439b615e75ed12cf9a9291e851e14daa8befb", -"votingAddress": "3DUwgcL9jwf1W9cDVBWg3G29YGEd", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b634515ae2956faac2fee04a04c89175164f5178119b7960b331742b4128970e", -"confirmedHash": "19752bf5f7c80d0d902f03f62807c11be1be20bc293cae792300000000000000", -"service": "00000000000000000000ffff1f946368", -"pubKeyOperator": "8660eac51fc395c803388273a6f65a90ce2e06160893cac61e325c7bc3e279f32d1b2bb3655aa1e667b2e4a81083b460", -"votingAddress": "aEZAMKkbWMj8xyAVpYcYsk6YbCj", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "b655645f6c280db4143cec923c81a36326c16dfea0d39976a7a1e0f0c84b9488", -"confirmedHash": "7c13c75dca54c44f63772fa8385e6756b886361e9e97aada0b00000000000000", -"service": "00000000000000000000ffff88f37380", -"pubKeyOperator": "0d6720db1bd4f71cf46d17427444545f7eaaa066fb43db7087fbfb8d7c0dfb6a9ce2ff5f36cfbbd5a9edb19b32ff8eb3", -"votingAddress": "3iRyzkZc2WA9WuqRSCq1bgfzp6ze", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b6686aa2096ed07e478f72bc737784c61b8c8622147dc859a3080c7aa4cb2af4", -"confirmedHash": "bd31f35c5cedbf07c6ffa716f2a3acf8f725ab42af8758740500000000000000", -"service": "00000000000000000000ffffc0a90792", -"pubKeyOperator": "082e86f00cece842aac187aadd48a7d4b87480e81221a39d900cce863b83f1eedd614171c77c068e45c53131cfc307bc", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b6814b14c063d89d3518af53aadcfb7fe9d5e779c481b8270cef56bc3439db2b", -"confirmedHash": "b563e10430ea5fa58ebdf7dcad3220be8283890bf74218930b00000000000000", -"service": "00000000000000000000ffffb23fec65", -"pubKeyOperator": "94c3c84106bdd231aa8810cae2e8f3b8c011af1243af838c43b835fb075d3336226ed8e6983cfa314e92b33b9507ed3b", -"votingAddress": "3Hx4wzmeZVUp8LdvMcDxLfM5Wcf3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b685885ebf6b3e54200b53ab6b9d9b9aec05a70c567f9af4537e2d24b4217490", -"confirmedHash": "932447da72e777f2289b1c6bdff09a9dda8c76868555eb970100000000000000", -"service": "00000000000000000000ffffcebd0e55", -"pubKeyOperator": "0b28d3592a0fbea905453b7873ea25645ef57b28430c06377a63e5ffe59000648e600fd55bf09eae25b319274cf83ae0", -"votingAddress": "q8FFCdwFikSjqiBqT86kZMXwGB2", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b6a913cab763b0b1affd793996d2785db515dff14422c98df97a6879c53cfa0a", -"confirmedHash": "06a2867e36d150643de89d87c53c9b6b9c6a195f78ed8a580500000000000000", -"service": "00000000000000000000ffff52d319d6", -"pubKeyOperator": "02da0211ee786876d97b0aa7815e12311fc3d3aaab535e1b2201e178d389ef854a9262ebc58d4e88a334af53f5ceee64", -"votingAddress": "2La1MAuUZiSVsEZpQV3rQMneq6kC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b6c3e66e87f31a18fc1f81f4f9e9bea984c6eb3bd535c416a244d6ab1dc25504", -"confirmedHash": "b0484086b619626c486a13b3787192719fb31d3e2f2e2e3b0600000000000000", -"service": "00000000000000000000ffff80c71005", -"pubKeyOperator": "87df66ce1ddbcc132355fab4b18e118868b9e028d2b89139ee203a67560d330f4dd07d1f82fc8990cebeeaf52aa3b2de", -"votingAddress": "2h3ucTb9dBw3iChdD2nFrsSSo4mn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b6d04d10cb3550728ab5088aaeff385fd6865aedcbac2472ca29235a16d8a416", -"confirmedHash": "00787909c9b5eba48f1473f57bd3114b2b1262a7ac3e74831f00000000000000", -"service": "00000000000000000000ffff55d1f148", -"pubKeyOperator": "998048093321e9d6653d17be9c1bfa274520a44dc01f36c163f1f5e731f3b83e862f936fa9858b57501c6083e4ca0cd9", -"votingAddress": "3uUfiiTbM5UFCL6f9m4f1oXSK4Fq", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b6ddda3cf879b97f4aa045c9ce373806c438197c6f5b3f27112fa4bfca51c391", -"confirmedHash": "5275090ce174ecf6044bfa6b49a5885bcfc699786530838b0f00000000000000", -"service": "00000000000000000000ffff335380f5", -"pubKeyOperator": "0216d13d9309c6699995801167fb0f15c804c91f2411f8d5fc27f44c50d955981e3aff9f9fc2fd1f830f07d52fb5dafd", -"votingAddress": "31dz6rEUgKxfosqbc36EfiZXv3vF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b6f1d07faa63c7a4a9365639db4a05cefd96b2e06b6c4f2b64aa19bd96daf004", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffffc17a9c1b", -"pubKeyOperator": "941346168a93179db28bff78fdb5690d2d6e1cc2576e91d3a3b2143826d55419f9ebfea338c3261a5583be92fe30f9d3", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b6f1f3bf25eab079b939c032cea47fe6e2e522d3933af61d6a02ae87486548eb", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff84919e91", -"pubKeyOperator": "91108f57509ba0c415093840e2448efb62af23998e79ff96e815e7967576e3374708121f578b391a65a4e9f18082d828", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b7063cf24ff8a6b993277fa39c74d78dccbe4c520a64ff252e8d2c03eb0325a0", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0aa", -"pubKeyOperator": "8e1010bc973e88fefcbc99a547a319a4c6b7fda0a4bc81e31c7310f562a2695baf439c3337765a568e8245daec10fda1", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b716445f1bede7604d29c2f96ca36053e9ecb88186f10202ba89c0e79f7692a1", -"confirmedHash": "8742eb4ae3b7f37baa068331a65b1ed532b0b9d70330daee1100000000000000", -"service": "00000000000000000000ffff9f418c9b", -"pubKeyOperator": "0af7554d7bfbae333c973370d2d3bf93b8ee122b083a721fdb4fff11483f2ec22657bf88a02731daa697c6fb1ff48dbc", -"votingAddress": "2AUyxj9CHaExjW1qyCGwFWYjAdi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b72feb1bbbbae53f680c8cb74a7784b90c0069130fba2c2f0c695a2809a8e728", -"confirmedHash": "54ca220dce6177184e60d8a3194e7046c2aad4e4adaf83190f00000000000000", -"service": "00000000000000000000ffff52d319ca", -"pubKeyOperator": "188650a881fc99dec27ef70308774dd7abf6a580f42c1c05732b2cc145bf33918fa95f72e8dab7b88c36bf85ea322fa2", -"votingAddress": "4Czt3sFQCVWrV4XMFJp8uTGZjBS2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b73d4571c4c8e2e1c7ef9e3c8b00f8dc186bd249f0ceaf43874990add5798199", -"confirmedHash": "efd5db6a8e5340a465aef98e8fd50c9f5457bc33f30de3690300000000000000", -"service": "00000000000000000000ffff55d1f201", -"pubKeyOperator": "9666a3c9f5eef640f96d3eee59b8f6498bdd055c7ae4b68a046477a908b032c01fb58f0e8e29eae6c04ddc9b51a54dcd", -"votingAddress": "2JVwKbxXBdPfSZEahrNR5mcXfyLS", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b7404dcdf0532826f06585decd51e050a437d804cfb03bbdcfa286f00caaee97", -"confirmedHash": "47247948e618e1b287d9faa53f2b8342a5ac6b656e94d9600500000000000000", -"service": "00000000000000000000ffff2e04d9f1", -"pubKeyOperator": "163cc87ef2a1c76cefddf4fe93eb5fcdd92153a9f799b038956320675d4cbf78086a79a75e04fca3d8ed5f39563ff556", -"votingAddress": "4Tc8wfHtHB2Q8xaZkdiTwUAu2TC8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b749c443ab0f64f158b6b16cee79a3d39083c8345f8305b68d05b297c789c212", -"confirmedHash": "fb1921fe3c188a5b13a156613a98bb072aa411f3edbb43b90500000000000000", -"service": "00000000000000000000ffff55d1f289", -"pubKeyOperator": "82d03091f1210303f63629eeb7f698e8c5fdf6f59ac600d648b52c74ead39ca3223e68827dd1d280082cdb6d3c7367bb", -"votingAddress": "2YHQAGdC6tHS3ShcPF4nx3NNtUYu", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b773fe18582092d56083f6b05fb2b24043d7940b04d379d2a07163f14f44ab3c", -"confirmedHash": "49f51c19e41821ec97a3744bccbb3c719814c1a4aba75c7c0600000000000000", -"service": "00000000000000000000ffff14d02ae8", -"pubKeyOperator": "80a01e71a13507fcf491160f83a2cb079b2f78cf3393a810a9d6ca42292d480d98e774a376677db531b5cb9bcf99fa0a", -"votingAddress": "3KJtaUihaGFEzREJt7ve9aSE5XKu", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b77410ce67823a67d25bfd17fe35e72b86c98407186fcfc1ad82ac78072d2dd2", -"confirmedHash": "4ab4d287596ce2a0908923696ee4cb20df34e0999fc9a9660c00000000000000", -"service": "00000000000000000000ffffbc28fbcb", -"pubKeyOperator": "0b6abf17b6d3e19533a2d248bf6ae924e30996eb1e015808914772eea21ce3585977331b22631edf553712b774aea011", -"votingAddress": "a3yyzVP5fN4SkYPbe7jtSJf9cUN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b776baa83e6d17f7b502b6dd1d57ab99cadc8a37d8101e4bb81db356486f9b0e", -"confirmedHash": "6415f0621bef2e358a347c2e77d68483407e9f6d05d336851000000000000000", -"service": "00000000000000000000ffff87b53220", -"pubKeyOperator": "09b9e4417ac9fc8361be0c5bd30485b4a2c0f5e52cd6c685dbdff7a3e6a0e77a508d4772abe8d9ddca6eac5d5a18625c", -"votingAddress": "KhdUXGCXkJmLUwcP6Xxm5X77zwi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b779ab348b91f57a2c836222f361203a5eb8bea1071061e43447ea3a659f1032", -"confirmedHash": "b60c2dbbb213c99a236e1f30c1d9f41b204f0b13b294c83d3300000000000000", -"service": "00000000000000000000ffff03e15bc0", -"pubKeyOperator": "0653e9d25cde2e63efee0baafb59989f374b82bf37581bf5f6d87453b745313d9c4fe6e709f68f01951d416fe9ecebd9", -"votingAddress": "4U67CfA5Uxy4t8tv7tbHcx93ygyJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b77dd27865e3a18833c2f911b0d3e3c938a05310e987c62ce873ff47a0a22f1e", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688b673", -"pubKeyOperator": "97111f4f8717c24890ecc9b0f51dc2a603760541030cf8350175fc2152929eb08650b3027c2192598f13e553c5a14ba0", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b784055505c58cfe16a08640d5fa0927bddf204176e829256941d03f68669c51", -"confirmedHash": "8c60e5dfcc3fc4b6eca5c8f6d068a02e48761c7cd8e825011200000000000000", -"service": "00000000000000000000ffffcf9ae42c", -"pubKeyOperator": "0af6ef429f3cbd3e2aea47c8174a94cff9bdb5299aea277df2d5244860b201ed81eb5718a3c7e630eb5ffae375b70bc4", -"votingAddress": "3ULJo9ERiAtGmF5FKkatcgt5nveD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b7904d0f091ed06958e3025b87a87dfa52beb561b75e4d30ac0cd6187cbf6b9e", -"confirmedHash": "31aecded66ee88ebb0f968468e270a8a659f7b7fcf3262ca2400000000000000", -"service": "00000000000000000000ffffa763536e", -"pubKeyOperator": "971cfba5c46df68993c69deecc8f90c730ec00cc60329ff3887dce74b4b621268269cc0d9293f8484d2eae23c1fc9c26", -"votingAddress": "2bWqgG3u5iuj2KaAv6RPnYsuqscM", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "b79d71486b38851ee900bdd1bd865a3f2c84bdbd4d5e55125719946a9c28524b", -"confirmedHash": "ce7b2c59b1eb21d5be961df3685adc6af36e822fe40d089b2800000000000000", -"service": "00000000000000000000ffff87b53228", -"pubKeyOperator": "83756ed527e6e4d9cbca633104e5a70a844c2e64bde151f066b06d5f7d48c1732c1003f4214f6bac52433cb6a5af997c", -"votingAddress": "23aKftGb7w47U9Q4UQMMD4q3fZC1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b7a9a612a6ef5d1f93bfe00074506c678ab4e69d44a0a0eab61d0d6aea03a4c3", -"confirmedHash": "168ed03cb03abd1ff75950e52fbee27a3ca7c348ccdd67e32600000000000000", -"service": "00000000000000000000ffffb94068dd", -"pubKeyOperator": "030ab5f00c2c79f5b3c6b5c81f9b6fcc787e4efe34b9bcfe9cedb6b996fa0c132cb0323eecb5ea161d0e01fec8786ab9", -"votingAddress": "59cTf9tLNG9Xnos3QGadY6YFZzy", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b7aa06e2adeffcd554ac1b9fb07c8001f8e02d62b7ac10f695e2f838e23e77ac", -"confirmedHash": "5c68f7975db4d7563096158223fbe30e048dc59fd41dbae20b00000000000000", -"service": "00000000000000000000ffff33c324ce", -"pubKeyOperator": "8b3f1009c4e3504253f11609b344fd72d6863af96b8dac50bf9eaaaca24b6fd150c85d03c53f9dd5682660e631e5742f", -"votingAddress": "2DAcLiao1SZxoTzxBNcLpM6qeBnj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b7b7010e4824c79a92336d249edcfd8a46d9f6a3ec812335f256b70ef49062e6", -"confirmedHash": "f21c36f9de929bfe132d251096aedd0b778e12d37c9bfa1c0f00000000000000", -"service": "00000000000000000000ffff8e5da73c", -"pubKeyOperator": "0d27b0797591889e4119c67fa2e985a340d0b70cab62d8d815b2df472e98debe48f2ab14ed6d0a48067089858664043d", -"votingAddress": "MShUDDPUoNJoeuFPzUxJAWkWPzx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b7b8a2945a2e69c983d168922607009362c60633211f15bd36e7795c786541c9", -"confirmedHash": "157bed99bd3d14f0e10c4cfc94f8f9be2a003e693586f9290b00000000000000", -"service": "00000000000000000000ffffc3b5f37e", -"pubKeyOperator": "06c91d5b8eab7539e726d6745ecfdf69b250d299173a6d3f946b1a145454946993e3f0a62767c914264a5265876242c1", -"votingAddress": "fM1NBLdViwd32ErZE7LMU3VcwiS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b7c024832759251e45612ee669eb0545d69d4b79b8f561868770619a453f5823", -"confirmedHash": "92b683438f3e5e5d94bbbdb09159ea8ac752d0ae4b5aaf641400000000000000", -"service": "00000000000000000000ffff55d1f274", -"pubKeyOperator": "98ed06e5445ef8d5e509fb399ecb28503a4c45ae264d5b8e92e62a8d21a2ea8e5bee6e9a972abc9a8dd15c62de9e2bc8", -"votingAddress": "2gGjPKpPkaCotyxkpiakn8NDJYvY", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b7c3b7824d3e08749d1be5a99c207bd42a1d471508383597a5a23be02cb7018d", -"confirmedHash": "40155ff704d511d70f5b8b3c907ec547acf8365a719edc681a00000000000000", -"service": "00000000000000000000ffff55d1f180", -"pubKeyOperator": "0f11500f1efaa5513e67174154df63a7aa7e79cc945ed7f5ef6fab03e834f42cb8fb473ca5686c6e70880ec34c7c012e", -"votingAddress": "3P3kQA23BQjW3cAo96cCZ4WRKvkV", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b7d12cb27cd339c02243157155b76db01f42e7e2f46213ad51fc6b93f2470e58", -"confirmedHash": "f88c351744c7e2eb387d2324acf57223279ddc80a7c315520600000000000000", -"service": "00000000000000000000ffffa516e1b0", -"pubKeyOperator": "8517609d2c36c83d66b006aade2d5d4378c7daf527e3cf513952ee6b0d024bb442ca9853b53f78b1bfdc6b1ee37704f3", -"votingAddress": "2i3LaCqoepR8jwSe4sRyugLvbi9x", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b7dcc40ceccfae5da86e908ae4aac4ae6cbb1e483b16f0e989527cf844fcc4a9", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffffc17a8d9d", -"pubKeyOperator": "14406c68de1ea82685e497878c79e00a806f4490635f033b537ed7d92d459cf9c223c08474855cbd44da580395215935", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b7ecf968520c09351286ffabba6316ff38b1282fd463c3552d4306a8981dcd37", -"confirmedHash": "1247b6b7343b369c10ea19d8926ba415ea0b673cd5331d8f0200000000000000", -"service": "00000000000000000000ffff52d315ec", -"pubKeyOperator": "109ba1e7736fd311758fe471fc7f4b91d522524ac2b56eec73b5c3f988c61584fe2982de7809278d35264e47a1eb68a2", -"votingAddress": "ZU32wNJzEa4qATj8poKfSscagox", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b7f46354854484552ce04a14f961428b968977d67508e984ac8fc2e77b3cf066", -"confirmedHash": "08ceb54133eb59d824cb8faa2a8b3e0893830156e53ed4620900000000000000", -"service": "00000000000000000000ffff8b3b4f87", -"pubKeyOperator": "98dc7fe8e2f138ceb08bf0833c02bb1c7a5d28b6c36ed33b6f586133629d6c4fc7d6cd656233c712325b99da0b4d7dfa", -"votingAddress": "3Qb9QEAVU8dnRBWEhHY3mf4QWsAf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b8037a8367046e68f4d8f3bee292e63ddaca4fb73026a6a5b064b3155234422f", -"confirmedHash": "8600cd3efb1280c53942db36186ac5d553628af552b634a21000000000000000", -"service": "00000000000000000000ffffbc28a31d", -"pubKeyOperator": "0fd0b0f287381d6c3203182d8824484e13b627bdfa1ee3fa80da5d15e4e5e19ea54186419c3af3e366432c95d5aab19d", -"votingAddress": "268npSVi67oo3HfmDtsLN7Eir2yc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b807d5601c429c1259fac4bad809c727c3b329d9d5c7c90873f5ebbd8a595982", -"confirmedHash": "e9babebda286e2624e9ba828607a4cf0c91eaac599000b3b0200000000000000", -"service": "00000000000000000000ffff9df5428f", -"pubKeyOperator": "16189c260f3b93c22f06fecd1d41d3a3d479615515f7579e9323f085687aa192421e7cfc62802e9c2063d7902223fafd", -"votingAddress": "3TS8Kfez6dzW5q2pKZNaDVUxQhET", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b8127a3ed32c3322626ac069f0b86c0c221f98350754129796133c0a93b38313", -"confirmedHash": "55c0ca77c9cdec9f6efad6566e5914f881435ac8152069af0700000000000000", -"service": "00000000000000000000ffff55d1f24e", -"pubKeyOperator": "0524ee2bf5f1c465708b1888fead930d0e5e87025b33286d8cc0561a02d7b010f3bb3e60037895240a1f92dbf6467c91", -"votingAddress": "2E2TphsqVjBZ5onFdJZerfitFTrz", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b81f7e33fdf5df093c089669891d9890020e1785505f113ba0ab4696e12c86eb", -"confirmedHash": "139e95da9437fdad47acd43037e872ae08f682f69698d2390d00000000000000", -"service": "00000000000000000000ffff55d1f1a8", -"pubKeyOperator": "92cf219768bf95e594983a850da2ae975e98198f83c8c1eb114ce1ac8fcf1ff8b60b9593a4da3b71f236ffb49f73997b", -"votingAddress": "3oqc31sTmeF5WFdLNc2LTChdMfrW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b821e1b16fb082d334b9b47f17b1d1470af4eaf66409480b201e617e7e825f40", -"confirmedHash": "9ee592017d4fbffe964f902b7f8fd7944803435feb02454f0900000000000000", -"service": "00000000000000000000ffffa763f281", -"pubKeyOperator": "9014e4ae92c2e54681aed1e2dbdf4a27a41ec7df93e430bfab091f3402382753c7034edfa8de8adc82e04bb6c6a461a3", -"votingAddress": "tJLSVKq2tuEZsS4rPswrabahMLd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b8277a1dbf0c1ccaf4f793756195a093a7a3eebfd6fc14dff7123404fd224353", -"confirmedHash": "2aa9abacfda4e01b53df2819744001fb2490d66ccd107ce81500000000000000", -"service": "00000000000000000000ffffb23fec77", -"pubKeyOperator": "105896237718d5b2ac26e58350307694be49af73425f3d978ca00786c6f30c6886d25ad8a0eedef0d1fc15ac6d437b0c", -"votingAddress": "3bLJeGYmPS3fQinxbxRALGvEpUxj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b8300a29c0ec3d8bbb32097371bbc910e5ce93b26fb67a6f6e968c6501fa2151", -"confirmedHash": "212beaa7b850c185a75eb153da366b256e65c6c812e951160c00000000000000", -"service": "00000000000000000000ffff923b9666", -"pubKeyOperator": "84da6e979ba2b1b98560425c9ea31069ca9f37c2206450a9d2f51040b003e3ce5d5f4ea0469bc79933017e38d45ca372", -"votingAddress": "2Ymgm7T6me99PS53r1bWckVGanT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b8340a4ceefd0f19e95c9174bb844bbc7478d81c1fc47617b06034b36df15dbd", -"confirmedHash": "f2e20f5d2ad9629eb04d5c0660b8f197b9e1b52f713e12012300000000000000", -"service": "00000000000000000000ffff9df52c5f", -"pubKeyOperator": "8fa12f021a83179120cc032a09a6e55f8da13d7c72ddb3a1ef334aeabdc18b5887e3fcd20fbaf787dbd9bb88a42eb53b", -"votingAddress": "266kqEENyg3KmZ9CGotWgTpTWteV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b83ac5fc629b9d3a5edd4719f84fc80da3afea3d9fd151d15a08c1f6a7b93c28", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b018", -"pubKeyOperator": "8a4a3a769c8346d7afd56e3cd2d91c5f71d5ed4fea107c85b88646cb412b65021415978d78508b998fc598084d351338", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b83d635daabcf2562447086a1277d00f96d4bcd68fb623695945f664795765a1", -"confirmedHash": "42189914507dcd7d37ad8a5a524cdda6303f686de6868fc80800000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "266eQenZPJyqzqp1g4njsKx83oUg", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b8484931fab1425217f83070cd9514d0a96bf9b935672b7244658ef9d78ed0ea", -"confirmedHash": "f53cb68eb93481deb7965a1ddc993e7f33ca76bfc60603e80900000000000000", -"service": "00000000000000000000ffff55d1f1f9", -"pubKeyOperator": "1708b4710ab7b53bb037e30292955c3e01e7d58452f0c687f2207ed5304de4df41c466dc97f7383648e5bcef98b2b847", -"votingAddress": "3fzhkXRe74CMxsgdprSXaiLjq46N", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b84dfe001e1ce6e351b3ccd0ea74576dcce4ceacabc6ddf9e807b4385e1d2d67", -"confirmedHash": "deea24e962fac02cf223dd40dd3f1d84e4375d0d51276cb70500000000000000", -"service": "00000000000000000000ffffbc28b98e", -"pubKeyOperator": "10d8faa490c6dc9eab971c7fb6dc5d3bb24e9cb9957fd09526504840813ebe5464cce1b28d72397986919b627df8f48e", -"votingAddress": "2saHNdMmFkxzTBQJ9BSaYbVxQEH7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b8501cfd8da7434518b41cf8c970a73c455634818f83ece121b0688df17b9b3c", -"confirmedHash": "4cd142c4c56009e8d30a52e59664bfd6f04561a268f8636a0600000000000000", -"service": "00000000000000000000ffff2d4f4a09", -"pubKeyOperator": "8f7242bdba0921c2418d4e3be676e320c0ba9ea86b5d185dd1dc1e665587925086e8bd0de4473f9eba0f1487ddf81f86", -"votingAddress": "22hUtX5mxw9N7RS4eH17v34z4uNE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b85a3dd53453a3fb230c9b19495e6a67a67b3885044abc828203b8dfab075f93", -"confirmedHash": "7e5a35aea596c0581201b0a8200a02428d9f9a357a57f11f0800000000000000", -"service": "00000000000000000000ffff88f4746e", -"pubKeyOperator": "89f214868176a6719445f91395542a2669b6625d6d16082e7917492b39c638637129efaac9c9d6f73e7368a2794f9b65", -"votingAddress": "xXNoRq2rz19N7DuhVaB1173iJpS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b869c699d66ae547fcf1772c0bd41ac5bacf144f920031f6ec4eef11137cb488", -"confirmedHash": "1947ae88fbe846bd9fa3006f1163ac6c54ed487588925ea60a00000000000000", -"service": "00000000000000000000ffff5fb73462", -"pubKeyOperator": "0204d226791d6ab3d8172782738515d8dda22e020223fee1bc3aa22247fca8bee37f6de5bf85f3b64227b967b76f2a88", -"votingAddress": "RiiXDZxzvTLBKShqoSTs8nuMVhB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b8721221983bb408a5fc9cae4b9b44efa0374e4cf7bac3dc703503da72bbaa81", -"confirmedHash": "0e477eb1f69d7e5b1556ce5a7dfb6f7b99574c931b7b7f6e0b00000000000000", -"service": "00000000000000000000ffff52d31513", -"pubKeyOperator": "1983508d97551b8821aa657d8913e1daecbeeec0965b1c89f11d14357706f4015201483d3dcf9cb130d8b2af4a40680a", -"votingAddress": "SyMyrkzJsfoXMLR3NZefRZJL3cz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b87469166a829cbbe5ab48c46f6f5b233a55b90ad6136b2a3c8480921c219626", -"confirmedHash": "ba7525f20234b744a36084cf1a229e776d660a8d9ca8e9f50900000000000000", -"service": "00000000000000000000ffffc7f7034f", -"pubKeyOperator": "89d6676d3216dcb7c2c182bf6d2b084fea7c65f127c3ede775e470c57162c339f17638f9188ddde661b66de84720fc68", -"votingAddress": "nugHSAjMPLS66R1Ayb7gGkj1z31", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b876a155d9ff191902d303c861a451f5b177e398dcaa4dd1ad3ba9a3b3d1d42d", -"confirmedHash": "4e5de03b15b0060634afb1203a0a26ca0c0a3b8e2694f0820900000000000000", -"service": "00000000000000000000ffffc0f1d3c2", -"pubKeyOperator": "8e896a676903dc7c18cd00b33c3b1738260144760269a810016e210cf97ba7d9a91199416ab0671500315dfa626ca8c5", -"votingAddress": "2FQQQr8Rtx44j4DdD8ffhg9tZskc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b8851588d8b3acf88b60583a255c41ff5b7b5b0689cd3fa874bd8e308d31d7b4", -"confirmedHash": "5c68f7975db4d7563096158223fbe30e048dc59fd41dbae20b00000000000000", -"service": "00000000000000000000ffff877d9d20", -"pubKeyOperator": "198c76f24683541e8251af471f1566d456c502205d97d1a5e0d4f2773e602dd9618559c264efcb3ccf191f548c31d8ed", -"votingAddress": "4RgCk1r3j6D44E2ikgQEUHZ8ju7g", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b887f16491ee2092fbf8f91709315dedb08c37a3226e31320b67e5a76ba9ea1d", -"confirmedHash": "2dda4425ca27af1f422983224c33f91c770c2f800359b0a33a00000000000000", -"service": "00000000000000000000ffff023863f4", -"pubKeyOperator": "12a2526d415622f43eb8cce626486103f9326cfa4bf4506b534cd43e06ff0037271bf59153a51740503780c7e5711a2e", -"votingAddress": "2NbLYmCTumNyxVwEWCE13uTfubzr", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b88814cfe6cea7e2bd160ac51448010cae37ef72fbd2052493e0fdd4779f42b4", -"confirmedHash": "fe2af33d4f88298679cb3908eabfc19ff30bd907775b159a0100000000000000", -"service": "00000000000000000000ffff52d3190a", -"pubKeyOperator": "17c265f846d8d9d7a9a3f1d797b870a9d94f4bacd623e5e3c26fd606b321c469d29ec46a1d863cd4e718c68c1911b37f", -"votingAddress": "315a9TnuC71oUzrvB7LkvJUFgNWU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b88ac8c35a9389f866cf1cace1b1b749dc4aee851b68b575a31b4e10ffd72190", -"confirmedHash": "cc273218b9567eebc91b19aef589f31c7fa93a72060b3ce72100000000000000", -"service": "00000000000000000000ffff52d31931", -"pubKeyOperator": "0b5c5550eb44e27331639842a8c328aab9f285ac8814364a044ddd3a8e24deebba42af12b1893f41d35cae54bad16c28", -"votingAddress": "4GU1WZm5h49JdmdZWJWAVPC8qhR1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b88bee00cf81eac7fdc75f431cb2a31d3a030f89a615808f0b65cbfcaad162f2", -"confirmedHash": "d859d0e28325b51762ac7694bb9b4ac0d85667c170dede730300000000000000", -"service": "00000000000000000000ffff12e8c0ce", -"pubKeyOperator": "80b78d443e1346f6a0fd26e0e9c0b89b9a18ba47890b84eec770150de25f3db9ec4445718bcdced790eca58ea44f3a77", -"votingAddress": "3ihP72KLrnTiGYggFD8PomUFW1Dk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b88f7bb4f930c51b6236627f9653d6cb742395a95394da09d51037399a6c2bcf", -"confirmedHash": "e15a2e8f8c892fa45d314eaf3d3ec57592e01cbce6cca1990500000000000000", -"service": "00000000000000000000ffff339e1b40", -"pubKeyOperator": "10b0293bff68aba431036287b89ec04dcd19334e82839f4f64fb43c691b255e84544f45c5bf3e5f4b7ec3775f2d8905d", -"votingAddress": "3AH82HiWQ9boTHF8qxDcTZDWwdad", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b8913c1c4622b6ddf437d0a90227a3149e07b96140ece9759435a929e3c345ea", -"confirmedHash": "1cf99c4811ea6b7b80fc99ad7225cafe34f5ba8c5a73be5b2b00000000000000", -"service": "00000000000000000000ffffc2875dec", -"pubKeyOperator": "9486bebd700269260370c32a7e5e69a6c9162cb152082db15d7e7f4a8f1488cf5d604849fbc6634ebe2eb979edd6cdf3", -"votingAddress": "2GZfuMQnbt7gXCJM5AEkeGm7kmsN", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b8a16b9c962117c963b688a10e4e1dd38223ff485cd70a2b6480494f86bcb1d5", -"confirmedHash": "59797c6fff57c50e70e71a5655ad0cdaf5bc7283f4bce31b0d00000000000000", -"service": "00000000000000000000ffffd418658e", -"pubKeyOperator": "030fa94967533bb1dd6d143b8d7505e187a783d25e0a40ea167309d269ac47f02c66f095bbc6c9d60e9828b5f1427414", -"votingAddress": "3KrD9PDU8Jndn4CTGphoTWGiwnwu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b8a7858eb809dba5572a5abe0c36ffe135203b7a49498e3fe22c0996eb55f4db", -"confirmedHash": "b3ea31903b9e8160d9a18c3720cf6e93c1584ef2a9da097f2100000000000000", -"service": "00000000000000000000ffff330f4496", -"pubKeyOperator": "0b2f4fc568fc9a9527423b931e0baa8d81e54edb1d2f2188deabb6ba64d3f09b2baa68d17402be7da0b8a4bb608db473", -"votingAddress": "3obo7U1d41jbVPdKv7i8DuRF6vtS", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b8bc7d999c93c9bda4c7e80b6db544a15818337f050f8fe866f3d896b1656606", -"confirmedHash": "157da814c74445ca54797ead14a091a027f22432c0b4f51f1800000000000000", -"service": "00000000000000000000ffff258b1a54", -"pubKeyOperator": "063bb6e224a32f09cbdda07b526a43f9ee27461271681ec86bf79fa95d8935fd8d0db0bb3c2f542da7ea83bb23b094b2", -"votingAddress": "SU6bWUQ1zkEATMcqRaSVBjD1u4m", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "b8c56fa02c1267b6ba8be4f52d984dd9ed04c9d0a4cb879d812f1ce14334df68", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff8491ba3f", -"pubKeyOperator": "022a155794361726a3105ef0ae0977f81faddd7bf47140a8afce88170056d5992120ebba55737c554fd0a6edc386f353", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b8ca87a347af32d75b3341ffb83cea1b1a0a601c354a4bf0ad5c51a9ac8ed88d", -"confirmedHash": "984671fc89c282b4c317406d7bb0d0a2959a97c5df39960b2900000000000000", -"service": "00000000000000000000ffffbc28a30a", -"pubKeyOperator": "806e4d40fb802c6494e6bdc4e5b157bad3ec20937d5aa28a81744ddaf85b71f5c58f26f8969775ea6a86ec34dfa8cd5a", -"votingAddress": "5UVRyz1CQg7yCWwMM67A6e9NMQx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b8dad99b5b73c3af78670e18ee652f7a51d5ab6f1168907f9094fde1fd4c2aaf", -"confirmedHash": "950cd4a4dce11b5f93b087d4c9b122a210d79d3e91bf1eba0300000000000000", -"service": "00000000000000000000ffff984345e4", -"pubKeyOperator": "83a6be612097e0facb6d5874f59ecf6f86d85f2048ec694bad69713815a31b091226e38227df013d4d9b20781b241178", -"votingAddress": "9RrT7NCYBvJHJgby4kS7aXJ861D", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b8e29d10a04417d406486679ccd71976ec50a44918f677b88dd9decd8abe3179", -"confirmedHash": "d971dc606d8bcb809389729cd35a7eac5217d27a28e553e40800000000000000", -"service": "00000000000000000000ffff88f31dd4", -"pubKeyOperator": "83ab5065cfa45d68930044517c05aa4d06d9620cf92dc1e256ed1f836accba622e25707317cf94c367cc7296fe387766", -"votingAddress": "3LPwEYsiWHupXy7fgHH3rYwBNiFc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b8efb0523a5d489dea275e2943faf6f39e1dea58956eb97499cb62f22f44e7b1", -"confirmedHash": "409e1834888d28f75ccb6a042f0271486a1044a10e38f2c40f00000000000000", -"service": "00000000000000000000ffffa516d092", -"pubKeyOperator": "031e4ea7caed924b2513909729ffb9bb7e8fb9e53f19fc3912f1fcc1734dcc0c79134ee0e1ab154707be88788ee411c0", -"votingAddress": "W9SywXvHAuCmZfp27TS1M2RDrUX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b90e56813f4128c71bf47661cd43a13bec0141e77e554e9a1ea1f186599b58fe", -"confirmedHash": "df74ce8aa3740ad816a3f57884f174a5691494cdb935fa4c1700000000000000", -"service": "00000000000000000000ffff3e4d98cc", -"pubKeyOperator": "912eeb4489a00b9a1aa9aafaf1d077ccf47f482060173c275c3b4df469346a6d27c560d9bbb773c6a98ca5b0ba9d6d6a", -"votingAddress": "3iTapz8yfShKd1qgTzswwYU6MF66", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b917552cf4f459d3299176d1da75e091eb3c158aca9b9581afa2363b6311a7a3", -"confirmedHash": "970eccec7c36eaae36d4c7d9486bb43a7021267b1ccd22123300000000000000", -"service": "00000000000000000000ffff12d9ec3f", -"pubKeyOperator": "8c2f35ee7299492d71386e452ca4079fe5f13b3937afe1ffa4263e52432dfe852ec60a3863cd475b52fc19fdc48656d2", -"votingAddress": "iiD11HC1LiUgiqvmVJytbyVHRX2", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b917eb73f807ccb81510a2e5e01ee6f809735d11ed049d8559cf4f82ce903538", -"confirmedHash": "f4bf489ab24824e05ce0195ed67c1838e2d3efb8a56fb0f61900000000000000", -"service": "00000000000000000000ffff2d4c8cab", -"pubKeyOperator": "144c069d591281f9c27ebf3dd5395e7287e6c911c8967cd9cf0abf5c3aac945dc295053b0400346d9200141e2cf9db20", -"votingAddress": "4JdcX946XHu6y9QNryfcwZThHEat", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b91aece28e840053b6faecab4a8573a130a93b77cb9d3a8e54184e71b50be08a", -"confirmedHash": "e4eb0bbdfbaf9de5afb5454505a283623f653c15604e93f40700000000000000", -"service": "00000000000000000000ffff2d206fed", -"pubKeyOperator": "1924596ca96e786bcc2ea18949459327bbe82adf362d96e035c4cc9e189b8ab3bd265ac462a0e7766cf7f4555b2640da", -"votingAddress": "2Ryi4MSd7xqjbWNCtxKi8SoBefzc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b924f4586ff85a5dc17f26c2070125f712fed720b313800cacf0a1f67ecf01e6", -"confirmedHash": "0971cee696fef9a1024366606831d22cdcf29265d1a200d10700000000000000", -"service": "00000000000000000000ffff2e04d9f8", -"pubKeyOperator": "8e4a4d29010b289dec82e4fa0be6da08c11c11001cb67423387f98b93376c2d7bb5532177bfca35cb446d9efc55a1e81", -"votingAddress": "pB3FLsjYPQW3xoee1R3JJFTQhFH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b94a3a64df26f1a4761e65d53f2f47d97850d071b580590648734ca4786f0065", -"confirmedHash": "5c66aa7c35e0357a60d0dea3eb21bf370725bbe8799a1d700200000000000000", -"service": "00000000000000000000ffff86d1f781", -"pubKeyOperator": "82be1e77cff2e5eb2614b9671df476601368c07257ab431fd12e0431ea1b1ef24f2406d0744e016c0f335d49d85a40b3", -"votingAddress": "ZMTFuhtYTCTMu6vx94Th9oVK8m4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b9570be492ff0d87e02f12c74f75b75d5ed68e28fc04d10264d38ad090c981b4", -"confirmedHash": "f95d58e237f90d5bf906336283b059e02687a467f1ce27b71a00000000000000", -"service": "00000000000000000000ffff41153539", -"pubKeyOperator": "823602f80d5068f5bb47e1211e25769755fe939b2949c928444d7fcc8d6406f32989d471a4e2e70581a75b2f1b392767", -"votingAddress": "238WWs78ehiQeKoBwWjvB167Ghmo", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b95a78d8b414f26e9e4512bcff1839605f0d4a597c651949bc5bcf254d1b35c4", -"confirmedHash": "7ffca7cab172ab63e626d33f3ae09441edbe9f8e166adb872b00000000000000", -"service": "00000000000000000000ffffc87ab54c", -"pubKeyOperator": "98fa2cedcd560fc1002eb1b8be180a6e405d372fe50caecc6de1decacfe481d71bd0d9c329079c139163497dc69198a7", -"votingAddress": "2uCWcchy3xzmvYptoCMVJmsm5YMJ", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "b9603155041389e7a80c976ad9baa15ea0162127060de14a8a29ae74d6b523cd", -"confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", -"service": "00000000000000000000ffff87b558c9", -"pubKeyOperator": "955a2d40978cc548863ad4f57d772690686e9799c46c4166e78d8536d633f709acb27661024d38ec0efa620699e476f2", -"votingAddress": "2aLk5ytrLRrD9UxtWoRRoCHx8Bed", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b963e527a0e8c7297b295a506e055cf48575fb546e629ca1bb4ca690a2a21c00", -"confirmedHash": "8b9804111660b0f9c5ef35cdb717e74286cd40a70c584e1e0400000000000000", -"service": "00000000000000000000ffffc2875859", -"pubKeyOperator": "06e242ed07ba66b5e5482601170d360d2a6bab140b18d6f3937148c2299863dbb90a05d14605a410d38da13deac1e50a", -"votingAddress": "2iPMiiJLcPy6LQBLa2u5tA8aGKoF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b97e9b29cddcbc45c13e80677f8e8d75ce86353ee72b7415527be87a95735213", -"confirmedHash": "2245e9310be449fb153930080c3953941059901f09a233450f00000000000000", -"service": "00000000000000000000ffffd4813f09", -"pubKeyOperator": "8fcf96eb08d040a75fdfa0e7d87fa87ed77fa73f7fc9d2cee46c209d975ae2e50865c52f209f76deeb9a907dd5d07a2c", -"votingAddress": "377TJ7TbPifAM9rrTCz81cxHSdzY", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b98350e7fe7bf0b3ae31a4937efbc2e4d5b39e2465a6b6ea4e50c0c1c31fa14e", -"confirmedHash": "d30dbe759fd87f783253f34758645d4fa396f70b3c57a5300400000000000000", -"service": "00000000000000000000ffff33c35b09", -"pubKeyOperator": "0c861ca1fb26b8ef66ffd76a8b287574aacb748a0f306f6512e24fd38d6db5d179101921a8c734bd9653f379e9ef2d01", -"votingAddress": "FjpaoMQXgVcEiMDQhuggeWG5Kka", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b98375939b6822023da68cd115bccb22dcc2ec9dd42ee0631fa832fcff476ae3", -"confirmedHash": "09498802523b671c74004b91acdf755e022e4118af1639841100000000000000", -"service": "00000000000000000000ffffc0f1cef8", -"pubKeyOperator": "94e2ce74b9241ad6ed5c072226c5b1d38792d4f28fb0de90adc7d4edc764e845335122bed789152cf73eb4faba1e5dc0", -"votingAddress": "4HXPKY1PSyeHMw7EADC4BFfoYdsw", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b9902ec2f7af8cd59fc5da5e6b3c86f7bf5eaecbfadb4025ebe6306a200f5e67", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b069", -"pubKeyOperator": "99c85c681c04c4b8e3f229e189826d1b30ada27b8b0b585b683e73270e6037b72320edc6bf067003c9387bcf0655c13c", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b99909ff1034009f607ab77100eb1f202d56f75f8428860e5e422f03d4bc94bb", -"confirmedHash": "d7a8679c1ab75f76956048bb1a9134be7ff3a2a4e2e5eefa0400000000000000", -"service": "00000000000000000000ffff55d1f240", -"pubKeyOperator": "99a3fce408715f91a3ff0bb694a6c752ff37f5fe8ab1c6a7698b82558a40c8bd82f4e5e585154d1f2e45f3aa926797b9", -"votingAddress": "St45MDRrBz6YnSjfZRDekEgiKsj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b9a403a77b7c7acb2bd7b204dea1c98d664067aec1d8986774564b320201287e", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff8491c912", -"pubKeyOperator": "8e8cd9050e8fc58aefd538ee0690049033f2a80a95ef36fa8fc41b57f2e5a03ddcb4a7ffa70839bffb370b86085a1ad0", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b9a7da3a702b969904cfba410cf9a679fa7b32e1e08ea3b959616701cf5e0771", -"confirmedHash": "99b3d0f943aa2807a2f0f30a375efbebf6ef1e51aa5c2a862200000000000000", -"service": "00000000000000000000ffff4e8dd6d1", -"pubKeyOperator": "01ef09ec0ed788980da4eaa5ca9aa0546005f47ffe31ab6e4a5e48e190a57677cfd0195d48e0a9ce9097f483b97f938e", -"votingAddress": "2A6AwRUTd7dvT1kkeWLvcj3PoQyU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b9c2e8e908c5420dc7eb46303d4408f6e5de138dc0560e532e9c9609a2e0bfdf", -"confirmedHash": "6d4c77891849cc8c4305e5077d4fefe8f048a8f3e39f073e2200000000000000", -"service": "00000000000000000000ffffc28754be", -"pubKeyOperator": "83c208a32abf4742dfab76577c5b125424c4c831e02963200c11b584ccfec01fbd575ee0c96d77de66c122d4feb997c0", -"votingAddress": "3m5Xx9D7QLnhVXjE8XWkMdutuodH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b9d48256859ab4ecef6dd5f5e80575b1e19830c3c2d5549f1c2a6aeda501506a", -"confirmedHash": "74eeef8df9323115d4c6150616ff4f8836bb3cd60809df920f00000000000000", -"service": "00000000000000000000ffff55d1f1ad", -"pubKeyOperator": "98e222de6a6c29bb0bcff15c79d28bc17e65923c30fac8ac5f416dc060dbd8141c4662e64b538aa662b97e6bd962353d", -"votingAddress": "WQKG6At8gLqfi1tJ2Qj886nF5K3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b9dbad38ad6836eb17dcfbdcbb43b709fe0cb679187c27ddadba35d4a1176ea3", -"confirmedHash": "cfda47d69cbef492a2afdf53e7e4a1a51182e3f7674ebe290f00000000000000", -"service": "00000000000000000000ffff2d5575e7", -"pubKeyOperator": "91c11ac3a020acd7cc2c469d825f39e38023d17a9eff00b38c08538d17a7a268194ab17658c154a5f34b1c435eefe78b", -"votingAddress": "4YCherdijREUWuTdqdMw2412ssS3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b9e05bcfc6aedb3ccc2a110f4ce8764589fb52fce1d758eb95dd2dd5521989ae", -"confirmedHash": "6106900c56c85ce9949731c1793c868f6f1a30c55a7f3aa51f00000000000000", -"service": "00000000000000000000ffffac51b332", -"pubKeyOperator": "080195c4e047ae0cb057312cf56b918ed7b9c0a9b1f52afede33c785b7e2ee29a7d753bf9423aca2495d259f9fc57727", -"votingAddress": "tzHjdjivLGaubnqEqfDjqUgbRYS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "b9f487eec5262cffc0e2ff0e8ee4c65811bfb3b7803d41e15712eb430b209749", -"confirmedHash": "22bb1d80391f9af77b673853517d8e9ae38a8563714b03b32d00000000000000", -"service": "00000000000000000000ffffc7f71a5d", -"pubKeyOperator": "04df32ea77a47c15c0c0262f9e601a7918288e18f161da04ca797dfd613b58d29e2c1107e9d223d9dc57e0b90975b7d8", -"votingAddress": "36FuRKbKvuEaP4rv8KV3uqTMkEqL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ba20f593953ec40555aeb9e71d68fb7987f45d1792e329af6a1e9b4180bcab3e", -"confirmedHash": "3812a8b97590c43189bbfbfd317ff0b9344fc015fc9d6b091100000000000000", -"service": "00000000000000000000ffffa5165c5f", -"pubKeyOperator": "0fd51e63c642d820b0f997dfa6c0d36cf7fb32b15be030844ec3bad492c497c017b25930f09185a60893dc633d95554e", -"votingAddress": "3CGVb65DPMFLKfbgwJuCGavUAmwQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ba2fb4a4ddad1d882ec2539de8c6f76f31dbef42c174ec93f20d72a6b8e4bdc5", -"confirmedHash": "13e7185f32bcfa90b166165040737ff2db49a23c5a7abcbc0e00000000000000", -"service": "00000000000000000000ffff2d209742", -"pubKeyOperator": "9794c3d93ee613e7f0e546700e25e4ef8eb004c986c25731ac489bccdad0873e7ca86d86a1e4fdcd50c7035f0c722ac9", -"votingAddress": "4TQ3kdv3ytTGVsPt2YnafeBVbvZ8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ba42b2da236981811c1e16ca4da467d7d636629c430518f7983b15e13dc9688c", -"confirmedHash": "2de93631ed66b67a87df8cb83c8ee318f59e3bb2962114350b00000000000000", -"service": "00000000000000000000ffff4e2f72e9", -"pubKeyOperator": "1767cefd2a49a4bee661234d9298298a125d670f52789ac3ee0f19c08df60f3bf241917a51d10e1157702c107bf31ff2", -"votingAddress": "8aN9eY2WG3fHwYGVn5HrCAmWrTC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ba49f2fdaac7f6637e2f9b2612114773425d6c9a04680b859e4b679e8aa654b6", -"confirmedHash": "00787909c9b5eba48f1473f57bd3114b2b1262a7ac3e74831f00000000000000", -"service": "00000000000000000000ffff55d1f13d", -"pubKeyOperator": "0a251adb2e9d1287d3639625bceda5fceea84d056587c53e637cb50e1a078e0024a59197fb5a22b6fa47910944350370", -"votingAddress": "33hpD66ygGNmiQaF7j4Rn7JVsg7", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ba4d6d0805ef92e5b8131d19df7dce0b92036d8969592240aca7564adc6bce9e", -"confirmedHash": "4bebb70f3ed8caa5a87390496a28043a9971eafdef0648d11300000000000000", -"service": "00000000000000000000ffffbc28a30f", -"pubKeyOperator": "89e56f286de2ff7a72c19bbd7d234bebafdfdf520f62b19a6fb4219fc70608da2bee99e11b146bdc6dee47f36be7c315", -"votingAddress": "43EmyVJLW9AE2jzAmzbAZpddezCV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ba5274b1130a681ea13ca19c873426c5e5fa7d9907e53734662649a4fa56be1a", -"confirmedHash": "a1e6a81c221aed68d0e640d6581eb47941aef0a4afbbaca63100000000000000", -"service": "00000000000000000000ffff03d73437", -"pubKeyOperator": "1596e89064cd632e53869ba34d3011d373ab693152215f35673059317d0c975e2174683082122d74c14ede953f26581d", -"votingAddress": "3Pav5WgWwYRQ3GzYqbmzBp5EuZ2a", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ba5b538b28e00968a4e0f0cac6ecb6f667d50d2ba30296e6e52bebd573c0c64d", -"confirmedHash": "790acc3c6e44b61cdcd205c64c13672cd701e4553e6a85f82f00000000000000", -"service": "00000000000000000000ffffb9e96af9", -"pubKeyOperator": "89438c8ab2f1f4b20c907ac57b1dbbecf58dbf95e3a81b58ba9b1d5dfeaba99eb227003c526ac74a630b2326865b1ecf", -"votingAddress": "33Ce9hw89kZumsiX2v36F4sRYMPB", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ba69b2ea01dc621a0483811d71316c1a5fd11f68fef0e8b93126a8773162a676", -"confirmedHash": "889c4a1efcc4b8ae4737bf798c12637d1a44b702cee58ccf1d00000000000000", -"service": "00000000000000000000ffffbc28af43", -"pubKeyOperator": "982c5a74b3cf68e5958396d54a3992f7fc694fb3bea46cee74967ec0fe8777a6545ca5f7eae148e93602614964970d87", -"votingAddress": "3Rg9g9FXf6miLB14wKYdwFcYsaC7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ba70d2023e1d7881ba19d788552a9ebb317f7e536a7c6a16f2a398f1f28e330f", -"confirmedHash": "9394a8f1816349aae9420c213ed0e452392b7813baa6840e0200000000000000", -"service": "00000000000000000000ffff8ac5a1d0", -"pubKeyOperator": "0bd3a0ddf2d6ac04ba5ad0a39cd857d322400d7d3a5661bace08bd41afb14c256d18c6f6643d22a46eab81903d601f8e", -"votingAddress": "4TfGXQVK5FTVtWDgE7wTnQF52twA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ba76105a2c23edd8051153ec0cf6ff623ff52dd3ff6bcf154188f29137a1208b", -"confirmedHash": "edb00c39e125efb94fc2bd4cfd2241eefc7b1b5d781045b92800000000000000", -"service": "00000000000000000000ffffc2875946", -"pubKeyOperator": "19007eb2c7d68ff79bfa085d0fc937350a975210f852841897c9c494244705cea9f2abda864f4500dd3339052185a239", -"votingAddress": "Dvd2kgxLRGi87KWvfsrWSVptKTj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ba76e5f17ce6346de479579ca45b77e7b9b2832f4b32044f3407f3c0c67fa38a", -"confirmedHash": "bf7836f14f048030378739c788e77d2516b544de8482af2e0f00000000000000", -"service": "00000000000000000000ffff8b3bafa2", -"pubKeyOperator": "0f618820b7e469f4a37b832a074d3a405031300faaca39985371875e64612a94000a7455e2f65a4b0b23b1652e5f081f", -"votingAddress": "37k2zmwnhzkL1kRb9aymyefpLnH9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ba7a3c0d3a183c354f55d009babe16dd55d4367b13d36f11a129917e010c08f4", -"confirmedHash": "7af6aff9716e7fa4c736ad101268bf455811ecd76f449da10800000000000000", -"service": "00000000000000000000ffff55d1f183", -"pubKeyOperator": "96fb112990633eb3b82ae2c403334e1ace3c95b5eee50327f025950a7cdd84d21b7822b2330cb57c13bd5243cfffe5fe", -"votingAddress": "4MYbYFW1jggAKyxutgEpW4XmN3Ys", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ba81202e8b52e3d91bcc2d571e4a19f902fc3f89d86ddf6a16e5c696821df78e", -"confirmedHash": "8c84954c81ba3e4bfafa2e2489caf9333cfe7ab48ce096732e00000000000000", -"service": "00000000000000000000ffffb29d5b13", -"pubKeyOperator": "11a093411fd6679cd68186cf697d059cc408c76ea227055cf166813fb51bab52c259643945c0d0f8f905636c35896d45", -"votingAddress": "4KhGjXSWvwa71yjTDwtzfiu2hRbS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ba91b8d0261cf5e1118e27ba4bd93e61d0c1f06431ba8eb03f8b9a48f3f91690", -"confirmedHash": "7ac821d6ca52a76af85e19daee7e19889b3a952b01da71a51000000000000000", -"service": "00000000000000000000ffff3359547a", -"pubKeyOperator": "9192b3d1187090e19fb7aa5e575a6790d1812f2846a01a6c675d829ca8d0bc5b3ca5aedd355d213f6df5a5715c0e242f", -"votingAddress": "PpEiU9ULs4uWkqXU7qoJoRKvQpf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "baa64fec4280e1de7f84563959b12725e342eb6dadbef24b4ab2073844655ca7", -"confirmedHash": "43e1d99b344042b4f89db14f456260745c6c6d4ba1bdd9790800000000000000", -"service": "00000000000000000000ffff2d4ce295", -"pubKeyOperator": "8aeea29ce50d5a5612ebb89bbe631387412cf8a4ea06a4d3583aed8893eb56f53f3939da688fb251733b8655df653b18", -"votingAddress": "2RcnTNrt9soHeL8bhQc6AFyZN8S5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "baa65888d9d441e979a2bb41f78a000ee41fb65976281e70623c0f8ae34dd6f2", -"confirmedHash": "e3173fa067eb14fe7bb31fbe4376e4ffeb20d0f30c5dac660600000000000000", -"service": "00000000000000000000ffff3eabbe90", -"pubKeyOperator": "01329232202ff1a76ae600141506d449b83d32cd19888245414c540147e12efc1e3ac5dde7a11135667e8fb1d5f959ae", -"votingAddress": "KwTU7QcBqZU9DvSMJopHesGQdpb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "baa893809afe8cf282a52e132017fd847a3ba59c847b6c5a8cbc988cf336bf3a", -"confirmedHash": "3f7fb551c4c07dbf6557a4d08f8bca91312848c61c3e60031a00000000000000", -"service": "00000000000000000000ffffc2875b1b", -"pubKeyOperator": "1070a8587e86e512e56d191453a4a4a6f46b49c437d8ebeecdc635c419733e9fd6dac549d98f0201183ff1dc368dc612", -"votingAddress": "2VnZY8ArUscSqT2d3FfKCMhYwc6s", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "baa9286df80a38f24173a45ae260b3e14e20071449f2b732ac08115b4b16dbff", -"confirmedHash": "ba83608a609447777b7f39adc1fee8009c1244237820aadd0a00000000000000", -"service": "00000000000000000000ffff33de8998", -"pubKeyOperator": "8ff6de5a584a502e35aaa8ad618af2662910006bab4b61c3d9cc1fc870260cafcca562c4942c0845f31a1a2479f2c197", -"votingAddress": "2sv85R3p1ft2k2SULJcLLxG487yB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "baacbac791d403c1e11da7e344f54d1f81db4f03e31227a86cb4bbe5cd3e4818", -"confirmedHash": "ad36faf2ca19073976f226d9f64490b06e63f93d769a3e521100000000000000", -"service": "00000000000000000000ffffb951a45a", -"pubKeyOperator": "83f9617be4f5b62c536009097e3dc13b37e0692760f960866a83175f2e7e68cdd04d9bd7dbd224b7f19d11dccea4f787", -"votingAddress": "4AmdS5bhuK4JknWpkWUeH9UBLXRx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "baf26adb499a67f46a79d98612809154ba47971035535ede90f42b1606cfc705", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b082", -"pubKeyOperator": "191122d7fd5941dca12b2aac1dd6fb525154ef6da47897ac8de2cb6fa3112a11e74ba5be1eff1d72deeeec9a1a7fee86", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bb299fa9efcd3ddcf37c2dfbd0b7c2e845fb33d00d429155cae8b26cd5f26524", -"confirmedHash": "be3fabd32808e86165a05ccc57cc9c251a47353757a6987d0f00000000000000", -"service": "00000000000000000000ffff951cfe9f", -"pubKeyOperator": "144a96bbf2a15ec13ed0b679951099cfaedde29a5ad8e568bbc5c08058d77af78fefeb041f4fd4f88a4c9de15ed3b89a", -"votingAddress": "hAqCs3kjkA22kWMjBBnxjfS1j4T", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bb330c79cca244c18b245b5224025fbdd86a21ad8bab5dd8d429ebfe2192a60f", -"confirmedHash": "eea9e6c47889c1f240be88daaa742646a2261eb161cd7d430600000000000000", -"service": "00000000000000000000ffffa7ac36fa", -"pubKeyOperator": "18e8fc69b0424b63cf221c75b247e49bb7a31b905975a07aae363ec98bd1b77cdf88fd243a677f574d60a7940af40888", -"votingAddress": "3fMLtp9hyjyhFvmWPXrmHFErahp4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bb3fae201193ac1ee4f6491545351ac63894c84b0a585fdcf0fe13748cb4d7a5", -"confirmedHash": "710559b6a9e0f5222af0758ff0b58cba3d33fff34dc293001e00000000000000", -"service": "00000000000000000000ffffc2875c4f", -"pubKeyOperator": "01342f4e06ec0a9af80eab0e000d4985757a00350d23c53ab04e53113191905dfeb69ba4c2978d645f7dfc9283c1ec72", -"votingAddress": "4PT6qbYzLSNfqm4WRTfEmQXqXcke", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bb4de4578c64490446a5937af3e13668168e6efc52b71520ac4ab781e33c5ded", -"confirmedHash": "37878a6ec72be395550cd276823a17a96bae40134248981b2300000000000000", -"service": "00000000000000000000ffff12d3d214", -"pubKeyOperator": "0247de6ccbf1e0827bfda892cd248434cb47a20c9378e5b93df2d038dc381826ad2078a222735b03003cf5e470c2c7ad", -"votingAddress": "zw9RztYCcpqitCFdHw3mUMLPQdi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bb5a8915c2702dd50af5a60c70a7648ad2a90eeb39e412b3499ba8e614f0eb82", -"confirmedHash": "d4439fb0db8b3c5319e0e6f7d27ea3e4c10a9a13e779c4a92600000000000000", -"service": "00000000000000000000ffff951ce136", -"pubKeyOperator": "0ab19babf7810bbbf6fc0a0d8f54408bb2637f9762983c953bc90405bb92fc00bd69d3c20c54dc62c797a589c601b5b8", -"votingAddress": "21hPZXXHgZzPkr4cbwj8RPVVjWhf", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "bb5cf6a639ff82be47616e510c84f9e4bb61e218b6a7b4eefea14ac87e97b7ad", -"confirmedHash": "a4e490f145795651d0d85d9fa5000dd90269cbd23d5ab14c1b00000000000000", -"service": "00000000000000000000ffff55d1f22c", -"pubKeyOperator": "941ea0173ecb2d3f924e68ea33f6487121c213c7b6620dfac2f368449738ed3bcf482fda76cfda7fe668dafaa48f0fff", -"votingAddress": "3uBe63wtDeJ9AC5eMorz7vzzAkXd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bb60afe9c1e514a1426c19ab2b8da37479c9c0851ceb9eb39fa9a526f20d3be0", -"confirmedHash": "c3a922dbbf7eb555ecc973b9db982669fa0f9333a1d5e95a0300000000000000", -"service": "00000000000000000000ffff58630b1e", -"pubKeyOperator": "8f76091ec6d2dc7da0893a3616c4e5bb779e9524ea62cdb3509b1083d6dbfdc3e76c88878d4df471ae2d34604dac8d45", -"votingAddress": "qo5qT7JjZX1HFDRTMxQsApFbQK7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bb6b9d92aa4eb6c7ea108a18093b5e52343071f4506721f75d05953aadf9500e", -"confirmedHash": "0991a439c9688207a7bf3e8186d9cd189bc2e33c47a637fb1500000000000000", -"service": "00000000000000000000ffffa123f74b", -"pubKeyOperator": "16d48d6a7b565eaa2054ea3e1a2b8080802308c0c019d25a2c5d1b5014d4ee455d7fc240be4a542809d768509d449615", -"votingAddress": "3Dq61AYwzexDixpGRZcztuJuNGyS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bba85252b1954f8f635f874b4862d58f7f17c16f05851123e03390ef94986f18", -"confirmedHash": "44c3f82f3b933fc6fdeb91b02f72f644bc9ad82ac7d4ac501700000000000000", -"service": "00000000000000000000ffff2d3f5375", -"pubKeyOperator": "839b27bb711b188ebdf1c4f63ff34c840cf2f36e06ae27d6d4eb9f37904e4efc6b333a3a9a20780a82f66a6799777cb9", -"votingAddress": "3Jn89oCs3oZeNhqXf3ktd6QhsEvf", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "bbaa9a0e4030588612914d40ae88b159e055f595ab45f234000164fe6fc1ebce", -"confirmedHash": "60928db5ba3ff8888739bf8915bdd0dea56a47c80119c9812100000000000000", -"service": "00000000000000000000ffff4f621b77", -"pubKeyOperator": "8bc2eeaee64447c4ab172dcbbab711f34db98f8e9b4fc55a7ad4bb5c8521d7ff671d70196392f9192cca96ea7f47f88f", -"votingAddress": "4PS4QsjNownY846t6NZLrUk974mm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bbc2b1714b62b455b537df37ef78f850f921d89cd92a53df4595a7356e3269fd", -"confirmedHash": "4463c0f1c718479578cfab09d0fc2a1b9a266b65f0bf0d3a0400000000000000", -"service": "00000000000000000000ffff87b50845", -"pubKeyOperator": "0abfde7128087fe355e845eba02d78fdb03f704853de0fca9cb45796d843d5da29c2e725b979294b739cad9f3f848029", -"votingAddress": "3YS3refsBt4RE5hbkbaNtSXUqDru", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bbff9f9e4b321a7a5b98567d79adfdbbe5edc745c6a59e7ea97b9b02c3817627", -"confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", -"service": "00000000000000000000ffffc3b5f316", -"pubKeyOperator": "86b752d572d64afc7a166602d2ecfd347bcfe16c3281a25010ebc847b7e777ae2264ba8b1540948f23673310546e75ef", -"votingAddress": "3fzx5hGCnFR44niw9NFninqS2V7", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bc185ac06ce342a9b578340c249095f5666e93151b26a90f18ec77c88974380c", -"confirmedHash": "dd4e4c655d4cd47fcf67002a8a021624bc01e9244c5422372c00000000000000", -"service": "00000000000000000000ffffb94534a3", -"pubKeyOperator": "8348c6520760ce5bb0fb1ba8090a81d8e2ee4591373ee3cdd3ded56d8690d14dee4d4bd36a8f292473f7260081ce485f", -"votingAddress": "2oTLvqKbHLY6EsKrAq9txxJxgcjR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bc2ccda2f331ab688a5145ada42cd94722194d16041d266ddd99a7c3b471702b", -"confirmedHash": "1d6fedff169df03a36a10c4c834acb785692ec120538e2770f00000000000000", -"service": "00000000000000000000ffff2d206869", -"pubKeyOperator": "065470795d73d66a5273893df0b2768b101bee5ebd709c739b72bbc64752272fed7f5daf6b3dffe3679941f9278a0cf4", -"votingAddress": "Fs3bmmx9XrM1BhBoFzMe3WV321x", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bc3bfcdcb48a9531a72f98381b7e78c95eb03940259e9e3b49a650058e2d9e64", -"confirmedHash": "a6a92d2f4aad11e17a864a5bf226ec7df128d81cd060a13b2900000000000000", -"service": "00000000000000000000ffff2d20cf11", -"pubKeyOperator": "148981c5441e28f46de2b869ccf3fda025ac917595b32662cc7d4977f839a6486e3689110d34fff4f1f54b75d55fb3cc", -"votingAddress": "3BPc8fedpPLro2s7huvAN1DuD4it", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bc3d20652d107280c208110c3fec666408564b93d4acadf4c1bbbe3f05fea167", -"confirmedHash": "06a5292f0675f5eed2a40febb915f7231408e222e217b5680200000000000000", -"service": "00000000000000000000ffffb93e97aa", -"pubKeyOperator": "88932860b18e2d699a695b34b96dc4c43f7d48e4dcebf3ccddc3f4967f01ce74610f50260287f3c0489aa813a4037bfa", -"votingAddress": "sXVM43ZXymV3oeTkWtNE4oTdJ56", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bc47b0c3b5d5ebc81e751252faa112ec8172d5cdfb4e6407522a67be6917c7e2", -"confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", -"service": "00000000000000000000ffff55d1f26c", -"pubKeyOperator": "024f7dba28393cc57d3278d25b16cc05775fb0ab5a4944f5ed41679d0b9850725b57e8df4f61ec2caf480657020c8a0c", -"votingAddress": "28xkZaeFgmXx6DDWFHYbgKRN2ZBt", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bc4ce355dc30b3455c1b3d42ac2d97b478ff590416241e90ca9c6c15efe05893", -"confirmedHash": "40155ff704d511d70f5b8b3c907ec547acf8365a719edc681a00000000000000", -"service": "00000000000000000000ffff55d1f136", -"pubKeyOperator": "10a69ae70e28b32af854825e74b596592cf6c9cc1918305f6989a821b59929732f1ba29fc549fda4ea8495cdb8178ae1", -"votingAddress": "4CVxrR6arM1kT6P5JTJPnuU5vdgk", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bc507708fe200638e3cb7b028065c3dd3194a720347ffc9378f27fe414abf0b6", -"confirmedHash": "176dfeddb0af0af859adce10b1eee08d4369bdf4a8b60f390c00000000000000", -"service": "00000000000000000000ffffa8773215", -"pubKeyOperator": "83b9710f107574854701a31b3ccbc858589884b2650a578c4358a86b8d3e9b41e945b5a0988a49db474f14cec6d0392e", -"votingAddress": "oWhSY1GCSgvCPYpZ7qSMnkCeEsK", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bc5cbd52946dd5c58a699fd216898843c703d09e059ab23ffed30a0c0b83dc85", -"confirmedHash": "f7a944841e2a2b5f62155d7a06d60ecb4648ba34eb8956cb1000000000000000", -"service": "00000000000000000000ffff55d1f1b1", -"pubKeyOperator": "944ef056f6c3a6bf344e385cd9ac47ccf1de5a5484698ba21a9e63a26187ee63d328fd1b634f537dbbc51773fe640507", -"votingAddress": "tasGW6U9zyTRfGAzS4MCRMDSJZk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bc8066e5d2b6628dfcd3890f5d9e9eac71082899137173df7ab088109c05c197", -"confirmedHash": "60e0f3fdcbc47cd038384cc747e163d00ad92e094b2ca9712200000000000000", -"service": "00000000000000000000ffff52d31975", -"pubKeyOperator": "02e918a68c637fff171cb3ebcb32052a91698ab6a11f88ac034323cb711ea91efa93bdff00c7f168f3777813738f91d1", -"votingAddress": "21ba2iiR8igkcXxmNn8EXp4oX2Pp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bc82889b996340bc49748c17ab906515a9263452f56a75951daf0512900d03f9", -"confirmedHash": "48c3081aa1d0ea15b2604aa8ee1467a107d36ed447896aae0000000000000000", -"service": "00000000000000000000ffffb29d5bbc", -"pubKeyOperator": "0d6ee003522c47dfa15e0f32af4747c2cecdee33aedca1a4e5d7a6e39e71ab4a14719d628c24983a39f7b13212f484c7", -"votingAddress": "3v1D8JDedktsY7aiSMeLLuaBN6oR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bca9bf9b9be9985a7db7069bbe83064a8b23fb5dbc9ea6ef4bdfd6f093ca4165", -"confirmedHash": "13e442840d46dcb13953e1c3ba674cdf8a977825d00102211400000000000000", -"service": "00000000000000000000ffffd4186284", -"pubKeyOperator": "0e3746eea400ccaa0563d0aa14ddf9f0b0cf0de118da8b699c7b595eacce0eb90f66af27d67864f8d52ad1b5a59bcfc8", -"votingAddress": "43RffAnL5moFxyKZovAEaspSuaD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bccb4fe22c4f27d09fd7860ae450f4bbb2874d5e32668593578ca4f9cff93252", -"confirmedHash": "25bd785301c9628f6780d9e2975cd55541d1b060c370f33e3600000000000000", -"service": "00000000000000000000ffff88f46bf2", -"pubKeyOperator": "8075beee6ecd754cb8aa8dd07b8a60c7e9fc9e0e249ac11177dd75c64ecdc935f2be23f1f2acd71a1e669301c0378a2c", -"votingAddress": "3xxseoW57pP3FWzGfPm1P6G7ijNX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bccb8938b680973a110be980e36e18c5fa2d3c9a1198b5877cb96f50364259d7", -"confirmedHash": "dda17e992efb6e90c925d967313985dfddb2aa5d0aeee9711000000000000000", -"service": "00000000000000000000ffffb009d216", -"pubKeyOperator": "8d1151625efd05ff64d0e602bba72902dcf6c154ff7f0a61b7a2c769558181f83bb810f0a6c99fec4aa640aa27244b53", -"votingAddress": "tDcE9BYkT8fMMT254DGUYGK314K", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bcd0f822acb7c764ec518d6447d7730d35c2f2e9558f4586ac1d71b30bd0dd20", -"confirmedHash": "de6739592b59fed6716eaf418b5ba1e5366da03ca48bfe0c0600000000000000", -"service": "00000000000000000000ffff55d1f1bd", -"pubKeyOperator": "99d28fead930db0fc25e5d23eefdb6aa51d0e7dbbc3247a211751ef42e0e28e882ffe04599d140f1d554caf1d8636b89", -"votingAddress": "36KgBAD1EgKzYwizd6ChYfMfjDW6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bcd3b7856e823156c8f5abcad2df4f8a8c67e3c6cdbd0c480b137563f018d620", -"confirmedHash": "35fb0f4a01350e54996631d8234ae8032ea83aabd6a8b7080600000000000000", -"service": "00000000000000000000ffffc3b5f39a", -"pubKeyOperator": "146498df1effdc4028d4aaa0d0ce53ef3f205b940e1755f03e8e56be572264e62c2beda6cca69efe00ec3385bfd46a48", -"votingAddress": "qccFmVaa7HwqCGcaUySG6Svso2p", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bcef6b51a492d2a28a8be87bc096cbdf164cddf53cf427ba3dc40abf657969fc", -"confirmedHash": "9d57c789aff42463501d4629cd39a5ec9922be676a86504f1400000000000000", -"service": "00000000000000000000ffffa8778728", -"pubKeyOperator": "854df9ddf356ee56e2ca089175afab8d223f9177ac8268fee8ac1f328ac620e64479a05bff6bf4c160f9e8c4a404d8e7", -"votingAddress": "3gjmHbopSyZCGZenxEtqqzXPCN9S", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bcf63cfabe5040858787f97acd905f7fca73be61898cb6a36a004783430e74be", -"confirmedHash": "387677af545adf37b53f7dec719639b8e136f901525645322c00000000000000", -"service": "00000000000000000000ffff87b53229", -"pubKeyOperator": "191a2e7e564fe218dc410a01581d0a8ce057da5e0e6ccde7e5c52c46b8951c557a68661d5eac7b5f384c3c96ab369a49", -"votingAddress": "23dVHtf4QPxSqnm5Asiw1Ros8k1T", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "bd257196d8996a6128c1933096f1b9f14b31831710bc10b2b9e2da7587454040", -"confirmedHash": "245d2aa1f746068da867c375cda4d963bb09e0fd9621fb752e00000000000000", -"service": "00000000000000000000ffff5fb3bed0", -"pubKeyOperator": "10f912e265e3865b0ca0e7a8514616f541d2526e493212d0e82218f2ec7abce09eeb0316d165cdf006dfb596b37380d9", -"votingAddress": "H6irCdv9HdDoMVqhgkgnieRZSY6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bd35ce3b19a2afbcdc4f9b67993e7ba950c1ce1168fe66e75e85b61f65da3485", -"confirmedHash": "53a78b0c6cacf1ac96b3879798fa784d5c58addd6c4eaf660b00000000000000", -"service": "00000000000000000000ffff59280dde", -"pubKeyOperator": "0c95e057929ea1413c497b7127b3e71dcfbfc7ac8b64999a4a0f210244b67f57d8d722a8ee0169ba5be5e3081ca88d44", -"votingAddress": "2owwV5AGZYPA6iS9sGefWcJTcs94", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bd4fd2121be508042bca116f04aa5c9d75317c8338b2701e3dd0c77267cf12df", -"confirmedHash": "bad347d35fd3fd20ad64f89a242804819202f576a01d1b3e0700000000000000", -"service": "00000000000000000000ffff2d3f4edd", -"pubKeyOperator": "83947541b4242ca819613d058e91f5395fcd869defaee6acac650ac7f5906823cbb1d18515f70e385624555a0fed5a47", -"votingAddress": "dheojm86EtgrxDQz9eg3zmK5iUH", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bd4fdb6783036a67084b37802f7275d7d61e2a2c0fd8392ecd7ca8a21533674f", -"confirmedHash": "40155ff704d511d70f5b8b3c907ec547acf8365a719edc681a00000000000000", -"service": "00000000000000000000ffff55d1f182", -"pubKeyOperator": "0cf23d45e299cfc73c9ee3bb79405c7a399e7ba06b0a7b6abe1504f7ad4604380948cd7c553c508207c2f7f26b6a871f", -"votingAddress": "K4PU9RwgJS4dQZnr4dZ7akHpjAg", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bd5b1299cce29340e1dc80671118c08ace7077d24a1a818b304001334902644d", -"confirmedHash": "8ed3ccdf0270eedc54c860fe76c6f3ed5e05ce964c0312a10100000000000000", -"service": "00000000000000000000ffffbca67237", -"pubKeyOperator": "976420a5027143213de79e620093b01e5188d27fded352a472a97c653048d67ca6fbd649ca3b52eee37fb11525a9004f", -"votingAddress": "43oSB1wBSZaso5P7SgZBUp3NsNYc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bd5fbb9b5181a81316a846513463062423709ed0cc99b11bb8194f2448696861", -"confirmedHash": "568a9050c85f9c777f16b52623d030752fae22b26c1ed3ef2700000000000000", -"service": "00000000000000000000ffff2e04a271", -"pubKeyOperator": "00503498fbe6c47a3ef63c885e2b91679194b389e423a1f061f2a5304fce52765cbc93fda64d6950a27fb83e862e42ee", -"votingAddress": "3RzmBCC3RSXM8graMAzQGUqXoGoW", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "bd64ea95f93edb4f93d6fc288e48309cad615cf762bd8a16349c18b6c08dcf70", -"confirmedHash": "6a486b118a4e15ac5701607a362e990b9ad3d3fb1795834c0600000000000000", -"service": "00000000000000000000ffff310ce464", -"pubKeyOperator": "8f65a38090287ab7994b4d391887aee032231c5636b7a2ca55aac58ecddf07ebd5f2364cef06d0663a78adfcc96f755c", -"votingAddress": "2ULBELguvhvyHENVP8KN2WXSUkNT", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "bd6a8225a24ca083bf584ca166baa71e6e696969c34696e3cce2347860df9a80", -"confirmedHash": "daeb28d4cee6639a1ca6d52d009dd946e4a24b510086cfab0d00000000000000", -"service": "00000000000000000000ffff87b50feb", -"pubKeyOperator": "802c0e3c24631d68a0c90cdeb23f5389b31bed81fd545724291f62d2468ea44ee6d457285c70a2eb9937ff98ddf03438", -"votingAddress": "YWWArhxFgfhQEtA7V1jBEy2yXNq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bd7189a8e1b267b6a28d9338d3dbe9a24d1334737fce424530940bf9570562ed", -"confirmedHash": "f53cb68eb93481deb7965a1ddc993e7f33ca76bfc60603e80900000000000000", -"service": "00000000000000000000ffff55d1f1f8", -"pubKeyOperator": "82c04eed017d277987d5e69403daed89879e3a5cfdcfe64c49a08aa17c8e837923dcdb67db84ca1811df0f62fdbaebd8", -"votingAddress": "2K7yJsurnWQSTyNKWKnGGfesoGex", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bd72c11234f7c0f006b7c19e5b75d45f47d9debffec782d0378f5afb305bd02c", -"confirmedHash": "ff2601341ae00a42839c23f79a8f6284d06dcba41f70fa871100000000000000", -"service": "00000000000000000000ffffa45cae2b", -"pubKeyOperator": "80d1edbb907c3fcbf8d06a1c1738093d185be9fbc0abd5541413922568aca821fff4d6b6c2018db30592ba01e486d237", -"votingAddress": "26htyC48F4oswK2pHeuSrFmrC93i", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "bd7b43711f45ecccaa96fedbfebb86afc99984b69ba529ad63f67ddab81546c2", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b097", -"pubKeyOperator": "8bc7395f8b50f568378aca10b33691e81b37bf3a941f88f79459dfa6a19f9de043e64fcbee62785d3361818def95c335", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bd9b421437b9d8b26c1184b3e093fac726189376fdbb7e767e16d01283e35302", -"confirmedHash": "792e7485055a8c799c7bbc07ccc5e4eb38f121326be067d92200000000000000", -"service": "00000000000000000000ffff9fcb1dee", -"pubKeyOperator": "0565d6a66024fd918779bf7c112aa87790e3ca4db0e1a3a26029a509644a58a205dd53be1f93148aaeda186ab35f43c3", -"votingAddress": "WvTdLEyAjyUMmovhSjJjD1doyeS", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "bda19b0623addbc08a8de0cc3c3b374d11e182a52f6ea96bbdc21ad929464b6d", -"confirmedHash": "340040bd464f166bb1cf95ab34f897a684015bf65de80bc71c00000000000000", -"service": "00000000000000000000ffff52d3155c", -"pubKeyOperator": "947454db34e75e8dcde293ac1a983ed851bdc70aff494c069aa63f24a45644c1e9bcfe393196ba51d5f7d49079216ef4", -"votingAddress": "3crM29qT3uEcTkxtCn7Qpu19RxAi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bda868a2935f6ce036ab894eedfc4a4537ae2257717cc1ceb57ef6c838a3e0f4", -"confirmedHash": "3213a4b9e655d7337357665861c427485ee9ef7a81dd48fe0300000000000000", -"service": "00000000000000000000ffff8512e540", -"pubKeyOperator": "186b99c8a1c6bc2e2c27ad74b144a7ba08e3bfdec8c6252b25ec5c3fc46f586bfdea368fef33538ce1a9636f1d8d2f34", -"votingAddress": "2BAABKqGieVH6PDfzHccC8iUoaoC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bdaab61d9203a6e8acbb4e1b5c8db8461aacbfce878a34214d8aacf0a514e8c7", -"confirmedHash": "062f1ca4df9ba56eddb5019999a770296c76bea1ac81d2fb2f00000000000000", -"service": "00000000000000000000ffff5fd88e4f", -"pubKeyOperator": "86d655c7ef98fcb277c4b5a2fae2d704f41f4c7fe3954bdf6f65ab09815377f1bee1703b85f1f40655a91882ae86793a", -"votingAddress": "AwkRmMqpsedjtreUnfta2zRCJ17", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bdcaa8636cf6968fbf5324778367875edfc4639d4cbe38426f7d5a36579366ff", -"confirmedHash": "efd5db6a8e5340a465aef98e8fd50c9f5457bc33f30de3690300000000000000", -"service": "00000000000000000000ffff3e4d9907", -"pubKeyOperator": "006e4247038cc4d83029fc1b8167826e5de776db40067774839141f8ef29cbf35b15d40e08644a1e61b9c30c34295553", -"votingAddress": "4UGBPncnqXYv5R1sVMQPXaMdqhs6", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bdcb83f1a0ae94bd53f627563944f150731b1a8ef0363326b601d2d12e2d078a", -"confirmedHash": "5b2a2743584f33d293806bef3f74b94b34b83905a48e72a91200000000000000", -"service": "00000000000000000000ffffd945029f", -"pubKeyOperator": "8a3cace221e892071b5a21f9f52cf6cffdf588feb485e3a21427f96118383afc523cdb47675d49f6d3a0fa5da38131fc", -"votingAddress": "4K4VmvaYwK6pPzAjvdjfNV549rYh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bdcdff4476fa726c176448ba0ad123d3049a0b542bb2b65805604e41a2b11fba", -"confirmedHash": "b3f9b99a51b81b93b4249de0f1fce18ed0aa9aa7263563560a00000000000000", -"service": "00000000000000000000ffff334fcf44", -"pubKeyOperator": "95e8fbcef6f5275b3c6c0d4b1ba9630d438d21435d38e1a7cbc6d44dc36d44598c002632e0bf4ddc7cc63cfe13950969", -"votingAddress": "1ZN3jabjZDvMYAhoCGHGQbpDgry", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "bdd11779fdf6c538a8d64096bfafdb0de8e8d74b62aebcf2b6206305bdd99e47", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff84919bf8", -"pubKeyOperator": "8934a6b95ecd6642e5224209a4e45ad4276c5fa2c28af76e8dea75643cd3372318b3daa5de7242a9f5bf7a05f9d7554a", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bde38f2cc04ce2ec05ef4785ede91afcc48cf434b48c48e2bcdd40a8c1d4522d", -"confirmedHash": "7dbe72efca5b046e0b354280a6ab940cea182355f4c24a432800000000000000", -"service": "00000000000000000000ffffa747850a", -"pubKeyOperator": "8d711f136df824e8c61a86173a5e46914beca88dbbf70d4967c5b4d113c64ee30374c293e4910441f216a4c8f7f37b2c", -"votingAddress": "2De7vSunmKTKaA3jWwnSxgQtfTxp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bdf2bc04135aa5618984f85021fb07823f06f6fce400d3e2f4359ab082101660", -"confirmedHash": "c25346de137c142a2c5b5596166d8aaf0072c372f6affdca3800000000000000", -"service": "00000000000000000000ffffc28752ad", -"pubKeyOperator": "84830a7f9af1b788df3060c089e3e7d6e242e94802dfb8d2eb46d69aa27276a860963c52b20f41cdb4791a71e58b4344", -"votingAddress": "ADuD6yUtVkYZNkFG1Kv21c9gf95", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bdf95656dfc80537c9379a688be823cb4580a91a9e7cdfaafb4c071d17b28f6f", -"confirmedHash": "d117824eef4155d979434fba3ba7e972dea3e35045fdff972500000000000000", -"service": "00000000000000000000ffff2d4df111", -"pubKeyOperator": "0b8fa237857f6c5972c6312c2c7472dfa9aa2d289ea9aca623a80476c6f15fa84c6f9b8d736be8ac7ab06a008d496b37", -"votingAddress": "2YcTr7MFXTZfGjvube2domBwQF5m", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "be00d9e3e717a5802d3908788f185eb8ff4a59161ba9375a9a8f44076f2644eb", -"confirmedHash": "1be92ea886b0e569ecc90897430bc278a635a623af34718c0d00000000000000", -"service": "00000000000000000000ffff59280fde", -"pubKeyOperator": "0344c4bac00fb6bbb5c45d6384747bde3a2e5964329b15262d46ca682af6ba1ed6deb3f4bb25af1e453639021fed923b", -"votingAddress": "2bwtgyrjRFLTU1Yrf7qtwQF6CAcg", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "be09e20b91f1f1a20c1cfc3af40a02bb51ba5df4c32b64a17b47f944f986aca8", -"confirmedHash": "74ea5ffae1df79185accdcfbb5cf053363292034066cc7872400000000000000", -"service": "00000000000000000000ffffd4186bdf", -"pubKeyOperator": "83a480435b72d91f5e279ba5f8763fb26db5dacfff25409cbd1544ad4dfd35d8182b83594d5d641e9fc66b3ad1f18783", -"votingAddress": "3B28S43FZLN89PtjHaiTE93Lz2wr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "be1654ede76d64340d85adb10b9867602af0153a0192a4661824e682bd10493f", -"confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", -"service": "00000000000000000000ffff87b558ca", -"pubKeyOperator": "0c44d8aa26a036122c64895fe9fbe0074563b9135a135a99057d9977e9dfa01aaf622234eadd97f8fb56fbddded69814", -"votingAddress": "2dHJAKtC7Gvu1i8J7GkTHkerPYvM", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "be1cd49a02a271e67b02828fbda1f157e2199202f7d545988f226192cbd2a810", -"confirmedHash": "b381121d729333671577b3a98afcfeb73f6825d226880f860500000000000000", -"service": "00000000000000000000ffff5fb39821", -"pubKeyOperator": "985a629d10599e6c0a383d3c81be3e78d863b84d6ccf362a94f1dcc1574317ce93d33347fb70ee5c550083a1e757f7b3", -"votingAddress": "4R8caxXTr9GrJ1kVZc9J9PsGNqGj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "be22e4eb57f163f8e7daefc106e2adc95416f686559c9729897a816aca85dd12", -"confirmedHash": "ddf98840b3390ddae52ff0b397ed2f2bfeeffce3f7138e180b00000000000000", -"service": "00000000000000000000ffff8b3b8639", -"pubKeyOperator": "84a526b91dcdbfbdc5ec380a6cbf16ada7dae75c4719f492cfed0706d2be53aa7a5261feb87376d752ad48551fc80006", -"votingAddress": "4UBUVBmxsEAExU2psTR3QvXLsnhZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "be39c240e3ee8c18aa8bd62ddaff666b6d3a4d5eff642ada6e8fa77b76bf2a52", -"confirmedHash": "dae21056be7be38f03f3c8df1f9b0302e2fa891d4a26b0121800000000000000", -"service": "00000000000000000000ffffb0df87f2", -"pubKeyOperator": "805040c9c15be97cc441cd59862ca72ae36821225e63a661ff69a97019e25417c490b80878e17f9998a931c40be17e78", -"votingAddress": "3vYZmev9ZWqYjm2VrGc3jdSmNtw2", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "be4c725b12c1340f212753efa03ed4ee730accfcfedaa3869e29bcacf1c90052", -"confirmedHash": "885d42570aa964b74056996d7ab04a1182a5d994d0f2a0270c00000000000000", -"service": "00000000000000000000ffff55d1f205", -"pubKeyOperator": "83d089f75468f6547a590ff60611ea417b6c1062255de4f2b02a128c00e19661bc1ca14489aaabdad80bad9892ca675c", -"votingAddress": "2HtyMe4CSbbeqGrSEgEMcufFViKs", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "be4d7d930d8198cae06cce719cd4d92beeafc454f3a169ad4487f7031e80ee99", -"confirmedHash": "6b0b7096147be77aeb538b83ca7bfedea24969c7bbe80a271400000000000000", -"service": "00000000000000000000ffff52d3151a", -"pubKeyOperator": "911ef413183ef903a6ad5b0d5b1e5a7f0379ba605ae82cf0f673585f2ddef56bcb71068adf03a2bcf5ffdf89f9f117ca", -"votingAddress": "3imKeQZfBJNYnBy2XEjSsqwLbG2s", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "be67ecd89d35098fd586513e9988a6dcfd6f6ba8086f4157454872b0490301b9", -"confirmedHash": "e5ca46c434b69b1bf4f8a9dac04e518d17a1f450bcb60bb03100000000000000", -"service": "00000000000000000000ffff55d1f115", -"pubKeyOperator": "0fde2b3a9b76a691066c0d7e17a65d58cef4dc2d2da18525febf4ade1f54e63fad7600e728bae166bb99a50f7bfcd9bc", -"votingAddress": "3zZknpcLxwMPmWwgtiPpxpTfaHaN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "be6ceca29842ea4c9adc6dafcfb3055c16302cef672a1a49ef57bfbfeac292e7", -"confirmedHash": "7da4e61f8c0cf90937c9f3e277658c4c75f07a82276282b20300000000000000", -"service": "00000000000000000000ffff92b99f79", -"pubKeyOperator": "8a6bf89f4dc35d0ae22f8c0270342a71447a23031ae7d3a16123573e4d07fa2007bfdcb50fd3d4316b60342cc52ec2b3", -"votingAddress": "LzLtMQxPfuoxPi6SWPouWtrcFyS", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "be7bd16da980df7458690762f93f997df0a830c3a3bd88132696b372987bc4f2", -"confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", -"service": "00000000000000000000ffff52d3191b", -"pubKeyOperator": "85109cff7f828ad34b1e3c44604aa9a639035ddcdc7856d59c22067750fb1843b63d87e1e61355938385046c902a5a07", -"votingAddress": "gFshByKi3uUqxiMsxsxNh7MvJEY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bea489e87dab589e97aa5b9019ea96fd0223eb076b66dfb7f87ba1d2d5831996", -"confirmedHash": "a72879e817682cece2e019f2360d2a451aa648628ca620e51700000000000000", -"service": "00000000000000000000ffffb0df8378", -"pubKeyOperator": "09e7ed78b64d8ea7b4157c212ed34b166beb0c1a7b392fdb99dd7b0a17d677b4db085624bc0848094a6ec6dc1fa66a53", -"votingAddress": "2esgMRnpmGEenG2CxL4USirUru7P", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bec648c747be38d8c3f73d97a8db1da1fcc1daa66dac124d621fcd79c44cb775", -"confirmedHash": "85518800e57ec823d44a71028c78482b9c449f950eea636d2d00000000000000", -"service": "00000000000000000000ffffd4186dba", -"pubKeyOperator": "8d09f84ccd3eba5e1344bd50c88619139c9c5ddf5b0ac71dc5d41879e036eea8af45335f164ca88c17a5417a8f6cb695", -"votingAddress": "3Y3jGsA5hvxPoAGrwZaLgjjbj37K", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bed0121f67bdc522286d94546b703d3099608122e9494c786c90c4f245176c65", -"confirmedHash": "2a70b10100cae043bc965a5cee089c92aeffc4d50d5d442e0d00000000000000", -"service": "00000000000000000000ffff9fdfe097", -"pubKeyOperator": "09f8a0fa4d99f0370e57996c722a499d1eda917b74655ffdf6507af5fd5ae9f42659ca35d5b6748c8d05b7be56237f22", -"votingAddress": "2P1iGcMBLme9Uk3P8mwsyGgaE3GY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "beedeacee220e9e67f86c7e2fd6ec51e5dfefee1e0177eb2a232f461f2e73f4c", -"confirmedHash": "3caad1709620bfbfa9056c2a476c34f3ebf498804572ea4e0c00000000000000", -"service": "00000000000000000000ffff40e14890", -"pubKeyOperator": "0b222b3d49a64a27c20605015382fb8abbd3d1efc035ac418c19bf1df8a3a6c9c47eeb385fa7be8d309bce0f37dd7315", -"votingAddress": "4SeQCXgsA7WtgDM25duDoR12HhaA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bef08d40a90f2a0736495bc59ae0bf7ccc5dc27adfb8b704ddbf19394438e22a", -"confirmedHash": "db4b89252155240a5761c42d062cb2b52b7672b1accbd5cd1200000000000000", -"service": "00000000000000000000ffff55d1f251", -"pubKeyOperator": "14c40ccc9fb2ea92a4fc0b49f7d29d6e00d0a215fcbbbde4c1b0e51fa633b6c834327676f218a5f4a74196affb5770b4", -"votingAddress": "2B4fM4X5CmLKmSnDnmeA6Uo5gSnE", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bef4e937f171a9b4105551e70e993a67fedae2494ea18c5fcaba602b8a402463", -"confirmedHash": "77f221c01c05015690d328e30ec7272930e53e072126fac50a00000000000000", -"service": "00000000000000000000ffff58630b17", -"pubKeyOperator": "859c75005f6be0cc73463378bce3d17e7d11c04d0898a5ab529c16a0537044c0586f9c48b4d856d2d1f6e29b7ece76d3", -"votingAddress": "MUNffNxpbMyJ7KwrB1vDEfFP3ku", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bef857c4132f3acf3c8cfb503e3c06c7e51fdb60aeb44b175e3844804ac57e42", -"confirmedHash": "174545c4310aa1fc23af4c2eab1573cca7bd34b70021a5133a00000000000000", -"service": "00000000000000000000ffff86d1fac7", -"pubKeyOperator": "84db3213493ad207fa642992d2027a4393799d211f5965287dc14b645a37551815fd82b773c3308dd9a85cb482c1fa50", -"votingAddress": "23C7t26XXAqH1KbCRJsbXsGaRxBy", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "bef8e74b8f70d988aade6f633a94d815bd47645fcf937d9929ddef8c16a9d66e", -"confirmedHash": "55c0ca77c9cdec9f6efad6566e5914f881435ac8152069af0700000000000000", -"service": "00000000000000000000ffff55d1f24c", -"pubKeyOperator": "85317ab496469a0eaf66ffdfc756c5bca4e8a5f74613c2d186ca7eaff5f8fe630ba842b5bba8064a70eeb3425aa3e433", -"votingAddress": "5wrPApsGAR7gPNuUJRejxfyBr78", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bf1fc72b447a56bf2aa372acaf1b3d49744e12260cbd2b96b163ca3cd80adfe2", -"confirmedHash": "15b6f7df6f2710c92187e31344c2abfba08616dcf0d111610c00000000000000", -"service": "00000000000000000000ffffcf9ae8fb", -"pubKeyOperator": "074162697e2b3692bdc4d711dde7bc0c933068bc7ee5766b903d13ba6900f963d49e922f10ea61d587a717105a30c4c3", -"votingAddress": "3bMPWh1y4k1DXdZK2vFQj6gWRB6K", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bf2bbbb76ad5db221fa808b9150e1dd24bb43a627959e5550c8703bb516bf22a", -"confirmedHash": "aef08871a04045fcef00e8f9608a5ca6f1883997893ce9030600000000000000", -"service": "00000000000000000000ffffa8775000", -"pubKeyOperator": "92036164965e17bc10032da7cb016c97bb62bc243e3b9ccc8937e831d1e586796eaa49d6926b6173ec5f14fa1289be93", -"votingAddress": "2SyixpuKVLgCAvV7QPAAHjwxhXvD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bf33926046a0567ecf77b66f790c3a8e485d09a403d466c31ab296107a413cd2", -"confirmedHash": "5ed4f5fc30e936bcc9c149e0495d75962417f1653c1a2ce71f00000000000000", -"service": "00000000000000000000ffff52d3190e", -"pubKeyOperator": "015f3d46d905c60ca66f8c305b81426877607eacc79332005545494ea36a74e7500e67b2b70aace555abcffcdfb9eee7", -"votingAddress": "GXT2e2EN88UmWf7ZRP4JGqyUFTv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bf459d7eb2c831a3cb4e0964a7f5d27f9a4592711f6c6d55bf71632360e21b1e", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6db5f", -"pubKeyOperator": "8be2a79bfeee8b9a61ec237b4462f2352abced4c980786da36336ec3565ad2b59ea42dabe110f832af0abb8cfc76fc3f", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bf4e8b2eb5fa116080179a6c878dbcdc5d3aa82732d2f5c199207d32f1014a3e", -"confirmedHash": "68ebfa15ef45416104956064166366ddf9cac18e82fb91812500000000000000", -"service": "00000000000000000000ffff5fb3a77e", -"pubKeyOperator": "1298b68b42b2ad95016cc870f9685439b93e321d3d725e305ef0697616f55758cfaabf69d27816cb6198410ad1390044", -"votingAddress": "255edNvC1t9Q237CHX53mNwgF7za", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bf76fe1faad3fe87191721e722ee5350a17a29f950da5779c1f4037f47648fc3", -"confirmedHash": "6aec913a27489fbd176e22aaaff5aa652eeef98a9ce8689a1800000000000000", -"service": "00000000000000000000ffffa51677d5", -"pubKeyOperator": "00b8c8c70ff46e0a33ce7c9054cd4d00b56bed0081c02b44c2d9406feedf577288cb19034099fe6bdb50a11ced1123c6", -"votingAddress": "tojv8XRkEpLRtnEK8kZh4255kX1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bf7ede2f9a970bac70b18dac4988457beb8f117890290d23835c9e57eb83094a", -"confirmedHash": "9a1d301a18559dc1aa20644fa3b6273224ce13f37e3b92b14400000000000000", -"service": "00000000000000000000ffff52d31580", -"pubKeyOperator": "8b76a3ba304c94c4dd9e5d8218d9189b292bf205ceaa0af8c2ae07139f882dd036b9e8605b63022b6af2365cdb7d6e15", -"votingAddress": "2khqdQ35zJoB4vUrzrZkHWTjsVc5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bf89af8f6265520491825fce34fd7d7e8f09386b5da8eec1c280c666ab234ac9", -"confirmedHash": "d005e0de1b4c5e6aec26114e017655c063f515c444c1265e1e00000000000000", -"service": "00000000000000000000ffffbca6b249", -"pubKeyOperator": "8691fb4f452f71ba1c094eff79d749afb2a058ea6fec5c4affe39fac08c4e1ce7548a41c536c30c1573e98ce16387de0", -"votingAddress": "2mbHKYgFL6GCquL2jdb4S66QMaSi", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bf9ab69f6a85f8e93e6b3484073e984e6d8d54573090af48d1e214f27a98f115", -"confirmedHash": "3de275cbb8621d43e156ab1d8d52a55dd276792a7ad1636e1800000000000000", -"service": "00000000000000000000ffffb23ec477", -"pubKeyOperator": "07e8332894a61db65efd48f3e9f4400f14b0e904e9f55c13d7ea45275cc4ecb25627a3a5b33b0ff851d65fd20c6440d6", -"votingAddress": "2393V62ivZvvq5EAQTCkFm4qFY55", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bfa49d129459174c95dc7bb0cb849352579d78e1a4769810bf80ec140fd24024", -"confirmedHash": "a29936d738b44010fb5bf2fd6b7de033361cfb1eb53683ad1900000000000000", -"service": "00000000000000000000ffffbc28b6d9", -"pubKeyOperator": "851f035b074d16ab7d81a0d357f73d42d42b474ff472d7dfe02a7571cc557a7f9cf69f6e6e1f5cec01f3e2978011370b", -"votingAddress": "2ccfANAQbjCdeWCHJ3SFxdxhKtEi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bfac08d4182121db56b331cdf1d4e069ea9c30236f247dd337ed44d8f4d8e10c", -"confirmedHash": "fcaac8899d2cba9dfdac0c945ba86965eb9a77c8c154274f0700000000000000", -"service": "00000000000000000000ffffa87757cd", -"pubKeyOperator": "87f46e7cd0147b3bba57b705c2b5b6f3bfda0a05b952d9b2ce6f03bfbd3bd73b22aaa9e6c67c24231391e3f9f6802e43", -"votingAddress": "2f7zRVrovPqcTKKDeuXiP55sfNc5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bfc0ce9ac560c60c8a726d3223dad66d8ce719fc9f06dc7627108f35b9eae907", -"confirmedHash": "27abfbf06166e169729ae12f45e738192b4b5277b00234270f00000000000000", -"service": "00000000000000000000ffffbc28be2c", -"pubKeyOperator": "12802a897140b80f643a4d54a9e3b5029d88d07ed55112de660d1d47bd82f58d86551780932244422daf30a63bd22df5", -"votingAddress": "FVkEr11X9m9eRCg3UcyeJyMpSHz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bfc568149fa07352b8103aea373ab7484a3cbd920715949158a2b6f87349303d", -"confirmedHash": "e4b12b8ecad4b062ecacb27186f3980a1e9407fa1dba0bc10600000000000000", -"service": "00000000000000000000ffffb23f7986", -"pubKeyOperator": "99530de1a0be3dca5879f2b441cf3dd992f359b747a708dab8b39a293d081d86c38232258bf1fee72ad1a13e9582b0c5", -"votingAddress": "Rber6cRdM3qgzuMfZQk5mABw2Db", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bfcbbb7c645e7af7eac666b3f3762617f7a4fbcc9eaa8674ea93e87d14ead233", -"confirmedHash": "b4d40f9f07aa0a5c0a63148c90004cc5eb9e36293113d0441100000000000000", -"service": "00000000000000000000ffff2512e338", -"pubKeyOperator": "810fb34e96ab1a3c37b6ba2872730e3d3eb1cc2ee9ac82265540adc1c113e4a18e89d80de9112e235326969444ce48ab", -"votingAddress": "2ppgKsZWv7fwHvhiiziCzsHCUchg", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bfd2017d89748429713804620fe7115c5cc606cee36859cfd1a02a6d16ae332b", -"confirmedHash": "d8bcb545677e86b14be0318dbe8023f2aa86acdb4b2c5e890c00000000000000", -"service": "00000000000000000000ffff2d56a367", -"pubKeyOperator": "8f3120ffa7b1d8a650299ff1c4dc92c2fcf16904f4eb3a731063e09b1fa8e2b5ea3c57ab8fba57a7d5e14e33fe4d5142", -"votingAddress": "4ECKJe5o6jBbQoH4gdWGopUDmNKK", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "bfd280d22a21574ea9f568f7a729b370f4051b89eab6df3d0d74b65fde1bdb79", -"confirmedHash": "86db59de2516f225210a10867e40541ca66c911efe9c30633300000000000000", -"service": "00000000000000000000ffffd161ad89", -"pubKeyOperator": "0a6a7fb814db71eb6ef12341749d81b5fd326eb4b9445a3be65668da9856910b378ec6427fe18fc81c39499e7c706064", -"votingAddress": "2eRnFocgYK86VRPnv1rX6WMoMLxM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "bfd3e955c53b3c3470d806373df5b24c785b3a9110766d0f21e705fecf1b76c0", -"confirmedHash": "a5d5f5f090a825f6c3b57eb1d6573a6b17ef22a8703ab81e1500000000000000", -"service": "00000000000000000000ffffd1faf354", -"pubKeyOperator": "8d6a9b08a1ccd2bfa5be268904df9b28cd73890690ec22e5cfa8ba01c4bdf13e8e2ad5889e2476b137575eb579fa7265", -"votingAddress": "3HqLqWxe65ANFVyGvWcqY8opm8YH", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "bff766a0846260b1bdc718930da6e7d94ed17308ce0b7b0cd42732246e5e02ec", -"confirmedHash": "33c43aae90c06b2962396a72275fc568e5a386a837e649210000000000000000", -"service": "00000000000000000000ffff6deb41a2", -"pubKeyOperator": "87734c9e0550fcf06a146c207094ba025aa1249d98eb692a425487c4c34a2b4c1b3a077331c3213f160eb382a94df9e9", -"votingAddress": "ia9xR3RWB5G6xpj86QtWagVRZ4k", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c007c02de283c82e5b8daf5ed326d2fe410d9fdcb8b046b85bb27af25773fad4", -"confirmedHash": "86181408c408946c0e781a56cfd74aeccd0a4cb0c6e53bb30800000000000000", -"service": "00000000000000000000ffffbc28af41", -"pubKeyOperator": "933cc681dc65816eed170f54af4b133a08153593646c06af72b1f1e2dfb238bf29516e5e0e36ac7ab7397385b5644019", -"votingAddress": "3ujz1qsPQ1v7n9YW9V2nsLVCApYH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c0287a0ef607c787c2b86435bb58dfc09f0a4c4d5d0299c68bf555c2880b4c97", -"confirmedHash": "dcea58f5fc4284e77e2c032243880a0fe7689f412810266b0000000000000000", -"service": "00000000000000000000ffffbc28cd03", -"pubKeyOperator": "0c656645c53c121834d6d055152dd1251d80bdc12c88f6e032d9f4f4b4f395b2ffb24278cfe6dc83fd0f591419b31f2b", -"votingAddress": "39K9ue2VQeVCbK4DYYG5pKFbZz72", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c035221ce1048a1a40f761b7930964c9414bf6827d354347c2e3d8fdc23046aa", -"confirmedHash": "7b02d941c2baa90a79552effc05ae78dc0e308b9c52142910800000000000000", -"service": "00000000000000000000ffffa7564f3e", -"pubKeyOperator": "8028848112a09b5af93334ff27bc5a7b868f8b28f8bda2e5ca9948fbee5eead2f0dc501f845ae94e8db69fe1fa652fa0", -"votingAddress": "2DTEko6F2bPeYHgNFXY5XDxGNos3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c03e1cfd7d98ea8022afa8041156fcb889fe1cd89b5111ef1940cdd8c376721b", -"confirmedHash": "f9dd7b5a4b054328254a22dd5b6d04b96bf4f46a4afa6ce60a00000000000000", -"service": "00000000000000000000ffff258b154d", -"pubKeyOperator": "95da3bde922de304b2d2fe042f9babb0833fe79795720a70b469b1cff47aa97d4c297270383f90ac0323a489c05ce262", -"votingAddress": "41sXA75d7Pw6Ufk77VkshoX1pqpD", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "c04a5713c481759c60e41fd3c5c83e4de85f749737a53f1de071a060233e4962", -"confirmedHash": "d2085e6912125f5efff520e95d16f5232628a729da2345632400000000000000", -"service": "00000000000000000000ffff3211af5b", -"pubKeyOperator": "90abca26d8a3636b95bfdb1a27b9ada40f2f52179c41dc8c60d13ab4a1eba3a2b69f24660008f96fc1802c99e657cb4e", -"votingAddress": "MqPJLyo27aVUQwuFKXza8obfBCZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c04af5d67a436186ed33aa2ece01e576821fef99c012019a5cb889877848034a", -"confirmedHash": "7cda983d2dd8a2fce5cf6141c48cfe13ed4c9c83d43f2b4e2900000000000000", -"service": "00000000000000000000ffff5fd8542e", -"pubKeyOperator": "89b8787b9d9c057522ce517cff5e6909ce8cda77d0de446896d0e27909e41c5b494c2e764b2936c673ec8e2a3f0dfb94", -"votingAddress": "3yXqbbz8HG2w77CiTfxFZ7ZaLgtT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c0502e793ea3e986bd131f653cadc87efd07acda55c8581791f0d9c1b9f71c15", -"confirmedHash": "ffc3cf168c86bb1665c3f654be647d58b81aee86f7d781000b00000000000000", -"service": "00000000000000000000ffff2d4db1b2", -"pubKeyOperator": "1054ea32cecb7bdd26e30bc44a55da95f7a0ef53a7bf4ce3d3247428323e01513ae2fdb3656cbd7e6605310e086dd1a7", -"votingAddress": "RMkEdMZhWxS3zqrJByGqh6cG6xi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c0544ca1f99a4e3a0d59d8e51a295552e787f6bd1f6df36ac572a63f0c1f0b23", -"confirmedHash": "c3b534373db00687c67636de6eed1ddb62cff6ef7b4986421b00000000000000", -"service": "00000000000000000000ffffa516ea87", -"pubKeyOperator": "86b941a0a057cca4334b435a9a005026fb69b1126636ad2f82ad068eb24683b85456ed2f45e90049e30af642efff27a3", -"votingAddress": "3LhsZZTySv7adZXW7crbTjd3r936", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c05ee51d6e63e830da4f1470d41bee80b13750f23ce5968b9bdd7eaba4ea72bb", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b084", -"pubKeyOperator": "0c4c52af30425c472f37b54b28888c14b0a1f03c8d5b624f6b84460d3b09801e91d8551ddfadf7ef01bc5b6e12e7c868", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c076d7154e3a4ac1c84befd82ee3b2582a8c35135e415736af77ea5b1a48d92f", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6d7ff", -"pubKeyOperator": "14a1afe3f5367e9b007f004668385f981844af7ab105b33293e5aef00277c03e447034b5472dddf2207640d42a502467", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c0792f1d3468bfff6b447352e37039c603b814ead6badb2f32271300e35a68b8", -"confirmedHash": "0eae423e379ac702458bee8fb8599fe3a36665aabefd66540a00000000000000", -"service": "00000000000000000000ffff87b50847", -"pubKeyOperator": "8cccf6acec961473f520849c69a346a706a65ab23785e1e08921c98336165328a2c7624a5d5382992c78ea6af8c25313", -"votingAddress": "2T4deUp296NYjfEcqNgYEXfBoWnF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c088fda0a29e74c170777957844ea17205dd1f1df85254343da2ebdf3c6fec22", -"confirmedHash": "8cde549019656e50e05cf3819d32aec26d4c9a28e67b397d0d00000000000000", -"service": "00000000000000000000ffffb23f7981", -"pubKeyOperator": "15abed675f69ce1204d715b1ff44d24c3bc4b067ac2db6b2baac5e000347d0a9d95b17e8756aaea097df51fad68cb575", -"votingAddress": "2zGuZ676gKoE7SLF2gNgGH6Urvdk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c08eb53b66ba197a02b6f9f3e4c3abdb13aa014f8087559c2bc84adf65e0fe29", -"confirmedHash": "a530c477318398eeea02faf1515ce96efe68dcc61f703c751800000000000000", -"service": "00000000000000000000ffffb23eab10", -"pubKeyOperator": "17265cc742e4d32af05ce85072eb16bdbc8a7041d3699c8af0074e7b67d69f1eb50bad9461e6a87d37aa42a4ef2dffcc", -"votingAddress": "4QCM7vZjHBhvW1KKKAaTDXpikjne", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c093ce0756b052e0f4d8526b84f6ffbd618616dedcbe1435bb6df7c4063f6073", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0a0", -"pubKeyOperator": "81d000bbc586ce6fe6ef3ca597c9eb4e99c9b3515ddc357154fc8c2da671d1dafe5e8122b96e2525a53a3a275dbcf595", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c0a96df48a181a158a2c8006481934448f4b51020211830834dffeb2f5033619", -"confirmedHash": "f17712784dfebfc91e6e3a157e246ab73f16aa81546d92302000000000000000", -"service": "00000000000000000000ffff6baafea0", -"pubKeyOperator": "16ba343e2e3e9f7eff03451252d669fb8022c32011d7825509a8bcbfc15246e75a12fc41d36be143008c6be2ec3689c0", -"votingAddress": "3Xn5QfePajjnwfNarfMLn877uKsg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c0aadf25b1416b1331d0b0208f131c2cd24264a6d20d94db397fb51915170445", -"confirmedHash": "cbd76d65ade9965ad92931a5e14f60a5c102fb56aba0f20c0500000000000000", -"service": "00000000000000000000ffff55d1f147", -"pubKeyOperator": "89ca05f9970f3d9343b3665ab400b86129cf2f9e96cb7d68ce5503fb54df468dcee09778fc5feed87a0105493d208d6c", -"votingAddress": "g8aVaDDwUtzyvnUCUd2zzQM3pAG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c0b021b48d70b1a94beba0280ef556728c04a97318db77a6ab3f1d4c976c9307", -"confirmedHash": "020997aa670986188924bea1410bf2cace5880fce18b98fc1900000000000000", -"service": "00000000000000000000ffff33c35b07", -"pubKeyOperator": "8b140a0cc9bce087c3e79eac1ba80c38f8d0b6e7543de276b51def0bb7965a6eea266564b6cf9aea4f8c7a2f5e3844cb", -"votingAddress": "bfwQrPZsWX83WZoPCRgWLEs7MF8", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c0b7642bc875890eba961dee764cdac9aa2d36172ce790f94a6c98bedb697d60", -"confirmedHash": "44bbcc917450905c4c682062c4212c42797c62fbe8da91de1400000000000000", -"service": "00000000000000000000ffffc2875164", -"pubKeyOperator": "96d3a2402fde9194525d56c1795bb4d01e02a780ba561997291c53a5b296f7d302b2b3d129702cc2c6b8a1fb3242438c", -"votingAddress": "45aq8LUs8HDoruRgxCmLexa5nscp", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c0bfadec1f8310dd82540b74cf9f1ff6fa4c7440fc3aef656e6b9b47527a0885", -"confirmedHash": "7dd645495201d93bd6900396de3e6beef93871983199fd850d00000000000000", -"service": "00000000000000000000ffff2d206dda", -"pubKeyOperator": "99190c97478967d9706bd44e01525057c4fd2ebe8351de65768526aed90e9ff2f7e22244c67a7fa929def1254c430e1e", -"votingAddress": "3Qxdtx3CsZm56mbNZ997emsqkmPu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c104435b3717172f889dd4cdcb14b6eb6649522109bb5c41cad12947078f2d18", -"confirmedHash": "24ebcd978a7eae98ac746a74ba422e7a01d325f11e4b5a4d3000000000000000", -"service": "00000000000000000000ffffb29d5bb0", -"pubKeyOperator": "11d42d5d527b0c969fdaa6b697bcfdd49821774ce78e77b803cd54b46f07a6153bab6eae4fcfce0f3396599466cf719b", -"votingAddress": "2pE9DhUfivMdnyXprrF1rMZfVk1t", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c11a581b367ad8b0026fbe1d30a399906c8d524cf9c554a0b6f581ef9c071084", -"confirmedHash": "c500f85a4db9b6cbca1e35ace18c9614d1e84d2eaf6304a10500000000000000", -"service": "00000000000000000000ffff52d315e2", -"pubKeyOperator": "88403efbdd1fbacc498d5cb83b380591cbb18d9189e1900775e2595d608660a53a5428339f4f98d9dfb2ea6246b0ef71", -"votingAddress": "3cRgoFQPY5osH3nfyvbTjqdTER5u", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c12b33c5df02e2376bfefa50289a071ecd23f8a1c0c8a10444bc03e44fd76cfc", -"confirmedHash": "9bbfab2d195be007fe7754188693ee2e5df965e6807967f70300000000000000", -"service": "00000000000000000000ffff8bb4b884", -"pubKeyOperator": "00d469ebfb69187e3b73f5b808ae1f33c563e49b5fd871fa5c0cfc47e5cc6c7b8d28100b7f2364888ed1d2f59d71d50f", -"votingAddress": "2HioNRjE96jQ1CkC8FY1CTgXw8vr", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c12df58dd65289884997e44562f592702c7a30bc3fecd16f8d3c9663f4bdcf23", -"confirmedHash": "7c198f9ad635960c0cfca597dc3950a8304e843415d041471000000000000000", -"service": "00000000000000000000ffff52c409be", -"pubKeyOperator": "03c076325d021699e4ae08e890cd9bacd0091de168107ed6a86e5d1abf387381f69f326766d346b63b1d94471cd6fb1a", -"votingAddress": "uZpDdoLyejVcJxMeCbg6syzUvKR", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "c153d4d8e9545b139df547e9b2ebc5009cb2f69eebc11f91d904d80f49abadc1", -"confirmedHash": "44bbcc917450905c4c682062c4212c42797c62fbe8da91de1400000000000000", -"service": "00000000000000000000ffff592fa7fc", -"pubKeyOperator": "1343384d16a30464ff5a4f8137e4cb0480ffa5e7285bf069d82359ea1c3f79364d1c2bc5be343b20b30299faad10d7d2", -"votingAddress": "2prDiFK1aFmJeg4vRXLBLRcRVWx6", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c17111fc9c9e3c07c2f4b50c534054b862c64857bc367502490ff01d57313c8f", -"confirmedHash": "b00ee3eaad6959b29009c0fbdb8655e91e85f35f45e765f00b00000000000000", -"service": "00000000000000000000ffff128bf409", -"pubKeyOperator": "125c7c33baa0ce81c1ffdee23d5b7d7c07d4dc3a80ced2563cb647dcc83126d0a686857d7930dba5e35a8c65dd5fe465", -"votingAddress": "26bFYkce44eDHGvVVY9gmP3LGdGp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c1803063ee5ed56405ea3691321c93adc15312b4bb30c94f633b1e8ebdcb1eb1", -"confirmedHash": "796d2cb520af4584d5ee4062b8e57e1450ed4c20661874eb1100000000000000", -"service": "00000000000000000000ffffbca615b9", -"pubKeyOperator": "081e63cbde87a6b88041b47ae65b35ac74c63d4819c9c3e491802b338801fb0a0ff9a66aed78270f7da09c6b8070a43f", -"votingAddress": "3YRJRhsV45bh148bmLZBfjLDkX9h", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c18a0d4a475e6dd83835e23327966f32c7319bc9f488e5d0abc8bf7a29dc8b08", -"confirmedHash": "7e993ba36783c1b5b07333fb0ab03ac2fa1d4e17d8cf11401700000000000000", -"service": "00000000000000000000ffff5fd85422", -"pubKeyOperator": "008df8d312d282e65f5d803add748676e6b6024e6b9801e775a2ab42c7123f228094dd08adab86095adf7c6ea75a33d7", -"votingAddress": "hQR3bJUJ8PabNcFttdsQxMTvuMS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c190f656e812cdd966834f80d2fa784e459f87fff734ba70e4817d15ea2e3b91", -"confirmedHash": "ece2c76c0b711c449c467ad5c9756e7df826b32d20ec69401800000000000000", -"service": "00000000000000000000ffffc0a90619", -"pubKeyOperator": "91100fd8165bfdbf92a165cccd86eb449af2d63a27db1e396f97a2ca674101ab6273d2e7ca789a53bc75a47eb56e2fae", -"votingAddress": "25AeKPhJNg77CPKqAKKfqpDLcpX8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c19f7f1f81c17b042d334c25b4f50204f2256c6f70a5de93e365ca3fab138de8", -"confirmedHash": "4611b050e9fd3800c494445b88992e330891ef79b3c535e72700000000000000", -"service": "00000000000000000000ffff52d31520", -"pubKeyOperator": "9676aadf1bf29bbb705ddbabfe6813d5def89e8e8d2735c4f95864e942e2b46fbb55885bf5aa2bccca9b7d54ac39c510", -"votingAddress": "47iqpnmBr7XFgJrKRwZaKbd2eEoB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c1aac3b1edc3b8191bc5e7cce6232cef3c3b0d5a97affaa6312dfc2d0c30e6c4", -"confirmedHash": "b569c8ee47629d8f158aa8411fa92d0d66c02daa5dd3ba620200000000000000", -"service": "00000000000000000000ffff03f81ef0", -"pubKeyOperator": "04d54d147a3ec210a9ef4ddb6d1b78487362871ca14b17d70588b04ac85807da55d7443e807674b29fe5591c50154b8d", -"votingAddress": "3KAF2Uy6mc73gTEeYeRTJNQXNm12", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c1aca98b018a32233caa9c34a04143ebd5430ce8c6566375c35920ffe2899b85", -"confirmedHash": "30dce32be3dc8bf04cc4ed203703d3b7834b75ceedbd8cbf1d00000000000000", -"service": "00000000000000000000ffffbc28b6cd", -"pubKeyOperator": "001ff51d23830ab64aaa2032b5a299b0ce64a78751091380a2efb53a0fb6c12dac7d7b33880b18e413dbeb0207dd0e62", -"votingAddress": "4WpRsWnh5oizKGBu9J8kku4Ny9mK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c1bb9c4fabb1ebde8278464235940a3368a722d7b61d76db92b4693ee4f5234d", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b060", -"pubKeyOperator": "937683160d647c8f81d4e114c3e625ec07cd998756f39798bfdd8a0a0d45cddbd69f5296e178a09bb966269835603a35", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c1c54705df7bc9381de6ac0fcad060b508052195f8c80d6a43150a7090b3c1ac", -"confirmedHash": "bf610db7a292e9a2f83c409b20fca812e5eef48c09c45ef51300000000000000", -"service": "00000000000000000000ffffd4186185", -"pubKeyOperator": "16811b6a847f74f4c32e49311f9edf8ebcd7a7341e15013acca5637dfad63bf6e567c94a66cb75868e16ff5688eb82d2", -"votingAddress": "3oyvMgpY3GxReP8mVKtRKpqPwnBr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c1c8559066c24ec09867f41d7c96b38bd750090a92d1a25e428025a7ebbce3d8", -"confirmedHash": "4497447712024afa80d13a79a30cbf40cc96073dde76e4eb0e00000000000000", -"service": "00000000000000000000ffff91832a60", -"pubKeyOperator": "852c50e7138027bf317d9533e6708182e26a738b3240078dc7d8030c7364b9533c7932c3bb1513f8881fd12d0222d269", -"votingAddress": "njPdf8HWZbLoQ9wrpxxqvtc5EQg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c1d0b5c547b0778dde61c3560190fe0c48b80aa9e8a3114a2918641d3ddf1abc", -"confirmedHash": "ce63eeee7398947f996c023ea94a8feae26467d5353409a21700000000000000", -"service": "00000000000000000000ffffc0f1e9b3", -"pubKeyOperator": "13d6c8e3b6eaebce13902ae15ea512baa98e7a0fac9ad24eb49275a5bccbb550b5261203065b7b5b00a9de582a8ab7ae", -"votingAddress": "diKfnhKVQ8DQSJmDp5zESAo6xUY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c1eef08477428969635b26f5af4795204f0b5663dedfb0e3959823e36572b2a7", -"confirmedHash": "c58971671ff2e5b2629c64cf449fb208b7215008b0a2aede0a00000000000000", -"service": "00000000000000000000ffff52d3199e", -"pubKeyOperator": "15542155f42275fe73def38cb1f946b8f2fcf8758ae1c1683004663fd0055251eab006fe5edfbd28c1d83ae9a47ec7a0", -"votingAddress": "3M5wZN3EW5nWQm689J67of2GRDLc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c1fa59e0670aba6e441f29cbb7f473e1b6b7c6df2d28e76b1bbb510d0b8c451c", -"confirmedHash": "c19a0fa55f40a5197ec1a65cad6e6c6a54313fc8a12643c73600000000000000", -"service": "00000000000000000000ffff2e2428f2", -"pubKeyOperator": "8d90fb5d80d4ce47fa3d46f4eb69c516d7ffce5974938cda8a0055d4e1e4f445251c86b75327e5d776618e29b9c26ddb", -"votingAddress": "3UgLvXbiYzaQ9srYmojMVLE1N885", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "c1fd613ace96c2f7a02796ee2a2d7e1a4e4fe7d2dc5bd002aa4b3782508667e6", -"confirmedHash": "5bb99cf5079e52d10d905e2dad81aa4f6c78e2b576ba05190000000000000000", -"service": "00000000000000000000ffff55d1f208", -"pubKeyOperator": "105c0d003778b3aac38787eb0a00fb77233aad77e0daadac4bb6ce35e3750d9db0eeb9c7e04218529f1d3f54a99376b6", -"votingAddress": "yP2HQ1PiUWpUFEBRaoBhW7FvtZg", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c2067225a31e3338a42d3914c0c8f23e8c893fc3c3d061f6e957e9d1bb0a7e64", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b092", -"pubKeyOperator": "0c2afb6c6543dc6ac1850aa27d615b065ec5d28220f7e4db5e7016af925fcec531a3c1566edbbe34f903b9ba4046c8fc", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c2128a6ce7385022d0effc343eaf347b8ad74e27be47488b904d9d6c841987af", -"confirmedHash": "97861ff98bfad2fe800642bd1ac00b11d49beaccb94adf231a00000000000000", -"service": "00000000000000000000ffff8ac592f6", -"pubKeyOperator": "00b0d838d73bb9b8d0cb461880bc3b38e47fffc652f3e98c156812f8e559a720c686df8b952bef01d83c68354837f0dd", -"votingAddress": "4LxfGCP4NBTUjwdnmajjh5M3JFr3", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "c21328b5e9a273800c39f5e94d950b5aba1ccf8214fd9e37d9998e774d7329d7", -"confirmedHash": "a443ab7cced073607a6038d11570af1affe2525583f034dd1600000000000000", -"service": "00000000000000000000ffff52d31996", -"pubKeyOperator": "99aa3c041280376831237e7294afc4f30febefd201dec29cc282a483c608933ccac630ea6a38defef2cf7e4dd03170e0", -"votingAddress": "2z89eK4gxavSQPbsZe3VhKgU6Di2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c22486b838f89e5d2b27931776f3381b6f60386feb786f1eed97ad71aa877981", -"confirmedHash": "1739ba773f37f199a5b11dcd31a61c69012f6814ea6a72c01600000000000000", -"service": "00000000000000000000ffffb07b39cb", -"pubKeyOperator": "996f8bbfe935e8144e5472087ce84d0f601b115e51b4ccdb6a6cfb6e2e5654a9bee349b03020e4c2f6b23b06c3703d66", -"votingAddress": "3MSHyrNH5KdMj3eweXxhbqz5KuSE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c22ae5af6d73191384c92022458575ef744c14468ef7326ac8890aa0102331db", -"confirmedHash": "ba70cfb6393d45a2be3efd11943f0529eceff0cd65061c6d1300000000000000", -"service": "00000000000000000000ffff8b3bae02", -"pubKeyOperator": "8d9b75658d1cf91484b821fdbf84fbac99e196df62c2d694c769c4605eb7547a3bffaf799bd7ab9b01f890823001ffdd", -"votingAddress": "4KzUstfyQoSSSHoEQKZAqa7xnymg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c23609416deb364adc181d002f0505ca1f3a0f4f57fb5e7ac60cee41984db97f", -"confirmedHash": "d62e3d418e6b079e8c4251f619b40ba73bf3dbac672fa0481000000000000000", -"service": "00000000000000000000ffff5fd85426", -"pubKeyOperator": "8b1ddf47783f55e312acff4428ff2f4e8acdeb03dc954f96add8024da46f3e29aed8f06e9e86cec65e0cbdbf04878325", -"votingAddress": "2CFym3buNEhLJpbq9DsRQ3PwxgrN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c251b571c1e0c216eee5e2f701e6e0ac5b28d167620e39de3ddebdff110e5653", -"confirmedHash": "c1ec7a2720821ab6952c9785b30cc79a8c2df7cd52d490901700000000000000", -"service": "00000000000000000000ffff2e1ebdbb", -"pubKeyOperator": "0c82d19581261559e55dcc6008249fea598abf602e0ff9246c08a6564c35ecbccb736f655997152c1b1dd500ffadb14d", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c253aeffcd605fd80536109602991d085e4b21e66fe578360b3af6c87593b817", -"confirmedHash": "941b7be7c8c05f4dc60548ef71946c445191f467a1192c4d4800000000000000", -"service": "00000000000000000000ffff6c3de021", -"pubKeyOperator": "9387923f6c61dc011d4e39dfed45b404bd428be63a8da540886244e1ae652292edbfe0be0b764a3ac16f3f3a3ea44f0e", -"votingAddress": "251yffr6Ux3C9T3KZ8RAVyPkEyuw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c25dc29125fe24f8b8c1ed6b270880e85c2529b56660d1056a151d56a6f2e460", -"confirmedHash": "82ab4b63fa3970a636ec7a713b585558e79935af9cb3ab092100000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "4NAn2Lq3vvgS5J9M4K5ELka4gnKJ", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c26a8ff8c92b1e7ac8db98d7a27b4016499eabf35c6cef174443318296f4f1f8", -"confirmedHash": "48a8e9cf108dbcd8d04f7c0f28a193c237ed84f912dae1161b00000000000000", -"service": "00000000000000000000ffffb951a62b", -"pubKeyOperator": "892444eae6d068c6dd098cba2b9942edb321bda68d96b9079b1a7b5decb1f130befc8ce261bb3ef6fe526cd2e93c09e4", -"votingAddress": "34EwdYJAF3Ze5NHjkH6o4m2bLn1v", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "c29b367ba181adfda63d320a9b97b70eeca170f1a9373e23b1644350cb65579f", -"confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", -"service": "00000000000000000000ffff55d1f267", -"pubKeyOperator": "0bb40348ef34d50ac96c72b18abfcb8792c44a8b05f2fc31c621042c2fcd34204b6748b5574d36b0076f612e479e1cc0", -"votingAddress": "2VDLNFSLbxQdXQ9Xt8cqqSvZ8KLC", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c2b0d0dfd094d13950406c25e7990c074da0523b6fed04f13948f44cc36495e4", -"confirmedHash": "3e4b8fc55df1c2fa8a38079debe814c831e436f21919d3610500000000000000", -"service": "00000000000000000000ffffc0f1cd5c", -"pubKeyOperator": "10b3e2935ae876ea27a3f40efc90097dcc06dd7b50b62609c068aef28b97e6bd94f59ba4ea418690547ed1e6261143f9", -"votingAddress": "9m3X6zuB7Lefobj98BE4coh36YP", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c2b89ea5c4bfcaf525adb30e6ebf48fc65015b5e1426774c20cecccc556d65bf", -"confirmedHash": "792e7485055a8c799c7bbc07ccc5e4eb38f121326be067d92200000000000000", -"service": "00000000000000000000ffff8ac58f76", -"pubKeyOperator": "0735ebb45ef15b3a2103ee18858293c7986babcefcd4a0ca5c9ca36289469d68326a18f60401c2fc8989b7e2a812f6c4", -"votingAddress": "3VG9Q4L62Q4ABkJcZPVQE74P5B9z", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "c2bda1e3afcea737be2f346c940a50be5c2b08b3ef137cba1f5a83c6bdb76a93", -"confirmedHash": "5a2d6bcff90b5d381b69ca0877071155f3f1230d6fabd8170300000000000000", -"service": "00000000000000000000ffff6c3dc640", -"pubKeyOperator": "910870aa292d7517ff492686ba0d289aaae63d5977a305422fc8db7c2e31cf9ecce512a50d34320b87bc5a7dcb64186d", -"votingAddress": "2kU8o72m9CZjJkxShqudGML6qj4X", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c2c1d2e68b9870b74bddd064846eec55ce51f90897f9abd496df1edb135aca0e", -"confirmedHash": "460f4bfcbd475b87cfffc76e1393f9f00ded622b245402eb1900000000000000", -"service": "00000000000000000000ffff3a6ee0a6", -"pubKeyOperator": "8fa877e3a3c898d2324b3e4575d63740ff293357cb7c7a9413b217ae64cf8ae1e13aceb54205dff91ef5d3b9746a33d3", -"votingAddress": "3SspsPUukP3F6qW3qSYpLSiwvXVd", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "c2db122c0c3149b2d5dbd7726455c376b3cea7294be120ae037e306d21cc7094", -"confirmedHash": "43b43a4de8eae4222c8de76fa6e2862ac5dfbfa5d856f5df0e00000000000000", -"service": "00000000000000000000ffff2e04d9fd", -"pubKeyOperator": "064d4f6c743e8151c939a0c9def80176fb98da73077a63482f78e3cf371d18138d343a2614e002d1ad65f72bc01e019a", -"votingAddress": "29JoDsqPeZxQeXUbWfmx6RPEyeu5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c2dfe88dfd86c1bd9cc8036dd354875dbd59703b64f9f7e7c7659bf36cfe4bd4", -"confirmedHash": "67849a82f90391a5711224e602e358c9595a9db7578b57cd0300000000000000", -"service": "00000000000000000000ffffb23febc5", -"pubKeyOperator": "02d48f7bb5726f1eee252285383b4b7d4aa85c0859832e66f38983a4a769128185661193c3b890c35f809fd9c7b2b5bb", -"votingAddress": "3v8DfmL2NYXJ1QrYg89pCs4Npzb9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c2e7a456f7bcd6a07c9d94b3957666358aad35afd3ec9ad33692c27f322cd63e", -"confirmedHash": "b845cb366ea283e330d861bf5d982b9ec674112201f7d4330b00000000000000", -"service": "00000000000000000000ffff5fd8e666", -"pubKeyOperator": "950aae502cf77b9345485e35f9b53ee0427a2545a25451d47d0da918d24124f079918e211c8a07bdf91b3ff1b031553c", -"votingAddress": "2AMU4CQBa2XNfPGfAjSj98QJhXUQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c2f3bccd4841197470594ac4c79a1289b32cf553a2d1bd2a5f627dfb1dab6116", -"confirmedHash": "52502956d738ee41e8484c743823965a093550655a9f12991100000000000000", -"service": "00000000000000000000ffff92b9b3ca", -"pubKeyOperator": "173e5dea1b6912cf5cb2bc55d1aea98736de787dd1379743899669a1774f3025d72958a34ca95086e0824948ada109ab", -"votingAddress": "3D2N7sGprwLa76w7nap6uq44R6s2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c318cf6984a4edb4bcdce588284c7e058cf52d8b8f52a80186aa0c182a50d4ac", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96884ecb", -"pubKeyOperator": "03a09e975f6d4a5b214b5b3778cb680dc1b8ca66fa926ed69a133638998c6a4aee3e7c2b6e75411d76f2bc5d60af07b5", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c3213d7c651b1769a51e93b8d7c4953f9e67875587d2c1ff90f2047046b17c88", -"confirmedHash": "e8f9e4cb3e2e5cad2bb1e594fa88d8b6899d49370f3054851100000000000000", -"service": "00000000000000000000ffff0509c113", -"pubKeyOperator": "0c999de70d3024ac5b0b5ad53c5d7a5a74c4cfbf476122a017de8e74514ddce4eb2db32c011968410554ab556d474f81", -"votingAddress": "2tqmrx2oRUkASEkqzn7cgUcp9ZLA", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c369284bfa8960a2d5c16d7fac0ee11733d64bc1080232da6ec4d18ee608fa9b", -"confirmedHash": "d541d866dd91ecb430137a5fbf4fa1063fd35a067378fca72000000000000000", -"service": "00000000000000000000ffff03d347a9", -"pubKeyOperator": "9156ab0117f3fdeedd03e28cffd6dcb755cd7b954b146105268784c9976279512a46828637bbe449fb2abfcdfc498e2a", -"votingAddress": "4MSh8oR4oDQmB5tMqrkF7oP5Zbuf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c378498e6801bfe113b75c205c78edf5eb2dc6f15424273dab33c5141fef0383", -"confirmedHash": "11e67de627963b100a96d5825518281af8c9c75247d3f29f1100000000000000", -"service": "00000000000000000000ffff8b63ac05", -"pubKeyOperator": "0f9d45d32da4cfdcb65e36d51db82c2f10a59a3fa5afb3ff8468657cc933d6df1ef20d04b32f12a01c0351114258f38e", -"votingAddress": "4QGdH7tpEmzPdBYaYXax2ic7SuLf", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c37e8ea9f67b9f8553c5a9bdd61ed401aa04903be85c84ed2d9824e764edf6cd", -"confirmedHash": "825ff51efd7ed0fc1fc428520486adf4d7acec61b83d33cf0b00000000000000", -"service": "00000000000000000000ffff55d1f256", -"pubKeyOperator": "970a32304abbae577ac975048a496a78596183a86984c402d958fe5985dc6ead8e0fcf88b92503699b967e40056c6602", -"votingAddress": "2RyCPyNzYdojsv14WKzZ4k5f9iyi", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c387202431f526002c2cb42a867580cf5a762dde21915f9ae8d66442238cf38b", -"confirmedHash": "a9c4a7b037b73d2704f2ffa0211184535e1cdf944cf975410e00000000000000", -"service": "00000000000000000000ffff2e65c3e6", -"pubKeyOperator": "0af741440fbb7382b47b31433be23a911b41afe40a1fb8c9ebe22c6946b370d351e5cfa1db891a8a9f749e675c56f61e", -"votingAddress": "27jPaPcJzxMfiC3LsmkpwNj8ZC8h", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c38cc946802a2d732b95fa1d73e24920a7fe5a18497f14ef4a4c2dbec71b5ae7", -"confirmedHash": "d9d3e36f2146f325292c140570d2a642c1ec83574d6dcce50200000000000000", -"service": "00000000000000000000ffff41144622", -"pubKeyOperator": "0c3cd2a62cf315fb5c34615d8fda0d032d88de74d8100e85c4c07bb636ab609b699e1d593506eb160d4adfcd9f86dad8", -"votingAddress": "2G3vsmk9tHnvmUCCNMzFRQ7pGMAc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c393125f5fdd36e6a5549d8d7f811a15b3caae45b69ec12f932328b06610dcb1", -"confirmedHash": "c892ea4fefd95c776952548dc5aa12cba1a95a3103b084411c00000000000000", -"service": "00000000000000000000ffff03019ffd", -"pubKeyOperator": "141e23fd67b1ef003d01fdefbe67af0146739e3485f465f0b973088ce6cab08ea5b008d6ab9f0ad76514df46f7edbde1", -"votingAddress": "tQrTA5hSeByay1vdgvjdyMtMFgg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c39aff826b65f0b3e52fe26721dc15ada89ba56498c38afd5748933e698560fd", -"confirmedHash": "bbf7c3c06e2ea9f891ae0b919c34729d46da6d8870b3f3060f00000000000000", -"service": "00000000000000000000ffff95386d24", -"pubKeyOperator": "8384e89d76e23a6403f56030f34b10e4b9d2813d3bfe73c8ec92638b0229ec1951e956c68be86d3b2407903fb9532a98", -"votingAddress": "nM1p4H3x7Biy12dsrtUR8er6ANp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c3a2713526834cd1a465b1fa09db3e385fbd61523fd335cc16ce355d935d9ddb", -"confirmedHash": "8027e58d935037bcd93c6713a3e1ceed8226deda2c5573d31a00000000000000", -"service": "00000000000000000000ffff52d315b8", -"pubKeyOperator": "00a225768b92fa5bbe0a29dc4f4eac8b1ca7fc157c8c398d7ff9358e35ab71fea5dc7be34f8bd971ca33272295bcc0ec", -"votingAddress": "348QYveUZkhYKkJLzb1EhBr3aZ14", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c3a687c176cd30e01e6fddf98becc8a19eb24b58ac01c33c6d0aa94fecf4cd5a", -"confirmedHash": "22fe2a0485e0ecc0771e573f8e57550fca6573e062cf7a221b00000000000000", -"service": "00000000000000000000ffff05a17e07", -"pubKeyOperator": "0f9336c7a3e6318c2476a86903025e399cf0420a6e9aa9d1aa03b311cc343b01d51dcaa940205db81229f8fd272d4d73", -"votingAddress": "3rCdGxMrQCZpVZGkoVMa71H2N556", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c3aed9407c9b39ed9756d89b2c5bfc4cb0f6d16d2e19d32044007b0900ca3f67", -"confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", -"service": "00000000000000000000ffffd4186cf7", -"pubKeyOperator": "05635cc96fa48ca6237222a8bf2a7d467e7b3d9c9e9a1d6839f0365940f5695331a4432ff765b0f9fbb3565840a26a42", -"votingAddress": "BovVZhURrALZV7wjEPjXw7eaKKy", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c3b56f01d6c15b44ceab3c003e3cf9cac770811eaf68bcd1035d57441b02e72d", -"confirmedHash": "cdbeebc4a3580b1d894014dcafb37c7472a5131b33ac100e0100000000000000", -"service": "00000000000000000000ffff592fa09b", -"pubKeyOperator": "0026473ccdb7d656e30e909d3906542298151a40327a78e7fd0844cbb3c490bb08e868745a02781855ba42b75d9ede4d", -"votingAddress": "3SJBgorTk6LmD1FQyTGQNcXbASfN", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c3bb7d9aeab8974849a519b1e67a99d36466b743ca4b13cd155ff45134d1e3ca", -"confirmedHash": "54317e0f9638e80793cef6f500031972e70191d95967f51d2c00000000000000", -"service": "00000000000000000000ffff55d1f138", -"pubKeyOperator": "8ccef098e3bd942906ebf19e58a5022960018de619446459c515b1c6d294d07681e8c7d09458a7dc54c9c561e96a845d", -"votingAddress": "DHhcYspW2qzR3W23VFGVrvQqEVS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c3d378358464a16cc050ba1257128a2d0c870aed5839598a7211527ce52b1c86", -"confirmedHash": "c4633a130c4806b00c60ce0543643dad4bffa08bcd42d95a0c00000000000000", -"service": "00000000000000000000ffffb009d20e", -"pubKeyOperator": "15935b0419c40273877e132ef3c9fc6f661ffd04be329cf4c9b5d4034323d02e7e56bc1001ff29d59222de1dbf3cd960", -"votingAddress": "9uGyz654YQ6V1YaLtxH8SQkQaEG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c3e808e71cc125c7c2fbce9995e1f3f812da54d9cbca6686de17023c3f174461", -"confirmedHash": "06f810f80be78925514e3c241e44e082e959920a0fd8346b0300000000000000", -"service": "00000000000000000000ffff453d6be0", -"pubKeyOperator": "93c119570fb8f6217336c1baaff0cc3c1042843bae6057399359774f17cd4ac966a7bd6d75191e5d80c50bf8dca0f925", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c3f120b5ec51009acc8a526146802617d64d61f66675b653e82be08a540db6dc", -"confirmedHash": "3907ba73d32775b2e1d91a0015836b8d4b41f51be7be18171400000000000000", -"service": "00000000000000000000ffffb23fec6a", -"pubKeyOperator": "0d9e1a41f75f1f6f24060d8cf629c50b046ce56fe0bfe9d1afa5dc36cd22b5c2557e3146fafe8088ceef2b90c05916bb", -"votingAddress": "3KbprQhokGfYXdscwTevwhwuUdZ5", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c408221fce4242e7e76a72dcd749020299159a5ef9ca555e010d2d0ff5ad96ca", -"confirmedHash": "0d18fa86f9cec03ad82c5bdbf248d9a85d71ba13ffbc87320600000000000000", -"service": "00000000000000000000ffff52d31516", -"pubKeyOperator": "98e0eca7ffb4a5c43d970d94627ff1ee1e15b748b0e6e4bef58b2a4539288f1d19d4a20352b29a89e83e5ddaad5558f8", -"votingAddress": "6qXGePa7WoWEWePNGiqc4Y1Zg1L", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c4123b477dfa37097d9de6cddfa742ee256c87b93b349baaf8263064f51bb1c7", -"confirmedHash": "a62da66b98d15f43a2de812a9f0ff42e6f248d393f2d1a1f1800000000000000", -"service": "00000000000000000000ffff2e04d9f4", -"pubKeyOperator": "95fda0c1ba69360997f205027fe88936e8c2409127ddee8b5d153952974b5bf5b866edda9dede1ea701ca7ed140e42ab", -"votingAddress": "gExAPQoBtsV8nPYDgLcW5zKxsL5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c41809e62657f5e83ff0f4cd9aac7942a11e87896973f862b53e4e1575ac1d48", -"confirmedHash": "178db0208d5dbcf9dd983faf84666974ecf8b86f0ded4bd90f00000000000000", -"service": "00000000000000000000ffffa5166304", -"pubKeyOperator": "8cf10b800d0c53027d5462e8440cc1444f46ab580ddd4ceeef18e0e971aec6ed3060721ed4a750e88900bc04aa7599c4", -"votingAddress": "47T7RcqDouSU3MRgVEJCB5XEVt67", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c4271a9dd6d02aee3369a2da522ef64d8b1c26ac5fb6d264c01b53bb8f99e103", -"confirmedHash": "31dfdf11dae9a375283a684d0b88857b20cf7808760f84d40700000000000000", -"service": "00000000000000000000ffffb951a70d", -"pubKeyOperator": "0ff24b5b8e1f178f0845466eef113cea89682e0cc3472590437043d6bf00d8f72b06977daa9437d681ef536391c2add1", -"votingAddress": "3BpfeQCQ4GE7SYjUm6DK5sNrLFy5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c432c3ec21164489e27437c5966f41ef2c3f901365195343f9038fab2cccf9e9", -"confirmedHash": "1404d994518f5f1e5236fef3c9e7926184ab14c6aff33c4e1c00000000000000", -"service": "00000000000000000000ffff592fa01a", -"pubKeyOperator": "97e90621815fa98b62e0c644856b8a51b9886b81e21259e5468d1cfcca332b3fdc08ad4f2e35753269ab320500bc65d3", -"votingAddress": "xTLYyjRgaYHSaAFmK5iFikNstFZ", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c4424164c2c5ff91f44e4f1bd2f23c777938e1cccbaf68d2581cf2016f3b899b", -"confirmedHash": "17a667d95355eedc5070dd64048d2e3cbede2b87ea98172a0900000000000000", -"service": "00000000000000000000ffff3625c7ec", -"pubKeyOperator": "80019ea038772fdde3381ed817e1ba45f3d5fffa341778e4dfc46bfbbfc7e982fcb7fda44fd453bd2830a3f2426600fd", -"votingAddress": "1SRWsvRssX4JGrjTBmToJbpV97n", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c46753565e2afb596c64ac4959c8f208caeb760d3c67b6f02d6f66657991747d", -"confirmedHash": "33eb6522541bdf29a72b5fb370c5da44a458c85f535cc15b2400000000000000", -"service": "00000000000000000000ffffbc28e70a", -"pubKeyOperator": "8021dcf2cd6a65b8c99b91a85e2d6f4f7590a908c1b31913d9ed769fb875f045135140d30c70baf61d93185a386d5808", -"votingAddress": "2kw2w2CRheUknT4qnD5jjsE59t9c", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c4729e854a887453a97c2152ffdb38f4d4b5285792281fc09dccb9ebd90ef1c4", -"confirmedHash": "4a5df15417aa299a7c4b88dde0dca1cc21c634b56473f3321400000000000000", -"service": "00000000000000000000ffffbca605b3", -"pubKeyOperator": "0b11359c950e99239880598b0c68843085ac409ddbc7699244412c4e7d29a2d5e793ea1182943c5d2740b75b3098d662", -"votingAddress": "3DgYcbiE7EdhswG9f14hhrT4CBTT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c4737611b6c7b87e45293581ffd5ddcb329f6c6f1f7bf6faf815fa3d817a9dcb", -"confirmedHash": "56eb474b73b0a3867ddc8c79da70fd27925535061b3f96362500000000000000", -"service": "00000000000000000000ffff52d3195c", -"pubKeyOperator": "135a40bdd844419f6ae4947a19a3a16e0fea3ef0e25eced627c25b93616e1a28d5ff2c67a9f1bc8290c54c962df9e976", -"votingAddress": "3Kv4QNsoHXJrUFQcGCLMMwkwC827", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c48e7a98d792d997ecc54165520ed0cf120f35e903c2cb2d7b8f1ccbec6582d4", -"confirmedHash": "cac1de0a8ffa1c750ff892ac848c2e583fd528e40cd3b2360000000000000000", -"service": "00000000000000000000ffff2e04a260", -"pubKeyOperator": "999d132539c6918859ad505969ee740a268ee42008bfeccc441c41f06f384880dbc0992739ea7cb71d56b233790aedd7", -"votingAddress": "3XakCgotbpncXCXfefti3ZcXCsPZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c497b5e11426e4e03ccd11baac5966b87d59852cce3c4e828be21f58befeeb40", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff84919117", -"pubKeyOperator": "128f90ac3db65b27594f7f1fad59249d75214bf25b543b75b34b28b830eabcf2f1f191b578eeffaa55e740d46bb30189", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c4a41b8f17ccb4cb661bc843dfe6332cedacb4da8b4c2153707a6ad68c1f0d1b", -"confirmedHash": "ec635f6c430962ad02082674c15cd36348c617b8935201da0900000000000000", -"service": "00000000000000000000ffffa8eb55f1", -"pubKeyOperator": "92c40af38ae4ace7d9c0aec4847b19d30e3f76684d117732d2560a4335786993b4125f700b5b69da4de38d977db70f53", -"votingAddress": "dH7H8eLJnMsX7aqvNEeVi5hzt1W", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c4a66954c75d96ade565d554b835836e911ac8dddb997cf3b1a7c24827038713", -"confirmedHash": "db3537ce759f8354d1933e24423b85281046a522c7a95c9b2100000000000000", -"service": "00000000000000000000ffffc11d386c", -"pubKeyOperator": "16095b1a2e9cd1a9d1d459251977e90533d7ef11766880279b57651718026d7428d6961d2cb2b669da89a8bfb24e74db", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c4a930d93f80191f65278b297c9c6448ae0bd7a4553bb3f9bbfbfe1b2f67a029", -"confirmedHash": "15409eee633be949ac015f328e434352d470299d9f6413141100000000000000", -"service": "00000000000000000000ffff55d1f23b", -"pubKeyOperator": "87ad5f9b4a281a092eebdcff454bd821aff140dc5727d478ae1328057540b61cb8bd98ec05528311346d9f64052a9b8d", -"votingAddress": "pnZBNzMibfnZuTvYhYpWeMcNKiN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c4b374875e523bb2968ba748ae569eeb532a998a8647f641f5e5e4c9141da12a", -"confirmedHash": "2314096ef49c237f6606b31ecaff2b853759efc5bb122bc52900000000000000", -"service": "00000000000000000000ffff9f5971ca", -"pubKeyOperator": "8b8e4eb655a930f9fd22e68a8d985631659d06f3465ae0ecec620622fbf78833467ebeb3e1c5aad6da0b3ad14b3f5b1b", -"votingAddress": "4B1yddNQ1956miarwXc7FBVJDCPy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c4b49620d3f98b34609aa758768ce3e904ce45d01f2c934ffe30a79d2bf6fe87", -"confirmedHash": "4276e260a8babc36ddb1375640bef8f86b6d08bf4e02c1e60f00000000000000", -"service": "00000000000000000000ffff45a4cf3d", -"pubKeyOperator": "8245f108ad3e2d003b5a66a5bbdbed403145abb02d4c87087c983fe5182c2735efb1f4b5af250558466f65075cdc1f33", -"votingAddress": "uWMopxcDXFNkCXpJhCqBbK3VYUy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c5016e612c345b60a39f22a44cc2f5d05baf6d7adf85dbccefd91e534fa4844d", -"confirmedHash": "e7f8740520dcfe0ca2b29c2ad2bd90c963269cbd19149f630500000000000000", -"service": "00000000000000000000ffff905b7fa6", -"pubKeyOperator": "11820f1af19de9438d632512d512b007148b12250455a46b2ef5023106db3bb29eb02b6cf56a4466420c76c276530e25", -"votingAddress": "45Qm1U2W3DWDG1NPdvSJ5xHrvr7N", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c50cd951e30e591b89f6f7001ce845a472a61014779811166da10563bfdac439", -"confirmedHash": "e9babebda286e2624e9ba828607a4cf0c91eaac599000b3b0200000000000000", -"service": "00000000000000000000ffff9df54ab8", -"pubKeyOperator": "09d2c99d136556a2e7fe3f2a4757d196b365a2669fc10edd6fd6b2528440838c8d6e3a1e2f2155478dde02e6b3755b01", -"votingAddress": "3R7D7GxYzKhpnDXm93PMwkjkLDyY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c513cbba4ce87b6f70e57ab917f9f3f2cbf8c27ea608a04bac48c260b7759d02", -"confirmedHash": "31580715034740dedf4c6cc1199883578964dbc6c3c861132700000000000000", -"service": "00000000000000000000ffff36270a62", -"pubKeyOperator": "8e6b6717dd7f7109ed37a2ee4e6885ccc27c8a588c33eea400882857b2f9e0f5928393e161ceeb59754a914252dc57b4", -"votingAddress": "25PtNbZRdTEqczmxCFFQszW9LWJd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c54297da1882365fb010cf69089feb4a4b03818c6d6edb43f9f764884b0bc41e", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffff80c74b51", -"pubKeyOperator": "86760997ea6eaaf5aafed83570f82dca989f588884798154649f249e8c1b182def2d00fc1ab9097fdb3349f817a4724a", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c547219ad8d9f0f3aad79a82291c3cce0007cf22fe735651648e1f7f141efe3c", -"confirmedHash": "e1800901288817f4b34e75663527c94d9a1676c4c4eca9263100000000000000", -"service": "00000000000000000000ffff52d3155d", -"pubKeyOperator": "92ba297f9ac7bce90b43a745437f5cc393195fa3e2331c5af1b94b0d44272362a05e24ee13741a591956aaaeb89bce82", -"votingAddress": "4PqksVVmyqerDV4rrFSji4q4FtYt", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1760248 -},{ -"proRegTxHash": "c5493c72b0a9cbd568e8c45564366f781a02982c09e6703e907091a4350c9d95", -"confirmedHash": "ca7e56406845e9dd508141f6a43276d412a2a8e0a9aa5f960b00000000000000", -"service": "00000000000000000000ffff52d3154b", -"pubKeyOperator": "8bbf66826636558d315fc6c42887624bff805e0d042bd7046799ae34c711b824c263502044a7d1dbcd3a3fdf75d23a3c", -"votingAddress": "3FvXYhDnvpwUx7pUG6ACoKp5LHgV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c54f034490adf80da96a35713ea7f8f52c2b1a6bf84fc8c39e56d6151a56afd8", -"confirmedHash": "9c22eeeb389f9558040b02d0ab619cc71e1d09dd74f276151d00000000000000", -"service": "00000000000000000000ffffbc28e704", -"pubKeyOperator": "94f79f0167e904ef130639e793ad191bffff79f410f89a8fc65c141a9a16f5e48314fdf1e10ab76979d79f8a5203abfd", -"votingAddress": "kQiUcWpKiL4QYpSpoRv9jJFZ5Cd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c577d7c951cebfa2b0f9e9a5f832959fc60bdcf746974268aa1e69f21f7d9bc0", -"confirmedHash": "43f47442d6a4ba8a1f5297bcf1cb5a65eaab3fb63c1156490e00000000000000", -"service": "00000000000000000000ffffd4813f26", -"pubKeyOperator": "026de5a2ceaaaf5cd3b89d67b2baf6097944549895a8bf7d13a011587d3beb3e05f1f94735da1116bca5b80d8828f79e", -"votingAddress": "f7XURSVZvnyLf8DRPLTPsKDHfuk", -"isValid": false, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c5936fa7501127bfbdce35a3c14b2eb95f9128ace8af54339ecd4d348008a308", -"confirmedHash": "abb61c49bdf891abfc384c94052e246638012058ad1002241600000000000000", -"service": "00000000000000000000ffff88f37387", -"pubKeyOperator": "111fe05542f047b6dcb270d49b6cf7bb8e159af2ce8870117458f73f421879f127091008ffa5ada8541c35c249e5126a", -"votingAddress": "23CbUjMFgn5nhNzrSwWx4Wqwagb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c5b4809e101bc55fcb48f586c2959aa368f222126766fc5526afbf5ef578b34a", -"confirmedHash": "7aee39311ef01bb309e5c9c3fbf0ba8f10080084b8f14dbb0200000000000000", -"service": "00000000000000000000ffffc2b64b88", -"pubKeyOperator": "86ce58a515bf4b115bee6fabfbd43ce82014baa96e80caf55327c16509e542808521913d31830a1b784a5f9cebe78859", -"votingAddress": "CDpYFjsrc2kSYaUZzmDgpRKmyPu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c5ed02ad5c1e540a0a7ec48a33722a8c9ac0cfbe9884e737f38f749449ba8b63", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffff80c79e04", -"pubKeyOperator": "12931488e490cafae2e8446ca9304d4e3a040f4a5fac4b0824630d587e247237a27b82b57f0d6e4a545175be1f372698", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c5f987a5dc0d7432f75cc4426025cdf6e752f9782d76cc61530c361e05de6f75", -"confirmedHash": "636f43a19b0f15b36cec06fb2fcb9087031110cb695f311b1100000000000000", -"service": "00000000000000000000ffffc0a90657", -"pubKeyOperator": "86a792124c063eee2a2813bde9dd185eb934276ec9f9634c424685c225aebd5d6551564221e2ac418ba31631212fe98b", -"votingAddress": "25AeKPhJNg77CPKqAKKfqpDLcpX8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c61a9d05cfb09df0b2e1984c5f105e13203042158828fe1cac0d178b2eb4454f", -"confirmedHash": "32c5be379f3a6d875f40d83a83f3a8219680a17289fb096b1800000000000000", -"service": "00000000000000000000ffff2d55756d", -"pubKeyOperator": "90f8a3838241ebd9740f90cfe084f6cd028b7b3d18dc599902bb5fdece9266e70a6a62f2cf3ddf95bf9ed769883ddb31", -"votingAddress": "3cwYaTjmMAxNWREfDMA38cJ3saH2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c61becbf7c0ea85de11686dca4bf25de17e558d7daf60d9a7aba4f74d1d86f48", -"confirmedHash": "7dc5131af526fcc09e0f37f5d2a8b651acb86afa141e05ef0d00000000000000", -"service": "00000000000000000000ffff2d56a37f", -"pubKeyOperator": "883a085a67e01ec5fe3761e07ace2c55db6698465a7dc03f0e64ed54c782fdfa045d9052881b83800acb028fca9f36fb", -"votingAddress": "4K4CRRv1wPqQR9e7co1i9vjGqUCu", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "c61cc60706d09ac93d47c9d7ed6e4d2157774b09770cdff45be02cbe86420812", -"confirmedHash": "392a6651b0121f2a18afe461f6d45df496df2e81a06eda650a00000000000000", -"service": "00000000000000000000ffffb951a53f", -"pubKeyOperator": "1683b17d82e4889eff360b5dba28321e0f90c7b6eca5f752cd8be55e5c8bb0fb9ae2568ce3b902e42e81843544dc8018", -"votingAddress": "2GmaUzBmUxpDYLiaUJ4cx1CBhNdM", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c6258e7cf8e5b1140ccf14ca89b747b01dd9915ecf32f4bc6cee895b1803e5e8", -"confirmedHash": "679e32677c876032d14954ae3209314292cf57c37491077c0900000000000000", -"service": "00000000000000000000ffffa8775007", -"pubKeyOperator": "82e13971c6b3d19b0fb7e204689e2689d5f793c15e0e29b8b9447c1ef7a9b194bb7cebdb1e2b7c3e9372cd710f6a7158", -"votingAddress": "ahHw3FLJsFEAn4fusLwzbPHzGzh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c63885d3230f5c7d433141c1229d4eb10d3819f198ceda2fd2407a5ab3cecec1", -"confirmedHash": "f9393c9c05e71e5738e3abcd7eda0f3ee40f88870dd28d841000000000000000", -"service": "00000000000000000000ffff9df5453a", -"pubKeyOperator": "902d868ed84654f0182761a00b45cf637696027caaab99fabbfe32673368cde7508a185988a739f72ef1ee1e222f7752", -"votingAddress": "5fo6wsar6WqNfdBsQ2uXhAf4DEz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c6416fa09ee4f12064cf15156607ca2676fff25f6f0853e6afd6d7f563b522d5", -"confirmedHash": "d4d6cabead7ddbfd03c09cb5d38f89bfe8fcc4be61b955d71c00000000000000", -"service": "00000000000000000000ffff68eeb121", -"pubKeyOperator": "03352c3615f1daa6a09405767570f89f19e8c58b2422ffe291f0b10587f1b490a05e65d842afa328838c8ff7b213f41a", -"votingAddress": "4dyYsrXp4JyBRh7fHvp6GKd1XjR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c64f4814e6055d91dbedbdb908b2e8eea1eabe514e4023f8e2fe714654f7a6d9", -"confirmedHash": "f8f6aa34b0c1a353a33fb563c32644a660b2096bf80fe1220900000000000000", -"service": "00000000000000000000ffffbc28a302", -"pubKeyOperator": "05c3c84c3ba97f186b454882eefc16ebaff748caf5d3b5051ebb7302fd5448d83e3929f2ef697f6e0d7dda4d643ea8bf", -"votingAddress": "N8D3MKWGti3r21RXa186VpMXctQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c6558ba756941ef9d4b0c4fe75232da782d4dd7d616266545146457bb82bf98e", -"confirmedHash": "792e7485055a8c799c7bbc07ccc5e4eb38f121326be067d92200000000000000", -"service": "00000000000000000000ffffb23ee220", -"pubKeyOperator": "05ac24fdaafd242b7d784c442aa08aae4ac9b121ae9793a9f029d277c4db98e64955c92b323eeaeef146e5d26952a99d", -"votingAddress": "3mgUGzXdhfCkNpdPCF8KREmww5Yt", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "c65c7649e570654d1efafe4b9c0d5b920644eaf34703757769e780a03d0b8822", -"confirmedHash": "8e8f4eb97b63967c51e53886c1cec87b6a7bb7275533231c4300000000000000", -"service": "00000000000000000000ffff2f6e046d", -"pubKeyOperator": "1715f1c9126792a54504ffc83127c7f03797ec8f0999c72b370f6a257bdeb76f48e7219e207ea4fc04eb8cc7de99dd05", -"votingAddress": "GSeFi9o3vBojBXcgPZCGPF33b3g", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "c67f351952bb3eda335b9ae72547e03985e41c177da109fbb5d48bb20f31e217", -"confirmedHash": "b4d03025e4f6bd73f89633e008bc6b586315551da906f29d1c00000000000000", -"service": "00000000000000000000ffffb23e8032", -"pubKeyOperator": "1948d392912320b0636748999a2c2e64615e0587711553123a013089d369501ca9353d0c05732ba18dfa2952043ffa1a", -"votingAddress": "3PGifdKw6syRJ9JCey1MzxCCM4Kq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c68860d5b570d6ccfa7907a3dd6788c86dd3eda68443da31b65da244ec0823b9", -"confirmedHash": "3c40422b8eba051031e2c044745f28a634914a46bfd2ce201600000000000000", -"service": "00000000000000000000ffffbc28e718", -"pubKeyOperator": "8e2fe44a60d6f7a8a8be22cd1356f27343c669aaeb23de43a97b5631d842034dd2983ee3d2aef6b0ba8a131e66d69d26", -"votingAddress": "qH4wmGfUpbHEhqTQ2ZLn4Pq21ee", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c692806d1bf16d685172b496a430203a2a138367047c0226ed8a469001f934ec", -"confirmedHash": "0cfb317980922dd907501f332fe630e70e11da96457434d41400000000000000", -"service": "00000000000000000000ffff05b5ca2f", -"pubKeyOperator": "109931166a4cccf85f7fd58a98138b9f7004767c26f9f48964817e75b4b46200c7cb00f64b1668982508ede2e9797dea", -"votingAddress": "2MPxP7AD1bZ24Vzd8XLCpR4oRT6G", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c692df869f78e733473c607a2cd26653f60ef67d03ae4ff2c8d8beb158bcf6eb", -"confirmedHash": "716607dcc2024f4d671964af327f1737e61f96ef101d5f132100000000000000", -"service": "00000000000000000000ffff3e4d9d87", -"pubKeyOperator": "92e95079b572beb3ee66e65f2b0fe3cd8468805228b33f9ffa687c4666353ed5ad4e47eba130ca246c7cc42373cf0b79", -"votingAddress": "D7giiDhiCbCduP42MQAMSFYa31M", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c6a928a67e14a7e7c3fbac9dc9d1ab882ba3c2ca848ceb91d572ffef41d25bed", -"confirmedHash": "02c1cf11a6c0cfe503da074c32f1c1f45fa8ab21aabd72720000000000000000", -"service": "00000000000000000000ffffcab6695f", -"pubKeyOperator": "17ce83abd8254cc965a97aecfae7133dde5d5e7c51d7dca4094bc9f63b6dbce846e5b4c682ea6efecb235d623077db27", -"votingAddress": "38URK7oxJg6qUeLAAMTu3BgL2dSq", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c6b0d5a734f95b4b4fe9c174ad351cc261db0e5c038adac7e47013bec48264ff", -"confirmedHash": "80591cd31e93b0f5a8bef612e9a729f06aec959c121dd1360b00000000000000", -"service": "00000000000000000000ffff58630b01", -"pubKeyOperator": "0a5baeafe7f1a57efbdfd649765699dbb5a2f9874ca6f85bf4460bbff208eddc7ed26a8cff55f5e079935ceee9c85308", -"votingAddress": "28i4oF2R75LG54xUy63Dy45oqZ5u", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c6b23489f32afb601d64316348d21a4ed211c1dfc54a41df38ebe9b7ddf20a2d", -"confirmedHash": "0466836740481df381aebafccf63b9738cd756311b9de9b01000000000000000", -"service": "00000000000000000000ffffb9453549", -"pubKeyOperator": "18414acbe920fbfc67453ef055b6863e4a727c30564b13041eac509a9865dcc4f2eec63cba3a95c8974a437a91d19560", -"votingAddress": "2tq1aQMP3vsVG9g1yvpTtapxPqNC", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c6b772b6c59ce2c84f3813cbfa9c256e14ffad0c4d46b8cecb3b52a5a8406db4", -"confirmedHash": "c8cfd5fa851a786fcf6a0fa04ecb750ad7737e1ebbc654ab1100000000000000", -"service": "00000000000000000000ffff55d1f282", -"pubKeyOperator": "8003d0ae963a976ff9918d9cf43734a8265abfb10d99d68b0ef1bfb11877f0a41ae74953d1dd780f5155a5682a570898", -"votingAddress": "2TA9MGLyfpQZiLU1g3TLUZJUzgJk", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c6bd78b67d44876305e62ab6ea7af44ca3baaa4d5e7f934da4fee6574777a412", -"confirmedHash": "8e45bf03c8478990f4f9a896ebb87caf17377492b443b4290300000000000000", -"service": "00000000000000000000ffff52d315ce", -"pubKeyOperator": "824f2cd76c3bcde385910d875f2965ddbe6f9f2271771d61ab2a51001d82da7835d4e5dce177ed24257789c08e91640c", -"votingAddress": "2Pd6tAbGj1n9tmNuZEZevV9vZiH2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c6bf8dcfa5b24bb405f15f9bde8ae9aa364d6668aa52e6e98bd36a4f05d3108b", -"confirmedHash": "cb8ca0d926213dc7caef369c925041c695a723f0d8f46ab51000000000000000", -"service": "00000000000000000000ffff2e04d9fb", -"pubKeyOperator": "83ad1cb271216141b0a66a6db8627c2055f3c8e344d51cdea36bd2dd0bfdec3a80e7cabb3e61163d6067d822b300eba8", -"votingAddress": "4DsPCaKGCGCn9XPbYbVxP24ezRix", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c6d116c40fd951b9d2b73f5dc594cd901ae6e2c1d678dccba634a39e5cda76a4", -"confirmedHash": "eb1ddc9d22ab0f1a8792240f695daae51c37cbe0b8d80c1f1a00000000000000", -"service": "00000000000000000000ffffc0f8b0a0", -"pubKeyOperator": "006c904a63593b64a548a67ddb6ca82a746e07319b135fedab88fcbf416ffc02fb84600513d76534d76bf5819ceb35e8", -"votingAddress": "47NzgfR8ci5Drf4JgDVGKeusBkxp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c6d46898b5b8f05e0bcfb414a98fec3b5782881affa74089fbd6be990bd57f3a", -"confirmedHash": "a040f70d86919cf216e6f353b3534e7122524e5ed0f38b412800000000000000", -"service": "00000000000000000000ffffc2875b1d", -"pubKeyOperator": "0d8c32551c50fbdbfbb6df3f3ccdacba9f1e028fd994588ea4add23f2704a9d8cceb34bf7f29ada21ec59a489aeabfd8", -"votingAddress": "2JhtSHWXCxRkeRHWMNrsxupYJmKq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c6e387ba07a71a64946df2516bb74d3eac6ce6e1086fe7cc4d1fb7e733426864", -"confirmedHash": "94a634282151a2762a03be6539e0da50fe2e62839ed23d6e2100000000000000", -"service": "00000000000000000000ffff2f624260", -"pubKeyOperator": "956c56c1ee906d24b6010c676c01ffc25c257ba3f5bca690835583fa9234d8efabca8f14dd9e02e0d65b0ffb4c0401d7", -"votingAddress": "SzNmR4fPiFoYkuUavKdq6PLWsxE", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "c6ecf10ad0d4c6b129c388c4b006574543ffd5cc207bb7211b0ce91173ae99ee", -"confirmedHash": "491c506eec8238a9b841aad159f0072805127270d97aea691100000000000000", -"service": "00000000000000000000ffffac691515", -"pubKeyOperator": "18070fd83caca402cc4cc26ecb9b2eb72f3979fba63db849fef91ad7eee26fd5aaec5ef46dca9375517222e720cf48ea", -"votingAddress": "CW6v4z9aY7p8VeSs2kZGmDq7ern", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c70dc1219c6d7abcfd59cff16d3fa63e8cf5a265a4a736ab15c3bf157ecd6fa6", -"confirmedHash": "1b4184d90b2da6eee4937ebde19f3c037fcde70db7c6c0bc0700000000000000", -"service": "00000000000000000000ffff688309d7", -"pubKeyOperator": "14a18b2cbc6dcf41374ebad86db721b9868338003f4cc35abbef9e8485c57ebb06ee43253eb12035aa8fe9626f805d07", -"votingAddress": "qQ5C5NWFNYPquY3X5UKbRnPYi9y", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "c7286590eb52a08d1b11d85b1fbcf705081f22b360901f47df1105f32547fb1b", -"confirmedHash": "da43ae173edaf99fef186791004da1d26b4f0d169bb15b771300000000000000", -"service": "00000000000000000000ffff55d1f22e", -"pubKeyOperator": "8a66f2dfa7ae5c4a27e1aa83a5470fbccd68d1860be2783316b944398f87b871e8da6897ab8c1a4475673254694ace93", -"votingAddress": "3bpJw4MrDj6PQcuExRChcqHzpeh", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c72a7e16455d6d8c8ea7a5fb67fa1dcf6e526a937e9965078118a1980404fb3a", -"confirmedHash": "01fbeee3b52af22cd62f7d2bb4e1c57eb9f65016d6738d7f0200000000000000", -"service": "00000000000000000000ffff55d1f28a", -"pubKeyOperator": "0d6d7534c4c23dfe2e961d0b90261b0be5e5f36a210b7be4a91dbab4cf55e50e2a39d3ddc6488b1f5d58a7219a6348b2", -"votingAddress": "xC62iyxurkJUdUBBRd3XuuAQbLn", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c73b5e5baa66bff102d8482d6caa3611bde8905e1c12d115ff94e247245fe814", -"confirmedHash": "218b67c8b120b8159271c0062aad57d1f4bda8f4507c65e21900000000000000", -"service": "00000000000000000000ffffac685af9", -"pubKeyOperator": "18c315f500fc82b7f5814694bb31e2b59f706358d88e0fcdf1758c85d8077fe447b171615a4d684806e6efd9c51b229c", -"votingAddress": "V3bSqNoWJ2Gd9JVZxerkaoPBZ7M", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c7409ab93431ab656c0532b69f5c82b75d4c6617dd1672169fc8bf0e1dfdaa34", -"confirmedHash": "a26dc300d061e7e42266c92bf2e7163df76b4812333729b40600000000000000", -"service": "00000000000000000000ffffb23fec6d", -"pubKeyOperator": "05157ff9099407426cfc0600c3f3b475e1904082a6787b912676b6c3af20e0608e995ded615907fb51c8e6b77ef9c325", -"votingAddress": "Mbq2mYYJ5qG7qqcriBzi5DnQMeS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c7a1874987f0e5daa843cc754c8520e339509728824d1537b10c373e6ed2dd39", -"confirmedHash": "78e832b31093826b7107572ed5c9a9beadb92e77b6fdd1a40a00000000000000", -"service": "00000000000000000000ffff2d211624", -"pubKeyOperator": "0218fd1df55c117d7cbbbe7d5534dfde5aee6dfc25051b313e8b2ee329ab210a7a0b497a237724bd64ee66bbdf6c778a", -"votingAddress": "43VRseB2EiZtJbuF4cnncf5CzPyB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c7a41f4bfc062f25490a9e54d01bd46bf337696d64b917f4abd3345cf1f04f12", -"confirmedHash": "17d4a07c092888400f80b97491904fd7b136d07d47e7223f2200000000000000", -"service": "00000000000000000000ffffa5e3f07f", -"pubKeyOperator": "0413fbfc3e4d16cabab735194e5e3a851f3e3e4664f349e9c41118b838453b79c0736444cf05ace86867f2c6caa6cb43", -"votingAddress": "2W1JK5q5yh1Hvq7nASpRQLDemVKn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c7a9da428d0a35acb099b391ae16b89fb476bce2ab65197992957810cae49da4", -"confirmedHash": "741f1fcb39adb524db7569e5d3392314d45dd3772e37dc9c0700000000000000", -"service": "00000000000000000000ffff86d1b77b", -"pubKeyOperator": "8daa6657c46359986cf86576c85e11e6625e361d2296bccc9e3791ee56311006d2ec88a0f8ede0b96333357efe11063f", -"votingAddress": "PPSgQyRorSK7ahiu8AYp8QfdBvd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c7dc08177ff574de485f53033728e31156dc6aa009f646fe4801e99d653eef11", -"confirmedHash": "f4ac87e59d7042e134390ab9ab4d5e0d2e7ded03af7638d21600000000000000", -"service": "00000000000000000000ffff2d4f1b8e", -"pubKeyOperator": "91c6bb97621b71419539818e3bfc3362bc152621e4fd4958eb3b3446672474df1ac0df314e6dbddacbf2076b4d53130f", -"votingAddress": "4B66SLA36Em5oiSha3HJZHdzFCoX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c7df8d5aa07707f016948cc9d3eabc6b0bc8f453fff350e0264a16fa113d51a4", -"confirmedHash": "7d3cf2d675690981a689072dca56c7c076fffa4c16d274071b00000000000000", -"service": "00000000000000000000ffff4e2f1387", -"pubKeyOperator": "865bc562957a1596cfbde13bd70612ccbad3da974b9976675fc624e1901e7bb33277814fa52d0cd18f2a3efa66293c93", -"votingAddress": "Kffi4uuq6kfsX11Mz8wJZggm4Jn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c7e1dd1f49ad5d86e7579c3ff3ee0acfa7df901f26fee4bc19ed4f1ea8fccd99", -"confirmedHash": "96bb8c1fdb7d475eca88967c0685368c89ad6fb9d73baa320100000000000000", -"service": "00000000000000000000ffffd4813fc2", -"pubKeyOperator": "8647f609c4d9a35da1c262531abaf99022dfec3bd6bdd379265f7674b2e314fc1bef866290f19f87edbb6714b3715d49", -"votingAddress": "3zLeJZpKbqP39JZR594vXjboLBnE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c7e3e5b98fc775986a31eb0fa4c010502245b798628ee36073aeb2cd36c4af87", -"confirmedHash": "abf4fc8ba0d4d2713c316b981351e29e0c75bbde504b4d4f0e00000000000000", -"service": "00000000000000000000ffff3449b676", -"pubKeyOperator": "119ad50b870527b7bb063fdf1ff5c59e93045d951d7dc67574762901455ec12523510732b79201d177b1519ffd9e5a42", -"votingAddress": "3b2sP651NgLVivy2WTwodZy2d2V5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c7ef2f1795e2b1e4ebe66ff2152294ace7b677cc304b1c3b9d90b74634bd3962", -"confirmedHash": "c438d7e4f19f1b1f98a929cfd6c546d8244901a91ce496c01200000000000000", -"service": "00000000000000000000ffffa8775002", -"pubKeyOperator": "962f5eb3cf8845aa025088c171ae5dae648c0926bcbdd62090f6ebe0ee29c55a5b37f5d1494736061729f165296bd43f", -"votingAddress": "3fqDCP5Sce1ruEr7FhTCRV4K6fqP", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c7fe3b993cb5b138351bd46aece95de692d8c9dcbc7826f3aa0b26c7f3aaed19", -"confirmedHash": "7d1dc4db1172dc8570254f92327b156712724ef4496818b80f00000000000000", -"service": "00000000000000000000ffff2e04d9e4", -"pubKeyOperator": "17f89cfc141a0f5326fb804efe0bf3693f6281e06ef51c908db1d81094577d7cd734aade70766cc45f433efb8d397601", -"votingAddress": "3u3n87u9dazCTXjxvPm8Ag4qZ8Ve", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c800f1a9f772b3e9912c5431cb304a4fee03d7232ca062abcfde6f6376038b01", -"confirmedHash": "c72ca5eae961f97e5856bf2580c435aeda0904fc4026b2d51a00000000000000", -"service": "00000000000000000000ffff9f413bf4", -"pubKeyOperator": "94540e1aeccb7d7a7fef992e73935baf67a0f7c32bf9b7cdcca9d26b3a8e65cec1c8fd9ded6e7273280d7e9d8f06ee9a", -"votingAddress": "3hkbhwnvd63ctNcDCy3MEkg5wEaA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c8064ea9cf12b02b73d5e786213c658d670dd29ea179413ee1a28c06607623a6", -"confirmedHash": "2492ea3b729d90f88b5f842cc4991378f8944e4375a696250000000000000000", -"service": "00000000000000000000ffffbc28be37", -"pubKeyOperator": "14af3978b5ebbca357feaeaf936708d7a99d7698e0a1309bb1e99fc9274659ffac55c8da8e83f1ad76d176c7f83ad4a4", -"votingAddress": "49t1p6oYA1cq86ia5JvEAYEi4GLr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c809c5abe9f96212c4aaf801c886550d382e3807f20db6883db14960faf174cf", -"confirmedHash": "ab2c38a7dbbfd122777dc31eab0f33187a760579985809181300000000000000", -"service": "00000000000000000000ffffb23ea612", -"pubKeyOperator": "054447bea5723e76328040f50b74897e6b34a2b28fe547675a3b068553f3536771f0af89069455d69d1850192a7b193a", -"votingAddress": "34Hfimq9uFYifJxoD7FDJbrhUZpr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c821963bfd416d5e7f2bd4c9a44d84dac896bc727a261094531a2bd60349ee90", -"confirmedHash": "a729a0ed3e666fdf4f620de5b976c2af9deb68054be7e41f0100000000000000", -"service": "00000000000000000000ffff05bdfde6", -"pubKeyOperator": "00bcb734d66fad073feedb8dd41b6ab386eaad509631e417419b02e9159bc5c183b7c1c8862fc2fb6f09a9d5cc8d645c", -"votingAddress": "3HxgprXQocbnchUkYAfQ2cfYCyqG", -"isValid": true, -"updateHeight": 1760592, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c822d376e9342b8ee34306dd50b570f78f65c5cb108c104e8b9396dc3cc9e73a", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d52ea0", -"pubKeyOperator": "836ee8e039fe69ad6154c3a338ff5ce1d3094fbd2de2f517b79ac7eedb413d5e490d66167812588167e5f00ea6273ef5", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c83b726cdf4e1568d076658de511000b182cae2cab060eb73b31d9e6982a0e0d", -"confirmedHash": "eff04ca2204de90ea4ef053e0553c0efda5f8ae1a5c025c80c00000000000000", -"service": "00000000000000000000ffff2e04d9f2", -"pubKeyOperator": "993b0b43e584ca5a6c961b53adb79f0af30d6eba3e445ff406c647ac1bd445d3ca3d9a50978907b1f33c2276169c8f47", -"votingAddress": "vnAR7NyqTfcmmVabGDuqe8kJz6h", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c83e99762485a4102563a029e6d1d934e04a56a469837b927224fca98e70d1ac", -"confirmedHash": "7354e0b754590a6f368930952fb51e38cf1a724019cb24520b00000000000000", -"service": "00000000000000000000ffffd41865aa", -"pubKeyOperator": "0f47ecec2079ea4c3efc1f6e3f753056ed2761610d5a18f4007a67d82d38231a1c2645a081e3f26a349717b54d9e1900", -"votingAddress": "3krbv2cUfyZJbd789ei9N6aZCUkc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c843c0a8d05883c4dde1a306cfddfec0e871fc2bacb9399af2664c9ba85b8d4a", -"confirmedHash": "02890514e43c27f714f2741fda07c2b4be2128fb89315d152200000000000000", -"service": "00000000000000000000ffff89b8a0c5", -"pubKeyOperator": "93d6f16676e57c4b677efb04eaba1072d74b65f963f5251c941300dedf0db88894d3f92ecd662c7671f1108dc771501f", -"votingAddress": "Jo2LY5Qq1QRMUhdAdqLzfzcM58D", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c84cc21bac9145cb89990b86128462238475c8012d96df91a6ddad266849eb85", -"confirmedHash": "d591ef5e91d38bf4165b7dcd0383e309de3cc1579acb2bf10800000000000000", -"service": "00000000000000000000ffffb905378b", -"pubKeyOperator": "0a9f5212745d6b5e202fc859657ee413348a692c409124a22551d78a86c7ddfa261f75c9f1781d3e43283072c6c603a9", -"votingAddress": "rVjaMcZzP9AUiUspbMFUFSmnask", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c856c606c2227689f1024824ad32099db5617395dbcf8475d885d5447f611de3", -"confirmedHash": "a646f8c8e895c2d292c12ae6710537b55732e8f51bf59cd90500000000000000", -"service": "00000000000000000000ffff50d3dd8b", -"pubKeyOperator": "0deed07c91102156faed7674e278b5940a05990aba7b487595182717dab4cad1f65e0cee6893d2e570115f0f405b382f", -"votingAddress": "46qcnEJFAxnpfqtPgsQQBHH7nP2h", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c8827337b81a9dca64ef7ed98a5ecf15ebf1bb4931e8c72f7ef668ff5a8a9f81", -"confirmedHash": "d103aa45a2f5b965b73bac6caec3c73508cc3a2a188e083f1300000000000000", -"service": "00000000000000000000ffff327409fd", -"pubKeyOperator": "16ad3bbbde95a6f23fc72b1f6a243b37bdfb09675e8e805c43e6bfec8073bbd217c30dd11673f1f59b5a688322594071", -"votingAddress": "3TRdX81JV7DzsN8KfUSm1Jq6E8S8", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c882bb971b49b6345206fbc2a1b7f81eb2fddfb1399bd03a5a5303f26dbb481c", -"confirmedHash": "2762075589a7a5cd19fdbcca2c5dfb68cd86d630137cce340900000000000000", -"service": "00000000000000000000ffff50f01dc1", -"pubKeyOperator": "0916b53091719bed602ded3dfad60b6f3c6615d32b37322dad7ecd2d235c8a50fbaa74993790a339a90f14a9d61cef2d", -"votingAddress": "3vuyEC3gBKAGbMUmGekFBVKpBgsr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c8864e8c20278b26bf069821240ea9344beea9b965184fae8d80cb77b2f05ebc", -"confirmedHash": "478fd5c93be6c1d1b4bbad510d1e63e9c2118724d506ce6e1300000000000000", -"service": "00000000000000000000ffffbc28b481", -"pubKeyOperator": "8f82ef9890b22c894c5ddfa4222cbf048b3c557cfaf869757ac4c570601851fe23632124df53879ddb72f4b6f22abca9", -"votingAddress": "XVbcy18cm1nmE8uwFqcb1mUh2dC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c893667c286e7a3a3b00a5aeb2fd44130754e93ed61ed01c0b667accdc1beb81", -"confirmedHash": "c58971671ff2e5b2629c64cf449fb208b7215008b0a2aede0a00000000000000", -"service": "00000000000000000000ffff52d3150a", -"pubKeyOperator": "8ca7e57072ab96602fc7d15f735320d375a6d7979645be2e9f9a0332ef3dd2cfd1d95c88490106b5550b0a2017833b4f", -"votingAddress": "4Lq8HbFnXPP3eaWK3CXdtZra2MdA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c89f7c7e71b8d904d780ead8495cdd0847beb78bead5eed856175a4273dd12b7", -"confirmedHash": "0168d103810144f5b44acb20a85dd50c1574003ba53032821b00000000000000", -"service": "00000000000000000000ffffa747e371", -"pubKeyOperator": "00f8d070885406a6421f378067ca65a7df5c33835875fe23c756f989af5ca7487d681edfb6d7e13661d46c7affee1aba", -"votingAddress": "2baqxfjtzgTtfCYhJNYGATpyKg6z", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c8a29c530f60f99c4969bf424e4cfcb472936677135272081b45b597b0fbccb9", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d525a1", -"pubKeyOperator": "178fcbc9dd04c3f1b33e644dfa3ce9149a13f617be4846050e53c4e766f23d0cb74e698ba9d453f898028dc6a38bec2c", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c8ab91b74afca58a9e40664493c65a787dd7a28f5c1170a7a4d2e7847e7972f6", -"confirmedHash": "1bca13297fb25a6ae5c083e0f6062308fdc3e508829e5abb0f00000000000000", -"service": "00000000000000000000ffffa5e31c5d", -"pubKeyOperator": "025f70a641f8d53d57742474a9efacdadaf0549ef56b3a09a2981de9942cd6eefdae6088a4e4aabb18882da8adc962f3", -"votingAddress": "T63grg9p4ohqngnJePopfkr79ea", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "c8c908411d6fb150ae5745eadc1abf7090309b8c5813cfe8352ab8721d0256ae", -"confirmedHash": "4113cfb08ade9f1b5d935bf2d7223e28d8191bb01a7808d80400000000000000", -"service": "00000000000000000000ffffbc28b6d2", -"pubKeyOperator": "831691e51184b59bbb130aef9fadc068ef877faad9fd7db92fcea7383fc798d1b4bceed4163c43eebf9a44f2faccd522", -"votingAddress": "4QwhdqDowJH1XxVKsM9kym4wd9bR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c8e0cdfe83de11cc8b389aa8d5df3a5e1acb25a833b677666852943ee782b5f3", -"confirmedHash": "697331339a89d8ee4c88a89b518939b96dae16c9f74824430600000000000000", -"service": "00000000000000000000ffff58630b05", -"pubKeyOperator": "037153c3ff281bcc6d154b9981e4e3945c98715a9765077d49a1902a952ba66699c0132411069692a83d18e6aaa83c2a", -"votingAddress": "5Hr54bi5gDsQFwyC9RKG9Hrbg6B", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c8edc0ab954fb201a4702343177a94dc08530f0fd5685d8356d0926ca1f21c78", -"confirmedHash": "0dd765e19d89a4a57c37af23cdcd7b2688e6a5d54d1c61373400000000000000", -"service": "00000000000000000000ffff3625c7ea", -"pubKeyOperator": "103cec76e609c17911c05d5c41722b209a0be70bb8bde4537feca19bb72ec79afbd45e2567efeb41f942766e1edbbd5e", -"votingAddress": "39fVG3PMBYerLy1QG7MPfNTRfe2b", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c8f7fd8d159b7bfb9601989a43cb6ae51bbab785e208c1c601e2e6617b0294b4", -"confirmedHash": "940b37038967c460d991890c6a11903d87231fb714ade2073500000000000000", -"service": "00000000000000000000ffffa8775795", -"pubKeyOperator": "0cb2b49919a26c6323c83acd4df737cc91c9c8beda9782b2b3a28f8614f175e89a2eb5c388c17b650b39459d7e267c98", -"votingAddress": "3xzaS7fUF2n9TqpAZDbo5hhmHVYs", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c8faebac6471123aaa9da79f5f98e1d2b356758744b356bbd861686afa34a0a2", -"confirmedHash": "16eb954260162f93d136261303efdb1c9b124dc2d18c1c3b0300000000000000", -"service": "00000000000000000000ffff14d02a9b", -"pubKeyOperator": "8bc8e915933fb920ed9fdb8385688134ce74bc6de3f9e86b576edcbb7acb11c2da5a186a36c5edeac0f065fda8f36d02", -"votingAddress": "2aeQCoFQvoSyDBnfacr7CJqjP78m", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c9090fbd541a845e80ce40c2ad4909f606f0bec730492fcfb63a810b05ee39df", -"confirmedHash": "ebb5290fb66575dd7505cd31769e9261f63eae621355bddb0800000000000000", -"service": "00000000000000000000ffffc7f709ec", -"pubKeyOperator": "8183b4014e1f9baabbc63c20ca6c93bf9aaa4e1abe8002a9e010b5caebbdd829b9d2942c3fe5209c46a9467de2df351b", -"votingAddress": "3tnHAGrcSCs9DqLgBxoY28Q843MH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c913fc8d3ce65bcd5ec631553d89b35d5965f35f1f01e6d8a2c8a697257002d8", -"confirmedHash": "d789c2e8f6c781ed98d63b3df186ad83c8baa18fa3e391180400000000000000", -"service": "00000000000000000000ffff55d1f243", -"pubKeyOperator": "174c80f78058076fe35a61aa1c1ce6711907415b8978e079112a9e6f7cea22cd504d9271e07aaffb42dec63e6b00cafc", -"votingAddress": "3rmvjDzqi5gJ2ezGTkkmJE8YDFFr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c918290a9d720cf7a4020e4b688d37239998b8413fc99f62ba46c61143a25a29", -"confirmedHash": "4d02683f6431f62aeda253a14acf27b2499e7114cf8903ed1d00000000000000", -"service": "00000000000000000000ffff332682b3", -"pubKeyOperator": "9118d499736b7759ddee1146377b3bcfea1efe11864390b93945f59eace103ea9f9972c04623c98da46d5657e1c4d659", -"votingAddress": "WF62YKEacaafeFq8rj5b7HkC2es", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c926f52330b20e61463d8c707881ae950779711ad3484ed08ed480ed308291bd", -"confirmedHash": "ef4b37bc47d1962fbce7354c4e195b27e7469a59982ee1892700000000000000", -"service": "00000000000000000000ffff55d1f22b", -"pubKeyOperator": "0dbe84703906a15db501b2a1d602d35ae9e42f15fea041134818dd1630dfbb7ceee88a3d2bbbf2fc7b50618d3e56446c", -"votingAddress": "5dZswUpWFyhkWtJTJFTzc6wncBn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c939a281bdeb454c6037675f187c583f5d632e06fed1b2782d5a3309151df3c1", -"confirmedHash": "97c200f2715c4a96134eee08f5796e653591b575a16e6b111400000000000000", -"service": "00000000000000000000ffff5f550ce8", -"pubKeyOperator": "0c728d74e2a5e822e878b4933cbb10961d5c69b3da3ac2289d411cfe5ba5461b55eb020f04bd09c93214344ae7934b61", -"votingAddress": "TdUh3M67kkkHkWKhg8h2nynhbTQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c93f0a89824fc0a0d888e3b7cbbd2b9d6fef20dade7663ddda087cb600b48737", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff84919323", -"pubKeyOperator": "1479cf5e10344f95dca53c7a8db9220c2c3e27205fccd392d46de1a45eca6af31f9dbd7215a94368d8d26f2115166dbf", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c945ac42a47f2b8057479aabfab8112912b9d08ecb33efc1d89fd8ebe5fc17dd", -"confirmedHash": "030f93c6b0a2bf96390b8f40732fff807621555f325bfd900600000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "2xwdZYjj5KUqPFYNDEhNBHxrcaMN", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c94b66c7ec1fe64ec1dd85b270e47335b0f95ab6aa45f80a2d9c6ec24ea748cc", -"confirmedHash": "c387b98e35baf58ffa825db4209e30f1c7f1a1b71f1251e50300000000000000", -"service": "00000000000000000000ffff80c72ab9", -"pubKeyOperator": "06e0549d2f9559231a48853aadea12b15bd947feac1cb28df86defe34880d62809ea818983645e34893c1d2b9d5395c6", -"votingAddress": "2ygfP2pWsYWJf6xA6t3dJkmVSJtK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c962f8349d34dfd653a8a6f6eb15d62768abda892ab6d26c67c01a8c660ff518", -"confirmedHash": "72b294c899e711b1b4d7be920f7f4f8ab9e4b775a3ce0f850b00000000000000", -"service": "00000000000000000000ffff4f8fbcb8", -"pubKeyOperator": "98c45b4a3713049d0aab546cca14b6bb05c0af0a78823d1f7cc76047eebf7b1df78876e7f6eb5a5fa9e99280a1e23345", -"votingAddress": "2pGJDSYaPCWhVkZGAcjVPXM9VWNd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c972fe354b575ce136d11feab3db9960c882472fef01b8483266c94616ed7794", -"confirmedHash": "2d12fc6ecbcfa3b769215cd079d25819c8f89ce91117184d0900000000000000", -"service": "00000000000000000000ffffb23ed3ab", -"pubKeyOperator": "09dc799b80ac135d7b5f6d3b2b8893c79c113438861f590597bba541c83da4ef48bf826dcfa36b56ef5d5ed6e6d6bbf8", -"votingAddress": "4AMeBkvwyGghLJAHJPzexgqSsYb3", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "c978ea72d30e1ba04b7a60c0b55a5ed37b357bf5881f66399865e9bd31c04043", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0c4", -"pubKeyOperator": "8a85de1ed29713a65225b85c17e7c34e39657b61a65a77659674b0c4dcd532cd328a83ca38b1aec68ca4ae83bf49ec25", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c97c08d7d29f7d4e508ed4a968fd542ab5bc40cf1f2425ba64fdc7a4ae39778f", -"confirmedHash": "a391fac6bc3f259ea9180b2a0e732cc68050565e5b7dd51b0500000000000000", -"service": "00000000000000000000ffffbca65b39", -"pubKeyOperator": "074d5f33853b1385b84bf6fb44d7cef81d593f3c0b640ae53adda1d28eb5770233d7fc5cc2c094c8fe454045e4af234f", -"votingAddress": "3pZaGqZcYNDGYqGKXZSbzmmUSw3g", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c99d45a64e9baa678370ac304579559f0300d80e77ca9bc9cf67cc4d8a7c4702", -"confirmedHash": "7705e9072b7a77fca4f0cbed0450aa274670dd6c956503820500000000000000", -"service": "00000000000000000000ffffbc28fbdc", -"pubKeyOperator": "004486148fae6a36ad24c5aa63de4d1563aab1a7f29d7bebbc0724c426cbcc8c7d05c161ca67147da5e2cc552e408348", -"votingAddress": "c3oRFisyRqDWifeet697DykYedk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c9ab2ce8267dad48872ca520b5554db04b504608395cd9bc4b30324ca457449e", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688e74e", -"pubKeyOperator": "890eba38616632b5e88a5d21b5056dc28ab45482b36352e4da17d2fe7ece594e4854094ca7158c2054f720d0ceb954f2", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c9ab99b679fd59214772074654617b2ae376cc0f1761c8fccb339237c620932a", -"confirmedHash": "5ffdd2bb7d64319b9039ec2956e41d4e8698d60773913dc02800000000000000", -"service": "00000000000000000000ffffa8775307", -"pubKeyOperator": "877c8c09bdcd9d216f4a56dc3eff1cd1e9d8b912ca41147e1005022c8256e1dacba830312cefa5e25d74c5ba8ba1e8cd", -"votingAddress": "32rtVBnz7AX63x8YfiZgDXUz7ADp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c9b3c04efdd74fa8b885b086578df1827b99429b26342fcc0037e027bc34797e", -"confirmedHash": "b32df72121037dc8110a8ccb4ea37af090e1b66f400486320400000000000000", -"service": "00000000000000000000ffff4e8de2be", -"pubKeyOperator": "81f759a8ec7fdc6a7e93a6f7bbcef5c541e41060477a353302d7ac5328ad88a32d79d98c9e3529b93ead302065065a69", -"votingAddress": "aTZ2JTaS34WT4Usufyg5ZsZdPSy", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c9c056183686625d073a41e97e46719c91610b696fdb31f1c7a517d24135c4cc", -"confirmedHash": "99b3d0f943aa2807a2f0f30a375efbebf6ef1e51aa5c2a862200000000000000", -"service": "00000000000000000000ffff90ca132a", -"pubKeyOperator": "8193d738de366c96e276656dc424c7bbee967ac395f8081140cb5ed4bd0b8fab684e74125a751bc28560b2f516ba24bd", -"votingAddress": "3ReziTp6m3KSyGoeoavbuRWMR6sN", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c9c522b5a5484848a731e2ace15e5ae8fe1091e5a2ef7cb94ad8080983bad754", -"confirmedHash": "288ef161a94c88c7d1b38c4cb691da7367845a1b61f0c8a50a00000000000000", -"service": "00000000000000000000ffff4f8fba40", -"pubKeyOperator": "80add6432eb38388f184df5ecb940a1c662c9203010a6820e490a21d34ac31cc084207e08e7f9cd1167882a6fb4b504b", -"votingAddress": "XWg5yr6ojjdj2juqmgC4Mjz1eqx", -"isValid": true, -"updateHeight": 1738392, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c9da9d1d38c9e69de67af3d9f3d3c219d1b17c6f2e56d09e3496ea09943e4e55", -"confirmedHash": "d9b352abde7effc917bf1af7cd10a8d040c6a78871a191020e00000000000000", -"service": "00000000000000000000ffff422a2101", -"pubKeyOperator": "8032d79b37d385bdfc82c740c8bd16f52e2f951c196dd58b3e3e8f391f612658d825340df297f2d2d84e80417c8286d6", -"votingAddress": "PXoRZUa8WpaB6kpj7ccwKckeeu5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "c9e15742a1faeaa339ad927bdffc12d0627197d5fed1abb34eb01cf262269f92", -"confirmedHash": "317bc082302794ab135862f83c66f9c203f31c31246d97721400000000000000", -"service": "00000000000000000000ffff2cc3f773", -"pubKeyOperator": "0088ae8ecb692be75b1d19d6c67cd3905ada2e5c300ace0fed239027583dd9f0c8ea07af09d3d03ee605e949b7b7d7cb", -"votingAddress": "Vi8pXNDvvkLRPFAMAWG4fLUtkR5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ca05c0074c3bbbc901178fc968e5936bfdb96a6a6bcb6252dc7831a76012f438", -"confirmedHash": "977dab223a5cf55554baf7c2a98d1132b2ba8ac44ea56a511700000000000000", -"service": "00000000000000000000ffff3353bfd0", -"pubKeyOperator": "102ebcca1868bffb4450a4b683b55640bad85c7ec4993332dae7566bec8559805f05200d868aea614e666c4b8526f8cb", -"votingAddress": "pw3G4kFJoRrTropzKudhhMimiHW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ca0a4a7d708b745d4fb500ba6380822e188e11edf02a828730a99b769cacb9f0", -"confirmedHash": "db4b89252155240a5761c42d062cb2b52b7672b1accbd5cd1200000000000000", -"service": "00000000000000000000ffff55d1f252", -"pubKeyOperator": "933a0df1c426a8b3000db129d0ed698a85aca314eb4d00cf7c7410647693ecaed0dca71f071250b7ab993fc9b869a56f", -"votingAddress": "2VPW9NNpFafLYUoejCMgX4UV9BiQ", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ca1210989dffc861bef315e4e51d4bbe0ef0cf15a417b59bdec50b2cc1283e62", -"confirmedHash": "0fbd4d2ded42d0a972cb55e7523076d67227594a293b9ead0900000000000000", -"service": "00000000000000000000ffffd41869ab", -"pubKeyOperator": "82da63ed6324e8612d144065e7be7e45bdbc3004cb91dee3e44c5071a61af4e3570a987ef277cc31c964a327dd482a7a", -"votingAddress": "4UEhzA25kS86jLnYK8DcgAGhmvQT", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "ca180140939a4689dfbdcf3634cdeea123c045b2724ee463f80c413a30008e49", -"confirmedHash": "6190ca0e3af420c8578bb89b2dd6ba8e10a9fa6abf0239091700000000000000", -"service": "00000000000000000000ffff50d1ea04", -"pubKeyOperator": "026524cf6dbd08727749b1452f0dc27eee8490ccf4dd9d07c6403ac3fc222924aa178a40aee96ac044dd3d34727e4080", -"votingAddress": "37XmmtKAPfYtSozcwvDnc6bqAFh7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ca1f7f49c3ffc856d110141c88cacddd54302d24ecd5826d940f143b8d3ed126", -"confirmedHash": "bf99b819652d499b7857b5784f4c0a707aa19be75f9cdc071900000000000000", -"service": "00000000000000000000ffff2be023a3", -"pubKeyOperator": "907bd17319d581c8b76d5ec69028b87a5f6d3778655525a609847d275efd97ae3d80316b205a31a889efa0cc9afe495f", -"votingAddress": "2uTUm5mmGK3LkdjzNQeACnDuUTXe", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "ca274b43a2fdba30edd26b29b2fc2d8c7a7b6099f26494b9569aa441e5d4e6f1", -"confirmedHash": "562d29d7abeaa6f6649e7c9d60b4d31bbb684e08c26560912e00000000000000", -"service": "00000000000000000000ffff52d31952", -"pubKeyOperator": "87ebc29d0036dcd356431a855d4e6c20e8ac3a8164f838cee3e01e47b1d8b4fcfee5cec5ed23964d90c02bcb64f732cc", -"votingAddress": "2LhuXa8JUGrFkRZaWJMKmCpcaekM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ca2aea143c4545cc693fc8a415361250631e16f6480942aa818ea25fc1f93954", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b07d", -"pubKeyOperator": "059b8668350928d46a04b6923c0c9e3ac75db756cc7e8511d439000f55b007d05f45e9a44ce870ed893a1ff7b85b70be", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ca3a16976c4bf44a4e0abf34980fe417002e38a45d3824a9508ca9d2e1abe700", -"confirmedHash": "938edd68ebea4294a8c497ea6cea6838dc8c8b483b8ae00c1700000000000000", -"service": "00000000000000000000ffff55d1f14b", -"pubKeyOperator": "0ae6ca9e838f8b55b9d1c1d3cda0ad0fe0413673eef0d0829ad1425d463632e8da59aba6e389c6b68e163c39156bebd4", -"votingAddress": "3DxBkHJgvuyTsuTgLwa8MBXAJ9A1", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "ca3f6bcd1ec429fa910eae0decffa4d61c100523cf5d80ff05aa147028c738f9", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0da", -"pubKeyOperator": "90b1c6ab5b4091463f05839d5b0cea0b9f9b80cd1de90d983d8c25b5a18920f1d57aa12d6bde210b15709e607af793f1", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ca57d93cf8523f2d6cec84d045a58559773809acf4d3e46e56f13050008c2971", -"confirmedHash": "89c0e3a8d7d60fb6d07199af27d55326b210afb47b1449802d00000000000000", -"service": "00000000000000000000ffffbce2b477", -"pubKeyOperator": "11035ba8560e243c2a9226753be62675450b1ce4b1daa784b455b795dcd747b38802b573a661cb987057e5d3d08505af", -"votingAddress": "3pd7BujKW4Q424FYBfs1rUrE1SYJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ca5898c4fca31b117dc32b75b165b1d43b5aa9819d09c5840ffc5e7fd3eaedfe", -"confirmedHash": "9a1d301a18559dc1aa20644fa3b6273224ce13f37e3b92b14400000000000000", -"service": "00000000000000000000ffff52d31582", -"pubKeyOperator": "10ce6efcf8b83d3308d8c6ab03dd10bfb20e177fa1953605baf9ba160bbf2361841eec0afd69b41e9e7763c81f651da8", -"votingAddress": "45sdSB2wGL71dMa6Bna73NbLHv9G", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ca5e85627414b0c16c9f88a0787f5caa90a42f661c4358185d2cd805524072b4", -"confirmedHash": "7cdb34df2dce13e1a86194dc947f28720bddd38c8fc69f920f00000000000000", -"service": "00000000000000000000ffff5fd8e668", -"pubKeyOperator": "91b95aba8f4ece31d8339814e8e4ea32023ac0292ecb30ecf4318006b5240fe10613335b8e60aba1d39cf4b002136d13", -"votingAddress": "2GPGcxMK4HNUKFCCpZyH8rPZiNPd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ca5f9d7d1c6460ff1b743096e49a978e2994c6cec6ac7bab50a6fb3e16f36513", -"confirmedHash": "9fd4d82d72070635c3ff9438543beda49fe55a509db01b9d2600000000000000", -"service": "00000000000000000000ffff88f38e27", -"pubKeyOperator": "01f33463bacf8fb4a85b5a1f6bc9c993223d88bf27ce22c462001d88caeb7bdbe398bd66f85ad733c7b2a0dbfa00f6c5", -"votingAddress": "331Von8wKEWBf4AcARLu5JQT5Xa8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ca72d8b16532ec8e767fb8198a1efcfd2c75f8c7fede21c9ef2cf737922d8acd", -"confirmedHash": "a9548ee86466785ff2795949a498e9e083d1fa9abf3e9a791600000000000000", -"service": "00000000000000000000ffff55d1f18f", -"pubKeyOperator": "0c0af194fa3fbc41df022e033f283f4f6d4dd747398380ee3ce3274b4d0576a49ab553308769d61acc9259e47e031ac8", -"votingAddress": "2FhKzoaQqwdrmcudYKU2sRyNZuoR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ca73ad1638a0a6d3c111a99ea7da3ef03589c5bffce6424879f94230c7b3af91", -"confirmedHash": "7c98fa9d74b035b7f4b64e9133f602e8a0e14dfabf9a51051600000000000000", -"service": "00000000000000000000ffff55d1f21b", -"pubKeyOperator": "8c2131d2d4d539d0f2df1fbebde2e06d223d02f6be75019866fd8de1078bbe3772d5ff4346daeb28495af6f3c40fba6f", -"votingAddress": "2zUs3Ry9y7rajkAkSKK2U8A8tRW7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ca83dbe697dc4aa123c7570b4f22351b7eed2e58365cd82765e391edf00d6722", -"confirmedHash": "0149bd29426bb8a07e7b5b958a7690a2aa5fd7e8a5958aa22300000000000000", -"service": "00000000000000000000ffff50d0e566", -"pubKeyOperator": "90d35d216da01be147648c2ea2cd8db99038752d3c7f51ef0c6d698ee5c29c4feee22516edb7987ed4e842f420cdf18e", -"votingAddress": "3qJsxD2Wh7zdXr3eYwwRubXDmWjX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ca8a66981efb5ea56fa5aea0461c42c225aca110b065e99d0e2752f41dca7e79", -"confirmedHash": "82a686d2117ecb764ede8a22d6635072e436a0128e3086911700000000000000", -"service": "00000000000000000000ffff58630b1f", -"pubKeyOperator": "92058ad273ac46e18e4f43a20b5bcfbabdcded712d80387eeabaf190d4351f45749db9a9d1bf4e13e4ae946a03ed4015", -"votingAddress": "4YBVihGKoNb5Ks9MCDS1YgEE4XEe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ca8aaa1761e2adafe4242edabb5cb20092bf5ba7ef141bc500c2803ec5c5c9db", -"confirmedHash": "1c6ddb714d43962db232508ea5165965bec98519f2f1fb651700000000000000", -"service": "00000000000000000000ffff9ef7c82f", -"pubKeyOperator": "85f651895ad58017a0a555c48fafa9c08abfa2bd4ccf45af8e7e9c180194e2d22677ebc1af602fa6b9f148a3398a6bd4", -"votingAddress": "2KMkA2Qq3H6NTQjr3JiPssfShqnr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ca8df1c1afe7ca84ee68c4fa41b875c2d417cebc59864c4f4e52aaeed7a6b7dc", -"confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", -"service": "00000000000000000000ffff6c3ddaf5", -"pubKeyOperator": "0cc3e63623d7c4141109f63c0ccd7e4cb24c5743e2eb349a8ebe2b78d569c99b9796740192168dac8a2509733c803bbe", -"votingAddress": "3ipNbKcPkvbCMkL4Xqhph6wHGq5f", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ca9319669df364eecc82bdde2df9dcb15a43b200d834c2381f231cafc9cb9748", -"confirmedHash": "ae06cc22cc46401855349ed291205288b41759c66e2eeae40d00000000000000", -"service": "00000000000000000000ffff5eb0ebba", -"pubKeyOperator": "0a08360b4777ce240cba85b184e214ccd27d712d09f065824f4c9d599a16ae96f248eaa8b46204bf4266a6f27436ade0", -"votingAddress": "RUaWKNtAN1ecBppLnU3ZBnTVaov", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "caa08d9ada18ea679d6c2400971efb21a14f2fcb8a27864725fb6e2821841906", -"confirmedHash": "71a4826418d5f73ea88d0f40fb501f22e1f21d6525c547090e00000000000000", -"service": "00000000000000000000ffff2d203588", -"pubKeyOperator": "1669b3ff2748861473f72f3cf92091b934820f340b646227a9c2c936ac0a3304af3a32cde25806ccb12d89c1adc0e1b2", -"votingAddress": "3qPzw1Y8uX8xpvUogWgjfiVsDH1J", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "caa613c8e7b8370dad0d48f2998379f15a9b74d2ce097bc4adceeeae5daf8b89", -"confirmedHash": "6ae1fc97f35f12bcdbc795195e82d45c822437c0a18c9a702f00000000000000", -"service": "00000000000000000000ffff91831c44", -"pubKeyOperator": "0d16fd9603bec8fabaa6ce2c304e39607af9563d3d52f1adfbe0cd5c7ba27fdaff402cfa16e5373896e88a5a4a08ca50", -"votingAddress": "2PwFZBfYUC52PfjqHrrvQ9HgsPYP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cab5330dc49f86894d520e309cf3f0a7eb0ba95109b866dae5a531da1fbea8a7", -"confirmedHash": "404dbf511466b89c10f74f35cf3f256609b823575faacfc30400000000000000", -"service": "00000000000000000000ffffb280e5df", -"pubKeyOperator": "8ebb6779f0a66b5cdf74bd15996ec1c44c571d34626775ca47499f24e2f670c9aa274a7868d28178b1e435c4964f4dec", -"votingAddress": "DUXKcD7EkqsEj3ULyqymUxeiJKX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cab56c50d8eb23582f7400654af105f73867a08ad7d47c4fcc0d3a4bd719ca1f", -"confirmedHash": "7d3cf2d675690981a689072dca56c7c076fffa4c16d274071b00000000000000", -"service": "00000000000000000000ffff87b5c8a0", -"pubKeyOperator": "85466e40f04220def01723630e35fdbb108358ce905affe0e1e50891ddbeb4ba6b4eb969423c65a0bd862b7c2e2f6563", -"votingAddress": "3v176z9xdtyQz4HxuEXxcQCy7qn8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cad2de3a61ca47f267f7afc1fd0b3e44b235ad07d270a55cea6f006795deb92d", -"confirmedHash": "9b36c0f08956a724e8c0507e2db8ad350e855d1aed794f4a0b00000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "gJHuVMQoDp9Kz2zPokMQLHPYWi7", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "caf2402548b5c475d08d337f282fcb266084b8ee4555f9a7759b4762a8883be0", -"confirmedHash": "7c5317ae3958ab7d91df79368391f7b76d162d924f6aebcb0700000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "3fjfw7GzqS4JRC82fZjw3tgi4rvy", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "caf34d3c47d8d52c8134a10af3fc3f1b8fcd9acea225e319ebf131242746df08", -"confirmedHash": "cdea5b6d9ef9aa881da82580b584e27881ab2850cfba730a0300000000000000", -"service": "00000000000000000000ffff453d6bd9", -"pubKeyOperator": "0030e6a5a104c5c4521e150d761c1d99a1034eb9587fee3d4796e7fbf015a95cac8c8c6fcccb9c500d1f65271423e3df", -"votingAddress": "PTK2f7TNsPfCu4WgEZDeADCEgJE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "caf779c8b9b2430c7b308a2ab673dc0fc0dfa2ae01895e8902a409bff7419101", -"confirmedHash": "051b53482c37c7a2c952b7643015e51f96dd4df42d4afcb50600000000000000", -"service": "00000000000000000000ffff58c66c90", -"pubKeyOperator": "05468cc956e87b1e0aa6cbb6d4babc81310fceb3515016b904d2b77da02466e1ced9a8c828a6898431a8390e61747cae", -"votingAddress": "45atPpSmHyPHDonnkZ5D3syChRD5", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cafff970f8aa3c91a37aebd023fecddd1c4ca720de9b598c947dbf7f7f740245", -"confirmedHash": "20bad3722e4e10972be1ef117635aa6fc91d4732e02bc5250f00000000000000", -"service": "00000000000000000000ffff58630b0b", -"pubKeyOperator": "91008785993639ba13e4e20981c89ed9a64a0e561da60e7e286f25c397d6e0db06acdded783b247fe26f2f2ff6665184", -"votingAddress": "281qU8Qbm6Gqjjac1EDnmXTKFFhz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cb063759da4235a78cf9792e24da07cbd230609efc67415712763c52be213bf7", -"confirmedHash": "27bb10154e24763cae815355accb8337820d012b020b14a10000000000000000", -"service": "00000000000000000000ffffc3b5f527", -"pubKeyOperator": "85c1c2e1f309cb617c4fb3bd91d51ef713689f3255ba946e43a10bb366603ad9e244a6f08fc34e01a877e0efc48d04b2", -"votingAddress": "m78FjWbyCixSdHCt4LHJXeZjnUd", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cb0e9b6d3c59f16392d571616e742862485dde763c6ad124c476baa96528140f", -"confirmedHash": "b9d70d4631d6fca8deceeae206b4071be4a35f8a231d26bd3d00000000000000", -"service": "00000000000000000000ffff5fd8542d", -"pubKeyOperator": "02fa0b5093d9182bfed82e93771965ba43ed61a7b19ff5e98c97a01122342e20e77ea2ce54fa1af38718511192ed27a4", -"votingAddress": "4HVmHejuSMuyf44JCzDjHhUyJMWx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cb1002143ac5db461791432aee2d8dea8a5822ec1f194e21948e48b054af1c75", -"confirmedHash": "037f27d4cd63d0e499d849a06b3416b8a6a3eb3e52a7415b0700000000000000", -"service": "00000000000000000000ffffa87757ce", -"pubKeyOperator": "1605332608578ee8b5af3e5c79bf7b190584c7d0be3ff43e5d8b9075350cbe74e66068ad7eeceb3b90bf4c4b352cc426", -"votingAddress": "32EHzS6d3nDpkh4QWavyRuRaGiuo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cb124bd4ae8da11cebcf32dcbe97662025e1f396666642ba1d6314fe05d2d356", -"confirmedHash": "d805f53e0335d0bf1aaa426283f13da7485562619addc97b0000000000000000", -"service": "00000000000000000000ffff91efed4d", -"pubKeyOperator": "9135ea25c7e9c4e8651c856ef39c51390ec7f2d206e0cef29801d1eca7b5a10912d85ba9589553f870207c74edb769bf", -"votingAddress": "JUAaDbrqYhJjEqF9PRQ599sm5tY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cb292cf1312b195bdbd7f5a1774dbab20ce65a330b52ee6c31dd6c500c700bd1", -"confirmedHash": "06a5292f0675f5eed2a40febb915f7231408e222e217b5680200000000000000", -"service": "00000000000000000000ffffb93e97ae", -"pubKeyOperator": "90348f51fc68516b375d152f1d9c8fd90631cce1cb8f6b1e70d9db35bc0a4587a4c1916a331bf53c9605259744e41bb6", -"votingAddress": "3EWdwxexQqojUbe185M68uMoj24M", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cb3385d42cd728b5637040a6a66a80ca67a7f57e57d4a10207ea8991a3af538f", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b00e", -"pubKeyOperator": "9223b9db1eb8282414ae231d944a651eba3932cf87d43de3944bf5b3ce423a68b26686a9d7b89b6b61d2799b7e664b16", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cb48b5a65bf62c7fa3b99230f3b314b8ac524e79d65ef21183f580e66641c158", -"confirmedHash": "6fef410c140bc00f7679369f7fa2d4b2ac556c9b5411ecf40600000000000000", -"service": "00000000000000000000ffff55d1f20f", -"pubKeyOperator": "946f7b51f48b0b878db98f0f7977af25918b20bc90559d516bc84658b63521cd0a5c0939db4eee3942b0ffbcbce9b174", -"votingAddress": "2kAA6azz4rgwDx8ANm3d6C2y4cGG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cb4bb1266f276a5a2090333f7d99646524613a27f227b89bf18aecacd575ad24", -"confirmedHash": "ffe3bff72be3bd4349140c073a1e0f3dae3b4c0619f364c30700000000000000", -"service": "00000000000000000000ffff334fa07c", -"pubKeyOperator": "99e05be022253ff4ee73f5fadfcf231fa4a347ab1e78ff1f911a200763dcaaf5f104b35ce0bae3891cc353b241cefad2", -"votingAddress": "3aWWQFJCDF1nV5iLp5cUfz2YAzpk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cb527f7f39f7aed4c471049b4b2f64a248d087b6576dc3ec426813c5f5ca34ad", -"confirmedHash": "93cb3907841c1471d07b4b277b27a794c9799cb54741f1952d00000000000000", -"service": "00000000000000000000ffff55d1f199", -"pubKeyOperator": "97507b1eb0fe5044aae8f3c038301009add693a5245999ed2c0a459a62dc98c4e7fa4303aec475a83b60c2cf3a62d573", -"votingAddress": "24HP5h1yMnGL2SzGrJvf2myKBqa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cb6a307acfee9eeca0a6aa1d938536b5192bb07d8919ad80926ad38a56c51996", -"confirmedHash": "ff7491851e886f68eb2f2e3f126684d1a91156246544d1bd0e00000000000000", -"service": "00000000000000000000ffffc2875939", -"pubKeyOperator": "0950406157c3cb41093880b09623ac71a5a7332c32d7685e790d713bce0fd305ce5e179c85cbdd03efd0a6a027c7cbd8", -"votingAddress": "yz8n8n9uk6KwwSZF57q2RS1gvTW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cb6b71eb671387010f3122e247e38d2ab52ea478ce644f1349bf488d981471ad", -"confirmedHash": "ff5fb29092b815ec1f6d114249771c3b48ba38e11985689e1200000000000000", -"service": "00000000000000000000ffff4f8fbad0", -"pubKeyOperator": "01d61b00bd6fca019b88b00633a26f604eeec2667678b4d6e376185d25d6584dc9ae16e5d6d8a51de16962a3d5535b82", -"votingAddress": "AedU87poZMiXAVLKkC9WGvMpVVt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cb6efa30bb0439250342c6ec07991dad4860dc87e4372e047aead210a0deabe8", -"confirmedHash": "dcbaaa100c7772cba7e8dbd9566b94925c892293a5b6829b0f00000000000000", -"service": "00000000000000000000ffff8b3b383d", -"pubKeyOperator": "8f02fff5a80e2175d528c6cc97ee90e1d41f23f3e54398031d4db68ee6819413bc525522360f4095d862dc6850b246e2", -"votingAddress": "oKbxrW1PygLD2gmhAtMK8pQuNLt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cb71e572818299b802a60ff954508791cd1ba9dbd9cd5538fc722ece8ba34d97", -"confirmedHash": "6bbac2ae6fe2ad70673ffc9e2efb40d78f90ec30f510f79b0c00000000000000", -"service": "00000000000000000000ffff52d31524", -"pubKeyOperator": "0d1f1de62607e61bb5b16cb0dd0ffc3e389224eee37d87fccb74781676bb92ec9c641b361c22c5094a11a04d31c83e3e", -"votingAddress": "2D7smbfJZ2xdyPvuoZD8SRDL7anw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cb79e219e9a6b78ddafd87875d27044279bb6c8b27c9511614da136e08a858bc", -"confirmedHash": "f3a2f0802494d1401b21b243792a6ac397aa0342ac44a7b21100000000000000", -"service": "00000000000000000000ffff33d2703a", -"pubKeyOperator": "94f251c8ee0e9715c11586747e9e026ab8f38f5ba337170b388bf9251aee8f1124fb50c6e1d7584ce42262932ba88b64", -"votingAddress": "2ZLMG6Uw5DUEMrFeoTvH28EanLDs", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cb9ee76886f1d8b772418c34c7534cfad6bc15aa0458e37caff38a81934766ff", -"confirmedHash": "186d438a06f27f5576287d69aebe9a5c28f89eefffe8e7651000000000000000", -"service": "00000000000000000000ffffbca60127", -"pubKeyOperator": "99d59a1243fec52fb84cb982b27133c8ab5aeca16edc7b17307b490c8cc6710e29e97a41a454f14934a8ecd5c00df855", -"votingAddress": "2qpBq4BvTcJEqx5ym92KaWVsaisv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cba1e647dbee34984d5b669820ebecb97ccdadaa08e52e36a464890446c6cc8f", -"confirmedHash": "53796f544e46454b379efedc2b903773a4165dcb6fc4ce9b1000000000000000", -"service": "00000000000000000000ffff92b9b223", -"pubKeyOperator": "04b228825a6df4cc4463431204c894ffc3da2a3c68dc9d85b861f9babe071fdff25c59502f097a5075493ec899fae3bd", -"votingAddress": "3XCs255kUAApriKspiQDCoFCyHVY", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cbb047514322f815ac068a43f5ed0d80c94d27aa15908ea6f58078da875b199f", -"confirmedHash": "d117824eef4155d979434fba3ba7e972dea3e35045fdff972500000000000000", -"service": "00000000000000000000ffff2d4ca0bf", -"pubKeyOperator": "0d1ee01d8a3f1c4e3e18b1c7e6e9f4161e245bdf3178d09742e81e6113d67ac173edd7dce17c0828fad95568cd565c6f", -"votingAddress": "3DDWkbGqVZk3UbkueK9cM62QhMn1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cbb18a041bf6646f69454564d843d49949a6fb615a8fc6c12e9005dfd1a38fa9", -"confirmedHash": "6bb1e425e59548ac9afe15d7570a8cde3ecffd968e19aa560000000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "3kZDwaT3e8a3cFHpcMuDcASL4tKJ", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cbc6fae8f8a2c6aea6a7906ae792ac958043cd205a927a0ade818f239b0014bb", -"confirmedHash": "163736cc38b125b096dddd68dc686b230cf8f9417dcc7c6e1900000000000000", -"service": "00000000000000000000ffff5b868a58", -"pubKeyOperator": "023b1033f2d13be0799d61dc591a7087c3adda1f991bab5f27d45751ea3729dbb1a294f288875694c652a64bb5471708", -"votingAddress": "351fWwQToDnRK9fHVBygRFWpfgTk", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cbd7990c8b50244187289cf6880dd3e79c0111f53da8da65ec08319974920bf5", -"confirmedHash": "3c4ca02f81aff688e0714f613caa39e2835d133d419393260900000000000000", -"service": "00000000000000000000ffff52d3150d", -"pubKeyOperator": "832ea16f666430d354cc9009d6cd9257aa213066de55f757b29dc14b90d4b8b8bc195b060b7b7e25bc6d0e033deaf19a", -"votingAddress": "3mSv56TVuce6BpoCxwxZEf6GKxcR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cbe18c55edaabd4f0a365c87a7d1e6fb06d9d276035d5df61cf50fd73a40df86", -"confirmedHash": "d8e25e5d4581c1c387012a714f499815651f684b301bf3071200000000000000", -"service": "00000000000000000000ffff52d319a2", -"pubKeyOperator": "93715aa9fdd42f796ce3b726d01254fec10647479db0fa7775304d540ec608a3040f6a5aa1326164ac70bf7c5634303b", -"votingAddress": "2rydPqhYs7sCcT2aD54NRDxvy1LY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cbecbcd219d856ab2afb5289a3f60407cd100e8b9e340728e9477c70c507b2f8", -"confirmedHash": "164aa229770a66fa4efc368462c15dfc806719704d23f5fb0900000000000000", -"service": "00000000000000000000ffff92b99a7e", -"pubKeyOperator": "0d50185ee48e24145ad7090cd288e01fdd94b2b85a1543d6ade1b3a8331feb9bbaf0666e2017f9365ca509ce4cd9e38f", -"votingAddress": "4TokTFUvJoojWuB6sqNvxjHmwB8R", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "cc0bcd3338de4f4768a72482fe1f41ef3f128bf798f2031b1364f4953de84bf2", -"confirmedHash": "6a3ded3b20b98d15395610cedb3ac176a4d17f51c740436a0600000000000000", -"service": "00000000000000000000ffffb23f7993", -"pubKeyOperator": "05d0d21b347b8350a6d9dda539790ea91dd128dc8cbe2b45af51c023b4e7d8b8e31b9f06028fcd98a1451831015d0b29", -"votingAddress": "3ZBbzzABdD4GefCANEmtyhrPudxH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cc18cc2401fde0b48d6e8a5530cfd9862c3a5018a995d476afd28a132033b035", -"confirmedHash": "a5cf64211fd985673275a3cbc3f967b932898aded5bb864e0500000000000000", -"service": "00000000000000000000ffff3e4d9e52", -"pubKeyOperator": "93452568f14dcf1abdbf93c22ca2e9b6165777e073759af06dadd2a7bd3efbb3ef9a4c50fe58167625a17892a9a982b4", -"votingAddress": "eVUF1AaG4CBecpXzb4PgL4quA77", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cc25aeddc4847415892bf1d883afe7728b6c29f7371a0d0e5ef62daf162012b0", -"confirmedHash": "8557f5da5bab9dddd6457939e1eb66fabbe901b71c34b9591b00000000000000", -"service": "00000000000000000000ffff87b5348b", -"pubKeyOperator": "887bea916a51caae2a6e71982e2d86bf82e4fe3b00f3759e7d2fd58da6974eb60b8bc239d804b82c42b1ca495d62fd1c", -"votingAddress": "2UAv3uDphSpSXWszYtS2DQiA2guc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cc3cc55f181cb72b09293eaf5ebc1bc7edd2d6e3f36a85280b9693b4cefd4271", -"confirmedHash": "6aa0e3c267c20ef7ad09be90827ab19230a9a0275f1833fc0100000000000000", -"service": "00000000000000000000ffffbc28fbcd", -"pubKeyOperator": "81fb652a973c46dbf657dbe9160f6f8e191c13f09c46a4f713978f8df026507bc5f6cad725dd2a1969b7fcb2a93d2e99", -"votingAddress": "Z2jVm4M6B3UsFW3iz4gvb6iWuub", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cc3d09c62cd2ccaab8812e279c865c41f95ee0d46afa1cae8dbe50bc7cae1c66", -"confirmedHash": "89824dda0433a95431b122b47a28ead691fa51c6398091300d00000000000000", -"service": "00000000000000000000ffff80c775f5", -"pubKeyOperator": "8b65028f0c2f14b3fb6d716a3d4e5e7c05d38fe39bcc45a9e255c6b57d487c969ebcd003bf7691db9fd999f1d821fbfc", -"votingAddress": "23KuPmnCnET8qztSVXihjUszgfFJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cc3d5987abedc602f3cbc925b5d5d1a491502fa7122f6153b64bfc501d8377a4", -"confirmedHash": "fed377a131622738e69830603d64fcf0cc6913d61ee901fa2100000000000000", -"service": "00000000000000000000ffffca3df8d3", -"pubKeyOperator": "95ef2bde3eec8f748814743b9961e4fb2175b51bf54f2c2331da906508bf99437be95a1a69e171347c6d1b405435c968", -"votingAddress": "2Govh7AVY9mv9b7ukWnC7ycKHyzF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cc45201a81bbaa97913ddd7b0d40eb56a713bbb562f3fc9bb2b60f08f9d873d9", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d5623c", -"pubKeyOperator": "90384273ace180a71a497a3993508cb5467f6fb7f70f0c5fa9790b2fd317bfc746711c453b62d4862be5e7b659c52407", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cc4e3033bc6a6e364959188ec5b02110ee7f2f35d7ea91a22e198b691c45fa15", -"confirmedHash": "ea3f2ba72a7cab717f64e807d5d870e4e84629404f73280a0b00000000000000", -"service": "00000000000000000000ffffb23f7989", -"pubKeyOperator": "01dceee5bf0b6d7801f5217d704a287b22985f3a933897d94ea390a6b426459160019ea9dd9e0d989bdda4422d32ce4a", -"votingAddress": "2UQPqPdwML5wPTd8CM4C2TrWyauE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cc5513b058348d34cad2a11752b296b71df1379ea78cbd31ea5477550b43b46e", -"confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", -"service": "00000000000000000000ffff52d31589", -"pubKeyOperator": "8249ab30805035c3f8d6cf36bfa1271e20d19145fe594374c4f0d91468759ef56cd06de1acaf8d2d0c5f0cc131dcfe27", -"votingAddress": "2zTJhdxjcWWsQGwji9ZTxso9KxgU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cc57f6f2507e99b5fdb4641b6795519dc8b5a8334d66b26e5ceb6d0b0f6edac2", -"confirmedHash": "9f8adf34b060b0bb93232da356a01c4a6ef3cf3ff21003500a00000000000000", -"service": "00000000000000000000ffff80c73028", -"pubKeyOperator": "139ea5b4b383aa96aaa50979e864d5e7e7718be81952e3187788b48fe0ca7bd9fb3eb0ec52057381111bd7c6cb5437ee", -"votingAddress": "K6pXiSRrJP1GdXYkWMZFdf2BfZi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cc682b30da9915f6efd689522f1e2049d625f7b0ef8595bf49a15317604e3578", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff36be22e2", -"pubKeyOperator": "0b900a2391151f003415bb24bc0542e87206453026c95c41a91c2329e0db4a656db8f76d82ac5e250ad1960edb0851ca", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cc76e4b0e2f60b14bb630a958b9080bfdde110e4106559dba95f020d1283f22d", -"confirmedHash": "bca8906795ef930e22c2083f2582bf9811c8f82c4dd899f41100000000000000", -"service": "00000000000000000000ffffadffc8c5", -"pubKeyOperator": "8429dcd197ff2c69d7c9ebc0f262a1c5fd9ef0b213b29456bf8072b83e7e496a98c134a0c1cc3fa0fcd77c5ddc0528e3", -"votingAddress": "2geLAT38FMcvNrDEg3hMkysWWGfp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cc79c2e0d1c0ffd27d0bdfbd0a2af53eec3b4871de0e6ab084dc595da61db604", -"confirmedHash": "86053968059f2d9376c9b5a63fb27126c73e070ae70f094d3900000000000000", -"service": "00000000000000000000ffffa1619d04", -"pubKeyOperator": "191a71b489f501bf0d9c9e1f521e988dc1b2c1ba52f9e8d67e2fa8666dcef91557769121ef9c6cc3f6ec41efcaffa3bd", -"votingAddress": "diBFGxmjYGwAoP7tyqyJ6TKTXTb", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "cc906750fc5b8952d8869c8cd1fdb930c0152a949a98f747855389a9173ae617", -"confirmedHash": "afa057701b719b4e26cef7b11c8f601f7ee10f4cf0517e651200000000000000", -"service": "00000000000000000000ffffa763c73b", -"pubKeyOperator": "1720d00636d5a9555d66cd7d1459ff8ad9a5ee9f8d31c748f7258064d0d89def6aec6e777abf9c702cb45733c6bd03e4", -"votingAddress": "3g6p7LWCv76Mh6K8K1JnYtqAW5mE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cc9fda7764004877bd332a552b7dc5ddef1011d6d45ee9d8924fa972b8b6f200", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b09b", -"pubKeyOperator": "19ca46b2ee631b735c7684c80b1070c71e36a2a181c76780bf79e64de0c866657601d900005753caa71884e57943b9af", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ccae041348126528f5956dd10eff970decc0b31ab83d8835d949aa82020c43a3", -"confirmedHash": "825ff51efd7ed0fc1fc428520486adf4d7acec61b83d33cf0b00000000000000", -"service": "00000000000000000000ffff55d1f257", -"pubKeyOperator": "04d679a06eb3b8358ec55ccbfbafa36996d6b541b82319498cfdc00cb3d397a8d92d057db360f0d5904ade5ed0db9537", -"votingAddress": "2WshGBeVZf2uruCtrRV5m8Hk8b2c", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ccb17d612bdef05e2170dc79fc8d9a9d66a461f31ae23ecd2410e95feb9d7948", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b080", -"pubKeyOperator": "16c265b3a81661d3495afdc7a6e342dd5ec33db8dd403208d048ca6a7a95734f97b8c3e8d392f9c4625601e32f15a4ec", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ccbd670e85dd338a5a50f91116924d317d2c7f1696f6543e023e790de590a9b2", -"confirmedHash": "54e94e5a6b2b19d4a0fb500e3fee1ec61713e0c4e96e629b0c00000000000000", -"service": "00000000000000000000ffff03d0b72d", -"pubKeyOperator": "8ddc7592a0faa7e37e8fd48cc02ae543f5cd796be26a87b8aafdd6f3e8f9e974c08646f52e2d2800883f35e48e65c0e2", -"votingAddress": "25xXoQ4eUbhgRZYRPWngKqPB9Jw7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ccbf2b7e6430c7b45f50b1c7be12523b7d0b206ac658a40407d6c57a55d074da", -"confirmedHash": "331a13c3fd19415ab654eadcb86eba123609aa8bd97d62e70200000000000000", -"service": "00000000000000000000ffff26f2e441", -"pubKeyOperator": "8966af35493e4710f0ca751cf4894a77b7679f476576168ff8c12adff2ab1015d48d2f9e5ee53e3cbd3d0393ba418599", -"votingAddress": "FgmxoMcUmdLuFoBtk4kkN6izpjb", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ccde8ecc279bfee8127476c7460ac72eace93731c3fe9c430f25499dc98a3288", -"confirmedHash": "8e15d3391f962a2c8dbb47c3cbbc6543a35cbb3c1f8aa0bf2d00000000000000", -"service": "00000000000000000000ffff12ce3f8b", -"pubKeyOperator": "057a1d863155d794140900e8035e93d9ed01d52c51f5fedf3742c9169ca65738129d3bd220004e1f7ec82bf55af7c179", -"votingAddress": "xeURxE9MMbSscrySBH2bvc3ASNW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ccdf17ec4933a650fcdece3a0a0a05d2e55e0aac5998dd6362579e3225e80e0d", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff8491cafb", -"pubKeyOperator": "91f325217de87935b334f4acb06c841fe9c64f28da1ddbfff511b777b4608f77f8b264a8c11af1c7b5b02549cce9d926", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cce4d427410ca13d4508de5f74f62bf0a1f25a1ea400fe59f792d0cba7036cbd", -"confirmedHash": "35fb0f4a01350e54996631d8234ae8032ea83aabd6a8b7080600000000000000", -"service": "00000000000000000000ffffbc28cd07", -"pubKeyOperator": "907fc66aba6719f1b58754b631b70d302a025673a703632d58b5618d1a280a20dcec84249d1f59c278ce3704c29331de", -"votingAddress": "3YbGkEbKPh6dceKmt2nu1VsKRUSg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cce91d755b5aa5a8e93495efabef5772fb749b06f2c02380ae5c2e7d1de85cf1", -"confirmedHash": "c33eeb3d92455c61f8eec72f33cfa3bb2f1f9023cd1466482f00000000000000", -"service": "00000000000000000000ffff2d99ba64", -"pubKeyOperator": "0fa657db0b8a05ca9980898e94d7e3a2e4b044918af5a139781417b4db7b470dd6fb6c4ff26978f4730993de9804c85b", -"votingAddress": "2ScMaVnCyGDSXtcY1AKPiXjRd57z", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ccf6b7e677c3e2dfe28b011ff70d9c82486a0434ddf79c10e80159c6427e984c", -"confirmedHash": "e7a59b30df0e27fb8799e129261b4be4f1d56cf3a44d83c80300000000000000", -"service": "00000000000000000000ffff8e5dd85b", -"pubKeyOperator": "0c7cee2443fb67f0d5b39959cfde7353cb938bbc814adf270997ac85504cf681f727076809e99b380ba2211deb4e3095", -"votingAddress": "2C2cp2E3AeMSWtFDgm994pEYzT8b", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cd10332e29250b009b81be26bf842562f8bd0d3200f477da9e0b3200a332a23d", -"confirmedHash": "cdc19c042a7ad5a421f5164ca0c4605266dfe87ed645949a1200000000000000", -"service": "00000000000000000000ffff8ac58274", -"pubKeyOperator": "08cb0aa4bd876acd9865ac68224e309b48935f4e942366f1f2b0dff30cf2b03dcb26109996707604542db2cccb68c4f8", -"votingAddress": "2MZVt8cDcXhwmsy8snSVPLfejsEo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cd18b8ecfe4a3a9f8e4ae6ecad145c621c0de767eb785e6c594a522c3f860d2e", -"confirmedHash": "a8540a8eb77addfc7c32ef7b417d978c6f5dc28e1243be5d0300000000000000", -"service": "00000000000000000000ffffc0b85acd", -"pubKeyOperator": "8561e8939b55cd83a1e52cf31760d33f19dc6f890b7b528e8d76d56227cbdd52631aa2ed1752d9a0be8d54b4aca9266a", -"votingAddress": "dWeTnoTw9P7d7gPggyxQoi3xUbS", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cd4287cec16c861524cd74794dcf9ef107af79e958c7dae22fdfbff0ebe2bf78", -"confirmedHash": "c6c0f09e49f2c43051404a562f9d3b8cef9c42b41a2cb1cc0300000000000000", -"service": "00000000000000000000ffff9f597dad", -"pubKeyOperator": "070bbd1ec68dc81d3adaa861b621f834739fd478ad04b2c59833987ed5cf6a980046f90c2191f1bae993f9fe1613d4d8", -"votingAddress": "3geK8hmzycchF9WW2GfMPTojgDbK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cd55b7af38a34231a5a8f9d2e67d07fd46237298de5ce8841dc4c5d44e765e17", -"confirmedHash": "fe096963ac6afafdecadf238e470fcb612534d52ef43c3671000000000000000", -"service": "00000000000000000000ffff2d4d377d", -"pubKeyOperator": "10e9e13d0057178e95d6fb9c7ed3a69986cb6528d538e67e8abd7fe742b637069ac8b14eeadcb6ba79c96f1039cc3483", -"votingAddress": "3Vya4WLLuTKa9Ux1NnGd7n1xPiUp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cd831227bc7704cd9f302bb71144e3854ca6c6918d65bd1334629f80b662b000", -"confirmedHash": "5ed4f5fc30e936bcc9c149e0495d75962417f1653c1a2ce71f00000000000000", -"service": "00000000000000000000ffff52d31943", -"pubKeyOperator": "8dbb1e4f1bbaff1b496157a8f9d5ecf998d88fe5a2a6011bbe59178990efc6fdaac429ac1d090fc7d3879571426aadba", -"votingAddress": "4KK2whfSmdkbEgLLbAQ6LGdVmi3G", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cd831f96f8c3a70d80a1a743b19e15028280edb73d9e5b3a372e4b80da68b19e", -"confirmedHash": "6f7a648f6b9cfb72588cfce801faccef8bd3279efc4d6e7f2000000000000000", -"service": "00000000000000000000ffffbca601b3", -"pubKeyOperator": "083bfa973db6699f59855abff4570d74a4b9b192f80735723e3a0fc0121fef488d63195629eec3d98a1f4c9c3804d649", -"votingAddress": "3P6p5nNoTCFCTaz9NkHceQmfYwVb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cd8d1509ec1e449687a98957bf33165d0dbb7e56c3df0a8ebb1b2e0e4811636f", -"confirmedHash": "6d37ff4e931275a5dea5b6e4d9aa11456f5e02ae7b9d8e173000000000000000", -"service": "00000000000000000000ffffc2875dd7", -"pubKeyOperator": "0f396fa4c452d8c6eb1eb993bdea8af98f96c65bf0cc37ef5048c895af4e89aa8babaa95111157a0d0aaefe1809282a1", -"votingAddress": "2Xo3TLkW4VEpUFbK2sfzJznzkcEH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cdbb02882847d09d7cd88cc3ded1966c361489e59c6a184ffa0c91ee3f3477f7", -"confirmedHash": "2aae32ee56ec940e210633fe5fadde85169f164313e286670900000000000000", -"service": "00000000000000000000ffffadffd6e5", -"pubKeyOperator": "90caabaea72e98a546d9ce934a57ac80f40a5f256b220e48dd3bd5644eb70ae5791067effb5a83ad1775032d1e0e54f7", -"votingAddress": "spDZMzjUsWeziDRD83oVyAHrW71", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cdc1c4b88d6a77521fd4064d2bccda332f749a9586f74ebab42c1fe3e1fa8f08", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0be", -"pubKeyOperator": "127bed4b5182e165c5c0b85b509280171e70392782128681a1eaddfaf61c69c3ace9ab035138aef51ae5a1b420585ba8", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cdc2536f33f4663324ef2f85f5625b2eb5dd87c6b89ba9846547f008c3e7063f", -"confirmedHash": "a29c74fb3479bbcc74497d6602c50921f2f28889b72c7c733a00000000000000", -"service": "00000000000000000000ffff52d31917", -"pubKeyOperator": "83a556ddb1a3ce59a3d2d08ffc03cd291efa0d163188932c766b0326dc15eb73472f26eafc1edf5cca2db5745a932611", -"votingAddress": "49k2YTuVS9pVGNY6ZmiRMGctfBpb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cdcc87f563f208ae3ccdf43385e6e211bb6d0ac3db972cee0d51dff5038688bb", -"confirmedHash": "c972ab5eb29814eb6fb87a0193affb965ab4384d8960ab771600000000000000", -"service": "00000000000000000000ffff3a79e519", -"pubKeyOperator": "9421efc6d1085e2d1bde085b7829c7540f15d56a694fb954770edf8c86fe5fb4574b479ba2ec92a2620ae76dd24b21d5", -"votingAddress": "VBN83neUjnbom8DeCvjTWJRmo8X", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cdf1c4ac33e80542d1bf56ea80f3ee3c187949fd035add84916008f7947b2b6f", -"confirmedHash": "0913e53028617984590c90583b02ad8279b52dc606a14ea81d00000000000000", -"service": "00000000000000000000ffffb952ca3e", -"pubKeyOperator": "99a6aef0824c4e03690860d4663e3b4e204c8994d25c21c9d60854f7d7bb04c20ab9b90921b49486c47169c65318a6a6", -"votingAddress": "3yzsokw4Dz3DmaNGPrv1o1Y9TBss", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cdf8687309e6471bc962d97b26dbd3e2e431859e8bb2691a8f3377ff1923f723", -"confirmedHash": "8bf5ae495ba24b16acd899b090c9cdf39ff7c8a8cb8744fb0300000000000000", -"service": "00000000000000000000ffff9f4173ce", -"pubKeyOperator": "14cc707e20d4ea6ec5b1de796a53e5d6dc7b8047a6a253c74430c61dc8a34d6f880a91a4be10ea4989e6accf50443eb7", -"votingAddress": "4JTyVg4JGNhyZFsp1SxNZK4iKSoY", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cdfcb520e99fdd4d8816588bb8c5d6400d1b9170a9360a43e66d0f29bedc863e", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96886317", -"pubKeyOperator": "06662b677531561104465f191d691f79227b4d231b24ca5e1de164330b249c11a91ffa76d4d55ae935bc9501069b6e69", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ce051ace6ca325709ddd58e159e559aacdd97fc49b89dc1b108b193ec34e8be8", -"confirmedHash": "d8595be6ab78fe3d264d46df3aaf4ff6dbe810c1fbb7ea261c00000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "4FoHgfTY2K7zkyE91DhLiDAFhKtS", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ce1761accfdcc8d75fee5fe8cf32a8c0302d2589f1e3181a5adf887a52644d4e", -"confirmedHash": "16e9f7c8bb6870c5fe24b709404c9aeef7d2222b40b9ddd00100000000000000", -"service": "00000000000000000000ffffb9248f08", -"pubKeyOperator": "873a1bb86c0daec84c5b22c2aca56a3022ac8816dbfceecd4a749800628790fcc5d9f2bb6dbc8b113dde50da06922b3d", -"votingAddress": "3hQdVkGdNMTpXDyqzeSFe1mCdJ1h", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ce189282a8a7ad44427e48a988870e87b6f75636de4b6a70906665b35723cc6b", -"confirmedHash": "c1fc7fee0aa49c5adb998245ee5f82e35eb6b6e2b593d2cb1700000000000000", -"service": "00000000000000000000ffff2e04d9e0", -"pubKeyOperator": "0d3542d7db03699ac3492fd4b90ba27c7d19a92216388137fc579e67bb2d6c850925b5a46c722eb1a8d6cf76a677ec58", -"votingAddress": "2UpufnuXYXw7Wdy7wtvoAru4hTEM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ce2d31b2cdd8c4abc9e941034e8842973479a8036927b1d472cc611462107587", -"confirmedHash": "85518800e57ec823d44a71028c78482b9c449f950eea636d2d00000000000000", -"service": "00000000000000000000ffffb9053588", -"pubKeyOperator": "825120c307ac8f3b6278c3654a687300d9b588f06d8813fdca61cc5e0116f85f8502cfa4d11d795b5df5b473bf3edfc2", -"votingAddress": "47sYxqGhFCpM1JE3LR2oYKim11jD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ce2e89e0e9e7e07b8d4a660f99b86eb258133ad42208af37b373773f909ffcd5", -"confirmedHash": "0cf60a3c2210bc2cc15c30e9a90e2e780398a5000c72906b1000000000000000", -"service": "00000000000000000000ffff2d4c9a4b", -"pubKeyOperator": "8a957547288a50adffc379e5e6b8bd5f96a595f86e4f3bd59494a7f44df86277e4f104518936aacd24e1016b2a724644", -"votingAddress": "2YKgwwxopGXZABbbCfZFtZmiGcvE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ce4bd4a46a650339531b830e691351ecd4110606d75b0179d4598e249fe51b02", -"confirmedHash": "e6a44b335d556552a28a82e936103f2917af881360a08a9a1300000000000000", -"service": "00000000000000000000ffffc2875bf9", -"pubKeyOperator": "98ff6b963fa2d2f2e17c8c268721775dbd9b5553f38eef1df73f2956a432a808597a551474bca7e1f22b5ca34d371a2e", -"votingAddress": "ovui1WFsTs9yZj69WHhWdqLkPk4", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ce5fc449370a111d0572b0cc10ec351a817f8cd0f1307bad64734b18c457040f", -"confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", -"service": "00000000000000000000ffff58c64a62", -"pubKeyOperator": "96869f5ced98e1e398c39f7bb877326913e171b10b3407540c431cfb7cd00162d36fc4984c98254577429925b3356c5f", -"votingAddress": "uBEJwFZRUxcgVViBGxJko2Z1wT6", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ce69a8b2089b860f08d2aa026f5323de982de1bb53791b69d13d805b49f12e4c", -"confirmedHash": "40626efb6eb8248c253fafae7e84fa5a667395b4af4e05851a00000000000000", -"service": "00000000000000000000ffffadf9058d", -"pubKeyOperator": "8b3b7d92a0255ffed6f6294aa62abcd1c7db6003a2112c9dcd56b633484cd2fd1ce00c77a1bc291048c5e0ce8206356f", -"votingAddress": "2zeW5QjbxVMua61ofJZzQeFdtgEE", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "ce7c1e27374f2d4dfb734d8fcd1f4994defa00e2446814158036cf7efde3a356", -"confirmedHash": "3a7cf5edf1a73e23173fbaa885a6ac1ca1b33c0d306511022700000000000000", -"service": "00000000000000000000ffffbc2815f2", -"pubKeyOperator": "96ee4ab7bfd67ba1a334ebd6960267bfd765f8e115f04cf58007c9c94bba56114c81a4a7be4d62d55d1a160aa3db29ab", -"votingAddress": "4grgajzs9pCpVRDL741KHNAVHSX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ce81a5ffd8223aab3547e9efc967a182b06efa26a801eef8e8562144cfc01d5c", -"confirmedHash": "c23e258631884923d43f264eaf58db10351f2d9eff7990103500000000000000", -"service": "00000000000000000000ffffa2f34c17", -"pubKeyOperator": "99d92edca932191dd3cdb966d3b9a78c8ade5b7e5a50dc3cdf9ecb57d2a5941a749c7ff25f8bd6d3d69a5bbc2e9d357f", -"votingAddress": "4Py5kcx2JJGEKM3VQPvfWydN7y1y", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ce85832288d98c09706496ce69e5c39fd8bb3596764365ee0bfe02ea7c0596a9", -"confirmedHash": "11a2ef62763e686c1298ed9d14fc43dd7725a1fb08fafb7f0a00000000000000", -"service": "00000000000000000000ffffb23ed774", -"pubKeyOperator": "82753af03f0f2914b4f5a3310cf0cd5e214cffeeee32b1b710c2183aec65dc707402726df2586536c7c92a5ad8c74326", -"votingAddress": "kgC7s9ybjkHc8z76BULKPYn2ZDa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ce9959fcf0919eca0839012481fab0c1b9aa9414033f7dbf3b0048385c86c04b", -"confirmedHash": "32cd85e933a08ed5036c45050497f3ba60e70f2fc72f87931100000000000000", -"service": "00000000000000000000ffff2d4d81eb", -"pubKeyOperator": "86b4c161539aa8643d4328b8f09f185ba4851c99b08c3ed14cb3b8a6bb932b7be2fcad59df90bd3f3710aed2f44d7eca", -"votingAddress": "cXGocxqUckPJsHiH9kXWsUdiohz", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cea93e0f83c310ff150429ddadec5fbf22bac26ee2fb91f63fabf1c5cbe234cd", -"confirmedHash": "46542746e75feced73dd534d2dad33ff8500c8765256fe351d00000000000000", -"service": "00000000000000000000ffff9b8a9a8c", -"pubKeyOperator": "95d982364bdc99625f4d98d111db2230f3e8ece6dcda59b2b775ae19aad9b2d2d70a66feeb6ae42c0424d92670c22973", -"votingAddress": "43brgDsjJrPvwoAjoyLCJWwHYYfz", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "ceb26940e39de0edd8bdcfa2d6b428293a2bda57883c1fecabcbaba2cdcc1e5f", -"confirmedHash": "6fe9f107bb213e578ec82888fe6948e6ce30b9132776d8460200000000000000", -"service": "00000000000000000000ffff689ce6fc", -"pubKeyOperator": "17d623a88814eee98a9daea391e3b799a1caceb8f0e3553ca9c2cb86826a4c9f680cd9d40e3e0a3a63e1e4f2d9fd210d", -"votingAddress": "41hNo7Hce9QJgXNyCU3mE5ws1Dcf", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cecc935cd54c64fe01d56ec1198fd2bd833a3d9e02bc8644e3c103b5858ff99a", -"confirmedHash": "77f3095d792e59f24f4bc6a02e8423a5aa4697f2ec4f6c343d00000000000000", -"service": "00000000000000000000ffff330f7748", -"pubKeyOperator": "05f565023c06cdfe0fdd7b3ab5d7ff8ec6c777ac8736341626449f6d12b7d219f99e1fb56edb7edc0bad97f7d0458c3d", -"votingAddress": "4MEhpCinHNHw7YgWBRLK9kTcYF2V", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cee65440f39cafc81aa2702690880a751021805ce94731b67756f3896973ba24", -"confirmedHash": "3001eec6eefc78b4157d5bb2d71a2b968a5ab664221972c60d00000000000000", -"service": "00000000000000000000ffff86d1b918", -"pubKeyOperator": "8c4bb5f02613c2504d3b305e9b9acb29b36d2da2df3dafc975b6f2d849c650ce099a25b861d2309cd6919f4dbe645655", -"votingAddress": "VtpDXNYXMeYYVJSHwgmi8m9DRt5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cef88692fcbc11913dfaa45f5ea8ef71a6677862b45efe5a48c4b7b0f05b6a2a", -"confirmedHash": "50117a8a1a53621b1db3b397a60d0578b55410297d67fa7b0b00000000000000", -"service": "00000000000000000000ffff334dc20d", -"pubKeyOperator": "92b18f58b3ecfb75e2906fe2a9f154b56162e1bbc9ba1cc91af3feb5657baaedc08542f7d8bd03a644af046f66108e94", -"votingAddress": "4AmWLbGgU42i1romSXwfPb8U52Fp", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cf047e10622eb9307de523f4810c27647999a57f78948b1bd5da6598ca0a5705", -"confirmedHash": "60f9b61782c44aa9bd76f86055dabdc3cf1ab6632d24b8172600000000000000", -"service": "00000000000000000000ffff2d4d8f35", -"pubKeyOperator": "19d45ade931917dffa5b26023c07140ce733e5e340dec434ef7ccc9522dbbc533677972c6236686fad153a00e38643fb", -"votingAddress": "3vX6vdVU4cbxxfJSqyAdFPV6ACE9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cf18872a9275b5ac3324311eb15889d4858983bd881e5148d866a0f3de26b771", -"confirmedHash": "9e0716929dbcd18f3bd770e0faab334a747c94d9e29220b50500000000000000", -"service": "00000000000000000000ffff55d1f10e", -"pubKeyOperator": "15091576b33e393e8f15c531bc7019b783a9c6cc740365cddb40dbbc5bb71df71564e6114ca30d2a1aa5f453e0cabdab", -"votingAddress": "2vrUxVGEvrmXKnJY28J6P2kZmuFG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cf18bb4eff04ba1af5d6003cf0eb489e39f10dd674222e6c7c65a4cc76309aba", -"confirmedHash": "9dd1af2f2d2acd280bf13812f6c2b8499a702b9a8bced7260c00000000000000", -"service": "00000000000000000000ffff951c4ce9", -"pubKeyOperator": "0dc9614c2e85bd43c1501d61eac50b42ab0de6858d4caa52a8c63e9ea8124c0300e5c7b351c3d160cce94a19be05996a", -"votingAddress": "FTZojTkmRyqf6F5pg4DA1bbWpkp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cf2ebb2b02f35f589b4cc6b9ec460f2059d1ba3dd1acfaae2a22c773951c1efe", -"confirmedHash": "f53336f5b4ae3112a1dafdf08a3f840d63af51639c059a570b00000000000000", -"service": "00000000000000000000ffff5fb3f834", -"pubKeyOperator": "87c3af5eb4b01e84fb62c3552efecc18d4ab74d11e0342bf8fe7e2e0cb08dda550141c2516a3dcf936b7aca6da2d8530", -"votingAddress": "37MDhVpwzgHEVQoWneaNVk2QQCUs", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cf3844d8c604b162414f7d931eb7b2aef67a8d012c03423d43dfc41c5dd8f672", -"confirmedHash": "790acc3c6e44b61cdcd205c64c13672cd701e4553e6a85f82f00000000000000", -"service": "00000000000000000000ffffc2a3bdcf", -"pubKeyOperator": "8e2f82c9db5fd189fed4dc656a698a013afdb7fc6de00a7d3a9072dcc40569498df54b79a065ce050c64796467b05abf", -"votingAddress": "4Tvdb2p5e8gbcKbKi4454rDn4CVP", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cf39de0e1e371dff5b81c3d2edf2ff1dc22531ae6c5a665534aa920299c3fa30", -"confirmedHash": "4130b5dc087f489c12277f886d58978ccf05fa57e694729d1400000000000000", -"service": "00000000000000000000ffff52d3151d", -"pubKeyOperator": "90d533885a7607f41f49095983563db64dd9c0973d2b5b369f527abad7fade38ca923f83146dc3c56fe1c7422d00a2d3", -"votingAddress": "26usy5JorX13YBQSSw6PKVp7b3ZQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cf7ea38b4cedfa96d596eec99bfbc789c99479c34002bb83ad8e7460f9327147", -"confirmedHash": "6f69270581eae87b3e5240b2357a51e657d56f47c5ab16fd0b00000000000000", -"service": "00000000000000000000ffff50d1e3f0", -"pubKeyOperator": "0a66e3caae115aa6f6a2869c6ab064e9a0b6a671e16933944fa52819a47fd2ab688958e844f90880e4a21eafb527d60a", -"votingAddress": "m3qSiGvaHPJPyCNF7WXyLME1Nyp", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cf865d8d612b9e7c9aea97e07483ddc585550f563875f04a36f8d79893d5b922", -"confirmedHash": "31906c52ba237fb114c3780eceaa77e0bee1d4a52e8cb5010f00000000000000", -"service": "00000000000000000000ffff55d1f246", -"pubKeyOperator": "08e07c516d431f48a75658363dfc36510e991370e3789087d05d600ebdadd18ba0972508e42e4eb3b21a475c12188894", -"votingAddress": "3WAWNL8mDWP3qyCX48bf7khziG39", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cfac6b2b5e58d470e8406a24371e1e2f509c7852c5890949e37cec3e3bd95994", -"confirmedHash": "0ed2f3505c75b1970dafae2262d789378e00462404f2a2e81900000000000000", -"service": "00000000000000000000ffffb23e6e2a", -"pubKeyOperator": "01024933306a3433b20f8a330e938a8b6404cda43af4a42352109637ac4cc189c5fd0e4d848d99f3163e3ffc5f716414", -"votingAddress": "2jryC5GpbPj8xbQ5onJ4aV6PTJDD", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "cfbd1486ae2eea9c940b85e8f56c28b05dee0f7ad059df47e060613f6eeb22dc", -"confirmedHash": "85294091ea22756205385db6ca1b5328e6fca372a7b703e40900000000000000", -"service": "00000000000000000000ffff55d1f230", -"pubKeyOperator": "1763f7de576c4fa8d51010d2eedcf77c9d48e3b006475e212d205f87bf176edd95c3530f5f3120295c638ab2ffe72ff9", -"votingAddress": "3LezyjVrbSG13Gaivgd4BTcfhHHG", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cfc172d6fcdc17cf098dd3a59c1d4d4fa296f413946424b6670b7fc340d1c0c8", -"confirmedHash": "83b4d3c9aa2503f44f202247be69202816f45498cc2040950200000000000000", -"service": "00000000000000000000ffff05bdfd3b", -"pubKeyOperator": "0022b5b5eda7f67a6f9e48433f3fbcd11c513d48d7d43e163b55b5dd632bbfe45608cc525e0216c60a38cbe23f208008", -"votingAddress": "c89ZpectfZSva74Gc4E6Cvn7poG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cfc6fca430ba2b1ee8c41267bdeee6ff508b08c6b7e4727ed407f2386265003a", -"confirmedHash": "7c4bf07be0eead967af3288d1d152106dd5f186ca43b7b801100000000000000", -"service": "00000000000000000000ffffc3b5f666", -"pubKeyOperator": "88d50e645ceee357a4e7ae05674735d96a292345c98994672398c25346975fa79c113cb4a9fefbce43e6ef6d79bbd943", -"votingAddress": "3cxqP4ECJJHD91ApN4ZSuw4zBZoc", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cfcbf94521e342d2d5f4a205a78ab1bbf3c3ec865f2da2dd4460a82f44e034f7", -"confirmedHash": "02d7d964cef6ea8cc2aabf070770450c4a7ce4d48d653a0b0400000000000000", -"service": "00000000000000000000ffff8f6ef860", -"pubKeyOperator": "13aed912609fd287cada72848ed03d3db607173c30254672c01e4c998a2f0a93636cee444e3ce78a5e74936cedc064b6", -"votingAddress": "FT6UnaHGohFReRNSMiifG24zLCQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cfd40991d5ade1566b9f31e330b939687d08bd0ccd7d9eeffa9bcaca1aad791a", -"confirmedHash": "1e42a1c5e2e49dc2de62049615a20b491ad0414ffe3841f80c00000000000000", -"service": "00000000000000000000ffff923b2deb", -"pubKeyOperator": "81166a917f9a6838fb25b79e396ba9bad521dc3bb2d3e5630fd0e01431a250e8a15a9117ba17476e023a02ab7503a767", -"votingAddress": "3CRQanLydTtDuuqWkwHr6JKdxMTL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cff385c8a986589ae0ff58da89688260f413b2b7625bbd2e786b44f5b1deb0bd", -"confirmedHash": "aab4c8bce5e55d12933fe55601a9febaf7d40d4c675ad3ff0e00000000000000", -"service": "00000000000000000000ffff52d31533", -"pubKeyOperator": "961ffce055ca01cfadc65ea4fb98411c75c001d5f0261440be6732bd56bbab216d74b8b014c0375914cc7b04eadc4f1d", -"votingAddress": "3oik7jyDoJMu8FkDZ4Dq4K9WmiY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "cffd24a8c7560e9b6748020d986593a88c99b3df87837b59ea47d5e0a5887c32", -"confirmedHash": "966346da385a620e18cc86215c041dd37ba70220f2ab9fc31700000000000000", -"service": "00000000000000000000ffff52d31974", -"pubKeyOperator": "0203df62c526c1fbe7f260f2b3af2b916fb937922a0937def904a24c2780a028949050c8afba849c71d238ee659da341", -"votingAddress": "3DKP8SwEoYyKP3WpwknbgxyCumdc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d007e146023fc8f26b7ae396a61ad84e1241a00ed90dbff3af292482849a52e0", -"confirmedHash": "da5e0ed8ead369cf9ba21fd59357dc5d46721d9b5be963db1500000000000000", -"service": "00000000000000000000ffff12d32ebe", -"pubKeyOperator": "028896c466cfa29ef4a9e47570c373a1895d9563ac08632a761b48fba47b3cfdda463a1faa8e05a1166aab7c90b52412", -"votingAddress": "4JjvvHdCDBNu471cjC2VWehYK4ji", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d009dabdc4097f120210ff7aa55f581934d8699d1f4253e320ac998541ac0776", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688b0be", -"pubKeyOperator": "85dd0a758fce958c6aa9065348e8f4229be30fe387e33985160c82c68f22f773ee92d3f965627645421640590ff24f8a", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d02320d2261f420be782812b8c15dca72cd33e2a44b0192b1cf09d426d93454c", -"confirmedHash": "d08e629e93616e373ee7e1fa30725c6617dc3c6caa7287200700000000000000", -"service": "00000000000000000000ffffbc28e712", -"pubKeyOperator": "16ec8fab6eeb3b4f2dffd2346d1881764a1e5f8e9f390360891eba63872d84dc8d7ac0ba41006ec618fa6e1246194cda", -"votingAddress": "3Hh5vouGgjVTcujqiDNvvqWSncWf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d038c169deb1bbd26d6c83a0f535530348d05f7bc79457c31bda66c0f51f36d5", -"confirmedHash": "dcf4fa1724dad676ee2501b3570c3cb8fd26d347eb0b43151a00000000000000", -"service": "00000000000000000000ffffbc28b6c5", -"pubKeyOperator": "0f5152dfcc39ce31dc54006b914b07a1dd6d03b5717ca35e054da9e8ff17bb009f819b82196cbc8446d730a77a5ab53d", -"votingAddress": "3uUrbwX7AdSh3iLjXfrses7LGojw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d048fac849b904923362f78d768d335c28c439abd9c370d2c5afb300680f31b1", -"confirmedHash": "d4d6cabead7ddbfd03c09cb5d38f89bfe8fcc4be61b955d71c00000000000000", -"service": "00000000000000000000ffff68cf8236", -"pubKeyOperator": "06950874b973d4567db300aed5340399f1372945ef09d7f47b2000ac697a262c038eebe443321db9a05d99789e77fc9f", -"votingAddress": "2knaEJeWaai1782TLktN6Ck5s3iw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d053b35022c96cdd44a5d267af88f9c04d912fa31615a4dcc0c4a0939556cec9", -"confirmedHash": "bd16d1c8b774a499c7a7b599445cf672ba00aa5a47e1ef071800000000000000", -"service": "00000000000000000000ffff453d6bf7", -"pubKeyOperator": "8bec98457425670155fb4c6eeed65fef115bc587265f129bc26c63bfc44d310fa12ac8b8abff27c625a40e6df1f32f96", -"votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d05ad2b7c26f501975afd46dedef717c187522aa95c1851f228f4fbe791e579d", -"confirmedHash": "679c820ee63ea237625da38937987f98a5ab313e9851e7be0700000000000000", -"service": "00000000000000000000ffff12d5ecfb", -"pubKeyOperator": "18d6a75b4094cf54a1df1d37932020c9a23f28a79bb3dcb8e34c5058f891db8b8696986fbdc1c056617dc8efaf1e5973", -"votingAddress": "2vzYGavXBdTy9p5Crz2qdQzWLoFx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d0643120f6bcad7b1c318dc893d1ee016d377553fa0578d0a69e1547b252d8a0", -"confirmedHash": "1ee87da7347ff803f27e49aeb179234aac7113d8463cedd03200000000000000", -"service": "00000000000000000000ffffc2875ddf", -"pubKeyOperator": "0df3ca85bd5ee978c261f0f338ed0e51011ed25ef0f649ed7b6d186df29284251420f8251b97b397245a76adbb9b3aaa", -"votingAddress": "4E4E8dMjw3U6aCpTrNJtbazN1Zei", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d0837b17369460077b8bb8c4bc9373a9e1a8cdf55712ac6c6ebda6ed68ce31b9", -"confirmedHash": "db69e315713004a5e6bc6a6a758c56941bf9d14061a290370a00000000000000", -"service": "00000000000000000000ffff14cbf8e9", -"pubKeyOperator": "0ae60885cbc901c59ede34ea2cd77657b85cc281abf3684ad44794c36ab31f9ac0a96347bb24be4ca2ed938d210eab45", -"votingAddress": "Q4M6hwfeNxhSF2Wak9kR7fhws1u", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d084667a45152c7d6fb27e64c8b8cabee8e1baf7ba0e601e47b112afde1373a0", -"confirmedHash": "b38e566afd123d3ba6a79f811197247789566fa46f9c3eb40c00000000000000", -"service": "00000000000000000000ffff40fb41ce", -"pubKeyOperator": "85401739d4f6644f012ba9b1ae410ea6975146b63ef7e412d0a615bef5c4eaa913ee9f717be317c8e9dde6c206472c2e", -"votingAddress": "6J1AcEeFGZya5BaQWciWpdD9Y42", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d0abe45d5524c9ce0398707d64638552ebf6d666a1ec056722afe5626fd88ece", -"confirmedHash": "4a6daf127b168e882f067d5db59a5ad590d431af47f829a70f00000000000000", -"service": "00000000000000000000ffffbc28fbc7", -"pubKeyOperator": "118940acdd616600e812c4befecddcb099d853366987ee020905702495e59968982174b50128760592087ef499efc710", -"votingAddress": "2ykAeqKjcu9PfmKfa5r495UzKqB7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d0c5b7acf465c9468066f7d87ded1f79997730f134166c127c081f9ce8a80077", -"confirmedHash": "4761a33ae8950b4d4a8c6fb75e8259ad63a6bd58e666ffbc0c00000000000000", -"service": "00000000000000000000ffffbc28f165", -"pubKeyOperator": "13a2e9b12eabfa116a1a3474200c2ec6d31708788e9325abd9849ea478c62694ad2b40755587b9fb964e3ff874b3e0a7", -"votingAddress": "34QgvBQG1AHaRuDy7sZfcunqyM9G", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d0d32f95f863ac860b9ff9f4e0dd6ea3d563e730e3f50f3b5814aac6e950c2ac", -"confirmedHash": "1a3ec7ccf60845d2a548401471dc1731352ca5f1c65a73ea2100000000000000", -"service": "00000000000000000000ffff8d5f5be4", -"pubKeyOperator": "95ebfa6401023810ad9db0689cf0681538229f9a16aefabd5a8d68eed34b1747d154afcec60cba853ab950a18f87fb5c", -"votingAddress": "3E5G8sks5nTft6BNP14LiYAG6ZUW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d0d66aa7707e34208878941525fa030d7db6b60c0044675c805f7afead198b23", -"confirmedHash": "cedc00f0912b5e1a88a2a4745218334ff6f789f4cd18c1ac3100000000000000", -"service": "00000000000000000000ffffb2806d59", -"pubKeyOperator": "81410d3c8c152ea524185bce0e0f13a88129c54f69383bd27771271786cde731e3acbe1d3bd497e8789d6fb504c9aa2a", -"votingAddress": "3jqnDrCWGNTjppuDCRGx2CPaVTsi", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "d0deaf00dd4aee54bc24546c292efa347494a031c232cd2266ece05527ebe762", -"confirmedHash": "a2c71e1823ebe0696c61aeaaf362d8ff344500f19f55fab82100000000000000", -"service": "00000000000000000000ffffc0f8b29a", -"pubKeyOperator": "0b8e0f9fb4e37f04475f36fa62a3082ee5dd4e80c29d8a4ace110d44e43221fce353412210f58a91d3be8f2b9bbc72be", -"votingAddress": "22ek35UWSMrmYpsGKPq9FR6urY44", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d0f0238f26414de57916b0657b3df0309332167b3b1dd65cfbd060890ee36f93", -"confirmedHash": "e11b6319ba1c8de44128e93cf56d6f8b954cd0214ace17122200000000000000", -"service": "00000000000000000000ffff2d4c5c56", -"pubKeyOperator": "0abd4263bbb51f5036789f40a93e959a7118858e165ff455207cfaf431063df02cb1ad9997790d19d37c797d4acd0f8e", -"votingAddress": "3DRyvSP7Bef2FzDWvAYS5A5n4Ctz", -"isValid": true, -"updateHeight": 1760808, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d0f3f5fc86b3d319260217276fe14a8fca7574c79d0c0abe704fd2f19ae74a8d", -"confirmedHash": "a8711c4c379c28552edf389fbfa83c0718ccb547713c777d1e00000000000000", -"service": "00000000000000000000ffffce5119df", -"pubKeyOperator": "8a941a65f890b179824f4d9fdebeb598e57d79adbd2faf1ae48dd536d1ce8e274c68ca5d27850bfbf36eddb03b25aa55", -"votingAddress": "kzL1gQjtMgosoUhXvghVwgKSE7K", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d105b926a1d1d2c8585dddde6e933e2c8598a80170347ae9dd5512d76272f326", -"confirmedHash": "f195216e9eead79ff764f4be74383cb8e557eb6626b1339a1c00000000000000", -"service": "00000000000000000000ffffc0f8bdad", -"pubKeyOperator": "8b817dcf0c4233d3c71ceae42db90a1b630f1f97285b4ffd265387a088a7d38400cd705ca090bd9c0f4619a225e16c73", -"votingAddress": "15Hw9RM9K6EMuRCKJeyU39Ww2iB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d1062bf4ab1137702f60ae95e2939f6b528d5431446b7c6c65e0f9254779d142", -"confirmedHash": "77556ec306a9af8618cbfdba83d67557da957b8853936f7e1200000000000000", -"service": "00000000000000000000ffffb23eacc3", -"pubKeyOperator": "14763d91c47f39661197318786be4ff5cd763617389a1ee7d48f1da197d41f56e85b70dda052ffe43c73e9d469eb721e", -"votingAddress": "3YyJSfoAK2fXC86Rctb4VpmDybCZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d108bf90063683249387e4bbbada726534b0012de00ed1861116300c71b371e4", -"confirmedHash": "4ad2af3d29cb9e61973d001383e2ff06375355367c0786170a00000000000000", -"service": "00000000000000000000ffff74cb2a60", -"pubKeyOperator": "0c22633bd7b05873c80423fe16601bf43d10ab0f3047a93c930fb60a59f1dccabe5bd2292e2b199c8f3e4829770bbc38", -"votingAddress": "26JjZQrqskDm96J99fZGu1YkNirZ", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "d10d39bb6e78b384f8c73f8b773e210cf6f5dc885b9be366c383e35d6151b89b", -"confirmedHash": "a575c47df45f33e3d0cf9912cac9a6b0a54ecb3941b949f00e00000000000000", -"service": "00000000000000000000ffff369890c6", -"pubKeyOperator": "179052b822871dc0e88598f889ce5e6210b8202713c551801d9b425c67307306d5eac44911e8d58c695f8798e58b9d75", -"votingAddress": "BeU1ZtWyVfm7bdf5zxsrN9qfXtq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d12ce5dee81de9a0c590fe07909360c2a7103e0adc98069e04ec2c84ef3289e4", -"confirmedHash": "ea275e40cc5fc86b2e9bfa0d933345ec5bf6092dfd9bb4520b00000000000000", -"service": "00000000000000000000ffff6baadb35", -"pubKeyOperator": "82685afb6b382480ce1b7dd23b755a848dc917aa5169372dfce7b94243ba3f59f6a54cf84088022884601cf515e5c4f8", -"votingAddress": "n8U1iHQ8mKX33QBzLZJ5evxenwK", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "d1310d31557a7d68c23211f1fa6e07d2e429983767e1afe575afcbfafb5341ce", -"confirmedHash": "a1c4e4958182fbba80b3177bca14b06996e592fc29d32d414100000000000000", -"service": "00000000000000000000ffff52d3195d", -"pubKeyOperator": "8c2c18d0a8125aaa8f5fc6ac2f1885292149ec5b3137cf9e856613f1eeddceccb95c01d654c2649e864e8e6b0f16ada6", -"votingAddress": "2yrK9WjFj33HGUgFC8qabsxheoU1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d14c458e3c6ac57dc60202f2a193ba57b04b9d4e4a0a630d380310e2c8d680ca", -"confirmedHash": "83e29bca9d5dc1970812bd72b85481600af1502712d0cf5a1400000000000000", -"service": "00000000000000000000ffffc61b45be", -"pubKeyOperator": "17a144620d5a27d6a091ae728b7cecd271549ecf2dcbf8475589ea7d49b34d080854c83472a829b72887b3623847a1ab", -"votingAddress": "SZPRtFLMmqTmJoBwLmMnoxxVpPz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d14fecfbcf85936937f7fd5a40d160164dbb736b29f9a869be7535c6b6e60fd0", -"confirmedHash": "f63d21db43b34bc795b2366c913c60485d28692fd4ceb7fd1700000000000000", -"service": "00000000000000000000ffffa87757c0", -"pubKeyOperator": "8cff5757b16497f58cb66912e3f97461d4d2bb83cf2a34015918af8d4ab7da912ac116d4d6d835a4020f5e9732ee73a0", -"votingAddress": "3QW1SPNXjM7x7jEyb4ZbPqyAhKch", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d161b32670c80e76bdf20004704abced655f5f1c8116209925035db471c07c36", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688ee64", -"pubKeyOperator": "8d8068119ee773b96bb0f173daa97a16dc33770f16594c1f7fc2f46275db406341bafe4334d2fbfd927cae29f565664c", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d16ece260e421e464c133a8bbbc9a8c1fb222b0a907aef89f99a317e42950726", -"confirmedHash": "d345ec6cc15e4a746db45b2a6d5ca02b783a51ad785667eb2a00000000000000", -"service": "00000000000000000000ffff5fb7326b", -"pubKeyOperator": "8cc32fbab9e79e403b234dd9ac88d59044cacf2e9df4bc4940aa515d854ce705014fd5c0d10579d94f4f0f767df370aa", -"votingAddress": "4RTWyb6129ToS6yfLV499Q5YbwJy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d1744c64411f086e2ba216ae3f556ba81fdce32572acf09115b8825435257607", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b078", -"pubKeyOperator": "9393e1ab799bce795360dc53d1501f678d4cd9b6476d3d222616fe3ca1b33b0ad1d5fc82cb6306029ad94f586b0c2598", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d18a08abb177673a408fcb200aea9b828805a35e8a8330e065ee1e3ec0fa4162", -"confirmedHash": "f8e23de7efa28a7dd264f1a8354f4eedb069231f7d12bcbe0e00000000000000", -"service": "00000000000000000000ffff0502493a", -"pubKeyOperator": "134dfbd79285df62a29ce2632a477678874b8723030116299f7069d1d8e07108303a2173c3413ae9618ddd5e65eb0cce", -"votingAddress": "2gj7gG4uRS172WihJTVWo5TQWgFH", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d18cdf0c8ad824ff894742c2fbb2b4c8487df5b96677831c5f3bf3aa5ec6c1cc", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffff80c79eaa", -"pubKeyOperator": "92cbd4d603e7022a4acbd3a90d9918897ba4c227ab3d3e2351d72e4da8da6b8eca92703d5630b7e3bf1a1ff62dae4446", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d1934e1da96606c6df85e3dc6298daaf48b2972fad594dfd80fe21f075a432a5", -"confirmedHash": "ae106b4e448f5045d0fb397ce2093115cd3eed6227f868561100000000000000", -"service": "00000000000000000000ffff9f597105", -"pubKeyOperator": "802bf50260a119a62c7511b95017cf2486423ea8ac8d051cec2725a6b90bacebb10bb17f25d4c8aad3af5bb47daab72d", -"votingAddress": "4Xg6qSpvzeTuBFTSeidKkQ25FUtc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d19bfd6dd3a3ab54f5b531ebd752d4641451e1d0f03d85b2f0aa82a9060b7a5a", -"confirmedHash": "a1fac75fe3ba5b1ee29c0b89dd2d1557136096701cffc6ec1700000000000000", -"service": "00000000000000000000ffff52d31521", -"pubKeyOperator": "0a58f58351e62787eed69ce59771859e8988a4f6239bc1b170b38f4e560c1be220f49ab4199f193d58888ae09e521bf8", -"votingAddress": "3ku6L29nQb8SPFqKjMTDycUXbYF1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d1b8067c9206ec3798c7cb127825f220d86f98178ba7d419d27d2b6eb058cb57", -"confirmedHash": "ae79d2df536d7e5cb14e79a89a4f8d31e9b8662bfb79e9300e00000000000000", -"service": "00000000000000000000ffffa12352b0", -"pubKeyOperator": "892fc0e02bff6e41f119ddb6f7f0d475a2721f101a26830db026681383fbbfab0cfa488473b51f511edab979ed915b28", -"votingAddress": "4MTycn3aPkP1inHzzMXCP7u7TTf5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d1c460f164d911fd8ac051c0aeb4e49a09f2445e59f2fc8cd9a08c54a5cdb0d4", -"confirmedHash": "e42ba254551de787a267a90dbd5ed3343e1041e93eac2f8e2900000000000000", -"service": "00000000000000000000ffff33534654", -"pubKeyOperator": "0e27d7b1ac0a47ee73b58dfcb3740c16a5b9be1d5098b53e7f94e0537511499918d8c229938626fe91b61eff8aa739cd", -"votingAddress": "3MjFJGWJ6sy4ipQ663Ubc5wJnXpm", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d1d59cedacada0a18445429e573a9ff857a1963ec20b65d9a6017b35bf4e729e", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688b3de", -"pubKeyOperator": "011650a25773b4560f105ad785f52deac558489d167926e4fa3d609c592f7a5d37a2072fccafcd787fb2f0c29d9f9fa9", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d205d6a43f852e2321ae2e9268d95406bb8acf4a96ca91cf06afad031687a3af", -"confirmedHash": "a26dc300d061e7e42266c92bf2e7163df76b4812333729b40600000000000000", -"service": "00000000000000000000ffffa8775789", -"pubKeyOperator": "0c8d81af493441d4bd2d70cc1371b71e5addcd533f6c56fc0bcbce6f3070f9b21016745c4a71e3672b37ab88f84f8fa3", -"votingAddress": "EXKsHuKaa68xQi3MDwrXaK72tpH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d20721e943f67ab913f83797d053c693083e892923588e175cc38fbcf630f64b", -"confirmedHash": "82659a0a8a30fdfc6af7cc8fb5f8dd3eacb54d254a1902f80300000000000000", -"service": "00000000000000000000ffffc0f1d43e", -"pubKeyOperator": "14eafeee61a0fb6687f630879c084dee11186918c4a55b3c69e3cde038191dcef12aa8ae7bca0d6850b31bb8da6f1f9f", -"votingAddress": "UDUmrt9HjnkZwZvNM7b58UasnCX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d24f6fe4a40f205a0a5a18660af422783c68f9a8874d7737fc3ee8abd0718315", -"confirmedHash": "cd1e9a0715f8168ddfda57ec446a907741af4bdbe3d946b60900000000000000", -"service": "00000000000000000000ffffb23eab45", -"pubKeyOperator": "8321e91b3a474049237d9b6238c7476618fe9e5c352b140e3f399341bc8954151da5738f7fdecd6cdaebc044ff8223e4", -"votingAddress": "3QamSvDDzqy5fdkPBE5oAWD8orM9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d26783184d0c2998b895c4fbd93ef6b32a31d9f54254443752dac8bb0c93c63e", -"confirmedHash": "fe0745f86dd38b82f2fefdf60fbf8a925790726d32b2c2f70300000000000000", -"service": "00000000000000000000ffff55d1f239", -"pubKeyOperator": "19641adedcc86f4752177d1128873b14c296a0a7bfb3582410bbcac7744daf1b0e1ac11a2d9c09b15cd5dbba1f9c7fe9", -"votingAddress": "2SSMqybwvAkrGWBRedGakW4aU95b", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d2679ab405721166d336b3a05427576ddb9599911ef55de8b1b7a3974008f7e2", -"confirmedHash": "728cd1420be8662c2ef121919211e07cb590610a76b5b5540200000000000000", -"service": "00000000000000000000ffffb23f7985", -"pubKeyOperator": "0968219ba8b3d07f6ca8033e06b99bacdd7b9dd8d0d919d2bd8e3f3fff50fb0984d91b63feaa4311ab2da984590b4068", -"votingAddress": "4FbcUzDP6SfwznwYUNtVXMNhDHj1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d2767c0f4b311748b259d4e57d442b9040d3722e995a8405046c4c5f65cdd1e6", -"confirmedHash": "a78f0d31299d8bc71df07f685978e00e60c5e91727a0c2872c00000000000000", -"service": "00000000000000000000ffffc0633608", -"pubKeyOperator": "94474de7fd5ce826749f6adf09f69f839927a4e89e1b6125567aefabc932108b6e37880306adb863e7323ece369592eb", -"votingAddress": "1hoUpcZBJFKgeBoiP82oWpSgqGk", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1760688 -},{ -"proRegTxHash": "d2da0df281c0a1a7528b63960a0a48193dcd38113fa413e76683553d685643e2", -"confirmedHash": "a226e69a5bfd401292470fc800bcea75413cc4fc48c292550e00000000000000", -"service": "00000000000000000000ffff52d31978", -"pubKeyOperator": "1077c446ac94daf3be46af0d8bb666335542ff732e9e24ac9c3c3940ff45394d67c60c5adc24830651b7ddbc0dae82c1", -"votingAddress": "4RLYc8s2jCQ9Ts3ZQDRTPV9Zhcfw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d2deb4bb4cd725fe71be4e59f1201844af5203ca19c176d33d14e614f3e77ae5", -"confirmedHash": "a72aeb78c333186139bd0f64e428cba2c79c2f489f56dcc30400000000000000", -"service": "00000000000000000000ffff9f41189e", -"pubKeyOperator": "0c6708f4b6c45d22a00755f1be21e1292f37ad88ce931d5e43c80e6c2b3c69ea896e6e36fa51e9403b2cc7c6e81aab19", -"votingAddress": "bZdanRy5qvDNR8Qvp4gb5HRCaqc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d337134df6e1a69cfca7af57bcf5d706d43932f40a2e53bd799cbc23957ad7fa", -"confirmedHash": "e029cf04446b721b2239e9bf0f1bdfa6a6f11badb6ddd76c0f00000000000000", -"service": "00000000000000000000ffff36270a69", -"pubKeyOperator": "170961004043c26b4be55e8da64d60357e72cbbbdd693b45ba218e10e05a22b63776b631ca80064e2baca6e144b44a4a", -"votingAddress": "4EjtV5HnKxHCdWNtExQnzEzzE1z2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d35c6f9212c5d81d506ac9114f30b5ba5fd125f54205968f65b9086eaa1c3ac6", -"confirmedHash": "60cd0b3dd596215d8df49cdfef863f3f5e2f1dd23bca021a1400000000000000", -"service": "00000000000000000000ffffae22e9cb", -"pubKeyOperator": "88b4342a1c9996f56589cf46fdb7372b37a0dcb56252acca3c56e17b87eb21d6d2bffb3a27fc641bc98f2574762f6bf4", -"votingAddress": "8uPPM86NfowQsHFMEyyy5mEGX8y", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d3651b592a9e46497e89d2a124764f7e610889faa5f7a767266795eb056dd856", -"confirmedHash": "c84bd7dc855a1b8eff6a6048a440adaaa68e41a9ea5792c01a00000000000000", -"service": "00000000000000000000ffff258b06cc", -"pubKeyOperator": "87368e0755b9b145d13cfab35e967f59eecf665da014f3025fd4247dde1ee749a1fbb0912e32668fc1c410cc2760d1ee", -"votingAddress": "4YXGZC7zULZSK1heb8ns9aqquNHJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d367e045c3c4587d5cc85815416f2ebc62453b06bf9669fe04fe23c7aa9b2080", -"confirmedHash": "e54c00dff9e89b2cf50846f47b2a7cc910dc46cfabc8a2d00900000000000000", -"service": "00000000000000000000ffff58c6e419", -"pubKeyOperator": "0fe5a54aea4f1bbb2b7d13891359f096afc900443af3fdcdb45ad4a03090ad4857ab45de0d6b914c915d38c2611e1172", -"votingAddress": "3ayQRHFSuNaANdLz3XUFMsXp5qNu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d37cfbe7c08af86bfdc5f7e1f5ad15ed9b75550c8b67e452634c428e55bb203d", -"confirmedHash": "bf974f793efabca02947b0168a84fcdeb28e434fd6cb99b71600000000000000", -"service": "00000000000000000000ffff2e659ee8", -"pubKeyOperator": "953ecd21728bc274870260f4276bbbe4ed0ff3cd3f7708ea9560680bd618f9bb14b2482f77170fb634bd64dd997cf2bf", -"votingAddress": "i7Mm2sT9kNPSZPVbEiPQj3XSrsc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d3b5ac925b9acb1213b6f888f83c4011dd37923a56827f0f0ea9351200ab2812", -"confirmedHash": "cdbeebc4a3580b1d894014dcafb37c7472a5131b33ac100e0100000000000000", -"service": "00000000000000000000ffff3e4d981c", -"pubKeyOperator": "09e107c7cf4f63a00322167112f63018ddb2cc5a8b8ddd1cff29feed98499f77088296830e6687c08f8a7fdcf3e0b05f", -"votingAddress": "38a36fFHRphkyD2f3LqNXdK5YLT3", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d3bb2b83870b3549e65dd900249a9887fad81e80359ad4067486751650e47911", -"confirmedHash": "946deb0023912f5f3049f88a458c8de07dbb2b4b1ec317bf0800000000000000", -"service": "00000000000000000000ffff8d5f356a", -"pubKeyOperator": "932386d091ad07fe18167772ca84a09ad6b8bbda0cb5eaf11cc49d792de46b3b794c9d14f669fbf4e319071dc1b92b72", -"votingAddress": "5TfuArqKW1WVJBRuw2k3ca1C9Hx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d3c0114082e4bef506496d8cbe592cbc00b377d136b59ec544b783b2d21b9f99", -"confirmedHash": "dcd116e71ac014d4da07a300ea21d78ab02bd302e9a053771600000000000000", -"service": "00000000000000000000ffff55d1f216", -"pubKeyOperator": "095bc8350a2eec2a9582f82543e75d9f6c6dc12655028c84b0d1082223ffa8fa0d4385d605f8f1c6466517f8c7508951", -"votingAddress": "qjwk3zmc4CkFUpsHE4Zsb4c5gWP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d3c630825058f15faa2b6ce80d35ba20147cd8c92f6af7ee8fc87c9a0fab4009", -"confirmedHash": "60d3af83b270df45686cdbcc85fb7a23d6982bdd7c0e7fa35400000000000000", -"service": "00000000000000000000ffff52d3195a", -"pubKeyOperator": "80d722388521768129bcc20f0a719f603233687d2f3acc6d1833dc0c25931a33d3b3172bd8290a91d942a1be409834a8", -"votingAddress": "42dEPtpXcFNw1qEQ6yTwyJpPjUHp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d3fea89e96c6c1263839db65e4a5d15d05e9155b0d9542634638c06a00f17e8f", -"confirmedHash": "0af85f472932784ec1b4bd6b6077765be28d84d4b0b1bf040900000000000000", -"service": "00000000000000000000ffff5fd89e08", -"pubKeyOperator": "0d9dca6235c5a6f0f8d1946d5e2619eda87fafa96688da8d2e314e46747ed2922804616b946b7e8ea00f9d9c8c433b44", -"votingAddress": "4Q6wU5s2RToJ5AkWHuwFFCjZS8hJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d3fff1ed4711e3192562fd385b64ce1fe84c346260fde8c5c5511c3b1ec66e40", -"confirmedHash": "f108569a85b2b9d5b783cd92cfd2907448495a20899302ab0600000000000000", -"service": "00000000000000000000ffff4f8fbc79", -"pubKeyOperator": "0797e6a99362c379c95b77f69ba2ce8a460aa1069301e40c7a562e3323b68529fd056e60f3c5eb2e960e5d4b85b2b6d3", -"votingAddress": "R4TyWVY9tT9f6HaHZrfcwvXWAbi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d3fff8c7bb913766ad3e98a1d36586c843dee91550063c59f917d96955b341cb", -"confirmedHash": "de4bfb134d277724e36535098b0629380483fc74bc95bf0a1300000000000000", -"service": "00000000000000000000ffff55d1f1b6", -"pubKeyOperator": "80da66d80b43fe9f94dbcae9ffa30a05aeaf5cf8044fc5899abb4294e4b32ad1e1b5917f69dd8676ab85a41a1a12fb4a", -"votingAddress": "mMQQ6ymEdKbHTKEMCqAoJGXfND3", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d4393fd355a2682f7ba6ec28c0e443afc3845fc7e3de3543759fc0a28e7f9f32", -"confirmedHash": "d3efbd7b64b0b85400d3e3737f63ec4d710f5a57882716480d00000000000000", -"service": "00000000000000000000ffff68cf8311", -"pubKeyOperator": "0f663f40a29289f8b3f10a82f12d5a75372b0682f9eb11ddba4b82150c526002490ee9ac3b2a2875283baeeb634aef59", -"votingAddress": "42SLbarvkWqGDKnTzhznEzs8xhj1", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "d43b490f0fac02d942436a4355d875092b5b7c23482b31f88a96a7e192fd5d7c", -"confirmedHash": "2e1ee4815ccceca4dc587703c377729b474ecf5d9abd24ec0800000000000000", -"service": "00000000000000000000ffff8ac97572", -"pubKeyOperator": "0302bcdeb5bf4a82e7771f9cb165765e7b2fcf2605311103414dd5ac0c1581a4dc1b3c00772eea7d417f268f15ccf31e", -"votingAddress": "2VEKY3cBJMHmqJLaFAu2pFdJU6iL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d4414b942aabdfac216cadddd9daedb12a3d5987fbb291ecc120782aedf5e6b2", -"confirmedHash": "95a5e79b6995ab3b7024607d10ad6d60e52d2c87b04899270200000000000000", -"service": "00000000000000000000ffff8b3b462c", -"pubKeyOperator": "8d7c56fefa1bcad04484bbfd8d8884a0536e34f035d186494fd5a84f481992d796d44f9c2e148b71e8150fa48f3969c9", -"votingAddress": "sL1MBHdMWn3xQbHhPyFCLxmyk9k", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d448905322486302c50f63941e5d8b6766978cad33f4278e15e7aa75c8ed54cc", -"confirmedHash": "f9cb3cdc76cccc547962ae37ec14acd900fc9978f09c7ad70d00000000000000", -"service": "00000000000000000000ffffbc28a308", -"pubKeyOperator": "0ea6752dd1e19880a503ad2f87c580e17a6624da48e9980e55fc7ce81614d401d887352ed880f9cef2a82fbbf3184ed7", -"votingAddress": "2rbrqWNNsxYLiDEVw27s8gk5FSFY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d44f28c4833b6bb01fe09606b20ae315853baf5a7a0263e23abc40cd3fbc9855", -"confirmedHash": "d4cfbcdca20f9690dcc9ca3470d55b1a7263bc5af32c39781d00000000000000", -"service": "00000000000000000000ffff88f46346", -"pubKeyOperator": "18c187875a78f71e3435943e135a75fd792bc8fed19cb121f18b9b1423ec00bf2ea65dcc6dda1a6ad9c9a90cc1ef796c", -"votingAddress": "hWAxP61Tfe4Azt7uDyi1UcjepB4", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d45948e7048513a85c8c8437218f4155024e552c69dc276767630409db266536", -"confirmedHash": "465975bf50a709322f5c74b28d3db7f32a0f6dadebae52330000000000000000", -"service": "00000000000000000000ffff2d4c5ead", -"pubKeyOperator": "099b8b1ab3831be8d0ba705426ee55809c61f6b16ff9381aa5d76daa312f77ca5d1b055d7f5794201c7b049e35836f46", -"votingAddress": "2LZDSrWp5jpWcboVrWYBnDPZzFzm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d46cb80cff7e9a14e181b48b44ec31286436a7707caccf0d55f2f16a623c794c", -"confirmedHash": "9c816f737175c6ec7cdbfd27cedfe7d511ff9c63c15bb4320700000000000000", -"service": "00000000000000000000ffffb07b39c3", -"pubKeyOperator": "1106584da9ceda3220bad41b432099399b94cf3abdf92a9097721691d71d1449b9749833e85f0dc1d032e4a43f0df756", -"votingAddress": "4RyGAJUodD8ErQwJNABhhXw5jC77", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d4955f6dca73c839d64640fb3d0014288dfaf0df4c2cd08630a3d517209e0b18", -"confirmedHash": "b6f653632fbd544a2d38b2d5040bb9fa9bb89a02c89c43401a00000000000000", -"service": "00000000000000000000ffff2d4d2876", -"pubKeyOperator": "10d4a334b9f032f196660052f911cbbf6a847744df83481ccd833b0e40e55ab4f86be22979ef4f69541d45a8719e27e1", -"votingAddress": "3Qs1DD2ttwhmmVCcEdDKrp6CnUen", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d4a193d3898bb271b6788f15d68bcaf5f420d6a5a1855a95d86ea4a04453b1c8", -"confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", -"service": "00000000000000000000ffffb9453729", -"pubKeyOperator": "0559c3018e88c553bf9ab9de736aca2e2e9304b2fa0061e1bfda00269d91f7cad8b97ae999b4850c5b434e8cc4fd2a2a", -"votingAddress": "2RcQ9p4f2HMb2Xv8QjuoDDS8XP6", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d4b09904c9f89cbf9067fa558b57e9dd2195e5d6c40269f02d53861171045bf3", -"confirmedHash": "80494b9a7b0699e7713b8878c59610d2c9a811a93896c8262900000000000000", -"service": "00000000000000000000ffff2d20b81d", -"pubKeyOperator": "904effe5d2e320f8f2143295c973ed4c384d71e07c428c50f5f0ac6f1b7fbb94c906d349713423c210325fa312a9494f", -"votingAddress": "oNoBBJHQA9pQSFLLbw3zbHDuYs5", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d4b580fe518168941c010004e5199e1342c6ed92c7e9f1da14bc2d1980772e52", -"confirmedHash": "cbcd952a5a40c5190752711c00cac71c583c25719a9bff170f00000000000000", -"service": "00000000000000000000ffff2d20e934", -"pubKeyOperator": "0735dd3d91fdbcb36764733c55ecf71a28e76221ce625ac76d059c1834d56e44f94d33af03c4b331c7b1eef23302311a", -"votingAddress": "331ixzePUPaGPBcRUbT6FwTYjiqg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d4bc111e000202e785901e4b91ecb8312c3b4cbcef8754641dce83895fd0f9d2", -"confirmedHash": "d2ab9aba862d6e637fe0ada3cff9911e3c5cc72abfa85adf0200000000000000", -"service": "00000000000000000000ffffa5e32f00", -"pubKeyOperator": "0d3b3b723123646b7e24d1e22d74cf50637a3863c0bc2a611e24bf26d16ece72ca8bbbb1883549db0c5836730c6e7bef", -"votingAddress": "2M4MdVDikgFYBUpSpV6WUPnJKiAD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d4c8fa8093595fe27c45dec5b7c95aeab20442d4061a9612f124c65618a44f36", -"confirmedHash": "0ca69b4db63a96e139ec9381ac930152b74b21a3f7e0f11a1500000000000000", -"service": "00000000000000000000ffff52d319b4", -"pubKeyOperator": "0f136f1f6c0b95d4a84b18559e486ad766f3dda272b88cb896eea64688ccdf4c80a920d8fd3ec9705734f238a8240e9e", -"votingAddress": "2vYRrsuVkPUbc2CKhEVU35WSDpey", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d4ca3cf65f937ae07a72a2752e1c9cbe96f545d9af2ecc18872a6331e7068ecc", -"confirmedHash": "230fea54ae5a22a74d07216909ff204fc0a4cf53bcf076250a00000000000000", -"service": "00000000000000000000ffffcebd8344", -"pubKeyOperator": "110672099d2ffb65023efb3db11bdae6a63528af875c4f558372f4b4113c3e4be20986590127d3751a50d0c839a70b8d", -"votingAddress": "V37bdW736vk8j4PwnRXtvVPQZaT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d4d7ec19f732e7dc00bb6985e6ae443d7db398a644d984917d6126df50873594", -"confirmedHash": "fbe9ae692745c865725846a2029f892e2135b7198c21c6fd0c00000000000000", -"service": "00000000000000000000ffff05a12fd9", -"pubKeyOperator": "001ac7cf76780938030a8ab5cf66b59bc1081cd2b2e6040455ebf689d8b0313817ea6952fc9deaaa5eaabe10bd8c8c0f", -"votingAddress": "26b3ApAiacmMMmtQsgBXNT2A8zn1", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d4ee0e234942854db45e5b89ec1c9845dcd70df445d052fc6f0935bad08c5051", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff9688e052", -"pubKeyOperator": "95e808db573c628a7b2d50248ea212539283b52004f29f6a8a7e38712e6c8eafb89d95b59eeac4e141a2815b62218569", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d4f3f70bf57793480efc39494d2753793b006b19d6a8237e8223fead1f9cda47", -"confirmedHash": "7753fbf7505b8e58b38832f199a21989dd08b7ee4f07ce0c1f00000000000000", -"service": "00000000000000000000ffff92b984c9", -"pubKeyOperator": "134b5935bc85f101fc59e98885a2d62e907bf1735b1aad9c7056630a8e1804f5ff8f133790898d4f0c0b11f0fa78fea9", -"votingAddress": "3amMYEQS2FgZWfuG6EiQHLEZRCjs", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d4f79c859843cc6fe198eca1b46a5cc451974582a2711846142aee4f91f8bbca", -"confirmedHash": "f5d425113eb85e5897c53565ffd0f90b815be6b18d4d331d1100000000000000", -"service": "00000000000000000000ffff90ca5261", -"pubKeyOperator": "959c204df3fc74ef9ea14a803371d3cefdb58e333dd84cf884ea02f41050a65cf1947969dd4982fd2b34bda65a0919cf", -"votingAddress": "372mCGWeZxo1c5xqMLaktrUizk4R", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d4fd1a59e1e98f81dfff6beeed50297867e5577c89f432eb1a3c02a4767808af", -"confirmedHash": "42877aa643545c02cc6dba2ea7192b576e94a6ea12093d0b1c00000000000000", -"service": "00000000000000000000ffff2d20e4a6", -"pubKeyOperator": "1917a7f645d164261da286b035bb259351889bd142d9279ab8ea27c311f0333fe6f201e86c9197cf39af987a07090d71", -"votingAddress": "bFLpk5dr4xiLgDqhqKp46gLNq8C", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "d51999c6eabdf8ffc66ef07f8aa78d3f9221a872d313e6f833d13ad5eb201ab6", -"confirmedHash": "0ed2f3505c75b1970dafae2262d789378e00462404f2a2e81900000000000000", -"service": "00000000000000000000ffff9f5905b5", -"pubKeyOperator": "949b3d5e4b3ba9bf8e9d08ac5e7dec34c037eb23a08c3febde0af5830b762c8b75c1ba52043f27e9d5947019f1f62fea", -"votingAddress": "2rHkcK6217s2JCzWTCqZMkj5Xd24", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "d52d8adeaa92b3cddf652195c82d8623f8e7906527c202e86ea204565439c5f6", -"confirmedHash": "bd936997a77919a79dfb1ce246e1067dbf92f329782f3dfe0000000000000000", -"service": "00000000000000000000ffffbc28e715", -"pubKeyOperator": "85637722af4cd44b479d09825c683199b39ab79c87fcbd36bf5c5c0b5e467e8ace7a22c9b0dbd629dee781dc6640f777", -"votingAddress": "e4dogMZ28pfH1UbNDJyXzvGjxH8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d5338f4312dc89a445df8360a4d6e0c18b456f9caae5b0c642745dd871519ef4", -"confirmedHash": "1f825ac78e2069946ae1e3babff0c25f8d6d4dc7dce10fe22200000000000000", -"service": "00000000000000000000ffffcf9afec1", -"pubKeyOperator": "097791c87e59ce043e2878672d97310370b23491827fc1453895818911fa76ae8195bc457ec85475cc8a6d7c5aab4845", -"votingAddress": "41XsEKXMsqa1RdEP5gLuF3aiZVMp", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "d556770fa35979984c74fed6209870656af9cc71a94335ddc572cb87615aebab", -"confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", -"service": "00000000000000000000ffff58c66e99", -"pubKeyOperator": "1095f7c7962a925ed870e04c1f60fdb43f3ea733ac5d802fa9dda54a0ab2a69bdd209efe6b74e5769556e4b3eaa025ab", -"votingAddress": "36kjdivYNdnwp2RD7BXyREMoSLQW", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d5682f1cd0cfc6c17e29618c08b00cbc61362518ecf6f963693bab6b38ace6ea", -"confirmedHash": "960cffe0dd7c1e3710e3804bbd1acab302ef47ef4928be221e00000000000000", -"service": "00000000000000000000ffff52d315b2", -"pubKeyOperator": "0e174ae474071ca7d9bcd0f8f1d011e82a59639faf2db95232e07c48ddb04885a1239135e90be5f640dc149d07798ccb", -"votingAddress": "G4FMntMPegQa9KNfz5C2GTN1E31", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d5716cec437eb60a75878231c2226560d85973ee99316209147e39b56a5ded1a", -"confirmedHash": "aef6ce4203bc3d19e0ab00bf4f1ea1178ad5094bf30cb7052200000000000000", -"service": "00000000000000000000ffff17a300ae", -"pubKeyOperator": "8a8c4e4c4bec3ab0088ad7206a4144ba40ff51b47b16152298ee708a312150efec7f10527d74373b2a6d8cadc0967c2e", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d58eb713711077c1ddb26a708186f5b96551c8c6fe6349d766c7070ce59faa9f", -"confirmedHash": "6c06c7238a59b02cfffa6df275bb263cc492b8a7576c5aba3600000000000000", -"service": "00000000000000000000ffffc0912e3d", -"pubKeyOperator": "9838f7da1e48fbc21268fb59409aff497ca73f8266eace69db5c1eff5cd02aa49b2a2b048231a7c1893669b0e19240b3", -"votingAddress": "iXBgnxmXJUz1QYRrDEUVP3xRgsd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d5ad063dc64c2285076bb63b9a8a0295f6d51ba06d37b954fd2ada1c4257d28f", -"confirmedHash": "31ae48fa744fd80bb3e56363f9946d2d73d262145c0a9ba42200000000000000", -"service": "00000000000000000000ffffa5e3e45d", -"pubKeyOperator": "8e0949c9bf4dece21c2c7eb78de4e50792db36de04592033da38111be5726931ce6252c9cedddb9f2df775a557d6184d", -"votingAddress": "3bDUqgtF3SqHzELr4xJVG1Tb5B9k", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d5cf112f3413ad170cc6e1abdaf3bafd86915b78e39677fe249c313bec70d78d", -"confirmedHash": "b79d573ef18953289c178ba33bdd7409378296e6061c83dc1200000000000000", -"service": "00000000000000000000ffff9de62404", -"pubKeyOperator": "1720d92f31c9001ceaaa7132d7a7a1031cfd4b38bacba9b2a448f214104d5433ebe317a30658738fe774a14d4b62299c", -"votingAddress": "4BbfSqYdnUpPz52oL5yJpwJ5HRnk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d5e6e668de9449f13aa8639aa5b129d77b39440a0baa56b17ae5443079e2744b", -"confirmedHash": "50bc30e9718919f4739ad5f6041d4dec0fe45e93b95641221d00000000000000", -"service": "00000000000000000000ffffb23fec61", -"pubKeyOperator": "0b6d0e7d52f618d3c9c4531d5033aa057a6608e01de4d529062f3265477f7256a039b3abd972ac2a69cf975fc4285921", -"votingAddress": "39FYuRuR5ZexWv3L8fAYe2jpR68n", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d5fa2bb1607983f610c589f60b511bc3a6b100dc363d6f6e715949ae7d563dda", -"confirmedHash": "79be1ac86a7432a51fcca6b157caef62826877ae21f0143b3000000000000000", -"service": "00000000000000000000ffff6baaeef1", -"pubKeyOperator": "15587add8368454379447eb74e2bad91dbecee73430b6dce96eb6487cd37285a8959aa58a6fdf37c17592b4892d84687", -"votingAddress": "3RbGSi816dai1E6B6fHrxgcCm1LV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d6120a808dbe17dacffa5a201150d246d788911d7ea07cd830edb0a1786b278a", -"confirmedHash": "0335ae53e370bf027f1bf8e91067f51e0e004a03797f4ebf0900000000000000", -"service": "00000000000000000000ffff3e4d9fe9", -"pubKeyOperator": "0fddb7945c0bbfb34769dd049a99f839948cd527397da7dbb9498c8cbcdb82aef4e3ba2131af5d92f5419f81a85735e0", -"votingAddress": "44mxJcWWia1pzk7o9FKnZWX8eux3", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d61588b08baf444f594c8f004ce68eb4ecfdfe66332eb7a59843b3fa06b384b8", -"confirmedHash": "32520b0a55f8a8cc04a0f405da173f0bbd62b28cb0e0fe862300000000000000", -"service": "00000000000000000000ffffa7b36f8e", -"pubKeyOperator": "90fd360e0eb6a2906a7413200f5315a9effdb9cd1da74e6d8b9bcf9712b176d364d33af2fe10e0f28b3f6c84b48b7e12", -"votingAddress": "3K5WWnugpd1QEZd9vfeUnkkvcZXP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d62abd21e17feb8d3d962a8d2174a4bf6a450089bee9c1628d3e2bd29b1dbcd1", -"confirmedHash": "c6f1252272a54a4e7af7879f4c2961d8c4247d2d937b990b1200000000000000", -"service": "00000000000000000000ffff33449b40", -"pubKeyOperator": "147a0e2a372f5e854da2f7a0e12118cd42a432d8ade725e8b1e98f1f2aee05f30db654182e28cdea4f84839e651c4402", -"votingAddress": "2toCRZVVo8ab91UNEqspkP7fc3Sq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d6341057715ad87b8b20f3165665d1e076fb7db2684247edd0ee62b0855b1457", -"confirmedHash": "37f03c4ae27ce385faf2873c3274e45dcde6b7fecee55fc42f00000000000000", -"service": "00000000000000000000ffff9f59a3a4", -"pubKeyOperator": "874514e51f7bd2b198968b768ea71128e5be6a2c3b721affd477ef7e387faef4e1713fe1e2180f3f4a0910f4a6532875", -"votingAddress": "fswHkVyjug1WY5jW6ALrAfMcZ7c", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d646be72c4897e815b637290e562cb6524a6440831c36c1b5a7438eb06bbad12", -"confirmedHash": "43b3caf59cbc5331ce20c7c1be57c84ded106d611d049e4f0000000000000000", -"service": "00000000000000000000ffffb07b39df", -"pubKeyOperator": "8c8d4b34b91f90ed0d562eb4a504960693cb647148ec5961642d14d4037eafe2afa8450ab66e5b173361615a163e80cb", -"votingAddress": "CsnFEiVzaQqDqKzkFyE6qjLV7aa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d6791f0bebda5d74cae3a2d66184d6d00fe09924b871556a627b69f3de5d24e6", -"confirmedHash": "5c728b83e12f67dbf5ca845e9660f9c5b68da657e8f953700c00000000000000", -"service": "00000000000000000000ffffbc28b244", -"pubKeyOperator": "0a4bb155e5c2c3fea641f46a6510ef23d1f9d2813e61ae1e6a983978491013d2337e1715578c9c451b9b411fc18c13b4", -"votingAddress": "B4HRxToprArrcUKRwsFbzb33xdF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d679eb34d4efa9556434b75ee618532bb38ee035ac0e8f9b5435f21919eb60e0", -"confirmedHash": "f517850c04a0d7e780e5dabca65ae052f318f6773bbc93790300000000000000", -"service": "00000000000000000000ffffc2875b19", -"pubKeyOperator": "0bf4cd80c095ecb28a5d9c6473984a19af49e471bfc8a5882767354d69167136752277b1a7a7a6a9e638027885c2f09e", -"votingAddress": "qUHXDZKr8aBu48JdqZD16YbVwaQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d67d6546866cab6d12c44a9816245a120800f568b1f718bea6c29390d78cb2fd", -"confirmedHash": "6bbac2ae6fe2ad70673ffc9e2efb40d78f90ec30f510f79b0c00000000000000", -"service": "00000000000000000000ffff52d31923", -"pubKeyOperator": "8a2c376ae40d217b5c7afecfd18493ef29ee32716d66c7901cf6d70c978ae62f6ce37dc0b30f603fb6c097dc9e7dca20", -"votingAddress": "4EWKyPC1SRADEqEPM3wkdgVV5zGv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d689eaf7bfdd626a822359f02a0c466d25bafcd7944b5d8e63c7516aa705c142", -"confirmedHash": "aef6ce4203bc3d19e0ab00bf4f1ea1178ad5094bf30cb7052200000000000000", -"service": "00000000000000000000ffffb9e45354", -"pubKeyOperator": "0e89e74ab7ca34eaacb9d0170111ded16a5ca19afc47624aa1b4b3841d77cfa012ef094a032ecf8a016988bc30e45f87", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d698bf5e89974e18274273e6933214a3965e457180cd9790dbedf4e4a7160d11", -"confirmedHash": "06a2867e36d150643de89d87c53c9b6b9c6a195f78ed8a580500000000000000", -"service": "00000000000000000000ffff52d319d4", -"pubKeyOperator": "18ae95b135aa06e06975923b1225b05379f951ecc8ce587d3684b5594c9466ff5d072263d233620790b4be9259373809", -"votingAddress": "3HJwZzTqms4Sihwf2ruZ5n53D8Fu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d6ac556e92c6df76f4b620a3f629fb7580c19a2cdd0dd886ecbffe7f48284ae4", -"confirmedHash": "d72f45345dd0473919608f03503693e163e6b2f99d74621e0d00000000000000", -"service": "00000000000000000000ffff55d1f1ea", -"pubKeyOperator": "0e7d8330ef5b709d7c17c4fde3fdeb13fe05acdd757b03ef536d4314a51b174c61f6c278aa2f32d522fdb47cfb00ba02", -"votingAddress": "3icGEzmV3MGHpTHbVuGX5JrVQYks", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d6d2799d5ed1083da844564826e1cbf2790041fb602c69382fbe03d2e5e7550e", -"confirmedHash": "9044f9eac1e831c83dc1cb789d206b323b464981744746f10b00000000000000", -"service": "00000000000000000000ffffae8a02bd", -"pubKeyOperator": "07e30e1c131b8dacca94b832314819e5a9b9d1a6c111990ae54d25f31de56772480d1ab546e50833b2ad690c52db9b29", -"votingAddress": "2vZu7MfdA8eW9ETm6RGNzABJG95E", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "d6de0cb09fc4f070a0d85d8c73ee396e305d51cc9465fc152cf3b56fbc21d7ad", -"confirmedHash": "6ad63bfb28225e407665c92cf032dbcd97acb3ea347c666b1600000000000000", -"service": "00000000000000000000ffff5fd93062", -"pubKeyOperator": "187aa3d3eabc56120307ab676e6a07f0cb9149481fc9fc3dcc7e3dd96f203e0f1ea799b12c842a42584a06fe1a5533ca", -"votingAddress": "2GHRjCrhsLmY3yRFdYvv3FRn6KL1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d6e2a6ddca4a5b2c628a8e799327c67d495418ed01e95a16e665f6e39fc44df1", -"confirmedHash": "cc12ca4ee0d2ac8230d702969ae5de1342e44496d6cacec70400000000000000", -"service": "00000000000000000000ffffc051dd4c", -"pubKeyOperator": "119cf857f13ccb50e0832a4a3ed0a609391d9bb5fede006b80a1b7dddd61391fcef1755963b9517409109cab4183283a", -"votingAddress": "33dVy6qE8WczZZhTHiwb6c8WJhWY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d6e3aa345d2f53e8906be8e600e524acfd93617e56f2a141558c61d4ce0cc7b6", -"confirmedHash": "60928db5ba3ff8888739bf8915bdd0dea56a47c80119c9812100000000000000", -"service": "00000000000000000000ffff55d1f14d", -"pubKeyOperator": "8e3dd52a79e74d851ec4a5c3bb602bccbfe0f5030eed89b8407f9b8950bc7b92be3ac506e5ee811ac2b34b26580ecb1b", -"votingAddress": "3eaZ6rcs4a1ZJ5jkiwmVoEgeZX6i", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d6ecf2d6521286d672c89fb3224e0e8964384a23ebabff2a306e518a7b1ecbd0", -"confirmedHash": "3125c76ac696bd20d9a9cf683699b05b8ec56181102b12471300000000000000", -"service": "00000000000000000000ffff52d319b5", -"pubKeyOperator": "00394c1240672607984ca3eb991d456691122f6d7a416d97c6ff7776e4154cf56a002a795e0e179ef6df19785e596da0", -"votingAddress": "2J84UKqgQw4ySpTa9z11xiSxJpDE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d705e6f97905f618daef586460b2b63c195df704f7fe7eca21c69663fb0ac6e8", -"confirmedHash": "b82ed978839adc127fabe7e0937ae10a92e1af1b172a72ff1800000000000000", -"service": "00000000000000000000ffffa1618ca8", -"pubKeyOperator": "8fcb43f8ae9f9535ab38b62cc78a266f70f90fb6dc0cf59e6b3c07796ed0829555f935ac62650409493eec4ec7981a2b", -"votingAddress": "4MzwVE2fvoS9HUfq8P34njCxnZ9v", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d70cf8ca85f804625a50e98d6e15dfc05247947e97d1dd8612ad618d7c723848", -"confirmedHash": "18aa9110e74d54b5f1c77a38a7bad0fa4788e56deccdaf2d0500000000000000", -"service": "00000000000000000000ffff55d1f1df", -"pubKeyOperator": "02e4f3e0e47d11ee58ae58f9619f6a4b64fc34d4676b038d39a72a20d1e5f8465f2032b34d3196fa32f4eb6f40af1ec6", -"votingAddress": "4fAVA4zdCU1hsih5kBpHfxMhNDP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d72afb60fd9f2f3311ffe60f723a589bdf3a0c8322ec51f97367de6871a4ea5e", -"confirmedHash": "50e454f08503f295b7f9470a0d1860cb8532a8e183d77c4c0500000000000000", -"service": "00000000000000000000ffffb009d215", -"pubKeyOperator": "0e10de0ae11b77f8efcb08db3c241b01cde3e3b01366fa6acbdc9192898e5be952a636b0ae3db2dedf8d51347465f4c2", -"votingAddress": "yknHXMQ3yP9AyWErBX3z6ufbccq", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "d73c48c9bddf5bd67c916dd20c6bfde12e5745d1002424d3a722be0f71f50d84", -"confirmedHash": "fd807e51b9044ed8945825467b7151afad3d89734540054a1800000000000000", -"service": "00000000000000000000ffff9f597b45", -"pubKeyOperator": "86ce2f9310595679e57443f4e594768148acccebb3c5a77a50b73a78c561422da0d19effaf16e646af96b35ffd13d17b", -"votingAddress": "2N2rcuaTc3swTZQieKAwyRAKuJaa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d7464ba61440e03748b0a10ae09df4a69c0d1535b55875e8a023197068c136fd", -"confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", -"service": "00000000000000000000ffffc2875c32", -"pubKeyOperator": "91541d25faf702aadb2de5520561f6445873b9fa07a5cbf2c5c4b0a01e182fa9c597c2876fac063eb1ef54db0f4f9f0f", -"votingAddress": "3HKdDdeJ4zm1EWGcABhpLN8o8xG5", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d750d0ce36256e0b638f622d38f45bd20b4626e60d6dc2539983bbc79f28090d", -"confirmedHash": "71c8256de8afbe4a1112098f8697462a22b8ce68fd7bbf460600000000000000", -"service": "00000000000000000000ffffa1619bbf", -"pubKeyOperator": "8906da28ea79eb712aa397ff15464aa7dfe5ba27ab1de45fe457c470b36bffbde18ff73487e3042f65c567092ac9716b", -"votingAddress": "1Zim1v5JihfhfCgGXNF1RxCULWD", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "d76799da738a6bbedfd6b87a750c2b607016e52d52446938f27911dcd2915d86", -"confirmedHash": "545ec730c74a19cfbdab4474d3373d168aa0d97f903852741100000000000000", -"service": "00000000000000000000ffffbc28be31", -"pubKeyOperator": "1706555176f9d70a201193d0c65e896927e5bfa4a7dc37ff6f7877017199d5d1da6da309d123f00dfc92f8c4c433e86c", -"votingAddress": "43BpP2tePuEdYArevr2hLHiDrxXv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d76e6527b6c9b91b7b3fe133185afc8eff1f6b3d07e4645b0d92ee22d2dab74f", -"confirmedHash": "5d5663de2e407152eb464894bd54475efbaab9f9d5f63e391f00000000000000", -"service": "00000000000000000000ffff22e9be54", -"pubKeyOperator": "1386b49b2129772f9befe0be790841e420ccf534f421c13c49c241695ca65da6337af8d30d718e4733c925bdad29b6d5", -"votingAddress": "47Qe3HkqjTWHC1Uamou38MUzWMXQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d77ce9f5f2f38dcc6376aef747642340365bcff42052a4c372e18293657d31ca", -"confirmedHash": "7df9928918243251b61949ab3d08bdcf910bfa66d20750531b00000000000000", -"service": "00000000000000000000ffff86d1cf47", -"pubKeyOperator": "84c0119e582c6d545c78b1e8289f4333dffcb104164efc490baeb490f63535ee3b1e6e6621298f2befd92911f2e423e3", -"votingAddress": "3Btdc1Lotzg9LZ8YDCcmqgd5fcU8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d7870634db1cff0478ccf3fe987ef4910d2826f83487722f9d684127dd125686", -"confirmedHash": "b28a1830a2bef6889f27a5a7092684d9ee25f614c61dea2a0b00000000000000", -"service": "00000000000000000000ffff88f31dc2", -"pubKeyOperator": "95fbf469f07a77d77c7c3c89f8b9991f5343090ec3a4633a8e02048cf388f53ad38ed76fc53563ea255fa6303c56da1b", -"votingAddress": "3mURktye8xfKHqDvgWJx7YedSbAX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d79b39521820e06b784ad7b1fcd43ffd438e77f393036d806a4415f8293315b3", -"confirmedHash": "c733aebd97dc38f9052e0251dd2c9615b2ced052786920491200000000000000", -"service": "00000000000000000000ffffcebd88da", -"pubKeyOperator": "10a65e71faae33d9d167b20d271f9d5a50bea0a711b2601b1e40960e7197c4b3cf4abe760893c16d8e4f0cd6d10571b0", -"votingAddress": "2JbNaQUR9wk2gwxAEiECEfW98BCu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d79f638b6e9f2088f68438e00a7dcb247e00e6cb47e809b4e7ad25578e40c44f", -"confirmedHash": "fe73472c7776ba0335f76108760d4f0ad5f695b290ed771f2a00000000000000", -"service": "00000000000000000000ffffbc28e710", -"pubKeyOperator": "995f45b6dda000c9b83a92cfd8101a54eeb57b54bb71bb2ab5c990ecc21c5759aa2cbf185116de81d0aba9bf03bfc0b0", -"votingAddress": "2VUmfsbsAPWknqR8qMVQv9Fd7Edc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d79f66e39adc0b665c51ef2a5a4494d38e65e883fb7c02236bffb203f106778d", -"confirmedHash": "1272078e91251e3ae739bad8061aed34663c177a23debf6f1400000000000000", -"service": "00000000000000000000ffff2e1ebdd5", -"pubKeyOperator": "958ffc2a6a2af98c4d902deebe9d946c477d901b1fd1d812e3f9ea5cf622762ecb74d9ca67e165719d0b01e1db5ff4df", -"votingAddress": "yfNhNpna3djiUJhqcwLp2rF2je", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d7c0742ff5feecdf9ba16028cdd20ce6d740e8134e726967b472e57c4e80e50a", -"confirmedHash": "4db5b3aafc6e597aadbb5e13559fcf29f3e03f3e79374ff50600000000000000", -"service": "00000000000000000000ffffcf9476c7", -"pubKeyOperator": "980d9cbfe63468e27b06bb20224f9f5a443a3a8d31fd4e7d52412121c5b7b2f6036089eae3dbbf36a1a7fa2fc1de654c", -"votingAddress": "2jiR21jiqjEBFFx2U83q6cak6zDG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d7c8eca7be08b31fc2a0792949dd614db3d925cbc58152aac6dcbdfb360192ea", -"confirmedHash": "8f2a42dd16742cc010251e848b6628f127ba6c9a770bd5052500000000000000", -"service": "00000000000000000000ffff55d1f107", -"pubKeyOperator": "097d130b316f998ea1c34157145162b729521e62c04855ad044da9242f49e4f5b7a37bdf522aa06eecfac7874698ab70", -"votingAddress": "2hcgNuFxqkDQakG3R1u1RJ15Ava4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d7cc6503ca24169190034953c21bb38589a76f1473bc641bd6bbcd76e7e6e61d", -"confirmedHash": "bf1c10af69a3614ffaae696f4153ff0b74bd6b71d5eee2480b00000000000000", -"service": "00000000000000000000ffff0509ed21", -"pubKeyOperator": "874a4030ed11f5b0e8da01c74828befef03fe961c7141e2de5ae1d76a7199571eefd7935201b17bed667a88b3e107da3", -"votingAddress": "3iumGo9SKnzk5MoSctiSU3Bijgkm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d7d41ff9c9739f2efebf7a6c929d2935c102dcd533fc84a967dbc499ea9cf2fc", -"confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", -"service": "00000000000000000000ffffb9453402", -"pubKeyOperator": "84f3401ea0fe72242d7cc5b555160b3376882bbe33a247bb9961d3171aa50042b6ae6ceb2281b9e0a717d867ff917527", -"votingAddress": "2K42P9VHEyaWgNbr7S6npSMmCzJ5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d7dd13977d5a2856f5a10cc9c471d4476c2f1e24e967c575a5c7e89192bf976f", -"confirmedHash": "e26a8a53769aebeb90776fc9c725b6ce3fbf45981e02349d2500000000000000", -"service": "00000000000000000000ffff9df54ec8", -"pubKeyOperator": "149942ce40c0a10d71c4a6400f99eab0398f40cefc8e1fa97df0d28c25cd50cf394173a528885b0449da1f90e05b601d", -"votingAddress": "23yiFrENxfBZJJrJ7DRaKMfhyCCi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d7de9d7226e3e161a79e8947e811f7f0a5936a7733ce413cf71fc8a6b81611e6", -"confirmedHash": "7705e9072b7a77fca4f0cbed0450aa274670dd6c956503820500000000000000", -"service": "00000000000000000000ffff88f31dc9", -"pubKeyOperator": "8d15eee82c135d0c79cfd61e1dd8c16d5165f70e04a545bf005d3b00b688d90d260babd985dcefedbbf957558a1a970c", -"votingAddress": "bDVCkJgXX9TgPLsmNm5CA9ztgsH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d7ebc94dcaa5695d242a8384189a9f2698c49b61a2b7597a4f85a9dbc75a4c71", -"confirmedHash": "5c2a3666e475fa89462b4b7f29cfaf78bfc6c7a0c6d309980900000000000000", -"service": "00000000000000000000ffffa7ac2deb", -"pubKeyOperator": "919fd573b70f6912ca41230ade0e73b15bd52b00fea4e24318ba5e032bcb2bb07442bb2a3db5aa1a56f9ca5bdb7797e0", -"votingAddress": "2NUKbJV3J5z98Bs972fmF5yhBVH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d7ed2d17ed54e1bf04d0b145ce6f97bb54b6d65001bb6a58baf3547fc631091c", -"confirmedHash": "65941336b2ca38d50462d6efc9bd5c1a796d0f9e7bcf8cbf1200000000000000", -"service": "00000000000000000000ffff55d1f1d3", -"pubKeyOperator": "82400d21e7603ae4f2dd5cfd10c51b1b23564297419cbeda5041a427b907df925f70b51c842b3d01d691a88feec70e2c", -"votingAddress": "3ttzkyiBw77vdG1uRiDPBaJmofUk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d7f46d32e7e7a1bf701354fd4a571dc955c5176102acb09a88f6839f37567d6a", -"confirmedHash": "5ed69af5b62eda9d9719d56d8b9ccab49a86c5b1d21beac91800000000000000", -"service": "00000000000000000000ffff55d1f104", -"pubKeyOperator": "05003fe4d02540a14cd269085adff09cb4797e538f0461faad8b19c79b0e96b5d5ceea02f303a9c736112a2b04a779c9", -"votingAddress": "pnsJ9Kd6tQmPsSSqqmUri8qHCgJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d7f6a305667bbbfd1d7241dacfb13a39e0d9516d87777f9348beb2989c5384bc", -"confirmedHash": "80ffbd99366128aba284394b975fd0d2f3960cbd783603f11a00000000000000", -"service": "00000000000000000000ffff8b3b3a39", -"pubKeyOperator": "050ebc291791650cf8596889a10a6de07909f069a8936d942aa1398cec823d7df3ca58455646cf72d10d14215c156de0", -"votingAddress": "2bcQLJBqEuAGVSDpX4kk2GVcKZq5", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "d800eefbdbce64c7370051de96170480e83acb194015226e4eb3ed47c827b9ff", -"confirmedHash": "eca5ed7bffb2c38e32206c2a21117018325474441e7fb6370d00000000000000", -"service": "00000000000000000000ffff74cbefe6", -"pubKeyOperator": "9185f8a9cbbe4a39084f37ab9326cb82ab3224ef962b332a5ba9746ff16845ce34c2e9337d4c43d1acf87269d83a40f7", -"votingAddress": "49SFCEjX7SJoxeQqeibvr599YUT1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d81238c8a775c79a54e5b3b1fa639d815feec6c3d5d6deb7ab4f19213f9d5c69", -"confirmedHash": "90cdbb1eec9ba3cd1db48af27cb35ae9510605f9d67b90fc0800000000000000", -"service": "00000000000000000000ffffb9a5ab75", -"pubKeyOperator": "1246f3d669e8e003114e172d6ac0dcc2e35a59797834907ccdbdb0f76e01c06766cc756e7d0a39b15961df18add026d4", -"votingAddress": "2TDSSbpYX2t4CwX5mMsCgBt4Cbmb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d819facf4adf061f83464e5ffb6f1969e5976450c77bbed1a375a5fc1f578e3a", -"confirmedHash": "35a7609a3a6c5d85265dd3e7432412ba2bc7918c12920f650700000000000000", -"service": "00000000000000000000ffff36270a65", -"pubKeyOperator": "9060a01f8b8f0bc6c9ea2aee8cde9946c97f5614ecadb892e4594d52c7660f1224ce56640de3ce1dbf57316a6a200570", -"votingAddress": "i3yYxKYgGzG5mUKRVTiGtEBfoYj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d81bd477aad6ece8db69360563ad8305ae8852b93bba55da3ac6ff1c6ece21e4", -"confirmedHash": "aa448d6b9b9fb9715189c3f26d54886688f3f889732044390e00000000000000", -"service": "00000000000000000000ffffc7f7036a", -"pubKeyOperator": "83e6e1774ce004b57fa3e76bbcae76768a77456f73249eb4eca4f9ace3abd5c7432a399772815624bc00c303ebd76a61", -"votingAddress": "28XFBLwem7qjgegUwvB4FnHbeom8", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d82831188e3f2945b19c05247c07d170c8fc08ac76460063538fab00f44b624c", -"confirmedHash": "77a9ca3a74cbe0e070d1cb53b02f4bce6662b330c04a70ad1800000000000000", -"service": "00000000000000000000ffff5fd72de1", -"pubKeyOperator": "049fdeb04bac8e284c74bd872a29fc901d3d299142fcf18d12f5b3cd6564dbbe0012db7bbd42f6447e0f3567981d1129", -"votingAddress": "1LJNSDfUe1Y2o7GqNAkStDEWvkD", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d83ffa427925b148ce33c301932ba5b8f6223fee954acaee054330ccf9c0d929", -"confirmedHash": "04d0aa7e2191e996084dbdf7ccdd5f752a6977f7c185b2c41e00000000000000", -"service": "00000000000000000000ffff52d3199c", -"pubKeyOperator": "9786545fe4a83b3faf64f742f4b7756a20b27f1fbd08463a49721018b5e16a312c263ba8e13e6824d4ea92824deb4817", -"votingAddress": "2iRi2e86jsc5KX1SufEMZcpmeC6K", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d844b865493b34f33505f4e7b643c4d087f6544245d07a96674ac69672d00ea2", -"confirmedHash": "60e0f3fdcbc47cd038384cc747e163d00ad92e094b2ca9712200000000000000", -"service": "00000000000000000000ffff52d315ba", -"pubKeyOperator": "8e0487b120a7787f4c79ca8d669d86400276439f396b648143d7285fcc771d2e2fe941ac8309a77fc6ad14ae0b86831a", -"votingAddress": "28mdJhqfBsmhRtkrJPDiNqk1f2hc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d848779beba0dde88b04d11a3a73ebbd0adfbdb870fde5cd0b793fa68f70b861", -"confirmedHash": "e349ebd2bc41819c9e2eb26b8efb58e5bb5d42321b7d92881b00000000000000", -"service": "00000000000000000000ffff411472df", -"pubKeyOperator": "88a594073c12b9966a99488e2cff9666c4e89ca316a4da205959abaac34cf16e675436d3ca4939fec427ca782383c8f3", -"votingAddress": "2rbYe8Gumj9Wb58yY6fxAdRp3RR1", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d84fa8992f9393146bc1a38fc6c19295038d5cce4a9ae71706d177318a503fd3", -"confirmedHash": "52443f4bb1700abf0eb5528ccc27698123ee95e8acc05e243300000000000000", -"service": "00000000000000000000ffff33c32f76", -"pubKeyOperator": "91b405667b3d64c0f7075acf20e10d1f9363e8656d322e5636f5eda3624143beb59e0b9cd97b7bdc84ac24bd86815c77", -"votingAddress": "c6FzwNQGDuQceY8ktQwetPnQ4eR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d8544a2d24b3eadb7a5af2517f72d802c3ca8ca737762fe2ccbc8d80a0a95dee", -"confirmedHash": "0f8bcc059b44030dbb864989e2b139b063259d60db4b65860f00000000000000", -"service": "00000000000000000000ffffb23e21a2", -"pubKeyOperator": "11a17a6b6f599c0f083840a5241a8f0dd4e33e0dfbd57b79d47f58892846989293904c1be7df0829e55e56d681b74399", -"votingAddress": "2PMCXEuwhsnAfBXWfpQTXsNWMkth", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d85f376aeda177cf16180a91d8300038a202f6f2cedd2e47bc0969db7ee620eb", -"confirmedHash": "a0e1e85694aac7a859beb26152237e33edb07c6ae5811cfd0400000000000000", -"service": "00000000000000000000ffff2d55755a", -"pubKeyOperator": "185372cb1787ebecf41b8a6110cb6bb88e2213f3dfd3a02159d5b81bc9f9ef023544a1057fe04e88e8b162d6c878f6bd", -"votingAddress": "wsZapL96s3yz15LJdxAhBaLrAja", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d87d092a516243d5bed4dea3489b8b0e6eb9db2fde7ed95e046f1716500ae41f", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b020", -"pubKeyOperator": "002705e95a6950a4b6ebe0b28a53ddc513ce484b0bf7bdaa435317ad758b871b1ac0c5ded506a8555c8a447670b7f64c", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d883de6600a9ea008c640adda00606559f48e2dd14b562d5d9452d7269a8a8e7", -"confirmedHash": "de80aeeaa2398036f29eb659bb42c43299bd844a67fb0d8b3a00000000000000", -"service": "00000000000000000000ffffbc28b987", -"pubKeyOperator": "8720cbc63e2137dab1807375a574b383220194a317b52f74e2460dbab4b2884d2a1bfab0474ba629232d5fde52c3132d", -"votingAddress": "2bf8Ewr5arPHbfzRzfggsXeWHmZA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d89cb6ccabd0b4b4240cd42f92add887f293de13a09c2967cb063cd34f25d8f5", -"confirmedHash": "d79eb2a5fb86119062da73a715853bf558cf3f7f0623f4df1600000000000000", -"service": "00000000000000000000ffff2d209aa4", -"pubKeyOperator": "030f383beef3c5cf77f34f77db500c055575e59955a6b6f57c1b791d8d96fb2e67e1af5f45351ab7c09ce616f7addb97", -"votingAddress": "3CbTK9xuVCKVsKFETexpseT2NSqJ", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "d8c7f48cf188c2bd5efb018442078ef1c584fd5f98fcaef029765dc936f18689", -"confirmedHash": "c8de078a0c3365b251d3ae316158cf54798142de866eeb091b00000000000000", -"service": "00000000000000000000ffffadc7463e", -"pubKeyOperator": "918ca940fbc37718a6243eb5e2d7f6f92bb68f2c8ea8fc02fda810c6b4ea56813008735d4c3331a7210b82706f1e044b", -"votingAddress": "2JT14M6WXkoyuEimAjTHVyDrpNRu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d8e63124091426fef78f585e599a9e1774950332249da48d4ea80a779e66d3c0", -"confirmedHash": "ce36e5522a4c547a07c5ded603da8ee6e8874709961b8f6f0800000000000000", -"service": "00000000000000000000ffff258b1d42", -"pubKeyOperator": "802cdeaa259db76ec4d23aebc6e012a65c7d53cb00a35686228ea4d170fd590d2dec213c841857655c2aeff0b5bd5fd5", -"votingAddress": "p4YP5A8ML1sEXEn9LdcUGNzPME5", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d8f84657ed1236871c9204826e528224fdd2c543aa7734f37c277387def7aac6", -"confirmedHash": "99ebeafba5db971d8afd88696e82b37efcd201f743c679261400000000000000", -"service": "00000000000000000000ffff52d315b9", -"pubKeyOperator": "029537994896c7b0a0d904c430744795a5f26e1b3884ed5ec3fab75303c2e711bbfdc6dd95e3cad265176ec01d81e8ab", -"votingAddress": "2G6j2egSh62ftcdvuonYQoMNmqTz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d902ea37aa2daf93b2c906145bf53a2aaac84fd89cc38eb44428e73266d3b078", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff23b69ffb", -"pubKeyOperator": "872f0eb377151c8ed3a1048e866728f484545ed7ae628a53c6607b40b113f256be89f38b1ff84e5fc9ed1611a814168b", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d923fc7a1fd6a082a04629f95b342313bc5215d7b93f376b09a7e9e492d3524b", -"confirmedHash": "8d16e11b316b1725713ed5c4cf218e2577c92964c6c577123900000000000000", -"service": "00000000000000000000ffff2d20e84d", -"pubKeyOperator": "099db4360aa11016807138c1d6ff7dac78e78f40ce8d0f5920fa8dcf916fdb5cc542740a2e6cfb368a3e45618908aa8e", -"votingAddress": "4YQp8dTKq7bLTQHccjMXEDgbsQmk", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d9301107dc3426d257476530bf23530ce691a17bcc6eae736101126a6e3fa69b", -"confirmedHash": "1a27964919999d8e2598d7b5edd62d008f1feb3a2e0dcb960100000000000000", -"service": "00000000000000000000ffffb23fec62", -"pubKeyOperator": "81350747c54fe18bbbb92ea1f81091a569451a89d850dadffc0f4aaf8d9cbc6e35460fc8bfe8d222a55c44d127a60c92", -"votingAddress": "3DnF6E3fKaxrNhK5SYm4SJYtcbQU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d930726be7e4386b75b321002d2a5ec69c0faf8c61c98b24c3de37ee95c68e14", -"confirmedHash": "255d1e3e9fb9e79a7d177951b7ba424de00d2910e6e9792e1600000000000000", -"service": "00000000000000000000ffff3624a628", -"pubKeyOperator": "16b3774a7e9ab12867577e537f7c58658833b966444ea75f265f535d628f28ba2379e82ab26425b462ffb5098281bdad", -"votingAddress": "2LmhU38gVkXVhdF9ufnHFChrW5rn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d9316dc5de941d3f48ffc05ae4fa1daedec9d6b13600d687054ea183480f8892", -"confirmedHash": "c832a591b52c01ec485c4cb7f252d1ef28183d7a714a6ea60c00000000000000", -"service": "00000000000000000000ffff9fcbc8fd", -"pubKeyOperator": "07fb1680fc227c76ae06b3262b7eebfdecaeaedfb1ee5235423ee8138952c7d3a8341603b6fa8a152d31ae0efbb682e1", -"votingAddress": "43kEtCPtY4XWF231Rh4Bwpi9ihXz", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "d93a3bf431308de83b261da5508e87aeadfd8397e43f7a25b4827728aa9ea41f", -"confirmedHash": "f03c5467532ea5cd4ee0b19e89971b8744bfdf695d9555531400000000000000", -"service": "00000000000000000000ffff877dce07", -"pubKeyOperator": "05b7a94d24b917df09edea7fa8d2cc82f60fe63e4a73a0590d739350e3749db979d118392cc04b9c526b2f878f27b070", -"votingAddress": "3yCk6i7nLrytYarkF9r8AWNjkQZ4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d93a6fe0a7e2392bf5f058cfc199f440fefb1ce909c8e7a6cc6ea7df82fcf38e", -"confirmedHash": "2995ee2c6db0df3006c1f6ad6786740baa14e983674e60e30600000000000000", -"service": "00000000000000000000ffff2e65ae42", -"pubKeyOperator": "99dd7e1273a1f3aa77c5e513182187e0b4e7754858b1ac5087eb3170211cac368ce7f3955220b527a1125593b9655ddb", -"votingAddress": "4QTigtYTrYe8ehyHMe8n9DpQdbES", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d94bbf6fd31008fab9fe9558e541fe7bd383e7bf5afe64634d5704e6903c89d7", -"confirmedHash": "d117824eef4155d979434fba3ba7e972dea3e35045fdff972500000000000000", -"service": "00000000000000000000ffff951c8cdb", -"pubKeyOperator": "087f4df82477c4ae9fa7992bfb1cc713895f03b4f0fe8d658a6184778f41420035111dfd2efa282b93a9aaef28a35cc9", -"votingAddress": "3KTNuqrDFHDHN7SprGssXdvUNBDf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d94f23431f33d7d035de5a6b307ea344c714646f21dc8dcd9dd4c9c8699a50e1", -"confirmedHash": "abe1d69cd4591d0795ef305f5736655c56cbecebd2a38e670f00000000000000", -"service": "00000000000000000000ffffcf9475aa", -"pubKeyOperator": "9713722d853bb680ffbe2fcc8c37fabc21f7ee748846baf3409c4a787486e73baa9238a913baa46772f7a777b8423aac", -"votingAddress": "4DnUZvpJgkqpi2EpMsHnsBCGbpeb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d964580bf43f2235c6ceee8c77a6e02d9db896a9ae7bd106369e84a027240b8c", -"confirmedHash": "e1800901288817f4b34e75663527c94d9a1676c4c4eca9263100000000000000", -"service": "00000000000000000000ffff52d31581", -"pubKeyOperator": "02967c4702f25804e221bc974013293cbfcd6f42ae198d68767cd23fbca5300b4275f85ce68b2164454c562574c4e446", -"votingAddress": "4N3ejrME66jjW3xMvqXjyTJHJCzf", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1760248 -},{ -"proRegTxHash": "d96dd0b0d473a621db021b0813d1bd32c78828c3ce8d34ce5cde23b818ba65ec", -"confirmedHash": "6839133c4d9bb2c0ba09c272a845d32163fb4044b59171061400000000000000", -"service": "00000000000000000000ffffb95cddd8", -"pubKeyOperator": "924b44455c65e2fe45827232dbc3bd709b7c16b568e516ef6809b1fc0d425ba9beae7342df62dd46241acceee2425be4", -"votingAddress": "2sH3CzycYtAvJ6vhtrmKMPV8GVWP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d97f0376406e1e6dd399e791797b2472f8cbcb57c2f5b7c84ce49c4a47a5fb0c", -"confirmedHash": "c4ec88afee462e135f61c442f48fe0010a80131050edbffa0a00000000000000", -"service": "00000000000000000000ffff55d1f1d8", -"pubKeyOperator": "82e5e0d30cc5e50a64423be2f9707c0e3eb741854bae99c6a1dcf24092ce94e263283fb6bac425d60e0d3a4437421224", -"votingAddress": "YsVXL4gUw11gEfiaidJA8b6KHA7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d997198e8bb26ebe104c532f8901171123f32c663672f998dbf2a74a507cfac6", -"confirmedHash": "ba1fb51ff239c701b47f62c1c2acd9b35cd765b45e7ce8440000000000000000", -"service": "00000000000000000000ffff55d1f187", -"pubKeyOperator": "86184f3395ec8b5dab247e45b9db290dbb943826adc2fe883bd23d975e2cc6be26a08a69e3085dd1715e72635b18d3b1", -"votingAddress": "21pnD9cVXfWbRft57mkmDRfD6Zrw", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d99eb9beb66d4e51f2ddcd4fc6a2184c12fa5b07cda025ba64812451b66298e7", -"confirmedHash": "90b328fc25e0e96a593ae46cef1f6d95bd113d9b5a49855f1700000000000000", -"service": "00000000000000000000ffffb23febc2", -"pubKeyOperator": "17df002fe2e3f8775d6f102a94d6e3b3d5351dd4c8469fb7dc7611efff26d974e3aab9a0c583af40f8775183296c592a", -"votingAddress": "27hc8f1FTPswB2UeDrG8yKx1XfJW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "d9a5eff8e4fec22472b1da2758870c47fafe87eac1d2ea00e2e537c7ac26a8fd", -"confirmedHash": "2dfa4588f6158b45237ffe2a2f8205191927ca2d46c591161500000000000000", -"service": "00000000000000000000ffffc2875dd3", -"pubKeyOperator": "96fd90441b1e341a32c9588cb369db663c6dd080da6620a636c9d97efed5e703b7aa5eecf8b831c40b01eebe1ff85cb1", -"votingAddress": "jXLcvZNdbtrK3ZXrpsejvi6i7x8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "da08fc58f3895e7fc2c5a8d89ffb2e3a2d627607f9667000c04b24e1fb40f64f", -"confirmedHash": "6ed8f22c66a07a06751e7b0912dce887ca348bb5b313188f0a00000000000000", -"service": "00000000000000000000ffffa5e8bb16", -"pubKeyOperator": "0dcc882f15743749ae6ddbef9e1be822cfd51a10a353e9184182d02628ea251d0f0d52f545b80271f83edd3113da0144", -"votingAddress": "4FrMsTMoKWqieGXR22JrR6z3hXdx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "da0ceec2e8ed0c2c524ee8efe861889759fe35c3764914caaceaad1d1def7e48", -"confirmedHash": "f66924afd1d356b7e1cbed450248a3c94c669262962d13170d00000000000000", -"service": "00000000000000000000ffffb945361c", -"pubKeyOperator": "136803b9c38c253c981939c0f2838bea3c4476b7a80784472e19dbcd14dcda755a4032fc4d411d297af20f1db3fe6abc", -"votingAddress": "28mCZX5xxweQ8mjg5Jzz7P6VaBKX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "da194f2f7f18a8405179ad4186ad3063ff35981cdc7d2f8aac13f060458eee66", -"confirmedHash": "0d335e73f914f0e1af976387b6538a562e5344700f1c86751100000000000000", -"service": "00000000000000000000ffff52d3193f", -"pubKeyOperator": "835340ee087f26f79447f3a7fe297279ef8df88c43cfd659088ae6a1c7bfa9f5788947ad8c2e0cc3ca4a59e5d1b19609", -"votingAddress": "3TZimgiB499KZwN5F1C16c9xKnjm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "da23e9991abcab51e571829c32696b79c489af2be887dbcc231df954fe3305bd", -"confirmedHash": "111e672359382fb2f2842152fb25255926ccbf13fceb0a100b00000000000000", -"service": "00000000000000000000ffffc2875eb6", -"pubKeyOperator": "04325f99631b5f2212f5cc355bb22e6d9e6256d513171b10211252c6275ecca162bdfe711311484f021aba4d280fe6c1", -"votingAddress": "3prze8gjDebJ9ay854w4Xaat4xEK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "da26785ac01401c934f2d0f18f3202f492aedf63f52df895be8512aa9e76a748", -"confirmedHash": "c38db702d04a6961923eff369ce27b8a26b1040c00ead55a0a00000000000000", -"service": "00000000000000000000ffff5fd85429", -"pubKeyOperator": "842f68bacea08f9534d06747402cac9a1bb8cb184619dda260a274631974ce51b0cebdd0bb83f0376770e0735221c87e", -"votingAddress": "4Wc9GHgsUPkBNHz2K4tzJp6NfhHy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "da27bbd66a51ab2053f0aa2b3d18212dac4598159a7ffdcaaf2229a0e489c3a5", -"confirmedHash": "7bf7ff15c9ed74d9c04d8dab0148f7fab3c90c5adc24860d1200000000000000", -"service": "00000000000000000000ffff55d1f1ed", -"pubKeyOperator": "1957f91e6ff7bc3e1434b563ba3824e109a83f590acb5543427a227e91687d7091487ea59b2ac90e748d8bcf1cabe960", -"votingAddress": "uYocKadpZTvXtTTsk4nxmkJX9Z9", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "da28935f20428ea021c7e6e99e712586922d2181c7e832f2fff15efcc5d0feee", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff03633adf", -"pubKeyOperator": "808fbfeeec4c0a805a6c18f845a8d6166addd99a8da3cd3c319f2224e17e6b754d8235497bc8e5f7a62ba8d94abf8a61", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "da3dfb94481f169b78b8076cdf03c3b78afd4daffcb702d4a39f0cae9f941a9c", -"confirmedHash": "0d05878b4d490d6f3a4c2aad1c0b5af8ccb0b7e5bde54bc92300000000000000", -"service": "00000000000000000000ffff86d15c39", -"pubKeyOperator": "90f1cdbcc85e2b5fe6913f362290ab9a1d6c959f9afb8017b49d3781cfdab286c9b17df4dbb19c6dc45a31dc72f30069", -"votingAddress": "3TJ5ediqSWw3LwP6FYsThsCtvR4m", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "da3eba7ebb559ff7354fcd5cc67b040ee83fd1afead745d1cfa6eb12470af8ae", -"confirmedHash": "e3dbf70717f745c72f584edd07d178d603e3f3034c5c46961800000000000000", -"service": "00000000000000000000ffff9b8afd4e", -"pubKeyOperator": "93bdee88449d333acf4f27ead5c68af1a6bbd577eac41087c277fdf2e3a9a93e1a77a1c62e67e2e6a3282a3d3da73266", -"votingAddress": "2v9fqesoheXjtHEcw5TTsNCphNKD", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "da44aa378313c7e55339e23a40d470f08a0a20ed136a2f2f772fd802114c0741", -"confirmedHash": "926c92598103e4f12bfa8fd8fe95737dc4e6303d12a67ce61300000000000000", -"service": "00000000000000000000ffffb951a592", -"pubKeyOperator": "15becf08436079ba7c612a8dc96eefda1e306078b317784af0ed282f288bccdfe5e4f822a555cc97332869c7b0adadf8", -"votingAddress": "r2f4qbaZViqkenWvoZtqdYsc6Qs", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "da45374edcb86c2054c7b7de54d638382b09b5113cf144fd7050acdfbe380fbf", -"confirmedHash": "41ab00fd542d308240d8661ba11a4d8e9fdcd838374deb543400000000000000", -"service": "00000000000000000000ffff5fd87e20", -"pubKeyOperator": "08cad8053d78706d2e21efacd78401c1184316106e44e2b2011737eefe4c232f2e5c5efd929da2dcd103fa989a0ce786", -"votingAddress": "W1unkYQUiiLHpf4P8WRrRXWKDBb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "da765a67587274b796687c0282dcc715386a985b696bef5ca802200bc3f00da9", -"confirmedHash": "f95d58e237f90d5bf906336283b059e02687a467f1ce27b71a00000000000000", -"service": "00000000000000000000ffff8ecacd64", -"pubKeyOperator": "801c23720228845c52efa1bdc9a0fc0273014cc2c6b5bebeeef04447792b29cb4096ac6ea85714ad1029dc3cf3745a64", -"votingAddress": "22qtbvUZz9LDpJSdpS3ZZxV5YkgR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "da9c3c1e28e9d7f51447366aca6351d022d2be0412ea28ed71c6a4a6e7d142c2", -"confirmedHash": "aef6ce4203bc3d19e0ab00bf4f1ea1178ad5094bf30cb7052200000000000000", -"service": "00000000000000000000ffffc11d3985", -"pubKeyOperator": "877b82bce5884749ac054a52466302b5b854835615c1d0b6c6d818f7b64eb207b8098768a03fc2738f80ff9bedcef061", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dab10fbe91051a9c170bcaaba33463e490fb0c59909fa5dadbdac3ab4f570569", -"confirmedHash": "f9936f68235ad2a83aedbce5185772765b6830953596fbf02000000000000000", -"service": "00000000000000000000ffff3625c7e7", -"pubKeyOperator": "818e66a69f7a338e911bf71f0cf39e8f8bd0b935c4d20a854213750fb7954fd71b458ee0dfe84ad8e80934c9a17c8084", -"votingAddress": "2wU6rgehWrqJZFtfJ3wsvgBAywo7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dabc4ff75fef226635fedaa91b273afaf8e475587f812707e6f070988fd17937", -"confirmedHash": "aa5a99c8ed59a52278524e01b094bb552800b10b3b4a693f2200000000000000", -"service": "00000000000000000000ffff68f85af8", -"pubKeyOperator": "0d7dcb21162ada05e561ad66234b36f6178587b1f38c051200911fd3e22c584ad368454ac90a3ec5c2d3a791419cd5e1", -"votingAddress": "2VWad6KkVBFoXUW7BQQVfsjLKnbn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dad529afcdf2cdf705126f8fd8561f4083256d3ce00bea49ec9cee06c3576887", -"confirmedHash": "c8a4c02b005ce10b461495f8ab55cb05f568e0d3724948c30900000000000000", -"service": "00000000000000000000ffff55d1f10f", -"pubKeyOperator": "939ac458195e7f4245f4dc6d2185f32d39aff42875d36b0fa51e97d03fb3b92d2001df4fb21a55303c9c92ea13505769", -"votingAddress": "3TrWZ3DdQXFqfmU8Hvy5CCjwYynq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dadaca459d1c4a5007549a7713fa863ba733a14a787271cdc699b132d0a7e120", -"confirmedHash": "e796e68f64865fe4ad58afb9703676638a00b1d98c477fee1c00000000000000", -"service": "00000000000000000000ffff87b5084e", -"pubKeyOperator": "96475713ea0ff74395eaf02db9f9f3a4c53c28d6013b1301af9b469b476352f576699ddbeac55d4383399f3b8f16cb61", -"votingAddress": "eieHz5PeQnjCtme5NwpvVFJuZ4H", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "daeec7d54ef55ae169a2cc00294c5eda9bcefeaa1e379ea4de98672edfbb905d", -"confirmedHash": "a635fac4fcc7c553d6cd0669946f0f67c9df69f02882d4d50700000000000000", -"service": "00000000000000000000ffff88f37381", -"pubKeyOperator": "16e810f1e6f3ee8617572ad61d4bbc70da8f7a4a8fdc9eabc8fa7d917ec19cba563160aac270a1256911caeb5963967e", -"votingAddress": "7iYF2ZoF3wzMejjKN1xZX2Fc8sz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "db0d8f070a87e2054e0ac8886288cf27a5cc6b6a0ad0a17d41e3590038402bd8", -"confirmedHash": "2e7b06d30161b60ab32b857a444852547795ec8adf4840701f00000000000000", -"service": "00000000000000000000ffff2d3f7842", -"pubKeyOperator": "94de03921db225779ee4dbdc3c73efd2c043559c8b23a291264a52a0ae7d19ead392d89ca7cc981f96b52666bd3b6f15", -"votingAddress": "7oVbECw6LUJPKo1LfUhNuXNhjwR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "db2318300e43c39121ffdd7925ebb6f7006ba929790e5c3ed6a1745e480ea64b", -"confirmedHash": "68100529972aa198fc8ab479241afdefd5eef7aaeaa9537c0700000000000000", -"service": "00000000000000000000ffff9f417c7f", -"pubKeyOperator": "8a234562311fbff8b06f529329c630b568c34cb4c572b3e2a851febf593c8a8a1e5514dbf9d3d1db33dd56522a5e3063", -"votingAddress": "2d3vkHCQ7JjGHqomtH2AGUrKFXZX", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "db2729044341c32852bf809aed9909094348cd1031a14b1b9448cdb2faf64abe", -"confirmedHash": "147e19c4f9babb98defe321d226afff4c3254c83bb993b411400000000000000", -"service": "00000000000000000000ffffd4186e20", -"pubKeyOperator": "8b87fb684d432b19f583f0a3c1f52fa5ecaefe4690190219eb44e2150fa1f9fce4ed0951ddb2b82d25a9116b0f792026", -"votingAddress": "2mPCYQWhqQGXJa15L42ceqLTrcdu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "db3ff2cc1c30ca6ddf057dce3d2b4d0cc1c890366852691d3e812f083fc6fd5a", -"confirmedHash": "3b3257340447e11d1392609f7708d899a4007e89035fd5da1700000000000000", -"service": "00000000000000000000ffffc0f1e9c3", -"pubKeyOperator": "87911e3b9a0080d4968047c808f1e5b08baeaf27c33f6339e7e28df92e93316df8096409f8ca786a74819793efc0196a", -"votingAddress": "2SM6KXBZoAKmqD45TErJSkoBwAHT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "db45b4c5713208797d2fa7573b32339bc3f79a2d2ad01a1d612dce7dd802c37f", -"confirmedHash": "2361df2cfb3dbd626bff6a20f35d1ab801a740bd10e5a7c31900000000000000", -"service": "00000000000000000000ffffb9e4538c", -"pubKeyOperator": "0d8902d7a992bd1241e6a71c82b1c32cdfbf666fe2706e0028d3b8f082223e02776ec76b8cde689f70afb84618ab2d00", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "db6173089d0d77e4ec29a000e637ed2e999f9a3484440031798c269e1ea78dc8", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b006", -"pubKeyOperator": "8add2d567705dc20ac0fece29a6f0b82b32ff33e339a107ea1cdaa770cacd2ce6756e4d13267bec8425b124a73be5449", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "db8087e3968bdc2595bd0e285f23dc072c9520b0fb2edf09782d9bfa40820c60", -"confirmedHash": "8e0fb9cddd12fc84c7a3c699d545450fa85153d16c5934672200000000000000", -"service": "00000000000000000000ffffb23f7980", -"pubKeyOperator": "84134dedbd138f7cf498f664dabf26db61fdf6cba819a802d9e071ba194bda24df4ef33d754a2c812cfd47428b89225e", -"votingAddress": "3m8CQWYEVVAhv1nrwjX5Wt6nBFsn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "db876f79ced4dfc79e9bab1ede2a2fb64341224630267aabdbd23aa7085173e6", -"confirmedHash": "deea24e962fac02cf223dd40dd3f1d84e4375d0d51276cb70500000000000000", -"service": "00000000000000000000ffffb23f798e", -"pubKeyOperator": "1732371c6ccbfe8629ae3538e037a533e34195570cc6869637a3b746a8397d6ebad17a127121ffdd9b3fe3220183ce4a", -"votingAddress": "2hEF9oGq1cdh9LYCLM323DQLLREj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "db8867960073de49c314abd10c65e799c32b35c6552ac28d32464227dfd3586f", -"confirmedHash": "8f2470f14efa67b45f15a9bc900a58628ec6a907f35a82ef1f00000000000000", -"service": "00000000000000000000ffff93b6d261", -"pubKeyOperator": "894131ba8b284fb90ead5db09ac48f412ee4ac5120c77f84241960861bcb7bb2a457af4d6bdc94b4a6b4ce868f8194d3", -"votingAddress": "ZpVWzzfzV3H4DbZzGxknwqAxBGS", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "dba91fbb4df0486e89f084d9513e6354f7994b8b177464621088d77168ba9868", -"confirmedHash": "23c996172e44cabbb21984a5a39423f01d973c73239308ed0e00000000000000", -"service": "00000000000000000000ffff877dc9cb", -"pubKeyOperator": "09bac597ca754aa666eb48662d0df6de90def37daff871746b6cb22c87a7e2d1081a7ef7b823889bdba53c742b972cc5", -"votingAddress": "27zEe5TeMmNzGPVUCDxP8C5UJLJV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dbac37526379c6128b067cee85ec7e6d0e9e40d486e48909b785437e8ce5f2ef", -"confirmedHash": "c90a956d18c843bc7ea69c03f2af09765f733b263f1f42bf0300000000000000", -"service": "00000000000000000000ffff87b56fd8", -"pubKeyOperator": "84b8dd4ac8fa5b11d6966dac8b62b05d9042d0d24b7714bc45fd7890b7fa1814587f0d67b1d060a9f11b6acffbd58da9", -"votingAddress": "2a7eAjEpCg9dfrxCnwYRrvrDEMkh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dbb9c62adadb9f08f3d069820b22b5c38654ecebafc2a7244dcd5c52cfd917fb", -"confirmedHash": "43a006e82dd3a21e7979f73d425fe82bb5b541b3e9de30fc2f00000000000000", -"service": "00000000000000000000ffff3eaba72e", -"pubKeyOperator": "9550b8f6a4f16715237071f1217b573c362a7d204e95a5e261011a364f1b5ac4749317a6063677a0949a5ea2459d335e", -"votingAddress": "RxedhxXXqw2cLZLy9Ct1ZZuKwWv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dbbc8eedca7cbcb61c4abd50073ba961265e6d89dab39664a7585f4459854511", -"confirmedHash": "b3b64ddd4d2bf03dcb0d23c3f9211239e79831d8ca8b0b892900000000000000", -"service": "00000000000000000000ffff87b50852", -"pubKeyOperator": "93ce6b5cec263f0cdf19e817398ab4f7a142e1346b1641d20e251d5095086acb701d48fafca05cadd6873c5b60099bf5", -"votingAddress": "J6AXnf4gnjFBZduAXrfHxpftHSZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dbbfa06a12abdcebfaf332235af1b394e206a498d5f06305b2eb3aa240ff73ad", -"confirmedHash": "ee946b044e550aeabc0b8b415c9feff30c4a023163ef22873100000000000000", -"service": "00000000000000000000ffffa747eed6", -"pubKeyOperator": "8c8b20f919482cf576c172d33fcafefce72314df252ae9fc2487104c35ac5f89b8d1e390d239b478ba3b859046274833", -"votingAddress": "2xJwekiaimprN23Y2N6TUmqcBc9a", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "dbddabbeaaa8dcfde71f3744b05ad18860ede670b8c47acd402683295c8fad45", -"confirmedHash": "547d8591d3346ed972218911803b7e5670de5bb5c5379df70a00000000000000", -"service": "00000000000000000000ffffcf9ad69c", -"pubKeyOperator": "822299ae6dac2edfe9aa7aac1fecd15d509f6cdbe174a5bcdcc206e6c7465a34ff148dcde6678684b5397bb3139fd928", -"votingAddress": "384u37RLW4AuZ7e7HeVyuztES7e4", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dbf9622014529c28893710944c5ee8629672cb5f64cdc66354d41412d6351091", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b005", -"pubKeyOperator": "131315d1c2bc8d7c55b25d6d3745d32912243d04303fa684b85c2ccb0b858a3d0422b63fa560096e80a605018a48b0db", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dbfb2866654da7786d3d3bb4dd2568f22b4458c8c9cd93115917ee07f871025d", -"confirmedHash": "cdbeebc4a3580b1d894014dcafb37c7472a5131b33ac100e0100000000000000", -"service": "00000000000000000000ffffc28752a0", -"pubKeyOperator": "0e1b2a76538601b875ec97b372d978f440438ec6b85e52c7356e1b5d7dd9772195e0a63247f996bc7ea628f9740b30ff", -"votingAddress": "2aXpVcsK3XvM9Ajz7oFbP4FQsfVx", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dc0665c83f51edc73c7ae9d69a37c2e22f9cca15317150e996f4a81117972024", -"confirmedHash": "83ddb9d8a7d6b5f148e04bfa6ed74db12ad505e4027d2a950f00000000000000", -"service": "00000000000000000000ffffa7638e95", -"pubKeyOperator": "8bc2ae680da0fc2b7721e907b093eb951221bfd614ccc6759750874ca867aabf8e98cbecdc0e0f25a292f93591fd505f", -"votingAddress": "bCyJjFw98MMwN2D2uqyYGAAzERJ", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dc0a17fe6e3d2e86357f67a8a7129ece6ca88857d54c56bcc97301c3c648e019", -"confirmedHash": "b8fc3f1ee33f11a0f96ef4cc596e670742336a38102000741c00000000000000", -"service": "00000000000000000000ffff52d3192b", -"pubKeyOperator": "125b2d35d0ba451e02eff49192e7955fc43ccdc36ab19f6c1d9c05519eff83967d174d2b901888d558e469d27d4fb7ff", -"votingAddress": "2obMJSd3ALzr45S29yzE8Y7FeiyD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dc22fefcc33624fbe3803504432c8c268d915ff3d0a1aae072540679d87c4550", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96887cf8", -"pubKeyOperator": "0b187eadab88caea04fd90a84389bbb99eb9f58f65bd29a3c7f2b1cdc02cd5ca2684f82d703130b97642abad95c369c2", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dc2926376ff63fd284591b371aa87c6a2e1969629698e5e51bd8db582c5abbd6", -"confirmedHash": "43d59585cf74cdbd3b1b916e6cb6dc11cae4bb4d024dc35f1700000000000000", -"service": "00000000000000000000ffff9f596529", -"pubKeyOperator": "12e98d2a2ca1471871f697c00209babd6b1d12b1dfe0efd3d65a0df5486f5043df2a0490e3188926a2fe553dff6c895e", -"votingAddress": "tkGmxT78JjhCqrppCco1SzpJAtG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dc2a2a7ac28085b0ee73e1dfe9ad6dd06cd89969e0b20b1706564f9369477bc6", -"confirmedHash": "dc5ff6eb181a9bd7d34dc50462baa49f50e63210f36bf3551600000000000000", -"service": "00000000000000000000ffff2d4c62a9", -"pubKeyOperator": "190728b902d62d361f2f274baa3a1a11426a6499df61aad6abf33b4dc5c241e8aeacbf75c9a2af8891840c40a2fb5796", -"votingAddress": "25Fq6UUTezZRH9174kpBrkVK64qD", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dc4cf5e20fe6affaafb7678d4f38221ca2f4d5ff255c40503a6bdcddbb43fa23", -"confirmedHash": "455dcc7c436a1303d238205a384827e2baa70df5808c609b0e00000000000000", -"service": "00000000000000000000ffff8ba2d7a9", -"pubKeyOperator": "1124b4769c30899425583daa686308bcf49d5507d6e922167c012fd3337fc455fcf3899042bec74c51bdd9d0bc29e5db", -"votingAddress": "vPB4CcaQRVDrzYuhHuV5cnTtz77", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dc610d75f2e7846d132c5cd143bad5d157b002e43e165aa8ebcbf18a9a630849", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d564b2", -"pubKeyOperator": "1256ba1b27452eeed9804ac1837728585448c95c5f39d9c88b78241180fd87f02478fc211c6edc5c9bd2ea2b8a16dcfd", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dc6323e5065adc29ec32260cecb0d65f10e7cdca52b276761c39adebffe9548c", -"confirmedHash": "3aab4c873be808354754f9f3b3acc20ea36bb91e3297c87a0000000000000000", -"service": "00000000000000000000ffff8ecacd5f", -"pubKeyOperator": "186915bd82a97bb01c521b24182110e9a59eb22db03428afba7ebb36a0d0ff338283aa41fc6655cc7d1374ea565fe8cf", -"votingAddress": "3bgdD6NMQ4a8LK7f9fAYwi39bHoq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dc65bd7b65f62a0a56f39bda6d6f076bc441390da41c05b8b7af018d863eaae9", -"confirmedHash": "e3f36e336a78f155bdbe4c704a1beaf22c1463ac43d7cbd60e00000000000000", -"service": "00000000000000000000ffff5fd85421", -"pubKeyOperator": "9536f24afd13901ce410a7905e0a29cb19b249247c8a78205a2b1c7abc096c292d617e6ee826c3782a4758655d49f49e", -"votingAddress": "3xtmAogzw5Y4XUGSSFmx4NjkVH84", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dc71d3cf2c06dd189b4a3f2816c6c7dd10f43b89e2f2a256069d8b6dd5c36c47", -"confirmedHash": "f81b002bfb781819e3cda2623aae1d1d0f63ebea4c3e81120700000000000000", -"service": "00000000000000000000ffff55d1f12d", -"pubKeyOperator": "8127f7d4e1f05981f37255219ef9bdce0b1d90218777e1e0ac336f57436ba83a47d9af9a16747871c46b2b8a8ef40715", -"votingAddress": "4foNAhAQa7Kiy2W91t4DFJy7Y7u", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dc8915a98ee198fc8f5b1e7876c172f69a5b41720ca79f830f3fe33848d57626", -"confirmedHash": "eb009d69bdb226deab3c01669671b8fec93a1cbfb89b31d40400000000000000", -"service": "00000000000000000000ffff2d4d055c", -"pubKeyOperator": "13261c7e21a7f4264c549e0f0a6b5fad5360b6c03c2207a677118ec2fd2f35038e2e2073caafae6e6f516b1b1119fc7e", -"votingAddress": "4NZYANuHJ3qmtvKP2YDdxyuHaCUA", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dca794b7999a648670bd46956c25b80f1717493ba8f942f9e3b352db65dc84a2", -"confirmedHash": "8ff653f659d4478ea4257cf726b06155732e6ac3913d54bf0e00000000000000", -"service": "00000000000000000000ffff52d31919", -"pubKeyOperator": "96a5b6ed9dd5a50d3bbb1b184368258ed8954c42beeef72c8c52deb5a44faf598a1da8cbf7130906c7b613f030b5d8f0", -"votingAddress": "Qc6Sfy2uWWjNnUrAwvBjDB3TKp9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dcc429a5a3fb3cd6a95a8dbf4ee0eb1b61367e0e0b0875aed346796ccb05f69c", -"confirmedHash": "29a154080b19dd46f4fc2600da3ca1f77ac83b0d96c7a6d11c00000000000000", -"service": "00000000000000000000ffffb9248f0b", -"pubKeyOperator": "919ad9aa930fc2cdafed3db371eb52dede4d14c9d170d1a75714556da791bc6973761ac975163488f258b988eb19d487", -"votingAddress": "35u2ruDgN4TQ8v5jzue3L24Utiai", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dccb0dc5e22b676b4f336be9712432978993a83a4e643492ede7b94b9536d45d", -"confirmedHash": "55a81fde90c8b44ff12656b158ad1571fb7e99cde73dff0f2900000000000000", -"service": "00000000000000000000ffff98596bc8", -"pubKeyOperator": "0f605202b84530283f829f0f320161a31bfd9bf0702d287fa4ac05c7ee1c192c1e17558fe8c1566cdbae431f048ab025", -"votingAddress": "3u6vPD2yfZnhvPd4tjkJeecFs2FG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dcd5e7b6631ac34e668841aa5a7f9dd6ff3176df49b01dbc9643b09aebe261a3", -"confirmedHash": "ed8a54a40f9d4a8d059b898de3ce46533d010e3f1ecf4a490600000000000000", -"service": "00000000000000000000ffff2e1ebd74", -"pubKeyOperator": "19fb7e27e4a0184b7e587e16b34557329f2a3605907c91a0e1fb976a89dc91080dddf3eac5e740200f68f046882747e6", -"votingAddress": "2woJDUnNy3Uo17nVeNRcEAnor6nL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dcdd12bbc24432915e0092d91329f63247b1e751a1c04077934ea06ac6565ae1", -"confirmedHash": "ccfd5e3b631cc87126b5818a698dfa59d1e849366d522bb60900000000000000", -"service": "00000000000000000000ffff55d1f211", -"pubKeyOperator": "94f26fc407123bd11ec67a2bffede806649ab6a733473360e11c53fa9c4213eeb487a4f537f37243d48869c02d5a7f84", -"votingAddress": "4WxZbjw2ksmLGmnN4V2o6RvqWAon", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dcde5c6747ed3d01ad4eb7c3ec166d0a294ef69c49042fe114fcda64b00b57db", -"confirmedHash": "a698aaa06fe7a363ec0640a853b189470209949734fbb8ce0200000000000000", -"service": "00000000000000000000ffff55d1f28b", -"pubKeyOperator": "9400c8761784df75e418265ba4dd1d63452b0fe99bec6f813237098137251583100ff5d58c1d30868b68ac8c03d1c541", -"votingAddress": "2ZtABXm35rnLUEhaXMMyZRB6xsSn", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dce35ea6018b865551eaedcff00b43873e78c9f98a0582527e2c3b56f0b1bc13", -"confirmedHash": "5ed2b9822cf25ae908f964aab669c638faaa6d80875a7ab22900000000000000", -"service": "00000000000000000000ffff22c2f6d9", -"pubKeyOperator": "8d32736d4499041e5f850c47cd945f967f6b47669656870dbde94c652fcf073742480cd5cbf0aac1686ad8f8660fe6b3", -"votingAddress": "3eRCqVCcwHv2nLMsKTUXQgnZjHjT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dcf68c4d85b57f7a84bc3ff63994170508925909b4464163b2a3d75aa17a5245", -"confirmedHash": "0cfaa787f2f37643addbd04088bd972961534ae2ebc6f4ae0a00000000000000", -"service": "00000000000000000000ffff3326994d", -"pubKeyOperator": "847a1d139dc7806f209c87d56c345ee6d2e4a15d49c1edb45e3e1539d1c76fb702363844c4e3fc8ac86a5d0c912e3686", -"votingAddress": "3AWXrFQzeHM3ZJctn3zhjCkiyPF3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dcfd5fdd62579de68c7315e459aad4a85ccf0e80f3a66ed473cbc7f5f825fc8d", -"confirmedHash": "7b55ee6e9b7d026b239f9c5ace8e4aef8d9c6a31e00ccff30800000000000000", -"service": "00000000000000000000ffff2d208c4f", -"pubKeyOperator": "140f9eaccec588d1bf8d19b61783e3fa3108f72b4c0d5ffadedbde40056e8a5a9bc99522be2908cbae56425a5b096fbd", -"votingAddress": "3qGKg9g273DnkTQwEyYowbmtfVJy", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dd0aceea981dce9398c81f08857f0e276b55eb56332ebc43d7b293b46572df4d", -"confirmedHash": "64b6ea9f30c19a77df7a68f27b9d0b5849ee04893ab2177c1500000000000000", -"service": "00000000000000000000ffffbc28af45", -"pubKeyOperator": "91cc6ab669ae1565067ec38bdca464a1e4fc1c44f6957d85d46fc66968fb979818361eb2f0243a30d5874dafa1b54b75", -"votingAddress": "3rTNkAwkiWK445cCA1phbhGXRUhv", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dd0fd8e1f9424b9ba92fcfe0e72cc9b442d6fd13cfbffd777afd2928548a2f5d", -"confirmedHash": "ca9209490a660630edbeea0f51e33032f888760ad032a6571c00000000000000", -"service": "00000000000000000000ffffbce2c4b6", -"pubKeyOperator": "07f43a2b4a42a476de6173552247f14813a8f1a040f9565fd305d7e1329af6a7e4147d188cacac518025cda1d683c176", -"votingAddress": "3LoNF82UHrbe25XLJ2XGXjv6FkfU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dd209b4d5f173fd8a5c8948a2aa17c60b46f2a869c1d4fbec57fb75c57976e25", -"confirmedHash": "72f4d1a0e90ea9f463709b73beb93d2f7065fab8926d98111200000000000000", -"service": "00000000000000000000ffff6baac423", -"pubKeyOperator": "922d0d3d98e321f23e726f219da0e1f401c899a87434d068822134e0dedbff40146bb7320f313d8fe2a2158304d41479", -"votingAddress": "23V6iyhs1JFAQxbcK7Mxe3uL3WdN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dd25a8e7a0b089b3f4dac80e83891723b1bb6f65e9141a0b5dca475f336c8a31", -"confirmedHash": "620765d85c7bf3051021136c79362c0f460a3b9688f0f0c21400000000000000", -"service": "00000000000000000000ffff03d72586", -"pubKeyOperator": "8fd03ccf9ef6eab2bef04e5ad5fc932ba584a9e02ee517f03e928a47f85a637240a89346422e27f621fbac58e913ebd4", -"votingAddress": "2LFRbD6YSiBZZppQAiVRRpsP1F3Q", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dd5b974e1dd1a5b13eddeb7322e58e93862c94aa48b47d8d49e74d7fdd9bdedc", -"confirmedHash": "bb0b09b67dbebed5edd0f20545de767da3db476c66a4570d2300000000000000", -"service": "00000000000000000000ffff5fd85425", -"pubKeyOperator": "0581aa4fa0b84c39aa920f538b92d7e0680d88776cfec9d41f6f599d32cdc4d53d7976e92fcfdb8e0a3a1ea5a9650582", -"votingAddress": "48HmcE1hUkAcdgUA8xCwWamgVcXm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dd6041971a0d42cfd7376e47cefe26be245a3bd5b20ff82881b7d285f36a9dcd", -"confirmedHash": "284bcbbfe7d6aa21461eac4d5c104676ae6130bfb674eac90c00000000000000", -"service": "00000000000000000000ffff5eb0ee0b", -"pubKeyOperator": "92da697f18081244ff2abac7537e1ce323ec95946c538c837b44fa69ce7eda9824d1f0df0bf7484af441283a87940590", -"votingAddress": "XheoHuG8t4dXdzkfWmuvPdyfDFJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dd8f1bf2dd0005f88911852e319cdaaf3392e3870735c9c9963b3be45b8f2dfb", -"confirmedHash": "5573722cbba0e84c69d8fe24872d97409f7ced7b8e5163212000000000000000", -"service": "00000000000000000000ffff92b9b6bd", -"pubKeyOperator": "14d41586a98cc8aab22557126a655be437946455dccbafd215dcc1ccc9dce6d2444ea6ae94dd1685d44e00199bbafb3c", -"votingAddress": "uU8uZ35Honrz2UGFFA8PLMerjw2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dda2cbfd9329288578a4f1a535456662440f443ec8b55d3f4aaae7155d74e76c", -"confirmedHash": "dd72df45c4cf4c514a838bea2c024a05a053d77a9ca23b670900000000000000", -"service": "00000000000000000000ffffb280a339", -"pubKeyOperator": "98f81e2bb6e370667cdf50cf4b12cebaa7d86a7a1b391ab3164efe10a8efa80c849aa197a9d8b20119926c0988eb6509", -"votingAddress": "388ay3myz9QppsNoSpsJRJeqKBum", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ddb0a30b62522e99c0b63c3b861b77aa4bd8e127e1d4c9aa8ea96f112ba1b576", -"confirmedHash": "255b9f49ecd9e189d09f6f9e98a15e34d5f5d1c065a2cd613100000000000000", -"service": "00000000000000000000ffffb9e4539c", -"pubKeyOperator": "157e360dbacd9f8a4db15ab03fe5f44d4c6f019258753a86ae8954040b23dc048eb0b12332353d61de2625e896922fba", -"votingAddress": "2ukkxNsj5UJnhBu8xgJcfr4zhKby", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ddb7d8a53c6ee97134e222f1f6360e02f3241cb53db6b52a581b5fc83cf65697", -"confirmedHash": "89529e58998969fa8d330efbe5c89cdb1c21be9451be46341700000000000000", -"service": "00000000000000000000ffff36270a6d", -"pubKeyOperator": "8f3afdb034f58069836f5209c164e4677b59f47a4cbca79ce2f840fa898694585e4a8701649a118de61edea9d76a87cb", -"votingAddress": "2ALKP1DyHNtrHx56U5D2FcZgrKGh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ddd2d9e25abdeaa42cf15016b7eb060a9aa5ffbbc83d59001a07bce23731d60f", -"confirmedHash": "0e565913d3fa361efc3688f508f93b30f3f489202d8f183c0f00000000000000", -"service": "00000000000000000000ffffbc28b242", -"pubKeyOperator": "96ed97caf750564962f5a847a877c9a01ebbba36ec0f4483a953e8ee5d44a5776cddcfba3d3ca3608ae549bd9ebf6845", -"votingAddress": "4WTVCeFoWrVCb2Qz2ps2UoBG6VP8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dde0260f1726caf7753fa0958f54a27856a08304ac689ad6b8ba3a0528b9ee89", -"confirmedHash": "03f0845cc725e095b9b80d99484904ba1b9eed996f1db2d12100000000000000", -"service": "00000000000000000000ffff58630b1b", -"pubKeyOperator": "85ecfdb728604eccb835cdab7773910025d1a9234f8fc0e6d8d7811a2a84136c6370bd92db4c07a6e77aebeed54f7ac5", -"votingAddress": "QxMAEQdrQVoMjn4hp3228Tqe89W", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ddfc87b9095545f817483391d77f429d5991e5c0e66536ab0eae44ea6ccd04f2", -"confirmedHash": "8de01d22192e6c1198cc8161195e7ee0cd781d39ac90b1dc1200000000000000", -"service": "00000000000000000000ffffc0b85aea", -"pubKeyOperator": "8926a8377cd18bff825edf92fbbd60830c32556c4ee1fbae09036baf5c41567ccf8c6fdef5395c0d45c8280a8dc8dd23", -"votingAddress": "bXHkDBonQQ2nbkSszmQkJ6VrhqU", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "de042c02a329803fbf19f401010b283d5a0bde7c55c623555f60b9001e1af79e", -"confirmedHash": "48c3081aa1d0ea15b2604aa8ee1467a107d36ed447896aae0000000000000000", -"service": "00000000000000000000ffffb29d5bbd", -"pubKeyOperator": "939a849f1241a1e8967b649928a19a117b681a50a66a1964bbc9aaa0cf497ad6106b953b20f083f4a930bdb88082ce11", -"votingAddress": "2SkYy3iUmxp6166VprjuzJxs6Zi3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "de07c3808f2f462094c99c66b218cae5d5aaf45cf283725646375a7c7328c53a", -"confirmedHash": "27da25ef2fc43fef470d5b5195fd75ac3ee8a63fab85d1150b00000000000000", -"service": "00000000000000000000ffff52d31550", -"pubKeyOperator": "0e2f6959b65c03a8f9417f274f92e13c40238ffade284dbc5099f3b0e8d3ab961cfc9f5e24302edb64583e2d7d71bb18", -"votingAddress": "36DJL8qkJSe8D4XAxDxu9Vkd3TKF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "de156d2a38b6c2d82c913eb958449026c0c87f3a27a3a7538bf671f72ea2a883", -"confirmedHash": "dd864760e53b44b13b01d8309a955a9b8bc324c74508287e1200000000000000", -"service": "00000000000000000000ffff55d1f193", -"pubKeyOperator": "947467e12c51e0dd596b1c54e368586f89580649b65850f76b60e351bd836d1294d35018fd4f8a14ae48f1f277753dc9", -"votingAddress": "461LJHoRH8kLoduFSyEMwAiHCQ1u", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "de178725c03a3ad15fce05082cf373ac6886199c0d24dc0f7da0d47025afc4cc", -"confirmedHash": "c3f26b080798292b644b1b85a1872d11778465c267367eaf6100000000000000", -"service": "00000000000000000000ffff36a5e85a", -"pubKeyOperator": "87bdae98dde492e8a1b645a440546882c1f798cc90c10d3c97fd31030ebbb57ec2b2b8d90e7bae0e062263868431e748", -"votingAddress": "kiJQX3H6DM9R3bYtkGXVPEAYDk8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "de2f1ed81901297055642e5fe2408f13b27fec5850518469d92ebc583eb792c0", -"confirmedHash": "acc63847e11cf708a9236dc3a5ab60b044f9f5e0900c1ce80700000000000000", -"service": "00000000000000000000ffff2d4c94c2", -"pubKeyOperator": "8b3a2027fe3d0d75dcad9dc2d34c138fbeb8abbf4e23c519a4281a0300fcf683c24fa3c5a37af270a277520d667b3907", -"votingAddress": "KHwCnvztSF8czg7oDw3PkPUTFKW", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "de3f549ca6819667dc65afe4a97de6d8427d5dcb3712ec63f2056a97a4a90215", -"confirmedHash": "9a07a7fbfc11094f0c7737a370ba453bc2e27d697b1bb8240f00000000000000", -"service": "00000000000000000000ffff05b5ca2c", -"pubKeyOperator": "8b384d3574f88e11fad868e76001e73bc752cf387984228cd111c2883e6f6f5405f81c426c9585318858793fe7c628cd", -"votingAddress": "3pr8q1Z73iEWGHqby53Rqzu4X3A7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "de5fd7a9afd07d331fbf5a6fe00a871ca5d7816ad2b326813dcfe1e69de67367", -"confirmedHash": "2061eb607c60cf7a2d0d748c973af3467df57ed67efc1db01100000000000000", -"service": "00000000000000000000ffff55d1f194", -"pubKeyOperator": "1250b4c913900f8e3f9d8d662fdf4c54fedd466927d4e109dbfdae7106c5b923e9ddfd031b290e3943de4f2e36935a74", -"votingAddress": "3emuhzebde6otpuvWKhWWKndaU4G", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "de5ff2ae1b7c76099562b64278ded31bd25569434781d2585dc987b8a9e2f8ca", -"confirmedHash": "5e44ee16f1303d12b10fdbd921e134dc0b49d2ba51b8295e3500000000000000", -"service": "00000000000000000000ffff2f6ec702", -"pubKeyOperator": "03765eb69d2a97e3641cccd9633ed589e06bafa1aa64a222c7e48b4160204d85a08c4034c711c5c8a2fd1332e36db7ac", -"votingAddress": "2EaL7Amy79MB8odjVhpeLKRQNKAu", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "de75995fbc3a3648dd841535bba000b445454a0ea26164bb74d17d24d32e28b5", -"confirmedHash": "73eca2c4827704415836465ee2450275e0bb2092f7c132711f00000000000000", -"service": "00000000000000000000ffff9d5a946d", -"pubKeyOperator": "114c9e7a6a0017ef5a868a07999073724846204cdfb1acd3617b3cfe129af04b01d35e14e8810eb328f192742dc507b4", -"votingAddress": "3yZ8K8uhJ2A3tVCVKj46m2q2nqkb", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "de8e7858154401edc9e040ce89da62e8ea3fb5d3260bd843d206a6eed8cb45fd", -"confirmedHash": "835714a60793b1f2efd5edf17065227dfe84d64a3c37d98a2000000000000000", -"service": "00000000000000000000ffff22d2c245", -"pubKeyOperator": "04ad092fd778ce8e5717b291ebf79149a002854e90b4f050a101b5c7848462171e79252c928dc91024b4637fc72aa8c6", -"votingAddress": "48ffiVhqCBiB676TcVh27VFGk6xd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "de97605ae820c6147e085bdb1b7509ccab0078a212f368a2d0b2b170c9bba772", -"confirmedHash": "1ccdf3ce19cc438cc702d0d3625ddf56c63fcca326b6ac5e0200000000000000", -"service": "00000000000000000000ffff2d20eeee", -"pubKeyOperator": "9501fe76f1cbe74db71b4312b98c4e743b2d7f669361beccdfcc11e2bbceba54dcb7c4500284658123493cb9b8c1dd01", -"votingAddress": "2F7YoiEPFXZCEge9T25ufmZDbEqW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "deb2d809330f20642adef45cbe63a8ab469b263e03ff3c3b9b3230f930c0d287", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffa7634026", -"pubKeyOperator": "0bff671e8d1fef0205d13ffdf690beff70205d509f0150f53e5b59928f92d28825184abd59162a04609829ee5c2a016e", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "deb6b5904a4d73bea900fa8f8359558a8812832aeec83fbde78216c0a0e80e06", -"confirmedHash": "58e240a154a0ac48dfd26143fb8ac7413aa11d8f10f16e622700000000000000", -"service": "00000000000000000000ffff5fd8ff4a", -"pubKeyOperator": "185449a148e6f53635ce8852adf978df942acdfd95b0f0deb0cea86ac5cd728c319e1557629e8257af425583ef99f5da", -"votingAddress": "3V4P4w6SDW6611dcGyEQ9Z9zMLSM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "deb7dbe9774d1264f5f0b418fe461bd36f3195893b3bd05490a8b1555381bb1d", -"confirmedHash": "8dd7442cd7bdbcf8f786677f301ad6949746cea193655f640c00000000000000", -"service": "00000000000000000000ffff9d5a97aa", -"pubKeyOperator": "124ea9a1fbb701b31bc9a3a3651598123b0a49f1ea290be0781dfb2cb6272885f7ea0daf3a22583ed2239a20fed75466", -"votingAddress": "F7Snqnx3ZUMNSocgnCp2htzA1Aa", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "decb4d1c50fb653946383a722d2d2bc673c1274817ac29488a8003b696505233", -"confirmedHash": "f9b11fa0a82a0cf059b9fe87c082ab72bd082e887f53f4570e00000000000000", -"service": "00000000000000000000ffff68eea7b1", -"pubKeyOperator": "988f7d1dcad4b9982ba92ce775d5e6777cd306d0ddead5cfcdb410cdc50483a099c8d811b45bf1028b06af8a3572e8b9", -"votingAddress": "366as2z9MShP25yAEdjBQ1bkirEg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ded36f1ee6eb2fbb6e72c00296b886dfccc971ae68cd9ec81f62a0e63cb12462", -"confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", -"service": "00000000000000000000ffff55d1f26b", -"pubKeyOperator": "154afd7f7aebfb6a9b7d864beed1a6ec4f49469d3e38aabe1205469cdb9931201e37249a94e7b801dd93a450f66c9276", -"votingAddress": "31vP9DarDkwFYP9TSfD8KtojiQss", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ded4de2df12ccd687f63ade1ad21d16108b08b83875476ae59b47b98b4ef9f55", -"confirmedHash": "b04a67d17dffc06f56abc567dc62ea7098b3fe1e9110b9000600000000000000", -"service": "00000000000000000000ffffb23e95a1", -"pubKeyOperator": "098c388a5f354f52eac658dd37d3acbf8246d1bb91830036b8184bb843817d2c8eec62146d37f007e8e2d947a5aafbc4", -"votingAddress": "eHYfuK1nM87CqDYWrTtrZaNPngD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dedc73e99938aa724627796a713ddf83554324957abf573e72148266ffa01aa6", -"confirmedHash": "af8a5dc0befa66e85a1e8c61de6cfb3bc8d6ded549e1a4860400000000000000", -"service": "00000000000000000000ffff52c409c0", -"pubKeyOperator": "152cc646adddc2738425c874c5b1ca14698b0a0ef853d4e1e4066ab6302bd04bbdf97e9a2ea45d2a03572a811fbc0502", -"votingAddress": "4JSHL4ubceKT6UJm7vzRjhi5n81i", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "dedfecca61269046d00716ddcc06976e6d6fbcfa39846af108c4002fbcd0620e", -"confirmedHash": "8ece6073d810443e6f88c84b99ad59392a58f75b64e8abe00c00000000000000", -"service": "00000000000000000000ffff5fd97d66", -"pubKeyOperator": "06e871fc5733d7d63d096a8bccb13912df15262536a66d449c68cc1a25994e173be87f3dce28d1698c9fad60b50f30ca", -"votingAddress": "3RMXHqHF2FsUkARMLa39FnFne8qm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dee850c114533a03621594ab64ab1a0cd51bf8e862b5ca83c9822e64967de1f5", -"confirmedHash": "790acc3c6e44b61cdcd205c64c13672cd701e4553e6a85f82f00000000000000", -"service": "00000000000000000000ffff5b8493fb", -"pubKeyOperator": "8a87cfc52774f1968252f5438342a999f5277b0c8e76ca119b71c1055e9c0af36feed23a419c530613aa573ceed441bb", -"votingAddress": "3UPyJqn3bjEWRfvEques76q8ovR2", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "df3976529d9e9696b74f34e16de17f28a73583e0b20db6205b34057442f9d66c", -"confirmedHash": "783fc6a233e0854653c8c3a22cbd0188b6cc25063cdabe750700000000000000", -"service": "00000000000000000000ffff52d3191e", -"pubKeyOperator": "820145104343a5b633bf6d1fab31868a6bc2ae6b39f324546de7b69d72d9a345c34bb74abd4fb05c1fc51a9fe9218261", -"votingAddress": "3WNbs3vVZJ71cWxryHgyBJYVgjvm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "df3b9a0f70abe17f3a7817b0e4a2e0839eff9c00e402800a9dd8fd4291af5458", -"confirmedHash": "270519d3d841e4836b7b6d692a42d8e30b4282d095f213e52b00000000000000", -"service": "00000000000000000000ffff4a768945", -"pubKeyOperator": "8c7dfede41933a8b77b8e281fb36b88c9fa52e60fd087ae17dfcfb0a74d4152657892404082adc2ed28734403251bbcd", -"votingAddress": "2h9z1NfZcxeL4d8RWjKgj5vepbT4", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "df3f7e1d6cb953a740727d14b1bf2ce25311a067f190cb173da9ee8ba9673c8b", -"confirmedHash": "ce2f39873d313aedc2c1fdc691750baa4389315312183b751300000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "3cYmVjcCsE6JxfuSPEodQd2b9j2G", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "df431c1016a6621879832429f3d918b5e54668fcc4c88233ebf3b18d1e3018cf", -"confirmedHash": "75650ba533e1ecccf81735b8c1aca5e527fd9d879a93d10f2300000000000000", -"service": "00000000000000000000ffff2d4f28ec", -"pubKeyOperator": "92dd3cf9a853022f4ca75df77c19d8ebe41f5159c912582b1ad3c9116f739b87eb84c8e2bfb4aacb34304606c96a69a9", -"votingAddress": "4Y8p2vHVW3Z3esaprTqWsXJXZT3J", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "df49a036d2cd845022d025640e999664bb35cd32c26a3f97ca6bc600a19699e4", -"confirmedHash": "652edec87f4e9f62a5823f8bebe784801d2ac6daa174151f4200000000000000", -"service": "00000000000000000000ffff3625c7e0", -"pubKeyOperator": "01da056d3b253e6660c98771aea644191640f179dee3674f0c720ae896ebc9a4614f707c6809ad8f33a7226abf65d549", -"votingAddress": "HfQaqpjgcEhM9pgQnRsDnyXqM18", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "df52ab39ec922bb4f563837d11ba2ce99dda214a60e70477eea7865318507014", -"confirmedHash": "73ebb4ca1f9e7d83ae7f9530e460c9fb34e31e8a27a736822b00000000000000", -"service": "00000000000000000000ffff52d3152c", -"pubKeyOperator": "02775b810f03b9e1a1031abbd1e152ffecf8da7ff48e1fbb7664c219cfb1222ddefc6e2c5c89b45e03bc9e4ea6fcdb3d", -"votingAddress": "2rNjYkgv7SeTUg41EperNjeDgBwR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "df94333eea6bfbd1604962c058d0b884cbb2d7a916846141e6b99700534ffcad", -"confirmedHash": "b9296b1e1bf34b20c382a8d34628c540fe75e20b7773ebcd1a00000000000000", -"service": "00000000000000000000ffffbce2e458", -"pubKeyOperator": "9019df7c4b31fbe3f1d898cb92cc7685b666987de8593a8469936934cddcc71e5af5d89f499d26cd221052631bed803c", -"votingAddress": "qfR1NMLSFJKdq2QrVj6QxXnrHoa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "df9f9e2458bb8920c33f121b855ad7f18cb244e4563fd59b746e251f6eec3328", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6d9a8", -"pubKeyOperator": "8dbc5b95cac2f4c293ff3de5da731c88bb8081faa856e751d508253381ab3447b864822edfb8625db74a883219bf4e33", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dfb7bb47711266726767c9e65e4653968a7cc7477e65e588487b8d36eca803bf", -"confirmedHash": "8c0bafb8d370641a342eef10896db4eea2f94c976d9829420d00000000000000", -"service": "00000000000000000000ffffc11d393d", -"pubKeyOperator": "0690575022c79783703d7405864927296abf0d90994441fb856e644a880d73d730db62e66f8552527b45c3e62b48a7e7", -"votingAddress": "3CmfHoDTxxmQqJXji2uQ2erm43yq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dfbe46fe65e89f0bcd88ffa2ad62fadaa585720a8b70439b7759190121168d32", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b098", -"pubKeyOperator": "17aa991967e33a8346c2d6675ed35be9ee3651f498f2a7433c35e28693bac644702dec24a529e2559f4fd828f231b6da", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dfc0e863db86ca11d9f69433e180b0435f2427a57c96f34ed2d69df662d6656e", -"confirmedHash": "b56179857026948008d5234efc6861dfaee47a98e938c68e1800000000000000", -"service": "00000000000000000000ffffbca61ef8", -"pubKeyOperator": "17e8231646f0b4706100e6394434a9a1d6a53478ac7ba31fbda9d4c2e3bb0b43fe0670b581b1506194a03e8cbdf1b706", -"votingAddress": "3Nnd47Lc7V6ez7iAGEQpqmXEetkn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dfc1a51511896dc6a6b27076b367534399bb5fd0959eb94110f208e39bb55b24", -"confirmedHash": "9fd8650f3baa8ef3938d7a45a2ce5b96b5fe3baf5ac357870a00000000000000", -"service": "00000000000000000000ffff55d1f1f2", -"pubKeyOperator": "08d62584c492ade4aee2173b0bb43fbfa30631317bf12c344d7f38fe9d048a747ec7a3c128074bb84d5cb7ba465c7e53", -"votingAddress": "2zRTCnCjcuf6ti6Dq4Pe37KKQG79", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dfc80e0b0af9e669afc1c87d881fd858391a91e258bad106b6dec76693eaddd3", -"confirmedHash": "196b5d6af5da3cd5a988f5ea0ebf2efdb68bf3fbfeea9cc00300000000000000", -"service": "00000000000000000000ffff17e4e843", -"pubKeyOperator": "132d5a7abd61180cdd71f092e32b84b3ba70fde01618aaacabe9633904e6959249e240e51a26de2aed0e5d07c2bfb75b", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dfd45b436fb2a3ab7dc37724adfc0b653dca7861822d8483b3e0fd1e407e103b", -"confirmedHash": "52188024492a0321b8554469b12ca7b45de9ad731df7b4530000000000000000", -"service": "00000000000000000000ffff5fb3aa1d", -"pubKeyOperator": "9037fb85199c6d0c31455cfb63c3022eb4aa2071c701f2bbd9f2a0115bfaae4d92b08d75fb0c2d39cee55dc5c40aa003", -"votingAddress": "nDyo5ARcUyjXSHJx6abLRYCSGnP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dfe725e9067d08f52c5ab08b8180c07ce67ecca698d5ed1a426de4ad619064e6", -"confirmedHash": "4c35462a214d6b68576163190f4a182121f6a86ed5943f8b2700000000000000", -"service": "00000000000000000000ffff52d3154d", -"pubKeyOperator": "0edf78e852dc2fea4e8d5a341a54c4dd50fccbb081ddbec47e272220f3523b4082d0226648dec6dc0c0d95488cfc2e65", -"votingAddress": "222SsBxhNA6oxLdcMxvu3qm43n2r", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dfe87bc2339904d0c2b4ebd36dc72a35f853cddf8c1d30e153b73ffb83de0545", -"confirmedHash": "3804a47be25c1fc40ed031493ba020cb0747675aa7e340740700000000000000", -"service": "00000000000000000000ffff33d26907", -"pubKeyOperator": "131fe16c12f4f88d6ca5b95f4670fd81f8c15fadd7cb1aa9ff5a482131a4a4f9e1be19bd07b24fa91f9ab1f469c2587a", -"votingAddress": "4Qq6pRPX261LpjMXqkY6QLZnmGat", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dfeba0c2e25ea8735c5fd7cec448f501561dbbbc35685c3e6ed956be94dbcbdf", -"confirmedHash": "a1f56375ba4e2362a7df48c8c411e95503dd09ed820eaa710100000000000000", -"service": "00000000000000000000ffff2f6ec7fe", -"pubKeyOperator": "96ce37046842887c4f324a0b70ecef6e5af8952eed50ea9a24f99234255e0c9c2050143a8f4a3a6b82dde59dc973e729", -"votingAddress": "3vPn29ifxwAFuPBdFzSrX4mAsfaz", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "dfec22260ac27960d39b0692339782732459aaec8e77c026ddf954f37c2970e3", -"confirmedHash": "8a032333dadb2c9fdf1edcc3689c2a30e3f59c51f8ce97db2d00000000000000", -"service": "00000000000000000000ffff68eeb136", -"pubKeyOperator": "1122a10e5f7ff50e9d0b3d5cde8cef1a3e5e4f880be7a4970b9bc7b0b556c913abe07466a959076ce8ffb6c297ba7562", -"votingAddress": "3MUrbXr8sTj2dHMNeqLPE7PCEvFK", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dff99e8316c4dd40e498e7f1d7c48452598adca2a58e494952ce48d08e700975", -"confirmedHash": "cf632082a1ca1ded8a7e946fa5ea5c76dd8213f33bed27e30f00000000000000", -"service": "00000000000000000000ffffbc28be34", -"pubKeyOperator": "15676776334c1715632b3004247804dca135addadc304b546a3b4e23446a835e5739e9c8fec0b6e525330dc94057835a", -"votingAddress": "2zKK5XrktAfx1AKQKLhXJHATevTS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "dffa47b93f1a1f0da70174ba1a1028e475b4031b396660ce934b54572729e373", -"confirmedHash": "0c76487adb739b08a7ed7e11e4a4e8d788bf269d11622be10300000000000000", -"service": "00000000000000000000ffff55d1f1a6", -"pubKeyOperator": "05def59e7f05a2fcbf90983a7e9c5785d68480612b7aadf284f75a67a21305d80e6a4f3741b3b16f5c0d126096c8fac2", -"votingAddress": "2sPBFyenRNSSqYaebxrQRtRNGz7c", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e012ede4b7cf53cbc66113c9759c552c96342140c1a68506d9d6b08f0bf9e84d", -"confirmedHash": "da13c89ddbca64ea1aa3b2d4b9dc18b5564b26bc8d3d027e0600000000000000", -"service": "00000000000000000000ffffbca63c89", -"pubKeyOperator": "90213c1d2da13cdd6ae6c0366cec94897091e50d951720ba21ecc6a07e021171326186ccf8d12c7621c0e7c8e56ddd25", -"votingAddress": "buextPKGqGEjTtgCb384x2mherg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e052bd95e31c9596d2b431dfebb89fab1ebc0a70d499413f7b129c2aaf5a5bc7", -"confirmedHash": "79be1ac86a7432a51fcca6b157caef62826877ae21f0143b3000000000000000", -"service": "00000000000000000000ffff6883a077", -"pubKeyOperator": "0416ef5bc840ee36ee786fa6194edb5ae0c34dd97d024b89e48a55c3438af59d47f560147ee206e71cfbb5db16e1e4e6", -"votingAddress": "46o31yQX6GLrH4472zaEsFKJU6GV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e06216c5895a8f1378581ebeb64b482aa2bc94e1ca07fe52c42ef7a1db6b59a9", -"confirmedHash": "dbc0b455ebfb0409d4ea38e6e500bc48e4de626437fe6b042100000000000000", -"service": "00000000000000000000ffffc2875218", -"pubKeyOperator": "89348c4f4d65726d828311082a72676a55f35d79b3aeea184fe72dec907bde1d2e5457bbb738d59331c244c4fb9b6f65", -"votingAddress": "3EEGW2bsnXjQqwEDXNXTWmk2BJQd", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e068ee22d2d631167c00614926072213ed148e128b0727b84a4f5e096a090af4", -"confirmedHash": "dde91a1d171ba9d3ccee4056b1e26fa53abb9dc5f144c3211500000000000000", -"service": "00000000000000000000ffff05652ce1", -"pubKeyOperator": "8c8440a82f2fa19bcf1a1324de03db6beba690da39c79c7e09835728026c46a59475e2fae6d0fbe20c01a128e796aac8", -"votingAddress": "2frshiNH3wVvYoA9txTAVRHmAnRj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e06ea2af60070b4b5bbffe90cdd3b15c3dc2b0352d018a361a5307f87ce13422", -"confirmedHash": "fd7d68be7b4393f33d67bb486d3a1f84ddf24896e266485b0500000000000000", -"service": "00000000000000000000ffffa877530c", -"pubKeyOperator": "807946b5f660f13521902feca7674c106eed33b89c3cf8dcf4368fc3608b0e93e031eda074ce47218b400107a1016abc", -"votingAddress": "hmL5ZyFtNjncpDR6fnHuPJ9MwNd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e07b6381aeb4a8775b80a19e8272a204c9bf2eb34f654d5254e0c139029828c4", -"confirmedHash": "1435ee2c7a90f1d4b52b7861810792f9225680ddc6d4a3390f00000000000000", -"service": "00000000000000000000ffff8b3b6467", -"pubKeyOperator": "0756cb7f3fef1dd9c4363f3dd5670543d1a8100bc0f40419951f97816ab24f85983ae8c5d5517509cfa7e076c5df9467", -"votingAddress": "3aBq1WbVDJN1tTDFwJmTAd1aS8ju", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e0855675e7b30e7bf84f7debaca76102ac939bc2606bd15f37b5fdf35abcf9e1", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff235573a5", -"pubKeyOperator": "0941fefb0b93dba5b6c6c545b9be8a31ad56e9d03f61ac4a44b4035e95247c66b7dea5c509c2ab394318b0affedee1c4", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e08e1f8ad5b14c14193a6fbe0f8ef01a91fbdb6fd894e766a4cfd40491e4e767", -"confirmedHash": "8a3f04057656583098bd0df71112f88ff005cb568d60c6230400000000000000", -"service": "00000000000000000000ffff55d1f1bc", -"pubKeyOperator": "00bcc2d4e727073b91aea52b786c220ed86aad729d74f64d4cff23eaf6db5867a1adbea869c72a1dcf32d889c7a5677d", -"votingAddress": "HK6swtjSUbUtvYd9pdAhMLXUCz2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e093af3b711ac9b464d94b1c2b0f731ca9a84d3514aae700a25ff90aeb188857", -"confirmedHash": "0739464e03b2b0bd0fd7c81b70af0bc0f8a2f94db280e7a81200000000000000", -"service": "00000000000000000000ffff05b5ca12", -"pubKeyOperator": "92b2f67111d75bd9288a97958c38418e8b105ad9952b87ff8d6c19ee1b921acef438527a22aa274db8ddbae3546549f2", -"votingAddress": "3nCJwC5pZa2vhvvk5Y3bt8pd99mo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e09a2e60a7c2b9ffb72d23cdb2dc2a6dcb6255569f360c1b8c2f39668a84d3c5", -"confirmedHash": "f2e44ee6709b40cef56817fe7481c0a5bcda2e0967ab63ae1400000000000000", -"service": "00000000000000000000ffff2ac28577", -"pubKeyOperator": "041ed7aa6667ff44539bd796c8728da0cf7d1d2b32d193dc4b72013a29c0a8b4c0c2545b853e76105b269ff43f98a5de", -"votingAddress": "4Wbe9aArZbN5PQgAmY2hLuMdrqic", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e09fbacaeb982168f3dbb5bfee7d507d54b6e8c5d2b79c0d77101d108885bedc", -"confirmedHash": "825ff51efd7ed0fc1fc428520486adf4d7acec61b83d33cf0b00000000000000", -"service": "00000000000000000000ffff55d1f259", -"pubKeyOperator": "136a5dbc00e2f4abc99e9252613c82adb0cd0a00da1f5aff39e54abfb11bde0bbf3be10c460418128ac4d1611d5716cc", -"votingAddress": "49kFqNJFcAPrFU5kEdQrLruNkXri", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e0a79e515e81649ca00a611f312a910a2549641b81e822066c5547ce989f9e47", -"confirmedHash": "45ef0e702694413e4cd9866ccfc6fc30ab9083d16aa2f9e90c00000000000000", -"service": "00000000000000000000ffffc6391be3", -"pubKeyOperator": "0300512df5ac6907be59d8da5747c859f4586270c8ebdc5211245b728b31cded85620de69585ecb3a498d819b4a4b584", -"votingAddress": "47KNg4tMmpyWfsX66UAkwqKQMLFu", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e0a95e087a43eaa2333441db3a837f9e7742c6468e76178b73d085fdab3a771e", -"confirmedHash": "f2d0382907b7f9d87e7555fb8023542f3f2bcd72fb32affa0e00000000000000", -"service": "00000000000000000000ffff8ac5af91", -"pubKeyOperator": "85aaa1b03e2cfc46924d6ebf492af8ed1c05c619149980b61569f579961e1e070b71b272e7b63db5a7a162b0bd36f0f0", -"votingAddress": "2eSpyvpPtqL5gb7mAFGuZxC43Y92", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e0b2efe5f8051d223f7be3bede1609f07cb2b7ef98f68274175fae13a6088bff", -"confirmedHash": "6b0b7096147be77aeb538b83ca7bfedea24969c7bbe80a271400000000000000", -"service": "00000000000000000000ffff52d31517", -"pubKeyOperator": "83be89a7c5f82e7607af4503753d8a50699246035c6c9be7c7d10048ff03382739c8de8b7b158a8935554e3983971d59", -"votingAddress": "32QhGnu928a45Y6xWGDdrEGK8RPB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e0c03d4b6eace4c25b21c56f489577356d9dd40c6fea394160b6dfdd5c56d59b", -"confirmedHash": "cdbeebc4a3580b1d894014dcafb37c7472a5131b33ac100e0100000000000000", -"service": "00000000000000000000ffffb90534e0", -"pubKeyOperator": "0f0fa3cc5976ea5442d527505ea2afc1ec6e829ae94e66ea50fee83122d12d554d60cd4652170c554fe19495a81d78df", -"votingAddress": "rBjxk5gGwprYVsGcMYvhYr5P3Hv", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e0c7ed329482c23eee65e318e3da888b97ef55f0bd406e9981f5f7344eee3685", -"confirmedHash": "38f8d595e248954f4c46d6d4b26517a28a01a792c4612ddb1200000000000000", -"service": "00000000000000000000ffffbca669ca", -"pubKeyOperator": "002a3fa656afa782d83c7e7975d79ab7c72ed1204095b32356817a527ccb6bd9ab0f8c4d4014847d26567ac68c11fe3c", -"votingAddress": "eYEmZGBtmS1zsh2e5gmG43J5nYN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e0cb3934d25c07f053379b9470d06ba99a7348bce3da2f04971cb4b195a910f6", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d59919", -"pubKeyOperator": "8195f39e4b7b77edb99793c414b5ab8632798a5f31e30da3593710d359704dd47f3c4eae8755c2f9523cf6ab87799f3b", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e0cf7510347a605680a665d0725b13bd0239400b71b919d50fc7fcc61413a062", -"confirmedHash": "49ec79f94c269b887fd26c30924fd3de5b53f68b363f80a41000000000000000", -"service": "00000000000000000000ffff55d1f213", -"pubKeyOperator": "992521fb4c5f1b12f8a129f40c0c53e17fdd2ef9c9dacedc65deb18075eb8c71f748893e14bc4c556766e60bea3935b2", -"votingAddress": "4XC2JFt7Lryjsx9WipqWTZHT7oT4", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e0d35368bed03ca09437e3ff433ffe22441ca9fad803e2ec5b795c86309af17f", -"confirmedHash": "83a8a3243d7b236d466ebb47d9e7529524189888de422f4a0500000000000000", -"service": "00000000000000000000ffffa87757cb", -"pubKeyOperator": "001ade1fbc8a15e502c363fd608e1cfd4c812cefc69d4a14034df6955d6a83c3537c9ff933793a647553e9c929aa45ca", -"votingAddress": "3TxpsraC1JZj9BBt1h8VfPqQtjcF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e0e45d58d6e540d174a63e772f1954d2a2b7b529e211fab355c67c4434b26bfe", -"confirmedHash": "a60d3ab71c1c8502209c70a62da5a320370c3c1759cfdf110700000000000000", -"service": "00000000000000000000ffff55d1f204", -"pubKeyOperator": "8655b8786232b54ed3c781ceec558bb267bd629c84166c77973ec247390a4a639ef95d36a1e8e00ddcbf6eb3abf38e11", -"votingAddress": "2ZydN9B2dybXnZj759kbWrRYHv9D", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e102be19660a502e95c0289bbf460ed1fe244000daf91ee07984d44b56aa0e0d", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff84919ffe", -"pubKeyOperator": "09e3b6f8ccb9dbb9e8b2975235f49a81f65c74c0f07030b2698e5ff23356a7e23a2aa3b674c3e7acdc2c438ea612b4a1", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e1110d74ba44ebad7649f2d084f0b687041f2ae885e2c155cbed05638c8d4184", -"confirmedHash": "1c7ded6aa709cd4f279c060ac03422cc32a418ad3504afa10c00000000000000", -"service": "00000000000000000000ffff14cbfe97", -"pubKeyOperator": "83ee4b40aa42918c9ab2b435e41af0d786b03c9c24e0ea9efab0113e7de939e8305f909aecfdf32ce2d046794131e9d6", -"votingAddress": "sgZ6NqtNVqsVveQCdbgdycjNwKR", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e121f445ec02bbb5764d6b5c7112fd644ef8ea651dd1ffcbe86b7581696d41d6", -"confirmedHash": "e59accf123796e0e7dfe26f4fd3dc8a76244603294deaf201300000000000000", -"service": "00000000000000000000ffff52d319ae", -"pubKeyOperator": "8768f19c7e03389fa860cd827306361a774e1d6effb98f1628d0b1bf910c4be08c443b008069483107d10ab6de0fe293", -"votingAddress": "3ADwdb8Q9N9PMHszFa9JPRjoc3Aa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e124ad8eb5d51b245592aa133b9fbc32884a5b46d4e155ffa52d82c459244129", -"confirmedHash": "74a7e681f40c0ed3da984741bb702716e6e278b0ca94442c2800000000000000", -"service": "00000000000000000000ffff52d315cc", -"pubKeyOperator": "16d9c52c4c50b38210b4c82e336905c17642d0aac9057b6f21677caced7970e0be53dc073e6cf2afefe97dc66d2f95b0", -"votingAddress": "2y6NacaupW55oYowTvK4AGoJr63r", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e12a2524b8f213f14238804d48902dd836812e7600040fe7c9d46ee7a85db01e", -"confirmedHash": "0ae923366fa1812f377bf9649b6e8c644782c354494480090c00000000000000", -"service": "00000000000000000000ffffb23eb7b7", -"pubKeyOperator": "8c4dc56ad1bd61e55b7006548a8a7762e6228069c70e1f35c560854be2b6724c9fb29f0d0416af18c3e7a99a761aede0", -"votingAddress": "Duf8BWwqxMWBe4G9NDWaYpXGSdt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e12de3091b743c4add8e21f2c0b06bdcc5382709979f1267129e2749b132d474", -"confirmedHash": "926c92598103e4f12bfa8fd8fe95737dc4e6303d12a67ce61300000000000000", -"service": "00000000000000000000ffffd4186b62", -"pubKeyOperator": "9770a91e47e983c4526d905f37777954a6ee409e345325a39c325a86f2635caed5096d7e3d2dfadf8acc293cd3b1c126", -"votingAddress": "4Kzp51HooAP8BeQco9W5ALtJjHmD", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e1395447432d77a4c41ec92a9697fdd58f62cb8b05159d3d5d1b0841b218b7b8", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b089", -"pubKeyOperator": "14177be53010ef0e937279a4e52bf4eea02376b03f607a236d2d9212b934857bc594ee4b49b14667a2df56d396fd4278", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e13afbd7b58a04d52f3c1445a912996074851c5762b681bc4099d0cb7d9726a8", -"confirmedHash": "92b683438f3e5e5d94bbbdb09159ea8ac752d0ae4b5aaf641400000000000000", -"service": "00000000000000000000ffff55d1f26f", -"pubKeyOperator": "15461bf76858b112b6fd1a7654a4ede044f3fb5b85cfdb2a4f10c505e6a2f5354ce8ef8eb6d166f51a6d2bcb4a5b6d0e", -"votingAddress": "a3PFfSbQgbqAv44ZWWnwknHHr1F", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e152722077b3dab94a3b9d98df715441455314882537cf6c415dcd6e1881f817", -"confirmedHash": "de322506894ecb8fbc89e3fbd01dfb816d924da68d24575d1200000000000000", -"service": "00000000000000000000ffffbc28a30b", -"pubKeyOperator": "911aa9e1b6dbede04d776f1b6f4b754103d6c1b16f5ddf7d13ed88805bea49a4b62e9ade423b442126e34d1d66b344ec", -"votingAddress": "3A2VraPB8nb9vPSeCmqrXeRxWJQ5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e16be9c1f0cc0c6dedf2ea27b8bac332e2bc0071baa63f80cb107cde064c0e6f", -"confirmedHash": "e46907423e8b46cecd8e269521ede064c9e6b7117fbbb9721400000000000000", -"service": "00000000000000000000ffffb0df87fe", -"pubKeyOperator": "14c33ef4a2d20c132ac7988d26534d80e974e02bb62ec46fb1463fb9c702c74fb898eda359012f2ff9c195fad9125b13", -"votingAddress": "2chBwnKPEUF8K94u5ndBnEY3ANst", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e1739a0a688890faf75c92da20b9f720603674aa846c5a666f16aca95aa8a93b", -"confirmedHash": "dbdd85fd06fc4d32ed6b414faf5fe7348fc8daf76655e2520300000000000000", -"service": "00000000000000000000ffff8bb48ae7", -"pubKeyOperator": "98a2f9bd508a236de9a3f654277e5f5382427c94a25385413356dbbd5add4373603ce40bae08ffae64776c5407625dd2", -"votingAddress": "21DokLYYafVupAJ7CS65yBokgbi2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e184fd4dc246947b91c54ec8d4980380a4e5dc7522ed8345821001f21b307f85", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d56788", -"pubKeyOperator": "08353ce1f38420b9a4936d8db7fbf2b6d235ca0d7ffc9684dca6c00e97ec84a6a0e654a22603a362fa9d3f1fde99cf62", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e1896a5ea4f5412bf9fbb2335757c838c03a79561811367cce9f943388d03d96", -"confirmedHash": "0a67ca85777b8aacfacbbef6249f41264d79baf41602348e0e00000000000000", -"service": "00000000000000000000ffffb29d5b7e", -"pubKeyOperator": "0d23bce24db82fdd9a41b5e4438d19558f01652b15d972b61b1fee4efb365e910a671fd2306f51d397ff798a2218a44a", -"votingAddress": "qtQ9piq98kSN5thJgTdg4Gh6kzS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e189ab8f46aefa7a3a42629eab4b7b06ab223b1c7631987e238045a5820d8802", -"confirmedHash": "077fb87f35d4a50e17f2a819265bd39409f44b736381f3e91200000000000000", -"service": "00000000000000000000ffff5eb0e9a8", -"pubKeyOperator": "8056afbafca7d229c08df70b9f96b9d10f98fe1032f65afd1bee423cadd3a3d92175d4fd0dfcafbd919d7e099880fdce", -"votingAddress": "2fcrhcTPUCvHRbBXRpUzHB4Uxs6n", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e18a380f4f4af656e04b44f9286df7c45918a903630056f1c2a70f1ccc8c42a6", -"confirmedHash": "c1ac28dc895b46f0c08d7cb62ddc416c9eaccc0af8a2a0400500000000000000", -"service": "00000000000000000000ffff88f3738d", -"pubKeyOperator": "93bae38b4023964de331820514a151e4a6b4be1f30189499933dbcaf1b2f29c67cb67f68aebf1567d13375ec94a38387", -"votingAddress": "kVqZ8T2e81EUfJ92Jr5yD5gyjBB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e19189d6acd1b153bca2e64768e8fa07f9e381730994505d2070f475bb2ffdd5", -"confirmedHash": "b39a4821807326c4276b05b27e45b111d61214ec7dceb9ae0a00000000000000", -"service": "00000000000000000000ffff2d55752d", -"pubKeyOperator": "92aa421218fe8cb728c0e767ba9c396ebb4a7bb22ec2f1be6c3f4e26b097a7c9710bf7bc276e5b8cf21aa2d6c7ad0cf2", -"votingAddress": "3N2j9ZsizikND4rDXeCujAJ6wttG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e1940ade0fcde1830075bfd8851fad7ec6ed827ce3c49316eaf0f7de7c20d2e4", -"confirmedHash": "783fc6a233e0854653c8c3a22cbd0188b6cc25063cdabe750700000000000000", -"service": "00000000000000000000ffff52d31997", -"pubKeyOperator": "9992af3223442ef25f2f751f968f27e381b58e68a8d4f65402f178609df5d59428502521cd2731f2be92b392b1001ab6", -"votingAddress": "2KRvjXKzMWwXwkhx5JzhtrPg2QyG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e19e308d4c9a801172b7194b6893092a9fe03b519f0b2801e5e161d4ad9c2bc1", -"confirmedHash": "688ae93cec1678e70c18e3b1662cfbe909a7f1ca4ed829741c00000000000000", -"service": "00000000000000000000ffff9f411530", -"pubKeyOperator": "11cdc4aab0fb071345a2f0cc16d3421be26fdcfa1272dc4e3134a651de646952eaf2ce6a60f23f1264382bf981641d28", -"votingAddress": "MTgwuEsSKpUTkPK22zX4KifZjwi", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "e1aa3dc0bca40d7d7858d5954fb079d553806e1aac2f29fa67cf5f563258922d", -"confirmedHash": "d8e25e5d4581c1c387012a714f499815651f684b301bf3071200000000000000", -"service": "00000000000000000000ffff52d31504", -"pubKeyOperator": "96c1d00f49b8a17dd7704a99bfdc3cc55561be2542a495007dcab3c0287bcb32dcfd4fea2e1c0c4e64b25bbdf690cf31", -"votingAddress": "4Ygtb2RFezU98kMEMKFyUgkPYUh7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e1ce1b741433e78e2da19e1f52f4bfc22f94a9468f4e27b0177bfc093ee09164", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff968808c3", -"pubKeyOperator": "062103c385d321d7d9c79f3ba836dcc1c1c9eafcb1f48010a4c96420688b50b20ba09b38f22eac003cb7e24ef6f42a37", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e1cfb56d0fa5eb5d26c852464ca8d4fea196911316c64402fd78b55f545791bf", -"confirmedHash": "1ac13b6abf4405006a58d05aff36433a8e4203910171970a0600000000000000", -"service": "00000000000000000000ffff2d20a2e5", -"pubKeyOperator": "8b95b261e894469a04dba34f008a5fedfadb768ca5b861b2c0ea2da0bb301c5391d09966e7d07a82b8b2b2f1f41d5ea8", -"votingAddress": "2V9RuWffpWyMuKi6XPkXd625VHpA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e2079a45240c26899c9f621835218eb2b207b5743844d8f2fcb1ac37c9f5d8c9", -"confirmedHash": "997e1c281b502c8b330fff8619b6fdaf51a10b55912993001100000000000000", -"service": "00000000000000000000ffff2d9b7814", -"pubKeyOperator": "89677f39088db009d31008a4aaffcc1aa1647512f78091c10ca24c0de9818f53dc2f636d140fe080433adb77b10d6022", -"votingAddress": "uFvy8suqsNpZm9LLvSWuLAhTghY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e20c4bd9a145f2eb148d333dc76aae9ee0bd40d6f5eec538473a3228c605162b", -"confirmedHash": "0a7ea8bcf5d426e26b0e201dddc41b84cc01ac1805d4868e0000000000000000", -"service": "00000000000000000000ffff2e657660", -"pubKeyOperator": "8f436f1f27afd7c3c1294d6b4532413abc281f17dceaac2be1569c995f4721fa22ec9c4b5703967d968a9c815ba81e32", -"votingAddress": "LJqbH9QS8rJ43kNcpo3erd3zNyc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e20f3c79c6b253bc72a40feee60aa318eed520907797e20ec308ca2c6037715b", -"confirmedHash": "3f6d46495ba55a3be22a0b01f1c6c53d558c1819b9d854160a00000000000000", -"service": "00000000000000000000ffffbc28b984", -"pubKeyOperator": "8faa31a7580eff598220407c338075b3051667c90e1ad28ef38394cc1b085eaf8f533f7a6131f255670d37858f41b5a5", -"votingAddress": "6DqQzUiNSUGW86kJfUfMJepBczK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e21afd4c48290a5dec08d2ee4333fb30410fa155cd09ff510f7f4a2057c5fca0", -"confirmedHash": "bb251e65f4da76b684a009ea274de75fe8b6931bb233f0150400000000000000", -"service": "00000000000000000000ffffd4186571", -"pubKeyOperator": "18d24a879aae9c7cef55e8cacb93db839b80c71a36f7d49354d59d7391dd315e6ce7547df946ccf88b80b44f3569eeaa", -"votingAddress": "Lm51T7a6DC2u1yKAgwuXZtVsexk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e22282b7cb07ba297ec952660200549a5e282c1d2851d290b55b684c90958d17", -"confirmedHash": "eb873913d23c0d84b8c1bd06e91161d35bb3618f2c34ce990800000000000000", -"service": "00000000000000000000ffff8a445e3d", -"pubKeyOperator": "95684d387c1c2d453ffb7b80fa4c6660f378a1d9aa43933819cd89c0061465f8ff4fff93bdc40c09c64eb42f5cc9ef38", -"votingAddress": "3iCLkD3cxegJ4nm4g2zhMFMpwYGE", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e22b02d520874b33ef1a1611df4ef1729ff6afab7c66fec5987b6d92e8512a6a", -"confirmedHash": "50a4c2e17790cf4b393eb396ba5c55c7f68d3b5a527d3f590f00000000000000", -"service": "00000000000000000000ffff12cc45a6", -"pubKeyOperator": "8039cdd4d81d5f4512b5ee455d968d01533a037b10f014a3d2830da1666cefc990c4f0e1fc2804a34d461c92bf6313b2", -"votingAddress": "3SF3nUTQdg5pegpyKJKAyD77xWR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e2319e82e9b75c1ba2b733cbec509d9b1c4d6145c791f2ecd5b3121f8ce32d6d", -"confirmedHash": "c58971671ff2e5b2629c64cf449fb208b7215008b0a2aede0a00000000000000", -"service": "00000000000000000000ffff52d3199f", -"pubKeyOperator": "190dc556fbd56e3d80e25b78306955c26ffe93e49eb3739a14001dc703b0a52b6d2223bf984ab4cf8557fcdd08d46d89", -"votingAddress": "45zEWDPo4m6nJJbHb3sKiFL8KdhW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e2366fe22f2e727a99d92caf85295cb25e60472c526c85c8433a63105f32ea20", -"confirmedHash": "bf081b40c04fed91c3ff2e1ea01a9c9fac44335c8f16af190000000000000000", -"service": "00000000000000000000ffff80c71110", -"pubKeyOperator": "0779e2d9b0c9b593ba28cf8080c3846a520aeab7db857c4d776535cb80b7a4f6b07748153be64f114bc11ff2722fd519", -"votingAddress": "zFixo2oU5rpDm6A7BQjUFbMXpBx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e23abec439cfe559485880fe21fb862d9747088908fb867f02877910ddfb298a", -"confirmedHash": "2eda4ac8508b71bbbe59d25082860812789672f549b538db0200000000000000", -"service": "00000000000000000000ffffa747e91e", -"pubKeyOperator": "86e5dfba6909a35a123015436f6c07dac86174241b7bb1cc07eb991999d0f47688d29d61f8eb3200182837ee93c448ee", -"votingAddress": "GSXWiDQkPbeTBM7oLGJmLR8P8Bs", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e24b5d4dc77573d6532ca39b97e47e0965ab484727936b50e4ae7b57334dd162", -"confirmedHash": "9fb90c690dcadabac129a6532e0d158b4e9d25ad5fb14da10600000000000000", -"service": "00000000000000000000ffffa8775305", -"pubKeyOperator": "873688f214b494cf7015f31562d3bb865c5d1eb214f57771276feffce8a037cd7967c367f932b53d84671eae8bf39336", -"votingAddress": "4HQgjPw2uV52m2j22NKRExrCapaR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e24eb6f5bd3039aa8af8a1d17a67cd4ca047b49a70fd34709e29918b312747d8", -"confirmedHash": "6da297df3f5b45a1496735a0fc735adcd85f322d778531c00400000000000000", -"service": "00000000000000000000ffffd4186a33", -"pubKeyOperator": "93ccf65844dd5a459204e80be764061a8ab39ab2ac9a16c11072a5d55a594bde67b18dc0c3acebe1935554aba9b62c46", -"votingAddress": "2aHVeUJL6E4H1ZtDdH1NoEsCQhdx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e2557d31e7382391956771858434260dc6367370e1c5c93c7ffd47bb1f947447", -"confirmedHash": "8b799f3478e8a0501366f35e65db7a072806b15d8499127e0700000000000000", -"service": "00000000000000000000ffff2d4d01d5", -"pubKeyOperator": "9182ac5eea3b80e79789b67bba02a4d550a95286014344b945d210d3ed862f00829985d3f6af2e7f1ee6ed1ca9f40e80", -"votingAddress": "2yufFZAZ68yEMQwX7wYp9oXgXjc1", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e25b049dcda03cd9e6f76fd3cbd67a256a8eb25b5b67aa0c5e5a369120cb929b", -"confirmedHash": "00bb141fbf1550492e724c4768b3b45da1a2430d84c2fd1f0700000000000000", -"service": "00000000000000000000ffff2d4dfc79", -"pubKeyOperator": "8088fddab2f572246b7e95dfcd497255779e567dfaa25099460c108b2cbfce7c1158024b25c2248b21deb85d457de129", -"votingAddress": "ynob3PXWnrqdUdq6PzzSFq9A8uw", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e25dc69a128c979fcc6928053f01d3f64f6e0a73bdc0c99f499730b52c3e36ab", -"confirmedHash": "3291bc67e68117007dcf1f70f1664a967b6c98542a314a0b1100000000000000", -"service": "00000000000000000000ffff2d209483", -"pubKeyOperator": "8fdcfbf79ba282ec7f172fbf8e66b52eb2f433964bafde92e89c3ce0972d5522c70658f91b78918f592c44f2a52c4a9e", -"votingAddress": "cd2tUndGVgL4XdS8wcS5CdRudCy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e25f2231a7963517aedfa70b8d08c4759b55f0cd99f3f1864740366e15fdd4a3", -"confirmedHash": "017a433576a8bef6ec115ba2e788213d89d5267747fe68ee1600000000000000", -"service": "00000000000000000000ffff52d31930", -"pubKeyOperator": "11134c0c1f13dbdf4ec30bc054f0c974dfb3d85d75a03e2002f4e5b7a6eb18df79d135277c0f6fda5a1cfefaf6855636", -"votingAddress": "C87wuSvEqw5w7sk9ofbJnykJZvx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e2631c614b3fb8af0b622f7bf617fb06056738cbd046a131d6f186def544c11b", -"confirmedHash": "196b5d6af5da3cd5a988f5ea0ebf2efdb68bf3fbfeea9cc00300000000000000", -"service": "00000000000000000000ffffc11d393f", -"pubKeyOperator": "94b94fa1e24a9dd749fce36ad738a8c6c8caae91f2e45636f21b11bdad75bb26c08e2ab9434f1109af87b3626f35cc26", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e2640b38229b6afb5ac73a0d798e6dda2dc5ff7d48bf3d6513eff0917f2be545", -"confirmedHash": "9493d47aa88d1800be01bb6f771cdded51c02361c006af2a0b00000000000000", -"service": "00000000000000000000ffff43ca14e6", -"pubKeyOperator": "987161f93802127a3b0fec3c104b4af700ef79955819b611e34a88e5093e84a0a72da5c196a0173e0a884d2f02c885dd", -"votingAddress": "2rd9QWQ37e7U672vEUfV11oSTbGy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e26974661731fca6b3cd2e25af14c6cca3f5ae912b044f955063ec5f5a53c410", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff03621fc9", -"pubKeyOperator": "0a870fb975429e254eede36ad18bc390a9161fb3f1bb04790f4466837407ca72642b61797bdb81f80a6069b9ef556ceb", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e27c3854e29cc72f560c03df15bb70a960a46cb7f57e29774843deec7c58da70", -"confirmedHash": "64b416cd9399bc1885fe1b660d1c1d6a383970a6c5a45ad50100000000000000", -"service": "00000000000000000000ffffb07b39c8", -"pubKeyOperator": "9944c5bb2bc25033a0fa951dee3ceaf74949bbf18f9c4a37402272f816040e6f8f0b979d6da40e14d580a4b12fae8177", -"votingAddress": "2TycgBHTLy6Siue9gh8z1wA11AoU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e2a00aacf1c5761e21df9ab74fb1a9223400119055ee94a2f9bbc592b86e5175", -"confirmedHash": "ff25bc286455940d4f4911b9542adc448384ee6839fb51de1200000000000000", -"service": "00000000000000000000ffffbc28e714", -"pubKeyOperator": "8e7e86676d947eec52fbc53fa7e02b589b77b2c46e5f9b8f7de0c685dbd1f820bf6170315e1f896562293871c52da00d", -"votingAddress": "3seF742LwkB5G8Kh9E9QH427epNV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e2a82c40b75e18a9f75424ab5f9df2deefffbb47ab6c0f17301b5e8fe80f7424", -"confirmedHash": "62395b222f40543aa619c42cb9eb1793a19975bb8277054e0f00000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "EAZCe61a3CBSk8ex3pkqaN4F6fy", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e2c6fb3f8cd42d2acfb58b3f198047d12b9be166d9059e1747a1d3e674aefe85", -"confirmedHash": "5ed2b9822cf25ae908f964aab669c638faaa6d80875a7ab22900000000000000", -"service": "00000000000000000000ffff6c3db34c", -"pubKeyOperator": "05ac3e0e26eb52d86f1f033026689a39639ee24d4cc1737f66a5aa9b57d4c9216136475d93204b3e4189ffd733921881", -"votingAddress": "2mgCLZeuW1LkXYgGMj1ioA23YuSR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e2c7471a29f5f646cea973c5d073f01588807e67c2b7c2ac7bd3817c890d8526", -"confirmedHash": "b32e33bd8ad609af490fc9e4b31cb919a7477ddf94e5614f1500000000000000", -"service": "00000000000000000000ffffa123447f", -"pubKeyOperator": "95a894e4112c2e77ea7a4fa61a4a63f4599746c3fd7bf515d9cc1d2924032625d3c63625e91ac2b8f67e2cb6905dc2ef", -"votingAddress": "3ztPd3E8N3yyLKxpXC8wF8hNC51N", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e2c85c287b09c25ec544da6f0e66abd88d80190fed0f909dca53a4d361843181", -"confirmedHash": "3550b4f95ade9743bd2f22972f090033a4d43ee28b3309941d00000000000000", -"service": "00000000000000000000ffff453d6bd7", -"pubKeyOperator": "91cf78e72aa5f2c07018b92feb6f33e2a2aac6b16e592df6797a83799f0155327d07fce524f25e09482aa4ec6d069a25", -"votingAddress": "eY7vWhHJyr7gSEaEx9UZJnq9xEV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e2e19b9ed691f5c84927dde6fe19026c388698670bc8101fa8ba180f1d1a0188", -"confirmedHash": "8e45bf03c8478990f4f9a896ebb87caf17377492b443b4290300000000000000", -"service": "00000000000000000000ffff52d315cd", -"pubKeyOperator": "0d073450ae604f003f17e182d7653bf90da453744839bb123990f1abfeaa07b021438d460e8eaac144fe98994b7af432", -"votingAddress": "3iDz3qMRVA4etVP4NT4Dqv2U7TkG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e2e2cb4cb49da8487639ec62cc2b7b6dae4a564d2a8a98f1cc4c51a40e49e4e4", -"confirmedHash": "6dd5d1fbeffe7fc6bce49f6b211aa122a5c5c2e666963e0b0c00000000000000", -"service": "00000000000000000000ffffd4186795", -"pubKeyOperator": "95250437011019d5969299b5f727e3f2a61c6831eba6cce7273fbe51c45495543041c934e71461cddb124353bb7423f6", -"votingAddress": "3bBVfTtfBFqVEoQ8KZfm1jkydbjv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e2ebff3219f5a1c8a2fc1cb2b7284be4c85074d340ddc7833f318d3c54f82ade", -"confirmedHash": "2a31ab28a5623f3c71cbfd29b3467b8f2d9636d1efb59e1a2c00000000000000", -"service": "00000000000000000000ffff52d31945", -"pubKeyOperator": "98677ae518a1045cfaccde7e436f5adc3dd739729a91efad0173bed69b4225cac42d2a92af63b8b252e8fa94ccd12e49", -"votingAddress": "3So2kR9L2KDjkqmxsUaKETENPhZc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e2ec74a2cdb9f171474760bdb7daad1fba79e197eb89542257f86a7609b4e2fa", -"confirmedHash": "a44a80152a626176474b1cbcee57e4f2dd2b33c1f349b8970300000000000000", -"service": "00000000000000000000ffffcebd8f6b", -"pubKeyOperator": "15929f046b419e3392ad5af212173010b35e32e588a3bbd1dd68496eba77817b6cafdf55d41792cfef3040abae42b50d", -"votingAddress": "wjZj8FnBwatR4GFwhXXSP6Z7QMG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e2edc64926ca60ef4ce4188b4481d681773384cf0ca498ca9b9cf04f34fceac1", -"confirmedHash": "35a7609a3a6c5d85265dd3e7432412ba2bc7918c12920f650700000000000000", -"service": "00000000000000000000ffff36270a64", -"pubKeyOperator": "8f720886cc28ae3548c3fffa36d5991faa3876811134900ade3f18dc9f512716d267f16fbb258c1c2faf7ca603ec01dd", -"votingAddress": "2vuoUD7qNM9abHKFGhdMnqs5EZ1N", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e2f31226919b54154d911639a994a191d6bc742f988a73263b784074c082eeb7", -"confirmedHash": "b178e99c0d848b2117da0032ba14d6d9be8362789509a5231700000000000000", -"service": "00000000000000000000ffff55d1f13f", -"pubKeyOperator": "87271f6b6c951e8b86f4aa96abe4a7d034fd9931bf8089964083768a1f6c76e03f414f706b968f023b2aca968d152923", -"votingAddress": "2drCt36jog6pY1DdUsjV6aPYaXgN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e30e9d1d9e2f67f204a4aa97924739bbf0f5dd17aa4bf935fcfbc5fa59bb8c28", -"confirmedHash": "2b372973e0b116b39ec0f659d6fdd3b085e361573f6e980c0000000000000000", -"service": "00000000000000000000ffffbca6bc2a", -"pubKeyOperator": "98f02e4f6b1ccd8cbcc4b353505749516982782d5ba456cf99992b5e030947700d8cb1f33e91d3e79716b7f6fba5180f", -"votingAddress": "3CoBwW8KLdWCB2ns3w8neuYBMdRM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e30f32fea12be1a44f227633a06b82741603c0ff10ea81467eb8ef03aa262012", -"confirmedHash": "bfda2bc9d6201590a97fe04b3d3158846836ba1e6d62ba410500000000000000", -"service": "00000000000000000000ffffb23ec266", -"pubKeyOperator": "8e69d42122899fb8a8cf922bf17a4f5d239e885c24caf0ac8c1c6e20bf404ca1cfeaa364108d547e3a1e2190bc704312", -"votingAddress": "3FoKMcMPS7yLnvFN197Wbzfvhy5s", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e319c3a5c327e745c26a4c2ef5aec72b1a469100c9ced5c4b8bb87fe0db11f43", -"confirmedHash": "b8f517b027ed16d27856678e57c0b6bd853d02dfcdfe64832c00000000000000", -"service": "00000000000000000000ffff55d1f190", -"pubKeyOperator": "14e214f55ee8d991b947c42ba29b73db70270e294c7290a7c84c4490e7a80a9bf0f0876ff6bd8137a5fa869f8b35c083", -"votingAddress": "4TT7WNLLBc4zq7AiHSVUByLhSC3x", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e31e0b3eac95530d3da2f03a2aad02ceb70342653a72d275e9fe9377b82b1351", -"confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", -"service": "00000000000000000000ffffc0a90759", -"pubKeyOperator": "1040cb11541ba3ce31f18ebcb87478297d1c45110b9a5cd82a229283527e58797592705fc1364c0ad4ad83dbaccc4674", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e32e07210e91f2d582db709aa82164ff7aa7b8e658744bde0931a800e6022e7e", -"confirmedHash": "b7ae2fe1253df4920d1daeafd5c9d1be9359253484f569e30900000000000000", -"service": "00000000000000000000ffff5eb0ea6a", -"pubKeyOperator": "01ae87b6c776f2dbfcd0b418ee21a5bc36e689191b7a084d89cf3e63fb4ecbfeee3d0494b74be4d842163db75ac5b864", -"votingAddress": "2V5RjkBZjo3JX6eQ2iovEk5uscsG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e33619b5e53c84b7144590959680d3e0512121ee01bdad6b9120a88ccd7af8ef", -"confirmedHash": "c8cca8413a51f5fc94bf110489298874f3c0e3741131ec252b00000000000000", -"service": "00000000000000000000ffff2d4c4713", -"pubKeyOperator": "8c04177be0682d8cdb6bc92463ee86ef23b00abc6cbedfaaa8787d5e15944bb53e21f727009fb5fb206c3f4d2690c710", -"votingAddress": "23R42dYThfa56SNFVXkA6wvvFKTf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e3574bc9b9291a3f1cd662a7dd2539e7023c87aecb950eae3e4abb6297a9565f", -"confirmedHash": "ca451792b3a3f0a84e3cb7d581ee42b0a83cd51378d588491300000000000000", -"service": "00000000000000000000ffff87b53487", -"pubKeyOperator": "0e665985142bcc716a3b0969cb7ef937eb3db29e83e3dc98ab3a4bd4451e72a5d555e38a5621c9a3528307c68b667c97", -"votingAddress": "386izay1rjkTfceoLNcRPSiiM1yX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e35787be4ed5c90ac4403ea10b995dafa59c36c76b6d349b54f921d7231f4256", -"confirmedHash": "89a5e884fe8b3c35a14bb699c14d6d7e4d19b50e2a7dbe2f2500000000000000", -"service": "00000000000000000000ffffc11d3858", -"pubKeyOperator": "01b4867eee9ed04800e70c252db0939d527e292bf50f9fd19df74aad13e28407f4766e5eb7a24f5b99c2e2c34cec087e", -"votingAddress": "YG5LQVY2BA7oHKVWgeXjksRAVQo", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e3881c76985bc1e903e2bd71ee5dafd4962f1d53640a4dac100aa7cfa0685ea6", -"confirmedHash": "c4c03a580f009353d4aeac1b967d647fe51c8692ea66fa3d2400000000000000", -"service": "00000000000000000000ffff0888f098", -"pubKeyOperator": "063103e0b8e54d9a495e2b84b68e510b3a9f88279f3ec6a3029b93ad0065ab118de0f42f6aaf1d06b8feafc6081d1fc9", -"votingAddress": "3MEN9pZykBWQbgLYnz1voB5mcxQq", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "e38e32c1a047eaf726a9006154b3296e206fb73a6655702d16dadff50df455ca", -"confirmedHash": "4f4211a7959264522248148652641455b3f4dcb593ff27662900000000000000", -"service": "00000000000000000000ffff52d31566", -"pubKeyOperator": "8eb7610c0453b7f3e0bd17097b69fed91df6047ad54c320d14810720a9496943c251894f4f5cd8e4e657d052876bd09a", -"votingAddress": "3yoN6taHee7ui77e91ASEEDPx4iH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e398e35434b46bc66a0d709cb86aab9745ab204d3adbd01a07d6f774f389d03c", -"confirmedHash": "f95d58e237f90d5bf906336283b059e02687a467f1ce27b71a00000000000000", -"service": "00000000000000000000ffff87b5cd83", -"pubKeyOperator": "8d1fabb183eda9bbde1ae67ebec745c8e87eb05ef53cb823af51b2601aff0c4671691186d9e2ea5f2963ccaf5ecd0c5a", -"votingAddress": "24BUDigjKRk7QxbgRUSXEtae9aue", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e3a3152047be59f4c6fc3603860aef17533f64b298912d3c13db262f851fa4fb", -"confirmedHash": "23a447703fb5acc020259309794341219842c96270a8e8d31c00000000000000", -"service": "00000000000000000000ffffd161bc28", -"pubKeyOperator": "130b1232750e1745f96d6424a4ae8f5002350dfd55eea9d9dee55d2b6ba238f3533fb3a9b5ed72651439c17406f27462", -"votingAddress": "3FYWst3gVdwWuxjX6uFYgGQdZw2j", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e3a44ddcea7e1b1126a00db9f6857132daa126c899b3051205feea201ef315df", -"confirmedHash": "deea24e962fac02cf223dd40dd3f1d84e4375d0d51276cb70500000000000000", -"service": "00000000000000000000ffffa877578e", -"pubKeyOperator": "97fa308b2dc7974c408a78cbd7cba0f6bf6410718ea19e60b7e826391324184cc4878598707773639ebcea330ede8137", -"votingAddress": "vFZzLrVguVF2mXcksBK2iPBFQ8L", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e3e860f2bb79a41bb04bb2dd85bde44af710946a5bd6f13625d31764fc75e0c8", -"confirmedHash": "93269107efd05ef732da33a4e7f6dee1c0c5ee01ca472bb21b00000000000000", -"service": "00000000000000000000ffff6deb4172", -"pubKeyOperator": "914ddd3e0982cd0354263f64dcd38e66a1a9e1d31d32a003795f0943d082e258f0777d03d0faa2f0d86279a0776d67c6", -"votingAddress": "2iX8xVWwtKkgBfjFrwgVzsN2bNdU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e3ec32cf11aa52a2ac12255d48b5b05849ccd41a14a22aef8a5f24d90e15efdc", -"confirmedHash": "c0acbbf549617a4bca5bc2ee4de641bbf41c3b2bab6703d72200000000000000", -"service": "00000000000000000000ffff5fb3b781", -"pubKeyOperator": "02ce2d141c450d4cdb9c25885ec856129c25c7ceb9d29ed9a6c74a6cda74b18d65c55f7effaacfaa1222855dd3c3ef83", -"votingAddress": "3vs8ZYd1QBFH4fvhW2QRBY3oowqa", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e406f03c6f9344c5572447aa4c858bf2209b44f47f681451d04f875ced04ed91", -"confirmedHash": "eadcd25a1e89b9a9920d0f3e54ff03355a95999e588e31a50200000000000000", -"service": "00000000000000000000ffff3344892a", -"pubKeyOperator": "156d3c3d1a94d8194adfebf404d8834851f0258c6a591dfd7b9f8ef3a929ad1bbbb018a4214f0d0cda90b2b31571acb2", -"votingAddress": "2SKkQeumpVYaq3nYeFkyKmVocVgE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e40f8d60e5463c211cc8ccebc4dca281273f909dbfd6eae453b9a483d3160a45", -"confirmedHash": "daec1bedd20b405a59a32888650cc0a384f5f5b42856076f3800000000000000", -"service": "00000000000000000000ffff55d1f188", -"pubKeyOperator": "95df01deccba5f8ab1b7517108fca9b85da5f92c74dfbef05d7c3f1cd6b07afa49ad9ef2745ce689f09f07f770f82a2c", -"votingAddress": "2Yk8WtdD6rssTMsUmPVHNpsFv2RR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e458269db3be50df30a492df58d8c23005bb8f5b9075e56caae014af43423ece", -"confirmedHash": "7ca4ae9b4068b62543cfc959a121c8963be0cc58f59853f40a00000000000000", -"service": "00000000000000000000ffff6ca08806", -"pubKeyOperator": "000a9e6ea91c589cad5dc6d4b018ff236d0b7bb6732e91747437192c9a9b07112b8b53e9ded06e0b642acdd7302d055a", -"votingAddress": "4CMozVB3NGEcoqjvhtnn1a16Gbse", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e468a2ae9cb32c9a442d2a9c936bd391f037be672c82f693eaefa7a44d160694", -"confirmedHash": "44fe152605da583fce90b922711d4fd92ab126201d72f3520800000000000000", -"service": "00000000000000000000ffff55d1f114", -"pubKeyOperator": "917d4210f07d8849807e4f8479e52c02d27cf251807a32fdd806892493dd6b7f6d08131f32632a1ff141ef605d09ed8a", -"votingAddress": "j78mWghxjh4rhDmGYYyWvyQWYty", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e47498cb620f332aa953e5d5cb85f987f3ba4e25970679ae9d9562028700e66f", -"confirmedHash": "a4dec54f19a3a576557ff8a021913be243a4074be6f757ad1400000000000000", -"service": "00000000000000000000ffffb97a3ad4", -"pubKeyOperator": "9077aedeb974b24aadd4bd6a51acbfad01e245d1ddb703a1a0ee58de0317a1df4d7ff753bdcfd18919fdd40a7b635320", -"votingAddress": "3ZdkfUH719jtz6MTH2GMziWyBdD3", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e48c0a18b4a173e338fc0667d1ec15a167402749195282da1d69957974523359", -"confirmedHash": "72b294c899e711b1b4d7be920f7f4f8ab9e4b775a3ce0f850b00000000000000", -"service": "00000000000000000000ffff52d31526", -"pubKeyOperator": "0b87469f21c89d603a8da15bc4947899350d607ee5c56b0d620d4972b1657f165e7f3cbe91dd08cea762135716acbd74", -"votingAddress": "3EJwS4zbcZbgx4kFaW63XvbfKLGi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e49af7fd7ac4cca63ef529953beafcc5e0b207185bf7ab8bec223a022c577e0e", -"confirmedHash": "1a6d530e589539a0427b29d42e7d0b522424525d8c487a633000000000000000", -"service": "00000000000000000000ffff035dd6fd", -"pubKeyOperator": "19e934ae4d713f689e2f33303c210005d769e8bb16134fcbb6611a67f110076e6e674a99bea6e0f77bac632b45c46d32", -"votingAddress": "Lfj6yJk9ui3NH6q8VeQ1bSFyasr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e49d092c39df4333c05763524d624f30ab1f713dbc31ccf33d17028d61122ec0", -"confirmedHash": "adb93b350fa1085a2fcc8d29335c46f7050f88d0acddb9011e00000000000000", -"service": "00000000000000000000ffffa516ed24", -"pubKeyOperator": "036e2f29590814790a6f45558e75a5de35ac4d48562b86eefe27ffc76f6609667070dfa9a7b5a32a3b115e913ac588b9", -"votingAddress": "3Jzcju9q4Jx3LBqwjotnp3Jw8Pug", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e4a5f4b0839abf4f106a5d653aeb49f82f8921dcddfb74b29e4296b3c9d7c33e", -"confirmedHash": "8969e58915f57538e8f3735b5198b5079655b3a9f3c46e760b00000000000000", -"service": "00000000000000000000ffff36270a66", -"pubKeyOperator": "8256981dd2693339298432517afe97ddb8a778ec25cdfcd09118ad2d09ce2bb59eb6ac663ea58644e7047276674f172e", -"votingAddress": "49cehp5ujGJTjfR8VJdJwJv2QjRF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e4aa70d5a59b742f26b4c08a39f40529e2bbccb6201b272c88a00d6e1a308d4f", -"confirmedHash": "8248dfe923aa60ab5d0afb57d2d74d462f11835c35e2876b0400000000000000", -"service": "00000000000000000000ffff80c711c8", -"pubKeyOperator": "8422fa54f8839b8c3c38b8c2e0fe006d435eb7ef4724b414787f7eb448a7cde184e73c8e0dc74d3f75185cf5f769c3fe", -"votingAddress": "485DrBAeghjw5LkQhMix4qyQwgLb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e4c19f3f143d4d95cfb7318f5c0cc98ad97660c97b02c3214afba4ba86dc65a6", -"confirmedHash": "208e01f5b6cee5777f2395b622eec95e547875b11528498b2d00000000000000", -"service": "00000000000000000000ffffbc28a31c", -"pubKeyOperator": "902f6767a0b069c892b182802bd2a49d351effb615df49786374b68b278c4607722d07900bbdaa7e0776eee7024461f1", -"votingAddress": "aiBGyTfF54mKdmytY6nwU4SBT5E", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e4f6fefeae2edba199c1e858c82556f496d514aa0498fb6a5011bbcd1716b024", -"confirmedHash": "69b0d7dd749eb755347ccc6b0b469f7bdfad817ffa2ddc4d1e00000000000000", -"service": "00000000000000000000ffffb2807587", -"pubKeyOperator": "02344720b330cc7158d4e3f6db7ccba83389aa512aba8179cb1066ef40c5b57f7c39c5a427238033217d53a75014bfd5", -"votingAddress": "3ZunEGqFdNwKZGDMCcHokvaC3j2F", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e51634a3b9f3eeba7d3df90891cbb40225453f7cc8d470a99372fada5214ceaf", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d52f67", -"pubKeyOperator": "95c3ddf8b787512402f34d27bfcb36961f41a3ac9351fbc53c6cd95371deaec83e68ee78e18a341df9e2dfedfc8677b2", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e51e4dd36238520f4ea448cbb2a2d3f66faf22b0b7864fccbd1c3d108bd91df2", -"confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", -"service": "00000000000000000000ffff87b558c5", -"pubKeyOperator": "9185aa462f67e977f55f1f70aa7cc7f5f48951e84391a6773ead2bdcb4e7d2dbc522bffa6960c9a651b80233df52436b", -"votingAddress": "2WUD9BSZ9rLvTKumvYYq52maW8ga", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e524fbdf53c44fad5414f0ddb2850e5971f25eb795fa87453a2dc509129a7e16", -"confirmedHash": "0af85f472932784ec1b4bd6b6077765be28d84d4b0b1bf040900000000000000", -"service": "00000000000000000000ffff87b594df", -"pubKeyOperator": "92a900242df760005ce9486cabca694344738f44e9e0dd8317c1048e79e7cd2a9ac1823140f3101c14097e02592affcd", -"votingAddress": "4MNaVaRiSHeC2sBoDZWgYpG7fspW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e56e81f5acf8901c59bdd99a338e4ad4bbb21b591b9df2dbf5f71f8a6ecaaabd", -"confirmedHash": "8c61196c0def0f67929e6dd321a62bad2bfd1c005a1df9211c00000000000000", -"service": "00000000000000000000ffff92b9951c", -"pubKeyOperator": "83e560d476d6d6fe9f2239b50f9dfc20e90668faa40cd6e07e9dbbe8fb13add5fb99070132b1da6bada7945d4071d89e", -"votingAddress": "4F47YxDDTNB1CyaHVxRCVtZtq1W7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e58218b059f4596b4a558147c92f6ad6b987f966fc311172d2144ba74df90e1f", -"confirmedHash": "00c192ccb42a1f5ee3153ec2acf5548a7b734eb373d472560700000000000000", -"service": "00000000000000000000ffff55d1f24a", -"pubKeyOperator": "04327a6c8ac45749e0258a193f3997a1074fa442fd654654528f1a3c075a0b0fd6a7a45ee77eb090cc04c49afffc9b07", -"votingAddress": "3ovH6bo5vpc69pZRW2cs5Lou8W5o", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e588e0e54fe8d5aee45cb010b768136fb400043a92531a11c1b71b0413ec402b", -"confirmedHash": "75186cb23c27d1b5ee4e62d18a3385e5306a5395d9f053e40500000000000000", -"service": "00000000000000000000ffffc3b5f342", -"pubKeyOperator": "9555f97d16e75a135d98ec2f52a8881a60c790673cad6d9f0ef0e52bca3b0607aaa19cfec7ef4512e85b7fc687d0f3e6", -"votingAddress": "3ZaLnbRBwq15kmeVDNGr1qCVRh6S", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e58d505fcc53642a2d164e55b45a9b1a219684065196d5412cb626777d30d887", -"confirmedHash": "4171e9c7bafcb1164879ac9550c2fc5de3b5a52452d2f4440b00000000000000", -"service": "00000000000000000000ffffd5a8f9ae", -"pubKeyOperator": "93ad20042e89ec74c299b961592cbddf108022ec4742742b7a86edca6b5db105ca715bece550f73142b0ff80978c9076", -"votingAddress": "3amt47xcVQ9NbrKYBQFNLpSfkyQC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e59d6022cfaf1415671284679cb3636e7408f8513d8b2dea4b2c697083c00064", -"confirmedHash": "3b972669fd147c77198f97e03135962ff4902c0efd1405021700000000000000", -"service": "00000000000000000000ffff52d31506", -"pubKeyOperator": "0ccb7f4c1de8c75d8bc761fbb46d0d625fb416a416b22dcabdbd47becc821b80437f351abd48bb334531c92966ed3e61", -"votingAddress": "HwK6wWkgUd8oqNf4yve4FjuNWfs", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e5a7e9f4389e74e7f7150483c35b762dd332336d3c672d9e2939f6d30faad6d8", -"confirmedHash": "5d90b68937c1359931b9db0413e9dae27943a1f6dfb09f4c0200000000000000", -"service": "00000000000000000000ffff9de61137", -"pubKeyOperator": "8939f949047e3fdebda01fdf0c6b16b4b616e86ca9af56e208018da8a9916744fea13dca548e6e38f5f284af0d3a1cf8", -"votingAddress": "WtRxx1mu7qpFjtJytvEqrZMu1JU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e5b5a01f94333f901fd2f562b3ba644132e2919f870d314155c916cec67919e0", -"confirmedHash": "86c51030a9e8c82b7c49a35c5b07275bd9d8e53470f4a2561600000000000000", -"service": "00000000000000000000ffff2e04d9e2", -"pubKeyOperator": "853bc3ec16c7647b42bc36ccae05dcf5fa2b980cb762b85a6316365d237c6c989240032f5d4e250866d41e444eb2706e", -"votingAddress": "49QyMiEYh3bfjqh1oM9XcxCVz41h", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e5bf315f529d0214508400f04e541cb95e6072a119d54227484666a9dfd36610", -"confirmedHash": "8df74760d612e08c1c733235b18d774270830d59d72b0bf91800000000000000", -"service": "00000000000000000000ffff50d1e4eb", -"pubKeyOperator": "0a9074a6c313eb0b4f90d7ba2152837a60f61d18333d2a3bc60dee27ff3db15ff0e25114993e763f021558caa89beef1", -"votingAddress": "34CagQUqd1kdkoFTouTkj1RrQ16w", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e5d43140455c2e6c66ad6fd4fbe0553583ba033875e9a9a8ed74675a470592c5", -"confirmedHash": "00476112cc95846f5406a66b9334245353c1adc670148f8c1000000000000000", -"service": "00000000000000000000ffff44b7c075", -"pubKeyOperator": "150f85dd97cbef73c72aa8bb0dcfcb0dcc4089a3f5c3a54fdc9b4a6e64047800db76f71e82d4f8b36496bb7ca6d485ee", -"votingAddress": "4TUvJC6XHNB8ZRJZRLPPJjt5WrPR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e5e4691a7b2d0f716b1e735d5510bf7404df1915ef807efeb88ad1463cbf3fff", -"confirmedHash": "940b37038967c460d991890c6a11903d87231fb714ade2073500000000000000", -"service": "00000000000000000000ffffbc28fbd5", -"pubKeyOperator": "1239c5879818919fa29176e44c3d58e2f0005121f0623919a88fdd3eda9889f0c3f0c69cc2766a09e0647020b53f0a6d", -"votingAddress": "371iAfz73gRkTs2JBvUduKJwTC4L", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e5e5171d152f4a3e03327618163ce7603063c1d5deb3ab779cfe008d687e2ca2", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff968896cd", -"pubKeyOperator": "8975631415524f95dab88de305b4691e8c4e378acde9c25bfd33b68fe8677495863611a1051755d9c1b126f1f2e2ff93", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e600976ca50b10f1d175283c76543997e92879ac51329917156230bd744bdf17", -"confirmedHash": "b42a1ed6e2e9212a2208c930fc23b7efdcd97daebbe2c2591600000000000000", -"service": "00000000000000000000ffff8b3b38b5", -"pubKeyOperator": "11c8147072418f7406cab944517233d6d7ae02f01775b0cd18af340f4c35a206d2e8cce23e6ccb00c0bb969760144a3b", -"votingAddress": "3bhxAWGp4VXg77ZAXjf13PmkKXR2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e607018cfa0afb019cb35f4941bd71dc3ca09fedd55cd20e24e0db3867f57953", -"confirmedHash": "f8799cb7b743f84eb1ba62abf62b868f406304ad3b7d66d41800000000000000", -"service": "00000000000000000000ffff2d3f29e0", -"pubKeyOperator": "83d125a67695bdb454096730767064b48073152f74cb232972ed135e631708f7de73d1587eeb8eed1b20d6abf45d7fcb", -"votingAddress": "3wTgJc9nFCHbgTXzSp9X54ZFXscJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e60eb8d55efc2442e8365ed49e0ef6fe44939dfa9322417448338e480b3facfd", -"confirmedHash": "3d75bb899edc3b8dbb9c25b2d877704c764a2fda6f4eca6c0700000000000000", -"service": "00000000000000000000ffff4e2ea277", -"pubKeyOperator": "01d446917a9198530cd0ea3910363878d7549636f85984b6082428fa23b701658e7b69ba96cb181bd81866c3111400ab", -"votingAddress": "Nanm43HAKrK4fG21pxoz9SA3cb6", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e617931c0022a9a03e27b040f575d852add008d4e4550832027aef4bec2f45e9", -"confirmedHash": "672d3ecec79ab6b63f0f8483555ca51b6a834e050f3b6b6e3400000000000000", -"service": "00000000000000000000ffffbca66508", -"pubKeyOperator": "055d1815b8f2f700ded2378dc28f380477a0a5aa08b204139082d1f69eed99bf002baf3e67b4ed1afed724bb18ce9bc1", -"votingAddress": "38dZCND8uaDD5bek7EV5HbYJanao", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e6365a07df051dce417a0a2cbcd71cfa61d92a5b12c43db4bc93a58f3d416320", -"confirmedHash": "60e577983eece8fa69e60d42d2f3d9b83bfc146475a3591f1400000000000000", -"service": "00000000000000000000ffffb95cdf19", -"pubKeyOperator": "96cbaae2e210b872c9e680c631c9b1985899dbde70dd1e570f41b2e3287d9e99a152aa0476094edc647625b3ef46605c", -"votingAddress": "sGLny5TTSeoqWxNXsuDakLctchG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e638bad78c5e5a7ad4be072e85e08ee2cccd25ae24b011d688e301f135be7dfd", -"confirmedHash": "1435ee2c7a90f1d4b52b7861810792f9225680ddc6d4a3390f00000000000000", -"service": "00000000000000000000ffff9f411648", -"pubKeyOperator": "01034ce52d7afe41e8ac056f29fced37e7a26fdada475e2c23b2b03b6395f763e64503d1d9fce87284433f8dfbb1e05e", -"votingAddress": "2ekxENniRF2Mw9nm5s85TpNnVpd5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e64f5b807ab593f0eb2957fa48295afc7ff9e3382a55b899bba90b428772b146", -"confirmedHash": "1efe5b6ca37694c20a32f18223839acca385528a5c69a9d02800000000000000", -"service": "00000000000000000000ffffadf9358b", -"pubKeyOperator": "88f2b9eab14254c32472a56476c8a044c4f07ec9cc650db8c6d725b1650835df444f196b08d9557260df4d849bad73ed", -"votingAddress": "PgoC9JfPVoC1ENrWRaMi6uE4oGy", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "e65fc346548b55db5c87e942cfe3412b0ac8d9c91cf939bf5ddd4b15ad5767eb", -"confirmedHash": "7532053b4e14c8c710eb5055d9a759516394a9fc1cb28feb1d00000000000000", -"service": "00000000000000000000ffff9de67449", -"pubKeyOperator": "0fe76d859d3b7307feff2afdb0c32880a15164bd63e7b83031efdb9afe98cbf9934aa51473597f345c7f18c83128a2dd", -"votingAddress": "2p58EQFQJMUqThMhknsXzKBA4TQX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e65fecad84fbc81f866fe799cabc9fa2f29a9f393dcacdc782b19a295714f481", -"confirmedHash": "a15fddf092fdf0484151f76d2b2ccee6620d9a8e9e75b4cd0f00000000000000", -"service": "00000000000000000000ffff951c4fc7", -"pubKeyOperator": "970ec27526148ab568f59bf045cdad70416b9df45dd2f9c77d36d2cfa16f51347d5a767d1e1ca8260856ee15ed5ffd7e", -"votingAddress": "26HkgniSXRNWKjyXB5oPcPGzaG7e", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e6613c209aacca72457f26ce8ad47b4b1850faf27f7a157c3643fd8777f8f2ab", -"confirmedHash": "9abe87be222cab18addae002c3a974e1b05e398493ebee3a1000000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "47Dt3JnTNrr5gJux3WyNkoe4NKUb", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e668934e0cca21845b6e5b511e4b015cc08b3238045f128c3b68f7b2b056357c", -"confirmedHash": "d75b97df3fded2dd3a1c0adb86b3a7d0966a6ef6228db0fa0000000000000000", -"service": "00000000000000000000ffff5fd97d63", -"pubKeyOperator": "950b07c2e95b0b8caef5b7b8a64a51fe660696a6433db327b6e0b325c0f26ea21cd527938d54233d338a27604f321e57", -"votingAddress": "4HC719B1pXtcaZUqwS1ouNzcH82o", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e66e834f369e663edd53cb9ac6edd09b655e07299e633cdc5ee00aa9be12e794", -"confirmedHash": "60ccb195a9f1418dc9f0eae6d16d2c59a364c268d2244b7f0100000000000000", -"service": "00000000000000000000ffffc2875094", -"pubKeyOperator": "04171b6580816479ec432aa5afd73b257cdb787ba648b68d8b826909a4fcfe6d24b5e561f69cf3ad3225912192a89c61", -"votingAddress": "2QSmr37SfTpPdBwJJmrhEF8MF8aH", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e67682b83861161e919e7541fd901cb2bf229cd076966a78e9f041264083cb6a", -"confirmedHash": "12250c3e151d3e95d02660a45a3175c544393f440a5164c70400000000000000", -"service": "00000000000000000000ffffa8773e5a", -"pubKeyOperator": "13dc8ce848d91bb7f7deefd982752b6ca76bf20b442dcb30635cbbb6258a232e0c8c241e8c90e81f426b2544c13158a3", -"votingAddress": "iN17jb2drZgaLaWTzhLm9boWNdS", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e67b05a5d11239652dee71a1411ec1ee141337c97f55793d4eecabab0cf61a4f", -"confirmedHash": "65c74853d8056f72a4f7dd85289a22ecd157e7baacf839a82b00000000000000", -"service": "00000000000000000000ffff5fd97d65", -"pubKeyOperator": "8c05c7233fc90fdd6897b3c1f166d1009b2b586057f8f84db2a47d7abc8cae9ff3212353a1a44ae3555903a275d5e96d", -"votingAddress": "3UcExvnMAyWm88aoyrVpX4BUEkAK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e685f28bab85634047e06a01c19c3c27e480966f4f6791f82873d61ada382c90", -"confirmedHash": "ce9e030a46c9101431a31e578a808dbb7c4db909ba1530431200000000000000", -"service": "00000000000000000000ffff9fcb1cdb", -"pubKeyOperator": "10af3cea8e29aa0e662d9d2799fdc59045ffa70d38eaefae4ae9802ea35143c498398b04c040265810aa24f1ab488b60", -"votingAddress": "3ekVoqsTXgbXTyoJSC7ZjFKmyKkC", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "e690612b66f1745c520c61df895482575c2ca62b619c8866e2415a4b381b5a98", -"confirmedHash": "1d9ff09039214650f8aa0415c35d0306514d5b40df2a19ef1b00000000000000", -"service": "00000000000000000000ffffbc28fbc5", -"pubKeyOperator": "0781b348cd3088aa77198356bbbd57ab6451fa98a383642772356fc852cc5a4fb1dde0e59159965dbc9a62983a7f0b40", -"votingAddress": "5qvQnWw5rNh1PRHBYzdxiC67qSF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e693a68e69e52d376eadfe83bf29a71ae252986ed3c391abb9f77229ba565502", -"confirmedHash": "4e8f8471ceea06cec11fb02d4b7e14869ad5e004c6aa4f412c00000000000000", -"service": "00000000000000000000ffff2d56a296", -"pubKeyOperator": "02d232f32f9624e9aa94161ea74b4e03976d01123338e08168b68bc1256131f36e9f07f5441dc283d844c740b3d92d7c", -"votingAddress": "2ECY3AKKwnojdoRi3iPEH2jU3RYt", -"isValid": false, -"updateHeight": 1760856, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e6a0732c37271e45a283376ba6ffa79cc6ca2e740366aaf3ba99b6d31107fb51", -"confirmedHash": "123c178a777beb3e3c812443d07be17a42deeb7b9e27a2090800000000000000", -"service": "00000000000000000000ffffbc28cd08", -"pubKeyOperator": "8f56421336a81d1ee94331cbf02d1608fce384dd805f4523d8ee195f7c1ffb501e8686efbc7b2e0835194168688d8563", -"votingAddress": "2N5TA86bM6mVfBREGK2kSbNfwzcx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e6aba75049b40bb1c7cdd418d841c5479e7ffe354ca34c23c610cb50c3f0231f", -"confirmedHash": "216c2caac8540339b8ddd0f6a7fc5ccbdcfdda3a2353d2eb2600000000000000", -"service": "00000000000000000000ffff55d1f1da", -"pubKeyOperator": "89718b0bcc8233af8df3eab1f3d2003282506e6babe096eae072cb8a435431fb3ca0359ef7ee8bfb3fbe981debdf9c0f", -"votingAddress": "4L3XhFnZTLwUCbubEwPrWrWCHYS9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e6b11c09b2627b9c60f3026282bfd22f7c2c3a15b95f7eb56c826ec7c61da28c", -"confirmedHash": "0dd00654d71f6ade7207bd00d1b6ba26087f9e368ae42dfd2400000000000000", -"service": "00000000000000000000ffffc2875021", -"pubKeyOperator": "94f22ab54c688ae79bb1754e03b42e86f02395205e4f82e4c7d45f5324a20c2c41eaf03d1f61d16ef5ae40e79a75e0e4", -"votingAddress": "35vFfyD25Guw6R1irJ67ihXyJ6jh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e6b2b85626ec4d6ccf69ffdf306831b90dcd876e386dd4add1d47172937d6c68", -"confirmedHash": "e8a3d59e79c0d510e8c71f5f99176e9567a2bcf87a6676000200000000000000", -"service": "00000000000000000000ffff9de676b1", -"pubKeyOperator": "8d10d31ba0a70f200761b7f437943484948e74d0507b9ccd1b162eb0056a12765bd283af7ddc2bee71fdab7ccd639ad2", -"votingAddress": "2NpWF2PqX2v9Nu3fwq1ra5ieFShY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e6c48a6bbefbafa18f7f564a653a151022638f908e95747d6ed00c28bf1749a5", -"confirmedHash": "a50bf87562efa2654901452a319566baf44bf091b9aa3b900a00000000000000", -"service": "00000000000000000000ffff80c7ae59", -"pubKeyOperator": "0a1a2bd59ce188d8e33e61ae6ac8a017b0f4c36f8d0d1623c73ad431a9bf58e705e3b733211dda121afc28b715827d2e", -"votingAddress": "2mnBDvDBD3BZ7rWEf6ymRRikL7x9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e6d0dd4904fea564eb98740be129980fc1bc419cebe26d95615e32a6383c2bd1", -"confirmedHash": "5831271ef40ff78d726dafad8a1454e14e59b7966c3096531400000000000000", -"service": "00000000000000000000ffff2f6e9b57", -"pubKeyOperator": "0e35df8272f0dd472e3d5d522fd05a94978937c4fbdd6ac83aafd4fa1b3418db3f52595db46f5f2738808b33e7f01a62", -"votingAddress": "39ZmCfjnhU4nkDhxi7RwipFdPTHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "e6d291673a34b691b55a49f8372d8a8927b0a02937fe6376afcb482a99c691a9", -"confirmedHash": "0bc078ce428be1535fec76e3a92fb10ddb7fabff74d740b72b00000000000000", -"service": "00000000000000000000ffff422a7155", -"pubKeyOperator": "82f028672d3def392c8d983a1f27166cd22e3aa8be11cee7640f1ab6e64ed036b1bbe34dfb1651be1e6128ce5edecd73", -"votingAddress": "36zPLZ5RpNwhvZDkzDMxobbYN7yo", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e6df427c2625a0d9db5e1c79707f583a5d86a2c1bd9f2301940df59d2db5fdd7", -"confirmedHash": "d77945ee94907d1a9917b92934447c642b29b313c7e33de41e00000000000000", -"service": "00000000000000000000ffffbc7fe628", -"pubKeyOperator": "9958dc78de85c9d511fde3184cfa664623ef78c52367e29fb88ab40e83ee8dc843947ef51e1d0c32d1b4b2cebe4a74c3", -"votingAddress": "2uaq1ywdDHRqfL92GGSUmRKUUyGa", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e6e68d25e0e5fbd0149afcb48e9465f202a0bb9cbb8d968692977e093d8e7298", -"confirmedHash": "918a19bf0146d10e7751ce0910318f8c048c12440c6f21901000000000000000", -"service": "00000000000000000000ffff87b50fe2", -"pubKeyOperator": "142272c0e15731b92bd5a25c66fe9a571f8f5fbe4f249559f2dcc25daf042f79f4d0395c173b504f9732f3a9e7fb4d05", -"votingAddress": "3mkKfyvT8PNc8SoowUgJY62P1aby", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e6e9b72419080c3337870b7faf0a8adf5679c4a6b8e1a03eb1c00f8680bd04c1", -"confirmedHash": "4a380d4f4f9530227e7417a4cdd6cdf1d2c5706ac22436540900000000000000", -"service": "00000000000000000000ffff55d1f20e", -"pubKeyOperator": "85b8d6ef90f26bb4bd34e8c33bf3072b717adac558803ae2170e54a5f1c053bb13f28dd1942213fd7717479e24264f8f", -"votingAddress": "3pTMGeZfjZbdAu2cmrdztiucfsCm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e6ef61625aab4c7ed4e45a4619e939651a8823b1f2b8cf90b8ee4480085e67b2", -"confirmedHash": "9173177a2174d0c2c9349acc4b26adf9cfe1ace1c1150d4a0e00000000000000", -"service": "00000000000000000000ffff88f37388", -"pubKeyOperator": "83c8a71347921096a86254804ee8c899d1ab964aa5ba0330f65d6eb93755a5f07148cc9e213f57e11563ef7ff06db642", -"votingAddress": "2aG2TiY4nPnAo7VTMedbouhUTBYH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e6f0bf327b407704686488760b632e4962ec2680c77566632ed319e3ec49091a", -"confirmedHash": "fa15dc9307399039b9020dbf49ad9dd7c7e7d5c94a73bf410d00000000000000", -"service": "00000000000000000000ffff3353f629", -"pubKeyOperator": "117245f06688cd5d300e3fe27620d0c6e202265f413cc0ccf7b720c29c6c4a3349780c203f38f13bdec69f375e61b8dc", -"votingAddress": "3kEHVjDeXrH9zNVAzFwzgNfAHQdW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e6fe716baf4776d197faeda4aca6699b2111f2cacda17133e2d5eb20e9df5578", -"confirmedHash": "205868c04c3602ad74a67b6fc43c286786c7308f0aa5dc9a2700000000000000", -"service": "00000000000000000000ffffb945346f", -"pubKeyOperator": "9728366710f2a3c9e93dce594fee43182fbddd7006438860f333a17d814c65ef43691d02183efc8c1205b789ddbc708b", -"votingAddress": "4D9aDF1zUXD5ZAgm1tQno8DDEj6x", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "e7017e7a09dff9ba1bdebdc4adb15e1b99b1e4262001352568975c957439b740", -"confirmedHash": "41d77e4b163698c485815f74b2d12be8f89a7b08367dd5f41600000000000000", -"service": "00000000000000000000ffff951c1fc6", -"pubKeyOperator": "12dfc9061822fa4869c9434ff22db18d13225a8f7d2ef8181e19b25fb999d0e7d9f0afc0ab7b5d9493690474db58dd83", -"votingAddress": "4FQUqExRKo7KQdERoEaiXKfPACoz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e70c35ab8ebcc6a7a8e2f1a77ddd5e3dbaa49deb2e3882d3f2b36c758c211770", -"confirmedHash": "86fe97c6d499991d67591bb54a1f3f777b70d06646d6373b1200000000000000", -"service": "00000000000000000000ffff98e4ad1d", -"pubKeyOperator": "1314ae82003c9e3b94f7b60c94befb7444d1fd9b2a52865d8fef14b5fad27440904d3f9f281240b0d2fdd979353f07d1", -"votingAddress": "CeyGBU3FMMkdyxDegQvgzrRDQPL", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e710eb9cb66333d72ad763bad407805dd7ad9c8b098eb3a2eb87249acabefe06", -"confirmedHash": "fb70df4b4d4f4deef3e3489ffdb1135e7037623b39be17c20e00000000000000", -"service": "00000000000000000000ffffb23f7992", -"pubKeyOperator": "90f693c31d7b9c2970044c81b29488a33892ae75bd2a38d47dc4807f0a2fd8ea2f2e6c4d9619a01fa00112a44242ef6d", -"votingAddress": "4FwyESjYoSKRM8b5frcDno1sm4Vv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e723a2fe20b8a01b8ad4ef9c40bc80871dcdeb92cb449abc2c1dd2a305d64708", -"confirmedHash": "b5f833d97735e67a90c9aec5380a99396a31d7a17eb35df31600000000000000", -"service": "00000000000000000000ffff335b3828", -"pubKeyOperator": "0b97db92494afd98a12e07d24463cad10594adb348577c1acaf8da6ce073d4282aecfebbc7d7773d53d254cd7f3b904f", -"votingAddress": "39eW9DGKQT2pBDGCkD8t7KVqoqSW", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e72e2de9617488ab16ac133cd85fe4e2c3ac9f06197955eaf980bb970060d609", -"confirmedHash": "068c7c57e96cc57fee314e66c0050761fcd8d7ca12c809251600000000000000", -"service": "00000000000000000000ffff422a4521", -"pubKeyOperator": "987cecf74e2205d632e5ef28afe874888cad11e7b0c8b58ff7b9f865a14fc41dfb48a11b2b5ca92a793aa4796fc5f3ad", -"votingAddress": "4EqsjckKrrx5WHHtrXmDowRnedZj", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e73d740e55d799f059ae6e370664cd2b8731b23f25da3e6a50081a5266eba990", -"confirmedHash": "bd31f35c5cedbf07c6ffa716f2a3acf8f725ab42af8758740500000000000000", -"service": "00000000000000000000ffffc034a645", -"pubKeyOperator": "8f22732d2660bb55ef7787c78352295829c47f8fc90fc0985c6f342a7d38a8364345c631581a6e66ef9661595c485758", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e74bf16374c13b2248f9d2d7c9c48c1ae8e75aa1c4fb330bce7176c568a5d6d2", -"confirmedHash": "00816d8a179d1e70ab5c7f004612cfb95f516ee272d4b5c62100000000000000", -"service": "00000000000000000000ffff74ca1362", -"pubKeyOperator": "8a7fc4c58356d50bc4d9c122cd5d34a99c0ea4703c6973e404d8b75c01f8240e7f66ece5103366f76134faaadff06d3b", -"votingAddress": "25YwqXSwUw9g2vJ94MaqRFFe8e8b", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e76744e6d17d48bb441ef8b58b63460776beae63e61d0bbd9673626e5859939f", -"confirmedHash": "1be758139421063d44b2265542b444a4f070c57b18ee01821100000000000000", -"service": "00000000000000000000ffffbc28be20", -"pubKeyOperator": "0c886a216422dc63e24f3d88e7e0742590c0d07d0020668c7ec4cf7f7781f3c851d748e38308a4a4e657325b03dfdb51", -"votingAddress": "2j2kS46iyDknEBF8WF95wSgMyq9P", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e770258ab31f00b0935467b177d404060394aa4435e444102a64077073617356", -"confirmedHash": "436bce0544aec1bedea5ab4a48c30165695e44f60b9c008c0700000000000000", -"service": "00000000000000000000ffff0238d5da", -"pubKeyOperator": "91474741cc90422121d9fa752066ed77142881a532919e12673cf5ce78155b1a56f18431bca33733409b8b5f87f2177e", -"votingAddress": "2h77Stg51Aa2WtrTk3Qp2LWWBKUP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e770ed50e9ca85e366220f38b713cb77dce34d3d97a757d2245b525ab794345e", -"confirmedHash": "4060d58ba59311d494c41bfd495921b6168ab067e675814e0000000000000000", -"service": "00000000000000000000ffff8b3b26b3", -"pubKeyOperator": "811e7e9fde3ed78cf846ebceeac941e26f8e022c532cc2e09b7261183ce5fac1243427d1b0178fb32e989152751a31e7", -"votingAddress": "3LCwY6hPzeeLRzt7gQxnUjKhbPSs", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e77a9fc25322195a0142cbf13476d79cbdd1a5f7932f89a32ed0afb56cc8e170", -"confirmedHash": "17a43fc8ea490f2126d4db5dea0e18f71218d9c54adbc1a72300000000000000", -"service": "00000000000000000000ffff592fa7bb", -"pubKeyOperator": "8c72bb52d2eb54a3aed9f3362cfd1094bfc2d667c31aa122ad5a5616afead18384a531cf2f1d9041332b52ae4527914c", -"votingAddress": "EW88viv7hmSWbAwJc1mW6qSCiPJ", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "e77db4c1474ce655e6a7e595f3262ccdd46eb38b7cc8b479156431459d1652e7", -"confirmedHash": "46e54be4a94d8d36c0028a82ec824d6247aed6e9349072892d00000000000000", -"service": "00000000000000000000ffff2e04d9fc", -"pubKeyOperator": "002795bdb9c708229f4b3fdffdc0a079a101e7dba7f0b4c5a57f91081ce1e9978008b47c63129502f4ed06046501d11a", -"votingAddress": "Hsff41zuHjiykKmHBuKDLr1YXVw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e77eb131911834b6081a8dd4e0c158f58ab990a558e865503ed4b60f0696c65e", -"confirmedHash": "5abb282aef9efc154fbf7b5840526c3649c109f1371245bb2100000000000000", -"service": "00000000000000000000ffff52d3153c", -"pubKeyOperator": "0ab7b6daca1ed111c3c557f4553cdf36fb61d05a6ab4fb51fee489277bdf35fdecaaad0f0f6ba6e7daa4c16f4e3651f1", -"votingAddress": "3WMVnveC22ZRcNH5ztfPuycdKPPb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e79a4f9c36626fe1c835bcb07104598a64ccf3a396efe0b3c5b69dd25a9e2811", -"confirmedHash": "36ffd83b863fd3f3919f4d3343aff81ffae1a83932183ea42000000000000000", -"service": "00000000000000000000ffff5fd86d85", -"pubKeyOperator": "8d5a98a1caf912eeaa1a8d10e8817214584b05cbf1189ff236d2291ad3830ac2362c27d1c07dbc2dcc8c621ac6adb6b3", -"votingAddress": "4Bxzm62M15whBhcMdeqPvmQbhtX3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e7ab487e74360eb813f451a40a23786af5862da4b23830e5bcf260faca3b4237", -"confirmedHash": "b01a87d98628f4fc6d89d9903e2d58988e07c24ea6cdb16e1900000000000000", -"service": "00000000000000000000ffffbc28b6cc", -"pubKeyOperator": "8e164ed81a614f6c4ffa3fe53b54cadc0ae111b8f851ce7253a962f35dcec93bfd789db2d7d762eaa76c23213702a7b3", -"votingAddress": "22vim4zW7yaMPWxpotzjfemso6KW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e7c3dbdadc1f592ced06ae3a3e130dab3ce83db4b1ed6044feaf5120ebe96c50", -"confirmedHash": "ad284db5bdcb64c37c802927ae74f6166d2e87e6ca4c56022200000000000000", -"service": "00000000000000000000ffff9cf078f5", -"pubKeyOperator": "127009b755ca8ed959c79b2e4ac1eb0b3dbe950758f01eba9bcc8633617fdd362f0d370f660c29874cca70b1f0f5be94", -"votingAddress": "4WvfBncANTGJQMHGjEhoA4XzXH6a", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "e7d7cafa0efad415fbb0d03bb024c7e07321c74d4812b2710aa28c11b6aa19c5", -"confirmedHash": "aef6ce4203bc3d19e0ab00bf4f1ea1178ad5094bf30cb7052200000000000000", -"service": "00000000000000000000ffffb9f37009", -"pubKeyOperator": "8517ec69eed245311b92d8373ca234feef7ab1195a86fb9fe080026c9a6178e47535f8b169f579f1b4229a678816d486", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e7dafb650ea92b6bcfcefe1b827d55bbbd95bec46f48674b044a09542ec0088b", -"confirmedHash": "203b420d0f94416a61ace28aa860ca47487b444368664fc90d00000000000000", -"service": "00000000000000000000ffffb07b39d4", -"pubKeyOperator": "8459a408b35e5094f210d9acb79835095aac1b4bb8bb652320ad5143636c7b7ae768a1a363e5caf96ce0cfe14518a81c", -"votingAddress": "2jekj3dTGFshmuExhFnNGLojMRCW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e7ded9271bc33434aa2524fd6a35aa2950a51232a0349a6204e0d4e80dbfa445", -"confirmedHash": "9a1179e9009a17b9b4b8c574a07b758c82f58a79f95dc0781900000000000000", -"service": "00000000000000000000ffff2d5575b2", -"pubKeyOperator": "0e046234f0e3ab7f1414db86dbca1d15edbc39ce474e7c19c0301ea5a4df64c2efaad3bd903edf8f45fa356c16115f21", -"votingAddress": "2Fygfq5z4XBbWGC5ocAM9TokgUjG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e7fc694f00dfadcf6a75c991a176cfabe31066e7ff97639339d09b2cffa9aab3", -"confirmedHash": "a1a1c5b91d27b9820f46f9dee023496d0b38c7eea64f251d0000000000000000", -"service": "00000000000000000000ffffcebd27bd", -"pubKeyOperator": "0621b9d52fa46a12958e07b7030002a7470e0db4d530a9f3b8ee6f8bbdafac881775b3c5ecf95c4e086fb8af2369323c", -"votingAddress": "2J4U6SbvVcokXgbLC4aQxS6qyiHx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e803457d0bd6dc0e55e8cb5a7c00b43760e07d12684dcdcb68ca0babd0ba3fe1", -"confirmedHash": "f58e4232c187265296cd88e85bc4540c71b0a78263026b771100000000000000", -"service": "00000000000000000000ffff8ba27eb0", -"pubKeyOperator": "8c19a3f6df1ff3d9399d010e5307e04b9b38c4384bb08dd31509a884550f7fe377112050b34c5a533f2ace6f08a83fb7", -"votingAddress": "2zNUiN74Dkftn9m7mzy4cetsp7H8", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e826673e8ec827a01a7e184ba9ab2b061c458e58b4c4b65216b80eec3ae031a9", -"confirmedHash": "3c09794b8aaff9f3acf5898dd7b3e5ae5a4fc2f606cafd122300000000000000", -"service": "00000000000000000000ffff9ef7c242", -"pubKeyOperator": "8ee8a098e6b61cf12e5fffaa123353c37114df175582d76a34c310fa9f0cc3184ab160d3f9adf62fdc2f55fe259e1d14", -"votingAddress": "UkUMjnKGXNzFzPz3pitiTW2Yhyq", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "e83082cd169edc321d9b332262404677d2a0c62994886725d8d0dc08cc5586ea", -"confirmedHash": "0683218fc3e112c0474b4a60df636de6ecd8caba7bf4770d0e00000000000000", -"service": "00000000000000000000ffffb29d5bb8", -"pubKeyOperator": "0c1fd0bac18bde80961c2c86d0a892f7e4887a2d7f728905f207581a75e91319c1c6d166704b8a8c0abdb7e2a56a8d3b", -"votingAddress": "2isJ9YN75NjzMparGn69v2VnkRmY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e838e08ca3647681a42c7a1f806415c272632d261b2e891fa1d051ff2f50a54a", -"confirmedHash": "9f8f9c52bbeebc19d4e54c45895b397645befb22600c1e1e2c00000000000000", -"service": "00000000000000000000ffffb009d20c", -"pubKeyOperator": "07c5ee75d827ebadb592c1f65410b62352e6a38d2be75ade0b387175e1621320074b3941d24cb0c2e9e9a10eb25c3621", -"votingAddress": "6tYXHLjDJGgMpWSTr7x8do8yYCy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e83e5e3cfd67de684a19db5458f611240ef7616b0d60d2ec4b17c9334edc00d5", -"confirmedHash": "970e2080a4bdde56cbf6abe9dc611320b681e922c11af3a30500000000000000", -"service": "00000000000000000000ffff55d1f1d1", -"pubKeyOperator": "92d2d3f4b05754fe05f0b9ac68a08681568a76d6f7b108babcf6bc00fd1db7595b1e0608630264761e9ab693507ab3b0", -"votingAddress": "2arvRPDqzxf2Hs5sMouzxLW2HC7z", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e84016bad0e0d01ed04280fbc4b5159a5fac4038cfcd977da80ada844211a946", -"confirmedHash": "213046aafa482fcf6ca01a3f9cb16e47fd1f77a73db409261a00000000000000", -"service": "00000000000000000000ffffa5e32381", -"pubKeyOperator": "013eef3f6f7ee1f67b89331f83566fc611ada0168bd540408f5d12b321d2c9cfae916a5dc70b3e77a4ed4701129213d5", -"votingAddress": "2HNGhWoCQkgWwE82A3Fz64Yo7j23", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e84646026ea058e229954d7766d27a68ef260e6422aa91af3b7431bfb94e8f01", -"confirmedHash": "477a71877adb59bc0cd9fea935496b58e7b62de825b3abab1700000000000000", -"service": "00000000000000000000ffff2e1ebd19", -"pubKeyOperator": "90908933bd97769966d74a7a85fad9ce894ec6dd943b71678a2ec87a155a9a0a390707e64d384a6452fe478771262504", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e86c42cf18330be3e90f19c0f6bf979e44dc7172df727ce23dfe6d4ebdc81b33", -"confirmedHash": "d9ed28cdb018ce6e3d8702b566a315f92979f2e666d43cf91000000000000000", -"service": "00000000000000000000ffffb23ef185", -"pubKeyOperator": "89c4e707d2c2ed3f2796b8de0977c71871d485f2809401872267441b6cf8670da7210988cf14cbc66579e4cd44204e7c", -"votingAddress": "38jpxwPxwuT4kRHFaDtp1cAWMCCC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e88228a37a0cbcc344f8259c147fd40ec1ae88c2d5c2cfd6836a670d25a6793b", -"confirmedHash": "a4704f2c122258a7bbaae5171c68f41bc781c4a2961bdd422e00000000000000", -"service": "00000000000000000000ffff9fcb1483", -"pubKeyOperator": "897e34f490c59673f0f845139b80859a21e12a4a1f1aec6dc2c1d7757244a7b0fdf6ef61575dbf3920a6557801452423", -"votingAddress": "2jhAUKBf9hWSg5QmheH2PBC8SwDT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e887fe5e747703f414cbc041a8850d119eb71a668c2217eef56632912128284f", -"confirmedHash": "8aab433e9e24757ff39d85db83deac1369a93457b99fe80e0600000000000000", -"service": "00000000000000000000ffff5928056a", -"pubKeyOperator": "091ae720dae474d1bc86fd177db8e0a5f25201a4ce04c663b3c6138495292fe8f483c8e5fbabd5bd960a4b442daf41fa", -"votingAddress": "eTQprxxVXKQzbAECvXXni8k2xDb", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e89314aa7fc933ddab8644d6f95e31da1a09ba5f3a6b0e216ba1349dab51e146", -"confirmedHash": "e3726a21938ca6c855a6f129a852216f2629eaf4b6caa2b31400000000000000", -"service": "00000000000000000000ffffbca621b4", -"pubKeyOperator": "81b4ec0edc8d50490f363560d59d3a79b3631a3c67c8e8f42190347465d62caed3db532ca42d2ad9a0e3915a7f06bab0", -"votingAddress": "3c6r4EjJi4ZG6GSNmTnr8DMtc8xx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e8b78a6dbfc00871ce1fd89375e7cffc4815438953db26c0b7102e8c398fc870", -"confirmedHash": "402c0548a87320f6b26851267192c8c17a1ac03ee95939b10e00000000000000", -"service": "00000000000000000000ffff52d3153f", -"pubKeyOperator": "129510c201cb53de1e3f629db58533af792e46a4dd8e9fbd8b43592ea19d30037561a9132b06d0eb820b74b7eadfc67a", -"votingAddress": "3uqPM8kH5PTBsUaGu1oHnR56uzEJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e8cb4e5990ed76efae830538b4387efce7fd67802a4ccf3e6fdb23a6ccbb67ee", -"confirmedHash": "bc9b39db19d983ab874dd93272e8700545f3034f330b28bc1a00000000000000", -"service": "00000000000000000000ffffa763bd0c", -"pubKeyOperator": "95325ca37c3faedbc11f2bfd772069e2a757f5e45dcd376a187cb461ce4609c5545253df78bf033c908c80f650594ea0", -"votingAddress": "wcwj65CfShW7SXHpRMNGK5AGUX2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e8cc6e31a0525300eb35b65495d309a3e5bd58cd1d6b80cdcf48efdd192587a1", -"confirmedHash": "ef97e3b161723825f8d8126e08639fbaf9722d8704dc4c690f00000000000000", -"service": "00000000000000000000ffffb9453757", -"pubKeyOperator": "96272376aa3b91448589d857a27aa66aa7c86f9d61a2e35b3f509ef3a7b811ee7c3e3d00dd45cd66dd5cf058d1ed490b", -"votingAddress": "3tRJv6wZYAKNGSCqZEqF6Yd8oDu8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e8de4aa2c4eb514b97432ecaeda3a3fdbd4fec64137df7b36a3288b80bf4e470", -"confirmedHash": "f31ab1359ae68c07bfbbf317e4a88589eea46f50d3e86e7f0e00000000000000", -"service": "00000000000000000000ffff2d5b5ed9", -"pubKeyOperator": "80ba0b03133ddad81e91ae6866b8f352f82d03351179322b3934e9897e2356ed8a05467e18654fce4ca2649f7874d60f", -"votingAddress": "MCdxUmXVsRkGuorqRurNcqzmSL2", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "e8eb565b08180d0eec3434e5bdffb51c06941b79d7c1ffb4b599aee9fbba004e", -"confirmedHash": "33edb9326ec9af8fedaefe8710dc9e584fafec5b88cc7cc21200000000000000", -"service": "00000000000000000000ffffbc28a301", -"pubKeyOperator": "8079c64ede04fb2dc6b12f85869fe4ca38d593bcf3456a1a6b82175306679e43909f110bd1602b55391dee629ac069f4", -"votingAddress": "2AU6LGW4BhdSDZoiWYuyRFsqrLC6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e8ef15c480b528880a537caf61e80df2dabf32fe6fb4bc8fe7f081313f2cd431", -"confirmedHash": "d83a48540eecc7c919bec40eb6a5ae333c2f1a0fa2b00b870700000000000000", -"service": "00000000000000000000ffff52d31941", -"pubKeyOperator": "1142ecf857558c08f443f2eb25dee6a083f0827d033797ecdf0f4877343896c9be9e23727c9a1acfadc00c0de6268315", -"votingAddress": "4Vo1qLHRf8UN9it7CbQ79oXyw7Fx", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e8fb68abf5c8407dc26431f624a8d1a753db47396b0c5b77da5e2b9d4811a96a", -"confirmedHash": "2d055530faeccfa931e125c5560849ce2b63353222c6a5e00900000000000000", -"service": "00000000000000000000ffff453d6be6", -"pubKeyOperator": "8ae8efac9275b325bacb3817ced923e332d7d219bdfd2a2cade7f59b807103ac07d974f879eb337b16f4e12605e2c3c1", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e90941a2ea8a1bb9f13bfef7dc2d78262ebf149a131f8d0439b239e7cd3eb272", -"confirmedHash": "33fc5b8e0ea1d8e5f9b7f16d16dd0680c6b6eb715c9b1a2b1200000000000000", -"service": "00000000000000000000ffff5fd97d62", -"pubKeyOperator": "0dbc615419b2d17bb63496a1608c65a5ec5b12310bf7e00162fb9fd017ad1f83cb43776036e9588c3ce8f0c738a61324", -"votingAddress": "4GuyDZGN5mk5yXFqRzkjFy8frYmM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e90b44c8ae2732aa69fd8387d9096ddc49576dcf10d0bad0a1fb668722ed097a", -"confirmedHash": "16393b0bdacfa0a283573a23e689a1a1908edba646460d540200000000000000", -"service": "00000000000000000000ffff8bb48d0b", -"pubKeyOperator": "03b810b5fe540ac892498eee075e3e36467322999175ae81ccf7c863f90310ea3a1bd4f5fcf0536aca87f03f5335c66f", -"votingAddress": "1bgQhZZ29FF1YuSQ7iGTqZDUpDB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e91fd24147bc1feacffda170ee37a35107c9a26c7c452bfbd36b62d6e1d6d578", -"confirmedHash": "c871e716d4c992edded6a86eb35386c8664cc7b48a3245e33000000000000000", -"service": "00000000000000000000ffff87b50fe5", -"pubKeyOperator": "944cf7a45e0b80f63fc11f27c36dec1761de34f49909eab615bc775c3def78e136c5ebd65dba281c1e786eb05f3efd98", -"votingAddress": "3zcnKN8spAstrXB3PP7o7k3mhFsh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e933f6ca49bf43da87e7f971840e51f7751dedb9be7a9c682df3e5ed6970f4d0", -"confirmedHash": "c9b913428c2d2a05999debc9d651fd69df32a518a58b28c70600000000000000", -"service": "00000000000000000000ffff5511f85b", -"pubKeyOperator": "1375b996b9fe739ca2bbfd06613eec87ccd7c5715424d0085c6f835a1989221c3e99a66f09520c1d7750329a1af29e9a", -"votingAddress": "38YMJkYrYT6NgyfWZhq97ke4tJAd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e94dcb8f9b76170b808c5632d26adcfca2b426ed908d4640f9187a51068d0808", -"confirmedHash": "1506920cbe243649637f126b78fe5889bcae8b58e36d5aa01400000000000000", -"service": "00000000000000000000ffff2e651a4a", -"pubKeyOperator": "1318868f45b29ab99e7ea4c07067685ee41c4f24f6d2019b8e6b0dc59f04299e8da1e9c116ecf17a8cce95d7ba69b87d", -"votingAddress": "bV6Rj3sJGy1XPK6Rx4tbZCuSCuY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e963f736f1a9ddaad5e79d079bc131ee2de8f5003c1deea47fddd8b063833965", -"confirmedHash": "c8fac7c25511b02ef6f8cb743098492c6b65d12e7f8611830800000000000000", -"service": "00000000000000000000ffff55d1f1db", -"pubKeyOperator": "0724bae1831f14a1ab7d90745c63cc681a63d5ba9824960836613ee56f26f00bdadd8157447a2d6b535f3a78d04e5e99", -"votingAddress": "3TAgZNswPme2zGkv1Mex3vdea3YQ", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e9646c8964f1f2cb64b6f60c02cc8d34abbb221327f4bab5c264f2b13897011b", -"confirmedHash": "00960cca1bd93bdfe38eefd8f7c17d3856f416e84a85b5c63500000000000000", -"service": "00000000000000000000ffff6dcdb54c", -"pubKeyOperator": "86a43e0c7464e74cd849d72abc2e7447b6199823da795911cb5d65b3cad258d31a95b574db2928ce7b732214be1cfd0d", -"votingAddress": "SJDYGp5bkdV91dkj3NtcjWXwsMo", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e969bc79a1bbe572531f0b225df56d54d2c5dd52ef5c8a7825203c805cc71b7d", -"confirmedHash": "adfd5edeaa09711a7bfcbf81382f7a1283a3f207a7daebd91e00000000000000", -"service": "00000000000000000000ffff8e5dadf2", -"pubKeyOperator": "94701cc5bf4cf1d70ad5726e3f019a9018709dfd6a4a6769f8b75258792c49a6a73f6d9702303ca2a395cbfe222645cc", -"votingAddress": "2MicbxcZnYuH7RXQBKy1D5RRGfkj", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "e982122585d24812cdb6446485e98d9bb717ee3d130e9630a3c868adcc6c7851", -"confirmedHash": "c72c90c6ee2109934ecda45311220d9d4774b97fc4c778b62400000000000000", -"service": "00000000000000000000ffff52d315c3", -"pubKeyOperator": "97172eb4f02800554682ef87d7d02cf882c37e6a7630b1ff03f5ff7cc38d9296f4bc74a5f5743275653c0335ea17103c", -"votingAddress": "4FLrZeJV9uLzTkYMfT7FcZoG38h7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e984b5e67d0b95f92c264711ad9a8c1a819a3a94f09a554559f13c927d8fb96c", -"confirmedHash": "5a19cd92353030d1355cd7a7b01ef434cb2f9bbeb95eea620300000000000000", -"service": "00000000000000000000ffffb23fec60", -"pubKeyOperator": "925668eb37b4b0daeb7c03ce1767f4bf4d1477a2708239b9536a787bb6569a1da5ead28f01ae62697f3eefa28e019113", -"votingAddress": "3d5TJLWWabickpyLJkto2r99CvaQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e98a241fc71108b95ed7cd74f65a95905deaaa2250d564cc76cb9f6c7ca54e1b", -"confirmedHash": "686ea17ad5aca3462ce5dceec96b8c47ca9dab3daaf8ed2b0300000000000000", -"service": "00000000000000000000ffff55d1f217", -"pubKeyOperator": "8b8a1e964dc9f995974a63201c007954d73bc896c4599b249f67640bc0b19bcf2601a20ed9761cf8d3aeb86d4c418c64", -"votingAddress": "2GbH2fuxBo3gnAWDwoaUvNPBjimS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e993e47d4f42bc68917146b2bc686447599504cdc694a29e7bc1ad1205ba595e", -"confirmedHash": "04d29a080ebccf66ca562aeccb08cb0e245c6e676a2c1e630400000000000000", -"service": "00000000000000000000ffff52d31990", -"pubKeyOperator": "0f20a3d0ab081693970e0a3db27b11db6ec7b1d57d30b150ed3577e1d70aa2cb085a0eee62102123b96392f4428b4dd6", -"votingAddress": "25ap2MwSodjp9ppFFWTNoTvxdGzf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e9a987488085b71203a31e106f309d3abd91be9c6fb7be0ce5905935a9edefd1", -"confirmedHash": "1bca13297fb25a6ae5c083e0f6062308fdc3e508829e5abb0f00000000000000", -"service": "00000000000000000000ffff258b066c", -"pubKeyOperator": "97522f2a46c5d75436e592e6ab63bea7bac27c910ac08825da9b074f9eff81ea14c2a12cbb87701b29049ab8c259daa9", -"votingAddress": "2gGGQUnj8DFBXFrvdMhjDRMhPRMf", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "e9c464424c5ea5d83c60b93dd5632c305dfe53cd07eeabff00676de4d3cca56b", -"confirmedHash": "6edc9fb2f4437b9a0227c7c8b118c8e3f421438c26a72d050300000000000000", -"service": "00000000000000000000ffff87b53491", -"pubKeyOperator": "05d020d5e00e9adf06802c53e2e3a9bc059d41a171da9d763d0b907796aed2133a944913bd7f6721aa0653fd9490f5ec", -"votingAddress": "2i3Mr5yUV4g4bMVbU22eqZ6y8qJi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e9c4dffe6bbeaedad52f6a5dd29796a51eb084d486062a00167dcb870235471e", -"confirmedHash": "1a8dc93654f44327d7ed1d59bcb436d88e082b3d4f9c6d362e00000000000000", -"service": "00000000000000000000ffffa3ac80bb", -"pubKeyOperator": "145333fd34cbaef3c5e911ef3fb401448da0e3e831d72988e33757e6ec53e82d4d64456ee6ed54a66d64a3e4c5c6af5f", -"votingAddress": "4TzEyLCSexkE5DAKWE7XEarFS1EN", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e9e1dcab2137cfb21b662b939cf75492f0a53cfc819caea7a2bdca77134403ab", -"confirmedHash": "b8fab3df4b50b10fc1d5078b9a748806b0b564ee84ec42501e00000000000000", -"service": "00000000000000000000ffff88f31dc4", -"pubKeyOperator": "995e4d5677bf72a9728dbf0b586c39bbd6ba9fe6f1a8c4eb5c8f4abbf64c57f7b73ed76b4d859a5cc9a2e91d2261b952", -"votingAddress": "348zfWLU8yRQ9PpQ34B8hZUUyCDS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "e9f81526f4edfcb4e326ec16336fdd104364b71695b79f594c712d02bf372c54", -"confirmedHash": "7a36a932af7733ab788a8b9c66b7369bf437352fa6d236e41900000000000000", -"service": "00000000000000000000ffff8ba283c5", -"pubKeyOperator": "139799cff261e45118408dbd9d70b8f4c9e0944c5f954fcda731a8050546951bf7cc8dddf1375e773836e146649c2841", -"votingAddress": "2k3dURxwtd9sKaPXtGVs9Htc8vcs", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ea117168252041d2cfe3054677481a65d329c055f447e0a74d2149cf6f4c8bee", -"confirmedHash": "59480079ef251d169baab392fd32109aeb8446a1fa9f61930200000000000000", -"service": "00000000000000000000ffffa5e3e55c", -"pubKeyOperator": "99ba0e3d628e616b5764e5176b670e834d94924426888edffdd7bf1ea4972f4388e2208cdab197c0042940846901bfec", -"votingAddress": "3MFgKyESotJrtarF7X88UCmpdM7j", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ea1faae50e8731dc9bf3e0670af307031b202542d43bfe7d247b251cffdf3150", -"confirmedHash": "7da8b65c65004105703b406c9faf3a362d9ed70b165683ed2600000000000000", -"service": "00000000000000000000ffff4e531300", -"pubKeyOperator": "8bbc611d1742be42ee82306630b63c91f96cb3e7cf129661a8145c5b285c752ecad7198d57f588408c413af3b93aea96", -"votingAddress": "45rPHtAusr6VLwNDVq1pwN8uiKfx", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ea2556b8908034b99ba78762d906543544c3fdf0b400ecb6082a619fa648fb07", -"confirmedHash": "918c6e0925c9b175635ce4a6428a970bc716f5dcd7bc0cbb2300000000000000", -"service": "00000000000000000000ffff55ff0141", -"pubKeyOperator": "057ffb7a690ec686950435796762192438fee6c4f811f38f77e907f0ddebda3185d7e4b2ba4043a1d5f95894e9debca7", -"votingAddress": "4AANWBkqDBDu2afJkTjb1uHtE8iU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ea32ac0753309b9cb43674cb7cc13a5b47234c53587f945e66a93ae1724715b5", -"confirmedHash": "58e240a154a0ac48dfd26143fb8ac7413aa11d8f10f16e622700000000000000", -"service": "00000000000000000000ffff5fd87e2a", -"pubKeyOperator": "8e55894085ae8353096780a38bb32b6e6494e63ec6f339f64b3c7f55ae942293af103ac3f2e78d78dcdaae3a589ff60f", -"votingAddress": "4K9cQp6xhdNQp6N31WFgUbb6Lj4Q", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ea406ffd6a80c3f0d2e3155d030f0011377656242b56ba56f36a1d77b8ceefb6", -"confirmedHash": "ac360859fa152178d0e8238e84f2f0be65837dbed66323870a00000000000000", -"service": "00000000000000000000ffff923b0409", -"pubKeyOperator": "161fb8a5a9aaca5ed98709c999821e5a410d287cdf0db5f8252ebc7617fec5e6e1a98d669ccaf35f0e977eedc476e0f9", -"votingAddress": "4UKEk2XEiCBU1CfUWB6S7hMEUiEN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ea41ae9beac1d9283e4ea2f91b9fa6586b74cacc6deea5477a2956ee49aa9200", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffff80c7e1d7", -"pubKeyOperator": "8e00d2d4a39542893170569af159f32902996627666e690bb4ef490eaec104642bf188de0b52f855d3fe4a3556e79641", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ea4236623c46e2a47e275b5c448cfc27416ef5ed556c7315d6d42ac86c211a52", -"confirmedHash": "cccb7fa2e1cc84becb79ee894428dd72fa53cf25d78a525c1c00000000000000", -"service": "00000000000000000000ffffb29d5bb9", -"pubKeyOperator": "999ab9ab5cefd6fdfd7d55c9940e4a44c5408472d8582c4ecb68838b1f3917601eb69646933864de1856dbf71c1ad996", -"votingAddress": "2Z5dXrsmUc4CAGZvAX6AXi4u78Vy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ea44cd5acbb1aec1543853369a144b0bab5ca855d3edb608c1ec31983fb2858a", -"confirmedHash": "00960cca1bd93bdfe38eefd8f7c17d3856f416e84a85b5c63500000000000000", -"service": "00000000000000000000ffffb23fec6b", -"pubKeyOperator": "0c261f446b125fd803d4cde523eb5e94d0d43f264e2808c52e389053c2e2825d275669b9d6fa622311ee1ca0e5b0e254", -"votingAddress": "2QqBLA9X4bGs9iYvsuJ96XFcPacd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ea56b3c3b056be544a6034d6b063a7dd2ce4a0a28cb3d33afb207fca04e3cbc1", -"confirmedHash": "fd3bbfb712a1cb133364c4e8a16bd1547d7673cb5c348a361300000000000000", -"service": "00000000000000000000ffff55d1f231", -"pubKeyOperator": "0be17900f82709c6ad40c051e008b2e1abfc8b70b6369c83f5fa657f44eaeb8e91824b1c86d996bd520f2a3c7805048d", -"votingAddress": "2PKDDgmKdcVUh6wqtPuGcpGZCXSh", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ea7d7257414a024b5dce0c10ce62a9abf9421f14b379f096a3b150cdc6affd19", -"confirmedHash": "5e2d07e4cfbc772a242f7b14f88a3825a2472711dea038231400000000000000", -"service": "00000000000000000000ffff6baaab73", -"pubKeyOperator": "949dbaca92b7afd18b7a4e778f063f5debf85cc8b7d91a674765b0f19802fd571c87b4b224db59e368a730b8240815c4", -"votingAddress": "9MQwnz111zzXtXj1ChCTwormZwJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ea855921eaed2505f0994e4b39121456c3bcfd520a134f927776e6402ca7502a", -"confirmedHash": "0703bec0555b357c97cce1f89b0b1b4a91e03093b21eba4a2700000000000000", -"service": "00000000000000000000ffffa7634a20", -"pubKeyOperator": "1186049198a34d1044c4b4454e5533bf4304a75be48400b21d5ffd353bc9e4f08b71a8ed6fc41edfdabd3672ffa66772", -"votingAddress": "3e3msspPVmwymaLy6Es9kMheHVyr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ea955d02431c90f442dc62f77f839a8dd40b95487f02c57ed33a9ce6ea47f78a", -"confirmedHash": "35fb0f4a01350e54996631d8234ae8032ea83aabd6a8b7080600000000000000", -"service": "00000000000000000000ffffc0f8b39a", -"pubKeyOperator": "96dac75fb5dcc05ff4e3aeb453f2b0387a5c471a92b6a5f04ae62b7beeb024dbe069852b42aaf1d0f84ab3973d1009ac", -"votingAddress": "4Y2n8aPBNxVqM7UiXuE6MADWuraq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eaa62a35c6ffb927f8032bd1627624026df1524d965e2fbd453777fbff0535b3", -"confirmedHash": "4748b5aecb9485a57b0973f56dde48948357dcea4cc9bf4a0400000000000000", -"service": "00000000000000000000ffffd4186889", -"pubKeyOperator": "95062a8bd73faccdf02385e0081963014cc51c805da2233abece6ac0834a7547e2467ad4a09ddc9e71b8e71a37b1a6f0", -"votingAddress": "34dSTcMtfw98xwGWrfLcNxYR3T7K", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eab7f461245a2a762bdab66315d94fa41be1de7b709811dac6ff5428c9809b25", -"confirmedHash": "89780dacce6ad662d4725aa873340c01b7f80745a26e97760300000000000000", -"service": "00000000000000000000ffffa7a02433", -"pubKeyOperator": "184a33a0cb0ad766ad16d6ebebb3d1c429e023f25c9791189ea29537ebef7a7413b4281184bbe86c2d627ca6e8456e77", -"votingAddress": "2kcSbrG8XHZH1sWxiXDri3ts3utf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eab8c4daa2354ccdcc0fc991d9d5a0d4c4457b5be4496faa57b1b76ab24a3609", -"confirmedHash": "d9cceb169a1c0f7213fab2f41d2ce1185e8da9bacf40c7200500000000000000", -"service": "00000000000000000000ffffac688eb7", -"pubKeyOperator": "0cc8c79955858573aa17d280e0f9513f05cc1ba40c9df964d411d68f87c626d28dd9989d8b80c7ba4b8dc8790f8d4862", -"votingAddress": "3AwPCfx4b27NjkdQZtVSg6DqXg7Q", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eacacedda2aa70ef953d323c8451c93e5b2c270b3f7e8c314c2197a4d4488ec5", -"confirmedHash": "fa5fdba71d179c9635ccaabd94e38ba4b43fa033ff51bb9a0000000000000000", -"service": "00000000000000000000ffffae8a070e", -"pubKeyOperator": "8ca8e8f55d00f09df0e309233854a3e44d58e24b63b915602071f83b45b28407f6a144ed9fb2712bfa207420591ec431", -"votingAddress": "3n7LhVW3Me5D2fag2NffcyhpzijF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eacbc293f0abff757b927930e01dd185f907a1b88b0727d58faa78d53b4e8fd8", -"confirmedHash": "a8ee8387f3066af1326d7212a20826c6c4f436deefe1fb241000000000000000", -"service": "00000000000000000000ffff80c76e2f", -"pubKeyOperator": "026d828e39ccb5d0ab5c374fe8753bdb11d183d63d56e6b5a9ab62d505e3fee87065b6c744df59b0cc7e9fcd2b2fe71d", -"votingAddress": "44h5RY5LXuBRTH31j9uEf3tdp4Cy", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eacc857d73fa7f1da0a318dfc4e405b66a6af00a112543a87e051383d647ac40", -"confirmedHash": "1444f5640a4eb6d1503487fa4055bc3fe98464002687133b0a00000000000000", -"service": "00000000000000000000ffffbca655cd", -"pubKeyOperator": "9863f0912e32557ec8b6a0b5eff622be87f2b6c2706e16afa0a55ef7f33f712b851ba989f5fe469cdb2b3fda96e75559", -"votingAddress": "2nJG2c3adK4dWksMZriqXyGzxtbn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ead54ab926124c79892ce859a5da21aea7e8b472082ac1656172883753ecaba2", -"confirmedHash": "c2d2bc0436c1e5c916fee275944adb042da2aaf63ac2e9db0700000000000000", -"service": "00000000000000000000ffff5928051a", -"pubKeyOperator": "997799b4cd7a341bc837f63a9ff671223540d4e54364d4d7a079d32e11bac5eb7ca1a48f9686b0a8d3b4ef0e7e7c6702", -"votingAddress": "2DatWug4R2ubLHHx9PLA1zdHSEQg", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eadfcab21268752697b3015778f4280f2277920380d48426114c5563f44e717d", -"confirmedHash": "76ca971f141a771d84e2e50da22a6191501535d43077e0f62900000000000000", -"service": "00000000000000000000ffffc28754b6", -"pubKeyOperator": "0f2a1eff2ae29124e34aa1878c105dfdcdeaf786f655c13be34ce97f7db53484733c2ffa2c9f9ab9f00d03185fa20ac1", -"votingAddress": "LPz7u9Kap5N3wtYvsgptG4qAa9T", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "eb04987a534c73eb753c5e81df85459e7b1c10144a080bfd568ff12a460719f5", -"confirmedHash": "53f8a5cb4ba5b7db1cbe5b27f7c70726bf7af99acc51c2181600000000000000", -"service": "00000000000000000000ffffc28752ee", -"pubKeyOperator": "07444cb7fab8d36d024c225a0ff7f3aace5b7ea2375d5dfc86ac4b86b38c41ee2f50d42274b9a20f68994687d88faeb0", -"votingAddress": "W4mfCTEfpPtsHQPgP66PF4WEdnX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eb137f962c32102b7bc00d6779c886ddb72a015f8c8d0c68e7846129cbcc59b9", -"confirmedHash": "b8313b991523e33c7d13da0141251035902d7794bd9578234200000000000000", -"service": "00000000000000000000ffff55d1f141", -"pubKeyOperator": "0a03adb79bb7ebd6f06002a5b4f124981da67cdf9c59bc7d9df434240c19eb9fa32c52c5581b170a2fd618189edbf217", -"votingAddress": "oDUq2g2UXVUf6SAFbytg5T6cPr5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eb47790f8c248e1c794cc29649f5a7d022f60a4cbdc08da2a9c7035f86e403ad", -"confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", -"service": "00000000000000000000ffff453d6bd5", -"pubKeyOperator": "08693aaa528e5d7fd07da8356a2fcf95b233d193663596437ea730c147eee40a52af4571064a3a3ad3b337be5d33ace1", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eb4aa3369a548d9a76964aee1dd6a876aaec4e53dc71ec1b8ab5bbfdaafe3239", -"confirmedHash": "18213c34e143bbee47985874fe9983481ccc1d87f65f21404000000000000000", -"service": "00000000000000000000ffff03d0d90c", -"pubKeyOperator": "1409f4f9e435ea5de1bd248f77334743a705e80833cdf3c84f05176b2f6f71918aa91aadd597ff97bc7a012ae1e8d09a", -"votingAddress": "2rdNpNEcZEsAvoXs5sWjdJQfEVSZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eb4ea4c1ad7f1eeccc5dd593f99f00f85d0e63e37259bed6163280e72124299d", -"confirmedHash": "42382f4a75589e03ad67081788967846eea75d13b582a5920d00000000000000", -"service": "00000000000000000000ffffb23febc1", -"pubKeyOperator": "8e201a62fb35dd6f068562aa31b44bcd94887457eba17618fe1dff366c8414acd7b8342a37d850a52b77c08697d93c93", -"votingAddress": "2Bh5cTnq7DJL9km74v32zvEH27xA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eb5d90f0625797197403b8d4fd228ec4f5d0dadb1c0b544e4c0d736660fd192e", -"confirmedHash": "74f025dacfb0c4a00ffc935f117697792ae2a0057c8674591700000000000000", -"service": "00000000000000000000ffff52d3192d", -"pubKeyOperator": "0f79935785167fb5b1885b8447546dd74c9b76b781dde9857c71438b32c9d138ec93ab722069112e700229f7076c74ce", -"votingAddress": "2nESa3afkrko68MV7nfEGTU4LKAN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eb5ea1ffd824de4c70e616f36c70f5ff56ca180c595e899aff26f632db0315f2", -"confirmedHash": "997b9d1265c1505ef096ce662fb781952eb3962613a52ae70500000000000000", -"service": "00000000000000000000ffff5eb0eba1", -"pubKeyOperator": "8d6003ab7efac23db55d28dc10b7c79b38a7fade2e79676d6962e108a4aeadddd60acc45ae24d089b31a5e46a8d94189", -"votingAddress": "3MUNo3WqT3CHQRgmBFc7EANYSy4T", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eb9d1e8c9bc8c5d6d5ff79da56bfa6fe4caef9b7223fae346c5d51f0d664167a", -"confirmedHash": "ab5d8290124e5fca0fd048c8ca1f4feb4772cefae8feae0c0b00000000000000", -"service": "00000000000000000000ffff55d1f287", -"pubKeyOperator": "8d778120232cac1ce92d7fcd4d44ce21b07a98a38fc8bb8c8213c37889d9c2aeef6fa9ad9a42d340e0d3f8098e00e674", -"votingAddress": "3GiR7a1pXpQECyrYeGm3MJsnf6YV", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eba9c0d70444c6843228eb256de4e71d7c524e98276e0d1ba64563bcd235bf7c", -"confirmedHash": "38cf81b856b76f7a5f92cfce3fe05936841e81b2b500c6f60300000000000000", -"service": "00000000000000000000ffff89dc3057", -"pubKeyOperator": "812d420983b73ac05fdc009d9ff9d21a71283888ca9bb31102dfd850804d4602d9f44de83a5de54220c076c23065e97b", -"votingAddress": "4KqMCbEFyZxL23pfwhVgTEpkozWd", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ebadd2bca6f772a88935c249ee752074337ba1cfe307be57f16a1c957ee26ff7", -"confirmedHash": "a12d3d2eda549a8356005f4369af4caad2a8a6782e87e6631900000000000000", -"service": "00000000000000000000ffff592fa5cf", -"pubKeyOperator": "0f6fd70127eb7f9d190bc2127e7720e0aa7b73e1beadbd6a150c9b0ee4e00cbe9160ce698b2debd2b0dc7461f27557f3", -"votingAddress": "UXfsVZcckiZsuuw6zoaz5qvU6TP", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ebc5d912d4997fc3924967d15e94ba92d518e97e40fd408752132026d041e230", -"confirmedHash": "216d8236dff6f44e759636e1982476cd4a8c0a4bac75eeef0500000000000000", -"service": "00000000000000000000ffff2d5575a9", -"pubKeyOperator": "0acfda38540401a550d8af1963a3024904435d977cdb6c70341c8b29f6efcd616b69463d63bb1cc741dd25dea3e8a6c3", -"votingAddress": "34CL6aH6eMADX5psPwbqGtxo2Pfd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ebc7e036db9b8ca52a3f5c42e45f76d8599a2d69595389ef5e7ea4044b779e56", -"confirmedHash": "1092fa613eadbeee091d38909cb14a661e7ca046ecf488e91a00000000000000", -"service": "00000000000000000000ffffa2f3cdd4", -"pubKeyOperator": "8e808d14dda46be0f918e58e1785d935dd03b0273b0bb9dcb4ca21b9b9e76f0ddde2110f45863873a48e8fddba9fe5c4", -"votingAddress": "GZo2mK4DwSukKtfdGL4EXme4rHL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ebe5c8c70fe8d048c43362b20066bd2f7da0df2d62d84519ed94dab4ff190361", -"confirmedHash": "3ce328630634bcf2986139bd70bc529dea85e49860e356c40900000000000000", -"service": "00000000000000000000ffff6deb4517", -"pubKeyOperator": "8f03a4bd3c33f232efb54886f48b914a050261dde23f47c2a1fc22d86a662d612db1d26a3eb0492cdead3dd98240217f", -"votingAddress": "48sh3mQ5xEvQYWomXq9GSKWfTven", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ebfac0c1883f3cd1fecc44040d9fd57a705a97bbd5b39a15587d3efa4ebb8fd7", -"confirmedHash": "9c8fb9b63c3ec2f37dc77e7ddf62e2a2affada46e73cffa30f00000000000000", -"service": "00000000000000000000ffffb23e1292", -"pubKeyOperator": "8fe224de3de77625a9b2d257d07ae0b048f55029b0a1e1addd634b6fbb5ad7cb1a97bc967927293875427371e8860978", -"votingAddress": "3nSs2gGFe6tZy9zyiCc11pwSbat3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ec07ae843ce2cb4f74074d5b9134f56e23ab24f8a452f21b6a7074a0b2396de3", -"confirmedHash": "084ea9ff0e548dceaf816ca317fdb65c13f058e8a48ebaba0f00000000000000", -"service": "00000000000000000000ffffbc2815f6", -"pubKeyOperator": "983973552e3bfd4c3ac7f95ed310cb58b0e73127fa9f01a3c49399c4f99bb3f58cdb7792e0eb7c38f3ecf84c08ff43cc", -"votingAddress": "RdHLdEXB2TFoEfMC4Z8SZ2VvqtY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ec107450308099bc9c57146795dce2d055e5b9684b5b57fb6886ab17f2dcffef", -"confirmedHash": "b408109ca6bfc6bde19797c0e7b4270a4e5d397c3424a1780b00000000000000", -"service": "00000000000000000000ffff8b3b3b83", -"pubKeyOperator": "0bf4f5ff2c81fd949745ac6b7d3a4727266d2f72933c1ad936ad555df6f0bdd9cd7f206836a667c648981de212ffce97", -"votingAddress": "3GBc9e69zjCkp1t1nDV5APFPnkuf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ec1eadf879ad880ffc27c1cc019b1b72dad605004d1194b885e22a7186a62704", -"confirmedHash": "5673b695accad539ce8112ddfcb3e54a9c3b3de90db128320000000000000000", -"service": "00000000000000000000ffffb23f798f", -"pubKeyOperator": "0d7d181671e80bbf5a99138174fc7f566fe884bfbc781d552cceb34c6c17f33d81e6b5f72895961903fd8ac17437ff1c", -"votingAddress": "49GV2vVomkvNQoM2TkLPtPKod9ey", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ec2717b17cf52785d886ab216a4ba96d31219bc2436562df7f80c1f1d124bd5d", -"confirmedHash": "1e0bcd6303782632a9367291d9129f86b9dd053c091e023c0400000000000000", -"service": "00000000000000000000ffffbca638dc", -"pubKeyOperator": "8b0e1fea4cba93bd50c49ff110baded1c90d8e4e3c52115e1a23678f133fbbedbebbde20c6ebb964b88c1b5238b9ef71", -"votingAddress": "vwnLZuWB3Eg4k13wCbmP2L5rGnb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ec302784ccd06da51cfbdf8703a98f9f40fa93cdead84cf46f39cb2f70061a9b", -"confirmedHash": "e3c35885ac9a51cb683c576ee4c036a9b2a4ba467a4270f70500000000000000", -"service": "00000000000000000000ffff9df52ea5", -"pubKeyOperator": "97d13322ec0fb5a12fd3cb8fa6c68d7aaff5a60b81eb4d446c532bbdbac94622ef1c6bfcd053f64d2dbff5aee2e81a61", -"votingAddress": "rhfj3zLk2AHLDRr1xzFRNjHY2Ge", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ec480cdac2a7371b2413950192d8b9486160609ac8ab8ba269eeddef5bd1fa06", -"confirmedHash": "c2b5efa4c80cbe1c1bb2b84d4336fd4266bcf518102e1b671200000000000000", -"service": "00000000000000000000ffff2e6591a1", -"pubKeyOperator": "924ca0b525be99e73f210ca0c802139b3d1faf79e5781583aa82c6608e29d681da30b830ea0dfc584b695450a8f07ad2", -"votingAddress": "3hsvC1LY3UQpwiP46ea1rQVBdheL", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ec56e6d2dbb1b2a6b216e4fa43946232002e9fa3db9373037980b78456f57c13", -"confirmedHash": "102b003b633da78cdd3e61f5f9de757099f4436c1eca5ad40900000000000000", -"service": "00000000000000000000ffff2e04a275", -"pubKeyOperator": "82ae4069165bda602920cfb5df733bc0905ccb4760450cce81e7eb38f160d5c996bc9bffcfbc6aa42adc21718d91acd4", -"votingAddress": "2WaSFCWmZXtdxk3YEaKAu7QAWYnk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ec737e982094df09bc855a38845911f5b646e903b438fe7a80aeb64c317160f1", -"confirmedHash": "897f1ce3b4576b5464fb0a582fdb33629d74304749fdc0f11300000000000000", -"service": "00000000000000000000ffff334fa0c5", -"pubKeyOperator": "0cfd80714557c74a3b35dbf381d1f33f2591f70990a943a938b2145fde597894338c80343a8fc93d92f69bb234d92bda", -"votingAddress": "4F57SWVN3edBwo7MNH5HYzHwQMNo", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eca8f996f529c3a1aaf1ae7e69af13929eb221da39844f81e58aab3dacaed7e0", -"confirmedHash": "bcec0aa44882da7cdc9c489be89a85b5fc82ac3b3e859f060500000000000000", -"service": "00000000000000000000ffffa8775782", -"pubKeyOperator": "869b17941379bb7efc0c7cdc51958df66e6280c1a12b7f17e14f3ec7562edb8d7e7f32bb0a3f93d3da5326560d61cfd7", -"votingAddress": "3rzXLausxAPzcxnMBrMMEpiuqr32", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ecbdd14b71655bc4b8640dcdc67c2c2b9922033d8bbf958c99b443d3e82b2655", -"confirmedHash": "31906c52ba237fb114c3780eceaa77e0bee1d4a52e8cb5010f00000000000000", -"service": "00000000000000000000ffff55d1f244", -"pubKeyOperator": "15268cc721082ee6e26ddc8fda8cb9d784f9a3e243fabcb18d6b9ea203bb81a6a19d7852e6f976f74345221b889a50cc", -"votingAddress": "36fcwygfnJAHoCihWeH7NhgA9tni", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eccb8f772ecc8e562fa46650db33131055d13ee7ef1322630e7b15eff8cd7bf1", -"confirmedHash": "92d761373a5260dc03f27b82100f6de56d509b6c4ffde4103800000000000000", -"service": "00000000000000000000ffff2e04a273", -"pubKeyOperator": "0daebfaece114bc895620c64edf86c3619d03a87a694e2c315fbd64c77c60415513b53f2255a42b40b945ceee5498e4c", -"votingAddress": "3Ki6AnQJDa9J8dtmG4tbBGVNMtde", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "ecf9a8d3481d083a42c71436a6372fced49168a401818379fdac79a7c0e3483c", -"confirmedHash": "8d073243f0996900ca6e44c171a1a7b5450c4aaa4cc72a380000000000000000", -"service": "00000000000000000000ffff55d1f1e6", -"pubKeyOperator": "0a36c5473648614cb2e256039c04471e69240007ac00a2a5cbc047fc7782622c0d9cbb0a740067d21b39cfd89380b6fa", -"votingAddress": "3C1xdJ1wDDBGuEhy2dvPgS7ds4EK", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ed0458983dbe82e481149312606da7c29d9489764bf631c5f6adca50bf3b2473", -"confirmedHash": "0cb8360f47acf4d83f52985b96888a60e8a13f408478b5ed0300000000000000", -"service": "00000000000000000000ffffd1faf239", -"pubKeyOperator": "090475e3bc3464514e6df3ea579fea5b69c825c4b43af35efcea1e81b8ede2695a487b0186300ec9648f06eefabafcbb", -"votingAddress": "23Fr8LJQdT23PAjAMqR6nr2zQQFH", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ed110c05096d2f445d631a44743b11f867ac67070e5f77865c9f7e0a98d139de", -"confirmedHash": "8378483759aef44963d5f1ba880a698aaf8fc435c0d367822100000000000000", -"service": "00000000000000000000ffff4622d269", -"pubKeyOperator": "13d0fbbe1a6812c94aefc2e34d517652115a09de4695deac39a7d34b34f1de302414456352f589de243544bf54adfbca", -"votingAddress": "3EXEdvaQCQbRYR3Z4kD8HZ3ayztr", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "ed1baf84b757e3f3902c62214512bda1eb3429df43aeee724b53f6e21713d8d0", -"confirmedHash": "2a9b634ebddb5ce00d5098f3778cdf7bbe416a17a657cf140b00000000000000", -"service": "00000000000000000000ffffbc2815eb", -"pubKeyOperator": "8381e789c2446b8912b07c4d6fc95d8ca7578dec0f1d336c7a52f621ecc6cad36b9105d1e3173e76a65f9fa3a4d0b205", -"votingAddress": "29UHXHPmN2hZ5itJXvU9nkgSjkNu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ed22b08d6cf0084e88e870d98c49ccfb45b390f44e707f5a4af6a7563fd2b548", -"confirmedHash": "173e8a4b4828bf9ea7b41ce176acafdf2c03ffaf5afc61c72700000000000000", -"service": "00000000000000000000ffff86d19c8d", -"pubKeyOperator": "162eeda188efe32e6da82da383602c0f34c0f002e52aa8ee21413e6cb564dc6d8b0b13465c5c0e23e257bdf3f9dd0858", -"votingAddress": "3MS7CxBwxGDwes1jCszn6M2xwMEe", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "ed2545b179e4fb38f30e34b5b3dcfc4c5f3618f28ac1fe0999d43875fc48e7ed", -"confirmedHash": "017ae7aad0dae9f32308d6bc490b574a4f4b78e92cbbd7910300000000000000", -"service": "00000000000000000000ffffa5e326c7", -"pubKeyOperator": "17beeb816b4793e3606dda013173200b8510c58e10512fdf4a38e33e3e5c4c64ba0fcc7af7eecc17b0b269c96e529da2", -"votingAddress": "3JyLG8SvjpSRt2ApvNPktNFppjsV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ed2d776fffed62c330f5ba4b1add32031c249b395ad3d01e939e9a8427b1bfcf", -"confirmedHash": "680dffc42bfe2476ac2a1f0ef164bf274f5b1167e381d2982b00000000000000", -"service": "00000000000000000000ffffaa4baa78", -"pubKeyOperator": "14a2602eb1ab92786232cbec13c7aa73f8485d06b1907bad1f1a59fd98aad8ff6f66ab1ba767c5e75a5f99011ee87615", -"votingAddress": "3dP7ijSRzHxEGGxDqKKnvgn4YTyC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ed2ee2fa9d6418994a424d936f8ea6ea040adf38a860893c3bd2934c5877c425", -"confirmedHash": "cda29b67ce0828b2618f89f898b47f3c596f0c080b42260c1700000000000000", -"service": "00000000000000000000ffff59280fa7", -"pubKeyOperator": "99899c2ae93d0308c3c5cb8c707a47e03bf0756e6a38e65cacccb0382166efa7662d994c116eb148ab4c3b56f044a640", -"votingAddress": "UqJ5bbWnTReXeycyswWVeuH4C2u", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ed2faa4f86cb8a6e1a5f5126e6cd8fb7ecbf18da61561648a5d9310591122e88", -"confirmedHash": "0cb8360f47acf4d83f52985b96888a60e8a13f408478b5ed0300000000000000", -"service": "00000000000000000000ffff2d4ce784", -"pubKeyOperator": "80ce1e869c9eb7a3e42b056b50e515a977baab96e6ad21ce7f75157ffd284483b30ed6ae6f2f3034d6eccd417d6365dd", -"votingAddress": "FqMBjjg8Ap1MBGyBqDZvxy5rM9A", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ed40ccbc606e06c2d7d44b3a46ba05f0157c8a2c33e989ff2cbed039694bd8b0", -"confirmedHash": "0f33f6dc8abd0b0667b33ddfb22ca6fa426601e3780023a10b00000000000000", -"service": "00000000000000000000ffffbc28e703", -"pubKeyOperator": "8a2d0ffe84bad9f3bd378760adb04627e8d62423e64aa4ca333eedf4b63c1202a3b96c810426dcfde237441797b57b98", -"votingAddress": "3eKDSuZZ2iqSHXxS8xkY1FGx7Puk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ed421f5ae04a686826f54361e49b5d207b004686d018f95f49d374154e7d3d9c", -"confirmedHash": "60e0f3fdcbc47cd038384cc747e163d00ad92e094b2ca9712200000000000000", -"service": "00000000000000000000ffff52d31528", -"pubKeyOperator": "0865d48f4197c2f15e00ba916dff206a57e5174002773a7651b36677522b1bd5b5a09d421df4c21283647aedc45c7754", -"votingAddress": "5xxbQuHCYCNi7xWa29Wc28Frtcd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ed4cc165d484cc63465822e9962e6a351c4e7933a9356580de571a07e4688c28", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b017", -"pubKeyOperator": "18627aac9de77e3657fc72b08da421660e9bda8e1ab315c9c416bc1824c131fe9ddd4d2401739aaa318b31fd88aacced", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ed5068245fa3054b32fb517346726f2fac8381f53de077f533b3d57512699ead", -"confirmedHash": "61e8668f336a19cae0a6f7a1d8a3d315fc7e5dbd9e54903d0f00000000000000", -"service": "00000000000000000000ffff52d31534", -"pubKeyOperator": "96e2a9e4d6662ed9e2fad55e475e226509dfa5d7f61435cbdd8f83128c0f0389c0be82ae2a228ee0c41c4558d920202f", -"votingAddress": "oZe1WQahXFmkBcvH8ZJd1Wa2U5E", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ed640e298247e4b8cf4f791738f34e0e5ac85ec973bed3ce01c581f9f57428d4", -"confirmedHash": "c8fac7c25511b02ef6f8cb743098492c6b65d12e7f8611830800000000000000", -"service": "00000000000000000000ffff55d1f1c0", -"pubKeyOperator": "913bfe0cccf30484db71b6a7f24122b1d96d18f641353e1f5d9370c8d2bb673d53277b1b66edf7fab59dc98040117e66", -"votingAddress": "2V7hawmQBgmLUQk9DAKi7YMQTPzz", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ed7b17d1f04e56b7c50b01981d5189ef15ff4c4adda0369b6429ef120f772780", -"confirmedHash": "89b2e80659a6eb7b463308ae86a4e80c1e59ce79a69b57f60f00000000000000", -"service": "00000000000000000000ffffbc28a319", -"pubKeyOperator": "976497a76bc74bea08009256bb23a5b39fa56844bcf271abc7d2839d52bb81a08acb9d9d50e918f4ed8e8b81631a6a7c", -"votingAddress": "xMtYXFFdNyWDfhf1guXA2nZvj5C", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ed7de882f6176c9de474e7c592fc0faae686734184896343fe8fce9906715301", -"confirmedHash": "542acea0b4cbd2ffbbc9c755b7f633b53a38694ce6c7bc701f00000000000000", -"service": "00000000000000000000ffff58c66bc2", -"pubKeyOperator": "9908042842319b1641157cdd53f9bd250e9eda52e19bdb747b871015ae1a000303400875f162ff9a01f3310a3e5b2faf", -"votingAddress": "32Jb8qCCBN6BCkhYvkK5BPqtMv9R", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eda8aa464a94f7c17196c35c084d88883a39f5e0aa93ed2916a06cc2999a4337", -"confirmedHash": "475079864a19c77db93b62085c662d1f4810fda1e3088fb70500000000000000", -"service": "00000000000000000000ffff05bdfd43", -"pubKeyOperator": "891433d784b40b96c2b49973ac68379c4cd4dbb2a6e7a29b1ca8a3000bdad04a1f3aacd474862fa2409615a1926543b5", -"votingAddress": "B3XAsuRcxU93zV5P7U35PRPy7u2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "edaebf3474de97595175dc902d51ecb68a0ae8296c2e1e9d8f4497e974b42f4e", -"confirmedHash": "e59accf123796e0e7dfe26f4fd3dc8a76244603294deaf201300000000000000", -"service": "00000000000000000000ffff52d319b1", -"pubKeyOperator": "120b14f4629acf7b553f8479253baed15cc9297f4e31998045928b9f35353df3ef10064e1fb6b929da934461babc9701", -"votingAddress": "Vgh1jgMYUhEyefbkXkUVJ1PtE9v", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "edaf8c3bde8f6ae8e85a9a38ad79f9e87a114df2247fbceeb782bb41ec1b859b", -"confirmedHash": "1d6fedff169df03a36a10c4c834acb785692ec120538e2770f00000000000000", -"service": "00000000000000000000ffff2d206a8e", -"pubKeyOperator": "878b65e703a3b309c1a7bf9ddc5742602e5682ba44855af4641034802669d9f044ad63f401cb33a9c6acc58338401c31", -"votingAddress": "3tRxuQzKgu59RV1A3pucN8U1rVE2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "edc1bc81fde15fd0c1c4677ee753aa6870c678e2b08f482ee924abef83ed3dde", -"confirmedHash": "296efb00a95c08b738d5231f3462b774a9568475f8af7d250600000000000000", -"service": "00000000000000000000ffff867a5cc0", -"pubKeyOperator": "974b9cbf5f79dd2a4292b64853adb6c18fc083ea231715f4ae74ac5c9ab6b4c04ba8d90d4036c01340105c1a7c1a86aa", -"votingAddress": "aWnjXCEEF6Hy4wbex5KdyGMiafp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "edc86ce539068f1a8915b4e6efcae7e0ad4976be7d669172d98dc3201f84a128", -"confirmedHash": "d9dc3f2c20b20aa1129a533ee210b5e6f3a034b57c9df7e11200000000000000", -"service": "00000000000000000000ffff55d1f10b", -"pubKeyOperator": "99f775a0ff7eeb65374bfb275631c0bea2d1821e1f8f253eb057c9a61faffeef8af31bf74110e018862ef22aedb836bf", -"votingAddress": "4REEqQmhaxfRAA4RxUHmyFZJiKyB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ee0b6788003d202d5008a02ab06b6c7ece389ef65a8f1442a64e41fa46fa281a", -"confirmedHash": "00a0f11caf1689cde6798fe0abea028367a38472dae7fab02400000000000000", -"service": "00000000000000000000ffff52d3154c", -"pubKeyOperator": "907f857dcee8fe59e08fb04176fb7def4b74d016f45f3ea48db00537119f973a1be6425735b6a71b308d8c7e7eed7d0a", -"votingAddress": "jmjJ98FA8EdbRU2Jhnv3cs1Gx1V", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ee16c50b7663f15394777edacfe1edba45f3bcfa220a0d8a0d5478fc1a169344", -"confirmedHash": "46d128c7f11ac98ca9af6188c0d2988bc441ad28ffb797ec0a00000000000000", -"service": "00000000000000000000ffff17a300cb", -"pubKeyOperator": "1703a5d74f7af7db6073a7d5f541ac178119945831985f6474535e0b50367db40431ac7667581bb52203567e22eafec4", -"votingAddress": "YtBr6ixXTsQQC9vq52vQjaiQbsF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ee1bc397205a0171bcabff100aa07fea9d88aa325bde2d96cf7dfc14c1c5fd63", -"confirmedHash": "aea7cd9e522a8d4ccb61371613cf9de9bc0a324cbacb45a10b00000000000000", -"service": "00000000000000000000ffff52d3193e", -"pubKeyOperator": "925a347eb73b3d1d9aa121696dddda3437b923de18ab51e7b28901a267f9a0713981c8e206d229945fb1f77c69e2dfe4", -"votingAddress": "35qo2WZ7ftErAXogARgGmmY1fiV3", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1760248 -},{ -"proRegTxHash": "ee27eb5dfa519c35a3e8ba56486bcc01431c6672d1d7cbf95b2b2580b0d66705", -"confirmedHash": "da3ec30fb143b4e085acf4a62b9aa49e713a86b5e2db89850700000000000000", -"service": "00000000000000000000ffff5fd947c2", -"pubKeyOperator": "03f58b9aed0e08ca3394587b9157de9cadddebfc6d85c71f5edef61522fde5dbe0711cc1023894c0ef7d0f382c398c2b", -"votingAddress": "4S7n1LcwH6S2DUp4vmi1UbtrJYHR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ee437be3b63125c50c910a5d877ddbf035519d92fe30220bc6065a32092028ab", -"confirmedHash": "ba5f9ce7aacd9d19ff98f27df46e93c41a5fce20e630bde32100000000000000", -"service": "00000000000000000000ffffcfb4c725", -"pubKeyOperator": "968c94c346b0f3d9a09ffb6638d0e0dc13ece73e909a442454f513686912ef6dc818e87383e70db190bd67949481eff9", -"votingAddress": "2oyEpm9s5KwQnS8McSUpL6uVC5ps", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ee4db87ba9a7b05fd12c5adeb74237ad810da139bff407139baae95a84d1f06e", -"confirmedHash": "d3adbe50c1c1372798b588037dee89040cbe53763c3465131600000000000000", -"service": "00000000000000000000ffffc2875034", -"pubKeyOperator": "8fb64db88d29bfec13ab005a3aaafba4d320cd44ed898adf45920859d020d7ea965a3cf41303bc060da3b7c717332e01", -"votingAddress": "zY7cVHtXQeHAUYXkAayxK3CG7jX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ee50f85100fe2041303b961daf08ff17b3c957d0c9b4a95973c0a70327252bc5", -"confirmedHash": "498242c34b98e36311e1436de20095da610b3dae6286ff3e3600000000000000", -"service": "00000000000000000000ffff8b3bb2a9", -"pubKeyOperator": "861327a26cd0b6fabb50faafbe6b80bef353f4d8ed05cff74e1ee8f47db490ff766729a5564c71408fb8a2be14831c8a", -"votingAddress": "F94drjJwaAgTjM1DpBR1xicQJvm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ee82ebbb5d7473d781b8e621e22b6a8c4fec2391ab0627198094d4c742b05ee7", -"confirmedHash": "784ca1e8ef0b3e93292c214718677cc195ccfb8c4d1d06d12800000000000000", -"service": "00000000000000000000ffffc1bb812e", -"pubKeyOperator": "89f40bec2fa537e212cd740497d2b47bf00873f6634c321c795e09dc778efce15c07ba40c6e902ff6f7854222c362b5d", -"votingAddress": "rghoNbd2QNkqbkyw4tJbHiGnQak", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "ee9565f9530078fcb21d4d0a61c68879a6a461be69e16a30483c6085c035795b", -"confirmedHash": "abe1d69cd4591d0795ef305f5736655c56cbecebd2a38e670f00000000000000", -"service": "00000000000000000000ffff8bb492d5", -"pubKeyOperator": "01ee49f6a43f6e80d2b2268b89a2c160b02522a52364c7d67723df38817d6d2a8c4b62ed4156ff1bcfcb59ccfbc354b8", -"votingAddress": "4KhoS1b57bfKF9VkJv8ebK1T6s3m", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eeaab79739a6069c0f0dda8c763e28c526ab52124e1753edaa7f66ec86356284", -"confirmedHash": "0e44f9e7d600409783685f4d58266d7f1927c9cb65b793662d00000000000000", -"service": "00000000000000000000ffff2e04a27a", -"pubKeyOperator": "890ff1f431f2b4d3d6b77872fe40a13ba7bee65956a8c509534b7c1d101d937d45afd7646cb75735a39a533581182e56", -"votingAddress": "27Ej19eY7jwrUw4tdPXPWL5NkHuo", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "eec1339d38fa656dcdb96e82f8c269775ba8def17e02a97ad400981a770a972a", -"confirmedHash": "4a87614c3c9a020ceea38b9716b3e8fcd87fc4a258bbce4e2e00000000000000", -"service": "00000000000000000000ffff9fcbb428", -"pubKeyOperator": "093e656fd2bd084816c14a13429277b1eb3261d40925eb638e493edee18e73b32b52699e927f4e791b79edcc61efde33", -"votingAddress": "2tweu89fBwMLjfMkVJUnAfa7xxes", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "eedd2229c4e9855f00b469adc05b5e8e2f3a8ac557faa769c81bb418d49c35f2", -"confirmedHash": "c985dbd25e02152ea6645feda28ba34504897d0a0fbd3a2e0100000000000000", -"service": "00000000000000000000ffffa763d603", -"pubKeyOperator": "0385fb505a74eb9262d192e5e4c9fe54672f5bb4d9ec2c55628ffeee6a8531e466999ec032e5e0cb124926430165d1a1", -"votingAddress": "B2vCJoxgScWXKsE1fjorTcVJkqN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eef5b17be49cae0040e3e8347a3bbb6815d446c59a6282ed2a7f4042f7855be9", -"confirmedHash": "31083b47c4d85a181f8091cff0e74e5703ef52f513a9e75c1800000000000000", -"service": "00000000000000000000ffff2d4c803d", -"pubKeyOperator": "143de01e9690228288e8ae2d465fca4a164ef8bf3c2eea2d18dda2972ce7d637014c8db285259fa3b19c94b54e0bf645", -"votingAddress": "4Qzv6PC1Qq7cHoxmLKSCCUEL6Ejt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "eefd78b85369e52e3e0290059a4e92a14941a269afe670172ad7489b0f161167", -"confirmedHash": "c080d488982716ee367745c26a8f1b420b4826e3ba8415e20f00000000000000", -"service": "00000000000000000000ffff8e3bb080", -"pubKeyOperator": "88a503dd9d96998aaada1a63ab0b00b2623f82bccf0e0bcf044689b783b5d5e08c371c78f26571fcef2a172182b9e061", -"votingAddress": "25g91ynsesnM26fcfis5hD4z87QN", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ef0b94a3f480d33f359fb8d88ff9d882487da09e747f638db77bd99c9bd59610", -"confirmedHash": "49189a3e10fe63ab112496e2386dbfa294618a4ebf9ee98b0600000000000000", -"service": "00000000000000000000ffffbc28e705", -"pubKeyOperator": "95eb3c7143fe51328b0a1604d0d874f0eeaa080d49b9ba1adebbda5b6ca089ce46d15005777f7f836ac04eebddb35851", -"votingAddress": "wVXfWTN3XBZGZ72PvBmdSHpTPef", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ef1204365964e88c16265531874b7f8f1304d019a695b5a5b4ceeabf117b5e34", -"confirmedHash": "966346da385a620e18cc86215c041dd37ba70220f2ab9fc31700000000000000", -"service": "00000000000000000000ffff52d31948", -"pubKeyOperator": "8d4b18757b438e1a48b2109d52659f1ef7413c21e5365c5136552b0e0631408cb8083bdd73d7888ab41a81e38817c3d2", -"votingAddress": "4RtfTDozfQtKxXpLQQzLYL3S2rh9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ef4494bad86971a02e89ec46e046d26fa56a11b5251e24f6a714ecb9f0078fdb", -"confirmedHash": "0e6d2fc436266c4ab3a74df0668e019bdd52421c711101030d00000000000000", -"service": "00000000000000000000ffff6b157215", -"pubKeyOperator": "1428df14a684fde7f07cd3a8c7cc4a10068a6fc5989def942b064d318fe77e8df9249c847cdec790b3ced2428cfae8cf", -"votingAddress": "3VEB1DpUephFDTFCXL9C6Mdd4tiW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ef4edea4a58ad8a36086cf3a884d5a6068f9498020423122e86e1eedfdac0ada", -"confirmedHash": "ed0363bcc33288ca9b9c593b1710210e51f6f6608cfdf0450500000000000000", -"service": "00000000000000000000ffffc2875af6", -"pubKeyOperator": "95e53a9f5f0074b0ba9cf69926bd3fce169b1830d063d55b80e9723e80b2d616a2ee046feeae354a2a9a40e30c4d447b", -"votingAddress": "3L8Yp54LRXRD92RgvZpURzAQxuHt", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ef5b94073cc591b4ac6f1fcfdc04f6bda1db98d1a0e3547fbdb6fe4649bd7fa9", -"confirmedHash": "2e21ea1d0c8aa28c24191ea5935b30f83602e7075ff1f86d2b00000000000000", -"service": "00000000000000000000ffff55d1f119", -"pubKeyOperator": "052f6dbd88442166490382c9a39ac1744e3e0c155bb5c2bab4b32e7c02eacafaf81b9ff1592769c556512116d24b3f73", -"votingAddress": "eP7QJPsfRyhjT3xAy5YooQaaA1w", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ef6fc5fa1237fd2c0aed00d920276a18c24dec808dd73ca8266b28d13fec4993", -"confirmedHash": "716607dcc2024f4d671964af327f1737e61f96ef101d5f132100000000000000", -"service": "00000000000000000000ffff59280fab", -"pubKeyOperator": "848357c01992894e44b8a6d04605824f5e70a5071d3a1f58c62e941ecb03ab2b26d9000485936af8c7331ddcb3485cb5", -"votingAddress": "AyTb9xWnfvMrNYqvUEdBHVcbKMK", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ef7276d29abe19e38a02c1f2d34a0e41fdd2f5c9a6647dcf9cb22941f58477cf", -"confirmedHash": "3845e61195b22b362b38fea85eb3aee5610ae09030e7ab260700000000000000", -"service": "00000000000000000000ffff22f482ae", -"pubKeyOperator": "8ab57b2df73bb68367fa9f93b6695eb4ee43468be85640515a10ff7adb2e5465aa45379867de7df7b43d286e414db6d3", -"votingAddress": "YDGHwhY4LFZ3GbRrvNoT7uuLNrP", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ef755026d0cd264e4c700a1fe5f17ac173b221fb939fc5fdf08fb55a8730e259", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff8491bd7d", -"pubKeyOperator": "0ede0dd262efc3f287c56b1f38d916ac1f5afa0c9d11593d6bf967e628a58a15f634bea8423382f5f4b63018d2e88e1e", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ef778d49e573bd4de19477ea3262fb4cc47da776eacfa56cc1ba4107da251408", -"confirmedHash": "1100d83f5a5a54fe2639da65eaddd6de53fd0dffda124bb40600000000000000", -"service": "00000000000000000000ffff68f812cd", -"pubKeyOperator": "99440810cfbf437086f51e43fdd773c7116627de2a92d3c8448e9e8b3a736b174e35a775ee2d0f933b4359af1168bcad", -"votingAddress": "4TbhtKMxYtPbp4c5C1j76N4rsmDu", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ef9dfc8b8ede77eef0e0b99048bac7f7695d9c5f645005250a70a6d0ebb06bab", -"confirmedHash": "17177af6ff9a06c4ea86a63e14fa9bc9d1f6b88e0b00ca640000000000000000", -"service": "00000000000000000000ffff923b0dec", -"pubKeyOperator": "113c86b25c47a8bb2ef9fe649877d03be9d8894b49500bf5fd8b8e1f6aec9ec1672466c9c5c8e1d1de4dae49aaa27783", -"votingAddress": "2onfWeSiFNt6Bnuu3sUhTztMgooq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ef9f8d8b86726caf9d682ce4e79c81e912e05718f4201f6b9453ca5493d51846", -"confirmedHash": "38726b2cdbd3518b9e715cd8127730057afa6417e0fef6760d00000000000000", -"service": "00000000000000000000ffff93b6bfb6", -"pubKeyOperator": "064451f17b5898826ba2357f3428ac823a3afc065bce3852ed5a3da151aa35838ddd55993ccaccdeee1bd84c8fe2d66c", -"votingAddress": "FEKoY7ZSqyVGdn6UJ8VpSvPe2hB", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "efb289e0a7ba26e4ad1541bf320a100587e4a04610c2925a4fecd3856ec5f413", -"confirmedHash": "302333fb8017dafa1179c975baf3893cff64151d88e1b6b11c00000000000000", -"service": "00000000000000000000ffffa763861f", -"pubKeyOperator": "8feb773c1e828f84ddb16bcff6560994f795faf77e269a990940096c3477d4264b90eea8d2995a726ff3398d9d64acac", -"votingAddress": "hHoYFEwfyUeHwypgnrXFTggZXQT", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "efbb35622871c689c528ec7d8924b6b6d8f9476c81542e59f6a8e76176b8e7ec", -"confirmedHash": "ce947f47495edf68202ecc7e18f5c08d7b8d5bd7bccc550c1f00000000000000", -"service": "00000000000000000000ffff36557797", -"pubKeyOperator": "8ca7edc3702c0d85b68a54f6a5ab29373611cfc533b926e2fd3333b10f12d2e858433f4a5977c8afc5b1a7fb1c58801f", -"votingAddress": "3b4N4HYe33yUV3gbH5Sng31RZDq2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "efbb423002f9a37829df2501acb6c3ee4ff4c08900a614cac77e9f780c9aa720", -"confirmedHash": "d4ab6758424a22a051c631e6e463755297cd1de706afd1a80000000000000000", -"service": "00000000000000000000ffff2d5575ac", -"pubKeyOperator": "0b5a252a2677912f866809ecd4e4c40fabe5071a3cc1ada7543fb1f3659176ddd732caa657ba8151002744c323265f57", -"votingAddress": "z2QT8Rdud4Cxr7jkqDJTB3ozHxz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "efd9d04332436c16e6ed0bbf0e0e5923dbbd0598b5f0cbe7db8685f1ff36f40f", -"confirmedHash": "e70b13255e4c476a0892820b06a490bd23f9fadfa921f07c0200000000000000", -"service": "00000000000000000000ffff5fd947c0", -"pubKeyOperator": "9089fec1f173a60beaf32b52cbc915b68cce33aa663f1f597e449a4e86e2d1bd42eafbcc6045c59cba624d780483c7f7", -"votingAddress": "3GooKKmP86KMr522kZVdEy5wDKbX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "efe8e8a385e1f12a7d7ade8dbcf27c3205d11497e6c8d26470ae93e2d2b480a7", -"confirmedHash": "8ea8a983a910008e88e550e913e5ce4ff04ab6e008813bf00800000000000000", -"service": "00000000000000000000ffff52d31503", -"pubKeyOperator": "07061624325afae759b764c97f2a37b657c4e9cc0c372beaeb6ef76afa6fd1101eb9264c3607b39329bcb43a86172134", -"votingAddress": "2G9xsyEf2Sb3jRQii8gjyW6iBU9m", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "efec9fc4693992d9f9c0bea589d5574a1d35e59e26830d02b01218ae3620c0cd", -"confirmedHash": "ce9e030a46c9101431a31e578a808dbb7c4db909ba1530431200000000000000", -"service": "00000000000000000000ffff9f4168ef", -"pubKeyOperator": "859efdd9ebc2a2c48517423976c45ad90cb943987183b2b246894506e3ed8208b61fd480d0d2aaddcdac2f481ee08dc0", -"votingAddress": "vLttnzUo7TZF2Am3os3bo4HBErR", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "f025af72984e7b8c61f9e8311b3148bca6de8157290a52ee372e37a295f2bbe4", -"confirmedHash": "bde13af36ceefc5136d1cfa0962eff04e10c7237276f4f263a00000000000000", -"service": "00000000000000000000ffff52d319ad", -"pubKeyOperator": "01a4d3ca13d2576d7e85c3caaddfcfe77afe2a2248ef1ff87ec04cc58197b53fed435bad566c1e5264a70535412af647", -"votingAddress": "2NL8pZxUJrfqFhCgDL2znYSTdmfr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f035cf0f8aa371a3ccf4e2c06f84553c7d0e024cf26e3b0b2aa52f42c33c95a9", -"confirmedHash": "f2862c2e0834896b8d60de2591187c67212a92f0fd8839cf0800000000000000", -"service": "00000000000000000000ffffb280e6d2", -"pubKeyOperator": "16b3b5c84cd0ab4ff85afbf36d0fded2e21a0925d23ede1e41d09a973183c6b4daccedfa05fad43b935776d696c62249", -"votingAddress": "47beDoMAEWWwM9cAr7gRkYKDp1KA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f0361409531d2194303483c2751812bb78318a2a2c237d46af2a18384ac1eac0", -"confirmedHash": "11a8c8a8e63dd7564218f519f64c2e32e5e52ad3032d23150e00000000000000", -"service": "00000000000000000000ffffc2875bac", -"pubKeyOperator": "962f4706a58b95212c03bf8f4b8fe8e7e8198f23b33ed49cd68f806cc95bf9acbedb6d95a03033522c1fc715a47b5784", -"votingAddress": "4BcDz9Y3RVudJ6jjXpWxZtj8sdHL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f0535c6e3fa1478d84647f22983a692ea72205c330fa6effb9c1f106e12d822d", -"confirmedHash": "fd3bbfb712a1cb133364c4e8a16bd1547d7673cb5c348a361300000000000000", -"service": "00000000000000000000ffff55d1f232", -"pubKeyOperator": "99ba64bb4ea2ec9c02e4b7bbd27b8112f08d5a0daea9741d40de61cca30bbd84db026ce3e4cd467f84c0e08f1fc0501f", -"votingAddress": "gb6bk2xUDh1TvtRpSGDeKc7bxfc", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f056ba4ca2b78dce49d5d95c0cd3dbbab313fee88a230643175044b6d2f9d760", -"confirmedHash": "6458e4fb1463e827e7b043ab7c16799f5397276f28b2d4230800000000000000", -"service": "00000000000000000000ffff05bdfd6c", -"pubKeyOperator": "851714cd1c95b65af051e03d5bddebb8d1104799ed7b2ea358aaca610782f442078cbce76c72d19d6117ea4d052fb7e1", -"votingAddress": "n4H76pZhebp7qv9kcTzMrQFAtKf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f05eb8af2c8b7e7fefac728d1512c16365c0f9c170653b2c2346fdf3de1b56e5", -"confirmedHash": "b97c681f1dff6db4f7a9a0593a66230eea90a81be8817a3c0900000000000000", -"service": "00000000000000000000ffff4622d114", -"pubKeyOperator": "155659aa39843240bd160421fc49bed1fd4dca35c21036a8db44088060cd5665db8bcd6bcfb983424e75e5578abcecfb", -"votingAddress": "4CBSLq6nqmJwrxBkyBxiXpJogVWr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f07dbbda13d54b646a25aba249c794bf8361cea2237a61021f96c56dc784f890", -"confirmedHash": "db6d0a972ceaf21666ebc5d0f86af63f11eb23d2ffbcb5f92100000000000000", -"service": "00000000000000000000ffff128a4294", -"pubKeyOperator": "0390bea817577ff49f6b0524aa344130e3645e319507b40173485bdc2ecc58faf091a2508e53fd346bd02ed590883ad9", -"votingAddress": "4ANa8vdTVCnxnmLqxhP6SgNd7oW6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f09fdd4b3ccf46b2ac5df9e3f4b85c910a3bc9b0c5ca61a5b295953012a42435", -"confirmedHash": "38b7762f9b7e4a5d4c0e5fb1ebfd85642ee257f6d9e753be1f00000000000000", -"service": "00000000000000000000ffff05b532be", -"pubKeyOperator": "024ed6b915a98ae15353188e9112f8b8eb9bf23c8d930072c27e2369432816413c6dc85110d595dc891537a133542584", -"votingAddress": "hLE9Ki7XGejCGdKYVBa1XnWaQVc", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f09fe94e7c393f809ae137d7fc659200ce8a5ccdb2435054ea50a96b1a2ef544", -"confirmedHash": "9b0c1106a5b5121f2265f99fd2490fe642d0ee47f3703ffd0c00000000000000", -"service": "00000000000000000000ffff5e17abf3", -"pubKeyOperator": "9647f0e57f7f66bfa91bb8cdaf0a3ad65cbe5aaf98c1ab4b26d39f5340e7a7261ea189ddfb44fb01daa5490904988469", -"votingAddress": "3u19CNE5VrvPs9AmtQps9gY1xCsU", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f0a7acdc8e09d97b64bbd26fcd5c3766d24f2cbdfc17bc997452abc8c6226871", -"confirmedHash": "716e2e8c7e2795e293490ee391874fd59280ad8bce1c3c9a0200000000000000", -"service": "00000000000000000000ffff55d1f23a", -"pubKeyOperator": "19a39d07608e3aa0ad3b37edf102965f566b91d2fd51b0cdc6c9d7ede228f1bdafe5d866034dd57557f7532478111204", -"votingAddress": "2Eggf1kvExxwhfrXDLqufp6Rashf", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f0c1e2a7e016ac539b77b6e6d4c45267d6ddada999a0fc6cffe2387fb652027c", -"confirmedHash": "885e180c8115dad4b873513ef082fd2fd44542475fb358731000000000000000", -"service": "00000000000000000000ffff52d31573", -"pubKeyOperator": "0fbe3891b05ba2676b118525be531f33e5ec197a846b23fd6aaef74eb1b8b50c40c7808b594c29b0cbe483aa7689f49e", -"votingAddress": "G5rsHNGudjJpA1Wp7tBxALuNqFp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f0cfe746efd26ddda55d10b516908fd31bff4ea80eb5ee176e2d236bc9d8a8c3", -"confirmedHash": "15409eee633be949ac015f328e434352d470299d9f6413141100000000000000", -"service": "00000000000000000000ffff55d1f196", -"pubKeyOperator": "8c4e43df4d923e91514afb7ac2e8c75dee8c0c6ee7e5dc1f58943793ef019ce64ce6452efe86742ee56e7c28302469d1", -"votingAddress": "2TXQk1StfV2mTemZbyoankir9p52", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f0dca3c7c4ee9e8cfc75b79c51d7c1c4589df78aec5c9efe9abe53990e1e65a0", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff8491bc52", -"pubKeyOperator": "986aa44d21a38f743712d2ce721bb11083ac4aa338c630602a58f46a42db9c8b20ef01d6108aacd4ca43cf83721ae25d", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f0e30a113ebc4e5ef953a1652fba2b7074776b36fc828d02b72b7f3d752070a3", -"confirmedHash": "2540de764e3bb2cd3be361633805f1487a43437608f0f2910f00000000000000", -"service": "00000000000000000000ffff74cb7289", -"pubKeyOperator": "1652ef22c52f2bda1cce5275b72a75ddbdbfb05ddd4308bc79ac5862e8e8f495236ab2c59ed88b08f746702730a68807", -"votingAddress": "45omRhV7fJFgnn2aZZojV3HeSf9r", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f0ee31cd964779e1e2efd65666e6f59a8d52da6038df120a11a238de0de7d88c", -"confirmedHash": "d8e25e5d4581c1c387012a714f499815651f684b301bf3071200000000000000", -"service": "00000000000000000000ffff52d31924", -"pubKeyOperator": "11cd5837b5c4654d177b351f0ee4e0be2a5eef0bff037a544c2f95eaf662c2c23d9ec59b366322ce59bccc8b3eb33104", -"votingAddress": "xaL5SdBiYiQpMbDpUhtGbqjL43R", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f109e3f44098446ccfe719666cd75a645fd4461d6e126a2afc3dd4ced3c32888", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6eab3", -"pubKeyOperator": "131c94dad302899484b4383425a4a0df7aba81161b9ea099d83b3b716bc01be0ab7c3d12b39222d0e23985925ff4dba0", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f11839ae78007e2a265b901b3dc360030481d15d4c002d3b431acc75bb0450da", -"confirmedHash": "a4fb36819956efa2313e1628bd4cc6c63c93cef3d68eeebe1700000000000000", -"service": "00000000000000000000ffffcfa74079", -"pubKeyOperator": "194c65a0502c0498f7999912565260cbf7efece2e97b49daf8c351fc39f38b3ebc4a835b7761e8d6035cf0596c71f5db", -"votingAddress": "ThcxJo3RhYW2EPdLdL6PDBpTgNS", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "f11de06658f05d7fc6f2a5669c979617a8b485eba0492399e9d4e7c289f48054", -"confirmedHash": "42f78cff3eb87de2b5ca49e394f17fe8ea0a47f4e6a03edc2000000000000000", -"service": "00000000000000000000ffff92b9996f", -"pubKeyOperator": "155fae7865fda947df9153b306f23913ff242b0f067b5a4d6ec37b5ef2ab54061d0661a86be38065e96fbf992ba88916", -"votingAddress": "9WEvZrLngTZA6qkN7AExj3Q5twe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f1237e9189460e45eeec7c06f274c47d30b45151babe8ddde0c3c2eb7459ed74", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96880a10", -"pubKeyOperator": "05d8e31c785f94dd46691bad7a4f67243d154c629492ebdbbd6add75e4a683f09bf59158f4c82081b1803ea67d7739a5", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f12a100b87c576d82e5e442052ecd1d74448e896cdc8feed1503ce198a343818", -"confirmedHash": "ba55cb4616d8414644fa469951f136092282262cf02dc48a2400000000000000", -"service": "00000000000000000000ffffb0098f78", -"pubKeyOperator": "0d51ee16a4cd6a1ef4dd706f2d6e77241e6ce311d287283e023c35de186b5b5b53fc48c80f25bbc8dbc78853acca9783", -"votingAddress": "36VwwxZpJMZaDqHyTWcxcnPNbzP3", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f1331fe6a50d7278b11746027bf08b72abfe6ebfe0365cbc59ecc4d4e8b55715", -"confirmedHash": "20e47a84ef67ffc13cc5c5c7d3c9cc84d46a5274b8bc86ce2300000000000000", -"service": "00000000000000000000ffff52d31907", -"pubKeyOperator": "84a033cdfa229da8970d3abed657321faf0058b3b7c960fe3656b4951fa709ed32a11108fc2a200c0e6338a04a044a3d", -"votingAddress": "4F62cexhucWFpyHwuFeRcy2NVE8Z", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f13ec28a4c50f48f2ed8c56fda1ec4a4ae915e2d682ee15ae52a51152655b439", -"confirmedHash": "b3ee13734164ee6ecc081d91692d2a2dec5d03dd59ff171c1300000000000000", -"service": "00000000000000000000ffff4e1f4071", -"pubKeyOperator": "15cad8b86ce3e416e97c18945ef90202e4fb249c657d1e810d1500791b3660036f2ae9ea6bcbd4fb533bb23bcba09f07", -"votingAddress": "3VW5NFRKxFVFznUev1gxhqD5PT66", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f13efe83ff909f1d5556c3312681828b6ea4cfd6f251ec58ddc91b283022d09d", -"confirmedHash": "0a3424ccd1d4d1beab23b417ae3ceb3bc221f8ec14d216f40800000000000000", -"service": "00000000000000000000ffff59280081", -"pubKeyOperator": "840163bdf18afda0a01927cb38d08003fa1fbe16fdb99245a6c11942f034c2c9297140de86d707f01d09c8f46ddd1572", -"votingAddress": "3WDbQkDaRR7zWyujyUvFi2eyBgGC", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f13fd1e652e51d53e6882e4ee2b1eaceed93b34c5b3ede6c7a5b97b8d3aa0ac9", -"confirmedHash": "085c87a168adef427bad38791dce86b3e81ee4a5bbb1b08e1800000000000000", -"service": "00000000000000000000ffffa7634175", -"pubKeyOperator": "195347d007ccb981ea0b9f941eb5ca7e704670b4cf0eac354b14ce5c6ca52d074433ea96d343790ef9389346805fa13d", -"votingAddress": "2N86NpPFKQU6zq5uyVycATkbBWai", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f16e163408ead7b352244a419f2a0e7e293f4cf6bfbc89b6b9eb9e1f168cf1bc", -"confirmedHash": "af5940bba49a025693d16a108340bf9935e7785c754704611000000000000000", -"service": "00000000000000000000ffff52d31546", -"pubKeyOperator": "143878b64993f280b9d3c96168c32d7aa747a3ed5b042850cd541ef3ac4c58f790182b4bdfef5d79accd5fec2230c8c0", -"votingAddress": "2rTS9WRFpgcFh2F2B88Acrnu7Hpf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f1712bfb50eec7e262f4afbd888ca488337d14aaa58c6817625f98fc3a8b1ad6", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b095", -"pubKeyOperator": "1090d8a95dc2c9ead7660ebdad5337079bf5411a0c12326da00dad4ac4df84205b79ec3e2519108b2f9fd51c43cdedcb", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f18410d8a2a36d411b8a9ef60d26e3ac96fbd5b0353f2342d681f47ae896a907", -"confirmedHash": "c7751d2b69f0a1a69ef1d34eb4f77ccbae7c56503552bf811a00000000000000", -"service": "00000000000000000000ffffd4186c1c", -"pubKeyOperator": "82745da7c370aa420e03f4a3d4e3959e1a42bffef43ae3cc00c6618838d6c6cbd973e4a30ddd7a8b8a0cdfcc41166fbf", -"votingAddress": "3A53DLbK7NnbLB7RuNQE5LfX5Wvh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f196290227c8c15045f388375e308e13eef737628f9bb313f19b0158994ec9d1", -"confirmedHash": "ce9e030a46c9101431a31e578a808dbb7c4db909ba1530431200000000000000", -"service": "00000000000000000000ffffc0f1c034", -"pubKeyOperator": "0e2aad5e7487f1a177bf26a5d823fdb46f2ac2a2e6443e3dcf6caa72930191086342c40dbcc4e1fc859bc07b456b6cd1", -"votingAddress": "2Z2xUHomno5TwtE3xBJWvBbdHGQm", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "f1965e31d1628228c4913dda8ecabdcfc50d0f308a9335f8fa5105f3b56ae965", -"confirmedHash": "a87f1cc3ed708b2e267af3049562c90ee97d6af728f362000b00000000000000", -"service": "00000000000000000000ffffbc28cd0a", -"pubKeyOperator": "0d8839b8d7b4cb1bf79851ea6ac572c1d1b8a6facba5583da1cd57741b1b4528d0da6a7f3abc2d7296458d20b6059893", -"votingAddress": "2Bisg2sxnFoCZkvBreBRPWMhAH9Q", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f19746a32e01e65a5d51b81e6e82de08b76f62d9c85b405f8efcfc94aee083fc", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b072", -"pubKeyOperator": "8e32b8ea553c1d709cae533aded96c9c598460b20ed8c251653160abe5bbec8f3aead4ee710fbd3994e8eb5b8948ed80", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f197df23eefcfe8a7954c4bf2018ef65e447d703f6d60de0ef625a7b3d3dff5f", -"confirmedHash": "2de93631ed66b67a87df8cb83c8ee318f59e3bb2962114350b00000000000000", -"service": "00000000000000000000ffff9e65a81c", -"pubKeyOperator": "0eb61cf4062fd54f9f785c8286a77f849671c1653de2a0bb61f4a877eab3deef188019c7e9e3629eb3a5ceb286583845", -"votingAddress": "3jZgNyDy9p8kZf7YBNKp26GVsshE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f1a83b3327a1e38a6b909c73d194c00b05df30f1e596e416006e122264907757", -"confirmedHash": "0466836740481df381aebafccf63b9738cd756311b9de9b01000000000000000", -"service": "00000000000000000000ffffd41863f8", -"pubKeyOperator": "84702c66861692421f22ffea9b39ce09c9c596136f9e3271e5fb2e236c6466ca0fa1ac9bbf078f4088beb9c198c1a8b7", -"votingAddress": "3CzAwdpvkUejCp5n6KcK32UrGEDk", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f1ae99b96417e7f45ef2f9ff7dbd70970c74eae0bb6a7f7c6d7cb054a7266fd3", -"confirmedHash": "245d2aa1f746068da867c375cda4d963bb09e0fd9621fb752e00000000000000", -"service": "00000000000000000000ffff55d1f132", -"pubKeyOperator": "096a12aa606b61b29b4bbc66ed3f05d5796dc61c5cd0963d9c70fed5d194c7f85cb0df0f06d5fcb629c7c88d951bec7d", -"votingAddress": "4BMigCE45cBViqUwtNt7UCXXFJ9r", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f1c285374b1c9f0f9a914f9277acec3ab65274a047585d1297e7624fed77e035", -"confirmedHash": "f536336aca5420ad5f4c2e4f28732ef763839f8dc3c512a90d00000000000000", -"service": "00000000000000000000ffff054f6df3", -"pubKeyOperator": "8e0d9217090b33752c5bdd2bf616817753deeda438e8dcaf5383f24b8be6fd0e61eae00432dac24f787dc6a8b504b9c2", -"votingAddress": "3PjzgjDjyPdAMmp6TkALKoJQWjzh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f1c577117dd33bee24d58113931257c560c41a23072ccd608e0c44b75a432590", -"confirmedHash": "b5ea2e43d14953f8df398d10630bbd5eaa28c26c3a4d1a141e00000000000000", -"service": "00000000000000000000ffffc287534c", -"pubKeyOperator": "1157d9ee4b37f3576973e6ac237328474b5650a61b4a1d7a4c59ff77c2568906a9dc5592aac64b4f27e719c0efab3ca7", -"votingAddress": "3QjUJJjzsvXmhaiWrg1gJxNQQ66c", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f1cd140ebf37626f57c50cc9c0d5c3619a350af7d4b758f2aac67825aefcfc21", -"confirmedHash": "f53cb68eb93481deb7965a1ddc993e7f33ca76bfc60603e80900000000000000", -"service": "00000000000000000000ffff4f621f2d", -"pubKeyOperator": "0b5fd9e493d7f58c6f670c7f0fa11e2a7c82739ed5b79409d198cee41efb85c57e30dfee1b7c5803d17d810f8111a2b1", -"votingAddress": "2qmVcRQcUV1cUbrk31rbCNus3Pn8", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f1e2bb62ee31cee9b1dd1c497bed14e3fce85063db87b6b596bf84c9a62a82fa", -"confirmedHash": "34893aa3efd639e79544d7e3150976135fbae9078d33c4270e00000000000000", -"service": "00000000000000000000ffffb95cdd3e", -"pubKeyOperator": "8619d08dcf93e3973224ea54ca73ca3143558d8198e6f99407bda828faf006c8032ec89786b3d2c658ae841a02f796fd", -"votingAddress": "3ZFFqzEHWgqzJv112CouZXKi8wCG", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f22300359451df26094691d625f0e087054551d053180d684125e5347678d391", -"confirmedHash": "cd0ae20790fb93fa8d751f6ffdded7b72e11c4ec6c7c451f2600000000000000", -"service": "00000000000000000000ffff52d31946", -"pubKeyOperator": "8f8532a66eccf1575186b8378c2e4bc40f5a4bcf0f41bc625697f0bdd2ef3137883c3250c7b0dc4edcc92d0bdc99de9d", -"votingAddress": "T6ma6PWw1QNZ8PMMcVXEMCNrcAk", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f230056377fbe105e57e9e2f60a1d49b8af7a7d76d0720bd015145c1227f8d08", -"confirmedHash": "d70f5bee9b84a7c75d9578d3e374077a3078f46ec38ee1a60a00000000000000", -"service": "00000000000000000000ffffb009d202", -"pubKeyOperator": "037347bea229a1c2870ac73bd1f4878ccce9ac9507242d6a1ef5ee9d9e9c2f19049bd75a30b3cb8d1a9b904ed76f0bca", -"votingAddress": "46GV89VYCxMvGUqE8cSoBsuJLAHs", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f231843b9619b98037baa25b284c60dbda0a1a898433785227b03d74f36d0e2b", -"confirmedHash": "6a4665ab71fd3be72ef78d374d3bd8d9ec742bfd576438382700000000000000", -"service": "00000000000000000000ffff58630b0e", -"pubKeyOperator": "94c4456a3c5a2c60c97b738802998c25457dbc6a69e14b00923a3cf9a2698b65b905a19e47bef0df3f30f1af92be90d0", -"votingAddress": "wJ5r2nvGBzQz9xnBUmfEwC28qQF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f23b433554ba28ac2532825b376c27172af3cef422acdca8f246baea86f7b976", -"confirmedHash": "e296a3dc9a286780f38c976e6a42e7b9ff044bd7401d2dd23b00000000000000", -"service": "00000000000000000000ffff68eeb0b3", -"pubKeyOperator": "0f95b011360bb2109c7ff95eaec8ac8cf3f703c3cb74d5f28d738ea5e4b417063a252825e0749027ea387be76e880be0", -"votingAddress": "2nNAkpQnBLrSBRxTXHxof5f4q8ab", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f25b8727c5df23e4e3fdc8d734aae2580ff582c14343599d3b45007c677c8fc8", -"confirmedHash": "99839c5cc34c214dcfe6286a7f5ff5191614bd0cdfa248430100000000000000", -"service": "00000000000000000000ffffadd4dd0d", -"pubKeyOperator": "84f742ddd41e354e1b1cd431ea58fbceac7730ddc2e5ec66aafc3735e76d7051c3c1328d6446ca2bfa7cf71c86bee185", -"votingAddress": "295Zir4ycpgm2ugVKqz2H76gnZuo", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f28535fba7637bd4a008195578ae77872d90f80060817f91c53b69691dbfad15", -"confirmedHash": "54676a0c5c89a1959ac67f8d10da4cf38f43b547bdd699472300000000000000", -"service": "00000000000000000000ffff92be1862", -"pubKeyOperator": "0c6d6d9055847419cb118dfcb410602539e4ca252b2bc956244f55116a8a012b62ac9d01bf98febe031907b86b5e1183", -"votingAddress": "27xoLQWc5F8ojMAbhG6zd12kty1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f28d165f4a874583e2990b055f205e6077d8649a25e59f03ce47962612817472", -"confirmedHash": "2fa5c5a63f389f2d98943024cbdeb95212cfc8f09558a1983800000000000000", -"service": "00000000000000000000ffff80c726f6", -"pubKeyOperator": "1651dbc60c9b1a39e45d946624233898d0a458f9f18d322846e522c0066c92b03d7b5c8d73f8e21930e41a4b011e88ac", -"votingAddress": "2GoG16KgZ5LjnF7qVTU2PdKKmc3Q", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f2a43c9feb8f2589b39581daf04f023b2dc8b352a04f142c600cbc84a22ea8d8", -"confirmedHash": "80f6ed208a88c29718f0fc157cce94c95ce6df42291b7b2b1700000000000000", -"service": "00000000000000000000ffffd4186bd5", -"pubKeyOperator": "85aa8746efc8856389631763fc0db0e00a174408986bc156e0cc724a231aba24d3e8136e360137189b55f90f3e0c239a", -"votingAddress": "3RWrSigF5xscF8LFJdKrTThDLsYg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f2aa5086ef4f714dd4e7ad522d26ef2471f85a0ad97c40f8519df90169e0f0f4", -"confirmedHash": "92cedf893f54efbc50bdc2f5e205a3326ab687e27c353c351400000000000000", -"service": "00000000000000000000ffffb07b39d2", -"pubKeyOperator": "162812ec7b931ab980f2b17fe0e686ef6e3e5bfaff9fdb4f62da81879f2235409e25b4b2d2c39146266a8fa189bd1fab", -"votingAddress": "ubvGnqifxR21o2hVYuBQXWx66FR", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f2bef86d3e7d8fa07262472abca75d43847f8d41829c9cfeee3bea1d8560a192", -"confirmedHash": "331e63b0fb154503217cf44a8818762854fd3007e17b07a00600000000000000", -"service": "00000000000000000000ffff3eab9ec5", -"pubKeyOperator": "82ac58f761a67fd0fd0b33ae8dbc3d0213712765299517e4690dc7fd09402059b3e5d8e7abf263ace2f35f7731954c9e", -"votingAddress": "TNR7PB87rLvzgA2Dii7aRz5KmYw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f2c190ea2cbd9e3cef5846dfa5f4070104d9ee877fc5f95d5959f971a7b6cbd9", -"confirmedHash": "73217b876df87745cb28af44351b2121c4ce142ab4d5a4a60b00000000000000", -"service": "00000000000000000000ffff6bbf2f4c", -"pubKeyOperator": "017c7ab255c609cb80029e883775095658cc97919f8cb20666c475154096d0ab68f5029859e10c0722b7b687ecd27273", -"votingAddress": "47DaLSqMVdMoW1wKCcFFCKNq81Zm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f2cfa30ba9e258b8e3d897abe2cf9d80b0e56ea0c8adc0a32ac82f675b06af69", -"confirmedHash": "fe096963ac6afafdecadf238e470fcb612534d52ef43c3671000000000000000", -"service": "00000000000000000000ffffd9a31ed2", -"pubKeyOperator": "01b5a48af111c36bcea7c6a0a6a613837441b8e82d274bc7b5f907670d02ea3da7505c10ff685c601a96989d2cc97bde", -"votingAddress": "2xUK5dp7ukWC5p43HbMyPW8sNhzM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f2d317663b8cb77a562cfe30fa8212d8734c86129ae4fc9d9f9730d5f12579e5", -"confirmedHash": "542a013847f0be52924d4dc57e2678c4415c8bb4a680845e0b00000000000000", -"service": "00000000000000000000ffff8e5d81ab", -"pubKeyOperator": "8563ec9a7e9946e7bef95b70cf9dff3691f8e9431a78988f1125b564c6367e3503abc16ebfebe87e0007ef40a2339b6e", -"votingAddress": "41pXkWppWzPuTbUzEDpJdwcpVqqi", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f2d9c18a4eef97f3bc1c33c1ef329f9297d6269d29ae41702cbcfc7e920eefc7", -"confirmedHash": "b3a3ca58664b71d9f5f0c8e96898b59dd3a603ea69aecaae1700000000000000", -"service": "00000000000000000000ffff8b3b176c", -"pubKeyOperator": "8e5452da011b90ce4fdb98f5e3be7d796028776d242c6ddf45d6ea604796b1bcf4e4499ed39178c27c196e93d3eeed4f", -"votingAddress": "2nbRzKn1nWAVhijqZvmWeejmEYTE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f31637e125f0d503ef924fad6823b886ddbaa3d2e74e6a163fc2b70d48642b0b", -"confirmedHash": "60928db5ba3ff8888739bf8915bdd0dea56a47c80119c9812100000000000000", -"service": "00000000000000000000ffff55d1f10d", -"pubKeyOperator": "941b04a0e8b19e5994b9414917c176d8f4818dc3169d33c6a6ee6adba091aefed7fbba096012206511f7dd8b38b50a92", -"votingAddress": "JzYRFoiBqS4eQHNDnP1ZaL5hJRT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f32dc016fea9e16ed2f5657c528af66d022e867bf7a95a95c6bbd11615d14a0c", -"confirmedHash": "c5ebbd21a6484428cbf8a49151944485387d3619dc2ed34a3400000000000000", -"service": "00000000000000000000ffff52d3194a", -"pubKeyOperator": "82274c5298b39512a355d0debb027ee7487f84c72371b69275f4ec61eb51bf699d18ee0587beeb57e0981642315fd925", -"votingAddress": "4RhbDPEu5jvnQjPC7GamGX74Av4t", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f333e90fbf73dd863d6de5ca4d4d7a3398edb84b2a6e8e0ee0afc9b75f002934", -"confirmedHash": "0db90adc32f76250bd1ebd8500aba1cf40129b387128bad60b00000000000000", -"service": "00000000000000000000ffff335387da", -"pubKeyOperator": "83c3f51da81168d5c7791366a28ec717994cbbf7bb92d1916015999d9b37237305e8c4a2399a53dcba9481fbca9cb0e7", -"votingAddress": "MVLqJqfCmrFF2FmYXZmsZzsKLjm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f337420fb4142b37c75e460508e151842ae9abed98447b19893c8c8e57c61b00", -"confirmedHash": "0019ee768a811a3a10919f8dda3fb5d72c4b53b8896c79cb2100000000000000", -"service": "00000000000000000000ffff80c792f4", -"pubKeyOperator": "99ebf038414d67b3c881593ee4c1a0755fa6cae02a71c96568e9550054d1493ed45e4c1cb12e3213e5c0e0a2abd6df76", -"votingAddress": "2ZrVUB4agp6MfT5KcDqb9JvcHeiL", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f360636dde6cdd371d90cd4385968a3a03582f8f2c4f825271cc3b631219c1ff", -"confirmedHash": "ada66f1d4116adaac681dd6be7a782d0ce392a6376e94ac92400000000000000", -"service": "00000000000000000000ffff68ee9e1f", -"pubKeyOperator": "038414dd91ee6c3036b491d3d84d3aa7f998ac25644715f972e7ab06877670165e6d5d3b013faff354a23ca0d193141b", -"votingAddress": "21vJNQEDZCm6QoZbJswqNdhXXeMC", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f36463740e39dd10b24a2f200ebb57831b5c9dbb814e05bb751dc04effde79a6", -"confirmedHash": "a25fca447f26d77e82b7298ea0a1a22f6b5777d46faad9832400000000000000", -"service": "00000000000000000000ffffa747d1cf", -"pubKeyOperator": "89414e42fec1e274e153c51d1983cbbd4eaf0861b64ef110378331ad43a00889f4633bae28f833cbb1f4bd4234f359df", -"votingAddress": "3EsVZEGHLXZK2ka71jSkH6mb3sJt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f36c62267e3becb85274a29adfec75e0920872455565341678bd23ac9b4b312e", -"confirmedHash": "fdfefef66f65d12465158241281ebbb40c685199b96656e53900000000000000", -"service": "00000000000000000000ffff9fdf5418", -"pubKeyOperator": "1023b2675c9f972861c5ae4caebbb5c7b13e92ce38d08769b3df915b2162f11581913916cef1f282c19e90dffff166cd", -"votingAddress": "3Rhw47hw6DDXhN6eXD9kq5VtfXyY", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "f385b92654787b376cbae633adb3cc8694c195ec9f3b9859a274d6c3aa6ab2d5", -"confirmedHash": "e3f9e323f3407111f4cf5923989966e329d2fe28acc52ab90500000000000000", -"service": "00000000000000000000ffffbc2815f7", -"pubKeyOperator": "923e457cda98d65db8e2088fb7dd57277fe272fd5ee2930586836030f98d762c59861e71c8a6b0a749262d5823471bad", -"votingAddress": "2WYKJSJyJEpTepeU94DrXLHUtw8w", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f3888b9379e57057f65997f81fd90d8a1d5a996cb1c2dc9237b4e942a8e21751", -"confirmedHash": "0feefcb236394c1601bba2ea9d7818f0971fbe8e7d0d56331d00000000000000", -"service": "00000000000000000000ffff2d4d7ff2", -"pubKeyOperator": "16fb877c4362f4b04965e8f6938f561544b3d2798567767fb23f12edf26c25cc94914aa25c9f9a86b6231acc33e06302", -"votingAddress": "28uXF8VYAqzXU65XjwkdtgaZxxeF", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f390d8da830f3a376ca4333e1e8535a565273d53d6260a8fe6e3210985b7930e", -"confirmedHash": "796a84733b0b77de086faaefb69cc41a502251b7775a09981800000000000000", -"service": "00000000000000000000ffffbc28f161", -"pubKeyOperator": "0e18b20f9b0ffb9c485d1fb4dd6de43350bb3c80d708920268220f04aed87fb583ac7c9a9f04756524f3927590d7d804", -"votingAddress": "ppXkUakXrB6wtMh2g7BFLdWxUo8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f39db6659488d079ad1268b9350ab7822d0b837f5d79306fb58ef33c82733611", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6d747", -"pubKeyOperator": "85ad14e96d0397bdfd2d654c4ad56dc39027ee946501d6ff66e4981d75a59d9bed8dc04ab79a320a4ed8c8cf2120e2c2", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f39ed8d291f69e3f9ed5e9920dd09b625847ecc4e2aaa2d90f049d0555b1ea32", -"confirmedHash": "cf0dbf89bad6ee558b5394c36e0183150ceabee9fe40bd950b00000000000000", -"service": "00000000000000000000ffff87b50843", -"pubKeyOperator": "092283db11f10ad072ed256aea0bcab7ea617f7dd8f7758d5ab16e3d09c76c3c3218d274b2c1a8266f3cbc209a32c4cf", -"votingAddress": "3jJvmQcfYwRpxzjZ1kpu7Busqi38", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f3aed142c529898f2f355d1bc2d068a2afd80c5a1b7871c52fb8f12e0e511640", -"confirmedHash": "2a0465522ca98da7b298dd208cd3a7ad16becf7641f9e8c21200000000000000", -"service": "00000000000000000000ffff55d1f144", -"pubKeyOperator": "85e58d8451258559358b93cdbe4f168a02ab2873440d120ecac5ead724f83988515cf534bd28afa7b49506969f6ecfc3", -"votingAddress": "35Wu9Xbss8DybiKSpwNkc6E59nQg", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f3b057185a4ccf321440250c2c30b8550f8034dae0a88b2a9a55a9d3f380f0c9", -"confirmedHash": "1faec17bc0dac1fdc58c8b501dc126354e9d6b2f20c549cf1400000000000000", -"service": "00000000000000000000ffffa8775788", -"pubKeyOperator": "93173196369c204fe1dd28515a92971496141616af4b9c4486fd50cdd2ab4393bd641ba4763614841eaecfce20d45209", -"votingAddress": "2VRgtmn1BFJ1qgRyAqEBVdL4jUJ1", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f3df79d49d3f7d7a457399adf392fb55e13aa32eb795bf58dc929fba3e07cfec", -"confirmedHash": "3aa49f131dd6bc72ee2b92a5b6d81da0fc83a79c0f5830381e00000000000000", -"service": "00000000000000000000ffffbca6603f", -"pubKeyOperator": "1192bf3e4f9cc5fb440694459efcb266a3dbb34945e6baba6b149b0e8149d3704a3076bf2893405267283c18d0a8fe21", -"votingAddress": "4DGtmr5qK6WTLtzDobbFy1L8StJb", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "f3e29d0e37c77dc5e86dd2b0181edf422d3e74adf6b1a3489c2fa8f04d391ce1", -"confirmedHash": "a6e3d8167e2e6fb7ac1b5d70db5e621dfd004ae101116ffd0900000000000000", -"service": "00000000000000000000ffff3449e87c", -"pubKeyOperator": "16853c781a3c83a006730b24614aef7e0bb082506b93794e73ebd4a5de6995167824f63b63c83750d2f61c44eaac6947", -"votingAddress": "pPerX6iA4AwJgbt9nBxPJt7odMY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f3ec8c9cc4ecb1fa3559e21d94eb50f4a0b3a95dcc21a6f6eb0de499e8a6c27e", -"confirmedHash": "dc560d2e0da95659ba2b9b3a66f78af86639f76a6ab4c2bd0800000000000000", -"service": "00000000000000000000ffffbc28af42", -"pubKeyOperator": "8918be5c7c8814a658c44bea6864d19c60b22f58cef6dcbb13ebeff07ae4a0ff8cb7511ca708a855e9e9e5974f704ef8", -"votingAddress": "3NsiLMVSu8VpTRcyNUrZ2NK5rRep", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f41588f6750af838c98c8ad91fc2d058b8e9718a60c123d518541e4f95e5c835", -"confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", -"service": "00000000000000000000ffff87b558cd", -"pubKeyOperator": "143fbf88434d2fca7a1bc83a840de40e35663d32f27438e3314bc057f9fa685fef06c0ce3c233c95898b58bb03cc5957", -"votingAddress": "3WjKdJEWLUo62dXNPu27xLSRazL6", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f418cad19b5f77458c0fc117df6ddc89bf9ff801c6494d11a2c1c5556480a258", -"confirmedHash": "2b21ecff8cd8cabf30a8d419114c22a11a6b3f8b00548f7c0300000000000000", -"service": "00000000000000000000ffff6a3479da", -"pubKeyOperator": "035e208fa98d424dfd8f86b5151a74c57981478341f7e66b69b21416f09e010d3448aecd4a51a2a055cd978383b4e098", -"votingAddress": "2jqHo23EWQZ8kHXKY8aNt2zJw1J3", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f4194dc7db6d6d746bb592a33b3ae58684abf9fbf628e97d9c03fc044b4b30fb", -"confirmedHash": "58e240a154a0ac48dfd26143fb8ac7413aa11d8f10f16e622700000000000000", -"service": "00000000000000000000ffffbc28b48d", -"pubKeyOperator": "854cba983fe6f307b7e0ff3bf53a6af7482c5bf0dc2f0f0ede920c35b70bd08a956718e9affbab2ea4e9afd2ee0e51b0", -"votingAddress": "3b6S1DSRCSRtZ6CkxMvVp58FXDd7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f41e205fe7f16483ddb5496ae422dca13073d9e39b42ae4afcf265b53447836d", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff3425ebd3", -"pubKeyOperator": "83637fdb30967e5a89c02413167235e0062decb01e663218bea1eaf2353c4cfab25476a18c4cd6de218314b1415b44c9", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f4212a1dbac1f4dfba164030eacbd7c2c2b92f0ce34b8b24febff6554a3c40e1", -"confirmedHash": "5b9f81cd364f3aa515893a023e12d7c6572c6f3321addd1d0d00000000000000", -"service": "00000000000000000000ffffa763b952", -"pubKeyOperator": "03080346326dfc221ba7dbf049e706e117e7bf9279e85fb001c92cf4e91a8cd1a5450e087b786c1091d0c3a181d11997", -"votingAddress": "2cvY3hKxARjid2AgnZJvjFw49nds", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f42933c336cc9e5bfba8d3ca4e4c290e7268e26639fdcff5348b180cd75ed888", -"confirmedHash": "ce7814a3312ac5af111025976578301cfa84df4f547255ed0500000000000000", -"service": "00000000000000000000ffffbc28fbd9", -"pubKeyOperator": "0faa336da3734104005858a6c7ff07236089aac8753afa34206ab00a4eb85bf6390e9fc9d8847c2815346a98c4f57369", -"votingAddress": "2tqZCzSZgNV7JyVrfVdwGah6x7wH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f42faca44e9f99063758f324a8438718f7343714da59f721234eb08605fcd907", -"confirmedHash": "e0197dbf426357ef1b224a7696a7cd6e80137d8d9ec61bf91600000000000000", -"service": "00000000000000000000ffffa516edeb", -"pubKeyOperator": "0f2fb231425977234f6c7c726798d41126cfbed2b82c51241a93f85751b40bcdcbc3d001bd5c2afc06ac03cd21637c86", -"votingAddress": "47ow3b6CrS6B3cSYG33cDP6d1VqQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f445b5e0ba1101c0b70b3397fc0913e06e8fc4d45f67a6a4a4372bafcd658f1e", -"confirmedHash": "d522a586924d0dfdcc0fa3fb3ae24f2df3ce9f6c416ae61c0a00000000000000", -"service": "00000000000000000000ffff8ac586a7", -"pubKeyOperator": "854c49d2d5f22a24035f184c72492c92707a6b85cdd2fa9b15ba4977bb936aa29ee3bc5f093ac2ac1cda79be1abc2da7", -"votingAddress": "2XUKxgefPbPS1uYimAw1zxQ2wfaP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f457893c2925f2054e06bdabe136ef99e2c9e780c016abe55316a320bbe0e4a2", -"confirmedHash": "725fb0f087522de6f7f3cdd3e3e728f6852d1c104563e0290300000000000000", -"service": "00000000000000000000ffff8512e553", -"pubKeyOperator": "10493b877ddc57792d8edc30d1a822b2b31077d279f169f51889930ccd44ff75ba75c96a59561f8c81fc3aeba0d3f380", -"votingAddress": "KCm5YPEyGtRFS7WCwLva9PJ6Tcz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f486dd32a6d2042181bf2616bf5d661721aee31dcaf32c69376f4c77a20f9ce1", -"confirmedHash": "fef5135139f41355ae12bd323292e7425873d8eaa8321aa81a00000000000000", -"service": "00000000000000000000ffffb23eb408", -"pubKeyOperator": "8b67f5adea7d9dcfe965d8e3d82409f7f28bf9c1b3c258eceb04a29ccc28660f2c72d0e61e970f3594e4699aa8a3f317", -"votingAddress": "48MDGzRCj4JaBZnFrVoZkf2r4eTV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f48c982069746ebde78199d84b567e780dca5648a44f3485fbfb396bc04542ae", -"confirmedHash": "226cd8f2ddbdcac768bf3ece2d964b6ce5628ed1edb582841400000000000000", -"service": "00000000000000000000ffffb9af9e28", -"pubKeyOperator": "0cca215e582847aee1d20544e6e2bb9eabbca756b04b8a8561af5ca3d33ed3d54642ac778e0e86350fb711f09b0501e7", -"votingAddress": "2CcVhbQ3mgMioFNE7DD4ob6fBRe2", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f491ef2bdb0377703153d5c139580a4eada6e7fb2b79349cd19438535e498775", -"confirmedHash": "04904d1c759366ab6d9c16b4ae02739293741b9461a1eadc0e00000000000000", -"service": "00000000000000000000ffff5fd84fe0", -"pubKeyOperator": "88b137ada027288e75a33ce3309ad5d50267aaa180825f12c87d23d104a54e6570a2972c75d800660d6eb7b55fe29480", -"votingAddress": "4PcU9RDSAmB9xeBCFe1D4zdDnAtX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f4b08fab9136879accc42709d73fef9cf329d9ce0cbc744575f69b0512cbe643", -"confirmedHash": "9e41713f398ab611481e83516be6cdffc09373d980b165da0000000000000000", -"service": "00000000000000000000ffff87b53222", -"pubKeyOperator": "86f9f8c4738f1e83450f785017b983c6036ddcb23d16ba08735c51c531347dc3aa5ee8471ad883d2b1dd0873f6e18a70", -"votingAddress": "vf47b41A68HBeHMyTAbq7E3jgt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f4c608dbb9d3f09826ee9e38fa54c1bc854db0962a11e2e238dbf4eb20d55f6d", -"confirmedHash": "7999c0a5edd8b830062e0a6e1318bfde7f933ae548c1c3011600000000000000", -"service": "00000000000000000000ffff9f59ac5f", -"pubKeyOperator": "1720d8f48359ebc536fcc3be90e1de4f39c1dc111f718dbef77cf60a351978274ed98c8c966dbbf89bb0281528d7946f", -"votingAddress": "nJQdDicnaUDzG4XJ96aZXu7UgMR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f4ca7bc7c9865579789648c6aec9b3900aa67d1140b91e63885de41dfe79af39", -"confirmedHash": "bed37d65375b1fc71d5dbbe0a20a728ca0b30e590bd1cca70f00000000000000", -"service": "00000000000000000000ffff2e04d9e8", -"pubKeyOperator": "082192c1f6ebb688d62d3b512edaa7d7ee8a9e90075d04dda0428b9270a04349492a2ac38d01fcae9a1887cf66b04930", -"votingAddress": "2fxBiksvs4pfkmiorVDzDA369kox", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f4d3bace94ff6e182f5534a2d1124a4b1fa0844928becf71b900cdc89d6aae15", -"confirmedHash": "315e2575be7caaf8f60a671c103f1de1e8a7a9d875f6b4770500000000000000", -"service": "00000000000000000000ffff52d319b2", -"pubKeyOperator": "12aab2ccf75f3e5e0e545f97cb4423d14a2c7dbc5ed52281c63b8ed4e3da3561f0f1ad38b78ed184558303525a19b79e", -"votingAddress": "ymNzjptN5Tqi85cWkJZdtKQZJ5E", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f4e8fd31b13b5079bf9c4faf339ed329842ca6a3a71f1d25af9d1dc7e256feb4", -"confirmedHash": "b9f0abb87d86c484e51d4bf5cad1a09823a4fcab61213b170000000000000000", -"service": "00000000000000000000ffff55d1f1e0", -"pubKeyOperator": "85767af5c1598737292569382eec3374c8701814348ace4e78c53b44077bc5921a3641920c62bc01ef4ed8ae23fbe818", -"votingAddress": "jur23o4VYgBn6afpPfCqpwoc3qW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f5030c3ac89e8c2b141f06eeada349fc61a7e9958e31360df1f7a6dda835eecf", -"confirmedHash": "635eda11ec6eaa35f268baab3264b860f5e863c94bc6fb3c1200000000000000", -"service": "00000000000000000000ffff3359875e", -"pubKeyOperator": "94d1244bd8ebdc0dfc0b618477751b66a18638219cf1178aa4382119cb0cdc9c28049340e642fbfaf2b4cd2ceb418668", -"votingAddress": "3qbhQU9iRADnL7HgXE6hjGdVsG7C", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f5239338bfd82031473bd260de7291c1bda3fc537db5aacc11aca568ecf679b7", -"confirmedHash": "8fed963798c51a4a5ff609784659223652b6c88634a819ec0500000000000000", -"service": "00000000000000000000ffffcebd51b7", -"pubKeyOperator": "9744634deb600c9c0066c329658ca0284e04be92fd1f836b3b0682568b1b711640a6fb5850734c18db3ca579e54a5b82", -"votingAddress": "3Xox136Lt56tdadxR3asWeKE8EsB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f54728cdd98651334769948f848edb7e6422c5a1543c250fcecad9c20c9b3813", -"confirmedHash": "da43ae173edaf99fef186791004da1d26b4f0d169bb15b771300000000000000", -"service": "00000000000000000000ffff55d1f22f", -"pubKeyOperator": "133d06ff13da98fb10bc6bd84958b6858e21449bfc88c30fc69e206708513bd84958191d65b79547d28e704e7c710ac5", -"votingAddress": "3UyyF16zcB7FceUz5pTYyfYwYp55", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f54f6cee7b3105ac7362e564890112646f61b3582d326c797571a504561c6278", -"confirmedHash": "a6afe9eb784fd656fb041cea44ab81f984f3b02724e7dacc1700000000000000", -"service": "00000000000000000000ffff50f01a9d", -"pubKeyOperator": "041e82a4c3541cde0a7ee58cc97f644e2f2806e6443b11b26ab9e5de35e2279e723fc8c4439a93a053cd49ecab43f4a9", -"votingAddress": "Nn5hJqbBkLx7GqbLaT6A6hTbb8a", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f556c2f00e4500ba612361eb74c0c699d838bfefa9e3351964db07c8bcc6bc21", -"confirmedHash": "41b18cc251ff63c4836061cf2362c73a36e3832e9ee33f1d0500000000000000", -"service": "00000000000000000000ffffb951a6ba", -"pubKeyOperator": "9495fdb61a8efb0f52a2f7c0ca0869096244deec58d8c246c3baa31193f52fffe87463f824c51a91c9e4957587c5efd1", -"votingAddress": "qFd4jRr8BTtaCWLwkck6TWEPMZY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f56959a3016e9e67d4099e4b8a3d4ae8ef9a73ecc9703d64ebbd952ad256dcb4", -"confirmedHash": "c9832a841b20c110c4769560bd4662a0a3279ef6365252690a00000000000000", -"service": "00000000000000000000ffffc2875cd9", -"pubKeyOperator": "8efa9a85020ca81d28e070290c059d1dc4883143fccd319263c6285f0b84c234e823a49245c496d9ca45821f3bd3fc66", -"votingAddress": "2r4Hk3q7YfcwQ2jHGhXHxRgV9nLL", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f5815f5993994366f61e69cce059be589352df7a9e067e4cab989e41ae16c260", -"confirmedHash": "55c0ca77c9cdec9f6efad6566e5914f881435ac8152069af0700000000000000", -"service": "00000000000000000000ffff55d1f24d", -"pubKeyOperator": "8d3fdbc68517ecb04f8a056e31a979cf0d0f72904b962ef24a60dc84afef10c03a02404fe16571b2de843dd030e1fc86", -"votingAddress": "aSM3C5zNVMSUy3fpqWXaMPk7c3E", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f58b18ac26fff664748bdf4253608b0c7297546f7435a220311eba089db9de78", -"confirmedHash": "35b5c2c4c8ab898050485f18f9ec2f5eb9d3e8e815c91cd20900000000000000", -"service": "00000000000000000000ffff5fd87e22", -"pubKeyOperator": "96893ff9f7be91a90f8d5f2b87db814fbbca16bafdf0e47eb86637ab87265fbe181ade0dde7c5c9462ec3d248446bcf1", -"votingAddress": "3XMbfmRew13qinK8HAVRfZzPrnGG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f58b69d76b3a338b081e4b90d2dc93091ea905275a86e0f7b38cc12697c773e4", -"confirmedHash": "03315aeb8ba0ed9313558c42d3719ca8f2b904fb710ebd692800000000000000", -"service": "00000000000000000000ffffbc28f16e", -"pubKeyOperator": "978b896ec439635e856aa2ff258af1af52d08c6f3b41db7bc2f097d01624fad691a4f5e5aabf8bd4b8fbda0a3ae42be6", -"votingAddress": "STaS7Fowv1CcgdYUq9tWcsH6Jsh", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "f5abfc8fb41875be4ffd614ec57e61efcdbd879a9442599a26c699ee434132cb", -"confirmedHash": "0bd0b6e25dbb511814084fd886522b81a34fbabd17724f1b0900000000000000", -"service": "00000000000000000000ffff2d4d2a2e", -"pubKeyOperator": "8dfe9e8b0fc154eb50cbe674fa6b6533b4722b2d6653e4664b49165e8fab7d2e50f0161c9ef344f3e0918e28a812225e", -"votingAddress": "2rHm7xCPoou4n3dkE4tRo8JJGn5t", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f5b87a08007d1132f3d40dc4a1c80bc57755e11aedb8a28b6cb351a71d4c13c6", -"confirmedHash": "9aa955fb57ac4b3c694e5525093c3b8295f4af905adb80131e00000000000000", -"service": "00000000000000000000ffffd418699e", -"pubKeyOperator": "17177a81cb7725cc731a2e8293b75d03594f9656f949f5e7efcf4a82051ecb7c6fb732f8f8630c63a3f065c74c44bb15", -"votingAddress": "BdRZgzBemMNqeQ8m47vNcg7YviA", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f5c920a61833f1098cfc503150a6cc043611a446ba07c4d2b5f00d0478b7c326", -"confirmedHash": "2ad54c140e221735fb05c0a71843f49ece6852202c79be5a1f00000000000000", -"service": "00000000000000000000ffffd41862a0", -"pubKeyOperator": "0dd178dc2bcd994f11e29a7d23a7d4e9b6bb852517a316e37a3e5187f8b58784db5c2a68219598054da5c0b3ae8d5337", -"votingAddress": "3mjTgdpnLQaWubNnvbkwCNrLjZpy", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "f5ed786b0dd49cebce1d2577ea36886bda31a1204249e33bc42a575a8bc0e82e", -"confirmedHash": "d62b0cad4466579c6a69de94327aae76a473145a1169e4703200000000000000", -"service": "00000000000000000000ffff2d4c84e3", -"pubKeyOperator": "19989351bc2b76c112f4fda16dc4f7884693df7be88a5ad8d659404ba71fdbbf4f1716e3bf4cdbe8d7a35c1f79f0de3f", -"votingAddress": "21Ntgmwf3VF41vFWJg5TXxkXNwMC", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f5f8436e793dee783991eba61098b9a6e64678df608dbd94b78072bc7e24e6f5", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0a8", -"pubKeyOperator": "18e30d26526a097d7e21c0324f17927b42eb260c4cc04a25f5acbd00f3be4c6f0716ea281dac58274afe266c634cd25a", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f5fde94898dfdb645138deedeee4b03b7cf891df477090f207b42e0efb6d3113", -"confirmedHash": "5c68f7975db4d7563096158223fbe30e048dc59fd41dbae20b00000000000000", -"service": "00000000000000000000ffff8d5f16e6", -"pubKeyOperator": "8b34779044d92d6139fb9fccbe95b39935740bf99b289e69b75ef3ab7d2af7241e42368f445a3c6be0d0a876533b7d52", -"votingAddress": "3kssaeFV7PAriX5qZsLe1XCoNMjT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f60fe539ad99bc80622800bba3ef9f514e830babe5536539d2acefb5f5392924", -"confirmedHash": "87282afc382ec3de9012c908fa235e019fe5cb3359472b7c1000000000000000", -"service": "00000000000000000000ffff50d1e750", -"pubKeyOperator": "034c0aac6724aee5fc45b5d89c1f6e434814f78249374d7f71a7587ad952b830e9aa7f2fc4c26e7a8cf2bc2d06761ecc", -"votingAddress": "2E4LsfkLS9FvSAguhCZq5JB1KebK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f633f45dd9acdac8e65bda50743ca658425d2528fab01c2a3aa41ab82fcceb95", -"confirmedHash": "5c1d42c8c9759162de5546d7dde21ab488a3bdbc3a595b9b1000000000000000", -"service": "00000000000000000000ffffc0f1d9a8", -"pubKeyOperator": "0bd25dffe1dab97be16a88f784e14fabc907194a84e63032d5fbb7959c341cf65da7a0329e54b66d0a6b1bc6fc352805", -"votingAddress": "2Sn56ep336eXakQXbqqK6gBbb3wt", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "f63ce988cb833a899dc061649defa58aea62124b41d54b11a752081deb910e2a", -"confirmedHash": "d45ae45bfcfb0170a2215dbe1113804500767000e77c3f3c1900000000000000", -"service": "00000000000000000000ffff80c71aa8", -"pubKeyOperator": "82c3ba10c6a11e4e22e60cf6310676483b59119327778fea20026336287be76ea95da0512670ecefbb9af71ab73f2398", -"votingAddress": "3dmrBN79veYmfZ4WKLevQFkTDMYi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f63fdf395cd83bdbdca4736063ad3146ec7ff51f8a7c88dbd0757f164fbd722b", -"confirmedHash": "f36c0b10c6ffef57e9a913f8966432d5d836ee748d44ac1b0000000000000000", -"service": "00000000000000000000ffffa8775792", -"pubKeyOperator": "82a99e70152f034b7601b354929065ecdbc259cc9e1873cb90c79d2c75dd84f98bffa4cf7d67c535d7b8785553900536", -"votingAddress": "2zufigPaKj7tewtZ419yu2T29uVG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f6487be5dec544271d36ae9f3d2f585c27010ecc889bfea27f94481d491f7ed0", -"confirmedHash": "93753db7416691038cf0b54cba7b358c1a31d993a50535780f00000000000000", -"service": "00000000000000000000ffff54f2b3cc", -"pubKeyOperator": "09ac57c174a9bfafa23f81d38223b342e51cf6bf59a9145c69b6098665b4c2d105de10ad211003a3114e06684a21a16a", -"votingAddress": "Coip2vKNsa1gJA12Neijfcc2o2g", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f652b375eac6991ba5e03a5d729ae1b7a4ab9382d9025edb4cad6b53fd528859", -"confirmedHash": "cda29b67ce0828b2618f89f898b47f3c596f0c080b42260c1700000000000000", -"service": "00000000000000000000ffffb9453439", -"pubKeyOperator": "14edcf6db72c6cc4a80917aa9ff31a2ab5f28c8a2669d64cf4e5c0b7768512e6314dc3dfed66110c7154e4e09c05a1b9", -"votingAddress": "2BSbNKzkzPCdaFZxXDWbbirm5BfT", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f6545196ad4b59123e3c5e7290e922e383a6dbb0aca3c1ed018e2be05734c5e3", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff81d59a66", -"pubKeyOperator": "8ce4fd7ba94f508b87287fa10cc3a2bb5686c477ebf7fef509cedbd9fea43bcd1d34f27db3f38a20dbc5b9b8a3986a2e", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f665addb9c6411391a9b185f95cf4bb4ab5777ffd59355fb93ab5143847820d7", -"confirmedHash": "43ccd49a66d72a9da3fa559198c5bf7255ee71ca9f24f6862300000000000000", -"service": "00000000000000000000ffff2e04d9ea", -"pubKeyOperator": "9238822cdbe81fd293363a7fe5399cbd0b7ab0147068d01ff5b9e07c0947bbc0b3210109421345d381f9cb906bfe8131", -"votingAddress": "3fzU8EtLLWEdTiUqe4Dib9MN1z5Y", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f68bcced2938564b30421998421c70ec4fc56e1535d131d33b33aa22a7b5ce6c", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff03636397", -"pubKeyOperator": "8c0bfe2caab30a3dd77b7cbe257af4d38bd8aff5f700071d76e94f4e3980a37b21388d11edf2dfa8acaaa41387754a76", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f68e0dd8b1a2479e7176bb57ee77c6265f4210f6fc319dbe3176a0d422f93294", -"confirmedHash": "6df57bae29b97d4a98f911c0e2de1ad861f78ac86c1771a41800000000000000", -"service": "00000000000000000000ffff2d209edd", -"pubKeyOperator": "0dcc4b041abf281886ada11f2c6e14a5834175a8dd0ec6ba56414c872474b296f5317fd0bd2589ebd11deed920e1a1dd", -"votingAddress": "3T1pmwApmwQ7YHYJAJ1C1WfpMVxp", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f68f0e952a6e822787c288f29087e765828e11abeba08658f70324eb5b5634ab", -"confirmedHash": "cb196f61b9cb8bb7a18d6a671b8271ed62270512e7f91c7b2c00000000000000", -"service": "00000000000000000000ffff68cf82ff", -"pubKeyOperator": "06935396bc1e4a84ef5dfc56fc0f27bebb5d784d2b7eabdd6ed1ffa9965221e01f8f25571525fd4f6a8e339819e784df", -"votingAddress": "3Qp1Ks1WYXYgufGgSaZTqxgXBgG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f694afd4b548e554e5e5fecca5a94fb641ebf1f05db67da31b12a7c56b48fb03", -"confirmedHash": "ba0c234451a2deb989d1e27aabb8796e2d9dce7f4d31d9dd1200000000000000", -"service": "00000000000000000000ffff9fcb17e8", -"pubKeyOperator": "174e88cc4eddbaa443d79899745fd170a36ee62e1d5578f2c83b22a3ef0c4c02062f6af7fa87dc81eb7077c01aefa4f7", -"votingAddress": "43YLiQwUaW9uZxvTQb2TxvEEQsJz", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "f6a4b1d979b02549d180957f14184e0aee5bc332b06f65ca83b98cac5a178951", -"confirmedHash": "dd66ee0d17df93afb07f246c44fc92ec13314f5f2a184cf10200000000000000", -"service": "00000000000000000000ffff330ffee0", -"pubKeyOperator": "073c7b9f6d5a5c120e1b4e041fd891ccff9ff48feefedea76b35be6e2c59ed8daaa1eae813af20322f13717f144e5646", -"votingAddress": "3NbnzgmAWUjTuYwKHCYAKjB6BH4L", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "f6a5859f32f237d0f7ccdd3fd72b4450b51825101fe0b4fc94b4b24832d58586", -"confirmedHash": "7cda983d2dd8a2fce5cf6141c48cfe13ed4c9c83d43f2b4e2900000000000000", -"service": "00000000000000000000ffff5fd8ff44", -"pubKeyOperator": "104eed39725245d4cced9a79f28058b99b051568481e55c55b018a089521e3e615d79765de42bc9128ae75e5f58299cc", -"votingAddress": "2adTPyVyrZmXS96pBSZys7C2V3dM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f6b134bcc3d68c64414dae749d75f203233365d66cbd11395631172b858e3d79", -"confirmedHash": "a67e44ae9ade671df28b3f486f240af120caaa065be956780200000000000000", -"service": "00000000000000000000ffff8fc62ba8", -"pubKeyOperator": "8474139725c4627f2f0c47e20af6d8926216a21da0d4d9c7e898665d5e378e86b215284de9c9d25d98845131668c810a", -"votingAddress": "je5q1H6goVUFpi21REyyFu6pe1h", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f6b15a4bfb661400e8944ff85ed2445c1025ecf3ef8a8887b2375c3259d64adc", -"confirmedHash": "c39601ae20ba4e6a597cbc1bddb326acaf7be26af9f3b0381500000000000000", -"service": "00000000000000000000ffffa763b24f", -"pubKeyOperator": "08c52e6246c5a86a28eed5567cc8371da9d990c062015d3754cf2b2eb50f9ad40082b42c177bf5def7c510e879de8c9f", -"votingAddress": "3xe7BskzWRkfFQb5zPX9Y5kxvxix", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f6bb9e3e9cdc73b1c9d5173a174f99ad3efb8deadcb8c0a9866471e55a3dee1d", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff84919f92", -"pubKeyOperator": "8262ebb3ab3feff634bd9e9e4530fdd18b9ec6e9d67133ff0cf2d4c08e6b403631e19b666d8dfcc07d8e71155c704fcd", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f6d7323cb33fc3d5202e78da3a7915f177ba57c322ecfe6ed6d88004f2684ba0", -"confirmedHash": "83e46e5a745b1cba2bffa53f86f255a8536827be9958ec282300000000000000", -"service": "00000000000000000000ffffa4843767", -"pubKeyOperator": "1335202b451a6175d33ec5c647e5c8b820fb89cdd56ab18aeab9061850db7dc398b3d51b135fa2cfdc9e6edc502b0f1c", -"votingAddress": "2eUYVQu1NV5z4kA9NxdWTUbVasLq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f6e088536d238538b99b5b5ce363557393fbd6722af270b55e6098203f64cff0", -"confirmedHash": "73c94dfa220029d34677733240de5f85024897e63d43412f0200000000000000", -"service": "00000000000000000000ffffa51616a7", -"pubKeyOperator": "0ba7c48c6a4b5dcc06f9d965d51c12750575e73b58344e50f8a302abb1d43eb7eb539f85d7b1d25e1640cfd7970a9f83", -"votingAddress": "2XNVekxMNR5UQHCWfRkiR3Kv1wmr", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f6e298b30892db6f75b4de7fb11c2939518b25ac4c2fef70cba689cdd9fb12b5", -"confirmedHash": "3210f32b9081cf46be00594399440fc1d9050d2f6dbdc8eb0800000000000000", -"service": "00000000000000000000ffffbc28b985", -"pubKeyOperator": "8a93b13b4b2ad3c3781f92b08f7652564bf3323c88ddd9390456ceae06f68d1cdb773f2216a2c0a4d0d4784fdf4adcb8", -"votingAddress": "2PfcDh9GBHgZV3hYEPMuosReP6qK", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f6e3af8f5b2829f8490e765a896325ba279fa6d8a27e6dbcd9eee4f5921bff37", -"confirmedHash": "d72f45345dd0473919608f03503693e163e6b2f99d74621e0d00000000000000", -"service": "00000000000000000000ffff55d1f1e9", -"pubKeyOperator": "15e7d26dd073e1ec33c48d13b9b7b937f92c91b7aafa200498bac4e17292b28a219eb52f75b34f2cbb66f0af33fec3d9", -"votingAddress": "2XzHc5BriJkMF8nuya6AZ1gYYSEJ", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f6ee68d60fa691506891371f26a4583cb4bcc7e7b7a66f35c45422adbf9e2227", -"confirmedHash": "69818d0c82980ac690c2d399445c5833a9b617f73ad0a38e0900000000000000", -"service": "00000000000000000000ffffbc2815e1", -"pubKeyOperator": "9602c47d1581e4e45dcd95beee88249dc3f5b19a5df67490043e0161864d22dfd409bf503443b6beb5f893c630450b00", -"votingAddress": "2n1poe6YTTsTQwMftFSFujy483z9", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f6efb0ec5c6423e586042426639bbcc2b15da1832ccbf4f40f8c01cc457c8bf4", -"confirmedHash": "c8de078a0c3365b251d3ae316158cf54798142de866eeb091b00000000000000", -"service": "00000000000000000000ffffbca67e59", -"pubKeyOperator": "8a007d192694253167bb81f6befa7d6497de93865f727724d8de15324b28feb8384d3b382ad67aacea1b0898eec5cfd2", -"votingAddress": "3L1rd17yTntPoH9E7SrBJKSbTfv8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f6f14cec10195fbaa15b8b94021ac102cb2c73deeed3c4d81306c4f8077f2e10", -"confirmedHash": "294459769bd9ed84a87b270a49e1a837a35a3d2a52db01260c00000000000000", -"service": "00000000000000000000ffffb2806778", -"pubKeyOperator": "03f1c15a32c89cbac9277ff9b243e8c6a5b4267181e7e0800776efd8d9993873232eef1587ee8e7702289c99d5a11de8", -"votingAddress": "3ctXpRQgT3SFwauWugHTkEpK9BQ5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f714f3082136a2a3cbe5bd2a8c04f71b400781268169d42692b0a35c16c42f6c", -"confirmedHash": "c01f3ac228dd9e08c529417ec163d7c2ee84bd79258d76140000000000000000", -"service": "00000000000000000000ffffa763b689", -"pubKeyOperator": "033dd38597ca9ab937ae0d838af2ea1e8d07e7ba47ea819580c618b54695194960aafc474de88b31eb903ae2cea28b9c", -"votingAddress": "3VskYSbEhTwo1XpwMqcqQDmqTUqC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f71a13525ee8412b22012da3a224da2981ab592d5d402996ffd18313b527c2e9", -"confirmedHash": "9f4b523a2e605b7a523465957f23e243bf1800c64244b9270d00000000000000", -"service": "00000000000000000000ffff55d1f1d5", -"pubKeyOperator": "02f0f1c753db37d4abcd4aafe89c8da8ca63e4993445735d8fed0d5d6568dc98fe12860a031cbbbb6d022a254d87fe74", -"votingAddress": "DNAoi3p4js3J218mbVbTNqVU65V", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f71e250401702f0bd72cb3dea3e3c8b77acfce917868f27fff7132b7a133d14a", -"confirmedHash": "e4ab7811973cee2ef52719a6f0ec6d76654da3e5f198df140200000000000000", -"service": "00000000000000000000ffffb07b39d8", -"pubKeyOperator": "0fd996fd993eb06737bc7615e259be8af67499bed37b3b7a9c8d375f003201d624169aac89e5b4dfc43e370df0f2c898", -"votingAddress": "3uLFkdqGuYfZ7YxRn5H2ip3BNnFG", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f73753d4fa35362e32b183f25e93e38e4bc154ec314e28622cde46f0e02ff059", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b062", -"pubKeyOperator": "08fd72a2e32e7096be21ab42307d1086554f44b5fd1bbe04493d31db12691b740e2559359773f0198aba3b62d259a69a", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f73b9cbaa8225653527818b6371bb814b287a35cc0017a41b9f063c8e7953076", -"confirmedHash": "98c26ecfa52810f984aef045e1e4fe365542ffd1b562c1100100000000000000", -"service": "00000000000000000000ffff87b50fe1", -"pubKeyOperator": "0ba1dcd7ff176358a27d73f3b431c40513121855c952bf7e9f6ddfbe37ad55fbfbc3caccc28366b35adfe5501f2caad7", -"votingAddress": "4PmwNFF2n4DfZeuzqh4jzy776kox", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f75a04ba63b6aad7839346f2db0fa4a2259f1bba58b2b5e062822b561535da75", -"confirmedHash": "6a8703a7407c29d75e2157311a1edb171da1e7e07e47cf002400000000000000", -"service": "00000000000000000000ffff9df52d9c", -"pubKeyOperator": "92bcf26bde60eb54669ae77da34f1d29e1676d6899833a17adef30f5c892c98c27f0c981c734c10f3553ff2a82505c87", -"votingAddress": "vMhY5CnJ15a4i5CE9JxAJquN5Fj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f771b896eabaf2e29b04237b1874401d604d141e548c5e530d04ef561a559222", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b077", -"pubKeyOperator": "821157f2021495b66afb9dc1da2e10da30e779a72c854c89fd04652e86d65879ca88ba0332dede0af819a976de367ff7", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f7897905a35ca91e9529112b0bc6f7b2b3fe4692aa265b04e90f4122b2d27ce5", -"confirmedHash": "43c48cefe6b33ead2d1759380e97041bb4ec50a24bd389873300000000000000", -"service": "00000000000000000000ffff92b99ebc", -"pubKeyOperator": "141d89e211c93bee9f4cb26e4bd1fa530798dc1cc27e545c0e096aec9d913ba2cae572b339aaab612a0bb2f60dd71ceb", -"votingAddress": "mrBub5N7NLqW5DH67Ts1gvmZDYR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f78ba46c2b00fbd7a36bc8df566300ea14e85867957bc7bdf8dc4251a675e706", -"confirmedHash": "926bafd5d8b19230ed4284d06829edf1b46dee2530f001821700000000000000", -"service": "00000000000000000000ffff68ee9fc9", -"pubKeyOperator": "12763adc88c89313e6a8fe3f95e5583302dd74bf3ad4186d519b587b2a474e50469e7cd089506558925ea459aa404934", -"votingAddress": "Fi6RwgvP6fQy9fNF54GXD2suo9m", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f78bcfb4e392de7a3c46d12da3f0f295e0b531bd99e7a5bf8755bdede5324073", -"confirmedHash": "75d5fa513ec1fc7047768e44e059092a272f174c2791e7ce0a00000000000000", -"service": "00000000000000000000ffff2e04a265", -"pubKeyOperator": "111fba24f26ac04a564e099263c1d63fb0b189e4dd98684507631ffdd1789b62e95397688c9dbc954696ea2c37b6a577", -"votingAddress": "21uM51PbmLhZinrHt2UgQqmqr1C", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f7b9291d64b9bd92d60872f786655997eef0bf3b7bd937485e368c355be0ffb2", -"confirmedHash": "fb61e417360af76322ac0c6213c210b145b2616a68ba6ecc0a00000000000000", -"service": "00000000000000000000ffffbc28b982", -"pubKeyOperator": "016b46776eb3719de5c4a00bf30b0933db62ac6a65f9364a6857ac35adf9570a50ebc72ae462e59ed1cb7ed58bb0ff81", -"votingAddress": "3t2PcqzUdzX99Y9A11GYWTvRTQM6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f7e4352557dd7c0239dcf23ce76f9bb4a7b5ee9cbf0e6ee2fe8d5b2514ff2f2f", -"confirmedHash": "6a4665ab71fd3be72ef78d374d3bd8d9ec742bfd576438382700000000000000", -"service": "00000000000000000000ffffbc28fbd0", -"pubKeyOperator": "8642a83ed1024f881df4abe2a684ef3518e928eb2b9225dec76a860518aebde6e3cf6d2920253c88fcf53e1345cc2b1e", -"votingAddress": "3bU42ejFJm9iLkfwRwLxq1cHLuRq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f7ec7fd9b4059509766f51b486aef19ce68bc8b27294f6ff2bc1dcd199892355", -"confirmedHash": "4be05397bd28badf1860e31f7b82f4910f3f8c737c1bf7e50e00000000000000", -"service": "00000000000000000000ffff5102f076", -"pubKeyOperator": "81889e861eebc69cfb407b552574e6bd9e6fc1eb881ede67df20d93ea2450395ad662f390123a2061444f7e5dfbf3d70", -"votingAddress": "2xMU96aUZx2sL5yWQMvx92BcqBVA", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "f7eee371ca93216d2985d75df9d3a9fa33dbf56b0b2850192b85f90903ba6ddf", -"confirmedHash": "8ef9c6166c5acd39f94a0527a0cc4887ceeb0040e96616710200000000000000", -"service": "00000000000000000000ffff55d1f1d9", -"pubKeyOperator": "9099634c1e85c8ce991557ae51f0ed95b3bd2d650474658b19ec2ce76fb4b5507b7f4af54b0a4be50ea9a67026e104f5", -"votingAddress": "331udvK9rwKqdVoRdg6s6rgcczDt", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f7f9e18f8b1986c6cc490b4af46bf2cd1a3910b4fb41f7a6220f4bd9f7ddd912", -"confirmedHash": "ccb32fe12d2095e2c4f4d50ce2e41aff20012ddf36d34e940200000000000000", -"service": "00000000000000000000ffff2f7628ce", -"pubKeyOperator": "940b3a2a7b9652e848e82978f319b209f58f79f93f8e03f686386ce85517bb8d47e6ee7e8572983657c2e8d6147cd657", -"votingAddress": "4GqA7jAZstxyhBRvuLvbaqeLqj5E", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "f80b6d244b4e6cec6ee583d7d23b411738b922f198a1b4fca2012b7bfb84185c", -"confirmedHash": "1ee87da7347ff803f27e49aeb179234aac7113d8463cedd03200000000000000", -"service": "00000000000000000000ffff55d1f13b", -"pubKeyOperator": "014c7a2be61cd173fed07b97a75835580cf6f90ac27caa334ab8719ac7a87fd0e0aee6b2a8491a880e68a9c1c562fc20", -"votingAddress": "3Hs74KiFboGdH9g83Srmdr4RSFFj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f81e2654dfa2d8f73c8d57b03bbd146aad7c0ff283092a14fb95b4b623421a1c", -"confirmedHash": "617a93d3408d0f74d9b4712474856a33c05eacedf7ddbfad0b00000000000000", -"service": "00000000000000000000ffff8bb4d40d", -"pubKeyOperator": "903e07afacbd2b00a57b00efce27dddc0d3792a315c4ec19f330e02c7b960ddfdc696d39ca522d52b7af7b9f031dac88", -"votingAddress": "3hDnRQNBUo9uMDmzEtN77mfbRWLi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f847a8ae9a77464f0d019b46d25a84a48c0c3af001606222b33892c6400ea880", -"confirmedHash": "154f3fad77ca27289e27591c007f1ce0aaec09c566f458242300000000000000", -"service": "00000000000000000000ffffb90536a6", -"pubKeyOperator": "0299e8c2d20fd211b62458335591986797b3b1a6422d86feab5ddc05eac0da86a312edc4b53287e86f3f320cf96188cb", -"votingAddress": "4KbW4qA8S1wCMov5T5QMVdngRc3o", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f856bb047fc076d55a535f7352fe64071eaff7b57408d57bdea3fa24d2d26704", -"confirmedHash": "a1b24fe0539c59b6da78060e02681ef88352a291d5219e291800000000000000", -"service": "00000000000000000000ffffb28050f1", -"pubKeyOperator": "1991f093a3057f008924813c1e1823e5c8631c9f8823594be545bb65b9cb58321fa65990170f32b22c7ebb0e1f95d3e6", -"votingAddress": "ndjxmjGmSEQiYSmqH6tEwN1AABZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f86b0488ff22062adc188f39f2a7400ac7272e9233e9b78be66eb4634193e0d8", -"confirmedHash": "a0e8b21324b5facb852a48afe634c20c68a170add6c7c3fb1200000000000000", -"service": "00000000000000000000ffff52d3152a", -"pubKeyOperator": "8b1e8daee774fb2fd5d5fcb2166602847f2af32e28ee4351617037ac213d00ef11a15fe758dd8160559f9522233fecb8", -"votingAddress": "UHYWiHh4cCKqWhQW7zNVWjJzsXC", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f87292bdadb35c58277d69e3f62f839267bc86173c2a59f2dcda402420be8c7d", -"confirmedHash": "32bbf722f0c3917741a832e06aaed787792adb37c96f3e750600000000000000", -"service": "00000000000000000000ffff8c52339a", -"pubKeyOperator": "93cd3d69ed93f52a02053a827e694798738d94560c62988c6ce5a66d631c3ce0e18178172dfb244630c31ce6f810c5f4", -"votingAddress": "3J11xnpXVd5SGHkD86vF7kemwN62", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f87d004afc3f3645ce9feed7421bb6a54a3c1ba24f7c71ef8f0ac5175da0d37e", -"confirmedHash": "f963dab0511dac061dede98786bc38bbc2eb75620e4e22670100000000000000", -"service": "00000000000000000000ffff5fb3a4ea", -"pubKeyOperator": "0274f1eba753b1c32773fc56e626658c3ad0565ab4a35ca667cb9a455b7d758225e21baac003fec28cf75ecb56738d60", -"votingAddress": "hTFBRi5Y2SQpV9YH4oMZ26S1mnL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f8a64d8d318d1bb929a134addd79fdab010b61c80f3eccb7b245a8cfe8a94fb2", -"confirmedHash": "80c370ebe620184268960cb65a50136875957b202a66314c2300000000000000", -"service": "00000000000000000000ffff5eb0eec9", -"pubKeyOperator": "040ba3cb165c2444aad28904f3f1416798fa814c0c2a06764ebd5e0d0baa123e7725887be2d8af99fded5791470c77b6", -"votingAddress": "4XH9Ygcb14tiKLx3yyqESSieC73a", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f8a6a7c7f3e4214c1a37c389fabb1a337a92008200344b67c4d29f7fbe9c5b03", -"confirmedHash": "476abe365e99d73a35b2175aa1de6fb57e3c4876a516c9640c00000000000000", -"service": "00000000000000000000ffff2d479e36", -"pubKeyOperator": "88258d708024ef91d4f8e43a9f1a43c46efa5e49834eec4ed43f041c7bbcb3c1467c4398cb58ed4801a166b98f10c8c2", -"votingAddress": "BToYz19Ze5qxnLeecSxAEYLUubQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f8b5c45908641dc4aedc66e9258750de6784d69786675f7ee904d21dc2a541b2", -"confirmedHash": "64b416cd9399bc1885fe1b660d1c1d6a383970a6c5a45ad50100000000000000", -"service": "00000000000000000000ffffb07b39c7", -"pubKeyOperator": "0c6bcdd6c407cbb2d68b907d0b144fb0c6488df46c146d47be1f67f3f8e4fb70d2b099950a93cd2fd027afef69bc41fe", -"votingAddress": "9NHFtakW3JBCCTHRUFpN41ntqVi", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f8bdab38e258f30533b3e7ea5a0f1dfa597938e89ddd6b25c2abc8c21de9c5e3", -"confirmedHash": "675f179e40f20ce1668b53a9c802e691276b6969372fc50c2900000000000000", -"service": "00000000000000000000ffffa7580f61", -"pubKeyOperator": "821b3d3efbbdca25dd80aa992d765881edf9a3e3f151b8edd483c2cd87683bd8eabc35b9aec11df821fe5e9751c5be8e", -"votingAddress": "25AouhFBszj8fmirftgE6hY2GUgi", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f8c5d9f51954fe9a8c64028c41cb25cab9e6db1029579a88d540c23b455bbe5f", -"confirmedHash": "802b4d0c28a6dfdef309f4c6f95cc25553875b4677c14be40d00000000000000", -"service": "00000000000000000000ffff9fcb085f", -"pubKeyOperator": "195f739639909ab3442965065f1a1fe189f3fe9f10d50408a2785e356ab7b2f6120600cc6ed3179f7f5d27b1703461c2", -"votingAddress": "3fnSRvBBPWXkNShPWNd1CQveK3Tc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f8d23e55fc63e251fb25682c29e0a4864d99233390768f70f2fdc320ae727ef8", -"confirmedHash": "82ca96e5f6088c66caafa258bf4f11ec1220ee6be5088ea81600000000000000", -"service": "00000000000000000000ffffb280ca62", -"pubKeyOperator": "17370dd45ca5cba60cdfde187fb4ce37dd19c5acb9d2d7cfb9fe9997476eb503a10165f6fa8f72d866f4a0a1102d5658", -"votingAddress": "cnPv5Y4mA3BK4GL5jk5V4ZgynRS", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f8e015aa449e93b44e9cfdca9108d61099a5c644ebc9814907343743d41db6bf", -"confirmedHash": "5f4df001517869f07b1e81d8b179499d85c6e62ba7f2d6fa1d00000000000000", -"service": "00000000000000000000ffff68f89fa9", -"pubKeyOperator": "83ce55d1170f9ecaaa7a7a4bc5aa676c2b3fffeafbc814f927a2ed3c98e1362f0e9bcfee591415638c386c0278fc94aa", -"votingAddress": "45hhNU3AykEKaq51Pg4YUHaFhvaZ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f8e30680ea028c80af8a1faababa25bb3b71bd89cac9f2a4c6b32b6302876aae", -"confirmedHash": "7fea303b0adef49ed5e5faacf0b804110bc7e12ffef677d92100000000000000", -"service": "00000000000000000000ffff8c52218d", -"pubKeyOperator": "93d3ad755e1e56d8168f988ba61e2d034a8b746685a9286e1e2b6ccf5124c6c3812a98d06b49f1835f41a2a35018861f", -"votingAddress": "3tv4NNPMn3t4FXH9SUNLpgLcaVTY", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f8ef4df2dcbc5c07f62e6b49e51763620843050f0900202b24ce3b907ae7df23", -"confirmedHash": "90791bf5da5aaa3c368f7d87c409003934b5eeb7e9bd32c61b00000000000000", -"service": "00000000000000000000ffff8b63ad42", -"pubKeyOperator": "98586f525158f4b4b79e532fe163187fb3fbe1f69d3e8ee1905e370b02e23fbd8ac31ab83f15bd6d6094221b1cd2a981", -"votingAddress": "Kdm3ymuD3WmnwmiwFAJ1p9QtTQe", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f8f8246349c1a16e0f248e754c5f7b7a55bb410f2800104e5b1ea86c732a190d", -"confirmedHash": "4dc6aabac12b80ee6ada50d539e84eee392ba6b46b4e46ee1400000000000000", -"service": "00000000000000000000ffff9f591ccb", -"pubKeyOperator": "8426736e5bd2a26634790bba15415d880163b9c28b7cf4473f204d108d350525cb8ff0c99f2fc074e16c6ffd2299b809", -"votingAddress": "2tB5yrbDkHqohajo9JYLcDm6NUjv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f900f6640acf541c89b0b8aab53e1c6f2732875feac2a077fd135487b863bf55", -"confirmedHash": "39feeb69183b3cbab2027ff629e2e4a3efe0efd86ae641ae0100000000000000", -"service": "00000000000000000000ffffb23efdaa", -"pubKeyOperator": "0aac9604129f4ff36cb8c224c30b9dfbb3f6f7225599922a2ac2b6163e09f51fded7e7a6ac6c5edc458d92e75d788bbe", -"votingAddress": "QbzwzfSh6b2H3PwmJgzDTV4kRCE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f920abbae3c5a49142b38d4957abf7ad2b82f822503b949e009cbb7e69880001", -"confirmedHash": "10825a0263176fa838aa56de0d873ea86afcb7fd26e93ad65100000000000000", -"service": "00000000000000000000ffff344927d5", -"pubKeyOperator": "8ad212f8f0565568b8eeacd6803247bef2140ba2c69f29de623081b622071f39cdca98998a2a45da07c48a46cffd8165", -"votingAddress": "Dmh1FyNLQgkbxBTFe2D33rusdqi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f92abdebb64260cd25451330458ede213e992df270578e23666c2a64e1deb926", -"confirmedHash": "b7b523dcba73f97770dbfbac45e6e55b9120ef7a5d52a82a1900000000000000", -"service": "00000000000000000000ffff17e4e84f", -"pubKeyOperator": "8d6f7f97193db95fb1b6f7bc3f4a142ea8ba4802bd4028dd45254467f38ab6bfbf31881cf0651420401311530035cf29", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f93a236d2b4ccdf8ac949050d950a0e356196610ce3d9101e51b8f79a0a4c083", -"confirmedHash": "aa67a8913594b0e76937e55a14cea827dbba76943a76d9961200000000000000", -"service": "00000000000000000000ffff40e37853", -"pubKeyOperator": "13a3aa65a213d6ad160a75308dbc6d38a0f060b2478bf4486f5a15ba03541ace45141cc32b29faad01330bb0e8232f57", -"votingAddress": "34TUsEsApC7gWvzCdCNctei4pZcV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f957d656f304096dbc1ea268bb7eeb384ffc4464eb319ef3cb61e87528bfdc54", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96880c90", -"pubKeyOperator": "113adc6293c3e03ed587de7811a6d1af5fb4e28336924b6efd95eb1d0b78b3333501de67393fc26dbdc666df81b24464", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f95d78126785e8830e33ddc43b158360bddbc8f2f7c0352690ad9a3c225a683e", -"confirmedHash": "c8fac7c25511b02ef6f8cb743098492c6b65d12e7f8611830800000000000000", -"service": "00000000000000000000ffff55d1f17e", -"pubKeyOperator": "0209765ae19213f5dea2c20c760a3948b51d8d8d4e78ce7c6b15f014d8546501f972986bb93d4f4cbd78b299749d1221", -"votingAddress": "3AtcoofgfDdHdpCXuxgfUVdR98uD", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f968bd17763a9a760649ecea0f9c8d82de160494532a22da44109bb32f7ead0e", -"confirmedHash": "904ee3899f9fd0384cff01092dca7d2462a34b2860e1eca10500000000000000", -"service": "00000000000000000000ffffd4186ea7", -"pubKeyOperator": "981747f805b2031d6ca96a9f56f61f7c368a5b207367db0f2c4e809db45b05172386e7bd1264dc25f2e11affc8838e07", -"votingAddress": "2kbtm75VCE4BYXFtmEzUFFPtRvTp", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f96a55dfe67b678369726916ad11770cac644a912f6a35b45e04b4783dd44065", -"confirmedHash": "a709770b238c4ed9def6059562a4c5612f98d7d3912962f80c00000000000000", -"service": "00000000000000000000ffff2ce74f92", -"pubKeyOperator": "809ba9d7c91eda6747dbc893d0b4e8e8e9a15e51c48d769cdf71115ede41c45cf64298096ca9ab11848213ce26ab32ed", -"votingAddress": "YjQtqNsJJ3fhbY73aoYnsP24tBP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f96d666c518fc94056bc247dd2dcf47f19283c4f815ab253554e3480d22d5241", -"confirmedHash": "1672226fc7a88ecd70f5573858d81f2a20d7f4d4c1f9538b1200000000000000", -"service": "00000000000000000000ffffc28754f6", -"pubKeyOperator": "08d902f9a1ee366fa10d260544ea7f73f5ffe1346de55d4bee9b9cf8c625ff42e23b4856333a145a5ac728535e8f43d7", -"votingAddress": "pn7zGnnF5Gezb7Sv98D2wAdm34Z", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f97f567618379340dcf6a2fc662570a5d7f781ad198236930ff401e6e11e462d", -"confirmedHash": "1ad56fb945ed05f99bf30c03f70b6d8ff9002f8c40533b7e2100000000000000", -"service": "00000000000000000000ffff9fdf1991", -"pubKeyOperator": "928b150960cb3dcf82caad93511aaa7f7df2e7f6395acaeb56ce1fbf1fb48ba6b699454333e31d6f66dc25b11d5126f4", -"votingAddress": "52RmHticjUyyb1uJU29QXYEvdct", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f985f535f0674327d7565e7e3c8e7fcddaad33b20eed05e53c45c9422f325a17", -"confirmedHash": "082ad0c1623b5b4f767158ef626336363e711175b7a491f30c00000000000000", -"service": "00000000000000000000ffff55d1f1f7", -"pubKeyOperator": "02027a0e9e4c9fbab54a3b93350551d99fae077bcad84a579bfba6c59e1235fe1793c577ba87027312e8d7a2e1ad7ee4", -"votingAddress": "eKajJYhgvmD1NkRHRhAaDAqxZMB", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f9996287cc1b8081d27aec6a89bf59d7ee1a0ffeca0537ea1f77b508dac88d8f", -"confirmedHash": "a040f70d86919cf216e6f353b3534e7122524e5ed0f38b412800000000000000", -"service": "00000000000000000000ffffb95cdcb2", -"pubKeyOperator": "952312664fe7cce377da1ff950b3b5d1b93bc0660f65aac43e96b46fb39dc449abf9cf882d3597a1c7b8cd5a126943d2", -"votingAddress": "ByMwyZumm9Uo8ohL4MUfaifmmiw", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f999c81f5138caaec23b2aac2a6d3a2237635e531a4c3fe2e2034fc5f8f57f85", -"confirmedHash": "4139f3754fe9986d93d164f0b368eb7411331fd0e0a8d1931500000000000000", -"service": "00000000000000000000ffff2e1ebdd6", -"pubKeyOperator": "0689d6578dd9cd5b7ff0fbb80705bbe797c151d618ec22a6d98b8667fc33560957ac508d5f057d019423c29d98f97efb", -"votingAddress": "cPPfjY8H1aFfxNuT44uWh3p711o", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f9a42253c94533b3e87d4447365ecbbc8c0b851e55320623090ed7594c588e8d", -"confirmedHash": "2b587de4bd665def12b221d38c4dc24f84f6b66d967c199e4500000000000000", -"service": "00000000000000000000ffff55d1f19d", -"pubKeyOperator": "90ab6d18389446ea0bc9eb5b87f00b92467080d8a3114bca66ea19a3937354593b12ee46497d83a331b53db93a7fedf3", -"votingAddress": "MPtfYgmFYwV3xg4m4aDJJX3pzoH", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f9a68d76e0c151a8c347705e2c7f2f6e12ea6d85cb7b4fdc8c86fc06a92e18e4", -"confirmedHash": "710559b6a9e0f5222af0758ff0b58cba3d33fff34dc293001e00000000000000", -"service": "00000000000000000000ffff55d1f1a9", -"pubKeyOperator": "96afe5414b242b18048bbb8d8283cf88b2a6ec6c2051866e43d5323688ef484e3eca29683c68f160d17926d848e6b1db", -"votingAddress": "2UQPX48zvJo5vaAq9oVPP8emSDHV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f9a6dd880b8bf656ab1ff3b6685d2e99cae06220f5793814a4edbb71376bc5c3", -"confirmedHash": "11c85c1491e89c8d58e70fb0a8f5a1c0de6d2f4666e2afe61600000000000000", -"service": "00000000000000000000ffffbc28f160", -"pubKeyOperator": "84aa522dccd59aba1287a69c7f2e347cfd0f68bc84753c7f5d5df6f933392d96e6e3f5c595237c4465f7d55f605b8118", -"votingAddress": "2ewtRX4zgWaRKHYmnn5k9cEgAunL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f9ac1d693f3801b6b9a7f69e7e15606e0fe87d6bdeada37ea1290f9cedc1b93e", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b06d", -"pubKeyOperator": "10f24ebf183e159bb80dbd66b54ba52933212eb70124def47ee601b2edb974fa24ece5d802d430efb662207f53e7d82d", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f9b7ec4cf383efdd2b3155e1cb3effc197d788fa44612335cafdbaed2dc7b502", -"confirmedHash": "20402a552c4b91fe7280c71403bc96820f8aff8709f8d5a60e00000000000000", -"service": "00000000000000000000ffff5f550dcc", -"pubKeyOperator": "8056aaed739fa3d97507cd02c46fa60dbe8df1450834dea5cd5ee8c910ce1f20f79f61792a3034b1507de2800edc8a95", -"votingAddress": "ADUZU1ru2T7bKrd9Dz8MEpx7dwm", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f9bac52fb65d94793d0a852be073407bea1ec2171b53a834fd144d9f2565f9d1", -"confirmedHash": "36e255211b1e72382e078b646118ddbf5ac4a0e35323fabe2f00000000000000", -"service": "00000000000000000000ffff9fcb21fe", -"pubKeyOperator": "131bf345f5b24b2a9894775cf4d9c636235d83178c7a4e747de30b31005fe240104a0ff953a4ab62fac1b87495146890", -"votingAddress": "3NgmUTiTh2XbjtR256v21NMGMmJi", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f9c204569ff72e80718cbb43edb3915b8142e72300c0ea7af0db30b574404693", -"confirmedHash": "93e838c746ace260dbdfb95bb17aaee5ab516a923b7a7ef11600000000000000", -"service": "00000000000000000000ffff52d31544", -"pubKeyOperator": "0c2817934ed1f6b00c7eeb4cd58603d7745e7f5d4d53a2116b424ac839b48a8ba4633b75729fbb8c1e200faed41c27b1", -"votingAddress": "34NfV23r3f5xfWWzAHhxyKiKAkqN", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f9d2e83f6bfdd9931dade361a1c97e7c34e0818ef86b7ba34a995c7972910d77", -"confirmedHash": "9efbc2aa809cf12e20e81b6d2f9f486fed62c0bc92e2b0633500000000000000", -"service": "00000000000000000000ffffbca660db", -"pubKeyOperator": "1002cf69f3525acf19e77f766ed5038dec74fe86851729fdf398b4a95b14b5d1df03e16c09520f9da5f4b846afe1b38d", -"votingAddress": "4ZFVBMJmVxaj1h1DMYH6YQoWirpd", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "f9d7abe44c0e27b614dbb78a5dbbaf6e770fda427c5979680003aa0dbe73f7fb", -"confirmedHash": "6041e97da41fbade6a71aeb65f5dd9392a6c972ab0e0f4a21700000000000000", -"service": "00000000000000000000ffff58630b09", -"pubKeyOperator": "8d770d2a5bee896d43cd58e04092ef951875c3ce27aa766cfa0ef3fd66c648131762ad676320af0455d9bd4d63643123", -"votingAddress": "2EcoCKf3j581iBbk2LjToazosq5q", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f9e26fe7eb5ca7f9ea8a904e7339ec4cc46d3ae78706a234af10717ef27108d5", -"confirmedHash": "496354ed47b8f8233302cb68da28c574993c103f0e5669d71a00000000000000", -"service": "00000000000000000000ffffc7f704fb", -"pubKeyOperator": "846f6438be8b64563d8b87ce73497143c10b1c6e248296b408d2c54f1e1a9085ae7181b7f659e19498b96b15059b52d8", -"votingAddress": "iv7urC1w98bviKvinnax8Wt8RUv", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "f9f1943aa8a075bab06794138341c670fc3824b2859631fba79b5d748d0faad1", -"confirmedHash": "fd93a79e5d8810ab428eb7c62bd1db2045ec5c569c6f2e0b0f00000000000000", -"service": "00000000000000000000ffffbc28f177", -"pubKeyOperator": "972d111d87b5d8944e0afb393eacc0a48ec72d06fa542c8bff2de6160675c06e6c2341a201009bb0ae4496b28bd2dcc1", -"votingAddress": "3DL38kY568VNnAVbh394sN4NjvQ3", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fa1664948fa1d0fee23633dcaa0bdf97203223745ba3364b16093c827558a4d7", -"confirmedHash": "7ee01063fca25b0eb55e3da95a43450dd828687e080c4baa1500000000000000", -"service": "00000000000000000000ffffbc28f176", -"pubKeyOperator": "12129b24f6b0d22e810f80dd34005ba7abe1fcfbccda733f34dec1072c5abb3b0623096100491e01bbe3937ce91fd16f", -"votingAddress": "2nALqXDroECe2gbd5cu8LTv44YND", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fa2c039e379e2deb83b774d46d2da85b908d1f23a4ed8f9884b85cd7bcb424a5", -"confirmedHash": "c3df4caef07cbb037ae647ab9b2e7512740198342e933af00800000000000000", -"service": "00000000000000000000ffff9a103f70", -"pubKeyOperator": "11a087c5a1f58d3b8a44fe9c0356d079653fc7fbd27665582810cb3d775bb86f74d08075749090cc7a2916bfc7babfbc", -"votingAddress": "3QnXmdPWY2nang3ndPJeViZUSgdf", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fa3b3fc7f63a17e30fc21006b5653798f42f3afe1a206a2901cf11d93dd527c2", -"confirmedHash": "332e67efb372e7a0d99ea84342931c84a44e5829706a4cf60a00000000000000", -"service": "00000000000000000000ffff05873348", -"pubKeyOperator": "1072b0e75f13644d58714e04a7485620ea7855eef14a49901a7e0c90c47793b671ead02dfa11b3b6c06c3ac0cc9b2a99", -"votingAddress": "3QkBu7k3sUGRMk4zUdyoZ9f43QJh", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fa4f341855c666fb4334da0c55a53a2655ace8b0e9cc5b1648b5cab15ff7bd53", -"confirmedHash": "b570dc971ffb9171a73b9890ca9a7661b2dba7fd1be072a62f00000000000000", -"service": "00000000000000000000ffffbc28cd0b", -"pubKeyOperator": "9637e816739b6be5870c190173e5ea7eaa9d0dc34c316cbaa06038397fbf3711dd7b9903dadfbfbd00dff5a8af5ebdde", -"votingAddress": "URTnRutkLsEjRz2zDPYEtUMLmBd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fa59af7c667354187b34f1146f2f648deca39f8aac409ccdcc6e0632aa3ce843", -"confirmedHash": "7723fc3c5c009470d185d8704d192da5faa2dde0137ef2f41600000000000000", -"service": "00000000000000000000ffff88f37383", -"pubKeyOperator": "1945650561f8094bb42a9b7abc17e0566cf8c2a99ae7a280e0a4ef8495b7e1736789805f6c507cfd837df4bea949d044", -"votingAddress": "4WYMnAKgP8PHpynWYc8YyKDrheP8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fa5ac466e5c2f460236cb10f09907d276cc7fabcc729631a8fcdf2b644a2a93c", -"confirmedHash": "8b9804111660b0f9c5ef35cdb717e74286cd40a70c584e1e0400000000000000", -"service": "00000000000000000000ffff5eb0eb5a", -"pubKeyOperator": "175f77984b7e05d5c01da3eb5ce1a65d0eeeb6cee3a395ce70c53b14237da2ba8b04ccc9a490e3e340fe371e67c75e69", -"votingAddress": "tKbVPNvmje6EobcEWAbbpZeZKBy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fa7a234ebac051cc2664eb618596d9986eb431d8c7f78c62f9e673c138ac68e5", -"confirmedHash": "46b0b34c1973d8d970b4b7ef450247e79a8cdf8f6f72c8051d00000000000000", -"service": "00000000000000000000ffffa45cf46b", -"pubKeyOperator": "120fd7e57ac55c7bc1cf816355aca7c641537e102e126017228d2c9e79b9ad898c127782af9a95e472a7d6ac521136c8", -"votingAddress": "2rr4NeBV6Bu4zRqJxuk2E8AENybX", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fa7d252eea03daeb67ca98ff50aac9f806e0fe5759f17f075cfd5a9046d166d3", -"confirmedHash": "f735d7c6c9acd8a76c76bb927dbc329dffcdb3d24d86a6271c00000000000000", -"service": "00000000000000000000ffff52d319a1", -"pubKeyOperator": "81d805af862bc97b7a31821af7e764a55b7adb2f93d56bdb94361b80505feca2fb0c38b3f173d0104f1d2e7bffd910ab", -"votingAddress": "3j772jXECMLeT2HKAdH7Q53LXu8p", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1760496 -},{ -"proRegTxHash": "fa862f23a72cb2173892d35137683f562f8492a3296ce4b6e5347ba52e3ec2a4", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffff80c76357", -"pubKeyOperator": "81731d9540648368800cdbb2822d03c70d8a205b2a4a3367e75484fa3045b7bfe0afab89b849a85600ef7692e8581028", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fa98007920c17b0e4c880a3788bd510c3de53003a62fd5a9b550761c9ea7acf1", -"confirmedHash": "790acc3c6e44b61cdcd205c64c13672cd701e4553e6a85f82f00000000000000", -"service": "00000000000000000000ffff55d133c6", -"pubKeyOperator": "801105f27dcd746e77fc7c60c20f9cbe715b910899ea8189f0005cd634b7cfe3d9428e2cc67ecbcbe640b5ef61978ba8", -"votingAddress": "2bg7BPCYVGNGwidkrVCqHzSTRUMu", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "faa56dedcc0ed1912ea7f9c0c5b09fac9c5ba73172fcae4769ac475bae90c0d6", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff968897b9", -"pubKeyOperator": "043e742f9fb2555cd4eb9c89cac9f3de6be40348186b19fefee049ed4e3de268dee7da06086c5e3d74d72ea9a125eedd", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fad4bab15952ef482a8b16da2ff687bacc7f18b5c751b880e729d9d0d4a91645", -"confirmedHash": "668a73ae24ceadc4847045846f3860607c345535371ea5f92200000000000000", -"service": "00000000000000000000ffffb23ea01d", -"pubKeyOperator": "8bec6df1f7e038fa64ce2f5f231f31a39710657a0b7e735bffe8c4a56350a8abe5dc019675bdb86af11880bd61641e82", -"votingAddress": "3wwVCbqovsDfWapEivesifBfuMwn", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "faeb7b718db33eef9758d7dec05fbe04d4672c272666c376d895c830f8a53be2", -"confirmedHash": "f048bbdcf31239fb1ecf9cae01afd37cc897fc0164ae1e240000000000000000", -"service": "00000000000000000000ffffd4186177", -"pubKeyOperator": "115a1a5288e99db2fe833389af563a4c4eda8f87f3f8038bf8ff0d4ccc3d1f2da6b0572080d73ac1f7a012828c958d38", -"votingAddress": "2gpNE8wkZfgHzRpMFQrQ8Uyxy8qj", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "faf1929200fe0baccfe14b82fd0a59ff3cba5b7a4a58ff6c468072c9c4bba08e", -"confirmedHash": "e59accf123796e0e7dfe26f4fd3dc8a76244603294deaf201300000000000000", -"service": "00000000000000000000ffff52d319af", -"pubKeyOperator": "17f503d6cbba6a52216176aa05eeef22964ab41ebf96da0d0473e7b506f3a19da06521793cef82b438b08fe3b31f72fd", -"votingAddress": "4N8HH9e9qCNuWaxidBgoeJj6DPuF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "faf19dd8d7ab73fb243e0752fc34a90300aab699745c4a49cf895ef857d6dcfe", -"confirmedHash": "c5ebbd21a6484428cbf8a49151944485387d3619dc2ed34a3400000000000000", -"service": "00000000000000000000ffff52d31929", -"pubKeyOperator": "08f3849e4b3daf140178f0fcfb8d824d4df50ded2966e4f1c372ce98c8d47d522bd7f17c6fe2b2de63898106978c7719", -"votingAddress": "4EQcNSejVr9tTvSayFGNRitnAzWA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fb0c4cd72e99ac5e0ed1d3173bd14e3b7e9c02bfb6545388d1fdd2cd3998e11c", -"confirmedHash": "452cebc9e6f1097dbf90a4e958b00711caf15744fe98ce460000000000000000", -"service": "00000000000000000000ffff96880d86", -"pubKeyOperator": "0dff79434278d0fc382843906f79d6285d28755e887a96561e900b2c56554116b03f826a6b56d9d3eeada1bdcc2367ac", -"votingAddress": "3sZZgW5FsNx4zzyqKzqHfMptnkHL", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fb1f37866314d1cb069095cfdad2e6731d23fe795a50b61fb9e77d81c785cf95", -"confirmedHash": "cba6abfb3e07e7c0d4799aac5b5ee18e58cef668b510c1182600000000000000", -"service": "00000000000000000000ffff55d1f1a7", -"pubKeyOperator": "836187d7b4f467a7a4cdbcc621bced9777c22fddd17015a8226cfdb1ecd4f89bba333bf4076a70d9b6de550bdf425b0c", -"votingAddress": "36EQ8ZqDPxfq31JMESX7nWVQgetV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fb37a744afa67856ef1e6a951c737157bcf42f2eff194a4706db617d1a913a1c", -"confirmedHash": "80215437f577c6850855a6cf2699b2388884d11a999722e30e00000000000000", -"service": "00000000000000000000ffffbc28f172", -"pubKeyOperator": "839affb7e92629c88acb210dfba4cbe77d97e15faddfdde5d41bcd66aef6c976471a4d53b8b7a4a75ac2c90cff1dac66", -"votingAddress": "4Hq6ptPhDRNNb2iqZhWv8EzYPX3j", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fb55d5a3029a0eadd00906f714fc6aeff02828221886d93f618ad96c1e6eb576", -"confirmedHash": "97861ff98bfad2fe800642bd1ac00b11d49beaccb94adf231a00000000000000", -"service": "00000000000000000000ffff8a44a066", -"pubKeyOperator": "9697f88edfbdf3f4e1ec80ee40199b7fbd8790c64458a4679fbac4c9e37a695d8203198e0d94795f09ebd513af2e6a42", -"votingAddress": "2D3NagSe2j2qYUXGDs7X6rDyu1VQ", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "fb58cecc6470e3d1c1b438db2b41896dd424dcca435e908c6a0576d099ba0ea2", -"confirmedHash": "d96f7b66d5cc2048eaf5d9af511f712f401ec6f330afb63d1a00000000000000", -"service": "00000000000000000000ffff52d31525", -"pubKeyOperator": "8cf37ed30345238ec307a3d9730da91632350cd4ef1bb7436e697a0dd64f4e6ebe6e3a74e5c127ff4bd5953f1f67603e", -"votingAddress": "3MszzPmoL2WAq58MPDJGng7AuZ4b", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fb597c77c0a273a67868c82cba50411dc206fe6f186db0363141b9070b6fbde1", -"confirmedHash": "94a6ff7ca0411c6b5e5127183d0592228c2ee34cb94afc0f0a00000000000000", -"service": "00000000000000000000ffffbc28b848", -"pubKeyOperator": "10c0c9c4f91e5f1289875eefcba39727d29870ac9e8cb955e9d7f4a4e5e86a4f47af57214a21cffcc6e7c8781f87630f", -"votingAddress": "3p3sS8cpLB3uqDF2w6bngF7x2xXc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fb6795948d442e850f5b62f8dc6c30e2d82d6fd67036c3bb1283ad871ebe6a05", -"confirmedHash": "79851288a8a17a1e253a6a699b633fb2cd496416f90bfb5f0800000000000000", -"service": "00000000000000000000ffff34465f7a", -"pubKeyOperator": "945f816931a252acab5aa0722fb71092219425e3a08f63cef72de4a0b4aaa6185665f5016c0a897d6320d8cce7c04a4d", -"votingAddress": "2m4e3juaWvTPPPmP1UsyrZxgCkMF", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fb97b415a05c24879896391445e9401699c22d52fe35b051af19134fa1668c10", -"confirmedHash": "d57fbac48102742cecb076cb448a36962e291769ddd8735d1300000000000000", -"service": "00000000000000000000ffffc2875246", -"pubKeyOperator": "01fe1a0409821e0497e7895ab375c0c3b4d636d733d6f78384a6c1de4a8f73c04095c5555461d32471907e820b3037e8", -"votingAddress": "2WuoSNgRBKSvbwfJv7rT8yvHdy1v", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fb9c323b7950553ca4575f7ed8a780f3c911e31b10279897bc9de15504bdb491", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0e4", -"pubKeyOperator": "955d12f249a21dcdcbfcfd6a2ebefd567d5899190e6b78d1465b24da77ad8d300c7096dc93b572353229c00da1a86072", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fba2d3c2e57457c31152e2779b8dd6178e80f9c9d766896b3ad39b1b0ae39f52", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b06e", -"pubKeyOperator": "10d9f66c670ee6498bf66680c28cb763fa79bf8b30b17492e4a597697cc9044a058365fa2d5b20416b3d4641735eefa5", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fba33ff2c4a5a6c9440474251f065251ff07aed821b2e37591340ddcd3b68fef", -"confirmedHash": "b27955cc587b361e909ebaf732e7a90f9e8560e085a04b5a1f00000000000000", -"service": "00000000000000000000ffff41159cd7", -"pubKeyOperator": "8893476e96a2a9659348125f5f0c73bca407f847ff951e0804c8da1c95285571fee700c5aa85f6b69d9bb79f3bf17a45", -"votingAddress": "gjZkRBCSKZdzvnBGfuN3SnuB28v", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fbb85b39fd8dd81985f7150788a30396d31e7c1346222b9fc3886896b67081d9", -"confirmedHash": "790acc3c6e44b61cdcd205c64c13672cd701e4553e6a85f82f00000000000000", -"service": "00000000000000000000ffffb9a2f90d", -"pubKeyOperator": "143e48c8cd85f239b970e3e03504c7d70d207096dba1649abf4de16958e2ccd9c5ab01946ab310408acf787b01ca04d3", -"votingAddress": "pMNFos7KRQXo8tjMQT92xNvG9cn", -"isValid": true, -"updateHeight": 1759968, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fbbf8e3dd5061f13bc86b363f6061fcbb795c07f7e035e72b3ee4ec3757300d6", -"confirmedHash": "663022ffdef021e0ae832b5e24896fecf35ba91026b241d90800000000000000", -"service": "00000000000000000000ffffa8775312", -"pubKeyOperator": "8d27644c984938ca471fb8eebae76114b17ab43bfa1e726cf50b335f26f39d2d5faa0aa3db3bb2c6bb94e2c027d25f3a", -"votingAddress": "3repZrFZTfU2fUMoEbabzRCNcoBP", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fbcec29b99a114e5af96561c45294b2ef6532240f211fef093fe7769e1d6176b", -"confirmedHash": "245d2aa1f746068da867c375cda4d963bb09e0fd9621fb752e00000000000000", -"service": "00000000000000000000ffff9fcb3dc0", -"pubKeyOperator": "129327f57de0d6a08ac4418087d355e106ef091a11d88ec88dd4f9b2acc1889e500713c739b4c2cfec0e1d1d9cc25375", -"votingAddress": "3fTDjUhET8uudEaBUQgP1KbkX3w3", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fbf5f8fd5cb05d5ce774f56cb8790c0d58ad4398d936e66bd02964df42d0aa44", -"confirmedHash": "e46907423e8b46cecd8e269521ede064c9e6b7117fbbb9721400000000000000", -"service": "00000000000000000000ffff50d1e574", -"pubKeyOperator": "934658f5f0cb4aeee211bad65dbbf51c04296cf838217045067337252bb8c13e7ad6ee3739e3cb809072ff335cd36bef", -"votingAddress": "saEopSDvtWwMRJBL3QJUPmXVmA5", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fc1f985d703d5f4c517386b9c45690934001d7f6934b43a2e6f0445b8a661a48", -"confirmedHash": "a5ccf38b6d82e9ca0f9b35be3fcc23c7c5868528d2ba622d1700000000000000", -"service": "00000000000000000000ffffbc28a305", -"pubKeyOperator": "8423478ef4819061df464c896549ac53cbf1194c45f5f5486f2428ef5cf34b2cc7b62adde8267ae8964771fc70f6c1ef", -"votingAddress": "3cyd19bM1VLUtDVKiAzisqACHzo5", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fc20eaff1961edd1c8919dfbe7cf7a69ead116c989625bf5a97b512679a10d39", -"confirmedHash": "6c534cf2daca1ed503ded17e3692f017367117bce39ded2d0000000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "3ZeX8EjATRkCiVed26GSKH6qfMmS", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fc267bc0260a5d0465d4a86cb17af822125ecab783206cfaf99daf0b7c6b806b", -"confirmedHash": "03a7d38af9140e2d84ffe3347c50d18dbf35aa5cb8f820b20e00000000000000", -"service": "00000000000000000000ffff55d1f20d", -"pubKeyOperator": "9882b1a22ecc0050a3e8c7e99733505b417079c8b3db569fafb78a335e9a6982dbdd0627116639c8dc552e389cb023cc", -"votingAddress": "3PdJWnPjnyAbBa9awRMEpM61tnhb", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fc3ba00a2aa4284e747bf266926c129c7d6fd8fe1a05cc24767e4da1381c1313", -"confirmedHash": "f66bc377dc9859e6873f467e5de6e333bfc040fcd8d058fa1c00000000000000", -"service": "00000000000000000000ffffac689c0b", -"pubKeyOperator": "8e2c3b1b98e45c78c9ccd7934064da30b18f6891417a7915d8dd7ee3dc5be76baa6e164e3dc0ae7185e9a3b449bfe813", -"votingAddress": "4WB8y9UeibjXtJdFcyfxX6Ak71Th", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fc654b6f559960bfa555654d2e4c290a193b8b39e08b63525482c961984ff1c0", -"confirmedHash": "0d37520b4af5c6cc6fb863dacf056ebd2ebe5b924cbf17322500000000000000", -"service": "00000000000000000000ffffb23ef411", -"pubKeyOperator": "08f2df3680e05aaf7b66fe3990860a43550523cf93647cff5b0123e51608a4d2a2d209311672acc00edd6737e29cbd3a", -"votingAddress": "3k9YQCrdjrtjpssaLYxGN4HDYGfe", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fc7089e88efccedc35132a44b6a3984b6c014a4d698468548c6cfcf011481298", -"confirmedHash": "73cfbcd7c5618b79b5323972292ce4411beeff15731a1d3b0f00000000000000", -"service": "00000000000000000000ffffb94068db", -"pubKeyOperator": "8b9edb13b82e54c5b284b14869c55f21e83b44fd64932c2089f6aca8fdfbbde9145cef47b3e0d42c7bb53882ffab6639", -"votingAddress": "39pi7Z6NZLa77fD68JHcvXRwefyG", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fc778239ca3b68b01fda9ebb769e0e06db70b5c8eed09c65755b0c2125ed2796", -"confirmedHash": "2f487d4efb7b92c01e459fa59a3208efa814d941cf597a860400000000000000", -"service": "00000000000000000000ffff2e65bcf8", -"pubKeyOperator": "15ff83ca9f4533e8b6f4983b73759ea877400e4eda8923d3597ca758c890d7964e3ca9b07f145a98365e59931d43fcc8", -"votingAddress": "3YwUmGvg7N2UfPjLjEXpcMssEgNf", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "fc78a265ce3c726b08d30aa3b74689dbf84f6db1b5575692b3adec9ad7b2506c", -"confirmedHash": "5ac61f1a7d627b02e1fcacfebbb81e7f4668b2db0a6333bb0400000000000000", -"service": "00000000000000000000ffffbc28a304", -"pubKeyOperator": "0ac487b713afc2d01170cdb3988c905c10df8caae0a59f7bdae55172c12c86273b389a0f527038d729c9b3501c212029", -"votingAddress": "39LDE21EuiG6SqRcb4F9QbPL2bTc", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fc7db87833ab49a94d2e66491ab44153d30f73c22330b815650ef217ab7dfdc2", -"confirmedHash": "7998c38f7b17853cbe5909bef9638ee1a71ff106ad1da0b40200000000000000", -"service": "00000000000000000000ffff03629a4e", -"pubKeyOperator": "03281d2b8bd30d9823fb61ddba22f997230e55dbba5fa1be7d5b434d86bec28af73ac359dbc9070049a0e77017176588", -"votingAddress": "21v4xJ641284BxdYKqTSm5GsrhzX", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fc8b26852af348642c9e0b369518dafaf2836d22fec3ea388402c26c88beb40e", -"confirmedHash": "0e31529a6dcc0d3ff657dfbe0e5554bf61a8114caf90f69e0000000000000000", -"service": "00000000000000000000ffffa7632ab5", -"pubKeyOperator": "154e843d63c26a854dec9b47d8ba75fc38d4e9cd2f1472cf7c37789414749af8555e64d7bef2502f1fe4fc3a35c89be7", -"votingAddress": "3tYoEEj7gitxc6cQwxS6s8GeSLHV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fc948bde51153911e54042f3e0143301887a8ee6de4e89dd8c968acf320f5508", -"confirmedHash": "1e9fda5bb5be9898ae2f0cba53fc83346a1f7117a941d4081500000000000000", -"service": "00000000000000000000ffff05093dfd", -"pubKeyOperator": "19b5c9085d451ba2a86e22ed071a183968ace44164e2851c77062e59d3dc88909a5b2c20516bb1f34be8e91565247c9a", -"votingAddress": "4YWhN4d3WgdXmJ28pmkCMuKSzjVM", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fc9b67e4352ba8df9d4eacd085ea13973148d72fe0ec842c0c357290f1b3fcbb", -"confirmedHash": "cf632082a1ca1ded8a7e946fa5ea5c76dd8213f33bed27e30f00000000000000", -"service": "00000000000000000000ffffbc28be36", -"pubKeyOperator": "937775dbfb88dbb7f11494699659734dafc6841a029c2ae8b2f910f1d9858e54c03e6e72830cd5b524d8c300c41ba54b", -"votingAddress": "3MK2M2W5EHYYkDHvHVuBxG66XeT6", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fc9c25f3cdce8cf8de57b2955263753cffd19edf65d018705ac36397304fe595", -"confirmedHash": "2c15e8fd5c91fd7870fe32553376d8cf64c8da5d891a0c0f0e00000000000000", -"service": "00000000000000000000ffffbc28b6de", -"pubKeyOperator": "999cf5f91e03b7475470463f4b803a71654dd31c9c59bc6ad4a06b9414e03c87020ab3f76007bab5e9ce9755e1d6708e", -"votingAddress": "24gDmQJ1cnyDTVFzwKCqpkbxkvTy", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fca247d0967b61a62e91f8e2b29f20567c4fb8cc8658c4ae7b3f158cd4554dce", -"confirmedHash": "db6e24accfb09c81ac4539d366f24cc3b163af5701dea2a50c00000000000000", -"service": "00000000000000000000ffff87b53227", -"pubKeyOperator": "94dd833b270e582e2feac2516a364db26a6e8582fcd0a0c3779c709a1355f770ac1ed03e812fe767746d98f53ab468aa", -"votingAddress": "4e8z2WV1M9QnLWunB59oahyK6yT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fca7ed6f1beca441fb9cff1b6314b2cc9a3065c5b35bb769b013828c5c26c4fa", -"confirmedHash": "67275c22573f09678a0f91dd9a3d1275714d2a6b9b7132072600000000000000", -"service": "00000000000000000000ffff453d6be9", -"pubKeyOperator": "09453eaac3282a0c76638f66b0a5da648fdb0fe5f2a313097817703a9737f129af76632dd0749ac4cdce1f9b4c19e4d8", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fca91a0f0b5be216cda996b8840194eda702f327a0428f8647341e6dad0a4586", -"confirmedHash": "44bbcc917450905c4c682062c4212c42797c62fbe8da91de1400000000000000", -"service": "00000000000000000000ffff5928015c", -"pubKeyOperator": "88d230430eb9b8e3c8e2f7fc2bd633f408c46f5f838a96463502a48a597e2c730195d5c754da5bcc6718e382a6a0c709", -"votingAddress": "3r7kc6ZqocUKxVmJVcqPHrLgh8R5", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fcb21403adf66030bb34ab622849430c51888fb8968e931352d7f7494b0e0f44", -"confirmedHash": "62d121838ab3a41dc59a1321a5d1429c6f26e3fe1f85c2a80800000000000000", -"service": "00000000000000000000ffff52d31956", -"pubKeyOperator": "0ba1909b34168558eed087037e6e02ec1aa7c102d59fc72c759aa759a78d8fdb0246ae4d9e21b67f32da410e573995c2", -"votingAddress": "aLMrNGdYraArZhdEoyHMukQj1Ki", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fcba41d87e3c22e83b1c50c89de5b2af4d9e6dd041d1b0310582d5862478747c", -"confirmedHash": "f475109160142b7a3c9e88937ee42dddd0daeaf15eea728c1b00000000000000", -"service": "00000000000000000000ffffc2a3bc63", -"pubKeyOperator": "0bddfdb89b525e49efdb1b091b6187431847cf16f76c0e4544adf434c7d8846d74acf714b9e4d3622fb93b67e0f22cf2", -"votingAddress": "4ENsbC1w5R3GmgcaEzmw9JTnV4Lg", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fcbf0bac9a6e60937d6637580d774f3b9fcbab5490191d84306dfcaf209b4dde", -"confirmedHash": "0e6c903e9c10b023f35e0b972dd5b2d46628478eef6971e41100000000000000", -"service": "00000000000000000000000000000000", -"pubKeyOperator": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", -"votingAddress": "2AD2CXYoQXp3rpX1MJXPvFpm67W7", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fccdda45fc2675347c4aef65b2ed93ed5f620691f65ad4200497ea501fe2f3a2", -"confirmedHash": "fa89579841c8f4e2cc66bd70d9c26cf67a13a35d0deaa55e0700000000000000", -"service": "00000000000000000000ffffb8485ee7", -"pubKeyOperator": "056023e136911e7f0508d885bd7a78a9b90e558985c958c4cb9f90b1866ec4cd6c177ef37f4c83f08f657a62ed53b193", -"votingAddress": "2jpLpjvq3GzYfNVjTAEajxLpAhbR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fce0d87cf990bcd4276c2c6b321b0ad98f448fe6b371e5f9eb79acb8483eabd2", -"confirmedHash": "497a714892efefa0ce5cd5022ae0f36b31d305e5a27e40660c00000000000000", -"service": "00000000000000000000ffff2f6e9241", -"pubKeyOperator": "123dcbd0d68a0dcd60fbaf205d4bb992241e1549f5dab90cac2ef9f5abf7dc3c535222b227e0bdd235c54ff9f0a562e6", -"votingAddress": "3Q4LUv8DpFjnuorEJRVQJ5n6EJco", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "fcfb743e5fb8c1f613719f5f0904874a223324194d7cc2252082e66ab649e496", -"confirmedHash": "f7a0c802ba127e47a6b4ed521467e5dba4a4eddee32230760200000000000000", -"service": "00000000000000000000ffff89b87aa5", -"pubKeyOperator": "114cb1b02f8e636f75a1f3a1313dfddfaba9e11fcb91cad5fe30cecfb85f7e06f9dce0c49adb2700d696d1e4e19518cf", -"votingAddress": "4SeqGUT7CcuCNuyureAo2sxifEDE", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fd11d04836394bac21dd21d95b02fbd7557bc0d6eb5e5cf141976e7b31833ae0", -"confirmedHash": "77833bec3795fa72276cc148ff10279cfc7a534a1508ef990800000000000000", -"service": "00000000000000000000ffff9fcb2cd8", -"pubKeyOperator": "9012941817d1766764f94f716f7d7d1d660e3ea3b6fdfa2acd7a0ff34ff4671729ce513eda0c1e9eb7095498f991ae0b", -"votingAddress": "36W4g3FmqSBrAsyKp7n29dUCAoSY", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "fd3c74c20b256d467ea42f4305aec45e15e78915d524607cd9188a3a141e08df", -"confirmedHash": "c20154f0dbc19fd257943498f393b7ed582bd1272c13b3351100000000000000", -"service": "00000000000000000000ffff55d1f140", -"pubKeyOperator": "173d4634a262da6ac07bbcffcb14e64459a21be680b43afc787ddd0c2410ef136ae9bc2a4bf03aa0a9c3795f33ecd044", -"votingAddress": "4Mo644vhLdbTcFCwCCZhhhiDwAnR", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fd40f6cb35431ad4da64b9eaab1b028fbc60ca8fc7513d7f20e408798791748f", -"confirmedHash": "5b0bb62006908b98a8d895f1f75e5d449991ca23e02562e70e00000000000000", -"service": "00000000000000000000ffffd41867ea", -"pubKeyOperator": "0914cc132312f1e7f1089d8421873eab2dcdb59f6ac2bc82fc031ab3d27f408a4b84e6c901410afbf2cfa58d1d5a8495", -"votingAddress": "6SEp9Bd35BFBW5F76XTRYr1Q6Ng", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fd41f706fe4efb0d77d8719ee059c0436c81ec88ca24657140f5ae64e657f83e", -"confirmedHash": "c094a4293c280ec9bed757ef401c5dc672c2ca014ec017181d00000000000000", -"service": "00000000000000000000ffff3eabbe8b", -"pubKeyOperator": "0d21f5b8f44057b2d6e48d91a70232f255a004a1a3bfee81ce6e7ac4e22f127b95114f38953b36685c2a6b7fcb75569c", -"votingAddress": "3YaoEEuG6okXvkyYEVTAkwnSykDG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fd56eba1a6240eb5e98fcd894f1408776129ca27ed4619f42bebd7b6c90e6ad3", -"confirmedHash": "7d976be35bcec26192c33f2342772e769a5a67ddafb6cb0f1300000000000000", -"service": "00000000000000000000ffff55d1f14c", -"pubKeyOperator": "0eace8a0201ea79ac2cd7d654afaf5ee02d49394d416f1cd9fd0b935cf0dd9da2b375e744c38bfaa42ffe9e47353db7a", -"votingAddress": "2w4HHLgyMZNdTZFwGhLG7s8jy9CW", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1738128 -},{ -"proRegTxHash": "fd633beabaed18e65ce83e66b3a70a7211bf83348c2114836b1e0f6c47607279", -"confirmedHash": "5f3d1cc0f4ac66e78d503704aeeb91ff712b98a2c189c76c0a00000000000000", -"service": "00000000000000000000ffffd4186d23", -"pubKeyOperator": "04bec73de1a696cd1ca7fb54d9512a6716c37739e8866b2369bd065e48e65f485624129a040108a6fa08d9ab00969aaf", -"votingAddress": "tmXxbuDNxbYcYLkNXoqLM3R5hA7", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fd90219278db5a6f618e10e092233ba98cc9c1be9d1c78482e75444dcbf10492", -"confirmedHash": "a29c74fb3479bbcc74497d6602c50921f2f28889b72c7c733a00000000000000", -"service": "00000000000000000000ffff52d3195f", -"pubKeyOperator": "84ae61a283c1c4dd6667fecfa8a963362d9747f43b2942bc48e9bb93c6de51ef9e7925a9c6adffc2492318dd7ffd10d9", -"votingAddress": "vivaVB31DFXE9d7R5ij3fS5Qx9m", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fdbce2673cd013f564d47981d362f81d95bb358b0a6783926a67c004f4952e6d", -"confirmedHash": "ce1395ee213bcad27afd562fd4924f7b8947e8c7bd6702da2700000000000000", -"service": "00000000000000000000ffff55d1f1c4", -"pubKeyOperator": "0398b8453d3094edf112269fd1b30ab48076a1ee076e1df5237f8930bd42708b63c67f390d1248d7dc8e877153286a28", -"votingAddress": "xsH9f3JPZhAH6PA7Az79qkr6DQJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fdccb394c86d82ddd85229f7c931a658bead9e237ff305dcb52d29ab477621b5", -"confirmedHash": "773dbfab3bc3864dfd33cccdb6287a8ed07d9b9d2c662ce50a00000000000000", -"service": "00000000000000000000ffff5fd86d83", -"pubKeyOperator": "1766892617aa44a9a2d8bf267edf099bebccdc7e1aaaf44e0dc3c1e9de3c0a4cb214dc1848f456308b9bfeefd0c8c1cf", -"votingAddress": "3Kigb5W9LCaoLDGYkEq4QN5itj5A", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fdd5839571be1f5d3feaeab217bc5ea367e95189bfc8c8345cab785bd61945d7", -"confirmedHash": "5a19cd92353030d1355cd7a7b01ef434cb2f9bbeb95eea620300000000000000", -"service": "00000000000000000000ffffb23f7982", -"pubKeyOperator": "85a828004c31b3887dd508da2ce76c9933c258f5e6107b30b8edeb8aed87e9aa3d17cbfa235148e3036d324556653d8a", -"votingAddress": "4WWg2sjuDHnPPcMQGBZsKr6jYrG8", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fde007b734439f877e9e0cd5d0f5137ca035545cfad2d4b34ba49c30f775efbc", -"confirmedHash": "9f085ef56e97dc2a5d3061cdca78f0b78ef7c2032a6b68d40100000000000000", -"service": "00000000000000000000ffff87b558c4", -"pubKeyOperator": "952767e9cc72a34897c8e2b6ac4edd115cb4399af1fb7cbc01b0d1290a37b4ebe8ea2d12784d43f3213fa79c10f8c191", -"votingAddress": "3TyqPwKQSgaF2gnEzQgGMNvB21JE", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fde069b538cb566ebbcf56c68b72dd6512fd0ef5a9f925554c6196738b19d8f1", -"confirmedHash": "50c086eb87b5ee45c3268119a698348b93487956525cf41e0400000000000000", -"service": "00000000000000000000ffff5f55276c", -"pubKeyOperator": "153da1ebf655fec1c17b6f0618e61050fb3e00d41c044f4ffca707efbe87d023fec6dbee6f187eccf72035332ccd3562", -"votingAddress": "4LBWLKkiHb8MS4fZoD3xd4mhL83e", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "fdf15eb50729482b68b829bdd0de379c6e0c28a10542c49689fc4a848220a298", -"confirmedHash": "d57fbac48102742cecb076cb448a36962e291769ddd8735d1300000000000000", -"service": "00000000000000000000ffff5eb0ea9c", -"pubKeyOperator": "86e4213e6799b87eee71b325c749940b27610ac4557650902150a4a78c625ff0c07ce758cd307a923dc0d9bc5562c01b", -"votingAddress": "2kcH9bPgPXecUMJ87UCZM1SGhtBT", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fdf6bc0d4b97c9078f8f363c72eedc361d12717c69d01cd71c11300bd4d0f17e", -"confirmedHash": "53abee519a03da4b6e373dff6a9c329a16b68b25291d6ee30700000000000000", -"service": "00000000000000000000ffffbc28b988", -"pubKeyOperator": "06dc2b594de7772241ecf4b9e2f7252a45e7e76f5004b4016ed524224f1019f0364010d06645ca55dc26fa880565466a", -"votingAddress": "2KmbtfRYFWy1miNP822FcBhpJsPq", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fdfbc818ce2a64e9745745461f42128a370101749a4d8adc7ff64b13fc52abb9", -"confirmedHash": "76d8a5c8a49ea371c6194b626a9926d78cca9a2f95c408392400000000000000", -"service": "00000000000000000000ffff05b75fbf", -"pubKeyOperator": "03c10bdb4024102f6e8fa25c790e8b5566e21bd2cdf327458ec2ce2058f4af503d500579d5acc3b2481d02f48a2f2044", -"votingAddress": "3ZY8iEWj7NZbHrxs6FPTANx7tMem", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "fdfe9e0c5747fba117875d319582a467b24c7e202cd797a07e1299a89013f2fc", -"confirmedHash": "8168b3ad5d59fd1fda68340a2cbaf9d24f6a8cfc01997b5e0400000000000000", -"service": "00000000000000000000ffffcf9475b5", -"pubKeyOperator": "10930f4664f86c40052cb77af3bb7a1a0b39327dbacd93e93bbb22bacbcb58b0845ff6f51cb28a923e95168106b4775c", -"votingAddress": "3pejjVcppLsHGb3M4PHEwWAxPqFB", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fe060349a4a38fc056b9f9301091906d8589b45415252b2f8e363af535cfec6c", -"confirmedHash": "abd05702b7c9ee0018d3dd997ac27296acb2fa7ef02fb3ef0600000000000000", -"service": "00000000000000000000ffff68838f09", -"pubKeyOperator": "126e7b3b2ab146ef271e53faaaedccdcbc84ef145e8e35b39d8c1f32db6833e1734df89604bd99bdec5825ab5bf10dbe", -"votingAddress": "VMoHUobJqrYcwBM4BvUnYDBqe2H", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fe0b95356aa77dc36a40e416914a2ea9203aafcfad5d832c8343b77238109204", -"confirmedHash": "943c502f65cf5b2b662a583eab9d47b7446f741a53d2601a0e00000000000000", -"service": "00000000000000000000ffff2e04a267", -"pubKeyOperator": "95a6a48086fdef688dca66133dd52f61ba97a445e1fd9f3a21c46a88bc385e294fb4da05c164c71164c7d31b60d58e98", -"votingAddress": "32v92158umLBkpzdDASRqKnUoN87", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fe4a37e47d83ad23207eb875f20156339650c13b5f3eef92ef0fdd918bfc4f4a", -"confirmedHash": "7ec7e05832166cad716ebd64052499af0637acac695e1e761100000000000000", -"service": "00000000000000000000ffff2d557529", -"pubKeyOperator": "9035651106f8fe73fc65208d801ac0d86467fd6eaff3ae619e6abf0a6940d21d04edac051fd849303becb16eae100def", -"votingAddress": "3yokC3SuLvVSsFYuXY4i66GVpS9V", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fe50ac20571e98ceb508c72f004e09a09a2586b05760dffe9835e5451f667ab8", -"confirmedHash": "c847134417733c77d4fefe2e3f4327ebf766e442dbc7018a0200000000000000", -"service": "00000000000000000000ffff8b3b29dc", -"pubKeyOperator": "01ac46a75e307602f69e6d1575519bfa8c58ba87971e74af10a15c75fcab40a28609436131f1efbeda37a004a64c29b8", -"votingAddress": "2UNQcrgaeDiKSwpjWU4bh8hzWiCG", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fe585e7560c09da6c46d28a555255b9345a3ac67f63d66568e2e0f94b5ad3673", -"confirmedHash": "e296a3dc9a286780f38c976e6a42e7b9ff044bd7401d2dd23b00000000000000", -"service": "00000000000000000000ffff55d1f1b8", -"pubKeyOperator": "877d2479c5c7f591d9b4ac5acbb9c4c36b7255bced57efbf1d10fa7aab110bdff3a6d143ee111b0cd5e70603c5f00bf2", -"votingAddress": "2ghgvkNWYtahzdoLCZshYDtrqjrM", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fe5bba0811a028fab52f76b55c2403aa68002860eaa8071513f92c9d9087d530", -"confirmedHash": "507dfcc32d06a04caa3c691707691aebe98b16c83a4b95e10200000000000000", -"service": "00000000000000000000ffff8f6efb22", -"pubKeyOperator": "8ba2aec38aa3e4189094a81922d05f9a556d0f6cfa09b6de3aa2746d790ce3fdb3b4d491b22ecd0aa9e3c63e4065cd1b", -"votingAddress": "3gDXi7o8UDAVVKN7bcdxroz8LU3R", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fe943a33bc611c1029b43ddacfe53f4a6852be1ab5ea3acc1e61c2fca4369ba2", -"confirmedHash": "4ac01de697be6488f5825ab4d8b95716bd829f975f0b5acf1400000000000000", -"service": "00000000000000000000ffffbc28b6c7", -"pubKeyOperator": "13274c2e22e9e9881fd5132ebd22d59dd02959707553975e6ff602b2422f37675c0aa54de399aa92e24da378fcd1c5f7", -"votingAddress": "2BEy1GBt7rHFoaVYJx891m8G6fgd", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "feac9d7d804eadab30dfc10ebe48be090e8ef736f6380c1bac9500bebccb132e", -"confirmedHash": "9f274df387d1066e3f1257f138c8c02900707c22887a77ec0800000000000000", -"service": "00000000000000000000ffff5f551c0a", -"pubKeyOperator": "98eacba4f1f6fc5c85cf51fe6afd92d9d414874f608eba623f7f557a1b06491d52d2cfb2b72944d294ccfb8ac8e71147", -"votingAddress": "3GiMFoMEWhCvFbRwV7wW2nCY2gNV", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "feb38d7b5c7e9306d7ba73536f44f3ff02f567c8f6b4d95f011272b4b1176f4e", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0d4", -"pubKeyOperator": "012ac932e4d5203a8170304db0c0eb8e912feb86a9bd2900ae09d0e3db977de521d2d555b8d246111f2b8a17899e9165", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fec00bcafad7457c6114d282db8e5d8d5934d8aa0f4c7006d8c0fc4ae8a29ccc", -"confirmedHash": "e78398ce8e394ab4a518b5659d7be9873962f2f6ca834f8d2400000000000000", -"service": "00000000000000000000ffff2d20e95c", -"pubKeyOperator": "14c66f75ffa61ab89a05d1a481cd38aee3b7b0a0586b23f81b7ee7c77f0dc6399c477f9631fcd5937bbcdf5309ec408b", -"votingAddress": "BSs55vdmdpgr5yWVF4ZLFUm1cmc", -"isValid": false, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "feca8f779d1ea5ddb16e7f9d4434e1f2389f339abb244cb36d0948f27d89b832", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0cd", -"pubKeyOperator": "8c0555e3899039524187df65f4b84c4f6290fc6a79fb431fa9aa7d5ba19befccbba17634d1cb761f085ccad11106ad93", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fecc44f34dded06573d4d9ee79d74e31e64199a711a73db987b5bf0658a49eed", -"confirmedHash": "66534ad2921b399e55c6b1414ad4c2e926e794567964d1ed0c00000000000000", -"service": "00000000000000000000ffff17582865", -"pubKeyOperator": "170425aeb69290d2aa84ede41255efcedaccb87d3861ded9ab32faabb8c7207159fbe2899f07a8a0f8aae3fdde083a11", -"votingAddress": "3GoFyC4ZjvMyXutjoH1yemZagbdD", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fed5f6bc47222ff50fcddca126905f856bb3a80cfe543e90291dad0a3698b5e8", -"confirmedHash": "5cd1ffc9d7cc86bfcfb2d344bc10512fd86ebaca41bf4b5f3000000000000000", -"service": "00000000000000000000ffff52d315f8", -"pubKeyOperator": "946e8e0b2e12135d5d32407e984962b87c1dfcc7189dee8921a107874c1845e8262381ccfe33a03f0d7de7834fd811fb", -"votingAddress": "41xpqScm5meJwXfRjQb91m1DWu9n", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ff0370d95c2371641b271ffb228d9bebb7d95b5633ce10fd720be7c8bc3dfd02", -"confirmedHash": "00787909c9b5eba48f1473f57bd3114b2b1262a7ac3e74831f00000000000000", -"service": "00000000000000000000ffff55d1f117", -"pubKeyOperator": "06ae7797effdf07080c191285de378a54abc70a6c1f1dd574e5c03fe25d5f41c74ffbbccbc48c3c74d96e0cad31375db", -"votingAddress": "2eJvVQ2Vs77jfgpReUJ6RhzEhuYn", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ff0dbe05e73bde46cd905054ef0db63ee0c2cf84ad323695961eb6519c906055", -"confirmedHash": "aa0a4c59daf86f7808ceaa003d923d6da6ec63ad5c01c2f20900000000000000", -"service": "00000000000000000000ffff5fd86d88", -"pubKeyOperator": "1560709717e114e9904c5bad932ae9c0c3f873bd745c4fcc2291b6034746d12e1ee8da90cf30fd8deb7e3bc9f85e96d7", -"votingAddress": "tCLMvoaqLWsQNpbkApiC6daEzCA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ff2dac7c5ca8516ee0e31eb6456d54a74f458a0202984f12174ea6882dd293f8", -"confirmedHash": "f99e3a66357bcd146c6ed90be88b7eb826dce05c64387fd51a00000000000000", -"service": "00000000000000000000ffffbc28fbd7", -"pubKeyOperator": "89a733a3be676b9da9784fe1f34037b9f5905b19090f9ac27aae8b3557219961a0f54f4a5749bc6f0bbea628a28e71f4", -"votingAddress": "36jtVpmZvzArNGEemn9Zqo31o3ZT", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ff4f88b1d43977167a9e7b70ea43cce316325888353a6ba8a75a0d1cd86d84eb", -"confirmedHash": "4f9f66d2302c5f00551edb68af053e9b143e1200dc2bf5170700000000000000", -"service": "00000000000000000000ffffbca6b0d3", -"pubKeyOperator": "8eea07e9f2876570ca89d250840a95451b074a6fe5ad1c6bc43554d4e48e275176068f5849688ca6e3441f70f25d9fb8", -"votingAddress": "MeHWZfGBT6FPqyFPwaR7Hd7EoxL", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ff5ba0b3f1529e10d7afc8fa4c22786f5a82c3f52a7bd14f1137c179a8b7c99b", -"confirmedHash": "952299367566a467a685243aabe9525b26ac470b1bbfd6a00400000000000000", -"service": "00000000000000000000ffff55d1f26a", -"pubKeyOperator": "13405980a4774dcf15b719af42467d2fecc76aa7be0aaa6eabee7911cc673f449ffb7e4ac03ca8acaa8ed2a582a96d1f", -"votingAddress": "ymrqdRXdNxF5Gpcsor7V9zoeazr", -"isValid": false, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ffa12518d3226e2972688d5e05f53698ace40925c54ff94df42bafdce87aff51", -"confirmedHash": "64598508924d6c3eebf28ee25d77c897010219117fc049ef0300000000000000", -"service": "00000000000000000000ffff05bd9f5e", -"pubKeyOperator": "0074a43322d7c92ca3523b14f4eedc97f1b083977ac21d7483d9b34f32782e76b3e3bfe2bd089794f927d6443796d05d", -"votingAddress": "49rd5z8eJBWDAiDFBvaqTQjdZFJ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ffc28c4934c8d2dfdaaf99984bb2b31c79e0828aab56d67c3dc96c0034dfe552", -"confirmedHash": "cedc00f0912b5e1a88a2a4745218334ff6f789f4cd18c1ac3100000000000000", -"service": "00000000000000000000ffff8ac58a3c", -"pubKeyOperator": "0228dfc84eeab3655e3baed9d723b94d1b36835721dca3d50c5890cb9abb6fb0fb5d117eb56a1f4dd369387312160a9c", -"votingAddress": "2KXd4hnsgD1WUYcpDiNTeS2KcXoK", -"isValid": true, -"updateHeight": 1760824, -"knownConfirmedAtHeight": 1759392 -},{ -"proRegTxHash": "ffe4d77dc10b191a21dff834b4258e5c251637559f5d502bd5acd675dcbe6fdb", -"confirmedHash": "9391d1f7f24f0966a680f0264429b214f13901c4759987290300000000000000", -"service": "00000000000000000000ffff36263007", -"pubKeyOperator": "073bfaf7732da66b89c1794590873d10bf85640b018e1ab43017fc5777f2c891cedf29584aaffa0b68568b256d49a8f9", -"votingAddress": "KRWxnGxeKqPTotGjceqpof9HnQW", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ffed9423a9e237ac34c29ac6c677b9c56b50da353ed9634ce0b16d59d356eb76", -"confirmedHash": "02b6d3510a4e053b487e6ff42a0c289b526a0619f3bbb9851100000000000000", -"service": "00000000000000000000ffff9f415427", -"pubKeyOperator": "8c1c732ca137bdf31932dafd19efe56e7155d256db9544ae27f590fb62017f0f32536c7de15cd830704b07f9f52fc9f6", -"votingAddress": "WxhHkgUxRuUzMgZuYxfNULkaXJz", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "ffee764038b12af6020cd86deb0a65618b744af986e051873ae4f91fb11ae961", -"confirmedHash": "3b348cf08fc46abd4f8e1902e5d605903bfc49875f465d611100000000000000", -"service": "00000000000000000000ffffa7565fd3", -"pubKeyOperator": "0c5c803651e54ec9c3f97bb20a9f5561409c7a94b269e0a2dd12c3450ea9673d803e47a662943aff0d976dbca6c68b60", -"votingAddress": "66H6f9RyKUqK3RTtK1UcJyEdELQ", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fffb1e4d4c4184b797aa06ca817df7c2474509fd3e5b100556bb3f33f2527baf", -"confirmedHash": "9fc048af1f552101fbf2666384c0294b252a1ceda05c4d9c1300000000000000", -"service": "00000000000000000000ffff64184efb", -"pubKeyOperator": "8f8097c423ad5bccc3d631bf518a1f28ff60b31841e3c7b0d44e578f94d33b96b9fb485e1690b72608423f3e926ac8c7", -"votingAddress": "2UJtLrigWnBYh6DJUJpqWdjVZqvV", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fffe1b7d5b2808f7927d1fae033d75dab7f602e04c1786d7cef54664b0a6e2f2", -"confirmedHash": "4df3dcce2f17ed639a44b93b1358260b32b2c0f99ded0acc0600000000000000", -"service": "00000000000000000000ffffbc2815ea", -"pubKeyOperator": "90fa1a223be7089a366897ba0edf1af4ead03a1f43bf2312b0ba420d148cfe63aa222aa64565ba2d660f88795e36d0d7", -"votingAddress": "27pXbFSGugBk2Aa75Ny3fTptXcuX", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -},{ -"proRegTxHash": "fffeb0d868f12ea975ce46d44e17ea13b05820ea7f455c078f957681f4177bc0", -"confirmedHash": "bd31f35c5cedbf07c6ffa716f2a3acf8f725ab42af8758740500000000000000", -"service": "00000000000000000000ffffa7a02454", -"pubKeyOperator": "059aa61878c313f95e696f8919bb5809fc5fe41dcf64d7ac7e569ef13a5420378846dad9a7ad24f64079d139005eca49", -"votingAddress": "dRKR9S6ZB6kzS8V2eNGnHc7ckTA", -"isValid": true, -"updateHeight": 1720000, -"knownConfirmedAtHeight": 1720000 -}], - -"newQuorums": [{ -"version": 1, -"llmqType": 1, -"quorumHash": "34a267d4b52cb3f8b59c79f517c63b87fbd305cae517ae5d0000000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "ffffffffffff03", -"validMembersCount": 50, -"validMembers": "ffffffffffff03", -"quorumPublicKey": "15a5bf10323c4f7249d723af9636a5805d2b9aca90913c1f34a9177357f405ef12c071c8f278540a474f874199646e50", -"quorumVvecHash": "3f95610106edc065b1f56dab6f78d322f33e36611ef3631a2a418e54e9c6e0ad", -"quorumSig": "17800d6281f4b8fb4171a0a0c5715ad0675cbd4dc05117783a5c3e184eeeb69f772cf2014d1d983695aa7cbbbfbdfed8176711fbf40af0110269125781fac2a15c4a388b7cc7070d5d04b62a080dc531dec71be0add057bdf1d43ba235ce5011", -"membersSig": "91694c5013de182ce318dad59a1cbff574306996abfe68d0749eebd6e9ddcbb7b06668598914f3e7e2efe1fe5fa55f120f2b1bca27ab5497b5e0c2b955101650735e755b143e35f341a358215d7ec24bd43321300df995406e000ab6ac17847b" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "adff9b073d816687168c2183036520e2f756af0a22e4cf090100000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "f7deffffffff03", -"validMembersCount": 50, -"validMembers": "f7deffffffff03", -"quorumPublicKey": "8f288fb7758b8b1c5e7b3b871ad219e2b13b4135539c3a986af86ecc6deb02dea28f57848b3bbb080a9722d26e6d7dde", -"quorumVvecHash": "99a9a3cbaceea3943ae596afda5116d47899a64eb656c60d0c27302138464c39", -"quorumSig": "0c984a5db7c974cfe7229c61af158e9f21727dc5f58fd79f42f6d0c31a836884acf5334cb69b71878815acac2dbf8df3102b929c04f8e82e3bb250b2a222eb736a15ecc1e1a76c8f2d73578240c1e22624df861411ee23d91e3ac5981bd1d1d0", -"membersSig": "196d6bc8988010d064aeb440431273a9a4c5d65d6ee1b39cd62a352ac257f76f3b3c2b7c13af63941e53d5795229ae4214a4f1fadde348518b5d8593b4d2167b3f115b5fbb639a09db8c2a5c5a553fb33be02f97508e2967f32da2f005a65138" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "2f9c97603b61feba1c0bc0b31c0a1dfc0aa8be6f6fbb5c970100000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "ffffffffffcf03", -"validMembersCount": 50, -"validMembers": "ffffffffffcf03", -"quorumPublicKey": "0bd5dc529db0fb0f2b69566ccc7e32f0142ce3a0ec356871a0661bf9208d439447c26e944ba2a541ad6f4f572dcc02ae", -"quorumVvecHash": "f34e3975aacf66c6b32976f22dd1943380865de5c66f42a57764ec3cddbb2377", -"quorumSig": "044f00ab1d3739e3c0e8e1c62050ef5e1230e78505c2990bd03ad095c1ccc79b4bbb5f97ebf37a59c4b17cad0d92742201d256432624d5d93cc436d15f418fb62df2bb66dc348e5a5cfa7108c30a7e042c3e64e4fa267243866c059369b3941d", -"membersSig": "08bf399ad8adaff19abea541a1366032e5460c1cf3689688e9061e985467d353c48a9607bc1a0e5eeeff4031a2e099f9154cc88e8c7d0d20f3f4d09eb34037de2e1c15657cdc171d357c8d0c836bf79e25caa43bad1ac8055d8842e0d1c8a579" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "f146ca29bfd199fce51b284ebf7d5855a97df646f8a1c9b30200000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "fffdbfffffff03", -"validMembersCount": 50, -"validMembers": "fffdbfffffff03", -"quorumPublicKey": "8e7f2df27380d59ce8e17927ff8a2c30b64ace011775b9f9ec37dff3ce1d0676b58dd42ca8aa4bc68e8cb658019d485b", -"quorumVvecHash": "691fa60c44ceb9add49e2355e157cb6b28482e982540a9723d75db0ed12b3103", -"quorumSig": "03f3fe1d40400ae8ffd552e77211dfba8d750560124f0f8882f9390ef5158743afb2ce9a51e57cd07466954cc25faf6a16327655407ea087226f228ca78169c0fa70c3057d48a206290af0aaf335a9a0bf311968f00cbdea4a24eacfb551d46a", -"membersSig": "8ca4f1b5550526ba347fe542a490d3c7b793ac7522d07dbcc9db63d328aa5daa97a982e68d8f288149a31a3d39e823e613a40bcd02707b4ec540d4dec0da778a6968b6b2e5fbd6fa401dba8c2050b78c3ba598f0ed866c7e9620e5950d466676" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "c4b98b363b598802fa8071c45e776eea53d2fc75a33fd23c0500000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "ffffffffffff01", -"validMembersCount": 50, -"validMembers": "ffffffffffff01", -"quorumPublicKey": "0521a686889e1cece1d11d92c701799c9987c1eb5d05fc533bace2926b08a1af1d656672d32b455d8ecbeefb8381c2e3", -"quorumVvecHash": "bcb8f620d2438c8895088546f6c754fc7dbc6eabcf7f8ed463cfd5528bc20a1a", -"quorumSig": "0572d4d1b4e963bc03f278e9deb4aca521553f874dd72914ecaa5ee0769a0c91209d2ab89068f0786122f7e9893ad1a4093c5f9a483df2a4a2daa7eac9d06ace139055c1f8bdcd785c92dd8fc24881b129181c93dd39cb998ddb95ac4029d07b", -"membersSig": "05d7044b1e68a592552b117e235c1893a291ae5abc6b3b7650b0f54e2a25689c599e2017adf7cae25eb8b1702ad6232e114d0fc40ae9e5f1cc18c20fd8771daa10ee0bf6d948f59374b962a63d7a6a4fb5a0c4590335e92f51646ae29f9b0ced" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "5295347878c50648e4c907128d3611aeb8d1ae5dc2ffae240800000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "ffffffffffff01", -"validMembersCount": 50, -"validMembers": "ffffffffffff01", -"quorumPublicKey": "856933004bd4aef45729bffcd75e47968b45166ae1fb8b046e7889920f72bf93820d7ed842463fcf80909532b5185612", -"quorumVvecHash": "a7288c138ccf028da6b51f8606e7408bbd9aa14ab5817d4353531f21d5091c83", -"quorumSig": "8a581b46baa26088f07b052be5e6aacce35381d326e681bf7a1ccfd9c99175265b18df0b14dc094684e86b1282205920198b4927b260d7e20933df3466961161171edc420dde91e58704dbcf17fe85effce13b907387b0862f285e6b6159a341", -"membersSig": "0be4d37276b7ffc49d126abeca9567788fc353e6ef12d2b15436e6776b76a3e2c93ec994180a3b34819b6bf1f673df750442a8774b9255bbae8ffc5c919931d0affda98ab5f8bd1a54b827912a73c5926d906adbeedbf92d96d91dc72e3b6a97" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "c61cea38dc6c4e54aee1fd7d0ef7825814c0df1dd835fc0f0b00000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "ffffbffffffd03", -"validMembersCount": 50, -"validMembers": "ffffbffffffd03", -"quorumPublicKey": "0a45b459c514be06d2cf1facdebb1ae0014a76156a07d85ea3a83583c8f8508687403ade6efd05bcf8d9e8e6308c81f2", -"quorumVvecHash": "31a6f3735a4c15d6a1816aaa206ad7f222b3e9bf4cfa12454deaf0f9f8f8692a", -"quorumSig": "0dc356b7f3e9b61a629e59dcab36f27b38f8963f0d1f17583cc08e98cff5d66d1e821bae74dc3effcadfc6dc20026dc919edc1d385817da6de5e4b355fdc494345620055d21cf9c85d5345aeda3c8965abbdf2175d9d06826a36f3219f2f176a", -"membersSig": "80b2167d36598341342cbd94287cba3020af8a03e09ace6d166da242b487b0e8fbe797c67f520440cb4704a8cdbacba41347fbc360cff8ecf229e5e4fa5b974209955ebee624ea2e058d8471e4a2ca5ab90f7545f545b3cda39e60978580e771" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "d70ec61680b7540aa208d97c1a54d1732ff197f46cb2f5c50c00000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "7ffffdeffffb03", -"validMembersCount": 50, -"validMembers": "7ffffdefffff03", -"quorumPublicKey": "183e1227ac2da0887112574e56270e63f66a4234c60f07b48ee592429ba62fcd712dbf18348fe817ccd027de24ff8891", -"quorumVvecHash": "47edd4c79593aa04fa52e5b13e988f02dbe43032fc1119484aaa2056bba8006e", -"quorumSig": "1600ed7d804f3efed512994d207722bba01efd908bb70a7b245b569f8ce8ac9e314d97079726e62ee39b2d2012dc6e72128ece99466bf06a94f62dc8443871683f281483eb16887bf2813545441a477fc9e7078be8af8493d32f8e378d63d652", -"membersSig": "092bc11a5cbc04246b3e895483fc483339f87bb15a19783843d334aaee78b8b8746fef0deda32cebb1400a7f5376db550ee328231dfd0c966fdbf75fea614c5f245d023c5d43359bee32c411d528b71ec457fbaaf05ec861b993ccbddd7ffd12" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "ff738c0b7830212f56b82fd67d7d63c15b2f1ddcd8bce51c0e00000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "ffffffffffff03", -"validMembersCount": 50, -"validMembers": "ffffffffffff03", -"quorumPublicKey": "137ebad13eb259643176b428c7ea84eec3915c39144e8107625ab1fa71ef6ad2cd0b4277cf2db0bd28dea1d63599c068", -"quorumVvecHash": "11cadfb00f7e8cbc45167986004a5ccf8405761bfa1e2296118659474914f44a", -"quorumSig": "828ef1ca73d13f1b0d795bad95668aa479e8c30de6defae9245b6bd3a9a156865726eba857b0c331275e7f430299333e14718b9e4c36e2cebe2545ef53445b46974f885908936b2872e2bf938479932de2cde63378b75673e4640fbaabbf0abf", -"membersSig": "0a96c3c53eba20ebefd65aae6947410cc0296ac6dab6d5be3f253413dddf352df7ee3e4469d320bd3af41c5beb3de3541421b79b5b3cd987977fe9565b3dc6a839c14b04a7737150b4e7ca67c45a2de8a31a57640b39936c6c048c4cf07157d9" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "ce74e9b65af0d7f6274f02bd88802683b288a7cf1a70a3cd1000000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "fffffffffeff03", -"validMembersCount": 50, -"validMembers": "fffffffffeff03", -"quorumPublicKey": "819ccbb76b630320f0efa3f35973fb25278840afb6be90845cd8532a6c17286cc41c5ff8d2ea65c4a67237a2f6497175", -"quorumVvecHash": "07a5b60a504e24538b6ba9aca9b04dd33c505c8c703d0a2eb7062b434cfb07ec", -"quorumSig": "1572d30b2e730c8f9ef1e474f06da13a9250cb778430ebc8f4e6708f97a36f58dbc3ef6d543c93014fb7cb083b08d5300e7efc3801c90500350631c179071b34425e4d0c9597d25a398b16a0e0dde603c56beef0b1615643992c74c7105538bb", -"membersSig": "950cff3fc48b32c565ead96625b1a6d583dd9718ba4ccc47217729e3e574b03d9b8eeb743fc6fcaa99314e32a12442fa0a5fb33d3b77dd14dffab3280b129f0845f432892aba0681a61ff0955140713db071e89c20897e644b725563ad8c1cd6" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "d4d5a3cb0d841c129a4ac5d966145d2184e21b6279d6474d1500000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "feffffffffff03", -"validMembersCount": 50, -"validMembers": "feffffffffff03", -"quorumPublicKey": "01172a780a5413778be5f981d52174a553a8bdac2501f8a1bb0275cecab011bb1494fad291411cd392cd0203a499a42a", -"quorumVvecHash": "83dacadb6426be73ab472573f619f102dcefaf7aa940abfdd69e331897d402cd", -"quorumSig": "8257798c8a594f54909f682587936380e966ce74029791af3dd43bce86ab683b2f3b3b838ebd5a369806fe9f2b92de5d0a25500f54b73ac1088613cace0c1943d2d38d81d95981bb87985b027afb950315948c6a9c52766b29229eb312886ae4", -"membersSig": "07ef0d9232c0b71e53cffb52287035d0f0771e347632c72faa7c0806c731a97cbb6dffee18a52b9518813490e9a38baf0f0dc68534cc12d0076f93ae4f0f9c7852447cb5ebf5e09f5a4c022507ac35054a5459ea6fa94c029663c5fbf5623a4d" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "8e2c02ddcf6c7e52b7415bdd04f8e7e018be6e60631284601900000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "fffffffffffd03", -"validMembersCount": 50, -"validMembers": "fffffffffffd03", -"quorumPublicKey": "037fd19a24fa153a23c601f6dd64d05dae99a7dc78ff1e4f6d100e72fa07378ce9eb27041b9f409b19a1fc8e5c1b1a75", -"quorumVvecHash": "2d67f58ef6f2d00183050479745c370fbde2143a115b2b3697491c637c29e63b", -"quorumSig": "963b934847d519f9e122c20a5d81f49c42b33d5a06241f6e00610c3437521af3897ddb57972397cc285790807e3def6d02962ef384a8a2f957363778e75ea81d201649022462348469c20cacb1897172b06c0053f28f5bc1e84fed5d25dba879", -"membersSig": "0bdd1fd45cda0ed009e0d8fa2141f49f9693dddd6b54cd17d884fbaf05487bd55482e103869516ab0194298c6bb3919c0889c88520c383009f00dda91bd7065a49f2144e82ad61dbbd49992ca1be1244af37f63efa0f91f55ab96455c0dc9061" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "59b943c6676121a789b0e6b68954fb0fd3dc9e48eea1dc071a00000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "ffffffffffdf03", -"validMembersCount": 50, -"validMembers": "ffffffffffdf03", -"quorumPublicKey": "99dd1a25360dda4c6cd3140c5fcdcfe985e964c11e1107adb32511c7e41514f8d9dd498dd0d8708d2314147f93f428e2", -"quorumVvecHash": "15c85cb20f54316011572ea831de1af52ea921314659ab3cbd61b5fd642d81d8", -"quorumSig": "08ffc10a95f2518d7df081ea8bf561ebba626b2d9d56875c3a7bc8baaec4e2daf659d85c6f648fdd213d6d3fd02c2aab17d81a0a2370d8804159f6e4d21114d55c93921d8054a7eefe6f5d328749d866c739c3a0ba47574a80c92dee11721b2e", -"membersSig": "86010c3e4efaa5ab56010e734e8b58aadc9465f56ea2e0377366cb96ba02793e715904827e81a1906524e10861aa1148090bbb1c1bf96dcfd426b6375d536118f54835d2ac7da20247b0380a45135238642de975582777d45d660ff51b52af85" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "db23aedc038db1a944c48dfb2fe25240554c7d3db440539a1e00000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "effef7ffffff03", -"validMembersCount": 50, -"validMembers": "effeffffffff03", -"quorumPublicKey": "0b78e735b55144e613f1307f4c5265be1e3dd82f022906cc146f30ad5f1f4e7e8acf06407d9341dfb06344bb2ce52fd4", -"quorumVvecHash": "1566d37f54a9ae95281d79055ee9b84c399538179e82412a65e13726c62dc5cc", -"quorumSig": "0cccc13e2419590410ebbfacc7f9ee7defe3a9d0bacbc6b0530bcefa81164ad15e4d57e95545c57371deb27b2c1b44ed150fa7963b1ba84e9ba6997379fac22147de8a907d8835be5128892aca5f726ee310118b0381bab83454db9a6ab12b2d", -"membersSig": "841829068834b7555330b2cfc0bea030c91c68b46858283c5442bc0bc208dfcd1afc7590982ea451718e98f2b798e8d50be4b0f5e541bf71cfacb84eb25105fb997455f9016380e364ec1e5b1720b73c45a082c4c5d426cce978801628254704" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "0141eaa349a457ef0e18facd727bcf1a2774d4d322f9e2522000000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "ffffbf7fffff03", -"validMembersCount": 50, -"validMembers": "ffffbf7fffff03", -"quorumPublicKey": "8e3b657d1cd297351f5fc4198fb088c5b40eeb0b4a3875c72a3889f7a29f1e9434888b84e35eecb5981aba861e217735", -"quorumVvecHash": "c399a87aa1a772ec1c3cd3a2ea87fa0fc22acbfa2b9da81bc9b695ee7ac7b2d8", -"quorumSig": "15dcdcfd36c45a7db2e430a43c8fb192e3bd1631a93acf514a8a4410ecdef132ea5e2fa01ed29c371df0533fa54172ef1599f036885e6165e83fec4864b91ff8ee8dc2db7bdc2f2bafaae4bbc2b7f7e1d90cc0f82523fef98bfa933fc7d5971b", -"membersSig": "8c6ade984239c359af845cc63f5daeadd7f8411dd427ee1c6dfb2fcc2a8c22d10b1796b7a2cb4930cfef2dfce839ef7415aefa90406dbe66da61940320b62efa69b265379d12734fd331c45699278ded1fcdf97d3041f5dabc419c074b80450a" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "2b417e73d81a13fb504011a643875d0131439855e434e8ba2100000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "fefffffffffd03", -"validMembersCount": 50, -"validMembers": "fefffffffffd03", -"quorumPublicKey": "95fe73edf8ad685d5a88de81d05fce88bbb74abeefb2a682a80ef03d7ebf4d5120ceef85061a87df5c9b088be68edf66", -"quorumVvecHash": "26ab2da00ce6d42c521f5acbc18fa46b898d0380541d2e828373ca2254976416", -"quorumSig": "8b83261952acbbf3268f46ef9c3a392c0d6c8efd528b1b24de31be62fca2cdd98d30bb6cd938f47019ca7f27aab0baae11ed14acf7c5a68a0a31392a3a6eafcde28b54a8af14e786e21ffd38890a53c64de5edf844a90ac5a4653e861df31c22", -"membersSig": "1291185d839d3293911e9ddbcfc0dccd8b1790993517372f043eba894c22931d5772040301ecbc2501fcfb4f35f57a710466d07561c1edf45b1ff73e40ce4931a92f392f7ef74d8258a41f595f88b196c901777cdfae23ffc72fbc061479b51d" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "7871b5e5d7db5ffe8c8e292b63d25bdc5230a3f6b464a5a12200000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "fffffffffbff03", -"validMembersCount": 50, -"validMembers": "fffffffffbff03", -"quorumPublicKey": "8bb03226aae0d68c38fe38a7577f114a05f8da533e45066bff8847b3649d791d7a96296bc79a0438924bf20b23e49cae", -"quorumVvecHash": "811e77d0b2cc490b1c8268c554d6f3dc989cc3b3ab41bd6b35eab3f5b6d3055d", -"quorumSig": "044adb141af769917d23138d875e3773e6973f502a054c4a1647ee7ae3c4c2c61691826deb893313ebfbe56ec79f15fb0f784fdac11f2fea38cabb6db0827e30b093fbcc2da9b71208af18667f43594cdda3a35ae0b723d794858f667c459144", -"membersSig": "8977046a409e4ff695d4183b2fd081c55ec9ca2437c645d0c126f979c1cfeeaf9033f614d9405b4aa531a98aab520557135e22f031a998578d67b643b1f7d0b8fb40f4697c46f121f565e1f3ec5dbd7ea7b05e2d09179a181f917a9786ff4449" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "96a39a5988f3bb466b3f44dbd7baf79c2efe2d2ce57c7ed92200000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "fffdffefffff03", -"validMembersCount": 50, -"validMembers": "ffffffefffff03", -"quorumPublicKey": "8e0b3349f3b8a72ba134b36e057d6266199516564b09e3b4e9256f837b0707883a57a7cd06e04491a2a061cdcfcb06c9", -"quorumVvecHash": "62531107c15d8dceefe0a7aee1f32d6cfb8bd81258f4fecf5f938201be732890", -"quorumSig": "87796fba08170cd5c0417b85e39347d2bfb644a673a7eb6ab0e7b6fff0f10d861ef51e97f7f9e5e4a3ab83d21ddaeb7e12e7ed9b428c3eb81fb931be61c37ae4bcdd02cd615e9d60236a93c4373647835c46a7378dad7cfb673b6e20bb38af9c", -"membersSig": "0f61cfeb473ffd863b662827b5f757d73e724040d0a47eacf5cbee962437942537e3e54d52770994a71ce66fad88e73c0f6c935c987468625c632661688d1cbaf3d2794c764c792bd467f446e9a626165c47fd175ea4222ca30028aa2b705d13" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "ba46d0a5295b88ae84e6bc89afae243e0d4bf1c7de2df6a92300000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "fffffffffbff03", -"validMembersCount": 50, -"validMembers": "fffffffffbff03", -"quorumPublicKey": "175c6ac4b4fa5090df5bd9fc53aa41152aaf0e26c40848f5519867b1f44fc87978b081c04c69eef35c023105d01975e2", -"quorumVvecHash": "f51592f9dcffc8995a01102236acaa1419de0078ddce22effa535e7eeccdf776", -"quorumSig": "93d10d607931913fb27096ec9c4e189e336e7ace24d876d53647d3c14c99336323de870e16a5ce0ea93a548a8ec20754009d900306ae919107713874b3a735a93bf24d95629b44aae984ee342d54924e004dca0bf1c7180100ddfc5b3e2c656e", -"membersSig": "84f958f4906bda8d98491d264806af3354fbddce08ab79368da0147d277ab62d1f0bb1b3d95ba00b34ad1736c0c0d6eb00fdf60ee3b158bc29e9a463f8eb9a05534c624c555fc00b9814556178d481820fa0ee3c6f1c476e4b362e4879f03fd5" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "e1bb4e2d35c61d8ba3556e355d9c9d5f98d3e961e5fc76402500000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "dfffffffffff03", -"validMembersCount": 50, -"validMembers": "dfffffffffff03", -"quorumPublicKey": "16fca4ad250ee62af583757e8b72793b44ebb329d0a9ddbed9cd28c875ee4c00ce75372b5c6219263c5f144cd9d1ff16", -"quorumVvecHash": "83e6e21d974a09be2d5ad5cc63dd0adbd4fda6208520efa3e98011b3a602517f", -"quorumSig": "19505a9c2925d1acd93dadc66398f4318519943c60b02fad344de26c86cbcd82ce5ca0a34130982526e1059034bc13dd040ad78c4a13d2d24d6f1525cacab6dd44a2b8e5ed68cda70f2e691195bb4dbebc7a249036f7e46cd23f870cccfd9f77", -"membersSig": "805339a874c07ba89fa6a037284b2092adabfac56f1b8805e207632ddd1aaa160d2f45cfc76facc2669625b51b16329d0667cc4cd7c63a815ed8ac786b74ff3aa5b61e9d21cffcde214bfbc14152c97419ce00b4c9ab7d81967fbfe5019fb8e6" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "3a0dacebd3204ee69fbe8e2ea851a458b9057c81b1d41d1d2700000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "fffffffffbff03", -"validMembersCount": 50, -"validMembers": "fffffffffbff03", -"quorumPublicKey": "89912b5b1ee926a490292e257eeda9b9f7d3feb3dddaa5ece23dbd39158abafecb06e56bd489d7588c3bbfb858bb8c40", -"quorumVvecHash": "33c9faf412d3cab80630663e5336f2c5f175477c098f838bd2262fd77ccbcff0", -"quorumSig": "17b8dbae2e87a388bc92b97687a6c4bf006cb1a9a158351ba25f4cafb7fae7db0d66b2f1930b2c2fade87cf75721a5c70e8f78e631c7322d1b15850885216b4d7c56c8bacfb8da4da75273691c6e15eebc6cf2977e0e2977ce565ae72ee7d5d0", -"membersSig": "0c46c1afe69780d726d6ba164a0403b18518c35f2f1434f983c2ec839e3367db4dca6acde43a524bddd796f8fb80f6bc1864dad04fe21490123445795d7b1c1e11e1394e1ff0be402ad97a54dc63f45df9e411e6109f9140fddb23c45fb2c6de" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "c41a4b3ca55690f634b6737cae3efcfd86727b6d69fbc2a62e00000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "ffffffffffff01", -"validMembersCount": 50, -"validMembers": "ffffffffffff01", -"quorumPublicKey": "98ad2e73f15c242a20969cc0be85c8ce98d2f32cb4ebe361dd090faf08bf7c3797c98f51008ece48832924b23b61387a", -"quorumVvecHash": "892069e2149209cf32c9157267a481c40d585c97e28a2539701736a6023c2562", -"quorumSig": "8a2e52fddc8864a8ada3d3d9b4bdab2c5da43bd8acd8c536d811a37c15fe963b4338f4a7c75a97009e0b4eabf5b4c3ca122e773958f167d0d9bc7a5c6445c6546e292e6a2199a4a8545998844038978afd7d56c0ce76ec8439645bf4a1de1d89", -"membersSig": "8850182e1fc28c07a79ca9b7ed024d236eb9ea33e761ed9da92451ca1d1587a5d2d1d368521af78efe9656ec66a388fd08f8f2dd0d6f22733c69ef69dac56b29a619148fd622bec6acff902e54c4d720de721896517826d128fa1530da117e95" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "1ce2f4a1e18733983bbe07959deb418c9dd32331967829c73400000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "ffffffffffff03", -"validMembersCount": 50, -"validMembers": "ffffffffffff03", -"quorumPublicKey": "81eedd8f57c8e1f18ee1d84fe79af5cdc183a77d8d6ab58a3103d920afcef6446ee2599530ce641615cfdba6ec836271", -"quorumVvecHash": "6cbdb85af7acfa6aff5846083b889b02f36d27acfb7fe44a1fba6ade06a00271", -"quorumSig": "88b85df48c14a622ea66d7d8aae20dfa020d202ec7377874eae5e3141c118630613a373651063becc4f1aee509c218ab159e7c61550b6ca92e104928ed7e83a0f4ec9d3003543a2d43e3cd52b830b2e46e5e33334cb00656bedfa9ea2336ef8c", -"membersSig": "13a9335b4268743fba278f89d79b5c140e90e539334aa4b533d0cd8db5b37b2c711d4722cf507ee8634e7dc57119abea13709cce9ed0c897c35e97043929ed019e0dd5cc3077209a20a79bca5f24702388f0cc1ae224005f877fcdf78f1ed539" -},{ -"version": 1, -"llmqType": 1, -"quorumHash": "78deacd33e7d3543384303adeb0790df4342f1ef695273db3800000000000000", -"quorumIndex": 0, -"signersCount": 50, -"signers": "7efffffbddfb03", -"validMembersCount": 50, -"validMembers": "7ffffffbfdfb03", -"quorumPublicKey": "90dced6100925fc3690f02636f6b1d0fbb67de94c435d37b272aa1d9898e6a406f56419a66b8ce876fac070bb6d6f0d1", -"quorumVvecHash": "97005f1086b81e0f70461a9493873cccdd3fb0ce262266e1d64975512effad97", -"quorumSig": "84b36ea7bf477943b953dddef37131ed038388108837edef6db3be2a1cc68bebbb0f13a1abfdf1b92799fb9b8deb4f760b6cce5d7828f2104b8311f4537820cac6d6fad91b1a6cce452f467544b262a5720bd2c576843e5233959787557bf1b0", -"membersSig": "060afed9895d2b1afe91928b914218febd8b06de8347f87d2e5f19a7e2779b6da9022c8389029cad64b3e46dd05b6b890403adab42785ee5dcff8b5e565a5f31b711c17f5e6b4fb853b1908ff22889318d640da007b8e296040961ba98b07db9" -},{ -"version": 1, -"llmqType": 2, -"quorumHash": "82c87c9e8d1e794fb42f858842ad8aeacef73459766cae001900000000000000", -"quorumIndex": 0, -"signersCount": 400, -"signers": "fffffffffffffffffffffffffffffffffffffffffffffffeffffb7ffffffffffffffffffbfffffb7ffbfffffffffffffffff", -"validMembersCount": 400, -"validMembers": "fffffffffffffffffffffffffffffffffffffffffffffffeffffb7ffffffffffffffffffbfffffb7ffbfffffffffffffffff", -"quorumPublicKey": "993d429e966f81db94c37b44300006e0dd0f3aa6eb630cc0f31b222b39902c062e8e92ee93f6d84a25ef29c4a8d9ed15", -"quorumVvecHash": "9219d665393dde630503d5108ffc3e49be1b3c960b12af1d059ec547f20e71a0", -"quorumSig": "8d7964c36beabb0f2c4b26081e51865f33b0dcb7913bc3fd95f1d8110e17b58105775d9f7da86ab70c3aabfd307c2305010da14dbe592bb21b1eedab18330bd7cdd14e563285fd2f3deafdb47c941b2c1f716fe8e19f1a6f0d71b4751451e8e1", -"membersSig": "804ea3261a357eca8ff19b75e742dbb08cfb632ea64599954e7135041ffb4a2ec3193f3e5caaf08fc53447a4af88a2980e8709343245bd86ae0255fa285f3d5ae2c4686077e1f59d4442871524134fba286443769d2bd65a6a9555e67e6fd168" -},{ -"version": 1, -"llmqType": 2, -"quorumHash": "e0a26b337799c12a7d4be6208a12400cff60ced8f18119c01f00000000000000", -"quorumIndex": 0, -"signersCount": 400, -"signers": "fffffffffffffffffffffffffffffffffffffffffffffffff7ffffffffffffffffffffffffffffffffffffffffffdfffffff", -"validMembersCount": 400, -"validMembers": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", -"quorumPublicKey": "0ad8140d94df67283822ad0f7acf3f342618bad753714e1235fd884dc865ca3a35a49d1a660d63fdd3d61f79f0d7f11f", -"quorumVvecHash": "55cebf6a0f1a64d185b9c76f215b9fe1dea766fb595cf6569b387e4e334c8238", -"quorumSig": "8699206a33217bdd2b6d8e9fb00a36038dca54e0d5784a5cfb1d06a42e8fb440d2c9d5a29f349535ddbaafc4d17acf86140c4482996d3a7dc418ed67e75c1885bd606ef81674e4016ea8df137754b80f694d5a0d1a5812243c1154b1105bef0a", -"membersSig": "1243f16438b22f3cdbce4011eb77534ea1b6f07ba7094e81941319699a5647390bf3e423a863a0c333f64a24d8f532810150f31307a53317991fb024bbfd6e232999ef69ba20021c7b94f71e366a82019288b05108b76c2c65a49f24721ea762" -},{ -"version": 1, -"llmqType": 2, -"quorumHash": "c8ddc7e87776191d5810585d1c32603aa31f30c4d05e19922700000000000000", -"quorumIndex": 0, -"signersCount": 400, -"signers": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfffffffffffffffffb7fbffffffff", -"validMembersCount": 400, -"validMembers": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffffff", -"quorumPublicKey": "0579d29e1476fcb55cc310f71eaa37cb8d4845bfccbe28f2f21be7138caa8c50e1881aa90e7a5ec1d406d1c162fa5503", -"quorumVvecHash": "159ea32bd8b63a517708103146ef85a5477c2ea6fe4d6e41da39c127b8cd0637", -"quorumSig": "8c3537788c5b593b2c852cda9899f6af83de4505beb750c79d78005242bc967cd7eb99631c8ed0ab5010820f1202c31d0c6f507f23d0ac1644bdbe7b37f9b4d0d2405b7871c239ab03717bfec293636ef3a73d8336319459b3e7f1acba224cf1", -"membersSig": "9968342eb651ea5158c6541893059c7981b77255f7e179dab6cab5bcc351226a91185b75dde0ebf44c80cdce8ea231060ae6c9ae721d9fde5c67d37bc3e8843c6d99c106a0f262fc27f0d64c776da87ad73d351f09f1b68fe7584e7fcd73ec9e" -},{ -"version": 1, -"llmqType": 2, -"quorumHash": "7065bb64f8e2ac3bd7112cb638af6d64c174637200e340512f00000000000000", -"quorumIndex": 0, -"signersCount": 400, -"signers": "fffffffffffffffffffffffffffffffffffffefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffff", -"validMembersCount": 400, -"validMembers": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", -"quorumPublicKey": "80e6a7c3c6ae99698e015389b0af9c3ce483de10e239f07dadaa90e8bcb7db7af7e10d11339f1260eba7d7ea41f04d4f", -"quorumVvecHash": "07e3de288a32a2d8cf8afbfbf36162f8392d53b3edfed0c96aa1330ee1952a0a", -"quorumSig": "8bdecdf30519aa77644326792a1a8aa0a7dc42accb74c9a77db6811c89c43760aa9756609c63b09fa2bcda0611798c1112e8279f1a904cbbe56bd5be22f9add517c22b2eb6b286246d2b219b1bb2246266a720a5c3157a0819e0859e0afad300", -"membersSig": "024d4f1dd7738e00bbd1c3e61f5c29f26a9d21513563e404ee78c919c2094551ec5042d409609c1f7ecd52052e899bba0c86b8c9a6f6324fd644249edd0be3b671b94eb8da8f24a43d7a296b25a7adcfdd30501becd1d04f26871751e81a3eb2" -},{ -"version": 1, -"llmqType": 3, -"quorumHash": "4a91f5c77b5b28cce1003500fc988920714be546241c105c0300000000000000", -"quorumIndex": 0, -"signersCount": 400, -"signers": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd7ffffffff3fffffffffffffffffffffffffff", -"validMembersCount": 400, -"validMembers": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", -"quorumPublicKey": "026d556e4deb5ab293a385769591291515f819075ef68384b34cc9f34a275fff3fde2a414521ac8539b6e96160fd27ad", -"quorumVvecHash": "79ed2929062c77a9182642e02a9d35b51cc3c38a43351f3e39119a4a2ebcdee6", -"quorumSig": "03b7e2903b2b4c3c8294cd8612f176978887c1dc036897e1c0bdea7572fa0c076f6996b82c5fca52a01c66541860644b1125ecc88ccf1b9564d16e59ddb99a8c74fb72e7ebad930dc2e0ca32ed9e1269b63e8e73cef572bb318136ef8ba16de1", -"membersSig": "99fc5babe69a5c7b526fb293ff6261c5395b77f2d769736d968602ff02a56d1d8b639953092dfc41213c4e499981b0350c2acc2822fb88d8eac0f9698fb2e6f007959c9922d00fb20b722926a8852be4135302cc1064fba0765a2e692a6e7e34" -},{ -"version": 1, -"llmqType": 3, -"quorumHash": "ba23a5b5b1557af5bbce14bf2b5796e207204515ec0783af0d00000000000000", -"quorumIndex": 0, -"signersCount": 400, -"signers": "fffdffffffdfffffffffffffffffffffffffffffffffff7fffdfffffffffffffffffffffffffffffbfffffffffffffffffff", -"validMembersCount": 400, -"validMembers": "ffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffff", -"quorumPublicKey": "83bbb8bca24609951ccce77f567d55e6d00a280d0ef9d13a6f02da982c6e9395279544841ed772ffad1c50d741ee52b8", -"quorumVvecHash": "6bfc2befc4780987b6ed2fde0bae8dbd37b8cd3d6a4a4413f93407666845dc2b", -"quorumSig": "97e3b0829a5f1529589ebbaf5b20f2a445a8c33d7fb8aaca1b959179689465b8aa1dd5ed117beb9b9592f97e198c5bd717baadc75f2926c3236371a4f83c05abc2931aeb50fc3be14aa389db11856392fe5f7f6e2754cf16b75601d3ca32a0a6", -"membersSig": "8d01c0f5cb0af11c892cf8ee4562e15e9fed6b87f9d3168ee189b406e3074504b5ccc334ab021ce57dde59affb1c11a30ffd0142cff5ee5ab4c73d8ac02949a01d80b58da13b17c24d31ffe0c4ce79c97fcd6b3e090e63cc6ab00ec92bb0472e" -},{ -"version": 1, -"llmqType": 3, -"quorumHash": "82c87c9e8d1e794fb42f858842ad8aeacef73459766cae001900000000000000", -"quorumIndex": 0, -"signersCount": 400, -"signers": "fdfffffffffffff7ffffffffffffffffff7fffffffffffffffffefeffffffffdfffbffffffffffffffefffffffffffffffef", -"validMembersCount": 400, -"validMembers": "fdffffffffffffffffffffffffffffffffffffffffffffffffffefeffffffffdfffbffffffffffffffefffffffffffffffff", -"quorumPublicKey": "18fc3bfb5fa6c4ad13b249da794bbda64311b814fbee3675e2a8873be42b234dbe3ee08ca15bab1b2bfbcb4de967c289", -"quorumVvecHash": "62032d00b72620e67ed56d0c67b56122c1e5a912ea0a2b876e135691d2c3bef3", -"quorumSig": "87fb01266e4bb7b2866a3d5aa5db1966eca8ca874c7a06c79ec1a28690b76ddde4ca56946f19f55d150b076af456ad2c0533284aa0f579bedffd43573c741857f21db3a709b77976f4a782e66c02c3e16f3d5cb5782c37f31a1219f2d006cff3", -"membersSig": "83fa4fabd6c21e2a1ed049a05af9cba67a21ab7108da59b76a90ddd527e067bd879d0cf8c99040c0047ecc11818e498a0e725cca6912346ae3890427ad42a54b3850335c21a8955919f2b7698ab9ba5fe9af4a5f4ee1bb86fd8116df2a8638c1" -},{ -"version": 1, -"llmqType": 3, -"quorumHash": "7065bb64f8e2ac3bd7112cb638af6d64c174637200e340512f00000000000000", -"quorumIndex": 0, -"signersCount": 400, -"signers": "fffffffff6fffffffffffff7fffdffffffeffffffffffffffffffeffffffffffffeffffffffffffffffefffffffffffff7ff", -"validMembersCount": 400, -"validMembers": "fffffffffefffffffffffff7fffdfffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffff", -"quorumPublicKey": "82c89d44c460e142b0257cdaffe6e5f2c46f72f41dcd950186fbe930140da1ce7cd1cda75b155a53489f3ad56c78ee0d", -"quorumVvecHash": "eee8c86551c682d0a28d20a33e209eb81455dfed8026077022263c5b31f2bfaf", -"quorumSig": "16db98cfb4a9aec6acfc6c7bda255efdae825497e23b9daca5950bffce490a8912661b2ecd778daf1df79529ea98d0ba1253bdcf8aca713fe678ca7b5bc2a75664095335bd4f3ac3c0b46ea048274bbd696adb50aeb68320722be8382f83bb87", -"membersSig": "0e5e9912b3ef6907729490040b36afa5f1e248b80e87c994104b2141d00bcf005d676ca95e3674a03dc99e478e41d39b088489c2d3843f46cb09a2093314f251ad61df171a73e3dd9c3f303964c3264f03b5460e664c336a0671bf2a035db4ab" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "fdb5a38144d74280c9f500c7e63fa932acede7f8fc94797b0100000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "ffffffffffffffffffffffff0f", -"validMembersCount": 100, -"validMembers": "ffffffffffffffffffffffff0f", -"quorumPublicKey": "8a31a2160da6ab2e74289d7563fa00e692207b7bb86336dbb92e56bdca160bff4bde1ce12a36ece3d2314a2087489f06", -"quorumVvecHash": "ff05f570365bcd7a014c342382af133d3303a69ca2f6cb46a3f1ecfd744f91a0", -"quorumSig": "946dd8b2ed1a2af6f4aa6d26a324598885a6c5433e0e19d321023ceb1c2411e27c564ea2537e5eaa3b8ffef590893942135d893fba5ad9ef29bab9bb7845ffa1ac2cfb86780ae7e7304c9a8250e33a80a46c8ca1ca861babb93b986dea7faa6d", -"membersSig": "072b594714142dda05ccc6f6ed024f5abf44982f0b0c1ec2af12c22753908bfa9606675d636a92eeaddb72e1bb9067c40316459dcc5f70cab95f41469b0d202c381aa9edce577a32a98b14acfaa4dff1e4df01694b90ce8a4b2d48938e52bd44" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "0fb76f98174d63fb13ce8a41530bff4585d8337e35d0ab190800000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "feffdffffffbffffffffffff0f", -"validMembersCount": 100, -"validMembers": "ffffffffffffffffffffffff0f", -"quorumPublicKey": "17f16b4d931c65acf2d2b5ecc8b4e8af377d5d227e0d0f518e7f84ecf81d7d4f443e00f110a4821462059a0f5f27bb75", -"quorumVvecHash": "8e86e48e129044bd3ee41b93c74c5e25516838e8741ced6e5ce5c9a494cf5053", -"quorumSig": "00a1a4922b94ae26edb36f635c3b77c53d8e7b488a1d8e0c9124c4706a4b15ed42b3dcab11ec2536cd7e8be27511c4731941092f657f373e3479eedcbde32839b449c622a12214432af495b9d111e786eff92e28c170045fba6bac86262a77e8", -"membersSig": "0b1a6923ed6f35bbe78a6ab47ac6e1669cea648775bf800d7c2a9f4fa05f839c6553c7d229c506ad013bef9f7c1830ff0473c713ff91266b052235d29ccc24a560064a93b8ae77331636204eb128ed5b61f2038dfa6a600fdb95085fa1364f0f" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "be25bee375b773a955eba644bb31f606f7be2ad0bf641a010900000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "7ffffffffffffffffffffffe0f", -"validMembersCount": 100, -"validMembers": "7fffffffffffffffffffffff0f", -"quorumPublicKey": "17ec49fa88e4616bab96039f98edf0e52e3dda2686137b0c5c4249de602f6d03a14433e3964822428f93502bb4622303", -"quorumVvecHash": "c9b2da7528ebce97de4144ea97adabaef7d6a5bc153604eb691f30d1fe24b9ee", -"quorumSig": "85b757b0c8086108f9bf38ba11c6b02aeac84e01bacd6ef29418834db3d76ea4b1d7f01287b2786d29d1e5ed970563d119bfbb716a181929243b4f6792eeb4e3997eb04212b81d577acae1dbafc49a60d6e6e432061bcf720bbfe10880969724", -"membersSig": "0314ac41e3b70d22f92e748e12296e6eed0b2e1031b3eb6d7121b17817b4f4430afbc3c48ebabf4a4345cdd32d897b260fbdee667339c03e27f55268d97447accdd5c58c96eb26349e51b7d9b98e8da273e9308f7280b435e6e709deff94896e" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "a2629c898f90314aedfad5d0b714b42f882d40e31c30e6170900000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "ffffffffffffffffffffffff0f", -"validMembersCount": 100, -"validMembers": "ffffffffffffffffffffffff0f", -"quorumPublicKey": "8bbfaa40a16cb60f8967e6b1817c92abd3b60932e9b3965f3f8360389877f1377f5b46591a77ba70cbdcaa55185407ed", -"quorumVvecHash": "19e770acba9b1e8852812b00df8ae8c4c8193762011a60cb35dc68c220dd8f5d", -"quorumSig": "96a6ea2d66b29bccb45ef7b278faa86a3d0688d4230a2c99f90f7482d5454d9633a235701fcf49646a454c7f8ef28f7e026fd1e5e6d1ea0f39f2b62f1e5d958732c1737941701a64a228d09b42297a9b2f44bca66d8a1f2aed2c2c64ab23b33a", -"membersSig": "02468c011bdf1302d41633960e195c89d2526fd763a5d2117621c94376dc924c8a70b8f0f02b960597499e4f57627b500c7352d66007a6fe02a9e986a261dfd0601c15731522c26f2321bb3d4b447b1ed7974143efaecc41749dfebf487286a7" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "55a58bfaac29387c8db1dd9a34884d1d9cdd66e5f8487a350c00000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "fffdffffffffffffffffff7f0b", -"validMembersCount": 100, -"validMembers": "ffffffffffffffffffffff7f0f", -"quorumPublicKey": "096fd1c0df871cc2f6afb87ca1fa0f3fb4ac9e74b451b1c3bf2fe11295cd1e54992b35de29d59e3b1f7ff91e17c3ce27", -"quorumVvecHash": "c046a7d352a1777a5b28b7d50b0f953be89e1d8e30eabcf22fb2387482d80e74", -"quorumSig": "94520d92ae2381f5211623c3a9cbf90fda5d13a68db9095dadb5cf003830119762c6c1d7baff0b945ea697e21d4f26a91942d2bdca1110fdd10b9fe345cc6e4f7dbfa9213ad70934133720a4b93d668aa6eb6e2a349b162768360f2df2d4c478", -"membersSig": "92df973f305aeda451a883371904037ba92de0c30d9fe86076bcea0e8bd60a76a860868a43d8c1224ef7bdb98eeafa06004826782e6eb78a8fcbf2b782d5a0fc86125dbb918b6026cc948239f329e266923d06af680084e1443eaf1c3f2501e9" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "ee9d2312948a78f3b4148470e31967321b4c183aa9161a430c00000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "fffffffffffffeffffffdfff0f", -"validMembersCount": 100, -"validMembers": "ffffffffffffffffffffffff0f", -"quorumPublicKey": "98cadf8bc0428c7b6dad4d5fe1f29d0c7c3886e654ee74af1395dd535d4f2fdd9f697ad2d14103c33cac224400e54dbe", -"quorumVvecHash": "3634f24ce698052d15675875c58325de24caeb27ede2bb4a5eebf3192df8b8d3", -"quorumSig": "14533a96b91d7263de3c62a23d2d815bab197c4505ed9325b1352ef27512938160fc6a99a3653c687c5aecf7a54ef5fb0514fe7c52e6a84958fd79d0d698734b100202cf6fa12b2c49d471d70084cc9177d430d0372b703f3281ab9a803f20db", -"membersSig": "07b476278365e81ecc7a75d7e5b11756ee514697cc6770f4917442c25b508002906c8dce10cf506ce749e3765bcc2ede093378ad89173a96759a9ddbeb952524df77b1517848a32718b960b97c29524b5e79f4c6c5e971eff40b8159a0b5ee0a" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "ff4bfce328ddddd9cf5f4af842e1d1a5b2f9d6976c76b0550c00000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "ffffffffffffffffffffffff0f", -"validMembersCount": 100, -"validMembers": "ffffffffffffffffffffffff0f", -"quorumPublicKey": "8600fbc2c2be1265a34f614680d12bab780b88be9b95f6bc894b4d574c4fc9aa288f85e58460155b390b1dda15afd955", -"quorumVvecHash": "bdef5fe29ec6ab76a1730dc5bcab6d0cd3554ff3d8c2bba8e34f0fec8a0ce5f0", -"quorumSig": "0c1e7937dda59a23233c49cc7cb22d2489b644b16261b6603b360a59b764ef07fffff5d30238bb1141fa70b301314f140487747f665af11f4de9b8aefb4ce6bbf46cc4c9c43d564b007645c6d880649040a6292a7e0dc8fcac0be042e1b73fcf", -"membersSig": "052012bc595369791f4efea6759fd2d81fd89a5d10b1b810119122d1a4f9cd4fa304a95317ff05f323f569c2a5b51e0606889f03018a0e4a2010214635aef4cb64c0be847dfed058e352bb8dc2d54ae2463bb24548ab5a4688aad208ae6e0b9b" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "b4d2b230dbf7f488165473b8517375bd89a255e2e4e2f8570c00000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "ffffffffffdffffdffffffff0f", -"validMembersCount": 100, -"validMembers": "ffffffffffdffffdffffffff0f", -"quorumPublicKey": "915219220ccd043881dce6243b6c7987d438bbe9b9f4e9b2c61877489ec22288dd3832f84015b8dc25b7c5a557683a6f", -"quorumVvecHash": "184d9ce6dd7f8a5893ad7422889261d994046744abec42df20ba6653e5bc16a0", -"quorumSig": "162465256e11f1e6498027275bff0f5cf119ae1a002b41f5afa2d32ce3f80770764efeef4ba32668e8fddc5f9b37eabe0724468079394f801c797c04985de293034065aba6dee712fa2be772d1348302e141aeb1a5b489796c925ed76fbc113e", -"membersSig": "0f78fb34c0b0e9d70e2e97219e53eef52194062ac66a1426dfa7fccb68c8b92a6317d6f205ef4bb4fd3eae03e7224d91059d28a84ce7c662abeb2a16937c041a956922843ccae265b483ba7281512e5c0fc8ca8d551d5f1942e647e8f0751702" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "4c19c8ee722d0f4915a2d83016db201960b967442d119aae0d00000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "ffffffffffffffffffffffff0f", -"validMembersCount": 100, -"validMembers": "ffffffffffffffffffffffff0f", -"quorumPublicKey": "15dd271b39df04e3c210021ab4204f0ab4debc71e28f5f46370e48845c0604a8266aca3ed64f01f32a294f96064bed3f", -"quorumVvecHash": "8b594138db5c4a32f49868f1e4c94a3a422fef89c0cf3a8e62b2fb86bdad1a49", -"quorumSig": "82ddf0e5a7573d7aaf3f39cda9847cdc2d7a7f9055094583154d598c2427818272cd09e55314d07c016e4437daf5bebd0ffa40434929108cc1fa08162c4e2697ab88c323ffee8f6db7a73851a69a76c6f24952b1e7f16674eb82d9062d173424", -"membersSig": "171f1823212fe4d743672033fc6174d168f10f817fd3c84f3bc928a01aac43fc53d9e7317e73d00856da7336b069372504ca511e0850e444b44dbeb8b0d34b8bb40041edace5dd9239ba95f5f13484b66a2458763debc1fda2a65ce9b7710296" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "236dab1665269fb2654aaa4ddc47f5fe50c7c259ca02e7160f00000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "ffffffffffffffffffffffff0f", -"validMembersCount": 100, -"validMembers": "ffffffffffffffffffffffff0f", -"quorumPublicKey": "05335bf43d988fa7a220c5ed75340e01c3a4f5f2903e5581bbd8be89dabb33754cfa3a5a6da78dacbacd9280833d48ad", -"quorumVvecHash": "c92564bc92973d5e77663d9f28d2ca42b846e56455bbcdd1223e692ba8b75a88", -"quorumSig": "0e65cc37ea3f5eef2ff41619cdc15f904a0799541de3596ffd1c62862e672b5aa2aee1c0cf75fec40066162a16c4dd310dec74b767e23204bcf94bc4ff0ebddf2c10504322b95ee6b25cb732bf429e8ee5f0854b25868dac96970c5717bf3954", -"membersSig": "16cce02e11ae1295c79b629e49c2aeb25ca58b645c8be59134e49814939ef41f6a3cb2a1dc71eaf5709d3c591abdb9cd0933a1c91d54a36fcc922c72af506ffb30a944625408e7df0569743ec14b3deba32712080860da01bce36fceaf25e40d" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "111078bddd4326f9558b48a16a6e58f0981104012d7300121100000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "fffffffffff7ffffffffffff0f", -"validMembersCount": 100, -"validMembers": "fffffffffff7ffffffffffff0f", -"quorumPublicKey": "824e4ce356bd56141e2a10b5c82afc2addde01ee9f6d411c021bc4548741102a8ccf43d06da395d8215fa1b6ba79a5f2", -"quorumVvecHash": "c938e861559d00db15dad39d7dce551e5e014bcf794e858a99dc7b3af3f6852d", -"quorumSig": "05243b6187a8a9608cbffbfc84a1483d97c314f855a29b5bc20deb56d7091fa2fe18c5ff694ea1864ad8fd49f1fedec1077b1e44b9e9f7a5ba4c3dc3fa14d15e72fcf07f22674d6c420956cd692878cc2e62edca22d77cd17ab4db78e1cba32a", -"membersSig": "8f227390a34901470e592c57964579b03a0b3cb8fa70ae8f7923c0ca4f8cdfffff58d8f9f6f3ac2049ad9f4288312ecb0bc2dbbf59af61841d3ea6eb60525cd87139eef4767979c593c0edfeca47f7e64ebeda62fec2a8461a8c49f12fa905b7" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "c6788d8aa062337cf93f6e46e9ac120a286218f78c1e25281200000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "fff7ffffffffffffffffffdf0f", -"validMembersCount": 100, -"validMembers": "ffffffffffffffffffffffff0f", -"quorumPublicKey": "0681d97a2ddc998c3eed8eb873e065016133bab413f593d9c71e7257dadfc2c1d819ffe7751455b545fe7f49aff39c95", -"quorumVvecHash": "351cca32ad4b1d6e806ea99c8f01f722d0fb686cb4340a73f1cb4ed106c5ca94", -"quorumSig": "10b70c3a62a31da5321c559fd930873558b6314a66c13966a05a3a0682a8ce4f14a681e8a6cd0831548009e241d874ab0094bb771ea9d33a4700b790ab3567333e87307aaed4381db265b9d41c5305d2f719f68e6e47ed7d2c63e47b757a1a8c", -"membersSig": "17123538ad5bee2189a71996a37c65084d7e9a962e2072777c8a91a581e4c335b2d66f936c5d08a73f9c19719a3a47a500e7421329e0c738dbc9d470fafe7ba9d31cc4c8339ce8a0ce4364f5416bcb45132a273ed166c8c9f2ad328d270cfc82" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "fc4053ad0c0fa7e910ca5e26954b462099ce6ba94f6f1cb31400000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "fbffffffffffffffffffffff0f", -"validMembersCount": 100, -"validMembers": "fbffffffffffffffffffffff0f", -"quorumPublicKey": "974fb92efc5bc25cf7a1dd654e548d5f12c13761b68345d64d8e7e8c5fdf91251a9c9196f63ed7dcb8a3d8148e502a0d", -"quorumVvecHash": "dc601640ca3719e53dc795b5dbf0a23de1b51bc9b4e19d249f154378ffc7fb2a", -"quorumSig": "165fed277bbd1f7bf32119278278e862a8da0eddbf004e314e50f3136030bca5cdf5e5d8a3554a612cc5e6018afee8500826fb46c0ff81b93b2c7185e560c439c6febb34b41b0e60d54c85d084d89fe3292518adb10e5037817ee6da3617d36d", -"membersSig": "96873b87d51a2c1e00560ca2889257959e469457fe51d8ea7200c845570c3ef7b2276d97be0bc043818401bbaa0665f3013b4f897d40680217181226ef7e76ef69572c75a1c09c130beb6452e806c882291301f4edfb63208fb84e7c035d4e0d" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "d13ae933cbbe243900722339fb6ad9cfddd2185468c7635d1500000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "ffffffffffffffffffffffff0f", -"validMembersCount": 100, -"validMembers": "ffffffffffffffffffffffff0f", -"quorumPublicKey": "81576e6611ead8b0e7fcc403bd7c49885ea84efd0f9827d8a0b8df7e800bb733dfca4fa6eb1569f0c89f4162e3796ac1", -"quorumVvecHash": "a900b7c5adeac775cf386f57ebbdfa2e33499670728d154bc06c1de4da43ea8d", -"quorumSig": "815253ac12d0776419c973149d6d18f1aaa4f090f073c656d1402130d70ec427ce9394fce12ddc9b14787a866594078c04ae9d36ddcd911812ee5e538cd629ac48504ed0ae73b268b4dfb47241e4c1f8be06cf5bc327c6db036a72dc9fb06d76", -"membersSig": "0d38415b2084e3511dd64ec14c3d1ddb825aa181655622d5477a3a344f086712cbaf9b76c5694ee8c2906e4878ee18bf031534086a2da196dc33bcd2e14e3b51c5c9a79e509e8a9e062785e425f6352dedee09163185ee04886708e6c08bd5e3" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "b346fe53d2f5a4549caf10fb8fc49ec6b2643cdcb451757a1b00000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "ffffffffffffffffffffffff0f", -"validMembersCount": 100, -"validMembers": "ffffffffffffffffffffffff0f", -"quorumPublicKey": "811b99e222b078e385d27db581f73688f435ef2b838f0cc6c81a5789b242e066019c6509f4b2bc353f0b32e24e8828a5", -"quorumVvecHash": "56e1a22ba2fe4c9a48da54fd380fbecfa34cf3c75dfd7fea3b024f38b3f40904", -"quorumSig": "0c5ecdc4e91b48a9008c061d68cc887cb8d2ffc6753395de671343fd058e92c8eb8987fd43324a7e76f822f0be2a86d20098a3195218c8d80f58abc575569fc684bacbabacca2865bc11740bc428144f42b52735f57a3b34230ea4659a172676", -"membersSig": "0a11439f6688809489c5f9d06681a0cb5f9fbf06b10b49f444dfce89f36aa477642ef7df36132dc230dbbacb451a3c630b01a0a64f6a8e726751f78dccd6e0965c847cc8c531a95e470610b74eb73873fefa6993a9f63908312d4b793f61065d" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "6963012e22a225806e630b5a5dbe731819648062f9279f951c00000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "ffbfffffffffffffffffffff0f", -"validMembersCount": 100, -"validMembers": "ffffffffffffffffffffffff0f", -"quorumPublicKey": "03a3b82cda2ddf4636400dded44fd0192c3fe336382c97cb04fb9780566d678885dffa3f9b5f1aebb126056d79786401", -"quorumVvecHash": "a61fd0253e962158a958800b8dc803d42998b05bb34f37126f5a31c1e85dcf0f", -"quorumSig": "88add9864fba47f23ce945279d609853a10a10716e3d5ea8121fec51db16e7fb22f6ddc81102b7458a913319446faec8153c0b7d72aed658e4a4461a68868e455847a3db643e85cb4c7bec9a7307ebec457af1de328a010b3670542168a4680d", -"membersSig": "16e9e1ab7dd6d58f603f7728a19e000dc36c221e13a71464e974c8bbf767680b40133b78622436838d1055056ca4678c12ef1851679ffaf0d4f03ce30ca45e6a7ea590fc555c7462bccb196dfaaaaf84b0f2d2842cd11bcc9ba4efa364ff12c6" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "0c1327d6d00431dbdae17157866562dea7fda81cadc8243c2200000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "fbffffffffffffffffffffff0f", -"validMembersCount": 100, -"validMembers": "ffffffffffffffffffffffff0f", -"quorumPublicKey": "008c499a1c8de7f634194f5073ad7e9504d8e631daea165c41c9ed49a588d61475da97993b31673ac62d8b8f6fb36813", -"quorumVvecHash": "eab4e16f95cb8c18f9cbfae058a2da70df4604df2c5ae472c9231df25cd9c1eb", -"quorumSig": "855622a14669f306f6d7f31c1e2fc692434e6d1a5a168a25a5359c0d693f13fd596eb8eecb6a8dff3d4a6f92332d436403b211028f7bdd2203004cd4cc438e8ba7e75944b66a773df5aa7dde07d0a18d0a3dc98f1ba7660af024851a479ab3ee", -"membersSig": "871ff240c4182c7294d13ee0722e954ff4fa74e7fd918a66f4e995caf4834d936ba6458eccd501834180cadd346c797511f11922d947a99d56fdd7b5910a12ad6b27452892a554e868fb03fbd6f1543652d5dc12d84265084d72024d27f99d9c" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "0f0201e3e3bacd65199e6a28fc6db67159607ac187104d9c2200000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "ffffffffffffffffffffffff0f", -"validMembersCount": 100, -"validMembers": "ffffffffffffffffffffffff0f", -"quorumPublicKey": "1996eaa4d5adbfc3719a288b1a33b2028a7490ed435d4ae5b9660ad74510ba619cc660f3685b8024b179bdd19a04709a", -"quorumVvecHash": "7890217496cf0355c30c2775335e6f58d669565f489d784ac1bedf2d95a56878", -"quorumSig": "0537182dbfb7f47c16730ce6a405bb5c1dcbdb456e7afdcedd7926ea5a178618ffc1ba9f8486b53535e441bbe42b2ae40dce05059d7fb99e9fb31ec3e8391af547637ac870efb5e4ccd2b7155c249add02f9e3bac0a94ae723a26bd6f977332b", -"membersSig": "906ec4032a8c61b1376263711e67f90b0040c63e676de923695f4c2cc05d8280eea7c6e555b46045ac1d33ee7046093b0fa4f16b86df98a595e0983d3759f5ff62c48b2e3f894722be755fc1a30c8d70d4c983940980b4e0bafc9a30653a4e25" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "3d0e617f79bd1023706611aef8522258dda3e26bfcb8d44b2400000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "ffffffffffffffffffffffff0f", -"validMembersCount": 100, -"validMembers": "ffffffffffffffffffffffff0f", -"quorumPublicKey": "990b75aff735fe73c1ac2546afc18e9508a12a71ebea77cc587bbd513ccade5f824e045d63243fec71e788bcebcd6a26", -"quorumVvecHash": "19de7ec3b40e6ef1233a2dd787ef2640f842c00201346e25902958001c426192", -"quorumSig": "179c01edbec51b95fe072d6e470e13dd36b2b83a29d54691fe4b6b1c5fe4bf100267118e1f4c3f957a7fb6b33370d74d095a0bf9adb8f287fafd1733b28e6c407ca0eba20aa59ea1b189ff4accdc568914e31252039159ecaf6b89842454ca32", -"membersSig": "978883484f8d1ecad94678a40f341294a1411dfbcf86d780af9dc1fbe3ba8f5c3f860650264889a2716af754b598c78905b3af5a9d99bea58ede634dd3cc04d2794db8a9b0623fc432b9643b34c485c605968c74542d919af077805fcbaa3cff" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "78181d6a6762fc2cad5dfcd77a629e8be01c050b8a5f04672400000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "ffffffffffffffffffffffff0f", -"validMembersCount": 100, -"validMembers": "ffffffffffffffffffffffff0f", -"quorumPublicKey": "933c04e4fe69fac3e1d1d2614f458feddab107129ff2dd7919dc657d171162c6431f7decc1260f739ac0a2bf0cda869b", -"quorumVvecHash": "dce1019b0f08e918e2fc163aa989c345d19cbe827b9c475c6edfae21bd744aa4", -"quorumSig": "178c39823b0d4982a3a8ca3430f106a45f16e5179576ddb06e6bd98da3ea8c7002926526add72cfb70a8547a73de0dd415c4d5231db8b4e68e4d17b5cfe34185ad9b152e20cf633f7e835e422307c2845eef92ffa06a0e3ac5e9cc873d2ebb84", -"membersSig": "9256844dc64c1dcbae52f6a5073999707e2e11cf599511f7090f8b1aed77d4652b58d3065542740195937c0773d4c0fc00ed071d27fb100f036b85df953bd0ee2fafb5f81f1136ea098cbb39fc4a879f97c9c0cf973e3e59283778ca0c068c21" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "db67efa2acfca8ffcdeee1396b81bfda992c3c21183131ec2500000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "ffffffffffffefffffffffff0f", -"validMembersCount": 100, -"validMembers": "ffffffffffffffffffffffff0f", -"quorumPublicKey": "0a92bd0c246a44fde2ed495e56ba2de3fd7de673531cca62a9bb87614e9032f031262fc7decd89b30ccc813e6fc83a2d", -"quorumVvecHash": "2745f5576d25e7ad08c2e3bf2902b58b9b16bb763852330a9018e41db6a2c13c", -"quorumSig": "002bf56466ffffb0e3d2a12e70ea947e93ef73fa293b34e1f54c67c003940d3731daf19930ad122a372a157675e54dc518f6cec70ab96342e0926cfdab4c58a2d1b6455d016f5adb1baffb9c25e5bb63bb85c7c69298597ec2cb9496d75d675c", -"membersSig": "9849366a3707e71e02af41fbe309029ae628c1b3e9d266670754da4771251461aa02292470018b2ae3865b4a6860c9660b1243f64329e54bc78e8bab91d268f9e62c4f8c4f5f6b3fae4d157e805a7032e79d67856a3f603393bf331ef4a222a9" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "c8ddc7e87776191d5810585d1c32603aa31f30c4d05e19922700000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "fffffdffffffffffffffffff0f", -"validMembersCount": 100, -"validMembers": "ffffffffffffffffffffffff0f", -"quorumPublicKey": "15db4ae6894f67cf837434689dd3ef2ecae1569f4bc36abc0e774e16e1c6c0f57fd021c18b716d2f024a591c84a60f68", -"quorumVvecHash": "c0f70e94d36f8853e667ce1efb7643c18ad8c2ecd6641d4356e26deb345c2112", -"quorumSig": "12a0c22468fa189d9ac676c4244274e051acebd047c1b674e6117b461c47ab86da779db9c66cd17a30ee96c7db30183f006a8d8cb35e5b9ab01fbac515621b7dff1cea6b296df7ce8a55f00ef2e26543bae53ee74e9b1a2c0e53902609d857cb", -"membersSig": "19fef75e6a21980faa40847868c4dfe1e48a663dcc5730978244bc265f289143a7ff53720020338973ef66e9035064c30d8f62ba5172cee6418d31c7fc26a1fc3dc0eb55b2b0dd17e95eeb131ae4888652c5b17d8c8d9f422475ab36ef696d04" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "8b39ee652627afee59299cbab973e7e3b8569603b25265b82a00000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "ffffffffffff7fffffffffff0f", -"validMembersCount": 100, -"validMembers": "ffffffffffffffffffffffff0f", -"quorumPublicKey": "84cdb11471c25ddb85c574c567157d8a8cf3dc9f33ec752da51bd0755ba4ea65f6d25699b8affb78738e19c0ce5738fe", -"quorumVvecHash": "19712c684fd9fc28c180d9ce453db4f3e8581383caf47c43b27357291cfb1365", -"quorumSig": "83279f0bd2cc3c502d840d4097c8939f9c699c6d4fb7391947f3ad303890244fb7358d53ced23b4e0f548429b61a32671413068284ed1ab5aa45dae69425bbeee0d898d0fad8cc8766b2e96c275edfdfcdd66ee82d88ba218fc973e4b437d4c3", -"membersSig": "13133b73f964d85693eaed45e6f6b913687cfa3147228750af28cbf81fe216b5f93970c5feebafce67e70ffccba51392120f8b76c61eeedb755a03d7d39a0608a283f4cb07a46f10e2b47765181d140011d6bf4e40195026dccb9227ebeade36" -},{ -"version": 1, -"llmqType": 4, -"quorumHash": "7065bb64f8e2ac3bd7112cb638af6d64c174637200e340512f00000000000000", -"quorumIndex": 0, -"signersCount": 100, -"signers": "fffffffffffffffffbffffff0f", -"validMembersCount": 100, -"validMembers": "fffffffffffffffffbffffff0f", -"quorumPublicKey": "00d4f3f4991e6723b9ed3f2cce596717c4a7d49681a3f90e27718f26bb712be6072845a4815212f0f8b8b42ea36010fb", -"quorumVvecHash": "0caf6453b8b6becbe22b6d862fc2092660c95fcad2a3f1d01948b37f9e068f6d", -"quorumSig": "80cbb3089c9510bfcefb39c427033e0eab9b420699fb446828fc7058bcad6bab953d7e494000f24b79246e01b281e9a913d5c440479a84461ade6e50d47517f0932c9e479ae885a6d22c9133982fb7a799ce881cdf6c7389e16643f2899a6d6b", -"membersSig": "0668359596f6aaa582cd3ce677a2ded0ce05a29559d1878da66d9a5f2e59a5097946517736f4fe95c5ba474b550a88bd037031ca270186394a17a40522b118beb210faa381bfecfea44d13588efdccb18069db63e70da3e14017e4efdd11bcba" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "f9ffaefa682524c475f7e0282593686fafe6e63d93eaea190000000000000000", -"quorumIndex": 3, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "06265a1123a83f14274cfad284ca734304dcf99d537443f52c182c4f817f29c03ee1736c8c7da1c2cdc5b7952ff54d08", -"quorumVvecHash": "304e71691b81e71e29c3338ad94b1ff0009f812682f853e08d2d4c4457375957", -"quorumSig": "0e7650ded46d35c5f12c183365452d64a08e9719381562e4106ee2cea6682be8dda819b4f0a9352523889400d60959fb090238c73f7e188fb99d9b082d342321381ae9c9d5fce3f51358ae4af04183f4dbfa2491f9cdb0be2015cdc268c6ee40", -"membersSig": "9184b082842f9fbfd68507c483c029a8816da99bb96d545b8365dd74ee15c832d57e0320525f06bb57d44e68a2c36a121620e8e41ba9b5a9a94c271e04ea8a338b4eaa477e577b2cb803dfe053ddde7e646964636f041ad2d41f81b1b2f243c8" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "77287e054667396b514e305885332dd46474a1965a97cc070100000000000000", -"quorumIndex": 25, -"signersCount": 60, -"signers": "bfffffffffffff0f", -"validMembersCount": 60, -"validMembers": "bfffffffffffff0f", -"quorumPublicKey": "1062b0019c7ed55612ec49dce24d74472e669cbfa614b4d275df1efe6c2b5042cd1e5f4066855f2f078852a497a62a26", -"quorumVvecHash": "d7b4abdcd9982f012d8ff8d397fb94773219eb90939dace8ea63601a138c365e", -"quorumSig": "89dabd6fad6b07b3d1f79fc2f20d98c475036605813623ec35e5d2fecd16a074de1e0b047e217a2093b9642997f610b91654d7abd5af1864de519bbec9e6dab0372aa9a8d9404a34ec190fa8d32bcb8cb0f46e725c53cd7a87d7711bccf46356", -"membersSig": "13e767181912cf331f3aa51db49a17025ece1a92c943afdb599a06f21d04881519f96f53d0864fc16d05c8ca50e2d9c3116aa05306cd701218d22df3ceb8a256c2fc01e6bb84c4d3b02f968b1d0522b3ce301a1884c145f45e80c0dc2180f130" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "d3c3cc262d18121a3f82038b8c3588e855523fae710371950100000000000000", -"quorumIndex": 5, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "874698dcb884a0c91ce7e703fe651df19d66ba709c9497bc68d3a12ba68264961df93534e1ef43ba77dab3ec2dda6a18", -"quorumVvecHash": "6c66f9402fabbff18fb4cc82095d6131afc50cee6245d85f383f34e428bc9589", -"quorumSig": "0f7649d3866d0d48b55bae74e420a46d4363f459ffeddc49d210af2f3d2d6d0af5d50f95f271993950d9ec630c17611115b5724a438280e2b08c4b024881cbeb346c9e7ca64a456f1a1039fb33bfaf927543b4e5dc0d40c892ad398bede327bc", -"membersSig": "976d106f9263370da17c54c232d3ea2e4bae648fa1e11897d710c2041ea872d794b7371a9a62995ddede7be4f6aa23b7121ad8f3ff8fe07d327e8298b37861f20f6ca75f33ec1bfa9f3d9724d75d5a252bf87a7c038c0286b9328dddb6cc0984" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "e0d2bca3ce707ca454e1eb293479f6b1f68c00b67e612cd80100000000000000", -"quorumIndex": 7, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "0f0e8037da38905437d123acf6f6e17b14dc49b4d6c0c377b84e7482917a5304b1a878b5e35215eeb1979032e7901b37", -"quorumVvecHash": "65827a17fcd06fc4904ce37aa61720e574cd2f3061d2274769e55f5a2f79945f", -"quorumSig": "955f52321125437e0cfc0da655e24009596d558a4adcfa4fafa137639bf620737f500f2b5c7deb2baccf1baa6ff4415e083fb7c148601911c12f33183d21671c8d73e9d38aff521a96fc99c4750c90a68b9e991ce52bef997602203f0ad15abb", -"membersSig": "91e0b096d75b6c6aacde92df272228528856376db3c0ec14035e4807909b3553634703460c294c8091a329beaa1cf963034f82e1fd89197c953f9bd12adf8c1e623bed5836be4e0aaf8333e3f0fc9e15f8aed5d46c5c008371f84ee067fd38de" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "8a5d60ba7318ce00a6e6899b6193056126fc82eb9e755e450200000000000000", -"quorumIndex": 29, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "91da75701dadd2601617694f32e3d3d872b8b0a5e475133ec3ce1b90613e2a71fe77f4208cbad7e0f3a277abf561a900", -"quorumVvecHash": "cb722e07008f798b51e32417c1594887883fa07c85cebed6b7d1742f7bcf3ad8", -"quorumSig": "9502f18a2a20e592e9bb9959e133efd6f0f112dd65839ba34909f69bde5548614aeb45b98fe9e52499ece6ec7257be6703d3966b394d31dbab589bcc9182b8018fba9f12cff2177f72773cc23ab852b47ed58ddf9e1a2519a1c06a1e96d22d80", -"membersSig": "1830ab9df683df56237db4f2d795eab3b60ca21ba3d76e4e123d02af2f735244ef7947f6c24027909832a3161260997f0dd06f869e8e5555aecebf7d3bc061a902f2d015fde37474f197cfc999fd672b27bc05afe9e12beb7e47a103e811b60a" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "07144bbbe1c30281421985f3b532051dda75baa6fab9cc4f0400000000000000", -"quorumIndex": 20, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "9031ca4f65c02bab191f3bc4f401a2c80d95b6875d4d7aa3786da988d9e8aeb7e18ba0050d34eaa757948ead3821b558", -"quorumVvecHash": "6d2ed6c0925140cc9bdda49bc62edd327f8f46c78712b2abc59a56a0b413ad06", -"quorumSig": "19250552369c9551b04b350d0b5ae03d61849781a11f66d3c94277987f6ab960ba158d19aca34a0d5b93d1f8819dd005183363cdd09eb8cb421b2f7e843d29639e906f0b569e5d921c694b92f938980b4090b4b5a72bdf267239ff3078e21c4e", -"membersSig": "002b85c9fcccdb00f258e1020441e0f26df6f22dd29d1ff173e803e5f8e07f1e6b6e9bbb3bc683869f774be2d9740c2c023e693b421ce2b98f05013b9c5ebf3f8b860c71af7ef2e72c70c897eb70b048234f906832b5476fb5fdf569e6cb5046" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "bdb42d08b3580f05ce3b20cbeb9edae6a33c1e3e57ff3ddf0600000000000000", -"quorumIndex": 16, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "9075071fce80ad644c147aede40b0ed9d3878d286c333f4f5c68f5bc4c716aa19649a70a770555a3f2d57d56a19a8ac8", -"quorumVvecHash": "5fd16e2f2f438661214b9690bc17ae7f8d3f5fc815608c94878710b740cb1c9e", -"quorumSig": "91b872bf8c02449d52dc57382586db33db02f657faef1e164ce607584f0261f99700626d323de61c76e10562340874250dcb544c85f21483f2f4f757e01a8f701ccdead0f43ba8646520285d81525537e875ce90f37d0d61f2ca4efa8ebbdf8a", -"membersSig": "09f369e106dc3807e1a62163863bb92271dfff5cb56cdeec553c054b872bc34a1ee138fca01ccba071b6d02bdd414b8a17cf5eb7849290235c48ae764ae036624f3cd1e0f811e942baab7c1951d9ea585a17286da094df611c98f20bca8aab31" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "180131ef3ba6b574eb363cbec60c6322d85fa6c1961a37170800000000000000", -"quorumIndex": 13, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "0d4c6fa856aef6127fcd249cc28ba192d49fc82e32dc52a21c424290d9e4af5da1222dfe3e5c963377de5a51d619a44d", -"quorumVvecHash": "14d90c2a3de5f42d282f733e3247f5b8ea4eecaa0b4113b54df5ce30e4af38ff", -"quorumSig": "0800d234c936a4f8eca999487d1c118a38ceee1d3ffcc593df91bee396ab9e20a65e18b0a26a352112b5aa12e4570342075efae013ef335e30f07952ae2f85a784fa71b605ed8e0e5d14c3bca98ffc877a111e504640dc61f55d670fcab1fff3", -"membersSig": "0f7656fc3c8ff92b3b7777b182f4d168b0e58f3fd553fdfb986a7460bb57a468c5346ded0c20a1fc2ee45e5eafcd26c31182a98693f5b65d5eacd2c01a67517172234c7faf40fbae097a964babcb668c0064f4b5994777e288e7b6d6104d6b55" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "445118f918872a8baf2be4e4d01d1ebe36aafa205a77d1530900000000000000", -"quorumIndex": 26, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "92f78eb6d9665fe0445b827bef16de70eca3682b5daf886f1fac09fe20872c7c05d43b4abebe13125cb4f21485b0dff0", -"quorumVvecHash": "81e68937c6de7ec9f75bd5282dabfa9939fceea23467fa475ef68a85ae89589d", -"quorumSig": "0510c8f4c8b4af1978ac563f28e690ff1fe012f0efa7174eecb52335e1d7200796e1a7ac38ff71d4b94a4635787026af0548741d896248ede8a2942e4c690f3c9a47d909c16cd1c1b928f2add964be9ea422a378b9912e1782e10111f3416033", -"membersSig": "0bc103bf5044ebf2ea7cf675abac352b69636e318a061b1ae28765d3498ffcb42e2c2b0a6886a897dc1abd57c5420b510bb655bec4dea812acf12732fcfe708ddaae663d866e160627167fa7190256cba8f36ebc07b5952837c0b3248e8c4936" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "3c452540b23b4994edcf828148298df3f406db652cb9f6120a00000000000000", -"quorumIndex": 17, -"signersCount": 60, -"signers": "fffffbffffffff0f", -"validMembersCount": 60, -"validMembers": "fffffbffffffff0f", -"quorumPublicKey": "180896b2bb993c955eaf8673f06b23a01273046e293978cedb3f45989d55bf369b2c7203051b7ba4f5b119421a7c40ec", -"quorumVvecHash": "d166020aefd5c931d9f7ef6c19405358062e3d87e7e01ace8c56570069388e7e", -"quorumSig": "8211c36ceaa1fa55d9db0d4ac701c6eb6fac412a32ab195e99fbc12bd5c987fc185befac5c01112e337e9150b1d264b50d158a54a162c946517dfba02cf6ee9677c0b19665617126f991c59831e89aa0c1d4dac0b4800f5373e01f040d386f89", -"membersSig": "0403aba9c99925d3881d409cea7bac837081710f527efc1392b970f2016b3bd532aa985d59ad36c0b6bc6f85b9e6b40101c5c9d01247941be7d4393aab86c80e3768b710893979916e00519c57a71e2e9421e06f57fac01a21debca199f60bc6" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "9b3dd14c91cf3e93cf1e2a9a8945d5e8565a38448ddc1efc0b00000000000000", -"quorumIndex": 19, -"signersCount": 60, -"signers": "fffffdffffffff0f", -"validMembersCount": 60, -"validMembers": "fffffdffffffff0f", -"quorumPublicKey": "08d2abd23525688bfc0b5cb8cac761e11871ecd20f2dde88049c2bb59ecbf2ee59bb7a93d3a4d3c38893de7cfcfc07e7", -"quorumVvecHash": "42105fbc55ec2ad6c9cd7ee69842531c6ec6b9ba0568a4fbb6daefc3bcb343a7", -"quorumSig": "8d2368321957b30bb05f7723d2c8d58ad5112bae1b5deb660d7e923fd25072c48e635c816815fa9729b799e9c4a066b70254cff8097acd5816e4deb7b9e48f763b4526499e8a01dd38a3b979a38d8d5ceffbe0e6e2abc0986887a91c393b652c", -"membersSig": "0acd6b4d5fc1071ce6185fe82a596f3e87d8e4aefe1f94be2f60c58d15fc5e531ac98c3eb4b4d0360847d6fdf945511918b3d4c78e1a59f4a04ceab5ba1ec740538847158cc6762235ccd9b7d078958529481fd6926ab1c0c824915404781f35" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "bef552227871d08f00b0fd5e29a9183cc28d750beb7bf1ed0f00000000000000", -"quorumIndex": 1, -"signersCount": 60, -"signers": "fffffffffffbff0f", -"validMembersCount": 60, -"validMembers": "fffffffffffbff0f", -"quorumPublicKey": "1753dbe925e871a4f53c981ed5031ab763db45e5b5f46e9f127c5bab28e6949640290d0a0f17afe333c0daff7cf7c86b", -"quorumVvecHash": "d719aae67ef0e8acfc802fdaa8089d367cf907db4c804fb7b2152e280dd8c9a4", -"quorumSig": "8c933cc9324a3b3a43f4f8d52179a68b6df666adfce778fd6784323536157f940af311c1925eea5adea2ddf59c2f691a12bcc98dbd46e86d0b1529d156d362269bf7eda39c929c70462ecbbd6335c560433ff5c467a024923666f92728d4e833", -"membersSig": "12edacd142168bcc8716ea4935f99a21d61a23946d94d20930cc26378780ac2929b51d53efbd7db249408a8995e8a4da0b730a6e8d9f6723022138efe049091df2260c10d12211a7eff3d8870ef23346f32d01f579c326704544f7a817cd0fdc" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "51eefb8c7f271a270022889b99abdfc75978c734c742ba191000000000000000", -"quorumIndex": 12, -"signersCount": 60, -"signers": "efffffff7fffff0f", -"validMembersCount": 60, -"validMembers": "efffffff7fffff0f", -"quorumPublicKey": "81c0202a784d7025c86d36e29e0cb75dfdcb4cf1bb7aed6bbb60b3f4b617f31c294278d7e54422beb8d9bb04cd358bfc", -"quorumVvecHash": "ff88b139a9a3070152bfaca37bc3c9dea855fd080be28679d2205a2f1d0cfe60", -"quorumSig": "81e7649ce942c9c1f0c12e69c548ed29d562b5625dedad3d48c6962d0215ca439d221c33882a28939b754533103d29de19a94ea0aeb8d03e880dfac7ae3b76362d4cd7ed28a1ebc8c0e4d6122721446a4711d35e56e7f96c8c814f20b10ad9ee", -"membersSig": "0e6e9569afce870abbfd1dd419ebc3b21cde4cd87fde0efe299659abb12afa0a8fd77f0e21255b123ebd00015711c1d016f352008ab78fc2813023bac7b8cf7e290b683ef7ec66cb2f0ba95d799d7cdb40f7dabade0c225bea0360f36dfeaec4" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "6dbd6afd6bfa6a672bbd250c0ba728d3c9f6bcf407dc5fce1100000000000000", -"quorumIndex": 2, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "98ec3ff70b997628912e538fb7eb81cd8027bbddfd3fa678b2c6f2ff6ba63906edae6966a5b2b5b6192381a4af5a118b", -"quorumVvecHash": "b745a9c4643198e12f46cba9ed3a09e3b3eb3c0bf3f598f105924da73c751742", -"quorumSig": "10efe6d51f9d245650ba06a3d52eae61dc4f7d5e3be1edd23a89cd052e5bcd925ab25fbab921673bc032bbc7451db6980988eb318422e60d6f0bd0df90ade63e756008cf44546373b3c5b8f2df7b79488c411a65a165b3d8d67d0ca435e031c5", -"membersSig": "8e4ee5505e09c264569e43d1f19490359f0c10a89d823c39286de73ca2217cc02d2298f0e84cf7488452fed4091ef21016ae4bfdc445f636278455ea1131faa149b253bf2d106c8f402ea57ff81840e6af13cbc3ba46857c5ca4d162b7aba8f0" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "7f2e2bfb7c4da2a0a4649a28997c10178cd8ff14265e2e571800000000000000", -"quorumIndex": 10, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "1060227badcf999caf2626c8684e50f857f2c752e3713ff69861cb433de2a100de008406f9d0cc4b56b09c14bc0f9e58", -"quorumVvecHash": "9aa615c6fc04e055a5ef7c031e3f7c47af6a01f0691582048ec7913eaa4b8fb1", -"quorumSig": "161a3f9561f5bcf20fb3a678519507bdbbec70682a5a9b8dc3e8c91b5d16c36bea0220c3b506bad38a5ba82933fdf06616ed761929c753063833460f9da011892713988d4b9d195dfee877351ec6499e7ab800ce9f300bfc6fa559159cc24f1b", -"membersSig": "0bd03001f93797bf353b47936d4e79fe7fbfc8d5f37e0fe66cbad266f0b094a1e9011c886614fc0813b316831ae7a924086da3589859fe0dcb018f2f87931ff191e638ac2cf6f9317d275f4aa18503314ccc79cd063d43f636731d57d861948c" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "cf3b30431f763fb5dc3a4ed7de3785e638915cd97ceb8ac11800000000000000", -"quorumIndex": 11, -"signersCount": 60, -"signers": "fffffffffffdff0f", -"validMembersCount": 60, -"validMembers": "fffffffffffdff0f", -"quorumPublicKey": "0a054312bfeed30acc34953010361132901000aa54e4cf3360cfdf2bab7c998726e12af75a5973702503c73c613ae481", -"quorumVvecHash": "2ef145b72afa8a81721b14422a6deee6fd5ddae625fec6fd7700d0ba3c506b2a", -"quorumSig": "165225dcf4ba7e98336affbeffa78a5b826c3e0e16a246e104946ae752955cd5ec9abea10ca91c0179be2190def845c61593147a4e475e2a539330d7dcfac209bdc83ab04b1297e0751275789d4f720b842480f4a394495b06375b41fbbf19e9", -"membersSig": "8385eeda163b90b58f57142d1a5fc410067c7896d0183f42ee302ebd45f8139d50364d141ab35eb26374ed97fa20ee530c6b3f619d8f5cb2c8497ed01a2463bb6e4beb54ba824b76d8ec0b00fabffa14f08debb822fb76624fc28b72309f2237" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "157e4095925bc4eafe25c5a0a451e34f3fee94daf6f977ca1900000000000000", -"quorumIndex": 6, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "96f91a4ceb6059eb8059a075c8cbf8073cd13e8bef36e60184bbca8dd9da3fb6319319048f87524112a9e44447a2191c", -"quorumVvecHash": "9555f5b683090fd23ce58904ec110583dfbbe979c45a431573d0176d6e015939", -"quorumSig": "84b982cf58e4ef08d9178f7170b99a160163901e4f291ac05b5ac273e1aef7bfc61fcd0970ad958826209e8e7ec59d610bae475b50a5fe0d836897d0c659dad96a9635c1bde0e93ccf12e5f49e9ca10110d487dffe01c4816c180e5e7faae1aa", -"membersSig": "09c7f3e656417b8e32a13e33ff5b2d8f4bd2e940867044fe2dd213162d9808e78094fc4d48fa5331d2a8cbde16e4b42b003bb4f3f0b211d29aa1271f8582423b32e03c26d8a9c1743a6d53e6adcea3d01d8d42252974822e83f7cf42442fd7bd" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "8bbee42d2450777b36882c33f6770102af7ff726181314511d00000000000000", -"quorumIndex": 18, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "88061370cba1e040fd568e3fe8bbe8b38685675c3d1f17c761868f30499f55e24111c95f06542bbaf46771e80deae4eb", -"quorumVvecHash": "1a71a1522612218107a8841ccdaa507b6549bd32a02894f42e6b9e9dd51fe1d1", -"quorumSig": "9609cfe9f400875a3d9e646ec3d22267b411e46e675fadf869081f088c2916a0a69cd6a38d3699a0b424f7ad427b0120128b8dedd3167a3bed73d92e00713326f3f9a6b5ef07aeef607edfda37f1d6f1e259214e8d1f51e8e2466644150c6049", -"membersSig": "1086cd63bf926087e27f4cafe50da58ca419ba187b83400315cbb7815643d007f4bdb74b192fea4e676890e33c198f3a0d87a962ef70dbd8088e830f5b5e2d72569e07c43abe71714cf7872ba282cc5fbbf00da420ac602be276fbcff065db5d" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "f73ecb41e22ec9e37d7c20cc41a6987a74c3148b8d3bef111f00000000000000", -"quorumIndex": 30, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "1401f3bea4715a79d6218c00f1142798e69acb47c0aade09cb2ea74ae7118fefa541266de6a242be58f88674eb19c014", -"quorumVvecHash": "336a72f9f590612d73a95d1b3c92945e274d8fc962e9113f7eb3be44b813c7ca", -"quorumSig": "89d8d9b87d97e9e716e579d3e29fa440774c3ab7a986bbb38b2418b4b1cdf1f379dd25e79dd02f34aabd9b80976fc6a9034a6d03348f97c3f90c6fe448075ceaa7af2c92597c3fc5320bc598ae264717501ed34398e77f0e1084390ce47cf84b", -"membersSig": "0eddffecff50923a00e9d732750859aab2ba90d62afdb7c9df091855da7ec2bc733c00555ad3085b8201a79287512a8e00db4683c865a811e0be28821c2c4be7b557cd7b2a1dbf601c66a4b1b9bcefbd5e53ab203dba0bb2c1ee2b916c0ed46b" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "838faf2c925ba0e44dd669b6a0729c9eb30d4a0e4b75ca3d2000000000000000", -"quorumIndex": 4, -"signersCount": 60, -"signers": "fffffffdffffff0f", -"validMembersCount": 60, -"validMembers": "fffffffdffffff0f", -"quorumPublicKey": "96cf4519cdf1007dfe3dee56de2f8142d487d5f17647d454ed589f88d3b9d74bd3480e6452e3c00522d0be9ffd43fb12", -"quorumVvecHash": "e24d8735c42b33c0ef62b66a2d9c7cca2e9e68dffef531c8ee53d482f3df4a18", -"quorumSig": "17c141aae1e582cc6cc1ac47d1e634fd120458ffed2f89c7bc9e5b7d7285c97826bf86aba9744036a3f560c7811cae4f11d39bbe60a93d9252821f98107a0d3a6a806ed64caa19c43749b22771d3d5e9277ef21c713624ffe691d6bae3b7a0c0", -"membersSig": "08294837f11ae156c14eea1b64a00700c6e40d8672252ca46f19d0aa16e60501b64a9d57e632e5ddbbf40abf2d6f171e191c1b71702c4a50a7a93c366e7fff304097c6d8bec906922abc05f3251ae3b3933847a589fbbbeee64a42f2f2914a66" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "98587a5dbee3a973e703e94d90e396fdab927e34d8faab9f2000000000000000", -"quorumIndex": 21, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "04b0688c0f31bf0d6a8ed35b39830f77e3c4763a533b80a4b46d57108d30e1979c7c6b4e1f0f05805dd7d1a06c9d4289", -"quorumVvecHash": "b40be6dbdbde653b49e831bdf1cf855ee3f5f6b0d94a94f932b752d1b4bf6aca", -"quorumSig": "13d676a470f53079ab31127da12a63822a803690d6f1981c79c6da250af1f232888252c6b36ca226a119ab8222ad4ee40d0c611ff8ec2de51b6e8cf84be1fa17cdf1c67d51ac642f1fee1320bebb58ed6c3e10bc19911eddc883c67dad22b7ec", -"membersSig": "81b301f6555a39645be4a5a3915497bad09c604f6cf856a04ac2dfde7fd856f92c98adf138764566178f015b7548c9f5043a916145614c4b4462c8f5087dad442353bace2a4c2578c2b01c1f9a3e09772277b4d70fbfc928175c4ce7f6895c95" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "54825db4fa453862078096073dee997c955a77dad47a5c312200000000000000", -"quorumIndex": 14, -"signersCount": 60, -"signers": "fffeffdffffeff0f", -"validMembersCount": 60, -"validMembers": "fffeffdffffeff0f", -"quorumPublicKey": "89736b47e435b96b268a115107dc0c28491d4074b108cad7d7585f3efc2a94a056939586ed7b62872cf5fba9c8083a0c", -"quorumVvecHash": "1755d9f9c8b2b329cc33d4f09999b5cbd85f65bedbfd0f327198560d76d26a22", -"quorumSig": "82f2917ab89944be589653a2218a38a64be15b3558b6f3caf7304b4fb4d8031f01fbe5f091b8ca60243e2aa736c53eac0a568d8d3824d43a9f80837c0c0b97a1e46826b2b3b1a17037ee39eac5ddaa52a5a8c71cbddbdea9343ca20f349d8e1e", -"membersSig": "020c85a0a289ddcb2aa501750a8779100b02c86a8a90b68f40713f716e33596de1d393116db22b8f5b7636abee96d3d719dd4ae53159f4f5f1a6efe807b74c724f0fdbff2d9c7050a8c679b4ec8c9c9e0f822fad047adb0f659f0b772915670b" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "f4adc599082c40a533b291e605297ee1672222cb07f982cd2200000000000000", -"quorumIndex": 28, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "938609e34cad70d127806bb0c9d2849437b1c9308f46089ebd33ce990e252b65c4494ba0325bb3320731c14a27c4c023", -"quorumVvecHash": "07bb4aee287afc6b0d046948cf70fea1a66ef02260a4cdde16e13f7f73e2383d", -"quorumSig": "146126e400a06995220a97df2213e5b98e83d9ae51de8e06718561c1a7b317f58e288d6d0e7656397581a099e991fa0e00d887de5cafa9b6e0da8cd68c8f30d2735af76aa78ffa70b05be23c2552ff4ba8fbadd001f7d80ccb4e0f915272fab2", -"membersSig": "0fb6cae15a1eddf0a750c2e8036dd9f6941bf8e574422c6670b472fe579e2314a44b7e283d297e526d0a60a10e9398291851fa08f54e7da0722e9081f9e2ea05d64e7dbc8a4c78e27ed5517bac15fc0866ac4fb505de916a12c7958ac4475815" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "3d0e617f79bd1023706611aef8522258dda3e26bfcb8d44b2400000000000000", -"quorumIndex": 24, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "076b4031c9b44612155c744252d1905a99343c2856edee8ef00eef4d8ad9e743611e2edeb1ad5e4788bf7053d73fe67b", -"quorumVvecHash": "78e5cf4fef094909cd8bc985bb0ddc96dbc9a073a18862905bc396182be21d86", -"quorumSig": "884dd32aa9c75b29a57f91607c816bd217a2b48d29757f6df81c16b4a16c5d1a2c0a0d1ddb8dee5a904d1953c9955e2e18c1ce5b528ad7a0af7e16ea981e73e9ac773f8979321b15a273d3f62d18d13d0a83a6f1724eeb4cdb559dd382e6d47b", -"membersSig": "104ecd7dfb74691963903280b57e7fffa0b76c19929c4fce7f2a0f0313416e5583a12f0f5328950482b53396e5aefc220cc62cbafc3135146007a9c6e07b7d9f8f31621b455ea17d58da0de96b962cab2b073bc9ec37f9979390b8e37e4e78cf" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "a967f385f5623527e7e28886aef5fbe08b404de9999c594d2400000000000000", -"quorumIndex": 15, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "99f69193d3919411c92ebc769ee1b9bde241b33e1d18ec759e41b9587ab0d1e262173d5034282a0459cf78a58435ac42", -"quorumVvecHash": "83ce33d9a74cc6e825d989372a65f6b4628601000d22ac636cfd0888b3ce9c2c", -"quorumSig": "048439a21d160c13cd61b7fd8749ba3a4355bce66db7372f604c7bbc9d001bce8ef85c0ff920be01861d261c2ca521660bf31f509102f43834f2c9ec3ffe9d9fca377d617a782664efc075a760f3ea2b10b5a36d04f89104983da9a2560313a7", -"membersSig": "0bba85e947993df6076208a4fa6e3230cb2375dd267f415db7217647a3012f7fbbafbe1f45d010ca782ff26c4cd909930a6cfec1e6b38a0baf5e7183a7e81e11a6c0f7a5e23fe46c43b5b791d86213c6ff8151db004cfe07dd4b34808919d3a2" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "46b2334e7c6bf4283119998a24426af47d740b18dab530c62400000000000000", -"quorumIndex": 9, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "1612128f8dd40964404925b0cdaf1f4b9099d414bd9f590f26a94000df867c05fda30c73326a1f28068f5163007edb2b", -"quorumVvecHash": "e83a2c3cdca31bbe9c1d5fb58fc62e2b16a7458ccfe4e55cccce2c23c16252a8", -"quorumSig": "01d33e172ec0d28e1b6d6ad632c4f681c35a12d4f7b512e81e65ba8646324467cf97cda9170de6dd33a78fe64d85512406929692dc6084cc27e625b3bb92e10e543898db7ed839d73af5d702602748fb4e4b69858f172520c1903e270cee5648", -"membersSig": "913fec4e2c7fa4caf1997ce9cbfbde461290a5206ed0e07402c07b045b1b08b5b4fe24f31d43edcde7e08f477b36ef3a06f8df144656a9a57a9160625b46d255a47e971985b10ed6b1fc671b557768a590c2936cf55475facfcc02578bc269dd" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "28baadbdef23be43fe8f39072ec845b0cb80a54504cec9f22500000000000000", -"quorumIndex": 22, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "9405f8665f5da157da194d1465fb0d9f39e36c54fb91ad8e7e07cce487b674e98ea261358e465eff2b2542b297c9a119", -"quorumVvecHash": "5ac94f7dbeb3988eabba32495d18c6d63f876542caea4c9cba820c5fbdfe92ad", -"quorumSig": "0aaf1d96476604c52ab3faa835de28c9f21383a6910bd8644653f57d1a1c78e59804cffe818508bd68e54902c9ee1f610c26c392aca5e23b77d9834b1889b4017a81d886a81484cda23cd65fa87a42d31dd924085fa48fd803f007a6d2585491", -"membersSig": "80e87a67bed8940b5b4065f3ba3e2ccb815b0889ba70f62962d8a59a74e4c261b7ef507bd593a5f124e6f5744af737a50835edbc799e8ce657b794349f53463c482f6c9edfe64e5821e413a1e86381e0fa13731abb9e6e53785d62c6bd7fe0e9" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "a987acfed387914d9ce2f01d37beed746c305806558c026b2a00000000000000", -"quorumIndex": 23, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "97c33768157f1ee2e09cb530ff64d2c070e21ba8df7310ed5659f0411ad11d4a1150b15fd052e77b51afb49219130d5b", -"quorumVvecHash": "8136255196e95c20651992f0ef11703baee5905764c2942e257db03b82b13601", -"quorumSig": "8b82e144feb4e6c26f853b43c79e7903859234e8d8a149086acb632977f210b5a32abde9dfabef087acf513f877127011638e35767c9c6fdff15e3a12ca388e38f47bc016700cbcb270e40fb9ebc0a0834ca66e6f0220867404f4ad336524979", -"membersSig": "1381ec33a058f6d5cd9c61bf2247dffc8af8fcfac1aabedd7a9b90e2ce5a40a1d8a83edae7833e6c9d1e2abd1d5f8e340dfe5bcc842ffb260c35b6041e1faec30cbc92381ff8ad886a3320e768be0026c630d7bc8a379caea47d9a62ab085f61" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "1f395500a71826b771a7ecd62bc2abff04b61a0957d169d62b00000000000000", -"quorumIndex": 8, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "8082e443bf2e41588b0a7cbe0c88a9e8d193afe266509710c1c872485ccbf81b8b4237426c1c5b80ef7a7d8a96f1d463", -"quorumVvecHash": "b49c8262adef601139b26829c4d4f57fcf09528f478daad393b2baeb8410a002", -"quorumSig": "963899dcceebea464e2f653ef4e85efba6a8e2206512ca2100f553bc01037eb91e4b7ae95908d1a7e663f1c4cb4e332409742554163842388f60d07442bef3bcc7f0b1c8e82c876b58f3194a6b7ca9330f83d4da6ad6a65503857d55b320a0c6", -"membersSig": "1501819786eae920cea63fcfe04284b182df5d478a3d71034e495029124dbe9c6e298d6af36ec28559d01717bcd5a69f0bc03f03a8c7880dd6ca1130d186d3d195e4ccc179c1877232a05d0f368e1e36b93194c438cabfd9d65435c9e83d1917" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "ecc5984e08714affebe83ccbaad2a8d29c4321414588ef322e00000000000000", -"quorumIndex": 31, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "0c542e4c3b5d5044ad8abed70a0ac21bbb1cdacdbb0a8ce57fd36e42e1d7d2b4b030280fbe61f080cb73e6d4f6a2cf16", -"quorumVvecHash": "30e8858f6d401d767bd2b318dd2e90ec9190839ba2d90fbd59818deda0f27ee0", -"quorumSig": "8b9c4c7343ac41a99c162b014e8b9e69449b25acbbdc63ff0891db63fc7096478c60e7aed1aa83d1c804605c32d33f8d19c72238009affe9cd0f4bcb7f5e92726c107b6c7ab125ee614664fb37c93e59709e57acc1808fe78082b1b537efb30f", -"membersSig": "93d85001d7917ad7c6ba3086a4a3d096af80a0c817912f38b12bb43e425e0adc8f7745452800f57ceedc0e36c8f4db5008508f1f920d0b5c7b92c97dd63cc64730b2968b75a624fe95a6cc078f5e1445c41661d1a60282c7b13417aa7d65ab9c" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "7065bb64f8e2ac3bd7112cb638af6d64c174637200e340512f00000000000000", -"quorumIndex": 0, -"signersCount": 60, -"signers": "fffffffffffbff0f", -"validMembersCount": 60, -"validMembers": "fffffffffffbff0f", -"quorumPublicKey": "1556fe79cf5f45ea509ace5579496a200c5f0c1ca7bbeb532dd8dca0b1b263da4bb6faec947b28846a3fe02552fd72f6", -"quorumVvecHash": "a70532187fa4a9228bd959af8492702e3bd0da60dc9405b52a40cbaa36561b20", -"quorumSig": "0861a5b615145ff456477a859db0a59920db1019537b7e9dff31b1e8ce9e2178e289b203a31d7bff673edfd86889b8090d860cce6941470cad83232d90ab8526232b3f3efe406e49872492915a7a1c791cdbece785c780dac37c44bd06681d64", -"membersSig": "02a24a9e144ca2737e32e449c5fe15fbe003be8a22cfc2b44d24da72f9a0ad366b7de6001f79bc7819b75f85be214b9f08eb09a1c4bd293ca3d42ddb72923dc159ec18178cf16a9363d7817d6a7f2a641c83e62a30ea9e7ba6538a6e3c64be7c" -},{ -"version": 2, -"llmqType": 5, -"quorumHash": "5b8d1855867d8c20aa510acdb4d64ad82a6cf1b38a320fe03300000000000000", -"quorumIndex": 27, -"signersCount": 60, -"signers": "ffffffffffffff0f", -"validMembersCount": 60, -"validMembers": "ffffffffffffff0f", -"quorumPublicKey": "1423c7d5c4f9199cd9d7813bae377de2f39aed2319a2e262835186f20b4116b03109a446a76f7450222b2e1f5dab4b52", -"quorumVvecHash": "44ad034eb1eae9267e1cde235aaa2519c95ba159d606b1697bc737fd848417d5", -"quorumSig": "0348948f8ee53754db09f98ac5bdfe2f46810aa2b4b7b0459540bb1c27bf752ca3624bc1a025675567ba4b836b2c2bfa17bf7af0bf3ec1b49326cbfef136593326d677c6d7e4e8ad62147cc43240e45361066e6e953728fd6fc6116cb4099470", -"membersSig": "097caf351110b546ee9df4dffb09719ece48ab0e1e2802bc7d8167f4be85d8edc90c6fcdf5f8ee58276d9c571cdebd82094c50a160d0162551b4b61fc67d72af870a18836bce4a660c4d54aae0a913b6ecd24b09b42fbdb4a4ca8c99082e52c0" -}] -} \ No newline at end of file diff --git a/dash-spv-masternode-processor/files/MNL_0_770770.dat b/dash-spv-masternode-processor/files/MNL_0_770770.dat deleted file mode 100644 index 925de8eb..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_0_770770.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_0_783917.dat b/dash-spv-masternode-processor/files/MNL_0_783917.dat deleted file mode 100644 index 472f6de7..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_0_783917.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_0_844447.dat b/dash-spv-masternode-processor/files/MNL_0_844447.dat deleted file mode 100644 index f121fbfb..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_0_844447.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_0_869640.dat b/dash-spv-masternode-processor/files/MNL_0_869640.dat deleted file mode 100644 index 4f8905d3..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_0_869640.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_0_871104.dat b/dash-spv-masternode-processor/files/MNL_0_871104.dat deleted file mode 100644 index abef9683..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_0_871104.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_0_874011.dat b/dash-spv-masternode-processor/files/MNL_0_874011.dat deleted file mode 100644 index 9e4eef6b..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_0_874011.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_0_874080.dat b/dash-spv-masternode-processor/files/MNL_0_874080.dat deleted file mode 100644 index 6a6fe732..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_0_874080.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_0_874104.dat b/dash-spv-masternode-processor/files/MNL_0_874104.dat deleted file mode 100644 index be4ea45f..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_0_874104.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_0_874513.dat b/dash-spv-masternode-processor/files/MNL_0_874513.dat deleted file mode 100644 index 4301e374..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_0_874513.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_1742805_1745187.dat b/dash-spv-masternode-processor/files/MNL_1742805_1745187.dat deleted file mode 100644 index c418a895..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_1742805_1745187.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_1746460_1746516.dat b/dash-spv-masternode-processor/files/MNL_1746460_1746516.dat deleted file mode 100644 index ee3ddd94..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_1746460_1746516.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_1_4765.dat b/dash-spv-masternode-processor/files/MNL_1_4765.dat deleted file mode 100644 index e16be153..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_1_4765.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_1_5020.dat b/dash-spv-masternode-processor/files/MNL_1_5020.dat deleted file mode 100644 index 2ea8dc51..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_1_5020.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_1_74221.dat b/dash-spv-masternode-processor/files/MNL_1_74221.dat deleted file mode 100644 index 2c242520..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_1_74221.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_530000_868301.dat b/dash-spv-masternode-processor/files/MNL_530000_868301.dat deleted file mode 100644 index 52028cad..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_530000_868301.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_869640_869664.dat b/dash-spv-masternode-processor/files/MNL_869640_869664.dat deleted file mode 100644 index 2be55397..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_869640_869664.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_869664_869688.dat b/dash-spv-masternode-processor/files/MNL_869664_869688.dat deleted file mode 100644 index e89b2c9b..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_869664_869688.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_869688_869712.dat b/dash-spv-masternode-processor/files/MNL_869688_869712.dat deleted file mode 100644 index 8d6aa8f2..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_869688_869712.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_869712_869736.dat b/dash-spv-masternode-processor/files/MNL_869712_869736.dat deleted file mode 100644 index 24b88c77..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_869712_869736.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_869736_869760.dat b/dash-spv-masternode-processor/files/MNL_869736_869760.dat deleted file mode 100644 index c231776e..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_869736_869760.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_869760_869784.dat b/dash-spv-masternode-processor/files/MNL_869760_869784.dat deleted file mode 100644 index ba1cc734..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_869760_869784.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_869784_869808.dat b/dash-spv-masternode-processor/files/MNL_869784_869808.dat deleted file mode 100644 index 25d67862..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_869784_869808.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_869808_869832.dat b/dash-spv-masternode-processor/files/MNL_869808_869832.dat deleted file mode 100644 index ff265bff..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_869808_869832.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_869832_869856.dat b/dash-spv-masternode-processor/files/MNL_869832_869856.dat deleted file mode 100644 index 62df9835..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_869832_869856.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_869856_869880.dat b/dash-spv-masternode-processor/files/MNL_869856_869880.dat deleted file mode 100644 index e5c315ad..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_869856_869880.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/MNL_869880_869904.dat b/dash-spv-masternode-processor/files/MNL_869880_869904.dat deleted file mode 100644 index fe3865e3..00000000 Binary files a/dash-spv-masternode-processor/files/MNL_869880_869904.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/QRINFO_0125771d2f9419377aebc77e3b880afaa6f3438ccf247919ce4e9bd450a029343fe9f3a8caf3845251ee9002770cb0f2e1c6f6c43fdff480f7a59f8e29c000000001 b/dash-spv-masternode-processor/files/QRINFO_0125771d2f9419377aebc77e3b880afaa6f3438ccf247919ce4e9bd450a029343fe9f3a8caf3845251ee9002770cb0f2e1c6f6c43fdff480f7a59f8e29c000000001 deleted file mode 100644 index 22a4baf7..00000000 Binary files a/dash-spv-masternode-processor/files/QRINFO_0125771d2f9419377aebc77e3b880afaa6f3438ccf247919ce4e9bd450a029343fe9f3a8caf3845251ee9002770cb0f2e1c6f6c43fdff480f7a59f8e29c000000001 and /dev/null differ diff --git a/dash-spv-masternode-processor/files/QRINFO_0_798823.dat b/dash-spv-masternode-processor/files/QRINFO_0_798823.dat deleted file mode 100644 index 9cebc42a..00000000 Binary files a/dash-spv-masternode-processor/files/QRINFO_0_798823.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/QRINFO_0_875071.dat b/dash-spv-masternode-processor/files/QRINFO_0_875071.dat deleted file mode 100644 index 2da4b6aa..00000000 Binary files a/dash-spv-masternode-processor/files/QRINFO_0_875071.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/QRINFO_1_10475.dat b/dash-spv-masternode-processor/files/QRINFO_1_10475.dat deleted file mode 100644 index 29e4e5f3..00000000 Binary files a/dash-spv-masternode-processor/files/QRINFO_1_10475.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/QRINFO_874513_874578.dat b/dash-spv-masternode-processor/files/QRINFO_874513_874578.dat deleted file mode 100644 index 0856f9b9..00000000 Binary files a/dash-spv-masternode-processor/files/QRINFO_874513_874578.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/QRINFO_test.dat b/dash-spv-masternode-processor/files/QRINFO_test.dat deleted file mode 100644 index 5060f257..00000000 Binary files a/dash-spv-masternode-processor/files/QRINFO_test.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/QRINFO_test22.dat b/dash-spv-masternode-processor/files/QRINFO_test22.dat deleted file mode 100644 index 638a9eef..00000000 Binary files a/dash-spv-masternode-processor/files/QRINFO_test22.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/devnet-absinthe/MNL_0_0.dat b/dash-spv-masternode-processor/files/devnet-absinthe/MNL_0_0.dat deleted file mode 100644 index ead64fb3..00000000 Binary files a/dash-spv-masternode-processor/files/devnet-absinthe/MNL_0_0.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/getqrinfo_01bd81adf0ca5c2ac60e8d6226ec925edf8db15583b74f93bae1fb5bb20e8fbf7b17d18360b2e7ef9e2798eff64233cd7f58ed2f37cf704bc3385a131f1f02000001.json b/dash-spv-masternode-processor/files/getqrinfo_01bd81adf0ca5c2ac60e8d6226ec925edf8db15583b74f93bae1fb5bb20e8fbf7b17d18360b2e7ef9e2798eff64233cd7f58ed2f37cf704bc3385a131f1f02000001.json deleted file mode 100644 index c1c52b4d..00000000 Binary files a/dash-spv-masternode-processor/files/getqrinfo_01bd81adf0ca5c2ac60e8d6226ec925edf8db15583b74f93bae1fb5bb20e8fbf7b17d18360b2e7ef9e2798eff64233cd7f58ed2f37cf704bc3385a131f1f02000001.json and /dev/null differ diff --git a/dash-spv-masternode-processor/files/mainnet/MNL_0_1871712.dat b/dash-spv-masternode-processor/files/mainnet/MNL_0_1871712.dat deleted file mode 100644 index eb961949..00000000 Binary files a/dash-spv-masternode-processor/files/mainnet/MNL_0_1871712.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/qrinfo--1-20737.dat b/dash-spv-masternode-processor/files/qrinfo--1-20737.dat deleted file mode 100644 index 38665333..00000000 Binary files a/dash-spv-masternode-processor/files/qrinfo--1-20737.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/qrinfo--1-5078.dat b/dash-spv-masternode-processor/files/qrinfo--1-5078.dat deleted file mode 100644 index c398cabf..00000000 Binary files a/dash-spv-masternode-processor/files/qrinfo--1-5078.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/qrinfo1.dat b/dash-spv-masternode-processor/files/qrinfo1.dat deleted file mode 100644 index 2adb57c8..00000000 Binary files a/dash-spv-masternode-processor/files/qrinfo1.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_0_870600.dat b/dash-spv-masternode-processor/files/testnet/MNL_0_870600.dat deleted file mode 100644 index 92e24f0d..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_0_870600.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_0_888192.dat b/dash-spv-masternode-processor/files/testnet/MNL_0_888192.dat deleted file mode 100644 index 64f5a80d..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_0_888192.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_122088_900603__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_122088_900603__70230.dat deleted file mode 100644 index af693dd1..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_122088_900603__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_530000_900096__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_530000_900096__70230.dat deleted file mode 100644 index 5eb0dfc9..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_530000_900096__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_530000_904144__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_530000_904144__70230.dat deleted file mode 100644 index 40909a3b..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_530000_904144__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_530000_904920__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_530000_904920__70230.dat deleted file mode 100644 index 5cd57046..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_530000_904920__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_530000_904947__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_530000_904947__70230.dat deleted file mode 100644 index bd47f4fe..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_530000_904947__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_530000_905490__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_530000_905490__70230.dat deleted file mode 100644 index 184ec0ed..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_530000_905490__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_870600_870624.dat b/dash-spv-masternode-processor/files/testnet/MNL_870600_870624.dat deleted file mode 100644 index 03ef3f7c..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_870600_870624.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_870624_870648.dat b/dash-spv-masternode-processor/files/testnet/MNL_870624_870648.dat deleted file mode 100644 index ccb482f0..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_870624_870648.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_870648_870672.dat b/dash-spv-masternode-processor/files/testnet/MNL_870648_870672.dat deleted file mode 100644 index 5976ff48..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_870648_870672.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_870672_870696.dat b/dash-spv-masternode-processor/files/testnet/MNL_870672_870696.dat deleted file mode 100644 index 21b52241..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_870672_870696.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_870696_870720.dat b/dash-spv-masternode-processor/files/testnet/MNL_870696_870720.dat deleted file mode 100644 index 0966e1d6..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_870696_870720.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_870720_870744.dat b/dash-spv-masternode-processor/files/testnet/MNL_870720_870744.dat deleted file mode 100644 index 122b0355..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_870720_870744.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_870744_870768.dat b/dash-spv-masternode-processor/files/testnet/MNL_870744_870768.dat deleted file mode 100644 index d1708120..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_870744_870768.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_870768_870792.dat b/dash-spv-masternode-processor/files/testnet/MNL_870768_870792.dat deleted file mode 100644 index befbd1ef..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_870768_870792.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_870792_870816.dat b/dash-spv-masternode-processor/files/testnet/MNL_870792_870816.dat deleted file mode 100644 index b9714624..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_870792_870816.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_870816_870840.dat b/dash-spv-masternode-processor/files/testnet/MNL_870816_870840.dat deleted file mode 100644 index 99ff5d48..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_870816_870840.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_870840_870864.dat b/dash-spv-masternode-processor/files/testnet/MNL_870840_870864.dat deleted file mode 100644 index 420b819d..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_870840_870864.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_870864_870888.dat b/dash-spv-masternode-processor/files/testnet/MNL_870864_870888.dat deleted file mode 100644 index cf201742..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_870864_870888.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_870888_870912.dat b/dash-spv-masternode-processor/files/testnet/MNL_870888_870912.dat deleted file mode 100644 index 0a45a55c..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_870888_870912.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_870912_870936.dat b/dash-spv-masternode-processor/files/testnet/MNL_870912_870936.dat deleted file mode 100644 index bf76eb2b..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_870912_870936.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_870936_870960.dat b/dash-spv-masternode-processor/files/testnet/MNL_870936_870960.dat deleted file mode 100644 index dd950c96..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_870936_870960.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_870960_870984.dat b/dash-spv-masternode-processor/files/testnet/MNL_870960_870984.dat deleted file mode 100644 index d873ef93..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_870960_870984.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_870984_871008.dat b/dash-spv-masternode-processor/files/testnet/MNL_870984_871008.dat deleted file mode 100644 index b6805ae0..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_870984_871008.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_871008_871032.dat b/dash-spv-masternode-processor/files/testnet/MNL_871008_871032.dat deleted file mode 100644 index 2b686c27..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_871008_871032.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_871032_871056.dat b/dash-spv-masternode-processor/files/testnet/MNL_871032_871056.dat deleted file mode 100644 index e57a9819..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_871032_871056.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_871056_871080.dat b/dash-spv-masternode-processor/files/testnet/MNL_871056_871080.dat deleted file mode 100644 index 1f21a509..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_871056_871080.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_871080_871104.dat b/dash-spv-masternode-processor/files/testnet/MNL_871080_871104.dat deleted file mode 100644 index 53a7a5b4..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_871080_871104.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_871104_871128.dat b/dash-spv-masternode-processor/files/testnet/MNL_871104_871128.dat deleted file mode 100644 index cf99642e..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_871104_871128.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_871128_871152.dat b/dash-spv-masternode-processor/files/testnet/MNL_871128_871152.dat deleted file mode 100644 index f5324aba..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_871128_871152.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_871152_874488.dat b/dash-spv-masternode-processor/files/testnet/MNL_871152_874488.dat deleted file mode 100644 index 1d4d1059..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_871152_874488.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874488_874512.dat b/dash-spv-masternode-processor/files/testnet/MNL_874488_874512.dat deleted file mode 100644 index afefcdad..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874488_874512.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874512_874536.dat b/dash-spv-masternode-processor/files/testnet/MNL_874512_874536.dat deleted file mode 100644 index 4f287ceb..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874512_874536.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874536_874560.dat b/dash-spv-masternode-processor/files/testnet/MNL_874536_874560.dat deleted file mode 100644 index d76bd0d2..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874536_874560.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874560_874584.dat b/dash-spv-masternode-processor/files/testnet/MNL_874560_874584.dat deleted file mode 100644 index a7f770f1..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874560_874584.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874584_874608.dat b/dash-spv-masternode-processor/files/testnet/MNL_874584_874608.dat deleted file mode 100644 index 9bc076b4..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874584_874608.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874608_874632.dat b/dash-spv-masternode-processor/files/testnet/MNL_874608_874632.dat deleted file mode 100644 index 1a0539d0..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874608_874632.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874632_874656.dat b/dash-spv-masternode-processor/files/testnet/MNL_874632_874656.dat deleted file mode 100644 index 297c3a40..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874632_874656.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874656_874680.dat b/dash-spv-masternode-processor/files/testnet/MNL_874656_874680.dat deleted file mode 100644 index 5d06ef8d..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874656_874680.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874680_874704.dat b/dash-spv-masternode-processor/files/testnet/MNL_874680_874704.dat deleted file mode 100644 index ae1c75e9..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874680_874704.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874704_874728.dat b/dash-spv-masternode-processor/files/testnet/MNL_874704_874728.dat deleted file mode 100644 index 51a3b809..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874704_874728.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874728_874752.dat b/dash-spv-masternode-processor/files/testnet/MNL_874728_874752.dat deleted file mode 100644 index 260adcfd..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874728_874752.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874752_874776.dat b/dash-spv-masternode-processor/files/testnet/MNL_874752_874776.dat deleted file mode 100644 index 8c242ba7..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874752_874776.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874776_874800.dat b/dash-spv-masternode-processor/files/testnet/MNL_874776_874800.dat deleted file mode 100644 index be9d008a..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874776_874800.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874800_874824.dat b/dash-spv-masternode-processor/files/testnet/MNL_874800_874824.dat deleted file mode 100644 index 1dd36700..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874800_874824.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874824_874848.dat b/dash-spv-masternode-processor/files/testnet/MNL_874824_874848.dat deleted file mode 100644 index e1ce85cd..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874824_874848.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874848_874872.dat b/dash-spv-masternode-processor/files/testnet/MNL_874848_874872.dat deleted file mode 100644 index add860c2..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874848_874872.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874872_874896.dat b/dash-spv-masternode-processor/files/testnet/MNL_874872_874896.dat deleted file mode 100644 index 5daba780..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874872_874896.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874896_874920.dat b/dash-spv-masternode-processor/files/testnet/MNL_874896_874920.dat deleted file mode 100644 index 8807c92e..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874896_874920.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874920_874944.dat b/dash-spv-masternode-processor/files/testnet/MNL_874920_874944.dat deleted file mode 100644 index c0e7eaa3..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874920_874944.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874944_874968.dat b/dash-spv-masternode-processor/files/testnet/MNL_874944_874968.dat deleted file mode 100644 index c6fdf04b..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874944_874968.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874968_874992.dat b/dash-spv-masternode-processor/files/testnet/MNL_874968_874992.dat deleted file mode 100644 index ccf09a74..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874968_874992.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_874992_875016.dat b/dash-spv-masternode-processor/files/testnet/MNL_874992_875016.dat deleted file mode 100644 index 72419e41..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_874992_875016.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_875016_875040.dat b/dash-spv-masternode-processor/files/testnet/MNL_875016_875040.dat deleted file mode 100644 index a08bb8c4..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_875016_875040.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_875040_875064.dat b/dash-spv-masternode-processor/files/testnet/MNL_875040_875064.dat deleted file mode 100644 index a35ef9e2..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_875040_875064.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_875064_875088.dat b/dash-spv-masternode-processor/files/testnet/MNL_875064_875088.dat deleted file mode 100644 index 654ea457..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_875064_875088.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_875088_875112.dat b/dash-spv-masternode-processor/files/testnet/MNL_875088_875112.dat deleted file mode 100644 index 281e694a..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_875088_875112.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_875112_875136.dat b/dash-spv-masternode-processor/files/testnet/MNL_875112_875136.dat deleted file mode 100644 index e6050db4..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_875112_875136.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_875136_875160.dat b/dash-spv-masternode-processor/files/testnet/MNL_875136_875160.dat deleted file mode 100644 index c9bd3a52..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_875136_875160.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_875160_875184.dat b/dash-spv-masternode-processor/files/testnet/MNL_875160_875184.dat deleted file mode 100644 index 1f2bd584..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_875160_875184.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_875184_875208.dat b/dash-spv-masternode-processor/files/testnet/MNL_875184_875208.dat deleted file mode 100644 index de42d120..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_875184_875208.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_875208_875241.dat b/dash-spv-masternode-processor/files/testnet/MNL_875208_875241.dat deleted file mode 100644 index d7a54baa..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_875208_875241.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_875241_875242.dat b/dash-spv-masternode-processor/files/testnet/MNL_875241_875242.dat deleted file mode 100644 index 3361c630..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_875241_875242.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888192_888193.dat b/dash-spv-masternode-processor/files/testnet/MNL_888192_888193.dat deleted file mode 100644 index 84494c3b..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888192_888193.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888193_888194.dat b/dash-spv-masternode-processor/files/testnet/MNL_888193_888194.dat deleted file mode 100644 index 1573d069..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888193_888194.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888194_888195.dat b/dash-spv-masternode-processor/files/testnet/MNL_888194_888195.dat deleted file mode 100644 index 43756b79..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888194_888195.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888195_888196.dat b/dash-spv-masternode-processor/files/testnet/MNL_888195_888196.dat deleted file mode 100644 index 677ddf7c..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888195_888196.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888196_888197.dat b/dash-spv-masternode-processor/files/testnet/MNL_888196_888197.dat deleted file mode 100644 index 568cb606..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888196_888197.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888197_888198.dat b/dash-spv-masternode-processor/files/testnet/MNL_888197_888198.dat deleted file mode 100644 index b419ab17..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888197_888198.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888198_888199.dat b/dash-spv-masternode-processor/files/testnet/MNL_888198_888199.dat deleted file mode 100644 index 1c399444..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888198_888199.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888199_888200.dat b/dash-spv-masternode-processor/files/testnet/MNL_888199_888200.dat deleted file mode 100644 index b90a3973..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888199_888200.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888200_888201.dat b/dash-spv-masternode-processor/files/testnet/MNL_888200_888201.dat deleted file mode 100644 index c76f5191..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888200_888201.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888201_888202.dat b/dash-spv-masternode-processor/files/testnet/MNL_888201_888202.dat deleted file mode 100644 index 21034dc1..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888201_888202.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888202_888203.dat b/dash-spv-masternode-processor/files/testnet/MNL_888202_888203.dat deleted file mode 100644 index 9e70ed2f..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888202_888203.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888203_888204.dat b/dash-spv-masternode-processor/files/testnet/MNL_888203_888204.dat deleted file mode 100644 index cccb156e..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888203_888204.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888204_888205.dat b/dash-spv-masternode-processor/files/testnet/MNL_888204_888205.dat deleted file mode 100644 index 702692d4..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888204_888205.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888205_888206.dat b/dash-spv-masternode-processor/files/testnet/MNL_888205_888206.dat deleted file mode 100644 index 1bad0d75..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888205_888206.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888206_888207.dat b/dash-spv-masternode-processor/files/testnet/MNL_888206_888207.dat deleted file mode 100644 index f40d4561..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888206_888207.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888207_888208.dat b/dash-spv-masternode-processor/files/testnet/MNL_888207_888208.dat deleted file mode 100644 index 1646c509..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888207_888208.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888208_888209.dat b/dash-spv-masternode-processor/files/testnet/MNL_888208_888209.dat deleted file mode 100644 index 78311d45..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888208_888209.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888209_888210.dat b/dash-spv-masternode-processor/files/testnet/MNL_888209_888210.dat deleted file mode 100644 index 1d2c4855..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888209_888210.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888210_888211.dat b/dash-spv-masternode-processor/files/testnet/MNL_888210_888211.dat deleted file mode 100644 index 11c5d4d6..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888210_888211.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888211_888212.dat b/dash-spv-masternode-processor/files/testnet/MNL_888211_888212.dat deleted file mode 100644 index 1812ea6a..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888211_888212.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888212_888213.dat b/dash-spv-masternode-processor/files/testnet/MNL_888212_888213.dat deleted file mode 100644 index 5c466b9b..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888212_888213.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888213_888214.dat b/dash-spv-masternode-processor/files/testnet/MNL_888213_888214.dat deleted file mode 100644 index 2bf27ad4..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888213_888214.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888214_888215.dat b/dash-spv-masternode-processor/files/testnet/MNL_888214_888215.dat deleted file mode 100644 index e01db0b0..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888214_888215.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888215_888216.dat b/dash-spv-masternode-processor/files/testnet/MNL_888215_888216.dat deleted file mode 100644 index 15415134..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888215_888216.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888216_888217.dat b/dash-spv-masternode-processor/files/testnet/MNL_888216_888217.dat deleted file mode 100644 index fe5b1513..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888216_888217.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888217_888218.dat b/dash-spv-masternode-processor/files/testnet/MNL_888217_888218.dat deleted file mode 100644 index 3abe2619..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888217_888218.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888218_888219.dat b/dash-spv-masternode-processor/files/testnet/MNL_888218_888219.dat deleted file mode 100644 index e88dab73..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888218_888219.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888219_888220.dat b/dash-spv-masternode-processor/files/testnet/MNL_888219_888220.dat deleted file mode 100644 index a8e7c35e..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888219_888220.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888220_888221.dat b/dash-spv-masternode-processor/files/testnet/MNL_888220_888221.dat deleted file mode 100644 index 3e47a167..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888220_888221.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888221_888222.dat b/dash-spv-masternode-processor/files/testnet/MNL_888221_888222.dat deleted file mode 100644 index e869b91c..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888221_888222.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_888222_888223.dat b/dash-spv-masternode-processor/files/testnet/MNL_888222_888223.dat deleted file mode 100644 index 2a3dbcab..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_888222_888223.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_900096_900120__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_900096_900120__70230.dat deleted file mode 100644 index ac731083..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_900096_900120__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_900120_900144__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_900120_900144__70230.dat deleted file mode 100644 index f4039c12..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_900120_900144__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_900144_900168__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_900144_900168__70230.dat deleted file mode 100644 index 9449318a..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_900144_900168__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_900168_900192__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_900168_900192__70230.dat deleted file mode 100644 index ffe7b159..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_900168_900192__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_900192_900216__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_900192_900216__70230.dat deleted file mode 100644 index efe61cd6..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_900192_900216__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_900216_900240__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_900216_900240__70230.dat deleted file mode 100644 index 41665c00..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_900216_900240__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_900240_900264__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_900240_900264__70230.dat deleted file mode 100644 index 56e96564..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_900240_900264__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_900264_900288__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_900264_900288__70230.dat deleted file mode 100644 index 7c5a3788..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_900264_900288__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_900288_900312__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_900288_900312__70230.dat deleted file mode 100644 index aa239432..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_900288_900312__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_900312_900336__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_900312_900336__70230.dat deleted file mode 100644 index 339c25aa..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_900312_900336__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_900336_900360__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_900336_900360__70230.dat deleted file mode 100644 index f184f000..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_900336_900360__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_900360_904344__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_900360_904344__70230.dat deleted file mode 100644 index 135d9ae5..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_900360_904344__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904344_904368__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904344_904368__70230.dat deleted file mode 100644 index 2ada6581..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904344_904368__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904368_904392__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904368_904392__70230.dat deleted file mode 100644 index 3b7b2865..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904368_904392__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904392_904416__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904392_904416__70230.dat deleted file mode 100644 index 3364a65b..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904392_904416__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904416_904440__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904416_904440__70230.dat deleted file mode 100644 index 390218c4..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904416_904440__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904440_904464__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904440_904464__70230.dat deleted file mode 100644 index 1f7999f9..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904440_904464__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904464_904488__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904464_904488__70230.dat deleted file mode 100644 index aa330481..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904464_904488__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904488_904512__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904488_904512__70230.dat deleted file mode 100644 index 0c3e59d1..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904488_904512__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904512_904536__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904512_904536__70230.dat deleted file mode 100644 index 25814ddc..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904512_904536__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904536_904560__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904536_904560__70230.dat deleted file mode 100644 index 54dde31d..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904536_904560__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904560_904608__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904560_904608__70230.dat deleted file mode 100644 index 5fda62de..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904560_904608__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904608_904632__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904608_904632__70230.dat deleted file mode 100644 index 868ea54a..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904608_904632__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904632_904656__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904632_904656__70230.dat deleted file mode 100644 index ad9e29b1..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904632_904656__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904656_904680__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904656_904680__70230.dat deleted file mode 100644 index 7257a8bf..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904656_904680__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904680_904704__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904680_904704__70230.dat deleted file mode 100644 index b3d95eb4..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904680_904704__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904704_904728__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904704_904728__70230.dat deleted file mode 100644 index 944f47b0..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904704_904728__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904728_904752__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904728_904752__70230.dat deleted file mode 100644 index f5399f77..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904728_904752__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904752_904776__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904752_904776__70230.dat deleted file mode 100644 index 17e0b457..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904752_904776__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904776_904800__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904776_904800__70230.dat deleted file mode 100644 index 262c681d..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904776_904800__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904800_904824__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904800_904824__70230.dat deleted file mode 100644 index 829aa222..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904800_904824__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904824_904848__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904824_904848__70230.dat deleted file mode 100644 index b490b8ca..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904824_904848__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904848_904872__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904848_904872__70230.dat deleted file mode 100644 index 52283d8d..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904848_904872__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904872_904896__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904872_904896__70230.dat deleted file mode 100644 index 09b967af..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904872_904896__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904896_904920__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904896_904920__70230.dat deleted file mode 100644 index ef9fb258..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904896_904920__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904920_904944__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904920_904944__70230.dat deleted file mode 100644 index 0a1d9011..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904920_904944__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904920_904947__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904920_904947__70230.dat deleted file mode 100644 index 853a33f5..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904920_904947__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_904947_904948__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_904947_904948__70230.dat deleted file mode 100644 index 07d8e432..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_904947_904948__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905472_905490__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_905472_905490__70230.dat deleted file mode 100644 index c906604e..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_905472_905490__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/MNL_905490_905491__70230.dat b/dash-spv-masternode-processor/files/testnet/MNL_905490_905491__70230.dat deleted file mode 100644 index aa49967e..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/MNL_905490_905491__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/QRINFO_0_875241.dat b/dash-spv-masternode-processor/files/testnet/QRINFO_0_875241.dat deleted file mode 100644 index c909fb1f..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/QRINFO_0_875241.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/QRINFO_0_888537.dat b/dash-spv-masternode-processor/files/testnet/QRINFO_0_888537.dat deleted file mode 100644 index 80a1984d..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/QRINFO_0_888537.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/QRINFO_0_888655.dat b/dash-spv-masternode-processor/files/testnet/QRINFO_0_888655.dat deleted file mode 100644 index c8264ece..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/QRINFO_0_888655.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/QRINFO_875241_875242.dat b/dash-spv-masternode-processor/files/testnet/QRINFO_875241_875242.dat deleted file mode 100644 index e11a1596..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/QRINFO_875241_875242.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/QRINFO_x2_y2__70230.dat b/dash-spv-masternode-processor/files/testnet/QRINFO_x2_y2__70230.dat deleted file mode 100644 index 8519195a..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/QRINFO_x2_y2__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/QRINFO_x_y__70230.dat b/dash-spv-masternode-processor/files/testnet/QRINFO_x_y__70230.dat deleted file mode 100644 index 16bf26ab..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/QRINFO_x_y__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/files/testnet/qrinfo_0_x__70230.dat b/dash-spv-masternode-processor/files/testnet/qrinfo_0_x__70230.dat deleted file mode 100644 index 66013585..00000000 Binary files a/dash-spv-masternode-processor/files/testnet/qrinfo_0_x__70230.dat and /dev/null differ diff --git a/dash-spv-masternode-processor/scripts/chain.py b/dash-spv-masternode-processor/scripts/chain.py index 0f190776..0e8cb9c7 100644 --- a/dash-spv-masternode-processor/scripts/chain.py +++ b/dash-spv-masternode-processor/scripts/chain.py @@ -1,8 +1,9 @@ from enum import Enum, unique @unique class Chain(Enum): - MAINNET = "mainnet", "insight.dashevo.org" - TESTNET = "testnet", "insight.testnet.networks.dash.org:3002" + MAINNET = "mainnet", "insight.dash.org" + TESTNET = "testnet", "insight.testnet.networks.dash.org" +# TESTNET = "testnet", "insight.testnet.networks.dash.org:3002" SCREWDRIVER = "screwdriver", "insight.screwdriver.networks.dash.org:3002" ABSINTHE = "absinthe", "insight.absinthe.networks.dash.org:3002" diff --git a/dash-spv-masternode-processor/scripts/load_blocks_for_array_of_hashes.py b/dash-spv-masternode-processor/scripts/load_blocks_for_array_of_hashes.py index 6bc015bb..c078d42e 100755 --- a/dash-spv-masternode-processor/scripts/load_blocks_for_array_of_hashes.py +++ b/dash-spv-masternode-processor/scripts/load_blocks_for_array_of_hashes.py @@ -16,12 +16,13 @@ blocks = [] for i in hashes: - r = requests.get(f'https://{chain.api_base}/insight-api-dash/block/{i}') + r = requests.get(f'https://{chain.api_base}/insight-api/block/{i}') +# r = requests.get(f'https://{chain.api_base}/insight-api-dash/block/{i}') block = r.json() block_hash = block["hash"] block_height = block["height"] merkle_root = block["merkleroot"] - # print('MerkleBlock {{ hash: UInt256::from_hex("{}").unwrap().reverse(), height: {}, merkleroot: UInt256::from_hex("{}").unwrap() }},'.format( + # print('MerkleBlock {{ hash: UInt256::from_hex("{}").unwrap().reverse(), height: {}, merkleroot: <[u8; 32]>::from_hex("{}").unwrap() }},'.format( # block_hash, block_height, merkle_root)) print('MerkleBlock::reversed({}, "{}", "{}"), '.format(block_height, block_hash, merkle_root)) # print('store.put(new StoredBlock(new Block(params, {}, ' @@ -32,8 +33,8 @@ blocks.append(block) # print('{}'.format(blocks)) -with open(f'scripts/{filename}', 'w', encoding='utf-8') as f: - json.dump(blocks, f, ensure_ascii=False, indent=4) +# with open(f'scripts/{filename}', 'w', encoding='utf-8') as f: +# json.dump(blocks, f, ensure_ascii=False, indent=4) # Example # --hashes = '00000000000000024352dba79ed19c04b512b7354a25031b7fbb587cf97e07c4,000000000000002f4e6865301d473f6189601bf46a7856e10bb688778af571c5,000000000000000e1c7aa8d3a097c38e53cbed7fb5b117a4fe2ab356913a5b5e,000000000000000de7e088deaecc760151a4ae00a42c309d804b4a8d76260eaf,0000000000000012c2af64bcaa563c7c0327f1715e5d7c2e92eeca94c0df1652,000000000000001120614e702a170894d0a5df800951261b1b5aad2dc5a2701f,0000000000000027eeeffe75296f6dec0bfde97f2adb82ddc5e950aae445d91f,0000000000000021bae834e455984331015d8743a6114050fb131ad8737e412b,00000000000000146a43018f407969f3f5638af85641ef3304a469b3d9401d48,000000000000002e8970da01b397dcce91cc235f693338444763ef19812e4852,0000000000000035064653f503aa9379a3315537ecd092c3850b07ea1f5f2856,0000000000000023fe98b8ce34d18ddf968acdaa147690fa13a9d4293c96f96a,00000000000000041c604b3ece8be36793544290017b5dc95b7fb12f91f52d76,000000000000002b7153d6a72ab7a22316e8dbf97c94ac9a5a1771656ff4de77,0000000000000003a0a5aa7e1eb73c0f9deab941514287eb2aa65e0430388178,000000000000003c0da7bc78e8fe24f926abdceca452716bcbc40bd1f4df1f86' diff --git a/dash-spv-masternode-processor/scripts/load_blocks_for_array_of_heights.py b/dash-spv-masternode-processor/scripts/load_blocks_for_array_of_heights.py new file mode 100755 index 00000000..c12daa2a --- /dev/null +++ b/dash-spv-masternode-processor/scripts/load_blocks_for_array_of_heights.py @@ -0,0 +1,33 @@ +import requests +import json +import argparse +from chain import Chain + +parser = argparse.ArgumentParser(description='Script so useful.') +parser.add_argument("--heights", type=str, default='') +parser.add_argument("--file", type=str, default='result.json') +parser.add_argument("--chain", type=str, default='mainnet') +args = parser.parse_args() + +heights = args.heights.split(',') + +filename = args.file +chain = Chain.from_string(args.chain) + +blocks = [] +for i in heights: + r = requests.get(f'https://{chain.api_base}/insight-api/block/{i}') +# r = requests.get(f'https://{chain.api_base}/insight-api-dash/block/{i}') + block = r.json() + block_hash = block["hash"] + block_height = block["height"] + merkle_root = block["merkleroot"] + print('MerkleBlock::reversed({}, "{}", "{}"), '.format(block_height, block_hash, merkle_root)) + blocks.append(block) + +# print('{}'.format(blocks)) +# with open(f'scripts/{filename}', 'w', encoding='utf-8') as f: +# json.dump(blocks, f, ensure_ascii=False, indent=4) + +# Example +# --hashes = '00000000000000024352dba79ed19c04b512b7354a25031b7fbb587cf97e07c4,000000000000002f4e6865301d473f6189601bf46a7856e10bb688778af571c5,000000000000000e1c7aa8d3a097c38e53cbed7fb5b117a4fe2ab356913a5b5e,000000000000000de7e088deaecc760151a4ae00a42c309d804b4a8d76260eaf,0000000000000012c2af64bcaa563c7c0327f1715e5d7c2e92eeca94c0df1652,000000000000001120614e702a170894d0a5df800951261b1b5aad2dc5a2701f,0000000000000027eeeffe75296f6dec0bfde97f2adb82ddc5e950aae445d91f,0000000000000021bae834e455984331015d8743a6114050fb131ad8737e412b,00000000000000146a43018f407969f3f5638af85641ef3304a469b3d9401d48,000000000000002e8970da01b397dcce91cc235f693338444763ef19812e4852,0000000000000035064653f503aa9379a3315537ecd092c3850b07ea1f5f2856,0000000000000023fe98b8ce34d18ddf968acdaa147690fa13a9d4293c96f96a,00000000000000041c604b3ece8be36793544290017b5dc95b7fb12f91f52d76,000000000000002b7153d6a72ab7a22316e8dbf97c94ac9a5a1771656ff4de77,0000000000000003a0a5aa7e1eb73c0f9deab941514287eb2aa65e0430388178,000000000000003c0da7bc78e8fe24f926abdceca452716bcbc40bd1f4df1f86' diff --git a/dash-spv-masternode-processor/scripts/load_insight_blocks.py b/dash-spv-masternode-processor/scripts/load_insight_blocks.py index ddaaa430..3ba3f7d4 100644 --- a/dash-spv-masternode-processor/scripts/load_insight_blocks.py +++ b/dash-spv-masternode-processor/scripts/load_insight_blocks.py @@ -18,7 +18,7 @@ blocks = [] for i in range(root, head, step): - r = requests.get(f'https://{chain.api_base}/insight-api-dash/block/{i}') + r = requests.get(f'https://{chain.api_base}/insight-api/block/{i}') block = r.json() block_hash = block["hash"] block_height = block["height"] @@ -26,5 +26,5 @@ print('MerkleBlock::reversed({}, "{}", "{}"), '.format(block_height, block_hash, merkle_root)) blocks.append(block) -with open('scripts/{}.json'.format(chain.name), 'w', encoding='utf-8') as f: - json.dump(blocks, f, ensure_ascii=False, indent=4) +# with open('scripts/{}.json'.format(chain.name), 'w', encoding='utf-8') as f: +# json.dump(blocks, f, ensure_ascii=False, indent=4) diff --git a/dash-spv-masternode-processor/src/bindings/address.rs b/dash-spv-masternode-processor/src/bindings/address.rs deleted file mode 100644 index cf367597..00000000 --- a/dash-spv-masternode-processor/src/bindings/address.rs +++ /dev/null @@ -1,68 +0,0 @@ -use std::ffi::CStr; -use std::os::raw::c_char; -use std::slice; -use crate::chain::common::ChainType; -use crate::crypto::{byte_util::ConstDecodable, UInt160}; -use crate::ffi::ByteArray; -use crate::types::opaque_key::AsCStringPtr; -use crate::util::address::address; -use crate::util::data_append::DataAppend; - -/// # Safety -#[no_mangle] -pub extern "C" fn address_from_hash160(hash: *const u8, chain_type: ChainType) -> *mut c_char { - let hash = UInt160::from_const(hash).unwrap_or(UInt160::MIN); - let script_map = chain_type.script_map(); - address::from_hash160_for_script_map(&hash, &script_map) - .to_c_string_ptr() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn address_with_script_pubkey(script: *const u8, script_len: usize, chain_type: ChainType) -> *mut c_char { - if script.is_null() { - std::ptr::null_mut() - } else { - let script = unsafe { slice::from_raw_parts(script, script_len) }; - let script_map = chain_type.script_map(); - address::with_script_pub_key(&script.to_vec(), &script_map) - .to_c_string_ptr() - } -} - -/// # Safety -#[no_mangle] -pub extern "C" fn address_with_script_sig(script: *const u8, script_len: usize, chain_type: ChainType) -> *mut c_char { - if script.is_null() { - std::ptr::null_mut() - } else { - let script = unsafe { slice::from_raw_parts(script, script_len) }; - let script_map = chain_type.script_map(); - address::with_script_sig(&script.to_vec(), &script_map) - .to_c_string_ptr() - } -} - -/// # Safety -#[no_mangle] -pub extern "C" fn script_pubkey_for_address(address: *const c_char, chain_type: ChainType) -> ByteArray { - if address.is_null() { - ByteArray::default() - } else { - let c_str = unsafe { CStr::from_ptr(address) }; - let script_map = chain_type.script_map(); - Vec::::script_pub_key_for_address(c_str.to_str().unwrap(), &script_map).into() - } -} - -/// # Safety -#[no_mangle] -pub extern "C" fn is_valid_dash_address_for_chain(address: *const c_char, chain_type: ChainType) -> bool { - if address.is_null() { - false - } else { - let c_str = unsafe { CStr::from_ptr(address) }; - let script_map = chain_type.script_map(); - address::is_valid_dash_address_for_script_map(c_str.to_str().unwrap(), &script_map) - } -} diff --git a/dash-spv-masternode-processor/src/bindings/chain.rs b/dash-spv-masternode-processor/src/bindings/chain.rs deleted file mode 100644 index 78cb8981..00000000 --- a/dash-spv-masternode-processor/src/bindings/chain.rs +++ /dev/null @@ -1,144 +0,0 @@ -use std::ffi::CStr; -use std::os::raw::c_char; -use crate::chain::common::{ChainType, DevnetType}; -use crate::ffi::ByteArray; -use crate::types::opaque_key::AsCStringPtr; -use crate::util::data_append::DataAppend; - -/// # Safety -#[no_mangle] -pub extern "C" fn chain_type_index(chain_type: ChainType) -> i16 { - chain_type.into() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn chain_core19_activation_height(chain_type: ChainType) -> u32 { - chain_type.core19_activation_height() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn chain_core20_activation_height(chain_type: ChainType) -> u32 { - chain_type.core20_activation_height() -} - -#[no_mangle] -pub extern "C" fn chain_type_from_index(index: i16) -> ChainType { - ChainType::from(index) -} - -/// # Safety -#[no_mangle] -pub extern "C" fn chain_magic_number(chain_type: ChainType) -> u32 { - chain_type.magic() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn chain_peer_misbehaving_threshold(chain_type: ChainType) -> usize { - chain_type.peer_misbehaving_threshold() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn chain_max_proof_of_work_target(chain_type: ChainType) -> u32 { - chain_type.max_proof_of_work_target() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn chain_allow_min_difficulty_blocks(chain_type: ChainType) -> bool { - chain_type.allow_min_difficulty_blocks() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn chain_standard_port(chain_type: ChainType) -> u16 { - chain_type.standard_port() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn chain_standard_dapi_grpc_port(chain_type: ChainType) -> u16 { - chain_type.standard_dapi_grpc_port() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn chain_standard_dapi_jrpc_port(chain_type: ChainType) -> u16 { - chain_type.standard_dapi_jrpc_port() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn chain_headers_max_amount(chain_type: ChainType) -> u64 { - chain_type.header_max_amount() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn chain_transaction_version(chain_type: ChainType) -> u16 { - chain_type.transaction_version() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn chain_coin_type(chain_type: ChainType) -> u32 { - chain_type.coin_type() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn chain_devnet_version(devnet_type: DevnetType) -> u16 { - devnet_type.version() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn chain_devnet_identifier(devnet_type: DevnetType) -> *mut c_char { - devnet_type.identifier().to_c_string_ptr() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn chain_devnet_from_identifier(identifier: *const c_char) -> DevnetType { - let c_str = unsafe { CStr::from_ptr(identifier) }; - DevnetType::from(c_str.to_str().unwrap()) -} - -/// # Safety -#[no_mangle] -pub extern "C" fn chain_type_for_devnet_type(devnet_type: DevnetType) -> ChainType { - ChainType::from(devnet_type) -} - -/// # Safety -#[no_mangle] -pub extern "C" fn chain_type_is_devnet_any(chain_type: ChainType) -> bool { - chain_type.is_devnet_any() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn devnet_identifier_for_chain_type(chain_type: ChainType) -> *mut c_char { - chain_type.devnet_identifier().to_c_string_ptr() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn devnet_version_for_chain_type(chain_type: ChainType) -> i16 { - chain_type.devnet_version().unwrap_or(i16::MAX) -} - -/// # Safety -#[no_mangle] -pub extern "C" fn devnet_type_for_chain_type(chain_type: ChainType) -> DevnetType { - DevnetType::from(chain_type) -} - -/// # Safety -#[no_mangle] -pub extern "C" fn devnet_genesis_coinbase_message(devnet_type: DevnetType, protocol_version: u32) -> ByteArray { - Vec::::devnet_genesis_coinbase_message(devnet_type, protocol_version).into() -} diff --git a/dash-spv-masternode-processor/src/bindings/common.rs b/dash-spv-masternode-processor/src/bindings/common.rs deleted file mode 100644 index 73feb8d2..00000000 --- a/dash-spv-masternode-processor/src/bindings/common.rs +++ /dev/null @@ -1,199 +0,0 @@ -use std::ffi::CString; -use std::os::raw::c_char; -use logging::*; -use tracing::*; -use crate::crypto::byte_util::ConstDecodable; -use crate::crypto::UInt256; -use crate::ffi::boxer::boxed; -use crate::ffi::callbacks::{AddInsightBlockingLookup, GetBlockHashByHeight, GetBlockHeightByHash, GetCLSignatureByBlockHash, GetLLMQSnapshotByBlockHash, HashDestroy, LLMQSnapshotDestroy, MasternodeListDestroy, MasternodeListLookup, MasternodeListSave, MerkleRootLookup, SaveCLSignature, SaveLLMQSnapshot, ShouldProcessDiffWithRange}; -use crate::ffi::unboxer::{unbox_any, unbox_vec_ptr}; -use crate::processing::{MasternodeProcessor, MasternodeProcessorCache}; -use crate::types; - - -/// Initializes logger (it could be initialize only once) -#[no_mangle] -pub unsafe extern "C" fn register_rust_logger() { - logging::init_logging(); - log_info!(target: "masternode-processor", "register_rust_logger"); -} - -/// Register all the callbacks for use across FFI -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn register_processor( - get_merkle_root_by_hash: MerkleRootLookup, - get_block_height_by_hash: GetBlockHeightByHash, - get_block_hash_by_height: GetBlockHashByHeight, - get_llmq_snapshot_by_block_hash: GetLLMQSnapshotByBlockHash, - save_llmq_snapshot: SaveLLMQSnapshot, - get_cl_signature_by_block_hash: GetCLSignatureByBlockHash, - save_cl_signature: SaveCLSignature, - get_masternode_list_by_block_hash: MasternodeListLookup, - save_masternode_list: MasternodeListSave, - destroy_masternode_list: MasternodeListDestroy, - add_insight: AddInsightBlockingLookup, - destroy_hash: HashDestroy, - destroy_snapshot: LLMQSnapshotDestroy, - should_process_diff_with_range: ShouldProcessDiffWithRange, -) -> *mut MasternodeProcessor { - logging::init_logging(); - let processor = MasternodeProcessor::new( - get_merkle_root_by_hash, - get_block_height_by_hash, - get_block_hash_by_height, - get_llmq_snapshot_by_block_hash, - save_llmq_snapshot, - get_cl_signature_by_block_hash, - save_cl_signature, - get_masternode_list_by_block_hash, - save_masternode_list, - destroy_masternode_list, - add_insight, - destroy_hash, - destroy_snapshot, - should_process_diff_with_range, - ); - log_info!(target: "masternode-processor", "register_processor: {:?}", processor); - boxed(processor) -} - -/// Unregister all the callbacks for use across FFI -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn unregister_processor(processor: *mut MasternodeProcessor) { - log_info!(target: "masternode-processor", "unregister_processor: {:?}", processor); - let unboxed = unbox_any(processor); -} - -/// Initialize opaque cache to store needed information between FFI calls -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_create_cache() -> *mut MasternodeProcessorCache { - let cache = MasternodeProcessorCache::default(); - log_info!(target: "masternode-processor", "processor_create_cache: {:?}", cache); - boxed(cache) -} - -/// Destroy opaque cache -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_destroy_cache(cache: *mut MasternodeProcessorCache) { - log_debug!(target: "masternode-processor", "processor_destroy_cache: {:?}", cache); - let cache = unbox_any(cache); -} - -/// Remove models list from cache -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_remove_masternode_list_from_cache_for_block_hash(block_hash: *const u8, cache: *mut MasternodeProcessorCache) { - log_debug!(target: "masternode-processor", "processor_remove_masternode_list_from_cache_for_block_hash: {:?} {:p}", block_hash, cache); - if let Some(hash) = UInt256::from_const(block_hash) { - (*cache).remove_masternode_list(&hash); - } -} - -/// Remove quorum snapshot from cache -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_remove_llmq_snapshot_from_cache_for_block_hash(block_hash: *const u8, cache: *mut MasternodeProcessorCache) { - log_info!(target: "masternode-processor", "processor_remove_llmq_snapshot_from_cache_for_block_hash: {:?} {:p}", block_hash, cache); - if let Some(hash) = UInt256::from_const(block_hash) { - (*cache).remove_snapshot(&hash); - } -} - -/// Remove llmq members from cache -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_remove_llmq_members_from_cache_for_block_hash(block_hash: *const u8, cache: *mut MasternodeProcessorCache) { - log_info!(target: "masternode-processor", "processor_remove_llmq_members_from_cache_for_block_hash: {:?} {:p}", block_hash, cache); - if let Some(hash) = UInt256::from_const(block_hash) { - (*cache).remove_quorum_members(&hash); - } -} - -/// Remove quorum snapshot from cache -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_clear_cache(cache: *mut MasternodeProcessorCache) { - log_info!(target: "masternode-processor", "processor_clear_cache: {:p}", cache); - (*cache).clear(); -} - - - -/// Destroys anonymous internal holder for UInt256 -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_destroy_block_hash(block_hash: *mut [u8; 32]) { - unbox_any(block_hash); -} - -/// Destroys anonymous internal holder for UInt768 -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_destroy_cl_signature(cl_signature: *mut [u8; 96]) { - unbox_any(cl_signature); -} - -/// Destroys anonymous internal holder for UInt256 -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_destroy_byte_array(data: *const u8, len: usize) { - unbox_vec_ptr(data as *mut u8, len); -} - -/// # Safety -/// Destroys types::MNListDiffResult -#[no_mangle] -pub unsafe extern "C" fn processor_destroy_masternode_list(list: *mut types::MasternodeList) { - unbox_any(list); -} - -/// Destroys types::MNListDiffResult -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_destroy_mnlistdiff_result(result: *mut types::MNListDiffResult) { - unbox_any(result); -} - -/// Destroys types::LLMQRotationInfoResult -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_destroy_qr_info_result(result: *mut types::QRInfoResult) { - unbox_any(result); -} - -/// Destroys types::LLMQSnapshot -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_destroy_llmq_snapshot(result: *mut types::LLMQSnapshot) { - unbox_any(result); -} - -/// Destroys types::Block -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_destroy_block(result: *mut types::Block) { - unbox_any(result); -} - -// Here we have temporary replacement for DSKey from the DashSync -/// Destroys rust-allocated string -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_destroy_string(ptr: *mut c_char) { - if ptr.is_null() { - return; - } - let _ = CString::from_raw(ptr); -} - -/// Destroys UInt160 -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_destroy_uint160(ptr: *mut [u8; 20]) { - unbox_any(ptr); -} - diff --git a/dash-spv-masternode-processor/src/bindings/crypto.rs b/dash-spv-masternode-processor/src/bindings/crypto.rs deleted file mode 100644 index defa84c0..00000000 --- a/dash-spv-masternode-processor/src/bindings/crypto.rs +++ /dev/null @@ -1,16 +0,0 @@ -use std::slice; -use crate::ffi::ByteArray; - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_x11(data: *const u8, len: usize) -> ByteArray { - let data = slice::from_raw_parts(data, len); - rs_x11_hash::get_x11_hash(data).into() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_blake3(data: *const u8, len: usize) -> ByteArray { - let data = slice::from_raw_parts(data, len); - blake3::hash(data).into() -} diff --git a/dash-spv-masternode-processor/src/bindings/keys.rs b/dash-spv-masternode-processor/src/bindings/keys.rs deleted file mode 100644 index 713bc01b..00000000 --- a/dash-spv-masternode-processor/src/bindings/keys.rs +++ /dev/null @@ -1,1137 +0,0 @@ -use std::ffi::{CStr, CString}; -use std::os::raw::{c_char, c_ulong, c_void}; -use std::ptr::null_mut; -use std::slice; -use byte::BytesExt; -use secp256k1::Scalar; -use logging::*; -use tracing::*; -use crate::chain::bip::bip32; -use crate::chain::bip::bip38::BIP38; -use crate::chain::common::{ChainType, IHaveChainSettings}; -use crate::chain::derivation::{BIP32_HARD, IndexPath}; -use crate::consensus::Encodable; -use crate::crypto::byte_util::{AsBytes, clone_into_array, ConstDecodable, Reversable, Zeroable}; -use crate::crypto::{UInt160, UInt256, UInt384, UInt512, UInt768}; -use crate::ffi::boxer::{boxed, boxed_vec}; -use crate::ffi::{ByteArray, IndexPathData}; -use crate::ffi::unboxer::{unbox_any, unbox_opaque_key, unbox_opaque_keys, unbox_opaque_serialized_keys}; -use crate::keys::{BLSKey, ECDSAKey, ED25519Key, IKey, KeyKind}; -use crate::keys::crypto_data::{CryptoData, DHKey}; -use crate::keys::dip14::secp256k1_point_from_bytes; -use crate::processing::keys_cache::KeysCache; -use crate::types::opaque_key::{AsCStringPtr, AsOpaqueKey, OpaqueKey, KeyWithUniqueId, OpaqueKeys, OpaqueSerializedKeys}; -use crate::util::address::address; -use crate::util::sec_vec::SecVec; -#[cfg(feature = "use_serde")] -use serde::{Deserialize, Deserializer, Serialize, Serializer}; - -/// Destroys -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_destroy_opaque_key(data: *mut OpaqueKey) { - unbox_opaque_key(data); -} - -#[no_mangle] -pub unsafe extern "C" fn processor_destroy_opaque_keys(data: *mut OpaqueKeys) { - unbox_opaque_keys(data); -} - -#[no_mangle] -pub unsafe extern "C" fn processor_destroy_serialized_opaque_keys(data: *mut OpaqueSerializedKeys) { - unbox_opaque_serialized_keys(data); -} - -/// Initialize opaque cache to store keys information between FFI calls -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn keys_create_cache() -> *mut KeysCache { - let cache = KeysCache::default(); - log_info!(target: "masternode-processor", "keys_create_cache: {:?}", cache); - boxed(cache) -} - -/// Clear opaque key cache -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn keys_clear_cache(cache: *mut KeysCache) { - log_info!(target: "masternode-processor", "keys_clear_cache: {:p}", cache); - (*cache).clear(); -} - -/// Destroy opaque key cache -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn keys_destroy_cache(cache: *mut KeysCache) { - log_info!(target: "masternode-processor", "keys_destroy_cache: {:?}", cache); - let cache = unbox_any(cache); -} - - -/// Destroys anonymous internal holder for KeyWithUniqueId -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_destroy_key_wrapper(key: *mut KeyWithUniqueId) { - let k = unbox_any(key); - unbox_any(k.ptr); -} - -/// Destroys anonymous internal holder for ECDSAKey -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_destroy_ecdsa_key(key: *mut ECDSAKey) { - unbox_any(key); -} - -/// Destroys anonymous internal holder for BLSKey -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_destroy_bls_key(key: *mut BLSKey) { - unbox_any(key); -} - -/// Destroys anonymous internal holder for ED25519Key -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_destroy_ed25519_key(key: *mut ED25519Key) { - unbox_any(key); -} - -/// Removes ECDSA key from cache -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn cache_remove_ecdsa_key(unique_id: u64, cache: *mut KeysCache) { - let cache = &mut *cache; - cache.ecdsa.remove(&unique_id); -} - -/// Removes BLS key from cache -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn cache_key_remove_bls_key(unique_id: u64, cache: *mut KeysCache) { - let cache = &mut *cache; - cache.bls.remove(&unique_id); -} - -/// Removes ED25519 key from cache -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn cache_key_remove_ed25519_key(unique_id: u64, cache: *mut KeysCache) { - let cache = &mut *cache; - cache.ed25519.remove(&unique_id); -} - -/// Replacement for [DSKey keyWithExtendedPublicKeyData] -/// Returns 'unique_id' (u64-equivalent for [DSDerivationPath createIdentifierForDerivationPath]) -/// Then key can be removed by this 'unique_id' -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_create_ecdsa_from_extened_public_key_data(ptr: *const u8, len: usize, cache: *mut KeysCache) -> *mut KeyWithUniqueId { - let bytes = unsafe { slice::from_raw_parts(ptr, len) }; - ECDSAKey::key_with_extended_public_key_data(bytes) - .map_or(null_mut(), |key| { - let cache = &mut *cache; - let unique_id = UInt256::sha256(bytes).u64_le(); - cache.ecdsa.insert(unique_id, key.clone()); - boxed(KeyWithUniqueId { key_type: KeyKind::ECDSA, unique_id, ptr: boxed(key) as *mut c_void }) - }) -} - -/// Replacement for [DSKey keyWithExtendedPublicKeyData] -/// Returns 'unique_id' (u64-equivalent for [DSDerivationPath createIdentifierForDerivationPath]) -/// Then key can be removed by this 'unique_id' -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_create_bls_from_extened_public_key_data(ptr: *const u8, len: usize, use_legacy: bool, cache: *mut KeysCache) -> *mut KeyWithUniqueId { - let bytes = unsafe { slice::from_raw_parts(ptr, len) }; - BLSKey::key_with_extended_public_key_data(bytes, use_legacy) - .map_or(null_mut(), |key| { - let bytes = unsafe { slice::from_raw_parts(ptr, len) }; - let cache = &mut *cache; - let unique_id = UInt256::sha256(bytes).u64_le(); - cache.bls.insert(unique_id, key.clone()); - boxed(KeyWithUniqueId { key_type: if use_legacy { KeyKind::BLS } else { KeyKind::BLSBasic }, unique_id, ptr: boxed(key) as *mut c_void }) - }) -} - -/// Replacement for [DSKey keyWithExtendedPublicKeyData] -/// Returns 'unique_id' (u64-equivalent for [DSDerivationPath createIdentifierForDerivationPath]) -/// Then key can be removed by this 'unique_id' -/// # Safety -#[no_mangle] -pub extern "C" fn key_create_ed25519_from_extened_public_key_data(ptr: *const u8, len: usize, cache: *mut KeysCache) -> *mut KeyWithUniqueId { - let bytes = unsafe { slice::from_raw_parts(ptr, len) }; - let cache = unsafe { &mut *cache }; - ED25519Key::key_with_extended_public_key_data(bytes) - .map_or(null_mut(), |key| { - let unique_id = UInt256::sha256(bytes).u64_le(); - cache.ed25519.insert(unique_id, key.clone()); - boxed(KeyWithUniqueId { key_type: KeyKind::ED25519, unique_id, ptr: boxed(key) as *mut c_void }) - }) -} - -#[no_mangle] -pub extern "C" fn key_derive_key_from_extened_private_key_data_for_index_path(secret: *const u8, secret_len: usize, key_type: KeyKind, indexes: *const c_ulong, length: usize) -> *mut OpaqueKey { - let bytes = unsafe { slice::from_raw_parts(secret, secret_len) }; - let path = IndexPath::from_ffi(indexes, length); - match key_type { - KeyKind::ECDSA => ECDSAKey::key_with_extended_private_key_data(bytes) - .and_then(|key| key.private_derive_to_path(&path)) - .to_opaque_ptr(), - KeyKind::ED25519 => ED25519Key::key_with_extended_private_key_data(bytes) - .and_then(|key| key.private_derive_to_path(&path)) - .to_opaque_ptr(), - _ => BLSKey::key_with_extended_private_key_data(bytes, key_type == KeyKind::BLS) - .ok() - .and_then(|key| key.private_derive_to_path(&path)) - .to_opaque_ptr(), - } -} - -#[no_mangle] -pub extern "C" fn key_derive_ecdsa_from_extened_private_key_data_for_index_path(secret: *const u8, secret_len: usize, indexes: *const c_ulong, length: usize) -> *mut ECDSAKey { - let bytes = unsafe { slice::from_raw_parts(secret, secret_len) }; - let path = IndexPath::from_ffi(indexes, length); - ECDSAKey::key_with_extended_private_key_data(bytes) - .and_then(|key| key.private_derive_to_path(&path)) - .map_or(null_mut(), boxed) -} - -/// # Safety -/// digest is UInt256 -#[no_mangle] -pub unsafe extern "C" fn key_sign_message_digest(key: *mut OpaqueKey, digest: *const u8) -> ByteArray { - // let key = unsafe { &mut *key }; - let message_digest = UInt256::from_const(digest).unwrap(); - match *key { - OpaqueKey::ECDSA(ptr) => (&*ptr).compact_sign(message_digest).into(), - OpaqueKey::BLSLegacy(ptr) | - OpaqueKey::BLSBasic(ptr) => (&*ptr).sign_digest(message_digest).into(), - OpaqueKey::ED25519(ptr) => (&*ptr).sign(&message_digest.0).into() - } -} - -/// # Safety -/// digest is UInt256 -#[no_mangle] -pub unsafe extern "C" fn key_verify_message_digest(key: *mut OpaqueKey, md: *const u8, sig: *const u8, sig_len: usize) -> bool { - let digest = slice::from_raw_parts(md, UInt256::SIZE); - let signature = slice::from_raw_parts(sig, sig_len); - match *key { - OpaqueKey::ECDSA(ptr) => (&mut *ptr).verify(digest, signature), - OpaqueKey::BLSLegacy(ptr) | - OpaqueKey::BLSBasic(ptr) => (&mut *ptr).verify(digest, signature), - OpaqueKey::ED25519(ptr) => (&mut *ptr).verify(digest, signature) - } -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_has_private_key(key: *mut OpaqueKey) -> bool { - match *key { - OpaqueKey::ECDSA(ptr) => (&*ptr).has_private_key(), - OpaqueKey::BLSLegacy(ptr) | - OpaqueKey::BLSBasic(ptr) => (&*ptr).has_private_key(), - OpaqueKey::ED25519(ptr) => (&*ptr).has_private_key(), - } -} - -// serializedPrivateKeyForChain -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_serialized_private_key_for_chain(key: *mut OpaqueKey, chain_type: ChainType) -> *mut c_char { - let script = chain_type.script_map(); - match *key { - OpaqueKey::ECDSA(ptr) => (&*ptr).serialized_private_key_for_script(&script), - OpaqueKey::BLSLegacy(ptr) | - OpaqueKey::BLSBasic(ptr) => (&*ptr).serialized_private_key_for_script(&script), - OpaqueKey::ED25519(ptr) => (&*ptr).serialized_private_key_for_script(&script), - }.to_c_string_ptr() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_with_private_key(secret: *const c_char, key_type: KeyKind, chain_type: ChainType) -> *mut OpaqueKey { - let c_str = unsafe { CStr::from_ptr(secret) }; - let private_key_string = c_str.to_str().unwrap(); - match key_type { - KeyKind::ECDSA => ECDSAKey::key_with_private_key(private_key_string, chain_type).to_opaque_ptr(), - KeyKind::BLS => BLSKey::key_with_private_key(private_key_string, true).to_opaque_ptr(), - KeyKind::BLSBasic => BLSKey::key_with_private_key(private_key_string, false).to_opaque_ptr(), - KeyKind::ED25519 => ED25519Key::key_with_private_key(private_key_string).to_opaque_ptr(), - } -} - -/// # Safety -#[no_mangle] -pub extern "C" fn key_with_seed_data(data: *const u8, len: usize, key_type: KeyKind) -> *mut OpaqueKey { - let seed = unsafe { slice::from_raw_parts(data, len) }; - key_type.key_with_seed_data(seed) - .to_opaque_ptr() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn forget_private_key(key: *mut OpaqueKey) { - match *key { - OpaqueKey::ECDSA(ptr) => (&mut *ptr).forget_private_key(), - OpaqueKey::BLSLegacy(ptr) | - OpaqueKey::BLSBasic(ptr) => (&mut *ptr).forget_private_key(), - OpaqueKey::ED25519(ptr) => (&mut *ptr).forget_private_key() - } -} - - -// _extendedPublicKey = [parentDerivationPath.extendedPublicKey publicDeriveTo256BitDerivationPath:self derivationPathOffset:parentDerivationPath.length]; -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_public_derive_to_256bit(key: *mut OpaqueKey, derivation_indexes: *const u8, derivation_hardened: *const bool, derivation_len: usize, offset: usize) -> *mut OpaqueKey { - let path = IndexPath::from((derivation_indexes, derivation_hardened, derivation_len)); - match *key { - OpaqueKey::ECDSA(ptr) => (&mut *ptr).public_derive_to_256bit_derivation_path_with_offset(&path, offset).to_opaque_ptr(), - OpaqueKey::BLSLegacy(ptr) | - OpaqueKey::BLSBasic(ptr) => (&mut *ptr).public_derive_to_256bit_derivation_path_with_offset(&path, offset).to_opaque_ptr(), - OpaqueKey::ED25519(ptr) => (&mut *ptr).public_derive_to_256bit_derivation_path_with_offset(&path, offset).to_opaque_ptr() - } -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_private_key_data(key: *mut OpaqueKey) -> ByteArray { - match *key { - OpaqueKey::ECDSA(ptr) => (&*ptr).private_key_data(), - OpaqueKey::BLSLegacy(ptr) | - OpaqueKey::BLSBasic(ptr) => (&*ptr).private_key_data(), - OpaqueKey::ED25519(ptr) => (&*ptr).private_key_data() - }.into() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_public_key_data(key: *mut OpaqueKey) -> ByteArray { - match *key { - OpaqueKey::ECDSA(ptr) => (&*ptr).public_key_data(), - OpaqueKey::BLSLegacy(ptr) | - OpaqueKey::BLSBasic(ptr) => (&*ptr).public_key_data(), - OpaqueKey::ED25519(ptr) => (&*ptr).public_key_data() - }.into() -} -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_extended_public_key_data(key: *mut OpaqueKey) -> ByteArray { - match *key { - OpaqueKey::ECDSA(ptr) => (&*ptr).extended_public_key_data(), - OpaqueKey::BLSLegacy(ptr) | - OpaqueKey::BLSBasic(ptr) => (&*ptr).extended_public_key_data(), - OpaqueKey::ED25519(ptr) => (&*ptr).extended_public_key_data(), - }.into() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_extended_private_key_data(key: *mut OpaqueKey) -> ByteArray { - match *key { - OpaqueKey::ECDSA(ptr) => (&*ptr).extended_private_key_data(), - OpaqueKey::BLSLegacy(ptr) | - OpaqueKey::BLSBasic(ptr) => (&*ptr).extended_private_key_data(), - OpaqueKey::ED25519(ptr) => (&*ptr).extended_private_key_data() - }.into() -} - -// - (DSKey *)privateKeyAtIndexPath:(NSIndexPath *)indexPath fromSeed:(NSData *)seed; -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_private_key_at_index_path(seed: *const u8, seed_length: usize, key_type: KeyKind, index_path: *const IndexPathData, derivation_indexes: *const u8, derivation_hardened: *const bool, derivation_len: usize) -> *mut OpaqueKey { - let seed_bytes = slice::from_raw_parts(seed, seed_length); - let path = IndexPath::from((derivation_indexes, derivation_hardened, derivation_len)); - key_type.key_with_seed_data(seed_bytes) - .and_then(|top_key| top_key.private_derive_to_256bit_derivation_path(&path)) - .and_then(|path_extended_key| path_extended_key.private_derive_to_path(&IndexPath::from(index_path))) - .to_opaque_ptr() -} - -// - (DSKey *)publicKeyAtIndexPath:(NSIndexPath *)indexPath; -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_public_key_at_index_path(key: *mut OpaqueKey, index_path: *const IndexPathData) -> *mut OpaqueKey { - let index_path = IndexPath::from(index_path); - match *key { - OpaqueKey::ECDSA(ptr) => ECDSAKey::public_key_from_extended_public_key_data_at_index_path(&*ptr, &index_path).to_opaque_ptr(), - OpaqueKey::BLSLegacy(ptr) | - OpaqueKey::BLSBasic(ptr) => BLSKey::public_key_from_extended_public_key_data_at_index_path(&*ptr, &index_path).to_opaque_ptr(), - OpaqueKey::ED25519(ptr) => ED25519Key::public_key_from_extended_public_key_data_at_index_path(&*ptr, &index_path).to_opaque_ptr(), - } -} - -// - (NSData *)publicKeyDataAtIndexPath:(NSIndexPath *)indexPath; -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_public_key_data_at_index_path(key_ptr: *mut OpaqueKey, index_path: *const IndexPathData) -> ByteArray { - let path = IndexPath::from(index_path); - match *key_ptr { - OpaqueKey::ECDSA(key) => (&*key).extended_public_key_data() - .and_then(|data| ECDSAKey::public_key_from_extended_public_key_data(&data, &path)), - OpaqueKey::BLSLegacy(key) => (&*key).extended_public_key_data() - .and_then(|data| BLSKey::public_key_from_extended_public_key_data(&data, &path, true)), - OpaqueKey::BLSBasic(key) => (&*key).extended_public_key_data() - .and_then(|data| BLSKey::public_key_from_extended_public_key_data(&data, &path, false)), - OpaqueKey::ED25519(key) => (&*key).extended_public_key_data() - .and_then(|data| ED25519Key::public_key_from_extended_public_key_data(&data, &path)), - }.into() -} - -//- (NSArray *)privateKeysAtIndexPaths:(NSArray *)indexPaths fromSeed:(NSData *)seed; -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_private_keys_at_index_paths( - seed: *const u8, seed_len: usize, key_type: KeyKind, - index_paths: *const IndexPathData, - index_paths_len: usize, - derivation_indexes: *const u8, - derivation_hardened: *const bool, - derivation_len: usize) -> *mut OpaqueKeys { - let seed_bytes = slice::from_raw_parts(seed, seed_len); - let index_paths = slice::from_raw_parts(index_paths, index_paths_len); - let derivation_path = IndexPath::from((derivation_indexes, derivation_hardened, derivation_len)); - key_type.key_with_seed_data(seed_bytes) - .and_then(|top_key| top_key.private_derive_to_256bit_derivation_path(&derivation_path)) - .map_or(null_mut(), |derivation_path_extended_key| { - let keys = index_paths.iter() - .map(|p| derivation_path_extended_key.private_derive_to_path(&IndexPath::from(p as *const IndexPathData)) - .map(|private_key| private_key.to_opaque_ptr())) - .flatten() - .collect::>(); - let len = keys.len(); - boxed(OpaqueKeys { keys: boxed_vec(keys), len }) - }) -} - -//- (NSArray *)serializedPrivateKeysAtIndexPaths:(NSArray *)indexPaths fromSeed:(NSData *)seed -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn serialized_key_private_keys_at_index_paths( - seed: *const u8, seed_len: usize, key_type: KeyKind, - index_paths: *const IndexPathData, - index_paths_len: usize, - derivation_indexes: *const u8, - derivation_hardened: *const bool, - derivation_len: usize, - chain_type: ChainType, -) -> *mut OpaqueSerializedKeys { - let seed_bytes = slice::from_raw_parts(seed, seed_len); - let index_paths = slice::from_raw_parts(index_paths, index_paths_len); - let derivation_path = IndexPath::from((derivation_indexes, derivation_hardened, derivation_len)); - key_type.key_with_seed_data(seed_bytes) - .and_then(|top_key| top_key.private_derive_to_256bit_derivation_path(&derivation_path)) - .map_or(null_mut(), |derivation_path_extended_key| { - let script = chain_type.script_map(); - let keys = index_paths.iter() - .map(|p| derivation_path_extended_key.private_derive_to_path(&IndexPath::from(p as *const IndexPathData)) - .map(|private_key| CString::new(private_key.serialized_private_key_for_script(&script)) - .unwrap() - .into_raw())) - .flatten() - .collect::>(); - let len = keys.len(); - boxed(OpaqueSerializedKeys { keys: boxed_vec(keys), len }) - }) -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_bls_private_derive_to_path(key: *mut BLSKey, index_path: *const IndexPathData) -> *mut BLSKey { - let key = &mut *key; - key.private_derive_to_path(&IndexPath::from(index_path)) - .map_or(null_mut(), boxed) -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_bls_public_derive_to_path(key: *mut BLSKey, index_path: *const IndexPathData) -> *mut BLSKey { - let key = &mut *key; - key.public_derive_to_path(&IndexPath::from(index_path)) - .map_or(null_mut(), boxed) -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_bls_sign_data(key: *mut BLSKey, ptr: *const u8, len: usize) -> ByteArray { - let key = &mut *key; - let data = slice::from_raw_parts(ptr, len); - key.sign_data(data).into() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_bls_with_seed_data(data: *const u8, len: usize, use_legacy: bool) -> *mut BLSKey { - let seed_data = slice::from_raw_parts(data, len); - boxed(BLSKey::key_with_seed_data(seed_data, use_legacy)) -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_bls_with_bip32_seed_data(data: *const u8, len: usize, use_legacy: bool) -> *mut BLSKey { - let seed_data = slice::from_raw_parts(data, len); - BLSKey::extended_private_key_with_seed_data(seed_data, use_legacy) - .map_or(null_mut(), boxed) -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_bls_fingerprint(key: *mut BLSKey) -> u32 { - (&*key).public_key_fingerprint() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_bls_sign_data_single_sha256(key: *mut BLSKey, data: *const u8, len: usize) -> ByteArray { - let data_to_sign = slice::from_raw_parts(data, len); - (&*key).sign_data_single_sha256(data_to_sign).into() -} - - - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_bls_public_key(key: *mut BLSKey) -> ByteArray { - (&*key).pubkey.into() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_bls_chaincode(key: *mut BLSKey) -> ByteArray { - (&*key).chaincode().into() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_bls_serialize(key: *mut BLSKey, legacy: bool) -> ByteArray { - (&*key).bls_public_key() - .map(|key| UInt384(*if legacy { key.serialize_legacy() } else { key.serialize() })) - .ok() - .into() - -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_bls_secret_key(key: *mut BLSKey) -> ByteArray { - (&*key).seckey.into() -} - -/// # Safety -/// public_key: UInt384 -/// digest: UInt256 -/// signature: UInt768 -#[no_mangle] -pub unsafe extern "C" fn key_bls_verify(public_key: *const u8, use_legacy: bool, digest: *const u8, signature: *const u8) -> bool { - let public_key = slice::from_raw_parts(public_key, UInt384::SIZE); - let pubkey = UInt384::from(public_key); - let message_digest = slice::from_raw_parts(digest, UInt256::SIZE); - let signature = slice::from_raw_parts(signature, UInt768::SIZE); - BLSKey::key_with_public_key(pubkey, use_legacy) - .verify(message_digest, signature) -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_bls_migrate_from_legacy_extended_public_key_data(ptr: *const u8, len: usize) -> *mut OpaqueKey { - let bytes = slice::from_raw_parts(ptr, len); - BLSKey::migrate_from_legacy_extended_public_key_data(bytes) - .to_opaque_ptr() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_bls_migrate_from_basic_extended_public_key_data(ptr: *const u8, len: usize) -> *mut OpaqueKey { - let bytes = slice::from_raw_parts(ptr, len); - BLSKey::migrate_from_basic_extended_public_key_data(bytes) - .to_opaque_ptr() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_ecdsa_public_key_data(key: *mut ECDSAKey) -> ByteArray { - (&*key).public_key_data().into() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_ecdsa_secret_key_is_empty(key: *const c_char, chain_type: ChainType) -> bool { - ECDSAKey::key_with_private_key(CStr::from_ptr(key).to_str().unwrap(), chain_type) - .map_or(true, |key| key.seckey.is_zero()) -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_ecdsa_compact_sign(key: *mut ECDSAKey, digest: *const u8) -> ByteArray { - UInt256::from_const(digest) - .map(|message_digest| (&mut *key).compact_sign(message_digest)) - .into() -} - -/// # Safety -/// decrypts & serializes a BIP38 key using the given passphrase or returns NULL if passphrase is incorrect -#[no_mangle] -pub unsafe extern "C" fn key_ecdsa_with_bip38_key(private_key: *const c_char, passphrase: *const c_char, chain_type: ChainType) -> *mut c_char { - let private_key = CStr::from_ptr(private_key).to_str().unwrap(); - let passphrase = CStr::from_ptr(passphrase).to_str().unwrap(); - let script = chain_type.script_map(); - ECDSAKey::key_with_bip38_key(private_key, passphrase, &script) - .map(|key| key.serialized_private_key_for_script(&script)) - .to_c_string_ptr() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_ecdsa_sign(key: *mut ECDSAKey, data: *const u8, len: usize) -> ByteArray { - let key = unsafe { &mut *key }; - let data = slice::from_raw_parts(data, len); - key.sign(data).into() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_ecdsa_with_seed_data(ptr: *const u8, len: usize) -> *mut ECDSAKey { - let seed = slice::from_raw_parts(ptr, len); - ECDSAKey::init_with_seed_data(seed) - .map_or(null_mut(), boxed) -} - -//+ (NSString *)serializedPrivateMasterFromSeedData:(NSData *)seedData forChain:(DSChain *)chain -/// # Safety -/// For test only -#[no_mangle] -pub unsafe extern "C" fn key_ecdsa_serialized_private_master_from_seed_data(ptr: *const u8, len: usize, chain_type: ChainType) -> *mut c_char { - let seed = slice::from_raw_parts(ptr, len); - if seed.is_empty() { - return null_mut(); - } - let seed_key = UInt512::bip32_seed_key(seed); - let key = bip32::Key::new(0, 0, UInt256::MIN, UInt256::from(&seed_key.0[32..]), seed_key.0[..32].to_vec(), false) - .serialize(chain_type); - CString::new(key).unwrap().into_raw() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_ecdsa_with_private_key(secret: *const c_char, chain_type: ChainType) -> *mut ECDSAKey { - let c_str = unsafe { CStr::from_ptr(secret) }; - let private_key_string = c_str.to_str().unwrap(); - ECDSAKey::key_with_private_key(private_key_string, chain_type) - .map_or(null_mut(), |key| boxed(key)) -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_ecdsa_public_key_data_for_private_key(secret: *const c_char, chain_type: ChainType) -> ByteArray { - let c_str = unsafe { CStr::from_ptr(secret) }; - let private_key_string = c_str.to_str().unwrap(); - ECDSAKey::key_with_private_key(private_key_string, chain_type) - .map(|key| key.public_key_data()) - .into() -} -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_ecdsa_has_private_key(key: *mut ECDSAKey) -> bool { - (&*key).has_private_key() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_ecdsa_serialized_private_key_for_chain(key: *mut ECDSAKey, chain_type: ChainType) -> *mut c_char { - (&*key).serialized_private_key_for_script(&chain_type.script_map()) - .to_c_string_ptr() -} - -// + (NSString *)serializedAuthPrivateKeyFromSeed:(NSData *)seed forChain:(DSChain *)chain -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_ecdsa_serialized_auth_private_key_for_chain(seed: *const u8, seed_len: usize, chain_type: ChainType) -> *mut c_char { - let seed = slice::from_raw_parts(seed, seed_len); - let script_map = chain_type.script_map(); - ECDSAKey::serialized_auth_private_key_from_seed(seed, script_map) - .to_c_string_ptr() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn key_ecdsa_recovered_from_compact_sig(data: *const u8, len: usize, digest: *const u8) -> *mut OpaqueKey { - let compact_sig = unsafe { slice::from_raw_parts(data, len) }; - UInt256::from_const(digest) - .and_then(|message_digest| ECDSAKey::key_with_compact_sig(compact_sig, message_digest)) - .to_opaque_ptr() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_ecdsa_verify_compact_sig(signature: *const u8, signature_len: usize, payload: *const u8, payload_len: usize, owner_key_hash: *const u8) -> bool { - let compact_sig = slice::from_raw_parts(signature, signature_len); - let payload = slice::from_raw_parts(payload, payload_len); - let message_digest = UInt256::sha256d(payload); - let owner_key_hash = UInt160::from_const(owner_key_hash) - .expect("Owner key hash has wrong length"); - ECDSAKey::key_with_compact_sig(compact_sig, message_digest) - .map_or(false, |key| key.hash160().eq(&owner_key_hash)) - -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_create_ecdsa_from_secret(ptr: *const u8, len: usize, compressed: bool) -> *mut OpaqueKey { - let bytes = slice::from_raw_parts(ptr, len); - ECDSAKey::key_with_secret_data(bytes, compressed) - .to_opaque_ptr() -} - - -/// Deserializes extended private key from string and create opaque pointer to ECDSAKey -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_create_ecdsa_from_serialized_extended_private_key(key: *const c_char, chain_type: ChainType) -> *mut ECDSAKey { - // NSData *extendedPrivateKey = [self deserializedExtendedPrivateKey:serializedExtendedPrivateKey onChain:chain]; - // [DSECDSAKey keyWithSecret:*(UInt256 *)extendedPrivateKey.bytes compressed:YES]; - (CStr::from_ptr(key).to_str().unwrap(), chain_type) - .try_into() - .ok() - .and_then(|key: bip32::Key| ECDSAKey::key_with_secret_data(&key.extended_key_data(), true)) - .map_or(null_mut(), boxed) -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_create_ecdsa_from_extended_public_key_data(ptr: *const u8, len: usize) -> *mut OpaqueKey { - let bytes = slice::from_raw_parts(ptr, len); - ECDSAKey::key_with_extended_public_key_data(bytes) - .to_opaque_ptr() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_create_with_private_key_data(ptr: *const u8, len: usize, key_type: KeyKind) -> *mut OpaqueKey { - let bytes = slice::from_raw_parts(ptr, len); - match key_type { - KeyKind::ECDSA => ECDSAKey::key_with_secret_data(bytes, true).to_opaque_ptr(), - KeyKind::ED25519 => ED25519Key::key_with_secret_data(bytes).to_opaque_ptr(), - KeyKind::BLS => BLSKey::key_with_private_key_data(bytes, true).to_opaque_ptr(), - KeyKind::BLSBasic => BLSKey::key_with_private_key_data(bytes, false).to_opaque_ptr() - } -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_create_with_public_key_data(ptr: *const u8, len: usize, key_type: KeyKind) -> *mut OpaqueKey { - let bytes = slice::from_raw_parts(ptr, len); - match key_type { - KeyKind::ECDSA => ECDSAKey::key_with_public_key_data(bytes).to_opaque_ptr(), - KeyKind::ED25519 => ED25519Key::key_with_public_key_data(bytes).to_opaque_ptr(), - KeyKind::BLS => BLSKey::key_with_public_key(UInt384::from(bytes), true).to_opaque_ptr(), - KeyKind::BLSBasic => BLSKey::key_with_public_key(UInt384::from(bytes), false).to_opaque_ptr() - } -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_create_from_extended_public_key_data(ptr: *const u8, len: usize, key_type: KeyKind) -> *mut OpaqueKey { - let bytes = slice::from_raw_parts(ptr, len); - match key_type { - KeyKind::ECDSA => ECDSAKey::key_with_extended_public_key_data(bytes).to_opaque_ptr(), - KeyKind::ED25519 => ED25519Key::key_with_extended_public_key_data(bytes).to_opaque_ptr(), - KeyKind::BLS => BLSKey::key_with_extended_public_key_data(bytes, true).to_opaque_ptr(), - KeyKind::BLSBasic => BLSKey::key_with_extended_public_key_data(bytes, false).to_opaque_ptr() - } -} - -/// Deserializes extended private key from string and create opaque pointer to ECDSAKey -/// To pass NSIndexPath need to be serialized as byte array with u264 with path_length = bytes.length / 33 -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_serialized_extended_private_key_from_seed( - secret: *const u8, - secret_len: usize, - derivation_indexes: *const u8, - derivation_hardened: *const bool, - derivation_len: usize, - chain_type: ChainType) -> *mut c_char { - let secret_slice = unsafe { slice::from_raw_parts(secret, secret_len) }; - let index_path = IndexPath::from((derivation_indexes, derivation_hardened, derivation_len)); - ECDSAKey::serialized_extended_private_key_from_seed(secret_slice, index_path, chain_type) - .to_c_string_ptr() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn ecdsa_public_key_hash_from_secret(secret: *const c_char, chain_type: ChainType) -> ByteArray { - let c_str = unsafe { CStr::from_ptr(secret) }; - let private_key_string = c_str.to_str().unwrap(); - ECDSAKey::key_with_private_key(private_key_string, chain_type) - .map(|key| key.hash160()) - .into() -} - - - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_address_for_key(key: *mut OpaqueKey, chain_type: ChainType) -> *mut c_char { - let script_map = chain_type.script_map(); - CString::new(match *key { - OpaqueKey::ECDSA(ptr) => (&*ptr).address_with_public_key_data(&script_map), - OpaqueKey::BLSLegacy(ptr) | - OpaqueKey::BLSBasic(ptr) => (&*ptr).address_with_public_key_data(&script_map), - OpaqueKey::ED25519(ptr) => (&*ptr).address_with_public_key_data(&script_map) - }).unwrap().into_raw() -} -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_address_with_public_key_data(data: *const u8, len: usize, chain_type: ChainType) -> *mut c_char { - let map = chain_type.script_map(); - let data = slice::from_raw_parts(data, len); - address::with_public_key_data(data, &map) - .to_c_string_ptr() -} -/// # Safety -#[no_mangle] -pub extern "C" fn address_for_ecdsa_key(key: *mut ECDSAKey, chain_type: ChainType) -> *mut c_char { - let key = unsafe { &*key }; - let script_map = chain_type.script_map(); - key.address_with_public_key_data(&script_map).to_c_string_ptr() -} -/// # Safety -#[no_mangle] -pub extern "C" fn address_for_bls_key(key: *mut BLSKey, chain_type: ChainType) -> *mut c_char { - let key = unsafe { &*key }; - let script_map = chain_type.script_map(); - key.address_with_public_key_data(&script_map).to_c_string_ptr() -} -/// # Safety -#[no_mangle] -pub extern "C" fn address_for_ed25519_key(key: *mut ED25519Key, chain_type: ChainType) -> *mut c_char { - let key = unsafe { &*key }; - let script_map = chain_type.script_map(); - key.address_with_public_key_data(&script_map).to_c_string_ptr() -} - - - - - - -/// # Safety -#[no_mangle] -pub extern "C" fn address_for_ecdsa_key_recovered_from_compact_sig(data: *const u8, len: usize, digest: *const u8, chain_type: ChainType) -> *mut c_char { - let compact_sig = unsafe { slice::from_raw_parts(data, len) }; - let script_map = chain_type.script_map(); - UInt256::from_const(digest) - .and_then(|message_digest| ECDSAKey::key_with_compact_sig(compact_sig, message_digest)) - .map(|key| key.address_with_public_key_data(&script_map)) - .to_c_string_ptr() -} -/// # Safety -#[no_mangle] -pub extern "C" fn ecdsa_public_key_unique_id_from_derived_key_data(data: *const u8, len: usize, chain_type: ChainType) -> u64 { - let derived_key_data = unsafe { slice::from_raw_parts(data, len) }; - let seed_key = UInt512::bip32_seed_key(derived_key_data); - let secret = UInt256::from(&seed_key.0[..32]); - ECDSAKey::key_with_secret(&secret, true) - .map_or(0, |public_key| { - let data = public_key.public_key_data(); - let mut writer = SecVec::new(); - chain_type.genesis_hash().enc(&mut writer); - writer.extend(data); - // one way injective function? - UInt256::sha256(writer.as_slice()).u64_le() - }) -} - -/// # Safety -#[no_mangle] -pub extern "C" fn ecdsa_address_from_public_key_data(data: *const u8, len: usize, chain_type: ChainType) -> *mut c_char { - let public_key_data = unsafe { slice::from_raw_parts(data, len) }; - ECDSAKey::key_with_public_key_data(public_key_data) - .map(|key| key.address_with_public_key_data(&chain_type.script_map())) - .to_c_string_ptr() -} - - - -// - (DSKey *)generateExtendedPublicKeyFromSeed:(NSData *)seed storeUnderWalletUniqueId:(NSString *)walletUniqueId storePrivateKey:(BOOL)storePrivateKey; -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn generate_extended_public_key_from_seed(seed: *const u8, seed_length: usize, key_type: KeyKind, derivation_indexes: *const u8, derivation_hardened: *const bool, derivation_len: usize) -> *mut OpaqueKey { - let seed_bytes = slice::from_raw_parts(seed, seed_length); - let derivation_path = IndexPath::from((derivation_indexes, derivation_hardened, derivation_len)); - key_type.key_with_seed_data(seed_bytes) - .and_then(|seed_key| seed_key.private_derive_to_256bit_derivation_path(&derivation_path)) - .to_opaque_ptr() -} - - - - -// - (DSKey *)deprecatedIncorrectExtendedPublicKeyFromSeed:(NSData *)seed; -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn deprecated_incorrect_extended_public_key_from_seed(seed: *const u8, seed_len: usize, derivation_indexes: *const u8, derivation_hardened: *const bool, derivation_len: usize) -> *mut OpaqueKey { - let i = UInt512::bip32_seed_key(slice::from_raw_parts(seed, seed_len)); - let secret = &i.0[..32]; - let mut writer = SecVec::new(); - let mut chaincode = UInt256::from(&i.0[32..]); - let derivation_path = IndexPath::from((derivation_indexes, derivation_hardened, derivation_len)); - ECDSAKey::key_with_secret_data(secret, true) - .and_then(|key| { - key.hash160().u32_le().enc(&mut writer); - let mut key = UInt256::from(secret); - let hashes = unsafe { slice::from_raw_parts(derivation_indexes, derivation_len * 32) }; - (0..derivation_len).into_iter().for_each(|position| { - // let index = (*derivation_path).indexes.offset(position as isize); - // let index = derivation_indexes.add(position); - // let slice = slice::from_raw_parts(index as *const u8, 8); - let soft_index = hashes.read_with::(&mut position.clone(), byte::LE).unwrap() as u32; - // let soft_index = slice.read_with::(&mut 0, byte::BE).unwrap() as u32; - let buf = &mut [0u8; 37]; - if soft_index & BIP32_HARD != 0 { - buf[1..33].copy_from_slice(&key.0); - } else { - buf[..33].copy_from_slice(&secp256k1_point_from_bytes(&key.0)); - } - buf[33..37].copy_from_slice(soft_index.to_be_bytes().as_slice()); - let i = UInt512::hmac(chaincode.as_ref(), buf); - let mut sec_key = secp256k1::SecretKey::from_slice(&key.0).expect("invalid private key"); - let tweak = Scalar::from_be_bytes(clone_into_array(&i.0[..32])).expect("invalid tweak"); - sec_key = sec_key.add_tweak(&tweak).expect("failed to add tweak"); - key.0.copy_from_slice(&sec_key.secret_bytes()); - chaincode.0.copy_from_slice(&i.0[32..]); - }); - if let Some(seckey) = ECDSAKey::key_with_secret(&key, true) { - chaincode.enc(&mut writer); - writer.extend(seckey.public_key_data()); - ECDSAKey::key_with_extended_public_key_data(&writer) - } else { - None - } - }) - .to_opaque_ptr() -} - -// + (NSData *)deserializedExtendedPrivateKey:(NSString *)extendedPrivateKeyString onChain:(DSChain *)chain; -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn deserialized_extended_private_key(ptr: *const c_char, chain_type: ChainType) -> ByteArray { - (CStr::from_ptr(ptr).to_str().unwrap(), chain_type) - .try_into() - .ok() - .map(|key: bip32::Key| key.extended_key_data()) - .into() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn keys_private_key_data_is_equal(key1_ptr: *mut OpaqueKey, key2_ptr: *mut OpaqueKey) -> bool { - let seckey1 = match *key1_ptr { - OpaqueKey::ECDSA(key) => (&*key).seckey, - OpaqueKey::BLSLegacy(key) | - OpaqueKey::BLSBasic(key) => (&*key).seckey, - OpaqueKey::ED25519(key) => (&*key).seckey - }; - let seckey2 = match *key2_ptr { - OpaqueKey::ECDSA(key) => (&*key).seckey, - OpaqueKey::BLSLegacy(key) | - OpaqueKey::BLSBasic(key) => (&*key).seckey, - OpaqueKey::ED25519(key) => (&*key).seckey - }; - seckey1 == seckey2 -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn keys_public_key_data_is_equal(key1_ptr: *mut OpaqueKey, key2_ptr: *mut OpaqueKey) -> bool { - let pubkey_data1 = match *key1_ptr { - OpaqueKey::ECDSA(key) => (&*key).public_key_data(), - OpaqueKey::BLSLegacy(key) | - OpaqueKey::BLSBasic(key) => (&*key).public_key_data(), - OpaqueKey::ED25519(key) => (&*key).public_key_data() - }; - let pubkey_data2 = match *key2_ptr { - OpaqueKey::ECDSA(key) => (&*key).public_key_data(), - OpaqueKey::BLSLegacy(key) | - OpaqueKey::BLSBasic(key) => (&*key).public_key_data(), - OpaqueKey::ED25519(key) => (&*key).public_key_data() - }; - pubkey_data1 == pubkey_data2 -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_check_payload_signature(key_ptr: *mut OpaqueKey, key_hash: *const u8) -> bool { - let key_hash = slice::from_raw_parts(key_hash, UInt160::SIZE); - match *key_ptr { - OpaqueKey::ECDSA(key) => (&*key).hash160().as_bytes().eq(key_hash), - OpaqueKey::BLSLegacy(key) | - OpaqueKey::BLSBasic(key) => (&*key).hash160().as_bytes().eq(key_hash), - OpaqueKey::ED25519(key) => (&*key).hash160().as_bytes().eq(key_hash), - } -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_secret_key_string(ptr: *mut OpaqueKey) -> *mut c_char { - match *ptr { - OpaqueKey::ECDSA(key) => (&*key).secret_key_string(), - OpaqueKey::BLSLegacy(key) | - OpaqueKey::BLSBasic(key) => (&*key).secret_key_string(), - OpaqueKey::ED25519(key) => (&*key).secret_key_string(), - }.to_c_string_ptr() - -} - - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_encrypt_data(data: *const u8, len: usize, private_key: *mut OpaqueKey, public_key: *mut OpaqueKey) -> ByteArray { - let data = slice::from_raw_parts(data, len); - match (&*private_key, &mut *public_key) { - (OpaqueKey::ECDSA(prv_ptr), OpaqueKey::ECDSA(pub_ptr)) => - ECDSAKey::init_with_dh_key_exchange_with_public_key(&mut *(*pub_ptr), &*(*prv_ptr)) - .and_then(|key| as CryptoData>::encrypt_with_dh_key(&mut data.to_vec(), &key)), - (OpaqueKey::BLSLegacy(prv_ptr), OpaqueKey::BLSLegacy(pub_ptr)) | - (OpaqueKey::BLSBasic(prv_ptr), OpaqueKey::BLSBasic(pub_ptr)) => - BLSKey::init_with_dh_key_exchange_with_public_key(&mut *(*pub_ptr), &*(*prv_ptr)) - .and_then(|key| as CryptoData>::encrypt_with_dh_key(&mut data.to_vec(), &key)), - _ => None - }.into() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_encrypt_data_using_iv(data: *const u8, len: usize, private_key: *mut OpaqueKey, public_key: *mut OpaqueKey, iv_data: *const u8, iv_len: usize) -> ByteArray { - let data = slice::from_raw_parts(data, len); - let iv = slice::from_raw_parts(iv_data, iv_len); - match (&*private_key, &*public_key) { - (OpaqueKey::ECDSA(prv_ptr), OpaqueKey::ECDSA(pub_ptr)) => - ECDSAKey::init_with_dh_key_exchange_with_public_key(&mut *(*pub_ptr), &*(*prv_ptr)) - .and_then(|key| as CryptoData>::encrypt_with_dh_key_using_iv(&mut data.to_vec(), &key, iv.to_vec())), - (OpaqueKey::BLSLegacy(prv_ptr), OpaqueKey::BLSLegacy(pub_ptr)) | - (OpaqueKey::BLSBasic(prv_ptr), OpaqueKey::BLSBasic(pub_ptr)) => - BLSKey::init_with_dh_key_exchange_with_public_key(&mut *(*pub_ptr), &*(*prv_ptr)) - .and_then(|key| as CryptoData>::encrypt_with_dh_key_using_iv(&mut data.to_vec(), &key, iv.to_vec())), - _ => None - }.into() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_decrypt_data(data: *const u8, len: usize, private_key: *mut OpaqueKey, public_key: *mut OpaqueKey) -> ByteArray { - let data = slice::from_raw_parts(data, len); - match (&*private_key, &*public_key) { - (OpaqueKey::ECDSA(prv_ptr), OpaqueKey::ECDSA(pub_ptr)) => - ECDSAKey::init_with_dh_key_exchange_with_public_key(&mut *(*pub_ptr), &*(*prv_ptr)) - .and_then(|key| as CryptoData>::decrypt_with_dh_key(&mut data.to_vec(), &key)), - (OpaqueKey::BLSLegacy(prv_ptr), OpaqueKey::BLSLegacy(pub_ptr)) | - (OpaqueKey::BLSBasic(prv_ptr), OpaqueKey::BLSBasic(pub_ptr)) => - BLSKey::init_with_dh_key_exchange_with_public_key(&mut *(*pub_ptr), &*(*prv_ptr)) - .and_then(|key| as CryptoData>::decrypt_with_dh_key(&mut data.to_vec(), &key)), - _ => None - }.into() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_decrypt_data_using_iv_size(data: *const u8, len: usize, private_key: *mut OpaqueKey, public_key: *mut OpaqueKey, iv_size: usize) -> ByteArray { - let data = slice::from_raw_parts(data, len); - match (&*private_key, &*public_key) { - (OpaqueKey::ECDSA(prv_ptr), OpaqueKey::ECDSA(pub_ptr)) => - ECDSAKey::init_with_dh_key_exchange_with_public_key(&mut *(*pub_ptr), &*(*prv_ptr)) - .and_then(|key| as CryptoData>::decrypt_with_dh_key_using_iv_size(&mut data.to_vec(), &key, iv_size)), - (OpaqueKey::BLSLegacy(prv_ptr), OpaqueKey::BLSLegacy(pub_ptr)) | - (OpaqueKey::BLSBasic(prv_ptr), OpaqueKey::BLSBasic(pub_ptr)) => - BLSKey::init_with_dh_key_exchange_with_public_key(&mut *(*pub_ptr), &*(*prv_ptr)) - .and_then(|key| as CryptoData>::decrypt_with_dh_key_using_iv_size(&mut data.to_vec(), &key, iv_size)), - _ => None - }.into() -} - - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_encrypt_data_with_dh_key(data: *const u8, len: usize, key_ptr: *mut OpaqueKey) -> ByteArray { - let data = slice::from_raw_parts(data, len); - match *key_ptr { - OpaqueKey::ECDSA(key) => as CryptoData>::encrypt_with_dh_key(&mut data.to_vec(), &*key), - OpaqueKey::BLSLegacy(key) | - OpaqueKey::BLSBasic(key) => as CryptoData>::encrypt_with_dh_key(&mut data.to_vec(), &*key), - _ => None - }.into() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_decrypt_data_with_dh_key(data: *const u8, len: usize, key_ptr: *mut OpaqueKey) -> ByteArray { - let data = slice::from_raw_parts(data, len); - match *key_ptr { - OpaqueKey::ECDSA(key) => as CryptoData>::decrypt_with_dh_key(&mut data.to_vec(), &*key), - OpaqueKey::BLSLegacy(key) | - OpaqueKey::BLSBasic(key) => as CryptoData>::decrypt_with_dh_key(&mut data.to_vec(), &*key), - _ => None - }.into() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_encrypt_data_with_dh_key_using_iv(data: *const u8, len: usize, key_ptr: *mut OpaqueKey, iv_data: *const u8, iv_len: usize) -> ByteArray { - let data = slice::from_raw_parts(data, len); - let iv = slice::from_raw_parts(iv_data, iv_len); - match *key_ptr { - OpaqueKey::ECDSA(key) => - as CryptoData>::encrypt_with_dh_key_using_iv(&mut data.to_vec(), &*key, iv.to_vec()), - OpaqueKey::BLSLegacy(key) | - OpaqueKey::BLSBasic(key) => - as CryptoData>::encrypt_with_dh_key_using_iv(&mut data.to_vec(), &*key, iv.to_vec()), - _ => None - }.into() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_decrypt_data_with_dh_key_using_iv_size(data: *const u8, len: usize, key_ptr: *mut OpaqueKey, iv_size: usize) -> ByteArray { - let data = slice::from_raw_parts(data, len); - match *key_ptr { - OpaqueKey::ECDSA(key) => as CryptoData>::decrypt_with_dh_key_using_iv_size(&mut data.to_vec(), &*key, iv_size), - OpaqueKey::BLSLegacy(key) | - OpaqueKey::BLSBasic(key) => as CryptoData>::decrypt_with_dh_key_using_iv_size(&mut data.to_vec(), &*key, iv_size), - _ => None - }.into() -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn key_create_account_reference(source_key: *mut OpaqueKey, extended_public_key: *mut OpaqueKey, account_number: usize) -> u32 { - let extended_public_key_data = match *extended_public_key { - OpaqueKey::ECDSA(key) => (&*key).extended_public_key_data(), - OpaqueKey::BLSLegacy(key) | - OpaqueKey::BLSBasic(key) => (&*key).extended_public_key_data(), - OpaqueKey::ED25519(key) => (&*key).extended_public_key_data(), - }.unwrap_or(vec![]); - - let account_secret_key = match *source_key { - OpaqueKey::ECDSA(key) => (&*key).hmac_256_data(&extended_public_key_data), - OpaqueKey::BLSLegacy(key) | - OpaqueKey::BLSBasic(key) => (&*key).hmac_256_data(&extended_public_key_data), - OpaqueKey::ED25519(key) => (&*key).hmac_256_data(&extended_public_key_data) - }.reversed(); - let account_secret_key28 = account_secret_key.u32_le() >> 4; - let shortened_account_bits = (account_number as u32) & 0x0FFFFFFF; - let version = 0; // currently set to 0 - let version_bits = version << 28; - // this is the account ref - return version_bits | (account_secret_key28 ^ shortened_account_bits) -} - -/// # Safety -/// decrypts & serializes a BIP38 key using the given passphrase or returns NULL if passphrase is incorrect -#[no_mangle] -pub unsafe extern "C" fn key_is_valid_bip38_key(key: *const c_char) -> bool { - let key = CStr::from_ptr(key).to_str().unwrap(); - ECDSAKey::is_valid_bip38_key(key) -} diff --git a/dash-spv-masternode-processor/src/bindings/masternode.rs b/dash-spv-masternode-processor/src/bindings/masternode.rs deleted file mode 100644 index 9e28d011..00000000 --- a/dash-spv-masternode-processor/src/bindings/masternode.rs +++ /dev/null @@ -1,281 +0,0 @@ -use std::ptr::null_mut; -use std::slice; -use byte::BytesExt; -use logging::*; -use tracing::*; -use crate::{models, types}; -use crate::chain::common::{ChainType, IHaveChainSettings, LLMQType}; -use crate::consensus::encode; -use crate::crypto::{UInt256, byte_util::{BytesDecodable, ConstDecodable}, UInt768}; -use crate::ffi::{boxer::{boxed, boxed_vec}, ByteArray, from::FromFFI, to::ToFFI}; -use crate::models::{LLMQModifierType, LLMQVerificationContext}; -use crate::processing::{MasternodeProcessor, MasternodeProcessorCache, ProcessingError}; - -/// Read and process message received as a response for 'GETMNLISTDIFF' call -/// Here we calculate quorums according to Core v0.17 -/// See https://github.com/dashpay/dips/blob/master/dip-0004.md -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn process_mnlistdiff_from_message( - message_arr: *const u8, - message_length: usize, - chain_type: ChainType, - use_insight_as_backup: bool, - is_from_snapshot: bool, - protocol_version: u32, - processor: *mut MasternodeProcessor, - cache: *mut MasternodeProcessorCache, - context: *const std::ffi::c_void, -) -> *mut types::MNListDiffResult { - let instant = std::time::Instant::now(); - let processor = &mut *processor; - let cache = &mut *cache; - log_debug!(target: "masternode-processor", "process_mnlistdiff_from_message -> {:?} {:p} {:p} {:p}", instant, processor, cache, context); - processor.opaque_context = context; - processor.use_insight_as_backup = use_insight_as_backup; - processor.chain_type = chain_type; - let message: &[u8] = slice::from_raw_parts(message_arr, message_length); - let list_diff = unwrap_or_failure!(models::MNListDiff::new(message, &mut 0, |hash| processor - .lookup_block_height_by_hash(hash), protocol_version)); - if !is_from_snapshot { - let error = processor - .should_process_diff_with_range(list_diff.base_block_hash, list_diff.block_hash); - if error != ProcessingError::None { - log_debug!(target: "masternode-processor", "process_mnlistdiff_from_message <- {:?} ms [{:?}]", instant.elapsed().as_millis(), error); - return boxed(types::MNListDiffResult::default_with_error(error)); - } - } - let result = processor.get_list_diff_result_with_base_lookup(list_diff, LLMQVerificationContext::MNListDiff, cache); - log_debug!(target: "masternode-processor", "process_mnlistdiff_from_message <- {:?} ms", instant.elapsed().as_millis()); - boxed(result) -} - -/// Here we read & calculate quorums according to Core v0.18 -/// See https://github.com/dashpay/dips/blob/master/dip-0024.md -/// The reason behind we have multiple methods for this is that: -/// in objc we need 2 separate calls to incorporate additional logics between reading and processing -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn process_qrinfo_from_message( - message: *const u8, - message_length: usize, - chain_type: ChainType, - use_insight_as_backup: bool, - is_from_snapshot: bool, - is_rotated_quorums_presented: bool, - protocol_version: u32, - processor: *mut MasternodeProcessor, - cache: *mut MasternodeProcessorCache, - context: *const std::ffi::c_void, -) -> *mut types::QRInfoResult { - let instant = std::time::Instant::now(); - let message: &[u8] = slice::from_raw_parts(message, message_length); - let processor = &mut *processor; - let cache = &mut *cache; - processor.opaque_context = context; - processor.use_insight_as_backup = use_insight_as_backup; - processor.chain_type = chain_type; - log_debug!(target: "masternode-processor", "process_qrinfo_from_message -> {:?} {:p} {:p} {:p}", instant, processor, cache, context); - let offset = &mut 0; - let mut process_list_diff = |list_diff: models::MNListDiff, verification_context: LLMQVerificationContext| { - processor.get_list_diff_result_with_base_lookup(list_diff, verification_context, cache) - }; - let read_list_diff = - |offset: &mut usize| processor.read_list_diff_from_message(message, offset, protocol_version); - let read_snapshot = |offset: &mut usize| models::LLMQSnapshot::from_bytes(message, offset); - let read_var_int = |offset: &mut usize| encode::VarInt::from_bytes(message, offset); - let mut get_list_diff_result = - |list_diff: models::MNListDiff, verification_context: LLMQVerificationContext| boxed(process_list_diff(list_diff, verification_context)); - let snapshot_at_h_c = unwrap_or_qr_result_failure!(read_snapshot(offset)); - let snapshot_at_h_2c = unwrap_or_qr_result_failure!(read_snapshot(offset)); - let snapshot_at_h_3c = unwrap_or_qr_result_failure!(read_snapshot(offset)); - let diff_tip = unwrap_or_qr_result_failure!(read_list_diff(offset)); - if !is_from_snapshot { - let error = - processor.should_process_diff_with_range(diff_tip.base_block_hash, diff_tip.block_hash); - if error != ProcessingError::None { - log_debug!(target: "masternode-processor", "process_qrinfo_from_message <- {:?} ms [{:#?}]", instant.elapsed().as_millis(), error); - return boxed(types::QRInfoResult::default_with_error(error)); - } - } - let diff_h = unwrap_or_qr_result_failure!(read_list_diff(offset)); - let diff_h_c = unwrap_or_qr_result_failure!(read_list_diff(offset)); - let diff_h_2c = unwrap_or_qr_result_failure!(read_list_diff(offset)); - let diff_h_3c = unwrap_or_qr_result_failure!(read_list_diff(offset)); - let extra_share = message.read_with::(offset, ()).unwrap_or(false); - let snapshot_at_h_4c = extra_share.then_some(unwrap_or_qr_result_failure!(read_snapshot(offset))); - let diff_h_4c = extra_share.then_some(unwrap_or_qr_result_failure!(read_list_diff(offset))); - processor.save_snapshot(diff_h_c.block_hash, snapshot_at_h_c.clone()); - processor.save_snapshot(diff_h_2c.block_hash, snapshot_at_h_2c.clone()); - processor.save_snapshot(diff_h_3c.block_hash, snapshot_at_h_3c.clone()); - if extra_share { - processor.save_snapshot( - diff_h_4c.as_ref().unwrap().block_hash, - snapshot_at_h_4c.clone().unwrap(), - ); - } - - let last_quorum_per_index_count = unwrap_or_qr_result_failure!(read_var_int(offset)).0 as usize; - let mut last_quorum_per_index_vec: Vec<*mut types::LLMQEntry> = - Vec::with_capacity(last_quorum_per_index_count); - for _i in 0..last_quorum_per_index_count { - let quorum = unwrap_or_qr_result_failure!(models::LLMQEntry::from_bytes(message, offset)); - last_quorum_per_index_vec.push(boxed(quorum.encode())); - } - let quorum_snapshot_list_count = unwrap_or_qr_result_failure!(read_var_int(offset)).0 as usize; - let mut quorum_snapshot_list_vec: Vec<*mut types::LLMQSnapshot> = - Vec::with_capacity(quorum_snapshot_list_count); - let mut snapshots: Vec = Vec::with_capacity(quorum_snapshot_list_count); - for _i in 0..quorum_snapshot_list_count { - let snapshot = unwrap_or_qr_result_failure!(read_snapshot(offset)); - snapshots.push(snapshot); - } - let mn_list_diff_list_count = unwrap_or_qr_result_failure!(read_var_int(offset)).0 as usize; - let mut mn_list_diff_list_vec: Vec<*mut types::MNListDiffResult> = - Vec::with_capacity(mn_list_diff_list_count); - assert_eq!(quorum_snapshot_list_count, mn_list_diff_list_count, "number of snapshots should be equal to number of diffs"); - for i in 0..mn_list_diff_list_count { - let list_diff = unwrap_or_qr_result_failure!(read_list_diff(offset)); - let block_hash = list_diff.block_hash; - mn_list_diff_list_vec.push(get_list_diff_result(list_diff, LLMQVerificationContext::None)); - let snapshot = snapshots.get(i).unwrap(); - quorum_snapshot_list_vec.push(boxed(snapshot.encode())); - processor.save_snapshot(block_hash, snapshot.clone()); - } - - let result_at_h_4c = if extra_share { - get_list_diff_result(diff_h_4c.unwrap(), LLMQVerificationContext::None) - } else { - null_mut() - }; - let result_at_h_3c = get_list_diff_result(diff_h_3c, LLMQVerificationContext::None); - let result_at_h_2c = get_list_diff_result(diff_h_2c, LLMQVerificationContext::None); - let result_at_h_c = get_list_diff_result(diff_h_c, LLMQVerificationContext::None); - let result_at_h = get_list_diff_result(diff_h, LLMQVerificationContext::QRInfo(is_rotated_quorums_presented)); - let result_at_tip = get_list_diff_result(diff_tip, LLMQVerificationContext::None); - let result = types::QRInfoResult { - error_status: ProcessingError::None, - result_at_tip, - result_at_h, - result_at_h_c, - result_at_h_2c, - result_at_h_3c, - result_at_h_4c, - snapshot_at_h_c: boxed(snapshot_at_h_c.encode()), - snapshot_at_h_2c: boxed(snapshot_at_h_2c.encode()), - snapshot_at_h_3c: boxed(snapshot_at_h_3c.encode()), - snapshot_at_h_4c: if extra_share { - boxed(snapshot_at_h_4c.unwrap().encode()) - } else { - null_mut() - }, - extra_share, - last_quorum_per_index: boxed_vec(last_quorum_per_index_vec), - last_quorum_per_index_count, - quorum_snapshot_list: boxed_vec(quorum_snapshot_list_vec), - quorum_snapshot_list_count, - mn_list_diff_list: boxed_vec(mn_list_diff_list_vec), - mn_list_diff_list_count, - }; - - #[cfg(feature = "generate-dashj-tests")] - crate::util::java::generate_qr_state_test_file_json(chain_type, &result); - log_debug!(target: "masternode-processor", "process_qrinfo_from_message <- {:?} ms", instant.elapsed().as_millis()); - boxed(result) -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn processor_cache_masternode_list(block_hash: *const u8, list: *const types::MasternodeList, cache: *mut MasternodeProcessorCache) { - let hash = UInt256::from_const(block_hash).unwrap(); - let list = (*list).decode(); - (&mut *cache).mn_lists.insert(hash, list); -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn validate_masternode_list(list: *const types::MasternodeList, quorum: *const types::LLMQEntry, block_height: u32, chain_type: ChainType, best_cl_signature: *const u8) -> bool { - let list = (*list).decode(); - let mut quorum = (*quorum).decode(); - let payload_validation_status = quorum.validate_payload(); - if !payload_validation_status.is_ok() { - return false; - } - let quorum_modifier_type = if let Some(best_cl_signature) = UInt768::from_const(best_cl_signature) { - LLMQModifierType::CoreV20(quorum.llmq_type, block_height - 8, best_cl_signature) - } else { - LLMQModifierType::PreCoreV20(quorum.llmq_type, quorum.llmq_hash) - }; - let valid_masternodes = models::MasternodeList::get_masternodes_for_quorum(&quorum, chain_type, list.masternodes, block_height, quorum_modifier_type); - return quorum.validate(valid_masternodes, block_height).is_not_critical(); -} - - -/// # Safety -#[no_mangle] -pub extern "C" fn quorum_size_for_type(llmq_type: LLMQType) -> u32 { - llmq_type.size() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn quorum_threshold_for_type(llmq_type: LLMQType) -> u32 { - llmq_type.threshold() -} - -/// quorum_hash: u256 -/// # Safety -#[no_mangle] -pub extern "C" fn quorum_build_llmq_hash(llmq_type: LLMQType, quorum_hash: *const u8) -> ByteArray { - LLMQModifierType::PreCoreV20(llmq_type, UInt256::from_const(quorum_hash).unwrap()) - .build_llmq_hash() - .into() -} - -/// height: u32 -/// best_cl_signature: Option -/// # Safety -#[no_mangle] -pub extern "C" fn quorum_build_llmq_hash_v20(llmq_type: LLMQType, height: u32, best_cl_signature: *const u8) -> ByteArray { - LLMQModifierType::CoreV20(llmq_type, height, UInt768::from_const(best_cl_signature).unwrap()) - .build_llmq_hash() - .into() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn masternode_hash_confirmed_hash(confirmed_hash: *const u8, pro_reg_tx_hash: *const u8) -> ByteArray { - let confirmed_hash = UInt256::from_const(confirmed_hash).unwrap_or(UInt256::MIN); - let pro_reg_tx_hash = UInt256::from_const(pro_reg_tx_hash).unwrap_or(UInt256::MIN); - models::MasternodeEntry::hash_confirmed_hash(confirmed_hash, pro_reg_tx_hash).into() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn quorum_type_for_is_locks(chain_type: ChainType) -> LLMQType { - chain_type.is_llmq_type() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn quorum_type_for_isd_locks(chain_type: ChainType) -> LLMQType { - chain_type.isd_llmq_type() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn quorum_type_for_chain_locks(chain_type: ChainType) -> LLMQType { - chain_type.chain_locks_type() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn quorum_type_for_platform(chain_type: ChainType) -> LLMQType { - chain_type.platform_type() -} - -/// # Safety -#[no_mangle] -pub extern "C" fn quorum_should_process_type_for_chain(llmq_type: LLMQType, chain_type: ChainType) -> bool { - chain_type.should_process_llmq_of_type(llmq_type) -} diff --git a/dash-spv-masternode-processor/src/bindings/mod.rs b/dash-spv-masternode-processor/src/bindings/mod.rs deleted file mode 100644 index 6d513fe3..00000000 --- a/dash-spv-masternode-processor/src/bindings/mod.rs +++ /dev/null @@ -1,7 +0,0 @@ -pub mod address; -pub mod chain; -pub mod common; -pub mod crypto; -pub mod keys; -pub mod masternode; -pub mod tx; diff --git a/dash-spv-masternode-processor/src/bindings/tx.rs b/dash-spv-masternode-processor/src/bindings/tx.rs deleted file mode 100644 index c9618388..00000000 --- a/dash-spv-masternode-processor/src/bindings/tx.rs +++ /dev/null @@ -1,44 +0,0 @@ -use std::slice; -use crate::chain::common::ChainType; -use crate::consensus::Encodable; -use crate::crypto::byte_util::{AsBytes, Reversable}; -use crate::crypto::{UInt160, UInt256}; -use crate::ffi::ByteArray; -use crate::keys::ECDSAKey; -use crate::util::address::address; -use crate::util::data_ops::DASH_MESSAGE_MAGIC; - - -#[no_mangle] -pub unsafe extern "C" fn pro_reg_tx_verify_payload_signature(signature: *const u8, signature_len: usize, payload: *const u8, payload_len: usize, owner_key_hash: *const u8) -> bool { - let signature = slice::from_raw_parts(signature, signature_len); - let payload = slice::from_raw_parts(payload, payload_len); - let owner_key_hash = slice::from_raw_parts(owner_key_hash, 20); - let payload_hash = UInt256::sha256d(payload); - ECDSAKey::key_with_compact_sig(signature, payload_hash) - .map_or(false, |key| key.hash160().as_bytes().eq(owner_key_hash)) -} -#[no_mangle] -pub unsafe extern "C" fn pro_reg_tx_payload_collateral_digest( - payload: *const u8, payload_len: usize, - script_payout: *const u8, script_payout_len: usize, - operator_reward: u16, - owner_key_hash: *const u8, - voter_key_hash: *const u8, - chain_type: ChainType) -> ByteArray { - let payload = slice::from_raw_parts(payload, payload_len); - let script_payout = slice::from_raw_parts(script_payout, script_payout_len); - let owner_key_hash = UInt160::from(slice::from_raw_parts(owner_key_hash, 20)); - let voter_key_hash = UInt160::from(slice::from_raw_parts(voter_key_hash, 20)); - let script_map = chain_type.script_map(); - let mut writer = Vec::::new(); - DASH_MESSAGE_MAGIC.to_string().enc(&mut writer); - let payout_address = address::with_script_pub_key(&script_payout.to_vec(), &script_map) - .expect("Can't extract payout address"); - let payload_hash = UInt256::sha256d(payload).reverse(); - let owner_address = address::from_hash160_for_script_map(&owner_key_hash, &script_map); - let voter_address = address::from_hash160_for_script_map(&voter_key_hash, &script_map); - let payload_collateral_string = format!("{}|{}|{}|{}|{}", payout_address, operator_reward, owner_address, voter_address, payload_hash); - payload_collateral_string.enc(&mut writer); - ByteArray::from(UInt256::sha256d(&writer)) -} diff --git a/dash-spv-masternode-processor/src/tests/block_store.rs b/dash-spv-masternode-processor/src/block_store.rs similarity index 72% rename from dash-spv-masternode-processor/src/tests/block_store.rs rename to dash-spv-masternode-processor/src/block_store.rs index 10a588aa..08bf62d7 100644 --- a/dash-spv-masternode-processor/src/tests/block_store.rs +++ b/dash-spv-masternode-processor/src/block_store.rs @@ -1,7 +1,54 @@ -use hashes::hex::FromHex; -use crate::crypto::byte_util::Reversable; -use crate::crypto::UInt256; -use crate::lib_tests::tests::MerkleBlock; +use dashcore::hashes::hex::FromHex; +use dash_spv_crypto::crypto::byte_util::Reversed; +use crate::common::Block; +use crate::common::block::MBlock; + +#[derive(Debug, Copy, Clone)] +pub struct MerkleBlock { + pub hash: [u8; 32], + pub height: u32, + pub merkleroot: [u8; 32], +} +impl MerkleBlock { + pub fn new(height: u32, hash: &str, merkle_root: &str) -> MerkleBlock { + MerkleBlock { + height, + hash: <[u8; 32]>::from_hex(hash).unwrap(), + merkleroot: if merkle_root.is_empty() { [0u8; 32] } else { <[u8; 32]>::from_hex(merkle_root).unwrap() } } + } + pub fn merkle_root_reversed(&self) -> [u8; 32] { + self.merkleroot.reversed() + } + + pub fn reversed(height: u32, hash: &str, merkle_root: &str) -> MerkleBlock { + MerkleBlock { + height, + hash: <[u8; 32]>::from_hex(hash).unwrap().reversed(), + merkleroot: <[u8; 32]>::from_hex(merkle_root).unwrap_or([0u8; 32]) + } + } + pub fn reversed_hash(hash: &str, height: u32, merkle_root: &str) -> MerkleBlock { + Self::reversed(height, hash, merkle_root) + } +} + +impl From<&MerkleBlock> for Block { + fn from(value: &MerkleBlock) -> Self { + Block { + height: value.height, + hash: value.hash, + } + } +} +impl From<&MerkleBlock> for MBlock { + fn from(value: &MerkleBlock) -> Self { + MBlock { + height: value.height, + hash: value.hash, + merkle_root: value.merkle_root_reversed() + } + } +} // pub const BLOCK_STORE_JSON: &str = r#"{ // "MainNet": [ @@ -16,475 +63,499 @@ use crate::lib_tests::tests::MerkleBlock; // /// Useful regex for find+replace in intellij idea // (\("[0-9A-Fa-f]{64}"), (\d+,)\), \/\/ getBlockHeightByHash -// MerkleBlock { hash: UInt256::from_hex$1).unwrap(), height: $2 merkleroot: Default::default() }, +// MerkleBlock { hash: <[u8; 32]>::from_hex$1).unwrap(), height: $2 merkleroot: Default::default() }, // (\([\\\n\\\t\\\s\\\r]+)(\"[0-9A-Fa-f]{64}"),([\\\n\\\t\\\s\\\r]+)(\d+),([\\\n\\\t\\\s\\\r]+)\), -// MerkleBlock { hash: UInt256::from_hex($2).unwrap().reverse(), height: $4, merkleroot: Default::default() }, +// MerkleBlock { hash: <[u8; 32]>::from_hex($2).unwrap().reversed(), height: $4, merkleroot: Default::default() }, pub fn init_mainnet_store() -> Vec { vec![ - MerkleBlock { hash: UInt256::from_hex("000000000000000bf16cfee1f69cd472ac1d0285d74d025caa27cebb0fb6842f").unwrap().reverse(), height: 1090392, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000d6f921ffd1b48815407c1d54edc93079b7ec37a14a9c528f7").unwrap().reverse(), height: 1090776, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000c559941d24c167053c5c00aea59b8521f5cef764271dbd3c5").unwrap().reverse(), height: 1091280, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000003269a36d2ce1eee7753a2d2db392fff364f64f5a409805ca3").unwrap().reverse(), height: 1092840, merkleroot: UInt256::from_hex("0dd88a7fd4cbba15226af4e8c7b8a151395f1874a62656f4fc76301b6a4b92f3").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001a505b133ea44b594b194f12fa08650eb66efb579b1600ed1e").unwrap().reverse(), height: 1090368, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000006998d05eff0f4e9b6a7bab1447534eccb330972a7ef89ef65").unwrap().reverse(), height: 1091424, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001d9b6925a0bc2b744dfe38ff7da2ca0256aa555bb688e21824").unwrap().reverse(), height: 1090920, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000c22e2f5ca2113269ec62193e93158558c8932ba1720cea64f").unwrap().reverse(), height: 1092648, merkleroot: UInt256::from_hex("a5dc10f929abd8d99f7adb15c33a2cc0df915e2ed90e913805dad1eb4672af7f").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000020019489504beba1d6197857e63c44da3eb9e3b20a24f40d1e").unwrap().reverse(), height: 1092168, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000112e41e4b3afda8b233b8cc07c532d2eac5de097b68358c43e").unwrap().reverse(), height: 1088640, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000143df6e8e78a3e79f4deed38a27a05766ad38e3152f8237852").unwrap().reverse(), height: 1090944, merkleroot: UInt256::from_hex("a7486c7716863cbb5ef6580763e31d378ff2790bba3e6f14960aa34e12a5bad2").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000028d39e78ee49a950b66215545163b53331115e6e64d4d80328").unwrap().reverse(), height: 1091184, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000093b22f6342de731811a5b3fa51f070b7aac6d58390d8bfe8c").unwrap().reverse(), height: 1091664, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000037187889dd360aafc49d62a7e76f4ab6cd2813fdf610a7292").unwrap().reverse(), height: 1092504, merkleroot: UInt256::from_hex("1bd9c9c11026b7cdd720b3daa99d48df5369d57f709c627e13e98dfbfb558d0c").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000aee08f8aaf8a5232cc692ef5fcc016786af72bd9b001ae43b").unwrap().reverse(), height: 1090992, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002395b6c4e4cb829556d42c659b585ee4c131a683b9f7e37706").unwrap().reverse(), height: 1092192, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000048a9b52e6f46f74d92eb9740e27c1d66e9f2eb63293e18677").unwrap().reverse(), height: 1091976, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001b4d519e0a9215e84c3007597cef6823c8f1c637d7a46778f0").unwrap().reverse(), height: 1091448, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001730249b150b8fcdb1078cd0dbbfa04fb9a18d26bf7a3e80f2").unwrap().reverse(), height: 1092528, merkleroot: UInt256::from_hex("866c7830fa9071fd886cfb64d32f60d4dc959494c6557ecb05617acd3f8e6f64").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001c3073ff2ee0af660c66762af38e2c5782597e32ed690f0f72").unwrap().reverse(), height: 1092072, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000c49954d58132fb8a1c90e4e690995396be91d8f27a07de349").unwrap().reverse(), height: 1092624, merkleroot: UInt256::from_hex("7708bb2b07c9f3d7efba8427abd57ba3e62ec7b7fb0b351a759817fd2213b229").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000016200a3f98e44f4b9e65da04b86bad799e6bbfa8972f0cead").unwrap().reverse(), height: 1090080, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000a80933f2b9b8041fdfc6e94b77ba8786e159669f959431ff2").unwrap().reverse(), height: 1092600, merkleroot: UInt256::from_hex("69c5aba988a9dc226514ef10e2001b5df7ac2a8fb87fd6b13e27c937431f8562").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000153afcdccc3186ad2ca4ed10a79bfb01a2c0056c23fe039d86").unwrap().reverse(), height: 1092456, merkleroot: UInt256::from_hex("673da0b1cf47cd1bcb2ea4931e7b8a04ec96998477edd043e4abc42c9c9b6ef9").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000103bad71d3178a6c9a2f618d9d09419b38e9caee0fddbf664a").unwrap().reverse(), height: 1092864, merkleroot: UInt256::from_hex("73b17a0d933ce9f8e5246bad5cb59c5a26437faa27d76fe1cb96f3c57432cead").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001b732bc6d52faa8fae97d76753c8e071767a37ba509fe5c24a").unwrap().reverse(), height: 1092360, merkleroot: UInt256::from_hex("32ba264203d88522fa3e00f1cebd8cb69743f56df2b33007f60885655306f4f2").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001a17f82d76a0d5aa2b4f90a6e487df366d437c34e8453f519c").unwrap().reverse(), height: 1091112, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000caa00c2c24a385513a1687367157379a57b549007e18869d8").unwrap().reverse(), height: 1090680, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000022e463fe13bc19a1fe654c817cb3b8e207cdb4ff73fe0bcd2c").unwrap().reverse(), height: 1091736, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001b33b86b6a167d37e3fcc6ba53e02df3cb06e3f272bb89dd7d").unwrap().reverse(), height: 1092744, merkleroot: UInt256::from_hex("feb3aa5d6716223df7e62e1fb558cef944147b468172c1742f59fffe87cf3101").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000006051479afbbb159d722bb8feb10f76b8900370ceef552fc49").unwrap().reverse(), height: 1092432, merkleroot: UInt256::from_hex("71cf3c3d6cfb262efa9a2e15af37f953bb60e61a7dfc503305723b5a481d5d59").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000008cc37827fd700ec82ee8b54bdd37d4db4319496977f475cf8").unwrap().reverse(), height: 1091328, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000006242af03ba5e407c4e8412ef9976da4e7f0fa2cbe9889bcd2").unwrap().reverse(), height: 1089216, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001dc4a842ede88a3cc975e2ade4338513d546c52452ab429ba0").unwrap().reverse(), height: 1091496, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000010d30c51e8ce1730aae836b00cd43f3e70a1a37d40b47580fd").unwrap().reverse(), height: 1092816, merkleroot: UInt256::from_hex("591c9d99f4f29428688bdea6541e0eaa2b0308908e3f1078c6f38702088d1dd2").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000212441a8ef2495d21b0b7c09e13339dbc34d98c478cc51f8e2").unwrap().reverse(), height: 1092096, merkleroot: UInt256::from_hex("0a0bfc65a6034d98bc07da7099092b7661f77918c8a474d5ed2b5d693a7c3916").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000039d7eb80e1bbf6f7f0c43f7f251f30629d858bbcf6a18ab58").unwrap().reverse(), height: 1090728, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000004532e9c4a1def38cd71f3297c684bfdb2043c2aec173399e0").unwrap().reverse(), height: 1091904, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000b73060901c41d098b91f69fc4f27aef9d7ed7f2296953e407").unwrap().reverse(), height: 1090560, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000016659fb35017e1f6560ba7036a3433bfb924d85e3fdfdd3b3d").unwrap().reverse(), height: 1091256, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000a3c6796d85c8c49b961363ee88f14bff10c374cd8dd89a9f6").unwrap().reverse(), height: 1092696, merkleroot: UInt256::from_hex("8d5630695f5d8ddb672280e886ddde466a3f4586dd6c05101091bdb6b618686f").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000f33533ba1c5d72f678ecd87abe7e974debda238c53b391737").unwrap().reverse(), height: 1092720, merkleroot: UInt256::from_hex("272cde3f975a9c4765702a48eb7e39e914a9e5480f1af63060086b33719e6b0d").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000150907537f4408ff4a8610ba8ce2395faa7e44541ce2b6c37").unwrap().reverse(), height: 1090608, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001977d3a578e0ac3e4969675a74afe7715b8ffd9f29fbbe7c36").unwrap().reverse(), height: 1091400, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000004493e40518e7d3aff585e84564bcd80927f96a07ec80259cb").unwrap().reverse(), height: 1092480, merkleroot: UInt256::from_hex("42732f6b8bae09d5224a9591eff8a1362f6c946201cd4f61cf6423a15a5d749d").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000df5e2e0eb7eaa36fcef28967f7f12e539f74661e03b13bdba").unwrap().reverse(), height: 1090704, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000172f1765f4ed1e89ba4b717a475e9e37124626b02d566d31a2").unwrap().reverse(), height: 1090632, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000018e62a4938de3428ddaa26e381139489ce1a618ed06d432a38").unwrap().reverse(), height: 1092024, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000790bd24e65daaddbaeafdb4383c95d64c0d055e98625746bc").unwrap().reverse(), height: 1091832, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000005f28a2cb959b316cd4b43bd29819ea07c27ec96a7d5e18ab7").unwrap().reverse(), height: 1092408, merkleroot: UInt256::from_hex("59c685074dce36fdd425655652baaafec7e2ea524ef71faabf2002054247dc24").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000165a4ace8de9e7a4ba0cddced3434c7badc863ff9e237f0c8a").unwrap().reverse(), height: 1091088, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000230ec901e4d372a93c712d972727786a229e98d12694be9d34").unwrap().reverse(), height: 1090416, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000bf51de942eb8610caaa55a7f5a0e5ca806c3b631948c5cdcc").unwrap().reverse(), height: 1092336, merkleroot: UInt256::from_hex("fc75f6bb09643fae229917030e0ea84586490e9ac7e206d6f1737e6a64c22a2a").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002323d7ba466a9b671d335c3b2bf630d08f078e4adee735e13a").unwrap().reverse(), height: 1090464, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000019db2ad91ab0f67d90df222ce4057f343e176f8786865bcda9").unwrap().reverse(), height: 1091568, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000004a38d87062bf37ef978d1fc8718f03d9222c8aa7aa8a4470f").unwrap().reverse(), height: 1090896, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000022c909de83351791e0b69d4b4be34b25c8d54c8be3e8708c87").unwrap().reverse(), height: 1091592, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000008f3dffcf342279c8b50e49c47e191d3df453fdcd816aced46").unwrap().reverse(), height: 1092792, merkleroot: UInt256::from_hex("c371fd08a8d3665d14aaa14965d5c8cd74eccefdc9e2194d327251ca4b7598d8").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001d1d7f1b88d6518e6248616c50e4c0abaee6116a72bc998679").unwrap().reverse(), height: 1092048, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000020de87be47c5c10a50c9edfd669a586f47f44fa22ae0b2610a").unwrap().reverse(), height: 1090344, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000014d1d8d12dd5ff570b06e76e0bbf55d762a94d13b1fe66a922").unwrap().reverse(), height: 1091760, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000962d0d319a96d972215f303c588bf50449904f9a1a8cbc7c2").unwrap().reverse(), height: 1089792, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000171c58d1d0dbae71973530aa533e4cd9cb2d2597ec30d9b129").unwrap().reverse(), height: 1091352, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000004acf649896a7b22783810d5913b31922e3ea224dd4530b717").unwrap().reverse(), height: 1092144, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000013479b902955f8ba2d4ce2eb47a7f9f8f1fe477ec4b405bddd").unwrap().reverse(), height: 1090512, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001be0bbdb6b326c98ac8a3e181a2a641379c7d4308242bee90b").unwrap().reverse(), height: 1092216, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001c09a68353536ccb24b51b74c642d5b6e7e385cff2debc4e64").unwrap().reverse(), height: 1092120, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000013974ed8e13d0a50f298be0f2b685bfcfd8896172db6d4a145").unwrap().reverse(), height: 1090824, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001dbcd3a23c131fedde3acd6da89275e7f9fcae03f3107da861").unwrap().reverse(), height: 1092888, merkleroot: UInt256::from_hex("078a57d4071f15e0fca004c2cb8225343be82acfdfdfd122eb352a976b494cb5").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000a8812d75979aac7c08ac69179037409fd7a368372edd05d23").unwrap().reverse(), height: 1090872, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001fafca43cabdb0c6385daffa8a039f3b44b9b17271d7106704").unwrap().reverse(), height: 1090800, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000006e9693e34fc55452c82328f31e069df740655b55dd07cb58b").unwrap().reverse(), height: 1091016, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000010e7c080046121900cee1c7de7fe063c7d81405293a9764733").unwrap().reverse(), height: 1092384, merkleroot: UInt256::from_hex("711869e044050ee3b98b62ee504a9c2df8f683347527b0af0ac90f190570f4d6").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000022ef41cb09a617d87c12c6841eea47310ae6a4d1e2702bb3d3").unwrap().reverse(), height: 1090752, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000017705efcdaefd6a1856becc0b915de6fdccdc9e149c1ff0e8f").unwrap().reverse(), height: 1091856, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000000265a9516f35dd85d32d103d4c3b95e81969a03295f46cf0c").unwrap().reverse(), height: 1091952, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000002dfd994409f5b6185573ce22eae90b4a1c37003428071f0a8").unwrap().reverse(), height: 1090968, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001b8d6aaa56571d987ee50fa2e2e9a28a8482de7a4b52308f25").unwrap().reverse(), height: 1091136, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000020635160b49a18336031af2d25d9a37ea211d514f196220e9d").unwrap().reverse(), height: 1090440, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001bfb2ac93ebe89d9831995462f965597efcc9008b2d90fd29f").unwrap().reverse(), height: 1091784, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000028515b4c442c74e2af945f08ed3b66f05847022cb25bb2ec").unwrap().reverse(), height: 1091688, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000ed6b9517da9a1df88d03a5904a780aba1200b474dab0e2e4a").unwrap().reverse(), height: 1090488, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000b44a550a61f9751601065ff329c54d20eb306b97d163b8f8c").unwrap().reverse(), height: 1091712, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001d831888fbd1899967493856c1abf7219e632b8e73f25e0c81").unwrap().reverse(), height: 1091064, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000073b62bf732ab8654d27b1296801ab32b7ac630237665162a5").unwrap().reverse(), height: 1091304, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000004c0b03207179143f028c07ede20354fab68c731cb02f95fc8").unwrap().reverse(), height: 1090656, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000df9d9376b9c32ea640ecfac406b41445bb3a4b0ee6625e572").unwrap().reverse(), height: 1091040, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000145c3e1b3bb6f53d5e2dd441ac41c3cfe48a5746c7b168a415").unwrap().reverse(), height: 1092240, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000d8bf4cade14e398d69884e991591cb11ee7fec49167e4ff85").unwrap().reverse(), height: 1092000, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001d098ef14fa032b33bcfc8e559351be8cd689e03c9678256a9").unwrap().reverse(), height: 1091472, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000000c25139a9227273eb7547a1f558e62c545e62aeb236e66259").unwrap().reverse(), height: 1090584, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000010785f105cc7c256b5365c597a9212e99beda94c6eff0647c3").unwrap().reverse(), height: 1091376, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000000fafe0f7314104d81ab34ebd066601a38e5e914f2b3cefce9").unwrap().reverse(), height: 1092552, merkleroot: UInt256::from_hex("c18593cab2f1d7507dc82b259b1ac99863b53d06b3f41ab48fa7f19f037645ce").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000ddbfad338961f2d900d62f1c3b725fbd72052da062704901c").unwrap().reverse(), height: 1090848, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000e5d9359857518aaf3685bf8af55c675cf0d17a45383ca297f").unwrap().reverse(), height: 1091520, merkleroot: UInt256::from_hex("4a18d870099df51c8f15952c2693afbc6c571c821fa884452444f4b2377db95f").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000012b444de0be31d695b411dcc6645a3723932cabc6b9164531f").unwrap().reverse(), height: 1092916, merkleroot: UInt256::from_hex("34d3410507b4b7a74f0adcf2f468a6af79a13cad6f5930e36af3a61308e353c6").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001c414007419fc22a2401b07ab430bf433c8cdfb8877fb6b5b7").unwrap().reverse(), height: 1092672, merkleroot: UInt256::from_hex("de573f1bc65426f7c82c4fb71c6c1da8b5b5f0a8ec764dad77d65426d1291f3e").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000355efb9a350cc76c7624bf42abea845770a5c3adc2c5b93f4").unwrap().reverse(), height: 1092576, merkleroot: UInt256::from_hex("629044da3718f0717ec760070b8ef247979f492f8ff32ac074a497244bccaa53").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000f327555478a9d580318cb6e15db059642eff84797bf133196").unwrap().reverse(), height: 1091808, merkleroot: UInt256::from_hex("3c2b72bad9c3d9468125fac4b1b893409485a9742461f4cabdc84292fee8c20a").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000003b3ea97e688f1bec5f95930950b54c1bb01bf67b029739696").unwrap().reverse(), height: 1091640, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001a0d96dbc0cac26e445454dd2506702eeee7df6ff35bdcf60e").unwrap().reverse(), height: 1091544, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001aac60fafe05124672b19a1c3727dc17f106f11295db1053a3").unwrap().reverse(), height: 1092288, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000e37bca1e08dff47ef051199f24e9104dad85014c323464069").unwrap().reverse(), height: 1091208, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000013dd0059e5f701a39c0903e7f16d393f55fc896422139a4291").unwrap().reverse(), height: 1092768, merkleroot: UInt256::from_hex("faaddde59b54a6eb4f7b5df49f80dd59f0fb31403d7dcf4c4ce28b23674f0a5a").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000f4c8d5bdf6b89435d3a9789fce401286eb8f3f6eeb84f2a1d").unwrap().reverse(), height: 1091160, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001414ff2dd44ee4c01c02e6867228b4e1ff490f635f7de949a5").unwrap().reverse(), height: 1091232, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000013b130038d0599cb5a65165fc03b1b38fe2dd1a3bad6e253df").unwrap().reverse(), height: 1092312, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000082cb9d6d169dc625f64a6a24756ba796eaab131a998b42910").unwrap().reverse(), height: 1091928, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000001e358bce8df79c24def4787bf0bf7af25c040342fae4a18ce").unwrap().reverse(), height: 1091880, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000ffd590b1485b3caadc19b22e6379c733355108f107a430458cdf3407ab6").unwrap().reverse(), height: 0, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000bf16cfee1f69cd472ac1d0285d74d025caa27cebb0fb6842f").unwrap().reverse(), height: 1090392, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000d6f921ffd1b48815407c1d54edc93079b7ec37a14a9c528f7").unwrap().reverse(), height: 1090776, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000c559941d24c167053c5c00aea59b8521f5cef764271dbd3c5").unwrap().reverse(), height: 1091280, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001a505b133ea44b594b194f12fa08650eb66efb579b1600ed1e").unwrap().reverse(), height: 1090368, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000006998d05eff0f4e9b6a7bab1447534eccb330972a7ef89ef65").unwrap().reverse(), height: 1091424, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001d9b6925a0bc2b744dfe38ff7da2ca0256aa555bb688e21824").unwrap().reverse(), height: 1090920, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000020019489504beba1d6197857e63c44da3eb9e3b20a24f40d1e").unwrap().reverse(), height: 1092168, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000112e41e4b3afda8b233b8cc07c532d2eac5de097b68358c43e").unwrap().reverse(), height: 1088640, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000028d39e78ee49a950b66215545163b53331115e6e64d4d80328").unwrap().reverse(), height: 1091184, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000093b22f6342de731811a5b3fa51f070b7aac6d58390d8bfe8c").unwrap().reverse(), height: 1091664, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000aee08f8aaf8a5232cc692ef5fcc016786af72bd9b001ae43b").unwrap().reverse(), height: 1090992, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002395b6c4e4cb829556d42c659b585ee4c131a683b9f7e37706").unwrap().reverse(), height: 1092192, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000048a9b52e6f46f74d92eb9740e27c1d66e9f2eb63293e18677").unwrap().reverse(), height: 1091976, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001b4d519e0a9215e84c3007597cef6823c8f1c637d7a46778f0").unwrap().reverse(), height: 1091448, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001c3073ff2ee0af660c66762af38e2c5782597e32ed690f0f72").unwrap().reverse(), height: 1092072, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000016200a3f98e44f4b9e65da04b86bad799e6bbfa8972f0cead").unwrap().reverse(), height: 1090080, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001a17f82d76a0d5aa2b4f90a6e487df366d437c34e8453f519c").unwrap().reverse(), height: 1091112, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000caa00c2c24a385513a1687367157379a57b549007e18869d8").unwrap().reverse(), height: 1090680, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000022e463fe13bc19a1fe654c817cb3b8e207cdb4ff73fe0bcd2c").unwrap().reverse(), height: 1091736, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000008cc37827fd700ec82ee8b54bdd37d4db4319496977f475cf8").unwrap().reverse(), height: 1091328, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000006242af03ba5e407c4e8412ef9976da4e7f0fa2cbe9889bcd2").unwrap().reverse(), height: 1089216, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001dc4a842ede88a3cc975e2ade4338513d546c52452ab429ba0").unwrap().reverse(), height: 1091496, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000039d7eb80e1bbf6f7f0c43f7f251f30629d858bbcf6a18ab58").unwrap().reverse(), height: 1090728, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000004532e9c4a1def38cd71f3297c684bfdb2043c2aec173399e0").unwrap().reverse(), height: 1091904, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000b73060901c41d098b91f69fc4f27aef9d7ed7f2296953e407").unwrap().reverse(), height: 1090560, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000016659fb35017e1f6560ba7036a3433bfb924d85e3fdfdd3b3d").unwrap().reverse(), height: 1091256, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000150907537f4408ff4a8610ba8ce2395faa7e44541ce2b6c37").unwrap().reverse(), height: 1090608, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001977d3a578e0ac3e4969675a74afe7715b8ffd9f29fbbe7c36").unwrap().reverse(), height: 1091400, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000df5e2e0eb7eaa36fcef28967f7f12e539f74661e03b13bdba").unwrap().reverse(), height: 1090704, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000172f1765f4ed1e89ba4b717a475e9e37124626b02d566d31a2").unwrap().reverse(), height: 1090632, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000018e62a4938de3428ddaa26e381139489ce1a618ed06d432a38").unwrap().reverse(), height: 1092024, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000790bd24e65daaddbaeafdb4383c95d64c0d055e98625746bc").unwrap().reverse(), height: 1091832, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000165a4ace8de9e7a4ba0cddced3434c7badc863ff9e237f0c8a").unwrap().reverse(), height: 1091088, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000230ec901e4d372a93c712d972727786a229e98d12694be9d34").unwrap().reverse(), height: 1090416, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002323d7ba466a9b671d335c3b2bf630d08f078e4adee735e13a").unwrap().reverse(), height: 1090464, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000019db2ad91ab0f67d90df222ce4057f343e176f8786865bcda9").unwrap().reverse(), height: 1091568, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000004a38d87062bf37ef978d1fc8718f03d9222c8aa7aa8a4470f").unwrap().reverse(), height: 1090896, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000022c909de83351791e0b69d4b4be34b25c8d54c8be3e8708c87").unwrap().reverse(), height: 1091592, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001d1d7f1b88d6518e6248616c50e4c0abaee6116a72bc998679").unwrap().reverse(), height: 1092048, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000020de87be47c5c10a50c9edfd669a586f47f44fa22ae0b2610a").unwrap().reverse(), height: 1090344, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000014d1d8d12dd5ff570b06e76e0bbf55d762a94d13b1fe66a922").unwrap().reverse(), height: 1091760, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000962d0d319a96d972215f303c588bf50449904f9a1a8cbc7c2").unwrap().reverse(), height: 1089792, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000171c58d1d0dbae71973530aa533e4cd9cb2d2597ec30d9b129").unwrap().reverse(), height: 1091352, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000004acf649896a7b22783810d5913b31922e3ea224dd4530b717").unwrap().reverse(), height: 1092144, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000013479b902955f8ba2d4ce2eb47a7f9f8f1fe477ec4b405bddd").unwrap().reverse(), height: 1090512, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001be0bbdb6b326c98ac8a3e181a2a641379c7d4308242bee90b").unwrap().reverse(), height: 1092216, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001c09a68353536ccb24b51b74c642d5b6e7e385cff2debc4e64").unwrap().reverse(), height: 1092120, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000013974ed8e13d0a50f298be0f2b685bfcfd8896172db6d4a145").unwrap().reverse(), height: 1090824, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000a8812d75979aac7c08ac69179037409fd7a368372edd05d23").unwrap().reverse(), height: 1090872, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001fafca43cabdb0c6385daffa8a039f3b44b9b17271d7106704").unwrap().reverse(), height: 1090800, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000006e9693e34fc55452c82328f31e069df740655b55dd07cb58b").unwrap().reverse(), height: 1091016, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000022ef41cb09a617d87c12c6841eea47310ae6a4d1e2702bb3d3").unwrap().reverse(), height: 1090752, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000017705efcdaefd6a1856becc0b915de6fdccdc9e149c1ff0e8f").unwrap().reverse(), height: 1091856, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000000265a9516f35dd85d32d103d4c3b95e81969a03295f46cf0c").unwrap().reverse(), height: 1091952, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000002dfd994409f5b6185573ce22eae90b4a1c37003428071f0a8").unwrap().reverse(), height: 1090968, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001b8d6aaa56571d987ee50fa2e2e9a28a8482de7a4b52308f25").unwrap().reverse(), height: 1091136, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000020635160b49a18336031af2d25d9a37ea211d514f196220e9d").unwrap().reverse(), height: 1090440, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001bfb2ac93ebe89d9831995462f965597efcc9008b2d90fd29f").unwrap().reverse(), height: 1091784, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000028515b4c442c74e2af945f08ed3b66f05847022cb25bb2ec").unwrap().reverse(), height: 1091688, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000ed6b9517da9a1df88d03a5904a780aba1200b474dab0e2e4a").unwrap().reverse(), height: 1090488, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000b44a550a61f9751601065ff329c54d20eb306b97d163b8f8c").unwrap().reverse(), height: 1091712, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001d831888fbd1899967493856c1abf7219e632b8e73f25e0c81").unwrap().reverse(), height: 1091064, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000073b62bf732ab8654d27b1296801ab32b7ac630237665162a5").unwrap().reverse(), height: 1091304, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000004c0b03207179143f028c07ede20354fab68c731cb02f95fc8").unwrap().reverse(), height: 1090656, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000df9d9376b9c32ea640ecfac406b41445bb3a4b0ee6625e572").unwrap().reverse(), height: 1091040, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000145c3e1b3bb6f53d5e2dd441ac41c3cfe48a5746c7b168a415").unwrap().reverse(), height: 1092240, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000d8bf4cade14e398d69884e991591cb11ee7fec49167e4ff85").unwrap().reverse(), height: 1092000, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001d098ef14fa032b33bcfc8e559351be8cd689e03c9678256a9").unwrap().reverse(), height: 1091472, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000000c25139a9227273eb7547a1f558e62c545e62aeb236e66259").unwrap().reverse(), height: 1090584, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000010785f105cc7c256b5365c597a9212e99beda94c6eff0647c3").unwrap().reverse(), height: 1091376, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000ddbfad338961f2d900d62f1c3b725fbd72052da062704901c").unwrap().reverse(), height: 1090848, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000003b3ea97e688f1bec5f95930950b54c1bb01bf67b029739696").unwrap().reverse(), height: 1091640, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001a0d96dbc0cac26e445454dd2506702eeee7df6ff35bdcf60e").unwrap().reverse(), height: 1091544, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001aac60fafe05124672b19a1c3727dc17f106f11295db1053a3").unwrap().reverse(), height: 1092288, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000e37bca1e08dff47ef051199f24e9104dad85014c323464069").unwrap().reverse(), height: 1091208, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000f4c8d5bdf6b89435d3a9789fce401286eb8f3f6eeb84f2a1d").unwrap().reverse(), height: 1091160, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001414ff2dd44ee4c01c02e6867228b4e1ff490f635f7de949a5").unwrap().reverse(), height: 1091232, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000013b130038d0599cb5a65165fc03b1b38fe2dd1a3bad6e253df").unwrap().reverse(), height: 1092312, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000082cb9d6d169dc625f64a6a24756ba796eaab131a998b42910").unwrap().reverse(), height: 1091928, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000001e358bce8df79c24def4787bf0bf7af25c040342fae4a18ce").unwrap().reverse(), height: 1091880, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000005f05fa51e0552ca6e46780be550da7230cd2d02f8ed4506ef").unwrap().reverse(), height: 1097808, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000faf2cac0d4b6b64fc168c3febe54a56a7ffc395cff98a9197").unwrap().reverse(), height: 1097208, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000096d80e8274bea062831d5befafae221dfcfd3717ce6cf6014").unwrap().reverse(), height: 1098576, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000123be8fccf32a966f94362e7676ff22e3fffc5acd0564478de").unwrap().reverse(), height: 1096392, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001d33b9dd2600867da9b4dceb9393bc5352d157dc0755255ae6").unwrap().reverse(), height: 1096224, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001aaa7a0a09708d929587fc17ff20e67cbd961e4661c210cd55").unwrap().reverse(), height: 1098288, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000005b792156d43ece54c07684f25a3bc68535635a168270c164f").unwrap().reverse(), height: 1098408, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000cb19c621f3f6f31890cfe20e96de7f07c7cc87df6e76c0fdb").unwrap().reverse(), height: 1096248, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000a4f7cd4fbdd47a1a3dabc82b7f48c5a47340c2440decd1ad1").unwrap().reverse(), height: 1098264, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001b6423cb52fefd813e6263dda5fd8e4f611c87c4c10f9efd63").unwrap().reverse(), height: 1098120, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000d81a502004fa824e8864fe72cce5e441c94e70781a1d5c248").unwrap().reverse(), height: 1098912, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002043543aca7a30d6ce95c030e51734341fdd2a8473eb07c4fc").unwrap().reverse(), height: 1098216, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000125044156d05c1b5309521483a76786cb549748b78bc1dd885").unwrap().reverse(), height: 1096176, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000008f5ae5a32a484eb829f78eece049e70395de65f0d03e20dd6").unwrap().reverse(), height: 1097448, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001168a451504cc254c531a006a77d707a279fbe9dd51a65acda").unwrap().reverse(), height: 1096824, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000017b0ee941a07532c47c814ec751854b551e3da2bf8addfc7da").unwrap().reverse(), height: 1096776, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000fc7af431ccc9374589ade89b86b826a38b0b36cadb2a0bdbf").unwrap().reverse(), height: 1096464, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000086edc17d34df01f002195a5d737063324f3e46930c57350b2").unwrap().reverse(), height: 1096896, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000812756367b7f38cc27ca1ac63f26c7ee81248be99b8a399fe").unwrap().reverse(), height: 1096944, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000226c79b8624a3b2855d8b84bc68a0b0f8461026e7cada81d4a").unwrap().reverse(), height: 1096368, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000e8cd9d448061b1a8198ad4741707b8d01a23b5b71cd7f5688").unwrap().reverse(), height: 1097784, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000037258bba0d30a803fd73fc60d27ce93b9f1293b52c78aa35f").unwrap().reverse(), height: 1097592, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001c7361f82e8da3d6a7fb34ad5ae4dde3ddcc1d9ddba8cafd39").unwrap().reverse(), height: 1097664, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000a37f2a18828ab4d27d2c1aae5e05a606ddba526750c024cd9").unwrap().reverse(), height: 1096416, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000015f263e5713680e8c256120ec739828028aa4124e1463f939").unwrap().reverse(), height: 1096536, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000dd632855f6ed62d0a421e9fbb6a4ef3a9b28aebf1af65e98b").unwrap().reverse(), height: 1098552, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000004586e94967e381843192f972678f1a1f58c4dde5e99d8fc44").unwrap().reverse(), height: 1097328, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000018534d3aae537bf48656883e4f441e0bd28670347cc5d0d6b1").unwrap().reverse(), height: 1097232, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000019112283be4f21b455b53a1b2ca7c04d4df4db64dc5eaf33e9").unwrap().reverse(), height: 1096344, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000120b56f64ed6c173562a814fef9cdb223f98ceb71ec0721453").unwrap().reverse(), height: 1098816, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001cc3f58f03c176be5a1aa858358d90d28396f5f14a5841dfc8").unwrap().reverse(), height: 1096296, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002021e36a9eb14321eea04df8c2d9f5a98aba4ae110811a265a").unwrap().reverse(), height: 1098360, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000080cc4309a7447bb9ece31700769dc379572d22e45798fa2f").unwrap().reverse(), height: 1098168, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000002d799bd937089094546ea6910362cdde13305a190cc228966").unwrap().reverse(), height: 1097760, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000d02d05da2fa63761aebc1dc6ad313da63b10809026aa32012").unwrap().reverse(), height: 1096632, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000016174a372e62c8c18817df356487d539135ead487ecec8d276").unwrap().reverse(), height: 1097160, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000b62b169b3621aca12f2a4b1faa5443e52c435118f0a185a1a").unwrap().reverse(), height: 1098768, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000e5458bc47813b49b23d3a3f015bd74628e1950bc51086891b").unwrap().reverse(), height: 1094976, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001a7eaa4cb338614eaa498c87171a5459c35b1879267896a8b8").unwrap().reverse(), height: 1096728, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000cf068c8605300fa6eaabf1cd72f0baa91ebbfc7f615efffb0").unwrap().reverse(), height: 1097904, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000a7db9d1cb6e97587548d12f9b15e1d7217c3bb9fc5f7aca62").unwrap().reverse(), height: 1096992, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000120aa3e7d582a37cd1ba9e33f7255643886dfce934e608f588").unwrap().reverse(), height: 1098144, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000006859c3d9a085c3bbe1aada948f6d573af21b41c68e66b9ac8").unwrap().reverse(), height: 1098840, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000199f543a7d3e9f6372d950721a88a9a10aa92917c7a663695b").unwrap().reverse(), height: 1098672, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000184ffe2c87ee0e8046b630bbb67e8708a59d78a501c22f7ead").unwrap().reverse(), height: 1096440, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000128cc9aebae3ea0753103e4c53286b2370e1dab2655ce68b19").unwrap().reverse(), height: 1098528, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000000fd8021168f6be48e6c1444e29f85fa72c654b4f616c071f6").unwrap().reverse(), height: 1098312, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000017693260e70c48015796efdbf6cfb36c3ed16a0ce0aa72110e").unwrap().reverse(), height: 1097520, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001ffbd9b2b064b32e64c6d3a3dae13780a8f67dd8123a52f824").unwrap().reverse(), height: 1096680, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000b08d1bcf29d13fc4cb8972420979a7cca01bb3e76e848b341").unwrap().reverse(), height: 1097880, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000138ee64cdd6c5c9eb641be56002a08cc4da3947c9a8427b811").unwrap().reverse(), height: 1097424, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000022ba51a9c85c3f2908e050e251031c127c379ed4c84dc3995").unwrap().reverse(), height: 1098024, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000069501469ea47bdc919909737c7ae881cb0048dc7406a547f4").unwrap().reverse(), height: 1098432, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001d396bfa004a77bc6a590ebd4e62c3be62e17c9f9183b6b2a6").unwrap().reverse(), height: 1097472, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000e5442292206c610d87af06af00500a22b3bf478d3ac05ab65").unwrap().reverse(), height: 1098984, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001212cd887e2064e0fef2efe30efad366a3043ac618c8d1f7e0").unwrap().reverse(), height: 1097136, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000017dd8f722b72713df020c25cd8bb189e1516fbb97f91712276").unwrap().reverse(), height: 1098000, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000017bb50e264cebfec81804847bb19b759e1deed6d5ccd54af70").unwrap().reverse(), height: 1096488, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000076e6e626df28690678d026dcb7655433cb77cbbce4585ab9").unwrap().reverse(), height: 1097352, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000b0e12838219dce4ee33bd3ebf148a6655cdef57f5ac74dec1").unwrap().reverse(), height: 1098744, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000ee7034001ad0ed7040a4a55a388824624b2770154cb7b2778").unwrap().reverse(), height: 1098480, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000002ae77e6e7922c995ab76163717382c2290699125b017aeb83").unwrap().reverse(), height: 1096608, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000e40f843520b37a0299e0f73c03cc09e20e1f7e1d15db0eac3").unwrap().reverse(), height: 1097496, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000931d7809849ee2c0520274565043c91011abab799484c2990").unwrap().reverse(), height: 1097304, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000000049b8adab54f72710bf6d897597766529325c713de86b5e4").unwrap().reverse(), height: 1098648, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002156a89bfcb10462994d1d0953b418583140f2874b84a750ca").unwrap().reverse(), height: 1097256, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000012d25cbba3536d24aa5cc53c622eeac03c65412383147f4394").unwrap().reverse(), height: 1099008, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000787490f469efdfb1dbf6b86150b86c48f127f7653211b2c41").unwrap().reverse(), height: 1098096, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000a3a980aec3a4421b54dbbb407f30ee949c13e3665cc372009").unwrap().reverse(), height: 1098624, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001fb0ced1479e7d15e7efed4b92b1d5ec43a1da297e8dc64a1e").unwrap().reverse(), height: 1097376, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000016f526c58ea7a5ba4091426d3d9d11434ef422cd6cbfa0a4d1").unwrap().reverse(), height: 1098960, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000057f1c57f1183758044c52c33ddd6b8ab2171afcb980062117").unwrap().reverse(), height: 1096560, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000c595ba7f4da46fb33fdfb5cbff49a5af1536de6baaf364658").unwrap().reverse(), height: 1098240, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000023382f4fda810321271b8d5b32fc5c0a8ae82d6e35e73ea7d5").unwrap().reverse(), height: 1097064, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001ad5328d0a3c97209bbbca4bb35d76119a8ac0231a36aa75c9").unwrap().reverse(), height: 1097280, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000106c3b9664269e2a92d53266f5485f24266e61d12f902f85ea").unwrap().reverse(), height: 1098720, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000018925fd95309371243ef4df332801968084363af572f6c5d45").unwrap().reverse(), height: 1097616, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000011038e77a86801cb5f05047d45e57b8a95b715f7f5bed2ac70").unwrap().reverse(), height: 1096272, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000f7943a003184c5e99b5951fa80d80d6585721e1819b046617").unwrap().reverse(), height: 1096512, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000e0e3a7248d77f94d3013cae7b27090941a944926683c7126c").unwrap().reverse(), height: 1096152, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000acc62d1c58e0cf316573ca248fcaefc98f77619d227d93413").unwrap().reverse(), height: 1096320, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000012b1e0582fa3c805bb15ebab29792766815ea008254395aebf").unwrap().reverse(), height: 1096848, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000016f620befa318c8b40bc5d9a955121261af09ac8ddeef93e5e").unwrap().reverse(), height: 1097088, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000017ae9d4db3c6e6fdf7827824423caa4599219f3af795ec6404").unwrap().reverse(), height: 1096704, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000013fea89dca12ca39a3250bab6ff979c682b44c968892e7844e").unwrap().reverse(), height: 1095840, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000c43df820465cf30f4e9d8a38330c5f7c4fcb90780aa88df38").unwrap().reverse(), height: 1096656, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000006b8f4ccbf679f3f5744d879c02851a361ef7e1e0ed9d57e18").unwrap().reverse(), height: 1097016, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001ad3de1c97c51b31072ea54380034b01bdf7da610b77f75189").unwrap().reverse(), height: 1098048, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001efb6b66a1cd0f2c6a41c9a820db8fc5de159aa186a09a4ce2").unwrap().reverse(), height: 1098936, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000005d2b5286b448a25d9c2006849d41fb0c9c4bb3bb8724c42d").unwrap().reverse(), height: 1098864, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000008997ba7c5b584a4dbffd17a8b5cd08cae51e7e6371f0ec3ca").unwrap().reverse(), height: 1098696, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000022a46ff5bb17d406fa821f70aa80c2b9aa37bc21edaea2569a").unwrap().reverse(), height: 1098072, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000125d8731954a9c15b86b34e78c1fbe2ca29bd3a99f38462689").unwrap().reverse(), height: 1098888, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000016ad254676362d6cad62acaa1f9900b6c951cfd73303fa0356").unwrap().reverse(), height: 1098792, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000020d7ac24b497e420c8eeb9de5ba55a4a204130dda9e09fc85a").unwrap().reverse(), height: 1097568, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001e3c72bec566addb499b9f633effe8cb4f1ddab303fa155d13").unwrap().reverse(), height: 1097544, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000143c121d0ebcc8ac6d22f5f2bf44b1b871569dec0e4df7c69c").unwrap().reverse(), height: 1095552, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001e1c9372e3d2db633498af3c900f87de1c5f19ed05a0df4072").unwrap().reverse(), height: 1097736, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000185588f0dcad30cbe720b5bc67abfae54e64d9f92e1e0b2d22").unwrap().reverse(), height: 1097040, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000185765bff94d5da02e62261ab2366d2ccaa0d86685c0485de").unwrap().reverse(), height: 1097976, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000557d8eb6ecdf684f3b7f3219794047ac4f44eff0d9bfbdb7b").unwrap().reverse(), height: 1097184, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000063d1eabcc5c29a51c0aa354b758b33e70f722f78c46741342").unwrap().reverse(), height: 1096200, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000134b8226f8db668803ee6abcfe4df2809b36de36205bd80227").unwrap().reverse(), height: 1096920, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001afbb65ce325134464e74de2c9e1f67c61501c434e82514094").unwrap().reverse(), height: 1097688, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000178d6cb5792aea8a9e51a716df4b20018761509dddd881b6b").unwrap().reverse(), height: 1097112, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000020eeb077e77f9e3e60975e2a7426b6084ff8ad5ca43ef17c41").unwrap().reverse(), height: 1096968, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000db1e46a7e9890b842506e2775fd4723fbbe2d420609087f21").unwrap().reverse(), height: 1096128, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000029151942416b68ff4aada689b12e47cc09ce7b802ded57505").unwrap().reverse(), height: 1096800, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001c5cdb520ddc3ec0511790352f6177d5e598656f83690bd734").unwrap().reverse(), height: 1096584, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000012bf85edb70e524a05c56644b0bdb0ce4a2d6d12739463c52b").unwrap().reverse(), height: 1096752, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000e5535ad543a6bfb463bc8f0636aac6a3e7f79683b7c94bf6f").unwrap().reverse(), height: 1097832, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000010404aecc04aff5a2be47a5c6caeeea32160df9fe8c47511ed").unwrap().reverse(), height: 1097856, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000001cf3f3937abd607c9ab0a50a354edf3614378aca4fb8fdf5e").unwrap().reverse(), height: 1098384, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000157572263a4b5a3c7a22f10c66c423be1d5a51aa24bc9f724b").unwrap().reverse(), height: 1097400, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001dcf7e0c3a9130750540511e0cf631ea2f81aac7617c821755").unwrap().reverse(), height: 1098504, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000071e19fd57488218254d12b773d3a7f8b2dc53b9d45805c9a8").unwrap().reverse(), height: 1096872, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000095ea3c8e00a43086c7d5f6ececc6642721f733eb27229ff86").unwrap().reverse(), height: 1097712, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000eb3238f4d8a2f95b0a4692548b6547cf495e4ce790e61d2b5").unwrap().reverse(), height: 1098192, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000016570cdc593f871223b3aec795c1049c2d40c702925e0d2800").unwrap().reverse(), height: 1098456, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000169f9688971408aadfd3159740d11b9f504719ceaafe117a26").unwrap().reverse(), height: 1098600, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000000cfd7003a6aa0b1e0ae1c556a9b83a064771e2ba5a4668169").unwrap().reverse(), height: 1097640, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000247cb10a7d823736b672866e1d015ce1446a9e0b3c87eb25e5").unwrap().reverse(), height: 1098336, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001df6026dcd49b32b8cda38807cc475d6868679e6eb77e5edf4").unwrap().reverse(), height: 1097952, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000e78706ecf6d744a2edc5143d3325ade22940dc14ccfd3f938").unwrap().reverse(), height: 1094400, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000bf16cfee1f69cd472ac1d0285d74d025caa27cebb0fb6842f").unwrap().reversed(), height: 1090392, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000d6f921ffd1b48815407c1d54edc93079b7ec37a14a9c528f7").unwrap().reversed(), height: 1090776, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000c559941d24c167053c5c00aea59b8521f5cef764271dbd3c5").unwrap().reversed(), height: 1091280, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000003269a36d2ce1eee7753a2d2db392fff364f64f5a409805ca3").unwrap().reversed(), height: 1092840, merkleroot: <[u8; 32]>::from_hex("0dd88a7fd4cbba15226af4e8c7b8a151395f1874a62656f4fc76301b6a4b92f3").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001a505b133ea44b594b194f12fa08650eb66efb579b1600ed1e").unwrap().reversed(), height: 1090368, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000006998d05eff0f4e9b6a7bab1447534eccb330972a7ef89ef65").unwrap().reversed(), height: 1091424, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001d9b6925a0bc2b744dfe38ff7da2ca0256aa555bb688e21824").unwrap().reversed(), height: 1090920, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000c22e2f5ca2113269ec62193e93158558c8932ba1720cea64f").unwrap().reversed(), height: 1092648, merkleroot: <[u8; 32]>::from_hex("a5dc10f929abd8d99f7adb15c33a2cc0df915e2ed90e913805dad1eb4672af7f").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000020019489504beba1d6197857e63c44da3eb9e3b20a24f40d1e").unwrap().reversed(), height: 1092168, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000112e41e4b3afda8b233b8cc07c532d2eac5de097b68358c43e").unwrap().reversed(), height: 1088640, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000143df6e8e78a3e79f4deed38a27a05766ad38e3152f8237852").unwrap().reversed(), height: 1090944, merkleroot: <[u8; 32]>::from_hex("a7486c7716863cbb5ef6580763e31d378ff2790bba3e6f14960aa34e12a5bad2").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000028d39e78ee49a950b66215545163b53331115e6e64d4d80328").unwrap().reversed(), height: 1091184, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000093b22f6342de731811a5b3fa51f070b7aac6d58390d8bfe8c").unwrap().reversed(), height: 1091664, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000037187889dd360aafc49d62a7e76f4ab6cd2813fdf610a7292").unwrap().reversed(), height: 1092504, merkleroot: <[u8; 32]>::from_hex("1bd9c9c11026b7cdd720b3daa99d48df5369d57f709c627e13e98dfbfb558d0c").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000aee08f8aaf8a5232cc692ef5fcc016786af72bd9b001ae43b").unwrap().reversed(), height: 1090992, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002395b6c4e4cb829556d42c659b585ee4c131a683b9f7e37706").unwrap().reversed(), height: 1092192, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000048a9b52e6f46f74d92eb9740e27c1d66e9f2eb63293e18677").unwrap().reversed(), height: 1091976, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001b4d519e0a9215e84c3007597cef6823c8f1c637d7a46778f0").unwrap().reversed(), height: 1091448, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001730249b150b8fcdb1078cd0dbbfa04fb9a18d26bf7a3e80f2").unwrap().reversed(), height: 1092528, merkleroot: <[u8; 32]>::from_hex("866c7830fa9071fd886cfb64d32f60d4dc959494c6557ecb05617acd3f8e6f64").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001c3073ff2ee0af660c66762af38e2c5782597e32ed690f0f72").unwrap().reversed(), height: 1092072, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000c49954d58132fb8a1c90e4e690995396be91d8f27a07de349").unwrap().reversed(), height: 1092624, merkleroot: <[u8; 32]>::from_hex("7708bb2b07c9f3d7efba8427abd57ba3e62ec7b7fb0b351a759817fd2213b229").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000016200a3f98e44f4b9e65da04b86bad799e6bbfa8972f0cead").unwrap().reversed(), height: 1090080, merkleroot: Default::default() }, + MerkleBlock::reversed(1092600, "000000000000000a80933f2b9b8041fdfc6e94b77ba8786e159669f959431ff2", "69c5aba988a9dc226514ef10e2001b5df7ac2a8fb87fd6b13e27c937431f8562"), + // MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000a80933f2b9b8041fdfc6e94b77ba8786e159669f959431ff2").unwrap().reversed(), height: 1092600, merkleroot: <[u8; 32]>::from_hex("69c5aba988a9dc226514ef10e2001b5df7ac2a8fb87fd6b13e27c937431f8562").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000153afcdccc3186ad2ca4ed10a79bfb01a2c0056c23fe039d86").unwrap().reversed(), height: 1092456, merkleroot: <[u8; 32]>::from_hex("673da0b1cf47cd1bcb2ea4931e7b8a04ec96998477edd043e4abc42c9c9b6ef9").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000103bad71d3178a6c9a2f618d9d09419b38e9caee0fddbf664a").unwrap().reversed(), height: 1092864, merkleroot: <[u8; 32]>::from_hex("73b17a0d933ce9f8e5246bad5cb59c5a26437faa27d76fe1cb96f3c57432cead").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001b732bc6d52faa8fae97d76753c8e071767a37ba509fe5c24a").unwrap().reversed(), height: 1092360, merkleroot: <[u8; 32]>::from_hex("32ba264203d88522fa3e00f1cebd8cb69743f56df2b33007f60885655306f4f2").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001a17f82d76a0d5aa2b4f90a6e487df366d437c34e8453f519c").unwrap().reversed(), height: 1091112, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000caa00c2c24a385513a1687367157379a57b549007e18869d8").unwrap().reversed(), height: 1090680, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000022e463fe13bc19a1fe654c817cb3b8e207cdb4ff73fe0bcd2c").unwrap().reversed(), height: 1091736, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001b33b86b6a167d37e3fcc6ba53e02df3cb06e3f272bb89dd7d").unwrap().reversed(), height: 1092744, merkleroot: <[u8; 32]>::from_hex("feb3aa5d6716223df7e62e1fb558cef944147b468172c1742f59fffe87cf3101").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000006051479afbbb159d722bb8feb10f76b8900370ceef552fc49").unwrap().reversed(), height: 1092432, merkleroot: <[u8; 32]>::from_hex("71cf3c3d6cfb262efa9a2e15af37f953bb60e61a7dfc503305723b5a481d5d59").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000008cc37827fd700ec82ee8b54bdd37d4db4319496977f475cf8").unwrap().reversed(), height: 1091328, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000006242af03ba5e407c4e8412ef9976da4e7f0fa2cbe9889bcd2").unwrap().reversed(), height: 1089216, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001dc4a842ede88a3cc975e2ade4338513d546c52452ab429ba0").unwrap().reversed(), height: 1091496, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000010d30c51e8ce1730aae836b00cd43f3e70a1a37d40b47580fd").unwrap().reversed(), height: 1092816, merkleroot: <[u8; 32]>::from_hex("591c9d99f4f29428688bdea6541e0eaa2b0308908e3f1078c6f38702088d1dd2").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000212441a8ef2495d21b0b7c09e13339dbc34d98c478cc51f8e2").unwrap().reversed(), height: 1092096, merkleroot: <[u8; 32]>::from_hex("0a0bfc65a6034d98bc07da7099092b7661f77918c8a474d5ed2b5d693a7c3916").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000039d7eb80e1bbf6f7f0c43f7f251f30629d858bbcf6a18ab58").unwrap().reversed(), height: 1090728, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000004532e9c4a1def38cd71f3297c684bfdb2043c2aec173399e0").unwrap().reversed(), height: 1091904, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000b73060901c41d098b91f69fc4f27aef9d7ed7f2296953e407").unwrap().reversed(), height: 1090560, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000016659fb35017e1f6560ba7036a3433bfb924d85e3fdfdd3b3d").unwrap().reversed(), height: 1091256, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000a3c6796d85c8c49b961363ee88f14bff10c374cd8dd89a9f6").unwrap().reversed(), height: 1092696, merkleroot: <[u8; 32]>::from_hex("8d5630695f5d8ddb672280e886ddde466a3f4586dd6c05101091bdb6b618686f").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000f33533ba1c5d72f678ecd87abe7e974debda238c53b391737").unwrap().reversed(), height: 1092720, merkleroot: <[u8; 32]>::from_hex("272cde3f975a9c4765702a48eb7e39e914a9e5480f1af63060086b33719e6b0d").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000150907537f4408ff4a8610ba8ce2395faa7e44541ce2b6c37").unwrap().reversed(), height: 1090608, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001977d3a578e0ac3e4969675a74afe7715b8ffd9f29fbbe7c36").unwrap().reversed(), height: 1091400, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000004493e40518e7d3aff585e84564bcd80927f96a07ec80259cb").unwrap().reversed(), height: 1092480, merkleroot: <[u8; 32]>::from_hex("42732f6b8bae09d5224a9591eff8a1362f6c946201cd4f61cf6423a15a5d749d").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000df5e2e0eb7eaa36fcef28967f7f12e539f74661e03b13bdba").unwrap().reversed(), height: 1090704, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000172f1765f4ed1e89ba4b717a475e9e37124626b02d566d31a2").unwrap().reversed(), height: 1090632, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000018e62a4938de3428ddaa26e381139489ce1a618ed06d432a38").unwrap().reversed(), height: 1092024, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000790bd24e65daaddbaeafdb4383c95d64c0d055e98625746bc").unwrap().reversed(), height: 1091832, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000005f28a2cb959b316cd4b43bd29819ea07c27ec96a7d5e18ab7").unwrap().reversed(), height: 1092408, merkleroot: <[u8; 32]>::from_hex("59c685074dce36fdd425655652baaafec7e2ea524ef71faabf2002054247dc24").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000165a4ace8de9e7a4ba0cddced3434c7badc863ff9e237f0c8a").unwrap().reversed(), height: 1091088, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000230ec901e4d372a93c712d972727786a229e98d12694be9d34").unwrap().reversed(), height: 1090416, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000bf51de942eb8610caaa55a7f5a0e5ca806c3b631948c5cdcc").unwrap().reversed(), height: 1092336, merkleroot: <[u8; 32]>::from_hex("fc75f6bb09643fae229917030e0ea84586490e9ac7e206d6f1737e6a64c22a2a").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002323d7ba466a9b671d335c3b2bf630d08f078e4adee735e13a").unwrap().reversed(), height: 1090464, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000019db2ad91ab0f67d90df222ce4057f343e176f8786865bcda9").unwrap().reversed(), height: 1091568, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000004a38d87062bf37ef978d1fc8718f03d9222c8aa7aa8a4470f").unwrap().reversed(), height: 1090896, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000022c909de83351791e0b69d4b4be34b25c8d54c8be3e8708c87").unwrap().reversed(), height: 1091592, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000008f3dffcf342279c8b50e49c47e191d3df453fdcd816aced46").unwrap().reversed(), height: 1092792, merkleroot: <[u8; 32]>::from_hex("c371fd08a8d3665d14aaa14965d5c8cd74eccefdc9e2194d327251ca4b7598d8").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001d1d7f1b88d6518e6248616c50e4c0abaee6116a72bc998679").unwrap().reversed(), height: 1092048, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000020de87be47c5c10a50c9edfd669a586f47f44fa22ae0b2610a").unwrap().reversed(), height: 1090344, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000014d1d8d12dd5ff570b06e76e0bbf55d762a94d13b1fe66a922").unwrap().reversed(), height: 1091760, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000962d0d319a96d972215f303c588bf50449904f9a1a8cbc7c2").unwrap().reversed(), height: 1089792, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000171c58d1d0dbae71973530aa533e4cd9cb2d2597ec30d9b129").unwrap().reversed(), height: 1091352, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000004acf649896a7b22783810d5913b31922e3ea224dd4530b717").unwrap().reversed(), height: 1092144, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000013479b902955f8ba2d4ce2eb47a7f9f8f1fe477ec4b405bddd").unwrap().reversed(), height: 1090512, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001be0bbdb6b326c98ac8a3e181a2a641379c7d4308242bee90b").unwrap().reversed(), height: 1092216, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001c09a68353536ccb24b51b74c642d5b6e7e385cff2debc4e64").unwrap().reversed(), height: 1092120, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000013974ed8e13d0a50f298be0f2b685bfcfd8896172db6d4a145").unwrap().reversed(), height: 1090824, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001dbcd3a23c131fedde3acd6da89275e7f9fcae03f3107da861").unwrap().reversed(), height: 1092888, merkleroot: <[u8; 32]>::from_hex("078a57d4071f15e0fca004c2cb8225343be82acfdfdfd122eb352a976b494cb5").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000a8812d75979aac7c08ac69179037409fd7a368372edd05d23").unwrap().reversed(), height: 1090872, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001fafca43cabdb0c6385daffa8a039f3b44b9b17271d7106704").unwrap().reversed(), height: 1090800, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000006e9693e34fc55452c82328f31e069df740655b55dd07cb58b").unwrap().reversed(), height: 1091016, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000010e7c080046121900cee1c7de7fe063c7d81405293a9764733").unwrap().reversed(), height: 1092384, merkleroot: <[u8; 32]>::from_hex("711869e044050ee3b98b62ee504a9c2df8f683347527b0af0ac90f190570f4d6").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000022ef41cb09a617d87c12c6841eea47310ae6a4d1e2702bb3d3").unwrap().reversed(), height: 1090752, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000017705efcdaefd6a1856becc0b915de6fdccdc9e149c1ff0e8f").unwrap().reversed(), height: 1091856, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000000265a9516f35dd85d32d103d4c3b95e81969a03295f46cf0c").unwrap().reversed(), height: 1091952, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000002dfd994409f5b6185573ce22eae90b4a1c37003428071f0a8").unwrap().reversed(), height: 1090968, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001b8d6aaa56571d987ee50fa2e2e9a28a8482de7a4b52308f25").unwrap().reversed(), height: 1091136, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000020635160b49a18336031af2d25d9a37ea211d514f196220e9d").unwrap().reversed(), height: 1090440, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001bfb2ac93ebe89d9831995462f965597efcc9008b2d90fd29f").unwrap().reversed(), height: 1091784, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000028515b4c442c74e2af945f08ed3b66f05847022cb25bb2ec").unwrap().reversed(), height: 1091688, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000ed6b9517da9a1df88d03a5904a780aba1200b474dab0e2e4a").unwrap().reversed(), height: 1090488, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000b44a550a61f9751601065ff329c54d20eb306b97d163b8f8c").unwrap().reversed(), height: 1091712, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001d831888fbd1899967493856c1abf7219e632b8e73f25e0c81").unwrap().reversed(), height: 1091064, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000073b62bf732ab8654d27b1296801ab32b7ac630237665162a5").unwrap().reversed(), height: 1091304, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000004c0b03207179143f028c07ede20354fab68c731cb02f95fc8").unwrap().reversed(), height: 1090656, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000df9d9376b9c32ea640ecfac406b41445bb3a4b0ee6625e572").unwrap().reversed(), height: 1091040, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000145c3e1b3bb6f53d5e2dd441ac41c3cfe48a5746c7b168a415").unwrap().reversed(), height: 1092240, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000d8bf4cade14e398d69884e991591cb11ee7fec49167e4ff85").unwrap().reversed(), height: 1092000, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001d098ef14fa032b33bcfc8e559351be8cd689e03c9678256a9").unwrap().reversed(), height: 1091472, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000000c25139a9227273eb7547a1f558e62c545e62aeb236e66259").unwrap().reversed(), height: 1090584, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000010785f105cc7c256b5365c597a9212e99beda94c6eff0647c3").unwrap().reversed(), height: 1091376, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000000fafe0f7314104d81ab34ebd066601a38e5e914f2b3cefce9").unwrap().reversed(), height: 1092552, merkleroot: <[u8; 32]>::from_hex("c18593cab2f1d7507dc82b259b1ac99863b53d06b3f41ab48fa7f19f037645ce").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000ddbfad338961f2d900d62f1c3b725fbd72052da062704901c").unwrap().reversed(), height: 1090848, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000e5d9359857518aaf3685bf8af55c675cf0d17a45383ca297f").unwrap().reversed(), height: 1091520, merkleroot: <[u8; 32]>::from_hex("4a18d870099df51c8f15952c2693afbc6c571c821fa884452444f4b2377db95f").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000012b444de0be31d695b411dcc6645a3723932cabc6b9164531f").unwrap().reversed(), height: 1092916, merkleroot: <[u8; 32]>::from_hex("34d3410507b4b7a74f0adcf2f468a6af79a13cad6f5930e36af3a61308e353c6").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001c414007419fc22a2401b07ab430bf433c8cdfb8877fb6b5b7").unwrap().reversed(), height: 1092672, merkleroot: <[u8; 32]>::from_hex("de573f1bc65426f7c82c4fb71c6c1da8b5b5f0a8ec764dad77d65426d1291f3e").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000355efb9a350cc76c7624bf42abea845770a5c3adc2c5b93f4").unwrap().reversed(), height: 1092576, merkleroot: <[u8; 32]>::from_hex("629044da3718f0717ec760070b8ef247979f492f8ff32ac074a497244bccaa53").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000f327555478a9d580318cb6e15db059642eff84797bf133196").unwrap().reversed(), height: 1091808, merkleroot: <[u8; 32]>::from_hex("3c2b72bad9c3d9468125fac4b1b893409485a9742461f4cabdc84292fee8c20a").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000003b3ea97e688f1bec5f95930950b54c1bb01bf67b029739696").unwrap().reversed(), height: 1091640, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001a0d96dbc0cac26e445454dd2506702eeee7df6ff35bdcf60e").unwrap().reversed(), height: 1091544, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001aac60fafe05124672b19a1c3727dc17f106f11295db1053a3").unwrap().reversed(), height: 1092288, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000e37bca1e08dff47ef051199f24e9104dad85014c323464069").unwrap().reversed(), height: 1091208, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000013dd0059e5f701a39c0903e7f16d393f55fc896422139a4291").unwrap().reversed(), height: 1092768, merkleroot: <[u8; 32]>::from_hex("faaddde59b54a6eb4f7b5df49f80dd59f0fb31403d7dcf4c4ce28b23674f0a5a").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000f4c8d5bdf6b89435d3a9789fce401286eb8f3f6eeb84f2a1d").unwrap().reversed(), height: 1091160, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001414ff2dd44ee4c01c02e6867228b4e1ff490f635f7de949a5").unwrap().reversed(), height: 1091232, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000013b130038d0599cb5a65165fc03b1b38fe2dd1a3bad6e253df").unwrap().reversed(), height: 1092312, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000082cb9d6d169dc625f64a6a24756ba796eaab131a998b42910").unwrap().reversed(), height: 1091928, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000001e358bce8df79c24def4787bf0bf7af25c040342fae4a18ce").unwrap().reversed(), height: 1091880, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000ffd590b1485b3caadc19b22e6379c733355108f107a430458cdf3407ab6").unwrap().reversed(), height: 0, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000bf16cfee1f69cd472ac1d0285d74d025caa27cebb0fb6842f").unwrap().reversed(), height: 1090392, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000d6f921ffd1b48815407c1d54edc93079b7ec37a14a9c528f7").unwrap().reversed(), height: 1090776, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000c559941d24c167053c5c00aea59b8521f5cef764271dbd3c5").unwrap().reversed(), height: 1091280, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001a505b133ea44b594b194f12fa08650eb66efb579b1600ed1e").unwrap().reversed(), height: 1090368, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000006998d05eff0f4e9b6a7bab1447534eccb330972a7ef89ef65").unwrap().reversed(), height: 1091424, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001d9b6925a0bc2b744dfe38ff7da2ca0256aa555bb688e21824").unwrap().reversed(), height: 1090920, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000020019489504beba1d6197857e63c44da3eb9e3b20a24f40d1e").unwrap().reversed(), height: 1092168, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000112e41e4b3afda8b233b8cc07c532d2eac5de097b68358c43e").unwrap().reversed(), height: 1088640, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000028d39e78ee49a950b66215545163b53331115e6e64d4d80328").unwrap().reversed(), height: 1091184, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000093b22f6342de731811a5b3fa51f070b7aac6d58390d8bfe8c").unwrap().reversed(), height: 1091664, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000aee08f8aaf8a5232cc692ef5fcc016786af72bd9b001ae43b").unwrap().reversed(), height: 1090992, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002395b6c4e4cb829556d42c659b585ee4c131a683b9f7e37706").unwrap().reversed(), height: 1092192, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000048a9b52e6f46f74d92eb9740e27c1d66e9f2eb63293e18677").unwrap().reversed(), height: 1091976, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001b4d519e0a9215e84c3007597cef6823c8f1c637d7a46778f0").unwrap().reversed(), height: 1091448, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001c3073ff2ee0af660c66762af38e2c5782597e32ed690f0f72").unwrap().reversed(), height: 1092072, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000016200a3f98e44f4b9e65da04b86bad799e6bbfa8972f0cead").unwrap().reversed(), height: 1090080, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001a17f82d76a0d5aa2b4f90a6e487df366d437c34e8453f519c").unwrap().reversed(), height: 1091112, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000caa00c2c24a385513a1687367157379a57b549007e18869d8").unwrap().reversed(), height: 1090680, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000022e463fe13bc19a1fe654c817cb3b8e207cdb4ff73fe0bcd2c").unwrap().reversed(), height: 1091736, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000008cc37827fd700ec82ee8b54bdd37d4db4319496977f475cf8").unwrap().reversed(), height: 1091328, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000006242af03ba5e407c4e8412ef9976da4e7f0fa2cbe9889bcd2").unwrap().reversed(), height: 1089216, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001dc4a842ede88a3cc975e2ade4338513d546c52452ab429ba0").unwrap().reversed(), height: 1091496, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000039d7eb80e1bbf6f7f0c43f7f251f30629d858bbcf6a18ab58").unwrap().reversed(), height: 1090728, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000004532e9c4a1def38cd71f3297c684bfdb2043c2aec173399e0").unwrap().reversed(), height: 1091904, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000b73060901c41d098b91f69fc4f27aef9d7ed7f2296953e407").unwrap().reversed(), height: 1090560, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000016659fb35017e1f6560ba7036a3433bfb924d85e3fdfdd3b3d").unwrap().reversed(), height: 1091256, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000150907537f4408ff4a8610ba8ce2395faa7e44541ce2b6c37").unwrap().reversed(), height: 1090608, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001977d3a578e0ac3e4969675a74afe7715b8ffd9f29fbbe7c36").unwrap().reversed(), height: 1091400, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000df5e2e0eb7eaa36fcef28967f7f12e539f74661e03b13bdba").unwrap().reversed(), height: 1090704, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000172f1765f4ed1e89ba4b717a475e9e37124626b02d566d31a2").unwrap().reversed(), height: 1090632, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000018e62a4938de3428ddaa26e381139489ce1a618ed06d432a38").unwrap().reversed(), height: 1092024, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000790bd24e65daaddbaeafdb4383c95d64c0d055e98625746bc").unwrap().reversed(), height: 1091832, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000165a4ace8de9e7a4ba0cddced3434c7badc863ff9e237f0c8a").unwrap().reversed(), height: 1091088, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000230ec901e4d372a93c712d972727786a229e98d12694be9d34").unwrap().reversed(), height: 1090416, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002323d7ba466a9b671d335c3b2bf630d08f078e4adee735e13a").unwrap().reversed(), height: 1090464, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000019db2ad91ab0f67d90df222ce4057f343e176f8786865bcda9").unwrap().reversed(), height: 1091568, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000004a38d87062bf37ef978d1fc8718f03d9222c8aa7aa8a4470f").unwrap().reversed(), height: 1090896, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000022c909de83351791e0b69d4b4be34b25c8d54c8be3e8708c87").unwrap().reversed(), height: 1091592, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001d1d7f1b88d6518e6248616c50e4c0abaee6116a72bc998679").unwrap().reversed(), height: 1092048, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000020de87be47c5c10a50c9edfd669a586f47f44fa22ae0b2610a").unwrap().reversed(), height: 1090344, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000014d1d8d12dd5ff570b06e76e0bbf55d762a94d13b1fe66a922").unwrap().reversed(), height: 1091760, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000962d0d319a96d972215f303c588bf50449904f9a1a8cbc7c2").unwrap().reversed(), height: 1089792, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000171c58d1d0dbae71973530aa533e4cd9cb2d2597ec30d9b129").unwrap().reversed(), height: 1091352, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000004acf649896a7b22783810d5913b31922e3ea224dd4530b717").unwrap().reversed(), height: 1092144, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000013479b902955f8ba2d4ce2eb47a7f9f8f1fe477ec4b405bddd").unwrap().reversed(), height: 1090512, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001be0bbdb6b326c98ac8a3e181a2a641379c7d4308242bee90b").unwrap().reversed(), height: 1092216, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001c09a68353536ccb24b51b74c642d5b6e7e385cff2debc4e64").unwrap().reversed(), height: 1092120, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000013974ed8e13d0a50f298be0f2b685bfcfd8896172db6d4a145").unwrap().reversed(), height: 1090824, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000a8812d75979aac7c08ac69179037409fd7a368372edd05d23").unwrap().reversed(), height: 1090872, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001fafca43cabdb0c6385daffa8a039f3b44b9b17271d7106704").unwrap().reversed(), height: 1090800, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000006e9693e34fc55452c82328f31e069df740655b55dd07cb58b").unwrap().reversed(), height: 1091016, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000022ef41cb09a617d87c12c6841eea47310ae6a4d1e2702bb3d3").unwrap().reversed(), height: 1090752, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000017705efcdaefd6a1856becc0b915de6fdccdc9e149c1ff0e8f").unwrap().reversed(), height: 1091856, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000000265a9516f35dd85d32d103d4c3b95e81969a03295f46cf0c").unwrap().reversed(), height: 1091952, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000002dfd994409f5b6185573ce22eae90b4a1c37003428071f0a8").unwrap().reversed(), height: 1090968, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001b8d6aaa56571d987ee50fa2e2e9a28a8482de7a4b52308f25").unwrap().reversed(), height: 1091136, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000020635160b49a18336031af2d25d9a37ea211d514f196220e9d").unwrap().reversed(), height: 1090440, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001bfb2ac93ebe89d9831995462f965597efcc9008b2d90fd29f").unwrap().reversed(), height: 1091784, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000028515b4c442c74e2af945f08ed3b66f05847022cb25bb2ec").unwrap().reversed(), height: 1091688, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000ed6b9517da9a1df88d03a5904a780aba1200b474dab0e2e4a").unwrap().reversed(), height: 1090488, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000b44a550a61f9751601065ff329c54d20eb306b97d163b8f8c").unwrap().reversed(), height: 1091712, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001d831888fbd1899967493856c1abf7219e632b8e73f25e0c81").unwrap().reversed(), height: 1091064, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000073b62bf732ab8654d27b1296801ab32b7ac630237665162a5").unwrap().reversed(), height: 1091304, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000004c0b03207179143f028c07ede20354fab68c731cb02f95fc8").unwrap().reversed(), height: 1090656, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000df9d9376b9c32ea640ecfac406b41445bb3a4b0ee6625e572").unwrap().reversed(), height: 1091040, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000145c3e1b3bb6f53d5e2dd441ac41c3cfe48a5746c7b168a415").unwrap().reversed(), height: 1092240, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000d8bf4cade14e398d69884e991591cb11ee7fec49167e4ff85").unwrap().reversed(), height: 1092000, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001d098ef14fa032b33bcfc8e559351be8cd689e03c9678256a9").unwrap().reversed(), height: 1091472, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000000c25139a9227273eb7547a1f558e62c545e62aeb236e66259").unwrap().reversed(), height: 1090584, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000010785f105cc7c256b5365c597a9212e99beda94c6eff0647c3").unwrap().reversed(), height: 1091376, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000ddbfad338961f2d900d62f1c3b725fbd72052da062704901c").unwrap().reversed(), height: 1090848, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000003b3ea97e688f1bec5f95930950b54c1bb01bf67b029739696").unwrap().reversed(), height: 1091640, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001a0d96dbc0cac26e445454dd2506702eeee7df6ff35bdcf60e").unwrap().reversed(), height: 1091544, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001aac60fafe05124672b19a1c3727dc17f106f11295db1053a3").unwrap().reversed(), height: 1092288, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000e37bca1e08dff47ef051199f24e9104dad85014c323464069").unwrap().reversed(), height: 1091208, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000f4c8d5bdf6b89435d3a9789fce401286eb8f3f6eeb84f2a1d").unwrap().reversed(), height: 1091160, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001414ff2dd44ee4c01c02e6867228b4e1ff490f635f7de949a5").unwrap().reversed(), height: 1091232, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000013b130038d0599cb5a65165fc03b1b38fe2dd1a3bad6e253df").unwrap().reversed(), height: 1092312, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000082cb9d6d169dc625f64a6a24756ba796eaab131a998b42910").unwrap().reversed(), height: 1091928, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000001e358bce8df79c24def4787bf0bf7af25c040342fae4a18ce").unwrap().reversed(), height: 1091880, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000005f05fa51e0552ca6e46780be550da7230cd2d02f8ed4506ef").unwrap().reversed(), height: 1097808, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000faf2cac0d4b6b64fc168c3febe54a56a7ffc395cff98a9197").unwrap().reversed(), height: 1097208, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000096d80e8274bea062831d5befafae221dfcfd3717ce6cf6014").unwrap().reversed(), height: 1098576, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000123be8fccf32a966f94362e7676ff22e3fffc5acd0564478de").unwrap().reversed(), height: 1096392, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001d33b9dd2600867da9b4dceb9393bc5352d157dc0755255ae6").unwrap().reversed(), height: 1096224, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001aaa7a0a09708d929587fc17ff20e67cbd961e4661c210cd55").unwrap().reversed(), height: 1098288, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000005b792156d43ece54c07684f25a3bc68535635a168270c164f").unwrap().reversed(), height: 1098408, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000cb19c621f3f6f31890cfe20e96de7f07c7cc87df6e76c0fdb").unwrap().reversed(), height: 1096248, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000a4f7cd4fbdd47a1a3dabc82b7f48c5a47340c2440decd1ad1").unwrap().reversed(), height: 1098264, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001b6423cb52fefd813e6263dda5fd8e4f611c87c4c10f9efd63").unwrap().reversed(), height: 1098120, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000d81a502004fa824e8864fe72cce5e441c94e70781a1d5c248").unwrap().reversed(), height: 1098912, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002043543aca7a30d6ce95c030e51734341fdd2a8473eb07c4fc").unwrap().reversed(), height: 1098216, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000125044156d05c1b5309521483a76786cb549748b78bc1dd885").unwrap().reversed(), height: 1096176, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000008f5ae5a32a484eb829f78eece049e70395de65f0d03e20dd6").unwrap().reversed(), height: 1097448, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001168a451504cc254c531a006a77d707a279fbe9dd51a65acda").unwrap().reversed(), height: 1096824, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000017b0ee941a07532c47c814ec751854b551e3da2bf8addfc7da").unwrap().reversed(), height: 1096776, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000fc7af431ccc9374589ade89b86b826a38b0b36cadb2a0bdbf").unwrap().reversed(), height: 1096464, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000086edc17d34df01f002195a5d737063324f3e46930c57350b2").unwrap().reversed(), height: 1096896, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000812756367b7f38cc27ca1ac63f26c7ee81248be99b8a399fe").unwrap().reversed(), height: 1096944, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000226c79b8624a3b2855d8b84bc68a0b0f8461026e7cada81d4a").unwrap().reversed(), height: 1096368, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000e8cd9d448061b1a8198ad4741707b8d01a23b5b71cd7f5688").unwrap().reversed(), height: 1097784, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000037258bba0d30a803fd73fc60d27ce93b9f1293b52c78aa35f").unwrap().reversed(), height: 1097592, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001c7361f82e8da3d6a7fb34ad5ae4dde3ddcc1d9ddba8cafd39").unwrap().reversed(), height: 1097664, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000a37f2a18828ab4d27d2c1aae5e05a606ddba526750c024cd9").unwrap().reversed(), height: 1096416, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000015f263e5713680e8c256120ec739828028aa4124e1463f939").unwrap().reversed(), height: 1096536, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000dd632855f6ed62d0a421e9fbb6a4ef3a9b28aebf1af65e98b").unwrap().reversed(), height: 1098552, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000004586e94967e381843192f972678f1a1f58c4dde5e99d8fc44").unwrap().reversed(), height: 1097328, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000018534d3aae537bf48656883e4f441e0bd28670347cc5d0d6b1").unwrap().reversed(), height: 1097232, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000019112283be4f21b455b53a1b2ca7c04d4df4db64dc5eaf33e9").unwrap().reversed(), height: 1096344, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000120b56f64ed6c173562a814fef9cdb223f98ceb71ec0721453").unwrap().reversed(), height: 1098816, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001cc3f58f03c176be5a1aa858358d90d28396f5f14a5841dfc8").unwrap().reversed(), height: 1096296, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002021e36a9eb14321eea04df8c2d9f5a98aba4ae110811a265a").unwrap().reversed(), height: 1098360, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000080cc4309a7447bb9ece31700769dc379572d22e45798fa2f").unwrap().reversed(), height: 1098168, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000002d799bd937089094546ea6910362cdde13305a190cc228966").unwrap().reversed(), height: 1097760, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000d02d05da2fa63761aebc1dc6ad313da63b10809026aa32012").unwrap().reversed(), height: 1096632, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000016174a372e62c8c18817df356487d539135ead487ecec8d276").unwrap().reversed(), height: 1097160, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000b62b169b3621aca12f2a4b1faa5443e52c435118f0a185a1a").unwrap().reversed(), height: 1098768, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000e5458bc47813b49b23d3a3f015bd74628e1950bc51086891b").unwrap().reversed(), height: 1094976, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001a7eaa4cb338614eaa498c87171a5459c35b1879267896a8b8").unwrap().reversed(), height: 1096728, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000cf068c8605300fa6eaabf1cd72f0baa91ebbfc7f615efffb0").unwrap().reversed(), height: 1097904, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000a7db9d1cb6e97587548d12f9b15e1d7217c3bb9fc5f7aca62").unwrap().reversed(), height: 1096992, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000120aa3e7d582a37cd1ba9e33f7255643886dfce934e608f588").unwrap().reversed(), height: 1098144, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000006859c3d9a085c3bbe1aada948f6d573af21b41c68e66b9ac8").unwrap().reversed(), height: 1098840, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000199f543a7d3e9f6372d950721a88a9a10aa92917c7a663695b").unwrap().reversed(), height: 1098672, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000184ffe2c87ee0e8046b630bbb67e8708a59d78a501c22f7ead").unwrap().reversed(), height: 1096440, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000128cc9aebae3ea0753103e4c53286b2370e1dab2655ce68b19").unwrap().reversed(), height: 1098528, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000000fd8021168f6be48e6c1444e29f85fa72c654b4f616c071f6").unwrap().reversed(), height: 1098312, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000017693260e70c48015796efdbf6cfb36c3ed16a0ce0aa72110e").unwrap().reversed(), height: 1097520, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001ffbd9b2b064b32e64c6d3a3dae13780a8f67dd8123a52f824").unwrap().reversed(), height: 1096680, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000b08d1bcf29d13fc4cb8972420979a7cca01bb3e76e848b341").unwrap().reversed(), height: 1097880, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000138ee64cdd6c5c9eb641be56002a08cc4da3947c9a8427b811").unwrap().reversed(), height: 1097424, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000022ba51a9c85c3f2908e050e251031c127c379ed4c84dc3995").unwrap().reversed(), height: 1098024, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000069501469ea47bdc919909737c7ae881cb0048dc7406a547f4").unwrap().reversed(), height: 1098432, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001d396bfa004a77bc6a590ebd4e62c3be62e17c9f9183b6b2a6").unwrap().reversed(), height: 1097472, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000e5442292206c610d87af06af00500a22b3bf478d3ac05ab65").unwrap().reversed(), height: 1098984, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001212cd887e2064e0fef2efe30efad366a3043ac618c8d1f7e0").unwrap().reversed(), height: 1097136, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000017dd8f722b72713df020c25cd8bb189e1516fbb97f91712276").unwrap().reversed(), height: 1098000, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000017bb50e264cebfec81804847bb19b759e1deed6d5ccd54af70").unwrap().reversed(), height: 1096488, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000076e6e626df28690678d026dcb7655433cb77cbbce4585ab9").unwrap().reversed(), height: 1097352, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000b0e12838219dce4ee33bd3ebf148a6655cdef57f5ac74dec1").unwrap().reversed(), height: 1098744, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000ee7034001ad0ed7040a4a55a388824624b2770154cb7b2778").unwrap().reversed(), height: 1098480, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000002ae77e6e7922c995ab76163717382c2290699125b017aeb83").unwrap().reversed(), height: 1096608, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000e40f843520b37a0299e0f73c03cc09e20e1f7e1d15db0eac3").unwrap().reversed(), height: 1097496, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000931d7809849ee2c0520274565043c91011abab799484c2990").unwrap().reversed(), height: 1097304, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000000049b8adab54f72710bf6d897597766529325c713de86b5e4").unwrap().reversed(), height: 1098648, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002156a89bfcb10462994d1d0953b418583140f2874b84a750ca").unwrap().reversed(), height: 1097256, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000012d25cbba3536d24aa5cc53c622eeac03c65412383147f4394").unwrap().reversed(), height: 1099008, merkleroot: Default::default() }, + // MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000787490f469efdfb1dbf6b86150b86c48f127f7653211b2c41").unwrap().reversed(), height: 1098096, merkleroot: Default::default() }, + MerkleBlock::reversed(1098096, "000000000000000787490f469efdfb1dbf6b86150b86c48f127f7653211b2c41", "ab7749468977a6566eb7a12827cfae5c8fd83dcacdb870ccd37af1dbefdccbf9"), + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000a3a980aec3a4421b54dbbb407f30ee949c13e3665cc372009").unwrap().reversed(), height: 1098624, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001fb0ced1479e7d15e7efed4b92b1d5ec43a1da297e8dc64a1e").unwrap().reversed(), height: 1097376, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000016f526c58ea7a5ba4091426d3d9d11434ef422cd6cbfa0a4d1").unwrap().reversed(), height: 1098960, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000057f1c57f1183758044c52c33ddd6b8ab2171afcb980062117").unwrap().reversed(), height: 1096560, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000c595ba7f4da46fb33fdfb5cbff49a5af1536de6baaf364658").unwrap().reversed(), height: 1098240, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000023382f4fda810321271b8d5b32fc5c0a8ae82d6e35e73ea7d5").unwrap().reversed(), height: 1097064, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001ad5328d0a3c97209bbbca4bb35d76119a8ac0231a36aa75c9").unwrap().reversed(), height: 1097280, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000106c3b9664269e2a92d53266f5485f24266e61d12f902f85ea").unwrap().reversed(), height: 1098720, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000018925fd95309371243ef4df332801968084363af572f6c5d45").unwrap().reversed(), height: 1097616, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000011038e77a86801cb5f05047d45e57b8a95b715f7f5bed2ac70").unwrap().reversed(), height: 1096272, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000f7943a003184c5e99b5951fa80d80d6585721e1819b046617").unwrap().reversed(), height: 1096512, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000e0e3a7248d77f94d3013cae7b27090941a944926683c7126c").unwrap().reversed(), height: 1096152, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000acc62d1c58e0cf316573ca248fcaefc98f77619d227d93413").unwrap().reversed(), height: 1096320, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000012b1e0582fa3c805bb15ebab29792766815ea008254395aebf").unwrap().reversed(), height: 1096848, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000016f620befa318c8b40bc5d9a955121261af09ac8ddeef93e5e").unwrap().reversed(), height: 1097088, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000017ae9d4db3c6e6fdf7827824423caa4599219f3af795ec6404").unwrap().reversed(), height: 1096704, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000013fea89dca12ca39a3250bab6ff979c682b44c968892e7844e").unwrap().reversed(), height: 1095840, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000c43df820465cf30f4e9d8a38330c5f7c4fcb90780aa88df38").unwrap().reversed(), height: 1096656, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000006b8f4ccbf679f3f5744d879c02851a361ef7e1e0ed9d57e18").unwrap().reversed(), height: 1097016, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001ad3de1c97c51b31072ea54380034b01bdf7da610b77f75189").unwrap().reversed(), height: 1098048, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001efb6b66a1cd0f2c6a41c9a820db8fc5de159aa186a09a4ce2").unwrap().reversed(), height: 1098936, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000005d2b5286b448a25d9c2006849d41fb0c9c4bb3bb8724c42d").unwrap().reversed(), height: 1098864, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000008997ba7c5b584a4dbffd17a8b5cd08cae51e7e6371f0ec3ca").unwrap().reversed(), height: 1098696, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000022a46ff5bb17d406fa821f70aa80c2b9aa37bc21edaea2569a").unwrap().reversed(), height: 1098072, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000125d8731954a9c15b86b34e78c1fbe2ca29bd3a99f38462689").unwrap().reversed(), height: 1098888, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000016ad254676362d6cad62acaa1f9900b6c951cfd73303fa0356").unwrap().reversed(), height: 1098792, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000020d7ac24b497e420c8eeb9de5ba55a4a204130dda9e09fc85a").unwrap().reversed(), height: 1097568, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001e3c72bec566addb499b9f633effe8cb4f1ddab303fa155d13").unwrap().reversed(), height: 1097544, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000143c121d0ebcc8ac6d22f5f2bf44b1b871569dec0e4df7c69c").unwrap().reversed(), height: 1095552, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001e1c9372e3d2db633498af3c900f87de1c5f19ed05a0df4072").unwrap().reversed(), height: 1097736, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000185588f0dcad30cbe720b5bc67abfae54e64d9f92e1e0b2d22").unwrap().reversed(), height: 1097040, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000185765bff94d5da02e62261ab2366d2ccaa0d86685c0485de").unwrap().reversed(), height: 1097976, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000557d8eb6ecdf684f3b7f3219794047ac4f44eff0d9bfbdb7b").unwrap().reversed(), height: 1097184, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000063d1eabcc5c29a51c0aa354b758b33e70f722f78c46741342").unwrap().reversed(), height: 1096200, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000134b8226f8db668803ee6abcfe4df2809b36de36205bd80227").unwrap().reversed(), height: 1096920, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001afbb65ce325134464e74de2c9e1f67c61501c434e82514094").unwrap().reversed(), height: 1097688, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000178d6cb5792aea8a9e51a716df4b20018761509dddd881b6b").unwrap().reversed(), height: 1097112, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000020eeb077e77f9e3e60975e2a7426b6084ff8ad5ca43ef17c41").unwrap().reversed(), height: 1096968, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000db1e46a7e9890b842506e2775fd4723fbbe2d420609087f21").unwrap().reversed(), height: 1096128, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000029151942416b68ff4aada689b12e47cc09ce7b802ded57505").unwrap().reversed(), height: 1096800, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001c5cdb520ddc3ec0511790352f6177d5e598656f83690bd734").unwrap().reversed(), height: 1096584, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000012bf85edb70e524a05c56644b0bdb0ce4a2d6d12739463c52b").unwrap().reversed(), height: 1096752, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000e5535ad543a6bfb463bc8f0636aac6a3e7f79683b7c94bf6f").unwrap().reversed(), height: 1097832, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000010404aecc04aff5a2be47a5c6caeeea32160df9fe8c47511ed").unwrap().reversed(), height: 1097856, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000001cf3f3937abd607c9ab0a50a354edf3614378aca4fb8fdf5e").unwrap().reversed(), height: 1098384, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000157572263a4b5a3c7a22f10c66c423be1d5a51aa24bc9f724b").unwrap().reversed(), height: 1097400, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001dcf7e0c3a9130750540511e0cf631ea2f81aac7617c821755").unwrap().reversed(), height: 1098504, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000071e19fd57488218254d12b773d3a7f8b2dc53b9d45805c9a8").unwrap().reversed(), height: 1096872, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000095ea3c8e00a43086c7d5f6ececc6642721f733eb27229ff86").unwrap().reversed(), height: 1097712, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000eb3238f4d8a2f95b0a4692548b6547cf495e4ce790e61d2b5").unwrap().reversed(), height: 1098192, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000016570cdc593f871223b3aec795c1049c2d40c702925e0d2800").unwrap().reversed(), height: 1098456, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000169f9688971408aadfd3159740d11b9f504719ceaafe117a26").unwrap().reversed(), height: 1098600, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000000cfd7003a6aa0b1e0ae1c556a9b83a064771e2ba5a4668169").unwrap().reversed(), height: 1097640, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000247cb10a7d823736b672866e1d015ce1446a9e0b3c87eb25e5").unwrap().reversed(), height: 1098336, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001df6026dcd49b32b8cda38807cc475d6868679e6eb77e5edf4").unwrap().reversed(), height: 1097952, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000e78706ecf6d744a2edc5143d3325ade22940dc14ccfd3f938").unwrap().reversed(), height: 1094400, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000019dd3cacaadbd876c25743598f35277b846f75447343874caf").unwrap().reverse(), height: 1719072, merkleroot: UInt256::from_hex("f0e749a270b20cfd473e1945d3235036535b2fb4a6f03bc1372ef452b0e3fdd9").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000005196b2caac47f5b210738a36437ab84c77b8dd1cb65e5ff4e").unwrap().reverse(), height: 1719360, merkleroot: UInt256::from_hex("756d24889633a895ac5e147ec0e45084a0f33686ce900949230f56dff0e14f19").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000296ef101616eb4992c036ad23942ce11a497f4088d8f7f1d3c").unwrap().reverse(), height: 1719648, merkleroot: UInt256::from_hex("49e4ad3b5feb3b824582774382325c44b643c501f1b63e51d57b44611bf419da").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000003371e77bd99885077ac842d9a22f6022fa026999ca61464d95").unwrap().reverse(), height: 1719936, merkleroot: UInt256::from_hex("c07d51f7733a9a5a06cdbd1e2ee4fdf1c56749205c58488610b8aac57d9f3b83").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001ef1f8a3d33bbe304c1d12f59f2c8aa989099dc215fd10903e").unwrap().reverse(), height: 1720000, merkleroot: UInt256::from_hex("67c6348c35bc42aa4cabd25e29560f5d22c6a9fba274bf0c52fe73021d0e8d5e").unwrap() }, + // MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000019dd3cacaadbd876c25743598f35277b846f75447343874caf").unwrap().reversed(), height: 1719072, merkleroot: <[u8; 32]>::from_hex("f0e749a270b20cfd473e1945d3235036535b2fb4a6f03bc1372ef452b0e3fdd9").unwrap() }, + // MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000005196b2caac47f5b210738a36437ab84c77b8dd1cb65e5ff4e").unwrap().reversed(), height: 1719360, merkleroot: <[u8; 32]>::from_hex("756d24889633a895ac5e147ec0e45084a0f33686ce900949230f56dff0e14f19").unwrap() }, + // MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000296ef101616eb4992c036ad23942ce11a497f4088d8f7f1d3c").unwrap().reversed(), height: 1719648, merkleroot: <[u8; 32]>::from_hex("49e4ad3b5feb3b824582774382325c44b643c501f1b63e51d57b44611bf419da").unwrap() }, + // MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000003371e77bd99885077ac842d9a22f6022fa026999ca61464d95").unwrap().reversed(), height: 1719936, merkleroot: <[u8; 32]>::from_hex("c07d51f7733a9a5a06cdbd1e2ee4fdf1c56749205c58488610b8aac57d9f3b83").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001ef1f8a3d33bbe304c1d12f59f2c8aa989099dc215fd10903e").unwrap().reversed(), height: 1720000, merkleroot: <[u8; 32]>::from_hex("67c6348c35bc42aa4cabd25e29560f5d22c6a9fba274bf0c52fe73021d0e8d5e").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000024352dba79ed19c04b512b7354a25031b7fbb587cf97e07c4").unwrap().reverse(), height: 1739226, merkleroot: UInt256::from_hex("0ff4510a20d064ee455bbb4a4aca3656ebe7f0ffa7dc2afcb13bc02ec44186fb").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002f4e6865301d473f6189601bf46a7856e10bb688778af571c5").unwrap().reverse(), height: 1738936, merkleroot: UInt256::from_hex("562155447c52bc4d377912cb430d5014b5ca4aa8acf37cd2ab1d6a604a767b86").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000e1c7aa8d3a097c38e53cbed7fb5b117a4fe2ab356913a5b5e").unwrap().reverse(), height: 1738648, merkleroot: UInt256::from_hex("329b55460aae5c7d74455f82f28cfb0f261a0c4a2ea360ea8d9e881039c8f0d3").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000de7e088deaecc760151a4ae00a42c309d804b4a8d76260eaf").unwrap().reverse(), height: 1738360, merkleroot: UInt256::from_hex("375e7a19b094d1ab41ecccff0880a0cf6bea49528089656b561f979c8f8d7469").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000012c2af64bcaa563c7c0327f1715e5d7c2e92eeca94c0df1652").unwrap().reverse(), height: 1738072, merkleroot: UInt256::from_hex("bf5bf25e0862fa2509b39089a8d8e2fc8f7137ae96313b471f3dbed4f403fa4b").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001120614e702a170894d0a5df800951261b1b5aad2dc5a2701f").unwrap().reverse(), height: 1738682, merkleroot: UInt256::from_hex("b8fec29f7c7271070b73516f0b35d340c1cce108b5b4f602f0213dba03a601be").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000027eeeffe75296f6dec0bfde97f2adb82ddc5e950aae445d91f").unwrap().reverse(), height: 1738668, merkleroot: UInt256::from_hex("b5d2c7da3604190e9eccc9c65cae8e3c4fbd2e9046ec142b0f3f935623a6573f").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000021bae834e455984331015d8743a6114050fb131ad8737e412b").unwrap().reverse(), height: 1738656, merkleroot: UInt256::from_hex("7d4a4d1087fb3c3cd590408b63a8b982507e443cd50dfe9dfe1d0172d721ac89").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000146a43018f407969f3f5638af85641ef3304a469b3d9401d48").unwrap().reverse(), height: 1738659, merkleroot: UInt256::from_hex("a467dbba8a64077cf0ddf1a93a698c277307d46b1ea2d3da5f6ff158630d425d").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002e8970da01b397dcce91cc235f693338444763ef19812e4852").unwrap().reverse(), height: 1738681, merkleroot: UInt256::from_hex("26d6217b991cf4e4da63c78abe6567d4bc54a6fb883d66c6d33f76ab27640688").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000035064653f503aa9379a3315537ecd092c3850b07ea1f5f2856").unwrap().reverse(), height: 1738677, merkleroot: UInt256::from_hex("0ea7f612eba89f76079f8dc7be6a3b9af76f0740d697e7973250d4d884893573").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000023fe98b8ce34d18ddf968acdaa147690fa13a9d4293c96f96a").unwrap().reverse(), height: 1738660, merkleroot: UInt256::from_hex("46800c293e7c269fa4deec2ad3abda11c98fb3187b1c317ac585fba5aea813a9").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000041c604b3ece8be36793544290017b5dc95b7fb12f91f52d76").unwrap().reverse(), height: 1738671, merkleroot: UInt256::from_hex("90c24bfbb109f223eef50c904933223a3ff72d5eded523ad07d50fa2de47d2a6").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002b7153d6a72ab7a22316e8dbf97c94ac9a5a1771656ff4de77").unwrap().reverse(), height: 1738670, merkleroot: UInt256::from_hex("961b94ce67271a5979417764bcc118dc57cd0dbc71b04d29de52cb1ebac6eecc").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000003a0a5aa7e1eb73c0f9deab941514287eb2aa65e0430388178").unwrap().reverse(), height: 1738685, merkleroot: UInt256::from_hex("fe05abf76c537401492793ffd8cc6bde4fe5054f14228bf3d13726000d1b8e47").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000003c0da7bc78e8fe24f926abdceca452716bcbc40bd1f4df1f86").unwrap().reverse(), height: 1738686, merkleroot: UInt256::from_hex("fd7d789f78fc38feca88ac641aec46ebc1e72dc5fbdaab63213dd914acd32d85").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000024c049397448c496cc2822c807f9ad1d4a582b394dbfa45d89").unwrap().reverse(), height: 1738662, merkleroot: UInt256::from_hex("a3b521158de9a49c3115202d4e42b478f016608d601c739b74defe67314492f1").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000362d907d4d869b2e2ae1ef4f19e7b595c31e525cce6de3d493").unwrap().reverse(), height: 1738675, merkleroot: UInt256::from_hex("331456f0d8f1da2e69170d159643bfb82e96e3af6212a225d9ae98e783f740cd").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000012246da0553053e2389a105c16907ae83b32ee11f5c2fa139d").unwrap().reverse(), height: 1738676, merkleroot: UInt256::from_hex("a7f02f59ab215fefc99c28dd1c643fb60f40f88df45d7778cb8c8bf91c0e354d").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002210081ecad43b1bdf13b5f913237429945b490bd3664d709e").unwrap().reverse(), height: 1738658, merkleroot: UInt256::from_hex("a6aa1981456ca4fcf1d1d1a7f522858a2ad7c80879fda0301fa377ab75982471").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000102cf068ead56f4aa4149863103e4d5fa0ba1dca9dce492aa3").unwrap().reverse(), height: 1738663, merkleroot: UInt256::from_hex("4d6caa44977a26bba39217eb6507e6abefc4a2d89fb8152e050eb13a81cebd78").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000031a55947c49b5c7cce7f2cc19b8500f3070fd1aa23033079a4").unwrap().reverse(), height: 1738664, merkleroot: UInt256::from_hex("1703c9af7176cebd6eade3fb75024bb32297070f171146ca47add7e63bdca3ee").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000009c7460d5dc9bfabe16a7c0208d84065f97288cacae68ddaa6").unwrap().reverse(), height: 1738672, merkleroot: UInt256::from_hex("0ace4a0af7ed3c007dfbd7b08c1e3c66ba51395aab97b2dc1cbba8dd8eb509ae").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000003475f2776354ec7b8f866732e684c408a0a690dbd3ce6e28bd").unwrap().reverse(), height: 1738687, merkleroot: UInt256::from_hex("9a30341de5a2869f62207b0f6bd58969e95838ace430eb8f0ef028dcf603c4dd").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000015e1cd2f23b96d2147089d436ef5f84fafe78847fb3ebcfccb").unwrap().reverse(), height: 1738661, merkleroot: UInt256::from_hex("d324e5da00ab9d911ad0bfd4b32f6c183f3a8de0104b6507f2e09119b01dd575").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000015bf952b291f4a0aeab300a8069296f70548964898f6d1fed0").unwrap().reverse(), height: 1738657, merkleroot: UInt256::from_hex("4d6bcc386a03d92bab72e7d530ca390de7abc051e10e6fd421b5fabaf3453e1f").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000115c16a91dbdf363aad4748b0cce1b3d9d928fee89b4039ed3").unwrap().reverse(), height: 1738666, merkleroot: UInt256::from_hex("786d73a6fa755e11220e1fff7dacef33fb2d9c3bfb63f25267547582223ad9a1").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000014c3abd9428902e358cdea6bacc5bd3a78ae1bde19ca18ead8").unwrap().reverse(), height: 1738683, merkleroot: UInt256::from_hex("c7a74427a638ea7b979ffcc356a8130a0ed7b85b6965149b36257f9a9c71296a").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000031c57708e8ab9a4f3dd9a9820a5d870ca708e21ceac50693da").unwrap().reverse(), height: 1738673, merkleroot: UInt256::from_hex("cc5728c9d4c67a4c217a6a40e98d1e4c90e425944cd1162ce810e5f55596f886").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001e9a5340b43d7d4c554052e22ffb8dc444a9b18d03dcae23db").unwrap().reverse(), height: 1738680, merkleroot: UInt256::from_hex("a07caecc4366e1632f847e7ff007eca7c421c93e91fbb81b98beba723104f53b").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000021df8f1fd16636d28c0bb3eedd785d0127a9c35d4b0e689fdc").unwrap().reverse(), height: 1738665, merkleroot: UInt256::from_hex("f5ff8882e52856c1427efc7b0bf037a802e8b0949d750977e5459dc6f1a8f0d6").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000149b13f57e2d0a5cb35051df5b466a71be11c92bb7a964cfe4").unwrap().reverse(), height: 1738684, merkleroot: UInt256::from_hex("a02f26167d281907aed6bd38582ed51966a33b1f371e1110b27ba3802394af4e").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000ee22e2815a90aad47cc182d427ef8c45328ec432be8e151e8").unwrap().reverse(), height: 1738679, merkleroot: UInt256::from_hex("313d6c09f0c8aef666168ddb5b93da6eb3874661eb69b4b836f6fa64a3dc15de").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000030555414e402b0eec8cfed8ba3b66bce286b2f87eb24dc30ed").unwrap().reverse(), height: 1738678, merkleroot: UInt256::from_hex("73e89e3fe2b15f427a0cfdfdbdb2a5fbe5935ac4371578bc3c90f18b2a185d09").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000012d73a2f2bd9bf632aa031662dc62c4d0d1dfe819083ab4df3").unwrap().reverse(), height: 1738674, merkleroot: UInt256::from_hex("99976db604a5f378861f0a7b22b4e1cc2d1664b58a6791c3f923ff86fdac023e").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000003327927df74100767d7f2ca1c9ffb4ae4ec09269aec4c72f6").unwrap().reverse(), height: 1738669, merkleroot: UInt256::from_hex("bac4a6035d2908d39c0f30f0384e78db90d4b2b468e06785e33bddb33b4153b3").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000030e57866fbee0b485b0e4e4bc9c7f70d89cbb52f3678ea03ff").unwrap().reverse(), height: 1738667, merkleroot: UInt256::from_hex("ac414ddaa449525e3303763e8228bcab434efa87fc057e454c8bfe211ab7df89").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001793260bdee5930642f70e76dc3c4efdf6433dc1ef6fcb2402").unwrap().reverse(), height: 1738950, merkleroot: UInt256::from_hex("67619f4bef9c19523052a915ab4fa4bdc0322a85e2df5123f220bbc96e32876c").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000db6ad0fda693ef64fb4023ff661118e081c73c736fa354305").unwrap().reverse(), height: 1738948, merkleroot: UInt256::from_hex("ff221011dbb5002070bd9fb61eeb35f9d0f1509c92fbdd91477f5215da661f55").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000592365feae8638145c1094d34a669a545c38f4d8767df4c0d").unwrap().reverse(), height: 1738970, merkleroot: UInt256::from_hex("ad7dd188d487e1f4e147a931ec08ce7c2bff07e12478e098f9adc523c7f96b18").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001df44a0a49c6118433e081764d9b967a1792b2778940eca911").unwrap().reverse(), height: 1738945, merkleroot: UInt256::from_hex("f58e24a50b8517756a2e271c32c10f1de3e91d24e9583a02d4af7eadc245690c").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000260c665dd60c2850700d3284567024b1187f2a5ceaceb14113").unwrap().reverse(), height: 1738947, merkleroot: UInt256::from_hex("fa1c609bfe5ab6450c9796d98588140aca383af7c3dd0358c699967940b2190d").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000027707f3b9ebc2bc7dd39bc566ddd036651977fa239f97eb214").unwrap().reverse(), height: 1738959, merkleroot: UInt256::from_hex("cb02df21d8c9dabe78e11c93b3e5e732b3b50b8e710c8ff942fbefff3bbdca02").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001ff382559f6597b57d2eb945ea8e73a699c3531c1bf9fb8c1e").unwrap().reverse(), height: 1738969, merkleroot: UInt256::from_hex("61031136e2de5d980fba46b40b5355291745c58a0e42cf066b7fbfcb4a8edc6a").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000027ba83454550bd581a9a0fe21adf71eab71591bc78d200d826").unwrap().reverse(), height: 1738975, merkleroot: UInt256::from_hex("1ee832bb78e619cf960172edbb5e0fa4c4bf001b61369d1062dfe2ac264022ac").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000c4b1d2f1da64f13b802ff997ccfbe0fea3305b1105f4f593b").unwrap().reverse(), height: 1738968, merkleroot: UInt256::from_hex("62f438ee2d1e2f4f103c94b3c854c3ba9b80fc6f8ce0a5db9a6cf5da44db0826").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000017615ef9462e6b523ad61b2e95cec00f7d45903c80930f1343").unwrap().reverse(), height: 1738974, merkleroot: UInt256::from_hex("d5382508f203ce9647a31c05c40827f70ff3364ba4f151aaeb532b95b1c2adad").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000244997154ddaf6ae56612120b6e8dddd6ef2ae56564862054b").unwrap().reverse(), height: 1738972, merkleroot: UInt256::from_hex("ccf6dda6bd11419c1314a7de09df5461126f0f799429c7ff914a1eda89d1f940").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000017d3b4b21d66280ddc07a6580d7274629b99c37b203d564379").unwrap().reverse(), height: 1737784, merkleroot: UInt256::from_hex("2a332d1a40a95f24414dce2fa11dd5c88d57e614e663f8d990880cd5c924104b").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002fde3087369cea4cefe4a2765c264e21d3877b9bf71427394b").unwrap().reverse(), height: 1738973, merkleroot: UInt256::from_hex("036c88b2f9607b268c79064db05d095b0f58cbcd623e9ff2ca4bb3975ec9307a").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000019adef366515606fd7b6a1b0f7ad0f81d5259ff5e99ca3a473").unwrap().reverse(), height: 1738951, merkleroot: UInt256::from_hex("edddee8275e16404f2f2cf40c76fdb97f3598670b03fcc19e54beb1c072e304e").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000721e2fc5c8245e1bbfccfbc28b7a39df8923d0cee4c5ed580").unwrap().reverse(), height: 1738960, merkleroot: UInt256::from_hex("a871e8f56c3b9162d1f2cf5dfd6a4edabdbed5dc5ed07de4e70871d90f94cfce").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001099a4411877fbd3aa9e9ea80cf89f0206a67132c0f33b9aa5").unwrap().reverse(), height: 1738961, merkleroot: UInt256::from_hex("d427f666f12469b0b5a125bf064eed83e0e39771f903e60b857d62d9cf8cdb4b").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001bd5cf578fa53d5dfecee24dd6f0fe4374442f8eb3403236b6").unwrap().reverse(), height: 1738965, merkleroot: UInt256::from_hex("0d8ba8d52ab8088c2f806e1cd459c300b8f074c8fb84e275322a0b8d65e14f17").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002351f55df92b52ceb0c0b994bc38aa326379ed616f31ec80b7").unwrap().reverse(), height: 1738956, merkleroot: UInt256::from_hex("3df00b5139cd136970a6b0b4ee175ec1a0cde7339d4c6e21ca1897e4396c9585").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002050464e54f9150e462f6ee6022ebc2e966cb8eaf1387cf9b7").unwrap().reverse(), height: 1738971, merkleroot: UInt256::from_hex("f4a8c43899d4f5d28d3c96d10143e38bbcd95c3a2549f52faf047c9d34aa41c6").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000034c545bbca904161c4b30f56df2140cb9e33b5af92758293b8").unwrap().reverse(), height: 1738958, merkleroot: UInt256::from_hex("979c9c0ea0f19fae3684715432908bc4f183dde428cec63eff03f87266047f1c").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000164bec215a8de2daa3d366bf48ad719154aed84805b2bd76ba").unwrap().reverse(), height: 1738963, merkleroot: UInt256::from_hex("ee41da409126a5d89036846168963002cf6f6bcb1424aab350432f83bffbb4a1").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001e80c5ee36c122b5ee1d290d13e9b28e41647d757c02a26fbe").unwrap().reverse(), height: 1738964, merkleroot: UInt256::from_hex("53d9b94c44fae757a1c2c1a1566a4639d5070126a8affbdbf400208071d77126").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002c82df7f716994d9dc7dd0694249bdd380d1b09cda746da7c8").unwrap().reverse(), height: 1738953, merkleroot: UInt256::from_hex("0cf7b0e2bbc35b0cbeabd803599b6aad7a908122fd67b9b0e13efa8e8e453f17").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000320c7be027427169aa2e1120ee4db11a52b876c3fd36a897d0").unwrap().reverse(), height: 1738955, merkleroot: UInt256::from_hex("6387535aadb7288d112723c5f4ac0c893f91e8c9bb04c644585d60a77ee6312e").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000128480432a1c7a0b706118822e6b24767decc93bf9825e9ae7").unwrap().reverse(), height: 1738952, merkleroot: UInt256::from_hex("a77c0fd79e98e4b72a141fb24363660f761473a935c670598e5ecbf533befccc").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002e1b49a611943f9470de4b6adebf2e14fa3a5021e9997009ef").unwrap().reverse(), height: 1738957, merkleroot: UInt256::from_hex("d29b8c01fef4df5973fadedb3265693906cc105bb5cd5fc6de851f26169bf2ee").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001e49a08877968b1b151175a069b96798581f003e7c0edb34f3").unwrap().reverse(), height: 1738962, merkleroot: UInt256::from_hex("30a8e703ffdb821efab65c1f68df25a980f3bbea8e023a4a04770206d6015e00").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000017bfb6a4800fb3617efffd09248b8eda79e69c76f2afb10152").unwrap().reverse(), height: 1738954, merkleroot: UInt256::from_hex("5c1cedefff2531852ebfed71624f6115ecb18125136f01b8a6f85ef0c878ca40").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001724616ea6e462449bdbdea5412cf0232a66875b90a4026660").unwrap().reverse(), height: 1738946, merkleroot: UInt256::from_hex("6ec90e2b9b084d3d6b5289ea5e9a6cccd075d9334a1e257eee2c22567e381928").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000a58ca15b24c6bdea8372f4135e26fe2e4524343ab5710bd64").unwrap().reverse(), height: 1738944, merkleroot: UInt256::from_hex("a8bd099ca25d44032da723a14eac6c2c014f356f6b3305aa001723211975b756").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000948c4708e54b761e91ce4e7cbafa7e4304a739e935a9c7e6b").unwrap().reverse(), height: 1738966, merkleroot: UInt256::from_hex("87cc6631b39f3b1f27454d89c9963694a941444409ddfd06c1a04197a38dc7bd").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001a083fea183411d563cf3c69e34b54fed9ebe7e07503de2f71").unwrap().reverse(), height: 1738949, merkleroot: UInt256::from_hex("cdbf5f1fd166a89d0908b107590824c63586faeb319dfddaf2c2bade89f9aec7").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000006f76aff13b0b4a03774edd6a3d7f3a7c4c30b5f1cd772a451").unwrap().reverse(), height: 1738967, merkleroot: UInt256::from_hex("4ed80b554a622fe5622035b3daa2610a1d5760b4b36ad168db1b5dbd0544f4f0").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000016392e046ca507ee60773b9340577c079491061a5369054ee9").unwrap().reverse(), height: 1738888, merkleroot: UInt256::from_hex("44e89fcaefde527d75370aa30a266004a78ab418026bf8870439d1d743a865fe").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000009a81cbb1bf7228b42e86e5c19da381a18e9c50be7c536c01b").unwrap().reverse(), height: 1738840, merkleroot: UInt256::from_hex("c8f7bfa61dc0beb8022b2b5c56a72c666bd5100f7207676a40ef0c7776d472a4").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000169f928360a08da204aa630d63269da902886a5932e981352b").unwrap().reverse(), height: 1738800, merkleroot: UInt256::from_hex("c4bd72ce23569f6adc75c622187ca07dc0f4245b94037846e7029a80458272da").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002b50a1e93166d60193ee0697de2707382c481d69e8e494d1f8").unwrap().reverse(), height: 1738792, merkleroot: UInt256::from_hex("95a913f79dc36fa7c41838675da234e14e663a3c4d9a563015afe8596780e396").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000029bfc85f5ce155c2df2ad35cdf29003a651e7ee96452e705").unwrap().reverse(), height: 1740678, merkleroot: UInt256::from_hex("3f29a94f3b7c8ea05f80c0d0f92a9fc5330af2327ee05443666b135a94224d12").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000019bdc0fa77522b19001c727741df344102c0569a8f064a8f64").unwrap().reverse(), height: 1740902, merkleroot: UInt256::from_hex("570892f62df96efbfad1aaad64aa055a37a1feed359f4372875d6c3ada4e2098").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000fec667f9d87814a342eeaa664e3e488dd9d618aa4db256ee6").unwrap().reverse(), height: 1740910, merkleroot: UInt256::from_hex("83a7f8907599971694350b1e1b81a9aeb656d9edc7f0c5e89a818155daa1be05").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000004518d548adb79e19e484e49ef573f4efc52065d551057e115").unwrap().reverse(), height: 1745187, merkleroot: UInt256::from_hex("787893ecd1a1c05a99076ebfc9602e2eafedab430dc7e398f37887178d51f324").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000019db0a834bfb51c2ee5b176dffb85102379c7d79843e2aeeda").unwrap().reverse(), height: 1746516, merkleroot: UInt256::from_hex("84886e7c58b2ce5c4c3b17ad8655e66d7158a39606fe79db8b4e80f7a84b03dc").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000b0478c3a64ca0b58140b56b604e1069e04e5111f2a76497eb").unwrap().reverse(), height: 1746460, merkleroot: UInt256::from_hex("7e797199a44d8fdbd8327ec06505f3b749b5f43e51de0df18daa9828e85ee4a9").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000024352dba79ed19c04b512b7354a25031b7fbb587cf97e07c4").unwrap().reversed(), height: 1739226, merkleroot: <[u8; 32]>::from_hex("0ff4510a20d064ee455bbb4a4aca3656ebe7f0ffa7dc2afcb13bc02ec44186fb").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002f4e6865301d473f6189601bf46a7856e10bb688778af571c5").unwrap().reversed(), height: 1738936, merkleroot: <[u8; 32]>::from_hex("562155447c52bc4d377912cb430d5014b5ca4aa8acf37cd2ab1d6a604a767b86").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000e1c7aa8d3a097c38e53cbed7fb5b117a4fe2ab356913a5b5e").unwrap().reversed(), height: 1738648, merkleroot: <[u8; 32]>::from_hex("329b55460aae5c7d74455f82f28cfb0f261a0c4a2ea360ea8d9e881039c8f0d3").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000de7e088deaecc760151a4ae00a42c309d804b4a8d76260eaf").unwrap().reversed(), height: 1738360, merkleroot: <[u8; 32]>::from_hex("375e7a19b094d1ab41ecccff0880a0cf6bea49528089656b561f979c8f8d7469").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000012c2af64bcaa563c7c0327f1715e5d7c2e92eeca94c0df1652").unwrap().reversed(), height: 1738072, merkleroot: <[u8; 32]>::from_hex("bf5bf25e0862fa2509b39089a8d8e2fc8f7137ae96313b471f3dbed4f403fa4b").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001120614e702a170894d0a5df800951261b1b5aad2dc5a2701f").unwrap().reversed(), height: 1738682, merkleroot: <[u8; 32]>::from_hex("b8fec29f7c7271070b73516f0b35d340c1cce108b5b4f602f0213dba03a601be").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000027eeeffe75296f6dec0bfde97f2adb82ddc5e950aae445d91f").unwrap().reversed(), height: 1738668, merkleroot: <[u8; 32]>::from_hex("b5d2c7da3604190e9eccc9c65cae8e3c4fbd2e9046ec142b0f3f935623a6573f").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000021bae834e455984331015d8743a6114050fb131ad8737e412b").unwrap().reversed(), height: 1738656, merkleroot: <[u8; 32]>::from_hex("7d4a4d1087fb3c3cd590408b63a8b982507e443cd50dfe9dfe1d0172d721ac89").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000146a43018f407969f3f5638af85641ef3304a469b3d9401d48").unwrap().reversed(), height: 1738659, merkleroot: <[u8; 32]>::from_hex("a467dbba8a64077cf0ddf1a93a698c277307d46b1ea2d3da5f6ff158630d425d").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002e8970da01b397dcce91cc235f693338444763ef19812e4852").unwrap().reversed(), height: 1738681, merkleroot: <[u8; 32]>::from_hex("26d6217b991cf4e4da63c78abe6567d4bc54a6fb883d66c6d33f76ab27640688").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000035064653f503aa9379a3315537ecd092c3850b07ea1f5f2856").unwrap().reversed(), height: 1738677, merkleroot: <[u8; 32]>::from_hex("0ea7f612eba89f76079f8dc7be6a3b9af76f0740d697e7973250d4d884893573").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000023fe98b8ce34d18ddf968acdaa147690fa13a9d4293c96f96a").unwrap().reversed(), height: 1738660, merkleroot: <[u8; 32]>::from_hex("46800c293e7c269fa4deec2ad3abda11c98fb3187b1c317ac585fba5aea813a9").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000041c604b3ece8be36793544290017b5dc95b7fb12f91f52d76").unwrap().reversed(), height: 1738671, merkleroot: <[u8; 32]>::from_hex("90c24bfbb109f223eef50c904933223a3ff72d5eded523ad07d50fa2de47d2a6").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002b7153d6a72ab7a22316e8dbf97c94ac9a5a1771656ff4de77").unwrap().reversed(), height: 1738670, merkleroot: <[u8; 32]>::from_hex("961b94ce67271a5979417764bcc118dc57cd0dbc71b04d29de52cb1ebac6eecc").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000003a0a5aa7e1eb73c0f9deab941514287eb2aa65e0430388178").unwrap().reversed(), height: 1738685, merkleroot: <[u8; 32]>::from_hex("fe05abf76c537401492793ffd8cc6bde4fe5054f14228bf3d13726000d1b8e47").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000003c0da7bc78e8fe24f926abdceca452716bcbc40bd1f4df1f86").unwrap().reversed(), height: 1738686, merkleroot: <[u8; 32]>::from_hex("fd7d789f78fc38feca88ac641aec46ebc1e72dc5fbdaab63213dd914acd32d85").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000024c049397448c496cc2822c807f9ad1d4a582b394dbfa45d89").unwrap().reversed(), height: 1738662, merkleroot: <[u8; 32]>::from_hex("a3b521158de9a49c3115202d4e42b478f016608d601c739b74defe67314492f1").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000362d907d4d869b2e2ae1ef4f19e7b595c31e525cce6de3d493").unwrap().reversed(), height: 1738675, merkleroot: <[u8; 32]>::from_hex("331456f0d8f1da2e69170d159643bfb82e96e3af6212a225d9ae98e783f740cd").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000012246da0553053e2389a105c16907ae83b32ee11f5c2fa139d").unwrap().reversed(), height: 1738676, merkleroot: <[u8; 32]>::from_hex("a7f02f59ab215fefc99c28dd1c643fb60f40f88df45d7778cb8c8bf91c0e354d").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002210081ecad43b1bdf13b5f913237429945b490bd3664d709e").unwrap().reversed(), height: 1738658, merkleroot: <[u8; 32]>::from_hex("a6aa1981456ca4fcf1d1d1a7f522858a2ad7c80879fda0301fa377ab75982471").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000102cf068ead56f4aa4149863103e4d5fa0ba1dca9dce492aa3").unwrap().reversed(), height: 1738663, merkleroot: <[u8; 32]>::from_hex("4d6caa44977a26bba39217eb6507e6abefc4a2d89fb8152e050eb13a81cebd78").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000031a55947c49b5c7cce7f2cc19b8500f3070fd1aa23033079a4").unwrap().reversed(), height: 1738664, merkleroot: <[u8; 32]>::from_hex("1703c9af7176cebd6eade3fb75024bb32297070f171146ca47add7e63bdca3ee").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000009c7460d5dc9bfabe16a7c0208d84065f97288cacae68ddaa6").unwrap().reversed(), height: 1738672, merkleroot: <[u8; 32]>::from_hex("0ace4a0af7ed3c007dfbd7b08c1e3c66ba51395aab97b2dc1cbba8dd8eb509ae").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000003475f2776354ec7b8f866732e684c408a0a690dbd3ce6e28bd").unwrap().reversed(), height: 1738687, merkleroot: <[u8; 32]>::from_hex("9a30341de5a2869f62207b0f6bd58969e95838ace430eb8f0ef028dcf603c4dd").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000015e1cd2f23b96d2147089d436ef5f84fafe78847fb3ebcfccb").unwrap().reversed(), height: 1738661, merkleroot: <[u8; 32]>::from_hex("d324e5da00ab9d911ad0bfd4b32f6c183f3a8de0104b6507f2e09119b01dd575").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000015bf952b291f4a0aeab300a8069296f70548964898f6d1fed0").unwrap().reversed(), height: 1738657, merkleroot: <[u8; 32]>::from_hex("4d6bcc386a03d92bab72e7d530ca390de7abc051e10e6fd421b5fabaf3453e1f").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000115c16a91dbdf363aad4748b0cce1b3d9d928fee89b4039ed3").unwrap().reversed(), height: 1738666, merkleroot: <[u8; 32]>::from_hex("786d73a6fa755e11220e1fff7dacef33fb2d9c3bfb63f25267547582223ad9a1").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000014c3abd9428902e358cdea6bacc5bd3a78ae1bde19ca18ead8").unwrap().reversed(), height: 1738683, merkleroot: <[u8; 32]>::from_hex("c7a74427a638ea7b979ffcc356a8130a0ed7b85b6965149b36257f9a9c71296a").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000031c57708e8ab9a4f3dd9a9820a5d870ca708e21ceac50693da").unwrap().reversed(), height: 1738673, merkleroot: <[u8; 32]>::from_hex("cc5728c9d4c67a4c217a6a40e98d1e4c90e425944cd1162ce810e5f55596f886").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001e9a5340b43d7d4c554052e22ffb8dc444a9b18d03dcae23db").unwrap().reversed(), height: 1738680, merkleroot: <[u8; 32]>::from_hex("a07caecc4366e1632f847e7ff007eca7c421c93e91fbb81b98beba723104f53b").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000021df8f1fd16636d28c0bb3eedd785d0127a9c35d4b0e689fdc").unwrap().reversed(), height: 1738665, merkleroot: <[u8; 32]>::from_hex("f5ff8882e52856c1427efc7b0bf037a802e8b0949d750977e5459dc6f1a8f0d6").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000149b13f57e2d0a5cb35051df5b466a71be11c92bb7a964cfe4").unwrap().reversed(), height: 1738684, merkleroot: <[u8; 32]>::from_hex("a02f26167d281907aed6bd38582ed51966a33b1f371e1110b27ba3802394af4e").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000ee22e2815a90aad47cc182d427ef8c45328ec432be8e151e8").unwrap().reversed(), height: 1738679, merkleroot: <[u8; 32]>::from_hex("313d6c09f0c8aef666168ddb5b93da6eb3874661eb69b4b836f6fa64a3dc15de").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000030555414e402b0eec8cfed8ba3b66bce286b2f87eb24dc30ed").unwrap().reversed(), height: 1738678, merkleroot: <[u8; 32]>::from_hex("73e89e3fe2b15f427a0cfdfdbdb2a5fbe5935ac4371578bc3c90f18b2a185d09").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000012d73a2f2bd9bf632aa031662dc62c4d0d1dfe819083ab4df3").unwrap().reversed(), height: 1738674, merkleroot: <[u8; 32]>::from_hex("99976db604a5f378861f0a7b22b4e1cc2d1664b58a6791c3f923ff86fdac023e").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000003327927df74100767d7f2ca1c9ffb4ae4ec09269aec4c72f6").unwrap().reversed(), height: 1738669, merkleroot: <[u8; 32]>::from_hex("bac4a6035d2908d39c0f30f0384e78db90d4b2b468e06785e33bddb33b4153b3").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000030e57866fbee0b485b0e4e4bc9c7f70d89cbb52f3678ea03ff").unwrap().reversed(), height: 1738667, merkleroot: <[u8; 32]>::from_hex("ac414ddaa449525e3303763e8228bcab434efa87fc057e454c8bfe211ab7df89").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001793260bdee5930642f70e76dc3c4efdf6433dc1ef6fcb2402").unwrap().reversed(), height: 1738950, merkleroot: <[u8; 32]>::from_hex("67619f4bef9c19523052a915ab4fa4bdc0322a85e2df5123f220bbc96e32876c").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000db6ad0fda693ef64fb4023ff661118e081c73c736fa354305").unwrap().reversed(), height: 1738948, merkleroot: <[u8; 32]>::from_hex("ff221011dbb5002070bd9fb61eeb35f9d0f1509c92fbdd91477f5215da661f55").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000592365feae8638145c1094d34a669a545c38f4d8767df4c0d").unwrap().reversed(), height: 1738970, merkleroot: <[u8; 32]>::from_hex("ad7dd188d487e1f4e147a931ec08ce7c2bff07e12478e098f9adc523c7f96b18").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001df44a0a49c6118433e081764d9b967a1792b2778940eca911").unwrap().reversed(), height: 1738945, merkleroot: <[u8; 32]>::from_hex("f58e24a50b8517756a2e271c32c10f1de3e91d24e9583a02d4af7eadc245690c").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000260c665dd60c2850700d3284567024b1187f2a5ceaceb14113").unwrap().reversed(), height: 1738947, merkleroot: <[u8; 32]>::from_hex("fa1c609bfe5ab6450c9796d98588140aca383af7c3dd0358c699967940b2190d").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000027707f3b9ebc2bc7dd39bc566ddd036651977fa239f97eb214").unwrap().reversed(), height: 1738959, merkleroot: <[u8; 32]>::from_hex("cb02df21d8c9dabe78e11c93b3e5e732b3b50b8e710c8ff942fbefff3bbdca02").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001ff382559f6597b57d2eb945ea8e73a699c3531c1bf9fb8c1e").unwrap().reversed(), height: 1738969, merkleroot: <[u8; 32]>::from_hex("61031136e2de5d980fba46b40b5355291745c58a0e42cf066b7fbfcb4a8edc6a").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000027ba83454550bd581a9a0fe21adf71eab71591bc78d200d826").unwrap().reversed(), height: 1738975, merkleroot: <[u8; 32]>::from_hex("1ee832bb78e619cf960172edbb5e0fa4c4bf001b61369d1062dfe2ac264022ac").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000c4b1d2f1da64f13b802ff997ccfbe0fea3305b1105f4f593b").unwrap().reversed(), height: 1738968, merkleroot: <[u8; 32]>::from_hex("62f438ee2d1e2f4f103c94b3c854c3ba9b80fc6f8ce0a5db9a6cf5da44db0826").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000017615ef9462e6b523ad61b2e95cec00f7d45903c80930f1343").unwrap().reversed(), height: 1738974, merkleroot: <[u8; 32]>::from_hex("d5382508f203ce9647a31c05c40827f70ff3364ba4f151aaeb532b95b1c2adad").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000244997154ddaf6ae56612120b6e8dddd6ef2ae56564862054b").unwrap().reversed(), height: 1738972, merkleroot: <[u8; 32]>::from_hex("ccf6dda6bd11419c1314a7de09df5461126f0f799429c7ff914a1eda89d1f940").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000017d3b4b21d66280ddc07a6580d7274629b99c37b203d564379").unwrap().reversed(), height: 1737784, merkleroot: <[u8; 32]>::from_hex("2a332d1a40a95f24414dce2fa11dd5c88d57e614e663f8d990880cd5c924104b").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002fde3087369cea4cefe4a2765c264e21d3877b9bf71427394b").unwrap().reversed(), height: 1738973, merkleroot: <[u8; 32]>::from_hex("036c88b2f9607b268c79064db05d095b0f58cbcd623e9ff2ca4bb3975ec9307a").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000019adef366515606fd7b6a1b0f7ad0f81d5259ff5e99ca3a473").unwrap().reversed(), height: 1738951, merkleroot: <[u8; 32]>::from_hex("edddee8275e16404f2f2cf40c76fdb97f3598670b03fcc19e54beb1c072e304e").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000721e2fc5c8245e1bbfccfbc28b7a39df8923d0cee4c5ed580").unwrap().reversed(), height: 1738960, merkleroot: <[u8; 32]>::from_hex("a871e8f56c3b9162d1f2cf5dfd6a4edabdbed5dc5ed07de4e70871d90f94cfce").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001099a4411877fbd3aa9e9ea80cf89f0206a67132c0f33b9aa5").unwrap().reversed(), height: 1738961, merkleroot: <[u8; 32]>::from_hex("d427f666f12469b0b5a125bf064eed83e0e39771f903e60b857d62d9cf8cdb4b").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001bd5cf578fa53d5dfecee24dd6f0fe4374442f8eb3403236b6").unwrap().reversed(), height: 1738965, merkleroot: <[u8; 32]>::from_hex("0d8ba8d52ab8088c2f806e1cd459c300b8f074c8fb84e275322a0b8d65e14f17").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002351f55df92b52ceb0c0b994bc38aa326379ed616f31ec80b7").unwrap().reversed(), height: 1738956, merkleroot: <[u8; 32]>::from_hex("3df00b5139cd136970a6b0b4ee175ec1a0cde7339d4c6e21ca1897e4396c9585").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002050464e54f9150e462f6ee6022ebc2e966cb8eaf1387cf9b7").unwrap().reversed(), height: 1738971, merkleroot: <[u8; 32]>::from_hex("f4a8c43899d4f5d28d3c96d10143e38bbcd95c3a2549f52faf047c9d34aa41c6").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000034c545bbca904161c4b30f56df2140cb9e33b5af92758293b8").unwrap().reversed(), height: 1738958, merkleroot: <[u8; 32]>::from_hex("979c9c0ea0f19fae3684715432908bc4f183dde428cec63eff03f87266047f1c").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000164bec215a8de2daa3d366bf48ad719154aed84805b2bd76ba").unwrap().reversed(), height: 1738963, merkleroot: <[u8; 32]>::from_hex("ee41da409126a5d89036846168963002cf6f6bcb1424aab350432f83bffbb4a1").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001e80c5ee36c122b5ee1d290d13e9b28e41647d757c02a26fbe").unwrap().reversed(), height: 1738964, merkleroot: <[u8; 32]>::from_hex("53d9b94c44fae757a1c2c1a1566a4639d5070126a8affbdbf400208071d77126").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002c82df7f716994d9dc7dd0694249bdd380d1b09cda746da7c8").unwrap().reversed(), height: 1738953, merkleroot: <[u8; 32]>::from_hex("0cf7b0e2bbc35b0cbeabd803599b6aad7a908122fd67b9b0e13efa8e8e453f17").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000320c7be027427169aa2e1120ee4db11a52b876c3fd36a897d0").unwrap().reversed(), height: 1738955, merkleroot: <[u8; 32]>::from_hex("6387535aadb7288d112723c5f4ac0c893f91e8c9bb04c644585d60a77ee6312e").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000128480432a1c7a0b706118822e6b24767decc93bf9825e9ae7").unwrap().reversed(), height: 1738952, merkleroot: <[u8; 32]>::from_hex("a77c0fd79e98e4b72a141fb24363660f761473a935c670598e5ecbf533befccc").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002e1b49a611943f9470de4b6adebf2e14fa3a5021e9997009ef").unwrap().reversed(), height: 1738957, merkleroot: <[u8; 32]>::from_hex("d29b8c01fef4df5973fadedb3265693906cc105bb5cd5fc6de851f26169bf2ee").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001e49a08877968b1b151175a069b96798581f003e7c0edb34f3").unwrap().reversed(), height: 1738962, merkleroot: <[u8; 32]>::from_hex("30a8e703ffdb821efab65c1f68df25a980f3bbea8e023a4a04770206d6015e00").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000017bfb6a4800fb3617efffd09248b8eda79e69c76f2afb10152").unwrap().reversed(), height: 1738954, merkleroot: <[u8; 32]>::from_hex("5c1cedefff2531852ebfed71624f6115ecb18125136f01b8a6f85ef0c878ca40").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001724616ea6e462449bdbdea5412cf0232a66875b90a4026660").unwrap().reversed(), height: 1738946, merkleroot: <[u8; 32]>::from_hex("6ec90e2b9b084d3d6b5289ea5e9a6cccd075d9334a1e257eee2c22567e381928").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000a58ca15b24c6bdea8372f4135e26fe2e4524343ab5710bd64").unwrap().reversed(), height: 1738944, merkleroot: <[u8; 32]>::from_hex("a8bd099ca25d44032da723a14eac6c2c014f356f6b3305aa001723211975b756").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000948c4708e54b761e91ce4e7cbafa7e4304a739e935a9c7e6b").unwrap().reversed(), height: 1738966, merkleroot: <[u8; 32]>::from_hex("87cc6631b39f3b1f27454d89c9963694a941444409ddfd06c1a04197a38dc7bd").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001a083fea183411d563cf3c69e34b54fed9ebe7e07503de2f71").unwrap().reversed(), height: 1738949, merkleroot: <[u8; 32]>::from_hex("cdbf5f1fd166a89d0908b107590824c63586faeb319dfddaf2c2bade89f9aec7").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000006f76aff13b0b4a03774edd6a3d7f3a7c4c30b5f1cd772a451").unwrap().reversed(), height: 1738967, merkleroot: <[u8; 32]>::from_hex("4ed80b554a622fe5622035b3daa2610a1d5760b4b36ad168db1b5dbd0544f4f0").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000016392e046ca507ee60773b9340577c079491061a5369054ee9").unwrap().reversed(), height: 1738888, merkleroot: <[u8; 32]>::from_hex("44e89fcaefde527d75370aa30a266004a78ab418026bf8870439d1d743a865fe").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000009a81cbb1bf7228b42e86e5c19da381a18e9c50be7c536c01b").unwrap().reversed(), height: 1738840, merkleroot: <[u8; 32]>::from_hex("c8f7bfa61dc0beb8022b2b5c56a72c666bd5100f7207676a40ef0c7776d472a4").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000169f928360a08da204aa630d63269da902886a5932e981352b").unwrap().reversed(), height: 1738800, merkleroot: <[u8; 32]>::from_hex("c4bd72ce23569f6adc75c622187ca07dc0f4245b94037846e7029a80458272da").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002b50a1e93166d60193ee0697de2707382c481d69e8e494d1f8").unwrap().reversed(), height: 1738792, merkleroot: <[u8; 32]>::from_hex("95a913f79dc36fa7c41838675da234e14e663a3c4d9a563015afe8596780e396").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000029bfc85f5ce155c2df2ad35cdf29003a651e7ee96452e705").unwrap().reversed(), height: 1740678, merkleroot: <[u8; 32]>::from_hex("3f29a94f3b7c8ea05f80c0d0f92a9fc5330af2327ee05443666b135a94224d12").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000019bdc0fa77522b19001c727741df344102c0569a8f064a8f64").unwrap().reversed(), height: 1740902, merkleroot: <[u8; 32]>::from_hex("570892f62df96efbfad1aaad64aa055a37a1feed359f4372875d6c3ada4e2098").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000fec667f9d87814a342eeaa664e3e488dd9d618aa4db256ee6").unwrap().reversed(), height: 1740910, merkleroot: <[u8; 32]>::from_hex("83a7f8907599971694350b1e1b81a9aeb656d9edc7f0c5e89a818155daa1be05").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000004518d548adb79e19e484e49ef573f4efc52065d551057e115").unwrap().reversed(), height: 1745187, merkleroot: <[u8; 32]>::from_hex("787893ecd1a1c05a99076ebfc9602e2eafedab430dc7e398f37887178d51f324").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000019db0a834bfb51c2ee5b176dffb85102379c7d79843e2aeeda").unwrap().reversed(), height: 1746516, merkleroot: <[u8; 32]>::from_hex("84886e7c58b2ce5c4c3b17ad8655e66d7158a39606fe79db8b4e80f7a84b03dc").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000b0478c3a64ca0b58140b56b604e1069e04e5111f2a76497eb").unwrap().reversed(), height: 1746460, merkleroot: <[u8; 32]>::from_hex("7e797199a44d8fdbd8327ec06505f3b749b5f43e51de0df18daa9828e85ee4a9").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000008b2e724cd52451bfc2870ed592d9062bd4236f15b3b71bd0e").unwrap().reverse(), height: 1740680, merkleroot: UInt256::from_hex("dce1adef8690aaba62a6ced7c5c7e42a9de803d8630e2a41bcad1e274f261aec").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000b276433490813f8373fb342990a964381c857cde67adf101b").unwrap().reverse(), height: 1740682, merkleroot: UInt256::from_hex("7fc158ea33389eb635a038782351abff8a488c3778de715d7de8867d8aba4279").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000070856bd43d0284d452944fb3fe9e529a95e26d48b5897ee23").unwrap().reverse(), height: 1740683, merkleroot: UInt256::from_hex("e82cebe0b43e51790fb7d4458432748c23fc6f5bb73a1cca50f2cd2f4db9b100").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001a637404af6bcb1eca548d9783b611522fd5d0d7bcff733725").unwrap().reverse(), height: 1740694, merkleroot: UInt256::from_hex("4aaa6b46785c0ff10952fa8f81ec3f0b5dd5bbbf7b294d82b3517a2cd789ed13").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002e1c924cfa35ad5eb355eff49e042039447e8909cd91e82832").unwrap().reverse(), height: 1740676, merkleroot: UInt256::from_hex("515d15a0ed8455217daf019251cb4ef96be78105674f5c291d43293425c70207").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001808de19992f9172475007b48cad1b8a521b9f1debdde2e038").unwrap().reverse(), height: 1740702, merkleroot: UInt256::from_hex("e7be95290bb9f8b50c3dcc8cd820cfaa07510a09e177b6b474a1e5550257142b").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000018d4fa8c5a68091c4adf67892b0eeb1eb111ad3cc59e2fbd3f").unwrap().reverse(), height: 1740688, merkleroot: UInt256::from_hex("5992b72c32aac8fd3aa79667bd4c7742ce7abef29d30981467a3900f38ef19e2").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000000b6bff4ad7fc2e7217b458f84c3522c4cce101c8d81431a48").unwrap().reverse(), height: 1740672, merkleroot: UInt256::from_hex("209f31d9166e094cd63cfe05556558c7f7f6122b5cf963a1dfe7a962797e0857").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000018d1e948aaa92dfdb5ad708c574a294f37fe4506df3adf1753").unwrap().reverse(), height: 1740697, merkleroot: UInt256::from_hex("29e6f8024697040a46927a0b8683ffb810d620d56a45c47799b4c26b4023293f").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000117831bb2cb519ee364fc8c6ad50a7369aede0b59cafb74e53").unwrap().reverse(), height: 1740686, merkleroot: UInt256::from_hex("e161ffef1c4803b320cf88c63a504ab1224832415194212b0653999d21e33721").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000028a10a763939aa51daa913439c121da39975cc7d3b1ff23d5d").unwrap().reverse(), height: 1740684, merkleroot: UInt256::from_hex("dc4f6d82abec0b59769fa04a0bd9a8e0a4cd92619819771ce5f66b2c46b4692f").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000d37ed579149a98e9cbc7d509c5968014cd7f8cee90bb4265f").unwrap().reverse(), height: 1740698, merkleroot: UInt256::from_hex("13141bf95f404d88290e1b50d60ee0694cb232a1e2858ca551dfd9f9f3862a99").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000015e3bdb686dd09dbf31dfaa4a4354b2311d5e8d542ecf6d963").unwrap().reverse(), height: 1740677, merkleroot: UInt256::from_hex("110bf4b7ad9929630a7da7fe124c5f305a0da5ab7e2d5c37e19c7282b1d48faf").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000a6c723190631336f2919b740278b6beb933fd71ed0f328569").unwrap().reverse(), height: 1740674, merkleroot: UInt256::from_hex("1ac19ff040db130d0f936638743358f5537ffd612322c904e585b997bc857e43").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000007b2f4a6c400e977c483e85716ce86f819917532e91d8c3e6d").unwrap().reverse(), height: 1740703, merkleroot: UInt256::from_hex("4349508c4a62097e43e4633c6c663a70bc486684b1647e4b710baba94633cd1d").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001ae63b10a99f1bdc7f0f9d3291f4535ef5e45fab51fa92647c").unwrap().reverse(), height: 1740690, merkleroot: UInt256::from_hex("bb51fc3624113a936c05b51bb0775d64bf6cbedfc68cdc8ecb07e4073c1f8304").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000012c28ce8c80c2709b71b6bc231f059b5bde61687f1c38dc883").unwrap().reverse(), height: 1740679, merkleroot: UInt256::from_hex("3fa73dc53fb27d558ac753370e55d714c59e86b00132ec056da469b572c808ab").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000016c0bb4d8117caa5efdf02d04c98b967c21d2de3993cb7f6a8").unwrap().reverse(), height: 1740673, merkleroot: UInt256::from_hex("adfbeeaae3e9f01bf914420d92a1e3c2585236ba8559c937916ebbd160a69dce").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000022f4f31fe290936fdb60c5cf7db70129cc2119611446dc8ca9").unwrap().reverse(), height: 1740685, merkleroot: UInt256::from_hex("85f857c7d2377d0ed823ee0d027563fb52ec8fd8d67a7948104ba70060672836").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000292e9a85d35bbcdda17105ed8bef4bfdefff2fb15e5a61e7ad").unwrap().reverse(), height: 1740681, merkleroot: UInt256::from_hex("01be89102ef0a980b88f15485df893c7192018ef78d6a7c25f45a1da2a655de4").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000019183bfff712c8578e0a69fc7946b197c65fd095ca2594caae").unwrap().reverse(), height: 1740693, merkleroot: UInt256::from_hex("48ecb23c18092d2675de91fdc649e4002d0859d89c0aa1ae9068f9b5d5722398").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000028d642c1373e44ea1d79970228b080bfbc16e8159dee4e77b7").unwrap().reverse(), height: 1740687, merkleroot: UInt256::from_hex("2dc678868429cc6133a127ffd43d1d5a1b591834ae72f86ed4fdc12c387bf4b2").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002d7f1cd9c33969c49ce3ffa6be948155f8b7489c28b44c4eb8").unwrap().reverse(), height: 1740695, merkleroot: UInt256::from_hex("8933501f5de12df383f18ae5fa876aed22cceeaad3b9c6ea2e24a81ce03901d2").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001e8200625267ff87e982d22d8855807078b23fd47e2a687dbe").unwrap().reverse(), height: 1740700, merkleroot: UInt256::from_hex("ace3fb40b445970b20f7ffd0489166bc496beac07c933135cf3963b754f57c12").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000013a42434063c689d17c79bca5803c46db6ea035f91c2f511c3").unwrap().reverse(), height: 1740692, merkleroot: UInt256::from_hex("8ccdf3fac52b6dee924a8ac4e48ffc1237e51578c1dec8540edd766cf2ebe1a8").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000027b2d382c5dc385a7c462994255b4a1f3ce999ea3084c47fcd").unwrap().reverse(), height: 1740691, merkleroot: UInt256::from_hex("d60211944e1fa38af50758620ec716781bbb592e2ae8c2a5ac522f65079aab0d").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000012896c3f7d738bedbe63e62b618c9640d3d1560546c74658e2").unwrap().reverse(), height: 1740701, merkleroot: UInt256::from_hex("6523fbeac01c803a282b480155b1c14e4acad41f6fa195118241f55dd01ea1be").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000009780695dc7527015e390e0b57fff57299345bf0b3b1832ced").unwrap().reverse(), height: 1740689, merkleroot: UInt256::from_hex("18c2900110073a9d0cf5ab86edaf0547e6bf236145e552a2d7e1807c81bf5fd8").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000001c6753e5555e537247fab493a823568af7f9cc96748374a1f2").unwrap().reverse(), height: 1740675, merkleroot: UInt256::from_hex("1d6e9b29bbcd3e9e7803ba1e242a135c6fcc232bb5a7bbbc7a907ac625088a66").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000003029d0f83c85e2e9e6273c4001787b6b596d639dd8232e3f8").unwrap().reverse(), height: 1740696, merkleroot: UInt256::from_hex("c4436fc5387f8cf3e471e2daa8637de279213eae7590721028bfc66c73dc35ae").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000002647c9cbd4c272b93f0454885ea3bbf737e6dc80cb23ef56ff").unwrap().reverse(), height: 1740699, merkleroot: UInt256::from_hex("3cbd838322db5d441a23b2b8666a0cf7cbcbdff28a17acb6c7ba3e8a223fab85").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000000000000000de7e088deaecc760151a4ae00a42c309d804b4a8d76260eaf").unwrap().reverse(), height: 1738360, merkleroot: UInt256::from_hex("375e7a19b094d1ab41ecccff0880a0cf6bea49528089656b561f979c8f8d7469").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000268b50b62626433cd794ded10899dd51639755d0f8ee334168").unwrap().reverse(), height: 1761048, merkleroot: UInt256::from_hex("0f244df3e2cb5e644afaf5e83b4aaaa070e373551534a8727011534848e73704").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000003b8b7721868e7ac76c9cbd3daf40165e25ed5c9b2e00148f9").unwrap().reverse(), height: 1761054, merkleroot: UInt256::from_hex("d888250687b51f3c291904069333898fe89cd818cbce99caca7c7653b680b66c").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("00000000000000248cfdd4da1ee40e49cb2e388679051e5f7305e0808da223b2").unwrap().reverse(), height: 1761072, merkleroot: UInt256::from_hex("0b58ff22cc9feae5dc2bcfb36244dd90138055cd1ecb7dc0b2f848da011181c0").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("0000000000000001d9e643a9b573dc0f1c597d8ca5887824beefb5ca77bf381c").unwrap().reverse(), height: 1761100, merkleroot: UInt256::from_hex("db577a335d0a6363c5f04736c52d30332745fe0e5e69073b6f3d066eb42023bd").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000008b2e724cd52451bfc2870ed592d9062bd4236f15b3b71bd0e").unwrap().reversed(), height: 1740680, merkleroot: <[u8; 32]>::from_hex("dce1adef8690aaba62a6ced7c5c7e42a9de803d8630e2a41bcad1e274f261aec").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000b276433490813f8373fb342990a964381c857cde67adf101b").unwrap().reversed(), height: 1740682, merkleroot: <[u8; 32]>::from_hex("7fc158ea33389eb635a038782351abff8a488c3778de715d7de8867d8aba4279").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000070856bd43d0284d452944fb3fe9e529a95e26d48b5897ee23").unwrap().reversed(), height: 1740683, merkleroot: <[u8; 32]>::from_hex("e82cebe0b43e51790fb7d4458432748c23fc6f5bb73a1cca50f2cd2f4db9b100").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001a637404af6bcb1eca548d9783b611522fd5d0d7bcff733725").unwrap().reversed(), height: 1740694, merkleroot: <[u8; 32]>::from_hex("4aaa6b46785c0ff10952fa8f81ec3f0b5dd5bbbf7b294d82b3517a2cd789ed13").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002e1c924cfa35ad5eb355eff49e042039447e8909cd91e82832").unwrap().reversed(), height: 1740676, merkleroot: <[u8; 32]>::from_hex("515d15a0ed8455217daf019251cb4ef96be78105674f5c291d43293425c70207").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001808de19992f9172475007b48cad1b8a521b9f1debdde2e038").unwrap().reversed(), height: 1740702, merkleroot: <[u8; 32]>::from_hex("e7be95290bb9f8b50c3dcc8cd820cfaa07510a09e177b6b474a1e5550257142b").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000018d4fa8c5a68091c4adf67892b0eeb1eb111ad3cc59e2fbd3f").unwrap().reversed(), height: 1740688, merkleroot: <[u8; 32]>::from_hex("5992b72c32aac8fd3aa79667bd4c7742ce7abef29d30981467a3900f38ef19e2").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000000b6bff4ad7fc2e7217b458f84c3522c4cce101c8d81431a48").unwrap().reversed(), height: 1740672, merkleroot: <[u8; 32]>::from_hex("209f31d9166e094cd63cfe05556558c7f7f6122b5cf963a1dfe7a962797e0857").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000018d1e948aaa92dfdb5ad708c574a294f37fe4506df3adf1753").unwrap().reversed(), height: 1740697, merkleroot: <[u8; 32]>::from_hex("29e6f8024697040a46927a0b8683ffb810d620d56a45c47799b4c26b4023293f").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000117831bb2cb519ee364fc8c6ad50a7369aede0b59cafb74e53").unwrap().reversed(), height: 1740686, merkleroot: <[u8; 32]>::from_hex("e161ffef1c4803b320cf88c63a504ab1224832415194212b0653999d21e33721").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000028a10a763939aa51daa913439c121da39975cc7d3b1ff23d5d").unwrap().reversed(), height: 1740684, merkleroot: <[u8; 32]>::from_hex("dc4f6d82abec0b59769fa04a0bd9a8e0a4cd92619819771ce5f66b2c46b4692f").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000d37ed579149a98e9cbc7d509c5968014cd7f8cee90bb4265f").unwrap().reversed(), height: 1740698, merkleroot: <[u8; 32]>::from_hex("13141bf95f404d88290e1b50d60ee0694cb232a1e2858ca551dfd9f9f3862a99").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000015e3bdb686dd09dbf31dfaa4a4354b2311d5e8d542ecf6d963").unwrap().reversed(), height: 1740677, merkleroot: <[u8; 32]>::from_hex("110bf4b7ad9929630a7da7fe124c5f305a0da5ab7e2d5c37e19c7282b1d48faf").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000a6c723190631336f2919b740278b6beb933fd71ed0f328569").unwrap().reversed(), height: 1740674, merkleroot: <[u8; 32]>::from_hex("1ac19ff040db130d0f936638743358f5537ffd612322c904e585b997bc857e43").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000007b2f4a6c400e977c483e85716ce86f819917532e91d8c3e6d").unwrap().reversed(), height: 1740703, merkleroot: <[u8; 32]>::from_hex("4349508c4a62097e43e4633c6c663a70bc486684b1647e4b710baba94633cd1d").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001ae63b10a99f1bdc7f0f9d3291f4535ef5e45fab51fa92647c").unwrap().reversed(), height: 1740690, merkleroot: <[u8; 32]>::from_hex("bb51fc3624113a936c05b51bb0775d64bf6cbedfc68cdc8ecb07e4073c1f8304").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000012c28ce8c80c2709b71b6bc231f059b5bde61687f1c38dc883").unwrap().reversed(), height: 1740679, merkleroot: <[u8; 32]>::from_hex("3fa73dc53fb27d558ac753370e55d714c59e86b00132ec056da469b572c808ab").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000016c0bb4d8117caa5efdf02d04c98b967c21d2de3993cb7f6a8").unwrap().reversed(), height: 1740673, merkleroot: <[u8; 32]>::from_hex("adfbeeaae3e9f01bf914420d92a1e3c2585236ba8559c937916ebbd160a69dce").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000022f4f31fe290936fdb60c5cf7db70129cc2119611446dc8ca9").unwrap().reversed(), height: 1740685, merkleroot: <[u8; 32]>::from_hex("85f857c7d2377d0ed823ee0d027563fb52ec8fd8d67a7948104ba70060672836").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000292e9a85d35bbcdda17105ed8bef4bfdefff2fb15e5a61e7ad").unwrap().reversed(), height: 1740681, merkleroot: <[u8; 32]>::from_hex("01be89102ef0a980b88f15485df893c7192018ef78d6a7c25f45a1da2a655de4").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000019183bfff712c8578e0a69fc7946b197c65fd095ca2594caae").unwrap().reversed(), height: 1740693, merkleroot: <[u8; 32]>::from_hex("48ecb23c18092d2675de91fdc649e4002d0859d89c0aa1ae9068f9b5d5722398").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000028d642c1373e44ea1d79970228b080bfbc16e8159dee4e77b7").unwrap().reversed(), height: 1740687, merkleroot: <[u8; 32]>::from_hex("2dc678868429cc6133a127ffd43d1d5a1b591834ae72f86ed4fdc12c387bf4b2").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002d7f1cd9c33969c49ce3ffa6be948155f8b7489c28b44c4eb8").unwrap().reversed(), height: 1740695, merkleroot: <[u8; 32]>::from_hex("8933501f5de12df383f18ae5fa876aed22cceeaad3b9c6ea2e24a81ce03901d2").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001e8200625267ff87e982d22d8855807078b23fd47e2a687dbe").unwrap().reversed(), height: 1740700, merkleroot: <[u8; 32]>::from_hex("ace3fb40b445970b20f7ffd0489166bc496beac07c933135cf3963b754f57c12").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000013a42434063c689d17c79bca5803c46db6ea035f91c2f511c3").unwrap().reversed(), height: 1740692, merkleroot: <[u8; 32]>::from_hex("8ccdf3fac52b6dee924a8ac4e48ffc1237e51578c1dec8540edd766cf2ebe1a8").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000027b2d382c5dc385a7c462994255b4a1f3ce999ea3084c47fcd").unwrap().reversed(), height: 1740691, merkleroot: <[u8; 32]>::from_hex("d60211944e1fa38af50758620ec716781bbb592e2ae8c2a5ac522f65079aab0d").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000012896c3f7d738bedbe63e62b618c9640d3d1560546c74658e2").unwrap().reversed(), height: 1740701, merkleroot: <[u8; 32]>::from_hex("6523fbeac01c803a282b480155b1c14e4acad41f6fa195118241f55dd01ea1be").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000009780695dc7527015e390e0b57fff57299345bf0b3b1832ced").unwrap().reversed(), height: 1740689, merkleroot: <[u8; 32]>::from_hex("18c2900110073a9d0cf5ab86edaf0547e6bf236145e552a2d7e1807c81bf5fd8").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000001c6753e5555e537247fab493a823568af7f9cc96748374a1f2").unwrap().reversed(), height: 1740675, merkleroot: <[u8; 32]>::from_hex("1d6e9b29bbcd3e9e7803ba1e242a135c6fcc232bb5a7bbbc7a907ac625088a66").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000003029d0f83c85e2e9e6273c4001787b6b596d639dd8232e3f8").unwrap().reversed(), height: 1740696, merkleroot: <[u8; 32]>::from_hex("c4436fc5387f8cf3e471e2daa8637de279213eae7590721028bfc66c73dc35ae").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000002647c9cbd4c272b93f0454885ea3bbf737e6dc80cb23ef56ff").unwrap().reversed(), height: 1740699, merkleroot: <[u8; 32]>::from_hex("3cbd838322db5d441a23b2b8666a0cf7cbcbdff28a17acb6c7ba3e8a223fab85").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000000000000de7e088deaecc760151a4ae00a42c309d804b4a8d76260eaf").unwrap().reversed(), height: 1738360, merkleroot: <[u8; 32]>::from_hex("375e7a19b094d1ab41ecccff0880a0cf6bea49528089656b561f979c8f8d7469").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000268b50b62626433cd794ded10899dd51639755d0f8ee334168").unwrap().reversed(), height: 1761048, merkleroot: <[u8; 32]>::from_hex("0f244df3e2cb5e644afaf5e83b4aaaa070e373551534a8727011534848e73704").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000003b8b7721868e7ac76c9cbd3daf40165e25ed5c9b2e00148f9").unwrap().reversed(), height: 1761054, merkleroot: <[u8; 32]>::from_hex("d888250687b51f3c291904069333898fe89cd818cbce99caca7c7653b680b66c").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000000000000248cfdd4da1ee40e49cb2e388679051e5f7305e0808da223b2").unwrap().reversed(), height: 1761072, merkleroot: <[u8; 32]>::from_hex("0b58ff22cc9feae5dc2bcfb36244dd90138055cd1ecb7dc0b2f848da011181c0").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000000000000001d9e643a9b573dc0f1c597d8ca5887824beefb5ca77bf381c").unwrap().reversed(), height: 1761100, merkleroot: <[u8; 32]>::from_hex("db577a335d0a6363c5f04736c52d30332745fe0e5e69073b6f3d066eb42023bd").unwrap() }, + MerkleBlock::reversed(1738120, "0000000000000033b0f0252e8be1ef48c52d9fc2f21af8dee9568d9dcf4a04e8", "084c4db8bddb3022832ca6253c0daa2531708d866cf0f0a671960f9ddfd09072"), MerkleBlock::reversed(1738128, "000000000000000b0ffc35d81ddfc0145882f70e7dfde1ae544e6cdc38ea1cc6", "9c507db7810c0401907e99710feae545586aaac47f4603e8cce29630c350d4da"), + MerkleBlock::reversed(1738144, "0000000000000023b37888dfdfe3c9dbf452b6e12fd8a44702b62ba08a86e767", "d60086a1e53e50925f020e6f6ae2160fad32c9ade80a18f12f89c844effae11d"), MerkleBlock::reversed(1738152, "000000000000000824aeffc25daed1b8ae11368d1207c9e44806c57878349552", "26f18fe1e9a9a3618b9394abae9a726c85c505277a13f5dd77ca92be41af8064"), + MerkleBlock::reversed(1738168, "000000000000000d4b6508f11518f4c365cb1f336cf642cf877a7430263fd46c", "253eca59d62495809019ad092469d5929136e58699297b7cd625c319a8776db2"), MerkleBlock::reversed(1738176, "000000000000000e1ce5bcd8dc1d2f5bc1637d7dd62fb8562f2130780b8c73ff", "593d734a4c35a13d6869c172bd10fb849c91712529b4079e0d53cd9cef440f72"), + MerkleBlock::reversed(1738192, "0000000000000026b7d3266b288b1a33f8ee3af224888b1a4605346be16a4b56", "7b19690dbaaec3e03436eb2997caef7b4c30f7da687ea6aa6fb74b118322f8d7"), MerkleBlock::reversed(1738200, "00000000000000271d1dd4b1817c05b958a451a82e8ebe9fe64e20d3ebac0d3a", "aa7c521747cb15c13ce1f863251989106b05bae0c42568ccf8172759755c9570"), + MerkleBlock::reversed(1738216, "0000000000000027dc0325c0992849006ebd707427e12d41434843206cda35bb", "f652a9e7307764ff267e0b099cad344867cd29a8a22ed357f4b194643252e408"), MerkleBlock::reversed(1738224, "0000000000000038db735269eff14243df9007ebad03433843357d3ed3acde78", "144141bf2e18bcef1d7e3b7ead1dedf5e5cc1791d307b513bb456e0a417c123f"), + MerkleBlock::reversed(1738240, "000000000000002a7d5e901b6a9aacb5924ca0a0c7d21b4f693b1d2777528c72", "6889a2d033bb5d6ac31a1f571a9ca4c1c8c091bf5f92badf34574d5554ba6b19"), MerkleBlock::reversed(1738248, "000000000000000109cfe4220aaf56f7e220650383218c168766813d079bffad", "50ca21c65c09e14e2d4d88572baf366e794bd3a00a3444bb3dd86ae771120761"), + MerkleBlock::reversed(1738264, "0000000000000050ef748bd4e96d036585dca42c596eecad7c7230a171f382da", "b60f7d4392553f3cc3d709489e69391abf807fc8983a1e8efaae89743cf8b020"), MerkleBlock::reversed(1738272, "000000000000000cc5f5b26cf497f12f73d1541a7cd908a20a54b78016c60ed7", "5f54d0abbcb9699ecdeb5ab04d6db7b568102a2734bb5fabd20033256324c27d"), + MerkleBlock::reversed(1738288, "000000000000000e1f86be45638233296166b8f9adf24249328b830c2d901adb", "94ec7f2d8297e59e665d61e9a2b2a62c1bad6ff9d6e5c2a3f5827e119fbdab28"), MerkleBlock::reversed(1738296, "00000000000000154d47d679621be284215d1466d9c54a9a121c840dcba3d5d4", "34e6438d425177839c9ce72a8fb5d55b25db814063cbacb91817c537b45a8afd"), + MerkleBlock::reversed(1738312, "00000000000000151d23dccbacbe209feba24d81864012bd4a9d1e6a5d57aa60", "8244a63e53ac75e0a0fb5088720ffbb17f1ab7f8559596597a96fba267562f5d"), MerkleBlock::reversed(1738320, "000000000000001a07dca1ee489edcd30ffb5489b6e6b089a7216167c643b959", "39fe86b3134ad64648f38feab5f6e337fa2f75cadd0a68e1442ca86b633441b3"), + MerkleBlock::reversed(1738336, "000000000000001d81f6569e6ce34fca482ad4453c43b60754e671838b50ac89", "a1ab0a519e951d84e113ce6284e926deeb5927a6ff1100aa00c8d39ce3d3cd33"), MerkleBlock::reversed(1738344, "0000000000000010cda3701acfa788b283268088bd024f27f6d7f05ab6e974ce", "e1ce14b50ac56b962f81fdd8e9044a37a49ae8160753e69d7d09b6fa9f22d761"), MerkleBlock::reversed(1738368, "000000000000002ea6c2fb696d7b7286fdfc3eae7c73b634f69056a53c4b1ac4", "5c3c3956582be15f799d29870b37c8960428d01288540f14f04cf554ccbc26b5"), + MerkleBlock::reversed(1738384, "000000000000002e3a0977c0d8959cfd1592afe50d5dd1e608900519cab303a2", "9fa5a5433a033a86c77c849dd9d2307f2075f308dc1abd22a9a7cd2906e96e3f"), MerkleBlock::reversed(1738392, "0000000000000023a9f62ddec7f14b0d3e24aeaf89bce684ae885b29a5d046ba", "668ea9eb6920c54454af97b2dd30fe4335b2297675f481564f1257954fd90817"), + MerkleBlock::reversed(1738408, "000000000000000d6d3d364f354ad27b15f508fdc6c373af796c3028b4e25ef8", "f2dd02d2e69b3f8bb5ab91dc9db989be7539874f6bc3c083d3cbef08fd379ac1"), MerkleBlock::reversed(1738416, "00000000000000053cd23fa375fcd253ea6e775ec47180fa0288593b368bb9c4", "2965054b78497b70f5cecc2947defeee2334d724c0d6d615d4adf4c5a91d9ba4"), + MerkleBlock::reversed(1738432, "0000000000000015ab69b5b12ed736e4b1e13c996e2d134de9eb2c3b1a87edd7", "ae128d15acaf6d35b882105029c0a062603cbaf9713f69fa0ece7eeb85b4a819"), MerkleBlock::reversed(1738440, "00000000000000254076fce561e9d3985f9d9c5d356e55a38b1dc6352d4ebbe1", "f35223624b41a25b3c4f93a410f7f5ad42ec532d1e0da58c89ddcda3ee814ab5"), + MerkleBlock::reversed(1738456, "000000000000001dbb622f7dbc8545e83141a8f367815b922c3877982caac6be", "fafcebf5fd2381375d66ac94c54f28155c0fc0ec3f5bb17504f0b7661800ed3a"), MerkleBlock::reversed(1738464, "00000000000000005dae17e5ca05d3fb873bc617f5799cb5f8b32cb5d467a234", "49e0f5f1413fd559a59e04d6649229dba68f8a58fbf9327bf7997ea725bd5fa7"), + MerkleBlock::reversed(1738480, "000000000000000ad5cce96fbcc57a1d09c7239d4f6dba7b5bddb109e9e11e2f", "91c20f97dd578c142a8beedf82f5ad3db42279133627f9e500d86084e1f37fa6"), MerkleBlock::reversed(1738488, "0000000000000022a1a564b4f6a33052dc5bd2632b298e8cfe5fdbd7e5b57178", "75dbf3963786febfdd384468d7cd2d7769bcd786d10f02d0adf9e82a58fab5f8"), + MerkleBlock::reversed(1738504, "000000000000000e4f701c647cc1adbd7a6b9550d034172a42a1b2182a3c180e", "6f981838703f3d5f33518f84ace3990d4836830c4549bbd101ce6f5b939392cc"), MerkleBlock::reversed(1738512, "0000000000000002b3c9a1f846f67da955587dbf4e281be5fc99d1bf29ca46f1", "7ede0e99e1dca3b0a44212efa783bf073702ae8af225519182da49e7c44cf9a5"), + MerkleBlock::reversed(1738528, "0000000000000017b3151fab21a3b546aef54aaf858ae6d258b9fe16494f43fc", "82e8f05340c183212cc604b8e53b537a3eadd1f32db046d7fc2fddf7f1cfd24a"), MerkleBlock::reversed(1738536, "000000000000002052e2f922d3d474271acf7b72cdfa180eef57a449a3ea4101", "1545f1dbf38709a66e444331ddf9473eda5682d9b164d7c5bdb8d4f42ed48409"), + MerkleBlock::reversed(1738552, "000000000000002b9c7cfb6220e86bec053339b9da1aea456389434e6e406237", "825dc0fbaa6181f76e3c79ec835d1be88a8591b9328cf74232e60d07e0e1f770"), MerkleBlock::reversed(1738560, "0000000000000001975cbb6f6fbea80afc1d0a1cb3c00b1cbafe613b60979c2f", "5ce8393c9b9453c9b7e2c9deda0f8da0b539a25217c3a7dc7a9b8514150f110a"), + MerkleBlock::reversed(1738576, "00000000000000158a6c665dadc9b1b65fbd995f71666381345538df21a59d8e", "080ab39ba5e85b296db54986b42b07b9f28369e2de22464433193d0ace8839a5"), MerkleBlock::reversed(1738584, "0000000000000034c72978963123d39d8c41eb9d9507be3b983387e1a1f4e21c", "aa2e90fd1df9e9df1467c3d6388d18b8b96f7fa5f690b96f19d3b70ffc11c331"), + MerkleBlock::reversed(1738600, "0000000000000020bbd8e672daab5fe532bea9e323b463f8e0d11a3cabda34b8", "eaaf270bd6845e604d86cfcbda5c9a1d19a26d4922c903a8df1081b877af88ac"), MerkleBlock::reversed(1738608, "000000000000001960841263606ebe18e0e7f804dd5b41b7527e6ccfdd022c8e", "e169f5b453012956a2a8a45a30fd1cabb37bf8af13e1947c98a7c2c7d5558632"), + MerkleBlock::reversed(1738624, "000000000000000a3676d7320c18465f95b5f2411f8fae8d69c005e97c6b2bf6", "8436b96213815f54001be00a4d84dc82c63494523a1c58688565822340c1df4f"), MerkleBlock::reversed(1738632, "0000000000000022d97e7ce52c2dfe2e9cf7bad7db443f6b46bbf388599aa396", "09b1275659797fcc8ec6e68a3c9e25d172c1e6c70cdf95fc3f09d25c2f475f75"), MerkleBlock::reversed(1869696, "000000000000001ec9b937a234a8f482c18fb9a31ea81a08d21fcf91ae60c389", "eb66b18d16559991fef3312e1ba9f47f6935735f2780fc05ea33f0a408af149d"), + MerkleBlock::reversed(1869976, "000000000000001b871880120ab0115f654b91d2bd88c26b2ab5ba463bef6748", "9505ebfd68c44874d3e7554481ecb2f07834d14417a2165945683c6562351d6f"), MerkleBlock::reversed(1869984, "000000000000000162f7ce32df4f55a467db5203913350a1ee6f5151c877513d", "e74d1887a0351f8baf43d71f6bac3046a8d28490aa68dace79e6101038fa4c15"), MerkleBlock::reversed(1870264, "00000000000000135152878c212fa17b6e85161b329f8b724692dd2ec1088c3f", "914e64c453181543797526c155b916a11e0c71ccb44f98ef18e16bb503884a82"), MerkleBlock::reversed(1870272, "0000000000000020918ac37d981ffe86b10ad9dd48aa7ce8234d24cd1b2ce9a4", "c61c25457678118466158d6ec7de8b2dac55295a7c6d54fd980663576d31c5c1"), @@ -637,6 +708,49 @@ pub fn init_mainnet_store() -> Vec { MerkleBlock::reversed(1872280, "000000000000000107f4d40a47ae70cde9d2a42bee5782c40dbe96b6036ee974", "e97161f6dcf9837bd3dcd9b7d1f292d23157a11e3edec224a9fd33fc8a4d13dc"), MerkleBlock::reversed(1872425, "000000000000000105e354284e822da24c25e487639c7a04998c632ebb816aa1", "94d27331f84efd6e8554d6105dcea6ec1829d3dfcf7fbecdce5b08e9db9ab50c"), + MerkleBlock::reversed(2186776, "000000000000000d4b35a208bce32e6b78a3ad27ff304213030025e27b0c8dc3", "774bcaf592832447eb12bd7c5ccae8b93979a81a91a276b75a39c0e2895eed5b"), + MerkleBlock::reversed(2186784, "000000000000000584fded8993d12061397780942f9d53c9eea73d20d32fedc0", "b9e697d72873a63478510f149397bf2bd625f0d6b14fb158cd9c48efd9d20c7b"), + MerkleBlock::reversed(2187064, "000000000000000b83600bbc5e15977546283f74e87b1d28dcaf553864613d94", "2d47d5d3476ca8d762e84164759ee016cade60203853e11cc2e418d621dce1b6"), + MerkleBlock::reversed(2187072, "000000000000000baad26a02c7778d01cd977a72bfcdb82eccec311c87b75c3c", "b684422d5f8550963e292edc4ea3956b4ff07f8692ee274bf7dd3472dd4a5da1"), + MerkleBlock::reversed(2187352, "000000000000001294cd9756f904d5f3012260724eddcceb06779b82098831ae", "8019b39b13725caf44ba90232784de4757e6e9976992c612702db0d9641ab5cd"), + MerkleBlock::reversed(2187360, "00000000000000118a3112eb63da284a601e5c0357d2491b6b97e025d0afbed0", "9c76f90b0eb227818da59163767169284dcf8f244982ff76b818fe81eae450a4"), + MerkleBlock::reversed(2187640, "00000000000000220ecde30b1049cc6115c2245759f95f2df99a7715cf5ff8c8", "fcdbb40b3e8189f374f85ba6e211d0d3b8c033f1bca86df629b0799fce369347"), + MerkleBlock::reversed(2187648, "000000000000001666d53dba2275c55ca6c90d2bfe917df3a7090ff6abc2f836", "041540704fbc7f9a079f6bccd4c64500635bb632e613078a7e0c4ac9298293f0"), + MerkleBlock::reversed(2187928, "00000000000000149be5c8694533f7f7136d9ac474c6a765f5e1fbf37cb6871b", "716b3ba694deefd65b7efddc9f957bff1af6b7841c119a03ddaad4491e8a785c"), + MerkleBlock::reversed(2187936, "000000000000001d4ebc43dbf9b25d2af6421641a84a1e04dd58f65d07b7ecf7", "570bd4e2958dad7fc80b1fb1567ec9fc0aeae135c97fa9d9b7fcc51ecc6495fe"), + MerkleBlock::reversed(2188216, "000000000000000c3527472558d6506f49287f81be184804435c519123b37ef3", "bba8bf6a845229e956940c9e145b9b2e6c81249952851b6092424180a8466153"), + MerkleBlock::reversed(2188224, "00000000000000086d137593b58c5aea9f8e32577c1063d7b3905cef869a717f", "77a7bd6e0923b38b7191ef96eeaa536fbffd9d2745e7516468be36675937d876"), + MerkleBlock::reversed(2188504, "0000000000000004011cfb76809f8340243fefcf223ebc49b6ba39a312fb5729", "057c5d4bad31b614dbbe90f1ea95c97087a25e900469ef01a5d8b82787457da5"), + MerkleBlock::reversed(2188512, "000000000000000e171ea90503e39d31cd4cef2f416fce7d76811b28830cebce", "9a4c6d5a6cd3638c2e66abf8aec68e43bd1aeee5c04bc82170f8325edeb604f5"), + MerkleBlock::reversed(2188528, "0000000000000003a1d42baa32617bcd0884112f420decfcb21808b73da063b7", "fcc61a4bc51d5a166b426b262cccb1f72ba9ba0b8dc2a635f6447edb269f5ac7"), + MerkleBlock::reversed(2188536, "00000000000000076fbd6695f4b94a516d6f6f36525749e3e048dde19ce76b85", "36edb053a9d61b2f164b0cc5cf31e3dd17a813737fb9ab374287c5c1ef474740"), + MerkleBlock::reversed(2188552, "0000000000000000d91c5e9247011895fad09081de4ba2d1686e5d217c6411e3", "4886d03b8d310f92b8f772e40c1efca8cd2f902b45c61bebfd05e4d2d42269b0"), + MerkleBlock::reversed(2188560, "0000000000000016516debdde1f06642fee2c6282a83908ff76c829343b95667", "4abfd61103010cd55ce4bdcb5b059bc3aa64bf48c6e6e24cf97cff2f433b436a"), + MerkleBlock::reversed(2188576, "0000000000000007fc08baa52fe88904521ae636997ad803b82f4efdad423f4b", "4f4ba5c06de7b6ae3a504fe2f768f6fe2cf6e3a0f5946d341368ad235d0101bb"), + MerkleBlock::reversed(2188584, "000000000000000a478781ed4e198f38c92327cd137dc386f320c405760b2d5a", "c7ac18f568e550017fa7c8b456a1febb25947f9e43924a4230618391c45897de"), + MerkleBlock::reversed(2188600, "0000000000000003d372be42f6e4a80a65d4f2e4a4d9083c448449e52ec46114", "b3da732ed8fca9600d954383f879f8ff632dbfa802fc072869ac464ca27a484c"), + MerkleBlock::reversed(2188608, "0000000000000001050f41432e4c28439b852857ac50cd6853af9fedeb2f98c3", "55e6bcad9098ded389b1008b2c8727cf96e73e2076b2e5a8df906b1ceb0aaffd"), + MerkleBlock::reversed(2188624, "0000000000000008f7aa230e25d9f910dcad1bf18649df9d50690933a2385d4c", "4c23c36a318af7bfd87d4006481b5c103330441c428d2149f1c46ab449d76556"), + MerkleBlock::reversed(2188632, "0000000000000000cc36334284fffe2f20761694f4203c50994f9379fabf435a", "2c0a7b4277b81308607dc5bb3108aad52a52284d36a0df99dd888797cf5819c0"), + MerkleBlock::reversed(2188648, "0000000000000023c422b19cdd443748fb3e205a6b25f56a0ef5277105fce91a", "90fbc51c8f1e72bca94ddb5f67ab8926b9be489b1a0e56df854a730ae574a079"), + MerkleBlock::reversed(2188656, "0000000000000020b55f2a81307e7a1709c817070718135c4681172a6f597d23", "1bd1fce9017d4e5b747ec160253c36c97d6122f58733966758b495a822be8466"), + MerkleBlock::reversed(2188672, "0000000000000013b72582447a0fd23538adf705a61d9d1650ddc79596589ae6", "1906b507617533a6c24d27162677747916490565e9655d010b2d11f507ee91be"), + MerkleBlock::reversed(2188680, "0000000000000013dcd29a220d649020c7a32e4218acedd8cc55209b196ce3f4", "79a276aafbb9713b9744d0e1b5ccc78aad61aac0bc9459cf9ddd5a3630e2ab29"), + MerkleBlock::reversed(2188696, "0000000000000007de8322323d564b31582a225e0260ab7e5f6b17a1d3b9aaa4", "2a47d6f6fb7a10013c0e28feb91dfd211072d6a5661728e302b28bec213a4f07"), + MerkleBlock::reversed(2188704, "000000000000000d57da510abddcea64f3e22407f7acbf4137cf4feadef63b5d", "305ab3dac3b2a475edd707efec461453d4b2537bf9dde95800d130708a9ee077"), + MerkleBlock::reversed(2188720, "0000000000000006d855f1a6c87a89a2c07d0739dfebe8a85df90d8dcae0c2ab", "265cff8fe59ec83bf82ef80baac1bbc1823c172117404505a7651ece87786779"), + MerkleBlock::reversed(2188728, "00000000000000109f4ebee252b5e9a44418d217963b25f46b39b1b52b6c52fa", "1d691186520ff17ee15a4bfd98215cb9462fe224fc7660df1d7891a4078fe247"), + MerkleBlock::reversed(2188744, "000000000000000bd0b9259c42fbc177a2658fdf3744c6b874f43c7b4c8c4044", "e1ecf90cb77d7dda8f1aa78c48f8d4835c3756cd300af673a5dd00e26c0805ee"), + MerkleBlock::reversed(2188752, "00000000000000109e9f947829f8fc86d3be03c9265c6f90a200dd8000d796a9", "e76c53cfbab8bd8e7e547cc11e3d8847ac3820a5af3bba5b9f1a9957616cda86"), + MerkleBlock::reversed(2188768, "0000000000000011a3235d1dc08f9171a172e02e9062511c2c47165cd1fb0988", "6d314b4e912ab079f41f04a178b6be9a53645729bbc24f279765d7a76799da7e"), + MerkleBlock::reversed(2188776, "000000000000000e7262d9abcfe05176913aac611b3118b51c3ef2516c758ef9", "eb7237059dd889debeec8d38dbce9c12da32de1d6440d650b4567b960443c0f9"), + MerkleBlock::reversed(2188792, "0000000000000003c3a84a77a1d9ae6b5e4eed9fa5b22d3086918bc8bba96d3a", "16c52c5f43e1320d8384ad4e4462320dd99b838f8863c180f96b3c4e67883f6c"), + MerkleBlock::reversed(2188800, "000000000000000e8a32c33be54c6a006e7913b1608fb0c34676258d92cdd9a3", "c40367fd1c81df343e8ca8d291bb11bb5b0f1687be42fae6b0de1b4e92d9ab12"), + MerkleBlock::reversed(2188816, "000000000000000adc9c2cffa63709ef1caf06789de32fa3e1ef9f6160f4ca14", "d0bf741be348afc803fb21db2df0bb30a20250b188ac9122b9cd6d81ac0988df"), + MerkleBlock::reversed(2188824, "0000000000000019d10797ef18bf2f4359c97456c819e841481b0ec0e85e0d4d", "a2b6fab89e92eb6df2268a9f39050c6ed460ec10c989f3773f47c2f854dfdaf5"), + MerkleBlock::reversed(2188840, "0000000000000004c5172cef43ec327673c1eeda2bcd4642c353d03a97ad0390", "928c16f8d1dc1160966e8ba4454509690e06fb511ab7a7bc3af67274cc7c0a05"), + MerkleBlock::reversed(2188848, "0000000000000005d3d366dc58b8acfc1f4ff98834f04f6bd9041c4f66bf8c7d", "8d3f7698e804321250de497378cb7cf8de3d99dff118d1a8dcfee607b22773b8"), + MerkleBlock::reversed(2188872, "000000000000001f018c38165182d58449c02defde58c212e2e05e360329c972", "26e0ee6724b15d3f55b166b2bd1260989763f46b231125a5aae8999afc89d08a"), ] } @@ -644,6 +758,7 @@ pub fn init_testnet_store() -> Vec { vec![ MerkleBlock::reversed(0, "00000bafbc94add76cb75e2ec92894837288a481e5c005f6563d91623bf8bc2c", "e0028eb9648db56b1ac77cf090b99048a8007e2bb64b68f092c03c7f56a662c7"), + MerkleBlock::reversed(8000, "0000001618273379c4d96403954480bdf5c522d734f457716db1295d7a3646e0", "18f1fb340d1cecfc9ceee9dc7d37a29ae72be71750a8f4b7c3f4a0c5832f38f3"), MerkleBlock::reversed(72000, "0000000007697fd69a799bfa26576a177e817bc0e45b9fcfbf48b362b05aeff2", "634cfd75bb5cda0eab595376810448e0924ff33ee4a8997e80454bcc01e4dd80"), MerkleBlock::reversed(116000, "0000000003525090da7c7a6fe571b030ba0477a54ebc0b34091887dd06f444dd", "31e860b51823939ad72aab072813baf182dbd8094df75d74c184885c3a76ebeb"), MerkleBlock::reversed(116716, "0000000001ae45c1c24bad5a83a6cf12d7c493aa92579055c39fc16558ba26da", "804d959157f3422147dd18cba37eb0d957b5e54fd36b9572982f5f7bbe67c024"), @@ -708,10 +823,15 @@ pub fn init_testnet_store() -> Vec { //338688 000000339cd97d45ee18cd0cba0fd590fb9c64e127d3c30885e5b7376af94fdf 0cecdeda3cb886a5863e5228a4f22bd10e774a4721859ccb10be937496d0780f + MerkleBlock::reversed(338680, "0000006f79a25b1af5f39b4111f37324cc23cdef76df792a56e75d07ff4a3c01", "6e123818e1db1483287797e6c540cf0ccf6a680c4ccdd1403213417fdd22131c"), MerkleBlock::reversed(338688, "000000339cd97d45ee18cd0cba0fd590fb9c64e127d3c30885e5b7376af94fdf", "0f78d0967493be10cb9c8521474a770ed12bf2a428523e86a586b83cdadeec0c"), + MerkleBlock::reversed(417592, "000000377d549f8b5007b5b08c80bb16e9a616f8225796597bd26450fab99d99", "64cd203726faab872a78f9d265bf3407d585e48a4c82c99770520252bc79ff96"), MerkleBlock::reversed(417600, "0000000e6d15a11825211c943c4a995c44ebb2b0834b7848c2e080b48ca0148e", "f0e7f02633c6b63122d4a281a777061ea50de9f873c8d2ea4f7a51415dfbb062"), + MerkleBlock::reversed(417880, "000001307930d91e02018d9334c875be155b2a57d9775582ddf6c87d468c6059", "ff751894ec7f80adb953d54eea721f7bb1177e740e0da071dec588dfcb831d8c"), MerkleBlock::reversed(417888, "0000006faac9003919a6d5456a0a46ae10db517f572221279f0540b79fd9cf1b", "e39146a591f60030e94f18cf018fe5766f8f86d5a54c4af07b11ac3dae87512e"), + MerkleBlock::reversed(418168, "0000056ed4f86daa521b1578056e9244695cd6aacc638ac845fec910736dbabd", "59a62fbea7ef77538d8a1cb27640cf15368b449f500169a1fa214f07038c4828"), MerkleBlock::reversed(418176, "000000bd5639c21dd8abf60253c3fe0343d87a9762b5b8f57e2b4ea1523fd071", "bb3e322bb89853abeae174c785134b74431d2f5f8fbf2510cf04f1efa25c7584"), + MerkleBlock::reversed(418456, "000000613f495f8b95a7aa0a6d4338df4f76b655d35aeea6c17a18e5c31b84f8", "f14745665fbc1cdc1850bb62191519bf808796205439d23210a68e765ad9ca67"), MerkleBlock::reversed(418464, "000000dc07d722238a994116c3395c334211d9864ff5b37c3be51d5fdda66223", "81bd29901a99938fcc56bc779da6f0d724a84008ab85e54309c13a02fd6e65bd"), MerkleBlock::reversed(529416, "00000237e7b0b917ea9690189afd310d0956e80a2f68bf109b40b7d4c0654808", "8b37fa48666f8d962c8641f1099895ab87f54d2160d60d7ec2aeb0f146883e27"), MerkleBlock::reversed(529440, "000001d61a206eba200a0379ba972a5aefbce7b831b96e20319d49d386da18cd", "7a7db4b8212f7306af542552c00444de70cf55930d9c8bbaa256a1f17e86be3a"), @@ -822,7 +942,7 @@ pub fn init_testnet_store() -> Vec { MerkleBlock::reversed(795672, "000000bbefb1e5a980049f9657e1d5d694c0ba5178c4ac2dc5313d83f0a2e00d", "1145b9b2b227fe9eb7c30e637b0fb82bac868c55e97ffa5cfbea7e6600754f19"), MerkleBlock::reversed(795696, "000001175c44328afb28f69c471adef698cd2cda7a5e483222d19f4a74112dea", "2134648f73d95d28f082784da2956eca7d56bd6ea6c4ef76b9f5b7f92dbd7496"), MerkleBlock::reversed(795720, "000002eec4221472fe2dba3bd551d7e92172e17ad2f3a979f972d9b81bb29110", "fd4b3c85376ab67aa4573f951b6d0b18962e645dd6ee5b9aefe2399bb59f514c"), - MerkleBlock { hash: UInt256::from_hex("0000021c387334151438c59551967d61eb68788a5327ce15b39238933d8fa366").unwrap().reverse(), height: 795736, merkleroot: UInt256::from_hex("1c234276d6e9aa4da869259ade20971a6f058510fcae4d344e227d78a9a78c45").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000021c387334151438c59551967d61eb68788a5327ce15b39238933d8fa366").unwrap().reversed(), height: 795736, merkleroot: <[u8; 32]>::from_hex("1c234276d6e9aa4da869259ade20971a6f058510fcae4d344e227d78a9a78c45").unwrap() }, // MerkleBlock::reversed(795736, "0000002266e3c2e362a3b41df260be8c0259f0a20599f21ccbdc2baa6967373a", "6fe4b151e61f32e764577ef1b3dd41dc3997da6ef7a980d34b6fe9b2a7c4b6c2"), MerkleBlock::reversed(795744, "000001dea9f8833a083d0ead435159661483007e193d5e1dcbe69bccefa110de", "b4f3b73f2fe429b661ebc5cbed7735eca3a46429d4ef1eb3dde47b918309b4d5"), MerkleBlock::reversed(795745, "000001ed10df529402eaf7575650bcfb680c5cbaa7e7452bc5b3b883f595b239", "436e897e99412f0b3be5afb1098b2859571b0e19c067c347fce7e259b67a0c6c"), @@ -867,7 +987,7 @@ pub fn init_testnet_store() -> Vec { MerkleBlock::reversed(795984, "0000005f2078aaee0cea877ac4af2f1cc2013951a5c71511dce3601c835a896a", "4a21b7082437729b027709d84580f5318ee119dacf243be2a198504c97272350"), MerkleBlock::reversed(796008, "0000004a60565bda4bc7e778f7d890954b19368d8daa73ab14f97357abddd2f0", "5e3470dd7d7c1214bff4fdde08e5410c40dc1fb6490d4ea65adfcc1c7fff42e2"), - MerkleBlock { hash: UInt256::from_hex("000000628ef83a2ddf93736e802835f515adea6c81e9bdecbf4d67416ad19f35").unwrap().reverse(), height: 796024, merkleroot: UInt256::from_hex("bdba2c28f9e52cf4dda624b8ae3d03978436fc3a266060b395ab9c2fcc74e507").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000628ef83a2ddf93736e802835f515adea6c81e9bdecbf4d67416ad19f35").unwrap().reversed(), height: 796024, merkleroot: <[u8; 32]>::from_hex("bdba2c28f9e52cf4dda624b8ae3d03978436fc3a266060b395ab9c2fcc74e507").unwrap() }, // MerkleBlock::reversed(796024, "0000008deca0581f4183be788e42e652f70ddc7ca52f5290a91b1732bbc03f50", "d9d668a2ef7dc87f8724d0608fcc5a67ecb263dfc77d938ea250f4908c6395d9"), MerkleBlock::reversed(796032, "0000004777159b08d4340400ab9449e89a29e11c761fe0fd6d06874f1156338c", "e1ab3fbc670143ff9130ba1ee166c125bdd8eecbc075b89f8015711c10ba1aaa"), MerkleBlock::reversed(796033, "0000002e24d51ab3e547ec1b91611f09edbb2ae48b8cab3c75fb4c7a44c911ce", "07a0b4cbc6fe535c51f7f35081b11d92c3ef2192269b72679478daaa872dc07b"), @@ -915,28 +1035,28 @@ pub fn init_testnet_store() -> Vec { MerkleBlock::reversed(796264, "000001112fff265e0f7c789436601ae6b8e1c2eb2526c43c624c339a5eb2d843", "5500ef05f2c77b871a5147e9c406e5572dc56a1e928485591c83a14cd292679b"), MerkleBlock::reversed(796272, "0000007c0637f8ee600ddb1b0179f998672f65ab63e76be0a5876eace18f8155", "a321dcf2a956e70075a293467f4c9fb6bf49ff11e3e686dd7cbead7819359d26"), MerkleBlock::reversed(796296, "0000024cba0f17dcd20002cf98db7e22c7449cb74c52f7d8c54f1262ef655e3f", "10edb54041e009eda7b4d0cc633ff20972190287dd7088697a3bcf060d586ec7"), - MerkleBlock { hash: UInt256::from_hex("000003b03c38daf45ec2dea558ac2faac07945abdfe172a23ead6ec3594f96b0").unwrap().reverse(), height: 796312, merkleroot: UInt256::from_hex("ace71208b50f155c9180fd0afd418ad3062baa41f2bbe66ecb797de7b91be651").unwrap() }, - MerkleBlock { hash: UInt256::from_hex("000001cce4bda8328bf8da24c309e8e5a850cec80326a23d07f7c398984d2f99").unwrap().reverse(), height: 796320, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000001b8724f2fb446e7d778885f6e6b1b5ba01a854e0b248e5d44b810b4f568").unwrap().reverse(), height: 796321, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000022e90798a7e3ae8a0c54ff1b08bcbd3c28814cb0d13c87ede05525d5d85").unwrap().reverse(), height: 796322, merkleroot: Default::default() }, MerkleBlock { hash: UInt256::from_hex("0000027132beb45ce081b1df336bf24c56b98738685d4284af59f4e60a91995a").unwrap().reverse(), height: 796323, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000002614a99ce9ff3510df256ce8d2048e8166a169e2fdbe4b7c63da2bafccf").unwrap().reverse(), height: 796324, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000003a47674b80950b61ee6b140c9df9fe53be227ada3e099414aa4bc33b6a").unwrap().reverse(), height: 796325, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000002aa86c37f9b82e3365032d327b5bb9daf937f17f7aebeaa60e7a81b2bbb").unwrap().reverse(), height: 796326, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000015a4f68bccf833fbe01dfcd4dc8762ae9bfc3c8522962d77c4111ff7cc7").unwrap().reverse(), height: 796327, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000289e003c83a1f439ec76f60006b6e498f02c271568426594ef13281fb7f").unwrap().reverse(), height: 796328, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000028230d4354fa9ad7ba1a1f78ac4bbe80030422b79a9389cc21091f739a6").unwrap().reverse(), height: 796329, merkleroot: Default::default() }, MerkleBlock { hash: UInt256::from_hex("0000023bc5d4ded8f55db044e1359986707b142d85e8b565df8ccd01a77f167a").unwrap().reverse(), height: 796330, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000002e80e4b1558dc73cda6ab4127629a4be4108f1743686276ed873b53a043").unwrap().reverse(), height: 796331, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000273c475ae0a1e38347d193b078e049714b547512da5cb759d8169d3f96a").unwrap().reverse(), height: 796332, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000189428c95a92f8d95b671d406cdf6cebf88d2f7979b61bc38b47209fabd").unwrap().reverse(), height: 796333, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000c995037312ca175def1a71d49d8dba81ad793dc48a64429055cf156232").unwrap().reverse(), height: 796334, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000103314490b095dad78c6d4367c8b8aa539e487017f90cbae6f975bdd23d").unwrap().reverse(), height: 796335, merkleroot: Default::default() }, MerkleBlock::reversed(796335, "00000230788492ae592492c97a2f7f232eeceb189f8199441db7ca5cd37a12c3", "d28af4fcb57005487f388a7d1cbd8f1aee0867d67b70d00f1cdc54b22ab8c598"), - MerkleBlock { hash: UInt256::from_hex("000000c0eeab1b13900de9b62415c6daf4e132ebc70de9d2de345642265c6a8a").unwrap().reverse(), height: 796336, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000001bfb8acbba17de7eee1685ea8de819759009b0191d1fe81713541b93917").unwrap().reverse(), height: 796337, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000001a217a8261066939e15de47a33417d273256036d98c5a6151d5b2e32355").unwrap().reverse(), height: 796338, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000001758fca4893ede279449590d682a90454cbb64c3d89f1c06d8e5cfd21c0").unwrap().reverse(), height: 796339, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000181b6f51bf646b9fb70ea9d2aaf5e628d1b5553fd185dc239f658d5d520").unwrap().reverse(), height: 796340, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000b62e9791022f4879807dce5977050be824298442a53599305578a56971").unwrap().reverse(), height: 796341, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000274d33b97e254f97fce65edd39739a0ba2aaab5ccd0283a29dc9b96bd01").unwrap().reverse(), height: 796342, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000003b03c38daf45ec2dea558ac2faac07945abdfe172a23ead6ec3594f96b0").unwrap().reversed(), height: 796312, merkleroot: <[u8; 32]>::from_hex("ace71208b50f155c9180fd0afd418ad3062baa41f2bbe66ecb797de7b91be651").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000001cce4bda8328bf8da24c309e8e5a850cec80326a23d07f7c398984d2f99").unwrap().reversed(), height: 796320, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000001b8724f2fb446e7d778885f6e6b1b5ba01a854e0b248e5d44b810b4f568").unwrap().reversed(), height: 796321, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000022e90798a7e3ae8a0c54ff1b08bcbd3c28814cb0d13c87ede05525d5d85").unwrap().reversed(), height: 796322, merkleroot: Default::default() }, MerkleBlock { hash: <[u8; 32]>::from_hex("0000027132beb45ce081b1df336bf24c56b98738685d4284af59f4e60a91995a").unwrap().reversed(), height: 796323, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000002614a99ce9ff3510df256ce8d2048e8166a169e2fdbe4b7c63da2bafccf").unwrap().reversed(), height: 796324, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000003a47674b80950b61ee6b140c9df9fe53be227ada3e099414aa4bc33b6a").unwrap().reversed(), height: 796325, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000002aa86c37f9b82e3365032d327b5bb9daf937f17f7aebeaa60e7a81b2bbb").unwrap().reversed(), height: 796326, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000015a4f68bccf833fbe01dfcd4dc8762ae9bfc3c8522962d77c4111ff7cc7").unwrap().reversed(), height: 796327, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000289e003c83a1f439ec76f60006b6e498f02c271568426594ef13281fb7f").unwrap().reversed(), height: 796328, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000028230d4354fa9ad7ba1a1f78ac4bbe80030422b79a9389cc21091f739a6").unwrap().reversed(), height: 796329, merkleroot: Default::default() }, MerkleBlock { hash: <[u8; 32]>::from_hex("0000023bc5d4ded8f55db044e1359986707b142d85e8b565df8ccd01a77f167a").unwrap().reversed(), height: 796330, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000002e80e4b1558dc73cda6ab4127629a4be4108f1743686276ed873b53a043").unwrap().reversed(), height: 796331, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000273c475ae0a1e38347d193b078e049714b547512da5cb759d8169d3f96a").unwrap().reversed(), height: 796332, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000189428c95a92f8d95b671d406cdf6cebf88d2f7979b61bc38b47209fabd").unwrap().reversed(), height: 796333, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000c995037312ca175def1a71d49d8dba81ad793dc48a64429055cf156232").unwrap().reversed(), height: 796334, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000103314490b095dad78c6d4367c8b8aa539e487017f90cbae6f975bdd23d").unwrap().reversed(), height: 796335, merkleroot: Default::default() }, MerkleBlock::reversed(796335, "00000230788492ae592492c97a2f7f232eeceb189f8199441db7ca5cd37a12c3", "d28af4fcb57005487f388a7d1cbd8f1aee0867d67b70d00f1cdc54b22ab8c598"), + MerkleBlock { hash: <[u8; 32]>::from_hex("000000c0eeab1b13900de9b62415c6daf4e132ebc70de9d2de345642265c6a8a").unwrap().reversed(), height: 796336, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000001bfb8acbba17de7eee1685ea8de819759009b0191d1fe81713541b93917").unwrap().reversed(), height: 796337, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000001a217a8261066939e15de47a33417d273256036d98c5a6151d5b2e32355").unwrap().reversed(), height: 796338, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000001758fca4893ede279449590d682a90454cbb64c3d89f1c06d8e5cfd21c0").unwrap().reversed(), height: 796339, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000181b6f51bf646b9fb70ea9d2aaf5e628d1b5553fd185dc239f658d5d520").unwrap().reversed(), height: 796340, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000b62e9791022f4879807dce5977050be824298442a53599305578a56971").unwrap().reversed(), height: 796341, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000274d33b97e254f97fce65edd39739a0ba2aaab5ccd0283a29dc9b96bd01").unwrap().reversed(), height: 796342, merkleroot: Default::default() }, // MerkleBlock::reversed(796312, "000001d683c96dc2ebe1718ec2f467177579e623dfbfa65491028982559058ec", "8ff6e099bb35e119f9bd1852ad2603c3bbcbd4fc1b99443e6b00c5f179484a48"), // MerkleBlock::reversed(796320, "000000bb599158c3dd2e62da2fa62c18699aee93c5d81bdd5bb4edcabd320b70", "230d1d90923f96fd2a340ef26db610b39a2c2a8068bfdceb8a406c8254401131"), // MerkleBlock::reversed(796321, "000009f0f8b68aea7f50ee2fc70ceba5ba0644ac1b1e1f212cb1bb5fa7b87ae5", "fdf5abe0c63d0e282c2d44a2adb7758fd8a7dcc33848a7ba3185080ffbc20b70"), @@ -967,15 +1087,15 @@ pub fn init_testnet_store() -> Vec { // MerkleBlock::reversed(796349, "0000006a1b36725e0586dcd0e362349cc809d9db42c59843b06d24c0fa69e32e", "e401d04565b96952b56e6e03b81bc5d1c32945004204b83cfbf4d11fa1081da6"), // MerkleBlock::reversed(796350, "000002751da51b2276304340da03ecce8575517c7545d3b3c19103eb47a95130", "c7006e1e79939a31befcec3400b593c2b8cb0f953d45646fe6476535c426048c"), // MerkleBlock::reversed(796351, "00000018721f3d0275e5b0cc8990beca95abfce73e2b3e92f45f52b5e6416675", "ced664d2b3a23fae358a8c961004a74c20b53f4094d52faf827181c4b70d7dc9"), - MerkleBlock { hash: UInt256::from_hex("000001aece0279ab21b7503ffbb5ef72640fb33efc0a33cacb3217b802dabf84").unwrap().reverse(), height: 796343, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000148cff107be072ca972fdfcc92335054fb89be7419cac279961ed8d9fc4").unwrap().reverse(), height: 796344, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000d9d53f91daf99bf559281ecc84720fcc072a4d04eccd5e2c1a45b89398").unwrap().reverse(), height: 796345, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000c3a23206c0edb6bda518bb79a489a6b2df360d2cd96972fe33a5074e8d").unwrap().reverse(), height: 796346, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000117b7a23bc68daecfe6e8e7d89a5fdbb7fc0cb223990ce12b3cb880a0d4").unwrap().reverse(), height: 796347, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("00000174ce77270266f72aa4a1b08590c92fbb1f93f408ea38c73600012c31b3").unwrap().reverse(), height: 796348, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("000000b5c1cd6e4c02ce8786ddd08e8bfc1cf7b07fc602b9f52bf2eac5f60097").unwrap().reverse(), height: 796349, merkleroot: Default::default() }, // MerkleBlock::reversed(796343, "0000006e6c77a460f488f5dbd6a71d75cdc6a63c21f5f4525b5cd068a8e7c679", "84094c6fca88a11fc5517f88296c88862df8b1439f1264898e83a1a8c4559307"), - MerkleBlock { hash: UInt256::from_hex("0000023ba69970bfb984a7b0681ab6415b4b9e2a15fc633b39e761817b19be4e").unwrap().reverse(), height: 796350, merkleroot: Default::default() }, - MerkleBlock { hash: UInt256::from_hex("0000017e956d2468a731f1793ffc337dd49da9f7307dc345d9a0f2176b0ed523").unwrap().reverse(), height: 796351, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000001aece0279ab21b7503ffbb5ef72640fb33efc0a33cacb3217b802dabf84").unwrap().reversed(), height: 796343, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000148cff107be072ca972fdfcc92335054fb89be7419cac279961ed8d9fc4").unwrap().reversed(), height: 796344, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000d9d53f91daf99bf559281ecc84720fcc072a4d04eccd5e2c1a45b89398").unwrap().reversed(), height: 796345, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000c3a23206c0edb6bda518bb79a489a6b2df360d2cd96972fe33a5074e8d").unwrap().reversed(), height: 796346, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000117b7a23bc68daecfe6e8e7d89a5fdbb7fc0cb223990ce12b3cb880a0d4").unwrap().reversed(), height: 796347, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000174ce77270266f72aa4a1b08590c92fbb1f93f408ea38c73600012c31b3").unwrap().reversed(), height: 796348, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("000000b5c1cd6e4c02ce8786ddd08e8bfc1cf7b07fc602b9f52bf2eac5f60097").unwrap().reversed(), height: 796349, merkleroot: Default::default() }, // MerkleBlock::reversed(796343, "0000006e6c77a460f488f5dbd6a71d75cdc6a63c21f5f4525b5cd068a8e7c679", "84094c6fca88a11fc5517f88296c88862df8b1439f1264898e83a1a8c4559307"), + MerkleBlock { hash: <[u8; 32]>::from_hex("0000023ba69970bfb984a7b0681ab6415b4b9e2a15fc633b39e761817b19be4e").unwrap().reversed(), height: 796350, merkleroot: Default::default() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000017e956d2468a731f1793ffc337dd49da9f7307dc345d9a0f2176b0ed523").unwrap().reversed(), height: 796351, merkleroot: Default::default() }, MerkleBlock::reversed(796352, "000000965f777ac79d979c64dd377ec88f4a8d13f67bca043f6c380cebcf715d", "5b03760679c53bdfe2a67181413023c04ca509591d73d9fa37a7f2ebc06aa79d"), MerkleBlock::reversed(796368, "000001d239442ef05a87cf1c68156c3607932aac74373989614e69ee560212b4", "5c5c4be4dfc97ea0b58e19727c48e453a10373ef0c2369feef1334677d4d6100"), MerkleBlock::reversed(796392, "000001b5a7ecbf8c228dd5656f2e5f3d482ec0a9ceb1aa44caea6be0ae8d07ae", "351021e7f189ed8f0f734fe69e6cdea2fe7383c195a664af88fbb404c160cf11"), @@ -988,7 +1108,7 @@ pub fn init_testnet_store() -> Vec { MerkleBlock::reversed(796560, "00000148cb4c3348060007c474de7554eb75f33da7d33948a26b187d0e7be835", "9a7e8ae1e709d9c29479d45a24309554001eabde68cc2e712123b1a62f7a8322"), MerkleBlock::reversed(796584, "0000005142de6c478ad931a29b8235407e96d4437bebcf78d7d799c09db17556", "8ac9f1f689ab61514e2d9a342d3f316d176e5e145817ddc4788a9c7e810efc5a"), // MerkleBlock::reversed(796600, "000000afd4aaff7f48bab2a4d401ed06eab367d1b9e33c2036dd857fff7d7e5d", "1e55edc09a2f336a26cd10058a3cdab24968c1a99df164f086ffaa49489dda94"), - MerkleBlock { hash: UInt256::from_hex("00000067c009d837a76555c5ccde03f8d05e163e0338a243a6e71a420b68e5e2").unwrap().reverse(), height: 796600, merkleroot: UInt256::from_hex("45f83b09f14b1c71f5f6e19ea2586b49b98a21a62248660d949bcd10aefa3b3d").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("00000067c009d837a76555c5ccde03f8d05e163e0338a243a6e71a420b68e5e2").unwrap().reversed(), height: 796600, merkleroot: <[u8; 32]>::from_hex("45f83b09f14b1c71f5f6e19ea2586b49b98a21a62248660d949bcd10aefa3b3d").unwrap() }, MerkleBlock::reversed(796608, "000002abc958da3de0dfab816233c72f718f049e4f20843c2a7c6d1e66c6c442", "4a3ef5f0eeb6d70d600d8b6ec75234f63ea7f5d0511de350b5714c16a572e9ea"), MerkleBlock::reversed(796609, "000000275582f1245bab8de7a77931fa9f8ba039dc5e7b36e21a3d24f9ae961b", "c1cf2fb14b901cd4d9393d9f50ca470e87bf93dff92b640e8c55075fc7761c45"), MerkleBlock::reversed(796610, "0000002c01f6947c93eea81bd81a1f3fa92f66999ac6c3aaa718fd94e5819bc0", "0c057a70535b1912626c337238a8ed16b23453b6b275a818e99f23af073af721"), @@ -1025,7 +1145,7 @@ pub fn init_testnet_store() -> Vec { MerkleBlock::reversed(796656, "0000007d0cb0173d91ab5150aa0ba465d49bd05f6ec77ca6548b44ccc1054449", "83dd91d469f52f2de95a132808ad279094b446a30b1b5ed19cee9a0d6ef2f247"), MerkleBlock::reversed(796680, "0000007e4fc015a659c3f13036a3a3eb7782348ed9deb52ff4a264aac02656af", "b3537023192790f1c3c0d04f1da967d4b0b683cf059cdefdfa8d24b148a3dbb4"), MerkleBlock::reversed(796704, "000001136881af32cdc3e4f0107776feb8a59152136761b002e9dbafe00b461c", "115df7dc1ea018f2ef89a8f13b92762fd7366973114eb49dee3a655eb6dec130"), - MerkleBlock { hash: UInt256::from_hex("0000021715c8575620382ceee42cc7556bac5ed395eaf9c75e2119aa2876a1e0").unwrap().reverse(), height: 796713, merkleroot: UInt256::from_hex("cbdfce066c9bc3e3683fbcd942f2f444710ada2733bff1c7901acb38e9765361").unwrap() }, + MerkleBlock { hash: <[u8; 32]>::from_hex("0000021715c8575620382ceee42cc7556bac5ed395eaf9c75e2119aa2876a1e0").unwrap().reversed(), height: 796713, merkleroot: <[u8; 32]>::from_hex("cbdfce066c9bc3e3683fbcd942f2f444710ada2733bff1c7901acb38e9765361").unwrap() }, // MerkleBlock::reversed(796713, "000001e3474de9a3e6713de91bd47d639afa0727a0c64ec83a3f6aaa25f30f4b", "cf1beb2e23f348ae3476b0fa9aebc6d86fa5d55bceb459ac61e7fd2f85bd3855"), MerkleBlock::reversed(796728, "000001411e463bfc2790dd293c2b8793309ecc5814be4e4cc2b791de8c71e5a3", "727cc4850420eace8e74d6b063373da8750f000ace551e3f2d7d03091987d167"), @@ -1770,7 +1890,9 @@ pub fn init_testnet_store() -> Vec { MerkleBlock::reversed(900264, "000000eee879d731827c9d1a464084e38bd76cda7c9ea35c47b6bf30197b9001", "0796b904b51e6f8efdc7b253168982f163f3bc475bd505a7bf09511931c0de19"), MerkleBlock::reversed(900288, "00000061cbada11ab9ea3504a8488b374b5ff9b583f300287c6272acc79e6137", "98efd5f432f1f5dc731e628c8cbe3b0e472476d336c5e58778da314640bb8785"), MerkleBlock::reversed(900312, "0000016034c02250daedb14522ea04e66450c5c10e965a25d345e0ef9d3bac8e", "4ec7d242015a148c22af04912fc6cd3cd0d0048db309553e77932c249477474b"), + MerkleBlock::reversed(900328, "0000002e68e5c8a14b1ee2f616cc6525e3527c88627b0eef4297a634f13e690d", "e4edc599c819764c466aebd5db143fdc2676a412398a00fe3893bcd797c5803b"), MerkleBlock::reversed(900336, "000000341b57f235f20765f34cbd14160c5ac7f94593eaac80abd39e5e8fd0eb", "ee278b25cf0941ab928743b76c3c9144dacaf073e9c04f11d7fde7465b6db8cb"), + MerkleBlock::reversed(900352, "00000154b9f164e2fb2c0979e3e7e371c264266d4e8b924ecb1dbeba06af4583", "8c7c8a47a51e5ec99172786a6be919a1e123284f4a834877f83c6cffddc14c08"), MerkleBlock::reversed(900360, "000001a333af3310fcc0d19b5b0564ac0a73c37ef88a1aafaefd25438218c328", "5288bd34249f6220789e69f4ce54518c1fd03cda30e55a0cc956846017eba7a3"), MerkleBlock::reversed(900384, "000000bb124bcd46e114fc6cd7fa32f83cc7efdffa69a67a7edc579937879a8b", "402fbdc0aeb4963dbdfc1b037c18b05bf292f2936b9f85ba235d22dd5240a1ed"), MerkleBlock::reversed(900408, "00000110aa3f71412aea5da557ac9f1f97a04f9263740fed058032153dbfcf78", "02f3a8566ea81c2b7bef3e6558a846df2f4f17a602a5f911d0597d59fd7e0d43"), @@ -1785,6 +1907,8 @@ pub fn init_testnet_store() -> Vec { MerkleBlock::reversed(900603, "0000004ef931e3b7de2142872bd07b002cad29760d0ab286b2c218a6af39adc6", "1b479985e871a1204cb1298c2a7a608b20e1dc53cd59ab71dfb7cc61c0b0764d"), MerkleBlock::reversed(900692, "000000e56daff2323e0cd9f88ea1d8cb9a9074a31f2547671d5b2573cb667476", "90c97f73ed40bcd65382c94e1ebbfee369c686e0e28decf4c4126eb1dfba25e6"), + MerkleBlock::reversed(902584,"00000030066155216fc7c5b6c7e313150323a2b66acd6241091de2e5c40b2c9e", "8e9abf8f57764b5fa090c8b902f9b4cd83c3729a520f8c72762df67ea57060d3"), + MerkleBlock::reversed(903160, "00000065e9ff013a961c86d517110098d1e839067aacee9283a1ec5557e5a86c", "43a7f48830a0bee3cfed9fc181d24fdbe183245249682a40509349ce2f12e059"), MerkleBlock::reversed(903448, "000000260c5fa85bd0184bd06949de50be44d44fa9ddbba3f5d1946d6fd1753a", "3204a8b1331f7dfd1c416062083dd499de976f2a9b61c5a59de5b7fe5d047039"), MerkleBlock::reversed(903456, "00000114e0aea23b8743592998958c471c77a862bd4114f11666df85cb1ad6a6", "1af018e746c6b1a50f4499836ff40a8a65d5a84c0403632ce28a8ffadf544609"), @@ -1867,6 +1991,13 @@ pub fn init_testnet_store() -> Vec { MerkleBlock::reversed(904536, "000001b96c97833ef305661b7428c09f857a28cf6f82b7f2e5a6189d5f8c163c", "da59ac4b3b9d3b0c96cddd977b07d6baa301066452aff1385c5fa2bd55e43099"), MerkleBlock::reversed(904560, "0000005ba73923ddd21153334b08c5781a021e94f7992029823fe03cb27948ff", "0114223c23f3beafa92ea9d753e35177a0d990d130eb93b8bdaf24a16295f131"), MerkleBlock::reversed(904600, "0000002676f845f03313f580c1f8be11f65e1567a3dba16cc44d0204023ad2d4", "24660da4da07199fa651a749626d17142d3ab3ba61be1ef8ac80d725a304c36d"), + MerkleBlock::reversed(904601, "000000ab493043e45238f511bd7052332ae2cc9fd09658bbe17b4c7a56bb331a", "ce201a70da9f6e437d142793f6be6a82f15552c44d6e704744c8d38ee71c0b5c"), + MerkleBlock::reversed(904602, "00000088f2caa943b3c4fcb4b847b5cec29d39d3bc472cae825d4660df9ef459", "d6677bfe5f814c8d4f9619e08771e2115ce24aa309a70613940edd8394cf1a93"), + MerkleBlock::reversed(904603, "000000a985dad4b5521e2cd2180c87eba80e17eed01b0fd40e11c4e0a6cb98ba", "605133931a52e32eeb7ac51789ead725739d086b1c0cd29a45640c9a3a87f7ef"), + MerkleBlock::reversed(904604, "000001ca944f68f39e930b3a0427c36b029fd4e637708842074bb4dfbbb53857", "3fce99203fcba24073ce80089e053a5d153d328f5a9d0a950c60798fde714d54"), + MerkleBlock::reversed(904605, "0000006a6c887206a0e559e9618cb59208819fa66c4dcdb6bfb474a6b2a42985", "5b0e275aed70b3d1c660869264a448bbffeefcc31d38568ee636b0082e26175f"), + MerkleBlock::reversed(904606, "0000026e529681a6e54f7b039245484b10ddd286dde3c1b9e9f76c78ee74bcaa", "b1d4799151a3b28f07259a6fd26564b1609b200d07db9fd8defe2f7502ef365b"), + MerkleBlock::reversed(904607, "00000129c0d1a8b1ea2b175400bba3408b836e26c03abcab410c85d9823f1904", "09d4a70f26536f73427d983e98fc3150c1e3931ddbb0b969bfd1970f923f0c50"), MerkleBlock::reversed(904608, "0000027a615351ff818adcf95757c3397cbcb09b8d086ef1db29a6d6d42f3e4b", "2f83ef3944ac9f0801d20a2d88d772b2e4080fdc00222b5b7541bd5450d52d8f"), MerkleBlock::reversed(904609, "0000013aa96efff2f5f8976965618e398ce13397a56c22248d60d905161ca676", "fe3d80e6457374d4393a906125422e4161e6811a650274717ff8fc8aa5f11b83"), MerkleBlock::reversed(904610, "0000002469e56ef92a5701bda9ecefa3ff69e266b5997c6e6f4e44290b2c2f90", "20a4c33d1d83f53da607dbfc01bbdbfe0798170dd8a8e4a47dfb668b2b3aeb19"), @@ -1894,31 +2025,54 @@ pub fn init_testnet_store() -> Vec { MerkleBlock::reversed(904632, "0000000acc397b524974d44f711bfae0947ef8d608b0e5f93b744a24fc01e50a", "981033fc499de05b81f48f43776674f671845fe25fc4133e6ac9a8ccaf3a0126"), MerkleBlock::reversed(904633, "000000b179dafdc845ed4b60775dfd45821999e024f01a9b5d5fa9061cf1d3a2", "e77a87f46012922cc3e3561033aee851907940ad54cd3f240fd1bcf40cd2bd68"), MerkleBlock::reversed(904634, "0000017e29d8dae27bc6d3b4685506f2b0c4fac8b089b83f5eb8ef026fb0b659", "c1cfd1298d270935b3af1220ac5d02c56eec128ea299ecabc242a04c642e0225"), + MerkleBlock::reversed(904648, "0000014ea5de4ab29cf252e660b060f3834f8efaee3ce5d60aa75f16cf5f6b2f", "2ca274978905d5fb8b4108f16984b46fc6bf6782b6e7def13d447d07248b9595"), MerkleBlock::reversed(904656, "0000021c3bb7ca076bffcebc07a6af2c9d8fdba42eff39aa2dfb5e00576cc403", "a9f40bf00158f95486a5700d870c502de386b3943240096c674909d5ed32284e"), + MerkleBlock::reversed(904672, "0000027687fbc70b062696f0186ab042b667d4606abb23dd50731844d89f8a5b", "7dd6562ebfaad8b6e2730af9338c9e53961205da9c697fcaf46fc63026dd0a85"), MerkleBlock::reversed(904680, "0000021539352328e7a191b1966415823d9eb82bdc791f3f7c7b84978f3335e8", "d56fcc39ae65371b45ea3013c3dc67b50e9ce7ed5ac0f68067820398fdb2c336"), + MerkleBlock::reversed(904696, "0000005a2d51cb36f0de7fa3d0ebc3916e88e724cb2f52151b28e5044f8dd20b", "3c7b0f30b6743d73dff126dde1875735477fb8ca411bfe605b4b59beda846829"), MerkleBlock::reversed(904704, "00000091b367989ea5acbd9d938372f2ed78db6996c242e5a06bd1a1d7ed0c89", "c34992ad8e424a59f1d9e3ce3a970309bc42626634c0bc06e3a3a8e60c21404f"), + MerkleBlock::reversed(904720, "000001c4da143965b70304931e07490b63ff4bcfb1dd344b4c971cb989947312", "e7ab45586697f1391ccad993a1a222d04ef4d595632cf9aefbf05b63a83e9518"), MerkleBlock::reversed(904728, "0000018b24bb2968eda1e006c4c6e15f05b4de5fabd38c1134501f8b8b170209", "8389fd9b50d15ff8f0c6a272ee0c23ca614488e6604e8b4effda1a2e9af16915"), + MerkleBlock::reversed(904744, "000000fc3c1a264995439067fd1303173e5fd3dc0711e0aaeb3e74cd6277453d", "adfbfdf1fcd9cf4d6b56ad064a04d583a51524ad4887f0d5efd0e411f3486124"), MerkleBlock::reversed(904752, "000000d58f35e1d1ad3b7ba5ee7c1a0eb93bfd0e72b612b8c432147648fde1b9", "7f8746c26559bf21ce76ac83a8e3456663be0110f808960b7fa98600817fbb70"), + MerkleBlock::reversed(904768, "000001598ccd738ef92c1a6a0fc5d816e146b992bed800f20321a94386629238", "a09bc81d4229dd351681c1667fcf3fdd6ed0883e70c0f44be64dadfdfdc9f80b"), MerkleBlock::reversed(904776, "00000181d098b976b83fb5c2157afd298936e794e31c6e61b39497f67af468c7", "81c632d674f723388bbb0174fcb3d4cf3a2bc7695fffa09c877f6f88f82d169b"), + MerkleBlock::reversed(904792, "000000785933f8abf1dd8a4c083f5094a8cac24f4c4290cebcf616ca32ddfe4d", "936b4033609fc4f23dfae76b4a61154e91e665d7f92a59a793633814a82614a7"), MerkleBlock::reversed(904800, "0000016a61f86fe76ee88c0abadc9c0ff85666ab3d1bca818c64b488d7c0d2cc", "389a66e09e920139d92eb0df3eab7afd2b3425f446fce1d5aff576563527fd5e"), + MerkleBlock::reversed(904816, "000001901b637aa6345888048ec42780accee6bd51f504b77d66bae8feabee0e", "729357322611c989cac577910d0ddaad7f42de55863444f67ebae35600e1cffe"), MerkleBlock::reversed(904824, "00000162111157d0d95f8aad88bad23d7e5522b3d09c22ca2725fa32a6e3fcca", "06ea1ea1db45a8ed8ed38a27dd24c42659da502a673c8442caf8cdbe6bfd0973"), + MerkleBlock::reversed(904840, "000001f280802b0ca53fc7daff711f4914d80c1c665125f613e1f120280e2dec", "4dcaa63b4c6c7ca2a1a22a56067bc8d97160f5c7fbca5216e54508af276b173e"), MerkleBlock::reversed(904848, "00000218fc134c8e9fdc088b0dff3a3c29efff997556fde53852e16d4ec6d7e6", "c9ab9571b02d8f920384182f40c93e4be8680a9435ea4395781dad74912322b4"), + MerkleBlock::reversed(904864, "0000023aac1f529faf1a826f025c6eb04ef6a18fa9d179517709d421a7c3131d", "6882c921a2ed04e6f4d42c2044a41e932fad386e226385d3a25d3ba68cb2a296"), MerkleBlock::reversed(904872, "0000036aeb7ab455ce7b3be12ef18f83d67227bba16e2483d61ce620f27495b5", "c565135b1fe637001b56d0594597977b057127507afc0b08894160be1efb654a"), MerkleBlock::reversed(904888, "000001edebd59348c730ea416cee247c8fc014d16566eda378ce8e39dd1bc6a1", "306ded72669658258ed2b31478674a1812f8df6be1f89192a432c46c12558d8d"), MerkleBlock::reversed(904896, "000000dd62839319d3f11ed7de3321824828c9134444e939825e506c4519d845", "0ad992b3987f878bd0d3859cbaa57b3b443671e331679dfd4295a08c94fd6cbb"), + MerkleBlock::reversed(904912, "0000008212af4e6b0497823702dd107b0c246f6961e5fa2391f795936450bb02", "b43114a4c7b965ca83dba5291516526ff95a284d1878f99810aa7cb9eed35180"), + MerkleBlock::reversed(904915, "0000014affa761dba897b98b8cffa78a86dd361959a9f0768283ecaec89f1b20", "b31873ecd4c317fbcddfc508f6757d35116b11cdc357ce5ea60882aa8d00856a"), + MerkleBlock::reversed(904916, "00000053b47e859a45c3263615157e625a3b1050b33765c1bcff018d7511bbb2", "afcc4d87b2913b8699d0ae09c70bf37a6259ed6104fdea9f35a8c91d34df4879"), + MerkleBlock::reversed(904917, "0000003b6e311e570cef8ff9f8c22fc84782b9ce7cf7356f745b3740418ee378", "8d6ee7438e07f7e80c1343e297d8f7c9a14ed6d1ecea4ad0579050d42cb982d4"), + MerkleBlock::reversed(904918, "00000068ac2b478c9d29aa5b9e6b98970910a5b705d5216961824aae3bc9999d", "df0c2c9cc01edb18e5a6f725a2796b887939d83adb9c2a65d15c83af883183f8"), + MerkleBlock::reversed(904919, "00000164b638fa8e57bc579777b15b871578d813f345204c7dda90db978d372f", "20400c0ce5245e82f8c7aec1bed6a92d891f932b2796a26f4b568d53194c3e96"), MerkleBlock::reversed(904920, "000001a1a0a68a1612e58506386d11d2c35c18ba4980cb91453c34347ca6e7e1", "13d8c0dfa17ace706aa4963fd39f012f28807bffa7c36f4615ed35ac3a8b6edb"), MerkleBlock::reversed(904923, "000000d446c778458a928c09e1303f667d0b05b6448bb4bb6a84ad6533b47f4b", "c778e2d0630f96220193041702e75342e01b76fd240208dfcfee1f5ff7dc8943"), MerkleBlock::reversed(904924, "000000404802e64541c07e89383e8b6e18ef8ee8323b709907adfd791416ea63", "9ef07c38f2ff0bef63093d0e560a5f61bc26e8a3df33c4ff526c984a07a592a3"), MerkleBlock::reversed(904925, "0000013af97367ae9ae697bc6a26928a3f9abc134cf3d0a3ca3ecd2c285130cf", "12b06d496ece7c5a1108868c77075e478d514bf0af8a58660c96e8d81a8d092f"), MerkleBlock::reversed(904926, "000000977105ed0c68ecf1364239cbeec61853899ef2ad18f648e594575380ca", "d7371b41d4f05f4b26fddf322dfe924f7a2fab0ae016800237fc6fe63bc742d9"), MerkleBlock::reversed(904927, "000000be04ff7284063df32de53cc19b03f8d1a690daffcd656d21a04929adae", "9787c2eb6809a33c52a5825507cbf48c60a74c68a16a173e8865fdedca71f123"), + MerkleBlock::reversed(904936, "0000011d27b86bb7459de7ccc416907ce59ad1b9236beba81fc0ed958ec5795b", "4475dcdabdaeecdf2c015718338ed5d1225eb8b7f7fe44b25219183571fd5cb2"), MerkleBlock::reversed(904944, "00000083c9b58fc14351b1692f95322bf9bd390dc0044df8dab053a2af2fa068", "13e5edc9a90c67e809e463f9a5e52d3ebacc0288f26498b2b3b11ecfd2b14bd8"), + MerkleBlock::reversed(904960, "00000049188d866bb5ba4dfec27170e413694953c0703b37f6bcacf62afa0ac0", "c8c92d1e8a88c2a8173a4e1c06065415927f9f89a34f0eb018d3b1760fdebd86"), MerkleBlock::reversed(904968, "000001a89d4aa7b04ca7f17434490a643b2838745ba64c67bd029c1e3b67d5bd", "38ee3a4a7858998d87fdda80fdde009161f0b7a2e86c41d924155bb8454da44b"), + MerkleBlock::reversed(904984, "000003cd5ce9d814c64902eec16b7b8d0e8d794e99b67e8ec457619bf51deda8", "29613adc264a010aa35743537413b6647ce871badee8d4bf853ffb480ecb1548"), MerkleBlock::reversed(904992, "000000fe17cb6e6fc81b968940db46de3ad7c7d645a58f4342c90ecd08902481", "593fac782f55fee1d407d17e4dda8b00fad9368ed2ed5d09c7a60f4d31ef2e9d"), + MerkleBlock::reversed(905008, "000002be321bba3ad5454cb5615568146d2c548a7b5246292aec76499b77db7b", "09781242d395968facf4ffc1ee73d3d10018ea1918482a6a9a9ce37a953d3573"), MerkleBlock::reversed(905016, "000003178abbf206ec82e8d046244f5b2312f83fc2828f6954a7b6e65b2ce6ab", "ddcd0eed9ae913172c915091c1117c688a29faf3ac53664974ee02ab1c262e87"), + MerkleBlock::reversed(905032, "0000011bf0017ab5916a46c425693e1f7b0adb412179137da3bf30d415bfed52", "e892da08c090a6480019424a625210efb3dbc020554a129779f87297a4057066"), MerkleBlock::reversed(905040, "000001d7aad8e1157c1751e1c4f19a566ea70225c7662ca5f57d6cceb378d738", "e7ddf69dd358afc88a1108bf7172febc0528ea687c720c915827af30d8865dd2"), + MerkleBlock::reversed(905056, "00000075dbb4feb438050b412e46950d5d0dbf83eda1c09ae43ce4484e9af2e6", "93f5668851116b8c2f47fc568d8f73663583eb9cc691fa67854d9f30d290400f"), MerkleBlock::reversed(905064, "0000013a57d76da92962c04cee96db9e0ea0a579a909632e287164899ce09ea7", "7461fd7a8dba016dc999e364610f74e768eb8894191895c2bd67f6d114002662"), + MerkleBlock::reversed(905080, "000001175e3769dbdd91386e7fe1fcc62c7f61a54a367069777c6a540ee847d7", "1d94eab7a071cb5bec35bde096de675504a4d70750c64f9ba7c54f66827af764"), MerkleBlock::reversed(905088, "000000b1702d46abee1cbb16292ccfdb0d437938df88e5c1bd0398c044b6cde7", "1e3760e59d65fc816ed93c89783ebad4a201d928367447830b224c7eaf96c96d"), MerkleBlock::reversed(905104, "000001d3051103ca85a862602b8942ed776ff329d4160085576ee297f2d0c45c", "b045b38c1cdbdc29eb5446fc2e658558384bc09f2b933ac1c80ff67a1e8ef879"), MerkleBlock::reversed(905112, "0000008bd6911e1799baa5fd230a8c46100a3ae7b50faf65b81fa6631d42865b", "4109f99fcdaf8c85ef795c833f200b04926a6cd81c3d17e5525c987381a7c317"), @@ -1927,6 +2081,13 @@ pub fn init_testnet_store() -> Vec { MerkleBlock::reversed(905152, "0000008a6c0aed405dcbd446f84386f55438e6bf59b06412c515ddf545dc6d50", "d1edc1c1b4d4193b98fcd855301918a1057f22d953605744423e6f40138c5929"), MerkleBlock::reversed(905160, "000001bf9b9ab7e3db3421be6f03dc2248e87d8e16a103e3d9d7ffdb6440fb37", "8f89375e02ecad15b925d454d99bb382dd62384520666b8f085c315d746be1f3"), MerkleBlock::reversed(905176, "00000034c5769fc33540641d2a9668b80a8ead30e3be5def7effbb9e37269d7f", "8d6846db8b6a1bcb305b49d42c01970ded81b4e7f15e1be645be0e2ba376bedf"), + MerkleBlock::reversed(905177, "00000e83789d7dfe0dce457f6c235d1311c30deef02b217c082855b805ea0bf5", "7f966107319eff7bef6d90010474d85c57df1b3e4e5d6e72050675a784d94e60"), + MerkleBlock::reversed(905178, "00000390a0e1df5658de257b4a510d1d022e81db8b810261640c94137dfcc499", "0cfb18fd6e87ece3df21c3fc80bcc3690db5f8e710bcab7fae0be1ee01f3c6c0"), + MerkleBlock::reversed(905179, "0000008eaf038b62a9f6fb69e699d8ffedbe58ab15e9c7156b00870bb8083530", "ac245fb2bc5514922726b90f44336e44d7a5aadcb96339edad14666ec8e28efc"), + MerkleBlock::reversed(905180, "000002dddaf4484d1d2cc21b01327e50518b466f4e0d82a2d0b2bdcc88b98bfe", "83ca8960825287e11815ab5ef479edc223247e3d5516170fad67ba86328563e8"), + MerkleBlock::reversed(905181, "00000176a4d99ce1e2efbd0908d083f81fade753059bfebbd2d14926b7f6398e", "c2bec21a8bf1118a36e8f4642e5718f0558111c68ff5a41aa4952aaf3268b60f"), + MerkleBlock::reversed(905182, "000002b92ed2840127c5b3725d233da09081b67456ee9d0a2b05cd0bb9141df0", "cfac7347bbf81aecfbc18793ee87f9182bc07d2784d4790e5449cefa5310db31"), + MerkleBlock::reversed(905183, "0000026ea777e8b80a99c219e9b82f1af3d8917f3c4cdebce4d3cdeb3a58d13c", "46535cfb7c6bb9465447335102287303a166df511daec3ea5990e4685a133382"), MerkleBlock::reversed(905184, "000000903fdc19a23c0ba3ed27fcf43a8d3fd631c041a674e5c456ae5d7e01b8", "33ecfb5b3ff9ba97e4e0ac7a03980f85267e135590a9f62139344f8ed72e47d9"), MerkleBlock::reversed(905185, "0000028959c505be428907fa7f837cd1aa3b3395801e0fcc36ed5c78f5d4f31a", "b8df77e9641d22b80fdccb69424c081a2bb1ab6891a288fcff96dccb3c6ad4de"), MerkleBlock::reversed(905186, "000001dbd491e84904761a7e873d557c502295a1e46106d07e620ea27d16f8db", "d98c26129f756057d5043677ee96d0d5ae4dfd42511c02ee51bd65fc90e20699"), @@ -1982,7 +2143,12 @@ pub fn init_testnet_store() -> Vec { MerkleBlock::reversed(905448, "00000123ea34122051124636af69f82f9135688f1753fea87312dffa30178c9c", "b618b4b73c693a30c2e6616a2c3a033c04f021dd80bf641fb837a7c28d97cf82"), MerkleBlock::reversed(905464, "0000010e98f8b301d59e62602d35cfbb7d3c26ff1ae97f2efbc9166b0dfa23de", "bbd92d8a015c103455d5ace07c7f8b21363e9771a6bed7451d11dde7565dc6a1"), MerkleBlock::reversed(905465, "000000d3d1de070104b35035b985dead5ae3d519ce99dc03444857e8a9ec9cbf", "3689511d4b2c387cb0913cedd52e4a6b34a02711b6155c516466545a252fb564"), + MerkleBlock::reversed(905466, "000000ae01e94817794b9dce11bca90cf87424ba6fa7c7eeaec2fda0b4e26ea4", "81422edd7c7f729cf3013d6719506b94445fa203004b54717d861d1abbfc0d3f"), + MerkleBlock::reversed(905467, "0000013eb45c93d424a2893b1ea2419adbba3b69ecfb187d8b08927b1ed6911a", "1ab2d33ae17932b44eff348ca6a0e2f2405422b60d639e26438e4df9b95002cf"), MerkleBlock::reversed(905468, "000001087f48b4f8c5bf75d9a79afb53447944367cbd8fe979a5ab9df1ff842d", "af1d7d0350854795a721aa0b618a54ac1dad963f4b709a1c16dc92bb6d042bc6"), + MerkleBlock::reversed(905469, "000000ef56b5f0c0fec77d36cc5bd87c9a1c9af75e2dc29b018786cc20164d96", "ae6b0cda59639b0a1fa14332d13e3036a0cc21f7515360e1e06c9f2ff785a57e"), + MerkleBlock::reversed(905470, "000000645db751834eba0e7111f01fed70fca211939fe2eacf9b9690b6f04828", "e1f9c5d398330b48043d65c87723e17ad76d1b557c9b7ffac20050b63d11d69d"), + MerkleBlock::reversed(905471, "00000064d94fd72e395a14df336f3fd04eb5b96a066936fd38daa50676bb73e3", "9c1a03fd9b318d30bd912882bfddae3a6650ef888a46a4dcbe07da44e32c15a9"), MerkleBlock::reversed(905472, "00000056f15d364bf3186c00bf9df713d9a144f715737f0ff8161580c4cff8ff", "d72c8390b35e61d793b41906ce2b7f9a7cac3f07a893a1cb331ce49b5ac5c69a"), MerkleBlock::reversed(905473, "000001b487767e8a31b9e33b21fa6bc75b43d103fa66ab53234b2b6c3945ce63", "61d6d394bc4b652d2568a7b418426bb7a69f2838ce9a5643322c93f491f596de"), MerkleBlock::reversed(905474, "00000154b7295b10ec62712354dc0ab11cff14c8f73348a31036a71160a5f1dd", "7bf0c0582e1f075606608eb6e2b8d4eb0676c84f34d669b31443415fa792b28e"), @@ -2380,5 +2546,16 @@ pub fn init_testnet_store() -> Vec { MerkleBlock::reversed(908399, "000000851db71dc993e40de31e21d4175cf0419986f5e1fb3784745579ba698b", "86ed80fb550f7237524b549b9c8212867c6cbebc49bd2fa0410d4f5d965b4e70"), MerkleBlock::reversed(908400, "00000000d90be6f2dbcbbd9c6fb6060f2ac7f55ad77b2746811149b6a25a8df0", "dbb39caba54df6ddfbd069b1919fc306befbf1c7686c997d2da6aab0b76d1c6d"), - ] + MerkleBlock::reversed(1156656, "000000fb1d38dafcac5fa4b41c2b7218320f2f1c4caeaac6bff4b7818d7dc829", "c8ba8be34cac5ebe81a52d1a49d6fb7eccc05e82ad98a00b38b8780a8004c804"), + MerkleBlock::reversed(1156680, "0000002cc4d33ab924b4a75cdc2a3da8542978dcc40bd70fb6c7cb86f3547d8f", "eed36d8c23a439fbd0f159968f4ac332d44c81395feb0d3d1a2387c79a575729"), + MerkleBlock::reversed(1156704, "000000ba55c204cab0f30ad4744e0dea6eb12cd59283f50f8d1acfcf9cf40dee", "286a1bb206a728a142f29e139981c9ab72a3f370f08d1823ab606060b354129a"), + MerkleBlock::reversed(1157239, "000000a59ce25bbc90de4ccedfa36d1dc0c15c60574f6608585ea829f807df5c", "cd98549ee669d58fad415e7b67ff6ffa4c466cc1eff0f5799bb87dbf2cded177"), + MerkleBlock::reversed(1193464, "0000009996a85d49203289a1689e7ecf0ccbb381c5a0c42e949ff48f64b60a05", "16aea7d5068e0e07fee4f70da46df9adc98cc7d8104da89bee3abbe43c9d2c69"), + MerkleBlock::reversed(1193752, "0000009f7cfe93101deda6d6a24980db0b924f248fae23e43a22217c0abafc8d", "13b70d89dc4c9dc98e19a278105f316faf10b8d59736edd817d169e63d7eba69"), + MerkleBlock::reversed(1194040, "0000006b6a037e89b3a0e4e5282ac5543765bb94bce683f367ec205e74088fc0", "6d637c0197236e7c61131f6d469c358ef12adadab9464d363b3b8e2bbe17815f"), + MerkleBlock::reversed(1194328, "000000cf73ea782efca5c7358c825a6dee556152e79aacbc5226c0230e4eb5d3", "e361bcaa3b779f10df2137132f950ae9c83d16f84373609f97f1a86504ef91f2"), + MerkleBlock::reversed(1194616, "000001cc0930337eea1424256ee4d5639efac37cc892038fff4d2d65be154587", "aefa3ed6e394c35bec0ecfc1840e143755d783f988e0c58a9220740ff5850047"), + MerkleBlock::reversed(1194627, "0000012180e5d7a19aea520aa328c06c636b42670854fa5c0400a03809441c24", "d46eebb19acdd1e2e47cfb1b332f1fe2b984e556f2862cb45b46e59a2c2c3e10"), + MerkleBlock::reversed(1194629, "000002d4c4b2baafc6033fa27048529df9891424b199e9c388e327d5edb49e46", "fb0574e5cac2c39393b60c0403aed5d746da5aa251ba55907f01f55c4bb41802"), + ] } diff --git a/dash-spv-masternode-processor/src/blockdata/mod.rs b/dash-spv-masternode-processor/src/blockdata/mod.rs deleted file mode 100644 index 8189a4eb..00000000 --- a/dash-spv-masternode-processor/src/blockdata/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod opcodes; diff --git a/dash-spv-masternode-processor/src/blockdata/opcodes.rs b/dash-spv-masternode-processor/src/blockdata/opcodes.rs deleted file mode 100644 index a987ff5e..00000000 --- a/dash-spv-masternode-processor/src/blockdata/opcodes.rs +++ /dev/null @@ -1,1169 +0,0 @@ -// Rust Bitcoin Library -// Written in 2014 by -// Andrew Poelstra -// -// To the extent possible under law, the author(s) have dedicated all -// copyright and related and neighboring rights to this software to -// the public domain worldwide. This software is distributed without -// any warranty. -// -// You should have received a copy of the CC0 Public Domain Dedication -// along with this software. -// If not, see . -// - -//! Opcodes -//! -//! Bitcoin's script uses a stack-based assembly language. This module defines -//! all of the opcodes -//! - -#![allow(non_camel_case_types)] - -#[cfg(feature = "serde")] use serde; - -use core::{fmt, convert::From}; - -// Note: I am deliberately not implementing PartialOrd or Ord on the -// opcode enum. If you want to check ranges of opcodes, etc., -// write an #[inline] helper function which casts to u8s. - -/// A script Opcode -#[derive(Copy, Clone, PartialEq, Eq)] -pub struct All { - code: u8, -} - -pub mod all { - //! Constants associated with All type - use super::All; - - /// Push an empty array onto the stack - pub const OP_PUSHBYTES_0: All = All {code: 0x00}; - /// Push the next byte as an array onto the stack - pub const OP_PUSHBYTES_1: All = All {code: 0x01}; - /// Push the next 2 bytes as an array onto the stack - pub const OP_PUSHBYTES_2: All = All {code: 0x02}; - /// Push the next 2 bytes as an array onto the stack - pub const OP_PUSHBYTES_3: All = All {code: 0x03}; - /// Push the next 4 bytes as an array onto the stack - pub const OP_PUSHBYTES_4: All = All {code: 0x04}; - /// Push the next 5 bytes as an array onto the stack - pub const OP_PUSHBYTES_5: All = All {code: 0x05}; - /// Push the next 6 bytes as an array onto the stack - pub const OP_PUSHBYTES_6: All = All {code: 0x06}; - /// Push the next 7 bytes as an array onto the stack - pub const OP_PUSHBYTES_7: All = All {code: 0x07}; - /// Push the next 8 bytes as an array onto the stack - pub const OP_PUSHBYTES_8: All = All {code: 0x08}; - /// Push the next 9 bytes as an array onto the stack - pub const OP_PUSHBYTES_9: All = All {code: 0x09}; - /// Push the next 10 bytes as an array onto the stack - pub const OP_PUSHBYTES_10: All = All {code: 0x0a}; - /// Push the next 11 bytes as an array onto the stack - pub const OP_PUSHBYTES_11: All = All {code: 0x0b}; - /// Push the next 12 bytes as an array onto the stack - pub const OP_PUSHBYTES_12: All = All {code: 0x0c}; - /// Push the next 13 bytes as an array onto the stack - pub const OP_PUSHBYTES_13: All = All {code: 0x0d}; - /// Push the next 14 bytes as an array onto the stack - pub const OP_PUSHBYTES_14: All = All {code: 0x0e}; - /// Push the next 15 bytes as an array onto the stack - pub const OP_PUSHBYTES_15: All = All {code: 0x0f}; - /// Push the next 16 bytes as an array onto the stack - pub const OP_PUSHBYTES_16: All = All {code: 0x10}; - /// Push the next 17 bytes as an array onto the stack - pub const OP_PUSHBYTES_17: All = All {code: 0x11}; - /// Push the next 18 bytes as an array onto the stack - pub const OP_PUSHBYTES_18: All = All {code: 0x12}; - /// Push the next 19 bytes as an array onto the stack - pub const OP_PUSHBYTES_19: All = All {code: 0x13}; - /// Push the next 20 bytes as an array onto the stack - pub const OP_PUSHBYTES_20: All = All {code: 0x14}; - /// Push the next 21 bytes as an array onto the stack - pub const OP_PUSHBYTES_21: All = All {code: 0x15}; - /// Push the next 22 bytes as an array onto the stack - pub const OP_PUSHBYTES_22: All = All {code: 0x16}; - /// Push the next 23 bytes as an array onto the stack - pub const OP_PUSHBYTES_23: All = All {code: 0x17}; - /// Push the next 24 bytes as an array onto the stack - pub const OP_PUSHBYTES_24: All = All {code: 0x18}; - /// Push the next 25 bytes as an array onto the stack - pub const OP_PUSHBYTES_25: All = All {code: 0x19}; - /// Push the next 26 bytes as an array onto the stack - pub const OP_PUSHBYTES_26: All = All {code: 0x1a}; - /// Push the next 27 bytes as an array onto the stack - pub const OP_PUSHBYTES_27: All = All {code: 0x1b}; - /// Push the next 28 bytes as an array onto the stack - pub const OP_PUSHBYTES_28: All = All {code: 0x1c}; - /// Push the next 29 bytes as an array onto the stack - pub const OP_PUSHBYTES_29: All = All {code: 0x1d}; - /// Push the next 30 bytes as an array onto the stack - pub const OP_PUSHBYTES_30: All = All {code: 0x1e}; - /// Push the next 31 bytes as an array onto the stack - pub const OP_PUSHBYTES_31: All = All {code: 0x1f}; - /// Push the next 32 bytes as an array onto the stack - pub const OP_PUSHBYTES_32: All = All {code: 0x20}; - /// Push the next 33 bytes as an array onto the stack - pub const OP_PUSHBYTES_33: All = All {code: 0x21}; - /// Push the next 34 bytes as an array onto the stack - pub const OP_PUSHBYTES_34: All = All {code: 0x22}; - /// Push the next 35 bytes as an array onto the stack - pub const OP_PUSHBYTES_35: All = All {code: 0x23}; - /// Push the next 36 bytes as an array onto the stack - pub const OP_PUSHBYTES_36: All = All {code: 0x24}; - /// Push the next 37 bytes as an array onto the stack - pub const OP_PUSHBYTES_37: All = All {code: 0x25}; - /// Push the next 38 bytes as an array onto the stack - pub const OP_PUSHBYTES_38: All = All {code: 0x26}; - /// Push the next 39 bytes as an array onto the stack - pub const OP_PUSHBYTES_39: All = All {code: 0x27}; - /// Push the next 40 bytes as an array onto the stack - pub const OP_PUSHBYTES_40: All = All {code: 0x28}; - /// Push the next 41 bytes as an array onto the stack - pub const OP_PUSHBYTES_41: All = All {code: 0x29}; - /// Push the next 42 bytes as an array onto the stack - pub const OP_PUSHBYTES_42: All = All {code: 0x2a}; - /// Push the next 43 bytes as an array onto the stack - pub const OP_PUSHBYTES_43: All = All {code: 0x2b}; - /// Push the next 44 bytes as an array onto the stack - pub const OP_PUSHBYTES_44: All = All {code: 0x2c}; - /// Push the next 45 bytes as an array onto the stack - pub const OP_PUSHBYTES_45: All = All {code: 0x2d}; - /// Push the next 46 bytes as an array onto the stack - pub const OP_PUSHBYTES_46: All = All {code: 0x2e}; - /// Push the next 47 bytes as an array onto the stack - pub const OP_PUSHBYTES_47: All = All {code: 0x2f}; - /// Push the next 48 bytes as an array onto the stack - pub const OP_PUSHBYTES_48: All = All {code: 0x30}; - /// Push the next 49 bytes as an array onto the stack - pub const OP_PUSHBYTES_49: All = All {code: 0x31}; - /// Push the next 50 bytes as an array onto the stack - pub const OP_PUSHBYTES_50: All = All {code: 0x32}; - /// Push the next 51 bytes as an array onto the stack - pub const OP_PUSHBYTES_51: All = All {code: 0x33}; - /// Push the next 52 bytes as an array onto the stack - pub const OP_PUSHBYTES_52: All = All {code: 0x34}; - /// Push the next 53 bytes as an array onto the stack - pub const OP_PUSHBYTES_53: All = All {code: 0x35}; - /// Push the next 54 bytes as an array onto the stack - pub const OP_PUSHBYTES_54: All = All {code: 0x36}; - /// Push the next 55 bytes as an array onto the stack - pub const OP_PUSHBYTES_55: All = All {code: 0x37}; - /// Push the next 56 bytes as an array onto the stack - pub const OP_PUSHBYTES_56: All = All {code: 0x38}; - /// Push the next 57 bytes as an array onto the stack - pub const OP_PUSHBYTES_57: All = All {code: 0x39}; - /// Push the next 58 bytes as an array onto the stack - pub const OP_PUSHBYTES_58: All = All {code: 0x3a}; - /// Push the next 59 bytes as an array onto the stack - pub const OP_PUSHBYTES_59: All = All {code: 0x3b}; - /// Push the next 60 bytes as an array onto the stack - pub const OP_PUSHBYTES_60: All = All {code: 0x3c}; - /// Push the next 61 bytes as an array onto the stack - pub const OP_PUSHBYTES_61: All = All {code: 0x3d}; - /// Push the next 62 bytes as an array onto the stack - pub const OP_PUSHBYTES_62: All = All {code: 0x3e}; - /// Push the next 63 bytes as an array onto the stack - pub const OP_PUSHBYTES_63: All = All {code: 0x3f}; - /// Push the next 64 bytes as an array onto the stack - pub const OP_PUSHBYTES_64: All = All {code: 0x40}; - /// Push the next 65 bytes as an array onto the stack - pub const OP_PUSHBYTES_65: All = All {code: 0x41}; - /// Push the next 66 bytes as an array onto the stack - pub const OP_PUSHBYTES_66: All = All {code: 0x42}; - /// Push the next 67 bytes as an array onto the stack - pub const OP_PUSHBYTES_67: All = All {code: 0x43}; - /// Push the next 68 bytes as an array onto the stack - pub const OP_PUSHBYTES_68: All = All {code: 0x44}; - /// Push the next 69 bytes as an array onto the stack - pub const OP_PUSHBYTES_69: All = All {code: 0x45}; - /// Push the next 70 bytes as an array onto the stack - pub const OP_PUSHBYTES_70: All = All {code: 0x46}; - /// Push the next 71 bytes as an array onto the stack - pub const OP_PUSHBYTES_71: All = All {code: 0x47}; - /// Push the next 72 bytes as an array onto the stack - pub const OP_PUSHBYTES_72: All = All {code: 0x48}; - /// Push the next 73 bytes as an array onto the stack - pub const OP_PUSHBYTES_73: All = All {code: 0x49}; - /// Push the next 74 bytes as an array onto the stack - pub const OP_PUSHBYTES_74: All = All {code: 0x4a}; - /// Push the next 75 bytes as an array onto the stack - pub const OP_PUSHBYTES_75: All = All {code: 0x4b}; - /// Read the next byte as N; push the next N bytes as an array onto the stack - pub const OP_PUSHDATA1: All = All {code: 0x4c}; - /// Read the next 2 bytes as N; push the next N bytes as an array onto the stack - pub const OP_PUSHDATA2: All = All {code: 0x4d}; - /// Read the next 4 bytes as N; push the next N bytes as an array onto the stack - pub const OP_PUSHDATA4: All = All {code: 0x4e}; - /// Push the array `0x81` onto the stack - pub const OP_PUSHNUM_NEG1: All = All {code: 0x4f}; - /// Synonym for OP_RETURN - pub const OP_RESERVED: All = All {code: 0x50}; - /// Push the array `0x01` onto the stack - pub const OP_PUSHNUM_1: All = All {code: 0x51}; - /// Push the array `0x02` onto the stack - pub const OP_PUSHNUM_2: All = All {code: 0x52}; - /// Push the array `0x03` onto the stack - pub const OP_PUSHNUM_3: All = All {code: 0x53}; - /// Push the array `0x04` onto the stack - pub const OP_PUSHNUM_4: All = All {code: 0x54}; - /// Push the array `0x05` onto the stack - pub const OP_PUSHNUM_5: All = All {code: 0x55}; - /// Push the array `0x06` onto the stack - pub const OP_PUSHNUM_6: All = All {code: 0x56}; - /// Push the array `0x07` onto the stack - pub const OP_PUSHNUM_7: All = All {code: 0x57}; - /// Push the array `0x08` onto the stack - pub const OP_PUSHNUM_8: All = All {code: 0x58}; - /// Push the array `0x09` onto the stack - pub const OP_PUSHNUM_9: All = All {code: 0x59}; - /// Push the array `0x0a` onto the stack - pub const OP_PUSHNUM_10: All = All {code: 0x5a}; - /// Push the array `0x0b` onto the stack - pub const OP_PUSHNUM_11: All = All {code: 0x5b}; - /// Push the array `0x0c` onto the stack - pub const OP_PUSHNUM_12: All = All {code: 0x5c}; - /// Push the array `0x0d` onto the stack - pub const OP_PUSHNUM_13: All = All {code: 0x5d}; - /// Push the array `0x0e` onto the stack - pub const OP_PUSHNUM_14: All = All {code: 0x5e}; - /// Push the array `0x0f` onto the stack - pub const OP_PUSHNUM_15: All = All {code: 0x5f}; - /// Push the array `0x10` onto the stack - pub const OP_PUSHNUM_16: All = All {code: 0x60}; - /// Does nothing - pub const OP_NOP: All = All {code: 0x61}; - /// Synonym for OP_RETURN - pub const OP_VER: All = All {code: 0x62}; - /// Pop and execute the next statements if a nonzero element was popped - pub const OP_IF: All = All {code: 0x63}; - /// Pop and execute the next statements if a zero element was popped - pub const OP_NOTIF: All = All {code: 0x64}; - /// Fail the script unconditionally, does not even need to be executed - pub const OP_VERIF: All = All {code: 0x65}; - /// Fail the script unconditionally, does not even need to be executed - pub const OP_VERNOTIF: All = All {code: 0x66}; - /// Execute statements if those after the previous OP_IF were not, and vice-versa. - /// If there is no previous OP_IF, this acts as a RETURN. - pub const OP_ELSE: All = All {code: 0x67}; - /// Pop and execute the next statements if a zero element was popped - pub const OP_ENDIF: All = All {code: 0x68}; - /// If the top value is zero or the stack is empty, fail; otherwise, pop the stack - pub const OP_VERIFY: All = All {code: 0x69}; - /// Fail the script immediately. (Must be executed.) - pub const OP_RETURN: All = All {code: 0x6a}; - /// Pop one element from the main stack onto the alt stack - pub const OP_TOALTSTACK: All = All {code: 0x6b}; - /// Pop one element from the alt stack onto the main stack - pub const OP_FROMALTSTACK: All = All {code: 0x6c}; - /// Drops the top two stack items - pub const OP_2DROP: All = All {code: 0x6d}; - /// Duplicates the top two stack items as AB -> ABAB - pub const OP_2DUP: All = All {code: 0x6e}; - /// Duplicates the two three stack items as ABC -> ABCABC - pub const OP_3DUP: All = All {code: 0x6f}; - /// Copies the two stack items of items two spaces back to - /// the front, as xxAB -> ABxxAB - pub const OP_2OVER: All = All {code: 0x70}; - /// Moves the two stack items four spaces back to the front, - /// as xxxxAB -> ABxxxx - pub const OP_2ROT: All = All {code: 0x71}; - /// Swaps the top two pairs, as ABCD -> CDAB - pub const OP_2SWAP: All = All {code: 0x72}; - /// Duplicate the top stack element unless it is zero - pub const OP_IFDUP: All = All {code: 0x73}; - /// Push the current number of stack items onto the stack - pub const OP_DEPTH: All = All {code: 0x74}; - /// Drops the top stack item - pub const OP_DROP: All = All {code: 0x75}; - /// Duplicates the top stack item - pub const OP_DUP: All = All {code: 0x76}; - /// Drops the second-to-top stack item - pub const OP_NIP: All = All {code: 0x77}; - /// Copies the second-to-top stack item, as xA -> AxA - pub const OP_OVER: All = All {code: 0x78}; - /// Pop the top stack element as N. Copy the Nth stack element to the top - pub const OP_PICK: All = All {code: 0x79}; - /// Pop the top stack element as N. Move the Nth stack element to the top - pub const OP_ROLL: All = All {code: 0x7a}; - /// Rotate the top three stack items, as [top next1 next2] -> [next2 top next1] - pub const OP_ROT: All = All {code: 0x7b}; - /// Swap the top two stack items - pub const OP_SWAP: All = All {code: 0x7c}; - /// Copy the top stack item to before the second item, as [top next] -> [top next top] - pub const OP_TUCK: All = All {code: 0x7d}; - /// Fail the script unconditionally, does not even need to be executed - pub const OP_CAT: All = All {code: 0x7e}; - /// Fail the script unconditionally, does not even need to be executed - pub const OP_SUBSTR: All = All {code: 0x7f}; - /// Fail the script unconditionally, does not even need to be executed - pub const OP_LEFT: All = All {code: 0x80}; - /// Fail the script unconditionally, does not even need to be executed - pub const OP_RIGHT: All = All {code: 0x81}; - /// Pushes the length of the top stack item onto the stack - pub const OP_SIZE: All = All {code: 0x82}; - /// Fail the script unconditionally, does not even need to be executed - pub const OP_INVERT: All = All {code: 0x83}; - /// Fail the script unconditionally, does not even need to be executed - pub const OP_AND: All = All {code: 0x84}; - /// Fail the script unconditionally, does not even need to be executed - pub const OP_OR: All = All {code: 0x85}; - /// Fail the script unconditionally, does not even need to be executed - pub const OP_XOR: All = All {code: 0x86}; - /// Pushes 1 if the inputs are exactly equal, 0 otherwise - pub const OP_EQUAL: All = All {code: 0x87}; - /// Returns success if the inputs are exactly equal, failure otherwise - pub const OP_EQUALVERIFY: All = All {code: 0x88}; - /// Synonym for OP_RETURN - pub const OP_RESERVED1: All = All {code: 0x89}; - /// Synonym for OP_RETURN - pub const OP_RESERVED2: All = All {code: 0x8a}; - /// Increment the top stack element in place - pub const OP_1ADD: All = All {code: 0x8b}; - /// Decrement the top stack element in place - pub const OP_1SUB: All = All {code: 0x8c}; - /// Fail the script unconditionally, does not even need to be executed - pub const OP_2MUL: All = All {code: 0x8d}; - /// Fail the script unconditionally, does not even need to be executed - pub const OP_2DIV: All = All {code: 0x8e}; - /// Multiply the top stack item by -1 in place - pub const OP_NEGATE: All = All {code: 0x8f}; - /// Absolute value the top stack item in place - pub const OP_ABS: All = All {code: 0x90}; - /// Map 0 to 1 and everything else to 0, in place - pub const OP_NOT: All = All {code: 0x91}; - /// Map 0 to 0 and everything else to 1, in place - pub const OP_0NOTEQUAL: All = All {code: 0x92}; - /// Pop two stack items and push their sum - pub const OP_ADD: All = All {code: 0x93}; - /// Pop two stack items and push the second minus the top - pub const OP_SUB: All = All {code: 0x94}; - /// Fail the script unconditionally, does not even need to be executed - pub const OP_MUL: All = All {code: 0x95}; - /// Fail the script unconditionally, does not even need to be executed - pub const OP_DIV: All = All {code: 0x96}; - /// Fail the script unconditionally, does not even need to be executed - pub const OP_MOD: All = All {code: 0x97}; - /// Fail the script unconditionally, does not even need to be executed - pub const OP_LSHIFT: All = All {code: 0x98}; - /// Fail the script unconditionally, does not even need to be executed - pub const OP_RSHIFT: All = All {code: 0x99}; - /// Pop the top two stack items and push 1 if both are nonzero, else push 0 - pub const OP_BOOLAND: All = All {code: 0x9a}; - /// Pop the top two stack items and push 1 if either is nonzero, else push 0 - pub const OP_BOOLOR: All = All {code: 0x9b}; - /// Pop the top two stack items and push 1 if both are numerically equal, else push 0 - pub const OP_NUMEQUAL: All = All {code: 0x9c}; - /// Pop the top two stack items and return success if both are numerically equal, else return failure - pub const OP_NUMEQUALVERIFY: All = All {code: 0x9d}; - /// Pop the top two stack items and push 0 if both are numerically equal, else push 1 - pub const OP_NUMNOTEQUAL: All = All {code: 0x9e}; - /// Pop the top two items; push 1 if the second is less than the top, 0 otherwise - pub const OP_LESSTHAN : All = All {code: 0x9f}; - /// Pop the top two items; push 1 if the second is greater than the top, 0 otherwise - pub const OP_GREATERTHAN : All = All {code: 0xa0}; - /// Pop the top two items; push 1 if the second is <= the top, 0 otherwise - pub const OP_LESSTHANOREQUAL : All = All {code: 0xa1}; - /// Pop the top two items; push 1 if the second is >= the top, 0 otherwise - pub const OP_GREATERTHANOREQUAL : All = All {code: 0xa2}; - /// Pop the top two items; push the smaller - pub const OP_MIN: All = All {code: 0xa3}; - /// Pop the top two items; push the larger - pub const OP_MAX: All = All {code: 0xa4}; - /// Pop the top three items; if the top is >= the second and < the third, push 1, otherwise push 0 - pub const OP_WITHIN: All = All {code: 0xa5}; - /// Pop the top stack item and push its RIPEMD160 hash - pub const OP_RIPEMD160: All = All {code: 0xa6}; - /// Pop the top stack item and push its SHA1 hash - pub const OP_SHA1: All = All {code: 0xa7}; - /// Pop the top stack item and push its SHA256 hash - pub const OP_SHA256: All = All {code: 0xa8}; - /// Pop the top stack item and push its RIPEMD(SHA256) hash - pub const OP_HASH160: All = All {code: 0xa9}; - /// Pop the top stack item and push its SHA256(SHA256) hash - pub const OP_HASH256: All = All {code: 0xaa}; - /// Ignore this and everything preceding when deciding what to sign when signature-checking - pub const OP_CODESEPARATOR: All = All {code: 0xab}; - /// pushing 1/0 for success/failure - pub const OP_CHECKSIG: All = All {code: 0xac}; - /// returning success/failure - pub const OP_CHECKSIGVERIFY: All = All {code: 0xad}; - /// Pop N, N pubkeys, M, M signatures, a dummy (due to bug in reference code), and verify that all M signatures are valid. - /// Push 1 for "all valid", 0 otherwise - pub const OP_CHECKMULTISIG: All = All {code: 0xae}; - /// Like the above but return success/failure - pub const OP_CHECKMULTISIGVERIFY: All = All {code: 0xaf}; - /// Does nothing - pub const OP_NOP1: All = All {code: 0xb0}; - /// - pub const OP_CLTV: All = All {code: 0xb1}; - /// - pub const OP_CSV: All = All {code: 0xb2}; - /// Does nothing - pub const OP_NOP4: All = All {code: 0xb3}; - /// Does nothing - pub const OP_NOP5: All = All {code: 0xb4}; - /// Does nothing - pub const OP_NOP6: All = All {code: 0xb5}; - /// Does nothing - pub const OP_NOP7: All = All {code: 0xb6}; - /// Does nothing - pub const OP_NOP8: All = All {code: 0xb7}; - /// Does nothing - pub const OP_NOP9: All = All {code: 0xb8}; - /// Does nothing - pub const OP_NOP10: All = All {code: 0xb9}; - // Every other opcode acts as OP_RETURN - /// OP_CHECKSIGADD post tapscript - pub const OP_CHECKSIGADD: All = All {code: 0xba}; - /// Synonym for OP_RETURN - pub const OP_RETURN_187: All = All {code: 0xbb}; - /// Synonym for OP_RETURN - pub const OP_RETURN_188: All = All {code: 0xbc}; - /// Synonym for OP_RETURN - pub const OP_RETURN_189: All = All {code: 0xbd}; - /// Synonym for OP_RETURN - pub const OP_RETURN_190: All = All {code: 0xbe}; - /// Synonym for OP_RETURN - pub const OP_RETURN_191: All = All {code: 0xbf}; - /// Synonym for OP_RETURN - pub const OP_RETURN_192: All = All {code: 0xc0}; - /// Synonym for OP_RETURN - pub const OP_RETURN_193: All = All {code: 0xc1}; - /// Synonym for OP_RETURN - pub const OP_RETURN_194: All = All {code: 0xc2}; - /// Synonym for OP_RETURN - pub const OP_RETURN_195: All = All {code: 0xc3}; - /// Synonym for OP_RETURN - pub const OP_RETURN_196: All = All {code: 0xc4}; - /// Synonym for OP_RETURN - pub const OP_RETURN_197: All = All {code: 0xc5}; - /// Synonym for OP_RETURN - pub const OP_RETURN_198: All = All {code: 0xc6}; - /// Synonym for OP_RETURN - pub const OP_RETURN_199: All = All {code: 0xc7}; - /// Synonym for OP_RETURN - pub const OP_RETURN_200: All = All {code: 0xc8}; - /// Synonym for OP_RETURN - pub const OP_RETURN_201: All = All {code: 0xc9}; - /// Synonym for OP_RETURN - pub const OP_RETURN_202: All = All {code: 0xca}; - /// Synonym for OP_RETURN - pub const OP_RETURN_203: All = All {code: 0xcb}; - /// Synonym for OP_RETURN - pub const OP_RETURN_204: All = All {code: 0xcc}; - /// Synonym for OP_RETURN - pub const OP_RETURN_205: All = All {code: 0xcd}; - /// Synonym for OP_RETURN - pub const OP_RETURN_206: All = All {code: 0xce}; - /// Synonym for OP_RETURN - pub const OP_RETURN_207: All = All {code: 0xcf}; - /// Synonym for OP_RETURN - pub const OP_RETURN_208: All = All {code: 0xd0}; - /// Synonym for OP_RETURN - pub const OP_RETURN_209: All = All {code: 0xd1}; - /// Synonym for OP_RETURN - pub const OP_RETURN_210: All = All {code: 0xd2}; - /// Synonym for OP_RETURN - pub const OP_RETURN_211: All = All {code: 0xd3}; - /// Synonym for OP_RETURN - pub const OP_RETURN_212: All = All {code: 0xd4}; - /// Synonym for OP_RETURN - pub const OP_RETURN_213: All = All {code: 0xd5}; - /// Synonym for OP_RETURN - pub const OP_RETURN_214: All = All {code: 0xd6}; - /// Synonym for OP_RETURN - pub const OP_RETURN_215: All = All {code: 0xd7}; - /// Synonym for OP_RETURN - pub const OP_RETURN_216: All = All {code: 0xd8}; - /// Synonym for OP_RETURN - pub const OP_RETURN_217: All = All {code: 0xd9}; - /// Synonym for OP_RETURN - pub const OP_RETURN_218: All = All {code: 0xda}; - /// Synonym for OP_RETURN - pub const OP_RETURN_219: All = All {code: 0xdb}; - /// Synonym for OP_RETURN - pub const OP_RETURN_220: All = All {code: 0xdc}; - /// Synonym for OP_RETURN - pub const OP_RETURN_221: All = All {code: 0xdd}; - /// Synonym for OP_RETURN - pub const OP_RETURN_222: All = All {code: 0xde}; - /// Synonym for OP_RETURN - pub const OP_RETURN_223: All = All {code: 0xdf}; - /// Synonym for OP_RETURN - pub const OP_RETURN_224: All = All {code: 0xe0}; - /// Synonym for OP_RETURN - pub const OP_RETURN_225: All = All {code: 0xe1}; - /// Synonym for OP_RETURN - pub const OP_RETURN_226: All = All {code: 0xe2}; - /// Synonym for OP_RETURN - pub const OP_RETURN_227: All = All {code: 0xe3}; - /// Synonym for OP_RETURN - pub const OP_RETURN_228: All = All {code: 0xe4}; - /// Synonym for OP_RETURN - pub const OP_RETURN_229: All = All {code: 0xe5}; - /// Synonym for OP_RETURN - pub const OP_RETURN_230: All = All {code: 0xe6}; - /// Synonym for OP_RETURN - pub const OP_RETURN_231: All = All {code: 0xe7}; - /// Synonym for OP_RETURN - pub const OP_RETURN_232: All = All {code: 0xe8}; - /// Synonym for OP_RETURN - pub const OP_RETURN_233: All = All {code: 0xe9}; - /// Synonym for OP_RETURN - pub const OP_RETURN_234: All = All {code: 0xea}; - /// Synonym for OP_RETURN - pub const OP_RETURN_235: All = All {code: 0xeb}; - /// Synonym for OP_RETURN - pub const OP_RETURN_236: All = All {code: 0xec}; - /// Synonym for OP_RETURN - pub const OP_RETURN_237: All = All {code: 0xed}; - /// Synonym for OP_RETURN - pub const OP_RETURN_238: All = All {code: 0xee}; - /// Synonym for OP_RETURN - pub const OP_RETURN_239: All = All {code: 0xef}; - /// Synonym for OP_RETURN - pub const OP_RETURN_240: All = All {code: 0xf0}; - /// Synonym for OP_RETURN - pub const OP_RETURN_241: All = All {code: 0xf1}; - /// Synonym for OP_RETURN - pub const OP_RETURN_242: All = All {code: 0xf2}; - /// Synonym for OP_RETURN - pub const OP_RETURN_243: All = All {code: 0xf3}; - /// Synonym for OP_RETURN - pub const OP_RETURN_244: All = All {code: 0xf4}; - /// Synonym for OP_RETURN - pub const OP_RETURN_245: All = All {code: 0xf5}; - /// Synonym for OP_RETURN - pub const OP_RETURN_246: All = All {code: 0xf6}; - /// Synonym for OP_RETURN - pub const OP_RETURN_247: All = All {code: 0xf7}; - /// Synonym for OP_RETURN - pub const OP_RETURN_248: All = All {code: 0xf8}; - /// Synonym for OP_RETURN - pub const OP_RETURN_249: All = All {code: 0xf9}; - /// Synonym for OP_RETURN - pub const OP_RETURN_250: All = All {code: 0xfa}; - /// Synonym for OP_RETURN - pub const OP_RETURN_251: All = All {code: 0xfb}; - /// Synonym for OP_RETURN - pub const OP_RETURN_252: All = All {code: 0xfc}; - /// Synonym for OP_RETURN - pub const OP_RETURN_253: All = All {code: 0xfd}; - /// Synonym for OP_RETURN - pub const OP_RETURN_254: All = All {code: 0xfe}; - /// Synonym for OP_RETURN - pub const OP_INVALIDOPCODE: All = All {code: 0xff}; - - // Dash op codes - // not a bitcoin op code, used to identify shapeshift when placed after OP_RETURN - // pub const OP_SHAPESHIFT: All = OP_CLTV; // 0xb1 - // pub const OP_SHAPESHIFT_SCRIPT: All = OP_NOP4; // 0xb3 -} - -impl fmt::Debug for All { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.write_str("OP_")?; - match *self { - All {code: x} if x <= 75 => write!(f, "PUSHBYTES_{}", self.code), - all::OP_PUSHDATA1 => write!(f, "PUSHDATA1"), - all::OP_PUSHDATA2 => write!(f, "PUSHDATA2"), - all::OP_PUSHDATA4 => write!(f, "PUSHDATA4"), - all::OP_PUSHNUM_NEG1 => write!(f, "PUSHNUM_NEG1"), - all::OP_RESERVED => write!(f, "RESERVED"), - All {code: x} if x >= all::OP_PUSHNUM_1.code && x <= all::OP_PUSHNUM_16.code => write!(f, "PUSHNUM_{}", x - all::OP_PUSHNUM_1.code + 1), - all::OP_NOP => write!(f, "NOP"), - all::OP_VER => write!(f, "VER"), - all::OP_IF => write!(f, "IF"), - all::OP_NOTIF => write!(f, "NOTIF"), - all::OP_VERIF => write!(f, "VERIF"), - all::OP_VERNOTIF => write!(f, "VERNOTIF"), - all::OP_ELSE => write!(f, "ELSE"), - all::OP_ENDIF => write!(f, "ENDIF"), - all::OP_VERIFY => write!(f, "VERIFY"), - all::OP_RETURN => write!(f, "RETURN"), - all::OP_TOALTSTACK => write!(f, "TOALTSTACK"), - all::OP_FROMALTSTACK => write!(f, "FROMALTSTACK"), - all::OP_2DROP => write!(f, "2DROP"), - all::OP_2DUP => write!(f, "2DUP"), - all::OP_3DUP => write!(f, "3DUP"), - all::OP_2OVER => write!(f, "2OVER"), - all::OP_2ROT => write!(f, "2ROT"), - all::OP_2SWAP => write!(f, "2SWAP"), - all::OP_IFDUP => write!(f, "IFDUP"), - all::OP_DEPTH => write!(f, "DEPTH"), - all::OP_DROP => write!(f, "DROP"), - all::OP_DUP => write!(f, "DUP"), - all::OP_NIP => write!(f, "NIP"), - all::OP_OVER => write!(f, "OVER"), - all::OP_PICK => write!(f, "PICK"), - all::OP_ROLL => write!(f, "ROLL"), - all::OP_ROT => write!(f, "ROT"), - all::OP_SWAP => write!(f, "SWAP"), - all::OP_TUCK => write!(f, "TUCK"), - all::OP_CAT => write!(f, "CAT"), - all::OP_SUBSTR => write!(f, "SUBSTR"), - all::OP_LEFT => write!(f, "LEFT"), - all::OP_RIGHT => write!(f, "RIGHT"), - all::OP_SIZE => write!(f, "SIZE"), - all::OP_INVERT => write!(f, "INVERT"), - all::OP_AND => write!(f, "AND"), - all::OP_OR => write!(f, "OR"), - all::OP_XOR => write!(f, "XOR"), - all::OP_EQUAL => write!(f, "EQUAL"), - all::OP_EQUALVERIFY => write!(f, "EQUALVERIFY"), - all::OP_RESERVED1 => write!(f, "RESERVED1"), - all::OP_RESERVED2 => write!(f, "RESERVED2"), - all::OP_1ADD => write!(f, "1ADD"), - all::OP_1SUB => write!(f, "1SUB"), - all::OP_2MUL => write!(f, "2MUL"), - all::OP_2DIV => write!(f, "2DIV"), - all::OP_NEGATE => write!(f, "NEGATE"), - all::OP_ABS => write!(f, "ABS"), - all::OP_NOT => write!(f, "NOT"), - all::OP_0NOTEQUAL => write!(f, "0NOTEQUAL"), - all::OP_ADD => write!(f, "ADD"), - all::OP_SUB => write!(f, "SUB"), - all::OP_MUL => write!(f, "MUL"), - all::OP_DIV => write!(f, "DIV"), - all::OP_MOD => write!(f, "MOD"), - all::OP_LSHIFT => write!(f, "LSHIFT"), - all::OP_RSHIFT => write!(f, "RSHIFT"), - all::OP_BOOLAND => write!(f, "BOOLAND"), - all::OP_BOOLOR => write!(f, "BOOLOR"), - all::OP_NUMEQUAL => write!(f, "NUMEQUAL"), - all::OP_NUMEQUALVERIFY => write!(f, "NUMEQUALVERIFY"), - all::OP_NUMNOTEQUAL => write!(f, "NUMNOTEQUAL"), - all::OP_LESSTHAN => write!(f, "LESSTHAN"), - all::OP_GREATERTHAN => write!(f, "GREATERTHAN"), - all::OP_LESSTHANOREQUAL => write!(f, "LESSTHANOREQUAL"), - all::OP_GREATERTHANOREQUAL => write!(f, "GREATERTHANOREQUAL"), - all::OP_MIN => write!(f, "MIN"), - all::OP_MAX => write!(f, "MAX"), - all::OP_WITHIN => write!(f, "WITHIN"), - all::OP_RIPEMD160 => write!(f, "RIPEMD160"), - all::OP_SHA1 => write!(f, "SHA1"), - all::OP_SHA256 => write!(f, "SHA256"), - all::OP_HASH160 => write!(f, "HASH160"), - all::OP_HASH256 => write!(f, "HASH256"), - all::OP_CODESEPARATOR => write!(f, "CODESEPARATOR"), - all::OP_CHECKSIG => write!(f, "CHECKSIG"), - all::OP_CHECKSIGVERIFY => write!(f, "CHECKSIGVERIFY"), - all::OP_CHECKMULTISIG => write!(f, "CHECKMULTISIG"), - all::OP_CHECKMULTISIGVERIFY => write!(f, "CHECKMULTISIGVERIFY"), - all::OP_CLTV => write!(f, "CLTV"), - all::OP_CSV => write!(f, "CSV"), - All {code: x} if x >= all::OP_NOP1.code && x <= all::OP_NOP10.code => write!(f, "NOP{}", x - all::OP_NOP1.code + 1), - all::OP_INVALIDOPCODE => write!(f, "INVALIDOPCODE"), - all::OP_CHECKSIGADD => write!(f, "CHECKSIGADD"), - All {code: x} => write!(f, "RETURN_{}", x), - } - } -} - - -/// Classification context for the opcode. Some opcodes like `OP_RESERVED` -/// abort the script in [`ClassifyContext::Legacy`] context, but will act as OP_SUCCESS in tapscript -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub enum ClassifyContext { - /// Opcode used in tapscript context - TapScript, - /// Opcode used in legacy context - Legacy, -} - -impl All { - /// Classifies an Opcode into a broad class - #[inline] - pub fn classify(self, ctx: ClassifyContext) -> Class { - use self::all::*; - match (self, ctx) { - // 3 opcodes illegal in all contexts - (OP_VERIF, _) | (OP_VERNOTIF, _) | (OP_INVALIDOPCODE, _) => Class::IllegalOp, - - // 15 opcodes illegal in Legacy context - (OP_CAT, ctx) | (OP_SUBSTR, ctx) - | (OP_LEFT, ctx) | (OP_RIGHT, ctx) - | (OP_INVERT, ctx) - | (OP_AND, ctx) | (OP_OR, ctx) | (OP_XOR, ctx) - | (OP_2MUL, ctx) | (OP_2DIV, ctx) - | (OP_MUL, ctx) | (OP_DIV, ctx) | (OP_MOD, ctx) - | (OP_LSHIFT, ctx) | (OP_RSHIFT, ctx) if ctx == ClassifyContext::Legacy => Class::IllegalOp, - - // 87 opcodes of SuccessOp class only in TapScript context - (op, ClassifyContext::TapScript) - if op.code == 80 || op.code == 98 || - (op.code >= 126 && op.code <= 129) || - (op.code >= 131 && op.code <= 134) || - (op.code >= 137 && op.code <= 138) || - (op.code >= 141 && op.code <= 142) || - (op.code >= 149 && op.code <= 153) || - (op.code >= 187 && op.code <= 254) => Class::SuccessOp, - - // 11 opcodes of NoOp class - (OP_NOP, _) => Class::NoOp, - (op, _) if op.code >= OP_NOP1.code && op.code <= OP_NOP10.code => Class::NoOp, - - // 1 opcode for `OP_RETURN` - (OP_RETURN, _) => Class::ReturnOp, - - // 4 opcodes operating equally to `OP_RETURN` only in Legacy context - (OP_RESERVED, ctx) - | (OP_RESERVED1, ctx) | (OP_RESERVED2, ctx) - | (OP_VER, ctx) if ctx == ClassifyContext::Legacy => Class::ReturnOp, - - // 71 opcodes operating equally to `OP_RETURN` only in Legacy context - (op, ClassifyContext::Legacy) if op.code >= OP_CHECKSIGADD.code => Class::ReturnOp, - - // 2 opcodes operating equally to `OP_RETURN` only in TapScript context - (OP_CHECKMULTISIG, ClassifyContext::TapScript) - | (OP_CHECKMULTISIGVERIFY, ClassifyContext::TapScript) => Class::ReturnOp, - - // 1 opcode of PushNum class - (OP_PUSHNUM_NEG1, _) => Class::PushNum(-1), - - // 16 opcodes of PushNum class - (op, _) if op.code >= OP_PUSHNUM_1.code && op.code <= OP_PUSHNUM_16.code => { - Class::PushNum(1 + self.code as i32 - OP_PUSHNUM_1.code as i32) - }, - - // 76 opcodes of PushBytes class - (op, _) if op.code <= OP_PUSHBYTES_75.code => Class::PushBytes(self.code as u32), - - // opcodes of Ordinary class: 61 for Legacy and 60 for TapScript context - (_, _) => Class::Ordinary(Ordinary::with(self)), - } - } - - /// Encode as a byte - #[inline] - pub fn into_u8(self) -> u8 { - self.code - } -} - -impl From for All { - #[inline] - fn from(b: u8) -> All { - All {code: b} - } -} - - -display_from_debug!(All); - -#[cfg(feature = "serde")] -#[cfg_attr(docsrs, doc(cfg(feature = "serde")))] -impl serde::Serialize for All { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - serializer.serialize_str(&self.to_string()) - } -} - -/// Empty stack is also FALSE -pub static OP_FALSE: All = all::OP_PUSHBYTES_0; -/// Number 1 is also TRUE -pub static OP_TRUE: All = all::OP_PUSHNUM_1; -/// previously called OP_NOP2 -pub static OP_NOP2: All = all::OP_CLTV; -/// previously called OP_NOP3 -pub static OP_NOP3: All = all::OP_CSV; - -/// Broad categories of opcodes with similar behavior -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub enum Class { - /// Pushes the given number onto the stack - PushNum(i32), - /// Pushes the given number of bytes onto the stack - PushBytes(u32), - /// Fails the script if executed - ReturnOp, - /// Succeeds the script even if not executed - SuccessOp, - /// Fails the script even if not executed - IllegalOp, - /// Does nothing - NoOp, - /// Any opcode not covered above - Ordinary(Ordinary) -} - -display_from_debug!(Class); - -#[cfg(feature = "serde")] -#[cfg_attr(docsrs, doc(cfg(feature = "serde")))] -impl serde::Serialize for Class { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - serializer.serialize_str(&self.to_string()) - } -} - -macro_rules! ordinary_opcode { - ($($op:ident),*) => ( - #[repr(u8)] - #[doc(hidden)] - #[derive(Copy, Clone, PartialEq, Eq, Debug)] - pub enum Ordinary { - $( $op = all::$op.code ),* - } - - impl Ordinary { - fn with(b: All) -> Self { - match b { - $( all::$op => { Ordinary::$op } ),* - _ => unreachable!("construction of `Ordinary` type from non-ordinary opcode {}", b), - } - } - - /// Try to create from an All - pub fn try_from_all(b: All) -> Option { - match b { - $( all::$op => { Some(Ordinary::$op) } ),* - _ => None, - } - } - } - ); -} - -// "Ordinary" opcodes -- should be 60 of these -ordinary_opcode! { - // pushdata - OP_PUSHDATA1, OP_PUSHDATA2, OP_PUSHDATA4, - // control flow - OP_IF, OP_NOTIF, OP_ELSE, OP_ENDIF, OP_VERIFY, - // stack - OP_TOALTSTACK, OP_FROMALTSTACK, - OP_2DROP, OP_2DUP, OP_3DUP, OP_2OVER, OP_2ROT, OP_2SWAP, - OP_DROP, OP_DUP, OP_NIP, OP_OVER, OP_PICK, OP_ROLL, OP_ROT, OP_SWAP, OP_TUCK, - OP_IFDUP, OP_DEPTH, OP_SIZE, - // equality - OP_EQUAL, OP_EQUALVERIFY, - // arithmetic - OP_1ADD, OP_1SUB, OP_NEGATE, OP_ABS, OP_NOT, OP_0NOTEQUAL, - OP_ADD, OP_SUB, OP_BOOLAND, OP_BOOLOR, - OP_NUMEQUAL, OP_NUMEQUALVERIFY, OP_NUMNOTEQUAL, OP_LESSTHAN, - OP_GREATERTHAN, OP_LESSTHANOREQUAL, OP_GREATERTHANOREQUAL, - OP_MIN, OP_MAX, OP_WITHIN, - // crypto - OP_RIPEMD160, OP_SHA1, OP_SHA256, OP_HASH160, OP_HASH256, - OP_CODESEPARATOR, OP_CHECKSIG, OP_CHECKSIGVERIFY, - OP_CHECKMULTISIG, OP_CHECKMULTISIGVERIFY, - OP_CHECKSIGADD -} - -impl Ordinary { - /// Encode as a byte - #[inline] - pub fn into_u8(self) -> u8 { - self as u8 - } -} - -#[cfg(test)] -mod tests { - use std::collections::HashSet; - - use super::*; - - macro_rules! roundtrip { - ($unique:expr, $op:ident) => { - assert_eq!(all::$op, All::from(all::$op.into_u8())); - - let s1 = format!("{}", all::$op); - let s2 = format!("{:?}", all::$op); - assert_eq!(s1, s2); - assert_eq!(s1, stringify!($op)); - assert!($unique.insert(s1)); - } - } - - #[test] - fn classify_test() { - let op174 = all::OP_CHECKMULTISIG; - assert_eq!(op174.classify(ClassifyContext::Legacy), Class::Ordinary(Ordinary::OP_CHECKMULTISIG)); - assert_eq!(op174.classify(ClassifyContext::TapScript), Class::ReturnOp); - - let op175 = all::OP_CHECKMULTISIGVERIFY; - assert_eq!(op175.classify(ClassifyContext::Legacy), Class::Ordinary(Ordinary::OP_CHECKMULTISIGVERIFY)); - assert_eq!(op175.classify(ClassifyContext::TapScript), Class::ReturnOp); - - let op186 = all::OP_CHECKSIGADD; - assert_eq!(op186.classify(ClassifyContext::Legacy), Class::ReturnOp); - assert_eq!(op186.classify(ClassifyContext::TapScript), Class::Ordinary(Ordinary::OP_CHECKSIGADD)); - - let op187 = all::OP_RETURN_187; - assert_eq!(op187.classify(ClassifyContext::Legacy), Class::ReturnOp); - assert_eq!(op187.classify(ClassifyContext::TapScript), Class::SuccessOp); - } - - #[test] - fn str_roundtrip() { - let mut unique = HashSet::new(); - roundtrip!(unique, OP_PUSHBYTES_0); - roundtrip!(unique, OP_PUSHBYTES_1); - roundtrip!(unique, OP_PUSHBYTES_2); - roundtrip!(unique, OP_PUSHBYTES_3); - roundtrip!(unique, OP_PUSHBYTES_4); - roundtrip!(unique, OP_PUSHBYTES_5); - roundtrip!(unique, OP_PUSHBYTES_6); - roundtrip!(unique, OP_PUSHBYTES_7); - roundtrip!(unique, OP_PUSHBYTES_8); - roundtrip!(unique, OP_PUSHBYTES_9); - roundtrip!(unique, OP_PUSHBYTES_10); - roundtrip!(unique, OP_PUSHBYTES_11); - roundtrip!(unique, OP_PUSHBYTES_12); - roundtrip!(unique, OP_PUSHBYTES_13); - roundtrip!(unique, OP_PUSHBYTES_14); - roundtrip!(unique, OP_PUSHBYTES_15); - roundtrip!(unique, OP_PUSHBYTES_16); - roundtrip!(unique, OP_PUSHBYTES_17); - roundtrip!(unique, OP_PUSHBYTES_18); - roundtrip!(unique, OP_PUSHBYTES_19); - roundtrip!(unique, OP_PUSHBYTES_20); - roundtrip!(unique, OP_PUSHBYTES_21); - roundtrip!(unique, OP_PUSHBYTES_22); - roundtrip!(unique, OP_PUSHBYTES_23); - roundtrip!(unique, OP_PUSHBYTES_24); - roundtrip!(unique, OP_PUSHBYTES_25); - roundtrip!(unique, OP_PUSHBYTES_26); - roundtrip!(unique, OP_PUSHBYTES_27); - roundtrip!(unique, OP_PUSHBYTES_28); - roundtrip!(unique, OP_PUSHBYTES_29); - roundtrip!(unique, OP_PUSHBYTES_30); - roundtrip!(unique, OP_PUSHBYTES_31); - roundtrip!(unique, OP_PUSHBYTES_32); - roundtrip!(unique, OP_PUSHBYTES_33); - roundtrip!(unique, OP_PUSHBYTES_34); - roundtrip!(unique, OP_PUSHBYTES_35); - roundtrip!(unique, OP_PUSHBYTES_36); - roundtrip!(unique, OP_PUSHBYTES_37); - roundtrip!(unique, OP_PUSHBYTES_38); - roundtrip!(unique, OP_PUSHBYTES_39); - roundtrip!(unique, OP_PUSHBYTES_40); - roundtrip!(unique, OP_PUSHBYTES_41); - roundtrip!(unique, OP_PUSHBYTES_42); - roundtrip!(unique, OP_PUSHBYTES_43); - roundtrip!(unique, OP_PUSHBYTES_44); - roundtrip!(unique, OP_PUSHBYTES_45); - roundtrip!(unique, OP_PUSHBYTES_46); - roundtrip!(unique, OP_PUSHBYTES_47); - roundtrip!(unique, OP_PUSHBYTES_48); - roundtrip!(unique, OP_PUSHBYTES_49); - roundtrip!(unique, OP_PUSHBYTES_50); - roundtrip!(unique, OP_PUSHBYTES_51); - roundtrip!(unique, OP_PUSHBYTES_52); - roundtrip!(unique, OP_PUSHBYTES_53); - roundtrip!(unique, OP_PUSHBYTES_54); - roundtrip!(unique, OP_PUSHBYTES_55); - roundtrip!(unique, OP_PUSHBYTES_56); - roundtrip!(unique, OP_PUSHBYTES_57); - roundtrip!(unique, OP_PUSHBYTES_58); - roundtrip!(unique, OP_PUSHBYTES_59); - roundtrip!(unique, OP_PUSHBYTES_60); - roundtrip!(unique, OP_PUSHBYTES_61); - roundtrip!(unique, OP_PUSHBYTES_62); - roundtrip!(unique, OP_PUSHBYTES_63); - roundtrip!(unique, OP_PUSHBYTES_64); - roundtrip!(unique, OP_PUSHBYTES_65); - roundtrip!(unique, OP_PUSHBYTES_66); - roundtrip!(unique, OP_PUSHBYTES_67); - roundtrip!(unique, OP_PUSHBYTES_68); - roundtrip!(unique, OP_PUSHBYTES_69); - roundtrip!(unique, OP_PUSHBYTES_70); - roundtrip!(unique, OP_PUSHBYTES_71); - roundtrip!(unique, OP_PUSHBYTES_72); - roundtrip!(unique, OP_PUSHBYTES_73); - roundtrip!(unique, OP_PUSHBYTES_74); - roundtrip!(unique, OP_PUSHBYTES_75); - roundtrip!(unique, OP_PUSHDATA1); - roundtrip!(unique, OP_PUSHDATA2); - roundtrip!(unique, OP_PUSHDATA4); - roundtrip!(unique, OP_PUSHNUM_NEG1); - roundtrip!(unique, OP_RESERVED); - roundtrip!(unique, OP_PUSHNUM_1); - roundtrip!(unique, OP_PUSHNUM_2); - roundtrip!(unique, OP_PUSHNUM_3); - roundtrip!(unique, OP_PUSHNUM_4); - roundtrip!(unique, OP_PUSHNUM_5); - roundtrip!(unique, OP_PUSHNUM_6); - roundtrip!(unique, OP_PUSHNUM_7); - roundtrip!(unique, OP_PUSHNUM_8); - roundtrip!(unique, OP_PUSHNUM_9); - roundtrip!(unique, OP_PUSHNUM_10); - roundtrip!(unique, OP_PUSHNUM_11); - roundtrip!(unique, OP_PUSHNUM_12); - roundtrip!(unique, OP_PUSHNUM_13); - roundtrip!(unique, OP_PUSHNUM_14); - roundtrip!(unique, OP_PUSHNUM_15); - roundtrip!(unique, OP_PUSHNUM_16); - roundtrip!(unique, OP_NOP); - roundtrip!(unique, OP_VER); - roundtrip!(unique, OP_IF); - roundtrip!(unique, OP_NOTIF); - roundtrip!(unique, OP_VERIF); - roundtrip!(unique, OP_VERNOTIF); - roundtrip!(unique, OP_ELSE); - roundtrip!(unique, OP_ENDIF); - roundtrip!(unique, OP_VERIFY); - roundtrip!(unique, OP_RETURN); - roundtrip!(unique, OP_TOALTSTACK); - roundtrip!(unique, OP_FROMALTSTACK); - roundtrip!(unique, OP_2DROP); - roundtrip!(unique, OP_2DUP); - roundtrip!(unique, OP_3DUP); - roundtrip!(unique, OP_2OVER); - roundtrip!(unique, OP_2ROT); - roundtrip!(unique, OP_2SWAP); - roundtrip!(unique, OP_IFDUP); - roundtrip!(unique, OP_DEPTH); - roundtrip!(unique, OP_DROP); - roundtrip!(unique, OP_DUP); - roundtrip!(unique, OP_NIP); - roundtrip!(unique, OP_OVER); - roundtrip!(unique, OP_PICK); - roundtrip!(unique, OP_ROLL); - roundtrip!(unique, OP_ROT); - roundtrip!(unique, OP_SWAP); - roundtrip!(unique, OP_TUCK); - roundtrip!(unique, OP_CAT); - roundtrip!(unique, OP_SUBSTR); - roundtrip!(unique, OP_LEFT); - roundtrip!(unique, OP_RIGHT); - roundtrip!(unique, OP_SIZE); - roundtrip!(unique, OP_INVERT); - roundtrip!(unique, OP_AND); - roundtrip!(unique, OP_OR); - roundtrip!(unique, OP_XOR); - roundtrip!(unique, OP_EQUAL); - roundtrip!(unique, OP_EQUALVERIFY); - roundtrip!(unique, OP_RESERVED1); - roundtrip!(unique, OP_RESERVED2); - roundtrip!(unique, OP_1ADD); - roundtrip!(unique, OP_1SUB); - roundtrip!(unique, OP_2MUL); - roundtrip!(unique, OP_2DIV); - roundtrip!(unique, OP_NEGATE); - roundtrip!(unique, OP_ABS); - roundtrip!(unique, OP_NOT); - roundtrip!(unique, OP_0NOTEQUAL); - roundtrip!(unique, OP_ADD); - roundtrip!(unique, OP_SUB); - roundtrip!(unique, OP_MUL); - roundtrip!(unique, OP_DIV); - roundtrip!(unique, OP_MOD); - roundtrip!(unique, OP_LSHIFT); - roundtrip!(unique, OP_RSHIFT); - roundtrip!(unique, OP_BOOLAND); - roundtrip!(unique, OP_BOOLOR); - roundtrip!(unique, OP_NUMEQUAL); - roundtrip!(unique, OP_NUMEQUALVERIFY); - roundtrip!(unique, OP_NUMNOTEQUAL); - roundtrip!(unique, OP_LESSTHAN ); - roundtrip!(unique, OP_GREATERTHAN ); - roundtrip!(unique, OP_LESSTHANOREQUAL ); - roundtrip!(unique, OP_GREATERTHANOREQUAL ); - roundtrip!(unique, OP_MIN); - roundtrip!(unique, OP_MAX); - roundtrip!(unique, OP_WITHIN); - roundtrip!(unique, OP_RIPEMD160); - roundtrip!(unique, OP_SHA1); - roundtrip!(unique, OP_SHA256); - roundtrip!(unique, OP_HASH160); - roundtrip!(unique, OP_HASH256); - roundtrip!(unique, OP_CODESEPARATOR); - roundtrip!(unique, OP_CHECKSIG); - roundtrip!(unique, OP_CHECKSIGVERIFY); - roundtrip!(unique, OP_CHECKMULTISIG); - roundtrip!(unique, OP_CHECKMULTISIGVERIFY); - roundtrip!(unique, OP_NOP1); - roundtrip!(unique, OP_CLTV); - roundtrip!(unique, OP_CSV); - roundtrip!(unique, OP_NOP4); - roundtrip!(unique, OP_NOP5); - roundtrip!(unique, OP_NOP6); - roundtrip!(unique, OP_NOP7); - roundtrip!(unique, OP_NOP8); - roundtrip!(unique, OP_NOP9); - roundtrip!(unique, OP_NOP10); - roundtrip!(unique, OP_CHECKSIGADD); - roundtrip!(unique, OP_RETURN_187); - roundtrip!(unique, OP_RETURN_188); - roundtrip!(unique, OP_RETURN_189); - roundtrip!(unique, OP_RETURN_190); - roundtrip!(unique, OP_RETURN_191); - roundtrip!(unique, OP_RETURN_192); - roundtrip!(unique, OP_RETURN_193); - roundtrip!(unique, OP_RETURN_194); - roundtrip!(unique, OP_RETURN_195); - roundtrip!(unique, OP_RETURN_196); - roundtrip!(unique, OP_RETURN_197); - roundtrip!(unique, OP_RETURN_198); - roundtrip!(unique, OP_RETURN_199); - roundtrip!(unique, OP_RETURN_200); - roundtrip!(unique, OP_RETURN_201); - roundtrip!(unique, OP_RETURN_202); - roundtrip!(unique, OP_RETURN_203); - roundtrip!(unique, OP_RETURN_204); - roundtrip!(unique, OP_RETURN_205); - roundtrip!(unique, OP_RETURN_206); - roundtrip!(unique, OP_RETURN_207); - roundtrip!(unique, OP_RETURN_208); - roundtrip!(unique, OP_RETURN_209); - roundtrip!(unique, OP_RETURN_210); - roundtrip!(unique, OP_RETURN_211); - roundtrip!(unique, OP_RETURN_212); - roundtrip!(unique, OP_RETURN_213); - roundtrip!(unique, OP_RETURN_214); - roundtrip!(unique, OP_RETURN_215); - roundtrip!(unique, OP_RETURN_216); - roundtrip!(unique, OP_RETURN_217); - roundtrip!(unique, OP_RETURN_218); - roundtrip!(unique, OP_RETURN_219); - roundtrip!(unique, OP_RETURN_220); - roundtrip!(unique, OP_RETURN_221); - roundtrip!(unique, OP_RETURN_222); - roundtrip!(unique, OP_RETURN_223); - roundtrip!(unique, OP_RETURN_224); - roundtrip!(unique, OP_RETURN_225); - roundtrip!(unique, OP_RETURN_226); - roundtrip!(unique, OP_RETURN_227); - roundtrip!(unique, OP_RETURN_228); - roundtrip!(unique, OP_RETURN_229); - roundtrip!(unique, OP_RETURN_230); - roundtrip!(unique, OP_RETURN_231); - roundtrip!(unique, OP_RETURN_232); - roundtrip!(unique, OP_RETURN_233); - roundtrip!(unique, OP_RETURN_234); - roundtrip!(unique, OP_RETURN_235); - roundtrip!(unique, OP_RETURN_236); - roundtrip!(unique, OP_RETURN_237); - roundtrip!(unique, OP_RETURN_238); - roundtrip!(unique, OP_RETURN_239); - roundtrip!(unique, OP_RETURN_240); - roundtrip!(unique, OP_RETURN_241); - roundtrip!(unique, OP_RETURN_242); - roundtrip!(unique, OP_RETURN_243); - roundtrip!(unique, OP_RETURN_244); - roundtrip!(unique, OP_RETURN_245); - roundtrip!(unique, OP_RETURN_246); - roundtrip!(unique, OP_RETURN_247); - roundtrip!(unique, OP_RETURN_248); - roundtrip!(unique, OP_RETURN_249); - roundtrip!(unique, OP_RETURN_250); - roundtrip!(unique, OP_RETURN_251); - roundtrip!(unique, OP_RETURN_252); - roundtrip!(unique, OP_RETURN_253); - roundtrip!(unique, OP_RETURN_254); - roundtrip!(unique, OP_INVALIDOPCODE); - assert_eq!(unique.len(), 256); - } -} - diff --git a/dash-spv-masternode-processor/src/chain/common/llmq_type.rs b/dash-spv-masternode-processor/src/chain/common/llmq_type.rs deleted file mode 100644 index 60918925..00000000 --- a/dash-spv-masternode-processor/src/chain/common/llmq_type.rs +++ /dev/null @@ -1,413 +0,0 @@ -use byte::ctx::Endian; -use byte::{BytesExt, TryRead, TryWrite}; -#[cfg(feature = "generate-dashj-tests")] -use serde::{Serialize, Serializer}; -use crate::consensus::Encodable; -use crate::crypto::byte_util::BytesDecodable; - -#[repr(C)] -#[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Hash, Ord)] -pub struct DKGParams { - pub interval: u32, // one DKG per hour - pub phase_blocks: u32, - pub mining_window_start: u32, // dkg_phase_blocks * 5 = after finalization - pub mining_window_end: u32, - pub bad_votes_threshold: u32, -} - -#[repr(C)] -#[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Hash, Ord)] -pub struct LLMQParams { - pub r#type: LLMQType, - pub name: &'static str, - // pub use_rotation: bool, - pub size: u32, - pub min_size: u32, - pub threshold: u32, - pub dkg_params: DKGParams, - pub signing_active_quorum_count: u32, // just a few ones to allow easier testing - pub keep_old_connections: u32, - pub recovery_members: u32, -} - -pub const DKG_TEST: DKGParams = DKGParams { - interval: 24, - phase_blocks: 2, - mining_window_start: 10, - mining_window_end: 18, - bad_votes_threshold: 2, -}; - -pub const DKG_DEVNET: DKGParams = DKGParams { - interval: 24, - phase_blocks: 2, - mining_window_start: 10, - mining_window_end: 18, - bad_votes_threshold: 7, -}; -pub const DKG_DEVNET_DIP_0024: DKGParams = DKGParams { - interval: 48, - phase_blocks: 2, - mining_window_start: 10, - mining_window_end: 18, - bad_votes_threshold: 7, -}; -pub const DKG_50_60: DKGParams = DKGParams { - interval: 24, - phase_blocks: 2, - mining_window_start: 10, - mining_window_end: 18, - bad_votes_threshold: 40, -}; -pub const DKG_400_60: DKGParams = DKGParams { - interval: 24 * 12, - phase_blocks: 4, - mining_window_start: 20, - mining_window_end: 28, - bad_votes_threshold: 300, -}; -pub const DKG_400_85: DKGParams = DKGParams { - interval: 24 * 24, - phase_blocks: 4, - mining_window_start: 20, - mining_window_end: 48, - bad_votes_threshold: 300, -}; -pub const DKG_100_67: DKGParams = DKGParams { - interval: 2, - phase_blocks: 2, - mining_window_start: 10, - mining_window_end: 18, - bad_votes_threshold: 80, -}; - -pub const DKG_60_75: DKGParams = DKGParams { - interval: 24 * 12, - phase_blocks: 2, - mining_window_start: 42, - mining_window_end: 50, - bad_votes_threshold: 48, -}; - -pub const DKG_25_67: DKGParams = DKGParams { - interval: 24, - phase_blocks: 2, - mining_window_start: 10, - mining_window_end: 18, - bad_votes_threshold: 22, -}; - -pub const DKG_PLATFORM_TESTNET: DKGParams = DKGParams { - interval: 24 * 12, - phase_blocks: 2, - mining_window_start: 10, - mining_window_end: 18, - bad_votes_threshold: 2, -}; - -pub const DKG_PLATFORM_DEVNET: DKGParams = DKGParams { - interval: 24 * 12, - phase_blocks: 2, - mining_window_start: 10, - mining_window_end: 18, - bad_votes_threshold: 7, -}; - -pub const LLMQ_TEST: LLMQParams = LLMQParams { - r#type: LLMQType::LlmqtypeTest, - name: "llmq_test", - size: 4, - min_size: 2, - threshold: 2, - dkg_params: DKG_TEST, - signing_active_quorum_count: 2, - keep_old_connections: 3, - recovery_members: 3, -}; -pub const LLMQ_V017: LLMQParams = LLMQParams { - r#type: LLMQType::LlmqtypeTestV17, - name: "llmq_test_v17", - size: 3, - min_size: 2, - threshold: 2, - dkg_params: DKG_TEST, - signing_active_quorum_count: 2, - keep_old_connections: 3, - recovery_members: 3, -}; -pub const LLMQ_0024: LLMQParams = LLMQParams { - r#type: LLMQType::LlmqtypeDevnetDIP0024, - name: "llmq_devnet_dip0024", - size: 8, - min_size: 6, - threshold: 4, - dkg_params: DKG_DEVNET_DIP_0024, - signing_active_quorum_count: 2, - keep_old_connections: 4, - recovery_members: 4, -}; -pub const LLMQ_0024_333: LLMQParams = LLMQParams { - r#type: LLMQType::LlmqtypeDevnetDIP0024, - name: "llmq_devnet_dip0024", - size: 8, - min_size: 6, - threshold: 4, - dkg_params: DKG_DEVNET_DIP_0024, - signing_active_quorum_count: 2, - keep_old_connections: 4, - recovery_members: 4, -}; -pub const LLMQ_TEST_DIP00024: LLMQParams = LLMQParams { - r#type: LLMQType::LlmqtypeTestDIP0024, - name: "llmq_test_dip0024", - size: 4, - min_size: 3, - threshold: 2, - dkg_params: DKG_TEST, - signing_active_quorum_count: 2, - keep_old_connections: 3, - recovery_members: 3, -}; -pub const LLMQ_TEST_INSTANT_SEND: LLMQParams = LLMQParams { - r#type: LLMQType::LlmqtypeTestInstantSend, - name: "llmq_test_instantsend", - size: 3, - min_size: 2, - threshold: 2, - dkg_params: DKG_TEST, - signing_active_quorum_count: 2, - keep_old_connections: 3, - recovery_members: 3, -}; - -pub const LLMQ_DEVNET: LLMQParams = LLMQParams { - r#type: LLMQType::LlmqtypeDevnet, - name: "llmq_devnet", - size: 12, - min_size: 7, - threshold: 6, - dkg_params: DKG_DEVNET, - signing_active_quorum_count: 4, - keep_old_connections: 4, - recovery_members: 6, -}; - -pub const LLMQ_50_60: LLMQParams = LLMQParams { - r#type: LLMQType::Llmqtype50_60, - name: "llmq_50_60", - size: 50, - min_size: 40, - threshold: 30, - dkg_params: DKG_50_60, - signing_active_quorum_count: 24, - keep_old_connections: 25, - recovery_members: 25, -}; -pub const LLMQ_400_60: LLMQParams = LLMQParams { - r#type: LLMQType::Llmqtype400_60, - name: "llmq_400_60", - size: 400, - min_size: 300, - threshold: 240, - dkg_params: DKG_400_60, - signing_active_quorum_count: 4, - keep_old_connections: 5, - recovery_members: 100, -}; -pub const LLMQ_400_85: LLMQParams = LLMQParams { - r#type: LLMQType::Llmqtype400_60, - name: "llmq_400_85", - size: 400, - min_size: 350, - threshold: 340, - dkg_params: DKG_400_85, - signing_active_quorum_count: 4, - keep_old_connections: 5, - recovery_members: 100, -}; -pub const LLMQ_100_67: LLMQParams = LLMQParams { - r#type: LLMQType::Llmqtype100_67, - name: "llmq_100_67", - size: 100, - min_size: 80, - threshold: 67, - dkg_params: DKG_100_67, - signing_active_quorum_count: 24, - keep_old_connections: 25, - recovery_members: 50, -}; -pub const LLMQ_60_75: LLMQParams = LLMQParams { - r#type: LLMQType::Llmqtype60_75, - name: "llmq_60_75", - size: 60, - min_size: 50, - threshold: 45, - dkg_params: DKG_60_75, - signing_active_quorum_count: 32, - keep_old_connections: 64, - recovery_members: 25, -}; - -pub const LLMQ_25_67: LLMQParams = LLMQParams { - r#type: LLMQType::Llmqtype25_67, - name: "llmq_25_67", - size: 25, - min_size: 22, - threshold: 17, - dkg_params: DKG_25_67, - signing_active_quorum_count: 24, - keep_old_connections: 25, - recovery_members: 12, -}; - -pub const LLMQ_TEST_PLATFORM: LLMQParams = LLMQParams { - r#type: LLMQType::LlmqtypeTestnetPlatform, - name: "llmq_test_platform", - size: 3, - min_size: 2, - threshold: 2, - dkg_params: DKG_PLATFORM_TESTNET, - signing_active_quorum_count: 2, - keep_old_connections: 4, - recovery_members: 3, -}; - -pub const LLMQ_DEV_PLATFORM: LLMQParams = LLMQParams { - r#type: LLMQType::LlmqtypeDevnetPlatform, - name: "llmq_dev_platform", - size: 12, - min_size: 9, - threshold: 8, - dkg_params: DKG_PLATFORM_DEVNET, - signing_active_quorum_count: 4, - keep_old_connections: 4, - recovery_members: 3, -}; - -#[warn(non_camel_case_types)] -#[repr(C)] -#[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Hash, Ord)] -pub enum LLMQType { - LlmqtypeUnknown = 0, // other kind of - Llmqtype50_60 = 1, // 50 members, 30 (60%) threshold, 24 / day - Llmqtype400_60 = 2, // 400 members, 240 (60%) threshold, 2 / day - Llmqtype400_85 = 3, // 400 members, 340 (85%) threshold, 1 / day - Llmqtype100_67 = 4, // 100 members, 67 (67%) threshold, 24 / day - Llmqtype60_75 = 5, // 60 members, 45 (75%) threshold, 2 / day - Llmqtype25_67 = 6, // 25 members, 67 (67%) threshold, 24 / day - - // dev-only - LlmqtypeTest = 100, // 3 members, 2 (66%) threshold, one per hour - LlmqtypeDevnet = 101, // 10 members, 6 (60%) threshold, one per hour - LlmqtypeTestV17 = 102, // 3 members, 2 (66%) threshold, one per hour. Params might differ when -llmqtestparams is used - LlmqtypeTestDIP0024 = 103, // 4 members, 2 (66%) threshold, one per hour. Params might differ when -llmqtestparams is used - LlmqtypeTestInstantSend = 104, // 3 members, 2 (66%) threshold, one per hour. Params might differ when -llmqtestparams is used - LlmqtypeDevnetDIP0024 = 105, // 8 members, 4 (50%) threshold, one per hour. Params might differ when -llmqdevnetparams is used - LlmqtypeTestnetPlatform = 106, // 8 members, 4 (50%) threshold, one per hour. Params might differ when -llmqdevnetparams is used - LlmqtypeDevnetPlatform = 107, // 8 members, 4 (50%) threshold, one per hour. Params might differ when -llmqdevnetparams is used -} - -#[cfg(feature = "generate-dashj-tests")] -impl Serialize for LLMQType { - fn serialize(&self, serializer: S) -> Result where S: Serializer { - serializer.serialize_u8(u8::from(*self)) - } -} - -impl LLMQType { - pub fn params(&self) -> LLMQParams { - match self { - LLMQType::Llmqtype50_60 => LLMQ_50_60, - LLMQType::Llmqtype400_60 => LLMQ_400_60, - LLMQType::Llmqtype400_85 => LLMQ_400_85, - LLMQType::Llmqtype100_67 => LLMQ_100_67, - LLMQType::Llmqtype60_75 => LLMQ_60_75, - LLMQType::Llmqtype25_67 => LLMQ_25_67, - LLMQType::LlmqtypeTest => LLMQ_TEST, - LLMQType::LlmqtypeDevnet => LLMQ_DEVNET, - LLMQType::LlmqtypeTestV17 => LLMQ_V017, - LLMQType::LlmqtypeTestDIP0024 => LLMQ_TEST_DIP00024, - LLMQType::LlmqtypeTestInstantSend => LLMQ_TEST_INSTANT_SEND, - LLMQType::LlmqtypeDevnetDIP0024 => LLMQ_0024, - LLMQType::LlmqtypeTestnetPlatform => LLMQ_TEST_PLATFORM, - LLMQType::LlmqtypeDevnetPlatform => LLMQ_DEV_PLATFORM, - LLMQType::LlmqtypeUnknown => LLMQ_DEVNET, - } - } - pub fn size(&self) -> u32 { - self.params().size - } - - pub fn threshold(&self) -> u32 { - self.params().threshold - } - - pub fn active_quorum_count(&self) -> u32 { - self.params().signing_active_quorum_count - } -} - -impl From for LLMQType { - fn from(orig: u8) -> Self { - match orig { - 1 => LLMQType::Llmqtype50_60, - 2 => LLMQType::Llmqtype400_60, - 3 => LLMQType::Llmqtype400_85, - 4 => LLMQType::Llmqtype100_67, - 5 => LLMQType::Llmqtype60_75, - 6 => LLMQType::Llmqtype25_67, - 100 => LLMQType::LlmqtypeTest, - 101 => LLMQType::LlmqtypeDevnet, - 102 => LLMQType::LlmqtypeTestV17, - 103 => LLMQType::LlmqtypeTestDIP0024, - 104 => LLMQType::LlmqtypeTestInstantSend, - 105 => LLMQType::LlmqtypeDevnetDIP0024, - 106 => LLMQType::LlmqtypeTestnetPlatform, - _ => LLMQType::LlmqtypeUnknown, - } - } -} - -impl From for u8 { - fn from(value: LLMQType) -> Self { - match value { - LLMQType::LlmqtypeUnknown => 0, - LLMQType::Llmqtype50_60 => 1, - LLMQType::Llmqtype400_60 => 2, - LLMQType::Llmqtype400_85 => 3, - LLMQType::Llmqtype100_67 => 4, - LLMQType::Llmqtype60_75 => 5, - LLMQType::Llmqtype25_67 => 6, - LLMQType::LlmqtypeTest => 100, - LLMQType::LlmqtypeDevnet => 101, - LLMQType::LlmqtypeTestV17 => 102, - LLMQType::LlmqtypeTestDIP0024 => 103, - LLMQType::LlmqtypeTestInstantSend => 104, - LLMQType::LlmqtypeDevnetDIP0024 => 105, - LLMQType::LlmqtypeTestnetPlatform => 106, - LLMQType::LlmqtypeDevnetPlatform => 107, - } - } -} - -impl<'a> TryRead<'a, Endian> for LLMQType { - fn try_read(bytes: &'a [u8], endian: Endian) -> byte::Result<(Self, usize)> { - let offset = &mut 0; - let orig = bytes.read_with::(offset, endian).unwrap(); - let llmq_type = LLMQType::from(orig); - Ok((llmq_type, 1)) - } -} - -impl<'a> TryWrite for LLMQType { - fn try_write(self, bytes: &mut [u8], _endian: Endian) -> byte::Result { - let orig: u8 = self.into(); - orig.enc(bytes); - Ok(1) - } -} -impl<'a> BytesDecodable<'a, LLMQType> for LLMQType { - fn from_bytes(bytes: &'a [u8], offset: &mut usize) -> Option { - bytes.read_with::(offset, byte::LE).ok() - } -} diff --git a/dash-spv-masternode-processor/src/chain/common/mod.rs b/dash-spv-masternode-processor/src/chain/common/mod.rs deleted file mode 100644 index b48d98e0..00000000 --- a/dash-spv-masternode-processor/src/chain/common/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub mod chain_type; -pub mod llmq_type; - -pub use self::chain_type::{ChainType, IHaveChainSettings, DevnetType}; -pub use self::llmq_type::{DKGParams, LLMQParams, LLMQType}; diff --git a/dash-spv-masternode-processor/src/chain/constants.rs b/dash-spv-masternode-processor/src/chain/constants.rs deleted file mode 100644 index a9d1c6d4..00000000 --- a/dash-spv-masternode-processor/src/chain/constants.rs +++ /dev/null @@ -1,7 +0,0 @@ -pub const DASH_MESSAGE_MAGIC: &str = "DarkCoin Signed Message:\n"; - -pub const CORE_PROTO_BLS_BASIC: u32 = 70225; -pub const CORE_PROTO_19: u32 = 70227; -pub const CORE_PROTO_19_2: u32 = 70228; -pub const CORE_PROTO_DIFF_VERSION_ORDER: u32 = 70229; -pub const CORE_PROTO_20: u32 = 70230; \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/chain/mod.rs b/dash-spv-masternode-processor/src/chain/mod.rs deleted file mode 100644 index ea24d681..00000000 --- a/dash-spv-masternode-processor/src/chain/mod.rs +++ /dev/null @@ -1,8 +0,0 @@ -pub mod bip; -pub mod common; -pub mod constants; -pub mod derivation; -pub mod params; -pub mod tx; - -pub use self::params::{BIP32ScriptMap, DIP14ScriptMap, Params, ScriptMap, SporkParams}; diff --git a/dash-spv-masternode-processor/src/chain/tx/mod.rs b/dash-spv-masternode-processor/src/chain/tx/mod.rs deleted file mode 100644 index 1b800ecd..00000000 --- a/dash-spv-masternode-processor/src/chain/tx/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod protocol; diff --git a/dash-spv-masternode-processor/src/chain/tx/protocol.rs b/dash-spv-masternode-processor/src/chain/tx/protocol.rs deleted file mode 100644 index 4593ec80..00000000 --- a/dash-spv-masternode-processor/src/chain/tx/protocol.rs +++ /dev/null @@ -1,12 +0,0 @@ -// block height indicating transaction is unconfirmed -pub const TX_UNCONFIRMED: i32 = i32::MAX; - -pub static SIGHASH_ALL: u32 = 1; -pub static TX_VERSION: u32 = 0x00000001; -pub static SPECIAL_TX_VERSION: u32 = 0x00000003; -pub static TX_LOCKTIME: u32 = 0x00000000; -pub static TXIN_SEQUENCE: u32 = u32::MAX; -// a lockTime below this value is a block height, otherwise a timestamp -pub const TX_MAX_LOCK_HEIGHT: u32 = 500000000; - -pub const MAX_ECDSA_SIGNATURE_SIZE: usize = 75; diff --git a/dash-spv-masternode-processor/src/common/block.rs b/dash-spv-masternode-processor/src/common/block.rs index fa8372bb..38bfc2bb 100644 --- a/dash-spv-masternode-processor/src/common/block.rs +++ b/dash-spv-masternode-processor/src/common/block.rs @@ -1,9 +1,18 @@ -use crate::crypto::UInt256; +use std::fmt::Display; +use dashcore::secp256k1::hashes::hex::DisplayHex; -#[derive(Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)] +#[derive(Clone, PartialEq, Eq, Hash, Ord, PartialOrd)] +#[ferment_macro::export] pub struct Block { pub height: u32, - pub hash: UInt256, + pub hash: [u8; 32], +} +#[derive(Clone, PartialEq, Eq, Hash, Ord, PartialOrd)] +#[ferment_macro::export] +pub struct MBlock { + pub height: u32, + pub hash: [u8; 32], + pub merkle_root: [u8; 32], } impl std::fmt::Debug for Block { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -13,9 +22,34 @@ impl std::fmt::Debug for Block { .finish() } } +impl Display for Block { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "Block(height: {}, hash: {})", self.height, self.hash.to_lower_hex_string()) + } +} +impl std::fmt::Debug for MBlock { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("MBlock") + .field("height", &self.height) + .field("block_hash", &self.hash) + .field("merkle_root", &self.merkle_root) + .finish() + } +} +impl Display for MBlock { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "MBlock(height: {}, hash: {}, merkle_root: {})", self.height, self.hash.to_lower_hex_string(), self.merkle_root.to_lower_hex_string()) + } +} impl Block { - pub fn new(height: u32, hash: UInt256) -> Self { + pub fn new(height: u32, hash: [u8; 32]) -> Self { Self { height, hash } } } +impl MBlock { + pub fn new(height: u32, hash: [u8; 32], merkle_root: [u8; 32]) -> Self { + Self { height, hash, merkle_root } + } +} + diff --git a/dash-spv-masternode-processor/src/common/llmq_snapshot_skip_mode.rs b/dash-spv-masternode-processor/src/common/llmq_snapshot_skip_mode.rs deleted file mode 100644 index f0bb1ed6..00000000 --- a/dash-spv-masternode-processor/src/common/llmq_snapshot_skip_mode.rs +++ /dev/null @@ -1,62 +0,0 @@ -use byte::ctx::Endian; -use byte::{BytesExt, TryRead, LE}; - -#[cfg(feature = "generate-dashj-tests")] -use serde::{Serialize, Serializer}; - -#[repr(C)] -#[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Hash)] -pub enum LLMQSnapshotSkipMode { - // No skipping. The skip list is empty. - NoSkipping = 0, - // Skip the first entry of the list. - // The following entries contain the relative position of subsequent skips. - // For example, if during the initialization phase you skip entries x, y and z of the models - // list, the skip list will contain x, y-x and z-y in this mode. - SkipFirst = 1, - // Contains the entries which were not skipped. - // This is better when there are many skips. - // Mode 2 is more efficient and should be used when 3/4*quorumSize ≥ 1/2*masternodeNb or - // quorumsize ≥ 2/3*masternodeNb - SkipExcept = 2, - // Every node was skipped. The skip list is empty. DKG sessions were not attempted. - SkipAll = 3, -} - -#[cfg(feature = "generate-dashj-tests")] -impl Serialize for LLMQSnapshotSkipMode { - fn serialize(&self, serializer: S) -> Result where S: Serializer { - serializer.serialize_u32(u32::from(*self)) - } -} - -impl From for LLMQSnapshotSkipMode { - fn from(orig: u32) -> Self { - match orig { - 0 => LLMQSnapshotSkipMode::NoSkipping, - 1 => LLMQSnapshotSkipMode::SkipFirst, - 2 => LLMQSnapshotSkipMode::SkipExcept, - 3 => LLMQSnapshotSkipMode::SkipAll, - _ => LLMQSnapshotSkipMode::NoSkipping, - } - } -} -impl From for u32 { - fn from(orig: LLMQSnapshotSkipMode) -> Self { - match orig { - LLMQSnapshotSkipMode::NoSkipping => 0, - LLMQSnapshotSkipMode::SkipFirst => 1, - LLMQSnapshotSkipMode::SkipExcept => 2, - LLMQSnapshotSkipMode::SkipAll => 3, - } - } -} - -impl<'a> TryRead<'a, Endian> for LLMQSnapshotSkipMode { - fn try_read(bytes: &'a [u8], _endian: Endian) -> byte::Result<(Self, usize)> { - Ok(( - LLMQSnapshotSkipMode::from(bytes.read_with::(&mut 0, LE)?), - 4, - )) - } -} diff --git a/dash-spv-masternode-processor/src/common/llmq_version.rs b/dash-spv-masternode-processor/src/common/llmq_version.rs deleted file mode 100644 index b154aacb..00000000 --- a/dash-spv-masternode-processor/src/common/llmq_version.rs +++ /dev/null @@ -1,79 +0,0 @@ -use byte::ctx::Endian; -use byte::{BytesExt, TryRead, TryWrite}; -#[cfg(feature = "generate-dashj-tests")] -use serde::{Serialize, Serializer}; -use crate::consensus::Encodable; -use crate::crypto::byte_util::BytesDecodable; - -#[warn(non_camel_case_types)] -#[repr(C)] -#[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Hash, Ord)] -pub enum LLMQVersion { - Default = 1, - Indexed = 2, - BLSBasicDefault = 3, - BLSBasicIndexed = 4, -} - -#[cfg(feature = "generate-dashj-tests")] -impl Serialize for LLMQVersion { - fn serialize(&self, serializer: S) -> Result where S: Serializer { - serializer.serialize_u16(u16::from(*self)) - } -} - -impl LLMQVersion { - pub fn use_bls_legacy(&self) -> bool { - *self == Self::Default || *self == Self::Indexed - } - pub fn use_rotated_quorums(&self) -> bool { - *self == Self::Indexed || *self == Self::BLSBasicIndexed - } -} - -impl From for LLMQVersion { - fn from(orig: u16) -> Self { - match orig { - 1 => LLMQVersion::Default, - 2 => LLMQVersion::Indexed, - 3 => LLMQVersion::BLSBasicDefault, - 4 => LLMQVersion::BLSBasicIndexed, - _ => LLMQVersion::Default, - } - } -} - -impl From for u16 { - fn from(value: LLMQVersion) -> Self { - match value { - LLMQVersion::Default => 1, - LLMQVersion::Indexed => 2, - LLMQVersion::BLSBasicDefault => 3, - LLMQVersion::BLSBasicIndexed => 4, - } - } -} - -impl<'a> TryRead<'a, Endian> for LLMQVersion { - fn try_read(bytes: &'a [u8], endian: Endian) -> byte::Result<(Self, usize)> { - let offset = &mut 0; - let orig = bytes.read_with::(offset, endian).unwrap(); - Ok((LLMQVersion::from(orig), 2)) - } -} - -impl<'a> TryWrite for LLMQVersion { - fn try_write(self, bytes: &mut [u8], _endian: Endian) -> byte::Result { - let orig: u16 = self.into(); - orig.consensus_encode(bytes).unwrap(); - Ok(2) - } -} -impl<'a> BytesDecodable<'a, LLMQVersion> for LLMQVersion { - fn from_bytes(bytes: &'a [u8], offset: &mut usize) -> Option { - match bytes.read_with::(offset, byte::LE) { - Ok(data) => Some(data), - Err(_err) => None, - } - } -} diff --git a/dash-spv-masternode-processor/src/common/masternode_type.rs b/dash-spv-masternode-processor/src/common/masternode_type.rs deleted file mode 100644 index 11018a4e..00000000 --- a/dash-spv-masternode-processor/src/common/masternode_type.rs +++ /dev/null @@ -1,66 +0,0 @@ -use byte::ctx::Endian; -use byte::{BytesExt, TryRead}; -#[cfg(feature = "generate-dashj-tests")] -use serde::{Serialize, Serializer}; -use crate::crypto::byte_util::BytesDecodable; - -#[repr(u16)] -#[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Hash, Ord)] -pub enum MasternodeType { - Regular = 0, - HighPerformance = 1, -} - -#[cfg(feature = "generate-dashj-tests")] -impl Serialize for MasternodeType { - fn serialize(&self, serializer: S) -> Result where S: Serializer { - serializer.serialize_u16(u16::from(*self)) - } -} - -impl MasternodeType { - pub fn voting_weight(&self) -> i32 { - match self { - MasternodeType::Regular => 1, - MasternodeType::HighPerformance => 4, - } - } - pub fn collateral_amount(&self) -> u64 { - match self { - MasternodeType::Regular => 1000, - MasternodeType::HighPerformance => 4000, - } - } -} - -impl From for MasternodeType { - fn from(orig: u16) -> Self { - match orig { - 0 => Self::Regular, - 1 => Self::HighPerformance, - i => panic!("Unknown MasternodeType {}", i) - } - } -} -impl From for u16 { - fn from(orig: MasternodeType) -> Self { - match orig { - MasternodeType::Regular => 0, - MasternodeType::HighPerformance => 1, - } - } -} -impl<'a> TryRead<'a, Endian> for MasternodeType { - fn try_read(bytes: &'a [u8], endian: Endian) -> byte::Result<(Self, usize)> { - let offset = &mut 0; - let orig = bytes.read_with::(offset, endian).unwrap(); - let masternode_type = MasternodeType::from(orig); - Ok((masternode_type, 2)) - } -} - -impl<'a> BytesDecodable<'a, MasternodeType> for MasternodeType { - fn from_bytes(bytes: &'a [u8], offset: &mut usize) -> Option { - bytes.read_with::(offset, byte::LE).ok() - } -} diff --git a/dash-spv-masternode-processor/src/common/merkle_tree.rs b/dash-spv-masternode-processor/src/common/merkle_tree.rs deleted file mode 100644 index 1cc69080..00000000 --- a/dash-spv-masternode-processor/src/common/merkle_tree.rs +++ /dev/null @@ -1,109 +0,0 @@ -use byte::BytesExt; -use crate::consensus::Encodable; -use crate::crypto::byte_util::BytesDecodable; -use crate::crypto::{UInt256, VarBytes}; -use crate::crypto::var_array::VarArray; - -#[inline] -fn ceil_log2(mut x: i32) -> i32 { - let mut r = if x & (x - 1) != 0 { 1 } else { 0 }; - loop { - x >>= 1; - if x == 0 { - break; - } - r += 1; - } - r -} - -#[derive(Clone, Debug)] -pub struct MerkleTree<'a> { - pub tree_element_count: u32, - pub hashes: Vec, - pub flags: &'a [u8], -} - -impl<'a> MerkleTree<'a> { - - pub fn has_root(&self, desired_merkle_root: UInt256) -> bool { - if self.tree_element_count == 0 { - return true; - } - if let Some(root) = self.merkle_root() { - if root == desired_merkle_root { - return true; - } - } - false - } - - pub fn merkle_root(&self) -> Option { - let hash_idx = &mut 0; - let flag_idx = &mut 0; - self.walk_hash_idx( - hash_idx, - flag_idx, - 0, - |hash, _flag| hash, - |left, right| { - let mut buffer: Vec = Vec::with_capacity(64); - left.enc(&mut buffer); - right.unwrap_or(left).enc(&mut buffer); - Some(UInt256::sha256d(buffer)) - }, - ) - } - - pub fn walk_hash_idx< - BL: Fn(UInt256, Option) -> Option + Copy, - LL: Fn(Option, bool) -> Option + Copy, - >( - &self, - hash_idx: &mut usize, - flag_idx: &mut usize, - depth: i32, - leaf: LL, - branch: BL, - ) -> Option { - let flags_length = self.flags.len(); - let hashes_length = self.hashes.len(); - if *flag_idx / 8 >= flags_length || *hash_idx >= hashes_length { - return leaf(None, false); - } - let flag = self.flags[*flag_idx / 8] & (1 << (*flag_idx % 8)) != 0; - *flag_idx += 1; - if !flag || depth == ceil_log2(self.tree_element_count as i32) { - let hash = self.hashes.get(*hash_idx).copied(); - *hash_idx += 1; - return leaf(hash, flag); - } - let left = self.walk_hash_idx(hash_idx, flag_idx, depth + 1, leaf, branch); - let right = self.walk_hash_idx(hash_idx, flag_idx, depth + 1, leaf, branch); - branch(left.unwrap(), right) - } -} - -impl<'a> BytesDecodable<'a, MerkleTree<'a>> for MerkleTree<'a> { - fn from_bytes(bytes: &'a [u8], offset: &mut usize) -> Option { - match bytes.read_with(offset, byte::LE) { - Ok(data) => Some(data), - Err(_err) => None - } - } -} - -impl<'a> byte::TryRead<'a, byte::ctx::Endian> for MerkleTree<'a> { - fn try_read(bytes: &'a [u8], _endian: byte::ctx::Endian) -> byte::Result<(Self, usize)> { - let offset = &mut 0; - let total_transactions = u32::from_bytes(bytes, offset).unwrap(); - let merkle_hashes = VarArray::::from_bytes(bytes, offset).unwrap(); - let merkle_flags_var_bytes = VarBytes::from_bytes(bytes, offset).unwrap(); - let tree = MerkleTree { - tree_element_count: total_transactions, - hashes: merkle_hashes.1, - flags: merkle_flags_var_bytes.1 - }; - Ok((tree, *offset)) - } -} diff --git a/dash-spv-masternode-processor/src/common/mod.rs b/dash-spv-masternode-processor/src/common/mod.rs index 0bf85074..1a1211d9 100644 --- a/dash-spv-masternode-processor/src/common/mod.rs +++ b/dash-spv-masternode-processor/src/common/mod.rs @@ -1,13 +1,2 @@ pub mod block; -pub mod llmq_snapshot_skip_mode; -pub mod llmq_version; -pub mod merkle_tree; -pub mod socket_address; -pub mod masternode_type; - pub use self::block::Block; -pub use self::llmq_snapshot_skip_mode::LLMQSnapshotSkipMode; -pub use self::llmq_version::LLMQVersion; -pub use self::masternode_type::MasternodeType; -pub use self::merkle_tree::MerkleTree; -pub use self::socket_address::SocketAddress; diff --git a/dash-spv-masternode-processor/src/common/socket_address.rs b/dash-spv-masternode-processor/src/common/socket_address.rs deleted file mode 100644 index 633fb72a..00000000 --- a/dash-spv-masternode-processor/src/common/socket_address.rs +++ /dev/null @@ -1,37 +0,0 @@ -use std::io; -use byte::{BytesExt, TryRead}; -use crate::consensus::Encodable; -use crate::crypto::UInt128; - - -#[repr(C)] -#[derive(Clone, Copy, Debug, Ord, PartialOrd, Eq, PartialEq)] -pub struct SocketAddress { - pub ip_address: UInt128, //v6, but only v4 supported - pub port: u16, -} - -impl std::fmt::Display for SocketAddress { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "{}:{}", self.ip_address.to_ip_addr(), self.port)?; - Ok(()) - } -} - -impl Encodable for SocketAddress { - #[inline] - fn consensus_encode(&self, mut s: S) -> Result { - self.ip_address.enc(&mut s); - self.port.swap_bytes().enc(&mut s); - Ok(18) - } -} - -impl<'a> TryRead<'a, ()> for SocketAddress { - fn try_read(bytes: &'a [u8], context: ()) -> byte::Result<(Self, usize)> { - let offset = &mut 0; - let ip_address = bytes.read_with::(offset, byte::LE)?; - let port = bytes.read_with::(offset, byte::BE)?; - Ok((SocketAddress { ip_address, port }, *offset)) - } -} diff --git a/dash-spv-masternode-processor/src/consensus/encode.rs b/dash-spv-masternode-processor/src/consensus/encode.rs deleted file mode 100644 index 41e884c5..00000000 --- a/dash-spv-masternode-processor/src/consensus/encode.rs +++ /dev/null @@ -1,793 +0,0 @@ -// Rust Bitcoin Library -// Written in 2014 by -// Andrew Poelstra -// -// To the extent possible under law, the author(s) have dedicated all -// copyright and related and neighboring rights to this software to -// the public domain worldwide. This software is distributed without -// any warranty. -// -// You should have received a copy of the CC0 Public Domain Dedication -// along with this software. -// If not, see . -// - -//! Consensus-encodable types -//! -//! This is basically a replacement of the `Encodable` trait which does -//! normalization for endianness, etc., to ensure that the encoding -//! matches for endianness, etc., to ensure that the encoding matches -//! the network consensus encoding. -//! -//! Essentially, anything that must go on the -disk- or -network- must -//! be encoded using the `Encodable` trait, since this data -//! must be the same for all systems. Any data going to the -user-, e.g. -//! over JSONRPC, should use the ordinary `Encodable` trait. (This -//! should also be the same across systems, of course, but has some -//! critical differences from the network format, e.g. scripts come -//! with an opcode decode, hashes are big-endian, numbers are typically -//! big-endian decimals, etc.) -//! - -use core::{fmt, mem, u32, convert::From}; -use std::borrow::Cow; -#[cfg(feature = "std")] use std::error; - -use std::io::{self, Cursor, Read}; -use std::{rc, sync}; -use hashes::{Hash, sha256, sha256d}; -use crate::crypto::UInt256; -use crate::hash_types::{BlockHash, FilterHash, FilterHeader, TxMerkleNode}; -use crate::hashes::hex::ToHex; - -// use hashes::hex::ToHex; - -use crate::tx::{TransactionInput, TransactionOutput}; -// use blockdata::transaction::{TxOut, Transaction, TxIn}; -// #[cfg(feature = "std")] -// use network::{message_blockdata::Inventory, address::{Address, AddrV2Message}}; -use crate::util::{endian, psbt}; - -/// Encoding error -#[derive(Debug)] -pub enum Error { - /// And I/O error - Io(io::Error), - /// PSBT-related error - Psbt(psbt::Error), - /// Network magic was not expected - UnexpectedNetworkMagic { - /// The expected network magic - expected: u32, - /// The unexpected network magic - actual: u32, - }, - /// Tried to allocate an oversized vector - OversizedVectorAllocation{ - /// The capacity requested - requested: usize, - /// The maximum capacity - max: usize, - }, - /// Checksum was invalid - InvalidChecksum { - /// The expected checksum - expected: [u8; 4], - /// The invalid checksum - actual: [u8; 4], - }, - /// VarInt was encoded in a non-minimal way - NonMinimalVarInt, - /// Network magic was unknown - UnknownNetworkMagic(u32), - /// Parsing error - ParseFailed(&'static str), - /// Unsupported Segwit flag - UnsupportedSegwitFlag(u8), -} - -impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - Error::Io(ref e) => write!(f, "I/O error: {}", e), - Error::Psbt(ref e) => write!(f, "PSBT error: {}", e), - Error::UnexpectedNetworkMagic { expected: ref e, actual: ref a } => write!(f, - "unexpected network magic: expected {}, actual {}", e, a), - Error::OversizedVectorAllocation { requested: ref r, max: ref m } => write!(f, - "allocation of oversized vector: requested {}, maximum {}", r, m), - Error::InvalidChecksum { expected: ref e, actual: ref a } => write!(f, - "invalid checksum: expected {}, actual {}", e.to_hex(), a.to_hex()), - Error::NonMinimalVarInt => write!(f, "non-minimal varint"), - Error::UnknownNetworkMagic(ref m) => write!(f, "unknown network magic: {}", m), - Error::ParseFailed(ref e) => write!(f, "parse failed: {}", e), - Error::UnsupportedSegwitFlag(ref swflag) => write!(f, - "unsupported segwit version: {}", swflag), - } - } -} - -#[cfg(feature = "std")] -#[cfg_attr(docsrs, doc(cfg(feature = "std")))] -impl ::std::error::Error for Error { - fn cause(&self) -> Option<&dyn error::Error> { - match *self { - Error::Io(ref e) => Some(e), - Error::Psbt(ref e) => Some(e), - Error::UnexpectedNetworkMagic { .. } - | Error::OversizedVectorAllocation { .. } - | Error::InvalidChecksum { .. } - | Error::NonMinimalVarInt - | Error::UnknownNetworkMagic(..) - | Error::ParseFailed(..) - | Error::UnsupportedSegwitFlag(..) => None, - } - } -} - -#[doc(hidden)] -impl From for Error { - fn from(error: io::Error) -> Self { - Error::Io(error) - } -} - -#[doc(hidden)] -impl From for Error { - fn from(e: psbt::Error) -> Error { - Error::Psbt(e) - } -} - -/// Encode an object into a vector -pub fn serialize(data: &T) -> Vec { - let mut encoder = Vec::new(); - let len = data.consensus_encode(&mut encoder).unwrap(); - debug_assert_eq!(len, encoder.len()); - encoder -} - -/// Encode an object into a hex-encoded string -pub fn serialize_hex(data: &T) -> String { - serialize(data)[..].to_hex() -} - -/// Deserialize an object from a vector, will error if said deserialization -/// doesn't consume the entire vector. -pub fn deserialize(data: &[u8]) -> Result { - let (rv, consumed) = deserialize_partial(data)?; - // Fail if data are not consumed entirely. - if consumed == data.len() { - Ok(rv) - } else { - Err(Error::ParseFailed("data not consumed entirely when explicitly deserializing")) - } -} - -/// Deserialize an object from a vector, but will not report an error if said deserialization -/// doesn't consume the entire vector. -pub fn deserialize_partial( - data: &[u8], -) -> Result<(T, usize), Error> { - let mut decoder = Cursor::new(data); - let rv = Decodable::consensus_decode(&mut decoder)?; - let consumed = decoder.position() as usize; - Ok((rv, consumed)) -} - - -/// Extensions of `Write` to encode data as per Bitcoin consensus -pub trait WriteExt { - /// Output a 64-bit uint - fn emit_u64(&mut self, v: u64) -> Result<(), io::Error>; - /// Output a 32-bit uint - fn emit_u32(&mut self, v: u32) -> Result<(), io::Error>; - /// Output a 16-bit uint - fn emit_u16(&mut self, v: u16) -> Result<(), io::Error>; - /// Output a 8-bit uint - fn emit_u8(&mut self, v: u8) -> Result<(), io::Error>; - - /// Output a 64-bit int - fn emit_i64(&mut self, v: i64) -> Result<(), io::Error>; - /// Output a 32-bit int - fn emit_i32(&mut self, v: i32) -> Result<(), io::Error>; - /// Output a 16-bit int - fn emit_i16(&mut self, v: i16) -> Result<(), io::Error>; - /// Output a 8-bit int - fn emit_i8(&mut self, v: i8) -> Result<(), io::Error>; - - /// Output a boolean - fn emit_bool(&mut self, v: bool) -> Result<(), io::Error>; - - /// Output a byte slice - fn emit_slice(&mut self, v: &[u8]) -> Result<(), io::Error>; -} - -/// Extensions of `Read` to decode data as per Bitcoin consensus -pub trait ReadExt { - /// Read a 64-bit uint - fn read_u64(&mut self) -> Result; - /// Read a 32-bit uint - fn read_u32(&mut self) -> Result; - /// Read a 16-bit uint - fn read_u16(&mut self) -> Result; - /// Read a 8-bit uint - fn read_u8(&mut self) -> Result; - - /// Read a 64-bit int - fn read_i64(&mut self) -> Result; - /// Read a 32-bit int - fn read_i32(&mut self) -> Result; - /// Read a 16-bit int - fn read_i16(&mut self) -> Result; - /// Read a 8-bit int - fn read_i8(&mut self) -> Result; - - /// Read a boolean - fn read_bool(&mut self) -> Result; - - /// Read a byte slice - fn read_slice(&mut self, slice: &mut [u8]) -> Result<(), Error>; -} - -macro_rules! encoder_fn { - ($name:ident, $val_type:ty, $writefn:ident) => { - #[inline] - fn $name(&mut self, v: $val_type) -> Result<(), io::Error> { - self.write_all(&endian::$writefn(v)) - } - } -} - -macro_rules! decoder_fn { - ($name:ident, $val_type:ty, $readfn:ident, $byte_len: expr) => { - #[inline] - fn $name(&mut self) -> Result<$val_type, Error> { - debug_assert_eq!(::core::mem::size_of::<$val_type>(), $byte_len); // size_of isn't a constfn in 1.22 - let mut val = [0; $byte_len]; - self.read_exact(&mut val[..]).map_err(Error::Io)?; - Ok(endian::$readfn(&val)) - } - } -} - -impl WriteExt for W { - encoder_fn!(emit_u64, u64, u64_to_array_le); - encoder_fn!(emit_u32, u32, u32_to_array_le); - encoder_fn!(emit_u16, u16, u16_to_array_le); - encoder_fn!(emit_i64, i64, i64_to_array_le); - encoder_fn!(emit_i32, i32, i32_to_array_le); - encoder_fn!(emit_i16, i16, i16_to_array_le); - - #[inline] - fn emit_u8(&mut self, v: u8) -> Result<(), io::Error> { - self.write_all(&[v]) - } - #[inline] - fn emit_i8(&mut self, v: i8) -> Result<(), io::Error> { - self.write_all(&[v as u8]) - } - #[inline] - fn emit_bool(&mut self, v: bool) -> Result<(), io::Error> { - self.write_all(&[v as u8]) - } - #[inline] - fn emit_slice(&mut self, v: &[u8]) -> Result<(), io::Error> { - self.write_all(v) - } -} - -impl ReadExt for R { - decoder_fn!(read_u64, u64, slice_to_u64_le, 8); - decoder_fn!(read_u32, u32, slice_to_u32_le, 4); - decoder_fn!(read_u16, u16, slice_to_u16_le, 2); - decoder_fn!(read_i64, i64, slice_to_i64_le, 8); - decoder_fn!(read_i32, i32, slice_to_i32_le, 4); - decoder_fn!(read_i16, i16, slice_to_i16_le, 2); - - #[inline] - fn read_u8(&mut self) -> Result { - let mut slice = [0u8; 1]; - self.read_exact(&mut slice)?; - Ok(slice[0]) - } - #[inline] - fn read_i8(&mut self) -> Result { - let mut slice = [0u8; 1]; - self.read_exact(&mut slice)?; - Ok(slice[0] as i8) - } - #[inline] - fn read_bool(&mut self) -> Result { - ReadExt::read_i8(self).map(|bit| bit != 0) - } - #[inline] - fn read_slice(&mut self, slice: &mut [u8]) -> Result<(), Error> { - self.read_exact(slice).map_err(Error::Io) - } -} - -/// Maximum size, in bytes, of a vector we are allowed to decode -pub const MAX_VEC_SIZE: usize = 4_000_000; - -/// Data which can be encoded in a consensus-consistent way -pub trait Encodable { - /// Encode an object with a well-defined format. - /// Returns the number of bytes written on success. - /// - /// The only errors returned are errors propagated from the writer. - fn consensus_encode(&self, writer: W) -> Result; - - /// laconic shorthand + supress unwrap panic - fn enc(&self, writer: W) -> usize { - self.consensus_encode(writer).unwrap() - } -} - -/// Data which can be encoded in a consensus-consistent way -pub trait Decodable: Sized { - /// Decode an object with a well-defined format - fn consensus_decode(d: D) -> Result; -} - -/// A variable-length unsigned integer -#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug)] -pub struct VarInt(pub u64); - -/// Data which must be preceded by a 4-byte checksum -#[derive(PartialEq, Eq, Clone, Debug)] -pub struct CheckedData(pub Vec); - -// Primitive types -macro_rules! impl_int_encodable{ - ($ty:ident, $meth_dec:ident, $meth_enc:ident) => ( - impl Decodable for $ty { - #[inline] - fn consensus_decode(mut d: D) -> Result { - ReadExt::$meth_dec(&mut d) - } - } - impl Encodable for $ty { - #[inline] - fn consensus_encode( - &self, - mut s: S, - ) -> Result { - s.$meth_enc(*self)?; - Ok(mem::size_of::<$ty>()) - } - } - ) -} - -impl_int_encodable!(u8, read_u8, emit_u8); -impl_int_encodable!(u16, read_u16, emit_u16); -impl_int_encodable!(u32, read_u32, emit_u32); -impl_int_encodable!(u64, read_u64, emit_u64); -impl_int_encodable!(i8, read_i8, emit_i8); -impl_int_encodable!(i16, read_i16, emit_i16); -impl_int_encodable!(i32, read_i32, emit_i32); -impl_int_encodable!(i64, read_i64, emit_i64); - -impl VarInt { - /// Gets the length of this VarInt when encoded. - /// Returns 1 for 0..=0xFC, 3 for 0xFD..=(2^16-1), 5 for 0x10000..=(2^32-1), - /// and 9 otherwise. - #[inline] - pub fn len(&self) -> usize { - match self.0 { - 0..=0xFC => { 1 } - 0xFD..=0xFFFF => { 3 } - 0x10000..=0xFFFFFFFF => { 5 } - _ => { 9 } - } - } - - pub fn is_empty(&self) -> bool { - self.0 == 0 - } -} - -impl std::fmt::Display for VarInt { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "[val: {}, len: {}]", self.0, self.len())?; - Ok(()) - } -} - - -impl Encodable for VarInt { - #[inline] - fn consensus_encode(&self, mut s: S) -> Result { - match self.0 { - 0..=0xFC => { - (self.0 as u8).consensus_encode(s)?; - Ok(1) - }, - 0xFD..=0xFFFF => { - s.emit_u8(0xFD)?; - (self.0 as u16).consensus_encode(s)?; - Ok(3) - }, - 0x10000..=0xFFFFFFFF => { - s.emit_u8(0xFE)?; - (self.0 as u32).consensus_encode(s)?; - Ok(5) - }, - _ => { - s.emit_u8(0xFF)?; - (self.0 as u64).consensus_encode(s)?; - Ok(9) - }, - } - } -} - -impl Decodable for VarInt { - #[inline] - fn consensus_decode(mut d: D) -> Result { - let n = ReadExt::read_u8(&mut d)?; - match n { - 0xFF => { - let x = ReadExt::read_u64(&mut d)?; - if x < 0x100000000 { - Err(self::Error::NonMinimalVarInt) - } else { - Ok(VarInt(x)) - } - } - 0xFE => { - let x = ReadExt::read_u32(&mut d)?; - if x < 0x10000 { - Err(self::Error::NonMinimalVarInt) - } else { - Ok(VarInt(x as u64)) - } - } - 0xFD => { - let x = ReadExt::read_u16(&mut d)?; - if x < 0xFD { - Err(self::Error::NonMinimalVarInt) - } else { - Ok(VarInt(x as u64)) - } - } - n => Ok(VarInt(n as u64)) - } - } -} - - -// Booleans -impl Encodable for bool { - #[inline] - fn consensus_encode(&self, mut s: S) -> Result { - s.emit_bool(*self)?; - Ok(1) - } -} - -impl Decodable for bool { - #[inline] - fn consensus_decode(mut d: D) -> Result { - ReadExt::read_bool(&mut d) - } -} - -// Strings -impl Encodable for String { - #[inline] - fn consensus_encode(&self, mut s: S) -> Result { - let b = self.as_bytes(); - let vi_len = VarInt(b.len() as u64).consensus_encode(&mut s)?; - s.emit_slice(b)?; - Ok(vi_len + b.len()) - } -} - -impl Decodable for String { - #[inline] - fn consensus_decode(d: D) -> Result { - String::from_utf8(Decodable::consensus_decode(d)?) - .map_err(|_| self::Error::ParseFailed("String was not valid UTF8")) - } -} - -// Cow<'static, str> -impl Encodable for Cow<'static, str> { - #[inline] - fn consensus_encode(&self, mut s: S) -> Result { - let b = self.as_bytes(); - let vi_len = VarInt(b.len() as u64).consensus_encode(&mut s)?; - s.emit_slice(b)?; - Ok(vi_len + b.len()) - } -} - -impl Decodable for Cow<'static, str> { - #[inline] - fn consensus_decode(d: D) -> Result, Error> { - String::from_utf8(Decodable::consensus_decode(d)?) - .map_err(|_| self::Error::ParseFailed("String was not valid UTF8")) - .map(Cow::Owned) - } -} - - -// Arrays -macro_rules! impl_array { - ( $size:expr ) => ( - impl Encodable for [u8; $size] { - #[inline] - fn consensus_encode( - &self, - mut s: S, - ) -> Result { - s.emit_slice(&self[..])?; - Ok(self.len()) - } - } - - impl Decodable for [u8; $size] { - #[inline] - fn consensus_decode(mut d: D) -> Result { - let mut ret = [0; $size]; - d.read_slice(&mut ret)?; - Ok(ret) - } - } - ); -} - -impl_array!(2); -impl_array!(4); -impl_array!(8); -impl_array!(10); -impl_array!(12); -impl_array!(16); -impl_array!(32); -impl_array!(33); - -impl Decodable for [u16; 8] { - #[inline] - fn consensus_decode(mut d: D) -> Result { - let mut res = [0; 8]; - for item in &mut res { - *item = Decodable::consensus_decode(&mut d)?; - } - Ok(res) - } -} - -impl Encodable for [u16; 8] { - #[inline] - fn consensus_encode(&self, mut s: S) -> Result { - for c in self.iter() { c.consensus_encode(&mut s)?; } - Ok(16) - } -} - -// Vectors -macro_rules! impl_vec { - ($type: ty) => { - impl Encodable for Vec<$type> { - #[inline] - fn consensus_encode( - &self, - mut s: S, - ) -> Result { - let mut len = 0; - len += VarInt(self.len() as u64).consensus_encode(&mut s)?; - for c in self.iter() { - len += c.consensus_encode(&mut s)?; - } - Ok(len) - } - } - impl Decodable for Vec<$type> { - #[inline] - fn consensus_decode(mut d: D) -> Result { - let len = VarInt::consensus_decode(&mut d)?.0; - let byte_size = (len as usize) - .checked_mul(mem::size_of::<$type>()) - .ok_or(self::Error::ParseFailed("Invalid length"))?; - if byte_size > MAX_VEC_SIZE { - return Err(self::Error::OversizedVectorAllocation { requested: byte_size, max: MAX_VEC_SIZE }) - } - let mut ret = Vec::with_capacity(len as usize); - let mut d = d.take(MAX_VEC_SIZE as u64); - for _ in 0..len { - ret.push(Decodable::consensus_decode(&mut d)?); - } - Ok(ret) - } - } - } -} -impl_vec!(BlockHash); -impl_vec!(FilterHash); -impl_vec!(FilterHeader); -impl_vec!(TxMerkleNode); -// impl_vec!(Transaction); -// impl_vec!(TxOut); -// impl_vec!(TxIn); -impl_vec!(Vec); -impl_vec!(u64); - -impl_vec!(bool); -impl_vec!(UInt256); -impl_vec!(TransactionInput); -impl_vec!(TransactionOutput); -// impl_vec!(MasternodeEntry); -// impl_vec!(crate::models::LLMQEntry); - -// #[cfg(feature = "std")] impl_vec!(Inventory); -// #[cfg(feature = "std")] impl_vec!((u32, Address)); -// #[cfg(feature = "std")] impl_vec!(AddrV2Message); - -pub fn consensus_encode_with_size(data: &[u8], mut s: S) -> Result { - let vi_len = VarInt(data.len() as u64).consensus_encode(&mut s)?; - s.emit_slice(data)?; - Ok(vi_len + data.len()) -} - - -impl Encodable for Vec { - #[inline] - fn consensus_encode(&self, s: S) -> Result { - consensus_encode_with_size(self, s) - } -} - -impl Decodable for Vec { - #[inline] - fn consensus_decode(mut d: D) -> Result { - let len = VarInt::consensus_decode(&mut d)?.0 as usize; - if len > MAX_VEC_SIZE { - return Err(self::Error::OversizedVectorAllocation { requested: len, max: MAX_VEC_SIZE }) - } - let mut ret = vec![0u8; len]; - d.read_slice(&mut ret)?; - Ok(ret) - } -} - -impl Encodable for Box<[u8]> { - #[inline] - fn consensus_encode(&self, s: S) -> Result { - consensus_encode_with_size(self, s) - } -} - -impl Decodable for Box<[u8]> { - #[inline] - fn consensus_decode(d: D) -> Result { - >::consensus_decode(d).map(From::from) - } -} - - -/// Do a double-SHA256 on some data and return the first 4 bytes -fn sha2_checksum(data: &[u8]) -> [u8; 4] { - let checksum = ::hash(data); - [checksum[0], checksum[1], checksum[2], checksum[3]] -} - -// Checked data -impl Encodable for CheckedData { - #[inline] - fn consensus_encode(&self, mut s: S) -> Result { - (self.0.len() as u32).consensus_encode(&mut s)?; - sha2_checksum(&self.0).consensus_encode(&mut s)?; - s.emit_slice(&self.0)?; - Ok(8 + self.0.len()) - } -} - -impl Decodable for CheckedData { - #[inline] - fn consensus_decode(mut d: D) -> Result { - let len = u32::consensus_decode(&mut d)?; - if len > MAX_VEC_SIZE as u32 { - return Err(self::Error::OversizedVectorAllocation { - requested: len as usize, - max: MAX_VEC_SIZE - }); - } - let checksum = <[u8; 4]>::consensus_decode(&mut d)?; - let mut ret = vec![0u8; len as usize]; - d.read_slice(&mut ret)?; - let expected_checksum = sha2_checksum(&ret); - if expected_checksum != checksum { - Err(self::Error::InvalidChecksum { - expected: expected_checksum, - actual: checksum, - }) - } else { - Ok(CheckedData(ret)) - } - } -} - -// References -impl<'a, T: Encodable> Encodable for &'a T { - fn consensus_encode(&self, s: S) -> Result { - (&**self).consensus_encode(s) - } -} - -impl<'a, T: Encodable> Encodable for &'a mut T { - fn consensus_encode(&self, s: S) -> Result { - (&**self).consensus_encode(s) - } -} - -impl Encodable for rc::Rc { - fn consensus_encode(&self, s: S) -> Result { - (&**self).consensus_encode(s) - } -} - -impl Encodable for sync::Arc { - fn consensus_encode(&self, s: S) -> Result { - (&**self).consensus_encode(s) - } -} - -// Tuples -macro_rules! tuple_encode { - ($($x:ident),*) => ( - impl <$($x: Encodable),*> Encodable for ($($x),*) { - #[inline] - #[allow(non_snake_case)] - fn consensus_encode( - &self, - mut s: S, - ) -> Result { - let &($(ref $x),*) = self; - let mut len = 0; - $(len += $x.consensus_encode(&mut s)?;)* - Ok(len) - } - } - - impl<$($x: Decodable),*> Decodable for ($($x),*) { - #[inline] - #[allow(non_snake_case)] - fn consensus_decode(mut d: D) -> Result { - Ok(($({let $x = Decodable::consensus_decode(&mut d)?; $x }),*)) - } - } - ); -} - -tuple_encode!(T0, T1); -tuple_encode!(T0, T1, T2); -tuple_encode!(T0, T1, T2, T3); -tuple_encode!(T0, T1, T2, T3, T4); -tuple_encode!(T0, T1, T2, T3, T4, T5); -tuple_encode!(T0, T1, T2, T3, T4, T5, T6); -tuple_encode!(T0, T1, T2, T3, T4, T5, T6, T7); - -impl Encodable for sha256d::Hash { - fn consensus_encode(&self, s: S) -> Result { - self.into_inner().consensus_encode(s) - } -} - -impl Decodable for sha256d::Hash { - fn consensus_decode(d: D) -> Result { - Ok(Self::from_inner(<::Inner>::consensus_decode(d)?)) - } -} - -impl Encodable for sha256::Hash { - fn consensus_encode(&self, s: S) -> Result { - self.into_inner().consensus_encode(s) - } -} - -impl Decodable for sha256::Hash { - fn consensus_decode(d: D) -> Result { - Ok(Self::from_inner(<::Inner>::consensus_decode(d)?)) - } -} diff --git a/dash-spv-masternode-processor/src/consensus/mod.rs b/dash-spv-masternode-processor/src/consensus/mod.rs deleted file mode 100644 index 60342ee1..00000000 --- a/dash-spv-masternode-processor/src/consensus/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod encode; -pub use self::encode::{Encodable, Decodable, WriteExt, ReadExt}; diff --git a/dash-spv-masternode-processor/src/crypto/bool.rs b/dash-spv-masternode-processor/src/crypto/bool.rs deleted file mode 100644 index 38824d3d..00000000 --- a/dash-spv-masternode-processor/src/crypto/bool.rs +++ /dev/null @@ -1,38 +0,0 @@ -use std::io; -use byte::ctx::Endian; -use byte::{BytesExt, check_len, LE, TryRead}; -use crate::consensus::Decodable; -use crate::crypto::byte_util::{AsBytes, BytesDecodable}; -use crate::impl_bytes_decodable; - -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] -pub struct Boolean(pub bool); - -impl<'a> TryRead<'a, Endian> for Boolean { - #[inline] - fn try_read(bytes: &'a [u8], _endian: Endian) -> byte::Result<(Self, usize)> { - check_len(bytes, 1)?; - Ok((Boolean(bytes[0] != 0), 1)) - } -} -impl Decodable for Boolean { - #[inline] - fn consensus_decode(d: D) -> Result { - match bool::consensus_decode(d) { - Ok(data) => Ok(Boolean(data)), - Err(err) => Err(err) - } - } -} - -impl AsBytes for Boolean { - fn as_bytes(&self) -> &[u8] { - if self.0 { - &[0x01] - } else { - &[0x00] - } - } -} - -impl_bytes_decodable!(Boolean); diff --git a/dash-spv-masternode-processor/src/crypto/mod.rs b/dash-spv-masternode-processor/src/crypto/mod.rs deleted file mode 100644 index 192825f2..00000000 --- a/dash-spv-masternode-processor/src/crypto/mod.rs +++ /dev/null @@ -1,17 +0,0 @@ -pub mod data_ops; -pub mod byte_util; -pub mod var_array; -pub mod var_bytes; -pub mod var_int; -pub mod bool; - -pub use self::var_array::VarArray; -pub use self::var_bytes::VarBytes; -pub use self::bool::Boolean; -pub use self::byte_util::UInt128; -pub use self::byte_util::UInt160; -pub use self::byte_util::UInt256; -pub use self::byte_util::UInt384; -pub use self::byte_util::UInt512; -pub use self::byte_util::UInt768; -pub use self::byte_util::ECPoint; diff --git a/dash-spv-masternode-processor/src/crypto/var_array.rs b/dash-spv-masternode-processor/src/crypto/var_array.rs deleted file mode 100644 index 1154fd59..00000000 --- a/dash-spv-masternode-processor/src/crypto/var_array.rs +++ /dev/null @@ -1,53 +0,0 @@ -use byte::{BytesExt, LE, Result, TryRead}; -use byte::ctx::Endian; -use crate::consensus::encode::VarInt; -use crate::crypto::byte_util::BytesDecodable; - -/// A variable-length array of generics -#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Debug)] -pub struct VarArray( - pub VarInt, - pub Vec, -); -impl VarArray { - #[inline] - pub fn len(&self) -> usize { - self.0.len() + self.1.len() - } - pub fn is_empty(&self) -> bool { - self.1.is_empty() - } - pub fn new(var_int: VarInt, arr: Vec) -> VarArray { - Self(var_int, arr) - } -} -impl<'a, T> TryRead<'a, Endian> for VarArray where T: TryRead<'a, Endian> { - #[inline] - fn try_read(bytes: &'a [u8], endian: Endian) -> Result<(Self, usize)> { - let offset = &mut 0; - let var_int = bytes.read_with::(offset, endian)?; - let arr_len = var_int.0 as usize; - let mut arr = Vec::::with_capacity(arr_len); - for _i in 0..arr_len { - arr.push(bytes.read_with::(offset, endian)?); - } - let var_arr = VarArray(var_int, arr); - let len = var_arr.len(); - Ok((var_arr, len)) - } -} -impl<'a, T> BytesDecodable<'a, VarArray> for VarArray where T: TryRead<'a, Endian>{ - #[inline] - fn from_bytes(bytes: &'a [u8], offset: &mut usize) -> Option { - let var_int: VarInt = VarInt::from_bytes(bytes, offset)?; - let arr_len = var_int.0 as usize; - let mut arr = Vec::::with_capacity(arr_len); - for _i in 0..arr_len { - match bytes.read_with::(offset, LE) { - Ok(data) => { arr.push(data); }, - Err(_err) => { return None; } - } - } - Some(VarArray(var_int, arr)) - } -} diff --git a/dash-spv-masternode-processor/src/crypto/var_bytes.rs b/dash-spv-masternode-processor/src/crypto/var_bytes.rs deleted file mode 100644 index ac6e010c..00000000 --- a/dash-spv-masternode-processor/src/crypto/var_bytes.rs +++ /dev/null @@ -1,39 +0,0 @@ -use byte::{BytesExt, LE, Result, TryRead}; -use byte::ctx::{Bytes, Endian}; -use crate::consensus::encode::VarInt; -use crate::crypto::byte_util::BytesDecodable; - -/// A variable-length bytes -#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug)] -pub struct VarBytes<'a>(pub VarInt, pub &'a [u8]); - -impl<'a> VarBytes<'a> { - #[inline] - pub fn len(&self) -> usize { - self.0.len() + self.1.len() - } - pub fn is_empty(&self) -> bool { - self.0.is_empty() - } -} - -impl<'a> TryRead<'a, Endian> for VarBytes<'a> { - #[inline] - fn try_read(bytes: &'a [u8], _endian: Endian) -> Result<(Self, usize)> { - let offset = &mut 0; - let var_int = bytes.read_with::(offset, LE)?; - let payload = bytes.read_with(offset, Bytes::Len(var_int.0 as usize))?; - let var_bytes = VarBytes(var_int, payload); - Ok((var_bytes, var_bytes.len())) - } -} -impl<'a> BytesDecodable<'a, VarBytes<'a>> for VarBytes<'a> { - #[inline] - fn from_bytes(bytes: &'a [u8], offset: &mut usize) -> Option { - let var_int: VarInt = VarInt::from_bytes(bytes, offset)?; - match bytes.read_with(offset, Bytes::Len(var_int.0 as usize)) { - Ok(data) => Some(VarBytes(var_int, data)), - Err(_err) => None - } - } -} diff --git a/dash-spv-masternode-processor/src/crypto/var_int.rs b/dash-spv-masternode-processor/src/crypto/var_int.rs deleted file mode 100644 index e18d47c3..00000000 --- a/dash-spv-masternode-processor/src/crypto/var_int.rs +++ /dev/null @@ -1,29 +0,0 @@ -use byte::ctx::Endian; -use byte::{BytesExt, check_len, LE, TryRead, TryWrite}; -use crate::consensus::{Decodable, Encodable}; -use crate::consensus::encode::VarInt; -use crate::crypto::byte_util::BytesDecodable; -use crate::impl_bytes_decodable; - -impl<'a> TryRead<'a, Endian> for VarInt { - #[inline] - fn try_read(bytes: &'a [u8], _endian: Endian) -> byte::Result<(Self, usize)> { - match VarInt::consensus_decode(bytes) { - Ok(data) => Ok((data, data.len())), - Err(_err) => Err(byte::Error::BadInput { err: "Error: VarInt" }) - } - } -} - -impl<'a> TryWrite for &'a VarInt { - #[inline] - fn try_write(self, bytes: &mut [u8], _ctx: ()) -> byte::Result { - check_len(bytes, self.len())?; - Ok(match self.consensus_encode(bytes) { - Ok(size) => size, - _ => 0 - }) - } -} - -impl_bytes_decodable!(VarInt); diff --git a/dash-spv-masternode-processor/src/fermented.rs b/dash-spv-masternode-processor/src/fermented.rs deleted file mode 100644 index f3d18f6c..00000000 --- a/dash-spv-masternode-processor/src/fermented.rs +++ /dev/null @@ -1 +0,0 @@ -# [allow (clippy :: let_and_return , clippy :: suspicious_else_formatting , clippy :: redundant_field_names , dead_code , redundant_semicolons , unused_braces , unused_imports , unused_unsafe , unused_variables , unused_qualifications)] pub mod types { pub mod crypto { pub mod byte_util { # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: crypto :: byte_util :: UInt128\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct UInt128 (* mut [u8 ; 16] ,) ; impl ferment_interfaces :: FFIConversion < crate :: crypto :: byte_util :: UInt128 > for UInt128 { unsafe fn ffi_from_const (ffi : * const UInt128) -> crate :: crypto :: byte_util :: UInt128 { let ffi_ref = & * ffi ; crate :: crypto :: byte_util :: UInt128 (* ffi_ref . 0 ,) } unsafe fn ffi_to_const (obj : crate :: crypto :: byte_util :: UInt128) -> * const UInt128 { ferment_interfaces :: boxed (UInt128 (ferment_interfaces :: boxed (obj . 0) ,)) } unsafe fn destroy (ffi : * mut UInt128) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for UInt128 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment_interfaces :: unbox_any (ffi_ref . 0) ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn UInt128_ctor (o_0 : * mut [u8 ; 16]) -> * mut UInt128 { ferment_interfaces :: boxed (UInt128 (o_0 ,)) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn UInt128_destroy (ffi : * mut UInt128) { ferment_interfaces :: unbox_any (ffi) ; } # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: crypto :: byte_util :: UInt160\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct UInt160 (* mut [u8 ; 20] ,) ; impl ferment_interfaces :: FFIConversion < crate :: crypto :: byte_util :: UInt160 > for UInt160 { unsafe fn ffi_from_const (ffi : * const UInt160) -> crate :: crypto :: byte_util :: UInt160 { let ffi_ref = & * ffi ; crate :: crypto :: byte_util :: UInt160 (* ffi_ref . 0 ,) } unsafe fn ffi_to_const (obj : crate :: crypto :: byte_util :: UInt160) -> * const UInt160 { ferment_interfaces :: boxed (UInt160 (ferment_interfaces :: boxed (obj . 0) ,)) } unsafe fn destroy (ffi : * mut UInt160) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for UInt160 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment_interfaces :: unbox_any (ffi_ref . 0) ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn UInt160_ctor (o_0 : * mut [u8 ; 20]) -> * mut UInt160 { ferment_interfaces :: boxed (UInt160 (o_0 ,)) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn UInt160_destroy (ffi : * mut UInt160) { ferment_interfaces :: unbox_any (ffi) ; } # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: crypto :: byte_util :: UInt256\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct UInt256 (* mut [u8 ; 32] ,) ; impl ferment_interfaces :: FFIConversion < crate :: crypto :: byte_util :: UInt256 > for UInt256 { unsafe fn ffi_from_const (ffi : * const UInt256) -> crate :: crypto :: byte_util :: UInt256 { let ffi_ref = & * ffi ; crate :: crypto :: byte_util :: UInt256 (* ffi_ref . 0 ,) } unsafe fn ffi_to_const (obj : crate :: crypto :: byte_util :: UInt256) -> * const UInt256 { ferment_interfaces :: boxed (UInt256 (ferment_interfaces :: boxed (obj . 0) ,)) } unsafe fn destroy (ffi : * mut UInt256) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for UInt256 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment_interfaces :: unbox_any (ffi_ref . 0) ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn UInt256_ctor (o_0 : * mut [u8 ; 32]) -> * mut UInt256 { ferment_interfaces :: boxed (UInt256 (o_0 ,)) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn UInt256_destroy (ffi : * mut UInt256) { ferment_interfaces :: unbox_any (ffi) ; } # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: crypto :: byte_util :: UInt768\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct UInt768 (* mut [u8 ; 96] ,) ; impl ferment_interfaces :: FFIConversion < crate :: crypto :: byte_util :: UInt768 > for UInt768 { unsafe fn ffi_from_const (ffi : * const UInt768) -> crate :: crypto :: byte_util :: UInt768 { let ffi_ref = & * ffi ; crate :: crypto :: byte_util :: UInt768 (* ffi_ref . 0 ,) } unsafe fn ffi_to_const (obj : crate :: crypto :: byte_util :: UInt768) -> * const UInt768 { ferment_interfaces :: boxed (UInt768 (ferment_interfaces :: boxed (obj . 0) ,)) } unsafe fn destroy (ffi : * mut UInt768) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for UInt768 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment_interfaces :: unbox_any (ffi_ref . 0) ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn UInt768_ctor (o_0 : * mut [u8 ; 96]) -> * mut UInt768 { ferment_interfaces :: boxed (UInt768 (o_0 ,)) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn UInt768_destroy (ffi : * mut UInt768) { ferment_interfaces :: unbox_any (ffi) ; } # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: crypto :: byte_util :: UInt384\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct UInt384 (* mut [u8 ; 48] ,) ; impl ferment_interfaces :: FFIConversion < crate :: crypto :: byte_util :: UInt384 > for UInt384 { unsafe fn ffi_from_const (ffi : * const UInt384) -> crate :: crypto :: byte_util :: UInt384 { let ffi_ref = & * ffi ; crate :: crypto :: byte_util :: UInt384 (* ffi_ref . 0 ,) } unsafe fn ffi_to_const (obj : crate :: crypto :: byte_util :: UInt384) -> * const UInt384 { ferment_interfaces :: boxed (UInt384 (ferment_interfaces :: boxed (obj . 0) ,)) } unsafe fn destroy (ffi : * mut UInt384) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for UInt384 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment_interfaces :: unbox_any (ffi_ref . 0) ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn UInt384_ctor (o_0 : * mut [u8 ; 48]) -> * mut UInt384 { ferment_interfaces :: boxed (UInt384 (o_0 ,)) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn UInt384_destroy (ffi : * mut UInt384) { ferment_interfaces :: unbox_any (ffi) ; } # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: crypto :: byte_util :: UInt512\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct UInt512 (* mut [u8 ; 64] ,) ; impl ferment_interfaces :: FFIConversion < crate :: crypto :: byte_util :: UInt512 > for UInt512 { unsafe fn ffi_from_const (ffi : * const UInt512) -> crate :: crypto :: byte_util :: UInt512 { let ffi_ref = & * ffi ; crate :: crypto :: byte_util :: UInt512 (* ffi_ref . 0 ,) } unsafe fn ffi_to_const (obj : crate :: crypto :: byte_util :: UInt512) -> * const UInt512 { ferment_interfaces :: boxed (UInt512 (ferment_interfaces :: boxed (obj . 0) ,)) } unsafe fn destroy (ffi : * mut UInt512) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for UInt512 { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment_interfaces :: unbox_any (ffi_ref . 0) ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn UInt512_ctor (o_0 : * mut [u8 ; 64]) -> * mut UInt512 { ferment_interfaces :: boxed (UInt512 (o_0 ,)) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn UInt512_destroy (ffi : * mut UInt512) { ferment_interfaces :: unbox_any (ffi) ; } } } pub mod tx { pub mod coinbase_transaction { # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: tx :: coinbase_transaction :: CoinbaseTransaction\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct CoinbaseTransaction { pub base : * mut crate :: fermented :: types :: tx :: transaction :: Transaction , pub coinbase_transaction_version : u16 , pub height : u32 , pub merkle_root_mn_list : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , pub merkle_root_llmq_list : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , pub best_cl_height_diff : u64 , pub best_cl_signature : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt768 , pub credit_pool_balance : i64 , } impl ferment_interfaces :: FFIConversion < crate :: tx :: coinbase_transaction :: CoinbaseTransaction > for CoinbaseTransaction { unsafe fn ffi_from_const (ffi : * const CoinbaseTransaction) -> crate :: tx :: coinbase_transaction :: CoinbaseTransaction { let ffi_ref = & * ffi ; crate :: tx :: coinbase_transaction :: CoinbaseTransaction { base : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . base) , coinbase_transaction_version : ffi_ref . coinbase_transaction_version , height : ffi_ref . height , merkle_root_mn_list : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . merkle_root_mn_list) , merkle_root_llmq_list : ferment_interfaces :: FFIConversion :: ffi_from_opt (ffi_ref . merkle_root_llmq_list) , best_cl_height_diff : ffi_ref . best_cl_height_diff , best_cl_signature : ferment_interfaces :: FFIConversion :: ffi_from_opt (ffi_ref . best_cl_signature) , credit_pool_balance : (ffi_ref . credit_pool_balance > 0) . then_some (ffi_ref . credit_pool_balance) , } } unsafe fn ffi_to_const (obj : crate :: tx :: coinbase_transaction :: CoinbaseTransaction) -> * const CoinbaseTransaction { ferment_interfaces :: boxed (CoinbaseTransaction { base : ferment_interfaces :: FFIConversion :: ffi_to (obj . base) , coinbase_transaction_version : obj . coinbase_transaction_version , height : obj . height , merkle_root_mn_list : ferment_interfaces :: FFIConversion :: ffi_to (obj . merkle_root_mn_list) , merkle_root_llmq_list : ferment_interfaces :: FFIConversion :: ffi_to_opt (obj . merkle_root_llmq_list) , best_cl_height_diff : obj . best_cl_height_diff , best_cl_signature : ferment_interfaces :: FFIConversion :: ffi_to_opt (obj . best_cl_signature) , credit_pool_balance : obj . credit_pool_balance . unwrap_or (0) , }) } unsafe fn destroy (ffi : * mut CoinbaseTransaction) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for CoinbaseTransaction { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment_interfaces :: unbox_any (ffi_ref . base) ; ; ; ; ferment_interfaces :: unbox_any (ffi_ref . merkle_root_mn_list) ; ; if ! ffi_ref . merkle_root_llmq_list . is_null () { ferment_interfaces :: unbox_any (ffi_ref . merkle_root_llmq_list) ; } ; ; if ! ffi_ref . best_cl_signature . is_null () { ferment_interfaces :: unbox_any (ffi_ref . best_cl_signature) ; } ; ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn CoinbaseTransaction_ctor (base : * mut crate :: fermented :: types :: tx :: transaction :: Transaction , coinbase_transaction_version : u16 , height : u32 , merkle_root_mn_list : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , merkle_root_llmq_list : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , best_cl_height_diff : u64 , best_cl_signature : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt768 , credit_pool_balance : i64) -> * mut CoinbaseTransaction { ferment_interfaces :: boxed (CoinbaseTransaction { base , coinbase_transaction_version , height , merkle_root_mn_list , merkle_root_llmq_list , best_cl_height_diff , best_cl_signature , credit_pool_balance , }) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn CoinbaseTransaction_destroy (ffi : * mut CoinbaseTransaction) { ferment_interfaces :: unbox_any (ffi) ; } } pub mod transaction { # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: tx :: transaction :: Transaction\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct Transaction { pub inputs : * mut crate :: fermented :: generics :: Vec_crate_tx_transaction_TransactionInput , pub outputs : * mut crate :: fermented :: generics :: Vec_crate_tx_transaction_TransactionOutput , pub lock_time : u32 , pub version : u16 , pub tx_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , pub tx_type : * mut crate :: fermented :: types :: tx :: transaction :: TransactionType , pub payload_offset : usize , pub block_height : u32 , } impl ferment_interfaces :: FFIConversion < crate :: tx :: transaction :: Transaction > for Transaction { unsafe fn ffi_from_const (ffi : * const Transaction) -> crate :: tx :: transaction :: Transaction { let ffi_ref = & * ffi ; crate :: tx :: transaction :: Transaction { inputs : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . inputs) , outputs : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . outputs) , lock_time : ffi_ref . lock_time , version : ffi_ref . version , tx_hash : ferment_interfaces :: FFIConversion :: ffi_from_opt (ffi_ref . tx_hash) , tx_type : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . tx_type) , payload_offset : ffi_ref . payload_offset , block_height : ffi_ref . block_height , } } unsafe fn ffi_to_const (obj : crate :: tx :: transaction :: Transaction) -> * const Transaction { ferment_interfaces :: boxed (Transaction { inputs : ferment_interfaces :: FFIConversion :: ffi_to (obj . inputs) , outputs : ferment_interfaces :: FFIConversion :: ffi_to (obj . outputs) , lock_time : obj . lock_time , version : obj . version , tx_hash : ferment_interfaces :: FFIConversion :: ffi_to_opt (obj . tx_hash) , tx_type : ferment_interfaces :: FFIConversion :: ffi_to (obj . tx_type) , payload_offset : obj . payload_offset , block_height : obj . block_height , }) } unsafe fn destroy (ffi : * mut Transaction) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for Transaction { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment_interfaces :: unbox_any (ffi_ref . inputs) ; ; ferment_interfaces :: unbox_any (ffi_ref . outputs) ; ; ; ; if ! ffi_ref . tx_hash . is_null () { ferment_interfaces :: unbox_any (ffi_ref . tx_hash) ; } ; ferment_interfaces :: unbox_any (ffi_ref . tx_type) ; ; ; ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn Transaction_ctor (inputs : * mut crate :: fermented :: generics :: Vec_crate_tx_transaction_TransactionInput , outputs : * mut crate :: fermented :: generics :: Vec_crate_tx_transaction_TransactionOutput , lock_time : u32 , version : u16 , tx_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , tx_type : * mut crate :: fermented :: types :: tx :: transaction :: TransactionType , payload_offset : usize , block_height : u32) -> * mut Transaction { ferment_interfaces :: boxed (Transaction { inputs , outputs , lock_time , version , tx_hash , tx_type , payload_offset , block_height , }) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn Transaction_destroy (ffi : * mut Transaction) { ferment_interfaces :: unbox_any (ffi) ; } # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: tx :: transaction :: TransactionOutput\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct TransactionOutput { pub amount : u64 , pub script : * mut crate :: fermented :: generics :: Vec_u8 , pub address : * mut crate :: fermented :: generics :: Vec_u8 , } impl ferment_interfaces :: FFIConversion < crate :: tx :: transaction :: TransactionOutput > for TransactionOutput { unsafe fn ffi_from_const (ffi : * const TransactionOutput) -> crate :: tx :: transaction :: TransactionOutput { let ffi_ref = & * ffi ; crate :: tx :: transaction :: TransactionOutput { amount : ffi_ref . amount , script : ferment_interfaces :: FFIConversion :: ffi_from_opt (ffi_ref . script) , address : ferment_interfaces :: FFIConversion :: ffi_from_opt (ffi_ref . address) , } } unsafe fn ffi_to_const (obj : crate :: tx :: transaction :: TransactionOutput) -> * const TransactionOutput { ferment_interfaces :: boxed (TransactionOutput { amount : obj . amount , script : match obj . script { Some (vec) => ferment_interfaces :: FFIConversion :: ffi_to (vec) , None => std :: ptr :: null_mut () , } , address : match obj . address { Some (vec) => ferment_interfaces :: FFIConversion :: ffi_to (vec) , None => std :: ptr :: null_mut () , } , }) } unsafe fn destroy (ffi : * mut TransactionOutput) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for TransactionOutput { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; if ! ffi_ref . script . is_null () { ferment_interfaces :: unbox_any (ffi_ref . script) ; } ; if ! ffi_ref . address . is_null () { ferment_interfaces :: unbox_any (ffi_ref . address) ; } ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn TransactionOutput_ctor (amount : u64 , script : * mut crate :: fermented :: generics :: Vec_u8 , address : * mut crate :: fermented :: generics :: Vec_u8) -> * mut TransactionOutput { ferment_interfaces :: boxed (TransactionOutput { amount , script , address , }) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn TransactionOutput_destroy (ffi : * mut TransactionOutput) { ferment_interfaces :: unbox_any (ffi) ; } # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: tx :: transaction :: TransactionInput\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct TransactionInput { pub input_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , pub index : u32 , pub script : * mut crate :: fermented :: generics :: Vec_u8 , pub signature : * mut crate :: fermented :: generics :: Vec_u8 , pub sequence : u32 , } impl ferment_interfaces :: FFIConversion < crate :: tx :: transaction :: TransactionInput > for TransactionInput { unsafe fn ffi_from_const (ffi : * const TransactionInput) -> crate :: tx :: transaction :: TransactionInput { let ffi_ref = & * ffi ; crate :: tx :: transaction :: TransactionInput { input_hash : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . input_hash) , index : ffi_ref . index , script : ferment_interfaces :: FFIConversion :: ffi_from_opt (ffi_ref . script) , signature : ferment_interfaces :: FFIConversion :: ffi_from_opt (ffi_ref . signature) , sequence : ffi_ref . sequence , } } unsafe fn ffi_to_const (obj : crate :: tx :: transaction :: TransactionInput) -> * const TransactionInput { ferment_interfaces :: boxed (TransactionInput { input_hash : ferment_interfaces :: FFIConversion :: ffi_to (obj . input_hash) , index : obj . index , script : match obj . script { Some (vec) => ferment_interfaces :: FFIConversion :: ffi_to (vec) , None => std :: ptr :: null_mut () , } , signature : match obj . signature { Some (vec) => ferment_interfaces :: FFIConversion :: ffi_to (vec) , None => std :: ptr :: null_mut () , } , sequence : obj . sequence , }) } unsafe fn destroy (ffi : * mut TransactionInput) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for TransactionInput { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment_interfaces :: unbox_any (ffi_ref . input_hash) ; ; ; if ! ffi_ref . script . is_null () { ferment_interfaces :: unbox_any (ffi_ref . script) ; } ; if ! ffi_ref . signature . is_null () { ferment_interfaces :: unbox_any (ffi_ref . signature) ; } ; ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn TransactionInput_ctor (input_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , index : u32 , script : * mut crate :: fermented :: generics :: Vec_u8 , signature : * mut crate :: fermented :: generics :: Vec_u8 , sequence : u32) -> * mut TransactionInput { ferment_interfaces :: boxed (TransactionInput { input_hash , index , script , signature , sequence , }) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn TransactionInput_destroy (ffi : * mut TransactionInput) { ferment_interfaces :: unbox_any (ffi) ; } # [doc = "FFI-representation of the TransactionType"] # [repr (C)] # [allow (non_camel_case_types)] # [derive (Clone)] pub enum TransactionType { Classic = 0 , ProviderRegistration = 1 , ProviderUpdateService = 2 , ProviderUpdateRegistrar = 3 , ProviderUpdateRevocation = 4 , Coinbase = 5 , QuorumCommitment = 6 , AssetLock = 8 , AssetUnlock = 9 , TypeMax = 10 , SubscriptionCloseAccount = 11 , Transition = 12 , CreditFunding = 255 , } impl ferment_interfaces :: FFIConversion < crate :: tx :: transaction :: TransactionType > for TransactionType { unsafe fn ffi_from_const (ffi : * const TransactionType) -> crate :: tx :: transaction :: TransactionType { let ffi_ref = & * ffi ; match ffi_ref { TransactionType :: Classic => crate :: tx :: transaction :: TransactionType :: Classic , TransactionType :: ProviderRegistration => crate :: tx :: transaction :: TransactionType :: ProviderRegistration , TransactionType :: ProviderUpdateService => crate :: tx :: transaction :: TransactionType :: ProviderUpdateService , TransactionType :: ProviderUpdateRegistrar => crate :: tx :: transaction :: TransactionType :: ProviderUpdateRegistrar , TransactionType :: ProviderUpdateRevocation => crate :: tx :: transaction :: TransactionType :: ProviderUpdateRevocation , TransactionType :: Coinbase => crate :: tx :: transaction :: TransactionType :: Coinbase , TransactionType :: QuorumCommitment => crate :: tx :: transaction :: TransactionType :: QuorumCommitment , TransactionType :: AssetLock => crate :: tx :: transaction :: TransactionType :: AssetLock , TransactionType :: AssetUnlock => crate :: tx :: transaction :: TransactionType :: AssetUnlock , TransactionType :: TypeMax => crate :: tx :: transaction :: TransactionType :: TypeMax , TransactionType :: SubscriptionCloseAccount => crate :: tx :: transaction :: TransactionType :: SubscriptionCloseAccount , TransactionType :: Transition => crate :: tx :: transaction :: TransactionType :: Transition , TransactionType :: CreditFunding => crate :: tx :: transaction :: TransactionType :: CreditFunding , } } unsafe fn ffi_to_const (obj : crate :: tx :: transaction :: TransactionType) -> * const TransactionType { ferment_interfaces :: boxed (match obj { crate :: tx :: transaction :: TransactionType :: Classic => TransactionType :: Classic , crate :: tx :: transaction :: TransactionType :: ProviderRegistration => TransactionType :: ProviderRegistration , crate :: tx :: transaction :: TransactionType :: ProviderUpdateService => TransactionType :: ProviderUpdateService , crate :: tx :: transaction :: TransactionType :: ProviderUpdateRegistrar => TransactionType :: ProviderUpdateRegistrar , crate :: tx :: transaction :: TransactionType :: ProviderUpdateRevocation => TransactionType :: ProviderUpdateRevocation , crate :: tx :: transaction :: TransactionType :: Coinbase => TransactionType :: Coinbase , crate :: tx :: transaction :: TransactionType :: QuorumCommitment => TransactionType :: QuorumCommitment , crate :: tx :: transaction :: TransactionType :: AssetLock => TransactionType :: AssetLock , crate :: tx :: transaction :: TransactionType :: AssetUnlock => TransactionType :: AssetUnlock , crate :: tx :: transaction :: TransactionType :: TypeMax => TransactionType :: TypeMax , crate :: tx :: transaction :: TransactionType :: SubscriptionCloseAccount => TransactionType :: SubscriptionCloseAccount , crate :: tx :: transaction :: TransactionType :: Transition => TransactionType :: Transition , crate :: tx :: transaction :: TransactionType :: CreditFunding => TransactionType :: CreditFunding , }) } unsafe fn destroy (ffi : * mut TransactionType) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for TransactionType { fn drop (& mut self) { unsafe { match self { TransactionType :: Classic => { } , TransactionType :: ProviderRegistration => { } , TransactionType :: ProviderUpdateService => { } , TransactionType :: ProviderUpdateRegistrar => { } , TransactionType :: ProviderUpdateRevocation => { } , TransactionType :: Coinbase => { } , TransactionType :: QuorumCommitment => { } , TransactionType :: AssetLock => { } , TransactionType :: AssetUnlock => { } , TransactionType :: TypeMax => { } , TransactionType :: SubscriptionCloseAccount => { } , TransactionType :: Transition => { } , TransactionType :: CreditFunding => { } , } } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn TransactionType_Classic_ctor () -> * mut TransactionType { ferment_interfaces :: boxed (TransactionType :: Classic) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn TransactionType_ProviderRegistration_ctor () -> * mut TransactionType { ferment_interfaces :: boxed (TransactionType :: ProviderRegistration) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn TransactionType_ProviderUpdateService_ctor () -> * mut TransactionType { ferment_interfaces :: boxed (TransactionType :: ProviderUpdateService) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn TransactionType_ProviderUpdateRegistrar_ctor () -> * mut TransactionType { ferment_interfaces :: boxed (TransactionType :: ProviderUpdateRegistrar) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn TransactionType_ProviderUpdateRevocation_ctor () -> * mut TransactionType { ferment_interfaces :: boxed (TransactionType :: ProviderUpdateRevocation) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn TransactionType_Coinbase_ctor () -> * mut TransactionType { ferment_interfaces :: boxed (TransactionType :: Coinbase) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn TransactionType_QuorumCommitment_ctor () -> * mut TransactionType { ferment_interfaces :: boxed (TransactionType :: QuorumCommitment) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn TransactionType_AssetLock_ctor () -> * mut TransactionType { ferment_interfaces :: boxed (TransactionType :: AssetLock) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn TransactionType_AssetUnlock_ctor () -> * mut TransactionType { ferment_interfaces :: boxed (TransactionType :: AssetUnlock) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn TransactionType_TypeMax_ctor () -> * mut TransactionType { ferment_interfaces :: boxed (TransactionType :: TypeMax) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn TransactionType_SubscriptionCloseAccount_ctor () -> * mut TransactionType { ferment_interfaces :: boxed (TransactionType :: SubscriptionCloseAccount) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn TransactionType_Transition_ctor () -> * mut TransactionType { ferment_interfaces :: boxed (TransactionType :: Transition) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn TransactionType_CreditFunding_ctor () -> * mut TransactionType { ferment_interfaces :: boxed (TransactionType :: CreditFunding) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn TransactionType_destroy (ffi : * mut TransactionType) { ferment_interfaces :: unbox_any (ffi) ; } } } pub mod processing { pub mod mn_listdiff_result { # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: processing :: mn_listdiff_result :: MNListDiffResult\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct MNListDiffResult { pub base_block_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , pub block_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , pub has_found_coinbase : bool , pub has_valid_coinbase : bool , pub has_valid_mn_list_root : bool , pub has_valid_llmq_list_root : bool , pub has_valid_quorums : bool , pub masternode_list : * mut crate :: fermented :: types :: models :: masternode_list :: MasternodeList , pub added_masternodes : * mut crate :: fermented :: generics :: std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_masternode_entry_MasternodeEntry , pub modified_masternodes : * mut crate :: fermented :: generics :: std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_masternode_entry_MasternodeEntry , pub added_quorums : * mut crate :: fermented :: generics :: Vec_crate_models_llmq_entry_LLMQEntry , pub needed_masternode_lists : * mut crate :: fermented :: generics :: Vec_crate_crypto_byte_util_UInt256 , } impl ferment_interfaces :: FFIConversion < crate :: processing :: mn_listdiff_result :: MNListDiffResult > for MNListDiffResult { unsafe fn ffi_from_const (ffi : * const MNListDiffResult) -> crate :: processing :: mn_listdiff_result :: MNListDiffResult { let ffi_ref = & * ffi ; crate :: processing :: mn_listdiff_result :: MNListDiffResult { base_block_hash : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . base_block_hash) , block_hash : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . block_hash) , has_found_coinbase : ffi_ref . has_found_coinbase , has_valid_coinbase : ffi_ref . has_valid_coinbase , has_valid_mn_list_root : ffi_ref . has_valid_mn_list_root , has_valid_llmq_list_root : ffi_ref . has_valid_llmq_list_root , has_valid_quorums : ffi_ref . has_valid_quorums , masternode_list : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . masternode_list) , added_masternodes : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . added_masternodes) , modified_masternodes : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . modified_masternodes) , added_quorums : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . added_quorums) , needed_masternode_lists : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . needed_masternode_lists) , } } unsafe fn ffi_to_const (obj : crate :: processing :: mn_listdiff_result :: MNListDiffResult) -> * const MNListDiffResult { ferment_interfaces :: boxed (MNListDiffResult { base_block_hash : ferment_interfaces :: FFIConversion :: ffi_to (obj . base_block_hash) , block_hash : ferment_interfaces :: FFIConversion :: ffi_to (obj . block_hash) , has_found_coinbase : obj . has_found_coinbase , has_valid_coinbase : obj . has_valid_coinbase , has_valid_mn_list_root : obj . has_valid_mn_list_root , has_valid_llmq_list_root : obj . has_valid_llmq_list_root , has_valid_quorums : obj . has_valid_quorums , masternode_list : ferment_interfaces :: FFIConversion :: ffi_to (obj . masternode_list) , added_masternodes : ferment_interfaces :: FFIConversion :: ffi_to (obj . added_masternodes) , modified_masternodes : ferment_interfaces :: FFIConversion :: ffi_to (obj . modified_masternodes) , added_quorums : ferment_interfaces :: FFIConversion :: ffi_to (obj . added_quorums) , needed_masternode_lists : ferment_interfaces :: FFIConversion :: ffi_to (obj . needed_masternode_lists) , }) } unsafe fn destroy (ffi : * mut MNListDiffResult) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for MNListDiffResult { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment_interfaces :: unbox_any (ffi_ref . base_block_hash) ; ; ferment_interfaces :: unbox_any (ffi_ref . block_hash) ; ; ; ; ; ; ; ferment_interfaces :: unbox_any (ffi_ref . masternode_list) ; ; ferment_interfaces :: unbox_any (ffi_ref . added_masternodes) ; ; ferment_interfaces :: unbox_any (ffi_ref . modified_masternodes) ; ; ferment_interfaces :: unbox_any (ffi_ref . added_quorums) ; ; ferment_interfaces :: unbox_any (ffi_ref . needed_masternode_lists) ; ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn MNListDiffResult_ctor (base_block_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , block_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , has_found_coinbase : bool , has_valid_coinbase : bool , has_valid_mn_list_root : bool , has_valid_llmq_list_root : bool , has_valid_quorums : bool , masternode_list : * mut crate :: fermented :: types :: models :: masternode_list :: MasternodeList , added_masternodes : * mut crate :: fermented :: generics :: std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_masternode_entry_MasternodeEntry , modified_masternodes : * mut crate :: fermented :: generics :: std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_masternode_entry_MasternodeEntry , added_quorums : * mut crate :: fermented :: generics :: Vec_crate_models_llmq_entry_LLMQEntry , needed_masternode_lists : * mut crate :: fermented :: generics :: Vec_crate_crypto_byte_util_UInt256) -> * mut MNListDiffResult { ferment_interfaces :: boxed (MNListDiffResult { base_block_hash , block_hash , has_found_coinbase , has_valid_coinbase , has_valid_mn_list_root , has_valid_llmq_list_root , has_valid_quorums , masternode_list , added_masternodes , modified_masternodes , added_quorums , needed_masternode_lists , }) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn MNListDiffResult_destroy (ffi : * mut MNListDiffResult) { ferment_interfaces :: unbox_any (ffi) ; } } pub mod qr_info_result { # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: processing :: qr_info_result :: QRInfoResult\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct QRInfoResult { pub result_at_tip : * mut crate :: fermented :: types :: processing :: mn_listdiff_result :: MNListDiffResult , pub result_at_h : * mut crate :: fermented :: types :: processing :: mn_listdiff_result :: MNListDiffResult , pub result_at_h_c : * mut crate :: fermented :: types :: processing :: mn_listdiff_result :: MNListDiffResult , pub result_at_h_2c : * mut crate :: fermented :: types :: processing :: mn_listdiff_result :: MNListDiffResult , pub result_at_h_3c : * mut crate :: fermented :: types :: processing :: mn_listdiff_result :: MNListDiffResult , pub result_at_h_4c : * mut crate :: fermented :: types :: processing :: mn_listdiff_result :: MNListDiffResult , pub snapshot_at_h_c : * mut crate :: fermented :: types :: models :: snapshot :: LLMQSnapshot , pub snapshot_at_h_2c : * mut crate :: fermented :: types :: models :: snapshot :: LLMQSnapshot , pub snapshot_at_h_3c : * mut crate :: fermented :: types :: models :: snapshot :: LLMQSnapshot , pub snapshot_at_h_4c : * mut crate :: fermented :: types :: models :: snapshot :: LLMQSnapshot , pub extra_share : bool , pub last_quorum_per_index : * mut crate :: fermented :: generics :: Vec_crate_models_llmq_entry_LLMQEntry , pub quorum_snapshot_list : * mut crate :: fermented :: generics :: Vec_crate_models_snapshot_LLMQSnapshot , pub mn_list_diff_list : * mut crate :: fermented :: generics :: Vec_crate_processing_mn_listdiff_result_MNListDiffResult , } impl ferment_interfaces :: FFIConversion < crate :: processing :: qr_info_result :: QRInfoResult > for QRInfoResult { unsafe fn ffi_from_const (ffi : * const QRInfoResult) -> crate :: processing :: qr_info_result :: QRInfoResult { let ffi_ref = & * ffi ; crate :: processing :: qr_info_result :: QRInfoResult { result_at_tip : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . result_at_tip) , result_at_h : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . result_at_h) , result_at_h_c : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . result_at_h_c) , result_at_h_2c : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . result_at_h_2c) , result_at_h_3c : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . result_at_h_3c) , result_at_h_4c : ferment_interfaces :: FFIConversion :: ffi_from_opt (ffi_ref . result_at_h_4c) , snapshot_at_h_c : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . snapshot_at_h_c) , snapshot_at_h_2c : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . snapshot_at_h_2c) , snapshot_at_h_3c : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . snapshot_at_h_3c) , snapshot_at_h_4c : ferment_interfaces :: FFIConversion :: ffi_from_opt (ffi_ref . snapshot_at_h_4c) , extra_share : ffi_ref . extra_share , last_quorum_per_index : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . last_quorum_per_index) , quorum_snapshot_list : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . quorum_snapshot_list) , mn_list_diff_list : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . mn_list_diff_list) , } } unsafe fn ffi_to_const (obj : crate :: processing :: qr_info_result :: QRInfoResult) -> * const QRInfoResult { ferment_interfaces :: boxed (QRInfoResult { result_at_tip : ferment_interfaces :: FFIConversion :: ffi_to (obj . result_at_tip) , result_at_h : ferment_interfaces :: FFIConversion :: ffi_to (obj . result_at_h) , result_at_h_c : ferment_interfaces :: FFIConversion :: ffi_to (obj . result_at_h_c) , result_at_h_2c : ferment_interfaces :: FFIConversion :: ffi_to (obj . result_at_h_2c) , result_at_h_3c : ferment_interfaces :: FFIConversion :: ffi_to (obj . result_at_h_3c) , result_at_h_4c : ferment_interfaces :: FFIConversion :: ffi_to_opt (obj . result_at_h_4c) , snapshot_at_h_c : ferment_interfaces :: FFIConversion :: ffi_to (obj . snapshot_at_h_c) , snapshot_at_h_2c : ferment_interfaces :: FFIConversion :: ffi_to (obj . snapshot_at_h_2c) , snapshot_at_h_3c : ferment_interfaces :: FFIConversion :: ffi_to (obj . snapshot_at_h_3c) , snapshot_at_h_4c : ferment_interfaces :: FFIConversion :: ffi_to_opt (obj . snapshot_at_h_4c) , extra_share : obj . extra_share , last_quorum_per_index : ferment_interfaces :: FFIConversion :: ffi_to (obj . last_quorum_per_index) , quorum_snapshot_list : ferment_interfaces :: FFIConversion :: ffi_to (obj . quorum_snapshot_list) , mn_list_diff_list : ferment_interfaces :: FFIConversion :: ffi_to (obj . mn_list_diff_list) , }) } unsafe fn destroy (ffi : * mut QRInfoResult) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for QRInfoResult { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment_interfaces :: unbox_any (ffi_ref . result_at_tip) ; ; ferment_interfaces :: unbox_any (ffi_ref . result_at_h) ; ; ferment_interfaces :: unbox_any (ffi_ref . result_at_h_c) ; ; ferment_interfaces :: unbox_any (ffi_ref . result_at_h_2c) ; ; ferment_interfaces :: unbox_any (ffi_ref . result_at_h_3c) ; ; if ! ffi_ref . result_at_h_4c . is_null () { ferment_interfaces :: unbox_any (ffi_ref . result_at_h_4c) ; } ; ferment_interfaces :: unbox_any (ffi_ref . snapshot_at_h_c) ; ; ferment_interfaces :: unbox_any (ffi_ref . snapshot_at_h_2c) ; ; ferment_interfaces :: unbox_any (ffi_ref . snapshot_at_h_3c) ; ; if ! ffi_ref . snapshot_at_h_4c . is_null () { ferment_interfaces :: unbox_any (ffi_ref . snapshot_at_h_4c) ; } ; ; ferment_interfaces :: unbox_any (ffi_ref . last_quorum_per_index) ; ; ferment_interfaces :: unbox_any (ffi_ref . quorum_snapshot_list) ; ; ferment_interfaces :: unbox_any (ffi_ref . mn_list_diff_list) ; ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn QRInfoResult_ctor (result_at_tip : * mut crate :: fermented :: types :: processing :: mn_listdiff_result :: MNListDiffResult , result_at_h : * mut crate :: fermented :: types :: processing :: mn_listdiff_result :: MNListDiffResult , result_at_h_c : * mut crate :: fermented :: types :: processing :: mn_listdiff_result :: MNListDiffResult , result_at_h_2c : * mut crate :: fermented :: types :: processing :: mn_listdiff_result :: MNListDiffResult , result_at_h_3c : * mut crate :: fermented :: types :: processing :: mn_listdiff_result :: MNListDiffResult , result_at_h_4c : * mut crate :: fermented :: types :: processing :: mn_listdiff_result :: MNListDiffResult , snapshot_at_h_c : * mut crate :: fermented :: types :: models :: snapshot :: LLMQSnapshot , snapshot_at_h_2c : * mut crate :: fermented :: types :: models :: snapshot :: LLMQSnapshot , snapshot_at_h_3c : * mut crate :: fermented :: types :: models :: snapshot :: LLMQSnapshot , snapshot_at_h_4c : * mut crate :: fermented :: types :: models :: snapshot :: LLMQSnapshot , extra_share : bool , last_quorum_per_index : * mut crate :: fermented :: generics :: Vec_crate_models_llmq_entry_LLMQEntry , quorum_snapshot_list : * mut crate :: fermented :: generics :: Vec_crate_models_snapshot_LLMQSnapshot , mn_list_diff_list : * mut crate :: fermented :: generics :: Vec_crate_processing_mn_listdiff_result_MNListDiffResult) -> * mut QRInfoResult { ferment_interfaces :: boxed (QRInfoResult { result_at_tip , result_at_h , result_at_h_c , result_at_h_2c , result_at_h_3c , result_at_h_4c , snapshot_at_h_c , snapshot_at_h_2c , snapshot_at_h_3c , snapshot_at_h_4c , extra_share , last_quorum_per_index , quorum_snapshot_list , mn_list_diff_list , }) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn QRInfoResult_destroy (ffi : * mut QRInfoResult) { ferment_interfaces :: unbox_any (ffi) ; } } pub mod processing_error { # [doc = "FFI-representation of the ProcessingError"] # [repr (C)] # [allow (non_camel_case_types)] # [derive (Clone)] pub enum ProcessingError { None = 0 , PersistInRetrieval = 1 , LocallyStored = 2 , ParseError = 3 , HasNoBaseBlockHash = 4 , UnknownBlockHash = 5 , } impl ferment_interfaces :: FFIConversion < crate :: processing :: processing_error :: ProcessingError > for ProcessingError { unsafe fn ffi_from_const (ffi : * const ProcessingError) -> crate :: processing :: processing_error :: ProcessingError { let ffi_ref = & * ffi ; match ffi_ref { ProcessingError :: None => crate :: processing :: processing_error :: ProcessingError :: None , ProcessingError :: PersistInRetrieval => crate :: processing :: processing_error :: ProcessingError :: PersistInRetrieval , ProcessingError :: LocallyStored => crate :: processing :: processing_error :: ProcessingError :: LocallyStored , ProcessingError :: ParseError => crate :: processing :: processing_error :: ProcessingError :: ParseError , ProcessingError :: HasNoBaseBlockHash => crate :: processing :: processing_error :: ProcessingError :: HasNoBaseBlockHash , ProcessingError :: UnknownBlockHash => crate :: processing :: processing_error :: ProcessingError :: UnknownBlockHash , } } unsafe fn ffi_to_const (obj : crate :: processing :: processing_error :: ProcessingError) -> * const ProcessingError { ferment_interfaces :: boxed (match obj { crate :: processing :: processing_error :: ProcessingError :: None => ProcessingError :: None , crate :: processing :: processing_error :: ProcessingError :: PersistInRetrieval => ProcessingError :: PersistInRetrieval , crate :: processing :: processing_error :: ProcessingError :: LocallyStored => ProcessingError :: LocallyStored , crate :: processing :: processing_error :: ProcessingError :: ParseError => ProcessingError :: ParseError , crate :: processing :: processing_error :: ProcessingError :: HasNoBaseBlockHash => ProcessingError :: HasNoBaseBlockHash , crate :: processing :: processing_error :: ProcessingError :: UnknownBlockHash => ProcessingError :: UnknownBlockHash , }) } unsafe fn destroy (ffi : * mut ProcessingError) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for ProcessingError { fn drop (& mut self) { unsafe { match self { ProcessingError :: None => { } , ProcessingError :: PersistInRetrieval => { } , ProcessingError :: LocallyStored => { } , ProcessingError :: ParseError => { } , ProcessingError :: HasNoBaseBlockHash => { } , ProcessingError :: UnknownBlockHash => { } , } } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn ProcessingError_None_ctor () -> * mut ProcessingError { ferment_interfaces :: boxed (ProcessingError :: None) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn ProcessingError_PersistInRetrieval_ctor () -> * mut ProcessingError { ferment_interfaces :: boxed (ProcessingError :: PersistInRetrieval) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn ProcessingError_LocallyStored_ctor () -> * mut ProcessingError { ferment_interfaces :: boxed (ProcessingError :: LocallyStored) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn ProcessingError_ParseError_ctor () -> * mut ProcessingError { ferment_interfaces :: boxed (ProcessingError :: ParseError) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn ProcessingError_HasNoBaseBlockHash_ctor () -> * mut ProcessingError { ferment_interfaces :: boxed (ProcessingError :: HasNoBaseBlockHash) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn ProcessingError_UnknownBlockHash_ctor () -> * mut ProcessingError { ferment_interfaces :: boxed (ProcessingError :: UnknownBlockHash) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn ProcessingError_destroy (ffi : * mut ProcessingError) { ferment_interfaces :: unbox_any (ffi) ; } } } pub mod common { pub mod llmq_snapshot_skip_mode { # [doc = "FFI-representation of the LLMQSnapshotSkipMode"] # [repr (C)] # [allow (non_camel_case_types)] # [derive (Clone)] pub enum LLMQSnapshotSkipMode { NoSkipping = 0 , SkipFirst = 1 , SkipExcept = 2 , SkipAll = 3 , } impl ferment_interfaces :: FFIConversion < crate :: common :: llmq_snapshot_skip_mode :: LLMQSnapshotSkipMode > for LLMQSnapshotSkipMode { unsafe fn ffi_from_const (ffi : * const LLMQSnapshotSkipMode) -> crate :: common :: llmq_snapshot_skip_mode :: LLMQSnapshotSkipMode { let ffi_ref = & * ffi ; match ffi_ref { LLMQSnapshotSkipMode :: NoSkipping => crate :: common :: llmq_snapshot_skip_mode :: LLMQSnapshotSkipMode :: NoSkipping , LLMQSnapshotSkipMode :: SkipFirst => crate :: common :: llmq_snapshot_skip_mode :: LLMQSnapshotSkipMode :: SkipFirst , LLMQSnapshotSkipMode :: SkipExcept => crate :: common :: llmq_snapshot_skip_mode :: LLMQSnapshotSkipMode :: SkipExcept , LLMQSnapshotSkipMode :: SkipAll => crate :: common :: llmq_snapshot_skip_mode :: LLMQSnapshotSkipMode :: SkipAll , } } unsafe fn ffi_to_const (obj : crate :: common :: llmq_snapshot_skip_mode :: LLMQSnapshotSkipMode) -> * const LLMQSnapshotSkipMode { ferment_interfaces :: boxed (match obj { crate :: common :: llmq_snapshot_skip_mode :: LLMQSnapshotSkipMode :: NoSkipping => LLMQSnapshotSkipMode :: NoSkipping , crate :: common :: llmq_snapshot_skip_mode :: LLMQSnapshotSkipMode :: SkipFirst => LLMQSnapshotSkipMode :: SkipFirst , crate :: common :: llmq_snapshot_skip_mode :: LLMQSnapshotSkipMode :: SkipExcept => LLMQSnapshotSkipMode :: SkipExcept , crate :: common :: llmq_snapshot_skip_mode :: LLMQSnapshotSkipMode :: SkipAll => LLMQSnapshotSkipMode :: SkipAll , }) } unsafe fn destroy (ffi : * mut LLMQSnapshotSkipMode) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for LLMQSnapshotSkipMode { fn drop (& mut self) { unsafe { match self { LLMQSnapshotSkipMode :: NoSkipping => { } , LLMQSnapshotSkipMode :: SkipFirst => { } , LLMQSnapshotSkipMode :: SkipExcept => { } , LLMQSnapshotSkipMode :: SkipAll => { } , } } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQSnapshotSkipMode_NoSkipping_ctor () -> * mut LLMQSnapshotSkipMode { ferment_interfaces :: boxed (LLMQSnapshotSkipMode :: NoSkipping) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQSnapshotSkipMode_SkipFirst_ctor () -> * mut LLMQSnapshotSkipMode { ferment_interfaces :: boxed (LLMQSnapshotSkipMode :: SkipFirst) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQSnapshotSkipMode_SkipExcept_ctor () -> * mut LLMQSnapshotSkipMode { ferment_interfaces :: boxed (LLMQSnapshotSkipMode :: SkipExcept) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQSnapshotSkipMode_SkipAll_ctor () -> * mut LLMQSnapshotSkipMode { ferment_interfaces :: boxed (LLMQSnapshotSkipMode :: SkipAll) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQSnapshotSkipMode_destroy (ffi : * mut LLMQSnapshotSkipMode) { ferment_interfaces :: unbox_any (ffi) ; } } pub mod socket_address { # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: common :: socket_address :: SocketAddress\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct SocketAddress { pub ip_address : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt128 , pub port : u16 , } impl ferment_interfaces :: FFIConversion < crate :: common :: socket_address :: SocketAddress > for SocketAddress { unsafe fn ffi_from_const (ffi : * const SocketAddress) -> crate :: common :: socket_address :: SocketAddress { let ffi_ref = & * ffi ; crate :: common :: socket_address :: SocketAddress { ip_address : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . ip_address) , port : ffi_ref . port , } } unsafe fn ffi_to_const (obj : crate :: common :: socket_address :: SocketAddress) -> * const SocketAddress { ferment_interfaces :: boxed (SocketAddress { ip_address : ferment_interfaces :: FFIConversion :: ffi_to (obj . ip_address) , port : obj . port , }) } unsafe fn destroy (ffi : * mut SocketAddress) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for SocketAddress { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment_interfaces :: unbox_any (ffi_ref . ip_address) ; ; ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn SocketAddress_ctor (ip_address : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt128 , port : u16) -> * mut SocketAddress { ferment_interfaces :: boxed (SocketAddress { ip_address , port , }) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn SocketAddress_destroy (ffi : * mut SocketAddress) { ferment_interfaces :: unbox_any (ffi) ; } } pub mod masternode_type { # [doc = "FFI-representation of the MasternodeType"] # [repr (C)] # [allow (non_camel_case_types)] # [derive (Clone)] pub enum MasternodeType { Regular = 0 , HighPerformance = 1 , } impl ferment_interfaces :: FFIConversion < crate :: common :: masternode_type :: MasternodeType > for MasternodeType { unsafe fn ffi_from_const (ffi : * const MasternodeType) -> crate :: common :: masternode_type :: MasternodeType { let ffi_ref = & * ffi ; match ffi_ref { MasternodeType :: Regular => crate :: common :: masternode_type :: MasternodeType :: Regular , MasternodeType :: HighPerformance => crate :: common :: masternode_type :: MasternodeType :: HighPerformance , } } unsafe fn ffi_to_const (obj : crate :: common :: masternode_type :: MasternodeType) -> * const MasternodeType { ferment_interfaces :: boxed (match obj { crate :: common :: masternode_type :: MasternodeType :: Regular => MasternodeType :: Regular , crate :: common :: masternode_type :: MasternodeType :: HighPerformance => MasternodeType :: HighPerformance , }) } unsafe fn destroy (ffi : * mut MasternodeType) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for MasternodeType { fn drop (& mut self) { unsafe { match self { MasternodeType :: Regular => { } , MasternodeType :: HighPerformance => { } , } } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn MasternodeType_Regular_ctor () -> * mut MasternodeType { ferment_interfaces :: boxed (MasternodeType :: Regular) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn MasternodeType_HighPerformance_ctor () -> * mut MasternodeType { ferment_interfaces :: boxed (MasternodeType :: HighPerformance) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn MasternodeType_destroy (ffi : * mut MasternodeType) { ferment_interfaces :: unbox_any (ffi) ; } } pub mod bitset { # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: common :: bitset :: Bitset\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct Bitset { pub count : usize , pub bitset : * mut crate :: fermented :: generics :: Vec_u8 , } impl ferment_interfaces :: FFIConversion < crate :: common :: bitset :: Bitset > for Bitset { unsafe fn ffi_from_const (ffi : * const Bitset) -> crate :: common :: bitset :: Bitset { let ffi_ref = & * ffi ; crate :: common :: bitset :: Bitset { count : ffi_ref . count , bitset : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . bitset) , } } unsafe fn ffi_to_const (obj : crate :: common :: bitset :: Bitset) -> * const Bitset { ferment_interfaces :: boxed (Bitset { count : obj . count , bitset : ferment_interfaces :: FFIConversion :: ffi_to (obj . bitset) , }) } unsafe fn destroy (ffi : * mut Bitset) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for Bitset { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment_interfaces :: unbox_any (ffi_ref . bitset) ; ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn Bitset_ctor (count : usize , bitset : * mut crate :: fermented :: generics :: Vec_u8) -> * mut Bitset { ferment_interfaces :: boxed (Bitset { count , bitset , }) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn Bitset_destroy (ffi : * mut Bitset) { ferment_interfaces :: unbox_any (ffi) ; } } pub mod block { # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: common :: block :: Block\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct Block { pub height : u32 , pub hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , } impl ferment_interfaces :: FFIConversion < crate :: common :: block :: Block > for Block { unsafe fn ffi_from_const (ffi : * const Block) -> crate :: common :: block :: Block { let ffi_ref = & * ffi ; crate :: common :: block :: Block { height : ffi_ref . height , hash : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . hash) , } } unsafe fn ffi_to_const (obj : crate :: common :: block :: Block) -> * const Block { ferment_interfaces :: boxed (Block { height : obj . height , hash : ferment_interfaces :: FFIConversion :: ffi_to (obj . hash) , }) } unsafe fn destroy (ffi : * mut Block) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for Block { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment_interfaces :: unbox_any (ffi_ref . hash) ; ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn Block_ctor (height : u32 , hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256) -> * mut Block { ferment_interfaces :: boxed (Block { height , hash , }) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn Block_destroy (ffi : * mut Block) { ferment_interfaces :: unbox_any (ffi) ; } } pub mod llmq_version { # [doc = "FFI-representation of the LLMQVersion"] # [repr (C)] # [allow (non_camel_case_types)] # [derive (Clone)] pub enum LLMQVersion { Default = 1 , Indexed = 2 , BLSBasicDefault = 3 , BLSBasicIndexed = 4 , } impl ferment_interfaces :: FFIConversion < crate :: common :: llmq_version :: LLMQVersion > for LLMQVersion { unsafe fn ffi_from_const (ffi : * const LLMQVersion) -> crate :: common :: llmq_version :: LLMQVersion { let ffi_ref = & * ffi ; match ffi_ref { LLMQVersion :: Default => crate :: common :: llmq_version :: LLMQVersion :: Default , LLMQVersion :: Indexed => crate :: common :: llmq_version :: LLMQVersion :: Indexed , LLMQVersion :: BLSBasicDefault => crate :: common :: llmq_version :: LLMQVersion :: BLSBasicDefault , LLMQVersion :: BLSBasicIndexed => crate :: common :: llmq_version :: LLMQVersion :: BLSBasicIndexed , } } unsafe fn ffi_to_const (obj : crate :: common :: llmq_version :: LLMQVersion) -> * const LLMQVersion { ferment_interfaces :: boxed (match obj { crate :: common :: llmq_version :: LLMQVersion :: Default => LLMQVersion :: Default , crate :: common :: llmq_version :: LLMQVersion :: Indexed => LLMQVersion :: Indexed , crate :: common :: llmq_version :: LLMQVersion :: BLSBasicDefault => LLMQVersion :: BLSBasicDefault , crate :: common :: llmq_version :: LLMQVersion :: BLSBasicIndexed => LLMQVersion :: BLSBasicIndexed , }) } unsafe fn destroy (ffi : * mut LLMQVersion) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for LLMQVersion { fn drop (& mut self) { unsafe { match self { LLMQVersion :: Default => { } , LLMQVersion :: Indexed => { } , LLMQVersion :: BLSBasicDefault => { } , LLMQVersion :: BLSBasicIndexed => { } , } } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQVersion_Default_ctor () -> * mut LLMQVersion { ferment_interfaces :: boxed (LLMQVersion :: Default) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQVersion_Indexed_ctor () -> * mut LLMQVersion { ferment_interfaces :: boxed (LLMQVersion :: Indexed) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQVersion_BLSBasicDefault_ctor () -> * mut LLMQVersion { ferment_interfaces :: boxed (LLMQVersion :: BLSBasicDefault) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQVersion_BLSBasicIndexed_ctor () -> * mut LLMQVersion { ferment_interfaces :: boxed (LLMQVersion :: BLSBasicIndexed) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQVersion_destroy (ffi : * mut LLMQVersion) { ferment_interfaces :: unbox_any (ffi) ; } } } pub mod models { pub mod snapshot { # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: models :: snapshot :: LLMQSnapshot\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct LLMQSnapshot { pub member_list : * mut crate :: fermented :: generics :: Vec_u8 , pub skip_list : * mut crate :: fermented :: generics :: Vec_i32 , pub skip_list_mode : * mut crate :: fermented :: types :: common :: llmq_snapshot_skip_mode :: LLMQSnapshotSkipMode , } impl ferment_interfaces :: FFIConversion < crate :: models :: snapshot :: LLMQSnapshot > for LLMQSnapshot { unsafe fn ffi_from_const (ffi : * const LLMQSnapshot) -> crate :: models :: snapshot :: LLMQSnapshot { let ffi_ref = & * ffi ; crate :: models :: snapshot :: LLMQSnapshot { member_list : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . member_list) , skip_list : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . skip_list) , skip_list_mode : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . skip_list_mode) , } } unsafe fn ffi_to_const (obj : crate :: models :: snapshot :: LLMQSnapshot) -> * const LLMQSnapshot { ferment_interfaces :: boxed (LLMQSnapshot { member_list : ferment_interfaces :: FFIConversion :: ffi_to (obj . member_list) , skip_list : ferment_interfaces :: FFIConversion :: ffi_to (obj . skip_list) , skip_list_mode : ferment_interfaces :: FFIConversion :: ffi_to (obj . skip_list_mode) , }) } unsafe fn destroy (ffi : * mut LLMQSnapshot) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for LLMQSnapshot { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment_interfaces :: unbox_any (ffi_ref . member_list) ; ; ferment_interfaces :: unbox_any (ffi_ref . skip_list) ; ; ferment_interfaces :: unbox_any (ffi_ref . skip_list_mode) ; ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQSnapshot_ctor (member_list : * mut crate :: fermented :: generics :: Vec_u8 , skip_list : * mut crate :: fermented :: generics :: Vec_i32 , skip_list_mode : * mut crate :: fermented :: types :: common :: llmq_snapshot_skip_mode :: LLMQSnapshotSkipMode) -> * mut LLMQSnapshot { ferment_interfaces :: boxed (LLMQSnapshot { member_list , skip_list , skip_list_mode , }) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQSnapshot_destroy (ffi : * mut LLMQSnapshot) { ferment_interfaces :: unbox_any (ffi) ; } } pub mod llmq_indexed_hash { # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: models :: llmq_indexed_hash :: LLMQIndexedHash\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct LLMQIndexedHash { pub index : u32 , pub hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , } impl ferment_interfaces :: FFIConversion < crate :: models :: llmq_indexed_hash :: LLMQIndexedHash > for LLMQIndexedHash { unsafe fn ffi_from_const (ffi : * const LLMQIndexedHash) -> crate :: models :: llmq_indexed_hash :: LLMQIndexedHash { let ffi_ref = & * ffi ; crate :: models :: llmq_indexed_hash :: LLMQIndexedHash { index : ffi_ref . index , hash : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . hash) , } } unsafe fn ffi_to_const (obj : crate :: models :: llmq_indexed_hash :: LLMQIndexedHash) -> * const LLMQIndexedHash { ferment_interfaces :: boxed (LLMQIndexedHash { index : obj . index , hash : ferment_interfaces :: FFIConversion :: ffi_to (obj . hash) , }) } unsafe fn destroy (ffi : * mut LLMQIndexedHash) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for LLMQIndexedHash { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ferment_interfaces :: unbox_any (ffi_ref . hash) ; ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQIndexedHash_ctor (index : u32 , hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256) -> * mut LLMQIndexedHash { ferment_interfaces :: boxed (LLMQIndexedHash { index , hash , }) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQIndexedHash_destroy (ffi : * mut LLMQIndexedHash) { ferment_interfaces :: unbox_any (ffi) ; } } pub mod llmq_entry { # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: models :: llmq_entry :: LLMQEntry\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct LLMQEntry { pub version : * mut crate :: fermented :: types :: common :: llmq_version :: LLMQVersion , pub llmq_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , pub index : u16 , pub public_key : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt384 , pub threshold_signature : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt768 , pub verification_vector_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , pub all_commitment_aggregated_signature : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt768 , pub llmq_type : * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType , pub signers : * mut crate :: fermented :: types :: common :: bitset :: Bitset , pub valid_members : * mut crate :: fermented :: types :: common :: bitset :: Bitset , pub entry_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , pub verified : bool , pub saved : bool , pub commitment_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , } impl ferment_interfaces :: FFIConversion < crate :: models :: llmq_entry :: LLMQEntry > for LLMQEntry { unsafe fn ffi_from_const (ffi : * const LLMQEntry) -> crate :: models :: llmq_entry :: LLMQEntry { let ffi_ref = & * ffi ; crate :: models :: llmq_entry :: LLMQEntry { version : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . version) , llmq_hash : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . llmq_hash) , index : (ffi_ref . index > 0) . then_some (ffi_ref . index) , public_key : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . public_key) , threshold_signature : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . threshold_signature) , verification_vector_hash : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . verification_vector_hash) , all_commitment_aggregated_signature : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . all_commitment_aggregated_signature) , llmq_type : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . llmq_type) , signers : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . signers) , valid_members : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . valid_members) , entry_hash : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . entry_hash) , verified : ffi_ref . verified , saved : ffi_ref . saved , commitment_hash : ferment_interfaces :: FFIConversion :: ffi_from_opt (ffi_ref . commitment_hash) , } } unsafe fn ffi_to_const (obj : crate :: models :: llmq_entry :: LLMQEntry) -> * const LLMQEntry { ferment_interfaces :: boxed (LLMQEntry { version : ferment_interfaces :: FFIConversion :: ffi_to (obj . version) , llmq_hash : ferment_interfaces :: FFIConversion :: ffi_to (obj . llmq_hash) , index : obj . index . unwrap_or (0) , public_key : ferment_interfaces :: FFIConversion :: ffi_to (obj . public_key) , threshold_signature : ferment_interfaces :: FFIConversion :: ffi_to (obj . threshold_signature) , verification_vector_hash : ferment_interfaces :: FFIConversion :: ffi_to (obj . verification_vector_hash) , all_commitment_aggregated_signature : ferment_interfaces :: FFIConversion :: ffi_to (obj . all_commitment_aggregated_signature) , llmq_type : ferment_interfaces :: FFIConversion :: ffi_to (obj . llmq_type) , signers : ferment_interfaces :: FFIConversion :: ffi_to (obj . signers) , valid_members : ferment_interfaces :: FFIConversion :: ffi_to (obj . valid_members) , entry_hash : ferment_interfaces :: FFIConversion :: ffi_to (obj . entry_hash) , verified : obj . verified , saved : obj . saved , commitment_hash : ferment_interfaces :: FFIConversion :: ffi_to_opt (obj . commitment_hash) , }) } unsafe fn destroy (ffi : * mut LLMQEntry) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for LLMQEntry { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment_interfaces :: unbox_any (ffi_ref . version) ; ; ferment_interfaces :: unbox_any (ffi_ref . llmq_hash) ; ; ; ferment_interfaces :: unbox_any (ffi_ref . public_key) ; ; ferment_interfaces :: unbox_any (ffi_ref . threshold_signature) ; ; ferment_interfaces :: unbox_any (ffi_ref . verification_vector_hash) ; ; ferment_interfaces :: unbox_any (ffi_ref . all_commitment_aggregated_signature) ; ; ferment_interfaces :: unbox_any (ffi_ref . llmq_type) ; ; ferment_interfaces :: unbox_any (ffi_ref . signers) ; ; ferment_interfaces :: unbox_any (ffi_ref . valid_members) ; ; ferment_interfaces :: unbox_any (ffi_ref . entry_hash) ; ; ; ; if ! ffi_ref . commitment_hash . is_null () { ferment_interfaces :: unbox_any (ffi_ref . commitment_hash) ; } ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQEntry_ctor (version : * mut crate :: fermented :: types :: common :: llmq_version :: LLMQVersion , llmq_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , index : u16 , public_key : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt384 , threshold_signature : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt768 , verification_vector_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , all_commitment_aggregated_signature : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt768 , llmq_type : * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType , signers : * mut crate :: fermented :: types :: common :: bitset :: Bitset , valid_members : * mut crate :: fermented :: types :: common :: bitset :: Bitset , entry_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , verified : bool , saved : bool , commitment_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256) -> * mut LLMQEntry { ferment_interfaces :: boxed (LLMQEntry { version , llmq_hash , index , public_key , threshold_signature , verification_vector_hash , all_commitment_aggregated_signature , llmq_type , signers , valid_members , entry_hash , verified , saved , commitment_hash , }) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQEntry_destroy (ffi : * mut LLMQEntry) { ferment_interfaces :: unbox_any (ffi) ; } } pub mod masternode_list { # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: models :: masternode_list :: MasternodeList\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct MasternodeList { pub block_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , pub known_height : u32 , pub masternode_merkle_root : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , pub llmq_merkle_root : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , pub masternodes : * mut crate :: fermented :: generics :: std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_masternode_entry_MasternodeEntry , pub quorums : * mut crate :: fermented :: generics :: std_collections_Map_keys_crate_chain_common_llmq_type_LLMQType_values_std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_llmq_entry_LLMQEntry , } impl ferment_interfaces :: FFIConversion < crate :: models :: masternode_list :: MasternodeList > for MasternodeList { unsafe fn ffi_from_const (ffi : * const MasternodeList) -> crate :: models :: masternode_list :: MasternodeList { let ffi_ref = & * ffi ; crate :: models :: masternode_list :: MasternodeList { block_hash : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . block_hash) , known_height : ffi_ref . known_height , masternode_merkle_root : ferment_interfaces :: FFIConversion :: ffi_from_opt (ffi_ref . masternode_merkle_root) , llmq_merkle_root : ferment_interfaces :: FFIConversion :: ffi_from_opt (ffi_ref . llmq_merkle_root) , masternodes : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . masternodes) , quorums : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . quorums) , } } unsafe fn ffi_to_const (obj : crate :: models :: masternode_list :: MasternodeList) -> * const MasternodeList { ferment_interfaces :: boxed (MasternodeList { block_hash : ferment_interfaces :: FFIConversion :: ffi_to (obj . block_hash) , known_height : obj . known_height , masternode_merkle_root : ferment_interfaces :: FFIConversion :: ffi_to_opt (obj . masternode_merkle_root) , llmq_merkle_root : ferment_interfaces :: FFIConversion :: ffi_to_opt (obj . llmq_merkle_root) , masternodes : ferment_interfaces :: FFIConversion :: ffi_to (obj . masternodes) , quorums : ferment_interfaces :: FFIConversion :: ffi_to (obj . quorums) , }) } unsafe fn destroy (ffi : * mut MasternodeList) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for MasternodeList { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment_interfaces :: unbox_any (ffi_ref . block_hash) ; ; ; if ! ffi_ref . masternode_merkle_root . is_null () { ferment_interfaces :: unbox_any (ffi_ref . masternode_merkle_root) ; } ; if ! ffi_ref . llmq_merkle_root . is_null () { ferment_interfaces :: unbox_any (ffi_ref . llmq_merkle_root) ; } ; ferment_interfaces :: unbox_any (ffi_ref . masternodes) ; ; ferment_interfaces :: unbox_any (ffi_ref . quorums) ; ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn MasternodeList_ctor (block_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , known_height : u32 , masternode_merkle_root : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , llmq_merkle_root : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , masternodes : * mut crate :: fermented :: generics :: std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_masternode_entry_MasternodeEntry , quorums : * mut crate :: fermented :: generics :: std_collections_Map_keys_crate_chain_common_llmq_type_LLMQType_values_std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_llmq_entry_LLMQEntry) -> * mut MasternodeList { ferment_interfaces :: boxed (MasternodeList { block_hash , known_height , masternode_merkle_root , llmq_merkle_root , masternodes , quorums , }) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn MasternodeList_destroy (ffi : * mut MasternodeList) { ferment_interfaces :: unbox_any (ffi) ; } } pub mod masternode_entry { # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: models :: masternode_entry :: MasternodeEntry\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct MasternodeEntry { pub provider_registration_transaction_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , pub confirmed_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , pub confirmed_hash_hashed_with_provider_registration_transaction_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , pub socket_address : * mut crate :: fermented :: types :: common :: socket_address :: SocketAddress , pub operator_public_key : * mut crate :: fermented :: types :: models :: operator_public_key :: OperatorPublicKey , pub previous_operator_public_keys : * mut crate :: fermented :: generics :: std_collections_Map_keys_crate_common_block_Block_values_crate_models_operator_public_key_OperatorPublicKey , pub previous_entry_hashes : * mut crate :: fermented :: generics :: std_collections_Map_keys_crate_common_block_Block_values_crate_crypto_byte_util_UInt256 , pub previous_validity : * mut crate :: fermented :: generics :: std_collections_Map_keys_crate_common_block_Block_values_bool , pub known_confirmed_at_height : u32 , pub update_height : u32 , pub key_id_voting : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt160 , pub is_valid : bool , pub mn_type : * mut crate :: fermented :: types :: common :: masternode_type :: MasternodeType , pub platform_http_port : u16 , pub platform_node_id : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt160 , pub entry_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , } impl ferment_interfaces :: FFIConversion < crate :: models :: masternode_entry :: MasternodeEntry > for MasternodeEntry { unsafe fn ffi_from_const (ffi : * const MasternodeEntry) -> crate :: models :: masternode_entry :: MasternodeEntry { let ffi_ref = & * ffi ; crate :: models :: masternode_entry :: MasternodeEntry { provider_registration_transaction_hash : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . provider_registration_transaction_hash) , confirmed_hash : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . confirmed_hash) , confirmed_hash_hashed_with_provider_registration_transaction_hash : ferment_interfaces :: FFIConversion :: ffi_from_opt (ffi_ref . confirmed_hash_hashed_with_provider_registration_transaction_hash) , socket_address : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . socket_address) , operator_public_key : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . operator_public_key) , previous_operator_public_keys : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . previous_operator_public_keys) , previous_entry_hashes : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . previous_entry_hashes) , previous_validity : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . previous_validity) , known_confirmed_at_height : (ffi_ref . known_confirmed_at_height > 0) . then_some (ffi_ref . known_confirmed_at_height) , update_height : ffi_ref . update_height , key_id_voting : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . key_id_voting) , is_valid : ffi_ref . is_valid , mn_type : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . mn_type) , platform_http_port : ffi_ref . platform_http_port , platform_node_id : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . platform_node_id) , entry_hash : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . entry_hash) , } } unsafe fn ffi_to_const (obj : crate :: models :: masternode_entry :: MasternodeEntry) -> * const MasternodeEntry { ferment_interfaces :: boxed (MasternodeEntry { provider_registration_transaction_hash : ferment_interfaces :: FFIConversion :: ffi_to (obj . provider_registration_transaction_hash) , confirmed_hash : ferment_interfaces :: FFIConversion :: ffi_to (obj . confirmed_hash) , confirmed_hash_hashed_with_provider_registration_transaction_hash : ferment_interfaces :: FFIConversion :: ffi_to_opt (obj . confirmed_hash_hashed_with_provider_registration_transaction_hash) , socket_address : ferment_interfaces :: FFIConversion :: ffi_to (obj . socket_address) , operator_public_key : ferment_interfaces :: FFIConversion :: ffi_to (obj . operator_public_key) , previous_operator_public_keys : ferment_interfaces :: FFIConversion :: ffi_to (obj . previous_operator_public_keys) , previous_entry_hashes : ferment_interfaces :: FFIConversion :: ffi_to (obj . previous_entry_hashes) , previous_validity : ferment_interfaces :: FFIConversion :: ffi_to (obj . previous_validity) , known_confirmed_at_height : obj . known_confirmed_at_height . unwrap_or (0) , update_height : obj . update_height , key_id_voting : ferment_interfaces :: FFIConversion :: ffi_to (obj . key_id_voting) , is_valid : obj . is_valid , mn_type : ferment_interfaces :: FFIConversion :: ffi_to (obj . mn_type) , platform_http_port : obj . platform_http_port , platform_node_id : ferment_interfaces :: FFIConversion :: ffi_to (obj . platform_node_id) , entry_hash : ferment_interfaces :: FFIConversion :: ffi_to (obj . entry_hash) , }) } unsafe fn destroy (ffi : * mut MasternodeEntry) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for MasternodeEntry { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment_interfaces :: unbox_any (ffi_ref . provider_registration_transaction_hash) ; ; ferment_interfaces :: unbox_any (ffi_ref . confirmed_hash) ; ; if ! ffi_ref . confirmed_hash_hashed_with_provider_registration_transaction_hash . is_null () { ferment_interfaces :: unbox_any (ffi_ref . confirmed_hash_hashed_with_provider_registration_transaction_hash) ; } ; ferment_interfaces :: unbox_any (ffi_ref . socket_address) ; ; ferment_interfaces :: unbox_any (ffi_ref . operator_public_key) ; ; ferment_interfaces :: unbox_any (ffi_ref . previous_operator_public_keys) ; ; ferment_interfaces :: unbox_any (ffi_ref . previous_entry_hashes) ; ; ferment_interfaces :: unbox_any (ffi_ref . previous_validity) ; ; ; ; ferment_interfaces :: unbox_any (ffi_ref . key_id_voting) ; ; ; ferment_interfaces :: unbox_any (ffi_ref . mn_type) ; ; ; ferment_interfaces :: unbox_any (ffi_ref . platform_node_id) ; ; ferment_interfaces :: unbox_any (ffi_ref . entry_hash) ; ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn MasternodeEntry_ctor (provider_registration_transaction_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , confirmed_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , confirmed_hash_hashed_with_provider_registration_transaction_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , socket_address : * mut crate :: fermented :: types :: common :: socket_address :: SocketAddress , operator_public_key : * mut crate :: fermented :: types :: models :: operator_public_key :: OperatorPublicKey , previous_operator_public_keys : * mut crate :: fermented :: generics :: std_collections_Map_keys_crate_common_block_Block_values_crate_models_operator_public_key_OperatorPublicKey , previous_entry_hashes : * mut crate :: fermented :: generics :: std_collections_Map_keys_crate_common_block_Block_values_crate_crypto_byte_util_UInt256 , previous_validity : * mut crate :: fermented :: generics :: std_collections_Map_keys_crate_common_block_Block_values_bool , known_confirmed_at_height : u32 , update_height : u32 , key_id_voting : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt160 , is_valid : bool , mn_type : * mut crate :: fermented :: types :: common :: masternode_type :: MasternodeType , platform_http_port : u16 , platform_node_id : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt160 , entry_hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256) -> * mut MasternodeEntry { ferment_interfaces :: boxed (MasternodeEntry { provider_registration_transaction_hash , confirmed_hash , confirmed_hash_hashed_with_provider_registration_transaction_hash , socket_address , operator_public_key , previous_operator_public_keys , previous_entry_hashes , previous_validity , known_confirmed_at_height , update_height , key_id_voting , is_valid , mn_type , platform_http_port , platform_node_id , entry_hash , }) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn MasternodeEntry_destroy (ffi : * mut MasternodeEntry) { ferment_interfaces :: unbox_any (ffi) ; } } pub mod operator_public_key { # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: models :: operator_public_key :: OperatorPublicKey\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct OperatorPublicKey { pub data : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt384 , pub version : u16 , } impl ferment_interfaces :: FFIConversion < crate :: models :: operator_public_key :: OperatorPublicKey > for OperatorPublicKey { unsafe fn ffi_from_const (ffi : * const OperatorPublicKey) -> crate :: models :: operator_public_key :: OperatorPublicKey { let ffi_ref = & * ffi ; crate :: models :: operator_public_key :: OperatorPublicKey { data : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . data) , version : ffi_ref . version , } } unsafe fn ffi_to_const (obj : crate :: models :: operator_public_key :: OperatorPublicKey) -> * const OperatorPublicKey { ferment_interfaces :: boxed (OperatorPublicKey { data : ferment_interfaces :: FFIConversion :: ffi_to (obj . data) , version : obj . version , }) } unsafe fn destroy (ffi : * mut OperatorPublicKey) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for OperatorPublicKey { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment_interfaces :: unbox_any (ffi_ref . data) ; ; ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn OperatorPublicKey_ctor (data : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt384 , version : u16) -> * mut OperatorPublicKey { ferment_interfaces :: boxed (OperatorPublicKey { data , version , }) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn OperatorPublicKey_destroy (ffi : * mut OperatorPublicKey) { ferment_interfaces :: unbox_any (ffi) ; } } pub mod llmq_typed_hash { # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: models :: llmq_typed_hash :: LLMQTypedHash\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct LLMQTypedHash { pub llmq_type : * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType , pub hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , } impl ferment_interfaces :: FFIConversion < crate :: models :: llmq_typed_hash :: LLMQTypedHash > for LLMQTypedHash { unsafe fn ffi_from_const (ffi : * const LLMQTypedHash) -> crate :: models :: llmq_typed_hash :: LLMQTypedHash { let ffi_ref = & * ffi ; crate :: models :: llmq_typed_hash :: LLMQTypedHash { llmq_type : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . llmq_type) , hash : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . hash) , } } unsafe fn ffi_to_const (obj : crate :: models :: llmq_typed_hash :: LLMQTypedHash) -> * const LLMQTypedHash { ferment_interfaces :: boxed (LLMQTypedHash { llmq_type : ferment_interfaces :: FFIConversion :: ffi_to (obj . llmq_type) , hash : ferment_interfaces :: FFIConversion :: ffi_to (obj . hash) , }) } unsafe fn destroy (ffi : * mut LLMQTypedHash) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for LLMQTypedHash { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment_interfaces :: unbox_any (ffi_ref . llmq_type) ; ; ferment_interfaces :: unbox_any (ffi_ref . hash) ; ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQTypedHash_ctor (llmq_type : * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType , hash : * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256) -> * mut LLMQTypedHash { ferment_interfaces :: boxed (LLMQTypedHash { llmq_type , hash , }) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQTypedHash_destroy (ffi : * mut LLMQTypedHash) { ferment_interfaces :: unbox_any (ffi) ; } } } pub mod chain { pub mod common { pub mod llmq_type { # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: chain :: common :: llmq_type :: LLMQParams\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct LLMQParams { pub r#type : * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType , pub name : * mut std :: os :: raw :: c_char , pub size : u32 , pub min_size : u32 , pub threshold : u32 , pub dkg_params : * mut crate :: fermented :: types :: chain :: common :: llmq_type :: DKGParams , pub signing_active_quorum_count : u32 , pub keep_old_connections : u32 , pub recovery_members : u32 , } impl ferment_interfaces :: FFIConversion < crate :: chain :: common :: llmq_type :: LLMQParams > for LLMQParams { unsafe fn ffi_from_const (ffi : * const LLMQParams) -> crate :: chain :: common :: llmq_type :: LLMQParams { let ffi_ref = & * ffi ; crate :: chain :: common :: llmq_type :: LLMQParams { r#type : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . r#type) , name : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . name) , size : ffi_ref . size , min_size : ffi_ref . min_size , threshold : ffi_ref . threshold , dkg_params : ferment_interfaces :: FFIConversion :: ffi_from (ffi_ref . dkg_params) , signing_active_quorum_count : ffi_ref . signing_active_quorum_count , keep_old_connections : ffi_ref . keep_old_connections , recovery_members : ffi_ref . recovery_members , } } unsafe fn ffi_to_const (obj : crate :: chain :: common :: llmq_type :: LLMQParams) -> * const LLMQParams { ferment_interfaces :: boxed (LLMQParams { r#type : ferment_interfaces :: FFIConversion :: ffi_to (obj . r#type) , name : ferment_interfaces :: FFIConversion :: ffi_to (obj . name) , size : obj . size , min_size : obj . min_size , threshold : obj . threshold , dkg_params : ferment_interfaces :: FFIConversion :: ffi_to (obj . dkg_params) , signing_active_quorum_count : obj . signing_active_quorum_count , keep_old_connections : obj . keep_old_connections , recovery_members : obj . recovery_members , }) } unsafe fn destroy (ffi : * mut LLMQParams) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for LLMQParams { fn drop (& mut self) { unsafe { let ffi_ref = self ; ferment_interfaces :: unbox_any (ffi_ref . r#type) ; ; < std :: os :: raw :: c_char as ferment_interfaces :: FFIConversion < & str >> :: destroy (ffi_ref . name) ; ; ; ; ferment_interfaces :: unbox_any (ffi_ref . dkg_params) ; ; ; ; ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQParams_ctor (r#type : * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType , name : * mut std :: os :: raw :: c_char , size : u32 , min_size : u32 , threshold : u32 , dkg_params : * mut crate :: fermented :: types :: chain :: common :: llmq_type :: DKGParams , signing_active_quorum_count : u32 , keep_old_connections : u32 , recovery_members : u32) -> * mut LLMQParams { ferment_interfaces :: boxed (LLMQParams { r#type , name , size , min_size , threshold , dkg_params , signing_active_quorum_count , keep_old_connections , recovery_members , }) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQParams_destroy (ffi : * mut LLMQParams) { ferment_interfaces :: unbox_any (ffi) ; } # [doc = "FFI-representation of the # [doc = \"FFI-representation of the crate :: chain :: common :: llmq_type :: DKGParams\"]"] # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct DKGParams { pub interval : u32 , pub phase_blocks : u32 , pub mining_window_start : u32 , pub mining_window_end : u32 , pub bad_votes_threshold : u32 , } impl ferment_interfaces :: FFIConversion < crate :: chain :: common :: llmq_type :: DKGParams > for DKGParams { unsafe fn ffi_from_const (ffi : * const DKGParams) -> crate :: chain :: common :: llmq_type :: DKGParams { let ffi_ref = & * ffi ; crate :: chain :: common :: llmq_type :: DKGParams { interval : ffi_ref . interval , phase_blocks : ffi_ref . phase_blocks , mining_window_start : ffi_ref . mining_window_start , mining_window_end : ffi_ref . mining_window_end , bad_votes_threshold : ffi_ref . bad_votes_threshold , } } unsafe fn ffi_to_const (obj : crate :: chain :: common :: llmq_type :: DKGParams) -> * const DKGParams { ferment_interfaces :: boxed (DKGParams { interval : obj . interval , phase_blocks : obj . phase_blocks , mining_window_start : obj . mining_window_start , mining_window_end : obj . mining_window_end , bad_votes_threshold : obj . bad_votes_threshold , }) } unsafe fn destroy (ffi : * mut DKGParams) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for DKGParams { fn drop (& mut self) { unsafe { let ffi_ref = self ; ; ; ; ; ; } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn DKGParams_ctor (interval : u32 , phase_blocks : u32 , mining_window_start : u32 , mining_window_end : u32 , bad_votes_threshold : u32) -> * mut DKGParams { ferment_interfaces :: boxed (DKGParams { interval , phase_blocks , mining_window_start , mining_window_end , bad_votes_threshold , }) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn DKGParams_destroy (ffi : * mut DKGParams) { ferment_interfaces :: unbox_any (ffi) ; } # [doc = "FFI-representation of the LLMQType"] # [repr (C)] # [allow (non_camel_case_types)] # [derive (Clone)] pub enum LLMQType { LlmqtypeUnknown = 0 , Llmqtype50_60 = 1 , Llmqtype400_60 = 2 , Llmqtype400_85 = 3 , Llmqtype100_67 = 4 , Llmqtype60_75 = 5 , Llmqtype25_67 = 6 , LlmqtypeTest = 100 , LlmqtypeDevnet = 101 , LlmqtypeTestV17 = 102 , LlmqtypeTestDIP0024 = 103 , LlmqtypeTestInstantSend = 104 , LlmqtypeDevnetDIP0024 = 105 , LlmqtypeTestnetPlatform = 106 , LlmqtypeDevnetPlatform = 107 , } impl ferment_interfaces :: FFIConversion < crate :: chain :: common :: llmq_type :: LLMQType > for LLMQType { unsafe fn ffi_from_const (ffi : * const LLMQType) -> crate :: chain :: common :: llmq_type :: LLMQType { let ffi_ref = & * ffi ; match ffi_ref { LLMQType :: LlmqtypeUnknown => crate :: chain :: common :: llmq_type :: LLMQType :: LlmqtypeUnknown , LLMQType :: Llmqtype50_60 => crate :: chain :: common :: llmq_type :: LLMQType :: Llmqtype50_60 , LLMQType :: Llmqtype400_60 => crate :: chain :: common :: llmq_type :: LLMQType :: Llmqtype400_60 , LLMQType :: Llmqtype400_85 => crate :: chain :: common :: llmq_type :: LLMQType :: Llmqtype400_85 , LLMQType :: Llmqtype100_67 => crate :: chain :: common :: llmq_type :: LLMQType :: Llmqtype100_67 , LLMQType :: Llmqtype60_75 => crate :: chain :: common :: llmq_type :: LLMQType :: Llmqtype60_75 , LLMQType :: Llmqtype25_67 => crate :: chain :: common :: llmq_type :: LLMQType :: Llmqtype25_67 , LLMQType :: LlmqtypeTest => crate :: chain :: common :: llmq_type :: LLMQType :: LlmqtypeTest , LLMQType :: LlmqtypeDevnet => crate :: chain :: common :: llmq_type :: LLMQType :: LlmqtypeDevnet , LLMQType :: LlmqtypeTestV17 => crate :: chain :: common :: llmq_type :: LLMQType :: LlmqtypeTestV17 , LLMQType :: LlmqtypeTestDIP0024 => crate :: chain :: common :: llmq_type :: LLMQType :: LlmqtypeTestDIP0024 , LLMQType :: LlmqtypeTestInstantSend => crate :: chain :: common :: llmq_type :: LLMQType :: LlmqtypeTestInstantSend , LLMQType :: LlmqtypeDevnetDIP0024 => crate :: chain :: common :: llmq_type :: LLMQType :: LlmqtypeDevnetDIP0024 , LLMQType :: LlmqtypeTestnetPlatform => crate :: chain :: common :: llmq_type :: LLMQType :: LlmqtypeTestnetPlatform , LLMQType :: LlmqtypeDevnetPlatform => crate :: chain :: common :: llmq_type :: LLMQType :: LlmqtypeDevnetPlatform , } } unsafe fn ffi_to_const (obj : crate :: chain :: common :: llmq_type :: LLMQType) -> * const LLMQType { ferment_interfaces :: boxed (match obj { crate :: chain :: common :: llmq_type :: LLMQType :: LlmqtypeUnknown => LLMQType :: LlmqtypeUnknown , crate :: chain :: common :: llmq_type :: LLMQType :: Llmqtype50_60 => LLMQType :: Llmqtype50_60 , crate :: chain :: common :: llmq_type :: LLMQType :: Llmqtype400_60 => LLMQType :: Llmqtype400_60 , crate :: chain :: common :: llmq_type :: LLMQType :: Llmqtype400_85 => LLMQType :: Llmqtype400_85 , crate :: chain :: common :: llmq_type :: LLMQType :: Llmqtype100_67 => LLMQType :: Llmqtype100_67 , crate :: chain :: common :: llmq_type :: LLMQType :: Llmqtype60_75 => LLMQType :: Llmqtype60_75 , crate :: chain :: common :: llmq_type :: LLMQType :: Llmqtype25_67 => LLMQType :: Llmqtype25_67 , crate :: chain :: common :: llmq_type :: LLMQType :: LlmqtypeTest => LLMQType :: LlmqtypeTest , crate :: chain :: common :: llmq_type :: LLMQType :: LlmqtypeDevnet => LLMQType :: LlmqtypeDevnet , crate :: chain :: common :: llmq_type :: LLMQType :: LlmqtypeTestV17 => LLMQType :: LlmqtypeTestV17 , crate :: chain :: common :: llmq_type :: LLMQType :: LlmqtypeTestDIP0024 => LLMQType :: LlmqtypeTestDIP0024 , crate :: chain :: common :: llmq_type :: LLMQType :: LlmqtypeTestInstantSend => LLMQType :: LlmqtypeTestInstantSend , crate :: chain :: common :: llmq_type :: LLMQType :: LlmqtypeDevnetDIP0024 => LLMQType :: LlmqtypeDevnetDIP0024 , crate :: chain :: common :: llmq_type :: LLMQType :: LlmqtypeTestnetPlatform => LLMQType :: LlmqtypeTestnetPlatform , crate :: chain :: common :: llmq_type :: LLMQType :: LlmqtypeDevnetPlatform => LLMQType :: LlmqtypeDevnetPlatform , }) } unsafe fn destroy (ffi : * mut LLMQType) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for LLMQType { fn drop (& mut self) { unsafe { match self { LLMQType :: LlmqtypeUnknown => { } , LLMQType :: Llmqtype50_60 => { } , LLMQType :: Llmqtype400_60 => { } , LLMQType :: Llmqtype400_85 => { } , LLMQType :: Llmqtype100_67 => { } , LLMQType :: Llmqtype60_75 => { } , LLMQType :: Llmqtype25_67 => { } , LLMQType :: LlmqtypeTest => { } , LLMQType :: LlmqtypeDevnet => { } , LLMQType :: LlmqtypeTestV17 => { } , LLMQType :: LlmqtypeTestDIP0024 => { } , LLMQType :: LlmqtypeTestInstantSend => { } , LLMQType :: LlmqtypeDevnetDIP0024 => { } , LLMQType :: LlmqtypeTestnetPlatform => { } , LLMQType :: LlmqtypeDevnetPlatform => { } , } } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQType_LlmqtypeUnknown_ctor () -> * mut LLMQType { ferment_interfaces :: boxed (LLMQType :: LlmqtypeUnknown) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQType_Llmqtype50_60_ctor () -> * mut LLMQType { ferment_interfaces :: boxed (LLMQType :: Llmqtype50_60) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQType_Llmqtype400_60_ctor () -> * mut LLMQType { ferment_interfaces :: boxed (LLMQType :: Llmqtype400_60) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQType_Llmqtype400_85_ctor () -> * mut LLMQType { ferment_interfaces :: boxed (LLMQType :: Llmqtype400_85) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQType_Llmqtype100_67_ctor () -> * mut LLMQType { ferment_interfaces :: boxed (LLMQType :: Llmqtype100_67) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQType_Llmqtype60_75_ctor () -> * mut LLMQType { ferment_interfaces :: boxed (LLMQType :: Llmqtype60_75) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQType_Llmqtype25_67_ctor () -> * mut LLMQType { ferment_interfaces :: boxed (LLMQType :: Llmqtype25_67) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQType_LlmqtypeTest_ctor () -> * mut LLMQType { ferment_interfaces :: boxed (LLMQType :: LlmqtypeTest) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQType_LlmqtypeDevnet_ctor () -> * mut LLMQType { ferment_interfaces :: boxed (LLMQType :: LlmqtypeDevnet) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQType_LlmqtypeTestV17_ctor () -> * mut LLMQType { ferment_interfaces :: boxed (LLMQType :: LlmqtypeTestV17) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQType_LlmqtypeTestDIP0024_ctor () -> * mut LLMQType { ferment_interfaces :: boxed (LLMQType :: LlmqtypeTestDIP0024) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQType_LlmqtypeTestInstantSend_ctor () -> * mut LLMQType { ferment_interfaces :: boxed (LLMQType :: LlmqtypeTestInstantSend) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQType_LlmqtypeDevnetDIP0024_ctor () -> * mut LLMQType { ferment_interfaces :: boxed (LLMQType :: LlmqtypeDevnetDIP0024) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQType_LlmqtypeTestnetPlatform_ctor () -> * mut LLMQType { ferment_interfaces :: boxed (LLMQType :: LlmqtypeTestnetPlatform) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQType_LlmqtypeDevnetPlatform_ctor () -> * mut LLMQType { ferment_interfaces :: boxed (LLMQType :: LlmqtypeDevnetPlatform) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn LLMQType_destroy (ffi : * mut LLMQType) { ferment_interfaces :: unbox_any (ffi) ; } } pub mod chain_type { # [doc = "FFI-representation of the ChainType"] # [repr (C)] # [allow (non_camel_case_types)] # [derive (Clone)] pub enum ChainType { MainNet , TestNet , DevNet (* mut crate :: fermented :: types :: chain :: common :: chain_type :: DevnetType ,) , } impl ferment_interfaces :: FFIConversion < crate :: chain :: common :: chain_type :: ChainType > for ChainType { unsafe fn ffi_from_const (ffi : * const ChainType) -> crate :: chain :: common :: chain_type :: ChainType { let ffi_ref = & * ffi ; match ffi_ref { ChainType :: MainNet => crate :: chain :: common :: chain_type :: ChainType :: MainNet , ChainType :: TestNet => crate :: chain :: common :: chain_type :: ChainType :: TestNet , ChainType :: DevNet (o_0 ,) => crate :: chain :: common :: chain_type :: ChainType :: DevNet (ferment_interfaces :: FFIConversion :: ffi_from (* o_0) ,) , } } unsafe fn ffi_to_const (obj : crate :: chain :: common :: chain_type :: ChainType) -> * const ChainType { ferment_interfaces :: boxed (match obj { crate :: chain :: common :: chain_type :: ChainType :: MainNet => ChainType :: MainNet , crate :: chain :: common :: chain_type :: ChainType :: TestNet => ChainType :: TestNet , crate :: chain :: common :: chain_type :: ChainType :: DevNet (o_0 ,) => ChainType :: DevNet (ferment_interfaces :: FFIConversion :: ffi_to (o_0) ,) , }) } unsafe fn destroy (ffi : * mut ChainType) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for ChainType { fn drop (& mut self) { unsafe { match self { ChainType :: MainNet => { } , ChainType :: TestNet => { } , ChainType :: DevNet (o_0 ,) => { ferment_interfaces :: unbox_any (o_0 . to_owned ()) ; ; } , } } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn ChainType_MainNet_ctor () -> * mut ChainType { ferment_interfaces :: boxed (ChainType :: MainNet) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn ChainType_TestNet_ctor () -> * mut ChainType { ferment_interfaces :: boxed (ChainType :: TestNet) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn ChainType_DevNet_ctor (o_o_0 : * mut crate :: fermented :: types :: chain :: common :: chain_type :: DevnetType) -> * mut ChainType { ferment_interfaces :: boxed (ChainType :: DevNet (o_o_0 ,)) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn ChainType_destroy (ffi : * mut ChainType) { ferment_interfaces :: unbox_any (ffi) ; } # [allow (non_snake_case , non_upper_case_globals)] static ChainType_IHaveChainSettings_VTable : IHaveChainSettings_VTable = { unsafe extern "C" fn ChainType_genesis_hash (obj : * const () ,) -> * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 { let cast_obj = & (* (obj as * const crate :: chain :: common :: chain_type :: ChainType)) ; let obj = < crate :: chain :: common :: chain_type :: ChainType as crate :: chain :: common :: chain_type :: IHaveChainSettings > :: genesis_hash (cast_obj ,) ; ferment_interfaces :: FFIConversion :: ffi_to (obj) } unsafe extern "C" fn ChainType_genesis_height (obj : * const () ,) -> u32 { let cast_obj = & (* (obj as * const crate :: chain :: common :: chain_type :: ChainType)) ; let obj = < crate :: chain :: common :: chain_type :: ChainType as crate :: chain :: common :: chain_type :: IHaveChainSettings > :: genesis_height (cast_obj ,) ; obj } unsafe extern "C" fn ChainType_is_llmq_type (obj : * const () ,) -> * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType { let cast_obj = & (* (obj as * const crate :: chain :: common :: chain_type :: ChainType)) ; let obj = < crate :: chain :: common :: chain_type :: ChainType as crate :: chain :: common :: chain_type :: IHaveChainSettings > :: is_llmq_type (cast_obj ,) ; ferment_interfaces :: FFIConversion :: ffi_to (obj) } unsafe extern "C" fn ChainType_isd_llmq_type (obj : * const () ,) -> * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType { let cast_obj = & (* (obj as * const crate :: chain :: common :: chain_type :: ChainType)) ; let obj = < crate :: chain :: common :: chain_type :: ChainType as crate :: chain :: common :: chain_type :: IHaveChainSettings > :: isd_llmq_type (cast_obj ,) ; ferment_interfaces :: FFIConversion :: ffi_to (obj) } unsafe extern "C" fn ChainType_chain_locks_type (obj : * const () ,) -> * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType { let cast_obj = & (* (obj as * const crate :: chain :: common :: chain_type :: ChainType)) ; let obj = < crate :: chain :: common :: chain_type :: ChainType as crate :: chain :: common :: chain_type :: IHaveChainSettings > :: chain_locks_type (cast_obj ,) ; ferment_interfaces :: FFIConversion :: ffi_to (obj) } unsafe extern "C" fn ChainType_platform_type (obj : * const () ,) -> * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType { let cast_obj = & (* (obj as * const crate :: chain :: common :: chain_type :: ChainType)) ; let obj = < crate :: chain :: common :: chain_type :: ChainType as crate :: chain :: common :: chain_type :: IHaveChainSettings > :: platform_type (cast_obj ,) ; ferment_interfaces :: FFIConversion :: ffi_to (obj) } unsafe extern "C" fn ChainType_should_process_llmq_of_type (obj : * const () , llmq_type : * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType ,) -> bool { let cast_obj = & (* (obj as * const crate :: chain :: common :: chain_type :: ChainType)) ; let obj = < crate :: chain :: common :: chain_type :: ChainType as crate :: chain :: common :: chain_type :: IHaveChainSettings > :: should_process_llmq_of_type (cast_obj , ferment_interfaces :: FFIConversion :: ffi_from (llmq_type) ,) ; obj } unsafe extern "C" fn ChainType_is_evolution_enabled (obj : * const () ,) -> bool { let cast_obj = & (* (obj as * const crate :: chain :: common :: chain_type :: ChainType)) ; let obj = < crate :: chain :: common :: chain_type :: ChainType as crate :: chain :: common :: chain_type :: IHaveChainSettings > :: is_evolution_enabled (cast_obj ,) ; obj } unsafe extern "C" fn ChainType_name (obj : * const () ,) -> * mut std :: os :: raw :: c_char { let cast_obj = & (* (obj as * const crate :: chain :: common :: chain_type :: ChainType)) ; let obj = < crate :: chain :: common :: chain_type :: ChainType as crate :: chain :: common :: chain_type :: IHaveChainSettings > :: name (cast_obj ,) ; ferment_interfaces :: FFIConversion :: ffi_to (obj) } IHaveChainSettings_VTable { genesis_hash : ChainType_genesis_hash , genesis_height : ChainType_genesis_height , is_llmq_type : ChainType_is_llmq_type , isd_llmq_type : ChainType_isd_llmq_type , chain_locks_type : ChainType_chain_locks_type , platform_type : ChainType_platform_type , should_process_llmq_of_type : ChainType_should_process_llmq_of_type , is_evolution_enabled : ChainType_is_evolution_enabled , name : ChainType_name , } } ; # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub extern "C" fn ChainType_as_IHaveChainSettings_TraitObject (obj : * const crate :: chain :: common :: chain_type :: ChainType) -> IHaveChainSettings_TraitObject { IHaveChainSettings_TraitObject { object : obj as * const () , vtable : & ChainType_IHaveChainSettings_VTable , } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn ChainType_as_IHaveChainSettings_TraitObject_destroy (obj : IHaveChainSettings_TraitObject) { ferment_interfaces :: unbox_any (obj . object as * mut crate :: chain :: common :: chain_type :: ChainType) ; } # [doc = "FFI-representation of the DevnetType"] # [repr (C)] # [allow (non_camel_case_types)] # [derive (Clone)] pub enum DevnetType { JackDaniels = 0 , Devnet333 = 1 , Chacha = 2 , Mojito = 3 , WhiteRussian = 4 , MiningTest = 5 , Mobile2 = 6 , Zero = 7 , Screwdriver = 8 , Absinthe = 9 , Bintang = 10 , } impl ferment_interfaces :: FFIConversion < crate :: chain :: common :: chain_type :: DevnetType > for DevnetType { unsafe fn ffi_from_const (ffi : * const DevnetType) -> crate :: chain :: common :: chain_type :: DevnetType { let ffi_ref = & * ffi ; match ffi_ref { DevnetType :: JackDaniels => crate :: chain :: common :: chain_type :: DevnetType :: JackDaniels , DevnetType :: Devnet333 => crate :: chain :: common :: chain_type :: DevnetType :: Devnet333 , DevnetType :: Chacha => crate :: chain :: common :: chain_type :: DevnetType :: Chacha , DevnetType :: Mojito => crate :: chain :: common :: chain_type :: DevnetType :: Mojito , DevnetType :: WhiteRussian => crate :: chain :: common :: chain_type :: DevnetType :: WhiteRussian , DevnetType :: MiningTest => crate :: chain :: common :: chain_type :: DevnetType :: MiningTest , DevnetType :: Mobile2 => crate :: chain :: common :: chain_type :: DevnetType :: Mobile2 , DevnetType :: Zero => crate :: chain :: common :: chain_type :: DevnetType :: Zero , DevnetType :: Screwdriver => crate :: chain :: common :: chain_type :: DevnetType :: Screwdriver , DevnetType :: Absinthe => crate :: chain :: common :: chain_type :: DevnetType :: Absinthe , DevnetType :: Bintang => crate :: chain :: common :: chain_type :: DevnetType :: Bintang , } } unsafe fn ffi_to_const (obj : crate :: chain :: common :: chain_type :: DevnetType) -> * const DevnetType { ferment_interfaces :: boxed (match obj { crate :: chain :: common :: chain_type :: DevnetType :: JackDaniels => DevnetType :: JackDaniels , crate :: chain :: common :: chain_type :: DevnetType :: Devnet333 => DevnetType :: Devnet333 , crate :: chain :: common :: chain_type :: DevnetType :: Chacha => DevnetType :: Chacha , crate :: chain :: common :: chain_type :: DevnetType :: Mojito => DevnetType :: Mojito , crate :: chain :: common :: chain_type :: DevnetType :: WhiteRussian => DevnetType :: WhiteRussian , crate :: chain :: common :: chain_type :: DevnetType :: MiningTest => DevnetType :: MiningTest , crate :: chain :: common :: chain_type :: DevnetType :: Mobile2 => DevnetType :: Mobile2 , crate :: chain :: common :: chain_type :: DevnetType :: Zero => DevnetType :: Zero , crate :: chain :: common :: chain_type :: DevnetType :: Screwdriver => DevnetType :: Screwdriver , crate :: chain :: common :: chain_type :: DevnetType :: Absinthe => DevnetType :: Absinthe , crate :: chain :: common :: chain_type :: DevnetType :: Bintang => DevnetType :: Bintang , }) } unsafe fn destroy (ffi : * mut DevnetType) { ferment_interfaces :: unbox_any (ffi) ; } } impl Drop for DevnetType { fn drop (& mut self) { unsafe { match self { DevnetType :: JackDaniels => { } , DevnetType :: Devnet333 => { } , DevnetType :: Chacha => { } , DevnetType :: Mojito => { } , DevnetType :: WhiteRussian => { } , DevnetType :: MiningTest => { } , DevnetType :: Mobile2 => { } , DevnetType :: Zero => { } , DevnetType :: Screwdriver => { } , DevnetType :: Absinthe => { } , DevnetType :: Bintang => { } , } } } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn DevnetType_JackDaniels_ctor () -> * mut DevnetType { ferment_interfaces :: boxed (DevnetType :: JackDaniels) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn DevnetType_Devnet333_ctor () -> * mut DevnetType { ferment_interfaces :: boxed (DevnetType :: Devnet333) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn DevnetType_Chacha_ctor () -> * mut DevnetType { ferment_interfaces :: boxed (DevnetType :: Chacha) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn DevnetType_Mojito_ctor () -> * mut DevnetType { ferment_interfaces :: boxed (DevnetType :: Mojito) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn DevnetType_WhiteRussian_ctor () -> * mut DevnetType { ferment_interfaces :: boxed (DevnetType :: WhiteRussian) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn DevnetType_MiningTest_ctor () -> * mut DevnetType { ferment_interfaces :: boxed (DevnetType :: MiningTest) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn DevnetType_Mobile2_ctor () -> * mut DevnetType { ferment_interfaces :: boxed (DevnetType :: Mobile2) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn DevnetType_Zero_ctor () -> * mut DevnetType { ferment_interfaces :: boxed (DevnetType :: Zero) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn DevnetType_Screwdriver_ctor () -> * mut DevnetType { ferment_interfaces :: boxed (DevnetType :: Screwdriver) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn DevnetType_Absinthe_ctor () -> * mut DevnetType { ferment_interfaces :: boxed (DevnetType :: Absinthe) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn DevnetType_Bintang_ctor () -> * mut DevnetType { ferment_interfaces :: boxed (DevnetType :: Bintang) } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn DevnetType_destroy (ffi : * mut DevnetType) { ferment_interfaces :: unbox_any (ffi) ; } # [allow (non_snake_case , non_upper_case_globals)] static DevnetType_IHaveChainSettings_VTable : IHaveChainSettings_VTable = { unsafe extern "C" fn DevnetType_genesis_hash (obj : * const () ,) -> * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 { let cast_obj = & (* (obj as * const crate :: chain :: common :: chain_type :: DevnetType)) ; let obj = < crate :: chain :: common :: chain_type :: DevnetType as crate :: chain :: common :: chain_type :: IHaveChainSettings > :: genesis_hash (cast_obj ,) ; ferment_interfaces :: FFIConversion :: ffi_to (obj) } unsafe extern "C" fn DevnetType_genesis_height (obj : * const () ,) -> u32 { let cast_obj = & (* (obj as * const crate :: chain :: common :: chain_type :: DevnetType)) ; let obj = < crate :: chain :: common :: chain_type :: DevnetType as crate :: chain :: common :: chain_type :: IHaveChainSettings > :: genesis_height (cast_obj ,) ; obj } unsafe extern "C" fn DevnetType_is_llmq_type (obj : * const () ,) -> * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType { let cast_obj = & (* (obj as * const crate :: chain :: common :: chain_type :: DevnetType)) ; let obj = < crate :: chain :: common :: chain_type :: DevnetType as crate :: chain :: common :: chain_type :: IHaveChainSettings > :: is_llmq_type (cast_obj ,) ; ferment_interfaces :: FFIConversion :: ffi_to (obj) } unsafe extern "C" fn DevnetType_isd_llmq_type (obj : * const () ,) -> * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType { let cast_obj = & (* (obj as * const crate :: chain :: common :: chain_type :: DevnetType)) ; let obj = < crate :: chain :: common :: chain_type :: DevnetType as crate :: chain :: common :: chain_type :: IHaveChainSettings > :: isd_llmq_type (cast_obj ,) ; ferment_interfaces :: FFIConversion :: ffi_to (obj) } unsafe extern "C" fn DevnetType_chain_locks_type (obj : * const () ,) -> * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType { let cast_obj = & (* (obj as * const crate :: chain :: common :: chain_type :: DevnetType)) ; let obj = < crate :: chain :: common :: chain_type :: DevnetType as crate :: chain :: common :: chain_type :: IHaveChainSettings > :: chain_locks_type (cast_obj ,) ; ferment_interfaces :: FFIConversion :: ffi_to (obj) } unsafe extern "C" fn DevnetType_platform_type (obj : * const () ,) -> * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType { let cast_obj = & (* (obj as * const crate :: chain :: common :: chain_type :: DevnetType)) ; let obj = < crate :: chain :: common :: chain_type :: DevnetType as crate :: chain :: common :: chain_type :: IHaveChainSettings > :: platform_type (cast_obj ,) ; ferment_interfaces :: FFIConversion :: ffi_to (obj) } unsafe extern "C" fn DevnetType_should_process_llmq_of_type (obj : * const () , llmq_type : * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType ,) -> bool { let cast_obj = & (* (obj as * const crate :: chain :: common :: chain_type :: DevnetType)) ; let obj = < crate :: chain :: common :: chain_type :: DevnetType as crate :: chain :: common :: chain_type :: IHaveChainSettings > :: should_process_llmq_of_type (cast_obj , ferment_interfaces :: FFIConversion :: ffi_from (llmq_type) ,) ; obj } unsafe extern "C" fn DevnetType_is_evolution_enabled (obj : * const () ,) -> bool { let cast_obj = & (* (obj as * const crate :: chain :: common :: chain_type :: DevnetType)) ; let obj = < crate :: chain :: common :: chain_type :: DevnetType as crate :: chain :: common :: chain_type :: IHaveChainSettings > :: is_evolution_enabled (cast_obj ,) ; obj } unsafe extern "C" fn DevnetType_name (obj : * const () ,) -> * mut std :: os :: raw :: c_char { let cast_obj = & (* (obj as * const crate :: chain :: common :: chain_type :: DevnetType)) ; let obj = < crate :: chain :: common :: chain_type :: DevnetType as crate :: chain :: common :: chain_type :: IHaveChainSettings > :: name (cast_obj ,) ; ferment_interfaces :: FFIConversion :: ffi_to (obj) } IHaveChainSettings_VTable { genesis_hash : DevnetType_genesis_hash , genesis_height : DevnetType_genesis_height , is_llmq_type : DevnetType_is_llmq_type , isd_llmq_type : DevnetType_isd_llmq_type , chain_locks_type : DevnetType_chain_locks_type , platform_type : DevnetType_platform_type , should_process_llmq_of_type : DevnetType_should_process_llmq_of_type , is_evolution_enabled : DevnetType_is_evolution_enabled , name : DevnetType_name , } } ; # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub extern "C" fn DevnetType_as_IHaveChainSettings_TraitObject (obj : * const crate :: chain :: common :: chain_type :: DevnetType) -> IHaveChainSettings_TraitObject { IHaveChainSettings_TraitObject { object : obj as * const () , vtable : & DevnetType_IHaveChainSettings_VTable , } } # [doc = r" # Safety"] # [allow (non_snake_case)] # [no_mangle] pub unsafe extern "C" fn DevnetType_as_IHaveChainSettings_TraitObject_destroy (obj : IHaveChainSettings_TraitObject) { ferment_interfaces :: unbox_any (obj . object as * mut crate :: chain :: common :: chain_type :: DevnetType) ; } # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct IHaveChainSettings_VTable { pub genesis_hash : unsafe extern "C" fn (obj : * const () ,) -> * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , pub genesis_height : unsafe extern "C" fn (obj : * const () ,) -> u32 , pub is_llmq_type : unsafe extern "C" fn (obj : * const () ,) -> * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType , pub isd_llmq_type : unsafe extern "C" fn (obj : * const () ,) -> * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType , pub chain_locks_type : unsafe extern "C" fn (obj : * const () ,) -> * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType , pub platform_type : unsafe extern "C" fn (obj : * const () ,) -> * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType , pub should_process_llmq_of_type : unsafe extern "C" fn (obj : * const () , llmq_type : * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType ,) -> bool , pub is_evolution_enabled : unsafe extern "C" fn (obj : * const () ,) -> bool , pub name : unsafe extern "C" fn (obj : * const () ,) -> * mut std :: os :: raw :: c_char , } # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct IHaveChainSettings_TraitObject { pub object : * const () , pub vtable : * const IHaveChainSettings_VTable } } } } } # [allow (clippy :: let_and_return , clippy :: suspicious_else_formatting , clippy :: redundant_field_names , dead_code , redundant_semicolons , unused_braces , unused_imports , unused_unsafe , unused_variables , unused_qualifications)] pub mod generics { # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct Vec_crate_models_llmq_entry_LLMQEntry { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: models :: llmq_entry :: LLMQEntry , } impl ferment_interfaces :: FFIConversion < Vec < crate :: models :: llmq_entry :: LLMQEntry > > for Vec_crate_models_llmq_entry_LLMQEntry { unsafe fn ffi_from_const (ffi : * const Vec_crate_models_llmq_entry_LLMQEntry) -> Vec < crate :: models :: llmq_entry :: LLMQEntry > { ferment_interfaces :: FFIVecConversion :: decode (& * ffi) } unsafe fn ffi_to_const (obj : Vec < crate :: models :: llmq_entry :: LLMQEntry >) -> * const Vec_crate_models_llmq_entry_LLMQEntry { ferment_interfaces :: FFIVecConversion :: encode (obj) } unsafe fn destroy (ffi : * mut Vec_crate_models_llmq_entry_LLMQEntry) { ferment_interfaces :: unbox_any (ffi) ; ; } } impl ferment_interfaces :: FFIVecConversion for Vec_crate_models_llmq_entry_LLMQEntry { type Value = Vec < crate :: models :: llmq_entry :: LLMQEntry > ; unsafe fn decode (& self) -> Self :: Value { ferment_interfaces :: from_complex_vec (self . values , self . count) } unsafe fn encode (obj : Self :: Value) -> * mut Self { ferment_interfaces :: boxed (Self { count : obj . len () , values : ferment_interfaces :: to_complex_vec (obj . into_iter ()) }) } } impl Drop for Vec_crate_models_llmq_entry_LLMQEntry { fn drop (& mut self) { unsafe { ferment_interfaces :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct std_collections_Map_keys_crate_common_block_Block_values_crate_crypto_byte_util_UInt256 { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: common :: block :: Block , pub values : * mut * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , } impl ferment_interfaces :: FFIConversion < std :: collections :: BTreeMap < crate :: common :: block :: Block , crate :: crypto :: byte_util :: UInt256 > > for std_collections_Map_keys_crate_common_block_Block_values_crate_crypto_byte_util_UInt256 { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_crate_common_block_Block_values_crate_crypto_byte_util_UInt256) -> std :: collections :: BTreeMap < crate :: common :: block :: Block , crate :: crypto :: byte_util :: UInt256 > { let ffi_ref = & * ffi ; ferment_interfaces :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | ferment_interfaces :: FFIConversion :: ffi_from (o) , | o | ferment_interfaces :: FFIConversion :: ffi_from (o)) } unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < crate :: common :: block :: Block , crate :: crypto :: byte_util :: UInt256 >) -> * const std_collections_Map_keys_crate_common_block_Block_values_crate_crypto_byte_util_UInt256 { ferment_interfaces :: boxed (Self { count : obj . len () , keys : ferment_interfaces :: to_complex_vec (obj . keys () . cloned ()) , values : ferment_interfaces :: to_complex_vec (obj . values () . cloned ()) }) } unsafe fn destroy (ffi : * mut std_collections_Map_keys_crate_common_block_Block_values_crate_crypto_byte_util_UInt256) { ferment_interfaces :: unbox_any (ffi) ; ; } } impl Drop for std_collections_Map_keys_crate_common_block_Block_values_crate_crypto_byte_util_UInt256 { fn drop (& mut self) { unsafe { ferment_interfaces :: unbox_any_vec_ptr (self . keys , self . count) ; ferment_interfaces :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct Vec_crate_models_snapshot_LLMQSnapshot { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: models :: snapshot :: LLMQSnapshot , } impl ferment_interfaces :: FFIConversion < Vec < crate :: models :: snapshot :: LLMQSnapshot > > for Vec_crate_models_snapshot_LLMQSnapshot { unsafe fn ffi_from_const (ffi : * const Vec_crate_models_snapshot_LLMQSnapshot) -> Vec < crate :: models :: snapshot :: LLMQSnapshot > { ferment_interfaces :: FFIVecConversion :: decode (& * ffi) } unsafe fn ffi_to_const (obj : Vec < crate :: models :: snapshot :: LLMQSnapshot >) -> * const Vec_crate_models_snapshot_LLMQSnapshot { ferment_interfaces :: FFIVecConversion :: encode (obj) } unsafe fn destroy (ffi : * mut Vec_crate_models_snapshot_LLMQSnapshot) { ferment_interfaces :: unbox_any (ffi) ; ; } } impl ferment_interfaces :: FFIVecConversion for Vec_crate_models_snapshot_LLMQSnapshot { type Value = Vec < crate :: models :: snapshot :: LLMQSnapshot > ; unsafe fn decode (& self) -> Self :: Value { ferment_interfaces :: from_complex_vec (self . values , self . count) } unsafe fn encode (obj : Self :: Value) -> * mut Self { ferment_interfaces :: boxed (Self { count : obj . len () , values : ferment_interfaces :: to_complex_vec (obj . into_iter ()) }) } } impl Drop for Vec_crate_models_snapshot_LLMQSnapshot { fn drop (& mut self) { unsafe { ferment_interfaces :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct Vec_u8 { pub count : usize , pub values : * mut u8 , } impl ferment_interfaces :: FFIConversion < Vec < u8 > > for Vec_u8 { unsafe fn ffi_from_const (ffi : * const Vec_u8) -> Vec < u8 > { ferment_interfaces :: FFIVecConversion :: decode (& * ffi) } unsafe fn ffi_to_const (obj : Vec < u8 >) -> * const Vec_u8 { ferment_interfaces :: FFIVecConversion :: encode (obj) } unsafe fn destroy (ffi : * mut Vec_u8) { ferment_interfaces :: unbox_any (ffi) ; ; } } impl ferment_interfaces :: FFIVecConversion for Vec_u8 { type Value = Vec < u8 > ; unsafe fn decode (& self) -> Self :: Value { ferment_interfaces :: from_primitive_vec (self . values , self . count) } unsafe fn encode (obj : Self :: Value) -> * mut Self { ferment_interfaces :: boxed (Self { count : obj . len () , values : ferment_interfaces :: boxed_vec (obj) }) } } impl Drop for Vec_u8 { fn drop (& mut self) { unsafe { ferment_interfaces :: unbox_vec_ptr (self . values , self . count) ; } } } # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct std_collections_Map_keys_crate_chain_common_llmq_type_LLMQType_values_std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_llmq_entry_LLMQEntry { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: chain :: common :: llmq_type :: LLMQType , pub values : * mut * mut crate :: fermented :: generics :: std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_llmq_entry_LLMQEntry , } impl ferment_interfaces :: FFIConversion < std :: collections :: BTreeMap < crate :: chain :: common :: llmq_type :: LLMQType , std :: collections :: BTreeMap < crate :: crypto :: byte_util :: UInt256 , crate :: models :: llmq_entry :: LLMQEntry > > > for std_collections_Map_keys_crate_chain_common_llmq_type_LLMQType_values_std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_llmq_entry_LLMQEntry { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_crate_chain_common_llmq_type_LLMQType_values_std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_llmq_entry_LLMQEntry) -> std :: collections :: BTreeMap < crate :: chain :: common :: llmq_type :: LLMQType , std :: collections :: BTreeMap < crate :: crypto :: byte_util :: UInt256 , crate :: models :: llmq_entry :: LLMQEntry > > { let ffi_ref = & * ffi ; ferment_interfaces :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | ferment_interfaces :: FFIConversion :: ffi_from (o) , | o | ferment_interfaces :: FFIConversion :: ffi_from (o)) } unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < crate :: chain :: common :: llmq_type :: LLMQType , std :: collections :: BTreeMap < crate :: crypto :: byte_util :: UInt256 , crate :: models :: llmq_entry :: LLMQEntry > >) -> * const std_collections_Map_keys_crate_chain_common_llmq_type_LLMQType_values_std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_llmq_entry_LLMQEntry { ferment_interfaces :: boxed (Self { count : obj . len () , keys : ferment_interfaces :: to_complex_vec (obj . keys () . cloned ()) , values : ferment_interfaces :: to_complex_vec (obj . values () . cloned ()) }) } unsafe fn destroy (ffi : * mut std_collections_Map_keys_crate_chain_common_llmq_type_LLMQType_values_std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_llmq_entry_LLMQEntry) { ferment_interfaces :: unbox_any (ffi) ; ; } } impl Drop for std_collections_Map_keys_crate_chain_common_llmq_type_LLMQType_values_std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_llmq_entry_LLMQEntry { fn drop (& mut self) { unsafe { ferment_interfaces :: unbox_any_vec_ptr (self . keys , self . count) ; ferment_interfaces :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_masternode_entry_MasternodeEntry { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , pub values : * mut * mut crate :: fermented :: types :: models :: masternode_entry :: MasternodeEntry , } impl ferment_interfaces :: FFIConversion < std :: collections :: BTreeMap < crate :: crypto :: byte_util :: UInt256 , crate :: models :: masternode_entry :: MasternodeEntry > > for std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_masternode_entry_MasternodeEntry { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_masternode_entry_MasternodeEntry) -> std :: collections :: BTreeMap < crate :: crypto :: byte_util :: UInt256 , crate :: models :: masternode_entry :: MasternodeEntry > { let ffi_ref = & * ffi ; ferment_interfaces :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | ferment_interfaces :: FFIConversion :: ffi_from (o) , | o | ferment_interfaces :: FFIConversion :: ffi_from (o)) } unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < crate :: crypto :: byte_util :: UInt256 , crate :: models :: masternode_entry :: MasternodeEntry >) -> * const std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_masternode_entry_MasternodeEntry { ferment_interfaces :: boxed (Self { count : obj . len () , keys : ferment_interfaces :: to_complex_vec (obj . keys () . cloned ()) , values : ferment_interfaces :: to_complex_vec (obj . values () . cloned ()) }) } unsafe fn destroy (ffi : * mut std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_masternode_entry_MasternodeEntry) { ferment_interfaces :: unbox_any (ffi) ; ; } } impl Drop for std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_masternode_entry_MasternodeEntry { fn drop (& mut self) { unsafe { ferment_interfaces :: unbox_any_vec_ptr (self . keys , self . count) ; ferment_interfaces :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct Vec_crate_processing_mn_listdiff_result_MNListDiffResult { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: processing :: mn_listdiff_result :: MNListDiffResult , } impl ferment_interfaces :: FFIConversion < Vec < crate :: processing :: mn_listdiff_result :: MNListDiffResult > > for Vec_crate_processing_mn_listdiff_result_MNListDiffResult { unsafe fn ffi_from_const (ffi : * const Vec_crate_processing_mn_listdiff_result_MNListDiffResult) -> Vec < crate :: processing :: mn_listdiff_result :: MNListDiffResult > { ferment_interfaces :: FFIVecConversion :: decode (& * ffi) } unsafe fn ffi_to_const (obj : Vec < crate :: processing :: mn_listdiff_result :: MNListDiffResult >) -> * const Vec_crate_processing_mn_listdiff_result_MNListDiffResult { ferment_interfaces :: FFIVecConversion :: encode (obj) } unsafe fn destroy (ffi : * mut Vec_crate_processing_mn_listdiff_result_MNListDiffResult) { ferment_interfaces :: unbox_any (ffi) ; ; } } impl ferment_interfaces :: FFIVecConversion for Vec_crate_processing_mn_listdiff_result_MNListDiffResult { type Value = Vec < crate :: processing :: mn_listdiff_result :: MNListDiffResult > ; unsafe fn decode (& self) -> Self :: Value { ferment_interfaces :: from_complex_vec (self . values , self . count) } unsafe fn encode (obj : Self :: Value) -> * mut Self { ferment_interfaces :: boxed (Self { count : obj . len () , values : ferment_interfaces :: to_complex_vec (obj . into_iter ()) }) } } impl Drop for Vec_crate_processing_mn_listdiff_result_MNListDiffResult { fn drop (& mut self) { unsafe { ferment_interfaces :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct std_collections_Map_keys_crate_common_block_Block_values_bool { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: common :: block :: Block , pub values : * mut bool , } impl ferment_interfaces :: FFIConversion < std :: collections :: BTreeMap < crate :: common :: block :: Block , bool > > for std_collections_Map_keys_crate_common_block_Block_values_bool { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_crate_common_block_Block_values_bool) -> std :: collections :: BTreeMap < crate :: common :: block :: Block , bool > { let ffi_ref = & * ffi ; ferment_interfaces :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | ferment_interfaces :: FFIConversion :: ffi_from (o) , | o | o) } unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < crate :: common :: block :: Block , bool >) -> * const std_collections_Map_keys_crate_common_block_Block_values_bool { ferment_interfaces :: boxed (Self { count : obj . len () , keys : ferment_interfaces :: to_complex_vec (obj . keys () . cloned ()) , values : ferment_interfaces :: to_primitive_vec (obj . values () . cloned ()) }) } unsafe fn destroy (ffi : * mut std_collections_Map_keys_crate_common_block_Block_values_bool) { ferment_interfaces :: unbox_any (ffi) ; ; } } impl Drop for std_collections_Map_keys_crate_common_block_Block_values_bool { fn drop (& mut self) { unsafe { ferment_interfaces :: unbox_any_vec_ptr (self . keys , self . count) ; ferment_interfaces :: unbox_vec_ptr (self . values , self . count) ; } } } # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct Vec_crate_crypto_byte_util_UInt256 { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , } impl ferment_interfaces :: FFIConversion < Vec < crate :: crypto :: byte_util :: UInt256 > > for Vec_crate_crypto_byte_util_UInt256 { unsafe fn ffi_from_const (ffi : * const Vec_crate_crypto_byte_util_UInt256) -> Vec < crate :: crypto :: byte_util :: UInt256 > { ferment_interfaces :: FFIVecConversion :: decode (& * ffi) } unsafe fn ffi_to_const (obj : Vec < crate :: crypto :: byte_util :: UInt256 >) -> * const Vec_crate_crypto_byte_util_UInt256 { ferment_interfaces :: FFIVecConversion :: encode (obj) } unsafe fn destroy (ffi : * mut Vec_crate_crypto_byte_util_UInt256) { ferment_interfaces :: unbox_any (ffi) ; ; } } impl ferment_interfaces :: FFIVecConversion for Vec_crate_crypto_byte_util_UInt256 { type Value = Vec < crate :: crypto :: byte_util :: UInt256 > ; unsafe fn decode (& self) -> Self :: Value { ferment_interfaces :: from_complex_vec (self . values , self . count) } unsafe fn encode (obj : Self :: Value) -> * mut Self { ferment_interfaces :: boxed (Self { count : obj . len () , values : ferment_interfaces :: to_complex_vec (obj . into_iter ()) }) } } impl Drop for Vec_crate_crypto_byte_util_UInt256 { fn drop (& mut self) { unsafe { ferment_interfaces :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct Vec_i32 { pub count : usize , pub values : * mut i32 , } impl ferment_interfaces :: FFIConversion < Vec < i32 > > for Vec_i32 { unsafe fn ffi_from_const (ffi : * const Vec_i32) -> Vec < i32 > { ferment_interfaces :: FFIVecConversion :: decode (& * ffi) } unsafe fn ffi_to_const (obj : Vec < i32 >) -> * const Vec_i32 { ferment_interfaces :: FFIVecConversion :: encode (obj) } unsafe fn destroy (ffi : * mut Vec_i32) { ferment_interfaces :: unbox_any (ffi) ; ; } } impl ferment_interfaces :: FFIVecConversion for Vec_i32 { type Value = Vec < i32 > ; unsafe fn decode (& self) -> Self :: Value { ferment_interfaces :: from_primitive_vec (self . values , self . count) } unsafe fn encode (obj : Self :: Value) -> * mut Self { ferment_interfaces :: boxed (Self { count : obj . len () , values : ferment_interfaces :: boxed_vec (obj) }) } } impl Drop for Vec_i32 { fn drop (& mut self) { unsafe { ferment_interfaces :: unbox_vec_ptr (self . values , self . count) ; } } } # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct Vec_crate_tx_transaction_TransactionOutput { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: tx :: transaction :: TransactionOutput , } impl ferment_interfaces :: FFIConversion < Vec < crate :: tx :: transaction :: TransactionOutput > > for Vec_crate_tx_transaction_TransactionOutput { unsafe fn ffi_from_const (ffi : * const Vec_crate_tx_transaction_TransactionOutput) -> Vec < crate :: tx :: transaction :: TransactionOutput > { ferment_interfaces :: FFIVecConversion :: decode (& * ffi) } unsafe fn ffi_to_const (obj : Vec < crate :: tx :: transaction :: TransactionOutput >) -> * const Vec_crate_tx_transaction_TransactionOutput { ferment_interfaces :: FFIVecConversion :: encode (obj) } unsafe fn destroy (ffi : * mut Vec_crate_tx_transaction_TransactionOutput) { ferment_interfaces :: unbox_any (ffi) ; ; } } impl ferment_interfaces :: FFIVecConversion for Vec_crate_tx_transaction_TransactionOutput { type Value = Vec < crate :: tx :: transaction :: TransactionOutput > ; unsafe fn decode (& self) -> Self :: Value { ferment_interfaces :: from_complex_vec (self . values , self . count) } unsafe fn encode (obj : Self :: Value) -> * mut Self { ferment_interfaces :: boxed (Self { count : obj . len () , values : ferment_interfaces :: to_complex_vec (obj . into_iter ()) }) } } impl Drop for Vec_crate_tx_transaction_TransactionOutput { fn drop (& mut self) { unsafe { ferment_interfaces :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct Vec_crate_tx_transaction_TransactionInput { pub count : usize , pub values : * mut * mut crate :: fermented :: types :: tx :: transaction :: TransactionInput , } impl ferment_interfaces :: FFIConversion < Vec < crate :: tx :: transaction :: TransactionInput > > for Vec_crate_tx_transaction_TransactionInput { unsafe fn ffi_from_const (ffi : * const Vec_crate_tx_transaction_TransactionInput) -> Vec < crate :: tx :: transaction :: TransactionInput > { ferment_interfaces :: FFIVecConversion :: decode (& * ffi) } unsafe fn ffi_to_const (obj : Vec < crate :: tx :: transaction :: TransactionInput >) -> * const Vec_crate_tx_transaction_TransactionInput { ferment_interfaces :: FFIVecConversion :: encode (obj) } unsafe fn destroy (ffi : * mut Vec_crate_tx_transaction_TransactionInput) { ferment_interfaces :: unbox_any (ffi) ; ; } } impl ferment_interfaces :: FFIVecConversion for Vec_crate_tx_transaction_TransactionInput { type Value = Vec < crate :: tx :: transaction :: TransactionInput > ; unsafe fn decode (& self) -> Self :: Value { ferment_interfaces :: from_complex_vec (self . values , self . count) } unsafe fn encode (obj : Self :: Value) -> * mut Self { ferment_interfaces :: boxed (Self { count : obj . len () , values : ferment_interfaces :: to_complex_vec (obj . into_iter ()) }) } } impl Drop for Vec_crate_tx_transaction_TransactionInput { fn drop (& mut self) { unsafe { ferment_interfaces :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_llmq_entry_LLMQEntry { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: crypto :: byte_util :: UInt256 , pub values : * mut * mut crate :: fermented :: types :: models :: llmq_entry :: LLMQEntry , } impl ferment_interfaces :: FFIConversion < std :: collections :: BTreeMap < crate :: crypto :: byte_util :: UInt256 , crate :: models :: llmq_entry :: LLMQEntry > > for std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_llmq_entry_LLMQEntry { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_llmq_entry_LLMQEntry) -> std :: collections :: BTreeMap < crate :: crypto :: byte_util :: UInt256 , crate :: models :: llmq_entry :: LLMQEntry > { let ffi_ref = & * ffi ; ferment_interfaces :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | ferment_interfaces :: FFIConversion :: ffi_from (o) , | o | ferment_interfaces :: FFIConversion :: ffi_from (o)) } unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < crate :: crypto :: byte_util :: UInt256 , crate :: models :: llmq_entry :: LLMQEntry >) -> * const std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_llmq_entry_LLMQEntry { ferment_interfaces :: boxed (Self { count : obj . len () , keys : ferment_interfaces :: to_complex_vec (obj . keys () . cloned ()) , values : ferment_interfaces :: to_complex_vec (obj . values () . cloned ()) }) } unsafe fn destroy (ffi : * mut std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_llmq_entry_LLMQEntry) { ferment_interfaces :: unbox_any (ffi) ; ; } } impl Drop for std_collections_Map_keys_crate_crypto_byte_util_UInt256_values_crate_models_llmq_entry_LLMQEntry { fn drop (& mut self) { unsafe { ferment_interfaces :: unbox_any_vec_ptr (self . keys , self . count) ; ferment_interfaces :: unbox_any_vec_ptr (self . values , self . count) ; } } } # [repr (C)] # [derive (Clone)] # [allow (non_camel_case_types)] pub struct std_collections_Map_keys_crate_common_block_Block_values_crate_models_operator_public_key_OperatorPublicKey { pub count : usize , pub keys : * mut * mut crate :: fermented :: types :: common :: block :: Block , pub values : * mut * mut crate :: fermented :: types :: models :: operator_public_key :: OperatorPublicKey , } impl ferment_interfaces :: FFIConversion < std :: collections :: BTreeMap < crate :: common :: block :: Block , crate :: models :: operator_public_key :: OperatorPublicKey > > for std_collections_Map_keys_crate_common_block_Block_values_crate_models_operator_public_key_OperatorPublicKey { unsafe fn ffi_from_const (ffi : * const std_collections_Map_keys_crate_common_block_Block_values_crate_models_operator_public_key_OperatorPublicKey) -> std :: collections :: BTreeMap < crate :: common :: block :: Block , crate :: models :: operator_public_key :: OperatorPublicKey > { let ffi_ref = & * ffi ; ferment_interfaces :: fold_to_map (ffi_ref . count , ffi_ref . keys , ffi_ref . values , | o | ferment_interfaces :: FFIConversion :: ffi_from (o) , | o | ferment_interfaces :: FFIConversion :: ffi_from (o)) } unsafe fn ffi_to_const (obj : std :: collections :: BTreeMap < crate :: common :: block :: Block , crate :: models :: operator_public_key :: OperatorPublicKey >) -> * const std_collections_Map_keys_crate_common_block_Block_values_crate_models_operator_public_key_OperatorPublicKey { ferment_interfaces :: boxed (Self { count : obj . len () , keys : ferment_interfaces :: to_complex_vec (obj . keys () . cloned ()) , values : ferment_interfaces :: to_complex_vec (obj . values () . cloned ()) }) } unsafe fn destroy (ffi : * mut std_collections_Map_keys_crate_common_block_Block_values_crate_models_operator_public_key_OperatorPublicKey) { ferment_interfaces :: unbox_any (ffi) ; ; } } impl Drop for std_collections_Map_keys_crate_common_block_Block_values_crate_models_operator_public_key_OperatorPublicKey { fn drop (& mut self) { unsafe { ferment_interfaces :: unbox_any_vec_ptr (self . keys , self . count) ; ferment_interfaces :: unbox_any_vec_ptr (self . values , self . count) ; } } } } \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/ffi/boxer.rs b/dash-spv-masternode-processor/src/ffi/boxer.rs deleted file mode 100644 index 2dc5c9ef..00000000 --- a/dash-spv-masternode-processor/src/ffi/boxer.rs +++ /dev/null @@ -1,12 +0,0 @@ -use std::mem; - -pub fn boxed(obj: T) -> *mut T { - Box::into_raw(Box::new(obj)) -} - -pub fn boxed_vec(vec: Vec) -> *mut T { - let mut slice = vec.into_boxed_slice(); - let ptr = slice.as_mut_ptr(); - mem::forget(slice); - ptr -} diff --git a/dash-spv-masternode-processor/src/ffi/callbacks.rs b/dash-spv-masternode-processor/src/ffi/callbacks.rs deleted file mode 100644 index 9f6d0d50..00000000 --- a/dash-spv-masternode-processor/src/ffi/callbacks.rs +++ /dev/null @@ -1,148 +0,0 @@ -extern crate libc; -use std::ffi::c_void; -use crate::{models, types}; -use crate::crypto::{byte_util::MutDecodable, UInt256, UInt768}; -use crate::ffi::from::FromFFI; -use crate::processing::ProcessingError; - -pub type AddInsightBlockingLookup = - unsafe extern "C" fn(block_hash: *mut [u8; 32], context: *const c_void); -pub type ShouldProcessDiffWithRange = unsafe extern "C" fn( - base_block_hash: *mut [u8; 32], - block_hash: *mut [u8; 32], - context: *const c_void, -) -> ProcessingError; - -pub type GetBlockHeightByHash = - unsafe extern "C" fn(block_hash: *mut [u8; 32], context: *const c_void) -> u32; -pub type MerkleRootLookup = - unsafe extern "C" fn(block_hash: *mut [u8; 32], context: *const c_void) -> *mut u8; // UIn256 -pub type MasternodeListLookup = unsafe extern "C" fn( - block_hash: *mut [u8; 32], - context: *const c_void, -) -> *mut types::MasternodeList; -pub type MasternodeListDestroy = unsafe extern "C" fn(masternode_list: *mut types::MasternodeList); -pub type MasternodeListSave = unsafe extern "C" fn( - block_hash: *mut [u8; 32], - masternode_list: *mut types::MasternodeList, - context: *const c_void, -) -> bool; - -pub type GetBlockHashByHeight = - unsafe extern "C" fn(block_height: u32, context: *const c_void) -> *mut u8; // UIn256 -pub type GetLLMQSnapshotByBlockHash = unsafe extern "C" fn( - block_hash: *mut [u8; 32], - context: *const c_void, -) -> *mut types::LLMQSnapshot; -pub type SaveLLMQSnapshot = unsafe extern "C" fn( - block_hash: *mut [u8; 32], - snapshot: *mut types::LLMQSnapshot, - context: *const c_void, -) -> bool; -pub type GetCLSignatureByBlockHash = unsafe extern "C" fn( - block_hash: *mut [u8; 32], - context: *const c_void, -) -> *mut u8; -pub type SaveCLSignature = unsafe extern "C" fn( - block_hash: *mut [u8; 32], - cl_signature: *mut [u8; 96], - context: *const c_void, -) -> bool; -pub type HashDestroy = unsafe extern "C" fn(hash: *mut u8); -pub type LLMQSnapshotDestroy = unsafe extern "C" fn(snapshot: *mut types::LLMQSnapshot); - -pub fn lookup_masternode_list( - block_hash: UInt256, - masternode_list_lookup: MNL, - masternode_list_destroy: MND, -) -> Option -where - MNL: Fn(UInt256) -> *mut types::MasternodeList + Copy, - MND: Fn(*mut types::MasternodeList), -{ - let lookup_result = masternode_list_lookup(block_hash); - if !lookup_result.is_null() { - let data = unsafe { (*lookup_result).decode() }; - masternode_list_destroy(lookup_result); - Some(data) - } else { - None - } -} - -pub fn lookup_block_hash_by_height( - block_height: u32, - lookup: BL, - destroy_hash: DH, -) -> Option -where - BL: Fn(u32) -> *mut u8 + Copy, - DH: Fn(*mut u8), -{ - let lookup_result = lookup(block_height); - if !lookup_result.is_null() { - let hash = UInt256::from_mut(lookup_result); - destroy_hash(lookup_result); - hash - } else { - None - } -} - -pub fn lookup_merkle_root_by_hash( - block_hash: UInt256, - lookup: MRL, - destroy_hash: DH, -) -> Option -where - MRL: Fn(UInt256) -> *mut u8 + Copy, - DH: Fn(*mut u8), -{ - let lookup_result = lookup(block_hash); - if !lookup_result.is_null() { - let hash = UInt256::from_mut(lookup_result); - destroy_hash(lookup_result); - hash - } else { - None - } - -} - -pub fn lookup_snapshot_by_block_hash( - block_hash: UInt256, - snapshot_lookup: SL, - snapshot_destroy: SD, -) -> Option -where - SL: Fn(UInt256) -> *mut types::LLMQSnapshot + Copy, - SD: Fn(*mut types::LLMQSnapshot), -{ - let lookup_result = snapshot_lookup(block_hash); - if !lookup_result.is_null() { - let data = unsafe { (*lookup_result).decode() }; - snapshot_destroy(lookup_result); - Some(data) - } else { - None - } -} - -pub fn lookup_cl_signature_by_block_hash( - block_hash: UInt256, - cl_signature_lookup: SL, - cl_signature_destroy: SD, -) -> Option - where - SL: Fn(UInt256) -> *mut u8 + Copy, - SD: Fn(*mut u8), -{ - let lookup_result = cl_signature_lookup(block_hash); - if !lookup_result.is_null() { - let data = UInt768::from_mut(lookup_result); - cl_signature_destroy(lookup_result); - data - } else { - None - } -} diff --git a/dash-spv-masternode-processor/src/ffi/common.rs b/dash-spv-masternode-processor/src/ffi/common.rs deleted file mode 100644 index 8798bde4..00000000 --- a/dash-spv-masternode-processor/src/ffi/common.rs +++ /dev/null @@ -1,148 +0,0 @@ -use std::{mem, ptr, slice, os::raw::c_ulong}; -use crate::chain::derivation::{IIndexPath, IndexPath}; -use crate::crypto::UInt256; -use crate::util::sec_vec::SecVec; - -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub struct ByteArray { - pub ptr: *const u8, - pub len: usize, -} - -impl Default for ByteArray { - fn default() -> Self { - ByteArray { ptr: ptr::null(), len: 0 } - } -} - -impl From for ByteArray { - fn from(value: blake3::Hash) -> Self { - let bytes: [u8; 32] = value.into(); - let vec = bytes.to_vec(); - vec.into() - } -} - -impl From<[u8; 32]> for ByteArray { - fn from(value: [u8; 32]) -> Self { - let vec = value.to_vec(); - vec.into() - } -} - -impl From<[u8; 65]> for ByteArray { - fn from(value: [u8; 65]) -> Self { - let vec = value.to_vec(); - vec.into() - } -} - -impl From> for ByteArray { - fn from(value: Option<[u8; 65]>) -> Self { - if let Some(v) = value { - v.into() - } else { - ByteArray::default() - } - } -} - -impl From> for ByteArray { - fn from(value: Vec) -> Self { - let ptr = value.as_ptr(); - let len = value.len(); - mem::forget(value); - ByteArray { ptr, len } - } -} - -impl From>> for ByteArray { - fn from(value: Option>) -> Self { - match value { - Some(vec) => { - vec.into() - } - None => ByteArray::default(), - } - } -} - -impl From> for ByteArray { - fn from(value: Option) -> Self { - match value { - Some(vec) => { - let ptr = vec.as_ptr(); - let len = vec.len(); - mem::forget(vec); - ByteArray { ptr, len } - } - None => ByteArray::default(), - } - } -} - -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub struct IndexPathData { - pub indexes: *const c_ulong, - pub len: usize, -} - -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub struct DerivationPathData { - pub indexes: *const [u8; 32], - pub hardened: *const u8, - pub len: usize, -} - - -impl From<*const IndexPathData> for IndexPath { - fn from(value: *const IndexPathData) -> Self { - let indexes_slice = unsafe { slice::from_raw_parts((*value).indexes, (*value).len) }; - IndexPath::new(indexes_slice.iter().map(|&index| index as u32).collect()) - } -} - -impl From<*const DerivationPathData> for IndexPath { - fn from(value: *const DerivationPathData) -> Self { - let indexes_slice = unsafe { slice::from_raw_parts((*value).indexes, (*value).len) }; - let hardened_slice = unsafe { slice::from_raw_parts((*value).hardened, (*value).len) }; - IndexPath::new_hardened( - indexes_slice.iter().map(|&index| UInt256(index)).collect(), - hardened_slice.iter().map(|&index| index > 0).collect() - ) - } -} - -impl From<(*const u8, *const bool, usize)> for IndexPath { - fn from(value: (*const u8, *const bool, usize)) -> Self { - let len = value.2; - let hashes_len = len * 32; - let hashes = unsafe { slice::from_raw_parts(value.0, hashes_len) }; - let hardened = unsafe { slice::from_raw_parts(value.1, len) }; - let indexes = (0..hashes_len) - .into_iter() - .step_by(32) - .map(|pos| UInt256::from(&hashes[pos..pos+32])) - .collect::>(); - IndexPath::new_hardened(indexes, hardened.to_vec()) - } -} - -// #[repr(C)] -// pub struct SecVecData { -// data: *const u8, -// len: usize, -// } -// -// impl From for SecVecData { -// fn from(sec_vec: SecVec) -> Self { -// let data = sec_vec.as_ptr(); -// let len = sec_vec.len(); -// mem::forget(sec_vec); -// SecVecData { data, len } -// } -// } - diff --git a/dash-spv-masternode-processor/src/ffi/from.rs b/dash-spv-masternode-processor/src/ffi/from.rs deleted file mode 100644 index 8bed15c7..00000000 --- a/dash-spv-masternode-processor/src/ffi/from.rs +++ /dev/null @@ -1,304 +0,0 @@ -use std::collections::BTreeMap; -use std::slice; -use crate::{chain, common, models, tx, types}; -use crate::consensus::encode; -use crate::crypto::{byte_util::Reversable, UInt128, UInt160, UInt256, UInt384, UInt768}; -use crate::ffi::to::ToFFI; -use crate::tx::transaction; - -pub trait FromFFI { - type Item: ToFFI; - /// # Safety - unsafe fn decode(&self) -> Self::Item; -} - -impl FromFFI for types::TransactionInput { - type Item = transaction::TransactionInput; - - unsafe fn decode(&self) -> Self::Item { - Self::Item { - input_hash: UInt256(*self.input_hash), - index: self.index, - script: if self.script.is_null() || self.script_length == 0 { - None - } else { - Some(slice::from_raw_parts(self.script, self.script_length).to_vec()) - }, - signature: if self.signature.is_null() || self.signature_length == 0 { - None - } else { - Some(slice::from_raw_parts(self.signature, self.signature_length).to_vec()) - }, - sequence: self.sequence, - } - } -} - -impl FromFFI for types::TransactionOutput { - type Item = transaction::TransactionOutput; - - unsafe fn decode(&self) -> Self::Item { - Self::Item { - amount: self.amount, - script: if self.script.is_null() || self.script_length == 0 { - None - } else { - Some(slice::from_raw_parts(self.script, self.script_length).to_vec()) - }, - address: if self.address.is_null() || self.address_length == 0 { - None - } else { - Some(slice::from_raw_parts(self.address, self.address_length).to_vec()) - }, - } - } -} - -impl FromFFI for types::Transaction { - type Item = tx::Transaction; - - unsafe fn decode(&self) -> Self::Item { - Self::Item { - inputs: (0..self.inputs_count) - .into_iter() - .map(|i| (*(*self.inputs.add(i))).decode()) - .collect(), - outputs: (0..self.outputs_count) - .into_iter() - .map(|i| (*(*self.outputs.add(i))).decode()) - .collect(), - lock_time: self.lock_time, - version: self.version, - tx_hash: if self.tx_hash.is_null() { - None - } else { - Some(UInt256(*self.tx_hash)) - }, - tx_type: self.tx_type, - payload_offset: self.payload_offset, - block_height: self.block_height, - } - } -} - -impl FromFFI for types::CoinbaseTransaction { - type Item = tx::CoinbaseTransaction; - - unsafe fn decode(&self) -> Self::Item { - Self::Item { - base: (*self.base).decode(), - coinbase_transaction_version: self.coinbase_transaction_version, - height: self.height, - merkle_root_mn_list: UInt256(*self.merkle_root_mn_list), - merkle_root_llmq_list: if self.merkle_root_llmq_list.is_null() { - None - } else { - Some(UInt256(*self.merkle_root_llmq_list)) - }, - best_cl_height_diff: self.best_cl_height_diff, - best_cl_signature: if self.best_cl_signature.is_null() { - None - } else { - Some(UInt768(*self.best_cl_signature)) - }, - credit_pool_balance: Some(self.credit_pool_balance) - } - } -} - -impl FromFFI for types::MasternodeList { - type Item = models::MasternodeList; - - unsafe fn decode(&self) -> Self::Item { - Self::Item { - block_hash: UInt256(*self.block_hash), - known_height: self.known_height, - masternode_merkle_root: if self.masternode_merkle_root.is_null() { - None - } else { - Some(UInt256(*self.masternode_merkle_root)) - }, - llmq_merkle_root: if self.llmq_merkle_root.is_null() { - None - } else { - Some(UInt256(*self.llmq_merkle_root)) - }, - masternodes: (0..self.masternodes_count).into_iter().fold( - BTreeMap::new(), - |mut acc, i| { - let value = (*(*self.masternodes.add(i))).decode(); - let key = value.provider_registration_transaction_hash.reversed(); - acc.insert(key, value); - acc - }, - ), - quorums: (0..self.llmq_type_maps_count).into_iter().fold( - BTreeMap::new(), - |mut acc, i| { - let llmq_map = &*(*self.llmq_type_maps.add(i)); - let key = chain::common::LLMQType::from(llmq_map.llmq_type); - let value: BTreeMap = (0..llmq_map.count) - .into_iter() - .fold(BTreeMap::new(), |mut acc, j| { - let raw_value = &*(*llmq_map.values.add(j)); - let value = raw_value.decode(); - let key = value.llmq_hash; - acc.insert(key, value); - acc - }); - acc.insert(key, value); - acc - }, - ), - } - } -} - -impl FromFFI for types::OperatorPublicKey { - type Item = models::OperatorPublicKey; - unsafe fn decode(&self) -> Self::Item { - Self::Item { - data: UInt384(self.data), - version: self.version - } - } -} - -impl FromFFI for types::MasternodeEntry { - type Item = models::MasternodeEntry; - unsafe fn decode(&self) -> Self::Item { - Self::Item { - provider_registration_transaction_hash: UInt256( - *self.provider_registration_transaction_hash, - ), - confirmed_hash: UInt256(*self.confirmed_hash), - confirmed_hash_hashed_with_provider_registration_transaction_hash: if self - .confirmed_hash_hashed_with_provider_registration_transaction_hash - .is_null() - { - None - } else { - Some(UInt256( - *self.confirmed_hash_hashed_with_provider_registration_transaction_hash, - )) - }, - socket_address: common::SocketAddress { - ip_address: UInt128(*self.ip_address), - port: self.port, - }, - operator_public_key: (*self.operator_public_key).decode(), - previous_operator_public_keys: (0..self.previous_operator_public_keys_count) - .into_iter() - .fold(BTreeMap::new(), |mut acc, i| { - let obj = *self.previous_operator_public_keys.add(i); - let key = common::Block { - height: obj.block_height, - hash: UInt256(obj.block_hash), - }; - let value = models::OperatorPublicKey { - data: UInt384(obj.key), - version: obj.version - }; - acc.insert(key, value); - acc - }), - previous_entry_hashes: (0..self.previous_entry_hashes_count).into_iter().fold( - BTreeMap::new(), - |mut acc, i| { - let obj = &*self.previous_entry_hashes.add(i); - let key = common::Block { - height: obj.block_height, - hash: UInt256(obj.block_hash), - }; - let value = UInt256(obj.hash); - acc.insert(key, value); - acc - }, - ), - previous_validity: (0..self.previous_validity_count).into_iter().fold( - BTreeMap::new(), - |mut acc, i| { - let obj = *self.previous_validity.add(i); - let key = common::Block { - height: obj.block_height, - hash: UInt256(obj.block_hash), - }; - let value = obj.is_valid; - acc.insert(key, value); - acc - }, - ), - known_confirmed_at_height: (self.known_confirmed_at_height > 0) - .then_some(self.known_confirmed_at_height), - update_height: self.update_height, - key_id_voting: UInt160(*self.key_id_voting), - is_valid: self.is_valid, - mn_type: self.mn_type.into(), - platform_http_port: self.platform_http_port, - platform_node_id: UInt160(*self.platform_node_id), - entry_hash: UInt256(*self.entry_hash), - } - } -} - -impl FromFFI for types::LLMQEntry { - type Item = models::LLMQEntry; - - unsafe fn decode(&self) -> Self::Item { - let signers_bitset = - slice::from_raw_parts(self.signers_bitset as *const u8, self.signers_bitset_length) - .to_vec(); - let valid_members_bitset = slice::from_raw_parts( - self.valid_members_bitset as *const u8, - self.valid_members_bitset_length, - ) - .to_vec(); - Self::Item { - version: self.version, - llmq_hash: UInt256(*self.llmq_hash), - index: if self.version.use_rotated_quorums() { Some(self.index) } else { None }, - public_key: UInt384(*self.public_key), - threshold_signature: UInt768(*self.threshold_signature), - verification_vector_hash: UInt256(*self.verification_vector_hash), - all_commitment_aggregated_signature: UInt768(*self.all_commitment_aggregated_signature), - signers_count: encode::VarInt(self.signers_count), - llmq_type: self.llmq_type, - valid_members_count: encode::VarInt(self.valid_members_count), - signers_bitset, - valid_members_bitset, - entry_hash: UInt256(*self.entry_hash), - verified: self.verified, - saved: self.saved, - commitment_hash: if self.commitment_hash.is_null() { - None - } else { - Some(UInt256(*self.commitment_hash)) - }, - } - } -} - -impl FromFFI for types::LLMQSnapshot { - type Item = models::LLMQSnapshot; - - unsafe fn decode(&self) -> Self::Item { - let member_list = slice::from_raw_parts(self.member_list as *const u8, self.member_list_length).to_vec(); - let skip_list = slice::from_raw_parts(self.skip_list as *const i32, self.skip_list_length).to_vec(); - Self::Item { - member_list, - skip_list, - skip_list_mode: self.skip_list_mode, - } - } -} - -impl FromFFI for types::Block { - type Item = common::Block; - - unsafe fn decode(&self) -> Self::Item { - Self::Item { - height: self.height, - hash: UInt256(*self.hash), - } - } -} diff --git a/dash-spv-masternode-processor/src/ffi/mod.rs b/dash-spv-masternode-processor/src/ffi/mod.rs deleted file mode 100644 index 741ea1be..00000000 --- a/dash-spv-masternode-processor/src/ffi/mod.rs +++ /dev/null @@ -1,8 +0,0 @@ -pub mod boxer; -pub mod callbacks; -pub mod common; -pub mod from; -pub mod to; -pub mod unboxer; - -pub use self::common::{ByteArray, IndexPathData, DerivationPathData}; diff --git a/dash-spv-masternode-processor/src/ffi/to.rs b/dash-spv-masternode-processor/src/ffi/to.rs deleted file mode 100644 index 871293b6..00000000 --- a/dash-spv-masternode-processor/src/ffi/to.rs +++ /dev/null @@ -1,354 +0,0 @@ -use std::collections::BTreeMap; -use std::ptr::null_mut; -use crate::{chain, common, models, tx, types}; -use crate::crypto::UInt256; -use crate::ffi::boxer::{boxed, boxed_vec}; -use crate::ffi::from::FromFFI; - -pub trait ToFFI { - type Item: FromFFI; - fn encode(&self) -> Self::Item; -} -impl ToFFI for tx::TransactionInput { - type Item = types::TransactionInput; - - fn encode(&self) -> Self::Item { - let (script, script_length) = match &self.script { - Some(data) => (boxed_vec(data.clone()), data.len()), - None => (null_mut(), 0), - }; - let (signature, signature_length) = match &self.signature { - Some(data) => (boxed_vec(data.clone()), data.len()), - None => (null_mut(), 0), - }; - Self::Item { - input_hash: boxed(self.input_hash.0), - index: self.index, - script, - script_length, - signature, - signature_length, - sequence: self.sequence, - } - } -} - -impl ToFFI for tx::TransactionOutput { - type Item = types::TransactionOutput; - - fn encode(&self) -> Self::Item { - let (script, script_length) = match &self.script { - Some(data) => (boxed_vec(data.clone()), data.len()), - None => (null_mut(), 0), - }; - let (address, address_length) = match &self.address { - Some(data) => (boxed_vec(data.clone()), data.len()), - None => (null_mut(), 0), - }; - Self::Item { - amount: self.amount, - script, - script_length, - address, - address_length, - } - } -} - -impl ToFFI for tx::Transaction { - type Item = types::Transaction; - - fn encode(&self) -> Self::Item { - Self::Item { - inputs: boxed_vec( - self.inputs - .iter() - .map(|input| boxed(input.encode())) - .collect(), - ), - inputs_count: self.inputs.len(), - outputs: boxed_vec( - self.outputs - .iter() - .map(|output| boxed(output.encode())) - .collect(), - ), - outputs_count: self.outputs.len(), - lock_time: self.lock_time, - version: self.version, - tx_hash: if self.tx_hash.is_none() { - null_mut() - } else { - boxed(self.tx_hash.unwrap().0) - }, - tx_type: self.tx_type, - payload_offset: self.payload_offset, - block_height: self.block_height, - } - } -} -impl ToFFI for tx::CoinbaseTransaction { - type Item = types::CoinbaseTransaction; - - fn encode(&self) -> Self::Item { - Self::Item { - base: boxed(self.base.encode()), - coinbase_transaction_version: self.coinbase_transaction_version, - height: self.height, - merkle_root_mn_list: boxed(self.merkle_root_mn_list.0), - merkle_root_llmq_list: if self.merkle_root_llmq_list.is_none() { - null_mut() - } else { - boxed(self.merkle_root_llmq_list.unwrap().0) - }, - best_cl_height_diff: self.best_cl_height_diff, - best_cl_signature: if self.best_cl_signature.is_none() { - null_mut() - } else { - boxed(self.best_cl_signature.unwrap().0) - }, - credit_pool_balance: self.credit_pool_balance.unwrap_or(i64::MIN) - } - } -} - -impl ToFFI for models::MasternodeList { - type Item = types::MasternodeList; - - fn encode(&self) -> Self::Item { - Self::Item { - block_hash: boxed(self.block_hash.0), - known_height: self.known_height, - masternode_merkle_root: if self.masternode_merkle_root.is_none() { - null_mut() - } else { - boxed(self.masternode_merkle_root.unwrap().0) - }, - llmq_merkle_root: if self.llmq_merkle_root.is_none() { - null_mut() - } else { - boxed(self.llmq_merkle_root.unwrap().0) - }, - masternodes: encode_masternodes_map(&self.masternodes), - masternodes_count: self.masternodes.len(), - llmq_type_maps: encode_quorums_map(&self.quorums), - llmq_type_maps_count: self.quorums.len(), - } - } -} - -impl ToFFI for models::MasternodeEntry { - type Item = types::MasternodeEntry; - - fn encode(&self) -> Self::Item { - let previous_operator_public_keys_count = self.previous_operator_public_keys.len(); - let previous_entry_hashes_count = self.previous_entry_hashes.len(); - let previous_validity_count = self.previous_validity.len(); - let confirmed_hash = boxed(self.confirmed_hash.0); - let confirmed_hash_hashed_with_provider_registration_transaction_hash = if self - .confirmed_hash_hashed_with_provider_registration_transaction_hash - .is_none() - { - null_mut() - } else { - boxed( - self.confirmed_hash_hashed_with_provider_registration_transaction_hash - .unwrap() - .0, - ) - }; - let key_id_voting = boxed(self.key_id_voting.0); - let known_confirmed_at_height = self.known_confirmed_at_height.unwrap_or(0); - let entry_hash = boxed(self.entry_hash.0); - let operator_public_key = boxed(self.operator_public_key.encode()); - let previous_operator_public_keys = boxed_vec( - self.previous_operator_public_keys - .iter() - .map( - |( - &common::Block { - hash, - height: block_height, - }, - &key, - )| types::BlockOperatorPublicKey { - block_hash: hash.0, - block_height, - key: key.data.0, - version: key.version - }, - ) - .collect(), - ); - let previous_entry_hashes = boxed_vec( - self.previous_entry_hashes - .iter() - .map(|(&common::Block { hash: block_hash, height: block_height }, &hash)| types::MasternodeEntryHash { block_hash: block_hash.0, block_height, hash: hash.0 }) - .collect(), - ); - let previous_validity = boxed_vec( - self.previous_validity - .iter() - .map( - |( - &common::Block { - hash, - height: block_height, - }, - &is_valid, - )| types::Validity { - block_hash: hash.0, - block_height, - is_valid, - }, - ) - .collect(), - ); - let provider_registration_transaction_hash = - boxed(self.provider_registration_transaction_hash.0); - let ip_address = boxed(self.socket_address.ip_address.0); - let port = self.socket_address.port; - let is_valid = self.is_valid; - let update_height = self.update_height; - let mn_type: u16 = self.mn_type.into(); - let platform_http_port = self.platform_http_port; - let platform_node_id = boxed(self.platform_node_id.0); - Self::Item { - confirmed_hash, - confirmed_hash_hashed_with_provider_registration_transaction_hash, - is_valid, - key_id_voting, - known_confirmed_at_height, - entry_hash, - operator_public_key, - previous_operator_public_keys, - previous_operator_public_keys_count, - previous_entry_hashes, - previous_entry_hashes_count, - previous_validity, - previous_validity_count, - provider_registration_transaction_hash, - ip_address, - port, - update_height, - mn_type, - platform_http_port, - platform_node_id - } - } -} - -impl ToFFI for models::LLMQEntry { - type Item = types::LLMQEntry; - - fn encode(&self) -> Self::Item { - let all_commitment_aggregated_signature = boxed(self.all_commitment_aggregated_signature.0); - let commitment_hash = if self.commitment_hash.is_none() { - null_mut() - } else { - boxed(self.commitment_hash.unwrap().0) - }; - let llmq_type = self.llmq_type; - let entry_hash = boxed(self.entry_hash.0); - let llmq_hash = boxed(self.llmq_hash.0); - let public_key = boxed(self.public_key.0); - let threshold_signature = boxed(self.threshold_signature.0); - let verification_vector_hash = boxed(self.verification_vector_hash.0); - let index = self.index.unwrap_or(0); - let saved = self.saved; - let verified = self.verified; - let version = self.version; - let signers_count = self.signers_count.0; - let valid_members_count = self.valid_members_count.0; - let signers_bitset = boxed_vec(self.signers_bitset.clone()); - let signers_bitset_length = self.signers_bitset.len(); - let valid_members_bitset = boxed_vec(self.valid_members_bitset.clone()); - let valid_members_bitset_length = self.valid_members_bitset.len(); - Self::Item { - all_commitment_aggregated_signature, - commitment_hash, - llmq_type, - entry_hash, - llmq_hash, - index, - public_key, - threshold_signature, - verification_vector_hash, - saved, - signers_bitset, - signers_bitset_length, - signers_count, - valid_members_bitset, - valid_members_bitset_length, - valid_members_count, - verified, - version, - } - } -} - -impl ToFFI for models::LLMQSnapshot { - type Item = types::LLMQSnapshot; - - fn encode(&self) -> Self::Item { - Self::Item { - member_list_length: self.member_list.len(), - member_list: boxed_vec(self.member_list.clone()), - skip_list_length: self.skip_list.len(), - skip_list: boxed_vec(self.skip_list.clone()), - skip_list_mode: self.skip_list_mode, - } - } -} - -impl ToFFI for models::OperatorPublicKey { - type Item = types::OperatorPublicKey; - - fn encode(&self) -> Self::Item { - Self::Item { data: self.data.0, version: self.version } - } -} - -impl ToFFI for common::Block { - type Item = types::Block; - - fn encode(&self) -> Self::Item { - Self::Item { - height: self.height, - hash: boxed(self.hash.0), - } - } -} - -pub fn encode_quorums_map( - quorums: &BTreeMap>, -) -> *mut *mut types::LLMQMap { - boxed_vec( - quorums - .iter() - .map(|(&llmq_type, map)| { - boxed(types::LLMQMap { - llmq_type: llmq_type.into(), - values: boxed_vec( - (*map) - .iter() - .map(|(_, entry)| boxed(entry.encode())) - .collect(), - ), - count: (*map).len(), - }) - }) - .collect(), - ) -} - -pub fn encode_masternodes_map( - masternodes: &BTreeMap, -) -> *mut *mut types::MasternodeEntry { - boxed_vec( - masternodes - .iter() - .map(|(_, entry)| boxed(entry.encode())) - .collect(), - ) -} diff --git a/dash-spv-masternode-processor/src/ffi/unboxer.rs b/dash-spv-masternode-processor/src/ffi/unboxer.rs deleted file mode 100644 index 4eb58306..00000000 --- a/dash-spv-masternode-processor/src/ffi/unboxer.rs +++ /dev/null @@ -1,64 +0,0 @@ -#![allow(unused_variables)] -#![allow(dead_code)] - -use std::ffi::CString; -use std::os::raw::c_char; -use crate::types::opaque_key::{OpaqueKey, OpaqueKeys, OpaqueSerializedKeys}; - -/// # Safety -pub unsafe fn unbox_any(any: *mut T) -> Box { - Box::from_raw(any) -} - -/// # Safety -pub unsafe fn unbox_vec(vec: Vec<*mut T>) -> Vec> { - vec.iter().map(|&x| unbox_any(x)).collect() -} - -/// # Safety -pub unsafe fn unbox_vec_ptr(ptr: *mut T, count: usize) -> Vec { - Vec::from_raw_parts(ptr, count, count) -} - -pub unsafe fn unbox_any_vec(vec: Vec<*mut T>) { - for &x in vec.iter() { - unbox_any(x); - } -} - -pub unsafe fn unbox_any_vec_ptr(ptr: *mut *mut T, count: usize) { - unbox_any_vec(unbox_vec_ptr(ptr, count)); -} - -/// # Safety -pub unsafe fn unbox_string(data: *mut c_char) { - let _ = CString::from_raw(data); -} - -pub unsafe fn unbox_opaque_key(data: *mut OpaqueKey) { - let k = unbox_any(data); - match *k { - OpaqueKey::ECDSA(key) => { let _ = unbox_any(key); }, - OpaqueKey::BLSLegacy(key) | - OpaqueKey::BLSBasic(key) => { let _ = unbox_any(key); }, - OpaqueKey::ED25519(key) => { let _ = unbox_any(key); }, - }; -} - -/// # Safety -pub unsafe fn unbox_opaque_keys(data: *mut OpaqueKeys) { - let res = unbox_any(data); - let keys = unbox_vec_ptr(res.keys, res.len); - for &x in keys.iter() { - unbox_opaque_key(x); - } -} - -/// # Safety -pub unsafe fn unbox_opaque_serialized_keys(data: *mut OpaqueSerializedKeys) { - let res = unbox_any(data); - let keys = unbox_vec_ptr(res.keys, res.len); - for &x in keys.iter() { - unbox_string(x) - } -} diff --git a/dash-spv-masternode-processor/src/ffi_expansions.rs b/dash-spv-masternode-processor/src/ffi_expansions.rs new file mode 100644 index 00000000..e69de29b diff --git a/dash-spv-masternode-processor/src/hash_types.rs b/dash-spv-masternode-processor/src/hash_types.rs deleted file mode 100644 index d6ed9257..00000000 --- a/dash-spv-masternode-processor/src/hash_types.rs +++ /dev/null @@ -1,65 +0,0 @@ -// Rust Bitcoin Library -// Written in 2014 by -// Andrew Poelstra -// -// To the extent possible under law, the author(s) have dedicated all -// copyright and related and neighboring rights to this software to -// the public domain worldwide. This software is distributed without -// any warranty. -// -// You should have received a copy of the CC0 Public Domain Dedication -// along with this software. -// If not, see . -// - -//! File defines types for hashes used throughout the library. These types are needed in order -//! to avoid mixing data of the same hash format (like SHA256d) but of different meaning -//! (transaction id, block hash etc). - -use hashes::*; -use crate::consensus; - -#[macro_export] -macro_rules! impl_hashencode { - ($hashtype:ident) => { - impl crate::consensus::Encodable for $hashtype { - fn consensus_encode(&self, s: S) -> Result { - self.0.consensus_encode(s) - } - } - - impl crate::consensus::Decodable for $hashtype { - fn consensus_decode(d: D) -> Result { - use hashes::Hash; - Ok(Self::from_inner(<<$hashtype as hashes::Hash>::Inner>::consensus_decode(d)?)) - } - } - } -} - -hash_newtype!(Txid, sha256d::Hash, 32, doc="A bitcoin transaction hash/transaction ID."); -hash_newtype!(Wtxid, sha256d::Hash, 32, doc="A bitcoin witness transaction ID."); -hash_newtype!(BlockHash, sha256d::Hash, 32, doc="A bitcoin block hash."); -hash_newtype!(SigHash, sha256d::Hash, 32, doc="Hash of the transaction according to the signature algorithm"); - -hash_newtype!(PubkeyHash, hash160::Hash, 20, doc="A hash of a public key."); -hash_newtype!(ScriptHash, hash160::Hash, 20, doc="A hash of Bitcoin Script bytecode."); -hash_newtype!(WPubkeyHash, hash160::Hash, 20, doc="SegWit version of a public key hash."); -hash_newtype!(WScriptHash, sha256::Hash, 32, doc="SegWit version of a Bitcoin Script bytecode hash."); - -hash_newtype!(TxMerkleNode, sha256d::Hash, 32, doc="A hash of the Merkle tree branch or root for transactions"); -hash_newtype!(WitnessMerkleNode, sha256d::Hash, 32, doc="A hash corresponding to the Merkle tree root for witness data"); -hash_newtype!(WitnessCommitment, sha256d::Hash, 32, doc="A hash corresponding to the witness structure commitment in the coinbase transaction"); -hash_newtype!(XpubIdentifier, hash160::Hash, 20, doc="XpubIdentifier as defined in BIP-32."); - -hash_newtype!(FilterHash, sha256d::Hash, 32, doc="Filter hash, as defined in BIP-157"); -hash_newtype!(FilterHeader, sha256d::Hash, 32, doc="Filter header, as defined in BIP-157"); - -impl_hashencode!(Txid); -impl_hashencode!(Wtxid); -impl_hashencode!(SigHash); -impl_hashencode!(BlockHash); -impl_hashencode!(TxMerkleNode); -impl_hashencode!(WitnessMerkleNode); -impl_hashencode!(FilterHash); -impl_hashencode!(FilterHeader); diff --git a/dash-spv-masternode-processor/src/internal_macros.rs b/dash-spv-masternode-processor/src/internal_macros.rs index 3bbf56c5..2258c29f 100644 --- a/dash-spv-masternode-processor/src/internal_macros.rs +++ b/dash-spv-masternode-processor/src/internal_macros.rs @@ -150,15 +150,6 @@ macro_rules! impl_index_newtype { } */ -macro_rules! display_from_debug { - ($thing:ident) => { - impl ::core::fmt::Display for $thing { - fn fmt(&self, f: &mut ::core::fmt::Formatter) -> Result<(), ::core::fmt::Error> { - ::core::fmt::Debug::fmt(self, f) - } - } - } -} /* #[cfg(test)] macro_rules! hex_script (($s:expr) => (<$crate::Script as ::core::str::FromStr>::from_str($s).unwrap())); @@ -545,104 +536,3 @@ macro_rules! impl_bytes_newtype { } */ -macro_rules! user_enum { - ( - $(#[$attr:meta])* - pub enum $name:ident { - $(#[$doc:meta] - $elem:ident <-> $txt:expr),* - } - ) => ( - $(#[$attr])* - pub enum $name { - $(#[$doc] $elem),* - } - - impl ::core::fmt::Display for $name { - fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { - f.pad(match *self { - $($name::$elem => $txt),* - }) - } - } - - impl ::core::str::FromStr for $name { - type Err = $crate::io::Error; - #[inline] - fn from_str(s: &str) -> Result { - match s { - $($txt => Ok($name::$elem)),*, - _ => { - #[cfg(not(feature = "std"))] let message = "Unknown network"; - #[cfg(feature = "std")] let message = format!("Unknown network (type {})", s); - Err($crate::io::Error::new( - $crate::io::ErrorKind::InvalidInput, - message, - )) - } - } - } - } - - #[cfg(feature = "serde")] - #[cfg_attr(docsrs, doc(cfg(feature = "serde")))] - impl<'de> ::serde::Deserialize<'de> for $name { - #[inline] - fn deserialize(deserializer: D) -> Result - where - D: ::serde::Deserializer<'de>, - { - use ::core::fmt::{self, Formatter}; - - struct Visitor; - impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = $name; - - fn expecting(&self, formatter: &mut Formatter) -> fmt::Result { - formatter.write_str("an enum value") - } - - fn visit_str(self, v: &str) -> Result - where - E: ::serde::de::Error, - { - static FIELDS: &'static [&'static str] = &[$(stringify!($txt)),*]; - - $( if v == $txt { Ok($name::$elem) } )else* - else { - Err(E::unknown_variant(v, FIELDS)) - } - } - - fn visit_borrowed_str(self, v: &'de str) -> Result - where - E: ::serde::de::Error, - { - self.visit_str(v) - } - - fn visit_string(self, v: String) -> Result - where - E: ::serde::de::Error, - { - self.visit_str(&v) - } - - } - - deserializer.deserialize_str(Visitor) - } - } - - #[cfg(feature = "serde")] - #[cfg_attr(docsrs, doc(cfg(feature = "serde")))] - impl ::serde::Serialize for $name { - fn serialize(&self, serializer: S) -> Result - where - S: ::serde::Serializer, - { - serializer.collect_str(&self) - } - } - ); -} diff --git a/dash-spv-masternode-processor/src/keys/bls_key.rs b/dash-spv-masternode-processor/src/keys/bls_key.rs deleted file mode 100644 index 8b63171a..00000000 --- a/dash-spv-masternode-processor/src/keys/bls_key.rs +++ /dev/null @@ -1,638 +0,0 @@ -use bls_signatures::bip32::{ChainCode, ExtendedPrivateKey, ExtendedPublicKey}; -use bls_signatures::{BasicSchemeMPL, BlsError, G1Element, G2Element, LegacySchemeMPL, PrivateKey, Scheme}; -use hashes::{Hash, hex::FromHex, sha256, sha256d, hex}; -use hashes::hex::ToHex; -use crate::chain::{derivation::IIndexPath, ScriptMap}; -use crate::consensus::Encodable; -use crate::crypto::{UInt256, UInt384, UInt768, byte_util::{AsBytes, BytesDecodable, Zeroable}, UInt160}; -use crate::keys::{IKey, KeyKind, dip14::{IChildKeyDerivation, SignKey}}; -use crate::keys::crypto_data::{CryptoData, DHKey}; -use crate::models::OperatorPublicKey; -use crate::util::{base58, data_ops::hex_with_data, sec_vec::SecVec}; -#[cfg(feature = "use_serde")] -use serde::{Deserialize, Deserializer, Serialize, Serializer}; - -#[derive(Clone, Debug, Default)] -pub struct BLSKey { - pub seckey: UInt256, - pub chaincode: UInt256, - pub pubkey: UInt384, - pub extended_private_key_data: SecVec, - pub extended_public_key_data: Vec, - pub use_legacy: bool, -} - -impl BLSKey { - - pub fn key_with_secret_hex(string: &str, use_legacy: bool) -> Result { - Vec::from_hex(string) - .map(|data| Self::key_with_seed_data(&data, use_legacy)) - } - pub fn key_with_private_key(string: &str, use_legacy: bool) -> Option { - Vec::from_hex(string) - .ok() - .and_then(|data| Self::key_with_private_key_data(&data, use_legacy)) - } - - pub fn key_with_private_key_data(data: &[u8], use_legacy: bool) -> Option { - UInt256::from_bytes(data, &mut 0) - .and_then(|seckey| PrivateKey::from_bytes(data, use_legacy) - .ok() - .and_then(|bls_private_key| bls_private_key - .g1_element() - .ok() - .map(|bls_public_key| Self { - seckey, - pubkey: UInt384(g1_element_serialized(&bls_public_key, use_legacy)), - use_legacy, - ..Default::default() - }))) - } - - pub fn key_with_public_key(pubkey: UInt384, use_legacy: bool) -> Self { - Self { pubkey, use_legacy, ..Default::default() } - } - - pub fn product(&self, public_key: &BLSKey) -> Option<[u8; 48]> { - match (self.bls_private_key(), public_key.bls_public_key(), self.use_legacy) { - (Ok(priv_key), Ok(pub_key), use_legacy) if public_key.use_legacy == use_legacy => - (priv_key * pub_key).map(|pk| g1_element_serialized(&pk, use_legacy)).ok(), - _ => None - } - } -} - -impl IKey for BLSKey { - fn r#type(&self) -> KeyKind { - KeyKind::BLS // &KeyType::BLSBasic - } - fn sign(&self, data: &[u8]) -> Vec { - self.sign_digest(UInt256::from(data)).as_bytes().to_vec() - } - fn verify(&mut self, message_digest: &[u8], signature: &[u8]) -> bool { - self.verify_uint768(UInt256::from(message_digest), UInt768::from(signature)) - } - fn verify_with_uint(&mut self, message_digest: UInt256, signature: &[u8]) -> bool { - self.verify_uint768(message_digest, UInt768::from(signature)) - } - - fn secret_key(&self) -> UInt256 { - self.seckey - } - - fn chaincode(&self) -> UInt256 { - self.chaincode - } - - fn fingerprint(&self) -> u32 { - self.public_key_fingerprint() - } - - fn private_key_data(&self) -> Option> where Self: Sized { - (!self.seckey.is_zero()) - .then_some(self.seckey.0.to_vec()) - } - - fn public_key_data(&self) -> Vec { - self.pubkey.0.to_vec() - } - - fn extended_private_key_data(&self) -> Option { - Some(self.extended_private_key_data.clone()) - } - - fn extended_public_key_data(&self) -> Option> { - Some(self.extended_public_key_data.clone()) - } - - fn private_derive_to_path2(&self, path: &PATH) -> Option - where Self: Sized + IChildKeyDerivation, - PATH: IIndexPath, SK: SignKey { - todo!() - } - - fn private_derive_to_path(&self, path: &PATH) -> Option - where Self: Sized, PATH: IIndexPath { - ExtendedPrivateKey::from_bytes(self.extended_private_key_data.as_slice()) - .ok() - .and_then(|bls_extended_private_key| - Self::init_with_bls_extended_private_key(&Self::derive(bls_extended_private_key, path), self.use_legacy).ok()) - } - - fn serialized_private_key_for_script(&self, script: &ScriptMap) -> String { - // if (uint256_is_zero(self.secretKey)) return nil; - // NSMutableData *d = [NSMutableData secureDataWithCapacity:sizeof(UInt256) + 2]; - let mut writer = SecVec::with_capacity(34); - script.privkey.enc(&mut writer); - self.seckey.enc(&mut writer); - b'\x02'.enc(&mut writer); - base58::check_encode_slice(&writer) - } - - fn hmac_256_data(&self, data: &[u8]) -> UInt256 { - UInt256::hmac::(self.seckey.as_bytes(), data) - } - - fn forget_private_key(&mut self) { - self.seckey = UInt256::MIN; - } -} - -impl BLSKey { - - pub fn init_with_extended_private_key_data(data: &Vec, use_legacy: bool) -> Result { - ExtendedPrivateKey::from_bytes(data) - .and_then(|bls_extended_private_key| Self::init_with_bls_extended_private_key(&bls_extended_private_key, use_legacy)) - } - - pub fn init_with_extended_public_key_data(data: &Vec, use_legacy: bool) -> Result { - extended_public_key_from_bytes(data, use_legacy) - .map(|bls_extended_public_key| Self::init_with_bls_extended_public_key(&bls_extended_public_key, use_legacy)) - } - - /// A little recursive magic since extended private keys can't be re-assigned in the library - pub fn derive(extended_private_key: ExtendedPrivateKey, path: &PATH) -> ExtendedPrivateKey - where PATH: IIndexPath { - if path.is_empty() { - extended_private_key - } else { - // always use legacy scheme derivation - Self::derive(extended_private_key.private_child_legacy(path.index_at_position(0)), &path.index_path_by_removing_first_index()) - } - } - - pub fn public_derive(extended_public_key: ExtendedPublicKey, index_path: &PATH, use_legacy: bool) -> ExtendedPublicKey - where PATH: IIndexPath { - if index_path.is_empty() { - extended_public_key - } else { - let top_index_path = index_path.index_at_position(0); - assert_eq!(top_index_path >> 31, 0, "There should be no hardened derivation if you wish to derive extended public keys"); - let pk_child = if use_legacy { - extended_public_key.public_child_legacy(top_index_path) - } else { - extended_public_key.public_child(top_index_path) - }; - Self::public_derive(pk_child, &index_path.index_path_by_removing_first_index(), use_legacy) - } - } - - pub fn key_with_seed_data(seed: &[u8], use_legacy: bool) -> Self { - let bls_private_key = PrivateKey::from_bip32_seed(seed); - let bls_public_key = bls_private_key.g1_element().unwrap(); - let seckey = UInt256::from(&*bls_private_key.to_bytes()); - let pubkey = UInt384(g1_element_serialized(&bls_public_key, use_legacy)); - Self { seckey, pubkey, use_legacy, ..Default::default() } - } - - - pub fn init_with_bls_extended_public_key(bls_extended_public_key: &ExtendedPublicKey, use_legacy: bool) -> Self { - let bls_public_key = bls_extended_public_key.public_key(); - Self { - extended_public_key_data: extended_public_key_serialized(bls_extended_public_key, use_legacy).to_vec(), - chaincode: bls_extended_public_key.chain_code().into(), - pubkey: UInt384(g1_element_serialized(&bls_public_key, use_legacy)), - use_legacy, - ..Default::default() - } - } - - pub fn init_with_bls_extended_private_key(bls_extended_private_key: &ExtendedPrivateKey, use_legacy: bool) -> Result { - let extended_public_key = extended_public_key_from_extended_private_key(bls_extended_private_key, use_legacy)?; - let extended_public_key_data = extended_public_key_serialized(&extended_public_key, use_legacy); - let chaincode = bls_extended_private_key.chain_code().into(); - let bls_private_key = bls_extended_private_key.private_key(); - let bls_public_key = bls_private_key.g1_element()?; - Ok(Self { - extended_private_key_data: SecVec::from(bls_extended_private_key), - extended_public_key_data: extended_public_key_data.to_vec(), - chaincode, - seckey: UInt256::from(bls_private_key), - pubkey: UInt384(g1_element_serialized(&bls_public_key, use_legacy)), - use_legacy, - }) - } - - pub fn extended_private_key_with_seed_data(seed: &[u8], use_legacy: bool) -> Result { - ExtendedPrivateKey::from_seed(seed) - .and_then(|bls_extended_private_key| Self::init_with_bls_extended_private_key(&bls_extended_private_key, use_legacy)) - } - - - pub fn public_key_from_extended_public_key_data(data: &[u8], index_path: &PATH, use_legacy: bool) -> Option> - where PATH: IIndexPath { - extended_public_key_from_bytes(data, use_legacy) - .ok() - .and_then(|bls_extended_public_key| - BLSKey::init_with_bls_extended_public_key(&bls_extended_public_key, use_legacy) - .public_derive_to_path(index_path) - .map(|pk| pk.public_key_data())) - } - - pub fn public_key_fingerprint(&self) -> u32 { - match g1_element_from_bytes(self.use_legacy, self.pubkey.as_bytes()) { - Ok(pk) if self.use_legacy => pk.fingerprint_legacy(), - Ok(pk) => pk.fingerprint(), - _ => 0 - } - } - - pub fn secret_key_string(&self) -> String { - if self.seckey.is_zero() { - String::new() - } else { - hex_with_data(self.seckey.as_bytes()) - } - } - - pub fn serialized_private_key_for_script_map(&self, map: &ScriptMap) -> Option { - if self.seckey.is_zero() { - None - } else { - // todo: impl securebox here - let mut writer = Vec::::with_capacity(34); - map.privkey.enc(&mut writer); - self.seckey.enc(&mut writer); - b'\x02'.enc(&mut writer); - Some(base58::check_encode_slice(&writer)) - } - } - - pub fn public_derive_to_path(&mut self, index_path: &PATH) -> Option - where PATH: IIndexPath { - if (self.extended_public_key_data().is_none() || self.extended_public_key_data().unwrap().is_empty()) && self.extended_private_key_data.is_empty() { - None - } else if let Some(bls_extended_public_key) = self.bls_extended_public_key() { - Some(BLSKey::init_with_bls_extended_public_key(&BLSKey::public_derive(bls_extended_public_key, index_path, self.use_legacy), self.use_legacy)) - } else { - None - } - } - - pub fn bls_extended_public_key(&mut self) -> Option { - if let Some(bytes) = self.extended_public_key_data() { - extended_public_key_from_bytes(&bytes, self.use_legacy).ok() - } else if let Some(bytes) = self.extended_private_key_data() { - ExtendedPrivateKey::from_bytes(&bytes) - .and_then(|pk| extended_public_key_from_extended_private_key(&pk, self.use_legacy)).ok() - } else { - None - } - } - - pub fn extended_private_key(&self) -> Result { - self.bls_extended_private_key() - .and_then(|pk| Self::init_with_bls_extended_private_key(&pk, self.use_legacy)) - } - - pub fn bls_extended_private_key(&self) -> Result { - ExtendedPrivateKey::from_bytes(&self.extended_private_key_data) - } - - pub(crate) fn bls_private_key(&self) -> Result { - if !self.seckey.is_zero() { - PrivateKey::from_bytes(self.seckey.as_bytes(), true) - } else { - ExtendedPrivateKey::from_bytes(self.extended_private_key_data.as_slice()).map(|ext_pk| ext_pk.private_key()) - } - } - - pub(crate) fn bls_public_key(&self) -> Result { - if self.pubkey.is_zero() { - self.bls_private_key().and_then(|bls_pk| bls_pk.g1_element()) - } else { - g1_element_from_bytes(self.use_legacy, self.pubkey.as_bytes()) - } - } - - pub(crate) fn bls_public_key_serialized(&self, use_legacy: bool) -> Option<[u8; 48]> { - self.bls_public_key() - .ok() - .map(|pk| g1_element_serialized(&pk, use_legacy)) - } - - pub fn public_key_uint(&self) -> UInt384 { - self.bls_public_key_serialized(self.use_legacy) - .map_or(UInt384::MIN, |key| UInt384(key)) - } - - pub fn bls_version(&self) -> u16 { - if self.use_legacy { - 1 - } else { - 2 - } - } - - /// Signing - fn sign_message(&self, private_key: &PrivateKey, message: &[u8]) -> UInt768 { - UInt768(g2_element_serialized(&if self.use_legacy { - LegacySchemeMPL::new().sign(private_key, message) - } else { - BasicSchemeMPL::new().sign(private_key, message) - }, self.use_legacy)) - } - - fn sign_with_key(&self, message_producer: F) -> UInt768 where F: FnOnce() -> [u8; 32] { - if self.seckey.is_zero() && self.extended_private_key_data.is_empty() { - UInt768::MAX - } else if let Ok(bls_private_key) = self.bls_private_key() { - self.sign_message(&bls_private_key, &message_producer()) - } else { - UInt768::MAX - } - } - - pub fn sign_data(&self, data: &[u8]) -> UInt768 { - self.sign_with_key(|| sha256d::Hash::hash(data).into_inner()) - } - - pub fn sign_data_single_sha256(&self, data: &[u8]) -> UInt768 { - self.sign_with_key(|| sha256::Hash::hash(data).into_inner()) - } - - pub fn sign_digest(&self, md: UInt256) -> UInt768 { - self.sign_with_key(|| md.0) - } - - pub fn sign_message_digest(&self, digest: UInt256, completion: fn(bool, UInt768)) { - let signature = self.sign_digest(digest); - completion(!signature.is_zero(), signature) - } - - /// Verification - - fn verify_message(public_key: &G1Element, message: &[u8], signature: UInt768, use_legacy: bool) -> bool { - match g2_element_from_bytes(use_legacy, signature.as_bytes()) { - Ok(signature) if use_legacy => - LegacySchemeMPL::new().verify(public_key, message, &signature), - Ok(signature) => - BasicSchemeMPL::new().verify(public_key, message, &signature), - _ => false - } - } - - fn verify_message_with_key(key: &BLSKey, message: &[u8], signature: UInt768) -> bool { - key.bls_public_key() - .map_or(false, |public_key| Self::verify_message(&public_key, message, signature, key.use_legacy)) - } - - pub fn verify_uint768(&self, digest: UInt256, signature: UInt768) -> bool { - let digest_hex = digest.as_bytes().to_hex(); - let signature_hex = signature.as_bytes().to_hex(); - - Self::verify_message_with_key(self, digest.as_bytes(), signature) - } - - pub fn verify_insecure(&self, message: &[u8], signature: UInt768) -> bool { - return self.bls_public_key() - .map_or(false, |public_key| - match g2_element_from_bytes(false, signature.as_bytes()) { - Ok(signature) => - BasicSchemeMPL::new().verify(&public_key, message, &signature), - _ => false - } - ); - } - - pub fn verify_with_public_key(digest: UInt256, signature: UInt768, public_key: UInt384, use_legacy: bool) -> bool { - Self::verify_message_with_key(&BLSKey::key_with_public_key(public_key, use_legacy), digest.as_bytes(), signature) - } - - pub fn verify_secure_aggregated(commitment_hash: UInt256, signature: UInt768, operator_keys: Vec, use_legacy: bool) -> bool { - let message = commitment_hash.as_bytes(); - let public_keys = operator_keys.iter().filter_map(|key| { - let result: Result = key.into(); - result.ok() - }).collect::>(); - let public_keys = public_keys.iter().collect::>(); - match g2_element_from_bytes(use_legacy, signature.as_bytes()) { - Ok(signature) if use_legacy => LegacySchemeMPL::new().verify_secure(public_keys, message, &signature), - Ok(signature) => BasicSchemeMPL::new().verify_secure(public_keys, message, &signature), - _ => false - } - } - - pub fn verify_quorum_signature(message: &[u8], threshold_signature: &[u8], public_key: &[u8], use_legacy: bool) -> bool { - match (g1_element_from_bytes(use_legacy, public_key), - g2_element_from_bytes(use_legacy, threshold_signature)) { - (Ok(public_key), Ok(signature)) if use_legacy => - LegacySchemeMPL::new().verify(&public_key, message, &signature), - (Ok(public_key), Ok(signature)) => - BasicSchemeMPL::new().verify(&public_key, message, &signature), - _ => false - } - } - - pub fn verify_aggregated_signature(signature: UInt768, keys: Vec, messages: Vec>, use_legacy: bool) -> bool { - let bls_public_keys = keys.iter().filter_map(|key| key.bls_public_key().ok()).collect::>(); - let public_keys = bls_public_keys.iter().collect::>(); - let messages = messages.iter().map(|m| m.as_slice()).collect::>(); - let bytes = signature.as_bytes(); - match g2_element_from_bytes(use_legacy, bytes) { - Ok(signature) if use_legacy => - LegacySchemeMPL::new().aggregate_verify(public_keys, messages, &signature), - Ok(signature) => - BasicSchemeMPL::new().aggregate_verify(public_keys, messages, &signature), - _ => false - } - } - - pub fn public_key_and_signature_from_seed(schema: S, seed: &[u8], message: &[u8]) -> (G1Element, G2Element) { - let private_key = PrivateKey::from_bip32_seed(seed); - let signature = schema.sign(&private_key, message); - let public_key = private_key.g1_element().unwrap(); - (public_key, signature) - } - -} - -/// For FFI -impl BLSKey { - pub fn public_key_from_extended_public_key_data_at_index_path(key: &Self, index_path: &PATH) -> Option where Self: Sized, PATH: IIndexPath { - key.extended_public_key_data() - .and_then(|ext_pk_data| Self::public_key_from_extended_public_key_data(&ext_pk_data, index_path, key.use_legacy)) - .map(|pub_key_data| Self::key_with_public_key(UInt384::from(pub_key_data), key.use_legacy)) - } - - pub fn key_with_extended_public_key_data(bytes: &[u8], use_legacy: bool) -> Option { - extended_public_key_from_bytes(bytes, use_legacy) - .ok() - .map(|bls_extended_public_key| Self::init_with_bls_extended_public_key(&bls_extended_public_key, use_legacy)) - } - - pub fn key_with_extended_private_key_data(bytes: &[u8], use_legacy: bool) -> Result { - ExtendedPrivateKey::from_bytes(bytes) - .and_then(|pk| Self::init_with_bls_extended_private_key(&pk, use_legacy)) - } - - pub fn migrate_from_legacy_extended_public_key_data(bytes: &[u8]) -> Result { - ExtendedPublicKey::from_bytes_legacy(bytes) - .map(|extended_public_key| Self { - pubkey: UInt384(g1_element_serialized(&extended_public_key.public_key(), false)), - chaincode: extended_public_key.chain_code().into(), - extended_public_key_data: extended_public_key_serialized(&extended_public_key, false).to_vec(), - ..Default::default() - }) - } - - pub fn migrate_from_basic_extended_public_key_data(bytes: &[u8]) -> Result { - ExtendedPublicKey::from_bytes(bytes) - .map(|extended_public_key| Self { - pubkey: UInt384(g1_element_serialized(&extended_public_key.public_key(), true)), - chaincode: extended_public_key.chain_code().into(), - extended_public_key_data: extended_public_key_serialized(&extended_public_key, true).to_vec(), - ..Default::default() - }) - } - - pub fn has_private_key(&self) -> bool { - !self.seckey.is_zero() - } - - pub fn hash160(&self) -> UInt160 { - UInt160::hash160(&self.public_key_data()) - } - -} - - -impl DHKey for BLSKey { - fn init_with_dh_key_exchange_with_public_key(public_key: &mut Self, private_key: &Self) -> Option where Self: Sized { - match (public_key.bls_public_key(), private_key.bls_private_key(), private_key.use_legacy) { - (Ok(bls_public_key), Ok(bls_private_key), use_legacy) if public_key.use_legacy == use_legacy => - (bls_private_key * bls_public_key) - .ok() - .map(|key| - BLSKey::key_with_public_key(UInt384(g1_element_serialized(&key, use_legacy)), use_legacy)), - _ => None - } - } -} - -impl CryptoData for Vec { - - fn encrypt_with_secret_key_using_iv(&mut self, secret_key: &BLSKey, public_key: &BLSKey, initialization_vector: Vec) -> Option> { - secret_key.product(public_key) - .and_then(|sym_key_data| sym_key_data[..32].try_into().ok()) - .map(|key_data: [u8; 32]| { - let mut destination = initialization_vector.clone(); - let iv: [u8; 16] = initialization_vector[..16].try_into().unwrap(); - let encrypted_data = >::encrypt(self, key_data, iv).unwrap(); - destination.extend(encrypted_data.clone()); - destination - }) - } - - fn decrypt_with_secret_key_using_iv_size(&mut self, secret_key: &BLSKey, public_key: &BLSKey, iv_size: usize) -> Option> { - if self.len() < iv_size { - return None; - } - secret_key.product(public_key) - .and_then(|sym_key_data| sym_key_data[..32].try_into().ok()) - .and_then(|key_data: [u8; 32]| - >::decrypt(self[iv_size..self.len()].to_vec(), key_data, &self[..iv_size])) - } - - fn encrypt_with_dh_key_using_iv(&self, key: &BLSKey, initialization_vector: Vec) -> Option> { - let mut destination = initialization_vector.clone(); - key.bls_public_key_serialized(key.use_legacy) - .and_then(|sym_key_data| sym_key_data[..32].try_into().ok()) - .and_then(|key_data: [u8; 32]| initialization_vector[..16].try_into().ok() - .and_then(|iv_data: [u8; 16]| >::encrypt(self, key_data, iv_data)) - .map(|encrypted_data| { - destination.extend(encrypted_data); - destination - })) - } - - fn decrypt_with_dh_key_using_iv_size(&self, key: &BLSKey, iv_size: usize) -> Option> { - if self.len() < iv_size { - return None; - } - key.bls_public_key_serialized(key.use_legacy) - .and_then(|sym_key_data| sym_key_data[..32].try_into().ok()) - .and_then(|key_data: [u8; 32]| self[..iv_size].try_into().ok() - .and_then(|iv_data: [u8; 16]| - >::decrypt(self[iv_size..self.len()].to_vec(), key_data, iv_data))) - } -} - -fn extended_public_key_from_bytes(bytes: &[u8], use_legacy: bool) -> Result { - if use_legacy { - ExtendedPublicKey::from_bytes_legacy(bytes) - } else { - ExtendedPublicKey::from_bytes(bytes) - } -} - -fn g1_element_from_bytes(use_legacy: bool, bytes: &[u8]) -> Result { - if use_legacy { - G1Element::from_bytes_legacy(bytes) - } else { - G1Element::from_bytes(bytes) - } -} - -pub(crate) fn g1_element_serialized(public_key: &G1Element, use_legacy: bool) -> [u8; 48] { - *if use_legacy { - public_key.serialize_legacy() - } else { - public_key.serialize() - } -} - -fn g2_element_serialized(signature: &G2Element, use_legacy: bool) -> [u8; 96] { - *if use_legacy { - signature.serialize_legacy() - } else { - signature.serialize() - } -} - -fn g2_element_from_bytes(use_legacy: bool, bytes: &[u8]) -> Result { - if use_legacy { - G2Element::from_bytes_legacy(bytes) - } else { - G2Element::from_bytes(bytes) - } -} -fn extended_public_key_from_extended_private_key(private_key: &ExtendedPrivateKey, use_legacy: bool) -> Result { - if use_legacy { - private_key.extended_public_key_legacy() - } else { - private_key.extended_public_key() - } -} - -fn extended_public_key_serialized(public_key: &ExtendedPublicKey, use_legacy: bool) -> [u8; 93] { - *if use_legacy { - public_key.serialize_legacy() - } else { - public_key.serialize() - } -} - -impl From for UInt256 { - fn from(value: ChainCode) -> Self { - UInt256(*value.serialize()) - } -} - -impl From for UInt256 { - fn from(value: PrivateKey) -> Self { - UInt256::from(value.to_bytes().as_slice()) - } -} - -impl From<&OperatorPublicKey> for Result { - fn from(value: &OperatorPublicKey) -> Self { - g1_element_from_bytes(value.is_legacy(), &value.data.0) - } -} - -impl From<&ExtendedPrivateKey> for SecVec { - fn from(value: &ExtendedPrivateKey) -> Self { - SecVec::with_vec(value.serialize().to_vec()) - } -} diff --git a/dash-spv-masternode-processor/src/keys/dip14.rs b/dash-spv-masternode-processor/src/keys/dip14.rs deleted file mode 100644 index 28eab360..00000000 --- a/dash-spv-masternode-processor/src/keys/dip14.rs +++ /dev/null @@ -1,207 +0,0 @@ -use ed25519_dalek::{SigningKey, VerifyingKey}; -use secp256k1::Scalar; -use crate::chain::derivation::{BIP32_HARD, IIndexPath}; -use crate::consensus::encode::Encodable; -use crate::crypto::{ECPoint, UInt256, UInt512, byte_util::{AsBytes, clone_into_array}}; -use crate::keys::{ECDSAKey, ED25519Key}; - -pub trait IChildKeyDerivationData where SK: SignKey { - fn private_key_data_input(key: &SK, path: &PATH, position: usize) -> Vec where PATH: IIndexPath; - fn public_key_data_input(key: &PK, path: &PATH, position: usize) -> Vec where PATH: IIndexPath; -} - -impl IChildKeyDerivationData for ECDSAKey { - fn private_key_data_input(key: &UInt256, path: &PATH, position: usize) -> Vec where PATH: IIndexPath { - let index = path.index_at_position(position); - let buf = &mut [0u8; 37]; - if index & BIP32_HARD != 0 { - buf[1..33].copy_from_slice(&key.0); - } else { - buf[..33].copy_from_slice(&secp256k1_point_from_bytes(&key.0)); - } - buf[33..37].copy_from_slice(index.to_be_bytes().as_slice()); - buf.to_vec() - } - - fn public_key_data_input(key: &ECPoint, path: &PATH, position: usize) -> Vec where PATH: IIndexPath { - let index = path.index_at_position(position); - if index & BIP32_HARD != 0 { - panic!("can't derive private child key from public parent key"); - } - let writer = &mut [0u8; 37]; - writer[..33].copy_from_slice(&key.0); - writer[33..].copy_from_slice(&index.to_be_bytes()); - writer.to_vec() - } -} - -impl IChildKeyDerivationData for ECDSAKey { - fn private_key_data_input(key: &UInt256, path: &PATH, position: usize) -> Vec where PATH: IIndexPath { - let index = path.index_at_position(position); - let is_hardened = path.hardened_at_position(position); - let i_is_31_bits = index.is_31_bits(); - let mut writer = Vec::::new(); - if is_hardened { - 0u8.enc(&mut writer); - writer.extend_from_slice(&key.0); - } else { - writer.extend_from_slice(&secp256k1_point_from_bytes(&key.0)); - }; - if i_is_31_bits { - let mut small_i = index.u32_le(); - if is_hardened { - small_i |= BIP32_HARD; - } - small_i.swap_bytes().enc(&mut writer); - } else { - index.enc(&mut writer); - }; - writer - } - - fn public_key_data_input(key: &ECPoint, path: &PATH, position: usize) -> Vec where PATH: IIndexPath { - let index = path.index_at_position(position); - let is_hardened = path.hardened_at_position(position); - if is_hardened { - panic!("can't derive private child key from public parent key"); - } - let mut writer = key.as_bytes().to_vec(); - if index.is_31_bits() { - writer.extend_from_slice(&index.u32_le().to_be_bytes()); - } else { - writer.extend_from_slice(index.as_bytes()); - }; - writer - } -} - -impl IChildKeyDerivationData for ED25519Key { - fn private_key_data_input(key: &SigningKey, path: &PATH, position: usize) -> Vec where PATH: IIndexPath { - let mut index = path.index_at_position(position); - // it's always hardened - index |= BIP32_HARD; - let writer = &mut [0u8; 37]; - writer[1..33].copy_from_slice(&key.to_bytes()); - writer[33..37].copy_from_slice(&index.to_be_bytes()); - writer.to_vec() - } - - fn public_key_data_input(key: &UInt256, path: &PATH, position: usize) -> Vec where PATH: IIndexPath { - let index = path.index_at_position(position); - if index & BIP32_HARD != 0 { - panic!("can't derive private child key from public parent key"); - } - let writer = &mut [0u8; 36]; - writer[..32].copy_from_slice(&key.0); - writer[32..].copy_from_slice(&index.to_be_bytes()); - writer.to_vec() - } -} - -impl IChildKeyDerivationData for ED25519Key { - fn private_key_data_input(key: &SigningKey, path: &PATH, position: usize) -> Vec where PATH: IIndexPath { - let index = path.index_at_position(position); - let is_hardened = path.hardened_at_position(position); - - let i_is_31_bits = index.is_31_bits(); - let mut writer = Vec::::new(); - if is_hardened { - 0u8.enc(&mut writer); - writer.extend_from_slice(&key.to_bytes()); - } else { - panic!("For ED25519 only hardened derivation is supported"); - }; - if i_is_31_bits { - let mut small_i = index.u32_le(); - if is_hardened { - small_i |= BIP32_HARD; - } - small_i.swap_bytes().enc(&mut writer); - } else { - index.enc(&mut writer); - }; - writer - } - - fn public_key_data_input(key: &UInt256, path: &PATH, position: usize) -> Vec where PATH: IIndexPath { - let index = path.index_at_position(position); - let is_hardened = path.hardened_at_position(position); - if is_hardened { - panic!("can't derive private child key from public parent key"); - } - let mut writer = key.as_bytes().to_vec(); - if index.is_31_bits() { - writer.extend_from_slice(&index.u32_le().to_be_bytes()); - } else { - writer.extend_from_slice(index.as_bytes()); - }; - writer - } -} - -pub trait SignKey: Sized { - // type Inner; -} - -impl SignKey for UInt256 { /*type Inner = UInt256;*/ } -impl SignKey for SigningKey { /*type Inner = SigningKey;*/ } - -pub trait IChildKeyDerivation where SK: SignKey + ?Sized { - fn derive_child_private_key(key: &mut SK, chaincode: &mut UInt256, path: &PATH, position: usize) where PATH: IIndexPath; - fn derive_child_public_key(key: &mut PK, chaincode: &mut UInt256, path: &PATH, position: usize) where PATH: IIndexPath; -} - -pub fn secp256k1_point_from_bytes(data: &[u8]) -> [u8; 33] { - let sec = secp256k1::SecretKey::from_slice(data).unwrap(); - let s = secp256k1::Secp256k1::new(); - let pub_key = secp256k1::PublicKey::from_secret_key(&s, &sec); - pub_key.serialize() -} - - -impl IChildKeyDerivation for ECDSAKey where Self: IChildKeyDerivationData { - fn derive_child_private_key(key: &mut UInt256, chaincode: &mut UInt256, path: &PATH, position: usize) - where PATH: IIndexPath { - let i = UInt512::hmac(chaincode.as_ref(), Self::private_key_data_input(key, path, position).as_ref()); - let mut sec_key = secp256k1::SecretKey::from_slice(&key.0).expect("invalid private key"); - let tweak = Scalar::from_be_bytes(clone_into_array(&i.0[..32])).expect("invalid tweak"); - sec_key = sec_key.add_tweak(&tweak).expect("failed to add tweak"); - key.0.copy_from_slice(&sec_key.secret_bytes()); - chaincode.0.copy_from_slice(&i.0[32..]); - } - - fn derive_child_public_key(key: &mut ECPoint, chaincode: &mut UInt256, path: &PATH, position: usize) - where PATH: IIndexPath { - let i = UInt512::hmac(chaincode.as_ref(), Self::public_key_data_input(key, path, position).as_ref()); - let s = secp256k1::Secp256k1::new(); - let mut pub_key = secp256k1::PublicKey::from_slice(&key.0).expect("invalid public key"); - let tweak = Scalar::from_be_bytes(clone_into_array(&i.0[..32])).expect("invalid tweak"); - pub_key = pub_key.add_exp_tweak(&s, &tweak).expect("failed to add exp tweak"); - chaincode.0.copy_from_slice(&i.0[32..]); - key.0.copy_from_slice(pub_key.serialize().as_slice()) - } -} - -impl IChildKeyDerivation for ED25519Key where Self: IChildKeyDerivationData { - fn derive_child_private_key(key: &mut SigningKey, chaincode: &mut UInt256, path: &PATH, position: usize) - where PATH: IIndexPath { - let i = UInt512::hmac(chaincode.as_ref(), Self::private_key_data_input(key, path, position).as_ref()); - let scalar: [u8; 32] = i.0[..32].try_into().unwrap(); - key.clone_from(&SigningKey::from(&scalar)); - chaincode.0.copy_from_slice(&i.0[32..]); - } - - fn derive_child_public_key(key: &mut UInt256, chaincode: &mut UInt256, path: &PATH, position: usize) - where PATH: IIndexPath { - let i = UInt512::hmac(chaincode.as_ref(), Self::public_key_data_input(key, path, position).as_ref()); - let scalar: [u8; 32] = i.0[..32].try_into().unwrap(); - match VerifyingKey::from_bytes(&scalar) { - Ok(pub_key) => { - key.0.copy_from_slice(pub_key.as_bytes()); - chaincode.0.copy_from_slice(&i.0[32..]); - }, - Err(err) => panic!("{}", err) - } - } -} - diff --git a/dash-spv-masternode-processor/src/keys/ecdsa_key.rs b/dash-spv-masternode-processor/src/keys/ecdsa_key.rs deleted file mode 100644 index c8410ec8..00000000 --- a/dash-spv-masternode-processor/src/keys/ecdsa_key.rs +++ /dev/null @@ -1,682 +0,0 @@ -use std::mem; -use byte::BytesExt; -use byte::ctx::Bytes; -use hashes::sha256; -use hashes::hex::{FromHex, ToHex}; -use secp256k1::ecdsa::{RecoverableSignature, RecoveryId}; -use secp256k1::Secp256k1; -use logging::*; -use tracing::*; -use crate::chain::bip::bip32; -use crate::chain::common::ChainType; -use crate::chain::derivation::{BIP32_HARD, IIndexPath, IndexPath}; -use crate::chain::params::ScriptMap; -use crate::consensus::Encodable; -use crate::crypto::{ECPoint, UInt160, UInt256, UInt512, byte_util::{AsBytes, Zeroable}}; -use crate::keys::{IKey, KeyKind, dip14::{IChildKeyDerivation, SignKey}}; -use crate::keys::crypto_data::{CryptoData, DHKey}; -use crate::util::address::address::is_valid_dash_private_key; -use crate::util::base58; -use crate::util::sec_vec::SecVec; - -const EXT_PUBKEY_SIZE: usize = 4 + mem::size_of::() + mem::size_of::(); - -#[derive(Clone, Debug, Default)] -pub struct ECDSAKey { - pub seckey: UInt256, - pub pubkey: Vec, - pub compressed: bool, - pub chaincode: UInt256, - pub fingerprint: u32, - pub is_extended: bool, -} - -/// Shorthands -impl ECDSAKey { - pub fn public_key_data_from_seed(seed: &[u8], compressed: bool) -> Option> { - Self::secret_key_from_bytes(seed) - .ok() - .map(|secret_key| - Self::public_key_from_secret_key_serialized(&secret_key, compressed)) - } - - pub fn key_with_secret(secret: &UInt256, compressed: bool) -> Option { - Self::secret_key_from_bytes(secret.as_bytes()) - .ok() - .map(|seckey| Self::with_seckey(seckey, compressed)) - } - pub fn key_with_combined_secret(data: &UInt512, compressed: bool) -> Option { - Self::secret_key_from_bytes(&data.0[..32]) - .ok() - .map(|seckey| Self::with_seckey_and_chaincode(seckey, UInt256::from(&data.0[32..]), compressed)) - } - pub fn key_with_secret_data(data: &[u8], compressed: bool) -> Option { - Self::secret_key_from_bytes(data) - .ok() - .map(|seckey| Self::with_seckey(seckey, compressed)) - } - pub fn key_with_secret_hex(string: &str, compressed: bool) -> Option { - Vec::from_hex(string) - .ok() - .and_then(|data| Self::key_with_secret_data(&data, compressed)) - } - - pub fn key_recovered_from_compact_sig(compact_sig: &[u8], message_digest: UInt256) -> Option { - Self::init_with_compact_sig(compact_sig, message_digest) - } - - pub fn key_with_private_key(private_key_string: &str, chain_type: ChainType) -> Option { - Self::init_with_private_key(private_key_string, chain_type) - } - - pub fn key_with_public_key_data(data: &[u8]) -> Option { - assert!(!data.is_empty()); - match data.len() { - 33 | 65 => Self::public_key_from_bytes(data).map(|pubkey| Self::with_pubkey_compressed(pubkey, data.len() == 33)).ok(), - _ => None - } - } - - pub fn init_with_compact_sig(compact_sig: &[u8], message_digest: UInt256) -> Option { - // assert!(compact_sig, "ECDSAKey::init_with_compact_sig {null}"); - if compact_sig.len() != 65 { - return None; - } - let compressed = compact_sig[0] - 27 >= 4; - let recid = RecoveryId::from_i32(((compact_sig[0] - 27) % 4) as i32).unwrap(); - RecoverableSignature::from_compact(&compact_sig[1..], recid) - .and_then(|sig| Secp256k1::new().recover_ecdsa(&secp256k1::Message::from(message_digest), &sig) - .map(|pk| Self::with_pubkey_compressed(pk, compressed))) - .ok() - } - - pub fn init_with_seed_data(seed: &[u8]) -> Option { - let i = UInt512::bip32_seed_key(seed); - Self::secret_key_from_bytes(&i.0[..32]) - .ok() - .map(|seckey| Self::with_seckey_and_chaincode(seckey, UInt256::from(&i.0[32..]), true)) - } - - pub fn init_with_secret(secret: UInt256, compressed: bool) -> Option { - Self::secret_key_from_bytes(secret.as_bytes()) - .ok() - .map(|seckey| Self::with_seckey(seckey, compressed)) - } - - pub fn init_with_extended_private_key_data(data: &Vec) -> Option { - // assert_eq!(data.len(), ECDSA_EXTENDED_SECRET_KEY_SIZE, "Key size is incorrect"); - Self::init_with_secret(data.read_with::(&mut 36, byte::LE).unwrap(), true) - .map(|s| Self::update_extended_params(s, data)) - } - - pub fn init_with_extended_public_key_data(data: &Vec) -> Option { - Self::init_with_public_key(data[36..].to_vec()) - .map(|s| Self::update_extended_params(s, data)) - } - - pub fn init_with_private_key(private_key: &str, chain_type: ChainType) -> Option { - match private_key.len() { - 0 => None, - // mini private key format - 22 | 30 if private_key.starts_with('L') => - is_valid_dash_private_key(&private_key.to_string(), &chain_type.script_map()) - .then_some(Self::with_seckey(secp256k1::SecretKey::from_hashed_data::(private_key.as_bytes()), false)), - _ => { - let mut d = base58::from_check(private_key).ok(); - if d.is_none() || d.as_ref().unwrap().len() == 28 { - d = base58::from(private_key).ok(); - } - if d.as_ref().is_none() || !(32..=34).contains(&d.as_ref().unwrap().len()) { - d = Vec::from_hex(private_key).ok(); - } - if d.as_ref().is_none() { - return None; - } - let data = d.unwrap(); - match data.len() { - 33 | 34 if data[0] == chain_type.script_map().privkey => - Self::secret_key_from_bytes(&data[1..33]).ok().map(|seckey| Self::with_seckey(seckey, data.len() == 34)), - 32 => - Self::secret_key_from_bytes(&data[..]).ok().map(|seckey| Self::with_seckey(seckey, false)), - _ => - None - } - } - } - } - - pub fn init_with_public_key(public_key: Vec) -> Option { - assert!(!public_key.is_empty(), "public_key is empty"); - if public_key.len() != 33 && public_key.len() != 65 { - None - } else { - Self::public_key_from_bytes(&public_key) - .ok() - .map(|pubkey| Self::with_pubkey_compressed(pubkey, public_key.len() == 33)) - } - } - - fn with_shared_secret(secret: secp256k1::ecdh::SharedSecret, compressed: bool) -> Self { - Self { pubkey: secret.secret_bytes().to_vec(), compressed, ..Default::default() } - } - - fn with_pubkey_compressed(pubkey: secp256k1::PublicKey, compressed: bool) -> Self { - Self { pubkey: if compressed { pubkey.serialize().to_vec() } else { pubkey.serialize_uncompressed().to_vec() }, compressed, ..Default::default() } - } - - fn with_seckey(seckey: secp256k1::SecretKey, compressed: bool) -> Self { - Self { seckey: UInt256(seckey.secret_bytes()), compressed, ..Default::default() } - } - - fn with_seckey_and_chaincode(seckey: secp256k1::SecretKey, chaincode: UInt256, compressed: bool) -> Self { - Self { seckey: UInt256(seckey.secret_bytes()), chaincode, compressed, ..Default::default() } - } - - fn update_extended_params(mut key: Self, data: &[u8]) -> Self { - let offset = &mut 0; - key.fingerprint = data.read_with::(offset, byte::LE).unwrap(); - key.chaincode = data.read_with::(offset, byte::LE).unwrap(); - key.is_extended = true; - key - } - - pub fn message_from_bytes(data: &[u8]) -> Result { - secp256k1::Message::from_slice(data) - } - - pub fn public_key_from_bytes(data: &[u8]) -> Result { - secp256k1::PublicKey::from_slice(data) - } - - pub fn secret_key_from_bytes(data: &[u8]) -> Result { - secp256k1::SecretKey::from_slice(data) - } - - pub fn public_key(&self) -> Result { - Self::public_key_from_bytes(&self.pubkey) - } - - pub fn secret_key(&self) -> Result { - Self::secret_key_from_bytes(self.seckey.as_bytes()) - } - - pub fn secret_key_string(&self) -> String { - if self.has_private_key() { - self.seckey.0.to_hex() - } else { - String::new() - } - } - - pub fn public_key_from_inner_secret_key_serialized(&self) -> Option> { - self.secret_key().ok().map(|seckey| Self::public_key_from_secret_key_serialized(&seckey, self.compressed)) - } - - pub fn public_key_from_secret_key_serialized(secret_key: &secp256k1::SecretKey, compressed: bool) -> Vec { - let pubkey = secp256k1::PublicKey::from_secret_key(&Secp256k1::new(), secret_key); - if compressed { - pubkey.serialize().to_vec() - } else { - pubkey.serialize_uncompressed().to_vec() - } - } - - pub fn has_private_key(&self) -> bool { - !self.seckey.is_zero() - } - - fn private_derive_to_256bit_derivation_path_for_seckey_and_chaincode(seckey: UInt256, chaincode: UInt256, path: &PATH) -> Option - where Self: Sized, PATH: IIndexPath { - let mut seckey = seckey.clone(); - let mut chaincode = chaincode.clone(); - let mut fingerprint = 0u32; - let length = path.length(); - (0..length) - .into_iter() - .for_each(|position| { - if position + 1 == length { - fingerprint = secp256k1::SecretKey::from_slice(&seckey.0) - .map(|sk| secp256k1::PublicKey::from_secret_key(&Secp256k1::new(), &sk)) - .map(|pk| UInt160::hash160u32le(&pk.serialize())) - .unwrap_or(0); - } - Self::derive_child_private_key(&mut seckey, &mut chaincode, path, position) - }); - Some(Self { seckey, chaincode, fingerprint, is_extended: true, compressed: true, ..Default::default() }) - - } - -} - -impl IKey for ECDSAKey { - // type SK = UInt256; - - fn r#type(&self) -> KeyKind { - KeyKind::ECDSA - } - - fn sign(&self, data: &[u8]) -> Vec { - if self.seckey.is_zero() { - log_warn!(target: "masternode-processor", "There is no seckey for sign"); - return vec![]; - } - match (Self::message_from_bytes(data), self.secret_key()) { - // todo: check should we truncate up to 72 - (Ok(msg), Ok(seckey)) => secp256k1::Secp256k1::new().sign_ecdsa(&msg, &seckey).serialize_der().to_vec(), - _ => vec![] - } - } - - fn verify(&mut self, message_digest: &[u8], signature: &[u8]) -> bool { - if signature.len() > 65 { - // not compact - Self::public_key_from_bytes(&self.public_key_data()) - .and_then(|pk| secp256k1::ecdsa::Signature::from_der(&signature) - .and_then(|sig| Self::message_from_bytes(message_digest) - .and_then(|msg| Secp256k1::new().verify_ecdsa(&msg, &sig, &pk)))) - .is_ok() - } else { - // compact - Self::key_recovered_from_compact_sig(signature, UInt256::from(message_digest)) - .map_or(false, |key| key.public_key_data().eq(&self.public_key_data())) - } - } - - fn secret_key(&self) -> UInt256 { - self.seckey - } - - fn chaincode(&self) -> UInt256 { - self.chaincode - } - - fn fingerprint(&self) -> u32 { - self.fingerprint - } - - fn private_key_data(&self) -> Option> { - (!self.seckey.is_zero()) - .then_some(self.seckey.0.to_vec()) - } - - fn public_key_data(&self) -> Vec { - if self.pubkey.is_empty() && self.has_private_key() { - let seckey = self.secret_key().unwrap(); - let pubkey = secp256k1::PublicKey::from_secret_key(&Secp256k1::new(), &seckey); - let serialized = if self.compressed { - pubkey.serialize().to_vec() - } else { - pubkey.serialize_uncompressed().to_vec() - }; - return serialized; - } - self.pubkey.clone() - } - - fn extended_private_key_data(&self) -> Option { - if !self.is_extended { - None - } else if let Some(private_key_data) = self.private_key_data() { - // TODO: secure data - //NSMutableData *data = [NSMutableData secureData]; - let mut writer = SecVec::new(); - self.fingerprint.enc(&mut writer); - self.chaincode.enc(&mut writer); - writer.extend(private_key_data); - // private_key_data.enc(&mut writer); - Some(writer) - } else { - None - } - } - - fn extended_public_key_data(&self) -> Option> { - self.is_extended.then_some({ - let mut writer = Vec::::new(); - self.fingerprint.enc(&mut writer); - self.chaincode.enc(&mut writer); - writer.extend(self.public_key_data()); - writer - }) - } - - fn private_derive_to_path2(&self, path: &PATH) -> Option - where Self: Sized + IChildKeyDerivation, - PATH: IIndexPath, SK: SignKey { - todo!() - } - - fn private_derive_to_path(&self, path: &PATH) -> Option - where Self: Sized, PATH: IIndexPath { - let mut seckey = self.seckey.clone(); - let mut chaincode = self.chaincode.clone(); - let mut fingerprint = 0u32; - let length = path.length(); - (0..length) - .into_iter() - .for_each(|position| { - if position + 1 == length { - fingerprint = secp256k1::SecretKey::from_slice(&seckey.0) - .map(|sk| secp256k1::PublicKey::from_secret_key(&Secp256k1::new(), &sk)) - .map(|pk| UInt160::hash160u32le(&pk.serialize())) - .unwrap_or(0); - } - Self::derive_child_private_key(&mut seckey, &mut chaincode, path, position) - }); - Some(Self { seckey, chaincode, fingerprint, is_extended: true, compressed: true, ..Default::default() }) - } - - // fn private_derive_to_path2(&self, path: &PATH) -> Option where Self: Sized, PATH: IIndexPath { - // todo!() - // let mut seckey = self.seckey.clone(); - // let mut chaincode = self.chaincode.clone(); - // let mut fingerprint = 0u32; - // let length = path.length(); - // (0..length) - // .into_iter() - // .for_each(|position| { - // if position + 1 == length { - // fingerprint = secp256k1::SecretKey::from_slice(&seckey.0) - // .map(|sk| secp256k1::PublicKey::from_secret_key(&Secp256k1::new(), &sk)) - // .map(|pk| UInt160::hash160(&pk.serialize()).u32_le()) - // .unwrap_or(0); - // } - // Self::derive_child_private_key(&mut seckey, &mut chaincode, path, position) - // }); - // Some(Self { seckey, chaincode, fingerprint, is_extended: true, compressed: true, ..Default::default() }) - // } - - fn private_derive_to_256bit_derivation_path(&self, path: &PATH) -> Option - where Self: Sized, PATH: IIndexPath { - Self::private_derive_to_256bit_derivation_path_for_seckey_and_chaincode(self.seckey, self.chaincode, path) - } - - fn public_derive_to_256bit_derivation_path_with_offset(&mut self, path: &PATH, offset: usize) -> Option - where Self: Sized, PATH: IIndexPath { - assert!(path.length() > offset, "derivation path offset must be smaller than the its length"); - let mut chaincode = self.chaincode.clone(); - let mut data = ECPoint::from(&self.public_key_data()); - let mut fingerprint = 0u32; - let length = path.length(); - (offset..length) - .into_iter() - .for_each(|position| { - if position + 1 == length { fingerprint = UInt160::hash160u32le(data.as_ref()); } - Self::derive_child_public_key(&mut data, &mut chaincode, path, position) - }); - if let Ok(mut child_key) = Self::public_key_from_bytes(&data.0).map(|pubkey| Self::with_pubkey_compressed(pubkey, true)) { - child_key.chaincode = chaincode; - child_key.fingerprint = fingerprint; - child_key.is_extended = true; - Some(child_key) - } else { - assert!(false, "Public key should be created"); - None - } - } - - fn serialized_private_key_for_script(&self, script: &ScriptMap) -> String { - //if (uint256_is_zero(_seckey)) return nil; - //NSMutableData *d = [NSMutableData secureDataWithCapacity:sizeof(UInt256) + 2]; - let mut writer = SecVec::with_capacity(if self.compressed { 34 } else { 33 }); - script.privkey.enc(&mut writer); - self.seckey.enc(&mut writer); - if self.compressed { - b'\x01'.enc(&mut writer); - } - base58::check_encode_slice(&writer) - } - - fn hmac_256_data(&self, data: &[u8]) -> UInt256 { - UInt256::hmac::(self.seckey.as_bytes(), data) - } - - fn forget_private_key(&mut self) { - self.public_key_data_mut(); - self.seckey = UInt256::MIN; - } -} - -impl ECDSAKey { - - - pub(crate) fn public_key_data_mut(&mut self) -> Vec { - if self.pubkey.is_empty() && self.has_private_key() { - // let mut d = Vec::::with_capacity(if self.compressed { 33 } else { 65 }); - let seckey = self.secret_key().unwrap(); - let pubkey = secp256k1::PublicKey::from_secret_key(&Secp256k1::new(), &seckey); - self.pubkey = if self.compressed { - pubkey.serialize().to_vec() - } else { - pubkey.serialize_uncompressed().to_vec() - }; - } - self.pubkey.clone() - } - - /// Pieter Wuille's compact signature encoding used for bitcoin message signing - /// to verify a compact signature, recover a public key from the signature and verify that it matches the signer's pubkey - pub fn compact_sign(&self, message_digest: UInt256) -> [u8; 65] { - let mut sig = [0u8; 65]; - if self.seckey.is_zero() { - log_warn!(target: "masternode-processor", "Can't sign with a public key"); - return sig; - } - let secp = secp256k1::Secp256k1::new(); - let msg = Self::message_from_bytes(&message_digest.0).unwrap(); - let seckey = self.secret_key().unwrap(); - let rec_sig = secp.sign_ecdsa_recoverable(&msg, &seckey); - let (rec_id, bytes) = rec_sig.serialize_compact(); - let version = 27 + rec_id.to_i32() as u8 + if self.compressed { 4 } else { 0 }; - sig[0] = version; - sig[1..].copy_from_slice(&bytes); - sig - } - - pub fn hash160(&self) -> UInt160 { - UInt160::hash160(&self.public_key_data()) - } - - pub fn serialized_auth_private_key_from_seed(seed: &[u8], script_map: ScriptMap) -> String { - let key = UInt512::bip32_seed_key(seed); - let mut seckey = UInt256::from(&key.0[..32]); - let mut chaincode = UInt256::from(&key.0[32..]); - // path m/1H/0 (same as copay uses for bitauth) - let path = IndexPath::new(vec![1 | BIP32_HARD, 0]); - Self::derive_child_private_key(&mut seckey, &mut chaincode, &path, 0); - Self::derive_child_private_key(&mut seckey, &mut chaincode, &path, 1); - // derive_child_private_key(&mut seckey, &mut chaincode, 1 | BIP32_HARD); - // derive_child_private_key(&mut seckey, &mut chaincode, 0); - let mut writer = SecVec::new(); - script_map.privkey.enc(&mut writer); - writer.extend_from_slice(&seckey.0); - b'\x01'.enc(&mut writer); // specifies compressed pubkey format - base58::check_encode_slice(&writer) - } - - pub fn serialized_private_master_key_from_seed(seed: &Vec, chain_type: ChainType) -> String { - let i = UInt512::bip32_seed_key(seed); - bip32::Key::new(0, 0, UInt256::MIN, UInt256::from(&i.0[32..]), i.0[..32].to_vec(), false) - .serialize(chain_type) - } - - pub fn public_key_from_extended_public_key_data(data: &[u8], path: &PATH) -> Option> - where PATH: IIndexPath { - if data.len() < EXT_PUBKEY_SIZE { - assert!(false, "Extended public key is wrong size"); - return None; - } - let mut c = UInt256::from(&data[4..36]); - let mut k = ECPoint::from(&data[36..69]); - (0..path.length()) - .into_iter() - .for_each(|position| Self::derive_child_public_key(&mut k, &mut c, path, position)); - Some(k.as_bytes().to_vec()) - } - - // pub fn encrypt_data_for_public_key(&self, secret: &str, mut public_key: Self, initialization_vector: &str) -> Vec { - // let key = Self::init_with_dh_key_exchange_with_public_key(public_key, self); - // // DSECDSAKey *key = [DSECDSAKey keyWithDHKeyExchangeWithPublicKey:peerPubKey forPrivateKey:secretKey]; - // - // // return [self encryptWithDHECDSAKey:key usingInitializationVector:initializationVector]; - // - // } - - // pub fn encrypt_with_dh_key(&self, dh_key: Self, initialization_vector: &Vec) -> Vec { - // - // // unsigned char *iv = (unsigned char *)initializationVector.bytes; - // // - // // NSData *resultData = AES256EncryptDecrypt(kCCEncrypt, self, (uint8_t *)dhKey.publicKeyData.bytes, initializationVector.length ? iv : 0); - // // - // // NSMutableData *finalData = [initializationVector mutableCopy]; - // // [finalData appendData:resultData]; - // // return finalData; - // - // } - - // pub fn key_with_dh_key_exchange_with_public_key(public_key: &Self, private_key: &Self) -> Option { - // private_key.secret_key() - // .and_then(|seckey| ECDSAKey::public_key_from_bytes(&ECDSAKey::public_key_from_secret_key_serialized(&seckey, false)) - // .map(|pubkey| ECDSAKey::with_shared_secret(secp256k1::ecdh::SharedSecret::new(&pubkey, &seckey), false))) - // .ok() - // } -} - -/// For FFI -impl ECDSAKey { - - pub fn public_key_from_extended_public_key_data_at_index_path(key: &Self, index_path: &PATH) -> Option where Self: Sized, PATH: IIndexPath { - key.extended_public_key_data() - .and_then(|ext_pk_data| Self::public_key_from_extended_public_key_data(&ext_pk_data, index_path)) - .and_then(|pub_key_data| Self::key_with_public_key_data(&pub_key_data)) - } - - pub fn key_with_extended_public_key_data(bytes: &[u8]) -> Option { - let len = bytes.len(); - if len == 69 || len == 101 { - let offset = &mut 0; - let fingerprint = bytes.read_with::(offset, byte::LE).unwrap(); - let chaincode = bytes.read_with::(offset, byte::LE).unwrap(); - let pubkeydata: &[u8] = bytes.read_with(offset, Bytes::Len(len - *offset)).unwrap(); - let compressed = pubkeydata.len() == 33; - Self::public_key_from_bytes(pubkeydata).ok().map(|pubkey| { - Self { - fingerprint, - chaincode, - compressed, - pubkey: if compressed { pubkey.serialize().to_vec() } else { pubkey.serialize_uncompressed().to_vec() }, - is_extended: true, - ..Default::default() } - }) - } else { - None - } - } - - pub fn key_with_extended_private_key_data(bytes: &[u8]) -> Option { - Self::init_with_secret(bytes.read_with::(&mut 36, byte::LE).unwrap(), true) - .map(|key| Self::update_extended_params(key, bytes)) - } - - pub fn key_with_compact_sig(compact_sig: &[u8], message_digest: UInt256) -> Option { - if compact_sig.len() != 65 { - return None; - } - RecoveryId::from_i32(((compact_sig[0] - 27) % 4) as i32) - .and_then(|recid| RecoverableSignature::from_compact(&compact_sig[1..], recid) - .and_then(|sig| Secp256k1::new() - .recover_ecdsa(&secp256k1::Message::from(message_digest), &sig) - .map(|pubkey| ECDSAKey::with_pubkey_compressed(pubkey, compact_sig[0] - 27 >= 4)))) - .ok() - } - - - pub fn serialized_extended_private_key_from_seed(seed: &[u8], index_path: IndexPath, chain_type: ChainType) -> Option { - let i = UInt512::bip32_seed_key(seed); - Self::private_derive_to_256bit_derivation_path_for_seckey_and_chaincode(UInt256::from(&i.0[..32]), UInt256::from(&i.0[32..]), &index_path) - .map(|key| bip32::Key::new( - index_path.length() as u8, - key.fingerprint, - if index_path.is_empty() { UInt256::MIN } else { index_path.last_index() }, - key.chaincode, - key.seckey.0.to_vec(), - index_path.last_hardened()) - .serialize(chain_type)) - - } -} - -impl DHKey for ECDSAKey { - fn init_with_dh_key_exchange_with_public_key(public_key: &mut Self, private_key: &Self) -> Option where Self: Sized { - match (Self::public_key_from_bytes(&public_key.public_key_data()), - Self::secret_key_from_bytes(private_key.seckey.as_bytes())) { - (Ok(pubkey), Ok(seckey)) => Some(Self::with_shared_secret(secp256k1::ecdh::SharedSecret::new(&pubkey, &seckey), false)), - _ => None - } - } -} - -impl CryptoData for Vec { - fn encrypt_with_secret_key_using_iv(&mut self, secret_key: &ECDSAKey, public_key: &ECDSAKey, initialization_vector: Vec) -> Option> { - let mut destination = initialization_vector.clone(); - ECDSAKey::secret_key_from_bytes(public_key.seckey.as_bytes()) - .and_then(|seckey| ECDSAKey::public_key_from_bytes(&ECDSAKey::public_key_from_secret_key_serialized(&seckey, false))) - .map(|pubkey| secp256k1::ecdh::SharedSecret::new(&pubkey, &secret_key.secret_key().unwrap())) - .ok() - .and_then(|shared_secret| >::encrypt(self, shared_secret.secret_bytes(), initialization_vector)) - .map(|encrypted_data| { - destination.extend(encrypted_data); - destination - }) - } - - fn decrypt_with_secret_key_using_iv_size(&mut self, secret_key: &ECDSAKey, public_key: &ECDSAKey, iv_size: usize) -> Option> { - if self.len() < iv_size { - return None; - } - ECDSAKey::secret_key_from_bytes(public_key.seckey.as_bytes()) - .and_then(|seckey| ECDSAKey::public_key_from_bytes(&ECDSAKey::public_key_from_secret_key_serialized(&seckey, false))) - .map(|pubkey| secp256k1::ecdh::SharedSecret::new(&pubkey, &secret_key.secret_key().unwrap())) - .ok() - .and_then(|shared_secret| - >::decrypt(self[iv_size..self.len()].to_vec(), shared_secret.secret_bytes(), &self[..iv_size])) - } - - fn encrypt_with_dh_key_using_iv(&self, key: &ECDSAKey, initialization_vector: Vec) -> Option> { - let mut destination = initialization_vector.clone(); - let pubkey_data = key.public_key_from_inner_secret_key_serialized().unwrap_or(key.public_key_data()); - if pubkey_data.is_empty() { - None - } else { - pubkey_data[..32].try_into().ok() - .and_then(|key_data: [u8; 32]| initialization_vector.try_into().ok() - .and_then(|iv_data: [u8; 16]| >::encrypt(self, key_data, iv_data)) - .map(|encrypted_data| { - destination.extend(encrypted_data); - destination - })) - } - - - // key.public_key() - // .ok() - // .map(|pubk| if key.compressed { pubk.serialize().to_vec() } else { pubk.serialize_uncompressed().to_vec() }) - // // .or(key.public_key_from_inner_secret_key_serialized()) - // .and_then(|sym_key_data| sym_key_data[..32].try_into().ok()) - // .and_then(|key_data: [u8; 32]| initialization_vector.try_into().ok() - // .and_then(|iv_data: [u8; 16]| >::encrypt(self, key_data, iv_data)) - // .map(|encrypted_data| { - // destination.extend(encrypted_data); - // destination - // })) - } - - fn decrypt_with_dh_key_using_iv_size(&self, key: &ECDSAKey, iv_size: usize) -> Option> { - key.public_key_from_inner_secret_key_serialized() - .and_then(|sym_key_data| sym_key_data[..32].try_into().ok()) - .and_then(|key_data: [u8; 32]| self[..iv_size].try_into().ok() - .and_then(|iv_data: [u8; 16]| - >::decrypt(self[iv_size..self.len()].to_vec(), key_data, iv_data))) - } -} - diff --git a/dash-spv-masternode-processor/src/keys/ed25519_key.rs b/dash-spv-masternode-processor/src/keys/ed25519_key.rs deleted file mode 100644 index 4015e61e..00000000 --- a/dash-spv-masternode-processor/src/keys/ed25519_key.rs +++ /dev/null @@ -1,316 +0,0 @@ -use std::mem; -use byte::BytesExt; -use byte::ctx::Bytes; -use ed25519_dalek::{Signature, SignatureError, Signer, SigningKey, Verifier, VerifyingKey}; -use hashes::hex::{FromHex, ToHex}; -use hashes::sha256; -use logging::*; -use tracing::*; -use crate::crypto::{UInt160, UInt256, UInt512, byte_util::{AsBytes, Zeroable}, ECPoint}; -use crate::chain::{derivation::IIndexPath, ScriptMap}; -use crate::consensus::Encodable; -use crate::keys::{IKey, KeyKind, dip14::{IChildKeyDerivation, IChildKeyDerivationData}}; -use crate::util::base58; -use crate::util::sec_vec::SecVec; - -// TODO: check we need to use ECPoint here -// const EXT_PUBKEY_SIZE: usize = 4 + mem::size_of::() + mem::size_of::(); -const EXT_PUBKEY_SIZE: usize = 4 + mem::size_of::() + mem::size_of::(); - -#[derive(Clone, Debug, Default)] -pub struct ED25519Key { - pub seckey: UInt256, - pub pubkey: Vec, - pub chaincode: UInt256, - pub fingerprint: u32, - pub is_extended: bool, -} - -impl IKey for ED25519Key - where Self: IChildKeyDerivationData + IChildKeyDerivationData { - - fn r#type(&self) -> KeyKind { - KeyKind::ED25519 - } - - fn sign(&self, data: &[u8]) -> Vec { - if self.seckey.is_zero() { - log_warn!(target: "masternode-processor", "There is no seckey for sign"); - return vec![]; - } - let signing_key: SigningKey = self.seckey.into(); - match signing_key.try_sign(data) { - Ok(signature) => signature.to_vec(), - Err(err) => { - log_warn!(target: "masternode-processor", "ED25519Key::sign::error {}", err); - vec![] - } - } - } - - fn verify(&mut self, message_digest: &[u8], signature: &[u8]) -> bool { - // todo: check if this needed & correct - Signature::from_slice(signature) - .map_or(false, |s| SigningKey::from(self.seckey) - .verifying_key() - .verify(message_digest, &s) - .is_ok()) - } - - fn secret_key(&self) -> UInt256 { - self.seckey - } - - fn chaincode(&self) -> UInt256 { - self.chaincode - } - - fn fingerprint(&self) -> u32 { - self.fingerprint - } - - fn private_key_data(&self) -> Option> { - (!self.seckey.is_zero()) - .then_some(self.seckey.0.to_vec()) - } - - fn public_key_data(&self) -> Vec { - if !self.pubkey.is_empty() { - self.pubkey.to_vec() - } else { - let signing_key: SigningKey = self.seckey.into(); - let public_key = signing_key.verifying_key(); - public_key.as_bytes().to_vec() - // ECPoint::from(signing_key.verifying_key()).0.to_vec() - } - } - - fn extended_private_key_data(&self) -> Option { - if !self.is_extended { - None - } else if let Some(private_key_data) = self.private_key_data() { - // TODO: secure allocator - let mut writer = SecVec::new(); - self.fingerprint.enc(&mut writer); - self.chaincode.enc(&mut writer); - writer.extend(private_key_data); - Some(writer) - } else { - None - } - } - - fn extended_public_key_data(&self) -> Option> { - self.is_extended.then_some({ - let mut writer = Vec::::new(); - self.fingerprint.enc(&mut writer); - self.chaincode.enc(&mut writer); - writer.extend(self.public_key_data()); - writer - }) - } - - fn private_derive_to_path(&self, path: &PATH) -> Option - where Self: Sized, PATH: IIndexPath { - let mut signing_key: SigningKey = self.seckey.into(); - let mut chaincode = self.chaincode.clone(); - let mut fingerprint = 0u32; - let length = path.length(); - (0..length) - .into_iter() - .for_each(|position| { - if position + 1 == length { - fingerprint = UInt160::hash160u32le(ECPoint::from(signing_key.verifying_key()).as_bytes()); - // fingerprint = UInt160::hash160u32le(signing_key.verifying_key().as_bytes()); - } - Self::derive_child_private_key(&mut signing_key, &mut chaincode, path, position); - }); - Some(Self::init_with_extended_private_parts(signing_key.into(), chaincode, fingerprint)) - } - - fn private_derive_to_256bit_derivation_path(&self, path: &PATH) -> Option - where Self: Sized, PATH: IIndexPath { - let mut signing_key: SigningKey = self.seckey.into(); - let mut chaincode = self.chaincode.clone(); - let mut fingerprint = 0u32; - let length = path.length(); - (0..length) - .into_iter() - .for_each(|position| { - if position + 1 == length { - fingerprint = UInt160::hash160u32le(ECPoint::from(signing_key.verifying_key()).as_bytes()); - // fingerprint = UInt160::hash160u32le(signing_key.verifying_key().as_bytes()); - } - Self::derive_child_private_key(&mut signing_key, &mut chaincode, path, position); - }); - Some(Self::init_with_extended_private_parts(signing_key.into(), chaincode, fingerprint)) - } - - fn public_derive_to_256bit_derivation_path_with_offset(&mut self, path: &PATH, offset: usize) -> Option - where Self: Sized, PATH: IIndexPath { - let mut chaincode = self.chaincode.clone(); - // let mut data = ECPoint::from(&self.public_key_data()); - let mut data = UInt256::from(&self.public_key_data()); - let mut fingerprint = 0u32; - let length = path.length(); - (offset..length) - .into_iter() - .for_each(|position| { - if position + 1 == length { - fingerprint = UInt160::hash160u32le(ECPoint::from(data.as_bytes()).as_bytes()); - // fingerprint = UInt160::hash160u32le(data.as_bytes()); - } - Self::derive_child_public_key(&mut data, &mut chaincode, path, position); - }); - Some(Self::init_with_extended_public_parts(data.0.to_vec(), chaincode, fingerprint)) - } - - fn serialized_private_key_for_script(&self, script: &ScriptMap) -> String { - let mut writer = SecVec::with_capacity(33); - script.privkey.enc(&mut writer); - self.seckey.enc(&mut writer); - // todo: should we add additional byte here ? - // if self.compressed { - // b'\x01'.enc(&mut writer); - // } - base58::check_encode_slice(&writer) - } - - fn hmac_256_data(&self, data: &[u8]) -> UInt256 { - UInt256::hmac::(self.seckey.as_bytes(), data) - } - - fn forget_private_key(&mut self) { - if self.pubkey.is_empty() && !self.seckey.is_zero() { - let signing_key: SigningKey = self.seckey.into(); - let public_key = signing_key.verifying_key(); - // self.pubkey = ECPoint::from(public_key).0.to_vec(); - self.pubkey = public_key.as_bytes().to_vec(); - } - self.seckey = UInt256::MIN; - } -} - -impl ED25519Key { - - pub fn init_with_seed_data(seed: &[u8]) -> Option { - let i = UInt512::ed25519_seed_key(seed); - Some(Self { seckey: UInt256::from(&i.0[..32]), chaincode: UInt256::from(&i.0[32..]), ..Default::default() }) - } - - fn init_with_extended_private_parts(seckey: UInt256, chaincode: UInt256, fingerprint: u32) -> Self { - Self { fingerprint, chaincode, seckey, is_extended: true, ..Default::default() } - } - - fn init_with_extended_public_parts(pubkey: Vec, chaincode: UInt256, fingerprint: u32) -> Self { - Self { fingerprint, chaincode, pubkey, is_extended: true, ..Default::default() } - } - - pub fn init_with_extended_private_key_data(data: &Vec) -> Option { - Self::key_with_extended_private_key_data(data) - } - - pub fn init_with_extended_public_key_data(data: &Vec) -> Option { - Self::key_with_extended_public_key_data(data) - } - - pub fn key_with_secret_data(data: &[u8]) -> Option { - Self::secret_key_from_bytes(data) - .ok() - .map(|seckey| Self { seckey: seckey.into(), ..Default::default() }) - } - - pub fn public_key_from_bytes(data: &[u8]) -> Result { - VerifyingKey::try_from(data) - } - - pub fn secret_key_from_bytes(data: &[u8]) -> Result { - SigningKey::try_from(data) - } - - pub fn key_with_public_key_data(data: &[u8]) -> Option { - assert!(!data.is_empty()); - // TODO: if we follow SLIP-0010 then we have 33-bytes, and need to cut off 1st byte (0x00) - // TODO: if we follow IETF then we must ensure length == 32 bytes - match data.len() { - 32 => Self::public_key_from_bytes(data).ok(), - 33 => Self::public_key_from_bytes(&data[1..]).ok(), - _ => None - }.map(|pk| Self { pubkey: pk.to_bytes().to_vec(), ..Default::default() }) - } - - pub fn public_key_from_extended_public_key_data(data: &[u8], path: &PATH) -> Option> - where PATH: IIndexPath { - if data.len() < EXT_PUBKEY_SIZE { - assert!(false, "Extended public key is wrong size"); - return None; - } - let mut chaincode = UInt256::from(&data[4..36]); - // let mut key = ECPoint::from(&data[36..69]); - let mut key = UInt256::from(&data[36..68]); - (0..path.length()) - .into_iter() - .for_each(|position| Self::derive_child_public_key(&mut key, &mut chaincode, path, position)); - Some(key.as_bytes().to_vec()) - } -} - -/// For FFI -impl ED25519Key { - - pub fn key_with_private_key(string: &str) -> Option { - Vec::from_hex(string.as_bytes().to_hex().as_str()) - .ok() - .and_then(|data| Self::key_with_secret_data(&data)) - } - - pub fn public_key_from_extended_public_key_data_at_index_path(key: &Self, index_path: &PATH) -> Option where Self: Sized, PATH: IIndexPath { - key.extended_public_key_data() - .and_then(|ext_pk_data| Self::public_key_from_extended_public_key_data(&ext_pk_data, index_path)) - .and_then(|pub_key_data| Self::key_with_public_key_data(&pub_key_data)) - } - - - pub fn key_with_extended_public_key_data(bytes: &[u8]) -> Option { - let len = bytes.len(); - // if len == 68 || len == 69 { - if len == 68 { - let offset = &mut 0; - let fingerprint = bytes.read_with::(offset, byte::LE).unwrap(); - let chaincode = bytes.read_with::(offset, byte::LE).unwrap(); - // if len == 69 { - // // skip 1st byte as pub key was padded with 0x00 - // *offset += 1; - // } - let data: &[u8] = bytes.read_with(offset, Bytes::Len(32)).unwrap(); - Self::public_key_from_bytes(data) - .ok() - .map(|pubkey| Self::init_with_extended_public_parts(pubkey.as_bytes().to_vec(), chaincode, fingerprint)) - } else { - None - } - } - - pub fn key_with_extended_private_key_data(bytes: &[u8]) -> Option { - (bytes.len() == 68).then_some({ - let offset = &mut 0; - let fingerprint = bytes.read_with::(offset, byte::LE).unwrap(); - let chaincode = bytes.read_with::(offset, byte::LE).unwrap(); - let seckey = bytes.read_with::(offset, byte::LE).unwrap(); - Self::init_with_extended_private_parts(seckey, chaincode, fingerprint) - }) - } - - pub fn secret_key_string(&self) -> String { - self.seckey.0.to_hex() - } - - pub fn has_private_key(&self) -> bool { - !self.seckey.is_zero() - } - - pub fn hash160(&self) -> UInt160 { - UInt160::hash160(&self.public_key_data()) - } - -} diff --git a/dash-spv-masternode-processor/src/keys/key.rs b/dash-spv-masternode-processor/src/keys/key.rs deleted file mode 100644 index a8e100cf..00000000 --- a/dash-spv-masternode-processor/src/keys/key.rs +++ /dev/null @@ -1,369 +0,0 @@ -use std::fmt::Debug; -use std::ptr::null_mut; -use crate::chain::{ScriptMap, derivation::{IIndexPath, IndexPath}}; -use crate::crypto::{UInt256, UInt384, UInt768}; -use crate::keys::{BLSKey, ECDSAKey, ED25519Key, IKey}; -use crate::types::opaque_key::{AsOpaqueKey, OpaqueKey}; -use crate::util::sec_vec::SecVec; -#[cfg(feature = "use_serde")] -use serde::{Deserialize, Deserializer, Serialize, Serializer}; - -#[repr(C)] -#[derive(Clone, Copy, Debug, PartialEq)] -pub enum KeyKind { - ECDSA = 0, - BLS = 1, - BLSBasic = 2, - ED25519 = 3, -} - -#[derive(Clone, Debug)] -pub enum Key { - ECDSA(ECDSAKey), - BLS(BLSKey), - ED25519(ED25519Key), -} - -impl From for Key { - fn from(value: ECDSAKey) -> Self { - Key::ECDSA(value) - } -} - -impl From for Key { - fn from(value: BLSKey) -> Self { - Key::BLS(value) - } -} - -impl From for Key { - fn from(value: ED25519Key) -> Self { - Key::ED25519(value) - } -} - -impl From for ECDSAKey { - fn from(value: Key) -> Self { - match value { - Key::ECDSA(key) => key, - _ => panic!("trying to unwrap bls from different key type") - } - } -} -impl From for BLSKey { - fn from(value: Key) -> Self { - match value { - Key::BLS(key) => key, - _ => panic!("trying to unwrap ecdsa from different key type") - } - } -} -impl From for ED25519Key { - fn from(value: Key) -> Self { - match value { - Key::ED25519(key) => key, - _ => panic!("trying to unwrap ed25519 from different key type") - } - } -} - -impl Default for KeyKind { - fn default() -> Self { - KeyKind::ECDSA - } -} - -impl From for KeyKind { - fn from(orig: i16) -> Self { - match orig { - 0 => KeyKind::ECDSA, - 1 => KeyKind::BLS, - 2 => KeyKind::BLSBasic, - 3 => KeyKind::ED25519, - _ => KeyKind::default(), - } - } -} - -impl From for i16 { - fn from(value: KeyKind) -> Self { - match value { - KeyKind::ECDSA => 0, - KeyKind::BLS => 1, - KeyKind::BLSBasic => 2, - KeyKind::ED25519 => 3, - } - } -} - -impl From<&KeyKind> for u8 { - fn from(value: &KeyKind) -> Self { - match value { - KeyKind::ECDSA => 0, - KeyKind::BLS => 1, - KeyKind::BLSBasic => 2, - KeyKind::ED25519 => 3, - } - } -} - -impl KeyKind { - - pub fn derivation_string(&self) -> String { - match self { - KeyKind::ECDSA => "", - KeyKind::ED25519 => "_ED_", - KeyKind::BLS | KeyKind::BLSBasic => "_BLS_", - }.to_string() - } - - pub(crate) fn public_key_from_extended_public_key_data(&self, data: &[u8], index_path: &IndexPath) -> Option> { - match self { - KeyKind::ECDSA => ECDSAKey::public_key_from_extended_public_key_data(data, index_path), - KeyKind::ED25519 => ED25519Key::public_key_from_extended_public_key_data(data, index_path), - _ => BLSKey::public_key_from_extended_public_key_data(data, index_path, *self == KeyKind::BLS), - } - } - - pub(crate) fn private_key_from_extended_private_key_data(&self, data: &Vec) -> Option { - match self { - KeyKind::ECDSA => ECDSAKey::init_with_extended_private_key_data(data).map(Key::ECDSA), - KeyKind::ED25519 => ED25519Key::init_with_extended_private_key_data(data).map(Key::ED25519), - _ => BLSKey::init_with_extended_private_key_data(data, *self == KeyKind::BLS).ok().map(Key::BLS), - } - } - - pub(crate) fn key_with_private_key_data(&self, data: &[u8]) -> Option { - match self { - KeyKind::ECDSA => ECDSAKey::key_with_secret_data(data, true).map(Key::ECDSA), - KeyKind::ED25519 => ED25519Key::key_with_secret_data(data).map(Key::ED25519), - _ => BLSKey::key_with_private_key_data(data, *self == KeyKind::BLS).map(Key::BLS), - } - } - - pub(crate) fn key_with_seed_data(&self, seed: &[u8]) -> Option { - match self { - KeyKind::ECDSA => ECDSAKey::init_with_seed_data(seed).map(Key::ECDSA), - KeyKind::ED25519 => ED25519Key::init_with_seed_data(seed).map(Key::ED25519), - _ => BLSKey::extended_private_key_with_seed_data(seed, *self == KeyKind::BLS).ok().map(Key::BLS) - } - } - - pub(crate) fn key_with_public_key_data(&self, data: &[u8]) -> Option { - match self { - KeyKind::ECDSA => ECDSAKey::key_with_public_key_data(data).map(Key::ECDSA), - KeyKind::ED25519 => ED25519Key::key_with_public_key_data(data).map(Key::ED25519), - _ => Some(Key::BLS(BLSKey::key_with_public_key(UInt384::from(data), *self == KeyKind::BLS))), - } - } - - pub(crate) fn key_with_extended_public_key_data(&self, data: &Vec) -> Option { - match self { - KeyKind::ECDSA => ECDSAKey::init_with_extended_public_key_data(data).map(Key::ECDSA), - KeyKind::ED25519 => ED25519Key::init_with_extended_public_key_data(data).map(Key::ED25519), - _ => BLSKey::init_with_extended_public_key_data(data, *self == KeyKind::BLS).ok().map(Key::BLS) - } - } - - pub(crate) fn key_with_extended_private_key_data(&self, data: &Vec) -> Option { - match self { - KeyKind::ECDSA => ECDSAKey::init_with_extended_private_key_data(data).map(Key::ECDSA), - KeyKind::ED25519 => ED25519Key::init_with_extended_private_key_data(data).map(Key::ED25519), - _ => BLSKey::init_with_extended_private_key_data(data, *self == KeyKind::BLS).ok().map(Key::BLS) - } - } - - /*pub fn private_derive_to_256bit_derivation_path_from_seed_and_store(&self, seed: &Seed, derivation_path: &DPATH, store_private_key: bool) -> Option - where IPATH: IIndexPath, DPATH: IDerivationPath + IIndexPath { - if let Some(seed_key) = self.key_with_seed_data(&seed.data) { - println!("private_derive_to_256bit_derivation_path_from_seed_and_store: seed_key: {:?}", seed_key.clone()); - let derived = seed_key.private_derive_to_256bit_derivation_path(derivation_path); - if let Some(mut ext_pk) = derived { - let ext_pub_data = ext_pk.extended_private_key_data(); - let ext_prv_data = ext_pk.extended_public_key_data(); - println!("private_derive_to_256bit_derivation_path_from_seed_and_store: ext_prv_data: {:?} ext_pub_data: {:?}", ext_prv_data.clone(), ext_pub_data.clone()); - if !seed.unique_id.is_empty() { - Keychain::set_data(derivation_path.wallet_based_extended_public_key_location_string_for_wallet_unique_id(seed.unique_id_as_str()), ext_pub_data, false) - .expect(""); - if store_private_key { - Keychain::set_data(wallet_based_extended_private_key_location_string_for_unique_id(seed.unique_id_as_str()), ext_prv_data, true) - .expect(""); - } - } - ext_pk.forget_private_key(); - Some(ext_pk) - } else { - None - } - } else { - None - } - }*/ -} - -impl IKey for Key { - // type SK = T; - - fn r#type(&self) -> KeyKind { - match self { - Key::ECDSA(..) => KeyKind::ECDSA, - Key::ED25519(..) => KeyKind::ED25519, - Key::BLS(key) => if key.use_legacy { KeyKind::BLS } else { KeyKind::BLSBasic } - } - } - - fn sign(&self, data: &[u8]) -> Vec { - match self { - Key::ECDSA(key) => key.compact_sign(UInt256::from(data)).to_vec(), - Key::BLS(key) => key.sign(data), - Key::ED25519(key) => key.sign(data) - } - } - - fn verify(&mut self, message_digest: &[u8], signature: &[u8]) -> bool { - match self { - Key::ECDSA(key) => key.verify(message_digest, signature), - Key::BLS(key) => key.verify_uint768(UInt256::from(message_digest), UInt768::from(signature)), - Key::ED25519(key) => key.verify(message_digest, signature), - } - } - - fn secret_key(&self) -> UInt256 { - match self { - Key::ECDSA(key) => key.seckey, - Key::BLS(key) => key.secret_key(), - Key::ED25519(key) => key.secret_key(), - } - } - - fn chaincode(&self) -> UInt256 { - match self { - Key::ECDSA(key) => key.chaincode(), - Key::BLS(key) => key.chaincode(), - Key::ED25519(key) => key.chaincode(), - } - } - - fn fingerprint(&self) -> u32 { - match self { - Key::ECDSA(key) => key.fingerprint(), - Key::BLS(key) => key.fingerprint(), - Key::ED25519(key) => key.fingerprint(), - } - } - - fn private_key_data(&self) -> Option> { - match self { - Key::ECDSA(key) => key.private_key_data(), - Key::BLS(key) => key.private_key_data(), - Key::ED25519(key) => key.private_key_data(), - } - } - - fn public_key_data(&self) -> Vec { - match self { - Key::ECDSA(key) => key.public_key_data(), - Key::BLS(key) => key.public_key_data(), - Key::ED25519(key) => key.public_key_data(), - } - } - - fn extended_private_key_data(&self) -> Option { - match self { - Key::ECDSA(key) => key.extended_private_key_data(), - Key::BLS(key) => key.extended_private_key_data(), - Key::ED25519(key) => key.extended_private_key_data(), - } - } - - fn extended_public_key_data(&self) -> Option> { - match self { - Key::ECDSA(key) => key.extended_public_key_data(), - Key::BLS(key) => key.extended_public_key_data(), - Key::ED25519(key) => key.extended_public_key_data(), - } - } - - fn private_derive_to_path(&self, index_path: &PATH) -> Option - where PATH: IIndexPath { - match self { - Key::ECDSA(key) => key.private_derive_to_path(index_path).map(Into::into), - Key::BLS(key) => key.private_derive_to_path(index_path).map(Into::into), - Key::ED25519(key) => key.private_derive_to_path(index_path).map(Into::into), - } - } - - fn private_derive_to_256bit_derivation_path(&self, path: &PATH) -> Option - where Self: Sized, PATH: IIndexPath { - match self { - Key::ECDSA(key) => key.private_derive_to_256bit_derivation_path(path).map(Into::into), - Key::BLS(key) => key.private_derive_to_256bit_derivation_path(path).map(Into::into), - Key::ED25519(key) => key.private_derive_to_256bit_derivation_path(path).map(Into::into), - } - } - - fn public_derive_to_256bit_derivation_path(&mut self, derivation_path: &PATH) -> Option - where Self: Sized, PATH: IIndexPath { - match self { - Key::ECDSA(key) => key.public_derive_to_256bit_derivation_path(derivation_path).map(Into::into), - Key::BLS(key) => key.public_derive_to_256bit_derivation_path(derivation_path).map(Into::into), - Key::ED25519(key) => key.public_derive_to_256bit_derivation_path(derivation_path).map(Into::into), - } - } - - fn public_derive_to_256bit_derivation_path_with_offset(&mut self, derivation_path: &PATH, offset: usize) -> Option - where Self: Sized, PATH: IIndexPath { - match self { - Key::ECDSA(key) => key.public_derive_to_256bit_derivation_path_with_offset(derivation_path, offset).map(Into::into), - Key::BLS(key) => key.public_derive_to_256bit_derivation_path_with_offset(derivation_path, offset).map(Into::into), - Key::ED25519(key) => key.public_derive_to_256bit_derivation_path_with_offset(derivation_path, offset).map(Into::into), - } - } - - fn serialized_private_key_for_script(&self, script: &ScriptMap) -> String { - match self { - Key::ECDSA(key) => key.serialized_private_key_for_script(script), - Key::BLS(key) => key.serialized_private_key_for_script(script), - Key::ED25519(key) => key.serialized_private_key_for_script(script), - } - } - - fn hmac_256_data(&self, data: &[u8]) -> UInt256 { - match self { - Key::ECDSA(key) => key.hmac_256_data(data), - Key::BLS(key) => key.hmac_256_data(data), - Key::ED25519(key) => key.hmac_256_data(data), - } - } - - fn forget_private_key(&mut self) { - match self { - Key::ECDSA(key) => key.forget_private_key(), - Key::BLS(key) => key.forget_private_key(), - Key::ED25519(key) => key.forget_private_key(), - } - - } -} - -impl AsOpaqueKey for Key { - fn to_opaque_ptr(self) -> *mut OpaqueKey { - match self { - Key::ECDSA(key) => key.to_opaque_ptr(), - Key::BLS(key) => key.to_opaque_ptr(), - Key::ED25519(key) => key.to_opaque_ptr(), - } - } -} - -impl AsOpaqueKey for Option { - fn to_opaque_ptr(self) -> *mut OpaqueKey { - match self { - Some(Key::ECDSA(key)) => key.to_opaque_ptr(), - Some(Key::BLS(key)) => key.to_opaque_ptr(), - Some(Key::ED25519(key)) => key.to_opaque_ptr(), - _ => null_mut() - } - } -} - diff --git a/dash-spv-masternode-processor/src/keys/mod.rs b/dash-spv-masternode-processor/src/keys/mod.rs deleted file mode 100644 index 71d64b90..00000000 --- a/dash-spv-masternode-processor/src/keys/mod.rs +++ /dev/null @@ -1,121 +0,0 @@ -pub mod bls_key; -pub mod key; -pub mod ecdsa_key; -pub mod ed25519_key; -pub mod dip14; -pub mod crypto_data; - -pub use self::key::Key; -pub use self::key::KeyKind; -pub use self::bls_key::BLSKey; -pub use self::ecdsa_key::ECDSAKey; -pub use self::ed25519_key::ED25519Key; - -use std::fmt::Debug; -use crate::chain::ScriptMap; -use crate::chain::derivation::index_path::IIndexPath; -use crate::chain::tx::protocol::SIGHASH_ALL; -use crate::consensus::Encodable; -use crate::crypto::UInt256; -use crate::keys::dip14::{IChildKeyDerivation, SignKey}; -use crate::util::address::address; -use crate::util::data_append::DataAppend; -use crate::util::script::ScriptElement; -use crate::util::sec_vec::SecVec; - -pub trait IKey: Send + Sync + Debug { - fn r#type(&self) -> KeyKind { - panic!("Should be overriden in implementation") - } - fn address_with_public_key_data(&self, script_map: &ScriptMap) -> String { - address::with_public_key_data(&self.public_key_data(), script_map) - } - fn sign(&self, data: &[u8]) -> Vec { - panic!("Should be overriden in implementation") - } - fn verify(&mut self, message_digest: &[u8], signature: &[u8]) -> bool { - panic!("Should be overriden in implementation") - } - fn verify_with_uint(&mut self, message_digest: UInt256, signature: &[u8]) -> bool { - panic!("Should be overriden in implementation") - } - fn secret_key(&self) -> UInt256 { - panic!("Should be overriden in implementation") - } - - fn chaincode(&self) -> UInt256 { - panic!("Should be overriden in implementation") - } - - fn fingerprint(&self) -> u32 { - panic!("Should be overriden in implementation") - } - - fn private_key_data(&self) -> Option> { - panic!("Should be overriden in implementation") - } - fn public_key_data(&self) -> Vec { - panic!("Should be overriden in implementation") - } - fn extended_private_key_data(&self) -> Option { - panic!("Should be overriden in implementation") - } - fn extended_public_key_data(&self) -> Option> { - panic!("Should be overriden in implementation") - } - fn private_derive_to_path2(&self, path: &PATH) -> Option - where Self: Sized + IChildKeyDerivation, PATH: IIndexPath, SK: SignKey { - panic!("Should be overriden in implementation") - } - - fn private_derive_to_path(&self, path: &PATH) -> Option - where Self: Sized, PATH: IIndexPath { - panic!("Should be overriden in implementation") - } - fn private_derive_to_256bit_derivation_path(&self, path: &PATH) -> Option - where Self: Sized, PATH: IIndexPath { - self.private_derive_to_path(&path.base_index_path()) - } - fn public_derive_to_256bit_derivation_path(&mut self, path: &PATH) -> Option - where Self: Sized, PATH: IIndexPath { - self.public_derive_to_256bit_derivation_path_with_offset(path, 0) - } - fn public_derive_to_256bit_derivation_path_with_offset(&mut self, path: &PATH, offset: usize) -> Option - where Self: Sized, PATH: IIndexPath { - panic!("Should be overriden in implementation") - } - // fn public_key_from_extended_public_key_data_at_index_path(key: &Self, index_path: &PATH) -> Option - // where Self: Sized, PATH: IIndexPath { - // key.extended_public_key_data().and_then() - // } - - fn serialized_private_key_for_script(&self, script: &ScriptMap) -> String { - panic!("Should be overriden in implementation") - } - fn hmac_256_data(&self, data: &[u8]) -> UInt256 { - panic!("Should be overriden in implementation") - } - fn forget_private_key(&mut self) { - panic!("Should be overriden in implementation") - } - - fn create_signature(&self, tx_input_script: &Vec, tx_data: &Vec) -> Vec { - let mut sig = Vec::::new(); - let hash = UInt256::sha256d(tx_data); - let mut s = self.sign(&hash.0.to_vec()); - let elem = tx_input_script.script_elements(); - (SIGHASH_ALL as u8).enc(&mut s); - s.append_script_push_data(&mut sig); - // sig.append_script_push_data(s); - if elem.len() >= 2 { - if let ScriptElement::Data([0x88 /*OP_EQUALVERIFY*/, ..], ..) = elem[elem.len() - 2] { - // pay-to-pubkey-hash scriptSig - self.public_key_data().append_script_push_data(&mut sig); - // sig.append_script_push_data(self.public_key_data()); - } - } - sig - } - - -} diff --git a/dash-spv-masternode-processor/src/lib.rs b/dash-spv-masternode-processor/src/lib.rs index a18c3c9a..299f9b88 100644 --- a/dash-spv-masternode-processor/src/lib.rs +++ b/dash-spv-masternode-processor/src/lib.rs @@ -1,67 +1,22 @@ #![allow(dead_code)] #![allow(unused_variables)] -#[macro_use] -pub mod processing; - -pub extern crate bitcoin_hashes as hashes; -pub extern crate secp256k1; - -#[cfg(test)] -mod lib_tests; -#[cfg(test)] -mod tests; +extern crate simplelog; +// #[cfg(test)] +pub mod tests; -#[cfg(feature = "std")] -use std::io; -#[cfg(not(feature = "std"))] -use core2::io; +#[cfg(feature = "test-helpers")] +pub mod block_store; +#[cfg(feature = "test-helpers")] +pub mod test_helpers; #[macro_use] pub mod internal_macros; #[macro_use] pub mod macros; -pub mod bindings; -pub mod blockdata; -pub mod chain; pub mod common; -pub mod consensus; -pub mod crypto; -pub mod ffi; -pub mod hash_types; -pub mod keys; pub mod models; -pub mod network; -pub mod tx; -pub mod types; +pub mod processing; pub mod util; - -// Don't remove, it's for testing purposes (look at ${project_dir}/c/main.c) -// #[no_mangle] -// pub extern "C" fn test_func(get_masternode_list_by_block_hash: MasternodeListLookup, destroy_masternode_list: MasternodeListDestroy, opaque_context: *const std::ffi::c_void) { -// let block_hash = UInt256::MIN; -// dash_spv_ffi::ffi::callbacks::lookup_masternode_list( -// block_hash, -// |h: UInt256| unsafe { (get_masternode_list_by_block_hash)(boxed(h.0), opaque_context) }, -// |list: *mut types::MasternodeList| unsafe { (destroy_masternode_list)(list) }); -// -// } -// #[no_mangle] -// pub extern "C" fn test_snapshot_func( -// get_llmq_snapshot_by_block_hash: GetLLMQSnapshotByBlockHash, -// save_llmq_snapshot: SaveLLMQSnapshot, -// destroy_snapshot: LLMQSnapshotDestroy, -// opaque_context: *const std::ffi::c_void) { -// let block_hash = UInt256::MIN; -// let lookup_result = unsafe { (get_llmq_snapshot_by_block_hash)(boxed(block_hash.0), opaque_context) }; -// if !lookup_result.is_null() { -// let data = unsafe { (*lookup_result).decode() }; -// unsafe { (destroy_snapshot)(lookup_result) }; -// println!("test_snapshot_func: ({:?})", data); -// } else { -// println!("test_snapshot_func: (None)"); -// -// } -// } - +pub mod logger; diff --git a/dash-spv-masternode-processor/src/lib_tests.rs b/dash-spv-masternode-processor/src/lib_tests.rs deleted file mode 100644 index a729f3b3..00000000 --- a/dash-spv-masternode-processor/src/lib_tests.rs +++ /dev/null @@ -1,749 +0,0 @@ -#[cfg(test)] -#[warn(clippy::manual_map)] -pub mod tests { - extern crate libc; - extern crate reqwest; - use byte::BytesExt; - use hashes::hex::{FromHex, ToHex}; - use serde::{Deserialize, Serialize}; - use std::io::Read; - use std::ptr::null_mut; - use std::{env, fs, slice}; - use crate::bindings::common::{processor_create_cache, register_processor, register_rust_logger}; - use crate::bindings::masternode::{process_mnlistdiff_from_message, process_qrinfo_from_message}; - use crate::ffi::boxer::boxed; - use crate::ffi::from::FromFFI; - use crate::ffi::to::ToFFI; - use crate::chain::common::chain_type::{ChainType, IHaveChainSettings}; - use crate::consensus::encode; - use crate::crypto::byte_util::{BytesDecodable, Reversable, UInt256, UInt384}; - use crate::models; - use crate::processing::{MasternodeProcessorCache, MasternodeProcessor, MNListDiffResult, ProcessingError, QRInfoResult}; - use crate::{unwrap_or_diff_processing_failure, unwrap_or_qr_processing_failure, unwrap_or_return, types}; - use crate::crypto::UInt768; - use crate::models::LLMQVerificationContext; - use crate::tests::block_store::{init_mainnet_store, init_testnet_store}; - - // This regex can be used to omit timestamp etc. while replacing after paste from xcode console log - // So it's bascically cut off such an expression "2022-09-11 15:31:59.445343+0300 DashSync_Example[41749:2762015]" - // (\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}).(\d{6})\+(\d{4}) DashSync_Example\[(\d{5}):(\d{7})\] - - // This regex + replace can be used to transform string like - // "000000000000001b33b86b6a167d37e3fcc6ba53e02df3cb06e3f272bb89dd7d" => 1092744, - // into string like - // ("0000013c21c2dc49704656ffc5adfd9c58506ac4c9556391d6f2d3d8db579233", 796617,), - // which is very handy - // ("[0-9A-Fa-f]{64}") => (\d+,) - // ($1, $2), - - #[derive(Debug)] - pub struct FFIContext<'a> { - pub chain: ChainType, - pub is_dip_0024: bool, - pub cache: &'a mut MasternodeProcessorCache, - // TODO:: make it initialized from json file with blocks - pub blocks: Vec, - } - - impl<'a> FFIContext<'a> { - pub fn block_for_hash(&self, hash: UInt256) -> Option<&MerkleBlock> { - self.blocks.iter().find(|block| block.hash == hash) - } - pub fn block_for_height(&self, height: u32) -> Option<&MerkleBlock> { - self.blocks.iter().find(|block| block.height == height) - } - - pub fn genesis_as_ptr(&self) -> *const u8 { - self.chain.genesis_hash().0.as_ptr() - } - } - - #[derive(Debug, Copy, Clone)] - pub struct MerkleBlock { - pub hash: UInt256, - pub height: u32, - pub merkleroot: UInt256, - } - - impl MerkleBlock { - pub fn new(height: u32, hash: &str, merkle_root: &str) -> MerkleBlock { - MerkleBlock { - height, - hash: UInt256::from_hex(hash).unwrap(), - merkleroot: if merkle_root.is_empty() { UInt256::MIN } else { UInt256::from_hex(merkle_root).unwrap() } } - } - - pub fn reversed(height: u32, hash: &str, merkle_root: &str) -> MerkleBlock { - MerkleBlock { - height, - hash: UInt256::from_hex(hash).unwrap().reverse(), - merkleroot: UInt256::from_hex(merkle_root).unwrap_or(UInt256::MIN) - } - } - } - - #[derive(Serialize, Deserialize)] - struct Block { - pub hash: String, - pub size: i64, - pub height: i64, - pub version: i64, - pub merkleroot: String, - pub tx: Vec, - pub time: i64, - pub nonce: i64, - pub bits: String, - pub difficulty: f64, - pub chainwork: String, - pub confirmations: i64, - pub previousblockhash: String, - pub nextblockhash: String, - pub reward: String, - #[serde(rename = "isMainChain")] - pub is_main_chain: bool, - #[serde(rename = "poolInfo")] - pub pool_info: PoolInfo, - } - #[derive(Serialize, Deserialize)] - struct PoolInfo {} - - pub struct AggregationInfo { - pub public_key: UInt384, - pub version: u16, - pub digest: UInt256, - } - pub fn get_block_from_insight_by_hash(hash: UInt256) -> Option { - let path = format!("https://testnet-insight.dashevo.org/insight-api-dash/block/{}", hash.reversed().0.to_hex().as_str()); - request_block(path) - } - pub fn get_block_from_insight_by_height(height: u32) -> Option { - let path = format!("https://testnet-insight.dashevo.org/insight-api-dash/block/{}", height); - request_block(path) - } - - pub fn request_block(path: String) -> Option { - println!("request_block: {}", path.as_str()); - match reqwest::blocking::get(path.as_str()) { - Ok(response) => match response.json::() { - Ok(json) => { - let block: Block = serde_json::from_value(json).unwrap(); - let merkle_block = MerkleBlock { - hash: UInt256::from_hex(block.hash.as_str()).unwrap().reverse(), - height: block.height as u32, - merkleroot: UInt256::from_hex(block.merkleroot.as_str()).unwrap() - }; - println!("request_block: {}", path.as_str()); - Some(merkle_block) - }, - Err(err) => { - println!("{}", err); - None - }, - }, - Err(err) => { - println!("{}", err); - None - }, - } - } - - /// This is convenience Core v0.17 method for use in tests which doesn't involve cross-FFI calls - pub fn process_mnlistdiff_from_message_internal( - message_arr: *const u8, - message_length: usize, - chain_type: ChainType, - use_insight_as_backup: bool, - protocol_version: u32, - // genesis_hash: *const u8, - processor: *mut MasternodeProcessor, - cache: *mut MasternodeProcessorCache, - context: *const std::ffi::c_void, - ) -> MNListDiffResult { - let processor = unsafe { &mut *processor }; - let cache = unsafe { &mut *cache }; - println!( - "process_mnlistdiff_from_message_internal.start: {:?}", - std::time::Instant::now() - ); - processor.opaque_context = context; - processor.use_insight_as_backup = use_insight_as_backup; - processor.chain_type = chain_type; - let message: &[u8] = unsafe { slice::from_raw_parts(message_arr, message_length) }; - let list_diff = - unwrap_or_diff_processing_failure!(models::MNListDiff::new(message, &mut 0, |hash| processor.lookup_block_height_by_hash(hash), protocol_version)); - let result = processor.get_list_diff_result_internal_with_base_lookup(list_diff, LLMQVerificationContext::MNListDiff, cache); - println!( - "process_mnlistdiff_from_message_internal.finish: {:?} {:#?}", - std::time::Instant::now(), - result - ); - result - } - - /// This is convenience Core v0.18 method for use in tests which doesn't involve cross-FFI calls - pub fn process_qrinfo_from_message_internal( - message: *const u8, - message_length: usize, - chain_type: ChainType, - use_insight_as_backup: bool, - is_rotated_quorums_presented: bool, - protocol_version: u32, - processor: *mut MasternodeProcessor, - cache: *mut MasternodeProcessorCache, - context: *const std::ffi::c_void, - ) -> QRInfoResult { - println!("process_qrinfo_from_message: {:?} {:?}", processor, cache); - let message: &[u8] = unsafe { slice::from_raw_parts(message, message_length) }; - let processor = unsafe { &mut *processor }; - processor.opaque_context = context; - processor.use_insight_as_backup = use_insight_as_backup; - processor.chain_type = chain_type; - let cache = unsafe { &mut *cache }; - let offset = &mut 0; - let read_list_diff = - |offset: &mut usize| processor.read_list_diff_from_message(message, offset, protocol_version); - let mut process_list_diff = |list_diff: models::MNListDiff, verification_context: LLMQVerificationContext| { - processor.get_list_diff_result_internal_with_base_lookup(list_diff, verification_context, cache) - }; - let read_snapshot = |offset: &mut usize| models::LLMQSnapshot::from_bytes(message, offset); - let read_var_int = |offset: &mut usize| encode::VarInt::from_bytes(message, offset); - let snapshot_at_h_c = unwrap_or_qr_processing_failure!(read_snapshot(offset)); - let snapshot_at_h_2c = unwrap_or_qr_processing_failure!(read_snapshot(offset)); - let snapshot_at_h_3c = unwrap_or_qr_processing_failure!(read_snapshot(offset)); - let diff_tip = unwrap_or_qr_processing_failure!(read_list_diff(offset)); - let diff_h = unwrap_or_qr_processing_failure!(read_list_diff(offset)); - let diff_h_c = unwrap_or_qr_processing_failure!(read_list_diff(offset)); - let diff_h_2c = unwrap_or_qr_processing_failure!(read_list_diff(offset)); - let diff_h_3c = unwrap_or_qr_processing_failure!(read_list_diff(offset)); - let extra_share = message.read_with::(offset, ()).unwrap_or(false); - let (snapshot_at_h_4c, diff_h_4c) = if extra_share { - ( - Some(unwrap_or_qr_processing_failure!(read_snapshot(offset))), - Some(unwrap_or_qr_processing_failure!(read_list_diff(offset))), - ) - } else { - (None, None) - }; - processor.save_snapshot(diff_h_c.block_hash, snapshot_at_h_c.clone()); - processor.save_snapshot(diff_h_2c.block_hash, snapshot_at_h_2c.clone()); - processor.save_snapshot(diff_h_3c.block_hash, snapshot_at_h_3c.clone()); - if extra_share { - processor.save_snapshot( - diff_h_4c.as_ref().unwrap().block_hash, - snapshot_at_h_4c.as_ref().unwrap().clone(), - ); - } - let last_quorum_per_index_count = - unwrap_or_qr_processing_failure!(read_var_int(offset)).0 as usize; - let mut last_quorum_per_index: Vec = - Vec::with_capacity(last_quorum_per_index_count); - for _i in 0..last_quorum_per_index_count { - let entry = unwrap_or_qr_processing_failure!(models::LLMQEntry::from_bytes( - message, offset - )); - last_quorum_per_index.push(entry); - } - let quorum_snapshot_list_count = - unwrap_or_qr_processing_failure!(read_var_int(offset)).0 as usize; - let mut quorum_snapshot_list: Vec = - Vec::with_capacity(quorum_snapshot_list_count); - for _i in 0..quorum_snapshot_list_count { - quorum_snapshot_list.push(unwrap_or_qr_processing_failure!(read_snapshot(offset))); - } - let mn_list_diff_list_count = - unwrap_or_qr_processing_failure!(read_var_int(offset)).0 as usize; - let mut mn_list_diff_list: Vec = - Vec::with_capacity(mn_list_diff_list_count); - for _i in 0..mn_list_diff_list_count { - let list_diff = unwrap_or_qr_processing_failure!(read_list_diff(offset)); - let verification_context = LLMQVerificationContext::QRInfo(is_rotated_quorums_presented); - mn_list_diff_list.push(process_list_diff(list_diff, verification_context)); - } - // The order is important since the each new one dependent on previous - #[allow(clippy::manual_map)] - let result_at_h_4c = if let Some(diff) = diff_h_4c { - Some(process_list_diff(diff, LLMQVerificationContext::None)) - } else { - None - }; - let result_at_h_3c = process_list_diff(diff_h_3c, LLMQVerificationContext::None); - let result_at_h_2c = process_list_diff(diff_h_2c, LLMQVerificationContext::None); - let result_at_h_c = process_list_diff(diff_h_c, LLMQVerificationContext::None); - let result_at_h = process_list_diff(diff_h, LLMQVerificationContext::QRInfo(is_rotated_quorums_presented)); - let result_at_tip = process_list_diff(diff_tip, LLMQVerificationContext::None); - QRInfoResult { - error_status: ProcessingError::None, - result_at_tip, - result_at_h, - result_at_h_c, - result_at_h_2c, - result_at_h_3c, - result_at_h_4c, - snapshot_at_h_c, - snapshot_at_h_2c, - snapshot_at_h_3c, - snapshot_at_h_4c, - extra_share, - last_quorum_per_index, - quorum_snapshot_list, - mn_list_diff_list, - } - } - - pub fn get_file_as_byte_vec(filename: &str) -> Vec { - //println!("get_file_as_byte_vec: {}", filename); - let mut f = fs::File::open(&filename).expect("no file found"); - let metadata = fs::metadata(&filename).expect("unable to read metadata"); - let mut buffer = vec![0; metadata.len() as usize]; - f.read_exact(&mut buffer).expect("buffer overflow"); - buffer - } - - pub fn register_cache<'a>() -> &'a mut MasternodeProcessorCache { - let cache = unsafe { &mut *processor_create_cache() }; - cache - } - - pub fn create_default_context(chain: ChainType, is_dip_0024: bool, cache: &mut MasternodeProcessorCache) -> FFIContext { - let blocks = match chain { - ChainType::MainNet => init_mainnet_store(), - ChainType::TestNet => init_testnet_store(), - _ => vec![], - }; - FFIContext { chain, is_dip_0024, cache, blocks } - } - - pub fn register_logger() { - unsafe { register_rust_logger(); } - } - - pub fn register_default_processor() -> *mut MasternodeProcessor { - unsafe { - register_processor( - get_merkle_root_by_hash_default, - get_block_height_by_hash_from_context, - get_block_hash_by_height_from_context, - get_llmq_snapshot_by_block_hash_from_context, - save_llmq_snapshot_in_cache, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_by_block_hash_from_cache, - masternode_list_save_in_cache, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - } - } - - pub fn process_mnlistdiff(bytes: Vec, processor: *mut MasternodeProcessor, context: &mut FFIContext, protocol_version: u32, use_insight: bool, is_from_snapshot: bool) -> *mut types::MNListDiffResult { - unsafe { - process_mnlistdiff_from_message( - bytes.as_ptr(), - bytes.len(), - context.chain, - use_insight, - is_from_snapshot, - protocol_version, - processor, - context.cache, - context as *mut _ as *mut std::ffi::c_void, - ) - } - } - - pub fn process_qrinfo(bytes: Vec, processor: *mut MasternodeProcessor, context: &mut FFIContext, version: u32, use_insight: bool, is_from_snapshot: bool) -> *mut types::QRInfoResult { - unsafe { - process_qrinfo_from_message( - bytes.as_ptr(), - bytes.len(), - context.chain, - use_insight, - is_from_snapshot, - true, - version, - processor, - context.cache, - context as *mut _ as *mut std::ffi::c_void, - ) - } - } - - pub fn message_from_file(name: &str) -> Vec { - let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); - let filepath = format!("{}/files/{}", crate_dir, name); - println!("{:?}", filepath); - get_file_as_byte_vec(&filepath) - } - - pub fn assert_diff_result(context: &mut FFIContext, result: *mut types::MNListDiffResult) { - let result = unsafe { &*result }; - let masternode_list = unsafe { (&*result.masternode_list).decode() }; - //print!("block_hash: {} ({})", masternode_list.block_hash, masternode_list.block_hash.reversed()); - let bh = context.block_for_hash(masternode_list.block_hash).unwrap().height; - assert!(result.has_found_coinbase, "has no coinbase {}", bh); - //turned off on purpose as we don't have the coinbase block - //assert!(result.has_valid_coinbase, "Coinbase not valid at height {}", bh); - assert!(result.has_valid_mn_list_root, "invalid mnl root {}", bh); - assert!(result.has_valid_llmq_list_root, "invalid llmq root {}", bh); - assert!(result.has_valid_quorums, "has invalid llmq height {}", bh); - println!("Diff is ok at {}", bh); - } - - pub fn assert_qrinfo_result(context: &mut FFIContext, result: *mut types::QRInfoResult) { - let result = unsafe { &*result }; - if result.mn_list_diff_list_count > 0 { - let diff_result = unsafe { *result.mn_list_diff_list }; - assert_diff_result(context, diff_result); - } - if result.extra_share { - assert_diff_result(context, result.result_at_h_4c); - } - assert_diff_result(context, result.result_at_h_3c); - assert_diff_result(context, result.result_at_h_2c); - assert_diff_result(context, result.result_at_h_c); - assert_diff_result(context, result.result_at_h); - assert_diff_result(context, result.result_at_tip); - } - - pub unsafe extern "C" fn get_block_height_by_hash_from_context( - block_hash: *mut [u8; 32], - context: *const std::ffi::c_void, - ) -> u32 { - let data: &mut FFIContext = &mut *(context as *mut FFIContext); - let block_hash = UInt256(*block_hash); - let block_hash_reversed = block_hash.reversed(); - let block = data.block_for_hash(block_hash).unwrap_or(&MerkleBlock { hash: UInt256::MIN, height: u32::MAX, merkleroot: UInt256::MIN }); - let height = block.height; - // println!("get_block_height_by_hash_from_context {}: {} ({})", height, block_hash_reversed, block_hash); - if height == u32::MAX { - println!("{}: {},", height, block_hash_reversed); - } - height - } - - pub unsafe extern "C" fn get_block_hash_by_height_default( - _block_height: u32, - _context: *const std::ffi::c_void, - ) -> *mut u8 { - null_mut() - } - - pub unsafe extern "C" fn get_block_hash_by_height_from_context( - block_height: u32, - context: *const std::ffi::c_void, - ) -> *mut u8 { - let data: &mut FFIContext = &mut *(context as *mut FFIContext); - if let Some(block) = data.block_for_height(block_height) { - let block_hash = block.hash; - // println!("get_block_hash_by_height_from_context: {}: {:?}", block_height, block_hash.clone().reversed()); - boxed(block_hash.0) as *mut _ - } else { - null_mut() - } - } - - pub unsafe extern "C" fn get_llmq_snapshot_by_block_height_default( - _block_height: u32, - _context: *const std::ffi::c_void, - ) -> *mut types::LLMQSnapshot { - null_mut() - } - - pub unsafe extern "C" fn get_llmq_snapshot_by_block_hash_default( - _block_hash: *mut [u8; 32], - _context: *const std::ffi::c_void, - ) -> *mut types::LLMQSnapshot { - null_mut() - } - - pub unsafe extern "C" fn get_llmq_snapshot_by_block_hash_from_context( - block_hash: *mut [u8; 32], - context: *const std::ffi::c_void, - ) -> *mut types::LLMQSnapshot { - let h = UInt256(*(block_hash)); - let data: &mut FFIContext = &mut *(context as *mut FFIContext); - if let Some(snapshot) = data.cache.llmq_snapshots.get(&h) { - //println!("get_llmq_snapshot_by_block_hash_from_context: {}: {:?}", h, snapshot); - boxed(snapshot.encode()) - } else { - null_mut() - } - } - - pub unsafe extern "C" fn get_cl_signature_by_block_hash_from_context( - block_hash: *mut [u8; 32], - context: *const std::ffi::c_void, - ) -> *mut u8 { - let h = UInt256(*(block_hash)); - let data: &mut FFIContext = &mut *(context as *mut FFIContext); - if let Some(sig) = data.cache.cl_signatures.get(&h) { - boxed(sig.0) as *mut _ - } else { - null_mut() - } - } - - pub unsafe extern "C" fn get_masternode_list_by_block_hash_default( - _block_hash: *mut [u8; 32], - _context: *const std::ffi::c_void, - ) -> *mut types::MasternodeList { - null_mut() - } - - pub unsafe extern "C" fn get_masternode_list_by_block_hash_from_cache( - block_hash: *mut [u8; 32], - context: *const std::ffi::c_void, - ) -> *mut types::MasternodeList { - let h = UInt256(*(block_hash)); - let data: &mut FFIContext = &mut *(context as *mut FFIContext); - //println!("get_masternode_list_by_block_hash_from_cache: {}", h); - if let Some(list) = data.cache.mn_lists.get(&h) { - // println!("get_masternode_list_by_block_hash_from_cache: {}: masternodes: {} quorums: {} mn_merkle_root: {:?}, llmq_merkle_root: {:?}", h, list.masternodes.len(), list.quorums.len(), list.masternode_merkle_root, list.llmq_merkle_root); - let encoded = list.encode(); - // &encoded as *const types::MasternodeList - boxed(encoded) - } else { - println!("missing list: {}: {},", get_block_height_by_hash_from_context(block_hash, context), h.reversed()); - null_mut() - } - } - - pub unsafe extern "C" fn masternode_list_save_default( - _block_hash: *mut [u8; 32], - _masternode_list: *mut types::MasternodeList, - _context: *const std::ffi::c_void, - ) -> bool { - true - } - pub unsafe extern "C" fn masternode_list_save_in_cache( - block_hash: *mut [u8; 32], - masternode_list: *mut types::MasternodeList, - context: *const std::ffi::c_void, - ) -> bool { - let h = UInt256(*(block_hash)); - let data: &mut FFIContext = &mut *(context as *mut FFIContext); - let masternode_list = &*masternode_list; - let masternode_list_decoded = masternode_list.decode(); - //println!("masternode_list_save_in_cache: {}", h); - data.cache.mn_lists.insert(h, masternode_list_decoded); - true - } - - pub unsafe extern "C" fn masternode_list_destroy_default( - _masternode_list: *mut types::MasternodeList, - ) { - } - pub unsafe extern "C" fn hash_destroy_default(_hash: *mut u8) {} - - pub unsafe extern "C" fn should_process_diff_with_range_default( - base_block_hash: *mut [u8; 32], - block_hash: *mut [u8; 32], - context: *const std::ffi::c_void, - ) -> ProcessingError { - ProcessingError::None - } - pub unsafe extern "C" fn snapshot_destroy_default(_snapshot: *mut types::LLMQSnapshot) {} - pub unsafe extern "C" fn destroy_cl_signature_in_cache(_cl_signature: *mut [u8; 96]) {} - pub unsafe extern "C" fn add_insight_lookup_default( - _hash: *mut [u8; 32], - _context: *const std::ffi::c_void, - ) { - } - pub unsafe extern "C" fn save_llmq_snapshot_default( - block_hash: *mut [u8; 32], - snapshot: *mut types::LLMQSnapshot, - _context: *const std::ffi::c_void, - ) -> bool { - true - } - pub unsafe extern "C" fn save_llmq_snapshot_in_cache( - block_hash: *mut [u8; 32], - snapshot: *mut types::LLMQSnapshot, - context: *const std::ffi::c_void, - ) -> bool { - let h = UInt256(*(block_hash)); - let data: &mut FFIContext = &mut *(context as *mut FFIContext); - data.cache.add_snapshot(h, (*snapshot).decode()); - true - } - pub unsafe extern "C" fn save_cl_signature_in_cache( - block_hash: *mut [u8; 32], - cl_signature: *mut [u8; 96], - context: *const std::ffi::c_void, - ) -> bool { - let h = UInt256(*(block_hash)); - let data: &mut FFIContext = &mut *(context as *mut FFIContext); - data.cache.add_cl_signature(h, UInt768(*cl_signature)); - true - } - - pub unsafe extern "C" fn get_merkle_root_by_hash_default( - block_hash: *mut [u8; 32], - context: *const std::ffi::c_void, - ) -> *mut u8 { - let block_hash = UInt256(*block_hash); - let data: &mut FFIContext = &mut *(context as *mut FFIContext); - let block_hash_reversed = block_hash.reversed().0.to_hex(); - let merkle_root = if let Some(block) = data.block_for_hash(block_hash) { - block.merkleroot.reversed() - } else { - UInt256::from_hex("0000000000000000000000000000000000000000000000000000000000000000").unwrap() - }; - //println!("get_merkle_root_by_hash_default {} ({}) => ({})", block_hash, block_hash_reversed, merkle_root); - boxed(merkle_root.0) as *mut _ - } - - pub unsafe extern "C" fn get_block_hash_by_height_from_insight(block_height: u32, context: *const std::ffi::c_void) -> *mut u8 { - let data: &mut FFIContext = &mut *(context as *mut FFIContext); - match data.blocks.iter().find(|block| block.height == block_height) { - Some(block) => boxed(block.hash.0) as *mut _, - None => match get_block_from_insight_by_height(block_height) { - Some(block) => { - data.blocks.push(block); - boxed(block.hash.0) as *mut _ - }, - None => null_mut() - } - } - } - - pub unsafe extern "C" fn get_block_height_by_hash_from_insight(block_hash: *mut [u8; 32], context: *const std::ffi::c_void) -> u32 { - let data: &mut FFIContext = &mut *(context as *mut FFIContext); - let hash = UInt256(*block_hash); - match data.blocks.iter().find(|block| block.hash == hash) { - Some(block) => block.height, - None => match get_block_from_insight_by_hash(hash) { - Some(block) => { - data.blocks.push(block); - block.height - } - None => u32::MAX - } - } - } - - pub unsafe extern "C" fn get_merkle_root_by_hash_from_insight(block_hash: *mut [u8; 32], context: *const std::ffi::c_void) -> *mut u8 { - let data: &mut FFIContext = &mut *(context as *mut FFIContext); - let hash = UInt256(*block_hash); - match data.blocks.iter().find(|block| block.hash == hash) { - Some(block) => boxed(block.merkleroot.reversed().0) as *mut _, - None => match get_block_from_insight_by_hash(hash) { - Some(block) => { - data.blocks.push(block); - boxed(block.merkleroot.reversed().0) as *mut _ - }, - None => boxed(UInt256::MIN.0) as *mut _ - } - } - } - - pub fn perform_mnlist_diff_test_for_message( - hex_string: &str, - should_be_total_transactions: u32, - verify_string_hashes: Vec<&str>, - verify_string_smle_hashes: Vec<&str>, - ) { - let bytes = Vec::from_hex(hex_string).unwrap(); - let length = bytes.len(); - let c_array = bytes.as_ptr(); - let message: &[u8] = unsafe { slice::from_raw_parts(c_array, length) }; - let chain = ChainType::TestNet; - let offset = &mut 0; - assert!(length - *offset >= 32); - let base_block_hash = UInt256::from_bytes(message, offset).unwrap(); - assert_ne!( - base_block_hash, - UInt256::default(), /*UINT256_ZERO*/ - "Base block hash should NOT be empty here" - ); - assert!(length - *offset >= 32); - let _block_hash = UInt256::from_bytes(message, offset).unwrap(); - assert!(length - *offset >= 4); - let total_transactions = u32::from_bytes(message, offset).unwrap(); - assert_eq!( - total_transactions, should_be_total_transactions, - "Invalid transaction count" - ); - let use_insight_as_backup = false; - let base_masternode_list_hash: *const u8 = null_mut(); - let context = &mut FFIContext { - chain, - is_dip_0024: false, - cache: &mut MasternodeProcessorCache::default(), - blocks: init_testnet_store() - } as *mut _ as *mut std::ffi::c_void; - - let cache = unsafe { processor_create_cache() }; - let processor = unsafe { - register_processor( - get_merkle_root_by_hash_default, - get_block_height_by_hash_from_context, - get_block_hash_by_height_default, - get_llmq_snapshot_by_block_hash_default, - save_llmq_snapshot_default, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_by_block_hash_default, - masternode_list_save_default, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - - let result = unsafe { process_mnlistdiff_from_message( - c_array, - length, - chain, - use_insight_as_backup, - false, - 70221, - processor, - cache, - context, - )}; - // println!("result: {:?}", result); - - - let result = unsafe { &*result }; - let masternode_list = unsafe { (&*result.masternode_list).decode() }; - let masternodes = masternode_list.masternodes; - let mut pro_tx_hashes: Vec = masternodes.clone().into_keys().collect(); - pro_tx_hashes.sort(); - let mut verify_hashes: Vec = verify_string_hashes - .into_iter() - .map(|h| { - Vec::from_hex(h) - .unwrap() - .read_with::(&mut 0, byte::LE) - .unwrap() - .reverse() - }) - .collect(); - verify_hashes.sort(); - assert_eq!(verify_hashes, pro_tx_hashes, "Provider transaction hashes"); - let mut masternode_list_hashes: Vec = pro_tx_hashes - .clone() - .iter() - .map(|hash| masternodes[hash].entry_hash) - .collect(); - masternode_list_hashes.sort(); - let mut verify_smle_hashes: Vec = verify_string_smle_hashes - .into_iter() - .map(|h| { - Vec::from_hex(h) - .unwrap() - .read_with::(&mut 0, byte::LE) - .unwrap() - }) - .collect(); - verify_smle_hashes.sort(); - assert_eq!(masternode_list_hashes, verify_smle_hashes, "SMLE transaction hashes"); - assert!(result.has_found_coinbase, "The coinbase was not part of provided hashes"); - } -} diff --git a/dash-spv-masternode-processor/src/logger.rs b/dash-spv-masternode-processor/src/logger.rs new file mode 100644 index 00000000..bd0c21da --- /dev/null +++ b/dash-spv-masternode-processor/src/logger.rs @@ -0,0 +1,38 @@ +use std::fs::File; +use simplelog::{ColorChoice, CombinedLogger, ConfigBuilder, LevelFilter, TerminalMode, TermLogger, WriteLogger}; + +/// Initializes logger (it could be initialize only once) +#[no_mangle] +pub unsafe extern "C" fn register_rust_logger() { + // Get the path to the cache directory. + let cache_path = match dirs_next::cache_dir() { + Some(path) => path, + None => panic!("Failed to find the cache directory"), + }; + + // Create the log directory if it doesn't exist. + let log_dir = cache_path.join("Logs"); + if !log_dir.exists() { + std::fs::create_dir_all(&log_dir).expect("Failed to create log directory"); + } + + // Create the log file inside the cache directory. + let log_file_path = log_dir.join("processor.log"); + println!("Log file create at: {:?}", log_file_path); + let log_file = File::create(log_file_path) + .expect("Failed to create log file"); + let config = ConfigBuilder::new().build(); + //let config = ConfigBuilder::new().set_time_level(LevelFilter::Off).set_max_level(LevelFilter::Off).build(); + match CombinedLogger::init( + vec![ + TermLogger::new(LevelFilter::Error, config.clone(), TerminalMode::Mixed, ColorChoice::Auto), + TermLogger::new(LevelFilter::Warn, config.clone(), TerminalMode::Mixed, ColorChoice::Auto), + WriteLogger::new(LevelFilter::Error, config.clone(), log_file.try_clone().unwrap()), + WriteLogger::new(LevelFilter::Warn, config.clone(), log_file.try_clone().unwrap()), + WriteLogger::new(LevelFilter::Info, config.clone(), log_file.try_clone().unwrap()), + ] + ) { + Ok(()) => println!("Logger initialized"), + Err(err) => println!("Failed to init logger: {}", err) + } +} diff --git a/dash-spv-masternode-processor/src/macros.rs b/dash-spv-masternode-processor/src/macros.rs index 03f60bc8..212ccfda 100644 --- a/dash-spv-masternode-processor/src/macros.rs +++ b/dash-spv-masternode-processor/src/macros.rs @@ -2,31 +2,19 @@ macro_rules! unwrap_or_return { ($e: expr, $re: expr) => { match $e { - Some(x) => x, - None => return $re(), + Ok(x) => x, + Err(err) => return $re(), } }; } - -#[macro_export] -macro_rules! unwrap_or_failure { - ($e: expr) => { - unwrap_or_return!($e, || boxed(types::MNListDiffResult::default())) - }; -} - -#[macro_export] -macro_rules! unwrap_or_qr_failure { - ($e: expr) => { - unwrap_or_return!($e, || boxed(types::QRInfo::default())) - }; -} - #[macro_export] -macro_rules! unwrap_or_qr_result_failure { +macro_rules! ok_or_return_processing_error { ($e: expr) => { - unwrap_or_return!($e, || boxed(types::QRInfoResult::default())) - }; + match $e { + Ok(result) => result, + Err(err) => return Err(ProcessingError::from(err)) + } + } } #[macro_export] diff --git a/dash-spv-masternode-processor/src/models/llmq_entry.rs b/dash-spv-masternode-processor/src/models/llmq_entry.rs deleted file mode 100644 index 057a6f43..00000000 --- a/dash-spv-masternode-processor/src/models/llmq_entry.rs +++ /dev/null @@ -1,415 +0,0 @@ -use byte::{BytesExt, ctx::{Bytes, Endian}, TryRead, LE}; -use hashes::hex::ToHex; -use std::convert::Into; -#[cfg(feature = "generate-dashj-tests")] -use serde::ser::SerializeStruct; -#[cfg(feature = "generate-dashj-tests")] -use serde::{Serialize, Serializer}; -use logging::*; -use tracing::*; -use crate::chain::common::{ChainType, IHaveChainSettings, LLMQType}; -use crate::common::LLMQVersion; -use crate::consensus::{encode::VarInt, Encodable, WriteExt}; -use crate::crypto::{byte_util::AsBytes, data_ops::Data, UInt256, UInt384, UInt768}; -use crate::keys::BLSKey; -use crate::models; -use crate::processing::llmq_validation_status::{LLMQValidationStatus, LLMQPayloadValidationStatus}; - -#[derive(PartialEq)] -pub enum LLMQVerificationContext { - None, - MNListDiff, - QRInfo(bool), -} - -impl LLMQVerificationContext { - pub fn should_validate_quorums(&self) -> bool { - *self != Self::None - } - pub fn should_validate_quorum_of_type(&self, llmq_type: LLMQType, chain_type: ChainType) -> bool { - match self { - LLMQVerificationContext::None => false, - LLMQVerificationContext::MNListDiff => - chain_type.isd_llmq_type() != llmq_type && chain_type.should_process_llmq_of_type(llmq_type), - LLMQVerificationContext::QRInfo(is_quorum_rotation_activated) => - chain_type.isd_llmq_type() == llmq_type && *is_quorum_rotation_activated == true - } - } -} - -pub enum LLMQModifierType { - PreCoreV20(LLMQType, UInt256), - CoreV20(LLMQType, u32, UInt768), -} - -impl LLMQModifierType { - pub fn build_llmq_hash(&self) -> UInt256 { - let mut writer = vec![]; - match *self { - LLMQModifierType::PreCoreV20(llmq_type, block_hash) => { - VarInt(llmq_type as u64).enc(&mut writer); - block_hash.enc(&mut writer); - }, - LLMQModifierType::CoreV20(llmq_type, block_height, cl_signature) => { - VarInt(llmq_type as u64).enc(&mut writer); - block_height.enc(&mut writer); - cl_signature.enc(&mut writer); - } - } - UInt256::sha256d(writer) - } -} - -#[derive(Clone, Ord, PartialOrd, PartialEq, Eq)] -pub struct LLMQEntry { - pub version: LLMQVersion, - pub llmq_hash: UInt256, - pub index: Option, - pub public_key: UInt384, - pub threshold_signature: UInt768, - pub verification_vector_hash: UInt256, - pub all_commitment_aggregated_signature: UInt768, - pub llmq_type: LLMQType, - pub signers_bitset: Vec, - pub signers_count: VarInt, - pub valid_members_bitset: Vec, - pub valid_members_count: VarInt, - pub entry_hash: UInt256, - pub verified: bool, - pub saved: bool, - pub commitment_hash: Option, -} - -#[cfg(feature = "generate-dashj-tests")] -impl Serialize for LLMQEntry { - fn serialize(&self, serializer: S) -> Result where S: Serializer { - let mut state = serializer.serialize_struct("LLMQEntry", 10 + usize::from(self.index.is_some()))?; - state.serialize_field("version", &self.version)?; - if let Some(index) = self.index { - state.serialize_field("index", &index)?; - } - state.serialize_field("public_key", &self.public_key)?; - state.serialize_field("threshold_signature", &self.threshold_signature)?; - state.serialize_field("verification_vector_hash", &self.verification_vector_hash)?; - state.serialize_field("all_commitment_aggregated_signature", &self.all_commitment_aggregated_signature)?; - state.serialize_field("llmq_type", &self.llmq_type)?; - state.serialize_field("signers_bitset", &self.signers_bitset.to_hex())?; - state.serialize_field("signers_count", &self.signers_count.0)?; - state.serialize_field("valid_members_bitset", &self.valid_members_bitset.to_hex())?; - state.serialize_field("valid_members_count", &self.valid_members_count.0)?; - state.end() - - } -} - -pub struct VecHex(pub Vec); -impl std::fmt::Debug for VecHex { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "Vec::from_hex(\"{}\").unwrap()", self.0.to_hex()) - } -} - -impl std::fmt::Debug for LLMQEntry { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("LLMQEntry") - .field("version", &self.version) - .field("llmq_hash", &self.llmq_hash) - .field("index", &self.index) - .field("public_key", &self.public_key) - .field("threshold_signature", &self.threshold_signature) - .field("verification_vector_hash", &self.verification_vector_hash) - .field("all_commitment_aggregated_signature", &self.all_commitment_aggregated_signature) - .field("llmq_type", &self.llmq_type) - .field("signers_bitset", &VecHex(self.signers_bitset.clone())) - .field("signers_count", &self.signers_count) - .field("valid_members_bitset", &VecHex(self.valid_members_bitset.clone())) - .field("valid_members_count", &self.valid_members_count) - .field("entry_hash", &self.entry_hash) - .field("verified", &self.verified) - .field("saved", &self.saved) - .field("commitment_hash", &self.commitment_hash) - .finish() - } -} - -impl<'a> TryRead<'a, Endian> for LLMQEntry { - fn try_read(bytes: &'a [u8], _ctx: Endian) -> byte::Result<(Self, usize)> { - let offset = &mut 0; - let version = bytes.read_with::(offset, LE)?; - let llmq_type = bytes.read_with::(offset, LE)?; - let llmq_hash = bytes.read_with::(offset, LE)?; - let index = if version.use_rotated_quorums() { - Some(bytes.read_with::(offset, LE)?) - } else { - None - }; - let signers_count = bytes.read_with::(offset, LE)?; - let signers_buffer_length: usize = ((signers_count.0 as usize) + 7) / 8; - let signers_bitset: &[u8] = bytes.read_with(offset, Bytes::Len(signers_buffer_length))?; - let valid_members_count = bytes.read_with::(offset, LE)?; - let valid_members_count_buffer_length: usize = ((valid_members_count.0 as usize) + 7) / 8; - let valid_members_bitset: &[u8] = - bytes.read_with(offset, Bytes::Len(valid_members_count_buffer_length))?; - let public_key = bytes.read_with::(offset, LE)?; - let verification_vector_hash = bytes.read_with::(offset, LE)?; - let threshold_signature = bytes.read_with::(offset, LE)?; - let all_commitment_aggregated_signature = bytes.read_with::(offset, LE)?; - let entry = LLMQEntry::new( - version, - llmq_type, - llmq_hash, - index, - signers_count, - valid_members_count, - signers_bitset.to_vec(), - valid_members_bitset.to_vec(), - public_key, - verification_vector_hash, - threshold_signature, - all_commitment_aggregated_signature - ); - Ok((entry, *offset)) - } -} - -impl LLMQEntry { - #[allow(clippy::too_many_arguments)] - pub fn new( - version: LLMQVersion, - llmq_type: LLMQType, - llmq_hash: UInt256, - index: Option, - signers_count: VarInt, - valid_members_count: VarInt, - signers_bitset: Vec, - valid_members_bitset: Vec, - public_key: UInt384, - verification_vector_hash: UInt256, - threshold_signature: UInt768, - all_commitment_aggregated_signature: UInt768, - ) -> Self { - let q_data = Self::generate_data( - version, - llmq_type, - llmq_hash, - index, - signers_count, - signers_bitset.as_slice(), - valid_members_count, - valid_members_bitset.as_slice(), - public_key, - verification_vector_hash, - threshold_signature, - all_commitment_aggregated_signature, - ); - let entry_hash = UInt256::sha256d(q_data); - //println!("LLMQEntry::new({}, {:?}, {}, {:?}, {}, {}, {}, {}, {}, {}, {}, {}) = {}", version, llmq_type, llmq_hash, index, signers_count, signers_bitset.to_hex(), valid_members_count, valid_members_bitset.to_hex(), public_key, verification_vector_hash, threshold_signature, all_commitment_aggregated_signature, entry_hash); - Self { - version, - llmq_hash, - index, - public_key, - threshold_signature, - verification_vector_hash, - all_commitment_aggregated_signature, - llmq_type, - signers_bitset, - signers_count, - valid_members_bitset, - valid_members_count, - entry_hash, - verified: false, - saved: false, - commitment_hash: None, - } - } - - #[allow(clippy::too_many_arguments)] - pub fn generate_data( - version: LLMQVersion, - llmq_type: LLMQType, - llmq_hash: UInt256, - llmq_index: Option, - signers_count: VarInt, - signers_bitset: &[u8], - valid_members_count: VarInt, - valid_members_bitset: &[u8], - public_key: UInt384, - verification_vector_hash: UInt256, - threshold_signature: UInt768, - all_commitment_aggregated_signature: UInt768, - ) -> Vec { - let mut buffer: Vec = Vec::new(); - let offset: &mut usize = &mut 0; - let llmq_u8: u8 = llmq_type.into(); - let llmq_v: u16 = version.into(); - *offset += llmq_v.enc(&mut buffer); - *offset += llmq_u8.enc(&mut buffer); - *offset += llmq_hash.enc(&mut buffer); - if let Some(index) = llmq_index { - *offset += index.enc(&mut buffer); - } - *offset += signers_count.enc(&mut buffer); - buffer.emit_slice(signers_bitset).unwrap(); - *offset += signers_bitset.len(); - *offset += valid_members_count.enc(&mut buffer); - buffer.emit_slice(valid_members_bitset).unwrap(); - *offset += valid_members_bitset.len(); - *offset += public_key.enc(&mut buffer); - *offset += verification_vector_hash.enc(&mut buffer); - *offset += threshold_signature.enc(&mut buffer); - *offset += all_commitment_aggregated_signature.enc(&mut buffer); - buffer - } - - pub fn to_data(&self) -> Vec { - Self::generate_data( - self.version, - self.llmq_type, - self.llmq_hash, - self.index, - self.signers_count, - &self.signers_bitset, - self.valid_members_count, - &self.valid_members_bitset, - self.public_key, - self.verification_vector_hash, - self.threshold_signature, - self.all_commitment_aggregated_signature, - ) - } - - pub fn commitment_data(&self) -> Vec { - let mut buffer: Vec = Vec::new(); - let offset: &mut usize = &mut 0; - let llmq_type = VarInt(self.llmq_type as u64); - *offset += llmq_type.enc(&mut buffer); - *offset += self.llmq_hash.enc(&mut buffer); - *offset += self.valid_members_count.enc(&mut buffer); - buffer.emit_slice(&self.valid_members_bitset).unwrap(); - *offset += self.valid_members_bitset.len(); - *offset += self.public_key.enc(&mut buffer); - *offset += self.verification_vector_hash.enc(&mut buffer); - buffer - } - - pub fn ordering_hash_for_request_id( - &self, - request_id: UInt256, - llmq_type: LLMQType, - ) -> UInt256 { - let llmq_type = VarInt(llmq_type as u64); - let mut buffer: Vec = Vec::with_capacity(llmq_type.len() + 64); - llmq_type.enc(&mut buffer); - self.llmq_hash.enc(&mut buffer); - request_id.enc(&mut buffer); - UInt256::sha256d(buffer) - } - - pub fn generate_commitment_hash(&mut self) -> UInt256 { - if self.commitment_hash.is_none() { - self.commitment_hash = Some(UInt256::sha256d(self.commitment_data())); - } - self.commitment_hash.unwrap() - } - - fn validate_bitset(bitset: Vec, count: VarInt) -> bool { - if bitset.len() != (count.0 as usize + 7) / 8 { - log_debug!(target: "masternode-processor", - "Error: The byte size of the bitvectors ({}) must match “(quorumSize + 7) / 8 ({})", - bitset.len(), - (count.0 + 7) / 8 - ); - return false; - } - let len = (bitset.len() * 8) as i32; - let size = count.0 as i32; - if len != size { - let rem = len - size; - let mask = !(0xff >> rem); - let last_byte = match bitset.last() { - Some(&last) => last as i32, - None => 0, - }; - if last_byte & mask != 0 { - log_debug!(target: "masternode-processor", "Error: No out-of-range bits should be set in byte representation of the bitvector"); - return false; - } - } - true - } - - pub fn validate_payload(&self) -> LLMQPayloadValidationStatus { - // The quorumHash must match the current DKG session - // todo - let is_valid_signers = - Self::validate_bitset(self.signers_bitset.clone(), self.signers_count); - if !is_valid_signers { - log_debug!(target: "masternode-processor", "Error: signers_bitset is invalid ({:?} {})", self.signers_bitset, self.signers_count); - return LLMQPayloadValidationStatus::InvalidSigners(self.signers_bitset.to_hex()); - } - let is_valid_members = - Self::validate_bitset(self.valid_members_bitset.clone(), self.valid_members_count); - if !is_valid_members { - log_debug!(target: "masternode-processor", "Error: valid_members_bitset is invalid ({:?} {})", self.valid_members_bitset, self.valid_members_count); - return LLMQPayloadValidationStatus::InvalidMembers(self.valid_members_bitset.to_hex()); - } - let quorum_threshold = self.llmq_type.threshold() as u64; - // The number of set bits in the signers and validMembers bitvectors must be at least >= quorumThreshold - let signers_bitset_true_bits_count = self.signers_bitset.as_slice().true_bits_count(); - if signers_bitset_true_bits_count < quorum_threshold { - log_debug!(target: "masternode-processor", "Error: The number of set bits in the signers {} must be >= quorumThreshold {}", signers_bitset_true_bits_count, quorum_threshold); - return LLMQPayloadValidationStatus::SignersBelowThreshold { actual: signers_bitset_true_bits_count, threshold: quorum_threshold }; - } - let valid_members_bitset_true_bits_count = - self.valid_members_bitset.as_slice().true_bits_count(); - if valid_members_bitset_true_bits_count < quorum_threshold { - log_debug!(target: "masternode-processor", "Error: The number of set bits in the valid members bitvector {} must be >= quorumThreshold {}", valid_members_bitset_true_bits_count, quorum_threshold); - return LLMQPayloadValidationStatus::SignersBelowThreshold { actual: valid_members_bitset_true_bits_count, threshold: quorum_threshold }; - } - LLMQPayloadValidationStatus::Ok - } -} - -impl LLMQEntry { - - pub fn verify(&mut self, valid_masternodes: Vec, block_height: u32) -> LLMQValidationStatus { - let payload_status = self.validate_payload(); - if !payload_status.is_ok() { - return LLMQValidationStatus::InvalidPayload(payload_status); - } - let status = self.validate(valid_masternodes, block_height); - self.verified = status == LLMQValidationStatus::Verified; - status - } - - pub fn validate(&mut self, valid_masternodes: Vec, block_height: u32) -> LLMQValidationStatus { - let commitment_hash = self.generate_commitment_hash(); - let use_legacy = self.version.use_bls_legacy(); - let operator_keys = valid_masternodes - .iter() - .enumerate() - .filter_map(|(i, node)| self.signers_bitset.as_slice().bit_is_true_at_le_index(i as u32) - .then_some(node.operator_public_key_at(block_height))) - .collect::>(); - // info!("let operator_keys = vec![{:?}];", operator_keys); - let all_commitment_aggregated_signature_validated = BLSKey::verify_secure_aggregated( - commitment_hash, - self.all_commitment_aggregated_signature, - operator_keys, - use_legacy); - if !all_commitment_aggregated_signature_validated { - log_debug!(target: "masternode-processor", "••• INVALID AGGREGATED SIGNATURE {}: {:?} ({})", block_height, self.llmq_type, self.all_commitment_aggregated_signature); - return LLMQValidationStatus::InvalidAggregatedSignature; - } - // The sig must validate against the commitmentHash and all public keys determined by the signers bitvector. - // This is an aggregated BLS signature verification. - let quorum_signature_validated = BLSKey::verify_quorum_signature(commitment_hash.as_bytes(), self.threshold_signature.as_bytes(), self.public_key.as_bytes(), use_legacy); - if !quorum_signature_validated { - log_debug!(target: "masternode-processor", "••• INVALID QUORUM SIGNATURE {}: {:?} ({})", block_height, self.llmq_type, self.threshold_signature); - return LLMQValidationStatus::InvalidQuorumSignature; - } - log_debug!(target: "masternode-processor", "••• quorum {:?} validated at {}", self.llmq_type, block_height); - LLMQValidationStatus::Verified - } -} diff --git a/dash-spv-masternode-processor/src/models/llmq_typed_hash.rs b/dash-spv-masternode-processor/src/models/llmq_typed_hash.rs deleted file mode 100644 index e2842766..00000000 --- a/dash-spv-masternode-processor/src/models/llmq_typed_hash.rs +++ /dev/null @@ -1,31 +0,0 @@ -use crate::chain::common::LLMQType; -use crate::crypto::UInt256; - -#[derive(Debug, Copy, Clone)] -pub struct LLMQTypedHash { - pub r#type: LLMQType, - pub hash: UInt256, -} - -#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq)] -pub struct LLMQIndexedHash { - pub index: u32, - pub hash: UInt256, -} - -impl LLMQIndexedHash { - pub fn new(hash: UInt256, index: u32) -> Self { - LLMQIndexedHash { index, hash } - } -} - -impl From<(UInt256, usize)> for LLMQIndexedHash { - fn from(value: (UInt256, usize)) -> Self { - Self::new(value.0, value.1 as u32) - } -} -impl From<(UInt256, u32)> for LLMQIndexedHash { - fn from(value: (UInt256, u32)) -> Self { - Self::new(value.0, value.1) - } -} diff --git a/dash-spv-masternode-processor/src/models/masternode_entry.rs b/dash-spv-masternode-processor/src/models/masternode_entry.rs deleted file mode 100644 index a02859e0..00000000 --- a/dash-spv-masternode-processor/src/models/masternode_entry.rs +++ /dev/null @@ -1,376 +0,0 @@ -use byte::{BytesExt, TryRead}; -use std::collections::BTreeMap; -#[cfg(feature = "generate-dashj-tests")] -use serde::{Serialize, Serializer}; -#[cfg(feature = "generate-dashj-tests")] -use serde::ser::SerializeStruct; -use logging::*; -use tracing::*; -use crate::chain::constants::CORE_PROTO_19_2; -use crate::common::{Block, MasternodeType, SocketAddress}; -use crate::consensus::Encodable; -use crate::crypto::{UInt160, UInt256, byte_util::Zeroable}; -use crate::models::OperatorPublicKey; -use crate::util::data_ops::short_hex_string_from; - -// (block height, list diff version (2: BLSBasic), protocol_version) -#[derive(Clone, Copy)] -pub struct MasternodeReadContext(pub u32, pub u16, pub u32); - -#[derive(Clone, Ord, PartialOrd, Eq, PartialEq)] -pub struct MasternodeEntry { - pub provider_registration_transaction_hash: UInt256, - pub confirmed_hash: UInt256, - pub confirmed_hash_hashed_with_provider_registration_transaction_hash: Option, - pub socket_address: SocketAddress, - pub operator_public_key: OperatorPublicKey, - pub previous_operator_public_keys: BTreeMap, - pub previous_entry_hashes: BTreeMap, - pub previous_validity: BTreeMap, - pub known_confirmed_at_height: Option, - pub update_height: u32, - pub key_id_voting: UInt160, - pub is_valid: bool, - pub mn_type: MasternodeType, - pub platform_http_port: u16, - pub platform_node_id: UInt160, - pub entry_hash: UInt256, -} - -#[cfg(feature = "generate-dashj-tests")] -impl Serialize for MasternodeEntry { - fn serialize(&self, serializer: S) -> Result where S: Serializer { - let mut state = serializer.serialize_struct("MasternodeEntry", 10)?; - state.serialize_field("provider_registration_transaction_hash", &self.provider_registration_transaction_hash)?; - state.serialize_field("confirmed_hash", &self.confirmed_hash)?; - state.serialize_field("ip_address", &self.socket_address.ip_address)?; - state.serialize_field("port", &self.socket_address.port)?; - state.serialize_field("operator_public_key", &self.operator_public_key.data)?; - state.serialize_field("key_id_voting", &self.key_id_voting)?; - state.serialize_field("is_valid", &self.is_valid)?; - state.serialize_field("mn_type", &self.mn_type)?; - state.serialize_field("platform_http_port", &self.platform_http_port)?; - state.serialize_field("platform_node_id", &self.platform_node_id)?; - state.end() - - } -} - -// Define a wrapper struct for the BTreeMap. -pub struct CustomDebugBTreeMap(pub BTreeMap); -impl std::fmt::Debug for CustomDebugBTreeMap { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - // Customize the debug representation here. - write!(f, "BTreeMap::from([")?; - for (key, value) in &self.0 { - write!(f, "({:?}, {:?}), ", key, value)?; - } - write!(f, "])") - } -} - -impl std::fmt::Debug for MasternodeEntry { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let prev_e = CustomDebugBTreeMap(self.previous_entry_hashes.clone()); - let prev_v = CustomDebugBTreeMap(self.previous_validity.clone()); - let prev_o = CustomDebugBTreeMap(self.previous_operator_public_keys.clone()); - f.debug_struct("MasternodeEntry") - .field("provider_registration_transaction_hash", &self.provider_registration_transaction_hash) - .field("confirmed_hash", &self.confirmed_hash) - .field("confirmed_hash_hashed_with_provider_registration_transaction_hash", &self.confirmed_hash_hashed_with_provider_registration_transaction_hash) - .field("socket_address", &self.socket_address) - .field("operator_public_key", &self.operator_public_key.data) - .field("version", &self.operator_public_key.version) - .field("previous_operator_public_keys", &prev_o) - .field("previous_entry_hashes", &prev_e) - .field("previous_validity", &prev_v) - .field("known_confirmed_at_height", &self.known_confirmed_at_height) - .field("update_height", &self.update_height) - .field("key_id_voting", &self.key_id_voting) - .field("is_valid", &self.is_valid) - .field("mn_type", &self.mn_type) - .field("platform_http_port", &self.platform_http_port) - .field("platform_node_id", &self.platform_node_id) - .field("entry_hash", &self.entry_hash) - .finish() - } -} - -impl<'a> TryRead<'a, MasternodeReadContext> for MasternodeEntry { - fn try_read(bytes: &'a [u8], context: MasternodeReadContext) -> byte::Result<(Self, usize)> { - let MasternodeReadContext (block_height, diff_version, protocol_version) = context; - let offset = &mut 0; - let version = if protocol_version >= CORE_PROTO_19_2 { - bytes.read_with::(offset, byte::LE)? - } else { - 1 // legacy - }; - let provider_registration_transaction_hash = - bytes.read_with::(offset, byte::LE)?; - let confirmed_hash = bytes.read_with::(offset, byte::LE)?; - let socket_address = bytes.read_with::(offset, ())?; - let operator_public_key = bytes.read_with::(offset, (version, protocol_version))?; - let key_id_voting = bytes.read_with::(offset, byte::LE)?; - let is_valid = bytes.read_with::(offset, byte::LE) - .unwrap_or(0); - let mn_type = if version >= 2 { - bytes.read_with::(offset, byte::LE)? - } else { - MasternodeType::Regular - }; - let (platform_http_port, platform_node_id) = if mn_type == MasternodeType::HighPerformance { - (bytes.read_with::(offset, byte::BE)?, - bytes.read_with::(offset, byte::LE)?) - } else { - (0u16, UInt160::MIN) - }; - let mut entry = Self::new( - version, - provider_registration_transaction_hash, - confirmed_hash, - socket_address, - key_id_voting, - operator_public_key, - is_valid, - mn_type, - platform_http_port, - platform_node_id, - block_height, - protocol_version - ); - if !entry.confirmed_hash.is_zero() && block_height != u32::MAX { - entry.known_confirmed_at_height = Some(block_height); - } - Ok((entry, *offset)) - } -} - -impl MasternodeEntry { - pub fn new( - version: u16, - provider_registration_transaction_hash: UInt256, - confirmed_hash: UInt256, - socket_address: SocketAddress, - key_id_voting: UInt160, - operator_public_key: OperatorPublicKey, - is_valid: u8, - mn_type: MasternodeType, - platform_http_port: u16, - platform_node_id: UInt160, - update_height: u32, - protocol_version: u32, - ) -> Self { - let entry_hash = Self::calculate_entry_hash( - version, - provider_registration_transaction_hash, - confirmed_hash, - socket_address, - operator_public_key, - key_id_voting, - is_valid, - mn_type, - platform_http_port, - platform_node_id, - protocol_version, - ); - Self { - provider_registration_transaction_hash, - confirmed_hash, - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - Self::hash_confirmed_hash(confirmed_hash, provider_registration_transaction_hash), - ), - socket_address, - operator_public_key, - previous_operator_public_keys: Default::default(), - previous_entry_hashes: Default::default(), - previous_validity: Default::default(), - known_confirmed_at_height: None, - update_height, - key_id_voting, - is_valid: is_valid != 0, - mn_type, - platform_http_port, - platform_node_id, - entry_hash, - } - } - - pub fn calculate_entry_hash( - version: u16, - provider_registration_transaction_hash: UInt256, - confirmed_hash: UInt256, - socket_address: SocketAddress, - operator_public_key: OperatorPublicKey, - key_id_voting: UInt160, - is_valid: u8, - mn_type: MasternodeType, - platform_http_port: u16, - platform_node_id: UInt160, - protocol_version: u32, - ) -> UInt256 { - let mut writer = Vec::::new(); - provider_registration_transaction_hash.enc(&mut writer); - confirmed_hash.enc(&mut writer); - socket_address.enc(&mut writer); - operator_public_key.enc(&mut writer); - key_id_voting.enc(&mut writer); - is_valid.enc(&mut writer); - if version >= 2 { - u16::from(mn_type).enc(&mut writer); - if mn_type == MasternodeType::HighPerformance { - platform_http_port.swap_bytes().enc(&mut writer); - platform_node_id.enc(&mut writer); - } - } - UInt256::sha256d(writer) - } - - pub fn confirmed_hash_at(&self, block_height: u32) -> Option { - self.known_confirmed_at_height - .and_then(|h| (h <= block_height) - .then_some(self.confirmed_hash)) - } - - pub fn update_confirmed_hash(&mut self, hash: UInt256) { - self.confirmed_hash = hash; - if !self.provider_registration_transaction_hash.is_zero() { - self.update_confirmed_hash_hashed_with_pro_reg_tx_hash(); - } - } - - pub fn update_confirmed_hash_hashed_with_pro_reg_tx_hash(&mut self) { - let hash = Self::hash_confirmed_hash(self.confirmed_hash, self.provider_registration_transaction_hash); - self.confirmed_hash_hashed_with_provider_registration_transaction_hash = Some(hash) - } - - pub fn confirmed_hash_hashed_with_pro_reg_tx_hash_at( - &self, - block_height: u32, - ) -> Option { - if self.known_confirmed_at_height.is_none() || self.known_confirmed_at_height? <= block_height { - self.confirmed_hash_hashed_with_provider_registration_transaction_hash - } else { - Some(Self::hash_confirmed_hash( - UInt256::default(), - self.provider_registration_transaction_hash, - )) - } - } - - pub fn host(&self) -> String { - format!("{}", self.socket_address) - } - - /*pub fn payload_data(&self) -> UInt256 { - Self::calculate_entry_hash( - self.provider_registration_transaction_hash, - self.confirmed_hash, - self.socket_address, - self.operator_public_key, - self.key_id_voting, - u8::from(self.is_valid), - self.mn_type, - self.platform_http_port, - self.platform_node_id, - ) - }*/ - - pub fn hash_confirmed_hash(confirmed_hash: UInt256, provider_registration_transaction_hash: UInt256) -> UInt256 { - UInt256::sha256(&[provider_registration_transaction_hash.0, confirmed_hash.0].concat()) - } - - pub fn is_valid_at(&self, block_height: u32) -> bool { - if self.previous_validity.is_empty() || block_height == u32::MAX { - return self.is_valid; - } - let mut min_distance = u32::MAX; - let mut is_valid = self.is_valid; - for (&Block { height, .. }, &validity) in &self.previous_validity { - if height <= block_height { - continue; - } - let distance = height - block_height; - if distance < min_distance { - min_distance = distance; - is_valid = validity; - } - } - is_valid - } - - pub fn operator_public_key_at(&self, block_height: u32) -> OperatorPublicKey { - if self.previous_operator_public_keys.is_empty() { - return self.operator_public_key; - } - let mut min_distance = u32::MAX; - let mut used_previous_operator_public_key_at_block_hash = self.operator_public_key; - for (&Block { height, .. }, &key) in &self.previous_operator_public_keys { - if height <= block_height { - continue; - } - let distance = height - block_height; - if distance < min_distance { - min_distance = distance; - log_debug!(target: "masternode-processor", "SME operator public key for proTxHash {:?} : Using {:?} instead of {:?} for list at block height {block_height}", key, used_previous_operator_public_key_at_block_hash, self.provider_registration_transaction_hash); - used_previous_operator_public_key_at_block_hash = key; - } - } - used_previous_operator_public_key_at_block_hash - } - - pub fn entry_hash_at(&self, block_height: u32) -> UInt256 { - if self.previous_entry_hashes.is_empty() || block_height == u32::MAX { - return self.entry_hash; - } - let mut min_distance = u32::MAX; - let mut used_hash = self.entry_hash; - for (&Block { height, .. }, &hash) in &self.previous_entry_hashes { - if height <= block_height { - continue; - } - let distance = height - block_height; - if distance < min_distance { - min_distance = distance; - log_debug!(target: "masternode-processor", "SME Hash for proTxHash {:?} : Using {hash} instead of {used_hash} for list at block height {block_height}", self.provider_registration_transaction_hash); - used_hash = hash; - } - } - used_hash - } - - pub fn unique_id(&self) -> String { - short_hex_string_from(&self.provider_registration_transaction_hash.0) - } - - pub fn update_with_previous_entry(&mut self, entry: &mut MasternodeEntry, block_height: u32, block_hash: UInt256) { - let block = Block::new(block_height, block_hash); - self.previous_validity = entry - .previous_validity - .clone() - .into_iter() - .filter(|(block, _)| block.height < self.update_height) - .collect(); - if entry.is_valid_at(self.update_height) != self.is_valid { - self.previous_validity.insert(block, entry.is_valid); - } - self.previous_operator_public_keys = entry - .previous_operator_public_keys - .clone() - .into_iter() - .filter(|(block, _)| block.height < self.update_height) - .collect(); - if entry.operator_public_key_at(self.update_height) != self.operator_public_key { - self.previous_operator_public_keys.insert(block, entry.operator_public_key); - } - let old_prev_mn_entry_hashes = entry - .previous_entry_hashes - .clone() - .into_iter() - .filter(|(block, _)| block.height < self.update_height) - .collect(); - self.previous_entry_hashes = old_prev_mn_entry_hashes; - if entry.entry_hash_at(self.update_height) != self.entry_hash { - self.previous_entry_hashes.insert(block, entry.entry_hash); - } - } -} diff --git a/dash-spv-masternode-processor/src/models/masternode_list.rs b/dash-spv-masternode-processor/src/models/masternode_list.rs deleted file mode 100644 index e0f21cad..00000000 --- a/dash-spv-masternode-processor/src/models/masternode_list.rs +++ /dev/null @@ -1,248 +0,0 @@ -use std::cmp::min; -use std::collections::BTreeMap; -use logging::*; -use tracing::*; -use crate::chain::common::{ChainType, IHaveChainSettings, LLMQType}; -use crate::common::MasternodeType; -use crate::consensus::Encodable; -use crate::crypto::{byte_util::{Reversable, Zeroable}, UInt256}; -use crate::models::{LLMQEntry, LLMQModifierType, MasternodeEntry}; -use crate::tx::CoinbaseTransaction; -use crate::util::data_ops::merkle_root_from_hashes; - -#[derive(Clone, Ord, PartialOrd, Eq, PartialEq)] -pub struct MasternodeList { - pub block_hash: UInt256, - pub known_height: u32, - pub masternode_merkle_root: Option, - pub llmq_merkle_root: Option, - pub masternodes: BTreeMap, - pub quorums: BTreeMap>, -} - -impl Default for MasternodeList { - fn default() -> Self { - Self { - block_hash: UInt256::MAX, - known_height: 0, - masternode_merkle_root: None, - llmq_merkle_root: None, - masternodes: Default::default(), - quorums: Default::default(), - } - } -} - -impl<'a> std::fmt::Debug for MasternodeList { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("MasternodeList") - .field("block_hash", &self.block_hash) - .field("known_height", &self.known_height) - .field("masternode_merkle_root", &self.masternode_merkle_root.unwrap_or(UInt256::MIN)) - .field("llmq_merkle_root", &self.llmq_merkle_root.unwrap_or(UInt256::MIN)) - .field("masternodes", &self.masternodes) - .field("quorums", &self.quorums) - .finish() - } -} - -impl MasternodeList { - pub fn new( - masternodes: BTreeMap, - quorums: BTreeMap>, - block_hash: UInt256, - block_height: u32, - quorums_active: bool, - ) -> Self { - let mut list = Self { - quorums, - block_hash, - known_height: block_height, - masternode_merkle_root: None, - llmq_merkle_root: None, - masternodes, - }; - if let Some(hashes) = list.hashes_for_merkle_root(block_height) { - //println!("MasternodeList: {}:{}: hashes_for_merkle_root: {:#?} masternodes: {:#?}", block_height, block_hash, hashes, list.masternodes); - list.masternode_merkle_root = merkle_root_from_hashes(hashes); - } - if quorums_active { - let hashes = list.hashes_for_quorum_merkle_root(); - //println!("MasternodeList: {}:{}: hashes_for_quorum_merkle_root: {:#?} quorums: {:#?}", block_height, block_hash, hashes, list.quorums); - list.llmq_merkle_root = merkle_root_from_hashes(hashes); - } - list - } - - pub fn quorums_count(&self) -> u64 { - let mut count: u64 = 0; - for entry in self.quorums.values() { - count += entry.len() as u64; - } - count - } - - pub fn hashes_for_merkle_root(&self, block_height: u32) -> Option> { - (block_height != u32::MAX).then_some({ - let mut pro_tx_hashes = self.reversed_pro_reg_tx_hashes(); - pro_tx_hashes.sort_by(|&s1, &s2| s1.reversed().cmp(&s2.reversed())); - pro_tx_hashes - .iter() - .map(|hash| (&self.masternodes[hash]).entry_hash_at(block_height)) - .collect::>() - }) - } - - fn hashes_for_quorum_merkle_root(&self) -> Vec { - let mut llmq_commitment_hashes = self.quorums - .values() - .flat_map(|q_map| q_map.values().map(|entry| entry.entry_hash)) - .collect::>(); - llmq_commitment_hashes.sort(); - llmq_commitment_hashes - } - - pub fn masternode_for(&self, registration_hash: UInt256) -> Option<&MasternodeEntry> { - self.masternodes.get(®istration_hash) - } - - pub fn has_valid_mn_list_root(&self, tx: &CoinbaseTransaction) -> bool { - // we need to check that the coinbase is in the transaction hashes we got back - // and is in the merkle block - if let Some(mn_merkle_root) = self.masternode_merkle_root { - //println!("has_valid_mn_list_root: {} == {}", tx.merkle_root_mn_list, mn_merkle_root); - tx.merkle_root_mn_list == mn_merkle_root - } else { - false - } - } - - pub fn has_valid_llmq_list_root(&self, tx: &CoinbaseTransaction) -> bool { - let q_merkle_root = self.llmq_merkle_root; - let ct_q_merkle_root = tx.merkle_root_llmq_list; - let has_valid_quorum_list_root = q_merkle_root.is_some() - && ct_q_merkle_root.is_some() - && ct_q_merkle_root.unwrap() == q_merkle_root.unwrap(); - if !has_valid_quorum_list_root { - log_info!(target: "masternode-processor", "LLMQ Merkle root not valid for DML on block {} version {} ({:?} wanted - {:?} calculated)", - tx.height, - tx.base.version, - tx.merkle_root_llmq_list, - self.llmq_merkle_root); - } - has_valid_quorum_list_root - } - - pub fn masternode_score( - entry: &MasternodeEntry, - modifier: UInt256, - block_height: u32, - ) -> Option { - if !entry.is_valid_at(block_height) || - entry.confirmed_hash.is_zero() || - entry.confirmed_hash_at(block_height).is_none() { - return None; - } - let mut buffer: Vec = Vec::new(); - if let Some(hash) = entry.confirmed_hash_hashed_with_pro_reg_tx_hash_at(block_height) { - hash.enc(&mut buffer); - } - modifier.enc(&mut buffer); - let score = UInt256::sha256(&buffer); - (!score.is_zero() && !score.0.is_empty()).then_some(score) - } - - pub fn quorum_entry_for_platform_with_quorum_hash( - &self, - quorum_hash: UInt256, - llmq_type: LLMQType, - ) -> Option<&LLMQEntry> { - self.quorums - .get(&llmq_type)? - .values() - .find(|&entry| entry.llmq_hash == quorum_hash) - } - - pub fn quorum_entry_for_lock_request_id( - &self, - request_id: UInt256, - llmq_type: LLMQType, - ) -> Option<&LLMQEntry> { - let mut first_quorum: Option<&LLMQEntry> = None; - let mut lowest_value = UInt256::MAX; - self.quorums.get(&llmq_type)?.values().for_each(|entry| { - let ordering_hash = entry - .ordering_hash_for_request_id(request_id, llmq_type) - .reverse(); - if lowest_value > ordering_hash { - lowest_value = ordering_hash; - first_quorum = Some(entry); - } - }); - first_quorum - } - pub fn reversed_pro_reg_tx_hashes(&self) -> Vec<&UInt256> { - self.masternodes.keys().collect::>() - } - - pub fn sorted_reversed_pro_reg_tx_hashes(&self) -> Vec<&UInt256> { - let mut hashes = self.reversed_pro_reg_tx_hashes(); - hashes.sort_by(|&s1, &s2| s2.reversed().cmp(&s1.reversed())); - hashes - } - - pub fn has_masternode(&self, provider_registration_transaction_hash: UInt256) -> bool { - self.masternodes.values().any(|node| node.provider_registration_transaction_hash == provider_registration_transaction_hash) - } - - pub fn has_valid_masternode(&self, provider_registration_transaction_hash: UInt256) -> bool { - self.masternodes.values() - .find(|node| node.provider_registration_transaction_hash == provider_registration_transaction_hash) - .map_or(false, |node| node.is_valid) - } -} - -impl MasternodeList { - pub fn score_masternodes_map( - masternodes: BTreeMap, - quorum_modifier: UInt256, - block_height: u32, - hpmn_only: bool, - ) -> BTreeMap { - masternodes - .into_iter() - .filter_map(|(_, entry)| - if !hpmn_only || entry.mn_type == MasternodeType::HighPerformance { - Self::masternode_score(&entry, quorum_modifier, block_height) - .map(|score| (score, entry)) - } else { - None - } - ) - .collect() - } - - pub fn get_masternodes_for_quorum(quorum: &LLMQEntry, chain_type: ChainType, masternodes: BTreeMap, block_height: u32, llmq_modifier: LLMQModifierType) -> Vec { - let llmq_type = quorum.llmq_type; - let hpmn_only = llmq_type == chain_type.platform_type() && !quorum.version.use_bls_legacy(); - let quorum_modifier = llmq_modifier.build_llmq_hash(); - let quorum_count = llmq_type.size(); - let masternodes_in_list_count = masternodes.len(); - let mut score_dictionary = Self::score_masternodes_map(masternodes, quorum_modifier, block_height, hpmn_only); - let mut scores: Vec = score_dictionary.clone().into_keys().collect(); - scores.sort_by(|&s1, &s2| s2.reversed().cmp(&s1.reversed())); - let mut valid_masternodes: Vec = Vec::new(); - let count = min(masternodes_in_list_count, scores.len()); - for score in scores.iter().take(count) { - if let Some(masternode) = score_dictionary.get_mut(score) { - if (*masternode).is_valid_at(block_height) { - valid_masternodes.push((*masternode).clone()); - } - } - if valid_masternodes.len() == quorum_count as usize { - break; - } - } - valid_masternodes - } -} diff --git a/dash-spv-masternode-processor/src/models/mn_list_diff.rs b/dash-spv-masternode-processor/src/models/mn_list_diff.rs deleted file mode 100644 index 0dd1a2df..00000000 --- a/dash-spv-masternode-processor/src/models/mn_list_diff.rs +++ /dev/null @@ -1,160 +0,0 @@ -use byte::BytesExt; -use hashes::hex::ToHex; -use std::collections::{BTreeMap, HashSet}; -use crate::chain::common::LLMQType; -use crate::chain::constants::{CORE_PROTO_20, CORE_PROTO_BLS_BASIC, CORE_PROTO_DIFF_VERSION_ORDER}; -use crate::consensus::encode::VarInt; -use crate::crypto::byte_util::{BytesDecodable, Reversable}; -use crate::crypto::var_array::VarArray; -use crate::crypto::{UInt256, UInt768}; -use crate::models::{LLMQEntry, MasternodeEntry}; -use crate::models::masternode_entry::MasternodeReadContext; -use crate::tx::CoinbaseTransaction; - -#[derive(Clone)] -pub struct MNListDiff { - pub base_block_hash: UInt256, - pub block_hash: UInt256, - pub total_transactions: u32, - pub merkle_hashes: Vec, - pub merkle_flags: Vec, - pub coinbase_transaction: CoinbaseTransaction, - pub deleted_masternode_hashes: Vec, - pub added_or_modified_masternodes: BTreeMap, - pub deleted_quorums: BTreeMap>, - pub added_quorums: Vec, - pub base_block_height: u32, - pub block_height: u32, - // 0: protocol_version < 70225 - // 1: all pubKeyOperator of all CSimplifiedMNListEntry are serialised using legacy BLS scheme - // 2: all pubKeyOperator of all CSimplifiedMNListEntry are serialised using basic BLS scheme - pub version: u16, - - // protocol_version > 70228 - // 19.2 goes with 70228 - // 19.3 goes with 70229? - // 20.0 goes with 70230+ - // clsig, heights - pub quorums_cls_sigs: BTreeMap>, -} - -impl std::fmt::Debug for MNListDiff { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("MNListDiff") - .field("base_block_hash", &self.base_block_hash) - .field("block_hash", &self.block_hash) - .field("total_transactions", &self.total_transactions) - .field("merkle_hashes", &self.merkle_hashes) - .field("merkle_flags", &self.merkle_flags.to_hex()) - .field("merkle_flags_count", &self.merkle_flags.len()) - .field("coinbase_transaction", &self.coinbase_transaction) - .field("deleted_masternode_hashes", &self.deleted_masternode_hashes) - .field("added_or_modified_masternodes", &self.added_or_modified_masternodes) - .field("deleted_quorums", &self.deleted_quorums) - .field("added_quorums", &self.added_quorums) - .field("base_block_height", &self.base_block_height) - .field("block_height", &self.block_height) - .field("version", &self.version) - .field("quorums_cls_sigs", &self.quorums_cls_sigs) - .finish() - } -} - -impl MNListDiff { - pub fn new u32>( - message: &[u8], - offset: &mut usize, - block_height_lookup: F, - protocol_version: u32, - ) -> Option { - let mut version = 1; - if protocol_version >= CORE_PROTO_DIFF_VERSION_ORDER { - version = u16::from_bytes(message, offset)? - } - let base_block_hash = UInt256::from_bytes(message, offset)?; - let block_hash = UInt256::from_bytes(message, offset)?; - let base_block_height = block_height_lookup(base_block_hash); - let block_height = block_height_lookup(block_hash); - let total_transactions = u32::from_bytes(message, offset)?; - let merkle_hashes = VarArray::::from_bytes(message, offset)?; - let merkle_flags_count = VarInt::from_bytes(message, offset)?.0 as usize; - let merkle_flags: &[u8] = match message.read_with(offset, byte::ctx::Bytes::Len(merkle_flags_count)) { - Ok(data) => data, - Err(_err) => { return None; }, - }; - let coinbase_transaction = CoinbaseTransaction::from_bytes(message, offset)?; - if protocol_version >= CORE_PROTO_BLS_BASIC && protocol_version < CORE_PROTO_DIFF_VERSION_ORDER { - // BLS Basic - version = u16::from_bytes(message, offset)? - } - let masternode_read_ctx = MasternodeReadContext(block_height, version, protocol_version); - let deleted_masternode_count = VarInt::from_bytes(message, offset)?.0; - let mut deleted_masternode_hashes: Vec = - Vec::with_capacity(deleted_masternode_count as usize); - for _i in 0..deleted_masternode_count { - deleted_masternode_hashes.push(UInt256::from_bytes(message, offset)?); - } - let added_masternode_count = VarInt::from_bytes(message, offset)?.0; - let added_or_modified_masternodes: BTreeMap = (0..added_masternode_count) - .fold(BTreeMap::new(), |mut acc, _| { - if let Ok(entry) = message.read_with::(offset, masternode_read_ctx) { - acc.insert(entry.provider_registration_transaction_hash.reversed(), entry); - } - acc - }); - - let mut deleted_quorums: BTreeMap> = BTreeMap::new(); - let mut added_quorums = Vec::::new(); - let quorums_active = coinbase_transaction.coinbase_transaction_version >= 2; - if quorums_active { - let deleted_quorums_count = VarInt::from_bytes(message, offset)?.0; - for _i in 0..deleted_quorums_count { - let llmq_type = LLMQType::from_bytes(message, offset)?; - let llmq_hash = UInt256::from_bytes(message, offset)?; - deleted_quorums - .entry(llmq_type) - .or_insert_with(Vec::new) - .push(llmq_hash); - } - let added_quorums_count = VarInt::from_bytes(message, offset)?.0; - for _i in 0..added_quorums_count { - added_quorums.push(LLMQEntry::from_bytes(message, offset)?); - } - } - let mut quorums_cls_sigs = BTreeMap::new(); - if protocol_version >= CORE_PROTO_20 { - let quorums_cl_sigs_count = VarInt::from_bytes(message, offset)?.0; - for _i in 0..quorums_cl_sigs_count { - let signature = UInt768::from_bytes(message, offset)?; - let index_set_length = VarInt::from_bytes(message, offset)?.0 as usize; - let mut index_set = HashSet::with_capacity(index_set_length); - for _i in 0..index_set_length { - index_set.insert(u16::from_bytes(message, offset)?); - } - quorums_cls_sigs.insert(signature, index_set); - } - } - - Some(Self { - base_block_hash, - block_hash, - total_transactions, - merkle_hashes: merkle_hashes.1, - merkle_flags: merkle_flags.to_vec(), - coinbase_transaction, - deleted_masternode_hashes, - added_or_modified_masternodes, - deleted_quorums, - added_quorums, - base_block_height, - block_height, - version, - quorums_cls_sigs - }) - } - - pub fn has_basic_scheme_keys(&self) -> bool { - self.added_or_modified_masternodes.values().any(|m| m.operator_public_key.version == 2) - } - -} diff --git a/dash-spv-masternode-processor/src/models/mod.rs b/dash-spv-masternode-processor/src/models/mod.rs index 0e7fd21a..cd58251d 100644 --- a/dash-spv-masternode-processor/src/models/mod.rs +++ b/dash-spv-masternode-processor/src/models/mod.rs @@ -1,22 +1,19 @@ -use byte::{BytesExt, LE}; -use crate::crypto::byte_util::BytesDecodable; -use crate::impl_bytes_decodable; +// pub mod llmq; +// pub mod llmq_indexed_hash; +// pub mod llmq_typed_hash; +// pub mod masternode_entry; +// pub mod masternode_list; +// pub mod mn_list_diff; +// pub mod snapshot; +// pub mod qr_info; +pub mod sync_state; +// +// pub use self::llmq::LLMQVerificationContext; +// pub use self::llmq_indexed_hash::LLMQIndexedHash; +// pub use self::llmq_typed_hash::LLMQTypedHash; +// pub use self::masternode_entry::MasternodeEntry; +// pub use self::masternode_list::MasternodeList; +// pub use self::mn_list_diff::MNListDiff; +// pub use self::snapshot::LLMQSnapshot; +// pub use self::qr_info::QRInfo; -pub mod llmq_entry; -pub mod llmq_typed_hash; -pub mod masternode_entry; -pub mod masternode_list; -pub mod mn_list_diff; -pub mod operator_public_key; -pub mod snapshot; - -pub use self::llmq_entry::{LLMQEntry, LLMQModifierType, LLMQVerificationContext}; -pub use self::llmq_typed_hash::LLMQIndexedHash; -pub use self::llmq_typed_hash::LLMQTypedHash; -pub use self::masternode_entry::MasternodeEntry; -pub use self::masternode_list::MasternodeList; -pub use self::mn_list_diff::MNListDiff; -pub use self::operator_public_key::OperatorPublicKey; -pub use self::snapshot::LLMQSnapshot; - -impl_bytes_decodable!(LLMQEntry); diff --git a/dash-spv-masternode-processor/src/models/operator_public_key.rs b/dash-spv-masternode-processor/src/models/operator_public_key.rs deleted file mode 100644 index 6e45e928..00000000 --- a/dash-spv-masternode-processor/src/models/operator_public_key.rs +++ /dev/null @@ -1,53 +0,0 @@ -use std::io; -use bls_signatures::G1Element; -use byte::{BytesExt, TryRead}; -use crate::consensus::Encodable; -use crate::crypto::UInt384; -use crate::keys::BLSKey; - -#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq)] -pub struct OperatorPublicKey { - pub data: UInt384, - pub version: u16, -} - -impl OperatorPublicKey { - pub fn is_basic(&self) -> bool { - self.version >= 2 - } - pub fn is_legacy(&self) -> bool { - self.version < 2 - } -} - -impl Encodable for OperatorPublicKey { - #[inline] - fn consensus_encode(&self, mut s: S) -> Result { - self.data.enc(&mut s); - Ok(48) - } -} - -// Ctx: (version, protocol_version) -impl<'a> TryRead<'a, (u16, u32)> for OperatorPublicKey { - fn try_read(bytes: &'a [u8], (version, protocol_version): (u16, u32)) -> byte::Result<(Self, usize)> { - let data = bytes.read_with::(&mut 0, byte::LE)?; - Ok((OperatorPublicKey { data, version }, 48)) - } -} - -impl From for Option { - fn from(value: OperatorPublicKey) -> Self { - if value.is_legacy() { - G1Element::from_bytes_legacy(&value.data.0) - } else { - G1Element::from_bytes(&value.data.0) - }.ok() - } -} - -impl From for OperatorPublicKey { - fn from(key: BLSKey) -> Self { - OperatorPublicKey { data: key.public_key_uint(), version: key.bls_version() } - } -} diff --git a/dash-spv-masternode-processor/src/models/rotation_info.rs b/dash-spv-masternode-processor/src/models/rotation_info.rs deleted file mode 100644 index d523a296..00000000 --- a/dash-spv-masternode-processor/src/models/rotation_info.rs +++ /dev/null @@ -1,19 +0,0 @@ -use crate::models::{LLMQEntry, LLMQSnapshot, MNListDiff}; - -#[derive(Debug)] -pub struct LLMQRotationInfo { - pub snapshot_at_h_c: LLMQSnapshot, - pub snapshot_at_h_2c: LLMQSnapshot, - pub snapshot_at_h_3c: LLMQSnapshot, - pub snapshot_at_h_4c: Option, // exist only if extra_share is true - pub mn_list_diff_tip: MNListDiff, - pub mn_list_diff_at_h: MNListDiff, - pub mn_list_diff_at_h_c: MNListDiff, - pub mn_list_diff_at_h_2c: MNListDiff, - pub mn_list_diff_at_h_3c: MNListDiff, - pub mn_list_diff_at_h_4c: Option, // exist only if extra_share is true - pub extra_share: bool, - pub last_quorum_per_index: Vec, - pub quorum_snapshot_list: Vec, - pub mn_list_diff_list: Vec, -} diff --git a/dash-spv-masternode-processor/src/models/snapshot.rs b/dash-spv-masternode-processor/src/models/snapshot.rs deleted file mode 100644 index 505d58d3..00000000 --- a/dash-spv-masternode-processor/src/models/snapshot.rs +++ /dev/null @@ -1,165 +0,0 @@ -use byte::ctx::{Bytes, Endian}; -use byte::{BytesExt, TryRead, LE}; -use hashes::hex::ToHex; -#[cfg(feature = "generate-dashj-tests")] -use serde::{Serialize, Serializer}; -#[cfg(feature = "generate-dashj-tests")] -use serde::ser::SerializeStruct; -use crate::common::LLMQSnapshotSkipMode; -use crate::consensus::encode::VarInt; -use crate::crypto::{byte_util::BytesDecodable, data_ops::Data}; -use crate::impl_bytes_decodable; -use crate::models::MasternodeEntry; - -#[derive(Clone)] -pub struct LLMQSnapshot { - // The bitset of nodes already in quarters at the start of cycle at height n - // (masternodeListSize + 7)/8 - pub member_list: Vec, - // Skiplist at height n - pub skip_list: Vec, - // Mode of the skip list - pub skip_list_mode: LLMQSnapshotSkipMode, -} -impl Default for LLMQSnapshot { - fn default() -> Self { - Self { - member_list: vec![], - skip_list: vec![], - skip_list_mode: LLMQSnapshotSkipMode::NoSkipping, - } - } -} - -#[cfg(feature = "generate-dashj-tests")] -impl Serialize for LLMQSnapshot { - fn serialize(&self, serializer: S) -> Result where S: Serializer { - let mut state = serializer.serialize_struct("LLMQSnapshot", 3)?; - let len = self.member_list.len() * 8 - 7; - let members = (0..len).map(|i| self.member_is_true_at_index(i as u32)).collect::>(); - state.serialize_field("member_list", &members)?; - state.serialize_field("skip_list", &self.skip_list)?; - state.serialize_field("skip_list_mode", &self.skip_list_mode)?; - state.end() - - } -} - -impl<'a> std::fmt::Debug for LLMQSnapshot { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("LLMQSnapshot") - .field("member_list", &self.member_list.to_hex()) - .field("skip_list", &self.skip_list.iter()) - .field("skip_list_mode", &self.skip_list_mode) - .finish() - } -} -impl<'a> TryRead<'a, Endian> for LLMQSnapshot { - fn try_read(bytes: &'a [u8], _endian: Endian) -> byte::Result<(Self, usize)> { - let offset = &mut 0; - let skip_list_mode = bytes.read_with::(offset, LE)?; - let member_list_length = bytes.read_with::(offset, LE)?.0 as usize; - let member_list: &[u8] = - bytes.read_with(offset, Bytes::Len((member_list_length + 7) / 8))?; - let skip_list_length = bytes.read_with::(offset, LE)?.0 as usize; - let mut skip_list = Vec::with_capacity(skip_list_length); - for _i in 0..skip_list_length { - skip_list.push(bytes.read_with::(offset, LE)?); - } - let snapshot = Self { - member_list: member_list.to_vec(), - skip_list, - skip_list_mode, - }; - Ok((snapshot, *offset)) - } -} - -impl LLMQSnapshot { - - pub fn new(member_list: Vec, skip_list: Vec, skip_list_mode: LLMQSnapshotSkipMode) -> Self { - LLMQSnapshot { - member_list, - skip_list, - skip_list_mode - } - } - - pub fn length(&self) -> usize { - self.member_list.len() + 1 + 2 + self.skip_list.len() * 2 - } - - pub fn member_is_true_at_index(&self, i: u32) -> bool { - self.member_list.as_slice().bit_is_true_at_le_index(i) - } - - pub fn apply_skip_strategy( - &self, - sorted_combined_mns_list: Vec, - quorum_count: usize, - quarter_size: usize, - ) -> Vec> { - let mut quarter_quorum_members = vec![Vec::::new(); quorum_count]; - match self.skip_list_mode { - LLMQSnapshotSkipMode::NoSkipping => { - let mut iter = sorted_combined_mns_list.iter(); - (0..quorum_count).for_each(|i| { - let mut quarter = Vec::::new(); - while quarter.len() < quarter_size { - if let Some(node) = iter.next() { - quarter.push(node.clone()); - } else { - iter = sorted_combined_mns_list.iter(); - } - } - quarter_quorum_members[i] = quarter; - }); - } - LLMQSnapshotSkipMode::SkipFirst => { - let mut first_entry_index = 0; - let mut processed_skip_list = Vec::::new(); - for &s in &self.skip_list { - if first_entry_index == 0 { - first_entry_index = s; - processed_skip_list.push(s); - } else { - processed_skip_list.push(first_entry_index + s); - } - } - let mut idx = 0; - let mut idxk = 0; - for i in 0..quorum_count { - while quarter_quorum_members[i].len() < quarter_size { - if idxk != processed_skip_list.len() && idx == processed_skip_list[idxk] { - idxk += 1; - } else { - quarter_quorum_members[i].push(sorted_combined_mns_list[idx as usize].clone()); - } - idx += 1; - if idx == sorted_combined_mns_list.len() as i32 { - idx = 0; - } - } - } - } - LLMQSnapshotSkipMode::SkipExcept => { - (0..quorum_count).for_each(|i| { - let mut quarter = Vec::::new(); - self.skip_list.iter().for_each(|unskipped| { - if let Some(node) = sorted_combined_mns_list.get(*unskipped as usize) { - if quarter.len() < quarter_size { - quarter.push(node.clone()); - } - } - }); - quarter_quorum_members[i] = quarter; - }); - } - LLMQSnapshotSkipMode::SkipAll => { - // TODO: do we need to impl smth in this strategy ? - } - } - quarter_quorum_members - } -} -impl_bytes_decodable!(LLMQSnapshot); diff --git a/dash-spv-masternode-processor/src/models/sync_state.rs b/dash-spv-masternode-processor/src/models/sync_state.rs new file mode 100644 index 00000000..7bc9f71d --- /dev/null +++ b/dash-spv-masternode-processor/src/models/sync_state.rs @@ -0,0 +1,25 @@ + +#[ferment_macro::export] +pub enum CacheState { + QueueChanged { + count: usize, + max_amount: usize, + }, + StoreChanged { + count: usize, + last_block_height: u32 + }, + StubCount { + count: usize + }, + +} + +impl CacheState { + pub fn queue(count: usize, max_amount: usize) -> Self { + Self::QueueChanged { count, max_amount } + } + pub fn store(count: usize, last_block_height: u32) -> Self { + Self::StoreChanged { count, last_block_height } + } +} \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/network/constants.rs b/dash-spv-masternode-processor/src/network/constants.rs deleted file mode 100644 index 7c4f5556..00000000 --- a/dash-spv-masternode-processor/src/network/constants.rs +++ /dev/null @@ -1,385 +0,0 @@ -// Rust Bitcoin Library -// Written in 2014 by -// Andrew Poelstra -// -// To the extent possible under law, the author(s) have dedicated all -// copyright and related and neighboring rights to this software to -// the public domain worldwide. This software is distributed without -// any warranty. -// -// You should have received a copy of the CC0 Public Domain Dedication -// along with this software. -// If not, see . -// - -//! Network constants -//! -//! This module provides various constants relating to the Bitcoin network -//! protocol, such as protocol versioning and magic header bytes. -//! -//! The [`Network`][1] type implements the [`Decodable`][2] and -//! [`Encodable`][3] traits and encodes the magic bytes of the given -//! network -//! -//! [1]: enum.Network.html -//! [2]: ../../consensus/encode/trait.Decodable.html -//! [3]: ../../consensus/encode/trait.Encodable.html -//! -//! # Example: encoding a network's magic bytes -//! -//! ```rust -//! use dash_spv_masternode_processor::consensus::encode::serialize; -//! use dash_spv_masternode_processor::chain::common::ChainType; -//! -//! let network = ChainType::MainNet; -//! let bytes = serialize(&network.magic()); -//! -//! assert_eq!(&bytes[..], &[191, 12, 107, 189]); -//! ``` - -use core::{fmt, ops, convert::From}; -use crate::consensus::encode::{self, Decodable, Encodable}; - -// Version of the protocol as appearing in network message headers -// This constant is used to signal to other peers which features you support. -// Increasing it implies that your software also supports every feature prior to this version. -// Doing so without support may lead to you incorrectly banning other peers or other peers banning you. -// These are the features required for each version: -// 70016 - Support receiving `wtxidrelay` message between `version` and `verack` message -// 70015 - Support receiving invalid compact blocks from a peer without banning them -// 70014 - Support compact block messages `sendcmpct`, `cmpctblock`, `getblocktxn` and `blocktxn` -// 70013 - Support `feefilter` message -// 70012 - Support `sendheaders` message and announce new blocks via headers rather than inv -// 70011 - Support NODE_BLOOM service flag and don't support bloom filter messages if it is not set -// 70002 - Support `reject` message -// 70001 - Support bloom filter messages `filterload`, `filterclear` `filteradd`, `merkleblock` and FILTERED_BLOCK inventory type -// 60002 - Support `mempool` message -// 60001 - Support `pong` message and nonce in `ping` message -//pub const PROTOCOL_VERSION: u32 = 70001; - -user_enum! { - /// The cryptocurrency to act on - #[derive(Copy, PartialEq, Eq, PartialOrd, Ord, Clone, Hash, Debug)] - pub enum Network { - /// Classic Bitcoin - Bitcoin <-> "bitcoin", - /// Bitcoin's testnet - Testnet <-> "testnet", - /// Bitcoin's signet - Signet <-> "signet", - /// Bitcoin's regtest - Regtest <-> "regtest" - } -} - -impl Network { - /// Creates a `Network` from the magic bytes. - /// - /// # Examples - /// - /// ```rust - /// use dash_spv_masternode_processor::chain::common::ChainType; - /// - /// let network = ChainType::from_magic(0xbd6b0cbf); - /// assert_eq!(network, Some(ChainType::MainNet)); - /// ``` - pub fn from_magic(magic: u32) -> Option { - // Note: any new entries here must be added to `magic` below - match magic { - 0xD9B4BEF9 => Some(Network::Bitcoin), - 0x0709110B => Some(Network::Testnet), - 0x40CF030A => Some(Network::Signet), - 0xDAB5BFFA => Some(Network::Regtest), - _ => None - } - } - - /// Return the network magic bytes, which should be encoded little-endian - /// at the start of every message - /// - /// # Examples - /// - /// ```rust - /// use dash_spv_masternode_processor::chain::common::ChainType; - /// - /// let network = ChainType::MainNet; - /// assert_eq!(network.magic(), 0xbd6b0cbf); - /// ``` - pub fn magic(self) -> u32 { - // Note: any new entries here must be added to `from_magic` above - match self { - Network::Bitcoin => 0xD9B4BEF9, - Network::Testnet => 0x0709110B, - Network::Signet => 0x40CF030A, - Network::Regtest => 0xDAB5BFFA, - } - } -} - -/// Flags to indicate which network services a node supports. -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct ServiceFlags(u64); - -impl ServiceFlags { - /// NONE means no services supported. - pub const NONE: ServiceFlags = ServiceFlags(0); - - /// NETWORK means that the node is capable of serving the complete block chain. It is currently - /// set by all Bitcoin Core non pruned nodes, and is unset by SPV clients or other light - /// clients. - pub const NETWORK: ServiceFlags = ServiceFlags(1 << 0); - - /// GETUTXO means the node is capable of responding to the getutxo protocol request. Bitcoin - /// Core does not support this but a patch set called Bitcoin XT does. - /// See BIP 64 for details on how this is implemented. - pub const GETUTXO: ServiceFlags = ServiceFlags(1 << 1); - - /// BLOOM means the node is capable and willing to handle bloom-filtered connections. Bitcoin - /// Core nodes used to support this by default, without advertising this bit, but no longer do - /// as of protocol version 70011 (= NO_BLOOM_VERSION) - pub const BLOOM: ServiceFlags = ServiceFlags(1 << 2); - - /// WITNESS indicates that a node can be asked for blocks and transactions including witness - /// data. - pub const WITNESS: ServiceFlags = ServiceFlags(1 << 3); - - /// COMPACT_FILTERS means the node will service basic block filter requests. - /// See BIP157 and BIP158 for details on how this is implemented. - pub const COMPACT_FILTERS: ServiceFlags = ServiceFlags(1 << 6); - - /// NETWORK_LIMITED means the same as NODE_NETWORK with the limitation of only serving the last - /// 288 (2 day) blocks. - /// See BIP159 for details on how this is implemented. - pub const NETWORK_LIMITED: ServiceFlags = ServiceFlags(1 << 10); - - // NOTE: When adding new flags, remember to update the Display impl accordingly. - - /// Add [ServiceFlags] together. - /// - /// Returns itself. - pub fn add(&mut self, other: ServiceFlags) -> ServiceFlags { - self.0 |= other.0; - *self - } - - /// Remove [ServiceFlags] from this. - /// - /// Returns itself. - pub fn remove(&mut self, other: ServiceFlags) -> ServiceFlags { - self.0 ^= other.0; - *self - } - - /// Check whether [ServiceFlags] are included in this one. - pub fn has(self, flags: ServiceFlags) -> bool { - (self.0 | flags.0) == self.0 - } - - /// Get the integer representation of this [ServiceFlags]. - pub fn as_u64(self) -> u64 { - self.0 - } -} - -impl fmt::LowerHex for ServiceFlags { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - fmt::LowerHex::fmt(&self.0, f) - } -} - -impl fmt::UpperHex for ServiceFlags { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - fmt::UpperHex::fmt(&self.0, f) - } -} - -impl fmt::Display for ServiceFlags { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let mut flags = *self; - if flags == ServiceFlags::NONE { - return write!(f, "ServiceFlags(NONE)"); - } - let mut first = true; - macro_rules! write_flag { - ($f:ident) => { - if flags.has(ServiceFlags::$f) { - if !first { - write!(f, "|")?; - } - first = false; - write!(f, stringify!($f))?; - flags.remove(ServiceFlags::$f); - } - } - } - write!(f, "ServiceFlags(")?; - write_flag!(NETWORK); - write_flag!(GETUTXO); - write_flag!(BLOOM); - write_flag!(WITNESS); - write_flag!(COMPACT_FILTERS); - write_flag!(NETWORK_LIMITED); - // If there are unknown flags left, we append them in hex. - if flags != ServiceFlags::NONE { - if !first { - write!(f, "|")?; - } - write!(f, "0x{:x}", flags)?; - } - write!(f, ")") - } -} - -impl From for ServiceFlags { - fn from(f: u64) -> Self { - ServiceFlags(f) - } -} - -impl From for u64 { - fn from(flags: ServiceFlags) -> Self { - flags.0 - } -} - -impl ops::BitOr for ServiceFlags { - type Output = Self; - - fn bitor(mut self, rhs: Self) -> Self { - self.add(rhs) - } -} - -impl ops::BitOrAssign for ServiceFlags { - fn bitor_assign(&mut self, rhs: Self) { - self.add(rhs); - } -} - -impl ops::BitXor for ServiceFlags { - type Output = Self; - - fn bitxor(mut self, rhs: Self) -> Self { - self.remove(rhs) - } -} - -impl ops::BitXorAssign for ServiceFlags { - fn bitxor_assign(&mut self, rhs: Self) { - self.remove(rhs); - } -} - -impl Encodable for ServiceFlags { - #[inline] - fn consensus_encode( - &self, - mut s: S, - ) -> Result { - self.0.consensus_encode(&mut s) - } -} - -impl Decodable for ServiceFlags { - #[inline] - fn consensus_decode(mut d: D) -> Result { - Ok(ServiceFlags(Decodable::consensus_decode(&mut d)?)) - } -} - -#[cfg(test)] -mod tests { - use super::{Network, ServiceFlags}; - use crate::consensus::encode::{deserialize, serialize}; - - #[test] - fn serialize_test() { - assert_eq!( - serialize(&Network::Bitcoin.magic()), - &[0xf9, 0xbe, 0xb4, 0xd9] - ); - assert_eq!( - serialize(&Network::Testnet.magic()), - &[0x0b, 0x11, 0x09, 0x07] - ); - assert_eq!( - serialize(&Network::Signet.magic()), - &[0x0a, 0x03, 0xcf, 0x40] - ); - assert_eq!( - serialize(&Network::Regtest.magic()), - &[0xfa, 0xbf, 0xb5, 0xda] - ); - - assert_eq!( - deserialize(&[0xf9, 0xbe, 0xb4, 0xd9]).ok(), - Some(Network::Bitcoin.magic()) - ); - assert_eq!( - deserialize(&[0x0b, 0x11, 0x09, 0x07]).ok(), - Some(Network::Testnet.magic()) - ); - assert_eq!( - deserialize(&[0x0a, 0x03, 0xcf, 0x40]).ok(), - Some(Network::Signet.magic()) - ); - assert_eq!( - deserialize(&[0xfa, 0xbf, 0xb5, 0xda]).ok(), - Some(Network::Regtest.magic()) - ); - } - - #[test] - fn string_test() { - assert_eq!(Network::Bitcoin.to_string(), "bitcoin"); - assert_eq!(Network::Testnet.to_string(), "testnet"); - assert_eq!(Network::Regtest.to_string(), "regtest"); - assert_eq!(Network::Signet.to_string(), "signet"); - - assert_eq!("bitcoin".parse::().unwrap(), Network::Bitcoin); - assert_eq!("testnet".parse::().unwrap(), Network::Testnet); - assert_eq!("regtest".parse::().unwrap(), Network::Regtest); - assert_eq!("signet".parse::().unwrap(), Network::Signet); - assert!("fakenet".parse::().is_err()); - } - - #[test] - fn service_flags_test() { - let all = [ - ServiceFlags::NETWORK, - ServiceFlags::GETUTXO, - ServiceFlags::BLOOM, - ServiceFlags::WITNESS, - ServiceFlags::COMPACT_FILTERS, - ServiceFlags::NETWORK_LIMITED, - ]; - - let mut flags = ServiceFlags::NONE; - for f in all.iter() { - assert!(!flags.has(*f)); - } - - flags |= ServiceFlags::WITNESS; - assert_eq!(flags, ServiceFlags::WITNESS); - - let mut flags2 = flags | ServiceFlags::GETUTXO; - for f in all.iter() { - assert_eq!(flags2.has(*f), *f == ServiceFlags::WITNESS || *f == ServiceFlags::GETUTXO); - } - - flags2 ^= ServiceFlags::WITNESS; - assert_eq!(flags2, ServiceFlags::GETUTXO); - - flags2 |= ServiceFlags::COMPACT_FILTERS; - flags2 ^= ServiceFlags::GETUTXO; - assert_eq!(flags2, ServiceFlags::COMPACT_FILTERS); - - // Test formatting. - assert_eq!("ServiceFlags(NONE)", ServiceFlags::NONE.to_string()); - assert_eq!("ServiceFlags(WITNESS)", ServiceFlags::WITNESS.to_string()); - let flag = ServiceFlags::WITNESS | ServiceFlags::BLOOM | ServiceFlags::NETWORK; - assert_eq!("ServiceFlags(NETWORK|BLOOM|WITNESS)", flag.to_string()); - let flag = ServiceFlags::WITNESS | 0xf0.into(); - assert_eq!("ServiceFlags(WITNESS|COMPACT_FILTERS|0xb0)", flag.to_string()); - } -} \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/network/mod.rs b/dash-spv-masternode-processor/src/network/mod.rs deleted file mode 100644 index 987b09fc..00000000 --- a/dash-spv-masternode-processor/src/network/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod constants; \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/processing/core_provider.rs b/dash-spv-masternode-processor/src/processing/core_provider.rs new file mode 100644 index 00000000..aa0bee1a --- /dev/null +++ b/dash-spv-masternode-processor/src/processing/core_provider.rs @@ -0,0 +1,53 @@ +use dashcore::bls_sig_utils::BLSSignature; +use dashcore::secp256k1::hashes::hex::DisplayHex; +use dashcore::sml::masternode_list_entry::qualified_masternode_list_entry::QualifiedMasternodeListEntry; +use dash_spv_crypto::network::ChainType; +use crate::models::sync_state::CacheState; + +#[ferment_macro::opaque] +pub trait CoreProvider: std::fmt::Debug + Send + Sync { + fn chain_type(&self) -> ChainType; + fn lookup_cl_signature_by_block_hash(&self, block_hash: [u8; 32]) -> Result; + fn lookup_block_hash_by_height(&self, block_height: u32) -> Option<[u8; 32]>; + fn lookup_block_height_by_hash(&self, block_hash: [u8; 32]) -> u32; + // fn lookup_block_by_height_or_last_terminal(&self, block_height: u32) -> Result; + fn update_address_usage_of_masternodes(&self, masternodes: Vec); + fn issue_with_masternode_list_from_peer(&self, is_dip24: bool, peer: *const std::os::raw::c_void); + fn notify_sync_state(&self, state: CacheState); +} + +#[derive(Clone, Debug, Eq, PartialEq)] +#[ferment_macro::export] +pub enum CoreProviderError { + NullResult(String), + BadBlockHash([u8; 32]), + UnknownBlockHeightForHash([u8; 32]), + BlockHashNotFoundAt(u32), + NoSnapshot([u8; 32]), + HexError(dashcore::hashes::hex::Error), + MissedMasternodeListAt([u8; 32]), +} +impl std::fmt::Display for CoreProviderError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", match self { + CoreProviderError::NullResult(message) => + format!("CoreProviderError::NullResult({message})"), + CoreProviderError::BadBlockHash(h) => + format!("CoreProviderError::BadBlockHash({})", h.to_lower_hex_string()), + CoreProviderError::UnknownBlockHeightForHash(h) => + format!("CoreProviderError::UnknownBlockHeightForHash({})", h.to_lower_hex_string()), + CoreProviderError::BlockHashNotFoundAt(h) => + format!("CoreProviderError::BlockHashNotFound({h})"), + CoreProviderError::HexError(err) => + format!("CoreProviderError::HexError({err})"), + CoreProviderError::NoSnapshot(block_hash) => + format!("CoreProviderError::NoSnapshot({})", block_hash.to_lower_hex_string()), + CoreProviderError::MissedMasternodeListAt(block_hash) => + format!("CoreProviderError::MissedMasternodeListAt({})", block_hash.to_lower_hex_string()), + }) + } +} + +impl std::error::Error for CoreProviderError {} + + diff --git a/dash-spv-masternode-processor/src/processing/keys_cache.rs b/dash-spv-masternode-processor/src/processing/keys_cache.rs index 914cf585..24241d6c 100644 --- a/dash-spv-masternode-processor/src/processing/keys_cache.rs +++ b/dash-spv-masternode-processor/src/processing/keys_cache.rs @@ -1,5 +1,5 @@ use std::collections::HashMap; -use crate::keys::{BLSKey, ECDSAKey, ED25519Key}; +use dash_spv_crypto::keys::{BLSKey, ECDSAKey, ED25519Key}; #[derive(Clone, Default)] pub struct KeysCache { diff --git a/dash-spv-masternode-processor/src/processing/llmq_validation_status.rs b/dash-spv-masternode-processor/src/processing/llmq_validation_status.rs deleted file mode 100644 index 5979c14c..00000000 --- a/dash-spv-masternode-processor/src/processing/llmq_validation_status.rs +++ /dev/null @@ -1,38 +0,0 @@ -#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Hash, Ord)] -pub enum LLMQValidationStatus { - Verified, - InvalidPayload(LLMQPayloadValidationStatus), - InvalidAggregatedSignature, - InvalidQuorumSignature, - NoMasternodeList -} - -impl LLMQValidationStatus { - pub fn is_not_critical(&self) -> bool { - match self { - Self::Verified | Self::NoMasternodeList => true, - _ => false - } - } -} - -#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Hash, Ord)] -pub enum LLMQPayloadValidationStatus { - Ok, - InvalidSigners(String), - InvalidMembers(String), - SignersBelowThreshold { - actual: u64, - threshold: u64, - }, - MembersBelowThreshold { - actual: u64, - threshold: u64, - }, -} - -impl LLMQPayloadValidationStatus { - pub fn is_ok(&self) -> bool { - *self == Self::Ok - } -} diff --git a/dash-spv-masternode-processor/src/processing/mn_listdiff_result.rs b/dash-spv-masternode-processor/src/processing/mn_listdiff_result.rs deleted file mode 100644 index c4eee49e..00000000 --- a/dash-spv-masternode-processor/src/processing/mn_listdiff_result.rs +++ /dev/null @@ -1,119 +0,0 @@ -use std::collections::BTreeMap; -use crate::{models, types}; -use crate::crypto::{UInt256, UInt768}; -use crate::ffi::boxer::{boxed, boxed_vec}; -use crate::ffi::to::{encode_masternodes_map, ToFFI}; -use crate::processing::ProcessingError; - -pub struct MNListDiffResult { - pub error_status: ProcessingError, - pub base_block_hash: UInt256, - pub block_hash: UInt256, - pub has_found_coinbase: bool, //1 byte - pub has_valid_coinbase: bool, //1 byte - pub has_valid_mn_list_root: bool, //1 byte - pub has_valid_llmq_list_root: bool, //1 byte - pub has_valid_quorums: bool, //1 byte - pub masternode_list: models::MasternodeList, - pub added_masternodes: BTreeMap, - pub modified_masternodes: BTreeMap, - pub added_quorums: Vec, - pub needed_masternode_lists: Vec, - pub cl_signatures: BTreeMap, -} - -impl std::fmt::Debug for MNListDiffResult { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("MNListDiffResult") - .field("error_status", &self.error_status) - .field("base_block_hash", &self.base_block_hash) - .field("block_hash", &self.block_hash) - .field( - "validation", - &format!( - "{}{}{}{}{}", - u8::from(self.has_found_coinbase), - u8::from(self.has_valid_coinbase), - u8::from(self.has_valid_mn_list_root), - u8::from(self.has_valid_llmq_list_root), - u8::from(self.has_valid_quorums) - ), - ) - .field("masternode_list", &self.masternode_list) - .field("added_masternodes", &self.added_masternodes) - .field("modified_masternodes", &self.modified_masternodes) - .field("added_quorums", &self.added_quorums) - .field("needed_masternode_lists", &self.needed_masternode_lists) - .finish() - } -} - -impl Default for MNListDiffResult { - fn default() -> Self { - Self { - error_status: ProcessingError::None, - base_block_hash: UInt256::MIN, - block_hash: UInt256::MAX, - has_found_coinbase: false, - has_valid_coinbase: false, - has_valid_mn_list_root: false, - has_valid_llmq_list_root: false, - has_valid_quorums: false, - masternode_list: Default::default(), - added_masternodes: Default::default(), - modified_masternodes: Default::default(), - added_quorums: vec![], - needed_masternode_lists: vec![], - cl_signatures: Default::default() - } - } -} - -impl MNListDiffResult { - pub fn default_with_error(error: ProcessingError) -> Self { - Self {error_status: error, ..Default::default()} - } -} - -impl MNListDiffResult { - pub fn encode(&self) -> types::MNListDiffResult { - types::MNListDiffResult { - error_status: self.error_status.into(), - base_block_hash: boxed(self.base_block_hash.0), - block_hash: boxed(self.block_hash.0), - has_found_coinbase: self.has_found_coinbase, - has_valid_coinbase: self.has_valid_coinbase, - has_valid_mn_list_root: self.has_valid_mn_list_root, - has_valid_llmq_list_root: self.has_valid_llmq_list_root, - has_valid_quorums: self.has_valid_quorums, - masternode_list: boxed(self.masternode_list.encode()), - added_masternodes: encode_masternodes_map(&self.added_masternodes), - added_masternodes_count: self.added_masternodes.len(), - modified_masternodes: encode_masternodes_map(&self.modified_masternodes), - modified_masternodes_count: self.modified_masternodes.len(), - added_quorums_count: self.added_quorums.len(), - added_quorums: boxed_vec(self.added_quorums - .iter() - .map(|quorum| boxed(quorum.encode())) - .collect()), - needed_masternode_lists: boxed_vec( - self.needed_masternode_lists - .iter() - .map(|h| boxed(h.0)) - .collect(), - ), - needed_masternode_lists_count: self.needed_masternode_lists.len(), - quorums_cl_sigs_count: self.cl_signatures.len(), - quorums_cl_signatures_hashes: boxed_vec( - self.cl_signatures - .keys() - .map(|h| boxed(h.0)) - .collect()), - quorums_cl_signatures: boxed_vec( - self.cl_signatures - .values() - .map(|h| boxed(h.0)) - .collect()) - } - } -} diff --git a/dash-spv-masternode-processor/src/processing/mod.rs b/dash-spv-masternode-processor/src/processing/mod.rs index 6afa1348..ccda6581 100644 --- a/dash-spv-masternode-processor/src/processing/mod.rs +++ b/dash-spv-masternode-processor/src/processing/mod.rs @@ -1,14 +1,127 @@ -pub mod mn_listdiff_result; -pub mod processing_error; pub mod processor; -pub mod processor_cache; -pub mod qr_info_result; pub mod keys_cache; -pub mod llmq_validation_status; +pub mod core_provider; -pub use self::llmq_validation_status::LLMQValidationStatus; -pub use self::mn_listdiff_result::MNListDiffResult; -pub use self::processing_error::ProcessingError; +use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4}; +use dashcore::consensus::{deserialize, serialize}; +use dashcore::blockdata::transaction::OutPoint; +use dashcore::ephemerealdata::{chain_lock::ChainLock, instant_lock::InstantLock}; +use dashcore::bls_sig_utils::BLSPublicKey; +use dashcore::hashes::Hash; +use dashcore::hash_types::PubkeyHash; +use dashcore::sml::masternode_list::MasternodeList; +use dash_spv_crypto::network::ChainType; +use dash_spv_crypto::util::{from_hash160_for_script_map, with_public_key_data}; +pub use self::core_provider::{CoreProvider, CoreProviderError}; pub use self::processor::MasternodeProcessor; -pub use self::processor_cache::MasternodeProcessorCache; -pub use self::qr_info_result::QRInfoResult; + + + +#[ferment_macro::export] +pub fn instant_lock_from_message(message: &[u8]) -> Option { + deserialize(message).ok() +} +#[ferment_macro::export] +pub fn instant_lock_to_message(lock: &InstantLock) -> Vec { + serialize(lock) +} +#[ferment_macro::export] +pub fn instant_lock_signature(lock: &InstantLock) -> [u8; 96] { + lock.signature.to_bytes() +} +#[ferment_macro::export] +pub fn instant_lock_cycle_hash(lock: &InstantLock) -> [u8; 32] { + lock.cyclehash.to_byte_array() +} + +#[ferment_macro::export] +pub fn instant_lock_tx_hash(lock: &InstantLock) -> [u8; 32] { + lock.txid.to_byte_array() +} +#[ferment_macro::export] +pub fn instant_lock_outpoints(lock: &InstantLock) -> Vec { + lock.inputs.to_vec() +} +#[ferment_macro::export] +pub fn instant_lock_outpoint_at_index(lock: &InstantLock, index: usize) -> Option { + lock.inputs.get(index).cloned() +} + +#[ferment_macro::export] +pub fn chain_lock_from_message(message: &[u8]) -> Option { + deserialize(message).ok() +} +#[ferment_macro::export] +pub fn chain_lock_to_message(lock: &ChainLock) -> Vec { + serialize(lock) +} +#[ferment_macro::export] +pub fn chain_lock_block_hash(chain_lock: &ChainLock) -> [u8; 32] { + chain_lock.block_hash.to_byte_array() +} +#[ferment_macro::export] +pub fn chain_lock_signature(chain_lock: &ChainLock) -> [u8; 96] { + chain_lock.signature.to_bytes() +} + +#[ferment_macro::export] +pub fn outpoint_from_message(message: &[u8]) -> Option { + deserialize(message).ok() +} +#[ferment_macro::export] +pub fn outpoint_to_message(lock: &OutPoint) -> Vec { + serialize(lock) +} + +#[ferment_macro::export] +pub fn operator_public_key_address(public_key: BLSPublicKey, chain_type: ChainType) -> String { + with_public_key_data(&public_key.0, chain_type) +} +#[ferment_macro::export] +pub fn voting_address(key_id_voting: PubkeyHash, chain_type: ChainType) -> String { + let script_map = chain_type.script_map(); + from_hash160_for_script_map(key_id_voting.as_byte_array(), &script_map) +} +#[ferment_macro::export] +pub fn evo_node_address(evo_node_id: PubkeyHash, chain_type: ChainType) -> String { + let script_map = chain_type.script_map(); + from_hash160_for_script_map(evo_node_id.as_byte_array(), &script_map) +} + +#[ferment_macro::export] +pub fn peer_addresses_with_connectivity_nonce(masternode_list: MasternodeList, nonce: u64, max_count: usize) -> Vec<([u8; 16], u16)> { + masternode_list.peer_addresses_with_connectivity_nonce(nonce, max_count).into_iter().map(|socket_addr| match socket_addr { + SocketAddr::V4(v4) => { + let mut writer = [0u8; 16]; + writer[12..].copy_from_slice(&v4.ip().octets()); + (writer, v4.port()) + }, + SocketAddr::V6(v6) => (v6.ip().octets(), v6.port()) + } + ).collect() +} + +#[ferment_macro::export] +pub fn socket_addr_port(socket_addr: SocketAddr) -> u16 { + match socket_addr { + SocketAddr::V4(v4) => v4.port(), + SocketAddr::V6(v6) => v6.port() + } +} + +#[ferment_macro::export] +pub fn socket_addr_ip(socket_addr: SocketAddr) -> [u8; 16] { + match socket_addr { + SocketAddr::V4(v4) => { + let mut octets = [0u8; 16]; + octets[8..12].copy_from_slice(&v4.ip().octets()); + octets + }, + SocketAddr::V6(v6) => v6.ip().octets() + } +} + +#[ferment_macro::export] +pub fn socket_addr_v4_ctor(ip: [u8; 16], port: u16) -> SocketAddr { + SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(ip[8], ip[8], ip[10], ip[11]), port)) +} \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/processing/processing_error.rs b/dash-spv-masternode-processor/src/processing/processing_error.rs deleted file mode 100644 index 35b62d98..00000000 --- a/dash-spv-masternode-processor/src/processing/processing_error.rs +++ /dev/null @@ -1,39 +0,0 @@ -#[warn(non_camel_case_types)] -#[repr(C)] -#[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Hash, Ord)] -pub enum ProcessingError { - None = 0, - PersistInRetrieval = 1, - LocallyStored = 2, - ParseError = 3, - HasNoBaseBlockHash = 4, - UnknownBlockHash = 5, -} - -impl From for ProcessingError { - fn from(orig: u8) -> Self { - match orig { - 0 => ProcessingError::None, - 1 => ProcessingError::PersistInRetrieval, - 2 => ProcessingError::LocallyStored, - 3 => ProcessingError::ParseError, - 4 => ProcessingError::HasNoBaseBlockHash, - 5 => ProcessingError::UnknownBlockHash, - _ => ProcessingError::None, - } - } -} - -impl From for u8 { - fn from(error: ProcessingError) -> Self { - match error { - ProcessingError::None => 0, - ProcessingError::PersistInRetrieval => 1, - ProcessingError::LocallyStored => 2, - ProcessingError::ParseError => 3, - ProcessingError::HasNoBaseBlockHash => 4, - ProcessingError::UnknownBlockHash => 5, - } - } -} - diff --git a/dash-spv-masternode-processor/src/processing/processor.rs b/dash-spv-masternode-processor/src/processing/processor.rs deleted file mode 100644 index 71be6a0c..00000000 --- a/dash-spv-masternode-processor/src/processing/processor.rs +++ /dev/null @@ -1,927 +0,0 @@ -use std::collections::{BTreeMap, HashSet}; -use std::ptr::null; -use logging::*; -use tracing::*; -use crate::{common, models, types}; -use crate::chain::common::{ChainType, IHaveChainSettings, LLMQType, LLMQParams}; -use crate::crypto::{byte_util::{Reversable, Zeroable}, UInt256, UInt768}; -use crate::ffi::boxer::boxed; -use crate::ffi::callbacks; -use crate::ffi::callbacks::{AddInsightBlockingLookup, GetBlockHashByHeight, GetBlockHeightByHash, GetCLSignatureByBlockHash, GetLLMQSnapshotByBlockHash, HashDestroy, LLMQSnapshotDestroy, MasternodeListDestroy, MasternodeListLookup, MasternodeListSave, MerkleRootLookup, SaveCLSignature, SaveLLMQSnapshot, ShouldProcessDiffWithRange}; -use crate::ffi::to::ToFFI; -use crate::models::{LLMQModifierType, LLMQVerificationContext}; -use crate::processing::{LLMQValidationStatus, MasternodeProcessorCache, MNListDiffResult, ProcessingError}; - -// https://github.com/rust-lang/rfcs/issues/2770 -#[repr(C)] -pub struct MasternodeProcessor { - /// External Masternode Manager Diff Message Context - pub opaque_context: *const std::ffi::c_void, - pub chain_type: ChainType, - pub use_insight_as_backup: bool, - pub get_block_height_by_hash: GetBlockHeightByHash, - pub get_merkle_root_by_hash: MerkleRootLookup, - get_block_hash_by_height: GetBlockHashByHeight, - get_llmq_snapshot_by_block_hash: GetLLMQSnapshotByBlockHash, - get_cl_signature_by_block_hash: GetCLSignatureByBlockHash, - save_llmq_snapshot: SaveLLMQSnapshot, - save_cl_signature: SaveCLSignature, - get_masternode_list_by_block_hash: MasternodeListLookup, - save_masternode_list: MasternodeListSave, - destroy_masternode_list: MasternodeListDestroy, - add_insight: AddInsightBlockingLookup, - destroy_hash: HashDestroy, - destroy_snapshot: LLMQSnapshotDestroy, - should_process_diff_with_range: ShouldProcessDiffWithRange, -} -impl std::fmt::Debug for MasternodeProcessor { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("MasternodeProcessor") - .field("context", &self.opaque_context) - .finish() - } -} - -impl MasternodeProcessor { - #[allow(clippy::too_many_arguments)] - pub fn new( - get_merkle_root_by_hash: MerkleRootLookup, - get_block_height_by_hash: GetBlockHeightByHash, - get_block_hash_by_height: GetBlockHashByHeight, - get_llmq_snapshot_by_block_hash: GetLLMQSnapshotByBlockHash, - save_llmq_snapshot: SaveLLMQSnapshot, - get_cl_signature_by_block_hash: GetCLSignatureByBlockHash, - save_cl_signature: SaveCLSignature, - get_masternode_list_by_block_hash: MasternodeListLookup, - save_masternode_list: MasternodeListSave, - destroy_masternode_list: MasternodeListDestroy, - add_insight: AddInsightBlockingLookup, - destroy_hash: HashDestroy, - destroy_snapshot: LLMQSnapshotDestroy, - should_process_diff_with_range: ShouldProcessDiffWithRange, - ) -> Self { - Self { - get_merkle_root_by_hash, - get_block_height_by_hash, - get_block_hash_by_height, - get_llmq_snapshot_by_block_hash, - save_llmq_snapshot, - get_cl_signature_by_block_hash, - save_cl_signature, - get_masternode_list_by_block_hash, - save_masternode_list, - destroy_masternode_list, - add_insight, - destroy_hash, - destroy_snapshot, - should_process_diff_with_range, - opaque_context: null(), - chain_type: ChainType::MainNet, - use_insight_as_backup: false, - } - } - - pub(crate) fn find_masternode_list( - &self, - block_hash: UInt256, - cached_lists: &BTreeMap, - unknown_lists: &mut Vec, - ) -> Option { - let genesis_hash = self.chain_type.genesis_hash(); - if block_hash.is_zero() { - // If it's a zero block we don't expect models list here - // println!("find {}: {} EMPTY BLOCK HASH -> None", self.lookup_block_height_by_hash(block_hash), block_hash); - None - } else if block_hash.eq(&genesis_hash) { - // If it's a genesis block we don't expect models list here - // println!("find {}: {} It's a genesis -> Some(EMPTY MNL)", self.lookup_block_height_by_hash(block_hash), block_hash); - Some(models::MasternodeList::new(BTreeMap::default(), BTreeMap::default(), block_hash, self.lookup_block_height_by_hash(block_hash), false)) - // None - } else if let Some(cached) = cached_lists.get(&block_hash) { - // Getting it from local cache stored as opaque in FFI context - // println!("find_masternode_list (cache) {}: {} -> Some({:?})", self.lookup_block_height_by_hash(block_hash), block_hash, cached); - Some(cached.clone()) - } else if let Some(looked) = self.lookup_masternode_list(block_hash) { - // Getting it from FFI directly - // println!("find_masternode_list {}: {} (ffi) -> Some({:?})", self.lookup_block_height_by_hash(block_hash), block_hash, looked); - Some(looked) - } else { - // println!("find {}: {} Unknown -> None", self.lookup_block_height_by_hash(block_hash), block_hash); - if self.lookup_block_height_by_hash(block_hash) != u32::MAX { - unknown_lists.push(block_hash); - } else if self.use_insight_as_backup { - self.add_insight(block_hash); - if self.lookup_block_height_by_hash(block_hash) != u32::MAX { - unknown_lists.push(block_hash); - } - } - None - } - } - pub(crate) fn find_snapshot( - &self, - block_hash: UInt256, - cached_snapshots: &BTreeMap, - ) -> Option { - if let Some(cached) = cached_snapshots.get(&block_hash) { - // Getting it from local cache stored as opaque in FFI context - Some(cached.clone()) - } else { - self.lookup_snapshot_by_block_hash(block_hash) - } - } - - pub fn llmq_modifier_type_for(&self, llmq_type: LLMQType, work_block_hash: UInt256, work_block_height: u32, cached_cl_signatures: &BTreeMap) -> LLMQModifierType { - if self.chain_type.core20_is_active_at(work_block_height) { - if let Some(work_block_hash) = self.lookup_block_hash_by_height(work_block_height) { - if let Some(best_cl_signature) = self.find_cl_signature(work_block_hash, cached_cl_signatures) { - return LLMQModifierType::CoreV20(llmq_type, work_block_height, best_cl_signature); - } else { - log_debug!(target: "masternode-processor", "llmq_modifier_type: clsig not found for block hash: {} ({})", work_block_hash, work_block_hash.reversed()); - } - } else { - log_debug!(target: "masternode-processor", "llmq_modifier_type: block not found for height: {}", work_block_height); - } - } - LLMQModifierType::PreCoreV20(llmq_type, work_block_hash) - } - - pub(crate) fn find_cl_signature( - &self, - block_hash: UInt256, - cached_cl_signatures: &BTreeMap, - ) -> Option { - if let Some(cached) = cached_cl_signatures.get(&block_hash) { - // Getting it from local cache stored as opaque in FFI context - Some(cached.clone()) - } else { - self.lookup_cl_signature_by_block_hash(block_hash) - } - } - - - pub(crate) fn get_list_diff_result_with_base_lookup( - &self, - list_diff: models::MNListDiff, - verification_context: LLMQVerificationContext, - cache: &mut MasternodeProcessorCache, - ) -> types::MNListDiffResult { - let base_block_hash = list_diff.base_block_hash; - //println!("get base list: find_masternode_list for {}: {}", list_diff.base_block_height, base_block_hash); - let base_list = self.find_masternode_list( - base_block_hash, - &cache.mn_lists, - &mut cache.needed_masternode_lists, - ); - self.get_list_diff_result(base_list, list_diff, verification_context, cache) - } - - pub(crate) fn get_list_diff_result_internal_with_base_lookup( - &self, - list_diff: models::MNListDiff, - verification_context: LLMQVerificationContext, - cache: &mut MasternodeProcessorCache, - ) -> MNListDiffResult { - //println!("get base list: find_masternode_list for {}: {}", list_diff.base_block_height, list_diff.base_block_hash); - let base_list = self.find_masternode_list( - list_diff.base_block_hash, - &cache.mn_lists, - &mut cache.needed_masternode_lists, - ); - self.get_list_diff_result_internal(base_list, list_diff, verification_context, cache) - } - - pub(crate) fn get_list_diff_result( - &self, - base_list: Option, - list_diff: models::MNListDiff, - verification_context: LLMQVerificationContext, - cache: &mut MasternodeProcessorCache, - ) -> types::MNListDiffResult { - let result = self.get_list_diff_result_internal(base_list, list_diff, verification_context, cache); - // println!("get_list_diff_result: {:#?}", result); - result.encode() - } - - fn cache_masternode_list( - &self, - block_hash: UInt256, - list: models::MasternodeList, - cache: &mut MasternodeProcessorCache, - ) { - // It's good to cache lists to use it inside processing session - // Here we use opaque-like pointer which we initiate on the C-side to sync its lifetime with runtime - #[cfg(feature = "generate-dashj-tests")] - crate::util::java::save_masternode_list_to_json(&list, self.lookup_block_height_by_hash(block_hash)); - cache.add_masternode_list(block_hash, list); - // Here we just store it in the C-side () - // self.save_masternode_list(block_hash, &masternode_list); - } - - pub(crate) fn get_list_diff_result_internal( - &self, - base_list: Option, - list_diff: models::MNListDiff, - verification_context: LLMQVerificationContext, - cache: &mut MasternodeProcessorCache, - ) -> MNListDiffResult { - let skip_removed_masternodes = list_diff.version >= 2; - let base_block_hash = list_diff.base_block_hash; - let block_hash = list_diff.block_hash; - let block_height = list_diff.block_height; - let quorums_cl_sigs = list_diff.quorums_cls_sigs; - let (base_masternodes, base_quorums) = match base_list { - Some(list) => (list.masternodes, list.quorums), - None => (BTreeMap::new(), BTreeMap::new()), - }; - let mut coinbase_transaction = list_diff.coinbase_transaction; - let quorums_active = coinbase_transaction.coinbase_transaction_version >= 2; - let (added_masternodes, modified_masternodes, masternodes) = self.classify_masternodes( - base_masternodes, - list_diff.added_or_modified_masternodes, - list_diff.deleted_masternode_hashes, - block_height, - block_hash, - ); - - let (added_quorums, - quorums, - cl_signatures, - has_valid_quorums) = self.classify_quorums( - base_quorums, - list_diff.added_quorums, - list_diff.deleted_quorums, - &quorums_cl_sigs, - skip_removed_masternodes, - verification_context, - cache, - ); - let masternode_list = models::MasternodeList::new( - masternodes, - quorums, - block_hash, - block_height, - quorums_active, - ); - let merkle_tree = common::MerkleTree { - tree_element_count: list_diff.total_transactions, - hashes: list_diff.merkle_hashes, - flags: list_diff.merkle_flags.as_slice(), - }; - self.cache_masternode_list(block_hash, masternode_list.clone(), cache); - let needed_masternode_lists = cache.needed_masternode_lists.clone(); - cache.needed_masternode_lists.clear(); - let has_found_coinbase = coinbase_transaction.has_found_coinbase(&merkle_tree.hashes); - let desired_merkle_root = self.lookup_merkle_root_by_hash(block_hash).unwrap_or(UInt256::MIN); - let has_valid_coinbase = merkle_tree.has_root(desired_merkle_root); - let has_valid_mn_list_root = masternode_list.has_valid_mn_list_root(&coinbase_transaction); - let has_valid_llmq_list_root = !quorums_active || masternode_list.has_valid_llmq_list_root(&coinbase_transaction); - let result = MNListDiffResult { - error_status: ProcessingError::None, - base_block_hash, - block_hash, - has_found_coinbase, - has_valid_coinbase, - has_valid_mn_list_root, - has_valid_llmq_list_root, - has_valid_quorums, - masternode_list, - added_masternodes, - modified_masternodes, - added_quorums, - needed_masternode_lists, - cl_signatures, - }; - result - } - - pub fn classify_masternodes( - &self, - base_masternodes: BTreeMap, - added_or_modified_masternodes: BTreeMap, - deleted_masternode_hashes: Vec, - block_height: u32, - block_hash: UInt256, - ) -> ( - BTreeMap, - BTreeMap, - BTreeMap, - ) { - let added_masternodes = added_or_modified_masternodes - .iter() - .filter(|(k, _)| !base_masternodes.contains_key(k)) - .map(|(k, v)| (*k, v.clone())) - .collect::>(); - - let mut modified_masternodes = added_or_modified_masternodes - .iter() - .filter(|(k, _)| base_masternodes.contains_key(k)) - .map(|(k, v)| (*k, v.clone())) - .collect::>(); - - let mut masternodes = if !base_masternodes.is_empty() { - let mut old_masternodes = base_masternodes; - for hash in deleted_masternode_hashes { - old_masternodes.remove(&hash.reversed()); - } - old_masternodes.extend(added_masternodes.clone()); - old_masternodes - } else { - added_masternodes.clone() - }; - - for (hash, modified) in &mut modified_masternodes { - if let Some(old) = masternodes.get_mut(hash) { - if old.update_height < modified.update_height { - modified.update_with_previous_entry(old, block_height, block_hash); - if !old.confirmed_hash.is_zero() && - old.known_confirmed_at_height.is_some() && - old.known_confirmed_at_height.unwrap() > block_height { - old.known_confirmed_at_height = Some(block_height); - } - } - masternodes.insert(*hash, modified.clone()); - } - } - (added_masternodes, modified_masternodes, masternodes) - } - - #[allow(clippy::type_complexity)] - pub fn classify_quorums( - &self, - mut base_quorums: BTreeMap>, - mut added_quorums: Vec, - deleted_quorums: BTreeMap>, - cl_signatures: &BTreeMap>, - skip_removed_masternodes: bool, - verification_context: LLMQVerificationContext, - cache: &mut MasternodeProcessorCache, - ) -> ( - Vec, - BTreeMap>, - BTreeMap, - bool, - ) { - let mut has_valid_quorums = true; - let mut signatures = BTreeMap::::new(); - if verification_context.should_validate_quorums() { - added_quorums - .iter_mut() - .enumerate() - .for_each(|(index, quorum)| { - if let Some(signature) = cl_signatures.iter().find_map(|(signature, index_set)| - if index_set.iter().any(|i| *i == index as u16) { Some(signature) } else { None }) { - let llmq_height = self.lookup_block_height_by_hash(quorum.llmq_hash); - if llmq_height != u32::MAX { - if let Some(llmq_hash_minus_8) = self.lookup_block_hash_by_height(llmq_height - 8) { - signatures.insert(llmq_hash_minus_8, signature.clone()); - cache.cl_signatures.insert(llmq_hash_minus_8, signature.clone()); - } else { - log_debug!(target: "masternode-processor", "unknown hash for {}", llmq_height - 8); - } - } else { - log_debug!(target: "masternode-processor", "unknown height for {}", quorum.llmq_hash); - } - } - if verification_context.should_validate_quorum_of_type(quorum.llmq_type, self.chain_type) { - let status = self.validate_quorum(quorum, skip_removed_masternodes, cache); - has_valid_quorums &= status.is_not_critical(); - } - }) - } - for (llmq_type, keys_to_delete) in &deleted_quorums { - if let Some(llmq_map) = base_quorums.get_mut(llmq_type) { - for key in keys_to_delete { - llmq_map.remove(key); - } - } - } - added_quorums.iter().for_each(|llmq_entry| { - base_quorums.entry(llmq_entry.llmq_type.clone()) - .or_insert_with(BTreeMap::new) - .insert(llmq_entry.llmq_hash, llmq_entry.clone()); - }); - (added_quorums, base_quorums, signatures, has_valid_quorums) - } - - pub fn validate_quorum(&self, quorum: &mut models::LLMQEntry, skip_removed_masternodes: bool, cache: &mut MasternodeProcessorCache) -> LLMQValidationStatus { - let llmq_block_hash = quorum.llmq_hash; - self.find_masternode_list(llmq_block_hash, &cache.mn_lists, &mut cache.needed_masternode_lists) - .map_or( - LLMQValidationStatus::NoMasternodeList, - |models::MasternodeList { masternodes, .. }| - self.validate_quorum_with_masternodes(quorum, skip_removed_masternodes, llmq_block_hash, masternodes, cache)) - } - - pub fn validate_quorum_with_masternodes( - &self, - quorum: &mut models::LLMQEntry, - skip_removed_masternodes: bool, - block_hash: UInt256, - masternodes: BTreeMap, - cache: &mut MasternodeProcessorCache, - ) -> LLMQValidationStatus { - let block_height = self.lookup_block_height_by_hash(block_hash); - let llmq_type = quorum.llmq_type; - let valid_masternodes = if quorum.index.is_some() { - self.get_rotated_masternodes_for_quorum( - llmq_type, - block_hash, - block_height, - &mut cache.llmq_members, - &mut cache.llmq_indexed_members, - &cache.mn_lists, - &cache.llmq_snapshots, - &cache.cl_signatures, - &mut cache.needed_masternode_lists, - skip_removed_masternodes, - ) - } else { - models::MasternodeList::get_masternodes_for_quorum( - quorum, - self.chain_type, - masternodes, - block_height, - self.llmq_modifier_type_for(llmq_type, quorum.llmq_hash, block_height - 8, &cache.cl_signatures) - ) - }; - //crate::util::java::generate_final_commitment_test_file(self.chain_type, block_height, &quorum, &valid_masternodes); - quorum.verify(valid_masternodes, block_height) - } - - fn sort_scored_masternodes(scored_masternodes: BTreeMap) -> Vec { - let mut v = Vec::from_iter(scored_masternodes); - v.sort_by(|(s1, _), (s2, _)| s2.reversed().cmp(&s1.reversed())); - v.into_iter().map(|(s, node)| node).collect() - } - - pub fn valid_masternodes_for_rotated_quorum_map( - masternodes: Vec, - quorum_modifier: UInt256, - block_height: u32, - ) -> Vec { - let scored_masternodes = masternodes - .into_iter() - .filter_map(|entry| models::MasternodeList::masternode_score(&entry, quorum_modifier, block_height) - .map(|score| (score, entry))) - .collect::>(); - Self::sort_scored_masternodes(scored_masternodes) - } - - // Reconstruct quorum members at index from snapshot - pub fn quorum_quarter_members_by_snapshot( - &self, - llmq_params: LLMQParams, - quorum_base_block_height: u32, - cached_lists: &BTreeMap, - cached_snapshots: &BTreeMap, - cached_cl_signatures: &BTreeMap, - unknown_lists: &mut Vec, - ) -> Vec> { - let work_block_height = quorum_base_block_height - 8; - let llmq_type = llmq_params.r#type; - let quorum_count = llmq_params.signing_active_quorum_count as usize; - let quorum_size = llmq_params.size; - let quarter_size = (quorum_size / 4) as usize; - // Quorum members dichotomy in snapshot - match self.lookup_block_hash_by_height(work_block_height) { - None => panic!("MISSING: block for height: {}", work_block_height), - Some(work_block_hash) => { - if let Some(masternode_list) = self.find_masternode_list(work_block_hash, cached_lists, unknown_lists) { - if let Some(snapshot) = self.find_snapshot(work_block_hash, cached_snapshots) { - let mut i: u32 = 0; - // println!("•••• quorum_quarter_members_by_snapshot: {:?}: {:?}: {}: {}", llmq_type, snapshot.skip_list_mode, work_block_height, work_block_hash.reversed()); - // println!("{:#?}", masternode_list); - // println!("••••"); - // java::generate_snapshot(&snapshot, work_block_height); - // java::generate_llmq_hash(llmq_type, work_block_hash.reversed()); - // java::generate_masternode_list_from_map(&masternode_list.masternodes); - let quorum_modifier_type = self.llmq_modifier_type_for(llmq_type, work_block_hash, work_block_height, cached_cl_signatures); - let quorum_modifier = quorum_modifier_type.build_llmq_hash(); - // println!("quorum_modifier: {}", quorum_modifier); - // println!("snapshot: {:?}", snapshot); - let scored_masternodes = models::MasternodeList::score_masternodes_map(masternode_list.masternodes, quorum_modifier, work_block_height, false); - // java::generate_masternode_list_from_map(&scored_masternodes); - let sorted_scored_masternodes = Self::sort_scored_masternodes(scored_masternodes); - // println!("//////////////////sorted_scored_masternodes////////////////////"); - // println!("{:#?}", sorted_scored_masternodes.iter().map(|n| n.provider_registration_transaction_hash.reversed()).collect::>()); - let (used_at_h, unused_at_h) = sorted_scored_masternodes - .into_iter() - .partition(|_| { - let is_true = snapshot.member_is_true_at_index(i); - i += 1; - is_true - }); - // java::generate_masternode_list(&used_at_h); - // java::generate_masternode_list(&unused_at_h); - // println!("//////////////////////////////////////"); - let sorted_used_at_h = Self::valid_masternodes_for_rotated_quorum_map( - used_at_h, - quorum_modifier, - work_block_height, - ); - // println!("////////////sorted_used_at_h////////////////"); - // println!("{:#?}", sorted_used_at_h.iter().map(|n| n.provider_registration_transaction_hash.reversed()).collect::>()); - let sorted_unused_at_h = Self::valid_masternodes_for_rotated_quorum_map( - unused_at_h, - quorum_modifier, - work_block_height, - ); - // println!("////////////sorted_unused_at_h////////////////"); - // println!("{:#?}", sorted_unused_at_h.iter().map(|n| n.provider_registration_transaction_hash.reversed()).collect::>()); - let mut sorted_combined_mns_list = sorted_unused_at_h; - sorted_combined_mns_list.extend(sorted_used_at_h); - // println!("////////////sorted_combined_mns_list////////////////"); - // println!("{:#?}", sorted_combined_mns_list.iter().map(|n| n.provider_registration_transaction_hash.reversed()).collect::>()); - snapshot.apply_skip_strategy(sorted_combined_mns_list, quorum_count, quarter_size) - } else { - log_debug!(target: "masternode-processor", "MISSING: snapshot for block at height: {}: {}", work_block_height, work_block_hash); - vec![] - } - } else { - log_debug!(target: "masternode-processor", "MISSING: masternode_list for block at height: {}: {}", work_block_height, work_block_hash); - vec![] - } - } - } - } - - // fn log_masternodes(vec: &Vec, prefix: String) { - // info!("{}", prefix); - // vec.iter().for_each(|m| info!("{:?}", m.provider_registration_transaction_hash.reversed())); - // } - - // Determine quorum members at new index - pub fn new_quorum_quarter_members( - &self, - params: LLMQParams, - quorum_base_block_height: u32, - previous_quarters: [&Vec>; 3], - cached_lists: &BTreeMap, - cached_cl_signatures: &BTreeMap, - unknown_lists: &mut Vec, - skip_removed_masternodes: bool, - ) -> Vec> { - let quorum_count = params.signing_active_quorum_count as usize; - let mut quarter_quorum_members = vec![Vec::::new(); quorum_count]; - let quorum_size = params.size as usize; - let quarter_size = quorum_size / 4; - let work_block_height = quorum_base_block_height - 8; - match self.lookup_block_hash_by_height(work_block_height) { - None => panic!("missing block for height: {}", work_block_height), - Some(work_block_hash) => { - if let Some(masternode_list) = self.find_masternode_list(work_block_hash, cached_lists, unknown_lists) { - //java::generate_masternode_list_from_map(&masternode_list.masternodes); - // println!("•••• new_quorum_quarter_members: {:?}: (skip_removed: {}) {}: {}", params.r#type, skip_removed_masternodes, work_block_height, work_block_hash.reversed()); - // println!("{:#?}", masternode_list); - // println!("••••"); - if masternode_list.masternodes.len() < quarter_size { - log_debug!(target: "masternode-processor", "models list at {}: {} has less masternodes ({}) then required for quarter size: ({})", work_block_height, work_block_hash, masternode_list.masternodes.len(), quarter_size); - quarter_quorum_members - } else { - let mut used_at_h_masternodes = Vec::::new(); - let mut unused_at_h_masternodes = Vec::::new(); - let mut used_at_h_indexed_masternodes = vec![Vec::::new(); quorum_count]; - for i in 0..quorum_count { - // for quarters h - c, h -2c, h -3c - for quarter in &previous_quarters { - if let Some(quarter_nodes) = quarter.get(i) { - //Self::log_masternodes(quarter_nodes, format!("••••• PREV QUARTER {} ••••••• ", i)); - for node in quarter_nodes { - let hash = node.provider_registration_transaction_hash; - if (!skip_removed_masternodes || masternode_list.has_masternode(hash)) && - masternode_list.has_valid_masternode(hash) { - if !used_at_h_masternodes.iter().any(|m| m.provider_registration_transaction_hash == hash) { - used_at_h_masternodes.push(node.clone()); - } - if !used_at_h_indexed_masternodes[i].iter().any(|m| m.provider_registration_transaction_hash == hash) { - used_at_h_indexed_masternodes[i].push(node.clone()); - } - } - } - } - } - } - masternode_list.masternodes.values().for_each(|mn| { - if mn.is_valid && !used_at_h_masternodes.iter().any(|node| mn.provider_registration_transaction_hash == node.provider_registration_transaction_hash) { - unused_at_h_masternodes.push(mn.clone()); - } - }); - //Self::log_masternodes(&used_at_h_masternodes, format!("••••• USED AT H {} ••••••• ", work_block_height)); - //Self::log_masternodes(&unused_at_h_masternodes, format!("••••• UNUSED AT H {} •••••••", work_block_height)); - let quorum_modifier_type = self.llmq_modifier_type_for(params.r#type, work_block_hash, work_block_height, cached_cl_signatures); - let quorum_modifier = quorum_modifier_type.build_llmq_hash(); - let sorted_used_mns_list = Self::valid_masternodes_for_rotated_quorum_map(used_at_h_masternodes, quorum_modifier, work_block_height); - let sorted_unused_mns_list = Self::valid_masternodes_for_rotated_quorum_map(unused_at_h_masternodes, quorum_modifier, work_block_height); - //Self::log_masternodes(&sorted_unused_mns_list, format!("••••• SORTED UNUSED AT H {} ••••••• ", work_block_height)); - //Self::log_masternodes(&sorted_used_mns_list, format!("••••• SORTED USED AT H {} ••••••• ", work_block_height)); - let mut sorted_combined_mns_list = sorted_unused_mns_list; - sorted_combined_mns_list.extend(sorted_used_mns_list); - // println!("••••• SORTED COMBINED AT H {} •••••••", work_block_height); - // println!("{:#?}", sorted_combined_mns_list.iter().map(|m|m.provider_registration_transaction_hash.reversed()).collect::>()); - - let mut skip_list = Vec::::new(); - let mut first_skipped_index = 0i32; - let mut idx = 0i32; - for i in 0..quorum_count { - let masternodes_used_at_h_indexed_at_i = used_at_h_indexed_masternodes.get_mut(i).unwrap(); - let used_mns_count = masternodes_used_at_h_indexed_at_i.len(); - let sorted_combined_mns_list_len = sorted_combined_mns_list.len(); - let mut updated = false; - let initial_loop_idx = idx; - while quarter_quorum_members[i].len() < quarter_size && used_mns_count + quarter_quorum_members[i].len() < sorted_combined_mns_list_len { - let mn = sorted_combined_mns_list.get(idx as usize).unwrap(); - // TODO: replace masternodes with smart pointers to avoid cloning - if masternodes_used_at_h_indexed_at_i.iter().any(|node| mn.provider_registration_transaction_hash == node.provider_registration_transaction_hash) { - let skip_index = idx - first_skipped_index; - if first_skipped_index == 0 { - first_skipped_index = idx; - } - skip_list.push(idx); - } else { - masternodes_used_at_h_indexed_at_i.push(mn.clone()); - quarter_quorum_members[i].push(mn.clone()); - updated = true; - } - idx += 1; - if idx == sorted_combined_mns_list_len as i32 { - idx = 0; - } - if idx == initial_loop_idx { - if !updated { - log_debug!(target: "masternode-processor", "there are not enough MNs {}: {} then required for quarter size: ({})", work_block_height, work_block_hash, quarter_size); - return vec![Vec::::new(); quorum_count]; - } - updated = false; - } - } - } - // println!("••••• QUARTER MEMBERS •••••••"); - // quarter_quorum_members.iter().enumerate().for_each(|(index, members)| { - // Self::log_masternodes(&members, format!("••••• INDEX {} ••••••• ", index)); - // }); - // println!("•••••"); - quarter_quorum_members - } - } else { - log_debug!(target: "masternode-processor", "missing models list for height: {}: {}", work_block_height, work_block_hash); - quarter_quorum_members - } - } - } - } - - fn add_quorum_members_from_quarter( - quorum_members: &mut Vec>, - quarter: &[Vec], - index: usize, - ) { - if let Some(indexed_quarter) = quarter.get(index) { - quorum_members.resize_with(index + 1, Vec::new); - quorum_members[index].extend(indexed_quarter.iter().cloned()); - } - } - - fn rotate_members( - &self, - cycle_quorum_base_block_height: u32, - llmq_params: LLMQParams, - cached_lists: &BTreeMap, - cached_snapshots: &BTreeMap, - cached_cl_signatures: &BTreeMap, - unknown_lists: &mut Vec, - skip_removed_masternodes: bool, - ) -> Vec> { - let num_quorums = llmq_params.signing_active_quorum_count as usize; - let cycle_length = llmq_params.dkg_params.interval; - // println!("/////////////////////// rotate_members {}: {} /////////", cycle_quorum_base_block_height, cycle_length); - let quorum_base_block_height = cycle_quorum_base_block_height - cycle_length; - let prev_q_h_m_c = self.quorum_quarter_members_by_snapshot(llmq_params, quorum_base_block_height, cached_lists, cached_snapshots, cached_cl_signatures, unknown_lists); - // println!("/////////////////////// prev_q_h_m_c : {} /////////", quorum_base_block_height); - // println!("{:#?}", prev_q_h_m_c.iter().map(|p| p.iter().map(|n| n.provider_registration_transaction_hash.reversed()).collect::>()).collect::>()); - let quorum_base_block_height = cycle_quorum_base_block_height - 2 * cycle_length; - let prev_q_h_m_2c = self.quorum_quarter_members_by_snapshot(llmq_params, quorum_base_block_height, cached_lists, cached_snapshots, cached_cl_signatures, unknown_lists); - // println!("/////////////////////// prev_q_h_m_2c : {} /////////", quorum_base_block_height); - // println!("{:#?}", prev_q_h_m_2c.iter().map(|p| p.iter().map(|n| n.provider_registration_transaction_hash.reversed()).collect::>()).collect::>()); - let quorum_base_block_height = cycle_quorum_base_block_height - 3 * cycle_length; - let prev_q_h_m_3c = self.quorum_quarter_members_by_snapshot(llmq_params, quorum_base_block_height, cached_lists, cached_snapshots, cached_cl_signatures, unknown_lists); - // println!("/////////////////////// prev_q_h_m_3c : {} /////////", quorum_base_block_height); - // println!("{:#?}", prev_q_h_m_3c.iter().map(|p| p.iter().map(|n| n.provider_registration_transaction_hash.reversed()).collect::>()).collect::>()); - - let mut rotated_members = - Vec::>::with_capacity(num_quorums); - let new_quarter_members = self.new_quorum_quarter_members( - llmq_params, - cycle_quorum_base_block_height, - [ - &prev_q_h_m_c, - &prev_q_h_m_2c, - &prev_q_h_m_3c, - ], - cached_lists, - cached_cl_signatures, - unknown_lists, - skip_removed_masternodes, - ); - // println!("/////////////////////// new_quarter_members : {} /////////", cycle_quorum_base_block_height); - // println!("{:#?}", new_quarter_members.iter().map(|p| p.iter().map(|n| n.provider_registration_transaction_hash.reversed()).collect::>()).collect::>()); - - (0..num_quorums).for_each(|i| { - Self::add_quorum_members_from_quarter(&mut rotated_members, &prev_q_h_m_3c, i); - Self::add_quorum_members_from_quarter(&mut rotated_members, &prev_q_h_m_2c, i); - Self::add_quorum_members_from_quarter(&mut rotated_members, &prev_q_h_m_c, i); - Self::add_quorum_members_from_quarter(&mut rotated_members, &new_quarter_members, i); - }); - rotated_members - } - - /// Determine masternodes which is responsible for signing at this quorum index - #[allow(clippy::too_many_arguments)] - pub fn get_rotated_masternodes_for_quorum( - &self, - llmq_type: LLMQType, - block_hash: UInt256, - block_height: u32, - cached_llmq_members: &mut BTreeMap>>, - cached_llmq_indexed_members: &mut BTreeMap>>, - cached_mn_lists: &BTreeMap, - cached_llmq_snapshots: &BTreeMap, - cached_cl_signatures: &BTreeMap, - cached_needed_masternode_lists: &mut Vec, - skip_removed_masternodes: bool, - ) -> Vec { - let map_by_type_opt = cached_llmq_members.get_mut(&llmq_type); - if map_by_type_opt.is_some() { - if let Some(members) = map_by_type_opt.as_ref().unwrap().get(&block_hash) { - return members.clone(); - } - } else { - cached_llmq_members.insert(llmq_type, BTreeMap::new()); - } - let map_by_type = cached_llmq_members.get_mut(&llmq_type).unwrap(); - let llmq_params = llmq_type.params(); - let quorum_index = block_height % llmq_params.dkg_params.interval; - let cycle_base_height = block_height - quorum_index; - // println!("/////////////////////get_rotated_masternodes_for_quorum {} {} {} {}", block_height, llmq_params.dkg_params.interval, quorum_index, cycle_base_height); - match self.lookup_block_hash_by_height(cycle_base_height) { - None => panic!("missing hash for block at height: {}", cycle_base_height), - Some(cycle_base_hash) => { - let map_by_type_indexed_opt = cached_llmq_indexed_members.get_mut(&llmq_type); - if map_by_type_indexed_opt.is_some() { - if let Some(members) = map_by_type_indexed_opt - .as_ref() - .unwrap() - .get(&(cycle_base_hash, quorum_index).into()) - { - map_by_type.insert(block_hash, members.clone()); - return members.clone(); - } - } else { - cached_llmq_indexed_members.insert(llmq_type, BTreeMap::new()); - } - let rotated_members = self.rotate_members( - cycle_base_height, - llmq_params, - cached_mn_lists, - cached_llmq_snapshots, - cached_cl_signatures, - cached_needed_masternode_lists, - skip_removed_masternodes, - ); - let map_indexed_quorum_members_of_type = - cached_llmq_indexed_members.get_mut(&llmq_type).unwrap(); - rotated_members.iter().enumerate().for_each(|(i, members)| { - map_indexed_quorum_members_of_type.insert((cycle_base_hash, i).into(), members.clone()); - }); - if let Some(members) = rotated_members.get(quorum_index as usize) { - map_by_type.insert(block_hash, members.clone()); - return members.clone(); - } - vec![] - } - } - } - - /////////////////////////////////////////////////////////////////////////////////////////// - /// FFI-callbacks - /////////////////////////////////////////////////////////////////////////////////////////// - - pub fn lookup_masternode_list( - &self, - block_hash: UInt256, - ) -> Option { - // First look at the local cache - callbacks::lookup_masternode_list( - block_hash, - |h: UInt256| unsafe { - (self.get_masternode_list_by_block_hash)(boxed(h.0), self.opaque_context) - }, - |list: *mut types::MasternodeList| unsafe { (self.destroy_masternode_list)(list) }, - ) - } - - pub fn save_masternode_list( - &self, - block_hash: UInt256, - masternode_list: &models::MasternodeList, - ) -> bool { - unsafe { - (self.save_masternode_list)( - boxed(block_hash.0), - boxed(masternode_list.encode()), - self.opaque_context, - ) - } - } - - pub fn lookup_block_hash_by_height(&self, block_height: u32) -> Option { - callbacks::lookup_block_hash_by_height( - block_height, - |h: u32| unsafe { (self.get_block_hash_by_height)(h, self.opaque_context) }, - |hash: *mut u8| unsafe { (self.destroy_hash)(hash) }, - ) - } - - pub fn lookup_block_height_by_hash(&self, block_hash: UInt256) -> u32 { - unsafe { (self.get_block_height_by_hash)(boxed(block_hash.0), self.opaque_context) } - } - - pub fn lookup_snapshot_by_block_hash(&self, block_hash: UInt256) -> Option { - callbacks::lookup_snapshot_by_block_hash( - block_hash, - |h: UInt256| unsafe { - (self.get_llmq_snapshot_by_block_hash)(boxed(h.0), self.opaque_context) - }, - |snapshot: *mut types::LLMQSnapshot| unsafe { (self.destroy_snapshot)(snapshot) }, - ) - } - - pub fn save_snapshot(&self, block_hash: UInt256, snapshot: models::LLMQSnapshot) -> bool { - #[cfg(feature = "generate-dashj-tests")] - crate::util::java::save_snapshot_to_json(&snapshot, self.lookup_block_height_by_hash(block_hash)); - unsafe { - (self.save_llmq_snapshot)( - boxed(block_hash.0), - boxed(snapshot.encode()), - self.opaque_context, - ) - } - } - - pub fn lookup_cl_signature_by_block_hash(&self, block_hash: UInt256) -> Option { - callbacks::lookup_cl_signature_by_block_hash( - block_hash, - |h: UInt256| unsafe { - (self.get_cl_signature_by_block_hash)(boxed(h.0), self.opaque_context) - }, - |obj: *mut u8| unsafe { (self.destroy_hash)(obj) }, - ) - } - - pub fn save_cl_signature(&self, block_hash: UInt256, cl_signature: UInt768) -> bool { - #[cfg(feature = "generate-dashj-tests")] - crate::util::java::save_cl_signature_to_json(&cl_signature, self.lookup_block_height_by_hash(block_hash)); - unsafe { - (self.save_cl_signature)( - boxed(block_hash.0), - boxed(cl_signature.0), - self.opaque_context, - ) - } - } - - pub fn lookup_merkle_root_by_hash(&self, block_hash: UInt256) -> Option { - callbacks::lookup_merkle_root_by_hash( - block_hash, - |h: UInt256| unsafe { (self.get_merkle_root_by_hash)(boxed(h.0), self.opaque_context) }, - |hash: *mut u8| unsafe { (self.destroy_hash)(hash) }, - ) - } - - pub fn should_process_diff_with_range( - &self, - base_block_hash: UInt256, - block_hash: UInt256, - ) -> ProcessingError { - unsafe { - (self.should_process_diff_with_range)( - boxed(base_block_hash.0), - boxed(block_hash.0), - self.opaque_context, - ) - } - } - - pub fn add_insight(&self, block_hash: UInt256) { - unsafe { (self.add_insight)(boxed(block_hash.0), self.opaque_context) } - } - - pub fn read_list_diff_from_message<'a>( - &self, - message: &'a [u8], - offset: &mut usize, - protocol_version: u32 - ) -> Option { - models::MNListDiff::new(message, offset, |block_hash| self.lookup_block_height_by_hash(block_hash), protocol_version) - } -} diff --git a/dash-spv-masternode-processor/src/processing/processor/mod.rs b/dash-spv-masternode-processor/src/processing/processor/mod.rs new file mode 100644 index 00000000..5a36b915 --- /dev/null +++ b/dash-spv-masternode-processor/src/processing/processor/mod.rs @@ -0,0 +1,247 @@ +pub mod processing_error; + +use std::collections::{BTreeMap, BTreeSet}; +use std::fmt::{Debug, Formatter}; +use std::net::SocketAddr; +use std::sync::Arc; +#[cfg(feature = "message_verification")] +use dashcore::{ephemerealdata::{chain_lock::ChainLock, instant_lock::InstantLock}, sml::message_verification_error::MessageVerificationError}; +use dashcore::consensus::deserialize; +use dashcore::hashes::Hash; +use dashcore::hash_types::{BlockHash, ProTxHash}; +use dashcore::network::constants::Network; +#[cfg(feature = "std")] +use dashcore::network::message_qrinfo::QuorumSnapshot; +use dashcore::network::message_qrinfo::QRInfo; +use dashcore::network::message_sml::MnListDiff; +use dashcore::prelude::CoreBlockHeight; +use dashcore::sml::llmq_type::LLMQType; +use dashcore::sml::masternode_list::MasternodeList; +use dashcore::sml::masternode_list_engine::{MasternodeListEngine, MasternodeListEngineBlockContainer}; +use dashcore::sml::masternode_list_entry::qualified_masternode_list_entry::QualifiedMasternodeListEntry; +use dashcore::sml::quorum_validation_error::{ClientDataRetrievalError, QuorumValidationError}; +use dash_spv_crypto::crypto::byte_util::Zeroable; +use dash_spv_crypto::network::{ChainType, IHaveChainSettings}; +use crate::processing::core_provider::CoreProvider; +use crate::processing::processor::processing_error::ProcessingError; + +// https://github.com/rust-lang/rfcs/issues/2770 +#[ferment_macro::opaque] +pub struct MasternodeProcessor { + pub provider: Arc, + pub engine: MasternodeListEngine, + // pub dapi_address_handler: Option>, +} +impl Debug for MasternodeProcessor { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.write_str(format!("[{}] [PROC]", self.provider.chain_type().name()).as_str()) + } +} +impl MasternodeProcessor { + pub fn new(provider: Arc, network: Network) -> Self { + Self { provider, engine: MasternodeListEngine::default_for_network(network) } + } +} + +#[ferment_macro::export] +impl MasternodeProcessor { + + pub fn clear(&mut self) { + self.engine.clear(); + } + pub fn current_masternode_list(&self) -> Option { + self.engine.latest_masternode_list().cloned() + } + + pub fn known_masternode_lists_count(&self) -> usize { + self.engine.masternode_lists.len() + } + + pub fn has_current_masternode_list(&self) -> bool { + self.engine.latest_masternode_list().is_some() + } + pub fn valid_masternodes_count(&self) -> usize { + self.current_masternode_list() + .map(|list| list.masternodes.values().filter(|entry| entry.masternode_list_entry.is_valid).count()) + .unwrap_or_default() + } + + pub fn masternode_list_for_block_hash(&self, block_hash: [u8; 32]) -> Option { + let block_hash = BlockHash::from_byte_array(block_hash); + self.engine.masternode_list_for_block_hash(&block_hash).cloned() + } + + pub fn has_masternode_at_location(&self, address: [u8; 16], port: u16) -> bool { + self.engine.masternode_lists.values() + .any(|list| list.has_masternode_at_location(address, port)) + } + + pub fn masternode_at_location(&self, location: SocketAddr) -> Option { + self.engine.masternode_lists.values() + .find_map(|list| list.masternodes.values().find(|node| location.eq(&node.masternode_list_entry.service_address))) + .cloned() + } + + pub fn current_masternode_list_masternode_with_pro_reg_tx_hash(&self, hash: &ProTxHash) -> Option { + let list = self.current_masternode_list(); + list.and_then(|list| list.masternodes.get(hash).cloned()) + } + pub fn current_masternode_list_height(&self) -> u32 { + self.current_masternode_list() + .map(|list| list.known_height) + .unwrap_or(u32::MAX) + } + pub fn current_masternode_list_masternode_count(&self) -> usize { + let list = self.current_masternode_list(); + list.map(|list| list.masternodes.len()) + .unwrap_or_default() + } + pub fn current_masternode_list_quorum_count(&self) -> usize { + let list = self.current_masternode_list(); + list.map(|list| list.quorums_count() as usize) + .unwrap_or_default() + } + + pub fn closest_known_masternode_list_block_hash( + &self, + core_block_height: u32, + ) -> [u8; 32] { + let chain_type = ChainType::from(self.engine.network); + self.engine.masternode_lists.range(..=core_block_height) + .next_back() + .map(|(_, list)| list.block_hash.to_byte_array()) + .unwrap_or(chain_type.genesis_hash()) + } + + pub fn masternode_lists(&self) -> BTreeMap { + self.engine.masternode_lists.clone() + } + pub fn known_block_hashes(&self) -> BTreeMap { + match &self.engine.block_container { + MasternodeListEngineBlockContainer::BTreeMapContainer(map) => map.block_hashes.iter().map(|(h, hash)| (*h, hash.to_byte_array())).collect(), + } + } + pub fn known_block_heights(&self) -> BTreeMap<[u8; 32], u32> { + match &self.engine.block_container { + MasternodeListEngineBlockContainer::BTreeMapContainer(map) => map.block_heights.iter().map(|(hash, h)| (hash.to_byte_array(), *h)).collect() + } + } + + #[cfg(feature = "std")] + pub fn known_snapshots(&self) -> BTreeMap { + self.engine.known_snapshots.clone() + } + + #[cfg(feature = "message_verification")] + pub fn verify_is_lock(&self, instant_lock: &InstantLock) -> Result { + self.engine.verify_is_lock(instant_lock).map(|_| true) + } + + #[cfg(feature = "message_verification")] + pub fn verify_chain_lock(&self, chain_lock: &ChainLock) -> Result { + self.engine.verify_chain_lock(chain_lock).map(|_| true) + } + + + /// Processes a serialized `QRInfo` message received from the network. + /// + /// This function deserializes the given message, processes the QRInfo data, + /// and determines the set of `mn_list_diff` block hashes required to verify + /// the current and previous masternode list non-rotated quorums. + /// + /// The client should query and retrieve these `mn_list_diff` messages from the network + /// and feed them back into the system using [`process_mn_list_diff_result_from_message`]. + /// + /// The client should only verify the last two `mn_list_diff` messages to maintain efficiency. + /// + /// # Arguments + /// * `message` - A byte slice containing the serialized `QRInfo` message. + /// * `verify_rotated_quorums` - A boolean indicating whether rotated quorums should be verified. + /// + /// # Returns + /// * `Ok(BTreeSet)` - A set of block hashes for which `mn_list_diff` data is required. + /// * `Err(ProcessingError)` - If deserialization fails or if any internal processing error occurs. + /// + /// # Errors + /// This function will return an error if: + /// * The provided message cannot be deserialized into a valid `QRInfo` object. + /// * There is an issue fetching the required data from the provider. + /// + pub fn process_qr_info_result_from_message( + &mut self, + message: &[u8], verify_tip_non_rotated_quorums: bool, verify_rotated_quorums: bool) -> Result, ProcessingError> { + + let qr_info: QRInfo = deserialize(message)?; + + let get_height_fn = { + |block_hash: &BlockHash| { + if block_hash.as_byte_array().is_zero() { + return Ok(0); + } + let height = self.provider.lookup_block_height_by_hash(block_hash.to_byte_array()); + if height == u32::MAX { + Err(ClientDataRetrievalError::RequiredBlockNotPresent(*block_hash)) + } else { + Ok(height) + } + } + }; + + self.engine.feed_qr_info( + qr_info, + verify_tip_non_rotated_quorums, + verify_rotated_quorums, + Some(get_height_fn), + )?; + + let hashes = self.engine.latest_masternode_list_non_rotating_quorum_hashes(&[LLMQType::Llmqtype50_60, LLMQType::Llmqtype400_85], false); + Ok(hashes) + } + + /// Processes a serialized `MnListDiff` message received from the network. + /// + /// This function deserializes the `MnListDiff` message, applies the masternode list + /// difference to the internal state, and optionally verifies quorums. + /// + /// # Arguments + /// * `message` - A byte slice containing the serialized `MnListDiff` message. + /// * `diff_block_height` - An optional block height corresponding to the `MnListDiff`. + /// * `verify_quorums` - A boolean indicating whether the quorums should be verified. + /// + /// # Returns + /// * `Ok((BlockHash, BlockHash))` - If the masternode list difference was successfully applied returns pair (base_block_hash, block_hash). + /// * `Err(ProcessingError)` - If deserialization or quorum validation fails. + /// + /// # Errors + /// This function will return an error if: + /// * The provided message cannot be deserialized into a valid `MnListDiff` object. + /// * There is an issue applying the masternode list difference. + pub fn process_mn_list_diff_result_from_message( + &mut self, + message: &[u8], diff_block_height: Option, verify_quorums: bool) -> Result<(BlockHash, BlockHash), ProcessingError> { + let mn_list_diff : MnListDiff = match deserialize(message) { + Ok(mn_list_diff) => mn_list_diff, + Err(err) => return Err(err.into()), + }; + let base_block_hash = mn_list_diff.base_block_hash; + let block_hash = mn_list_diff.block_hash; + let signature = self.engine + .apply_diff(mn_list_diff, diff_block_height, verify_quorums, None) + .map_err(|e| ProcessingError::QuorumValidationError(QuorumValidationError::SMLError(e)))?; + Ok((base_block_hash, block_hash)) + } + + pub fn serialize_engine(&self) -> Result, ProcessingError> { + bincode::encode_to_vec(&self.engine, bincode::config::standard()) + .map_err(|e| ProcessingError::EncodeError(e.to_string())) + } + + pub fn deserialize_engine(&mut self, bytes: &[u8]) -> Result { + bincode::decode_from_slice(bytes, bincode::config::standard()) + .map_err(|e| ProcessingError::DecodeError(e.to_string())) + .map(|(engine, size)| { + self.engine = engine; + size + }) + } +} diff --git a/dash-spv-masternode-processor/src/processing/processor/processing_error.rs b/dash-spv-masternode-processor/src/processing/processor/processing_error.rs new file mode 100644 index 00000000..bb1cce49 --- /dev/null +++ b/dash-spv-masternode-processor/src/processing/processor/processing_error.rs @@ -0,0 +1,94 @@ +use dashcore::consensus; +use dashcore::secp256k1::hashes::hex::DisplayHex; +use dashcore::sml::quorum_validation_error::QuorumValidationError; +use crate::processing::CoreProviderError; + +#[warn(non_camel_case_types)] +#[derive(Clone, Debug, Eq, PartialEq)] +#[ferment_macro::export] +pub enum ProcessingError { + PersistInRetrieval([u8; 32], [u8; 32]), + LocallyStored(u32, [u8; 32]), + ParseError(String), + HasNoBaseBlockHash([u8; 32]), + UnknownBlockHash([u8; 32]), + InvalidResult(String), + CoreProvider(CoreProviderError), + MissingLists(String), + EncodeError(String), + DecodeError(String), + QuorumValidationError(QuorumValidationError), +} +impl std::fmt::Display for ProcessingError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.string_value()) + } +} + +impl std::error::Error for ProcessingError {} + +// impl From for ProcessingError { +// fn from(value: bls_signatures::BlsError) -> Self { +// ProcessingError::ParseError(format!("{value}")) +// } +// } + +impl From for ProcessingError { + fn from(value: dashcore::secp256k1::Error) -> Self { + ProcessingError::ParseError(format!("{value}")) + } +} + +impl From for ProcessingError { + fn from(value: dashcore::hashes::hex::Error) -> Self { + ProcessingError::ParseError(format!("{value}")) + } +} + +impl From for ProcessingError { + fn from(value: CoreProviderError) -> Self { + ProcessingError::CoreProvider(value) + } +} + +impl From for ProcessingError { + fn from(value: QuorumValidationError) -> Self { + ProcessingError::QuorumValidationError(value) + } +} + +impl From for ProcessingError { + fn from(value: consensus::encode::Error) -> Self { + ProcessingError::EncodeError(value.to_string()) + } +} + +#[ferment_macro::export] +impl ProcessingError { + pub fn string_value(&self) -> String { + match self { + ProcessingError::PersistInRetrieval(base_block_hash, block_hash) => + format!("PersistInRetrieval({}..{})", base_block_hash.to_lower_hex_string(), block_hash.to_lower_hex_string()), + ProcessingError::LocallyStored(block_height, block_hash) => + format!("LocallyStored({}: {})", block_height, block_hash.to_lower_hex_string()), + ProcessingError::ParseError(message) => + format!("ParseError({message})"), + ProcessingError::HasNoBaseBlockHash(block_hash) => + format!("HasNoBaseBlockHash({}", block_hash.to_lower_hex_string()), + ProcessingError::UnknownBlockHash(block_hash) => + format!("UnknownBlockHash({})", block_hash.to_lower_hex_string()), + ProcessingError::InvalidResult(message) => + format!("InvalidResult({message})"), + ProcessingError::CoreProvider(err) => + format!("CoreProvider({err})"), + ProcessingError::MissingLists(message) => + format!("MissingLists({message})"), + ProcessingError::QuorumValidationError(quorum_validation_error) => + format!("QuorumValidationError({quorum_validation_error})"), + ProcessingError::EncodeError(encode_error) => + format!("EncodeError({encode_error})"), + ProcessingError::DecodeError(encode_error) => + format!("DecodeError({encode_error})"), + } + } +} \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/processing/processor_cache.rs b/dash-spv-masternode-processor/src/processing/processor_cache.rs deleted file mode 100644 index 3546dbd5..00000000 --- a/dash-spv-masternode-processor/src/processing/processor_cache.rs +++ /dev/null @@ -1,99 +0,0 @@ -use std::collections::BTreeMap; -use crate::chain::common; -use crate::crypto::{UInt256, UInt768}; -use crate::models; - -#[derive(Clone, Default)] -pub struct MasternodeProcessorCache { - pub llmq_members: BTreeMap>>, - pub llmq_indexed_members: BTreeMap>>, - pub mn_lists: BTreeMap, - pub llmq_snapshots: BTreeMap, - pub cl_signatures: BTreeMap, - pub needed_masternode_lists: Vec, -} - -impl std::fmt::Debug for MasternodeProcessorCache { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("MasternodeProcessorCache") - .field("llmq_members", &self.llmq_members) - .field("llmq_indexed_members", &self.llmq_indexed_members) - .field("llmq_snapshots", &self.llmq_snapshots) - .field("mn_lists", &self.mn_lists) - .field("cl_signatures", &self.cl_signatures) - .field("needed_masternode_lists", &self.needed_masternode_lists) - .finish() - } -} - -impl MasternodeProcessorCache { - pub fn clear(&mut self) { - self.llmq_members.clear(); - self.llmq_indexed_members.clear(); - self.mn_lists.clear(); - self.llmq_snapshots.clear(); - self.needed_masternode_lists.clear(); - self.cl_signatures.clear(); - } - pub fn add_masternode_list(&mut self, block_hash: UInt256, list: models::MasternodeList) { - self.mn_lists.insert(block_hash, list); - } - pub fn remove_masternode_list(&mut self, block_hash: &UInt256) { - self.mn_lists.remove(block_hash); - } - pub fn add_snapshot(&mut self, block_hash: UInt256, snapshot: models::LLMQSnapshot) { - self.llmq_snapshots.insert(block_hash, snapshot); - } - pub fn remove_snapshot(&mut self, block_hash: &UInt256) { - self.llmq_snapshots.remove(block_hash); - } - pub fn add_cl_signature(&mut self, block_hash: UInt256, cl_signature: UInt768) { - self.cl_signatures.insert(block_hash, cl_signature); - } - pub fn remove_cl_signature(&mut self, block_hash: &UInt256) { - self.cl_signatures.remove(block_hash); - } - pub fn get_quorum_members_of_type( - &mut self, - r#type: common::LLMQType, - ) -> Option<&mut BTreeMap>> { - self.llmq_members.get_mut(&r#type) - } - - pub fn get_indexed_quorum_members_of_type( - &mut self, - r#type: common::LLMQType, - ) -> Option<&mut BTreeMap>> { - self.llmq_indexed_members.get_mut(&r#type) - } - - pub fn get_quorum_members( - &mut self, - r#type: common::LLMQType, - block_hash: UInt256, - ) -> Option> { - let map_by_type_opt = self.get_quorum_members_of_type(r#type); - if map_by_type_opt.is_some() { - if let Some(members) = map_by_type_opt.as_ref().unwrap().get(&block_hash) { - return Some(members.clone()); - } - } - None - } - - pub fn remove_quorum_members(&mut self, block_hash: &UInt256) { - self.llmq_members.iter_mut().for_each(|(llmq_type, map)| { - map.remove(block_hash); - }); - self.llmq_indexed_members.iter_mut().for_each(|(llmq_type, map)| { - let empties = map - .iter() - .filter(|&(&k, _)| k.hash == *block_hash) - .map(|(k, _)| *k) - .collect::>(); - empties.iter().for_each(|h| { - map.remove(h); - }); - }); - } -} diff --git a/dash-spv-masternode-processor/src/processing/qr_info_result.rs b/dash-spv-masternode-processor/src/processing/qr_info_result.rs deleted file mode 100644 index d23539dd..00000000 --- a/dash-spv-masternode-processor/src/processing/qr_info_result.rs +++ /dev/null @@ -1,50 +0,0 @@ -use crate::models; -use crate::processing::{MNListDiffResult, ProcessingError}; - -#[derive(Debug)] -pub struct QRInfoResult { - pub error_status: ProcessingError, - pub result_at_tip: MNListDiffResult, - pub result_at_h: MNListDiffResult, - pub result_at_h_c: MNListDiffResult, - pub result_at_h_2c: MNListDiffResult, - pub result_at_h_3c: MNListDiffResult, - pub result_at_h_4c: Option, - - pub snapshot_at_h_c: models::LLMQSnapshot, - pub snapshot_at_h_2c: models::LLMQSnapshot, - pub snapshot_at_h_3c: models::LLMQSnapshot, - pub snapshot_at_h_4c: Option, - - pub extra_share: bool, - pub last_quorum_per_index: Vec, - pub quorum_snapshot_list: Vec, - pub mn_list_diff_list: Vec, -} -impl Default for QRInfoResult { - fn default() -> Self { - Self { - error_status: ProcessingError::None, - result_at_tip: Default::default(), - result_at_h: Default::default(), - result_at_h_c: Default::default(), - result_at_h_2c: Default::default(), - result_at_h_3c: Default::default(), - result_at_h_4c: None, - snapshot_at_h_c: Default::default(), - snapshot_at_h_2c: Default::default(), - snapshot_at_h_3c: Default::default(), - snapshot_at_h_4c: None, - extra_share: false, - last_quorum_per_index: vec![], - quorum_snapshot_list: vec![], - mn_list_diff_list: vec![], - } - } -} - -impl QRInfoResult { - pub fn default_with_error(error: ProcessingError) -> Self { - Self { error_status: error, ..Self::default() } - } -} diff --git a/dash-spv-masternode-processor/src/test_helpers.rs b/dash-spv-masternode-processor/src/test_helpers.rs new file mode 100644 index 00000000..67cf7cad --- /dev/null +++ b/dash-spv-masternode-processor/src/test_helpers.rs @@ -0,0 +1,53 @@ +use std::{env, fs}; +use std::io::Read; +use std::num::ParseIntError; +use dashcore::hashes::hex::FromHex; + +pub fn load_message(chain_id: T, filename: &str) -> Vec { + let name = format!("{}/{}", chain_id.to_string(), filename); + message_from_file(name.as_str()) +} + + +pub fn get_file_as_byte_vec(filename: &str) -> Vec { + //println!("get_file_as_byte_vec: {}", filename); + let mut f = fs::File::open(&filename).expect("no file found"); + let metadata = fs::metadata(&filename).expect("unable to read metadata"); + let mut buffer = vec![0; metadata.len() as usize]; + f.read_exact(&mut buffer).expect("buffer overflow"); + buffer +} +pub fn message_from_file(name: &str) -> Vec { + let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); + let filepath = format!("{}/files/{}", crate_dir, name); + println!("{:?}", filepath); + get_file_as_byte_vec(&filepath) +} + + + + + +pub fn block_hash_to_block_hash(block_hash: String) -> [u8; 32] { + <[u8; 32]>::from_hex(block_hash.as_str()).unwrap() +} + +pub fn decode_hex_to_vec(s: &str) -> Vec { + (0..s.len()) + .step_by(2) + .map(|i| u8::from_str_radix(&s[i..i + 2], 16).unwrap()) + .collect() +} + +pub fn decode_hex(s: &str) -> Result, ParseIntError> { + (0..s.len()) + .step_by(2) + .map(|i| u8::from_str_radix(&s[i..i + 2], 16)) + .collect() +} + +fn vec_to_arr(v: Vec) -> [T; N] { + v.try_into() + .unwrap_or_else(|v: Vec| panic!("Expected a Vec of length {} but it was {}", N, v.len())) +} + diff --git a/dash-spv-masternode-processor/src/tests/bindings/keys.rs b/dash-spv-masternode-processor/src/tests/bindings/keys.rs deleted file mode 100644 index 7c0fb1da..00000000 --- a/dash-spv-masternode-processor/src/tests/bindings/keys.rs +++ /dev/null @@ -1,83 +0,0 @@ -use std::ffi::CString; -use hashes::hex::{FromHex, ToHex}; -use crate::bindings::keys::{key_bls_chaincode, key_bls_public_key, key_bls_with_bip32_seed_data, key_create_from_extended_public_key_data, key_extended_public_key_data, key_private_key_at_index_path, key_with_private_key}; -use crate::chain::common::ChainType; -use crate::chain::derivation::{IIndexPath, IndexPath}; -use crate::crypto::byte_util::ConstDecodable; -use crate::crypto::{UInt256, UInt384}; -use crate::ffi::IndexPathData; -use crate::keys::KeyKind; -use crate::types::opaque_key::OpaqueKey; -#[cfg(feature = "use_serde")] -use serde::{Deserialize, Deserializer, Serialize, Serializer}; - -#[test] -fn test_keys() { - let key_type = KeyKind::ECDSA; - let extended_public_key_data_string = "3dc2e416b0f9fcfd74fe847ccd80f71cf961e7c4ddede29ce5e4b72a19ebccf2831ba2d803740b52e94ad4d526ff2b4340646b2ce1423545755b5825fabc741d1d74c155d7"; - let extended_public_key_data = Vec::from_hex(extended_public_key_data_string).unwrap(); - - let extended_public_key = unsafe { key_create_from_extended_public_key_data(extended_public_key_data.as_ptr(), extended_public_key_data.len(), key_type) }; - println!("extended_public_key: {:?}", extended_public_key); - let extended_public_key_data = unsafe { key_extended_public_key_data(extended_public_key) }; - println!("extended_public_key_data: {:?}", extended_public_key_data); - let seed_bytes = unsafe { std::slice::from_raw_parts(extended_public_key_data.ptr, extended_public_key_data.len) }; - println!("extended_public_key_data: {:?}", seed_bytes.to_hex()); - assert_eq!(seed_bytes.to_hex(), extended_public_key_data_string); -} - -#[test] -fn derive_bls() { - let seed = Vec::from_hex("467c2dd58bbd29427fb3c5467eee339021a87b21309eeabfe9459d31eeb6eba9b2a1213c12a173118c84fd49e8b4bf9282272d67bf7b7b394b088eab53b438bc").unwrap(); - let index_path = IndexPath::index_path_with_index(0u32); - let indexes = vec![ - UInt256::from_hex("0900000000000000000000000000000000000000000000000000000000000000").unwrap(), - UInt256::from_hex("0500000000000000000000000000000000000000000000000000000000000000").unwrap(), - UInt256::from_hex("0500000000000000000000000000000000000000000000000000000000000000").unwrap(), - UInt256::from_hex("0000000000000000000000000000000000000000000000000000000000000000").unwrap(), - UInt256::from_hex("0100000000000000000000000000000000000000000000000000000000000000").unwrap(), - ]; - let hardened = vec![true, true, true, true, true]; - let indexes = vec![0]; - let index_path_data = IndexPathData { - indexes: indexes.as_ptr(), - len: 1, - }; - let indexes = b"09000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000"; - - unsafe { - let key = key_private_key_at_index_path(seed.as_ptr(), seed.len(), KeyKind::BLS, &index_path_data as *const IndexPathData, indexes.as_ptr(), hardened.as_ptr(), 5); - let ext_pub = key_extended_public_key_data(key); - println!("{:?}", ext_pub); - } -} - -#[test] -fn bls_chaincode() { - let seed = [1, 50, 6, 244, 24, 199, 1, 25]; - let key_pair = unsafe { key_bls_with_bip32_seed_data(seed.as_ptr(), seed.len(), true) }; - let chain_code = unsafe { key_bls_chaincode(key_pair) }; - let chaincode = UInt256::from_const(chain_code.ptr).unwrap(); - assert_eq!(chaincode.0.to_hex(), "d8b12555b4cc5578951e4a7c80031e22019cc0dce168b3ed88115311b8feb1e3", "Testing BLS derivation chain code"); - -} - -#[test] -fn bls_operator_key() { - //return key_with_private_key([key UTF8String], keyType, chainType); - let operator_key_hex_string = "0fc63f4e6d7572a6c33465525b5c3323f57036873dd37c98c393267c58b50533"; - let str = CString::new(operator_key_hex_string).unwrap(); - let key = unsafe { key_with_private_key(str.as_ptr(), KeyKind::BLS, ChainType::TestNet.into()) }; - - unsafe { - match key.as_ref() { - Some(OpaqueKey::BLSLegacy(bls_key)) => { - let pubkey = key_bls_public_key(*bls_key); - let k = UInt384::from_const(pubkey.ptr).unwrap(); - let tst = UInt384::from_hex("139b654f0b1c031e1cf2b934c2d895178875cfe7c6a4f6758f02bc66eea7fc292d0040701acbe31f5e14a911cb061a2f").unwrap(); - assert_eq!(tst, k); - }, - _ => {} - } - } -} diff --git a/dash-spv-masternode-processor/src/tests/bindings/mod.rs b/dash-spv-masternode-processor/src/tests/bindings/mod.rs deleted file mode 100644 index 703bc087..00000000 --- a/dash-spv-masternode-processor/src/tests/bindings/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod keys; diff --git a/dash-spv-masternode-processor/src/tests/hashes/hashes.rs b/dash-spv-masternode-processor/src/tests/hashes/hashes.rs index c5330c93..af67b4c5 100644 --- a/dash-spv-masternode-processor/src/tests/hashes/hashes.rs +++ b/dash-spv-masternode-processor/src/tests/hashes/hashes.rs @@ -1,14 +1,15 @@ use base64::{alphabet, Engine}; use base64::engine::{GeneralPurpose, GeneralPurposeConfig}; -use hashes::hex::{FromHex, ToHex}; -use crate::crypto::{UInt160, UInt256, UInt512}; -use crate::util::base58; +use dashcore::hashes::hex::FromHex; +use dashcore::hashes::{ripemd160, sha1, sha256, sha256d, sha512, Hash}; +use dashcore::prelude::DisplayHex; +use dash_spv_crypto::util::base58; #[test] fn test_base64_hash_size() { - let hash = UInt256::sha256d(Vec::from_hex("aaaa").unwrap()); + let hash = sha256d::Hash::hash(Vec::from_hex("aaaa").unwrap().as_ref()).to_byte_array(); let base64_engine = GeneralPurpose::new(&alphabet::STANDARD, GeneralPurposeConfig::default()); - let base64_data = base64_engine.encode(hash.0); + let base64_data = base64_engine.encode(hash); assert_eq!(base64_data.len(), 44, "The size of the base64 should be 44"); } #[test] @@ -17,44 +18,37 @@ fn test_blake3() { assert_eq!(md.to_hex().as_str(), "af1349b9f5f9a1a6a0404dea36dcc9499bcb25c9adc112b7cc9a93cae41f3262", "blake 3 err"); } -/*#[test] -fn test_blake512() { - let input = UInt512::from_hex("020000002cc0081be5039a54b686d24d5d8747ee9770d9973ec1ace02e5c0500000000008d7139724b11c52995db4370284c998b9114154b120ad3486f1a360a1d4253d310d40e55b8f70a1be8e32300").unwrap(); - let md = blake3::hash(&input.0); - assert_eq!(md.to_hex().as_str(), "728309A76516B83D4E326DB3C6782722129C2835A25DE336DFFC16A0C10E4EBA654D65A86C7CC606B80BEFCC665CDD9B2D966D6BDCD2179F226F36925CC1AB8F", "blake 512 err"); -}*/ - #[test] fn test_x11() { let x11 = "020000002cc0081be5039a54b686d24d5d8747ee9770d9973ec1ace02e5c0500000000008d7139724b11c52995db4370284c998b9114154b120ad3486f1a360a1d4253d310d40e55b8f70a1be8e32300"; let input = Vec::from_hex(x11).unwrap(); let output = rs_x11_hash::get_x11_hash(input); - assert_eq!("f29c0f286fd8071669286c6987eb941181134ff5f3978bf89f34070000000000", output.to_hex(), "x11 error"); + assert_eq!("f29c0f286fd8071669286c6987eb941181134ff5f3978bf89f34070000000000", output.to_lower_hex_string(), "x11 error"); let x11 = "040000002e3df23eec5cd6a86edd509539028e2c3a3dc05315eb28f2baa43218ca080000b3a56d65316ffdb006163240a4380e94a4c2d8c0f0b3b2c1ddc486fae15ed065ba968054ffff7f2000000000"; let input = Vec::from_hex(x11).unwrap(); let output = rs_x11_hash::get_x11_hash(input); - assert_eq!("2990cb88c53c588b58188f6868972ec37e955903940ab7604da44c3291204cce", output.to_hex(), "x11 error"); + assert_eq!("2990cb88c53c588b58188f6868972ec37e955903940ab7604da44c3291204cce", output.to_lower_hex_string(), "x11 error"); let x11 = "040000002e3df23eec5cd6a86edd509539028e2c3a3dc05315eb28f2baa43218ca080000b3a56d65316ffdb006163240a4380e94a4c2d8c0f0b3b2c1ddc486fae15ed065ba968054ffff7f2001000000"; let input = Vec::from_hex(x11).unwrap(); let output = rs_x11_hash::get_x11_hash(input); - assert_eq!("412a340f4a1442b42f703523f2c5c041d5eed7dfad6bd7eda16b8d55e575f7df", output.to_hex(), "x11 error"); + assert_eq!("412a340f4a1442b42f703523f2c5c041d5eed7dfad6bd7eda16b8d55e575f7df", output.to_lower_hex_string(), "x11 error"); let x11 = "040000002e3df23eec5cd6a86edd509539028e2c3a3dc05315eb28f2baa43218ca080000b3a56d65316ffdb006163240a4380e94a4c2d8c0f0b3b2c1ddc486fae15ed065ba968054ffff7f2002000000"; let input = Vec::from_hex(x11).unwrap(); let output = rs_x11_hash::get_x11_hash(input); - assert_eq!("000739d9da507b3acb949f21fe10ad424abbad5b4c46789285b05fe36df5c5b0", output.to_hex(), "x11 error"); + assert_eq!("000739d9da507b3acb949f21fe10ad424abbad5b4c46789285b05fe36df5c5b0", output.to_lower_hex_string(), "x11 error"); let x11 = "040000002e3df23eec5cd6a86edd509539028e2c3a3dc05315eb28f2baa43218ca080000b3a56d65316ffdb006163240a4380e94a4c2d8c0f0b3b2c1ddc486fae15ed065ba968054ffff7f2003000000"; let input = Vec::from_hex(x11).unwrap(); let output = rs_x11_hash::get_x11_hash(input); - assert_eq!("90ec0543cd91297e7ad3d3141a404fb55f787b3058aca2b45ab0fc20d06409c6", output.to_hex(), "x11 error"); + assert_eq!("90ec0543cd91297e7ad3d3141a404fb55f787b3058aca2b45ab0fc20d06409c6", output.to_lower_hex_string(), "x11 error"); let x11 = "040000002e3df23eec5cd6a86edd509539028e2c3a3dc05315eb28f2baa43218ca080000b3a56d65316ffdb006163240a4380e94a4c2d8c0f0b3b2c1ddc486fae15ed065ba968054ffff7f2004000000"; let input = Vec::from_hex(x11).unwrap(); let output = rs_x11_hash::get_x11_hash(input); - assert_eq!("eee8ff78056e3b0cd35cd8e267fa871270a183a5d05c764d8c2047b7c3cca014", output.to_hex(), "x11 error"); + assert_eq!("eee8ff78056e3b0cd35cd8e267fa871270a183a5d05c764d8c2047b7c3cca014", output.to_lower_hex_string(), "x11 error"); } #[test] @@ -62,7 +56,7 @@ fn test_base58() { let s = base58::from("Ƀ#&$@*^(*#!^"); assert!(s.is_err(), "base58::from"); let s = base58::from(""); - assert_eq!(s.unwrap().to_hex(), "", "base58::from"); + assert_eq!(s.unwrap().to_lower_hex_string(), "", "base58::from"); let s = base58::from("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"); assert_eq!(base58::encode_slice(&s.unwrap()), "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", "base58"); let s = base58::from("1111111111111111111111111111111111111111111111111111111111111111111"); @@ -84,111 +78,111 @@ fn test_base58() { #[test] fn test_sha1() { assert_eq!( - UInt160::from_hex("6fc2e25172cb15193cb1c6d48f607d42c1d2a215").unwrap(), - UInt160::sha1("Free online SHA1 Calculator, type text here...".as_bytes()), + <[u8; 20]>::from_hex("6fc2e25172cb15193cb1c6d48f607d42c1d2a215").unwrap(), + sha1::Hash::hash(b"Free online SHA1 Calculator, type text here...").to_byte_array(), "sha1 error"); assert_eq!( - UInt160::from_hex("085194658a9235b2951a83d1b826b987e9385aa3").unwrap(), - UInt160::sha1("this is some text to test the sha1 implementation with more than 64bytes of data since it's internal digest buffer is 64bytes in size".as_bytes()), + <[u8; 20]>::from_hex("085194658a9235b2951a83d1b826b987e9385aa3").unwrap(), + sha1::Hash::hash(b"this is some text to test the sha1 implementation with more than 64bytes of data since it's internal digest buffer is 64bytes in size").to_byte_array(), "sha1 error"); assert_eq!( - UInt160::from_hex("245be30091fd392fe191f4bfcec22dcb30a03ae6").unwrap(), - UInt160::sha1("123456789012345678901234567890123456789012345678901234567890".as_bytes()), + <[u8; 20]>::from_hex("245be30091fd392fe191f4bfcec22dcb30a03ae6").unwrap(), + sha1::Hash::hash(b"123456789012345678901234567890123456789012345678901234567890").to_byte_array(), "sha1 error"); assert_eq!( - UInt160::from_hex("c71490fc24aa3d19e11282da77032dd9cdb33103").unwrap(), - UInt160::sha1("1234567890123456789012345678901234567890123456789012345678901234".as_bytes()), + <[u8; 20]>::from_hex("c71490fc24aa3d19e11282da77032dd9cdb33103").unwrap(), + sha1::Hash::hash(b"1234567890123456789012345678901234567890123456789012345678901234").to_byte_array(), "sha1 error"); assert_eq!( - UInt160::from_hex("da39a3ee5e6b4b0d3255bfef95601890afd80709").unwrap(), - UInt160::sha1("".as_bytes()), + <[u8; 20]>::from_hex("da39a3ee5e6b4b0d3255bfef95601890afd80709").unwrap(), + sha1::Hash::hash(b"").to_byte_array(), "sha1 error"); assert_eq!( - UInt160::from_hex("86f7e437faa5a7fce15d1ddcb9eaeaea377667b8").unwrap(), - UInt160::sha1("a".as_bytes()), + <[u8; 20]>::from_hex("86f7e437faa5a7fce15d1ddcb9eaeaea377667b8").unwrap(), + sha1::Hash::hash(b"a").to_byte_array(), "sha1 error"); } #[test] fn test_sha256() { assert_eq!( - UInt256::from_hex("43fd9deb93f6e14d41826604514e3d7873a549ac87aebebf3d1c10ad6eb057d0").unwrap(), - UInt256::sha256("Free online SHA256 Calculator, type text here...".as_bytes()), + <[u8; 32]>::from_hex("43fd9deb93f6e14d41826604514e3d7873a549ac87aebebf3d1c10ad6eb057d0").unwrap(), + sha256::Hash::hash(b"Free online SHA256 Calculator, type text here...").to_byte_array(), "sha256 error"); assert_eq!( - UInt256::from_hex("40fd0933df2e7747f19f7d39cd30e1cb89810a7e470638a5f623669f3de9edd4").unwrap(), - UInt256::sha256("this is some text to test the sha256 implementation with more than 64bytes of data since it's internal digest buffer is 64bytes in size".as_bytes()), + <[u8; 32]>::from_hex("40fd0933df2e7747f19f7d39cd30e1cb89810a7e470638a5f623669f3de9edd4").unwrap(), + sha256::Hash::hash(b"this is some text to test the sha256 implementation with more than 64bytes of data since it's internal digest buffer is 64bytes in size").to_byte_array(), "sha256 error"); assert_eq!( - UInt256::from_hex("decc538c077786966ac863b5532c4027b8587ff40f6e3103379af62b44eae44d").unwrap(), - UInt256::sha256("123456789012345678901234567890123456789012345678901234567890".as_bytes()), + <[u8; 32]>::from_hex("decc538c077786966ac863b5532c4027b8587ff40f6e3103379af62b44eae44d").unwrap(), + sha256::Hash::hash(b"123456789012345678901234567890123456789012345678901234567890").to_byte_array(), "sha256 error"); assert_eq!( - UInt256::from_hex("676491965ed3ec50cb7a63ee96315480a95c54426b0b72bca8a0d4ad1285ad55").unwrap(), - UInt256::sha256("1234567890123456789012345678901234567890123456789012345678901234".as_bytes()), + <[u8; 32]>::from_hex("676491965ed3ec50cb7a63ee96315480a95c54426b0b72bca8a0d4ad1285ad55").unwrap(), + sha256::Hash::hash(b"1234567890123456789012345678901234567890123456789012345678901234").to_byte_array(), "sha256 error"); assert_eq!( - UInt256::from_hex("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855").unwrap(), - UInt256::sha256("".as_bytes()), + <[u8; 32]>::from_hex("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855").unwrap(), + sha256::Hash::hash(b"").to_byte_array(), "sha256 error"); assert_eq!( - UInt256::from_hex("ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb").unwrap(), - UInt256::sha256("a".as_bytes()), + <[u8; 32]>::from_hex("ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb").unwrap(), + sha256::Hash::hash(b"a").to_byte_array(), "sha256 error"); } #[test] fn test_sha512() { assert_eq!( - UInt512::from_hex("04f1154135eecbe42e9adc8e1d532f9c607a8447b786377db8447d11a5b2232cdd419b8639224f787a51d110f72591f96451a1bb511c4a829ed0a2ec891321f3").unwrap(), - UInt512::sha512("Free online SHA512 Calculator, type text here...".as_bytes()), + <[u8; 64]>::from_hex("04f1154135eecbe42e9adc8e1d532f9c607a8447b786377db8447d11a5b2232cdd419b8639224f787a51d110f72591f96451a1bb511c4a829ed0a2ec891321f3").unwrap(), + sha512::Hash::hash(b"Free online SHA512 Calculator, type text here...").to_byte_array(), "sha512 error"); assert_eq!( - UInt512::from_hex("9bd2dc7b05fbbe9934cb3289b6e06b8ca9fd7a55e6de5db7e1e4eeddc6629b575307367cd0183a4461d7eb2dfc6a27e41e8b70f6598ebcc7710911d4fb16a390").unwrap(), - UInt512::sha512("this is some text to test the sha512 implementation with more than 128bytes of data since it's internal digest buffer is 128bytes in size".as_bytes()), + <[u8; 64]>::from_hex("9bd2dc7b05fbbe9934cb3289b6e06b8ca9fd7a55e6de5db7e1e4eeddc6629b575307367cd0183a4461d7eb2dfc6a27e41e8b70f6598ebcc7710911d4fb16a390").unwrap(), + sha512::Hash::hash(b"this is some text to test the sha512 implementation with more than 128bytes of data since it's internal digest buffer is 128bytes in size").to_byte_array(), "sha512 error"); assert_eq!( - UInt512::from_hex("0d9a7df5b6a6ad20da519effda888a7344b6c0c7adcc8e2d504b4af27aaaacd4e7111c713f71769539629463cb58c86136c521b0414a3c0edf7dc6349c6edaf3").unwrap(), - UInt512::sha512("123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890".as_bytes()), + <[u8; 64]>::from_hex("0d9a7df5b6a6ad20da519effda888a7344b6c0c7adcc8e2d504b4af27aaaacd4e7111c713f71769539629463cb58c86136c521b0414a3c0edf7dc6349c6edaf3").unwrap(), + sha512::Hash::hash(b"123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890").to_byte_array(), "sha512 error"); assert_eq!( - UInt512::from_hex("222b2f64c285e66996769b5a03ef863cfd3b63ddb0727788291695e8fb84572e4bfe5a80674a41fd72eeb48592c9c79f44ae992c76ed1b0d55a670a83fc99ec6").unwrap(), - UInt512::sha512("12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678".as_bytes()), + <[u8; 64]>::from_hex("222b2f64c285e66996769b5a03ef863cfd3b63ddb0727788291695e8fb84572e4bfe5a80674a41fd72eeb48592c9c79f44ae992c76ed1b0d55a670a83fc99ec6").unwrap(), + sha512::Hash::hash(b"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678").to_byte_array(), "sha512 error"); assert_eq!( - UInt512::from_hex("cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e").unwrap(), - UInt512::sha512("".as_bytes()), + <[u8; 64]>::from_hex("cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e").unwrap(), + sha512::Hash::hash(b"").to_byte_array(), "sha512 error"); assert_eq!( - UInt512::from_hex("1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75").unwrap(), - UInt512::sha512("a".as_bytes()), + <[u8; 64]>::from_hex("1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75").unwrap(), + sha512::Hash::hash(b"a").to_byte_array(), "sha512 error"); } #[test] fn test_ripemd160() { assert_eq!( - UInt160::from_hex("9501a56fb829132b8748f0ccc491f0ecbc7f945b").unwrap(), - UInt160::ripemd160("Free online RIPEMD160 Calculator, type text here...".as_bytes()), + <[u8; 20]>::from_hex("9501a56fb829132b8748f0ccc491f0ecbc7f945b").unwrap(), + ripemd160::Hash::hash(b"Free online RIPEMD160 Calculator, type text here...").to_byte_array(), "ripemd160 error"); assert_eq!( - UInt160::from_hex("4402eff42157106a5d92e4d946185856fbc50e09").unwrap(), - UInt160::ripemd160("this is some text to test the ripemd160 implementation with more than 64bytes of data since it's internal digest buffer is 64bytes in size".as_bytes()), + <[u8; 20]>::from_hex("4402eff42157106a5d92e4d946185856fbc50e09").unwrap(), + ripemd160::Hash::hash(b"this is some text to test the ripemd160 implementation with more than 64bytes of data since it's internal digest buffer is 64bytes in size").to_byte_array(), "ripemd160 error"); assert_eq!( - UInt160::from_hex("00263b999714e756fa5d02814b842a2634dd31ac").unwrap(), - UInt160::ripemd160("123456789012345678901234567890123456789012345678901234567890".as_bytes()), + <[u8; 20]>::from_hex("00263b999714e756fa5d02814b842a2634dd31ac").unwrap(), + ripemd160::Hash::hash(b"123456789012345678901234567890123456789012345678901234567890").to_byte_array(), "ripemd160 error"); assert_eq!( - UInt160::from_hex("fa8c1a78eb763bb97d5ea14ce9303d1ce2f33454").unwrap(), - UInt160::ripemd160("1234567890123456789012345678901234567890123456789012345678901234".as_bytes()), + <[u8; 20]>::from_hex("fa8c1a78eb763bb97d5ea14ce9303d1ce2f33454").unwrap(), + ripemd160::Hash::hash(b"1234567890123456789012345678901234567890123456789012345678901234").to_byte_array(), "ripemd160 error"); assert_eq!( - UInt160::from_hex("9c1185a5c5e9fc54612808977ee8f548b2258d31").unwrap(), - UInt160::ripemd160("".as_bytes()), + <[u8; 20]>::from_hex("9c1185a5c5e9fc54612808977ee8f548b2258d31").unwrap(), + ripemd160::Hash::hash(b"").to_byte_array(), "ripemd160 error"); assert_eq!( - UInt160::from_hex("0bdc9d2d256b3ee9daae347be6f4dc835a467ffe").unwrap(), - UInt160::ripemd160("a".as_bytes()), + <[u8; 20]>::from_hex("0bdc9d2d256b3ee9daae347be6f4dc835a467ffe").unwrap(), + ripemd160::Hash::hash(b"a").to_byte_array(), "ripemd160 error"); } diff --git a/dash-spv-masternode-processor/src/tests/hashes/math.rs b/dash-spv-masternode-processor/src/tests/hashes/math.rs index cb64f57a..edc0d73f 100644 --- a/dash-spv-masternode-processor/src/tests/hashes/math.rs +++ b/dash-spv-masternode-processor/src/tests/hashes/math.rs @@ -1,26 +1,25 @@ use std::collections::BTreeMap; -use hashes::hex::FromHex; -use crate::crypto::byte_util::Reversable; -use crate::crypto::UInt256; +use dashcore::hashes::hex::FromHex; +use dash_spv_crypto::crypto::byte_util::Reversed; #[test] fn test_bytes_reverse_comparison() { let mut vec = vec![ - UInt256::from_hex("d2426992844e311149b2962f4ea991656ea5d1b36541e314e251915a6ffa1316").unwrap(), - UInt256::from_hex("30c14c1d75694404dbc96d44d1c63f28bf685d27e44ef753883c5eb0742c5805").unwrap(), - UInt256::from_hex("631a5e99e59bab2bf06e4ec9874b3c3ced59187dc724c689ffa0fe99f2d3f210").unwrap(), - UInt256::from_hex("113673823cf38eb56f30795d7f830b2d82b70a35b96812ad79d0889465b69df3").unwrap(), - UInt256::from_hex("0e01a796d779a8494be44311d6daf07fdae8642b45a9b866024cd97d8dfd3545").unwrap(), - UInt256::from_hex("feb146a52985cbf69f0a46b3a56f5f505538440bd42e993a0685a11fac1fdda5").unwrap(), - UInt256::from_hex("48d665ade991114900349635c788775204057220728212e2b6b63e3545f67007").unwrap(), - UInt256::from_hex("adcc454391d9f53e6fa523e047db5f335e38d9ead70dc8e4e648118c285d1d77").unwrap(), - UInt256::from_hex("aadd2eac24d6cc9a0b439d3c9d5483b0ed64ebda21786760bb375efacd6e2a67").unwrap(), - UInt256::from_hex("a90df0c30b2002a85cef6b695b986a3815c7dc82027c6896b7747258675a76da").unwrap(), - UInt256::from_hex("e13fbad0ab0bca68cbcd4d68127de06037b4007c5acbe8550edcd60b7d4503e8").unwrap(), - UInt256::from_hex("200ccffb2ef1da266efda63b35bc80bc8a547f29af3b8108f81ab222a1ceac35").unwrap(), - UInt256::from_hex("21173e00737bac467d09effb15959d0459b853160805057a3975436d3e206591").unwrap(), - UInt256::from_hex("321a1300b3ec63b3082d1626c7377d3c9e4e332eadefe12073f5e17b5099a49e").unwrap(), + <[u8; 32]>::from_hex("d2426992844e311149b2962f4ea991656ea5d1b36541e314e251915a6ffa1316").unwrap(), + <[u8; 32]>::from_hex("30c14c1d75694404dbc96d44d1c63f28bf685d27e44ef753883c5eb0742c5805").unwrap(), + <[u8; 32]>::from_hex("631a5e99e59bab2bf06e4ec9874b3c3ced59187dc724c689ffa0fe99f2d3f210").unwrap(), + <[u8; 32]>::from_hex("113673823cf38eb56f30795d7f830b2d82b70a35b96812ad79d0889465b69df3").unwrap(), + <[u8; 32]>::from_hex("0e01a796d779a8494be44311d6daf07fdae8642b45a9b866024cd97d8dfd3545").unwrap(), + <[u8; 32]>::from_hex("feb146a52985cbf69f0a46b3a56f5f505538440bd42e993a0685a11fac1fdda5").unwrap(), + <[u8; 32]>::from_hex("48d665ade991114900349635c788775204057220728212e2b6b63e3545f67007").unwrap(), + <[u8; 32]>::from_hex("adcc454391d9f53e6fa523e047db5f335e38d9ead70dc8e4e648118c285d1d77").unwrap(), + <[u8; 32]>::from_hex("aadd2eac24d6cc9a0b439d3c9d5483b0ed64ebda21786760bb375efacd6e2a67").unwrap(), + <[u8; 32]>::from_hex("a90df0c30b2002a85cef6b695b986a3815c7dc82027c6896b7747258675a76da").unwrap(), + <[u8; 32]>::from_hex("e13fbad0ab0bca68cbcd4d68127de06037b4007c5acbe8550edcd60b7d4503e8").unwrap(), + <[u8; 32]>::from_hex("200ccffb2ef1da266efda63b35bc80bc8a547f29af3b8108f81ab222a1ceac35").unwrap(), + <[u8; 32]>::from_hex("21173e00737bac467d09effb15959d0459b853160805057a3975436d3e206591").unwrap(), + <[u8; 32]>::from_hex("321a1300b3ec63b3082d1626c7377d3c9e4e332eadefe12073f5e17b5099a49e").unwrap(), ]; let map = vec.clone().into_iter().enumerate().map(|(i, key)| (key, i)).collect::>(); @@ -28,37 +27,37 @@ fn test_bytes_reverse_comparison() { let sorted_map_values = vec![3, 10, 9, 5, 13, 12, 7, 8, 4, 11, 0, 2, 6, 1]; let sorted_vec = vec![ - UInt256::from_hex("113673823cf38eb56f30795d7f830b2d82b70a35b96812ad79d0889465b69df3").unwrap(), - UInt256::from_hex("e13fbad0ab0bca68cbcd4d68127de06037b4007c5acbe8550edcd60b7d4503e8").unwrap(), - UInt256::from_hex("a90df0c30b2002a85cef6b695b986a3815c7dc82027c6896b7747258675a76da").unwrap(), - UInt256::from_hex("feb146a52985cbf69f0a46b3a56f5f505538440bd42e993a0685a11fac1fdda5").unwrap(), - UInt256::from_hex("321a1300b3ec63b3082d1626c7377d3c9e4e332eadefe12073f5e17b5099a49e").unwrap(), - UInt256::from_hex("21173e00737bac467d09effb15959d0459b853160805057a3975436d3e206591").unwrap(), - UInt256::from_hex("adcc454391d9f53e6fa523e047db5f335e38d9ead70dc8e4e648118c285d1d77").unwrap(), - UInt256::from_hex("aadd2eac24d6cc9a0b439d3c9d5483b0ed64ebda21786760bb375efacd6e2a67").unwrap(), - UInt256::from_hex("0e01a796d779a8494be44311d6daf07fdae8642b45a9b866024cd97d8dfd3545").unwrap(), - UInt256::from_hex("200ccffb2ef1da266efda63b35bc80bc8a547f29af3b8108f81ab222a1ceac35").unwrap(), - UInt256::from_hex("d2426992844e311149b2962f4ea991656ea5d1b36541e314e251915a6ffa1316").unwrap(), - UInt256::from_hex("631a5e99e59bab2bf06e4ec9874b3c3ced59187dc724c689ffa0fe99f2d3f210").unwrap(), - UInt256::from_hex("48d665ade991114900349635c788775204057220728212e2b6b63e3545f67007").unwrap(), - UInt256::from_hex("30c14c1d75694404dbc96d44d1c63f28bf685d27e44ef753883c5eb0742c5805").unwrap() + <[u8; 32]>::from_hex("113673823cf38eb56f30795d7f830b2d82b70a35b96812ad79d0889465b69df3").unwrap(), + <[u8; 32]>::from_hex("e13fbad0ab0bca68cbcd4d68127de06037b4007c5acbe8550edcd60b7d4503e8").unwrap(), + <[u8; 32]>::from_hex("a90df0c30b2002a85cef6b695b986a3815c7dc82027c6896b7747258675a76da").unwrap(), + <[u8; 32]>::from_hex("feb146a52985cbf69f0a46b3a56f5f505538440bd42e993a0685a11fac1fdda5").unwrap(), + <[u8; 32]>::from_hex("321a1300b3ec63b3082d1626c7377d3c9e4e332eadefe12073f5e17b5099a49e").unwrap(), + <[u8; 32]>::from_hex("21173e00737bac467d09effb15959d0459b853160805057a3975436d3e206591").unwrap(), + <[u8; 32]>::from_hex("adcc454391d9f53e6fa523e047db5f335e38d9ead70dc8e4e648118c285d1d77").unwrap(), + <[u8; 32]>::from_hex("aadd2eac24d6cc9a0b439d3c9d5483b0ed64ebda21786760bb375efacd6e2a67").unwrap(), + <[u8; 32]>::from_hex("0e01a796d779a8494be44311d6daf07fdae8642b45a9b866024cd97d8dfd3545").unwrap(), + <[u8; 32]>::from_hex("200ccffb2ef1da266efda63b35bc80bc8a547f29af3b8108f81ab222a1ceac35").unwrap(), + <[u8; 32]>::from_hex("d2426992844e311149b2962f4ea991656ea5d1b36541e314e251915a6ffa1316").unwrap(), + <[u8; 32]>::from_hex("631a5e99e59bab2bf06e4ec9874b3c3ced59187dc724c689ffa0fe99f2d3f210").unwrap(), + <[u8; 32]>::from_hex("48d665ade991114900349635c788775204057220728212e2b6b63e3545f67007").unwrap(), + <[u8; 32]>::from_hex("30c14c1d75694404dbc96d44d1c63f28bf685d27e44ef753883c5eb0742c5805").unwrap() ]; let sorted_map_keys = vec![ - UInt256::from_hex("0e01a796d779a8494be44311d6daf07fdae8642b45a9b866024cd97d8dfd3545").unwrap(), - UInt256::from_hex("113673823cf38eb56f30795d7f830b2d82b70a35b96812ad79d0889465b69df3").unwrap(), - UInt256::from_hex("200ccffb2ef1da266efda63b35bc80bc8a547f29af3b8108f81ab222a1ceac35").unwrap(), - UInt256::from_hex("21173e00737bac467d09effb15959d0459b853160805057a3975436d3e206591").unwrap(), - UInt256::from_hex("30c14c1d75694404dbc96d44d1c63f28bf685d27e44ef753883c5eb0742c5805").unwrap(), - UInt256::from_hex("321a1300b3ec63b3082d1626c7377d3c9e4e332eadefe12073f5e17b5099a49e").unwrap(), - UInt256::from_hex("48d665ade991114900349635c788775204057220728212e2b6b63e3545f67007").unwrap(), - UInt256::from_hex("631a5e99e59bab2bf06e4ec9874b3c3ced59187dc724c689ffa0fe99f2d3f210").unwrap(), - UInt256::from_hex("a90df0c30b2002a85cef6b695b986a3815c7dc82027c6896b7747258675a76da").unwrap(), - UInt256::from_hex("aadd2eac24d6cc9a0b439d3c9d5483b0ed64ebda21786760bb375efacd6e2a67").unwrap(), - UInt256::from_hex("adcc454391d9f53e6fa523e047db5f335e38d9ead70dc8e4e648118c285d1d77").unwrap(), - UInt256::from_hex("d2426992844e311149b2962f4ea991656ea5d1b36541e314e251915a6ffa1316").unwrap(), - UInt256::from_hex("e13fbad0ab0bca68cbcd4d68127de06037b4007c5acbe8550edcd60b7d4503e8").unwrap(), - UInt256::from_hex("feb146a52985cbf69f0a46b3a56f5f505538440bd42e993a0685a11fac1fdda5").unwrap(), + <[u8; 32]>::from_hex("0e01a796d779a8494be44311d6daf07fdae8642b45a9b866024cd97d8dfd3545").unwrap(), + <[u8; 32]>::from_hex("113673823cf38eb56f30795d7f830b2d82b70a35b96812ad79d0889465b69df3").unwrap(), + <[u8; 32]>::from_hex("200ccffb2ef1da266efda63b35bc80bc8a547f29af3b8108f81ab222a1ceac35").unwrap(), + <[u8; 32]>::from_hex("21173e00737bac467d09effb15959d0459b853160805057a3975436d3e206591").unwrap(), + <[u8; 32]>::from_hex("30c14c1d75694404dbc96d44d1c63f28bf685d27e44ef753883c5eb0742c5805").unwrap(), + <[u8; 32]>::from_hex("321a1300b3ec63b3082d1626c7377d3c9e4e332eadefe12073f5e17b5099a49e").unwrap(), + <[u8; 32]>::from_hex("48d665ade991114900349635c788775204057220728212e2b6b63e3545f67007").unwrap(), + <[u8; 32]>::from_hex("631a5e99e59bab2bf06e4ec9874b3c3ced59187dc724c689ffa0fe99f2d3f210").unwrap(), + <[u8; 32]>::from_hex("a90df0c30b2002a85cef6b695b986a3815c7dc82027c6896b7747258675a76da").unwrap(), + <[u8; 32]>::from_hex("aadd2eac24d6cc9a0b439d3c9d5483b0ed64ebda21786760bb375efacd6e2a67").unwrap(), + <[u8; 32]>::from_hex("adcc454391d9f53e6fa523e047db5f335e38d9ead70dc8e4e648118c285d1d77").unwrap(), + <[u8; 32]>::from_hex("d2426992844e311149b2962f4ea991656ea5d1b36541e314e251915a6ffa1316").unwrap(), + <[u8; 32]>::from_hex("e13fbad0ab0bca68cbcd4d68127de06037b4007c5acbe8550edcd60b7d4503e8").unwrap(), + <[u8; 32]>::from_hex("feb146a52985cbf69f0a46b3a56f5f505538440bd42e993a0685a11fac1fdda5").unwrap(), ]; println!("vec: {:?}", vec); @@ -106,22 +105,22 @@ fn test_bytes_reverse_comparison() { #[test] fn test_any() { let vec = vec![ - UInt256::from_hex("d2426992844e311149b2962f4ea991656ea5d1b36541e314e251915a6ffa1316").unwrap(), - UInt256::from_hex("30c14c1d75694404dbc96d44d1c63f28bf685d27e44ef753883c5eb0742c5805").unwrap(), - UInt256::from_hex("631a5e99e59bab2bf06e4ec9874b3c3ced59187dc724c689ffa0fe99f2d3f210").unwrap(), - UInt256::from_hex("113673823cf38eb56f30795d7f830b2d82b70a35b96812ad79d0889465b69df3").unwrap(), - UInt256::from_hex("0e01a796d779a8494be44311d6daf07fdae8642b45a9b866024cd97d8dfd3545").unwrap(), - UInt256::from_hex("feb146a52985cbf69f0a46b3a56f5f505538440bd42e993a0685a11fac1fdda5").unwrap(), - UInt256::from_hex("48d665ade991114900349635c788775204057220728212e2b6b63e3545f67007").unwrap(), - UInt256::from_hex("adcc454391d9f53e6fa523e047db5f335e38d9ead70dc8e4e648118c285d1d77").unwrap(), - UInt256::from_hex("aadd2eac24d6cc9a0b439d3c9d5483b0ed64ebda21786760bb375efacd6e2a67").unwrap(), - UInt256::from_hex("a90df0c30b2002a85cef6b695b986a3815c7dc82027c6896b7747258675a76da").unwrap(), - UInt256::from_hex("e13fbad0ab0bca68cbcd4d68127de06037b4007c5acbe8550edcd60b7d4503e8").unwrap(), - UInt256::from_hex("200ccffb2ef1da266efda63b35bc80bc8a547f29af3b8108f81ab222a1ceac35").unwrap(), - UInt256::from_hex("21173e00737bac467d09effb15959d0459b853160805057a3975436d3e206591").unwrap(), - UInt256::from_hex("321a1300b3ec63b3082d1626c7377d3c9e4e332eadefe12073f5e17b5099a49e").unwrap(), + <[u8; 32]>::from_hex("d2426992844e311149b2962f4ea991656ea5d1b36541e314e251915a6ffa1316").unwrap(), + <[u8; 32]>::from_hex("30c14c1d75694404dbc96d44d1c63f28bf685d27e44ef753883c5eb0742c5805").unwrap(), + <[u8; 32]>::from_hex("631a5e99e59bab2bf06e4ec9874b3c3ced59187dc724c689ffa0fe99f2d3f210").unwrap(), + <[u8; 32]>::from_hex("113673823cf38eb56f30795d7f830b2d82b70a35b96812ad79d0889465b69df3").unwrap(), + <[u8; 32]>::from_hex("0e01a796d779a8494be44311d6daf07fdae8642b45a9b866024cd97d8dfd3545").unwrap(), + <[u8; 32]>::from_hex("feb146a52985cbf69f0a46b3a56f5f505538440bd42e993a0685a11fac1fdda5").unwrap(), + <[u8; 32]>::from_hex("48d665ade991114900349635c788775204057220728212e2b6b63e3545f67007").unwrap(), + <[u8; 32]>::from_hex("adcc454391d9f53e6fa523e047db5f335e38d9ead70dc8e4e648118c285d1d77").unwrap(), + <[u8; 32]>::from_hex("aadd2eac24d6cc9a0b439d3c9d5483b0ed64ebda21786760bb375efacd6e2a67").unwrap(), + <[u8; 32]>::from_hex("a90df0c30b2002a85cef6b695b986a3815c7dc82027c6896b7747258675a76da").unwrap(), + <[u8; 32]>::from_hex("e13fbad0ab0bca68cbcd4d68127de06037b4007c5acbe8550edcd60b7d4503e8").unwrap(), + <[u8; 32]>::from_hex("200ccffb2ef1da266efda63b35bc80bc8a547f29af3b8108f81ab222a1ceac35").unwrap(), + <[u8; 32]>::from_hex("21173e00737bac467d09effb15959d0459b853160805057a3975436d3e206591").unwrap(), + <[u8; 32]>::from_hex("321a1300b3ec63b3082d1626c7377d3c9e4e332eadefe12073f5e17b5099a49e").unwrap(), ]; - assert!(vec.iter().any(|node| *node == UInt256::from_hex("30c14c1d75694404dbc96d44d1c63f28bf685d27e44ef753883c5eb0742c5805").unwrap())); - assert!(!vec.iter().any(|node| *node == UInt256::from_hex("ffc14c1d75694404dbc96d44d1c63f28bf685d27e44ef753883c5eb0742c5805").unwrap())); + assert!(vec.iter().any(|node| *node == <[u8; 32]>::from_hex("30c14c1d75694404dbc96d44d1c63f28bf685d27e44ef753883c5eb0742c5805").unwrap())); + assert!(!vec.iter().any(|node| *node == <[u8; 32]>::from_hex("ffc14c1d75694404dbc96d44d1c63f28bf685d27e44ef753883c5eb0742c5805").unwrap())); } diff --git a/dash-spv-masternode-processor/src/tests/hashes/multiple_merkle_hashes.rs b/dash-spv-masternode-processor/src/tests/hashes/multiple_merkle_hashes.rs index 1bd222e7..4275378f 100644 --- a/dash-spv-masternode-processor/src/tests/hashes/multiple_merkle_hashes.rs +++ b/dash-spv-masternode-processor/src/tests/hashes/multiple_merkle_hashes.rs @@ -1,51 +1,12 @@ use std::collections::HashSet; -use byte::{BytesExt, LE}; -use hashes::hex::{FromHex, ToHex}; -use secp256k1::rand::{Rng, thread_rng}; -use crate::chain::ScriptMap; -use crate::common::merkle_tree::MerkleTree; -use crate::consensus::encode::VarInt; -use crate::crypto::byte_util::{AsBytes, UInt256}; -use crate::crypto::data_ops::Data; -use crate::util::address::address; -use crate::util::base58; -use crate::util::data_append::DataAppend; -use crate::util::script::ScriptElement; +use dashcore::hashes::hex::FromHex; +use dashcore::secp256k1::rand::random; +use dash_spv_crypto::crypto::data_ops::Data; +use dash_spv_crypto::util::address::address; +use dash_spv_crypto::util::data_append::DataAppend; +use dash_spv_crypto::util::script::ScriptElement; +use dash_spv_crypto::util::{base58, ScriptMap}; -#[test] -fn test_multiple_merkle_hashes() { - let merkle_hashes = Vec::from_hex("78175171f830d9ea3e67170dfdec6bd805d31b22b19eaf783355adae06faa3539762500f0eca01a59f0e198522a0752f96be9032803fb21311a992089b9472bd1361a2db43a580e40f81bd5e17eabae8eebb02e9a651ae348d88d51ca824df19").unwrap(); - let merkle_flags = Vec::from_hex("07").unwrap(); - let desired_merkle_root = - UInt256::from_hex("bd6a344573ba1d6faf24f021324fa3360562404536246503c4cba372f94bfa4a") - .unwrap(); - let tree_element_count = 4; - let flags = merkle_flags.as_slice(); - let mut hashes = Vec::::new(); - let hashes_count = merkle_hashes.len() / 32; - for i in 0..hashes_count { - let mut off = i * 32; - if let Ok(hash) = merkle_hashes.read_with(&mut off, LE) { - hashes.push(hash); - } - } - let merkle_tree = MerkleTree { - tree_element_count, - hashes: hashes.clone(), - flags, - }; - let has_valid_coinbase = merkle_tree.has_root(desired_merkle_root); - println!( - "merkle_tree: {:?} ({:?}) {:?} {}, has_valid_coinbase: {} {:?}", - merkle_hashes.to_hex(), - hashes.clone(), - merkle_flags.to_hex(), - tree_element_count, - has_valid_coinbase, - desired_merkle_root - ); - assert!(has_valid_coinbase, "Invalid coinbase here"); -} #[test] fn test_bitwise() { // Rust has own way... @@ -79,89 +40,22 @@ fn test_bitwise() { assert_eq!(test_values, masks, "bitwise hell"); } -#[test] -fn test_long_bitsets() { - let bitsets: Vec<(&str, u64)> = vec![ - ("ffffffffffff03", 50), - ("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f000000000000000000000000", 400), - ("cff5bdfdffffff0f", 60), - ("f7fffffffffffb0f", 60), - ("5fffffffffffff0f", 60), - ("5bedffffffffff0f", 60), - ("cdffffffffdfff0f", 60), - ("bcfffffffffffe0f", 60), - ("fdcfffffffffff0f", 60), - ("7bd6fffffffffd0f", 60), - ("7fb6ffffffffff0f", 60), - ("ffeeffffffffff0f", 60), - ("1fcdfffffffffd0f", 60), - ("dfbfffffffffff0f", 60), - ("ffffffffffffff0f", 60), - ("aff7ffffffffff0f", 60), - ("9eceffffffffff0f", 60), - ("fff7ffffffffff0f", 60), - ("bfefffffffffff0f", 60), - ("7edfffffffffff0f", 60), - ("fefbffffffffff0f", 60), - ("fbf7ffffffffff0b", 60), - ("6febffffffffff0f", 60), - ("f7ffffffffffff0d", 60), - ("ff9fffffffffdf0f", 60), - ("adf7ffffffffff0f", 60), - ("9fffffffffffff0f", 60), - ("7befffffffffff0f", 60), - ("f3dfffffffffff0f", 60), - ("fbffffffffffff0f", 60), - ("bfffffffffffff0f", 60), - ("7bfbffffff7fff0f", 60), - ("fffeffffffdfff0f", 60), - ("6f9fffffffffff0f", 60), - ("fdfeffffffffff0f", 60), - ]; - for (bitset, size) in bitsets { - validate_bitset(Vec::from_hex(bitset).unwrap(), VarInt(size)); - } -} - -pub fn validate_bitset(bitset: Vec, count: VarInt) { - println!( - "validateBitsets: {:?}:{}:{}:{}", - bitset.to_hex(), - bitset.len(), - count, - count.0 / 8 - ); - assert_eq!(bitset.len(), (count.0 as usize + 7) / 8, "Error: The byte size of the signers bitvectors ({}) must match “(quorumSize + 7) / 8 ({})", bitset.len(), (count.0 + 7) / 8); - let len = (bitset.len() * 8) as i32; - let size = count.0 as i32; - if len != size { - let rem = len - size; - let mask = !(0xff >> rem); - let last_byte = match bitset.last() { - Some(&last) => last as i32, - None => 0, - }; - println!("lastByte: {} mask: {}", last_byte, mask); - assert_eq!(last_byte & mask, 0, "Error: No out-of-range bits should be set in byte representation of the signers bitvector"); - } -} - #[test] pub fn test_bits_are_true_operations() { let number1 = - UInt256::from_hex("0100000000000000000000000000000000000000000000000000000000000000") + <[u8; 32]>::from_hex("0100000000000000000000000000000000000000000000000000000000000000") .unwrap(); let number50 = - UInt256::from_hex("3200000000000000000000000000000000000000000000000000000000000000") + <[u8; 32]>::from_hex("3200000000000000000000000000000000000000000000000000000000000000") .unwrap(); let number50_shifted = - UInt256::from_hex("0000000000000000320000000000000000000000000000000000000000000000") + <[u8; 32]>::from_hex("0000000000000000320000000000000000000000000000000000000000000000") .unwrap(); let test_number50_shifted = - UInt256::from_hex("0000000000000000320000000000000000000000000000000000000000000000") + <[u8; 32]>::from_hex("0000000000000000320000000000000000000000000000000000000000000000") .unwrap(); let test_number = - UInt256::from_hex("0100000000000000320000000000000000000000000000000000000000000000") + <[u8; 32]>::from_hex("0100000000000000320000000000000000000000000000000000000000000000") .unwrap(); assert_eq!( @@ -169,7 +63,7 @@ pub fn test_bits_are_true_operations() { "These numbers must be the same" ); - let data = test_number.as_bytes(); + let data = test_number.as_slice(); assert_eq!(data.true_bits_count(), 4, "Must be 6 bits here"); assert!(data.bit_is_true_at_le_index(0), "This must be true"); assert!(!data.bit_is_true_at_le_index(1), "This must be false"); @@ -183,7 +77,7 @@ const LEN: usize = 500; pub fn test_bits_are_true_operations_random() { let mut data: [u8; LEN] = [0u8; LEN]; for i in 0..32 { - data[i] = thread_rng().gen(); + data[i] = random(); } let vec = data.to_vec(); (0..LEN).into_iter().for_each(|i| { @@ -193,44 +87,44 @@ pub fn test_bits_are_true_operations_random() { } -#[test] -pub fn test_bitwise_ops() { - let a = 7u64; - let b = 5u64; - // UInt256() - let ab = a.to_le_bytes(); - let bb = b.to_le_bytes(); - // let tt = UInt256(ab); - - let mut aa = [0u8; 32]; - aa[0] = 7; - let mut bb = [0u8; 32]; - bb[0] = 5; - - let big_a = UInt256(aa); - let big_b = UInt256(bb); - println!("a: {} b: {}", big_a, big_b); - assert!(big_a > big_b, "A in uint 256 needs to be bigger than B"); - - let mut cc = [0u8; 32]; - cc[8] = 1; - let big_c = UInt256(cc); - println!("c: {} a: {}", big_c, big_a); - // assert!(big_c > big_a, "C in uint 256 needs to be bigger than A"); - - let d: u64 = 1 << 30; - - // uint64_t d = 1 << 30; - // UInt256 bigD = uint256_from_long(d); - // UInt256 bigDLeftShifted = uInt256ShiftLeftLE(bigD, 34); - // NSLog(@"%@ :: %@ :: %@ ", uint256_hex(bigC), uint256_hex(bigD), uint256_hex(bigDLeftShifted)); - // XCTAssert(uint256_eq(bigC, bigDLeftShifted), @"C and D should be equal"); - // - // uint32_t e = 1 << 30; - // UInt256 bigE = uint256_from_int(e); - // UInt256 bigELeftShifted = uInt256ShiftLeftLE(bigE, 34); - // XCTAssert(uint256_eq(bigELeftShifted, bigDLeftShifted), @"D and E should be equal"); -} +// #[test] +// pub fn test_bitwise_ops() { +// let a = 7u64; +// let b = 5u64; +// // UInt256() +// let ab = a.to_le_bytes(); +// let bb = b.to_le_bytes(); +// // let tt = UInt256(ab); +// +// let mut aa = [0u8; 32]; +// aa[0] = 7; +// let mut bb = [0u8; 32]; +// bb[0] = 5; +// +// let big_a = UInt256(aa); +// let big_b = UInt256(bb); +// println!("a: {} b: {}", big_a, big_b); +// assert!(big_a > big_b, "A in uint 256 needs to be bigger than B"); +// +// let mut cc = [0u8; 32]; +// cc[8] = 1; +// let big_c = UInt256(cc); +// println!("c: {} a: {}", big_c, big_a); +// // assert!(big_c > big_a, "C in uint 256 needs to be bigger than A"); +// +// let d: u64 = 1 << 30; +// +// // uint64_t d = 1 << 30; +// // UInt256 bigD = uint256_from_long(d); +// // UInt256 bigDLeftShifted = uInt256ShiftLeftLE(bigD, 34); +// // NSLog(@"%@ :: %@ :: %@ ", uint256_hex(bigC), uint256_hex(bigD), uint256_hex(bigDLeftShifted)); +// // XCTAssert(uint256_eq(bigC, bigDLeftShifted), @"C and D should be equal"); +// // +// // uint32_t e = 1 << 30; +// // UInt256 bigE = uint256_from_int(e); +// // UInt256 bigELeftShifted = uInt256ShiftLeftLE(bigE, 34); +// // XCTAssert(uint256_eq(bigELeftShifted, bigDLeftShifted), @"D and E should be equal"); +// } /// Equivalent to objc: /// if ([txHashes intersectsOrderedSet:knownTxHashes]) { @@ -239,12 +133,12 @@ pub fn test_bitwise_ops() { /// [knownTxHashes unionOrderedSet:txHashes]; #[test] pub fn collections_test() { - let h0 = UInt256::from_hex("02108f5f6f2743ce35ae58a94ab552381a17711ac54e9fd09358a0cb95beef79").unwrap(); - let h1 = UInt256::from_hex("02108f5f6f2743ce35ae58a94ab552381a17711ac54e9fd09358a0cb95beef80").unwrap(); - let h2 = UInt256::from_hex("74c41b22deefa3b3f1687f8cdaef64c69b84c2d172e872f408a4e3d86c5d929d").unwrap(); - let h3 = UInt256::from_hex("74c41b22deefa3b3f1687f8cdaef64c69b84c2d172e872f408a4e3d86c5d929e").unwrap(); - let h4 = UInt256::from_hex("74c41b22deefa3b3f1687f8cdaef64c69b84c2d172e872f408a4e3d86c5d929f").unwrap(); - let h5 = UInt256::from_hex("84c41b22deefa3b3f1687f8cdaef64c69b84c2d172e872f408a4e3d86c5d929f").unwrap(); + let h0 = <[u8; 32]>::from_hex("02108f5f6f2743ce35ae58a94ab552381a17711ac54e9fd09358a0cb95beef79").unwrap(); + let h1 = <[u8; 32]>::from_hex("02108f5f6f2743ce35ae58a94ab552381a17711ac54e9fd09358a0cb95beef80").unwrap(); + let h2 = <[u8; 32]>::from_hex("74c41b22deefa3b3f1687f8cdaef64c69b84c2d172e872f408a4e3d86c5d929d").unwrap(); + let h3 = <[u8; 32]>::from_hex("74c41b22deefa3b3f1687f8cdaef64c69b84c2d172e872f408a4e3d86c5d929e").unwrap(); + let h4 = <[u8; 32]>::from_hex("74c41b22deefa3b3f1687f8cdaef64c69b84c2d172e872f408a4e3d86c5d929f").unwrap(); + let h5 = <[u8; 32]>::from_hex("84c41b22deefa3b3f1687f8cdaef64c69b84c2d172e872f408a4e3d86c5d929f").unwrap(); let tx_hashes = HashSet::from([h0, h1, h5]); let known_tx_hashes = HashSet::from([h0, h1, h2, h3, h4]); let diff: HashSet<_> = tx_hashes.difference(&known_tx_hashes).collect(); @@ -260,19 +154,19 @@ pub fn from_hex(s: &str) -> Vec { .collect() } -#[test] -pub fn test_biguints_ops() { - let mut x = [0u8; 32]; - x[0] = 0x32; // 50 - let a = UInt256(x); - for i in 0..=32 { - println!("{}", a >> i); - } - - let a = b"a0fcffffffffffffffffffffffffffffffffffffffffffffffffffffff4ffbff"; - let b = b"100e000000000000000000000000000000000000000000000000000000000000"; - -} +// #[test] +// pub fn test_biguints_ops() { +// let mut x = [0u8; 32]; +// x[0] = 0x32; // 50 +// let a = UInt256(x); +// for i in 0..=32 { +// println!("{}", a >> i); +// } +// +// let a = b"a0fcffffffffffffffffffffffffffffffffffffffffffffffffffffff4ffbff"; +// let b = b"100e000000000000000000000000000000000000000000000000000000000000"; +// +// } fn check_script_elements(data: &[u8], exp_script_elements: Vec) { assert_eq!( diff --git a/dash-spv-masternode-processor/src/tests/indexes/big_numbers.rs b/dash-spv-masternode-processor/src/tests/indexes/big_numbers.rs deleted file mode 100644 index 58618b9e..00000000 --- a/dash-spv-masternode-processor/src/tests/indexes/big_numbers.rs +++ /dev/null @@ -1,33 +0,0 @@ -use crate::crypto::UInt256; - -#[test] -pub fn test_superior_and_equal_uint256() { - let big_a = UInt256::from(7u64); - let big_b = UInt256::from(5u64); - assert!(big_a.sup(&big_b), "A in uint 256 needs to be bigger than B"); - let big_c = UInt256::from([0,1,0,0]); - assert!(big_c.sup(&big_a), "C in uint 256 needs to be bigger than A"); - let d: u64 = 1 << 30; - let big_d = UInt256::from(d); - let big_d_left_shifted = big_d.shift_left_le(34); - assert!(big_c.eq(&big_d_left_shifted), "C and D should be equal"); - let e: u32 = 1 << 30; - let big_e = UInt256::from(e); - let big_e_left_shifted = big_e.shift_left_le(34); - assert!(big_e_left_shifted.eq(&big_d_left_shifted), "D and E should be equal"); -} - -#[test] -pub fn test_biguints_ops() { - let mut x = [0u8; 32]; - x[0] = 0x32; // 50 - let a = UInt256(x); - for i in 0..=32 { - println!("{}", a >> i); - } - - let a = b"a0fcffffffffffffffffffffffffffffffffffffffffffffffffffffff4ffbff"; - let b = b"100e000000000000000000000000000000000000000000000000000000000000"; - -} - diff --git a/dash-spv-masternode-processor/src/tests/indexes/mod.rs b/dash-spv-masternode-processor/src/tests/indexes/mod.rs index 85cb0689..c6734870 100644 --- a/dash-spv-masternode-processor/src/tests/indexes/mod.rs +++ b/dash-spv-masternode-processor/src/tests/indexes/mod.rs @@ -1,2 +1 @@ pub mod uint256_index_paths; -pub mod big_numbers; diff --git a/dash-spv-masternode-processor/src/tests/indexes/uint256_index_paths.rs b/dash-spv-masternode-processor/src/tests/indexes/uint256_index_paths.rs index 3b5e4c3b..88e7b1ba 100644 --- a/dash-spv-masternode-processor/src/tests/indexes/uint256_index_paths.rs +++ b/dash-spv-masternode-processor/src/tests/indexes/uint256_index_paths.rs @@ -1,14 +1,12 @@ use std::cmp::Ordering; -use crate::crypto::{byte_util::Random, UInt256}; -use crate::chain::derivation::{IIndexPath}; -use crate::chain::derivation::uint256_index_path::UInt256IndexPath; +use dash_spv_crypto::crypto::byte_util::Random; +use dash_spv_crypto::derivation::{IIndexPath, UInt256IndexPath}; - -fn generate_random_indexes_for_length(length: usize) -> Vec { - (0..length).into_iter().map(|i| UInt256::random()).collect() +fn generate_random_indexes_for_length(length: usize) -> Vec<[u8; 32]> { + (0..length).into_iter().map(|i| <[u8; 32]>::random()).collect() } -fn perform_tests_for_indexes(indexes: Vec) { +fn perform_tests_for_indexes(indexes: Vec<[u8; 32]>) { let length = indexes.len(); let mut index_path = UInt256IndexPath::index_path_with_indexes(indexes.clone()); // Basic @@ -19,7 +17,7 @@ fn perform_tests_for_indexes(indexes: Vec) { // todo: impl Serialization test // Methods - let index = UInt256::random(); + let index = <[u8; 32]>::random(); let mut new_index_path = index_path.index_path_by_adding_index(index); let returned_index = new_index_path.index_at_position(length); assert_eq!(returned_index, index, "Failed for length {}", length); @@ -46,8 +44,8 @@ pub fn test_empty_index_path() { index_path = index_path.index_path_by_removing_last_index(); assert_eq!(index_path.length(), 0, "Non-zero index path length"); let index = index_path.index_at_position(1); - assert_eq!(index_path.index_at_position(1), UInt256::MAX, "Non-existed index should be ::MAX"); - index_path = index_path.index_path_by_adding_index(UInt256::from([1,2,3,4])); + assert_eq!(index_path.index_at_position(1), [!0u8; 32], "Non-existed index should be ::MAX"); + index_path = index_path.index_path_by_adding_index(from_u64_4_to_u8_32([1,2,3,4])); assert_eq!(index_path.length(), 1, "Non-existed index should be ::MAX"); } @@ -61,8 +59,17 @@ pub fn test_many_elements() { #[test] pub fn test_compare_elements() { - let first_path = UInt256IndexPath::index_path_with_indexes(vec![UInt256::from([1,2,3,4]), UInt256::from([2,3,4,5])]); - let second_path = UInt256IndexPath::index_path_with_indexes(vec![UInt256::from([5,6,7,8]), UInt256::from([6,7,8,9])]); + let first_path = UInt256IndexPath::index_path_with_indexes(vec![from_u64_4_to_u8_32([1,2,3,4]), from_u64_4_to_u8_32([2,3,4,5])]); + let second_path = UInt256IndexPath::index_path_with_indexes(vec![from_u64_4_to_u8_32([5,6,7,8]), from_u64_4_to_u8_32([6,7,8,9])]); assert_eq!(first_path.cmp(&second_path), Ordering::Less); assert_eq!(second_path.cmp(&first_path), Ordering::Greater); } + +fn from_u64_4_to_u8_32(value: [u64; 4]) -> [u8; 32] { + let mut r = [0u8; 32]; + r[..8].copy_from_slice(&value[0].to_le_bytes()); + r[8..16].copy_from_slice(&value[1].to_le_bytes()); + r[16..24].copy_from_slice(&value[2].to_le_bytes()); + r[24..].copy_from_slice(&value[3].to_le_bytes()); + r +} diff --git a/dash-spv-masternode-processor/src/tests/json_from_core_snapshot.rs b/dash-spv-masternode-processor/src/tests/json_from_core_snapshot.rs deleted file mode 100644 index a7f2b7bb..00000000 --- a/dash-spv-masternode-processor/src/tests/json_from_core_snapshot.rs +++ /dev/null @@ -1,409 +0,0 @@ -use std::collections::BTreeMap; -use std::num::ParseIntError; -use byte::BytesExt; -use byte::ctx::Bytes; -use serde::{Deserialize, Serialize}; -use crate::chain::common::LLMQType; -use crate::common::{LLMQSnapshotSkipMode, LLMQVersion, MasternodeType, SocketAddress}; -use crate::consensus::encode::VarInt; -use crate::crypto::{byte_util::{BytesDecodable, Reversable}, UInt160, UInt256, UInt384, UInt768, VarArray, VarBytes}; -use crate::hashes::hex::FromHex; -use crate::lib_tests::tests::message_from_file; -use crate::models; -use crate::models::OperatorPublicKey; -use crate::tx::CoinbaseTransaction; -use crate::util::base58; - -#[derive(Serialize, Deserialize)] -struct Masternode { - #[serde(rename = "proTxHash")] - pub pro_tx_hash: String, - pub address: String, - pub payee: String, - pub status: String, - pub pospenaltyscore: i64, - pub lastpaidtime: i64, - pub lastpaidblock: i64, - pub owneraddress: String, - pub votingaddress: String, - pub collateraladdress: String, - pub pubkeyoperator: String, -} - -#[derive(Serialize, Deserialize)] -pub struct QRInfo { - #[serde(rename = "extraShare")] - pub extra_share: bool, - #[serde(rename = "quorumSnapshotAtHMinusC")] - pub quorum_snapshot_at_hminus_c: Snapshot, - #[serde(rename = "quorumSnapshotAtHMinus2C")] - pub quorum_snapshot_at_hminus2c: Snapshot, - #[serde(rename = "quorumSnapshotAtHMinus3C")] - pub quorum_snapshot_at_hminus3c: Snapshot, - #[serde(rename = "mnListDiffTip")] - pub mn_list_diff_tip: ListDiff, - #[serde(rename = "mnListDiffH")] - pub mn_list_diff_h: ListDiff, - #[serde(rename = "mnListDiffAtHMinusC")] - pub mn_list_diff_at_hminus_c: ListDiff, - #[serde(rename = "mnListDiffAtHMinus2C")] - pub mn_list_diff_at_hminus2c: ListDiff, - #[serde(rename = "mnListDiffAtHMinus3C")] - pub mn_list_diff_at_hminus3c: ListDiff, - #[serde(rename = "lastCommitmentPerIndex")] - pub last_commitment_per_index: Vec, - #[serde(rename = "quorumSnapshotList")] - pub quorum_snapshot_list: Vec, - #[serde(rename = "mnListDiffList")] - pub mn_list_diff_list: Vec, -} - -#[derive(Serialize, Deserialize)] -pub struct Snapshot { - #[serde(rename = "activeQuorumMembers")] - pub active_quorum_members: Vec, - #[serde(rename = "mnSkipListMode")] - pub mn_skip_list_mode: i64, - #[serde(rename = "mnSkipList")] - pub mn_skip_list: Vec, -} - -#[derive(Serialize, Deserialize)] -pub struct Llmq { - pub version: i64, - #[serde(rename = "llmqType")] - pub llmq_type: i64, - #[serde(rename = "quorumHash")] - pub quorum_hash: String, - #[serde(rename = "quorumIndex")] - pub quorum_index: i64, - #[serde(rename = "signersCount")] - pub signers_count: i64, - pub signers: String, - #[serde(rename = "validMembersCount")] - pub valid_members_count: i64, - #[serde(rename = "validMembers")] - pub valid_members: String, - #[serde(rename = "quorumPublicKey")] - pub quorum_public_key: String, - #[serde(rename = "quorumVvecHash")] - pub quorum_vvec_hash: String, - #[serde(rename = "quorumSig")] - pub quorum_sig: String, - #[serde(rename = "membersSig")] - pub members_sig: String, -} - -impl From for models::LLMQEntry { - fn from(llmq: Llmq) -> Self { - models::LLMQEntry::new( - LLMQVersion::from(llmq.version as u16), - LLMQType::from(llmq.llmq_type as u8), - block_hash_to_block_hash(llmq.quorum_hash), - Some(llmq.quorum_index as u16), - VarInt(llmq.signers_count as u64), - VarInt(llmq.valid_members_count as u64), - llmq.signers.as_bytes().to_vec(), - llmq.valid_members.as_bytes().to_vec(), - UInt384::from_hex(llmq.quorum_public_key.as_str()).unwrap(), - UInt256::from_hex(llmq.quorum_vvec_hash.as_str()).unwrap(), - UInt768::from_hex(llmq.quorum_sig.as_str()).unwrap(), - UInt768::from_hex(llmq.members_sig.as_str()).unwrap() - ) - } -} - -#[derive(Serialize, Deserialize)] -pub struct Node { - #[serde(rename = "proRegTxHash")] - pub pro_reg_tx_hash: String, - #[serde(rename = "confirmedHash")] - pub confirmed_hash: String, - pub service: String, - #[serde(rename = "pubKeyOperator")] - pub pub_key_operator: String, - #[serde(rename = "votingAddress")] - pub voting_address: String, - #[serde(rename = "isValid")] - pub is_valid: bool, - - #[serde(rename = "updateHeight")] - pub update_height: Option, - #[serde(rename = "knownConfirmedAtHeight")] - pub known_confirmed_at_height: Option, - - #[serde(rename = "version")] - pub version: Option, -} - -#[derive(Serialize, Deserialize)] -pub struct ListDiff { - #[serde(rename = "baseBlockHash")] - pub base_block_hash: String, - #[serde(rename = "blockHash")] - pub block_hash: String, - #[serde(rename = "cbTxMerkleTree")] - pub cb_tx_merkle_tree: String, - #[serde(rename = "cbTx")] - pub cb_tx: String, - #[serde(rename = "deletedMNs")] - pub deleted_mns: Vec, - #[serde(rename = "mnList")] - pub mn_list: Vec, - #[serde(rename = "deletedQuorums")] - pub deleted_quorums: Vec, - #[serde(rename = "newQuorums")] - pub new_quorums: Vec, - #[serde(rename = "merkleRootMNList")] - pub merkle_root_mnlist: String, - #[serde(rename = "merkleRootQuorums")] - pub merkle_root_quorums: String, - #[serde(rename = "version")] - pub version: Option, -} - -#[derive(Serialize, Deserialize)] -pub struct MNList { - #[serde(rename = "blockHash")] - pub block_hash: String, - #[serde(rename = "knownHeight")] - pub known_height: u32, - #[serde(rename = "masternodeMerkleRoot")] - pub masternode_merkle_root: String, - #[serde(rename = "quorumMerkleRoot")] - pub quorum_merkle_root: String, - #[serde(rename = "mnList")] - pub mn_list: Vec, - #[serde(rename = "newQuorums")] - pub new_quorums: Vec, -} - -pub fn masternode_list_from_json(filename: String) -> models::MasternodeList { - list_to_list(serde_json::from_slice(&message_from_file(filename.as_str())).unwrap()) -} - -pub fn list_to_list(value: MNList) -> models::MasternodeList { - let block_hash = block_hash_to_block_hash(value.block_hash); - let known_height = value.known_height; - let masternode_merkle_root = Some(block_hash_to_block_hash(value.masternode_merkle_root)); - let llmq_merkle_root = Some(block_hash_to_block_hash(value.quorum_merkle_root)); - let masternodes = nodes_to_masternodes(value.mn_list); - let quorums = quorums_to_quorums_map(value.new_quorums); - models::MasternodeList { - block_hash, - known_height, - masternode_merkle_root, - llmq_merkle_root, - masternodes, - quorums - } -} - -pub fn block_hash_to_block_hash(block_hash: String) -> UInt256 { - UInt256::from_hex(block_hash.as_str()).unwrap() -} - -pub fn snapshot_to_snapshot(snapshot: Snapshot) -> models::LLMQSnapshot { - let member_list = bools_to_bytes(snapshot.active_quorum_members); - let skip_list = snapshot.mn_skip_list; - let skip_list_mode = LLMQSnapshotSkipMode::from(snapshot.mn_skip_list_mode as u32); - models::LLMQSnapshot::new(member_list, skip_list, skip_list_mode) -} - -pub fn value_to_snapshot(value: &serde_json::Value) -> models::LLMQSnapshot { - let snapshot: Snapshot = serde_json::from_value(value.clone()).unwrap(); - let member_list = bools_to_bytes(snapshot.active_quorum_members); - let skip_list = snapshot.mn_skip_list; - let skip_list_mode = LLMQSnapshotSkipMode::from(snapshot.mn_skip_list_mode as u32); - models::LLMQSnapshot::new(member_list, skip_list, skip_list_mode) -} - -pub fn value_to_masternode_list(value: &serde_json::Value) -> models::MasternodeList { - let nodes: Vec = serde_json::from_value(value.clone()).unwrap(); - let masternodes = nodes_to_masternodes(nodes); - models::MasternodeList { - block_hash: Default::default(), - known_height: 0, - masternode_merkle_root: None, - llmq_merkle_root: None, - masternodes, - quorums: Default::default() - } -} - -pub fn quorums_to_quorums_vec(value: Vec) -> Vec { - value.into_iter().map(models::LLMQEntry::from).collect() -} - -pub fn quorums_to_quorums_map(value: Vec) -> BTreeMap> { - let mut quorums: BTreeMap> = BTreeMap::new(); - value.into_iter().for_each(|llmq| { - let entry = models::LLMQEntry::from(llmq); - quorums - .entry(entry.llmq_type) - .or_insert_with(BTreeMap::new) - .insert(entry.llmq_hash, entry); - - }); - quorums -} - -// pub fn masternodes_to_masternodes(value: Vec) -> BTreeMap { -// let map: BTreeMap = value -// .into_iter() -// .filter_map(|node| { -// -// -// // #[serde(rename = "proTxHash")] -// // pub pro_tx_hash: String, -// // pub address: String, -// // pub payee: String, -// // pub status: String, -// // pub pospenaltyscore: i64, -// // pub lastpaidtime: i64, -// // pub lastpaidblock: i64, -// // pub owneraddress: String, -// // pub votingaddress: String, -// // pub collateraladdress: String, -// // pub pubkeyoperator: String, -// -// -// let provider_registration_transaction_hash = UInt256::from_hex(node.pro_tx_hash.as_str()).unwrap(); -// let confirmed_hash = UInt256::from_hex(node.confirmed_hash.as_str()).unwrap(); -// // node.service don't really need -// let socket_address = SocketAddress { ip_address: Default::default(), port: 0 }; -// let voting_bytes = base58::from(node.votingaddress.as_str()).unwrap(); -// let key_id_voting = UInt160::from_bytes(&voting_bytes, &mut 0).unwrap(); -// let operator_public_key = UInt384::from_hex(node.pubkeyoperator.as_str()).unwrap(); -// let is_valid = node.status == "ENABLED"; -// let entry = models::MasternodeEntry::new(provider_registration_transaction_hash, confirmed_hash, socket_address, key_id_voting, operator_public_key, if is_valid { 1 } else { 0 }); -// // assert_eq!(message.len(), MN_ENTRY_PAYLOAD_LENGTH); -// // entry.update_with_block_height(block_height); -// Some(entry) -// }) -// .fold(BTreeMap::new(), |mut acc, entry| { -// let hash = entry -// .provider_registration_transaction_hash -// .clone() -// .reversed(); -// acc.insert(hash, entry); -// acc -// }); -// map -// } - -pub fn nodes_to_masternodes(value: Vec) -> BTreeMap { - let map: BTreeMap = value - .into_iter() - .map(|node| { - let provider_registration_transaction_hash = UInt256::from_hex(node.pro_reg_tx_hash.as_str()).unwrap(); - let confirmed_hash = UInt256::from_hex(node.confirmed_hash.as_str()).unwrap(); - // node.service don't really need - let socket_address = SocketAddress { ip_address: Default::default(), port: 0 }; - let voting_bytes = base58::from(node.voting_address.as_str()).unwrap(); - let key_id_voting = UInt160::from_bytes(&voting_bytes, &mut 0).unwrap(); - let public_key = UInt384::from_hex(node.pub_key_operator.as_str()).unwrap(); - let version = node.version.unwrap_or(0); - let is_valid = u8::from(node.is_valid); - let operator_public_key = OperatorPublicKey { - data: public_key, - version - }; - let update_height = node.update_height.unwrap_or(0); - let mut masternode = models::MasternodeEntry::new(version, provider_registration_transaction_hash, confirmed_hash, socket_address, key_id_voting, operator_public_key, is_valid, MasternodeType::Regular, 0, UInt160::MIN, update_height, 70219); - masternode.known_confirmed_at_height = node.known_confirmed_at_height; - masternode - }) - .fold(BTreeMap::new(), |mut acc, entry| { - let hash = entry.provider_registration_transaction_hash.reversed(); - acc.insert(hash, entry); - acc - }); - map -} - -pub fn parse_coinbase_tx_merkle_tree(bytes: &[u8]) -> (u32, VarArray, &[u8], usize) { - let offset = &mut 0; - let total_transactions = u32::from_bytes(bytes, offset).unwrap(); - let merkle_hashes = VarArray::::from_bytes(bytes, offset).unwrap(); - let merkle_flags_var_bytes = VarBytes::from_bytes(bytes, offset).unwrap(); - (total_transactions, merkle_hashes, merkle_flags_var_bytes.1, merkle_flags_var_bytes.0.0 as usize) -} - -pub fn bools_to_bytes(bools: Vec) -> Vec { - let mut b = Vec::::with_capacity(bools.len() / 8); - // let mut b = [0u8; bools.len() / 8]; - - for (idx, bit) in bools.into_iter().enumerate() { - let byte = idx / 8; - let shift = 7 - idx % 8; - if b.get(byte).is_none() { - b.push((bit as u8) << shift); - } else { - b[byte] |= (bit as u8) << shift; - } - } - b -} - -pub fn decode_hex_to_vec(s: &str) -> Vec { - (0..s.len()) - .step_by(2) - .map(|i| u8::from_str_radix(&s[i..i + 2], 16).unwrap()) - .collect() -} - -pub fn decode_hex(s: &str) -> Result, ParseIntError> { - (0..s.len()) - .step_by(2) - .map(|i| u8::from_str_radix(&s[i..i + 2], 16)) - .collect() -} - -fn vec_to_arr(v: Vec) -> [T; N] { - v.try_into() - .unwrap_or_else(|v: Vec| panic!("Expected a Vec of length {} but it was {}", N, v.len())) -} - -pub fn masternode_list_from_genesis_diff u32 + Copy>( - diff: ListDiff, block_height_lookup: BHL, is_bls_basic: bool) -> models::MNListDiff { - let base_block_hash = UInt256::from_hex(diff.base_block_hash.as_str()).unwrap().reverse(); - let block_hash = UInt256::from_hex(diff.block_hash.as_str()).unwrap().reverse(); - let cb_tx_bytes = Vec::from_hex(diff.cb_tx.as_str()).unwrap(); - let coinbase_transaction = CoinbaseTransaction::from_bytes(&cb_tx_bytes, &mut 0).unwrap(); - // let tree_bytes = diff.cb_tx_merkle_tree.as_bytes(); - let tree_bytes = Vec::from_hex(diff.cb_tx_merkle_tree.as_str()).unwrap(); - let tree_bytes = tree_bytes.as_slice(); - - let offset = &mut 0; - let total_transactions = u32::from_bytes(tree_bytes, offset).unwrap(); - let merkle_hashes = VarArray::::from_bytes(tree_bytes, offset).unwrap(); - let merkle_flags_var_int: VarInt = VarInt::from_bytes(tree_bytes, offset).unwrap(); - let merkle_flags_count = merkle_flags_var_int.0 as usize; - let merkle_flags: &[u8] = tree_bytes.read_with(offset, Bytes::Len(merkle_flags_count)).unwrap(); - let version = diff.version.unwrap_or(0); - - let deleted_masternode_hashes = diff.deleted_mns.iter().map(|s| UInt256::from_hex(s.as_str()).unwrap()).collect(); - let added_or_modified_masternodes = nodes_to_masternodes(diff.mn_list); - // in that snapshot it's always empty - let deleted_quorums = BTreeMap::default(); - let added_quorums = quorums_to_quorums_vec(diff.new_quorums); - println!("block_hash_tip: {}", block_hash); - models::MNListDiff { - base_block_hash, - block_hash, - total_transactions, - merkle_hashes: merkle_hashes.1, - merkle_flags: merkle_flags.to_vec(), - coinbase_transaction, - deleted_masternode_hashes, - added_or_modified_masternodes, - deleted_quorums, - added_quorums, - base_block_height: block_height_lookup(base_block_hash), - block_height: block_height_lookup(block_hash), - version, - // TODO: update json - quorums_cls_sigs: BTreeMap::new(), - } -} diff --git a/dash-spv-masternode-processor/src/tests/keys/aes.rs b/dash-spv-masternode-processor/src/tests/keys/aes.rs index edbf58c0..57090144 100644 --- a/dash-spv-masternode-processor/src/tests/keys/aes.rs +++ b/dash-spv-masternode-processor/src/tests/keys/aes.rs @@ -1,49 +1,26 @@ use base64::{alphabet, Engine}; use base64::engine::{GeneralPurpose, GeneralPurposeConfig}; -use hashes::hex::{FromHex, ToHex}; -use crate::chain::common::ChainType; -use crate::crypto::UInt256; -use crate::keys::{BLSKey, ECDSAKey, IKey}; -use crate::keys::crypto_data::{CryptoData, DHKey}; -use crate::util::address::address; +use dashcore::hashes::hex::FromHex; +use dashcore::secp256k1::hashes::hex::DisplayHex; +use dash_spv_crypto::network::ChainType; +use dash_spv_crypto::keys::{BLSKey, IKey}; +use dash_spv_crypto::keys::crypto_data::CryptoData; +use dash_spv_crypto::util::address::address; -#[test] -fn test_ecdsa_encryption_and_decryption() { - let alice_secret = UInt256::from_hex("0000000000000000000000000000000000000000000000000000000000000001").unwrap(); - let alice_key_pair = ECDSAKey::key_with_secret(&alice_secret, true).unwrap(); - let bob_secret = UInt256::from_hex("fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140").unwrap(); - let mut bob_key_pair = ECDSAKey::key_with_secret(&bob_secret, true).unwrap(); - let key = ECDSAKey::init_with_dh_key_exchange_with_public_key(&mut bob_key_pair, &alice_key_pair).unwrap(); - let key_public_key_data_hex = key.public_key_data().to_hex(); - assert_eq!(key_public_key_data_hex, "fbd27dbb9e7f471bf3de3704a35e884e37d35c676dc2cc8c3cc574c3962376d2", "they should be the same data"); - let secret = "my little secret is a pony that never sleeps"; - let mut data = secret.as_bytes().to_vec(); - // Alice is sending to Bob - let iv = Vec::from_hex("eac5bcd6eb85074759e0261497428c9b").unwrap(); - let encrypted = as CryptoData>::encrypt_with_secret_key_using_iv(&mut data, &alice_key_pair, &bob_key_pair, iv); - assert!(encrypted.is_some(), "Encrypted data is None"); - let mut encrypted = encrypted.unwrap(); - assert_eq!(encrypted.to_hex(), "eac5bcd6eb85074759e0261497428c9b3725d3b9ec4d739a842116277c6ace81549089be0d11a54ee09a99dcf7ac695a8ea56d41bf0b62def90b6f78f8b0aca9"); - // Bob is receiving from Alice - let decrypted = as CryptoData>::decrypt_with_secret_key(&mut encrypted, &bob_key_pair, &alice_key_pair); - assert!(decrypted.is_some(), "Decrypted data is None"); - let decrypted = decrypted.unwrap(); - let decrypted_str = String::from_utf8(decrypted).unwrap(); - assert_eq!(secret, decrypted_str.as_str(), "they should be the same string"); -} #[test] fn test_bls_encryption_and_decryption() { let base64_engine = GeneralPurpose::new(&alphabet::STANDARD, GeneralPurposeConfig::default()); - let script_map = ChainType::TestNet.script_map(); + let chain = ChainType::TestNet; + // let script_map = ChainType::TestNet.script_map(); let alice_seed = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; let alice_key_pair = BLSKey::key_with_seed_data(&alice_seed, true); let alice_public_key_data = alice_key_pair.public_key_data(); let alice_private_key_data = alice_key_pair.private_key_data().unwrap(); - let alice_address = address::with_public_key_data(&alice_public_key_data, &script_map); - assert_eq!(alice_public_key_data.to_hex(), "1790635de8740e9a6a6b15fb6b72f3a16afa0973d971979b6ba54761d6e2502c50db76f4d26143f05459a42cfd520d44", "BLS publicKeyData is incorrect"); + let alice_address = address::with_public_key_data(&alice_public_key_data, chain.clone()); + assert_eq!(alice_public_key_data.to_lower_hex_string(), "1790635de8740e9a6a6b15fb6b72f3a16afa0973d971979b6ba54761d6e2502c50db76f4d26143f05459a42cfd520d44", "BLS publicKeyData is incorrect"); assert_eq!(base64_engine.encode(alice_public_key_data), "F5BjXeh0DppqaxX7a3LzoWr6CXPZcZeba6VHYdbiUCxQ23b00mFD8FRZpCz9Ug1E", "BLS publicKeyData is incorrect"); - assert_eq!(alice_private_key_data.to_hex(), "46891c2cec49593c81921e473db7480029e0fc1eb933c6b93d81f5370eb19fbd", "BLS privateKeyData is incorrect"); + assert_eq!(alice_private_key_data.to_lower_hex_string(), "46891c2cec49593c81921e473db7480029e0fc1eb933c6b93d81f5370eb19fbd", "BLS privateKeyData is incorrect"); assert_eq!(base64_engine.encode(alice_private_key_data), "RokcLOxJWTyBkh5HPbdIACng/B65M8a5PYH1Nw6xn70=", "BLS privateKeyData is incorrect"); assert_eq!(alice_address, "yi4HkZyrJQTKRD6p6p6Akiq7d1j1uBMYFP", "BLS address for testnet is incorrect"); @@ -51,11 +28,11 @@ fn test_bls_encryption_and_decryption() { let bob_key_pair = BLSKey::key_with_seed_data(&bob_seed, true); let bob_public_key_data = bob_key_pair.public_key_data(); let bob_private_key_data = bob_key_pair.private_key_data().unwrap(); - let bob_address = address::with_public_key_data(&bob_public_key_data, &script_map); + let bob_address = address::with_public_key_data(&bob_public_key_data, chain); - assert_eq!(bob_public_key_data.to_hex(), "0e2f9055c17eb13221d8b41833468ab49f7d4e874ddf4b217f5126392a608fd48ccab3510548f1da4f397c1ad4f8e01a", "BLS publicKeyData is incorrect"); + assert_eq!(bob_public_key_data.to_lower_hex_string(), "0e2f9055c17eb13221d8b41833468ab49f7d4e874ddf4b217f5126392a608fd48ccab3510548f1da4f397c1ad4f8e01a", "BLS publicKeyData is incorrect"); assert_eq!(base64_engine.encode(bob_public_key_data), "Di+QVcF+sTIh2LQYM0aKtJ99TodN30shf1EmOSpgj9SMyrNRBUjx2k85fBrU+OAa", "BLS publicKeyData is incorrect"); - assert_eq!(bob_private_key_data.to_hex(), "2513a9d824e763f8b3ff4304c5d52d05154a82b4c975da965f124e5dcf915805", "BLS privateKeyData is incorrect"); + assert_eq!(bob_private_key_data.to_lower_hex_string(), "2513a9d824e763f8b3ff4304c5d52d05154a82b4c975da965f124e5dcf915805", "BLS privateKeyData is incorrect"); assert_eq!(base64_engine.encode(bob_private_key_data), "JROp2CTnY/iz/0MExdUtBRVKgrTJddqWXxJOXc+RWAU=", "BLS privateKeyData is incorrect"); assert_eq!(bob_address, "yMfTGcBjCLxyefxAdSSyFnSYgU6cJzmrs2", "BLS address for testnet is incorrect"); @@ -63,13 +40,13 @@ fn test_bls_encryption_and_decryption() { let mut data = secret.as_bytes().to_vec(); // Alice is sending to Bob let iv = Vec::from_hex("eac5bcd6eb85074759e0261497428c9b").unwrap(); - let encrypted = as CryptoData>::encrypt_with_secret_key_using_iv(&mut data, &alice_key_pair, &bob_key_pair, iv); - assert!(encrypted.is_some(), "Encrypted data is None"); + let encrypted = CryptoData::::encrypt_with_secret_key_using_iv(&mut data, &alice_key_pair, &bob_key_pair, iv); + assert!(encrypted.is_ok(), "Encrypted data is None"); let mut encrypted = encrypted.unwrap(); - assert_eq!(encrypted.to_hex(), "eac5bcd6eb85074759e0261497428c9bd72bd418ce96e69cbb6766e59f8d1f8138afb0686018bb4d401369e77ba47367f93a49a528f4cc9e3f209a515e6dd8f2"); + assert_eq!(encrypted.to_lower_hex_string(), "eac5bcd6eb85074759e0261497428c9bd72bd418ce96e69cbb6766e59f8d1f8138afb0686018bb4d401369e77ba47367f93a49a528f4cc9e3f209a515e6dd8f2"); // Bob is receiving from Alice - let decrypted = as CryptoData>::decrypt_with_secret_key(&mut encrypted, &bob_key_pair, &alice_key_pair); - assert!(decrypted.is_some(), "Decrypted data is None"); + let decrypted = CryptoData::::decrypt_with_secret_key(&mut encrypted, &bob_key_pair, &alice_key_pair); + assert!(decrypted.is_ok(), "Decrypted data is None"); let decrypted = decrypted.unwrap(); let decrypted_str = String::from_utf8(decrypted).unwrap(); assert_eq!(secret, decrypted_str.as_str(), "they should be the same string"); @@ -81,13 +58,13 @@ pub fn test_base64_extended_public_key_size() { let alice_seed = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; let extended_private_key_data = Vec::from_hex("0000000106f68e209200000000ba3b3032119e384bc0f89ef795bfeebaa738be14c04733a6bace32b4a9370928064b824c2c47493a3a123356688033fc12d2464dca59ebe9978c801d14a84b7c").unwrap(); let extended_public_key_data = Vec::from_hex("0000000106f68e209200000000ba3b3032119e384bc0f89ef795bfeebaa738be14c04733a6bace32b4a937092892a8b8dc09228e56932aafed768fb5ec8579f284917be9f489c222950e62497ddaeafa87a15219df72627796a3588b08").unwrap(); - // let alice_key_pair = BLSKey::key_with_extended_private_key_data(&extended_private_key_data, true).unwrap(); - let alice_key_pair = BLSKey::key_with_secret_hex("064b824c2c47493a3a123356688033fc12d2464dca59ebe9978c801d14a84b7c", true).unwrap(); + let alice_key_pair = BLSKey::key_with_secret_hex("064b824c2c47493a3a123356688033fc12d2464dca59ebe9978c801d14a84b7c", true) + .expect("BLSKey::key_with_secret_hex failed"); let bob_seed = [10, 9, 8, 7, 6, 6, 7, 8, 9, 10]; let bob_key_pair = BLSKey::key_with_seed_data(&bob_seed, true); let mut ext_pk_data = Vec::from_hex("351973adaa8073a0ac848c08ba1c6df9a14d3c52033febe9bf4c5b365546a163bac5c8180240b908657221ebdc8fde7cd3017531159a7c58b955db380964c929dc6a85ac86").unwrap(); - let encrypted = as CryptoData>::encrypt_with_secret_key(&mut ext_pk_data, &alice_key_pair, &bob_key_pair).unwrap(); + let encrypted = CryptoData::::encrypt_with_secret_key(&mut ext_pk_data, &alice_key_pair, &bob_key_pair).unwrap(); let base64_data = base64_engine.encode(encrypted); assert_eq!(base64_data.len(), 128, "BLS privateKeyData is incorrect"); } diff --git a/dash-spv-masternode-processor/src/tests/keys/bip38.rs b/dash-spv-masternode-processor/src/tests/keys/bip38.rs index 94976f6e..e46a3c4f 100644 --- a/dash-spv-masternode-processor/src/tests/keys/bip38.rs +++ b/dash-spv-masternode-processor/src/tests/keys/bip38.rs @@ -1,6 +1,6 @@ -use crate::chain::bip::bip38::BIP38; -use crate::chain::common::ChainType; -use crate::keys::{ECDSAKey, IKey}; +use dash_spv_crypto::bip::bip38::BIP38; +use dash_spv_crypto::keys::{ECDSAKey, IKey}; +use dash_spv_crypto::network::ChainType; #[test] fn test_key_with_bip38_key() { @@ -8,11 +8,11 @@ fn test_key_with_bip38_key() { let script = chain_type.script_map(); let key = ECDSAKey::key_with_bip38_key("6PfV898iMrVs3d9gJSw5HTYyGhQRR5xRu5ji4GE6H5QdebT2YgK14Lu1E5", "TestingOneTwoThree", &script).unwrap(); // to do compressed/uncompressed BIP38Key tests - let serialized_key = key.serialized_private_key_for_script(&script); + let serialized_key = key.serialized_private_key_for_script(script.privkey); println!("privKey = {}", serialized_key); assert_eq!("7sEJGJRPeGoNBsW8tKAk4JH52xbxrktPfJcNxEx3uf622ZrGR5k", serialized_key, "key_with_bip38_key: wrong result"); assert_eq!(key.bip38_key_with_passphrase("TestingOneTwoThree", &script).unwrap(), "6PRT3Wy4p7MZETE3n56KzyjyizMsE26WnMWpSeSoZawawEm7jaeCVa2wMu", "key_with_bip38_key: wrong result"); let key = ECDSAKey::key_with_bip38_key("6PRW5o9FLp4gJDDVqJQKJFTpMvdsSGJxMYHtHaQBF3ooa8mwD69bapcDQn", "foobar", &script); - assert!(key.is_none(), "Should be none"); + assert!(key.is_err(), "Should be err"); } diff --git a/dash-spv-masternode-processor/src/tests/keys/bls.rs b/dash-spv-masternode-processor/src/tests/keys/bls.rs deleted file mode 100644 index d7793e2a..00000000 --- a/dash-spv-masternode-processor/src/tests/keys/bls.rs +++ /dev/null @@ -1,256 +0,0 @@ -use bls_signatures::{PrivateKey, G1Element, Scheme, BasicSchemeMPL, G2Element, LegacySchemeMPL}; -use byte::BytesExt; -use hashes::hex::{FromHex, ToHex}; -use hashes::{Hash, sha256d}; -use secp256k1::rand::{Rng, thread_rng}; -use crate::keys::{BLSKey, IKey}; -use crate::crypto::{UInt256, UInt384, UInt768}; -use crate::crypto::byte_util::Random; -use crate::models::OperatorPublicKey; - -#[test] -pub fn test_bls_sign() { - // In dash we use SHA256_2, however these test vectors from the BLS library use a single SHA256 - let seed1 = vec![1u8,2,3,4,5]; - let seed2 = vec![1u8,2,3,4,5,6]; - let keypair1 = BLSKey::key_with_seed_data(&seed1, true); - let keypair2 = BLSKey::key_with_seed_data(&seed2, true); - let message1: Vec = vec![7,8,9]; - let message2: Vec = vec![1,2,3]; - let message3: Vec = vec![1,2,3,4]; - let message4: Vec = vec![1,2]; - let fingerprint1 = keypair1.public_key_fingerprint(); - let fingerprint2 = keypair2.public_key_fingerprint(); - assert_eq!(fingerprint1, 0x26d53247, "Testing BLS private child public key fingerprint"); - assert_eq!(fingerprint2, 0x289bb56e, "Testing BLS private child public key fingerprint"); - let signature1 = keypair1.sign_data_single_sha256(&message1); - assert_eq!(signature1.0.to_hex(), "93eb2e1cb5efcfb31f2c08b235e8203a67265bc6a13d9f0ab77727293b74a357ff0459ac210dc851fcb8a60cb7d393a419915cfcf83908ddbeac32039aaa3e8fea82efcb3ba4f740f20c76df5e97109b57370ae32d9b70d256a98942e5806065", "Testing BLS signing"); - assert_eq!(keypair1.seckey.0.to_hex(), "022fb42c08c12de3a6af053880199806532e79515f94e83461612101f9412f9e", "Testing BLS private key"); - let signature2 = keypair2.sign_data_single_sha256(&message1); - assert_eq!(signature2.0.to_hex(), "975b5daa64b915be19b5ac6d47bc1c2fc832d2fb8ca3e95c4805d8216f95cf2bdbb36cc23645f52040e381550727db420b523b57d494959e0e8c0c6060c46cf173872897f14d43b2ac2aec52fc7b46c02c5699ff7a10beba24d3ced4e89c821e", "Testing BLS signing"); -} - -#[test] -fn test_bls_verify() { - let seed1 = vec![1u8,2,3,4,5]; - let message1: Vec = vec![7, 8, 9]; - let mut key_pair1 = BLSKey::key_with_seed_data(&seed1, true); - assert_eq!(key_pair1.public_key_data().to_hex(), "02a8d2aaa6a5e2e08d4b8d406aaf0121a2fc2088ed12431e6b0663028da9ac5922c9ea91cde7dd74b7d795580acc7a61"); - assert_eq!(key_pair1.private_key_data().unwrap().to_hex(), "022fb42c08c12de3a6af053880199806532e79515f94e83461612101f9412f9e"); - let signature1 = key_pair1.sign_data(&message1); - assert_eq!(signature1.0.to_hex(), "023f5c750f402c69dab304e5042a7419722536a38d58ce46ba045be23e99d4f9ceeffbbc6796ebbdab6e9813c411c78f07167a3b76bef2262775a1e9f95ff1a80c5fa9fe8daa220d4d9da049a96e8932d5071aaf48fbff27a920bc4aa7511fd4"); - assert!(key_pair1.verify(&sha256d::Hash::hash(&message1).into_inner().to_vec(), &signature1.0.to_vec()), "Testing BLS signature verification"); -} - -#[test] -fn test_bls_multiplication() { - let private_key_data = Vec::from_hex("46891c2cec49593c81921e473db7480029e0fc1eb933c6b93d81f5370eb19fbd").unwrap(); - let public_key_data = Vec::from_hex("0e2f9055c17eb13221d8b41833468ab49f7d4e874ddf4b217f5126392a608fd48ccab3510548f1da4f397c1ad4f8e01a").unwrap(); - let expected_data = UInt256::from_hex("03fd387c4d4c66ec9dcdb31ef0c08ad881090dcda13d4b2c9cbc5ef264ff4dc7").unwrap(); - println!("private_key: {:?}", private_key_data.as_slice()); - println!("public_key: {:?}", public_key_data.as_slice()); - println!("expected_data: {:?}", expected_data.0); - let private_key = PrivateKey::from_bytes(&private_key_data, false).unwrap(); - let public_key = G1Element::from_bytes_legacy(&public_key_data).unwrap(); - let result = private_key * public_key; - let result_serialize = result.unwrap().serialize_legacy().read_with::(&mut 0, byte::LE).unwrap(); - assert_eq!(result_serialize, expected_data); -} - -#[test] -fn test_bls_from_bip32_short_seed() { - let private_key = PrivateKey::from_bip32_seed(&[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); - println!("{:?}", &*private_key.to_bytes().as_slice()); - assert_eq!( - private_key.to_bytes().as_slice(), - Vec::from_hex("46891c2cec49593c81921e473db7480029e0fc1eb933c6b93d81f5370eb19fbd").unwrap().as_slice(), - "----"); -} - -#[test] -fn test_bls_from_bip32_long_seed() { - let seed = Vec::from_hex("0102030405060708090a0102030405060708090a0102030405060708090a0102").unwrap(); - let private_key_test_data = Vec::from_hex("32439470cf06d276897d1b9069bdd6e4445390cd506985de0e1a1c88a76ff176").unwrap(); - println!("{:?}", seed); - println!("{:?}", private_key_test_data); - // let seed = [50, 67, 148, 112, 207, 6, 210, 118, 137, 125, 27, 144, 105, 189, 214, 228, 68, 83, 144, 205, 80, 105, 133, 222, 14, 26, 28, 136, 167, 111, 241, 118]; - // let secret = - let private_key = PrivateKey::from_bip32_seed(&seed); - println!("{:?}", &*private_key.to_bytes().as_slice()); - assert_eq!( - private_key.to_bytes().as_slice(), - private_key_test_data.as_slice(), - "----"); -} - -#[test] -fn test_bls_fingerprint_from_bip32_seed() { - let seed = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; - let key_pair = BLSKey::key_with_seed_data(&seed, true); - let key_pair_fingerprint = key_pair.fingerprint(); - assert_eq!(key_pair_fingerprint, 0xddad59bb, "Testing BLS private child public key fingerprint"); - let seed2 = [1, 50, 6, 244, 24, 199, 1, 25]; - let key_pair2 = BLSKey::extended_private_key_with_seed_data(&seed2, true).unwrap(); - let key_pair2_fingerprint = key_pair2.fingerprint(); - assert_eq!(key_pair2_fingerprint, 0xa4700b27, "Testing BLS extended private child public key fingerprint"); -} - -#[test] -fn test_bls_signature_verify_secure_aggregated() { - let public_keys = vec![ - "8f3a813aa68a07fca73c616ea60d0dfbc81667c24a8ac6e6d4c9a64c6d162d5738808c5eab7138742a3d17c814a8bf94", - "92058ad273ac46e18e4f43a20b5bcfbabdcded712d80387eeabaf190d4351f45749db9a9d1bf4e13e4ae946a03ed4015", - "08ff9920aa7391cf47e0a1a816ab4c67e037a5d448d2cf28b4d8c7c4008c459eadbe5134f7176804046521ec0b49341e", - "8b817dcf0c4233d3c71ceae42db90a1b630f1f97285b4ffd265387a088a7d38400cd705ca090bd9c0f4619a225e16c73", - "91008785993639ba13e4e20981c89ed9a64a0e561da60e7e286f25c397d6e0db06acdded783b247fe26f2f2ff6665184", - "0936107afd59a0433113ee3d77ef0ed7bc48790f70959460fdcac663f7050b4e48179c68228fe15f91dd6c19c702d0c8", - "05ee12ead9b2fcbcd20e028acb74226fd75ec271ad8daa431fb9e6fdeea0070aeffb080c21edca34385060a1c8c05bdd", - "064cd7b508ad623a51d79c8557a667499383e8d723ec79792d08bfce5fb96a6a898f502b74ab79761fed79c652c081d9", - "919ad9aa930fc2cdafed3db371eb52dede4d14c9d170d1a75714556da791bc6973761ac975163488f258b988eb19d487", - "02ab52425100d319bc1b5e1382c4eba074f73f2ae94f6e1713ffd9a0f513b541f44d9a0879f48fdcaf3521ebd3b734e3", - "8f7242bdba0921c2418d4e3be676e320c0ba9ea86b5d185dd1dc1e665587925086e8bd0de4473f9eba0f1487ddf81f86", - "0a354bd6de479dce0864fced9cc8e3f7ee39f1f77a69b28d75745907a7e76e6565d6b5b12bc7cd64284d910650f8ccb1", - "921958278157241233fe7e816d06c4bba25583a108507c691d3ee45e3a7231a5606c31161c1c32614f74deff608690d9", - "944be5269df80a87677dd9c7f6202c58d7b8eeeff712b2581b96956e823f02b7095a0fa27d12f8e10a426fa666abe7d2", - "81b1f0151edf35e001385496b0b18481d4293eb1218f8105be8068d7864c535825d134f70177922a1c64674c87e10829", - "11d3f729e18d03589e5795565318007ec11675fbcd970ff72c6d8534f0a9e582f00d6254d897e5563e90286a5ab2197f", - "81a5c8199317dc83bebfa4b00c3c50c3c3ce9e1af8271016c44821dcb3f4a8181a35c21e3914d765f5a4e2059ebd5bbb", - "8451624e5fbcdcf1703e9c1e80cef6e07e648ce343952f3e30c82c17c64a934870b54f30249398532e4a3e74a1e07df4", - "8e1fbec112bc165a30db65e2bfbde2459fad2a590bcdca6c2350355ab9920c7db88655ac6ac25ed190f8e58900cfa507", - "114923b2ea69b786b8dd5ae2b95f726903735714890b923d42288f8a46d894009749f5acd47340de1a3a4d33d80a3258", - "0e7e5a1f72524c3bab4d7990a27af8d4451a327109549d876ec522e22305cadf80c9ff0f74d1a200dbcdb1376afd34e5", - "892bda25e986cfdce112814bff6bb7f01b5bba267f503902d006ed0c30c4c27b782bf3cdfdb761514fba52129e45f76f", - "99dc46b3b77144740a64f5dc1ca597424ac998d2a00e1eea6b248a02a5a53f9db0e122e598ad93d83b046ba3105d2f1a", - "8e433404d5169db60433f21db99edcce1afcb548d2b0414c9dbab698148aaaf8d91e1ee94a021404e5d8d3d644835659", - "0c3cd2a62cf315fb5c34615d8fda0d032d88de74d8100e85c4c07bb636ab609b699e1d593506eb160d4adfcd9f86dad8", - "0f396fa4c452d8c6eb1eb993bdea8af98f96c65bf0cc37ef5048c895af4e89aa8babaa95111157a0d0aaefe1809282a1", - "8162cb75478d2328c6af409b3ba0f4f720cd30c340d0b608e62bfb7ed72015a35f1ff5225acbd97af2a33320fe3ede48", - "8d630e590710227707903890ebb933e2c12cacd477f689a258cc2bcefc481ada7513b9e8a11878481f8aae36fc278fa8", - "01da056d3b253e6660c98771aea644191640f179dee3674f0c720ae896ebc9a4614f707c6809ad8f33a7226abf65d549", - "0bba5dc0e216fa128d8701d0ce4de39e2dc39f16a0a3ceeced7fcc89d17b65cee32362bc68b712bfc9cc5490c334c6e6", - "86f9f8c4738f1e83450f785017b983c6036ddcb23d16ba08735c51c531347dc3aa5ee8471ad883d2b1dd0873f6e18a70", - "860413b84c02b5bfd97f44a2737dc4bd20404614d74e63da02d3dd91fd211d7c5b4ffc9caa23b277b53b96ec50bd7ff7", - "05e2e0ff4488026ff18e1700c8378f50e4b84b9222ee46d0898ba7debe7da7121f98edca635bd167345e7904ee08330c", - "13e6578f575c681f159b019fbc7d425f6e9cee2a4bfc98bad504026418d351aec1f0e91a66de53ef8899ab6fb66a1bed", - "12e53b9b0f93bdac4d25e78fb5610aa4a10d12906586b1e162598a31718af93d015162ed7bb1d21daab9aa85e164afd1", - "183ad2fa4d5622e12ef083304461bcc046c41c2a24b2f1ef7b36e2fe8bc50f48dbef75cf51128bfa4e280ba724babf23", - "90908933bd97769966d74a7a85fad9ce894ec6dd943b71678a2ec87a155a9a0a390707e64d384a6452fe478771262504", - "1232235225905ae0f2f765dcc3908e2e40d241bf9783ee7e39831bf76b620e3c019fdb522900563dc06a0494b036c27e", - "0933c9280553bdf898189d3dec95419262433defd4bef9e90611ffc05376e582fe41f57d4b0547852928da79171e29fa", - "8f2d54ffb351acc9fb8ca90726b02320832dda589a83fae040611d96a0a6917a5fbac2841232e18312f675c6a5aee670", - "9555f97d16e75a135d98ec2f52a8881a60c790673cad6d9f0ef0e52bca3b0607aaa19cfec7ef4512e85b7fc687d0f3e6", - "84830a7f9af1b788df3060c089e3e7d6e242e94802dfb8d2eb46d69aa27276a860963c52b20f41cdb4791a71e58b4344", - "892fc0e02bff6e41f119ddb6f7f0d475a2721f101a26830db026681383fbbfab0cfa488473b51f511edab979ed915b28", - "8c8440a82f2fa19bcf1a1324de03db6beba690da39c79c7e09835728026c46a59475e2fae6d0fbe20c01a128e796aac8", - "8614b12d8761ef8fffe132725a9a6b511abe7823df3c0022ab3e4dec221cf8ce2ab6589cd617779023a54056d87f997b", - "89718b0bcc8233af8df3eab1f3d2003282506e6babe096eae072cb8a435431fb3ca0359ef7ee8bfb3fbe981debdf9c0f", - "0abc9b9ee35465c024cf4c72ed60dcb600c8657e6deff6f4ad69400b5f3a9d5140bb7c09c5262cd1265c093a7cb6c184", - "10f912e265e3865b0ca0e7a8514616f541d2526e493212d0e82218f2ec7abce09eeb0316d165cdf006dfb596b37380d9", - "8624a671b7eb6111e53adf55806ac01d6c0af6da23fe3e964650ed39b017585291cd6e2b3ff20a1f658aa26b4836abf6", - "069fdc47b17e21a2c12eb27e81ff4c011f8088b3525cb1e6140a6f7db38123232ede01ee4fb2b7be143b756533a77ef6", - "1053fe7f087d571a864a5a7408002f0ad786b33f06db9b719f39ed37af60270eb0c9e494833b6d2d1f029ec2700d3e6d", - "954b5017998fe8a16d3946ed13ffa255c546a1dbd478e5bb3a2657de4d331a6abda1587ee83a8c6954bcad8ee43bb16c", - "0c08500f384056485306bc8ff98a26ede2d20248ea1f7ccbd3ddc8b29a0e46a8fcda6a02d7a12b6ae94207a441411477", - "8e2c3b1b98e45c78c9ccd7934064da30b18f6891417a7915d8dd7ee3dc5be76baa6e164e3dc0ae7185e9a3b449bfe813", - "17ac04dcbe4572333decb848d4dcea1c2e5edf24a1e774aa1c1c6f31dbc3261883ad27cacd2efdd2ab91b24a77390b3f", - "0eda3c087f9a593efe4c8fa7fd4ce02c587952b1bc20a49b2d21d573213c4f47a6db3494b1a33a0749518ba3bc0002d0", - "022a15f6c1f3af9376cadbf2e99684de157ddcdd0966fac9fddb9772867213b867994bdcb55c8ea30e41b19c385f9fe4" - ]; - let members_signature = UInt768::from_hex("052f62455ad81786528a2c7b7ab4c22f812982ed99c0799e6cbf9a719a76e9cff2eaca9aefd41f29922c2f85e3c3d70a1100b35bc0d7d25bd54291d99234bf556a5649e8cccf4fddb040ebaca5fa401b0ec409cbd285f6c58a8dc17b521b2093").unwrap(); - let commitment_hash = UInt256::from_hex("656e3b2e895b155da40860ad4c09d48204d0847f1eb20bd1ebbe9416bfbd7961").unwrap(); - let operator_keys = public_keys.iter() - .map(|s| OperatorPublicKey { data: UInt384::from_hex(s).unwrap(), version: 1}) - .collect::>(); - assert!(BLSKey::verify_secure_aggregated(commitment_hash, members_signature, operator_keys, true)); -} - -fn test_bls_verify_random_signature_using_scheme(schema: S) { - let len: usize = thread_rng().gen_range(0..30); - let mut vec_pks = Vec::with_capacity(len); - let mut vec_sigs = Vec::with_capacity(len); - let hash = UInt256::random().0; - for _i in 0..len { - let private_key = PrivateKey::from_bip32_seed(&UInt256::random().0); - let signature = schema.sign(&private_key, &hash); - let public_key = private_key.g1_element().unwrap(); - vec_sigs.push(signature); - vec_pks.push( public_key); - } - let signature = schema.aggregate_sigs(vec_sigs.iter().collect::>()); - let public_key = schema.aggregate_public_keys(vec_pks.iter().collect::>()); - assert!(schema.verify(&public_key, &hash, &signature)); -} - -#[test] -fn test_bls_basic_signature_verify_secure_aggregated() { - test_bls_verify_random_signature_using_scheme(LegacySchemeMPL::new()); - test_bls_verify_random_signature_using_scheme(BasicSchemeMPL::new()); -} - -#[test] -fn test_bls_llmq_50_60() { - // LLMQ::verify at 871584: Llmqtype50_60 - let commitment_hash = UInt256::from_hex("0f602593b3ea2d71d14728edce3e92a29d800e6745baf7de5ac3c3a2a2c627f5").unwrap(); - let signature = UInt768::from_hex("a97b10b1b24fd6aa0f958f73dcbab59e4bfca46647189cf0e186e25e355d74752a3069f6d030118860717068c611fcf513c6b1aafb75c1010bd76085f43e32401a1e58ba7f20acc99aefc7c00f9b04ce346767804095b7e014a68192614da077").unwrap(); - let operator_keys = vec![ - OperatorPublicKey { data: UInt384::from_hex("a2fea620ee07107d6611b7ccf5726e0e8247a131a3f129eb2b3195fe0fc1a91044af42a839915161e2105944252c59aa").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("890f1ca955443740346b5b4b0bfb8251f040074b5a2feb77e54add831bf34aaf1d84207691f6f5aa5e702152a496fadc").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("9130b42d6eb505e811dfb18ff87c4bcacde56b76a7d47a8db88ca26e75f5c2eebdd767d440f375784f9d1f127f57c977").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("94e81203caa5c0cc305b5e0f3ae7a388b974a629358e4e83e50a25b2c2a387e3d114c7c82e2b23c25b65585220e63c99").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("99c6bb8f02fe03ebfe9f3c8900dd764e6f379ca1061b8dbd8ce6b6b139489c9083a84ee60f2aca4ae114797abc07d945").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("ac290b31d2e878c2d7235efb0c61f423aa37742a31318e61f8bb0bd6c110a892dc244512fec12a8b0fe7cbb08e12be28").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("a42c53c3aa11ae4b985a52ae6a3170bdb58f88ec04c62013f9322bd5fda4417939836b6f41741dd864c348103a1155d3").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("96ca29d03ef4897a22fe467bb58c52448c63bb29534502305e8ff142ac03907fae0851ff2528e4878ef51bfa3d5a1f22").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("852057284a7a9dbccb97fbaea3425104901dc661b69294a55c7ca800ed18d37df7ccc02367b5d6836ee4f6b052249a1d").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("97596d7a72b65531fffd5f610752422d6e286c975f30d026092f7900f8015073bd6f6d1b85dd3981814c093910e7dac6").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b05caab51ff07a2f8d69972fd6ec09f6f9893cf6dfc49775f5a2db2ea7a8a525bbaf4e7e369d06590f6f2e8e4658d4dc").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("8aeb5c2757211202b3afd2033ec1b4ef2dfe376ba5c6c07b45e6a7460afa4086423c4a704eb9a781514fbc513e190a62").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("8c9bf080a96d13b356b01e734618a77225f03b3e92684f252ccbd313764a9fd9247bde6b00d92f6b5669043e77860453").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("94e199beb2a2a59166a12a851ef158928bc5efc25b39eb78b3a428b25384609d8c03548a94e77c0c941c90c68a4187d8").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b2823797ad456d53ce1e6bde84e8a19164ff88a73ccd242ec48d9c6a479f2a049e214c7e8ec2243b7ea74ca6144ab2c5").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("8196970badc74d068ec1226ffd4a656313decef59d792237a32e6ff56cd4e43030c436025831a4a3d0306a616f033810").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("adeed4d18add0ef5a7dff743a206786ab2dcc1b4aff679a61577dea99b62fb24dd56e3fe7ff65fa0be964dc5d7967c3e").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("95a577f51dc6fd7fa4621f0a4601e48fd65418a89c2af2afef725fb4f053a8ee5841cd3fdae39ebdf5a202e0c4deca23").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("82ce863d0843ca66b4a64d94c0d84ec15980ea04e4444ac4d4188f38cc0da4d6d2360b8a2046725b682862255af6a48c").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("a26fc7f30c49215b98d5cb47a350f888a306c52fa42c77e765b55288e622f03859273cae7e1cac99e67f7a9a96a6aa2c").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b37befcc17d16d4154ea8bbe82e9bd52e2ecd825dd9a43f58730d594d87cceebcb41e11461319fd71bfc08d0a0545200").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("84c0ca8535c114f8f1b369f339b2653e7126610f5170b223970f4e63ad7b55ea2f61a08e263b51fb03f6940d655690f9").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b3ea90ebcf0d8e332e37e5ac3c676653bb1203e8db7604bb0ac64a9b655b553de514e9bff5eeb86bb3ef9178375392f9").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("875b907b6d6c12aa111da0e102186b9d06f4e065969b60732207f18c2c5d0deb8ecba47cb4c0929647db0e2fae6f08ca").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("a42d732a03847819b1e2675ac48b9af4a1c92b310ecacc42c428ff902099cc47d08ecd4616da55d185463855aee99f79").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("ac9c5c77fe321ff0a115d1ba5bf7462063ef21a82ba796415f4ee538bf9e8a6a49707530c72cbb6b60026c46ff1b9443").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("8e9855b2ee991f988e446b60dcd637f33a782baf1e755785ca058f0398133bf3a95e4e77d4168c13c47d7e3fb1e3ecfc").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("93146b3252f408f1cffc875b12b61f56c1ae02113b24c0b5aaedcda4a9b509332c8c4587450074f3e0906aaf3ceca754").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b9d1a6a4f7f817d2e004134d96fa0c831433e9c649726ba8567f447d1b2394209bc1ef184a93c707054fb6816790de30").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b888fe437eab3af5a7fee4e0164705458a6fda97ae390d69721a5f1d3830ec330fb53c6a29588f1f94f69adcff04ca09").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("90d4c6a24d00d70fe961b77d58eff318bb6cd00c122bcfa20f92d65d03b9fd3afa5a0effc90810103a53d53ab155f764").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("8fa5377eb256323aace31b45c3e48ea110404b053cb80e8043bd1e44de1705130548e4ab28738816251ea57a7fc10324").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b2cafe1870e043973b2f1fded8de3d5a66dac5ade46aa0995157077efee92d852857bc7f03ed69c92723a58f8bd2926e").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("aa0ede82d78a0a8f4c2332d431c7be496c3aa09349ed3b2db30f7eb7dcc7b6e580a9d71f7d76bdaca1b3670e0cf4cd3c").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("97f78abcee6d2ed68bf2c82afbf56ef9af67313e2eb655ea5178850907cb3057cae0bb5a1d09f161057bf62f9d4890c6").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("80ea87eef15f38c1a844d77348e687794c601277011c933026cdfdb649524632b055feea3539abc48472cb447d281d65").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("8ad4f577d067630f6fd15f4d2aefdb9456d648b71cb7253d47511acc81dd5ddb69a03c848322aa11e5242f66afde5a2a").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("92730062f122f937b29f69536db3ad36980b88004eadc2ca341425d432723d67e53a4f55786c54017d77c1bd1df6b310").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("81f24418ec73b09b00514dba8fb18d6d8af1dc2ff93d594bf987911f3b98d659eb43286cd450b7e1ee5978b361660d73").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b0051db915bd86bd938746c14440b11ee3b2801cbc6d6c1c912e8b41ea5eb1d8f852abf220ae91ecdb6da094846c1ba8").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("80a2e66a810493a91b5ed1a8ef8ac4be41543598f5b4765a6f5d6339078ab88030817dc9c9bdb60c7c7a02d7787d6f2e").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("95f9da603c572257802a689964ca8f4d96f9b94f33ab75968c9cb6c730a28d50b7bb72ac2cfceee6ab0755ead9cb53cd").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("90e3caa7ae519505a6e1f3b56d3a99865f70e48f772ac431c3964a33cce7fe1e736d43ec3343ad843faaaa2b2bb3a921").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b7d5f022c3b6c314bde5171ead1616e4c27f0e9a48a9a9dc3a7227a62d42213b93c8a4c32af18bd8ff931b7732782e09").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b32f6fc90c9dcaacdf9d836a2a7e60d090fe5e55b0b02f5a4f608a4b8235ba5aa7abc4e05f9387d1d942adc57c87f5b7").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("911a30e0a5f2f5135dcc5f09498e4ba5de22c7680f396599f7f29b91ac569c3d4336bc157443cf8c06682bfb5abb2271").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b4a637afe3810d73e3402b5d6a398e45222ba846a339f1c3570aa8e3f7f5b9d7acef08ac234cce4f706671498330a599").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("8dc75e865b89e96560b38fae96f1d0a5438795778e68b705a506046245ca5dbbedb09e2379eea4c9bde0d0fd4fe05080").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("882cbd9118474316f40b800e43f94a121928f256fd340098ff0ad81a902c4326dda4b42737d52739482f2baa80c487cc").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("92fa57a5676925e8dfe3b340df2132f5844ad9f89594b04efa28fb4fb884fe21f411fa49120ed7a60ce9381a54232a10").unwrap(), version: 2 } - ]; - let use_legacy = false; - - let all_commitment_aggregated_signature_validated = BLSKey::verify_secure_aggregated( - commitment_hash, - signature, - operator_keys, - use_legacy); - assert!(all_commitment_aggregated_signature_validated); -} - diff --git a/dash-spv-masternode-processor/src/tests/keys/ecdsa.rs b/dash-spv-masternode-processor/src/tests/keys/ecdsa.rs index 159b6be9..a0067c31 100644 --- a/dash-spv-masternode-processor/src/tests/keys/ecdsa.rs +++ b/dash-spv-masternode-processor/src/tests/keys/ecdsa.rs @@ -1,50 +1,51 @@ -use hashes::hex::{FromHex, ToHex}; -use hashes::{sha256, Hash}; - -use crate::chain::common::ChainType; -use crate::crypto::UInt256; -use crate::keys::{ECDSAKey, IKey}; -use crate::util::address::address::is_valid_dash_private_key; -use crate::util::base58; -use crate::util::data_append::DataAppend; +use dashcore::hashes::{sha256, sha256d, Hash}; +use dashcore::hashes::hex::FromHex; +use dashcore::secp256k1::hashes::hex::DisplayHex; +use dash_spv_crypto::network::ChainType; +use dash_spv_crypto::derivation::{IIndexPath, IndexPath}; +use dash_spv_crypto::keys::{ECDSAKey, IKey}; +use dash_spv_crypto::keys::key::{IndexPathU256, KeyKind}; +use dash_spv_crypto::util::address::address::is_valid_dash_private_key; +use dash_spv_crypto::util::base58; +use dash_spv_crypto::util::data_append::DataAppend; // TODO: impl bip38 and their tests fn test_sign_key(secret: &str, message: &str, compressed: bool, test_signature: &str) { match ECDSAKey::key_with_secret_hex(secret, compressed) { - Some(mut key) => { - let message_digest = sha256::Hash::hash(message.as_bytes()).into_inner().to_vec(); + Ok(mut key) => { + let message_digest = sha256::Hash::hash(message.as_bytes()).to_byte_array(); let sig = key.sign(&message_digest); let test_sig = Vec::from_hex(test_signature).unwrap(); assert_eq!(sig, test_sig, "Signature don't match"); - assert!(key.verify(&message_digest, &sig), "Can't verify signature"); + assert!(key.verify(&message_digest, &sig).is_ok(), "Can't verify signature"); }, - None => panic!("key_with_secret_hex: Key is invalid"), + Err(err) => panic!("key_with_secret_hex: {}", err), } } -fn test_compact_signature_recovery(signature: &[u8], md: UInt256, test_data: Vec) { +fn test_compact_signature_recovery(signature: &[u8], md: [u8; 32], test_data: Vec) { match ECDSAKey::key_with_compact_sig(signature, md) { - Some(key) => assert_eq!(key.public_key_data(), test_data, "public key data doesn't match"), - _ => panic!("Key can't recovered") + Ok(key) => assert_eq!(key.public_key_data(), test_data, "public key data doesn't match"), + Err(err) => panic!("Key can't recovered: {}", err) } } fn test_compact_signature_key(secret: &str, message: &str, compressed: bool) { match ECDSAKey::key_with_secret_hex(secret, compressed) { - Some(key) => { - let message_digest = UInt256::sha256_str(message); - let sig = key.compact_sign(message_digest); + Ok(key) => { + let message_digest = sha256::Hash::hash(message.as_bytes()).to_byte_array(); + let sig = key.compact_sign(&message_digest); test_compact_signature_recovery(&sig, message_digest, key.public_key_data()); }, - None => panic!("key_with_secret_hex: Key is invalid") + Err(err) => panic!("key_with_secret_hex: Key is invalid {}", err) } } fn test_restore_compact_signatures_from_base58(signature: &str, message: &str, test_key: &str) { match (base58::from(signature), base58::from(test_key)) { - (Ok(sig), Ok(data)) => test_compact_signature_recovery(&sig, UInt256::sha256d_str(message), data), + (Ok(sig), Ok(data)) => test_compact_signature_recovery(&sig, sha256d::Hash::hash(message.as_bytes()).to_byte_array(), data), _ => panic!("Bad base58") } } @@ -54,26 +55,26 @@ pub fn test_key_with_private_key() { let chain_type = ChainType::MainNet; // wrong private key assert!(!is_valid_dash_private_key("7s18Ypj1scza76SPf56Jm9zraxSrv58TgzmxwuDXoauvV84ud61", &chain_type.script_map()), "valid when invalid"); - assert!(ECDSAKey::key_with_private_key("hello", chain_type).is_none(), "valid when totally invalid"); + assert!(ECDSAKey::key_with_private_key("hello", chain_type.clone()).is_err(), "valid when totally invalid"); // uncompressed private key assert!(is_valid_dash_private_key("7r17Ypj1scza76SPf56Jm9zraxSrv58ThzmxwuDXoauvV84ud62", &chain_type.script_map()), "invalid when valid"); - match ECDSAKey::key_with_private_key("7r17Ypj1scza76SPf56Jm9zraxSrv58ThzmxwuDXoauvV84ud62", chain_type) { - Some(key) => { - let addr = key.address_with_public_key_data(&chain_type.script_map()); + match ECDSAKey::key_with_private_key("7r17Ypj1scza76SPf56Jm9zraxSrv58ThzmxwuDXoauvV84ud62", chain_type.clone()) { + Ok(key) => { + let addr = key.address_with_public_key_data(chain_type.clone()); assert_eq!("Xj74g7h8pZTzqudPSzVEL7dFxNZY95Emcy", addr.as_str(), "addresses don't match"); }, - None => { assert!(false, "Key is invalid"); } + Err(err) => assert!(false, "Key is invalid: {}", err) } // compressed private key - match ECDSAKey::key_with_private_key("XDHVuTeSrRs77u15134RPtiMrsj9KFDvsx1TwKUJxcgb4oiP6gA6", chain_type) { - Some(key) => { - let addr = key.address_with_public_key_data(&chain_type.script_map()); + match ECDSAKey::key_with_private_key("XDHVuTeSrRs77u15134RPtiMrsj9KFDvsx1TwKUJxcgb4oiP6gA6", chain_type.clone()) { + Ok(key) => { + let addr = key.address_with_public_key_data(chain_type.clone()); assert_eq!("XbKPGyV1BpzzxNAggx6Q9a6o7GaBWTLhJS", addr.as_str(), "addresses don't match"); // compressed private key export - assert_eq!("XDHVuTeSrRs77u15134RPtiMrsj9KFDvsx1TwKUJxcgb4oiP6gA6", key.serialized_private_key_for_script(&chain_type.script_map()).as_str(), "serialized_private_key_for_script"); + assert_eq!("XDHVuTeSrRs77u15134RPtiMrsj9KFDvsx1TwKUJxcgb4oiP6gA6", key.serialized_private_key_for_script(chain_type.script_priv_key()).as_str(), "serialized_private_key_for_script"); }, - None => { assert!(false, "Key is invalid"); } + Err(err) => assert!(false, "Key is invalid: {}", err) }; } @@ -182,21 +183,21 @@ fn private_key_with_non_base_string() { let ipk3 = "eee3e42d35d1c75ea4cf3dbc902de9619faf0cd6ba1ab178a873d80c3f7dc90c"; let ipk4 = "19d6aba7a9fcdb627ad39a2176689c2dcca13db68415411d88b1c37c2103794a"; let ipk5 = "b4788261554d2f74647e547ef34018c228b7869191c0dc0086d91901c515c370"; - let pk1 = ECDSAKey::key_with_private_key(ipk1, chain_type); - let pk2 = ECDSAKey::key_with_private_key(ipk2, chain_type); - let pk3 = ECDSAKey::key_with_private_key(ipk3, chain_type); - let pk4 = ECDSAKey::key_with_private_key(ipk4, chain_type); - let pk5 = ECDSAKey::key_with_private_key(ipk5, chain_type); - assert!(pk1.is_some(), "pk1 is none"); - assert!(pk2.is_some(), "pk2 is none"); - assert!(pk3.is_some(), "pk3 is none"); - assert!(pk4.is_some(), "pk4 is none"); - assert!(pk5.is_some(), "pk5 is none"); - let ia1 = pk1.unwrap().address_with_public_key_data(&script_map); - let ia2 = pk2.unwrap().address_with_public_key_data(&script_map); - let ia3 = pk3.unwrap().address_with_public_key_data(&script_map); - let ia4 = pk4.unwrap().address_with_public_key_data(&script_map); - let ia5 = pk5.unwrap().address_with_public_key_data(&script_map); + let pk1 = ECDSAKey::key_with_private_key(ipk1, chain_type.clone()); + let pk2 = ECDSAKey::key_with_private_key(ipk2, chain_type.clone()); + let pk3 = ECDSAKey::key_with_private_key(ipk3, chain_type.clone()); + let pk4 = ECDSAKey::key_with_private_key(ipk4, chain_type.clone()); + let pk5 = ECDSAKey::key_with_private_key(ipk5, chain_type.clone()); + assert!(pk1.is_ok(), "pk1 is none"); + assert!(pk2.is_ok(), "pk2 is none"); + assert!(pk3.is_ok(), "pk3 is none"); + assert!(pk4.is_ok(), "pk4 is none"); + assert!(pk5.is_ok(), "pk5 is none"); + let ia1 = pk1.unwrap().address_with_public_key_data(chain_type.clone()); + let ia2 = pk2.unwrap().address_with_public_key_data(chain_type.clone()); + let ia3 = pk3.unwrap().address_with_public_key_data(chain_type.clone()); + let ia4 = pk4.unwrap().address_with_public_key_data(chain_type.clone()); + let ia5 = pk5.unwrap().address_with_public_key_data(chain_type); assert_eq!(ia1, "yaMmAV9Fmx4St7xPH9eHCLcYJZdGYd8vD8"); assert_eq!(ia2, "yhf7gKjEimNd1uYatJBk3Xw88oKgE4Texj"); assert_eq!(ia3, "yVLAtNKRZsX3nh8v4e9cVnk79xows2nYXX"); @@ -209,9 +210,37 @@ fn private_key_with_non_base_string() { let script4 = Vec::::script_pub_key_for_address(&ia4, &script_map); let script5 = Vec::::script_pub_key_for_address(&ia5, &script_map); - assert_eq!(script1.to_hex(), "76a9149a01e1b57808ed4f14553fc4624de20c13c9e97e88ac"); - assert_eq!(script2.to_hex(), "76a914ea12f5467a2351e842fcf6124435273039fe185e88ac"); - assert_eq!(script3.to_hex(), "76a91462dc3919f49e95fe2e81af07d96149d0fd77353588ac"); - assert_eq!(script4.to_hex(), "76a914cb28bc5238bf5fcb97ddc7763ccc8c8a34fb38cd88ac"); - assert_eq!(script5.to_hex(), "76a9145ca1190f85fb51c702f6ee97e8871c7a6b14bc7788ac"); + assert_eq!(script1.to_lower_hex_string(), "76a9149a01e1b57808ed4f14553fc4624de20c13c9e97e88ac"); + assert_eq!(script2.to_lower_hex_string(), "76a914ea12f5467a2351e842fcf6124435273039fe185e88ac"); + assert_eq!(script3.to_lower_hex_string(), "76a91462dc3919f49e95fe2e81af07d96149d0fd77353588ac"); + assert_eq!(script4.to_lower_hex_string(), "76a914cb28bc5238bf5fcb97ddc7763ccc8c8a34fb38cd88ac"); + assert_eq!(script5.to_lower_hex_string(), "76a9145ca1190f85fb51c702f6ee97e8871c7a6b14bc7788ac"); } + +#[test] +fn derivation() { + let seed = Vec::from_hex("000102030405060708090a0b0c0d0e0f").unwrap(); + // let index_path = IndexPath::::new(vec![1, 2147483650]); + // let index_paths = vec![index_path]; + let chain_type = ChainType::MainNet; + let index_paths = vec![vec![1, 2147483650]]; + let derivation_path = IndexPathU256 { indexes: vec![[0u8; 32]], hardened: vec![true] }; + let derivation = IndexPath::<[u8; 32]>::new_hardened(vec![[0u8; 32]], vec![true]); + let result = KeyKind::ECDSA.serialized_private_keys_at_index_paths_wrapper( + &seed, + index_paths, + derivation_path, + chain_type.clone()) + .expect("Der err"); + + assert_eq!(result, vec!["XJ7oW51NaNjnnQ5a2VitTSMhDEsuZLs3QMaWu6gU3LheqAQ6Edz7"]); + + let result = KeyKind::ECDSA.serialized_private_keys_at_index_paths( + &seed, + vec![IndexPath::::new(vec![1, 2147483650])], + &derivation, + chain_type) + .expect("Der err"); + assert_eq!(result, vec!["XJ7oW51NaNjnnQ5a2VitTSMhDEsuZLs3QMaWu6gU3LheqAQ6Edz7"]); + +} \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/tests/keys/ed25519.rs b/dash-spv-masternode-processor/src/tests/keys/ed25519.rs index 4536c1f8..453aaec7 100644 --- a/dash-spv-masternode-processor/src/tests/keys/ed25519.rs +++ b/dash-spv-masternode-processor/src/tests/keys/ed25519.rs @@ -1,12 +1,12 @@ use base64::{alphabet, Engine}; use base64::engine::{GeneralPurpose, GeneralPurposeConfig}; -use hashes::hex::{FromHex, ToHex}; -use hashes::{Hash, sha256}; -use crate::chain::derivation::{IIndexPath, IndexPath}; -use crate::crypto::{UInt160, UInt256, UInt512}; -use crate::crypto::byte_util::AsBytes; -use crate::keys::{IKey, KeyKind}; -use crate::lib_tests::tests::register_logger; +use dashcore::ed25519_dalek; +use dashcore::hashes::hex::{FromHex}; +use dashcore::hashes::{Hash, sha256}; +use dashcore::secp256k1::hashes::hex::DisplayHex; +use dash_spv_crypto::crypto::byte_util::{from_u32, from_u64}; +use dash_spv_crypto::derivation::{IIndexPath, IndexPath}; +use dash_spv_crypto::keys::{IKey, key::KeyKind, DeriveKey, ed25519_key}; fn test_derivation_path() { @@ -23,14 +23,12 @@ pub fn test_key_with_private_key() { // private: 171cb88b1b3c1db25add599712e36245d75bc65a1a5c9e18d76f9f2b1eab4012 // public: 008fe9693f8fa62a4305a140b9764c5ee01e455963744fe18204b4fb948249308a //--------------------------------------------------------------------------------------------------// - let i = UInt512::ed25519_seed_key(&seed_data); - let seckey = ed25519_dalek::SecretKey::try_from(&i.0[..32]).unwrap(); + let (seckey, chaincode) = ed25519_key::seed_key(&seed_data).unwrap(); + let seckey = ed25519_dalek::SecretKey::from(seckey); let signing_key = ed25519_dalek::SigningKey::from_bytes(&seckey); - let public_key = UInt256::from(ed25519_dalek::VerifyingKey::from(&signing_key)); - let chaincode = UInt256::from(&i.0[32..]); - assert_eq!(signing_key.to_bytes().to_hex(), "171cb88b1b3c1db25add599712e36245d75bc65a1a5c9e18d76f9f2b1eab4012", "private key is wrong"); - // assert_eq!(public_key.0.to_hex(), "008fe9693f8fa62a4305a140b9764c5ee01e455963744fe18204b4fb948249308a", "public key is wrong"); - assert_eq!(public_key.0.to_hex(), "8fe9693f8fa62a4305a140b9764c5ee01e455963744fe18204b4fb948249308a", "public key is wrong"); + let public_key = ed25519_dalek::VerifyingKey::from(&signing_key); + assert_eq!(signing_key.to_bytes().to_lower_hex_string(), "171cb88b1b3c1db25add599712e36245d75bc65a1a5c9e18d76f9f2b1eab4012", "private key is wrong"); + assert_eq!(public_key.to_bytes().to_lower_hex_string(), "8fe9693f8fa62a4305a140b9764c5ee01e455963744fe18204b4fb948249308a", "public key is wrong"); } /// Without padding-byte 0x00 in public key data there are different result for this test vectors @@ -46,77 +44,79 @@ pub fn test_vector_1_derivation() { println!("••••••••••••••••••••••••••••••••••••••"); let indexes = vec![]; let hardened = vec![]; - let index_path = IndexPath::::new_hardened(indexes, hardened); - let private_key = seed_key.private_derive_to_256bit_derivation_path(&index_path).unwrap(); + let index_path = IndexPath::<[u8; 32]>::new_hardened(indexes, hardened); + let private_key = seed_key.private_derive_to_path(&index_path).unwrap(); assert_eq!(private_key.fingerprint(), 0, "fingerprint is wrong"); - assert_eq!(private_key.chaincode().0.to_hex(), "90046a93de5380a72b5e45010748567d5ea02bbf6522f979e05c0d8d8ca9fffb", "chain code is wrong"); - assert_eq!(private_key.secret_key().0.to_hex(), "2b4be7f19ee27bbf30c667b642d5f4aa69fd169872f8fc3059c08ebae2eb19e7", "private key is wrong"); - assert_eq!(private_key.public_key_data().to_hex(), "a4b2856bfec510abab89753fac1ac0e1112364e7d250545963f135f2a33188ed", "public key is wrong"); + assert_eq!(private_key.chaincode().to_lower_hex_string(), "90046a93de5380a72b5e45010748567d5ea02bbf6522f979e05c0d8d8ca9fffb", "chain code is wrong"); + assert_eq!(private_key.secret_key().to_lower_hex_string(), "2b4be7f19ee27bbf30c667b642d5f4aa69fd169872f8fc3059c08ebae2eb19e7", "private key is wrong"); + assert_eq!(private_key.public_key_data().to_lower_hex_string(), "a4b2856bfec510abab89753fac1ac0e1112364e7d250545963f135f2a33188ed", "public key is wrong"); println!("••••••••••••••••••••••••••••••••••••••"); //--------------------------------------------------------------------------------------------------// // Chain m/0H //--------------------------------------------------------------------------------------------------// - let indexes = vec![UInt256::from(0u64)]; + + let indexes = vec![[0u8; 32]]; let hardened = vec![true]; - let index_path = IndexPath::::new_hardened(indexes, hardened); - let private_key = seed_key.private_derive_to_256bit_derivation_path(&index_path).unwrap(); + let index_path = IndexPath::<[u8; 32]>::new_hardened(indexes, hardened); + let private_key = seed_key.private_derive_to_path(&index_path).unwrap(); assert_eq!(private_key.fingerprint(), 0xddebc675u32.swap_bytes(), "fingerprint is wrong"); - assert_eq!(private_key.chaincode().0.to_hex(), "8b59aa11380b624e81507a27fedda59fea6d0b779a778918a2fd3590e16e9c69", "chain code is wrong"); - assert_eq!(private_key.secret_key().0.to_hex(), "68e0fe46dfb67e368c75379acec591dad19df3cde26e63b93a8e704f1dade7a3", "private key is wrong"); - assert_eq!(private_key.public_key_data().to_hex(), "8c8a13df77a28f3445213a0f432fde644acaa215fc72dcdf300d5efaa85d350c", "public key is wrong"); + assert_eq!(private_key.chaincode().to_lower_hex_string(), "8b59aa11380b624e81507a27fedda59fea6d0b779a778918a2fd3590e16e9c69", "chain code is wrong"); + assert_eq!(private_key.secret_key().to_lower_hex_string(), "68e0fe46dfb67e368c75379acec591dad19df3cde26e63b93a8e704f1dade7a3", "private key is wrong"); + assert_eq!(private_key.public_key_data().to_lower_hex_string(), "8c8a13df77a28f3445213a0f432fde644acaa215fc72dcdf300d5efaa85d350c", "public key is wrong"); println!("••••••••••••••••••••••••••••••••••••••"); //--------------------------------------------------------------------------------------------------// // Chain m/0H/1H //--------------------------------------------------------------------------------------------------// - let indexes = vec![UInt256::from(0u32), UInt256::from(1u32)]; + + let indexes = vec![from_u32(0u32), from_u32(1u32)]; let hardened = vec![true, true]; let index_path = IndexPath::new_hardened(indexes, hardened); - let private_key = seed_key.private_derive_to_256bit_derivation_path(&index_path).unwrap(); + let private_key = seed_key.private_derive_to_path(&index_path).unwrap(); assert_eq!(private_key.fingerprint(), 0x13dab143u32.swap_bytes(), "fingerprint is wrong"); - assert_eq!(private_key.chaincode().0.to_hex(), "a320425f77d1b5c2505a6b1b27382b37368ee640e3557c315416801243552f14", "chain code is wrong"); - assert_eq!(private_key.secret_key().0.to_hex(), "b1d0bad404bf35da785a64ca1ac54b2617211d2777696fbffaf208f746ae84f2", "private key is wrong"); - assert_eq!(private_key.public_key_data().to_hex(), "1932a5270f335bed617d5b935c80aedb1a35bd9fc1e31acafd5372c30f5c1187", "public key is wrong"); + assert_eq!(private_key.chaincode().to_lower_hex_string(), "a320425f77d1b5c2505a6b1b27382b37368ee640e3557c315416801243552f14", "chain code is wrong"); + assert_eq!(private_key.secret_key().to_lower_hex_string(), "b1d0bad404bf35da785a64ca1ac54b2617211d2777696fbffaf208f746ae84f2", "private key is wrong"); + assert_eq!(private_key.public_key_data().to_lower_hex_string(), "1932a5270f335bed617d5b935c80aedb1a35bd9fc1e31acafd5372c30f5c1187", "public key is wrong"); println!("••••••••••••••••••••••••••••••••••••••"); //--------------------------------------------------------------------------------------------------// // Chain m/0H/1H/2H //--------------------------------------------------------------------------------------------------// - let indexes = vec![UInt256::from(0u32), UInt256::from(1u32), UInt256::from(2u32)]; + let indexes = vec![from_u32(0u32), from_u32(1u32), from_u32(2u32)]; let hardened = vec![true, true, true]; let index_path = IndexPath::new_hardened(indexes, hardened); - let private_key = seed_key.private_derive_to_256bit_derivation_path(&index_path).unwrap(); + let private_key = seed_key.private_derive_to_path(&index_path).unwrap(); assert_eq!(private_key.fingerprint(), 0xebe4cb29u32.swap_bytes(), "fingerprint is wrong"); - assert_eq!(private_key.chaincode().0.to_hex(), "2e69929e00b5ab250f49c3fb1c12f252de4fed2c1db88387094a0f8c4c9ccd6c", "chain code is wrong"); - assert_eq!(private_key.secret_key().0.to_hex(), "92a5b23c0b8a99e37d07df3fb9966917f5d06e02ddbd909c7e184371463e9fc9", "private key is wrong"); - assert_eq!(private_key.public_key_data().to_hex(), "ae98736566d30ed0e9d2f4486a64bc95740d89c7db33f52121f8ea8f76ff0fc1", "public key is wrong"); + assert_eq!(private_key.chaincode().to_lower_hex_string(), "2e69929e00b5ab250f49c3fb1c12f252de4fed2c1db88387094a0f8c4c9ccd6c", "chain code is wrong"); + assert_eq!(private_key.secret_key().to_lower_hex_string(), "92a5b23c0b8a99e37d07df3fb9966917f5d06e02ddbd909c7e184371463e9fc9", "private key is wrong"); + assert_eq!(private_key.public_key_data().to_lower_hex_string(), "ae98736566d30ed0e9d2f4486a64bc95740d89c7db33f52121f8ea8f76ff0fc1", "public key is wrong"); println!("••••••••••••••••••••••••••••••••••••••"); //--------------------------------------------------------------------------------------------------// // Chain m/0H/1H/2H/2H //--------------------------------------------------------------------------------------------------// - let indexes = vec![UInt256::from(0u32), UInt256::from(1u32), UInt256::from(2u32), UInt256::from(2u32)]; + let indexes = vec![from_u32(0u32), from_u32(1u32), from_u32(2u32), from_u32(2u32)]; let hardened = vec![true, true, true, true]; let index_path = IndexPath::new_hardened(indexes, hardened); - let private_key = seed_key.private_derive_to_256bit_derivation_path(&index_path).unwrap(); + let private_key = seed_key.private_derive_to_path(&index_path).unwrap(); assert_eq!(private_key.fingerprint(), 0x316ec1c6u32.swap_bytes(), "fingerprint is wrong"); - assert_eq!(private_key.chaincode().0.to_hex(), "8f6d87f93d750e0efccda017d662a1b31a266e4a6f5993b15f5c1f07f74dd5cc", "chain code is wrong"); - assert_eq!(private_key.secret_key().0.to_hex(), "30d1dc7e5fc04c31219ab25a27ae00b50f6fd66622f6e9c913253d6511d1e662", "private key is wrong"); - assert_eq!(private_key.public_key_data().to_hex(), "8abae2d66361c879b900d204ad2cc4984fa2aa344dd7ddc46007329ac76c429c", "public key is wrong"); + assert_eq!(private_key.chaincode().to_lower_hex_string(), "8f6d87f93d750e0efccda017d662a1b31a266e4a6f5993b15f5c1f07f74dd5cc", "chain code is wrong"); + assert_eq!(private_key.secret_key().to_lower_hex_string(), "30d1dc7e5fc04c31219ab25a27ae00b50f6fd66622f6e9c913253d6511d1e662", "private key is wrong"); + assert_eq!(private_key.public_key_data().to_lower_hex_string(), "8abae2d66361c879b900d204ad2cc4984fa2aa344dd7ddc46007329ac76c429c", "public key is wrong"); println!("••••••••••••••••••••••••••••••••••••••"); //--------------------------------------------------------------------------------------------------// // Chain m/0H/1H/2H/2H/1000000000H //--------------------------------------------------------------------------------------------------// - let indexes = vec![UInt256::from(0u32), UInt256::from(1u32), UInt256::from(2u32), UInt256::from(2u32), UInt256::from(1000000000u64)]; + let indexes = vec![from_u32(0u32), from_u32(1u32), from_u32(2u32), from_u32(2u32), from_u64(1000000000u64)]; let hardened = vec![true, true, true, true, true]; let index_path = IndexPath::new_hardened(indexes, hardened); - let private_key = seed_key.private_derive_to_256bit_derivation_path(&index_path).unwrap(); + let private_key = seed_key.private_derive_to_path(&index_path).unwrap(); assert_eq!(private_key.fingerprint(), 0xd6322ccdu32.swap_bytes(), "fingerprint is wrong"); - assert_eq!(private_key.chaincode().0.to_hex(), "68789923a0cac2cd5a29172a475fe9e0fb14cd6adb5ad98a3fa70333e7afa230", "chain code is wrong"); - assert_eq!(private_key.secret_key().0.to_hex(), "8f94d394a8e8fd6b1bc2f3f49f5c47e385281d5c17e65324b0f62483e37e8793", "private key is wrong"); - assert_eq!(private_key.public_key_data().to_hex(), "3c24da049451555d51a7014a37337aa4e12d41e485abccfa46b47dfb2af54b7a", "public key is wrong"); + assert_eq!(private_key.chaincode().to_lower_hex_string(), "68789923a0cac2cd5a29172a475fe9e0fb14cd6adb5ad98a3fa70333e7afa230", "chain code is wrong"); + assert_eq!(private_key.secret_key().to_lower_hex_string(), "8f94d394a8e8fd6b1bc2f3f49f5c47e385281d5c17e65324b0f62483e37e8793", "private key is wrong"); + assert_eq!(private_key.public_key_data().to_lower_hex_string(), "3c24da049451555d51a7014a37337aa4e12d41e485abccfa46b47dfb2af54b7a", "public key is wrong"); println!("••••••••••••••••••••••••••••••••••••••"); } @@ -132,84 +132,83 @@ pub fn test_vector_2_derivation() { println!("••••••••••••••••••••••••••••••••••••••"); let indexes = vec![]; let hardened = vec![]; - let index_path = IndexPath::::new_hardened(indexes, hardened); - let private_key = seed_key.private_derive_to_256bit_derivation_path(&index_path).unwrap(); + let index_path = IndexPath::<[u8; 32]>::new_hardened(indexes, hardened); + let private_key = seed_key.private_derive_to_path(&index_path).unwrap(); assert_eq!(private_key.fingerprint(), 0, "fingerprint is wrong"); - assert_eq!(private_key.chaincode().0.to_hex(), "ef70a74db9c3a5af931b5fe73ed8e1a53464133654fd55e7a66f8570b8e33c3b", "chain code is wrong"); - assert_eq!(private_key.secret_key().0.to_hex(), "171cb88b1b3c1db25add599712e36245d75bc65a1a5c9e18d76f9f2b1eab4012", "private key is wrong"); - assert_eq!(private_key.public_key_data().to_hex(), "8fe9693f8fa62a4305a140b9764c5ee01e455963744fe18204b4fb948249308a", "public key is wrong"); + assert_eq!(private_key.chaincode().to_lower_hex_string(), "ef70a74db9c3a5af931b5fe73ed8e1a53464133654fd55e7a66f8570b8e33c3b", "chain code is wrong"); + assert_eq!(private_key.secret_key().to_lower_hex_string(), "171cb88b1b3c1db25add599712e36245d75bc65a1a5c9e18d76f9f2b1eab4012", "private key is wrong"); + assert_eq!(private_key.public_key_data().to_lower_hex_string(), "8fe9693f8fa62a4305a140b9764c5ee01e455963744fe18204b4fb948249308a", "public key is wrong"); println!("••••••••••••••••••••••••••••••••••••••"); //--------------------------------------------------------------------------------------------------// // Chain m/0H //--------------------------------------------------------------------------------------------------// - let indexes = vec![UInt256::from(0u64)]; + let indexes = vec![from_u64(0u64)]; let hardened = vec![true]; - let index_path = IndexPath::::new_hardened(indexes, hardened); - let private_key = seed_key.private_derive_to_256bit_derivation_path(&index_path).unwrap(); + let index_path = IndexPath::<[u8; 32]>::new_hardened(indexes, hardened); + let private_key = seed_key.private_derive_to_path(&index_path).unwrap(); assert_eq!(private_key.fingerprint(), 0x31981b50u32.swap_bytes(), "fingerprint is wrong"); - assert_eq!(private_key.chaincode().0.to_hex(), "0b78a3226f915c082bf118f83618a618ab6dec793752624cbeb622acb562862d", "chain code is wrong"); - assert_eq!(private_key.secret_key().0.to_hex(), "1559eb2bbec5790b0c65d8693e4d0875b1747f4970ae8b650486ed7470845635", "private key is wrong"); - assert_eq!(private_key.public_key_data().to_hex(), "86fab68dcb57aa196c77c5f264f215a112c22a912c10d123b0d03c3c28ef1037", "public key is wrong"); + assert_eq!(private_key.chaincode().to_lower_hex_string(), "0b78a3226f915c082bf118f83618a618ab6dec793752624cbeb622acb562862d", "chain code is wrong"); + assert_eq!(private_key.secret_key().to_lower_hex_string(), "1559eb2bbec5790b0c65d8693e4d0875b1747f4970ae8b650486ed7470845635", "private key is wrong"); + assert_eq!(private_key.public_key_data().to_lower_hex_string(), "86fab68dcb57aa196c77c5f264f215a112c22a912c10d123b0d03c3c28ef1037", "public key is wrong"); println!("••••••••••••••••••••••••••••••••••••••"); //--------------------------------------------------------------------------------------------------// // Chain m/0H/2147483647H //--------------------------------------------------------------------------------------------------// - let indexes = vec![UInt256::from(0u64), UInt256::from(2147483647u64)]; + let indexes = vec![from_u64(0u64), from_u64(2147483647u64)]; let hardened = vec![true, true]; - let index_path = IndexPath::::new_hardened(indexes, hardened); - let private_key = seed_key.private_derive_to_256bit_derivation_path(&index_path).unwrap(); + let index_path = IndexPath::<[u8; 32]>::new_hardened(indexes, hardened); + let private_key = seed_key.private_derive_to_path(&index_path).unwrap(); assert_eq!(private_key.fingerprint(), 0x1e9411b1u32.swap_bytes(), "fingerprint is wrong"); - assert_eq!(private_key.chaincode().0.to_hex(), "138f0b2551bcafeca6ff2aa88ba8ed0ed8de070841f0c4ef0165df8181eaad7f", "chain code is wrong"); - assert_eq!(private_key.secret_key().0.to_hex(), "ea4f5bfe8694d8bb74b7b59404632fd5968b774ed545e810de9c32a4fb4192f4", "private key is wrong"); - assert_eq!(private_key.public_key_data().to_hex(), "5ba3b9ac6e90e83effcd25ac4e58a1365a9e35a3d3ae5eb07b9e4d90bcf7506d", "public key is wrong"); + assert_eq!(private_key.chaincode().to_lower_hex_string(), "138f0b2551bcafeca6ff2aa88ba8ed0ed8de070841f0c4ef0165df8181eaad7f", "chain code is wrong"); + assert_eq!(private_key.secret_key().to_lower_hex_string(), "ea4f5bfe8694d8bb74b7b59404632fd5968b774ed545e810de9c32a4fb4192f4", "private key is wrong"); + assert_eq!(private_key.public_key_data().to_lower_hex_string(), "5ba3b9ac6e90e83effcd25ac4e58a1365a9e35a3d3ae5eb07b9e4d90bcf7506d", "public key is wrong"); println!("••••••••••••••••••••••••••••••••••••••"); //--------------------------------------------------------------------------------------------------// // Chain m/0H/2147483647H/1H //--------------------------------------------------------------------------------------------------// - let indexes = vec![UInt256::from(0u32), UInt256::from(2147483647u64), UInt256::from(1u32)]; + let indexes = vec![from_u32(0u32), from_u64(2147483647u64), from_u32(1u32)]; let hardened = vec![true, true, true]; - let index_path = IndexPath::::new_hardened(indexes, hardened); - let private_key = seed_key.private_derive_to_256bit_derivation_path(&index_path).unwrap(); + let index_path = IndexPath::<[u8; 32]>::new_hardened(indexes, hardened); + let private_key = seed_key.private_derive_to_path(&index_path).unwrap(); assert_eq!(private_key.fingerprint(), 0xfcadf38cu32.swap_bytes(), "fingerprint is wrong"); - assert_eq!(private_key.chaincode().0.to_hex(), "73bd9fff1cfbde33a1b846c27085f711c0fe2d66fd32e139d3ebc28e5a4a6b90", "chain code is wrong"); - assert_eq!(private_key.secret_key().0.to_hex(), "3757c7577170179c7868353ada796c839135b3d30554bbb74a4b1e4a5a58505c", "private key is wrong"); - assert_eq!(private_key.public_key_data().to_hex(), "2e66aa57069c86cc18249aecf5cb5a9cebbfd6fadeab056254763874a9352b45", "public key is wrong"); + assert_eq!(private_key.chaincode().to_lower_hex_string(), "73bd9fff1cfbde33a1b846c27085f711c0fe2d66fd32e139d3ebc28e5a4a6b90", "chain code is wrong"); + assert_eq!(private_key.secret_key().to_lower_hex_string(), "3757c7577170179c7868353ada796c839135b3d30554bbb74a4b1e4a5a58505c", "private key is wrong"); + assert_eq!(private_key.public_key_data().to_lower_hex_string(), "2e66aa57069c86cc18249aecf5cb5a9cebbfd6fadeab056254763874a9352b45", "public key is wrong"); println!("••••••••••••••••••••••••••••••••••••••"); //--------------------------------------------------------------------------------------------------// // Chain m/0H/2147483647H/1H/2147483646H //--------------------------------------------------------------------------------------------------// - let indexes = vec![UInt256::from(0u32), UInt256::from(2147483647u64), UInt256::from(1u32), UInt256::from(2147483646u64)]; + let indexes = vec![from_u32(0u32), from_u64(2147483647u64), from_u32(1u32), from_u64(2147483646u64)]; let hardened = vec![true, true, true, true]; - let index_path = IndexPath::::new_hardened(indexes, hardened); - let private_key = seed_key.private_derive_to_256bit_derivation_path(&index_path).unwrap(); + let index_path = IndexPath::<[u8; 32]>::new_hardened(indexes, hardened); + let private_key = seed_key.private_derive_to_path(&index_path).unwrap(); assert_eq!(private_key.fingerprint(), 0xaca70953u32.swap_bytes(), "fingerprint is wrong"); - assert_eq!(private_key.chaincode().0.to_hex(), "0902fe8a29f9140480a00ef244bd183e8a13288e4412d8389d140aac1794825a", "chain code is wrong"); - assert_eq!(private_key.secret_key().0.to_hex(), "5837736c89570de861ebc173b1086da4f505d4adb387c6a1b1342d5e4ac9ec72", "private key is wrong"); - assert_eq!(private_key.public_key_data().to_hex(), "e33c0f7d81d843c572275f287498e8d408654fdf0d1e065b84e2e6f157aab09b", "public key is wrong"); + assert_eq!(private_key.chaincode().to_lower_hex_string(), "0902fe8a29f9140480a00ef244bd183e8a13288e4412d8389d140aac1794825a", "chain code is wrong"); + assert_eq!(private_key.secret_key().to_lower_hex_string(), "5837736c89570de861ebc173b1086da4f505d4adb387c6a1b1342d5e4ac9ec72", "private key is wrong"); + assert_eq!(private_key.public_key_data().to_lower_hex_string(), "e33c0f7d81d843c572275f287498e8d408654fdf0d1e065b84e2e6f157aab09b", "public key is wrong"); println!("••••••••••••••••••••••••••••••••••••••"); //--------------------------------------------------------------------------------------------------// // Chain m/0H/2147483647H/1H/2147483646H/2H //--------------------------------------------------------------------------------------------------// - let indexes = vec![UInt256::from(0u32), UInt256::from(2147483647u64), UInt256::from(1u32), UInt256::from(2147483646u64), UInt256::from(2u32)]; + let indexes = vec![from_u32(0u32), from_u64(2147483647u64), from_u32(1u32), from_u64(2147483646u64), from_u32(2u32)]; let hardened = vec![true, true, true, true, true]; - let index_path = IndexPath::::new_hardened(indexes, hardened); - let private_key = seed_key.private_derive_to_256bit_derivation_path(&index_path).unwrap(); + let index_path = IndexPath::<[u8; 32]>::new_hardened(indexes, hardened); + let private_key = seed_key.private_derive_to_path(&index_path).unwrap(); assert_eq!(private_key.fingerprint(), 0x422c654bu32.swap_bytes(), "fingerprint is wrong"); - assert_eq!(private_key.chaincode().0.to_hex(), "5d70af781f3a37b829f0d060924d5e960bdc02e85423494afc0b1a41bbe196d4", "chain code is wrong"); - assert_eq!(private_key.secret_key().0.to_hex(), "551d333177df541ad876a60ea71f00447931c0a9da16f227c11ea080d7391b8d", "private key is wrong"); - assert_eq!(private_key.public_key_data().to_hex(), "47150c75db263559a70d5778bf36abbab30fb061ad69f69ece61a72b0cfa4fc0", "public key is wrong"); + assert_eq!(private_key.chaincode().to_lower_hex_string(), "5d70af781f3a37b829f0d060924d5e960bdc02e85423494afc0b1a41bbe196d4", "chain code is wrong"); + assert_eq!(private_key.secret_key().to_lower_hex_string(), "551d333177df541ad876a60ea71f00447931c0a9da16f227c11ea080d7391b8d", "private key is wrong"); + assert_eq!(private_key.public_key_data().to_lower_hex_string(), "47150c75db263559a70d5778bf36abbab30fb061ad69f69ece61a72b0cfa4fc0", "public key is wrong"); println!("••••••••••••••••••••••••••••••••••••••"); } #[test] pub fn test_platform_node_key_derivation() { - register_logger(); let seed_data = Vec::from_hex("44cb0848958cb77898e464d18e3c70e2a437b343a894defa6010c5056a2b4a1caa01d04760871b578721b0a797fd1aacdfcd77f1870dddb34f1b204d5dbe07c0").unwrap(); let seed_key = KeyKind::ED25519.key_with_seed_data(&seed_data).unwrap(); @@ -218,92 +217,92 @@ pub fn test_platform_node_key_derivation() { //--------------------------------------------------------------------------------------------------// let indexes = vec![]; let hardened = vec![]; - let index_path = IndexPath::::new_hardened(indexes, hardened); - let private_key = seed_key.private_derive_to_256bit_derivation_path(&index_path).unwrap(); + let index_path = IndexPath::<[u8; 32]>::new_hardened(indexes, hardened); + let private_key = seed_key.private_derive_to_path(&index_path).unwrap(); assert_eq!(private_key.fingerprint(), 0, "fingerprint is wrong"); - assert_eq!(private_key.chaincode().0.to_hex(), "e9e82625ceba55e48938338bf9e5c65f295995a056c4245f56111d20ed4483ce", "chain code is wrong"); - assert_eq!(private_key.secret_key().0.to_hex(), "f7b51597adf83c1adac7548b86ce1b310d92cee606ada8ed77ebb2e897579c3f", "private key is wrong"); - assert_eq!(private_key.public_key_data().to_hex(), "bd1de92c05b3a56067887d081e03a0cf65666d8f719bb70b9932106b4e4848ec", "public key is wrong"); + assert_eq!(private_key.chaincode().to_lower_hex_string(), "e9e82625ceba55e48938338bf9e5c65f295995a056c4245f56111d20ed4483ce", "chain code is wrong"); + assert_eq!(private_key.secret_key().to_lower_hex_string(), "f7b51597adf83c1adac7548b86ce1b310d92cee606ada8ed77ebb2e897579c3f", "private key is wrong"); + assert_eq!(private_key.public_key_data().to_lower_hex_string(), "bd1de92c05b3a56067887d081e03a0cf65666d8f719bb70b9932106b4e4848ec", "public key is wrong"); //--------------------------------------------------------------------------------------------------// // Chain m/9' //--------------------------------------------------------------------------------------------------// - let indexes = vec![UInt256::from(9u32)]; + let indexes = vec![from_u32(9u32)]; let hardened = vec![true]; - let index_path = IndexPath::::new_hardened(indexes, hardened); - let private_key = seed_key.private_derive_to_256bit_derivation_path(&index_path).unwrap(); + let index_path = IndexPath::<[u8; 32]>::new_hardened(indexes, hardened); + let private_key = seed_key.private_derive_to_path(&index_path).unwrap(); assert_eq!(private_key.fingerprint(), 1680968818u32, "fingerprint is wrong"); - assert_eq!(private_key.chaincode().0.to_hex(), "d6217f1090e57c89e8466a68a524a4ad200abcd4710b5e636e2251bdb9d3a178", "chain code is wrong"); - assert_eq!(private_key.secret_key().0.to_hex(), "4fa90d6d6fcc62320ecdd8726ac2831707a28f07650aa995d6f1e58b69e0cf3f", "private key is wrong"); - assert_eq!(private_key.public_key_data().to_hex(), "e7b90950199237c73e6fcce396a4cc1d3bf9b2095a02f463deed7f3f4e3377b6", "public key is wrong"); + assert_eq!(private_key.chaincode().to_lower_hex_string(), "d6217f1090e57c89e8466a68a524a4ad200abcd4710b5e636e2251bdb9d3a178", "chain code is wrong"); + assert_eq!(private_key.secret_key().to_lower_hex_string(), "4fa90d6d6fcc62320ecdd8726ac2831707a28f07650aa995d6f1e58b69e0cf3f", "private key is wrong"); + assert_eq!(private_key.public_key_data().to_lower_hex_string(), "e7b90950199237c73e6fcce396a4cc1d3bf9b2095a02f463deed7f3f4e3377b6", "public key is wrong"); //--------------------------------------------------------------------------------------------------// // Chain m/9'/5' //--------------------------------------------------------------------------------------------------// - let indexes = vec![UInt256::from(9u32), UInt256::from(5u32)]; + let indexes = vec![from_u32(9u32), from_u32(5u32)]; let hardened = vec![true, true]; - let index_path = IndexPath::::new_hardened(indexes, hardened); - let private_key = seed_key.private_derive_to_256bit_derivation_path(&index_path).unwrap(); + let index_path = IndexPath::<[u8; 32]>::new_hardened(indexes, hardened); + let private_key = seed_key.private_derive_to_path(&index_path).unwrap(); assert_eq!(private_key.fingerprint(), 3111175390u32, "fingerprint is wrong"); - assert_eq!(private_key.chaincode().0.to_hex(), "f16eb77c77266fc40a35864cb9140076de928ffbe4d02f0e059de2012d178ab5", "chain code is wrong"); - assert_eq!(private_key.secret_key().0.to_hex(), "d5447a2806ad8077235d4f98f4883ac98293a819a4ed97e5b00d976a6f7abecd", "private key is wrong"); - assert_eq!(private_key.public_key_data().to_hex(), "5c02a36691329fb024b7c4f05c6601c7ca3014160c529a2596755f13a77999c0", "public key is wrong"); + assert_eq!(private_key.chaincode().to_lower_hex_string(), "f16eb77c77266fc40a35864cb9140076de928ffbe4d02f0e059de2012d178ab5", "chain code is wrong"); + assert_eq!(private_key.secret_key().to_lower_hex_string(), "d5447a2806ad8077235d4f98f4883ac98293a819a4ed97e5b00d976a6f7abecd", "private key is wrong"); + assert_eq!(private_key.public_key_data().to_lower_hex_string(), "5c02a36691329fb024b7c4f05c6601c7ca3014160c529a2596755f13a77999c0", "public key is wrong"); //--------------------------------------------------------------------------------------------------// // Chain m/9'/5'/3' //--------------------------------------------------------------------------------------------------// - let indexes = vec![UInt256::from(9u32), UInt256::from(5u32), UInt256::from(3u32)]; + let indexes = vec![from_u32(9u32), from_u32(5u32), from_u32(3u32)]; let hardened = vec![true, true, true]; - let index_path = IndexPath::::new_hardened(indexes, hardened); - let private_key = seed_key.private_derive_to_256bit_derivation_path(&index_path).unwrap(); + let index_path = IndexPath::<[u8; 32]>::new_hardened(indexes, hardened); + let private_key = seed_key.private_derive_to_path(&index_path).unwrap(); assert_eq!(private_key.fingerprint(), 208479033u32, "fingerprint is wrong"); - assert_eq!(private_key.chaincode().0.to_hex(), "4de438f0b3a812faf3af2e898907fcdf3a5a2f70ce69e35e9c4f65bb9e273e6c", "chain code is wrong"); - assert_eq!(private_key.secret_key().0.to_hex(), "cfb8aa1eca1c24f9f1efc46425901fe8f285d47c480a8a8c32800954967b994e", "private key is wrong"); - assert_eq!(private_key.public_key_data().to_hex(), "6931ef2303d2e4be4d8c53e5245349f1eb054f27e4c086cef3c7b163e4251ea5", "public key is wrong"); + assert_eq!(private_key.chaincode().to_lower_hex_string(), "4de438f0b3a812faf3af2e898907fcdf3a5a2f70ce69e35e9c4f65bb9e273e6c", "chain code is wrong"); + assert_eq!(private_key.secret_key().to_lower_hex_string(), "cfb8aa1eca1c24f9f1efc46425901fe8f285d47c480a8a8c32800954967b994e", "private key is wrong"); + assert_eq!(private_key.public_key_data().to_lower_hex_string(), "6931ef2303d2e4be4d8c53e5245349f1eb054f27e4c086cef3c7b163e4251ea5", "public key is wrong"); //--------------------------------------------------------------------------------------------------// // Chain m/9'/5'/3'/4' //--------------------------------------------------------------------------------------------------// - let indexes = vec![UInt256::from(9u32), UInt256::from(5u32), UInt256::from(3u32), UInt256::from(4u32)]; + let indexes = vec![from_u32(9u32), from_u32(5u32), from_u32(3u32), from_u32(4u32)]; let hardened = vec![true, true, true, true]; - let index_path = IndexPath::::new_hardened(indexes, hardened); - let private_key = seed_key.private_derive_to_256bit_derivation_path(&index_path).unwrap(); + let index_path = IndexPath::<[u8; 32]>::new_hardened(indexes, hardened); + let private_key = seed_key.private_derive_to_path(&index_path).unwrap(); assert_eq!(private_key.fingerprint(), 3805166404u32, "fingerprint is wrong"); - assert_eq!(private_key.chaincode().0.to_hex(), "5240adb1df0ac47b8cd8d2355c3a8f8f03783b54e28128937e5e4cc1530e71d7", "chain code is wrong"); - assert_eq!(private_key.secret_key().0.to_hex(), "32700c6d3124260f71ee8dda05138270ad3362768ca4d31b4297825b14947bb4", "private key is wrong"); - assert_eq!(private_key.public_key_data().to_hex(), "f2d0fa62e162350ebe9d7a74a816b3d9e6481b9f962b5370749d8168ae1bfe92", "public key is wrong"); + assert_eq!(private_key.chaincode().to_lower_hex_string(), "5240adb1df0ac47b8cd8d2355c3a8f8f03783b54e28128937e5e4cc1530e71d7", "chain code is wrong"); + assert_eq!(private_key.secret_key().to_lower_hex_string(), "32700c6d3124260f71ee8dda05138270ad3362768ca4d31b4297825b14947bb4", "private key is wrong"); + assert_eq!(private_key.public_key_data().to_lower_hex_string(), "f2d0fa62e162350ebe9d7a74a816b3d9e6481b9f962b5370749d8168ae1bfe92", "public key is wrong"); let base64_engine = GeneralPurpose::new(&alphabet::STANDARD, GeneralPurposeConfig::default()); //--------------------------------------------------------------------------------------------------// - // Chain m/9'/5'/3'/4'/0' (last index is UInt256) as SLIP-0010 + // Chain m/9'/5'/3'/4'/0' (last index is u256) as SLIP-0010 //--------------------------------------------------------------------------------------------------// - let indexes = vec![UInt256::from(9u32), UInt256::from(5u32), UInt256::from(3u32), UInt256::from(4u32), UInt256::from(0u32)]; + let indexes = vec![from_u32(9u32), from_u32(5u32), from_u32(3u32), from_u32(4u32), from_u32(0u32)]; let hardened = vec![true, true, true, true, true]; - let index_path = IndexPath::::new_hardened(indexes, hardened); - let private_key = seed_key.private_derive_to_256bit_derivation_path(&index_path).unwrap(); - let key_id = UInt160::from(&sha256::Hash::hash(&private_key.public_key_data())[..20]); - let base64_keys = base64_engine.encode(&[private_key.secret_key().as_bytes(), &private_key.public_key_data()[..]].concat()); + let index_path = IndexPath::<[u8; 32]>::new_hardened(indexes, hardened); + let private_key = seed_key.private_derive_to_path(&index_path).unwrap(); + let key_id = &sha256::Hash::hash(&private_key.public_key_data())[..20]; + let base64_keys = base64_engine.encode(&[&private_key.secret_key(), &private_key.public_key_data()[..]].concat()); assert_eq!(private_key.fingerprint(), 2497558984u32, "fingerprint is wrong"); - assert_eq!(private_key.chaincode().0.to_hex(), "587dc2c7de6d36e06c6de0a2989cd8cb112c1e41b543002a5ff422f3eb1e8cd6", "chain code is wrong"); - assert_eq!(private_key.secret_key().0.to_hex(), "7898dbaa7ab9b550e3befcd53dc276777ffc8a27124f830c04e17fcf74b9e071", "private key is wrong"); - assert_eq!(private_key.public_key_data().to_hex(), "08e2698fdcaa0af8416966ba9349b0c8dfaa80ed7f4094e032958a343e45f4b6", "public key is wrong"); - assert_eq!(key_id.0.to_hex(), "c9bbba6a3ad5e87fb11af4f10458a52d3160259c", "key id is wrong"); + assert_eq!(private_key.chaincode().to_lower_hex_string(), "587dc2c7de6d36e06c6de0a2989cd8cb112c1e41b543002a5ff422f3eb1e8cd6", "chain code is wrong"); + assert_eq!(private_key.secret_key().to_lower_hex_string(), "7898dbaa7ab9b550e3befcd53dc276777ffc8a27124f830c04e17fcf74b9e071", "private key is wrong"); + assert_eq!(private_key.public_key_data().to_lower_hex_string(), "08e2698fdcaa0af8416966ba9349b0c8dfaa80ed7f4094e032958a343e45f4b6", "public key is wrong"); + assert_eq!(key_id.to_lower_hex_string(), "c9bbba6a3ad5e87fb11af4f10458a52d3160259c", "key id is wrong"); assert_eq!(base64_keys, "eJjbqnq5tVDjvvzVPcJ2d3/8iicST4MMBOF/z3S54HEI4mmP3KoK+EFpZrqTSbDI36qA7X9AlOAylYo0PkX0tg==", "base64 is wrong"); //--------------------------------------------------------------------------------------------------// // Chain m/9'/5'/3'/4'/0' (last index is u32) as DASH //--------------------------------------------------------------------------------------------------// - let indexes = vec![UInt256::from(9u32), UInt256::from(5u32), UInt256::from(3u32), UInt256::from(4u32)]; + let indexes = vec![from_u32(9u32), from_u32(5u32), from_u32(3u32), from_u32(4u32)]; let hardened = vec![true, true, true, true]; - let index_path = IndexPath::::new_hardened(indexes, hardened); - let private_key = seed_key.private_derive_to_256bit_derivation_path(&index_path).unwrap(); + let index_path = IndexPath::<[u8; 32]>::new_hardened(indexes, hardened); + let private_key = seed_key.private_derive_to_path(&index_path).unwrap(); let private_child = private_key.private_derive_to_path(&IndexPath::new_hardened(vec![0], vec![true])).unwrap(); - let key_id = UInt160::from(&sha256::Hash::hash(&private_child.public_key_data())[..20]); - let base64_keys = base64_engine.encode(&[private_child.secret_key().as_bytes(), &private_child.public_key_data()[..]].concat()); + let key_id = &sha256::Hash::hash(&private_child.public_key_data())[..20]; + let base64_keys = base64_engine.encode(&[&private_child.secret_key(), &private_child.public_key_data()[..]].concat()); assert_eq!(private_child.fingerprint(), 2497558984u32, "fingerprint is wrong"); - assert_eq!(private_child.chaincode().0.to_hex(), "587dc2c7de6d36e06c6de0a2989cd8cb112c1e41b543002a5ff422f3eb1e8cd6", "chain code is wrong"); - assert_eq!(private_child.secret_key().0.to_hex(), "7898dbaa7ab9b550e3befcd53dc276777ffc8a27124f830c04e17fcf74b9e071", "private key is wrong"); - assert_eq!(private_child.public_key_data().to_hex(), "08e2698fdcaa0af8416966ba9349b0c8dfaa80ed7f4094e032958a343e45f4b6", "public key is wrong"); - assert_eq!(key_id.0.to_hex(), "c9bbba6a3ad5e87fb11af4f10458a52d3160259c", "key id is wrong"); + assert_eq!(private_child.chaincode().to_lower_hex_string(), "587dc2c7de6d36e06c6de0a2989cd8cb112c1e41b543002a5ff422f3eb1e8cd6", "chain code is wrong"); + assert_eq!(private_child.secret_key().to_lower_hex_string(), "7898dbaa7ab9b550e3befcd53dc276777ffc8a27124f830c04e17fcf74b9e071", "private key is wrong"); + assert_eq!(private_child.public_key_data().to_lower_hex_string(), "08e2698fdcaa0af8416966ba9349b0c8dfaa80ed7f4094e032958a343e45f4b6", "public key is wrong"); + assert_eq!(key_id.to_lower_hex_string(), "c9bbba6a3ad5e87fb11af4f10458a52d3160259c", "key id is wrong"); assert_eq!(base64_keys, "eJjbqnq5tVDjvvzVPcJ2d3/8iicST4MMBOF/z3S54HEI4mmP3KoK+EFpZrqTSbDI36qA7X9AlOAylYo0PkX0tg==", "base64 is wrong"); } diff --git a/dash-spv-masternode-processor/src/tests/keys/mod.rs b/dash-spv-masternode-processor/src/tests/keys/mod.rs index 9603791f..2ee95719 100644 --- a/dash-spv-masternode-processor/src/tests/keys/mod.rs +++ b/dash-spv-masternode-processor/src/tests/keys/mod.rs @@ -1,5 +1,5 @@ pub mod aes; pub mod bip38; -pub mod bls; pub mod ecdsa; pub mod ed25519; +pub mod test_basic_bls_scheme; diff --git a/dash-spv-masternode-processor/src/tests/keys/test_basic_bls_scheme.rs b/dash-spv-masternode-processor/src/tests/keys/test_basic_bls_scheme.rs new file mode 100644 index 00000000..46d8c05d --- /dev/null +++ b/dash-spv-masternode-processor/src/tests/keys/test_basic_bls_scheme.rs @@ -0,0 +1,44 @@ +use bls_signatures::G1Element; +use dashcore::hashes::hex::FromHex; +use dashcore::secp256k1::hashes::hex::DisplayHex; +use dash_spv_crypto::crypto::byte_util::Zeroable; +use dash_spv_crypto::keys::{BLSKey, OperatorPublicKey}; +use dash_spv_crypto::network::ChainType; + +#[test] +fn test_legacy_basic_conversion() { + let chain_type = ChainType::TestNet; + let block_height = 530000; + let legacy_key = OperatorPublicKey { + data: <[u8; 48]>::from_hex("16ca29d03ef4897a22fe467bb58c52448c63bb29534502305e8ff142ac03907fae0851ff2528e4878ef51bfa3d5a1f22").unwrap(), + version: 1 + }; + let basic_key = OperatorPublicKey { + data: <[u8; 48]>::from_hex("96ca29d03ef4897a22fe467bb58c52448c63bb29534502305e8ff142ac03907fae0851ff2528e4878ef51bfa3d5a1f22").unwrap(), + version: 2, + }; + assert_eq!(*G1Element::from_bytes(&basic_key.data).unwrap().serialize_legacy(), legacy_key.data); + let bk1 = <[u8; 48]>::from_hex("981ab9848a9eba75643cde7f3ae8c2d3ba1efe36ba9dbbd2162437780f35493f9ed327220a5a0e60d5ae2793f5a75525").unwrap(); + println!("{}", G1Element::from_bytes(&bk1).unwrap().serialize_legacy().to_lower_hex_string()); + println!("{}", G1Element::from_bytes_legacy(&bk1).unwrap().serialize_legacy().to_lower_hex_string()); + let bk1 = <[u8; 48]>::from_hex("158367af44572fbd35b475ca6259e1c499eefcbd5573ded52917c45cd2c8a0aa2e4ac9fd25ecdf1ef548750d2caf3ee3").unwrap(); + println!("{}", G1Element::from_bytes_legacy(&bk1).unwrap().serialize().to_lower_hex_string()); + println!("{}", G1Element::from_bytes_legacy(&bk1).unwrap().serialize_legacy().to_lower_hex_string()); + + +} +#[test] +fn test_bls_migration() { + let chain_type = ChainType::TestNet; + let bytes = Vec::from_hex("0000000104971efda88000000399eb1756922d7c107de051561deb0104612b6e96d273606c4277d7700f5f5a380bac7e5f4adc010f59973fc637cb7aed41ac52771a58c1f7c0978067be0ab44cf4b60d95ae9bdfe2e35d06f83cff7fbc").unwrap(); + match BLSKey::migrate_from_legacy_extended_public_key_data(&bytes) { + Ok(key) => { + assert!(key.seckey.is_zero()); + assert_eq!(key.pubkey.to_lower_hex_string(), "8bac7e5f4adc010f59973fc637cb7aed41ac52771a58c1f7c0978067be0ab44cf4b60d95ae9bdfe2e35d06f83cff7fbc"); + assert_eq!(key.chaincode.to_lower_hex_string(), "99eb1756922d7c107de051561deb0104612b6e96d273606c4277d7700f5f5a38"); + assert_eq!(key.extended_public_key_data.to_lower_hex_string(), "0000000104971efda88000000399eb1756922d7c107de051561deb0104612b6e96d273606c4277d7700f5f5a388bac7e5f4adc010f59973fc637cb7aed41ac52771a58c1f7c0978067be0ab44cf4b60d95ae9bdfe2e35d06f83cff7fbc"); + assert!(!key.use_legacy); + }, + Err(err) => panic!("Can't migrate bls key from extended public key data: {err}") + } +} diff --git a/dash-spv-masternode-processor/src/tests/listdiff/absinthe_core20.rs b/dash-spv-masternode-processor/src/tests/listdiff/absinthe_core20.rs deleted file mode 100644 index a2bd7ca6..00000000 --- a/dash-spv-masternode-processor/src/tests/listdiff/absinthe_core20.rs +++ /dev/null @@ -1,24 +0,0 @@ -use crate::chain::common::{ChainType, DevnetType}; -use crate::lib_tests::tests::{assert_diff_result, create_default_context, MerkleBlock, message_from_file, process_mnlistdiff, register_cache, register_default_processor, register_logger}; - -// #[test] -fn test_quorums_cl_sigs() { - register_logger(); - let version = 70228; - let cache = register_cache(); - let context = &mut create_default_context(ChainType::DevNet(DevnetType::Absinthe), false, cache); - context.blocks = vec![ - MerkleBlock::reversed(1, "53ab7716f36a92068d7bbfa6475681018788a438e028d8bfdf86bfff4f6b78ab", "1160570b6d94a948e25aa8ecef4098b4a6a1f4b4c2ba82659da59159c4f7cf6a"), - MerkleBlock::new(8561, "c77aafb726e115bceb80f6768d70fa32505c9071c022928c06b12b3b87000000", "0000000000000000000000000000000000000000000000000000000000000000"), - MerkleBlock::new(8562, "31d70ac30bde9be20279876cbc1302a5d6d11172599d8dbd23ff44a813050000", "0000000000000000000000000000000000000000000000000000000000000000"), - ]; - - let processor = register_default_processor(); - let diffs = vec![ - "MNL_0_0.dat", - ].iter().for_each(|name| { - let result = process_mnlistdiff(message_from_file(format!("devnet-absinthe/{}", name).as_str()), processor, context, version, false, true); - assert_diff_result(context, result); - }); - -} diff --git a/dash-spv-masternode-processor/src/tests/listdiff/core20_testnet.rs b/dash-spv-masternode-processor/src/tests/listdiff/core20_testnet.rs deleted file mode 100644 index 88f7ed02..00000000 --- a/dash-spv-masternode-processor/src/tests/listdiff/core20_testnet.rs +++ /dev/null @@ -1,256 +0,0 @@ -use serde::{Deserialize, Serialize}; -use crate::chain::common::ChainType; -use crate::lib_tests::tests::{assert_diff_result, assert_qrinfo_result, create_default_context, message_from_file, process_mnlistdiff, process_qrinfo, register_cache, register_default_processor, register_logger}; - -#[test] -pub fn test_core20_rc1_testnet() { - register_logger(); - let cache = register_cache(); - let mut context = create_default_context(ChainType::TestNet, false, cache); - let processor = register_default_processor(); - - let result = process_mnlistdiff(message_from_file("testnet/MNL_0_530000_70228.dat"), processor, &mut context, 70228, false, true); - assert_diff_result(&mut context, result); - let result = process_mnlistdiff(message_from_file("testnet/MNL_530000_904382__70230.dat"), processor, &mut context, 70230, false, true); - assert_diff_result(&mut context, result); - context.is_dip_0024 = true; - let result = process_qrinfo(message_from_file("testnet/QRINFO_x3_y3__70230.dat"), processor, &mut context, 70230, false, true); - assert_qrinfo_result(&mut context, result); -} - -#[test] -pub fn test_core20_activated_testnet() { - register_logger(); - let cache = register_cache(); - let mut context = create_default_context(ChainType::TestNet, false, cache); - let processor = register_default_processor(); - - let result = process_mnlistdiff(message_from_file("testnet/MNL_0_530000_70228.dat"), processor, &mut context, 70228, false, true); - assert_diff_result(&mut context, result); - let result = process_mnlistdiff(message_from_file("testnet/MNL_530000_905465__70230.dat"), processor, &mut context, 70230, false, true); - assert_diff_result(&mut context, result); - context.is_dip_0024 = true; - let result = process_qrinfo(message_from_file("testnet/QRINFO_LAST.dat"), processor, &mut context, 70230, false, true); - assert_qrinfo_result(&mut context, result); -} - -#[derive(Serialize, Deserialize)] -struct LLMQ { - pub version: i64, - #[serde(rename = "llmqType")] - pub llmq_type: i64, - #[serde(rename = "quorumHash")] - pub quorum_hash: String, - #[serde(rename = "quorumIndex")] - pub quorum_index: i64, - #[serde(rename = "signersCount")] - pub signers_count: i64, - pub signers: String, - #[serde(rename = "validMembersCount")] - pub valid_members_count: i64, - #[serde(rename = "validMembers")] - pub valid_members: String, - #[serde(rename = "quorumPublicKey")] - pub quorum_public_key: String, - #[serde(rename = "quorumVvecHash")] - pub quorum_vvec_hash: String, - #[serde(rename = "quorumSig")] - pub quorum_sig: String, - #[serde(rename = "membersSig")] - pub members_sig: String, -} - -#[derive(Serialize, Deserialize)] -struct Masternode { - #[serde(rename = "nVersion")] - pub n_version: i64, - #[serde(rename = "nType")] - pub n_type: i64, - #[serde(rename = "proRegTxHash")] - pub pro_reg_tx_hash: String, - #[serde(rename = "confirmedHash")] - pub confirmed_hash: String, - pub service: String, - #[serde(rename = "pubKeyOperator")] - pub pub_key_operator: String, - #[serde(rename = "votingAddress")] - pub voting_address: String, - #[serde(rename = "isValid")] - pub is_valid: bool, -} - -#[derive(Serialize, Deserialize)] -struct QRInfoV20 { - #[serde(rename = "extraShare")] - pub extra_share: bool, - #[serde(rename = "quorumSnapshotAtHMinusC")] - pub quorum_snapshot_at_hminus_c: crate::tests::json_from_core_snapshot::Snapshot, - #[serde(rename = "quorumSnapshotAtHMinus2C")] - pub quorum_snapshot_at_hminus2c: crate::tests::json_from_core_snapshot::Snapshot, - #[serde(rename = "quorumSnapshotAtHMinus3C")] - pub quorum_snapshot_at_hminus3c: crate::tests::json_from_core_snapshot::Snapshot, - #[serde(rename = "mnListDiffTip")] - pub mn_list_diff_tip: ListDiff_70230, - #[serde(rename = "mnListDiffH")] - pub mn_list_diff_h: ListDiff_70230, - #[serde(rename = "mnListDiffAtHMinusC")] - pub mn_list_diff_at_hminus_c: ListDiff_70230, - #[serde(rename = "mnListDiffAtHMinus2C")] - pub mn_list_diff_at_hminus2c: ListDiff_70230, - #[serde(rename = "mnListDiffAtHMinus3C")] - pub mn_list_diff_at_hminus3c: ListDiff_70230, - #[serde(rename = "lastCommitmentPerIndex")] - pub last_commitment_per_index: Vec, - #[serde(rename = "quorumSnapshotList")] - pub quorum_snapshot_list: Vec, - #[serde(rename = "mnListDiffList")] - pub mn_list_diff_list: Vec, -} - -#[derive(Serialize, Deserialize)] -struct DeletedLLMQ { - #[serde(rename = "llmqType")] - pub llmq_type: i64, - #[serde(rename = "quorumHash")] - pub quorum_hash: String, -} -#[derive(Serialize, Deserialize)] -struct LLMQCLSig { - -} - -#[allow(non_camel_case_types)] -#[derive(Serialize, Deserialize)] -struct ListDiff_70230 { - #[serde(rename = "nVersion")] - pub n_version: i64, - #[serde(rename = "baseBlockHash")] - pub base_block_hash: String, - #[serde(rename = "blockHash")] - pub block_hash: String, - #[serde(rename = "cbTxMerkleTree")] - pub cb_tx_merkle_tree: String, - #[serde(rename = "cbTx")] - pub cb_tx: String, - #[serde(rename = "deletedMNs")] - pub deleted_mns: Vec, - #[serde(rename = "mnList")] - pub mn_list: Vec, - #[serde(rename = "deletedQuorums")] - pub deleted_quorums: Vec, - #[serde(rename = "newQuorums")] - pub new_quorums: Vec, - #[serde(rename = "merkleRootMNList")] - pub merkle_root_mnlist: String, - #[serde(rename = "merkleRootQuorums")] - pub merkle_root_quorums: String, - #[serde(rename = "quorumsCLSigs")] - pub quorums_clsigs: Vec, -} - - - -#[test] -pub fn test_core_20_rc1_testnet_etalon() { - let qrinfo_8792: QRInfoV20 = serde_json::from_slice(&message_from_file("testnet/qrinfo_530000_904144__70230.json")).unwrap(); - println!("qrinfo"); -} - - -#[test] -pub fn test_core20_rc2_testnet() { - register_logger(); - let cache = register_cache(); - let mut context = create_default_context(ChainType::TestNet, false, cache); - let processor = register_default_processor(); - let result = process_mnlistdiff(message_from_file("testnet/MNL_0_530000_70228.dat"), processor, &mut context, 70228, false, true); - assert_diff_result(&mut context, result); - - let files = vec![ - "MNL_530000_905522__70230.dat", - "MNL_530000_904944__70230.dat", - "MNL_904944_904968__70230.dat", - "MNL_904968_904992__70230.dat", - "MNL_904992_905016__70230.dat", - "MNL_905016_905040__70230.dat", - "MNL_905040_905064__70230.dat", - "MNL_905064_905088__70230.dat", - "MNL_905088_905112__70230.dat", - "MNL_905112_905136__70230.dat", - "MNL_905136_905160__70230.dat", - "MNL_905160_905184__70230.dat", - "MNL_905184_905208__70230.dat", - "MNL_905208_905232__70230.dat", - "MNL_905232_905256__70230.dat", - "MNL_905256_905280__70230.dat", - "MNL_905280_905304__70230.dat", - "MNL_905304_905328__70230.dat", - "MNL_905328_905352__70230.dat", - "MNL_905352_905376__70230.dat", - "MNL_905376_905400__70230.dat", - "MNL_905400_905424__70230.dat", - "MNL_905424_905448__70230.dat", - "MNL_905448_905472__70230.dat", - "MNL_905472_905496__70230.dat", - "MNL_905496_905522__70230.dat", - "MNL_905522_905523__70230.dat", - "MNL_905523_905524__70230.dat", - "MNL_905524_905525__70230.dat", - ]; - files.iter().for_each(|file_name| { - let result = process_mnlistdiff(message_from_file(format!("testnet/{}", file_name).as_str()), processor, &mut context, 70230, false, true); - assert_diff_result(&mut context, result); - }); - context.is_dip_0024 = true; - let result = process_qrinfo(message_from_file("testnet/QRINFO_x3_y3__70230.dat"), processor, &mut context, 70230, false, true); - assert_qrinfo_result(&mut context, result); -} - -#[test] -pub fn test_core20_activated_testnet2() { - register_logger(); - let cache = register_cache(); - let mut context = create_default_context(ChainType::TestNet, false, cache); - let processor = register_default_processor(); - let result = process_mnlistdiff(message_from_file("testnet/MNL_0_530000_70228.dat"), processor, &mut context, 70228, false, true); - assert_diff_result(&mut context, result); - let result = process_mnlistdiff(message_from_file("testnet/MNL_530000_905465__70230.dat"), processor, &mut context, 70230, false, true); - assert_diff_result(&mut context, result); - context.is_dip_0024 = true; - let result = process_qrinfo(message_from_file("testnet/QRINFO_LAST_X.dat"), processor, &mut context, 70230, false, true); - assert_qrinfo_result(&mut context, result); -} - -#[test] -pub fn core20_quorum_signatures() { - register_logger(); - let cache = register_cache(); - let mut context = create_default_context(ChainType::TestNet, false, cache); - let processor = register_default_processor(); - let version = 70230; - let name = format!("testnet/MNL_0_530000_70228.dat"); - let result = process_mnlistdiff(message_from_file(name.as_str()), processor, &mut context, 70228, false, true); - assert_diff_result(&mut context, result); - - let diffs = [ - "530000_907104", - "907104_907128", - "907128_907152", - "907152_907176", - "907176_907200", - "907200_907224", - "907224_907248", - // "907248_907272", - // "907272_907296", - ]; - diffs.iter().for_each(|diff| { - let name = format!("testnet/MNL_{diff}__{version}.dat"); - let result = process_mnlistdiff(message_from_file(name.as_str()), processor, &mut context, version, false, true); - assert_diff_result(&mut context, result); - }); - - // context.is_dip_0024 = true; - // let result = process_qrinfo(message_from_file("testnet/QRINFO_0_907770__70230.dat"), processor, &mut context, 70230, false, true); - // assert_qrinfo_result(&mut context, result); - -} \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/tests/listdiff/llmq_rotation.rs b/dash-spv-masternode-processor/src/tests/listdiff/llmq_rotation.rs deleted file mode 100644 index 20c9a1c7..00000000 --- a/dash-spv-masternode-processor/src/tests/listdiff/llmq_rotation.rs +++ /dev/null @@ -1,1507 +0,0 @@ -use crate::ffi::boxer::boxed; -use crate::lib_tests::tests::{add_insight_lookup_default, get_block_hash_by_height_default, get_llmq_snapshot_by_block_hash_default, get_masternode_list_by_block_hash_default, get_masternode_list_by_block_hash_from_cache, get_merkle_root_by_hash_default, hash_destroy_default, masternode_list_destroy_default, masternode_list_save_default, masternode_list_save_in_cache, message_from_file, process_mnlistdiff_from_message_internal, process_qrinfo_from_message_internal, save_llmq_snapshot_default, save_llmq_snapshot_in_cache, should_process_diff_with_range_default, snapshot_destroy_default, FFIContext, get_cl_signature_by_block_hash_from_context, save_cl_signature_in_cache}; -use crate::chain::common::chain_type::{ChainType, DevnetType}; -use crate::crypto::byte_util::{Reversable, UInt256}; -use crate::hashes::hex::{FromHex, ToHex}; -use crate::bindings::common::{processor_create_cache, register_processor}; -use crate::bindings::masternode::process_qrinfo_from_message; - -// #[test] -// Deprecated -fn test_llmq_rotation() { - let bytes = message_from_file("qrinfo--1-5078.dat"); - let length = bytes.len(); - let c_array = bytes.as_ptr(); - let use_insight_as_backup = false; - let chain = ChainType::DevNet(DevnetType::Devnet333); - let cache = unsafe { &mut *processor_create_cache() }; - let context = &mut (FFIContext { - chain, - is_dip_0024: true, - cache, - blocks: vec![] - }) as *mut _ as *mut std::ffi::c_void; - let processor = unsafe { - register_processor( - get_merkle_root_by_hash_default, - block_height_lookup_5078, - get_block_hash_by_height_default, - get_llmq_snapshot_by_block_hash_default, - save_llmq_snapshot_default, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_by_block_hash_default, - masternode_list_save_default, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - let result = unsafe { process_qrinfo_from_message( - bytes.as_ptr(), - bytes.len(), - chain, - use_insight_as_backup, - false, - true, - 70221, - processor, - cache, - context, - )}; - println!("{:?}", result); - let result_5078 = unsafe { &*result }; - let result_at_h = unsafe { &*result_5078.result_at_h }; - assert!( - result_at_h.has_found_coinbase, - "Did not find coinbase at height 5078" - ); - // turned off on purpose as we don't have the coinbase block - // assert!(result.valid_coinbase, "Coinbase not valid at height {}", h); - // assert!(result_at_h.has_valid_mn_list_root, "mn list root not valid at height {}", h); - // assert!(result_at_h.has_valid_llmq_list_root, "LLMQ list root not valid at height {}", h); - // assert!(result_at_h.has_valid_quorums, "validQuorums not valid at height {}", h); -} -pub unsafe extern "C" fn block_height_lookup_5078( - _block_hash: *mut [u8; 32], - _context: *const std::ffi::c_void, -) -> u32 { - 5078 -} - -#[test] -fn test_llmq_rotation_2() { - let bytes = message_from_file("QRINFO_1_8344.dat"); - let use_insight_as_backup = false; - let chain = ChainType::DevNet(DevnetType::Devnet333); - let cache = unsafe { &mut *processor_create_cache() }; - let context = &mut (FFIContext { - chain, - is_dip_0024: true, - cache, - blocks: vec![] - }) as *mut _ as *mut std::ffi::c_void; - println!("test_llmq_rotation_2 {:?}", bytes.to_hex()); - let processor = unsafe { - register_processor( - get_merkle_root_by_hash_default, - block_height_lookup_, - get_block_hash_by_height_default, - get_llmq_snapshot_by_block_hash_default, - save_llmq_snapshot_default, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_by_block_hash_default, - masternode_list_save_default, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - let result = unsafe { process_qrinfo_from_message( - bytes.as_ptr(), - bytes.len(), - chain, - use_insight_as_backup, - false, - true, - 70221, - processor, - cache, - context, - )}; -} - -unsafe extern "C" fn block_height_lookup_( - block_hash: *mut [u8; 32], - _context: *const std::ffi::c_void, -) -> u32 { - let h = UInt256(*(block_hash)); - let orig_s = h.clone().to_string(); - let rev = h.reversed(); - let rev_s = rev.to_string(); - match rev_s.as_str() { - "00000072f3c73d891d86546f259ba2cd87d1aa655c447640a4257f6a8e6f7018" => 5334, - "000000a451ba6459b3ce6128a5e8f273f9bc2010645dd4721e1b51efce18dda7" => 4207, - "000000076aeba26f76a5d0e12e11c9b4d35d7232f1bbae6c47b4d8bef4a12b62" => 4192, - "00000179987c39850ddd901eec6bfd0a508ec54fb6a0cd28481481aa0adf56b6" => 4168, - "00000028bd64fd360dba79acf7cb3bae6cea18553c7232894a2ace15ada70940" => 4144, - "000002410622902b361d1e2194f2072c6409c6f22ef5fea854d3326a27075713" => 4120, - "000001f340d35fe89d1924de57ccbf63a7a09347835e6e4990ee2df12a4a67f9" => 4096, - _ => u32::MAX, - } -} - -unsafe extern "C" fn get_block_hash_by_height_( - block_height: u32, - _context: *const std::ffi::c_void, -) -> *const u8 { - match block_height { - 5334 => { - UInt256::from_hex("00000072f3c73d891d86546f259ba2cd87d1aa655c447640a4257f6a8e6f7018") - .unwrap() - .reverse() - .0 - .as_ptr() - } - 4207 => { - UInt256::from_hex("000000a451ba6459b3ce6128a5e8f273f9bc2010645dd4721e1b51efce18dda7") - .unwrap() - .reverse() - .0 - .as_ptr() - } - 4192 => { - UInt256::from_hex("000000076aeba26f76a5d0e12e11c9b4d35d7232f1bbae6c47b4d8bef4a12b62") - .unwrap() - .reverse() - .0 - .as_ptr() - } - 4168 => { - UInt256::from_hex("00000179987c39850ddd901eec6bfd0a508ec54fb6a0cd28481481aa0adf56b6") - .unwrap() - .reverse() - .0 - .as_ptr() - } - 4144 => { - UInt256::from_hex("00000028bd64fd360dba79acf7cb3bae6cea18553c7232894a2ace15ada70940") - .unwrap() - .reverse() - .0 - .as_ptr() - } - 4120 => { - UInt256::from_hex("000002410622902b361d1e2194f2072c6409c6f22ef5fea854d3326a27075713") - .unwrap() - .reverse() - .0 - .as_ptr() - } - 4096 => { - UInt256::from_hex("000001f340d35fe89d1924de57ccbf63a7a09347835e6e4990ee2df12a4a67f9") - .unwrap() - .reverse() - .0 - .as_ptr() - } - _ => UInt256::MIN.0.as_ptr(), - } -} - -unsafe extern "C" fn block_height_lookup_333( - block_hash: *mut [u8; 32], - _context: *const std::ffi::c_void, -) -> u32 { - let h = UInt256(*(block_hash)); - let orig_s = h.clone().to_string(); - match orig_s.as_str() { - "df111a9253e9f2f80d3de7a7274aaaa6d5ac0426b6a048991fc8ed7586000000" => 22030, - "4a53ef88bad2a12b5af9767bcef10980955971826b5f75ef0f17518a73020000" => 21976, - "ef176a4a5dbbb041f7e582e4adac44c81e7d1efdc92c2b532bcaa24106000000" => 21928, - "1efab5ab1fe9d99f90072d7d377b0271511e16b2f833b3314576ae23e4030000" => 21880, - "88d5f21114fddb86c8ab230f2b45fd90b8cfa7a61b0d819160fdb08345040000" => 21832, - "5b298e3fcc475e57f20520601057e3686219a2bbe09b0baa34d9759268050000" => 21784, - "0b06e90c32f0611bce49e4646213f0bb7a43c59b82cc5a87295bf4f15a060000" => 21984, - "7b9b8fe254a17c31a2315171b8b224ccf2ddf7960d69a87c5400514d19050000" => 22008, - "af5509f7e1a2c9827eac9487746dd6f363ac56d4659fdf0089f8bca54f020000" => 21936, - "c970d99fa088f3a1e9bc9eb3b9a4d03263b755149ce39a6db5bdff6d23090000" => 21960, - "4887de631c97d933c8a52026589ad02aa31ad2a9e6fd66c8b278aa34bd060000" => 21912, - "99867fdccf5f7b50c648b1ad3c93c1fa7515d4529aa5efde1ad17e0780050000" => 21888, - "2323ab4e88e0923e8e3bd506192dcaa4286c20340cc7525128665941ac050000" => 21840, - "e30d315d4a40d82d059a65a900242f393b50ff8fefde58a4a1b482d232010000" => 21864, - "c90366c6455c23930215ce724062fa1dd2ae89b66c722302dc9d56ba1d030000" => 21792, - "dbe354545727c9db4cf872765455d1aff09296a14daa4075d18db6bb4a030000" => 21816, - "4d523423dc19a438e57ee0e150c3f62369063a1bf99274083bd2f055fe020000" => 21768, - "c244b2775b5fd5ec60d911f7b851ec4e78cf54f678f3d64cc69245fe60070000" => 21744, - "36a179a25d081bc6836be48b11f10e6e484fd0ef068dd315a9e11482ea030000" => 21696, - "cd36d310de9b14823aa9aedc00abbe2b5ac4117cb8d00f7693ad22af05060000" => 21720, - _ => u32::MAX, - } -} - -unsafe extern "C" fn block_height_lookup_333_2( - block_hash: *mut [u8; 32], - _context: *const std::ffi::c_void, -) -> u32 { - let h = UInt256(*(block_hash)); - let orig_s = h.reversed().to_string(); - match orig_s.as_str() { - "0000086ccc192b07450acf188eba3d0360058dd43793fc622e0b7744cad5cbed" => 24869, - "000003227cf2f83a1faa683ece5b875abeb555ebf1252f62cb28a96d459bcc11" => 24868, - "000003bd988f78d4663780b467dc6155f5c1641c16a2d0a09cf62eeaaf9ffb39" => 24867, - "0000091ffc39c9891a425b7eacb051c026d8e6ab4a86f074b6961f7c4a0ea87c" => 24866, - "000008804a2cc065da4752c7f6f4b889c682749997bf24c704ab44e932ae0f6b" => 24865, - "00000aa4e53ca2059b645787d4516dc75f1289708d2a2d3f6b103d171821647b" => 24864, - "00003130c6ba235a12bf1057c459268ad10924a47d9b34eddc57858d77f72ddb" => 24863, - "000000b5f4669ac2ebda3607fa627df62656650ee689a8c82705f340ec3d78ea" => 24862, - "00000692fc267184a6ab60ed6af6a55cdf527773872c601f098569c254f2d189" => 24861, - "000007991952ca7c32420cd92654ecc41d5716c191cc96cb8978ea3257a69992" => 24856, - "0000037bbcd8e2af574fff36fd248d2058b3a9582c9a9c3fc6ab1dcee69c25e5" => 24808, - "000004f78ebfe17c2e78c58ca1e754e02f3e52043bea00f63be7f2cd58d23c96" => 24760, - "00000597b3da0bdb229b571bfcebb78a5786c9bc21d3fb3253d497b8a62e5d99" => 24712, - "0000078bc1a0778aa6d8dbefde4f110eee570c1b945c553b9ed98368871d6b5b" => 24664, - "0000062c4e24e761dc2d1b9b6d1588198b3f4ad8a767151ef6414bfe87ec94da" => 24816, - "000000e3756fb54df8e63db7c69158a88247ae6fb951602fececa314820a644c" => 24817, - "000000461e6f7b4d5656173bf188e83bee5f10d971616d946db3027cbecfa13f" => 24625, - "0000037bd6d0b218eb906ab6206fde5a96f972ede0308bf76cac4190428a924d" => 24624, - "000007756da9e48ef99829c467379e3a873ec9bf90652a9d10483329ef4e222c" => 24672, - "0000018ed9cd191989b356447ad4d0649d5c471e1661a79aab2613251cf991a7" => 24673, - "000004413ed62592b7a47b06a296ecb79dfcf5e65227a3e93713b36c48846f6a" => 24721, - "0000050c3da50cc911506eb4bfb50e7b1f1ac0d165eb62f239a48545cc5834c1" => 24720, - "0000010f2aabcceddff97f4f87987902f99629518dfdcdf5522e7e159b78a825" => 24769, - "000000426666e40ff602a896a1493b765daa6fd6667f7c5edd0cfd7c23857750" => 24768, - "000000b693fbd6d2a02da459158394220f83a4cdb947117246c83a65c9296bf1" => 24860, - "00000683d6d9d7df1b530eecd973fd71aac2434687cdf94b02a959237b41b123" => 24859, - "0000052e1a801d4313cd6a90beed7f478f34b778c2a8cb0e8b98dbcf83c5efbc" => 24858, - "0000076bffe00bf97fa0baa71c1444f5e3270cd0ada2423f1c77858b95d19338" => 24857, - "00000763996b273b8f8fd4b184e0175679bae5bd176d021efd71d4d598e0a184" => 24855, - "00000088430da03d58df458cb0118dfb7a5583241718c8cbb1b02f7eee673463" => 24854, - "000006fe4eb832348f5abbd7d7fe5653068dd20ca58e05bec321f486a9fe5eb1" => 24853, - "0000018db2f6d303edcdd6ded823acc31bfa50f08389111b4f90ca4cc753006d" => 24852, - "000002f575aa919a482ec157c9c3614057078bdf99da797305c9c7f549a9c677" => 24851, - "000002dd2d2977ff6fa6765954919dd816b96671d4c8d5d0752f5e4efc48f8bf" => 24850, - "000004574333f4fcbbf989299a298c53b89718aa10c169c32db07c18c14a33ad" => 24849, - "0000053f364c7ff258ff87185de4c789420372d9bd76f37dbdc57d5b3d1992c0" => 24848, - "000001e2680c8f337c3a6d81f7b72e67836dd64a6cbbaf13875a0a72976282e3" => 24847, - "0000030d4554e01211b54c9041f7a257ec83f9079a1913eda923bdad11f08670" => 24846, - "0000045348e3cef51ae93a68a09e56eab3a08f339ab62b196709f83bc97c6936" => 24845, - "0000040777831dcff5ffb3e3c0bd38a008a6d4456c06e320386004fa68a49e7e" => 24844, - "0000027e119d72c5dda56cf39223b35f232092495996345be248eeb48c9f9130" => 24843, - "000000baa4a33d65e11107122a92601053ab4e716a6d661dfd6bb9f874188413" => 24842, - "00000645381ff1106e135a9d5df3cec8edfafce71c182325d4b75099d4002c4d" => 24841, - "00000056c854b1996beec75c464693bed7a958e9b67d71d701340b8ff6d9e054" => 24840, - "0000027aa1d0102ddacd2f9dde2681ceaf0b5c0caa806cb7f816c119051464e6" => 24839, - "000006437989e53e813df1a8aa388096387ee5de9cd0b045779a703582e7949e" => 24838, - "00004cbd92d058ad559d6cbb2d973e3e199015826eeab9691cb718ba349b0f70" => 24837, - "000000885cf1eaa6b419152fc651e0119d57281f18a6ae3806dbd4fcfb5cad25" => 24836, - "0000049f89a5dac8c9593c601f9a385440ee050abe8cf5f039a3d59c58f06249" => 24835, - "00000104885a2403d15e65e25daf9f78c755c2953945914f58e6328c9dd50c4d" => 24834, - "00000795888b51da4cfe848adfcdff19cfc815c1865c58e2200ea9ad596df9e9" => 24833, - "000004169e45af9fd4ddaa64c400758df7cf36b0c1a22f2b9f29a11fdea70eba" => 24832, - "00000743fc8bde3da9911bbd5275e2e2a68afed8ce1d56b73ed8557528a4fb45" => 24831, - "000003e8049e2baee08e173a04106df0c4b0f858f8ae1918caf970eb10d2046a" => 24830, - "00000169672fae75e70f45a7031bffbdc92fb81d183d0324f39eac9268d11ceb" => 24829, - "0000082b9da7946ea66dfa9c6ca9765a41219a049129248e4c5656f9bdd8aab6" => 24828, - "000001249c80a3899d72096a03195ebfb96b27118559094e149fcdee18017458" => 24827, - "0000002d7fc5efaf7d8799e6418f2cf0eda1e9dabc9771366ea66c5e09dae7cf" => 24826, - "0000051ee159b9aa029497f509e3c92bfa03737974444d04bbc940cc8a901bab" => 24825, - "000008076d72be61be309f5a8e531eb5a85405f4ee75125a1b3556774b5848d2" => 24824, - "000006cba36bb9086be9ac34b03d0bb2379ccbf9af7cd17da4f2450dc9f7006c" => 24823, - "000004c5b1b7e1bdf532e1318154cf2ebe387b5b9ded7c748b75856003a43371" => 24822, - "0000066acb91115887007ecbd8d82eb4f4c32c0270552fe8b2f32e48213575f9" => 24821, - "0000006dc4fc61cdef4df41ee9b7f49fe17eff54a66f3a3a88bed959388a5434" => 24820, - "00000178548ba2f34bd307781683b0f97ac31ccdd9b1b22e148c59211567c407" => 24819, - "000005e3612dd20b3bce4ea865eb39045fff1f8937301f9a1db3654d1a98ff80" => 24818, - "000008ab4c5a522743760f8ef14089c352b0f7b1013cd7ba7392c96e497afe85" => 24815, - "0000049c9e3d99ae33ce5d71e7e3974d8be8d87e65f66f5d36f200f482eb89a3" => 24814, - "000006799bc165a2d527f3f980c919863cd3a78dcf3fd201f57bdd6c27ff7af2" => 24813, - "000008822d1b4327327d2477ed48157ab739f5631451f59e669f65da6b4d99d0" => 24812, - "000005cbfa02e404973f41eccae792d8394f35089a39ae4f4242e61fc3110dc4" => 24811, - "000000c25bf5d29876879fd5664efecf5dbe6b889756b0413a7e9a7e14b63894" => 24810, - "000001c6e2988ef3d42b7fe817481eded236109b1ecab23bde43710cd0b82890" => 24809, - "00000043a23d0bbcd576eb8c39b194e9ee5364ed47645dd4917bb45d06768777" => 24807, - "0000002c7dabf7c52be36c77728fc2a1111f0caa9d167e4930c954540c3aa142" => 24806, - "00000213354b423e60b5e4e3da96a57658fae6451078b4301eb7fc96d286c346" => 24805, - "000006acdb4419d876c00a195f16edf1b5732ef6c26e651ae9f2f3c2b8964a3a" => 24804, - "000002a9757ea470f4d6341cec13cc12ae8e7940bc401b36b22a1a44d39cd7ec" => 24803, - "0000042837f5359d0b4d72b88a90e782afe782afbec03fbe54c7f06ef91e0fd4" => 24802, - "000003de21b33156e7d94b1408fc9ef753f7cc9bfce52fe6ef2def3c2184a00a" => 24801, - "000000f63595d3c80a44ff104b19828bd7f337027dc064cd179e2eb5e5e8db56" => 24800, - "000006ac1f34ea47d2db12fa1c8dd765190ab4c5c8329baf12c6a8ba5fc42dbb" => 24799, - "00000401fc8d3cfd75086cc67b73a32d7978877e1726ad9949bbe67dc4d46840" => 24798, - "0000027b6ceb8c45d444005a6b948ced264c8fc39fb412dc69389ac63fee668e" => 24797, - "000003f23b070d2734940dcc2682517883b6f5d3189c34b5dff4742153ec64ab" => 24796, - "000002640f8273af03475f6ee496f80700b12980bc4fb059f734e6183377b078" => 24795, - "00000005cb3272a005d40b45caa1cdeaba2651d619cbd6196f2c6c6317c8917d" => 24794, - "00002b2c169c551e051fe563eec39734ef89eedee4d65f8a2c0074280418c8fb" => 24793, - "000001f0718c066dd865f72836254d6e9b217f49ed4e08b89bb8e7ff3b3aa6af" => 24792, - "00000156030a46774d864bc346009cdafb47b9ea30a1ddfb5ad5ef5bcc8e0cf9" => 24791, - "000003799100d36e4f1eae601ee81df2f02ffeba59d3f29a7db43c2b7568d481" => 24790, - "0000047213ccf1910fe90f8b8ced3e8a2e3a9c1bc93ebf4103f250dde548e470" => 24789, - "000003e3515c438775628e49dd61701a8327005566c2b88407d9afb59244092c" => 24788, - "000002563aa47ebb2189f33735f698231161c5df29627e36c01dcbf0a6a2315e" => 24787, - "000003c7f4624196872c229be62947dd0004e09571fb1b8c0625fda088873e5c" => 24786, - "000002c6cc3fc915987a1c89f295e969db682abad30b7143c66df3d020c81aa6" => 24785, - "000001a0000cf3979494e1451bbb2e5b8e5364c003d69b07e33fc9a4a42afe49" => 24784, - "0000051f34bb857fb33424cb780e066cfdd565c64714048d42b84d2ce64e0b87" => 24783, - "0000046900a9d9478e84fa09702fa98e734ade9416f43229969c03d499e2b827" => 24782, - "0000020466a6a3f34b7edf6e7a56950992eb43e4f46babce3c8e7a1f027932cd" => 24781, - "0000008ea4a9398eeaa5ee996129f6d58f3ee6eb36ad48b39dcfafd491b72698" => 24780, - "0000023b916ba5f3cc323065f8673c6648cae692a97cb84ae052d372e2ad1fdc" => 24779, - "00000128469a850ff260fab8d71cec4ae08953f53adc769b0e4510c64cd5b1ae" => 24778, - "00000329f84bfad3889f8e37a6e5f532547a73840428b36a875423aa3f781922" => 24777, - "00000039433505249e61dcea66c0f3075ac384cf216970149d2e7f149f031ac7" => 24776, - "000003c944684f4df6d0e9df65bd0ff45db24279400c977ad1ddd095d3d26a20" => 24775, - "0000050ef9d0c1e6e6d1506dfc9a93c87b49adc40d3f266f168726a987cbb16a" => 24774, - "000000457cb432ced5fb2ea78d36ccb2744d22c1a4aace36ecd8e603325282fc" => 24773, - "000004c958970f8db6169284b8fc0a48624964e38a1da4260a528855c549ffd0" => 24772, - "0000028a421d2f116e56ac5da67217e942fdc5d783d05f2b0ec08aaa98a4af1c" => 24771, - "000001b392b1b5e29cb334a6c7d9baf85e8468fc9d5ac2860c2ed4dfa8affb3d" => 24770, - "000003a2b3a849971822edc9505114e61704a58db8ebae14c78bd0fa9184f519" => 24767, - "00000081a650f7953b6f6e704b14b142e06972a3fdd86ebf5327820adce8a6f4" => 24766, - "0000004b32f5cc9512ca0bd2f96f84a29b975c879ea050c7309c9321cd76d67e" => 24765, - "000003367801e71b6bfe4ca3e277603f2f9091caf80be7bd697b2e7d8b2fa091" => 24764, - "00000555ea65e4120624c4c8699af9ea3c91a3f8e42095192397fbdf6774f02a" => 24763, - "0000016c4f0f1cb3ebd8f2b2adb53347a3c69fae7c0854b4ea41a1d4c8af7d6c" => 24762, - "0000028655333153a9e4262170b8acfda4a2dec64dd387b2033dc0a075eed242" => 24761, - "000001c7704486626aec884fe851b5b54326825dd56d56d09f03beb2a576ae09" => 24759, - "000004db5d642d4a869ce8100ac5154658c06b9ef0b9e6b9957139529884b79c" => 24758, - "00000495b214d71655cc24f56bf9aab7d2ab286857e6f9890f1ae639c357b69e" => 24757, - "0000029d66a078af9d234a430f0cf8580ee0aac264fc91e25b6e379836f64aa2" => 24756, - "00000319ef4c483b432a52e103a5fbaf72cb2cb03238793982455386f223b5f4" => 24755, - "000000a5cd94be2be2764cb5e3eebb1c4aa24b0bab289ba4bdf032cb5c4511a4" => 24754, - "000003a4acaf2de030463272ce372a6d38973bc4d3ec9abaecd88fb242095c6b" => 24753, - "000000b13d3a5e352c02e26fbbc0c5a19c630ffaba54177c3074b08311c334a5" => 24752, - "00000306d57c64e4ea982061c855b4ec7830836e9779d45460d96b7bbeb58ee9" => 24751, - "0000046a30db2347c925c399ab3d08e95f134545a1b4f559c970db585b7a2a2b" => 24750, - "00000002a9013220364222bb38dbfb6fa1a53177524d9e0de1d243b34ebfc136" => 24749, - "0000004c90e593866678aa4cba5211019e02e922ff7180fa3f152b20aeee589e" => 24748, - "0000046d5e84be89842cd2f74a3d72f3299e63179409c7c14757b7d66ded1132" => 24747, - "0000024082c1607e22f1300d5df14ae43a7b41ed747c0a8ee4b6bbcccab493d9" => 24746, - "000006aa0077df5557c493d7eb81396e7ab10302a09d9fb2021d1eecc0077b08" => 24745, - "00000149b4e0da935b7aa97f720ef7e6d49e828880e20d7fcc368923176a8968" => 24744, - "000000b401b4b4a5174cec59765cbb23fe491ca4b7ae1521ddb32f3425860de2" => 24743, - "0000056f246e61d0ce87af62a18bde093a00f782b339bb5708fb75abc3c1d3db" => 24742, - "0000057c5bd82a630463ee1a6cc591c7b52b352c603d3d8909f6b4fc699fdd2b" => 24741, - "000006f2286327b6a2a1270f770609ff027d02180d69d2ad18b63566dfc0515a" => 24740, - "000003611f378cd85a09df3bed09f29bb69923a73584ec70830ffdf4d9b25285" => 24739, - "00000018c1d055316dd10aaba200a40e4b22bfaa2aa4fe946aad9c48dd265a7f" => 24738, - "000005b7c527392bcfbdd75b06f0906fe85ec2ee8fe8c1fc08a4f7820e091f90" => 24737, - "00000483b14397ee07d6a6e0ce4caca153c46e24ff9793a472b80be780fde4af" => 24736, - "000001531ce19a3042757887098225c468a56fe159729d40d9a20e764875a0e2" => 24735, - "0000002f47f9cce781cee4169fe7e1a3966fafbe0375f6844d32b1337a91b4a6" => 24734, - "000004e5ea1774456c0c0225dd1bdd8ad0007f4552df456d5148243d6a38359f" => 24733, - "0000022ee8c41b97ed57f95887d5942bdef91728abc8e5aba6ee8fd3b74ab4e3" => 24732, - "0000034aceca60ff1c4136b3d3aba4a875d47b0cb481797b0dbeef9f1125485b" => 24731, - "00000798b049b80fc751a9d02ce80872dbe54b3798123e47a7726be03a24013f" => 24730, - "000000f92ebd1f266b370a27cc8f3426f78153ab3fff492b2088eb92ea6a6243" => 24729, - "000000d4bfaef03c58066d660a30950705376f55fc9430fda897f1c340c149b9" => 24728, - "00000123d0cab60bc8bc0f7748d040090429a3570a55b77e11b032d90578fa95" => 24727, - "000003258e7acb7c9f8e2d5f8f802a6418dd819388bbc1463360ad9f9505034f" => 24726, - "00000541b0635b6b9bbd8921d4a8fb12cb6633323cda8cac7a84c32dcc79cbdf" => 24725, - "00000605bee6c4084f4bc1b8e0a0b4565513085df4888fbabb1ff59402cdfe60" => 24724, - "000000a42f0395faa6036ec8dbb6f40618d74fbc35b2c343bf03f0d5ab1f108b" => 24723, - "00000535556772e86ca1210083a4cb4db74454f4cef914fcc719cdd7d17d8c54" => 24722, - "000005e33e11c29db88a6a59520395c6d74ab06b168434171d51695d32d447e1" => 24719, - "000005f2268271f37aad0fe7cfb9ce5069d4ea9178d999b3488942c0152dffcb" => 24718, - "00000470f83644a5c08132629c03807cc6682846e2aa5b39959d5f3cd12cf48f" => 24717, - "000000e70d9b8d5d9b8a6af9b7daa957df3d36f30edf1ef5a59da62eb10e17ae" => 24716, - "0000065d0abb85677e6ab4af484d80f7e90a3cc01fc46c555e3ac8659644d844" => 24715, - "000001f6cd40684b33b496fc574facfd81790681ee36088387a364dccb48def3" => 24714, - "0000049522e2a80117de535914d67c7e8904bfc0bbfdca4702d56939c06a8cd1" => 24713, - "0000012e65c0ac8c90b83d42a532b4a7c3774c0cdedfdb74ba64d1637ca4a7fe" => 24711, - "0000007f70b2ea36d666379e731f7ecff79db6ec9838d39d24af693756608242" => 24710, - "00000098ef907dedce9eaf2132cf67545a0f746e6316c698f35bcefbc5ead111" => 24709, - "00000672106963c28e4ae06d0e0491bdaf1aabd4ea3a0759a65261e231d6aa2c" => 24708, - "000000fa70d8d7cba9ebbf96c297e22cebd58ab8d7e1da8fe801606701237610" => 24707, - "000005b33952dfbb9e9c936503c1f474df369bb7807adf95909b37d316e9052d" => 24706, - "0000028acaa3b4fcc3eb0e9295a3a9a0b395ef464507a9af5bc51cd2b04b38e5" => 24705, - "00000553a90aab22049b035f06cd4740d4c283c3b7daef5bfe8246b776e5d0a6" => 24704, - "00000015443346b5aaaf59fb71694428399183a0da3d23a36ba62ef6f868d65b" => 24703, - "00000524346a800cb8b841e79a429803f06daa25dda27c4e15529711dd026485" => 24702, - "000001ade388c5280e9c0abc025d860f4b134d78f5f894910966ef58d79eb6c3" => 24701, - "000004970192dd41d3afe3c809b8cb150c8210a6cd41360ecc504f8e765a14b5" => 24700, - "000002be5a953f7fed9e4be3361df036a07676fff669f3fae721c1cfdeaa12ba" => 24699, - "000005ec3a5ed58b575c0dcea597b0bae984f9642cdbb745c2a4acf92b1228e8" => 24698, - "000004416dc20703d3aa5f017d7cfb96f1f030c06dafad3b0c45414e7b84847c" => 24697, - "000005cf0f4caba6b236341afb3e7f8beacb8018364136c198e6db485f131e14" => 24696, - "00000487243de854c402ef3026822e4b33cb23f3526275e931d00589697c7b11" => 24695, - "0000040fd0c77eb035c04daa054de7df0a330bdd767a2b9f40929fff4b631ca9" => 24694, - "00000212c4234717534cf9b4351dcde432eebeeac2231cd04d1a1f470710e72d" => 24693, - "0000037372e681ae0013faa6f509043940f39345f6fc2c9d69bfb26a92d4d3a7" => 24692, - "0000000c03ffa98e5ba1c1fe1441c4812a91746aefda9b6d150ed08242d4821b" => 24691, - "000000602033c5a0c32421f3adcb3de7189931a633e98047b38ba6717f242740" => 24690, - "00000362c6b66c7054dbdbab81c79e263472b1cea6b0a3e455716fcf328f8e58" => 24689, - "0000002fbb3e6eb53ec3174f2071db442dac5ffe82794cc5b0498fbac080f8da" => 24688, - "000002177c627bdcaf2e95791166c9641bf02fdd5cc1d4a85ca20aa25acdd107" => 24687, - "000001019891cb0eb860698cca78b8a17fae795c0798c437a0989896bb02c353" => 24686, - "0000013f4ea9f6aebc88a59d1fa8631f46eff2e18e54b4ae9d284d1e640d7fea" => 24685, - "000006c99c58dbec27e6435cd4a1552007c55afec8af797c1435196a3c622aee" => 24684, - "000007e05572b439fc0a21ce64981b82669d34d73144344b80e2fccbaae85687" => 24683, - "000001be22b6a741824b01cca475101002e0f1457f024d439ea5ee0a1aada27f" => 24682, - "0000001072bcf507e848486e5ff320c1522f887b158ba6e4303b3ceddd4762a8" => 24681, - "0000035731fd748b408aed499c9c4b45628e9338270a96fabcfe763f7b6e54ed" => 24680, - "000006501d187ea8b178cd4b6d0aff146dd478609487bd889a693ebe76d27b09" => 24679, - "000000b48edc5982b7986c89ddb7a3046fce5418a3bff0c40b9c208b768dcc90" => 24678, - "0000040798a6b4632f2a9dd0f2a07523affae1bb4ab547598bb972d76fa19c8c" => 24677, - "000003a5ef3d13b8f452e41fe4a45156d512c295d094e6ea352543b2280929b4" => 24676, - "0000068ad662037d30811d86dac5b50ac0ee104afa0775b7b5be6e89ace77929" => 24675, - "000001fcac0d415ee0fec9b164a5c0d3baf7fcc01cefd8f55ae1cbaf4edc557a" => 24674, - "00000439528d740502cfb49d869ea9e24d2a13ec9b4dbec666923aed9a74d52f" => 24671, - "000004404897d33d867d3804df92ceffaccddf2fbde381800461ea3b88d89d30" => 24670, - "000009b14dec4bc7ba636de6ae25db8bde066f132b2fa96d9c4fa29ed1b6b82f" => 24669, - "000005c6ec5a786816157f38b3e721529f6bac1d4a9e20bbc6119d1f44b38ddf" => 24668, - "0000057e45e1a7176be2b0489956d83a1044e5e842097e353cd5ebae7f1a51d3" => 24667, - "0000022e51809198d0ecf3fc49eb4706f9cd09b6ade82c9b87923cda2e5301fa" => 24666, - "00000854e9d76d2507226e86af114dc3572206011d850843a40c1d3fea0860fc" => 24665, - // "000008ca1832a4baf228eb1553c03d3a2c8e02399550dd6ea8d65cec3ef23d2e" => 0, - "000009ab6ebbf37176dd95a82f3f66d9ef24e8108dfe7874fdf2adee3dcab7c9" => 0, - _ => u32::MAX, - } -} - -unsafe extern "C" fn get_merkle_root_by_hash_default_333( - block_hash: *mut [u8; 32], - _context: *const std::ffi::c_void, -) -> *mut u8 { - boxed(UInt256::from_hex("0df2b5537f108386f42acbd9f7b5aa5dfab907b83c0212c7074e1209f2d78ddf") - .unwrap().reverse() - .0) as * mut _ -} - -#[test] -fn test_devnet_333() { - let bytes = message_from_file("QRINFO_1_21976.dat"); - let chain = ChainType::DevNet(DevnetType::Devnet333); - let cache = unsafe { &mut *processor_create_cache() }; - let context = &mut (FFIContext { - chain, - is_dip_0024: true, - cache, - blocks: vec![] - }) as *mut _ as *mut std::ffi::c_void; - // let cache = unsafe { processor_create_cache() }; - let processor = unsafe { - register_processor( - get_merkle_root_by_hash_default_333, - block_height_lookup_333, - get_block_hash_by_height_default, - get_llmq_snapshot_by_block_hash_default, - save_llmq_snapshot_default, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_by_block_hash_default, - masternode_list_save_default, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - let result = unsafe { process_qrinfo_from_message( - bytes.as_ptr(), - bytes.len(), - chain, - false, - false, - true, - 70221, - processor, - cache, - context, - )}; -} - -#[test] -fn test_processor_devnet_333() { - let chain = ChainType::DevNet(DevnetType::Devnet333); - let processor = unsafe { - register_processor( - get_merkle_root_by_hash_default_333, - block_height_lookup_333, - get_block_hash_by_height_default, - get_llmq_snapshot_by_block_hash_default, - save_llmq_snapshot_default, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_by_block_hash_default, - masternode_list_save_default, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - let cache = unsafe { &mut *processor_create_cache() }; - let bytes = message_from_file("QRINFO_1_21976.dat"); - let context = &mut (FFIContext { - chain, - is_dip_0024: true, - cache, - blocks: vec![] - }) as *mut _ as *mut std::ffi::c_void; - - let result = unsafe { process_qrinfo_from_message( - bytes.as_ptr(), - bytes.len(), - chain, - false, - false, - true, - 70221, - processor, - cache, - context, - )}; -} -// #[test] -// fn test_processor_devnet_manual() { -// let chain = ChainType::DevNet; -// let processor = unsafe { -// register_processor( -// get_merkle_root_by_hash_default_333, -// block_height_lookup_333, -// get_block_hash_by_height_default, -// get_llmq_snapshot_by_block_hash_default, -// save_llmq_snapshot_default, -// get_masternode_list_by_block_hash_default, -// masternode_list_save_default, -// masternode_list_destroy_default, -// add_insight_lookup_default, -// should_process_llmq_of_type, -// hash_destroy_default, -// snapshot_destroy_default, -// should_process_diff_with_range_default, -// send_error_default, -// ) -// }; -// let cache = unsafe { processor_create_cache() }; -// let context = &mut (FFIContext { chain, cache: MasternodeProcessorCache::default() }) as *mut _ as *mut std::ffi::c_void; -// let creation_height = 1008; -// -// let tip_pro_reg_tx_hash_1 = UInt256::from_hex("663b2fb8bb620db387f7268ccdf261d0739b3b734080487736560536f9da67c0").unwrap(); -// let tip_pro_reg_tx_hash_2 = UInt256::from_hex("beba26ecf8a70d13898cdf463dc2b29b3111999d9ad7bb3b1bd270c38ec64a46").unwrap(); -// let tip_pro_reg_tx_hash_3 = UInt256::from_hex("67eb2b533192cd354e9571cb361c5fb2f3a40847aed1b0983a18164f650542d4").unwrap(); -// let tip_pro_reg_tx_hash_4 = UInt256::from_hex("f4bb17991ade54751bae0d192102ffa1fe9428085f459acf22a34f061e5b2a18").unwrap(); -// -// let tip_llmq_hash_1 = UInt256::from_hex("0e66f9273a2de1905244de60faf55bb6ec795cc6c66607f2c0cf9264e224d02d").unwrap(); -// let tip_llmq_hash_2 = UInt256::from_hex("6a8908985dac8faaf2edeeb5fc581ca8cfd13ab8a0d054283b10241d9cd74ee7").unwrap(); -// let tip_llmq_hash_3 = UInt256::from_hex("0e66f9273a2de1905244de60faf55bb6ec795cc6c66607f2c0cf9264e224d02d").unwrap(); -// let tip_llmq_hash_4 = UInt256::from_hex("0e66f9273a2de1905244de60faf55bb6ec795cc6c66607f2c0cf9264e224d02d").unwrap(); -// -// let info = types::QRInfo { -// snapshot_at_h_c: boxed(types::LLMQSnapshot::from_data(vec![1, 1, 1, 1, 1], vec![1, 1], LLMQSnapshotSkipMode::SkipFirst)), -// snapshot_at_h_2c: boxed(types::LLMQSnapshot::from_data(vec![0, 1, 1, 1, 1], vec![], LLMQSnapshotSkipMode::NoSkipping)), -// snapshot_at_h_3c: boxed(types::LLMQSnapshot::from_data(vec![0, 0, 0, 1, 1], vec![], LLMQSnapshotSkipMode::NoSkipping)), -// snapshot_at_h_4c: null_mut(), -// mn_list_diff_tip: boxed(llmq::MNListDiff { -// base_block_hash: UInt256::from_hex("663b2fb8bb620db387f7268ccdf261d0739b3b734080487736560536f9da67c0").unwrap(), -// block_hash: UInt256::from_hex("5fcef4606b48e92b611df852b12974e549fc385a7097d2370a7bd0bad8cbb055").unwrap(), -// total_transactions: 1, -// merkle_hashes: VarArray::::from_bytes(b"010e45d82414995ed1c23f546c35afa316499c09b870dd0a3c15796c4ccfdc00c4", &mut 0).unwrap(), -// merkle_flags: b"01", -// merkle_flags_count: 1, -// coinbase_transaction: tx::CoinbaseTransaction::from_bytes("03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff050205040101ffffffff038d0cb75b0300000023210285c760cb2fd04fc7ff217cfd1c66594ba47247c29eed85949f43e80f57b53727acd94e854a030000001976a91471d69c816b5ad8718c800607fef3a47221078d6088acb0bd3111000000001976a914a73955c08d561a22a399513e1c5d3983d110701d88ac000000004602000504000042696f1f2db709cde94efa6f8de3e5c5ffda082fcb3f9d81b5929849385667bd3394b4b77e40afd081094fb55b49a94f39bc6910146b5010b9d6af082f15545a".as_bytes(), &mut 0).unwrap(), -// deleted_masternode_hashes: Vec::new(), -// added_or_modified_masternodes: BTreeMap::from([ -// (tip_pro_reg_tx_hash_1, MasternodeEntry::new( -// tip_pro_reg_tx_hash_1.clone(), -// UInt256::from_hex("5fcef4606b48e92b611df852b12974e549fc385a7097d2370a7bd0bad8cbb055").unwrap(), -// SocketAddress { ip_address: UInt128::from_hex("127.0.0.1").unwrap(), port: 13998 }, -// UInt160::from_bytes(base58::from("yhedxEwiZ162jKCd3WpvWgWWocDiciJuKk").unwrap().borrow(), &mut 0).unwrap(), -// UInt384::from_hex("8c3a4249f6e1597ac13fce64b91361ebf6d0837d5a95736549b88826868c34c7c8ede2da665e2702708fc431c9eb231b").unwrap(), -// 1u8 -// )), ( -// tip_pro_reg_tx_hash_2, MasternodeEntry::new( -// tip_pro_reg_tx_hash_2, -// UInt256::from_hex("63f2bb5920d1a0c27c9689d62c6834a314584fcd7b2bf52388c1dcc2c987f2ec").unwrap(), -// SocketAddress { ip_address: UInt128::from_hex("127.0.0.1").unwrap(), port: 13999 }, -// UInt160::from_bytes(base58::from("yZLegVnDt5t4KZAiXiH2M88LbvkHxRnXL5").unwrap().borrow(), &mut 0).unwrap(), -// UInt384::from_hex("1185482390215003acac18979f4090b5cb4f2a7abd54a0e25b676d681bb6b53853488a74a014863403eab95b47afa017").unwrap(), -// 1u8 -// )), ( -// tip_pro_reg_tx_hash_3, MasternodeEntry::new( -// tip_pro_reg_tx_hash_3, -// UInt256::from_hex("17ac84060b137d5e2c19bc4f2fa030fd4c49aedc77c64380251d7c22bf78e560").unwrap(), -// SocketAddress { ip_address: UInt128::from_hex("127.0.0.1").unwrap(), port: 13995 }, -// UInt160::from_bytes(base58::from("ygo4ZEACuXGWygecqexNvLR2ryPV6LJBXh").unwrap().borrow(), &mut 0).unwrap(), -// UInt384::from_hex("1904bd1b479ff9fb5d99996575e4bdad5fefad11adf58de8e75d1b6e4964adf8b55d9e4f9432d56df6bef67f2ad68cda").unwrap(), -// 1u8 -// )), ( -// tip_pro_reg_tx_hash_4, MasternodeEntry::new( -// tip_pro_reg_tx_hash_4, -// UInt256::from_hex("50cc1bc3de661f923afd38e608a5b4fbd1b608cba85d050e7380cbbbe4fc41ff").unwrap(), -// SocketAddress { ip_address: UInt128::from_hex("127.0.0.1").unwrap(), port: 13997 }, -// UInt160::from_bytes(base58::from("yiyRqpgyVXTw3SGyWMVNeWS5YMNC56MMnW").unwrap().borrow(), &mut 0).unwrap(), -// UInt384::from_hex("0579dccf1de4e4bbf5f69bd1ccf5df2dd327d32b49e3789ec823858bb4fc3fef32c214461ca16151e7c5176573291429").unwrap(), -// 1u8 -// ))]), -// deleted_quorums: BTreeMap::new(), -// added_quorums: BTreeMap::from([ -// (LLMQType::LlmqtypeTest, BTreeMap::from([ -// (tip_llmq_hash_1, -// LLMQEntry::new( -// LLMQ_INDEXED_VERSION, -// LLMQType::LlmqtypeTest, -// tip_llmq_hash_1, -// Some(0), -// VarInt(4), -// VarInt(4), -// b"0f".to_vec(), -// b"0f".to_vec(), -// UInt384::from_hex("0f10444bd28d6a0993224baef8ad9b5c6fcdb246b268ef36928e9b9594e1e0e8679b867a16914c55d129007b07169767").unwrap(), -// UInt256::from_hex("a689bbe717b3e6ad6ea82d56dcd39cac0fc59b78849277519916be7422e2656c").unwrap(), -// UInt768::from_hex("0ab9c10a55e71608c4adb77e7fcf3aa060d26ee243c8bee3fa0a5af04e79a628974444a68c3bdc289d5a4141c7e5ba5c15a3f0f40c4f16dd4cdb2cb42223ecd842a238c9937ce6c5b065dfebc35fd4a0c64aac0358a1095cfae7c3fedf6063eb").unwrap(), -// UInt768::from_hex("10a116918d6d5e44732178c68076cc640b884ea91a83072b4205056af2682c6ee65b32d7f49bd38e349cdbd5b2292f3904d1e1c4a17e45bd94d4d1d5c89a9eaade467dd208d8878cb4fed3afb8b2eada4b5cd10ba65c9c8356c5bc54fdd22834").unwrap(), -// )), -// (tip_llmq_hash_2, -// LLMQEntry::new( -// LLMQ_INDEXED_VERSION, -// LLMQType::LlmqtypeTest, -// tip_llmq_hash_2, -// Some(1), -// VarInt(4), -// VarInt(4), -// b"0f".to_vec(), -// b"0f".to_vec(), -// UInt384::from_hex("01debc67e536f44b62b0558b6c3a15e7b0ea96b31b284875a9ca8d29ed7b214a75586095bdaf587daac6db781341512c").unwrap(), -// UInt256::from_hex("1283ed47e65a4a6b8696baee4e58982db52f2cc8a2b9f49ae45fdad31f6d5e8f").unwrap(), -// UInt768::from_hex("0b0f242f2c157df7a6b86d6de735088c230f654787cb45a23d299e9b9adb17b2382e14160f4181108198a3efe50ca3351298186b2be82c622ffda6c2cfde2007c080db44ef97e088b1127f3286f7220c1ed87993d6f186a5085764cc911a4c48").unwrap(), -// UInt768::from_hex("82035bfe76e6ddf3a88d141512e5624ab3cd04596d7afaf928352e76d55bb819a5183a9aeb9a604bb23a40f371dc34f500c2738f4e3147c909d8ba384ce26c13b5695fca04e16e59064b2e53632fd8314a08bc81b49a7555eeda5cdc79f71a7c").unwrap(), -// )) -// ])), -// (LLMQType::LlmqtypeTestV17, BTreeMap::from([ -// (tip_llmq_hash_3, -// LLMQEntry::new( -// LLMQ_DEFAULT_VERSION, -// LLMQType::LlmqtypeTestV17, -// tip_llmq_hash_3, -// None, -// VarInt(3), -// VarInt(3), -// b"07".to_vec(), -// b"07".to_vec(), -// UInt384::from_hex("05a55e3fea0341d7f1985a1d5cefa20536bbe56df49c3bddff19ba8ec23ae20956cd1bf4718c6c33b8901583de3b5455").unwrap(), -// UInt256::from_hex("bb78ee19643d2bc92334e4d630edab7fde7be90549525121b6db97ecace5524a").unwrap(), -// UInt768::from_hex("94a41ea4095cd7d4ca5db33018eb2df3abb9f51ea74653db1dc2832a45f683d96cd0cd209458ece30c6f6b908c53687a0e428b6763db9c65bcc753509fb919e4643d52c759ff8285724840677be35e7db3f9981bb93c36ba41f51afeb386a511").unwrap(), -// UInt768::from_hex("89befef3e3c509192d843c426df9c7316c6cb63ec4bc2c50744d0ac33a769283df7b645a965c3dba9e008b258bbe8bb7016774fc81d31e85ac34cb844a8c572dc6b2d6576b65df0fb09114c964c315fc66ea22b1911ed26fb82d39b9635b18b9").unwrap(), -// )), -// (tip_llmq_hash_4, -// LLMQEntry::new( -// LLMQ_DEFAULT_VERSION, -// LLMQType::LlmqtypeTestV17, -// tip_llmq_hash_4, -// None, -// VarInt(3), -// VarInt(3), -// b"07".to_vec(), -// b"07".to_vec(), -// UInt384::from_hex("92470c6e0268b1cd8f326e673c952fcbb5b0dd8f7f28dd0bb4a7d14023f69bab475f2aff3930b00bc040c211e0363272").unwrap(), -// UInt256::from_hex("c82cbf83d68d2a9598ebd14798d7544485659884dad31d0305c9e01969031769").unwrap(), -// UInt768::from_hex("94c3181a766833b06ce5b4d4c83534da6665974f81e2d9fe6e4eb644ea9c033fcaf62cdc244a82a8453261043cb55f4006d62f310dfe918c292663a2abb19df253ddf67db2c4df126edaa2b21a61dbc9af8fc0a36fce55b8bf14a57f7edb60ca").unwrap(), -// UInt768::from_hex("94be970450945d578263d08ab524d995e253db865d7195671f2c48a0baff7d2b6c9f17f79abf8247244459c60104d8da0efe78a709db8e85e1047fa620365bcf31f9f488aaf27a46cf1ba33d768cf6ea66ee02777ef0b42b2d92e16011517438").unwrap(), -// )) -// ])) -// ]), -// block_height: creation_height -// }.encode()), -// mn_list_diff_at_h: null_mut(), -// mn_list_diff_at_h_c: null_mut(), -// mn_list_diff_at_h_2c: null_mut(), -// mn_list_diff_at_h_3c: null_mut(), -// mn_list_diff_at_h_4c: null_mut(), -// extra_share: false, -// last_quorum_per_index: null_mut(), -// last_quorum_per_index_count: 0, -// quorum_snapshot_list: null_mut(), -// quorum_snapshot_list_count: 0, -// mn_list_diff_list: null_mut(), -// mn_list_diff_list_count: 0 -// }; -// -// let result = process_qrinfo( -// boxed(info), -// false, -// chain.genesis_hash().0.as_ptr(), -// processor, -// cache, -// context); -// //let masternode_list_decoded = unsafe { masternode_list.decode() }; -// -// let result_unboxed = unsafe { *result }; -// let list_diff = unsafe { (*result_unboxed.snapshot_at_h_c).decode() }; -// } - -#[test] -fn test_processor_devnet_333_2() { - let chain = ChainType::DevNet(DevnetType::Devnet333); - let processor = unsafe { - register_processor( - get_merkle_root_by_hash_default_333, - block_height_lookup_333_2, - get_block_hash_by_height_default, - get_llmq_snapshot_by_block_hash_default, - save_llmq_snapshot_in_cache, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_by_block_hash_from_cache, - masternode_list_save_in_cache, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - let context = &mut (FFIContext { - chain, - is_dip_0024: false, - cache: unsafe { &mut *processor_create_cache() }, - blocks: vec![] - }); - - let mnldiff_bytes = message_from_file("mnlistdiff--1-25480.dat"); - - let result = process_mnlistdiff_from_message_internal( - mnldiff_bytes.as_ptr(), - mnldiff_bytes.len(), - chain, - false, - 70221, - processor, - context.cache, - context as *mut _ as *mut std::ffi::c_void, - ); - - let bytes = message_from_file("qrinfo--1-24868.dat"); - context.is_dip_0024 = true; - let result = process_qrinfo_from_message_internal( - bytes.as_ptr(), - bytes.len(), - chain, - false, - true, - 70221, - processor, - context.cache, - context as *mut _ as *mut std::ffi::c_void, - ); - println!("Result: {:#?}", &result); - assert!(result.result_at_h.has_valid_mn_list_root, "Invalid masternodes root"); - // assert!(result.result_at_h.has_valid_llmq_list_root, "Invalid quorums root"); -} - -unsafe extern "C" fn get_merkle_root_by_hash_333_2( - block_hash: *mut [u8; 32], - _context: *const std::ffi::c_void, -) -> *const u8 { - let h = UInt256(*(block_hash)); - let orig_s = h.reversed().to_string(); - let root = match orig_s.as_str() { - "0000086ccc192b07450acf188eba3d0360058dd43793fc622e0b7744cad5cbed" => { - "52b4cb95e82f827e916b9a5a95198203cb7d60d892932bfc64aa9496c79631e7" - } - "000003227cf2f83a1faa683ece5b875abeb555ebf1252f62cb28a96d459bcc11" => { - "5c30a026f7cb72fffa390b1200955354eafb6ab5264b8043ff2a2e582f230342" - } - "000003bd988f78d4663780b467dc6155f5c1641c16a2d0a09cf62eeaaf9ffb39" => { - "b8d3a314e523596b23a57537ba1a7a8328c96ae895eab8e80760eb841a88df06" - } - "0000091ffc39c9891a425b7eacb051c026d8e6ab4a86f074b6961f7c4a0ea87c" => { - "5703a09bdc76f7e37107d359766a74dca3ed0c71b7a0132260e153544d4ee208" - } - "000008804a2cc065da4752c7f6f4b889c682749997bf24c704ab44e932ae0f6b" => { - "5551649a12b1f22b4e014b560aab1572f0470956bbe1c6ada1dae84310277eee" - } - "00000aa4e53ca2059b645787d4516dc75f1289708d2a2d3f6b103d171821647b" => { - "09594af7333c774ec2407eccb9b24d2a4be9c49d8e59b34b10fa1f5d2c7739af" - } - "00003130c6ba235a12bf1057c459268ad10924a47d9b34eddc57858d77f72ddb" => { - "ff4e47838f277a170ac230745b023dbe2fa9390fe9e9b3242aff129240944c94" - } - "000000b5f4669ac2ebda3607fa627df62656650ee689a8c82705f340ec3d78ea" => { - "6de4c9854cd3ff66b4fc0f46d51c0a3da00919b08a1cde84404d8fa2ca8e8ba4" - } - "00000692fc267184a6ab60ed6af6a55cdf527773872c601f098569c254f2d189" => { - "e74463659764773681b780aa204c8914db2aa831fb3da82dce529f9d67434495" - } - "000007991952ca7c32420cd92654ecc41d5716c191cc96cb8978ea3257a69992" => { - "062fd8d751abcbcadf2027e1536e2710a04ed21f0d0ddc7f2697b7282f0bd04b" - } - "0000037bbcd8e2af574fff36fd248d2058b3a9582c9a9c3fc6ab1dcee69c25e5" => { - "52430300040dd138bca38fe9441d94345e5c34644e1c211308bc420dde47ddbb" - } - "000004f78ebfe17c2e78c58ca1e754e02f3e52043bea00f63be7f2cd58d23c96" => { - "ff3c3a2740c38cb87dbae24421f4473a35af8e8619ecbec677265bb74a0d1f51" - } - "00000597b3da0bdb229b571bfcebb78a5786c9bc21d3fb3253d497b8a62e5d99" => { - "f1861fc7b0b00fa5cb76b4ec918f19a898ac50aeeaf69e9586cbb0cb2ccb4103" - } - "0000078bc1a0778aa6d8dbefde4f110eee570c1b945c553b9ed98368871d6b5b" => { - "b600667103e998ab12bc8e8e45e1b6efd3ceb5ec8a15e6d7f765202d2ba70766" - } - "0000062c4e24e761dc2d1b9b6d1588198b3f4ad8a767151ef6414bfe87ec94da" => { - "ab1331d5de92b75c32a8de2b75db01ea9676a7927779b3f38b9ebfb039d33ecc" - } - "000000e3756fb54df8e63db7c69158a88247ae6fb951602fececa314820a644c" => { - "fc930831682f27c6a837e65adf545ed686a57eceb62f05a1e11c601183869920" - } - "000000461e6f7b4d5656173bf188e83bee5f10d971616d946db3027cbecfa13f" => { - "77a02226b66fdd4b3494626bb75691ffc575b0de3236e519a7f88a90d2a8601f" - } - "0000037bd6d0b218eb906ab6206fde5a96f972ede0308bf76cac4190428a924d" => { - "0d15faa6f607d4b17c5d24c2247c9327f1b36140bd6c10071a3360c1d57e6678" - } - "000007756da9e48ef99829c467379e3a873ec9bf90652a9d10483329ef4e222c" => { - "544a57a166570b1569a58b736e7526ecdb79c972be5f4a60e3142b959f730d80" - } - "0000018ed9cd191989b356447ad4d0649d5c471e1661a79aab2613251cf991a7" => { - "a89ef31ee6ac489f8f3607eb8f45de084d51cd87ab92fac7868e2a817440cb2b" - } - "000004413ed62592b7a47b06a296ecb79dfcf5e65227a3e93713b36c48846f6a" => { - "48d83f6760e7c3eb3b19da95651cfc385d22cfe864a3b53c9c00c4654d1961f4" - } - "0000050c3da50cc911506eb4bfb50e7b1f1ac0d165eb62f239a48545cc5834c1" => { - "892997c525cb923b96951814d4575e75ce16850e3cf12a9d673970682ef7eea5" - } - "0000010f2aabcceddff97f4f87987902f99629518dfdcdf5522e7e159b78a825" => { - "6baa43c539d6605cfe29e2f49b0f5913874518206803c1031b9753d56f55ee7f" - } - "000000426666e40ff602a896a1493b765daa6fd6667f7c5edd0cfd7c23857750" => { - "f0e942c71fc30f5997162a3392a7142557e801cdafe292ad9641aeb213aa6e4f" - } - "000000b693fbd6d2a02da459158394220f83a4cdb947117246c83a65c9296bf1" => { - "48f81ed8fa2f69b1c6144e435ca78809f805db00109b708480d38a2b8197f241" - } - "00000683d6d9d7df1b530eecd973fd71aac2434687cdf94b02a959237b41b123" => { - "9a27c39d7c0e47d331dcc07816b1794593e1c3b6d854b3e0d5f46a916766f7fb" - } - "0000052e1a801d4313cd6a90beed7f478f34b778c2a8cb0e8b98dbcf83c5efbc" => { - "1e906bb71f88905f5f457eba573d4bea9fb37689dd59875533785b6c2cc506aa" - } - "0000076bffe00bf97fa0baa71c1444f5e3270cd0ada2423f1c77858b95d19338" => { - "1955d09fb7650cf2eb2a8b300c89bb8b4522f0b720ea2c9c235c29625b72019d" - } - "00000763996b273b8f8fd4b184e0175679bae5bd176d021efd71d4d598e0a184" => { - "ee69bab287a0561e23545c3092b5598889b2165045600b65091f5d064a38260c" - } - "00000088430da03d58df458cb0118dfb7a5583241718c8cbb1b02f7eee673463" => { - "15cc835964dab2bb3886b5e5cee5511fba6e7c77cc802835dda39dd424265c17" - } - "000006fe4eb832348f5abbd7d7fe5653068dd20ca58e05bec321f486a9fe5eb1" => { - "63515c8d179eda42dab1f4a975bbaadd9898788e061ec7357c6714353a332ed7" - } - "0000018db2f6d303edcdd6ded823acc31bfa50f08389111b4f90ca4cc753006d" => { - "00022d442bc384793a356aeeacfe6d43effce4afa60d0ec5da4650c2e545755d" - } - "000002f575aa919a482ec157c9c3614057078bdf99da797305c9c7f549a9c677" => { - "292ba3e5efad3c49097c0db3b818bf920933248a5706f845b313cb0598bdc776" - } - "000002dd2d2977ff6fa6765954919dd816b96671d4c8d5d0752f5e4efc48f8bf" => { - "0fd38cd24e0b2213c2391152c35889fc18f84e075a1e214e4ba9fc82195a11d2" - } - "000004574333f4fcbbf989299a298c53b89718aa10c169c32db07c18c14a33ad" => { - "eb722e4cee02f65a4839ed67631b80d1d0a7b323ee2c4b30ede92388eaa48a73" - } - "0000053f364c7ff258ff87185de4c789420372d9bd76f37dbdc57d5b3d1992c0" => { - "ea387ae59b896c7e7351509632bb3943930370b884e13fbe703ca871d1725e55" - } - "000001e2680c8f337c3a6d81f7b72e67836dd64a6cbbaf13875a0a72976282e3" => { - "b722474955912746173fb7f17f7a342b494c98d1599c50b7c9a35070c3e78924" - } - "0000030d4554e01211b54c9041f7a257ec83f9079a1913eda923bdad11f08670" => { - "18439878443990f9fd7a2a598e0d74be3eda31dd198444aa35ebf9de3dea0dfe" - } - "0000045348e3cef51ae93a68a09e56eab3a08f339ab62b196709f83bc97c6936" => { - "c1bc302bc6e7318178eeabfbcdfcc3de5b89b507a771aa5a06645ee05a8f03e6" - } - "0000040777831dcff5ffb3e3c0bd38a008a6d4456c06e320386004fa68a49e7e" => { - "e81c9ab159a488f6a86c592f770ae44fbb31ccbaf77c2db31f8b7105137c30aa" - } - "0000027e119d72c5dda56cf39223b35f232092495996345be248eeb48c9f9130" => { - "4ba1856be4bdd7faceafd79d8548c87917487e994b61c65454bcd46ff549f2d7" - } - "000000baa4a33d65e11107122a92601053ab4e716a6d661dfd6bb9f874188413" => { - "73ef8566ea6a716033d4dea8a311043016efa0942981ebbab7289715b984b3cd" - } - "00000645381ff1106e135a9d5df3cec8edfafce71c182325d4b75099d4002c4d" => { - "8e834a0a5482eca0cef23ce4a9c6ddca8412a972f938ede42d3900919db9f85c" - } - "00000056c854b1996beec75c464693bed7a958e9b67d71d701340b8ff6d9e054" => { - "58811d85c144b03f273fc4579c5336e90fd58da543cba74110bde7471ff82b4f" - } - "0000027aa1d0102ddacd2f9dde2681ceaf0b5c0caa806cb7f816c119051464e6" => { - "7eb1bd17340f7cff6deae1d6cb12de756338c145b51a58668773bc8a2275e47a" - } - "000006437989e53e813df1a8aa388096387ee5de9cd0b045779a703582e7949e" => { - "6fa7e4e02ec3cf482fb179f463e00e34948115303a3e1ca0ce4a82fcf341e0c1" - } - "00004cbd92d058ad559d6cbb2d973e3e199015826eeab9691cb718ba349b0f70" => { - "1271616d765ed0010c1213c190fe6d1d6e84859f6d6dfab62a95ba96c90eadc6" - } - "000000885cf1eaa6b419152fc651e0119d57281f18a6ae3806dbd4fcfb5cad25" => { - "a28c627f58c40748536f3b6f6aeb73f55a6b1acc54ed81510972acba0a6acb33" - } - "0000049f89a5dac8c9593c601f9a385440ee050abe8cf5f039a3d59c58f06249" => { - "21d1c3e4985f27a6b361891c63fe045a9fc3199234cc3e2089e9a3793de24424" - } - "00000104885a2403d15e65e25daf9f78c755c2953945914f58e6328c9dd50c4d" => { - "08d3447875c127f2e37d06a1ed02cf973a61d35c7127860c3f3bb4393cc40dd7" - } - "00000795888b51da4cfe848adfcdff19cfc815c1865c58e2200ea9ad596df9e9" => { - "7551b29e47bf5ecb9a39fe0722273c9b2622ff87ce088aa9c8f167c25674efab" - } - "000004169e45af9fd4ddaa64c400758df7cf36b0c1a22f2b9f29a11fdea70eba" => { - "afe8d8af3ea9d2227d465613ec5005f8e663512dc129ef3169f013d6518cb493" - } - "00000743fc8bde3da9911bbd5275e2e2a68afed8ce1d56b73ed8557528a4fb45" => { - "296d41098918166d02d61a99975ecaf7780f286d0b3b6e2a6619023af2c2fe68" - } - "000003e8049e2baee08e173a04106df0c4b0f858f8ae1918caf970eb10d2046a" => { - "f258dae6201a647985d093f9e1ecc602ada427736888585556910b9ee324d475" - } - "00000169672fae75e70f45a7031bffbdc92fb81d183d0324f39eac9268d11ceb" => { - "aff7439850e5ebe758714832bd56c19d67e005d7a27aa6b977e3a158fd86fbd4" - } - "0000082b9da7946ea66dfa9c6ca9765a41219a049129248e4c5656f9bdd8aab6" => { - "58ea2e9310568de837fcd3278cc9083c0e31b79896e25c487c237eb65f38dbcc" - } - "000001249c80a3899d72096a03195ebfb96b27118559094e149fcdee18017458" => { - "f68d24638b3b947689b1a95c1aa8fbe51cdc0bbf2546bb1b2145c09d97901598" - } - "0000002d7fc5efaf7d8799e6418f2cf0eda1e9dabc9771366ea66c5e09dae7cf" => { - "95a9cc169d6600fc1ae5188010b0ab277ad816b59f78a39b4876f6641596bcbc" - } - "0000051ee159b9aa029497f509e3c92bfa03737974444d04bbc940cc8a901bab" => { - "7ef98bb9b3566288bd7c28a2e42436bf8f60f52b15c8da32ae7e624988f1bf63" - } - "000008076d72be61be309f5a8e531eb5a85405f4ee75125a1b3556774b5848d2" => { - "7f9512c2488e48e0ac3967ea476344ccb9b2572865e294c4a1bf7c082c0c1771" - } - "000006cba36bb9086be9ac34b03d0bb2379ccbf9af7cd17da4f2450dc9f7006c" => { - "767d18f30dae94f145f81711f9867a903bc8fa58a4cc0d93791bc31cf683cc64" - } - "000004c5b1b7e1bdf532e1318154cf2ebe387b5b9ded7c748b75856003a43371" => { - "85fff19567ca04c51cd5f345c563b755480227a512e63c2b94f007d82089f0ca" - } - "0000066acb91115887007ecbd8d82eb4f4c32c0270552fe8b2f32e48213575f9" => { - "3280258fdc954d6470088b8b998ef3159f746721999b1e1ed8b48eca03a89897" - } - "0000006dc4fc61cdef4df41ee9b7f49fe17eff54a66f3a3a88bed959388a5434" => { - "b3142f93901412470ff5a60bb97f154bd073fc4b5680de9f6e9ed8105f952f57" - } - "00000178548ba2f34bd307781683b0f97ac31ccdd9b1b22e148c59211567c407" => { - "b2c7c4467f297d5b5555a78a04a5f388191ba0e1b66c46910ab50f23492ca314" - } - "000005e3612dd20b3bce4ea865eb39045fff1f8937301f9a1db3654d1a98ff80" => { - "438c23bd2a25faa8a0e0938b4bf472a978e94f3ac28cf32c2cb4de1b093dc804" - } - "000008ab4c5a522743760f8ef14089c352b0f7b1013cd7ba7392c96e497afe85" => { - "ef7eeb4cdababb13885d3914e1cd7b8f93d0372e9cf15c6cb9a9733e189d4105" - } - "0000049c9e3d99ae33ce5d71e7e3974d8be8d87e65f66f5d36f200f482eb89a3" => { - "5a951f79deee87276b7a99c8d919b5625b11bb2b5e8130d101c0060c6ba22daf" - } - "000006799bc165a2d527f3f980c919863cd3a78dcf3fd201f57bdd6c27ff7af2" => { - "edd0aa20824e1b9db9b04a5ee85fb16a7a7a0553999537caa2717c6266975c1c" - } - "000008822d1b4327327d2477ed48157ab739f5631451f59e669f65da6b4d99d0" => { - "4a653975f3b01949bedf979fed7fece05ffc064e4d0ae5c69f57999445a00c70" - } - "000005cbfa02e404973f41eccae792d8394f35089a39ae4f4242e61fc3110dc4" => { - "638c996bb12ad3581f31f2994ebb0983c975e541e6bd75fadc4aabab2b1e2949" - } - "000000c25bf5d29876879fd5664efecf5dbe6b889756b0413a7e9a7e14b63894" => { - "33b7035620f8ab27533844a2069cc73e8879d721a79a3f4aa302d3516103dc29" - } - "000001c6e2988ef3d42b7fe817481eded236109b1ecab23bde43710cd0b82890" => { - "5ec0593cf7bf479877e0b5aae2affe195fa860693129b14906f6205829e79db9" - } - "00000043a23d0bbcd576eb8c39b194e9ee5364ed47645dd4917bb45d06768777" => { - "c47aea598c0bcb0fcaa5e3d2a1cae54de3d701ac999b3d75c478d8c3b4062e88" - } - "0000002c7dabf7c52be36c77728fc2a1111f0caa9d167e4930c954540c3aa142" => { - "291739ec18d97bdbc2165b78276241a09071c780f703f44dbb99070fe297f260" - } - "00000213354b423e60b5e4e3da96a57658fae6451078b4301eb7fc96d286c346" => { - "8d65d6f8d35ea86b40e22e7a281aecdf316ba3bdbcec0d135d732fa4e0adea5a" - } - "000006acdb4419d876c00a195f16edf1b5732ef6c26e651ae9f2f3c2b8964a3a" => { - "ac0e90305591b67c48afdd22854961582b6270ada16b22b12e51535275ff6dff" - } - "000002a9757ea470f4d6341cec13cc12ae8e7940bc401b36b22a1a44d39cd7ec" => { - "403baa600723264025e8f4121bf8a6d35e0f86a6791fe3c05ae9cc9a81371c99" - } - "0000042837f5359d0b4d72b88a90e782afe782afbec03fbe54c7f06ef91e0fd4" => { - "1d1e1958e0cecda3756dccdc0daa9bd75d83534f99f1573e7f0f04a79d8ef999" - } - "000003de21b33156e7d94b1408fc9ef753f7cc9bfce52fe6ef2def3c2184a00a" => { - "981f77de0a04a241c6ba5a9532c90f95399548c143ff6759a83af1c17f1d9c92" - } - "000000f63595d3c80a44ff104b19828bd7f337027dc064cd179e2eb5e5e8db56" => { - "60d7c94e27c451d0b0519abf2e7297d6d03edc953839850d67f8fee315a333aa" - } - "000006ac1f34ea47d2db12fa1c8dd765190ab4c5c8329baf12c6a8ba5fc42dbb" => { - "96bdced70b2ea5938ebab0786921422488e0c11f1542460b0a1a0abbc9ded2ff" - } - "00000401fc8d3cfd75086cc67b73a32d7978877e1726ad9949bbe67dc4d46840" => { - "1680e4e050838ff64711a4e0b513a2a3c12e769bcee2ee98ced3130be22a9dc3" - } - "0000027b6ceb8c45d444005a6b948ced264c8fc39fb412dc69389ac63fee668e" => { - "493c8ceb8c8bbe311d3a4ab438756f753393c59eeed20f49f450e0fffb01513b" - } - "000003f23b070d2734940dcc2682517883b6f5d3189c34b5dff4742153ec64ab" => { - "42b4f4d81356e206a38e8902bdd3816c53bc37b99c26ad5c2656d93fdd997631" - } - "000002640f8273af03475f6ee496f80700b12980bc4fb059f734e6183377b078" => { - "cff2b67def2c0330f3b94408263f0d16bc9dc6c5d7cdf1c27b5d69e7bc85ec2c" - } - "00000005cb3272a005d40b45caa1cdeaba2651d619cbd6196f2c6c6317c8917d" => { - "e869767cdd4f87b2e5ce17af3771e3348e86fb464ab52415f5d6ae7f0810c666" - } - "00002b2c169c551e051fe563eec39734ef89eedee4d65f8a2c0074280418c8fb" => { - "457ce3aa9c57e761c70006c5ee2b6cdc44268dffebb1496df027fc94f4434002" - } - "000001f0718c066dd865f72836254d6e9b217f49ed4e08b89bb8e7ff3b3aa6af" => { - "5ce64f838c23a9684ffebf7417398a6978de294d0417d67721f2f3ea1fe59988" - } - "00000156030a46774d864bc346009cdafb47b9ea30a1ddfb5ad5ef5bcc8e0cf9" => { - "25b41d4886e9c6522bad0f930bb8f6321b989abf22cc308446aca2332bb443ae" - } - "000003799100d36e4f1eae601ee81df2f02ffeba59d3f29a7db43c2b7568d481" => { - "8614dc6a4b3df476d29df930d2a85085b747a9da4444f2ffd8ede95ecc3c3618" - } - "0000047213ccf1910fe90f8b8ced3e8a2e3a9c1bc93ebf4103f250dde548e470" => { - "433604c27acdd014af061155f9f0427d6750eeda899be051ebc79988ee5ec741" - } - "000003e3515c438775628e49dd61701a8327005566c2b88407d9afb59244092c" => { - "62b4fc1cec68e8700b428464eaa123d9206afcfe5515e43b6350cf960ddff3dc" - } - "000002563aa47ebb2189f33735f698231161c5df29627e36c01dcbf0a6a2315e" => { - "2b94cbcfc62f96e38a2d35e89df86e3c73b6127bcd5ec54a1a6b65e425f62a9c" - } - "000003c7f4624196872c229be62947dd0004e09571fb1b8c0625fda088873e5c" => { - "267d3e878168483b7a7326a5dce30de10719ebf612c6ec1609f97bc0c25a559f" - } - "000002c6cc3fc915987a1c89f295e969db682abad30b7143c66df3d020c81aa6" => { - "69aadd8c54d743e283f7efe28c6c3747db9cc56dad527660f93675882c1fccc1" - } - "000001a0000cf3979494e1451bbb2e5b8e5364c003d69b07e33fc9a4a42afe49" => { - "c87bcb325c5385d3a3d59d9825297e5afa6ac90c39c3bf8ce564f0b95310424f" - } - "0000051f34bb857fb33424cb780e066cfdd565c64714048d42b84d2ce64e0b87" => { - "8b6c786b0e89691b9f525eccfbdcfe3c9d2e40486a541ca9e7fb584d88ccf5bb" - } - "0000046900a9d9478e84fa09702fa98e734ade9416f43229969c03d499e2b827" => { - "1e1f36e337c0493bd1b178051c8b42be434b0ce567b9ee1ef844fc950cb7d612" - } - "0000020466a6a3f34b7edf6e7a56950992eb43e4f46babce3c8e7a1f027932cd" => { - "ffbf5508f9f933ea14b91b00d804d63bf6f816a09db21ef2333e794326d9e4ec" - } - "0000008ea4a9398eeaa5ee996129f6d58f3ee6eb36ad48b39dcfafd491b72698" => { - "1fe2f273d42263374697890bbb858d5c2479837599eff5e37ba9d80181a71ca2" - } - "0000023b916ba5f3cc323065f8673c6648cae692a97cb84ae052d372e2ad1fdc" => { - "2d062245bee6e9c053bd5e26bce664c0a6c4271ffbcf4b502dea1ddb960d905f" - } - "00000128469a850ff260fab8d71cec4ae08953f53adc769b0e4510c64cd5b1ae" => { - "1e366e20dafbd93954deb58361a6c92b0846ab57015033b4d46d153fd07376bf" - } - "00000329f84bfad3889f8e37a6e5f532547a73840428b36a875423aa3f781922" => { - "ec8aaf177d99942033d4a5bf04f68436a37556a86ef86bae68b992150d8e0fe7" - } - "00000039433505249e61dcea66c0f3075ac384cf216970149d2e7f149f031ac7" => { - "68a58f7cb6462b5509c8a52617fc14f4113fce4773dcf679345f12647fbc683d" - } - "000003c944684f4df6d0e9df65bd0ff45db24279400c977ad1ddd095d3d26a20" => { - "1658ee60f05710256858a23281494aa144333ed06c2be3c167979cafaea18d7a" - } - "0000050ef9d0c1e6e6d1506dfc9a93c87b49adc40d3f266f168726a987cbb16a" => { - "1ea15968bf1200beae5fd67242c134536c683388b88965c1332f41d147960daf" - } - "000000457cb432ced5fb2ea78d36ccb2744d22c1a4aace36ecd8e603325282fc" => { - "15cd134152a289645ad5bf17b205fb7651f32954b4b0302538d81d67782eae37" - } - "000004c958970f8db6169284b8fc0a48624964e38a1da4260a528855c549ffd0" => { - "69bcd4949035c8fc2b0f2d11806e031d7b1e728bf3a39c406454c4767eca3747" - } - "0000028a421d2f116e56ac5da67217e942fdc5d783d05f2b0ec08aaa98a4af1c" => { - "e1b6c73a9f3540acbf87106ca8306edd9b25e40b576462f00a5b0268873f85d3" - } - "000001b392b1b5e29cb334a6c7d9baf85e8468fc9d5ac2860c2ed4dfa8affb3d" => { - "323b403506c54cc4119029dcf2dea0e2ad27641135abac006aee894df0fd9e57" - } - "000003a2b3a849971822edc9505114e61704a58db8ebae14c78bd0fa9184f519" => { - "52795e25b88332aab36e18a3871d8de9f0ffbd7a26394e633b85c52915d6b6f3" - } - "00000081a650f7953b6f6e704b14b142e06972a3fdd86ebf5327820adce8a6f4" => { - "0599719b08ce78a6b79c9722a8d50e0f124a9158df2198c78db8cb59c2b13d0c" - } - "0000004b32f5cc9512ca0bd2f96f84a29b975c879ea050c7309c9321cd76d67e" => { - "03556bc5c6eb0458410a48319fbae6d8b68e97264dd0185cf7996e3aa2432fff" - } - "000003367801e71b6bfe4ca3e277603f2f9091caf80be7bd697b2e7d8b2fa091" => { - "49e298fd9fcadad735a72fa84279e66d3569ef3f417033e34ef0ec0b764d0d2e" - } - "00000555ea65e4120624c4c8699af9ea3c91a3f8e42095192397fbdf6774f02a" => { - "3f9e47004fa5ae565199aa25f23a0d3e828f7062fa54f3d3922f8a8d42d87dcb" - } - "0000016c4f0f1cb3ebd8f2b2adb53347a3c69fae7c0854b4ea41a1d4c8af7d6c" => { - "49ae7f66ecb7ab04675d13351983a4cb0d9c1270f6126a44f480ce8f7b0da9bf" - } - "0000028655333153a9e4262170b8acfda4a2dec64dd387b2033dc0a075eed242" => { - "25b814db212d80f6ec64c896bc5703ed6c83d25a21208904dbece269b2c1e8f1" - } - "000001c7704486626aec884fe851b5b54326825dd56d56d09f03beb2a576ae09" => { - "82c0e989264ee35a73c793ff4787dd9cccd360b9824310350f96a84e68a65486" - } - "000004db5d642d4a869ce8100ac5154658c06b9ef0b9e6b9957139529884b79c" => { - "7837bd27d828f25e2553c20bd3c1bc791e74153d714d8698ea73e2274a285e9d" - } - "00000495b214d71655cc24f56bf9aab7d2ab286857e6f9890f1ae639c357b69e" => { - "9eebc821850b559661dc12d2ad7956bcf84c48855157d69320cebed2a7af7081" - } - "0000029d66a078af9d234a430f0cf8580ee0aac264fc91e25b6e379836f64aa2" => { - "095dc5603b17a20dcf9098bf78bc823ed978889a48e5419421ebf96bd1a72e14" - } - "00000319ef4c483b432a52e103a5fbaf72cb2cb03238793982455386f223b5f4" => { - "e127647a7116620ac6b5c9860c3db07878c907a5455465eb1e7459ae0d44f535" - } - "000000a5cd94be2be2764cb5e3eebb1c4aa24b0bab289ba4bdf032cb5c4511a4" => { - "91d3e18a32ff9cd35e03f9fde5c23acae3a49dca5ba53315621b29d6518fa586" - } - "000003a4acaf2de030463272ce372a6d38973bc4d3ec9abaecd88fb242095c6b" => { - "dd26bba770ca425e65f1d246afcc66b13acb67f255a0595d4345d1b567fd82b6" - } - "000000b13d3a5e352c02e26fbbc0c5a19c630ffaba54177c3074b08311c334a5" => { - "e1b0ff1824d3492cf1b57ebb37122bb0fa0291f2da58884326cf4556c594d43d" - } - "00000306d57c64e4ea982061c855b4ec7830836e9779d45460d96b7bbeb58ee9" => { - "aea894630ab1cc0e67341cae8254d4c94ab0673542b6db168a88117e6b80eabf" - } - "0000046a30db2347c925c399ab3d08e95f134545a1b4f559c970db585b7a2a2b" => { - "62e912763dfe8494d354d1422997eda857e8a87d737af9258926a5300d2e2cb8" - } - "00000002a9013220364222bb38dbfb6fa1a53177524d9e0de1d243b34ebfc136" => { - "36f3743971a12d0a47343a8e420ff0e7f8773c0427f15b59ddfcdb63edb41f9f" - } - "0000004c90e593866678aa4cba5211019e02e922ff7180fa3f152b20aeee589e" => { - "d0a6830114029bb5ee4fd98aac7f31dcc10b29a269a5207d433a4f9ef75acfd2" - } - "0000046d5e84be89842cd2f74a3d72f3299e63179409c7c14757b7d66ded1132" => { - "8d0b3e7526c05a488a316457869911ddbcbe076ea0725d0731acf221e942b03f" - } - "0000024082c1607e22f1300d5df14ae43a7b41ed747c0a8ee4b6bbcccab493d9" => { - "9e33d98eb38e719118539ca93a2b01bf960bab9912230ec389187115dff67a33" - } - "000006aa0077df5557c493d7eb81396e7ab10302a09d9fb2021d1eecc0077b08" => { - "a435355c1e467e499d84a961c476252ddf0b866b832ff4ce9076fb891e0c92a1" - } - "00000149b4e0da935b7aa97f720ef7e6d49e828880e20d7fcc368923176a8968" => { - "cf0a805bdeba1303ad9bf42102f8e1f6c115a808a30d17468fe491c07d35d598" - } - "000000b401b4b4a5174cec59765cbb23fe491ca4b7ae1521ddb32f3425860de2" => { - "fb0e7c8757438e1d743fdf9a9aecdd34e3b8b8b4926e0013b1e619f3281cf955" - } - "0000056f246e61d0ce87af62a18bde093a00f782b339bb5708fb75abc3c1d3db" => { - "b05cc74248717f3ca2b86af1c0adbaa136fc1531b6fa4556756457bfe65f25be" - } - "0000057c5bd82a630463ee1a6cc591c7b52b352c603d3d8909f6b4fc699fdd2b" => { - "fdb3c89356432dfec8c3f338c04beafb34a10a18ce9bae6bad242e869572083a" - } - "000006f2286327b6a2a1270f770609ff027d02180d69d2ad18b63566dfc0515a" => { - "b466f799d1bb83d68a84604e326b94ecd2e7c81f2c5e2484b81fe1c3af242811" - } - "000003611f378cd85a09df3bed09f29bb69923a73584ec70830ffdf4d9b25285" => { - "b82c41fdd20e60fd8d4d1d2a20f619c164abe9c79f6aa412183be6305bdb4c09" - } - "00000018c1d055316dd10aaba200a40e4b22bfaa2aa4fe946aad9c48dd265a7f" => { - "c4f40a3fb78b45c92e0c277088e11effaa5c82f3e090050c9b62fa118ec21f59" - } - "000005b7c527392bcfbdd75b06f0906fe85ec2ee8fe8c1fc08a4f7820e091f90" => { - "19074ed4bb1d8c8c48457a6fd35944e3ed82fe9fb41058ea4d933843a982ab66" - } - "00000483b14397ee07d6a6e0ce4caca153c46e24ff9793a472b80be780fde4af" => { - "edca803c70b7448a4a9bbf9a06ecec4f5a9355986bc4690980e3e38edc160a61" - } - "000001531ce19a3042757887098225c468a56fe159729d40d9a20e764875a0e2" => { - "77e1a542d4896155ac4eb4046ebcf8c7f5b4c8992b94cf539fba100c4702f730" - } - "0000002f47f9cce781cee4169fe7e1a3966fafbe0375f6844d32b1337a91b4a6" => { - "2946f59c0bc5b135a4dee08a182359edfe34ac7058e3b1200706aa3b40d91189" - } - "000004e5ea1774456c0c0225dd1bdd8ad0007f4552df456d5148243d6a38359f" => { - "665e1e3efc15062c731180cba3c9346590c22b1e025ba69e63d5738627d69d50" - } - "0000022ee8c41b97ed57f95887d5942bdef91728abc8e5aba6ee8fd3b74ab4e3" => { - "b6c3746b47cf2f623a33d9f9f45b9994cdf8a7bb56b90dfe4f8dc72ffaefc88a" - } - "0000034aceca60ff1c4136b3d3aba4a875d47b0cb481797b0dbeef9f1125485b" => { - "e009dc1821ef7c066424db510a4fa92ff09287008a791eafa2dd30eaae0b0fb0" - } - "00000798b049b80fc751a9d02ce80872dbe54b3798123e47a7726be03a24013f" => { - "23e2bee91da462aff5631ef2d38e61812db9f47e39d3dc9d41638bb9e26f82cc" - } - "000000f92ebd1f266b370a27cc8f3426f78153ab3fff492b2088eb92ea6a6243" => { - "4207aec3e7fef47b03c948b56a9aacebf50942a144a60dd1dbdd099fe0b6f7b5" - } - "000000d4bfaef03c58066d660a30950705376f55fc9430fda897f1c340c149b9" => { - "88c437101e0c5b74d3da9e602336b5ab5f718ad25e260f4929bfbebf63eb1de1" - } - "00000123d0cab60bc8bc0f7748d040090429a3570a55b77e11b032d90578fa95" => { - "386ad0c2a54da863b60ffc5a5aa39f15865d8d63c97d6f332486ea86d5070997" - } - "000003258e7acb7c9f8e2d5f8f802a6418dd819388bbc1463360ad9f9505034f" => { - "06205bb387002ecadd7008c111967944dd4c670c4660341089bc39113bbe2839" - } - "00000541b0635b6b9bbd8921d4a8fb12cb6633323cda8cac7a84c32dcc79cbdf" => { - "d5b027bc4d5b5e51a058fc1f9790e4305aaf34a90b02bf52f9ad6b1fc48684f4" - } - "00000605bee6c4084f4bc1b8e0a0b4565513085df4888fbabb1ff59402cdfe60" => { - "a837a841fd23b1239cc1192f918baa27f17b2c3590861fe1cbf1ed0e7df25e72" - } - "000000a42f0395faa6036ec8dbb6f40618d74fbc35b2c343bf03f0d5ab1f108b" => { - "f3e0fd4f5839ac5d7006f151ecb69e3f809f956aa17401dfdaf23b3e562edcfb" - } - "00000535556772e86ca1210083a4cb4db74454f4cef914fcc719cdd7d17d8c54" => { - "328d107fab30086071b55204e2c70a6578feaf25c58a9ce908a55c016d5085ac" - } - "000005e33e11c29db88a6a59520395c6d74ab06b168434171d51695d32d447e1" => { - "13040668ebf7d3002ca7a8d92c7e900ee30005cf5676fa4bbcbf615f3b9c5468" - } - "000005f2268271f37aad0fe7cfb9ce5069d4ea9178d999b3488942c0152dffcb" => { - "4abc6a4044d5fe0b8d78ce110be8b74d0e93ddaf13ac59327b783558943e85b3" - } - "00000470f83644a5c08132629c03807cc6682846e2aa5b39959d5f3cd12cf48f" => { - "36e2a661bfd3f2c714f014a17536faa773cda0b69e4c6184d8e3fc5bc4f4447c" - } - "000000e70d9b8d5d9b8a6af9b7daa957df3d36f30edf1ef5a59da62eb10e17ae" => { - "c26379382825a2b0e049e4879f8b58418903a3727996efb9cfa06753159ac7b0" - } - "0000065d0abb85677e6ab4af484d80f7e90a3cc01fc46c555e3ac8659644d844" => { - "271ef00edcb62830944bc4f8b12f5468d1cd03c6f0fd91c23a5c84fb6a54a84c" - } - "000001f6cd40684b33b496fc574facfd81790681ee36088387a364dccb48def3" => { - "48eb977cf38aa34fba9c7b3ef9eccf981f3dd2be79ded257713a069867400c55" - } - "0000049522e2a80117de535914d67c7e8904bfc0bbfdca4702d56939c06a8cd1" => { - "dc6aeb6eb686dbb6fe006ad0511f62f19ac6fdf1bfaf2d378ab05227db16c112" - } - "0000012e65c0ac8c90b83d42a532b4a7c3774c0cdedfdb74ba64d1637ca4a7fe" => { - "f4ca0168659be3483f4d76b7c6fc1c9b2fa0980e647b62edb4ea90bad0574401" - } - "0000007f70b2ea36d666379e731f7ecff79db6ec9838d39d24af693756608242" => { - "10c48ab606cf8d9df59a189d2f8854b11c0eb0d31133a72bc6a48b7ee9c387e8" - } - "00000098ef907dedce9eaf2132cf67545a0f746e6316c698f35bcefbc5ead111" => { - "214fdc442396bb4237f7f685321be9019c5af999e322bb2c65ce407c0541946a" - } - "00000672106963c28e4ae06d0e0491bdaf1aabd4ea3a0759a65261e231d6aa2c" => { - "1edc0d86c37dcdf052a906ea97e845e6fe5b44b60e10e56297186b53f89773fa" - } - "000000fa70d8d7cba9ebbf96c297e22cebd58ab8d7e1da8fe801606701237610" => { - "805000906a3d51ac46798c7f705e05677a9a9d1f4a7ffb8aaab534287427400b" - } - "000005b33952dfbb9e9c936503c1f474df369bb7807adf95909b37d316e9052d" => { - "915cf5e4625e7f7af51f736906f11516167dd181ef9043bd79790eac7f54a183" - } - "0000028acaa3b4fcc3eb0e9295a3a9a0b395ef464507a9af5bc51cd2b04b38e5" => { - "f14f86f7659787743da8ab9640e0032349a49cca51a55a2cb7f056db71ae2474" - } - "00000553a90aab22049b035f06cd4740d4c283c3b7daef5bfe8246b776e5d0a6" => { - "87c7b4250747991b0a426d29df0a0a5c24ad315fcd0dad30e92d89aa78658a7f" - } - "00000015443346b5aaaf59fb71694428399183a0da3d23a36ba62ef6f868d65b" => { - "a3fd7bfbd3fee3d24599b79286949ca533a5b8b8444c52b52ef8db84d412dbdf" - } - "00000524346a800cb8b841e79a429803f06daa25dda27c4e15529711dd026485" => { - "0b93ecff8e8cb7b9f6ee8b04f9847ff58dd5942c9febbb471f6b5cf8d90621eb" - } - "000001ade388c5280e9c0abc025d860f4b134d78f5f894910966ef58d79eb6c3" => { - "a72758cf7ccb75d0798bf0284bee2e2c09c9703c67a828425c70510275242be2" - } - "000004970192dd41d3afe3c809b8cb150c8210a6cd41360ecc504f8e765a14b5" => { - "ec3603f979e4567d5de6e6720ae213f5c61fd89b2eb3b35ab58dbde3d2975461" - } - "000002be5a953f7fed9e4be3361df036a07676fff669f3fae721c1cfdeaa12ba" => { - "854902335e3f9925a489da28b4e03ee6b13889323b86ac29199d27510470420a" - } - "000005ec3a5ed58b575c0dcea597b0bae984f9642cdbb745c2a4acf92b1228e8" => { - "0a6de1ebaf8d6f5939cff888a90c1c9e9719c505f5a065937f45db49d228de26" - } - "000004416dc20703d3aa5f017d7cfb96f1f030c06dafad3b0c45414e7b84847c" => { - "02893469abc44cf760eb93652a4d14bc9068aea36e6a257d2c22586f4b19cb43" - } - "000005cf0f4caba6b236341afb3e7f8beacb8018364136c198e6db485f131e14" => { - "f00ef2bac46bd56bb5fdc3a92401c5aeabd2ca5768fc160d5546a09ba6938b17" - } - "00000487243de854c402ef3026822e4b33cb23f3526275e931d00589697c7b11" => { - "11b5d83a01175ef00e457e2c88b5676cb771378edc196e769f8a3d908dc51db0" - } - "0000040fd0c77eb035c04daa054de7df0a330bdd767a2b9f40929fff4b631ca9" => { - "fd3c2105bf11754a8b61951ad9c1fe8620d9bc806fa88d7ef108af2faf57f415" - } - "00000212c4234717534cf9b4351dcde432eebeeac2231cd04d1a1f470710e72d" => { - "6ce77c3fcf9604c893f1308a90a2fb6cea90be8c74e595dc71cee56edf27f914" - } - "0000037372e681ae0013faa6f509043940f39345f6fc2c9d69bfb26a92d4d3a7" => { - "29cbb16ac8bbd849a49c36ea89cfb6e301d3ecea23b6ce4eed02dd0c8f44c6fb" - } - "0000000c03ffa98e5ba1c1fe1441c4812a91746aefda9b6d150ed08242d4821b" => { - "77e5d6f84c44c054830621c67d5401f9d678d88a783b6106d8eb4578aa58020a" - } - "000000602033c5a0c32421f3adcb3de7189931a633e98047b38ba6717f242740" => { - "37d6724e05f33571e78f96a97efa65f3b5006e9e0302e19f6cf6da87291c5b83" - } - "00000362c6b66c7054dbdbab81c79e263472b1cea6b0a3e455716fcf328f8e58" => { - "fea27119c993c72526432dcabd8994fe41b3b0f2f0132621310ae3cb2ca0631d" - } - "0000002fbb3e6eb53ec3174f2071db442dac5ffe82794cc5b0498fbac080f8da" => { - "69cacb471ae2813cf45987cabf36a59d65e845b7b041dd488a9b5ba6ef5ff03b" - } - "000002177c627bdcaf2e95791166c9641bf02fdd5cc1d4a85ca20aa25acdd107" => { - "9e126d96a5fe6d73ade44c5d3d78184462bee4c88e9818c8dd8e924d4bc16195" - } - "000001019891cb0eb860698cca78b8a17fae795c0798c437a0989896bb02c353" => { - "bf593a2283bf6da71cb8226341dca164cf0487433403821bcc7ae730b916eb94" - } - "0000013f4ea9f6aebc88a59d1fa8631f46eff2e18e54b4ae9d284d1e640d7fea" => { - "2edb60ad3b3cd55c337c5581cbe7b2beb9fb32f3bde5ba01f5f318ee835a4089" - } - "000006c99c58dbec27e6435cd4a1552007c55afec8af797c1435196a3c622aee" => { - "92c4d264369a41a886a185108f3ef02463fccc088b2d0a993dd0ef13366c7d5a" - } - "000007e05572b439fc0a21ce64981b82669d34d73144344b80e2fccbaae85687" => { - "10bd9b03ea231098959ad01bcf7e39bfb30e62a8edc8311f87be49d3f589b78d" - } - "000001be22b6a741824b01cca475101002e0f1457f024d439ea5ee0a1aada27f" => { - "4c86015f0859abc0ee367c66c4de0e0a6b3a5fef87af890770ebd95f0aebeba0" - } - "0000001072bcf507e848486e5ff320c1522f887b158ba6e4303b3ceddd4762a8" => { - "c367cd0b8812bac0076cc6d09751ffba418f69dd6e77c18dfda883ec8faed411" - } - "0000035731fd748b408aed499c9c4b45628e9338270a96fabcfe763f7b6e54ed" => { - "e0f1cfb22cb14e932dce207416f5ecdf3ec99d0933cde16c90af24939606ceed" - } - "000006501d187ea8b178cd4b6d0aff146dd478609487bd889a693ebe76d27b09" => { - "9650825a23523c0d5db69c15193d2c22514a447024a1010a8d26e8fc8fcb1216" - } - "000000b48edc5982b7986c89ddb7a3046fce5418a3bff0c40b9c208b768dcc90" => { - "e3abd322716b7211f7c730d14dc9be77aa76b56f9ddb1a5b18fc57b202040ca7" - } - "0000040798a6b4632f2a9dd0f2a07523affae1bb4ab547598bb972d76fa19c8c" => { - "3f23f56d6beeae1c6647f0c1dc7ac0522611e247c2ea3afdb31954b07d69deee" - } - "000003a5ef3d13b8f452e41fe4a45156d512c295d094e6ea352543b2280929b4" => { - "da11d7d1db998c2685d44092943499cede70f4d5c1bdd546326385181f36a5d0" - } - "0000068ad662037d30811d86dac5b50ac0ee104afa0775b7b5be6e89ace77929" => { - "8b4c7644283cb143585f9ddfca36598bd2b0a7dbd538c879b0091d0ecad9335b" - } - "000001fcac0d415ee0fec9b164a5c0d3baf7fcc01cefd8f55ae1cbaf4edc557a" => { - "d801948eaf709e97eaf071ecc723c675483e674abfe68963d61350bb893dfdd3" - } - "00000439528d740502cfb49d869ea9e24d2a13ec9b4dbec666923aed9a74d52f" => { - "d26a3242d276db7633aaa7d9b90927773364cde8b9d066003d42cea6211767f7" - } - "000004404897d33d867d3804df92ceffaccddf2fbde381800461ea3b88d89d30" => { - "f0aea4033ad17837fd709be4ff01b5714b5d5faff1d684aa7ba57fad062aacd2" - } - "000009b14dec4bc7ba636de6ae25db8bde066f132b2fa96d9c4fa29ed1b6b82f" => { - "89f31946adca397478aac8c8fca16325036a1b58697c8235611ce7a3d7ea543b" - } - "000005c6ec5a786816157f38b3e721529f6bac1d4a9e20bbc6119d1f44b38ddf" => { - "ea2c7197551e3fcc6379fb0f828b251827005cdf09421c9b533eb6633c13c447" - } - "0000057e45e1a7176be2b0489956d83a1044e5e842097e353cd5ebae7f1a51d3" => { - "9ee5aace19c67bc9149860b96166f62b056b99cd8ad4649ff68d749122be62fe" - } - "0000022e51809198d0ecf3fc49eb4706f9cd09b6ade82c9b87923cda2e5301fa" => { - "d066614dd7466b66dc840baf48d3512f3b5c3d90a762d07cc83d16640553be1c" - } - "00000854e9d76d2507226e86af114dc3572206011d850843a40c1d3fea0860fc" => { - "0838d17bf44b280dae9beb09c8a21c0a7f362d11cd5781f890d24077fc47054c" - } - - "000008ca1832a4baf228eb1553c03d3a2c8e02399550dd6ea8d65cec3ef23d2e" => { - "e0028eb9648db56b1ac77cf090b99048a8007e2bb64b68f092c03c7f56a662c7" - } - _ => "0000000000000000000000000000000000000000000000000000000000000000", - }; - UInt256::from_hex(root).unwrap().reverse().0.as_ptr() -} - -#[test] -fn test_jack_daniels() { - let chain = ChainType::DevNet(DevnetType::JackDaniels); - let processor = unsafe { - register_processor( - get_merkle_root_by_hash_jack_daniels, - block_height_lookup_jack_daniels, - get_block_hash_by_height_default, - get_llmq_snapshot_by_block_hash_default, - save_llmq_snapshot_in_cache, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_by_block_hash_from_cache, - masternode_list_save_in_cache, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - let cache = unsafe { &mut *processor_create_cache() }; - let context = &mut (FFIContext { - chain, - is_dip_0024: true, - cache, - blocks: vec![] - }) as *mut _ as *mut std::ffi::c_void; - - let qrinfo_bytes = message_from_file("QRINFO_1_107966.dat"); - - let result = process_qrinfo_from_message_internal( - qrinfo_bytes.as_ptr(), - qrinfo_bytes.len(), - chain, - false, - true, - 70221, - processor, - cache, - context, - ); - - println!("Result: {:#?}", &result); -} - -unsafe extern "C" fn block_height_lookup_jack_daniels( - block_hash: *mut [u8; 32], - _context: *const std::ffi::c_void, -) -> u32 { - let h = UInt256(*(block_hash)); - let orig_s = h.clone().to_string(); - match orig_s.as_str() { - "55cea87c22849891b4e8819a8504605cc54314d03dacb97e6fa2aeb3d8000000" => 74221, // getBlockHeightByHash - "79ee40288949fd61132c025761d4f065e161d60a88aab4c03e613ca8718d1d26" => 1, // getBlockHeightByHash - "132bfe2ab16f6fab18e1c4d64deb8a748b12c4bd92fdc660e222ab2a21050000" => 74160, // getBlockHeightByHash - "3ad221f88a172adb8aca647f3a059b008d55fb0dd07f918412620178d2030000" => 74136, // getBlockHeightByHash - "8d80307b7fd5728799e62e1d461948331dd4b543a330deaf2d98576eb6050000" => 74184, // getBlockHeightByHash - "97bceb2e855f80bf4f8617ce9cb9206682171a3e1b92d2160ad799d2cd040000" => 74208, // getBlockHeightByHash - "34336e375eb5f6eefb147479d4c1a4823ca47282bab8a5eaf85aa3b3e4010000" => 74209, // getBlockHeightByHash - "5c1d03d5dfecf9d5b467eb79d08af9eb4529d69f5590bc7b3c66779271030000" => 107512, - "45c100e3aa8c91998d7ba0fd9655f95ea93f892a6050679516b9f03f83010000" => 107560, - "2906e8b02c3aad1aa9176c87b06d5c19d94ab6ad15777a88017d70a4e8010000" => 107608, - "d7b56611622ebac1f98d11f5b567076459733da645b973581dc2342c95060000" => 107656, - "e8ae95b476453ef1514c590941616582f527bbde2464974239b32184c2010000" => 107704, - "8782b2192054460b20585848fc53f9a875e232bd4a4d7f7bfda4b9563a010000" => 107966, - - _ => u32::MAX, - } -} - -unsafe extern "C" fn get_merkle_root_by_hash_jack_daniels( - block_hash: *mut [u8; 32], - _context: *const std::ffi::c_void, -) -> *mut u8 { - // 74221: 55cea87c22849891b4e8819a8504605cc54314d03dacb97e6fa2aeb3d8000000 -> 601bb47971ab483aec1ee77074a785036edbb7ce543d868881aa4e04a39490c0 - let h = UInt256(*(block_hash)); - let merkle_root = - UInt256::from_hex("601bb47971ab483aec1ee77074a785036edbb7ce543d868881aa4e04a39490c0") - .unwrap().reverse(); - println!( - "get_merkle_root_by_hash_jack_daniels: {}: {}", - h, merkle_root - ); - boxed(merkle_root.0) as *mut _ -} diff --git a/dash-spv-masternode-processor/src/tests/listdiff/llmq_rotation_testnet.rs b/dash-spv-masternode-processor/src/tests/listdiff/llmq_rotation_testnet.rs deleted file mode 100644 index 532a61a3..00000000 --- a/dash-spv-masternode-processor/src/tests/listdiff/llmq_rotation_testnet.rs +++ /dev/null @@ -1,322 +0,0 @@ -use std::collections::BTreeMap; -use crate::bindings::common::{processor_create_cache, register_processor}; -use crate::chain::common::ChainType; -use crate::crypto::byte_util::Reversable; -use crate::crypto::UInt256; -use crate::hashes::hex::FromHex; -use crate::lib_tests::tests::{add_insight_lookup_default, FFIContext, get_block_hash_by_height_from_context, get_block_height_by_hash_from_context, get_cl_signature_by_block_hash_from_context, get_llmq_snapshot_by_block_hash_from_context, get_masternode_list_by_block_hash_from_cache, get_merkle_root_by_hash_default, hash_destroy_default, masternode_list_destroy_default, masternode_list_save_in_cache, message_from_file, process_qrinfo_from_message_internal, register_logger, save_cl_signature_in_cache, save_llmq_snapshot_in_cache, should_process_diff_with_range_default, snapshot_destroy_default}; -use crate::models; -use crate::tests::block_store::init_mainnet_store; -use crate::tests::json_from_core_snapshot::{block_hash_to_block_hash, ListDiff, masternode_list_from_genesis_diff, QRInfo, snapshot_to_snapshot}; - -#[test] -fn testnet_quorum_quarters() { - register_logger(); - let block_height_8792 = 1738792; - let block_height_8840 = 1738840; - let block_height_8888 = 1738888; - - let qrinfo_8792: QRInfo = serde_json::from_slice(&message_from_file("1738792.txt")).unwrap(); - let qrinfo_8840: QRInfo = serde_json::from_slice(&message_from_file("1738840.txt")).unwrap(); - let qrinfo_8888: QRInfo = serde_json::from_slice(&message_from_file("1738888.txt")).unwrap(); - let qrinfo_8936: QRInfo = serde_json::from_slice(&message_from_file("1738936.txt")).unwrap(); - - let diff_8792: ListDiff = serde_json::from_slice(&message_from_file("1738792_diff.txt")).unwrap(); - let diff_8840: ListDiff = serde_json::from_slice(&message_from_file("1738840_diff.txt")).unwrap(); - let diff_8888: ListDiff = serde_json::from_slice(&message_from_file("1738888_diff.txt")).unwrap(); - - let list_diff_8792 = masternode_list_from_genesis_diff(diff_8792, |_| block_height_8792, false); - let list_diff_8840 = masternode_list_from_genesis_diff(diff_8840, |_| block_height_8840, false); - let list_diff_8888 = masternode_list_from_genesis_diff(diff_8888, |_| block_height_8888, false); - - let block_hash_8792 = list_diff_8792.block_hash; - let block_hash_8840 = list_diff_8840.block_hash; - let block_hash_8888 = list_diff_8888.block_hash; - let added_quorums_8792 = list_diff_8792.added_quorums.iter() - .fold(BTreeMap::new(), |mut acc, entry| { - acc.entry(entry.llmq_type) - .or_insert_with(BTreeMap::new) - .insert(entry.llmq_hash, entry.clone()); - acc - }); - let added_quorums_8840 = list_diff_8840.added_quorums.iter() - .fold(BTreeMap::new(), |mut acc, entry| { - acc.entry(entry.llmq_type) - .or_insert_with(BTreeMap::new) - .insert(entry.llmq_hash, entry.clone()); - acc - }); - let added_quorums_8888 = list_diff_8888.added_quorums.iter() - .fold(BTreeMap::new(), |mut acc, entry| { - acc.entry(entry.llmq_type) - .or_insert_with(BTreeMap::new) - .insert(entry.llmq_hash, entry.clone()); - acc - }); - let masternode_list_8792 = models::MasternodeList::new(list_diff_8792.added_or_modified_masternodes, added_quorums_8792, block_hash_8792, block_height_8792, true); - let masternode_list_8840 = models::MasternodeList::new(list_diff_8840.added_or_modified_masternodes, added_quorums_8840, block_hash_8840, block_height_8840, true); - let masternode_list_8888 = models::MasternodeList::new(list_diff_8888.added_or_modified_masternodes, added_quorums_8888, block_hash_8888, block_height_8888, true); - - let processor = unsafe { - &mut *register_processor( - get_merkle_root_by_hash_default, - get_block_height_by_hash_from_context, - get_block_hash_by_height_from_context, - get_llmq_snapshot_by_block_hash_from_context, - save_llmq_snapshot_in_cache, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_by_block_hash_from_cache, - masternode_list_save_in_cache, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - let chain = ChainType::MainNet; - let cache = unsafe { &mut *processor_create_cache() }; - - let context = &mut (FFIContext { chain, cache, is_dip_0024: true, blocks: init_mainnet_store() }); - - let bytes = message_from_file("QRINFO_0_1739226.dat"); - let old_bytes = message_from_file("QRINFO_0_1740902.dat"); - let old_bytes2 = message_from_file("QRINFO_0_1740910.dat"); - processor.opaque_context = context as *mut _ as *mut std::ffi::c_void; - processor.use_insight_as_backup = true; - processor.chain_type = chain; - - processor.save_masternode_list(block_hash_8792, &masternode_list_8792); - processor.save_masternode_list(block_hash_8840, &masternode_list_8840); - processor.save_masternode_list(block_hash_8888, &masternode_list_8888); - - - let snapshot_8792_h_c = snapshot_to_snapshot(qrinfo_8792.quorum_snapshot_at_hminus_c); - let snapshot_8792_h_2c = snapshot_to_snapshot(qrinfo_8792.quorum_snapshot_at_hminus2c); - let snapshot_8792_h_3c = snapshot_to_snapshot(qrinfo_8792.quorum_snapshot_at_hminus3c); - let snapshot_8840_h_c = snapshot_to_snapshot(qrinfo_8840.quorum_snapshot_at_hminus_c); - let snapshot_8840_h_2c = snapshot_to_snapshot(qrinfo_8840.quorum_snapshot_at_hminus2c); - let snapshot_8840_h_3c = snapshot_to_snapshot(qrinfo_8840.quorum_snapshot_at_hminus3c); - let snapshot_8888_h_c = snapshot_to_snapshot(qrinfo_8888.quorum_snapshot_at_hminus_c); - let snapshot_8888_h_2c = snapshot_to_snapshot(qrinfo_8888.quorum_snapshot_at_hminus2c); - let snapshot_8888_h_3c = snapshot_to_snapshot(qrinfo_8888.quorum_snapshot_at_hminus3c); - let snapshot_8936_h_c = snapshot_to_snapshot(qrinfo_8936.quorum_snapshot_at_hminus_c); - let snapshot_8936_h_2c = snapshot_to_snapshot(qrinfo_8936.quorum_snapshot_at_hminus2c); - let snapshot_8936_h_3c = snapshot_to_snapshot(qrinfo_8936.quorum_snapshot_at_hminus3c); - - let block_hash_8792_h_c = block_hash_to_block_hash(qrinfo_8792.mn_list_diff_at_hminus_c.block_hash).reversed(); - let block_hash_8792_h_2c = block_hash_to_block_hash(qrinfo_8792.mn_list_diff_at_hminus2c.block_hash).reversed(); - let block_hash_8792_h_3c = block_hash_to_block_hash(qrinfo_8792.mn_list_diff_at_hminus3c.block_hash).reversed(); - let block_hash_8840_h_c = block_hash_to_block_hash(qrinfo_8840.mn_list_diff_at_hminus_c.block_hash).reversed(); - let block_hash_8840_h_2c = block_hash_to_block_hash(qrinfo_8840.mn_list_diff_at_hminus2c.block_hash).reversed(); - let block_hash_8840_h_3c = block_hash_to_block_hash(qrinfo_8840.mn_list_diff_at_hminus3c.block_hash).reversed(); - let block_hash_8888_h_c = block_hash_to_block_hash(qrinfo_8888.mn_list_diff_at_hminus_c.block_hash).reversed(); - let block_hash_8888_h_2c = block_hash_to_block_hash(qrinfo_8888.mn_list_diff_at_hminus2c.block_hash).reversed(); - let block_hash_8888_h_3c = block_hash_to_block_hash(qrinfo_8888.mn_list_diff_at_hminus3c.block_hash).reversed(); - let block_hash_8936_h_c = block_hash_to_block_hash(qrinfo_8936.mn_list_diff_at_hminus_c.block_hash).reversed(); - let block_hash_8936_h_2c = block_hash_to_block_hash(qrinfo_8936.mn_list_diff_at_hminus2c.block_hash).reversed(); - let block_hash_8936_h_3c = block_hash_to_block_hash(qrinfo_8936.mn_list_diff_at_hminus3c.block_hash).reversed(); - - - processor.save_snapshot(block_hash_8792_h_c, snapshot_8792_h_c); - processor.save_snapshot(block_hash_8792_h_2c, snapshot_8792_h_2c); - processor.save_snapshot(block_hash_8792_h_3c, snapshot_8792_h_3c); - processor.save_snapshot(block_hash_8840_h_c, snapshot_8840_h_c); - processor.save_snapshot(block_hash_8840_h_2c, snapshot_8840_h_2c); - processor.save_snapshot(block_hash_8840_h_3c, snapshot_8840_h_3c); - processor.save_snapshot(block_hash_8888_h_c, snapshot_8888_h_c); - processor.save_snapshot(block_hash_8888_h_2c, snapshot_8888_h_2c); - processor.save_snapshot(block_hash_8888_h_3c, snapshot_8888_h_3c); - processor.save_snapshot(block_hash_8936_h_c, snapshot_8936_h_c); - processor.save_snapshot(block_hash_8936_h_2c, snapshot_8936_h_2c); - processor.save_snapshot(block_hash_8936_h_3c, snapshot_8936_h_3c); - - let old_result = process_qrinfo_from_message_internal(old_bytes.as_ptr(), old_bytes.len(), chain, false, true, 70221, processor, context.cache, context as *mut _ as *mut std::ffi::c_void); - let old_result2 = process_qrinfo_from_message_internal(old_bytes2.as_ptr(), old_bytes2.len(), chain, false, true, 70221, processor, context.cache, context as *mut _ as *mut std::ffi::c_void); - // println!("old_result tip: {}", old_result.result_at_tip.block_hash.clone().reversed()); // 1740902 - // println!("old_result h: {}", old_result.result_at_h.block_hash.clone().reversed()); // 1738648 - // println!("old_result h-c: {}", old_result.result_at_h_c.block_hash.clone().reversed()); // 1738360 - // println!("old_result h-2c: {}", old_result.result_at_h_2c.block_hash.clone().reversed()); // 1738072 - // println!("old_result h-3c: {}", old_result.result_at_h_3c.block_hash.clone().reversed()); // 1737784 - // println!("old_result2 tip: {}", old_result2.result_at_tip.block_hash.clone().reversed()); // 1740902 - // println!("old_result2 h: {}", old_result2.result_at_h.block_hash.clone().reversed()); // 1738648 - // println!("old_result2 h-c: {}", old_result2.result_at_h_c.block_hash.clone().reversed()); // 1738360 - // println!("old_result2 h-2c: {}", old_result2.result_at_h_2c.block_hash.clone().reversed()); // 1738072 - // println!("old_result2 h-3c: {}", old_result2.result_at_h_3c.block_hash.clone().reversed()); // 1737784 - // println!("old_result h-4c: {}", old_result.result_at_h_4c.block_hash); - - let result = process_qrinfo_from_message_internal( - bytes.as_ptr(), - bytes.len(), - chain, - false, - true, - 70221, - processor, - context.cache, - context as *mut _ as *mut std::ffi::c_void - ); - let block_height = 1738944; - let mut last_quorum = result.last_quorum_per_index.first().cloned().unwrap(); - let nodes = processor.get_rotated_masternodes_for_quorum( - last_quorum.llmq_type, - last_quorum.llmq_hash, - block_height, - &mut context.cache.llmq_members, - &mut context.cache.llmq_indexed_members, - &context.cache.mn_lists, - &context.cache.llmq_snapshots, - &mut context.cache.cl_signatures, - &mut context.cache.needed_masternode_lists, - false - ); - let node_hashes = nodes.iter().map(|m| m.provider_registration_transaction_hash.clone()).collect::>(); - let needed_hashes = [ - UInt256::from_hex("d2426992844e311149b2962f4ea991656ea5d1b36541e314e251915a6ffa1316").unwrap().reverse(), - UInt256::from_hex("82dcf337825f4eb6726ffe56ab981034c49785c1f92da274e51fe925380265a6").unwrap().reverse(), - UInt256::from_hex("30c14c1d75694404dbc96d44d1c63f28bf685d27e44ef753883c5eb0742c5805").unwrap().reverse(), - UInt256::from_hex("631a5e99e59bab2bf06e4ec9874b3c3ced59187dc724c689ffa0fe99f2d3f210").unwrap().reverse(), - UInt256::from_hex("113673823cf38eb56f30795d7f830b2d82b70a35b96812ad79d0889465b69df3").unwrap().reverse(), - UInt256::from_hex("0e01a796d779a8494be44311d6daf07fdae8642b45a9b866024cd97d8dfd3545").unwrap().reverse(), - UInt256::from_hex("feb146a52985cbf69f0a46b3a56f5f505538440bd42e993a0685a11fac1fdda5").unwrap().reverse(), - UInt256::from_hex("48d665ade991114900349635c788775204057220728212e2b6b63e3545f67007").unwrap().reverse(), - UInt256::from_hex("adcc454391d9f53e6fa523e047db5f335e38d9ead70dc8e4e648118c285d1d77").unwrap().reverse(), - UInt256::from_hex("aadd2eac24d6cc9a0b439d3c9d5483b0ed64ebda21786760bb375efacd6e2a67").unwrap().reverse(), - UInt256::from_hex("a90df0c30b2002a85cef6b695b986a3815c7dc82027c6896b7747258675a76da").unwrap().reverse(), - UInt256::from_hex("e13fbad0ab0bca68cbcd4d68127de06037b4007c5acbe8550edcd60b7d4503e8").unwrap().reverse(), - UInt256::from_hex("200ccffb2ef1da266efda63b35bc80bc8a547f29af3b8108f81ab222a1ceac35").unwrap().reverse(), - UInt256::from_hex("21173e00737bac467d09effb15959d0459b853160805057a3975436d3e206591").unwrap().reverse(), - UInt256::from_hex("321a1300b3ec63b3082d1626c7377d3c9e4e332eadefe12073f5e17b5099a49e").unwrap().reverse(), - UInt256::from_hex("c1666e28121c0e2375e785edcbd2e84e1136f9fa0e415a9310d203aaa06e2153").unwrap().reverse(), - UInt256::from_hex("c75b5aaf2a9c127b3f4199d4700abc1eab9fb8ebdf31b4d296951ce395bd52e0").unwrap().reverse(), - UInt256::from_hex("7878b048a1411dc9e7cc71b4d3aae6f4bdb93f299f186fee4cc7a4833a7114a7").unwrap().reverse(), - UInt256::from_hex("2899b3e2bb291e84943ab9436f93e0708cbb59860f9c05b41ffac4678dd714a5").unwrap().reverse(), - UInt256::from_hex("320cac56da899ad7b5133d7d0aa54d0f12d2a7fddea9c97c6749e2a7efdf0b98").unwrap().reverse(), - UInt256::from_hex("93bd23b7357a62c5ab2cc306054bf0b1fa6f52265fbbef23f600298d8daebd1a").unwrap().reverse(), - UInt256::from_hex("f9d8fbb02e8f909b7922cc34b8259ea6b73dab88738c2af2e02e1ac929ccdd5e").unwrap().reverse(), - UInt256::from_hex("b86f9ae4178a3425abb8053a40e1eb138b2a68b466ba2b3bd04167060cd5c1b5").unwrap().reverse(), - UInt256::from_hex("d2f9d05f8983ce1d645487efbc4c3b2c31b8ec914b1e9085e70202001e11bcd4").unwrap().reverse(), - UInt256::from_hex("c98ab7576c4b83d94e668f0e3910aa514a6ff0171684f9fc8e30143664d20999").unwrap().reverse(), - UInt256::from_hex("70f8c30d741529a6ffd4e080993523709b00ad45e6026a19097e13f68d687d55").unwrap().reverse(), - UInt256::from_hex("4f45b42e8b170dac1cfe288815423020135e105f4c98e1b2f09db0cf059d1ac6").unwrap().reverse(), - UInt256::from_hex("a8ac86f944f9477ba1642bc3f45dba51bb020af43afc1c0ca2f1f1910be209be").unwrap().reverse(), - UInt256::from_hex("fdb28cd79093c2a6be18f7b168f50008125a2416984ac4126dab6c8646657dd6").unwrap().reverse(), - UInt256::from_hex("8e483b9308737fe836d71967ddb634559a5c63c8cb8d495275952e0f6cb5a717").unwrap().reverse(), - UInt256::from_hex("9389d805cb14e9cb6af5afa7c75136507a4a42e1e5bbffb6703dc57ed10de429").unwrap().reverse(), - UInt256::from_hex("92a22ba783087016770ff1acae996253a8a3803566aee90d914c3adf9f611116").unwrap().reverse(), - UInt256::from_hex("390e6b731013c3da296b61a7365b9954c5a403c95f997e89bf979469f9c1d704").unwrap().reverse(), - UInt256::from_hex("867fc5a33fdc09b811cc4a7a307a3ca082a3adc3bc8511ed67e81cc6884ba68d").unwrap().reverse(), - UInt256::from_hex("784a0529d150a44ee26ec8f08ab1eaab0d0651ed2ee1f8e611a4304626448e79").unwrap().reverse(), - UInt256::from_hex("4016510e2ef1b82fc571781b5a0cd8afa268d0c21b5d352f8f8929c542d1aef3").unwrap().reverse(), - UInt256::from_hex("776cbacfaeafd9880d791357c00c5085ddc8d00af507a35dad37c3d0f7a24256").unwrap().reverse(), - UInt256::from_hex("5480f489c2e7d4e9992349a0eb85b4a81796979c66a5f2c67f5df05866e01df1").unwrap().reverse(), - UInt256::from_hex("5ec696060fb6d43e5065e858a590b98af558c1e0d48d1a08b634189131b17ee7").unwrap().reverse(), - UInt256::from_hex("17e5abab4d2bc5b03d14163d57bd0b3014bd7ec56a1051b8bded4373b0d08ba7").unwrap().reverse(), - UInt256::from_hex("754285ad30ce2aa5f9d799770a2e06afff77613e09c240d3019d1f266e2f1167").unwrap().reverse(), - UInt256::from_hex("68b9a31205e3c190346a162f29804feeee0fe17caa3bda09c1d97e4913967b56").unwrap().reverse(), - UInt256::from_hex("b0219f34cc8fccaf88796889a8cd034eac82415cd7f7f3baae950c841857f85c").unwrap().reverse(), - UInt256::from_hex("e8f49c2f481b18d8b3ffdfe36dd7cce85bbd0332cd723b7b329d2192cef1fb61").unwrap().reverse(), - UInt256::from_hex("7fd0a504278a1e6a0cc1188c98178c279667450502a87e8e841dfaab7896657b").unwrap().reverse(), - UInt256::from_hex("168162f349bd2961fab43cd0a19a7e6a34c7a18d5dbe4805c06a4fcbcb138e78").unwrap().reverse(), - UInt256::from_hex("758d75feab2349545b83db14acb101419bd8874118a493587bce5ed344ad959d").unwrap().reverse(), - UInt256::from_hex("db6fbedc75d6acd52b505d9f553716255c8e25b434f8df211a190bc17dd7e4ff").unwrap().reverse(), - UInt256::from_hex("d74519d65b78ab5c34c8c8bf8951e967a35ebc17b2eaea3f5d1fbe719583d5fd").unwrap().reverse(), - UInt256::from_hex("56d86d05eb95672667a7f7a5fa8908617e4f7624a1d2897e49469e2a591b65d3").unwrap().reverse(), - UInt256::from_hex("d3ddea9366c7deb606d1ba58e2911a3958d81f887dc8c1af69e6f90a0b0ec8df").unwrap().reverse(), - UInt256::from_hex("f0cf643f2098605eb570f22a72d6fb93735563e35c5b9bb93885236d5388e0f6").unwrap().reverse(), - UInt256::from_hex("af6ab1210c32d3e0c8c1425402986c0563c926173e71a85410b20e04d9728579").unwrap().reverse(), - UInt256::from_hex("5b9bb413ec3d6dd8c7675471c28be5a12196ca73eec70a84f96648987f28220e").unwrap().reverse(), - UInt256::from_hex("4030316b3a1aaa4aa174e94e7c82fd847e116a50cc280bf37a44a94215ebd747").unwrap().reverse(), - UInt256::from_hex("65c11e751596f3e2f8829b41bce171d872d3a0e9bd6ea8b65757f61b47b6d50d").unwrap().reverse(), - UInt256::from_hex("35584dc1f4cc507012648a42b30c9aaaee19d028abd16ee31c87a04bf4a91470").unwrap().reverse(), - UInt256::from_hex("d802702597a6c8a2d8e6011f5ff365595db3893d5531c65ecd5be63c8dfc13c9").unwrap().reverse(), - UInt256::from_hex("d66ba16f114b921b3e48c7a0681ba465a68f09029a130999859cb0abb48a0717").unwrap().reverse(), - UInt256::from_hex("fac4265c8c8213b069b75bb3c565309accb214631bff9cfb41a4ec1b6feda7fc").unwrap().reverse() - ]; - // println!("##############"); - // println!("{:#?}", node_hashes); - // println!("##############"); - // println!("{:#?}", needed_hashes); - // println!("##############"); - // assert_eq!(node_hashes, needed_hashes, "Quorum Combo must be equal"); - - let new_quarter_members = [ - UInt256::from_hex("168162f349bd2961fab43cd0a19a7e6a34c7a18d5dbe4805c06a4fcbcb138e78").unwrap().reverse(), - UInt256::from_hex("758d75feab2349545b83db14acb101419bd8874118a493587bce5ed344ad959d").unwrap().reverse(), - UInt256::from_hex("db6fbedc75d6acd52b505d9f553716255c8e25b434f8df211a190bc17dd7e4ff").unwrap().reverse(), - UInt256::from_hex("d74519d65b78ab5c34c8c8bf8951e967a35ebc17b2eaea3f5d1fbe719583d5fd").unwrap().reverse(), - UInt256::from_hex("56d86d05eb95672667a7f7a5fa8908617e4f7624a1d2897e49469e2a591b65d3").unwrap().reverse(), - UInt256::from_hex("d3ddea9366c7deb606d1ba58e2911a3958d81f887dc8c1af69e6f90a0b0ec8df").unwrap().reverse(), - UInt256::from_hex("f0cf643f2098605eb570f22a72d6fb93735563e35c5b9bb93885236d5388e0f6").unwrap().reverse(), - UInt256::from_hex("af6ab1210c32d3e0c8c1425402986c0563c926173e71a85410b20e04d9728579").unwrap().reverse(), - UInt256::from_hex("5b9bb413ec3d6dd8c7675471c28be5a12196ca73eec70a84f96648987f28220e").unwrap().reverse(), - UInt256::from_hex("4030316b3a1aaa4aa174e94e7c82fd847e116a50cc280bf37a44a94215ebd747").unwrap().reverse(), - UInt256::from_hex("65c11e751596f3e2f8829b41bce171d872d3a0e9bd6ea8b65757f61b47b6d50d").unwrap().reverse(), - UInt256::from_hex("35584dc1f4cc507012648a42b30c9aaaee19d028abd16ee31c87a04bf4a91470").unwrap().reverse(), - UInt256::from_hex("d802702597a6c8a2d8e6011f5ff365595db3893d5531c65ecd5be63c8dfc13c9").unwrap().reverse(), - UInt256::from_hex("d66ba16f114b921b3e48c7a0681ba465a68f09029a130999859cb0abb48a0717").unwrap().reverse(), - UInt256::from_hex("fac4265c8c8213b069b75bb3c565309accb214631bff9cfb41a4ec1b6feda7fc").unwrap().reverse() - ]; - //assert_eq!(node_hashes, new_quarter_members, "Quorum Combo must be equal"); - let quarter_h_c = [ - UInt256::from_hex("9389d805cb14e9cb6af5afa7c75136507a4a42e1e5bbffb6703dc57ed10de429").unwrap().reverse(), - UInt256::from_hex("92a22ba783087016770ff1acae996253a8a3803566aee90d914c3adf9f611116").unwrap().reverse(), - UInt256::from_hex("390e6b731013c3da296b61a7365b9954c5a403c95f997e89bf979469f9c1d704").unwrap().reverse(), - UInt256::from_hex("867fc5a33fdc09b811cc4a7a307a3ca082a3adc3bc8511ed67e81cc6884ba68d").unwrap().reverse(), - UInt256::from_hex("784a0529d150a44ee26ec8f08ab1eaab0d0651ed2ee1f8e611a4304626448e79").unwrap().reverse(), - UInt256::from_hex("4016510e2ef1b82fc571781b5a0cd8afa268d0c21b5d352f8f8929c542d1aef3").unwrap().reverse(), - UInt256::from_hex("776cbacfaeafd9880d791357c00c5085ddc8d00af507a35dad37c3d0f7a24256").unwrap().reverse(), - UInt256::from_hex("5480f489c2e7d4e9992349a0eb85b4a81796979c66a5f2c67f5df05866e01df1").unwrap().reverse(), - UInt256::from_hex("5ec696060fb6d43e5065e858a590b98af558c1e0d48d1a08b634189131b17ee7").unwrap().reverse(), - UInt256::from_hex("17e5abab4d2bc5b03d14163d57bd0b3014bd7ec56a1051b8bded4373b0d08ba7").unwrap().reverse(), - UInt256::from_hex("754285ad30ce2aa5f9d799770a2e06afff77613e09c240d3019d1f266e2f1167").unwrap().reverse(), - UInt256::from_hex("68b9a31205e3c190346a162f29804feeee0fe17caa3bda09c1d97e4913967b56").unwrap().reverse(), - UInt256::from_hex("b0219f34cc8fccaf88796889a8cd034eac82415cd7f7f3baae950c841857f85c").unwrap().reverse(), - UInt256::from_hex("e8f49c2f481b18d8b3ffdfe36dd7cce85bbd0332cd723b7b329d2192cef1fb61").unwrap().reverse(), - UInt256::from_hex("7fd0a504278a1e6a0cc1188c98178c279667450502a87e8e841dfaab7896657b").unwrap().reverse(), - ]; - let quarter_h_2c = [ - UInt256::from_hex("c1666e28121c0e2375e785edcbd2e84e1136f9fa0e415a9310d203aaa06e2153").unwrap().reverse(), - UInt256::from_hex("c75b5aaf2a9c127b3f4199d4700abc1eab9fb8ebdf31b4d296951ce395bd52e0").unwrap().reverse(), - UInt256::from_hex("7878b048a1411dc9e7cc71b4d3aae6f4bdb93f299f186fee4cc7a4833a7114a7").unwrap().reverse(), - UInt256::from_hex("2899b3e2bb291e84943ab9436f93e0708cbb59860f9c05b41ffac4678dd714a5").unwrap().reverse(), - UInt256::from_hex("320cac56da899ad7b5133d7d0aa54d0f12d2a7fddea9c97c6749e2a7efdf0b98").unwrap().reverse(), - UInt256::from_hex("93bd23b7357a62c5ab2cc306054bf0b1fa6f52265fbbef23f600298d8daebd1a").unwrap().reverse(), - UInt256::from_hex("f9d8fbb02e8f909b7922cc34b8259ea6b73dab88738c2af2e02e1ac929ccdd5e").unwrap().reverse(), - UInt256::from_hex("b86f9ae4178a3425abb8053a40e1eb138b2a68b466ba2b3bd04167060cd5c1b5").unwrap().reverse(), - UInt256::from_hex("d2f9d05f8983ce1d645487efbc4c3b2c31b8ec914b1e9085e70202001e11bcd4").unwrap().reverse(), - UInt256::from_hex("c98ab7576c4b83d94e668f0e3910aa514a6ff0171684f9fc8e30143664d20999").unwrap().reverse(), - UInt256::from_hex("70f8c30d741529a6ffd4e080993523709b00ad45e6026a19097e13f68d687d55").unwrap().reverse(), - UInt256::from_hex("4f45b42e8b170dac1cfe288815423020135e105f4c98e1b2f09db0cf059d1ac6").unwrap().reverse(), - UInt256::from_hex("a8ac86f944f9477ba1642bc3f45dba51bb020af43afc1c0ca2f1f1910be209be").unwrap().reverse(), - UInt256::from_hex("fdb28cd79093c2a6be18f7b168f50008125a2416984ac4126dab6c8646657dd6").unwrap().reverse(), - UInt256::from_hex("8e483b9308737fe836d71967ddb634559a5c63c8cb8d495275952e0f6cb5a717").unwrap().reverse() - ]; - let quarter_h_3c = [ - UInt256::from_hex("d2426992844e311149b2962f4ea991656ea5d1b36541e314e251915a6ffa1316").unwrap().reverse(), - UInt256::from_hex("82dcf337825f4eb6726ffe56ab981034c49785c1f92da274e51fe925380265a6").unwrap().reverse(), - UInt256::from_hex("30c14c1d75694404dbc96d44d1c63f28bf685d27e44ef753883c5eb0742c5805").unwrap().reverse(), - UInt256::from_hex("631a5e99e59bab2bf06e4ec9874b3c3ced59187dc724c689ffa0fe99f2d3f210").unwrap().reverse(), - UInt256::from_hex("113673823cf38eb56f30795d7f830b2d82b70a35b96812ad79d0889465b69df3").unwrap().reverse(), - UInt256::from_hex("0e01a796d779a8494be44311d6daf07fdae8642b45a9b866024cd97d8dfd3545").unwrap().reverse(), - UInt256::from_hex("feb146a52985cbf69f0a46b3a56f5f505538440bd42e993a0685a11fac1fdda5").unwrap().reverse(), - UInt256::from_hex("48d665ade991114900349635c788775204057220728212e2b6b63e3545f67007").unwrap().reverse(), - UInt256::from_hex("adcc454391d9f53e6fa523e047db5f335e38d9ead70dc8e4e648118c285d1d77").unwrap().reverse(), - UInt256::from_hex("aadd2eac24d6cc9a0b439d3c9d5483b0ed64ebda21786760bb375efacd6e2a67").unwrap().reverse(), - UInt256::from_hex("a90df0c30b2002a85cef6b695b986a3815c7dc82027c6896b7747258675a76da").unwrap().reverse(), - UInt256::from_hex("e13fbad0ab0bca68cbcd4d68127de06037b4007c5acbe8550edcd60b7d4503e8").unwrap().reverse(), - UInt256::from_hex("200ccffb2ef1da266efda63b35bc80bc8a547f29af3b8108f81ab222a1ceac35").unwrap().reverse(), - UInt256::from_hex("21173e00737bac467d09effb15959d0459b853160805057a3975436d3e206591").unwrap().reverse(), - UInt256::from_hex("321a1300b3ec63b3082d1626c7377d3c9e4e332eadefe12073f5e17b5099a49e").unwrap().reverse(), - ]; - assert_eq!(node_hashes[..15], quarter_h_3c, "Quorum quarter at H - 3C is wrong"); - assert_eq!(node_hashes[15..30], quarter_h_2c, "Quorum quarter at H - 2C is wrong"); - assert_eq!(node_hashes[30..45], quarter_h_c, "Quorum quarter at H - C is wrong"); - assert_eq!(node_hashes[45..], new_quarter_members, "New quorum quarter members are wrong"); - - let payload_validation_status = last_quorum.validate_payload(); - assert!(payload_validation_status.is_ok(), "Invalid payload"); - let signature_validation_status = last_quorum.validate(nodes, block_height); - assert!(signature_validation_status.is_not_critical(), "Invalid signature"); -} diff --git a/dash-spv-masternode-processor/src/tests/listdiff/llmq_snapshot.rs b/dash-spv-masternode-processor/src/tests/listdiff/llmq_snapshot.rs deleted file mode 100644 index 822efebd..00000000 --- a/dash-spv-masternode-processor/src/tests/listdiff/llmq_snapshot.rs +++ /dev/null @@ -1,116 +0,0 @@ -use byte::BytesExt; -use hashes::hex::FromHex; -use crate::crypto::byte_util::BytesDecodable; -use crate::crypto::data_ops::Data; -use crate::{common, models}; -use crate::models::LLMQSnapshot; - -#[test] -pub fn test_quorum_snapshot() { - let payload = Vec::from_hex("000000001fb95e7b0300").unwrap(); - let snapshot = models::LLMQSnapshot::from_bytes(payload.as_slice(), &mut 0).unwrap(); - println!("snapshot: {:?}", snapshot); - // as slice - assert!(snapshot.member_list.as_slice().bit_is_true_at_le_index(0)); - assert!(!snapshot.member_list.as_slice().bit_is_true_at_le_index(1)); - assert!(!snapshot.member_list.as_slice().bit_is_true_at_le_index(2)); - assert!(snapshot.member_list.as_slice().bit_is_true_at_le_index(3)); - assert!(snapshot.member_list.as_slice().bit_is_true_at_le_index(4)); - assert!(snapshot.member_list.as_slice().bit_is_true_at_le_index(5)); - assert!(!snapshot.member_list.as_slice().bit_is_true_at_le_index(6)); - assert!(snapshot.member_list.as_slice().bit_is_true_at_le_index(7)); - assert!(!snapshot.member_list.as_slice().bit_is_true_at_le_index(8)); - assert!(snapshot.member_list.as_slice().bit_is_true_at_le_index(9)); - assert!(snapshot.member_list.as_slice().bit_is_true_at_le_index(10)); - assert!(snapshot.member_list.as_slice().bit_is_true_at_le_index(11)); - assert!(snapshot.member_list.as_slice().bit_is_true_at_le_index(12)); - assert!(!snapshot.member_list.as_slice().bit_is_true_at_le_index(13)); - assert!(snapshot.member_list.as_slice().bit_is_true_at_le_index(14)); - assert!(!snapshot.member_list.as_slice().bit_is_true_at_le_index(15)); - assert!(snapshot.member_list.as_slice().bit_is_true_at_le_index(16)); - assert!(snapshot.member_list.as_slice().bit_is_true_at_le_index(17)); - assert!(!snapshot.member_list.as_slice().bit_is_true_at_le_index(18)); - assert!(snapshot.member_list.as_slice().bit_is_true_at_le_index(19)); - assert!(snapshot.member_list.as_slice().bit_is_true_at_le_index(20)); - assert!(snapshot.member_list.as_slice().bit_is_true_at_le_index(21)); - assert!(snapshot.member_list.as_slice().bit_is_true_at_le_index(22)); - assert!(!snapshot.member_list.as_slice().bit_is_true_at_le_index(23)); - assert!(snapshot.member_list.as_slice().bit_is_true_at_le_index(24)); - assert!(snapshot.member_list.as_slice().bit_is_true_at_le_index(25)); - assert!(!snapshot.member_list.as_slice().bit_is_true_at_le_index(26)); - assert!(!snapshot.member_list.as_slice().bit_is_true_at_le_index(27)); - assert!(!snapshot.member_list.as_slice().bit_is_true_at_le_index(28)); - assert!(!snapshot.member_list.as_slice().bit_is_true_at_le_index(29)); - assert!(!snapshot.member_list.as_slice().bit_is_true_at_le_index(30)); - // as vec - assert!(snapshot.member_list.bit_is_true_at_le_index(0)); - assert!(!snapshot.member_list.bit_is_true_at_le_index(1)); - assert!(!snapshot.member_list.bit_is_true_at_le_index(2)); - assert!(snapshot.member_list.bit_is_true_at_le_index(3)); - assert!(snapshot.member_list.bit_is_true_at_le_index(4)); - assert!(snapshot.member_list.bit_is_true_at_le_index(5)); - assert!(!snapshot.member_list.bit_is_true_at_le_index(6)); - assert!(snapshot.member_list.bit_is_true_at_le_index(7)); - assert!(!snapshot.member_list.bit_is_true_at_le_index(8)); - assert!(snapshot.member_list.bit_is_true_at_le_index(9)); - assert!(snapshot.member_list.bit_is_true_at_le_index(10)); - assert!(snapshot.member_list.bit_is_true_at_le_index(11)); - assert!(snapshot.member_list.bit_is_true_at_le_index(12)); - assert!(!snapshot.member_list.bit_is_true_at_le_index(13)); - assert!(snapshot.member_list.bit_is_true_at_le_index(14)); - assert!(!snapshot.member_list.bit_is_true_at_le_index(15)); - assert!(snapshot.member_list.bit_is_true_at_le_index(16)); - assert!(snapshot.member_list.bit_is_true_at_le_index(17)); - assert!(!snapshot.member_list.bit_is_true_at_le_index(18)); - assert!(snapshot.member_list.bit_is_true_at_le_index(19)); - assert!(snapshot.member_list.bit_is_true_at_le_index(20)); - assert!(snapshot.member_list.bit_is_true_at_le_index(21)); - assert!(snapshot.member_list.bit_is_true_at_le_index(22)); - assert!(!snapshot.member_list.bit_is_true_at_le_index(23)); - assert!(snapshot.member_list.bit_is_true_at_le_index(24)); - assert!(snapshot.member_list.bit_is_true_at_le_index(25)); - assert!(!snapshot.member_list.bit_is_true_at_le_index(26)); - assert!(!snapshot.member_list.bit_is_true_at_le_index(27)); - assert!(!snapshot.member_list.bit_is_true_at_le_index(28)); - assert!(!snapshot.member_list.bit_is_true_at_le_index(29)); - assert!(!snapshot.member_list.bit_is_true_at_le_index(30)); - assert_eq!(common::LLMQSnapshotSkipMode::NoSkipping, snapshot.skip_list_mode); - assert_eq!(0, snapshot.skip_list.len()); -} - -#[test] -pub fn test_quorum_snapshot2() { - let bytes1 = Vec::from_hex("01000000fd2a02ffffffffffffffffffffffffffffffffffffffffffff010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bc0000000003000000020000000400000005000000060000000700000008000000090000000b0000000e0000002000000023000000280000002c0000002f000000340000003a0000003b0000004200000044000000490000004a0000004e000000570000005c0000005f0000006000000064000000660000006700000068000000690000006b0000006f0000007000000072000000750000007b0000007d0000007e000000810000008300000084000000850000008b0000008d000000920000009c0000009d000000a0000000a3000000a4000000a7000000a9000000aa000000ac000000ffffffff000000000500000007000000080000000b0000000f00000020000000230000002500000028000000290000002f00000031000000340000003a0000003b0000004300000044000000460000004a0000004b0000005300000060000000620000006700000068000000690000006b0000006f00000072000000750000007b0000007d000000800000008100000092000000960000009c0000009d000000a3000000a7000000ac000000ad000000ffffffff0000000002000000050000000d0000000f000000140000001b00000023000000240000002500000028000000290000002a0000002c0000002e00000031000000370000003a0000004200000043000000460000004b0000005c0000005f00000060000000610000006200000064000000650000006700000068000000690000006f00000075000000790000007b0000007d0000008b0000008f0000009200000097000000980000009c000000a0000000a3000000a5000000ac000000fdffffff000000000200000005000000080000000e000000110000001400000015000000160000001a0000001b000000280000002a0000002c000000330000003500000037000000390000003c0000003d0000003e000000410000004200000044000000490000004c0000004d0000004e000000580000005c00000065000000660000006f000000740000007600000077000000790000007b000000").unwrap(); - let bytes2 = Vec::from_hex("01000000fd2a02ffffffe6fffffbffffffff7fffeffff7fffffff7bfff03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090090000000300000006000000090000000e000000100000001a000000220000002a0000002c00000032000000330000003700000038000000400000004300000044000000490000004d00000051000000590000005a0000005c0000005e000000620000006300000064000000650000006a0000006d0000006f00000074000000760000007c000000810000008300000086000000880000008f0000009100000098000000a3000000a5000000a800000000000000020000000500000006000000090000000d0000000e00000011000000240000002a0000002c000000300000003b000000400000004100000043000000450000004600000047000000490000004d000000520000005b0000005e00000061000000670000006a0000006b0000006d00000073000000750000007c0000007d000000800000008400000086000000880000008c000000980000009a000000a1000000a5000000a8000000010000000400000008000000090000000c0000001300000018000000200000002400000026000000290000002d000000300000003a00000041000000420000004300000046000000520000005400000056000000590000005b00000066000000680000006a0000007100000077000000870000008d0000009000000094000000950000009e000000a1000000a7000000a8000000080000000a0000000c0000000d0000000f000000120000001b0000001d000000200000002100000023000000280000002b0000002e00000032000000380000003a0000003f000000490000004b000000").unwrap(); - let snapshot1 = bytes1.as_slice().read_with::(&mut 0, byte::LE).unwrap(); - let snapshot2 = bytes2.as_slice().read_with::(&mut 0, byte::LE).unwrap(); - let bits1 = vec![true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,]; - let bits2 = vec![true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, ]; - let len1 = snapshot1.member_list.len() * 8 - 7; - let len2 = snapshot2.member_list.len() * 8 - 7; - for i in 0..len1 { - assert_eq!(snapshot1.member_is_true_at_index(i as u32), bits1[i]); - assert_eq!(snapshot1.member_list.bit_is_true_at_le_index(i as u32), bits1[i]); - - } - - for i in 0..len2 { - assert_eq!(snapshot2.member_is_true_at_index(i as u32), bits2[i]); - assert_eq!(snapshot2.member_list.bit_is_true_at_le_index(i as u32), bits2[i]); - } -} - -#[test] -pub fn test_quorum_snapshot3() { - let expected = [false, false, false, false, true, true, true, true, false, false, false, false, true, true, false, true, true, false, false, false, true, false, true, true, true, true, false, false, true, false, false, false, false, true, false, false, false, false, false, false, true, false, false, false, false, false, true, true, true, false, false, false, false, true, false, true, false, false, false, false, true, false, true, true, false, true, true, true, true, false, false, true, false, false, false, false, true, false, false, false, false, false, false, false, true, true, false, false, false, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, true, true, false, true, false, false, true, true, false, false, false, false, true, false, false, false, false, false, false, false, true, true, false, true, false, false, false, false, true, false, false, false, true, false, true, false, false, true, true, true, false, true, false, false, true, false, false, false, true, false, false, true, true, true, false, true, false, true, false, false, false, false, false, true, false, true, false, false, true, false, false, true, false, true, false, false, false, true, true, false, true, false, false, false, false, false, false, false, false, false, true, false, true, false, true, false, false, true, false, true, false, false, true, false, true, false, true, true, true, true, false, false, true, false, false, true, false, false, false, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, false, false, true, false, false, false, true, false, true, false, false, false, false, true, false, false, false, true, false, false, false, false, true, true, false, false, false, false, false, true, false, false, false, false, true, false, true, false, true, true, false, false, false, false, false, true, false, true, false, true, false, false, false, false, true, false, true, false, false, false, true, false, false, true, false, true, true, true, true, false, true, false, false, false, false, false, true, false, false, true, false, false, false, true, false, true, true, true, false, false, false, false, true, false, true, false, true, false, false, true, false, false, false, false, false, false, false, true, true, false, true, true, false, false, true, true, true, false, false, false, true, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, true, true, false, false, false, true, false, true, false, true, false, false, true, true, false, true, false, false, false, false, true, false, true, false, false, true, true, true, false, false, true, true, false, false, true, true, true, false, true, false, true, true, false, true, false, true, true, false, true, false, false, true, false, false, false, false, true, true, true, true, true, false, true, false, true, false, false, true, false, true, false, false, true, false, false, false, true, false, false, false, true, false, false, false, true, false, true, true, false, true, true, true, false, false, false, false, false, false, true, false, false, false, true, true, true, false, true, true, true, true, false, false, false, false, false, true, false, false, true, false, false, false, false, false, true, false, false, false, true, true, true, false, true, false, false, true, false, false, true, true, true, true, false, true, true, false, true, false, false, false, false, false, true, true, false, false, true, false, true, true, true, false, false, true, false, false, false, true, true, true, true, false, false, false, false, true, false, true, false, false, true, false, false, false, false, false, true, true, true, false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, true, false, true, false, true, false, false, true, false, false, false, false, true, true, false, false, false, false, false, false, true, false, false, true, false, false, false, false, false, true, true, false, false, false, true, true, false, false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, false, false, true, false, false, false, false, true, true, true, false, true, false, true, false, true, true, false, false, false, true, false, false, true, false, false, false, false, false, false, true, true, false, true, false, true, false, false, false, false, true, false, false, true, false, false, false, true, false, true, true, false, false, false, true, true, true, false, false, true, false, false, true, false, false, false, false, true, false, false, true, true, false, true, true, true, true, true, false, false, false, true, false, false, false, false, false, false, false, false, true, false, true, false, true, false, true, true, false, false, true, false, false, false, true, false, true, false, false, false, true, true, true, false, true, false, false, true, true, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, true, true, false, true, false, false, true, false, false, true, false, false, false, false, true, true, false, true, false, false, true, true, true, false, false, true, false, false, false, false, false, false, false, false, false, false, true, false, true, false, false, true, false, false, false, false, true, true, false, false, false, true, false, false, true, true, false, false, true, true, false, true, false, false, true, true, false, false, false, false, false, true, true, true, false, false, true, true, false, false, true, true, true, false, false, true, true, false, false, true, false, true, true, true, false, true, false, false, false, true, false, false, false, false, false, true, true, false, false, false, false, true, false, true, false, true, false, false, true, false, false, true, true, true, false, true, true, false, false, false, false, true, true, false, false, true, true, true, true, false, true, false, false, false, false, false, true, false, true, true, false, false, false, false, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, true, false, false, false, false, false, true, false, true, true, true, false, false, false, false, false, false, true, false, false, false, true, false, false, false, false, true, true, true, false, false, true, false, true, false, false, false, true, true, false, true, true, false, false, true, false, false, false, true, false, true, false, false, false, false, false, false, false, false, true, false, true, false, true, true, false, false, true, false, false, true, true, false, false, true, false, false, false, false, true, false, true, false, false, false, false, true, false, true, true, false, false, true, true, true, false, true, false, true, true, false, false, false, true, true, false, false, true, true, false, true, false, true, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false, true, true, false, true, false, false, false, false, true, true, false, true, false, false, true, true, true, false, false, false, true, true, false, true, false, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, false, true, false, false, true, false, false, true, false, false, true, true, false, true, true, true, false, false, true, false, true, false, true, true, true, false, false, true, true, true, false, false, true, false, true, false, true, true, false, false, false, true, true, false, false, false, true, false, true, true, true, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, true, false, false, false, true, true, true, false, false, false, false, false, true, false, true, false, false, false, true, false, false, true, false, true, true, true, false, true, true, false, false, true, false, false, false, false, true, false, false, false, true, false, true, false, true, false, false, true, true, false, false, true, true, false, false, true, false, false, true, true, true, true, false, true, false, false, false, false, true, true, false, true, false, true, false, false, true, false, true, false, false, false, true, false, false, false, false, false, true, false, false, false, false, true, false, false, false, true, false, false, false, true, true, false, false, false, false, true, true, true, false, false, false, true, false, true, true, false, false, true, false, false, false, true, false, true, true, false, true, true, true, true, true, false, false, false, false, true, true, false, false, true, false, true, false, true, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, true, false, true, false, true, true, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, false, true, true, true, false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, false, true, false, true, false, false, false, false, true, false, false, true, false, true, true, false, false, false, true, false, false, false, false, false, false, false, true, false, false, true, true, true, false, false, false, true, false, false, true, false, false, true, false, false, true, true, true, true, false, false, false, false, false, true, false, true, false, true, true, true, false, false, false, false, true, false, true, true, true, false, true, false, true, false, true, false, false, false, false, false, false, false, false, true, false, false, true, false, false, false, true, true, true, true, true, false, false, true, false, true, true, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, true, false, false, true, true, false, true, false, false, false, true, false, false, false, true, true, true, true, false, false, false, true, false, true, true, false, true, false, false, false, false, true, true, false, true, false, true, false, false, false, false, true, true, false, true, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false, true, true, false, false, false, true, false, false, false, true, true, false, false, false, false, false, false, true, true, true, true, false, false, true, true, false, false, false, false, false, true, false, false, false, false, false, false, true, true, false, true, true, false, false, false, false, false, false, false, true, false, false, true, true, false, false, true, false, true, true, true, false, false, false, true, false, false, true, true, false, false, false, false, true, false, false, true, false, true, false, true, true, false, true, false, true, false, true, false, false, true, true, false, false, false, false, false, false, true, true, false, true, true, false, false, false, false, false, false, false, false, false, false, true, false, false, false, true, true, true, false, false, false, true, false, false, true, true, false, false, false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, true, false, false, false, false, true, true, false, false, false, false, false, true, true, false, false, false, true, false, true, true, false, true, false, false, false, false, false, false, true, false, false, false, false, true, true, true, false, false, true, false, false, true, true, true, true, false, false, false, false, false, true, false, false, true, true, false, false, false, true, true, false, true, true, true, true, true, false, false, true, false, false, false, false, false, false, true, false, false, true, false, false, false, false, false, true, false, true, false, true, false, true, true, false, true, false, false, true, true, false, true, false, false, false, true, true, false, false, false, true, false, false, false, true, false, false, false, false, false, true, false, true, true, true, false, false, false, false, false, true, false, false, true, true, true, true, true, true, false, false, false, false, true, false, false, false, false, false, true, false, false, true, false, false, false, true, true, true, true, false, false, false, false, false, true, true, false, false, false, true, false, true, false, true, false, true, false, true, true, false, true, true, true, false, true, false, true, true, false, false, false, false, true, true, false, true, true, false, false, false, true, false, true, true, true, false, true, false, false, false, false, true, false, false, true, false, false, false, true, true, false, true, false, true, true, true, true, false, false, false, false, false, true, true, true, true, false, true, false, true, false, false, false, false, false, true, false, true, true, false, false, false, true, false, true, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, true, true, true, true, false, false, true, false, false, false, true, true, true, true, true, true, false, false, true, true, false, false, false, false, false, false, true, false, false, false, true, false, false, true, false, false, false, true, false, true, false, true, false, false, false, false, false, false, true, true, true, false, false, false, true, false, true, true, false, false, true, true, false, true, true, false, false, false, true, false, false, false, true, true, false, false, true, false, false, false, true, false, false, false, true, false, false, true, true, true, true, true, false, false, false, false, true, true, false, true, false, true, false, false, false, false, false, false, false, true, true, false, false, false, false, false, false, true, false, true, false, true, false, false, false, false, false, false, false, true, false, true, true, true, false, false, false, false, true, false, false, true, false, true, true, false, false, false, false, false, false, false, false, false, false, true, false, false, false, true, false, true, false, true, false, false, false, true, false, false, false, false, true, true, false, true, false, true, false, true, false, false, true, false, false, true, false, false, true, false, false, false, false, true, false, true, false, false, true, true, false, true, true, true, false, true, false, true, true, false, false, true, true, true, true, true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, true, false, true, true, false, false, false, false, false, true, false, false, false, false, true, true, false, true, false, true, true, false, false, true, false, true, true, true, true, false, false, false, false, true, true, false, true, false, false, true, false, false, true, false, false, true, false, false, false, false, false, false, true, true, false, false, false, true, true, false, false, false, false, false, false, false, true, false, true, true, true, true, true, false, true, false, true, true, false, false, false, true, false, false, false, true, true, false, false, false, true, true, false, false, false, true, true, false, false, true, false, true, true, true, true, true, false, true, false, true, false, false, true, false, false, false, true, true, false, true, true, false, false, true, false, false, false, false, false, true, false, false, false, true, false, true, false, false, false, false, false, false, false, true, true, false, true, false, false, false, false, true, false, true, true, true, false, true, true, false, true, false, true, false, false, false, false, false, false, true, false, false, true, true, true, false, false, true, true, false, false, true, false, false, false, true, false, false, true, false, false, false, false, true, true, true, false, false, false, true, true, false, false, true, false, true, true, false, false, false, false, false, false, true, false, false, false, true, false, false, false, true, false, false, true, false, true, false, false, true, false, false, true, false, false, false, false, true, true, true, false, false, false, true, false, false, true, false, false, false, true, false, false, false, false, false, false, true, false, true, false, false, true, false, false, true, false, false, true, true, true, false, true, true, false, false, false, true, false, false, true, true, false, true, true, false, false, false, false, false, true, false, true, true, false, true, false, true, true, false, true, true, true, true, true, false, false, false, false, false, true, true, false, true, false, true, false, false, true, false, true, true, true, false, false, true, false, false, true, false, false, false, false, true, false, true, true, true, true, false, true, true, false, false, false, false, false, true, false, true, false, true, false, true, false, false, false, false, true, false, false, true, true, false, true, true, false, true, false, false, false, false, false, true, false, true, false, false, true, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, true, true, false, false, false, true, false, true, false, true, false, false, true, true, false, true, false, false, true, true, true, false, false, false, true, false, true, true, false, false, false, false, true, false, true, true, false, false, true, true, false, false, true, true, true, false, false, false, false, true, true, true, true, false, false, false, true, true, false, true, true, true, true, true, false, true, false, false, false, false, true, false, true, false, false, false, false, false, false, true, true, true, false, true, false, true, false, false, true, true, false, true, false, false, false, false, false, false, false, true, false, false, true, true, false, true, true, true, false, true, true, true, false, false, false, true, false, false, true, true, true, true, true, true, true, true, false, false, true, false, false, false, true, true, false, false, false, false, false, true, false, false, true, false, true, false, false, false, false, false, false, false, true, false, true, true, true, true, false, false, false, false, false, true, false, false, false, false, false, true, false, false, true, false, false, true, true, false, false, true, false, false, false, false, true, true, false, false, false, false, false, true, false, true, false, false, false, false, true, false, false, false, false, true, true, false, false, false, true, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, false, false, true, true, false, false, true, false, false, false, false, false, true, false, false, false, true, false, true, false, false, false, false, true, false, false, true, false, false, false, true, false, true, false, true, false, true, true, true, false, false, true, false, true, false, false, false, false, false, false, false, true, true, true, true, true, false, false, false, false, false, false, true, true, false, false, true, false, false, true, false, false, false, true, false, false, false, true, false, false, false, false, false, true, true, false, false, false, false, false, true, true, false, true, false, false, false, false, true, false, false, true, false, true, true, true, true, false, true, false, false, false, false, false, false, true, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false, true, false, true, true, false, false, false, false, true, false, false, true, true, false, true, false, false, false, false, true, false, true, false, true, true, false, false, false, true, true, false, false, false, false, true, true, true, false, true, false, true, false, false, true, false, true, false, true, false, true, false, true, false, true, true, false, false, false, true, false, false, true, false, true, false, false, false, false, true, false, false, false, false, false, true, true, false, false, true, true, false, true, false, true, true, true, false, false, false, false, true, false, true, false, true, false, false, true, true, false, false, true, true, true, false, false, false, true, true, true, true, false, false, true, false, false, false, false, false, false, true, false, true, false, false, true, true, false, true, true, true, false, true, true, false, false, false, true, true, false, true, true, false, false, true, false, false, false, true, false, false, false, true, true, false, true, true, false, false, false, false, true, false, false, true, false, true, false, false, false, false, false, true, false, false, false, true, true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, true, true, false, false, true, false, true, true, false, true, false, true, false, false, true, true, false, true, false, false, true, false, true, false, true, false, false, false, true, true, true, true, false, false, true, false, false, false, true, false, false, true, false, false, false, false, false, false, false, false, true, true, false, true, false, true, false, false, false, false, true, false, false, false, false, true, false, false, false, true, true, false, false, true, false, false, true, true, false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, true, false, false, false, true, true, true, false, false, true, false, true, true, false, true, false, false, false, false, true, false, true, false, false, true, true, true, true, false, true, true, true, false, false, false, true, true, true, false, false, true, true, true, false, false, false, false, false, true, false, false, false, true, true, false, true, false, false, false, false, false, false, true, false, true, false, true, true, false, false, false, false, false, false, false, true, true, false, true, false, false, false, true, false, true, false, false, false, false, false, false, false, true, false, true, true, true, false, false, true, false, true, false, false, true, false, true, true, false, true, true, false, false, false, false, true, false, true, false, false, false, true, false, true, true, true, false, true, true, false, false, true, false, false, true, true, false, false, false, false, false, false, false, true, false, false, false, true, true, true, false, true, false, false, false, false, false, true, false, false, true, true, false, true, true, false, true, false, true, true, false, true, true, true, true, false, true, true, false, true, true, false, true, false, true, false, false, true, false, false, false, false, true, true, false, false, true, false, true, false, false, false, false, false, true, false, false, true, true, false, false, false, false, true, true, false, false, false, true, false, true, false, false, false, false, false, false, false, false, false, true, false, false, true, false, false, true, true, true, false, false, true, false, true, true, true, false, false, false, false, true, true, true, false, false, true, false, false, false, false, false, false, true, true, false, true, true, true, false, true, false, false, true, true, false, false, true, true, false, false, false, true, true, false, true, true, false, false, false, false, false, false, false, false, true, false, true, false, false, true, true, false, false, true, true, false, false, true, false, true, false, false, true, true, false, false, true, true, true, false, false, false, true, false, false, false, false, false, false, true, true, false, true, false, false, false, false, false, false, false, true, false, false, false, false, true, false, false, true, true, true, true, true, true, false, false, false, true, false, true, false, false, true, false, false, true, false, false, false, false, false, false, false, false, false, false, true, true, false, true, false, false, false, false, false, true, false, true, false, true, true, true, true, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, true, false, false, false, true, false, false, false, true, true, true, true, true, true, false, false, false, false, false, false, true, false, false, false, false, true, false, false, false, true, true, false, true, false, true, false, false, false, true, true, true, false, false, false, false, true, true, true, true, false, true, true, false, false, false, false, false, true, true, true, false, false, true, false, false, true, false, true, false, false, true, false, false, false, false, false, false, true, false, true, true, false, true, true, false, false, false, true, false, true, false, false, false, false, false, true, true, false, true, true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, true, true, false, false, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]; - // let expected = [false, false, false, false, true, true, true, true, false, false, false, false, true, true, false, true, true, false, false, false, true, false, true, true, true, true, false, false, true, false, false, false, false, true, false, false, false, false, false, false, true, false, false, false, false, false, true, true, true, false, false, false, false, true, false, true, false, false, false, false, true, false, true, true, false, true, true, true, true, false, false, true, false, false, false, false, true, false, false, false, false, false, false, false, true, true, false, false, false, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, true, true, false, true, false, false, true, true, false, false, false, false, true, false, false, false, false, false, false, false, true, true, false, true, false, false, false, false, true, false, false, false, true, false, true, false, false, true, true, true, false, true, false, false, true, false, false, false, true, false, false, true, true, true, false, true, false, true, false, false, false, false, false, true, false, true, false, false, true, false, false, true, false, true, false, false, false, true, true, false, true, false, false, false, false, false, false, false, false, false, true, false, true, false, true, false, false, true, false, true, false, false, true, false, true, false, true, true, true, true, false, false, true, false, false, true, false, false, false, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, false, false, true, false, false, false, true, false, true, false, false, false, false, true, false, false, false, true, false, false, false, false, true, true, false, false, false, false, false, true, false, false, false, false, true, false, true, false, true, true, false, false, false, false, false, true, false, true, false, true, false, false, false, false, true, false, true, false, false, false, true, false, false, true, false, true, true, true, true, false, true, false, false, false, false, false, true, false, false, true, false, false, false, true, false, true, true, true, false, false, false, false, true, false, true, false, true, false, false, true, false, false, false, false, false, false, false, true, true, false, true, true, false, false, true, true, true, false, false, false, true, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, true, true, false, false, false, true, false, true, false, true, false, false, true, true, false, true, false, false, false, false, true, false, true, false, false, true, true, true, false, false, true, true, false, false, true, true, true, false, true, false, true, true, false, true, false, true, true, false, true, false, false, true, false, false, false, false, true, true, true, true, true, false, true, false, true, false, false, true, false, true, false, false, true, false, false, false, true, false, false, false, true, false, false, false, true, false, true, true, false, true, true, true, false, false, false, false, false, false, true, false, false, false, true, true, true, false, true, true, true, true, false, false, false, false, false, true, false, false, true, false, false, false, false, false, true, false, false, false, true, true, true, false, true, false, false, true, false, false, true, true, true, true, false, true, true, false, true, false, false, false, false, false, true, true, false, false, true, false, true, true, true, false, false, true, false, false, false, true, true, true, true, false, false, false, false, true, false, true, false, false, true, false, false, false, false, false, true, true, true, false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, true, false, true, false, true, false, false, true, false, false, false, false, true, true, false, false, false, false, false, false, true, false, false, true, false, false, false, false, false, true, true, false, false, false, true, true, false, false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, false, false, true, false, false, false, false, true, true, true, false, true, false, true, false, true, true, false, false, false, true, false, false, true, false, false, false, false, false, false, true, true, false, true, false, true, false, false, false, false, true, false, false, true, false, false, false, true, false, true, true, false, false, false, true, true, true, false, false, true, false, false, true, false, false, false, false, true, false, false, true, true, false, true, true, true, true, true, false, false, false, true, false, false, false, false, false, false, false, false, true, false, true, false, true, false, true, true, false, false, true, false, false, false, true, false, true, false, false, false, true, true, true, false, true, false, false, true, true, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, true, true, false, true, false, false, true, false, false, true, false, false, false, false, true, true, false, true, false, false, true, true, true, false, false, true, false, false, false, false, false, false, false, false, false, false, true, false, true, false, false, true, false, false, false, false, true, true, false, false, false, true, false, false, true, true, false, false, true, true, false, true, false, false, true, true, false, false, false, false, false, true, true, true, false, false, true, true, false, false, true, true, true, false, false, true, true, false, false, true, false, true, true, true, false, true, false, false, false, true, false, false, false, false, false, true, true, false, false, false, false, true, false, true, false, true, false, false, true, false, false, true, true, true, false, true, true, false, false, false, false, true, true, false, false, true, true, true, true, false, true, false, false, false, false, false, true, false, true, true, false, false, false, false, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, true, false, false, false, false, false, true, false, true, true, true, false, false, false, false, false, false, true, false, false, false, true, false, false, false, false, true, true, true, false, false, true, false, true, false, false, false, true, true, false, true, true, false, false, true, false, false, false, true, false, true, false, false, false, false, false, false, false, false, true, false, true, false, true, true, false, false, true, false, false, true, true, false, false, true, false, false, false, false, true, false, true, false, false, false, false, true, false, true, true, false, false, true, true, true, false, true, false, true, true, false, false, false, true, true, false, false, true, true, false, true, false, true, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false, true, true, false, true, false, false, false, false, true, true, false, true, false, false, true, true, true, false, false, false, true, true, false, true, false, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, false, true, false, false, true, false, false, true, false, false, true, true, false, true, true, true, false, false, true, false, true, false, true, true, true, false, false, true, true, true, false, false, true, false, true, false, true, true, false, false, false, true, true, false, false, false, true, false, true, true, true, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, true, false, false, false, true, true, true, false, false, false, false, false, true, false, true, false, false, false, true, false, false, true, false, true, true, true, false, true, true, false, false, true, false, false, false, false, true, false, false, false, true, false, true, false, true, false, false, true, true, false, false, true, true, false, false, true, false, false, true, true, true, true, false, true, false, false, false, false, true, true, false, true, false, true, false, false, true, false, true, false, false, false, true, false, false, false, false, false, true, false, false, false, false, true, false, false, false, true, false, false, false, true, true, false, false, false, false, true, true, true, false, false, false, true, false, true, true, false, false, true, false, false, false, true, false, true, true, false, true, true, true, true, true, false, false, false, false, true, true, false, false, true, false, true, false, true, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, true, false, true, false, true, true, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, false, true, true, true, false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, false, true, false, true, false, false, false, false, true, false, false, true, false, true, true, false, false, false, true, false, false, false, false, false, false, false, true, false, false, true, true, true, false, false, false, true, false, false, true, false, false, true, false, false, true, true, true, true, false, false, false, false, false, true, false, true, false, true, true, true, false, false, false, false, true, false, true, true, true, false, true, false, true, false, true, false, false, false, false, false, false, false, false, true, false, false, true, false, false, false, true, true, true, true, true, false, false, true, false, true, true, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, true, false, false, true, true, false, true, false, false, false, true, false, false, false, true, true, true, true, false, false, false, true, false, true, true, false, true, false, false, false, false, true, true, false, true, false, true, false, false, false, false, true, true, false, true, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false, true, true, false, false, false, true, false, false, false, true, true, false, false, false, false, false, false, true, true, true, true, false, false, true, true, false, false, false, false, false, true, false, false, false, false, false, false, true, true, false, true, true, false, false, false, false, false, false, false, true, false, false, true, true, false, false, true, false, true, true, true, false, false, false, true, false, false, true, true, false, false, false, false, true, false, false, true, false, true, false, true, true, false, true, false, true, false, true, false, false, true, true, false, false, false, false, false, false, true, true, false, true, true, false, false, false, false, false, false, false, false, false, false, true, false, false, false, true, true, true, false, false, false, true, false, false, true, true, false, false, false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, true, false, false, false, false, true, true, false, false, false, false, false, true, true, false, false, false, true, false, true, true, false, true, false, false, false, false, false, false, true, false, false, false, false, true, true, true, false, false, true, false, false, true, true, true, true, false, false, false, false, false, true, false, false, true, true, false, false, false, true, true, false, true, true, true, true, true, false, false, true, false, false, false, false, false, false, true, false, false, true, false, false, false, false, false, true, false, true, false, true, false, true, true, false, true, false, false, true, true, false, true, false, false, false, true, true, false, false, false, true, false, false, false, true, false, false, false, false, false, true, false, true, true, true, false, false, false, false, false, true, false, false, true, true, true, true, true, true, false, false, false, false, true, false, false, false, false, false, true, false, false, true, false, false, false, true, true, true, true, false, false, false, false, false, true, true, false, false, false, true, false, true, false, true, false, true, false, true, true, false, true, true, true, false, true, false, true, true, false, false, false, false, true, true, false, true, true, false, false, false, true, false, true, true, true, false, true, false, false, false, false, true, false, false, true, false, false, false, true, true, false, true, false, true, true, true, true, false, false, false, false, false, true, true, true, true, false, true, false, true, false, false, false, false, false, true, false, true, true, false, false, false, true, false, true, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, true, true, true, true, false, false, true, false, false, false, true, true, true, true, true, true, false, false, true, true, false, false, false, false, false, false, true, false, false, false, true, false, false, true, false, false, false, true, false, true, false, true, false, false, false, false, false, false, true, true, true, false, false, false, true, false, true, true, false, false, true, true, false, true, true, false, false, false, true, false, false, false, true, true, false, false, true, false, false, false, true, false, false, false, true, false, false, true, true, true, true, true, false, false, false, false, true, true, false, true, false, true, false, false, false, false, false, false, false, true, true, false, false, false, false, false, false, true, false, true, false, true, false, false, false, false, false, false, false, true, false, true, true, true, false, false, false, false, true, false, false, true, false, true, true, false, false, false, false, false, false, false, false, false, false, true, false, false, false, true, false, true, false, true, false, false, false, true, false, false, false, false, true, true, false, true, false, true, false, true, false, false, true, false, false, true, false, false, true, false, false, false, false, true, false, true, false, false, true, true, false, true, true, true, false, true, false, true, true, false, false, true, true, true, true, true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, true, false, true, true, false, false, false, false, false, true, false, false, false, false, true, true, false, true, false, true, true, false, false, true, false, true, true, true, true, false, false, false, false, true, true, false, true, false, false, true, false, false, true, false, false, true, false, false, false, false, false, false, true, true, false, false, false, true, true, false, false, false, false, false, false, false, true, false, true, true, true, true, true, false, true, false, true, true, false, false, false, true, false, false, false, true, true, false, false, false, true, true, false, false, false, true, true, false, false, true, false, true, true, true, true, true, false, true, false, true, false, false, true, false, false, false, true, true, false, true, true, false, false, true, false, false, false, false, false, true, false, false, false, true, false, true, false, false, false, false, false, false, false, true, true, false, true, false, false, false, false, true, false, true, true, true, false, true, true, false, true, false, true, false, false, false, false, false, false, true, false, false, true, true, true, false, false, true, true, false, false, true, false, false, false, true, false, false, true, false, false, false, false, true, true, true, false, false, false, true, true, false, false, true, false, true, true, false, false, false, false, false, false, true, false, false, false, true, false, false, false, true, false, false, true, false, true, false, false, true, false, false, true, false, false, false, false, true, true, true, false, false, false, true, false, false, true, false, false, false, true, false, false, false, false, false, false, true, false, true, false, false, true, false, false, true, false, false, true, true, true, false, true, true, false, false, false, true, false, false, true, true, false, true, true, false, false, false, false, false, true, false, true, true, false, true, false, true, true, false, true, true, true, true, true, false, false, false, false, false, true, true, false, true, false, true, false, false, true, false, true, true, true, false, false, true, false, false, true, false, false, false, false, true, false, true, true, true, true, false, true, true, false, false, false, false, false, true, false, true, false, true, false, true, false, false, false, false, true, false, false, true, true, false, true, true, false, true, false, false, false, false, false, true, false, true, false, false, true, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, true, true, false, false, false, true, false, true, false, true, false, false, true, true, false, true, false, false, true, true, true, false, false, false, true, false, true, true, false, false, false, false, true, false, true, true, false, false, true, true, false, false, true, true, true, false, false, false, false, true, true, true, true, false, false, false, true, true, false, true, true, true, true, true, false, true, false, false, false, false, true, false, true, false, false, false, false, false, false, true, true, true, false, true, false, true, false, false, true, true, false, true, false, false, false, false, false, false, false, true, false, false, true, true, false, true, true, true, false, true, true, true, false, false, false, true, false, false, true, true, true, true, true, true, true, true, false, false, true, false, false, false, true, true, false, false, false, false, false, true, false, false, true, false, true, false, false, false, false, false, false, false, true, false, true, true, true, true, false, false, false, false, false, true, false, false, false, false, false, true, false, false, true, false, false, true, true, false, false, true, false, false, false, false, true, true, false, false, false, false, false, true, false, true, false, false, false, false, true, false, false, false, false, true, true, false, false, false, true, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, false, false, true, true, false, false, true, false, false, false, false, false, true, false, false, false, true, false, true, false, false, false, false, true, false, false, true, false, false, false, true, false, true, false, true, false, true, true, true, false, false, true, false, true, false, false, false, false, false, false, false, true, true, true, true, true, false, false, false, false, false, false, true, true, false, false, true, false, false, true, false, false, false, true, false, false, false, true, false, false, false, false, false, true, true, false, false, false, false, false, true, true, false, true, false, false, false, false, true, false, false, true, false, true, true, true, true, false, true, false, false, false, false, false, false, true, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false, true, false, true, true, false, false, false, false, true, false, false, true, true, false, true, false, false, false, false, true, false, true, false, true, true, false, false, false, true, true, false, false, false, false, true, true, true, false, true, false, true, false, false, true, false, true, false, true, false, true, false, true, false, true, true, false, false, false, true, false, false, true, false, true, false, false, false, false, true, false, false, false, false, false, true, true, false, false, true, true, false, true, false, true, true, true, false, false, false, false, true, false, true, false, true, false, false, true, true, false, false, true, true, true, false, false, false, true, true, true, true, false, false, true, false, false, false, false, false, false, true, false, true, false, false, true, true, false, true, true, true, false, true, true, false, false, false, true, true, false, true, true, false, false, true, false, false, false, true, false, false, false, true, true, false, true, true, false, false, false, false, true, false, false, true, false, true, false, false, false, false, false, true, false, false, false, true, true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, true, true, false, false, true, false, true, true, false, true, false, true, false, false, true, true, false, true, false, false, true, false, true, false, true, false, false, false, true, true, true, true, false, false, true, false, false, false, true, false, false, true, false, false, false, false, false, false, false, false, true, true, false, true, false, true, false, false, false, false, true, false, false, false, false, true, false, false, false, true, true, false, false, true, false, false, true, true, false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, true, false, false, false, true, true, true, false, false, true, false, true, true, false, true, false, false, false, false, true, false, true, false, false, true, true, true, true, false, true, true, true, false, false, false, true, true, true, false, false, true, true, true, false, false, false, false, false, true, false, false, false, true, true, false, true, false, false, false, false, false, false, true, false, true, false, true, true, false, false, false, false, false, false, false, true, true, false, true, false, false, false, true, false, true, false, false, false, false, false, false, false, true, false, true, true, true, false, false, true, false, true, false, false, true, false, true, true, false, true, true, false, false, false, false, true, false, true, false, false, false, true, false, true, true, true, false, true, true, false, false, true, false, false, true, true, false, false, false, false, false, false, false, true, false, false, false, true, true, true, false, true, false, false, false, false, false, true, false, false, true, true, false, true, true, false, true, false, true, true, false, true, true, true, true, false, true, true, false, true, true, false, true, false, true, false, false, true, false, false, false, false, true, true, false, false, true, false, true, false, false, false, false, false, true, false, false, true, true, false, false, false, false, true, true, false, false, false, true, false, true, false, false, false, false, false, false, false, false, false, true, false, false, true, false, false, true, true, true, false, false, true, false, true, true, true, false, false, false, false, true, true, true, false, false, true, false, false, false, false, false, false, true, true, false, true, true, true, false, true, false, false, true, true, false, false, true, true, false, false, false, true, true, false, true, true, false, false, false, false, false, false, false, false, true, false, true, false, false, true, true, false, false, true, true, false, false, true, false, true, false, false, true, true, false, false, true, true, true, false, false, false, true, false, false, false, false, false, false, true, true, false, true, false, false, false, false, false, false, false, true, false, false, false, false, true, false, false, true, true, true, true, true, true, false, false, false, true, false, true, false, false, true, false, false, true, false, false, false, false, false, false, false, false, false, false, true, true, false, true, false, false, false, false, false, true, false, true, false, true, true, true, true, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, true, false, false, false, true, false, false, false, true, true, true, true, true, true, false, false, false, false, false, false, true, false, false, false, false, true, false, false, false, true, true, false, true, false, true, false, false, false, true, true, true, false, false, false, false, true, true, true, true, false, true, true, false, false, false, false, false, true, true, true, false, false, true, false, false, true, false, true, false, false, true, false, false, false, false, false, false, true, false, true, true, false, true, true, false, false, false, true, false, true, false, false, false, false, false, true, true, false, true, true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, true, true, false, false, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]; - let bytes = Vec::from_hex("00000000fd3111f0b0d11302c1a1d09e10303e000296216021ca25720525c502a8947a128a22a21061106a50a1482f4874a8046c8e220001342a0be5ccb596f0951211ed40dc830471c95b309d7828c18101953090600c03c00957238115128d93907d04a8268acb636e0088005812961380124666199c39d345305472c3bca0e11f107420c2293651809a4c2834d7985540b0b01c0b4120c94e9d53637480401c14e9264465262fac144188188e26da87a902885a0011078828a4119023c9833a741520f16911802ce2d1c20a8b0808460c3c83c006643a32a45619d800c491010684c1688170f220639f40826a598c083ac80f41e2c1a8da356c7421b11ebc824601104ffc0c44a20247b31113910f2b60a0023aa401888ab04a12caaef980801a84353d2c49600ce86bc418d357621344010bdd0ae44c241cd340444ac2910894e4463668ed83954e426f50856c4109108051598e86660e8f7da1c095056477e49f18a4801e04c98441218c00010a60822824aa53c0072611c16021bd40084843166a0c57aa1a2904b30e95399e40d98d4dc48614c480c0b4b2543c91002b84980c0c88d34279c73988056ac0a2804e6943d14d06c405d9dadb4a98820ca30092d3e1047699b101ca4c9923b080901f25015850cf002088f881102b0e6f7052026d146c40600a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap(); - let snapshot = bytes.as_slice().read_with::(&mut 0, byte::LE).unwrap(); - let len = snapshot.member_list.len() * 8 - 7; - - for i in 0..len { - assert_eq!(snapshot.member_is_true_at_index(i as u32), expected[i]); - assert_eq!(snapshot.member_list.bit_is_true_at_le_index(i as u32), expected[i]); - } - -} diff --git a/dash-spv-masternode-processor/src/tests/listdiff/llmq_verification.rs b/dash-spv-masternode-processor/src/tests/listdiff/llmq_verification.rs deleted file mode 100644 index d9aef671..00000000 --- a/dash-spv-masternode-processor/src/tests/listdiff/llmq_verification.rs +++ /dev/null @@ -1,237 +0,0 @@ -use std::collections::BTreeMap; -use std::ptr::null_mut; -use crate::bindings::common::{processor_create_cache, register_processor}; -use crate::bindings::masternode::process_mnlistdiff_from_message; -use crate::{models, types}; -use crate::ffi::from::FromFFI; -use crate::ffi::to::ToFFI; -use crate::chain::common::{ChainType, LLMQType}; -use crate::crypto::UInt256; -use crate::lib_tests::tests::{add_insight_lookup_default, assert_diff_result, get_block_hash_by_height_default, get_llmq_snapshot_by_block_hash_default, get_masternode_list_by_block_hash_from_cache, get_merkle_root_by_hash_default, hash_destroy_default, masternode_list_destroy_default, masternode_list_save_in_cache, message_from_file, save_llmq_snapshot_default, should_process_diff_with_range_default, snapshot_destroy_default, FFIContext, get_block_height_by_hash_from_context, get_cl_signature_by_block_hash_from_context, save_cl_signature_in_cache}; -use crate::tests::block_store::init_testnet_store; - -#[test] -fn testnet_llmq_verification() { - //testTestnetQuorumVerification - let bytes = message_from_file("MNL_0_122928.dat"); - let use_insight_as_backup = false; - let chain = ChainType::TestNet; - let base_masternode_list_hash: *const u8 = null_mut(); - let cache = unsafe { &mut *processor_create_cache() }; - let context = &mut FFIContext { - chain, - is_dip_0024: false, - cache, - blocks: init_testnet_store() - }; - let processor = unsafe { - register_processor( - get_merkle_root_by_hash_default, - get_block_height_by_hash_from_context, - get_block_hash_by_height_default, - get_llmq_snapshot_by_block_hash_default, - save_llmq_snapshot_default, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_by_block_hash_from_cache, - masternode_list_save_in_cache, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - let result = unsafe { process_mnlistdiff_from_message( - bytes.as_ptr(), - bytes.len(), - chain, - use_insight_as_backup, - true, - 70221, - processor, - context.cache, - context as *mut _ as *mut std::ffi::c_void, - )}; - println!("{:?}", result); - let result_119064 = result; - assert_diff_result(context, result_119064); - let result_119064 = unsafe { &*result_119064 }; - let is_valid = result_119064.is_valid(); - println!("is_valid: {}", is_valid); - if is_valid { - let bytes = message_from_file("MNL_122928_123000.dat"); - let block_hash_119064 = UInt256(unsafe { *result_119064.block_hash }); - let masternode_list_119064 = unsafe { &*result_119064.masternode_list }; - let masternode_list_119064_decoded = unsafe { masternode_list_119064.decode() }; - let masternode_list_119064_encoded = masternode_list_119064_decoded.encode(); - let result = unsafe { process_mnlistdiff_from_message( - bytes.as_ptr(), - bytes.len(), - chain, - use_insight_as_backup, - false, - 70221, - processor, - context.cache, - context as *mut _ as *mut std::ffi::c_void, - )}; - println!("{:?}", result); - assert_diff_result(context, result); - let result_119200 = unsafe { &*result }; - let masternode_list_119200 = unsafe { &*result_119200.masternode_list }; - let masternode_list_119200_decoded = unsafe { masternode_list_119200.decode() }; - let added_quorums = (0..result_119200.added_quorums_count) - .into_iter() - - .fold(BTreeMap::new(), |mut acc, i| unsafe { - let map = &*(*(result_119200.added_quorums.add(i))); - let llmq_type = map.llmq_type; - let llmq_hash = UInt256(*map.llmq_hash); - acc.entry(llmq_type) - .or_insert_with(BTreeMap::new) - .insert(llmq_hash, map.decode()); - // let entry_map = (0..map.count) - // .into_iter() - // .fold(BTreeMap::new(), |mut hacc, j| { - // let raw_entry = *(*(map.values.add(j))); - // let entry = raw_entry.decode(); - // hacc.insert(entry.llmq_hash, entry); - // hacc - // }); - // acc.insert(llmq_type, entry_map); - acc - }); - let hmm: BTreeMap> = added_quorums - .into_iter() - .filter(|(_, map)| map.contains_key(&block_hash_119064)) - .collect(); - assert!(!hmm.is_empty(), "There should be a quorum using 119064"); - // assert!(added_quorums.contains_key(&block_hash_119064), "There should be a quorum using 119064"); - // TODO: verify with QuorumValidationData (need implement BLS before) - //let quorum_to_verify = added_quorums[&block_hash_119064]; - //quorum_to_verify.validate_with_masternode_list(masternode_list_119064_decoded); - //assert!(quorum_to_verify.verified, "Unable to verify quorum"); - } -} - -unsafe extern "C" fn get_block_height_by_hash( - block_hash: *mut [u8; 32], - context: *const std::ffi::c_void, -) -> u32 { - let data: &mut FFIContext = &mut *(context as *mut FFIContext); - if let Some(block) = data.block_for_hash(UInt256(*(block_hash))) { - block.height - } else { - u32::MAX - } -} - -pub unsafe extern "C" fn masternode_list_save_119064( - block_hash: *mut [u8; 32], - masternode_list: *mut types::MasternodeList, - context: *const std::ffi::c_void, -) -> bool { - let ctx = &mut *(context as *mut FFIContext); - let h = UInt256(*(block_hash)); - let list = (*masternode_list).decode(); - // ctx.cache.mn_lists.insert(h, list); - true -} - -#[test] -fn testnet_llmq_verification_using_processor_and_cache() { - //testTestnetQuorumVerification - let bytes = message_from_file("MNL_0_122928.dat"); - let use_insight_as_backup = false; - let chain = ChainType::TestNet; - let cache = unsafe { &mut *processor_create_cache() }; - let context = &mut FFIContext { - chain, - is_dip_0024: false, - cache, - blocks: init_testnet_store() - }; - let processor = unsafe { - register_processor( - get_merkle_root_by_hash_default, - get_block_height_by_hash, - get_block_hash_by_height_default, - get_llmq_snapshot_by_block_hash_default, - save_llmq_snapshot_default, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_by_block_hash_from_cache, - masternode_list_save_119064, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - - let result = unsafe { process_mnlistdiff_from_message( - bytes.as_ptr(), - bytes.len(), - chain, - use_insight_as_backup, - false, - 70221, - processor, - context.cache, - context as *mut _ as *mut std::ffi::c_void, - )}; - - println!("{:?}", result); - assert_diff_result(context, result); - let result_119064 = unsafe { &*result }; - let is_valid = result_119064.is_valid(); - println!("is_valid: {}", is_valid); - if is_valid { - let bytes = message_from_file("MNL_122928_123000.dat"); - let block_hash_119064 = UInt256(unsafe { *result_119064.block_hash }); - let masternode_list_119064 = unsafe { &*result_119064.masternode_list }; - let masternode_list_119064_decoded = unsafe { masternode_list_119064.decode() }; - let masternode_list_119064_encoded = masternode_list_119064_decoded.encode(); - - let result = unsafe { process_mnlistdiff_from_message( - bytes.as_ptr(), - bytes.len(), - chain, - use_insight_as_backup, - false, - 70221, - processor, - context.cache, - context as *mut _ as *mut std::ffi::c_void, - )}; - - println!("{:?}", result); - assert_diff_result(context, result); - let result_119200 = unsafe { &*result }; - let masternode_list_119200 = unsafe { &*result_119200.masternode_list }; - let masternode_list_119200_decoded = unsafe { masternode_list_119200.decode() }; - let added_quorums = (0..result_119200.added_quorums_count) - .into_iter() - .fold(BTreeMap::new(), |mut acc, i| unsafe { - let map = &*(*(result_119200.added_quorums.add(i))); - let llmq_type = map.llmq_type; - let llmq_hash = UInt256(*map.llmq_hash); - acc.entry(llmq_type) - .or_insert_with(BTreeMap::new) - .insert(llmq_hash, map.decode()); - acc - }); - let hmm: BTreeMap> = added_quorums - .into_iter() - .filter(|(_, map)| map.contains_key(&block_hash_119064)) - .collect(); - assert!(!hmm.is_empty(), "There should be a quorum using 119064"); - // assert!(added_quorums.contains_key(&block_hash_119064), "There should be a quorum using 119064"); - // TODO: verify with QuorumValidationData (need implement BLS before) - //let quorum_to_verify = added_quorums[&block_hash_119064]; - //quorum_to_verify.validate_with_masternode_list(masternode_list_119064_decoded); - //assert!(quorum_to_verify.verified, "Unable to verify quorum"); - } -} diff --git a/dash-spv-masternode-processor/src/tests/listdiff/mainnet_core19.rs b/dash-spv-masternode-processor/src/tests/listdiff/mainnet_core19.rs deleted file mode 100644 index 4b63c003..00000000 --- a/dash-spv-masternode-processor/src/tests/listdiff/mainnet_core19.rs +++ /dev/null @@ -1,102 +0,0 @@ -use crate::chain::common::ChainType; -use crate::lib_tests::tests::{assert_diff_result, assert_qrinfo_result, create_default_context, message_from_file, process_mnlistdiff, process_qrinfo, register_cache, register_default_processor, register_logger}; - -// #[test] -fn test_verify_chained_rotation2() { - register_logger(); - let version = 70227; - let cache = register_cache(); - let context = &mut create_default_context(ChainType::MainNet, false, cache); - let processor = register_default_processor(); - let diffs = vec![ - "MNL_0_1870848.dat", - "MNL_1870848_1871136.dat", - "MNL_1871136_1871184.dat", - "MNL_1871184_1871208.dat", - "MNL_1871208_1871232.dat", - "MNL_1871232_1871256.dat", - "MNL_1871256_1871280.dat", - "MNL_1871280_1871304.dat", - "MNL_1871304_1871328.dat", - "MNL_1871328_1871352.dat", - "MNL_1871352_1871376.dat", - "MNL_1871376_1871400.dat", - "MNL_1871400_1871424.dat", - "MNL_1871424_1871448.dat", - "MNL_1871448_1871472.dat", - "MNL_1871472_1871496.dat", - "MNL_1871496_1871520.dat", - "MNL_1871520_1871544.dat", - "MNL_1871544_1871568.dat", - "MNL_1871568_1871592.dat", - "MNL_1871592_1871616.dat", - "MNL_1871616_1871640.dat", - "MNL_1871640_1871664.dat", - "MNL_1871664_1871688.dat", - "MNL_1871688_1871712.dat", - "MNL_1871712_1871736.dat", - "MNL_1871736_1871755.dat", - ].iter().for_each(|name| { - let result = process_mnlistdiff(message_from_file(format!("mainnet/{}", name).as_str()), processor, context, version, false, true); - assert_diff_result(context, result); - }); - context.is_dip_0024 = true; - let result = process_qrinfo(message_from_file("mainnet/QRINFO_0_1871755.dat"), processor, context, version, false, true); - let result = unsafe { &*result }; - assert_diff_result(context, result.result_at_h_4c); - assert_diff_result(context, result.result_at_h_3c); - assert_diff_result(context, result.result_at_h_2c); - assert_diff_result(context, result.result_at_h_c); - assert_diff_result(context, result.result_at_h); - assert_diff_result(context, result.result_at_tip); -} - -// #[test] -fn test_verify_chained_rotation() { - register_logger(); - let version = 70227; - let cache = register_cache(); - let context = &mut create_default_context(ChainType::MainNet, false, cache); - let processor = register_default_processor(); - let diffs = vec![ - "0_1870840", - "1870840_1871712", - "1871712_1871722", - "1871722_1871724", - "1871724_1871726", - "1871726_1871727", - "1871727_1871730", - "1871730_1871733", - "1871733_1871734", - "1871734_1871738", - "1871738_1872001", - "1872001_1872002", - "1872002_1872003", - "1872003_1872004", - "1872004_1872005", - "1872005_1872006", - "1872006_1872007", - "1872007_1872008", - "1872008_1872009", - "1872009_1872011", - "1872011_1872013", - "1872013_1872016", - "1872016_1872017", - "1872017_1872019", - "1872019_1872020", - "1872020_1872023", - "1872023_1872024", - "1872024_1872025", - "1872025_1872027", - "1872027_1872028", - "1872028_1872029", - "1872029_1872030", - "1872030_1872031", - ].iter().for_each(|name| { - let result = process_mnlistdiff(message_from_file(format!("mainnet/MNL_{}.dat", name).as_str()), processor, context, version, false, true); - assert_diff_result(context, result); - }); - context.is_dip_0024 = true; - let result = process_qrinfo(message_from_file("mainnet/QRINFO_0_1872425.dat"), processor, context, version, false, true); - assert_qrinfo_result(context, result); -} diff --git a/dash-spv-masternode-processor/src/tests/listdiff/mainnet_reload.rs b/dash-spv-masternode-processor/src/tests/listdiff/mainnet_reload.rs deleted file mode 100644 index c4645503..00000000 --- a/dash-spv-masternode-processor/src/tests/listdiff/mainnet_reload.rs +++ /dev/null @@ -1,111 +0,0 @@ -use std::collections::BTreeMap; -use crate::bindings::common::{processor_create_cache, register_processor}; -use crate::bindings::masternode::process_mnlistdiff_from_message; -use crate::ffi::from::FromFFI; -use crate::chain::common::chain_type::ChainType; -use crate::crypto::UInt256; -use crate::lib_tests::tests::{add_insight_lookup_default, assert_diff_result, get_block_hash_by_height_default, get_llmq_snapshot_by_block_hash_default, get_masternode_list_by_block_hash_from_cache, get_merkle_root_by_hash_default, hash_destroy_default, masternode_list_destroy_default, masternode_list_save_in_cache, message_from_file, save_llmq_snapshot_default, should_process_diff_with_range_default, snapshot_destroy_default, FFIContext, get_block_height_by_hash_from_context, get_cl_signature_by_block_hash_from_context, save_cl_signature_in_cache}; -use crate::models; -use crate::tests::block_store::init_mainnet_store; - -#[test] -fn test_mainnet_reload_with_processor() { - let chain = ChainType::MainNet; - let files = vec![ - "MNL_0_1090944.dat".to_string(), - "MNL_1090944_1091520.dat".to_string(), - "MNL_1091520_1091808.dat".to_string(), - "MNL_1091808_1092096.dat".to_string(), - "MNL_1092096_1092336.dat".to_string(), - "MNL_1092336_1092360.dat".to_string(), - "MNL_1092360_1092384.dat".to_string(), - "MNL_1092384_1092408.dat".to_string(), - "MNL_1092408_1092432.dat".to_string(), - "MNL_1092432_1092456.dat".to_string(), - "MNL_1092456_1092480.dat".to_string(), - "MNL_1092480_1092504.dat".to_string(), - "MNL_1092504_1092528.dat".to_string(), - "MNL_1092528_1092552.dat".to_string(), - "MNL_1092552_1092576.dat".to_string(), - "MNL_1092576_1092600.dat".to_string(), - "MNL_1092600_1092624.dat".to_string(), - "MNL_1092624_1092648.dat".to_string(), - "MNL_1092648_1092672.dat".to_string(), - "MNL_1092672_1092696.dat".to_string(), - "MNL_1092696_1092720.dat".to_string(), - "MNL_1092720_1092744.dat".to_string(), - "MNL_1092744_1092768.dat".to_string(), - "MNL_1092768_1092792.dat".to_string(), - "MNL_1092792_1092816.dat".to_string(), - "MNL_1092816_1092840.dat".to_string(), - "MNL_1092840_1092864.dat".to_string(), - "MNL_1092864_1092888.dat".to_string(), - "MNL_1092888_1092916.dat".to_string(), - ]; - let context = &mut (FFIContext { - chain, - is_dip_0024: false, - cache: &mut Default::default(), - blocks: init_mainnet_store() - }); - - let (success, lists) = load_masternode_lists_for_files(files, true, context); - assert!(success, "Unsuccessful"); - assert_eq!(lists.len(), 29, "There should be 29 models lists"); -} - -pub fn load_masternode_lists_for_files( - files: Vec, - assert_validity: bool, - context: &mut FFIContext, -) -> (bool, BTreeMap) { - let cache = unsafe { &mut *processor_create_cache() }; - let processor = unsafe { - register_processor( - get_merkle_root_by_hash_default, - get_block_height_by_hash_from_context, - get_block_hash_by_height_default, - get_llmq_snapshot_by_block_hash_default, - save_llmq_snapshot_default, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_by_block_hash_from_cache, - masternode_list_save_in_cache, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - context.cache = cache; - - for file in files { - println!("load_masternode_lists_for_files: [{}]", file); - let bytes = message_from_file(file.as_str()); - let result = unsafe { process_mnlistdiff_from_message( - bytes.as_ptr(), - bytes.len(), - context.chain, - false, - false, - 70221, - processor, - context.cache, - context as *mut _ as *mut std::ffi::c_void, - )}; - println!("result: [{:?}]", result); - //println!("MNDiff: {} added, {} modified", result.added_masternodes_count, result.modified_masternodes_count); - // println!("") - if assert_validity { - assert_diff_result(context, result); - } - let result = unsafe { &*result }; - let block_hash = UInt256(unsafe { *result.block_hash }); - let masternode_list = unsafe { &*result.masternode_list }; - let masternode_list_decoded = unsafe { masternode_list.decode() }; - } - // let c = unsafe { cache }; - let lists = context.cache.mn_lists.clone(); - (true, lists) -} diff --git a/dash-spv-masternode-processor/src/tests/listdiff/mainnet_test_invalid_mn_list_root.rs b/dash-spv-masternode-processor/src/tests/listdiff/mainnet_test_invalid_mn_list_root.rs deleted file mode 100644 index 6c9f41cd..00000000 --- a/dash-spv-masternode-processor/src/tests/listdiff/mainnet_test_invalid_mn_list_root.rs +++ /dev/null @@ -1,60 +0,0 @@ -use crate::lib_tests::tests::{add_insight_lookup_default, FFIContext, get_block_hash_by_height_from_context, get_block_height_by_hash_from_context, get_cl_signature_by_block_hash_from_context, get_llmq_snapshot_by_block_hash_from_context, get_masternode_list_by_block_hash_from_cache, get_merkle_root_by_hash_default, hash_destroy_default, masternode_list_destroy_default, masternode_list_save_in_cache, message_from_file, save_cl_signature_in_cache, save_llmq_snapshot_in_cache, should_process_diff_with_range_default, snapshot_destroy_default}; -use crate::bindings::common::register_processor; -use crate::bindings::masternode::process_mnlistdiff_from_message; -use crate::chain::common::ChainType; -use crate::tests::block_store::init_mainnet_store; -use crate::tests::json_from_core_snapshot::masternode_list_from_json; - -#[test] -fn mainnet_test_invalid_mn_list_root() { - let chain = ChainType::MainNet; - let context = &mut (FFIContext { - chain, - cache: &mut Default::default(), - is_dip_0024: false, - blocks: init_mainnet_store() - }); - let masternode_list_1761054 = masternode_list_from_json("MNLIST_1761054_1666771101.811508_saveMasternodeList.json".to_string()); - let masternode_list_1761048 = masternode_list_from_json("MNLIST_1761048_1666773093.153379_saveMasternodeList.json".to_string()); - - let bytes = message_from_file("MNL_1761054_1761100.dat"); - let processor = unsafe { - &mut *register_processor( - get_merkle_root_by_hash_default, - get_block_height_by_hash_from_context, - get_block_hash_by_height_from_context, - get_llmq_snapshot_by_block_hash_from_context, - save_llmq_snapshot_in_cache, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_by_block_hash_from_cache, - masternode_list_save_in_cache, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - processor.opaque_context = context as *mut _ as *mut std::ffi::c_void; - processor.use_insight_as_backup = true; - processor.chain_type = context.chain; - - processor.save_masternode_list(masternode_list_1761048.block_hash, &masternode_list_1761048); - processor.save_masternode_list(masternode_list_1761054.block_hash, &masternode_list_1761054); - let result = unsafe { - &*process_mnlistdiff_from_message( - bytes.as_ptr(), - bytes.len(), - chain, - false, - false, - 70221, - processor, - context.cache, - context as *mut _ as *mut std::ffi::c_void, - )}; - // println!("{:#?}", result); - // assert_diff_result(context, result); -} - diff --git a/dash-spv-masternode-processor/src/tests/listdiff/masternode_list_saving_to_disk.rs b/dash-spv-masternode-processor/src/tests/listdiff/masternode_list_saving_to_disk.rs deleted file mode 100644 index 32f4f4e0..00000000 --- a/dash-spv-masternode-processor/src/tests/listdiff/masternode_list_saving_to_disk.rs +++ /dev/null @@ -1,63 +0,0 @@ -use crate::bindings::common::{processor_create_cache, register_processor}; -use crate::bindings::masternode::process_mnlistdiff_from_message; -use crate::chain::common::chain_type::ChainType; -use crate::crypto::byte_util::UInt256; -use crate::ffi::from::FromFFI; -use crate::hashes::hex::FromHex; -use crate::lib_tests::tests::{add_insight_lookup_default, assert_diff_result, get_block_hash_by_height_default, get_llmq_snapshot_by_block_hash_default, get_masternode_list_by_block_hash_default, get_merkle_root_by_hash_default, hash_destroy_default, masternode_list_destroy_default, masternode_list_save_default, message_from_file, save_llmq_snapshot_default, should_process_diff_with_range_default, snapshot_destroy_default, FFIContext, get_block_height_by_hash_from_context, get_cl_signature_by_block_hash_from_context, save_cl_signature_in_cache}; -use crate::tests::block_store::init_testnet_store; - -#[test] -fn test_mnl_saving_to_disk() { - // testMNLSavingToDisk - let chain = ChainType::TestNet; - let bytes = message_from_file("ML_at_122088.dat"); - let cache = unsafe { &mut *processor_create_cache() }; - let context = &mut (FFIContext { - chain, - is_dip_0024: false, - cache, - blocks: init_testnet_store() - }); - let processor = unsafe { - register_processor( - get_merkle_root_by_hash_default, - get_block_height_by_hash_from_context, - get_block_hash_by_height_default, - get_llmq_snapshot_by_block_hash_default, - save_llmq_snapshot_default, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_by_block_hash_default, - masternode_list_save_default, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - let result = unsafe { process_mnlistdiff_from_message( - bytes.as_ptr(), - bytes.len(), - chain, - false, - false, - 70221, - processor, - context.cache, - context as *mut _ as *mut std::ffi::c_void, - )}; - println!("{:?}", result); - assert_diff_result(context, result); - let result = unsafe { &*result }; - let block_hash = UInt256(unsafe { *result.block_hash }); - let masternode_list = unsafe { &*result.masternode_list }; - let masternode_list_decoded = unsafe { masternode_list.decode() }; - assert_eq!( - UInt256::from_hex("94d0af97187af3b9311c98b1cf40c9c9849df0af55dc63b097b80d4cf6c816c5") - .unwrap(), - masternode_list_decoded.masternode_merkle_root.unwrap(), - "MNList merkle root should be valid" - ); -} diff --git a/dash-spv-masternode-processor/src/tests/listdiff/migration_core19.rs b/dash-spv-masternode-processor/src/tests/listdiff/migration_core19.rs deleted file mode 100644 index 2e6596f8..00000000 --- a/dash-spv-masternode-processor/src/tests/listdiff/migration_core19.rs +++ /dev/null @@ -1,72 +0,0 @@ -use crate::chain::common::{ChainType, DevnetType}; -use crate::lib_tests::tests::{assert_diff_result, assert_qrinfo_result, create_default_context, MerkleBlock, message_from_file, process_mnlistdiff, process_qrinfo, register_cache, register_default_processor, register_logger}; - -#[test] -fn test_verify_chained_rotation() { - register_logger(); - let version = 70224; - let cache = register_cache(); - let context = &mut create_default_context(ChainType::DevNet(DevnetType::Screwdriver), false, cache); - context.blocks = vec![ - MerkleBlock::reversed(4840, "0000012768da68f985b294c80ee5f8077d29aa418fc66f68589069c8c21c0b33", "1debef742e21db3326716c265ffee6fe0883020d4b7d04986c8003affe5e7e8e"), - MerkleBlock::reversed(4872, "0000029d25df5aff9374c87e303da6032c7e8ec6517842e637a79b9d6d433e46", "149d92e7610e03ea62767a1cea6305aa97e7097ceadbe7ef6c34e01c065aee08"), - MerkleBlock::reversed(4888, "0000022c2d5726c2a664b96f551f3e83c8cfc574f76ce2e9477075d582cf39dc", "74f1f7f66a576961c50d4742ea12d02de4d7724ab77798c3acbf5b99e224c069"), - MerkleBlock::reversed(4896, "000001182e5764ae984c46fb2bd78fce01948843c8f03ac9605d036e39c27e79", "e039bac930e912d448499da5bfefd7837629aaa1fb477f3a81dd5e936033ecb0"), - MerkleBlock::reversed(4920, "000000bf59863ba21575c37b7ef53497453396508f529f101b6e11575e47c234", "9db6eebef676c7672a5d6b63fefc20c51af9db743f539a16b4db2e9f5f84774b"), - MerkleBlock::reversed(4936, "00000157d5e963945c891cc074f2e449ac487504b94e416d117b7346704b1e01", "4edb31b6abbf9cf70862850d4fbbcdb76f218afac382e13e9d3a3dd4f3df68ad"), - MerkleBlock::reversed(4944, "000000995145233fe3d01ad30e4a3b857e84c9e64a3aa60279aabbfb883ab643", "eb0fceac6c75fb7a7b31d4d535969968e256c4d28d9ef51541468ba7178d6608"), - MerkleBlock::reversed(4968, "000002642837447bab0912fe7cc4d83d95ce275f97ffaaaa20cd374f0d39d95d", "1be93f2f91380dca34b339c5f09028d91b11a8379b6e94b1251095a942260253"), - MerkleBlock::reversed(4984, "000002f7cae2beaeb050f4ea23e02940b0ab3a98722b329b328ac73f9487e6f9", "feecf6a2f5303536b54ce07fe1e1746c7f03a08ada93f53f6d1160f4b68eda04"), - MerkleBlock::reversed(4992, "000000795a16ffa6de765747c7cd1fd7ad48e3a899adc4f25c2b84b122181a5c", "a971a6d8bd96b1db56f86210950301987c976ddb8ce946f3486e494c7e6ff21a"), - MerkleBlock::reversed(4993, "0000012f2a8f19afd26771c49f1e6f378cabb8a9d2256c29ed694259b6579732", "8bb97d7c0ceebac65f2c6616e262e09276e206df5a701315b6284ea6150f3b0b"), - MerkleBlock::reversed(4994, "0000018081e31ed485dbd34b73848dacfd8199d5c157ed8713862d86f8f4d5c5", "b0e5e73b09f19218333b142edf60eec11779a1dc3ec15c03e4f426ef73caa714"), - MerkleBlock::reversed(4995, "000001f651ecb6cd5e7d7a75d63b87dc553d4d9b9edbf2d395eb6186be59c64c", "a49c2d473960e492de4d997a7049cd2b21c2d15c71c6f1dad75d580b3f5b038c"), - MerkleBlock::reversed(4996, "000001ef3630a372e0dabfdb9d528bdb117b79039a67619ba4de39339638d4bc", "af1fa60f314f50f718917a9108d167e819061b30555e31516ca86d0713d92199"), - MerkleBlock::reversed(5016, "00000019ea1f2c0d5db4c929897d70c9d3bd2b12b08e3948341688699b6ae63b", "239095828fbfcb42fdac4bd64c922fac6038e1b7a002fc234f2b8797f6847715"), - MerkleBlock::reversed(5032, "00000072cae9600a36e1040831a8c266d187b035d0d1366ece465a693df3cfec", "0a57f43c1c8290a7dfb956328799c494d4d0a21ac2138b10ea047c5e89141321"), - MerkleBlock::reversed(5040, "000001ab3033f1a00490aeb9359747fd6ab1c64fb50937c0357bb5bc0334ca58", "f739d678fc728d5e7391d04431789b3f65bda33badb8a510469ef738abacea45"), - MerkleBlock::reversed(5064, "000000d1095e75090835ce87246b1dfb105c4c31fa2942a5cf553f3e83aa3faa", "215339c99a1cba055162f8a0468fb6479ba8b40ecc5d553f49c8e059dc6527e7"), - MerkleBlock::reversed(5088, "00000095908d41ade340072107f74fe6a66b3148b692f3a25df6a29d5ca23e6b", "9c645a0770ff3b47c917b49775a475bcb93cc5871d5c5cafdecf163ebbbf0f2d"), - MerkleBlock::reversed(5112, "000001ae03fa0003fd6ba6b19b812ef6b50591affb29c959496a803a5a5b00f6", "eb7ddabe2b91a5f6cc7bc4df5aaff199274df53481cfdf0a7f69a025ea1e6660"), MerkleBlock::reversed(1, "4ac35ceb629e529b2a0eb2e2676983d4b11ebddaff5bd00cae7156a02b521e6f", "3ed1169f5d3e92c4b00322b6da549dbbdfeefceb0aac81dda77a144ccbd61d67"), - MerkleBlock::reversed(5118, "0000003911af6750e5710238ee9dbab83812bf2af3dc9411e755ef2ae870c843", "b76872fec9896277e39052794cad91051a30759c618acf4c079d8e45180a864d"), - MerkleBlock::reversed(5140, "000001321487a80eefd7f6137da9bb9b06f19143cbdaa15cfda63753bd8eee46", "c344d520890dc4e1f16be687e359b13578e74ae14d01183ca417650d7498eb81"), - ]; - let processor = register_default_processor(); - // let result = process_mnlistdiff(message_from_file("devnet-screwdriver/MNL_1_5040.dat"), processor, context, version, false, true); - // assert_diff_result(context, result); - let result = process_mnlistdiff(message_from_file("devnet-screwdriver/MNL_1_4968.dat"), processor, context, version, false, true); - assert_diff_result(context, result); - - let result = process_mnlistdiff(message_from_file("devnet-screwdriver/MNL_4968_4992.dat"), processor, context, version, false, true); - assert_diff_result(context, result); - let result = process_mnlistdiff(message_from_file("devnet-screwdriver/MNL_4992_4993.dat"), processor, context, version, false, true); - assert_diff_result(context, result); - let result = process_mnlistdiff(message_from_file("devnet-screwdriver/MNL_4993_4994.dat"), processor, context, version, false, true); - assert_diff_result(context, result); - let result = process_mnlistdiff(message_from_file("devnet-screwdriver/MNL_4994_4995.dat"), processor, context, version, false, true); - assert_diff_result(context, result); - let result = process_mnlistdiff(message_from_file("devnet-screwdriver/MNL_4995_4996.dat"), processor, context, version, false, true); - assert_diff_result(context, result); - let result = process_mnlistdiff(message_from_file("devnet-screwdriver/MNL_4996_5016.dat"), processor, context, version, false, true); - assert_diff_result(context, result); - let result = process_mnlistdiff(message_from_file("devnet-screwdriver/MNL_5016_5032.dat"), processor, context, version, false, true); - assert_diff_result(context, result); - let result = process_mnlistdiff(message_from_file("devnet-screwdriver/MNL_5032_5040.dat"), processor, context, version, false, true); - assert_diff_result(context, result); - - let result = process_mnlistdiff(message_from_file("devnet-screwdriver/MNL_5040_5064.dat"), processor, context, version, false, true); - assert_diff_result(context, result); - let result = process_mnlistdiff(message_from_file("devnet-screwdriver/MNL_5064_5088.dat"), processor, context, version, false, true); - assert_diff_result(context, result); - let result = process_mnlistdiff(message_from_file("devnet-screwdriver/MNL_5088_5112.dat"), processor, context, version, false, true); - assert_diff_result(context, result); - let result = process_mnlistdiff(message_from_file("devnet-screwdriver/MNL_5112_5140.dat"), processor, context, version, false, true); - assert_diff_result(context, result); - - - context.is_dip_0024 = true; - let result = process_qrinfo(message_from_file("devnet-screwdriver/QRINFO_1_5140.dat"), processor, context, version, false, true); - assert_qrinfo_result(context, result); - let result = process_qrinfo(message_from_file("devnet-screwdriver/QRINFO_5032_5140.dat"), processor, context, version, false, true); - assert_qrinfo_result(context, result); -} diff --git a/dash-spv-masternode-processor/src/tests/listdiff/mod.rs b/dash-spv-masternode-processor/src/tests/listdiff/mod.rs index 851c6f9f..529ca245 100644 --- a/dash-spv-masternode-processor/src/tests/listdiff/mod.rs +++ b/dash-spv-masternode-processor/src/tests/listdiff/mod.rs @@ -1,19 +1,2 @@ -pub mod quorum_issue; -pub mod test_quorums_from_dash_core_snapshot; -pub mod llmq_rotation; -pub mod llmq_rotation_testnet; -pub mod llmq_snapshot; -pub mod llmq_verification; -pub mod mainnet_reload; -pub mod mainnet_test_invalid_mn_list_root; -pub mod masternode_list_diff_1; -pub mod masternode_list_diff_2; -pub mod masternode_list_saving_to_disk; -pub mod test_basic_bls_scheme; -pub mod test_mainnet_checkpoints; -pub mod testnet_test_retrieving; pub mod testnet_core19; -pub mod migration_core19; -pub mod mainnet_core19; -pub mod absinthe_core20; -pub mod core20_testnet; + diff --git a/dash-spv-masternode-processor/src/tests/listdiff/test_basic_bls_scheme.rs b/dash-spv-masternode-processor/src/tests/listdiff/test_basic_bls_scheme.rs deleted file mode 100644 index 703439b0..00000000 --- a/dash-spv-masternode-processor/src/tests/listdiff/test_basic_bls_scheme.rs +++ /dev/null @@ -1,321 +0,0 @@ -use std::collections::BTreeMap; -use std::ptr::null_mut; -use bls_signatures::G1Element; -use hashes::hex::{FromHex, ToHex}; -use crate::{models, types}; -use crate::bindings::common::{processor_create_cache, register_processor}; -use crate::bindings::masternode::process_mnlistdiff_from_message; -use crate::chain::common::{ChainType, DevnetType}; -use crate::crypto::{UInt256, UInt384}; -use crate::crypto::byte_util::Zeroable; -use crate::ffi::boxer::boxed; -use crate::ffi::to::ToFFI; -use crate::keys::BLSKey; -use crate::lib_tests::tests::{add_insight_lookup_default, assert_diff_result, FFIContext, get_block_height_by_hash_from_context, get_block_hash_by_height_from_context, get_llmq_snapshot_by_block_hash_default, get_merkle_root_by_hash_default, hash_destroy_default, masternode_list_destroy_default, masternode_list_save_in_cache, MerkleBlock, message_from_file, save_llmq_snapshot_in_cache, should_process_diff_with_range_default, snapshot_destroy_default, register_logger, get_cl_signature_by_block_hash_from_context, save_cl_signature_in_cache}; -use crate::models::OperatorPublicKey; -use crate::tests::block_store::init_testnet_store; - -unsafe extern "C" fn get_merkle_root_for_chacha( - block_hash: *mut [u8; 32], - _context: *const std::ffi::c_void, -) -> *mut u8 { - let h = UInt256(*(block_hash)); - // for block_hash '9993903c63b96f9a3846692535a11da2525561f0d61c7d31b7222bfddf020000': - let merkle_root = - UInt256::from_hex("42a84456a608ade07581c35e1087634743f6293c56dbdc01930ad97df0f08b2e") - .unwrap(); - println!("get_merkle_root_for_chacha: {}: {}", h, merkle_root); - boxed(merkle_root.0) as *mut _ -} - -unsafe extern "C" fn get_block_height_by_hash_chacha( - block_hash: *mut [u8; 32], - _context: *const std::ffi::c_void, -) -> u32 { - let h = UInt256(*(block_hash)); - let orig_s = h.clone().to_string(); - match orig_s.as_str() { - "8862eca4bdb5255b51dc72903b8a842f6ffe7356bc40c7b7a7437b8e4556e220" => 1, - "3a29104cd905e2a584d5f1844a0f421a2af0fd9ad7840a0ebb097a628d1b0000" => 9192, - "9993903c63b96f9a3846692535a11da2525561f0d61c7d31b7222bfddf020000" => 9247, - _ => u32::MAX, - } -} -unsafe extern "C" fn get_block_hash_by_height_chacha( - block_height: u32, - _context: *const std::ffi::c_void, -) -> *mut u8 { - match block_height { - 9192 => boxed(UInt256::from_hex("3a29104cd905e2a584d5f1844a0f421a2af0fd9ad7840a0ebb097a628d1b0000").unwrap().0) as *mut _, - 9184 => boxed(UInt256::from_hex("3a29104cd905e2a584d5f1844a0f421a2af0fd9ad7840a0ebb097a628d1b0000").unwrap().0) as *mut _, - 9160 => boxed(UInt256::from_hex("3a29104cd905e2a584d5f1844a0f421a2af0fd9ad7840a0ebb097a628d1b0000").unwrap().0) as *mut _, - 9136 => boxed(UInt256::from_hex("3a29104cd905e2a584d5f1844a0f421a2af0fd9ad7840a0ebb097a628d1b0000").unwrap().0) as *mut _, - 9120 => boxed(UInt256::from_hex("3a29104cd905e2a584d5f1844a0f421a2af0fd9ad7840a0ebb097a628d1b0000").unwrap().0) as *mut _, - // 9112 => boxed(UInt256::from_hex("3a29104cd905e2a584d5f1844a0f421a2af0fd9ad7840a0ebb097a628d1b0000").unwrap().0) as *mut _, - _ => null_mut() - } -} - -pub unsafe extern "C" fn get_masternode_list_at_9192( - block_hash: *mut [u8; 32], - context: *const std::ffi::c_void, -) -> *mut types::MasternodeList { - let h = UInt256(*(block_hash)); - let nodes = BTreeMap::new(); - let quorums = BTreeMap::new(); - let list = models::MasternodeList::new(nodes, quorums, h, 9192, true); - let encoded = list.encode(); - boxed(encoded) -} - - -#[test] -fn test_basic_bls_scheme() { - let chain = ChainType::DevNet(DevnetType::Chacha); - let processor = unsafe { - register_processor( - get_merkle_root_for_chacha, - get_block_height_by_hash_chacha, - get_block_hash_by_height_chacha, - get_llmq_snapshot_by_block_hash_default, - save_llmq_snapshot_in_cache, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_at_9192, - masternode_list_save_in_cache, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - let cache = unsafe { &mut *processor_create_cache() }; - let context = &mut (FFIContext { - chain, - is_dip_0024: false, - cache, - blocks: vec![] - }) as *mut _ as *mut std::ffi::c_void; - let bytes = message_from_file("MNL_1_9247.dat"); - let result = unsafe { process_mnlistdiff_from_message( - bytes.as_ptr(), - bytes.len(), - chain, - false, - true, - 70225, - processor, - cache, - context, - )}; - println!("Result: {:#?}", &result); -} - -unsafe extern "C" fn get_merkle_root_for_mojito( - block_hash: *mut [u8; 32], - _context: *const std::ffi::c_void, -) -> *mut u8 { - let h = UInt256(*(block_hash)); - // 720ea2e4e7f6b31debe9bb852e1e4cdfdf10bed9827f0ef6527cfa0261010000 -> f0597c739df147363e06988fb4132dde4fbc66418b28a4e5d74e552ad2d555d0 - let merkle_root = UInt256::from_hex("f0597c739df147363e06988fb4132dde4fbc66418b28a4e5d74e552ad2d555d0") - .unwrap(); - println!("get_merkle_root_for_mojito: {}: {}", h, merkle_root); - boxed(merkle_root.0) as *mut _ -} -unsafe extern "C" fn get_block_height_by_hash_mojito( - block_hash: *mut [u8; 32], - _context: *const std::ffi::c_void, -) -> u32 { - let h = UInt256(*(block_hash)); - let orig_s = h.clone().to_string(); - match orig_s.as_str() { - "739507391fa00da48a2ecae5df3b5e40b4432243603db6dafe33ca6b4966e357" => 1, - "720ea2e4e7f6b31debe9bb852e1e4cdfdf10bed9827f0ef6527cfa0261010000" => 4450, - _ => u32::MAX, - } -} -unsafe extern "C" fn get_block_hash_by_height_mojito( - block_height: u32, - _context: *const std::ffi::c_void, -) -> *mut u8 { - match block_height { - 1 => boxed(UInt256::from_hex("739507391fa00da48a2ecae5df3b5e40b4432243603db6dafe33ca6b4966e357").unwrap().0) as *mut _, - 4450 => boxed(UInt256::from_hex("720ea2e4e7f6b31debe9bb852e1e4cdfdf10bed9827f0ef6527cfa0261010000").unwrap().0) as *mut _, - _ => null_mut() - } -} -pub unsafe extern "C" fn get_masternode_list_mojito( - block_hash: *mut [u8; 32], - context: *const std::ffi::c_void, -) -> *mut types::MasternodeList { - null_mut() - // let h = UInt256(*(block_hash)); - // let nodes = BTreeMap::new(); - // let quorums = BTreeMap::new(); - // let list = models::MasternodeList::new(nodes, quorums, h, 9192, true); - // let encoded = list.encode(); - // boxed(encoded) -} - -unsafe extern "C" fn get_merkle_root_for_white_russian( - block_hash: *mut [u8; 32], - _context: *const std::ffi::c_void, -) -> *mut u8 { - let h = UInt256(*(block_hash)); - // 720ea2e4e7f6b31debe9bb852e1e4cdfdf10bed9827f0ef6527cfa0261010000 -> f0597c739df147363e06988fb4132dde4fbc66418b28a4e5d74e552ad2d555d0 - let merkle_root = UInt256::from_hex("f0597c739df147363e06988fb4132dde4fbc66418b28a4e5d74e552ad2d555d0") - .unwrap(); - println!("get_merkle_root_for_white_russian: {}: {}", h, merkle_root); - boxed(merkle_root.0) as *mut _ -} - -unsafe extern "C" fn get_block_hash_by_height_white_russian( - block_height: u32, - _context: *const std::ffi::c_void, -) -> *mut u8 { - println!("get_block_hash_by_height_white_russian: {}", block_height); - match block_height { - 1 => boxed(UInt256::from_hex("739507391fa00da48a2ecae5df3b5e40b4432243603db6dafe33ca6b4966e357").unwrap().0) as *mut _, - 4450 => boxed(UInt256::from_hex("720ea2e4e7f6b31debe9bb852e1e4cdfdf10bed9827f0ef6527cfa0261010000").unwrap().0) as *mut _, - _ => null_mut() - } -} - -//#[test] -fn test_core_19_beta_6() { - let chain = ChainType::DevNet(DevnetType::WhiteRussian); - let processor = unsafe { - register_processor( - get_merkle_root_by_hash_default, - get_block_height_by_hash_from_context, - get_block_hash_by_height_from_context, - get_llmq_snapshot_by_block_hash_default, - save_llmq_snapshot_in_cache, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_mojito, - masternode_list_save_in_cache, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - let cache = unsafe { &mut *processor_create_cache() }; - let context = &mut (FFIContext { - chain, - is_dip_0024: false, - cache, - blocks: vec![ - MerkleBlock::new(1, "9163d6958065ca5e73c36f0f2474ce618846260c215f5cba633bd0003585cb35", "dede0aec9516671ae39789b532e3bd08d7cf2f950d8559b963757578a19e65b6"), - MerkleBlock::new(4765, "574e8d4a407fd54b9c0ec1ec0eb76e0a9ebc39cf4846356d8b32aab3e5000000", "888e68ec280bfbc012d7cce43e34faf790165f75e6c77ada040f20657e2c97db"), - ] - }); - let bytes = message_from_file("MNL_1_4765.dat"); - let result = unsafe { process_mnlistdiff_from_message( - bytes.as_ptr(), - bytes.len(), - chain, - false, - true, - 70227, - processor, - context.cache, - context as *mut _ as *mut std::ffi::c_void, - )}; - assert_diff_result(context, result); -} - -#[test] -fn test_bls_migration() { - register_logger(); - let chain_type = ChainType::TestNet; - let bytes = Vec::from_hex("0000000104971efda88000000399eb1756922d7c107de051561deb0104612b6e96d273606c4277d7700f5f5a380bac7e5f4adc010f59973fc637cb7aed41ac52771a58c1f7c0978067be0ab44cf4b60d95ae9bdfe2e35d06f83cff7fbc").unwrap(); - match BLSKey::migrate_from_legacy_extended_public_key_data(&bytes) { - Ok(key) => { - assert!(key.seckey.is_zero()); - assert_eq!(key.pubkey.0.to_hex(), "8bac7e5f4adc010f59973fc637cb7aed41ac52771a58c1f7c0978067be0ab44cf4b60d95ae9bdfe2e35d06f83cff7fbc"); - assert_eq!(key.chaincode.0.to_hex(), "99eb1756922d7c107de051561deb0104612b6e96d273606c4277d7700f5f5a38"); - assert_eq!(key.extended_public_key_data.to_hex(), "0000000104971efda88000000399eb1756922d7c107de051561deb0104612b6e96d273606c4277d7700f5f5a388bac7e5f4adc010f59973fc637cb7aed41ac52771a58c1f7c0978067be0ab44cf4b60d95ae9bdfe2e35d06f83cff7fbc"); - assert!(!key.use_legacy); - }, - Err(err) => panic!("Can't migrate bls key from extended public key data: {err}") - } -} - -#[test] -fn test_core_19_rc_2_testnet() { - let chain = ChainType::TestNet; - let processor = unsafe { - register_processor( - get_merkle_root_by_hash_default, - get_block_height_by_hash_from_context, - get_block_hash_by_height_from_context, - get_llmq_snapshot_by_block_hash_default, - save_llmq_snapshot_in_cache, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_mojito, - masternode_list_save_in_cache, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - let cache = unsafe { &mut *processor_create_cache() }; - let context = &mut (FFIContext { - chain, - is_dip_0024: false, - cache, - blocks: init_testnet_store() - }); - let bytes = message_from_file("testnet/MNL_TESTNET_CORE_19.dat"); - let result = unsafe { process_mnlistdiff_from_message( - bytes.as_ptr(), - bytes.len(), - chain, - false, - true, - 70223, - processor, - context.cache, - context as *mut _ as *mut std::ffi::c_void, - )}; - let result = unsafe { &*result }; - println!("Result: {:#?}", &result); - // todo: need add new blocks to the testnet store - //assert_diff_result(context, result); -} - -#[test] -fn test_legacy_basic_conversion() { - let chain_type = ChainType::TestNet; - let block_height = 530000; - let legacy_key = OperatorPublicKey { - data: UInt384::from_hex("16ca29d03ef4897a22fe467bb58c52448c63bb29534502305e8ff142ac03907fae0851ff2528e4878ef51bfa3d5a1f22").unwrap(), - version: 1 - }; - let basic_key = OperatorPublicKey { - data: UInt384::from_hex("96ca29d03ef4897a22fe467bb58c52448c63bb29534502305e8ff142ac03907fae0851ff2528e4878ef51bfa3d5a1f22").unwrap(), - version: 2, - }; - assert_eq!(UInt384(*G1Element::from_bytes(&basic_key.data.0).unwrap().serialize_legacy()), legacy_key.data); - - let bk1 = UInt384::from_hex("981ab9848a9eba75643cde7f3ae8c2d3ba1efe36ba9dbbd2162437780f35493f9ed327220a5a0e60d5ae2793f5a75525").unwrap(); - println!("{}", UInt384(*G1Element::from_bytes(&bk1.0).unwrap().serialize_legacy())); - // println!("{}", UInt384(*G1Element::from_bytes(&bk1.0).unwrap().serialize())); - // println!("{}", UInt384(*G1Element::from_bytes_legacy(&bk1.0).unwrap().serialize())); - println!("{}", UInt384(*G1Element::from_bytes_legacy(&bk1.0).unwrap().serialize_legacy())); - - let bk1 = UInt384::from_hex("158367af44572fbd35b475ca6259e1c499eefcbd5573ded52917c45cd2c8a0aa2e4ac9fd25ecdf1ef548750d2caf3ee3").unwrap(); - // println!("{}", UInt384(*G1Element::from_bytes(&bk1.0).unwrap().serialize_legacy())); - // println!("{}", UInt384(*G1Element::from_bytes(&bk1.0).unwrap().serialize())); - println!("{}", UInt384(*G1Element::from_bytes_legacy(&bk1.0).unwrap().serialize())); - println!("{}", UInt384(*G1Element::from_bytes_legacy(&bk1.0).unwrap().serialize_legacy())); - - -} diff --git a/dash-spv-masternode-processor/src/tests/listdiff/test_mainnet_checkpoints.rs b/dash-spv-masternode-processor/src/tests/listdiff/test_mainnet_checkpoints.rs deleted file mode 100644 index 3292ebd3..00000000 --- a/dash-spv-masternode-processor/src/tests/listdiff/test_mainnet_checkpoints.rs +++ /dev/null @@ -1,55 +0,0 @@ -use crate::bindings::common::register_processor; -use crate::bindings::masternode::process_mnlistdiff_from_message; -use crate::chain::common::ChainType; -use crate::lib_tests::tests::{add_insight_lookup_default, FFIContext, get_block_hash_by_height_from_context, get_block_height_by_hash_from_context, get_cl_signature_by_block_hash_from_context, get_llmq_snapshot_by_block_hash_from_context, get_masternode_list_by_block_hash_from_cache, get_merkle_root_by_hash_default, hash_destroy_default, masternode_list_destroy_default, masternode_list_save_in_cache, message_from_file, save_cl_signature_in_cache, save_llmq_snapshot_in_cache, should_process_diff_with_range_default, snapshot_destroy_default}; -use crate::tests::block_store::init_mainnet_store; - -#[test] -fn test_mainnet_checkpoint_1720000() { - /*{ - 1720000, - "000000000000001ef1f8a3d33bbe304c1d12f59f2c8aa989099dc215fd10903e", - 1660295895, - 0x19362176u, - "ML1720000", - "67c6348c35bc42aa4cabd25e29560f5d22c6a9fba274bf0c52fe73021d0e8d5e", - "000000000000000000000000000000000000000000007715a9ae4dd7ff1d3902" - }*/ - - let chain = ChainType::MainNet; - let context = &mut (FFIContext { chain, is_dip_0024: false, cache: &mut Default::default(), blocks: init_mainnet_store() }); - let bytes = message_from_file("ML1720000.dat"); - let processor = unsafe { - &mut *register_processor( - get_merkle_root_by_hash_default, - get_block_height_by_hash_from_context, - get_block_hash_by_height_from_context, - get_llmq_snapshot_by_block_hash_from_context, - save_llmq_snapshot_in_cache, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_by_block_hash_from_cache, - masternode_list_save_in_cache, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - let result = unsafe { - &*process_mnlistdiff_from_message( - bytes.as_ptr(), - bytes.len(), - chain, - false, - true, - 70221, - processor, - context.cache, - context as *mut _ as *mut std::ffi::c_void, - ) - }; - - assert!(result.is_valid(), "Result must be valid"); -} diff --git a/dash-spv-masternode-processor/src/tests/listdiff/test_quorums_from_dash_core_snapshot.rs b/dash-spv-masternode-processor/src/tests/listdiff/test_quorums_from_dash_core_snapshot.rs deleted file mode 100644 index 5209f18d..00000000 --- a/dash-spv-masternode-processor/src/tests/listdiff/test_quorums_from_dash_core_snapshot.rs +++ /dev/null @@ -1,89 +0,0 @@ -use crate::bindings::common::{processor_create_cache, register_processor}; -use crate::chain::common::{ChainType, IHaveChainSettings}; -use crate::crypto::{byte_util::Reversable, UInt256}; -use crate::lib_tests::tests::{add_insight_lookup_default, FFIContext, get_block_hash_by_height_from_context, get_block_height_by_hash_from_context, get_cl_signature_by_block_hash_from_context, get_llmq_snapshot_by_block_hash_default, get_masternode_list_by_block_hash_default, get_merkle_root_by_hash_default, hash_destroy_default, masternode_list_destroy_default, masternode_list_save_default, message_from_file, save_cl_signature_in_cache, save_llmq_snapshot_default, should_process_diff_with_range_default, snapshot_destroy_default}; -use crate::tests::block_store::init_testnet_store; -use crate::tests::json_from_core_snapshot::{masternode_list_from_genesis_diff, QRInfo, snapshot_to_snapshot}; - -#[test] -pub fn test_from_snapshot() { - let qrinfo: QRInfo = serde_json::from_slice(&message_from_file("snapshot_0000021715c8575620382ceee42cc7556bac5ed395eaf9c75e2119aa2876a1e0.json")).unwrap(); - let chain = ChainType::TestNet; - let cache = unsafe { &mut *processor_create_cache() }; - let context = &mut (FFIContext { - chain, - is_dip_0024: true, - cache, - blocks: init_testnet_store() - }); - let block_height_lookup = |hash: UInt256| context.block_for_hash(hash).unwrap().height; - let quorum_snapshot_h_c = snapshot_to_snapshot(qrinfo.quorum_snapshot_at_hminus_c); - let quorum_snapshot_h_2c = snapshot_to_snapshot(qrinfo.quorum_snapshot_at_hminus2c); - let quorum_snapshot_h_3c = snapshot_to_snapshot(qrinfo.quorum_snapshot_at_hminus3c); - let mn_list_diff_tip = masternode_list_from_genesis_diff(qrinfo.mn_list_diff_tip, block_height_lookup, false); - let mn_list_diff_h = masternode_list_from_genesis_diff(qrinfo.mn_list_diff_h, block_height_lookup, false); - let mn_list_diff_h_c = masternode_list_from_genesis_diff(qrinfo.mn_list_diff_at_hminus_c, block_height_lookup, false); - let mn_list_diff_h_2c = masternode_list_from_genesis_diff(qrinfo.mn_list_diff_at_hminus2c, block_height_lookup, false); - let mn_list_diff_h_3c = masternode_list_from_genesis_diff(qrinfo.mn_list_diff_at_hminus3c, block_height_lookup, false); - let processor = unsafe { &mut *register_processor( - get_merkle_root_by_hash_default, - get_block_height_by_hash_from_context, - get_block_hash_by_height_from_context, - get_llmq_snapshot_by_block_hash_default, - save_llmq_snapshot_default, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_by_block_hash_default, - masternode_list_save_default, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default) - }; - processor.opaque_context = context as *mut _ as *mut std::ffi::c_void; - processor.use_insight_as_backup = true; - processor.chain_type = context.chain; - - println!("rotated_quorums at h ({}: {})", mn_list_diff_h.block_height, mn_list_diff_h.block_hash); - let cached_blocks = &context.blocks; - let get_height = |hash: UInt256| cached_blocks.iter().find(|block| block.hash == hash.reversed()).unwrap().height; - let cached_llmq_members = &mut context.cache.llmq_members; - let cached_llmq_indexed_members = &mut context.cache.llmq_indexed_members; - - mn_list_diff_h.added_quorums.iter().filter(|q| q.llmq_type == chain.isd_llmq_type()).for_each(|entry| { - println!("rotated_quorum: ({}: {})", entry.llmq_hash, entry.llmq_hash.reversed()); - let llmq_block_height = get_height(entry.llmq_hash); - println!("rotated_quorum: ({}: {})\n {:#?}", llmq_block_height, entry.llmq_hash, entry); - - let masternodes = processor.get_rotated_masternodes_for_quorum( - entry.llmq_type, - entry.llmq_hash, - llmq_block_height, - cached_llmq_members, - cached_llmq_indexed_members, - &context.cache.mn_lists, - &context.cache.llmq_snapshots, - &context.cache.cl_signatures, - &mut context.cache.needed_masternode_lists, - false - ); - println!("masternodes: {:#?}", masternodes); - }); - - // let masternodes = processor - // .get_rotated_masternodes_for_quorum(chain.isd_llmq_type(), mn_list_diff_h.added_quorums) - - - // let result_at_tip = processor.get_list_diff_result_internal_with_base_lookup(mn_list_diff_tip, cache); - // let result_at_h = processor.get_list_diff_result_internal_with_base_lookup(mn_list_diff_h, cache); - // let result_at_h_c = processor.get_list_diff_result_internal_with_base_lookup(mn_list_diff_h_c, cache); - // let result_at_h_2c = processor.get_list_diff_result_internal_with_base_lookup(mn_list_diff_h_2c, cache); - // let result_at_h_3c = processor.get_list_diff_result_internal_with_base_lookup(mn_list_diff_h_3c, cache); - // println!("result_at_tip: {:#?}", result_at_tip); - // println!("result_at_h: {:#?}", result_at_h); - // println!("result_at_h_c: {:#?}", result_at_h_c); - // println!("result_at_h_2c: {:#?}", result_at_h_2c); - // println!("result_at_h_3c: {:#?}", result_at_h_3c); -} - diff --git a/dash-spv-masternode-processor/src/tests/listdiff/testnet_core19.rs b/dash-spv-masternode-processor/src/tests/listdiff/testnet_core19.rs index 26a33fb0..733a71f5 100644 --- a/dash-spv-masternode-processor/src/tests/listdiff/testnet_core19.rs +++ b/dash-spv-masternode-processor/src/tests/listdiff/testnet_core19.rs @@ -1,209 +1,72 @@ -use std::collections::BTreeMap; use bls_signatures::{BasicSchemeMPL, G1Element, G2Element, Scheme}; -use hashes::hex::FromHex; -use crate::chain::common::{ChainType, LLMQType}; -use crate::common::{LLMQVersion, SocketAddress}; -use crate::common::MasternodeType::{HighPerformance, Regular}; -use crate::consensus::encode::VarInt; -use crate::crypto::{UInt128, UInt160, UInt256, UInt384, UInt768}; -use crate::ffi::from::FromFFI; -use crate::keys::BLSKey; -use crate::lib_tests::tests::{assert_diff_result, create_default_context, message_from_file, process_mnlistdiff, process_qrinfo, register_cache, register_default_processor, register_logger}; -use crate::models::{LLMQEntry, MasternodeEntry, OperatorPublicKey}; - -// #[test] -fn test_core19rc10() { - // 85.209.243.24 (/Dash Core:18.2.1/ protocol 70227) - let cache = register_cache(); - let context = &mut create_default_context(ChainType::TestNet, false, cache); - let processor = register_default_processor(); - let result = process_mnlistdiff(message_from_file("testnet/MNT530000.dat"), processor, context, 70219, false, true); - assert_diff_result(context, result); - let result = unsafe { &*result }; - unsafe { - context.cache.mn_lists.insert(UInt256(*result.block_hash), (*result.masternode_list).decode()); - } - // let result = process_mnlistdiff(message_from_file("MNL_530000_867700.dat".to_string()), processor, context, 70227); - let result = process_mnlistdiff(message_from_file("MNL_530000_867700.dat"), processor, context, 70227, false, true); - // let result = process_mnlistdiff(message_from_file("MNL_530000_867700.dat".to_string()), processor, context, 70227); - assert_diff_result(context, result); -} - -// #[test] -fn test_core19_70224() { - let cache = register_cache(); - let context = &mut create_default_context(ChainType::TestNet, false, cache); - let processor = register_default_processor(); - let result = process_mnlistdiff(message_from_file("testnet/MNT530000.dat"), processor, context, 70219, false, true); - assert_diff_result(context, result); - let result = unsafe { &*result }; - unsafe { - context.cache.mn_lists.insert(UInt256(*result.block_hash), (*result.masternode_list).decode()); - } - let result = process_mnlistdiff(message_from_file("MNL_530000_868301.dat"), processor, context, 70224, false, true); - // let result = process_mnlistdiff(message_from_file("MNL_530000_868301.dat"), processor, context, 70227); - assert_diff_result(context, result); -} - -// #[test] -fn test_core19_70227() { - let cache = register_cache(); - let context = &mut create_default_context(ChainType::TestNet, false, cache); - let processor = register_default_processor(); - let result = process_mnlistdiff(message_from_file("testnet/MNT530000.dat"), processor, context, 70219, false, true); - let result = unsafe { &*result }; - // assert_diff_result(context, result); - unsafe { - let list = (*result.masternode_list).decode(); - context.cache.mn_lists.insert(UInt256(*result.block_hash), list); - } - let result = process_mnlistdiff(message_from_file("testnet/MNL_530000_868321.dat"), processor, context, 70227, false, true); - assert_diff_result(context, result); -} - -// #[test] -fn test_mnlistdiff_and_qrinfo_core19() { - register_logger(); - let version = 70227; - let cache = register_cache(); - let context = &mut create_default_context(ChainType::TestNet, false, cache); - let processor = register_default_processor(); - let diffs = vec![ - "MNL_0_868888.dat", - "MNL_0_869464.dat", - "MNL_0_869760.dat", - "MNL_868888_869176.dat", - "MNL_869176_869464.dat", - "MNL_869464_869752.dat", - "MNL_869752_869760.dat", - "MNL_869760_869761.dat", - "MNL_869761_869762.dat", - "MNL_869762_869763.dat", - "MNL_869763_869764.dat", - "MNL_869764_869765.dat", - "MNL_869765_869766.dat", - "MNL_869766_869767.dat", - "MNL_869767_869768.dat", - "MNL_869768_869769.dat", - "MNL_869769_869770.dat", - "MNL_869770_869771.dat", - "MNL_869771_869772.dat", - "MNL_869772_869773.dat", - "MNL_869773_869774.dat", - "MNL_869774_869775.dat", - "MNL_869775_869776.dat", - "MNL_869776_869777.dat", - "MNL_869777_869778.dat", - "MNL_869778_869779.dat", - "MNL_869779_869780.dat", - "MNL_869780_869781.dat", - "MNL_869781_869782.dat", - "MNL_869782_869783.dat", - "MNL_869783_869784.dat", - "MNL_869784_869785.dat", - "MNL_869785_869786.dat", - "MNL_869786_869787.dat", - "MNL_869787_869788.dat", - "MNL_869788_869789.dat", - "MNL_869789_869790.dat", - "MNL_869790_869791.dat", - ].iter().for_each(|name| { - let result = process_mnlistdiff(message_from_file(name), processor, context, version, false, true); - assert_diff_result(context, result); - }); - context.is_dip_0024 = true; - let result = process_qrinfo(message_from_file("QRINFO_0_870235.dat"), processor, context, version, false, true); - let result = unsafe { &*result }; - assert_diff_result(context, result.result_at_h_4c); - assert_diff_result(context, result.result_at_h_3c); - assert_diff_result(context, result.result_at_h_2c); - assert_diff_result(context, result.result_at_h_c); - //assert_diff_result(context, result.result_at_h); - assert_diff_result(context, result.result_at_tip); -} - -// #[test] -fn test_qrinfo_core19() { - register_logger(); - let cache = register_cache(); - let context = &mut create_default_context(ChainType::TestNet, true, cache); - let processor = register_default_processor(); - let result = process_qrinfo(message_from_file("QRINFO_0_870235.dat"), processor, context, 70227, false, true); - let result = unsafe { &*result }; - assert_diff_result(context, result.result_at_h_4c); - assert_diff_result(context, result.result_at_h_3c); - assert_diff_result(context, result.result_at_h_2c); - assert_diff_result(context, result.result_at_h_c); - assert_diff_result(context, result.result_at_h); - assert_diff_result(context, result.result_at_tip); - -} +use dashcore::hashes::hex::FromHex; +use dash_spv_crypto::keys::{BLSKey, OperatorPublicKey}; // #[test] fn test_verify_secure() { - let commitment_hash = UInt256::from_hex("ccabc0460e2dd8ea83966cf675175e6f37bfa20c162ae773b89827664e8dc8e5").unwrap(); - let signature = UInt768::from_hex("88bf53b96714f2d8901922fd8e3e39400c0d85f9ad218ad56344ec5d0dd04b6ab04b668d8ebb814357c716a59363b9f816c5d682c4c8508a44d25cd49fe4248ea216a9410a54fbe6ba931432f2fa88c4b01cf07818331c4fae6e41534feffa3e").unwrap(); + let commitment_hash = <[u8; 32]>::from_hex("ccabc0460e2dd8ea83966cf675175e6f37bfa20c162ae773b89827664e8dc8e5").unwrap(); + let signature = <[u8; 96]>::from_hex("88bf53b96714f2d8901922fd8e3e39400c0d85f9ad218ad56344ec5d0dd04b6ab04b668d8ebb814357c716a59363b9f816c5d682c4c8508a44d25cd49fe4248ea216a9410a54fbe6ba931432f2fa88c4b01cf07818331c4fae6e41534feffa3e").unwrap(); let keys = vec![ - OperatorPublicKey { data: UInt384::from_hex("b25d20af1a6d0ccd3890f0aead4a05a59be22e005b6d732f855311915b351a9153b2c83d84611b2c9958f806c93f7b5f").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("af9cd8567923fea3f6e6bbf5e1b3a76bf772f6a3c72b41be15c257af50533b32cc3923cebdeda9fce7a6bc9659123d53").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("818a6d23ae53d6231f7dd73a058f125340e92f6e97897f017d9d9d4e6671bbd92241170dfcdd5a4ab8ef47ef12ddcad5").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("97a49cea05ca2e18f74af110c5ab52c89a43ced4e056a8af7ca8973401494bdaba26d1c56b46b018091d0dd64f244750").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("95a577f51dc6fd7fa4621f0a4601e48fd65418a89c2af2afef725fb4f053a8ee5841cd3fdae39ebdf5a202e0c4deca23").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b5df04cdd8a9ffdad72b2ffaa0bf752b6fe9adc70c59834cca826a7a0f7264e4cbefd351772e30d527bc5aa9019c4ca5").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("aaba308a8db9e1c6c545f3fdfff00880a973f0685207688d3c0ee4546d732ec16a81fa1aa952fb3190ff5c6febcd1a78").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("8ea46d70601eb45319ab495e2462f981debc8316df2bb1a679ae3525c7f517e535b69a02052844374c887a9312a47984").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("81ad0f9be5a88ae62ff54fe938dfceea71be03bd4c6a7aebf75896e8d495d310acc4146aa4820bc0e5f5b06579dedea5").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("92fa57a5676925e8dfe3b340df2132f5844ad9f89594b04efa28fb4fb884fe21f411fa49120ed7a60ce9381a54232a10").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("a9cac656247969ce388f3cd37079f4b5caa9ca1a523c12cefe9ad9e8f74f859c43df6e9448975f307dfd3632b6e495e2").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("91a043738454ea2f87aa38e88912341c806b68dcf4e472fe94a425ed79b4dc15b2bfdf6df0050dba41575acc666472cf").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("8feade899f17584ccf85f2d86ccd7ced638d919b2d70d1ec90d3c062d5b5fd3b56b25376a08f3e01611cc5ea67e1f05e").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("ac9c5c77fe321ff0a115d1ba5bf7462063ef21a82ba796415f4ee538bf9e8a6a49707530c72cbb6b60026c46ff1b9443").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("8935576848f6ab7e27fff34b671953672012352e36f5147181926b8bbc9e8b43b98458704666df25d36f37d41eb7c694").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("aa0ede82d78a0a8f4c2332d431c7be496c3aa09349ed3b2db30f7eb7dcc7b6e580a9d71f7d76bdaca1b3670e0cf4cd3c").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("81ad0f9be5a88ae62ff54fe938dfceea71be03bd4c6a7aebf75896e8d495d310acc4146aa4820bc0e5f5b06579dedea5").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("90e3caa7ae519505a6e1f3b56d3a99865f70e48f772ac431c3964a33cce7fe1e736d43ec3343ad843faaaa2b2bb3a921").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("838ea498b8c554bdc1f0ce0c107d8d23d27e40b45e6df56793cab951722dd69a958dc14798ae542cf025802f4b84a3f6").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("90d4c6a24d00d70fe961b77d58eff318bb6cd00c122bcfa20f92d65d03b9fd3afa5a0effc90810103a53d53ab155f764").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("888905cc3f99e76b3a1abf714a55978d9930c2abdc77a21bd809e452e8c47c35d38e318ec3118e1944cf1a4a8df907c1").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("afc31972124bb559aecd56dfb361048ab3f5203624c6436b1676b8d440bee777d83b937febacb2d3a651df9dbd20503e").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b6175b59aba8cc0477d4fff78bd90294f31ebd385c39bc254c7995a5dd3ccb8dc1d8869e247bf63bef8ec79317f479a9").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("ac3026b3e3023db1db9ec8e3b7678761820a2a6e96e7a5d9a39b1894170f9cea7765d3d131d60fa9d17492ba560fb1f9").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b6e979f20241cbb73de7451779e8e059d9cb75a74b72ea6862d7ac703dc2ac07d86cec39b6e8923b55fd54dbc6177c3a").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("9502bb884b3437d65c0e025e49fb00ff6ea9f55d5bcdc36330b46c8bd18be9126b7a6d7f35f558ef8040f2c2284500a5").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b44cee83a79fa151527e527f3f4f5ba022e73ae8b0d913c4185a45c2a129aef935a585a7a725edcb36ece72a95758688").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b928fa4e127214ccb2b5de1660b5e371d2f3c9845077bc3900fc6aabe82ddd2e61530be3765cea15752e30fc761ab730").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("8406e459bfd155c81f9103a1fe076f1261ee7513275d744c133c5d5dfa956b1449f173bd110bbc03673f376593f32a27").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("97596d7a72b65531fffd5f610752422d6e286c975f30d026092f7900f8015073bd6f6d1b85dd3981814c093910e7dac6").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("9099dcddc6560d1039b0edb91bd700e5deae0cba43163fa289a80c2bd22335b5b0e7a1fb8f5494c0e6360e73a12fe0a8").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("a80f24b5e040dcbf86c3f468dd28bf45d9e41fbcd127fad56669d9afe358dcdc26e42f0f8b19997b1741dbb99c553aa6").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b0051db915bd86bd938746c14440b11ee3b2801cbc6d6c1c912e8b41ea5eb1d8f852abf220ae91ecdb6da094846c1ba8").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("8196970badc74d068ec1226ffd4a656313decef59d792237a32e6ff56cd4e43030c436025831a4a3d0306a616f033810").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("852057284a7a9dbccb97fbaea3425104901dc661b69294a55c7ca800ed18d37df7ccc02367b5d6836ee4f6b052249a1d").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("8d4b5e1f48d7a77746676f09e2b995389d0f1c18601a6f909a4b542fccce87d9f5f30695d078a9181e142602d2e93f8f").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("9826a6cfb349fd60cb7ff72efa5c4f8249eab0a0274f07e2a3d52b16898b711f43f9c6171ebba6e969ac03c6554c24e6").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("8dc75e865b89e96560b38fae96f1d0a5438795778e68b705a506046245ca5dbbedb09e2379eea4c9bde0d0fd4fe05080").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("aea71272ac9a9c891f0987a75e2200a44fc063bca92892c0a174cff4c0a524935e0b870bd091329836e43ca7d7c87e7f").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("93146b3252f408f1cffc875b12b61f56c1ae02113b24c0b5aaedcda4a9b509332c8c4587450074f3e0906aaf3ceca754").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("93fe96f243c4ded9e65467182848e46285b5db0097b5b74be93f590f3d7eb0880c89df70f8a7756aa96a242692cb685f").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b6ee48c7a71a9d8e0813e68ca09846245fa155285f24a62b0ce9cb0102b1994ec58af8ba2a01c09363bdcc395d41f3df").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b888fe437eab3af5a7fee4e0164705458a6fda97ae390d69721a5f1d3830ec330fb53c6a29588f1f94f69adcff04ca09").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("890f1ca955443740346b5b4b0bfb8251f040074b5a2feb77e54add831bf34aaf1d84207691f6f5aa5e702152a496fadc").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("8160877a911d8bb7d1e75e2320e98cc3233c1f6972cb642424bfcec7c182c56d2c0ebb59e45f788f4d5dbfa2ebff3e3a").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("924aaa5688cb7220be4600211257ae054554583ad9233e8ca0d58abafe317129dcca9e34a1b9bbfa175b88d9fb31b55e").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("911a30e0a5f2f5135dcc5f09498e4ba5de22c7680f396599f7f29b91ac569c3d4336bc157443cf8c06682bfb5abb2271").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("8d9ee7b7e66124c4b047e1f93aed5a764ed7384292737ea17f3a7e429ce3f24d602d54b97f72d181b6f093da9b3ad3f5").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("af70ff352844250e267b31c0ddb83dffd4cac43532194bd47cbabf410ca29fa7f1ecec08c8fde8c0d13910e903016d5a").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("99b9f0fbeea3822cdc5b3654dea52103b3d9d5f01db4201955ea3689074d37da4711d8f313d4b5458eef3395aa75bfc7").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b6693296894820bdc3c0ae76f357e544847f10a68f0046f53745370dbe861d57e194ddaf7ff7d5e73cc3f240515c448e").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b8a2161c64bfdc7d621df51de569911a219f718bad4d6058dcca9bddf6696d43ddc4c1e3cf91640c93f820e5680efac3").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("918081d1c248d74a0737f36e5bd40aa71b512c6be6f68e3664723849ac47a62fc743c4dc7234694bda1b7701f33d2e81").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b3ea90ebcf0d8e332e37e5ac3c676653bb1203e8db7604bb0ac64a9b655b553de514e9bff5eeb86bb3ef9178375392f9").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("b291debc5e6c56a9e1a9b77cb980115c36a4d3d584826e62fc4b6ad7834cfc21e7c80226d46e90f4fda7771b45111526").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("adfa6ff26fcf77d816b22543003500c3b32bbf888d65eebb6086046f40a13ec537d14e09c3607e6cdce366a6a56bb68a").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("87f818e5c2330ac4e7f0ef820f337addf8ab28b07c9d451304d807feda1d764c7074bccbbd941284b0d0276a96cf5e7f").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("893ac10a0d49377fca566a10881e579c263ce761157165f9a34c18304edc7b6c0c1fe9101a7338c89308510df47bc5aa").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("94eabcb82f2b0b9cda8eaa3cecd39f0058b418cb7a25795f597a811895bfcc23643bb25ae8432a52804dfb53575b649e").unwrap(), version: 2 }, - OperatorPublicKey { data: UInt384::from_hex("94e199beb2a2a59166a12a851ef158928bc5efc25b39eb78b3a428b25384609d8c03548a94e77c0c941c90c68a4187d8").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b25d20af1a6d0ccd3890f0aead4a05a59be22e005b6d732f855311915b351a9153b2c83d84611b2c9958f806c93f7b5f").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("af9cd8567923fea3f6e6bbf5e1b3a76bf772f6a3c72b41be15c257af50533b32cc3923cebdeda9fce7a6bc9659123d53").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("818a6d23ae53d6231f7dd73a058f125340e92f6e97897f017d9d9d4e6671bbd92241170dfcdd5a4ab8ef47ef12ddcad5").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("97a49cea05ca2e18f74af110c5ab52c89a43ced4e056a8af7ca8973401494bdaba26d1c56b46b018091d0dd64f244750").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("95a577f51dc6fd7fa4621f0a4601e48fd65418a89c2af2afef725fb4f053a8ee5841cd3fdae39ebdf5a202e0c4deca23").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b5df04cdd8a9ffdad72b2ffaa0bf752b6fe9adc70c59834cca826a7a0f7264e4cbefd351772e30d527bc5aa9019c4ca5").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("aaba308a8db9e1c6c545f3fdfff00880a973f0685207688d3c0ee4546d732ec16a81fa1aa952fb3190ff5c6febcd1a78").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("8ea46d70601eb45319ab495e2462f981debc8316df2bb1a679ae3525c7f517e535b69a02052844374c887a9312a47984").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("81ad0f9be5a88ae62ff54fe938dfceea71be03bd4c6a7aebf75896e8d495d310acc4146aa4820bc0e5f5b06579dedea5").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("92fa57a5676925e8dfe3b340df2132f5844ad9f89594b04efa28fb4fb884fe21f411fa49120ed7a60ce9381a54232a10").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("a9cac656247969ce388f3cd37079f4b5caa9ca1a523c12cefe9ad9e8f74f859c43df6e9448975f307dfd3632b6e495e2").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("91a043738454ea2f87aa38e88912341c806b68dcf4e472fe94a425ed79b4dc15b2bfdf6df0050dba41575acc666472cf").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("8feade899f17584ccf85f2d86ccd7ced638d919b2d70d1ec90d3c062d5b5fd3b56b25376a08f3e01611cc5ea67e1f05e").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("ac9c5c77fe321ff0a115d1ba5bf7462063ef21a82ba796415f4ee538bf9e8a6a49707530c72cbb6b60026c46ff1b9443").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("8935576848f6ab7e27fff34b671953672012352e36f5147181926b8bbc9e8b43b98458704666df25d36f37d41eb7c694").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("aa0ede82d78a0a8f4c2332d431c7be496c3aa09349ed3b2db30f7eb7dcc7b6e580a9d71f7d76bdaca1b3670e0cf4cd3c").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("81ad0f9be5a88ae62ff54fe938dfceea71be03bd4c6a7aebf75896e8d495d310acc4146aa4820bc0e5f5b06579dedea5").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("90e3caa7ae519505a6e1f3b56d3a99865f70e48f772ac431c3964a33cce7fe1e736d43ec3343ad843faaaa2b2bb3a921").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("838ea498b8c554bdc1f0ce0c107d8d23d27e40b45e6df56793cab951722dd69a958dc14798ae542cf025802f4b84a3f6").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("90d4c6a24d00d70fe961b77d58eff318bb6cd00c122bcfa20f92d65d03b9fd3afa5a0effc90810103a53d53ab155f764").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("888905cc3f99e76b3a1abf714a55978d9930c2abdc77a21bd809e452e8c47c35d38e318ec3118e1944cf1a4a8df907c1").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("afc31972124bb559aecd56dfb361048ab3f5203624c6436b1676b8d440bee777d83b937febacb2d3a651df9dbd20503e").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b6175b59aba8cc0477d4fff78bd90294f31ebd385c39bc254c7995a5dd3ccb8dc1d8869e247bf63bef8ec79317f479a9").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("ac3026b3e3023db1db9ec8e3b7678761820a2a6e96e7a5d9a39b1894170f9cea7765d3d131d60fa9d17492ba560fb1f9").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b6e979f20241cbb73de7451779e8e059d9cb75a74b72ea6862d7ac703dc2ac07d86cec39b6e8923b55fd54dbc6177c3a").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("9502bb884b3437d65c0e025e49fb00ff6ea9f55d5bcdc36330b46c8bd18be9126b7a6d7f35f558ef8040f2c2284500a5").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b44cee83a79fa151527e527f3f4f5ba022e73ae8b0d913c4185a45c2a129aef935a585a7a725edcb36ece72a95758688").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b928fa4e127214ccb2b5de1660b5e371d2f3c9845077bc3900fc6aabe82ddd2e61530be3765cea15752e30fc761ab730").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("8406e459bfd155c81f9103a1fe076f1261ee7513275d744c133c5d5dfa956b1449f173bd110bbc03673f376593f32a27").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("97596d7a72b65531fffd5f610752422d6e286c975f30d026092f7900f8015073bd6f6d1b85dd3981814c093910e7dac6").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("9099dcddc6560d1039b0edb91bd700e5deae0cba43163fa289a80c2bd22335b5b0e7a1fb8f5494c0e6360e73a12fe0a8").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("a80f24b5e040dcbf86c3f468dd28bf45d9e41fbcd127fad56669d9afe358dcdc26e42f0f8b19997b1741dbb99c553aa6").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b0051db915bd86bd938746c14440b11ee3b2801cbc6d6c1c912e8b41ea5eb1d8f852abf220ae91ecdb6da094846c1ba8").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("8196970badc74d068ec1226ffd4a656313decef59d792237a32e6ff56cd4e43030c436025831a4a3d0306a616f033810").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("852057284a7a9dbccb97fbaea3425104901dc661b69294a55c7ca800ed18d37df7ccc02367b5d6836ee4f6b052249a1d").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("8d4b5e1f48d7a77746676f09e2b995389d0f1c18601a6f909a4b542fccce87d9f5f30695d078a9181e142602d2e93f8f").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("9826a6cfb349fd60cb7ff72efa5c4f8249eab0a0274f07e2a3d52b16898b711f43f9c6171ebba6e969ac03c6554c24e6").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("8dc75e865b89e96560b38fae96f1d0a5438795778e68b705a506046245ca5dbbedb09e2379eea4c9bde0d0fd4fe05080").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("aea71272ac9a9c891f0987a75e2200a44fc063bca92892c0a174cff4c0a524935e0b870bd091329836e43ca7d7c87e7f").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("93146b3252f408f1cffc875b12b61f56c1ae02113b24c0b5aaedcda4a9b509332c8c4587450074f3e0906aaf3ceca754").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("93fe96f243c4ded9e65467182848e46285b5db0097b5b74be93f590f3d7eb0880c89df70f8a7756aa96a242692cb685f").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b6ee48c7a71a9d8e0813e68ca09846245fa155285f24a62b0ce9cb0102b1994ec58af8ba2a01c09363bdcc395d41f3df").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b888fe437eab3af5a7fee4e0164705458a6fda97ae390d69721a5f1d3830ec330fb53c6a29588f1f94f69adcff04ca09").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("890f1ca955443740346b5b4b0bfb8251f040074b5a2feb77e54add831bf34aaf1d84207691f6f5aa5e702152a496fadc").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("8160877a911d8bb7d1e75e2320e98cc3233c1f6972cb642424bfcec7c182c56d2c0ebb59e45f788f4d5dbfa2ebff3e3a").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("924aaa5688cb7220be4600211257ae054554583ad9233e8ca0d58abafe317129dcca9e34a1b9bbfa175b88d9fb31b55e").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("911a30e0a5f2f5135dcc5f09498e4ba5de22c7680f396599f7f29b91ac569c3d4336bc157443cf8c06682bfb5abb2271").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("8d9ee7b7e66124c4b047e1f93aed5a764ed7384292737ea17f3a7e429ce3f24d602d54b97f72d181b6f093da9b3ad3f5").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("af70ff352844250e267b31c0ddb83dffd4cac43532194bd47cbabf410ca29fa7f1ecec08c8fde8c0d13910e903016d5a").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("99b9f0fbeea3822cdc5b3654dea52103b3d9d5f01db4201955ea3689074d37da4711d8f313d4b5458eef3395aa75bfc7").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b6693296894820bdc3c0ae76f357e544847f10a68f0046f53745370dbe861d57e194ddaf7ff7d5e73cc3f240515c448e").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b8a2161c64bfdc7d621df51de569911a219f718bad4d6058dcca9bddf6696d43ddc4c1e3cf91640c93f820e5680efac3").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("918081d1c248d74a0737f36e5bd40aa71b512c6be6f68e3664723849ac47a62fc743c4dc7234694bda1b7701f33d2e81").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b3ea90ebcf0d8e332e37e5ac3c676653bb1203e8db7604bb0ac64a9b655b553de514e9bff5eeb86bb3ef9178375392f9").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("b291debc5e6c56a9e1a9b77cb980115c36a4d3d584826e62fc4b6ad7834cfc21e7c80226d46e90f4fda7771b45111526").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("adfa6ff26fcf77d816b22543003500c3b32bbf888d65eebb6086046f40a13ec537d14e09c3607e6cdce366a6a56bb68a").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("87f818e5c2330ac4e7f0ef820f337addf8ab28b07c9d451304d807feda1d764c7074bccbbd941284b0d0276a96cf5e7f").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("893ac10a0d49377fca566a10881e579c263ce761157165f9a34c18304edc7b6c0c1fe9101a7338c89308510df47bc5aa").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("94eabcb82f2b0b9cda8eaa3cecd39f0058b418cb7a25795f597a811895bfcc23643bb25ae8432a52804dfb53575b649e").unwrap(), version: 2 }, + OperatorPublicKey { data: <[u8; 48]>::from_hex("94e199beb2a2a59166a12a851ef158928bc5efc25b39eb78b3a428b25384609d8c03548a94e77c0c941c90c68a4187d8").unwrap(), version: 2 }, ]; @@ -213,7 +76,7 @@ fn test_verify_secure() { // #[test] fn test_verify_secure2() { - let commitment_hash = UInt256::from_hex("348da373550c14a3e398724cb213fe4c4011ef74b0f78c26ae61fdd1b7ce9d67").unwrap(); + let commitment_hash = <[u8; 32]>::from_hex("348da373550c14a3e398724cb213fe4c4011ef74b0f78c26ae61fdd1b7ce9d67").unwrap(); let signature = G2Element::from_bytes(&Vec::from_hex("89c7cac0c3a9338c1fe67d3f715d7c0b7346633bce766420d536be5964f28aa7a7c7ea68062a66e076f36139b49068da12dc94bf3f5c6e917f64eb15ab9ecd8de2189059a57d355897a2f5d7cb4e2c7bf3602313dc855f08b4cbf32d5fc03ddb").unwrap()).unwrap(); let public_keys = [ "b32f6fc90c9dcaacdf9d836a2a7e60d090fe5e55b0b02f5a4f608a4b8235ba5aa7abc4e05f9387d1d942adc57c87f5b7", @@ -247,920 +110,3 @@ fn test_verify_secure2() { let verified = schema.verify(&public_key, commitment_hash.as_ref(), &signature); assert!(verified); } - -// #[test] -fn test_verify_secure3() { - let llmq_type = LLMQType::Llmqtype25_67; - // let block_hash = "000000e6b51b9aba9754e6b4ef996ef1d142d6cfcc032c1fd7fc78ca6663ee0a"; -//////////// validate_quorum 869760: 36d6a3181dd94d461a8242a1ab48bb9cf932f0d2e49af9afc943d2b3b8000000: - let mut quorum = LLMQEntry { - version: LLMQVersion::BLSBasicDefault, - llmq_hash: UInt256::from_hex("36d6a3181dd94d461a8242a1ab48bb9cf932f0d2e49af9afc943d2b3b8000000").unwrap(), - index: None, - public_key: UInt384::from_hex("a0cf31b8cf35cd23d4ba8f1837db08a03ea70b7184896926978849faaaa83d61c79a1295103e0be3cb75e7dfa8e616f6").unwrap(), - threshold_signature: UInt768::from_hex("aaf771a7032aa198b3dd3d58186dbd3b87e50ffb20ea53b0ab5907079109aea144db87141c9ca779802b08909e3ded280c318084f92035eec4570f1cdf1f3150079fd2452c40700b0965c97edb06e8b17dbd343fbfaa1da587a4c9091df3e5cf").unwrap(), - verification_vector_hash: UInt256::from_hex("8587b73f6bd63382dc5c97c321135742ec878eb5feccaec2b7d2b2daabb82bbc").unwrap(), - all_commitment_aggregated_signature: UInt768::from_hex("85c5262ab4c8e58cde79054b49d477274e1ef554ac9433c391110aa65813c7574e3982d734fb4593f646c70d62c9b68b0d666db5bc27251ea17caa8c0f7d77f1be5ffaeebf88824997a8ab342a2549ac617e9b549a4e375863cb38223952366e").unwrap(), - llmq_type: LLMQType::Llmqtype25_67, - signers_bitset: Vec::from_hex("ffffff01").unwrap(), - signers_count: VarInt(25), - valid_members_bitset: Vec::from_hex("ffffff01").unwrap(), - valid_members_count: VarInt(25), - entry_hash: UInt256::from_hex("514af6a43477f5354d1301fe9302c29f0cdcecfcb9cdbecbc72cd806543afc88").unwrap(), - verified: false, - saved: false, - commitment_hash: None - }; - - let valid_masternodes = [ - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("3ba330d521ffd8d0d7fee89e5b1222a91edd5ee077751bc171cec7b9157bcf9f").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("64e5082da5b5871e199e9607b9901a9bd69be06fd98d779e1da8937e1ea71147").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff12edaa20").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("8b04bcb5cf6d2d6df5979234611da42854a5e69374a29e0c85128caedb53d9c818042613d2f30f3ef782ed37bd8ce161").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("f1b18d69579c40dc8292842f02ff5f511e61609d").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("0b2c6e528a7512c8b504f34c30c38373d34a935d044546405ac8654ee58669e2").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("d9e2dc9e851176b315c763e988d7dfb1164153ef2ad98f5565686acbc2b8b2df").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("69d39d8413d5e25a4048b8269b7f6a2eeaa4b80d3b04812c7e88ef44f0024fff").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff36b838e0").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("a397c930f1927ffb7f7b13101f04e932d13d210de3a6254718cca8e5748941bab4fdb27a48f61f161f0d6cb63b7d3c85").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("849765a81c234c82ecef58cbfb96f2b1fcacf686").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("75007256476bb229815257529aa59e9cf5625e7f8137147de0d50c53e80ce711").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("432ab33e7663f79c28d25eb500edc0a6a17fa7ae2a718ce7efc2e79d3a070ad0").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("d3f738fefbe8e3185edf8f939a06b5bd77130da822fd0dd2b750ad8d1457e86b").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff36d63bae").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("93dac269908111b8b091edbda123d5884f4d47d21225fa319d344b350762a85c6cdbe21804ef9b2cc53a878c72a001d6").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("bae896aae3de540d18e5ea8573182860471082f9").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("f20d3c94aaec665afe13623784afe5e4d6c44edc2c274af5b01a0209e08956bc").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("0378aaa2e2ec71b47ab267aa9b55ec5422740471ce1651c2aee7cad48d8f0f61").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("4b5db3e037a861de2890b1bfaa79bd23fdd678519f4c45a8e9473de35b40b7c5").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff36ba9112").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("b0ea47f22be1644834d8756793f2308f2c5b40afd16ebb98d29a3bd37e437990d4d5930ccfa56c1ea0b4e51d05a49f23").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("bec1b55112fe6dee11593a3ec19e9d7128555218").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("ae3a244b4d5c5b668091aa089e19d2b012cea3d5650671bf247913fbc70558dd").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("2f51f56b6a87988b682020bc75f6e827f36d43559f2adb59cf85d9aaf7ef9257").unwrap(), - confirmed_hash: UInt256::from_hex("795cfdb19aff1aaaed00bb62b95dfef5748253be13d0dfc4d783b02ae2000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("0078c2f3872da817c9901bfe498ec26b9bb023c6f30736ba92668fcc6900533c").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff3425306b").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("81ad0f9be5a88ae62ff54fe938dfceea71be03bd4c6a7aebf75896e8d495d310acc4146aa4820bc0e5f5b06579dedea5").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("cf83406065cb65ce74100f3c35a0324bfc92dcb0").unwrap(), - is_valid: true, - mn_type: HighPerformance, - platform_http_port: 41733, - platform_node_id: UInt160::from_hex("d96b1b3cefa0553732d9d6cae76666eff869aa02").unwrap(), - entry_hash: UInt256::from_hex("816b2025864c75d69c90d89c73e043ce239acabb12b1c940b93b661542225691").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("bc973f3a17c5fa3dd59493b7d2bc41ce472be2401459ca2d96fac25bedb2b7aa").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("ec43d02ceb91ca9fea3cb6e6788fb48de7d2258233563681456f0f08f914dd1e").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff22dcf318").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("818a6d23ae53d6231f7dd73a058f125340e92f6e97897f017d9d9d4e6671bbd92241170dfcdd5a4ab8ef47ef12ddcad5").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("853fd590bbfa10868687b7c648238857248adfb7").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("3460032f52e5b57c80827f180263ad5551cde16a37ce1cff9052a0b47b2233dc").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("b793ac00290abfe0ae6e8e96dd228c0a209d774ecb90b1e7f384e3e975f2aade").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("284033f8d205f3a20ad4368b8069366768256578c817ddbd5c284d321352def4").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff22db21e7").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("97f78abcee6d2ed68bf2c82afbf56ef9af67313e2eb655ea5178850907cb3057cae0bb5a1d09f161057bf62f9d4890c6").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("76c44d67639aaa8fb877f1db08d5e582b570c25d").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("e27008fcb83b8a961b29fffe8b738958ac3bd7111ef0fcff4947d8444aced9f5").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("3316e1e2cc137b2eb03f960324df219b2c5314f12296df4b4619460ae9e7f994").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("316f3728969e8f563c3901fa3dbc4c322aab301c65ab3a983561366f5e32f0a2").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff235b787f").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("b5456e15b572b002651ddd30df525367cc830148fd15496c09a538e9562b102d1326e1ae99f7d37a0ac5f8cd1d4e205c").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("de0c01ad5889c4d3d0cd8dac5f08d329f47d06b8").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("107bf4d92436b91bfaf3e3c44af15cb11f994429d5fadfbdce3d7f0683f0291e").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("d62a3f54945dda86301e5b2118e6962c79b8d6461c075d97f1b926eda4e7dcae").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("bb02707fd56805b7507a2f449c2bc6c95715872c23015eeb1b445d2933ad4a6b").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff12eda5f2").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("807b1f3f16835ebfba6f505f43c6de757bb22ecf27a89703e90e43aedafea3df353a5bd1915b27e8db397d53f0a23f60").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("996eefc4c3da0c2c59fceec99aac79122c44d632").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("56c884c0ced7087c7734b6d8a345d516f102c1aa3158040e404332c595318dd7").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("995ed4288da0f7b3e9af9dfa8f2fcb6dc0389df6030e75c4a8fa4db5cede0d88").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("f2dde5275d2f37113433a3412ac5c2715db7de0532804494558f62815af942ea").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff22dc5551").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("911a30e0a5f2f5135dcc5f09498e4ba5de22c7680f396599f7f29b91ac569c3d4336bc157443cf8c06682bfb5abb2271").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("a9cab48330c4f2058fc7d331b9355b91056c68e1").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("a7e82894e3646eaab698bf52af4bcc9d02adb0737e6104473a28c30fc1006fdc").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("c10a2826f3e775d2d7527b131d5e3620647a6926938061a7ff16b7d0b745efb4").unwrap(), - confirmed_hash: UInt256::from_hex("26cb9af0c2dd8555f03dccbc1f209376c344f2a89d021dad06bbe6aa2c020000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("b128a28a8255c2f2c5203982d349d5a15d8c1835f656082e7ac986dcb8d996b1").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff59280f17").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("8450dbbbe82df6808151b83a46f8c531cb240eccfe65f8f0b49f3717056da7268c14e45f0dd14fff8daed28fd353c1b4").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("1546085b56803db4366c2059d4755c8a28796ca3").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("aa7cb9fe35349094fdaf85e6018eae20d38b3208a42e8ff1cc842780a2e81c85").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("f682389d5e0baed394a65cbdd6a666f59271943d935f85c9d05b3433978c9b28").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("8e502ae310ff8f99c3efe28b76bd5d78e0cb7ee005a78f56e58c8576b406da01").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff22d254a3").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("8e2825781a496023c8be61f2bf352ad1094afd6e4f84c4ef331bc727bc149a6dd7e23d78944b8b047c03da44eef1c796").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("1c6031c212e840f9756b8f08e3801cca20b38a62").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("9b94fa8985507f9870305d431008cecd8feb30460696a557cc963d48dca4a7ab").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("0682c86d9afb864697190081adb9b1c4b0268b079edc428e41368fcb1655eff8").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("e966d7de4befc13b268099f4365c17eede37c4bdfcabdccf0466d74322be7dc6").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff235a9dce").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("815ae7a4f88fd79e4659c4b24b32f24d1e92106b867a2c23d1d084cfedd0e2766edd3f0a77f274acd4d1d53fb1ff0218").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("baee5acad0f663430ff83c4e9b9fcb0122789520").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("3d006dfd19d34fdca40d7f85c98bbd196abcf006442ead76e20d0fd93274de4b").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("eed53ba18185f82a82196e11705d4a0e40576cc1884c060188adbc5560ac8b14").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("29f50ee91bbe82d6a6a099b89d1fc5147cbe3ac70d02d16db64f2b0797204509").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff23a2a0b4").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("b5df04cdd8a9ffdad72b2ffaa0bf752b6fe9adc70c59834cca826a7a0f7264e4cbefd351772e30d527bc5aa9019c4ca5").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("e5ccbb0b6af934a3bcb32e3c1d1afe21aaadd582").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("5a16f1ecbe3cbb0780e7005131cb4ead957b88f1a83d1e21466538b42eefbda4").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("b2b69159973619cef08b9add969ba4d1ae18dd33bd62635429d44d93b62d5753").unwrap(), - confirmed_hash: UInt256::from_hex("3d7c98b3942c5550e3bfcaa37e37282fd4b29bb40f677a38906e597257000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("4fc89cf01157342238661a79c22bdf80def51eaba53fe98088ed1bed1c83fccc").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffffae22e975").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("87f818e5c2330ac4e7f0ef820f337addf8ab28b07c9d451304d807feda1d764c7074bccbbd941284b0d0276a96cf5e7f").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("ce7f101b7f075273c892063b1b8571311737a576").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("08dd2c380037f78507443f306f60a4b95d888576537a2a5ce7481d0cb45ea30a").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("ab0c1c4d1b59e95ef256598fc2663049f0fcf1a6e4845e80358b7d29c04dcb76").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("eb8b4a877d01aafb185de75812249b709a48d38b0551dba9301acb451fb4408f").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff340a7242").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("87f3bb14d4e16bb20ebdfc97b3b067ebbcea5b0b9725b796e6c62d8a0818eff300261a62b6fbc3bdbaa97b895b66137c").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("93bc1ac3bd2e43eb87e240d2168f56e69b1f1833").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("c965262aa365649a04a917b2eb5cd5f753107c0297448d1a0572dde1e8fe38e3").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("5efba19efb8cb5e105f5b61f9ca2b0f543a0dee8161c0fae961d1e76ee883a07").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("48a1fa1dae598d607a00efc48e52db278426b1f09aad2916c31713257ac571d2").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff22dd5625").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("b8a3692f75e5b9523c38f02c6a7ba91425bf6a6343f8704bccfeefd4844456196bc6b3267b7f3cbb2200c549f4313c42").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("1d8262ba8d79530a35b175b5b47c161e70e0e154").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("320cf222c2340e7463c0a256e8a2e81f41276ace2183a5ead1774453bc9614fc").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("790bd1b645d4cbbb155fe4a4c65b81a285197c6b94ef89b05cd2a024b7a6c441").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("829fe002b9ac51276e4555e47546875cac7c01a17ef0ea84d221eeb8a71be528").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff22dcbbe9").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("87df25a28955c903cc19f836a4daa0842d203cfc0dc5ae9b57b8246a4787ee4c98ea3f2586203315d61f4e77b6c80dc5").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("8164fcd1a488ebde9344cbd205ce705bbe312180").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("edb3cade9b9f40c5ab811743c3a9bb694a78f59f4fb1fdb31caf90011036f239").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("e3fd43389b149f8c4d64f36b1601f05ec3f3ceae0809dbeed137214d11b376a7").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("fda5dbe241b787f39a0e36d6e33a454b5b9d0e5ba12702fc27245250b58753c7").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff22d3acd4").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("89f8a06bd95c1be3cfdcd2516fabc0858c611d63c76da3a5beaa007b9d7c895aa63c0b2887bd584a76892db417a6683f").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("127b867e4c2d040cedaff979c39220c717011dab").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("0c0f28c40747d00857c61d3c661537f7573912a44a74ed51333f224f82a811b0").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("02769272e89a947728aebb2b1ce38a35e47ea334ee53fe29e8a6734cf439ee0c").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("f23d63f18ec98e1e467e5e89f3c22c739bc0729fc9c0d17a27c9a7137d590fa6").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff36bd7deb").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("a80f24b5e040dcbf86c3f468dd28bf45d9e41fbcd127fad56669d9afe358dcdc26e42f0f8b19997b1741dbb99c553aa6").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("b73068d00c048915c175450c366478f783bc455b").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("66ad4b21995106bb17b63a94752e284318d501f34fb1ecd8bea21c64cb3661be").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("d28018e798ccbd797d0b2fc33513d64d60d55c92f4b35f46db169332dae95f4d").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("e9273730016cd6686e327bed5bc61942e409b09ce9acad5c556313f7eb69c80e").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff3422fad6").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("a7be789e5b798cf3a40ff5dc22b0384dc690acadd614067c0f7e6a933b8f0c72c67b3f4b3e666e6fc48369a8161b04e6").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("4bd7db8a067386d8bda99986fd6661186757bf95").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("eea47e59d78ea141719ca2d19358d299c269d8948ec9f5b283e2edc1f2038c66").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("7260b2359075b4e479d94821e1745239384e92da675226464f1fc312682df6b2").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("b486e7118e23a4cb5f7632013217affe8c3ce0e7bfd45d3fbfcf28b4002dba11").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff22de5512").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("875b907b6d6c12aa111da0e102186b9d06f4e065969b60732207f18c2c5d0deb8ecba47cb4c0929647db0e2fae6f08ca").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("a3efa844b6dc22d05e802ebd5d1eb02cca122c25").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("5821d4b7dfe9734350412a08a8b1a8efecead5383a47468a4e98256cec04f08a").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("f5cbcfe4f680596d703098ef1fc0ce9e3950372bda82c25090b79ae880e6932b").unwrap(), - confirmed_hash: UInt256::from_hex("4f2ff1d62323f7dc16ccdfb3e3740af47a444871f72f09ac252f62753e000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("c2a3dd61f4c8a7b6e5934e409e9a4e9a48ed6cd9cc14424bdcce020bfb20b362").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff23a3ba6d").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("a7afe7674de986aff5e2e0a173be8c29abed8b5d6f878389ea18be0d43c62ad1ba66a59e9e8d8453aa0ed1a696976758").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("762e689e7bfecbe16bfd0e6138eea642ee0513c5").unwrap(), - is_valid: true, - mn_type: HighPerformance, - platform_http_port: 41733, - platform_node_id: UInt160::from_hex("e3053f65754c630ab036f1370bcc6835fedb9c9b").unwrap(), - entry_hash: UInt256::from_hex("03430ef59311f9797152779acb03d6c25fca40567b75f84058bf2f5ef3da335a").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("71ce9f30984ba8ff47618bdbb362be8315b11d7be903b37fb9ed2a0010090dca").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("ece3d829df81bd32c1d45bb360600377fa73c619579d1a5daddcb95ec91357bb").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff36d45b94").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("b2823797ad456d53ce1e6bde84e8a19164ff88a73ccd242ec48d9c6a479f2a049e214c7e8ec2243b7ea74ca6144ab2c5").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("b7e99fc3ee4cf3d64c4438fc2a61cba12c0e7319").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("0526b60a35c51286e3685f143e0664d08a155bfdc49f1ae0f76db95709f24e99").unwrap(), - }, - MasternodeEntry { - provider_registration_transaction_hash: UInt256::from_hex("608c43a6a23324860eb2d8e6212798506bebac53120c591d6b32aeb0e35edc63").unwrap(), - confirmed_hash: UInt256::from_hex("042a425ae2d3289646d71765e97cfe099acdf021aaeabd52393477d845000000").unwrap(), - confirmed_hash_hashed_with_provider_registration_transaction_hash: Some( - UInt256::from_hex("c83d2ef9b1b1772e173a9f088d0151582f9eeaef3ce5c6ba28c5aac025af112c").unwrap(), - ), - socket_address: SocketAddress { - ip_address: UInt128::from_hex("00000000000000000000ffff235bc5da").unwrap(), - port: 19999, - }, - operator_public_key: OperatorPublicKey { - data: UInt384::from_hex("93f411bb160a34b3d8254e7c537e1300afed010d4a245e376b81d889020854fb999fe9cbb7430ddee0faf2fe5e711ebb").unwrap(), - version: 2, - }, - previous_operator_public_keys: BTreeMap::from([]), - previous_entry_hashes: BTreeMap::from([]), - previous_validity: BTreeMap::from([]), - known_confirmed_at_height: Some( - 868888, - ), - update_height: 868888, - key_id_voting: UInt160::from_hex("b190542b5c7522f4db19e48033d17c34afd71845").unwrap(), - is_valid: true, - mn_type: Regular, - platform_http_port: 0, - platform_node_id: UInt160::from_hex("0000000000000000000000000000000000000000").unwrap(), - entry_hash: UInt256::from_hex("76d162d303800ff542f6b69f938b911712717332c0ea4ca061c3e7f341632f39").unwrap(), - }, - ]; - - quorum.validate(valid_masternodes.to_vec(), 869760); -} - -//#[test] -fn test_verify_25_67() { - register_logger(); - let version = 70227; - let cache = register_cache(); - let context = &mut create_default_context(ChainType::TestNet, false, cache); - let processor = register_default_processor(); - let result = process_mnlistdiff(message_from_file("MNL_0_871104.dat"), processor, context, version, false, true); - assert_diff_result(context, result); - let result = process_mnlistdiff(message_from_file("MNL_0_874011.dat"), processor, context, version, false, true); - // assert_diff_result(context, result); -} - -// #[test] -// fn test_verify_chained_rotation() { -// register_logger(); -// let version = 70227; -// let cache = register_cache(); -// let context = &mut create_default_context(ChainType::TestNet, false, cache); -// let processor = register_default_processor(); -// let diffs = vec![ -// "MNL_0_870600.dat", -// "MNL_870600_870624.dat", -// "MNL_870624_870648.dat", -// "MNL_870648_870672.dat", -// "MNL_870672_870696.dat", -// "MNL_870696_870720.dat", -// "MNL_870720_870744.dat", -// "MNL_870744_870768.dat", -// "MNL_870768_870792.dat", -// "MNL_870792_870816.dat", -// "MNL_870816_870840.dat", -// "MNL_870840_870864.dat", -// "MNL_870864_870888.dat", -// "MNL_870888_870912.dat", -// "MNL_870912_870936.dat", -// "MNL_870936_870960.dat", -// "MNL_870960_870984.dat", -// "MNL_870984_871008.dat", -// "MNL_871008_871032.dat", -// "MNL_871032_871056.dat", -// "MNL_871056_871080.dat", -// "MNL_871080_871104.dat", -// "MNL_871104_871128.dat", -// "MNL_871128_871152.dat", -// "MNL_871152_874488.dat", -// "MNL_874488_874512.dat", -// "MNL_874512_874536.dat", -// "MNL_874536_874560.dat", -// "MNL_874560_874584.dat", -// "MNL_874584_874608.dat", -// "MNL_874608_874632.dat", -// "MNL_874632_874656.dat", -// "MNL_874656_874680.dat", -// "MNL_874680_874704.dat", -// "MNL_874704_874728.dat", -// "MNL_874728_874752.dat", -// "MNL_874752_874776.dat", -// "MNL_874776_874800.dat", -// "MNL_874800_874824.dat", -// "MNL_874824_874848.dat", -// "MNL_874848_874872.dat", -// "MNL_874872_874896.dat", -// "MNL_874896_874920.dat", -// "MNL_874920_874944.dat", -// "MNL_874944_874968.dat", -// "MNL_874968_874992.dat", -// "MNL_874992_875016.dat", -// "MNL_875016_875040.dat", -// "MNL_875040_875064.dat", -// "MNL_875064_875088.dat", -// "MNL_875088_875112.dat", -// "MNL_875112_875136.dat", -// "MNL_875136_875160.dat", -// "MNL_875160_875184.dat", -// "MNL_875184_875208.dat", -// "MNL_875208_875241.dat", -// "MNL_875241_875242.dat" -// ].iter().for_each(|name| { -// let result = process_mnlistdiff(message_from_file(format!("testnet/{}", name).as_str()), processor, context, version, false, true); -// assert_diff_result(context, result); -// }); -// context.is_dip_0024 = true; -// let result = process_qrinfo(message_from_file("testnet/QRINFO_0_875241.dat"), processor, context, version, false, true); -// assert_diff_result(context, unsafe { *result.result_at_h_4c }); -// assert_diff_result(context, unsafe { *result.result_at_h_3c }); -// assert_diff_result(context, unsafe { *result.result_at_h_2c }); -// assert_diff_result(context, unsafe { *result.result_at_h_c }); -// assert_diff_result(context, unsafe { *result.result_at_h }); -// assert_diff_result(context, unsafe { *result.result_at_tip }); -// -// let result = process_qrinfo(message_from_file("testnet/QRINFO_875241_875242.dat"), processor, context, version, false, true); -// assert_diff_result(context, unsafe { *result.result_at_h_4c }); -// assert_diff_result(context, unsafe { *result.result_at_h_3c }); -// assert_diff_result(context, unsafe { *result.result_at_h_2c }); -// assert_diff_result(context, unsafe { *result.result_at_h_c }); -// assert_diff_result(context, unsafe { *result.result_at_h }); -// assert_diff_result(context, unsafe { *result.result_at_tip }); -// } -// -// #[test] -// fn test_verify_chained_rotation2() { -// register_logger(); -// let version = 70227; -// let cache = register_cache(); -// let context = &mut create_default_context(ChainType::TestNet, false, cache); -// let processor = register_default_processor(); -// context.is_dip_0024 = true; -// let result = process_qrinfo(message_from_file("testnet/QRINFO_0_888537.dat"), processor, context, version, false, true); -// assert_diff_result(context, unsafe { *result.result_at_h_4c }); -// assert_diff_result(context, unsafe { *result.result_at_h_3c }); -// assert_diff_result(context, unsafe { *result.result_at_h_2c }); -// assert_diff_result(context, unsafe { *result.result_at_h_c }); -// assert_diff_result(context, unsafe { *result.result_at_h }); -// assert_diff_result(context, unsafe { *result.result_at_tip }); -// } -// -// #[test] -// fn test_verify_chained_rotation3() { -// register_logger(); -// let version = 70227; -// let cache = register_cache(); -// let context = &mut create_default_context(ChainType::TestNet, false, cache); -// let processor = register_default_processor(); -// let diffs = vec![ -// "MNL_0_888192.dat", -// "MNL_888192_888193.dat", -// "MNL_888193_888194.dat", -// "MNL_888194_888195.dat", -// "MNL_888195_888196.dat", -// "MNL_888196_888197.dat", -// "MNL_888197_888198.dat", -// "MNL_888198_888199.dat", -// "MNL_888199_888200.dat", -// "MNL_888200_888201.dat", -// "MNL_888201_888202.dat", -// "MNL_888202_888203.dat", -// "MNL_888203_888204.dat", -// "MNL_888204_888205.dat", -// "MNL_888205_888206.dat", -// "MNL_888206_888207.dat", -// "MNL_888207_888208.dat", -// "MNL_888208_888209.dat", -// "MNL_888209_888210.dat", -// "MNL_888210_888211.dat", -// "MNL_888211_888212.dat", -// "MNL_888212_888213.dat", -// "MNL_888213_888214.dat", -// "MNL_888214_888215.dat", -// "MNL_888215_888216.dat", -// "MNL_888216_888217.dat", -// "MNL_888217_888218.dat", -// "MNL_888218_888219.dat", -// "MNL_888219_888220.dat", -// "MNL_888220_888221.dat", -// "MNL_888221_888222.dat", -// "MNL_888222_888223.dat", -// ].iter().for_each(|name| { -// let result = process_mnlistdiff(message_from_file(format!("testnet/{}", name).as_str()), processor, context, version, false, true); -// assert_diff_result(context, result); -// }); -// -// context.is_dip_0024 = true; -// let result = process_qrinfo(message_from_file("testnet/QRINFO_0_888655.dat"), processor, context, version, false, true); -// assert_diff_result(context, unsafe { *result.result_at_h_4c }); -// assert_diff_result(context, unsafe { *result.result_at_h_3c }); -// assert_diff_result(context, unsafe { *result.result_at_h_2c }); -// assert_diff_result(context, unsafe { *result.result_at_h_c }); -// assert_diff_result(context, unsafe { *result.result_at_h }); -// assert_diff_result(context, unsafe { *result.result_at_tip }); -// } - - -#[test] -fn test_core19_2() { - register_logger(); - let version = 70228; - let cache = register_cache(); - let context = &mut create_default_context(ChainType::TestNet, false, cache); - let processor = register_default_processor(); - ["MNL_0_530000_70228.dat", "MNL_530000_852596.dat"].iter() - .for_each(|name| { - let result = process_mnlistdiff(message_from_file(format!("testnet/{}", name).as_str()), processor, context, version, false, true); - assert_diff_result(context, result); - }); -} diff --git a/dash-spv-masternode-processor/src/tests/listdiff/testnet_test_retrieving.rs b/dash-spv-masternode-processor/src/tests/listdiff/testnet_test_retrieving.rs deleted file mode 100644 index 9a59aff6..00000000 --- a/dash-spv-masternode-processor/src/tests/listdiff/testnet_test_retrieving.rs +++ /dev/null @@ -1,458 +0,0 @@ -use hashes::hex::FromHex; -use crate::bindings::common::register_processor; -use crate::bindings::masternode::process_mnlistdiff_from_message; -use crate::chain::common::ChainType; -use crate::crypto::byte_util::Reversable; -use crate::crypto::UInt256; -use crate::ffi::from::FromFFI; -use crate::lib_tests::tests::{add_insight_lookup_default, FFIContext, get_block_hash_by_height_from_context, get_block_height_by_hash_from_context, get_cl_signature_by_block_hash_from_context, get_llmq_snapshot_by_block_hash_from_context, get_masternode_list_by_block_hash_from_cache, get_merkle_root_by_hash_default, hash_destroy_default, masternode_list_destroy_default, masternode_list_save_in_cache, message_from_file, save_cl_signature_in_cache, save_llmq_snapshot_in_cache, should_process_diff_with_range_default, snapshot_destroy_default}; -use crate::tests::block_store::init_testnet_store; -use crate::util::data_ops::merkle_root_from_hashes; - -fn init_hashes() -> Vec { - vec![ - UInt256::from_hex("e7e36d6c735c76603aa26c90c6bbeb74a32e0ccb1f04782380ae93e57fb519b6").unwrap(), - UInt256::from_hex("f7321c4d9e32ed5978a9ae40028c4ee86c62a0e56537250a86430977a22b3fac").unwrap(), - UInt256::from_hex("a4f3963f8ba2ede4af3da963e34dc19dc89f6b4aed55e2d7d9478d7a1399b086").unwrap(), - UInt256::from_hex("e7f674b043d508bca1c901381f376a31c3e51fc22e678061f89a4bc20b043d34").unwrap(), - UInt256::from_hex("dbded654cd8b1e9671906b0ecd6d36e649795f48b1ba206df9c933984f2e8110").unwrap(), - UInt256::from_hex("a7b8b0fcf94b0f05c7eba5949420b1f29b5e3906bfd40b80e2df8e5f4ae784de").unwrap(), - UInt256::from_hex("090d453a429c12bae4a41f32d659aaa39ff0850f4e9b6d2d3218a500766192c3").unwrap(), - UInt256::from_hex("bddf02456877de4ebcab5276cbfc08a56ef0f2eb41e1290c59899784030ff6b9").unwrap(), - UInt256::from_hex("4a0209271d167e74ace633fd24a9be00c9ba64ba6155ff3f48e7b33ead172a3a").unwrap(), - UInt256::from_hex("81bfc1b1d2f15da075f7a65f67f3909aae558e8383d3fe92c0367404563cfef2").unwrap(), - UInt256::from_hex("f40ea2e64108a42d15185703229c941eb6435ed5c96ae62701a87b23ba036abb").unwrap(), - UInt256::from_hex("d7a17b2f320d2159d2e72ac77f7b4c70e7a6bc2a06ce9b903b83e34f3a71880a").unwrap(), - UInt256::from_hex("b12420a04b0dcc67315c8c35401c2bc8bf38f1e40ef510de57db08a596af9cb5").unwrap(), - UInt256::from_hex("76525f7759aac75f057f7095a7d116a5dc1290d78499efccca28fa5e211e4978").unwrap(), - UInt256::from_hex("f400dc6bbdc988cc7c4c7076136c0128fb8eaaf0c3990f4cdcf12b9a2864695e").unwrap(), - UInt256::from_hex("7bf543060b8e88f0006fddd72bc50eb3329cb79836db12d1c63602895762ed78").unwrap(), - UInt256::from_hex("2e860b3056808f52c2d1fb2b3c6dd4fcdbf28c705fbc60c5c190eede561f27e9").unwrap(), - UInt256::from_hex("df88b8c121af50e64b998be0226301d6e6108e0afb1573e4fb2cf7e00c48e9a0").unwrap(), - UInt256::from_hex("26d9d4190e8f3bede12ef76ca4f0a86b60e7c82a10a1b5b0c0b682e6f50c903f").unwrap(), - UInt256::from_hex("20e27d2e035002641212e3db6be3750b4d0cab6c2faa9a9561778ece0cd6f1af").unwrap(), - UInt256::from_hex("d1e12436d6002c54c5fc7619ee21ffa75104f8e182b034a0a8cab6727603c15b").unwrap(), - UInt256::from_hex("9e17bee70eec41c957b0650d95c9349beacab2f6a09d90433656b2833152fec4").unwrap(), - UInt256::from_hex("b6f381a3c90ad6065e7c2491cdb6cb9ed1965f1970e788e40a2a8feca05dfcea").unwrap(), - UInt256::from_hex("9063ec4f4df38a217c83b3b067603b09a20a337a4118e6cfd20dd9e1b4a03405").unwrap(), - UInt256::from_hex("a0c3f1945e82d2f3086d97dd9319629b354a1f89596f79e0d7472ee9e508b920").unwrap(), - UInt256::from_hex("14d8f2de996a2515815abeb8f111a3ffe8582443ce7a43a8399c1a1c86c65543").unwrap(), - UInt256::from_hex("2b73a9870f0fd4c7c06193d1847bf0341f44e7235e91439da82106b058fcf089").unwrap(), - UInt256::from_hex("f5737c290dbcfb90ef3cb8d4076ffa198ccfe0168201c431d5fd90759e44974f").unwrap(), - UInt256::from_hex("d43da16b218d1b0bb9f1b9b6a04fd88d4fe1d8343de8e35fe02740be891ba4f9").unwrap(), - UInt256::from_hex("2365b6afdef878ee575df3d390f855679c651362c5491b6601c23933a33f3193").unwrap(), - UInt256::from_hex("085eca46adf569129effe75c418993dc1e6afe270d8dd15d3bd86a61f0daf7d6").unwrap(), - UInt256::from_hex("ac69568dd3f21beb1b25210e718d191ed4d4a7f5b4d0846ed7aa724f49be775d").unwrap(), - UInt256::from_hex("9c5da1bacfc6350e3329a2cfac76ec78d2351546fdc224971efd79e412949375").unwrap(), - UInt256::from_hex("a2ad729613951727cd68889c7153476fe8ae5983d2a651036248116feaf53ca9").unwrap(), - UInt256::from_hex("da8b76b0cb9c750062fb221bbf1ae49cf157e4447baae458ee7daa9d9cb101d5").unwrap(), - UInt256::from_hex("9c1208b08f6ab66f7a554d644320ae22d22d89a50945baa746329da91651e6a0").unwrap(), - UInt256::from_hex("43903412ee410b5459c7c7080dada4ef96ad166cd6f86f6c270aa5b6537c6a6b").unwrap(), - UInt256::from_hex("ba67feeb708ba70f6e92c9fdcd44035c365955eb4e05f0173394bea0b6844ecc").unwrap(), - UInt256::from_hex("04e5d047541f62b75489d679956c2d4ea053aa0d94c4d373a17144655fd97326").unwrap(), - UInt256::from_hex("4b6f86cf35203abae15d10fb0b4cbe238e0d5e387f305f8e9cba560442221b7f").unwrap(), - UInt256::from_hex("22e7f112eb0e06f7894293a4b06f36f0d6f98e66818b1c5d09d671c9338a08aa").unwrap(), - UInt256::from_hex("43471bd379d1cd1933d88ef2842a203de9334b0c02976025256bf1fd7df99415").unwrap(), - UInt256::from_hex("8cde8673f8228131d9ed4f14e920639a226c51a1884724878b433147dd3c8031").unwrap(), - UInt256::from_hex("51eaf8f46b4ef368a0349a36a041bcee976aa0ae9cf3cf482ebb0fdd9cda1d66").unwrap(), - UInt256::from_hex("b920a9e12f09eb633f4084b1c7f4fe9cf4bacd581c1a193fb3db08267d615363").unwrap(), - UInt256::from_hex("5a2952f5b21b6c251aaf51d1784c355eae94bac540fc5fcda2b41966cde84056").unwrap(), - UInt256::from_hex("ff43ac83b9c14817b72aea8bb15c69f1ed74f0a9251eb6ae2c7150193e976f1f").unwrap(), - UInt256::from_hex("fb6b938139b4c2a48ad5bebe9caf5f2083325f6c7413c194d2c0870d0f5a1d9f").unwrap(), - UInt256::from_hex("b93512d2419f1b38ca6685200bd1f2d6d1865b97ff4d9586ee0be826c39d1a48").unwrap(), - UInt256::from_hex("d9e7936959cb47f52d36fa5b81bb16ac8bcdf99f26e492184c59678d2a62e7f1").unwrap(), - UInt256::from_hex("4336afc4a009e6db9702e9fe5859160ab51a53d6666a04caf1b5e487f5935318").unwrap(), - UInt256::from_hex("cb802d5b8d2e437ab4607188945fca23bc1221788e419445765a51991215f51c").unwrap(), - UInt256::from_hex("9429e3700f3061bc8c8c747acd9b64145efb6060ab8d3f63b165d3216c7c3773").unwrap(), - UInt256::from_hex("c773cadb8e78f2b51e3a04dca516e354b026e64aef8f826af957608849e3828e").unwrap(), - UInt256::from_hex("6128e1d87f61029506196c6813885b500e250c99d9e4c470dd26e6e173c9e73f").unwrap(), - UInt256::from_hex("ac9cb4555952ef5d7e43e7335ad9379e37e0830700c9f2d9b7fad35674bb6b22").unwrap(), - UInt256::from_hex("c57c2d19e8e17c0e192340b30bb7f81018bded16dfbcc41ad4473aa37cf192dc").unwrap(), - UInt256::from_hex("c26dee2679812dd47f2e44be1010afdb18e102389d656e62201d6ae591dd242e").unwrap(), - UInt256::from_hex("309118674e4e7e58c1671febc42350f46499f322f0d5c486ade5e351919100cc").unwrap(), - UInt256::from_hex("3d138eeaa5f63b564835d4f0348ea57d97486cb835a084be919dbaf6ffa6ecb6").unwrap(), - UInt256::from_hex("7e060ee3526d1f6babcf087f80d58861124d7f4697c5574b3c455fb65a06fca7").unwrap(), - UInt256::from_hex("273a74505e1f361f4b4fb96ed11bc1f98c5397494b6090fe04fa67c82fb94cc4").unwrap(), - UInt256::from_hex("73b309fc6c9799bae0358ef888b068a7aa20eb1de2383bd7d3d9c030c1e8b8fa").unwrap(), - UInt256::from_hex("6c90b5675af7d0c073471a6ce1b6403478bad46f1794cd4e4cae1c78312476f0").unwrap(), - UInt256::from_hex("4468006f469e588b71db460f7ab151255e231bbb850c6a43d419c8eea4acba94").unwrap(), - UInt256::from_hex("49b52dece0b1657323b16ddf09dcc3bef804635a32f2de2750afbc0574a20266").unwrap(), - UInt256::from_hex("c6122878b9d65507f4c3f1060143ade134e09263f55a791c641a76057d3aea67").unwrap(), - UInt256::from_hex("5276ef5a097454b326aab2d6d09bbfd53989fd5d54d7bb98f314480449e53988").unwrap(), - UInt256::from_hex("a82a2449f8af0bcf93976415fb4abedd562f0c581ab61c541023e20b4e2d7fbc").unwrap(), - UInt256::from_hex("c0c8ddd0a59f54b75d3f3af57c721e396ab6ee22a3579ed91a96fe25c87a04ad").unwrap(), - UInt256::from_hex("8ada6c15af35ad39cdd731e38c7db0a32753fe7a586a2084b7fb59b559df78a1").unwrap(), - UInt256::from_hex("d09bf256459c39b774def612f9a6354d3d4f5d10ca4300b8b841eac3ef542382").unwrap(), - UInt256::from_hex("688d227649bbc5155824dc8013f0482eb7697667c1487f9dd459e6c3a6240509").unwrap(), - UInt256::from_hex("170201082d6d01c930921f22aa8215a2bd8731ab1926051beaf60a99b37676db").unwrap(), - UInt256::from_hex("914d162c56ea339b19901c4a44cd88bcffc683caabe54a353789c09cea9e9f56").unwrap(), - UInt256::from_hex("d606b85cb03ed5b11548a6cca5d85b31d1a2b3543b4678f7c2b23fb915affcca").unwrap(), - UInt256::from_hex("284ad64627455d4ca8f5f9075018b84c14b548022b19c63245bb773d5bc684e2").unwrap(), - UInt256::from_hex("1196a11122b202219c9c6d06e0ea6bac8045f188081c49001bd3cea59887c52d").unwrap(), - UInt256::from_hex("cfb5f3cc7c8c5a1f3ddcb5c7055a8fbeac17a3cb394a9698f291b9ab7e145454").unwrap(), - UInt256::from_hex("d48a6a84a588120653fa31532c9e18ac90823a119a8f25a32a6a798d1d6888cc").unwrap(), - UInt256::from_hex("6f43509c3329c761cd36d2045e9ac246f04983c929e4a7e7ea0046b1b5dd2dae").unwrap(), - UInt256::from_hex("4e4096582e781e63e86dc6e374884972ec33907add0d4a71588c6bc220bec7d7").unwrap(), - UInt256::from_hex("01e4554ca14ae334274026dc6f7f586e456516a54dce16805bd3bb7df4602be2").unwrap(), - UInt256::from_hex("ba54a9bd1ea26094db46ebfbd215adf9a4f03f681ef186c81f3d7f1be6ab7a5e").unwrap(), - UInt256::from_hex("529b80bf5566acda6af74911b8ee602c044aac1935c66db48cdcd2553586668a").unwrap(), - UInt256::from_hex("e1169c915e2d33b6197f09c80c2b4940662744dd2cc8bd7f564a480a786e307b").unwrap(), - UInt256::from_hex("b73a305b69cca3ef1eed0574093a8f5c93daf675aa38a5a0fc66a1e024ca140e").unwrap(), - UInt256::from_hex("f368d7768bd5ac608ea4e0cc99ffaa7bca2260be54c4b96e80bdb9e936c0e14e").unwrap(), - UInt256::from_hex("00335d1c7c7bec7ee9538c254e57e4cc5dfbd2f512f7dbbcd52d67b48a96f6a3").unwrap(), - UInt256::from_hex("68685659e87e5994e8d7be1d9e1405e818c713650a73ae940e1ad110f989bd05").unwrap(), - UInt256::from_hex("1e97b8da660008564174cf5e75ec47fad28e07eadbe2ad60f49376378387926a").unwrap(), - UInt256::from_hex("6db1b8db0170dde4f64403de2e9cf679d634290047201d620ea8ef4fe64bb3e4").unwrap(), - UInt256::from_hex("88135a11dda699fe47c5d382a4813437906b7903518b0b0a24ae713468584538").unwrap(), - UInt256::from_hex("f955fca6afc84689f311527462922e525bf5b598061545fd9649b61f83118d5f").unwrap(), - UInt256::from_hex("51deb1d22c56acdd5452ccc440e8948aeb4d94acd95a8ab54e49c209016d9fd2").unwrap(), - UInt256::from_hex("ad86aa32d2fdc821ed9ab248392e3e49ed0d28cb96014d2d35eeb9a7e3013ab0").unwrap(), - UInt256::from_hex("53d910b00dc4c096b49fc1165896bc7341e7798299e8f2fa5518494c4f57d699").unwrap(), - UInt256::from_hex("fc2bae55ae8d99e97de1ae41170e0e0a39c067fab6e263da2d9eeca58695c153").unwrap(), - UInt256::from_hex("b18f901af9ed2cd700338f3f46c8bfb08f15fb557cb6c49f097c52922748b344").unwrap(), - UInt256::from_hex("0bb411a461d7693a8de18f0a1924e0628db7650e2de5cea744e284373af07575").unwrap(), - UInt256::from_hex("9cc114d5630efe13347281298b746d7bee25befadba89f6839afcef6486e52ec").unwrap(), - UInt256::from_hex("25ff43a78cb15d0cc379fa053f7c7607cce471c93a9f3be4939f94102e38b408").unwrap(), - UInt256::from_hex("07d5bd2519b091171e0de1c685bcbaf63cf34866c068ed600e9192ad248aa72e").unwrap(), - UInt256::from_hex("9673c4295754f87ea1ffcb250c7c7fede0b39b08116d013582c9cf543e125e8a").unwrap(), - UInt256::from_hex("854675add071bd9435b11a8d1fcdc36be8d8ddca7c59ae992e8b0279cfe5fb18").unwrap(), - UInt256::from_hex("33fbe8fe4481da36b2ed4e8966966cd36dc0033c34d9c299dd67fe0d10fc85c7").unwrap(), - UInt256::from_hex("0d8b1c5d932aa8e58b273212af3c89bd159310efd65d902aeccda04dd6e4967f").unwrap(), - UInt256::from_hex("f6f95a78727f17468c3817c45e171d8291cab0288fffd34ff05074c246634bd8").unwrap(), - UInt256::from_hex("7f5c0f3296a6e22e533a90fd59b1c4b9418c397045954b31fca1fdc763fc8a86").unwrap(), - UInt256::from_hex("65aac8656da4feccf2ca3dccfbc4354846ed97f51c1278022d539dc0977bb614").unwrap(), - UInt256::from_hex("ab082616b5da66b5614d1b97c3759276ad216944c8ac519d390679aaa0b2056a").unwrap(), - UInt256::from_hex("c9fbba4dd0e6eaf43d8d266111bd2a0701eb7cb797a8ce9858217ec00fbf1e14").unwrap(), - UInt256::from_hex("55b18a7352a8996a9a035afefb2d1589c479a309b0a1fc52875e406898126b16").unwrap(), - UInt256::from_hex("2c1b54ec24b451f13bdca55abe6f542f8b3d6553509240f9710f998f04aa9590").unwrap(), - UInt256::from_hex("71ad8ece820b04ef12661b4a1ed463ff71fb37a445bd250b66b65cadda743a5e").unwrap(), - UInt256::from_hex("91d1e47dd69fe5ef5787086af9a269a52e71a5a8963f49f8d4c384ae99ac98a1").unwrap(), - UInt256::from_hex("f9e7c374d1bf171e214ea8f96f9f0ebf52c960846792546df11fb5a2b4da6321").unwrap(), - UInt256::from_hex("69a38bb2c09e55dd6e876046992e7e389327a13fb0cb479749ee09ed3cdb57fb").unwrap(), - UInt256::from_hex("99964fe5d1e7a5ceb19313db8894758fcc4e48a6baea314e40cd24b1898ea233").unwrap(), - UInt256::from_hex("3a5ce3c8c32c209cdf12a234b42aa8e38bf2bd041650a5043e88a3c27ddbd403").unwrap(), - UInt256::from_hex("c1e2203f2f39163e6363dcdeaf3192c52f2e39addc73b3d34783cf17fc949f45").unwrap(), - UInt256::from_hex("b178ceed4a30285679797155aa6fdbda31663a4d9e8bcba981c332bdeac022e6").unwrap(), - UInt256::from_hex("4ff3c2e76b43b8b76c069c2c43ef374410ff4c6ae3bfeead909fcd2ae4930021").unwrap(), - UInt256::from_hex("57e04ba7dd47408e941af0f637646f543181c4f6fb198901f0fe1e3e5d39661c").unwrap(), - UInt256::from_hex("f2ef52f9f83bcb0895b57df9fd512d03a3e10ac8791d532b9fce65aaba9834f0").unwrap(), - UInt256::from_hex("b845fe54f1f9754c1fe8cc6d075d2f5bd05af11cef7353b26a3acf21fe8226f1").unwrap(), - UInt256::from_hex("bd2d69a7eeca5bbd3070f834eeb5612fc529ad22539622e519744b038a984387").unwrap(), - UInt256::from_hex("3f680ae7616d471729ef0cfc84bca6e0c3c9c19cf15e07a5a451074ba0bdcd01").unwrap(), - UInt256::from_hex("0c1afa037067adfbb4874a101663eaf42137266d605b2873b60983beba87cadd").unwrap(), - UInt256::from_hex("bd51b858dcc711ff89fa1499981196be4207640214a50cfbdfccf6054523f987").unwrap(), - UInt256::from_hex("921b214d0c901a7e890aa3aa5ff16b782e0c25fe2f3dd8fc525e348e1e8b63ce").unwrap(), - UInt256::from_hex("4ad6471354da794e9db769e9465fec5db9aa3f575b4ccf8c4ff889ecbdcdb8d0").unwrap(), - UInt256::from_hex("f922851fcafc86876642e29043dfdf6684b410830d203b3bc02d10837751c44b").unwrap(), - UInt256::from_hex("f58855661d972309ff106a6346670b362172e0d7bc13ca82fe3515a48a68302b").unwrap(), - UInt256::from_hex("370fde22aaed5e2b0da27043ac2ff0608b52b29780e41ff021061030443ae20d").unwrap(), - UInt256::from_hex("bc1fad8ad7ae013eb72f2b7cdd421b667b02397ff3e3316fe153f032915d2601").unwrap(), - UInt256::from_hex("6668a82cfa8a5619b2719190c1de41934674ba37f1160b8e92c45e97addb3a8d").unwrap(), - UInt256::from_hex("13ab18043e25d18a0fbab47e74d6f6a338b63d7bd4167145511b2cde768ee01c").unwrap(), - UInt256::from_hex("d8a7ab90f1a0acb0f16c33a615fe603ecaaf7cfa9ef8f83578cf9bff14c14509").unwrap(), - UInt256::from_hex("c6ccc10908f2cb10f524c1fe2bd38b9513ff7713e5377304ecfab9afb22c8a2a").unwrap(), - UInt256::from_hex("6c726aea7c34bbaebfae9bdaec36d20af9df58b2722d6221df5acbccadd68ca8").unwrap(), - UInt256::from_hex("d89e020e377f5d017140a8ba6e26d4ce9e419877bd756eb90e4ea048d7d538b8").unwrap(), - UInt256::from_hex("c057c8e641ed84d90e8338a79eeaff0997fd1bbb01c5b3dcfea05b5b82ab3502").unwrap(), - UInt256::from_hex("8884a714756a168032c6372fd0c58cac040759ae2f9742874cc70a9d6ab38fde").unwrap(), - UInt256::from_hex("8d66127b38f89c264922e288cacd9bf2278876f96a0d5c4b063be45e60b98c29").unwrap(), - UInt256::from_hex("6aa97c683f72464adf808486ae06780abdcab6606be1a1a8c5c5cfaa70eb6d65").unwrap(), - UInt256::from_hex("4991813af0a747f5775646a48f9d4115f7e9f8bb239c58148e24c1da971e116c").unwrap(), - UInt256::from_hex("6e793293a676277c97c8d8ffe25a958e5627caeafa270da4dc9b96e2e88379ff").unwrap(), - UInt256::from_hex("572708276e69de93ea18e7ce4e66bb621ff9f3267ab7cccc536795689fb1fe8c").unwrap(), - UInt256::from_hex("f0ec5589209991c869034f0e577f7413eb73427d0f7b07a957c1385e4ffb8014").unwrap(), - UInt256::from_hex("efe21840c8bb668d9828c9a99712f560f032c1f471e982a27bb9f3194647cd26").unwrap(), - UInt256::from_hex("065e829bb4c5e3c3890cc7890f7161e896866f740dd5ab9f7800eb87e7927cb9").unwrap(), - UInt256::from_hex("642fd11e9eb7727fee1aa908706d30c09be7a8bddc5fafb49a2431e9625d8d7e").unwrap(), - UInt256::from_hex("4f39065ecda5dd3e5293001ad0b81d9a0a0fd589aceb5ac02891e47edf73b869").unwrap(), - UInt256::from_hex("6a66582ad87329ba7c06aea20873e2880c5ac48b4fe36d7357de0849ae201436").unwrap(), - UInt256::from_hex("6f36e52b6e5d9b45271096765b2a44ae84c783f457458a2d1700561ae6cf543c").unwrap(), - UInt256::from_hex("9662bf990453a04251b26bf66bf9b5ed90ecf83f3ba3f8f66c317502f4d866af").unwrap(), - UInt256::from_hex("1c3580556e5642cc25cc674e8cfae5c2b65848b34cac6809ee683ed247323195").unwrap(), - UInt256::from_hex("a8098656e72dfff7dc0a3aeff7d3d9f97de9b1eea3e41786818c7f3f9a367780").unwrap(), - UInt256::from_hex("397085f4cc1e92a17515fc326c65234f5286b555098754d38693f027b9953257").unwrap(), - UInt256::from_hex("3fe0d1ed6efd7900b75b369effc8aaf1cfcf47324f4c848a8aeb5c615bb11c2d").unwrap(), - UInt256::from_hex("a08514a23e8339afd576ce9f09b38bb9af6369dcf00939b0f4b3d3913140e6da").unwrap(), - UInt256::from_hex("76d14be3721e4534db2f00a0a2cd486603a043eb0bf155566987146418e0a637").unwrap(), - UInt256::from_hex("8cad5bff566ae3a38e88680430825ae6cf0f0812df0c6ecf4b94c15a52c2f2b8").unwrap(), - UInt256::from_hex("d0ddbe1971be00474d8d1a63da8b84c5bf6c2f0a3c185796502344092921b493").unwrap(), - UInt256::from_hex("6b4f66e57cf5bdf6a0f3accdfefe51e8e493ff254cfdb093b76968a660fe5878").unwrap(), - UInt256::from_hex("de325fab1171332d31ca8142ff4ab49af88f6b6bd651dbbd263fc3aabb7ef84a").unwrap(), - UInt256::from_hex("ed4e01e08bafa9d8efa778c96da03f7341901933dba8b6557c67ee2df501e48f").unwrap(), - UInt256::from_hex("53289d2ebfd4f37a685d2b0774817e7dfb943587540e85524265bb5916c42986").unwrap(), - UInt256::from_hex("c8f2cb8e9eb7d1e4448454f23a03166c55642ac27ba85adb1f738e0353710fc3").unwrap(), - UInt256::from_hex("daee1fc2f3509568c0f87c230314282bc5f13a9a1aa1c661f849762da8cfc1da").unwrap(), - UInt256::from_hex("1d7d7a71d82ad285613c46be70c7a7d1cd64a5832c8a9d0f8e1c3f19bc2803e7").unwrap(), - UInt256::from_hex("867620cf3a1fec5f455fbdb3577782eddde4218e4cdf3dbd4b1ae63867e16b29").unwrap(), - UInt256::from_hex("80a10a29da93fefd8a3bd9fb508a63ec65e3a561137223cf4af43050fe495d05").unwrap(), - UInt256::from_hex("790ccf70d7a4faa77dc199fecbbd2bac725434d9612ffd12f7da09d751714cc9").unwrap(), - UInt256::from_hex("d58cb91c184233d1f07f22b8eeeaf19b88df9d0f4e7508bbefdff6c940383c0e").unwrap(), - UInt256::from_hex("712927b1815317b2adca5c953d69b4480296715a1a036f1ec0e6caace1c19f03").unwrap(), - UInt256::from_hex("c2ec1153a273d5adfff01bfd08f595baa0e8126481f2617e4ea37011c55216e1").unwrap(), - UInt256::from_hex("c10c93ce089ffacf0b12350bc3c835bf027e42179d4d4c66286aac40e9629d63").unwrap(), - UInt256::from_hex("9f3fb5170bd6742bca967e68abc4f326215a8bd3f51a6c678c320195f64b85ba").unwrap(), - UInt256::from_hex("f3385257c512a405fe3e2686934bb82e94843f9013122604474da45e264f7f16").unwrap(), - UInt256::from_hex("3c01accf8fa4c60c3ff14d2c5874f6d2672cec4efb726b80e80415f7bf03175a").unwrap(), - UInt256::from_hex("3fc847893e9e6250aea160abaa64a7396615fcb9ca40c55f220718d55ffa54f1").unwrap(), - UInt256::from_hex("c0fb0bf61a43b1823eb9d4446f0c8dc31a0e8f9f11727b7762b48b378e0b702f").unwrap(), - UInt256::from_hex("813f501c2f5071172be0bdf0e6d9916856582f6df4111654f6a33ceb3cf86b93").unwrap(), - UInt256::from_hex("cd1f36bf170c78ad6fc395c0259b8b821d325a6d5ba18031fc571c313affbe38").unwrap(), - UInt256::from_hex("cece35461902d3d93d6b92d1ba6e987451c89efce3546eb0622843540c2781f8").unwrap(), - UInt256::from_hex("860763c4d65bebc2f6b3da76da0e69c62eae470f2d7ff17be192dd266d90c777").unwrap(), - UInt256::from_hex("73cd1a4672f37ada0994d8a96a1451af4a812fe2283fa751bb20b6fef261b57c").unwrap(), - UInt256::from_hex("4b14b7d9e51effb57f5f12dc03ed39c0f10d60774d220482b05576c855fdf137").unwrap(), - UInt256::from_hex("1209496fdc7a1934161651143833172a56fc518a7cfb64686bf1e9cff98f52be").unwrap(), - UInt256::from_hex("37665da935dd92d2164a51b9209576b4ca2c700217789139cfc2551b534a8c97").unwrap(), - UInt256::from_hex("03b452abf55fac171eb2d0a28d9dd8f3c3f0d48f25ba6f6005a9f7fff6399174").unwrap(), - UInt256::from_hex("1f53eac62ae6e3e512d497fd2cb1386d9cb5126a4fc7bfac481fd57762418e04").unwrap(), - UInt256::from_hex("f0c9001af8e472413811d580adcf5b204c345e060771c94735c48147d179b896").unwrap(), - UInt256::from_hex("0b1256f5b6af45e66a4095fd23ef53357f0469aae79fed58838ef5170658b6be").unwrap(), - UInt256::from_hex("f75b2fade451c4ea61d0938e1cf1c06f5d2bc3a97cf38f383d7fb5c2564f0072").unwrap(), - UInt256::from_hex("5d2d58458a26336dc2ddac77b3bbaa9f21670ec74af01956ded4aa4aa589f9c0").unwrap(), - UInt256::from_hex("4a5987ab0577b13831d3e18fd048fda9ecc4d2bf3e1f7f869c879c9e67d2a73c").unwrap(), - UInt256::from_hex("c6393a369aa9f99e8b8ce5e60e10b60c4535d6e47d16076526626c218eb69498").unwrap(), - UInt256::from_hex("f23c8b054a28f4f54a43e14269b117966d51c8066b4ee69bb5368902a24950c5").unwrap(), - UInt256::from_hex("f5da85fffab1bb2ca472adb14d29f9859ea7f10a73c529530aea4eaabcfb4354").unwrap(), - UInt256::from_hex("6d71c1ffa65bfba8007291049009187c80c9a74a9804d764c0df67652ed9c173").unwrap(), - UInt256::from_hex("551e5c5366cb467072b0de54b4e9f9c14bcb2426deb3b1ceb8ea621df67f0177").unwrap(), - UInt256::from_hex("9ba2904cb04f448c71761ff4ebb3dd208a9e2d9dbd6189304cdf6b9b0592214d").unwrap(), - UInt256::from_hex("9af29689982ecafbe1e2c89358cff2d42376115d6aae162c56b8ef2e6f19fdbc").unwrap(), - UInt256::from_hex("0d5058453a5378f5ed4a37ebcb7720a283136854655e19076814b58206d752bd").unwrap(), - UInt256::from_hex("700d7c952c473f5f430a3ddabb84b0ef67a79e31440f1b01e849038c04c777fe").unwrap(), - UInt256::from_hex("fd2b4d505c1eb7dfede267a5cbca136818873a91ec1c57844af46f7dfda8ae0c").unwrap(), - UInt256::from_hex("c12d21e616ccdcb84bb2ff49024d102376770df3c6b68793e2ae54176a058de2").unwrap(), - UInt256::from_hex("cc3e43df79ee9c276aa2d3d0437d6be501c114b8f7162f42fdd00f0e4610a42b").unwrap(), - UInt256::from_hex("ad22b2e3b83b535e1b0b9838d568ce24cb2d76fe147b214cd46ca9ea7917b4b7").unwrap(), - UInt256::from_hex("655fa1c0ed68a37a63b1f810f51706b5e16bad137d85c77102c102652eadf4ae").unwrap(), - UInt256::from_hex("e4dcd1e16712584c7c17d17ae9329f607261c447544660cd8fa760bcee86facf").unwrap(), - UInt256::from_hex("f1313d63c8b91f7eb27aab604089e9d75f5fd9eca7001df2c1158283adf7b99a").unwrap(), - UInt256::from_hex("56333720e05a851e37d51e9427e66a7c9380e2f5ccccc84e359e64bcf17f3857").unwrap(), - UInt256::from_hex("be860723b5bada008cf880010c468b8e4d218a0c2187f6cf2e3e28df4cc36d97").unwrap(), - UInt256::from_hex("ddb5ce9fbee2726ee9fd8f733acddb786519290f1b88b8057c97e5d43ff96e79").unwrap(), - UInt256::from_hex("f28cd8cf1afd206209d7a4a2caa67ee014640ac28f05940e695a0b316caa071c").unwrap(), - UInt256::from_hex("08da2ce3a77039fe2560127b8fa0b83497d21c153b17a16dc068780f145f44f5").unwrap(), - UInt256::from_hex("6d7b22af5c9acd25d80cd3496988f97fdda962cb632be29a9f675b8f129d8ddb").unwrap(), - UInt256::from_hex("f9d2d5fe512f846282a05c18a9ff2b65b2964efd1c942101a1b78430162cb0f4").unwrap(), - UInt256::from_hex("26b6a446118c70f83ba808d69ee492c335761038e1fd9e9d81caa2666dd51cb2").unwrap(), - UInt256::from_hex("595a0175cd08f6eb0c0c7660a7a3f6ed2a8e761b62ddd71440bd0c744e951d41").unwrap(), - UInt256::from_hex("89180c0c550bb1b9786c4cb32a7e079f2de94739ff4d4c0be9c803f99abeba26").unwrap(), - UInt256::from_hex("95e86a0cf83c640bb805f089b664242af8a44dabf0d62e94a9ca10887d876d15").unwrap(), - UInt256::from_hex("64b86b8b48f4d9f884368d79520a0adcc239687126bf245400ff81a4485e4a7f").unwrap(), - UInt256::from_hex("ea4c93192dc54a4a862a992a2a7a47e77ed8fd4c454ea92de663b77ac5183e6f").unwrap(), - UInt256::from_hex("7737062c9a475de568198a10b0b619d6c8f0afb64a95ba9562c56f2d2f271406").unwrap(), - UInt256::from_hex("b98bb14865b11f9b2f3e0d54cbca6dcec2a1dcb4d256e5e0f1951b434b9196e1").unwrap(), - UInt256::from_hex("15b4ac699090a4d4f942b52382e8263163c9d0f2ae84d52f3592d82024c3aea7").unwrap(), - UInt256::from_hex("12a5b142ee53e7382d5a5bfa9caf798b8c75e499c6fc4c9cbcab753e1cc252b4").unwrap(), - UInt256::from_hex("254eee874d58ef50c417c32bf6e5da4191626a6affd0f381ece5a67518a2d11f").unwrap(), - UInt256::from_hex("8d400a4e6b445001caad5ee070aeb2aac8410c069c9cd6b976753c4e50e02b0b").unwrap(), - UInt256::from_hex("ac68e2d6a1da9172e2000d6174d6bd1a1dbd9ad27b36a30ea174d0fa3ad6134e").unwrap(), - UInt256::from_hex("baaa1978d1b56bcda53a03485869216182d51a5a685c00e9e5bd7a2602823c58").unwrap(), - UInt256::from_hex("49453bbd6d06594455ffcb76b1ea91d31cb6d1f63fa5c42dae24ae7498c1a667").unwrap(), - UInt256::from_hex("c0d25334b89c545bd27cdf91bb2219ac3b336f12f8630354193c8d790cc73865").unwrap(), - UInt256::from_hex("1f4ab767f64d321f61d0a0995faa3096bf54742d62efe594aeabba6dbfc7e830").unwrap(), - UInt256::from_hex("dfb3586607b1251ada77cce997f8a9aa407ea4e44bd0d93687f83710d95efc39").unwrap(), - UInt256::from_hex("a3a56d57d83efa4fc437291f5137f7c18c57b21bfb760e3ad548f8c594f9b34b").unwrap(), - UInt256::from_hex("5bd19476a478c74785daba30e91d6371c3bddb7b2b4758291938a4dc310e3ea7").unwrap(), - UInt256::from_hex("22eb46a7554535adf84d3e0b0fb8321027c1028af40ca264867167f93ebf73a0").unwrap(), - UInt256::from_hex("2735e353b9d1074a87ed8c0f97f1d025c0305f4572a38662809826652ce6f351").unwrap(), - UInt256::from_hex("f61ee221a1aefecbf038feaf98dd719036b05039702d2c7b5d4fc62e4005de30").unwrap(), - UInt256::from_hex("1ee33e687bfcca12fbbbbc7463b7fa5855cf3611609f3947b8ce517a65f2aef3").unwrap(), - UInt256::from_hex("329a0dd5a23e0a524d8a5f24b4ad659aeed8ec10d6679e15ac3aea3d96d9d7cf").unwrap(), - UInt256::from_hex("c7492b5e02229690c72c9f0eaf77abc10577e01c6bc67a3882533a81dec856fd").unwrap(), - UInt256::from_hex("8596f685756e9481497eefa7a15c7e32468bf434ae3a11651b19dc5b52b0524a").unwrap(), - UInt256::from_hex("4fee70dc9e8d95277d6fc186d9ace9506f3bc791a74a4ddd776ff631329cc791").unwrap(), - UInt256::from_hex("8ae4b3d80009bdc2a8dbcd2c306fd7af87811e0bf281fa43335d1795b0c8bf1e").unwrap(), - UInt256::from_hex("3bf98b8bab2bd3ba697abe4aa8ba68f3ecfa9a94ccedb684ae550f8085142d85").unwrap(), - UInt256::from_hex("e0dcfeabe40d2bd7a6b0242ca6930e3ecb5d7e4995d63e57048e9c550bad2b00").unwrap(), - UInt256::from_hex("e184bb5593f302b5f7463520d3ab13db94788d9000e774b1560299672914d511").unwrap(), - UInt256::from_hex("65b25e426b55fb2ca44c95b2738d775b97304c0af18745454f92d59f96512e80").unwrap(), - UInt256::from_hex("6147b362effe787ffc465c0d39e9737e068e1b5df94273037d21a39a4eab6d3c").unwrap(), - UInt256::from_hex("d43625a4e687020f86417bf7bc2412711b49fa27d0e8a99a15543a6a5e5c8531").unwrap(), - UInt256::from_hex("58473e110a5ecce2aa49cb992ad5865f24929f7e5f081f3f8aadb20b979deca0").unwrap(), - UInt256::from_hex("c5f1336a330ee42641f340ae20d3c435ad54b3366e656b612250f7e70e2745d8").unwrap(), - UInt256::from_hex("262d20a6c7b27c31f5760296efeced87b44e94e9c4d34ddad28e659a84e16241").unwrap(), - UInt256::from_hex("65cfab1408b4c8cc9a875960246358378805338bc1f434636dc94e99acccfab3").unwrap(), - UInt256::from_hex("b7a90269fbe5f0fb5ef28ad82f140ff3c121adb22bc236dc741ffab517bb69d0").unwrap(), - UInt256::from_hex("7d9a05de3fabe0e82073c8eb87086c758dbf1d6755a526a3e1b82d7c008b29d1").unwrap(), - UInt256::from_hex("78e8e29ad2c21ca4fd9065603651e20564a00b902e503ec39d8b198e1eb9135f").unwrap(), - UInt256::from_hex("e88b32419da1313a72949644a6df7b0ee0629999915203fae9663567d80f106d").unwrap(), - UInt256::from_hex("918ccdea0dc7ffc311d0c6751d7cbf29ad6cde40dfce88d7e011c85490ecf41b").unwrap(), - UInt256::from_hex("f4917d877c34e550f07f63afdf6393319863b1f04704c312a3dbae693bac6383").unwrap(), - UInt256::from_hex("35dcae6d88a079188b8da96789104dced067c57a82a22c7e10a606d7b4bda1dd").unwrap(), - UInt256::from_hex("b9cdc6e58f675a5ae083d7f6bda44b88961dd8946e0378324ee4c54c99479b27").unwrap(), - UInt256::from_hex("6d36008e4492d6b490c0019ac7fde37978bdda52e47b53f1f679f026addbdbe8").unwrap(), - UInt256::from_hex("696b9c0eac6c9e500d0464ee2a9c0d45ceb9b2a895493a9e8596217cd687b64a").unwrap(), - UInt256::from_hex("b15d52da7e1b73631b26b50fc322d909cbc1cde174581277c53ae2be66efb308").unwrap(), - UInt256::from_hex("e969ef9630cba22800158836c3ef72c02b4580d02fb7c4a8afa2f5b85340fd8c").unwrap(), - UInt256::from_hex("914910abd631419348765699ecc51c01aa194e5f7c4aa786b16ba270976b559c").unwrap(), - UInt256::from_hex("2bb92be2f2dfd92c431e9950ed100992a7246253ac9beb85364b12912298139f").unwrap(), - UInt256::from_hex("d686e0a13cfea6c41de3f3e02a7e08f5ac64389f736b0414cc96fb6e63c0b0bc").unwrap(), - UInt256::from_hex("af7f84a7d9f0fac4bf5aeef1b6e89ab45cc91a62b33b51c6a9f87e0b59cbc3e7").unwrap(), - UInt256::from_hex("4cf8764ce3bcca1b752162c9b4924d401bb735d64bc297258cda4e0bcbce6843").unwrap(), - UInt256::from_hex("473a8b34eaeee13573ba87646b26fa6cd673d462ce0a939e4d568f04a07156cf").unwrap(), - UInt256::from_hex("f8bdfe07ee2578af3a6f5a78e53f47eb8017769c30a1dcd01459aca454a8cf8f").unwrap(), - UInt256::from_hex("d76ca1d0b272afc2a995bdca67f7926a98eef012e15cdc7578b033d3caec6909").unwrap(), - UInt256::from_hex("2643455f725d2f41ceaf9682ce87f1ce91cf51be570224baa3b81321d43f83d2").unwrap(), - UInt256::from_hex("a2352d1d1f18afcb23b015e17a7ecbd696b90033cae2edb259588f31e39d4f3f").unwrap(), - UInt256::from_hex("7f40fbdf2c94c086cfdbf8063c2cdfcdce649e5dd0ba22d446b0fa9af01eabf0").unwrap(), - UInt256::from_hex("f56eed8edcad82751ba7bf11e91d220e6214deb12ca3f84a19a78aef60469e61").unwrap(), - UInt256::from_hex("6ce15a914b2019b4d2f64b8c258ce05ee6bfd510fc8b7cb9e6d8185d8caff1ad").unwrap(), - UInt256::from_hex("c056b7c79fa67b06632127dde65663d5b16cae84e434fa15b4d52afb756a20d6").unwrap(), - UInt256::from_hex("a36ddddb232c549ba376b4e9909a7a07e48c8c10e9fc3c09c966e488c6286915").unwrap(), - UInt256::from_hex("661adf362740f4a3818acb70978126fb103b6360ab1f51d0662fca81e3b751a3").unwrap(), - UInt256::from_hex("bc0648cfc85b6ca1f79896208bff33b61aa8948e30932f27bc7ce55ed789ed41").unwrap(), - UInt256::from_hex("23abc5fd590e8804f0ca4da3cabd3e4a6586862f0012476dec456b18be67ee31").unwrap(), - UInt256::from_hex("74afb7fff229c6f149872521c071bb80323218825aa948d1ecef862e2f9c51e7").unwrap(), - UInt256::from_hex("b6b1417c193daa7b97ac20a6353831be4feff04bd0325efab21a9959e422d482").unwrap(), - UInt256::from_hex("f5f79d34d9c10df30cfc024ed35607bf76dc76f24e4f1e57427b8bed10a5d836").unwrap(), - UInt256::from_hex("e70eafd0a3b0b4a482dade2afa562199ae86290fdc9d304c35e26d5c1562fd83").unwrap(), - UInt256::from_hex("2cb7ad706b857f3c17f655ed84d4df69885fb8e701454ef2ba163613692689bd").unwrap(), - UInt256::from_hex("a732dc34921014c9f4be9ec8e91791894ef324d7519a5e0038d2f8af848adaf5").unwrap(), - UInt256::from_hex("e5ff0e8252166e03d1e650f24d685e929b12871d6790a9f664bedd4d1da0fa79").unwrap(), - UInt256::from_hex("69b687ada4aab43d5798f72402e233b9c0e414056f2daad894411bece75db22f").unwrap(), - UInt256::from_hex("095d86c2ad5998c0a5dc722eed54b2f18724f91121123045aefd64d78c7606bb").unwrap(), - UInt256::from_hex("ba53501b35ff90f93d6cf99462ef96211be215362eb9f9b6c65464531e35d0fa").unwrap(), - UInt256::from_hex("cf42dfaa9522c7af2c690328be1d9f70d9b14c6207d1614ed96242585bd00dd0").unwrap(), - UInt256::from_hex("f1511a8dc45d82bdc7ee6cef25b574bf58e1ee60be4e01a63d8f12afea437bab").unwrap(), - UInt256::from_hex("1b8b81cd633611b4ae29ae2ed2c0db9307b5bd64c13ad36ea012529cafec73d6").unwrap(), - UInt256::from_hex("56ff0e9a2150076b03be9a216225bf2e5a2387e1e94c41e38f337e25ebe2bec8").unwrap(), - UInt256::from_hex("0d0ae02f877d0a1f9e8cb33b3ae876b763dc1b062d1583ef4ff75d2300048038").unwrap(), - UInt256::from_hex("f1790b1db1b06f4bdc069337ff851f231151b503ca51876e351e4286f1a87b50").unwrap(), - UInt256::from_hex("d92b9b5cd6912347bf67c86be5e1c878fb71cc5e4d756576cda0e3970756c83b").unwrap(), - UInt256::from_hex("6f176bc3d18c3cd4f663249af2b45facd4c944736f6babd2ba7aeec5b88da129").unwrap(), - UInt256::from_hex("1572d4c89600f6aa69a15d374ddc1bdbc37e260511a48f1713cb295a4d8fd5f7").unwrap(), - UInt256::from_hex("7096d138cfaad0855a052c603f5666cd1bae259552c2e97237fe3def4dfd05b0").unwrap(), - UInt256::from_hex("f4ed2b9b9da593cc2a78a4f07f3efdcbb49de1b803cab8b9988fe8b8ea6a9aae").unwrap(), - UInt256::from_hex("ddd6658330591c6a91761b98b37471c8f7d2fd9363ce74aeced123791e9fcd66").unwrap(), - UInt256::from_hex("f67833dbce400c96d633cf0e8b8c60ca7ea70fbcd0fd748d1408fd2e7703f84e").unwrap(), - UInt256::from_hex("86b4f9f63d48c145c282012a149d1d716d845a9c1781436d4585b6366eb1133b").unwrap(), - UInt256::from_hex("68090accc7d3b1fae409ad096d6c8813a3ff5900ac32b57b6d33a4ff5f8c2478").unwrap(), - UInt256::from_hex("aa1d1cc68ee8fbe8e3d51330a28eda8cf5d9749e31ac1a5518d4cbbe627ef241").unwrap(), - UInt256::from_hex("6d27a16e6a137af602e47bbd64992c46623e00ffdfc1e66018e626716511a152").unwrap(), - UInt256::from_hex("0ac44988afcdb876cee272a59fe30546d800fd3751e780a3c1f9bd2fe0370835").unwrap(), - UInt256::from_hex("bbab186b508afa0a449bc7ddca82fc80e429d324dba3cdbe1f7198d57c0f0ad7").unwrap(), - UInt256::from_hex("e998a63b396efe599ffbccea9a50e2eda2ae83f6016a308d382accec23428aef").unwrap(), - UInt256::from_hex("f3536f95b51cc781dbc55bc65a57a08bb77cc4edb425ddf9ec313aabf352c7e1").unwrap(), - UInt256::from_hex("d37930382576d168ab9f0d1662c9ba048c114d6100487f25c25cf266249c644f").unwrap(), - UInt256::from_hex("215aaced5c3527a23ab919a5974f0ae355450a3e99d38762bb73e2e6070bb239").unwrap(), - UInt256::from_hex("71de51a9dbfa174c8cab524c75b002f86715fee6433839511dfb4786e12d3953").unwrap(), - UInt256::from_hex("f5791cecae11ce00c8148710118168e69f6e574ed2e2ab8325558e7366fd15b7").unwrap(), - UInt256::from_hex("e779e9d71fc2d14ba418c1588809f8e672a2f0e85f104a1a0793fbe04bdc9305").unwrap(), - UInt256::from_hex("b99bdd3fcfb73de03aef90b0b7df8679002e8fc487af14fac46d767c6d542b48").unwrap(), - ] -} - - -#[test] -fn testnet_test_retrieve_saved_hashes() { - let chain = ChainType::TestNet; - let context = &mut (FFIContext { chain, is_dip_0024: false, cache: &mut Default::default(), blocks: init_testnet_store() }); - let bytes_122064 = message_from_file("MNL_0_122064.dat"); - let processor = unsafe { - &mut *register_processor( - get_merkle_root_by_hash_default, - get_block_height_by_hash_from_context, - get_block_hash_by_height_from_context, - get_llmq_snapshot_by_block_hash_from_context, - save_llmq_snapshot_in_cache, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_by_block_hash_from_cache, - masternode_list_save_in_cache, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - let result_122064 = unsafe { - &*process_mnlistdiff_from_message( - bytes_122064.as_ptr(), - bytes_122064.len(), - chain, - false, - true, - 70221, - processor, - context.cache, - context as *mut _ as *mut std::ffi::c_void, - )}; - assert!(result_122064.is_valid(), "Result must be valid"); - let bytes_122088 = message_from_file("MNL_122064_122088.dat"); - let result_122088 = unsafe { - &*process_mnlistdiff_from_message( - bytes_122088.as_ptr(), - bytes_122088.len(), - chain, - false, - true, - 70221, - processor, - context.cache, - context as *mut _ as *mut std::ffi::c_void, - )}; - assert!(result_122088.is_valid(), "Result must be valid"); - - let block_hash_122064 = unsafe { UInt256(*result_122064.block_hash) }; - let block_hash_122088 = unsafe { UInt256(*result_122088.block_hash) }; - let list_122064 = unsafe { (*result_122064.masternode_list).decode() }; - let list_122088 = unsafe { (*result_122088.masternode_list).decode() }; - - let reloaded_list_122064 = context.cache.mn_lists.get(&block_hash_122064).unwrap(); - let reloaded_list_122088 = context.cache.mn_lists.get(&block_hash_122088).unwrap(); - - let entry_hash = UInt256::from_hex("1bde434d4f68064d3108a09443ea45b4a6c6ac1f537a533efc36878cef2eb10f").unwrap().reverse(); - let entry_122064 = list_122064.masternodes.get(&entry_hash).unwrap(); - let entry_122088 = list_122088.masternodes.get(&entry_hash).unwrap(); - assert_ne!(entry_122064, entry_122088, "These should NOT be the same object (unless we changed how this worked)"); - - assert_eq!(entry_122088.clone().previous_entry_hashes.into_values().collect::>(), - vec![UInt256::from_hex("14d8f2de996a2515815abeb8f111a3ffe8582443ce7a43a8399c1a1c86c65543").unwrap()], - "This is what it used to be"); - - assert_eq!(entry_122064.entry_hash, UInt256::from_hex("14d8f2de996a2515815abeb8f111a3ffe8582443ce7a43a8399c1a1c86c65543").unwrap(), "The hash of the sme should be this"); - assert_eq!(entry_122088.entry_hash, UInt256::from_hex("e001033590361b172da9cb352f9736dbe9453c6a389068f7b76d71f9f3044d3b").unwrap(), "The hash changed to this"); - - let local_hashes_122088 = list_122088.sorted_reversed_pro_reg_tx_hashes(); - let hashes_122088 = reloaded_list_122088.sorted_reversed_pro_reg_tx_hashes(); - assert_eq!(local_hashes_122088, hashes_122088, "Hashes for 122088 must be equal"); - - let local_hashes_122064 = list_122064.sorted_reversed_pro_reg_tx_hashes(); - let hashes_122064 = reloaded_list_122064.sorted_reversed_pro_reg_tx_hashes(); - assert_eq!(local_hashes_122064, hashes_122064, "Hashes for 122064 must be equal"); - - let mut entry_hashes = local_hashes_122064.iter().map(|hash| reloaded_list_122064.masternodes.get(hash).unwrap().entry_hash).collect::>(); - entry_hashes.sort_by(|&s1, &s2| s2.reversed().cmp(&s1.reversed())); - let mut reloaded_entry_hashes = hashes_122064.iter().map(|hash| reloaded_list_122064.masternodes.get(hash).unwrap().entry_hash).collect::>(); - reloaded_entry_hashes.sort_by(|&s1, &s2| s2.reversed().cmp(&s1.reversed())); - - assert_eq!(reloaded_entry_hashes, entry_hashes, "Entry hashes must be equal"); - assert_eq!(reloaded_list_122064.reversed_pro_reg_tx_hashes(), list_122064.reversed_pro_reg_tx_hashes(), "pro reg tx hashes must be equal"); - - let reloaded_hashes_from_122064 = reloaded_list_122064.hashes_for_merkle_root(reloaded_list_122064.known_height).unwrap(); - let hashes_from_122064 = list_122064.hashes_for_merkle_root(reloaded_list_122088.known_height).unwrap(); - println!("------ INITIALIZED ------"); - hashes_from_122064.iter().for_each(|h| { - println!("{}", h); - }); - println!("------ RELOADED ------"); - reloaded_hashes_from_122064.iter().for_each(|h| { - println!("{}", h); - }); - println!("------ ------- ------"); - - - let reloaded_merkle_root_122088 = merkle_root_from_hashes(reloaded_list_122088.hashes_for_merkle_root(reloaded_list_122088.known_height).unwrap()); - let merkle_root_122088 = merkle_root_from_hashes(list_122088.hashes_for_merkle_root(list_122088.known_height).unwrap()); - - let reloaded_merkle_root_122064 = merkle_root_from_hashes(reloaded_list_122064.hashes_for_merkle_root(reloaded_list_122064.known_height).unwrap()); - let merkle_root_122064 = merkle_root_from_hashes(list_122064.hashes_for_merkle_root(list_122064.known_height).unwrap()); - - let merkle_root_x = merkle_root_from_hashes(list_122064.hashes_for_merkle_root(list_122088.known_height).unwrap()); - - assert_eq!(reloaded_merkle_root_122088, merkle_root_122088, "Merkle root for 122088 must be equal"); - assert_eq!(reloaded_merkle_root_122064, merkle_root_122064, "Merkle root for 122064 must be equal"); - assert_eq!(merkle_root_x.unwrap(), UInt256::from_hex("86cfe9b759dfd012f8d00e980c560c5c1d9c487bfa8b59305e14c7fc60ef1150").unwrap(), "") - -} diff --git a/dash-spv-masternode-processor/src/tests/mod.rs b/dash-spv-masternode-processor/src/tests/mod.rs index 817c46e0..805fe82c 100644 --- a/dash-spv-masternode-processor/src/tests/mod.rs +++ b/dash-spv-masternode-processor/src/tests/mod.rs @@ -1,9 +1,90 @@ -pub mod block_store; +#[cfg(feature = "test-helpers")] +use std::collections::BTreeMap; +#[cfg(feature = "test-helpers")] +use dash_spv_crypto::network::{ChainType, DevnetType, IHaveChainSettings}; +#[cfg(feature = "test-helpers")] +use crate::block_store::{init_mainnet_store, init_testnet_store, MerkleBlock}; +#[cfg(feature = "test-helpers")] +use crate::processing::CoreProviderError; + +#[cfg(test)] pub mod hashes; +#[cfg(test)] pub mod indexes; -pub mod json_from_core_snapshot; +#[cfg(test)] pub mod keys; +#[cfg(test)] pub mod listdiff; -pub mod test_testnet_checkpoints; -pub mod bindings; -pub mod tx; +#[cfg(feature = "serde")] +pub mod serde_helper; + +#[derive(Debug)] +#[cfg(feature = "test-helpers")] +pub struct FFIContext { + pub chain: ChainType, + pub is_dip_0024: bool, + //pub cache: Arc, + // TODO:: make it initialized from json file with blocks + pub blocks: Vec, + pub cl_signatures: BTreeMap<[u8; 32], [u8; 96]>, +} +#[cfg(feature = "test-helpers")] +impl Drop for FFIContext { + fn drop(&mut self) { + println!("FFIContext is being dropped"); + } +} +#[cfg(feature = "test-helpers")] +impl FFIContext { + pub fn block_for_hash(&self, hash: [u8; 32]) -> Option<&MerkleBlock> { + self.blocks.iter().find(|block| hash.eq(&block.hash)) + } + pub fn get_tip_height(&self) -> u32 { + self.blocks.iter().map(|block| block.height).max().unwrap_or(u32::MAX) + } + pub fn block_height_for_hash(&self, block_hash: [u8; 32]) -> u32 { + self.block_for_hash(block_hash) + .map(|block| block.height) + .unwrap_or(u32::MAX) + + } + pub fn block_hash_for_height(&self, block_height: u32) -> Result<[u8; 32], CoreProviderError> { + self.block_for_height(block_height) + .map(|block| block.hash) + .ok_or(CoreProviderError::BlockHashNotFoundAt(block_height)) + } + + pub fn block_for_height(&self, height: u32) -> Option<&MerkleBlock> { + self.blocks.iter().find(|block| block.height == height) + } + + pub fn cl_signature_by_block_hash(&self, block_hash: &[u8; 32]) -> Option<&[u8; 96]> { + self.cl_signatures.get(block_hash) + } + pub fn genesis_as_ptr(&self) -> *const u8 { + self.chain.genesis_hash().as_ptr() + } + + pub fn chain_default(chain: ChainType, is_dip_0024: bool, blocks: Vec) -> Self { + Self { chain, is_dip_0024, blocks, cl_signatures: BTreeMap::new() } + } + pub fn create_default_context(chain: ChainType, is_dip_0024: bool) -> Self { + let blocks = match chain { + ChainType::MainNet => init_mainnet_store(), + ChainType::TestNet => init_testnet_store(), + _ => vec![], + }; + Self { chain, is_dip_0024, blocks, cl_signatures: BTreeMap::new() } + } + pub fn create_default_context_and_cache(chain: ChainType, is_dip_0024: bool) -> Self { + let blocks = match chain { + ChainType::MainNet => init_mainnet_store(), + ChainType::TestNet => init_testnet_store(), + _ => vec![], + }; + Self::chain_default(chain, is_dip_0024, blocks) + } + pub fn devnet_default(devnet: DevnetType, is_dip_0024: bool, blocks: Vec) -> Self { + Self::chain_default(ChainType::DevNet(devnet), is_dip_0024, blocks) + } +} \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/tests/serde_helper.rs b/dash-spv-masternode-processor/src/tests/serde_helper.rs new file mode 100644 index 00000000..b07afda6 --- /dev/null +++ b/dash-spv-masternode-processor/src/tests/serde_helper.rs @@ -0,0 +1,208 @@ +use dashcore::hashes::hex::FromHex; +use serde::{Deserialize, Serialize}; +use dash_spv_crypto::crypto::byte_util::Reversed; +use crate::block_store::MerkleBlock; + +#[derive(Serialize, Deserialize)] +#[cfg(feature = "serde")] +pub struct Block { + pub hash: String, + pub size: i64, + pub height: i64, + pub version: i64, + pub merkleroot: String, + pub tx: Vec, + pub time: i64, + pub nonce: i64, + pub bits: String, + pub difficulty: f64, + pub chainwork: String, + pub confirmations: i64, + pub previousblockhash: String, + pub nextblockhash: String, + pub reward: String, + #[serde(rename = "isMainChain")] + pub is_main_chain: bool, + #[serde(rename = "poolInfo")] + pub pool_info: PoolInfo, +} +#[derive(Serialize, Deserialize)] +#[cfg(feature = "serde")] +pub struct PoolInfo {} + +#[derive(Serialize, Deserialize)] +#[cfg(feature = "serde")] +struct Masternode { + #[serde(rename = "proTxHash")] + pub pro_tx_hash: String, + pub address: String, + pub payee: String, + pub status: String, + pub pospenaltyscore: i64, + pub lastpaidtime: i64, + pub lastpaidblock: i64, + pub owneraddress: String, + pub votingaddress: String, + pub collateraladdress: String, + pub pubkeyoperator: String, +} + +#[derive(Serialize, Deserialize)] +#[cfg(feature = "serde")] +pub struct QRInfo { + #[serde(rename = "extraShare")] + pub extra_share: bool, + #[serde(rename = "quorumSnapshotAtHMinusC")] + pub quorum_snapshot_at_hminus_c: Snapshot, + #[serde(rename = "quorumSnapshotAtHMinus2C")] + pub quorum_snapshot_at_hminus2c: Snapshot, + #[serde(rename = "quorumSnapshotAtHMinus3C")] + pub quorum_snapshot_at_hminus3c: Snapshot, + #[serde(rename = "mnListDiffTip")] + pub mn_list_diff_tip: ListDiff, + #[serde(rename = "mnListDiffH")] + pub mn_list_diff_h: ListDiff, + #[serde(rename = "mnListDiffAtHMinusC")] + pub mn_list_diff_at_hminus_c: ListDiff, + #[serde(rename = "mnListDiffAtHMinus2C")] + pub mn_list_diff_at_hminus2c: ListDiff, + #[serde(rename = "mnListDiffAtHMinus3C")] + pub mn_list_diff_at_hminus3c: ListDiff, + #[serde(rename = "lastCommitmentPerIndex")] + pub last_commitment_per_index: Vec, + #[serde(rename = "quorumSnapshotList")] + pub quorum_snapshot_list: Vec, + #[serde(rename = "mnListDiffList")] + pub mn_list_diff_list: Vec, +} + +#[cfg(feature = "serde")] +#[derive(Serialize, Deserialize)] +pub struct Snapshot { + #[serde(rename = "activeQuorumMembers")] + pub active_quorum_members: Vec, + #[serde(rename = "mnSkipListMode")] + pub mn_skip_list_mode: i64, + #[serde(rename = "mnSkipList")] + pub mn_skip_list: Vec, +} + +#[derive(Serialize, Deserialize)] +#[cfg(feature = "serde")] +pub struct Llmq { + pub version: i64, + #[serde(rename = "llmqType")] + pub llmq_type: i64, + #[serde(rename = "quorumHash")] + pub quorum_hash: String, + #[serde(rename = "quorumIndex")] + pub quorum_index: i64, + #[serde(rename = "signersCount")] + pub signers_count: usize, + pub signers: String, + #[serde(rename = "validMembersCount")] + pub valid_members_count: usize, + #[serde(rename = "validMembers")] + pub valid_members: String, + #[serde(rename = "quorumPublicKey")] + pub quorum_public_key: String, + #[serde(rename = "quorumVvecHash")] + pub quorum_vvec_hash: String, + #[serde(rename = "quorumSig")] + pub quorum_sig: String, + #[serde(rename = "membersSig")] + pub members_sig: String, +} + +#[derive(Serialize, Deserialize)] +#[cfg(feature = "serde")] +pub struct Node { + #[serde(rename = "proRegTxHash")] + pub pro_reg_tx_hash: String, + #[serde(rename = "confirmedHash")] + pub confirmed_hash: String, + pub service: String, + #[serde(rename = "pubKeyOperator")] + pub pub_key_operator: String, + #[serde(rename = "votingAddress")] + pub voting_address: String, + #[serde(rename = "isValid")] + pub is_valid: bool, + + #[serde(rename = "updateHeight")] + pub update_height: Option, + #[serde(rename = "knownConfirmedAtHeight")] + pub known_confirmed_at_height: Option, + + #[serde(rename = "version")] + pub version: Option, +} + +#[derive(Serialize, Deserialize)] +#[cfg(feature = "serde")] +pub struct ListDiff { + #[serde(rename = "baseBlockHash")] + pub base_block_hash: String, + #[serde(rename = "blockHash")] + pub block_hash: String, + #[serde(rename = "cbTxMerkleTree")] + pub cb_tx_merkle_tree: String, + #[serde(rename = "cbTx")] + pub cb_tx: String, + #[serde(rename = "deletedMNs")] + pub deleted_mns: Vec, + #[serde(rename = "mnList")] + pub mn_list: Vec, + #[serde(rename = "deletedQuorums")] + pub deleted_quorums: Vec, + #[serde(rename = "newQuorums")] + pub new_quorums: Vec, + #[serde(rename = "merkleRootMNList")] + pub merkle_root_mnlist: String, + #[serde(rename = "merkleRootQuorums")] + pub merkle_root_quorums: String, + #[serde(rename = "version")] + pub version: Option, +} + +#[derive(Serialize, Deserialize)] +#[cfg(feature = "serde")] +pub struct MNList { + #[serde(rename = "blockHash")] + pub block_hash: String, + #[serde(rename = "knownHeight")] + pub known_height: u32, + #[serde(rename = "masternodeMerkleRoot")] + pub masternode_merkle_root: String, + #[serde(rename = "quorumMerkleRoot")] + pub quorum_merkle_root: String, + #[serde(rename = "mnList")] + pub mn_list: Vec, + #[serde(rename = "newQuorums")] + pub new_quorums: Vec, +} + +pub fn bools_to_bytes(bools: Vec) -> Vec { + let mut b = Vec::::with_capacity(bools.len() / 8); + for (idx, bit) in bools.into_iter().enumerate() { + let byte = idx / 8; + let shift = 7 - idx % 8; + if b.get(byte).is_none() { + b.push((bit as u8) << shift); + } else { + b[byte] |= (bit as u8) << shift; + } + } + b +} + +#[cfg(feature = "serde")] +impl From for MerkleBlock { + fn from(block: Block) -> Self { + MerkleBlock { + hash: <[u8; 32]>::from_hex(block.hash.as_str()).unwrap().reversed(), + height: block.height as u32, + merkleroot: <[u8; 32]>::from_hex(block.merkleroot.as_str()).unwrap() + } + } +} \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/tests/test_testnet_checkpoints.rs b/dash-spv-masternode-processor/src/tests/test_testnet_checkpoints.rs deleted file mode 100644 index fc46afdf..00000000 --- a/dash-spv-masternode-processor/src/tests/test_testnet_checkpoints.rs +++ /dev/null @@ -1,86 +0,0 @@ -use crate::bindings::common::register_processor; -use crate::bindings::masternode::process_mnlistdiff_from_message; -use crate::chain::common::ChainType; -use crate::lib_tests::tests::{add_insight_lookup_default, assert_diff_result, FFIContext, get_block_hash_by_height_from_context, get_block_height_by_hash_from_context, get_cl_signature_by_block_hash_from_context, get_llmq_snapshot_by_block_hash_from_context, get_masternode_list_by_block_hash_from_cache, get_merkle_root_by_hash_default, hash_destroy_default, masternode_list_destroy_default, masternode_list_save_in_cache, message_from_file, save_cl_signature_in_cache, save_llmq_snapshot_in_cache, should_process_diff_with_range_default, snapshot_destroy_default}; -use crate::tests::block_store::init_testnet_store; - -#[test] -fn test_checkpoint_530000() { - let chain = ChainType::TestNet; - let context = &mut (FFIContext { chain, is_dip_0024: false, cache: &mut Default::default(), blocks: init_testnet_store() }); - let bytes = message_from_file("testnet/MNT530000.dat"); - let processor = unsafe { - &mut *register_processor( - get_merkle_root_by_hash_default, - get_block_height_by_hash_from_context, - get_block_hash_by_height_from_context, - get_llmq_snapshot_by_block_hash_from_context, - save_llmq_snapshot_in_cache, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_by_block_hash_from_cache, - masternode_list_save_in_cache, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - let result = unsafe { - &*process_mnlistdiff_from_message( - bytes.as_ptr(), - bytes.len(), - chain, - false, - true, - 70221, - processor, - context.cache, - context as *mut _ as *mut std::ffi::c_void, - ) - }; - - assert!(result.is_valid(), "Result must be valid"); -} - -// Need fix from core team -// #[test] -fn test_checkpoint_530000_70227() { - let chain = ChainType::TestNet; - let context = &mut (FFIContext { chain, is_dip_0024: false, cache: &mut Default::default(), blocks: init_testnet_store() }); - let bytes = message_from_file("MNT_0_530000.dat"); - let processor = unsafe { - &mut *register_processor( - get_merkle_root_by_hash_default, - get_block_height_by_hash_from_context, - get_block_hash_by_height_from_context, - get_llmq_snapshot_by_block_hash_from_context, - save_llmq_snapshot_in_cache, - get_cl_signature_by_block_hash_from_context, - save_cl_signature_in_cache, - get_masternode_list_by_block_hash_from_cache, - masternode_list_save_in_cache, - masternode_list_destroy_default, - add_insight_lookup_default, - hash_destroy_default, - snapshot_destroy_default, - should_process_diff_with_range_default, - ) - }; - let result = unsafe { - process_mnlistdiff_from_message( - bytes.as_ptr(), - bytes.len(), - chain, - false, - true, - 70227, - processor, - context.cache, - context as *mut _ as *mut std::ffi::c_void, - ) - }; - assert_diff_result(context, result); - // assert!(result.is_valid(), "Result must be valid"); -} diff --git a/dash-spv-masternode-processor/src/tests/tx/coinbase.rs b/dash-spv-masternode-processor/src/tests/tx/coinbase.rs deleted file mode 100644 index 52c3457f..00000000 --- a/dash-spv-masternode-processor/src/tests/tx/coinbase.rs +++ /dev/null @@ -1,12 +0,0 @@ -use hashes::hex::{FromHex, ToHex}; -use crate::crypto::byte_util::{BytesDecodable, Reversable}; -use crate::crypto::UInt256; -use crate::tx::CoinbaseTransaction; - -#[test] -pub fn test_coinbase_tx() { - let bytes = Vec::from_hex("03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff0502f6050105ffffffff0200c11a3d050000002321038df098a36af5f1b7271e32ad52947f64c1ad70c16a8a1a987105eaab5daa7ad2ac00c11a3d050000001976a914bfb885c89c83cd44992a8ade29b610e6ddf00c5788ac00000000260100f6050000aaaec8d6a8535a01bd844817dea1faed66f6c397b1dcaec5fe8c5af025023c35").unwrap(); - let tx = CoinbaseTransaction::from_bytes(&bytes, &mut 0).unwrap(); - assert_eq!(tx.to_data().to_hex(), bytes.to_hex(), "Coinbase transaction does not match it's data"); - assert_eq!(tx.base.tx_hash, Some(UInt256::from_hex("5b4e5e99e967e01e27627621df00c44525507a31201ceb7b96c6e1a452e82bef").unwrap().reversed()), "Coinbase transaction hash does not match it's data dash"); -} \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/tests/tx/mod.rs b/dash-spv-masternode-processor/src/tests/tx/mod.rs deleted file mode 100644 index 5aaff1df..00000000 --- a/dash-spv-masternode-processor/src/tests/tx/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod coinbase; \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/tx/coinbase_transaction.rs b/dash-spv-masternode-processor/src/tx/coinbase_transaction.rs deleted file mode 100644 index fa36be2c..00000000 --- a/dash-spv-masternode-processor/src/tx/coinbase_transaction.rs +++ /dev/null @@ -1,120 +0,0 @@ -use byte::ctx::Endian; -use byte::{BytesExt, TryRead}; -use crate::consensus::encode::VarInt; -use crate::consensus::Encodable; -use crate::crypto::{UInt256, UInt768}; -use crate::tx::{Transaction, TransactionType::Coinbase}; - - -pub const COINBASE_TX_CORE_19: u16 = 2; -pub const COINBASE_TX_CORE_20: u16 = 3; - -#[derive(Debug, Clone)] -pub struct CoinbaseTransaction { - pub base: Transaction, - pub coinbase_transaction_version: u16, - pub height: u32, - pub merkle_root_mn_list: UInt256, - pub merkle_root_llmq_list: Option, - pub best_cl_height_diff: u64, - pub best_cl_signature: Option, - pub credit_pool_balance: Option, -} - -impl<'a> TryRead<'a, Endian> for CoinbaseTransaction { - fn try_read(bytes: &'a [u8], endian: Endian) -> byte::Result<(Self, usize)> { - let offset = &mut 0; - let mut base = bytes.read_with::(offset, endian)?; - let _extra_payload_size = bytes.read_with::(offset, endian)?; - let coinbase_transaction_version = bytes.read_with::(offset, endian)?; - let height = bytes.read_with::(offset, endian)?; - let merkle_root_mn_list = bytes.read_with::(offset, endian)?; - let merkle_root_llmq_list = if coinbase_transaction_version >= COINBASE_TX_CORE_19 { - let root = bytes.read_with::(offset, endian)?; - Some(root) - } else { - None - }; - let (best_cl_height_diff, best_cl_signature, credit_pool_balance) = if coinbase_transaction_version >= COINBASE_TX_CORE_20 { - (bytes.read_with::(offset, byte::LE)?.0, - bytes.read_with::(offset, byte::LE).ok(), - bytes.read_with::(offset, byte::LE).ok()) - - } else { - (u64::MAX, None, None) - }; - base.tx_type = Coinbase; - base.payload_offset = *offset; - let mut tx = Self { - base, - coinbase_transaction_version, - height, - merkle_root_mn_list, - merkle_root_llmq_list, - best_cl_height_diff, - best_cl_signature, - credit_pool_balance - }; - tx.base.tx_hash = Some(UInt256::sha256d(tx.to_data())); - Ok((tx, *offset)) - } -} - -impl CoinbaseTransaction { - fn payload_data(&self) -> Vec { - let mut buffer: Vec = Vec::new(); - self.coinbase_transaction_version.enc(&mut buffer); - self.height.enc(&mut buffer); - self.merkle_root_mn_list.enc(&mut buffer); - - if self.coinbase_transaction_version >= COINBASE_TX_CORE_19 { - if let Some(llmq_root) = self.merkle_root_llmq_list { - llmq_root.enc(&mut buffer); - } - if self.coinbase_transaction_version >= COINBASE_TX_CORE_20 { - VarInt(self.best_cl_height_diff).enc(&mut buffer); - if let Some(cl_sig) = self.best_cl_signature { - cl_sig.enc(&mut buffer); - } - if let Some(credit_pool_balance) = self.credit_pool_balance { - credit_pool_balance.enc(&mut buffer); - } - } - } - buffer - } - - pub fn to_data(&self) -> Vec { - self.to_data_with_subscript_index(u64::MAX) - } - - pub fn to_data_with_subscript_index(&self, subscript_index: u64) -> Vec { - let mut buffer = Transaction::data_with_subscript_index_static( - subscript_index, - self.base.version, - self.base.tx_type, - &self.base.inputs, - &self.base.outputs, - self.base.lock_time, - ); - let payload = self.payload_data(); - payload.enc(&mut buffer); - buffer - } - - pub fn has_found_coinbase(&mut self, hashes: &[UInt256]) -> bool { - let coinbase_hash = match self.base.tx_hash { - Some(hash) => hash, - None => { - let hash = UInt256::sha256d(self.to_data()); - self.base.tx_hash = Some(hash); - hash - } - }; - self.has_found_coinbase_internal(coinbase_hash, hashes) - } - - fn has_found_coinbase_internal(&self, coinbase_hash: UInt256, hashes: &[UInt256]) -> bool { - hashes.iter().any(|h| coinbase_hash == *h) - } -} diff --git a/dash-spv-masternode-processor/src/tx/mod.rs b/dash-spv-masternode-processor/src/tx/mod.rs deleted file mode 100644 index 1971da8d..00000000 --- a/dash-spv-masternode-processor/src/tx/mod.rs +++ /dev/null @@ -1,18 +0,0 @@ -use byte::{BytesExt, LE}; -use crate::crypto::byte_util::BytesDecodable; -use crate::impl_bytes_decodable; - -pub mod coinbase_transaction; -pub mod transaction; - -pub use self::coinbase_transaction::CoinbaseTransaction; -pub use self::transaction::Transaction; -pub use self::transaction::TransactionInput; -pub use self::transaction::TransactionOutput; -pub use self::transaction::TransactionType; -pub use self::transaction::TX_UNCONFIRMED; - -impl_bytes_decodable!(TransactionInput); -impl_bytes_decodable!(TransactionOutput); -impl_bytes_decodable!(Transaction); -impl_bytes_decodable!(CoinbaseTransaction); diff --git a/dash-spv-masternode-processor/src/tx/transaction.rs b/dash-spv-masternode-processor/src/tx/transaction.rs deleted file mode 100644 index 2815babe..00000000 --- a/dash-spv-masternode-processor/src/tx/transaction.rs +++ /dev/null @@ -1,451 +0,0 @@ -use std::io; - -use byte::ctx::Endian; -use byte::{BytesExt, TryRead, LE}; -use hashes::hex::ToHex; -use crate::blockdata::opcodes::all::OP_RETURN; -use crate::consensus::encode::{VarInt, self}; -use crate::consensus::{Encodable, Decodable}; -use crate::crypto::byte_util::{Reversable, Zeroable}; -use crate::crypto::{UInt256, VarBytes}; -use crate::util::data_append::DataAppend; -use crate::util::script::{ScriptType, ScriptElement}; - -// block height indicating transaction is unconfirmed -pub const TX_UNCONFIRMED: i32 = i32::MAX; - -pub static SIGHASH_ALL: u32 = 1; - -#[repr(C)] -#[derive(Copy, Clone, Debug, PartialEq)] -pub enum TransactionType { - Classic = 0, - ProviderRegistration = 1, - ProviderUpdateService = 2, - ProviderUpdateRegistrar = 3, - ProviderUpdateRevocation = 4, - Coinbase = 5, - QuorumCommitment = 6, - AssetLock = 8, - AssetUnlock = 9, - TypeMax = 10, - SubscriptionCloseAccount = 11, - Transition = 12, - // tmp - /// TODO: find actual value for this type - CreditFunding = 255, -} - -impl Decodable for TransactionType { - #[inline] - fn consensus_decode(mut d: D) -> Result { - Ok(TransactionType::from(u16::consensus_decode(&mut d)?)) - } -} - -impl From for TransactionType { - fn from(orig: u16) -> Self { - match orig { - 0x0000 => TransactionType::Classic, - 0x0001 => TransactionType::ProviderRegistration, - 0x0002 => TransactionType::ProviderUpdateService, - 0x0003 => TransactionType::ProviderUpdateRegistrar, - 0x0004 => TransactionType::ProviderUpdateRevocation, - 0x0005 => TransactionType::Coinbase, - 0x0006 => TransactionType::QuorumCommitment, - 0x0008 => TransactionType::AssetLock, - 0x0009 => TransactionType::AssetUnlock, - 0x000A => TransactionType::TypeMax, - 0x000B => TransactionType::SubscriptionCloseAccount, - 0x000C => TransactionType::Transition, - _ => TransactionType::Classic, - } - } -} - -impl From for u16 { - fn from(value: TransactionType) -> Self { - value as u16 - } -} - -impl TransactionType { - fn raw_value(&self) -> u16 { - *self as u16 - } - pub fn requires_inputs(&self) -> bool { - true - } -} - -#[derive(Clone, PartialEq)] -pub struct TransactionInput { - pub input_hash: UInt256, - pub index: u32, - pub script: Option>, - pub signature: Option>, - pub sequence: u32, -} - -impl Encodable for TransactionInput { - #[inline] - fn consensus_encode(&self, mut writer: W) -> Result { - let mut offset = 0; - offset += self.input_hash.consensus_encode(&mut writer)?; - offset += self.index.consensus_encode(&mut writer)?; - offset += match self.signature { - Some(ref signature) => signature.consensus_encode(&mut writer)?, - None => 0 - }; - offset += self.sequence.consensus_encode(&mut writer)?; - Ok(offset) - } -} - -impl Decodable for TransactionInput { - #[inline] - fn consensus_decode(mut d: D) -> Result { - let input_hash = UInt256::consensus_decode(&mut d)?; - let index = u32::consensus_decode(&mut d)?; - let signature: Option> = Vec::consensus_decode(&mut d).ok(); - let sequence = u32::consensus_decode(&mut d)?; - Ok(Self { input_hash, index, signature, sequence, script: None }) - } -} - - -impl std::fmt::Debug for TransactionInput { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("TransactionInput") - .field("input_hash", &self.input_hash.reversed()) - .field("index", &self.index) - .field( - "script", - &self.script.as_ref().map_or("None".to_string(), |s| s.to_hex()), - ) - .field( - "signature", - &self.signature.as_ref().map_or("None".to_string(), |s| s.to_hex()), - ) - .field("sequence", &self.sequence) - .finish() - } -} - -impl<'a> TryRead<'a, Endian> for TransactionInput { - fn try_read(bytes: &'a [u8], _endian: Endian) -> byte::Result<(Self, usize)> { - let offset = &mut 0; - let input_hash = bytes.read_with::(offset, LE)?; - let index = bytes.read_with::(offset, LE)?; - let signature = match bytes.read_with::(offset, LE) { - Ok(data) => Some(data.1.to_vec()), - Err(_err) => None, - }; - let sequence = bytes.read_with::(offset, LE)?; - let input = TransactionInput { - input_hash, - index, - script: None, - signature, - sequence, - }; - Ok((input, *offset)) - } -} - -#[derive(Clone, PartialEq)] -pub struct TransactionOutput { - pub amount: u64, - pub script: Option>, - pub address: Option>, -} - -impl Encodable for TransactionOutput { - #[inline] - fn consensus_encode(&self, mut writer: W) -> Result { - let mut offset = 0; - offset += self.amount.consensus_encode(&mut writer)?; - offset += match self.script { - Some(ref script) => script.consensus_encode(&mut writer)?, - None => 0 - }; - Ok(offset) - } -} - -impl Decodable for TransactionOutput { - #[inline] - fn consensus_decode(mut d: D) -> Result { - let amount = u64::consensus_decode(&mut d)?; - let script: Option> = Vec::consensus_decode(&mut d).ok(); - Ok(TransactionOutput { amount, script, address: None }) - } -} - -impl std::fmt::Debug for TransactionOutput { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("TransactionOutput") - .field("amount", &self.amount) - .field("script", &self.script.as_ref().map_or("None".to_string(), |s| s.to_hex())) - .field("address", &self.address.as_ref().map_or("None".to_string(), |s| s.to_hex())) - .finish() - } -} - -impl<'a> TryRead<'a, Endian> for TransactionOutput { - fn try_read(bytes: &'a [u8], _endian: Endian) -> byte::Result<(Self, usize)> { - let offset = &mut 0; - let amount = bytes.read_with::(offset, LE)?; - let script = match bytes.read_with::(offset, LE) { - Ok(data) => Some(data.1.to_vec()), - Err(_err) => None, - }; - let output = TransactionOutput { - amount, - script, - address: None, - }; - Ok((output, *offset)) - } -} - -impl TransactionOutput { - const MAX_SCRIPT_SIZE: usize = 10000; - - pub fn script_pub_key_type(&self) -> ScriptType { - if let Some(ref script) = self.script { - match script.script_elements()[..] { - // pay-to-pubkey-hash scriptPubKey - [ScriptElement::Number(0x76/*OP_DUP*/), ScriptElement::Number(0xa9/*OP_HASH160*/), ScriptElement::Data(data, len @ b'\x14'), ScriptElement::Number(0x88/*OP_EQUALVERIFY*/), ScriptElement::Number(0xac/*OP_CHECKSIG*/)] => - ScriptType::PayToPubkeyHash, - // pay-to-script-hash scriptPubKey - [ScriptElement::Number(0xa9/*OP_HASH160*/), ScriptElement::Data(data, len @ b'\x14'), ScriptElement::Number(0x87/*OP_EQUAL*/)] => - ScriptType::PayToScriptHash, - // pay-to-pubkey scriptPubKey - [ScriptElement::Data(data, len @ 33u8 | len @ 65u8), ScriptElement::Number(0xac/*OP_CHECKSIG*/)] => - ScriptType::PayToPubkey, - // unknown script type - _ => ScriptType::Unknown, - } - } else { - return ScriptType::Unknown; - } - } - - /// Returns whether the script is guaranteed to fail at execution, - /// regardless of the initial stack. This allows outputs to be pruned - /// instantly when entering the UTXO set. - pub fn is_script_unspendable(&self) -> bool { - if let Some(ref script) = self.script { - let script_elements = script.script_elements(); - - return script_elements.len() > 0 && script_elements[0] == ScriptElement::Number(OP_RETURN.into_u8()) || - script.len() > Self::MAX_SCRIPT_SIZE; - } else { - return true; - } - } - - pub fn is_op_return(&self) -> bool { - if let Some(ref script) = self.script { - return script.script_elements().len() > 0 && script.script_elements()[0] == ScriptElement::Number(OP_RETURN.into_u8()); - } else { - return false; - } - } -} - -pub trait ITransaction { - fn payload_data(&self) -> Vec; - fn payload_data_for(&self) -> Vec; - fn transaction_type(&self) -> TransactionType; - fn outputs(&self) -> Vec; - fn output_addresses(&self) -> Vec>; - fn inputs(&self) -> Vec; - fn tx_hash(&self) -> Option; - fn tx_type(&self) -> TransactionType; -} - -#[derive(Debug, Clone, PartialEq)] -pub struct Transaction { - pub inputs: Vec, - pub outputs: Vec, - pub lock_time: u32, - pub version: u16, - pub tx_hash: Option, - pub tx_type: TransactionType, - pub payload_offset: usize, - pub block_height: u32, -} - -impl Transaction { - pub fn to_data(&self) -> Vec { - self.to_data_with_subscript_index(u64::MAX) - } - - pub fn to_data_with_subscript_index(&self, subscript_index: u64) -> Vec { - Self::data_with_subscript_index_static( - subscript_index, - self.version, - self.tx_type, - &self.inputs, - &self.outputs, - self.lock_time, - ) - } - - pub fn data_with_subscript_index_static( - subscript_index: u64, - version: u16, - tx_type: TransactionType, - inputs: &[TransactionInput], - outputs: &[TransactionOutput], - lock_time: u32, - ) -> Vec { - let mut buffer: Vec = Vec::new(); - let offset: &mut usize = &mut 0; - let inputs_len = inputs.len(); - let outputs_len = outputs.len(); - *offset += version.consensus_encode(&mut buffer).unwrap(); - *offset += tx_type.raw_value().consensus_encode(&mut buffer).unwrap(); - *offset += VarInt(inputs_len as u64) - .consensus_encode(&mut buffer) - .unwrap(); - (0..inputs_len).into_iter().for_each(|i| { - let input = &inputs[i]; - *offset += input.input_hash.consensus_encode(&mut buffer).unwrap(); - *offset += input.index.consensus_encode(&mut buffer).unwrap(); - if subscript_index == u64::MAX && input.signature.is_some() { - *offset += input - .signature - .as_ref() - .unwrap() - .consensus_encode(&mut buffer) - .unwrap() - // *offset += consensus_encode_with_size(input.signature.unwrap(), &mut buffer).unwrap() - } else if subscript_index == i as u64 && input.script.is_some() { - *offset += input - .script - .as_ref() - .unwrap() - .consensus_encode(&mut buffer) - .unwrap() - // *offset += consensus_encode_with_size(input.script.unwrap(), &mut buffer).unwrap() - } else { - *offset += VarInt(0_u64).consensus_encode(&mut buffer).unwrap(); - } - *offset += input.sequence.consensus_encode(&mut buffer).unwrap(); - }); - *offset += VarInt(outputs_len as u64) - .consensus_encode(&mut buffer) - .unwrap(); - (0..outputs_len).into_iter().for_each(|i| { - let output = &outputs[i]; - *offset += output.amount.consensus_encode(&mut buffer).unwrap(); - if let Some(script) = &output.script { - *offset += script.consensus_encode(&mut buffer).unwrap() - //*offset += consensus_encode_with_size(script, &mut buffer).unwrap() - } - }); - *offset += lock_time.consensus_encode(&mut buffer).unwrap(); - if subscript_index != u64::MAX { - *offset += SIGHASH_ALL.consensus_encode(&mut buffer).unwrap(); - } - buffer - } - - pub fn input_addresses(&self) -> Vec> { - /*let script_map = ScriptMap::MAINNET; - self.inputs.iter().filter_map(|input| { - if let Some(script) = &input.script { - with_script_pub_key(&script, &script_map) - } else if let Some(signature) = &input.signature { - with_script_sig(&signature, &script_map) - } else { - None - } - }).collect()*/ - vec![] - } - - pub fn output_addresses(&self) -> Vec> { - self.outputs.iter().filter_map(|output| output.address.clone()).collect() - } - - pub fn outputs(&self) -> Vec { - self.outputs.clone() - } - - pub fn inputs(&self) -> Vec { - self.inputs.clone() - } - - pub fn tx_hash(&self) -> Option { - self.tx_hash - } - - pub fn tx_type(&self) -> TransactionType { - self.tx_type - } -} - -impl Decodable for Transaction { - #[inline] - fn consensus_decode(mut d: D) -> Result { - let version = u16::consensus_decode(&mut d)?; - let tx_type = TransactionType::consensus_decode(&mut d)?; - let inputs: Vec = Vec::consensus_decode(&mut d)?; - let outputs: Vec = Vec::consensus_decode(&mut d)?; - let lock_time = u32::consensus_decode(&mut d)?; - let mut tx = Self { - inputs, - outputs, - version, - tx_type, - lock_time, - block_height: TX_UNCONFIRMED as u32, - tx_hash: None, - payload_offset: 0, - }; - tx.tx_hash = (tx_type == TransactionType::Classic).then_some(UInt256::sha256d(tx.to_data())); - Ok(tx) - } -} - -impl<'a> TryRead<'a, Endian> for Transaction { - fn try_read(bytes: &'a [u8], endian: Endian) -> byte::Result<(Self, usize)> { - let offset = &mut 0; - let version = bytes.read_with::(offset, endian)?; - let tx_type_uint = bytes.read_with::(offset, endian)?; - let tx_type = TransactionType::from(tx_type_uint); - let count_var = bytes.read_with::(offset, endian)?; - let count = count_var.0; - // at least one input is required - if count == 0 && tx_type.requires_inputs() { - return Err(byte::Error::Incomplete); - } - let mut inputs: Vec = Vec::new(); - for _i in 0..count { - inputs.push(bytes.read_with::(offset, endian)?); - } - let mut outputs: Vec = Vec::new(); - let count_var = bytes.read_with::(offset, endian)?; - let count = count_var.0; - for _i in 0..count { - outputs.push(bytes.read_with::(offset, endian)?); - } - let lock_time = bytes.read_with::(offset, endian)?; - let mut tx = Self { - inputs, - outputs, - version, - tx_type, - lock_time, - payload_offset: *offset, - tx_hash: None, - block_height: TX_UNCONFIRMED as u32, - }; - tx.tx_hash = (tx_type == TransactionType::Classic).then_some(UInt256::sha256d(tx.to_data())); - Ok((tx, *offset)) - } -} diff --git a/dash-spv-masternode-processor/src/types/block.rs b/dash-spv-masternode-processor/src/types/block.rs deleted file mode 100644 index 6bb195a8..00000000 --- a/dash-spv-masternode-processor/src/types/block.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::ffi::unboxer::unbox_any; - -#[repr(C)] -#[derive(Clone, Debug)] -pub struct Block { - pub height: u32, - pub hash: *mut [u8; 32], -} - -impl Drop for Block { - fn drop(&mut self) { - unsafe { - unbox_any(self.hash); - } - } -} \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/types/coinbase_transaction.rs b/dash-spv-masternode-processor/src/types/coinbase_transaction.rs deleted file mode 100644 index 38656a1e..00000000 --- a/dash-spv-masternode-processor/src/types/coinbase_transaction.rs +++ /dev/null @@ -1,32 +0,0 @@ -use crate::ffi::unboxer::unbox_any; -use crate::types::transaction::Transaction; - -#[repr(C)] -#[derive(Clone, Debug)] -pub struct CoinbaseTransaction { - pub base: *mut Transaction, - pub coinbase_transaction_version: u16, - pub height: u32, - pub merkle_root_mn_list: *mut [u8; 32], - pub merkle_root_llmq_list: *mut [u8; 32], - pub best_cl_height_diff: u64, - pub best_cl_signature: *mut [u8; 96], - pub credit_pool_balance: i64, -} - -impl Drop for CoinbaseTransaction { - fn drop(&mut self) { - unsafe { - unbox_any(self.base); - if !self.merkle_root_mn_list.is_null() { - unbox_any(self.merkle_root_mn_list); - } - if !self.merkle_root_llmq_list.is_null() { - unbox_any(self.merkle_root_llmq_list); - } - if !self.best_cl_signature.is_null() { - unbox_any(self.best_cl_signature); - } - } - } -} \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/types/llmq_entry.rs b/dash-spv-masternode-processor/src/types/llmq_entry.rs deleted file mode 100644 index 740e0f2c..00000000 --- a/dash-spv-masternode-processor/src/types/llmq_entry.rs +++ /dev/null @@ -1,110 +0,0 @@ -use byte::ctx::{Bytes, Endian}; -use byte::{BytesExt, TryRead, LE}; -use std::ptr::null_mut; -use crate::chain::common::LLMQType; -use crate::common::LLMQVersion; -use crate::consensus; -use crate::crypto::byte_util::{UInt256, UInt384, UInt768}; -use crate::ffi::boxer::{boxed, boxed_vec}; -use crate::ffi::unboxer::unbox_any; - -#[repr(C)] -#[derive(Clone, Debug)] -pub struct LLMQEntry { - // 144 bytes - pub all_commitment_aggregated_signature: *mut [u8; 96], - pub commitment_hash: *mut [u8; 32], // nullable - pub llmq_type: LLMQType, - pub entry_hash: *mut [u8; 32], - pub llmq_hash: *mut [u8; 32], - pub index: u16, - pub public_key: *mut [u8; 48], - pub threshold_signature: *mut [u8; 96], - pub verification_vector_hash: *mut [u8; 32], - pub saved: bool, - pub signers_bitset: *mut u8, - pub signers_bitset_length: usize, - pub signers_count: u64, - pub valid_members_bitset: *mut u8, - pub valid_members_bitset_length: usize, - pub valid_members_count: u64, - pub verified: bool, - pub version: LLMQVersion, -} - -impl Drop for LLMQEntry { - fn drop(&mut self) { - unsafe { - unbox_any(self.all_commitment_aggregated_signature); - if !self.commitment_hash.is_null() { - unbox_any(self.commitment_hash); - } - unbox_any(self.entry_hash); - unbox_any(self.llmq_hash); - unbox_any(self.public_key); - unbox_any(self.threshold_signature); - unbox_any(self.verification_vector_hash); - unbox_any(std::ptr::slice_from_raw_parts_mut::(self.signers_bitset, self.signers_bitset_length)); - unbox_any(std::ptr::slice_from_raw_parts_mut::(self.valid_members_bitset, self.valid_members_bitset_length)); - } - } -} - -impl<'a> TryRead<'a, Endian> for LLMQEntry { - fn try_read(bytes: &'a [u8], _endian: Endian) -> byte::Result<(Self, usize)> { - let length = bytes.len(); - let offset = &mut 0; - let version = bytes.read_with::(offset, LE)?; - let llmq_type = bytes.read_with::(offset, LE)?; - let llmq_hash = boxed(bytes.read_with::(offset, LE)?.0); - let index = if version.use_rotated_quorums() { - bytes.read_with::(offset, LE)? - } else { - 0 - }; - let signers_count = - bytes.read_with::(offset, LE)?; - let signers_buffer_length: usize = ((signers_count.0 as usize) + 7) / 8; - if length - *offset < signers_buffer_length { - return Err(byte::Error::BadOffset(*offset)); - } - let signers_bitset: &[u8] = bytes.read_with(offset, Bytes::Len(signers_buffer_length))?; - let valid_members_count = - bytes.read_with::(offset, LE)?; - let valid_members_count_buffer_length: usize = ((valid_members_count.0 as usize) + 7) / 8; - if length - *offset < valid_members_count_buffer_length { - return Err(byte::Error::BadOffset(*offset)); - } - let valid_members_bitset: &[u8] = - bytes.read_with(offset, Bytes::Len(valid_members_count_buffer_length))?; - let public_key = boxed(bytes.read_with::(offset, LE)?.0); - let verification_vector_hash = boxed(bytes.read_with::(offset, LE)?.0); - let threshold_signature = boxed(bytes.read_with::(offset, LE)?.0); - let all_commitment_aggregated_signature = boxed(bytes.read_with::(offset, LE)?.0); - let llmq_type: LLMQType = llmq_type.into(); - - Ok(( - Self { - all_commitment_aggregated_signature, - commitment_hash: null_mut(), - llmq_type, - entry_hash: null_mut(), - llmq_hash, - index, - public_key, - threshold_signature, - verification_vector_hash, - saved: false, - signers_bitset: boxed_vec(signers_bitset.to_vec()), - signers_bitset_length: signers_bitset.len(), - signers_count: signers_count.0, - valid_members_bitset: boxed_vec(valid_members_bitset.to_vec()), - valid_members_bitset_length: valid_members_bitset.len(), - valid_members_count: valid_members_count.0, - verified: false, - version, - }, - *offset, - )) - } -} diff --git a/dash-spv-masternode-processor/src/types/llmq_indexed_hash.rs b/dash-spv-masternode-processor/src/types/llmq_indexed_hash.rs deleted file mode 100644 index d0585178..00000000 --- a/dash-spv-masternode-processor/src/types/llmq_indexed_hash.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::ffi::unboxer::unbox_any; - -#[repr(C)] -#[derive(Clone, Debug)] -pub struct LLMQIndexedHash { - pub index: u32, - pub hash: *mut [u8; 32], -} - -impl Drop for LLMQIndexedHash { - fn drop(&mut self) { - unsafe { - unbox_any(self.hash); - } - } -} \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/types/llmq_map.rs b/dash-spv-masternode-processor/src/types/llmq_map.rs deleted file mode 100644 index f9e7aecb..00000000 --- a/dash-spv-masternode-processor/src/types/llmq_map.rs +++ /dev/null @@ -1,18 +0,0 @@ -use crate::ffi::unboxer::unbox_any_vec_ptr; -use crate::types::llmq_entry::LLMQEntry; - -#[repr(C)] -#[derive(Clone, Debug)] -pub struct LLMQMap { - pub llmq_type: u8, - pub values: *mut *mut LLMQEntry, - pub count: usize, -} - -impl Drop for LLMQMap { - fn drop(&mut self) { - unsafe { - unbox_any_vec_ptr(self.values, self.count); - } - } -} diff --git a/dash-spv-masternode-processor/src/types/llmq_snapshot.rs b/dash-spv-masternode-processor/src/types/llmq_snapshot.rs deleted file mode 100644 index 69ba1f42..00000000 --- a/dash-spv-masternode-processor/src/types/llmq_snapshot.rs +++ /dev/null @@ -1,59 +0,0 @@ -use byte::ctx::{Bytes, Endian}; -use byte::{BytesExt, TryRead, LE}; -use crate::common::LLMQSnapshotSkipMode; -use crate::consensus::encode; -use crate::crypto::byte_util::BytesDecodable; -use crate::ffi::boxer::boxed_vec; -use crate::ffi::unboxer::unbox_vec_ptr; -use crate::impl_bytes_decodable; - -#[repr(C)] -#[derive(Clone)] -pub struct LLMQSnapshot { - pub member_list_length: usize, - pub member_list: *mut u8, - // Skip list at height n - pub skip_list_length: usize, - pub skip_list: *mut i32, - // Mode of the skip list - pub skip_list_mode: LLMQSnapshotSkipMode, -} - -impl_bytes_decodable!(LLMQSnapshot); - -impl Drop for LLMQSnapshot { - fn drop(&mut self) { - unsafe { - let member_list = unbox_vec_ptr(self.member_list, self.member_list_length); - drop(member_list); - let skip_list = unbox_vec_ptr(self.skip_list, self.skip_list_length); - drop(skip_list); - - } - } -} - -impl<'a> TryRead<'a, Endian> for LLMQSnapshot { - fn try_read(bytes: &'a [u8], _endian: Endian) -> byte::Result<(Self, usize)> { - let offset = &mut 0; - let skip_list_mode = bytes.read_with::(offset, LE)?; - let member_list_length = bytes.read_with::(offset, LE)?.0 as usize; - let member_list: &[u8] = - bytes.read_with(offset, Bytes::Len((member_list_length + 7) / 8))?; - let skip_list_length = bytes.read_with::(offset, LE)?.0 as usize; - let mut skip_list_vec = Vec::with_capacity(skip_list_length); - for _i in 0..skip_list_length { - skip_list_vec.push(bytes.read_with::(offset, LE)?); - } - Ok(( - Self { - member_list_length, - member_list: boxed_vec(member_list.to_vec()), - skip_list_length, - skip_list: boxed_vec(skip_list_vec), - skip_list_mode, - }, - *offset, - )) - } -} diff --git a/dash-spv-masternode-processor/src/types/llmq_typed_hash.rs b/dash-spv-masternode-processor/src/types/llmq_typed_hash.rs deleted file mode 100644 index afce60a4..00000000 --- a/dash-spv-masternode-processor/src/types/llmq_typed_hash.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::ffi::unboxer::unbox_any; - -#[repr(C)] -#[derive(Clone, Debug)] -pub struct LLMQTypedHash { - pub llmq_type: u8, - pub llmq_hash: *mut [u8; 32], -} - -impl Drop for LLMQTypedHash { - fn drop(&mut self) { - unsafe { - unbox_any(self.llmq_hash); - } - } -} \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/types/masternode_entry.rs b/dash-spv-masternode-processor/src/types/masternode_entry.rs deleted file mode 100644 index 0b788253..00000000 --- a/dash-spv-masternode-processor/src/types/masternode_entry.rs +++ /dev/null @@ -1,52 +0,0 @@ -use crate::ffi::unboxer::{unbox_any, unbox_vec_ptr}; -use crate::types::{BlockOperatorPublicKey, MasternodeEntryHash, OperatorPublicKey, Validity}; - -#[repr(C)] -#[derive(Clone, Debug)] -pub struct MasternodeEntry { - pub confirmed_hash: *mut [u8; 32], - pub confirmed_hash_hashed_with_provider_registration_transaction_hash: *mut [u8; 32], // nullable - pub is_valid: bool, - pub key_id_voting: *mut [u8; 20], - pub known_confirmed_at_height: u32, // nullable - pub entry_hash: *mut [u8; 32], - pub operator_public_key: *mut OperatorPublicKey, - pub previous_entry_hashes: *mut MasternodeEntryHash, - pub previous_entry_hashes_count: usize, - pub previous_operator_public_keys: *mut BlockOperatorPublicKey, - pub previous_operator_public_keys_count: usize, - pub previous_validity: *mut Validity, - pub previous_validity_count: usize, - pub provider_registration_transaction_hash: *mut [u8; 32], - pub ip_address: *mut [u8; 16], - pub port: u16, - pub update_height: u32, - // Core v0.19 (70227+) - // 0: regular, 1: high performance - pub mn_type: u16, - pub platform_http_port: u16, - pub platform_node_id: *mut [u8; 20], -} - -impl Drop for MasternodeEntry { - fn drop(&mut self) { - unsafe { - unbox_any(self.confirmed_hash); - if !self.confirmed_hash_hashed_with_provider_registration_transaction_hash.is_null() { - unbox_any(self.confirmed_hash_hashed_with_provider_registration_transaction_hash); - } - unbox_any(self.key_id_voting); - unbox_any(self.entry_hash); - unbox_any(self.operator_public_key); - unbox_vec_ptr(self.previous_entry_hashes, self.previous_entry_hashes_count); - unbox_vec_ptr(self.previous_operator_public_keys, self.previous_operator_public_keys_count); - unbox_vec_ptr(self.previous_validity, self.previous_validity_count); - unbox_any(self.provider_registration_transaction_hash); - unbox_any(self.ip_address); - if !self.platform_node_id.is_null() { - unbox_any(self.platform_node_id); - } - - } - } -} \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/types/masternode_entry_hash.rs b/dash-spv-masternode-processor/src/types/masternode_entry_hash.rs deleted file mode 100644 index f3d0e019..00000000 --- a/dash-spv-masternode-processor/src/types/masternode_entry_hash.rs +++ /dev/null @@ -1,7 +0,0 @@ -#[repr(C)] -#[derive(Clone, Debug)] -pub struct MasternodeEntryHash { - pub block_hash: [u8; 32], - pub block_height: u32, - pub hash: [u8; 32], -} diff --git a/dash-spv-masternode-processor/src/types/masternode_list.rs b/dash-spv-masternode-processor/src/types/masternode_list.rs deleted file mode 100644 index 311b69aa..00000000 --- a/dash-spv-masternode-processor/src/types/masternode_list.rs +++ /dev/null @@ -1,31 +0,0 @@ -use crate::ffi::unboxer::{unbox_any, unbox_any_vec_ptr}; -use crate::types; - -#[repr(C)] -#[derive(Clone, Debug)] -pub struct MasternodeList { - pub block_hash: *mut [u8; 32], - pub known_height: u32, - pub masternode_merkle_root: *mut [u8; 32], // nullable - pub llmq_merkle_root: *mut [u8; 32], // nullable - pub masternodes: *mut *mut types::MasternodeEntry, - pub masternodes_count: usize, - pub llmq_type_maps: *mut *mut types::LLMQMap, - pub llmq_type_maps_count: usize, -} - -impl Drop for MasternodeList { - fn drop(&mut self) { - unsafe { - unbox_any(self.block_hash); - if !self.masternode_merkle_root.is_null() { - unbox_any(self.masternode_merkle_root); - } - if !self.llmq_merkle_root.is_null() { - unbox_any(self.llmq_merkle_root); - } - unbox_any_vec_ptr(self.masternodes, self.masternodes_count); - unbox_any_vec_ptr(self.llmq_type_maps, self.llmq_type_maps_count); - } - } -} \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/types/mn_list_diff.rs b/dash-spv-masternode-processor/src/types/mn_list_diff.rs deleted file mode 100644 index c2205ef3..00000000 --- a/dash-spv-masternode-processor/src/types/mn_list_diff.rs +++ /dev/null @@ -1,35 +0,0 @@ -use crate::types::coinbase_transaction::CoinbaseTransaction; -use crate::types::llmq_entry::LLMQEntry; -use crate::types::masternode_entry::MasternodeEntry; -use crate::types::LLMQTypedHash; - -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub struct MNListDiff { - pub base_block_hash: *mut [u8; 32], - pub block_hash: *mut [u8; 32], - pub total_transactions: u32, - - pub merkle_hashes: *mut *mut [u8; 32], - pub merkle_hashes_count: usize, - - pub merkle_flags: *mut u8, - pub merkle_flags_count: usize, - - pub coinbase_transaction: *mut CoinbaseTransaction, - - pub deleted_masternode_hashes_count: usize, - pub deleted_masternode_hashes: *mut *mut [u8; 32], - - pub added_or_modified_masternodes_count: usize, - pub added_or_modified_masternodes: *mut *mut MasternodeEntry, - - pub deleted_quorums_count: usize, - pub deleted_quorums: *mut *mut LLMQTypedHash, - - pub added_quorums_count: usize, - pub added_quorums: *mut *mut LLMQEntry, - - pub base_block_height: u32, - pub block_height: u32, -} diff --git a/dash-spv-masternode-processor/src/types/mn_list_diff_result.rs b/dash-spv-masternode-processor/src/types/mn_list_diff_result.rs deleted file mode 100644 index 40934c96..00000000 --- a/dash-spv-masternode-processor/src/types/mn_list_diff_result.rs +++ /dev/null @@ -1,104 +0,0 @@ -use crate::types; -use std::ptr::null_mut; -use crate::ffi::unboxer::{unbox_any, unbox_any_vec_ptr}; -use crate::processing::ProcessingError; - -#[repr(C)] -#[derive(Clone, Debug)] -pub struct MNListDiffResult { - pub error_status: ProcessingError, - pub base_block_hash: *mut [u8; 32], - pub block_hash: *mut [u8; 32], - pub has_found_coinbase: bool, //1 byte - pub has_valid_coinbase: bool, //1 byte - pub has_valid_mn_list_root: bool, //1 byte - pub has_valid_llmq_list_root: bool, //1 byte - pub has_valid_quorums: bool, //1 byte - pub masternode_list: *mut types::MasternodeList, - pub added_masternodes: *mut *mut types::MasternodeEntry, - pub added_masternodes_count: usize, - pub modified_masternodes: *mut *mut types::MasternodeEntry, - pub modified_masternodes_count: usize, - pub added_quorums: *mut *mut types::LLMQEntry, - pub added_quorums_count: usize, - pub needed_masternode_lists: *mut *mut [u8; 32], - pub needed_masternode_lists_count: usize, - pub quorums_cl_signatures_hashes: *mut *mut [u8; 32], - pub quorums_cl_signatures: *mut *mut [u8; 96], - pub quorums_cl_sigs_count: usize, -} -impl MNListDiffResult { - pub fn default_with_error(error: ProcessingError) -> Self { - Self { error_status: error, ..Default::default() } - } -} - -impl Default for MNListDiffResult { - fn default() -> Self { - MNListDiffResult { - error_status: ProcessingError::None, - base_block_hash: null_mut(), - block_hash: null_mut(), - has_found_coinbase: false, - has_valid_coinbase: false, - has_valid_mn_list_root: false, - has_valid_llmq_list_root: false, - has_valid_quorums: false, - masternode_list: null_mut(), - added_masternodes: null_mut(), - added_masternodes_count: 0, - modified_masternodes: null_mut(), - modified_masternodes_count: 0, - added_quorums: null_mut(), - added_quorums_count: 0, - needed_masternode_lists: null_mut(), - needed_masternode_lists_count: 0, - quorums_cl_signatures_hashes: null_mut(), - quorums_cl_signatures: null_mut(), - quorums_cl_sigs_count: 0, - } - } -} - -impl Drop for MNListDiffResult { - fn drop(&mut self) { - unsafe { - if !self.base_block_hash.is_null() { - unbox_any(self.base_block_hash); - } - if !self.block_hash.is_null() { - unbox_any(self.block_hash); - } - if !self.masternode_list.is_null() { - unbox_any(self.masternode_list); - } - if !self.needed_masternode_lists.is_null() { - unbox_any_vec_ptr(self.needed_masternode_lists, self.needed_masternode_lists_count); - } - if !self.added_masternodes.is_null() { - unbox_any_vec_ptr(self.added_masternodes, self.added_masternodes_count); - } - if !self.modified_masternodes.is_null() { - unbox_any_vec_ptr(self.modified_masternodes, self.modified_masternodes_count); - } - if !self.added_quorums.is_null() { - unbox_any_vec_ptr(self.added_quorums, self.added_quorums_count); - } - if !self.quorums_cl_signatures_hashes.is_null() { - unbox_any_vec_ptr(self.quorums_cl_signatures_hashes, self.quorums_cl_sigs_count); - } - if !self.quorums_cl_signatures.is_null() { - unbox_any_vec_ptr(self.quorums_cl_signatures, self.quorums_cl_sigs_count); - } - } - } -} - -impl MNListDiffResult { - pub fn is_valid(&self) -> bool { - self.has_found_coinbase - && self.has_valid_quorums - && self.has_valid_mn_list_root - && self.has_valid_llmq_list_root - } -} diff --git a/dash-spv-masternode-processor/src/types/mod.rs b/dash-spv-masternode-processor/src/types/mod.rs deleted file mode 100644 index 10b868cb..00000000 --- a/dash-spv-masternode-processor/src/types/mod.rs +++ /dev/null @@ -1,46 +0,0 @@ -pub mod block; -pub mod coinbase_transaction; -pub mod llmq_entry; -pub mod llmq_indexed_hash; -pub mod llmq_map; -pub mod llmq_snapshot; -pub mod llmq_typed_hash; -/// This types reflected for FFI -pub mod masternode_entry; -pub mod masternode_entry_hash; -pub mod masternode_list; -pub mod mn_list_diff; -pub mod mn_list_diff_result; -pub mod operator_public_key; -pub mod qr_info; -pub mod qr_info_result; -pub mod quorums_cl_sigs_object; -pub mod transaction; -pub mod transaction_input; -pub mod transaction_output; -pub mod validity; -pub mod var_int; -pub mod opaque_key; - -pub use self::block::Block; -pub use self::coinbase_transaction::CoinbaseTransaction; -pub use self::llmq_entry::LLMQEntry; -pub use self::llmq_indexed_hash::LLMQIndexedHash; -pub use self::llmq_map::LLMQMap; -pub use self::llmq_snapshot::LLMQSnapshot; -pub use self::llmq_typed_hash::LLMQTypedHash; -pub use self::masternode_entry::MasternodeEntry; -pub use self::masternode_entry_hash::MasternodeEntryHash; -pub use self::masternode_list::MasternodeList; -pub use self::mn_list_diff::MNListDiff; -pub use self::mn_list_diff_result::MNListDiffResult; -pub use self::operator_public_key::BlockOperatorPublicKey; -pub use self::operator_public_key::OperatorPublicKey; -pub use self::qr_info::QRInfo; -pub use self::qr_info_result::QRInfoResult; -pub use self::quorums_cl_sigs_object::QuorumsCLSigsObject; -pub use self::transaction::Transaction; -pub use self::transaction_input::TransactionInput; -pub use self::transaction_output::TransactionOutput; -pub use self::validity::Validity; -pub use self::var_int::VarInt; diff --git a/dash-spv-masternode-processor/src/types/opaque_key.rs b/dash-spv-masternode-processor/src/types/opaque_key.rs deleted file mode 100644 index 65a43b3c..00000000 --- a/dash-spv-masternode-processor/src/types/opaque_key.rs +++ /dev/null @@ -1,149 +0,0 @@ -use std::ffi::CString; -use std::os::raw::{c_char, c_void}; -use std::ptr::null_mut; -use bls_signatures::BlsError; -use crate::ffi::boxer::boxed; -use crate::keys::{BLSKey, ECDSAKey, ED25519Key, KeyKind}; - -pub trait AsOpaqueKey { - fn to_opaque_ptr(self) -> *mut OpaqueKey; -} - -pub trait AsCStringPtr { - fn to_c_string_ptr(self) -> *mut c_char; -} - -impl AsCStringPtr for String { - fn to_c_string_ptr(self) -> *mut c_char { - CString::new(self).unwrap().into_raw() - } -} - -impl AsCStringPtr for Option { - fn to_c_string_ptr(self) -> *mut c_char { - if let Some(str) = self { - CString::new(str).unwrap().into_raw() - } else { - null_mut() - } - } -} - -#[repr(C)] -#[derive(Clone, Debug)] -pub enum OpaqueKey { - ECDSA(*mut ECDSAKey), - BLSLegacy(*mut BLSKey), - BLSBasic(*mut BLSKey), - ED25519(*mut ED25519Key), -} - -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub struct OpaqueKeys { - pub keys: *mut *mut OpaqueKey, - pub len: usize, -} - -impl AsOpaqueKey for ECDSAKey { - fn to_opaque_ptr(self) -> *mut OpaqueKey { - boxed(OpaqueKey::ECDSA(boxed(self))) - } -} - -impl AsOpaqueKey for BLSKey { - fn to_opaque_ptr(self) -> *mut OpaqueKey { - boxed(if self.use_legacy { - OpaqueKey::BLSLegacy(boxed(self)) - } else { - OpaqueKey::BLSBasic(boxed(self)) - }) - } -} - -impl AsOpaqueKey for ED25519Key { - fn to_opaque_ptr(self) -> *mut OpaqueKey { - boxed(OpaqueKey::ED25519(boxed(self))) - } -} - -impl AsOpaqueKey for Option { - fn to_opaque_ptr(self) -> *mut OpaqueKey { - if let Some(key) = self { - key.to_opaque_ptr() - } else { - null_mut() - } - } -} - -impl AsOpaqueKey for Option { - fn to_opaque_ptr(self) -> *mut OpaqueKey { - if let Some(key) = self { - key.to_opaque_ptr() - } else { - null_mut() - } - } -} - -impl AsOpaqueKey for Result { - fn to_opaque_ptr(self) -> *mut OpaqueKey { - if let Ok(key) = self { - key.to_opaque_ptr() - } else { - null_mut() - } - } -} - -impl AsOpaqueKey for Option { - fn to_opaque_ptr(self) -> *mut OpaqueKey { - if let Some(key) = self { - key.to_opaque_ptr() - } else { - null_mut() - } - } -} - - -impl From for *mut OpaqueKey { - fn from(value: ECDSAKey) -> Self { - boxed(OpaqueKey::ECDSA(boxed(value))) - } -} - -impl From for *mut OpaqueKey { - fn from(value: BLSKey) -> Self { - boxed(if value.use_legacy { - OpaqueKey::BLSLegacy(boxed(value)) - } else { - OpaqueKey::BLSBasic(boxed(value)) - }) - } -} - -impl From for *mut OpaqueKey { - fn from(value: ED25519Key) -> Self { - boxed(OpaqueKey::ED25519(boxed(value))) - } -} - -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub struct OpaqueSerializedKeys { - pub keys: *mut *mut c_char, - pub len: usize, -} - -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub struct KeyWithUniqueId { - pub key_type: KeyKind, - pub unique_id: u64, - // ECDSAKey, ED25519Key or BLSKey - pub ptr: *mut c_void, -} - - diff --git a/dash-spv-masternode-processor/src/types/operator_public_key.rs b/dash-spv-masternode-processor/src/types/operator_public_key.rs deleted file mode 100644 index 9899654a..00000000 --- a/dash-spv-masternode-processor/src/types/operator_public_key.rs +++ /dev/null @@ -1,16 +0,0 @@ -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub struct OperatorPublicKey { - pub data: [u8; 48], - pub version: u16, -} - -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub struct BlockOperatorPublicKey { - // 84 // 692 - pub block_hash: [u8; 32], - pub block_height: u32, - pub key: [u8; 48], - pub version: u16, -} diff --git a/dash-spv-masternode-processor/src/types/qr_info.rs b/dash-spv-masternode-processor/src/types/qr_info.rs deleted file mode 100644 index 5aa95f1a..00000000 --- a/dash-spv-masternode-processor/src/types/qr_info.rs +++ /dev/null @@ -1,50 +0,0 @@ -use std::ptr::null_mut; -use crate::types::llmq_snapshot::LLMQSnapshot; -use crate::types::mn_list_diff::MNListDiff; -use crate::types::LLMQEntry; - -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub struct QRInfo { - pub snapshot_at_h_c: *mut LLMQSnapshot, - pub snapshot_at_h_2c: *mut LLMQSnapshot, - pub snapshot_at_h_3c: *mut LLMQSnapshot, - pub snapshot_at_h_4c: *mut LLMQSnapshot, // exist only if extra_share is true - pub mn_list_diff_tip: *mut MNListDiff, - pub mn_list_diff_at_h: *mut MNListDiff, - pub mn_list_diff_at_h_c: *mut MNListDiff, - pub mn_list_diff_at_h_2c: *mut MNListDiff, - pub mn_list_diff_at_h_3c: *mut MNListDiff, - pub mn_list_diff_at_h_4c: *mut MNListDiff, // exist only if extra_share is true - pub extra_share: bool, - pub last_quorum_per_index: *mut *mut LLMQEntry, - pub last_quorum_per_index_count: usize, - pub quorum_snapshot_list: *mut *mut LLMQSnapshot, - pub quorum_snapshot_list_count: usize, - pub mn_list_diff_list: *mut *mut MNListDiff, - pub mn_list_diff_list_count: usize, -} - -impl Default for QRInfo { - fn default() -> Self { - QRInfo { - snapshot_at_h_c: null_mut(), - snapshot_at_h_2c: null_mut(), - snapshot_at_h_3c: null_mut(), - mn_list_diff_tip: null_mut(), - mn_list_diff_at_h: null_mut(), - mn_list_diff_at_h_c: null_mut(), - mn_list_diff_at_h_2c: null_mut(), - mn_list_diff_at_h_3c: null_mut(), - extra_share: false, - snapshot_at_h_4c: null_mut(), - mn_list_diff_at_h_4c: null_mut(), - last_quorum_per_index: null_mut(), - last_quorum_per_index_count: 0, - quorum_snapshot_list: null_mut(), - quorum_snapshot_list_count: 0, - mn_list_diff_list: null_mut(), - mn_list_diff_list_count: 0, - } - } -} diff --git a/dash-spv-masternode-processor/src/types/qr_info_result.rs b/dash-spv-masternode-processor/src/types/qr_info_result.rs deleted file mode 100644 index d37857d6..00000000 --- a/dash-spv-masternode-processor/src/types/qr_info_result.rs +++ /dev/null @@ -1,107 +0,0 @@ -use std::ptr::null_mut; -use crate::ffi::unboxer::{unbox_any, unbox_any_vec_ptr}; -use crate::processing::ProcessingError; -use crate::types; - -#[repr(C)] -#[derive(Clone)] -pub struct QRInfoResult { - pub error_status: ProcessingError, - pub result_at_tip: *mut types::MNListDiffResult, - pub result_at_h: *mut types::MNListDiffResult, - pub result_at_h_c: *mut types::MNListDiffResult, - pub result_at_h_2c: *mut types::MNListDiffResult, - pub result_at_h_3c: *mut types::MNListDiffResult, - pub result_at_h_4c: *mut types::MNListDiffResult, - - pub snapshot_at_h_c: *mut types::LLMQSnapshot, - pub snapshot_at_h_2c: *mut types::LLMQSnapshot, - pub snapshot_at_h_3c: *mut types::LLMQSnapshot, - pub snapshot_at_h_4c: *mut types::LLMQSnapshot, - pub extra_share: bool, - pub last_quorum_per_index: *mut *mut types::LLMQEntry, - pub last_quorum_per_index_count: usize, - pub quorum_snapshot_list: *mut *mut types::LLMQSnapshot, - pub quorum_snapshot_list_count: usize, - pub mn_list_diff_list: *mut *mut types::MNListDiffResult, - pub mn_list_diff_list_count: usize, -} - -impl Default for QRInfoResult { - fn default() -> Self { - Self { - error_status: ProcessingError::None, - result_at_tip: null_mut(), - result_at_h: null_mut(), - result_at_h_c: null_mut(), - result_at_h_2c: null_mut(), - result_at_h_3c: null_mut(), - result_at_h_4c: null_mut(), - snapshot_at_h_c: null_mut(), - snapshot_at_h_2c: null_mut(), - snapshot_at_h_3c: null_mut(), - snapshot_at_h_4c: null_mut(), - extra_share: false, - last_quorum_per_index_count: 0, - last_quorum_per_index: null_mut(), - quorum_snapshot_list_count: 0, - quorum_snapshot_list: null_mut(), - mn_list_diff_list_count: 0, - mn_list_diff_list: null_mut(), - } - } -} - -impl Drop for QRInfoResult { - fn drop(&mut self) { - unsafe { - if !self.result_at_tip.is_null() { - unbox_any(self.result_at_tip); - } - if !self.result_at_h.is_null() { - unbox_any(self.result_at_h); - } - if !self.result_at_h_c.is_null() { - unbox_any(self.result_at_h_c); - } - if !self.result_at_h_2c.is_null() { - unbox_any(self.result_at_h_2c); - } - if !self.result_at_h_3c.is_null() { - unbox_any(self.result_at_h_3c); - } - if !self.snapshot_at_h_c.is_null() { - unbox_any(self.snapshot_at_h_c); - } - if !self.snapshot_at_h_2c.is_null() { - unbox_any(self.snapshot_at_h_2c); - } - if !self.snapshot_at_h_3c.is_null() { - unbox_any(self.snapshot_at_h_3c); - } - if self.extra_share { - if !self.result_at_h_4c.is_null() { - unbox_any(self.result_at_h_4c); - } - if !self.snapshot_at_h_4c.is_null() { - unbox_any(self.snapshot_at_h_4c); - } - } - if !self.last_quorum_per_index.is_null() { - unbox_any_vec_ptr(self.last_quorum_per_index, self.last_quorum_per_index_count); - } - if !self.quorum_snapshot_list.is_null() { - unbox_any_vec_ptr(self.quorum_snapshot_list, self.quorum_snapshot_list_count); - } - if !self.mn_list_diff_list.is_null() { - unbox_any_vec_ptr(self.mn_list_diff_list, self.mn_list_diff_list_count); - } - } - } -} - -impl QRInfoResult { - pub fn default_with_error(error: ProcessingError) -> Self { - Self { error_status: error, ..Default::default() } - } -} diff --git a/dash-spv-masternode-processor/src/types/quorums_cl_sigs_object.rs b/dash-spv-masternode-processor/src/types/quorums_cl_sigs_object.rs deleted file mode 100644 index c8b2975f..00000000 --- a/dash-spv-masternode-processor/src/types/quorums_cl_sigs_object.rs +++ /dev/null @@ -1,19 +0,0 @@ -use crate::ffi::unboxer::{unbox_any, unbox_vec_ptr}; - -#[repr(C)] -#[derive(Clone, Debug)] -pub struct QuorumsCLSigsObject { - pub signature: *mut [u8; 96], - pub index_set_count: usize, - pub index_set: *mut u16, -} - -impl Drop for QuorumsCLSigsObject { - fn drop(&mut self) { - unsafe { - unbox_any(self.signature); - let index_set = unbox_vec_ptr(self.index_set, self.index_set_count); - drop(index_set); - } - } -} \ No newline at end of file diff --git a/dash-spv-masternode-processor/src/types/transaction.rs b/dash-spv-masternode-processor/src/types/transaction.rs deleted file mode 100644 index d1b7287c..00000000 --- a/dash-spv-masternode-processor/src/types/transaction.rs +++ /dev/null @@ -1,79 +0,0 @@ -use byte::ctx::Endian; -use byte::{BytesExt, TryRead, LE}; -use std::ptr::null_mut; -use crate::consensus; -use crate::ffi::boxer::{boxed, boxed_vec}; -use crate::ffi::unboxer::{unbox_any, unbox_any_vec_ptr}; -use crate::tx::{TransactionType, TX_UNCONFIRMED}; -use crate::types::{TransactionInput, TransactionOutput}; - -#[repr(C)] -#[derive(Clone, Debug)] -pub struct Transaction { - pub inputs: *mut *mut TransactionInput, - pub inputs_count: usize, - pub outputs: *mut *mut TransactionOutput, - pub outputs_count: usize, - pub lock_time: u32, - pub version: u16, - pub tx_hash: *mut [u8; 32], - pub tx_type: TransactionType, - pub payload_offset: usize, - pub block_height: u32, -} - -impl Drop for Transaction { - fn drop(&mut self) { - unsafe { - if !self.inputs.is_null() { - unbox_any_vec_ptr(self.inputs, self.inputs_count); - } - if !self.outputs.is_null() { - unbox_any_vec_ptr(self.outputs, self.outputs_count); - } - if !self.tx_hash.is_null() { - unbox_any(self.tx_hash); - } - } - } -} -impl<'a> TryRead<'a, Endian> for Transaction { - fn try_read(bytes: &'a [u8], _endian: Endian) -> byte::Result<(Self, usize)> { - let offset = &mut 0; - let version = bytes.read_with::(offset, LE)?; - let tx_type = TransactionType::from(bytes.read_with::(offset, LE)?); - let inputs_count = bytes - .read_with::(offset, LE)? - .0 as usize; - if inputs_count == 0 && tx_type.requires_inputs() { - return Err(byte::Error::BadOffset(*offset)); - } - let mut inputs_vec: Vec<*mut TransactionInput> = Vec::with_capacity(inputs_count); - for _i in 0..inputs_count { - inputs_vec.push(boxed(bytes.read_with::(offset, LE)?)); - } - let outputs_count = bytes - .read_with::(offset, LE)? - .0 as usize; - let mut outputs_vec: Vec<*mut TransactionOutput> = Vec::new(); - for _i in 0..outputs_count { - outputs_vec.push(boxed(bytes.read_with::(offset, LE)?)); - } - let lock_time = bytes.read_with::(offset, LE)?; - Ok(( - Self { - inputs: boxed_vec(inputs_vec), - inputs_count, - outputs: boxed_vec(outputs_vec), - outputs_count, - tx_hash: null_mut(), - version, - tx_type, - lock_time, - payload_offset: *offset, - block_height: TX_UNCONFIRMED as u32, - }, - *offset, - )) - } -} diff --git a/dash-spv-masternode-processor/src/types/transaction_input.rs b/dash-spv-masternode-processor/src/types/transaction_input.rs deleted file mode 100644 index 3612cb09..00000000 --- a/dash-spv-masternode-processor/src/types/transaction_input.rs +++ /dev/null @@ -1,57 +0,0 @@ -use byte::ctx::Endian; -use byte::{BytesExt, TryRead, LE}; -use std::ptr::{null_mut, slice_from_raw_parts_mut}; -use crate::crypto::{UInt256, VarBytes}; -use crate::ffi::boxer::{boxed, boxed_vec}; -use crate::ffi::unboxer::unbox_any; - -#[repr(C)] -#[derive(Clone, Debug)] -pub struct TransactionInput { - pub input_hash: *mut [u8; 32], - pub index: u32, - pub script: *mut u8, - pub script_length: usize, - pub signature: *mut u8, - pub signature_length: usize, - pub sequence: u32, -} - -impl Drop for TransactionInput { - fn drop(&mut self) { - unsafe { - unbox_any(self.input_hash); - if !self.script.is_null() && self.script_length > 0 { - unbox_any(slice_from_raw_parts_mut(self.script, self.script_length)); - } - if !self.signature.is_null() && self.signature_length > 0 { - unbox_any(slice_from_raw_parts_mut(self.signature, self.signature_length)); - } - } - } -} - -impl<'a> TryRead<'a, Endian> for TransactionInput { - fn try_read(bytes: &'a [u8], _endian: Endian) -> byte::Result<(Self, usize)> { - let offset = &mut 0; - let input_hash = bytes.read_with::(offset, LE)?; - let index = bytes.read_with::(offset, LE)?; - let (signature, signature_length) = match bytes.read_with::(offset, LE) { - Ok(bytes) => (boxed_vec(bytes.1.to_vec()), bytes.1.len()), - Err(_err) => (null_mut(), 0), - }; - let sequence = bytes.read_with::(offset, LE)?; - Ok(( - Self { - input_hash: boxed(input_hash.0), - index, - script: null_mut(), - script_length: 0, - signature, - signature_length, - sequence, - }, - *offset, - )) - } -} diff --git a/dash-spv-masternode-processor/src/types/transaction_output.rs b/dash-spv-masternode-processor/src/types/transaction_output.rs deleted file mode 100644 index 4de75ff1..00000000 --- a/dash-spv-masternode-processor/src/types/transaction_output.rs +++ /dev/null @@ -1,47 +0,0 @@ -use byte::ctx::Endian; -use byte::{BytesExt, TryRead, LE}; -use std::ptr::{null_mut, slice_from_raw_parts_mut}; -use crate::crypto::VarBytes; -use crate::ffi::boxer::boxed_vec; -use crate::ffi::unboxer::unbox_any; - -#[repr(C)] -#[derive(Clone, Debug)] -pub struct TransactionOutput { - pub amount: u64, - pub script: *mut u8, - pub script_length: usize, - pub address: *mut u8, - pub address_length: usize, -} - -impl Drop for TransactionOutput { - fn drop(&mut self) { - unsafe { - if !self.script.is_null() && self.script_length > 0 { - unbox_any(slice_from_raw_parts_mut(self.script, self.script_length)); - } - if !self.address.is_null() && self.address_length > 0 { - unbox_any(slice_from_raw_parts_mut(self.address, self.address_length)); - } - } - } -} - -impl<'a> TryRead<'a, Endian> for TransactionOutput { - fn try_read(bytes: &'a [u8], _endian: Endian) -> byte::Result<(Self, usize)> { - let offset = &mut 0; - let amount = bytes.read_with::(offset, LE)?; - let script = bytes.read_with::(offset, LE)?; - Ok(( - Self { - amount, - script: boxed_vec(script.1.to_vec()), - script_length: script.1.len(), - address: null_mut(), - address_length: 0, - }, - *offset, - )) - } -} diff --git a/dash-spv-masternode-processor/src/types/validity.rs b/dash-spv-masternode-processor/src/types/validity.rs deleted file mode 100644 index 08e0ec8d..00000000 --- a/dash-spv-masternode-processor/src/types/validity.rs +++ /dev/null @@ -1,8 +0,0 @@ -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub struct Validity { - // 37 // 296 - pub block_hash: [u8; 32], - pub block_height: u32, - pub is_valid: bool, -} diff --git a/dash-spv-masternode-processor/src/types/var_int.rs b/dash-spv-masternode-processor/src/types/var_int.rs deleted file mode 100644 index 610f6445..00000000 --- a/dash-spv-masternode-processor/src/types/var_int.rs +++ /dev/null @@ -1,7 +0,0 @@ -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub struct VarInt { - // 9 // 72 - pub value: u64, - pub length: usize, -} diff --git a/dash-spv-masternode-processor/src/util/formatter.rs b/dash-spv-masternode-processor/src/util/formatter.rs new file mode 100644 index 00000000..4a552171 --- /dev/null +++ b/dash-spv-masternode-processor/src/util/formatter.rs @@ -0,0 +1,88 @@ +// use std::collections::{BTreeMap, HashSet}; +// use hashes::hex::ToHex; +// use dash_spv_crypto::keys::OperatorPublicKey; +// use dash_spv_crypto::network::LLMQType; +// use crate::models::{MasternodeEntry, MasternodeList}; +// +// pub trait CustomFormatter { +// fn format(&self) -> String; +// } +// impl CustomFormatter for BTreeMap> { +// fn format(&self) -> String { +// self.iter().fold(String::new(), |mut acc, (llmq_type, map)| { +// acc.push_str(&format!("\t{}:\n", llmq_type)); +// map.iter().for_each(|(h, entry)| { +// acc.push_str(&format!("\t\t{}:\n", h.to_hex())); +// acc.push_str(&format!("\t\t\t{}\n", entry)); +// }); +// acc +// }) +// } +// } +// impl CustomFormatter for Vec { +// fn format(&self) -> String { +// self.iter().fold(String::new(), |mut acc, entry| { +// acc.push_str(&format!("\t{}:\n", entry)); +// acc +// }) +// } +// } +// impl CustomFormatter for BTreeMap> { +// fn format(&self) -> String { +// self.iter().fold(String::new(), |mut acc, (llmq_type, hashes)| { +// acc.push_str(&format!("\t{}:\n", llmq_type)); +// acc.push_str(&format!("\t{}:\n", hashes.format())); +// acc +// }) +// } +// } +// impl CustomFormatter for BTreeMap<[u8; 32], MasternodeEntry> { +// fn format(&self) -> String { +// self.iter().fold(String::new(), |mut acc, (h, node)| { +// acc.push_str(&format!("{}: {}\n", h.to_hex(), node)); +// acc +// }) +// } +// } +// impl CustomFormatter for MasternodeList { +// fn format(&self) -> String { +// let MasternodeList { block_hash, known_height, masternode_merkle_root, llmq_merkle_root, masternodes, quorums } = self; +// let mut desc = format!("MasternodeList at {} ({}) merkle_roots: [mn: {}, llmq: {}]\n", +// block_hash.to_hex(), known_height, masternode_merkle_root.unwrap_or([0u8; 32]).to_hex(), llmq_merkle_root.unwrap_or([0u8; 32]).to_hex()); +// desc.push_str(masternodes.format().as_str()); +// desc.push_str(quorums.format().as_str()); +// desc +// } +// } +// impl CustomFormatter for Vec { +// fn format(&self) -> String { +// self.iter().fold(String::new(), |mut acc, node| { +// acc.push_str(&format!("{}\n", node)); +// acc +// }) +// } +// } +// impl CustomFormatter for Vec<[u8; 32]> { +// fn format(&self) -> String { +// self.iter().fold(String::new(), |mut acc, node| { +// acc.push_str(&format!("{}\n", node.to_hex())); +// acc +// }) +// } +// } +// impl CustomFormatter for HashSet<[u8; 32]> { +// fn format(&self) -> String { +// self.iter().fold(String::new(), |mut acc, node| { +// acc.push_str(&format!("\t{}\n", node.to_hex())); +// acc +// }) +// } +// } +// impl CustomFormatter for Vec { +// fn format(&self) -> String { +// self.iter().fold(String::new(), |mut acc, key| { +// acc.push_str(format!("\t{}:{},\n", key.version, key.data.to_hex()).as_str()); +// acc +// }) +// } +// } diff --git a/dash-spv-masternode-processor/src/util/insight.rs b/dash-spv-masternode-processor/src/util/insight.rs new file mode 100644 index 00000000..75e8c5e0 --- /dev/null +++ b/dash-spv-masternode-processor/src/util/insight.rs @@ -0,0 +1,81 @@ +const INSIGHT_URL: &str = "https://insight.dash.org/insight-api"; +const TESTNET_INSIGHT_URL: &str = "https://insight.testnet.networks.dash.org/insight-api"; + +use serde::Deserialize; +use std::error::Error; +use hashes::hex::{FromHex, ToHex}; +use dash_spv_crypto::crypto::byte_util::Reversed; +use crate::common::Block; +use crate::common::block::MBlock; + +#[derive(Debug, Deserialize)] +struct BlockResponse { + version: u32, + hash: String, + previousblockhash: String, + merkleroot: String, + time: u64, + bits: String, + chainwork: String, + height: u32, +} + +#[derive(Debug)] +pub struct InsightBlock { + version: u32, + block_hash: [u8; 32], + previous_block_hash: [u8; 32], + merkle_root: [u8; 32], + timestamp: u64, + target: u32, + chain_work: [u8; 32], + height: u32, +} +impl From for MBlock { + fn from(value: InsightBlock) -> Self { + MBlock { + height: value.height, + hash: value.block_hash, + merkle_root: value.merkle_root.reversed() + } + } +} +impl From for Block { + fn from(value: InsightBlock) -> Self { + Block { + height: value.height, + hash: value.block_hash, + } + } +} + +fn insight_block_by_url(insight_url: String, by: String) -> Result> { + let url = format!("{}/block/{}", insight_url, by); + println!("GET: {url}"); + let json = reqwest::blocking::get(&url).unwrap().json::()?; + let block_hash = <[u8; 32]>::from_hex(&json.hash)?; + let previous_block_hash = <[u8; 32]>::from_hex(&json.previousblockhash)?; + let merkle_root = <[u8; 32]>::from_hex(&json.merkleroot)?; + let chain_work = <[u8; 32]>::from_hex(&json.chainwork)?; + let target_bytes = Vec::from_hex(&json.bits)?; + let target = u32::from_be_bytes(target_bytes[0..4].try_into().unwrap()); + let block = InsightBlock { + version: json.version, + block_hash, + previous_block_hash, + merkle_root, + timestamp: json.time, + target, + chain_work, + height: json.height, + }; + println!("From insight: {} {}", block.height, block.block_hash.to_hex()); + Ok(block) +} + +pub fn insight_block_by_block_hash(insight_url: String, block_hash: &[u8; 32]) -> Result> { + insight_block_by_url(insight_url, block_hash.to_hex()) +} +pub fn insight_block_by_block_height(insight_url: String, block_height: u32) -> Result> { + insight_block_by_url(insight_url, block_height.to_string()) +} diff --git a/dash-spv-masternode-processor/src/util/java.rs b/dash-spv-masternode-processor/src/util/java.rs deleted file mode 100644 index 652df2f2..00000000 --- a/dash-spv-masternode-processor/src/util/java.rs +++ /dev/null @@ -1,522 +0,0 @@ -use std::collections::BTreeMap; -use std::io; -use std::io::Write; -use hashes::hex::ToHex; -use secp256k1::rand::{Rng, thread_rng}; -use crate::chain::common::chain_type::DevnetType; -use crate::crypto::{byte_util::{Reversable, Zeroable}, UInt256, UInt768}; -use crate::ffi::from::FromFFI; -use crate::models::{LLMQEntry, LLMQSnapshot, MasternodeEntry}; -use crate::{models, types}; -use crate::chain::common::{ChainType, LLMQType}; -use crate::util::file::save_java_class; -use crate::util::save_json_file; - -// Utils for generation java code for dashj - -fn get_params_name_for_chain_type(chain_type: ChainType) -> &'static str { - let params_name = match chain_type { - ChainType::MainNet => "MainNetParams", - ChainType::TestNet => "TestNet3Params", - ChainType::DevNet(devnet) => match devnet { - // DevnetType::TwoIslands => "TwoIslandsDevNetParams", - DevnetType::WhiteRussian => "WhiteRussianDevNetParams", - _ => "DevNetParams" - } - }; - params_name -} - -fn get_chain_name_for_chain_type(chain_type: ChainType) -> &'static str { - let chain_name = match chain_type { - ChainType::MainNet => "mainnet", - ChainType::TestNet => "testnet", - _ => "devnet" - }; - chain_name -} - -fn get_llmq_name_for_llmq_type(llmq_type: LLMQType) -> &'static str { - match llmq_type { - LLMQType::LlmqtypeUnknown => "LLMQ_NONE", - LLMQType::Llmqtype50_60 => "LLMQ_50_60", - LLMQType::Llmqtype400_60 => "LLMQ_400_60", - LLMQType::Llmqtype400_85 => "LLMQ_400_85", - LLMQType::Llmqtype100_67 => "LLMQ_100_67", - LLMQType::Llmqtype60_75 => "LLMQ_60_75", - LLMQType::Llmqtype25_67 => "LLMQ_25_67", - LLMQType::LlmqtypeTest => "LLMQ_TEST", - LLMQType::LlmqtypeDevnet => "LLMQ_DEVNET", - LLMQType::LlmqtypeTestV17 => "LLMQ_TEST_V17", - LLMQType::LlmqtypeTestDIP0024 => "LLMQ_TEST_DIP0024", - LLMQType::LlmqtypeTestInstantSend => "LLMQ_TEST_INSTANTSEND", - LLMQType::LlmqtypeDevnetDIP0024 => "LLMQ_DEVNET_DIP0024", - LLMQType::LlmqtypeTestnetPlatform => "LLMQ_TEST_PLATFORM", - LLMQType::LlmqtypeDevnetPlatform => "LLMQ_DEVNET_PLATFORM", - } -} - -pub fn generate_test(contents: F, writer: &mut W) -> io::Result<()> { - writer.write_all("@Test\n".as_bytes())?; - writer.write_all(format!("public void test_{}() throws UnknownHostException {{\n", thread_rng().gen_range(0..8184)).as_bytes())?; - contents(writer); - writer.write_all(format!("}}\n").as_bytes()) -} - -pub fn generate_qr_test(contents: F, writer: &mut W) -> io::Result<()> { - writer.write_all("@Test\n".as_bytes())?; - writer.write_all(format!("public void testRotationQuorums_{}() throws UnknownHostException, BlockStoreException {{\n", thread_rng().gen_range(0..8184)).as_bytes())?; - contents(writer); - writer.write_all(format!("}}\n").as_bytes()) -} - -pub fn setup_context(chain_type: ChainType, writer: &mut W) -> io::Result<()> { - writer.write_all(format!("Context context = new Context({}.get());\n", match chain_type { - ChainType::MainNet => "MainNetParams", - ChainType::TestNet => "TestNet3Params", - ChainType::DevNet(devnet) => "DevNetParams", - }).as_bytes())?; - writer.write_all("context.initDash(true, true);\n".as_bytes())?; - writer.write_all("NetworkParameters params = context.getParams();\n".as_bytes())?; - writer.write_all(format!("params.setBasicBLSSchemeActivationHeight({});\n", chain_type.core19_activation_height()).as_bytes()) -} - -pub fn generate_final_commitment(quorum: &LLMQEntry, writer: &mut W) -> io::Result<()> { - writer.write_all(format!("FinalCommitment finalCommitment = new FinalCommitment(params, (short) {}, {}, \ - Sha256Hash.wrap(\"{}\"), \ - {}, \ - {}, Utils.HEX.decode(\"{}\"), \ - {}, Utils.HEX.decode(\"{}\"), \ - Utils.HEX.decode(\"{}\"), \ - Sha256Hash.wrap(\"{}\"), \ - new BLSLazySignature(params, Utils.HEX.decode(\"{}\"), 0, {}), \ - new BLSLazySignature(params, Utils.HEX.decode(\"{}\"), 0, {})\ - );", - u16::from(quorum.version), - u8::from(quorum.llmq_type), - quorum.llmq_hash.reversed(), - quorum.index.unwrap_or(0), - quorum.signers_count.0, - quorum.signers_bitset.to_hex(), - quorum.valid_members_count.0, - quorum.valid_members_bitset.to_hex(), - quorum.public_key, - quorum.verification_vector_hash.reversed(), - quorum.threshold_signature, - quorum.version.use_bls_legacy(), - quorum.all_commitment_aggregated_signature, - quorum.version.use_bls_legacy()).as_bytes() - ) -} - -pub fn generate_masternode_list_from_map(map: &BTreeMap, block_height: u32, writer: &mut W) -> io::Result<()> { - let vec = map.iter().map(|(k, v)| v).cloned().collect(); - generate_masternode_list(&vec, block_height, writer) -} - -pub fn generate_mn_array_list_json(masternodes: &Vec, block_height: u32, nodes_var: &str) { - //let value = serde_json::to_value(masternodes).unwrap(); - // serde_json::Value::Array(masternodes.clone()) - -} - -pub fn generate_mn_array_list(masternodes: &Vec, block_height: u32, nodes_var: &str, writer: &mut W) -> io::Result<()> { - writer.write_all(format!("ArrayList {nodes_var} = new ArrayList<>();\n").as_bytes())?; - Ok(masternodes.iter().for_each(|mn| { - writer.write_all(format!("{nodes_var}.add(new SimplifiedMasternodeListEntry(params, \ - (short) {}, \ - {}, \ - Sha256Hash.wrap(\"{}\"), \ - Sha256Hash.wrap(\"{}\"), \ - new MasternodeAddress(InetAddress.getByAddress(Utils.HEX.decode(\"{}\")), {}), \ - KeyId.fromBytes(Hex.decode(\"{}\")), \ - new BLSLazyPublicKey(params, Hex.decode(\"{}\"), 0, {}), \ - {}, \ - {}, \ - {}));\n", - mn.operator_public_key.version, - u16::from(mn.mn_type), - mn.provider_registration_transaction_hash.reversed(), - mn.confirmed_hash.reversed(), - mn.socket_address.ip_address, - mn.socket_address.port, - mn.key_id_voting, - mn.operator_public_key.data, - mn.operator_public_key.version < 2, - if mn.platform_node_id.is_zero() { format!("null") } else { format!("KeyId.fromBytes(Hex.decode(\"{}\"))", mn.platform_node_id) }, - mn.platform_http_port, - mn.is_valid - ).as_bytes()).expect("ff"); - })) -} - -pub fn generate_masternode_list(masternodes: &Vec, block_height: u32, writer: &mut W) -> io::Result<()> { - let nodes_var = format!("nodes_{block_height}"); - writer.write_all(format!("SimplifiedMasternodeList list_at_{block_height}(NetworkParameters params) throws UnknownHostException {{\n").as_bytes())?; - generate_mn_array_list(masternodes, block_height, nodes_var.as_str(), writer)?; - writer.write_all(format!("return new SimplifiedMasternodeList(params, {nodes_var});\n").as_bytes())?; - writer.write_all(format!("}}\n").as_bytes()) -} - -pub fn generate_valid_masternodes(masternodes: &Vec, block_height: u32, writer: &mut W) -> io::Result<()> { - writer.write_all(format!("ArrayList valid_nodes_at_{block_height}(NetworkParameters params) throws UnknownHostException {{\n").as_bytes())?; - writer.write_all("ArrayList nodes = new ArrayList<>();\n".as_bytes())?; - masternodes.iter().for_each(|mn| { - writer.write_all(format!("nodes.add(new SimplifiedMasternodeListEntry(params, \ - (short) {}, \ - {}, \ - Sha256Hash.wrap(\"{}\"), \ - Sha256Hash.wrap(\"{}\"), \ - new MasternodeAddress(InetAddress.getByAddress(Utils.HEX.decode(\"{}\")), {}), \ - KeyId.fromBytes(Hex.decode(\"{}\")), \ - new BLSLazyPublicKey(params, Hex.decode(\"{}\"), 0, {}), \ - {}, \ - {}, \ - {}));", - mn.operator_public_key.version, - u16::from(mn.mn_type), - mn.provider_registration_transaction_hash.reversed(), - mn.confirmed_hash.reversed(), - mn.socket_address.ip_address, - mn.socket_address.port, - mn.key_id_voting, - mn.operator_public_key.data, - mn.operator_public_key.version < 2, - if mn.platform_node_id.is_zero() { format!("null") } else { format!("KeyId.fromBytes(Hex.decode(\"{}\"))", mn.platform_node_id) }, - mn.platform_http_port, - mn.is_valid - ).as_bytes()).expect(""); - }); - writer.write_all("return nodes;\n".as_bytes())?; - writer.write_all(format!("}}\n").as_bytes()) -} - -pub fn generate_snapshot_from_bytes(bytes: &[u8], writer: &mut W) -> io::Result<()> { - writer.write_all(format!("QuorumSnapshot snapshot = new QuorumSnapshot(params, Utils.HEX.decode(\"{}\"), 0);", bytes.to_hex()).as_bytes()) -} - -pub fn generate_snapshot(snapshot: &LLMQSnapshot, height: u32, writer: &mut W) -> io::Result<()> { - writer.write_all("List skipList = new ArrayList<>();\n".as_bytes())?; - // snapshot.skip_list.iter().for_each(|i| { - // println!("skipList.add({});", i); - // }); - writer.write_all(format!("skiplist: {:?}: {:?}\n", snapshot.skip_list_mode, snapshot.skip_list).as_bytes())?; - writer.write_all(format!("QuorumSnapshot snapshot_{} = new QuorumSnapshot(Utils.HEX.decode(\"{}\"), {}, skipList);\n", height, snapshot.member_list.to_hex(), u32::from(snapshot.skip_list_mode)).as_bytes()) -} - -pub fn generate_llmq_hash(llmq_type:LLMQType, hash: UInt256, writer: &mut W) -> io::Result<()> { - writer.write_all(format!("Sha256Hash modifier = LLMQUtils.buildLLMQBlockHash(LLMQParameters.LLMQType.fromValue({}), Sha256Hash.wrap(\"{}\"));\n", u8::from(llmq_type), hash).as_bytes()) -} - -fn embed_copyright(class_name: &str, chain_name: &str, writer: &mut W) -> io::Result<()> { - writer.write_all("// *********************************************\n".as_bytes())?; - writer.write_all("// Class generated by dash-shared-core/dash-spv-masternode-processor using \"generate-dashj-tests\" feature \n".as_bytes())?; - writer.write_all("// Before running this test: \n".as_bytes())?; - writer.write_all(format!("// 1) Move contents of USER/Caches/logs/{class_name}.java into dashj/core/src/test/resources/org/bitcoinj/quorums folder\n").as_bytes())?; - writer.write_all("// 2) Move other content from USER/Caches/logs into dashj/core/src/test/resources/org/bitcoinj/quorums folder\n".as_bytes())?; - writer.write_all("// 3) Run ForwardingService to populate block store (need to setup properly)\n".as_bytes())?; - writer.write_all("// 4) Move resulting \"forwarding-service-{chain_name}.spvchain\" into dashj/core/src/test/resources/org/bitcoinj/quorums folder\n".as_bytes())?; - writer.write_all("// *********************************************\n".as_bytes()) -} - -fn embed_startup_params(class_name: &str, chain_name: &str, params_name: &str, writer: &mut W) -> io::Result<()> { - writer.write_all("\tContext context;\n".as_bytes())?; - writer.write_all("\tNetworkParameters params;\n".as_bytes())?; - writer.write_all("\tBlockStore store;\n".as_bytes())?; - writer.write_all("\t@Before\n".as_bytes())?; - writer.write_all(format!("\tpublic void startup() throws BlockStoreException {{\n").as_bytes())?; - writer.write_all(format!("\t\tparams = {params_name}.get();\n").as_bytes())?; - writer.write_all("\t\tcontext = new Context(params);\n".as_bytes())?; - writer.write_all(format!("\t\tstore = new SPVBlockStore(params, new File(Objects.requireNonNull({class_name}.class.getResource(\"forwarding-service-{chain_name}.spvchain\")).getPath()));\n").as_bytes())?; - writer.write_all("\t\tcontext.initDash(true, true);\n".as_bytes())?; - writer.write_all("\t\tcontext.blockChain = new BlockChain(context, store);\n".as_bytes())?; - writer.write_all(format!("\t}}\n").as_bytes()) -} - -fn embed_masternode_list_parser(class_name: &str, writer: &mut W) -> io::Result<()> { - writer.write_all(format!("\tstatic SimplifiedMasternodeList masternodeListFromJson(NetworkParameters params, String fileName) throws IOException {{\n").as_bytes())?; - writer.write_all(format!("\t\tJsonNode json = new ObjectMapper().readTree(new InputStreamReader(Objects.requireNonNull({class_name}.class.getResourceAsStream(fileName)), StandardCharsets.UTF_8));\n").as_bytes())?; - writer.write_all(format!("\t\tArrayList nodes = new ArrayList<>();\n").as_bytes())?; - writer.write_all(format!("\t\tfor (JsonNode node : json) {{\n").as_bytes())?; - writer.write_all(format!("\t\t\tshort version = (short) node.get(\"version\").asInt();\n").as_bytes())?; - writer.write_all(format!("\t\t\tKeyId keyid = null;\n").as_bytes())?; - writer.write_all(format!("\t\t\tif (node.has(\"platform_node_id\")) {{\n").as_bytes())?; - writer.write_all(format!("\t\t\t\tkeyid = KeyId.fromBytes(Hex.decode(node.get(\"platform_node_id\").asText()));\n").as_bytes())?; - writer.write_all(format!("\t\t\t}}\n").as_bytes())?; - writer.write_all(format!("\t\t\tnodes.add(new SimplifiedMasternodeListEntry(params, version, node.get(\"mn_type\").asInt(), Sha256Hash.wrapReversed(Sha256Hash.wrap(node.get(\"provider_registration_transaction_hash\").asText()).getBytes()), Sha256Hash.wrapReversed(Sha256Hash.wrap(node.get(\"confirmed_hash\").asText()).getBytes()), new MasternodeAddress(InetAddress.getByAddress(Utils.HEX.decode(node.get(\"ip_address\").asText())), node.get(\"port\").asInt()), KeyId.fromBytes(Hex.decode(node.get(\"key_id_voting\").asText())), new BLSLazyPublicKey(params, Hex.decode(node.get(\"operator_public_key\").asText()), 0, version < 2), keyid, node.get(\"platform_http_port\").asInt(), node.get(\"is_valid\").asBoolean()));\n").as_bytes())?; - writer.write_all(format!("\t\t}}\n").as_bytes())?; - writer.write_all(format!("\t\treturn new SimplifiedMasternodeList(params, nodes);\n").as_bytes())?; - writer.write_all(format!("\t}}\n").as_bytes()) -} - -fn embed_snapshot_parser(class_name: &str, writer: &mut W) -> io::Result<()> { - writer.write_all(format!("\tstatic QuorumSnapshot quorumSnapshotFromJson(String fileName) throws IOException {{\n").as_bytes())?; - writer.write_all(format!("\t\tJsonNode json = new ObjectMapper().readTree(new InputStreamReader(Objects.requireNonNull({class_name}.class.getResourceAsStream(fileName)), StandardCharsets.UTF_8));\n").as_bytes())?; - - writer.write_all(format!("\t\tList skipList = new ArrayList<>();\n").as_bytes())?; - writer.write_all(format!("\t\tArrayNode skipListNode = (ArrayNode) json.get(\"skip_list\");\n").as_bytes())?; - writer.write_all(format!("\t\tfor (JsonNode node : skipListNode) {{\n").as_bytes())?; - writer.write_all(format!("\t\t\tskipList.add(node.asInt());\n").as_bytes())?; - writer.write_all(format!("\t\t}}\n").as_bytes())?; - - writer.write_all(format!("\t\tList memberList = new ArrayList<>();\n").as_bytes())?; - writer.write_all(format!("\t\tArrayNode memberListNode = (ArrayNode) json.get(\"member_list\");\n").as_bytes())?; - writer.write_all(format!("\t\tfor (JsonNode node : memberListNode) {{\n").as_bytes())?; - writer.write_all(format!("\t\t\tmemberList.add(node.asBoolean());\n").as_bytes())?; - writer.write_all(format!("\t\t}}\n").as_bytes())?; - - writer.write_all(format!("\t\treturn new QuorumSnapshot(memberList, json.get(\"skip_list_mode\").asInt(), skipList);\n").as_bytes())?; - writer.write_all(format!("\t}}\n").as_bytes()) -} - -fn embed_imports(writer: &mut W) -> io::Result<()> { - writer.write_all("package org.bitcoinj.quorums;\n".as_bytes())?; - writer.write_all("import com.fasterxml.jackson.databind.JsonNode;\n".as_bytes())?; - writer.write_all("import com.fasterxml.jackson.databind.ObjectMapper;\n".as_bytes())?; - writer.write_all("import com.fasterxml.jackson.databind.node.ArrayNode;\n".as_bytes())?; - writer.write_all("import org.bitcoinj.core.*;\n".as_bytes())?; - writer.write_all("import org.bitcoinj.crypto.*;\n".as_bytes())?; - writer.write_all("import org.bitcoinj.evolution.*;\n".as_bytes())?; - writer.write_all("import org.bitcoinj.params.*;\n".as_bytes())?; - writer.write_all("import org.bitcoinj.store.*;\n".as_bytes())?; - writer.write_all("import org.bouncycastle.util.encoders.Hex;\n".as_bytes())?; - writer.write_all("import org.junit.*;\n".as_bytes())?; - writer.write_all("import java.io.*;\n".as_bytes())?; - writer.write_all("import java.net.InetAddress;\n".as_bytes())?; - writer.write_all("import java.nio.charset.StandardCharsets;\n".as_bytes())?; - writer.write_all("import java.util.*;\n".as_bytes()) -} - - -fn print_quorum_members(quorum_members_var: &str, quorum_base_block_var: &str, quorum_name: &str, writer: &mut W) -> io::Result<()> { - writer.write_all(format!("\t\tSystem.out.println(\"****************** getAllQuorumMembers ******************\" + {quorum_base_block_var}.getHeight());\n").as_bytes())?; - writer.write_all(format!("\t\tArrayList {quorum_members_var} = state.getAllQuorumMembers(LLMQParameters.LLMQType.{quorum_name}, {quorum_base_block_var}.getHeader().getHash());\n").as_bytes())?; - writer.write_all("\t\tSystem.out.println(\"******************* quorum_members *******************\");\n".as_bytes())?; - writer.write_all("\t\tSystem.out.println(\"[\");\n".as_bytes())?; - writer.write_all(format!("\t\tfor (Masternode m : {quorum_members_var}) {{\n").as_bytes())?; - writer.write_all("\t\t\tSystem.out.println(m.getProTxHash().toString() + \",\");\n".as_bytes())?; - writer.write_all(format!("\t\t}}\n").as_bytes())?; - writer.write_all("\t\tSystem.out.println(\"]\");\n".as_bytes()) -} - -fn generate_test_class(class_name: &str, chain_name: &str, params_name: &str, contents: F, writer: &mut W) -> io::Result<()> { - embed_copyright(class_name, chain_name, writer)?; - embed_imports(writer)?; - writer.write_all(format!("public class {class_name} {{\n").as_bytes())?; - embed_startup_params(class_name, chain_name, params_name, writer)?; - embed_snapshot_parser(class_name, writer)?; - embed_masternode_list_parser(class_name, writer)?; - writer.write_all("\t@Test\n".as_bytes())?; - writer.write_all(format!("\tpublic void testCase() throws IOException, BlockStoreException {{\n").as_bytes())?; - contents(writer); - writer.write_all(format!("\t}}\n").as_bytes())?; - writer.write_all(format!("}}\n").as_bytes()) -} - -fn put_mn_list_to_cache_for_block_var_name(block_var: &str, nodes_var: &str, writer: &mut W) -> io::Result<()> { - writer.write_all(format!("\t\tstate.mnListsCache.put({block_var}.getHeader().getHash(), new SimplifiedMasternodeList(params, {nodes_var}));\n").as_bytes()) -} - -fn put_snapshot_to_cache_for_block_var_name(block_var: &str, snapshot_hex: &str, writer: &mut W) -> io::Result<()> { - writer.write_all(format!("\t\tstate.quorumSnapshotCache.put({block_var}.getHeader().getHash(), new QuorumSnapshot(params, Utils.HEX.decode(\"{snapshot_hex}\"), 0));\n").as_bytes()) -} - -fn block_from_store_for_height(height: u32) -> String { - format!("store.get({height})") -} - -fn generate_stored_block_from_store(block_var: &str, height: u32, writer: &mut W) -> io::Result<()> { - writer.write_all(format!("\t\tStoredBlock {block_var} = store.get({height});\n").as_bytes()) -} -fn generate_stored_block_from_ancestor(ancestor_block_var: &str, block_var: &str, ancestor_height: u32, writer: &mut W) -> io::Result<()> { - writer.write_all(format!("\t\tStoredBlock {ancestor_block_var} = {block_var}.getAncestor(store, {ancestor_height});\n").as_bytes()) -} - -fn generate_commitment_verify(commitment_var: &str, block_var: &str, quorum_members_var: &str, writer: &mut W) -> io::Result<()> { - writer.write_all("\t\tSystem.out.println(\"****************** verify ******************\");\n".as_bytes())?; - writer.write_all(format!("\t\tboolean verified = {commitment_var}.verify({block_var}, {quorum_members_var}, true);\n").as_bytes())?; - writer.write_all("\t\tSystem.out.println(\"verified: \" + verified + \",\");\n".as_bytes())?; - writer.write_all("\t\tassertTrue(verified);\n".as_bytes()) -} - -pub fn save_snapshot_to_json(snapshot: &LLMQSnapshot, block_height: u32) { - let file_name = format!("snapshot_{}.json", block_height); - save_json_file(file_name.as_str(), snapshot) - .expect("Can't save snapshot"); -} - -pub fn save_cl_signature_to_json(cl_signature: &UInt768, block_height: u32) { - let file_name = format!("cl_signature_{}.json", block_height); - save_json_file(file_name.as_str(), cl_signature) - .expect("Can't save snapshot"); -} - -pub fn save_masternode_list_to_json(masternode_list: &models::MasternodeList, block_height: u32) { - let masternodes = serde_json::to_value(masternode_list.masternodes.values().collect::>()).unwrap(); - let file_name = format!("masternodes_{}.json", block_height); - save_json_file(file_name.as_str(), &masternodes) - .expect("Can't save masternodes"); - let file_name = format!("quorums_{}.json", block_height); - let quorums = masternode_list.quorums.values() - .flat_map(|inner_map| inner_map.values()) - .cloned() - .collect::>(); - let quorums = serde_json::to_value(quorums) - .expect("Can't serialize quorums"); - save_json_file(file_name.as_str(), &quorums) - .expect("Can't save quorums"); - // info!("SimplifiedMasternodeList list_at_{block_height} = SimplifiedMasternodeList.fromJson(\"{file_name}\");"); -} - -fn masternodes_json_name(height: u32) -> String { - format!("masternodes_{height}.json") -} - -fn snapshot_json_name(height: u32) -> String { - format!("snapshot_{height}.json") -} - -fn work_block_var(height: u32) -> String { - format!("workBlock_{height}") -} - -fn put_snapshot_from_json_into_cache(height: u32) -> String { - // let block_var = work_block_var(height); - let block_var = block_from_store_for_height(height); - let file_name = snapshot_json_name(height); - format!("\t\tstate.quorumSnapshotCache.put({block_var}.getHeader().getHash(), quorumSnapshotFromJson(\"{file_name}\"));\n") -} - -fn put_masternode_list_from_json_into_cache(height: u32) -> String { - // let block_var = work_block_var(height); - let block_var = block_from_store_for_height(height); - let file_name = masternodes_json_name(height); - format!("\t\tstate.mnListsCache.put({block_var}.getHeader().getHash(), masternodeListFromJson(params, \"{file_name}\"));\n") -} - -fn extract_masternode_lists_and_snapshots(result: &types::QRInfoResult) -> (u32, Vec, Vec) { - // unsafe { - // let list_at_h_4c = (*(*result.result_at_h_4c).masternode_list).decode(); - // let list_at_h_3c = (*(*result.result_at_h_3c).masternode_list).decode(); - // let list_at_h_2c = (*(*result.result_at_h_2c).masternode_list).decode(); - // let list_at_h_c = (*(*result.result_at_h_c).masternode_list).decode(); - // let list_at_h = (*(*result.result_at_h).masternode_list).decode(); - // let list_at_tip = (*(*result.result_at_tip).masternode_list).decode(); - // let h_4c = list_at_h_4c.known_height; - // let h_3c = list_at_h_3c.known_height; - // let h_2c = list_at_h_2c.known_height; - // let h_c = list_at_h_c.known_height; - // let h = list_at_h.known_height; - // let h_tip = list_at_tip.known_height; - // let mut masternode_lists = vec![ - // (h_4c, list_at_h_4c), - // (h_3c, list_at_h_3c), - // (h_2c, list_at_h_2c), - // (h_c, list_at_h_c), - // (h, list_at_h), - // (h_tip, list_at_tip), - // ]; - // let mut snapshots = vec![ - // (h_4c, (*result.snapshot_at_h_4c).decode()), - // (h_3c, (*result.snapshot_at_h_3c).decode()), - // (h_2c, (*result.snapshot_at_h_2c).decode()), - // (h_c, (*result.snapshot_at_h_c).decode()) - // ]; - // (0..result.mn_list_diff_list_count) - // .into_iter() - // .for_each(|i| { - // let list = (*(*(*result.mn_list_diff_list.add(i))).masternode_list).decode(); - // let h = list.known_height; - // snapshots.push((h, (*(*result.quorum_snapshot_list.add(i))).decode())); - // masternode_lists.push((h, list)); - // }); - // (masternode_list_heights, snapshot_heights) - // } - unsafe { - let list_at_h_4c = (*(*result.result_at_h_4c).masternode_list).decode(); - let list_at_h_3c = (*(*result.result_at_h_3c).masternode_list).decode(); - let list_at_h_2c = (*(*result.result_at_h_2c).masternode_list).decode(); - let list_at_h_c = (*(*result.result_at_h_c).masternode_list).decode(); - let list_at_h = (*(*result.result_at_h).masternode_list).decode(); - let list_at_tip = (*(*result.result_at_tip).masternode_list).decode(); - let h_4c = list_at_h_4c.known_height; - let h_3c = list_at_h_3c.known_height; - let h_2c = list_at_h_2c.known_height; - let h_c = list_at_h_c.known_height; - let h = list_at_h.known_height; - let h_tip = list_at_tip.known_height; - let mut masternode_lists = vec![h_4c, h_3c, h_2c, h_c, h, h_tip]; - let mut snapshots = vec![h_4c, h_3c, h_2c, h_c]; - (0..result.mn_list_diff_list_count) - .into_iter() - .for_each(|i| { - let list = (*(*(*result.mn_list_diff_list.add(i))).masternode_list).decode(); - let h = list.known_height; - snapshots.push(h); - masternode_lists.push(h); - }); - (h, masternode_lists, snapshots) - } -} - -pub fn generate_qr_state_test_file_json(chain_type: ChainType, result: &types::QRInfoResult) { - let (quorum_base_block_height, lists, snapshots) = extract_masternode_lists_and_snapshots(result); - let class_name = format!("QuorumRotationStateTest_{quorum_base_block_height}"); - let chain_name = get_chain_name_for_chain_type(chain_type); - let params_name = get_params_name_for_chain_type(chain_type); - let quorum_name = get_llmq_name_for_llmq_type(LLMQType::Llmqtype60_75); - let mut writer = Vec::::new(); - generate_test_class(class_name.as_str(), chain_name, params_name, |mut w| { - let quorum_base_block_var = "quorumBaseBlock"; - w.write_all("\t\tQuorumRotationState state = new QuorumRotationState(context);\n".as_bytes()) - .expect(""); - w.write_all("\t\tstate.setBlockChain(context.blockChain, context.blockChain);\n".as_bytes()) - .expect(""); - generate_stored_block_from_store(quorum_base_block_var, quorum_base_block_height, &mut w).expect(""); - for height in &snapshots { - w.write_all(put_snapshot_from_json_into_cache(*height).as_bytes()) - .expect(""); - } - for height in &lists { - w.write_all(put_masternode_list_from_json_into_cache(*height).as_bytes()) - .expect(""); - } - print_quorum_members("quorum_members", quorum_base_block_var, quorum_name, &mut w) - .expect(""); - }, &mut writer) - .expect("Can't generate QuorumRotationState class"); - save_java_class(format!("{class_name}.java").as_str(), &writer) - .expect("Can't write java class"); -} - -pub fn generate_final_commitment_test_file(chain_type: ChainType, quorum_base_block_height: u32, quorum: &LLMQEntry, masternodes: &Vec) { - let class_name = format!("FinalCommiment_{quorum_base_block_height}_Test"); - let chain_name = get_chain_name_for_chain_type(chain_type); - let params_name = get_params_name_for_chain_type(chain_type); - let quorum_name = get_llmq_name_for_llmq_type(quorum.llmq_type); - let mut writer = Vec::::new(); - generate_test_class(class_name.as_str(), chain_name, params_name, |mut w| { - let quorum_base_block_var = "quorumBaseBlock"; - let quorum_members_var = "quorum_members"; - let nodes_var = "nodes"; - w.write_all("\t\tQuorumState state = new QuorumState(context, MasternodeListSyncOptions.SYNC_MINIMUM);\n".as_bytes()) - .expect(""); - w.write_all("\t\tstate.setBlockChain(context.blockChain, context.blockChain);\n".as_bytes()) - .expect(""); - generate_final_commitment(quorum, &mut w) - .expect(""); - generate_stored_block_from_store(quorum_base_block_var, quorum_base_block_height, &mut w) - .expect(""); - generate_mn_array_list(masternodes, quorum_base_block_height, nodes_var, &mut w) - .expect(""); - put_mn_list_to_cache_for_block_var_name(quorum_base_block_var, nodes_var, &mut w) - .expect(""); - print_quorum_members(quorum_members_var, quorum_base_block_var, quorum_name, &mut w) - .expect(""); - generate_commitment_verify("finalCommitment", quorum_base_block_var, quorum_members_var, &mut w) - .expect("Can't generate FinalCommitment"); - }, &mut writer) - .expect("Can't generate FinalCommitment class"); - save_java_class(format!("{class_name}.java").as_str(), &writer) - .expect("Can't write java class"); -} diff --git a/dash-spv-masternode-processor/src/util/mod.rs b/dash-spv-masternode-processor/src/util/mod.rs index efb718bf..dc2b0fe2 100644 --- a/dash-spv-masternode-processor/src/util/mod.rs +++ b/dash-spv-masternode-processor/src/util/mod.rs @@ -1,28 +1,8 @@ -pub mod address; -pub mod base58; -pub mod cc_crypt; -pub mod data_append; -pub mod data_ops; -pub mod ecdsa; -pub mod endian; #[cfg(feature = "generate-dashj-tests")] pub mod file; -#[cfg(feature = "generate-dashj-tests")] -pub mod java; -pub mod key; -pub mod psbt; -pub mod script; -pub mod sec_vec; - -pub use self::address::address::from_hash160_for_script_map; -pub use self::address::address::with_script_pub_key; -pub use self::address::address::with_public_key_data; -pub use self::address::address::is_valid_dash_address_for_script_map; -pub use self::address::address::is_valid_dash_devnet_address; -pub use self::address::address::is_valid_dash_private_key; -pub use self::address::address::shapeshift_outbound_for_script; -pub use self::address::address::shapeshift_outbound_force_script; -pub use self::address::address::with_script_sig; +#[cfg(feature = "use_serde")] +pub mod insight; +pub mod formatter; #[cfg(feature = "generate-dashj-tests")] pub use self::file::create_file; diff --git a/dash-spv-masternode-processor/src/util/psbt/error.rs b/dash-spv-masternode-processor/src/util/psbt/error.rs deleted file mode 100644 index 7d7c0d50..00000000 --- a/dash-spv-masternode-processor/src/util/psbt/error.rs +++ /dev/null @@ -1,125 +0,0 @@ -// Rust Bitcoin Library -// Written by -// The Rust Bitcoin developers -// -// To the extent possible under law, the author(s) have dedicated all -// copyright and related and neighboring rights to this software to -// the public domain worldwide. This software is distributed without -// any warranty. -// -// You should have received a copy of the CC0 Public Domain Dedication -// along with this software. -// If not, see . -// - -use core::fmt; - -// use blockdata::transaction::Transaction; -//use util::psbt::raw; - -// use util::bip32::ExtendedPubKey; -use crate::consensus::encode; - -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] -/// Enum for marking psbt hash error -pub enum PsbtHash { - Ripemd, - Sha256, - Hash160, - Hash256, -} -/// Ways that a Partially Signed Transaction might fail. -#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] -pub enum Error { - /// Magic bytes for a PSBT must be the ASCII for "psbt" serialized in most - /// significant byte order. - InvalidMagic, - /// The separator for a PSBT must be `0xff`. - InvalidSeparator, - /// Known keys must be according to spec. - // InvalidKey(raw::Key), - /// Non-proprietary key type found when proprietary key was expected - InvalidProprietaryKey, - /// Keys within key-value map should never be duplicated. - // DuplicateKey(raw::Key), - /// The scriptSigs for the unsigned transaction must be empty. - UnsignedTxHasScriptSigs, - /// The scriptWitnesses for the unsigned transaction must be empty. - UnsignedTxHasScriptWitnesses, - /// A PSBT must have an unsigned transaction. - MustHaveUnsignedTx, - /// Signals that there are no more key-value pairs in a key-value map. - NoMorePairs, - /// Attempting to merge with a PSBT describing a different unsigned - /// transaction. - // UnexpectedUnsignedTx { - // /// Expected - // expected: Box, - // /// Actual - // actual: Box, - // }, - /// Unable to parse as a standard SigHash type. - NonStandardSigHashType(u32), - /// Parsing errors from bitcoin_hashes - HashParseError(hashes::Error), - /// The pre-image must hash to the correponding psbt hash - InvalidPreimageHashPair { - /// Hash-type - hash_type: PsbtHash, - /// Pre-image - preimage: Box<[u8]>, - /// Hash value - hash: Box<[u8]>, - }, - /// Conflicting data during merge procedure: - /// global extended public key has inconsistent key sources - // MergeInconsistentKeySources(ExtendedPubKey), - /// Serialization error in bitcoin consensus-encoded structures - ConsensusEncoding, -} - -impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - // Error::InvalidKey(ref rkey) => write!(f, "invalid key: {}", rkey), - Error::InvalidProprietaryKey => write!(f, "non-proprietary key type found when proprietary key was expected"), - // Error::DuplicateKey(ref rkey) => write!(f, "duplicate key: {}", rkey), - // Error::UnexpectedUnsignedTx { expected: ref e, actual: ref a } => write!(f, "different unsigned transaction: expected {}, actual {}", e.txid(), a.txid()), - Error::NonStandardSigHashType(ref sht) => write!(f, "non-standard sighash type: {}", sht), - Error::InvalidMagic => f.write_str("invalid magic"), - Error::InvalidSeparator => f.write_str("invalid separator"), - Error::UnsignedTxHasScriptSigs => f.write_str("the unsigned transaction has script sigs"), - Error::UnsignedTxHasScriptWitnesses => f.write_str("the unsigned transaction has script witnesses"), - Error::MustHaveUnsignedTx => { - f.write_str("partially signed transactions must have an unsigned transaction") - } - Error::NoMorePairs => f.write_str("no more key-value pairs for this psbt map"), - Error::HashParseError(e) => write!(f, "Hash Parse Error: {}", e), - Error::InvalidPreimageHashPair{ref preimage, ref hash, ref hash_type} => { - // directly using debug forms of psbthash enums - write!(f, "Preimage {:?} does not match {:?} hash {:?}", preimage, hash_type, hash ) - } - // Error::MergeInconsistentKeySources(ref s) => { write!(f, "merge conflict: {}", s) } - Error::ConsensusEncoding => f.write_str("bitcoin consensus or BIP-174 encoding error"), - } - } -} - -#[cfg(feature = "std")] -impl ::std::error::Error for Error {} - -#[doc(hidden)] -impl From for Error { - fn from(e: hashes::Error) -> Error { - Error::HashParseError(e) - } -} - -impl From for Error { - fn from(err: encode::Error) -> Self { - match err { - encode::Error::Psbt(err) => err, - _ => Error::ConsensusEncoding, - } - } -} diff --git a/dash-spv-platform/.gitignore b/dash-spv-platform/.gitignore new file mode 100644 index 00000000..f54b4515 --- /dev/null +++ b/dash-spv-platform/.gitignore @@ -0,0 +1,15 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ +/venv/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# Generated by Intellij Idea +/.idea/ +*.iml diff --git a/dash-spv-platform/Cargo.toml b/dash-spv-platform/Cargo.toml new file mode 100644 index 00000000..27ba73b3 --- /dev/null +++ b/dash-spv-platform/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "dash-spv-platform" +version = "0.1.0" +description = "Library for interactions with platform SDK" + +edition = "2021" +publish = false + +[dependencies] +anyhow = "1.0.95" + +dash-spv-crypto = { workspace = true } +dash-spv-event-bus = { workspace = true } +dash-spv-macro = { workspace = true } + +dashcore = { git = "https://github.com/dashpay/rust-dashcore", features = ["std", "secp-recovery", "rand", "signer", "serde", "apple", "message_verification", "quorum_validation"], default-features = false, branch = "feat/ferment" } +dapi-grpc = { git = "https://github.com/dashpay/platform", branch = "test/ferment", package = "dapi-grpc", default-features = false, features = ["client"] } +dash-sdk = { git = "https://github.com/dashpay/platform", branch = "test/ferment", package = "dash-sdk", default-features = false, features = ["apple"] } +data-contracts = { git = "https://github.com/dashpay/platform", branch = "test/ferment", package = "data-contracts", default-features = false, features = ["apple"] } +dpp = { git = "https://github.com/dashpay/platform", branch = "test/ferment", package = "dpp", default-features = false, features = ["apple"] } +drive = { git = "https://github.com/dashpay/platform", branch = "test/ferment", package = "drive", default-features = false, features = ["verify"] } +drive-proof-verifier = { git = "https://github.com/dashpay/platform", branch = "test/ferment", package = "drive-proof-verifier", default-features = false, features = ["apple"] } +platform-value = { git = "https://github.com/dashpay/platform", branch = "test/ferment", package = "platform-value", default-features = false, features = ["apple"] } +platform-version = { git = "https://github.com/dashpay/platform", branch = "test/ferment", package = "platform-version", default-features = false, features = ["apple"] } + +ferment = { git = "https://github.com/dashpay/ferment", package = "ferment" } +ferment-macro = { git = "https://github.com/dashpay/ferment", package = "ferment-macro" } + +http = { version = "0.2.12" } +indexmap = "2.7.0" +tokio = { version = "1.36.0", features = ["macros", "rt-multi-thread"] } + +[features] +default = ["state-transitions"] +state-transitions = ["dpp/state-transitions"] + +[lib] +name = "dash_spv_platform" diff --git a/dash-spv-platform/rustfmt.toml b/dash-spv-platform/rustfmt.toml new file mode 100644 index 00000000..ce4c30f1 --- /dev/null +++ b/dash-spv-platform/rustfmt.toml @@ -0,0 +1,9 @@ +binop_separator = "Back" +brace_style = "PreferSameLine" +edition = "2021" +ignore = [] +imports_indent = "Visual" +match_arm_blocks = false +match_block_trailing_comma = true +reorder_imports = true +use_field_init_shorthand = true diff --git a/dash-spv-platform/src/cache.rs b/dash-spv-platform/src/cache.rs new file mode 100644 index 00000000..edf88095 --- /dev/null +++ b/dash-spv-platform/src/cache.rs @@ -0,0 +1,11 @@ +use std::collections::BTreeMap; +use std::sync::{Arc, RwLock}; +use platform_value::Identifier; +use crate::models::transient_dashpay_user::TransientDashPayUser; + +#[derive(Default)] +#[ferment_macro::opaque] +pub struct PlatformCache { + pub user_profiles: Arc>>, + // pub identities: Arc>> +} \ No newline at end of file diff --git a/dash-spv-platform/src/contract/manager.rs b/dash-spv-platform/src/contract/manager.rs new file mode 100644 index 00000000..80d0ec14 --- /dev/null +++ b/dash-spv-platform/src/contract/manager.rs @@ -0,0 +1,147 @@ +use std::collections::HashSet; +use std::sync::Arc; +use dash_sdk::{platform::Fetch, Sdk}; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::{DataContract, DocumentName}; +use data_contracts::SystemDataContract; +use dpp::serialization::PlatformSerializableWithPlatformVersion; +#[cfg(feature = "state-transitions")] +use dpp::state_transition::state_transitions::contract::data_contract_create_transition::DataContractCreateTransition; +use dpp::system_data_contracts::load_system_data_contract; +use drive_proof_verifier::types::RetrievedObjects; +use indexmap::IndexMap; +use platform_value::Identifier; +#[cfg(feature = "state-transitions")] +use platform_version::TryFromPlatformVersioned; +use dash_spv_crypto::network::ChainType; +use dash_spv_macro::StreamManager; +use crate::error::Error; +use crate::util::{RetryStrategy, StreamManager, StreamSettings, StreamSpec, Validator}; + +#[derive(Clone, Debug, StreamManager)] +#[ferment_macro::opaque] +pub struct ContractsManager { + pub sdk: Arc, + pub chain_type: ChainType, + // pub dashpay_contract: ContractModel, + // pub dpns_contract: ContractModel, +} +impl ContractsManager { + pub fn new(sdk: &Arc, chain_type: ChainType) -> Self { + Self { sdk: Arc::clone(sdk), chain_type } + } +} +#[ferment_macro::export] +impl ContractsManager { + + pub fn contract_serialized(&self, contract: DataContract) -> Result, Error> { + contract.serialize_to_bytes_with_platform_version(self.sdk_ref().version()) + .map_err(Error::from) + } + pub fn contract_serialized_hash(&self, contract: DataContract) -> Result, Error> { + contract.hash(self.sdk_ref().version()) + .map_err(Error::from) + } + pub fn load_system_contract(&self, contract: SystemDataContract) -> DataContract { + load_system_data_contract(contract, self.sdk.version()) + .expect("Dashpay contract should be loaded") + } + pub fn load_dashpay_contract(&self) -> DataContract { + self.load_system_contract(SystemDataContract::Dashpay) + } + pub fn load_dpns_contract(&self) -> DataContract { + self.load_system_contract(SystemDataContract::DPNS) + } + pub async fn fetch_contract_by_id_bytes(&self, id_bytes: [u8; 32]) -> Result, Error> { + self.fetch_contract_by_id(Identifier::from(id_bytes)).await + } + pub async fn fetch_contract_by_id(&self, id: Identifier) -> Result, Error> { + DataContract::fetch_by_identifier(&self.sdk, id) + .await + .map_err(Error::from) + } + + pub async fn fetch_contract_by_id_error_if_none(&self, id: Identifier) -> Result { + self.fetch_contract_by_id(id) + .await + .and_then(|contract| contract.ok_or(Error::DashSDKError("Contract not exist".to_string()))) + } + + #[cfg(feature = "state-transitions")] + pub fn contract_registration_transition(&self, contract: DataContract) -> Result { + DataContractCreateTransition::try_from_platform_versioned(contract, self.sdk.version()) + .map_err(Error::from) + } + + // #[cfg(feature = "state-transitions")] + // pub fn create_sign_and_publish_transition(&self, contract: DataContract, private_key: &[u8]) -> Result { + // let mut data_contract_create = self.contract_registration_transition(contract)?; + // let data = data_contract_create.signable_bytes() + // .map_err(Error::from)?; + // let signature = signer::sign(&data, private_key)?; + // data_contract_create.set_signature_bytes(signature.to_vec()); + // // data_contract_create + // // data_contract_create. + // // .broadcast_state_transition(data_contract_create) + // // .await + // + // //data_contract_create.publi + // contract.put_to_platform_and_wait_for_response(&self.sdk) + // + // Ok(data_contract_create) + // } + // + + pub async fn monitor(&self, unique_id: Identifier, retry: RetryStrategy, options: ContractValidator) -> Result, Error> { + self.stream::(unique_id, retry, options).await + } + pub async fn monitor_for_id_bytes(&self, unique_id: [u8; 32], retry: RetryStrategy, options: ContractValidator) -> Result, Error> { + self.stream::(Identifier::from(unique_id), retry, options).await + } + pub async fn monitor_with_delay(&self, unique_id: [u8; 32], retry: RetryStrategy, options: ContractValidator, delay: u64) -> Result, Error> { + self.stream_with_settings::(Identifier::from(unique_id), retry, StreamSettings::default_with_delay(delay), options).await + } +} + +#[ferment_macro::export] +pub enum ContractValidator { + None = 0, + AcceptNotFoundAsNotAnError = 1, +} +impl ContractValidator { + pub fn accept_not_found(&self) -> bool { + match self { + ContractValidator::None => false, + ContractValidator::AcceptNotFoundAsNotAnError => true + } + } +} +impl Validator> for ContractValidator { + fn validate(&self, value: &Option) -> bool { + value.is_some() || value.is_none() && self.accept_not_found() + } +} +impl Validator> for ContractValidator { + fn validate(&self, _value: &RetrievedObjects) -> bool { + true + // value.is_some() || value.is_none() && self.accept_not_found() + } +} +impl StreamSpec for ContractValidator { + type Validator = ContractValidator; + type Error = dash_sdk::Error; + type Result = Option; + type ResultMany = IndexMap>; +} + + +#[ferment_macro::export] +pub fn is_document_defined_for_type(contract: DataContract, ty: &str) -> bool { + contract.document_types().contains_key(ty) +} +#[ferment_macro::export] +pub fn has_equal_document_type_keys(contract1: DataContract, contract2: DataContract) -> bool { + let set1 = HashSet::<&DocumentName>::from_iter(contract1.document_types().keys()); + let set2 = HashSet::<&DocumentName>::from_iter(contract2.document_types().keys()); + set1.difference(&set2).count() == 0 +} diff --git a/dash-spv-platform/src/contract/mod.rs b/dash-spv-platform/src/contract/mod.rs new file mode 100644 index 00000000..e1c7c1af --- /dev/null +++ b/dash-spv-platform/src/contract/mod.rs @@ -0,0 +1,2 @@ +pub mod manager; +pub mod model; \ No newline at end of file diff --git a/dash-spv-platform/src/contract/model.rs b/dash-spv-platform/src/contract/model.rs new file mode 100644 index 00000000..e69de29b diff --git a/dash-spv-platform/src/document/contact_request.rs b/dash-spv-platform/src/document/contact_request.rs new file mode 100644 index 00000000..64f6aa98 --- /dev/null +++ b/dash-spv-platform/src/document/contact_request.rs @@ -0,0 +1,170 @@ +use std::sync::Arc; +use dapi_grpc::platform::v0::get_documents_request::get_documents_request_v0::Start; +use dash_sdk::platform::DocumentQuery; +use dash_sdk::Sdk; +use dash_spv_macro::StreamManager; +use dpp::data_contract::DataContract; +use dpp::data_contracts::SystemDataContract; +use dpp::document::Document; +use drive_proof_verifier::types::Documents; +use dash_spv_crypto::network::ChainType; +use drive_proof_verifier::types::RetrievedObjects; +use indexmap::IndexMap; +use platform_value::Identifier; +use crate::error::Error; +use crate::models::contact_request::{ContactRequest, ContactRequestKind}; +use crate::query::{order_by_asc_created_at, where_created_since, where_owner_is, where_recipient_is}; +use crate::util::{RetryStrategy, StreamManager, StreamSettings, StreamSpec, Validator}; + +#[derive(Clone)] +#[ferment_macro::export] +pub enum ContactRequestValidator { + None = 0, + AcceptNotFoundAsNotAnError = 1, +} +impl ContactRequestValidator { + pub fn accept_not_found(&self) -> bool { + match self { + ContactRequestValidator::None => false, + ContactRequestValidator::AcceptNotFoundAsNotAnError => true + } + } +} +impl Validator> for ContactRequestValidator { + fn validate(&self, value: &Option) -> bool { + value.is_some() || value.is_none() && self.accept_not_found() + } +} +impl Validator> for ContactRequestValidator { + fn validate(&self, _value: &RetrievedObjects) -> bool { + true + // value.is_some() || value.is_none() && self.accept_not_found() + } +} +impl StreamSpec for ContactRequestValidator { + type Validator = ContactRequestValidator; + type Error = dash_sdk::Error; + type Result = Option; + type ResultMany = IndexMap>; +} + +#[derive(Clone, Debug, StreamManager)] +#[ferment_macro::opaque] +pub struct ContactRequestManager { + pub sdk: Arc, + pub chain_type: ChainType, +} + +impl ContactRequestManager { + pub fn new(sdk: &Arc, chain_type: ChainType) -> Self { + Self { sdk: Arc::clone(sdk), chain_type } + } + pub fn query_incoming_contact_requests(&self, contract: DataContract, user_id: [u8; 32], since: u64, start_after: Option>) -> Result { + let mut query = DocumentQuery::new(Arc::new(contract), "contactRequest").map_err(Error::from)?; + query.limit = 100; + query.start = start_after.map(Start::StartAfter); + query.where_clauses = vec![ + where_recipient_is(user_id), + where_created_since(since) + ]; + query.order_by_clauses = vec![order_by_asc_created_at()]; + Ok(query) + } + pub fn query_outgoing_contact_requests(&self, contract: DataContract, user_id: [u8; 32], since: u64, start_after: Option>) -> Result { + let mut query = DocumentQuery::new(Arc::new(contract), "contactRequest").map_err(Error::from)?; + query.limit = 100; + query.start = start_after.map(Start::StartAfter); + query.where_clauses = vec![ + where_owner_is(user_id), + where_created_since(since) + ]; + query.order_by_clauses = vec![order_by_asc_created_at()]; + Ok(query) + } +} + +#[ferment_macro::export] +impl ContactRequestManager { + pub async fn incoming_contact_requests_using_contract(&self, contract: DataContract, user_id: [u8; 32], since: u64, start_after: Option>) -> Result, Error> { + let query = self.query_incoming_contact_requests(contract, user_id, since, start_after)?; + self.many_documents_with_query(query).await + .map(|docs| process_contact_requests(&user_id, docs)) + } + pub async fn outgoing_contact_requests_using_contract(&self, contract: DataContract, user_id: [u8; 32], since: u64, start_after: Option>) -> Result, Error> { + let query = self.query_outgoing_contact_requests(contract, user_id, since, start_after)?; + self.many_documents_with_query(query).await + .map(|docs| process_contact_requests(&user_id, docs)) + } + pub async fn incoming_contact_requests(&self, user_id: [u8; 32], since: u64, start_after: Option>) -> Result, Error> { + self.with_contract( + SystemDataContract::Dashpay, + (user_id, since, start_after), + |contract, (user_id, since, start_after)| + self.incoming_contact_requests_using_contract(contract, user_id, since, start_after)).await + } + pub async fn outgoing_contact_requests(&self, user_id: [u8; 32], since: u64, start_after: Option>) -> Result, Error> { + self.with_contract( + SystemDataContract::Dashpay, + (user_id, since, start_after), + |contract, (user_id, since, start_after)| + self.outgoing_contact_requests_using_contract(contract, user_id, since, start_after)).await + } + + + + pub async fn stream_incoming_contact_requests(&self, user_id: [u8; 32], since: u64, start_after: Option>, retry: RetryStrategy, options: ContactRequestValidator, delay: u64) -> Result, Error> { + self.with_contract( + SystemDataContract::Dashpay, + (user_id, since, start_after, retry, options, delay), + |contract, (user_id, since, start_after, retry, options, delay)| + self.stream_incoming_contact_requests_with_contract(user_id, since, start_after, contract, retry, options, delay)).await + } + pub async fn stream_incoming_contact_requests_with_contract(&self, user_id: [u8; 32], since: u64, start_after: Option>, contract: DataContract, retry: RetryStrategy, options: ContactRequestValidator, delay: u64) -> Result, Error> { + let query = self.query_incoming_contact_requests(contract, user_id, since, start_after)?; + self.stream_many_with_settings::(query, retry, StreamSettings::default_with_delay(delay), options).await + .map(|docs| process_contact_requests(&user_id, docs)) + } + + pub async fn stream_outgoing_contact_requests(&self, user_id: [u8; 32], since: u64, start_after: Option>, retry: RetryStrategy, options: ContactRequestValidator, delay: u64) -> Result, Error> { + self.with_contract( + SystemDataContract::Dashpay, + (user_id, since, start_after, retry, options, delay), + |contract, (user_id, since, start_after, retry, options, delay)| + self.stream_outgoing_contact_requests_with_contract(user_id, since, start_after, contract, retry, options, delay)).await + } + pub async fn stream_outgoing_contact_requests_with_contract(&self, user_id: [u8; 32], since: u64, start_after: Option>, contract: DataContract, retry: RetryStrategy, options: ContactRequestValidator, delay: u64) -> Result, Error> { + let query = self.query_outgoing_contact_requests(contract, user_id, since, start_after)?; + self.stream_many_with_settings::(query, retry, StreamSettings::default_with_delay(delay), options).await + .map(|docs| process_contact_requests(&user_id, docs)) + } +} + +fn process_contact_requests(user_id: &[u8; 32], documents: Documents) -> Vec { + Vec::from_iter(documents.into_iter().filter_map(|(_, doc)| { + if let Some(doc) = doc { + if let Ok(contact_request) = ContactRequest::try_from(doc) { + return Some(if contact_request.recipient.eq(user_id) { + ContactRequestKind::Incoming(contact_request) + } else { + ContactRequestKind::Outgoing(contact_request) + }) + } + } + None + })) +} + +#[ferment_macro::export] +pub fn as_incoming_request(kind: ContactRequestKind) -> Option { + match kind { + ContactRequestKind::Incoming(request) => Some(request), + _ => None + } +} +#[ferment_macro::export] +pub fn as_outgoing_request(kind: ContactRequestKind) -> Option { + match kind { + ContactRequestKind::Outgoing(request) => Some(request), + _ => None + } +} diff --git a/dash-spv-platform/src/document/manager.rs b/dash-spv-platform/src/document/manager.rs new file mode 100644 index 00000000..8e4a266b --- /dev/null +++ b/dash-spv-platform/src/document/manager.rs @@ -0,0 +1,230 @@ +use std::sync::Arc; +use dash_sdk::{platform::{DocumentQuery, FetchMany}, Sdk}; +use dpp::data_contract::DataContract; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; +use dash_sdk::platform::transition::put_document::PutDocument; +use dpp::data_contracts::SystemDataContract; +use dpp::document::{Document, DocumentV0Getters}; +use dpp::errors::ProtocolError; +use dpp::identity::identity_public_key::IdentityPublicKey; +use dpp::prelude::{BlockHeight, CoreBlockHeight}; +use dpp::util::entropy_generator::{DefaultEntropyGenerator, EntropyGenerator}; +use drive_proof_verifier::types::RetrievedObjects; +use indexmap::IndexMap; +use platform_value::Identifier; +use platform_version::version::PlatformVersion; +use dash_spv_crypto::network::ChainType; +use dash_spv_macro::StreamManager; +use crate::error::Error; +use crate::query::{order_by_asc_normalized_label, order_by_asc_owner_id, where_domain_is_dash, where_normalized_label_equal_to, where_normalized_label_starts_with, where_owner_in, where_owner_is, where_records_identity_is}; +use crate::signer::CallbackSigner; +use crate::util::{RetryStrategy, StreamManager, StreamSettings, StreamSpec, Validator}; + + + +#[derive(Clone, Debug, StreamManager)] +#[ferment_macro::opaque] +pub struct DocumentsManager { + pub sdk: Arc, + pub chain_type: ChainType, +} + +#[ferment_macro::export] +pub enum DocumentValidator { + None = 0, + AcceptNotFoundAsNotAnError = 1, +} +impl DocumentValidator { + pub fn accept_not_found(&self) -> bool { + match self { + DocumentValidator::None => false, + DocumentValidator::AcceptNotFoundAsNotAnError => true + } + } +} +impl Validator> for DocumentValidator { + fn validate(&self, value: &Option) -> bool { + value.is_some() || value.is_none() && self.accept_not_found() + } +} +impl Validator> for DocumentValidator { + fn validate(&self, _value: &RetrievedObjects) -> bool { + true + } +} + +impl StreamSpec for DocumentValidator { + type Validator = DocumentValidator; + type Error = dash_sdk::Error; + type Result = Option; + type ResultMany = IndexMap; +} + + +impl DocumentsManager { + pub fn new(sdk: &Arc, chain_type: ChainType) -> Self { + Self { sdk: Arc::clone(sdk), chain_type } + } + + pub async fn documents_with_query(&self, query: DocumentQuery) -> Result>, Error> { + Document::fetch_many(&self.sdk, query).await.map_err(Error::from) + } + + + pub async fn put_document( + &self, + document: Document, + document_type: &str, + block_height: BlockHeight, + core_block_height: CoreBlockHeight, + contract: DataContract, + identity_public_key: IdentityPublicKey, + signer: &CallbackSigner, + ) -> Result { + let document_type = contract.document_type_for_name(document_type) + .map_err(ProtocolError::from)?; + let entropy = DefaultEntropyGenerator.generate()?; + + document_type + .create_document_from_data(document.properties().into(), document.owner_id(), block_height, core_block_height, entropy, PlatformVersion::latest()) + .map_err(Error::from)? + .put_to_platform_and_wait_for_response(&self.sdk, document_type.to_owned_document_type(), entropy, identity_public_key, signer, None) + // .put_to_platform_and_wait_for_response(&self.sdk, document_type.to_owned_document_type(), entropy, identity_public_key, Arc::new(contract), signer) + .await + .map_err(Error::from) + + } + + pub fn query_dpns_documents_for_identity_with_user_id(&self, contract: DataContract, user_id: [u8; 32]) -> Result { + let mut query = DocumentQuery::new(Arc::new(contract), "domain").map_err(Error::from)?; + query.limit = 100; + query.where_clauses = vec![where_records_identity_is(user_id)]; + Ok(query) + } + pub fn query_dashpay_profile_for_user_id(&self, contract: DataContract, user_id: [u8; 32]) -> Result { + let mut query = DocumentQuery::new(Arc::new(contract), "profile").map_err(Error::from)?; + query.limit = 1; + query.where_clauses = vec![where_owner_is(user_id)]; + Ok(query) + } + pub fn query_dashpay_profiles_for_user_ids(&self, contract: DataContract, user_ids: Vec<[u8; 32]>) -> Result { + let mut query = DocumentQuery::new(Arc::new(contract), "profile").map_err(Error::from)?; + query.limit = user_ids.len() as u32; + query.where_clauses = vec![where_owner_in(user_ids)]; + query.order_by_clauses = vec![order_by_asc_owner_id()]; + Ok(query) + } + + pub fn query_dpns_documents_for_username(&self, contract: DataContract, username: String) -> Result { + let mut query = DocumentQuery::new(Arc::new(contract), "domain").map_err(Error::from)?; + query.limit = 100; + query.where_clauses = vec![ + where_domain_is_dash(), + where_normalized_label_equal_to(username), + ]; + query.order_by_clauses = vec![order_by_asc_normalized_label()]; + Ok(query) + } + + pub fn query_dpns_documents_for_username_prefix(&self, contract: DataContract, username_prefix: String) -> Result { + let mut query = DocumentQuery::new(Arc::new(contract), "domain").map_err(Error::from)?; + query.limit = 100; + query.where_clauses = vec![ + where_domain_is_dash(), + where_normalized_label_starts_with(username_prefix), + ]; + query.order_by_clauses = vec![order_by_asc_normalized_label()]; + Ok(query) + } + +} + +#[ferment_macro::export] +impl DocumentsManager { + + pub async fn dpns_documents_for_identity_with_user_id(&self, user_id: [u8; 32]) -> Result>, Error> { + self.with_contract( + SystemDataContract::DPNS, + user_id, + |contract, user_id| + self.dpns_documents_for_identity_with_user_id_using_contract(user_id, contract)).await + } + pub async fn stream_dpns_documents_for_identity_with_user_id(&self, user_id: [u8; 32], retry: RetryStrategy, options: DocumentValidator, delay: u64) -> Result>, Error> { + self.with_contract( + SystemDataContract::DPNS, + user_id, + |contract, user_id| + self.stream_dpns_documents_for_identity_with_user_id_using_contract(user_id, contract, retry, options, delay)).await + } + pub async fn stream_dpns_documents_for_identity_with_user_id_using_contract(&self, user_id: [u8; 32], contract: DataContract, retry: RetryStrategy, options: DocumentValidator, delay: u64) -> Result>, Error> { + let query = self.query_dpns_documents_for_identity_with_user_id(contract, user_id)?; + self.stream_many_with_settings::(query, retry, StreamSettings::default_with_delay(delay), options).await + } + + pub async fn dpns_documents_for_username(&self, username: String) -> Result>, Error> { + self.with_contract( + SystemDataContract::DPNS, + username, + |contract, username| + self.dpns_documents_for_username_using_contract(username, contract)).await + } + pub async fn dpns_documents_for_username_prefix(&self, username_prefix: String) -> Result>, Error> { + self.with_contract( + SystemDataContract::DPNS, + username_prefix, + |contract, username| + self.dpns_documents_for_username_prefix_using_contract(username, contract)).await + } + pub async fn dashpay_profile_for_user_id(&self, user_id: [u8; 32]) -> Result, Error> { + self.with_contract( + SystemDataContract::Dashpay, + user_id, + |contract, user_id| + self.dashpay_profile_for_user_id_using_contract(user_id, contract)).await + } + pub async fn dashpay_profiles_for_user_ids(&self, user_ids: Vec<[u8; 32]>) -> Result>, Error> { + self.with_contract( + SystemDataContract::Dashpay, + user_ids, + |contract, user_ids| + self.dashpay_profiles_for_user_ids_using_contract(user_ids, contract)).await + } + + + + + pub async fn dpns_documents_for_identity_with_user_id_using_contract(&self, user_id: [u8; 32], contract: DataContract) -> Result>, Error> { + let query = self.query_dpns_documents_for_identity_with_user_id(contract, user_id)?; + self.many_documents_with_query(query).await + } + + pub async fn dashpay_profile_for_user_id_using_contract(&self, user_id: [u8; 32], contract: DataContract) -> Result, Error> { + let query = self.query_dashpay_profile_for_user_id(contract, user_id)?; + self.document_with_query(query).await + } + pub async fn stream_dashpay_profile_for_user_id_using_contract(&self, user_id: [u8; 32], contract: DataContract, retry: RetryStrategy, options: DocumentValidator, delay: u64) -> Result, Error> { + let query = self.query_dashpay_profile_for_user_id(contract, user_id)?; + self.stream_with_settings::(query, retry, StreamSettings::default_with_delay(delay), options).await + } + + pub async fn dashpay_profiles_for_user_ids_using_contract(&self, user_ids: Vec<[u8; 32]>, contract: DataContract) -> Result>, Error> { + let query = self.query_dashpay_profiles_for_user_ids(contract, user_ids)?; + self.many_documents_with_query(query).await + } + pub async fn stream_dashpay_profiles_for_user_ids_using_contract(&self, user_ids: Vec<[u8; 32]>, contract: DataContract, retry: RetryStrategy, options: DocumentValidator, delay: u64) -> Result>, Error> { + let query = self.query_dashpay_profiles_for_user_ids(contract, user_ids)?; + self.stream_many_with_settings::(query, retry, StreamSettings::default_with_delay(delay), options).await + } + + pub async fn dpns_documents_for_username_using_contract(&self, username: String, contract: DataContract) -> Result>, Error> { + let query = self.query_dpns_documents_for_username(contract, username)?; + self.many_documents_with_query(query).await + } + pub async fn dpns_documents_for_username_prefix_using_contract(&self, username_prefix: String, contract: DataContract) -> Result>, Error> { + let query = self.query_dpns_documents_for_username_prefix(contract, username_prefix)?; + self.many_documents_with_query(query).await + } + +} + diff --git a/dash-spv-platform/src/document/mod.rs b/dash-spv-platform/src/document/mod.rs new file mode 100644 index 00000000..f91b158e --- /dev/null +++ b/dash-spv-platform/src/document/mod.rs @@ -0,0 +1,18 @@ +use dpp::document::{Document, DocumentV0Getters}; +use platform_value::Value; + +pub mod contact_request; +pub mod manager; +pub mod salted_domain_hashes; +pub mod usernames; + +#[ferment_macro::export] +pub fn get_document_property(document: Document, property: &str) -> Option { + document.properties() + .get(property) + .cloned() +} +#[ferment_macro::export] +pub fn print_document(document: Document) { + println!("{}", document.to_string()); +} \ No newline at end of file diff --git a/dash-spv-platform/src/document/salted_domain_hashes.rs b/dash-spv-platform/src/document/salted_domain_hashes.rs new file mode 100644 index 00000000..9961641d --- /dev/null +++ b/dash-spv-platform/src/document/salted_domain_hashes.rs @@ -0,0 +1,130 @@ +use std::sync::Arc; +use dash_sdk::platform::DocumentQuery; +use dash_sdk::Sdk; +use dash_spv_macro::StreamManager; +use dpp::data_contract::DataContract; +use dpp::document::Document; +use dpp::system_data_contracts::SystemDataContract; +use drive_proof_verifier::types::RetrievedObjects; +use indexmap::IndexMap; +use platform_value::Identifier; +use dash_spv_crypto::network::ChainType; +use crate::error::Error; +use crate::query::{order_by_asc_salted_domain_hash, where_salted_domain_hash_in, where_salted_domain_hash_is}; +use crate::util::{RetryStrategy, StreamManager, StreamSettings, StreamSpec, Validator}; + +#[derive(Clone, Debug, StreamManager)] +#[ferment_macro::opaque] +pub struct SaltedDomainHashesManager { + pub sdk: Arc, + pub chain_type: ChainType, +} + +impl SaltedDomainHashesManager { + pub fn new(sdk: &Arc, chain_type: ChainType) -> Self { + Self { sdk: Arc::clone(sdk), chain_type } + } + pub fn query_preorder_salted_domain_hash(&self, contract: DataContract, hash: Vec) -> Result { + let mut query = DocumentQuery::new(Arc::new(contract), "preorder").map_err(Error::from)?; + query.limit = 1; + query.where_clauses = vec![where_salted_domain_hash_is(hash)]; + Ok(query) + } + pub fn query_preorder_salted_domain_hashes(&self, contract: DataContract, hashes: Vec>) -> Result { + let mut query = DocumentQuery::new(Arc::new(contract), "preorder").map_err(Error::from)?; + query.limit = hashes.len() as u32; + query.where_clauses = vec![where_salted_domain_hash_in(hashes)]; + query.order_by_clauses = vec![order_by_asc_salted_domain_hash()]; + Ok(query) + } + +} + +#[ferment_macro::export] +impl SaltedDomainHashesManager { + pub async fn preorder_salted_domain_hash(&self, hash: Vec) -> Result, Error> { + self.with_contract( + SystemDataContract::DPNS, + hash, + |contract, hash| + self.preorder_salted_domain_hash_with_contract(hash, contract)).await + } + pub async fn preorder_salted_domain_hashes(&self, hashes: Vec>) -> Result>, Error> { + self.with_contract( + SystemDataContract::DPNS, + hashes, + |contract, hashes| + self.preorder_salted_domain_hashes_with_contract(hashes, contract)).await + } + + pub async fn preorder_salted_domain_hash_stream(&self, hash: Vec, retry: RetryStrategy, options: SaltedDomainHashValidator, delay: u64) -> Result, Error> { + self.with_contract( + SystemDataContract::DPNS, + (hash, retry, options, delay), + |contract, (hash, retry, options, delay)| + self.stream_preorder_salted_domain_hash_with_contract(hash, contract, retry, options, delay)).await + } + + pub async fn preorder_salted_domain_hashes_stream(&self, hashes: Vec>, retry: RetryStrategy, options: SaltedDomainHashValidator, delay: u64) -> Result>, Error> { + self.with_contract( + SystemDataContract::DPNS, + (hashes, retry, options, delay), + |contract, (hashes, retry, options, delay)| + self.stream_preorder_salted_domain_hashes_with_contract(hashes, contract, retry, options, delay)).await + } + + + pub async fn preorder_salted_domain_hash_with_contract(&self, hash: Vec, contract: DataContract) -> Result, Error> { + let query = self.query_preorder_salted_domain_hash(contract, hash)?; + self.document_with_query(query).await + } + + pub async fn preorder_salted_domain_hashes_with_contract(&self, hashes: Vec>, contract: DataContract) -> Result>, Error> { + let query = self.query_preorder_salted_domain_hashes(contract, hashes)?; + self.many_documents_with_query(query).await + } + + pub async fn stream_preorder_salted_domain_hash_with_contract(&self, hash: Vec, contract: DataContract, retry: RetryStrategy, options: SaltedDomainHashValidator, delay: u64) -> Result, Error> { + let query = self.query_preorder_salted_domain_hash(contract, hash)?; + self.stream_with_settings::(query, retry, StreamSettings::default_with_delay(delay), options).await + } + pub async fn stream_preorder_salted_domain_hashes_with_contract(&self, hashes: Vec>, contract: DataContract, retry: RetryStrategy, options: SaltedDomainHashValidator, delay: u64) -> Result>, Error> { + let query = self.query_preorder_salted_domain_hashes(contract, hashes)?; + self.stream_many_with_settings::(query, retry, StreamSettings::default_with_delay(delay), options).await + } + +} + + +#[ferment_macro::export] +pub enum SaltedDomainHashValidator { + None = 0, + AcceptNotFoundAsNotAnError = 1, +} + +impl SaltedDomainHashValidator { + pub fn accept_not_found(&self) -> bool { + match self { + SaltedDomainHashValidator::None => false, + SaltedDomainHashValidator::AcceptNotFoundAsNotAnError => true + } + } +} +impl Validator> for SaltedDomainHashValidator { + fn validate(&self, value: &Option) -> bool { + value.is_some() || value.is_none() && self.accept_not_found() + } +} +impl Validator> for SaltedDomainHashValidator { + fn validate(&self, _value: &RetrievedObjects) -> bool { + true + } +} + +impl StreamSpec for SaltedDomainHashValidator { + type Validator = SaltedDomainHashValidator; + type Error = dash_sdk::Error; + type Result = Option; + type ResultMany = IndexMap; +} + diff --git a/dash-spv-platform/src/document/usernames.rs b/dash-spv-platform/src/document/usernames.rs new file mode 100644 index 00000000..d89bf226 --- /dev/null +++ b/dash-spv-platform/src/document/usernames.rs @@ -0,0 +1,216 @@ +use std::sync::Arc; +use dash_sdk::platform::DocumentQuery; +use dash_sdk::Sdk; +use dpp::data_contract::DataContract; +use dpp::data_contracts::SystemDataContract; +use dpp::document::Document; +use drive_proof_verifier::types::RetrievedObjects; +use indexmap::IndexMap; +use platform_value::Identifier; +use dash_spv_crypto::network::ChainType; +use dash_spv_macro::StreamManager; +use crate::error::Error; +use crate::query::{order_by_asc_normalized_label, where_domain_is, where_normalized_label_equal_to, where_normalized_label_in}; +use crate::util::{RetryStrategy, StreamManager, StreamSettings, StreamSpec, Validator}; + +#[derive(Clone, Debug, PartialEq, Eq)] +#[ferment_macro::export] +pub enum UsernameStatus { + NotPresent = 0, + Initial = 1, + PreorderRegistrationPending = 2, + Preordered = 3, + RegistrationPending = 4, // sent to DAPI, not yet confirmed + Confirmed = 5, + TakenOnNetwork = 6, + VotingPeriod = 7, + Locked = 8, +} + +#[ferment_macro::export] +impl UsernameStatus { + pub fn is_not_present(&self) -> bool { + matches!(self, UsernameStatus::NotPresent) + } + pub fn is_initial(&self) -> bool { + matches!(self, UsernameStatus::Initial) + } + pub fn is_preorder_registration_pending(&self) -> bool { + matches!(self, UsernameStatus::PreorderRegistrationPending) + } + pub fn is_preordered(&self) -> bool { + matches!(self, UsernameStatus::Preordered) + } + pub fn is_registration_pending(&self) -> bool { + matches!(self, UsernameStatus::RegistrationPending) + } + pub fn is_confirmed(&self) -> bool { + matches!(self, UsernameStatus::Confirmed) + } + pub fn is_taken_on_network(&self) -> bool { + matches!(self, UsernameStatus::TakenOnNetwork) + } + pub fn is_voting_period(&self) -> bool { + matches!(self, UsernameStatus::VotingPeriod) + } + pub fn is_locked(&self) -> bool { + matches!(self, UsernameStatus::Locked) + } +} + +impl From for UsernameStatus { + fn from(value: u8) -> Self { + match value { + 0 => UsernameStatus::NotPresent, + 1 => UsernameStatus::Initial, + 2 => UsernameStatus::PreorderRegistrationPending, + 3 => UsernameStatus::Preordered, + 4 => UsernameStatus::RegistrationPending, + 5 => UsernameStatus::Confirmed, + 6 => UsernameStatus::TakenOnNetwork, + 7 => UsernameStatus::VotingPeriod, + 8 => UsernameStatus::Locked, + _ => panic!("Invalid username status index: {value}"), + } + } +} +impl From for u8 { + fn from(value: UsernameStatus) -> Self { + match value { + UsernameStatus::NotPresent => 0, + UsernameStatus::Initial => 1, + UsernameStatus::PreorderRegistrationPending => 2, + UsernameStatus::Preordered => 3, + UsernameStatus::RegistrationPending => 4, + UsernameStatus::Confirmed => 5, + UsernameStatus::TakenOnNetwork => 6, + UsernameStatus::VotingPeriod => 7, + UsernameStatus::Locked => 8, + } + } +} +#[derive(Clone, Debug, StreamManager)] +#[ferment_macro::opaque] +pub struct UsernamesManager { + pub sdk: Arc, + pub chain_type: ChainType, +} +impl UsernamesManager { + pub fn new(sdk: &Arc, chain_type: ChainType) -> Self { + Self { sdk: Arc::clone(sdk), chain_type } + } + pub fn query_username(&self, contract: DataContract, domain: String, username: String) -> Result { + let mut query = DocumentQuery::new(Arc::new(contract), "domain").map_err(Error::from)?; + query.limit = 1; + query.where_clauses = vec![where_domain_is(domain), where_normalized_label_equal_to(username)]; + Ok(query) + } + pub fn query_usernames(&self, contract: DataContract, domain: String, usernames: Vec) -> Result { + let mut query = DocumentQuery::new(Arc::new(contract), "domain").map_err(Error::from)?; + query.limit = usernames.len() as u32; + query.where_clauses = vec![where_domain_is(domain), where_normalized_label_in(usernames)]; + query.order_by_clauses = vec![order_by_asc_normalized_label()]; + Ok(query) + + } + +} + +#[ferment_macro::export] +impl UsernamesManager { + pub async fn username(&self, domain: String, username: String) -> Result, Error> { + self.with_contract( + SystemDataContract::DPNS, + (domain, username), + |contract, (domain, username)| + self.username_with_contract(domain, username, contract)).await + } + + pub async fn usernames(&self, domain: String, usernames: Vec) -> Result>, Error> { + self.with_contract( + SystemDataContract::DPNS, + (domain, usernames), + |contract, (domain, usernames)| + self.usernames_with_contract(domain, usernames, contract)).await + } + pub async fn username_stream(&self, domain: String, username: String, retry: RetryStrategy, options: UsernameValidator, delay: u64) -> Result, Error> { + self.with_contract( + SystemDataContract::DPNS, + (domain, username, retry, options, delay), + |contract, (domain, username, retry, options, delay)| + self.stream_username_with_contract(domain, username, contract, retry, options, delay)).await + } + + pub async fn usernames_stream(&self, domain: String, usernames: Vec, retry: RetryStrategy, options: UsernameValidator, delay: u64) -> Result>, Error> { + self.with_contract( + SystemDataContract::DPNS, + (domain, usernames, retry, options, delay), + |contract, (domain, usernames, retry, options, delay)| + self.stream_usernames_with_contract(domain, usernames, contract, retry, options, delay)).await + } + + + /// Using pre-fetched contract + pub async fn username_with_contract(&self, domain: String, username: String, contract: DataContract) -> Result, Error> { + let query = self.query_username(contract, domain, username)?; + self.document_with_query(query).await + } + + pub async fn usernames_with_contract(&self, domain: String, usernames: Vec, contract: DataContract) -> Result>, Error> { + let query = self.query_usernames(contract, domain, usernames)?; + self.many_documents_with_query(query).await + } + + pub async fn stream_username_with_contract(&self, domain: String, username: String, contract: DataContract, retry: RetryStrategy, options: UsernameValidator, delay: u64) -> Result, Error> { + let query = self.query_username(contract, domain, username)?; + self.stream_with_settings::(query, retry, StreamSettings::default_with_delay(delay), options).await + } + pub async fn stream_usernames_with_contract(&self, domain: String, usernames: Vec, contract: DataContract, retry: RetryStrategy, options: UsernameValidator, delay: u64) -> Result>, Error> { + let query = self.query_usernames(contract, domain, usernames)?; + self.stream_many_with_settings::(query, retry, StreamSettings::default_with_delay(delay), options).await + } + +} + + +#[ferment_macro::export] +pub enum UsernameValidator { + None = 0, + AcceptNotFoundAsNotAnError = 1, +} + +impl UsernameValidator { + pub fn accept_not_found(&self) -> bool { + match self { + UsernameValidator::None => false, + UsernameValidator::AcceptNotFoundAsNotAnError => true + } + } +} +impl Validator> for UsernameValidator { + fn validate(&self, value: &Option) -> bool { + value.is_some() || value.is_none() && self.accept_not_found() + } +} +impl Validator> for UsernameValidator { + fn validate(&self, _value: &RetrievedObjects) -> bool { + true + } +} + +impl StreamSpec for UsernameValidator { + type Validator = UsernameValidator; + type Error = dash_sdk::Error; + type Result = Option; + type ResultMany = IndexMap; +} + + +#[ferment_macro::export] +pub fn username_status_to_index(status: UsernameStatus) -> u8 { + u8::from(status) +} +#[ferment_macro::export] +pub fn username_status_from_index(index: u8) -> UsernameStatus { + UsernameStatus::from(index) +} diff --git a/dash-spv-platform/src/error.rs b/dash-spv-platform/src/error.rs new file mode 100644 index 00000000..fa4172e3 --- /dev/null +++ b/dash-spv-platform/src/error.rs @@ -0,0 +1,88 @@ +use dash_sdk::dapi_client::{AddressListError, DapiClientError, ExecutionError}; +use dpp::data_contract::errors::DataContractError; +use dpp::errors::consensus::basic::BasicError; +use dpp::errors::consensus::ConsensusError; +use dash_spv_crypto::keys::KeyError; +use dpp::errors::ProtocolError; +use http::uri::InvalidUri; +use crate::util::{MaxRetryError, ValidationError}; + +#[derive(Clone, Debug)] +#[ferment_macro::export] +pub enum Error { + KeyError(KeyError), + DashSDKError(String), + Any(i32, String), + MaxRetryExceeded(String), + InstantSendSignatureVerificationError(String) +} + + +impl From for Error { + fn from(e: dash_sdk::Error) -> Self { + if let dash_sdk::Error::Protocol(ProtocolError::ConsensusError(ref err)) = e { + if let ConsensusError::BasicError(BasicError::InvalidInstantAssetLockProofSignatureError(err)) = &**err { + return Error::InstantSendSignatureVerificationError(format!("{err:?}")); + } + } + Error::DashSDKError(format!("{e:?}")) + } +} +impl From for Error { + fn from(e: ProtocolError) -> Self { + Error::DashSDKError(e.to_string()) + } +} +impl From for Error { + fn from(e: anyhow::Error) -> Self { + Error::DashSDKError(e.to_string()) + } +} +impl From for Error { + fn from(e: InvalidUri) -> Self { + Error::DashSDKError(e.to_string()) + } +} +impl From for Error { + fn from(value: AddressListError) -> Self { + Error::DashSDKError(value.to_string()) + } +} + +impl From> for Error { + fn from(value: ExecutionError) -> Self { + Error::DashSDKError(value.to_string()) + } +} +impl From for Error { + fn from(value: DataContractError) -> Self { + Error::DashSDKError(value.to_string()) + } +} +impl From for Error { + fn from(value: dashcore::consensus::encode::Error) -> Self { + Error::DashSDKError(value.to_string()) + } +} + +impl From> for Error { + fn from(value: Box) -> Self { + Error::DashSDKError(format!("{value:?}")) + } +} + +impl MaxRetryError for Error { + fn max_retry_error() -> Self { + Error::MaxRetryExceeded("".to_string()) + } +} +impl MaxRetryError for dash_sdk::Error { + fn max_retry_error() -> Self { + dash_sdk::Error::Generic("max retry exceeded".to_string()) + } +} +impl ValidationError for dash_sdk::Error { + fn validation_error() -> Self { + dash_sdk::Error::Generic("Validation failed".to_string()) + } +} diff --git a/dash-spv-platform/src/identity/invitation.rs b/dash-spv-platform/src/identity/invitation.rs new file mode 100644 index 00000000..155d4270 --- /dev/null +++ b/dash-spv-platform/src/identity/invitation.rs @@ -0,0 +1,28 @@ +// use std::error::Error; +// use dpp::dashcore::OutPoint; +// use dash_spv_crypto::tx::Transaction; +// use crate::identity::model::IdentityModel; +// +// pub struct Invitation { +// +// /// This is the identity that was made from the invitation. +// /// There should always be an identity associated to a blockchain invitation. +// /// This identity might not yet be registered on Dash Platform. +// pub identity: Option, +// +// /// This is an invitation that was created locally. +// pub created_locally: bool, +// +// /// This is an invitation that was created with an external link, and has not yet retrieved the identity. +// pub needs_identity_retrieval, +// +// /// This is the wallet holding the blockchain invitation. There should always be a wallet associated to a blockchain invitation. +// pub wallet: Option, +// +// /// A name for locally created invitation. +// pub name: String, +// +// /// A tag for locally created invitation. +// pub tag: String +// +// } diff --git a/dash-spv-platform/src/identity/manager.rs b/dash-spv-platform/src/identity/manager.rs new file mode 100644 index 00000000..fe7ba0e1 --- /dev/null +++ b/dash-spv-platform/src/identity/manager.rs @@ -0,0 +1,353 @@ +use std::collections::{BTreeMap, HashMap}; +use std::fmt::{Debug, Formatter}; +use std::sync::{Arc, RwLock}; +use std::time::Duration; +// use dashcore::hashes::hex::DisplayHex; +use dpp::identity::{Identity, IdentityPublicKey, identity_public_key::key_type::KeyType}; +use dash_sdk::platform::Fetch; +use dash_sdk::platform::types::identity::PublicKeyHash; +use dash_sdk::{RequestSettings, Sdk}; +use dashcore::hashes::{hash160, Hash}; +use dashcore::secp256k1::hashes::hex::DisplayHex; +use dash_spv_macro::StreamManager; +use dpp::identity::accessors::IdentityGettersV0; +use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; +use dpp::identity::identity_public_key::contract_bounds::ContractBounds; +use dpp::identity::identity_public_key::{Purpose, SecurityLevel}; +use dpp::identity::identity_public_key::v0::IdentityPublicKeyV0; +use drive_proof_verifier::types::RetrievedObjects; +use indexmap::IndexMap; +use platform_value::{BinaryData, Identifier}; +use dash_spv_crypto::derivation::{IIndexPath, IndexPath, BIP32_HARD}; +// use dash_spv_crypto::hashes::hash160; +use dash_spv_crypto::keys::{BLSKey, ECDSAKey, IKey, KeyError, OpaqueKey}; +use dash_spv_crypto::keys::key::KeyKind; +use dash_spv_crypto::network::{ChainType, IHaveChainSettings}; +use crate::error::Error; +use crate::util::{RetryStrategy, StreamManager, StreamSettings, StreamSpec, Validator}; +const KEYS_TO_CHECK: u32 = 5; +const DEFAULT_SETTINGS: RequestSettings = RequestSettings { + connect_timeout: Some(Duration::from_millis(20000)), + timeout: Some(Duration::from_secs(0)), + retries: Some(3), + ban_failed_address: None, +}; + +#[derive(Clone)] +#[ferment_macro::export] +pub struct IndexedKey { + pub index: u32, + pub key: OpaqueKey +} + +#[derive(Clone)] +#[ferment_macro::export] +pub enum IdentityValidator { + None = 0, + AcceptNotFoundAsNotAnError = 1, +} +impl IdentityValidator { + pub fn accept_not_found(&self) -> bool { + match self { + IdentityValidator::None => false, + IdentityValidator::AcceptNotFoundAsNotAnError => true + } + } +} +impl Validator> for IdentityValidator { + fn validate(&self, value: &Option) -> bool { + value.is_some() || value.is_none() && self.accept_not_found() + } +} +impl Validator> for IdentityValidator { + fn validate(&self, _value: &RetrievedObjects) -> bool { + true + // value.is_some() || value.is_none() && self.accept_not_found() + } +} +impl StreamSpec for IdentityValidator { + type Validator = IdentityValidator; + type Error = dash_sdk::Error; + type Result = Option; + type ResultMany = IndexMap>; +} + + +#[derive(Clone, StreamManager)] +#[ferment_macro::opaque] +pub struct IdentitiesManager { + pub sdk: Arc, + pub chain_type: ChainType, + pub foreign_identities: HashMap, + pub last_synced_identities_timestamp: u64, + pub has_recent_identities_sync: bool, + // key is wallet_unique_id + pub all_identities: Arc>>>, +} + +impl Debug for IdentitiesManager { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.write_str(format!("[{}] [IdentitiesManager]", self.chain_type.name()).as_str()) + } +} + +impl IdentitiesManager { + pub fn new(sdk: &Arc, chain_type: ChainType) -> Self { + Self { chain_type, foreign_identities: HashMap::new(), all_identities: Arc::new(RwLock::new(BTreeMap::new())), sdk: Arc::clone(sdk), last_synced_identities_timestamp: 0, has_recent_identities_sync: false } + } +} +#[ferment_macro::export] +impl IdentitiesManager { + pub async fn fetch_by_id_bytes(&self, id_bytes: [u8; 32]) -> Result, Error> { + self.fetch_by_id(Identifier::from(id_bytes)).await + } + pub async fn fetch_by_id(&self, id: Identifier) -> Result, Error> { + Identity::fetch_by_identifier(&self.sdk, id).await.map_err(Error::from) + } + pub async fn fetch_by_key_hash(&self, key_hash: PublicKeyHash) -> Result, Error> { + Identity::fetch(&self.sdk, key_hash).await.map_err(Error::from) + } + pub async fn fetch_balance(&self, id: Identifier) -> Result, Error> { + u64::fetch_by_identifier(&self.sdk, id).await.map_err(Error::from) + } + pub async fn fetch_balance_by_id_bytes(&self, id: [u8; 32]) -> Result, Error> { + self.fetch_balance(Identifier::from(id)).await + } + pub async fn get_identities_for_wallets_public_keys(&self, wallets: BTreeMap>) -> Result>, Error> { + let mut all_identities = BTreeMap::new(); + for (wallet_id, key_hashes) in wallets.into_iter() { + println!("{self:?} get_identities_for_wallets_public_keys -> {} -- {:?}", wallet_id, key_hashes); + let mut identities = BTreeMap::new(); + for key_hash in key_hashes { + let identity_result = Identity::fetch_with_settings(&self.sdk, PublicKeyHash(key_hash), DEFAULT_SETTINGS).await; + match identity_result { + Ok(Some(identity)) => { + println!("{self:?} Ok::get_identities_for_wallets -> wallet_id: {}: index: {}: identity_id: {}", wallet_id, key_hash.to_lower_hex_string(), identity.id().to_buffer().to_lower_hex_string()); + identities.insert(key_hash, identity); + }, + Ok(None) => { + println!("{self:?} None::get_identities_for_wallets -> wallet_id: {}: index: {}: identity_id: None", wallet_id, key_hash.to_lower_hex_string()); + } + Err(error) => { + println!("{self:?} Error::get_identities_for_wallets -> wallet_id: {}: index: {}: error: {}", wallet_id, key_hash.to_lower_hex_string(), error.to_string()); + } + } + } + all_identities.insert(wallet_id, identities); + } + let mut lock = self.all_identities.write().unwrap(); + lock.extend(all_identities.clone()); + drop(lock); + Ok(all_identities) + } + pub async fn get_identities_for_key_hashes(&self, wallet_id: String, key_hashes: Vec<[u8; 20]>, ) -> Result, Error> { + let mut identities = BTreeMap::new(); + for key_hash in key_hashes.into_iter() { + match Identity::fetch_with_settings(&self.sdk, PublicKeyHash(key_hash), DEFAULT_SETTINGS).await { + Ok(Some(identity)) => { + println!("{self:?} Ok::get_identities_for_wallets -> key_hash: {}: identity_id: {}", key_hash.to_lower_hex_string(), identity.id().to_buffer().to_lower_hex_string()); + identities.insert(key_hash, identity); + }, + Ok(None) => { + println!("{self:?} None::get_identities_for_wallets -> key_hash: {}: identity_id: None", key_hash.to_lower_hex_string()); + } + Err(error) => { + println!("{self:?} Error::get_identities_for_wallets -> key_hash: {}: error: {}", key_hash.to_lower_hex_string(), error.to_string()); + } + } + } + let mut lock = self.all_identities.write().unwrap(); + lock.entry(wallet_id) + .or_default() + .extend(identities.clone()); + drop(lock); + Ok(identities) + } + pub async fn get_identities_by_pub_key_hashes_at_index_range(&self, extended_public_key: &ECDSAKey, unused_index: u32) -> Result, Error> { + let mut identities = IndexMap::new(); + for i in unused_index..KEYS_TO_CHECK { + let index_path = IndexPath::::new([i | BIP32_HARD, 0 | BIP32_HARD].to_vec()); + let index_key = extended_public_key.public_key_from_extended_public_key_data_at_index_path(&index_path) + .map_err(Error::KeyError)?; + let pub_key_data = index_key.public_key_data(); + if let Some(identity) = Identity::fetch(&self.sdk, PublicKeyHash(hash160::Hash::hash(&pub_key_data).to_byte_array())) + .await? { + identities.insert(i, identity); + } + } + Ok(identities) + } + + pub async fn monitor(&self, unique_id: Identifier, retry: RetryStrategy, options: IdentityValidator) -> Result, Error> { + self.stream::(unique_id, retry, options).await + } + pub async fn monitor_for_id_bytes(&self, unique_id: [u8; 32], retry: RetryStrategy, options: IdentityValidator) -> Result, Error> { + self.stream::(Identifier::from(unique_id), retry, options).await + } + pub async fn monitor_for_key_hash(&self, key_hash: [u8; 20], retry: RetryStrategy, options: IdentityValidator) -> Result, Error> { + self.stream::(PublicKeyHash(key_hash), retry, options).await + } + pub async fn monitor_with_delay(&self, unique_id: [u8; 32], retry: RetryStrategy, options: IdentityValidator, delay: u64) -> Result, Error> { + self.stream_with_settings::(Identifier::from(unique_id), retry, StreamSettings::default_with_delay(delay), options).await + } + pub async fn monitor_for_key_hashes(&self, key_hashes: Vec<[u8; 20]>, retry: RetryStrategy, options: IdentityValidator) -> Result, Error> { + println!("{self:?} monitor_for_key_hashes: {}", key_hashes.len()); + let mut identities = BTreeMap::new(); + for key_hash in key_hashes.into_iter() { + match self.monitor_for_key_hash(key_hash, retry.clone(), options.clone()).await { + Ok(Some(identity)) => { + let identity_id = identity.id(); + let public_keys = identity.public_keys(); + let debug_keys = public_keys.iter().fold(String::new(), |mut acc, (key_id, pub_key)| { + let debug_key = format!("[id: {}, key_type: {}, purpose: {}, security_level: {}, contract_bounds: {}, read_only: {}, data: {}, disabled_at: {}]", + pub_key.id(), pub_key.key_type(), pub_key.purpose(), pub_key.security_level(), + pub_key.contract_bounds().map_or("None".to_string(), |b| match b { + ContractBounds::SingleContract { id } => format!("SingleContract({})", id.to_buffer().to_lower_hex_string()), + ContractBounds::SingleContractDocumentType { id, document_type_name} => format!("SingleContractDocumentType({}, {})", id.to_buffer().to_lower_hex_string(), document_type_name), + }), pub_key.read_only(), pub_key.data().0.to_lower_hex_string(), pub_key.disabled_at().map_or("None".to_string(), |p| p.to_string())); + acc.push_str(format!("{}:{}", *key_id, debug_key).as_str()); + acc + }); + println!("{self:?} Ok::monitor_for_key_hashes -> key_hash: {}: identity: [id: {}, balance: {}, revision: {}, public_keys: {}]", key_hash.to_lower_hex_string(), identity.balance(), identity.revision(), identity_id.to_buffer().to_lower_hex_string(), debug_keys); + identities.insert(key_hash, identity); + }, + Ok(None) => { + println!("{self:?} None::monitor_for_key_hashes -> key_hash: {}: identity: None", key_hash.to_lower_hex_string()); + } + Err(error) => { + println!("{self:?} Error::monitor_for_key_hashes -> key_hash: {}: error: {:?}", key_hash.to_lower_hex_string(), error); + } + } + } + Ok(identities) + } + +} + +// TODO: Here we have ugly thing with keys conversion. +// TODO: We should rework this to replace KeyKind with KeyType, +// TODO: but for now it's not easy to do + +#[ferment_macro::export] +pub fn identity_registration_public_key(index: u32, public_key: OpaqueKey) -> IdentityPublicKey { + IdentityPublicKey::V0(IdentityPublicKeyV0 { + id: index, + purpose: Purpose::AUTHENTICATION, + security_level: SecurityLevel::MASTER, + contract_bounds: None, + key_type: KeyType::ECDSA_SECP256K1, + read_only: false, + data: BinaryData(public_key.public_key_data()), + disabled_at: None, + }) +} + +#[ferment_macro::export] +pub fn identity_public_key(index: u32, public_key: OpaqueKey, security_level: SecurityLevel, purpose: Purpose) -> IdentityPublicKey { + IdentityPublicKey::V0(IdentityPublicKeyV0 { + id: index, + purpose, + security_level, + contract_bounds: None, + key_type: KeyType::ECDSA_SECP256K1, + read_only: false, + data: BinaryData(public_key.public_key_data()), + disabled_at: None, + }) +} + +#[ferment_macro::export] +pub fn opaque_key_from_identity_public_key(public_key: IdentityPublicKey) -> Result { + let public_key_data = public_key.data(); + match public_key.key_type() { + KeyType::ECDSA_SECP256K1 => + ECDSAKey::key_with_public_key_data(public_key_data.as_slice()) + .map(OpaqueKey::ECDSA), + KeyType::BLS12_381 => { + as TryInto<[u8; 48]>>::try_into(public_key_data.to_vec()) + .map_err(|_e| KeyError::WrongLength(public_key_data.len())) + .map(|pubkey| BLSKey::key_with_public_key(pubkey, false)) + .map(OpaqueKey::BLS) + } + key_type => Err(KeyError::Any(format!("unsupported type of key: {}", key_type))), + } +} +#[ferment_macro::export] +pub fn security_level_to_index(level: SecurityLevel) -> u8 { + match level { + SecurityLevel::MASTER => 0, + SecurityLevel::CRITICAL => 1, + SecurityLevel::HIGH => 2, + SecurityLevel::MEDIUM => 3, + } +} +#[ferment_macro::export] +pub fn security_level_from_index(index: u8) -> SecurityLevel { + match index { + 0 => SecurityLevel::MASTER, + 1 => SecurityLevel::CRITICAL, + 2 => SecurityLevel::HIGH, + 3 => SecurityLevel::MEDIUM, + _ => panic!("Invalid security level index: {index}"), + } +} + +#[ferment_macro::export] +pub fn purpose_to_index(purpose: Purpose) -> u8 { + match purpose { + Purpose::AUTHENTICATION => 0, + Purpose::ENCRYPTION => 1, + Purpose::DECRYPTION => 2, + Purpose::TRANSFER => 3, + Purpose::SYSTEM => 4, + Purpose::VOTING => 5, + Purpose::OWNER => 6 + } +} +#[ferment_macro::export] +pub fn purpose_from_index(index: u8) -> Purpose { + match index { + 0 => Purpose::AUTHENTICATION, + 1 => Purpose::ENCRYPTION, + 2 => Purpose::DECRYPTION, + 3 => Purpose::TRANSFER, + 4 => Purpose::SYSTEM, + 5 => Purpose::VOTING, + 6 => Purpose::OWNER, + _ => panic!("Invalid purpose index: {index}"), + } +} + +#[ferment_macro::export] +pub fn key_type_from_opaque_key(opaque_key: OpaqueKey) -> Result { + match opaque_key { + OpaqueKey::ECDSA(_) => Ok(KeyType::ECDSA_SECP256K1), + OpaqueKey::BLS(_) => Ok(KeyType::BLS12_381), + OpaqueKey::ED25519(_) => Ok(KeyType::EDDSA_25519_HASH160) + } +} +#[ferment_macro::export] +pub fn key_kind_from_key_type(key_type: KeyType) -> KeyKind { + match key_type { + KeyType::ECDSA_SECP256K1 | KeyType::ECDSA_HASH160 | KeyType::BIP13_SCRIPT_HASH => KeyKind::ECDSA, + KeyType::BLS12_381 => KeyKind::BLSBasic, + KeyType::EDDSA_25519_HASH160 => KeyKind::ED25519 + } +} +#[ferment_macro::export] +pub fn key_kind_to_key_type_index(kind: KeyKind) -> u8 { + match kind { + KeyKind::ECDSA => 0, + KeyKind::BLS | KeyKind::BLSBasic => 1, + KeyKind::ED25519 => 4, + } +} + +#[ferment_macro::export] +pub fn opaque_key_to_key_type_index(opaque_key: OpaqueKey) -> u8 { + match opaque_key { + OpaqueKey::ECDSA(_) => 0, + OpaqueKey::BLS(_) => 1, + OpaqueKey::ED25519(_) => 4 + } +} diff --git a/dash-spv-platform/src/identity/mod.rs b/dash-spv-platform/src/identity/mod.rs new file mode 100644 index 00000000..37433074 --- /dev/null +++ b/dash-spv-platform/src/identity/mod.rs @@ -0,0 +1,3 @@ +pub mod manager; +pub mod model; +pub mod invitation; \ No newline at end of file diff --git a/dash-spv-platform/src/identity/model.rs b/dash-spv-platform/src/identity/model.rs new file mode 100644 index 00000000..64324c7e --- /dev/null +++ b/dash-spv-platform/src/identity/model.rs @@ -0,0 +1,446 @@ +use std::collections::HashMap; +use dpp::identity::{Identity, IdentityPublicKey}; +use dpp::identity::identity_public_key::{Purpose, SecurityLevel}; +use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; +use dash_spv_crypto::keys::key::KeyKind; +use dash_spv_crypto::keys::{IKey, OpaqueKey}; +use crate::document::usernames::UsernameStatus; +use crate::identity::manager::identity_public_key; + +#[ferment_macro::export] +#[derive(Clone, PartialEq, Eq)] +pub enum IdentityKeyStatus { + Unknown = 0, + Registered = 1, + Registering = 2, + NotRegistered = 3, + Revoked = 4, +} +impl From for IdentityKeyStatus { + fn from(value: u8) -> Self { + match value { + 0 => IdentityKeyStatus::Unknown, + 1 => IdentityKeyStatus::Registered, + 2 => IdentityKeyStatus::Registering, + 3 => IdentityKeyStatus::NotRegistered, + 4 => IdentityKeyStatus::Revoked, + _ => panic!("Invalid value for IdentityKeyStatus {value}"), + } + } +} +impl From<&IdentityKeyStatus> for u8 { + fn from(value: &IdentityKeyStatus) -> Self { + match value { + IdentityKeyStatus::Unknown => 0, + IdentityKeyStatus::Registered => 1, + IdentityKeyStatus::Registering => 2, + IdentityKeyStatus::NotRegistered => 3, + IdentityKeyStatus::Revoked => 4, + } + } +} + +#[ferment_macro::export] +impl IdentityKeyStatus { + pub fn to_index(&self) -> u8 { + u8::from(self) + } + pub fn from_index(index: u8) -> IdentityKeyStatus { + IdentityKeyStatus::from(index) + } + + pub fn string(&self) -> String { + match self { + IdentityKeyStatus::Unknown => "Unknown", + IdentityKeyStatus::Registered => "Registered", + IdentityKeyStatus::Registering => "Registering", + IdentityKeyStatus::NotRegistered => "Not Registered", + IdentityKeyStatus::Revoked => "Revoked", + }.to_string() + } + + pub fn string_description(&self) -> String { + format!("Status of Key or Username is {}", self.string()) + } + + pub fn is_unknown(&self) -> bool { + matches!(self, IdentityKeyStatus::Unknown) + } + pub fn is_registered(&self) -> bool { + matches!(self, IdentityKeyStatus::Registered) + } + pub fn is_registering(&self) -> bool { + matches!(self, IdentityKeyStatus::Registering) + } + pub fn is_not_registered(&self) -> bool { + matches!(self, IdentityKeyStatus::NotRegistered) + } + pub fn is_revoked(&self) -> bool { + matches!(self, IdentityKeyStatus::Revoked) + } +} + + +#[ferment_macro::export] +#[derive(Clone, PartialEq, Eq)] +pub enum IdentityRegistrationStatus { + Unknown = 0, + Registered = 1, + Registering = 2, + NotRegistered = 3, //sent to DAPI, not yet confirmed +} + +impl From for IdentityRegistrationStatus { + fn from(value: u8) -> Self { + match value { + 0 => IdentityRegistrationStatus::Unknown, + 1 => IdentityRegistrationStatus::Registered, + 2 => IdentityRegistrationStatus::Registering, + 3 => IdentityRegistrationStatus::NotRegistered, + _ => panic!("Invalid value for IdentityRegistrationStatus {value}"), + } + } +} +impl From<&IdentityRegistrationStatus> for u8 { + fn from(value: &IdentityRegistrationStatus) -> Self { + match value { + IdentityRegistrationStatus::Unknown => 0, + IdentityRegistrationStatus::Registered => 1, + IdentityRegistrationStatus::Registering => 2, + IdentityRegistrationStatus::NotRegistered => 3, + } + } +} + +#[ferment_macro::export] +impl IdentityRegistrationStatus { + pub fn to_index(&self) -> u8 { + u8::from(self) + } + pub fn from_index(index: u8) -> IdentityRegistrationStatus { + IdentityRegistrationStatus::from(index) + } + pub fn is_unknown(&self) -> bool { + matches!(self, IdentityRegistrationStatus::Unknown) + } + pub fn is_registered(&self) -> bool { + matches!(self, IdentityRegistrationStatus::Registered) + } + pub fn is_registering(&self) -> bool { + matches!(self, IdentityRegistrationStatus::Registering) + } + pub fn is_not_registered(&self) -> bool { + matches!(self, IdentityRegistrationStatus::NotRegistered) + } + + pub fn string(&self) -> String { + match self { + IdentityRegistrationStatus::Unknown => "Unknown", + IdentityRegistrationStatus::Registered => "Registered", + IdentityRegistrationStatus::Registering => "Registering", + IdentityRegistrationStatus::NotRegistered => "Not Registered", + }.to_string() + } +} +#[ferment_macro::export] +#[derive(Clone)] +pub struct KeyInfo { + pub key: OpaqueKey, + pub key_type: KeyKind, + pub key_status: IdentityKeyStatus, + pub security_level: SecurityLevel, + pub purpose: Purpose, +} + +#[ferment_macro::export] +#[derive(Clone)] +pub struct UsernameStatusInfo { + pub proper: Option, + pub domain: Option, + pub status: UsernameStatus, + pub salt: Vec, +} + +impl UsernameStatusInfo { + pub fn with_status(status: UsernameStatus) -> Self { + Self { + proper: None, + domain: None, + status, + salt: vec![], + } + } + pub fn confirmed(&self) -> Self { + let mut s = self.clone(); + s.status = UsernameStatus::Confirmed; + s + } +} +#[ferment_macro::opaque] +pub struct IdentityModel { + pub identity: Option, + pub identity_registration_status: IdentityRegistrationStatus, + pub key_info_dictionaries: HashMap, + pub username_domains: HashMap>, + pub username_salts: HashMap>, + pub username_statuses: HashMap, +} + +#[ferment_macro::export] +impl IdentityModel { + + pub fn new(status: IdentityRegistrationStatus) -> Self { + Self { + identity_registration_status: status, + identity: None, + key_info_dictionaries: Default::default(), + username_domains: Default::default(), + username_salts: Default::default(), + username_statuses: Default::default() + } + } + + pub fn set_registration_status(&mut self, status: IdentityRegistrationStatus) { + self.identity_registration_status = status; + } + pub fn registration_status(&self) -> IdentityRegistrationStatus { + self.identity_registration_status.clone() + } + pub fn registration_status_index(&self) -> u8 { + u8::from(&self.identity_registration_status) + } + pub fn is_registered(&self) -> bool { + self.identity_registration_status == IdentityRegistrationStatus::Registered + } + pub fn set_identity(&mut self, identity: Identity) { + self.identity = Some(identity); + } + pub fn identity(&self) -> Option { + self.identity.clone() + } + + pub fn add_username(&mut self, username: String, domain: String, status: UsernameStatus) { + let full_path = Self::full_path_for_username(&username, &domain); + self.username_statuses.insert(full_path, UsernameStatusInfo { + proper: Some(username), + domain: Some(domain), + status, + salt: Default::default(), + }); + } + pub fn add_username_with_salt(&mut self, username: String, domain: String, status: UsernameStatus, salt: Vec) { + let full_path = Self::full_path_for_username(&username, &domain); + self.username_statuses.insert(full_path, UsernameStatusInfo { + proper: Some(username), + domain: Some(domain), + status, + salt, + }); + } + + pub fn add_key_info(&mut self, index: u32, key_info: KeyInfo) { + self.key_info_dictionaries.insert(index, key_info); + } + + pub fn add_salt(&mut self, username: String, salt: Vec) { + self.username_salts.insert(username, salt); + } + + pub fn salt_for_username(&self, username: &str) -> Option> { + self.username_salts.get(username).cloned() + } + + pub fn full_path_for_username(username: &str, domain: &str) -> String { + username.to_lowercase() + "." + &domain.to_lowercase() + } + + pub fn username_full_paths_with_status(&self, status: UsernameStatus) -> Vec { + self.username_statuses.iter().filter_map(|(full_path, info)| { + if status.eq(&info.status) { + Some(full_path.clone()) + } else { + None + } + }).collect() + } + + pub fn unregistered_username_full_paths(&self) -> Vec { + self.username_full_paths_with_status(UsernameStatus::Initial) + } + pub fn confirmed_username_full_paths(&self) -> Vec { + self.username_full_paths_with_status(UsernameStatus::Confirmed) + } + + pub fn unregistered_username_full_paths_count(&self) -> usize { + self.unregistered_username_full_paths().len() + } + pub fn confirmed_username_full_paths_count(&self) -> usize { + self.confirmed_username_full_paths().len() + } + + pub fn status_of_username(&self, username: &str, domain: &str) -> Option { + self.status_of_username_full_path(Self::full_path_for_username(username, domain)) + } + + pub fn status_of_dashpay_username(&self, username: String) -> Option { + self.status_of_username_full_path(Self::full_path_for_username(&username, "dash")) + } + pub fn status_of_username_full_path(&self, username_full_path: String) -> Option { + self.username_statuses.get(&username_full_path).map(|s| s.status.clone()) + } + pub fn status_index_of_username_full_path(&self, username_full_path: String) -> Option { + self.username_statuses.get(&username_full_path).map(|s| s.status.clone().into()) + } + pub fn status_of_username_full_path_is_initial(&self, username_full_path: String) -> bool { + self.username_statuses.get(&username_full_path).map(|s| s.status == UsernameStatus::Initial).unwrap_or_default() + } + pub fn username_of_username_full_path(&self, username_full_path: &str) -> Option { + self.username_statuses.get(username_full_path).and_then(|s| s.proper.clone()) + } + pub fn domain_of_username_full_path(&self, username_full_path: String) -> Option { + self.username_statuses.get(&username_full_path).and_then(|s| s.domain.clone()) + } + + pub fn dashpay_username_full_paths(&self) -> Vec { + self.username_statuses.keys().cloned().collect() + } + pub fn dashpay_username_count(&self) -> usize { + self.username_statuses.len() + } + pub fn username_statuses(&self) -> HashMap { + self.username_statuses.clone() + } + + pub fn usernames_and_domains(&self, username_full_paths: Vec) -> Vec<(String, String)> { + username_full_paths.iter().filter_map(|username_full_path| { + if let Some(UsernameStatusInfo { proper, domain, .. }) = self.username_statuses.get(username_full_path) { + match (proper, domain) { + (Some(proper), Some(domain)) => Some((proper.clone(), domain.clone())), + _ => None + } + } else { + None + } + }).collect() + } + + pub fn dashpay_usernames(&self) -> Vec { + self.username_statuses.iter().filter_map(|(full_path, _)| self.username_of_username_full_path(full_path)).collect() + } + pub fn first_dashpay_username(&self) -> Option { + self.dashpay_usernames().first().cloned() + } + pub fn has_dashpay_username(&self, username: &str) -> bool { + self.username_statuses.iter().any(|(full_path, _)| { + if let Some(u) = self.username_of_username_full_path(full_path) { + u.eq(username) + } else { + false + } + }) + } + + pub fn set_username_full_paths(&mut self, username_full_paths: Vec, status: UsernameStatus) { + username_full_paths.into_iter().for_each(|full_path | self.set_username_status(full_path, status.clone())); + } + + pub fn set_username_status(&mut self, username_full_path: String, status: UsernameStatus) { + if let Some(status_info) = self.username_statuses.get_mut(&username_full_path) { + status_info.status = status; + } else { + self.username_statuses.insert(username_full_path, UsernameStatusInfo::with_status(status)); + } + } + pub fn set_username_status_confirmed(&mut self, username: String, normalized_parent_domain_name: String, label: String) -> bool { + // TODO: check it (migrated as is, but it maybe wrong) + let full_path_username = Self::full_path_for_username(&username, "dash"); + let maybe_status = self.username_statuses.get(&username); + let is_new = maybe_status.is_none(); + let status_info = if let Some(status_info) = maybe_status { + status_info.confirmed() + } else { + UsernameStatusInfo { + proper: Some(label), + domain: Some(normalized_parent_domain_name), + status: UsernameStatus::Confirmed, + salt: vec![], + } + }; + self.username_statuses.insert(full_path_username, status_info); + is_new + } + pub fn set_username_status_confirmed2(&mut self, username: String, domain: String, lowercase_username: String) -> bool { + // TODO: check it (migrated as is, but it maybe wrong) + let full_path_username = Self::full_path_for_username(&username, &domain); + let maybe_status = self.username_statuses.get(&Self::full_path_for_username(&lowercase_username, &domain)); + let is_new = maybe_status.is_none(); + let status_info = if let Some(status_info) = maybe_status { + status_info.confirmed() + } else { + UsernameStatusInfo { + proper: Some(username), + domain: Some(domain), + status: UsernameStatus::Confirmed, + salt: vec![], + } + }; + self.username_statuses.insert(full_path_username, status_info); + is_new + } + + + pub fn active_key_count(&self) -> usize { + self.key_info_dictionaries.values().filter(|KeyInfo { key_status, .. }| key_status.is_registered()).count() + } + pub fn total_key_count(&self) -> usize { + self.key_info_dictionaries.len() + } + pub fn key_info_dictionaries(&self) -> HashMap { + self.key_info_dictionaries.clone() + } + pub fn registered_key_info_dictionaries(&self) -> HashMap { + self.key_info_dictionaries().into_iter().filter(|(_index, KeyInfo { key_status, ..})| key_status.is_registered()).collect() + } + + pub fn active_keys_for_key_type(&self, kind: KeyKind) -> Vec { + self.key_info_dictionaries.values().filter_map(|info| info.key_type.eq(&kind).then_some(&info.key)).cloned().collect() + } + + pub fn verify_signature(&mut self, signature: Vec, kind: KeyKind, digest: [u8; 32]) -> bool { + for info in self.key_info_dictionaries.values_mut() { + if info.key_type.eq(&kind) { + if let Ok(true) = info.key.verify(&digest, &signature) { + return true; + } + } + } + false + } + + pub fn key_info_at_index(&self, index: u32) -> Option { + self.key_info_dictionaries.get(&index).map(|info| info.clone()) + } + + pub fn status_of_key_at_index(&self, index: u32) -> Option { + self.key_info_dictionaries.get(&index).map(|info| info.key_status.clone()) + } + + pub fn key_at_index(&self, index: u32) -> Option { + self.key_info_dictionaries.get(&index).map(|info| info.key.clone()) + } + + pub fn first_identity_public_key(&self, security_level: SecurityLevel, purpose: Purpose) -> Option { + self.key_info_dictionaries.iter().find_map(|(index, KeyInfo { key, security_level: level, purpose: p, .. })| { + if security_level.eq(level) && purpose.eq(p) { + Some(identity_public_key(*index, key.clone(), security_level, purpose)) + } else { + None + } + }) + } + pub fn has_identity_public_key(&self, key: IdentityPublicKey) -> bool { + self.key_at_index(key.id()) + .map(|opaque_key| opaque_key.public_key_data().eq(key.data().as_slice())) + .unwrap_or_default() + } +} diff --git a/dash-spv-platform/src/lib.rs b/dash-spv-platform/src/lib.rs new file mode 100644 index 00000000..1292c750 --- /dev/null +++ b/dash-spv-platform/src/lib.rs @@ -0,0 +1,1011 @@ +pub mod identity; +pub mod provider; +pub mod signer; +pub mod thread_safe_context; +pub mod error; +pub mod util; +pub mod contract; +pub mod document; +pub mod models; +pub mod query; +pub mod transition; +pub mod cache; + +use std::collections::{BTreeMap, HashMap}; +use std::net::{Ipv4Addr, Ipv6Addr}; +use std::str::FromStr; +use std::sync::Arc; +use dapi_grpc::core::v0::GetTransactionRequest; +use dapi_grpc::platform::v0::get_documents_request::get_documents_request_v0::Start; +use dash_sdk::{dpp, RequestSettings, Sdk, SdkBuilder}; +use dash_sdk::dapi_client::{Address, AddressListError, DapiRequestExecutor}; +use dash_sdk::platform::FetchUnproved; +use dash_sdk::platform::transition::put_contract::PutContract; +use dash_sdk::platform::transition::broadcast::BroadcastStateTransition; +use dash_sdk::platform::transition::put_document::PutDocument; +use dash_sdk::platform::transition::put_identity::PutIdentity; +use dash_sdk::platform::transition::put_settings::PutSettings; +use dash_sdk::platform::types::evonode::EvoNode; +use dash_sdk::sdk::AddressList; +use dashcore::consensus::Decodable; +use dashcore::secp256k1::hashes::hex::DisplayHex; +use dashcore::Transaction; +use data_contracts::SystemDataContract; +use dpp::data_contract::{DataContract, DataContractFacade}; +use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; +use dpp::data_contract::created_data_contract::CreatedDataContract; +use dpp::data_contract::document_type::{DocumentType, DocumentTypeRef}; +use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; +use dpp::data_contracts; +use dpp::errors::ProtocolError; +use dpp::identity::{Identity, IdentityPublicKey, v0::IdentityV0, IdentityFacade, KeyID}; +use dpp::document::Document; +use dpp::document::document_factory::DocumentFactory; +use dpp::identity::core_script::CoreScript; +use dpp::identity::state_transition::asset_lock_proof::AssetLockProof; +use dpp::native_bls::NativeBlsModule; +use dpp::prelude::{BlockHeight, CoreBlockHeight}; +use dpp::serialization::Signable; +use dpp::state_transition::state_transitions::document::batch_transition::batched_transition::document_transition_action_type::DocumentTransitionActionType; +use dpp::state_transition::state_transition_factory::StateTransitionFactory; +use dpp::state_transition::StateTransition; +use dpp::state_transition::state_transitions::identity::public_key_in_creation::IdentityPublicKeyInCreation; +use dpp::state_transition::proof_result::StateTransitionProofResult; +use dpp::withdrawal::Pooling; +use drive::query::{OrderClause, WhereClause}; +use drive_proof_verifier::{ContextProvider, error::ContextProviderError}; +use drive_proof_verifier::types::evonode_status::EvoNodeStatus; +use indexmap::IndexMap; +use platform_value::{BinaryData, Bytes32, Identifier, Value, ValueMap}; +use tokio::runtime::Runtime; +use dash_spv_crypto::crypto::byte_util::Reversed; +use dash_spv_crypto::keys::{IKey, OpaqueKey}; +use dash_spv_crypto::network::ChainType; +use dash_spv_event_bus::DAPIAddressHandler; +use crate::cache::PlatformCache; +use crate::contract::manager::ContractsManager; +use crate::document::contact_request::ContactRequestManager; +use crate::document::manager::DocumentsManager; +use crate::document::salted_domain_hashes::SaltedDomainHashesManager; +use crate::document::usernames::{UsernameStatus, UsernamesManager}; +use crate::error::Error; +use crate::identity::manager::{key_type_from_opaque_key, IdentitiesManager}; +use crate::models::profile::Profile; +use crate::provider::PlatformProvider; +use crate::query::QueryKind; +use crate::signer::CallbackSigner; +use crate::thread_safe_context::FFIThreadSafeContext; + +const DEFAULT_TESTNET_ADDRESS_LIST: [&str; 19] = [ + "34.214.48.68", + // "35.166.18.166", + // "35.165.50.126", + "52.42.202.128", + "52.12.176.90", + // "44.233.44.95", + // "35.167.145.149", + "52.34.144.50", + "44.240.98.102", + "54.201.32.131", + // "52.10.229.11", + "52.13.132.146", + "44.228.242.181", + "35.82.197.197", + // "52.40.219.41", + // "44.239.39.153", + "54.149.33.167", + "35.164.23.245", + "52.33.28.47", + // "52.43.86.231", + "52.43.13.92", + "35.163.144.230", + "52.89.154.48", + "52.24.124.162", + "44.227.137.77", + // "35.85.21.179", + "54.187.14.232", + // "54.68.235.201", + "52.13.250.182", + // "35.82.49.196", + // "44.232.196.6", + // "54.189.164.39", + // "54.213.204.85" +]; +pub const MAINNET_ADDRESS_LIST: [&str; 158] = [ + "149.28.241.190", "216.238.75.46", "134.255.182.186", "66.245.196.52", "178.157.91.186", "157.66.81.162", "213.199.34.250", "157.90.238.161", "5.182.33.231", "185.198.234.68", "37.60.236.212", "207.244.247.40", "45.32.70.131", "158.220.122.76", "52.33.9.172", "185.158.107.124", "185.198.234.17", "93.190.140.101", "194.163.153.225", "194.146.13.7", "93.190.140.112", "75.119.132.2", "65.108.74.95", "44.240.99.214", "5.75.133.148", "192.248.178.237", "95.179.159.65", "139.84.232.129", "37.60.243.119", "194.195.87.34", "46.254.241.7", "45.77.77.195", "65.108.246.145", "64.176.10.71", "158.247.247.241", "37.60.244.220", "2.58.82.231", "139.180.143.115", "185.198.234.54", "213.199.44.112", "37.27.67.154", "134.255.182.185", "86.107.168.28", "139.84.137.143", "173.212.239.124", "157.10.199.77", "5.189.186.78", "139.84.170.10", "173.249.53.139", "37.60.236.151", "37.27.67.159", "104.200.24.196", "37.60.236.225", "172.104.90.249", "57.128.212.163", "37.60.236.249", "158.220.122.74", "185.198.234.25", "148.113.201.221", "134.255.183.250", "185.192.96.70", "134.255.183.248", "52.36.102.91", "134.255.183.247", "49.13.28.255", "168.119.102.10", "86.107.168.44", "49.13.237.193", "37.27.83.17", "134.255.182.187", "142.132.165.149", "193.203.15.209", "38.242.198.100", "192.175.127.198", "37.27.67.163", "79.137.71.84", "198.7.115.43", "70.34.206.123", "163.172.20.205", "65.108.74.78", "108.61.165.170", "157.10.199.79", "31.220.88.116", "185.166.217.154", "37.27.67.164", "31.220.85.180", "161.97.170.251", "157.10.199.82", "91.107.226.241", "167.88.169.16", "216.238.99.9", "62.169.17.112", "52.10.213.198", "149.28.201.164", "198.7.115.38", "37.60.236.161", "49.13.193.251", "46.254.241.9", "65.108.74.75", "192.99.44.64", "95.179.241.182", "95.216.146.18", "185.194.216.84", "31.220.84.93", "185.197.250.227", "149.28.247.165", "86.107.168.29", "213.199.34.251", "108.160.135.149", "185.198.234.12", "87.228.24.64", "45.32.52.10", "91.107.204.136", "64.176.35.235", "167.179.90.255", "157.66.81.130", "157.10.199.125", "46.254.241.8", "49.12.102.105", "134.255.182.189", "81.17.101.141", "65.108.74.79", "64.23.134.67", "54.69.95.118", "158.220.122.13", "49.13.154.121", "75.119.149.9", "93.190.140.111", "93.190.140.114", "195.201.238.55", "135.181.110.216", "45.76.141.74", "65.21.145.147", "50.116.28.103", "188.245.90.255", "130.162.233.186", "65.109.65.126", "188.208.196.183", "178.157.91.184", "37.60.236.201", "95.179.139.125", "213.199.34.248", "178.157.91.178", "213.199.35.18", "213.199.35.6", "37.60.243.59", "37.27.67.156", "37.60.236.247", "159.69.204.162", "46.254.241.11", "173.199.71.83", "185.215.166.126", "91.234.35.132", "157.66.81.218", "213.199.35.15", "114.132.172.215", "93.190.140.162", "65.108.74.109" +]; +fn create_sdk>(provider: C, address_list: T) -> Sdk { + SdkBuilder::new(AddressList::from_iter(address_list)) + .with_context_provider(provider) + .build() + .unwrap() +} + +#[ferment_macro::opaque] +pub struct PlatformSDK { + pub runtime: Arc, + pub chain_type: ChainType, + pub sdk: Arc, + pub cache: Arc, + pub callback_signer: CallbackSigner, + pub identity_manager: Arc, + pub contract_manager: Arc, + pub contact_requests: Arc, + pub salted_domain_hashes: Arc, + pub usernames: Arc, + pub doc_manager: Arc, + + pub identities: IdentityFacade, + pub contracts: DataContractFacade, + pub documents: DocumentFactory, + pub state_transition: StateTransitionFactory, + + // pub platform_client: PlatformGrpcClient +} +pub fn ip_from_bytes(address: [u8; 16]) -> Result { + let addr = if address[..12] == [0; 10].to_vec() && address[10..12] == [0xFF, 0xFF] { + Ipv4Addr::from([address[12], address[13], address[14], address[15]]).to_string() + } else { + Ipv6Addr::from(address).to_string() + }; + + Address::from_str(addr.as_str()) +} + +fn friend_request_value(to_user_id: [u8; 32], created_at: u64, encrypted_extended_public_key_data: Vec, sender_key_index: u32, recipient_key_index: u32, account_reference: u32) -> Value { + Value::Map(Vec::from_iter([ + (Value::Text("$createdAt".to_string()), Value::U64(created_at)), + (Value::Text("toUserId".to_string()), Value::Identifier(to_user_id.into())), + (Value::Text("encryptedPublicKey".to_string()), Value::Bytes(encrypted_extended_public_key_data)), + (Value::Text("senderKeyIndex".to_string()), Value::U32(sender_key_index)), + (Value::Text("recipientKeyIndex".to_string()), Value::U32(recipient_key_index)), + (Value::Text("accountReference".to_string()), Value::U32(account_reference)), + ])) +} + + +impl DAPIAddressHandler for PlatformSDK { + fn add_node(&self, _address: [u8; 16]) { + // if let Ok(address) = ip_from_bytes(address) { + // self.sdk.maybe_dapi_client().map(|dapi| dapi.address_list()) + // self.sdk.maybe_dapi_client().address_list().add(address); + // self.sdk.address_list().add(address); + // } + } + + fn remove_node(&self, _address: [u8; 16]) { + // if let Ok(address) = ip_from_bytes(address) { + // self.sdk.address_list().remove(&address); + // } + } + + fn add_nodes(&self, addresses: Vec<[u8; 16]>) { + addresses.into_iter().for_each(|address| { + self.add_node(address); + }) + } + + fn remove_nodes(&self, addresses: Vec<[u8; 16]>) { + addresses.into_iter().for_each(|address| { + self.remove_node(address); + }) + } +} + +#[macro_export] +macro_rules! query_contract_docs { + ($self:ident, $contract_id:ident, $document_type:ident, $query_variant:ident, $param_name:ident) => {{ + let contract = $self + .contract_manager + .fetch_contract_by_id_error_if_none($contract_id) + .await?; + let query = QueryKind::$query_variant(contract, $document_type, $param_name)?; + $self.doc_manager.documents_with_query(query).await + }}; +} + +#[ferment_macro::export] +impl PlatformSDK { + + pub fn identity_manager(&self) -> Arc { + Arc::clone(&self.identity_manager) + } + pub fn contract_manager(&self) -> Arc { + Arc::clone(&self.contract_manager) + } + pub fn doc_manager(&self) -> Arc { + Arc::clone(&self.doc_manager) + } + pub fn contact_requests(&self) -> Arc { + Arc::clone(&self.contact_requests) + } + pub fn salted_domain_hashes(&self) -> Arc { + Arc::clone(&self.salted_domain_hashes) + } + pub fn usernames(&self) -> Arc { + Arc::clone(&self.usernames) + } + + pub async fn get_status(&self, address: &str) -> Result { + let evo_node = Address::from_str(address) + .map_err(Error::from) + .map(EvoNode::new)?; + EvoNodeStatus::fetch_unproved(&self.sdk, evo_node) + .await + .map_err(Error::from) + .map(|status| status.is_some()) + } + + pub async fn get_transaction_with_hash(&self, hash: [u8; 32]) -> Result { + let request = GetTransactionRequest { id: hash.reversed().to_lower_hex_string() }; + self.sdk.execute(request, RequestSettings::default()).await + .map_err(Error::from) + .map(|response| { + let mut writer: &[u8] = &response.inner.transaction; + let tx = Transaction::consensus_decode(&mut writer); + tx.map_err(Error::from) + })? + // .map(|response| Transaction::consensus_decode(&*response.inner.transaction).map_err(Error::from))? + } + + // pub async fn get_best_block_height(&self) -> Result { + // let request = GetBestBlockHeightRequest {}; + // self.sdk.execute(request, RequestSettings::default()).await + // .map_err(Error::from) + // .map(|response| { + // response.inner.height + // // let mut writer: &[u8] = &response.inner; + // // // let tx = Transaction::consensus_decode(&mut writer); + // // tx.map_err(Error::from) + // })? + // + // } + + pub async fn check_ping_times_for_current_masternode_list(&self) { + + } + pub async fn put_document( + &self, + contract_id: Identifier, + document_type: &str, + document: Document, + identity_public_key: IdentityPublicKey, + block_height: BlockHeight, + core_block_height: CoreBlockHeight + ) -> Result { + let contract = self.contract_manager.fetch_contract_by_id_error_if_none(contract_id).await?; + self.doc_manager.put_document(document, document_type, block_height, core_block_height, contract, identity_public_key, &self.callback_signer).await + } + pub async fn dpns_domain_starts_with(&self, contract_id: Identifier, document_type: &str, starts_with: &str) -> Result>, Error> { + query_contract_docs!(self, contract_id, document_type, dpns_domain, starts_with) + } + pub async fn dpns_domain_by_id(&self, contract_id: Identifier, document_type: &str, unique_id: Identifier) -> Result>, Error> { + query_contract_docs!(self, contract_id, document_type, records_identity, unique_id) + } + pub async fn dpns_usernames(&self, contract_id: Identifier, document_type: &str, usernames: Vec) -> Result>, Error> { + let usernames_ref = &usernames.iter().map(|s| s.as_str()).collect::>(); + // TODO: ferment fails with ['a ['a str]] + query_contract_docs!(self, contract_id, document_type, usernames, usernames_ref) + } + pub async fn find_username(&self, contract_id: Identifier, document_type: &str, starts_with: &str) -> Result>, Error> { + query_contract_docs!(self, contract_id, document_type, dpns_domain, starts_with) + } + + pub async fn publish_contract(&self, contract: DataContract, identity_public_key: IdentityPublicKey) -> Result { + contract.put_to_platform_and_wait_for_response(&self.sdk, identity_public_key, &self.callback_signer, None) + .await + .map_err(Error::from) + } + + // #[cfg(feature = "state-transitions")] + /// Create signed transition + pub fn identity_registration_signed_transition(&self, identity: Identity, proof: AssetLockProof, private_key: OpaqueKey) -> Result { + self.identities.create_identity_create_transition(&identity, proof) + .map_err(Error::from) + .and_then(|transition| + Self::sign_transition(StateTransition::IdentityCreate, transition, private_key)) + } + pub fn identity_registration_signed_transition_with_public_keys(&self, public_keys: BTreeMap, proof: AssetLockProof, private_key: OpaqueKey) -> Result { + self.identities.create_identity_create_transition_using_public_keys(public_keys, proof) + .map_err(Error::from) + .and_then(|(_identity, transition)| + Self::sign_transition(StateTransition::IdentityCreate, transition, private_key)) + } + pub fn identity_registration_signed_transition_with_public_key_at_index(&self, public_key: IdentityPublicKey, index: u32, proof: AssetLockProof, private_key: OpaqueKey) -> Result { + self.identities.create_identity_create_transition_using_public_keys(BTreeMap::from_iter([(index, public_key)]), proof) + .map_err(Error::from) + .and_then(|(_identity, transition)| + Self::sign_transition(StateTransition::IdentityCreate, transition, private_key)) + } + + pub fn identity_topup_signed_transition(&self, identity_id: [u8; 32], proof: AssetLockProof, private_key: OpaqueKey) -> Result { + let transition = self.identities.create_identity_topup_transition(Identifier::from(identity_id), proof) + .map_err(Error::from)?; + Self::sign_transition(StateTransition::IdentityTopUp, transition, private_key) + } + pub fn identity_withdraw_signed_transition(&self, identity_id: [u8; 32], amount: u64, fee: u32, pooling: Pooling, private_key: OpaqueKey, script: Option>, nonce: u64) -> Result { + let transition = self.identities.create_identity_credit_withdrawal_transition(Identifier::from(identity_id), amount, fee, pooling, script.map(CoreScript::from), nonce) + .map_err(Error::from)?; + Self::sign_transition(StateTransition::IdentityCreditWithdrawal, transition, private_key) + } + pub fn identity_update_signed_transition(&self, identity: Identity, nonce: u64, add_public_keys: Option>, disable_key_ids: Option>, private_key: OpaqueKey) -> Result { + let transition = self.identities.create_identity_update_transition(identity, nonce, add_public_keys, disable_key_ids) + .map_err(Error::from)?; + Self::sign_transition(StateTransition::IdentityUpdate, transition, private_key) + } + pub fn identity_transfer_signed_transition(&self, identity: Identity, recipient_id: [u8; 32], amount: u64, nonce: u64, private_key: OpaqueKey) -> Result { + let transition = self.identities.create_identity_credit_transfer_transition(&identity, Identifier::from(recipient_id), amount, nonce) + .map_err(Error::from)?; + Self::sign_transition(StateTransition::IdentityCreditTransfer, transition, private_key) + } + + pub fn data_contract_create_signed_transition(&self, owner_id: [u8; 32], nonce: u64, documents: Value, config: Option, definitions: Option, private_key: OpaqueKey) -> Result { + let created = self.contracts.create(Identifier::from(owner_id), nonce, documents, config, definitions).map_err(Error::from)?; + let transition = self.contracts.create_data_contract_create_transition(created) + .map_err(Error::from)?; + Self::sign_transition(StateTransition::DataContractCreate, transition, private_key) + } + pub fn data_contract_create_signed_transition2(&self, system_contract: SystemDataContract, owner_id: [u8; 32], nonce: u64, private_key: OpaqueKey) -> Result { + let mut data_contract = self.contract_manager().load_system_contract(system_contract); + data_contract.set_owner_id(Identifier::from(owner_id)); + let created = CreatedDataContract::from_contract_and_identity_nonce( + data_contract, + nonce, + self.sdk.version(), + ).map_err(Error::from)?; + let transition = self.contracts.create_data_contract_create_transition(created) + .map_err(Error::from)?; + Self::sign_transition(StateTransition::DataContractCreate, transition, private_key) + } + pub fn data_contract_update_signed_transition(&self, data_contract: DataContract, nonce: u64, private_key: OpaqueKey) -> Result { + let transition = self.contracts.create_data_contract_update_transition(data_contract, nonce) + .map_err(Error::from)?; + Self::sign_transition(StateTransition::DataContractUpdate, transition, private_key) + } + + #[cfg(feature = "state-transitions")] + pub fn document_single_signed_transition( + &self, + action_type: DocumentTransitionActionType, + document_type: DocumentType, + document: Document, + entropy: [u8; 32], + private_key: OpaqueKey + ) -> Result { + let doc_type_ref = document_type.as_ref(); + let documents_iter = IndexMap::>::from_iter([(action_type, vec![(document, doc_type_ref, Bytes32(entropy))])]); + let mut nonce_counter = BTreeMap::<(Identifier, Identifier), u64>::new(); + let transition = self.documents.create_state_transition(documents_iter, &mut nonce_counter) + .map_err(Error::from)?; + Self::sign_transition(StateTransition::Batch, transition, private_key) + } + + #[cfg(feature = "state-transitions")] + pub fn document_single_on_table_signed_transition( + &self, + data_contract: DataContract, + action_type: DocumentTransitionActionType, + table_name: &str, + document: Document, + entropy: [u8; 32], + private_key: OpaqueKey + ) -> Result { + let document_type = data_contract.document_type_for_name(table_name).map_err(Error::from)?; + let documents_iter = IndexMap::>::from_iter([(action_type, vec![(document, document_type, Bytes32(entropy))])]); + let mut nonce_counter = BTreeMap::<(Identifier, Identifier), u64>::new(); + let transition = self.documents.create_state_transition(documents_iter, &mut nonce_counter) + .map_err(Error::from)?; + Self::sign_transition(StateTransition::Batch, transition, private_key) + } + #[cfg(feature = "state-transitions")] + pub fn document_batch_signed_transition<'a>( + &self, + documents: HashMap, Bytes32)>>, + private_key: OpaqueKey, + ) -> Result { + let mut nonce_counter = BTreeMap::<(Identifier, Identifier), u64>::new(); + let transition = self.documents.create_state_transition(documents, &mut nonce_counter) + .map_err(Error::from)?; + Self::sign_transition(StateTransition::Batch, transition, private_key) + } + + /// Publish state transition + pub async fn identity_register(&self, identity: Identity, proof: AssetLockProof, private_key: OpaqueKey) -> Result { + println!("identity_register: {identity:?} -- {proof:?} -- {private_key:?}"); + let signed_transition = self.identity_registration_signed_transition(identity, proof, private_key)?; + self.publish_state_transition(signed_transition).await + } + pub async fn identity_register2(&self, identity: Identity, proof: AssetLockProof, private_key: OpaqueKey) -> Result { + println!("identity_register: {identity:?} -- {proof:?} -- {private_key:?}"); + let maybe_private_key = private_key.convert_opaque_key_to_ecdsa_private_key(&self.chain_type).map_err(Error::KeyError)?; + identity.put_to_platform_and_wait_for_response(self.sdk.as_ref(), proof, &maybe_private_key, &self.callback_signer, Some(PutSettings::default())).await + .map_err(Error::from) + } + + + pub async fn identity_register_using_public_keys(&self, public_keys: BTreeMap, proof: AssetLockProof, private_key: OpaqueKey) -> Result { + println!("identity_register_using_public_keys: {public_keys:?} -- {proof:?} -- {private_key:?}"); + let signed_transition = self.identity_registration_signed_transition_with_public_keys(public_keys, proof, private_key)?; + self.publish_state_transition(signed_transition).await + } + pub async fn identity_register_using_public_key_at_index(&self, public_key: IdentityPublicKey, index: u32, proof: AssetLockProof, private_key: OpaqueKey) -> Result { + println!("identity_register_using_public_key_at_index: {public_key:?} -- {index} -- {proof:?} -- {private_key:?}"); + let signed_transition = self.identity_registration_signed_transition_with_public_key_at_index(public_key, index, proof, private_key)?; + self.publish_state_transition(signed_transition).await + } + pub async fn identity_register_using_public_key_at_index2(&self, public_key: IdentityPublicKey, index: u32, proof: AssetLockProof, private_key: OpaqueKey) -> Result { + println!("identity_register_using_public_key_at_index: {public_key:?} -- {index} -- {proof:?} -- {private_key:?}"); + let maybe_private_key = private_key.convert_opaque_key_to_ecdsa_private_key(&self.chain_type).map_err(Error::KeyError)?; + let identity = Identity::V0(IdentityV0 { + id: proof.create_identifier().map_err(Error::from)?, + public_keys: BTreeMap::from_iter([(index, public_key)]), + balance: 0, + revision: 0, + }); + identity.put_to_platform_and_wait_for_response(self.sdk.as_ref(), proof, &maybe_private_key, &self.callback_signer, Some(PutSettings::default())).await + .map_err(Error::from) + } + + pub async fn identity_topup(&self, identity_id: [u8; 32], proof: AssetLockProof, private_key: OpaqueKey) -> Result { + println!("identity_topup: {} -- {proof:?} -- {private_key:?}", identity_id.to_lower_hex_string()); + let signed_transition = self.identity_topup_signed_transition(identity_id, proof, private_key)?; + self.publish_state_transition(signed_transition).await + } + pub async fn identity_withdraw(&self, identity_id: [u8; 32], amount: u64, fee: u32, pooling: Pooling, private_key: OpaqueKey, script: Option>, nonce: u64) -> Result { + println!("identity_withdraw: {} -- {amount} {fee} {pooling:?} {private_key:?} -- {} -- {nonce}", identity_id.to_lower_hex_string(), script.as_ref().map_or("None".to_string(), |s| s.to_lower_hex_string())); + let signed_transition = self.identity_withdraw_signed_transition(identity_id, amount, fee, pooling, private_key, script, nonce)?; + self.publish_state_transition(signed_transition).await + } + + pub async fn identity_update(&self, identity: Identity, nonce: u64, add_public_keys: Option>, disable_key_ids: Option>, private_key: OpaqueKey) -> Result { + println!("identity_update: {identity:?} -- {nonce} -- {add_public_keys:?} -- {disable_key_ids:?} -- {private_key:?}"); + let signed_transition = self.identity_update_signed_transition(identity, nonce, add_public_keys, disable_key_ids, private_key)?; + self.publish_state_transition(signed_transition).await + } + pub async fn identity_transfer(&self, identity: Identity, recipient_id: [u8; 32], amount: u64, nonce: u64, private_key: OpaqueKey) -> Result { + println!("identity_transfer: {identity:?} -- {} -- {amount} -- {nonce} -- {private_key:?}", recipient_id.to_lower_hex_string()); + let signed_transition = self.identity_transfer_signed_transition(identity, recipient_id, amount, nonce, private_key)?; + self.publish_state_transition(signed_transition).await + } + + pub async fn data_contract_create(&self, owner_id: [u8; 32], nonce: u64, documents: Value, config: Option, definitions: Option, private_key: OpaqueKey) -> Result { + println!("data_contract_create: {} -- {nonce} -- {documents:?} -- {config:?} -- {definitions:?} -- {private_key:?}", owner_id.to_lower_hex_string()); + let signed_transition = self.data_contract_create_signed_transition(owner_id, nonce, documents, config, definitions, private_key)?; + self.publish_state_transition(signed_transition).await + } + pub async fn data_contract_create2(&self, system_contract: SystemDataContract, owner_id: [u8; 32], nonce: u64, private_key: OpaqueKey) -> Result { + println!("data_contract_create2: {system_contract:?} {} -- {nonce} -- {private_key:?} ", owner_id.to_lower_hex_string()); + let signed_transition = self.data_contract_create_signed_transition2(system_contract, owner_id, nonce, private_key)?; + self.publish_state_transition(signed_transition).await + } + pub async fn data_contract_update(&self, data_contract: DataContract, nonce: u64, private_key: OpaqueKey) -> Result { + println!("data_contract_update: {data_contract:?} -- {nonce} -- {private_key:?}"); + let signed_transition = self.data_contract_update_signed_transition(data_contract, nonce, private_key)?; + self.publish_state_transition(signed_transition).await + } + + #[cfg(feature = "state-transitions")] + pub async fn document_single( + &self, + action_type: DocumentTransitionActionType, + document_type: DocumentType, + document: Document, + entropy: [u8; 32], + private_key: OpaqueKey + ) -> Result { + // TODO: switch onto DocumentsBatchTransition::new_document_creation_transition_from_document + // DocumentsBatchTransition::DocumentsBatchTransition::new_document_creation_transition_from_document() + println!("document_single: {action_type:?} -- {document_type:?} -- {document:?} -- {} -- {private_key:?}", entropy.to_lower_hex_string()); + let signed_transition = self.document_single_signed_transition(action_type, document_type, document, entropy, private_key)?; + self.publish_state_transition(signed_transition).await + } + #[cfg(feature = "state-transitions")] + pub async fn document_single2( + &self, + document_type: DocumentType, + document: Document, + entropy: [u8; 32], + identity_public_key: IdentityPublicKey, + ) -> Result { + println!("document_single2: {document_type:?} -- {document:?} -- {}", entropy.to_lower_hex_string()); + document.put_to_platform_and_wait_for_response(self.sdk.as_ref(), document_type, entropy, identity_public_key, &self.callback_signer, Some(PutSettings::default())).await + .map_err(Error::from) + } + + #[cfg(feature = "state-transitions")] + pub async fn document_single_on_table( + &self, + data_contract: DataContract, + action_type: DocumentTransitionActionType, + table_name: &str, + document: Document, + entropy: [u8; 32], + private_key: OpaqueKey + ) -> Result { + println!("document_single_on_table: {data_contract:?} -- {action_type:?} -- {table_name} -- {document:?} -- {} -- {private_key:?}", entropy.to_lower_hex_string()); + let signed_transition = self.document_single_on_table_signed_transition(data_contract, action_type, table_name, document, entropy, private_key)?; + self.publish_state_transition(signed_transition).await + } + + + #[cfg(feature = "state-transitions")] + pub async fn document_batch<'a>( + &self, + documents: HashMap, Bytes32)>>, + private_key: OpaqueKey, + ) -> Result { + println!("document_batch: {documents:?} -- {private_key:?}"); + let signed_transition = self.document_batch_signed_transition(documents, private_key)?; + self.publish_state_transition(signed_transition).await + } + + pub fn friend_request_document( + &self, + contract: DataContract, + identity_id: [u8; 32], + table_name: &str, + created_at: u64, + to_user_id: [u8; 32], + encrypted_extended_public_key_data: Vec, + sender_key_index: u32, + recipient_key_index: u32, + account_reference: u32, + entropy: [u8; 32] + ) -> Result { + let owner_id = Identifier::from(identity_id); + let document_type = contract.document_type_for_name(table_name) + .map_err(Error::from)?; + let dict = friend_request_value(to_user_id, created_at, encrypted_extended_public_key_data, sender_key_index, recipient_key_index, account_reference); + document_type.create_document_from_data(dict, owner_id, 1000, 1000, entropy, self.sdk.version()) + .map_err(Error::from) + } + + pub async fn send_friend_request( + &self, + contract: DataContract, + identity_id: [u8; 32], + created_at: u64, + to_user_id: [u8; 32], + encrypted_extended_public_key_data: Vec, + sender_key_index: u32, + recipient_key_index: u32, + account_reference: u32, + entropy: [u8; 32], + private_key: OpaqueKey + ) -> Result { + let dict = friend_request_value(to_user_id, created_at, encrypted_extended_public_key_data, sender_key_index, recipient_key_index, account_reference); + self.send_friend_request_with_value(contract, identity_id, dict, entropy, private_key).await + } + pub async fn send_friend_request_with_value( + &self, + contract: DataContract, + identity_id: [u8; 32], + value: Value, + entropy: [u8; 32], + private_key: OpaqueKey + ) -> Result { + let document_type = contract.document_type_for_name("contactRequest") + .map_err(ProtocolError::from)?; + let owner_id = Identifier::from(identity_id); + let document = document_type.create_document_from_data(value, owner_id, 1000, 1000, entropy, self.sdk.version()) + .map_err(Error::from)?; + let documents_iter = HashMap::>::from_iter([(DocumentTransitionActionType::Create, vec![(document, document_type, Bytes32(entropy))])]); + let signed_transition = self.document_batch_signed_transition(documents_iter, private_key)?; + self.publish_state_transition(signed_transition).await + } + + pub async fn register_username_domains_for_username_full_paths< + SUC: Fn(*const std::os::raw::c_void, UsernameStatus) + Send + Sync + 'static, + >( + &self, + contract: DataContract, + identity_id: [u8; 32], + username_values: Vec, + entropy: [u8; 32], + private_key: OpaqueKey, + save_context: *const std::os::raw::c_void, + save_callback: SUC, + ) -> Result { + let document_type = contract.document_type_for_name("domain") + .map_err(ProtocolError::from)?; + let owner_id = Identifier::from(identity_id); + let mut documents = HashMap::>::new(); + for value in username_values.into_iter() { + let document = document_type.create_document_from_data(value, owner_id, 1000, 1000, entropy, self.sdk.version()) + .map_err(Error::from)?; + documents.insert(DocumentTransitionActionType::Create, vec![(document, document_type, Bytes32(entropy))]); + } + let signed_transition = self.document_batch_signed_transition(documents, private_key)?; + self.publish_state_transition(signed_transition).await + .map(|result| { + save_callback(save_context, UsernameStatus::Confirmed); + result + }) + } + + pub async fn register_preordered_salted_domain_hashes_for_username_full_paths< + SUC: Fn(*const std::os::raw::c_void, UsernameStatus) + Send + Sync + 'static, + >( + &self, + contract: DataContract, + identity_id: [u8; 32], + salted_domain_hashes: Vec>, + entropy: [u8; 32], + private_key: OpaqueKey, + save_context: *const std::os::raw::c_void, + save_callback: SUC, + ) -> Result { + let document_type = contract.document_type_for_name("preorder") + .map_err(ProtocolError::from)?; + let owner_id = Identifier::from(identity_id); + let mut documents = HashMap::>::new(); + for salted_domain_hash in salted_domain_hashes.into_iter() { + let map = ValueMap::from_iter([(Value::Text("saltedDomainHash".to_string()), Value::Bytes(salted_domain_hash))]); + let document = document_type.create_document_from_data(Value::Map(map), owner_id, 1000, 1000, entropy, self.sdk.version()) + .map_err(Error::from)?; + documents.insert(DocumentTransitionActionType::Create, vec![(document, document_type, Bytes32(entropy))]); + } + + let signed_transition = self.document_batch_signed_transition(documents, private_key)?; + save_callback(save_context, UsernameStatus::PreorderRegistrationPending); + + self.publish_state_transition(signed_transition).await + .map(|result| { + save_callback(save_context, UsernameStatus::Preordered); + result + }) + } + + pub async fn register_preordered_salted_domain_hash_for_username_full_path( + &self, + contract: DataContract, + identity_id: [u8; 32], + identity_public_key: IdentityPublicKey, + salted_domain_hash: Vec, + entropy: [u8; 32] + ) -> Result { + println!("register_preordered_salted_domain_hash_for_username_full_path: {} -- {identity_public_key:?} -- {} -- {}", identity_id.to_lower_hex_string(), salted_domain_hash.to_lower_hex_string(), entropy.to_lower_hex_string()); + let map = Value::Map(ValueMap::from_iter([(Value::Text("saltedDomainHash".to_string()), Value::Bytes(salted_domain_hash))])); + let document_type = contract.document_type_for_name("preorder") + .map_err(Error::from)?; + let document = document_type.create_document_from_data(map, Identifier::from(identity_id), 0, 0, entropy, self.sdk.version()) + .map_err(Error::from)?; + self.document_single2(document_type.to_owned_document_type(), document, entropy, identity_public_key).await + } + + // pub async fn register_preordered_salted_domain_hashes_for_username_full_paths2< + // SUC: Fn(*const std::os::raw::c_void, UsernameStatus) + Send + Sync + 'static, + // >( + // &self, + // contract: DataContract, + // identity_id: [u8; 32], + // salted_domain_hashes: Vec>, + // entropy: [u8; 32], + // private_key: OpaqueKey, + // save_context: *const std::os::raw::c_void, + // save_callback: SUC, + // ) -> Result { + // let document_type = contract.document_type_for_name("preorder") + // .map_err(ProtocolError::from)?; + // let owner_id = Identifier::from(identity_id); + // let mut documents = HashMap::>::new(); + // for salted_domain_hash in salted_domain_hashes.into_iter() { + // let map = Value::Map(ValueMap::from_iter([(Value::Text("saltedDomainHash".to_string()), Value::Bytes(salted_domain_hash))])); + // let document = document_type.create_document_from_data(map, owner_id, 0, 0, entropy, self.sdk.version()) + // .map_err(Error::from)?; + // documents.insert(DocumentTransitionActionType::Create, vec![(document, document_type, Bytes32(entropy))]); + // } + // + // Document::put_to_platform_and_wait_for_response(self.sdk.as_ref(), ) + // + // let signed_transition = self.document_batch_signed_transition(documents, private_key)?; + // save_callback(save_context, UsernameStatus::PreorderRegistrationPending); + // + // self.publish_state_transition(signed_transition).await + // .map(|result| { + // save_callback(save_context, UsernameStatus::Preordered); + // result + // }) + // + // // document.put_to_platform_and_wait_for_response(self.sdk.as_ref(), document_type, entropy, identity_public_key, &self.callback_signer, Some(PutSettings::default())).await + // // .map_err(Error::from) + // + // } + + pub async fn sign_and_publish_profile( + &self, + contract: DataContract, + identity_id: [u8; 32], + profile: Profile, + entropy: [u8; 32], + document_id: Option<[u8; 32]>, + private_key: OpaqueKey + ) -> Result { + let document_type = contract.document_type_for_name("profile") + .map_err(ProtocolError::from)?; + let owner_id = Identifier::from(identity_id); + let document = match document_id { + None => + document_type.create_document_from_data(profile.to_value(), owner_id, 1000, 1000, entropy, self.sdk.version()), + Some(document_id) => + document_type.create_document_with_prevalidated_properties(Identifier::from(document_id), owner_id, 1000, 1000, profile.to_prevalidated_properties(), self.sdk.version()), + }.map_err(Error::from)?; + let documents_iter = HashMap::>::from_iter([(DocumentTransitionActionType::Create, vec![(document, document_type, Bytes32(entropy))])]); + let signed_transition = self.document_batch_signed_transition(documents_iter, private_key)?; + self.publish_state_transition(signed_transition).await + } + + // pub async fn check_ping_times(&self, masternodes: Vec) -> Result { + // self.sdk_ref() + // .execute(GetStatusRequest::default(), RequestSettings::default()) + // } +} + + +impl PlatformSDK { + pub fn new< + QP: Fn(u32, [u8; 32], u32) -> Result<[u8; 48], ContextProviderError> + Send + Sync + 'static, + DC: Fn(*const std::os::raw::c_void, Identifier) -> Result>, ContextProviderError> + Send + Sync + 'static, + AH: Fn(*const std::os::raw::c_void) -> Result + Send + Sync + 'static, + CS: Fn(*const std::os::raw::c_void, &IdentityPublicKey, Vec) -> Result + Send + Sync + 'static, + CCS: Fn(*const std::os::raw::c_void, &IdentityPublicKey) -> bool + Send + Sync + 'static, + >( + cache: Arc, + get_quorum_public_key: Arc, + get_data_contract: DC, + get_platform_activation_height: AH, + callback_signer: CS, + callback_can_sign: CCS, + address_list: Option>, + chain_type: ChainType, + context: *const std::os::raw::c_void, + ) -> Self { + let context_arc = Arc::new(FFIThreadSafeContext::new(context)); + + let host_list = address_list.unwrap_or(match &chain_type { + ChainType::MainNet => Vec::from_iter(MAINNET_ADDRESS_LIST), + _ => Vec::from_iter(DEFAULT_TESTNET_ADDRESS_LIST), + }); + let provider = PlatformProvider::new(get_quorum_public_key, get_data_contract, get_platform_activation_height, context_arc.clone()); + let sdk = create_sdk(provider, host_list.iter().filter_map(|s| Address::from_str(format!("https://{s}:{}", chain_type.platform_port()).as_str()).ok())); + + let protocol_version = sdk.version().protocol_version; + let sdk_arc = Arc::new(sdk); + Self { + cache, + identity_manager: Arc::new(IdentitiesManager::new(&sdk_arc, chain_type.clone())), + contract_manager: Arc::new(ContractsManager::new(&sdk_arc, chain_type.clone())), + doc_manager: Arc::new(DocumentsManager::new(&sdk_arc, chain_type.clone())), + contact_requests: Arc::new(ContactRequestManager::new(&sdk_arc, chain_type.clone())), + salted_domain_hashes: Arc::new(SaltedDomainHashesManager::new(&sdk_arc, chain_type.clone())), + usernames: Arc::new(UsernamesManager::new(&sdk_arc, chain_type.clone())), + runtime: Arc::new(Runtime::new().unwrap()), + callback_signer: CallbackSigner::new(callback_signer, callback_can_sign, context_arc), + identities: IdentityFacade::new(protocol_version), + contracts: DataContractFacade::new(protocol_version).unwrap(), + state_transition: StateTransitionFactory {}, + documents: DocumentFactory::new(protocol_version).unwrap(), + chain_type, + sdk: sdk_arc + } + } + + + + pub async fn fetch_documents( + &self, + contract_id: Identifier, + document_type: &str, + where_clauses: Vec, + order_clauses: Vec, + limit: u32, + start: Option + ) -> Result>, Error> { + let contract = self.contract_manager.fetch_contract_by_id_error_if_none(contract_id).await?; + let query = QueryKind::generic(contract, document_type, where_clauses, order_clauses, limit, start)?; + self.doc_manager.documents_with_query(query).await + } + + fn sign_transition StateTransition>(f: F, transition: T, private_key: OpaqueKey) -> Result { + let private_key_data = private_key.private_key_data().map_err(Error::KeyError)?; + let mut state_transition = f(transition); + let data = state_transition.signable_bytes().map_err(Error::from)?; + let key_type = key_type_from_opaque_key(private_key).map_err(Error::KeyError)?; + println!("transition signable bytes: {}", data.to_lower_hex_string()); + state_transition.sign_by_private_key(&private_key_data, key_type, &NativeBlsModule).map_err(Error::from)?; + println!("transition signature: {}", state_transition.signature().0.to_lower_hex_string()); + Ok(state_transition) + } + + async fn publish_state_transition(&self, transition: StateTransition) -> Result { + println!("publish_state_transition: {:?}", transition); + transition.broadcast_and_wait(&self.sdk, None).await.map_err(Error::from) + } +} + +// pub fn identity_contract_bounds(id: Identifier, contract_identifier: Option) -> Result { +// let mut rng = rand::rngs::StdRng::from_entropy(); +// let ipk1 = IdentityPublicKeyV0::random_ecdsa_master_authentication_key_with_rng(1, &mut rng, LATEST_PLATFORM_VERSION)?.0; +// let ipk2 = IdentityPublicKeyV0::random_ecdsa_master_authentication_key_with_rng(1, &mut rng, LATEST_PLATFORM_VERSION)?.0; +// let public_keys = BTreeMap::from_iter([(1, IdentityPublicKey::V0( +// IdentityPublicKeyV0 { +// id: ipk1.id(), +// purpose: Purpose::AUTHENTICATION, +// security_level: SecurityLevel::MASTER, +// contract_bounds: contract_identifier.map(|id| ContractBounds::SingleContract { id }), +// key_type: KeyType::ECDSA_SECP256K1, +// read_only: false, +// data: ipk1.data().clone(), +// disabled_at: Some(1) +// } +// )), (2, IdentityPublicKey::V0( +// IdentityPublicKeyV0 { +// id: ipk2.id(), +// purpose: Purpose::AUTHENTICATION, +// security_level: SecurityLevel::MASTER, +// contract_bounds: contract_identifier.map(|id| ContractBounds::SingleContract { id }), +// key_type: KeyType::ECDSA_SECP256K1, +// read_only: ipk2.read_only(), +// data: ipk2.data().clone(), +// disabled_at: Some(1) +// } +// ))]); +// Ok(Identity::V0(IdentityV0 { id, public_keys, balance: 2, revision: 1 })) +// } + +// #[tokio::test] +// async fn test_mainnet_get_identities_for_wallets_public_keys() { +// async fn mainnet_get_identities_for_wallets_public_keys() -> Result>, Error> { +// let key_hashes = +// [[56, 130, 69, 49, 128, 208, 91, 105, 110, 162, 39, 35, 66, 49, 38, 28, 133, 213, 133, 252], [91, 201, 141, 60, 109, 100, 243, 8, 136, 121, 118, 100, 169, 165, 198, 96, 228, 231, 76, 164], [238, 40, 164, 26, 84, 158, 90, 227, 77, 165, 195, 121, 94, 23, 24, 160, 173, 14, 21, 48], [102, 22, 141, 109, 43, 97, 177, 93, 105, 200, 103, 76, 134, 17, 198, 209, 120, 167, 71, 53], [59, 216, 144, 232, 223, 201, 28, 131, 40, 174, 25, 104, 227, 51, 26, 85, 54, 46, 98, 114]]; +// +// let context_arc = Arc::new(FFIThreadSafeContext::new(std::ptr::null())); +// let get_data_contract = |ctx, identifier| { +// println!("get_data_contract: {:?}", identifier); +// Err(ContextProviderError::Generic("DDDDD".to_string())) +// }; +// let get_quorum_public_key = |ctx, quorum_type, quorum_hash, core_chain_locked_height| { +// println!("get_quorum_public_key: {:?} {:?} {}", quorum_type, quorum_hash, core_chain_locked_height); +// Err(ContextProviderError::Generic("DDDDD".to_string())) +// }; +// let get_platform_activation_height = |ctx| { +// println!("get_platform_activation_height"); +// Ok(0) +// }; +// // let masternode_provider = Arc::new(MasternodeProvider::new()); +// let address_list = Vec::from_iter(MAINNET_ADDRESS_LIST.iter().filter_map(|s| Address::from_str(format!("https://{s}:443").as_str()).ok())); +// let sdk = create_sdk( +// PlatformProvider::new(get_quorum_public_key, get_data_contract, get_platform_activation_height, context_arc.clone()), address_list); +// +// let sdk_arc = Arc::new(sdk); +// let manager = IdentitiesManager::new(&sdk_arc); +// let key_hashes = BTreeMap::from_iter([("fcd1b9a4fc61468a".to_string(), key_hashes.to_vec())]); +// manager.get_identities_for_wallets_public_keys(key_hashes).await +// } +// +// match mainnet_get_identities_for_wallets_public_keys().await { +// Ok(result) => { +// println!("Ok: {:?}", result); +// }, +// Err(err) => { +// println!("Error: {:?}", err); +// } +// } +// } + +// fn values_to_documents<'a>(document_type: DocumentTypeRef<'a>, identity_id: [u8; 32], entropy: [u8; 32], values: Vec, version: &'a PlatformVersion) -> Result, Bytes32)>>, Error> { +// let owner_id = Identifier::from(identity_id); +// let mut documents = IndexMap::>::new(); +// for value in values.into_iter() { +// let document = document_type.create_document_from_data(value, owner_id, 1000, 1000, entropy, version) +// .map_err(Error::from)?; +// documents.insert(DocumentTransitionActionType::Create, vec![(document, document_type, Bytes32(entropy))]); +// } +// Ok(documents) +// } + +// asdtwotwooct +#[cfg(test)] +fn create_test_sdk(chain: &ChainType) -> Sdk { + let address_list = match chain { + ChainType::MainNet => Vec::from_iter(MAINNET_ADDRESS_LIST.iter().filter_map(|s| Address::from_str(format!("https://{s}:443").as_str()).ok())), + _ => Vec::from_iter(DEFAULT_TESTNET_ADDRESS_LIST.iter().filter_map(|s| Address::from_str(format!("https://{s}:1443").as_str()).ok())), + }; + let context_arc = Arc::new(FFIThreadSafeContext::new(std::ptr::null())); + let get_data_contract = |_ctx, identifier| { + println!("get_data_contract: {:?}", identifier); + Err(ContextProviderError::Generic("DDDDD".to_string())) + }; + let get_quorum_public_key = |quorum_type, quorum_hash, core_chain_locked_height| { + println!("get_quorum_public_key: {:?} {:?} {}", quorum_type, quorum_hash, core_chain_locked_height); + Err(ContextProviderError::Generic("DDDDD".to_string())) + }; + let get_platform_activation_height = |_ctx| { + println!("get_platform_activation_height"); + Ok(0) + }; + create_sdk( + PlatformProvider::new( + Arc::new(get_quorum_public_key), + get_data_contract, + get_platform_activation_height, + context_arc.clone()), + address_list) +} +#[tokio::test] +async fn search_identity_by_name() { + use dpp::system_data_contracts::SystemDataContract; + use dash_sdk::platform::DocumentQuery; + let chain = ChainType::TestNet; + let sdk = create_test_sdk(&chain); + let contract_id = SystemDataContract::DPNS.id(); + let sdk_arc = Arc::new(sdk); + let query = DocumentQuery::new_with_data_contract_id(&sdk_arc, contract_id, "domain"); + // let domain = "dash"; + // let name = "asdtwotwooct"; + + let doc_manager = DocumentsManager::new(&sdk_arc, chain); + + match doc_manager.documents_with_query(query.await.unwrap()).await { + Ok(result) => { + println!("Ok: {:?}", result); + } + Err(err) => { + println!("Error: {:?}", err); + } + } + +} + +#[tokio::test] +async fn test_testnet_get_identities_for_wallets_public_keys() { + async fn testnet_get_identities_for_wallets_public_keys() -> Result>, Error> { + use dashcore::hashes::hex::FromHex; + // let key_hashes = + // [[61, 109, 200, 109, 172, 74, 46, 253, 71, 179, 136, 237, 252, 103, 3, 212, 243, 105, 230, 114], + // [138, 75, 20, 232, 201, 81, 135, 207, 206, 176, 233, 200, 155, 226, 11, 43, 69, 218, 235, 100], + // [212, 176, 162, 172, 173, 243, 14, 168, 196, 178, 235, 214, 97, 221, 188, 170, 146, 133, 186, 213], + // [36, 251, 54, 207, 245, 49, 18, 218, 112, 196, 174, 195, 166, 228, 199, 177, 71, 79, 183, 61], + // [131, 183, 222, 165, 235, 186, 250, 74, 70, 87, 236, 55, 208, 136, 178, 181, 212, 249, 106, 16]]; + let key_hashes = [ + [136, 226, 186, 122, 129, 233, 109, 32, 43, 42, 239, 97, 31, 1, 255, 200, 185, 184, 56, 243], + [50, 184, 144, 250, 181, 179, 124, 121, 215, 190, 42, 190, 227, 83, 233, 235, 186, 187, 0, 247], + [103, 161, 254, 195, 162, 50, 221, 58, 95, 177, 230, 64, 95, 145, 13, 191, 220, 175, 42, 168], + [31, 35, 161, 72, 134, 75, 216, 179, 146, 121, 99, 172, 8, 156, 166, 97, 237, 81, 145, 39], + [147, 219, 37, 98, 100, 110, 242, 176, 147, 244, 166, 220, 109, 201, 44, 116, 87, 82, 118, 1] + ]; + + let context_arc = Arc::new(FFIThreadSafeContext::new(std::ptr::null())); + let get_data_contract = |_ctx, identifier| { + println!("get_data_contract: {:?}", identifier); + Err(ContextProviderError::Generic("get_data_contract: DDDDD".to_string())) + }; + let get_quorum_public_key = Arc::new(|quorum_type: u32, quorum_hash: [u8; 32], core_chain_locked_height: u32| { + println!("get_quorum_public_key: {:?} {:?} {}", quorum_type, quorum_hash.to_lower_hex_string(), core_chain_locked_height); + Ok(<[u8; 48]>::from_hex("90bfc37734097f59401a45554a7ddcf0e846e333b74bcd70c8f973a3d932697bdaf5671d0e4a4961a7d2c9a853833429").unwrap()) + }); + let get_platform_activation_height = |_ctx| { + println!("get_platform_activation_height"); + Ok(0) + }; + // let address_list = Vec::from_iter(DEFAULT_TESTNET_ADDRESS_LIST.iter().filter_map(|s| Address::from_str(s).ok())); + let address_list = Vec::from_iter(DEFAULT_TESTNET_ADDRESS_LIST.iter().filter_map(|s| Address::from_str(format!("https://{s}:1443").as_str()).ok())); + + let sdk = create_sdk( + PlatformProvider::new(get_quorum_public_key, get_data_contract, get_platform_activation_height, context_arc.clone()), address_list); + + let sdk_arc = Arc::new(sdk); + let manager = IdentitiesManager::new(&sdk_arc, ChainType::TestNet); + let key_hashes = BTreeMap::from_iter([("e092d129ef12bb99".to_string(), key_hashes.to_vec())]); + manager.get_identities_for_wallets_public_keys(key_hashes).await + } + + match testnet_get_identities_for_wallets_public_keys().await { + Ok(result) => { + println!("Ok: {:?}", result); + }, + Err(err) => { + println!("Error: {:?}", err); + } + } +} \ No newline at end of file diff --git a/dash-spv-platform/src/models/contact_request.rs b/dash-spv-platform/src/models/contact_request.rs new file mode 100644 index 00000000..4c65ac91 --- /dev/null +++ b/dash-spv-platform/src/models/contact_request.rs @@ -0,0 +1,78 @@ +use dpp::document::{Document, DocumentV0Getters}; +use platform_value::Value; +use crate::error::Error; + +#[derive(Clone, Debug)] +#[ferment_macro::export] +pub enum ContactRequestKind { + Incoming(ContactRequest), + Outgoing(ContactRequest), +} + +#[derive(Clone, Debug)] +#[ferment_macro::export] +pub struct ContactRequest { + pub id: [u8; 32], + pub owner_id: [u8; 32], + pub recipient: [u8; 32], + pub encrypted_account_label: Option>, + pub encrypted_public_key: Vec, + pub account_reference: u32, + pub sender_key_index: u32, + pub recipient_key_index: u32, + pub created_at: u64, +} + +impl TryFrom for ContactRequest { + type Error = Error; + + fn try_from(value: Document) -> Result { + let id = value.id().to_buffer(); + let owner_id = value.owner_id().to_buffer(); + let created_at = value.created_at() + .ok_or(Error::DashSDKError("created_at not present".to_string()))?; + let props = value.properties_consumed(); + let recipient = if let Some(Value::Identifier(val)) = props.get("toUserId") { + val.clone() + } else { + return Err(Error::DashSDKError("toUserId not present".to_string())); + }; + let encrypted_account_label = if let Some(Value::Bytes(val)) = props.get("encryptedAccountLabel") { + Some(val.clone()) + } else { + None + }; + let encrypted_public_key = if let Some(Value::Bytes(val)) = props.get("encryptedPublicKey") { + val.clone() + } else { + return Err(Error::DashSDKError("encryptedPublicKey not present".to_string())); + }; + let account_reference = if let Some(Value::U32(val)) = props.get("accountReference") { + *val + } else { + 0 + }; + let sender_key_index = if let Some(Value::U32(val)) = props.get("senderKeyIndex") { + *val + } else { + return Err(Error::DashSDKError("senderKeyIndex not present".to_string())); + }; + let recipient_key_index = if let Some(Value::U32(val)) = props.get("recipientKeyIndex") { + *val + } else { + return Err(Error::DashSDKError("recipientKeyIndex not present".to_string())); + }; + Ok(ContactRequest { + id, + owner_id, + recipient, + encrypted_account_label, + encrypted_public_key, + account_reference, + sender_key_index, + recipient_key_index, + created_at, + }) + } +} + diff --git a/dash-spv-platform/src/models/contract.rs b/dash-spv-platform/src/models/contract.rs new file mode 100644 index 00000000..23ef8c14 --- /dev/null +++ b/dash-spv-platform/src/models/contract.rs @@ -0,0 +1,46 @@ +use dpp::data_contract::DataContract; +use dash_spv_crypto::network::ChainType; + +#[derive(Clone, Debug)] +#[ferment_macro::export] +pub enum ContractState { + Unknown, + NotRegistered, + Registered, + Registering, +} + +#[derive(Clone, Debug)] +#[ferment_macro::opaque] +pub struct ContractContext { + pub wallet_id: String, +} + + +#[derive(Clone, Debug)] +#[ferment_macro::export] +pub struct ContractModel { + pub chain_type: ChainType, + pub data_contract: DataContract, + pub state: ContractState, + pub local_identifier: String, +} + +// impl ContractModel { +// pub fn system(contract: SystemDataContract, version: &PlatformVersion, chain_type: ChainType) -> Result { +// load_system_data_contract(contract, version).map(|loaded| Self { +// data_contract: loaded, +// // state: ContractState::Unknown, +// chain_type, +// local_identifier: format!("{}_CONTRACT-{}", match contract { +// SystemDataContract::Withdrawals => "Withdrawals", +// SystemDataContract::MasternodeRewards => "MasternodeRewards", +// SystemDataContract::FeatureFlags => "FeatureFlags", +// SystemDataContract::DPNS => "DPNS", +// SystemDataContract::Dashpay => "Dashpay", +// SystemDataContract::WalletUtils => "WalletUtils" +// }, chain_type.unique_id()) +// }) +// } +// } +// diff --git a/dash-spv-platform/src/models/identity.rs b/dash-spv-platform/src/models/identity.rs new file mode 100644 index 00000000..6174c43f --- /dev/null +++ b/dash-spv-platform/src/models/identity.rs @@ -0,0 +1,17 @@ +// use dpp::identity::Identity; +// use crate::models::transient_dashpay_user::TransientDashPayUser; +// +// +// #[derive(Clone, Debug)] +// #[ferment_macro::opaque] +// pub struct IdentityContext { +// pub wallet_id: String, +// } +// +// #[derive(Clone, Debug)] +// #[ferment_macro::export] +// pub struct IdentityModel { +// pub context: IdentityContext, +// pub identity: Identity, +// pub transient_dash_pay_user: Option +// } \ No newline at end of file diff --git a/dash-spv-platform/src/models/mod.rs b/dash-spv-platform/src/models/mod.rs new file mode 100644 index 00000000..edbd51f8 --- /dev/null +++ b/dash-spv-platform/src/models/mod.rs @@ -0,0 +1,8 @@ +pub mod transient_dashpay_user; +pub mod potential_oneway_friendship; +pub mod potential_contact; +pub mod contract; +pub mod contact_request; +pub mod identity; +pub mod profile; + diff --git a/dash-spv-platform/src/models/potential_contact.rs b/dash-spv-platform/src/models/potential_contact.rs new file mode 100644 index 00000000..cad95312 --- /dev/null +++ b/dash-spv-platform/src/models/potential_contact.rs @@ -0,0 +1,63 @@ +use std::collections::BTreeMap; +use platform_value::Identifier; +use dash_spv_crypto::keys::OpaqueKey; + +pub struct PotentialContact { + pub username: String, + pub display_name: String, + pub avatar_path: String, + pub public_message: String, + pub associated_identity_unique_id: Option, + + pub key_dictionary: BTreeMap, +} + +impl PotentialContact { + pub fn with_username(username: String) -> Self { + Self { + username, + display_name: String::new(), + avatar_path: String::new(), + public_message: String::new(), + associated_identity_unique_id: None, + key_dictionary: BTreeMap::new(), + } + } + pub fn with_username_avatar_path_and_public_message( + username: String, + avatar_path: String, + public_message: String + ) -> Self { + Self { + username, + display_name: String::new(), + avatar_path, + public_message, + associated_identity_unique_id: None, + key_dictionary: BTreeMap::new(), + } + } + pub fn from_entity( + username: String, + avatar_path: String, + public_message: String, + associated_identity_unique_id: Identifier + ) -> Self { + Self { + username, + display_name: String::new(), + avatar_path, + public_message, + associated_identity_unique_id: Some(associated_identity_unique_id), + key_dictionary: BTreeMap::new(), + } + } + pub fn add_public_key(&mut self, key: OpaqueKey, index: u32) { + self.key_dictionary.insert(index, key); + } + + pub fn public_key_at_index(&self, index: u32) -> Option<&OpaqueKey> { + self.key_dictionary.get(&index) + } + +} \ No newline at end of file diff --git a/dash-spv-platform/src/models/potential_oneway_friendship.rs b/dash-spv-platform/src/models/potential_oneway_friendship.rs new file mode 100644 index 00000000..958d88d4 --- /dev/null +++ b/dash-spv-platform/src/models/potential_oneway_friendship.rs @@ -0,0 +1,3 @@ +pub struct PotentialOneWayFriendship { + +} \ No newline at end of file diff --git a/dash-spv-platform/src/models/profile.rs b/dash-spv-platform/src/models/profile.rs new file mode 100644 index 00000000..006213e3 --- /dev/null +++ b/dash-spv-platform/src/models/profile.rs @@ -0,0 +1,69 @@ +use std::collections::BTreeMap; +use platform_value::{Value, ValueMap}; + +#[derive(Clone)] +#[ferment_macro::export] +pub struct Profile { + pub updated_at: u64, + pub created_at: u64, + pub revision: u64, + pub public_message: Option, + pub avatar_url: Option, + pub avatar_fingerprint: Option>, + pub avatar_hash: Option>, + pub display_name: Option, +} + +impl Profile { + pub fn to_value(&self) -> Value { + let mut props = ValueMap::new(); + props.push((Value::Text("$updatedAt".to_string()), Value::U64(self.updated_at))); + if self.created_at == self.updated_at { + props.push((Value::Text("$createdAt".to_string()), Value::U64(self.created_at))); + } else { + props.push((Value::Text("$revision".to_string()), Value::U64(self.revision))); + } + if let Some(ref public_message) = self.public_message { + props.push((Value::Text("publicMessage".to_string()), Value::Text(public_message.clone()))); + } + if let Some(ref avatar_url) = self.avatar_url { + props.push((Value::Text("avatarUrl".to_string()), Value::Text(avatar_url.clone()))); + } + if let Some(ref avatar_fingerprint) = self.avatar_fingerprint { + props.push((Value::Text("avatarFingerprint".to_string()), Value::Bytes(avatar_fingerprint.clone()))); + } + if let Some(ref avatar_hash) = self.avatar_hash { + props.push((Value::Text("avatarHash".to_string()), Value::Bytes(avatar_hash.clone()))); + } + if let Some(ref display_name) = self.display_name { + props.push((Value::Text("displayName".to_string()), Value::Text(display_name.clone()))); + } + Value::Map(props) + } + + pub fn to_prevalidated_properties(&self) -> BTreeMap { + let mut props = BTreeMap::new(); + props.insert("$updatedAt".to_string(), Value::U64(self.updated_at)); + if self.created_at == self.updated_at { + props.insert("$createdAt".to_string(), Value::U64(self.created_at)); + } else { + props.insert("$revision".to_string(), Value::U64(self.revision)); + } + if let Some(ref public_message) = self.public_message { + props.insert("publicMessage".to_string(), Value::Text(public_message.clone())); + } + if let Some(ref avatar_url) = self.avatar_url { + props.insert("avatarUrl".to_string(), Value::Text(avatar_url.clone())); + } + if let Some(ref avatar_fingerprint) = self.avatar_fingerprint { + props.insert("avatarFingerprint".to_string(), Value::Bytes(avatar_fingerprint.clone())); + } + if let Some(ref avatar_hash) = self.avatar_hash { + props.insert("avatarHash".to_string(), Value::Bytes(avatar_hash.clone())); + } + if let Some(ref display_name) = self.display_name { + props.insert("displayName".to_string(), Value::Text(display_name.clone())); + } + props + } +} \ No newline at end of file diff --git a/dash-spv-platform/src/models/transient_dashpay_user.rs b/dash-spv-platform/src/models/transient_dashpay_user.rs new file mode 100644 index 00000000..c663fbb5 --- /dev/null +++ b/dash-spv-platform/src/models/transient_dashpay_user.rs @@ -0,0 +1,101 @@ +use dpp::document::{Document, DocumentV0Getters}; +use dpp::prelude::{Revision, TimestampMillis}; +use platform_value::{Hash256, Identifier, Value}; +use crate::error::Error; + +#[derive(Clone, Debug)] +#[ferment_macro::export] +pub struct TransientDashPayUser { + pub display_name: Option, + pub avatar_url: Option, + pub avatar_fingerprint: Option>, + pub avatar_hash: Option, + pub public_message: Option, + pub revision: Option, + pub document_identifier: Identifier, + pub created_at: Option, + pub updated_at: Option, +} + +impl TryFrom<&Document> for TransientDashPayUser { + type Error = Error; + + fn try_from(document: &Document) -> Result { + let avatar_url = if let Some(Value::Text(avatar_url)) = document.get("avatarUrl") { + Some(avatar_url.clone()) + } else { + None + }; + let avatar_fingerprint = if let Some(Value::Bytes(avatar_fingerprint)) = document.get("avatarFingerprint") { + Some(avatar_fingerprint.clone()) + } else { + None + }; + let avatar_hash = if let Some(Value::Identifier(avatar_fingerprint)) = document.get("avatarHash") { + Some(avatar_fingerprint.clone()) + } else { + None + }; + let public_message = if let Some(Value::Text(public_message)) = document.get("publicMessage") { + Some(public_message.clone()) + } else { + None + }; + let display_name = if let Some(Value::Text(public_message)) = document.get("displayName") { + Some(public_message.clone()) + } else { + None + }; + Ok(Self { + revision: document.revision(), + avatar_url, + avatar_fingerprint, + avatar_hash, + public_message, + display_name, + created_at: document.created_at(), + updated_at: document.updated_at(), + document_identifier: document.id() + }) + } +} +impl TransientDashPayUser { + pub fn with_profile_document(document: Document) -> Self { + let avatar_url = if let Some(Value::Text(avatar_url)) = document.get("avatarUrl") { + Some(avatar_url.clone()) + } else { + None + }; + let avatar_fingerprint = if let Some(Value::Bytes(avatar_fingerprint)) = document.get("avatarFingerprint") { + Some(avatar_fingerprint.clone()) + } else { + None + }; + let avatar_hash = if let Some(Value::Identifier(avatar_fingerprint)) = document.get("avatarHash") { + Some(avatar_fingerprint.clone()) + } else { + None + }; + let public_message = if let Some(Value::Text(public_message)) = document.get("publicMessage") { + Some(public_message.clone()) + } else { + None + }; + let display_name = if let Some(Value::Text(public_message)) = document.get("displayName") { + Some(public_message.clone()) + } else { + None + }; + Self { + revision: document.revision(), + avatar_url, + avatar_fingerprint, + avatar_hash, + public_message, + display_name, + created_at: document.created_at(), + updated_at: document.updated_at(), + document_identifier: document.id() + } + } +} \ No newline at end of file diff --git a/dash-spv-platform/src/provider.rs b/dash-spv-platform/src/provider.rs new file mode 100644 index 00000000..e44e8ddf --- /dev/null +++ b/dash-spv-platform/src/provider.rs @@ -0,0 +1,56 @@ +use std::os::raw::c_void; +use std::sync::Arc; +use dash_sdk::dpp::prelude::CoreBlockHeight; +use dash_sdk::platform::DataContract; +use drive_proof_verifier::ContextProvider; +use drive_proof_verifier::error::ContextProviderError; +use platform_value::Identifier; +use platform_version::version::PlatformVersion; +use crate::FFIThreadSafeContext; + + +#[derive(Clone)] +pub struct PlatformProvider { + pub get_quorum_public_key: Arc Result<[u8; 48], ContextProviderError> + Send + Sync>, + pub get_data_contract: Arc Result>, ContextProviderError> + Send + Sync>, + pub get_platform_activation_height: Arc Result + Send + Sync>, + pub context: Arc +} + +impl PlatformProvider { + pub fn new< + QPK: Fn(u32, [u8; 32], u32) -> Result<[u8; 48], ContextProviderError> + Send + Sync + 'static, + DC: Fn(*const c_void, Identifier) -> Result>, ContextProviderError> + Send + Sync + 'static, + AH: Fn(*const c_void) -> Result + Send + Sync + 'static, + >( + get_quorum_public_key: Arc, + get_data_contract: DC, + get_platform_activation_height: AH, + context: Arc + ) -> Self { + Self { + get_quorum_public_key, + get_data_contract: Arc::new(get_data_contract), + get_platform_activation_height: Arc::new(get_platform_activation_height), + context + } + } +} + +impl ContextProvider for PlatformProvider { + fn get_quorum_public_key(&self, quorum_type: u32, quorum_hash: [u8; 32], core_chain_locked_height: u32) -> Result<[u8; 48], ContextProviderError> { + (self.get_quorum_public_key)(quorum_type, quorum_hash, core_chain_locked_height) + } + fn get_data_contract( + &self, + id: &Identifier, + _platform_version: &PlatformVersion, + ) -> Result>, ContextProviderError> { + (self.get_data_contract)(self.context.get(), id.clone()) + } + + + fn get_platform_activation_height(&self) -> Result { + (self.get_platform_activation_height)(self.context.get()) + } +} diff --git a/dash-spv-platform/src/query/mod.rs b/dash-spv-platform/src/query/mod.rs new file mode 100644 index 00000000..d480fad4 --- /dev/null +++ b/dash-spv-platform/src/query/mod.rs @@ -0,0 +1,199 @@ +use dapi_grpc::platform::v0::get_documents_request::get_documents_request_v0::Start; +use dash_sdk::Error; +use dash_sdk::platform::DocumentQuery; +use dpp::data_contract::DataContract; +use drive::query::{OrderClause, WhereClause, WhereOperator}; +use platform_value::{Identifier, Value}; + +pub enum WhereKind<'a> { + RecordIdentityIsEqualTo(Identifier), + LabelStartsWith(&'a str), + DomainIsDash, + Usernames(&'a [&'a str]) +} +pub enum OrderKind { + LabelAsc +} +pub enum QueryKind<'a> { + Generic { + contract: DataContract, + document_type: &'a str, + where_clauses: Vec, + order_clauses: Vec, + limit: u32, + start: Option, + }, + RecordsIdentity { + contract: DataContract, + document_type: &'a str, + unique_id: Identifier, + }, + DPNSDomain { + contract: DataContract, + document_type: &'a str, + starts_with: &'a str, + }, + Usernames { + contract: DataContract, + document_type: &'a str, + usernames: &'a [&'a str], + }, + IncomingContactRequests { + contract: DataContract, + document_type: &'a str, + }, + OutgoingContactRequests { + contract: DataContract, + document_type: &'a str, + } +} + +impl<'a> Into for WhereKind<'a> { + fn into(self) -> WhereClause { + match self { + WhereKind::RecordIdentityIsEqualTo(unique_id) => WhereClause { + field: "records.identity".to_string(), + operator: WhereOperator::Equal, + value: Value::from(unique_id), + }, + WhereKind::LabelStartsWith(text) => WhereClause { + field: "normalizedLabel".to_string(), + operator: WhereOperator::StartsWith, + value: Value::Text(text.to_string()) + }, + WhereKind::DomainIsDash => WhereClause { + field: "normalizedParentDomainName".to_string(), + operator: WhereOperator::Equal, + value: Value::Text("dash".to_string()) + }, + WhereKind::Usernames(usernames) => WhereClause { + field: "normalizedLabel".to_string(), + operator: WhereOperator::Between, + value: Value::Array(Vec::from_iter(usernames.iter().map(|username| Value::Text(username.to_string())))), + } + } + } +} + +impl Into for OrderKind { + fn into(self) -> OrderClause { + match self { + OrderKind::LabelAsc => OrderClause { + field: "normalizedLabel".to_string(), + ascending: true + } + } + } +} + +impl<'a> Into> for QueryKind<'a> { + fn into(self) -> Result { + match self { + QueryKind::Generic { contract, document_type, where_clauses, order_clauses, limit, start } => + DocumentQuery::new(contract, document_type) + .map(|mut query| { + query.where_clauses.extend(where_clauses); + query.order_by_clauses.extend(order_clauses); + query.limit = limit; + query.start = start; + query + }), + QueryKind::RecordsIdentity { contract, document_type, unique_id } => + DocumentQuery::new(contract, document_type) + .map(|query| query.with_where(WhereKind::RecordIdentityIsEqualTo(unique_id).into())), + QueryKind::DPNSDomain { contract, document_type, starts_with } => + DocumentQuery::new(contract, document_type) + .map(|query| + query.with_where(WhereKind::LabelStartsWith(starts_with).into()) + .with_where(WhereKind::DomainIsDash.into()) + .with_order_by(OrderKind::LabelAsc.into())), + QueryKind::Usernames { contract, document_type, usernames } => + DocumentQuery::new(contract, document_type) + .map(|mut query| { + query.limit = usernames.len() as u32; + query.with_where(WhereKind::Usernames(usernames).into()) + .with_order_by(OrderKind::LabelAsc.into()) + }), + QueryKind::IncomingContactRequests { contract, document_type } => + DocumentQuery::new(contract, document_type) + .map(|query| query.into()), + QueryKind::OutgoingContactRequests { contract, document_type } => + DocumentQuery::new(contract, document_type) + .map(|query| query.into()) + } + } +} + +impl<'a> QueryKind<'a> { + pub fn dpns_domain(contract: DataContract, document_type: &'a str, starts_with: &'a str) -> Result { + QueryKind::DPNSDomain { contract, document_type, starts_with }.into() + } + pub fn records_identity(contract: DataContract, document_type: &'a str, unique_id: Identifier) -> Result { + QueryKind::RecordsIdentity { contract, document_type, unique_id }.into() + } + pub fn usernames(contract: DataContract, document_type: &'a str, usernames: &[&'a str]) -> Result { + QueryKind::Usernames { + contract, + document_type, + usernames + }.into() + } + pub fn generic(contract: DataContract, document_type: &'a str, where_clauses: Vec, order_clauses: Vec, limit: u32, start: Option) -> Result { + QueryKind::Generic { contract, document_type, where_clauses, order_clauses, limit, start }.into() + } + pub fn outgoing_contact_requests(contract: DataContract, document_type: &'a str) -> Result { + QueryKind::OutgoingContactRequests { contract, document_type }.into() + } +} + + +pub fn order_by_asc_normalized_label() -> OrderClause { + OrderClause { field: "normalizedLabel".to_string(), ascending: true } +} +pub fn order_by_asc_created_at() -> OrderClause { + OrderClause { field: "$createdAt".to_string(), ascending: true } +} +pub fn order_by_asc_owner_id() -> OrderClause { + OrderClause { field: "$ownerId".to_string(), ascending: true } +} +pub fn order_by_asc_salted_domain_hash() -> OrderClause { + OrderClause { field: "saltedDomainHash".to_string(), ascending: true } +} + + +pub fn where_owner_is(user_id: [u8; 32]) -> WhereClause { + WhereClause { field: "$ownerId".to_string(), operator: WhereOperator::Equal, value: Value::Identifier(user_id) } +} +pub fn where_owner_in(user_ids: Vec<[u8; 32]>) -> WhereClause { + WhereClause { field: "$ownerId".to_string(), operator: WhereOperator::In, value: Value::Array(Vec::from_iter(user_ids.into_iter().map(|user_id| Value::Identifier(user_id)))) } +} +pub fn where_created_since(time: u64) -> WhereClause { + WhereClause { field: "$createdAt".to_string(), operator: WhereOperator::GreaterThanOrEquals, value: Value::U64(time) } +} +pub fn where_normalized_label_equal_to(username: String) -> WhereClause { + WhereClause { field: "normalizedLabel".to_string(), operator: WhereOperator::Equal, value: Value::Text(username) } +} +pub fn where_normalized_label_in(usernames: Vec) -> WhereClause { + WhereClause { field: "normalizedLabel".to_string(), operator: WhereOperator::In, value: Value::Array(usernames.into_iter().map(|u| Value::Text(u.to_lowercase())).collect()) } +} +pub fn where_normalized_label_starts_with(prefix: String) -> WhereClause { + WhereClause { field: "normalizedLabel".to_string(), operator: WhereOperator::StartsWith, value: Value::Text(prefix) } +} +pub fn where_domain_is_dash() -> WhereClause { + WhereClause { field: "normalizedParentDomainName".to_string(), operator: WhereOperator::Equal, value: Value::Text("dash".to_string()) } +} +pub fn where_domain_is(domain: String) -> WhereClause { + WhereClause { field: "normalizedParentDomainName".to_string(), operator: WhereOperator::Equal, value: Value::Text(domain) } +} +pub fn where_recipient_is(user_id: [u8; 32]) -> WhereClause { + WhereClause { field: "toUserId".to_string(), operator: WhereOperator::Equal, value: Value::Identifier(user_id) } +} +pub fn where_records_identity_is(user_id: [u8; 32]) -> WhereClause { + WhereClause { field: "records.identity".to_string(), operator: WhereOperator::Equal, value: Value::Identifier(user_id) } +} +pub fn where_salted_domain_hash_is(hash: Vec) -> WhereClause { + WhereClause { field: "saltedDomainHash".to_string(), operator: WhereOperator::Equal, value: Value::Bytes(hash) } +} +pub fn where_salted_domain_hash_in(hashes: Vec>) -> WhereClause { + WhereClause { field: "saltedDomainHash".to_string(), operator: WhereOperator::In, value: Value::Array(hashes.into_iter().map(|hash| Value::Bytes(hash)).collect()) } +} diff --git a/dash-spv-platform/src/signer.rs b/dash-spv-platform/src/signer.rs new file mode 100644 index 00000000..f450d40b --- /dev/null +++ b/dash-spv-platform/src/signer.rs @@ -0,0 +1,41 @@ +use std::os::raw::c_void; +use std::fmt::{Debug, Formatter}; +use std::sync::Arc; +use dash_sdk::dpp; +use dpp::identity::{identity_public_key::IdentityPublicKey, signer::Signer}; +use dash_sdk::dpp::ProtocolError; +use platform_value::BinaryData; +use crate::FFIThreadSafeContext; + + +#[derive(Clone)] +pub struct CallbackSigner { + pub signer: Arc) -> Result + Send + Sync>, + pub can_sign: Arc bool + Send + Sync>, + pub context: Arc +} + +impl CallbackSigner { + pub fn new(signer: T, can_sign: U, context: Arc) -> Self + where T: Fn(*const c_void, &IdentityPublicKey, Vec) -> Result + Send + Sync + 'static, + U: Fn(*const c_void, &IdentityPublicKey) -> bool + Send + Sync + 'static, + U: Fn(*const c_void, &IdentityPublicKey) -> bool { + Self { signer: Arc::new(signer), can_sign: Arc::new(can_sign), context } + } +} + +impl Debug for CallbackSigner { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.write_str(format!("{:?}", self.context).as_str()) + } +} + +impl Signer for CallbackSigner { + fn sign(&self, identity_public_key: &IdentityPublicKey, data: &[u8]) -> Result { + (self.signer)(self.context.get(), identity_public_key, Vec::from(data)) + } + + fn can_sign_with(&self, identity_public_key: &IdentityPublicKey) -> bool { + (self.can_sign)(self.context.get(), identity_public_key) + } +} diff --git a/dash-spv-platform/src/thread_safe_context.rs b/dash-spv-platform/src/thread_safe_context.rs new file mode 100644 index 00000000..aed8b6fe --- /dev/null +++ b/dash-spv-platform/src/thread_safe_context.rs @@ -0,0 +1,31 @@ +use std::sync::{Arc, Mutex}; + +#[derive(Clone, Debug)] +#[ferment_macro::opaque] +pub struct FFIThreadSafeContext { + inner: Arc> +} +unsafe impl Send for FFIThreadSafeContext {} +unsafe impl Sync for FFIThreadSafeContext {} + +#[ferment_macro::export] +impl FFIThreadSafeContext { + pub fn new(context: *const std::ffi::c_void) -> Self { + FFIThreadSafeContext { + inner: Arc::new(Mutex::new(context)), + } + } +} + +impl FFIThreadSafeContext { + pub fn get(&self) -> *const std::ffi::c_void { + let lock = self.inner.lock().unwrap(); + *lock + } + + pub fn set(&self, new_context: *const std::ffi::c_void) { + let mut lock = self.inner.lock().unwrap(); + *lock = new_context; + } +} + diff --git a/dash-spv-platform/src/transition/mod.rs b/dash-spv-platform/src/transition/mod.rs new file mode 100644 index 00000000..fc9d1eaf --- /dev/null +++ b/dash-spv-platform/src/transition/mod.rs @@ -0,0 +1,683 @@ +use dashcore::blockdata::transaction::{OutPoint, Transaction, txin::TxIn, txout::TxOut}; +use dashcore::ephemerealdata::instant_lock::InstantLock; +use dashcore::hashes::Hash; +#[cfg(test)] +use dashcore::hashes::hex::FromHex; +use dashcore::hash_types::Txid; +#[cfg(test)] +use dashcore::secp256k1::hashes::hex::DisplayHex; +use dashcore::signer; +use dashcore::signer::double_sha; +use dashcore::transaction::special_transaction::asset_lock::AssetLockPayload; +use dashcore::transaction::special_transaction::TransactionPayload; + +#[cfg(test)] +use dpp::{ + identity::{accessors::IdentityGettersV0, Identity, identity_public_key::accessors::v0::IdentityPublicKeyGettersV0, KeyType, v0::IdentityV0}, + native_bls::NativeBlsModule, + serialization::Signable, + state_transition::{ + StateTransition, StateTransitionLike, + state_transitions::identity::identity_create_transition::{IdentityCreateTransition, methods::IdentityCreateTransitionMethodsV0} + } +}; + + +use dpp::identity::IdentityPublicKey; +use dpp::identity::signer::Signer; +use dpp::identity::state_transition::asset_lock_proof::{AssetLockProof, InstantAssetLockProof}; +use dpp::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; +use dpp::ProtocolError; +use platform_value::BinaryData; + +#[ferment_macro::export] +pub fn instant_proof( + output_index: u32, + instant_lock: InstantLock, + tx_version: u16, lock_time: u32, input: Vec, output: Vec, + asset_lock_payload_version: u8, credit_outputs: Vec +) -> AssetLockProof { + AssetLockProof::Instant(InstantAssetLockProof { + instant_lock, + transaction: Transaction { + version: tx_version, + lock_time, + input, + output, + special_transaction_payload: Some(TransactionPayload::AssetLockPayloadType(AssetLockPayload { + version: asset_lock_payload_version, + credit_outputs, + })), + }, + output_index, + }) +} + +#[ferment_macro::export] +pub fn chain_proof(core_chain_locked_height: u32, txid: [u8; 32], vout: u32) -> AssetLockProof { + AssetLockProof::Chain(ChainAssetLockProof { + core_chain_locked_height, + out_point: OutPoint { + txid: Txid::from_byte_array(txid), + vout, + }, + }) +} + +// #[test] +// fn test_identity_funding_transaction_unique_id() { +// use base64::{alphabet, Engine, engine::{GeneralPurpose, GeneralPurposeConfig}}; +// use dashcore::bls_sig_utils::BLSSignature; +// use dashcore::consensus::Decodable; +// use dashcore::hash_types::CycleHash; +// use dashcore::hashes::{sha256d, Hash}; +// use dashcore::hashes::hex::FromHex; +// use dashcore::secp256k1::{ThirtyTwoByteHash, hashes::hex::DisplayHex}; +// use dashcore::{signer, Txid}; +// use dash_spv_crypto::keys::{ECDSAKey, IKey}; +// use dpp::dashcore::InstantLock; +// use dpp::identity::identity_public_key::{Purpose, SecurityLevel}; +// use dpp::identity::KeyType; +// use dpp::identity::state_transition::asset_lock_proof::{AssetLockProof, InstantAssetLockProof}; +// use dpp::serialization::{PlatformSerializable, Signable}; +// use dpp::state_transition::state_transitions::identity::identity_create_transition::IdentityCreateTransition; +// use dpp::state_transition::state_transitions::identity::identity_create_transition::v0::IdentityCreateTransitionV0; +// use dpp::state_transition::state_transitions::identity::public_key_in_creation::IdentityPublicKeyInCreation; +// use dpp::state_transition::state_transitions::identity::public_key_in_creation::v0::IdentityPublicKeyInCreationV0; +// use dpp::state_transition::StateTransition; +// use platform_value::{BinaryData, Identifier}; +// use platform_value::string_encoding::Encoding; +// use dash_spv_crypto::crypto::byte_util::Reversed; +// +// let base64_engine = GeneralPurpose::new(&alphabet::STANDARD, GeneralPurposeConfig::default()); +// let mut signature = [0u8; 96]; +// signature[0] = 1; +// +// let bls_signature = BLSSignature::from(signature); +// +// let tx_data = b"0300000002b74030bbda6edd804d4bfb2bdbbb7c207a122f3af2f6283de17074a42c6a5417020000006b483045022100815b175ab1a8fde7d651d78541ba73d2e9b297e6190f5244e1957004aa89d3c902207e1b164499569c1f282fe5533154495186484f7db22dc3dc1ccbdc9b47d997250121027f69794d6c4c942392b1416566aef9eaade43fbf07b63323c721b4518127baadffffffffb74030bbda6edd804d4bfb2bdbbb7c207a122f3af2f6283de17074a42c6a5417010000006b483045022100a7c94fe1bb6ffb66d2bb90fd8786f5bd7a0177b0f3af20342523e64291f51b3e02201f0308f1034c0f6024e368ca18949be42a896dda434520fa95b5651dc5ad3072012102009e3f2eb633ee12c0143f009bf773155a6c1d0f14271d30809b1dc06766aff0ffffffff031027000000000000166a1414ec6c36e6c39a9181f3a261a08a5171425ac5e210270000000000001976a91414ec6c36e6c39a9181f3a261a08a5171425ac5e288acc443953b000000001976a9140d1775b9ed85abeb19fd4a7d8cc88b08a29fe6de88ac00000000"; +// let mut transaction_data = tx_data.as_slice(); +// // let funding_tx = Transaction::de(transaction_data); +// // let hash = funding_tx.base.tx_hash().unwrap(); +// let txid = Txid::from_slice(&hash).unwrap(); +// let is_lock = InstantLock { +// version: 0, +// inputs: vec![], +// txid, +// cyclehash: CycleHash::from_raw_hash(sha256d::Hash::from_slice(&[0u8; 32]).unwrap()), +// signature: bls_signature, +// }; +// assert_eq!(is_lock.request_id().unwrap().to_byte_array().to_lower_hex_string(), <[u8; 32]>::from_hex("7bab86a676ac6cd3ab0b8180f37121a36d8ae6fecea59e7c4e7783ce9cb84696").unwrap().reversed().to_lower_hex_string()); +// +// let funding_tx_locked_outpoint = funding_tx.locked_outpoint().unwrap(); +// let transaction = Transaction::consensus_decode(&mut transaction_data).unwrap(); +// assert_eq!(txid, transaction.txid(), "ddd"); +// let transaction_locked_outpoint = transaction.locked_outpoint().unwrap(); +// let out_index = transaction_locked_outpoint.vout; +// let instant_asset_lock_proof = InstantAssetLockProof::new(is_lock, transaction, out_index); +// let identifier = instant_asset_lock_proof.create_identifier().unwrap(); +// println!("Identifier: {}", identifier); +// let asset_lock_proof = AssetLockProof::Instant(instant_asset_lock_proof); +// +// println!("funding_tx_locked_outpoint tx_id: {}", funding_tx_locked_outpoint.txid.to_hex()); +// println!("funding_tx_locked_outpoint vout: {}", funding_tx_locked_outpoint.vout); +// println!("transaction_locked_outpoint tx_id: {}", transaction_locked_outpoint.txid.to_hex()); +// println!("transaction_locked_outpoint vout: {}", transaction_locked_outpoint.vout); +// let credit_burn_identity_id = funding_tx.credit_burn_identity_identifier(); +// +// +// +// assert_eq!(credit_burn_identity_id.to_lower_hex_string(), "ae99d9433fc86f8974094c6a24fcc8cc68f87510c000d714c71ee5f64ceacf4b".to_string(), "Credit Burn Identity Identifier is incorrect"); +// // assert_eq!(credit_burn_identity_id.to_hex(), transaction.credit_burn_identity_identifier().to_hex(), "Credit Burn Identity Identifier is incorrect"); +// let credit_burn_public_key_hash = funding_tx.credit_burn_public_key_hash().unwrap(); +// assert_eq!(credit_burn_public_key_hash.to_lower_hex_string(), "14ec6c36e6c39a9181f3a261a08a5171425ac5e2".to_string(), "Credit Burn Identity Public Key Hash is incorrect"); +// // assert_eq!(credit_burn_public_key_hash.to_hex(), transaction.credit_burn_public_key_hash().unwrap().to_hex(), "Credit Burn Identity Public Key Hash is incorrect"); +// let identity_identifier = funding_tx.credit_burn_identity_identifier_base58(); +// assert_eq!(identity_identifier, "Cka1ELdpfrZhFFvKRurvPtTHurDXXnnezafNPJkxCYjc".to_string(), "Identity Identifier is incorrect"); +// // assert_eq!(transaction.credit_burn_identity_identifier_base58(), "Cka1ELdpfrZhFFvKRurvPtTHurDXXnnezafNPJkxCYjc".to_string(), "Identity Identifier is incorrect"); +// let public_key = ECDSAKey::key_with_public_key_data(&base64_engine.decode("AsPvyyh6pkxss/Fespa7HCJIY8IA6ElAf6VKuqVcnPze").unwrap()).unwrap(); +// let private_key_data = b"fdbca0cd2be4375f04fcaee5a61c5d170a2a46b1c0c7531f58c430734a668f32"; +// let private_key = ECDSAKey::key_with_secret_data(private_key_data.as_slice(), true).unwrap(); +// let public_key_data = private_key.public_key_data(); +// assert_eq!(public_key_data.to_lower_hex_string(), "02c3efcb287aa64c6cb3f15eb296bb1c224863c200e849407fa54abaa55c9cfcde".to_string(), "Public Key Data is incorrect"); +// assert_eq!(public_key.hash160(), credit_burn_public_key_hash, "The private key doesn't match the funding transaction"); +// let mut transition = StateTransition::IdentityCreate(IdentityCreateTransition::V0(IdentityCreateTransitionV0 { +// public_keys: vec![IdentityPublicKeyInCreation::V0(IdentityPublicKeyInCreationV0 { +// id: 1, +// key_type: KeyType::ECDSA_SECP256K1, +// purpose: Purpose::AUTHENTICATION, +// security_level: SecurityLevel::MASTER, +// contract_bounds: None, +// read_only: false, +// data: BinaryData(public_key_data), +// signature: Default::default(), +// })], +// asset_lock_proof, +// user_fee_increase: 0, +// signature: Default::default(), +// // self.blockchainIdentityUniqueId = [dsutxo_data(creditFundingTransaction.lockedOutpoint) SHA256_2]; +// +// identity_id: Identifier::from(funding_tx.credit_burn_identity_identifier()), +// })); +// // let identity_public_key = IdentityPublicKey::V0() +// +// let data = transition.signable_bytes().unwrap(); +// println!("sign_id: {}", data.to_lower_hex_string()); +// let signature = signer::sign(&data, private_key_data.as_slice()).unwrap(); +// transition.set_signature(signature.to_vec().into()); +// +// assert_eq!(transition.owner_id().to_string(Encoding::Base58), "Cka1ELdpfrZhFFvKRurvPtTHurDXXnnezafNPJkxCYjc".to_string()); +// // 7c4855e4230f5705498b2209bb3bebbe337684af58b9b21bb235bf8a31138951 +// println!("Transition Owner ID: {}", transition.owner_id()); +// println!("Transition Signature: {}", transition.signature().to_vec().to_lower_hex_string()); +// println!("Transition Serialized to bytes: {}", transition.serialize_to_bytes().unwrap().to_lower_hex_string()); +// let hashed = sha256d::Hash::hash(&transition.serialize_to_bytes().unwrap()).into_32(); +// println!("Transition SHA256-2: {}", hashed.to_lower_hex_string()); +// +// let result = "0001000100000000004104c3efcb287aa64c6cb3f15eb296bb1c224863c200e849407fa54abaa55c9cfcde9ad99fb575a4dc3eeacb835c9b607e54a436aef621cfc09797984bcb325c8e3c0000a20100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c00000000010000000000000000000000000000000000000000000000000000000000000000ffffffff00ffffffff01ffffffffffffffff0000000000000000ae99d9433fc86f8974094c6a24fcc8cc68f87510c000d714c71ee5f64ceacf4b".to_string(); +// let result = transition.serialize_to_bytes().unwrap().to_lower_hex_string(); +// let etalon = "01000000a4647479706502697369676e617475726558411fe06d3cd2671ec7f6653eb45f40ab4bce27f42a46893997042f87b344913aee3b794aeaf632b4887516a7765b2329569d45176fe7e090defc1a077889a93fdf076a7075626c69634b65797381a6626964016464617461582102c3efcb287aa64c6cb3f15eb296bb1c224863c200e849407fa54abaa55c9cfcde64747970650067707572706f73650068726561644f6e6c79f46d73656375726974794c6576656c006e61737365744c6f636b50726f6f66a46474797065006b696e7374616e744c6f636b58810025847e1e9c2ef692d21bc23a6c0faf8834d64704e5e0186427d3444bc75c1ba50100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b6f7574707574496e646578006b7472616e73616374696f6e5901950300000002b74030bbda6edd804d4bfb2bdbbb7c207a122f3af2f6283de17074a42c6a5417020000006b483045022100815b175ab1a8fde7d651d78541ba73d2e9b297e6190f5244e1957004aa89d3c902207e1b164499569c1f282fe5533154495186484f7db22dc3dc1ccbdc9b47d997250121027f69794d6c4c942392b1416566aef9eaade43fbf07b63323c721b4518127baadffffffffb74030bbda6edd804d4bfb2bdbbb7c207a122f3af2f6283de17074a42c6a5417010000006b483045022100a7c94fe1bb6ffb66d2bb90fd8786f5bd7a0177b0f3af20342523e64291f51b3e02201f0308f1034c0f6024e368ca18949be42a896dda434520fa95b5651dc5ad3072012102009e3f2eb633ee12c0143f009bf773155a6c1d0f14271d30809b1dc06766aff0ffffffff031027000000000000166a1414ec6c36e6c39a9181f3a261a08a5171425ac5e210270000000000001976a91414ec6c36e6c39a9181f3a261a08a5171425ac5e288acc443953b000000001976a9140d1775b9ed85abeb19fd4a7d8cc88b08a29fe6de88ac00000000".to_string(); +// +// // println!("transition_serialized: {}", transition_serialized.to_hex()); +// // [blockchainIdentityRegistrationTransition signWithKey:privateKey atIndex:UINT32_MAX fromIdentity:nil]; +// // let transition_signed = private_key.sign(&transition_serialized); +// // println!("transition_signed: {}", transition_signed.to_hex()); +// } + +// pub async fn identity_register_using_public_key_at_index(&self, public_key: IdentityPublicKey, index: u32, proof: AssetLockProof, private_key: OpaqueKey) -> Result { +// println!("transition identity_register_using_public_key_at_index: {:?} -- {} -- {:?} -- {:?}", public_key, index, proof, private_key); +// let public_keys = BTreeMap::from_iter([(index, public_key)]); +// let (identity, transition) = self.identities.create_identity_create_transition_using_public_keys(public_keys, proof) +// .map_err(Error::from)?; +// println!("transition register created: {:?} -- {:?}", identity, transition); +// let signature = self.create_transition_signature(&transition, private_key)?; +// self.sign_and_publish_transition(StateTransition::IdentityCreate(transition), signature.to_vec()).await +// } + +#[derive(Debug)] +pub struct TestSigner { + pub private_key: Vec +} +impl Signer for TestSigner { + fn sign(&self, _identity_public_key: &IdentityPublicKey, data: &[u8]) -> Result { + // signer::sign_hash() + let hash = double_sha(data); + // let hash = sha256d::Hash::hash(data).into_inner();; + signer::sign_hash(&hash, &self.private_key).map_err(ProtocolError::from).map(|d| BinaryData::from(d.to_vec())) + } + + fn can_sign_with(&self, _identity_public_key: &IdentityPublicKey) -> bool { + true + } +} + +#[cfg(test)] +fn identity_fixture() -> Identity { + use std::collections::BTreeMap; + use platform_value::{Identifier, IdentifierBytes32}; + Identity::V0(IdentityV0 { + id: Identifier(IdentifierBytes32([98, 133, 105, 167, 166, 167, 34, 219, 173, 197, 92, 195, 127, 176, 26, 249, 89, 164, 21, 80, 121, 53, 90, 104, 119, 80, 167, 119, 212, 192, 32, 227])), + public_keys: BTreeMap::from_iter([(0, identity_public_key_fixture())]), + balance: 0, + revision: 0, + }) +} +#[cfg(test)] +fn identity_public_key_fixture() -> IdentityPublicKey { + use dpp::identity::identity_public_key::{Purpose, SecurityLevel, v0::IdentityPublicKeyV0}; + use platform_value::string_encoding::Encoding; + let data = BinaryData::from_string("026ce9a9392503a57a8b4a4a16886f3cf5f5eacadbf62ca610c9d0fccc9a13eb4b", Encoding::Hex) + .expect("Failed to create public key data"); + let public_key = IdentityPublicKey::V0(IdentityPublicKeyV0 { + id: 0, + purpose: Purpose::AUTHENTICATION, + security_level: SecurityLevel::MASTER, + contract_bounds: None, + key_type: KeyType::ECDSA_SECP256K1, + read_only: false, + data, + disabled_at: None + }); + public_key +} +#[cfg(test)] +fn asset_lock_transaction_fixture() -> Transaction { + use dashcore::consensus::deserialize; + let transaction_bytes = Vec::from_hex("03000800018ff03cc8d42a5e27be416d38e1b02718a111f03e6d7bfd178bd6cda26f33d3be010000006a4730440220765c83e5e908448ab2117a4abb806d21a3786d9642fc1883405c34367c1e5f3702207a0d1eae897e842b45632e57d02647ae193e8c7a247674399bc24d2d80799a88012102e25c6bbcbb1aa0a0c42283ded2d44e5c75551318a3c01d65906ac97aae1603e8ffffffff0240420f0000000000026a00c90ced02000000001976a914e97fe30aafd3666e70493b99cc35c0371d26654088ac0000000024010140420f00000000001976a91467575fc9d201b5ff36b5d8405497f1d961a56dbf88ac").unwrap(); + let transaction: Transaction = deserialize(transaction_bytes.as_slice()).unwrap(); + transaction +} +#[cfg(test)] +fn instant_lock_fixture() -> InstantLock { + use dashcore::consensus::deserialize; + let is_lock_bytes = Vec::from_hex("01018ff03cc8d42a5e27be416d38e1b02718a111f03e6d7bfd178bd6cda26f33d3be01000000b16fcb9a165b8e14542becf5292b16f90650d13ad4b55fe20768db51d81020766a93587154beb1624054fbef93d73a2403295e459e6d85c3245021487e02000094325d06a52a1f3cfaa74de4ca28f9c5b16c5ee2b472e50219cc78a111cf1c987c1d861e0a6018fdaf41960caf6ba349126e99446f00edc19856b9dab8fa15e12ae42c67d4f958a8e5fbc8af224fe4cc2c85d2e186296d7433e2fec0112a862a").unwrap(); + let is_lock: InstantLock = deserialize(is_lock_bytes.as_slice()).unwrap(); + is_lock +} +#[cfg(test)] +fn instant_proof_fixture() -> AssetLockProof { + let transaction = asset_lock_transaction_fixture(); + let is_lock = instant_lock_fixture(); + let instant_proof = AssetLockProof::Instant(InstantAssetLockProof::new(is_lock, transaction, 0)); + instant_proof +} +#[cfg(test)] +fn chain_proof_fixture() -> AssetLockProof { + let core_chain_locked_height = 1199074; + let tx_id = <[u8; 32]>::from_hex("762010d851db6807e25fb5d43ad15006f9162b29f5ec2b54148e5b169acb6fb1").expect("???"); + let out_point = OutPoint { txid: Txid::from_slice(&tx_id).unwrap(), vout: 0 }; + let chain_proof = AssetLockProof::Chain(ChainAssetLockProof { core_chain_locked_height, out_point }); + chain_proof +} +#[test] +fn test_identity_registration_transition() { + use platform_version::version::PlatformVersion; + let seckey: [u8; 32] = [255, 17, 59, 229, 243, 12, 106, 175, 152, 150, 39, 18, 157, 168, 179, 198, 146, 46, 53, 0, 228, 201, 234, 212, 75, 51, 161, 237, 102, 173, 35, 211]; + let test_signer = TestSigner { private_key: seckey.to_vec() }; + let identity = identity_fixture(); + let transaction = asset_lock_transaction_fixture(); + let is_lock = instant_lock_fixture(); + let instant_proof = instant_proof_fixture(); + let chain_proof = chain_proof_fixture(); + + println!("transaction: {:?}", transaction); + println!("is_lock: {:?}", is_lock); + println!("instant_proof: {:?}", instant_proof); + println!("chain_proof: {:?}", chain_proof); + + // let mut transition = facade.create_identity_create_transition(&identity, chain_proof).expect("Failed to create identity create transition"); + let mut transition: StateTransition = + IdentityCreateTransition::try_from_identity_with_signer( + &identity, + chain_proof, + seckey.as_slice(), + &test_signer, + &NativeBlsModule, + 0, + PlatformVersion::latest(), + ) + .expect("expected an identity create transition"); + // transition.sign(&public_key, &seckey, &NativeBlsModule); + // println!("transition: {:?}", transition); + let data = transition.signable_bytes().expect("Failed to get signable bytes"); + println!("signable_bytes: {}", data.to_lower_hex_string()); + let public_key = identity.public_keys().first_key_value().unwrap().1; + println!("public_key_data: {}", public_key.data().0.to_lower_hex_string()); + // let signature = dashcore::signer::sign(&data, &seckey).expect("Failed to sign transition"); + // transition.set_signature(signature.to_vec().into()); + // println!("signature: {}", signature.to_hex()); + // let transition = IdentityCreateTransition::V0(transition_v0); + let result = transition.sign_by_private_key(&seckey, KeyType::ECDSA_SECP256K1, &NativeBlsModule); + assert!(result.is_ok(), "Failed to sign transition"); + // let result = transition.sign(&public_key, &seckey, &NativeBlsModule); + // println!("transition after signing: {:?}", transition); + + // let data = transition.signable_bytes()?; + let verified = signer::verify_data_signature(&data, transition.signature().as_slice(), public_key.data().as_slice()); + // let result = signer::verify_data_signature(&data, signature.as_slice(), public_key_data.as_slice()); + + assert!(verified.is_ok(), "Failed to verify signature"); + + // transition identity_register_using_public_key_at_index: V0(IdentityPublicKeyV0 { id: 0, purpose: AUTHENTICATION, security_level: MASTER, contract_bounds: None, key_type: ECDSA_SECP256K1, read_only: false, data: BinaryData(0x026ce9a9392503a57a8b4a4a16886f3cf5f5eacadbf62ca610c9d0fccc9a13eb4b), disabled_at: None }) -- 0 -- Chain(ChainAssetLockProof { core_chain_locked_height: 1199074, out_point: OutPoint { txid: 0x762010d851db6807e25fb5d43ad15006f9162b29f5ec2b54148e5b169acb6fb1, vout: 0 } }) -- ECDSA(ECDSAKey { seckey: [255, 17, 59, 229, 243, 12, 106, 175, 152, 150, 39, 18, 157, 168, 179, 198, 146, 46, 53, 0, 228, 201, 234, 212, 75, 51, 161, 237, 102, 173, 35, 211], pubkey: [], compressed: true, chaincode: [168, 25, 122, 213, 160, 35, 81, 86, 25, 234, 90, 84, 126, 18, 143, 232, 196, 32, 187, 188, 210, 25, 58, 133, 173, 65, 149, 233, 107, 90, 189, 26], fingerprint: 3103239245, is_extended: true }) + // transition register created: V0(IdentityV0 { id: Identifier(IdentifierBytes32([90, 31, 92, 134, 2, 135, 134, 141, 135, 186, 27, 238, 194, 146, 89, 30, 71, 113, 112, 7, 56, 174, 248, 87, 190, 111, 179, 81, 113, 41, 147, 99])), public_keys: {0: V0(IdentityPublicKeyV0 { id: 0, purpose: AUTHENTICATION, security_level: MASTER, contract_bounds: None, key_type: ECDSA_SECP256K1, read_only: false, data: BinaryData(0x026ce9a9392503a57a8b4a4a16886f3cf5f5eacadbf62ca610c9d0fccc9a13eb4b), disabled_at: None })}, balance: 0, revision: 0 }) -- V0(IdentityCreateTransitionV0 { public_keys: [V0(IdentityPublicKeyInCreationV0 { id: 0, key_type: ECDSA_SECP256K1, purpose: AUTHENTICATION, security_level: MASTER, contract_bounds: None, read_only: false, data: BinaryData(0x026ce9a9392503a57a8b4a4a16886f3cf5f5eacadbf62ca610c9d0fccc9a13eb4b), signature: BinaryData(0x) })], asset_lock_proof: Chain(ChainAssetLockProof { core_chain_locked_height: 1199074, out_point: OutPoint { txid: 0x762010d851db6807e25fb5d43ad15006f9162b29f5ec2b54148e5b169acb6fb1, vout: 0 } }), user_fee_increase: 0, signature: BinaryData(0x), identity_id: Identifier(IdentifierBytes32([90, 31, 92, 134, 2, 135, 134, 141, 135, 186, 27, 238, 194, 146, 89, 30, 71, 113, 112, 7, 56, 174, 248, 87, 190, 111, 179, 81, 113, 41, 147, 99])) }) + // transition signable bytes: 00010000000000000021026ce9a9392503a57a8b4a4a16886f3cf5f5eacadbf62ca610c9d0fccc9a13eb4b01fc00124be220b16fcb9a165b8e14542becf5292b16f90650d13ad4b55fe20768db51d81020760000 + // transition signature: 1fa237a83b4653752935da780bc2730fb37df5e250b4abacce302cf94ca50cd1ba7ebd4e339d532ce4fb9c8e01d91da9516d1cd96cf45f1193c0cfc24fa250a590 +} + +#[test] +fn verify_chain_proof_signed_data() { + let chain_proof_signable_bytes = Vec::from_hex("0300010000000000000021026ce9a9392503a57a8b4a4a16886f3cf5f5eacadbf62ca610c9d0fccc9a13eb4b01fc7fffffff20b16fcb9a165b8e14542becf5292b16f90650d13ad4b55fe20768db51d81020760000") + .expect("Hex data"); + // let chain_proof_signable_bytes = Vec::from_hex("0300010000000000000021026ce9a9392503a57a8b4a4a16886f3cf5f5eacadbf62ca610c9d0fccc9a13eb4b01fc00124be220762010d851db6807e25fb5d43ad15006f9162b29f5ec2b54148e5b169acb6fb10000") + // .expect("Hex data"); + let signature = Vec::from_hex("207abce1bcd8bba4ba32a65478144837e4dad7fdb245d69de4645df5f0f298d11b608e3a2bdaea30d12d9d9449ee93e5ba5dc59fb36a80217fe0fb670fcaf5b1f4") + .expect("Hex data"); + let identity = identity_fixture(); + let public_key = identity.public_keys().first_key_value().unwrap().1; + let result = signer::verify_data_signature(&chain_proof_signable_bytes, signature.as_slice(), public_key.data().as_slice()); + assert!(result.is_ok(), "Failed to verify signature"); +} + +#[test] +fn verify_instant_proof_signed_data() { + let chain_proof_signable_bytes = Vec::from_hex("00010000000000000021026ce9a9392503a57a8b4a4a16886f3cf5f5eacadbf62ca610c9d0fccc9a13eb4b00a20000b16fcb9a165b8e14542becf5292b16f90650d13ad4b55fe20768db51d81020760000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ef03000800018ff03cc8d42a5e27be416d38e1b02718a111f03e6d7bfd178bd6cda26f33d3be010000006a4730440220765c83e5e908448ab2117a4abb806d21a3786d9642fc1883405c34367c1e5f3702207a0d1eae897e842b45632e57d02647ae193e8c7a247674399bc24d2d80799a88012102e25c6bbcbb1aa0a0c42283ded2d44e5c75551318a3c01d65906ac97aae1603e8ffffffff0240420f0000000000026a00c90ced02000000001976a914e97fe30aafd3666e70493b99cc35c0371d26654088ac0000000024010140420f00000000001976a91467575fc9d201b5ff36b5d8405497f1d961a56dbf88ac0000") + .expect("Hex data"); + let signature = Vec::from_hex("1f4ee8736f228e9d6ecb4c1ee204c3fbd3310caf7bb08416bc784adaa81f1b9e7848bee1a8f72bc0cbb8da0e38ecef14033999b4ab861d865890e65fb50599e89c") + .expect("Hex data"); + let identity = identity_fixture(); + let public_key = identity.public_keys().first_key_value().unwrap().1; + let result = signer::verify_data_signature(&chain_proof_signable_bytes, signature.as_slice(), public_key.data().as_slice()); + assert!(result.is_ok(), "Failed to verify signature"); +} + +// #[test] +// fn test_identity_funding_transaction_unique_id() { +// use base64::{alphabet, Engine, engine::{GeneralPurpose, GeneralPurposeConfig}}; +// use dashcore::bls_sig_utils::BLSSignature; +// use dashcore::consensus::Decodable; +// use dashcore::hash_types::CycleHash; +// use dashcore::hashes::{sha256d, Hash}; +// use dashcore::secp256k1::ThirtyTwoByteHash; +// use dashcore::{signer, Txid}; +// use dash_spv_crypto::hashes::hex::{FromHex, ToHex}; +// use dash_spv_crypto::keys::{ECDSAKey, IKey}; +// use dash_spv_crypto::tx::credit_funding::{CreditFunding, CreditFundingTransaction}; +// use dpp::dashcore::InstantLock; +// use dpp::identity::identity_public_key::{Purpose, SecurityLevel}; +// use dpp::identity::KeyType; +// use dpp::identity::state_transition::asset_lock_proof::{AssetLockProof, InstantAssetLockProof}; +// use dpp::serialization::{PlatformSerializable, Signable}; +// use dpp::state_transition::identity::identity_create_transition::IdentityCreateTransition; +// use dpp::state_transition::identity::identity_create_transition::v0::IdentityCreateTransitionV0; +// use dpp::state_transition::identity::public_key_in_creation::IdentityPublicKeyInCreation; +// use dpp::state_transition::identity::public_key_in_creation::v0::IdentityPublicKeyInCreationV0; +// use dpp::state_transition::StateTransition; +// use platform_value::{BinaryData, Identifier}; +// use platform_value::string_encoding::Encoding; +// use dash_spv_crypto::crypto::byte_util::Reversed; +// +// let base64_engine = GeneralPurpose::new(&alphabet::STANDARD, GeneralPurposeConfig::default()); +// let mut signature = [0u8; 96]; +// signature[0] = 1; +// +// let bls_signature = BLSSignature::from(signature); +// +// let tx_data = b"0300000002b74030bbda6edd804d4bfb2bdbbb7c207a122f3af2f6283de17074a42c6a5417020000006b483045022100815b175ab1a8fde7d651d78541ba73d2e9b297e6190f5244e1957004aa89d3c902207e1b164499569c1f282fe5533154495186484f7db22dc3dc1ccbdc9b47d997250121027f69794d6c4c942392b1416566aef9eaade43fbf07b63323c721b4518127baadffffffffb74030bbda6edd804d4bfb2bdbbb7c207a122f3af2f6283de17074a42c6a5417010000006b483045022100a7c94fe1bb6ffb66d2bb90fd8786f5bd7a0177b0f3af20342523e64291f51b3e02201f0308f1034c0f6024e368ca18949be42a896dda434520fa95b5651dc5ad3072012102009e3f2eb633ee12c0143f009bf773155a6c1d0f14271d30809b1dc06766aff0ffffffff031027000000000000166a1414ec6c36e6c39a9181f3a261a08a5171425ac5e210270000000000001976a91414ec6c36e6c39a9181f3a261a08a5171425ac5e288acc443953b000000001976a9140d1775b9ed85abeb19fd4a7d8cc88b08a29fe6de88ac00000000"; +// let mut transaction_data = tx_data.as_slice(); +// let funding_tx = CreditFundingTransaction::from(transaction_data); +// let hash = funding_tx.base.tx_hash().unwrap(); +// let txid = Txid::from_slice(&hash).unwrap(); +// let is_lock = InstantLock { +// version: 0, +// inputs: vec![], +// txid, +// cyclehash: CycleHash::from_raw_hash(sha256d::Hash::from_slice(&[0u8; 32]).unwrap()), +// signature: bls_signature, +// }; +// assert_eq!(is_lock.request_id().unwrap().to_hex(), <[u8; 32]>::from_hex("7bab86a676ac6cd3ab0b8180f37121a36d8ae6fecea59e7c4e7783ce9cb84696").unwrap().reversed().0.to_hex()); +// +// let funding_tx_locked_outpoint = funding_tx.locked_outpoint().unwrap(); +// let transaction = dashcore::blockdata::transaction::Transaction::consensus_decode(&mut transaction_data).unwrap(); +// assert_eq!(txid, transaction.txid(), "ddd"); +// let transaction_locked_outpoint = transaction.locked_outpoint().unwrap(); +// let out_index = transaction_locked_outpoint.vout; +// let instant_asset_lock_proof = InstantAssetLockProof::new(is_lock, transaction, out_index); +// let identifier = instant_asset_lock_proof.create_identifier().unwrap(); +// println!("Identifier: {}", identifier); +// let asset_lock_proof = AssetLockProof::Instant(instant_asset_lock_proof); +// +// println!("funding_tx_locked_outpoint tx_id: {}", funding_tx_locked_outpoint.txid.to_hex()); +// println!("funding_tx_locked_outpoint vout: {}", funding_tx_locked_outpoint.vout); +// println!("transaction_locked_outpoint tx_id: {}", transaction_locked_outpoint.txid.to_hex()); +// println!("transaction_locked_outpoint vout: {}", transaction_locked_outpoint.vout); +// let credit_burn_identity_id = funding_tx.credit_burn_identity_identifier(); +// +// +// +// assert_eq!(credit_burn_identity_id.to_hex(), "ae99d9433fc86f8974094c6a24fcc8cc68f87510c000d714c71ee5f64ceacf4b".to_string(), "Credit Burn Identity Identifier is incorrect"); +// // assert_eq!(credit_burn_identity_id.to_hex(), transaction.credit_burn_identity_identifier().to_hex(), "Credit Burn Identity Identifier is incorrect"); +// let credit_burn_public_key_hash = funding_tx.credit_burn_public_key_hash().unwrap(); +// assert_eq!(credit_burn_public_key_hash.to_hex(), "14ec6c36e6c39a9181f3a261a08a5171425ac5e2".to_string(), "Credit Burn Identity Public Key Hash is incorrect"); +// // assert_eq!(credit_burn_public_key_hash.to_hex(), transaction.credit_burn_public_key_hash().unwrap().to_hex(), "Credit Burn Identity Public Key Hash is incorrect"); +// let identity_identifier = funding_tx.credit_burn_identity_identifier_base58(); +// assert_eq!(identity_identifier, "Cka1ELdpfrZhFFvKRurvPtTHurDXXnnezafNPJkxCYjc".to_string(), "Identity Identifier is incorrect"); +// // assert_eq!(transaction.credit_burn_identity_identifier_base58(), "Cka1ELdpfrZhFFvKRurvPtTHurDXXnnezafNPJkxCYjc".to_string(), "Identity Identifier is incorrect"); +// let public_key = ECDSAKey::key_with_public_key_data(&base64_engine.decode("AsPvyyh6pkxss/Fespa7HCJIY8IA6ElAf6VKuqVcnPze").unwrap()).unwrap(); +// let private_key_data = b"fdbca0cd2be4375f04fcaee5a61c5d170a2a46b1c0c7531f58c430734a668f32"; +// let private_key = ECDSAKey::key_with_secret_data(private_key_data.as_slice(), true).unwrap(); +// let public_key_data = private_key.public_key_data(); +// assert_eq!(public_key_data.to_hex(), "02c3efcb287aa64c6cb3f15eb296bb1c224863c200e849407fa54abaa55c9cfcde".to_string(), "Public Key Data is incorrect"); +// assert_eq!(public_key.hash160(), credit_burn_public_key_hash, "The private key doesn't match the funding transaction"); +// let mut transition = StateTransition::IdentityCreate(IdentityCreateTransition::V0(IdentityCreateTransitionV0 { +// public_keys: vec![IdentityPublicKeyInCreation::V0(IdentityPublicKeyInCreationV0 { +// id: 1, +// key_type: KeyType::ECDSA_SECP256K1, +// purpose: Purpose::AUTHENTICATION, +// security_level: SecurityLevel::MASTER, +// contract_bounds: None, +// read_only: false, +// data: BinaryData(public_key_data), +// signature: Default::default(), +// })], +// asset_lock_proof, +// user_fee_increase: 0, +// signature: Default::default(), +// // self.blockchainIdentityUniqueId = [dsutxo_data(creditFundingTransaction.lockedOutpoint) SHA256_2]; +// +// identity_id: Identifier::from(funding_tx.credit_burn_identity_identifier()), +// })); +// // let identity_public_key = IdentityPublicKey::V0() +// +// let data = transition.signable_bytes().unwrap(); +// println!("sign_id: {}", data.to_hex()); +// let signature = signer::sign(&data, private_key_data.as_slice()).unwrap(); +// transition.set_signature(signature.to_vec().into()); +// +// assert_eq!(transition.owner_id().to_string(Encoding::Base58), "Cka1ELdpfrZhFFvKRurvPtTHurDXXnnezafNPJkxCYjc".to_string()); +// // 7c4855e4230f5705498b2209bb3bebbe337684af58b9b21bb235bf8a31138951 +// println!("Transition Owner ID: {}", transition.owner_id()); +// println!("Transition Signature: {}", transition.signature().to_vec().to_hex()); +// println!("Transition Serialized to bytes: {}", transition.serialize_to_bytes().unwrap().to_hex()); +// let hashed = sha256d::Hash::hash(&transition.serialize_to_bytes().unwrap()).into_32(); +// println!("Transition SHA256-2: {}", hashed.to_hex()); +// +// let result = "0001000100000000004104c3efcb287aa64c6cb3f15eb296bb1c224863c200e849407fa54abaa55c9cfcde9ad99fb575a4dc3eeacb835c9b607e54a436aef621cfc09797984bcb325c8e3c0000a20100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c00000000010000000000000000000000000000000000000000000000000000000000000000ffffffff00ffffffff01ffffffffffffffff0000000000000000ae99d9433fc86f8974094c6a24fcc8cc68f87510c000d714c71ee5f64ceacf4b".to_string(); +// let result = transition.serialize_to_bytes().unwrap().to_hex(); +// let etalon = "01000000a4647479706502697369676e617475726558411fe06d3cd2671ec7f6653eb45f40ab4bce27f42a46893997042f87b344913aee3b794aeaf632b4887516a7765b2329569d45176fe7e090defc1a077889a93fdf076a7075626c69634b65797381a6626964016464617461582102c3efcb287aa64c6cb3f15eb296bb1c224863c200e849407fa54abaa55c9cfcde64747970650067707572706f73650068726561644f6e6c79f46d73656375726974794c6576656c006e61737365744c6f636b50726f6f66a46474797065006b696e7374616e744c6f636b58810025847e1e9c2ef692d21bc23a6c0faf8834d64704e5e0186427d3444bc75c1ba50100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b6f7574707574496e646578006b7472616e73616374696f6e5901950300000002b74030bbda6edd804d4bfb2bdbbb7c207a122f3af2f6283de17074a42c6a5417020000006b483045022100815b175ab1a8fde7d651d78541ba73d2e9b297e6190f5244e1957004aa89d3c902207e1b164499569c1f282fe5533154495186484f7db22dc3dc1ccbdc9b47d997250121027f69794d6c4c942392b1416566aef9eaade43fbf07b63323c721b4518127baadffffffffb74030bbda6edd804d4bfb2bdbbb7c207a122f3af2f6283de17074a42c6a5417010000006b483045022100a7c94fe1bb6ffb66d2bb90fd8786f5bd7a0177b0f3af20342523e64291f51b3e02201f0308f1034c0f6024e368ca18949be42a896dda434520fa95b5651dc5ad3072012102009e3f2eb633ee12c0143f009bf773155a6c1d0f14271d30809b1dc06766aff0ffffffff031027000000000000166a1414ec6c36e6c39a9181f3a261a08a5171425ac5e210270000000000001976a91414ec6c36e6c39a9181f3a261a08a5171425ac5e288acc443953b000000001976a9140d1775b9ed85abeb19fd4a7d8cc88b08a29fe6de88ac00000000".to_string(); +// +// // println!("transition_serialized: {}", transition_serialized.to_hex()); +// // [blockchainIdentityRegistrationTransition signWithKey:privateKey atIndex:UINT32_MAX fromIdentity:nil]; +// // let transition_signed = private_key.sign(&transition_serialized); +// // println!("transition_signed: {}", transition_signed.to_hex()); +// } +// +// // pub async fn identity_register_using_public_key_at_index(&self, public_key: IdentityPublicKey, index: u32, proof: AssetLockProof, private_key: OpaqueKey) -> Result { +// // println!("transition identity_register_using_public_key_at_index: {:?} -- {} -- {:?} -- {:?}", public_key, index, proof, private_key); +// // let public_keys = BTreeMap::from_iter([(index, public_key)]); +// // let (identity, transition) = self.identities.create_identity_create_transition_using_public_keys(public_keys, proof) +// // .map_err(Error::from)?; +// // println!("transition register created: {:?} -- {:?}", identity, transition); +// // let signature = self.create_transition_signature(&transition, private_key)?; +// // self.sign_and_publish_transition(StateTransition::IdentityCreate(transition), signature.to_vec()).await +// // } +// +// #[derive(Debug)] +// pub struct TestSigner { +// pub private_key: Vec +// } +// impl Signer for TestSigner { +// fn sign(&self, identity_public_key: &IdentityPublicKey, data: &[u8]) -> Result { +// // signer::sign_hash() +// let hash = double_sha(data); +// // let hash = sha256d::Hash::hash(data).into_inner();; +// signer::sign_hash(&hash, &self.private_key).map_err(ProtocolError::from).map(|d| BinaryData::from(d.to_vec())) +// } +// +// fn can_sign_with(&self, _identity_public_key: &IdentityPublicKey) -> bool { +// true +// } +// } +// +// #[cfg(test)] +// fn identity_fixture() -> Identity { +// Identity::V0(IdentityV0 { +// id: Identifier(IdentifierBytes32([98, 133, 105, 167, 166, 167, 34, 219, 173, 197, 92, 195, 127, 176, 26, 249, 89, 164, 21, 80, 121, 53, 90, 104, 119, 80, 167, 119, 212, 192, 32, 227])), +// public_keys: BTreeMap::from_iter([(0, identity_public_key_fixture())]), +// balance: 0, +// revision: 0, +// }) +// } +// #[cfg(test)] +// fn identity_public_key_fixture() -> IdentityPublicKey { +// let data = BinaryData::from_string("026ce9a9392503a57a8b4a4a16886f3cf5f5eacadbf62ca610c9d0fccc9a13eb4b", Encoding::Hex) +// .expect("Failed to create public key data"); +// let public_key = IdentityPublicKey::V0(IdentityPublicKeyV0 { +// id: 0, +// purpose: Purpose::AUTHENTICATION, +// security_level: SecurityLevel::MASTER, +// contract_bounds: None, +// key_type: KeyType::ECDSA_SECP256K1, +// read_only: false, +// data, +// disabled_at: None +// }); +// public_key +// } +// #[cfg(test)] +// fn asset_lock_transaction_fixture() -> Transaction { +// let transaction_bytes = Vec::from_hex("03000800018ff03cc8d42a5e27be416d38e1b02718a111f03e6d7bfd178bd6cda26f33d3be010000006a4730440220765c83e5e908448ab2117a4abb806d21a3786d9642fc1883405c34367c1e5f3702207a0d1eae897e842b45632e57d02647ae193e8c7a247674399bc24d2d80799a88012102e25c6bbcbb1aa0a0c42283ded2d44e5c75551318a3c01d65906ac97aae1603e8ffffffff0240420f0000000000026a00c90ced02000000001976a914e97fe30aafd3666e70493b99cc35c0371d26654088ac0000000024010140420f00000000001976a91467575fc9d201b5ff36b5d8405497f1d961a56dbf88ac").unwrap(); +// let transaction: Transaction = deserialize(transaction_bytes.as_slice()).unwrap(); +// transaction +// } +// #[cfg(test)] +// fn instant_lock_fixture() -> InstantLock { +// let is_lock_bytes = Vec::from_hex("01018ff03cc8d42a5e27be416d38e1b02718a111f03e6d7bfd178bd6cda26f33d3be01000000b16fcb9a165b8e14542becf5292b16f90650d13ad4b55fe20768db51d81020766a93587154beb1624054fbef93d73a2403295e459e6d85c3245021487e02000094325d06a52a1f3cfaa74de4ca28f9c5b16c5ee2b472e50219cc78a111cf1c987c1d861e0a6018fdaf41960caf6ba349126e99446f00edc19856b9dab8fa15e12ae42c67d4f958a8e5fbc8af224fe4cc2c85d2e186296d7433e2fec0112a862a").unwrap(); +// let is_lock: InstantLock = deserialize(is_lock_bytes.as_slice()).unwrap(); +// is_lock +// } +// #[cfg(test)] +// fn instant_proof_fixture() -> AssetLockProof { +// let transaction = asset_lock_transaction_fixture(); +// let is_lock = instant_lock_fixture(); +// let instant_proof = AssetLockProof::Instant(InstantAssetLockProof::new(is_lock, transaction, 0)); +// instant_proof +// } +// #[cfg(test)] +// fn chain_proof_fixture() -> AssetLockProof { +// let core_chain_locked_height = 1199074; +// let tx_id = <[u8; 32]>::from_hex("762010d851db6807e25fb5d43ad15006f9162b29f5ec2b54148e5b169acb6fb1").expect("???"); +// let out_point = OutPoint { txid: Txid::from_slice(&tx_id).unwrap(), vout: 0 }; +// let chain_proof = AssetLockProof::Chain(ChainAssetLockProof { core_chain_locked_height, out_point }); +// chain_proof +// } +// #[test] +// fn test_identity_registration_transition() { +// let facade = IdentityFacade::new(PROTOCOL_VERSION_8); +// let seckey: [u8; 32] = [255, 17, 59, 229, 243, 12, 106, 175, 152, 150, 39, 18, 157, 168, 179, 198, 146, 46, 53, 0, 228, 201, 234, 212, 75, 51, 161, 237, 102, 173, 35, 211]; +// let test_signer = TestSigner { private_key: seckey.to_vec() }; +// let identity = identity_fixture(); +// let transaction = asset_lock_transaction_fixture(); +// let is_lock = instant_lock_fixture(); +// let instant_proof = instant_proof_fixture(); +// let chain_proof = chain_proof_fixture(); +// +// println!("transaction: {:?}", transaction); +// println!("is_lock: {:?}", is_lock); +// println!("instant_proof: {:?}", instant_proof); +// println!("chain_proof: {:?}", chain_proof); +// +// // let mut transition = facade.create_identity_create_transition(&identity, chain_proof).expect("Failed to create identity create transition"); +// let mut transition: StateTransition = +// IdentityCreateTransition::try_from_identity_with_signer( +// &identity, +// chain_proof, +// seckey.as_slice(), +// &test_signer, +// &NativeBlsModule, +// 0, +// PlatformVersion::latest(), +// ) +// .expect("expected an identity create transition"); +// // transition.sign(&public_key, &seckey, &NativeBlsModule); +// // println!("transition: {:?}", transition); +// let data = transition.signable_bytes().expect("Failed to get signable bytes"); +// println!("signable_bytes: {}", data.to_hex()); +// let public_key = identity.public_keys().first_key_value().unwrap().1; +// println!("public_key_data: {}", public_key.data().0.to_hex()); +// // let signature = dashcore::signer::sign(&data, &seckey).expect("Failed to sign transition"); +// // transition.set_signature(signature.to_vec().into()); +// // println!("signature: {}", signature.to_hex()); +// // let transition = IdentityCreateTransition::V0(transition_v0); +// let result = transition.sign_by_private_key(&seckey, KeyType::ECDSA_SECP256K1, &NativeBlsModule); +// assert!(result.is_ok(), "Failed to sign transition"); +// // let result = transition.sign(&public_key, &seckey, &NativeBlsModule); +// // println!("transition after signing: {:?}", transition); +// +// // let data = transition.signable_bytes()?; +// let verified = signer::verify_data_signature(&data, transition.signature().as_slice(), public_key.data().as_slice()); +// // let result = signer::verify_data_signature(&data, signature.as_slice(), public_key_data.as_slice()); +// +// assert!(verified.is_ok(), "Failed to verify signature"); +// +// // transition identity_register_using_public_key_at_index: V0(IdentityPublicKeyV0 { id: 0, purpose: AUTHENTICATION, security_level: MASTER, contract_bounds: None, key_type: ECDSA_SECP256K1, read_only: false, data: BinaryData(0x026ce9a9392503a57a8b4a4a16886f3cf5f5eacadbf62ca610c9d0fccc9a13eb4b), disabled_at: None }) -- 0 -- Chain(ChainAssetLockProof { core_chain_locked_height: 1199074, out_point: OutPoint { txid: 0x762010d851db6807e25fb5d43ad15006f9162b29f5ec2b54148e5b169acb6fb1, vout: 0 } }) -- ECDSA(ECDSAKey { seckey: [255, 17, 59, 229, 243, 12, 106, 175, 152, 150, 39, 18, 157, 168, 179, 198, 146, 46, 53, 0, 228, 201, 234, 212, 75, 51, 161, 237, 102, 173, 35, 211], pubkey: [], compressed: true, chaincode: [168, 25, 122, 213, 160, 35, 81, 86, 25, 234, 90, 84, 126, 18, 143, 232, 196, 32, 187, 188, 210, 25, 58, 133, 173, 65, 149, 233, 107, 90, 189, 26], fingerprint: 3103239245, is_extended: true }) +// // transition register created: V0(IdentityV0 { id: Identifier(IdentifierBytes32([90, 31, 92, 134, 2, 135, 134, 141, 135, 186, 27, 238, 194, 146, 89, 30, 71, 113, 112, 7, 56, 174, 248, 87, 190, 111, 179, 81, 113, 41, 147, 99])), public_keys: {0: V0(IdentityPublicKeyV0 { id: 0, purpose: AUTHENTICATION, security_level: MASTER, contract_bounds: None, key_type: ECDSA_SECP256K1, read_only: false, data: BinaryData(0x026ce9a9392503a57a8b4a4a16886f3cf5f5eacadbf62ca610c9d0fccc9a13eb4b), disabled_at: None })}, balance: 0, revision: 0 }) -- V0(IdentityCreateTransitionV0 { public_keys: [V0(IdentityPublicKeyInCreationV0 { id: 0, key_type: ECDSA_SECP256K1, purpose: AUTHENTICATION, security_level: MASTER, contract_bounds: None, read_only: false, data: BinaryData(0x026ce9a9392503a57a8b4a4a16886f3cf5f5eacadbf62ca610c9d0fccc9a13eb4b), signature: BinaryData(0x) })], asset_lock_proof: Chain(ChainAssetLockProof { core_chain_locked_height: 1199074, out_point: OutPoint { txid: 0x762010d851db6807e25fb5d43ad15006f9162b29f5ec2b54148e5b169acb6fb1, vout: 0 } }), user_fee_increase: 0, signature: BinaryData(0x), identity_id: Identifier(IdentifierBytes32([90, 31, 92, 134, 2, 135, 134, 141, 135, 186, 27, 238, 194, 146, 89, 30, 71, 113, 112, 7, 56, 174, 248, 87, 190, 111, 179, 81, 113, 41, 147, 99])) }) +// // transition signable bytes: 00010000000000000021026ce9a9392503a57a8b4a4a16886f3cf5f5eacadbf62ca610c9d0fccc9a13eb4b01fc00124be220b16fcb9a165b8e14542becf5292b16f90650d13ad4b55fe20768db51d81020760000 +// // transition signature: 1fa237a83b4653752935da780bc2730fb37df5e250b4abacce302cf94ca50cd1ba7ebd4e339d532ce4fb9c8e01d91da9516d1cd96cf45f1193c0cfc24fa250a590 +// } +// +// #[test] +// fn verify_chain_proof_signed_data() { +// let chain_proof_signable_bytes = Vec::from_hex("0300010000000000000021026ce9a9392503a57a8b4a4a16886f3cf5f5eacadbf62ca610c9d0fccc9a13eb4b01fc7fffffff20b16fcb9a165b8e14542becf5292b16f90650d13ad4b55fe20768db51d81020760000") +// .expect("Hex data"); +// // let chain_proof_signable_bytes = Vec::from_hex("0300010000000000000021026ce9a9392503a57a8b4a4a16886f3cf5f5eacadbf62ca610c9d0fccc9a13eb4b01fc00124be220762010d851db6807e25fb5d43ad15006f9162b29f5ec2b54148e5b169acb6fb10000") +// // .expect("Hex data"); +// let signature = Vec::from_hex("207abce1bcd8bba4ba32a65478144837e4dad7fdb245d69de4645df5f0f298d11b608e3a2bdaea30d12d9d9449ee93e5ba5dc59fb36a80217fe0fb670fcaf5b1f4") +// .expect("Hex data"); +// let identity = identity_fixture(); +// let public_key = identity.public_keys().first_key_value().unwrap().1; +// let result = signer::verify_data_signature(&chain_proof_signable_bytes, signature.as_slice(), public_key.data().as_slice()); +// assert!(result.is_ok(), "Failed to verify signature"); +// } +// +// #[test] +// fn verify_instant_proof_signed_data() { +// let chain_proof_signable_bytes = Vec::from_hex("00010000000000000021026ce9a9392503a57a8b4a4a16886f3cf5f5eacadbf62ca610c9d0fccc9a13eb4b00a20000b16fcb9a165b8e14542becf5292b16f90650d13ad4b55fe20768db51d81020760000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ef03000800018ff03cc8d42a5e27be416d38e1b02718a111f03e6d7bfd178bd6cda26f33d3be010000006a4730440220765c83e5e908448ab2117a4abb806d21a3786d9642fc1883405c34367c1e5f3702207a0d1eae897e842b45632e57d02647ae193e8c7a247674399bc24d2d80799a88012102e25c6bbcbb1aa0a0c42283ded2d44e5c75551318a3c01d65906ac97aae1603e8ffffffff0240420f0000000000026a00c90ced02000000001976a914e97fe30aafd3666e70493b99cc35c0371d26654088ac0000000024010140420f00000000001976a91467575fc9d201b5ff36b5d8405497f1d961a56dbf88ac0000") +// .expect("Hex data"); +// let signature = Vec::from_hex("1f4ee8736f228e9d6ecb4c1ee204c3fbd3310caf7bb08416bc784adaa81f1b9e7848bee1a8f72bc0cbb8da0e38ecef14033999b4ab861d865890e65fb50599e89c") +// .expect("Hex data"); +// let identity = identity_fixture(); +// let public_key = identity.public_keys().first_key_value().unwrap().1; +// let result = signer::verify_data_signature(&chain_proof_signable_bytes, signature.as_slice(), public_key.data().as_slice()); +// assert!(result.is_ok(), "Failed to verify signature"); +// } +// +// // #[test] +// // fn test_identity_reg_transition_with_derivation() { +// // let public_key_data = BinaryData::from_string("026ce9a9392503a57a8b4a4a16886f3cf5f5eacadbf62ca610c9d0fccc9a13eb4b", Encoding::Hex) +// // .expect("Failed to create public key data"); +// // let public_key = IdentityPublicKey::V0(IdentityPublicKeyV0 { +// // id: 0, +// // purpose: Purpose::AUTHENTICATION, +// // security_level: SecurityLevel::MASTER, +// // contract_bounds: None, +// // key_type: KeyType::ECDSA_SECP256K1, +// // read_only: false, +// // data: public_key_data.clone(), +// // disabled_at: None +// // }); +// // let identity = Identity::V0(IdentityV0 { +// // id: Identifier(IdentifierBytes32([98, 133, 105, 167, 166, 167, 34, 219, 173, 197, 92, 195, 127, 176, 26, 249, 89, 164, 21, 80, 121, 53, 90, 104, 119, 80, 167, 119, 212, 192, 32, 227])), +// // public_keys: BTreeMap::from_iter([( +// // 0, public_key.clone())]), +// // balance: 0, +// // revision: 0, +// // }); +// // +// // let seed_phrase = "birth kingdom trash renew flavor utility donkey gasp regular alert pave layer"; +// // let mnemonic = bip39::Mnemonic::from_str(seed_phrase).expect("Seed"); +// // let seed = mnemonic.to_seed(""); +// // +// // let proof_path = DerivationPath::bip_44_account(Network::Testnet, 0); +// // let identity_path = DerivationPath::identity_registration_path(Network::Testnet, 0); +// // let proof_key = proof_path.derive_priv_ecdsa_for_master_seed(&seed, Network::Testnet).expect("TODO: panic message"); +// // let identity_key = identity_path.derive_priv_ecdsa_for_master_seed(&seed, Network::Testnet).expect("TODO: panic message"); +// // let core_chain_locked_height = 1199074; +// // let tx_id = <[u8; 32]>::from_hex("762010d851db6807e25fb5d43ad15006f9162b29f5ec2b54148e5b169acb6fb1").expect("???"); +// // let out_point = OutPoint { txid: Txid::from_slice(&tx_id).unwrap(), vout: 0 }; +// // let chain_proof = AssetLockProof::Chain(ChainAssetLockProof { core_chain_locked_height, out_point }); +// // let test_signer = TestSigner { private_key: key.private_key.secret_bytes().to_vec() }; +// // let mut transition: StateTransition = +// // IdentityCreateTransition::try_from_identity_with_signer( +// // &identity, +// // chain_proof, +// // proof_key.private_key.as_ref(), +// // &test_signer, +// // &NativeBlsModule, +// // 0, +// // PlatformVersion::latest(), +// // ) +// // .expect("expected an identity create transition"); +// // let result = transition.sign(&public_key, identity_key.private_key.as_ref(), &NativeBlsModule); +// // assert!(result.is_ok(), "Failed to verify signature"); +// // } +// diff --git a/dash-spv-platform/src/util.rs b/dash-spv-platform/src/util.rs new file mode 100644 index 00000000..f8118f4b --- /dev/null +++ b/dash-spv-platform/src/util.rs @@ -0,0 +1,441 @@ +use std::future::Future; +use std::time::Duration; +use dash_sdk::dapi_client::transport::TransportRequest; +use dash_sdk::mock::MockResponse; +use dash_sdk::platform::{DocumentQuery, Fetch, FetchMany, Query}; +use dash_sdk::Sdk; +use dpp::data_contract::DataContract; +use dpp::data_contracts::SystemDataContract; +use dpp::document::Document; +use drive_proof_verifier::FromProof; +use indexmap::IndexMap; +use platform_value::Identifier; +use dash_spv_crypto::network::ChainType; +use crate::error::Error; + +pub const NONE_ERROR: &str = "Platform returned none while some was expected"; + +pub trait Validator { + fn validate(&self, value: &T) -> bool; +} + +pub trait StreamSpec { + type Validator: Validator + Validator; + type Error: MaxRetryError + ValidationError; + type Result; + type ResultMany; +} +pub trait Pagination { + type Offset; + type Item; + fn has_next(&self) -> bool; + fn len(&self) -> usize; + fn offset(&self) -> Self::Offset; + fn extend(&mut self, items: Vec); + fn into_items(self) -> Vec; +} + +pub trait NoneCondition { + type Error: ValidationError; + fn error_if_condition(&self, result: &T) -> bool; +} + +pub trait ValidationError { + fn validation_error() -> Self; +} +pub trait MaxRetryError { + fn max_retry_error() -> Self; +} +#[derive(Clone)] +#[ferment_macro::export] +pub enum RetryStrategy { + None, + Linear(u32), + SlowingDown20Percent(u32), + SlowingDown50Percent(u32), +} + +pub struct StreamSettings where SPEC: StreamSpec { + pub delay: u64, + pub limit: u64, + + pub validator: Option, + pub max_retry_composer: Option, +} +impl Default for StreamSettings where SPEC: StreamSpec { + fn default() -> Self { + StreamSettings { + delay: 1000, + limit: 10000, + validator: None, + max_retry_composer: None, + } + } +} + +impl StreamSettings where SPEC: StreamSpec { + pub fn default_with_delay(delay: u64) -> Self { + let mut s = Self::default(); + s.delay = delay; + s + } + pub fn with_delay(mut self, delay: u64) -> Self { + self.delay = delay; + self + } +} + +pub struct StreamStrategy where SPEC: StreamSpec { + pub settings: StreamSettings, + pub retry: Option, +} + +impl StreamStrategy where SPEC: StreamSpec { + pub fn has_retries_after(&self, num_of_attempts: &mut u32) -> bool { + match self.retry { + Some(RetryStrategy::Linear(max_retry_count)) | + Some(RetryStrategy::SlowingDown20Percent(max_retry_count)) | + Some(RetryStrategy::SlowingDown50Percent(max_retry_count)) => { + if max_retry_count > *num_of_attempts { + *num_of_attempts += 1; + true + } else { false } + }, + _ => false + } + } + pub fn initial_delay(&self) -> u64 { + self.settings.delay + } + pub fn limit(&self) -> u64 { + self.settings.limit + } + pub fn delay(&self) -> Duration { + match self.retry { + Some(RetryStrategy::Linear(_max_retry_count))=> + Duration::from_millis(self.settings.delay) + .min(Duration::from_millis(self.settings.limit)), + Some(RetryStrategy::SlowingDown20Percent(_max_retry_count)) => + Duration::from_millis(self.settings.delay) + .mul_f32(1.2) + .min(Duration::from_millis(self.settings.limit)), + Some(RetryStrategy::SlowingDown50Percent(_max_retry_count)) => + Duration::from_millis(self.settings.delay) + .mul_f32(1.5) + .min(Duration::from_millis(self.settings.limit)), + _ => Duration::from_millis(0) + } + } + + pub fn with_retry(retry: RetryStrategy) -> Self { + Self { + settings: StreamSettings::default(), + retry: Some(retry), + } + } + pub fn with_retry_and_settings(retry: RetryStrategy, settings: StreamSettings) -> Self { + Self { + settings, + retry: Some(retry), + } + } + pub fn with_validator(mut self, composer: SPEC::Validator) -> Self { + self.settings.validator = Some(composer); + self + } + pub fn with_delay(mut self, delay: u64) -> Self { + self.settings.delay = delay; + self + } + pub fn with_limit(mut self, limit: u64) -> Self { + self.settings.limit = limit; + self + } + pub fn with_settings(mut self, settings: StreamSettings) -> Self { + self.settings = settings; + self + } + + pub fn on_max_retries_reached(mut self, composer: SPEC::Error) -> Self { + self.settings.max_retry_composer = Some(composer); + self + } + pub async fn stream(self, f: F) -> Result + where F: Fn() -> Fut, + Fut: Future> { + let mut retry_count = 0u32; + loop { + match f().await { + Ok(result) => { + if let Some(ref validator) = self.settings.validator { + if !validator.validate(&result) { + return Err(SPEC::Error::validation_error()); + } + } + return Ok(result); + }, + Err(_err) if self.has_retries_after(&mut retry_count) => + tokio::time::sleep(self.delay()).await, + Err(err) => + return Err(err) + } + } + + } + pub async fn stream_many(self, f: F) -> Result + where F: Fn() -> Fut, + Fut: Future> { + let mut retry_count = 0u32; + loop { + match f().await { + Ok(result) => { + if let Some(ref validator) = self.settings.validator { + if !validator.validate(&result) { + return Err(SPEC::Error::validation_error()); + } + } + return Ok(result); + }, + Err(_err) if self.has_retries_after(&mut retry_count) => + tokio::time::sleep(self.delay()).await, + Err(err) => + return Err(err) + } + } + + } +// pub async fn paginated_stream( +// self, +// f: F, +// mut shift: Q::Offset, +// mut notifier: BN, +// ) -> Result +// where SPEC::ResultMany: Pagination + Default, +// // N: Pagination + NoneCondition + Default, +// F: Fn(Q::Offset) -> Fut, +// Fut: Future>, +// Q: ApplyOffset, +// BN: FnMut(&SPEC::ResultMany) + Send { +// let mut results = SPEC::ResultMany::default(); +// let mut retry_count = 0u32; +// loop { +// match f(shift).await { +// Ok(batch) => { +// if let Some(ref validator) = self.settings.validator { +// if !validator.validate(&batch) { +// return Err(SPEC::Error::validation_error()); +// } +// } +// notifier(&batch); +// results.extend(batch.into_items()); +// if !results.has_next() { +// return Ok(results); +// } +// shift.apply_offset(batch.offset()); +// // shift += results.len() as u32; +// retry_count = 0; +// } +// Err(_err) if self.has_retries_after(&mut retry_count) => +// tokio::time::sleep(self.delay()).await, +// Err(err) => +// return Err(err), +// } +// } +// } +} + +impl Default for StreamStrategy +where SPEC: StreamSpec { + fn default() -> Self { + Self { + settings: StreamSettings::default(), + retry: None, + } + } +} + +pub trait StreamManager: Send + Sync { + fn sdk_ref(&self) -> &Sdk; + fn chain_type(&self) -> &ChainType; + + fn stream( + &self, + query: Q, + retry: RetryStrategy, + validator: SPEC::Validator, + ) -> impl Future> + Send + where + SPEC: StreamSpec, Error = dash_sdk::Error>, + SPEC::Validator: Send, + ITEM: Fetch + Send, + Q: Query<::Request> + Clone + Sync { + async move { + let strategy = StreamStrategy::::with_retry(retry) + .with_validator(validator) + .on_max_retries_reached(dash_sdk::Error::Generic("Max retry reached".to_string())); + self.stream_with_strategy(query, strategy).await + } + } + + fn stream_with_settings( + &self, + query: Q, + retry: RetryStrategy, + stream_settings: StreamSettings, + validator: SPEC::Validator, + ) -> impl Future> + Send + where + SPEC: StreamSpec, Error = dash_sdk::Error>, + SPEC::Validator: Send, + ITEM: Fetch + Send, + Q: Query<::Request> + Clone + Sync { + async move { + let strategy = StreamStrategy::::with_retry_and_settings(retry, stream_settings) + .with_validator(validator) + .on_max_retries_reached(dash_sdk::Error::Generic("Max retry reached".to_string())); + self.stream_with_strategy(query, strategy).await + } + } + + fn stream_with_strategy( + &self, + query: Q, + strategy: StreamStrategy, + ) -> impl Future> + Send + where + SPEC: StreamSpec, Error = dash_sdk::Error>, + SPEC::Validator: Send, + ITEM: Fetch + Send, + Q: Query<::Request> + Clone + Sync { + async move { + strategy.stream(|| { + let query = query.clone(); + async { ITEM::fetch(self.sdk_ref(), query).await } + }) + .await + .map_err(Error::from) + } + } + fn stream_many( + &self, + query: Q, + retry: RetryStrategy, + validator: SPEC::Validator, + ) -> impl Future> + Send + where + SPEC: StreamSpec, + SPEC::Validator: Send, + SPEC::ResultMany: MockResponse + + FromIterator<(Identifier, Option)> + + FromProof::Response> + + Send + + Default, + ITEM: FetchMany + + Send, + Q: Query + + Clone + + Sync, + { + async move { + let strategy = StreamStrategy::::with_retry(retry) + .with_validator(validator) + .on_max_retries_reached(dash_sdk::Error::Generic("Max retry reached".to_string())); + self.stream_many_with_strategy(query, strategy).await + } + } + + fn stream_many_with_strategy( + &self, + query: Q, + strategy: StreamStrategy, + ) -> impl Future> + Send + where + SPEC: StreamSpec, + SPEC::Validator: Send, + SPEC::ResultMany: MockResponse + + FromIterator<(Identifier, Option)> + + FromProof::Response> + + Send + + Default, + ITEM: FetchMany + + Send, + Q: Query + + Clone + + Sync, + { + async move { + strategy.stream_many(|| { + let query = query.clone(); + async { + ITEM::fetch_many(self.sdk_ref(), query).await + } + }) + .await + .map_err(Error::from) + } + } + fn stream_many_with_settings( + &self, + query: Q, + retry: RetryStrategy, + stream_settings: StreamSettings, + validator: SPEC::Validator, + ) -> impl Future> + Send + where + SPEC: StreamSpec, + SPEC::Validator: Send, + SPEC::ResultMany: MockResponse + + FromIterator<(Identifier, Option)> + + FromProof::Response> + + Send + + Default, + ITEM: FetchMany + + Send, + Q: Query + + Clone + + Sync { + async move { + let strategy = StreamStrategy::::with_retry_and_settings(retry, stream_settings) + .with_validator(validator) + .on_max_retries_reached(dash_sdk::Error::Generic("Max retry reached".to_string())); + self.stream_many_with_strategy(query, strategy).await + } + } + + fn with_contract( + &self, + system_contract: SystemDataContract, + args: Args, + callback: F, + ) -> impl Future> + Send + where + F: FnOnce(DataContract, Args) -> Fut + + Send, + Fut: Future> + + Send, + Args: Send { + async move { + match DataContract::fetch(self.sdk_ref(), system_contract.id()).await { + Ok(Some(contract)) => callback(contract, args).await, + Ok(None) => Err(Error::DashSDKError(format!("Contract {:?} not found", system_contract))), + Err(e) => Err(Error::from(e)), + } + } + } + + fn many_documents_with_query(&self, query: DocumentQuery) -> impl Future>, Error>> + Send { + async move { + Document::fetch_many(self.sdk_ref(), query).await + .map_err(Error::from) + } + } + fn document_with_query(&self, query: DocumentQuery) -> impl Future, Error>> + Send + where Self: Send + Sync { + async move { + Document::fetch(self.sdk_ref(), query).await + .map_err(Error::from) + } + } + + // fn monitor_document_with_query(&self, q) +} diff --git a/logging/src/lib.rs b/logging/src/lib.rs index 888649ff..d00d4929 100644 --- a/logging/src/lib.rs +++ b/logging/src/lib.rs @@ -1,26 +1,23 @@ -#[cfg(target_os = "ios")] -use tracing::{error, warn, info, debug}; - #[cfg(target_os = "ios")] use std::sync::Once; -#[cfg(target_os = "ios")] -use std::path::PathBuf; +// #[cfg(target_os = "ios")] +// use std::path::PathBuf; +// +// #[cfg(target_os = "ios")] +// use dirs::document_dir; #[cfg(target_os = "ios")] -use dirs::document_dir; - -#[cfg(target_os = "ios")] -use std::fs::{File, OpenOptions}; +use std::fs::File; #[cfg(target_os = "ios")] use std::io::{Write, Result}; // Importing std::io::Result only for iOS #[cfg(target_os = "ios")] use std::sync::Mutex; -use dirs::download_dir; -#[cfg(target_os = "ios")] -use tracing_subscriber::fmt::writer::BoxMakeWriter; + +// #[cfg(target_os = "ios")] +// use tracing_subscriber::fmt::writer::BoxMakeWriter; #[cfg(target_os = "ios")] use tracing_subscriber::fmt::{MakeWriter, SubscriberBuilder}; @@ -34,12 +31,14 @@ static INIT: Once = Once::new(); // Function to initialize logging // Custom MakeWriter struct that holds a Mutex around a File #[cfg(target_os = "ios")] +#[allow(unused)] struct MutexMakeWriter { file: Mutex, } #[cfg(target_os = "ios")] impl MutexMakeWriter { + #[allow(unused)] fn new(file: File) -> Self { Self { file: Mutex::new(file), @@ -129,13 +128,13 @@ pub fn init_logging() { macro_rules! log_error { (target: $target:expr, $($arg:tt)*) => { { - error!(target: $target, $($arg)*); // Logs to file via tracing + tracing::error!(target: $target, $($arg)*); // Logs to file via tracing println!("ERROR [{}]: {}", $target, format!($($arg)*)); // Console output } }; ($($arg:tt)*) => { { - error!(target: "default_log_prefix", $($arg)*); // Logs to file via tracing + tracing::error!(target: "default_log_prefix", $($arg)*); // Logs to file via tracing println!("ERROR [default_log_prefix]: {}", format!($($arg)*)); // Console output } }; @@ -158,13 +157,13 @@ macro_rules! log_error { macro_rules! log_warn { (target: $target:expr, $($arg:tt)*) => { { - warn!(target: $target, $($arg)*); // Logs to file via tracing + tracing::warn!(target: $target, $($arg)*); // Logs to file via tracing println!("WARN [{}]: {}", $target, format!($($arg)*)); // Console output } }; ($($arg:tt)*) => { { - warn!(target: "default_log_prefix", $($arg)*); // Logs to file via tracing + tracing::warn!(target: "default_log_prefix", $($arg)*); // Logs to file via tracing println!("WARN [default_log_prefix]: {}", format!($($arg)*)); // Console output } }; @@ -187,13 +186,13 @@ macro_rules! log_warn { macro_rules! log_info { (target: $target:expr, $($arg:tt)*) => { { - info!(target: $target, $($arg)*); // Logs to file via tracing + tracing::info!(target: $target, $($arg)*); // Logs to file via tracing println!("INFO [{}]: {}", $target, format!($($arg)*)); // Console output } }; ($($arg:tt)*) => { { - info!(target: "default_log_prefix", $($arg)*); // Logs to file via tracing + tracing::info!(target: "default_log_prefix", $($arg)*); // Logs to file via tracing println!("INFO [default_log_prefix]: {}", format!($($arg)*)); // Console output } }; @@ -216,13 +215,13 @@ macro_rules! log_info { macro_rules! log_debug { (target: $target:expr, $($arg:tt)*) => { { - debug!(target: $target, $($arg)*); // Logs to file via tracing + tracing::debug!(target: $target, $($arg)*); // Logs to file via tracing println!("DEBUG [{}]: {}", $target, format!($($arg)*)); // Console output } }; ($($arg:tt)*) => { { - debug!(target: "default_log_prefix", $($arg)*); // Logs to file via tracing + tracing::debug!(target: "default_log_prefix", $($arg)*); // Logs to file via tracing println!("DEBUG [default_log_prefix]: {}", format!($($arg)*)); // Console output } }; diff --git a/reachability/src/lib.rs b/reachability/src/lib.rs index bc6ba441..2118b3e7 100644 --- a/reachability/src/lib.rs +++ b/reachability/src/lib.rs @@ -1,10 +1,11 @@ -use std::ffi::c_void; +use std::os::raw::c_void; use std::net::SocketAddr; use std::{ptr, thread}; use std::sync::{Arc, RwLock}; use std::sync::mpsc::{channel, Receiver, Sender}; use std::time::Duration; use logging::*; +#[cfg(target_os = "ios")] use tracing::*; use system_configuration::core_foundation::base::{kCFAllocatorDefault, TCFType};